diff --git a/artwork/floppyr.png b/artwork/floppyr.png new file mode 100644 index 000000000..98469d734 Binary files /dev/null and b/artwork/floppyr.png differ diff --git a/artwork/floppyw.png b/artwork/floppyw.png new file mode 100644 index 000000000..0cedfbd04 Binary files /dev/null and b/artwork/floppyw.png differ diff --git a/artwork/ledoff.png b/artwork/ledoff.png new file mode 100644 index 000000000..c19bb20a6 Binary files /dev/null and b/artwork/ledoff.png differ diff --git a/artwork/ledon.png b/artwork/ledon.png new file mode 100644 index 000000000..98e9d12ec Binary files /dev/null and b/artwork/ledon.png differ diff --git a/artwork/thomson.lay b/artwork/thomson.lay new file mode 100644 index 000000000..a501e920d --- /dev/null +++ b/artwork/thomson.lay @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/messnew.txt b/docs/messnew.txt index 61774fd18..094b65c9b 100644 --- a/docs/messnew.txt +++ b/docs/messnew.txt @@ -1,3 +1,80 @@ +0.109 + +New System Drivers Supported (in no particular order): +------------------------------------------------------ +- Apple IIc (ROM revision 4) (not working) [Nick Westgate] +- Tano Dragon 64 [Phill Harvey-Smith] + + + +System Driver Changes: +---------------------- +- [C64] Fixed issues found by the TRAP4, TRAP5, and TRAP6 tests of the c64 + test suite. (bug #952) [Wilbert Pol] + +- [CBM] Fixed SID code to remove potential divide by zero issues. (bug #936) + [Nate Woods] + +- [COCO3] Fixed a bug that could cause hi-res text and graphics to not display + properly when RGB is enabled. (bug #938) [Nate Woods] + +- [DRAGON] Fixed side specification on floppy disk controller. [Phill + Harvey-Smith] + +- [GAMEBOY] Fixed battery backed RAM saving. (bug #948) [Dirk Best, Wilbert + Pol] + +- [TELMAC] Fixed crash when running without sound. (bug #922) [Nate Woods] + +- [THOMSON] Improved video emulation, floppy disk support, preliminary network + extension support, and LEDs. [Antoine Mine] + +- [THOMSON] Added CRCs to the BIOS declarations. (bug #942) [Antoine Mine] + +- [VIC20] Fixed bug that caused the driver to fail when sound was disabled. + (bug #930) [Nate Woods] + + + +User Interface Changes: +----------------------- +- [Windows] Fixed a bug that caused the Pause menu item to always appear as + checked. (bug #926) [Nate Woods] + +- [Windows GUI] Fixed a bug that caused the GUI to fumble on paths with spaces + in them. (bug #918) [Nate Woods] + +- [Windows GUI] The GUI will no longer process software entries when an + emulation is running. (bug #940) [Nate Woods] + + + +Imgtool Changes: +---------------- +- Fixed the listfilters command. (bug #945) [Tim Lindner] + +- Added Thomson support. [Antoine Mine] + +- [Windows] Modified wimgtool so that it will function properly if it cannot + locate an icon for a given file extension. [Nate Woods] + + + +Source Changes: +---------------- +- The core is based on MAME 0.109. This incorporates all features of the + update to this core. [MAME team] + +- Fixed improper use of options.sample_rate in drivers to use + Machine->sample_rate. (bug #939) [Oliver Stoeneberg] + +- Build system cleanups. (bug #929) [Nate Woods] + +- [Windows] Fixed incorrect "Illegal integer value for threads" error. (bug + #920) [Nate Woods] + + + 0.108 New System Drivers Supported (in no particular order): diff --git a/docs/windows.txt b/docs/windows.txt index 110231a45..5e267a340 100644 --- a/docs/windows.txt +++ b/docs/windows.txt @@ -562,6 +562,14 @@ Perormance options The valid range is -15 to 1, with 1 being the highest priority. The default is 0 (NORMAL priority). +-[no]multithreading / -[no]mt + + Enables multithreading within MAME. At the moment, this causes the window + and all DirectDraw/Direct3D code to execute on a second thread, which + can improve performance on hyperthreaded and multicore systems. Consider + this switch experimental for the moment. The default is OFF + (-nomultithreading). + Video options diff --git a/makefile b/makefile index 61705d9ae..bd8722a26 100644 --- a/makefile +++ b/makefile @@ -45,9 +45,6 @@ endif # uncomment next line to include the debugger # DEBUG = 1 -# uncomment next line to use the new multiwindow debugger -NEW_DEBUGGER = 1 - # uncomment next line to use DRC MIPS3 engine X86_MIPS3_DRC = 1 diff --git a/makefile.mes b/makefile.mes index a82c2374b..87911da7f 100644 --- a/makefile.mes +++ b/makefile.mes @@ -71,9 +71,6 @@ X86_PPC_DRC = 1 # uncomment next line if you are building for a 64-bit target # PTR64 = 1 -# uncomment next line to use cygwin compiler -# COMPILESYSTEM_CYGWIN = 1 - # uncomment next line to build expat as part of MAME build BUILD_EXPAT = 1 @@ -122,7 +119,6 @@ RM = @rm -f WINDOWS_PROGRAM = -mwindows CONSOLE_PROGRAM = -mconsole -SUFFIX = WINUI = 1 #------------------------------------------------- @@ -271,11 +267,6 @@ else MAPFLAGS = endif -ifdef COMPILESYSTEM_CYGWIN -CFLAGS += -mno-cygwin -LDFLAGS += -mno-cygwin -endif - #------------------------------------------------- @@ -399,7 +390,7 @@ include mess/cpu/cpu.mak include mess/sound/sound.mak # combine the various definitions to one -CDEFS = $(DEFS) $(COREDEFS) $(CPUDEFS) $(SOUNDDEFS) $(ASMDEFS) +CDEFS = $(DEFS) $(COREDEFS) $(CPUDEFS) $(SOUNDDEFS) @@ -407,6 +398,36 @@ CDEFS = $(DEFS) $(COREDEFS) $(CPUDEFS) $(SOUNDDEFS) $(ASMDEFS) # primary targets #------------------------------------------------- +emulator: maketree $(EMULATORALL) + +extra: $(TOOLS) + +maketree: $(sort $(OBJDIRS)) $(OSPREBUILD) + +clean: + @echo Deleting object tree $(OBJ)... + $(RM) -r $(OBJ) + @echo Deleting $(EMULATORALL)... + $(RM) $(EMULATORALL) + @echo Deleting $(TOOLS)... + $(RM) $(TOOLS) + + + +#------------------------------------------------- +# directory targets +#------------------------------------------------- + +$(sort $(OBJDIRS)): + $(MD) $@ + + + +#------------------------------------------------- +# executable targets and dependencies +#------------------------------------------------- + + ifeq ($(MAMEOS),windows) ifdef MSVC_BUILD @@ -440,19 +461,25 @@ $(EMULATORCLI): $(OBJS) $(COREOBJS) $(OSOBJS) $(CPULIB) $(SOUNDLIB) $(DRVLIBS) $ endif - - -############################################################################# - file2str$(EXE): $(OBJ)/file2str.o $(OSDBGOBJS) + @echo Linking $@... + $(LD) $(LDFLAGS) $(OSDBGLDFLAGS) $^ $(LIBS) -o $@ romcmp$(EXE): $(OBJ)/romcmp.o $(OBJ)/unzip.o $(ZLIB) $(OSDBGOBJS) + @echo Linking $@... + $(LD) $(LDFLAGS) $(OSDBGLDFLAGS) $^ $(LIBS) -o $@ chdman$(EXE): $(OBJ)/chdman.o $(OBJ)/chd.o $(OBJ)/chdcd.o $(OBJ)/cdrom.o $(OBJ)/md5.o $(OBJ)/sha1.o $(OBJ)/version.o $(ZLIB) $(OSTOOLOBJS) $(OSDBGOBJS) - -xml2info$(EXE): $(OBJ)/xml2info.o $(EXPAT) $(OSDBGOBJS) + @echo Linking $@... + $(LD) $(LDFLAGS) $(OSDBGLDFLAGS) $^ $(LIBS) -o $@ jedutil$(EXE): $(OBJ)/jedutil.o $(OBJ)/jedparse.o $(OSDBGOBJS) + @echo Linking $@... + $(LD) $(LDFLAGS) $(OSDBGLDFLAGS) $^ $(LIBS) -o $@ + +dat2html$(EXE): $(DAT2HTML_OBJS) $(OBJ)/mess/windows/dirutils.o $(OSDBGOBJS) + @echo Linking $@... + $(LD) $(LDFLAGS) $(OSDBGLDFLAGS) $^ $(LIBS) -o $@ messdocs$(EXE): $(MESSDOCS_OBJS) $(OBJ)/mess/windows/dirutils.o $(OSDBGOBJS) @echo Compiling $@... @@ -542,46 +569,8 @@ $(OBJ)/%.a: @echo Archiving $@... $(RM) $@ $(AR) -cr $@ $^ - -%$(EXE): - @echo Linking $@... - $(LD) $(LDFLAGS) $(OSDBGLDFLAGS) $^ $(LIBS) -o $@ mess.chm: $(MESSDOCS) $(MESSDOCS) docs/wintoc.xml obj/help $(HHC) obj\\help\\mess.hhp @cp obj/help/mess.chm $@ - -makedir: - @echo make makedir is no longer necessary, just type make - -$(sort $(OBJDIRS)): - $(MD) $@ - -maketree: $(sort $(OBJDIRS)) $(OSPREBUILD) - -clean: cleantools cleantexts - @echo Deleting object tree $(OBJ)... - $(RM) -r $(OBJ) lib$(NAME).a - @echo Deleting $(EMULATORALL)... - $(RM) $(EMULATORALL) - @echo Deleting Map file... - $(RM) $(NAME).map - @echo Deleting $(MESSDOCS) - $(RM) $(MESSDOCS) - @echo Deleting $(MESSTEST) - $(RM) $(MESSTEST) - -cleantools: - @echo Cleaning Tools - $(RM) $(MESSTOOLS) - -cleantexts: - @echo Cleaning Text Files - $(RM) $(TEXTS) - @echo Removing Sysinfo directory contents - $(RM) -r sysinfo - -tests: $(MESSTEST) - $(MESSTEST) mess/tools/messtest/tests.xml - diff --git a/mess.chm b/mess.chm index cd1513046..ac0c00b8e 100644 Binary files a/mess.chm and b/mess.chm differ diff --git a/mess/cpu/sm8500/sm8500.c b/mess/cpu/sm8500/sm8500.c index a96fa2f88..bb04f3bde 100644 --- a/mess/cpu/sm8500/sm8500.c +++ b/mess/cpu/sm8500/sm8500.c @@ -102,6 +102,7 @@ static void sm8500_init(int index, int clock, const void *config, int (*irqcallb regs.config.handle_dma = NULL; regs.config.handle_timers = NULL; } + regs.register_base = regs.internal_ram; } static void sm8500_reset( void ) diff --git a/mess/devices/thomflop.c b/mess/devices/thomflop.c index 9f6702dfd..f88bfdc73 100644 --- a/mess/devices/thomflop.c +++ b/mess/devices/thomflop.c @@ -16,6 +16,7 @@ #include "devices/flopdrv.h" #include "devices/thomflop.h" #include "formats/thom_dsk.h" +#include "machine/mc6854.h" #define VERBOSE 0 /* 0, 1 or 2 */ @@ -24,7 +25,7 @@ #if VERBOSE > 1 #define LOG(x) logerror x #define VLOG(x) logerror x -#elif VERBOSE > 0 +#elif VERBOSE #define LOG(x) logerror x #define VLOG(x) #else @@ -249,6 +250,7 @@ static WRITE8_HANDLER( to7_5p14_w ) to7_5p14_select = data; if ( drive != -1 ) { + thom_floppy_active( 0 ); wd179x_set_drive( drive ); wd179x_set_side( side ); LOG(( "%f $%04x to7_5p14_w: $%02X set drive=%i side=%i density=%s\n", @@ -362,7 +364,7 @@ static mess_image * to7_qdd_image ( void ) return image_from_devtype_and_index( IO_FLOPPY, 0 ); } -/* update MC6850 status register */ +/* update MC6852 status register */ static void to7_qdd_stat_update( void ) { int flags = floppy_drive_get_flag_state( to7_qdd_image(), -1 ); @@ -407,8 +409,6 @@ static UINT8 to7_qdd_read_byte( void ) timer_get_time(), activecpu_get_previouspc(), to7qdd->data_idx, to7qdd->data_size, data )); - if ( ! ( to7qdd->data_idx & 64 ) ) thom_floppy_icon( 0 ); - to7qdd->data_idx++; to7qdd->start_idx = to7qdd->data_idx; @@ -492,8 +492,6 @@ static void to7_qdd_write_byte( UINT8 data ) else to7qdd->data_crc += data; } - - if (!(to7qdd->data_idx & 64)) thom_floppy_icon( 1 ); } static READ8_HANDLER ( to7_qdd_r ) @@ -616,6 +614,7 @@ static WRITE8_HANDLER( to7_qdd_w ) break; case 12: /* motor pulse ? */ + thom_floppy_active( 0 ); VLOG(( "%f $%04x to7_qdd_w: MOTOR=$%02X\n", timer_get_time(), activecpu_get_previouspc(), data )); break; @@ -639,7 +638,8 @@ static void to7_qdd_reset( void ) floppy_drive_set_ready_state( img, FLOPPY_DRIVE_READY, 0 ); floppy_drive_set_motor_state( img, 1 ); /* pulse each time the whole-disk spiraling track ends */ - floppy_drive_set_rpm( img, 423. / 25. ); + /* at 90us per byte read, the disk can be read in 6s */ + floppy_drive_set_rpm( img, 60. / 6. ); } to7qdd->ctrl1 |= QDD_C1_TRESET | QDD_C1_RRESET; /* reset */ @@ -660,6 +660,7 @@ static void to7_qdd_init( void ) state_save_register_global( to7qdd->ctrl1 ); state_save_register_global( to7qdd->ctrl2 ); state_save_register_global( to7qdd->ctrl3 ); + state_save_register_global( to7qdd->drive ); state_save_register_global( to7qdd->data_idx ); state_save_register_global( to7qdd->start_idx ); state_save_register_global( to7qdd->data_size ); @@ -844,8 +845,6 @@ static UINT8 to8_floppy_read_byte ( void ) if ( thmfc1->data_idx >= thmfc1->data_finish ) thmfc1->stat0 |= THMFC1_STAT0_FINISHED; - if (!(thmfc1->data_idx & 64)) thom_floppy_icon( 0 ); - return data; } @@ -877,8 +876,6 @@ static UINT8 to8_floppy_raw_read_byte ( void ) thmfc1->data_raw_idx++; - if (!(thmfc1->data_raw_idx & 64)) thom_floppy_icon( 0 ); - return data; } @@ -956,9 +953,6 @@ static void to8_floppy_qdd_write_byte ( UINT8 data ) } else thmfc1->data_crc += data; - - if (!(thmfc1->data_raw_idx & 64)) thom_floppy_icon( 1 ); - } else { @@ -981,8 +975,6 @@ static void to8_floppy_write_byte ( UINT8 data ) if ( thmfc1->data_idx >= thmfc1->data_size - 1 ) to8_floppy_cmd_complete_cb( 0 ); else thmfc1->data_idx++; - - if (!(thmfc1->data_idx & 64)) thom_floppy_icon( 1 ); } /* intelligent formatting */ @@ -1195,6 +1187,7 @@ WRITE8_HANDLER ( to8_floppy_w ) } img = to8_floppy_image(); + thom_floppy_active( 0 ); LOG (( "%f $%04x to8_floppy_w: CMD2=$%02X drv=%i step=%i motor=%i\n", timer_get_time(), activecpu_get_previouspc(), data, @@ -1269,6 +1262,7 @@ void to8_floppy_reset( void ) mess_image * img = image_from_devtype_and_index( IO_FLOPPY, i ); floppy_drive_set_index_pulse_callback( img, to8_floppy_index_pulse_cb ); floppy_drive_set_ready_state( img, FLOPPY_DRIVE_READY, 0 ); + floppy_drive_seek( img, - floppy_drive_get_current_track( img ) ); } thom_floppy_set_density( DEN_MFM_LO ); @@ -1308,6 +1302,7 @@ void to8_floppy_init( void ) state_save_register_global( thmfc1->ipl ); state_save_register_global( thmfc1->data_idx ); state_save_register_global( thmfc1->data_size ); + state_save_register_global( thmfc1->data_finish ); state_save_register_global( thmfc1->stat0 ); state_save_register_global( thmfc1->data_raw_idx ); state_save_register_global( thmfc1->data_raw_size ); @@ -1318,6 +1313,145 @@ void to8_floppy_init( void ) +/*********************** Network ************************/ + +/* The network extension is built as an external floppy controller. + It uses the same ROM and I/O space, and so, it is natural to have the + toplevel network emulation here! + */ + +/* NOTE: This is work in progress! + For the moment, only hand-checks works: the TO7 can take the line, then + perform a DKBOOT request. We do not have the server emulated yet, so, + no way to answer the request. + */ + +static void ans4( int dummy ) +{ + LOG(( "%f ans4\n", timer_get_time() )); + mc6854_set_cts( 0 ); +} + +static void ans3( int dummy ) +{ + LOG(( "%f ans3\n", timer_get_time() )); + mc6854_set_cts( 1 ); + timer_set( TIME_IN_USEC( 100 ), 0, ans4 ); +} + +static void ans2( int dummy ) +{ + LOG(( "%f ans2\n", timer_get_time() )); + mc6854_set_cts( 0 ); + timer_set( TIME_IN_USEC( 100 ), 0, ans3 ); +} + +static void ans( int dummy ) +{ + LOG(( "%f ans\n", timer_get_time() )); + mc6854_set_cts( 1 ); + timer_set( TIME_IN_USEC( 100 ), 0, ans2 ); +} +/* consigne DKBOOT + + MO5 BASIC + $00 $00 $01 $00 $00 $00 $00 $00 $00 $00 $01 $00<$41 $00 $FF $20 + $3D $4C $01 $60 $20 $3C $4F $01 $05 $20 $3F $9C $19 $25 $03 $11 + $93 $15 $10 $25 $32 $8A $7E $FF $E1 $FD $E9 $41>$00 $00 $00 $00 + $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 + + TO7/70 BASIC + $00 $00 $01 $00 $00 $00 $00 $00 $00 $00 $02 $00<$20 $42 $41 $53 + $49 $43 $20 $4D $49 $43 $52 $4F $53 $4F $46 $54 $20 $31 $2E $30 + $04 $00 $00 $00 $00 $00 $60 $FF $37 $9B $37 $9C>$00 $00 $00 $00 + $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 + + TO7 BASIC + $00 $00 $01 $00 $00 $00 $00 $00 $00 $00 $00 $00<$20 $42 $41 $53 + $49 $43 $20 $4D $49 $43 $52 $4F $53 $4F $46 $54 $20 $31 $2E $30 + $04 $00 $00 $00 $00 $00 $60 $FF $37 $9B $37 $9C>$00 $00 $00 $00 + $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 + + TO7 LOGO + $00 $00 $01 $00 $00 $00 $00 $00 $00 $00 $00 $00<$00 $00 $00 $00 + $00 $20 $4C $4F $47 $4F $04 $00 $00 $00 $00 $00 $00 $00 $00 $00 + $00 $00 $00 $00 $00 $00 $AA $FF $01 $16 $00 $C8>$00 $00 $00 $00 + $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 + + +*/ + +static void to7_network_got_frame( UINT8* data, int length ) +{ + int i; + LOG(( "%f to7_network_got_frame:", timer_get_time() )); + for ( i = 0; i < length; i++ ) + LOG(( " $%02X", data[i] )); + LOG(( "\n" )); + + if ( data[1] == 0xff ) { + LOG(( "to7_network_got_frame: %i phones %i\n", data[2], data[0] )); + timer_set( TIME_IN_USEC( 100 ), 0, ans ); + mc6854_set_cts( 0 ); + } + else if ( ! data[1] ) { + char name[33]; + int i; + memcpy( name, data + 12, 32 ); + name[32] = 0; + for (i=0;i<32;i++) + if ( name[i]<32 || name[i]>=127 ) name[i]=' '; + LOG(( "to7_network_got_frame: DKBOOT system=%s appli=\"%s\"\n", + (data[10] == 0) ? "TO7" : (data[10] == 1) ? "MO5" : + (data[10] == 2) ? "TO7/70" : "?", name )); + } + +} + +static const mc6854_interface network_iface = + { NULL, to7_network_got_frame, NULL, NULL }; + +static void to7_network_init( void ) +{ + LOG(( "to7_network_init: NR 07-005 network extension\n" )); + logerror( "to7_network_init: network not handled!\n" ); + mc6854_config( &network_iface ); +} + +static void to7_network_reset( void ) +{ + LOG(( "to7_network_reset: NR 07-005 network extension\n" )); + mc6854_reset(); + mc6854_set_cts( 1 ); +} + +static READ8_HANDLER ( to7_network_r ) +{ + if ( offset >= 0 && offset < 4 ) return mc6854_r( offset ); + + if ( offset == 8 ) { + /* network ID of the computer */ + UINT8 id = readinputport( THOM_INPUT_FCONFIG ) >> 3; + VLOG(( "%f $%04x to7_network_r: read id $%02X\n", + timer_get_time(), activecpu_get_previouspc(), id )); + return id; + } + + logerror( "%f $%04x to7_network_r: invalid read offset %i\n", + timer_get_time(), activecpu_get_previouspc(), offset ); + return 0; +} + +static WRITE8_HANDLER ( to7_network_w ) +{ + if ( offset >= 0 && offset < 4 ) + mc6854_w( offset, data ); + else + { + logerror( "%f $%04x to7_network_w: invalid write offset %i (data=$%02X)\n", + timer_get_time(), activecpu_get_previouspc(), offset, data ); + } +} /*********************** TO7 dispatch ************************/ @@ -1336,11 +1470,12 @@ UINT8 to7_controller_type; void to7_floppy_init ( void* base ) { - memory_configure_bank( THOM_FLOP_BANK, 0, 7, base, 0x800 ); + memory_configure_bank( THOM_FLOP_BANK, 0, 8, base, 0x800 ); state_save_register_global( to7_controller_type ); to7_5p14_init(); to7_qdd_init(); to8_floppy_init(); + to7_network_init(); } void to7_floppy_reset ( void ) @@ -1364,6 +1499,11 @@ void to7_floppy_reset ( void ) to7_qdd_reset(); break; + case 4: + memory_set_bank( THOM_FLOP_BANK, 7 ); + to7_network_reset(); + break; + default: memory_set_bank( THOM_FLOP_BANK, 0); break; @@ -1382,6 +1522,9 @@ READ8_HANDLER ( to7_floppy_r ) case 3: return to7_qdd_r( offset ); + + case 4: + return to7_network_r( offset ); } return 0; @@ -1406,6 +1549,10 @@ WRITE8_HANDLER ( to7_floppy_w ) case 3: to7_qdd_w( offset, data ); break; + + case 4: + to7_network_w( offset, data ); + break; } } diff --git a/mess/formats/coco_dsk.c b/mess/formats/coco_dsk.c index 272afe007..9b92c7838 100644 --- a/mess/formats/coco_dsk.c +++ b/mess/formats/coco_dsk.c @@ -345,8 +345,8 @@ static floperr_t coco_os9_post_format(floppy_image *floppy, option_resolution *p header[0x0001] = (UINT8) (total_sectors >> 8); header[0x0002] = (UINT8) (total_sectors >> 0); header[0x0003] = (UINT8) sectors; - header[0x0004] = (UINT8) ((total_sectors + 7) / 8) >> 8; - header[0x0005] = (UINT8) ((total_sectors + 7) / 8) >> 0; + header[0x0004] = (UINT8) (((total_sectors + 7) / 8) >> 8); + header[0x0005] = (UINT8) (((total_sectors + 7) / 8) >> 0); header[0x0006] = 0x00; header[0x0007] = 0x01; header[0x0008] = 0x00; @@ -358,8 +358,8 @@ static floperr_t coco_os9_post_format(floppy_image *floppy, option_resolution *p header[0x000e] = (UINT8) rand(); header[0x000f] = (UINT8) rand(); header[0x0010] = (heads == 2) ? 3 : 2; - header[0x0011] = (UINT8) sectors >> 8; - header[0x0012] = (UINT8) sectors >> 0; + header[0x0011] = (UINT8) (sectors >> 8); + header[0x0012] = (UINT8) (sectors >> 0); header[0x001A] = (UINT8) ltime->tm_year; header[0x001B] = (UINT8) ltime->tm_mon + 1; header[0x001C] = (UINT8) ltime->tm_mday; diff --git a/mess/formats/thom_cas.c b/mess/formats/thom_cas.c index 959cb585f..a48d35d7b 100644 --- a/mess/formats/thom_cas.c +++ b/mess/formats/thom_cas.c @@ -28,11 +28,6 @@ files are more compact anyway. */ -#define AUTO_THROTTLE 1 -/* throttle mode forced when the cassette motor is on (to speed up things) - (only works for unix) -*/ - #define VERBOSE 0 /* 0, 1 or 2 */ diff --git a/mess/formats/thom_dsk.c b/mess/formats/thom_dsk.c index 5ebb7778f..1a5d966e9 100644 --- a/mess/formats/thom_dsk.c +++ b/mess/formats/thom_dsk.c @@ -150,7 +150,7 @@ static void thom_floppy_show ( thom_floppy_drive* d ) PRINT (( "thom_floppy: floppy name \"%s\"\n", name )); /* BASIC directory */ - dir += d->sector_size; + dir += d->sector_size*2; for ( j = 0; j < d->sector_size * 14 / 32; j++, dir += 32 ) { char name[] = "01234567.ABC"; char comment[] = "01234567"; @@ -179,7 +179,9 @@ static thom_floppy_drive* thom_floppy_drive_of_image ( mess_image *image ) static void thom_floppy_seek ( mess_image *image, int physical_track ) { thom_floppy_drive* d = thom_floppy_drive_of_image( image ); + thom_floppy_active( 0 ); if ( physical_track < 0 ) physical_track = 0; + if ( physical_track >= 80 ) physical_track = 79; LOG(( "%f thom_floppy_seek: dev=%i track=%i\n", timer_get_time(), d - thom_floppy_drives, physical_track )); d->cur_track = physical_track; @@ -204,6 +206,7 @@ static void thom_floppy_get_id ( mess_image* image, chrn_id* id, d - thom_floppy_drives, trk, id_index, physical_side, (thom_density == DEN_FM_LO) ? "FM" : "MFM", (d->density == DEN_FM_LO) ? "FM" : "MFM" )); + thom_floppy_active( 0 ); if ( thom_floppy_sector_ptr( d, id_index+1, trk, 0 ) && #if 0 /* fails with bobwinter */ @@ -240,16 +243,15 @@ thom_floppy_read_sector_data_into_buffer ( mess_image* image, int side, { thom_floppy_drive* d = thom_floppy_drive_of_image( image ); UINT8* src = thom_floppy_sector_ptr( d, index1, d->cur_track, 0 ); + thom_floppy_active( 0 ); LOG(( "thom_floppy_read_sector_data_into_buffer: dev=%i track=%i idx=%i side=%i len=%i\n", d - thom_floppy_drives, d->cur_track, index1, side, length )); if ( length > d->sector_size ) { logerror( "thom_floppy_read_sector_data_into_buffer: sector size %i truncated to %i\n", length, d->sector_size ); length = d->sector_size; } - if ( src ) { + if ( src ) memcpy( ptr, src, length ); - thom_floppy_icon( 0 ); - } } static void @@ -259,6 +261,7 @@ thom_floppy_write_sector_data_from_buffer ( mess_image *image, int side, { thom_floppy_drive* d = thom_floppy_drive_of_image( image ); UINT8* dst = thom_floppy_sector_ptr( d, data_id, d->cur_track, 0 ); + thom_floppy_active( 1 ); LOG(( "thom_floppy_write_sector_data_into_buffer: dev=%i track=%i idx=%i side=%i ddam=%i len=%i\n", d - thom_floppy_drives, d->cur_track, data_id, side, ddam, length )); if ( length > d->sector_size ) { @@ -268,7 +271,6 @@ thom_floppy_write_sector_data_from_buffer ( mess_image *image, int side, if ( dst ) { memcpy( dst, ptr, length ); d->has_changed = 1; - thom_floppy_icon( 1 ); } } @@ -279,6 +281,7 @@ thom_floppy_format_sector ( mess_image *image, int side, int sector_index, thom_floppy_drive* d = thom_floppy_drive_of_image( image ); int sector_size = 128 << n; UINT8* dst; + thom_floppy_active( 1 ); LOG(( "thom_floppy_format_sector: dev=%i track=%i/%i side=%i/%i idx=%i/%i c=%i h=%i r=%i n=%i filler=$%02X\n", d - thom_floppy_drives, d->cur_track, d->tracks, side, d->sides, sector_index, d->sectors, @@ -303,7 +306,6 @@ thom_floppy_format_sector ( mess_image *image, int side, int sector_index, memset( dst, filler, d->sector_size ); * thom_floppy_sector_flag( d, r, d->cur_track, 0 ) = THOM_SECT_OK; d->has_changed = 1; - thom_floppy_icon( 1 ); } else logerror( "thom_floppy_format_sector: invalid operation\n" ); } diff --git a/mess/image.c b/mess/image.c index 7e6bd7542..5de251b95 100644 --- a/mess/image.c +++ b/mess/image.c @@ -215,7 +215,7 @@ static int image_load_internal(mess_image *img, const char *name, int is_create, /* do we need to reset the CPU? */ if ((timer_get_time() > 0) && dev->reset_on_load) - mame_schedule_soft_reset(); + mame_schedule_soft_reset(Machine); /* prepare to open the file */ img->created = 0; diff --git a/mess/includes/apple2.h b/mess/includes/apple2.h index f63d179b3..34754b824 100644 --- a/mess/includes/apple2.h +++ b/mess/includes/apple2.h @@ -72,7 +72,7 @@ void apple2_iwm_setdiskreg(UINT8 data); UINT8 apple2_iwm_getdiskreg(void); /* machine/apple2.c */ -void apple2_init_common(const apple2_config *config); +void apple2_init_common(running_machine *machine, const apple2_config *config); MACHINE_START( apple2 ); UINT8 apple2_getfloatingbusvalue(void); READ8_HANDLER( apple2_c0xx_r ); diff --git a/mess/includes/c16.h b/mess/includes/c16.h index 233f7edcb..2ceace8c7 100644 --- a/mess/includes/c16.h +++ b/mess/includes/c16.h @@ -161,8 +161,7 @@ extern WRITE8_HANDLER(c16_switch_to_ram); extern int c16_read_keyboard (int databus); extern void c16_interrupt (int); -extern void c16_driver_init (void); -extern void c16_driver_shutdown (void); +extern void c16_driver_init(void); extern MACHINE_RESET( c16 ); extern INTERRUPT_GEN( c16_frame_interrupt ); diff --git a/mess/includes/coco.h b/mess/includes/coco.h index a94a7a598..69a827138 100644 --- a/mess/includes/coco.h +++ b/mess/includes/coco.h @@ -47,6 +47,7 @@ extern UINT8 coco3_gimereg[16]; MACHINE_START( dragon32 ); MACHINE_START( dragon64 ); +MACHINE_START( tanodr64 ); MACHINE_START( dgnalpha ); MACHINE_START( coco ); MACHINE_START( coco2 ); diff --git a/mess/includes/gb.h b/mess/includes/gb.h index 9639b8880..886cc4c4d 100644 --- a/mess/includes/gb.h +++ b/mess/includes/gb.h @@ -111,6 +111,7 @@ extern void gb_scanline_interrupt(void); extern void gb_scanline_interrupt_set_mode0(int param); extern void gb_scanline_interrupt_set_mode3(int param); +extern MACHINE_START( gb ); extern MACHINE_RESET( gb ); extern MACHINE_RESET( gbpocket ); diff --git a/mess/includes/intv.h b/mess/includes/intv.h index 0b59eec83..170976cb2 100644 --- a/mess/includes/intv.h +++ b/mess/includes/intv.h @@ -15,8 +15,6 @@ extern UINT8 intv_gram[]; extern UINT8 intv_gramdirtybytes[]; extern UINT16 intv_ram16[]; -extern DRIVER_INIT( intv ); - DEVICE_INIT( intv_cart ); DEVICE_LOAD( intv_cart ); @@ -39,7 +37,6 @@ READ8_HANDLER( intv_left_control_r ); /* for the console + keyboard component... */ extern int intvkbd_text_blanked; -DRIVER_INIT( intvkbd ); DEVICE_LOAD( intvkbd_cart ); extern UINT16 *intvkbd_dualport_ram; diff --git a/mess/includes/microtan.h b/mess/includes/microtan.h index 4606ff1ed..baab0731b 100644 --- a/mess/includes/microtan.h +++ b/mess/includes/microtan.h @@ -26,7 +26,7 @@ extern UINT8 microtan_chunky_graphics; extern UINT8 *microtan_chunky_buffer; /* from mess/machine/microtan.c */ -void init_microtan(void); +DRIVER_INIT( microtan ); MACHINE_RESET( microtan ); SNAPSHOT_LOAD( microtan ); diff --git a/mess/includes/mz700.h b/mess/includes/mz700.h index f19e67004..a144c0722 100644 --- a/mess/includes/mz700.h +++ b/mess/includes/mz700.h @@ -62,4 +62,4 @@ extern WRITE8_HANDLER( videoram2_w ); extern WRITE8_HANDLER( videoram3_w ); extern WRITE8_HANDLER( pcgram_w ); -extern void init_mz800(void); +extern DRIVER_INIT( mz800 ); diff --git a/mess/includes/pc.h b/mess/includes/pc.h index b40636902..68363c4c6 100644 --- a/mess/includes/pc.h +++ b/mess/includes/pc.h @@ -1,14 +1,14 @@ #include "driver.h" -void init_pccga(void); -void init_pcmda(void); -void init_europc(void); -void init_bondwell(void); -void init_pc200(void); -void init_pc1512(void); -void init_pc1640(void); -void init_pc_vga(void); -void init_t1000hx(void); +DRIVER_INIT( pccga ); +DRIVER_INIT( pcmda ); +DRIVER_INIT( europc ); +DRIVER_INIT( bondwell ); +DRIVER_INIT( pc200 ); +DRIVER_INIT( pc1512 ); +DRIVER_INIT( pc1640 ); +DRIVER_INIT( pc_vga ); +DRIVER_INIT( t1000hx ); MACHINE_RESET( pc_mda ); MACHINE_RESET( pc_cga ); diff --git a/mess/includes/wswan.h b/mess/includes/wswan.h index fbffccd8a..cbf43668b 100644 --- a/mess/includes/wswan.h +++ b/mess/includes/wswan.h @@ -84,6 +84,8 @@ extern MACHINE_START( wscolor ); extern MACHINE_RESET( wswan ); extern READ8_HANDLER( wswan_port_r ); extern WRITE8_HANDLER( wswan_port_w ); +extern READ8_HANDLER( wswan_sram_r ); +extern WRITE8_HANDLER( wswan_sram_w ); extern DEVICE_INIT(wswan_cart); extern DEVICE_LOAD(wswan_cart); extern INTERRUPT_GEN(wswan_scanline_interrupt); diff --git a/mess/machine/6883sam.c b/mess/machine/6883sam.c index 682a3325d..7316df05d 100644 --- a/mess/machine/6883sam.c +++ b/mess/machine/6883sam.c @@ -91,7 +91,7 @@ static const UINT8 sam_video_mode_row_pitches[] = 32 /* 7 - Reserved/Invalid */ }; -static void sam_reset(void); +static void sam_reset(running_machine *machine); static void update_sam(void) { @@ -119,13 +119,13 @@ static void update_sam(void) -void sam_init(const sam6883_interface *intf) +void sam_init(running_machine *machine, const sam6883_interface *intf) { sam.state = 0; sam.old_state = ~0; sam.intf = intf; - add_reset_callback(sam_reset); + add_reset_callback(machine, sam_reset); /* save state registration */ state_save_register_item("6883sam", 0, sam.state); @@ -135,7 +135,7 @@ void sam_init(const sam6883_interface *intf) -static void sam_reset(void) +static void sam_reset(running_machine *machine) { sam.state = 0; sam.old_state = ~0; diff --git a/mess/machine/6883sam.h b/mess/machine/6883sam.h index c4392e60b..2895b8721 100644 --- a/mess/machine/6883sam.h +++ b/mess/machine/6883sam.h @@ -37,7 +37,7 @@ struct _sam6883_interface }; /* initialize the SAM */ -void sam_init(const sam6883_interface *intf); +void sam_init(running_machine *machine, const sam6883_interface *intf); /* set the state of the SAM */ void sam_set_state(UINT16 state, UINT16 mask); diff --git a/mess/machine/apple2.c b/mess/machine/apple2.c index 0be628a0d..1c0e2745a 100644 --- a/mess/machine/apple2.c +++ b/mess/machine/apple2.c @@ -717,7 +717,7 @@ UINT8 apple2_getfloatingbusvalue(void) * Machine reset * ----------------------------------------------------------------------- */ -static void apple2_reset(void) +static void apple2_reset(running_machine *machine) { int need_intcxrom, i; @@ -1501,7 +1501,7 @@ const apple2_slotdevice apple2_slot_iwm = * Driver init * ----------------------------------------------------------------------- */ -void apple2_init_common(const apple2_config *config) +void apple2_init_common(running_machine *machine, const apple2_config *config) { int i; void *token; @@ -1509,7 +1509,7 @@ void apple2_init_common(const apple2_config *config) a2 = 0; AY3600_init(); - add_reset_callback(apple2_reset); + add_reset_callback(machine, apple2_reset); /* copy configuration */ a2_config = auto_malloc(sizeof(*config)); @@ -1584,7 +1584,7 @@ MACHINE_START( apple2 ) if (!strcmp(Machine->gamedrv->name, "apple2cp")) apple2cp_ce00_ram = auto_malloc(0x200); - apple2_init_common(&a2_cfg); + apple2_init_common(machine, &a2_cfg); /* setup memory */ memset(&mem_cfg, 0, sizeof(mem_cfg)); @@ -1594,7 +1594,7 @@ MACHINE_START( apple2 ) apple2_setup_memory(&mem_cfg); /* perform initial reset */ - apple2_reset(); + apple2_reset(machine); return 0; } diff --git a/mess/machine/apple2gs.c b/mess/machine/apple2gs.c index 2ae12edae..98fd575a0 100644 --- a/mess/machine/apple2gs.c +++ b/mess/machine/apple2gs.c @@ -1662,7 +1662,7 @@ MACHINE_START( apple2gs ) cfg.slots[4] = &apple2_slot_mockingboard; cfg.slots[6] = &apple2_slot_iwm; - apple2_init_common(&cfg); + apple2_init_common(machine, &cfg); /* set up Apple IIgs vectoring */ cpunum_set_info_fct(0, CPUINFO_PTR_G65816_READVECTOR_CALLBACK, (genf *) apple2gs_read_vector); diff --git a/mess/machine/at.c b/mess/machine/at.c index b9c0f047e..794335421 100644 --- a/mess/machine/at.c +++ b/mess/machine/at.c @@ -85,7 +85,7 @@ DRIVER_INIT( at386 ) DRIVER_INIT( at586 ) { - init_at386(); + init_at386(machine); intel82439tx_init(); } diff --git a/mess/machine/atom.c b/mess/machine/atom.c index 7509b1b0f..b16c24c52 100644 --- a/mess/machine/atom.c +++ b/mess/machine/atom.c @@ -494,7 +494,7 @@ READ8_HANDLER(atom_eprom_box_r) MACHINE_RESET( atomeb ) { - machine_reset_atom(); + machine_reset_atom(machine); atom_eprom_box_init(); } diff --git a/mess/machine/ay3600.c b/mess/machine/ay3600.c index b3f981ca1..1d613912f 100644 --- a/mess/machine/ay3600.c +++ b/mess/machine/ay3600.c @@ -388,7 +388,7 @@ static void AY3600_poll(int dummy) { reset_flag = 0; cpunum_set_input_line(0, INPUT_LINE_RESET, CLEAR_LINE); - mame_schedule_soft_reset(); + mame_schedule_soft_reset(Machine); } /* run through real keys and see what's being pressed */ diff --git a/mess/machine/bebox.c b/mess/machine/bebox.c index 2ccee06b5..642a0fcec 100644 --- a/mess/machine/bebox.c +++ b/mess/machine/bebox.c @@ -963,7 +963,7 @@ static struct LSI53C810interface scsi53c810_intf = NVRAM_HANDLER( bebox ) { - nvram_handler_intelflash(0, file, read_or_write); + nvram_handler_intelflash(machine, 0, file, read_or_write); } MACHINE_RESET( bebox ) diff --git a/mess/machine/c128.c b/mess/machine/c128.c index b9ff9ff30..dba8a5c07 100644 --- a/mess/machine/c128.c +++ b/mess/machine/c128.c @@ -60,7 +60,7 @@ static UINT8 *c128_ram; static void c128_set_m8502_read_handler(UINT16 start, UINT16 end, read8_handler rh) { int cpunum; - cpunum = mame_find_cpu_index("m8502"); + cpunum = mame_find_cpu_index(Machine, "m8502"); memory_install_read8_handler(cpunum, ADDRESS_SPACE_PROGRAM, start, end, 0, 0, rh); } @@ -837,12 +837,12 @@ MACHINE_RESET( c128 ) VIDEO_START( c128 ) { - return video_start_vdc8563() || video_start_vic2(); + return video_start_vdc8563(machine) || video_start_vic2(machine); } VIDEO_UPDATE( c128 ) { - video_update_vdc8563(screen, bitmap, cliprect); - video_update_vic2(screen, bitmap, cliprect); + video_update_vdc8563(machine, screen, bitmap, cliprect); + video_update_vic2(machine, screen, bitmap, cliprect); return 0; } diff --git a/mess/machine/c16.c b/mess/machine/c16.c index cd4d83185..a61ff33e6 100644 --- a/mess/machine/c16.c +++ b/mess/machine/c16.c @@ -442,18 +442,13 @@ static void c16_common_driver_init (void) #endif } -void c16_driver_init (void) +void c16_driver_init(void) { c16_common_driver_init (); ted7360_init (C16_PAL); ted7360_set_dma (ted7360_dma_read, ted7360_dma_read_rom); } -void c16_driver_shutdown (void) -{ - vc20_tape_close (); -} - static WRITE8_HANDLER(c16_sidcart_16k) { mess_ram[0x1400 + offset]=data; diff --git a/mess/machine/c64.c b/mess/machine/c64.c index 64a16f6bc..c725bae85 100644 --- a/mess/machine/c64.c +++ b/mess/machine/c64.c @@ -33,7 +33,7 @@ #include "includes/c64.h" -static void c64_driver_shutdown (void); +static void c64_driver_shutdown (running_machine *machine); unsigned char c65_keyline = { 0xff }; UINT8 c65_6511_port=0xff; @@ -61,12 +61,14 @@ UINT8 *c64_kernal; UINT8 *c64_chargen; UINT8 *c64_roml=0; UINT8 *c64_romh=0; +UINT8 *c64_io_mirror = NULL; static UINT8 *roml=0, *romh=0; static int ultimax = 0; int c64_tape_on = 1; static int c64_cia1_on = 1; static UINT8 cartridge = 0; +static int c64_io_enabled = 0; static enum { CartridgeAuto = 0, CartridgeUltimax, CartridgeC64, @@ -467,6 +469,7 @@ static void c64_supergames_w(int offset, int value) WRITE8_HANDLER( c64_write_io ) { + c64_io_mirror[ offset ] = data; if (offset < 0x400) { vic2_port_w (offset & 0x3ff, data); } else if (offset < 0x800) { @@ -626,11 +629,13 @@ static void c64_bankswitch (int reset) if ((!c64_game && c64_exrom) || (charen && (loram || hiram))) { + c64_io_enabled = 1; memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xd000, 0xdfff, 0, 0, c64_read_io); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xd000, 0xdfff, 0, 0, c64_write_io); } else { + c64_io_enabled = 0; memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xd000, 0xdfff, 0, 0, MRA8_BANK5); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xd000, 0xdfff, 0, 0, MWA8_BANK6); memory_set_bankptr (6, c64_memory + 0xd000); @@ -841,7 +846,7 @@ static void c64_common_driver_init (void) c64_vic_interrupt); } cia_reset(); - add_exit_callback(c64_driver_shutdown); + add_exit_callback(Machine, c64_driver_shutdown); } DRIVER_INIT( c64 ) @@ -879,7 +884,7 @@ DRIVER_INIT( sx64 ) vc1541_config (0, 0, &vc1541); } -static void c64_driver_shutdown (void) +static void c64_driver_shutdown (running_machine *machine) { if (c64_tape_on) vc20_tape_close (); @@ -902,8 +907,21 @@ void c64_common_init_machine (void) vicirq = 0; } +OPBASE_HANDLER( c64_opbase ) { + if ( ( ( address & 0xf000 ) == 0xd000 ) && c64_io_enabled ) { + opcode_mask = 0x0fff; + opcode_arg_base = c64_io_mirror; + opcode_base = c64_io_mirror; + opcode_memory_min = 0xd000; + opcode_memory_max = 0x0fff; + return -1; + } + return address; +} + MACHINE_START( c64 ) { + c64_io_mirror = auto_malloc( 0x1000 ); c64_common_init_machine (); c64_rom_recognition (); @@ -913,6 +931,7 @@ MACHINE_START( c64 ) c128_bankswitch_64 (1); if (!ultimax) c64_bankswitch (1); + memory_set_opbase_handler( 0, c64_opbase ); return 0; } diff --git a/mess/machine/cgenie.c b/mess/machine/cgenie.c index 550f4bffd..f58c42a22 100644 --- a/mess/machine/cgenie.c +++ b/mess/machine/cgenie.c @@ -113,7 +113,7 @@ static int put_cycles = 0; static int get_cycles = 0; /* a prototype to be called from cgenie_stop_machine */ -static void tape_put_close(void); +static void tape_put_close(running_machine *machine); static OPBASE_HANDLER (opbaseoverride) @@ -222,7 +222,7 @@ static OPBASE_HANDLER (opbaseoverride) static void cgenie_fdc_callback(int); -static void cgenie_machine_reset(void) +static void cgenie_machine_reset(running_machine *machine) { UINT8 *ROM = memory_region(REGION_CPU1); @@ -323,8 +323,8 @@ MACHINE_START( cgenie ) videoram = mess_ram; memory_set_bankptr(1, mess_ram); - add_reset_callback(cgenie_machine_reset); - add_exit_callback(tape_put_close); + add_reset_callback(machine, cgenie_machine_reset); + add_exit_callback(machine, tape_put_close); return 0; } @@ -471,7 +471,7 @@ static void tape_put_byte(UINT8 value) * eventuall flush output buffer and close an open * virtual tape output file. *******************************************************************/ -static void tape_put_close(void) +static void tape_put_close(running_machine *machine) { tape_count = 0; } @@ -491,7 +491,7 @@ static void tape_put_bit(void) if( diff > 4000 ) { /* reset tape output */ - tape_put_close(); + tape_put_close(Machine); put_bit_count = tape_bits = in_sync = 0; } else @@ -788,7 +788,7 @@ WRITE8_HANDLER( cgenie_port_ff_w ) b = 15; } } - palette_set_color(0, r, g, b); + palette_set_color(Machine, 0, r, g, b); } /* character mode changed ? */ diff --git a/mess/machine/coco.c b/mess/machine/coco.c index 9a08f1be6..587db556a 100644 --- a/mess/machine/coco.c +++ b/mess/machine/coco.c @@ -120,7 +120,7 @@ static void coco3_sam_set_maptype(int val); static const UINT8 *coco3_sam_get_rambase(void); static void coco_setcartline(int data); static void coco3_setcartline(int data); -static void coco_machine_stop(void); +static void coco_machine_stop(running_machine *machine); /* Are we a CoCo or a Dragon ? */ typedef enum @@ -168,7 +168,7 @@ static int count_bank(void); static int is_Orch90(void); #ifdef MAME_DEBUG -static unsigned coco_dasm_override(int cpunum, char *buffer, unsigned pc); +static offs_t coco_dasm_override(char *buffer, offs_t pc, UINT8 *oprom, UINT8 *opram, int bytes); #endif /* MAME_DEBUG */ @@ -2309,7 +2309,7 @@ static const struct cartridge_callback coco3_cartcallbacks = coco3_setcartbank }; -static void generic_init_machine(const pia6821_interface *piaintf, const sam6883_interface *samintf, +static void generic_init_machine(running_machine *machine, const pia6821_interface *piaintf, const sam6883_interface *samintf, const struct cartridge_slot *cartinterface, const struct cartridge_callback *cartcallback, void (*recalc_interrupts_)(int dummy)) { @@ -2330,7 +2330,7 @@ static void generic_init_machine(const pia6821_interface *piaintf, const sam6883 pia_config(2, PIA_STANDARD_ORDERING | PIA_8BIT, &piaintf[2]); /* Dragon Alpha 3rd pia */ pia_reset(); - sam_init(samintf); + sam_init(machine, samintf); /* HACK for bankswitching carts */ if( is_Orch90() ) @@ -2344,16 +2344,16 @@ static void generic_init_machine(const pia6821_interface *piaintf, const sam6883 input_port_set_changed_callback(portnum, ~0, coco_poll_keyboard, NULL); #ifdef MAME_DEBUG - cpuintrf_set_dasm_override(coco_dasm_override); + cpuintrf_set_dasm_override(0, coco_dasm_override); #endif - add_exit_callback(coco_machine_stop); + add_exit_callback(machine, coco_machine_stop); } MACHINE_START( dragon32 ) { memory_set_bankptr(1, &mess_ram[0]); - generic_init_machine(coco_pia_intf, &coco_sam_intf, &cartridge_fdc_dragon, &coco_cartcallbacks, d_recalc_interrupts); + generic_init_machine(machine, coco_pia_intf, &coco_sam_intf, &cartridge_fdc_dragon, &coco_cartcallbacks, d_recalc_interrupts); coco_or_dragon = AM_DRAGON; return 0; @@ -2362,17 +2362,28 @@ MACHINE_START( dragon32 ) MACHINE_START( dragon64 ) { memory_set_bankptr(1, &mess_ram[0]); - generic_init_machine(dragon64_pia_intf, &dragon64_sam_intf, &cartridge_fdc_dragon, &coco_cartcallbacks, d_recalc_interrupts); + generic_init_machine(machine, dragon64_pia_intf, &dragon64_sam_intf, &cartridge_fdc_dragon, &coco_cartcallbacks, d_recalc_interrupts); acia_6551_init(); coco_or_dragon = AM_DRAGON; return 0; } +MACHINE_START( tanodr64 ) +{ + memory_set_bankptr(1, &mess_ram[0]); + generic_init_machine(machine, dragon64_pia_intf, &dragon64_sam_intf, &cartridge_fdc_coco, &coco_cartcallbacks, d_recalc_interrupts); + acia_6551_init(); + + coco_or_dragon = AM_DRAGON; + + return 0; +} + MACHINE_START( dgnalpha ) { memory_set_bankptr(1, &mess_ram[0]); - generic_init_machine(dgnalpha_pia_intf, &dragon64_sam_intf, 0 /*&cartridge_fdc_dragon*/, &coco_cartcallbacks, d_recalc_interrupts); + generic_init_machine(machine, dgnalpha_pia_intf, &dragon64_sam_intf, 0 /*&cartridge_fdc_dragon*/, &coco_cartcallbacks, d_recalc_interrupts); acia_6551_init(); @@ -2389,7 +2400,7 @@ MACHINE_START( dgnalpha ) MACHINE_START( coco ) { memory_set_bankptr(1, &mess_ram[0]); - generic_init_machine(coco_pia_intf, &coco_sam_intf, &cartridge_fdc_coco, &coco_cartcallbacks, d_recalc_interrupts); + generic_init_machine(machine, coco_pia_intf, &coco_sam_intf, &cartridge_fdc_coco, &coco_cartcallbacks, d_recalc_interrupts); coco_or_dragon = AM_COCO; return 0; @@ -2398,13 +2409,13 @@ MACHINE_START( coco ) MACHINE_START( coco2 ) { memory_set_bankptr(1, &mess_ram[0]); - generic_init_machine(coco2_pia_intf, &coco_sam_intf, &cartridge_fdc_coco, &coco_cartcallbacks, d_recalc_interrupts); + generic_init_machine(machine, coco2_pia_intf, &coco_sam_intf, &cartridge_fdc_coco, &coco_cartcallbacks, d_recalc_interrupts); coco_or_dragon = AM_COCO; return 0; } -static void coco3_machine_reset(void) +static void coco3_machine_reset(running_machine *machine) { int i; @@ -2429,9 +2440,9 @@ MACHINE_START( coco3 ) { int portnum; - generic_init_machine(coco3_pia_intf, &coco3_sam_intf, &cartridge_fdc_coco, &coco3_cartcallbacks, coco3_recalc_interrupts); + generic_init_machine(machine, coco3_pia_intf, &coco3_sam_intf, &cartridge_fdc_coco, &coco3_cartcallbacks, coco3_recalc_interrupts); - coco3_machine_reset(); + coco3_machine_reset(machine); coco3_timer_init(); coco3_interupt_line = 0; @@ -2448,11 +2459,11 @@ MACHINE_START( coco3 ) state_save_register_global(gime_firq); state_save_register_func_postload(coco3_state_postload); - add_reset_callback(coco3_machine_reset); + add_reset_callback(machine, coco3_machine_reset); return 0; } -static void coco_machine_stop(void) +static void coco_machine_stop(running_machine *machine) { if (coco_cart_interface && coco_cart_interface->term) coco_cart_interface->term(); @@ -2615,14 +2626,14 @@ static const char *os9syscalls[] = }; -static unsigned coco_dasm_override(int cpunum, char *buffer, unsigned pc) +static offs_t coco_dasm_override(char *buffer, offs_t pc, UINT8 *oprom, UINT8 *opram, int bytes) { unsigned call; unsigned result = 0; - if ((cpu_readop(pc + 0) == 0x10) && (cpu_readop(pc + 1) == 0x3F)) + if ((oprom[0] == 0x10) && (oprom[1] == 0x3F)) { - call = cpu_readop(pc + 2); + call = oprom[2]; if ((call >= 0) && (call < sizeof(os9syscalls) / sizeof(os9syscalls[0])) && os9syscalls[call]) { sprintf(buffer, "OS9 %s", os9syscalls[call]); diff --git a/mess/machine/cococart.c b/mess/machine/cococart.c index b79a4dcf7..e4d9d45a4 100644 --- a/mess/machine/cococart.c +++ b/mess/machine/cococart.c @@ -389,7 +389,9 @@ WRITE8_HANDLER(dragon_floppy_w) wd179x_command_w(0, data); /* disk head is encoded in the command byte */ - wd179x_set_side((data & 0x02) ? 1 : 0); + /* Only for type 3 & 4 commands */ + if (data & 0x80) + wd179x_set_side((data & 0x02) ? 1 : 0); break; case 1: wd179x_track_w(0, data); diff --git a/mess/machine/cpm_bios.c b/mess/machine/cpm_bios.c index 2f285c3c9..b95a681b7 100644 --- a/mess/machine/cpm_bios.c +++ b/mess/machine/cpm_bios.c @@ -64,7 +64,7 @@ cpm_dph dph[NDSK] = { { 0, 0, 0, 0, DIRBUF, DPB3, 0, 0 } }; -static void cpm_exit(void); +static void cpm_exit(running_machine *machine); #include "cpm_disk.c" @@ -260,7 +260,7 @@ int cpm_init(int n, const char *ids[]) cpm_jumptable(); - add_exit_callback(cpm_exit); + add_exit_callback(Machine, cpm_exit); return 0; } @@ -268,7 +268,7 @@ int cpm_init(int n, const char *ids[]) * cpm_exit * Shut down the BIOS simulation; close image files; exit osd_fdc *****************************************************************************/ -static void cpm_exit(void) +static void cpm_exit(running_machine *machine) { int d; diff --git a/mess/machine/dai.c b/mess/machine/dai.c index 9e8c85b98..9b5d9158c 100644 --- a/mess/machine/dai.c +++ b/mess/machine/dai.c @@ -178,7 +178,7 @@ MACHINE_START( dai ) case 0x00: data = readinputport(8); data |= 0x08; // serial ready - if (mame_rand()&0x01) + if (mame_rand(Machine)&0x01) data |= 0x40; // random number generator if (cassette_input(image_from_devtype_and_index(IO_CASSETTE, 0)) > 0.01) data |= 0x80; // tape input diff --git a/mess/machine/dgn_beta.c b/mess/machine/dgn_beta.c index 9ec6473b4..fa6d0a52e 100644 --- a/mess/machine/dgn_beta.c +++ b/mess/machine/dgn_beta.c @@ -94,7 +94,7 @@ static UINT8 *system_rom; #endif /* MAME_DEBUG */ #ifdef MAME_DEBUG -static unsigned dgnbeta_dasm_override(int cpunum, char *buffer, unsigned pc); +static offs_t dgnbeta_dasm_override(char *buffer, offs_t pc, UINT8 *oprom, UINT8 *opram, int bytes); #endif /* MAME_DEBUG */ static READ8_HANDLER(d_pia0_pa_r); @@ -970,7 +970,7 @@ INTERRUPT_GEN( dgn_beta_frame_interrupt ) /********************************* Machine/Driver Initialization ****************************************/ -static void dgnbeta_reset(void) +static void dgnbeta_reset(running_machine *machine) { system_rom = memory_region(REGION_CPU1); @@ -1014,11 +1014,11 @@ MACHINE_START( dgnbeta ) wd179x_init(WD_TYPE_179X,dgnbeta_fdc_callback); #ifdef MAME_DEBUG - cpuintrf_set_dasm_override(dgnbeta_dasm_override); + cpuintrf_set_dasm_override(0, dgnbeta_dasm_override); #endif - add_reset_callback(dgnbeta_reset); - dgnbeta_reset(); + add_reset_callback(machine, dgnbeta_reset); + dgnbeta_reset(machine); return 0; } @@ -1180,14 +1180,14 @@ static const char *os9syscalls[] = }; -static unsigned dgnbeta_dasm_override(int cpunum, char *buffer, unsigned pc) +static offs_t dgnbeta_dasm_override(char *buffer, offs_t pc, UINT8 *oprom, UINT8 *opram, int bytes) { unsigned call; unsigned result = 0; - if ((cpu_readop(pc + 0) == 0x10) && (cpu_readop(pc + 1) == 0x3F)) + if ((oprom[0] == 0x10) && (oprom[1] == 0x3F)) { - call = cpu_readop(pc + 2); + call = oprom[2]; if ((call >= 0) && (call < sizeof(os9syscalls) / sizeof(os9syscalls[0])) && os9syscalls[call]) { sprintf(buffer, "OS9 %s", os9syscalls[call]); diff --git a/mess/machine/electron.c b/mess/machine/electron.c index af84bd172..179b561a1 100644 --- a/mess/machine/electron.c +++ b/mess/machine/electron.c @@ -265,7 +265,7 @@ static void setup_beep(int dummy) { beep_set_frequency( 0, 300 ); } -static void electron_reset(void) +static void electron_reset(running_machine *machine) { memory_set_bank(2, 0); @@ -292,7 +292,7 @@ MACHINE_START( electron ) ula.interrupt_control = 0x00; timer_set( 0.0, 0, setup_beep ); electron_tape_timer = timer_alloc( electron_tape_timer_handler ); - add_reset_callback(electron_reset); + add_reset_callback(machine, electron_reset); return 0; } diff --git a/mess/machine/gb.c b/mess/machine/gb.c index 9e631f5d1..e7038391b 100644 --- a/mess/machine/gb.c +++ b/mess/machine/gb.c @@ -71,7 +71,7 @@ UINT8 gb_ie; UINT8 *gb_dummy_rom_bank = NULL; UINT8 *gb_dummy_ram_bank = NULL; -static void gb_machine_stop(void); +static void gb_machine_stop(running_machine *machine); void (*refresh_scanline)(void); #ifdef MAME_DEBUG @@ -167,6 +167,12 @@ static void gb_init(void) gb_sound_w( 0x16, 0x00 ); /* Initialize sound hardware */ } +MACHINE_START( gb ) +{ + add_exit_callback(machine, gb_machine_stop); + return 0; +} + MACHINE_RESET( gb ) { gb_init(); @@ -290,16 +296,10 @@ MACHINE_RESET( gbc ) /* set the scanline refresh function */ refresh_scanline = gbc_refresh_scanline; - - /* NPW 25-Jun-2006 - how will battery backed RAM be saved? */ - if (0) - add_exit_callback(gb_machine_stop); } -static void gb_machine_stop(void) +static void gb_machine_stop(running_machine *machine) { -/* int I; */ - /* Don't save if there was no battery */ if( !(CartType & BATTERY) ) return; @@ -308,17 +308,6 @@ static void gb_machine_stop(void) built in macros is because they force the filename to be the name of the machine. We need to have a separate name for each game. */ image_battery_save(image_from_devtype_and_index(IO_CARTSLOT, 0), gb_cart_ram, RAMBanks * 0x2000 ); - - /* FIXME: We should release memory here, but this function is called upon reset - and we don't reload the rom, so we're going to have to leak for now. */ -/* for( I = 0; I < RAMBanks; I++ ) - { - free( RAMMap[I] ); - } - for( I = 0; I < ROMBanks; I++ ) - { - free( ROMMap[I] ); - }*/ } WRITE8_HANDLER( gb_rom_bank_select_mbc1 ) diff --git a/mess/machine/genesis.c b/mess/machine/genesis.c index 7af6b10e9..12e4953be 100644 --- a/mess/machine/genesis.c +++ b/mess/machine/genesis.c @@ -1027,7 +1027,7 @@ VIDEO_START(genesis) { genesis_vdp_start (&genesis_vdp); oldscreenmode = 0xff; // driver specific - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } VIDEO_UPDATE(genesis) @@ -1071,11 +1071,11 @@ VIDEO_UPDATE(genesis) g = (paldat & 0x00e0) >>4; b = (paldat & 0x0e00) >>8; - palette_set_color(i,r<<4,g<<4,b<<4); + palette_set_color(machine, i,r<<4,g<<4,b<<4); } - video_update_generic_bitmapped(screen, bitmap, cliprect); + video_update_generic_bitmapped(machine, screen, bitmap, cliprect); return 0; } @@ -1377,7 +1377,7 @@ READ16_HANDLER ( genesis_68000_io_r ) // return 0x30; -// return mame_rand(); +// return mame_rand(machine); // return 0xff; } @@ -1530,7 +1530,7 @@ UINT16 genesis_vdp_control_read ( genvdp *current_vdp ) return retvalue; -// return mame_rand(); +// return mame_rand(machine); } UINT16 genesis_vdp_hvcounter_read ( genvdp *current_vdp ) diff --git a/mess/machine/geneve.c b/mess/machine/geneve.c index 8d1ccd61f..85d65f462 100644 --- a/mess/machine/geneve.c +++ b/mess/machine/geneve.c @@ -132,7 +132,7 @@ static int KeyFakeUnshiftState; static int KeyAutoRepeatKey; static int KeyAutoRepeatTimer; -static void machine_stop_geneve(void); +static void machine_stop_geneve(running_machine *machine); /* GROM support. @@ -288,11 +288,11 @@ MACHINE_START( geneve ) if (has_usb_sm) ti99_usbsm_init(TRUE); - add_exit_callback(machine_stop_geneve); + add_exit_callback(machine, machine_stop_geneve); return 0; } -static void machine_stop_geneve(void) +static void machine_stop_geneve(running_machine *machine) { if (has_ide) ti99_ide_save_memcard(); @@ -309,7 +309,7 @@ static void machine_stop_geneve(void) */ VIDEO_START(geneve) { - return v9938_init(MODEL_V9938, /*0x20000*/0x30000, tms9901_set_int2); /* v38 with 128 kb of video RAM */ + return v9938_init(machine, MODEL_V9938, /*0x20000*/0x30000, tms9901_set_int2); /* v38 with 128 kb of video RAM */ } /* diff --git a/mess/machine/intv.c b/mess/machine/intv.c index ce8b529a5..8a139288a 100644 --- a/mess/machine/intv.c +++ b/mess/machine/intv.c @@ -495,10 +495,6 @@ static UINT8 controller_table[] = /* Intellivision console + keyboard component */ -void init_intvkbd(void) -{ -} - DEVICE_LOAD( intvkbd_cart ) { int id = image_index_in_device(image); diff --git a/mess/machine/jupiter.c b/mess/machine/jupiter.c index a177f864b..d70848217 100644 --- a/mess/machine/jupiter.c +++ b/mess/machine/jupiter.c @@ -34,7 +34,7 @@ jupiter_tape; static UINT8 *jupiter_data = NULL; static int jupiter_data_type = JUPITER_NONE; -static void jupiter_machine_stop(void); +static void jupiter_machine_stop(running_machine *machine); /* only gets called at the start of a cpu time slice */ @@ -124,11 +124,11 @@ MACHINE_START( jupiter ) memory_set_opbase_handler(0, jupiter_opbaseoverride); } - add_exit_callback(jupiter_machine_stop); + add_exit_callback(machine, jupiter_machine_stop); return 0; } -static void jupiter_machine_stop(void) +static void jupiter_machine_stop(running_machine *machine) { if (jupiter_data) { diff --git a/mess/machine/kc.c b/mess/machine/kc.c index 76617210e..f7d0ef121 100644 --- a/mess/machine/kc.c +++ b/mess/machine/kc.c @@ -1932,7 +1932,7 @@ MACHINE_RESET( kc85_4 ) MACHINE_RESET( kc85_4d ) { - machine_reset_kc85_4(); + machine_reset_kc85_4(machine); kc_disc_interface_init(); } diff --git a/mess/machine/lisa.c b/mess/machine/lisa.c index 5eb903231..873ddc0ca 100644 --- a/mess/machine/lisa.c +++ b/mess/machine/lisa.c @@ -1084,7 +1084,7 @@ NVRAM_HANDLER(lisa) lisa_features.has_mac_xl_video = 0; }*/ -void init_lisa2(void) +DRIVER_INIT( lisa2 ) { lisa_model = lisa2; lisa_features.has_fast_timers = 0; @@ -1093,7 +1093,7 @@ void init_lisa2(void) lisa_features.has_mac_xl_video = 0; } -void init_lisa210(void) +DRIVER_INIT( lisa210 ) { lisa_model = lisa210; lisa_features.has_fast_timers = 1; @@ -1102,7 +1102,7 @@ void init_lisa210(void) lisa_features.has_mac_xl_video = 0; } -void init_mac_xl(void) +DRIVER_INIT( mac_xl ) { lisa_model = mac_xl; lisa_features.has_fast_timers = 1; diff --git a/mess/machine/lisa.h b/mess/machine/lisa.h index ce219be1d..93503cbd0 100644 --- a/mess/machine/lisa.h +++ b/mess/machine/lisa.h @@ -19,9 +19,9 @@ VIDEO_UPDATE( lisa ); extern NVRAM_HANDLER(lisa); -void init_lisa2(void); -void init_lisa210(void); -void init_mac_xl(void); +DRIVER_INIT( lisa2 ); +DRIVER_INIT( lisa210 ); +DRIVER_INIT( mac_xl ); MACHINE_RESET( lisa ); diff --git a/mess/machine/lviv.c b/mess/machine/lviv.c index 3728bcfb2..237127544 100644 --- a/mess/machine/lviv.c +++ b/mess/machine/lviv.c @@ -45,7 +45,7 @@ static void lviv_update_memory (void) static OPBASE_HANDLER(lviv_opbaseoverride) { if (readinputport(12)&0x01) - mame_schedule_soft_reset(); + mame_schedule_soft_reset(Machine); return address; } diff --git a/mess/machine/lynx.c b/mess/machine/lynx.c index 28d279160..5bceadcd4 100644 --- a/mess/machine/lynx.c +++ b/mess/machine/lynx.c @@ -1163,7 +1163,7 @@ WRITE8_HANDLER( lynx_memory_config_w ) memory_set_bank(4, (data & 8) ? 1 : 0); } -static void lynx_reset(void) +static void lynx_reset(running_machine *machine) { int i; lynx_memory_config_w(0, 0); @@ -1210,6 +1210,6 @@ MACHINE_START( lynx ) memset(&suzy, 0, sizeof(suzy)); - add_reset_callback(lynx_reset); + add_reset_callback(machine, lynx_reset); return 0; } diff --git a/mess/machine/mac.c b/mess/machine/mac.c index 4be37d610..0821ba72a 100644 --- a/mess/machine/mac.c +++ b/mess/machine/mac.c @@ -74,7 +74,7 @@ static WRITE8_HANDLER(mac_via_out_a); static WRITE8_HANDLER(mac_via_out_b); static WRITE8_HANDLER(mac_via_out_cb2); static void mac_via_irq(int state); -static unsigned mac_dasm_override(int cpunum, char *buffer, unsigned pc); +static offs_t mac_dasm_override(char *buffer, offs_t pc, UINT8 *oprom, UINT8 *opram, int bytes); static struct via6522_interface mac_via6522_intf = { @@ -1355,7 +1355,7 @@ static void mac_driver_init(mac_model_t model) inquiry_timeout = mame_timer_alloc(inquiry_timeout_func); - cpuintrf_set_dasm_override(mac_dasm_override); + cpuintrf_set_dasm_override(0, mac_dasm_override); /* save state stuff */ state_save_register_global(mac_overlay); @@ -2282,13 +2282,13 @@ static const char *lookup_trap(UINT16 opcode) -static unsigned mac_dasm_override(int cpunum, char *buffer, unsigned pc) +static offs_t mac_dasm_override(char *buffer, offs_t pc, UINT8 *oprom, UINT8 *opram, int bytes) { UINT16 opcode; unsigned result = 0; const char *trap; - opcode = cpu_readop16(pc); + opcode = *((UINT16 *) oprom); if ((opcode & 0xF000) == 0xA000) { trap = lookup_trap(opcode); diff --git a/mess/machine/mc6854.c b/mess/machine/mc6854.c new file mode 100644 index 000000000..484bee17b --- /dev/null +++ b/mess/machine/mc6854.c @@ -0,0 +1,838 @@ +/********************************************************************** + + Copyright (C) Antoine Mine' 2006 + + Motorola 6854 emulation. + + The MC6854 chip is an Advanced Data-Link Controller (ADLC). + It provides a high-level network interface that can tramsimit frames with + arbitrary data and address length, and is compatibl e with the following + standards: + - ADCCP (Advanced Data Communication Control Procedure) + - HDLC (High-Level Data-Link Control) + - SDLC (Synchronous Data-Link Control) + It is designed to be interfaced with a M6800-family CPU. + + It is used in the "Nano-network" extension of the Thomson computers to + link up to 32 computers at 500 Kbps. + Many networks involving one PC server and several MO5 or TO7/70 computers + were build in French schools in the 1980's to teach computer science. + + TODO: + - CRC + - DMA mode + - loop mode + - status prioritization + - NRZI vs. NRZ coding + - FD output + +**********************************************************************/ + + +#include "driver.h" +#include "timer.h" +#include "state.h" +#include "mc6854.h" + +/******************* parameters ******************/ + +#define VERBOSE 0 + + +#define MAX_FRAME_LENGTH 65536 +/* arbitrary value, you may need to enlarge it if you get truncated frames */ + +#define FIFO_SIZE 3 +/* hardcoded size of the 6854 FIFO (this is a hardware limit) */ + +#define FLAG 0x7e +/* flag value, as defined by HDLC protocol: 01111110 */ + +#define BIT_LENGTH TIME_IN_HZ( 500000 ) + + +/******************* internal chip data structure ******************/ + +static struct { + + /* interface */ + const mc6854_interface* iface; + + /* registers */ + UINT8 cr1, cr2, cr3, cr4; /* control registers */ + UINT8 sr1, sr2; /* status registers */ + + UINT8 cts, dcd; + + /* transmit state */ + UINT8 tstate; + UINT16 tfifo[FIFO_SIZE]; /* X x 8-bit FIFO + full & last marker bits */ + UINT8 tones; /* counter for zero-insertion */ + mame_timer *ttimer; /* when to ask for more data */ + + /* receive state */ + UINT8 rstate; + UINT32 rreg; /* shift register */ + UINT8 rones; /* count '1 bits */ + UINT8 rsize; /* bits in the shift register */ + UINT16 rfifo[FIFO_SIZE]; /* X x 8-bit FIFO + full & addr marker bits */ + + /* frame-based interface*/ + UINT8 frame[MAX_FRAME_LENGTH]; + UINT32 flen, fpos; + +} * mc6854; + +/* meaning of tstate / rtate: + 0 = idle / waiting for frame flag + 1 = flag sync + 2 = 8-bit address field(s) + 3-4 = 8-bit control field(s) + 5 = 8-bit logical control field(s) + 6 = variable-length data field(s) +*/ + +/******************* utilitiy function and macros ********************/ + +#if VERBOSE +#define LOG(x) logerror x +#else +#define LOG(x) +#endif + +#define AC ( mc6854->cr1 & 1 ) +#define FCTDRA ( mc6854->cr2 & 8 ) +/* extra register select bits */ + +#define RRESET ( mc6854->cr1 & 0x40 ) +#define TRESET ( mc6854->cr1 & 0x80 ) +/* transmit / reset condition */ + +#define RIE ( mc6854->cr1 & 2 ) +#define TIE ( mc6854->cr1 & 4 ) +/* interrupt enable */ + +#define DISCONTINUE ( mc6854->cr1 & 0x20 ) +/* discontinue received frame */ + +#define PSE ( mc6854->cr2 & 1 ) +/* prioritize status bits (TODO) */ + +#define TWOBYTES ( mc6854->cr2 & 2 ) +/* two-bytes mode */ + +#define FMIDLE ( mc6854->cr2 & 4 ) +/* flag time fill (vs. mark idle) */ + +#define TLAST ( mc6854->cr2 & 0x10 ) +/* transmit last byte of frame */ + +#define RTS ( mc6854->cr2 & 0x80 ) +/* request-to-send */ + +#define LCF ( mc6854->cr3 & 1 ) +/* logical control field select */ + +#define CEX ( mc6854->cr3 & 2 ) +/* control field is 16 bits instead of 8 */ + +#define AEX ( mc6854->cr3 & 4 ) +/* extended address mode (vs normal 8-bit address mode) */ + +#define IDL0 ( mc6854->cr3 & 8 ) +/* idle condition begins with a '0' instead of a '1" */ + +#define FDSE ( mc6854->cr3 & 0x10 ) +/* enable the flag detect status in SR1 */ + +#define LOOP ( mc6854->cr3 & 0x20 ) +/* loop mode */ + +#define TST ( mc6854->cr3 & 0x40 ) +/* test mode (or go active on poll) */ + +#define DTR ( mc6854->cr3 & 0x80 ) +/* data-transmit-ready (or loop on-line control) */ + +#define TWOINTER ( mc6854->cr4 & 1 ) +/* both an openning and a closing inter-frame are sent */ + +static const int word_length[4] = { 5, 6, 7, 8 }; +#define TWL word_length[ ( mc6854->cr4 >> 1 ) & 3 ] +#define RWL word_length[ ( mc6854->cr4 >> 3 ) & 3 ] +/* transmit / receive word length */ + +#define ABT ( mc6854->cr4 & 0x20 ) +/* aborts */ + +#define ABTEX ( mc6854->cr4 & 0x40 ) +/* abort generates 16 '1' bits instead of 8 */ + +#define NRZ ( mc6854->cr4 & 0x80 ) +/* zero complement / non-zero complement data format */ + + +/* status register 1 */ +#define RDA 0x01 /* receiver data available */ +#define S2RQ 0x02 /* status register #2 read request */ +#define FD 0x04 /* flag detect */ +#define CTS 0x10 /* clear-to-send */ +#define TU 0x20 /* transmitter underrun */ +#define TDRA 0x40 /* transmitter data register available */ +#define IRQ 0x80 /* interrupt request */ + +/* status register 2 */ +#define AP 0x01 /* address present */ +#define FV 0x02 /* frame valid */ +#define RIDLE 0x04 /* receiver idle */ +#define RABT 0x08 /* receiver abort */ +#define ERR 0x10 /* invalid frame error */ +#define DCD 0x20 /* data carrier detect (ignorer) */ +#define OVRN 0x40 /* receiver overrun */ +#define RDA2 0x80 /* copy of RDA */ + + + +/*********************** transmit ***********************/ + +/* MC6854 fills bit queue */ +static void mc6854_send_bits( UINT32 data, int len, int zi ) +{ + double expire; + int i; + if ( zi ) { + /* zero-insertion mode */ + UINT32 d = 0; + int l = 0; + for ( i = 0; i < len; i++, data >>= 1, l++ ) + if ( data & 1 ) { + d |= 1 << l; + mc6854->tones++; + if ( mc6854->tones == 5 ) { + /* insert a '0' after 5 consecutive '1" */ + mc6854->tones = 0; + l++; + } + } + else mc6854->tones = 0; + data = d; + len = l; + } + else mc6854->tones = 0; + + /* send bits */ + if ( mc6854->iface->out_tx ) { + for ( i = 0; i < len; i++, data >>= 1 ) + mc6854->iface->out_tx( data & 1 ); + } + + /* schedule when to ask the MC6854 for more bits */ + expire = timer_timeleft( mc6854->ttimer ); + if ( expire >= TIME_IN_SEC( 1 ) ) expire = 0; + timer_reset( mc6854->ttimer, expire + len * BIT_LENGTH ); +} + +/* CPU push -> tfifo[0] -> ... -> tfifo[FIFO_SIZE-1] -> pop */ +static void mc6854_tfifo_push( UINT8 data ) +{ + int i; + + if ( TRESET ) return; + + /* push towards the rightmost free entry */ + for ( i = FIFO_SIZE - 1; i >= 0; i-- ) + if ( ! ( mc6854->tfifo[ i ] & 0x100 ) ) break; + if ( i >= 0 ) mc6854->tfifo[ i ] = data | 0x100; + else logerror( "%f mc6854_tfifo_push: FIFO overrun\n", timer_get_time() ); + + /* start frame, if needed */ + if ( ! mc6854->tstate ) { + LOG(( "%f mc6854_tfifo_push: start frame\n", timer_get_time() )); + mc6854->tstate = 2; + mc6854_send_bits( FLAG, 8, 0 ); + } +} + +/* CPU asks for normal frame termination */ +static void mc6854_tfifo_terminate( void ) +{ + /* mark most recently pushed byte as the last one of the frame */ + int i; + for ( i = 0; i < FIFO_SIZE; i++ ) + if ( mc6854->tfifo[ i ] & 0x100 ) { + mc6854->tfifo[ i ] |= 0x200; + break; + } +} + +/* call-back to refill the bit-stream from the FIFO */ +static void mc6854_tfifo_cb( int dummy ) +{ + int i, data = mc6854->tfifo[ FIFO_SIZE - 1 ]; + + if ( ! mc6854->tstate ) return; + + /* shift FIFO to the right */ + for ( i = FIFO_SIZE - 1; i > 0; i-- ) + mc6854->tfifo[ i ] = mc6854->tfifo[ i - 1 ]; + mc6854->tfifo[ 0 ] = 0; + + if ( data & 0x100 ) { + /* got data */ + + int blen = 8; + + switch ( mc6854->tstate ) { + + case 2: /* 8-bit address field */ + if ( ( data & 1 ) || ( ! AEX ) ) mc6854->tstate = 3; + LOG(( "%f mc6854_tfifo_cb: address field $%02X\n", + timer_get_time(), data & 0xff )); + break; + + case 3: /* 8-bit control field */ + if ( CEX ) mc6854->tstate = 4; + else if ( LCF ) mc6854->tstate = 5; else mc6854->tstate = 6; + LOG(( "%f mc6854_tfifo_cb: control field $%02X\n", + timer_get_time(), data & 0xff )); + break; + + case 4: /* 8-bit extended control field (optional) */ + if ( LCF ) mc6854->tstate = 5; else mc6854->tstate = 6; + LOG(( "%f mc6854_tfifo_cb: control field $%02X\n", + timer_get_time(), data & 0xff )); + break; + + case 5: /* 8-bit logical control (optional) */ + if ( ! ( data & 0x80 ) ) mc6854->tstate = 6; + LOG(( "%f mc6854_tfifo_cb: logical control field $%02X\n", + timer_get_time(), data & 0xff )); + break; + + case 6: /* variable-length data */ + blen = TWL; + LOG(( "%f mc6854_tfifo_cb: data field $%02X, %i bits\n", + timer_get_time(), data & 0xff, blen )); + break; + } + + if ( mc6854->flen < MAX_FRAME_LENGTH ) + mc6854->frame[ mc6854->flen++ ] = data; + else logerror( "mc6854_tfifo_cb: truncated frame, max=%i\n", + MAX_FRAME_LENGTH ); + + mc6854_send_bits( data, blen, 1 ); + } + else { + /* data underrun => abort */ + logerror( "%f mc6854_tfifo_cb: FIFO underrun\n", timer_get_time() ); + mc6854->sr1 |= TU; + mc6854->tstate = 0; + mc6854_send_bits( 0xffff, ABTEX ? 16 : 8, 0 ); + mc6854->flen = 0; + } + + /* close frame, if needed */ + if ( data & 0x200 ) { + int len = mc6854->flen; + + LOG(( "%f mc6854_tfifo_cb: end frame\n", timer_get_time() )); + mc6854_send_bits( 0xdeadbeef, 16, 1 ); /* send check-sum: TODO */ + mc6854_send_bits( FLAG, 8, 0 ); /* send closing flag */ + + if ( mc6854->tfifo[ FIFO_SIZE - 1 ] & 0x100 ) { + /* re-open frame asap */ + LOG(( "%f mc6854_tfifo_cb: start frame\n", timer_get_time() )); + if ( TWOINTER ) mc6854_send_bits( FLAG, 8, 0 ); + } + else mc6854->tstate = 0; + + mc6854->flen = 0; + if ( mc6854->iface->out_frame ) + mc6854->iface->out_frame( mc6854->frame, len ); + } +} + +static void mc6854_tfifo_clear( void ) +{ + memset( mc6854->tfifo, 0, sizeof( mc6854->tfifo ) ); + mc6854->tstate = 0; + mc6854->flen = 0; + timer_reset( mc6854->ttimer, TIME_NEVER ); +} + + + +/*********************** receive ***********************/ + +/* MC6854 pushes a field in the FIFO */ +static void mc6854_rfifo_push( UINT8 d ) +{ + int i, blen = 8; + unsigned data = d; + + switch ( mc6854->rstate ) { + + case 0: + case 1: + case 2: /* 8-bit address field */ + if ( ( data & 1 ) || ( ! AEX ) ) mc6854->rstate = 3; + else mc6854->rstate = 2; + LOG(( "%f mc6854_rfifo_push: address field $%02X\n", + timer_get_time(), data )); + data |= 0x400; /* address marker */ + break; + + case 3: /* 8-bit control field */ + if ( CEX ) mc6854->rstate = 4; + else if ( LCF ) mc6854->rstate = 5; else mc6854->rstate = 6; + LOG(( "%f mc6854_rfifo_push: control field $%02X\n", + timer_get_time(), data )); + break; + + case 4: /* 8-bit extended control field (optional) */ + if ( LCF ) mc6854->rstate = 5; else mc6854->rstate = 6; + LOG(( "%f mc6854_rfifo_push: control field $%02X\n", + timer_get_time(), data )); + break; + + case 5: /* 8-bit logical control (optional) */ + if ( ! ( data & 0x80 ) ) mc6854->rstate = 6; + LOG(( "%f mc6854_rfifo_push: logical control field $%02X\n", + timer_get_time(), data )); + break; + + case 6: /* variable-length data */ + blen = RWL; + data >>= 8 - blen; + LOG(( "%f mc6854_rfifo_push: data field $%02X, %i bits\n", + timer_get_time(), data, blen )); + break; + } + + /* no further FIFO fill until FV is cleared! */ + if ( mc6854->sr2 & FV ) { + LOG(( "%f mc6854_rfifo_push: field not pushed\n", timer_get_time() )); + return; + } + + data |= 0x100; /* entry full marker */ + + /* push towards the rightmost free entry */ + for ( i = FIFO_SIZE - 1; i >= 0; i-- ) + if ( ! ( mc6854->rfifo[ i ] & 0x100 ) ) break; + if ( i >= 0 ) mc6854->rfifo[ i ] = data | 0x100; + else { + /* FIFO full */ + mc6854->sr2 |= OVRN; + mc6854->rfifo[ 0 ] = data; + logerror( "%f mc6854_rfifo_push: FIFO overrun\n", timer_get_time() ); + } + + mc6854->rsize -= blen; +} + +static void mc6854_rfifo_terminate( void ) +{ + /* mark most recently pushed byte as the last one of the frame */ + int i; + for ( i = 0; i < FIFO_SIZE; i++ ) + if ( mc6854->rfifo[ i ] & 0x100 ) { + mc6854->tfifo[ i ] |= 0x200; + break; + } + + mc6854->flen = 0; + mc6854->rstate = 1; +} + +/* CPU pops the FIFO */ +static UINT8 mc6854_rfifo_pop( void ) +{ + int i, data = mc6854->rfifo[ FIFO_SIZE - 1 ]; + + /* shift FIFO to the right */ + for ( i = FIFO_SIZE - 1; i > 0; i -- ) + mc6854->rfifo[ i ] = mc6854->rfifo[ i - 1 ]; + mc6854->rfifo[ 0 ] = 0; + + if ( mc6854->rfifo[ FIFO_SIZE - 1 ] & 0x200 ) { + /* last byte in frame */ + mc6854->sr2 |= FV; /* TODO: check CRC & set ERR instead of FV if error*/ + } + + /* auto-refill in frame mode */ + if ( mc6854->flen > 0 ) { + mc6854_rfifo_push( mc6854->frame[ mc6854->fpos++ ] ); + if ( mc6854->fpos == mc6854->flen ) mc6854_rfifo_terminate(); + } + + return data; +} + + +/* MC6854 makes fileds from bits */ +void mc6854_set_rx( int bit ) +{ + int fieldlen = ( mc6854->rstate < 6 ) ? 8 : RWL; + + if ( RRESET || DCD ) return; + + if ( bit ) { + mc6854->rones++; + mc6854->rreg = (mc6854->rreg >> 1) | 0x80000000; + if ( mc6854->rones >= 8 ) { + /* abort */ + mc6854->rstate = 0; + mc6854->rsize = 0; + if ( mc6854->rstate > 1 ) { + /* only in-frame abort are */ + mc6854->sr2 |= RABT; + LOG(( "%f mc6854_receive_bit: abort\n", timer_get_time() )); + } + } + else { + mc6854->rsize++; + if ( mc6854->rstate && mc6854->rsize >= fieldlen + 24 ) + mc6854_rfifo_push( mc6854->rreg ); + } + } + else if ( mc6854->rones == 5 ) { + /* discards '0' inserted after 5 '1' */ + mc6854->rones = 0; + return; + } + else if ( mc6854->rones == 6 ) { + /* flag */ + if ( FDSE ) mc6854->sr1 |= FD; + if ( mc6854->rstate > 1 ) { + /* end of frame */ + mc6854->rreg >>= 1; + mc6854->rsize++; + if ( mc6854->rsize >= fieldlen + 24 ) /* last field */ + mc6854_rfifo_push( mc6854->rreg ); + mc6854_rfifo_terminate(); + LOG(( "%f mc6854_receive_bit: end of frame\n", timer_get_time() )); + } + mc6854->rones = 0; + mc6854->rstate = 1; + mc6854->rsize = 0; + } else { + mc6854->rones = 0; + mc6854->rreg >>= 1; + mc6854->rsize++; + if ( mc6854->rstate && mc6854->rsize >= fieldlen + 24 ) + mc6854_rfifo_push( mc6854->rreg ); + } +} + +static void mc6854_rfifo_clear( void ) +{ + memset( mc6854->rfifo, 0, sizeof( mc6854->rfifo ) ); + mc6854->rstate = 0; + mc6854->rreg = 0; + mc6854->rsize = 0; + mc6854->rones = 0; + mc6854->flen = 0; +} + + +int mc6854_send_frame( UINT8* data, int len ) +{ + if ( mc6854->rstate > 1 || mc6854->tstate > 1 || RTS )return -1; /* busy */ + if ( len > MAX_FRAME_LENGTH ) { + logerror( "mc6854_send_frame: truncated frame, size=%i, max=%i\n", + len, MAX_FRAME_LENGTH ); + len = MAX_FRAME_LENGTH; + } + else if ( len < 2 ) { + logerror( "mc6854_send_frame: frame too short, size=%i, min=2\n", len ); + len = 2; + } + memcpy( mc6854->frame, data, len ); + if ( FDSE ) mc6854->sr1 |= FD; + mc6854->flen = len; + mc6854->fpos = 0; + mc6854_rfifo_push( mc6854->frame[ mc6854->fpos++ ] ); + mc6854_rfifo_push( mc6854->frame[ mc6854->fpos++ ] ); + if ( mc6854->fpos == mc6854->flen ) mc6854_rfifo_terminate(); + return 0; +} + + +/************************** CPU interface ****************************/ + +void mc6854_set_cts( int data ) +{ + if ( ! mc6854->cts && data ) mc6854->sr1 |= CTS; + mc6854->cts = data; + + if ( mc6854->cts ) mc6854->sr1 |= CTS; + else mc6854->sr1 &= ~CTS; +} + +void mc6854_set_dcd( int data ) +{ + if ( ! mc6854->dcd && data ) { + mc6854->sr2 |= DCD; + /* partial reset */ + mc6854->rstate = 0; + mc6854->rreg = 0; + mc6854->rsize = 0; + mc6854->rones = 0; + } + mc6854->dcd = data; +} + +static void mc6854_update_sr2( void ) +{ + /* update RDA */ + mc6854->sr2 |= RDA2; + if ( ! (mc6854->rfifo[ FIFO_SIZE - 1 ] & 0x100) ) mc6854->sr2 &= ~RDA2; + else if ( TWOBYTES && ! (mc6854->tfifo[ FIFO_SIZE - 2 ] & 0x100) ) + mc6854->sr2 &= ~RDA2; + + /* update AP */ + if ( mc6854->rfifo[ FIFO_SIZE - 1 ] & 0x400 ) mc6854->sr2 |= AP; + else mc6854->sr2 &= ~AP; +} + +static void mc6854_update_sr1( void ) +{ + mc6854_update_sr2(); + + /* update S2RQ */ + if ( mc6854->sr2 & 0x7f ) mc6854->sr1 |= S2RQ; else mc6854->sr1 &= ~S2RQ; + + /* update TRDA (always prioritized by CTS) */ + if ( TRESET || ( mc6854->sr1 & CTS ) ) mc6854->sr1 &= ~TDRA; + else { + mc6854->sr1 |= TDRA; + if ( mc6854->tfifo[ 0 ] & 0x100 ) mc6854->sr1 &= ~TDRA; + else if ( TWOBYTES && (mc6854->tfifo[ 1 ] & 0x100) ) mc6854->sr1 &= ~TDRA; + } + + /* update RDA */ + if ( mc6854->sr2 & RDA2 ) mc6854->sr1 |= RDA; else mc6854->sr1 &= ~RDA; + + /* update IRQ */ + mc6854->sr1 &= ~IRQ; + if ( RIE && (mc6854->sr1 & (TU | TDRA) ) ) mc6854->sr1 |= IRQ; + if ( TIE ) { + if ( mc6854->sr1 & (S2RQ | RDA | CTS) ) mc6854->sr1 |= IRQ; + if ( mc6854->sr2 & (ERR | FV | DCD | OVRN | RABT | RIDLE | AP) ) + mc6854->sr1 |= IRQ; + } +} + +READ8_HANDLER ( mc6854_r ) +{ + switch ( offset ) { + + case 0: /* status register 1 */ + mc6854_update_sr1(); + LOG(( "%f $%04x mc6854_r: get SR1=$%02X (rda=%i,s2rq=%i,fd=%i,cts=%i,tu=%i,tdra=%i,irq=%i)\n", + timer_get_time(), activecpu_get_previouspc(), mc6854->sr1, + ( mc6854->sr1 & RDA) ? 1 : 0, ( mc6854->sr1 & S2RQ) ? 1 : 0, + ( mc6854->sr1 & FD ) ? 1 : 0, ( mc6854->sr1 & CTS ) ? 1 : 0, + ( mc6854->sr1 & TU ) ? 1 : 0, ( mc6854->sr1 & TDRA) ? 1 : 0, + ( mc6854->sr1 & IRQ) ? 1 : 0 )); + return mc6854->sr1; + + case 1: /* status register 2 */ + mc6854_update_sr2(); + LOG(( "%f $%04x mc6854_r: get SR2=$%02X (ap=%i,fv=%i,ridle=%i,rabt=%i,err=%i,dcd=%i,ovrn=%i,rda2=%i)\n", + timer_get_time(), activecpu_get_previouspc(), mc6854->sr2, + ( mc6854->sr2 & AP ) ? 1 : 0, ( mc6854->sr2 & FV ) ? 1 : 0, + ( mc6854->sr2 & RIDLE) ? 1 : 0, ( mc6854->sr2 & RABT) ? 1 : 0, + ( mc6854->sr2 & ERR ) ? 1 : 0, ( mc6854->sr2 & DCD ) ? 1 : 0, + ( mc6854->sr2 & OVRN ) ? 1 : 0, ( mc6854->sr2 & RDA2) ? 1 : 0 )); + return mc6854->sr2; + + case 2: /* receiver data register */ + case 3: + { + UINT8 data = mc6854_rfifo_pop(); + LOG(( "%f $%04x mc6854_r: get data $%02X\n", + timer_get_time(), activecpu_get_previouspc(), data )); + return data; + } + + default: + logerror( "$%04x mc6854 invalid read offset %i\n", + activecpu_get_previouspc(), offset ); + } + return 0; +} + +WRITE8_HANDLER ( mc6854_w ) +{ + switch ( offset ) { + + case 0: /* control register 1 */ + mc6854->cr1 = data; + LOG(( "%f $%04x mc6854_w: set CR1=$%02X (ac=%i,irq=%c%c,%sreset=%c%c)\n", + timer_get_time(), activecpu_get_previouspc(), mc6854->cr1, + AC ? 1 : 0, + RIE ? 'r' : '-', TIE ? 't' : '-', + DISCONTINUE ? "discontinue," : "", + RRESET ? 'r' : '-', TRESET ? 't' : '-' + )); + if ( mc6854->cr1 & 0xc ) + logerror( "$%04x mc6854 DMA not handled (CR1=$%02X)\n", + activecpu_get_previouspc(), mc6854->cr1 ); + if ( DISCONTINUE ) { + /* abort receive FIFO but keeps shift register & synchro */ + mc6854->rstate = 0; + memset( mc6854->rfifo, 0, sizeof( mc6854->rfifo ) ); + } + if ( RRESET ) { + /* abort FIFO & synchro */ + mc6854_rfifo_clear(); + mc6854->sr1 &= ~FD; + mc6854->sr2 &= ~(AP | FV | RIDLE | RABT | ERR | OVRN | DCD); + if ( mc6854->dcd ) mc6854->sr2 |= DCD; + } + if ( TRESET ) { + mc6854_tfifo_clear(); + mc6854->sr1 &= ~(TU | TDRA | CTS); + if ( mc6854->cts ) mc6854->sr1 |= CTS; + } + break; + + case 1: + if ( AC ) { + /* control register 3 */ + mc6854->cr3 = data; + LOG(( "%f $%04x mc6854_w: set CR3=$%02X (lcf=%i,aex=%i,idl=%i,fdse=%i,loop=%i,tst=%i,dtr=%i)\n", + timer_get_time(), activecpu_get_previouspc(), mc6854->cr3, + LCF ? (CEX ? 16 : 8) : 0, AEX ? 1 : 0, + IDL0 ? 0 : 1, FDSE ? 1 : 0, LOOP ? 1 : 0, + TST ? 1 : 0, DTR ? 1 : 0 + )); + if ( LOOP ) + logerror( "$%04x mc6854 loop mode not handled (CR3=$%02X)\n", + activecpu_get_previouspc(), mc6854->cr3 ); + if ( TST ) + logerror( "$%04x mc6854 test mode not handled (CR3=$%02X)\n", + activecpu_get_previouspc(), mc6854->cr3 ); + + if ( mc6854->iface->out_dtr ) + mc6854->iface->out_dtr( DTR ? 1 : 0 ); + + } + else { + /* control register 2 */ + mc6854->cr2 = data; + LOG(( "%f $%04x mc6854_w: set CR2=$%02X (pse=%i,bytes=%i,fmidle=%i,%s,tlast=%i,clr=%c%c,rts=%i)\n", + timer_get_time(), activecpu_get_previouspc(), mc6854->cr2, + PSE ? 1 : 0, TWOBYTES ? 2 : 1, FMIDLE ? 1 : 0, + FCTDRA ? "fc" : "tdra", TLAST ? 1 : 0, + data & 0x20 ? 'r' : '-', data & 0x40 ? 't' : '-', + RTS ? 1 : 0 )); + if ( PSE ) + logerror( "$%04x mc6854 status prioritization not handled (CR2=$%02X)\n", + activecpu_get_previouspc(), mc6854->cr2 ); + if ( TLAST ) mc6854_tfifo_terminate(); + if ( data & 0x20 ) { + /* clear receiver status */ + mc6854->sr1 &= ~FD; + mc6854->sr2 &= ~(AP | FV | RIDLE | RABT | ERR | OVRN | DCD); + if ( mc6854->dcd ) mc6854->sr2 |= DCD; + } + if ( data & 0x40 ) { + /* clear transmitter status */ + mc6854->sr1 &= ~(TU | TDRA | CTS); + if ( mc6854->cts ) mc6854->sr1 |= CTS; + } + + if ( mc6854->iface->out_rts ) mc6854->iface->out_rts( RTS ? 1 : 0 ); + } + break; + + case 2: /* transmitter data: continue data */ + LOG(( "%f $%04x mc6854_w: push data=$%02X\n", + timer_get_time(), activecpu_get_previouspc(), data )); + mc6854_tfifo_push( data ); + break; + + case 3: + if ( AC ) { + /* control register 4 */ + mc6854->cr4 = data; + LOG(( "%f $%04x mc6854_w: set CR4=$%02X (interframe=%i,tlen=%i,rlen=%i,%s%s)\n", + timer_get_time(), activecpu_get_previouspc(), mc6854->cr4, + TWOINTER ? 2 : 1, + TWL, RWL, + ABT ? ( ABTEX ? "abort-ext," : "abort,") : "", + NRZ ? "nrz" : "nrzi" )); + if ( ABT ) { + mc6854->tstate = 0; + mc6854_send_bits( 0xffff, ABTEX ? 16 : 8, 0 ); + mc6854->flen = 0; + } + } + else { + /* transmitter data: last data */ + LOG(( "%f $%04x mc6854_w: push last-data=$%02X\n", + timer_get_time(), activecpu_get_previouspc(), data )); + mc6854_tfifo_push( data ); + mc6854_tfifo_terminate(); + } + break; + + default: + logerror( "$%04x mc6854 invalid write offset %i (data=$%02X)\n", + activecpu_get_previouspc(), offset, data ); + } +} + + +/************************ reset *****************************/ + +void mc6854_reset ( void ) +{ + LOG (( "mc6854 reset\n" )); + mc6854->cr1 = 0xc0; /* reset condition */ + mc6854->cr2 = 0; + mc6854->cr3 = 0; + mc6854->cr4 = 0; + mc6854->sr1 = 0; + mc6854->sr2 = 0; + mc6854->cts = 0; + mc6854->dcd = 0; + mc6854_tfifo_clear(); + mc6854_rfifo_clear(); +} + + +/************************** configuration ****************************/ + +void mc6854_config ( const mc6854_interface* iface ) +{ + assert( iface ); + mc6854 = auto_malloc( sizeof( * mc6854 ) ); + assert( mc6854 ); + mc6854->iface = iface; + mc6854->ttimer = mame_timer_alloc( mc6854_tfifo_cb ); + state_save_register_item( "mc6854", 0, mc6854->cr1 ); + state_save_register_item( "mc6854", 0, mc6854->cr2 ); + state_save_register_item( "mc6854", 0, mc6854->cr3 ); + state_save_register_item( "mc6854", 0, mc6854->cr4 ); + state_save_register_item( "mc6854", 0, mc6854->sr1 ); + state_save_register_item( "mc6854", 0, mc6854->sr2 ); + state_save_register_item( "mc6854", 0, mc6854->cts ); + state_save_register_item( "mc6854", 0, mc6854->dcd ); + state_save_register_item( "mc6854", 0, mc6854->tstate ); + state_save_register_item_array( "mc6854", 0, mc6854->tfifo ); + state_save_register_item( "mc6854", 0, mc6854->tones ); + state_save_register_item( "mc6854", 0, mc6854->rstate ); + state_save_register_item( "mc6854", 0, mc6854->rreg ); + state_save_register_item( "mc6854", 0, mc6854->rones ); + state_save_register_item( "mc6854", 0, mc6854->rsize ); + state_save_register_item_array( "mc6854", 0, mc6854->rfifo ); + state_save_register_item_array( "mc6854", 0, mc6854->frame ); + state_save_register_item( "mc6854", 0, mc6854->flen ); + state_save_register_item( "mc6854", 0, mc6854->fpos ); + mc6854_reset(); +} diff --git a/mess/machine/mc6854.h b/mess/machine/mc6854.h new file mode 100644 index 000000000..daf86caf8 --- /dev/null +++ b/mess/machine/mc6854.h @@ -0,0 +1,71 @@ +/********************************************************************** + + Copyright (C) Antoine Mine' 2006 + + Motorola 6854 emulation (network interface). + +**********************************************************************/ + +#ifndef MC6854 +#define MC6854 + +/* we provide two interfaces: + - a bit-based interface: out_tx, set_rx + - a frame-based interface: out_frame, send_frame + + The bit-based interface is low-level and slow. + Use it to simulate the actual bits sent into the wires, e.g., to connect + the emulator to another bit-based emulated network device, or an actual + device. + + The frame-based interface is higher-level and faster. + It passes bytes directly from one end to the other without bothering with + the actual bit-encoding, synchronization, and CRC. + Once completed, a frame is sent through out_frame. Aborted frames are not + transmitted at all. No start flag, stop flag, or crc bits are trasmitted. + send_frame makes a frame available to the CPU through the 6854 (it may + fail and return -1 if the 6854 is not ready to accept the frame; even + if the frame is accepted and 0 is returned, the CPU may abort it). Ony + full frames are accepted. +*/ + + +/* ---------- configuration ------------ */ + +typedef struct _mc6854_interface mc6854_interface; +struct _mc6854_interface +{ + /* low-level, bit-based interface */ + void ( * out_tx ) ( int state ); /* transmit bit */ + + /* high-level, frame-based interface */ + void ( * out_frame ) ( UINT8* data, int length ); + + /* control ilnes */ + void ( * out_rts ) ( int state ); /* 1 = transmitting, 0 = idle */ + void ( * out_dtr ) ( int state ); /* 1 = data transmit ready, 0 = busy */ +}; + + +/* ---------- functions ------------ */ + +extern void mc6854_config ( const mc6854_interface* func ); + +/* reset by external signal */ +extern void mc6854_reset ( void ); + +/* interface to CPU via address/data bus*/ +extern READ8_HANDLER ( mc6854_r ); +extern WRITE8_HANDLER ( mc6854_w ); + +/* low-level, bit-based interface */ +extern void mc6854_set_rx ( int state ); + +/* high-level, frame-based interface */ +extern int mc6854_send_frame( UINT8* data, int length ); /* ret -1 if busy */ + +/* control lines */ +extern void mc6854_set_cts ( int state ); /* 1 = clear-to-send, 0 = busy */ +extern void mc6854_set_dcd ( int state ); /* 1 = carrier, 0 = no carrier */ + +#endif diff --git a/mess/machine/msx.c b/mess/machine/msx.c index cfaccb9b1..b22aa91d2 100644 --- a/mess/machine/msx.c +++ b/mess/machine/msx.c @@ -320,7 +320,7 @@ static ppi8255_interface msx_ppi8255_interface = static struct tc8521_interface tc = { NULL }; -DRIVER_INIT( msx ) +static void msx_init(void) { int i, n; @@ -376,9 +376,14 @@ DRIVER_INIT( msx ) } } +DRIVER_INIT( msx ) +{ + msx_init(); +} + DRIVER_INIT( msx2 ) { - init_msx (); + msx_init(); tc8521_init (&tc); } diff --git a/mess/machine/mz700.c b/mess/machine/mz700.c index 6d4116f25..f788978eb 100644 --- a/mess/machine/mz700.c +++ b/mess/machine/mz700.c @@ -760,7 +760,7 @@ WRITE8_HANDLER( videoram2_w ) { videoram_w(offset + 0x2000, data); } WRITE8_HANDLER( videoram3_w ) { videoram_w(offset + 0x3000, data); } WRITE8_HANDLER( pcgram_w ) { videoram_w(offset + 0x4000, data); } -void init_mz800(void) +DRIVER_INIT( mz800 ) { UINT8 *mem = memory_region(REGION_CPU1); diff --git a/mess/machine/nes.c b/mess/machine/nes.c index 53b712536..de7da73f6 100644 --- a/mess/machine/nes.c +++ b/mess/machine/nes.c @@ -30,7 +30,7 @@ static UINT32 in_1_shift; /* local prototypes */ static void init_nes_core(void); -static void nes_machine_stop(void); +static void nes_machine_stop(running_machine *machine); static mess_image *cartslot_image(void) { @@ -135,7 +135,7 @@ int nes_ppu_vidaccess( int num, int address, int data ) return data; } -static void nes_machine_reset(void) +static void nes_machine_reset(running_machine *machine) { /* Some carts have extra RAM and require it on at startup, e.g. Metroid */ nes.mid_ram_enable = 1; @@ -151,8 +151,8 @@ static void nes_machine_reset(void) MACHINE_START( nes ) { init_nes_core(); - add_reset_callback(nes_machine_reset); - add_exit_callback(nes_machine_stop); + add_reset_callback(machine, nes_machine_reset); + add_exit_callback(machine, nes_machine_stop); if (!image_exists(image_from_devtype_and_index(IO_CARTSLOT, 0))) { @@ -165,7 +165,7 @@ MACHINE_START( nes ) return 0; } -static void nes_machine_stop(void) +static void nes_machine_stop(running_machine *machine) { /* Write out the battery file if necessary */ if (nes.battery) @@ -177,12 +177,18 @@ static void nes_machine_stop(void) static int zapper_hit_pixel(const UINT32 *input) { UINT16 pix = 0; + rgb_t col; UINT8 r, g, b; extern mame_bitmap *nes_zapper_hack; if (nes_zapper_hack) pix = read_pixel(nes_zapper_hack, input[1], input[2]); - palette_get_color(pix, &r, &g, &b); + + col = palette_get_color(Machine, pix); + r = (UINT8) (col >> 16); + g = (UINT8) (col >> 8); + b = (UINT8) (col >> 0); + return (((UINT16) r) + ((UINT16) g) + ((UINT16) b)) >= 240*3; } @@ -360,6 +366,7 @@ DEVICE_LOAD(nes_cart) int i; /* Verify the file is in iNES format */ + memset(magic, '\0', sizeof(magic)); mame_fread (file, magic, 4); if ((magic[0] != 'N') || @@ -434,14 +441,13 @@ DEVICE_LOAD(nes_cart) if (nes.four_screen_vram) logerror("-- 4-screen VRAM\n"); /* Free the regions that were allocated by the ROM loader */ - free_memory_region (REGION_CPU1); - free_memory_region (REGION_GFX1); + free_memory_region (Machine, REGION_CPU1); + free_memory_region (Machine, REGION_GFX1); /* Allocate them again with the proper size */ - if (new_memory_region(REGION_CPU1, 0x10000 + (nes.prg_chunks+1) * 0x4000,0)) - goto outofmemory; - if (nes.chr_chunks && new_memory_region(REGION_GFX1, nes.chr_chunks * 0x2000,0)) - goto outofmemory; + new_memory_region(Machine, REGION_CPU1, 0x10000 + (nes.prg_chunks+1) * 0x4000,0); + if (nes.chr_chunks) + new_memory_region(Machine, REGION_GFX1, nes.chr_chunks * 0x2000,0); nes.rom = memory_region(REGION_CPU1); nes.vrom = memory_region(REGION_GFX1); @@ -507,10 +513,6 @@ DEVICE_LOAD(nes_cart) return INIT_PASS; -outofmemory: - logerror("Memory allocation failed reading roms!\n"); - return INIT_FAIL; - bad: logerror("BAD section hit during LOAD ROM.\n"); return INIT_FAIL; diff --git a/mess/machine/pce.c b/mess/machine/pce.c index 77f52d421..01403653f 100644 --- a/mess/machine/pce.c +++ b/mess/machine/pce.c @@ -30,8 +30,7 @@ DEVICE_LOAD(pce_cart) logerror("*** DEVICE_LOAD(pce_cart) : %s\n", image_filename(image)); /* open file to get size */ - if( new_memory_region(REGION_CPU1,PCE_ROM_MAXSIZE,0) ) - return 1; + new_memory_region(Machine, REGION_CPU1,PCE_ROM_MAXSIZE,0); ROM = memory_region(REGION_CPU1); size = image_length( image ); diff --git a/mess/machine/pdp1.c b/mess/machine/pdp1.c index ade6538f5..a3a8f18b8 100644 --- a/mess/machine/pdp1.c +++ b/mess/machine/pdp1.c @@ -40,7 +40,7 @@ static void reader_callback(int dummy); static void puncher_callback(int nac); static void tyo_callback(int nac); static void dpy_callback(int dummy); -static void pdp1_machine_stop(void); +static void pdp1_machine_stop(running_machine *machine); /* pointer to pdp-1 RAM */ @@ -155,7 +155,7 @@ static OPBASE_HANDLER(setOPbasefunc) } -static void pdp1_machine_reset(void) +static void pdp1_machine_reset(running_machine *machine) { int config; @@ -179,7 +179,7 @@ static void pdp1_machine_reset(void) } -static void pdp1_machine_stop(void) +static void pdp1_machine_stop(running_machine *machine) { /* the core will take care of freeing the timers, BUT we must set the variables to NULL if we don't want to risk confusing the tape image init function */ @@ -330,8 +330,8 @@ MACHINE_START( pdp1 ) memory_set_opbase_handler(0, setOPbasefunc); - add_reset_callback(pdp1_machine_reset); - add_exit_callback(pdp1_machine_stop); + add_reset_callback(machine, pdp1_machine_reset); + add_exit_callback(machine, pdp1_machine_stop); return 0; } diff --git a/mess/machine/pmd85.c b/mess/machine/pmd85.c index 338c7e5a0..4affcf341 100644 --- a/mess/machine/pmd85.c +++ b/mess/machine/pmd85.c @@ -762,14 +762,14 @@ static void pmd85_cassette_timer_callback(int dummy) static OPBASE_HANDLER(pmd85_opbaseoverride) { if (readinputport(0x10)&0x01) - mame_schedule_soft_reset(); + mame_schedule_soft_reset(Machine); return address; } static OPBASE_HANDLER(mato_opbaseoverride) { if (readinputport(0x09)&0x01) - mame_schedule_soft_reset(); + mame_schedule_soft_reset(Machine); return address; } diff --git a/mess/machine/sms.c b/mess/machine/sms.c index f3276427b..79f3dcfd5 100644 --- a/mess/machine/sms.c +++ b/mess/machine/sms.c @@ -487,10 +487,7 @@ DEVICE_LOAD( sms_cart ) /* Create a new memory region to hold the ROM. */ /* Make sure the region holds only complete (0x4000) rom banks */ - if (new_memory_region(REGION_USER2, ((size&0x3FFF) ? (((size>>14)+1)<<14) : size), ROM_REQUIRED)) { - logerror("Memory allocation failed reading roms!\n"); - return INIT_FAIL; - } + new_memory_region(Machine, REGION_USER2, ((size&0x3FFF) ? (((size>>14)+1)<<14) : size), ROM_REQUIRED); ROM = memory_region(REGION_USER2); /* Load ROM banks */ diff --git a/mess/machine/svi318.c b/mess/machine/svi318.c index 755fdef7e..77e2be1a5 100644 --- a/mess/machine/svi318.c +++ b/mess/machine/svi318.c @@ -533,14 +533,14 @@ static VIDEO_UPDATE( svi318_80col ) VIDEO_UPDATE( svi328b ) { - video_update_tms9928a(screen, bitmap, cliprect); - video_update_svi318_80col(screen, bitmap, cliprect); + video_update_tms9928a(machine, screen, bitmap, cliprect); + video_update_svi318_80col(machine, screen, bitmap, cliprect); return 0; } MACHINE_RESET( svi328b ) { - machine_reset_svi318(); + machine_reset_svi318(machine); svi318_80col_init(); } diff --git a/mess/machine/thomson.c b/mess/machine/thomson.c index 7c221fbea..2904ce61c 100644 --- a/mess/machine/thomson.c +++ b/mess/machine/thomson.c @@ -129,6 +129,11 @@ static UINT8 thom_cart_write; /* cartridge write mode */ #define THOM_CART_READ_WRITE 1 /* write performs bank switching */ #define THOM_CART_WRITE_SWITCH 2 /* actual RAM */ +static void thom_set_caps_led ( int led ) +{ + output_set_value( "led0", led ); +} + /* ------------ serial ------------ */ @@ -348,7 +353,7 @@ static READ8_HANDLER ( to7_sys_portb_in ) return to7_lightpen_gpl( TO7_LIGHTPEN_DECAL, to7_lightpen_step ) & 0xff; } -static pia6821_interface to7_sys = { +static const pia6821_interface to7_sys = { to7_sys_porta_in, to7_sys_portb_in, NULL, NULL, NULL, NULL, NULL, to7_sys_portb_out, to7_set_cassette_motor, to7_sys_cb2_out, @@ -463,7 +468,7 @@ static void to7_io_in_callback ( int id, unsigned long state ) #endif } -static pia6821_interface to7_io = { +static const pia6821_interface to7_io = { to7_io_porta_in, NULL, NULL, NULL, NULL, NULL, to7_io_porta_out, to7_io_portb_out, NULL, to7_io_cb2_out, thom_firq_1, thom_firq_1 @@ -533,7 +538,7 @@ static void to7_rf57932_init( void ) TODO! */ -static pia6821_interface to7_pia_modem = { +static const pia6821_interface to7_pia_modem = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL @@ -605,7 +610,7 @@ static READ8_HANDLER ( to7_game_portb_in ) return readinputport( THOM_INPUT_GAME + 1 ); } -static pia6821_interface to7_game = { +static const pia6821_interface to7_game = { to7_game_porta_in, to7_game_portb_in, NULL, NULL, NULL, NULL, NULL, to7_game_portb_out, NULL, NULL, @@ -705,6 +710,7 @@ MACHINE_START ( to7 ) /* save-state */ state_save_register_global( thom_cart_nb_banks ); state_save_register_global( thom_cart_bank ); + state_save_register_global( thom_cart_write ); state_save_register_global( to7_keyline ); state_save_register_global( to7_lightpen ); state_save_register_global( to7_lightpen_step ); @@ -769,7 +775,7 @@ static WRITE8_HANDLER ( to770_sys_portb_out ) to770_update_ram_bank(); } -static pia6821_interface to770_sys = { +static const pia6821_interface to770_sys = { to770_sys_porta_in, NULL, NULL, NULL, NULL, NULL, NULL, to770_sys_portb_out, to7_set_cassette_motor, to770_sys_cb2_out, @@ -890,6 +896,7 @@ MACHINE_START ( to770 ) /* save-state */ state_save_register_global( thom_cart_nb_banks ); state_save_register_global( thom_cart_bank ); + state_save_register_global( thom_cart_write ); state_save_register_global( to7_keyline ); state_save_register_global( to7_lightpen ); state_save_register_global( to7_lightpen_step ); @@ -932,6 +939,12 @@ static void mo5_periodic_cb ( int dummy ) pia_set_input_cb1( THOM_PIA_SYS, 0 ); } +static void mo5_init_timer(void) +{ + /* time is a faster than 50 Hz to match video framerate */ + timer_adjust( mo5_periodic_timer, TIME_NOW, 0, TIME_IN_USEC( 19968 ) ); +} + /* ------------ system PIA 6821 ------------ */ @@ -967,7 +980,7 @@ static READ8_HANDLER ( mo5_sys_portb_in ) return ( readinputport( THOM_INPUT_KEYBOARD+lin ) & (1 << col) ) ? 0x80 : 0; } -static pia6821_interface mo5_sys = { +static const pia6821_interface mo5_sys = { mo5_sys_porta_in, mo5_sys_portb_in, NULL, NULL, NULL, NULL, mo5_sys_porta_out, mo5_sys_portb_out, mo5_set_cassette_motor, NULL, @@ -1117,7 +1130,7 @@ MACHINE_RESET( mo5 ) to7_io_reset(); to7_modem_reset(); to7_rf57932_reset(); - timer_adjust( mo5_periodic_timer, TIME_NOW, 0, TIME_IN_MSEC( 20 ) ); + mo5_init_timer(); /* video */ thom_set_video_mode( THOM_VMODE_MO5 ); @@ -1244,7 +1257,10 @@ static void to9_set_video_mode( UINT8 data, int style ) break; case 0x21: thom_set_video_mode( THOM_VMODE_BITMAP4 ); break; case 0x41: thom_set_video_mode( THOM_VMODE_BITMAP4_ALT ); break; - case 0x2a: thom_set_video_mode( THOM_VMODE_80 ); break; + case 0x2a: + if ( style==0 ) thom_set_video_mode( THOM_VMODE_80_TO9 ); + else thom_set_video_mode( THOM_VMODE_80 ); + break; case 0x7b: thom_set_video_mode( THOM_VMODE_BITMAP16 ); break; case 0x24: thom_set_video_mode( THOM_VMODE_PAGE1 ); break; case 0x25: thom_set_video_mode( THOM_VMODE_PAGE2 ); break; @@ -1875,7 +1891,7 @@ static WRITE8_HANDLER ( to9_sys_portb_out ) logerror( "to9_sys_portb_out: overlay not handled\n" ); } -static pia6821_interface to9_sys = { +static const pia6821_interface to9_sys = { to9_sys_porta_in, NULL, NULL, NULL, NULL, NULL, to9_sys_porta_out, to9_sys_portb_out, to7_set_cassette_motor, NULL, @@ -1969,6 +1985,7 @@ MACHINE_START ( to9 ) /* save-state */ state_save_register_global( thom_cart_nb_banks ); state_save_register_global( thom_cart_bank ); + state_save_register_global( thom_cart_write ); state_save_register_global( to7_lightpen ); state_save_register_global( to7_lightpen_step ); state_save_register_global( to9_soft_bank ); @@ -2344,7 +2361,7 @@ static WRITE8_HANDLER ( to8_game_portb_out ) to8_sound_update(); } -static pia6821_interface to8_game = { +static const pia6821_interface to8_game = { to8_game_porta_in, to8_game_portb_in, NULL, NULL, NULL, NULL, NULL, to8_game_portb_out, NULL, to8_game_cp2_out, @@ -2681,7 +2698,7 @@ static WRITE8_HANDLER ( to8_sys_portb_out ) logerror( "to8_sys_portb_out: overlay not handled\n" ); } -static pia6821_interface to8_sys = { +static const pia6821_interface to8_sys = { to8_sys_porta_in, NULL, NULL, NULL, NULL, NULL, to9_sys_porta_out, to8_sys_portb_out, to7_set_cassette_motor, NULL, @@ -2772,6 +2789,8 @@ MACHINE_RESET ( to8 ) pia_set_input_b( THOM_PIA_SYS, 0xf8 ); /* memory */ + to8_cart_vpage = 0; + to8_data_vpage = 0; to8_soft_bank = 0; to8_update_ram_bank(); to8_update_cart_bank(); @@ -2839,7 +2858,7 @@ MACHINE_START ( to8 ) /* ------------ system PIA 6821 ------------ */ -static pia6821_interface to9p_sys = { +static const pia6821_interface to9p_sys = { to9_sys_porta_in, NULL, NULL, NULL, NULL, NULL, to9_sys_porta_out, to8_sys_portb_out, to7_set_cassette_motor, NULL, @@ -2910,6 +2929,8 @@ MACHINE_RESET ( to9p ) pia_set_input_b( THOM_PIA_SYS, 0xf8 ); /* memory */ + to8_cart_vpage = 0; + to8_data_vpage = 0; to8_soft_bank = 0; to8_update_ram_bank(); to8_update_cart_bank(); @@ -3144,7 +3165,7 @@ static WRITE8_HANDLER ( mo6_game_cb2_out ) CENTRONICS_STROBE ); } -static pia6821_interface mo6_game = { +static const pia6821_interface mo6_game = { to8_game_porta_in, to8_game_portb_in, NULL, mo6_game_cb1_in, NULL, NULL, mo6_game_porta_out, mo6_game_portb_out, NULL, mo6_game_cb2_out, @@ -3223,7 +3244,7 @@ static WRITE8_HANDLER ( mo6_sys_portb_out ) #endif } -static pia6821_interface mo6_sys = { +static const pia6821_interface mo6_sys = { mo6_sys_porta_in, mo6_sys_portb_in, NULL, NULL, NULL, NULL, mo6_sys_porta_out, mo6_sys_portb_out, mo5_set_cassette_motor, NULL, @@ -3401,7 +3422,7 @@ MACHINE_RESET ( mo6 ) thom_centronics_reset(); to7_modem_reset(); to7_rf57932_reset(); - timer_adjust( mo5_periodic_timer, TIME_NOW, 0, TIME_IN_MSEC( 20 ) ); + mo5_init_timer(); /* gate-array */ to7_lightpen = 0; @@ -3418,6 +3439,8 @@ MACHINE_RESET ( mo6 ) thom_set_mode_point( 0 ); /* memory */ + to8_cart_vpage = 0; + to8_data_vpage = 0; mo6_update_ram_bank(); mo6_update_cart_bank(); /* mo5_reg_cart not reset */ @@ -3470,6 +3493,7 @@ MACHINE_START ( mo6 ) state_save_register_global( to8_reg_sys2 ); state_save_register_global( to8_lightpen_intr ); state_save_register_global( to8_data_vpage ); + state_save_register_global( to8_cart_vpage ); state_save_register_global( mo5_reg_cart ); state_save_register_global_pointer( (mem + 0x10000), 0x10000 ); state_save_register_global_pointer( thom_vram, 0x4000 * 8 ); @@ -3480,13 +3504,6 @@ MACHINE_START ( mo6 ) /***************************** MO5 NR *************************/ - -/* ------------ game 6821 PIA ------------ */ - - -/* ------------ system PIA 6821 ------------ */ - - /* ------------ network ( & external floppy) ------------ */ READ8_HANDLER ( mo5nr_net_r ) @@ -3575,7 +3592,7 @@ static WRITE8_HANDLER ( mo5nr_sys_porta_out ) mo6_sound_update(); /* bit 2: sound mute */ } -static pia6821_interface mo5nr_sys = { +static const pia6821_interface mo5nr_sys = { mo6_sys_porta_in, mo5nr_sys_portb_in, NULL, NULL, NULL, NULL, mo5nr_sys_porta_out, mo6_sys_portb_out, mo5_set_cassette_motor, NULL, @@ -3587,7 +3604,7 @@ static pia6821_interface mo5nr_sys = { /* similar to the MO6, without the printer */ -static pia6821_interface mo5nr_game = { +static const pia6821_interface mo5nr_game = { to8_game_porta_in, to8_game_portb_in, NULL, NULL, NULL, NULL, mo6_game_porta_out, mo6_game_portb_out, NULL, NULL, @@ -3624,7 +3641,7 @@ MACHINE_RESET ( mo5nr ) thom_centronics_reset(); to7_modem_reset(); to7_rf57932_reset(); - timer_adjust( mo5_periodic_timer, TIME_NOW, 0, TIME_IN_MSEC( 20 ) ); + mo5_init_timer(); /* gate-array */ to7_lightpen = 0; @@ -3644,6 +3661,8 @@ MACHINE_RESET ( mo5nr ) pia_set_input_b( THOM_PIA_SYS, 0xf8 ); /* memory */ + to8_cart_vpage = 0; + to8_data_vpage = 0; mo6_update_ram_bank(); mo6_update_cart_bank(); /* mo5_reg_cart not reset */ diff --git a/mess/machine/thomson.h b/mess/machine/thomson.h index 9967c17c2..0005429ab 100644 --- a/mess/machine/thomson.h +++ b/mess/machine/thomson.h @@ -14,7 +14,7 @@ #define THOM_INPUT_GAME 3 /* 2-5 ports: joystick, mouse */ #define THOM_INPUT_KEYBOARD 8 /* 8-10 lines */ #define THOM_INPUT_CONFIG 18 /* machine-specific options */ -#define THOM_INPUT_FCONFIG 19 /* floppy options */ +#define THOM_INPUT_FCONFIG 19 /* floppy / network options */ #define THOM_INPUT_VCONFIG 20 /* video options */ /* 6821 PIAs */ diff --git a/mess/machine/ti85.c b/mess/machine/ti85.c index 6a9ad6a6d..da57a49ad 100644 --- a/mess/machine/ti85.c +++ b/mess/machine/ti85.c @@ -95,12 +95,12 @@ static UINT8 ti85_serial_status = TI85_SEND_STOP; static UINT8 * ti85_receive_buffer; static UINT8 * ti85_receive_data; -static void ti85_free_serial_data_memory (void); +static void ti85_free_serial_data_memory (running_machine *machine); static int ti85_receive_serial (UINT8*, UINT32); static int ti85_send_serial (UINT8*, UINT32); -static void ti85_reset_serial (void); +static void ti85_reset_serial (running_machine *machine); static void ti85_update_serial (void); static void ti85_send_variables (void); static void ti85_send_backup (void); @@ -231,8 +231,8 @@ MACHINE_START( ti85 ) memory_set_bankptr(1,memory_region(REGION_CPU1) + 0x010000); memory_set_bankptr(2,memory_region(REGION_CPU1) + 0x014000); - add_reset_callback(ti85_reset_serial); - add_exit_callback(ti85_free_serial_data_memory); + add_reset_callback(machine, ti85_reset_serial); + add_exit_callback(machine, ti85_free_serial_data_memory); return 0; } @@ -272,8 +272,8 @@ MACHINE_START( ti86 ) timer_pulse(TIME_IN_HZ(200), 0, ti85_timer_callback); } - add_reset_callback(ti85_reset_serial); - add_exit_callback(ti85_free_serial_data_memory); + add_reset_callback(machine, ti85_reset_serial); + add_exit_callback(machine, ti85_free_serial_data_memory); return 0; } @@ -662,7 +662,7 @@ SNAPSHOT_LOAD( ti8x ) DEVICE_INIT( ti85_serial ) { - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); ti85_receive_serial (NULL,0); return INIT_PASS; } @@ -698,7 +698,7 @@ DEVICE_LOAD( ti85_serial ) DEVICE_UNLOAD( ti85_serial ) { - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); ti85_serial_status = TI85_SEND_STOP; ti85_free_serial_stream (&ti85_serial_stream); } @@ -725,7 +725,7 @@ static int ti85_alloc_serial_data_memory (UINT32 size) return 1; } -static void ti85_free_serial_data_memory (void) +static void ti85_free_serial_data_memory (running_machine *machine) { if (ti85_receive_buffer) { @@ -825,7 +825,7 @@ void ti85_update_serial (void) else { ti85_receive_serial(NULL, 0); - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if (readinputport(10)&0x01) { ti85_serial_status = TI85_PREPARE_SCREEN_REQUEST; @@ -855,11 +855,11 @@ void ti85_update_serial (void) } } -static void ti85_reset_serial (void) +static void ti85_reset_serial (running_machine *machine) { ti85_receive_serial(NULL, 0); ti85_send_serial(NULL, 0); - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(machine); ti85_red_in = 0x01; ti85_white_in = 0x01; ti85_red_out = 0x00; @@ -925,7 +925,7 @@ static void ti85_send_variables (void) break; case 0x03: //out of memory variable_number = 0; - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); ti85_serial_status = TI85_SEND_STOP; break; } @@ -939,7 +939,7 @@ static void ti85_send_variables (void) { case 0x01: //exit variable_number = 0; - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); ti85_serial_status = TI85_SEND_STOP; break; case 0x02: //skip @@ -981,7 +981,7 @@ static void ti85_send_variables (void) { logerror ("OK received\n"); ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data); - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); ti85_serial_status = TI85_SEND_STOP; } break; @@ -1031,7 +1031,7 @@ static void ti85_send_backup (void) { ti85_convert_stream_to_data (ti85_receive_buffer, 5*8, ti85_receive_data); variable_number = 0; - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); ti85_serial_status = TI85_SEND_STOP; } break; @@ -1055,7 +1055,7 @@ static void ti85_send_backup (void) if(!ti85_send_serial(ti85_serial_stream.end,ti85_serial_stream.end_size)) { variable_number = 0; - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); ti85_serial_status = TI85_SEND_STOP; } break; @@ -1090,7 +1090,7 @@ static void ti85_receive_variables (void) if(!var_data) ti85_serial_status = TI85_SEND_STOP; memcpy (var_data, ti85_receive_data+2, 5); - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if (!ti85_alloc_serial_data_memory(var_data[0]-1)) { free(var_data); var_data = NULL; @@ -1104,7 +1104,7 @@ static void ti85_receive_variables (void) { ti85_convert_stream_to_data (ti85_receive_buffer, (var_data[0]-1)*8, ti85_receive_data); memcpy (var_data+5, ti85_receive_data, var_data[0]-3); - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory (8)) { free(var_data); var_data = NULL; @@ -1124,7 +1124,7 @@ static void ti85_receive_variables (void) case TI85_SEND_CONTINUE: if(!ti85_send_serial(ti85_receive_buffer+4*8, 4*8)) { - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory(4)) { free(var_data); var_data = NULL; @@ -1139,7 +1139,7 @@ static void ti85_receive_variables (void) if(!ti85_receive_serial (ti85_receive_buffer, 4*8)) { ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data); - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory(var_data[2]+var_data[3]*256+6)) { free(var_data); var_data = NULL; @@ -1155,7 +1155,7 @@ static void ti85_receive_variables (void) { ti85_convert_stream_to_data (ti85_receive_buffer, (var_data[2]+var_data[3]*256+6)*8, ti85_receive_data); memcpy (var_data+var_data[0]+2, ti85_receive_data+2, var_data[2]+var_data[3]*256+2); - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory (4)) { free(var_data); var_data = NULL; @@ -1170,7 +1170,7 @@ static void ti85_receive_variables (void) case TI85_SEND_OK_2: if(!ti85_send_serial(ti85_receive_buffer, 4*8)) { - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory(7)) { free(var_data); var_data = NULL; @@ -1223,7 +1223,7 @@ static void ti85_receive_variables (void) ti85_serial_status = TI85_RECEIVE_HEADER_1; else { - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory (4)) { free(var_data); var_data = NULL; @@ -1239,7 +1239,7 @@ static void ti85_receive_variables (void) case TI85_SEND_OK_3: if(!ti85_send_serial(ti85_receive_buffer, 4*8)) { - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); variable_number = 0; ti85_serial_status = TI85_SEND_STOP; sprintf (var_file_name, "%08d.85g", var_file_number); @@ -1302,7 +1302,7 @@ static void ti85_receive_backup (void) backup_file_data[0x35] = (backup_data_size[0]+backup_data_size[1]+backup_data_size[2]+0x11)&0x00ff; backup_file_data[0x36] = ((backup_data_size[0]+backup_data_size[1]+backup_data_size[2]+0x11)&0xff00)>>8; memcpy(backup_file_data+0x37, ti85_receive_data+0x02, 0x0b); - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory (8)) { free(backup_file_data); backup_file_data = NULL; @@ -1322,7 +1322,7 @@ static void ti85_receive_backup (void) case TI85_SEND_CONTINUE: if(!ti85_send_serial(ti85_receive_buffer+4*8, 4*8)) { - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory(4)) { free(backup_file_data); backup_file_data = NULL; @@ -1337,7 +1337,7 @@ static void ti85_receive_backup (void) if(!ti85_receive_serial (ti85_receive_buffer, 4*8)) { ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data); - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory(backup_data_size[backup_variable_number]+6)) { free(backup_file_data); backup_file_data = NULL; @@ -1364,7 +1364,7 @@ static void ti85_receive_backup (void) memcpy(backup_file_data+0x42+backup_data_size[0]+backup_data_size[1]+0x04, ti85_receive_data+0x02, backup_data_size[2]+0x02); break; } - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory (4)) { free(backup_file_data); backup_file_data = NULL; @@ -1379,7 +1379,7 @@ static void ti85_receive_backup (void) case TI85_SEND_OK_2: if(!ti85_send_serial(ti85_receive_buffer, 4*8)) { - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); backup_variable_number++; if (backup_variable_number<3) { @@ -1441,7 +1441,7 @@ static void ti85_receive_screen (void) case TI85_SEND_SCREEN_REQUEST: if(!ti85_send_serial(ti85_receive_buffer, 4*8)) { - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory (4)) { ti85_serial_status = TI85_SEND_STOP; @@ -1454,7 +1454,7 @@ static void ti85_receive_screen (void) if(!ti85_receive_serial (ti85_receive_buffer, 4*8)) { ti85_convert_stream_to_data (ti85_receive_buffer, 4*8, ti85_receive_data); - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory (1030)) { ti85_serial_status = TI85_SEND_STOP; @@ -1474,7 +1474,7 @@ static void ti85_receive_screen (void) image_file_data = malloc (0x49+1008); if(!image_file_data) { - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); ti85_serial_status = TI85_SEND_OK; return; } @@ -1502,7 +1502,7 @@ static void ti85_receive_screen (void) free(image_file_data); image_file_number++; } - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); if(!ti85_alloc_serial_data_memory (4)) { ti85_serial_status = TI85_SEND_STOP; @@ -1515,7 +1515,7 @@ static void ti85_receive_screen (void) case TI85_SEND_OK: if(!ti85_send_serial(ti85_receive_buffer, 4*8)) { - ti85_free_serial_data_memory(); + ti85_free_serial_data_memory(Machine); ti85_serial_status = TI85_SEND_STOP; } break; diff --git a/mess/machine/ti99_4x.c b/mess/machine/ti99_4x.c index 2dff1b861..ddcad6e55 100644 --- a/mess/machine/ti99_4x.c +++ b/mess/machine/ti99_4x.c @@ -396,7 +396,7 @@ static UINT8 *sRAM_ptr_8; initialization, cart loading, etc. */ -void init_ti99_4(void) +DRIVER_INIT( ti99_4 ) { int i, j; @@ -417,7 +417,7 @@ void init_ti99_4(void) } } -void init_ti99_4a(void) +DRIVER_INIT( ti99_4a ) { ti99_model = model_99_4a; has_evpc = FALSE; @@ -427,7 +427,7 @@ void init_ti99_4a(void) console_GROMs.data_ptr = memory_region(region_grom); } -void init_ti99_4ev(void) +DRIVER_INIT( ti99_4ev ) { ti99_model = model_99_4a; has_evpc = TRUE; @@ -439,7 +439,7 @@ void init_ti99_4ev(void) console_GROMs.data_ptr = memory_region(region_grom); } -void init_ti99_8(void) +DRIVER_INIT( ti99_8 ) { ti99_model = model_99_8; has_evpc = FALSE; @@ -457,7 +457,7 @@ void init_ti99_8(void) console_GROMs.data_ptr = memory_region(region_grom); } -void init_ti99_4p(void) +DRIVER_INIT( ti99_4p ) { ti99_model = model_99_4p; has_evpc = TRUE; @@ -856,9 +856,9 @@ void machine_stop_ti99(void) /* video initialization. */ -int video_start_ti99_4ev(void) +VIDEO_START( ti99_4ev ) { - return v9938_init(MODEL_V9938, 0x20000, tms9901_set_int2); /* v38 with 128 kb of video RAM */ + return v9938_init(Machine, MODEL_V9938, 0x20000, tms9901_set_int2); /* v38 with 128 kb of video RAM */ } /* diff --git a/mess/machine/ti99_4x.h b/mess/machine/ti99_4x.h index 48bb5a9b5..4979abcbc 100644 --- a/mess/machine/ti99_4x.h +++ b/mess/machine/ti99_4x.h @@ -146,11 +146,11 @@ enum /* prototypes for machine code */ -void init_ti99_4(void); -void init_ti99_4a(void); -void init_ti99_4ev(void); -void init_ti99_8(void); -void init_ti99_4p(void); +DRIVER_INIT( ti99_4 ); +DRIVER_INIT( ti99_4a ); +DRIVER_INIT( ti99_4ev ); +DRIVER_INIT( ti99_8 ); +DRIVER_INIT( ti99_4p ); MACHINE_RESET( ti99 ); @@ -164,9 +164,9 @@ DEVICE_INIT( ti99_hd ); DEVICE_LOAD( ti99_hd ); DEVICE_UNLOAD( ti99_hd ); -int video_start_ti99_4(void); -int video_start_ti99_4a(void); -int video_start_ti99_4ev(void); +VIDEO_START( ti99_4 ); +VIDEO_START( ti99_4a ); +VIDEO_START( ti99_4ev ); void ti99_vblank_interrupt(void); void ti99_4ev_hblank_interrupt(void); diff --git a/mess/machine/trs80.c b/mess/machine/trs80.c index 09648805d..a913fbefd 100644 --- a/mess/machine/trs80.c +++ b/mess/machine/trs80.c @@ -65,7 +65,7 @@ static int get_cycles = 0; /* cycle count at last input port read */ static void tape_put_byte(UINT8 value); static void tape_get_open(void); -static void tape_put_close(void); +static void tape_put_close(running_machine *machine); #define FW TRS80_FONT_W #define FH TRS80_FONT_H @@ -283,7 +283,7 @@ DEVICE_LOAD( trs80_floppy ) static void trs80_fdc_callback(int); -static void trs80_machine_reset(void) +static void trs80_machine_reset(running_machine *machine) { if (cas_size) { @@ -324,8 +324,8 @@ MACHINE_START( trs80 ) FNT[i*FH+ 8] = FNT[i*FH+ 9] = FNT[i*FH+10] = FNT[i*FH+11] = b4 | b5; } - add_reset_callback(trs80_machine_reset); - add_exit_callback(tape_put_close); + add_reset_callback(machine, trs80_machine_reset); + add_exit_callback(machine, tape_put_close); return 0; } @@ -374,7 +374,7 @@ static void tape_put_byte(UINT8 value) } } -static void tape_put_close(void) +static void tape_put_close(running_machine *machine) { /* file open ? */ if (tape_put_file) @@ -475,7 +475,7 @@ WRITE8_HANDLER( trs80_port_ff_w ) if (diff > 4000) { /* reset tape output */ - tape_put_close(); + tape_put_close(Machine); put_bit_count = tape_bits = in_sync = 0; } else diff --git a/mess/machine/tx0.c b/mess/machine/tx0.c index 969ac5965..a6b6b7e25 100644 --- a/mess/machine/tx0.c +++ b/mess/machine/tx0.c @@ -15,7 +15,6 @@ static void reader_callback(int dummy); static void puncher_callback(int dummy); static void prt_callback(int dummy); static void dis_callback(int dummy); -static void tx0_machine_stop(void); /* tape reader registers */ @@ -149,14 +148,14 @@ static OPBASE_HANDLER(setOPbasefunc) } -static void tx0_machine_reset(void) +static void tx0_machine_reset(running_machine *machine) { /* reset device state */ tape_reader.rcl = tape_reader.rc = 0; } -static void tx0_machine_stop(void) +static void tx0_machine_stop(running_machine *machine) { /* the core will take care of freeing the timers, BUT we must set the variables to NULL if we don't want to risk confusing the tape image init function */ @@ -173,8 +172,8 @@ MACHINE_START( tx0 ) typewriter.prt_timer = timer_alloc(prt_callback); dis_timer = timer_alloc(dis_callback); - add_reset_callback(tx0_machine_reset); - add_exit_callback(tx0_machine_stop); + add_reset_callback(machine, tx0_machine_reset); + add_exit_callback(machine, tx0_machine_stop); return 0; } @@ -613,7 +612,7 @@ DEVICE_UNLOAD( tx0_magtape ) static void magtape_callback(int dummy) { - UINT8 buf; + UINT8 buf = 0; int lr; (void) dummy; @@ -1224,12 +1223,12 @@ INTERRUPT_GEN( tx0_interrupt ) if (control_transitions & tx0_cm_sel) { if (tsr_index >= 2) - cpunum_set_reg(0, TX0_CM_SEL, cpunum_get_reg(0, TX0_CM_SEL) ^ (1 << (tsr_index - 2))); + cpunum_set_reg(0, TX0_CM_SEL, (UINT32) (cpunum_get_reg(0, TX0_CM_SEL) ^ (1 << (tsr_index - 2)))); } if (control_transitions & tx0_lr_sel) { if (tsr_index >= 2) - cpunum_set_reg(0, TX0_LR_SEL, cpunum_get_reg(0, TX0_LR_SEL) ^ (1 << (tsr_index - 2))); + cpunum_set_reg(0, TX0_LR_SEL, (UINT32) (cpunum_get_reg(0, TX0_LR_SEL) ^ (1 << (tsr_index - 2)))); } /* remember new state of control keys */ diff --git a/mess/machine/vc20.c b/mess/machine/vc20.c index 7e8e558ec..94c575db9 100644 --- a/mess/machine/vc20.c +++ b/mess/machine/vc20.c @@ -521,7 +521,7 @@ DRIVER_INIT( vic20 ) DRIVER_INIT( vic1001 ) { - init_vic20(); + init_vic20(machine); } DRIVER_INIT( vic20i ) diff --git a/mess/machine/vtech1.c b/mess/machine/vtech1.c index c83c379aa..f3df06168 100644 --- a/mess/machine/vtech1.c +++ b/mess/machine/vtech1.c @@ -114,30 +114,21 @@ static void common_init_machine(int base) } } -static void vtech1_machine_stop(void) -{ - /* FIXME: memory should be freed here, but then it crashes on hard resets? */ - /* if (banked_mem) free(banked_mem); */ -} - MACHINE_START(laser110) { common_init_machine(0x8000); - add_exit_callback(vtech1_machine_stop); return 0; } MACHINE_START(laser210) { common_init_machine(0x9000); - add_exit_callback(vtech1_machine_stop); return 0; } MACHINE_START(laser310) { common_init_machine(0xb800); - add_exit_callback(vtech1_machine_stop); return 0; } diff --git a/mess/machine/wswan.c b/mess/machine/wswan.c index 7bec7f8d9..d0af1de4e 100644 --- a/mess/machine/wswan.c +++ b/mess/machine/wswan.c @@ -23,8 +23,8 @@ enum enum_system { WSWAN=0, WSC }; enum enum_sram { SRAM_NONE=0, SRAM_64K, SRAM_256K, SRAM_512K, SRAM_1M, SRAM_2M, EEPROM_1K, EEPROM_16K, EEPROM_8K, SRAM_UNKNOWN }; -const char* wswan_sram_str[] = { "none", "64K SRAM", "256K SRAM", "512K SRAM", "1M SRAM", "2M SRAM", "1K EEPROM", "16K EEPROM", "8K EEPROM", "Unknown" }; -const int wswan_sram_size[] = { 0, 64*1024, 256*1024, 512*1024, 1024*1024, 2*1024*1024, 1024, 16*1024, 8*1024, 0 }; +const char* wswan_sram_str[] = { "none", "64Kbit SRAM", "256Kbit SRAM", "512Kbit SRAM", "1Mbit SRAM", "2Mbit SRAM", "1Kbit EEPROM", "16Kbit EEPROM", "8Kbit EEPROM", "Unknown" }; +const int wswan_sram_size[] = { 0, 64*1024/8, 256*1024/8, 512*1024/8, 1024*1024/8, 2*1024*1024/8, 1024/8, 16*1024/8, 8*1024/8, 0 }; struct EEPROM { UINT8 mode; /* eeprom mode */ @@ -34,6 +34,7 @@ struct EEPROM { UINT8 write_enabled; /* write enabled yes/no */ int size; /* size of eeprom/sram area */ UINT8 *data; /* pointer to start of sram/eeprom data */ + UINT8 *page; /* pointer to current sram/eeprom page */ }; struct RTC { @@ -96,6 +97,7 @@ static UINT8 ws_portram_init[256] = f000:ffc0 FC cld + BC 00 20 mov sp,2000h 68 00 00 push 0000h 07 pop es 68 00 F0 push F000h @@ -104,7 +106,6 @@ static UINT8 ws_portram_init[256] = BE E0 FF mov si,FFE0h B9 10 00 mov cx,0010h F3 A4 rep movsb - BC 00 20 mov sp,2000h B0 2F mov al,2Fh E6 C0 out al,C0h EA 00 04 00 00 jmp 0000:0400 @@ -117,8 +118,8 @@ static UINT8 ws_portram_init[256] = */ static UINT8 ws_fake_bios_code[] = { - 0xfc, 0x68, 0x00, 0x00, 0x07, 0x68, 0x00, 0xf0, 0x1f, 0xbf, 0x00, 0x04, 0xbe, 0xe0, 0xff, 0xb9, - 0x10, 0x00, 0xf3, 0xa4, 0xbc, 0x00, 0x20, 0xb0, 0x2f, 0xe6, 0xc0, 0xea, 0x00, 0x04, 0x00, 0x00, + 0xfc, 0xbc, 0x00, 0x20, 0x68, 0x00, 0x00, 0x07, 0x68, 0x00, 0xf0, 0x1f, 0xbf, 0x00, 0x04, 0xbe, + 0xe0, 0xff, 0xb9, 0x10, 0x00, 0xf3, 0xa4, 0xb0, 0x2f, 0xe6, 0xc0, 0xea, 0x00, 0x04, 0x00, 0x00, 0xe4, 0xa0, 0x0c, 0x01, 0xe6, 0xa0, 0xea, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0xc0, 0xff, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -192,7 +193,7 @@ static void wswan_rtc_callback( int dummy ) { } } -static void wswan_machine_stop( void ) { +static void wswan_machine_stop( running_machine *machine ) { if ( eeprom.size ) { image_battery_save( image_from_devtype_and_index(IO_CARTSLOT,0), eeprom.data, eeprom.size ); } @@ -207,14 +208,14 @@ static void wswan_setup_bios( void ) { MACHINE_START( wswan ) { system_type = WSWAN; - add_exit_callback( wswan_machine_stop ); + add_exit_callback( machine, wswan_machine_stop ); wswan_setup_bios(); return 0; } MACHINE_START( wscolor ) { system_type = WSC; - add_exit_callback( wswan_machine_stop ); + add_exit_callback( machine, wswan_machine_stop ); wswan_setup_bios(); return 0; } @@ -240,7 +241,6 @@ MACHINE_RESET( wswan ) memset( &sound_dma, 0, sizeof( sound_dma ) ); /* Switch in the banks */ - memory_set_bankptr( 1, eeprom.data ); memory_set_bankptr( 2, ROMMap[(ROMBanks - 1) & (ROMBanks - 1)] ); memory_set_bankptr( 3, ROMMap[(ROMBanks - 1) & (ROMBanks - 1)] ); memory_set_bankptr( 4, ROMMap[(ROMBanks - 12) & (ROMBanks - 1)] ); @@ -267,7 +267,7 @@ MACHINE_RESET( wswan ) NVRAM_HANDLER( wswan ) { if ( read_or_write ) { - /* Load the EEPROM data */ + /* Save the EEPROM data */ mame_fwrite( file, internal_eeprom, INTERNAL_EEPROM_SIZE ); } else { /* Load the EEPROM data */ @@ -280,6 +280,22 @@ NVRAM_HANDLER( wswan ) { } } +READ8_HANDLER( wswan_sram_r ) +{ + if ( eeprom.data == NULL ) { + return 0xFF; + } + return eeprom.page[ offset & ( eeprom.size - 1 ) ]; +} + +WRITE8_HANDLER( wswan_sram_w ) +{ + if ( eeprom.data == NULL ) { + return; + } + eeprom.page[ offset & ( eeprom.size - 1 ) ] = data; +} + READ8_HANDLER( wswan_port_r ) { UINT8 value = ws_portram[offset]; @@ -1009,7 +1025,7 @@ WRITE8_HANDLER( wswan_port_w ) Bit 0-7 - SRAM bank to select */ if ( eeprom.mode == SRAM_64K || eeprom.mode == SRAM_256K || eeprom.mode == SRAM_512K || eeprom.mode == SRAM_1M || eeprom.mode == SRAM_2M ) { - memory_set_bankptr( 1, &eeprom.data[ ( data * 64 * 1024 ) & ( eeprom.size - 1 ) ] ); + eeprom.page = &eeprom.data[ ( data * 64 * 1024 ) & ( eeprom.size - 1 ) ]; } break; case 0xc2: /* ROM bank select for segment 2 (0x20000 - 0x2ffff) @@ -1247,6 +1263,7 @@ DEVICE_INIT(wswan_cart) /* Initialize EEPROM structure */ memset( &eeprom, 0, sizeof( eeprom ) ); eeprom.data = NULL; + eeprom.page = NULL; /* Initialize RTC structure */ rtc.present = 0; @@ -1321,6 +1338,7 @@ DEVICE_LOAD(wswan_cart) if ( eeprom.size != 0 ) { eeprom.data = auto_malloc( eeprom.size ); image_battery_load( image, eeprom.data, eeprom.size ); + eeprom.page = eeprom.data; } logerror( "Image Name: %s\n", image_longname( image ) ); diff --git a/mess/mess.c b/mess/mess.c index c3682c00c..315a4e705 100644 --- a/mess/mess.c +++ b/mess/mess.c @@ -27,7 +27,7 @@ UINT8 *mess_ram; UINT8 mess_ram_default_value = 0xCD; static int devices_initialload(const game_driver *gamedrv); -static void devices_exit(void); +static void devices_exit(running_machine *machine); static int ram_init(const game_driver *gamedrv) @@ -89,7 +89,7 @@ static int ram_init(const game_driver *gamedrv) * ith all user specified image names. ****************************************************************************/ -int devices_init(const game_driver *gamedrv) +int devices_init(running_machine *machine) { int i; const struct IODevice *dev; @@ -109,17 +109,17 @@ int devices_init(const game_driver *gamedrv) inputx_init(); /* allocate the IODevice struct */ - Machine->devices = devices_allocate(Machine->gamedrv); - if (!Machine->devices) + machine->devices = devices_allocate(Machine->gamedrv); + if (!machine->devices) return 1; /* Check that the driver supports all devices requested (options struct)*/ for( i = 0; i < options.image_count; i++ ) { if (options.image_files[i].device_tag) - dev = device_find_tag(Machine->devices, options.image_files[i].device_tag); + dev = device_find_tag(machine->devices, options.image_files[i].device_tag); else - dev = device_find(Machine->devices, options.image_files[i].device_type); + dev = device_find(machine->devices, options.image_files[i].device_type); if (!dev) { @@ -129,13 +129,13 @@ int devices_init(const game_driver *gamedrv) } /* initialize RAM code */ - if (ram_init(gamedrv)) + if (ram_init(machine->gamedrv)) return 1; /* init all devices */ image_init(); - add_exit_callback(devices_exit); - return devices_initialload(gamedrv); + add_exit_callback(machine, devices_exit); + return devices_initialload(machine->gamedrv); } @@ -248,7 +248,7 @@ static int devices_initialload(const game_driver *gamedrv) * Call the exit() functions for all devices of a * driver for all images. */ -static void devices_exit(void) +static void devices_exit(running_machine *machine) { /* unload all devices */ image_unload_all(FALSE); @@ -317,11 +317,11 @@ void ram_dump(const char *filename) -void mess_config_init(void) +void mess_config_init(running_machine *machine) { #ifdef WIN32 - extern void win_mess_config_init(void); - win_mess_config_init(); + extern void win_mess_config_init(running_machine *machine); + win_mess_config_init(machine); #endif } diff --git a/mess/mess.h b/mess/mess.h index 02c97df09..7055b0463 100644 --- a/mess/mess.h +++ b/mess/mess.h @@ -73,9 +73,9 @@ void tapecontrol_gettime(char *timepos, size_t timepos_size, mess_image *img, in int mess_validitychecks(void); /* these are called from mame.c*/ -int devices_init(const game_driver *gamedrv); +int devices_init(running_machine *machine); -void mess_config_init(void); +void mess_config_init(running_machine *machine); enum { diff --git a/mess/mess.mak b/mess/mess.mak index 97fe815f1..e555354e1 100644 --- a/mess/mess.mak +++ b/mess/mess.mak @@ -392,7 +392,7 @@ $(OBJ)/nintendo.a: \ $(OBJ)/mess/machine/gb.o \ $(OBJ)/mess/systems/gb.o \ $(OBJ)/mess/machine/nes_mmc.o \ - $(OBJ)/mess/vidhrdw/ppu2c0x.o \ + $(OBJ)/vidhrdw/ppu2c0x.o \ $(OBJ)/mess/vidhrdw/nes.o \ $(OBJ)/mess/machine/nes.o \ $(OBJ)/mess/systems/nes.o \ @@ -961,6 +961,7 @@ $(OBJ)/be.a: \ $(OBJ)/machine/53c810.o $(OBJ)/thomson.a: \ + $(OBJ)/mess/machine/mc6854.o \ $(OBJ)/mess/machine/mc6846.o \ $(OBJ)/mess/systems/thomson.o \ $(OBJ)/mess/machine/thomson.o \ @@ -1053,9 +1054,6 @@ COREOBJS += \ -# additional tools -TOOLS = dat2html$(EXE) messtest$(EXE) chdman$(EXE) messdocs$(EXE) imgtool$(EXE) - include mess/tools/imgtool/imgtool.mak DAT2HTML_OBJS = \ @@ -1109,3 +1107,11 @@ $(OBJ)/render.o: $(OBJ)/mess/layout/horizont.lh \ $(OBJ)/mess/systems/coco.o: $(OBJ)/mess/layout/coco3.lh + + + +#------------------------------------------------- +# MESS tool targets +#------------------------------------------------- + +TOOLS += dat2html$(EXE) messtest$(EXE) messdocs$(EXE) imgtool$(EXE) diff --git a/mess/messdriv.c b/mess/messdriv.c index 2ebd3d2c3..133cedc83 100644 --- a/mess/messdriv.c +++ b/mess/messdriv.c @@ -222,32 +222,26 @@ TESTDRIVER( pcw16 ) /* 1995 PCW16 */ TESTDRIVER( nc200 ) /* 19?? NC200 */ /* APPLE */ -/* - * CPU Model Month Year - * ------------- ----- ---- - * - * Apple III Plus December 1983 - * Apple IIgs September 1986 - * Apple IIc ROM 4 ? 198? - */ - DRIVER( apple1 ) /* 1976 Apple 1 */ - DRIVER( apple2 ) /* 1977 Apple ][ */ - DRIVER( apple2p ) /* 1979 Apple ][+ */ - DRIVER( apple2e ) /* 1983 Apple //e */ - DRIVER( apple2ee ) /* 1985 Apple //e Enhanced */ - DRIVER( apple2ep ) /* 1987 Apple //e Platinum */ - DRIVER( apple2c ) /* 1984 Apple //c */ - DRIVER( apple2c0 ) /* 1986 Apple //c (3.5 ROM) */ - DRIVER( apple2c3 ) /* 1986 Apple //c (Original Mem. Exp.) */ - DRIVER( apple2cp ) /* 1988 Apple //c+ */ -TESTDRIVER( apple2g0 ) /* 1986 Apple IIgs ROM00 */ - DRIVER( apple2g1 ) /* 1987 Apple IIgs ROM01 */ - DRIVER( apple2gs ) /* 1989 Apple IIgs ROM03 */ - DRIVER( apple3 ) /* 1980 Apple /// */ - DRIVER( ace100 ) /* 1982 Franklin Ace 100 */ - DRIVER( laser128 ) /* 1987 Laser 128 */ - DRIVER( las128ex ) /* 1987 Laser 128 EX */ -TESTDRIVER( las3000 ) /* 1983 Laser 3000 */ + DRIVER( apple1 ) /* Jul 1976 Apple 1 */ + DRIVER( apple2 ) /* Apr 1977 Apple ][ */ + DRIVER( apple2p ) /* Jun 1979 Apple ][+ */ + DRIVER( apple2e ) /* Jan 1983 Apple //e */ + DRIVER( apple2ee ) /* Mar 1985 Apple //e Enhanced */ + DRIVER( apple2ep ) /* Jan 1987 Apple //e Platinum */ + DRIVER( apple2c ) /* Apr 1984 Apple //c */ + DRIVER( apple2c0 ) /* ??? 1985 Apple //c (3.5 ROM) */ + DRIVER( apple2c3 ) /* Sep 1986 Apple //c (Original Mem. Exp.) */ + DRIVER( apple2c4 ) /* ??? 198? Apple //c (rev 4) */ + DRIVER( apple2cp ) /* Sep 1988 Apple //c+ */ +TESTDRIVER( apple2g0 ) /* Sep 1986 Apple IIgs ROM00 */ + DRIVER( apple2g1 ) /* ??? 1987 Apple IIgs ROM01 */ + DRIVER( apple2gs ) /* Aug 1989 Apple IIgs ROM03 */ + DRIVER( apple3 ) /* May 1980 Apple /// */ + /* Dec 1983 Apple ///+ */ + DRIVER( ace100 ) /* ??? 1982 Franklin Ace 100 */ + DRIVER( laser128 ) /* ??? 1987 Laser 128 */ + DRIVER( las128ex ) /* ??? 1987 Laser 128 EX */ +TESTDRIVER( las3000 ) /* ??? 1983 Laser 3000 */ /* * Lisa January 1983 @@ -571,6 +565,7 @@ TESTDRIVER( trs80m3 ) /* TRS-80 Model III - Radio Shack/Tandy */ DRIVER( dragon64 ) /* Dragon 64 */ DRIVER( dgnalpha ) /* Dragon Alpha */ DRIVER( dgnbeta ) /* Dragon Beta */ + DRIVER( tanodr64 ) /* Tano Dragon 64 (NTSC) */ DRIVER( cp400 ) /* Prologica CP400 */ DRIVER( mc10 ) /* MC-10 */ diff --git a/mess/sndhrdw/arcadia.c b/mess/sndhrdw/arcadia.c index 870833caa..9facf4789 100644 --- a/mess/sndhrdw/arcadia.c +++ b/mess/sndhrdw/arcadia.c @@ -35,7 +35,7 @@ void arcadia_soundport_w (int offset, int data) arcadia_sound.pos = 0; arcadia_sound.level = TRUE; // frequency 7874/(data+1) - arcadia_sound.size=options.samplerate*((data&0x7f)+1)/7874; + arcadia_sound.size=Machine->sample_rate*((data&0x7f)+1)/7874; break; } } @@ -73,10 +73,7 @@ static void arcadia_update(void *param,stream_sample_t **inputs, stream_sample_t void *arcadia_custom_start(int clock, const struct CustomSound_interface *config) { - if (!options.samplerate) - return NULL; - - arcadia_sound.channel = stream_create(0, 1, options.samplerate, 0, arcadia_update); + arcadia_sound.channel = stream_create(0, 1, Machine->sample_rate, 0, arcadia_update); return (void *) ~0; } diff --git a/mess/sndhrdw/dai.c b/mess/sndhrdw/dai.c index 624c778f7..66bbaed20 100644 --- a/mess/sndhrdw/dai.c +++ b/mess/sndhrdw/dai.c @@ -109,7 +109,7 @@ static void dai_sh_update(void *param,stream_sample_t **inputs, stream_sample_t /* noise channel */ - *sample_left += mame_rand()&0x01 ? dai_noise_volume_table[dai_noise_volume] : -dai_noise_volume_table[dai_noise_volume]; + *sample_left += mame_rand(Machine)&0x01 ? dai_noise_volume_table[dai_noise_volume] : -dai_noise_volume_table[dai_noise_volume]; sample_left++; sample_right++; diff --git a/mess/sndhrdw/lynx.c b/mess/sndhrdw/lynx.c index b6c58904b..e1973f708 100644 --- a/mess/sndhrdw/lynx.c +++ b/mess/sndhrdw/lynx.c @@ -366,9 +366,9 @@ void lynx_audio_reset(void) void *lynx_custom_start(int clock, const struct CustomSound_interface *config) { - mixer_channel = stream_create(0, 1, options.samplerate, 0, lynx_update); + mixer_channel = stream_create(0, 1, Machine->sample_rate, 0, lynx_update); - usec_per_sample = 1000000 / options.samplerate; + usec_per_sample = 1000000 / Machine->sample_rate; lynx_audio_init(); return (void *) ~0; @@ -378,9 +378,9 @@ void *lynx_custom_start(int clock, const struct CustomSound_interface *config) void *lynx2_custom_start(int clock, const struct CustomSound_interface *config) { - mixer_channel = stream_create(0, 2, options.samplerate, 0, lynx2_update); + mixer_channel = stream_create(0, 2, Machine->sample_rate, 0, lynx2_update); - usec_per_sample = 1000000 / options.samplerate; + usec_per_sample = 1000000 / Machine->sample_rate; lynx_audio_init(); return (void *) ~0; diff --git a/mess/sndhrdw/svision.c b/mess/sndhrdw/svision.c index d32e7989d..d8dc3b55b 100644 --- a/mess/sndhrdw/svision.c +++ b/mess/sndhrdw/svision.c @@ -26,9 +26,9 @@ void svision_soundport_w (SVISION_CHANNEL *channel, int offset, int data) case 1: if (channel->reg[0]) { if (channel==svision_channel) - channel->size=(int)((options.samplerate*channel->reg[0]<<6)/4e6); + channel->size=(int)((Machine->sample_rate*channel->reg[0]<<6)/4e6); else - channel->size=(int)((options.samplerate*channel->reg[0]<<6)/4e6); + channel->size=(int)((Machine->sample_rate*channel->reg[0]<<6)/4e6); } else channel->size=0; channel->pos=0; } @@ -79,7 +79,7 @@ static void svision_update (void *param,stream_sample_t **inputs, stream_sample_ void *svision_custom_start(int clock, const struct CustomSound_interface *config) { - mixer_channel = stream_create(0, 2, options.samplerate, 0, svision_update); + mixer_channel = stream_create(0, 2, Machine->sample_rate, 0, svision_update); return (void *) ~0; } diff --git a/mess/sndhrdw/ted7360.c b/mess/sndhrdw/ted7360.c index 14e189ae5..bcacd60fd 100644 --- a/mess/sndhrdw/ted7360.c +++ b/mess/sndhrdw/ted7360.c @@ -56,7 +56,7 @@ void ted7360_soundport_w (int offset, int data) ted7360[offset] = (ted7360[offset] & ~3) | (data & 3); else ted7360[offset] = data; - tone1samples = options.samplerate / TONE_FREQUENCY (TONE1_VALUE); + tone1samples = Machine->sample_rate / TONE_FREQUENCY (TONE1_VALUE); DBG_LOG (1, "ted7360", ("tone1 %d %d sample:%d\n", TONE1_VALUE, TONE_FREQUENCY(TONE1_VALUE), tone1samples)); @@ -64,11 +64,11 @@ void ted7360_soundport_w (int offset, int data) case 0xf: case 0x10: ted7360[offset] = data; - tone2samples = options.samplerate / TONE_FREQUENCY (TONE2_VALUE); + tone2samples = Machine->sample_rate / TONE_FREQUENCY (TONE2_VALUE); DBG_LOG (1, "ted7360", ("tone2 %d %d sample:%d\n", TONE2_VALUE, TONE_FREQUENCY(TONE2_VALUE), tone2samples)); - noisesamples = (int) ((double) NOISE_FREQUENCY_MAX * options.samplerate + noisesamples = (int) ((double) NOISE_FREQUENCY_MAX * Machine->sample_rate * NOISE_BUFFER_SIZE_SEC / NOISE_FREQUENCY); DBG_LOG (1, "ted7360", ("noise %d sample:%d\n", NOISE_FREQUENCY, noisesamples)); @@ -147,7 +147,7 @@ void *ted7360_custom_start (int clock, const struct CustomSound_interface *confi { int i; - channel = stream_create(0, 1, options.samplerate, 0, ted7360_update); + channel = stream_create(0, 1, Machine->sample_rate, 0, ted7360_update); /* buffer for fastest played sample for 5 second * so we have enough data for min 5 second */ diff --git a/mess/sndhrdw/vc4000.c b/mess/sndhrdw/vc4000.c index 3c4e93555..9481d30b7 100644 --- a/mess/sndhrdw/vc4000.c +++ b/mess/sndhrdw/vc4000.c @@ -31,7 +31,7 @@ void vc4000_soundport_w (int offset, int data) vc4000_sound.pos = 0; vc4000_sound.level = TRUE; // frequency 7874/(data+1) - vc4000_sound.size=options.samplerate*(data+1)/7874; + vc4000_sound.size=Machine->sample_rate*(data+1)/7874; break; } } @@ -69,10 +69,7 @@ static void vc4000_update(void *param,stream_sample_t **inputs, stream_sample_t void *vc4000_custom_start(int clock, const struct CustomSound_interface *config) { - if (!options.samplerate) - return NULL; - - vc4000_sound.channel = stream_create(0, 1, options.samplerate, 0, vc4000_update); + vc4000_sound.channel = stream_create(0, 1, Machine->sample_rate, 0, vc4000_update); return (void *) ~0; } diff --git a/mess/sndhrdw/vic6560.c b/mess/sndhrdw/vic6560.c index 464e3a6fa..0f1cf78ad 100644 --- a/mess/sndhrdw/vic6560.c +++ b/mess/sndhrdw/vic6560.c @@ -80,7 +80,7 @@ void vic6560_soundport_w (int offset, int data) if (!(old & 0x80) && TONE1_ON) { tone1pos = 0; - tone1samples = options.samplerate / TONE1_FREQUENCY; + tone1samples = Machine->sample_rate / TONE1_FREQUENCY; if (tone1samples == 0) tone1samples = 1; } @@ -91,7 +91,7 @@ void vic6560_soundport_w (int offset, int data) if (!(old & 0x80) && TONE2_ON) { tone2pos = 0; - tone2samples = options.samplerate / TONE2_FREQUENCY; + tone2samples = Machine->sample_rate / TONE2_FREQUENCY; if (tone2samples == 0) tone2samples = 1; } @@ -102,7 +102,7 @@ void vic6560_soundport_w (int offset, int data) if (!(old & 0x80) && TONE3_ON) { tone3pos = 0; - tone3samples = options.samplerate / TONE3_FREQUENCY; + tone3samples = Machine->sample_rate / TONE3_FREQUENCY; if (tone2samples == 0) tone2samples = 1; } @@ -112,7 +112,7 @@ void vic6560_soundport_w (int offset, int data) vic6560[offset] = data; if (NOISE_ON) { - noisesamples = (int) ((double) NOISE_FREQUENCY_MAX * options.samplerate + noisesamples = (int) ((double) NOISE_FREQUENCY_MAX * Machine->sample_rate * NOISE_BUFFER_SIZE_SEC / NOISE_FREQUENCY); DBG_LOG (1, "vic6560", (errorlog, "noise %.2x %d sample:%d\n", data, NOISE_FREQUENCY, noisesamples)); @@ -154,7 +154,7 @@ static void vic6560_update (void *param,stream_sample_t **inputs, stream_sample_ if (tone1pos >= tone1samples) { tone1pos = 0; - tone1samples = options.samplerate / TONE1_FREQUENCY; + tone1samples = Machine->sample_rate / TONE1_FREQUENCY; if (tone1samples == 0) tone1samples = 1; } @@ -170,7 +170,7 @@ static void vic6560_update (void *param,stream_sample_t **inputs, stream_sample_ if (tone2pos >= tone2samples) { tone2pos = 0; - tone2samples = options.samplerate / TONE2_FREQUENCY; + tone2samples = Machine->sample_rate / TONE2_FREQUENCY; if (tone2samples == 0) tone2samples = 1; } @@ -186,7 +186,7 @@ static void vic6560_update (void *param,stream_sample_t **inputs, stream_sample_ if (tone3pos >= tone3samples) { tone3pos = 0; - tone3samples = options.samplerate / TONE3_FREQUENCY; + tone3samples = Machine->sample_rate / TONE3_FREQUENCY; if (tone3samples == 0) tone3samples = 1; } @@ -222,8 +222,7 @@ void *vic6560_custom_start(int clock, const struct CustomSound_interface *config { int i; - channel = stream_create(0, 1, options.samplerate, 0, vic6560_update); - + channel = stream_create(0, 1, Machine->sample_rate, 0, vic6560_update); /* buffer for fastest played sample for 5 second * so we have enough data for min 5 second */ @@ -259,13 +258,20 @@ void *vic6560_custom_start(int clock, const struct CustomSound_interface *config noiseshift <<= 1; } } - tonesize = options.samplerate / TONE_FREQUENCY_MIN; + tonesize = Machine->sample_rate / TONE_FREQUENCY_MIN; - tone = (INT16*) auto_malloc (tonesize * sizeof (tone[0])); + if (tonesize > 0) + { + tone = (INT16*) auto_malloc (tonesize * sizeof (tone[0])); - for (i = 0; i < tonesize; i++) + for (i = 0; i < tonesize; i++) + { + tone[i] = (INT16)(sin (2 * M_PI * i / tonesize) * 127 + 0.5); + } + } + else { - tone[i] = (INT16)(sin (2 * M_PI * i / tonesize) * 127 + 0.5); + tone = NULL; } return (void *) ~0; } diff --git a/mess/sound/sid.c b/mess/sound/sid.c index 522e35b22..313a64be0 100644 --- a/mess/sound/sid.c +++ b/mess/sound/sid.c @@ -20,8 +20,8 @@ #include "sidenvel.h" #include "sid.h" -float filterTable[0x800]; -float bandPassParam[0x800]; +static float *filterTable; +static float *bandPassParam; #define lowPassParam filterTable float filterResTable[16]; @@ -159,7 +159,6 @@ void filterTableInit(void) /* by purpose. */ const float filterRefFreq = 44100.0; -/* extern float filterTable[0x800]; */ float yMax = 1.0; float yMin = 0.01; float yAdd; @@ -169,11 +168,14 @@ void filterTableInit(void) float resDyMin; float resDy; + filterTable = auto_malloc(sizeof(*filterTable) * 0x800); + bandPassParam = auto_malloc(sizeof(*bandPassParam) * 0x800); + uk = 0; for ( rk = 0; rk < 0x800; rk++ ) { filterTable[uk] = (((exp(rk/0x800*log(400.0))/60.0)+0.05) - *filterRefFreq) / options.samplerate; + *filterRefFreq) / Machine->sample_rate; if ( filterTable[uk] < yMin ) filterTable[uk] = yMin; if ( filterTable[uk] > yMax ) @@ -190,7 +192,7 @@ void filterTableInit(void) /* Some C++ compilers still have non-local scope! */ for ( rk2 = 0; rk2 < 0x800; rk2++ ) { - bandPassParam[uk] = (yTmp*filterRefFreq) / options.samplerate; + bandPassParam[uk] = (yTmp*filterRefFreq) / Machine->sample_rate; yTmp += yAdd; uk++; } @@ -247,80 +249,81 @@ void sid6581_init (SID6581 *This) void sid6581_port_w (SID6581 *This, int offset, int data) { - DBG_LOG (1, "sid6581 write", ("offset %.2x value %.2x\n", offset, data)); - offset &= 0x1f; + DBG_LOG (1, "sid6581 write", ("offset %.2x value %.2x\n", offset, data)); + offset &= 0x1f; - switch (offset) - { - case 0x19: case 0x1a: case 0x1b: case 0x1c: - case 0x1d: - case 0x1e: - case 0x1f: - break; - case 0x15: case 0x16: case 0x17: - case 0x18: - stream_update(This->mixer_channel,0); - This->reg[offset] = data; - This->masterVolume = ( This->reg[0x18] & 15 ); - This->masterVolumeAmplIndex = This->masterVolume << 8; - - if ((This->reg[0x18]&0x80) && - ((This->reg[0x17]&This->optr3.filtVoiceMask)==0)) - This->optr3_outputmask = 0; /* off */ - else - This->optr3_outputmask = ~0; /* on */ - - This->filter.Type = This->reg[0x18] & 0x70; - if (This->filter.Type != This->filter.CurType) - { - This->filter.CurType = This->filter.Type; - This->optr1.filtLow = (This->optr1.filtRef = 0); - This->optr2.filtLow = (This->optr2.filtRef = 0); - This->optr3.filtLow = (This->optr3.filtRef = 0); - } - if ( This->filter.Enabled ) + switch (offset) { - This->filter.Value = 0x7ff & ( (This->reg[0x15]&7) | ( (UINT16)This->reg[0x16] << 3 )); - if (This->filter.Type == 0x20) - This->filter.Dy = bandPassParam[This->filter.Value]; - else - This->filter.Dy = lowPassParam[This->filter.Value]; - This->filter.ResDy = filterResTable[This->reg[0x17] >> 4] - This->filter.Dy; - if ( This->filter.ResDy < 1.0 ) - This->filter.ResDy = 1.0; - } - - sidEmuSet( &This->optr1 ); - sidEmuSet( &This->optr3 ); - sidEmuSet( &This->optr2 ); - - // relies on sidEmuSet also for other channels! - sidEmuSet2( &This->optr1 ); - sidEmuSet2( &This->optr2 ); - sidEmuSet2( &This->optr3 ); - - break; - default: - stream_update(This->mixer_channel,0); - This->reg[offset] = data; + case 0x19: case 0x1a: case 0x1b: case 0x1c: + case 0x1d: + case 0x1e: + case 0x1f: + break; + case 0x15: case 0x16: case 0x17: + case 0x18: + stream_update(This->mixer_channel,0); + This->reg[offset] = data; + This->masterVolume = ( This->reg[0x18] & 15 ); + This->masterVolumeAmplIndex = This->masterVolume << 8; + + if ((This->reg[0x18]&0x80) && + ((This->reg[0x17]&This->optr3.filtVoiceMask)==0)) + This->optr3_outputmask = 0; /* off */ + else + This->optr3_outputmask = ~0; /* on */ - if (offset<7) { - This->optr1.reg[offset] = data; - } else if (offset<14) { - This->optr2.reg[offset-7] = data; - } else if (offset<21) { - This->optr3.reg[offset-14] = data; + This->filter.Type = This->reg[0x18] & 0x70; + if (This->filter.Type != This->filter.CurType) + { + This->filter.CurType = This->filter.Type; + This->optr1.filtLow = (This->optr1.filtRef = 0); + This->optr2.filtLow = (This->optr2.filtRef = 0); + This->optr3.filtLow = (This->optr3.filtRef = 0); + } + if ( This->filter.Enabled ) + { + This->filter.Value = 0x7ff & ( (This->reg[0x15]&7) | ( (UINT16)This->reg[0x16] << 3 )); + if (This->filter.Type == 0x20) + This->filter.Dy = bandPassParam ? bandPassParam[This->filter.Value] : 0.0; + else + This->filter.Dy = lowPassParam ? lowPassParam[This->filter.Value] : 0.0; + This->filter.ResDy = filterResTable[This->reg[0x17] >> 4] - This->filter.Dy; + if ( This->filter.ResDy < 1.0 ) + This->filter.ResDy = 1.0; + } + + sidEmuSet( &This->optr1 ); + sidEmuSet( &This->optr3 ); + sidEmuSet( &This->optr2 ); + + // relies on sidEmuSet also for other channels! + sidEmuSet2( &This->optr1 ); + sidEmuSet2( &This->optr2 ); + sidEmuSet2( &This->optr3 ); + break; + + default: + stream_update(This->mixer_channel,0); + This->reg[offset] = data; + + if (offset<7) { + This->optr1.reg[offset] = data; + } else if (offset<14) { + This->optr2.reg[offset-7] = data; + } else if (offset<21) { + This->optr3.reg[offset-14] = data; + } + + sidEmuSet( &This->optr1 ); + sidEmuSet( &This->optr3 ); + sidEmuSet( &This->optr2 ); + + // relies on sidEmuSet also for other channels! + sidEmuSet2( &This->optr1 ); + sidEmuSet2( &This->optr2 ); + sidEmuSet2( &This->optr3 ); + break; } - - sidEmuSet( &This->optr1 ); - sidEmuSet( &This->optr3 ); - sidEmuSet( &This->optr2 ); - - // relies on sidEmuSet also for other channels! - sidEmuSet2( &This->optr1 ); - sidEmuSet2( &This->optr2 ); - sidEmuSet2( &This->optr3 ); - } } int sid6581_port_r (SID6581 *This, int offset) diff --git a/mess/sound/sid6581.c b/mess/sound/sid6581.c index 1039bea18..3a23f5d9e 100644 --- a/mess/sound/sid6581.c +++ b/mess/sound/sid6581.c @@ -38,8 +38,8 @@ static void *sid_start(int sndindex, int clock, const void *config, SIDTYPE sidt sid = (SID6581 *) auto_malloc(sizeof(*sid)); memset(sid, 0, sizeof(*sid)); - sid->mixer_channel = stream_create (0, 1, options.samplerate, (void *) sid, sid_update); - sid->PCMfreq = options.samplerate; + sid->mixer_channel = stream_create (0, 1, Machine->sample_rate, (void *) sid, sid_update); + sid->PCMfreq = Machine->sample_rate; sid->clock = clock; sid->ad_read = iface ? iface->ad_read : NULL; sid->type = sidtype; diff --git a/mess/sound/sound.mak b/mess/sound/sound.mak index af334a575..1f727999f 100644 --- a/mess/sound/sound.mak +++ b/mess/sound/sound.mak @@ -5,13 +5,6 @@ else SOUNDDEFS += -DHAS_BEEP=0 endif -ifneq ($(filter SPEAKER,$(SOUNDS)),) -SOUNDDEFS += -DHAS_SPEAKER=1 -SOUNDOBJS += $(OBJ)/mess/sound/speaker.o -else -SOUNDDEFS += -DHAS_SPEAKER=0 -endif - ifneq ($(filter WAVE,$(SOUNDS)),) SOUNDDEFS += -DHAS_WAVE=1 SOUNDOBJS += $(OBJ)/mess/sound/wave.o diff --git a/mess/systems/a7800.c b/mess/systems/a7800.c index 0279598b8..7bfe573dc 100644 --- a/mess/systems/a7800.c +++ b/mess/systems/a7800.c @@ -246,7 +246,7 @@ static unsigned short a7800_colortable[] = static PALETTE_INIT(a7800) { - palette_set_colors(0, a7800_palette, sizeof(a7800_palette) / 3); + palette_set_colors(machine, 0, a7800_palette, sizeof(a7800_palette) / 3); memcpy(colortable,a7800_colortable,sizeof(a7800_colortable)); } @@ -254,7 +254,7 @@ static PALETTE_INIT(a7800) static PALETTE_INIT(a7800p) { - palette_set_colors(0, a7800p_palette, sizeof(a7800p_palette) / 3); + palette_set_colors(machine, 0, a7800p_palette, sizeof(a7800p_palette) / 3); memcpy(colortable,a7800_colortable,sizeof(a7800_colortable)); } diff --git a/mess/systems/abc80.c b/mess/systems/abc80.c index 61bf1f810..6159d4f2e 100644 --- a/mess/systems/abc80.c +++ b/mess/systems/abc80.c @@ -108,30 +108,30 @@ static unsigned short colortable_abc800c[] = static PALETTE_INIT( abc80 ) { - palette_set_color( 0, 0x00, 0x00, 0x00); // black - palette_set_color( 1, 0xff, 0xff, 0xff); // white + palette_set_color(machine, 0, 0x00, 0x00, 0x00); // black + palette_set_color(machine, 1, 0xff, 0xff, 0xff); // white memcpy(colortable, colortable_abc80, sizeof(colortable_abc80)); } static PALETTE_INIT( abc800m ) { - palette_set_color( 0, 0x00, 0x00, 0x00); // black - palette_set_color( 1, 0xff, 0xff, 0x00); // yellow (really white, but blue signal is disconnected from monitor) + palette_set_color(machine, 0, 0x00, 0x00, 0x00); // black + palette_set_color(machine, 1, 0xff, 0xff, 0x00); // yellow (really white, but blue signal is disconnected from monitor) memcpy(colortable, colortable_abc80, sizeof(colortable_abc80)); } static PALETTE_INIT( abc800c ) // probably wrong { - palette_set_color( 0, 0x00, 0x00, 0x00); // black - palette_set_color( 1, 0x00, 0x00, 0xff); // blue - palette_set_color( 2, 0xff, 0x00, 0x00); // red - palette_set_color( 3, 0xff, 0x00, 0xff); // magenta - palette_set_color( 4, 0x00, 0xff, 0x00); // green - palette_set_color( 5, 0x00, 0xff, 0xff); // cyan - palette_set_color( 6, 0xff, 0xff, 0x00); // yellow - palette_set_color( 7, 0xff, 0xff, 0xff); // white + palette_set_color(machine, 0, 0x00, 0x00, 0x00); // black + palette_set_color(machine, 1, 0x00, 0x00, 0xff); // blue + palette_set_color(machine, 2, 0xff, 0x00, 0x00); // red + palette_set_color(machine, 3, 0xff, 0x00, 0xff); // magenta + palette_set_color(machine, 4, 0x00, 0xff, 0x00); // green + palette_set_color(machine, 5, 0x00, 0xff, 0xff); // cyan + palette_set_color(machine, 6, 0xff, 0xff, 0x00); // yellow + palette_set_color(machine, 7, 0xff, 0xff, 0xff); // white memcpy(colortable, colortable_abc800c, sizeof(colortable_abc800c)); } diff --git a/mess/systems/apexc.c b/mess/systems/apexc.c index 011655f89..4f27923c0 100644 --- a/mess/systems/apexc.c +++ b/mess/systems/apexc.c @@ -482,7 +482,7 @@ static const int var_teletyper_scroll_step = - teletyper_scroll_step; static PALETTE_INIT( apexc ) { - palette_set_colors(0, apexc_palette, APEXC_PALETTE_SIZE); + palette_set_colors(machine, 0, apexc_palette, APEXC_PALETTE_SIZE); memcpy(colortable, & apexc_colortable, sizeof(apexc_colortable)); } @@ -662,7 +662,7 @@ enum }; /* apexc driver init : builds a font for use by the teletyper */ -static void init_apexc(void) +static DRIVER_INIT(apexc) { UINT8 *dst; diff --git a/mess/systems/apple1.c b/mess/systems/apple1.c index 99bb5a455..5415b970d 100644 --- a/mess/systems/apple1.c +++ b/mess/systems/apple1.c @@ -148,7 +148,7 @@ static unsigned short apple1_colortable[] = static PALETTE_INIT( apple1 ) { - palette_set_colors(0, apple1_palette, sizeof(apple1_palette) / 3); + palette_set_colors(machine, 0, apple1_palette, sizeof(apple1_palette) / 3); memcpy(colortable, apple1_colortable, sizeof (apple1_colortable)); } diff --git a/mess/systems/apple2.c b/mess/systems/apple2.c index f5f730bcb..4b9c48351 100644 --- a/mess/systems/apple2.c +++ b/mess/systems/apple2.c @@ -625,7 +625,7 @@ static const unsigned short apple2_colortable[] = /* Initialize the palette */ PALETTE_INIT( apple2 ) { - palette_set_colors(0, apple2_palette, sizeof(apple2_palette) / 3); + palette_set_colors(machine, 0, apple2_palette, sizeof(apple2_palette) / 3); memcpy(colortable, apple2_colortable, sizeof(apple2_colortable)); } @@ -815,6 +815,15 @@ ROM_START(apple2c3) ROM_LOAD("a2c.256", 0x0000, 0x8000, CRC(bc5a79ff) SHA1(5338d9baa7ae202457b6500fde5883dbdc86e5d3)) ROM_END +ROM_START(apple2c4) + ROM_REGION(0x2000,REGION_GFX1,0) + ROM_LOAD ( "a2e.chr", 0x0000, 0x1000,CRC(b081df66) SHA1(7060de104046736529c1e8a687a0dd7b84f8c51b)) + ROM_LOAD ( "a2eealt.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) + + ROM_REGION(0x8700,REGION_CPU1,0) + ROM_LOAD("a2c.256", 0x0000, 0x8000, CRC(06f53328) SHA1(015061597c4cda7755aeb88b735994ffd2f235ca)) +ROM_END + ROM_START(laser128) ROM_REGION(0x2000,REGION_GFX1,0) ROM_LOAD ( "a2e.chr", 0x0000, 0x1000,CRC(b081df66) SHA1(7060de104046736529c1e8a687a0dd7b84f8c51b)) @@ -916,4 +925,5 @@ COMP( 1987, laser128, 0, apple2c0, apple2c, apple2e, 0, apple2e, "Vid COMP( 1987, las128ex, apple2c, 0, apple2c, apple2e, 0, apple2e, "Video Technology", "Laser 128ex (rev 4a)", GAME_NOT_WORKING ) COMP( 1985, apple2c0, apple2c, 0, apple2c, apple2e, 0, apple2e, "Apple Computer", "Apple //c (UniDisk 3.5)" , 0) COMP( 1986, apple2c3, apple2c, 0, apple2c, apple2e, 0, apple2e, "Apple Computer", "Apple //c (Original Memory Expansion)" , 0) +COMP( 1986, apple2c4, apple2c, 0, apple2c, apple2e, 0, apple2e, "Apple Computer", "Apple //c (rev 4)" , GAME_NOT_WORKING ) COMP( 1988, apple2cp, apple2c, 0, apple2c, apple2e, 0, apple2e, "Apple Computer", "Apple //c Plus" , 0) diff --git a/mess/systems/apple2gs.c b/mess/systems/apple2gs.c index f7dca027e..18145d891 100644 --- a/mess/systems/apple2gs.c +++ b/mess/systems/apple2gs.c @@ -97,8 +97,8 @@ INPUT_PORTS_END static PALETTE_INIT( apple2gs ) { extern PALETTE_INIT( apple2 ); - palette_init_apple2(colortable, color_prom); - palette_set_colors(0, apple2gs_palette, sizeof(apple2gs_palette) / 3); + palette_init_apple2(machine, colortable, color_prom); + palette_set_colors(machine, 0, apple2gs_palette, sizeof(apple2gs_palette) / 3); } static READ8_HANDLER( apple2gs_adc_read ) diff --git a/mess/systems/aquarius.c b/mess/systems/aquarius.c index 1ed83021e..2638fa243 100644 --- a/mess/systems/aquarius.c +++ b/mess/systems/aquarius.c @@ -113,7 +113,7 @@ static unsigned short aquarius_colortable[] = static PALETTE_INIT( aquarius ) { - palette_set_colors(0, aquarius_palette, sizeof(aquarius_palette) / 3); + palette_set_colors(machine, 0, aquarius_palette, sizeof(aquarius_palette) / 3); memcpy(colortable, aquarius_colortable, sizeof (aquarius_colortable)); } diff --git a/mess/systems/arcadia.c b/mess/systems/arcadia.c index e7abb5e4a..c1d944c26 100644 --- a/mess/systems/arcadia.c +++ b/mess/systems/arcadia.c @@ -215,7 +215,7 @@ static unsigned short arcadia_colortable[1][2] = { static PALETTE_INIT( arcadia ) { - palette_set_colors(0, arcadia_palette, sizeof (arcadia_palette)/3); + palette_set_colors(machine, 0, arcadia_palette, sizeof (arcadia_palette)/3); memcpy(colortable, arcadia_colortable,sizeof(arcadia_colortable)); } @@ -349,7 +349,7 @@ SYSTEM_CONFIG_END ***************************************************************************/ -static void init_arcadia(void) +static DRIVER_INIT( arcadia ) { int i; UINT8 *gfx=memory_region(REGION_GFX1); diff --git a/mess/systems/atari.c b/mess/systems/atari.c index 8294d749c..2043e8aec 100644 --- a/mess/systems/atari.c +++ b/mess/systems/atari.c @@ -664,7 +664,7 @@ static unsigned short atari_colortable[] = /* Initialise the palette */ static PALETTE_INIT( atari ) { - palette_set_colors(0, atari_palette, sizeof(atari_palette) / 3); + palette_set_colors(machine, 0, atari_palette, sizeof(atari_palette) / 3); memcpy(colortable,atari_colortable,sizeof(atari_colortable)); } diff --git a/mess/systems/atarist.c b/mess/systems/atarist.c index 6fb5ec4a4..b2f7ceb28 100644 --- a/mess/systems/atarist.c +++ b/mess/systems/atarist.c @@ -112,7 +112,7 @@ static VIDEO_START( atarist ) { int i; for (i=0; i<512; i++) - palette_set_color(i,((i>>6)&7)*0x24,((i>>3)&7)*0x24,(i&7)*0x24); + palette_set_color(machine, i,((i>>6)&7)*0x24,((i>>3)&7)*0x24,(i&7)*0x24); return 0; } diff --git a/mess/systems/avigo.c b/mess/systems/avigo.c index 62391336d..0be99af95 100644 --- a/mess/systems/avigo.c +++ b/mess/systems/avigo.c @@ -410,7 +410,7 @@ static OPBASE_HANDLER( avigo_opbase_handler ) return address; } -static void avigo_machine_reset(void) +static void avigo_machine_reset(running_machine *machine) { int i; unsigned char *addr; @@ -501,7 +501,7 @@ static void avigo_machine_reset(void) avigo_refresh_memory(); } -static void avigo_machine_stop(void) +static void avigo_machine_stop(running_machine *machine) { /* store and free flash memory */ amd_flash_store(0, "avigof1.nv"); @@ -520,8 +520,8 @@ static MACHINE_START( avigo ) /* an interrupt is generated when the pen is pressed to the screen */ timer_pulse(TIME_IN_HZ(50), 0, avigo_dummy_timer_callback); - add_reset_callback(avigo_machine_reset); - add_exit_callback(avigo_machine_stop); + add_reset_callback(machine, avigo_machine_reset); + add_exit_callback(machine, avigo_machine_stop); return 0; } diff --git a/mess/systems/bbc.c b/mess/systems/bbc.c index 21a8ca573..bc68b4cab 100644 --- a/mess/systems/bbc.c +++ b/mess/systems/bbc.c @@ -308,7 +308,7 @@ unsigned char bbc_palette[8*3]= static PALETTE_INIT( bbc ) { - palette_set_colors(0, bbc_palette, sizeof(bbc_palette) / 3); + palette_set_colors(machine, 0, bbc_palette, sizeof(bbc_palette) / 3); memcpy(colortable,bbc_colour_table,sizeof(bbc_colour_table)); } diff --git a/mess/systems/c128.c b/mess/systems/c128.c index d938e92a4..67538aaef 100644 --- a/mess/systems/c128.c +++ b/mess/systems/c128.c @@ -970,8 +970,8 @@ static PALETTE_INIT( c128 ) { int i; - palette_set_colors(0, vic2_palette, sizeof(vic2_palette) / 3); - palette_set_colors(sizeof(vic2_palette) / 3, vdc8563_palette, sizeof(vdc8563_palette) / 3); + palette_set_colors(machine, 0, vic2_palette, sizeof(vic2_palette) / 3); + palette_set_colors(machine, sizeof(vic2_palette) / 3, vdc8563_palette, sizeof(vdc8563_palette) / 3); for (i=0; i<0x100; i++) { colortable[i*2]=0x10+((i&0xf0)>>4); diff --git a/mess/systems/c16.c b/mess/systems/c16.c index 0305e4889..2be0ca13b 100644 --- a/mess/systems/c16.c +++ b/mess/systems/c16.c @@ -594,7 +594,7 @@ INPUT_PORTS_END /* Initialise the c16 palette */ static PALETTE_INIT( c16 ) { - palette_set_colors(0, ted7360_palette, sizeof(ted7360_palette) / 3); + palette_set_colors(machine, 0, ted7360_palette, sizeof(ted7360_palette) / 3); } #if 0 @@ -782,14 +782,14 @@ static MACHINE_DRIVER_START( c364 ) MDRV_CPU_PROGRAM_MAP(c364_readmem, c364_writemem) MACHINE_DRIVER_END -#define init_c16 c16_driver_init -#define init_c16hun c16_driver_init -#define init_c16c c16_driver_init -#define init_c16v c16_driver_init -#define init_plus4 c16_driver_init -#define init_plus4c c16_driver_init -#define init_plus4v c16_driver_init -#define init_c364 c16_driver_init +DRIVER_INIT( c16 ) { c16_driver_init(); } +DRIVER_INIT( c16hun ) { c16_driver_init(); } +DRIVER_INIT( c16c ) { c16_driver_init(); } +DRIVER_INIT( c16v ) { c16_driver_init(); } +DRIVER_INIT( plus4 ) { c16_driver_init(); } +DRIVER_INIT( plus4c ) { c16_driver_init(); } +DRIVER_INIT( plus4v ) { c16_driver_init(); } +DRIVER_INIT( c364 ) { c16_driver_init(); } static void c16cart_device_getinfo(const device_class *devclass, UINT32 state, union devinfo *info) { diff --git a/mess/systems/c64.c b/mess/systems/c64.c index c3860f506..0d6952b8a 100644 --- a/mess/systems/c64.c +++ b/mess/systems/c64.c @@ -543,7 +543,7 @@ static PALETTE_INIT( pet64 ) { int i; for (i=0; i<16; i++) - palette_set_color(i, 0, vic2_palette[i*3+1], 0); + palette_set_color(machine, i, 0, vic2_palette[i*3+1], 0); } ROM_START (ultimax) diff --git a/mess/systems/c65.c b/mess/systems/c65.c index 7406ea84f..cc3649119 100644 --- a/mess/systems/c65.c +++ b/mess/systems/c65.c @@ -265,7 +265,7 @@ INPUT_PORTS_END static PALETTE_INIT( c65 ) { - palette_set_colors(0, vic3_palette, sizeof(vic3_palette) / 3); + palette_set_colors(machine, 0, vic3_palette, sizeof(vic3_palette) / 3); } #if 0 @@ -342,6 +342,7 @@ static MACHINE_DRIVER_START( c65 ) MDRV_IMPORT_FROM( vh_vic2 ) MDRV_SCREEN_SIZE(656, 416) MDRV_VISIBLE_AREA(0, 656 - 1, 0, 416 - 1) + MDRV_PALETTE_LENGTH(sizeof(vic3_palette) / sizeof(vic3_palette[0]) / 3) MDRV_PALETTE_INIT( c65 ) /* sound hardware */ @@ -365,9 +366,9 @@ static MACHINE_DRIVER_START( c65pal ) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "left", 0.50) MACHINE_DRIVER_END -#define init_c65 c65_driver_init -#define init_c65_alpha1 c65_driver_init -#define init_c65pal c65pal_driver_init +static DRIVER_INIT( c65 ) { c65_driver_init(); } +static DRIVER_INIT( c65_alpha1 ) { c65_driver_init(); } +static DRIVER_INIT( c65pal ) { c65pal_driver_init(); } static void c65_quickload_getinfo(const device_class *devclass, UINT32 state, union devinfo *info) { diff --git a/mess/systems/cbmb.c b/mess/systems/cbmb.c index 74a78a93a..4ad00a596 100644 --- a/mess/systems/cbmb.c +++ b/mess/systems/cbmb.c @@ -732,7 +732,7 @@ static gfx_decode cbm700_gfxdecodeinfo[] = static PALETTE_INIT( cbm700 ) { - palette_set_colors(0, cbm700_palette, sizeof(cbm700_palette) / 3); + palette_set_colors(machine, 0, cbm700_palette, sizeof(cbm700_palette) / 3); memcpy(colortable,cbmb_colortable,sizeof(cbmb_colortable)); } @@ -930,11 +930,11 @@ static MACHINE_DRIVER_START( cbm500 ) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MACHINE_DRIVER_END -#define init_cbm500 cbm500_driver_init -#define init_cbm600 cbm600_driver_init -#define init_cbm600hu cbm600hu_driver_init -#define init_cbm600pal cbm600pal_driver_init -#define init_cbm700 cbm700_driver_init +static DRIVER_INIT( cbm500 ) { cbm500_driver_init(); } +static DRIVER_INIT( cbm600 ) { cbm600_driver_init(); } +static DRIVER_INIT( cbm600hu ) { cbm600hu_driver_init(); } +static DRIVER_INIT( cbm600pal ) { cbm600pal_driver_init(); } +static DRIVER_INIT( cbm700 ) { cbm700_driver_init(); } static void cbmb_cbmcartslot_getinfo(const device_class *devclass, UINT32 state, union devinfo *info) { diff --git a/mess/systems/cgenie.c b/mess/systems/cgenie.c index db5d6af46..0c1af72e5 100644 --- a/mess/systems/cgenie.c +++ b/mess/systems/cgenie.c @@ -355,7 +355,7 @@ static unsigned short cgenie_colortable[] = /* Initialise the palette */ static PALETTE_INIT( cgenie ) { - palette_set_colors(0, cgenie_palette, sizeof(cgenie_palette) / 3); + palette_set_colors(machine, 0, cgenie_palette, sizeof(cgenie_palette) / 3); memcpy(colortable, cgenie_colortable, sizeof(cgenie_colortable)); } diff --git a/mess/systems/coco.c b/mess/systems/coco.c index 38ce3923d..ed0fb70f2 100644 --- a/mess/systems/coco.c +++ b/mess/systems/coco.c @@ -554,6 +554,29 @@ static MACHINE_DRIVER_START( dgnalpha ) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75) MACHINE_DRIVER_END +static MACHINE_DRIVER_START( tanodr64 ) + /* basic machine hardware */ + MDRV_CPU_ADD_TAG("main", M6809E, COCO_CPU_SPEED_HZ) /* 0,894886 Mhz */ + MDRV_CPU_PROGRAM_MAP(d64_map, 0) + MDRV_FRAMES_PER_SECOND(COCO_FRAMES_PER_SECOND) /* Tano Dragon 64 is NTSC */ + + MDRV_MACHINE_START( tanodr64 ) + + /* video hardware */ + MDRV_VIDEO_START(dragon) + MDRV_VIDEO_UPDATE(m6847) + MDRV_VIDEO_ATTRIBUTES(VIDEO_RGB_DIRECT | VIDEO_NEEDS_6BITS_PER_GUN) + MDRV_SCREEN_SIZE(320, 25+192+26) + MDRV_VISIBLE_AREA(0, 319, 1, 239) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + MDRV_SOUND_ADD(DAC, 0) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + MDRV_SOUND_ADD(WAVE, 0) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_DRIVER_END + static MACHINE_DRIVER_START( coco ) /* basic machine hardware */ MDRV_CPU_ADD_TAG("main", M6809E, COCO_CPU_SPEED_HZ) /* 0,894886 Mhz */ @@ -690,6 +713,13 @@ ROM_START(dragon64) ROM_LOAD_OPTIONAL( "ddos10.rom", 0x4000, 0x2000, CRC(b44536f6) SHA1(a8918c71d319237c1e3155bb38620acb114a80bc)) ROM_END +ROM_START(tanodr64) + ROM_REGION(0x10000,REGION_CPU1,0) + ROM_LOAD( "d64_1.rom", 0x0000, 0x4000, CRC(60a4634c) SHA1(f119506eaa3b4b70b9aa0dd83761e8cbe043d042)) + ROM_LOAD( "d64_2.rom", 0x8000, 0x4000, CRC(17893a42) SHA1(e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e)) + ROM_LOAD_OPTIONAL( "sdtandy.rom", 0x4000, 0x2000, CRC(d4a9bfd1) SHA1(1db0ccaeb7ac63461f98ef091fa02ddd1fef9bac)) +ROM_END + ROM_START(dgnalpha) ROM_REGION(0x10000,REGION_CPU1,1) ROM_LOAD( "alpha_bt.rom", 0x2000, 0x2000, CRC(c3dab585) SHA1(4a5851aa66eb426e9bb0bba196f1e02d48156068)) @@ -1022,6 +1052,11 @@ SYSTEM_CONFIG_START(dragon64) CONFIG_RAM_DEFAULT (64 * 1024) SYSTEM_CONFIG_END +SYSTEM_CONFIG_START(tanodr64) + CONFIG_IMPORT_FROM ( generic_dragon ) + CONFIG_RAM_DEFAULT (64 * 1024) +SYSTEM_CONFIG_END + SYSTEM_CONFIG_START(dgnalpha) CONFIG_IMPORT_FROM ( generic_dragon ) CONFIG_RAM_DEFAULT (64 * 1024) @@ -1037,5 +1072,6 @@ COMP( 1986, coco3p, coco, 0, coco3p, coco3, 0, coco3, "Tandy Radio Shack COMP( 19??, coco3h, coco, 0, coco3h, coco3, 0, coco3, "Tandy Radio Shack", "Color Computer 3 (NTSC; HD6309)", GAME_COMPUTER_MODIFIED) COMP( 1982, dragon32, coco, 0, dragon32, dragon32, 0, dragon32, "Dragon Data Ltd", "Dragon 32" , 0) COMP( 1983, dragon64, coco, 0, dragon64, dragon32, 0, dragon64, "Dragon Data Ltd", "Dragon 64" , 0) +COMP( 1983, tanodr64, coco, 0, tanodr64, dragon32, 0, tanodr64, "Dragon Data Ltd/Tano Ltd","Tano Dragon 64 (NTSC)" , 0) COMP( 1984, dgnalpha, coco, 0, dgnalpha, dragon32, 0, dgnalpha, "Dragon Data Ltd", "Dragon Alpha Prototype" , 0) COMP( 1984, cp400, coco, 0, coco, coco, 0, coco, "Prologica", "CP400" , 0) diff --git a/mess/systems/comquest.c b/mess/systems/comquest.c index 23fe1bdfb..e1f9c3385 100644 --- a/mess/systems/comquest.c +++ b/mess/systems/comquest.c @@ -215,7 +215,7 @@ static unsigned short comquest_colortable[1][2] = { static PALETTE_INIT( comquest ) { - palette_set_colors(0, comquest_palette, sizeof(comquest_palette) / 3); + palette_set_colors(machine, 0, comquest_palette, sizeof(comquest_palette) / 3); memcpy(colortable, comquest_colortable,sizeof(comquest_colortable)); } diff --git a/mess/systems/concept.c b/mess/systems/concept.c index 11686b220..555130397 100644 --- a/mess/systems/concept.c +++ b/mess/systems/concept.c @@ -49,8 +49,8 @@ ADDRESS_MAP_END /* Is the palette black on white or white on black??? */ static PALETTE_INIT( concept ) { - palette_set_color(0, 0xff, 0xff, 0xff); - palette_set_color(1, 0x00, 0x00, 0x00); + palette_set_color(machine, 0, 0xff, 0xff, 0xff); + palette_set_color(machine, 1, 0x00, 0x00, 0x00); } /* concept machine */ diff --git a/mess/systems/coupe.c b/mess/systems/coupe.c index f7011a6ed..c6c7895c4 100644 --- a/mess/systems/coupe.c +++ b/mess/systems/coupe.c @@ -397,7 +397,7 @@ static PALETTE_INIT( coupe ) if (a&0x40) green+=4*36; - palette_set_color(a, red, green, blue); + palette_set_color(machine, a, red, green, blue); coupe_colortable[a]=a; } memcpy(colortable,coupe_colortable,sizeof(coupe_colortable)); diff --git a/mess/systems/cpschngr.c b/mess/systems/cpschngr.c index 74a19f689..9797e0854 100644 --- a/mess/systems/cpschngr.c +++ b/mess/systems/cpschngr.c @@ -54,17 +54,17 @@ INPUT_PORTS_START( sfzch ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON6) PORT_PLAYER(1) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON6) PORT_PLAYER(2) - PORT_START /* DSWA */ + PORT_START_TAG("DSWA") PORT_DIPNAME( 0xff, 0xff, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0xff, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START /* DSWB */ + PORT_START_TAG("DSWB") PORT_DIPNAME( 0xff, 0xff, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0xff, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START /* DSWC */ + PORT_START_TAG("DSWC") PORT_DIPNAME( 0xff, 0xff, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0xff, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) diff --git a/mess/systems/dgn_beta.c b/mess/systems/dgn_beta.c index 31ca343ca..97207649b 100644 --- a/mess/systems/dgn_beta.c +++ b/mess/systems/dgn_beta.c @@ -316,7 +316,7 @@ static void dgnbeta_floppy_getinfo(const device_class *devclass, UINT32 state, u static PALETTE_INIT( dgnbeta ) { - palette_set_colors(0, dgnbeta_palette, sizeof(dgnbeta_palette) / 3); + palette_set_colors(machine, 0, dgnbeta_palette, sizeof(dgnbeta_palette) / 3); memcpy(colortable, dgnbeta_colortable, sizeof(colortable)); } diff --git a/mess/systems/einstein.c b/mess/systems/einstein.c index 677e0100e..06c545cbd 100644 --- a/mess/systems/einstein.c +++ b/mess/systems/einstein.c @@ -1413,7 +1413,7 @@ static MACHINE_RESET( einstein ) static MACHINE_RESET( einstein2 ) { - machine_reset_einstein(); + machine_reset_einstein(machine); einstein_80col_init(); } @@ -1662,8 +1662,8 @@ static VIDEO_UPDATE( einstein_80col ) static VIDEO_UPDATE( einstein2 ) { - video_update_tms9928a(screen, bitmap, cliprect); - video_update_einstein_80col(screen, bitmap, cliprect); + video_update_tms9928a(machine, screen, bitmap, cliprect); + video_update_einstein_80col(machine, screen, bitmap, cliprect); return 0; } diff --git a/mess/systems/electron.c b/mess/systems/electron.c index 3c4a224b1..98be76c6c 100644 --- a/mess/systems/electron.c +++ b/mess/systems/electron.c @@ -46,7 +46,7 @@ unsigned char electron_palette[8*3]= static PALETTE_INIT( electron ) { - palette_set_colors(0, electron_palette, sizeof(electron_palette) / 3); + palette_set_colors(machine, 0, electron_palette, sizeof(electron_palette) / 3); memcpy(colortable,electron_colour_table,sizeof(electron_colour_table)); } diff --git a/mess/systems/gamecom.c b/mess/systems/gamecom.c index 6deb4510d..27cd94b24 100644 --- a/mess/systems/gamecom.c +++ b/mess/systems/gamecom.c @@ -86,7 +86,7 @@ static PALETTE_INIT( gamecom ) int index; for ( index = 0; index < GAMECOM_PALETTE_LENGTH; index++ ) { - palette_set_color( 4-index, palette[index*3+0], palette[index*3+1], palette[index*3+2] ); + palette_set_color(machine, 4-index, palette[index*3+0], palette[index*3+1], palette[index*3+2] ); colortable[index] = index; } } diff --git a/mess/systems/gb.c b/mess/systems/gb.c index 125fa8183..a49ef86d8 100644 --- a/mess/systems/gb.c +++ b/mess/systems/gb.c @@ -165,7 +165,7 @@ static PALETTE_INIT( gb ) int ii; for( ii = 0; ii < 4; ii++) { - palette_set_color(ii, palette[ii*3+0], palette[ii*3+1], palette[ii*3+2]); + palette_set_color(machine, ii, palette[ii*3+0], palette[ii*3+1], palette[ii*3+2]); colortable[ii] = ii; } } @@ -175,7 +175,7 @@ static PALETTE_INIT( gbp ) int ii; for( ii = 0; ii < 4; ii++) { - palette_set_color(ii, palette[(ii + 4)*3+0], palette[(ii + 4)*3+1], palette[(ii + 4)*3+2]); + palette_set_color(machine, ii, palette[(ii + 4)*3+0], palette[(ii + 4)*3+1], palette[(ii + 4)*3+2]); colortable[ii] = ii; } } @@ -189,7 +189,7 @@ static PALETTE_INIT( sgb ) r = (ii & 0x1F) << 3; g = ((ii >> 5) & 0x1F) << 3; b = ((ii >> 10) & 0x1F) << 3; - palette_set_color( ii, r, g, b ); + palette_set_color(machine, ii, r, g, b ); } /* Some default colours for non-SGB games */ @@ -211,7 +211,7 @@ static PALETTE_INIT( gbc ) r = (ii & 0x1F) << 3; g = ((ii >> 5) & 0x1F) << 3; b = ((ii >> 10) & 0x1F) << 3; - palette_set_color( ii, r, g, b ); + palette_set_color( machine, ii, r, g, b ); } /* Background is initialised as white */ @@ -236,6 +236,7 @@ static MACHINE_DRIVER_START( gameboy ) MDRV_VBLANK_DURATION(0) MDRV_INTERLEAVE(1) + MDRV_MACHINE_START( gb ) MDRV_MACHINE_RESET( gb ) MDRV_VIDEO_START( generic_bitmapped ) diff --git a/mess/systems/genesis.c b/mess/systems/genesis.c index 3ed28ef83..8bd86bea1 100644 --- a/mess/systems/genesis.c +++ b/mess/systems/genesis.c @@ -494,7 +494,7 @@ DRIVER_INIT(gen_usa) D7 : Console is 1= Export (USA, Europe, etc.) 0= Domestic (Japan) D6 : Video type is 1= PAL, 0= NTSC */ - init_genesis(); + init_genesis(machine); } @@ -503,7 +503,7 @@ DRIVER_INIT(gen_eur) genesis_is_ntsc = 0; // vdp status flag ... genesis_region = 0xc0; // read via io - init_genesis(); + init_genesis(machine); } @@ -512,7 +512,7 @@ DRIVER_INIT(gen_jpn) genesis_is_ntsc = 1; // vdp status flag ... genesis_region = 0x00; // read via io - init_genesis(); + init_genesis(machine); } diff --git a/mess/systems/intv.c b/mess/systems/intv.c index c9201d63f..eef192774 100644 --- a/mess/systems/intv.c +++ b/mess/systems/intv.c @@ -59,8 +59,8 @@ static PALETTE_INIT( intv ) int i,j; /* Two copies of the palette */ - palette_set_colors(0, intv_palette, sizeof(intv_palette) / 3); - palette_set_colors(sizeof(intv_palette) / 3, intv_palette, sizeof(intv_palette) / 3); + palette_set_colors(machine, 0, intv_palette, sizeof(intv_palette) / 3); + palette_set_colors(machine, sizeof(intv_palette) / 3, intv_palette, sizeof(intv_palette) / 3); /* Two copies of the color table */ for(i=0;i<16;i++) @@ -497,6 +497,6 @@ SYSTEM_CONFIG_END ***************************************************************************/ /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT CONFIG COMPANY FULLNAME */ -CONS( 1979, intv, 0, 0, intv, intv, intv, intv, "Mattel", "Intellivision", GAME_NOT_WORKING ) -CONS( 1981, intvsrs, 0, 0, intv, intv, intv, intv, "Mattel", "Intellivision (Sears)", GAME_NOT_WORKING ) -COMP( 1981, intvkbd, 0, 0, intvkbd, intvkbd, intvkbd, intvkbd, "Mattel", "Intellivision Keyboard Component (Unreleased)", GAME_NOT_WORKING) +CONS( 1979, intv, 0, 0, intv, intv, NULL, intv, "Mattel", "Intellivision", GAME_NOT_WORKING ) +CONS( 1981, intvsrs, 0, 0, intv, intv, NULL, intv, "Mattel", "Intellivision (Sears)", GAME_NOT_WORKING ) +COMP( 1981, intvkbd, 0, 0, intvkbd, intvkbd, NULL, intvkbd, "Mattel", "Intellivision Keyboard Component (Unreleased)", GAME_NOT_WORKING) diff --git a/mess/systems/jupiter.c b/mess/systems/jupiter.c index 8c16cb111..a7540fe4f 100644 --- a/mess/systems/jupiter.c +++ b/mess/systems/jupiter.c @@ -95,7 +95,7 @@ static unsigned short jupiter_colortable[] = static PALETTE_INIT( jupiter ) { - palette_set_colors(0, jupiter_palette, sizeof(jupiter_palette) / 3); + palette_set_colors(machine, 0, jupiter_palette, sizeof(jupiter_palette) / 3); memcpy (colortable, jupiter_colortable, sizeof (jupiter_colortable)); } diff --git a/mess/systems/kaypro.c b/mess/systems/kaypro.c index db5bbd89d..9f74e1d18 100644 --- a/mess/systems/kaypro.c +++ b/mess/systems/kaypro.c @@ -222,7 +222,7 @@ static unsigned short kaypro_colortable[] = /* Initialise the palette */ static PALETTE_INIT( kaypro ) { - palette_set_colors(0, kaypro_palette, sizeof(kaypro_palette) / 3); + palette_set_colors(machine, 0, kaypro_palette, sizeof(kaypro_palette) / 3); memcpy(colortable, kaypro_colortable, sizeof(kaypro_colortable)); } diff --git a/mess/systems/lisa.c b/mess/systems/lisa.c index 55f19cf9e..ea6cd658a 100644 --- a/mess/systems/lisa.c +++ b/mess/systems/lisa.c @@ -35,8 +35,8 @@ ADDRESS_MAP_END /* init with simple, fixed, B/W palette */ static PALETTE_INIT( lisa ) { - palette_set_color(0, 0xff, 0xff, 0xff); - palette_set_color(1, 0x00, 0x00, 0x00); + palette_set_color(machine, 0, 0xff, 0xff, 0xff); + palette_set_color(machine, 1, 0x00, 0x00, 0x00); } diff --git a/mess/systems/lynx.c b/mess/systems/lynx.c index ac6eee1ff..7c8d7137e 100644 --- a/mess/systems/lynx.c +++ b/mess/systems/lynx.c @@ -195,7 +195,7 @@ static PALETTE_INIT( lynx ) for (i=0; i< 0x1000; i++) { - palette_set_color(i, + palette_set_color(machine, i, ((i >> 0) & 0x0f) * 0x11, ((i >> 4) & 0x0f) * 0x11, ((i >> 8) & 0x0f) * 0x11); diff --git a/mess/systems/mbee.c b/mess/systems/mbee.c index df8da83bd..954699845 100644 --- a/mess/systems/mbee.c +++ b/mess/systems/mbee.c @@ -232,7 +232,7 @@ static const UINT8 palette[] = static PALETTE_INIT( mbee ) { int i; - palette_set_colors(0, palette, sizeof(palette) / 3); + palette_set_colors(machine, 0, palette, sizeof(palette) / 3); for( i = 0; i < 256; i++ ) { colortable[2*i+0] = i / 32; diff --git a/mess/systems/mk2.c b/mess/systems/mk2.c index 12a9925fe..89535ede0 100644 --- a/mess/systems/mk2.c +++ b/mess/systems/mk2.c @@ -235,7 +235,7 @@ static RRIOT_CONFIG riot={ mk2_irq }; -static void init_mk2(void) +static DRIVER_INIT( mk2 ) { rriot_init(0,&riot); } diff --git a/mess/systems/mpf1.c b/mess/systems/mpf1.c index 694ac91fe..868973f8d 100644 --- a/mess/systems/mpf1.c +++ b/mess/systems/mpf1.c @@ -124,9 +124,9 @@ static UINT8 kbdlatch; static PALETTE_INIT( mpf1 ) { - palette_set_color(0, 0x00, 0x00, 0x00); - palette_set_color(1, 0xff, 0x00, 0x00); - palette_set_color(2, 0x00, 0xff, 0x00); + palette_set_color(machine, 0, 0x00, 0x00, 0x00); + palette_set_color(machine, 1, 0xff, 0x00, 0x00); + palette_set_color(machine, 2, 0x00, 0xff, 0x00); } @@ -136,7 +136,7 @@ static VIDEO_START( mpf1 ) videoram_size = 6 * 2 + 24; videoram = auto_malloc (videoram_size); - return video_start_generic(); + return video_start_generic(machine); } diff --git a/mess/systems/msx.c b/mess/systems/msx.c index 1e214564e..0453e0e74 100644 --- a/mess/systems/msx.c +++ b/mess/systems/msx.c @@ -712,7 +712,7 @@ static struct AY8910interface ay8910_interface = static VIDEO_START( msx2 ) { - return v9938_init (MODEL_V9938, 0x20000, msx_vdp_interrupt); + return v9938_init(machine, MODEL_V9938, 0x20000, msx_vdp_interrupt); } static const TMS9928a_interface tms9928a_interface = diff --git a/mess/systems/n64.c b/mess/systems/n64.c index 25fb90267..f287fe72e 100644 --- a/mess/systems/n64.c +++ b/mess/systems/n64.c @@ -93,14 +93,13 @@ MACHINE_DRIVER_START( n64 ) MDRV_CPU_PROGRAM_MAP(rsp_map, 0) MDRV_MACHINE_RESET( n64 ) - MDRV_INTERLEAVE(10) MDRV_FRAMES_PER_SECOND(60) MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION) MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_RGB_DIRECT | VIDEO_NEEDS_6BITS_PER_GUN) - MDRV_SCREEN_SIZE(1280, 1024) - MDRV_VISIBLE_AREA(0, 1279, 0, 1023) + MDRV_SCREEN_SIZE(640, 525) + MDRV_VISIBLE_AREA(0, 639, 0, 239) MDRV_PALETTE_LENGTH(0x1000) MDRV_VIDEO_START(n64) diff --git a/mess/systems/nascom1.c b/mess/systems/nascom1.c index 8e60679cf..1e64b9519 100644 --- a/mess/systems/nascom1.c +++ b/mess/systems/nascom1.c @@ -125,7 +125,7 @@ static unsigned short nascom1_colortable[] = static PALETTE_INIT( nascom1 ) { - palette_set_colors(0, nascom1_palette, sizeof(nascom1_palette) / 3); + palette_set_colors(machine, 0, nascom1_palette, sizeof(nascom1_palette) / 3); memcpy(colortable, nascom1_colortable, sizeof (nascom1_colortable)); } diff --git a/mess/systems/nc.c b/mess/systems/nc.c index e97319b28..7321b7724 100644 --- a/mess/systems/nc.c +++ b/mess/systems/nc.c @@ -128,8 +128,8 @@ static int nc_membank_rom_mask; static int nc_membank_internal_ram_mask; int nc_membank_card_ram_mask; -static void nc100_machine_stop(void); -static void nc200_machine_stop(void); +static void nc100_machine_stop(running_machine *machine); +static void nc200_machine_stop(running_machine *machine); /* Port 0x00: @@ -976,7 +976,7 @@ static CENTRONICS_CONFIG nc100_cent_config[1]={ }, }; -static void nc100_machine_reset(void) +static void nc100_machine_reset(running_machine *machine) { /* 256k of rom */ nc_membank_rom_mask = 0x0f; @@ -1006,7 +1006,7 @@ static void nc100_machine_reset(void) nc_irq_latch_mask = (1<<0) | (1<<1); } -static void nc100_machine_stop(void) +static void nc100_machine_stop(running_machine *machine) { nc_common_open_stream_for_writing(); tc8521_save_stream(file); @@ -1018,8 +1018,8 @@ static MACHINE_START( nc100 ) { nc_type = NC_TYPE_1xx; - add_reset_callback(nc100_machine_reset); - add_exit_callback(nc100_machine_stop); + add_reset_callback(machine, nc100_machine_reset); + add_exit_callback(machine, nc100_machine_stop); return 0; } @@ -1373,7 +1373,7 @@ static void nc200_floppy_drive_index_callback(int drive_id) // nc_update_interrupts(); } -static void nc200_machine_reset(void) +static void nc200_machine_reset(running_machine *machine) { /* 512k of rom */ nc_membank_rom_mask = 0x1f; @@ -1412,7 +1412,7 @@ static void nc200_machine_reset(void) nc200_video_set_backlight(0); } -static void nc200_machine_stop(void) +static void nc200_machine_stop(running_machine *machine) { nc_common_open_stream_for_writing(); if (file) @@ -1427,8 +1427,8 @@ static MACHINE_START( nc200 ) { nc_type = NC_TYPE_200; - add_reset_callback(nc200_machine_reset); - add_exit_callback(nc200_machine_stop); + add_reset_callback(machine, nc200_machine_reset); + add_exit_callback(machine, nc200_machine_stop); return 0; } diff --git a/mess/systems/oric.c b/mess/systems/oric.c index 3eb97a499..8426748fd 100644 --- a/mess/systems/oric.c +++ b/mess/systems/oric.c @@ -427,7 +427,7 @@ static const unsigned short oric_colortable[8] = /* Initialise the palette */ static PALETTE_INIT( oric ) { - palette_set_colors(0, oric_palette, sizeof(oric_palette) / 3); + palette_set_colors(machine, 0, oric_palette, sizeof(oric_palette) / 3); memcpy(colortable, oric_colortable,sizeof(oric_colortable)); } diff --git a/mess/systems/p2000t.c b/mess/systems/p2000t.c index 52aebec38..8e0e354eb 100644 --- a/mess/systems/p2000t.c +++ b/mess/systems/p2000t.c @@ -98,7 +98,7 @@ static unsigned short p2000m_colortable[2 * 2] = static PALETTE_INIT( p2000m ) { - palette_set_colors(0, p2000m_palette, sizeof(p2000m_palette) / 3); + palette_set_colors(machine, 0, p2000m_palette, sizeof(p2000m_palette) / 3); memcpy(colortable, p2000m_colortable, sizeof (p2000m_colortable)); } diff --git a/mess/systems/pcw16.c b/mess/systems/pcw16.c index db85de075..e519ecbc4 100644 --- a/mess/systems/pcw16.c +++ b/mess/systems/pcw16.c @@ -108,7 +108,7 @@ #include "includes/28f008sa.h" -static void pcw16_machine_stop(void); +static void pcw16_machine_stop(running_machine *machine); // interrupt counter unsigned long pcw16_interrupt_counter; @@ -1384,10 +1384,10 @@ static MACHINE_RESET( pcw16 ) beep_set_state(0,0); beep_set_frequency(0,3750); - add_exit_callback(pcw16_machine_stop); + add_exit_callback(machine, pcw16_machine_stop); } -static void pcw16_machine_stop(void) +static void pcw16_machine_stop(running_machine *machine) { /* flash 0 */ flash_store(0,"pcw16f1.nv"); diff --git a/mess/systems/pdp1.c b/mess/systems/pdp1.c index 3a9e58e94..36d9c9eeb 100644 --- a/mess/systems/pdp1.c +++ b/mess/systems/pdp1.c @@ -306,7 +306,7 @@ static const UINT8 palette[] = 0x80,0x80,0x80 /* light gray */ }; -static const UINT16 colortable[] = +static const UINT16 pdp1_colortable[] = { pen_panel_bg, pen_panel_caption, pen_typewriter_bg, pen_black, @@ -314,7 +314,7 @@ static const UINT16 colortable[] = }; /* Initialise the palette */ -static void palette_init_pdp1(unsigned short *sys_colortable, const unsigned char *dummy) +static PALETTE_INIT( pdp1 ) { /* rgb components for the two color emissions */ const double r1 = .1, g1 = .1, b1 = .924, r2 = .7, g2 = .7, b2 = .076; @@ -343,18 +343,18 @@ static void palette_init_pdp1(unsigned short *sys_colortable, const unsigned cha g = (int) ((g1*cur_level_1 + g2*cur_level_2) + .5); b = (int) ((b1*cur_level_1 + b2*cur_level_2) + .5); /* write color in palette */ - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); /* apply decay for next iteration */ cur_level_1 *= decay_1; cur_level_2 *= decay_2; } - palette_set_color(0, 0, 0, 0); + palette_set_color(machine, 0, 0, 0, 0); /* load static palette */ - palette_set_colors(pen_crt_num_levels, palette, sizeof(palette) / sizeof(palette[0]) / 3); + palette_set_colors(machine, pen_crt_num_levels, palette, sizeof(palette) / sizeof(palette[0]) / 3); - memcpy(sys_colortable, colortable, sizeof(colortable)); + memcpy(colortable, pdp1_colortable, sizeof(pdp1_colortable)); } @@ -414,7 +414,7 @@ static MACHINE_DRIVER_START(pdp1) MDRV_GFXDECODE(gfxdecodeinfo) MDRV_PALETTE_LENGTH(pen_crt_num_levels + (sizeof(palette) / sizeof(palette[0]) / 3)) - MDRV_COLORTABLE_LENGTH(sizeof(colortable) / sizeof(colortable[0])) + MDRV_COLORTABLE_LENGTH(sizeof(pdp1_colortable) / sizeof(pdp1_colortable[0])) MDRV_PALETTE_INIT(pdp1) MDRV_VIDEO_START(pdp1) diff --git a/mess/systems/pet.c b/mess/systems/pet.c index 6c14d050d..c6ea65495 100644 --- a/mess/systems/pet.c +++ b/mess/systems/pet.c @@ -562,7 +562,7 @@ static gfx_decode superpet_gfxdecodeinfo[] = static PALETTE_INIT( pet ) { - palette_set_colors(0, pet_palette, sizeof(pet_palette) / 3); + palette_set_colors(machine, 0, pet_palette, sizeof(pet_palette) / 3); memcpy(colortable, pet_colortable, sizeof(colortable)); } diff --git a/mess/systems/ql.c b/mess/systems/ql.c index ff85cb630..bd2a4e134 100644 --- a/mess/systems/ql.c +++ b/mess/systems/ql.c @@ -21,14 +21,14 @@ static int mode4_colors[] = { 0, 2, 4, 7 }; PALETTE_INIT( ql ) { - palette_set_color( 0x00, 0x00, 0x00, 0x00 ); - palette_set_color( 0x01, 0x00, 0x00, 0xff ); - palette_set_color( 0x02, 0x00, 0xff, 0x00 ); - palette_set_color( 0x03, 0x00, 0xff, 0xff ); - palette_set_color( 0x04, 0xff, 0x00, 0x00 ); - palette_set_color( 0x05, 0xff, 0x00, 0xff ); - palette_set_color( 0x06, 0xff, 0xff, 0x00 ); - palette_set_color( 0x07, 0xff, 0xff, 0xff ); + palette_set_color(machine, 0x00, 0x00, 0x00, 0x00 ); + palette_set_color(machine, 0x01, 0x00, 0x00, 0xff ); + palette_set_color(machine, 0x02, 0x00, 0xff, 0x00 ); + palette_set_color(machine, 0x03, 0x00, 0xff, 0xff ); + palette_set_color(machine, 0x04, 0xff, 0x00, 0x00 ); + palette_set_color(machine, 0x05, 0xff, 0x00, 0xff ); + palette_set_color(machine, 0x06, 0xff, 0xff, 0x00 ); + palette_set_color(machine, 0x07, 0xff, 0xff, 0xff ); } WRITE8_HANDLER( ql_videoram_w ) diff --git a/mess/systems/snes.c b/mess/systems/snes.c index 2ad44b42a..dd751dd31 100644 --- a/mess/systems/snes.c +++ b/mess/systems/snes.c @@ -173,7 +173,7 @@ static PALETTE_INIT( snes ) r = (i & 0x1F) << 3; g = ((i >> 5) & 0x1F) << 3; b = ((i >> 10) & 0x1F) << 3; - palette_set_color( i, r, g, b ); + palette_set_color(machine, i, r, g, b ); } /* The colortable can be black */ @@ -246,7 +246,7 @@ static void snes_save_sram(void) -static void snes_machine_stop(void) +static void snes_machine_stop(running_machine *machine) { /* Save SRAM */ if( snes_cart.sram > 0 ) @@ -255,8 +255,8 @@ static void snes_machine_stop(void) static MACHINE_START( snes_mess ) { - add_exit_callback(snes_machine_stop); - return machine_start_snes(); + add_exit_callback(machine, snes_machine_stop); + return machine_start_snes(machine); } static int device_load_snes_cart(mess_image *image, mame_file *file) @@ -309,11 +309,7 @@ static int device_load_snes_cart(mess_image *image, mame_file *file) "UNKNOWN" }; - if( new_memory_region(REGION_CPU1, 0x1000000,0) ) - { - logerror("Memory allocation failed reading rom!\n"); - return INIT_FAIL; - } + new_memory_region(Machine, REGION_CPU1, 0x1000000,0); snes_ram = memory_region( REGION_CPU1 ); memset( snes_ram, 0, 0x1000000 ); diff --git a/mess/systems/sord.c b/mess/systems/sord.c index cc8ea547d..cba01ed63 100644 --- a/mess/systems/sord.c +++ b/mess/systems/sord.c @@ -195,7 +195,7 @@ static MACHINE_RESET( sord_m5_fd5 ) floppy_drive_set_geometry(image_from_devtype_and_index(IO_FLOPPY, 0), FLOPPY_DRIVE_SS_40); floppy_drive_set_geometry(image_from_devtype_and_index(IO_FLOPPY, 1), FLOPPY_DRIVE_SS_40); sord_fd5_init(); - machine_reset_sord_m5(); + machine_reset_sord_m5(machine); ppi8255_set_portC(0, 0x50); } diff --git a/mess/systems/spectrum.c b/mess/systems/spectrum.c index a079efbd4..2cbade33e 100644 --- a/mess/systems/spectrum.c +++ b/mess/systems/spectrum.c @@ -538,7 +538,7 @@ static MACHINE_RESET( spectrum_128 ) spectrum_128_port_7ffd_data = 0; spectrum_128_update_memory(); - machine_reset_spectrum(); + machine_reset_spectrum(machine); } /****************************************************************************************************/ @@ -847,7 +847,7 @@ static MACHINE_RESET( spectrum_plus3 ) spectrum_plus3_port_1ffd_data = 0; spectrum_plus3_update_memory(); - machine_reset_spectrum(); + machine_reset_spectrum(machine); } @@ -1314,7 +1314,7 @@ static MACHINE_RESET( ts2068 ) ts2068_port_f4_data = 0; ts2068_update_memory(); - machine_reset_spectrum(); + machine_reset_spectrum(machine); } @@ -1373,7 +1373,7 @@ static MACHINE_RESET( tc2048 ) memory_set_bankptr(2, mess_ram); ts2068_port_ff_data = 0; - machine_reset_spectrum(); + machine_reset_spectrum(machine); } @@ -1944,7 +1944,7 @@ static unsigned short spectrum_colortable[128*2] = { /* Initialise the palette */ static PALETTE_INIT( spectrum ) { - palette_set_colors(0, spectrum_palette, sizeof(spectrum_palette) / 3); + palette_set_colors(machine, 0, spectrum_palette, sizeof(spectrum_palette) / 3); memcpy(colortable, spectrum_colortable, sizeof(spectrum_colortable)); } diff --git a/mess/systems/studio2.c b/mess/systems/studio2.c index 6da599e5f..d6193a0cc 100644 --- a/mess/systems/studio2.c +++ b/mess/systems/studio2.c @@ -32,7 +32,7 @@ static unsigned short studio2_colortable[1][2] = { static PALETTE_INIT( studio2 ) { - palette_set_colors(0, studio2_palette, sizeof(studio2_palette) / 3); + palette_set_colors(machine, 0, studio2_palette, sizeof(studio2_palette) / 3); memcpy(colortable,studio2_colortable,sizeof(studio2_colortable)); } diff --git a/mess/systems/super80.c b/mess/systems/super80.c index 23dc882ed..6aa48b237 100644 --- a/mess/systems/super80.c +++ b/mess/systems/super80.c @@ -298,7 +298,7 @@ static short bw_colortable[] = static PALETTE_INIT( super80_bw ) { - palette_set_colors(0, bw_palette, sizeof(bw_palette) / 3); + palette_set_colors(machine, 0, bw_palette, sizeof(bw_palette) / 3); memcpy(colortable, & bw_colortable, sizeof(bw_colortable)); } diff --git a/mess/systems/svision.c b/mess/systems/svision.c index dd24e45ff..13fdd4457 100644 --- a/mess/systems/svision.c +++ b/mess/systems/svision.c @@ -266,7 +266,7 @@ static unsigned char svision_palette[] = static PALETTE_INIT( svision ) { - palette_set_colors(0, svision_palette, sizeof(svision_palette) / 3); + palette_set_colors(machine, 0, svision_palette, sizeof(svision_palette) / 3); } static VIDEO_UPDATE( svision ) diff --git a/mess/systems/thomson.c b/mess/systems/thomson.c index 7ca521658..26ddafcaf 100644 --- a/mess/systems/thomson.c +++ b/mess/systems/thomson.c @@ -65,7 +65,6 @@ - midi extension (@) - TV overlay (IN 57-001), digitisation extension (@) - barcode reader (@) - - NR 07-005 MO5 extension, MO5NR: network (@) - speech synthesis extension (@) means MESS is lacking support for this kind of device / feature anyway @@ -464,7 +463,7 @@ boot floppy. * video: 320x200 pixels with color constraints (2 colors per horizontal 8-pixel span), 8-color pixel palette, - 50 Hz (SECAM) + 50 Hz (tweaked SECAM) * devices: - AZERTY keyboard, 58-keys, French with accents @@ -563,34 +562,56 @@ ADDRESS_MAP_END ROM_FILL( base, 0x800, 0x39 ) \ /* CD 90-640 (5"1/4) */ \ ROM_LOAD ( "cd90-640.rom", base+0x800, 0x7c0, \ + CRC(5114c0a5) \ MD5(e5b609dd90b26c9974a46cd54eab4216) ) \ /* CD 90-351 (3"1/2) */ \ ROM_LOAD ( "cd-351-0.rom", base+0x1000, 0x7c0, \ + CRC(2c0159fd) \ MD5(74b61b2905e355419c497b5520706aa0) ) \ ROM_LOAD ( "cd-351-1.rom", base+0x1800, 0x7c0, \ + CRC(8e58d159) \ MD5(e2a2cd1be213bc340bb8e9ebbed95d0d) ) \ ROM_LOAD ( "cd-351-2.rom", base+0x2000, 0x7c0, \ + CRC(c9228b60) \ MD5(087e52f007dd24a385adea39f80682a3) ) \ ROM_LOAD ( "cd-351-3.rom", base+0x2800, 0x7c0, \ + CRC(3ca8e5dc) \ MD5(e01dceb2295fa548a4f74cf0487c3f6d) ) \ /* CQ 90-028 (2"8, aka QDD) */ \ ROM_LOAD ( "cq90-028.rom", base+0x3000, 0x7c0, \ + CRC(ca4dba3d) \ MD5(0f58e167bf6ebcd2cbba946be2084fbe) ) +/* external floppy / network controller: 8 banks */ +#define ROM_FLOPPY5( base ) \ + ROM_FLOPPY( base ) \ + ROM_LOAD ( "nano5.rom", base+0x3800, 0x7c0, \ + CRC(2f756868) \ + MD5(06ff309276d4fc656e99a8ad1ca67899) ) + +#define ROM_FLOPPY7( base ) \ + ROM_FLOPPY( base ) \ + ROM_LOAD ( "nano7.rom", base+0x3800, 0x7c0, \ + CRC(42a1d1a6) \ + MD5(77da8cfc9e0a14ef2ed7034f5941b542) ) + + ROM_START ( to7 ) ROM_REGION ( 0x28000, REGION_CPU1, 0 ) ROM_LOAD ( "to7.rom", 0xe800, 0x1800, + CRC(0e7826da) MD5(5bf18521bf35293de942645f690b2845) ) ROM_FILL ( 0x10000, 0x10000, 0x39 ) - ROM_FLOPPY ( 0x24000 ) + ROM_FLOPPY7 ( 0x24000 ) ROM_END ROM_START ( t9000 ) ROM_REGION ( 0x28000, REGION_CPU1, 0 ) ROM_LOAD ( "t9000.rom", 0xe800, 0x1800, + CRC(daa8cfbf) MD5(b3007f26e7b621c1a4f0fd2c287f80b9) ) ROM_FILL ( 0x10000, 0x10000, 0x39 ) - ROM_FLOPPY ( 0x24000 ) + ROM_FLOPPY7 ( 0x24000 ) ROM_END @@ -622,7 +643,41 @@ INPUT_PORTS_START ( to7_fconfig ) PORT_CONFSETTING ( 0x01, "CD 90-640 (5\"1/4)" ) PORT_CONFSETTING ( 0x02, "CD 90-351 (3\"1/2)" ) PORT_CONFSETTING ( 0x03, "CQ 90-028 (2\"8 QDD)" ) - //PORT_CONFSETTING ( 0x04, "Network" ) + PORT_CONFSETTING ( 0x04, "Network" ) + + PORT_CONFNAME ( 0xf8, 0x08, "Network ID" ) + PORT_CONFSETTING ( 0x00, "0 (Master)" ); + PORT_CONFSETTING ( 0x08, "1" ); + PORT_CONFSETTING ( 0x10, "2" ); + PORT_CONFSETTING ( 0x18, "3" ); + PORT_CONFSETTING ( 0x20, "4" ); + PORT_CONFSETTING ( 0x28, "5" ); + PORT_CONFSETTING ( 0x30, "6" ); + PORT_CONFSETTING ( 0x38, "7" ); + PORT_CONFSETTING ( 0x40, "8" ); + PORT_CONFSETTING ( 0x48, "9" ); + PORT_CONFSETTING ( 0x50, "10" ); + PORT_CONFSETTING ( 0x58, "11" ); + PORT_CONFSETTING ( 0x60, "12" ); + PORT_CONFSETTING ( 0x68, "13" ); + PORT_CONFSETTING ( 0x70, "14" ); + PORT_CONFSETTING ( 0x78, "15" ); + PORT_CONFSETTING ( 0x80, "16" ); + PORT_CONFSETTING ( 0x88, "17" ); + PORT_CONFSETTING ( 0x90, "18" ); + PORT_CONFSETTING ( 0x98, "19" ); + PORT_CONFSETTING ( 0xa0, "20" ); + PORT_CONFSETTING ( 0xa8, "21" ); + PORT_CONFSETTING ( 0xb0, "22" ); + PORT_CONFSETTING ( 0xb8, "23" ); + PORT_CONFSETTING ( 0xc0, "24" ); + PORT_CONFSETTING ( 0xc8, "25" ); + PORT_CONFSETTING ( 0xd0, "26" ); + PORT_CONFSETTING ( 0xd8, "27" ); + PORT_CONFSETTING ( 0xe0, "28" ); + PORT_CONFSETTING ( 0xe8, "29" ); + PORT_CONFSETTING ( 0xf0, "30" ); + PORT_CONFSETTING ( 0xf8, "31" ); INPUT_PORTS_END @@ -738,25 +793,26 @@ static MACHINE_DRIVER_START ( to7 ) MDRV_MACHINE_RESET ( to7 ) /* cpu */ -/* NOTE: the frequency is close to but not exactly 1 MHz to compensate - for the difference between the 624-line video output and the 625-line - SECAM video format. - */ - MDRV_CPU_ADD_TAG ( "main", M6809, 998400 ) /* almost 1 MHz */ + MDRV_CPU_ADD_TAG ( "main", M6809, 1000000 ) MDRV_CPU_PROGRAM_MAP ( to7, 0 ) /* video */ - MDRV_FRAMES_PER_SECOND ( 50 ) +/* Finally, I figured it out. The video hardware overclocks the SECAM + framerate from 50 Hz to 1/0.019968 Hz to get 312 64us lines per frame, + i.e., 19.968 ms per frame, not 20 ms +*/ + MDRV_FRAMES_PER_SECOND ( /*50*/ 1./0.019968 ) MDRV_INTERLEAVE ( 0 ) MDRV_VIDEO_ATTRIBUTES ( VIDEO_TYPE_RASTER ) - MDRV_SCREEN_MAXSIZE ( THOM_TOTAL_WIDTH * 2, THOM_TOTAL_HEIGHT * 2 ) - MDRV_SCREEN_VISIBLE_AREA ( 0, THOM_TOTAL_WIDTH * 2 - 1, + MDRV_SCREEN_SIZE ( THOM_TOTAL_WIDTH * 2, THOM_TOTAL_HEIGHT * 2 ) + MDRV_VISIBLE_AREA ( 0, THOM_TOTAL_WIDTH * 2 - 1, 0, THOM_TOTAL_HEIGHT * 2 - 1 ) MDRV_PALETTE_LENGTH ( 4097 ) /* 12-bit color + transparency */ MDRV_PALETTE_INIT ( thom ) MDRV_VIDEO_START ( thom ) MDRV_VIDEO_UPDATE ( thom ) MDRV_VIDEO_EOF ( thom ) + MDRV_DEFAULT_LAYOUT( "thomson" ) /* sound */ MDRV_SPEAKER_STANDARD_MONO("mono") @@ -863,16 +919,18 @@ ADDRESS_MAP_END ROM_START ( to770 ) ROM_REGION ( 0x40000, REGION_CPU1, 0 ) ROM_LOAD ( "to770.rom", 0xe800, 0x1800, /* BIOS */ + CRC(89518862) MD5(61402c35b75faeb4b74b815f323fff3d) ) - ROM_FLOPPY ( 0x3c000 ) + ROM_FLOPPY7 ( 0x3c000 ) ROM_FILL ( 0x10000, 0x10000, 0x39 ) ROM_END ROM_START ( to770a ) ROM_REGION ( 0x40000, REGION_CPU1, 0 ) ROM_LOAD ( "to770a.rom", 0xe800, 0x1800, + CRC(378ea808) MD5(6b63aa135107beee243967a2da0e5453) ) - ROM_FLOPPY ( 0x3c000 ) + ROM_FLOPPY7 ( 0x3c000 ) ROM_FILL ( 0x10000, 0x10000, 0x39 ) ROM_END @@ -986,7 +1044,8 @@ Unlike the TO7, the BASIC 1.0 is integrated and the MO5 can be used "as-is". - optional cartridge, up to 64 KB, incompatible with TO7, masks the integrated BASIC ROM - game & music, I/O, floppy extensions: identical to TO7 - - NR 07-005: network extension, comes with 2 KB ROM & 64 KB RAM + - NR 07-005: network extension, MC 6854 based, 2 KB ROM & 64 KB RAM + (build by the French Leanord company) MO5E (1986) @@ -1035,23 +1094,23 @@ ADDRESS_MAP_END ROM_START ( mo5 ) ROM_REGION ( 0x38000, REGION_CPU1, 0 ) ROM_LOAD ( "mo5.rom", 0xf000, 0x1000, + CRC(f0ea9140) MD5(ab3533a7132f90933acce80e256ae459) ) -/* - ROM_LOAD ( "basic5.rom", 0x10000, 0x4000, - MD5(06023716e0cfe086ca874a1f65f0363d) ) -*/ ROM_LOAD ( "basic5.rom", 0x11000, 0x3000, + CRC(c2c11b9d) MD5(f992a912093d3e8f165f225f74345b57) ) - ROM_FLOPPY ( 0x34000 ) + ROM_FLOPPY5 ( 0x34000 ) ROM_END ROM_START ( mo5e ) ROM_REGION ( 0x38000, REGION_CPU1, 0 ) ROM_LOAD ( "mo5e.rom", 0xf000, 0x1000, + CRC(6520213a) MD5(434c42b96c31a341e13085048cdc8eae) ) ROM_LOAD ( "basic5e.rom", 0x11000, 0x3000, + CRC(934a72b2) MD5(6404a7f49ec28937decd905d2a3cbb28) ) - ROM_FLOPPY ( 0x34000 ) + ROM_FLOPPY5 ( 0x34000 ) ROM_END @@ -1155,7 +1214,7 @@ It was replaced quickly with the improved TO9+. - 1 MHz Motorola 6809E CPU - 1 Motorola 6821 PIA (+2 for game, modem extensions) - 1 Motorola 6846 timer, PIA - - 1 Motorola 6804 + 1 Motorola 6850 (keyboard & mouse control) + - 1 Motorola 6805 + 1 Motorola 6850 (keyboard & mouse control) - 1 Western Digital 2793 (disk controller) - 3 gate-arrays (address decoding, system, video) @@ -1243,24 +1302,33 @@ ADDRESS_MAP_END ROM_START ( to9 ) ROM_REGION ( 0x6c000, REGION_CPU1, 0 ) ROM_LOAD ( "to9.rom", 0xe000, 0x2000, /* BIOS & floppy controller */ + CRC(f9278bf7) MD5(507f0c482462b70b816fd23cf6791179) ) /* BASIC & software */ ROM_LOAD ( "basic9-0.rom", 0x20000, 0x4000, + CRC(c7bac620) MD5(095d0f94ab506ab5da1e73ae550ee2bc) ) ROM_LOAD ( "basic9-1.rom", 0x24000, 0x4000, + CRC(ea5f3e43) MD5(ce29a894c31db083acf6bdf015a02b5e) ) ROM_LOAD ( "basic9-2.rom", 0x28000, 0x4000, + CRC(0f5581b3) MD5(02279e22b8bfe29e750fb62671e3951d) ) ROM_LOAD ( "basic9-3.rom", 0x2c000, 0x4000, + CRC(6b5b19e3) MD5(dac4b33a8cbebf64916b35515e0693c8) ) ROM_LOAD ( "soft9-0a.rom", 0x30000, 0x4000, + CRC(8cee157e) MD5(3dab712e800351b4f639790595b12101) ) ROM_LOAD ( "soft9-1a.rom", 0x34000, 0x4000, + CRC(cf39ac93) MD5(bcd744cdbd022cd9e2651e87792cd742) ) ROM_LOAD ( "soft9-0b.rom", 0x38000, 0x4000, + CRC(033aee3f) MD5(1a4d3549c78328479361e867d240f285) ) ROM_LOAD ( "soft9-1b.rom", 0x3c000, 0x4000, + CRC(214fe527) MD5(3dc2820fbe7b81a3936f731b44f23cbe) ) ROM_FILL( 0x10000, 0x10000, 0x39 ) @@ -1508,18 +1576,24 @@ ROM_START ( to8 ) /* BIOS & floppy */ ROM_LOAD ( "to8-0.rom", 0xb0000, 0x2000, + CRC(3c4a640a) MD5(97c9b803305031daf6bffa671f7667c2) ) ROM_LOAD ( "to8-1.rom", 0xb2000, 0x2000, + CRC(cb9bae2d) MD5(6ca0ebe022f9c433373eaed403aaf0ce) ) /* BASIC */ ROM_LOAD ( "basic8-0.rom", 0x20000, 0x4000, + CRC(e5a00fb3) MD5(6c33e3cd79bd6c675634b172594bbfec) ) ROM_LOAD ( "basic8-1.rom", 0x24000, 0x4000, + CRC(4b241e63) MD5(360cbf42078bf8c80a283828bf6ee4e6) ) ROM_LOAD ( "basic8-2.rom", 0x28000, 0x4000, + CRC(0f5581b3) MD5(02279e22b8bfe29e750fb62671e3951d) ) ROM_LOAD ( "basic8-3.rom", 0x2c000, 0x4000, + CRC(f552e7e3) MD5(56c1e929ef4be6771cac7157d169132f) ) ROM_FILL( 0x10000, 0x10000, 0x39 ) @@ -1530,18 +1604,24 @@ ROM_START ( to8d ) /* BIOS & floppy */ ROM_LOAD ( "to8d-0.rom", 0xb0000, 0x2000, + CRC(30ea4950) MD5(7704c1148b8761e9ce650ef1aa7ded69) ) ROM_LOAD ( "to8d-1.rom", 0xb2000, 0x2000, + CRC(926cf0ca) MD5(3e202c3914e16c5ede32ab2bd2a61a5e) ) /* BASIC */ ROM_LOAD ( "basic8-0.rom", 0x20000, 0x4000, + CRC(e5a00fb3) MD5(6c33e3cd79bd6c675634b172594bbfec) ) ROM_LOAD ( "basic8-1.rom", 0x24000, 0x4000, + CRC(4b241e63) MD5(360cbf42078bf8c80a283828bf6ee4e6) ) ROM_LOAD ( "basic8-2.rom", 0x28000, 0x4000, + CRC(0f5581b3) MD5(02279e22b8bfe29e750fb62671e3951d) ) ROM_LOAD ( "basic8-3.rom", 0x2c000, 0x4000, + CRC(f552e7e3) MD5(56c1e929ef4be6771cac7157d169132f) ) ROM_FILL( 0x10000, 0x10000, 0x39 ) @@ -1632,7 +1712,7 @@ It uses the same video gate-array and floppy controller. The differences with the TO8 are: * chips: - - 1 Motorola 6804 + 1 Motorola 6850 (keyboard) + - 1 Motorola 6805 + 1 Motorola 6850 (keyboard) - 3 Motorola 6821 PIAs (system, game, modem) * memory: @@ -1693,18 +1773,24 @@ ROM_START ( to9p ) /* BIOS & floppy */ ROM_LOAD ( "to9p-0.rom", 0xb0000, 0x2000, + CRC(a2731296) MD5(dfb6bfe5ae6142395fe4d1b854b7f6ff) ) ROM_LOAD ( "to9p-1.rom", 0xb2000, 0x2000, + CRC(c52ce315) MD5(66bba93895d27c788b25a8b48c8d3799) ) /* BASIC */ ROM_LOAD ( "basicp-0.rom", 0x20000, 0x4000, + CRC(e5a00fb3) MD5(6c33e3cd79bd6c675634b172594bbfec) ) ROM_LOAD ( "basicp-1.rom", 0x24000, 0x4000, + CRC(4b241e63) MD5(360cbf42078bf8c80a283828bf6ee4e6) ) ROM_LOAD ( "basicp-2.rom", 0x28000, 0x4000, + CRC(0f5581b3) MD5(02279e22b8bfe29e750fb62671e3951d) ) ROM_LOAD ( "basicp-3.rom", 0x2c000, 0x4000, + CRC(ebe9c8d9) MD5(67e7f2de15bcd2ee9dac7974da478901) ) ROM_FILL( 0x10000, 0x10000, 0x39 ) @@ -1835,21 +1921,27 @@ ROM_START ( mo6 ) /* BIOS */ ROM_LOAD ( "mo6-0.rom", 0x23000, 0x1000, + CRC(0446eef6) MD5(192c44506f347b02030eb3ec862b850f) ) ROM_LOAD ( "mo6-1.rom", 0x27000, 0x1000, + CRC(eb6df8d4) MD5(7ff810d9b7e6900d8904336b6114ebd7) ) /* BASIC */ ROM_LOAD ( "basic6-0.rom", 0x20000, 0x3000, + CRC(18789833) MD5(08edc429b44e581b3c826ac81b06cd2b) ) ROM_LOAD ( "basic6-1.rom", 0x24000, 0x3000, + CRC(c9b4d6f4) MD5(03f82e6d26547dd23fca7c420b6952c4) ) ROM_LOAD ( "basic6-2.rom", 0x28000, 0x4000, + CRC(08eac9bb) MD5(4f5d0bb8dea45d85d8551c09888423d1) ) ROM_LOAD ( "basic6-3.rom", 0x2c000, 0x4000, + CRC(19d66dc4) MD5(c2c4dab28d42adf4ea264270ea889c4f) ) - ROM_FLOPPY ( 0x50000 ) + ROM_FLOPPY5 ( 0x50000 ) ROM_FILL ( 0x10000, 0x10000, 0x39 ) ROM_END @@ -1858,21 +1950,27 @@ ROM_START ( pro128 ) /* BIOS */ ROM_LOAD ( "pro128-0.rom", 0x23000, 0x1000, + CRC(a8aef291) MD5(b7d937421754b79587050208b8c3beb2) ) ROM_LOAD ( "pro128-1.rom", 0x27000, 0x1000, + CRC(5b3340ec) MD5(9b7f4505195d12a5efceaac26bcb4079) ) /* BASIC */ ROM_LOAD ( "basico-0.rom", 0x20000, 0x3000, + CRC(98b10d5e) MD5(96ce523fe27cd3935195f4218deb6277) ) ROM_LOAD ( "basico-1.rom", 0x24000, 0x3000, + CRC(721d2124) MD5(73cfdcd1638932ef8ebc639cbc6e2dd0) ) ROM_LOAD ( "basico-2.rom", 0x28000, 0x4000, + CRC(135438ab) MD5(d155a93aa1a2b1b5102bb5e0acdb3391) ) ROM_LOAD ( "basico-3.rom", 0x2c000, 0x4000, + CRC(2c2befa6) MD5(5e31d779961ed1ae7fc800489277f96a) ) - ROM_FLOPPY ( 0x50000 ) + ROM_FLOPPY5 ( 0x50000 ) ROM_FILL ( 0x10000, 0x10000, 0x39 ) ROM_END @@ -2087,7 +2185,7 @@ It is both MO5 and MO6 compatible (but not TO-compatible). Here are the differences between the MO6 and MO5NR: * chips: - - integrated EF 6854 network controller + - integrated MC 6854 network controller * memory: - extra 2 KB ROM for the integrated network controller, @@ -2148,21 +2246,27 @@ ROM_START ( mo5nr ) /* BIOS */ ROM_LOAD ( "mo5nr-0.rom", 0x23000, 0x1000, + CRC(06e31115) MD5(5826a0190d7d0eb9a03c327072198a5d) ) ROM_LOAD ( "mo5nr-1.rom", 0x27000, 0x1000, + CRC(7cda17c9) MD5(ede3dd012cd15ad5066581522ce724b5) ) /* BASIC */ ROM_LOAD ( "basicn-0.rom", 0x20000, 0x3000, + CRC(fae9e691) MD5(03c7d856a17b34c7b295b22038c89c8f) ) ROM_LOAD ( "basicn-1.rom", 0x24000, 0x3000, + CRC(cf134dd7) MD5(e8069cd0857735e856ac0125b473b696) ) ROM_LOAD ( "basicn-2.rom", 0x28000, 0x4000, + CRC(b69d2e0d) MD5(cd11f0244c0cd30fd315c14e83b21381) ) ROM_LOAD ( "basicn-3.rom", 0x2c000, 0x4000, + CRC(7785610f) MD5(c67c65ac66c5f82bea3fcb83c2308a51) ) - ROM_FLOPPY ( 0x50000 ) + ROM_FLOPPY5 ( 0x50000 ) ROM_FILL ( 0x10000, 0x10000, 0x39 ) /* TODO: network ROM */ ROM_END diff --git a/mess/systems/ti990_10.c b/mess/systems/ti990_10.c index 80c856f0e..19dfb2f29 100644 --- a/mess/systems/ti990_10.c +++ b/mess/systems/ti990_10.c @@ -118,7 +118,7 @@ static void lrex_callback(void) */ -static int video_start_ti990_10(void) +static VIDEO_START( ti990_10 ) { const vdt911_init_params_t params = { @@ -276,7 +276,7 @@ ROM_START(ti990_10) ROM_END -static void init_ti990_10(void) +static DRIVER_INIT( ti990_10 ) { #if 0 /* load specific ti990/12 rom page */ diff --git a/mess/systems/ti990_4.c b/mess/systems/ti990_4.c index 0c92cd47a..772028d5c 100644 --- a/mess/systems/ti990_4.c +++ b/mess/systems/ti990_4.c @@ -312,7 +312,7 @@ ROM_START(ti990_4) ROM_END -static void init_ti990_4(void) +static DRIVER_INIT( ti990_4 ) { #if VIDEO_911 vdt911_init(); diff --git a/mess/systems/ti99_2.c b/mess/systems/ti99_2.c index 082c21dd0..0d185eda5 100644 --- a/mess/systems/ti99_2.c +++ b/mess/systems/ti99_2.c @@ -84,13 +84,13 @@ would just have taken three extra tracks on the main board and a OR gate in an A static int ROM_paged; -static void init_ti99_2_24(void) +static DRIVER_INIT( ti99_2_24 ) { /* no ROM paging */ ROM_paged = 0; } -static void init_ti99_2_32(void) +static DRIVER_INIT( ti99_2_32 ) { /* ROM paging enabled */ ROM_paged = 1; @@ -142,7 +142,7 @@ static unsigned short ti99_2_colortable[] = static PALETTE_INIT(ti99_2) { - palette_set_colors(0, ti99_2_palette, TI99_2_PALETTE_SIZE); + palette_set_colors(machine, 0, ti99_2_palette, TI99_2_PALETTE_SIZE); memcpy(colortable, & ti99_2_colortable, sizeof(ti99_2_colortable)); } @@ -150,7 +150,7 @@ static VIDEO_START(ti99_2) { videoram_size = 768; - return video_start_generic(); + return video_start_generic(machine); } #define ti99_2_video_w videoram_w diff --git a/mess/systems/tm990189.c b/mess/systems/tm990189.c index 1418f76cd..f589fe040 100644 --- a/mess/systems/tm990189.c +++ b/mess/systems/tm990189.c @@ -230,9 +230,9 @@ static MACHINE_RESET( tm990_189_v ) Supports EIA and TTY terminals, and an optional 9918 controller. */ -static void palette_init_tm990_189(unsigned short *colortable, const unsigned char *dummy) +static PALETTE_INIT( tm990_189 ) { - palette_set_colors(0, tm990_189_palette, tm990_189_palette_size); + palette_set_colors(machine, 0, tm990_189_palette, tm990_189_palette_size); /*memcpy(colortable, & tm990_189_colortable, sizeof(tm990_189_colortable));*/ } @@ -306,7 +306,7 @@ static VIDEO_UPDATE( tm990_189 ) static VIDEO_UPDATE( tm990_189_v ) { - video_update_tms9928a(screen, bitmap, cliprect); + video_update_tms9928a(machine, screen, bitmap, cliprect); plot_box(bitmap, LED_display_window_left, LED_display_window_top, LED_display_window_width, LED_display_window_height, Machine->pens[1]); update_common(bitmap, diff --git a/mess/systems/trs80.c b/mess/systems/trs80.c index 8ddfa5605..5908ab82b 100644 --- a/mess/systems/trs80.c +++ b/mess/systems/trs80.c @@ -259,7 +259,7 @@ static unsigned short trs80_colortable[] = /* Initialise the palette */ static PALETTE_INIT( trs80 ) { - palette_set_colors(0, trs80_palette, sizeof(trs80_palette)/3); + palette_set_colors(machine, 0, trs80_palette, sizeof(trs80_palette)/3); memcpy(colortable,trs80_colortable,sizeof(trs80_colortable)); } diff --git a/mess/systems/tx0.c b/mess/systems/tx0.c index b73d6701e..18be3f0db 100644 --- a/mess/systems/tx0.c +++ b/mess/systems/tx0.c @@ -21,7 +21,7 @@ static UINT32 *tx0_memory; Set up the tx0_memory pointer */ -static void init_tx0(void) +static DRIVER_INIT( tx0 ) { UINT8 *dst; @@ -280,7 +280,7 @@ static PALETTE_INIT( tx0 ) g = (int) ((g1*cur_level_1 + g2*cur_level_2) + .5); b = (int) ((b1*cur_level_1 + b2*cur_level_2) + .5); /* write color in palette */ - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); /* apply decay for next iteration */ cur_level_1 *= decay_1; cur_level_2 *= decay_2; @@ -300,10 +300,10 @@ static PALETTE_INIT( tx0 ) printf("File %s line %d: Please take higher value for pen_crt_num_levels or smaller value for decay\n", __FILE__, __LINE__);*/ #endif - palette_set_color(0, 0, 0, 0); + palette_set_color(machine, 0, 0, 0, 0); /* load static palette */ - palette_set_colors(pen_crt_num_levels, palette, sizeof(palette) / sizeof(palette[0]) / 3); + palette_set_colors(machine, pen_crt_num_levels, palette, sizeof(palette) / sizeof(palette[0]) / 3); memcpy(colortable, tx0_colortable, sizeof(tx0_colortable)); } diff --git a/mess/systems/vc20.c b/mess/systems/vc20.c index 6ca4cb866..710d14007 100644 --- a/mess/systems/vc20.c +++ b/mess/systems/vc20.c @@ -619,7 +619,7 @@ INPUT_PORTS_END /* Initialise the vc20 palette */ static PALETTE_INIT( vc20 ) { - palette_set_colors(0, vic6560_palette, sizeof(vic6560_palette) / 3); + palette_set_colors(machine, 0, vic6560_palette, sizeof(vic6560_palette) / 3); /* memcpy(sys_colortable,colortable,sizeof(colortable)); */ } diff --git a/mess/systems/vc4000.c b/mess/systems/vc4000.c index d5f308315..16b33d4b9 100644 --- a/mess/systems/vc4000.c +++ b/mess/systems/vc4000.c @@ -175,7 +175,7 @@ static const unsigned short vc4000_colortable[1][2] = static PALETTE_INIT( vc4000 ) { - palette_set_colors(0, vc4000_palette, sizeof(vc4000_palette) / 3); + palette_set_colors(machine, 0, vc4000_palette, sizeof(vc4000_palette) / 3); memcpy(colortable, vc4000_colortable,sizeof(vc4000_colortable)); } diff --git a/mess/systems/vtech2.c b/mess/systems/vtech2.c index 403b19366..8b0624763 100644 --- a/mess/systems/vtech2.c +++ b/mess/systems/vtech2.c @@ -446,7 +446,7 @@ static PALETTE_INIT( vtech2 ) { int i; - palette_set_colors(0, vt_palette, sizeof(vt_palette) / 3); + palette_set_colors(machine, 0, vt_palette, sizeof(vt_palette) / 3); for (i = 0; i < 256; i++) { diff --git a/mess/systems/wswan.c b/mess/systems/wswan.c index 08951a55b..ce0c3f2b6 100644 --- a/mess/systems/wswan.c +++ b/mess/systems/wswan.c @@ -39,7 +39,7 @@ static ADDRESS_MAP_START (wswan_mem, ADDRESS_SPACE_PROGRAM, 8) AM_RANGE(0x00000, 0x03fff) AM_RAM /* 16kb RAM / 4 colour tiles */ AM_RANGE(0x04000, 0x0ffff) AM_NOP /* nothing */ - AM_RANGE(0x10000, 0x1ffff) AM_RAMBANK(1) /* SRAM bank */ + AM_RANGE(0x10000, 0x1ffff) AM_READWRITE( wswan_sram_r, wswan_sram_w ) /* SRAM bank */ AM_RANGE(0x20000, 0x2ffff) AM_ROMBANK(2) /* ROM bank 1 */ AM_RANGE(0x30000, 0x3ffff) AM_ROMBANK(3) /* ROM bank 2 */ AM_RANGE(0x40000, 0x4ffff) AM_ROMBANK(4) /* ROM bank 3 */ @@ -58,7 +58,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START (wscolor_mem, ADDRESS_SPACE_PROGRAM, 8) AM_RANGE(0x00000, 0x0ffff) AM_RAM /* 16kb RAM / 4 colour tiles, 16 colour tiles + palettes */ - AM_RANGE(0x10000, 0x1ffff) AM_RAMBANK(1) /* SRAM bank */ + AM_RANGE(0x10000, 0x1ffff) AM_READWRITE( wswan_sram_r, wswan_sram_w ) /* SRAM bank */ AM_RANGE(0x20000, 0x2ffff) AM_ROMBANK(2) /* ROM bank 1 */ AM_RANGE(0x30000, 0x3ffff) AM_ROMBANK(3) /* ROM bank 2 */ AM_RANGE(0x40000, 0x4ffff) AM_ROMBANK(4) /* ROM bank 3 */ @@ -106,7 +106,7 @@ static PALETTE_INIT( wswan ) for( ii = 0; ii < 16; ii++ ) { UINT8 shade = ii * (256 / 16); - palette_set_color( 15 - ii, shade, shade, shade ); + palette_set_color(machine, 15 - ii, shade, shade, shade ); } } @@ -116,7 +116,7 @@ static PALETTE_INIT( wscolor ) { int r = ( i & 0x0F00 ) >> 8; int g = ( i & 0x00F0 ) >> 4; int b = i & 0x000F; - palette_set_color( i, r << 4, g << 4, b << 4 ); + palette_set_color(machine, i, r << 4, g << 4, b << 4 ); } } diff --git a/mess/systems/zx.c b/mess/systems/zx.c index e6e0ae543..6299eaea8 100644 --- a/mess/systems/zx.c +++ b/mess/systems/zx.c @@ -370,19 +370,19 @@ static unsigned short zx_colortable[] = static PALETTE_INIT( zx80 ) { - palette_set_colors(0, zx80_palette, sizeof(zx80_palette) / 3); + palette_set_colors(machine, 0, zx80_palette, sizeof(zx80_palette) / 3); memcpy(colortable, zx_colortable, sizeof (zx_colortable)); } static PALETTE_INIT( zx81 ) { - palette_set_colors(0, zx81_palette, sizeof(zx81_palette) / 3); + palette_set_colors(machine, 0, zx81_palette, sizeof(zx81_palette) / 3); memcpy(colortable, zx_colortable, sizeof (zx_colortable)); } static PALETTE_INIT( ts1000 ) { - palette_set_colors(0, ts1000_palette, sizeof(ts1000_palette) / 3); + palette_set_colors(machine, 0, ts1000_palette, sizeof(ts1000_palette) / 3); memcpy(colortable, zx_colortable, sizeof (zx_colortable)); } diff --git a/mess/tests/mess_c64.xml b/mess/tests/mess_c64.xml new file mode 100644 index 000000000..bb0d24cb0 --- /dev/null +++ b/mess/tests/mess_c64.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/mess/tools/imgtool/filter.c b/mess/tools/imgtool/filter.c index 896f1bcbc..df7578f7c 100644 --- a/mess/tools/imgtool/filter.c +++ b/mess/tools/imgtool/filter.c @@ -55,6 +55,10 @@ const filter_getinfoproc filters[] = filter_macbinary_getinfo, filter_vzsnapshot_getinfo, filter_vzbas_getinfo, + filter_thombas5_getinfo, + filter_thombas7_getinfo, + filter_thombas128_getinfo, + filter_thomcrypt_getinfo, NULL }; diff --git a/mess/tools/imgtool/filter.h b/mess/tools/imgtool/filter.h index ab72bd269..c0e5af69c 100644 --- a/mess/tools/imgtool/filter.h +++ b/mess/tools/imgtool/filter.h @@ -56,6 +56,10 @@ extern void filter_dragonbas_getinfo(UINT32 state, union filterinfo *info); extern void filter_macbinary_getinfo(UINT32 state, union filterinfo *info); extern void filter_vzsnapshot_getinfo(UINT32 state, union filterinfo *info); extern void filter_vzbas_getinfo(UINT32 state, union filterinfo *info); +extern void filter_thombas5_getinfo(UINT32 state, union filterinfo *info); +extern void filter_thombas7_getinfo(UINT32 state, union filterinfo *info); +extern void filter_thombas128_getinfo(UINT32 state, union filterinfo *info); +extern void filter_thomcrypt_getinfo(UINT32 state, union filterinfo *info); #endif /* FILTER_H */ diff --git a/mess/tools/imgtool/imgtool.mak b/mess/tools/imgtool/imgtool.mak index 458b7848d..7b881e36b 100644 --- a/mess/tools/imgtool/imgtool.mak +++ b/mess/tools/imgtool/imgtool.mak @@ -46,6 +46,7 @@ IMGTOOL_LIB_OBJS = \ $(OBJ)/mess/tools/imgtool/pc_hard.o \ $(OBJ)/mess/tools/imgtool/prodos.o \ $(OBJ)/mess/tools/imgtool/vzdos.o \ + $(OBJ)/mess/tools/imgtool/thomson.o \ $(OBJ)/mess/tools/imgtool/macutil.o # $(OBJ)/mess/tools/imgtool/tstsuite.o \ # $(OBJ)/mess/formats/fmsx_cas.o \ diff --git a/mess/tools/imgtool/main.c b/mess/tools/imgtool/main.c index e3252ca3b..ad8a00cad 100644 --- a/mess/tools/imgtool/main.c +++ b/mess/tools/imgtool/main.c @@ -739,7 +739,7 @@ static int cmd_listfilters(const struct command *c, int argc, char *argv[]) { fprintf(stdout, " %-11s%s\n", filter_get_info_string(filters[i], FILTINFO_STR_NAME), - filter_get_info_string(filters[i], FILTINFO_STR_NAME)); + filter_get_info_string(filters[i], FILTINFO_STR_HUMANNAME)); } return 0; diff --git a/mess/tools/imgtool/modules.c b/mess/tools/imgtool/modules.c index e74304a57..bed29b126 100644 --- a/mess/tools/imgtool/modules.c +++ b/mess/tools/imgtool/modules.c @@ -104,5 +104,8 @@ MODULE(pc_floppy) MODULE(pc_chd) MODULE(prodos_525) MODULE(prodos_35) +MODULE(thom_fd_basic) +MODULE(thom_qd_basic) +MODULE(thom_sap_basic) #endif /* MODULES_RECURSIVE */ diff --git a/mess/tools/imgtool/thomson.c b/mess/tools/imgtool/thomson.c new file mode 100644 index 000000000..1fec4f7cf --- /dev/null +++ b/mess/tools/imgtool/thomson.c @@ -0,0 +1,1685 @@ +/**************************************************************************** + + Copyright (C) Antoine Mine' 2006 + + Thomson 8-bit micro-computers. + + Handles SAP, QD and FD floppy formats with a BASIC-DOS filesystem + (most floppies except some games and demo). + +*****************************************************************************/ + +/* TODO: + - improve two-sided floppy support + - check & correct BASIC read filter + - implement BASIC write filter + - handle accented letters + */ + + +/* Thomson floppy geometry are: + - 5"1/4 single density: 40 tracks, 16 sectors/track, 128 bytes/sector + - 5"1/4 double density: 40 tracks, 16 sectors/track, 256 bytes/sector + - 3"1/2 double density: 80 tracks, 16 sectors/track, 256 bytes/sector + - 2"8: 25 logical tracks, 16 logical sectors/track, 128 bytes/sector + + Notes: + + - 2"8 QDD actually contain a single spiraling track, with 400 128-byte + sectors; however, the filesystem considers it has 25 virtual tracks of + 16 sectors => we do the same in imgtool (but thomflop.c uses a 400-sector + addressing to emulate the device hardware) + + - tracks always have 16 sectors, this is requred by the filesystem + + - two-sided floppies are handled as two one-sided floppies in two + logical floppy drives on the original Thomsons; each has its own + independent FAT and directory. + In imgtool, we handle two-sided images as two partitions. + For now, only 3"1/2 .fd and QDD .qd files can be two-sided. + + - it seems possible to create 3"1/2 single density floppies on the TO9, + I am not sure this is standard, and we do not support it... + +*/ + + +/* Microsoft BASIC Filesystem. + + The floppy is divided into blocks, with always two blocks / track. + Also, in double density, only the first 255 bytes of each 256-byte + sector is used. Thus, blocks are 1024 bytes in single density, and + 2040 bytes in double density. + Depending on the number of tracks, there can be 50, 80 or 160 blocks. + + Filesystem data always occupy track 20, whatever the floppy geometry. + + * sector 1: + - bytes 0-7: floppy name + - remaining bytes: undocumented, seem unused + + * sector 2: FAT, 1 byte info per block + - byte 0: always 0 + - byte 1: block 0 + ... + - byte i: block i-1 + ... + - byte 160: block 159 + - remaining bytes: undocumented, seem unused + + The byte has the following meaning: + - ff: block is free + - fb: block is reserved + - 00-bf: block allocated, points to then next file block + - c1-c8: last block in file, (value & 15) is the number of sectors + actually allocated to the file + + Note: in single density, we can reference only 127 blocks. This is not + a problem because single density floppies can only have 50 or 80 blocks, + never 160. + + * sector 3-16: directory + + no subdirectories + + each file entry occupies 32 bytes: + - bytes 00-07: filename, padded with whitespaces + - bytes 08-0A: file extension, padedd with whitespaces + - byte 0B: file type + . 0 = BASIC, ASCII or binary program (B) + . 1 = BASIC or ASCII data (D) + . 2 = machine code (M) + . 3 = ASCII assembler file (A) + - byte 0C: format flag + . 00 = binary (tokenized) + . ff = ASCII + - byte 0D: first block + - bytes 0E-0F: bytes used in the last sector + - bytes 10-17: comment + - byte 18: day (of month) + - byte 19: month + - byte 1A: year (two last digits) + - bytes 1B-1f: unknown + + Note that byte 0 has a special significance: + - 00: free directory entry + - 20-7F: actual directory entry, value is the first character ini filename + - ff: end of directory + + There can be 56 files in single density, 112 in double density. + */ + +#include "imgtool.h" +#include "iflopimg.h" +#include "formats/basicdsk.h" + +#include + + +#define MAXSIZE 80*16*256*2 /* room for two faces, double-density, 80 tracks */ + +typedef struct { + + imgtool_stream *stream; + + UINT16 sector_size; /* 128 or 256 */ + UINT16 sectuse_size; /* bytes used in sector: 128 or 255 */ + UINT8 tracks; /* 25, 40, or 80 */ + UINT8 heads; /* 1 or 2 */ + UINT8 data[MAXSIZE]; /* image data */ + + int modified; /* data need to be copied back to image file */ + +} thom_floppy; + + +typedef enum { + + THOM_DIRENT_END, + THOM_DIRENT_FREE, + THOM_DIRENT_FILE, + THOM_DIRENT_INVALID, + +} thom_dirent_type; + + +typedef struct { + + thom_dirent_type type; + int index; + + char name[9]; + char ext[4]; + char comment[9]; + UINT8 ftype; + UINT8 format; + UINT8 firstblock; + UINT16 lastsectsize; + UINT8 day; + UINT8 month; + UINT8 year; + +} thom_dirent; + + +static void thom_basic_get_info(const imgtool_class *clas, UINT32 param, + union imgtoolinfo *info); + +static UINT8* thom_get_sector(thom_floppy* f, unsigned head, + unsigned track, unsigned sector); + + +/*********************** .fd / .qd format ************************/ + +/* .fd and .qd formats are very simple: the sectors are simply put one after + another, starting at sector 1 of track 0 to sector 16 track 0, then + starting again at sector 1 of track 1, and so on. + There is no image or sector header, and no gap between sectors. + The number of tracks and sector size are determined by the extension + (.fd have 40 or 80 tracks, .qd have 25 tracks) and the file size. +*/ + +static imgtoolerr_t thom_open_fd_qd(imgtool_image *img, imgtool_stream *stream) +{ + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + int size = stream_size( stream ); + + f->stream = stream; + f->modified = 0; + + /* guess format */ + switch ( size ) { + + case 81920: + f->tracks = 40; + f->sector_size = 128; + f->sectuse_size = 128; + f->heads = 1; + break; + + case 163840: + f->tracks = 40; + f->sector_size = 256; + f->sectuse_size = 255; + f->heads = 1; + /* could also be: sector_size=128, heads=2 */ + /* maight even be: tracks=80, sector_size=128 */ + break; + + case 327680: + f->tracks = 80; + f->sector_size = 256; + f->sectuse_size = 255; + f->heads = 1; + /* could also be: tracks=40, heads=2 */ + break; + + case 655360: + f->tracks = 80; + f->sector_size = 256; + f->sectuse_size = 255; + f->heads = 2; + break; + + case 51200: + f->tracks = 25; + f->sector_size = 128; + f->sectuse_size = 128; + f->heads = 1; + break; + + case 62400: + f->tracks = 25; + f->sector_size = 128; + f->sectuse_size = 128; + f->heads = 2; + break; + + default: + return IMGTOOLERR_CORRUPTIMAGE; + } + + assert( size == f->heads * f->tracks * 16 * f->sector_size ); + + stream_seek( stream, 0, SEEK_SET ); + if ( stream_read( stream, f->data, size ) < size ) + return IMGTOOLERR_READERROR; + + return IMGTOOLERR_SUCCESS; +} + +static void thom_close_fd_qd(imgtool_image *img) +{ + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + + /* save image */ + if ( f->modified ) { + int size = f->heads * f->tracks * 16 * f->sector_size; + stream_seek( f->stream, 0, SEEK_SET ); + if ( stream_write( f->stream, f->data, size ) < size ) + logerror( "thom_diskimage_close_fd_qd: write error\n" ); + } + + stream_close( f->stream ); +} + + +/*********************** .sap format ************************/ + +/* SAP format, Copyright 1998 by Alexandre Pukall + + image is composed of: + - byte 0: version (0 or 1) + - bytes 1..65: signature + - bytes 66..end: sectors + + each sector is composed of + - a 4-byte header: + . byte 0: format + 0 3"1/2 double density + 1 5"1/4 low density + . byte 1: protection (?) + . byte 2: track index, in 0..79 + . byte 3: sector index, in 1..16 + - sector data, XOR 0xB3 + - 2-byte CRC of header + data, high byte first + + there is no provision for two-sided images in sap + */ + +static const int sap_magic_num = 0xB3; /* simple XOR crypt */ + +static const char sap_header[]= + "\001SYSTEME D'ARCHIVAGE PUKALL S.A.P. " + "(c) Alexandre PUKALL Avril 1998"; + +static const UINT16 sap_crc[] = { + 0x0000, 0x1081, 0x2102, 0x3183, 0x4204, 0x5285, 0x6306, 0x7387, + 0x8408, 0x9489, 0xa50a, 0xb58b, 0xc60c, 0xd68d, 0xe70e, 0xf78f, +}; + +static UINT16 thom_sap_crc( UINT8* data, int size ) +{ + int i; + UINT16 crc = 0xffff, crc2; + for ( i = 0; i < size; i++ ) { + crc2 = ( crc >> 4 ) ^ sap_crc[ ( crc ^ data[i] ) & 15 ]; + crc = ( crc2 >> 4 ) ^ sap_crc[ ( crc2 ^ (data[i] >> 4) ) & 15 ]; + } + return crc; +} + +static imgtoolerr_t thom_open_sap(imgtool_image *img, imgtool_stream *stream) +{ + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + UINT8 buf[262]; + + f->stream = stream; + f->modified = 0; + + /* check image header */ + stream_seek( stream, 0, SEEK_SET ); + stream_read( stream, buf, 66 ); + if ( memcmp( buf+1, sap_header+1, 65 ) ) return IMGTOOLERR_CORRUPTIMAGE; + + /* guess format */ + stream_read( stream, buf, 1 ); + switch ( buf[0] ) { + case 1: + case 3: + f->heads = 1; + f->tracks = 40; + f->sector_size = 128; + f->sectuse_size = 128; + break; + case 0: + case 2: + case 4: + f->heads = 1; + f->tracks = 80; + f->sector_size = 256; + f->sectuse_size = 255; + break; + default: return IMGTOOLERR_CORRUPTIMAGE; + } + + stream_seek( stream, 66, SEEK_SET ); + while ( 1) { + int i, sector, track; + UINT16 crc; + + /* load sector */ + if ( stream_read( stream, buf, 6 + f->sector_size ) < 6 + f->sector_size ) + break; + + /* parse sector header */ + track = buf[2]; + sector = buf[3]; + if ( sector < 1 || sector > 16 || track >= f->tracks ) + return IMGTOOLERR_CORRUPTIMAGE; + + /* decrypt */ + for ( i = 0; i < f->sector_size; i++ ) buf[ i + 4 ] ^= sap_magic_num; + memcpy( thom_get_sector( f, 0, track, sector ), buf + 4, f->sector_size ); + + /* check CRC */ + crc = thom_sap_crc( buf, f->sector_size + 4 ); + if ( ( (crc >> 8) != buf[ f->sector_size + 4 ] ) || + ( (crc & 0xff) != buf[ f->sector_size + 5 ] ) ) + return IMGTOOLERR_CORRUPTIMAGE; + } + + return IMGTOOLERR_SUCCESS; +} + +static void thom_close_sap(imgtool_image *img) +{ + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + + if ( f->modified ) { + int i, sector, track; + UINT8 buf[262]; + UINT16 crc; + + /* rewind */ + stream_seek( f->stream, 0, SEEK_SET ); + + /* image header */ + if ( stream_write( f->stream, sap_header, 66 ) < 66 ) { + logerror( "thom_diskimage_close_sap: write error\n" ); + return; + } + + for ( track = 0; track < f->tracks; track++ ) + for ( sector = 1; sector <= 16; sector++ ) { + + /* sector header & data */ + buf[0] = ( f->tracks == 80 ) ? 2 : 1; + buf[1] = 0; + buf[2] = track; + buf[3] = sector; + memcpy( buf + 4, + thom_get_sector( f, 0, track, sector), f->sector_size ); + + /* compute crc */ + crc = thom_sap_crc( buf, f->sector_size + 4 ); + buf[ f->sector_size + 4 ] = crc >> 8; + buf[ f->sector_size + 5 ] = crc & 0xff; + + /* crypt */ + for ( i = 0; i < f->sector_size; i++ ) buf[ i + 4 ] ^= sap_magic_num; + + /* save */ + if ( stream_write( f->stream, buf, f->sector_size + 6 ) < + f->sector_size + 6 ) { + logerror( "thom_diskimage_close_sap: write error\n" ); + return; + } + } + } + + stream_close( f->stream ); +} + + +/*********************** low-level functions *********************/ + +static UINT8* thom_get_sector(thom_floppy* f, unsigned head, + unsigned track, unsigned sector) +{ + assert( head < f->heads); + assert( track < f->tracks ); + assert( sector > 0 && sector <= 16 ); + return & f->data[ ( (head * f->tracks + track) * 16 + (sector-1) ) * + f->sector_size ]; +} + +static int thom_nb_blocks(thom_floppy* f) +{ + int n1 = f->tracks * 2; /* 2 blocks per track */ + int n2 = f->sector_size - 1; /* FAT entries */ + return (n1 < n2) ? n1 : n2; +} + +static int thom_max_dirent(thom_floppy* f) +{ + return 14 * f->sector_size / 32; +} + +/* remove trailing spaces */ +static void thom_stringify(char* str) +{ + char* s = str + strlen(str) - 1; + while ( s >= str && *s == ' ' ) { *s = 0; s--; } + for ( s = str; *s; s++ ) + if ( (UINT8)*s == 0xff ) *s = 0; + else if ( *s < ' ' || *s >= 127 ) *s = '?'; +} + +/* pad with spaces until the length is nb */ +static void thom_unstringity(char* str, int nb) +{ + char* s = str; + while ( s < str + nb && *s ) s++; + while ( s < str + nb ) { *s = ' '; s++; } +} + +/* get filename and extension & truncate them to 8 + 3 */ +static void thom_conv_filename(const char* s, char name[9], char ext[4]) +{ + int i; + memset( name, 0, 9 ); + memset( ext, 0, 4 ); + for ( i = 0; i < 8 && *s && *s != '.'; i++, s++ ) name[i] = *s; + while ( *s && *s != '.' ) s++; + if ( *s == '.' ) { + s++; + for ( i = 0; i < 3 && *s; i++, s++ ) ext[i] = *s; + } +} + +static time_t thom_crack_time(thom_dirent* d) +{ + struct tm t; + time_t now; + + /* check */ + if ( d->day < 1 || d->day > 31 || d->month < 1 || d->month > 12 ) return 0; + + /* converts */ + time( &now ); + t = *localtime( &now ); + t.tm_sec = 0; + t.tm_min = 0; + t.tm_hour = 0; + t.tm_mday = d->day; + t.tm_mon = d->month - 1; + t.tm_year = (d->year < 65 ) ? d->year + 100 : d->year; + return mktime(&t); +} + +static void thom_make_time(thom_dirent* d, time_t time) +{ + if ( ! time ) { + d->day = d->month = d->year = 0; + } + else { + struct tm t = *localtime( &time ); + d->day = t.tm_mday; + d->month = t.tm_mon + 1; + d->year = t.tm_year % 100; + } +} + +static void thom_make_time_now(thom_dirent* d) +{ + time_t now; + time( &now ); + thom_make_time( d, now ); +} + +static void thom_get_dirent(thom_floppy* f, unsigned head, + unsigned n, thom_dirent* d) +{ + UINT8* base = thom_get_sector( f, head, 20, 3 ) + n * 32; + memset( d, 0, sizeof(*d) ); + d->index = n; + if ( n >= thom_max_dirent( f ) ) + d->type = THOM_DIRENT_END; + else if ( *base == 0xff ) + d->type = THOM_DIRENT_END; + else if ( *base == 0 ) + d->type = THOM_DIRENT_FREE; + else { + int i; + /* fill regular entry */ + d->type = THOM_DIRENT_FILE; + memcpy( d->name, base, 8 ); + memcpy( d->ext, base + 8, 3 ); + memcpy( d->comment, base + 16, 8 ); + thom_stringify( d->name ); + thom_stringify( d->ext ); + thom_stringify( d->comment ); + d->ftype = base[11]; + d->format = base[12]; + d->firstblock = base[13]; + d->lastsectsize = ((int)base[14] << 8) + base[15]; + d->day = base[24]; + d->month = base[25]; + d->year = base[26]; + /* sanity check */ + for ( i = 0; i < 11; i++ ) + if ( base[i] < ' ' || base[i] > 127 ) d->type = THOM_DIRENT_INVALID; + } +} + +static void thom_set_dirent(thom_floppy* f, unsigned head, + unsigned n, thom_dirent* d) +{ + UINT8* base = thom_get_sector( f, head, 20, 3 ) + n * 32; + if ( n >= thom_max_dirent( f ) ) return; + memset( base, 0, 32 ); + if ( d->type == THOM_DIRENT_END ) base[ 0 ] = 0xff; + else if ( d->type == THOM_DIRENT_FREE ) base[ 0 ] = 0; + else { + memcpy( base, d->name, 8 ); + memcpy( base + 8, d->ext, 3 ); + memcpy( base + 16, d->comment, 8 ); + thom_unstringity( (char*)base, 8 ); + thom_unstringity( (char*)base + 8, 3 ); + if ( base[16] ) thom_unstringity( (char*)base + 16, 8 ); + base[11] = d->ftype; + base[12] = d->format; + base[13] = d->firstblock; + base[14] = d->lastsectsize >> 8; + base[15] = d->lastsectsize & 0xff; + base[24] = d->day; + base[25] = d->month; + base[26] = d->year; + } + f->modified = 1; +} + +/* returns 1 if file found, 0 if not */ +static int thom_find_dirent(thom_floppy* f, unsigned head, + const char* name, thom_dirent* d) +{ + int n = 0; + while ( 1 ) { + thom_get_dirent( f, head, n, d ); + if ( d->type == THOM_DIRENT_END ) return 0; + if ( d->type == THOM_DIRENT_FILE ) { + char buf[13]; + sprintf( buf, "%s.%s", d->name, d->ext ); + if ( ! strcmp( buf, name ) ) return 1; + } + n++; + } +} + +/* returns 1 if free entry found, 0 if none available */ +static int thom_find_free_dirent(thom_floppy* f, unsigned head, thom_dirent* d) +{ + int n = 0; + while ( 1 ) { + thom_get_dirent( f, head, n, d ); + if ( d->type == THOM_DIRENT_FREE ) return 1; + if ( d->type == THOM_DIRENT_END ) break; + n++; + } + if ( n + 1 >= thom_max_dirent( f ) ) return 0; + thom_set_dirent( f, head, n+1, d ); + d->type = THOM_DIRENT_FREE; + return 1; +} + +/* returns the file size in bytes, or -1 if error */ +static int thom_get_file_size(thom_floppy* f, unsigned head, thom_dirent* d) +{ + UINT8* fat = thom_get_sector( f, head, 20, 2 ); + int nbblocks = thom_nb_blocks(f); + int block = d->firstblock; + int size = 0; + int timeout = nbblocks; + if ( d->type != THOM_DIRENT_FILE ) return -1; + if ( block >= nbblocks ) return -1; + block = fat[ block + 1 ]; + while ( 1 ) { + if ( block < nbblocks ) { + /* full block */ + size += 8 * f->sectuse_size; + block = fat[ block + 1 ]; + } + else if ( block >= 0xc1 && block <= 0xc8 ) { + /* last block in file */ + size += (block-0xc1) * f->sectuse_size; + size += d->lastsectsize; + return size; + } + else return -1; + timeout--; + if ( timeout < 0 ) return -1; + } +} + +/* number of blocks used by file */ +static int thom_get_file_blocks(thom_floppy* f, unsigned head, thom_dirent* d) +{ + UINT8* fat = thom_get_sector( f, head, 20, 2 ); + int nbblocks = thom_nb_blocks(f); + int block = d->firstblock; + int nb = 0; + if ( d->type != THOM_DIRENT_FILE ) return 0; + if ( block >= nbblocks ) return 0; + block = fat[ block + 1 ]; + while ( 1 ) { + if ( block < nbblocks ) { + /* full block */ + nb++; + block = fat[ block + 1 ]; + } + else if ( block >= 0xc1 && block <= 0xc8 ) { + /* last block in file */ + nb++; + return nb; + } + else return nb; + } +} + +/* number of free blocks */ +static int thom_get_free_blocks(thom_floppy* f, unsigned head) +{ + UINT8* fat = thom_get_sector( f, head, 20, 2 ); + int nbblocks = thom_nb_blocks(f); + int i, nb = 0; + for ( i = 1; i <= nbblocks; i++ ) + if ( fat[i] == 0xff ) nb++; + return nb; +} + +/* dump file contents into dst */ +static void thom_get_file(thom_floppy* f, unsigned head, + thom_dirent* d, imgtool_stream *dst) +{ + UINT8* fat = thom_get_sector( f, head, 20, 2 ); + int nbblocks = thom_nb_blocks(f); + int block = d->firstblock; + if ( block >= nbblocks ) return; + while ( 1 ) { + int nextblock = fat[ block + 1 ]; + int track = block / 2; + int firstsect = (block % 2) ? 9 : 1; + if ( nextblock < nbblocks ) { + /* full block */ + int i; + for ( i = 0; i < 8; i++ ) { + UINT8* data = thom_get_sector( f, head, track, firstsect + i ); + stream_write( dst, data, f->sectuse_size ); + } + block = fat[ block + 1 ]; + } + else if ( nextblock >= 0xc1 && nextblock <= 0xc8 ) { + /* last block in file */ + int i; + UINT8* data; + for ( i = 0; i < nextblock - 0xc1; i++ ) { + data = thom_get_sector( f, head, track, firstsect + i ); + stream_write( dst, data, f->sectuse_size ); + } + data = thom_get_sector( f, head, track, firstsect + i ); + stream_write( dst, data, d->lastsectsize ); + return; + } + else { + /* invalid, assume last block */ + UINT8* data = thom_get_sector( f, head, track, firstsect ); + stream_write( dst, data, d->lastsectsize ); + return; + } + block = nextblock; + } +} + +static void thom_del_file(thom_floppy* f, unsigned head, thom_dirent* d) +{ + UINT8* fat = thom_get_sector( f, head, 20, 2 ); + int nbblocks = thom_nb_blocks(f); + int block = d->firstblock; + if ( d->type != THOM_DIRENT_FILE ) return; + if ( block >= nbblocks ) return; + while ( 1 ) { + int nextblock = fat[ block + 1 ]; + fat[ block ] = 0xff; + if ( nextblock < nbblocks ) block = fat[ block + 1 ]; + else break; + } + d->type = THOM_DIRENT_FREE; + thom_set_dirent( f, head, d->index, d ); + f->modified = 1; +} + +/* create a new file or overwrite an old one, with the contents of src */ +static void thom_put_file(thom_floppy* f, unsigned head, + thom_dirent* d, imgtool_stream *src) +{ + int size = stream_size( src ); + UINT8* fat = thom_get_sector( f, head, 20, 2 ); + int nbblocks = thom_nb_blocks(f); + int block; + + /* find first free block */ + for ( block = 0; block < nbblocks && fat[ block + 1 ] != 0xff; block++ ); + if ( block >= nbblocks ) return; + d->firstblock = block; + + /* store file */ + while (1) { + int track = block / 2; + int firstsect = (block % 2) ? 9 : 1; + int i; + + /* store data, full sectors */ + for ( i = 0; i < 8 && size > f->sectuse_size; i++ ) { + UINT8* dst = thom_get_sector( f, head, track, firstsect + i ); + stream_read( src, dst, f->sectuse_size ); + size -= f->sectuse_size; + } + + /* store data, last sector */ + if ( i < 8 ) { + UINT8* dst = thom_get_sector( f, head, track, firstsect + i ); + stream_read( src, dst, size ); + fat[ block + 1 ] = 0xc1 + i; + d->lastsectsize = size; + break; + } + + /* find next free block & update fat */ + i = block; + for ( block++; block < nbblocks && fat[ block + 1 ] != 0xff; block++ ); + if ( block >= nbblocks ) { + /* out of memory! */ + fat[ i + 1 ] = 0; + d->lastsectsize = 0; + break; + } + fat[ i + 1 ] = block; + } + + d->type = THOM_DIRENT_FILE; + thom_set_dirent( f, head, d->index, d ); + f->modified = 1; +} + + +/********************** module functions ***********************/ + +static imgtoolerr_t thom_get_sector_size(imgtool_image* img, UINT32 track, + UINT32 head, UINT32 sector, + UINT32 *sector_size) +{ + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + + if ( head >= f->heads || sector < 1 || sector > 16 || track >= f->tracks ) { + if ( sector_size ) *sector_size = 0; + return IMGTOOLERR_SEEKERROR; + } + if ( sector_size ) *sector_size = f->sector_size; + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thom_get_geometry(imgtool_image* img, UINT32* tracks, + UINT32* heads, UINT32* sectors) +{ + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + if ( tracks ) *tracks = f->tracks; + if ( heads ) *heads = f->heads; + if ( sectors ) *sectors = 16; + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thom_read_sector(imgtool_image* img, UINT32 track, + UINT32 head, UINT32 sector, void *buf, + size_t len) +{ + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + if ( head >= f->heads || sector < 1 || sector > 16 || track >= f->tracks ) + return IMGTOOLERR_SEEKERROR; + if ( len > f->sector_size) return IMGTOOLERR_READERROR; + memcpy( buf, thom_get_sector( f, head, track, sector ), len ); + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thom_write_sector(imgtool_image *img, UINT32 track, + UINT32 head, UINT32 sector, + const void *buf, size_t len) +{ + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + if ( stream_isreadonly( f->stream ) ) return IMGTOOLERR_WRITEERROR; + if ( head >= f->heads || sector < 1 || sector > 16 || track >= f->tracks ) + return IMGTOOLERR_SEEKERROR; + if ( len > f->sector_size) return IMGTOOLERR_WRITEERROR; + f->modified = 1; + memcpy( thom_get_sector( f, head, track, sector ), buf, len ); + return IMGTOOLERR_SUCCESS; +} + +/* returns floopy name */ +/* actually, each side has its own name, but we only return the one on side 0. + */ +static void thom_info(imgtool_image *img, char *string, size_t len) +{ + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + UINT8* base = thom_get_sector( f, 0, 20, 1 ); + char buf[9]; + memcpy( buf, base, 8 ); + buf[8] = 0; + thom_stringify( buf ); + strncpy( string, buf, len ); +} + +/* each side of a floppy has its own filesystem, we treat them as'partitions' + */ +static imgtoolerr_t thom_list_partitions(imgtool_image *img, + imgtool_partition_info *partitions, + size_t len) +{ + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + if ( len >= 1 ) { + partitions[0].get_info = thom_basic_get_info; + partitions[0].base_block = 0; + partitions[0].block_count = 1; + } + if ( len >= 2 && f->heads >= 2 ) { + partitions[1].get_info = thom_basic_get_info; + partitions[1].base_block = 1; + partitions[1].block_count = 1; + } + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thom_open_partition(imgtool_partition *part, + UINT64 first_block, UINT64 block_count) +{ + imgtool_image* img = imgtool_partition_image( part ); + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + if ( first_block >= f->heads ) + return IMGTOOLERR_INVALIDPARTITION; + * ( (int*) imgtool_partition_extra_bytes( part ) ) = first_block; + return IMGTOOLERR_SUCCESS; +} + + +static imgtoolerr_t thom_begin_enum(imgtool_directory *enumeration, + const char *path) +{ + int* n = (int*) imgtool_directory_extrabytes( enumeration ); + *n = 0; + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thom_next_enum(imgtool_directory *enumeration, + imgtool_dirent *ent) +{ + imgtool_partition *part = imgtool_directory_partition( enumeration); + int head = *( (int*) imgtool_partition_extra_bytes( part ) ); + imgtool_image* img = imgtool_partition_image( part ); + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + int* n = (int*) imgtool_directory_extrabytes( enumeration ); + thom_dirent d; + + do { + thom_get_dirent( f, head, *n, &d ); + (*n) ++; + } + while ( d.type == THOM_DIRENT_FREE ); + if ( d.type == THOM_DIRENT_END ) ent->eof = 1; + else if ( d.type == THOM_DIRENT_INVALID ) { + ent->corrupt = 1; + } + else { + int size; + snprintf( ent->filename, sizeof(ent->filename), "%s.%s", d.name, d.ext ); + snprintf( ent->attr, sizeof(ent->attr), "%c %c %s", + (d.ftype == 0) ? 'B' : (d.ftype == 1) ? 'D' : + (d.ftype == 2) ? 'M' : (d.ftype == 3) ? 'A' : '?', + (d.format == 0) ? 'B' : (d.format == 0xff) ? 'A' : '?', + d.comment ); + ent->creation_time = thom_crack_time( &d ); + size = thom_get_file_size( f, head, &d ); + if ( size >= 0 ) ent->filesize = size; + else { + ent->filesize = 0; + ent->corrupt = 1; + } + } + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thom_free_space(imgtool_partition *part, UINT64 *size) +{ + int head = *( (int*) imgtool_partition_extra_bytes( part ) ); + imgtool_image* img = imgtool_partition_image( part ); + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + int nb = thom_get_free_blocks( f, head ); + (*size) = nb * f->sectuse_size * 8; + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thom_read_file(imgtool_partition *part, + const char *filename, + const char *fork, + imgtool_stream *destf) +{ + int head = *( (int*) imgtool_partition_extra_bytes( part ) ); + imgtool_image* img = imgtool_partition_image( part ); + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + thom_dirent d; + char name[9], ext[4], fname[14]; + int size; + + /* convert filename */ + thom_conv_filename( filename, name, ext ); + sprintf( fname, "%s.%s", name, ext ); + + if ( ! thom_find_dirent( f, head, fname, &d ) ) + return IMGTOOLERR_FILENOTFOUND; + size = thom_get_file_size( f, head, &d ); + if ( size < 0 ) return IMGTOOLERR_CORRUPTFILE; + thom_get_file( f, head, &d, destf ); + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thom_delete_file(imgtool_partition *part, + const char *filename) +{ + int head = *( (int*) imgtool_partition_extra_bytes( part ) ); + imgtool_image* img = imgtool_partition_image( part ); + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + thom_dirent d; + char name[9], ext[4], fname[14]; + + /* convert filename */ + thom_conv_filename( filename, name, ext ); + sprintf( fname, "%s.%s", name, ext ); + + if ( ! thom_find_dirent( f, head, fname, &d ) ) + return IMGTOOLERR_FILENOTFOUND; + /*if ( thom_get_file_size( f, head, &d ) < 0 ) return IMGTOOLERR_CORRUPTFILE;*/ + if ( stream_isreadonly( f->stream ) ) return IMGTOOLERR_WRITEERROR; + thom_del_file( f, head, &d ); + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thom_write_file(imgtool_partition *part, + const char *filename, + const char *fork, + imgtool_stream *sourcef, + option_resolution *opts) +{ + int head = *( (int*) imgtool_partition_extra_bytes( part ) ); + imgtool_image* img = imgtool_partition_image( part ); + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + thom_dirent d; + int size = stream_size( sourcef ); + int blocks = thom_get_free_blocks( f, head ); + char name[9], ext[4], fname[14]; + const char* comment; + int is_new = 1; + + if ( stream_isreadonly( f->stream ) ) return IMGTOOLERR_WRITEERROR; + + /* convert filename */ + thom_conv_filename( filename, name, ext ); + sprintf( fname, "%s.%s", name, ext ); + + /* check available space & find dir entry */ + if ( thom_find_dirent( f, head, fname, &d ) ) { + /* file already exists: delete it */ + if ( thom_get_file_size( f, head, &d ) < 0 ) return IMGTOOLERR_CORRUPTFILE; + blocks += thom_get_file_blocks( f, head, &d ); + if ( blocks * 8 * f->sectuse_size < size ) return IMGTOOLERR_NOSPACE; + thom_del_file( f, head, &d ); + is_new = 0; + } + else { + /* new file, need new dir entry */ + if ( blocks * 8 * f->sectuse_size < size ) return IMGTOOLERR_NOSPACE; + if ( ! thom_find_free_dirent( f, head, &d ) ) return IMGTOOLERR_NOSPACE; + thom_make_time_now( &d ); + } + + /* fill-in dir entry */ + memcpy( d.name, name, 9 ); + memcpy( d.ext, ext, 4 ); + + /* file type */ + switch ( option_resolution_lookup_int( opts, 'T' ) ) { + case 0: + if ( ! is_new ) break; + if ( ! mame_stricmp( ext, "BAS" ) ) d.ftype = 0; + else if ( ! mame_stricmp( ext, "BAT" ) ) d.ftype = 0; + else if ( ! mame_stricmp( ext, "DAT" ) ) d.ftype = 1; + else if ( ! mame_stricmp( ext, "ASC" ) ) d.ftype = 1; + else if ( ! mame_stricmp( ext, "BIN" ) ) d.ftype = 2; + else if ( ! mame_stricmp( ext, "MAP" ) ) d.ftype = 2; + else if ( ! mame_stricmp( ext, "CFG" ) ) d.ftype = 2; + else if ( ! mame_stricmp( ext, "ASM" ) ) d.ftype = 3; + else d.ftype = 2; + break; + case 1: d.ftype = 0; break; + case 2: d.ftype = 1; break; + case 3: d.ftype = 2; break; + case 4: d.ftype = 3; break; + } + + /* format flag */ + switch ( option_resolution_lookup_int( opts, 'F' ) ) { + case 0: + if ( ! is_new ) break; + if ( ! mame_stricmp( ext, "DAT" ) ) d.format = 0xff; + else if ( ! mame_stricmp( ext, "ASC" ) ) d.format = 0xff; + else if ( ! mame_stricmp( ext, "ASM" ) ) d.format = 0xff; + else d.format = 0; + break; + case 1: d.format = 0; break; + case 2: d.format = 0xff; break; + } + + /* comment */ + comment = option_resolution_lookup_string( opts, 'C' ); + if ( comment && *comment ) + strncpy( d.comment, comment, 8 ); + + /* write file */ + thom_put_file( f, head, &d, sourcef ); + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thom_suggest_transfer(imgtool_partition *part, + const char *fname, + imgtool_transfer_suggestion *suggestions, + size_t suggestions_length) +{ + int head = *( (int*) imgtool_partition_extra_bytes( part ) ); + imgtool_image* img = imgtool_partition_image( part ); + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + thom_dirent d; + int is_basic = 0; + + if ( suggestions_length < 1 ) return IMGTOOLERR_SUCCESS; + + if ( fname ) { + if ( ! thom_find_dirent( f, head, fname, &d ) ) + return IMGTOOLERR_FILENOTFOUND; + if ( d.ftype == 0 && d.format == 0 ) is_basic = 1; + } + + if ( is_basic ) { + suggestions[0].viability = SUGGESTION_RECOMMENDED; + suggestions[0].filter = filter_thombas128_getinfo; + if ( suggestions_length >= 2 ) { + suggestions[1].viability = SUGGESTION_POSSIBLE; + suggestions[1].filter = filter_thombas7_getinfo; + } + if ( suggestions_length >= 3 ) { + suggestions[2].viability = SUGGESTION_POSSIBLE; + suggestions[2].filter = filter_thombas5_getinfo; + } + if ( suggestions_length >= 4 ) { + suggestions[3].viability = SUGGESTION_POSSIBLE; + suggestions[3].filter = NULL; + } + } + else { + suggestions[0].viability = SUGGESTION_RECOMMENDED; + suggestions[0].filter = NULL; + } + + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thom_create(imgtool_image* img, + imgtool_stream *stream, + option_resolution *opts) +{ + thom_floppy* f = (thom_floppy*) imgtool_image_extra_bytes( img ); + int i; + UINT8* buf; + const char* name; + + f->stream = stream; + f->modified = 0; + + /* get parameters */ + f->heads = option_resolution_lookup_int( opts, 'H' ); + f->tracks = option_resolution_lookup_int( opts, 'T' ); + name = option_resolution_lookup_string( opts, 'N' ); + switch ( option_resolution_lookup_int( opts, 'D' ) ) { + case 0: f->sector_size = 128; f->sectuse_size = 128; break; + case 1: f->sector_size = 256; f->sectuse_size = 255; break; + default: return IMGTOOLERR_PARAMCORRUPT; + } + + /* sanity checks */ + switch ( f->tracks ) { + case 25: if ( f->sector_size != 128 ) return IMGTOOLERR_PARAMCORRUPT; break; + case 40: break; + case 80: if ( f->sector_size != 256 ) return IMGTOOLERR_PARAMCORRUPT; break; + default: return IMGTOOLERR_PARAMCORRUPT; + } + + memset( f->data, 0xe5, sizeof( f->data ) ); + + for ( i = 0; i < f->heads; i++ ) { + + /* disk info */ + buf = thom_get_sector( f, i, 20, 1 ); + memset( buf, 0xff, f->sector_size ); + if ( name ) { + strncpy( (char*)buf, name, 8 ); + thom_unstringity( (char*)buf, 8 ); + } + else memset( buf, ' ', 8 ); + + /* FAT */ + buf = thom_get_sector( f, i, 20, 2 ); + memset( buf, 0, f->sector_size ); + memset( buf + 1, 0xff, thom_nb_blocks( f ) ); + buf[ 41 ] = buf[ 42 ] = 0xfe; /* reserved for FAT */ + + /* (empty) directory */ + buf = thom_get_sector( f, i, 20, 3 ); + memset( buf, 0xff, 14 * f->sector_size ); + } + + f->modified = 1; + + return IMGTOOLERR_SUCCESS; +} + + +/****************** BASIC tokenization *********************/ + +/* character codes >= 128 are reserved for BASIC keywords */ + +static const char* thombas7[2][128] = { + { /* statements */ + "END", "FOR", "NEXT", "DATA", "DIM", "READ", "LET", "GO", "RUN", "IF", + "RESTORE", "RETURN", "REM", "'", "STOP", "ELSE", "TRON", "TROFF", "DEFSTR", + "DEFINT", "DEFSNG", "DEFDBL", "ON", "WAIT", "ERROR", "RESUME", "AUTO", + "DELETE", "LOCATE", "CLS", "CONSOLE", "PSET", "MOTOR", "SKIP", "EXEC", + "BEEP", "COLOR", "LINE", "BOX", "UNMASK", "ATTRB", "DEF", "POKE", "PRINT", + "CONT", "LIST", "CLEAR", "WHILE", "WHEN", "NEW", "SAVE", "LOAD", "MERGE", + "OPEN", "CLOSE", "INPEN", "PEN", "PLAY", "TAB(", "TO", "SUB", "FN", + "SPC(", "USING", "USR", "ERL", "ERR", "OFF", "THEN", "NOT", "STEP", + "+", "-", "*", "/", "^", "AND", "OR", "XOR", "EQV", "IMP", "MOD", "@", + ">", "=", "<", + /* DOS specific */ + "DSKINI", "DSKO$", "KILL", "NAME", "FIELD", "LSET", "RSET", + "PUT", "GET", "VERIFY", "DEVICE", "DIR", "FILES", "WRITE", "UNLOAD", + "BACKUP", "COPY", "CIRCLE", "PAINT", "DRAW", "RENUM", "SWAP", "DENSITY", + }, + { /* functions: 0xff prefix */ + "SGN", "INT", "ABS", "FRE", "SQR", "LOG", "EXP", "COS", "SIN", + "TAN", "PEEK", "LEN", "STR$", "VAL", "ASC", "CHR$", "EOF", "CINT", "CSNG", + "CDBL", "FIX", "HEX$", "OCT$", "STICK", "STRIG", "GR$", "LEFT$", "RIGHT$", + "MID$", "INSTR", "VARPTR", "RND", "INKEY$", "INPUT", "CSRLIN", "POINT", + "SCREEN", "POS", "PTRIG", + /* DOS specific */ + "DSKL", "CVI", "CVS", "CVD", "MKI$", "MKS$", "MKD$", "LOC", "LOF", + "SPACE$", "STRING$", "DSKI$", + } +}; + +/* MO5: some keywords ar missing; DOS and TUNE are added */ +static const char* thombas5[2][128] = { + { /* statements */ + "END", "FOR", "NEXT", "DATA", "DIM", "READ", NULL, "GO", "RUN", "IF", + "RESTORE", "RETURN", "REM", "'", "STOP", "ELSE", "TRON", "TROFF", "DEFSTR", + "DEFINT", "DEFSNG", NULL, "ON", "TUNE", "ERROR", "RESUME", "AUTO", + "DELETE", "LOCATE", "CLS", "CONSOLE", "PSET", "MOTOR", "SKIP", "EXEC", + "BEEP", "COLOR", "LINE", "BOX", NULL, "ATTRB", "DEF", "POKE", "PRINT", + "CONT", "LIST", "CLEAR", "DOS", NULL, "NEW", "SAVE", "LOAD", "MERGE", + "OPEN", "CLOSE", "INPEN", "PEN", "PLAY", "TAB(", "TO", "SUB", "FN", + "SPC(", "USING", "USR", "ERL", "ERR", "OFF", "THEN", "NOT", "STEP", + "+", "-", "*", "/", "^", "AND", "OR", "XOR", "EQV", "IMP", "MOD", "@", + ">", "=", "<", + /* DOS specific */ + "DSKINI", "DSKO$", "KILL", "NAME", "FIELD", "LSET", "RSET", + "PUT", "GET", "VERIFY", "DEVICE", "DIR", "FILES", "WRITE", "UNLOAD", + "BACKUP","COPY", "CIRCLE", "PAINT", "DRAW", "RENUM", "SWAP", "SEARCH", + "DENSITY", + }, + { /* functions: 0xff prefix */ + "SGN", "INT", "ABS", "FRE", "SQR", "LOG", "EXP", "COS", "SIN", + "TAN", "PEEK", "LEN", "STR$", "VAL", "ASC", "CHR$", "EOF", "CINT", NULL, + NULL, "FIX", "HEX$", NULL, "STICK", "STRIG", "GR$", "LEFT$", "RIGHT$", + "MID$", "INSTR", "VARPTR", "RND", "INKEY$", "INPUT", "CSRLIN", "POINT", + "SCREEN", "POS", "PTRIG", + /* DOS specific */ + "DSKL", "CVI", "CVS", "CVD", "MKI$", "MKS$", "MKD$", "LOC", "LOF", + "SPACE$", "STRING$", "DSKI$", + } +}; + +/* BASIC 128 has many new keywords */ +/* DENSITY is missing on BASIC 512 & BASIC 128 for MO6 but, otherwise, they + have the same tokens +*/ +static const char* thombas128[2][128] = { + { /* statements */ + "END", "FOR", "NEXT", "DATA", "DIM", "READ", "LET", "GO", "RUN", "IF", + "RESTORE", "RETURN", "REM", "'", "STOP", "ELSE", "TRON", "TROFF", "DEFSTR", + "DEFINT", "DEFSNG", "DEFDBL", "ON", "WAIT", "ERROR", "RESUME", "AUTO", + "DELETE", "LOCATE", "CLS", "CONSOLE", "PSET", "MOTOR", "SKIP", "EXEC", + "BEEP", "COLOR", "LINE", "BOX", "UNMASK", "ATTRB", "DEF", "POKE", "PRINT", + "CONT", "LIST", "CLEAR", "INTERVAL", "KEY", "NEW", "SAVE", "LOAD", "MERGE", + "OPEN", "CLOSE", "INPEN", "PEN", "PLAY", "TAB(", "TO", "SUB", "FN", + "SPC(", "USING", "USR", "ERL", "ERR", "OFF", "THEN", "NOT", "STEP", + "+", "-", "*", "/", "^", "AND", "OR", "XOR", "EQV", "IMP", "MOD", "@", + ">", "=", "<", + "DSKINI", "DSKO$", "KILL", "NAME", "FIELD", "LSET", "RSET", + "PUT", "GET", "VERIFY", "DEVICE", "DIR", "FILES", "WRITE", "UNLOAD", + "BACKUP", "COPY", "CIRCLE", "PAINT", "RESET", "RENUM", "SWAP", "DENSITY", + "WINDOW", "PATTERN", "DO", "LOOP", "EXIT", "INMOUSE", "MOUSE", "CHAINE", + "COMMON", "SEARCH", "FWD", "TURTLE", + }, + { /* functions: 0xff prefix */ + "SGN", "INT", "ABS", "FRE", "SQR", "LOG", "EXP", "COS", "SIN", + "TAN", "PEEK", "LEN", "STR$", "VAL", "ASC", "CHR$", "EOF", "CINT", "CSNG", + "CDBL", "FIX", "HEX$", "OCT$", "STICK", "STRIG", "GR$", "LEFT$", "RIGHT$", + "MID$", "INSTR", "VARPTR", "RND", "INKEY$", "INPUT", "CSRLIN", "POINT", + "SCREEN", "POS", "PTRIG", + "DSKL", "CVI", "CVS", "CVD", "MKI$", "MKS$", "MKD$", "LOC", "LOF", + "SPACE$", "STRING$", "DSKI$", + "FKEY$", "MIN(", "MAX(", "ATN", "CRUNCH$", "MTRIG", "EVAL", "PALETTE", + "BANK", "HEAD", "ROT", "SHOW", "ZOOM", "TRACE", + } +}; + +/* tables for simple XOR encryption sieve */ +static const UINT8 crypt1[11] = { + 0x80, 0x19, 0x56, 0xAA, 0x80, 0x76, 0x22, 0xF1, 0x82, 0x38, 0xAA +}; + +static const UINT8 crypt2[13] = { + 0x86, 0x1E, 0xD7, 0xBA, 0x87, 0x99, 0x26, 0x64, 0x87, 0x23, 0x34, 0x58, 0x86 +}; + +/* decrypt BASIC protected files */ +static void thom_decrypt(imgtool_stream* out, imgtool_stream* in) +{ + int i1 = 11, i2 = 13; + while ( 1 ) { + UINT8 b; + if ( stream_read( in, &b, 1) < 1 ) break; + b = ( (UINT8)(b - i2) ^ crypt2[i2-1] ^ crypt1[i1-1] ) + i1; + stream_putc( out, b ); + i1--; i2--; + if ( !i1 ) i1 = 11; + if ( !i2 ) i2 = 13; + } +} + +/* encrypt BASIC protected files */ +static void thom_encrypt(imgtool_stream* out, imgtool_stream* in) +{ + int i1 = 11, i2 = 13; + while ( 1 ) { + UINT8 b; + if ( stream_read( in, &b, 1) < 1 ) break; + b = ( (UINT8)(b - i1) ^ crypt2[i2-1] ^ crypt1[i1-1] ) + i2; + stream_putc( out, b ); + i1--; i2--; + if ( !i1 ) i1 = 11; + if ( !i2 ) i2 = 13; + } +} + +static imgtoolerr_t thomcrypt_read_file(imgtool_partition *part, + const char *name, + const char *fork, imgtool_stream *dst) +{ + UINT8 buf[3]; + imgtool_stream *org = stream_open_mem( NULL, 0 ); + imgtoolerr_t err; + if ( !org ) return IMGTOOLERR_OUTOFMEMORY; + + /* read file */ + err = thom_read_file( part, name, fork, org ); + if ( err ) { + stream_close( org ); + return err; + } + + stream_seek( org, 0, SEEK_SET ); + if ( stream_read( org, buf, 3 ) < 3 || buf[0] != 0xfe ) { + /* regular file */ + stream_seek( org, 0, SEEK_SET ); + stream_transfer_all( dst, org ); + } + else { + /* encrypted file */ + stream_putc( dst, 0xff ); + stream_write( dst, buf+1, 2 ); + thom_decrypt( dst, org ); + } + + stream_close( org ); + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thomcrypt_write_file(imgtool_partition *part, + const char *name, + const char *fork, imgtool_stream *src, + option_resolution *opts) +{ + UINT8 buf[3]; + + if ( stream_read( src, buf, 3 ) < 3 || buf[0] == 0xfe ) { + /* too short or already encrypted file */ + stream_seek( src, 0, SEEK_SET ); + return thom_write_file( part, name, fork, src, opts ); + } + else { + /* regular file */ + imgtool_stream *dst = stream_open_mem( NULL, 0 ); + imgtoolerr_t err; + if ( !dst ) return IMGTOOLERR_OUTOFMEMORY; + stream_putc( dst, 0xfe ); + stream_write( dst, buf+1, 2 ); + thom_encrypt( dst, src ); + stream_seek( dst, 0, SEEK_SET ); + err = thom_write_file( part, name, fork, dst, opts ); + stream_close( dst); + return err; + } +} + +void filter_thomcrypt_getinfo(UINT32 state, union filterinfo *info) +{ + switch(state) { + case FILTINFO_STR_NAME: + info->s = "thomcrypt"; + break; + case FILTINFO_STR_HUMANNAME: + info->s = "Thomson BASIC, Protected file encryption (no tokenization)"; + break; + case FILTINFO_PTR_READFILE: + info->read_file = thomcrypt_read_file; + break; + case FILTINFO_PTR_WRITEFILE: + info->write_file = thomcrypt_write_file; + break; + } +} + +/* untokenization automatically decrypt protected files */ +static imgtoolerr_t thom_basic_read_file(imgtool_partition *part, + const char *name, + const char *fork, + imgtool_stream *dst, + const char* table[2][128]) +{ + imgtool_stream *org = stream_open_mem( NULL, 0 ); + imgtoolerr_t err; + UINT8 buf[4]; + int i; + + if ( !org ) return IMGTOOLERR_OUTOFMEMORY; + + err = thomcrypt_read_file( part, name, fork, org ); + if ( err ) { + stream_close( org ); + return err; + } + stream_seek( org, 3, SEEK_SET ); /* skip header */ + + while ( 1 ) { + int in_str = 0, in_fun = 0; + int linelength, linenum; + + /* line header: line length and line number */ + /* I am not sure this is 100% correct but it works in many cases */ + if ( stream_read( org, buf, 2 ) < 2 ) goto end; + linelength = ((int)buf[0] << 8) + (int)buf[1] - 4; + if ( linelength <= 0 ) goto end; + if ( stream_read( org, buf, 2 ) < 2 ) goto end; + linenum = ((int)buf[0] << 8) + buf[1]; + stream_printf( dst, "%u ", linenum ); + + /* process line */ + for ( i = 0; i < linelength; i++ ) { + UINT8 c; + if ( stream_read( org, &c, 1 ) < 1 ) break; + if ( c == 0 ) { + /* Sometimes, linelength seems wrong and we must rely on the fact that + BASIC lines are 0-terminated. + At other times, there are 0 embedded within lines or extra stuff + between the 0 and the following line, and so, we must rely + on linelength to cut the line (!) + */ + if ( linelength > 256 ) break; + } + else if ( c == 0xff && ! in_str ) in_fun = 1; /* function prefix */ + else { + if ( c >= 0x80 && ! in_str ) { + /* token */ + const char* token = table[ in_fun ][ c - 0x80 ]; + if ( token ) stream_puts( dst, token ); + else stream_puts( dst, "???" ); + } + else { + /* regular character */ + if ( c == '"' ) in_str = 1 - in_str; + stream_putc( dst, c ); /* normal letter */ + } + in_fun = 0; + } + } + stream_putc( dst, '\n' ); + } + end: + + stream_close( org ); + return IMGTOOLERR_SUCCESS; +} + +static imgtoolerr_t thom_basic_write_file(imgtool_partition *part, + const char *name, + const char *fork, + imgtool_stream *src, + option_resolution *opts, + const char* table[2][128]) +{ + return IMGTOOLERR_UNIMPLEMENTED; +} + + +#define FILTER(short,long) \ + static imgtoolerr_t short##_read_file(imgtool_partition *part, \ + const char *name, \ + const char *fork, \ + imgtool_stream *dst) \ + { \ + return thom_basic_read_file( part, name, fork, dst, short ); \ + } \ + static imgtoolerr_t short##_write_file(imgtool_partition *part, \ + const char *name, \ + const char *fork, \ + imgtool_stream *src, \ + option_resolution *opts) \ + { \ + return thom_basic_write_file( part, name, fork, src, opts, short ); \ + } \ + void filter_##short##_getinfo(UINT32 state, union filterinfo *info) \ + { \ + switch(state) \ + { \ + case FILTINFO_STR_NAME: \ + info->s = #short; \ + break; \ + case FILTINFO_STR_HUMANNAME: \ + info->s = long; \ + break; \ + case FILTINFO_PTR_READFILE: \ + info->read_file = short##_read_file; \ + break; \ + case FILTINFO_PTR_WRITEFILE: \ + info->write_file = short##_write_file; \ + break; \ + } \ + } + +FILTER( thombas5, + "Thomson MO5 w/ BASIC 1.0, Tokenized Files (read-only, auto-decrypt)" ) +FILTER( thombas7, + "Thomson TO7 w/ BASIC 1.0, Tokenized Files (read-only, auto-decrypt)" ) +FILTER( thombas128, + "Thomson w/ BASIC 128/512, Tokenized Files (read-only, auto-decrypt)" ) + + +/************************* driver ***************************/ + +OPTION_GUIDE_START( thom_createimage_optguide ) + OPTION_INT( 'H', "heads", "Heads" ) + OPTION_INT( 'T', "tracks", "Tracks" ) + OPTION_ENUM_START( 'D', "density", "Density" ) + OPTION_ENUM( 0, "SD", "Single density (128 bytes)" ) + OPTION_ENUM( 1, "DD", "Double density (256 bytes)" ) + OPTION_ENUM_END + OPTION_STRING( 'N', "name", "Floppy name" ) +OPTION_GUIDE_END + +OPTION_GUIDE_START( thom_writefile_optguide ) + OPTION_ENUM_START( 'T', "ftype", "File type" ) + OPTION_ENUM( 0, "auto", "Automatic (by extension)" ) + OPTION_ENUM( 1, "B", "Program" ) + OPTION_ENUM( 2, "D", "Data" ) + OPTION_ENUM( 3, "M", "Machine Code" ) + OPTION_ENUM( 4, "A", "Assembler Source" ) + OPTION_ENUM_END + OPTION_ENUM_START( 'F', "format", "Format flag" ) + OPTION_ENUM( 0, "auto", "Automatic (by extension)" ) + OPTION_ENUM( 1, "B", "Binary, Tokenized BASIC" ) + OPTION_ENUM( 2, "A", "ASCII" ) + OPTION_ENUM_END + OPTION_STRING( 'C', "comment", "Comment" ) +OPTION_GUIDE_END + +static void thom_basic_get_info(const imgtool_class *clas, + UINT32 param, + union imgtoolinfo *info) +{ + switch ( param ) { + + case IMGTOOLINFO_INT_IMAGE_EXTRA_BYTES: + info->i = sizeof(thom_floppy); break; + case IMGTOOLINFO_INT_PARTITION_EXTRA_BYTES: + info->i = sizeof(int); break; + case IMGTOOLINFO_INT_DIRECTORY_EXTRA_BYTES: + info->i = sizeof(int); break; + case IMGTOOLINFO_INT_SUPPORTS_CREATION_TIME: + case IMGTOOLINFO_INT_PREFER_UCASE: + info->i = 1; break; + case IMGTOOLINFO_INT_PATH_SEPARATOR: + info->i = 0; break; + case IMGTOOLINFO_STR_FILE: + strcpy( info->s = imgtool_temp_str(), __FILE__ ); break; + case IMGTOOLINFO_STR_NAME: + strcpy( info->s = imgtool_temp_str(), "thom" ); break; + case IMGTOOLINFO_STR_DESCRIPTION: + strcpy( info->s = imgtool_temp_str(), "Thomson BASIC filesystem" ); + break; + case IMGTOOLINFO_PTR_CREATE: + info->create = thom_create; break; + case IMGTOOLINFO_PTR_CREATEIMAGE_OPTGUIDE: + info->createimage_optguide = thom_createimage_optguide; break; + case IMGTOOLINFO_PTR_BEGIN_ENUM: + info->begin_enum = thom_begin_enum; break; + case IMGTOOLINFO_PTR_NEXT_ENUM: + info->next_enum = thom_next_enum; break; + case IMGTOOLINFO_PTR_READ_FILE: + info->read_file = thom_read_file; break; + case IMGTOOLINFO_PTR_WRITE_FILE: + info->write_file = thom_write_file; break; + case IMGTOOLINFO_PTR_WRITEFILE_OPTGUIDE: + info->writefile_optguide = thom_writefile_optguide; break; + case IMGTOOLINFO_STR_WRITEFILE_OPTSPEC: + strcpy( info->s = imgtool_temp_str(), "T[0]-4;F[0]-2;C" ); break; + case IMGTOOLINFO_PTR_SUGGEST_TRANSFER: + info->suggest_transfer = thom_suggest_transfer; break; + case IMGTOOLINFO_PTR_DELETE_FILE: + info->delete_file = thom_delete_file; break; + case IMGTOOLINFO_PTR_FREE_SPACE: + info->free_space = thom_free_space; break; + case IMGTOOLINFO_PTR_GET_SECTOR_SIZE: + info->get_sector_size = thom_get_sector_size; break; + case IMGTOOLINFO_PTR_GET_GEOMETRY: + info->get_geometry = thom_get_geometry; break; + case IMGTOOLINFO_PTR_INFO: + info->info = thom_info; break; + case IMGTOOLINFO_PTR_READ_SECTOR: + info->read_sector = thom_read_sector; break; + case IMGTOOLINFO_PTR_WRITE_SECTOR: + info->write_sector = thom_write_sector; break; + case IMGTOOLINFO_PTR_LIST_PARTITIONS: + info->list_partitions = thom_list_partitions; break; + case IMGTOOLINFO_PTR_OPEN_PARTITION: + info->open_partition = thom_open_partition; break; + } +} + +void thom_fd_basic_get_info(const imgtool_class *clas, + UINT32 param, + union imgtoolinfo *info) +{ + switch ( param ) { + case IMGTOOLINFO_STR_NAME: + strcpy( info->s = imgtool_temp_str(), "thom_fd" ); break; + case IMGTOOLINFO_STR_DESCRIPTION: + strcpy( info->s = imgtool_temp_str(), + "Thomson .fd disk image, BASIC format" ); + break; + case IMGTOOLINFO_STR_FILE_EXTENSIONS: + strcpy( info->s = imgtool_temp_str(), "fd\0" ); break; + case IMGTOOLINFO_PTR_OPEN: + info->open = thom_open_fd_qd; break; + case IMGTOOLINFO_PTR_CLOSE: + info->close = thom_close_fd_qd; break; + case IMGTOOLINFO_STR_CREATEIMAGE_OPTSPEC: + strcpy( info->s = imgtool_temp_str(), "H[1]-2;T40/[80];D0-[1];N" ); break; + default: + thom_basic_get_info( clas, param, info ); + } +} + +void thom_qd_basic_get_info(const imgtool_class *clas, + UINT32 param, + union imgtoolinfo *info) +{ + switch ( param ) { + case IMGTOOLINFO_STR_NAME: + strcpy( info->s = imgtool_temp_str(), "thom_qd" ); break; + case IMGTOOLINFO_STR_DESCRIPTION: + strcpy( info->s = imgtool_temp_str(), + "Thomson .qd disk image, BASIC format" ); + break; + case IMGTOOLINFO_STR_FILE_EXTENSIONS: + strcpy( info->s = imgtool_temp_str(), "qd\0" ); break; + case IMGTOOLINFO_PTR_OPEN: + info->open = thom_open_fd_qd; break; + case IMGTOOLINFO_PTR_CLOSE: + info->close = thom_close_fd_qd; break; + case IMGTOOLINFO_STR_CREATEIMAGE_OPTSPEC: + strcpy( info->s = imgtool_temp_str(), "H[1]-2;T[25];D[0];N" ); break; + default: + thom_basic_get_info( clas, param, info ); + } +} + +void thom_sap_basic_get_info(const imgtool_class *clas, + UINT32 param, + union imgtoolinfo *info) +{ + switch ( param ) { + case IMGTOOLINFO_STR_NAME: + strcpy( info->s = imgtool_temp_str(), "thom_sap" ); break; + case IMGTOOLINFO_STR_DESCRIPTION: + strcpy( info->s = imgtool_temp_str(), + "Thomson .sap disk image, BASIC format" ); + break; + case IMGTOOLINFO_STR_FILE_EXTENSIONS: + strcpy( info->s = imgtool_temp_str(), "sap\0" ); break; + case IMGTOOLINFO_PTR_OPEN: + info->open = thom_open_sap; break; + case IMGTOOLINFO_PTR_CLOSE: + info->close = thom_close_sap; break; + case IMGTOOLINFO_STR_CREATEIMAGE_OPTSPEC: + strcpy( info->s = imgtool_temp_str(), "H[1];T40/[80];D0-[1];N" ); break; + default: + thom_basic_get_info( clas, param, info ); + } +} diff --git a/mess/tools/imgtool/windows/wimgtool.c b/mess/tools/imgtool/windows/wimgtool.c index fa544c274..a114cb5ae 100644 --- a/mess/tools/imgtool/windows/wimgtool.c +++ b/mess/tools/imgtool/windows/wimgtool.c @@ -397,8 +397,6 @@ static imgtoolerr_t append_dirent(HWND window, int index, const imgtool_dirent * if (i >= size) { icon_index = append_associated_icon(window, extension); - if (icon_index < 0) - return IMGTOOLERR_UNEXPECTED; if (pile_puts(&info->iconlist_extensions, extension)) return IMGTOOLERR_OUTOFMEMORY; if (pile_putc(&info->iconlist_extensions, '\0')) @@ -411,10 +409,17 @@ static imgtoolerr_t append_dirent(HWND window, int index, const imgtool_dirent * memset(&lvi, 0, sizeof(lvi)); lvi.iItem = ListView_GetItemCount(info->listview); - lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; + lvi.mask = LVIF_TEXT | LVIF_PARAM; lvi.pszText = U2T((char *) entry->filename); - lvi.iImage = icon_index; lvi.lParam = index; + + // if we have an icon, use it + if (icon_index >= 0) + { + lvi.mask |= LVIF_IMAGE; + lvi.iImage = icon_index; + } + new_index = ListView_InsertItem(info->listview, &lvi); if (entry->directory) @@ -431,21 +436,29 @@ static imgtoolerr_t append_dirent(HWND window, int index, const imgtool_dirent * ListView_SetItemText(info->listview, new_index, column_index++, buffer); // set creation time, if supported - if (features.supports_creation_time && (entry->creation_time != 0)) + if (features.supports_creation_time) { - local_time = localtime(&entry->creation_time); - _sntprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _tasctime(local_time)); - rtrim(buffer); - ListView_SetItemText(info->listview, new_index, column_index++, buffer); + if (entry->creation_time != 0) + { + local_time = localtime(&entry->creation_time); + _sntprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _tasctime(local_time)); + rtrim(buffer); + ListView_SetItemText(info->listview, new_index, column_index, buffer); + } + column_index++; } // set last modified time, if supported - if (features.supports_lastmodified_time && (entry->lastmodified_time != 0)) + if (features.supports_lastmodified_time) { - local_time = localtime(&entry->lastmodified_time); - _sntprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _tasctime(local_time)); - rtrim(buffer); - ListView_SetItemText(info->listview, new_index, column_index++, buffer); + if (entry->lastmodified_time != 0) + { + local_time = localtime(&entry->lastmodified_time); + _sntprintf(buffer, sizeof(buffer) / sizeof(buffer[0]), _tasctime(local_time)); + rtrim(buffer); + ListView_SetItemText(info->listview, new_index, column_index, buffer); + } + column_index++; } // set attributes and corruption notice diff --git a/mess/tools/messtest/core.c b/mess/tools/messtest/core.c index eaf4cf289..419fb423e 100644 --- a/mess/tools/messtest/core.c +++ b/mess/tools/messtest/core.c @@ -266,7 +266,7 @@ static int external_entity_handler(XML_Parser parser, for (i = 0; buf[i]; i++) buf[i] = toupper(buf[i]); - code_init(); + code_init(NULL); c = token_to_code(buf); if (c != CODE_NONE) diff --git a/mess/tools/messtest/main.c b/mess/tools/messtest/main.c index 1b6e79721..fd5ac6e6d 100644 --- a/mess/tools/messtest/main.c +++ b/mess/tools/messtest/main.c @@ -136,16 +136,17 @@ int main(int argc, char *argv[]) /* since the cpuintrf and sndintrf structures are filled dynamically now, we * have to init first */ - cpuintrf_init(); - sndintrf_init(); + cpuintrf_init(NULL); + sndintrf_init(NULL); /* register options */ options_add_entries(messtest_opts); options_set_option_callback("", handle_arg); /* run MAME's validity checks; if these fail cop out now */ - if (mame_validitychecks(-1)) - goto done; + /* NPW 16-Sep-2006 - commenting this out because this cannot be run outside of MAME */ + //if (mame_validitychecks(-1)) + // goto done; /* run Imgtool's validity checks; if these fail cop out now */ if (imgtool_validitychecks()) goto done; diff --git a/mess/tools/messtest/testmess.c b/mess/tools/messtest/testmess.c index 090dbb598..c680cbdfe 100644 --- a/mess/tools/messtest/testmess.c +++ b/mess/tools/messtest/testmess.c @@ -257,6 +257,9 @@ static messtest_result_t run_test(int flags, struct messtest_results *results) options.ram = current_testcase.ram; options.samplerate = 44100; options.mame_debug = 1; + options.brightness = 1.0; + options.contrast = 1.0; + options.gamma = 1.0; /* preload any needed images */ while(current_command->command_type == MESSTEST_COMMAND_IMAGE_PRELOAD) @@ -314,9 +317,9 @@ static messtest_result_t run_test(int flags, struct messtest_results *results) -int osd_init(void) +int osd_init(running_machine *machine) { - target = render_target_alloc(NULL, FALSE); + target = render_target_alloc(NULL, 0); render_target_set_orientation(target, 0); return 0; } @@ -832,7 +835,7 @@ static void command_end(void) /* at the end of our test */ state = STATE_DONE; final_time = timer_get_time(); - mame_schedule_exit(); + mame_schedule_exit(Machine); } @@ -881,7 +884,7 @@ int osd_update(mame_time emutime) /* if we have already aborted or completed, our work is done */ if ((state == STATE_ABORTED) || (state == STATE_DONE)) { - mame_schedule_exit(); + mame_schedule_exit(Machine); goto done; } diff --git a/mess/tools/messtest/tststubs.c b/mess/tools/messtest/tststubs.c index 246ba8e95..60b07b9c5 100644 --- a/mess/tools/messtest/tststubs.c +++ b/mess/tools/messtest/tststubs.c @@ -175,6 +175,10 @@ int win_mess_config_init(void) return 0; } +void osd_break_into_debugger(const char *message) +{ +} + //============================================================ // osd_alloc_executable //============================================================ diff --git a/mess/ui/dirent.c b/mess/ui/dirent.c index 40535d5f8..9cc26baab 100644 --- a/mess/ui/dirent.c +++ b/mess/ui/dirent.c @@ -6,6 +6,7 @@ * 06/17/2000 by Mike Haaland */ +#include #include "dirent.h" #ifdef WIN32 diff --git a/mess/vidhrdw/733_asr.c b/mess/vidhrdw/733_asr.c index 4b4e98d09..b40270b53 100644 --- a/mess/vidhrdw/733_asr.c +++ b/mess/vidhrdw/733_asr.c @@ -113,7 +113,7 @@ gfx_decode asr733_gfxdecodeinfo[] = PALETTE_INIT( asr733 ) { - palette_set_colors(0, asr_palette, asr733_palette_size); + palette_set_colors(machine, 0, asr_palette, asr733_palette_size); memcpy(colortable, & asr_colortable, sizeof(asr_colortable)); } diff --git a/mess/vidhrdw/911_vdt.c b/mess/vidhrdw/911_vdt.c index 3894d5a60..a410696a4 100644 --- a/mess/vidhrdw/911_vdt.c +++ b/mess/vidhrdw/911_vdt.c @@ -128,10 +128,10 @@ static void beep_callback(int unit); /* Initialize vdt911 palette */ -void palette_init_vdt911(unsigned short *colortable, const unsigned char *dummy) +PALETTE_INIT( vdt911 ) { /*memcpy(palette, & vdt911_palette, sizeof(vdt911_palette));*/ - palette_set_colors(0, vdt911_palette, vdt911_palette_size); + palette_set_colors(machine, 0, vdt911_palette, vdt911_palette_size); memcpy(colortable, & vdt911_colortable, sizeof(vdt911_colortable)); } diff --git a/mess/vidhrdw/911_vdt.h b/mess/vidhrdw/911_vdt.h index 77727b350..4cdb25bc8 100644 --- a/mess/vidhrdw/911_vdt.h +++ b/mess/vidhrdw/911_vdt.h @@ -52,7 +52,7 @@ typedef struct vdt911_init_params_t void (*int_callback)(int state); } vdt911_init_params_t; -void palette_init_vdt911(unsigned short *colortable, const unsigned char *dummy); +PALETTE_INIT( vdt911 ); void vdt911_init(void); int vdt911_init_term(int unit, const vdt911_init_params_t *params); diff --git a/mess/vidhrdw/a7800.c b/mess/vidhrdw/a7800.c index 69ea7a877..6b66a7d0e 100644 --- a/mess/vidhrdw/a7800.c +++ b/mess/vidhrdw/a7800.c @@ -74,7 +74,7 @@ VIDEO_START( a7800 ) { int i; - if (video_start_generic_bitmapped()) + if (video_start_generic_bitmapped(machine)) return 1; for(i=0; i<8; i++) @@ -452,7 +452,7 @@ void a7800_interrupt(void) VIDEO_UPDATE( a7800 ) { maria_scanline = 0; - video_update_generic_bitmapped(screen, bitmap, cliprect); + video_update_generic_bitmapped(machine, screen, bitmap, cliprect); return 0; } diff --git a/mess/vidhrdw/advision.c b/mess/vidhrdw/advision.c index dc6d3820c..fd2c2edea 100644 --- a/mess/vidhrdw/advision.c +++ b/mess/vidhrdw/advision.c @@ -44,20 +44,21 @@ PALETTE_INIT( advision ) for( i = 0; i < 8; i++ ) { /* 8 shades of RED */ - palette_set_color(i, i * 0x22, 0x00, 0x00); + palette_set_color(machine, i, i * 0x22, 0x00, 0x00); colortable[i*2+0] = 0; colortable[i*2+0] = i; } - palette_set_color(8, 0x55, 0x55, 0x55); /* DK GREY - for MAME text only */ - palette_set_color(9, 0xf0, 0xf0, 0xf0); /* LT GREY - for MAME text only */ + palette_set_color(machine, 8, 0x55, 0x55, 0x55); /* DK GREY - for MAME text only */ + palette_set_color(machine, 9, 0xf0, 0xf0, 0xf0); /* LT GREY - for MAME text only */ } void advision_vh_write(int data) { - if (advision_videobank >= 1 && advision_videobank <=5) { + if (advision_videobank >= 1 && advision_videobank <=5) + { advision_led_latch[advision_videobank] = data; -} + } } void advision_vh_update(int x) diff --git a/mess/vidhrdw/aim65.c b/mess/vidhrdw/aim65.c index ddd66faf9..22f639d84 100644 --- a/mess/vidhrdw/aim65.c +++ b/mess/vidhrdw/aim65.c @@ -74,7 +74,7 @@ static unsigned char aim65_palette[] = PALETTE_INIT( aim65 ) { - palette_set_colors(0, aim65_palette, sizeof(aim65_palette) / 3); + palette_set_colors(machine, 0, aim65_palette, sizeof(aim65_palette) / 3); } VIDEO_START( aim65 ) @@ -91,7 +91,7 @@ VIDEO_START( aim65 ) } #endif - return video_start_generic(); + return video_start_generic(machine); } static const char led[] = { diff --git a/mess/vidhrdw/amstrad.c b/mess/vidhrdw/amstrad.c index 3b431280c..c0060abb2 100644 --- a/mess/vidhrdw/amstrad.c +++ b/mess/vidhrdw/amstrad.c @@ -179,9 +179,9 @@ unsigned char amstrad_green_palette[32 * 3] = PALETTE_INIT( amstrad_cpc ) { if ( ((readinputportbytag("green_display")) & 0x01)==0 ) - palette_set_colors(0, amstrad_palette, sizeof(amstrad_palette) / 3); + palette_set_colors(machine, 0, amstrad_palette, sizeof(amstrad_palette) / 3); else - palette_set_colors(0, amstrad_green_palette, sizeof(amstrad_green_palette) / 3); + palette_set_colors(machine, 0, amstrad_green_palette, sizeof(amstrad_green_palette) / 3); } /*************************************************************************/ @@ -242,7 +242,7 @@ PALETTE_INIT( kccomp ) for (i=0; i<32; i++) { colortable[i] = i; - palette_set_color(i, + palette_set_color(machine, i, kccomp_get_colour_element((color_prom[i]>>2) & 0x03), kccomp_get_colour_element((color_prom[i]>>4) & 0x03), kccomp_get_colour_element((color_prom[i]>>0) & 0x03)); @@ -260,7 +260,7 @@ PALETTE_INIT( amstrad_plus ) { int i; - palette_set_colors(0, amstrad_palette, sizeof(amstrad_palette) / 3); + palette_set_colors(machine, 0, amstrad_palette, sizeof(amstrad_palette) / 3); for ( i = 0; i < 0x1000; i++ ) { int r, g, b; @@ -273,14 +273,14 @@ PALETTE_INIT( amstrad_plus ) g = ( g << 4 ) | ( g ); b = ( b << 4 ) | ( b ); - palette_set_color(i+48, g, r, b); + palette_set_color(machine, i+48, g, r, b); colortable[i+48] = i+48; // take into account the original palette, and sprite palette } } void amstrad_plus_setspritecolour(unsigned int off, int r, int g, int b) { - palette_set_color((off/2) + 33, r, g, b); + palette_set_color(Machine, (off/2) + 33, r, g, b); } static void amstrad_init_lookups(void) diff --git a/mess/vidhrdw/apple2gs.c b/mess/vidhrdw/apple2gs.c index 8d003d578..2a9deadae 100644 --- a/mess/vidhrdw/apple2gs.c +++ b/mess/vidhrdw/apple2gs.c @@ -45,7 +45,7 @@ VIDEO_UPDATE( apple2gs ) /* use Apple IIgs super hires video */ for (i = 0; i < 256; i++) { - palette_set_color(i + 16, + palette_set_color(machine, i + 16, ((apple2gs_slowmem[0x19E00 + (i * 2) + 1] >> 0) & 0x0F) * 17, ((apple2gs_slowmem[0x19E00 + (i * 2) + 0] >> 4) & 0x0F) * 17, ((apple2gs_slowmem[0x19E00 + (i * 2) + 0] >> 0) & 0x0F) * 17); @@ -107,7 +107,7 @@ VIDEO_UPDATE( apple2gs ) new_cliprect.max_x = MIN(cliprect->max_x - 40, 559); new_cliprect.max_y = MIN(cliprect->max_y - 4, 191); if ((new_cliprect.max_x > new_cliprect.min_x) && (new_cliprect.max_y > new_cliprect.min_y)) - video_update_apple2(screen, apple2gs_legacy_gfx, &new_cliprect); + video_update_apple2(machine, screen, apple2gs_legacy_gfx, &new_cliprect); for (i = 0; i < 192; i++) { diff --git a/mess/vidhrdw/astrocde.c b/mess/vidhrdw/astrocde.c index a6f95a779..b805705ab 100644 --- a/mess/vidhrdw/astrocde.c +++ b/mess/vidhrdw/astrocde.c @@ -112,7 +112,7 @@ PALETTE_INIT( astrocade ) B = 255; /* Round, and set the value */ - palette_set_color(i*8+j, floor(R+.5), floor(G+.5), floor(B+.5)); + palette_set_color(machine, i*8+j, floor(R+.5), floor(G+.5), floor(B+.5)); } } diff --git a/mess/vidhrdw/avigo.c b/mess/vidhrdw/avigo.c index b49d9911a..4b15e8d7f 100644 --- a/mess/vidhrdw/avigo.c +++ b/mess/vidhrdw/avigo.c @@ -159,7 +159,7 @@ PALETTE_INIT( avigo ) { /* char *backdrop_name; int used = 2; */ - palette_set_colors(0, avigo_palette, sizeof(avigo_palette) / 3); + palette_set_colors(machine, 0, avigo_palette, sizeof(avigo_palette) / 3); memcpy(colortable, avigo_colour_table, sizeof (avigo_colour_table)); /* load backdrop */ diff --git a/mess/vidhrdw/cbmb.c b/mess/vidhrdw/cbmb.c index d2ca3acf5..b3ec594fd 100644 --- a/mess/vidhrdw/cbmb.c +++ b/mess/vidhrdw/cbmb.c @@ -54,7 +54,7 @@ VIDEO_START( cbm700 ) } } - return video_start_generic(); + return video_start_generic(machine); } void cbmb_vh_cursor(struct crtc6845_cursor *cursor) diff --git a/mess/vidhrdw/cdp186x.c b/mess/vidhrdw/cdp186x.c index 32318da9b..d93f6e4fe 100644 --- a/mess/vidhrdw/cdp186x.c +++ b/mess/vidhrdw/cdp186x.c @@ -18,14 +18,14 @@ PALETTE_INIT( tmc2000 ) { int background_color_sequence[] = { 5, 7, 6, 3 }; - palette_set_color( 0, 0x4c, 0x96, 0x1c ); // white - palette_set_color( 1, 0x4c, 0x00, 0x1c ); // purple - palette_set_color( 2, 0x00, 0x96, 0x1c ); // cyan - palette_set_color( 3, 0x00, 0x00, 0x1c ); // blue - palette_set_color( 4, 0x4c, 0x96, 0x00 ); // yellow - palette_set_color( 5, 0x4c, 0x00, 0x00 ); // red - palette_set_color( 6, 0x00, 0x96, 0x00 ); // green - palette_set_color( 7, 0x00, 0x00, 0x00 ); // black + palette_set_color(machine, 0, 0x4c, 0x96, 0x1c ); // white + palette_set_color(machine, 1, 0x4c, 0x00, 0x1c ); // purple + palette_set_color(machine, 2, 0x00, 0x96, 0x1c ); // cyan + palette_set_color(machine, 3, 0x00, 0x00, 0x1c ); // blue + palette_set_color(machine, 4, 0x4c, 0x96, 0x00 ); // yellow + palette_set_color(machine, 5, 0x4c, 0x00, 0x00 ); // red + palette_set_color(machine, 6, 0x00, 0x96, 0x00 ); // green + palette_set_color(machine, 7, 0x00, 0x00, 0x00 ); // black cdp1864_set_background_color_sequence_w(background_color_sequence); } @@ -34,14 +34,14 @@ PALETTE_INIT( tmc2000e ) // TODO: incorrect colors? { int background_color_sequence[] = { 2, 0, 1, 4 }; - palette_set_color( 0, 0x00, 0x00, 0x00 ); // black 0 % of max luminance - palette_set_color( 1, 0x00, 0x97, 0x00 ); // green 59 - palette_set_color( 2, 0x00, 0x00, 0x1c ); // blue 11 - palette_set_color( 3, 0x00, 0xb3, 0xb3 ); // cyan 70 - palette_set_color( 4, 0x4c, 0x00, 0x00 ); // red 30 - palette_set_color( 5, 0xe3, 0xe3, 0x00 ); // yellow 89 - palette_set_color( 6, 0x68, 0x00, 0x68 ); // magenta 41 - palette_set_color( 7, 0xff, 0xff, 0xff ); // white 100 + palette_set_color(machine, 0, 0x00, 0x00, 0x00 ); // black 0 % of max luminance + palette_set_color(machine, 1, 0x00, 0x97, 0x00 ); // green 59 + palette_set_color(machine, 2, 0x00, 0x00, 0x1c ); // blue 11 + palette_set_color(machine, 3, 0x00, 0xb3, 0xb3 ); // cyan 70 + palette_set_color(machine, 4, 0x4c, 0x00, 0x00 ); // red 30 + palette_set_color(machine, 5, 0xe3, 0xe3, 0x00 ); // yellow 89 + palette_set_color(machine, 6, 0x68, 0x00, 0x68 ); // magenta 41 + palette_set_color(machine, 7, 0xff, 0xff, 0xff ); // white 100 cdp1864_set_background_color_sequence_w(background_color_sequence); } @@ -131,14 +131,14 @@ static unsigned short colortable_cdp1869[] = PALETTE_INIT( cdp1869 ) { - palette_set_color( 0, 0x00, 0x00, 0x00 ); // black 0 % of max luminance - palette_set_color( 1, 0x00, 0x97, 0x00 ); // green 59 - palette_set_color( 2, 0x00, 0x00, 0x1c ); // blue 11 - palette_set_color( 3, 0x00, 0xb3, 0xb3 ); // cyan 70 - palette_set_color( 4, 0x4c, 0x00, 0x00 ); // red 30 - palette_set_color( 5, 0xe3, 0xe3, 0x00 ); // yellow 89 - palette_set_color( 6, 0x68, 0x00, 0x68 ); // magenta 41 - palette_set_color( 7, 0xff, 0xff, 0xff ); // white 100 + palette_set_color(machine, 0, 0x00, 0x00, 0x00 ); // black 0 % of max luminance + palette_set_color(machine, 1, 0x00, 0x97, 0x00 ); // green 59 + palette_set_color(machine, 2, 0x00, 0x00, 0x1c ); // blue 11 + palette_set_color(machine, 3, 0x00, 0xb3, 0xb3 ); // cyan 70 + palette_set_color(machine, 4, 0x4c, 0x00, 0x00 ); // red 30 + palette_set_color(machine, 5, 0xe3, 0xe3, 0x00 ); // yellow 89 + palette_set_color(machine, 6, 0x68, 0x00, 0x68 ); // magenta 41 + palette_set_color(machine, 7, 0xff, 0xff, 0xff ); // white 100 memcpy(colortable, colortable_cdp1869, sizeof(colortable_cdp1869)); } @@ -232,7 +232,7 @@ VIDEO_UPDATE( cdp1869 ) tilemap_mark_all_tiles_dirty(ALL_TILEMAPS); if (cdp1869.dispoff) - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); else { fillbitmap(bitmap, cdp1869.bkg, cliprect); diff --git a/mess/vidhrdw/cdp186x.h b/mess/vidhrdw/cdp186x.h index eb1730165..aabdede74 100644 --- a/mess/vidhrdw/cdp186x.h +++ b/mess/vidhrdw/cdp186x.h @@ -95,7 +95,7 @@ VIDEO_UPDATE( cdp1864 ); #define CDP1869_CHAR_HEIGHT_PAL 9 #define CDP1869_CHAR_HEIGHT_NTSC 8 -#define CDP1869_SCREEN_WIDTH 60 * CDP1869_CHAR_WIDTH +#define CDP1869_SCREEN_WIDTH (60 * CDP1869_CHAR_WIDTH) #define CDP1869_SCANLINES_PAL 312 #define CDP1869_SCANLINES_NTSC 262 diff --git a/mess/vidhrdw/cgenie.c b/mess/vidhrdw/cgenie.c index 20e8aafa5..54d7b04e6 100644 --- a/mess/vidhrdw/cgenie.c +++ b/mess/vidhrdw/cgenie.c @@ -31,7 +31,7 @@ VIDEO_START( cgenie ) { videoram_size = 0x4000; - if( video_start_generic() != 0 ) + if( video_start_generic(machine) != 0 ) return 1; dlybitmap = auto_bitmap_alloc(Machine->screen[0].width, Machine->screen[0].height); diff --git a/mess/vidhrdw/channelf.c b/mess/vidhrdw/channelf.c index aff8b75b7..e52737060 100644 --- a/mess/vidhrdw/channelf.c +++ b/mess/vidhrdw/channelf.c @@ -36,14 +36,14 @@ static UINT16 colormap[] = { /* Initialise the palette */ PALETTE_INIT( channelf ) { - palette_set_colors(0, channelf_palette, sizeof(channelf_palette) / 3); + palette_set_colors(machine, 0, channelf_palette, sizeof(channelf_palette) / 3); } VIDEO_START( channelf ) { videoram_size = 0x2000; videoram = auto_malloc(videoram_size); - return video_start_generic(); + return video_start_generic(machine); } static int recalc_palette_offset(int reg1, int reg2) diff --git a/mess/vidhrdw/coco3.c b/mess/vidhrdw/coco3.c index dc50e7807..591a4c9ef 100644 --- a/mess/vidhrdw/coco3.c +++ b/mess/vidhrdw/coco3.c @@ -80,7 +80,7 @@ struct _coco3_video UINT32 video_position; UINT8 line_in_row; UINT8 blink; - UINT8 dirty; + UINT8 dirty[2]; UINT8 video_type; /* video state; every scanline the video state for the scanline is copied @@ -413,7 +413,7 @@ VIDEO_UPDATE( coco3 ) if (video->legacy_video) { /* legacy CoCo 1/2 graphics */ - rc = video_update_m6847(screen, bitmap, cliprect); + rc = video_update_m6847(machine, screen, bitmap, cliprect); if ((rc & UPDATE_HAS_NOT_CHANGED) == 0) { @@ -429,11 +429,11 @@ VIDEO_UPDATE( coco3 ) else { /* CoCo 3 graphics */ - if (video->dirty) + if (video->dirty[screen]) { for (row = cliprect->min_y; row <= cliprect->max_y; row++) coco3_render_scanline(bitmap, row); - video->dirty = FALSE; + video->dirty[screen] = FALSE; } else { @@ -453,7 +453,9 @@ VIDEO_UPDATE( coco3 ) static void coco3_set_dirty(void) { - video->dirty = TRUE; + int i; + for (i = 0; i < sizeof(video->dirty) / sizeof(video->dirty[0]); i++) + video->dirty[i] = TRUE; } @@ -610,7 +612,8 @@ static void coco3_prepare_scanline(int scanline) dirty = TRUE; } } - video->dirty = dirty ? TRUE : FALSE; + if (dirty) + coco3_set_dirty(); } @@ -782,7 +785,7 @@ static void internal_video_start_coco3(m6847_type type) /* allocate video */ video = auto_malloc(sizeof(*video)); memset(video, 0, sizeof(*video)); - video->dirty = TRUE; + coco3_set_dirty(); /* initialize palette */ for (i = 0; i < 64; i++) @@ -850,5 +853,5 @@ VIDEO_START( coco3p ) void coco3_vh_blink(void) { video->blink = !video->blink; - video->dirty = TRUE; + coco3_set_dirty(); } diff --git a/mess/vidhrdw/dai.c b/mess/vidhrdw/dai.c index a6808e9a6..55fee2376 100644 --- a/mess/vidhrdw/dai.c +++ b/mess/vidhrdw/dai.c @@ -53,7 +53,7 @@ static unsigned short dai_4_colours_palette[4]; PALETTE_INIT( dai ) { - palette_set_colors(0, dai_palette, sizeof(dai_palette) / 3); + palette_set_colors(machine, 0, dai_palette, sizeof(dai_palette) / 3); memcpy(colortable, dai_colortable, sizeof (dai_colortable)); } diff --git a/mess/vidhrdw/enterp.c b/mess/vidhrdw/enterp.c index 82f28f9a3..802b5609c 100644 --- a/mess/vidhrdw/enterp.c +++ b/mess/vidhrdw/enterp.c @@ -15,7 +15,7 @@ VIDEO_START( enterprise ) { Nick_vh_start(); - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } /*************************************************************************** @@ -26,6 +26,6 @@ VIDEO_START( enterprise ) VIDEO_UPDATE( enterprise ) { Nick_DoScreen(tmpbitmap); - return video_update_generic_bitmapped(screen, bitmap, cliprect); + return video_update_generic_bitmapped(machine, screen, bitmap, cliprect); } diff --git a/mess/vidhrdw/epnick.c b/mess/vidhrdw/epnick.c index aa52a8576..9fb3a5865 100644 --- a/mess/vidhrdw/epnick.c +++ b/mess/vidhrdw/epnick.c @@ -91,7 +91,7 @@ PALETTE_INIT( nick ) nick_colour_palette[(i*3)+2] = NICK_GET_BLUE8(i); } - palette_set_colors(0, nick_colour_palette, sizeof(nick_colour_palette) / 3); + palette_set_colors(machine, 0, nick_colour_palette, sizeof(nick_colour_palette) / 3); memcpy(colortable, nick_colour_table, sizeof(nick_colour_table)); //color_prom=malloc(0*sizeof(char)); } diff --git a/mess/vidhrdw/exidy.c b/mess/vidhrdw/exidy.c index 80c8b347a..855ffbe6e 100644 --- a/mess/vidhrdw/exidy.c +++ b/mess/vidhrdw/exidy.c @@ -36,7 +36,7 @@ static unsigned char exidy_palette[EXIDY_NUM_COLOURS * 3] = /* Initialise the palette */ PALETTE_INIT( exidy ) { - palette_set_colors(0, exidy_palette, sizeof(exidy_palette) / 3); + palette_set_colors(machine, 0, exidy_palette, sizeof(exidy_palette) / 3); memcpy(colortable, exidy_colour_table, sizeof (exidy_colour_table)); } diff --git a/mess/vidhrdw/galaxy.c b/mess/vidhrdw/galaxy.c index 5f7224ae6..e05edac89 100644 --- a/mess/vidhrdw/galaxy.c +++ b/mess/vidhrdw/galaxy.c @@ -39,7 +39,7 @@ unsigned short galaxy_colortable[1][2] = PALETTE_INIT( galaxy ) { - palette_set_colors(0, galaxy_palette, sizeof(galaxy_palette) / 3); + palette_set_colors(machine, 0, galaxy_palette, sizeof(galaxy_palette) / 3); memcpy(colortable, galaxy_colortable, sizeof (galaxy_colortable)); } diff --git a/mess/vidhrdw/hp48.c b/mess/vidhrdw/hp48.c index 56d9092e3..16ba9da08 100644 --- a/mess/vidhrdw/hp48.c +++ b/mess/vidhrdw/hp48.c @@ -52,7 +52,7 @@ unsigned short hp48_colortable[0x20][2] = { PALETTE_INIT( hp48 ) { - palette_set_colors(0, hp48_palette, sizeof(hp48_palette) / 3); + palette_set_colors(machine, 0, hp48_palette, sizeof(hp48_palette) / 3); memcpy(colortable,hp48_colortable,sizeof(hp48_colortable)); } @@ -70,7 +70,7 @@ VIDEO_START( hp48 ) } #endif - return video_start_generic(); + return video_start_generic(machine); } static void hp48_draw_special(mame_bitmap *bitmap,int x, int y, const char *figure, int color) diff --git a/mess/vidhrdw/i82720.c b/mess/vidhrdw/i82720.c index e769d2f59..4da8077b7 100644 --- a/mess/vidhrdw/i82720.c +++ b/mess/vidhrdw/i82720.c @@ -1399,14 +1399,13 @@ static unsigned char COMPIS_palette[16*3] = static PALETTE_INIT( compis_gdc ) { - palette_set_colors(0, COMPIS_palette, COMPIS_PALETTE_SIZE); + palette_set_colors(machine, 0, COMPIS_palette, COMPIS_PALETTE_SIZE); } static compis_gdc_interface sIntf; static int compis_gdc_start (const compis_gdc_interface *intf) { - int res; /* Only 32KB or 128KB of VRAM */ switch(intf->vramsize) { @@ -1433,8 +1432,7 @@ static int compis_gdc_start (const compis_gdc_interface *intf) } gdc_fifo_reset(&gdc); videoram_size = gdc_mess.vramsize; - res = video_start_generic_bitmapped(); - return res; + return video_start_generic_bitmapped(Machine); } VIDEO_UPDATE(compis_gdc) diff --git a/mess/vidhrdw/intv.c b/mess/vidhrdw/intv.c index 45de7bf8e..16426be2f 100644 --- a/mess/vidhrdw/intv.c +++ b/mess/vidhrdw/intv.c @@ -9,7 +9,7 @@ VIDEO_START( intv ) { //int i,j,k; - if (video_start_generic_bitmapped()) + if (video_start_generic_bitmapped(machine)) return 1; /* @@ -775,10 +775,10 @@ VIDEO_START( intvkbd ) videoram_size = 0x0800; videoram = auto_malloc(videoram_size); - if (video_start_generic()) + if (video_start_generic(machine)) return 1; - return video_start_intv(); + return video_start_intv(machine); } /* very rudimentary support for the tms9927 character generator IC */ @@ -841,7 +841,7 @@ VIDEO_UPDATE( intvkbd ) // char c; /* Draw the underlying INTV screen first */ - video_update_intv(screen, bitmap, cliprect); + video_update_intv(machine, screen, bitmap, cliprect); /* if the intvkbd text is not blanked, overlay it */ if (!intvkbd_text_blanked) diff --git a/mess/vidhrdw/jupiter.c b/mess/vidhrdw/jupiter.c index f6aabaec8..d0cea3b75 100644 --- a/mess/vidhrdw/jupiter.c +++ b/mess/vidhrdw/jupiter.c @@ -15,7 +15,7 @@ size_t jupiter_charram_size; VIDEO_START( jupiter ) { - if( video_start_generic() ) + if( video_start_generic(machine) ) return 1; return 0; } diff --git a/mess/vidhrdw/kaypro.c b/mess/vidhrdw/kaypro.c index 22498f3ec..b55082705 100644 --- a/mess/vidhrdw/kaypro.c +++ b/mess/vidhrdw/kaypro.c @@ -196,13 +196,13 @@ VIDEO_UPDATE( kaypro ) { if (blink_count & 16) { - palette_set_color(3, 0,240, 0); - palette_set_color(4, 0,120, 0); + palette_set_color(machine, 3, 0,240, 0); + palette_set_color(machine, 4, 0,120, 0); } else { - palette_set_color(3, 0, 0, 0); - palette_set_color(4, 0, 0, 0); + palette_set_color(machine, 3, 0, 0, 0); + palette_set_color(machine, 4, 0, 0, 0); } } diff --git a/mess/vidhrdw/kc.c b/mess/vidhrdw/kc.c index 6025592d0..eaa345e46 100644 --- a/mess/vidhrdw/kc.c +++ b/mess/vidhrdw/kc.c @@ -95,7 +95,7 @@ static unsigned char kc85_palette[KC85_PALETTE_SIZE * 3] = /* Initialise the palette */ PALETTE_INIT( kc85 ) { - palette_set_colors(0, kc85_palette, sizeof(kc85_palette) / 3); + palette_set_colors(machine, 0, kc85_palette, sizeof(kc85_palette) / 3); memcpy(colortable, kc85_colour_table, sizeof (kc85_colour_table)); } diff --git a/mess/vidhrdw/kim1.c b/mess/vidhrdw/kim1.c index afa5e3a43..5dbf7bff6 100644 --- a/mess/vidhrdw/kim1.c +++ b/mess/vidhrdw/kim1.c @@ -18,7 +18,7 @@ PALETTE_INIT( kim1 ) /* initialize 16 colors with shades of red (orange) */ for (i = 0; i < 16; i++) { - palette_set_color(i, + palette_set_color(machine, i, 24 + (i + 1) * (i + 1) - 1, (i + 1) * (i + 1) / 4, 0); @@ -26,11 +26,11 @@ PALETTE_INIT( kim1 ) colortable[2 * i + 1] = i; } - palette_set_color(16, 0, 0, 0); - palette_set_color(17, 30, 30, 30); - palette_set_color(18, 90, 90, 90); - palette_set_color(19, 50, 50, 50); - palette_set_color(20, 255, 255, 255); + palette_set_color(machine, 16, 0, 0, 0); + palette_set_color(machine, 17, 30, 30, 30); + palette_set_color(machine, 18, 90, 90, 90); + palette_set_color(machine, 19, 50, 50, 50); + palette_set_color(machine, 20, 255, 255, 255); colortable[2 * 16 + 0 * 4 + 0] = 17; colortable[2 * 16 + 0 * 4 + 1] = 18; @@ -48,22 +48,22 @@ VIDEO_START( kim1 ) videoram_size = 6 * 2 + 24; videoram = auto_malloc (videoram_size); - return video_start_generic(); + return video_start_generic(machine); } VIDEO_UPDATE( kim1 ) { int x, y; - fillbitmap(bitmap, get_black_pen(), NULL); + fillbitmap(bitmap, get_black_pen(machine), NULL); for (x = 0; x < 6; x++) { int sy = 408; - int sx = Machine->screen[0].width - 212 + x * 30 + ((x >= 4) ? 6 : 0); + int sx = machine->screen[0].width - 212 + x * 30 + ((x >= 4) ? 6 : 0); - drawgfx (bitmap, Machine->gfx[0], videoram[2 * x + 0], videoram[2 * x + 1], - 0, 0, sx, sy, &Machine->screen[0].visarea, TRANSPARENCY_PEN, 0); + drawgfx (bitmap, machine->gfx[0], videoram[2 * x + 0], videoram[2 * x + 1], + 0, 0, sx, sy, &machine->screen[0].visarea, TRANSPARENCY_PEN, 0); } for (y = 0; y < 6; y++) @@ -81,14 +81,14 @@ VIDEO_UPDATE( kim1 ) { 4, 5, 6, 7}, { 0, 1, 2, 3} }; - int sx = Machine->screen[0].width - 182 + x * 37; + int sx = machine->screen[0].width - 182 + x * 37; int color, code = layout[y][x]; color = (readinputport (code / 7) & (0x40 >> (code % 7))) ? 0 : 1; videoram[6 * 2 + code] = color; - drawgfx (bitmap, Machine->gfx[1], layout[y][x], color, - 0, 0, sx, sy, &Machine->screen[0].visarea, TRANSPARENCY_NONE, 0); + drawgfx (bitmap, machine->gfx[1], layout[y][x], color, + 0, 0, sx, sy, &machine->screen[0].visarea, TRANSPARENCY_NONE, 0); } } return 0; diff --git a/mess/vidhrdw/lviv.c b/mess/vidhrdw/lviv.c index faa4ffd39..b1881afac 100644 --- a/mess/vidhrdw/lviv.c +++ b/mess/vidhrdw/lviv.c @@ -31,7 +31,7 @@ unsigned short lviv_colortable[1][4] = PALETTE_INIT( lviv ) { - palette_set_colors(0, lviv_palette, sizeof(lviv_palette) / 3); + palette_set_colors(machine, 0, lviv_palette, sizeof(lviv_palette) / 3); memcpy(colortable, lviv_colortable, sizeof (lviv_colortable)); } diff --git a/mess/vidhrdw/mac.c b/mess/vidhrdw/mac.c index 572bc4715..f4e185657 100644 --- a/mess/vidhrdw/mac.c +++ b/mess/vidhrdw/mac.c @@ -17,8 +17,8 @@ static int screen_buffer; PALETTE_INIT( mac ) { - palette_set_color(0, 0xff, 0xff, 0xff); - palette_set_color(1, 0x00, 0x00, 0x00); + palette_set_color(machine, 0, 0xff, 0xff, 0xff); + palette_set_color(machine, 1, 0x00, 0x00, 0x00); } diff --git a/mess/vidhrdw/mbee.c b/mess/vidhrdw/mbee.c index 6b97f6b9a..2662551b3 100644 --- a/mess/vidhrdw/mbee.c +++ b/mess/vidhrdw/mbee.c @@ -492,7 +492,7 @@ WRITE8_HANDLER ( m6545_data_w ) VIDEO_START( mbee ) { - if( video_start_generic() ) + if( video_start_generic(machine) ) return 1; videoram = auto_malloc(0x800); colorram = auto_malloc(0x800); diff --git a/mess/vidhrdw/mekd2.c b/mess/vidhrdw/mekd2.c index d49af08c9..15d147c01 100644 --- a/mess/vidhrdw/mekd2.c +++ b/mess/vidhrdw/mekd2.c @@ -30,7 +30,7 @@ PALETTE_INIT( mekd2 ) /* initialize 16 colors with shades of red (orange) */ for (i = 0; i < 16; i++) { - palette_set_color(i, + palette_set_color(machine, i, 24 + (i + 1) * (i + 1) - 1, (i + 1) * (i + 1) / 4, 0); @@ -39,11 +39,11 @@ PALETTE_INIT( mekd2 ) colortable[2 * i + 1] = i; } - palette_set_color(16, 0, 0, 0); - palette_set_color(17, 30, 30, 30); - palette_set_color(18, 90, 90, 90); - palette_set_color(19, 50, 50, 50); - palette_set_color(20, 255, 255, 255); + palette_set_color(machine, 16, 0, 0, 0); + palette_set_color(machine, 17, 30, 30, 30); + palette_set_color(machine, 18, 90, 90, 90); + palette_set_color(machine, 19, 50, 50, 50); + palette_set_color(machine, 20, 255, 255, 255); colortable[2 * 16 + 0 * 4 + 0] = 17; colortable[2 * 16 + 0 * 4 + 1] = 18; @@ -70,7 +70,7 @@ VIDEO_START( mekd2 ) } #endif - return video_start_generic(); + return video_start_generic(machine); } VIDEO_UPDATE( mekd2 ) diff --git a/mess/vidhrdw/mk1.c b/mess/vidhrdw/mk1.c index fd293ab37..dcdcc3a47 100644 --- a/mess/vidhrdw/mk1.c +++ b/mess/vidhrdw/mk1.c @@ -21,7 +21,7 @@ static unsigned short mk1_colortable[] = PALETTE_INIT( mk1 ) { - palette_set_colors(0, mk1_palette, sizeof(mk1_palette) / 3); + palette_set_colors(machine, 0, mk1_palette, sizeof(mk1_palette) / 3); memcpy(colortable, mk1_colortable, sizeof(mk1_colortable)); } diff --git a/mess/vidhrdw/mk2.c b/mess/vidhrdw/mk2.c index 061121131..8b0f3c47e 100644 --- a/mess/vidhrdw/mk2.c +++ b/mess/vidhrdw/mk2.c @@ -22,7 +22,7 @@ unsigned short mk2_colortable[] = { PALETTE_INIT( mk2 ) { - palette_set_colors(0, mk2_palette, sizeof(mk2_palette) / 3); + palette_set_colors(machine, 0, mk2_palette, sizeof(mk2_palette) / 3); memcpy(colortable, mk2_colortable, sizeof(mk2_colortable)); } @@ -31,7 +31,7 @@ VIDEO_START( mk2 ) // artwork seams to need this videoram_size = 6 * 2 + 24; videoram = (UINT8*)auto_malloc (videoram_size); - return video_start_generic(); + return video_start_generic(machine); } static const char led[]={ diff --git a/mess/vidhrdw/mz700.c b/mess/vidhrdw/mz700.c index 255977704..8cbd3a430 100644 --- a/mess/vidhrdw/mz700.c +++ b/mess/vidhrdw/mz700.c @@ -31,7 +31,7 @@ PALETTE_INIT(mz700) for (i = 0; i < 8; i++) { - palette_set_color(i, (i & 2) ? 0xff : 0x00, (i & 4) ? 0xff : 0x00, (i & 1) ? 0xff : 0x00); + palette_set_color(machine, i, (i & 2) ? 0xff : 0x00, (i & 4) ? 0xff : 0x00, (i & 1) ? 0xff : 0x00); } for (i = 0; i < 256; i++) @@ -43,7 +43,7 @@ PALETTE_INIT(mz700) VIDEO_START(mz700) { - if (video_start_generic()) + if (video_start_generic(machine)) return 1; return 0; } diff --git a/mess/vidhrdw/nc.c b/mess/vidhrdw/nc.c index c54724b21..313109cbc 100644 --- a/mess/vidhrdw/nc.c +++ b/mess/vidhrdw/nc.c @@ -38,7 +38,7 @@ static unsigned char nc_palette[NC_NUM_COLOURS * 3] = /* Initialise the palette */ PALETTE_INIT( nc ) { - palette_set_colors(0, nc_palette, sizeof(nc_palette) / 3); + palette_set_colors(machine, 0, nc_palette, sizeof(nc_palette) / 3); memcpy(colortable, nc_colour_table, sizeof (nc_colour_table)); } diff --git a/mess/vidhrdw/nes.c b/mess/vidhrdw/nes.c index 05016347d..f9c5ee27f 100644 --- a/mess/vidhrdw/nes.c +++ b/mess/vidhrdw/nes.c @@ -22,7 +22,7 @@ static void ppu_nmi(int num, int *ppu_regs) cpunum_set_input_line(0, INPUT_LINE_NMI, PULSE_LINE); } -static void nes_vh_reset(void) +static void nes_vh_reset(running_machine *machine) { ppu2c0x_reset( 0, 1 ); } @@ -63,7 +63,7 @@ static void nes_vh_start(ppu_t ppu_type, double scanlines_per_frame) } } - add_reset_callback(nes_vh_reset); + add_reset_callback(Machine, nes_vh_reset); /* Reset the mapper variables. Will also mark the char-gen ram as dirty */ mapper_reset(nes.mapper); diff --git a/mess/vidhrdw/newport.c b/mess/vidhrdw/newport.c index 031ebf32b..257dfe9ea 100644 --- a/mess/vidhrdw/newport.c +++ b/mess/vidhrdw/newport.c @@ -190,7 +190,7 @@ VIDEO_UPDATE( newport ) { int y; - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); /* loop over rows and copy to the destination */ for( y = cliprect->min_y; y <= cliprect->max_y; y++ ) diff --git a/mess/vidhrdw/odyssey2.c b/mess/vidhrdw/odyssey2.c index 59c501d1d..05b13a85b 100644 --- a/mess/vidhrdw/odyssey2.c +++ b/mess/vidhrdw/odyssey2.c @@ -181,7 +181,7 @@ VIDEO_START( odyssey2 ) PALETTE_INIT( odyssey2 ) { - palette_set_colors(0, odyssey2_colors, sizeof(odyssey2_colors) / 3); + palette_set_colors(machine, 0, odyssey2_colors, sizeof(odyssey2_colors) / 3); colortable[0] = 0; colortable[1] = 1; } diff --git a/mess/vidhrdw/p2000m.c b/mess/vidhrdw/p2000m.c index a01b6efc4..d7c18ab32 100644 --- a/mess/vidhrdw/p2000m.c +++ b/mess/vidhrdw/p2000m.c @@ -15,7 +15,7 @@ static INT8 frame_count; VIDEO_START( p2000m ) { frame_count = 0; - return video_start_generic(); + return video_start_generic(machine); } void p2000m_vh_callback (void) diff --git a/mess/vidhrdw/pc1403.c b/mess/vidhrdw/pc1403.c index 4d4b2a5c3..e192216a5 100644 --- a/mess/vidhrdw/pc1403.c +++ b/mess/vidhrdw/pc1403.c @@ -52,7 +52,7 @@ VIDEO_START( pc1403 ) DOWN=pos[1].y; RIGHT=pos[1].x; } - return video_start_pocketc(); + return video_start_pocketc(machine); } diff --git a/mess/vidhrdw/pc8801.c b/mess/vidhrdw/pc8801.c index 96ad4b99a..1c85f04f1 100644 --- a/mess/vidhrdw/pc8801.c +++ b/mess/vidhrdw/pc8801.c @@ -1,6 +1,6 @@ /*************************************************************************** - $Id: pc8801.c,v 1.20 2006/08/14 21:38:26 npwoods Exp $ + $Id: pc8801.c,v 1.21 2006/09/15 02:51:43 npwoods Exp $ ***************************************************************************/ @@ -604,12 +604,12 @@ PALETTE_INIT( pc8801 ) int i; for (i = 0; i < 8; i++) - palette_set_color(i, 0, 0, 0); /* for graphics */ + palette_set_color(machine, i, 0, 0, 0); /* for graphics */ /* for text */ for (i = 0; i < 8; i++) { - palette_set_color(i+8, + palette_set_color(machine, i+8, (i & 2) ? 0xff : 0x00, (i & 4) ? 0xff : 0x00, (i & 1) ? 0xff : 0x00); @@ -620,8 +620,8 @@ PALETTE_INIT( pc8801 ) } /* for background and scanline */ - palette_set_color(16, 0, 0, 0); - palette_set_color(17, 0, 0, 0); + palette_set_color(machine, 16, 0, 0, 0); + palette_set_color(machine, 17, 0, 0, 0); } WRITE8_HANDLER(pc8801_crtc_write) @@ -916,5 +916,5 @@ WRITE8_HANDLER(pc8801_palette_out) r[offset] = (data & 2) ? 0xff : 0x00; g[offset] = (data & 4) ? 0xff : 0x00; } - palette_set_color(palno,r[offset],g[offset],b[offset]); + palette_set_color(Machine, palno,r[offset],g[offset],b[offset]); } diff --git a/mess/vidhrdw/pc_aga.c b/mess/vidhrdw/pc_aga.c index 815dd880c..6f09b145a 100644 --- a/mess/vidhrdw/pc_aga.c +++ b/mess/vidhrdw/pc_aga.c @@ -109,7 +109,7 @@ PALETTE_INIT( pc_aga ) { int i; for(i = 0; i < (sizeof(cga_palette) / 3); i++) - palette_set_color(i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]); + palette_set_color(machine, i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]); memcpy(colortable,cga_colortable,sizeof(cga_colortable)); memcpy((char*)colortable+sizeof(cga_colortable), mda_colortable, sizeof(mda_colortable)); } @@ -231,7 +231,7 @@ VIDEO_START( pc200 ) { int buswidth; - if (video_start_pc_aga()) + if (video_start_pc_aga(machine)) return 1; buswidth = cputype_databus_width(Machine->drv->cpu[0].cpu_type, ADDRESS_SPACE_PROGRAM); diff --git a/mess/vidhrdw/pc_cga.c b/mess/vidhrdw/pc_cga.c index 28df077b6..62cef4041 100644 --- a/mess/vidhrdw/pc_cga.c +++ b/mess/vidhrdw/pc_cga.c @@ -362,7 +362,7 @@ static void pc_cga_check_palette(void) if (p != cga.palette) { for(i = 0; i < (sizeof(cga_palette) / (3 * CGA_PALETTE_SETS)); i++) - palette_set_color(i, cga_palette[i + p][0], + palette_set_color(Machine, i, cga_palette[i + p][0], cga_palette[i + p][1], cga_palette[i + p][2]); cga.palette = p; diff --git a/mess/vidhrdw/pc_mda.c b/mess/vidhrdw/pc_mda.c index 6b86a14e4..325fbb4a8 100644 --- a/mess/vidhrdw/pc_mda.c +++ b/mess/vidhrdw/pc_mda.c @@ -90,7 +90,7 @@ PALETTE_INIT( pc_mda ) { int i; for(i = 0; i < (sizeof(cga_palette) / 3); i++) - palette_set_color(i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]); + palette_set_color(machine, i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]); memcpy(colortable, mda_colortable, sizeof(mda_colortable)); } diff --git a/mess/vidhrdw/pc_t1t.c b/mess/vidhrdw/pc_t1t.c index 89b5ee20f..2c59c544c 100644 --- a/mess/vidhrdw/pc_t1t.c +++ b/mess/vidhrdw/pc_t1t.c @@ -143,7 +143,7 @@ static PALETTE_INIT( pcjr ) { int i; for(i = 0; i < (sizeof(cga_palette) / 3); i++) - palette_set_color(i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]); + palette_set_color(machine, i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]); memcpy(colortable, pcjr_colortable, sizeof(pcjr_colortable)); } @@ -348,7 +348,7 @@ static void pc_t1t_vga_data_w(int data) case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: T1T_LOG(1,"T1T_vga_palette_w",("[$%02x] $%02x\n", pcjr.reg.index - 0x10, data)); - palette_set_color(pcjr.reg.index-0x10, + palette_set_color(Machine, pcjr.reg.index-0x10, cga_palette[data&0xf][0], cga_palette[data&0xf][1], cga_palette[data&0xf][2]); diff --git a/mess/vidhrdw/pc_vga.c b/mess/vidhrdw/pc_vga.c index 4832aa456..ac622d581 100644 --- a/mess/vidhrdw/pc_vga.c +++ b/mess/vidhrdw/pc_vga.c @@ -182,7 +182,7 @@ MACHINE_DRIVER_END static PALETTE_INIT( ega ) { - palette_set_colors(0, ega_palette, sizeof(ega_palette) / 3); + palette_set_colors(machine, 0, ega_palette, sizeof(ega_palette) / 3); memcpy(colortable, vga_colortable,0x200); } @@ -190,7 +190,7 @@ static PALETTE_INIT( vga ) { int i; for (i = 0; i < 0x100; i++) - palette_set_color(i, 0, 0, 0); + palette_set_color(machine, i, 0, 0, 0); memcpy(colortable, vga_colortable,0x200); } @@ -1322,7 +1322,7 @@ static pc_video_update_proc pc_vga_choosevideomode(int *width, int *height, stru { for (i=0; i<256;i++) { - palette_set_color(i,(vga.dac.color[i].red & 0x3f) << 2, + palette_set_color(Machine, i,(vga.dac.color[i].red & 0x3f) << 2, (vga.dac.color[i].green & 0x3f) << 2, (vga.dac.color[i].blue & 0x3f) << 2); } diff --git a/mess/vidhrdw/pc_video.c b/mess/vidhrdw/pc_video.c index 49c5e2f2f..c7d32ad03 100644 --- a/mess/vidhrdw/pc_video.c +++ b/mess/vidhrdw/pc_video.c @@ -60,7 +60,7 @@ struct crtc6845 *pc_video_start(const struct crtc6845_config *config, if (videoram_size) { - if (video_start_generic()) + if (video_start_generic(Machine)) return NULL; } diff --git a/mess/vidhrdw/pcw.c b/mess/vidhrdw/pcw.c index ea900482e..87dcbab67 100644 --- a/mess/vidhrdw/pcw.c +++ b/mess/vidhrdw/pcw.c @@ -40,7 +40,7 @@ static unsigned char pcw_palette[PCW_NUM_COLOURS * 3] = /* Initialise the palette */ PALETTE_INIT( pcw ) { - palette_set_colors(0, pcw_palette, sizeof(pcw_palette) / 3); + palette_set_colors(machine, 0, pcw_palette, sizeof(pcw_palette) / 3); memcpy(colortable, pcw_colour_table, sizeof (pcw_colour_table)); } diff --git a/mess/vidhrdw/pcw16.c b/mess/vidhrdw/pcw16.c index 92eebb1ca..1f6a78fb8 100644 --- a/mess/vidhrdw/pcw16.c +++ b/mess/vidhrdw/pcw16.c @@ -53,7 +53,7 @@ unsigned char pcw16_palette[PCW16_NUM_COLOURS * 3] = /* Initialise the palette */ PALETTE_INIT( pcw16 ) { - palette_set_colors(0, pcw16_palette, sizeof(pcw16_palette) / 3); + palette_set_colors(machine, 0, pcw16_palette, sizeof(pcw16_palette) / 3); memcpy(colortable, pcw16_colour_table, sizeof (pcw16_colour_table)); } diff --git a/mess/vidhrdw/pmd85.c b/mess/vidhrdw/pmd85.c index 221461496..23b0ce142 100644 --- a/mess/vidhrdw/pmd85.c +++ b/mess/vidhrdw/pmd85.c @@ -25,7 +25,7 @@ unsigned short pmd85_colortable[1][3] ={ PALETTE_INIT( pmd85 ) { - palette_set_colors(0, pmd85_palette, sizeof(pmd85_palette) / 3); + palette_set_colors(machine, 0, pmd85_palette, sizeof(pmd85_palette) / 3); memcpy(colortable, pmd85_colortable, sizeof (pmd85_colortable)); } diff --git a/mess/vidhrdw/pocketc.c b/mess/vidhrdw/pocketc.c index d5d5c18e0..f2e1ca9fb 100644 --- a/mess/vidhrdw/pocketc.c +++ b/mess/vidhrdw/pocketc.c @@ -33,7 +33,7 @@ unsigned short pocketc_colortable[8][2] = { PALETTE_INIT( pocketc ) { - palette_set_colors(0, pocketc_palette, sizeof(pocketc_palette) / 3); + palette_set_colors(machine, 0, pocketc_palette, sizeof(pocketc_palette) / 3); memcpy(colortable,pocketc_colortable,sizeof(pocketc_colortable)); } @@ -51,7 +51,7 @@ VIDEO_START( pocketc ) } #endif - return video_start_generic(); + return video_start_generic(machine); } void pocketc_draw_special(mame_bitmap *bitmap, diff --git a/mess/vidhrdw/primo.c b/mess/vidhrdw/primo.c index 11555cf14..9388e04d8 100644 --- a/mess/vidhrdw/primo.c +++ b/mess/vidhrdw/primo.c @@ -27,7 +27,7 @@ unsigned short primo_colortable[1][2] = PALETTE_INIT( primo ) { - palette_set_colors(0, primo_palette, sizeof(primo_palette) / 3); + palette_set_colors(machine, 0, primo_palette, sizeof(primo_palette) / 3); memcpy(colortable, primo_colortable, sizeof (primo_colortable)); } diff --git a/mess/vidhrdw/saa5050.c b/mess/vidhrdw/saa5050.c index 2c0e6e017..bebc0f055 100644 --- a/mess/vidhrdw/saa5050.c +++ b/mess/vidhrdw/saa5050.c @@ -101,14 +101,14 @@ static unsigned short saa5050_colortable[64 * 2] = /* bgnd, fgnd */ static PALETTE_INIT( saa5050 ) { - palette_set_colors(0, saa5050_palette, sizeof(saa5050_palette) / 3); + palette_set_colors(machine, 0, saa5050_palette, sizeof(saa5050_palette) / 3); memcpy(colortable, saa5050_colortable, sizeof (saa5050_colortable)); } static VIDEO_START( saa5050 ) { frame_count = 0; - if( video_start_generic() ) + if( video_start_generic(machine) ) return 1; return 0; } diff --git a/mess/vidhrdw/smsvdp.c b/mess/vidhrdw/smsvdp.c index 3aba859fb..a8b05be80 100644 --- a/mess/vidhrdw/smsvdp.c +++ b/mess/vidhrdw/smsvdp.c @@ -1000,22 +1000,22 @@ void sms_update_palette(void) { #ifdef LOG_COLOR logerror( "Switched palette to TMS9918 palette\n" ); #endif - palette_set_color( 0, 0, 0, 0 ); - palette_set_color( 1, 0, 0, 0 ); - palette_set_color( 2, 33, 200, 66 ); - palette_set_color( 3, 94, 220, 120 ); - palette_set_color( 4, 84, 85, 237 ); - palette_set_color( 5, 125, 118, 252 ); - palette_set_color( 6, 212, 82, 77 ); - palette_set_color( 7, 66, 235, 245 ); - palette_set_color( 8, 252, 85, 84 ); - palette_set_color( 9, 255, 121, 120 ); - palette_set_color(10, 212, 193, 84 ); - palette_set_color(11, 230, 206, 128 ); - palette_set_color(12, 33, 176, 59 ); - palette_set_color(13, 201, 91, 186 ); - palette_set_color(14, 204, 204, 204 ); - palette_set_color(15, 255, 255, 255 ); + palette_set_color(Machine, 0, 0, 0, 0 ); + palette_set_color(Machine, 1, 0, 0, 0 ); + palette_set_color(Machine, 2, 33, 200, 66 ); + palette_set_color(Machine, 3, 94, 220, 120 ); + palette_set_color(Machine, 4, 84, 85, 237 ); + palette_set_color(Machine, 5, 125, 118, 252 ); + palette_set_color(Machine, 6, 212, 82, 77 ); + palette_set_color(Machine, 7, 66, 235, 245 ); + palette_set_color(Machine, 8, 252, 85, 84 ); + palette_set_color(Machine, 9, 255, 121, 120 ); + palette_set_color(Machine, 10, 212, 193, 84 ); + palette_set_color(Machine, 11, 230, 206, 128 ); + palette_set_color(Machine, 12, 33, 176, 59 ); + palette_set_color(Machine, 13, 201, 91, 186 ); + palette_set_color(Machine, 14, 204, 204, 204 ); + palette_set_color(Machine, 15, 255, 255, 255 ); return; } @@ -1027,7 +1027,7 @@ void sms_update_palette(void) { r = ((ggCRAM[i * 2 + 0] >> 0) & 0x0F) << 4; g = ((ggCRAM[i * 2 + 0] >> 4) & 0x0F) << 4; b = ((ggCRAM[i * 2 + 1] >> 0) & 0x0F) << 4; - palette_set_color(i, r, g, b); + palette_set_color(Machine, i, r, g, b); #ifdef LOG_COLOR logerror("pallette set for i %x r %x g %x b %x\n", i, r, g, b); #endif @@ -1041,7 +1041,7 @@ void sms_update_palette(void) { r = ((smsCRAM[i] >> 0) & 0x03) << 6; g = ((smsCRAM[i] >> 2) & 0x03) << 6; b = ((smsCRAM[i] >> 4) & 0x03) << 6; - palette_set_color(i, r, g, b); + palette_set_color(Machine, i, r, g, b); #ifdef LOG_COLOR logerror("pallette set for i %x r %x g %x b %x\n", i, r, g, b); #endif diff --git a/mess/vidhrdw/ssystem3.c b/mess/vidhrdw/ssystem3.c index b5667a5a0..fab9e0a86 100644 --- a/mess/vidhrdw/ssystem3.c +++ b/mess/vidhrdw/ssystem3.c @@ -22,7 +22,7 @@ static unsigned short ssystem3_colortable[1][2] = { PALETTE_INIT( ssystem3 ) { - palette_set_colors(0, ssystem3_palette, sizeof(ssystem3_palette) / 3); + palette_set_colors(machine, 0, ssystem3_palette, sizeof(ssystem3_palette) / 3); memcpy(colortable,ssystem3_colortable,sizeof(ssystem3_colortable)); } @@ -41,7 +41,7 @@ VIDEO_START( ssystem3 ) } #endif - return video_start_generic(); + return video_start_generic(machine); } static const char led[]={ diff --git a/mess/vidhrdw/sym1.c b/mess/vidhrdw/sym1.c index e42d74ea3..fe8e7f301 100644 --- a/mess/vidhrdw/sym1.c +++ b/mess/vidhrdw/sym1.c @@ -20,7 +20,7 @@ static unsigned char sym1_palette[] = PALETTE_INIT( sym1 ) { - palette_set_colors(0, sym1_palette, sizeof(sym1_palette) / 3); + palette_set_colors(machine, 0, sym1_palette, sizeof(sym1_palette) / 3); } VIDEO_START( sym1 ) @@ -37,7 +37,7 @@ VIDEO_START( sym1 ) } #endif - if (video_start_generic () != 0) + if (video_start_generic(machine) != 0) return 1; return 0; diff --git a/mess/vidhrdw/ted7360.c b/mess/vidhrdw/ted7360.c index c43d8d4ca..32d635248 100644 --- a/mess/vidhrdw/ted7360.c +++ b/mess/vidhrdw/ted7360.c @@ -930,7 +930,7 @@ WRITE8_HANDLER ( ted7360_port_w ) return val; } -static void ted7360_video_stop(void) +static void ted7360_video_stop(running_machine *machine) { freegfx(cursorelement); } @@ -943,7 +943,7 @@ VIDEO_START( ted7360 ) cursorcolortable[1] = Machine->pens[1]; cursorelement->total_colors = 2; ted7360_bitmap = auto_bitmap_alloc(Machine->screen[0].width, Machine->screen[0].height); - add_exit_callback(ted7360_video_stop); + add_exit_callback(machine, ted7360_video_stop); return 0; } diff --git a/mess/vidhrdw/thomson.c b/mess/vidhrdw/thomson.c index 1fb780553..a4b76f96c 100644 --- a/mess/vidhrdw/thomson.c +++ b/mess/vidhrdw/thomson.c @@ -89,17 +89,6 @@ INLINE unsigned thom_video_elapsed ( void ) return u; } -/* current scanline, in [0,THOM_TOTAL_HEIGHT] - if we are in the right part of the screen, returns the next scanline - if in VBLANK, returns THOM_TOTAL_HEIGHT -*/ -INLINE unsigned thom_get_scanline ( void ) -{ - unsigned l = ( thom_video_elapsed() + 27 ) >> 6; - if ( l > THOM_TOTAL_HEIGHT ) l = THOM_TOTAL_HEIGHT; - return l; -} - struct thom_vsignal thom_get_vsignal ( void ) { struct thom_vsignal v; @@ -108,7 +97,7 @@ struct thom_vsignal thom_get_vsignal ( void ) v.inil = ( gpl & 63 ) <= 40; - v.init = gpl < (64 * THOM_ACTIVE_HEIGHT - 14); + v.init = gpl < (64 * THOM_ACTIVE_HEIGHT - 24); v.lt3 = ( gpl & 8 ) ? 1 : 0; @@ -138,7 +127,7 @@ struct thom_vsignal thom_get_lightpen_vsignal ( int xdec, int ydec, int xdec2 ) v.inil = (gpl & 63) <= 41; - v.init = (gpl <= 64 * THOM_ACTIVE_HEIGHT - 14); + v.init = (gpl <= 64 * THOM_ACTIVE_HEIGHT - 24); v.lt3 = ( gpl & 8 ) ? 1 : 0; @@ -190,164 +179,123 @@ static void thom_lightpen_step ( int step ) TO7, TO7/70 and MO5 video harware are much simpler (8 or 16 fixed colors, one mode and one video page). Although the three are different, thay can all be emulated by the TO8 video hardware. - Thus, we use the same TO8-emualtion code to deal with these simpler + Thus, we use the same TO8-emulation code to deal with these simpler hardware (although it is somewhat of an overkill). */ -/* ----------- state change buffer ---------- */ - -/* state to supplements the contents of the video memory */ -struct thom_vstate { - UINT16 pal[16]; /* palette: 16-colors among 4096 */ - UINT16 border; /* border color index, in 0-15 */ - UINT8 mode; /* video mode */ - UINT8 page; /* video page shown, in 0-3 */ -}; +/* ---------------- state & state changes ---------------- */ -/* initial palette */ -static const struct thom_vstate thom_vstate_init = { - { 0x1000, /* 0: black */ 0x000f, /* 1: red */ - 0x00f0, /* 2: geen */ 0x00ff, /* 3: yellow */ - 0x0f00, /* 4: blue */ 0x0f0f, /* 5: purple */ - 0x0ff0, /* 6: cyan */ 0x0fff, /* 7: white */ - 0x0777, /* 8: gray */ 0x033a, /* 9: pink */ - 0x03a3, /* a: light green */ 0x03aa, /* b: light yellow */ - 0x0a33, /* c: light blue */ 0x0a3a, /* d: redish pink */ - 0x0ee7, /* e: light cyan */ 0x007b, /* f: orange */ - }, - 0, 0, 0 -}; +UINT8* thom_vram; /* pointer to video memory */ -/* buffer storing state changes, by increasing scan-line */ +static mame_timer* thom_scanline_timer; /* scan-line udpate */ -static struct thom_vbuf { - struct thom_vstate s; /* new state */ - UINT16 line; /* scan-line at which the change occured */ -} * thom_vbuf; -/* needs to be saved in snapshots */ +static UINT16 thom_last_pal[16]; /* palette at last scanline start */ +static UINT16 thom_pal[16]; /* current palette */ +static UINT8 thom_pal_changed; /* whether pal != old_pal */ +static UINT8 thom_border_index; /* current border color index */ -static UINT32 thom_vbuf_last; +/* border color at each scanline, including top and bottom border + (-1 means unchanged) +*/ +static INT16 thom_border[THOM_TOTAL_HEIGHT+1]; -#define THOM_VBUF_SIZE ( THOM_TOTAL_HEIGHT + 2 ) +/* active area, update one scan-line at a time every 64us, + then blitted in VIDEO_UPDATE + */ +static UINT16 thom_vbody[640*200]; +static UINT8 thom_vmode; /* current vide mode */ +static UINT8 thom_vpage; /* current video page */ -/* Append a new state-change entry, if necessary. - After the function return, thom_vbuf[thom_vbuf_last] can be safely modified - to reflect the new state. +/* this stores the video mode & page at each GPL in the last line, to cope with + (-1 means unchanged) */ -INLINE void thom_vbuf_append ( void ) +static INT16 thom_vmodepage[41]; +static UINT8 thom_vmodepage_changed; + +/* one dirty flag for each video memory line */ +static UINT8 thom_vmem_dirty[205]; + +/* set to 1 if undirty scanlines need to be redrawn due to other video state + changes */ +static UINT8 thom_vstate_dirty; +static UINT8 thom_vstate_last_dirty; + + +/* either the border index or its palette entry has changed */ +static void thom_border_changed( void ) { - unsigned line = thom_get_scanline(); - if ( line == thom_vbuf[thom_vbuf_last].line ) return; - if ( line < thom_vbuf[thom_vbuf_last].line ) { - thom_vbuf[thom_vbuf_last].line = line; - return; - } - assert( thom_vbuf_last < THOM_VBUF_SIZE - 1 ); - memcpy( & thom_vbuf[thom_vbuf_last+1].s, - & thom_vbuf[thom_vbuf_last].s, - sizeof( struct thom_vstate ) ); - thom_vbuf_last++; - thom_vbuf[thom_vbuf_last].line = line; + unsigned l = (thom_video_elapsed() + 53) >> 6; + if ( l > THOM_TOTAL_HEIGHT ) l = THOM_TOTAL_HEIGHT; + thom_border[ l ] = thom_pal[ thom_border_index ]; } -void thom_set_palette ( unsigned index, UINT16 color ) +/* the video mode or page has changed */ +static void thom_gplinfo_changed( void ) { - assert( index < 16 ); - if ( color != 0x1000 ) color &= 0xfff; - if ( thom_vbuf[thom_vbuf_last].s.pal[index] == color ) return; - thom_vbuf_append(); - thom_vbuf[thom_vbuf_last].s.pal[index] = color; - LOG (( "%f thom_set_palette: set %i to $%04X at line %i\n", - timer_get_time(), index, color, thom_vbuf[thom_vbuf_last].line )); + unsigned l = thom_video_elapsed() - THOM_BORDER_HEIGHT * 64 - 7; + unsigned y = l >> 6; + unsigned x = l & 63; + int modepage = ((int)thom_vmode << 8) | thom_vpage; + if ( y >= 200 || x>= 40 ) thom_vmodepage[ 40 ] = modepage; + else thom_vmodepage[ x ] = modepage; + thom_vmodepage_changed = 1; + thom_vstate_dirty = 1; } void thom_set_border_color ( unsigned index ) { - if ( thom_vbuf[thom_vbuf_last].s.border == index ) return; assert( index < 16 ); - thom_vbuf_append(); - thom_vbuf[thom_vbuf_last].s.border = index; - LOG (( "%f thom_set_border_color: %i at line %i\n", - timer_get_time(), index, thom_vbuf[thom_vbuf_last].line )); -} - -void thom_set_video_mode ( unsigned mode ) -{ - if ( thom_vbuf[thom_vbuf_last].s.mode == mode ) return; - assert( mode < THOM_VMODE_NB ); - thom_vbuf_append(); - thom_vbuf[thom_vbuf_last].s.mode = mode; - LOG (( "%f thom_set_video_mode: %i at line %i\n", - timer_get_time(), mode, thom_vbuf[thom_vbuf_last].line )); + if ( index != thom_border_index ) { + thom_border_index = index; + thom_border_changed(); + } } -void thom_set_video_page ( unsigned page ) +void thom_set_palette ( unsigned index, UINT16 color ) { - if ( thom_vbuf[thom_vbuf_last].s.page == page ) return; - assert( page < THOM_NB_PAGES ); - thom_vbuf_append(); - thom_vbuf[thom_vbuf_last].s.page = page; - LOG (( "%f thom_set_video_page: %i at line %i\n", - timer_get_time(), page, thom_vbuf[thom_vbuf_last].line )); + assert( index < 16 ); + if ( color != 0x1000 ) color &= 0xfff; + if ( thom_pal[ index ] == color ) return; + thom_pal[ index ] = color; + if ( index == thom_border_index ) thom_border_changed(); + thom_pal_changed = 1; + thom_vstate_dirty = 1; } - -/* -------------- scan-line cache --------------- */ - - -/* scan-line cache to back-up each scan-line in video memory */ -static struct thom_vcache { - - /* cache valid except for GPLs in [dirty_min,dirty_max] */ - UINT16 cache[640]; - UINT8 dirty_min, dirty_max; - - /* state */ - UINT16 pal[16]; /* palette: 16-colors among 4096 */ - UINT8 mode; /* video mode */ - UINT8 inherits; /* =1 if state is the same as preceding scan-line */ - - /* pointer to start of line in video memory */ - UINT8* vram; - -} * thom_vcache; /* no need to save this in snapshots */ - -INLINE void thom_dirty_line ( unsigned page, unsigned line ) +void thom_set_video_mode ( unsigned mode ) { - struct thom_vcache* v = thom_vcache + line + page * THOM_ACTIVE_HEIGHT; - assert( page < THOM_NB_PAGES ); - assert( line < THOM_ACTIVE_HEIGHT ); - v->dirty_min = 0; - v->dirty_max = THOM_GPL_PER_LINE - 1; - v->inherits = 0; + assert( mode < THOM_VMODE_NB ); + if ( mode != thom_vmode ) { + thom_vmode = mode; + thom_gplinfo_changed(); + } } -INLINE void thom_dirty_gpl ( unsigned page, unsigned line, unsigned gpl ) +void thom_set_video_page ( unsigned page ) { - struct thom_vcache* v = thom_vcache + line + page * THOM_ACTIVE_HEIGHT; assert( page < THOM_NB_PAGES ); - assert( line < THOM_ACTIVE_HEIGHT ); - assert( gpl < THOM_GPL_PER_LINE ); - if ( v->dirty_min > gpl ) v->dirty_min = gpl; - if ( v->dirty_max < gpl ) v->dirty_max = gpl; + if ( page != thom_vpage ) { + thom_vpage = page; + thom_gplinfo_changed(); + } } /* -------------- drawing --------------- */ -typedef void ( *thom_vcache_update ) ( struct thom_vcache* v ); +typedef void ( *thom_scandraw ) ( UINT8* vram, UINT16* dst, UINT16* pal, + int org, int len ); #define UPDATE( name, res ) \ - static void name##_vcache_update_##res ( struct thom_vcache* v ) \ + static void name##_scandraw_##res ( UINT8* vram, UINT16* dst, UINT16* pal, \ + int org, int len ) \ { \ - const int min = v->dirty_min; \ - const int max = v->dirty_max; \ - UINT8* vram = v->vram + min; \ - UINT16* dst = v->cache + min * res; \ unsigned gpl; \ - for ( gpl = min; gpl <= max; gpl++, dst += res, vram++ ) { \ + vram += org; \ + dst += org * res; \ + for ( gpl = 0; gpl < len; gpl++, dst += res, vram++ ) { \ UINT8 rama = vram[ 0 ]; \ UINT8 ramb = vram[ 0x2000 ]; @@ -363,8 +311,8 @@ UPDATE_HI( to770 ) { int i; pen_t c[2]; - c[0] = Machine->pens[ v->pal[ ((ramb & 7) | ((ramb>>4) & 8)) ^ 8 ] ]; - c[1] = Machine->pens[ v->pal[ ((ramb >> 3) & 15) ^ 8 ] ]; + c[0] = Machine->pens[ pal[ ((ramb & 7) | ((ramb>>4) & 8)) ^ 8 ] ]; + c[1] = Machine->pens[ pal[ ((ramb >> 3) & 15) ^ 8 ] ]; for ( i = 0; i < 16; i += 2, rama >>= 1 ) dst[ 15 - i ] = dst[ 14 - i ] = c[ rama & 1 ]; } @@ -373,8 +321,8 @@ UPDATE_LOW( to770 ) { int i; pen_t c[2]; - c[0] = Machine->pens[ v->pal[ ((ramb & 7) | ((ramb>>4) & 8)) ^ 8 ] ]; - c[1] = Machine->pens[ v->pal[ ((ramb >> 3) & 15) ^ 8 ] ]; + c[0] = Machine->pens[ pal[ ((ramb & 7) | ((ramb>>4) & 8)) ^ 8 ] ]; + c[1] = Machine->pens[ pal[ ((ramb >> 3) & 15) ^ 8 ] ]; for ( i = 0; i < 8; i++, rama >>= 1 ) dst[ 7 - i ] = c[ rama & 1 ]; } @@ -385,8 +333,8 @@ UPDATE_HI( mo5 ) { int i; pen_t c[2]; - c[0] = Machine->pens[ v->pal[ ramb & 15 ] ]; - c[1] = Machine->pens[ v->pal[ ramb >> 4 ] ]; + c[0] = Machine->pens[ pal[ ramb & 15 ] ]; + c[1] = Machine->pens[ pal[ ramb >> 4 ] ]; for ( i = 0; i < 16; i += 2, rama >>= 1 ) dst[ 15 - i ] = dst[ 14 - i ] = c[ rama & 1 ]; } @@ -395,8 +343,8 @@ UPDATE_LOW( mo5 ) { int i; pen_t c[2]; - c[0] = Machine->pens[ v->pal[ ramb & 15 ] ]; - c[1] = Machine->pens[ v->pal[ ramb >> 4 ] ]; + c[0] = Machine->pens[ pal[ ramb & 15 ] ]; + c[1] = Machine->pens[ pal[ ramb >> 4 ] ]; for ( i = 0; i < 8; i++, rama >>= 1 ) dst[ 7 - i ] = c[ rama & 1 ]; } @@ -407,8 +355,8 @@ UPDATE_HI( to9 ) { int i; pen_t c[2]; - c[0] = Machine->pens[ v->pal[ (ramb & 7) | ((ramb>>4) & 8) ] ]; - c[1] = Machine->pens[ v->pal[ (ramb >> 3) & 15 ] ]; + c[0] = Machine->pens[ pal[ (ramb & 7) | ((ramb>>4) & 8) ] ]; + c[1] = Machine->pens[ pal[ (ramb >> 3) & 15 ] ]; for ( i = 0; i < 16; i += 2, rama >>= 1 ) dst[ 15 - i ] = dst[ 14 - i ] = c[ rama & 1 ]; } @@ -417,8 +365,8 @@ UPDATE_LOW( to9 ) { int i; pen_t c[2]; - c[0] = Machine->pens[ v->pal[ (ramb & 7) | ((ramb>>4) & 8) ] ]; - c[1] = Machine->pens[ v->pal[ (ramb >> 3) & 15 ] ]; + c[0] = Machine->pens[ pal[ (ramb & 7) | ((ramb>>4) & 8) ] ]; + c[1] = Machine->pens[ pal[ (ramb >> 3) & 15 ] ]; for ( i = 0; i < 8; i++, rama >>= 1 ) dst[ 7 - i ] = c[ rama & 1 ]; } @@ -429,10 +377,10 @@ UPDATE_HI( bitmap4 ) { int i; pen_t c[2][2]; - c[0][0] = Machine->pens[ v->pal[ 0 ] ]; - c[0][1] = Machine->pens[ v->pal[ 1 ] ]; - c[1][0] = Machine->pens[ v->pal[ 2 ] ]; - c[1][1] = Machine->pens[ v->pal[ 3 ] ]; + c[0][0] = Machine->pens[ pal[ 0 ] ]; + c[0][1] = Machine->pens[ pal[ 1 ] ]; + c[1][0] = Machine->pens[ pal[ 2 ] ]; + c[1][1] = Machine->pens[ pal[ 3 ] ]; for ( i = 0; i < 16; i += 2, rama >>= 1, ramb >>= 1 ) dst[ 15 - i ] = dst[ 14 - i ] = c[ rama & 1 ] [ ramb & 1 ]; } @@ -441,10 +389,10 @@ UPDATE_LOW( bitmap4 ) { int i; pen_t c[2][2]; - c[0][0] = Machine->pens[ v->pal[ 0 ] ]; - c[0][1] = Machine->pens[ v->pal[ 1 ] ]; - c[1][0] = Machine->pens[ v->pal[ 2 ] ]; - c[1][1] = Machine->pens[ v->pal[ 3 ] ]; + c[0][0] = Machine->pens[ pal[ 0 ] ]; + c[0][1] = Machine->pens[ pal[ 1 ] ]; + c[1][0] = Machine->pens[ pal[ 2 ] ]; + c[1][1] = Machine->pens[ pal[ 3 ] ]; for ( i = 0; i < 8; i++, rama >>= 1, ramb >>= 1 ) dst[ 7 - i ] = c[ rama & 1 ] [ ramb & 1 ]; } @@ -455,10 +403,10 @@ UPDATE_HI( bitmap4alt ) { int i; pen_t c[4]; - c[0] = Machine->pens[ v->pal[ 0 ] ]; - c[1] = Machine->pens[ v->pal[ 1 ] ]; - c[2] = Machine->pens[ v->pal[ 2 ] ]; - c[3] = Machine->pens[ v->pal[ 3 ] ]; + c[0] = Machine->pens[ pal[ 0 ] ]; + c[1] = Machine->pens[ pal[ 1 ] ]; + c[2] = Machine->pens[ pal[ 2 ] ]; + c[3] = Machine->pens[ pal[ 3 ] ]; for ( i = 0; i < 8; i += 2, ramb >>= 2 ) dst[ 15 - i ] = dst[ 14 - i ] = c[ ramb & 3 ]; for ( i = 0; i < 8; i += 2, rama >>= 2 ) @@ -469,10 +417,10 @@ UPDATE_LOW( bitmap4alt ) { int i; pen_t c[4]; - c[0] = Machine->pens[ v->pal[ 0 ] ]; - c[1] = Machine->pens[ v->pal[ 1 ] ]; - c[2] = Machine->pens[ v->pal[ 2 ] ]; - c[3] = Machine->pens[ v->pal[ 3 ] ]; + c[0] = Machine->pens[ pal[ 0 ] ]; + c[1] = Machine->pens[ pal[ 1 ] ]; + c[2] = Machine->pens[ pal[ 2 ] ]; + c[3] = Machine->pens[ pal[ 3 ] ]; for ( i = 0; i < 4; i++, ramb >>= 2 ) dst[ 7 - i ] = c[ ramb & 3 ]; for ( i = 0; i < 4; i++, rama >>= 2 ) @@ -483,18 +431,18 @@ END_UPDATE /* 160x200, 16-colors, no constraints */ UPDATE_HI( bitmap16 ) { - dst[ 0] = dst[ 1] = dst[ 2] = dst[ 3] = Machine->pens[ v->pal[ rama >> 4 ] ]; - dst[ 4] = dst[ 5] = dst[ 6] = dst[ 7] = Machine->pens[ v->pal[ rama & 15 ] ]; - dst[ 8] = dst[ 9] = dst[10] = dst[11] = Machine->pens[ v->pal[ ramb >> 4 ] ]; - dst[12] = dst[13] = dst[14] = dst[15] = Machine->pens[ v->pal[ ramb & 15 ] ]; + dst[ 0] = dst[ 1] = dst[ 2] = dst[ 3] = Machine->pens[ pal[ rama >> 4 ] ]; + dst[ 4] = dst[ 5] = dst[ 6] = dst[ 7] = Machine->pens[ pal[ rama & 15 ] ]; + dst[ 8] = dst[ 9] = dst[10] = dst[11] = Machine->pens[ pal[ ramb >> 4 ] ]; + dst[12] = dst[13] = dst[14] = dst[15] = Machine->pens[ pal[ ramb & 15 ] ]; } END_UPDATE UPDATE_LOW( bitmap16 ) { - dst[0] = dst[1] = Machine->pens[ v->pal[ rama >> 4 ] ]; - dst[2] = dst[3] = Machine->pens[ v->pal[ rama & 15 ] ]; - dst[4] = dst[5] = Machine->pens[ v->pal[ ramb >> 4 ] ]; - dst[6] = dst[7] = Machine->pens[ v->pal[ ramb & 15 ] ]; + dst[0] = dst[1] = Machine->pens[ pal[ rama >> 4 ] ]; + dst[2] = dst[3] = Machine->pens[ pal[ rama & 15 ] ]; + dst[4] = dst[5] = Machine->pens[ pal[ ramb >> 4 ] ]; + dst[6] = dst[7] = Machine->pens[ pal[ ramb & 15 ] ]; } END_UPDATE @@ -503,8 +451,8 @@ UPDATE_HI( mode80 ) { int i; pen_t c[2]; - c[0] = Machine->pens[ v->pal[ 0 ] ]; - c[1] = Machine->pens[ v->pal[ 1 ] ]; + c[0] = Machine->pens[ pal[ 0 ] ]; + c[1] = Machine->pens[ pal[ 1 ] ]; for ( i = 0; i < 8; i++, ramb >>= 1 ) dst[ 15 - i ] = c[ ramb & 1 ]; for ( i = 0; i < 8; i++, rama >>= 1 ) @@ -516,8 +464,35 @@ UPDATE_LOW( mode80 ) /* merge pixels */ int i; pen_t c[4]; - c[0] = Machine->pens[ v->pal[ 0 ] ]; - c[1] = c[2] = c[3] = Machine->pens[ v->pal[ 1 ] ]; + c[0] = Machine->pens[ pal[ 0 ] ]; + c[1] = c[2] = c[3] = Machine->pens[ pal[ 1 ] ]; + for ( i = 0; i < 4; i++, ramb >>= 2 ) + dst[ 7 - i ] = c[ ramb & 3 ]; + for ( i = 0; i < 4; i++, rama >>= 2 ) + dst[ 3 - i ] = c[ rama & 3 ]; +} +END_UPDATE + +/* as above, but TO9 flavor */ +UPDATE_HI( mode80_to9 ) +{ + int i; + pen_t c[2]; + c[0] = Machine->pens[ pal[ 0 ] ]; + c[1] = Machine->pens[ pal[ 6 ] ]; + for ( i = 0; i < 8; i++, ramb >>= 1 ) + dst[ 15 - i ] = c[ ramb & 1 ]; + for ( i = 0; i < 8; i++, rama >>= 1 ) + dst[ 7 - i ] = c[ rama & 1 ]; +} +END_UPDATE +UPDATE_LOW( mode80_to9 ) +{ + /* merge pixels */ + int i; + pen_t c[4]; + c[0] = Machine->pens[ pal[ 0 ] ]; + c[1] = c[2] = c[3] = Machine->pens[ pal[ 6 ] ]; for ( i = 0; i < 4; i++, ramb >>= 2 ) dst[ 7 - i ] = c[ ramb & 3 ]; for ( i = 0; i < 4; i++, rama >>= 2 ) @@ -530,8 +505,8 @@ UPDATE_HI( page1 ) { int i; pen_t c[2]; - c[0] = Machine->pens[ v->pal[ 0 ] ]; - c[1] = Machine->pens[ v->pal[ 1 ] ]; + c[0] = Machine->pens[ pal[ 0 ] ]; + c[1] = Machine->pens[ pal[ 1 ] ]; for ( i = 0; i < 16; i += 2, rama >>= 1 ) dst[ 15 - i ] = dst[ 14 - i ] = c[ rama & 1 ]; (void)ramb; @@ -541,8 +516,8 @@ UPDATE_LOW( page1 ) { int i; pen_t c[2]; - c[0] = Machine->pens[ v->pal[ 0 ] ]; - c[1] = Machine->pens[ v->pal[ 1 ] ]; + c[0] = Machine->pens[ pal[ 0 ] ]; + c[1] = Machine->pens[ pal[ 1 ] ]; for ( i = 0; i < 8; i++, rama >>= 1 ) dst[ 7 - i ] = c[ rama & 1 ]; (void)ramb; @@ -553,8 +528,8 @@ UPDATE_HI( page2 ) { int i; pen_t c[2]; - c[0] = Machine->pens[ v->pal[ 0 ] ]; - c[1] = Machine->pens[ v->pal[ 2 ] ]; + c[0] = Machine->pens[ pal[ 0 ] ]; + c[1] = Machine->pens[ pal[ 2 ] ]; for ( i = 0; i < 16; i += 2, ramb >>= 1 ) dst[ 15 - i ] = dst[ 14 - i ] = c[ ramb & 1 ]; (void)rama; @@ -564,8 +539,8 @@ UPDATE_LOW( page2 ) { int i; pen_t c[2]; - c[0] = Machine->pens[ v->pal[ 0 ] ]; - c[1] = Machine->pens[ v->pal[ 2 ] ]; + c[0] = Machine->pens[ pal[ 0 ] ]; + c[1] = Machine->pens[ pal[ 2 ] ]; for ( i = 0; i < 8; i++, ramb >>= 1 ) dst[ 7 - i ] = c[ ramb & 1 ]; (void)rama; @@ -577,9 +552,9 @@ UPDATE_HI( overlay ) { int i; pen_t c[2][2]; - c[0][0] = Machine->pens[ v->pal[ 0 ] ]; - c[0][1] = c[1][1] = Machine->pens[ v->pal[ 1 ] ]; - c[1][0] = Machine->pens[ v->pal[ 2 ] ]; + c[0][0] = Machine->pens[ pal[ 0 ] ]; + c[0][1] = c[1][1] = Machine->pens[ pal[ 1 ] ]; + c[1][0] = Machine->pens[ pal[ 2 ] ]; for ( i = 0; i < 16; i += 2, rama >>= 1, ramb >>= 1 ) dst[ 15 - i ] = dst[ 14 - i ] = c[ ramb & 1 ] [ rama & 1 ]; } @@ -588,9 +563,9 @@ UPDATE_LOW( overlay ) { int i; pen_t c[2][2]; - c[0][0] = Machine->pens[ v->pal[ 0 ] ]; - c[0][1] = c[1][1] = Machine->pens[ v->pal[ 1 ] ]; - c[1][0] = Machine->pens[ v->pal[ 2 ] ]; + c[0][0] = Machine->pens[ pal[ 0 ] ]; + c[0][1] = c[1][1] = Machine->pens[ pal[ 1 ] ]; + c[1][0] = Machine->pens[ pal[ 2 ] ]; for ( i = 0; i < 8; i++, rama >>= 1, ramb >>= 1 ) dst[ 7 - i ] = c[ ramb & 1 ] [ rama & 1 ]; } @@ -605,7 +580,7 @@ UPDATE_HI( overlay3 ) int i; for ( i = 0; i < 16; i += 4, rama >>= 1, ramb >>= 1 ) dst[ 15 - i ] = dst[ 14 - i ] = dst[ 13 - i ] = dst[ 12 - i ] = - Machine->pens[ v->pal[ p[ ramb & 1 ] [ (ramb >> 4) & 1 ] + Machine->pens[ pal[ p[ ramb & 1 ] [ (ramb >> 4) & 1 ] [ rama & 1 ] [ (rama >> 4) & 1 ] ] ]; } END_UPDATE @@ -617,28 +592,76 @@ UPDATE_LOW( overlay3 ) int i; for ( i = 0; i < 8; i += 2, rama >>= 1, ramb >>= 1 ) dst[ 7 - i ] = dst[ 6 - i ] = - Machine->pens[ v->pal[ p[ ramb & 1 ] [ (ramb >> 4) & 1 ] + Machine->pens[ pal[ p[ ramb & 1 ] [ (ramb >> 4) & 1 ] [ rama & 1 ] [ (rama >> 4) & 1 ] ] ]; } END_UPDATE -#define FUN(x) { x##_vcache_update_8, x##_vcache_update_16 } +#define FUN(x) { x##_scandraw_8, x##_scandraw_16 } -const thom_vcache_update thom_vcache_funcs[THOM_VMODE_NB][2] = { +const thom_scandraw thom_scandraw_funcs[THOM_VMODE_NB][2] = { FUN(to770), FUN(mo5), FUN(bitmap4), FUN(bitmap4alt), FUN(mode80), FUN(bitmap16), FUN(page1), FUN(page2), FUN(overlay), FUN(overlay3), - FUN(to9) + FUN(to9), FUN(mode80_to9), }; +/* called at the start of each scanline in the active area, just after + left border (-1<=y<199), and also after the last scanline (y=199) +*/ +void thom_scanline_start( int y ) +{ + /* update active-area */ + if ( y >= 0 && + (thom_vstate_dirty || thom_vstate_last_dirty || thom_vmem_dirty[y]) ) { + int x = 0; + while ( x < 40 ) { + int xx = x; + unsigned mode = thom_vmodepage[x] >> 8; + unsigned page = thom_vmodepage[x] & 0xff; + assert( mode < THOM_VMODE_NB ); + assert( page < 4 ); + do { xx++; } while ( xx < 40 && thom_vmodepage[xx] == -1 ); + thom_scandraw_funcs[ mode ][ thom_hires ] + ( thom_vram + y * 40 + page * 0x4000, + thom_vbody + y * 320 * (thom_hires+1), thom_last_pal, x, xx-x ); + x = xx; + } + thom_vmem_dirty[y] = 0; + } + + /* prepare for next scanline */ + if ( y == 199 ) timer_adjust( thom_scanline_timer, TIME_NEVER, 0, 0); + else { + + if ( thom_vmodepage_changed ) { + int x, m = 0; + for ( x = 0; x <= 40; x++ ) + if ( thom_vmodepage[x] !=-1 ) { + m = thom_vmodepage[x]; + thom_vmodepage[x] = -1; + } + thom_vmodepage[0] = m; + thom_vmodepage_changed = 0; + } + + if ( thom_pal_changed ) { + memcpy( thom_last_pal, thom_pal, 32 ); + thom_pal_changed = 0; + } + + timer_adjust( thom_scanline_timer, TIME_IN_USEC(64), y + 1, 0); + } +} + /* -------------- misc --------------- */ static UINT32 thom_mode_point; -static UINT8 thom_led; static UINT32 thom_floppy_wcount; static UINT32 thom_floppy_rcount; +#define FLOP_STATE (thom_floppy_wcount ? 2 : thom_floppy_rcount ? 1 : 0) void thom_set_mode_point ( int point ) { @@ -647,152 +670,79 @@ void thom_set_mode_point ( int point ) memory_set_bank( THOM_VRAM_BANK, ! point ); } -void thom_set_caps_led ( int led ) -{ - thom_led = led; -} - -void thom_floppy_icon ( int write ) +void thom_floppy_active ( int write ) { - /* stays up for a few frames*/ + int fold = FLOP_STATE, fnew; + /* stays up for a few frames */ if ( write ) thom_floppy_wcount = 25; else thom_floppy_rcount = 25; + /* update icon */ + fnew = FLOP_STATE; + if ( fold != fnew ) output_set_value( "floppy", fnew ); } -typedef enum { OSD_NORMAL, OSD_ON, OSD_OFF } osd_mode; /* -------------- main update function --------------- */ -/* relevant scan-line state from the last frame update */ -static struct thom_view { - pen_t border; - UINT8 page; -} * thom_view; -/* no need to save this in snapshots */ - -static mame_bitmap* thom_screen; -/* no need to save this in snapshots */ - - VIDEO_UPDATE ( thom ) { - const int f = thom_hires ? 2 : 1; - rectangle rect_left = { 0, thom_bwidth * f - 1, 0, 0 }; - rectangle rect_right = - { (thom_bwidth+320) * f, (thom_bwidth*2+320)*f - 1, 0, 0 }; - rectangle rect_full = { 0, (thom_bwidth*2+320)*f - 1, 0, 0 }; - int c=0, y=0, l=0, ypos=0; - int bupdate = 0, wupdate = 0, gupdate = 0; /* profile */ - - /* we assume update is called only at the end of a frame (not necessarily at - the end of each frame) - */ - assert( cliprect->max_y == ( thom_bheight*2 + 200 ) * (thom_hires+1) - 1 ); - - /* append a sentinel */ - thom_vbuf[thom_vbuf_last+1].line = 999; - - /* update upper border */ - y += THOM_BORDER_HEIGHT - thom_bheight; - while ( 1 ) { - pen_t border = Machine->pens[ thom_vbuf[c].s.pal[ thom_vbuf[c].s.border ] ]; - for (; y < thom_vbuf[c+1].line; y++, ypos += f ) { - if ( y == THOM_BORDER_HEIGHT ) goto end_up; - if ( border != thom_view[y].border ) { - /* update border */ - thom_view[y].border = border; - rect_full.min_y = ypos; - rect_full.max_y = ypos + thom_hires; - fillbitmap( thom_screen, border, &rect_full ); - bupdate++; - } - } - c++; + int y, ypos; + const int scale = thom_hires ? 2 : 1; + const int xbleft = thom_bwidth * scale; + const int xbright = ( thom_bwidth + THOM_ACTIVE_WIDTH ) * scale; + const int xright = ( thom_bwidth * 2 + THOM_ACTIVE_WIDTH ) * scale; + const int xwidth = THOM_ACTIVE_WIDTH * scale; + const int yup = THOM_BORDER_HEIGHT + THOM_ACTIVE_HEIGHT; + const int ybot = THOM_BORDER_HEIGHT + thom_bheight + 200; + UINT16* v = thom_vbody; + pen_t border = Machine->pens[ 0 ]; + rectangle wrect = { 0, xright - 1, 0, 0 }; + rectangle lrect = { 0, xbleft - 1, 0, 0 }; + rectangle rrect = { xbright, xright - 1, 0, 0 }; + + LOG (( "%f thom: video update called\n", timer_get_time() )); + + /* upper border */ + for ( y = 0; y < THOM_BORDER_HEIGHT - thom_bheight; y++ ) + if ( thom_border[ y ] != -1 ) border = Machine->pens[ thom_border[ y ] ]; + ypos = 0; + while ( y < THOM_BORDER_HEIGHT ) { + if ( thom_border[ y ] != -1 ) border = Machine->pens[ thom_border[ y ] ]; + wrect.min_y = ypos; + do { y++; ypos += scale; } + while ( y < THOM_BORDER_HEIGHT && thom_border[ y ] == -1 ); + wrect.max_y = ypos - 1; + fillbitmap( bitmap, border, &wrect ); } - end_up: - - /* update active area */ - while ( 1 ) { - pen_t border = Machine->pens[ thom_vbuf[c].s.pal[ thom_vbuf[c].s.border ] ]; - unsigned mode = thom_vbuf[c].s.mode; - unsigned page = thom_vbuf[0].s.page; - struct thom_vcache* v = thom_vcache + page * THOM_ACTIVE_HEIGHT + l; - unsigned inherits = 0; - - for (; y < thom_vbuf[c+1].line; y++, l++, v++, ypos += f ) { - - if ( y == THOM_BORDER_HEIGHT + 200 ) goto end_active; - - if ( border != thom_view[y].border ) { - /* update border */ - thom_view[y].border = border; - rect_left .min_y = rect_right.min_y = ypos; - rect_left .max_y = rect_right.max_y = ypos + thom_hires; - fillbitmap( thom_screen, border, &rect_left ); - fillbitmap( thom_screen, border, &rect_right ); - bupdate++; - } - if ( ( inherits && v->inherits ) || - ( !memcmp( v->pal, thom_vbuf[c].s.pal, 32 ) && - mode == v->mode && - page == thom_view[y].page ) ) { - /* same palette / mode / page */ - v->inherits = inherits; - inherits = 1; - } - else { - /* palette / mode / page modified => full scan-line update */ - memcpy( v->pal, thom_vbuf[c].s.pal, 32 ); - v->mode = mode; - thom_view[y].page = page; - v->inherits = 0; - inherits = 0; - v->dirty_min = 0; - v->dirty_max = THOM_GPL_PER_LINE - 1; - wupdate++; - } - if ( v->dirty_min <= v->dirty_max ) { - /* scan-line update */ - gupdate += v->dirty_max - v->dirty_min + 1; - thom_vcache_funcs[mode][thom_hires] ( v ); - draw_scanline16( thom_screen, - (thom_bwidth + v->dirty_min * 8) * f, ypos, - (v->dirty_max - v->dirty_min + 1) * 8 * f, - v->cache + v->dirty_min * 8 *f, NULL, -1 ); - if ( thom_hires ) - draw_scanline16( thom_screen, - (thom_bwidth + v->dirty_min * 8) * f, ypos + 1, - (v->dirty_max - v->dirty_min + 1) * 8 * f, - v->cache + v->dirty_min * 8 *f, NULL, -1 ); - v->dirty_min = THOM_GPL_PER_LINE; - v->dirty_max = 0; + /* left and right borders */ + while ( y < yup ) { + if ( thom_border[ y ] != -1 ) border = Machine->pens[ thom_border[ y ] ]; + lrect.min_y = rrect.min_y = ypos; + do { y++; ypos += scale; } + while ( y < yup && thom_border[ y ] == -1 ); + lrect.max_y = rrect.max_y = ypos - 1; + fillbitmap( bitmap, border, &lrect ); + fillbitmap( bitmap, border, &rrect ); } - } - c++; - } - end_active: - - /* update lower border */ - while ( 1 ) { - pen_t border = Machine->pens[ thom_vbuf[c].s.pal[ thom_vbuf[c].s.border ] ]; - for (; y < thom_vbuf[c+1].line; y++, ypos += f ) { - if ( y == THOM_BORDER_HEIGHT + thom_bheight + 200 ) goto end_down; - if ( border != thom_view[y].border ) { - /* update border */ - thom_view[y].border = border; - rect_full.min_y = ypos; - rect_full.max_y = ypos + thom_hires; - fillbitmap( thom_screen, border, &rect_full ); - bupdate++; - } - } - c++; + + /* lower border */ + while (y < ybot ) { + if ( thom_border[ y ] != -1 ) border = Machine->pens[ thom_border[ y ] ]; + wrect.min_y = ypos; + do { y++; ypos += scale; } + while ( y < ybot && thom_border[ y ] == -1 ); + wrect.max_y = ypos - 1; + fillbitmap( bitmap, border, &wrect ); } - end_down: - /* final copy */ - copybitmap( bitmap, thom_screen, 0, 0, 0, 0, NULL, TRANSPARENCY_NONE, 0 ); + /* body */ + ypos = thom_bheight * scale; + for ( y = 0; y < 200; v += xwidth, y++ , ypos += scale ) { + draw_scanline16( bitmap, xbleft, ypos, xwidth, v, NULL, -1 ); + if ( thom_hires ) + draw_scanline16( bitmap, xbleft, ypos+1, xwidth, v, NULL, -1 ); + } /* config */ if ( readinputport( THOM_INPUT_CONFIG ) & 1 ) @@ -806,9 +756,6 @@ VIDEO_UPDATE ( thom ) cliprect, 0 ); } - LOG(( "thom_video_update: %i borders, %i whole lines, %i gpls\n", - bupdate, wupdate, gupdate )); - return 0; } @@ -838,25 +785,29 @@ static void thom_set_init ( int init ) /* call this at the very begining of each new frame */ VIDEO_EOF ( thom ) { + int fnew, fold = FLOP_STATE; + int i; + UINT16 b = 12; struct thom_vsignal l = thom_get_lightpen_vsignal( 0, -1, 0 ); - LOG (( "%f thom: video eof called, %i state change(s)\n", - timer_get_time(), thom_vbuf_last )); + LOG (( "%f thom: video eof called\n", timer_get_time() )); /* floppy indicator count */ if ( thom_floppy_wcount ) thom_floppy_wcount--; if ( thom_floppy_rcount ) thom_floppy_rcount--; - - /* reset video frame time */ - mame_timer_adjust( thom_video_timer, time_zero, 0, time_never ); - - /* reset video state change buffer */ - if ( thom_vbuf_last ) { - memcpy( & thom_vbuf[0].s, - & thom_vbuf[thom_vbuf_last].s, - sizeof( struct thom_vstate ) ); - thom_vbuf_last = 0; + fnew = FLOP_STATE; + if ( fnew != fold ) output_set_value( "floppy", fnew ); + + /* prepare state for next frame */ + for ( i = 0; i <= THOM_TOTAL_HEIGHT; i++ ) + if ( thom_border[ i ] != -1 ) { + b = thom_border[ i ]; + thom_border[ i ] = -1; } + thom_border[ 0 ] = b; + thom_vstate_last_dirty = thom_vstate_dirty; + thom_vstate_dirty = 0; + /* schedule first init signal */ timer_adjust( thom_init_timer, TIME_IN_USEC( 64 * THOM_BORDER_HEIGHT + 7 ), @@ -868,70 +819,75 @@ VIDEO_EOF ( thom ) TIME_IN_USEC( 64 * ( THOM_BORDER_HEIGHT + l.line - 2 ) + 16 ), 0, 0 ); + /* schedule first active-area scanline call-back */ + timer_adjust( thom_scanline_timer, TIME_IN_USEC( 64 * THOM_BORDER_HEIGHT + 7), + -1, 0 ); + + /* reset video frame time */ + mame_timer_adjust( thom_video_timer, time_zero, 0, time_never ); + /* update screen size according to user options */ if ( thom_update_screen_size() ) - /* need to invalidate cache */ - thom_video_postload (); + thom_vstate_dirty = 1; } - - /* -------------- initialization --------------- */ +static const UINT16 thom_pal_init[16] = { + 0x1000, /* 0: black */ 0x000f, /* 1: red */ + 0x00f0, /* 2: geen */ 0x00ff, /* 3: yellow */ + 0x0f00, /* 4: blue */ 0x0f0f, /* 5: purple */ + 0x0ff0, /* 6: cyan */ 0x0fff, /* 7: white */ + 0x0777, /* 8: gray */ 0x033a, /* 9: pink */ + 0x03a3, /* a: light green */ 0x03aa, /* b: light yellow */ + 0x0a33, /* c: light blue */ 0x0a3a, /* d: redish pink */ + 0x0ee7, /* e: light cyan */ 0x007b, /* f: orange */ +}; + VIDEO_START ( thom ) { - unsigned i, j; - LOG (( "thom: video start called\n" )); - thom_screen = - auto_bitmap_alloc( THOM_TOTAL_WIDTH * 2, THOM_TOTAL_HEIGHT * 2 ); - - thom_vcache = auto_malloc( sizeof( struct thom_vcache ) * - THOM_ACTIVE_HEIGHT * THOM_NB_PAGES ); - - for ( j = 0; j < THOM_NB_PAGES; j++ ) - for ( i = 0; i < THOM_ACTIVE_HEIGHT; i++) - thom_vcache[i + j * THOM_ACTIVE_HEIGHT].vram = - thom_vram + i * 40 + j * 0x4000; - - thom_view = auto_malloc( sizeof( struct thom_view ) * THOM_TOTAL_HEIGHT ); - memset( thom_view, 0, sizeof( struct thom_view ) * THOM_TOTAL_HEIGHT ); - - thom_vbuf = auto_malloc( sizeof( struct thom_vbuf ) * THOM_VBUF_SIZE ); - memset( thom_vbuf, 0, sizeof( struct thom_vbuf ) * THOM_VBUF_SIZE ); - - thom_vbuf_last = 0; - thom_vbuf[0].line = 0; - memcpy( & thom_vbuf[0].s, & thom_vstate_init, sizeof( struct thom_vstate ) ); - - state_save_register_global( thom_vbuf_last ); - for ( i = 0; i < THOM_VBUF_SIZE; i++ ) { - state_save_register_item_array( "globals", i, thom_vbuf[i].s.pal ); - state_save_register_item( "globals", i, thom_vbuf[i].s.border ); - state_save_register_item( "globals", i, thom_vbuf[i].s.mode ); - state_save_register_item( "globals", i, thom_vbuf[i].s.page ); - state_save_register_item( "globals", i, thom_vbuf[i].line ); - } + /* scan-line state */ + memcpy( thom_last_pal, thom_pal_init, 32 ); + memcpy( thom_pal, thom_pal_init, 32 ); + memset( thom_border, 0, sizeof( thom_border ) ); + memset( thom_vbody, 0, sizeof( thom_vbody ) ); + memset( thom_vmodepage, 0, sizeof( thom_vmodepage ) ); + memset( thom_vmem_dirty, 0, sizeof( thom_vmem_dirty ) ); + thom_vmode = 0; + thom_vpage = 0; + thom_border_index = 0; + thom_vstate_dirty = 1; + thom_vstate_last_dirty = 1; + state_save_register_global_array( thom_last_pal ); + state_save_register_global_array( thom_pal ); + state_save_register_global_array( thom_border ); + state_save_register_global_array( thom_vbody ); + state_save_register_global_array( thom_vmodepage ); + state_save_register_global_array( thom_vmem_dirty ); + state_save_register_global( thom_pal_changed ); + state_save_register_global( thom_vmodepage_changed ); + state_save_register_global( thom_vmode ); + state_save_register_global( thom_vpage ); + state_save_register_global( thom_border_index ); + state_save_register_global( thom_vstate_dirty ); + state_save_register_global( thom_vstate_last_dirty ); thom_mode_point = 0; state_save_register_global( thom_mode_point ); memory_set_bank( THOM_VRAM_BANK, 0 ); - thom_led = -1; - state_save_register_global( thom_led ); - thom_floppy_rcount = 0; thom_floppy_wcount = 0; state_save_register_global( thom_floppy_wcount ); state_save_register_global( thom_floppy_rcount ); - state_save_register_func_postload( thom_video_postload ); - thom_video_postload (); - thom_video_timer = mame_timer_alloc( NULL ); + thom_scanline_timer = mame_timer_alloc( thom_scanline_start ); + thom_lightpen_nb = 0; thom_lightpen_cb = NULL; thom_lightpen_timer = mame_timer_alloc( thom_lightpen_step ); @@ -939,7 +895,7 @@ VIDEO_START ( thom ) thom_init_cb = NULL; thom_init_timer = mame_timer_alloc( thom_set_init ); - video_eof_thom(); + video_eof_thom(machine); state_save_register_global( thom_bwidth ); state_save_register_global( thom_bheight ); @@ -948,22 +904,6 @@ VIDEO_START ( thom ) return 0; } -/* wipe-up video cache (not video memory nor state buffer) */ -void thom_video_postload ( void ) -{ - int i, j; - fillbitmap( thom_screen, Machine->pens[0], NULL ); - - for ( i = 0; i < THOM_TOTAL_HEIGHT; i++ ) { - thom_view[i].border = Machine->pens[0]; - thom_view[i].page = -1; - } - - for ( j = 0; j < THOM_NB_PAGES; j++ ) - for ( i = 0; i < THOM_ACTIVE_HEIGHT; i++) - thom_dirty_line( j, i ); -} - PALETTE_INIT ( thom ) { float gamma = 0.6; @@ -975,9 +915,8 @@ PALETTE_INIT ( thom ) UINT8 r = 255. * pow( (i & 15) / 15., gamma ); UINT8 g = 255. * pow( ((i>> 4) & 15) / 15., gamma ); UINT8 b = 255. * pow( ((i >> 8) & 15) / 15., gamma ); - UINT8 alpha = i & 0x1000 ? 0 : 255; - palette_set_color( i, r, g, b ); - (void)alpha; /* TODO: transparency */ + /* UINT8 alpha = i & 0x1000 ? 0 : 255; TODO: transparency */ + palette_set_color(machine, i, r, g, b ); } } @@ -992,9 +931,8 @@ WRITE8_HANDLER ( to7_vram_w ) if ( thom_mode_point ) data |= 0xc0; if ( thom_vram[ offset + thom_mode_point ] == data ) return; thom_vram[ offset + thom_mode_point ] = data; - /* dirty visible change */ - if (offset >= 8000) return; - thom_dirty_gpl( 0, offset / 40, offset % 40 ); + /* dirty whole scanline */ + thom_vmem_dirty[ offset / 40 ] = 1; } /* bits 0-13 : latched gpl of lightpen position */ @@ -1024,9 +962,8 @@ WRITE8_HANDLER ( to770_vram_w ) assert( offset >= 0 && offset < 0x2000 ); if ( thom_vram[ offset + thom_mode_point ] == data ) return; thom_vram[ offset + thom_mode_point ] = data; - /* dirty visible change */ - if ( offset >= 8000 ) return; - thom_dirty_gpl( 0, offset / 40, offset % 40 ); + /* dirty whole scanline */ + thom_vmem_dirty[ offset / 40 ] = 1; } @@ -1039,9 +976,8 @@ WRITE8_HANDLER ( to8_sys_lo_w ) assert( offset >= 0 && offset < 0x2000 ); if ( *dst == data ) return; *dst = data; - /* dirty visible change */ - if ( offset >= 8000 ) return; - thom_dirty_gpl( 1, offset / 40, offset % 40 ); + /* dirty whole scanline */ + thom_vmem_dirty[ offset / 40 ] = 1; } WRITE8_HANDLER ( to8_sys_hi_w ) @@ -1050,9 +986,8 @@ WRITE8_HANDLER ( to8_sys_hi_w ) assert( offset >= 0 && offset < 0x2000 ); if ( *dst == data ) return; *dst = data; - /* dirty visible change */ - if ( offset >= 8000 ) return; - thom_dirty_gpl( 1, offset / 40, offset % 40 ); + /* dirty whole scanline */ + thom_vmem_dirty[ offset / 40 ] = 1; } /* write to video memory through data space */ @@ -1062,9 +997,9 @@ WRITE8_HANDLER ( to8_data_lo_w ) assert( offset >= 0 && offset < 0x2000 ); if ( *dst == data ) return; *dst = data; - /* dirty visible change */ - if ( to8_data_vpage >= 4 || offset >= 8000 ) return; - thom_dirty_gpl( to8_data_vpage, offset / 40, offset % 40 ); + /* dirty whole scanline */ + if ( to8_data_vpage >= 4 ) return; + thom_vmem_dirty[ offset / 40 ] = 1; } WRITE8_HANDLER ( to8_data_hi_w ) @@ -1073,9 +1008,9 @@ WRITE8_HANDLER ( to8_data_hi_w ) assert( offset >= 0 && offset < 0x2000 ); if ( *dst == data ) return; *dst = data; - /* dirty visible change */ - if ( to8_data_vpage >= 4 || offset >= 8000 ) return; - thom_dirty_gpl( to8_data_vpage, offset / 40, offset % 40 ); + /* dirty whole scanline */ + if ( to8_data_vpage >= 4 ) return; + thom_vmem_dirty[ offset / 40 ] = 1; } /* write to video memory page through cartridge addresses space */ @@ -1085,8 +1020,8 @@ WRITE8_HANDLER ( to8_vcart_w ) assert( offset>=0 && offset < 0x4000 ); if ( *dst == data ) return; *dst = data; - /* dirty visible change */ - offset &= 0x1fff; - if ( to8_cart_vpage >= 4 || offset >= 8000 ) return; - thom_dirty_gpl( to8_cart_vpage, offset / 40, offset % 40 ); + /* dirty whole scanline */ + if ( to8_cart_vpage >= 4 ) return; + thom_vmem_dirty[ (offset & 0x1fff) / 40 ] = 1; } + diff --git a/mess/vidhrdw/thomson.h b/mess/vidhrdw/thomson.h index 05b750ffd..b211ef1a3 100644 --- a/mess/vidhrdw/thomson.h +++ b/mess/vidhrdw/thomson.h @@ -18,15 +18,10 @@ 47 top border lines (~3 ms) + 200 active lines (12.8 ms) + 47 bottom border lines (~3 ms) - + vertical retrace + + vertical retrace (~1 ms) TO9 and up introduced a half (160 pixels) and double (640 pixels) horizontal mode, but still in 40 us (no change in refresh rate). - - One frame is 312 lines non-interlaced, but the SECAM format imposes - 625 lines with interlacing, which gives 312.5 lines non-interlaced. - In order for the CPU to "see" only 312 lines in 20 ms, the clock is - slowed down from 1 MHz to 0.9984 MHz. */ @@ -34,7 +29,7 @@ /***************************** dimensions **************************/ -/* original screen dimension (ùay be different from emulated screen!) */ +/* original screen dimension (may be different from emulated screen!) */ #define THOM_ACTIVE_WIDTH 320 #define THOM_BORDER_WIDTH 56 #define THOM_ACTIVE_HEIGHT 200 @@ -55,7 +50,7 @@ /* page 0 is banked */ #define THOM_VRAM_BANK 1 -UINT8* thom_vram; +extern UINT8* thom_vram; /*********************** video signals *****************************/ @@ -118,7 +113,8 @@ extern void thom_set_palette ( unsigned index, UINT16 color ); #define THOM_VMODE_OVERLAY 8 #define THOM_VMODE_OVERLAY3 9 #define THOM_VMODE_TO9 10 -#define THOM_VMODE_NB 11 +#define THOM_VMODE_80_TO9 11 +#define THOM_VMODE_NB 12 /* change the current video-mode */ extern void thom_set_video_mode ( unsigned mode ); @@ -126,17 +122,8 @@ extern void thom_set_video_mode ( unsigned mode ); /* select which video page shown among the 4 available */ extern void thom_set_video_page ( unsigned page ); - -/* TO7 TO7/70 caps-lock led integrated in the keyboard (2 = no led) */ -extern void thom_set_caps_led ( int led ); - -#define THOM_LED_ON 0 -#define THOM_LED_OFF 1 -#define THOM_NO_LED 2 /* no led (e.g., MO5) */ - - /* to tell there is some floppy activity, stays up for a few frames */ -extern void thom_floppy_icon ( int write ); +extern void thom_floppy_active ( int write ); /***************************** TO7 / T9000 *************************/ diff --git a/mess/vidhrdw/ti85.c b/mess/vidhrdw/ti85.c index 9b9bd952a..4ff756042 100644 --- a/mess/vidhrdw/ti85.c +++ b/mess/vidhrdw/ti85.c @@ -109,7 +109,7 @@ PALETTE_INIT( ti85 ) int i; for (i = 0; i < used; i++) - palette_set_color(i, ti85_palette[i][0], ti85_palette[i][1], ti85_palette[i][2]); + palette_set_color(machine, i, ti85_palette[i][0], ti85_palette[i][1], ti85_palette[i][2]); memcpy (colortable, ti85_colortable, sizeof (ti85_colortable)); if (!strncmp(Machine->gamedrv->name, "ti81", 4)) diff --git a/mess/vidhrdw/tms3556.c b/mess/vidhrdw/tms3556.c index 987ee36af..cfe5756e3 100644 --- a/mess/vidhrdw/tms3556.c +++ b/mess/vidhrdw/tms3556.c @@ -232,7 +232,7 @@ static PALETTE_INIT(tms3556) red = (i & 1) ? 255 : 0; /* red */ green = (i & 2) ? 255 : 0; /* green */ blue = (i & 4) ? 255 : 0; /* blue */ - palette_set_color(i, red, green, blue); + palette_set_color(machine, i, red, green, blue); } } diff --git a/mess/vidhrdw/vdc.c b/mess/vidhrdw/vdc.c index e480ad66f..2aaca6fba 100644 --- a/mess/vidhrdw/vdc.c +++ b/mess/vidhrdw/vdc.c @@ -287,7 +287,7 @@ WRITE8_HANDLER ( vce_w ) r = ((vdc.vce_data[i].w >> 3) & 7) << 5; g = ((vdc.vce_data[i].w >> 6) & 7) << 5; b = ((vdc.vce_data[i].w >> 0) & 7) << 5; - palette_set_color(i, r, g, b); + palette_set_color(Machine, i, r, g, b); } /* bump internal address */ diff --git a/mess/vidhrdw/vectrex.c b/mess/vidhrdw/vectrex.c index 59c23d12b..74c8ab59f 100644 --- a/mess/vidhrdw/vectrex.c +++ b/mess/vidhrdw/vectrex.c @@ -188,7 +188,7 @@ VIDEO_UPDATE( vectrex ) i = (i+1) % (sizeof(vectrex_points) / sizeof(vectrex_points[0])); } - video_update_vector(screen, bitmap, cliprect); + video_update_vector(machine, screen, bitmap, cliprect); vector_clear_list(); return 0; } @@ -277,12 +277,9 @@ VIDEO_START( vectrex ) timer_adjust(imager_timer, 1.0/imager_freq, 2, 1.0/imager_freq); - if (video_start_vector()) - return 1; - lp_t = mame_timer_alloc(lightpen_trigger); - return 0; + return video_start_vector(machine); } @@ -510,9 +507,6 @@ WRITE8_HANDLER( raaspec_led_w ) VIDEO_START( raaspec ) { - if (video_start_vector()) - return 1; - x_center=((Machine->screen[0].visarea.max_x -Machine->screen[0].visarea.min_x)/2) << VEC_SHIFT; y_center=((Machine->screen[0].visarea.max_y @@ -525,5 +519,5 @@ VIDEO_START( raaspec ) z_factor = 2; raaspec_led_w (0, 0xff); - return 0; + return video_start_vector(machine); } diff --git a/mess/vidhrdw/vic4567.c b/mess/vidhrdw/vic4567.c index d0984e6e5..1ef4deed2 100644 --- a/mess/vidhrdw/vic4567.c +++ b/mess/vidhrdw/vic4567.c @@ -743,7 +743,7 @@ INTERRUPT_GEN( vic3_raster_irq ) vic2.rasterline = 0; if (vic3.palette_dirty) { for (i=0; i<256; i++) { - palette_set_color(i,vic3.palette[i].red<<4, + palette_set_color(Machine, i,vic3.palette[i].red<<4, vic3.palette[i].green<<4, vic3.palette[i].blue<<4); } diff --git a/mess/vidhrdw/vic6560.c b/mess/vidhrdw/vic6560.c index 1ef74c038..757ffd564 100644 --- a/mess/vidhrdw/vic6560.c +++ b/mess/vidhrdw/vic6560.c @@ -154,7 +154,7 @@ void vic6561_init (int (*dma_read) (int), int (*dma_read_color) (int)) vic656x_init (); } -static void vic6560_video_stop(void) +static void vic6560_video_stop(running_machine *machine) { freegfx(pointerelement); } @@ -170,7 +170,7 @@ VIDEO_START( vic6560 ) pointercolortable[2] = Machine->pens[0]; pointerelement->total_colors = 3; vic6560_bitmap = auto_bitmap_alloc(Machine->screen[0].width, Machine->screen[0].height); - add_exit_callback(vic6560_video_stop); + add_exit_callback(machine, vic6560_video_stop); return 0; } diff --git a/mess/vidhrdw/vic6567.c b/mess/vidhrdw/vic6567.c index e12b1ac37..1df37e67c 100644 --- a/mess/vidhrdw/vic6567.c +++ b/mess/vidhrdw/vic6567.c @@ -1344,7 +1344,7 @@ VIDEO_UPDATE( vic2 ) static PALETTE_INIT( vic2 ) { - palette_set_colors(0, vic2_palette, sizeof(vic2_palette) / 3); + palette_set_colors(machine, 0, vic2_palette, sizeof(vic2_palette) / 3); } MACHINE_DRIVER_START( vh_vic2 ) diff --git a/mess/vidhrdw/z88.c b/mess/vidhrdw/z88.c index b9ee331a6..6f35bf19e 100644 --- a/mess/vidhrdw/z88.c +++ b/mess/vidhrdw/z88.c @@ -35,7 +35,7 @@ static unsigned char z88_palette[Z88_NUM_COLOURS * 3] = /* Initialise the palette */ PALETTE_INIT( z88 ) { - palette_set_colors(0, z88_palette, sizeof(z88_palette) / 3); + palette_set_colors(machine, 0, z88_palette, sizeof(z88_palette) / 3); memcpy(colortable, z88_colour_table, sizeof (z88_colour_table)); } diff --git a/mess/vidhrdw/zx.c b/mess/vidhrdw/zx.c index 99cb191ea..ca812c3d9 100644 --- a/mess/vidhrdw/zx.c +++ b/mess/vidhrdw/zx.c @@ -187,7 +187,7 @@ VIDEO_START( zx ) { ula_nmi = timer_alloc(zx_ula_nmi); ula_irq_active = 0; - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } VIDEO_EOF( zx ) diff --git a/mess/windows/configms.c b/mess/windows/configms.c index f0be74fc9..e37d50bf6 100644 --- a/mess/windows/configms.c +++ b/mess/windows/configms.c @@ -36,7 +36,7 @@ const options_entry mess_opts[] = { NULL, NULL, OPTION_HEADER, "MESS SPECIFIC OPTIONS" }, { "newui;nu", "1", OPTION_BOOLEAN, "use the new MESS UI" }, { "ramsize;ram", NULL, 0, "size of RAM (if supported by driver)" }, - { "threads;thr", NULL, 0, "number of threads to use for parallel operations" }, + { "threads;thr", "0", 0, "number of threads to use for parallel operations" }, { "natural;nat", "0", OPTION_BOOLEAN, "specifies whether to use a natural keyboard or not" }, { "min_width;mw", "200", 0, "specifies the minimum width for the display" }, { "min_height;mh", "200", 0, "specifies the minimum height for the display" }, @@ -262,18 +262,18 @@ void win_add_mess_device_options(const game_driver *gamedrv) -static void win_mess_exit(void) +static void win_mess_exit(running_machine *machine) { if (win_write_config) - write_config(NULL, Machine->gamedrv); + write_config(NULL, machine->gamedrv); } -void win_mess_config_init(void) +void win_mess_config_init(running_machine *machine) { config_register("device_directories", device_dirs_load, device_dirs_save); - add_exit_callback(win_mess_exit); + add_exit_callback(machine, win_mess_exit); } diff --git a/mess/windows/configms.h b/mess/windows/configms.h index f47cf1783..17b88a977 100644 --- a/mess/windows/configms.h +++ b/mess/windows/configms.h @@ -19,7 +19,7 @@ void set_devicedirectory(int dev, const char *dir); void win_add_mess_device_options(const game_driver *gamedrv); void win_mess_driver_name_callback(const char *arg); -void win_mess_config_init(void); +void win_mess_config_init(running_machine *machine); #endif /* CONFIGMS_H */ diff --git a/mess/windows/dialog.c b/mess/windows/dialog.c index 6716d4904..a1f08df5e 100644 --- a/mess/windows/dialog.c +++ b/mess/windows/dialog.c @@ -18,6 +18,7 @@ #include "pool.h" #include "winutils.h" #include "windows/input.h" +#include "windows/window.h" #ifdef UNDER_CE #include "invokegx.h" @@ -1549,18 +1550,12 @@ char *win_dialog_strdup(dialog_box *dialog, const char *s) static void before_display_dialog(void) { - extern void win_timer_enable(int enabled); - #ifdef UNDER_CE // on WinCE, suspend GAPI gx_suspend(); #endif - // disable sound while in the dialog - osd_sound_enable(0); - - // disable the timer while in the dialog - win_timer_enable(0); + winwindow_ui_pause_from_window_thread(TRUE); } @@ -1571,18 +1566,12 @@ static void before_display_dialog(void) static void after_display_dialog(void) { - extern void win_timer_enable(int enabled); - #ifdef UNDER_CE // on WinCE, resume GAPI gx_resume(); #endif - // reenable timer - win_timer_enable(1); - - // reenable sound - osd_sound_enable(1); + winwindow_ui_pause_from_window_thread(FALSE); } diff --git a/mess/windows/menu.c b/mess/windows/menu.c index 789f4f002..115098958 100644 --- a/mess/windows/menu.c +++ b/mess/windows/menu.c @@ -458,7 +458,8 @@ static void customize_analogcontrols(HWND wnd) //============================================================ static void state_dialog(HWND wnd, BOOL (WINAPI *fileproc)(LPOPENFILENAME), - DWORD fileproc_flags, void (*mameproc)(const char *)) + DWORD fileproc_flags, void (*mameproc)(running_machine *machine, const char *), + running_machine *machine) { #ifdef UNICODE WCHAR filenamew[MAX_PATH]; @@ -511,7 +512,7 @@ static void state_dialog(HWND wnd, BOOL (WINAPI *fileproc)(LPOPENFILENAME), "%S", filenamew); #endif - mameproc(state_filename); + mameproc(machine, state_filename); } if (dir) free(dir); @@ -519,19 +520,19 @@ static void state_dialog(HWND wnd, BOOL (WINAPI *fileproc)(LPOPENFILENAME), -void state_load(HWND wnd) +void state_load(HWND wnd, running_machine *machine) { - state_dialog(wnd, GetOpenFileName, OFN_FILEMUSTEXIST, mame_schedule_load); + state_dialog(wnd, GetOpenFileName, OFN_FILEMUSTEXIST, mame_schedule_load, machine); } -void state_save_as(HWND wnd) +void state_save_as(HWND wnd, running_machine *machine) { - state_dialog(wnd, GetSaveFileName, OFN_OVERWRITEPROMPT, mame_schedule_save); + state_dialog(wnd, GetSaveFileName, OFN_OVERWRITEPROMPT, mame_schedule_save, machine); } -void state_save(void) +void state_save(running_machine *machine) { - mame_schedule_save(state_filename); + mame_schedule_save(machine, state_filename); } @@ -939,9 +940,9 @@ static void paste(void) // pause //============================================================ -static void pause(void) +static void pause(running_machine *machine) { - mame_pause(!mame_is_paused()); + mame_pause(machine, !mame_is_paused(machine)); } @@ -1201,14 +1202,14 @@ static void prepare_menus(HWND wnd) set_command_state(menu_bar, ID_EDIT_PASTE, inputx_can_post() ? MFS_ENABLED : MFS_GRAYED); - set_command_state(menu_bar, ID_OPTIONS_PAUSE, mame_is_paused() ? MFS_CHECKED : MFS_ENABLED); - set_command_state(menu_bar, ID_OPTIONS_THROTTLE, is_throttled() ? MFS_CHECKED : MFS_ENABLED); + set_command_state(menu_bar, ID_OPTIONS_PAUSE, winwindow_ui_is_paused() ? MFS_CHECKED : MFS_ENABLED); + set_command_state(menu_bar, ID_OPTIONS_THROTTLE, is_throttled() ? MFS_CHECKED : MFS_ENABLED); set_command_state(menu_bar, ID_OPTIONS_CONFIGURATION, has_config ? MFS_ENABLED : MFS_GRAYED); set_command_state(menu_bar, ID_OPTIONS_DIPSWITCHES, has_dipswitch ? MFS_ENABLED : MFS_GRAYED); set_command_state(menu_bar, ID_OPTIONS_MISCINPUT, has_misc ? MFS_ENABLED : MFS_GRAYED); set_command_state(menu_bar, ID_OPTIONS_ANALOGCONTROLS, has_analog ? MFS_ENABLED : MFS_GRAYED); #if HAS_TOGGLEFULLSCREEN - set_command_state(menu_bar, ID_OPTIONS_FULLSCREEN, !is_windowed() ? MFS_CHECKED : MFS_ENABLED); + set_command_state(menu_bar, ID_OPTIONS_FULLSCREEN, !is_windowed() ? MFS_CHECKED : MFS_ENABLED); #endif // HAS_TOGGLEFULLSCREEN set_command_state(menu_bar, ID_OPTIONS_TOGGLEFPS, ui_get_show_fps() ? MFS_CHECKED : MFS_ENABLED); #if HAS_PROFILER @@ -1570,15 +1571,15 @@ static int invoke_command(HWND wnd, UINT command) switch(command) { case ID_FILE_LOADSTATE: - state_load(wnd); + state_load(wnd, Machine); break; case ID_FILE_SAVESTATE: - state_save(); + state_save(Machine); break; case ID_FILE_SAVESTATE_AS: - state_save_as(wnd); + state_save_as(wnd, Machine); break; case ID_FILE_SAVESCREENSHOT: @@ -1586,7 +1587,7 @@ static int invoke_command(HWND wnd, UINT command) break; case ID_FILE_EXIT: - mame_schedule_exit(); + mame_schedule_exit(Machine); break; case ID_EDIT_PASTE: @@ -1622,15 +1623,15 @@ static int invoke_command(HWND wnd, UINT command) break; case ID_OPTIONS_PAUSE: - pause(); + pause(Machine); break; case ID_OPTIONS_HARDRESET: - mame_schedule_hard_reset(); + mame_schedule_hard_reset(Machine); break; case ID_OPTIONS_SOFTRESET: - mame_schedule_soft_reset(); + mame_schedule_soft_reset(Machine); break; case ID_OPTIONS_THROTTLE: diff --git a/mess/windows/parallel.c b/mess/windows/parallel.c index 025017bc8..c01b80222 100644 --- a/mess/windows/parallel.c +++ b/mess/windows/parallel.c @@ -25,7 +25,7 @@ struct call_data void *param; }; -static void win_parallel_exit(void); +static void win_parallel_exit(running_machine *machine); //============================================================ // GLOBAL VARIABLES @@ -181,11 +181,11 @@ int win_parallel_init(void) set_thread_ideal_processor(GetCurrentThread(), 0); } - add_exit_callback(win_parallel_exit); + add_exit_callback(Machine, win_parallel_exit); return 0; error: - win_parallel_exit(); + win_parallel_exit(Machine); return -1; } @@ -193,7 +193,7 @@ int win_parallel_init(void) // win_parallel_exit //============================================================ -static void win_parallel_exit(void) +static void win_parallel_exit(running_machine *machine) { int i; HANDLE *threads = NULL; diff --git a/src/audit.c b/src/audit.c index 3f85b1a60..19e88cffc 100644 --- a/src/audit.c +++ b/src/audit.c @@ -395,7 +395,7 @@ int audit_verify_roms (int game, verify_printf_proc verify_printf) !audit_is_rom_used (clone_of, aud[i].exphash)) { uniqueRomsFound++; - if (aud[i].status != AUD_ROM_NOT_FOUND) + if (aud[i].status != AUD_ROM_NOT_FOUND && aud[i].status != AUD_DISK_NOT_FOUND) cloneRomsFound++; } diff --git a/src/cheat.c b/src/cheat.c index 62eb83ceb..475cae992 100644 --- a/src/cheat.c +++ b/src/cheat.c @@ -734,7 +734,7 @@ struct WatchInfo INT8 dataShift; UINT32 xor; - UINT16 x, y; + float x, y; CheatEntry * linkedCheat; @@ -862,7 +862,6 @@ typedef struct MenuItemInfoStruct MenuItemInfoStruct; /**** Exported Globals *******************************************************/ -int he_did_cheat = 0; const char * cheatfile = NULL; /**** Local Globals **********************************************************/ @@ -1124,7 +1123,7 @@ static const char * kWatchDisplayTypeStringList[] = /**** Function Prototypes ****************************************************/ static void cheat_periodic(int param); -static void cheat_exit(void); +static void cheat_exit(running_machine *machine); static int ShiftKeyPressed(void); static int ControlKeyPressed(void); @@ -1213,6 +1212,7 @@ static void HandleLocalCommandCheat(UINT32 type, UINT32 address, UINT32 data, U static void LoadCheatFile(char * fileName); static void LoadCheatDatabase(void); static void DisposeCheatDatabase(void); +static void ReloadCheatDatabase(void); static void SaveCheat(CheatEntry * entry); static void DoAutoSaveCheats(void); @@ -1343,7 +1343,7 @@ static int ReadKeyAsync(int flush) return '0' + (code - KEYCODE_0); } } - else if((code >= KEYCODE_0_PAD) && (code <= KEYCODE_0_PAD)) + else if((code >= KEYCODE_0_PAD) && (code <= KEYCODE_9_PAD)) { return '0' + (code - KEYCODE_0_PAD); } @@ -1682,6 +1682,12 @@ static UINT32 DoEditHexField(UINT32 data) { INT8 key; + if(code_pressed_memory(KEYCODE_BACKSPACE)) + { + data >>= 4; + return data; + } + key = ReadHexInput(); if(key != -1) @@ -1748,10 +1754,8 @@ static INT32 DoEditDecField(INT32 data, INT32 min, INT32 max) return data; } -void cheat_init(void) +void cheat_init(running_machine *machine) { - he_did_cheat = 0; - cheatList = NULL; cheatListLength = 0; @@ -1791,10 +1795,10 @@ void cheat_init(void) periodic_timer = timer_alloc(cheat_periodic); timer_adjust(periodic_timer, TIME_IN_HZ(Machine->screen[0].refresh), 0, TIME_IN_HZ(Machine->screen[0].refresh)); - add_exit_callback(cheat_exit); + add_exit_callback(machine, cheat_exit); } -static void cheat_exit(void) +static void cheat_exit(running_machine *machine) { int i; @@ -2002,6 +2006,9 @@ int cheat_menu(int selection) } } + if(input_ui_pressed(IPT_UI_RELOAD_CHEAT)) + ReloadCheatDatabase(); + if(input_ui_pressed(IPT_UI_CANCEL)) sel = -1; // if(input_ui_pressed(IPT_UI_CONFIGURE)) @@ -2298,26 +2305,33 @@ static INT32 UserSelectValueMenu(int selection, CheatEntry * entry) // get a key keyValue = ReadHexInput(); + if((keyValue != -1) && TEST_FIELD(action->type, UserSelectBCD) && ((keyValue < 0 ) || (keyValue > 9))) + keyValue = -1; + // if we got a key if(keyValue != -1) { // add it - if(TEST_FIELD(action->type, UserSelectBCD)) - { - if(value < 10) - { - value *= 10; - value &= 0xFF; - value += keyValue; - } - } - else + value <<= 4; + + switch(EXTRACT_FIELD(action->type, BytesUsed)) { - value <<= 4; - value &= 0xF0; - value |= keyValue & 0x0F; + case 0: // 8 bit + value &= 0xF0; + break; + case 1: // 16 bit + value &= 0xFFF0; + break; + case 2: // 24 bit + value &= 0xFFFFF0; + break; + case 3: // 32 bit + value &= 0xFFFFFFF0; + break; } + value |= keyValue & 0x0F; + delta = 0; forceUpdate = 1; } @@ -2462,6 +2476,7 @@ static int EnableDisableCheatMenu(int selection, int firstTime) if((traverse->flags & kCheatFlag_OneShot) && !traverse->selection) { traverse->selection = 1; + traverse->actionList[traverse->selection].flags |= kActionFlag_OperationDone; } if(traverse->selection && (traverse->selection < traverse->actionListLength)) @@ -2629,6 +2644,8 @@ static int EnableDisableCheatMenu(int selection, int firstTime) { if(entry->selection <= 0) entry->selection = entry->actionListLength - 1; + + entry->actionList[entry->selection].flags |= kActionFlag_OperationDone; } else { @@ -2689,6 +2706,7 @@ static int EnableDisableCheatMenu(int selection, int firstTime) if(entry->selection >= entry->actionListLength) entry->selection = 0; } + entry->actionList[entry->selection].flags |= kActionFlag_OperationDone; } else { @@ -2816,6 +2834,9 @@ static int EnableDisableCheatMenu(int selection, int firstTime) } } + if(input_ui_pressed(IPT_UI_RELOAD_CHEAT)) + ReloadCheatDatabase(); + /* Cancel pops us up a menu level */ if(input_ui_pressed(IPT_UI_CANCEL)) sel = -1; @@ -3421,7 +3442,10 @@ static int EditCheatMenu(CheatEntry * entry, int selection) { // do range minimum field - sprintf(extendDataBuf[i], "%.2X", (traverse->extendData >> 8) & 0xFF); + if(!EXTRACT_FIELD(traverse->type, BytesUsed)) + sprintf(extendDataBuf[i], "%.2X", (traverse->extendData >> 8) & 0xFF); + else + sprintf(extendDataBuf[i], "%.4X", (traverse->extendData >> 16) & 0xFFFF); menuItemInfo[total].subcheat = i; menuItemInfo[total].fieldType = kType_RangeMinimum; @@ -3434,12 +3458,20 @@ static int EditCheatMenu(CheatEntry * entry, int selection) { // do range maximum field - sprintf(extendDataBuf[i] + 3, "%.2X", (traverse->extendData >> 0) & 0xFF); + if(!EXTRACT_FIELD(traverse->type, BytesUsed)) + { + sprintf(extendDataBuf[i] + 3, "%.2X", (traverse->extendData >> 0) & 0xFF); + menuSubItem[total] = extendDataBuf[i] + 3; + } + else + { + sprintf(extendDataBuf[i] + 7, "%.4X", (traverse->extendData >> 0) & 0xFFFF); + menuSubItem[total] = extendDataBuf[i] + 7; + } menuItemInfo[total].subcheat = i; menuItemInfo[total].fieldType = kType_RangeMaximum; menuItem[total] = "Range Maximum"; - menuSubItem[total] = extendDataBuf[i] + 3; total++; } @@ -3523,20 +3555,21 @@ static int EditCheatMenu(CheatEntry * entry, int selection) total++; } + } - { - // do prefill field + if(userSelect || isSelect) + { + // do prefill field - menuItemInfo[total].subcheat = i; - menuItemInfo[total].fieldType = kType_Prefill; - menuItem[total] = "Prefill"; - menuSubItem[total] = kPrefillNames[EXTRACT_FIELD(traverse->type, Prefill)]; + menuItemInfo[total].subcheat = i; + menuItemInfo[total].fieldType = kType_Prefill; + menuItem[total] = "Prefill"; + menuSubItem[total] = kPrefillNames[EXTRACT_FIELD(traverse->type, Prefill)]; - total++; - } + total++; } - if(i > 0) + if(userSelect && i > 0) { // do copy previous value field @@ -3893,11 +3926,17 @@ static int EditCheatMenu(CheatEntry * entry, int selection) break; case kType_RangeMinimum: - action->extendData = (action->extendData & 0xFFFF00FF) | ((action->extendData - 0x00000100) & 0x0000FF00); + if(!EXTRACT_FIELD(action->type, BytesUsed)) + action->extendData = (action->extendData & 0xFFFF00FF) | ((action->extendData - 0x00000100) & 0x0000FF00); + else + action->extendData = (action->extendData & 0x0000FFFF) | ((action->extendData - 0x00010000) & 0xFFFF0000); break; case kType_RangeMaximum: - action->extendData = (action->extendData & 0xFFFFFF00) | ((action->extendData - 0x00000001) & 0x000000FF); + if(!EXTRACT_FIELD(action->type, BytesUsed)) + action->extendData = (action->extendData & 0xFFFFFF00) | ((action->extendData - 0x00000001) & 0x000000FF); + else + action->extendData = (action->extendData & 0xFFFF0000) | ((action->extendData - 0x00000001) & 0x0000FFFF); break; case kType_AddressIndex: @@ -3934,7 +3973,11 @@ static int EditCheatMenu(CheatEntry * entry, int selection) break; case kType_Prefill: - TOGGLE_MASK_FIELD(action->type, Prefill); + { + UINT32 prefill = (EXTRACT_FIELD(action->type, Prefill) - 1) & 3; + + SET_FIELD(action->type, Prefill, prefill); + } break; case kType_CopyPrevious: @@ -4171,11 +4214,17 @@ static int EditCheatMenu(CheatEntry * entry, int selection) break; case kType_RangeMinimum: - action->extendData = (action->extendData & 0xFFFF00FF) | ((action->extendData + 0x00000100) & 0x0000FF00); + if(!EXTRACT_FIELD(action->type, BytesUsed)) + action->extendData = (action->extendData & 0xFFFF00FF) | ((action->extendData + 0x00000100) & 0x0000FF00); + else + action->extendData = (action->extendData & 0x0000FFFF) | ((action->extendData + 0x00010000) & 0xFFFF0000); break; case kType_RangeMaximum: - action->extendData = (action->extendData & 0xFFFFFF00) | ((action->extendData + 0x00000001) & 0x000000FF); + if(!EXTRACT_FIELD(action->type, BytesUsed)) + action->extendData = (action->extendData & 0xFFFFFF00) | ((action->extendData + 0x00000001) & 0x000000FF); + else + action->extendData = (action->extendData & 0xFFFF0000) | ((action->extendData + 0x00000001) & 0x0000FFFF); break; case kType_AddressIndex: @@ -4212,7 +4261,11 @@ static int EditCheatMenu(CheatEntry * entry, int selection) break; case kType_Prefill: - TOGGLE_MASK_FIELD(action->type, Prefill); + { + UINT32 prefill = (EXTRACT_FIELD(action->type, Prefill) + 1) & 3; + + SET_FIELD(action->type, Prefill, prefill); + } break; case kType_CopyPrevious: @@ -4491,11 +4544,20 @@ static int EditCheatMenu(CheatEntry * entry, int selection) { UINT32 temp; - temp = (action->extendData >> 8) & 0xFF; + if(!TEST_FIELD(action->type, BytesUsed)) + { + temp = (action->extendData >> 8) & 0xFF; + temp = DoEditHexField(temp) & 0xFF; - temp = DoEditHexField(temp) & 0xFF; + action->extendData = (action->extendData & 0xFF) | ((temp << 8) & 0xFF00); + } + else + { + temp = (action->extendData >> 16) & 0xFFFF; + temp = DoEditHexField(temp) & 0xFFFF; - action->extendData = (action->extendData & 0x00FF) | ((temp << 8) & 0xFF00); + action->extendData = (action->extendData & 0x0000FFFF) | ((temp << 16) & 0xFFFF0000); + } } break; @@ -4503,11 +4565,20 @@ static int EditCheatMenu(CheatEntry * entry, int selection) { UINT32 temp; - temp = action->extendData & 0xFF; + if(!TEST_FIELD(action->type, BytesUsed)) + { + temp = action->extendData & 0xFF; + temp = DoEditHexField(temp) & 0xFF; - temp = DoEditHexField(temp) & 0xFF; + action->extendData = (action->extendData & 0xFF00) | (temp & 0x00FF); + } + else + { + temp = action->extendData & 0xFFFF; + temp = DoEditHexField(temp) & 0xFFFF; - action->extendData = (action->extendData & 0xFF00) | (temp & 0x00FF); + action->extendData = (action->extendData & 0xFFFF0000) | (temp & 0x0000FFFF); + } } break; @@ -4826,7 +4897,12 @@ static int DoSearchMenuClassic(int selection, int startNew) search->bytes = kSearchSize_8Bit; search->lhs = kSearchOperand_Current; search->rhs = kSearchOperand_Value; - search->comparison = kSearchComparison_NearTo; + + if(ShiftKeyPressed()) + search->comparison = kSearchComparison_EqualTo; + else + search->comparison = kSearchComparison_NearTo; + search->value = search->oldOptions.value; doSearch = 1; @@ -5472,6 +5548,9 @@ static int AddEditCheatMenu(int selection) } } + if(input_ui_pressed(IPT_UI_RELOAD_CHEAT)) + ReloadCheatDatabase(); + if(input_ui_pressed(IPT_UI_CANCEL)) sel = -1; // if(input_ui_pressed(IPT_UI_CONFIGURE)) @@ -6095,12 +6174,12 @@ static int EditWatch(WatchInfo * entry, int selection) menuSubItem[total] = kWatchDisplayTypeStringList[entry->displayType]; total++; - sprintf(buf[total], "%d", entry->x); + sprintf(buf[total], "%f", entry->x); menuItem[total] = "X"; menuSubItem[total] = buf[total]; total++; - sprintf(buf[total], "%d", entry->y); + sprintf(buf[total], "%f", entry->y); menuItem[total] = "Y"; menuSubItem[total] = buf[total]; total++; @@ -6221,11 +6300,11 @@ static int EditWatch(WatchInfo * entry, int selection) break; case kMenu_XPosition: - entry->x--; + entry->x -= 0.01; break; case kMenu_YPosition: - entry->y--; + entry->y -= 0.01; break; case kMenu_Skip: @@ -6316,11 +6395,11 @@ static int EditWatch(WatchInfo * entry, int selection) break; case kMenu_XPosition: - entry->x += increment; + entry->x += 0.01; break; case kMenu_YPosition: - entry->y += increment; + entry->y += 0.01; break; case kMenu_Skip: @@ -6982,10 +7061,7 @@ static int SelectOptions(int selection) break; case kMenu_ReloadCheatDatabase: - DisposeCheatDatabase(); - LoadCheatDatabase(); - - ui_popup_time(1, "cheat database reloaded"); + ReloadCheatDatabase(); break; case kMenu_SelectSearchRegions: @@ -8660,6 +8736,11 @@ static void DisposeCheatDatabase(void) { int i; + for(i = 0; i < cheatListLength; i++) + { + TempDeactivateCheat(&cheatList[i]); + } + if(cheatList) { for(i = 0; i < cheatListLength; i++) @@ -8674,6 +8755,14 @@ static void DisposeCheatDatabase(void) } } +static void ReloadCheatDatabase(void) +{ + DisposeCheatDatabase(); + LoadCheatDatabase(); + + ui_popup_time(1, "Cheat Database reloaded"); +} + static void SaveCheat(CheatEntry * entry) { mame_file * theFile; @@ -9614,12 +9703,16 @@ static UINT32 ReadData(CheatAction * action) UINT8 addressBytes = (parameter & 0x3) + 1; CPUInfo * info = GetCPUInfo(cpu); - address = DoCPURead(cpu, action->address, addressBytes, CPUNeedsSwap(parameter) ^ swapBytes); + address = DoCPURead(cpu, action->address, addressBytes, CPUNeedsSwap(cpu) ^ swapBytes); if(info) address = DoShift(address, info->addressShift); - address += offset; - return DoCPURead(cpu, address, bytes, CPUNeedsSwap(parameter) ^ swapBytes); + if(address) + { + address += offset; + + return DoCPURead(cpu, address, bytes, CPUNeedsSwap(cpu) ^ swapBytes); + } } break; @@ -9712,9 +9805,13 @@ static void WriteData(CheatAction * action, UINT32 data) address = DoCPURead(cpu, action->address, addressBytes, CPUNeedsSwap(cpu) ^ swapBytes); if(info) address = DoShift(address, info->addressShift); - address += offset; - DoCPUWrite(data, cpu, address, bytes, CPUNeedsSwap(cpu) ^ swapBytes); + if(address) + { + address += offset; + + DoCPUWrite(data, cpu, address, bytes, CPUNeedsSwap(cpu) ^ swapBytes); + } } break; @@ -9758,7 +9855,10 @@ static void WatchCheatEntry(CheatEntry * entry, UINT8 associate) for(i = 0; i < entry->actionListLength; i++) { - AddActionWatch(&entry->actionList[i], associateEntry); + + if(!i || (i && (entry->actionList[i].address != entry->actionList[i-1].address))) + AddActionWatch(&entry->actionList[i], associateEntry); + } } @@ -9777,7 +9877,6 @@ static void AddActionWatch(CheatAction * action, CheatEntry * entry) info->linkedCheat = entry; info->numElements = 1; info->skip = 0; - info->linkedCheat = entry; if(EXTRACT_FIELD(action->type, Type) == kType_Watch) { @@ -9793,8 +9892,8 @@ static void AddActionWatch(CheatAction * action, CheatEntry * entry) if(action->extendData != 0xFFFFFFFF) { - info->x += (action->extendData >> 16) & 0xFFFF; - info->y += (action->extendData >> 0) & 0xFFFF; + info->x = (float)((action->extendData >> 16) & 0xFFFF)/100; + info->y = (float)((action->extendData >> 0) & 0xFFFF)/100; } if( (typeParameter & 0x04) && @@ -9826,7 +9925,10 @@ static void RemoveAssociatedWatches(CheatEntry * entry) static void ResetAction(CheatAction * action) { action->frameTimer = 0; - action->lastValue = ReadData(action); + + if(!(action->flags & kActionFlag_LastValueGood)) + action->lastValue = ReadData(action); + action->flags &= ~kActionFlag_StateMask; action->flags |= kActionFlag_LastValueGood; } @@ -9846,8 +9948,6 @@ static void ActivateCheat(CheatEntry * entry) } entry->flags |= kCheatFlag_Active; - - he_did_cheat = 1; } static void DeactivateCheat(CheatEntry * entry) @@ -9959,12 +10059,25 @@ static void cheat_periodicOperation(CheatAction * action) temp = ReadData(action); - if( (temp < ((action->extendData >> 8) & 0xFF)) || - (temp > ((action->extendData >> 0) & 0xFF))) + if(!TEST_FIELD(action->type, BytesUsed)) { - temp = action->data; - - WriteData(action, temp); + // 8 bit + if( (temp < ((action->extendData >> 8) & 0xFF)) || + (temp > ((action->extendData >> 0) & 0xFF))) + { + temp = action->data; + WriteData(action, temp); + } + } + else + { + // 16 bit (or 24, 32 bit...) + if( (temp < ((action->extendData >> 16) & 0xFFFF)) || + (temp > ((action->extendData >> 0) & 0xFFFF))) + { + temp = action->data; + WriteData(action, temp); + } } } break; @@ -10075,7 +10188,8 @@ static void cheat_periodicAction(CheatAction * action) } else { - UINT8 currentValue = ReadData(action); + + UINT32 currentValue = ReadData(action); if(currentValue != action->lastValue) { @@ -10091,7 +10205,8 @@ static void cheat_periodicAction(CheatAction * action) case kType_IgnoreIfDecrementing: { - UINT8 currentValue = ReadData(action); + + UINT32 currentValue = ReadData(action); if(currentValue != (action->lastValue - parameter)) { @@ -10136,6 +10251,8 @@ static void cheat_periodicEntry(CheatEntry * entry) if(entry->selection >= entry->actionListLength) entry->selection = 0; + + ActivateCheat(entry); } } else diff --git a/src/cheat.h b/src/cheat.h index 64ccea6fc..f07de8074 100644 --- a/src/cheat.h +++ b/src/cheat.h @@ -14,9 +14,7 @@ #ifndef __CHEAT_H__ #define __CHEAT_H__ -extern int he_did_cheat; - -void cheat_init(void); +void cheat_init(running_machine *machine); int cheat_menu(int selection); diff --git a/src/config.c b/src/config.c index 620a19065..d5b4fda33 100644 --- a/src/config.c +++ b/src/config.c @@ -68,12 +68,12 @@ static int config_save_xml(mame_file *file, int type); * *************************************/ -void config_init(void) +void config_init(running_machine *machine) { typelist = NULL; #ifdef MESS - mess_config_init(); + mess_config_init(machine); #endif } diff --git a/src/config.h b/src/config.h index e17d84883..658233a21 100644 --- a/src/config.h +++ b/src/config.h @@ -50,7 +50,7 @@ typedef void (*config_callback)(int config_type, xml_data_node *parentnode); * *************************************/ -void config_init(void); +void config_init(running_machine *machine); void config_register(const char *nodename, config_callback load, config_callback save); int config_load_settings(void); void config_save_settings(void); diff --git a/src/core.mak b/src/core.mak index 69c878a94..c573aaabb 100644 --- a/src/core.mak +++ b/src/core.mak @@ -113,10 +113,7 @@ $(OBJ)/video.o: $(OBJ)/layout/snap.lh ifdef DEBUG COREOBJS += \ - $(OBJ)/profiler.o - -ifdef NEW_DEBUGGER -COREOBJS += \ + $(OBJ)/profiler.o \ $(OBJ)/debug/debugcmd.o \ $(OBJ)/debug/debugcmt.o \ $(OBJ)/debug/debugcon.o \ @@ -125,11 +122,6 @@ COREOBJS += \ $(OBJ)/debug/debugvw.o \ $(OBJ)/debug/express.o \ $(OBJ)/debug/textbuf.o -else -COREOBJS += \ - $(OBJ)/debug/mamedbg.o \ - $(OBJ)/debug/window.o -endif endif @@ -138,4 +130,4 @@ endif # set of tool targets #------------------------------------------------- -TOOLS += romcmp$(EXE) chdman$(EXE) jedutil$(EXE) +TOOLS += romcmp$(EXE) chdman$(EXE) jedutil$(EXE) file2str$(EXE) diff --git a/src/cpu/i386/i386.c b/src/cpu/i386/i386.c index 8c199cc4d..568af1158 100644 --- a/src/cpu/i386/i386.c +++ b/src/cpu/i386/i386.c @@ -14,7 +14,7 @@ #include "i386.h" #include "i386intf.h" -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG #include "debug/debugcpu.h" #endif @@ -407,7 +407,7 @@ static void I386OP(decode_two_byte)(void) /*************************************************************************/ -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG static UINT64 i386_debug_segbase(UINT32 ref, UINT32 params, UINT64 *param) { @@ -449,7 +449,7 @@ static void i386_debug_setup(void) symtable_add_function(global_symtable, "seglimit", 0, 1, 1, i386_debug_seglimit); } -#endif /* defined(MAME_DEBUG) && defined(NEW_DEBUGGER) */ +#endif /* defined(MAME_DEBUG) */ /*************************************************************************/ @@ -877,7 +877,7 @@ void i386_get_info(UINT32 state, union cpuinfo *info) case CPUINFO_PTR_REGISTER_LAYOUT: info->p = i386_reg_layout; break; case CPUINFO_PTR_WINDOW_LAYOUT: info->p = i386_win_layout; break; case CPUINFO_PTR_TRANSLATE: info->translate = translate_address_cb; break; -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG case CPUINFO_PTR_DEBUG_SETUP_COMMANDS: info->setup_commands = i386_debug_setup; break; #endif diff --git a/src/cpu/m6502/tn2a03.c b/src/cpu/m6502/tn2a03.c index e044593d5..b3fcafaf7 100644 --- a/src/cpu/m6502/tn2a03.c +++ b/src/cpu/m6502/tn2a03.c @@ -37,6 +37,37 @@ #undef OP #define OP(nn) INLINE void n2a03_##nn(void) +#define EA_ABX_P \ + EA_ABS; \ + if (EAL + X > 0xff) \ + m6502_ICount--; \ + EAW += X + +#define EA_ABY_P \ + EA_ABS; \ + if (EAL + Y > 0xff) \ + m6502_ICount--; \ + EAW += Y + +#define EA_IDY_NP \ + ZPL = RDOPARG(); \ + EAL = RDMEM(ZPD); \ + ZPL++; \ + EAH = RDMEM(ZPD); \ + EAW += Y + +#define RD_ABX_P EA_ABX_P; tmp = RDMEM(EAD) +#define RD_ABY_P EA_ABY_P; tmp = RDMEM(EAD) +#define RD_IDY_NP EA_IDY_NP; tmp = RDMEM_ID(EAD) +#define WR_IDY_NP EA_IDY_NP; WRMEM_ID(EAD, tmp) + + +#define TOP_P \ + EA_ABS; \ + if (EAL + X > 0xff) \ + m6502_ICount--; + + /***************************************************************************** ***************************************************************************** * @@ -75,7 +106,7 @@ OP(e1) { int tmp; m6502_ICount -= 6; RD_IDX; SBC_NES; } /* 6 SBC IDX */ #define n2a03_31 m6502_31 /* 5 AND IDY */ #define n2a03_51 m6502_51 /* 5 EOR IDY */ OP(71) { int tmp; m6502_ICount -= 5; RD_IDY; ADC_NES; } /* 5 ADC IDY */ -#define n2a03_91 m6502_91 /* 6 STA IDY */ +OP(91) { int tmp; m6502_ICount -= 6; STA; WR_IDY_NP; } /* 6 STA IDY no page penalty */ #define n2a03_b1 m6502_b1 /* 5 LDA IDY */ #define n2a03_d1 m6502_d1 /* 5 CMP IDY */ OP(f1) { int tmp; m6502_ICount -= 5; RD_IDY; SBC_NES; } /* 5 SBC IDY */ @@ -98,42 +129,42 @@ OP(b2) { m6502_ICount -= 2; KIL; } /* 2 KIL */ OP(d2) { m6502_ICount -= 2; KIL; } /* 2 KIL */ OP(f2) { m6502_ICount -= 2; KIL; } /* 2 KIL */ -OP(03) { int tmp; m6502_ICount -= 7; RD_IDX; SLO; WB_EA; } /* 7 SLO IDX */ -OP(23) { int tmp; m6502_ICount -= 7; RD_IDX; RLA; WB_EA; } /* 7 RLA IDX */ -OP(43) { int tmp; m6502_ICount -= 7; RD_IDX; SRE; WB_EA; } /* 7 SRE IDX */ -OP(63) { int tmp; m6502_ICount -= 7; RD_IDX; RRA; WB_EA; } /* 7 RRA IDX */ +OP(03) { int tmp; m6502_ICount -= 8; RD_IDX; SLO; WB_EA; } /* 8 SLO IDX */ +OP(23) { int tmp; m6502_ICount -= 8; RD_IDX; RLA; WB_EA; } /* 8 RLA IDX */ +OP(43) { int tmp; m6502_ICount -= 8; RD_IDX; SRE; WB_EA; } /* 8 SRE IDX */ +OP(63) { int tmp; m6502_ICount -= 8; RD_IDX; RRA; WB_EA; } /* 8 RRA IDX */ OP(83) { int tmp; m6502_ICount -= 6; SAX; WR_IDX; } /* 6 SAX IDX */ OP(a3) { int tmp; m6502_ICount -= 6; RD_IDX; LAX; } /* 6 LAX IDX */ -OP(c3) { int tmp; m6502_ICount -= 7; RD_IDX; DCP; WB_EA; } /* 7 DCP IDX */ -OP(e3) { int tmp; m6502_ICount -= 7; RD_IDX; ISB; WB_EA; } /* 7 ISB IDX */ - -OP(13) { int tmp; m6502_ICount -= 6; RD_IDY; SLO; WB_EA; } /* 6 SLO IDY */ -OP(33) { int tmp; m6502_ICount -= 6; RD_IDY; RLA; WB_EA; } /* 6 RLA IDY */ -OP(53) { int tmp; m6502_ICount -= 6; RD_IDY; SRE; WB_EA; } /* 6 SRE IDY */ -OP(73) { int tmp; m6502_ICount -= 6; RD_IDY; RRA; WB_EA; } /* 6 RRA IDY */ -OP(93) { int tmp; m6502_ICount -= 5; EA_IDY; SAH; WB_EA; } /* 5 SAH IDY */ +OP(c3) { int tmp; m6502_ICount -= 8; RD_IDX; DCP; WB_EA; } /* 8 DCP IDX */ +OP(e3) { int tmp; m6502_ICount -= 8; RD_IDX; ISB; WB_EA; } /* 8 ISB IDX */ + +OP(13) { int tmp; m6502_ICount -= 8; RD_IDY_NP; SLO; WB_EA; } /* 8 SLO IDY no page penalty */ +OP(33) { int tmp; m6502_ICount -= 8; RD_IDY_NP; RLA; WB_EA; } /* 8 RLA IDY no page penalty */ +OP(53) { int tmp; m6502_ICount -= 8; RD_IDY_NP; SRE; WB_EA; } /* 8 SRE IDY no page penalty */ +OP(73) { int tmp; m6502_ICount -= 8; RD_IDY_NP; RRA; WB_EA; } /* 8 RRA IDY no page penalty */ +OP(93) { int tmp; m6502_ICount -= 6; EA_IDY_NP; SAH; WB_EA; } /* 6 SAH IDY no page penalty */ OP(b3) { int tmp; m6502_ICount -= 5; RD_IDY; LAX; } /* 5 LAX IDY */ -OP(d3) { int tmp; m6502_ICount -= 6; RD_IDY; DCP; WB_EA; } /* 6 DCP IDY */ -OP(f3) { int tmp; m6502_ICount -= 6; RD_IDY; ISB; WB_EA; } /* 6 ISB IDY */ +OP(d3) { int tmp; m6502_ICount -= 8; RD_IDY_NP; DCP; WB_EA; } /* 8 DCP IDY no page penalty */ +OP(f3) { int tmp; m6502_ICount -= 8; RD_IDY_NP; ISB; WB_EA; } /* 8 ISB IDY no page penalty */ -OP(04) { m6502_ICount -= 2; DOP; } /* 2 DOP */ +OP(04) { m6502_ICount -= 3; DOP; } /* 2 DOP */ #define n2a03_24 m6502_24 /* 3 BIT ZPG */ -OP(44) { m6502_ICount -= 2; DOP; } /* 2 DOP */ -OP(64) { m6502_ICount -= 2; DOP; } /* 2 DOP */ +OP(44) { m6502_ICount -= 3; DOP; } /* 2 DOP */ +OP(64) { m6502_ICount -= 3; DOP; } /* 2 DOP */ #define n2a03_84 m6502_84 /* 3 STY ZPG */ #define n2a03_a4 m6502_a4 /* 3 LDY ZPG */ #define n2a03_c4 m6502_c4 /* 3 CPY ZPG */ #define n2a03_e4 m6502_e4 /* 3 CPX ZPG */ -OP(14) { m6502_ICount -= 2; DOP; } /* 2 DOP */ -OP(34) { m6502_ICount -= 2; DOP; } /* 2 DOP */ -OP(54) { m6502_ICount -= 2; DOP; } /* 2 DOP */ -OP(74) { m6502_ICount -= 2; DOP; } /* 2 DOP */ +OP(14) { m6502_ICount -= 4; DOP; } /* 2 DOP */ +OP(34) { m6502_ICount -= 4; DOP; } /* 2 DOP */ +OP(54) { m6502_ICount -= 4; DOP; } /* 2 DOP */ +OP(74) { m6502_ICount -= 4; DOP; } /* 2 DOP */ #define n2a03_94 m6502_94 /* 4 STY ZP_X */ #define n2a03_b4 m6502_b4 /* 4 LDY ZP_X */ -OP(d4) { m6502_ICount -= 2; DOP; } /* 2 DOP */ -OP(f4) { m6502_ICount -= 2; DOP; } /* 2 DOP */ +OP(d4) { m6502_ICount -= 4; DOP; } /* 2 DOP */ +OP(f4) { m6502_ICount -= 4; DOP; } /* 2 DOP */ #define n2a03_05 m6502_05 /* 3 ORA ZPG */ #define n2a03_25 m6502_25 /* 3 AND ZPG */ @@ -216,14 +247,14 @@ OP(89) { m6502_ICount -= 2; DOP; } /* 2 DOP */ #define n2a03_c9 m6502_c9 /* 2 CMP IMM */ OP(e9) { int tmp; m6502_ICount -= 2; RD_IMM; SBC_NES; } /* 2 SBC IMM */ -#define n2a03_19 m6502_19 /* 4 ORA ABY */ -#define n2a03_39 m6502_39 /* 4 AND ABY */ -#define n2a03_59 m6502_59 /* 4 EOR ABY */ -OP(79) { int tmp; m6502_ICount -= 4; RD_ABY; ADC_NES; } /* 4 ADC ABY */ +OP(19) { int tmp; m6502_ICount -= 4; RD_ABY_P; ORA; } /* 4 ORA ABY page penalty */ +OP(39) { int tmp; m6502_ICount -= 4; RD_ABY_P; AND; } /* 4 AND ABY page penalty */ +OP(59) { int tmp; m6502_ICount -= 4; RD_ABY_P; EOR; } /* 4 EOR ABY page penalty */ +OP(79) { int tmp; m6502_ICount -= 4; RD_ABY_P; ADC_NES; } /* 4 ADC ABY page penalty */ #define n2a03_99 m6502_99 /* 5 STA ABY */ -#define n2a03_b9 m6502_b9 /* 4 LDA ABY */ -#define n2a03_d9 m6502_d9 /* 4 CMP ABY */ -OP(f9) { int tmp; m6502_ICount -= 4; RD_ABY; SBC_NES; } /* 4 SBC ABY */ +OP(b9) { int tmp; m6502_ICount -= 4; RD_ABY_P; LDA; } /* 4 LDA ABY page penalty */ +OP(d9) { int tmp; m6502_ICount -= 4; RD_ABY_P; CMP; } /* 4 CMP ABY page penalty */ +OP(f9) { int tmp; m6502_ICount -= 4; RD_ABY_P; SBC_NES; } /* 4 SBC ABY page penalty */ #define n2a03_0a m6502_0a /* 2 ASL A */ #define n2a03_2a m6502_2a /* 2 ROL A */ @@ -252,16 +283,16 @@ OP(ab) { int tmp; m6502_ICount -= 2; RD_IMM; OAL; } /* 2 OAL IMM */ OP(cb) { int tmp; m6502_ICount -= 2; RD_IMM; ASX; } /* 2 ASX IMM */ OP(eb) { int tmp; m6502_ICount -= 2; RD_IMM; SBC_NES; } /* 2 SBC IMM */ -OP(1b) { int tmp; m6502_ICount -= 4; RD_ABY; SLO; WB_EA; } /* 4 SLO ABY */ -OP(3b) { int tmp; m6502_ICount -= 4; RD_ABY; RLA; WB_EA; } /* 4 RLA ABY */ -OP(5b) { int tmp; m6502_ICount -= 4; RD_ABY; SRE; WB_EA; } /* 4 SRE ABY */ -OP(7b) { int tmp; m6502_ICount -= 4; RD_ABY; RRA; WB_EA; } /* 4 RRA ABY */ +OP(1b) { int tmp; m6502_ICount -= 7; RD_ABY; SLO; WB_EA; } /* 4 SLO ABY */ +OP(3b) { int tmp; m6502_ICount -= 7; RD_ABY; RLA; WB_EA; } /* 4 RLA ABY */ +OP(5b) { int tmp; m6502_ICount -= 7; RD_ABY; SRE; WB_EA; } /* 4 SRE ABY */ +OP(7b) { int tmp; m6502_ICount -= 7; RD_ABY; RRA; WB_EA; } /* 4 RRA ABY */ OP(9b) { int tmp; m6502_ICount -= 5; EA_ABY; SSH; WB_EA; } /* 5 SSH ABY */ -OP(bb) { int tmp; m6502_ICount -= 4; RD_ABY; AST; } /* 4 AST ABY */ -OP(db) { int tmp; m6502_ICount -= 6; RD_ABY; DCP; WB_EA; } /* 6 DCP ABY */ -OP(fb) { int tmp; m6502_ICount -= 6; RD_ABY; ISB; WB_EA; } /* 6 ISB ABY */ +OP(bb) { int tmp; m6502_ICount -= 4; RD_ABY_P; AST; } /* 4 AST ABY page penalty */ +OP(db) { int tmp; m6502_ICount -= 7; RD_ABY; DCP; WB_EA; } /* 7 DCP ABY */ +OP(fb) { int tmp; m6502_ICount -= 7; RD_ABY; ISB; WB_EA; } /* 7 ISB ABY */ -OP(0c) { m6502_ICount -= 2; TOP; } /* 2 TOP */ +OP(0c) { m6502_ICount -= 4; TOP; } /* 4 TOP */ #define n2a03_2c m6502_2c /* 4 BIT ABS */ #define n2a03_4c m6502_4c /* 3 JMP ABS */ #define n2a03_6c m6502_6c /* 5 JMP IND */ @@ -270,14 +301,14 @@ OP(0c) { m6502_ICount -= 2; TOP; } /* 2 TOP */ #define n2a03_cc m6502_cc /* 4 CPY ABS */ #define n2a03_ec m6502_ec /* 4 CPX ABS */ -OP(1c) { m6502_ICount -= 2; TOP; } /* 2 TOP */ -OP(3c) { m6502_ICount -= 2; TOP; } /* 2 TOP */ -OP(5c) { m6502_ICount -= 2; TOP; } /* 2 TOP */ -OP(7c) { m6502_ICount -= 2; TOP; } /* 2 TOP */ +OP(1c) { m6502_ICount -= 4; TOP_P; } /* 4 TOP page penalty */ +OP(3c) { m6502_ICount -= 4; TOP_P; } /* 4 TOP page penalty */ +OP(5c) { m6502_ICount -= 4; TOP_P; } /* 4 TOP page penalty */ +OP(7c) { m6502_ICount -= 4; TOP_P; } /* 4 TOP page penalty */ OP(9c) { int tmp; m6502_ICount -= 5; EA_ABX; SYH; WB_EA; } /* 5 SYH ABX */ -#define n2a03_bc m6502_bc /* 4 LDY ABX */ -OP(dc) { m6502_ICount -= 2; TOP; } /* 2 TOP */ -OP(fc) { m6502_ICount -= 2; TOP; } /* 2 TOP */ +OP(bc) { int tmp; m6502_ICount -= 4; RD_ABX_P; LDY; } /* 4 LDY ABX page penalty */ +OP(dc) { m6502_ICount -= 4; TOP_P; } /* 4 TOP page penalty */ +OP(fc) { m6502_ICount -= 4; TOP_P; } /* 4 TOP page penalty */ #define n2a03_0d m6502_0d /* 4 ORA ABS */ #define n2a03_2d m6502_2d /* 4 AND ABS */ @@ -288,14 +319,14 @@ OP(6d) { int tmp; m6502_ICount -= 4; RD_ABS; ADC_NES; } /* 4 ADC ABS */ #define n2a03_cd m6502_cd /* 4 CMP ABS */ OP(ed) { int tmp; m6502_ICount -= 4; RD_ABS; SBC_NES; } /* 4 SBC ABS */ -#define n2a03_1d m6502_1d /* 4 ORA ABX */ -#define n2a03_3d m6502_3d /* 4 AND ABX */ -#define n2a03_5d m6502_5d /* 4 EOR ABX */ -OP(7d) { int tmp; m6502_ICount -= 4; RD_ABX; ADC_NES; } /* 4 ADC ABX */ +OP(1d) { int tmp; m6502_ICount -= 4; RD_ABX_P; ORA; } /* 4 ORA ABX page penalty */ +OP(3d) { int tmp; m6502_ICount -= 4; RD_ABX_P; AND; } /* 4 AND ABX page penalty */ +OP(5d) { int tmp; m6502_ICount -= 4; RD_ABX_P; EOR; } /* 4 EOR ABX page penalty */ +OP(7d) { int tmp; m6502_ICount -= 4; RD_ABX_P; ADC_NES; } /* 4 ADC ABX page penalty */ #define n2a03_9d m6502_9d /* 5 STA ABX */ -#define n2a03_bd m6502_bd /* 4 LDA ABX */ -#define n2a03_dd m6502_dd /* 4 CMP ABX */ -OP(fd) { int tmp; m6502_ICount -= 4; RD_ABX; SBC_NES; } /* 4 SBC ABX */ +OP(bd) { int tmp; m6502_ICount -= 4; RD_ABX_P; LDA; } /* 4 LDA ABX page penalty */ +OP(dd) { int tmp; m6502_ICount -= 4; RD_ABX_P; CMP; } /* 4 CMP ABX page penalty */ +OP(fd) { int tmp; m6502_ICount -= 4; RD_ABX_P; SBC_NES; } /* 4 SBC ABX page penalty */ #define n2a03_0e m6502_0e /* 6 ASL ABS */ #define n2a03_2e m6502_2e /* 6 ROL ABS */ @@ -310,26 +341,26 @@ OP(fd) { int tmp; m6502_ICount -= 4; RD_ABX; SBC_NES; } /* 4 SBC ABX */ #define n2a03_3e m6502_3e /* 7 ROL ABX */ #define n2a03_5e m6502_5e /* 7 LSR ABX */ #define n2a03_7e m6502_7e /* 7 ROR ABX */ -#define n2a03_9e m6502_9e /* 2 SXH ABY */ -#define n2a03_be m6502_be /* 4 LDX ABY */ +OP(9e) { int tmp; m6502_ICount -= 5; EA_ABY; SXH; WB_EA; } /* 5 SXH ABY */ +OP(be) { int tmp; m6502_ICount -= 4; RD_ABY_P; LDX; } /* 4 LDX ABY page penalty */ #define n2a03_de m6502_de /* 7 DEC ABX */ #define n2a03_fe m6502_fe /* 7 INC ABX */ -OP(0f) { int tmp; m6502_ICount -= 6; RD_ABS; SLO; WB_EA; } /* 4 SLO ABS */ -OP(2f) { int tmp; m6502_ICount -= 6; RD_ABS; RLA; WB_EA; } /* 4 RLA ABS */ -OP(4f) { int tmp; m6502_ICount -= 6; RD_ABS; SRE; WB_EA; } /* 4 SRE ABS */ -OP(6f) { int tmp; m6502_ICount -= 6; RD_ABS; RRA; WB_EA; } /* 4 RRA ABS */ +OP(0f) { int tmp; m6502_ICount -= 6; RD_ABS; SLO; WB_EA; } /* 6 SLO ABS */ +OP(2f) { int tmp; m6502_ICount -= 6; RD_ABS; RLA; WB_EA; } /* 6 RLA ABS */ +OP(4f) { int tmp; m6502_ICount -= 6; RD_ABS; SRE; WB_EA; } /* 6 SRE ABS */ +OP(6f) { int tmp; m6502_ICount -= 6; RD_ABS; RRA; WB_EA; } /* 6 RRA ABS */ OP(8f) { int tmp; m6502_ICount -= 4; SAX; WR_ABS; } /* 4 SAX ABS */ -OP(af) { int tmp; m6502_ICount -= 5; RD_ABS; LAX; } /* 4 LAX ABS */ +OP(af) { int tmp; m6502_ICount -= 4; RD_ABS; LAX; } /* 4 LAX ABS */ OP(cf) { int tmp; m6502_ICount -= 6; RD_ABS; DCP; WB_EA; } /* 6 DCP ABS */ OP(ef) { int tmp; m6502_ICount -= 6; RD_ABS; ISB; WB_EA; } /* 6 ISB ABS */ -OP(1f) { int tmp; m6502_ICount -= 4; RD_ABX; SLO; WB_EA; } /* 4 SLO ABX */ -OP(3f) { int tmp; m6502_ICount -= 4; RD_ABX; RLA; WB_EA; } /* 4 RLA ABX */ -OP(5f) { int tmp; m6502_ICount -= 4; RD_ABX; SRE; WB_EA; } /* 4 SRE ABX */ -OP(7f) { int tmp; m6502_ICount -= 4; RD_ABX; RRA; WB_EA; } /* 4 RRA ABX */ -OP(9f) { int tmp; m6502_ICount -= 6; EA_ABY; SAH; WB_EA; } /* 5 SAH ABY */ -OP(bf) { int tmp; m6502_ICount -= 6; RD_ABY; LAX; } /* 4 LAX ABY */ +OP(1f) { int tmp; m6502_ICount -= 7; RD_ABX; SLO; WB_EA; } /* 7 SLO ABX */ +OP(3f) { int tmp; m6502_ICount -= 7; RD_ABX; RLA; WB_EA; } /* 7 RLA ABX */ +OP(5f) { int tmp; m6502_ICount -= 7; RD_ABX; SRE; WB_EA; } /* 7 SRE ABX */ +OP(7f) { int tmp; m6502_ICount -= 7; RD_ABX; RRA; WB_EA; } /* 7 RRA ABX */ +OP(9f) { int tmp; m6502_ICount -= 5; EA_ABY; SAH; WB_EA; } /* 5 SAH ABY */ +OP(bf) { int tmp; m6502_ICount -= 4; RD_ABY_P; LAX; } /* 4 LAX ABY page penalty */ OP(df) { int tmp; m6502_ICount -= 7; RD_ABX; DCP; WB_EA; } /* 7 DCP ABX */ OP(ff) { int tmp; m6502_ICount -= 7; RD_ABX; ISB; WB_EA; } /* 7 ISB ABX */ diff --git a/src/cpu/m68000/m68000.h b/src/cpu/m68000/m68000.h index 886289e2b..18dbd707c 100644 --- a/src/cpu/m68000/m68000.h +++ b/src/cpu/m68000/m68000.h @@ -16,7 +16,8 @@ enum { CPUINFO_PTR_M68K_RESET_CALLBACK = CPUINFO_PTR_CPU_SPECIFIC, CPUINFO_PTR_M68K_CMPILD_CALLBACK, - CPUINFO_PTR_M68K_RTE_CALLBACK + CPUINFO_PTR_M68K_RTE_CALLBACK, + CPUINFO_PTR_M68K_TAS_CALLBACK }; extern int m68k_ICount; diff --git a/src/cpu/m68000/m68k.h b/src/cpu/m68000/m68k.h index f54b1385b..f66501860 100644 --- a/src/cpu/m68000/m68k.h +++ b/src/cpu/m68000/m68k.h @@ -240,6 +240,14 @@ void m68k_set_cmpild_instr_callback(void (*callback)(unsigned int val, int reg) */ void m68k_set_rte_instr_callback(void (*callback)(void)); +/* Set the callback for the TAS instruction. + * You must enable M68K_TAS_HAS_CALLBACK in m68kconf.h. + * The CPU calls this callback every time it encounters a TAS instruction. + * Default behavior: return 1, allow writeback. + */ +void m68k_set_tas_instr_callback(int (*callback)(void)); + + /* Set the callback for informing of a large PC change. * You must enable M68K_MONITOR_PC in m68kconf.h. diff --git a/src/cpu/m68000/m68k_in.c b/src/cpu/m68000/m68k_in.c index 29e112cbd..23cedc2df 100644 --- a/src/cpu/m68000/m68k_in.c +++ b/src/cpu/m68000/m68k_in.c @@ -10180,12 +10180,20 @@ M68KMAKE_OP(tas, 8, ., .) { uint ea = M68KMAKE_GET_EA_AY_8; uint dst = m68ki_read_8(ea); + uint allow_writeback; FLAG_Z = dst; FLAG_N = NFLAG_8(dst); FLAG_V = VFLAG_CLEAR; FLAG_C = CFLAG_CLEAR; - m68ki_write_8(ea, dst | 0x80); + + /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback + disabled in order to function properly. Some Amiga software may also rely + on this, but only when accessing specific addresses so additional functionality + will be needed. */ + allow_writeback = m68ki_tas_callback(); + + if (allow_writeback==1) m68ki_write_8(ea, dst | 0x80); } diff --git a/src/cpu/m68000/m68kconf.h b/src/cpu/m68000/m68kconf.h index 3384889e6..f936a4e89 100644 --- a/src/cpu/m68000/m68kconf.h +++ b/src/cpu/m68000/m68kconf.h @@ -117,6 +117,12 @@ #define M68K_RTE_HAS_CALLBACK OPT_OFF #define M68K_RTE_CALLBACK() your_rte_handler_function() +/* If ON, CPU will call the callback when it encounters a tas + * instruction. + */ +#define M68K_TAS_HAS_CALLBACK OPT_OFF +#define M68K_TAS_CALLBACK() your_tas_handler_function() + /* If ON, CPU will call the set fc callback on every memory access to * differentiate between user/supervisor, program/data access like a real diff --git a/src/cpu/m68000/m68kcpu.c b/src/cpu/m68000/m68kcpu.c index 71f85bb91..5764361b4 100644 --- a/src/cpu/m68000/m68kcpu.c +++ b/src/cpu/m68000/m68kcpu.c @@ -479,6 +479,12 @@ static void default_rte_instr_callback(void) { } +/* Called when a tas instruction is executed */ +static int default_tas_instr_callback(void) +{ + return 1; // allow writeback +} + /* Called when the program counter changed by a large value */ static unsigned int default_pc_changed_callback_data; static void default_pc_changed_callback(unsigned int new_pc) @@ -649,6 +655,11 @@ void m68k_set_rte_instr_callback(void (*callback)(void)) CALLBACK_RTE_INSTR = callback ? callback : default_rte_instr_callback; } +void m68k_set_tas_instr_callback(int (*callback)(void)) +{ + CALLBACK_TAS_INSTR = callback ? callback : default_tas_instr_callback; +} + void m68k_set_pc_changed_callback(void (*callback)(unsigned int new_pc)) { CALLBACK_PC_CHANGED = callback ? callback : default_pc_changed_callback; @@ -888,6 +899,7 @@ void m68k_init(void) m68k_set_reset_instr_callback(NULL); m68k_set_cmpild_instr_callback(NULL); m68k_set_rte_instr_callback(NULL); + m68k_set_tas_instr_callback(NULL); m68k_set_pc_changed_callback(NULL); m68k_set_fc_callback(NULL); m68k_set_instr_hook_callback(NULL); diff --git a/src/cpu/m68000/m68kcpu.h b/src/cpu/m68000/m68kcpu.h index 468a588c5..883481b78 100644 --- a/src/cpu/m68000/m68kcpu.h +++ b/src/cpu/m68000/m68kcpu.h @@ -360,6 +360,7 @@ #define CALLBACK_RESET_INSTR m68ki_cpu.reset_instr_callback #define CALLBACK_CMPILD_INSTR m68ki_cpu.cmpild_instr_callback #define CALLBACK_RTE_INSTR m68ki_cpu.rte_instr_callback +#define CALLBACK_TAS_INSTR m68ki_cpu.tas_instr_callback #define CALLBACK_PC_CHANGED m68ki_cpu.pc_changed_callback #define CALLBACK_SET_FC m68ki_cpu.set_fc_callback #define CALLBACK_INSTR_HOOK m68ki_cpu.instr_hook_callback @@ -480,6 +481,17 @@ #define m68ki_rte_callback() #endif /* M68K_RTE_HAS_CALLBACK */ +#if M68K_TAS_HAS_CALLBACK + #if M68K_TAS_HAS_CALLBACK == OPT_SPECIFY_HANDLER + #define m68ki_tas_callback() M68K_TAS_CALLBACK() + #else + #define m68ki_tas_callback() CALLBACK_TAS_INSTR() + #endif +#else + #define m68ki_tas_callback() +#endif /* M68K_TAS_HAS_CALLBACK */ + + #if M68K_INSTRUCTION_HOOK #if M68K_INSTRUCTION_HOOK == OPT_SPECIFY_HANDLER #define m68ki_instr_hook() M68K_INSTRUCTION_CALLBACK() @@ -890,6 +902,7 @@ typedef struct void (*reset_instr_callback)(void); /* Called when a RESET instruction is encountered */ void (*cmpild_instr_callback)(unsigned int, int); /* Called when a CMPI.L #v, Dn instruction is encountered */ void (*rte_instr_callback)(void); /* Called when a RTE instruction is encountered */ + int (*tas_instr_callback)(void); /* Called when a TAS instruction is encountered, allows / disallows writeback */ void (*pc_changed_callback)(unsigned int new_pc); /* Called when the PC changes by a large amount */ void (*set_fc_callback)(unsigned int new_fc); /* Called when the CPU function code changes */ void (*instr_hook_callback)(void); /* Called every instruction cycle prior to execution */ diff --git a/src/cpu/m68000/m68kmame.c b/src/cpu/m68000/m68kmame.c index a15a512f5..825b97fa1 100644 --- a/src/cpu/m68000/m68kmame.c +++ b/src/cpu/m68000/m68kmame.c @@ -607,6 +607,7 @@ static void m68000_set_info(UINT32 state, union cpuinfo *info) case CPUINFO_PTR_M68K_RESET_CALLBACK: m68k_set_reset_instr_callback(info->f); break; case CPUINFO_PTR_M68K_CMPILD_CALLBACK: m68k_set_cmpild_instr_callback((void (*)(unsigned int,int))(info->f)); break; case CPUINFO_PTR_M68K_RTE_CALLBACK: m68k_set_rte_instr_callback(info->f); break; + case CPUINFO_PTR_M68K_TAS_CALLBACK: m68k_set_tas_instr_callback((int (*)(void))(info->f)); break; } } diff --git a/src/cpu/m68000/m68kmame.h b/src/cpu/m68000/m68kmame.h index f362a335e..746411ba0 100644 --- a/src/cpu/m68000/m68kmame.h +++ b/src/cpu/m68000/m68kmame.h @@ -31,6 +31,9 @@ #define M68K_RTE_HAS_CALLBACK OPT_ON #define M68K_RTE_CALLBACK() +#define M68K_TAS_HAS_CALLBACK OPT_ON +#define M68K_TAS_CALLBACK() + #define M68K_EMULATE_FC OPT_OFF #define M68K_SET_FC_CALLBACK(A) diff --git a/src/cpu/rsp/rsp.c b/src/cpu/rsp/rsp.c index 34ab947cf..cfe8da9c2 100644 --- a/src/cpu/rsp/rsp.c +++ b/src/cpu/rsp/rsp.c @@ -13,6 +13,13 @@ #define SAVE_DISASM 0 #define SAVE_DMEM 0 +#define PRINT_VECREG(x) printf("V%d: %04X|%04X|%04X|%04X|%04X|%04X|%04X|%04X\n", (x), \ + (UINT16)VREG_S((x),0), (UINT16)VREG_S((x),1), \ + (UINT16)VREG_S((x),2), (UINT16)VREG_S((x),3), \ + (UINT16)VREG_S((x),4), (UINT16)VREG_S((x),5), \ + (UINT16)VREG_S((x),6), (UINT16)VREG_S((x),7)) + + extern offs_t rsp_dasm_one(char *buffer, offs_t pc, UINT32 op); #if LOG_INSTRUCTION_EXECUTION @@ -277,6 +284,7 @@ static void unimplemented_opcode(UINT32 op) #if SAVE_DISASM { + char string[200]; int i; FILE *dasm; dasm = fopen("rsp_disasm.txt", "wt"); @@ -294,11 +302,11 @@ static void unimplemented_opcode(UINT32 op) { int i; FILE *dmem; - dmem = fopen("rsp_dmem.txt", "wt"); + dmem = fopen("rsp_dmem.bin", "wb"); - for (i=0; i < 0x1000; i+=4) + for (i=0; i < 0x1000; i++) { - fprintf(dmem, "%08X: %08X\n", 0x04000000 + i, READ32(0x04000000 + i)); + fputc(READ8(0x04000000 + i), dmem); } fclose(dmem); } @@ -378,13 +386,23 @@ static void rsp_exit(void) #endif #if SAVE_DMEM { + /*int i; + FILE *dmem; + dmem = fopen("rsp_dmem.txt", "wt"); + + for (i=0; i < 0x1000; i+=4) + { + fprintf(dmem, "%08X: %08X\n", 0x04000000 + i, READ32(0x04000000 + i)); + } + fclose(dmem);*/ + int i; FILE *dmem; - dmem = fopen("rsp_dmem.txt", "wt"); + dmem = fopen("rsp_dmem.bin", "wb"); - for (i=0; i < 0x1000; i+=4) + for (i=0; i < 0x1000; i++) { - fprintf(dmem, "%08X: %08X\n", 0x04000000 + i, READ32(0x04000000 + i)); + fputc(READ8(0x04000000 + i), dmem); } fclose(dmem); } @@ -1026,9 +1044,23 @@ INLINE UINT16 SATURATE_ACCUM(int accum, int slice, UINT16 negative, UINT16 posit return 0; } +#define WRITEBACK_RESULT() \ + do { \ + VREG_S(VDREG, 0) = vres[0]; \ + VREG_S(VDREG, 1) = vres[1]; \ + VREG_S(VDREG, 2) = vres[2]; \ + VREG_S(VDREG, 3) = vres[3]; \ + VREG_S(VDREG, 4) = vres[4]; \ + VREG_S(VDREG, 5) = vres[5]; \ + VREG_S(VDREG, 6) = vres[6]; \ + VREG_S(VDREG, 7) = vres[7]; \ + } while(0) + + static void handle_vector_ops(UINT32 op) { int i; + INT16 vres[8]; // Opcode legend: // E = VS2 element type @@ -1059,7 +1091,7 @@ static void handle_vector_ops(UINT32 op) ACCUM_H(del) = 0; ACCUM_M(del) = -32768; ACCUM_L(del) = -32768; - VREG_S(VDREG, del) = 0x7fff; + vres[del] = 0x7fff; } else { @@ -1068,9 +1100,11 @@ static void handle_vector_ops(UINT32 op) ACCUM_H(del) = (r < 0) ? 0xffff : 0; // sign-extend to 48-bit ACCUM_M(del) = (INT16)(r >> 16); ACCUM_L(del) = (UINT16)(r); - VREG_S(VDREG, del) = ACCUM_M(del); + vres[del] = ACCUM_M(del); } } + WRITEBACK_RESULT(); + break; } @@ -1097,17 +1131,18 @@ static void handle_vector_ops(UINT32 op) if (r < 0) { - VREG_S(VDREG, del) = 0; + vres[del] = 0; } else if (((INT16)(ACCUM_H(del)) ^ (INT16)(ACCUM_M(del))) < 0) { - VREG_S(VDREG, del) = -1; + vres[del] = -1; } else { - VREG_S(VDREG, del) = ACCUM_M(del); + vres[del] = ACCUM_M(del); } } + WRITEBACK_RESULT(); break; } @@ -1134,8 +1169,9 @@ static void handle_vector_ops(UINT32 op) ACCUM_M(del) = 0; ACCUM_L(del) = (UINT16)(r >> 16); - VREG_S(VDREG, del) = ACCUM_L(del); + vres[del] = ACCUM_L(del); } + WRITEBACK_RESULT(); break; } @@ -1162,8 +1198,9 @@ static void handle_vector_ops(UINT32 op) ACCUM_M(del) = (INT16)(r >> 16); ACCUM_L(del) = (UINT16)(r); - VREG_S(VDREG, del) = ACCUM_M(del); + vres[del] = ACCUM_M(del); } + WRITEBACK_RESULT(); break; } @@ -1191,8 +1228,9 @@ static void handle_vector_ops(UINT32 op) ACCUM_M(del) = (INT16)(r >> 16); ACCUM_L(del) = (UINT16)(r); - VREG_S(VDREG, del) = ACCUM_L(del); + vres[del] = ACCUM_L(del); } + WRITEBACK_RESULT(); break; } @@ -1221,8 +1259,9 @@ static void handle_vector_ops(UINT32 op) if (r < -32768) r = -32768; if (r > 32767) r = 32767; - VREG_S(VDREG, del) = (INT16)(r); + vres[del] = (INT16)(r); } + WRITEBACK_RESULT(); break; } @@ -1248,8 +1287,9 @@ static void handle_vector_ops(UINT32 op) ACCUM(del) += (INT64)(r) << 17; res = SATURATE_ACCUM(del, 1, 0x8000, 0x7fff); - VREG_S(VDREG, del) = res; + vres[del] = res; } + WRITEBACK_RESULT(); break; } @@ -1300,8 +1340,9 @@ static void handle_vector_ops(UINT32 op) } } - VREG_S(VDREG, del) = res; + vres[del] = res; } + WRITEBACK_RESULT(); break; } @@ -1333,8 +1374,9 @@ static void handle_vector_ops(UINT32 op) res = SATURATE_ACCUM(del, 0, 0x0000, 0xffff); - VREG_S(VDREG, del) = res; + vres[del] = res; } + WRITEBACK_RESULT(); break; } @@ -1368,8 +1410,9 @@ static void handle_vector_ops(UINT32 op) res = SATURATE_ACCUM(del, 1, 0x8000, 0x7fff); - VREG_S(VDREG, del) = res; + vres[del] = res; } + WRITEBACK_RESULT(); break; } @@ -1403,8 +1446,9 @@ static void handle_vector_ops(UINT32 op) res = SATURATE_ACCUM(del, 0, 0x0000, 0xffff); - VREG_S(VDREG, del) = res; + vres[del] = res; } + WRITEBACK_RESULT(); break; } @@ -1432,8 +1476,9 @@ static void handle_vector_ops(UINT32 op) res = SATURATE_ACCUM(del, 1, 0x8000, 0x7fff); - VREG_S(VDREG, del) = res; + vres[del] = res; } + WRITEBACK_RESULT(); break; } @@ -1460,10 +1505,11 @@ static void handle_vector_ops(UINT32 op) if (r > 32767) r = 32767; if (r < -32768) r = -32768; - VREG_S(VDREG, del) = (INT16)(r); + vres[del] = (INT16)(r); } CLEAR_ZERO_FLAGS(); CLEAR_CARRY_FLAGS(); + WRITEBACK_RESULT(); break; } @@ -1491,10 +1537,11 @@ static void handle_vector_ops(UINT32 op) if (r > 32767) r = 32767; if (r < -32768) r = -32768; - VREG_S(VDREG, del) = (INT16)(r); + vres[del] = (INT16)(r); } CLEAR_ZERO_FLAGS(); CLEAR_CARRY_FLAGS(); + WRITEBACK_RESULT(); break; } @@ -1519,24 +1566,25 @@ static void handle_vector_ops(UINT32 op) { if (s2 == -32768) { - VREG_S(VDREG, del) = 32767; + vres[del] = 32767; } else { - VREG_S(VDREG, del) = -s2; + vres[del] = -s2; } } else if (s1 > 0) { - VREG_S(VDREG, del) = s2; + vres[del] = s2; } else { - VREG_S(VDREG, del) = 0; + vres[del] = 0; } - ACCUM_L(del) = VREG_S(VDREG, del); + ACCUM_L(del) = vres[del]; } + WRITEBACK_RESULT(); break; } @@ -1562,7 +1610,7 @@ static void handle_vector_ops(UINT32 op) INT32 s2 = (UINT32)(UINT16)VREG_S(VS2REG, sel); INT32 r = s1 + s2; - VREG_S(VDREG, del) = (INT16)(r); + vres[del] = (INT16)(r); ACCUM_L(del) = (INT16)(r); if (r & 0xffff0000) @@ -1570,6 +1618,7 @@ static void handle_vector_ops(UINT32 op) SET_CARRY_FLAG(del); } } + WRITEBACK_RESULT(); break; } @@ -1595,7 +1644,7 @@ static void handle_vector_ops(UINT32 op) INT32 s2 = (UINT32)(UINT16)VREG_S(VS2REG, sel); INT32 r = s1 - s2; - VREG_S(VDREG, del) = (INT16)(r); + vres[del] = (INT16)(r); ACCUM_L(del) = (UINT16)(r); if ((UINT16)(r) != 0) @@ -1607,6 +1656,7 @@ static void handle_vector_ops(UINT32 op) SET_CARRY_FLAG(del); } } + WRITEBACK_RESULT(); break; } @@ -1669,12 +1719,12 @@ static void handle_vector_ops(UINT32 op) if (VREG_S(VS1REG, del) < VREG_S(VS2REG, sel)) { - VREG_S(VDREG, del) = VREG_S(VS1REG, del); + vres[del] = VREG_S(VS1REG, del); SET_COMPARE_FLAG(del); } else if (VREG_S(VS1REG, del) == VREG_S(VS2REG, sel)) { - VREG_S(VDREG, del) = VREG_S(VS1REG, del); + vres[del] = VREG_S(VS1REG, del); if (ZERO_FLAG(del) != 0 && CARRY_FLAG(del) != 0) { SET_COMPARE_FLAG(del); @@ -1682,14 +1732,15 @@ static void handle_vector_ops(UINT32 op) } else { - VREG_S(VDREG, del) = VREG_S(VS2REG, sel); + vres[del] = VREG_S(VS2REG, sel); } - ACCUM_L(del) = VREG_S(VDREG, del); + ACCUM_L(del) = vres[del]; } CLEAR_ZERO_FLAGS(); CLEAR_CARRY_FLAGS(); + WRITEBACK_RESULT(); break; } @@ -1710,8 +1761,8 @@ static void handle_vector_ops(UINT32 op) int del = VEC_EL_1(EL, i); int sel = VEC_EL_2(EL, del); - VREG_S(VDREG, del) = VREG_S(VS2REG, sel); - ACCUM_L(del) = VREG_S(VDREG, del); + vres[del] = VREG_S(VS2REG, sel); + ACCUM_L(del) = vres[del]; if (VREG_S(VS1REG, del) == VREG_S(VS2REG, sel)) { @@ -1724,6 +1775,7 @@ static void handle_vector_ops(UINT32 op) CLEAR_ZERO_FLAGS(); CLEAR_CARRY_FLAGS(); + WRITEBACK_RESULT(); break; } @@ -1744,8 +1796,8 @@ static void handle_vector_ops(UINT32 op) int del = VEC_EL_1(EL, i); int sel = VEC_EL_2(EL, del); - VREG_S(VDREG, del) = VREG_S(VS1REG, del); - ACCUM_L(del) = VREG_S(VS1REG, del); + vres[del] = VREG_S(VS1REG, del); + ACCUM_L(del) = vres[del]; if (VREG_S(VS1REG, del) != VREG_S(VS2REG, sel)) { @@ -1762,6 +1814,7 @@ static void handle_vector_ops(UINT32 op) CLEAR_ZERO_FLAGS(); CLEAR_CARRY_FLAGS(); + WRITEBACK_RESULT(); break; } @@ -1796,18 +1849,19 @@ static void handle_vector_ops(UINT32 op) if (COMPARE_FLAG(del) != 0) { - VREG_S(VDREG, del) = VREG_S(VS1REG, del); + vres[del] = VREG_S(VS1REG, del); } else { - VREG_S(VDREG, del) = VREG_S(VS2REG, sel); + vres[del] = VREG_S(VS2REG, sel); } - ACCUM_L(del) = VREG_S(VDREG, del); + ACCUM_L(del) = vres[del]; } CLEAR_ZERO_FLAGS(); CLEAR_CARRY_FLAGS(); + WRITEBACK_RESULT(); break; } @@ -1898,11 +1952,12 @@ static void handle_vector_ops(UINT32 op) } } - VREG_S(VDREG, del) = ACCUM_L(del); + vres[del] = ACCUM_L(del); } CLEAR_ZERO_FLAGS(); CLEAR_CARRY_FLAGS(); rsp.flag[2] = 0; + WRITEBACK_RESULT(); break; } @@ -1942,11 +1997,11 @@ static void handle_vector_ops(UINT32 op) rsp.flag[2] |= (1 << (del)); } SET_COMPARE_FLAG(del); - VREG_S(VDREG, del) = -((UINT16)s2); + vres[del] = -((UINT16)s2); } else { - VREG_S(VDREG, del) = s1; + vres[del] = s1; } if (s1 + s2 != 0) @@ -1966,11 +2021,11 @@ static void handle_vector_ops(UINT32 op) if (s1 - s2 >= 0) { rsp.flag[1] |= (1 << (8+del)); - VREG_S(VDREG, del) = s2; + vres[del] = s2; } else { - VREG_S(VDREG, del) = s1; + vres[del] = s1; } if ((s1 - s2) != 0) @@ -1982,8 +2037,9 @@ static void handle_vector_ops(UINT32 op) } } - ACCUM_L(del) = VREG_S(VDREG, del); + ACCUM_L(del) = vres[del]; } + WRITEBACK_RESULT(); break; } @@ -2040,8 +2096,9 @@ static void handle_vector_ops(UINT32 op) } } - VREG_S(VDREG, del) = ACCUM_L(del); + vres[del] = ACCUM_L(del); } + WRITEBACK_RESULT(); break; } @@ -2056,15 +2113,20 @@ static void handle_vector_ops(UINT32 op) for (i=0; i < 8; i++) { - if (COMPARE_FLAG(i) != 0) + int del = VEC_EL_1(EL, i); + int sel = VEC_EL_2(EL, del); + if (COMPARE_FLAG(del) != 0) { - VREG_S(VDREG, i) = VREG_S(VS1REG, i); + vres[del] = VREG_S(VS1REG, del); } else { - VREG_S(VDREG, i) = VREG_S(VS2REG, VEC_EL_2(EL, i)); + vres[del] = VREG_S(VS2REG, VEC_EL_2(EL, sel)); } + + ACCUM_L(del) = vres[del]; } + WRITEBACK_RESULT(); break; } case 0x28: /* VAND */ @@ -2080,9 +2142,10 @@ static void handle_vector_ops(UINT32 op) { int del = VEC_EL_1(EL, i); int sel = VEC_EL_2(EL, del); - VREG_S(VDREG, del) = VREG_S(VS1REG, del) & VREG_S(VS2REG, sel); - ACCUM_L(del) = VREG_S(VDREG, del); + vres[del] = VREG_S(VS1REG, del) & VREG_S(VS2REG, sel); + ACCUM_L(del) = vres[del]; } + WRITEBACK_RESULT(); break; } case 0x29: /* VNAND */ @@ -2098,9 +2161,10 @@ static void handle_vector_ops(UINT32 op) { int del = VEC_EL_1(EL, i); int sel = VEC_EL_2(EL, del); - VREG_S(VDREG, i) = ~(VREG_S(VS1REG, del) & VREG_S(VS2REG, sel)); - ACCUM_L(del) = VREG_S(VDREG, del); + vres[del] = ~((VREG_S(VS1REG, del) & VREG_S(VS2REG, sel))); + ACCUM_L(del) = vres[del]; } + WRITEBACK_RESULT(); break; } case 0x2a: /* VOR */ @@ -2116,9 +2180,10 @@ static void handle_vector_ops(UINT32 op) { int del = VEC_EL_1(EL, i); int sel = VEC_EL_2(EL, del); - VREG_S(VDREG, del) = VREG_S(VS1REG, del) | VREG_S(VS2REG, sel); - ACCUM_L(del) = VREG_S(VDREG, del); + vres[del] = VREG_S(VS1REG, del) | VREG_S(VS2REG, sel); + ACCUM_L(del) = vres[del]; } + WRITEBACK_RESULT(); break; } case 0x2b: /* VNOR */ @@ -2134,9 +2199,10 @@ static void handle_vector_ops(UINT32 op) { int del = VEC_EL_1(EL, i); int sel = VEC_EL_2(EL, del); - VREG_S(VDREG, del) = ~(VREG_S(VS1REG, del) | VREG_S(VS2REG, sel)); - ACCUM_L(del) = VREG_S(VDREG, del); + vres[del] = ~((VREG_S(VS1REG, del) | VREG_S(VS2REG, sel))); + ACCUM_L(del) = vres[del]; } + WRITEBACK_RESULT(); break; } case 0x2c: /* VXOR */ @@ -2152,9 +2218,10 @@ static void handle_vector_ops(UINT32 op) { int del = VEC_EL_1(EL, i); int sel = VEC_EL_2(EL, del); - VREG_S(VDREG, del) = VREG_S(VS1REG, del) ^ VREG_S(VS2REG, sel); - ACCUM_L(del) = VREG_S(VDREG, del); + vres[del] = VREG_S(VS1REG, del) ^ VREG_S(VS2REG, sel); + ACCUM_L(del) = vres[del]; } + WRITEBACK_RESULT(); break; } case 0x2d: /* VNXOR */ @@ -2170,9 +2237,10 @@ static void handle_vector_ops(UINT32 op) { int del = VEC_EL_1(EL, i); int sel = VEC_EL_2(EL, del); - VREG_S(VDREG, del) = ~(VREG_S(VS1REG, del) ^ VREG_S(VS2REG, sel)); - ACCUM_L(del) = VREG_S(VDREG, del); + vres[del] = ~((VREG_S(VS1REG, del) ^ VREG_S(VS2REG, sel))); + ACCUM_L(del) = vres[del]; } + WRITEBACK_RESULT(); break; } @@ -2456,10 +2524,7 @@ static int rsp_execute(int cycles) rsp_icount = cycles; - if (rsp.pc < 0x4001000 || rsp.pc >= 0x4002000) - { - fatalerror("rsp: PC = %08X\n", rsp.pc); - } + rsp.pc = 0x4001000 | (rsp.pc & 0xfff); while (rsp_icount > 0) { @@ -2536,7 +2601,8 @@ static int rsp_execute(int cycles) case 0x07: /* BGTZ */ if ((INT32)RSVAL > 0) JUMP_REL(SIMM16); break; case 0x08: /* ADDI */ if (RTREG) RTVAL = (INT32)(RSVAL + SIMM16); break; case 0x09: /* ADDIU */ if (RTREG) RTVAL = (INT32)(RSVAL + SIMM16); break; - case 0x0b: /* SLTIU */ if (RTREG) RTVAL = (UINT32)(RTVAL) < (UINT32)((INT32)SIMM16); break; + case 0x0a: /* SLTI */ if (RTREG) RTVAL = (INT32)(RSVAL) < ((INT32)SIMM16); break; + case 0x0b: /* SLTIU */ if (RTREG) RTVAL = (UINT32)(RSVAL) < (UINT32)((INT32)SIMM16); break; case 0x0c: /* ANDI */ if (RTREG) RTVAL = RSVAL & UIMM16; break; case 0x0d: /* ORI */ if (RTREG) RTVAL = RSVAL | UIMM16; break; case 0x0e: /* XORI */ if (RTREG) RTVAL = RSVAL ^ UIMM16; break; diff --git a/src/cpuexec.c b/src/cpuexec.c index 589bdcb0e..914f29f88 100644 --- a/src/cpuexec.c +++ b/src/cpuexec.c @@ -15,7 +15,7 @@ #include "profiler.h" #include "debugger.h" -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG #include "debug/debugcpu.h" #endif @@ -159,8 +159,8 @@ static mame_timer *watchdog_timer; * *************************************/ -static void cpuexec_exit(void); -static void cpuexec_reset(void); +static void cpuexec_exit(running_machine *machine); +static void cpuexec_reset(running_machine *machine); static void init_refresh_timer(void); static void cpu_inittimers(void); static void cpu_vblankreset(void); @@ -196,7 +196,7 @@ static void watchdog_setup(int alloc_new); * *************************************/ -int cpuexec_init(void) +int cpuexec_init(running_machine *machine) { int cpunum; @@ -259,8 +259,8 @@ int cpuexec_init(void) fatalerror("CPU #%d (%s) did not register any state to save!", cpunum, cputype_name(cputype)); } } - add_reset_callback(cpuexec_reset); - add_exit_callback(cpuexec_exit); + add_reset_callback(machine, cpuexec_reset); + add_exit_callback(machine, cpuexec_exit); /* compute the perfect interleave factor */ compute_perfect_interleave(); @@ -284,7 +284,7 @@ int cpuexec_init(void) * *************************************/ -static void cpuexec_reset(void) +static void cpuexec_reset(running_machine *machine) { int cpunum; @@ -323,7 +323,7 @@ static void cpuexec_reset(void) * *************************************/ -static void cpuexec_exit(void) +static void cpuexec_exit(running_machine *machine) { int cpunum; @@ -349,7 +349,7 @@ static void cpuexec_exit(void) static void watchdog_callback(int param) { logerror("reset caused by the (time) watchdog\n"); - mame_schedule_soft_reset(); + mame_schedule_soft_reset(Machine); } @@ -550,14 +550,6 @@ void cpuexec_timeslice(void) /* update the global time */ mame_timer_set_global_time(target); - - /* huh? something for the debugger */ - #if defined(MAME_DEBUG) && !defined(NEW_DEBUGGER) - { - extern int debug_key_delay; - debug_key_delay = 0x7ffe; - } - #endif } @@ -1354,7 +1346,7 @@ static void cpu_vblankreset(void) if (--watchdog_counter == 0) { logerror("reset caused by the (vblank) watchdog\n"); - mame_schedule_soft_reset(); + mame_schedule_soft_reset(Machine); } } @@ -1451,7 +1443,7 @@ static void cpu_vblankcallback(int param) /* reset the counter */ vblank_countdown = vblank_multiplier; -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG /* notify the debugger */ debug_vblank_hook(); #endif diff --git a/src/cpuexec.h b/src/cpuexec.h index 045934ad2..4a9650b9c 100644 --- a/src/cpuexec.h +++ b/src/cpuexec.h @@ -65,7 +65,7 @@ enum *************************************/ /* Prepare CPUs for execution */ -int cpuexec_init(void); +int cpuexec_init(running_machine *machine); /* Execute for a single timeslice */ void cpuexec_timeslice(void); diff --git a/src/cpuint.c b/src/cpuint.c index 0b6cf4a8c..16aeadecb 100644 --- a/src/cpuint.c +++ b/src/cpuint.c @@ -12,7 +12,7 @@ #include #include "driver.h" -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG #include "debug/debugcpu.h" #endif @@ -110,7 +110,7 @@ static int (*drv_irq_callbacks[MAX_CPU])(int); * *************************************/ -int cpuint_init(void) +int cpuint_init(running_machine *machine) { int cpunum; int line; @@ -369,7 +369,7 @@ INLINE int cpu_irq_callback(int cpunum, int line) if (drv_irq_callbacks[cpunum]) vector = (*drv_irq_callbacks[cpunum])(line); -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG /* notify the debugger */ debug_interrupt_hook(cpunum, line); #endif diff --git a/src/cpuint.h b/src/cpuint.h index a9e6fb017..151d07bbe 100644 --- a/src/cpuint.h +++ b/src/cpuint.h @@ -26,7 +26,7 @@ * *************************************/ -int cpuint_init(void); +int cpuint_init(running_machine *machine); void cpuint_reset(void); diff --git a/src/cpuintrf.c b/src/cpuintrf.c index ad04b81dd..b0add2acb 100644 --- a/src/cpuintrf.c +++ b/src/cpuintrf.c @@ -763,7 +763,7 @@ static int cpu_active_context[CPU_COUNT]; static int cpu_context_stack[4]; static int cpu_context_stack_ptr; -static unsigned (*cpu_dasm_override)(int cpunum, char *buffer, unsigned pc); +static offs_t (*cpu_dasm_override[CPU_COUNT])(char *buffer, offs_t pc, UINT8 *oprom, UINT8 *opram, int bytes); #define TEMP_STRING_POOL_ENTRIES 16 static char temp_string_pool[TEMP_STRING_POOL_ENTRIES][256]; @@ -856,7 +856,7 @@ char *cpuintrf_temp_str(void) * *************************************/ -void cpuintrf_init(void) +void cpuintrf_init(running_machine *machine) { int mapindex; @@ -937,7 +937,7 @@ void cpuintrf_init(void) /* zap the CPU data structure */ memset(cpu, 0, sizeof(cpu)); totalcpu = 0; - cpu_dasm_override = NULL; + memset(cpu_dasm_override, 0, sizeof(cpu_dasm_override)); /* reset the context stack */ memset(cpu_context_stack, -1, sizeof(cpu_context_stack)); @@ -986,9 +986,9 @@ void cpuintrf_init(void) * *************************************/ -void cpuintrf_set_dasm_override(unsigned (*dasm_override)(int cpunum, char *buffer, unsigned pc)) +void cpuintrf_set_dasm_override(int cpunum, offs_t (*dasm_override)(char *buffer, offs_t pc, UINT8 *oprom, UINT8 *opram, int bytes)) { - cpu_dasm_override = dasm_override; + cpu_dasm_override[cpunum] = dasm_override; } @@ -1200,14 +1200,6 @@ offs_t activecpu_dasm(char *buffer, offs_t pc) { VERIFY_ACTIVECPU(activecpu_dasm); - /* allow overrides */ - if (cpu_dasm_override) - { - offs_t result = cpu_dasm_override(activecpu, buffer, pc); - if (result) - return result; - } - /* if there's no old-style assembler, do some work to make this call work with the new one */ if (!cpu[activecpu].intf.disassemble) { @@ -1267,6 +1259,14 @@ unsigned activecpu_dasm_new(char *buffer, offs_t pc, UINT8 *oprom, UINT8 *opram, VERIFY_ACTIVECPU(activecpu_dasm_new); + /* check for disassembler override */ + if (cpu_dasm_override[activecpu]) + { + result = (*cpu_dasm_override[activecpu])(buffer, pc, oprom, opram, bytes); + if (result != 0) + return result; + } + if (cpu[activecpu].intf.disassemble_new) { result = (*cpu[activecpu].intf.disassemble_new)(buffer, pc, oprom, opram, bytes); diff --git a/src/cpuintrf.h b/src/cpuintrf.h index 567ebdf44..3fe2b55aa 100644 --- a/src/cpuintrf.h +++ b/src/cpuintrf.h @@ -316,7 +316,7 @@ enum CPUINFO_PTR_WINDOW_LAYOUT, /* R/O: struct debug_window_layout *layout */ CPUINFO_PTR_INTERNAL_MEMORY_MAP, /* R/O: construct_map_t map */ CPUINFO_PTR_INTERNAL_MEMORY_MAP_LAST = CPUINFO_PTR_INTERNAL_MEMORY_MAP + ADDRESS_SPACES - 1, - CPUINFO_PTR_DEBUG_REGISTER_LIST, /* R/O: int *list: list of registers for NEW_DEBUGGER */ + CPUINFO_PTR_DEBUG_REGISTER_LIST, /* R/O: int *list: list of registers for the debugger */ CPUINFO_PTR_CPU_SPECIFIC = 0x18000, /* R/W: CPU-specific values start here */ @@ -438,7 +438,7 @@ typedef struct _cpu_interface cpu_interface; *************************************/ /* reset the internal CPU tracking */ -void cpuintrf_init(void); +void cpuintrf_init(running_machine *machine); /* set up the interface for one CPU of a given type */ int cpuintrf_init_cpu(int cpunum, int cputype, int clock, const void *config, int (*irqcallback)(int)); @@ -456,7 +456,7 @@ void cpuintrf_pop_context(void); char *cpuintrf_temp_str(void); /* set the dasm override handler */ -void cpuintrf_set_dasm_override(offs_t (*dasm_override)(int cpunum, char *buffer, offs_t pc)); +void cpuintrf_set_dasm_override(int cpunum, offs_t (*dasm_override)(char *buffer, offs_t pc, UINT8 *oprom, UINT8 *opram, int bytes)); diff --git a/src/debug/debugcmd.c b/src/debug/debugcmd.c index fca0e3345..0dc40f219 100644 --- a/src/debug/debugcmd.c +++ b/src/debug/debugcmd.c @@ -47,7 +47,7 @@ static struct FUNCTION PROTOTYPES ***************************************************************************/ -static void debug_command_exit(void); +static void debug_command_exit(running_machine *machine); static UINT64 execute_min(UINT32 ref, UINT32 params, UINT64 *param); static UINT64 execute_max(UINT32 ref, UINT32 params, UINT64 *param); @@ -112,7 +112,7 @@ static void execute_symlist(int ref, int params, const char **param); system -------------------------------------------------*/ -void debug_command_init(void) +void debug_command_init(running_machine *machine) { int cpunum, itemnum; const char *name; @@ -237,7 +237,7 @@ void debug_command_init(void) setup_commands(); } - add_exit_callback(debug_command_exit); + add_exit_callback(machine, debug_command_exit); } @@ -245,7 +245,7 @@ void debug_command_init(void) debug_command_exit - exit-time cleanup -------------------------------------------------*/ -static void debug_command_exit(void) +static void debug_command_exit(running_machine *machine) { int cpunum; @@ -981,7 +981,7 @@ static void execute_bpset(int ref, int params, const char *param[]) /* set the breakpoint */ bpnum = debug_breakpoint_set(cpu_getactivecpu(), address, condition, action); - debug_console_printf("Breakpoint %d set\n", bpnum); + debug_console_printf("Breakpoint %X set\n", bpnum); } @@ -1155,7 +1155,7 @@ static void execute_wpset(int ref, int params, const char *param[]) /* set the watchpoint */ wpnum = debug_watchpoint_set(cpu_getactivecpu(), ref, type, address, length, condition, action); - debug_console_printf("Watchpoint %d set\n", wpnum); + debug_console_printf("Watchpoint %X set\n", wpnum); } diff --git a/src/debug/debugcmd.h b/src/debug/debugcmd.h index 0122d934b..00dc65dc7 100644 --- a/src/debug/debugcmd.h +++ b/src/debug/debugcmd.h @@ -18,6 +18,6 @@ ***************************************************************************/ /* initialization */ -void debug_command_init(void); +void debug_command_init(running_machine *machine); #endif diff --git a/src/debug/debugcmt.c b/src/debug/debugcmt.c index e9a879334..b4b6b4655 100644 --- a/src/debug/debugcmt.c +++ b/src/debug/debugcmt.c @@ -88,7 +88,7 @@ static comment_group *debug_comments; FUNCTION PROTOTYPES ***************************************************************************/ -static void debug_comment_exit(void); +static void debug_comment_exit(running_machine *machine); static void debug_comment_free(void); @@ -104,7 +104,7 @@ static void debug_comment_free(void); loads any existing comment file -------------------------------------------------------------------------*/ -int debug_comment_init(void) +int debug_comment_init(running_machine *machine) { /* allocate enough comment groups for the total # of cpu's */ debug_comments = (comment_group*) auto_malloc(cpu_gettotalcpu() * sizeof(comment_group)); @@ -113,7 +113,7 @@ int debug_comment_init(void) /* automatically load em up */ debug_comment_load(); - add_exit_callback(debug_comment_exit); + add_exit_callback(machine, debug_comment_exit); return 1; } @@ -532,7 +532,7 @@ static int debug_comment_load_xml(mame_file *fp) debug_comment_exit - saves the comments and frees memory -------------------------------------------------------------------------*/ -static void debug_comment_exit(void) +static void debug_comment_exit(running_machine *machine) { debug_comment_save(); debug_comment_free(); diff --git a/src/debug/debugcmt.h b/src/debug/debugcmt.h index 6a7720666..af9cdbcf8 100644 --- a/src/debug/debugcmt.h +++ b/src/debug/debugcmt.h @@ -18,7 +18,7 @@ #define DEBUG_COMMENT_MAX_NUM (0x10000) /* 64k comments should be good for awhile */ /* init and exit */ -int debug_comment_init(void); +int debug_comment_init(running_machine *machine); /* load and save */ int debug_comment_save(void); diff --git a/src/debug/debugcon.c b/src/debug/debugcon.c index 975d66f51..8ce267a56 100644 --- a/src/debug/debugcon.c +++ b/src/debug/debugcon.c @@ -75,7 +75,7 @@ static debug_command *commandlist; system -------------------------------------------------*/ -void debug_console_init(void) +void debug_console_init(running_machine *machine) { /* allocate text buffers */ console_textbuf = text_buffer_alloc(CONSOLE_BUF_SIZE, CONSOLE_MAX_LINES); @@ -91,7 +91,7 @@ void debug_console_init(void) debug_console_printf("Currently targeting %s (%s)\n", Machine->gamedrv->name, Machine->gamedrv->description); /* request callback upon exiting */ - add_exit_callback(debug_console_exit); + add_exit_callback(machine, debug_console_exit); } @@ -100,7 +100,7 @@ void debug_console_init(void) system -------------------------------------------------*/ -void debug_console_exit(void) +void debug_console_exit(running_machine *machine) { /* free allocated memory */ if (console_textbuf) @@ -511,7 +511,7 @@ text_buffer *debug_console_get_textbuf(void) the errorlog ring buffer -------------------------------------------------*/ -void debug_errorlog_write_line(const char *line) +void debug_errorlog_write_line(running_machine *machine, const char *line) { if (errorlog_textbuf) text_buffer_print(errorlog_textbuf, line); diff --git a/src/debug/debugcon.h b/src/debug/debugcon.h index 3e24b87e2..0771f8f56 100644 --- a/src/debug/debugcon.h +++ b/src/debug/debugcon.h @@ -26,7 +26,7 @@ #define CMDFLAG_NONE (0x0000) #define CMDFLAG_KEEP_QUOTES (0x0001) -/* values for the error code in an command error */ +/* values for the error code in a command error */ #define CMDERR_NONE (0) #define CMDERR_UNKNOWN_COMMAND (1) #define CMDERR_AMBIGUOUS_COMMAND (2) @@ -76,8 +76,8 @@ typedef UINT32 CMDERR; ***************************************************************************/ /* initialization */ -void debug_console_init(void); -void debug_console_exit(void); +void debug_console_init(running_machine *machine); +void debug_console_exit(running_machine *machine); /* command handling */ CMDERR debug_console_execute_command(const char *command, int echo); @@ -91,7 +91,7 @@ void CLIB_DECL debug_console_printf_wrap(int wrapcol, const char *format, ...) text_buffer * debug_console_get_textbuf(void); /* errorlog management */ -void debug_errorlog_write_line(const char *line); +void debug_errorlog_write_line(running_machine *machine, const char *line); text_buffer * debug_errorlog_get_textbuf(void); #endif diff --git a/src/debug/debugcpu.c b/src/debug/debugcpu.c index 7bde11273..84b7023cd 100644 --- a/src/debug/debugcpu.c +++ b/src/debug/debugcpu.c @@ -77,7 +77,7 @@ static UINT64 tempvar[NUM_TEMP_VARIABLES]; FUNCTION PROTOTYPES ***************************************************************************/ -static void debug_cpu_exit(void); +static void debug_cpu_exit(running_machine *machine); static void perform_trace(debug_cpu_info *info); static void prepare_for_step_overout(void); static void process_source_file(void); @@ -106,16 +106,16 @@ static void check_hotspots(int cpunum, int spacenum, offs_t address); mame_debug_init - start up all subsections -------------------------------------------------*/ -void mame_debug_init(void) +void mame_debug_init(running_machine *machine) { /* initialize the various subsections */ - debug_cpu_init(); - debug_command_init(); - debug_console_init(); - debug_view_init(); - debug_comment_init(); + debug_cpu_init(machine); + debug_command_init(machine); + debug_console_init(machine); + debug_view_init(machine); + debug_comment_init(machine); atexit(debug_flush_traces); - add_logerror_callback(debug_errorlog_write_line); + add_logerror_callback(machine, debug_errorlog_write_line); } @@ -149,7 +149,7 @@ int mame_debug_is_active(void) information for debugging -------------------------------------------------*/ -void debug_cpu_init(void) +void debug_cpu_init(running_machine *machine) { int cpunum, spacenum, regnum; @@ -276,7 +276,7 @@ void debug_cpu_init(void) } } - add_exit_callback(debug_cpu_exit); + add_exit_callback(machine, debug_cpu_exit); } @@ -284,7 +284,7 @@ void debug_cpu_init(void) debug_cpu_exit - free all memory -------------------------------------------------*/ -static void debug_cpu_exit(void) +static void debug_cpu_exit(running_machine *machine) { int cpunum, spacenum; @@ -816,7 +816,7 @@ void mame_debug_hook(void) process_source_file(); /* if an event got scheduled, resume */ - if (mame_is_scheduled_event_pending()) + if (mame_is_scheduled_event_pending(Machine)) execution_state = EXECUTION_STATE_RUNNING; } osd_sound_enable(1); @@ -2103,7 +2103,7 @@ void debug_source_script(const char *file) debug_source_file = fopen(file, "r"); if (!debug_source_file) { - if (mame_get_phase() == MAME_PHASE_RUNNING) + if (mame_get_phase(Machine) == MAME_PHASE_RUNNING) debug_console_printf("Cannot open command file '%s'\n", file); else fatalerror("Cannot open command file '%s'", file); diff --git a/src/debug/debugcpu.h b/src/debug/debugcpu.h index 0a0da7793..00f2b08c2 100644 --- a/src/debug/debugcpu.h +++ b/src/debug/debugcpu.h @@ -165,7 +165,7 @@ extern symbol_table *global_symtable; ***************************************************************************/ /* initialization */ -void debug_cpu_init(void); +void debug_cpu_init(running_machine *machine); /* utilities */ const debug_cpu_info *debug_get_cpu_info(int cpunum); diff --git a/src/debug/debugvw.c b/src/debug/debugvw.c index 3ee00e81d..204e571f6 100644 --- a/src/debug/debugvw.c +++ b/src/debug/debugvw.c @@ -115,7 +115,8 @@ struct _debug_view_disasm UINT8 * last_opcode_base; /* last opcode base */ UINT8 * last_opcode_arg_base; /* last opcode arg base */ UINT32 last_change_count; /* last comment change count */ - UINT32 last_backward_pc; /* pc that the view->top_row is pointing to */ + offs_t last_pcbyte; /* last PC byte value */ + UINT32 active_address; /* the address cursor_row is pointing to */ int divider1, divider2; /* left and right divider columns */ int divider3; /* comment divider column */ UINT8 live_tracking; /* track the value of the live expression? */ @@ -228,11 +229,11 @@ static const debug_view_callbacks callback_table[] = debug_view_init - initializes the view system -------------------------------------------------*/ -void debug_view_init(void) +void debug_view_init(running_machine *machine) { /* reset the initial list */ first_view = NULL; - add_exit_callback(debug_view_exit); + add_exit_callback(machine, debug_view_exit); } @@ -240,7 +241,7 @@ void debug_view_init(void) debug_view_exit - exits the view system -------------------------------------------------*/ -void debug_view_exit(void) +void debug_view_exit(running_machine *machine) { /* kill all the views */ while (first_view != NULL) @@ -514,6 +515,11 @@ void debug_view_set_property(debug_view *view, int property, debug_property_info view->update_pending = TRUE; debug_view_end_update(view); } + if (view->type == DVT_DISASSEMBLY) + { + debug_view_disasm *dasmdata = view->extra_data; + dasmdata->active_address = dasmdata->address[view->cursor_row]; + } break; case DVP_CURSOR_COL: @@ -1264,11 +1270,15 @@ static int disasm_alloc(debug_view *view) dasmdata->right_column = (total_comments > 0) ? DVP_DASM_RIGHTCOL_COMMENTS : DVP_DASM_RIGHTCOL_RAW; dasmdata->backwards_steps = 3; dasmdata->dasm_width = DEFAULT_DASM_WIDTH; - dasmdata->last_backward_pc = 0; + dasmdata->active_address = 0; /* stash the extra data pointer */ view->total_rows = DEFAULT_DASM_LINES; view->extra_data = dasmdata; + + /* we support cursors */ + view->supports_cursor = TRUE; + return 1; } @@ -1521,7 +1531,7 @@ static void disasm_recompute(debug_view *view, offs_t pc, int startline, int lin pcbyte = ADDR2BYTE_MASKED(pc, cpuinfo, ADDRESS_SPACE_PROGRAM); /* convert back and set the address of this instruction */ - dasmdata->address[instr] = pcbyte; + dasmdata->address[instr] = pcbyte; // ! This might make more sense as the following : BYTE2ADDR(pcbyte, cpuinfo, ADDRESS_SPACE_PROGRAM); ! sprintf(&destbuf[0], " %0*X ", cpuinfo->space[ADDRESS_SPACE_PROGRAM].logchars, BYTE2ADDR(pcbyte, cpuinfo, ADDRESS_SPACE_PROGRAM)); /* make sure we can translate the address */ @@ -1700,7 +1710,7 @@ static void disasm_update(debug_view *view) view->left_col = 0; /* recompute from where we last recomputed! */ - disasm_recompute(view, dasmdata->last_backward_pc, 0, view->total_rows, original_cpunum); + disasm_recompute(view, BYTE2ADDR(dasmdata->address[0], cpuinfo, ADDRESS_SPACE_PROGRAM), 0, view->total_rows, original_cpunum); } else { @@ -1709,10 +1719,27 @@ static void disasm_update(debug_view *view) view->left_col = 0; disasm_recompute(view, backpc, 0, view->total_rows, original_cpunum); - dasmdata->last_backward_pc = backpc ; } } + /* if the PC is different from last time, reset the cursor to match */ + if (pcbyte != dasmdata->last_pcbyte) + { + /* find the row with the PC on it */ + for (row = 0; row < view->visible_rows; row++) + { + UINT32 effrow = view->top_row + row; + if (effrow >= dasmdata->allocated_rows) + break; + if (pcbyte == dasmdata->address[effrow]) + { + view->cursor_row = effrow; + dasmdata->active_address = pcbyte; + } + } + dasmdata->last_pcbyte = pcbyte; + } + /* loop over visible rows */ for (row = 0; row < view->visible_rows; row++) { @@ -1733,6 +1760,13 @@ static void disasm_update(debug_view *view) { attrib = DCA_CURRENT; disasm_recompute(view, pc, effrow, 1, original_cpunum); + + /* if the PC is different from last time, reset the cursor to match */ + if (pcbyte != dasmdata->last_pcbyte) + { + view->cursor_row = + dasmdata->active_address = pcbyte; + } } /* if we're on a line with a breakpoint, tag it changed */ @@ -1743,6 +1777,13 @@ static void disasm_update(debug_view *view) attrib = DCA_CHANGED; } + /* if we're on the active column and everything is couth, highlight it */ + if (view->cursor_visible && effrow == view->cursor_row) + { + if (dasmdata->active_address == dasmdata->address[effrow]) + attrib |= DCA_SELECTED; + } + /* get the effective string */ len = strlen(data); @@ -1753,7 +1794,8 @@ static void disasm_update(debug_view *view) dest->attrib = (effcol <= dasmdata->divider1 || effcol >= dasmdata->divider2) ? (attrib | DCA_ANCILLARY) : attrib; /* comments are just green for now - maybe they shouldn't even be this? */ - if (effcol >= dasmdata->divider2 && dasmdata->right_column == DVP_DASM_RIGHTCOL_COMMENTS) attrib |= DCA_COMMENT; + if (effcol >= dasmdata->divider2 && dasmdata->right_column == DVP_DASM_RIGHTCOL_COMMENTS) + attrib |= DCA_COMMENT; dest++; col++; @@ -1775,6 +1817,84 @@ static void disasm_update(debug_view *view) } +/*------------------------------------------------- + disasm_handle_char - handle a character typed + within the current view +-------------------------------------------------*/ + +static void disasm_handle_char(debug_view *view, char chval) +{ + debug_view_disasm *dasmdata = view->extra_data; + UINT8 end_buffer = 3; + INT32 temp; + + switch (chval) + { + case DCH_UP: + if (view->cursor_row > 0) + view->cursor_row--; + break; + + case DCH_DOWN: + if (view->cursor_row < view->total_rows - 1) + view->cursor_row++; + break; + + case DCH_PUP: + temp = view->cursor_row - (view->visible_rows - end_buffer); + + if (temp < 0) + view->cursor_row = 0; + else + view->cursor_row = temp; + break; + + case DCH_PDOWN: + temp = view->cursor_row + (view->visible_rows - end_buffer); + + if (temp > (view->total_rows - 1)) + view->cursor_row = (view->total_rows - 1); + else + view->cursor_row = temp; + break; + + case DCH_HOME: /* set the active column to the PC */ + { + const debug_cpu_info *cpuinfo = debug_get_cpu_info(dasmdata->cpunum); + offs_t pc = cpunum_get_reg(dasmdata->cpunum, REG_PC); + int i; + + pc = ADDR2BYTE_MASKED(pc, cpuinfo, ADDRESS_SPACE_PROGRAM); + + /* figure out which row the pc is on */ + for (i = 0; i < dasmdata->allocated_rows; i++) + { + if (dasmdata->address[i] == pc) + view->cursor_row = i; + } + break; + } + + case DCH_CTRLHOME: + view->cursor_row = 0; + break; + + case DCH_CTRLEND: + view->cursor_row = view->total_rows - 1; + break; + } + + /* get the address under the cursor_row */ + dasmdata->active_address = dasmdata->address[view->cursor_row]; + + /* scroll if out of range */ + if (view->cursor_row < view->top_row) + view->top_row = view->cursor_row; + if (view->cursor_row >= view->top_row + view->visible_rows - end_buffer) + view->top_row = view->cursor_row - view->visible_rows + end_buffer; +} + + /*------------------------------------------------- disasm_getprop - return the value of a given property @@ -1810,6 +1930,10 @@ static void disasm_getprop(debug_view *view, UINT32 property, debug_property_inf value->i = dasmdata->dasm_width; break; + case DVP_DASM_ACTIVE_ADDRESS: + value->i = dasmdata->active_address; + break; + default: fatalerror("Attempt to get invalid property %d on debug view type %d", property, view->type); break; @@ -1818,7 +1942,7 @@ static void disasm_getprop(debug_view *view, UINT32 property, debug_property_inf /*------------------------------------------------- - disasm_getprop - set the value + disasm_setprop - set the value of a given property -------------------------------------------------*/ @@ -1902,6 +2026,20 @@ static void disasm_setprop(debug_view *view, UINT32 property, debug_property_inf } break; + case DVP_CHARACTER: + debug_view_begin_update(view); + disasm_handle_char(view, value.i); + view->update_pending = TRUE; + debug_view_end_update(view); + break; + + case DVP_DASM_ACTIVE_ADDRESS: + debug_view_begin_update(view); + dasmdata->active_address = value.i; + view->update_pending = TRUE; + debug_view_end_update(view); + break; + default: fatalerror("Attempt to set invalid property %d on debug view type %d", property, view->type); break; @@ -2079,6 +2217,7 @@ static void memory_set_cursor_pos(debug_view *view, offs_t address, UINT8 shift) debug_view_memory *memdata = view->extra_data; UINT32 bytes_per_row; int curx, cury; + UINT8 end_buffer = 2; /* offset the address by the byte offset */ address -= memdata->byte_offset; @@ -2128,14 +2267,14 @@ static void memory_set_cursor_pos(debug_view *view, offs_t address, UINT8 shift) } /* set the position, clamping to the window bounds */ - view->cursor_col = (curx < 0) ? 0 : (curx >= view->total_cols) ? (view->total_cols - 1) : curx; - view->cursor_row = (cury < 0) ? 0 : (cury >= view->total_rows) ? (view->total_rows - 1) : cury; + view->cursor_col = (curx < 0) ? 0 : (curx >= view->total_cols) ? (view->total_cols - end_buffer) : curx; + view->cursor_row = (cury < 0) ? 0 : (cury >= view->total_rows) ? (view->total_rows - end_buffer) : cury; /* scroll if out of range */ if (view->cursor_row < view->top_row) view->top_row = view->cursor_row; - if (view->cursor_row >= view->top_row + view->visible_rows) - view->top_row = view->cursor_row - view->visible_rows + 1; + if (view->cursor_row >= view->top_row + view->visible_rows - end_buffer) + view->top_row = view->cursor_row - view->visible_rows + end_buffer; } @@ -2325,6 +2464,7 @@ static void memory_handle_char(debug_view *view, char chval) static const char hexvals[] = "0123456789abcdef"; char *hexchar = strchr(hexvals, tolower(chval)); UINT32 bytes_per_row; + UINT32 tempaddr; offs_t maxaddr; offs_t address; UINT8 shift; @@ -2336,12 +2476,68 @@ static void memory_handle_char(debug_view *view, char chval) if (!memory_get_cursor_pos(view, &address, &shift)) return; + /* handle the incoming key */ /* up/down work the same regardless */ bytes_per_row = memdata->chunks_displayed * memdata->bytes_per_chunk; - if (chval == DCH_UP && view->cursor_row > 0) - address -= bytes_per_row; - if (chval == DCH_DOWN && view->cursor_row < view->total_rows - 1) - address += bytes_per_row; + + switch (chval) + { + case DCH_UP: + if (view->cursor_row > 0) + address -= bytes_per_row; + break; + + case DCH_DOWN: + if (view->cursor_row < view->total_rows - 1) + address += bytes_per_row; + break; + + case DCH_PUP: + tempaddr = address - (bytes_per_row * (view->visible_rows-2)) ; + if (tempaddr > address) /* unsigned wraparound */ + address = address % bytes_per_row; + else + address = tempaddr; + break; + + case DCH_PDOWN: + tempaddr = address + (bytes_per_row * (view->visible_rows-2)) ; + if (tempaddr > maxaddr) + address = (maxaddr - (bytes_per_row-1)) + (address % bytes_per_row); + else + address = tempaddr; + break; + + case DCH_HOME: + address -= address % bytes_per_row; + shift = (memdata->bytes_per_chunk * 8) - 1; + break; + + case DCH_CTRLHOME: + address = 0; + shift = (memdata->bytes_per_chunk * 8) - 1; + break; + + case DCH_END: + address += (bytes_per_row - (address % bytes_per_row) - 1); + shift = 0; + break; + + case DCH_CTRLEND: + address = maxaddr; + shift = 0; + break; + + case DCH_CTRLRIGHT: + if (address < maxaddr-memdata->bytes_per_chunk) + address += memdata->bytes_per_chunk; + break; + + case DCH_CTRLLEFT: + if (address >= memdata->bytes_per_chunk) + address -= memdata->bytes_per_chunk; + break; + } /* switch off of the current chunk size */ cpuintrf_push_context(memdata->cpunum); diff --git a/src/debug/debugvw.h b/src/debug/debugvw.h index 5657a9c58..fb76050ac 100644 --- a/src/debug/debugvw.h +++ b/src/debug/debugvw.h @@ -56,6 +56,7 @@ #define DVP_DASM_RIGHTCOL_COMMENTS (3) #define DVP_DASM_BACKWARD_STEPS (104) /* r/w - UINT32 */ #define DVP_DASM_WIDTH (105) /* r/w - UINT32 */ +#define DVP_DASM_ACTIVE_ADDRESS (112) /* r/w - UINT32 */ /* properties available for memory views */ #define DVP_MEM_CPUNUM (100) /* r/w - UINT32 */ @@ -89,7 +90,14 @@ #define DCH_DOWN (2) /* down arrow */ #define DCH_LEFT (3) /* left arrow */ #define DCH_RIGHT (4) /* right arrow */ - +#define DCH_PUP (5) /* page up */ +#define DCH_PDOWN (6) /* page down */ +#define DCH_HOME (7) /* home */ +#define DCH_CTRLHOME (8) /* ctrl+home */ +#define DCH_END (9) /* end */ +#define DCH_CTRLEND (10) /* ctrl+end */ +#define DCH_CTRLRIGHT (11) /* ctrl+right */ +#define DCH_CTRLLEFT (12) /* ctrl+left */ /*************************************************************************** @@ -131,8 +139,8 @@ typedef union _debug_property_info debug_property_info; ***************************************************************************/ /* initialization */ -void debug_view_init(void); -void debug_view_exit(void); +void debug_view_init(running_machine *machine); +void debug_view_exit(running_machine *machine); /* view creation/deletion */ debug_view * debug_view_alloc(int type); diff --git a/src/debug/m0813fnt.c b/src/debug/m0813fnt.c deleted file mode 100644 index b2d25286a..000000000 --- a/src/debug/m0813fnt.c +++ /dev/null @@ -1,276 +0,0 @@ -/***************************************************************** - * Generated from M. Kuhn's Public Domain Unicode fonts - * http://www.cl.cam.ac.uk/~mgk25/unicode.html - *****************************************************************/ - -static UINT8 fontdata[] = -{ - 0x00,0x00,0xAA,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xAA,0x00,0x00, - 0x00,0x3C,0x42,0xA5,0x81,0x99,0x81,0xA5,0x99,0x42,0x3C,0x00,0x00, - 0x00,0x3C,0x7E,0xDB,0xFF,0xE7,0xFF,0xDB,0xE7,0x7E,0x3C,0x00,0x00, - 0x00,0x00,0x00,0x6C,0xFE,0xFE,0xFE,0x7C,0x38,0x10,0x10,0x00,0x00, - 0x00,0x00,0x00,0x00,0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00,0x00, - 0x00,0x10,0x38,0x7C,0x10,0x54,0xFE,0xFE,0x54,0x10,0x38,0x00,0x00, - 0x00,0x00,0x10,0x10,0x38,0x7C,0xFE,0xFE,0x7C,0x10,0x38,0x00,0x00, - 0x00,0x00,0x00,0x00,0x38,0x7C,0x7C,0x7C,0x38,0x00,0x00,0x00,0x00, - 0xFF,0xFF,0xFF,0xFF,0xC3,0x81,0x81,0x81,0x81,0xC3,0xFF,0xFF,0xFF, - 0x00,0x00,0x00,0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C,0x00,0x00, - 0xFF,0xFF,0xFF,0xFF,0xC3,0x99,0xBD,0xBD,0x99,0xC3,0xFF,0xFF,0xFF, - 0x00,0x00,0x00,0x00,0x0E,0x06,0x7A,0x88,0x88,0x88,0x70,0x00,0x00, - 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x10,0x38,0x10,0x00,0x00, - 0x00,0x00,0x18,0x16,0x10,0x10,0x10,0x70,0xF0,0xF0,0x60,0x00,0x00, - 0x00,0x20,0x30,0x28,0x24,0x22,0x62,0xE2,0x46,0x0E,0x04,0x00,0x00, - 0x00,0x00,0x10,0x92,0x44,0x10,0x28,0x10,0x44,0x92,0x10,0x00,0x00, - 0x40,0x60,0x70,0x78,0x7C,0x7E,0x7C,0x78,0x70,0x60,0x40,0x00,0x00, - 0x02,0x06,0x0E,0x1E,0x3E,0x7E,0x3E,0x1E,0x0E,0x06,0x02,0x00,0x00, - 0x00,0x00,0x00,0x10,0x38,0x54,0x10,0x10,0x54,0x38,0x10,0x00,0x00, - 0x00,0x00,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x00,0x24,0x00,0x00, - 0x00,0x00,0x3E,0x74,0x74,0x74,0x34,0x14,0x14,0x14,0x14,0x00,0x00, - 0x00,0x18,0x24,0x20,0x18,0x24,0x24,0x18,0x04,0x24,0x18,0x00,0x00, - 0x00,0x00,0x00,0x00,0x7E,0x7E,0x7E,0x7E,0x00,0x00,0x00,0x00,0x00, - 0x00,0x10,0x38,0x54,0x10,0x10,0x10,0x54,0x38,0x10,0xFE,0x00,0x00, - 0x00,0x00,0x10,0x38,0x54,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x54,0x38,0x10,0x00,0x00, - 0x00,0x00,0x00,0x00,0x04,0x02,0x7F,0x02,0x04,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x20,0x40,0xFE,0x40,0x20,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x00, - 0x00,0x00,0x00,0x00,0x24,0x42,0xFF,0x42,0x24,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x18,0x18,0x3C,0x3C,0x7E,0x7E,0xFF,0xFF,0x00,0x00, - 0x00,0x00,0x00,0xFF,0xFF,0x7E,0x7E,0x3C,0x3C,0x18,0x18,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,0x00, - 0x00,0x00,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x24,0x24,0x7E,0x24,0x7E,0x24,0x24,0x00,0x00,0x00, - 0x00,0x00,0x10,0x3C,0x50,0x50,0x38,0x14,0x14,0x78,0x10,0x00,0x00, - 0x00,0x00,0x22,0x52,0x24,0x08,0x08,0x10,0x24,0x2A,0x44,0x00,0x00, - 0x00,0x00,0x00,0x00,0x30,0x48,0x48,0x30,0x4A,0x44,0x3A,0x00,0x00, - 0x00,0x00,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x04,0x08,0x08,0x10,0x10,0x10,0x08,0x08,0x04,0x00,0x00, - 0x00,0x00,0x20,0x10,0x10,0x08,0x08,0x08,0x10,0x10,0x20,0x00,0x00, - 0x00,0x00,0x00,0x00,0x24,0x18,0x7E,0x18,0x24,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x30,0x40,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x38,0x10,0x00, - 0x00,0x00,0x02,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x80,0x00,0x00, - 0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00, - 0x00,0x00,0x10,0x30,0x50,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x7E,0x00,0x00, - 0x00,0x00,0x7E,0x02,0x04,0x08,0x1C,0x02,0x02,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x04,0x0C,0x14,0x24,0x44,0x44,0x7E,0x04,0x04,0x00,0x00, - 0x00,0x00,0x7E,0x40,0x40,0x5C,0x62,0x02,0x02,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x1C,0x20,0x40,0x40,0x5C,0x62,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x7E,0x02,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x42,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x42,0x46,0x3A,0x02,0x02,0x04,0x38,0x00,0x00, - 0x00,0x00,0x00,0x00,0x10,0x38,0x10,0x00,0x00,0x10,0x38,0x10,0x00, - 0x00,0x00,0x00,0x00,0x10,0x38,0x10,0x00,0x00,0x38,0x30,0x40,0x00, - 0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x02,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, - 0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x42,0x02,0x04,0x08,0x08,0x00,0x08,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x42,0x4E,0x52,0x56,0x4A,0x40,0x3C,0x00,0x00, - 0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x00,0x00, - 0x00,0x00,0x78,0x44,0x42,0x44,0x78,0x44,0x42,0x44,0x78,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x40,0x40,0x40,0x40,0x40,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x78,0x44,0x42,0x42,0x42,0x42,0x42,0x44,0x78,0x00,0x00, - 0x00,0x00,0x7E,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x7E,0x00,0x00, - 0x00,0x00,0x7E,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0x40,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x40,0x40,0x40,0x4E,0x42,0x46,0x3A,0x00,0x00, - 0x00,0x00,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0x00,0x00, - 0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, - 0x00,0x00,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x44,0x38,0x00,0x00, - 0x00,0x00,0x42,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x42,0x00,0x00, - 0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x00, - 0x00,0x00,0x82,0x82,0xC6,0xAA,0x92,0x92,0x82,0x82,0x82,0x00,0x00, - 0x00,0x00,0x42,0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x42,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x7C,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x40,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x52,0x4A,0x3C,0x02,0x00, - 0x00,0x00,0x7C,0x42,0x42,0x42,0x7C,0x50,0x48,0x44,0x42,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x40,0x40,0x3C,0x02,0x02,0x42,0x3C,0x00,0x00, - 0x00,0x00,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x82,0x82,0x44,0x44,0x44,0x28,0x28,0x28,0x10,0x00,0x00, - 0x00,0x00,0x82,0x82,0x82,0x82,0x92,0x92,0x92,0xAA,0x44,0x00,0x00, - 0x00,0x00,0x82,0x82,0x44,0x28,0x10,0x28,0x44,0x82,0x82,0x00,0x00, - 0x00,0x00,0x82,0x82,0x44,0x28,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 0x00,0x00,0x7E,0x02,0x04,0x08,0x10,0x20,0x40,0x40,0x7E,0x00,0x00, - 0x00,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3C,0x00,0x00, - 0x00,0x00,0x80,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x02,0x00,0x00, - 0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00,0x00, - 0x00,0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00, - 0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x3C,0x02,0x3E,0x42,0x46,0x3A,0x00,0x00, - 0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x62,0x5C,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x40,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x02,0x02,0x02,0x3A,0x46,0x42,0x42,0x46,0x3A,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x1C,0x22,0x20,0x20,0x7C,0x20,0x20,0x20,0x20,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x3A,0x44,0x44,0x38,0x40,0x3C,0x42,0x3C, - 0x00,0x00,0x40,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0x00,0x00, - 0x00,0x00,0x00,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, - 0x00,0x00,0x00,0x04,0x00,0x0C,0x04,0x04,0x04,0x04,0x44,0x44,0x38, - 0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x70,0x48,0x44,0x42,0x00,0x00, - 0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0xEC,0x92,0x92,0x92,0x92,0x82,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x5C,0x62,0x42,0x62,0x5C,0x40,0x40,0x40, - 0x00,0x00,0x00,0x00,0x00,0x3A,0x46,0x42,0x46,0x3A,0x02,0x02,0x02, - 0x00,0x00,0x00,0x00,0x00,0x5C,0x22,0x20,0x20,0x20,0x20,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x30,0x0C,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x00,0x20,0x20,0x7C,0x20,0x20,0x20,0x22,0x1C,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x3A,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x28,0x28,0x10,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x82,0x82,0x92,0x92,0xAA,0x44,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x42,0x24,0x18,0x18,0x24,0x42,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x46,0x3A,0x02,0x42,0x3C, - 0x00,0x00,0x00,0x00,0x00,0x7E,0x04,0x08,0x10,0x20,0x7E,0x00,0x00, - 0x00,0x00,0x0E,0x10,0x10,0x08,0x30,0x08,0x10,0x10,0x0E,0x00,0x00, - 0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 0x00,0x00,0x70,0x08,0x08,0x10,0x0C,0x10,0x08,0x08,0x70,0x00,0x00, - 0x00,0x00,0x24,0x54,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x7E,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x40,0x40,0x40,0x40,0x40,0x42,0x3C,0x08,0x10, - 0x00,0x00,0x28,0x28,0x00,0x44,0x44,0x44,0x44,0x44,0x3A,0x00,0x00, - 0x00,0x00,0x08,0x10,0x00,0x3C,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x18,0x24,0x00,0x3C,0x02,0x3E,0x42,0x46,0x3A,0x00,0x00, - 0x00,0x00,0x24,0x24,0x00,0x3C,0x02,0x3E,0x42,0x46,0x3A,0x00,0x00, - 0x00,0x00,0x10,0x08,0x00,0x3C,0x02,0x3E,0x42,0x46,0x3A,0x00,0x00, - 0x00,0x18,0x24,0x18,0x00,0x3C,0x02,0x3E,0x42,0x46,0x3A,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x40,0x40,0x42,0x3C,0x08,0x10, - 0x00,0x00,0x18,0x24,0x00,0x3C,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x24,0x24,0x00,0x3C,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x10,0x08,0x00,0x3C,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x48,0x48,0x00,0x30,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, - 0x00,0x00,0x30,0x48,0x00,0x30,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, - 0x00,0x00,0x20,0x10,0x00,0x30,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, - 0x00,0x24,0x24,0x00,0x18,0x24,0x42,0x42,0x7E,0x42,0x42,0x00,0x00, - 0x00,0x18,0x24,0x18,0x18,0x24,0x42,0x42,0x7E,0x42,0x42,0x00,0x00, - 0x00,0x08,0x10,0x00,0x7E,0x40,0x40,0x78,0x40,0x40,0x7E,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x6C,0x12,0x7C,0x90,0x92,0x6C,0x00,0x00, - 0x00,0x00,0x6E,0x90,0x90,0x90,0x9C,0xF0,0x90,0x90,0x9E,0x00,0x00, - 0x00,0x00,0x18,0x24,0x00,0x3C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x24,0x24,0x00,0x3C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x20,0x10,0x00,0x3C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x18,0x24,0x00,0x44,0x44,0x44,0x44,0x44,0x3A,0x00,0x00, - 0x00,0x00,0x20,0x10,0x00,0x44,0x44,0x44,0x44,0x44,0x3A,0x00,0x00, - 0x00,0x00,0x24,0x24,0x00,0x42,0x42,0x42,0x46,0x3A,0x02,0x42,0x3C, - 0x00,0x44,0x44,0x00,0x7C,0x82,0x82,0x82,0x82,0x82,0x7C,0x00,0x00, - 0x00,0x24,0x24,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x10,0x38,0x54,0x50,0x50,0x54,0x38,0x10,0x00,0x00,0x00, - 0x00,0x00,0x1C,0x22,0x20,0x70,0x20,0x20,0x20,0x62,0xDC,0x00,0x00, - 0x00,0x00,0x82,0x82,0x44,0x28,0x7C,0x10,0x7C,0x10,0x10,0x00,0x00, - 0x00,0x00,0x7C,0x42,0xFF,0x42,0x7C,0x40,0x40,0x40,0x40,0x00,0x00, - 0x00,0x00,0x0C,0x12,0x10,0x10,0x3C,0x10,0x10,0x10,0x10,0x90,0x60, - 0x00,0x00,0x04,0x08,0x00,0x3C,0x02,0x3E,0x42,0x46,0x3A,0x00,0x00, - 0x00,0x00,0x10,0x20,0x00,0x30,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, - 0x00,0x00,0x08,0x10,0x00,0x3C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x08,0x10,0x00,0x44,0x44,0x44,0x44,0x44,0x3A,0x00,0x00, - 0x00,0x00,0x32,0x4C,0x00,0x5C,0x62,0x42,0x42,0x42,0x42,0x00,0x00, - 0x00,0x64,0x98,0x00,0x82,0xC2,0xA2,0x92,0x8A,0x86,0x82,0x00,0x00, - 0x00,0x00,0x38,0x04,0x3C,0x44,0x3C,0x00,0x7C,0x00,0x00,0x00,0x00, - 0x00,0x00,0x30,0x48,0x48,0x30,0x00,0x78,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x10,0x00,0x10,0x10,0x20,0x40,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x00,0x00,0x00, - 0x00,0x40,0xC0,0x40,0x40,0x4C,0xF2,0x02,0x0C,0x10,0x1E,0x00,0x00, - 0x00,0x40,0xC0,0x40,0x40,0x42,0xE6,0x0A,0x12,0x1A,0x06,0x00,0x00, - 0x00,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, - 0x00,0x00,0x00,0x12,0x24,0x48,0x90,0x48,0x24,0x12,0x00,0x00,0x00, - 0x00,0x00,0x00,0x90,0x48,0x24,0x12,0x24,0x48,0x90,0x00,0x00,0x00, - 0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00, - 0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA, - 0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF, - 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - 0x10,0x10,0x10,0x10,0x10,0x10,0xF0,0x10,0x10,0x10,0x10,0x10,0x10, - 0x10,0x10,0x10,0x10,0x10,0xF0,0x10,0xF0,0x10,0x10,0x10,0x10,0x10, - 0x28,0x28,0x28,0x28,0x28,0x28,0xE8,0x28,0x28,0x28,0x28,0x28,0x28, - 0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x28,0x28,0x28,0x28,0x28,0x28, - 0x00,0x00,0x00,0x00,0x00,0xF0,0x10,0xF0,0x10,0x10,0x10,0x10,0x10, - 0x28,0x28,0x28,0x28,0x28,0xE8,0x08,0xE8,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, - 0x00,0x00,0x00,0x00,0x00,0xF8,0x08,0xE8,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0xE8,0x08,0xF8,0x00,0x00,0x00,0x00,0x00, - 0x28,0x28,0x28,0x28,0x28,0x28,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, - 0x10,0x10,0x10,0x10,0x10,0xF0,0x10,0xF0,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0x10,0x10, - 0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0x00,0x00,0x00,0x00,0x00,0x00, - 0x10,0x10,0x10,0x10,0x10,0x10,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x10,0x10,0x10,0x10,0x10,0x10, - 0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0x10,0x10,0x10,0x10,0x10,0x10, - 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, - 0x10,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x10,0x10, - 0x10,0x10,0x10,0x10,0x10,0x1F,0x10,0x1F,0x10,0x10,0x10,0x10,0x10, - 0x28,0x28,0x28,0x28,0x28,0x28,0x2F,0x28,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x2F,0x20,0x3F,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x3F,0x20,0x2F,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0xEF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xEF,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x2F,0x20,0x2F,0x28,0x28,0x28,0x28,0x28, - 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, - 0x28,0x28,0x28,0x28,0x28,0xEF,0x00,0xEF,0x28,0x28,0x28,0x28,0x28, - 0x10,0x10,0x10,0x10,0x10,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00, - 0x28,0x28,0x28,0x28,0x28,0x28,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0xFF,0x10,0x10,0x10,0x10,0x10, - 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x28,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x00,0x00,0x00,0x00,0x00,0x00, - 0x10,0x10,0x10,0x10,0x10,0x1F,0x10,0x1F,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x1F,0x10,0x1F,0x10,0x10,0x10,0x10,0x10, - 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x28,0x28,0x28,0x28,0x28,0x28, - 0x28,0x28,0x28,0x28,0x28,0x28,0xFF,0x28,0x28,0x28,0x28,0x28,0x28, - 0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0xFF,0x10,0x10,0x10,0x10,0x10, - 0x10,0x10,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x10,0x10,0x10,0x10,0x10,0x10, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0, - 0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x3A,0x46,0x42,0x46,0x4A,0x32,0x00,0x00, - 0x00,0x00,0x38,0x44,0x44,0x48,0x50,0x4C,0x42,0x42,0x5C,0x00,0x00, - 0x00,0x00,0x7E,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0xFE,0x44,0x44,0x44,0x44,0x44,0x00,0x00, - 0x00,0x00,0x7E,0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x7E,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x3E,0x48,0x44,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x66,0x5A,0x40,0x00, - 0x00,0x00,0x00,0x00,0x00,0x7E,0x10,0x10,0x10,0x12,0x0C,0x00,0x00, - 0x00,0x00,0x10,0x7C,0x92,0x92,0x92,0x92,0x92,0x7C,0x10,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x7C,0x82,0x82,0x82,0x82,0x82,0x6C,0x28,0xEE,0x00,0x00, - 0x00,0x00,0x3C,0x42,0x20,0x3C,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x6C,0x92,0x92,0x6C,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x4C,0x92,0x92,0x92,0x92,0x7C,0x10,0x10, - 0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x38,0x40,0x42,0x3C,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x7E,0x00,0x7E,0x00,0x00,0x00, - 0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x7C,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0xE0,0x18,0x06,0x18,0xE0,0x00,0xFE,0x00,0x00, - 0x00,0x00,0x00,0x00,0x0E,0x30,0xC0,0x30,0x0E,0x00,0xFE,0x00,0x00, - 0x00,0x0C,0x12,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, - 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00, - 0x00,0x00,0x00,0x10,0x10,0x00,0x7C,0x00,0x10,0x10,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x60,0x92,0x0C,0x60,0x92,0x0C,0x00,0x00,0x00, - 0x00,0x00,0x18,0x24,0x24,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x18,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x02,0x02,0x04,0x04,0x08,0x08,0x90,0x50,0x20,0x00,0x00, - 0x00,0x00,0x00,0x38,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x30,0x48,0x08,0x30,0x40,0x78,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -}; - -static const gfx_layout fontlayout = -{ - 8,13, /* 8*13 characters */ - 256, /* 256 characters */ - 1, /* 1 bit per pixel */ - { 0 }, - { 0, 1, 2, 3, 4, 5, 6, 7}, /* straightforward layout */ - { 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}, - 8*13 /* every char takes 13 consecutive bytes */ -}; diff --git a/src/debug/mamedbg.c b/src/debug/mamedbg.c deleted file mode 100644 index 855b1ef8a..000000000 --- a/src/debug/mamedbg.c +++ /dev/null @@ -1,5404 +0,0 @@ -/**************************************************************************** - - mamedbg.c - - MAME debugger V0.54 - Juergen Buchmueller - - Copyright (c) 1996-2006, Nicola Salmoria and the MAME Team. - Visit http://mamedev.org for licensing and usage restrictions. - - Based on code found in the preivous version of the MAME debugger - written by: Martin Scragg, John Butler, Mirko Buffoni - Chris Moore, Aaron Giles, Ernesto Corvi - - Online help is available by pressing F1 (context sensitive!) - - TODO: - - Add more display modes for the memory windows (binary? octal? decimal?) - -****************************************************************************/ - -#include -#include -#include "driver.h" -#include "osdepend.h" -#include "mamedbg.h" -#include "debugger.h" -#include "eainfo.h" -#include "window.h" - - -#ifndef INVALID -#define INVALID -1 -#endif - -/**************************************************************************** - * Externals (define in the header files) - ****************************************************************************/ -/* Long(er) function names, short macro names... */ -#define ABITS (activecpu_addrbus_width(ADDRESS_SPACE_PROGRAM)) -#define AMASK (active_address_space[ADDRESS_SPACE_PROGRAM].addrmask | 3) -#define AMASKS(s) (active_address_space[s].addrmask | 3) -#define ASHIFT (activecpu_addrbus_shift(ADDRESS_SPACE_PROGRAM)) -#define DALIGN (activecpu_databus_width(ADDRESS_SPACE_PROGRAM)/8) -#define IALIGN (activecpu_min_instruction_bytes() < DALIGN ? activecpu_min_instruction_bytes() : DALIGN) -#define INSTL activecpu_max_instruction_bytes() -#define ENDIAN activecpu_endianness() - -#define RDMEM(a) (program_read_byte(a)) -#define WRMEM(a,v) (program_write_byte(a,v)) -INLINE UINT8 RDSPC(int space, offs_t addr) -{ - switch (activecpu_databus_width(space)/8) - { - case 1: - return (*active_address_space[space].accessors->read_byte)(addr); - case 2: - return (*active_address_space[space].accessors->read_word)(addr) >> (8 * ((addr & 1) ^ (ENDIAN == CPU_IS_BE ? 1 : 0))); - case 4: - return (*active_address_space[space].accessors->read_dword)(addr) >> (8 * ((addr & 3) ^ (ENDIAN == CPU_IS_BE ? 3 : 0))); - case 8: - return (*active_address_space[space].accessors->read_qword)(addr) >> (8 * ((addr & 7) ^ (ENDIAN == CPU_IS_BE ? 7 : 0))); - } - return 0; -} -#define WRSPC(s,a,v) do { if (active_address_space[s].accessors->write_byte) (*active_address_space[s].accessors->write_byte)(a,v); } while (0) -#define RDINT(a) (program_read_byte(a)) -#define WRINT(a,v) (program_write_byte(a,v)) - -/**************************************************************************** - * Globals - ****************************************************************************/ -int debug_key_pressed = 0; /* set to non zero to break into the debugger */ -int debug_key_delay = 0; /* set to 0x7ffe to force keyboard check on next update */ -int debug_trace_delay = 0; /* set to 0 to force a screen update */ -UINT8 debugger_bitmap_changed; -UINT8 debugger_focus; - -/**************************************************************************** - * Limits - ****************************************************************************/ -#define MAX_DATA 512 /* Maximum memory size in bytes of a dump window */ -#define MAX_MEM 2 /* You can't redefine this... too easy */ - -#define MAX_LOOPS 64 /* Maximum loop addresses recognized by trace */ - -#define MAX_HIST 16 /* Maximum history depth */ - -#define EDIT_CMDS 0 -#define EDIT_REGS 1 /* Just the order of the windows */ -#define EDIT_DASM 2 -#define EDIT_MEM1 3 -#define EDIT_MEM2 4 - -#define DBG_WINDOWS 5 - -/* Some convenience macros to address the cpu'th window */ -#define WIN_CMDS(cpu) (cpu*DBG_WINDOWS+EDIT_CMDS) -#define WIN_REGS(cpu) (cpu*DBG_WINDOWS+EDIT_REGS) -#define WIN_DASM(cpu) (cpu*DBG_WINDOWS+EDIT_DASM) -#define WIN_MEM(cpu,n) (cpu*DBG_WINDOWS+EDIT_MEM1+n) -#define WIN_MEM1(cpu) (cpu*DBG_WINDOWS+EDIT_MEM1) -#define WIN_MEM2(cpu) (cpu*DBG_WINDOWS+EDIT_MEM2) -#define WIN_HELP (MAX_WINDOWS-1) -#define WIN_MSGBOX (MAX_WINDOWS-2) - -enum { - MODE_HEX_UINT8, - MODE_HEX_UINT16, - MODE_HEX_UINT32, - MODE_HEX_UINT64, - MODE_HEX_COUNT -}; - -enum { - MODE_CHR_HEX, - MODE_CHR_XLATE, - MODE_CHR_PLAIN, - MODE_CHR_COUNT -}; - -#define UINT16_XOR_LE(o) (((o)&~1)|(((o)&1)^1)) -#define UINT32_XOR_LE(o) (((o)&~3)|(((o)&3)^3)) -#define UINT64_XOR_LE(o) (((o)&~7)|(((o)&7)^7)) -#define HOST_XOR_LE 0 -#define UINT16_XOR_BE(o) (o) -#define UINT32_XOR_BE(o) (o) -#define UINT64_XOR_BE(o) (o) -#define HOST_XOR_BE 0 - -/**************************************************************************** - * Statics - ****************************************************************************/ -static int first_time = 1; - -static int active_cpu = INVALID; -static int previous_active_cpu = INVALID; -static int total_cpu = 0; -static int cputype = 0; - -static int dbg_fast = 0; -static int dbg_step = 0; -static int dbg_trace = 0; -static int dbg_update = 0; -static int dbg_update_cur = 0; -static int dbg_active = 0; -static int dbg_trace_delay = 0; - -/* 0 = dont, 1 = do allow squeezed display w/alternating dim, bright colors */ -static int dbg_mem_squeezed = 0; -/* 0 = display disassembly only, 1 = display opcodes too */ -static int dbg_dasm_opcodes = 0; -/* 0 = default, 1 = lower or 2 = upper case */ -static int dbg_dasm_case = 0; -/* 0 = absolute, 1 = relative format for relative jumps/branches */ -static int dbg_dasm_relative_jumps = 0; - -static const char *dbg_info_once = NULL; - -static int dbg_show_scanline = 1; - -/**************************************************************************** - * Color settings - ****************************************************************************/ -#define COLOR_NAMES \ - "BLACK\0" \ - "BLUE\0" \ - "GREEN\0" \ - "CYAN\0" \ - "RED\0" \ - "MAGENTA\0" \ - "BROWN\0" \ - "LIGHTGRAY\0" \ - "DARKGRAY\0" \ - "LIGHTBLUE\0" \ - "LIGHTGREEN\0" \ - "LIGHTCYAN\0" \ - "LIGHTRED\0" \ - "LIGHTMAGENTA\0" \ - "YELLOW\0" \ - "WHITE\0" - -#define ELEMENT_NAMES \ - "TITLE\0" \ - "FRAME\0" \ - "REGS\0" \ - "DASM\0" \ - "MEM1\0" \ - "MEM2\0" \ - "CMDS\0" \ - "BRK_EXEC\0" \ - "BRK_DATA\0" \ - "BRK_REGS\0" \ - "ERROR\0" \ - "HELP\0" \ - "PROMPT\0" \ - "CHANGES\0" \ - "PC\0" \ - "CURSOR\0" - -enum ELEMENT { - E_TITLE, - E_FRAME, - E_REGS, - E_DASM, - E_MEM1, - E_MEM2, - E_CMDS, - E_BRK_EXEC, - E_BRK_DATA, - E_BRK_REGS, - E_ERROR, - E_HELP, - E_PROMPT, - E_CHANGES, - E_PC, - E_CURSOR, - E_COUNT -}; - -static UINT8 cur_col[E_COUNT] = { - COLOR_TITLE, - COLOR_FRAME, - COLOR_REGS, - COLOR_DASM, - COLOR_MEM1, - COLOR_MEM2, - COLOR_CMDS, - COLOR_BRK_EXEC, - COLOR_BRK_DATA, - COLOR_BRK_REGS, - COLOR_ERROR, - COLOR_HELP, - COLOR_PROMPT, - COLOR_CHANGES, - COLOR_PC, - COLOR_CURSOR, -}; - -static UINT8 def_col[E_COUNT] = { - COLOR_TITLE, - COLOR_FRAME, - COLOR_REGS, - COLOR_DASM, - COLOR_MEM1, - COLOR_MEM2, - COLOR_CMDS, - COLOR_BRK_EXEC, - COLOR_BRK_DATA, - COLOR_BRK_REGS, - COLOR_ERROR, - COLOR_HELP, - COLOR_PROMPT, - COLOR_CHANGES, - COLOR_PC, - COLOR_CURSOR, -}; - -/**************************************************************************** - * Code to ASCII translation table; may be redefined (later) - ****************************************************************************/ -static char trans_table[256] = { - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', - ' ','!','"','#','$','%','&', 39,'(',')','*','+',',','-','.','/', - '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?', - '@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O', - 'P','Q','R','S','T','U','V','W','X','Y','Z','[', 92,']','^','_', - '`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', - 'p','q','r','s','t','u','v','w','x','y','z','{','|','}','~','.', - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', - '.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.', -}; - -/**************************************************************************** - * Function prototypes - ****************************************************************************/ -static unsigned get_register_id( char **parg, int *size ); -static const char *get_register_name( int id ); -static unsigned get_register_or_value( char **parg, int *size ); -static void trace_init( const char *filename, UINT8 *regs ); -static void trace_done( void ); -static void trace_select( void ); -static void trace_output( void ); - -static int hit_brk_exec( void ); -static int hit_brk_data( void ); -static int hit_brk_regs( void ); - -static const char *name_rom( const char *type, int region, unsigned *base, unsigned start ); -static const char *name_rdmem( unsigned base ); -static const char *name_wrmem( unsigned base ); -static const char *name_memory( unsigned base ); - -static int win_create(int n, UINT8 prio, int x, int y, int w, int h, - UINT8 co_text, UINT8 co_frame, UINT8 chr, UINT32 attributes); -static int DECL_SPEC win_msgbox( UINT8 color, const char *title, const char *fmt, ... ); -static void dbg_open_windows( void ); -static void dbg_close_windows( void ); - -static unsigned dasm_line( unsigned pc, int times ); - -static void dump_regs( void ); -static unsigned dump_dasm( unsigned pc ); -static void dump_mem_hex( int which, unsigned len_addr, unsigned len_data ); -static void dump_mem( int which, int set_title ); - -static int edit_cmds_info( void ); -static int edit_cmds_parse( char *cmdline ); -static void edit_cmds_append( const char *src ); - -static void edit_regs( void ); -static void edit_dasm( void ); -static void edit_mem( int which ); -static void edit_cmds(void); - -static void cmd_help( void ); -static void cmd_default( int code ); - -static void cmd_display_memory( void ); -static void cmd_edit_memory( void ); -static void cmd_set_memory_mode( void ); -static void cmd_fast( void ); -static void cmd_go_break( void ); -static void cmd_jump( void ); -static void cmd_replace_register( void ); -static void cmd_brk_exec_set( void ); -static void cmd_brk_exec_clear( void ); -static void cmd_brk_regs_set( void ); -static void cmd_brk_regs_clear( void ); -static void cmd_brk_data_set( void ); -static void cmd_brk_data_clear( void ); -static void cmd_here( void ); -static void cmd_dasm_to_file( void ); -static void cmd_dump_to_file( void ); -static void cmd_trace_to_file( void ); -static void cmd_save_to_file( void ); -static void cmd_set_ignore( void ); -static void cmd_set_observe( void ); -static void cmd_set_key_repeat( void ); -static void cmd_set_dasm_case( void ); -static void cmd_set_dasm_opcodes( void ); -static void cmd_set_dasm_relative_jumps( void ); -static void cmd_set_mem_squeezed( void ); -static void cmd_set_element_color( void ); -static void cmd_brk_exec_toggle( void ); -static void cmd_brk_data_toggle( void ); -static void cmd_toggle_scanlines( void ); - -static void cmd_switch_window( void ); -static void cmd_dasm_up( void ); -static void cmd_dasm_down( void ); -static void cmd_dasm_page_up( void ); -static void cmd_dasm_page_down( void ); -static void cmd_dasm_home( void ); -static void cmd_dasm_end( void ); -static void cmd_dasm_hist_follow( void ); -static void cmd_dasm_hist_back( void ); -static void cmd_run_to_cursor( void ); -static void cmd_focus_next_cpu( void ); -static void cmd_step( void ); -static void cmd_animate( void ); -static void cmd_step_over( void ); -static void cmd_go( void ); -static void cmd_search_memory( void ); - -/**************************************************************************** - * Generic structure for saving points in the 'follow history' - ****************************************************************************/ -typedef struct { - UINT32 dasm_top; /* previous top of window PC */ - UINT32 dasm_cur; /* previous cursor PC */ - UINT32 mem1_base; /* previous memory 1 base address */ - UINT32 mem1_offset; /* previous memory 1 offset */ - UINT32 mem1_nibble; /* previous memory 1 nibble */ -} s_hist; - -/**************************************************************************** - * Symbol table entry - ****************************************************************************/ -typedef struct { - UINT32 value; /* value of the symbol */ - INT32 access; /* access mode (EA_... enum) */ - INT32 size; /* size of the element */ - UINT32 times; /* repeat how many times */ - char name[47+1]; /* name of the symbol */ -} s_symbol; - -/**************************************************************************** - * Generic structure for editing values - * x,y are the coordinates inside a window - * w is the width in hex digits (aka nibbles) - * n is the distance of the hex part from the start of the output (register) - ****************************************************************************/ -typedef struct { - UINT8 x,y,w,n; -} s_edit; - -/**************************************************************************** - * Register display and editing structure - ****************************************************************************/ -typedef struct { - UINT32 backup[MAX_REGS]; /* backup register values */ - UINT32 newval[MAX_REGS]; /* new register values */ - s_edit edit[MAX_REGS]; /* list of x,y,w triplets for the register values */ - char name[MAX_REGS][15+1]; /* ...fifteen characters enough!? */ - UINT8 id[MAX_REGS]; /* the ID of the register (activecpu_get_reg/activecpu_set_reg) */ - UINT32 max_width; /* maximum width of any dumped register */ - INT32 idx; /* index of current register */ - INT32 count; /* number of registers */ - INT32 nibble; /* edit nibble */ - INT32 changed; - INT32 top; - INT32 base; -} s_regs; - -/**************************************************************************** - * Memory display and editing structure - ****************************************************************************/ -typedef struct { - UINT8 backup[MAX_DATA]; /* backup data */ - UINT8 newval[MAX_DATA]; /* newly read data */ - s_edit edit[MAX_DATA]; /* list of x,y,w triplets for the memory elements */ - UINT32 base; /* current base address */ - UINT32 address; /* current cursor address */ - INT32 offset; /* edit offset */ - INT32 nibble; /* edit nibble */ - INT32 bytes; /* number of bytes per edit line */ - INT32 width; /* width in nibbles of the edit line */ - INT32 size; /* number of bytes in the edit window */ - UINT8 mode; /* 0 bytes, 1 words, 2 dword */ - UINT8 ascii; /* display ASCII values */ - UINT8 space; /* address space (0xff = internal) */ - UINT8 changed; -} s_mem; - -/**************************************************************************** - * Disassembly structure - ****************************************************************************/ -typedef struct { - UINT32 pc_cpu; /* The CPUs PC */ - UINT32 pc_top; /* Top of the disassembly window PC */ - UINT32 pc_cur; /* Cursor PC */ - UINT32 pc_end; /* End of the disassembly window PC */ - UINT32 dst_ea_value; /* effective destination address or value */ - INT32 dst_ea_access; /* destination access mode */ - INT32 dst_ea_size; /* destination access size */ - UINT32 src_ea_value; /* effective source address or value */ - INT32 src_ea_access; /* source access mode */ - INT32 src_ea_size; /* source access size */ -} s_dasm; - -/**************************************************************************** - * Tracing structure - ****************************************************************************/ -typedef struct { - UINT32 last_pc[MAX_LOOPS]; - UINT8 regs[MAX_REGS]; - FILE *file; - INT32 iters; - INT32 loops; -} s_trace; - -/**************************************************************************** - * Debugger structure. There is one instance per CPU - ****************************************************************************/ -typedef struct { - UINT32 ignore; /* ignore this CPU while debugging? */ - UINT32 next_pc; - UINT32 prev_sp; - - /* Break- and Watchpoints */ - UINT32 brk_exec; /* execution breakpoint (program counter) */ - UINT32 brk_exec_times; /* how many times to ignore the breakpoint */ - UINT32 brk_exec_reset; /* reset value for times once it counted down */ - UINT32 brk_data; /* data watchpoint (memory address) */ - UINT32 brk_data_oldval; /* old data watchpoint value */ - UINT32 brk_data_newval; /* expected new value (INVALID: always break) */ - UINT32 brk_regs; /* register watchpoint (register ID) */ - UINT32 brk_regs_oldval; /* old register watchpoint value */ - UINT32 brk_regs_newval; /* expected new value (INVALID: always break) */ - UINT32 brk_regs_mask; /* mask register value before comparing */ - UINT32 brk_temp; /* temporary execution breakpoint */ - - s_regs regs; - s_dasm dasm; - s_mem mem[MAX_MEM]; - s_trace trace; - INT32 hist_cnt; - s_hist hist[MAX_HIST]; - - char cmdline[80+1]; - UINT8 window; /* edit what: cmds, regs, dasm, mem1, mem2 */ - -} s_dbg; - -static s_dbg dbg[MAX_CPU]; - -/* Covenience macros... keep the code readable */ -#define DBG dbg[active_cpu] -#define DBGREGS dbg[active_cpu].regs -#define DBGDASM dbg[active_cpu].dasm -#define DBGMEM dbg[active_cpu].mem -#define TRACE dbg[tracecpu].trace - -#define CMD dbg[active_cpu].cmdline - -/**************************************************************************** - * Graphics output using debug_bitmap - ****************************************************************************/ - -static int cursor_x, cursor_y, cursor_on; - -/* This will be intialized depending on the game framerate */ -static int dbg_key_repeat = 4; - -UINT8 debugger_idle; - -rgb_t debugger_palette[] = { - MAKE_RGB(0x00,0x00,0x00), /* black */ - MAKE_RGB(0x00,0x00,0x7f), /* blue */ - MAKE_RGB(0x00,0x7f,0x00), /* green */ - MAKE_RGB(0x00,0x7f,0x7f), /* cyan */ - MAKE_RGB(0x7f,0x00,0x00), /* red */ - MAKE_RGB(0x7f,0x00,0x7f), /* magenta */ - MAKE_RGB(0x7f,0x7f,0x00), /* brown */ - MAKE_RGB(0x7f,0x7f,0x7f), /* ltgray */ - MAKE_RGB(0x5f,0x5f,0x5f), /* dkgray */ - MAKE_RGB(0x00,0x00,0xff), /* ltblue */ - MAKE_RGB(0x00,0xff,0x00), /* ltgreen */ - MAKE_RGB(0x00,0xff,0xff), /* ltcyan */ - MAKE_RGB(0xff,0x00,0x00), /* ltred */ - MAKE_RGB(0xff,0x00,0xff), /* ltmagenta */ - MAKE_RGB(0xff,0xff,0x00), /* yellow */ - MAKE_RGB(0xff,0xff,0xff) /* white */ -}; - - -#include "m0813fnt.c" - - -gfx_element *build_debugger_font(void) -{ - gfx_element *font; - - font = allocgfx(&fontlayout); - decodegfx(font, fontdata, 0, font->total_elements); - - if (font) - { - font->colortable = Machine->debug_remapped_colortable; - font->total_colors = DEBUGGER_TOTAL_COLORS*DEBUGGER_TOTAL_COLORS; - } - - return font; -} - -static void toggle_cursor(mame_bitmap *bitmap, gfx_element *font) -{ - int sx, sy, x, y; - - sx = cursor_x * font->width; - sy = cursor_y * font->height; - for (y = 0; y < font->height; y++) - { - for (x = 0; x < font->width; x++) - { - int i; - int pen = read_pixel(bitmap, sx+x, sy+y); - for (i = 0;i < DEBUGGER_TOTAL_COLORS;i++) - { - if (pen == Machine->debug_pens[i]) - { - pen = Machine->debug_pens[DEBUGGER_TOTAL_COLORS-1 - i]; - break; - } - } - plot_pixel(bitmap, sx+x, sy+y, pen); - } - } - cursor_on ^= 1; - - debugger_bitmap_changed = 1; -} - -void dbg_put_screen_char(int ch, int attr, int x, int y) -{ - mame_bitmap *bitmap = Machine->debug_bitmap; - gfx_element *font = Machine->debugger_font; - - drawgfx(bitmap, font, - ch, attr, 0, 0, x*font->width, y*font->height, - 0, TRANSPARENCY_NONE, 0); - - debugger_bitmap_changed = 1; -} - -static void set_screen_curpos(int x, int y) -{ - cursor_x = x; - cursor_y = y; -} - -static void get_screen_size( unsigned *width, unsigned *height ) -{ - *width = Machine->debug_bitmap->width / Machine->debugger_font->width; - *height = Machine->debug_bitmap->height / Machine->debugger_font->height; -} - -static int readkey(void) -{ - int i, k; - int cursor_flash = 0; - - i = 0; - debugger_idle = 0; - do - { - if ((cursor_flash++ & 15) == 0) - toggle_cursor(Machine->debug_bitmap, Machine->debugger_font); - video_frame_update(); - - k = CODE_NONE; - if (code_pressed_memory_repeat(KEYCODE_A,dbg_key_repeat)) k = KEYCODE_A; - if (code_pressed_memory_repeat(KEYCODE_B,dbg_key_repeat)) k = KEYCODE_B; - if (code_pressed_memory_repeat(KEYCODE_C,dbg_key_repeat)) k = KEYCODE_C; - if (code_pressed_memory_repeat(KEYCODE_D,dbg_key_repeat)) k = KEYCODE_D; - if (code_pressed_memory_repeat(KEYCODE_E,dbg_key_repeat)) k = KEYCODE_E; - if (code_pressed_memory_repeat(KEYCODE_F,dbg_key_repeat)) k = KEYCODE_F; - if (code_pressed_memory_repeat(KEYCODE_G,dbg_key_repeat)) k = KEYCODE_G; - if (code_pressed_memory_repeat(KEYCODE_H,dbg_key_repeat)) k = KEYCODE_H; - if (code_pressed_memory_repeat(KEYCODE_I,dbg_key_repeat)) k = KEYCODE_I; - if (code_pressed_memory_repeat(KEYCODE_J,dbg_key_repeat)) k = KEYCODE_J; - if (code_pressed_memory_repeat(KEYCODE_K,dbg_key_repeat)) k = KEYCODE_K; - if (code_pressed_memory_repeat(KEYCODE_L,dbg_key_repeat)) k = KEYCODE_L; - if (code_pressed_memory_repeat(KEYCODE_M,dbg_key_repeat)) k = KEYCODE_M; - if (code_pressed_memory_repeat(KEYCODE_N,dbg_key_repeat)) k = KEYCODE_N; - if (code_pressed_memory_repeat(KEYCODE_O,dbg_key_repeat)) k = KEYCODE_O; - if (code_pressed_memory_repeat(KEYCODE_P,dbg_key_repeat)) k = KEYCODE_P; - if (code_pressed_memory_repeat(KEYCODE_Q,dbg_key_repeat)) k = KEYCODE_Q; - if (code_pressed_memory_repeat(KEYCODE_R,dbg_key_repeat)) k = KEYCODE_R; - if (code_pressed_memory_repeat(KEYCODE_S,dbg_key_repeat)) k = KEYCODE_S; - if (code_pressed_memory_repeat(KEYCODE_T,dbg_key_repeat)) k = KEYCODE_T; - if (code_pressed_memory_repeat(KEYCODE_U,dbg_key_repeat)) k = KEYCODE_U; - if (code_pressed_memory_repeat(KEYCODE_V,dbg_key_repeat)) k = KEYCODE_V; - if (code_pressed_memory_repeat(KEYCODE_W,dbg_key_repeat)) k = KEYCODE_W; - if (code_pressed_memory_repeat(KEYCODE_X,dbg_key_repeat)) k = KEYCODE_X; - if (code_pressed_memory_repeat(KEYCODE_Y,dbg_key_repeat)) k = KEYCODE_Y; - if (code_pressed_memory_repeat(KEYCODE_Z,dbg_key_repeat)) k = KEYCODE_Z; - if (code_pressed_memory_repeat(KEYCODE_0,dbg_key_repeat)) k = KEYCODE_0; - if (code_pressed_memory_repeat(KEYCODE_1,dbg_key_repeat)) k = KEYCODE_1; - if (code_pressed_memory_repeat(KEYCODE_2,dbg_key_repeat)) k = KEYCODE_2; - if (code_pressed_memory_repeat(KEYCODE_3,dbg_key_repeat)) k = KEYCODE_3; - if (code_pressed_memory_repeat(KEYCODE_4,dbg_key_repeat)) k = KEYCODE_4; - if (code_pressed_memory_repeat(KEYCODE_5,dbg_key_repeat)) k = KEYCODE_5; - if (code_pressed_memory_repeat(KEYCODE_6,dbg_key_repeat)) k = KEYCODE_6; - if (code_pressed_memory_repeat(KEYCODE_7,dbg_key_repeat)) k = KEYCODE_7; - if (code_pressed_memory_repeat(KEYCODE_8,dbg_key_repeat)) k = KEYCODE_8; - if (code_pressed_memory_repeat(KEYCODE_9,dbg_key_repeat)) k = KEYCODE_9; - if (code_pressed_memory_repeat(KEYCODE_0_PAD,dbg_key_repeat)) k = KEYCODE_0_PAD; - if (code_pressed_memory_repeat(KEYCODE_1_PAD,dbg_key_repeat)) k = KEYCODE_1_PAD; - if (code_pressed_memory_repeat(KEYCODE_2_PAD,dbg_key_repeat)) k = KEYCODE_2_PAD; - if (code_pressed_memory_repeat(KEYCODE_3_PAD,dbg_key_repeat)) k = KEYCODE_3_PAD; - if (code_pressed_memory_repeat(KEYCODE_4_PAD,dbg_key_repeat)) k = KEYCODE_4_PAD; - if (code_pressed_memory_repeat(KEYCODE_5_PAD,dbg_key_repeat)) k = KEYCODE_5_PAD; - if (code_pressed_memory_repeat(KEYCODE_6_PAD,dbg_key_repeat)) k = KEYCODE_6_PAD; - if (code_pressed_memory_repeat(KEYCODE_7_PAD,dbg_key_repeat)) k = KEYCODE_7_PAD; - if (code_pressed_memory_repeat(KEYCODE_8_PAD,dbg_key_repeat)) k = KEYCODE_8_PAD; - if (code_pressed_memory_repeat(KEYCODE_9_PAD,dbg_key_repeat)) k = KEYCODE_9_PAD; - if (code_pressed_memory(KEYCODE_F1)) k = KEYCODE_F1; - if (code_pressed_memory(KEYCODE_F2)) k = KEYCODE_F2; - if (code_pressed_memory(KEYCODE_F3)) k = KEYCODE_F3; - if (code_pressed_memory(KEYCODE_F4)) k = KEYCODE_F4; -/* if (code_pressed_memory(KEYCODE_F5)) k = KEYCODE_F5; */ - if (code_pressed_memory(KEYCODE_F6)) k = KEYCODE_F6; - if (code_pressed_memory(KEYCODE_F7)) k = KEYCODE_F7; - if (code_pressed_memory(KEYCODE_F8)) k = KEYCODE_F8; - if (code_pressed_memory(KEYCODE_F9)) k = KEYCODE_F9; - if (code_pressed_memory(KEYCODE_F10)) k = KEYCODE_F10; - if (code_pressed_memory(KEYCODE_F11)) k = KEYCODE_F11; - if (code_pressed_memory(KEYCODE_F12)) k = KEYCODE_F12; - if (code_pressed_memory(KEYCODE_ESC)) k = KEYCODE_ESC; -/* if (code_pressed_memory_repeat(KEYCODE_TILDE,dbg_key_repeat)) k = KEYCODE_TILDE; */ - if (code_pressed_memory_repeat(KEYCODE_MINUS,dbg_key_repeat)) k = KEYCODE_MINUS; - if (code_pressed_memory_repeat(KEYCODE_EQUALS,dbg_key_repeat)) k = KEYCODE_EQUALS; - if (code_pressed_memory_repeat(KEYCODE_BACKSPACE,dbg_key_repeat)) k = KEYCODE_BACKSPACE; - if (code_pressed_memory_repeat(KEYCODE_TAB,dbg_key_repeat)) k = KEYCODE_TAB; - if (code_pressed_memory_repeat(KEYCODE_OPENBRACE,dbg_key_repeat)) k = KEYCODE_OPENBRACE; - if (code_pressed_memory_repeat(KEYCODE_CLOSEBRACE,dbg_key_repeat)) k = KEYCODE_CLOSEBRACE; - if (code_pressed_memory_repeat(KEYCODE_ENTER,dbg_key_repeat)) k = KEYCODE_ENTER; - if (code_pressed_memory_repeat(KEYCODE_COLON,dbg_key_repeat)) k = KEYCODE_COLON; - if (code_pressed_memory_repeat(KEYCODE_QUOTE,dbg_key_repeat)) k = KEYCODE_QUOTE; - if (code_pressed_memory_repeat(KEYCODE_BACKSLASH,dbg_key_repeat)) k = KEYCODE_BACKSLASH; - if (code_pressed_memory_repeat(KEYCODE_BACKSLASH2,dbg_key_repeat)) k = KEYCODE_BACKSLASH2; - if (code_pressed_memory_repeat(KEYCODE_COMMA,dbg_key_repeat)) k = KEYCODE_COMMA; - if (code_pressed_memory_repeat(KEYCODE_STOP,dbg_key_repeat)) k = KEYCODE_STOP; - if (code_pressed_memory_repeat(KEYCODE_SLASH,dbg_key_repeat)) k = KEYCODE_SLASH; - if (code_pressed_memory_repeat(KEYCODE_SPACE,dbg_key_repeat)) k = KEYCODE_SPACE; - if (code_pressed_memory_repeat(KEYCODE_INSERT,dbg_key_repeat)) k = KEYCODE_INSERT; - if (code_pressed_memory_repeat(KEYCODE_DEL,dbg_key_repeat)) k = KEYCODE_DEL; - if (code_pressed_memory_repeat(KEYCODE_HOME,dbg_key_repeat)) k = KEYCODE_HOME; - if (code_pressed_memory_repeat(KEYCODE_END,dbg_key_repeat)) k = KEYCODE_END; - if (code_pressed_memory_repeat(KEYCODE_PGUP,dbg_key_repeat)) k = KEYCODE_PGUP; - if (code_pressed_memory_repeat(KEYCODE_PGDN,dbg_key_repeat)) k = KEYCODE_PGDN; - if (code_pressed_memory_repeat(KEYCODE_LEFT,dbg_key_repeat)) k = KEYCODE_LEFT; - if (code_pressed_memory_repeat(KEYCODE_RIGHT,dbg_key_repeat)) k = KEYCODE_RIGHT; - if (code_pressed_memory_repeat(KEYCODE_UP,dbg_key_repeat)) k = KEYCODE_UP; - if (code_pressed_memory_repeat(KEYCODE_DOWN,dbg_key_repeat)) k = KEYCODE_DOWN; - if (code_pressed_memory_repeat(KEYCODE_SLASH_PAD,dbg_key_repeat)) k = KEYCODE_SLASH_PAD; - if (code_pressed_memory_repeat(KEYCODE_ASTERISK,dbg_key_repeat)) k = KEYCODE_ASTERISK; - if (code_pressed_memory_repeat(KEYCODE_MINUS_PAD,dbg_key_repeat)) k = KEYCODE_MINUS_PAD; - if (code_pressed_memory_repeat(KEYCODE_PLUS_PAD,dbg_key_repeat)) k = KEYCODE_PLUS_PAD; -/* if (code_pressed_memory_repeat(KEYCODE_DEL_PAD,dbg_key_repeat)) k = KEYCODE_DEL_PAD; */ -/* if (code_pressed_memory_repeat(KEYCODE_ENTER_PAD,dbg_key_repeat)) k = KEYCODE_ENTER_PAD; */ -/* if (code_pressed_memory(KEYCODE_PRTSCR)) k = KEYCODE_PRTSCR; */ -/* if (code_pressed_memory(KEYCODE_PAUSE)) k = KEYCODE_PAUSE; */ -/* if (code_pressed_memory(KEYCODE_SCRLOCK)) k = KEYCODE_SCRLOCK; */ -/* if (code_pressed_memory(KEYCODE_NUMLOCK)) k = KEYCODE_NUMLOCK; */ -/* if (code_pressed_memory(KEYCODE_CAPSLOCK)) k = KEYCODE_CAPSLOCK; */ -/* if (code_pressed(KEYCODE_LWIN)) k = KEYCODE_LWIN; */ -/* if (code_pressed(KEYCODE_RWIN)) k = KEYCODE_RWIN; */ -/* if (code_pressed(KEYCODE_MENU)) k = KEYCODE_MENU; */ - - if (k == CODE_NONE) - debugger_idle = 1; - - } while (k == CODE_NONE); - debugger_idle = 0; - if (cursor_on) - toggle_cursor(Machine->debug_bitmap, Machine->debugger_font); - - return k; -} - - - - - -/**************************************************************************** - * Tracing - ****************************************************************************/ -static int tracecpu = 0; -static int trace_on = 0; - -/**************************************************************************** - * Commands structure - ****************************************************************************/ -typedef struct { - int valid; /* command is valid for which windows (bit mask) */ - const char *name; /* command name (NULL none) */ - const char *alias; /* command name alias (NULL none) */ - int key; /* key code (0 none) */ - const char *args; /* description of expected arguments */ - const char *info; /* description of the function */ - void (*function)(void); /* function handling the key/command */ -} s_command; - -#define ALL ((1<]", - "Animate (trace) and update display once per frame [or every opcodes only]", - cmd_animate }, -{ (1<
", - "Display memory <1|2> starting at
", - cmd_display_memory }, -{ (1< [
]", - "Edit memory window <1|2> [at
]", - cmd_edit_memory }, -{ (1< [BYTE|WORD|DWORD]", - "Change memory window mode to default [to BYTE|WORD|DWORD (or 0|1|2)]", - cmd_set_memory_mode }, -{ (1<]", - "Go [and break at
]", - cmd_go_break }, -{ (1<", - "Jump to
in disassembly window", - cmd_jump }, -{ (1< ", - "Replace with ( may also be a )", - cmd_replace_register }, -{ (1< []", - "Break on execution of
[after ignoring it ]", - cmd_brk_exec_set }, -{ (1< [ []]", - "Break if changes [to [compare after applying ]]", - cmd_brk_regs_set }, -{ (1< []", - "Break if data at
changes [to ]", - cmd_brk_data_set }, -{ (1< []", - "Disassemble to from address to \n" \ - "Opcode dump on by default [OFF|NO|0 without]", - cmd_dasm_to_file }, -{ (1< [ [ []]]", - "Dump to from address to \n" \ - "[data size BYTE|WORD|DWORD (also 0|1|2)]\n" \ - "[ASCII mode OFF|TRANSLATE|FULL (also 0|1|2)]\n" \ - "[PROG or DATA memory (also 0|1) for CPUs supporting it]\n", - cmd_dump_to_file }, -{ (1< [ [...]]}|OFF", - "Trace to [dumping [...]] | OFF to stop tracing.", - cmd_trace_to_file }, -{ (1< [OPCODES|DATA]", - "Save binary to from address to \n" \ - "[either OPCODES (from opcode_base, default) or DATA (from opcode_arg_base), also 0|1].", - cmd_save_to_file }, -{ (1<", - "Ignore CPU # while debugging or tracing", - cmd_set_ignore }, -{ (1<", - "Observe CPU # while debugging or tracing", - cmd_set_observe }, -{ (1<", - "Display opcodes in disassembly window", - cmd_set_dasm_opcodes }, -{ (1<", - "Display relative jump addresses in disassembly window", - cmd_set_dasm_relative_jumps }, -{ (1<", - "Allow squeezed memory display", - cmd_set_mem_squeezed }, -{ (1< []", - "Set color to on BLACK [or ].\nFor a list of and see mamedbg.cfg", - cmd_set_element_color }, -{ (1< 0) - offset <<= shift; - else - offset >>= -shift; - return offset; -} - -/* adjust an offset by shifting it right activecpu_address_shift() times */ -INLINE unsigned rshift( unsigned offset ) -{ - int shift = ASHIFT; - if (shift > 0) - offset >>= shift; - else - offset <<= -shift; - return offset; -} - - -/************************************************************************** - * dtou - * Decimal to unsigned. - * The pointer to the char* is placed after all consecutive digits - * and trailing space. The pointer to int size (if given) contains the - * number of digits found. - **************************************************************************/ -INLINE unsigned dtou( char **parg, int *size) -{ - unsigned val = 0, digit; - - if (size) *size = 0; - while( isdigit( *(*parg) ) ) - { - digit = *(*parg) - '0'; - val = (val * 10) + digit; - if( size ) (*size)++; - (*parg) += 1; - } - while( isspace(*(*parg)) ) *parg += 1; - return val; -} - -/************************************************************************** - * xtou - * Hex to unsigned. - * The pointer to the char* is placed after all consecutive hex digits - * and trailing space. The pointer to int size (if given) contains the - * number of digits found. - **************************************************************************/ -INLINE unsigned xtou( char **parg, int *size) -{ - unsigned val = 0, digit; - - if (size) *size = 0; - while( isxdigit( *(*parg) ) ) - { - digit = toupper(*(*parg)) - '0'; - if( digit > 9 ) digit -= 7; - val = (val << 4) | digit; - if( size ) (*size)++; - (*parg) += 1; - } - while( isspace(*(*parg)) ) *parg += 1; - return val; -} - -/************************************************************************** - * lower - * Convert string into all lower case. - **************************************************************************/ -INLINE char *lower( const char *src) -{ - static char buffer[127+1]; - char *dst = buffer; - while( *src ) - *dst++ = tolower(*src++); - *dst = '\0'; - return buffer; -} - -/************************************************************************** - * upper - * Convert string into all upper case. - **************************************************************************/ -INLINE char *upper( const char *src) -{ - static char buffer[127+1]; - char *dst = buffer; - while( *src ) - *dst++ = toupper(*src++); - *dst = '\0'; - return buffer; -} - -/************************************************************************** - * kilobyte - * Format a byte count or size to a kilo or mega bytes string - **************************************************************************/ -INLINE char *kilobyte( unsigned bytes ) -{ - static char buffer[2][31+1]; - static int which = 0; - char *dst = buffer[which]; - which ^= 1; - if( bytes < 1024 ) - sprintf( dst, "%u", bytes ); - else - if( bytes < 1024 * 1024 ) - sprintf( dst, "%u.%02uK", bytes / 1024, 100 * bytes / 1024 ); - else - sprintf( dst, "%u.%02uM", bytes / 1024 / 1024, 100 * ((bytes / 1024) % 1024) / 1024 ); - return dst; -} - -/************************************************************************** - * get_boolean - * Get a boolean argument (on/off, yes/no, y/n, 1/0) - **************************************************************************/ -static unsigned get_boolean( char **parg, int *size ) -{ - char *p = *parg; - unsigned result = 0; - int length = 0; - - if( toupper(p[0]) == 'O' ) - { - if( toupper(p[1]) == 'N' && !isalnum(p[2]) ) - { - result = 1; - length = 2; - *parg += length; - } - else - if( toupper(p[1]) == 'F' && toupper(p[2]) == 'F' && !isalnum(p[3]) ) - { - result = 0; - length = 3; - *parg += length; - } - } - else - if( toupper(p[0]) == 'N' ) - { - if( toupper(p[1]) == 'O' && !isalnum(p[2]) ) - { - result = 0; - length = 2; - *parg += length; - } - else - if( !isalnum(p[1]) ) - { - result = 0; - length = 1; - *parg += length; - } - } - else - if( toupper(p[0]) == 'Y' ) - { - if( toupper(p[1]) == 'E' && toupper(p[2]) == 'S' && !isalnum(p[3]) ) - { - result = 1; - length = 3; - *parg += length; - } - else - if( !isalnum(p[1]) ) - { - result = 1; - length = 1; - *parg += length; - } - } - - if( length ) - { - while( isspace(*(*parg)) ) *parg += 1; - } - else - { - /* found nothing yet: assume numeric */ - result = xtou( parg, &length ); - } - - if( size ) *size += length; - - return result; -} - -/************************************************************************** - * get_option_or_value - * Get a option argument (from opt_list) or a number in the - * range of 0 .. number of options - 1 - **************************************************************************/ -static unsigned get_option_or_value( char **parg, int *size, const char *opt_list ) -{ - char *p = *parg; - const char *opt; - unsigned result = 0, opt_count = 0; - int length = 0; - - /* length of the next argument */ - while( isalnum(*p) ) p++; - length = (int) (p - *parg); - while( isspace(*p) ) p++; - - /* sacn options */ - for( opt = opt_list; *opt ; opt += strlen(opt) + 1 ) - { - if( strncmp(*parg, opt, length) == 0 ) - { - *parg = p; - if( size ) *size = length; - return opt_count; - } - opt_count++; - } - - result = xtou( parg, &length ); - if( size ) *size += length; - - return result; -} - -static const char *get_file_name( char **parg, int *size ) -{ - static char filename[127+1]; - char *s, *d; - int l; - - for( l = 0, s = *parg, d = filename; *s && (isalnum(*s) || ispunct(*s)); l++ ) - *d++ = *s++; - - *d = '\0'; - while( isspace(*s) ) s++; - *parg = s; - - if( size ) *size = l; - - return filename; -} - -const char *get_ea_info( unsigned pc ) -{ - static char buffer[63+1]; - static const char *access[EA_COUNT] = - { - "", /* no EA mode */ - "#", /* immediate */ - "=", /* absolute PC */ - "$", /* relative PC */ - "<", /* zero page memory read */ - ">", /* zero page memory write */ - "*", /* zero page memory modify */ - "<", /* memory read */ - ">", /* memory write */ - "*", /* memory modify */ - "P<", /* port read */ - "P>" /* port write */ - }; - - unsigned wdst, wsrc; - - switch( DBGDASM.dst_ea_size ) - { - case EA_INT8: wdst = 2; break; - case EA_INT16: wdst = 4; break; - case EA_INT32: wdst = 8; break; - case EA_UINT8: wdst = 2; break; - case EA_UINT16: wdst = 4; break; - case EA_UINT32: wdst = 8; break; - default: - wdst = (ABITS + 3) / 4; - } - - switch( DBGDASM.src_ea_size ) - { - case EA_INT8: wsrc = 2; break; - case EA_INT16: wsrc = 4; break; - case EA_INT32: wsrc = 8; break; - case EA_UINT8: wsrc = 2; break; - case EA_UINT16: wsrc = 4; break; - case EA_UINT32: wsrc = 8; break; - default: - wsrc = (ABITS + 3) / 4; - } - - if( DBGDASM.dst_ea_value != INVALID && DBGDASM.src_ea_value != INVALID ) - sprintf( buffer, "%s\t%s%0*X %s%0*X", - name_rdmem(rshift(pc)), - access[DBGDASM.src_ea_access], wsrc, DBGDASM.src_ea_value, - access[DBGDASM.dst_ea_access], wdst, DBGDASM.dst_ea_value ); - else - if( DBGDASM.dst_ea_value != INVALID ) - sprintf( buffer, "%s\t%s%0*X", - name_rdmem(rshift(pc)), - access[DBGDASM.dst_ea_access], wdst, DBGDASM.dst_ea_value ); - else - if( DBGDASM.src_ea_value != INVALID ) - sprintf( buffer, "%s\t%s%0*X", - name_rdmem(rshift(pc)), - access[DBGDASM.src_ea_access], wsrc, DBGDASM.src_ea_value ); - else - sprintf( buffer, "%s", name_rdmem(rshift(pc)) ); - - return buffer; -} - -/************************************************************************** - * get_register_id - * Return the ID for a register if the string at *parg matches one - * of the register names for the active cpu. - **************************************************************************/ -static unsigned get_register_id( char **parg, int *size ) -{ - int i, l; - for( i = 0; i < DBGREGS.count; i++ ) - { - l = strlen( DBGREGS.name[i] ); - if( l > 0 && !mame_strnicmp( *parg, DBGREGS.name[i], l ) ) - { - if( !isalnum( (*parg)[l] ) ) - { - if( size ) *size = l; - *parg += l; - while( isspace(*(*parg)) ) *parg += 1; - return DBGREGS.id[i]; - } - } - } - if( size ) *size = 0; - return 0; -} - -/************************************************************************** - * get_register_name - * Get the name of a register with ID - **************************************************************************/ -static const char *get_register_name( int id ) -{ - int i; - for( i = 0; i < DBGREGS.count; i++ ) - { - if( DBGREGS.id[i] == id ) - return DBGREGS.name[i]; - } - return "??"; -} - -/************************************************************************** - * get_register_or_value - * Return the value for a register if the string at *parg matches one - * of the register names for the active cpu. Otherwise get a hex - * value from *parg. In both cases set the pointer int size to the - * length of the name or digits found (if size is not NULL) - **************************************************************************/ -static unsigned get_register_or_value( char **parg, int *size ) -{ - int regnum, l; - - regnum = get_register_id( parg, &l ); - if( regnum > 0 ) - { - if( size ) *size = l; - return activecpu_get_reg( regnum ); - } - /* default to hex value */ - return xtou( parg, size ); -} - -/************************************************************************** - * trace_init - * Creates trace output files for all CPUs - * Resets the loop and iteration counters and the last PC array - **************************************************************************/ -static void trace_init( const char *filename, UINT8 *regs ) -{ - char name[100]; - - if( trace_on ) - return; - - for( tracecpu = 0; tracecpu < total_cpu; tracecpu++ ) - { - if( strcmp( filename, "CONSOLE" ) == 0 ) - { - TRACE.file = stdout; - } - else - { - sprintf( name, "%s.%d", filename, tracecpu ); - TRACE.file = fopen(name,"w"); - } - if( tracecpu == active_cpu ) - memcpy( TRACE.regs, regs, MAX_REGS ); - else - TRACE.regs[0] = 0; - TRACE.iters = 0; - TRACE.loops = 0; - memset(TRACE.last_pc, 0xff, sizeof(TRACE.last_pc)); - } - tracecpu = active_cpu; - trace_on = 1; -} - -/************************************************************************** - * trace_done - * Closes the trace output files - **************************************************************************/ -void trace_done(void) -{ - if( !trace_on ) - return; - - for( tracecpu = 0; tracecpu < total_cpu; tracecpu++ ) - { - if( TRACE.file ) - fclose( TRACE.file ); - TRACE.file = NULL; - } - - trace_on = 0; -} - -/************************************************************************** - * trace_select - * Switches tracing to the active CPU - **************************************************************************/ -static void trace_select( void ) -{ - if( tracecpu == active_cpu ) - return; - if( trace_on && TRACE.file ) - { - if( TRACE.loops ) - { - fprintf( TRACE.file, - "\n (loops for %d instructions)\n\n", - TRACE.loops ); - TRACE.loops = 0; - } - fprintf(TRACE.file,"\n=============== End of iteration #%d ===============\n\n",TRACE.iters++); - fflush(TRACE.file); - } - if( active_cpu < total_cpu ) - tracecpu = active_cpu; -} - -/************************************************************************** - * trace_output - * Outputs the next disassembled instruction to the trace file - * Loops are detected and a loop count is output after the - * first repetition instead of disassembling the loop over and over - **************************************************************************/ -static void trace_output( void ) -{ - static char buffer[127+1]; - char *dst = buffer; - - if( trace_on && TRACE.file ) - { - unsigned pc = activecpu_get_pc(); - unsigned addr_width = (ABITS + 3) / 4; - int count, i; - - /* check for trace_loops */ - for( i = count = 0; i < MAX_LOOPS; i++ ) - if( TRACE.last_pc[i] == pc ) - count++; - if( count > 1 ) - { - TRACE.loops++; - } - else - { - if( TRACE.loops ) - { - dst += sprintf( dst, - "\n (loops for %d instructions)\n\n", - TRACE.loops ); - TRACE.loops = 0; - } - if( TRACE.regs[0] ) - { - for( i = 0; i < MAX_REGS && TRACE.regs[i]; i++ ) - { - const char *result = activecpu_reg_string(TRACE.regs[i]); - if( result && *result == '~' ) - result++; - dst += sprintf( dst, "%s ", result); - } - } - dst += sprintf( dst, "%0*X: ", addr_width, pc ); - activecpu_dasm( dst, pc ); - strcat( dst, "\n" ); - fprintf( TRACE.file, "%s", buffer); - fflush( TRACE.file ); - memmove( - &TRACE.last_pc[0], - &TRACE.last_pc[1], - (MAX_LOOPS-1)*sizeof(TRACE.last_pc[0]) ); - TRACE.last_pc[MAX_LOOPS-1] = pc; - } - } -} - -/************************************************************************** - * hit_brk_exec - * Return non zero if execution breakpoint for the active_cpu, - * the temporary breakpoint or the break on 'active_cpu' was hit - **************************************************************************/ -static int hit_brk_exec(void) -{ - static char dbg_info[63+1]; - UINT32 pc = activecpu_get_pc(); - - if( DBG.brk_temp != INVALID && DBG.brk_temp == pc ) - { - sprintf( dbg_info, "Hit temp breakpoint at $%X", DBG.brk_temp); - dbg_info_once = dbg_info; - return 1; - } - if( DBG.brk_exec != INVALID && DBG.brk_exec == pc ) - { - if( DBG.brk_exec_times > 0 ) - { - if( --DBG.brk_exec_times == 0 ) - { - sprintf( dbg_info, "Hit exec breakpoint %d times", DBG.brk_exec_reset); - dbg_info_once = dbg_info; - return 1; - } - return 0; - } - sprintf( dbg_info, "Hit exec breakpoint at $%X", DBG.brk_exec); - dbg_info_once = dbg_info; - return 1; - } - - return 0; -} - -/************************************************************************** - * hit_brk_data - * Return non zero if the data watchpoint for the active_cpu - * was hit (ie. monitored data changed) - **************************************************************************/ -static int hit_brk_data(void) -{ - static char dbg_info[63+1]; - UINT32 data; - - if( DBG.brk_data == INVALID ) return 0; - - data = RDMEM(DBG.brk_data); - - if( DBG.brk_data_oldval != data ) - { - DBG.brk_data_oldval = data; - if( DBG.brk_data_newval != INVALID ) - { - if( DBG.brk_data_newval == data ) - { - sprintf( dbg_info, "Hit data watchpoint at $%X value $%X", DBG.brk_data, DBG.brk_data_newval); - dbg_info_once = dbg_info; - return 1; - } - return 0; - } - sprintf( dbg_info, "Hit data watchpoint at $%X", DBG.brk_data); - dbg_info_once = dbg_info; - return 1; - } - return 0; -} - - -/************************************************************************** - * hit_brk_regs - * Return non zero if the register breakpoint for the active CPU - * was hit (ie. monitored register changed) - **************************************************************************/ -static int hit_brk_regs(void) -{ - static char dbg_info[63+1]; - UINT32 data; - - if( DBG.brk_regs == INVALID ) return 0; - - data = activecpu_get_reg(DBG.brk_regs); - - if( DBG.brk_regs_oldval != data ) - { - DBG.brk_regs_oldval = data; - if( DBG.brk_regs_newval != INVALID ) - { - if( DBG.brk_regs_newval == (data & DBG.brk_regs_mask) ) - { - if( DBG.brk_regs_mask != 0xffffffff ) - sprintf( dbg_info, "Hit register %s & $%X watchpoint value $%X", get_register_name(DBG.brk_regs), DBG.brk_regs_mask, DBG.brk_regs_newval); - else - sprintf( dbg_info, "Hit register %s watchpoint value $%X", get_register_name(DBG.brk_regs), DBG.brk_regs_newval); - dbg_info_once = dbg_info; - return 1; - } - return 0; - } - sprintf( dbg_info, "Hit register %s watchpoint", get_register_name(DBG.brk_regs)); - dbg_info_once = dbg_info; - return 1; - } - return 0; -} - - -/************************************************************************** - * name_rom - * Find the name for a rom from the drivers list - **************************************************************************/ -static const char *name_rom( const char *type, int regnum, unsigned *base, unsigned start ) -{ - const rom_entry *region, *rom, *chunk; - unsigned offset = *base; - - for (region = rom_first_region(Machine->gamedrv); region; region = rom_next_region(region)) - if (ROMREGION_GETTYPE(region) == regnum) - { - for (rom = rom_first_file(region); rom; rom = rom_next_file(rom)) - { - const char *name = ROM_GETNAME(rom); - int length = 0; - - for (chunk = rom_first_chunk(rom); chunk; chunk = rom_next_chunk(chunk)) - length += ROM_GETLENGTH(chunk); - - /* address inside that range ? */ - if( offset < length ) - { - /* put back that offset */ - *base = offset; - return name; - } - /* subtract length of that ROM */ - offset -= length; - } - break; - } - - /* default to ROM + xxxx (base - start) */ - *base -= start; - return type; -} - -/************************************************************************** - * name_rdmem - * Find a descriptive name for the given memory read region of active_cpu - **************************************************************************/ -static const char *name_rdmem( unsigned base ) -{ - static char buffer[16][79+1]; - static int which = 0; - const address_map *map = memory_get_map(active_cpu, ADDRESS_SPACE_PROGRAM); - int ram_cnt = 1, nop_cnt = 1; - const char *name; - char *dst; - - which = (which+1) % 16; - dst = buffer[which]; - *dst = '\0'; - - while( *dst == '\0' && !IS_AMENTRY_END(map)) - { - if (!IS_AMENTRY_EXTENDED(map) && map->read.handler) - { - if( (!IS_AMENTRY_MATCH_MASK(map) && base >= map->start && base <= map->end ) || - (IS_AMENTRY_MATCH_MASK(map) && (base & map->end) == map->start)) - { - unsigned offset = base - map->start; - -#if 0 -/* Won't work since the MemoryWrite doesn't support ->base anymore */ - if( map->description ) - sprintf(dst, "%s+%04X", map->description, lshift(offset) ); - else - if( map->base && *map->base == videoram ) - sprintf(dst, "video+%04X", lshift(offset) ); - else - if( map->base && *map->base == colorram ) - sprintf(dst, "color+%04X", lshift(offset) ); - else - if( map->base && *map->base == spriteram ) - sprintf(dst, "sprite+%04X", lshift(offset) ); - else -#endif - switch( (FPTR)map->read.handler ) - { - case (FPTR)MRA8_RAM: - sprintf(dst, "RAM%d+%04X", ram_cnt, lshift(offset) ); - break; - case (FPTR)MRA8_ROM: - name = name_rom("ROM", REGION_CPU1+active_cpu, &base, map->start ); - sprintf(dst, "%s+%04X", name, lshift(base) ); - break; - case (FPTR)MRA8_BANK1: case (FPTR)MRA8_BANK2: - case (FPTR)MRA8_BANK3: case (FPTR)MRA8_BANK4: - case (FPTR)MRA8_BANK5: case (FPTR)MRA8_BANK6: - case (FPTR)MRA8_BANK7: case (FPTR)MRA8_BANK8: - case (FPTR)MRA8_BANK9: case (FPTR)MRA8_BANK10: - case (FPTR)MRA8_BANK11: case (FPTR)MRA8_BANK12: - case (FPTR)MRA8_BANK13: case (FPTR)MRA8_BANK14: - case (FPTR)MRA8_BANK15: case (FPTR)MRA8_BANK16: - case (FPTR)MWA8_BANK17: case (FPTR)MWA8_BANK18: - case (FPTR)MWA8_BANK19: case (FPTR)MWA8_BANK20: - case (FPTR)MWA8_BANK21: case (FPTR)MWA8_BANK22: - case (FPTR)MWA8_BANK23: case (FPTR)MWA8_BANK24: - sprintf(dst, "BANK%d+%04X", 1 + (int)(MRA8_BANK1) - (int)(map->read.handler), lshift(offset) ); - break; - case (FPTR)MRA8_NOP: - sprintf(dst, "NOP%d+%04X", nop_cnt, lshift(offset) ); - break; - default: - if( (FPTR)map->read.handler == (FPTR)input_port_0_r ) - sprintf(dst, "input_port_0+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_1_r ) - sprintf(dst, "input_port_1+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_2_r ) - sprintf(dst, "input_port_2+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_3_r ) - sprintf(dst, "input_port_3+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_4_r ) - sprintf(dst, "input_port_4+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_5_r ) - sprintf(dst, "input_port_5+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_6_r ) - sprintf(dst, "input_port_6+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_7_r ) - sprintf(dst, "input_port_7+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_8_r ) - sprintf(dst, "input_port_8+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_9_r ) - sprintf(dst, "input_port_9+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_10_r ) - sprintf(dst, "input_port_10+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_11_r ) - sprintf(dst, "input_port_11+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_12_r ) - sprintf(dst, "input_port_12+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_13_r ) - sprintf(dst, "input_port_13+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_14_r ) - sprintf(dst, "input_port_14+%04X", lshift(offset) ); - else - if( (FPTR)map->read.handler == (FPTR)input_port_15_r ) - sprintf(dst, "input_port_15+%04X", lshift(offset) ); - } - } - switch( (FPTR)map->read.handler ) - { - case (FPTR)MRA8_RAM: ram_cnt++; break; - case (FPTR)MRA8_NOP: nop_cnt++; break; - } - } - map++; - } - - return dst; -} - -/************************************************************************** - * name_wrmem - * Find a descriptive name for the given memory write region of active_cpu - **************************************************************************/ -static const char *name_wrmem( unsigned base ) -{ - static char buffer[16][79+1]; - static int which = 0; - const address_map *map = memory_get_map(active_cpu, ADDRESS_SPACE_PROGRAM); - int ram_cnt = 1, nop_cnt = 1; - const char *name; - char *dst; - - which = (which+1) % 16; - dst = buffer[which]; - *dst = '\0'; - - ram_cnt = nop_cnt = 1; - while( *dst == '\0' && !IS_AMENTRY_END(map)) - { - if (!IS_AMENTRY_EXTENDED(map) && map->write.handler) - { - if( (!IS_AMENTRY_MATCH_MASK(map) && base >= map->start && base <= map->end ) || - (IS_AMENTRY_MATCH_MASK(map) && (base & map->end) == map->start)) - { -#if 0 -/* Won't work since the MemoryRead doesn't support ->description anymore */ - if( map->description ) - sprintf(dst, "%s+%04X", map->description, lshift(base - map->start) ); - else -#endif -#if 0 - if( map->base && *map->base == videoram ) - sprintf(dst, "video+%04X", lshift(base - map->start) ); - else - if( map->base && *map->base == colorram ) - sprintf(dst, "color+%04X", lshift(base - map->start) ); - else - if( map->base && *map->base == spriteram ) - sprintf(dst, "sprite+%04X", lshift(base - map->start) ); - else -#endif - switch( (FPTR)map->write.handler ) - { - case (FPTR)MWA8_RAM: - sprintf(dst, "RAM%d+%04X", ram_cnt, lshift(base - map->start) ); - break; - case (FPTR)MWA8_ROM: - name = name_rom("ROM", REGION_CPU1+active_cpu, &base, map->start ); - sprintf(dst, "%s+%04X", name, lshift(base) ); - break; - case (FPTR)MWA8_BANK1: case (FPTR)MWA8_BANK2: - case (FPTR)MWA8_BANK3: case (FPTR)MWA8_BANK4: - case (FPTR)MWA8_BANK5: case (FPTR)MWA8_BANK6: - case (FPTR)MWA8_BANK7: case (FPTR)MWA8_BANK8: - case (FPTR)MWA8_BANK9: case (FPTR)MWA8_BANK10: - case (FPTR)MWA8_BANK11: case (FPTR)MWA8_BANK12: - case (FPTR)MWA8_BANK13: case (FPTR)MWA8_BANK14: - case (FPTR)MWA8_BANK15: case (FPTR)MWA8_BANK16: - case (FPTR)MWA8_BANK17: case (FPTR)MWA8_BANK18: - case (FPTR)MWA8_BANK19: case (FPTR)MWA8_BANK20: - case (FPTR)MWA8_BANK21: case (FPTR)MWA8_BANK22: - case (FPTR)MWA8_BANK23: case (FPTR)MWA8_BANK24: - sprintf(dst, "BANK%d+%04X", 1 + (int)(MWA8_BANK1) - (int)(map->write.handler), lshift(base - map->start) ); - break; - case (FPTR)MWA8_NOP: - sprintf(dst, "NOP%d+%04X", nop_cnt, lshift(base - map->start) ); - break; - } - } - switch( (FPTR)map->write.handler ) - { - case (FPTR)MRA8_RAM: ram_cnt++; break; - case (FPTR)MRA8_NOP: nop_cnt++; break; - } - } - map++; - } - - return dst; -} - -/************************************************************************** - * name_memory - * Find a descriptive name for the given memory region of active_cpu - **************************************************************************/ -static const char *name_memory( unsigned base ) -{ - static char buffer[8][79+1]; - static int which = 0; - const char *rd, *wr; - - /* search readmem and writemem names */ - rd = name_rdmem( base ); - wr = name_wrmem( base ); - - /* both empty, so it's no specific region */ - if( *rd == '\0' && *wr == '\0' ) - { - which = (which+1) % 8; - sprintf(buffer[which], "N/A:%04X", base); - return buffer[which]; - } - - which = (which+1) % 8; - - /* both names differ? */ - if( strcmp(rd,wr) ) - /* well, return both (separated by tab means left/right aligned) */ - sprintf(buffer[which], "%s\t%s", rd, wr); - else - /* return the name for readmem... */ - sprintf(buffer[which], "%s", rd); - - return buffer[which]; -} - -/************************************************************************** - * win_create - * Wrapper function to fill a struct sWindow and call win_open() - **************************************************************************/ -static int win_create(int n, UINT8 prio, int x, int y, int w, int h, - UINT8 co_text, UINT8 co_frame, UINT8 chr, UINT32 attributes) -{ - struct sWindow win; - /* fill in the default values for window creation */ - memset( &win, 0, sizeof(struct sWindow) ); - win.filler = chr; - win.prio = prio; - win.x = x; - win.y = y; - win.w = w; - win.h = h; - win.flags = NO_SCROLL | NO_WRAP | BORDER_TOP | ((n)? HIDDEN : 0) | attributes; - win.co_text = co_text; - win.co_frame = co_frame; - win.co_title = cur_col[E_TITLE]; - win.saved_text = ' '; - win.saved_attr = WIN_WHITE; - return win_open(n, &win); -} - -static int DECL_SPEC win_msgbox( UINT8 color, const char *title, const char *fmt, ... ) -{ - UINT32 win = WIN_MSGBOX; - va_list arg; - int i; - - win_create( win, 0, - 4,6,60,3, color, cur_col[E_FRAME], ' ', - BORDER_TOP | BORDER_LEFT | BORDER_RIGHT | BORDER_BOTTOM | SHADOW ); - win_set_title( win, title ); - - va_start( arg, fmt ); - win_vprintf( win, fmt, arg ); - va_end( arg ); - - win_show( win ); - i = readkey(); - win_close( win ); - - return i; -} - -/************************************************************************** - * dbg_set_rect - * set a rectangle from x,y,w and h - **************************************************************************/ -INLINE void dbg_set_rect( rectangle *r, int x, int y, int w, int h ) -{ - r->min_x = x; - r->max_x = x + w - 1; - r->min_y = y; - r->max_y = y + h - 1; -} - -/************************************************************************** - * dbg_open_windows - * Depending on the CPU type, create a window layout specified - * by the CPU core - returned by function cputype_window_layout() - **************************************************************************/ -static void dbg_open_windows( void ) -{ - UINT32 flags; - UINT32 i, w, h, aw, ah; - - /* Initialize windowing engine */ - get_screen_size( &w, &h ); - win_init_engine( w, h ); - - /* anything more than 80x25 available? */ - aw = w - 80; - ah = h - 25; - - for( i = 0; i < total_cpu; i++ ) - { - const UINT8 *win_layout = (UINT8*)cpunum_window_layout(i); - rectangle regs, dasm, mem1, mem2, cmds; - - #define REGS_X win_layout[0*4+0] - #define REGS_Y win_layout[0*4+1] - #define REGS_W win_layout[0*4+2] - #define REGS_H win_layout[0*4+3] - #define DASM_X win_layout[1*4+0] - #define DASM_Y win_layout[1*4+1] - #define DASM_W win_layout[1*4+2] - #define DASM_H win_layout[1*4+3] - #define MEM1_X win_layout[2*4+0] - #define MEM1_Y win_layout[2*4+1] - #define MEM1_W win_layout[2*4+2] - #define MEM1_H win_layout[2*4+3] - #define MEM2_X win_layout[3*4+0] - #define MEM2_Y win_layout[3*4+1] - #define MEM2_W win_layout[3*4+2] - #define MEM2_H win_layout[3*4+3] - #define CMDS_X win_layout[4*4+0] - #define CMDS_Y win_layout[4*4+1] - #define CMDS_W win_layout[4*4+2] - #define CMDS_H win_layout[4*4+3] - - /* cmds window is fixed w and h, always at the bottom */ - dbg_set_rect(&cmds, CMDS_X,CMDS_Y+ah,CMDS_W+aw,CMDS_H); - if( DASM_Y == 0 ) - { - if( DASM_H + 1 == CMDS_Y ) - { - /******************** - * dasm * regs * - * *********** - * * mem1 * - * *********** - * * mem2 * - ******************** - * cmds * - ********************/ - dbg_set_rect(®s, REGS_X+aw,REGS_Y,REGS_W,REGS_H); - dbg_set_rect(&dasm, DASM_X,DASM_Y,DASM_W+aw,DASM_H+ah); - dbg_set_rect(&mem1, MEM1_X+aw,MEM1_Y,MEM1_W,MEM1_H+(ah+1)/2); - dbg_set_rect(&mem2, MEM2_X+aw,MEM2_Y+(ah+1)/2,MEM2_W,MEM2_H+ah/2); - } - else - if( MEM1_X == MEM2_X ) - { - /******************** - * dasm * regs * - ********** * - * mem1 * * - ********** * - * mem2 * * - ******************** - * cmds * - ********************/ - dbg_set_rect(®s, REGS_X+aw,REGS_Y,REGS_W,REGS_H); - dbg_set_rect(&dasm, DASM_X,DASM_Y,DASM_W+aw,DASM_H); - dbg_set_rect(&mem1, MEM1_X,MEM1_Y,MEM1_W+aw,MEM1_H+(ah+1)/2); - dbg_set_rect(&mem2, MEM2_X,MEM2_Y+(ah+1)/2,MEM2_W+aw,MEM2_H+ah/2); - } - else - if( DASM_X < REGS_X ) - { - /******************** - * dasm * regs * - * * * - * * * - ******************** - * mem1 * mem2 * - ******************** - * cmds * - ********************/ - dbg_set_rect(®s, REGS_X+aw,REGS_Y,REGS_W,REGS_H); - dbg_set_rect(&dasm, DASM_X,DASM_Y,DASM_W+aw,DASM_H+(ah+1)/2); - dbg_set_rect(&mem1, MEM1_X,MEM1_Y+(ah+1)/2,MEM1_W+aw,MEM1_H+ah/2); - dbg_set_rect(&mem2, MEM2_X+aw,MEM2_Y,MEM2_W,MEM2_H+ah); - } - else - { - /******************** - * regs * dasm * - * * * - * * * - ******************** - * mem1 * mem2 * - ******************** - * cmds * - ********************/ - dbg_set_rect(&dasm, DASM_X+aw,DASM_Y,DASM_W,DASM_H); - dbg_set_rect(®s, REGS_X,REGS_Y,REGS_W+aw,REGS_H+(ah+1)/2); - dbg_set_rect(&mem1, MEM1_X,MEM1_Y+(ah+1)/2,MEM1_W+aw,MEM1_H+ah/2); - dbg_set_rect(&mem2, MEM2_X+aw,MEM2_Y,MEM2_W,MEM2_H+ah); - } - } - else - { - /******************** - * regs * - ******************** - * dasm * mem1 * - * *********** - * * mem2 * - ******************** - * cmds * - ********************/ - dbg_set_rect(®s, REGS_X,REGS_Y,REGS_W+aw,REGS_H); - dbg_set_rect(&dasm, DASM_X,DASM_Y,DASM_W+(aw+1)/2,DASM_H+ah); - dbg_set_rect(&mem1, MEM1_X+(aw+1)/2,MEM1_Y,MEM1_W+aw/2,MEM1_H+(ah+1)/2); - dbg_set_rect(&mem2, MEM2_X+(aw+1)/2,MEM2_Y+(ah+1)/2,MEM2_W+aw/2,MEM2_H+ah/2); - } - - flags = BORDER_TOP; - if( regs.max_x + 1 < w ) flags |= BORDER_RIGHT; - win_create(WIN_REGS(i), 1, - regs.min_x,regs.min_y, - regs.max_x+1-regs.min_x,regs.max_y+1-regs.min_y, - cur_col[E_REGS], cur_col[E_FRAME], ' ', flags ); - - flags = BORDER_TOP | BORDER_RIGHT; - win_create(WIN_DASM(i), 1, - dasm.min_x, dasm.min_y, - dasm.max_x+1-dasm.min_x,dasm.max_y+1-dasm.min_y, - cur_col[E_DASM], cur_col[E_FRAME], ' ', flags ); - - flags = BORDER_TOP; - if( mem1.max_x + 1 < w ) flags |= BORDER_RIGHT; - win_create(WIN_MEM1(i), 1, - mem1.min_x,mem1.min_y, - mem1.max_x+1-mem1.min_x,mem1.max_y+1-mem1.min_y, - cur_col[E_MEM1], cur_col[E_FRAME], ' ', flags ); - - flags = BORDER_TOP; - if( mem2.max_x + 1 < w) flags |= BORDER_RIGHT; - win_create(WIN_MEM2(i), 1, - mem2.min_x,mem2.min_y, - mem2.max_x+1-mem2.min_x,mem2.max_y+1-mem2.min_y, - cur_col[E_MEM2], cur_col[E_FRAME], ' ', flags ); - - flags = BORDER_TOP; - win_create(WIN_CMDS(i), 1, - cmds.min_x,cmds.min_y, - cmds.max_x+1-cmds.min_x,cmds.max_y+1-cmds.min_y, - cur_col[E_CMDS], cur_col[E_FRAME], ' ', flags ); - - win_set_title(WIN_CMDS(i), "Command (press F1 for help)"); - } -} - -/************************************************************************** - * dbg_close_windows - * Close all windows and shut down the window engine - **************************************************************************/ -static void dbg_close_windows( void ) -{ - int i; - - for( i = 0; i < total_cpu; i++ ) - { - win_close( WIN_REGS(i) ); - win_close( WIN_DASM(i) ); - win_close( WIN_MEM1(i) ); - win_close( WIN_MEM2(i) ); - win_close( WIN_CMDS(i) ); - } - win_exit_engine(); -} - -/************************************************************************** - * dasm_line - * disassemble instructions from pc and return the final pc - **************************************************************************/ -static unsigned dasm_line( unsigned pc, int times ) -{ - static char buffer[127+1]; - - while( times-- > 0 ) - pc += activecpu_dasm( buffer, pc ) & DASMFLAG_LENGTHMASK; - pc = lshift( rshift(pc) & AMASK ); - - return pc; -} - - -/************************************************************************** - * dump_regs - * Update the register display - * Compare register values against the ones stored in reg->backup[] - * Store new values in reg->newval[] which is copied to reg->backup[] - * before the next instruction is executed (at the end of MAME_Debug). - **************************************************************************/ -static void dump_regs( void ) -{ - char title[80+1]; - UINT32 win = WIN_REGS(active_cpu); - s_regs *regs = &DBGREGS; - s_edit *pedit = regs->edit; - UINT32 *old = regs->backup; - UINT32 *val = regs->newval; - UINT32 width=0; - const char *name = activecpu_name(), *flags = activecpu_flags(); - int w = win_get_w(win); - int h = win_get_h(win); - int i, j, l, x, y; - UINT8 color; - const INT8 *reg = (INT8*)activecpu_register_layout(); - - /* Called the very first time: find max_width */ - if( regs->count == 0 ) - { - for(i = 0; reg[i]; i++) - { - const char* result; - if( reg[i] == -1 ) - continue; /* skip row breaks */ - - result=activecpu_reg_string(reg[i]); - if( result ) - { - if (*result == '~') - result++; - width = strlen( result ); - } - - if( width >= regs->max_width ) - regs->max_width = width + 1; - } - } - - x = 0; - y = 0; - win_set_curpos( win, 0, 0 ); - sprintf( title, "CPU #%d %-8s Flags:%s Cycles:%6u", active_cpu, name, flags, activecpu_get_icount() ); - l = strlen(title); - if( l + 2 < w ) - { - /* Everything should fit into the caption */ - if( l + 4 < w ) - /* We can even separate the cycles to the right corner */ - sprintf( title, "CPU #%d %-8s Flags:%s\tCycles:%6u", active_cpu, name, flags, activecpu_get_icount() ); - win_set_title( win, title ); - } - else - { - /* At least CPU # and flags should fit into the caption */ - sprintf( title, "CPU #%d %-8s Flags:%s", active_cpu, name, flags ); - l = strlen(title); - if( l + 2 < w ) - { - if( l + 4 < w ) - sprintf( title, "CPU #%d %-8s\tFlags:%s", active_cpu, name, flags ); - win_set_title( win, title ); - if( y < h ) - { - win_printf( win, "Cycles:%6u\n", activecpu_get_icount() ); - } - y++; - } - else - { - sprintf( title, "CPU #%d %-8s Cyc:%6u", active_cpu, name, activecpu_get_icount() ); - l = strlen(title); - if( l + 2 < w ) - { - if( l + 4 < w ) - sprintf( title, "CPU #%d %-8s\tCyc:%6u", active_cpu, name, activecpu_get_icount() ); - win_set_title( win, title ); - if( y < h ) - { - if( strlen(activecpu_flags()) + 8 < w ) - win_printf( win, "Flags: %s\n", flags ); - else - if( strlen(activecpu_flags()) + 2 < w ) - win_printf( win, "F:%s\n", flags ); - else - win_printf( win, "%s\n", flags ); - } - y++; - } - else - { - /* Only CPU # and name fit into the caption */ - sprintf( title, "CPU #%d %-8s", active_cpu, name ); - l = strlen(title); - win_set_title( win, title ); - if( y < h ) - { - if( strlen(activecpu_flags()) + 8 < w ) - win_printf( win, "Flags: %s\n", flags ); - else - if( strlen(activecpu_flags()) + 2 < w ) - win_printf( win, "F:%s\n", flags ); - else - win_printf( win, "%s\n", flags ); - } - y++; - if( y < h ) - { - win_printf( win, "Cycles:%6u\n", activecpu_get_icount() ); - } - y++; - } - } - } - - /* show the scanline position, if appropriate */ - if (dbg_show_scanline) - { - win_printf( win, "Scanline: %d Horz: %d\n", cpu_getscanline(), cpu_gethorzbeampos()); - y++; - } - - regs->top = y; - y = 0; - - for( i = 0, j = 0; *reg; i++, reg++ ) - { - if( *reg == -1 ) - { - if( y >= regs->base && y < regs->base + h - regs->top ) - { - win_erase_eol( win, ' ' ); - win_putc( win, '\n'); - } - x = 0; - y++; - } - else - { - name = activecpu_reg_string(*reg); - if( !name || *name == '\0' ) - continue; - if( *name == '~' ) - name++; - - regs->id[j] = *reg; - *val = activecpu_get_reg(regs->id[j]); - color = cur_col[E_REGS]; - if( DBG.brk_regs == *reg ) - color = cur_col[E_BRK_REGS]; - if( *val != *old ) - { - regs->changed = 1; - color = (color & 0xf0) | cur_col[E_CHANGES]; - } - win_set_color( win, color ); - - /* edit structure not yet initialized? */ - if( regs->count == 0 ) - { - const char *p; - /* Get the cursor position */ - pedit->x = x; - pedit->y = y + regs->base; - if( strlen(name) >= regs->max_width ) - regs->max_width = strlen(name) + 1; - /* Find a colon */ - p = strchr( name, ':' ); - if( p ) - { - pedit->w = strlen( p + 1 ); - } - else - { - /* Or else find an apostrophe */ - p = strchr( name, '\'' ); - if( p ) - { - /* Include the apostrophe in the name! */ - ++p; - pedit->w = strlen( p ); - } - else - { - /* TODO: other characters to delimit a register name from it's value? */ - /* this is certainly wrong :( */ - p = name; - pedit->w = strlen( p ); - } - } - /* length of the name (total length - length of nibbles) */ - pedit->n = strlen( name ) - pedit->w; - - /* strip trailing spaces */ - l = p - name; - while( l != 0 && name[ l - 1 ] == ' ' ) - { - l--; - } - if( l > sizeof( regs->name[ j ] ) - 1 ) - { - l = sizeof( regs->name[ j ] ) - 1; - } - memcpy( regs->name[ j ], name, l ); - regs->name[ j ][ l ] = 0; - } - if( y >= regs->base && y < regs->base + h - regs->top ) - { - win_printf( win, "%s", name ); - - win_set_color( win, cur_col[E_REGS] ); - /* If no row break follows, advance to the next tab stop */ - if( reg[1] != -1 ) - win_printf( win, "%*s", regs->max_width - pedit->w - pedit->n, "" ); - } - x += strlen( name ) + regs->max_width - pedit->w - pedit->n; - pedit++; - val++; - old++; - j++; - } - } - while( y >= regs->base && y < regs->base + h - regs->top ) - { - win_erase_eol( win, ' ' ); - win_putc( win, '\n' ); - y++; - } - - /* Set the total count of registers */ - regs->count = j; -} - -/************************************************************************** - * dump_dasm - * Update the disassembly display - **************************************************************************/ -static unsigned dump_dasm( unsigned pc ) -{ - UINT32 win = WIN_DASM(active_cpu); - int w = win_get_w(win); - int h = win_get_h(win); - int y, l, line_pc_cpu = INVALID, line_pc_cur = INVALID; - UINT8 color; - char dasm[127+1]; - unsigned pc_first = pc, pc_next; - unsigned width = (ABITS + 3) / 4; - - while( line_pc_cpu == INVALID ) - { - pc = pc_first; - - for( y = 0; y < h; y++ ) - { - win_set_curpos( win, 0, y ); - if( pc == DBG.brk_exec ) - color = cur_col[E_BRK_EXEC]; - else - color = cur_col[E_DASM]; - if( pc == DBGDASM.pc_cpu ) - { - color = (color & 0x0f) | (cur_col[E_PC] & 0xf0); - line_pc_cpu = y; - } - if( pc == DBGDASM.pc_cur ) - { - color = (color & 0x0f) | (cur_col[E_CURSOR] & 0xf0); - line_pc_cur = y; - } - win_set_color( win, color ); - l = win_printf( win, "%0*X: ", width, pc ); - - DBGDASM.dst_ea_value = INVALID; - DBGDASM.src_ea_value = INVALID; - pc_next = pc + (activecpu_dasm( dasm, pc ) & DASMFLAG_LENGTHMASK); - - if( DBGDASM.pc_cur == pc ) - win_set_title( win, "%s", get_ea_info(pc) ); - - if( dbg_dasm_opcodes ) - { - unsigned p = rshift(pc); - unsigned n = rshift(pc_next); - int i, j; - - for( i = 0; i < INSTL; i += IALIGN ) - { - for( j = 0; j < IALIGN; j++ ) - { - if ( p < n ) - { - l += win_printf( win, "%02X", - RDSPC(ADDRESS_SPACE_PROGRAM, order(p,IALIGN)) ); - p++; - } - else l += win_printf( win, " " ); - } - l += win_printf( win, " " ); - } - } - - pc = pc_next; - switch( dbg_dasm_case ) - { - case 0: win_printf( win, "%-*.*s", w-l, w-l, dasm ); break; - case 1: win_printf( win, "%-*.*s", w-l, w-l, lower(dasm) ); break; - case 2: win_printf( win, "%-*.*s", w-l, w-l, upper(dasm) ); break; - } - } - if( line_pc_cpu == INVALID ) - { - /* - * We didn't find the exact instruction of the CPU PC. - * This has to be caused by a jump into the midst of - * another instruction down from the top. If the CPU PC - * is between pc_first and pc (end), try again on next - * instruction size boundary, else bail out... - */ - if( DBGDASM.pc_cpu > pc_first && DBGDASM.pc_cpu < pc ) - pc_first += IALIGN; - else - line_pc_cpu = 0; - } - } - - win_set_curpos( win, 0, line_pc_cur ); - - return pc; -} - -/************************************************************************** - * dump_mem_hex - * Update a memory window using the cpu_readmemXXX function - * Changed values are displayed using foreground color cur_col[E_CHANGES] - * The new values are stored into mem->newval[] of the active_cpu - **************************************************************************/ -static void dump_mem_hex( int which, unsigned len_addr, unsigned len_data ) -{ - UINT32 win = WIN_MEM(active_cpu,which); - s_edit *pedit = DBGMEM[which].edit; - int w = win_get_w(win); - int h = win_get_h(win); - UINT8 *old = DBGMEM[which].backup; - UINT8 *val = DBGMEM[which].newval; - UINT8 color, dim_bright = 0; - UINT8 spc_left = 0; /* assume no space left of address */ - UINT8 spc_addr = 0; /* assume no space after address */ - UINT8 spc_data = 1; /* assume one space between adjacent data elements */ - UINT8 spc_hyphen = 0; /* assume no space around center hyphen */ - unsigned offs, column; - - /* how many elements (bytes,words,dwords) will fit in a line? */ - DBGMEM[which].width = (w - len_addr - 1) / (len_data + spc_data); - - /* display multiples of eight bytes per line only */ - if( DBGMEM[which].width > ((16/len_data)-1) ) - DBGMEM[which].width &= ~((16/len_data)-1); - - /* Is bytes per line not divideable by eight? */ - if( dbg_mem_squeezed && (DBGMEM[which].width & 7) ) - { - /* We try an alternating dim,bright layout w/o data spacing */ - spc_data = 0; - /* how many bytes will fit in a line? */ - DBGMEM[which].width = (w - len_addr - 1) / len_data; - /* display multiples of eight data elements per line only */ - if( DBGMEM[which].width > ((16/len_data)-1) ) - DBGMEM[which].width &= ~((16/len_data)-1); - dim_bright = 0x08; - } - - /* calculate number of bytes per line */ - DBGMEM[which].bytes = DBGMEM[which].width * len_data / 2; - /* calculate the DBGMEM[which].size using that data width */ - DBGMEM[which].size = DBGMEM[which].bytes * h; - - /* will a space after the address fit into the line? */ - if( ( len_addr + spc_addr + DBGMEM[which].width * (len_data + spc_data) + 1 ) < w ) - spc_addr = 1; - - /* will two spaces around the center hyphen fit into the line ? */ - if( ( len_addr + spc_addr + DBGMEM[which].width * (len_data + spc_data) + 2 ) < w ) - spc_hyphen = 1; - - while( ( 2*spc_left + len_addr + spc_addr + DBGMEM[which].width * (len_data + spc_data) - 1 + spc_hyphen ) + 2 < w ) - spc_left++; - - win_set_curpos( win, 0, 0 ); - - for( offs = 0, column = 0; offs < DBGMEM[which].size; offs++, old++, val++ ) - { - color = cur_col[E_MEM1+which]; - switch( len_data ) - { - case 2: /* UINT8 mode */ - DBGMEM[which].address = (DBGMEM[which].base + order(offs,1)) & AMASKS(DBGMEM[which].space); - break; - case 4: /* UINT16 mode */ - DBGMEM[which].address = (DBGMEM[which].base + order(offs,2)) & AMASKS(DBGMEM[which].space); - break; - case 8: /* UINT32 mode */ - DBGMEM[which].address = (DBGMEM[which].base + order(offs,4)) & AMASKS(DBGMEM[which].space); - break; - case 16: /* UINT64 mode */ - DBGMEM[which].address = (DBGMEM[which].base + order(offs,8)) & AMASKS(DBGMEM[which].space); - break; - } - - if( column == 0 ) - { - win_set_color( win, cur_col[E_MEM1+which] ); - win_printf( win, "%*s%0*X:%*s", - spc_left, "", len_addr, lshift((DBGMEM[which].base + offs) & AMASK), spc_addr, "" ); - } - - if( DBGMEM[which].address == DBG.brk_data ) - color = cur_col[E_BRK_DATA]; - - *val = RDSPC( DBGMEM[which].space, DBGMEM[which].address ); - - if( *val != *old ) - { - DBGMEM[which].changed = 1; - color = (color & 0xf0) | (cur_col[E_CHANGES] & 0x0f); - } - - if( (column * 2 / len_data) & 1 ) - color ^= dim_bright; - - /* store memory edit x,y */ - pedit->x = win_get_cx( win ); - pedit->y = win_get_cy( win ); - pedit->w = 2; - pedit->n = order(column % (len_data / 2), len_data / 2); - pedit++; - - win_set_color( win, color ); - switch( DBGMEM[which].ascii ) - { - case MODE_CHR_HEX: - win_printf( win, "%02X", *val ); - break; - case MODE_CHR_XLATE: - win_printf( win, "%c ", trans_table[*val] ); - break; - case MODE_CHR_PLAIN: - if( *val == '\0' || *val == '\b' || *val == '\t' || - *val == '\r' || *val == '\n' ) - win_printf( win, ". " ); - else - win_printf( win, "%c ", *val ); - break; - } - - if( ++column < DBGMEM[which].bytes ) - { - win_set_color( win, cur_col[E_MEM1+which] ); - if( column == DBGMEM[which].bytes / 2 ) - win_printf( win, "%*s-%*s", spc_hyphen, "", spc_hyphen, "" ); - else - if( spc_data && (column * 2 % len_data) == 0 ) - win_putc( win, ' ' ); - } - else - { - win_putc( win, '\n'); - column = 0; - } - } -} - -/************************************************************************** - * dump_mem - * Update a memory window - * Dispatch to one of the memory handler specific output functions - **************************************************************************/ -static void dump_mem( int which, int set_title ) -{ - unsigned len_addr = (ABITS + ASHIFT + 3) / 4; - - if( set_title ) - { -// if( DBGMEM[which].internal ) -// win_set_title( WIN_MEM(active_cpu,which), "CPU internal" ); -// else - win_set_title( WIN_MEM(active_cpu,which), name_memory(DBGMEM[which].base) ); - } - - switch( DBGMEM[which].mode ) - { - case MODE_HEX_UINT8: dump_mem_hex( which, len_addr, 2 ); break; - case MODE_HEX_UINT16: dump_mem_hex( which, len_addr, 4 ); break; - case MODE_HEX_UINT32: dump_mem_hex( which, len_addr, 8 ); break; - case MODE_HEX_UINT64: dump_mem_hex( which, len_addr, 16 ); break; - } -} - -/************************************************************************** - * edit_regs - * Edit the registers - **************************************************************************/ -static void edit_regs( void ) -{ - UINT32 win = WIN_REGS(active_cpu); - s_regs *regs = &DBGREGS; - s_edit *pedit = regs->edit; - unsigned shift, mask, val; - const char *k; - int i, x, y; - - /* Eventually update the cmdline window caption */ - edit_cmds_info(); - - if( regs->base > pedit[ regs->idx ].y ) - { - regs->base = pedit[ regs->idx ].y; - dump_regs(); - } - else - if( pedit[ regs->idx ].y >= regs->base + win_get_h( win ) - regs->top ) - { - regs->base = pedit[ regs->idx ].y - win_get_h( win ) + regs->top + 1; - dump_regs(); - } - win_set_curpos( win, pedit[regs->idx].x + pedit[regs->idx].n + regs->nibble, pedit[regs->idx].y - regs->base + regs->top); - set_screen_curpos( win_get_cx_abs(win), win_get_cy_abs(win) ); - - i = readkey(); - k = code_name(i); - - shift = ( pedit[ regs->idx ].w - 1 - regs->nibble ) * 4; - mask = ~(0x0000000f << shift); - - if( strlen(k) == 1 ) - { - switch( k[0] ) - { - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - case '8': case '9': case 'A': case 'B': - case 'C': case 'D': case 'E': case 'F': - val = k[0] - '0'; - if( val > 9 ) val -= 7; - val <<= shift; - /* now modify the register */ - activecpu_set_reg( regs->id[regs->idx], - ( activecpu_get_reg( regs->id[regs->idx] ) & mask ) | val ); - dump_regs(); - i = KEYCODE_RIGHT; /* advance to next nibble */ - } - } - - switch( i ) - { - case KEYCODE_LEFT: - if( --regs->nibble < 0 ) - { - if( --regs->idx < 0 ) - { - regs->idx = regs->count - 1; - } - regs->nibble = pedit[regs->idx].w - 1; - } - break; - - case KEYCODE_RIGHT: - if( ++regs->nibble >= pedit[regs->idx].w ) - { - regs->nibble = 0; - if( ++regs->idx >= regs->count ) - { - regs->idx = 0; - } - } - break; - - case KEYCODE_UP: - i = regs->idx; - x = pedit[regs->idx].x; - y = pedit[regs->idx].y; - while( x != pedit[i].x || pedit[i].y == y ) - { - if( --i < 0 ) - { - i = regs->count - 1; - if( pedit[i].y == y ) - { - i = regs->idx; - break; - } - } - } - if( i != regs->idx ) - { - if( regs->nibble >= pedit[i].w ) - regs->nibble = pedit[i].w - 1; - regs->idx = i; - } - break; - - case KEYCODE_DOWN: - i = regs->idx; - x = pedit[regs->idx].x; - y = pedit[regs->idx].y; - while( x != pedit[i].x || pedit[i].y == y ) - { - if( ++i >= regs->count ) - { - i = 0; - if( pedit[i].y == y ) - { - i = regs->idx; - break; - } - } - } - if( i != regs->idx ) - { - if( regs->nibble >= pedit[i].w ) - regs->nibble = pedit[i].w - 1; - regs->idx = i; - } - break; - - case KEYCODE_ENTER: - DBG.window = EDIT_CMDS; - break; - - default: - cmd_default( i ); - } -} - - -/************************************************************************** - * edit_dasm - * Edit the disassembly output - **************************************************************************/ -static void edit_dasm(void) -{ - UINT32 win = WIN_DASM(active_cpu); - const char *k; - int i, update_window = 0; - - /* Eventually update the cmdline window caption */ - edit_cmds_info(); - - set_screen_curpos( win_get_cx_abs(win), win_get_cy_abs(win) ); - - i = readkey(); - k = code_name(i); - - switch( i ) - { - case KEYCODE_M: /* Toggle mode (opcode display) */ - sprintf( CMD, "%d", dbg_dasm_opcodes ^ 1 ); - cmd_set_dasm_opcodes(); - break; - - case KEYCODE_D: /* Default case disassembly */ - dbg_dasm_case = 0; - update_window = 1; - break; - - case KEYCODE_L: /* Lower case disassembly */ - dbg_dasm_case = 1; - update_window = 1; - break; - - case KEYCODE_U: /* Upper case disassembly */ - dbg_dasm_case = 2; - update_window = 1; - break; - - case KEYCODE_R: /* Toggle relative jumps display */ - dbg_dasm_relative_jumps ^= 1; - update_window = 1; - break; - - case KEYCODE_ENTER: - DBG.window = EDIT_CMDS; - break; - - default: - cmd_default( i ); - } - if( update_window ) - { - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - } -} - - -/************************************************************************** - * edit_mem - * Edit the memory dumps output - **************************************************************************/ -static void edit_mem( int which ) -{ - UINT32 win = WIN_MEM(active_cpu,which); - s_edit *pedit = DBGMEM[which].edit; - const char *k; - unsigned shift, mask, val; - int i, update_window = 0; - - /* Eventually update the cmdline window caption */ - edit_cmds_info(); - - win_set_curpos( win, pedit[DBGMEM[which].offset].x + DBGMEM[which].nibble, pedit[DBGMEM[which].offset].y ); - set_screen_curpos( win_get_cx_abs(win), win_get_cy_abs(win) ); - - switch( DBGMEM[which].mode ) - { - case MODE_HEX_UINT8: - DBGMEM[which].address = (DBGMEM[which].base + DBGMEM[which].offset) & AMASKS(DBGMEM[which].space); - break; - case MODE_HEX_UINT16: - DBGMEM[which].address = (DBGMEM[which].base + (DBGMEM[which].offset & ~1) + pedit[DBGMEM[which].offset].n ) & AMASKS(DBGMEM[which].space); - break; - case MODE_HEX_UINT32: - DBGMEM[which].address = (DBGMEM[which].base + (DBGMEM[which].offset & ~3) + pedit[DBGMEM[which].offset].n ) & AMASKS(DBGMEM[which].space); - break; - case MODE_HEX_UINT64: - DBGMEM[which].address = (DBGMEM[which].base + (DBGMEM[which].offset & ~7) + pedit[DBGMEM[which].offset].n ) & AMASKS(DBGMEM[which].space); - break; - } - win_set_title( win, name_memory(DBGMEM[which].address) ); - - i = readkey(); - k = code_name(i); - - shift = (pedit[DBGMEM[which].offset].w - 1 - DBGMEM[which].nibble) * 4; - mask = ~(0x0f << shift); - - if( strlen(k) == 1 ) - { - switch( k[0] ) - { - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - case '8': case '9': case 'A': case 'B': - case 'C': case 'D': case 'E': case 'F': - val = k[0] - '0'; - if( val > 9 ) val -= 7; - val <<= shift; - /* now modify the register */ - WRSPC(DBGMEM[which].space, DBGMEM[which].address, ( RDMEM( DBGMEM[which].address ) & mask ) | val); - update_window = 1; - i = KEYCODE_RIGHT; /* advance to next nibble */ - } - } - - switch( i ) - { - case KEYCODE_LEFT: - if( --DBGMEM[which].nibble < 0 ) - { - if( --DBGMEM[which].offset < 0 ) - { - DBGMEM[which].base = (DBGMEM[which].base - DBGMEM[which].bytes) & AMASKS(DBGMEM[which].space); - DBGMEM[which].offset += DBGMEM[which].bytes; - update_window = 1; - } - DBGMEM[which].nibble = pedit[DBGMEM[which].offset].w - 1; - } - break; - - case KEYCODE_RIGHT: - if( ++DBGMEM[which].nibble >= pedit[DBGMEM[which].offset].w ) - { - DBGMEM[which].nibble = 0; - if( ++DBGMEM[which].offset >= DBGMEM[which].size ) - { - DBGMEM[which].base = (DBGMEM[which].base + DBGMEM[which].bytes) & AMASKS(DBGMEM[which].space); - DBGMEM[which].offset -= DBGMEM[which].bytes; - update_window = 1; - } - } - break; - - case KEYCODE_UP: - DBGMEM[which].offset -= DBGMEM[which].bytes; - if( DBGMEM[which].offset < 0 ) - { - DBGMEM[which].base = (DBGMEM[which].base - DBGMEM[which].bytes) & AMASKS(DBGMEM[which].space); - DBGMEM[which].offset += DBGMEM[which].bytes; - update_window = 1; - } - break; - - case KEYCODE_DOWN: - DBGMEM[which].offset += DBGMEM[which].bytes; - if( DBGMEM[which].offset >= DBGMEM[which].size ) - { - DBGMEM[which].base = (DBGMEM[which].base + DBGMEM[which].bytes) & AMASKS(DBGMEM[which].space); - DBGMEM[which].offset -= DBGMEM[which].bytes; - update_window = 1; - } - break; - - case KEYCODE_PGUP: - DBGMEM[which].base = (DBGMEM[which].base - DBGMEM[which].size) & AMASKS(DBGMEM[which].space); - update_window = 1; - break; - - case KEYCODE_PGDN: - DBGMEM[which].base = (DBGMEM[which].base + DBGMEM[which].size) & AMASKS(DBGMEM[which].space); - update_window = 1; - break; - - case KEYCODE_HOME: - DBGMEM[which].offset = 0; - DBGMEM[which].base = 0x00000000; - update_window = 1; - break; - - case KEYCODE_END: - DBGMEM[which].offset = DBGMEM[which].size - 1; - DBGMEM[which].base = (0xffffffff - DBGMEM[which].offset) & AMASKS(DBGMEM[which].space); - update_window = 1; - break; - - case KEYCODE_H: - DBGMEM[which].ascii = ++(DBGMEM[which].ascii) % MODE_CHR_COUNT; - update_window = 1; - break; - - case KEYCODE_M: /* display mode */ - DBGMEM[which].mode = ++(DBGMEM[which].mode) % MODE_HEX_COUNT; - /* Reset cursor coordinates and sizes of the edit info */ - memset( DBGMEM[which].edit, 0, sizeof(DBGMEM[which].edit) ); - update_window = 1; - break; - - case KEYCODE_P: /* program memory */ - DBGMEM[which].space = ADDRESS_SPACE_PROGRAM; - memset( DBGMEM[which].edit, 0, sizeof(DBGMEM[which].edit) ); - update_window = 1; - break; - - case KEYCODE_T: /* data memory */ - DBGMEM[which].space = ADDRESS_SPACE_DATA; - memset( DBGMEM[which].edit, 0, sizeof(DBGMEM[which].edit) ); - update_window = 1; - break; - - case KEYCODE_I: /* internal memory */ -#if 0 - if( cputype_get_interface(cputype)->internal_read ) - { - DBGMEM[which].internal ^= 1; - /* Reset cursor coordinates and sizes of the edit info */ - memset( DBGMEM[which].edit, 0, sizeof(DBGMEM[which].edit) ); - update_window = 1; - } -#endif - break; - - case KEYCODE_ENTER: - DBG.window = EDIT_CMDS; - break; - - default: - cmd_default( i ); - update_window = 1; - } - - if( update_window ) - { - memcpy( DBGMEM[which].backup, DBGMEM[which].newval, DBGMEM[which].size ); - dump_mem( which, 0 ); - } -} - -/************************************************************************** - * edit_cmds_info - * Search the cmdline for the beginning of a known command and - * display some information in the caption of the command line input - **************************************************************************/ -static int edit_cmds_info( void ) -{ - char *cmd = CMD; - char hist_info[31+1]; - int i, l; - - hist_info[0] = '\0'; - if( DBG.hist_cnt ) - sprintf( hist_info, "\tHistory: %d", DBG.hist_cnt); - - if( strlen(cmd) ) - { - for( i = 0; commands[i].name; i++ ) - { - l = strlen(cmd); - if( strlen(commands[i].name) < l ) - l = strlen(commands[i].name); - if( strncmp( cmd, commands[i].name, l ) == 0 && !isalnum(cmd[l]) ) - { - win_set_title( WIN_CMDS(active_cpu), "Command: %s %s%s", - commands[i].name, commands[i].args, hist_info ); - return i; - } - if( commands[i].alias ) - { - l = strlen(cmd); - if( strlen(commands[i].alias) < l ) - l = strlen(commands[i].alias); - if( strncmp( cmd, commands[i].alias, l ) == 0 && !isalnum(cmd[l]) ) - { - win_set_title( WIN_CMDS(active_cpu), "Command: %s %s (aka %s)%s", - commands[i].alias, commands[i].args, commands[i].name, hist_info ); - return i; - } - } - } - } - if( dbg_info_once ) - { - win_set_title( WIN_CMDS(active_cpu), "%s%s", dbg_info_once, hist_info ); - dbg_info_once = NULL; - } - else - { - win_set_title( WIN_CMDS(active_cpu), "Command (press F1 for help)%s", hist_info ); - } - return INVALID; -} - -/************************************************************************** - * edit_cmds_parse - * Search the cmdline for a known command and if found, - * strip it from cmdline and return it's index - **************************************************************************/ -static int edit_cmds_parse( char *cmdline ) -{ - int i, l; - - for( i = 0; commands[i].valid; i++ ) - { - if( !commands[i].name ) - continue; - l = strlen( commands[i].name ); - if( !strncmp( cmdline, commands[i].name, l ) && !isalnum( cmdline[l] ) ) - { - while( cmdline[l] && isspace( cmdline[l] ) ) l++; - strcpy( cmdline, cmdline + l ); - return i; - } - if( commands[i].alias ) - { - l = strlen( commands[i].alias ); - if( !strncmp( cmdline, commands[i].alias, l ) && !isalnum( cmdline[l] ) ) - { - while( cmdline[l] && isspace( cmdline[l] ) ) l++; - strcpy( cmdline, cmdline + l ); - return i; - } - } - } - return INVALID; -} - - -/************************************************************************** - * edit_cmds_append - * Append a character (string) to the command line - **************************************************************************/ -static void edit_cmds_append( const char *src ) -{ - char *cmdline = DBG.cmdline; - UINT32 win = WIN_CMDS(active_cpu); - if( strlen(cmdline) < 80 ) - { - strcat(cmdline, src); - win_printf( win, "%s", src ); - } -} - -void edit_cmds_reset( void ) -{ - unsigned win = WIN_CMDS(active_cpu); - DBG.cmdline[0] = '\0'; - win_set_color( win, cur_col[E_CMDS] ); - win_set_curpos( win, 0, 0 ); - set_screen_curpos( win_get_cx_abs(win), win_get_cy_abs(win) ); - win_erase_eol( win, ' ' ); -} - -/************************************************************************** - * edit_cmds - * Edit the command line input - **************************************************************************/ -static void edit_cmds(void) -{ - char *cmdline = DBG.cmdline; - UINT32 win = WIN_CMDS(active_cpu); - const char *k; - int i, l, cmd; - - set_screen_curpos( win_get_cx_abs(win), win_get_cy_abs(win) ); - - cmd = edit_cmds_info(); - - i = readkey(); - k = code_name(i); - l = strlen(k); - - if( l == 1 ) - edit_cmds_append(k); - - switch( i ) - { - case KEYCODE_SPACE: - /* - * Command completion for convenience: - * found a valid command and no space in the command line yet? - */ - if( cmd != INVALID && strchr(CMD, ' ') == NULL ) - { - strcpy( CMD, commands[cmd].name ); - win_set_curpos( win, 0, 0 ); - win_printf( win, "%s", CMD ); - } - edit_cmds_append(" "); - break; - - case KEYCODE_BACKSPACE: - if( strlen(cmdline) > 0 ) - { - cmdline[strlen(cmdline)-1] = '\0'; - win_printf( win, "\b \b" ); - } - break; - - case KEYCODE_ENTER: - if( strlen(cmdline) ) - { - cmd = edit_cmds_parse( cmdline ); - if( cmd != INVALID && commands[cmd].function ) - (*commands[cmd].function)(); - break; - } - else - { - /* ENTER in an empty line: do single step... */ - i = KEYCODE_F8; - } - /* fall through */ - default: - cmd_default( i ); - } -} - -/************************************************************************** - ************************************************************************** - * - * Command functions - * - ************************************************************************** - **************************************************************************/ - -/************************************************************************** - * cmd_help - * Display a help window containing a list of the (currently) - * available commands and keystrokes. - **************************************************************************/ -static void cmd_help( void ) -{ - UINT32 win = WIN_HELP; - const char *title = ""; - char *help = malloc(4096+1), *dst; - const char *src; - unsigned w, h; - int cmd = INVALID; - int i, k, l, top, lines; - - if( !help ) - { - win_msgbox( cur_col[E_ERROR], - "Memory problem!", "Couldn't allocate help text buffer" ); - return; - } - dst = help; - - /* Decide what to print in the first lines of the help window */ - switch( DBG.window ) - { - case EDIT_CMDS: - title = "MAME Debugger command help"; - cmd = edit_cmds_info(); - /* Did not find the start of a command? */ - if( cmd == INVALID ) - { - dst += sprintf( dst, "Welcome to the MAME debugger V0.54!") + 1; - dst += sprintf( dst, " " ) + 1; - dst += sprintf( dst, "Many commands accept either a value or a register name.") + 1; - dst += sprintf( dst, "You can indeed type either \"R HL = SP\" or \"R HL = 1FD0\".") + 1; - dst += sprintf( dst, "In the syntax, where you see
you may generally") + 1; - dst += sprintf( dst, "use a number or a register name of the active CPU.") + 1; - dst += sprintf( dst, "A can be specified as ON/OFF, YES/NO, Y/N or 1/0.") + 1; - dst += sprintf( dst, "Note: You may put your preferences into a file \"mamedbg.cfg\" in your") + 1; - dst += sprintf( dst, "main directory. Furthermore you can put game specific settings into a") + 1; - dst += sprintf( dst, "set of files .cf, eg. \"dkong.cf0\" and \"dkong.cf1\".") + 1; - dst += sprintf( dst, "The files can contain different settings for the CPUs of a game.") + 1; - } - else - { - if( commands[cmd].alias ) - dst += sprintf( dst, "%s %s (aka %s)", commands[cmd].name, commands[cmd].args, commands[cmd].alias ) + 1; - else - dst += sprintf( dst, "%s %s", commands[cmd].name, commands[cmd].args ) + 1; - src = commands[cmd].info; - while( *src ) - { - *dst++ = (*src == '\n') ? '\0' : *src; - src++; - } - *dst++ = '\0'; - } - break; - case EDIT_REGS: - title = "MAME debugger CPU registers help"; - dst += sprintf( dst, "%s [%s] Version %s", activecpu_name(), activecpu_core_family(), activecpu_core_version() ) + 1; - dst += sprintf( dst, "Address bits : %d [%08X]", (int)activecpu_addrbus_width(ADDRESS_SPACE_PROGRAM), (int)(0xffffffffUL >> (32 - (int)activecpu_addrbus_width(ADDRESS_SPACE_PROGRAM))) ) + 1; - dst += sprintf( dst, "Code align unit: %d byte(s)", (int)IALIGN ) + 1; - dst += sprintf( dst, "This CPU is : %s endian", (ENDIAN == CPU_IS_LE) ? "little" : "big") + 1; - dst += sprintf( dst, "Source file : %s", activecpu_core_file() ) + 1; -// dst += sprintf( dst, "Internal read : %s", cputype_get_interface(cputype)->internal_read ? "yes" : "no" ) + 1; -// dst += sprintf( dst, "Internal write : %s", cputype_get_interface(cputype)->internal_write ? "yes" : "no" ) + 1; - dst += sprintf( dst, "Program / Data : %s", (cputype_databus_width(cputype, ADDRESS_SPACE_DATA) > 0) ? "yes" : "no" ) + 1; - dst += sprintf( dst, "%s", activecpu_core_credits() ) + 1; - break; - case EDIT_DASM: - title = "MAME debugger disassembly help"; - dst += sprintf( dst, "%s [%s]", activecpu_name(), activecpu_core_family() ) + 1; - break; - case EDIT_MEM1: - case EDIT_MEM2: - title = "MAME debugger memory editor help"; - dst += sprintf( dst, "You can move around using the cursor key block.") + 1; - dst += sprintf( dst, "Change memory by keying in hex digits (0-9, A-F).") + 1; - break; - } - dst += sprintf( dst, " " ) + 1; - dst += sprintf( dst, "Valid commands and keys are:" ) + 1; - - for( i = 0; commands[i].valid; i++ ) - { - if( commands[i].valid & ( 1 << DBG.window ) ) - { - /* Already displayed this help? */ - if( i == cmd ) - continue; - dst += sprintf( dst, " " ) + 1; - if( commands[i].name ) - { - if( commands[i].alias ) - dst += sprintf( dst, "%s %s (aka %s)", commands[i].name, commands[i].args, commands[i].alias ) + 1; - else - dst += sprintf( dst, "%s %s", commands[i].name, commands[i].args ) + 1; - src = commands[i].info; - while( *src ) - { - if( *src == '\n' ) - { - if( src[1] != '\0' ) - *dst++ = '\0'; - } - else - *dst++ = *src; - src++; - } - *dst++ = '\0'; - } - else - { - dst += sprintf( dst, "[%s]\t%s", code_name(commands[i].key), commands[i].info ) + 1; - } - } - } - - /* Terminate *help with a second NULL byte */ - *dst++ = '\0'; - - /* Count lines */ - for( lines = 0, src = help; *src && i > 0; src += strlen(src) + 1 ) - lines++; - - get_screen_size( &w, &h ); - win_create( win, 0, - 2,1,w-2-4,h-2-3, cur_col[E_HELP], cur_col[E_FRAME], ' ', - BORDER_TOP | BORDER_LEFT | BORDER_RIGHT | BORDER_BOTTOM | SHADOW ); - win_set_title( win, title ); - win_show( win ); - h = win_get_h( win ); - - top = 0; - do - { - for( src = help, i = top; *src && i > 0; src += strlen(src) + 1 ) - i--; - win_set_curpos( win, 0, 0 ); - l = 0; - do - { - if( *src ) - { - win_printf( win, src ); - src += strlen(src) + 1; - } - win_erase_eol( win, ' ' ); - win_putc( win, '\n'); - l++; - } while( l < win_get_h(win) ); - - k = readkey(); - switch( k ) - { - case KEYCODE_UP: - if( top > 0 ) - top--; - k = CODE_NONE; - break; - case KEYCODE_ENTER: - case KEYCODE_DOWN: - if( top < lines - h ) - top++; - k = CODE_NONE; - break; - case KEYCODE_PGUP: - if( top - h > 0 ) - top -= h; - else - top = 0; - k = CODE_NONE; - break; - case KEYCODE_PGDN: - if( top + h < lines - h ) - top += h; - else - top = lines - h; - k = CODE_NONE; - break; - } - } while( k == CODE_NONE ); - - free( help ); - - win_close( win ); -} - -/************************************************************************** - * cmd_default - * Handle a key stroke with no special meaning inside the active window - **************************************************************************/ -static void cmd_default( int code ) -{ - int i; - for( i = 0; commands[i].valid; i++ ) - { - if( (commands[i].valid & (1<> 4; - fg = def_col[element] & 15; - } - cur_col[element] = fg + 16 * bg; - switch( element ) - { - case E_TITLE: - for( win = 0; win < MAX_WINDOWS; win++ ) - win_set_title_color( win, cur_col[element] ); - break; - case E_FRAME: - for( win = 0; win < MAX_WINDOWS; win++ ) - win_set_frame_color( win, cur_col[element] ); - break; - } - } - else - { - memcpy( cur_col, def_col, sizeof(cur_col) ); - for( win = 0; win < MAX_WINDOWS; win++ ) - win_set_title_color( win, cur_col[E_TITLE] ); - for( win = 0; win < MAX_WINDOWS; win++ ) - win_set_frame_color( win, cur_col[E_FRAME] ); - } - - edit_cmds_reset(); - dbg_update = 1; -} - -/************************************************************************** - * cmd_brk_regs_set - * Set the register breakpoint for the current CPU - **************************************************************************/ -static void cmd_brk_regs_set( void ) -{ - char *cmd = CMD; - unsigned data; - int length; - - DBG.brk_regs = get_register_id( &cmd, &length ); - if( DBG.brk_regs > 0 ) - { - DBG.brk_regs_oldval = activecpu_get_reg(DBG.brk_regs); - data = get_register_or_value( &cmd, &length ); - if( length ) - { - DBG.brk_regs_newval = data; - data = get_register_or_value( &cmd, &length ); - if( length ) - { - DBG.brk_regs_mask = data; - /* Remove masked bits from the new value too ;-) */ - DBG.brk_regs_newval &= data; - } - else - { - DBG.brk_regs_mask = 0xffffffff; - } - } - else - { - DBG.brk_regs_newval = INVALID; - DBG.brk_regs_mask = 0xffffffff; - } - } - dbg_update = 1; - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_brk_regs_clear - * Reset the watchpoint for the current CPU to INVALID - **************************************************************************/ -static void cmd_brk_regs_clear( void ) -{ - if( DBG.brk_regs != INVALID ) - { - DBG.brk_regs = INVALID; - DBG.brk_regs_oldval = INVALID; - DBG.brk_regs_newval = INVALID; - DBG.brk_regs_mask = 0xffffffff; - dbg_update = 1; - } - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_brk_data_set - * Set the watchpoint for the current CPU to the specified address - * The monitored data is one byte at the given address - **************************************************************************/ -static void cmd_brk_data_set( void ) -{ - char *cmd = CMD; - unsigned data; - int length; - - DBG.brk_data = get_register_or_value( &cmd, &length ); - - DBG.brk_data = rshift(DBG.brk_data) & AMASK; /* EHC 11/14/99: Need to shift + mask otherwise we die */ - - if( length ) - { - data = RDMEM(DBG.brk_data); - - DBG.brk_data_oldval = data; - data = get_register_or_value( &cmd, &length ); - - if( length ) - { - DBG.brk_data_newval = data; - } - else - { - DBG.brk_data_newval = INVALID; - } - } - - dbg_update = 1; - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_brk_data_clear - * Reset the watchpoint for the current CPU to INVALID - **************************************************************************/ -static void cmd_brk_data_clear( void ) -{ - if( DBG.brk_data != INVALID ) - { - DBG.brk_data = INVALID; - DBG.brk_data_oldval = INVALID; - DBG.brk_data_newval = INVALID; - dbg_update = 1; - } - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_brk_exec_set - * Set the execution breakpoint for the current CPU to the specified address - **************************************************************************/ -static void cmd_brk_exec_set( void ) -{ - char *cmd = CMD; - unsigned times; - int length; - - DBG.brk_exec = get_register_or_value( &cmd, &length ); - if( length ) - { - times = get_register_or_value( &cmd, &length ); - if( length ) - { - DBG.brk_exec_times = times; - DBG.brk_exec_reset = times; - } - else - { - DBG.brk_exec_times = 0; - DBG.brk_exec_reset = 0; - } - } - else - { - DBG.brk_exec = DBGDASM.pc_cur; - DBG.brk_exec_times = 0; - DBG.brk_exec_reset = 0; - } - dbg_update = 1; - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_brk_exec_clear - * Reset the execution breakpoint for the current CPU to INVALID - **************************************************************************/ -static void cmd_brk_exec_clear( void ) -{ - if( DBG.brk_exec != INVALID ) - { - DBG.brk_exec = INVALID; - DBG.brk_exec_times = 0; - DBG.brk_exec_reset = 0; - dbg_update = 1; - } - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_display_memory - * Set one of the memory display window's start address - **************************************************************************/ -static void cmd_display_memory( void ) -{ - char *cmd = CMD; - unsigned which, address; - int length; - - which = xtou( &cmd, &length ); - if( length ) - { - address = get_register_or_value( &cmd, &length ); - if( length ) - { - which = (which - 1) % MAX_MEM; - } - else - { - address = which; - which = 0; - } - address = rshift(address) & AMASKS(DBGMEM[which].space); - DBGMEM[which].base = address; - dump_mem( which, 1 ); - } - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_dasm_to_file - * Disassemble a range of code and output it to a file - **************************************************************************/ -static void cmd_dasm_to_file( void ) -{ - char buffer[127+1], *cmd = CMD; - const char *filename; - int length; - FILE *file; - unsigned pc, size, start, end, width, opcodes; - - filename = get_file_name( &cmd, &length ); - if( !length ) - { - win_msgbox( cur_col[E_ERROR], "DASM arguments", - "Filename missing"); - edit_cmds_reset(); - return; - } - start = get_register_or_value( &cmd, &length ); - if( !length ) - { - win_msgbox( cur_col[E_ERROR], "DASM arguments", - "Start address missing"); - edit_cmds_reset(); - return; - } - end = get_register_or_value( &cmd, &length ); - if( !length ) - { - win_msgbox( cur_col[E_ERROR], "DASM arguments", - "End address missing"); - edit_cmds_reset(); - return; - } - opcodes = get_boolean( &cmd, &length ); - if( length == 4 ) opcodes = 1; /* default to display opcodes */ - - file = fopen(filename, "w"); - if( !file ) - { - win_msgbox( cur_col[E_ERROR], "DASM to file", - "Could not create %s", filename); - edit_cmds_reset(); - return; - } - - width = (ABITS + ASHIFT + 3) / 4; - - for( pc = start; pc <= end; /* */ ) - { - size = activecpu_dasm( buffer, pc ) & DASMFLAG_LENGTHMASK; - - fprintf(file, "%0*X: ", width, pc ); - - if( opcodes ) - { - unsigned p = rshift(pc); - unsigned n = rshift(pc + size); - int i, j; - - for( i = 0; i < INSTL; i += IALIGN ) - { - for( j = 0; j < IALIGN; j++ ) - { - if ( p < n ) - { - fprintf( file, "%02X", - RDSPC(ADDRESS_SPACE_PROGRAM, order(p,IALIGN)) ); - p++; - } - else fprintf( file, " " ); - } - fprintf( file, " " ); - } - } - - fprintf( file, "%s\n", buffer ); - if( (pc + size) < pc ) - break; - pc += size; - } - - fclose( file ); - - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_dump_to_file - * (Hex-)Dump a range of code and output it to a file - **************************************************************************/ -static void cmd_dump_to_file( void ) -{ - UINT8 buffer[16]; - char *cmd = CMD; - const char *filename; - int length; - FILE *file; - unsigned x, offs, address = 0, start, end, width, data; - unsigned datasize, asciimode; - UINT8 space; - - filename = get_file_name( &cmd, &length ); - if( !length ) - { - win_msgbox( cur_col[E_ERROR], "DUMP arguments", - " missing"); - edit_cmds_reset(); - return; - } - start = get_register_or_value( &cmd, &length ); - if( !length ) - { - win_msgbox( cur_col[E_ERROR], "DUMP arguments", - " address missing"); - edit_cmds_reset(); - return; - } - start = rshift(start); - end = get_register_or_value( &cmd, &length ); - if( !length ) - { - win_msgbox( cur_col[E_ERROR], "DUMP arguments", - " address missing"); - edit_cmds_reset(); - return; - } - end = rshift(end); - asciimode = 1; /* default to translation table */ - space = ADDRESS_SPACE_PROGRAM; /* default to data mode (offset 0) */ - datasize = DALIGN*2; /* default to align unit of that CPU */ - data = get_option_or_value( &cmd, &length, "BYTE\0WORD\0DWORD\0"); - if( length ) - { - if( data > 2 ) - { - win_msgbox( cur_col[E_ERROR], "DUMP arguments", - "Wrong . Only BYTE, WORD or DWORD\n(also 0, 1 or 2) are supported"); - data = 1; - } - else - { - datasize = 2 << data; - } - /* look if there's also an ASCII mode specified */ - data = get_option_or_value( &cmd, &length, "OFF\0TRANSLATE\0FULL\0" ); - if( length ) - { - if( data > 2 ) - { - win_msgbox( cur_col[E_ERROR], "DUMP arguments", - "Wrong ASCII mode. Only OFF, TRANSLATE or FULL\n(also 0,1 or 2) are supported"); - data = 1; - } - asciimode = data; - /* look if there's also an PROG/DATA mode specified */ - data = get_option_or_value( &cmd, &length, "PROG\0DATA\0" ); - if( length ) - { - if( data > 1 ) - { - win_msgbox( cur_col[E_ERROR], "DUMP arguments", - "Wrong PROG/DATA mode. Only PROG or DATA\n(also 0,1) are supported"); - data = 1; - } - space = data; - } - } - } - - file = fopen(filename, "w"); - if( !file ) - { - win_msgbox( cur_col[E_ERROR], "DUMP to file", - "Could not create %s", filename); - edit_cmds_reset(); - return; - } - - width = (ABITS + ASHIFT + 3) / 4; - - for( x = 0, offs = 0; offs + start <= end; offs++ ) - { - switch( datasize ) - { - case 2: - address = (start + order(offs,1)) & AMASKS(space); - break; - case 4: - address = (start + order(offs,2)) & AMASKS(space); - break; - case 8: - address = (start + order(offs,4)) & AMASKS(space); - break; - } - buffer[offs & 15] = RDSPC( space, address ); - if( (offs & 15) == 0 ) - fprintf(file, "%0*X: ", width, lshift((start + offs) & AMASK) ); - fprintf(file, "%02X", buffer[offs & 15] ); - if( (offs & 15) == 15 ) - { - unsigned o; - if( asciimode ) - { - fputc( ' ', file ); - if( asciimode == 1 ) - for( o = 0; o < 16; o++ ) - fputc( trans_table[buffer[o]], file ); - else - for( o = offs - 15; o <= offs; o++ ) - fputc( (buffer[o] < 32) ? '.' : buffer[o], file ); - } - fprintf(file, "\n" ); - x = 0; - } - else - if( (x += 2) == datasize ) - { - if( (offs & 15) == 7 ) - fprintf(file, "-"); - else - fprintf(file, " "); - x = 0; - } - } - fclose( file ); - - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_save_to_file - * Save binary image of a range of opcode_base or opcode_arg_base - **************************************************************************/ -static void cmd_save_to_file( void ) -{ - char *cmd = CMD; - const char *filename; - int length; - FILE *file; - unsigned start, end, offs; - unsigned save_what; - UINT8 space = ADDRESS_SPACE_PROGRAM; - - filename = get_file_name( &cmd, &length ); - if( !length ) - { - win_msgbox( cur_col[E_ERROR], "SAVE arguments", - " missing"); - edit_cmds_reset(); - return; - } - start = get_register_or_value( &cmd, &length ); - if( !length ) - { - win_msgbox( cur_col[E_ERROR], "SAVE arguments", - " address missing"); - edit_cmds_reset(); - return; - } - end = get_register_or_value( &cmd, &length ); - if( !length ) - { - win_msgbox( cur_col[E_ERROR], "SAVE arguments", - " address missing"); - edit_cmds_reset(); - return; - } - - save_what = get_option_or_value( &cmd, &length, "OPCODES\0DATA\0"); - if( !length ) save_what = 0; /* default to opcode_base */ - - file = fopen(filename, "wb"); - if( !file ) - { - win_msgbox( cur_col[E_ERROR], "SAVE to file", - "Could not create %s", filename); - edit_cmds_reset(); - return; - } - - if( save_what ) - space = ADDRESS_SPACE_DATA; - - for( offs = 0; offs + start <= end; offs++ ) - { - fputc( RDSPC( space, ( ( start + offs ) & AMASKS(space) ) + save_what ), file ); - } - - fclose( file ); - - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_edit_memory - * Set one of the memory display window's start address and - * switch to that window - **************************************************************************/ -static void cmd_edit_memory( void ) -{ - char *cmd = CMD; - unsigned which, address; - int length; - - which = xtou( &cmd, &length ); - if( length ) - { - which = (which - 1) % MAX_MEM; - address = get_register_or_value( &cmd, &length ); - address = rshift(address) & AMASK; - if( length ) - { - DBGMEM[which].offset = address % DBGMEM[which].size; - DBGMEM[which].base = address - DBGMEM[which].offset; - DBGMEM[which].nibble = 0; - dump_mem( which, 0 ); - } - switch( which ) - { - case 0: DBG.window = EDIT_MEM1; break; - case 1: DBG.window = EDIT_MEM2; break; - } - } - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_search_memory - * Search the memory for a sequence of bytes - **************************************************************************/ -static void cmd_search_memory(void) -{ - static UINT8 search_data[16]; - static int search_count = 0; - UINT32 win = MAX_WINDOWS-3; - unsigned which = (DBG.window == EDIT_MEM1) ? 0 : 1; - unsigned w, h; - unsigned shift, mask, val; - const char *k; - int i, offset, nibble; - - get_screen_size( &w, &h ); - win_create( win, 1, 2, 2, w-4, 2, - cur_col[E_PROMPT], cur_col[E_FRAME], ' ', - BORDER_TOP | BORDER_BOTTOM | BORDER_LEFT | BORDER_RIGHT ); - win_set_title( win, "Search byte(s) in memory"); - win_show( win ); - - offset = 0; - nibble = 0; - - do - { - win_set_curpos( win, 0, 0 ); - for( i = 0; i < search_count; i++ ) - win_printf( win, "%02X ", search_data[i] ); - win_erase_eol( win, ' ' ); - win_set_curpos( win, 0, 1 ); - for( i = 0; i < search_count; i++ ) - win_printf( win, "%c ", search_data[i] < 32 ? '.' : search_data[i] ); - win_erase_eol( win, ' ' ); - - win_set_curpos( win, offset * 3 + nibble, 0 ); - set_screen_curpos( win_get_cx_abs(win), win_get_cy_abs(win) ); - - i = readkey(); - k = code_name(i); - - shift = (1 - nibble) * 4; - mask = ~(0xf << shift); - - if( strlen(k) == 1 ) - { - switch( k[0] ) - { - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - case '8': case '9': case 'A': case 'B': - case 'C': case 'D': case 'E': case 'F': - if( offset == 16 ) - break; - if( offset == search_count ) - search_count++; - val = k[0] - '0'; - if( val > 9 ) val -= 7; - val <<= shift; - /* now modify the register */ - search_data[offset] = (search_data[offset] & mask ) | val; - i = KEYCODE_RIGHT; /* advance to next nibble */ - break; - } - } - - switch( i ) - { - case KEYCODE_DEL: - if( offset < search_count ) - { - for( i = offset; i < 15; i++ ) - search_data[i] = search_data[i+1]; - search_count--; - } - break; - - case KEYCODE_INSERT: - if( search_count < 16 ) - { - for( i = 15; i > offset; i-- ) - search_data[i] = search_data[i-1]; - search_data[offset] = 0; - search_count++; - } - break; - - case KEYCODE_BACKSPACE: - if( nibble > 0 || offset > 0 ) - { - if( nibble > 0 ) - { - nibble--; - } - else - if( offset > 0 ) - { - offset--; - nibble = 1; - } - shift = (1 - nibble) * 4; - mask = ~(0xf << shift); - /* now modify the value */ - search_data[offset] = search_data[offset] & mask; - } - break; - - case KEYCODE_LEFT: - if( nibble > 0 ) - { - nibble--; - } - else - if( offset > 0 ) - { - offset--; - nibble = 1; - } - break; - - case KEYCODE_RIGHT: - if( offset < search_count ) - { - if( nibble < 1 ) - { - nibble++; - } - else - { - offset++; - nibble = 0; - } - } - break; - - case KEYCODE_HOME: - offset = 0; - nibble = 0; - break; - - case KEYCODE_END: - offset = search_count; - nibble = 0; - break; - } - } while( i != KEYCODE_ENTER && i != KEYCODE_ESC ); - - if( i == KEYCODE_ENTER && search_count > 0 ) - { - static char dbg_info[32+1]; - unsigned addr, start; - - start = (DBGMEM[which].base + DBGMEM[which].offset) & AMASK; - - for( addr = start + 1; addr != start; addr = (addr + 1) & AMASK ) - { - if( (addr & (AMASK >> 8)) == 0 ) - { - win_set_title( win, "[%3.0f%%] %s/%s", - 100.0 * addr / (AMASK + 1), - kilobyte(addr), kilobyte(AMASK + 1) ); - } - for( i = 0; i < search_count; i++) - if( RDMEM( addr+i ) != search_data[i] ) - break; - if( i == search_count ) - { - sprintf(dbg_info, "Found at address $%X", addr); - dbg_info_once = dbg_info; - DBGMEM[which].offset = addr % DBGMEM[which].size; - DBGMEM[which].base = addr - DBGMEM[which].offset; - win_close(win); - dbg_update = 1; - return; - } - } - sprintf(dbg_info, "Not found"); - dbg_info_once = dbg_info; - } - win_close(win); -} - -/************************************************************************** - * cmd_fast - * Hmm.. no idea ;) - **************************************************************************/ -static void cmd_fast( void ) -{ - dbg_fast = 1; - cmd_go_break(); -} - -/************************************************************************** - * cmd_go_break - * Let the emulation run and optionally set a breakpoint - **************************************************************************/ -static void cmd_go_break( void ) -{ - char *cmd = CMD; - unsigned brk; - int length; - - brk = get_register_or_value( &cmd, &length ); - if( length ) - DBG.brk_temp = brk; - - dbg_update = 0; - dbg_active = 0; - - osd_sound_enable(1); - debugger_focus = 0; -} - -/************************************************************************** - * cmd_here - * Set a temporary breakpoint at the cursor PC and let the emulation run - **************************************************************************/ -static void cmd_here( void ) -{ - DBG.brk_temp = DBGDASM.pc_cur; - - dbg_update = 0; - dbg_active = 0; - - osd_sound_enable(1); - debugger_focus = 0; - - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_set_ignore - * Ignore a CPU while debugging and tracing - **************************************************************************/ -static void cmd_set_ignore( void ) -{ - char *cmd = CMD; - unsigned cpunum; - int i, length, already_ignored; - - cpunum = xtou( &cmd, &length ); - if( cpunum < total_cpu ) - { - if( !dbg[cpunum].ignore ) - { - for( i = 0, already_ignored = 0; i < total_cpu; i++ ) - if(dbg[i].ignore) ++already_ignored; - if( already_ignored + 1 >= total_cpu ) - { - win_msgbox( cur_col[E_ERROR], "Ignore CPU", - "No, I won't do that! ;-)\nIgnoring all CPUs is a bad idea."); - edit_cmds_reset(); - return; - } - dbg[cpunum].ignore = 1; - if( cpunum == active_cpu ) - cmd_focus_next_cpu(); - } - } - else - { - win_msgbox( cur_col[E_ERROR], "Ignore CPU", - "The selected CPU# is too high.\nOnly %d CPUs (0..%d) are used", total_cpu, total_cpu-1); - } - - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_set_observe - * Observe a CPU while debugging and tracing - **************************************************************************/ -static void cmd_set_observe( void ) -{ - char *cmd = CMD; - unsigned cpunum; - int length; - - cpunum = xtou( &cmd, &length ); - if( cpunum < total_cpu ) - { - dbg[cpunum].ignore = 0; - } - else - { - win_msgbox( cur_col[E_ERROR], "Observe CPU", - "The selected CPU# is too high.\nOnly %d CPUs (0..%d) are used", total_cpu, total_cpu-1); - } - - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_jump - * Jump to the specified address in the disassembly window - **************************************************************************/ -static void cmd_jump( void ) -{ - char *cmd = CMD; - unsigned address; - int length; - - address = get_register_or_value( &cmd, &length ); - if( length > 0 ) - { - DBGDASM.pc_top = address; - DBGDASM.pc_cur = DBGDASM.pc_top; - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - } - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_replace_register - * Either change a register to a specified value, change to the - * registers window to edit a specified or (if none given) the - * first register - **************************************************************************/ -static void cmd_replace_register( void ) -{ - char *cmd = CMD; - unsigned regnum, address; - int length; - - regnum = get_register_id( &cmd, &length ); - if( regnum > 0 ) - { - address = get_register_or_value( &cmd, &length ); - if( length ) - { - activecpu_set_reg( regnum, address ); - if( regnum > 1 ) - dump_regs(); - else - /* Update in case PC changed */ - dbg_update = 1; - } - else - { - /* Edit the first register */ - for( DBGREGS.idx = 0; DBGREGS.idx < DBGREGS.count; DBGREGS.idx++ ) - if( DBGREGS.id[DBGREGS.idx] == regnum ) break; - DBG.window = EDIT_REGS; - } - } - else - { - /* Edit the first register */ - DBGREGS.idx = 0; - DBG.window = EDIT_REGS; - } - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_set_memory_mode - * Set display mode of a memory window - **************************************************************************/ -static void cmd_set_memory_mode( void ) -{ - char *cmd = CMD; - unsigned which, mode; - int length; - - which = dtou( &cmd, &length ); - if( length ) - { - which = (which - 1) % 2; - mode = get_option_or_value( &cmd, &length, "BYTE\0WORD\0DWORD\0" ); - if( !length ) mode = 0; /* default to BYTE */ - DBGMEM[which].mode = mode; - } - else - { - DBGMEM[0].mode = 0; - DBGMEM[1].mode = 0; - } - edit_cmds_reset(); - dbg_update = 1; -} - -/************************************************************************** - * cmd_set_dasm_relative_jumps - * Turn display of relative jumps as $+/-offset on or off - **************************************************************************/ -static void cmd_set_dasm_relative_jumps( void ) -{ - char *cmd = CMD; - - dbg_dasm_relative_jumps = get_boolean( &cmd, NULL ); - - edit_cmds_reset(); - dbg_update = 1; -} - -/************************************************************************** - * cmd_trace_to_file - * Turn tracing to file on or off - * If it is to be turned on, expect filename and optionally - * a list of register names to dump - **************************************************************************/ -static void cmd_trace_to_file( void ) -{ - char *cmd = CMD; - const char *filename; - UINT8 regs[MAX_REGS], regcnt = 0; - int length; - char buf[128]; - - filename = get_file_name( &cmd, &length ); - - if( !mame_stricmp( filename, "OFF" ) ) - { - trace_done(); - } - else - { - while( *cmd ) - { - regs[regcnt] = get_register_id( &cmd, &length ); - if( regs[ regcnt ] > 0 ) - { - regcnt++; - } - else - { - /* warn about unidentified registers */ - length = 0; - while(length < (sizeof(buf) / sizeof(buf[0]) - 1) - && cmd[length] && !isspace(cmd[length])) - { - length++; - } - memcpy(buf, cmd, length); - buf[length] = '\0'; - - win_msgbox( cur_col[E_ERROR], "Trace", - "Warning: Register '%s' not identified", buf); - break; - } - } - regs[regcnt] = 0; - - trace_init( filename, regs ); - } - - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_dasm_up - * Move cursor line to previous instruction - **************************************************************************/ -static void cmd_dasm_up( void ) -{ - if ( (DBGDASM.pc_cur >= dasm_line( DBGDASM.pc_top, 1 ) ) && - ((DBGDASM.pc_cur < DBGDASM.pc_end) || (DBGDASM.pc_end < DBGDASM.pc_top)) ) - { - unsigned dasm_pc_1st = DBGDASM.pc_top; - unsigned dasm_pc_2nd = DBGDASM.pc_top; - while( dasm_pc_2nd != DBGDASM.pc_end ) - { - dasm_pc_2nd = dasm_line( dasm_pc_1st, 1 ); - - if( dasm_pc_2nd == DBGDASM.pc_cur ) - { - DBGDASM.pc_cur = dasm_pc_1st; - dasm_pc_2nd = DBGDASM.pc_end; - } - else - { - dasm_pc_1st = dasm_pc_2nd; - } - } - } - else - if( DBGDASM.pc_top > 0 ) - { - /* - * Try to find the previous instruction by searching from the - * longest instruction length towards the current address. - * If we can't find one then just go back one byte, - * which means that a previous guess was wrong. - */ - unsigned dasm_pc_tmp = rshift(DBGDASM.pc_top - lshift(INSTL)) & AMASK; - int i; - for( i = 0; i < INSTL; i += IALIGN ) - { - if( dasm_line( lshift(dasm_pc_tmp), 1 ) == DBGDASM.pc_top ) - break; - dasm_pc_tmp += IALIGN; - } - dasm_pc_tmp = lshift(dasm_pc_tmp); - if( dasm_pc_tmp == DBGDASM.pc_top ) - dasm_pc_tmp -= IALIGN; - DBGDASM.pc_cur = dasm_pc_tmp; - if( DBGDASM.pc_cur < DBGDASM.pc_top ) - DBGDASM.pc_top = DBGDASM.pc_cur; - } - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_dasm_down - * Move cursor line to next instruction - **************************************************************************/ -static void cmd_dasm_down( void ) -{ - DBGDASM.pc_cur = dasm_line( DBGDASM.pc_cur, 1 ); - if( DBGDASM.pc_cur >= DBGDASM.pc_end ) - DBGDASM.pc_top = dasm_line( DBGDASM.pc_top, 1 ); - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_dasm_page_up - * Disassemble previous page - **************************************************************************/ -static void cmd_dasm_page_up( void ) -{ - UINT32 i; - /* - * This uses a 'rolling window' of start addresses to work out - * the best address to use to generate the previous pagefull of - * disassembly - CM 980428 - */ - if( DBGDASM.pc_top > 0 ) - { - unsigned dasm_pc_row[50]; /* needs to be > max windows height */ - unsigned h = win_get_h(WIN_DASM(active_cpu)); - unsigned dasm_pc_tmp = lshift((rshift(DBGDASM.pc_top) - h * INSTL) & AMASK); - - if( dasm_pc_tmp > DBGDASM.pc_top ) - { - DBGDASM.pc_top = 0; - } - else - { - for( i= 0; dasm_pc_tmp < DBGDASM.pc_top; i++ ) - { - dasm_pc_row[i % h] = dasm_pc_tmp; - dasm_pc_tmp = dasm_line( dasm_pc_tmp, 1 ); - } - - /* - * If this ever happens, it's because our - * max_inst_len member is too small for the CPU - */ - if( i < h ) - { - dasm_pc_tmp = dasm_pc_row[0]; - win_msgbox(cur_col[E_ERROR], "DBGDASM page up", - "Increase cpu_intf[].max_inst_len? Line = %d\n", i); - } - else - { - DBGDASM.pc_top = dasm_pc_row[(i + 1) % h]; - } - } - } - DBGDASM.pc_cur = DBGDASM.pc_top; - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_dasm_page_down - * Disassemble next page - **************************************************************************/ -static void cmd_dasm_page_down( void ) -{ - unsigned h = win_get_h(WIN_DASM(active_cpu)); - - DBGDASM.pc_top = dasm_line( DBGDASM.pc_top, h ); - DBGDASM.pc_cur = dasm_line( DBGDASM.pc_cur, h ); - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_dasm_home - * Disassemble first page - **************************************************************************/ -static void cmd_dasm_home( void ) -{ - DBGDASM.pc_cur = DBGDASM.pc_top = 0; - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_dasm_end - * Disassemble last page - **************************************************************************/ -static void cmd_dasm_end( void ) -{ - unsigned h = win_get_h(WIN_DASM(active_cpu)); - unsigned tmp_address = lshift(AMASK - h * INSTL + 1); - unsigned end_address; - for( ; ; ) - { - end_address = dasm_line( tmp_address, h ); - if( end_address < tmp_address ) - break; - tmp_address += IALIGN; - } - DBGDASM.pc_top = tmp_address; - DBGDASM.pc_cur = dasm_line( DBGDASM.pc_top, h - 1 ); - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_brk_exec_toggle - * Toggle execution break point at cursor line - **************************************************************************/ -static void cmd_brk_exec_toggle( void ) -{ - if( DBG.brk_exec == INVALID ) - { - DBG.brk_exec = DBGDASM.pc_cur; - DBG.brk_exec_times = 0; - DBG.brk_exec_reset = 0; - dbg_update = 1; - } - else - if( DBG.brk_exec == DBGDASM.pc_cur ) - { - DBG.brk_exec = INVALID; - DBG.brk_exec_times = 0; - DBG.brk_exec_reset = 0; - dbg_update = 1; - } - else - { - win_msgbox( cur_col[E_PROMPT], "Breakpoint", - "Cleared execution break point at $%X", DBG.brk_exec ); - DBG.brk_exec = INVALID; - } -} - -/************************************************************************** - * cmd_dasm_hist_follow - * Follow the current code or data reference - **************************************************************************/ -static void cmd_dasm_hist_follow( void ) -{ - unsigned i, address, access = EA_NONE; - - address = INVALID; - DBGDASM.dst_ea_value = INVALID; - DBGDASM.src_ea_value = INVALID; - - dasm_line( DBGDASM.pc_cur, 1 ); - - if( DBGDASM.src_ea_value != INVALID ) - { - access = DBGDASM.src_ea_access; - address = DBGDASM.src_ea_value; - } - if( DBGDASM.dst_ea_value != INVALID ) - { - access = DBGDASM.dst_ea_access; - address = DBGDASM.dst_ea_value; - } - if( address != INVALID ) - { - if( DBG.hist_cnt < MAX_HIST ) - { - i = DBG.hist_cnt; - /* Save some current values */ - DBG.hist[i].dasm_top = DBGDASM.pc_top; - DBG.hist[i].dasm_cur = DBGDASM.pc_cur; - DBG.hist[i].mem1_base = DBGMEM[0].base; - DBG.hist[i].mem1_offset = DBGMEM[0].offset; - DBG.hist[i].mem1_nibble = DBGMEM[0].nibble; - if( access == EA_ABS_PC || access == EA_REL_PC ) - { - DBGDASM.pc_top = address; - DBGDASM.pc_cur = address; - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - DBG.hist_cnt++; - } - else - if( access == EA_MEM_RD || access == EA_MEM_WR || access == EA_MEM_RDWR || - access == EA_ZPG_RD || access == EA_ZPG_WR || access == EA_ZPG_RDWR ) - { - DBGMEM[0].offset = address % DBGMEM[0].size; - DBGMEM[0].base = address - DBGMEM[0].offset; - DBGMEM[0].nibble = 0; - dump_mem( 0, 0 ); - DBG.hist_cnt++; - } - } - } -} - -/************************************************************************** - * cmd_dasm_hist_back - * Back to the previous point in the 'follow history' - **************************************************************************/ -static void cmd_dasm_hist_back( void ) -{ - unsigned i; - if( DBG.hist_cnt > 0) - { - i = --DBG.hist_cnt; - DBGDASM.pc_top = DBG.hist[i].dasm_top; - DBGDASM.pc_cur = DBG.hist[i].dasm_cur; - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - DBGMEM[0].base = DBG.hist[i].mem1_base; - DBGMEM[0].offset = DBG.hist[i].mem1_offset; - DBGMEM[0].nibble = DBG.hist[i].mem1_nibble; - dump_mem( 0, 0 ); - } -} - -/************************************************************************** - * cmd_brk_exec_toggle - * Toggle data break point at memory location - **************************************************************************/ -static void cmd_brk_data_toggle( void ) -{ - int which = DBG.window == EDIT_MEM1 ? 0 : 1; - - if( DBG.brk_data == INVALID ) - { - unsigned data; - DBG.brk_data = DBGMEM[which].address; - data = RDMEM(DBG.brk_data); - DBG.brk_data_oldval = data; - DBG.brk_data_newval = INVALID; - } - else - if( DBG.brk_data == DBGMEM[which].address ) - { - DBG.brk_data = INVALID; - DBG.brk_data_oldval = INVALID; - DBG.brk_data_newval = INVALID; - } - else - { - win_msgbox( cur_col[E_PROMPT], "Data watchpoint", - "Cleared data watch point at $%X", DBG.brk_data ); - DBG.brk_data = INVALID; - } - dbg_update = 1; - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_toggle_scanlines - * Toggles the display of scanlines in the display - **************************************************************************/ -static void cmd_toggle_scanlines( void ) -{ - dbg_show_scanline = !dbg_show_scanline; -} - -/************************************************************************** - * cmd_run_to_cursor - * Set temporary break point at cursor line and go - **************************************************************************/ -static void cmd_run_to_cursor( void ) -{ - DBG.brk_temp = DBGDASM.pc_cur; - - edit_cmds_reset(); - - cmd_go(); -} - -/************************************************************************** - * cmd_focus_next_cpu - * Switch focus to the next CPU - **************************************************************************/ -static void cmd_focus_next_cpu( void ) -{ - if( total_cpu > 1 ) - { - win_set_title(WIN_CMDS(active_cpu), "CPU #%d yield", active_cpu); - cpu_yield(); - dbg_update = 1; - dbg_step = 1; - } - - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_step - * Step one instruction - **************************************************************************/ -static void cmd_step( void ) -{ - dbg_step = 1; - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_animate - * Run CPU in animated mode - **************************************************************************/ -static void cmd_animate( void ) -{ - char *cmd = CMD; - unsigned data; - int length; - data = dtou( &cmd, &length ); - if( length ) - dbg_trace_delay = data; - else - dbg_trace_delay = 0x7fffffff; - - debug_trace_delay = dbg_trace_delay; - - dbg_trace = 1; - dbg_step = 1; - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_step_over - * Step over the instruction at the cursor line - * Sets next PC and previous PS to detect a call/bsr type opcode - * on the next entry into MAME_Debug - **************************************************************************/ -static void cmd_step_over( void ) -{ - /* Set next PC to the instruction after the cursor line */ - DBG.next_pc = dasm_line( DBGDASM.pc_cur, 1 ); - DBG.prev_sp = activecpu_get_sp(); - dbg_step = 1; - edit_cmds_reset(); -} - -/************************************************************************** - * cmd_switch_window - * Switch back or forth to the next window: - * commands, registers, disassembly, memory 1, memory 2 - **************************************************************************/ -static void cmd_switch_window( void ) -{ - if( code_pressed(KEYCODE_LSHIFT) || code_pressed(KEYCODE_RSHIFT) ) - DBG.window = --DBG.window % DBG_WINDOWS; - else - DBG.window = ++DBG.window % DBG_WINDOWS; -} - -/************************************************************************** - * cmd_go - * Let the game run - **************************************************************************/ -static void cmd_go( void ) -{ - debug_key_pressed = 0; - - dbg_update = 0; - dbg_active = 0; - - edit_cmds_reset(); - - osd_sound_enable(1); - debugger_focus = 0; -} - -/************************************************************************** - * cmd_set_key_repeat - * Set the keyboard repeat rate (will decrease to 1/frame) - **************************************************************************/ -static void cmd_set_key_repeat( void ) -{ - char *cmd = CMD; - - dbg_key_repeat = dtou( &cmd, NULL ); - if( dbg_key_repeat == 0 ) - dbg_key_repeat = Machine->screen[0].refresh / 15; - - edit_cmds_reset(); - dbg_update = 1; -} - -/************************************************************************** - * cmd_set_dasm_case - * Set the case style for the disassembly window - * "DEFAULT", "LOWER" or "UPPER" are recognized comparing the first letter - **************************************************************************/ -static void cmd_set_dasm_case( void ) -{ - char *cmd = CMD; - - if( toupper(cmd[0]) == 'D' ) - dbg_dasm_case = 0; - else - if( toupper(cmd[0]) == 'L' ) - dbg_dasm_case = 1; - else - if( toupper(cmd[0]) == 'U' ) - dbg_dasm_case = 2; - else - dbg_dasm_case = xtou( &cmd, NULL ); - - edit_cmds_reset(); - dbg_update = 1; -} - -/************************************************************************** - * cmd_set_mem_squeezed - * Set allow squeezed memory display - **************************************************************************/ -static void cmd_set_mem_squeezed( void ) -{ - char *cmd = CMD; - - dbg_mem_squeezed = get_boolean( &cmd, NULL ); - - edit_cmds_reset(); - dbg_update = 1; -} - -/************************************************************************** - * cmd_set_dasm_opcodes - * Set allow squeezed memory display - **************************************************************************/ -static void cmd_set_dasm_opcodes( void ) -{ - char *cmd = CMD; - UINT32 win = WIN_DASM(active_cpu); - UINT32 w = win_get_w( win ); - UINT32 dw = (INSTL / IALIGN) * (IALIGN * 2 + 1); - int state; - - state = get_boolean( &cmd, NULL ); - - if( dbg_dasm_opcodes != state ) - { - dbg_dasm_opcodes = state; - if( state ) - { - win_set_prio( win, 0 ); - win_set_w( win, w + dw ); - } - else - { - win_set_prio( win, 1 ); - win_set_w( win, w - dw ); - } - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - } - - edit_cmds_reset(); - dbg_update = 1; -} - -static void mame_debug_reset_statics( void ) -{ - /* Reset the statics */ - memset( &dbg, 0, sizeof(dbg) ); - - active_cpu = INVALID; - previous_active_cpu = INVALID; - total_cpu = 0; - cputype = 0; - - dbg_fast = 0; - dbg_step = 0; - dbg_trace = 0; - dbg_update = 0; - dbg_update_cur = 0; - dbg_active = 0; - dbg_mem_squeezed = 0; - dbg_dasm_opcodes = 0; - dbg_dasm_case = 0; - dbg_dasm_relative_jumps = 0; - dbg_info_once = NULL; -} - - -/************************************************************************** - * mame_debug_trace_write - * Writes trace info to the active trace file, if appropriate - **************************************************************************/ -void CLIB_DECL mame_debug_trace_write (int cpunum, const char *fmt, ...) -{ - va_list va; - - if (dbg[cpunum].trace.file) - { - va_start(va, fmt); - vfprintf(dbg[cpunum].trace.file, fmt, va); - va_end(va); - } -} - - -/************************************************************************** - * mame_debug_init - * This function is called from cpu_run to startup the debugger - **************************************************************************/ -void mame_debug_exit(void); - -void mame_debug_init(void) -{ - char filename[127+1]; - FILE *file; - - mame_debug_reset_statics(); - debugger_focus = 1; - - total_cpu = cpu_gettotalcpu(); - - for( active_cpu = 0; active_cpu < total_cpu; active_cpu++ ) - { - DBG.window = EDIT_CMDS; - DBG.brk_exec = INVALID; - DBG.brk_exec_times = 0; - DBG.brk_exec_reset = 0; - DBG.brk_data = INVALID; - DBG.brk_data_oldval = INVALID; - DBG.brk_data_newval = INVALID; - DBG.brk_regs = INVALID; - DBG.brk_regs_oldval = INVALID; - DBG.brk_regs_newval = INVALID; - DBG.brk_regs_mask = 0xffffffff; - DBG.brk_temp = INVALID; - DBGMEM[0].base = 0x0000; - DBGMEM[1].base = 1 << (cpunum_addrbus_width(active_cpu, ADDRESS_SPACE_PROGRAM) - 1); - switch( cpunum_databus_width(active_cpu, ADDRESS_SPACE_PROGRAM) ) - { - case 8: DBGMEM[0].mode = DBGMEM[1].mode = MODE_HEX_UINT8; break; - case 16: DBGMEM[0].mode = DBGMEM[1].mode = MODE_HEX_UINT16; break; - case 32: DBGMEM[0].mode = DBGMEM[1].mode = MODE_HEX_UINT32; break; - case 64: DBGMEM[0].mode = DBGMEM[1].mode = MODE_HEX_UINT64; break; - } - } - - /* set keyboard repeat rate based on the game's frame rate */ - dbg_key_repeat = Machine->screen[0].refresh / 15; - - /* create windows for the active CPU */ - dbg_open_windows(); - - /* See if there is an existing global mamedbg config file */ - strcpy( filename, "mamedbg.cfg" ); - file = fopen( filename, "r" ); - if( file ) - { - char *cmdline = CMD, *p; - int cmd; - - while( !feof(file) ) - { - fgets( cmdline, 80, file ); - cmdline[80] = '\0'; - if( *cmdline == ';' || *cmdline == '#' ) - continue; - p = strchr( cmdline, '\r' ); - if( p ) *p = '\0'; - p = strchr( cmdline, '\n' ); - if( p ) *p = '\0'; - /* Make it all upper case */ - strcpy( cmdline, upper(cmdline) ); - cmd = edit_cmds_parse( cmdline ); - if( cmd != INVALID && commands[cmd].function ) - (*commands[cmd].function)(); - } - fclose(file); - } - for( active_cpu = 0; active_cpu < total_cpu; active_cpu++ ) - { - /* See if there is an existing startup file .cf */ - sprintf( filename, "%s.cf%d", Machine->gamedrv->name, active_cpu ); - file = fopen( filename, "r" ); - if( file ) - { - char *cmdline = CMD, *p; - int cmd; - - while( !feof(file) ) - { - fgets( cmdline, 80, file ); - cmdline[80] = '\0'; - if( *cmdline == ';' || *cmdline == '#' ) - continue; - p = strchr( cmdline, '\r' ); - if( p ) *p = '\0'; - p = strchr( cmdline, '\n' ); - if( p ) *p = '\0'; - /* Make it all upper case */ - strcpy( cmdline, upper(cmdline) ); - cmd = edit_cmds_parse( cmdline ); - if( cmd != INVALID && commands[cmd].function ) - (*commands[cmd].function)(); - } - fclose(file); - } - } - - debug_key_pressed = 1; - - first_time = 1; - - add_exit_callback(mame_debug_exit); -} - -/************************************************************************** - * mame_debug_exit - * This function is called from cpu_run to shutdown the debugger - **************************************************************************/ -void mame_debug_exit(void) -{ - dbg_close_windows(); - mame_debug_reset_statics(); -} - -void mame_debug_break(void) -{ - debug_key_pressed = 1; -} - -int mame_debug_is_active(void) -{ - return dbg_active; -} - - -/************************************************************************** - ************************************************************************** - * MAME_Debug - * This function is called from within an execution loop of a - * CPU core whenever Machine->debug_mode is non zero - ************************************************************************** - **************************************************************************/ -void mame_debug_hook(void) -{ - if( ++debug_key_delay == 0x7fff ) - { - debug_key_delay = 0; - if (!debug_key_pressed) - debug_key_pressed = input_port_type_pressed(IPT_UI_DEBUG_BREAK,0); - } - - if( dbg_fast ) - { - if( !debug_key_pressed ) return; - dbg_fast = 0; - } - - active_cpu = cpu_getactivecpu(); - - /* If this CPU shall be ignored, just return */ - if( DBG.ignore ) return; - - cputype = Machine->drv->cpu[active_cpu].cpu_type; - - if( trace_on ) - { - trace_select(); - trace_output(); - } - - if( DBG.prev_sp ) - { - /* assume we're in debug */ - dbg_active = 1; - /* See if we went into a function. - A 'return' will cause the CPU's stack pointer to be - greater than the previous stack pointer */ - if( activecpu_get_pc() != DBG.next_pc && activecpu_get_sp() < DBG.prev_sp ) - { - /* if so, set the temporary breakpoint on the return PC */ - DBG.brk_temp = DBG.next_pc; - dbg_update = 0; - dbg_active = 0; - osd_sound_enable(1); - debugger_focus = 0; - } - DBG.prev_sp = 0; - } - - if ( (first_time || hit_brk_exec() || hit_brk_data() || hit_brk_regs() || debug_key_pressed) && !dbg_active ) - { - debug_key_pressed = 0; - - if( !first_time ) - { - osd_sound_enable(0); - } - - first_time = 0; - debugger_focus = 1; - win_invalidate_video(); - - edit_cmds_reset(); - - DBG.brk_temp = INVALID; - dbg_active = 1; - dbg_update_cur = 1; - dbg_trace = 0; - } - - if( dbg_step ) - { - DBGDASM.pc_cur = activecpu_get_pc(); - dbg_step = 0; - } - - /* Assume we need to update the windows */ - dbg_update = 1; - - while( dbg_active && !dbg_step ) - { - if( dbg_trace ) - { - dbg_step = 1; - if( --debug_trace_delay > 0 ) - { - dbg_update = 0; - } - else - { -// if (dbg_trace_delay != 0x7fffffff) -// update_video_and_audio(); - debug_trace_delay = dbg_trace_delay; - if( debug_key_pressed ) - { - dbg_trace = 0; - dbg_step = 0; - debugger_focus = 1; - } - } - } - - if( dbg_update ) - { - if( active_cpu != previous_active_cpu ) - { - if( previous_active_cpu != INVALID ) - { - win_hide( WIN_REGS(previous_active_cpu) ); - win_hide( WIN_DASM(previous_active_cpu) ); - win_hide( WIN_MEM1(previous_active_cpu) ); - win_hide( WIN_MEM2(previous_active_cpu) ); - win_hide( WIN_CMDS(previous_active_cpu) ); - } - win_show( WIN_REGS(active_cpu) ); - win_show( WIN_DASM(active_cpu) ); - win_show( WIN_MEM1(active_cpu) ); - win_show( WIN_MEM2(active_cpu) ); - win_show( WIN_CMDS(active_cpu) ); - } - - dump_regs(); - dump_mem( 0, DBG.window != EDIT_MEM1 ); - dump_mem( 1, DBG.window != EDIT_MEM2 ); - DBGDASM.pc_cpu = activecpu_get_pc(); - /* Check if pc_cpu is outside of our disassembly window */ - if( DBGDASM.pc_cpu < DBGDASM.pc_top || DBGDASM.pc_cpu >= DBGDASM.pc_end ) - DBGDASM.pc_top = DBGDASM.pc_cpu; - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - if( DBGDASM.pc_cur < DBGDASM.pc_top || DBGDASM.pc_cur >= DBGDASM.pc_end || dbg_update_cur ) - { - DBGDASM.pc_cur = DBGDASM.pc_cpu; - DBGDASM.pc_end = dump_dasm( DBGDASM.pc_top ); - dbg_update_cur = 0; - } - dbg_update = 0; - } - - if( !dbg_trace ) - { - switch( DBG.window ) - { - case EDIT_REGS: edit_regs(); break; - case EDIT_DASM: edit_dasm(); break; - case EDIT_MEM1: edit_mem(0); break; - case EDIT_MEM2: edit_mem(1); break; - case EDIT_CMDS: edit_cmds(); break; - } - } - } - - /* update backup copies of memory and registers */ - if( DBGMEM[0].changed ) - { - DBGMEM[0].changed = 0; - memcpy( DBGMEM[0].backup, - DBGMEM[0].newval, DBGMEM[0].size ); - } - if( DBGMEM[1].changed ) - { - DBGMEM[1].changed = 0; - memcpy( DBGMEM[1].backup, - DBGMEM[1].newval, DBGMEM[0].size ); - } - if( DBGREGS.changed ) - { - DBGREGS.changed = 0; - memcpy( DBGREGS.backup, - DBGREGS.newval, DBGREGS.count * sizeof(UINT32) ); - } -} diff --git a/src/debug/mamedbg.h b/src/debug/mamedbg.h deleted file mode 100644 index 6999d12b4..000000000 --- a/src/debug/mamedbg.h +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** - - mamedbg.h - - MAME debugger V0.54 - Juergen Buchmueller - - Copyright (c) 1996-2006, Nicola Salmoria and the MAME Team. - Visit http://mamedev.org for licensing and usage restrictions. - -****************************************************************************/ - -#pragma once - -#ifndef _MAMEDBG_H -#define _MAMEDBG_H - -#include "mamecore.h" - -#define DEBUGGER_TOTAL_COLORS 16 - -#ifdef MAME_DEBUG - -enum { - DBG_BLACK, - DBG_BLUE, - DBG_GREEN, - DBG_CYAN, - DBG_RED, - DBG_MAGENTA, - DBG_BROWN, - DBG_LIGHTGRAY, - DBG_GRAY, - DBG_LIGHTBLUE, - DBG_LIGHTGREEN, - DBG_LIGHTCYAN, - DBG_LIGHTRED, - DBG_LIGHTMAGENTA, - DBG_YELLOW, - DBG_WHITE -}; - -#define COLOR_TITLE DBG_YELLOW -#define COLOR_FRAME DBG_LIGHTCYAN -#define COLOR_REGS DBG_WHITE -#define COLOR_DASM DBG_WHITE -#define COLOR_MEM1 DBG_WHITE -#define COLOR_MEM2 DBG_WHITE -#define COLOR_CMDS DBG_WHITE -#define COLOR_BRK_EXEC DBG_YELLOW -#define COLOR_BRK_DATA (DBG_YELLOW+DBG_BLUE*16) -#define COLOR_BRK_REGS (DBG_YELLOW+DBG_BLUE*16) -#define COLOR_ERROR (DBG_YELLOW+DBG_RED*16) -#define COLOR_HELP (DBG_WHITE+DBG_BLUE*16) -#define COLOR_PROMPT DBG_CYAN -#define COLOR_CHANGES DBG_LIGHTCYAN -#define COLOR_PC (DBG_WHITE+DBG_BLUE*16) /* MB 980103 */ -#define COLOR_CURSOR (DBG_WHITE+DBG_RED*16) /* MB 980103 */ - -extern int debug_trace_delay; /* set to 0 to force a screen update */ - -#ifndef DECL_SPEC -#define DECL_SPEC -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef INVALID -#define INVALID 0xffffffff -#endif - -extern UINT8 debugger_bitmap_changed; -extern UINT8 debugger_focus; - -extern rgb_t debugger_palette[DEBUGGER_TOTAL_COLORS]; -gfx_element *build_debugger_font(void); -void dbg_put_screen_char (int ch, int attr, int x, int y); - -void CLIB_DECL mame_debug_trace_write (int cpunum, const char *fmt, ...) ATTR_PRINTF(2,3); - -#endif /* !MAME_DEBUG */ - -#endif diff --git a/src/debug/window.c b/src/debug/window.c deleted file mode 100644 index a3792d483..000000000 --- a/src/debug/window.c +++ /dev/null @@ -1,1897 +0,0 @@ -/**************************************************************************** - - window.c - - Text mode window engine - - Copyright (c) 1996-2006, Nicola Salmoria and the MAME Team. - Visit http://mamedev.org for licensing and usage restrictions. - - Written by Neil Bradley (neil@synthcom.com) - Heavily modified by Juergen Buchmueller (pullmoll@t-online.de) - - Designed to fit the needs of the new MAME debugger (a bit more ;) - - Warning: This code is still buggy! - Some of the changes I made were contrary to the original design, - so expect 'assertions' for every non common case (ie. window too - big, hanging out of the screen etc.) - -****************************************************************************/ - -#ifdef MAME_DEBUG - -#include -#include "window.h" - -/* - * These standard definition functions are macro'd so they can easily be - * redefined to other custom procedures. - */ - -#define ASSERT(expr) assert(expr) - -INLINE void *MyMalloc( UINT32 size, const char *function ) -{ - void *p = malloc( size ); - ASSERT( p ); - memset( p, 0, size ); - return p; -} - -INLINE void *MyReAlloc( void *p, UINT32 size, const char *function ) -{ - p = realloc( p, size ); - ASSERT( p ); - return p; -} - -INLINE void MyFree( void **p, const char *function ) -{ - if( *p ) - { - free(*p); - *p = NULL; - } -} - -/* Forward references for circular function calls */ - -void win_set_cursor_char(UINT32 idx, UINT32 state, UINT32 state_old); - -/* Global windowing data we need */ - -UINT32 screen_w = 80; /* Our screen's size in characters X */ -UINT32 screen_h = 50; /* Our screen's size in characters Y */ - -static struct sWindow *p_windows = NULL; -static UINT8 *p_prio_map = NULL; -static UINT8 *p_shadow_map = NULL; -static UINT8 *p_text = NULL; -static UINT8 *p_attr = NULL; - -/************************************************************************ - * - * Name : win_out - * - * Entry: Character, attribute and X/Y position of char to place - * - * Exit : None - * - * Description: - * - * This routine will place a character at a given video position. - * - ************************************************************************/ - -INLINE void win_out(UINT8 bChar, UINT8 bAttr, UINT32 x, UINT32 y, UINT32 idx) -{ - UINT32 offs = (y * screen_w) + x; - - ASSERT(idx < MAX_WINDOWS); - - if( x >= screen_w || y >= screen_h ) - return; - - idx = p_windows[idx].prio; - - /* If we're under the influence of a Window's shadow, change the attribute */ - if( idx > p_shadow_map[offs] ) - bAttr = ( bAttr & 0x08 ) ? bAttr & 0x07 : 0x08; - - /* If it's different */ - if( bChar != p_text[offs] || bAttr != p_attr[offs] ) - { - /* Put it in our video map */ - p_text[offs] = bChar; - p_attr[offs] = bAttr; - - /* Here's where we draw the character */ - dbg_put_screen_char(bChar, bAttr, x, y); - } -} - -/************************************************************************ - * - * Name : win_update_map - * - * Entry: Nothing - * - * Exit : Nothing - * - * Description: - * - * This routine will update the window priority map and - * will recompute all windows. - * - ************************************************************************/ - -static void win_update_map(void) -{ - INT32 prio, i; - UINT32 yadd, xadd, x, y; - struct sWindow *pwin; - - ASSERT(p_prio_map); /* This had better not be null */ - ASSERT(p_windows); /* This either */ - - memset(p_prio_map, 0xff, screen_w * screen_h); - - for( prio = 0xff; prio >= 0; prio-- ) - { - for( i = 0, pwin = p_windows; i < MAX_WINDOWS; i++, pwin++ ) - { - if ( pwin->prio == prio && pwin->text && !(pwin->flags & HIDDEN) ) - break; - } - - if( i != MAX_WINDOWS && pwin->x < screen_w ) - { - UINT32 w; - xadd = 0; - yadd = 0; - - if( pwin->flags & BORDER_LEFT ) ++xadd; - if( pwin->flags & BORDER_RIGHT ) ++xadd; - if( pwin->flags & BORDER_TOP ) ++yadd; - if( pwin->flags & BORDER_BOTTOM ) ++yadd; - - w = pwin->w + xadd; - if( w > screen_w ) - w = screen_w - pwin->x; - - for( y = pwin->y; y < screen_h && y < pwin->y + pwin->h + yadd; y++ ) - memset(&p_prio_map[y * screen_w + pwin->x], prio, w); - } - } - - /* Now create a shadow region (if applicable) */ - - memset(p_shadow_map, 0xff, screen_w * screen_h); - - for( pwin = &p_windows[MAX_WINDOWS-1], i = MAX_WINDOWS-1; i >= 0; --i, --pwin ) - { - /* Let's figure out if we should be doing a shadow */ - - if( pwin->text && (pwin->flags & SHADOW) && !(pwin->flags & HIDDEN) ) - { - yadd = pwin->y + pwin->h; - xadd = pwin->x + pwin->w; - - /* If we have additional borders, extend it! */ - if( pwin->flags & BORDER_TOP ) ++yadd; - if( pwin->flags & BORDER_BOTTOM ) ++yadd; - if( pwin->flags & BORDER_LEFT ) ++xadd; - if( pwin->flags & BORDER_RIGHT ) ++xadd; - - /* If the line is still within range, go figure it! */ - - if( (yadd + 1) < screen_h ) - { - for( x = pwin->x + 1; x < screen_w && x < (xadd + 1); x++ ) - { - if( pwin->prio < p_shadow_map[x + (yadd * screen_w)] ) - p_shadow_map[x + (yadd * screen_w)] = pwin->prio; - } - } - - /* Now let's draw us a vertical shadow line */ - if( (xadd + 1) < screen_w ) - { - for( y = pwin->y + 1; y < yadd; y++ ) - { - if( pwin->prio < p_shadow_map[xadd + (y * screen_w)] ) - p_shadow_map[xadd + (y * screen_w)] = pwin->prio; - } - } - } - } -} - -/************************************************************************ - * - * Name : win_update_shadow - * - * Entry: Window #, pointer to an array of bytes for affected windows - * - * Exit : Nothing - * - * Description: - * - * This routine will find all windows that are affected by a - * shadow of a given window. Not actual updates are done. - * - ************************************************************************/ - -static void win_update_shadow(UINT32 idx, UINT8 *affected) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT32 x, y, xadd, yadd; - UINT8 bMap = 0; - - xadd = pwin->w; - yadd = pwin->h; - - if( pwin->flags & BORDER_LEFT ) ++xadd; - if( pwin->flags & BORDER_RIGHT ) ++xadd; - if( pwin->flags & BORDER_TOP ) ++yadd; - if( pwin->flags & BORDER_BOTTOM ) ++yadd; - - /* Now check to see if we need to update anything because of the shadow */ - - if( pwin->flags & SHADOW ) - { - /* Check out the shadow on the bottom and see if we need */ - /* to update a window below. */ - y = yadd + pwin->y; - if( y < screen_h ) - { - for( x = pwin->x + 2; x < (pwin->x + xadd + 2); x++ ) - { - if( x < screen_w ) - { - bMap = p_prio_map[(y * screen_w) + x]; - if( 0xff != bMap ) - affected[bMap] = 1; - } - } - } - - /* And now down the right side */ - for( y = pwin->y + 1; y < screen_h && y < pwin->y + yadd + 1; y++ ) - { - for( x = xadd + pwin->x; x < (xadd + pwin->x + 2); x++ ) - { - if( x < screen_w ) - { - bMap = p_prio_map[(y * screen_w) + x]; - if( 0xff != bMap ) - affected[bMap] = 1; - } - } - } - } -} - -/************************************************************************ - * - * Name : win_update - * - * Entry: Window # to update - * - * Exit : Nothing - * - * Description: - * - * This routine will update a given window on the screen. - * - ************************************************************************/ - -void win_update(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT8 affected[MAX_WINDOWS]; - UINT32 x0, y0, x, y, win_offs, scr_offs; - UINT8 ch, color; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - memset( affected, 0, sizeof(affected) ); - - /* If this isn't a valid window or it's hidden, just bail out */ - - if( NULL == pwin->text || (pwin->flags & HIDDEN) ) - return; - - /* Let's whip through and draw the whole stinking window, shall we? */ - - x0 = pwin->x; - y0 = pwin->y; - - if( pwin->flags & BORDER_LEFT ) ++x0; - if( pwin->flags & BORDER_TOP ) ++y0; - - color = pwin->co_frame; - - /* See if we need a character in the upper left hand corner of our window */ - if( (pwin->flags & BORDER_TOP) && (pwin->flags & BORDER_LEFT) ) - { - if( pwin->x < screen_w && pwin->y < screen_h ) - if( p_prio_map[pwin->x + (pwin->y * screen_w)] >= pwin->prio ) - win_out(FRAME_TL, color, pwin->x, pwin->y, idx); - } - - /* See if we need a character in the lower left hand corner of our window */ - if( (pwin->flags & BORDER_BOTTOM) && (pwin->flags & BORDER_LEFT) ) - { - if( pwin->x < screen_w && pwin->y + y0 < screen_h ) - if( p_prio_map[pwin->x + ((y0 + pwin->h) * screen_w)] >= pwin->prio ) - win_out(FRAME_BL, color, pwin->x, pwin->h + y0, idx); - } - - /* See if we need a character in the upper right hand corner of our window */ - if( (pwin->flags & BORDER_TOP) && (pwin->flags & BORDER_RIGHT) ) - { - if( pwin->x + x0 < screen_w && pwin->y < screen_h ) - if( p_prio_map[pwin->w + x0 + (pwin->y * screen_w)] >= pwin->prio ) - win_out(FRAME_TR, color, pwin->w + x0, pwin->y, idx); - } - - /* See if we need a character in the lower right hand corner of our window */ - if( (pwin->flags & BORDER_BOTTOM) && (pwin->flags & BORDER_RIGHT) ) - { - if( pwin->x + x0 < screen_w && pwin->y + y0 < screen_h ) - if( p_prio_map[pwin->w + x0 + ((pwin->h + y0) * screen_w)] >= pwin->prio ) - win_out(FRAME_BR, color, pwin->w + x0, pwin->h + y0, idx); - } - - /* Let's go through and draw the frame for the window (if any) */ - if( pwin->flags & BORDER_LEFT ) /* Here we have a left border */ - { - for( y = y0; y < (y0 + pwin->h); y++ ) - { - if( p_prio_map[pwin->x + (y * screen_w)] >= pwin->prio ) - win_out(FRAME_V, color, pwin->x, y, idx); - } - } - - /* Let's draw the right side of the window (if any) */ - if( pwin->flags & BORDER_RIGHT ) /* Here we have a right border */ - { - if( pwin->w + x0 < screen_w ) - for( y = y0; y < screen_h && y < (y0 + pwin->h); y++ ) - { - if( p_prio_map[pwin->w + x0 + (y * screen_w)] >= pwin->prio ) - win_out(FRAME_V, color, x0 + pwin->w, y, idx); - } - } - - /* Let's draw the bottom side of the window (if any) */ - if( pwin->flags & BORDER_BOTTOM ) - { - if( pwin->h + y0 < screen_h ) - for( x = x0; x < (x0 + pwin->w); x++ ) - { - if( p_prio_map[((y0 + pwin->h) * screen_w) + x] >= pwin->prio ) - win_out(FRAME_H, color, x, y0 + pwin->h, idx); - } - } - - /* And now the top! */ - if( pwin->flags & BORDER_TOP ) - { - /* If we've got a title, let's put that in, too... */ - if( pwin->title ) - { - UINT32 i, j, length1, length2; - char *p = strchr(pwin->title, '\t'); - - /* If the title contains a tab, split it into two parts */ - if( p ) - { - i = 0; - j = 1; - length1 = (UINT32)(p - pwin->title); - length2 = strlen(p + j); - - for( x = x0; x < screen_w && x < (x0 + pwin->w); x++ ) - { - if( p_prio_map[x + (pwin->y * screen_w)] < pwin->prio ) - continue; - color = pwin->co_frame; - if( x < (x0 + 1) ) - { - ch = FRAME_H; - } - else - if( x > (x0 + 1 + length1 + 1) ) - { - if( x < (x0 + pwin->w - 1 - length2 - 1) ) - { - ch = FRAME_H; - } - else - { - if( x == (x0 + pwin->w - 1) ) - ch = CAPTION_R; - else - if( x == (x0 + pwin->w - 1 - length2 - 1) ) - ch = CAPTION_L; - else - { - color = pwin->co_title; - ch = p[j++]; - } - } - } - else - { - if( x == (x0 + 1) ) - ch = CAPTION_L; - else - if( x == (x0 + 1 + length1 + 1) ) - ch = CAPTION_R; - else - { - color = pwin->co_title; - ch = pwin->title[i++]; - } - } - win_out(ch, color, x, pwin->y, idx); - } - } - else - { - /* Draw a top border with a title in the left part */ - length1 = strlen(pwin->title); - i = 0; - for( x = x0; x < screen_w && x < (x0 + pwin->w); x++ ) - { - if( p_prio_map[x + (pwin->y * screen_w)] < pwin->prio ) - continue; - color = pwin->co_frame; - if( x < (x0 + 1) || x > (x0 + 1 + length1 + 1) ) - { - ch = FRAME_H; - } - else - { - if( x == (x0 + 1) ) - ch = CAPTION_L; - else - if( x == (x0 + 1 + length1 + 1) ) - ch = CAPTION_R; - else - { - color = pwin->co_title; - ch = pwin->title[i++]; - } - } - win_out(ch, color, x, pwin->y, idx); - } - } - } - else - { - for( x = x0; x < screen_w && x < (x0 + pwin->w); x++ ) - { - if( p_prio_map[(pwin->y * screen_w) + x] >= pwin->prio ) - win_out(FRAME_H, color, x, pwin->y, idx); - } - } - - } - - /* Loop through our existing window and update it on the screen */ - for( y = 0; y < pwin->h; y++ ) - { - win_offs = y * screen_w; - scr_offs = (y0 + y) * screen_w + x0; - for( x = 0; x < pwin->w; x++ ) - { - if( p_prio_map[scr_offs] >= pwin->prio ) - { - ch = pwin->text[win_offs]; - color = pwin->attr[win_offs]; - win_out(ch, color, x0 + x, y0 + y, idx); - } - win_offs++; - scr_offs++; - } - } -} - -/************************************************************************ - * - * Name : win_erase - * - * Entry: Window index # to erase - * - * Exit : Nothing - * - * Description: - * - * This routine will erase a window from the physical display (including - * borders if applicable) - * - ************************************************************************/ - -void win_erase(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT8 affected[MAX_WINDOWS]; - UINT32 i = 0; - UINT32 flags_old; - UINT8 bMap = 0; - UINT32 x, y; - UINT32 xadd = 0; - UINT32 yadd = 0; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - if( NULL == pwin->text ) - return; - - memset( affected, 0, sizeof(affected) ); - - /* Let's fake like the window is gone */ - - flags_old = pwin->flags; - pwin->flags |= HIDDEN; - - /* Recompute the display matrix */ - - win_update_map(); - - xadd = pwin->w; - yadd = pwin->h; - - if( pwin->flags & BORDER_LEFT ) ++xadd; - if( pwin->flags & BORDER_RIGHT ) ++xadd; - if( pwin->flags & BORDER_TOP ) ++yadd; - if( pwin->flags & BORDER_BOTTOM ) ++yadd; - - win_set_cursor_char(idx, 0, pwin->flags & CURSOR_ON); - - /* Go see if we need to do anything about our shadows */ - for( y = pwin->y; y < screen_h && y < (pwin->y + yadd); y++ ) - { - for( x = pwin->x; x < screen_w && x < (pwin->x + xadd); x++ ) - { - bMap = p_prio_map[(y * screen_w) + x]; - if( 0xff == bMap ) - win_out(WIN_EMPTY, WIN_WHITE, x, y, idx); - else - affected[bMap] = 1; - } - } - - win_update_shadow(idx, affected); - - /* Now that we've erased the residuals, let's go update */ - /* the windows that need it */ - - for( i = 0; i < MAX_WINDOWS; i++ ) - { - if( affected[i] || (i != idx) ) - { - win_update(i); - win_set_cursor_char(i, p_windows[i].flags & CURSOR_ON, 0); - } - } - - pwin->flags = flags_old; -} - -/************************************************************************ - * - * Name : win_set_cursor_char - * - * Entry: Window # to set cursor state, and state of cursor - * - * Exit : Nothing - * - * Description: - * - * This routine will either turn on/off the cursor in a given window. - * - ************************************************************************/ - -void win_set_cursor_char(UINT32 idx, UINT32 state, UINT32 state_old) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT32 x0, y0, win_offs; - - if( INVALID == idx ) - return; - - if( NULL == pwin->text ) - return; - - if( pwin->flags & HIDDEN ) - return; - - if( pwin->flags & NO_WRAP ) - { - if( pwin->x >= pwin->w ) - return; - if( pwin->y >= pwin->h ) - return; - } - - x0 = pwin->x + pwin->cx; - y0 = pwin->y + pwin->cy; - - if( pwin->flags & BORDER_LEFT ) ++x0; - if( pwin->flags & BORDER_TOP ) ++y0; - - /* If we are outside of the physical screen, just exit */ - if( x0 >= screen_w || y0 >= screen_h ) - return; - - win_offs = y0 * screen_w + x0; - - if( p_prio_map[win_offs] < pwin->prio ) - return; - - if( state ) - { - pwin->saved_text = p_text[win_offs]; - pwin->saved_attr = p_attr[win_offs]; - win_out(CHAR_CURSORON, WIN_BRIGHT_WHITE, x0, y0, idx); - } - else - { - if( 0 != state_old ) - win_out(pwin->saved_text, pwin->saved_attr, x0, y0, idx); - } -} - -/************************************************************************ - * - * Name : win_is_initalized() - * - * Entry: Nothing - * - * Exit : TRUE if a window is already initialized - * - * Description: - * - * This routine returns the initialization status of a window - * - ************************************************************************/ - -UINT32 win_is_initalized(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - - if( !p_windows ) - return FALSE; - - if( idx >= MAX_WINDOWS ) - return FALSE; - if( pwin->text == NULL ) - return FALSE; - if( pwin->attr == NULL ) - return FALSE; - - return TRUE; -} - -/************************************************************************ - * - * Name : win_init_engine() - * - * Entry: Nothing - * - * Exit : Nothing - * - * Description: - * - * This routine will initialize all variables needed for the windowing - * engine to start. - * - ************************************************************************/ - -UINT32 win_init_engine(UINT32 w, UINT32 h) -{ - UINT32 x, y; - - /* Uninitialize if we are currently initialized */ - - win_exit_engine(); /* Just in case! */ - - screen_w = w; - screen_h = h; - - /* Allocate memory for some things */ - - p_text = MyMalloc(screen_w * screen_h, "win_init_engine()"); - p_attr = MyMalloc(screen_w * screen_h, "win_init_engine()"); - p_windows = MyMalloc(sizeof(struct sWindow) * MAX_WINDOWS, "win_init_engine()"); - p_prio_map = MyMalloc(screen_w * screen_h, "win_init_engine()"); - p_shadow_map = MyMalloc(screen_w * screen_h, "win_init_engine()"); - - win_update_map(); - - for (y = 0; y < screen_h; y++) - for (x = 0; x < screen_w; x++) - win_out(WIN_EMPTY, WIN_WHITE, x, y, 0); - - return(TRUE); -} - -/************************************************************************ - * - * Name : win_exit_engine - * - * Entry: Nothing - * - * Exit : Nothing - * - * Description: - * - * This routine will shut down the windowing engine - * - ************************************************************************/ - -void win_exit_engine(void) -{ - UINT32 x, y, i; - - /* Clear the screen. This *MUST* be before the shadow map is freed! */ - - if( p_windows ) - { - if( p_text ) - { - for (y = 0; y < screen_h; y++) - for (x = 0; x < screen_w; x++) - win_out(' ', WIN_WHITE, x, y, 0); - } - - for (i = 0; i < MAX_WINDOWS; i++) - { - if( p_windows[i].text ) - MyFree((void **) &p_windows[i].text, "win_exit_engine()"); - if( p_windows[i].attr ) - MyFree((void **) &p_windows[i].attr, "win_exit_engine()"); - } - } - - if( p_windows ) - MyFree((void **) &p_windows, "InitWindowEngine()"); - if( p_prio_map ) - MyFree((void **) &p_prio_map, "InitWindowEngine()"); - if( p_shadow_map ) - MyFree((void **) &p_shadow_map, "InitWindowEngine()"); - if( p_text ) - MyFree((void **) &p_text, "InitWindowEngine()"); - if( p_attr ) - MyFree((void **) &p_attr, "InitWindowEngine()"); -} - -/************************************************************************ - * - * Name : win_open - * - * Entry: Window structure, and priority desired - * - * Exit : FALSE If couldn't be opened, or TRUE if successful - * - * Description: - * - * This routine will allow one to open a window. - * - ************************************************************************/ - -UINT32 win_open(UINT32 idx, struct sWindow *psWin) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT8 affected[MAX_WINDOWS]; - UINT32 xadd, yadd, i; - UINT8 ch = 0, color = 0; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - ASSERT(psWin); /* This, too. */ - - memset( affected, 0, sizeof(affected) ); - - /* Is the window already open? Return FALSE if so */ - - if( pwin->text ) - return(FALSE); - - xadd = 0; - yadd = 0; - - if( psWin->flags & BORDER_LEFT ) - ++xadd; - if( psWin->flags & BORDER_RIGHT ) - ++xadd; - if( psWin->flags & BORDER_TOP ) - ++yadd; - if( psWin->flags & BORDER_BOTTOM ) - ++yadd; - -// ASSERT((psWin->x + psWin->w + xadd) <= screen_w); -// ASSERT((psWin->y + psWin->h + yadd) <= screen_h); - - psWin->text = MyMalloc( screen_w * (yadd + psWin->h), "win_open()" ); - psWin->attr = MyMalloc( screen_w * (yadd + psWin->h), "win_open()" ); - psWin->title = MyMalloc( screen_w + 1, "win_open()" ); - - /* This is our fill character */ - ch = psWin->filler; - color = psWin->co_text; - - for (i = 0; i < screen_w * (yadd + psWin->h); i++) - { - psWin->text[i] = ch; - psWin->attr[i] = color; - } - - psWin->cx = 0; - psWin->cy = 0; - - /* Copy it into the regular structure, update the window map and show */ - /* the window (if it's not hidden) */ - - memcpy(pwin, psWin, sizeof(struct sWindow)); - - win_update_map(); - win_update_shadow(idx, affected); - - /* Now that we've erased the residuals, let's go update the windows */ - /* that need it */ - - for (i = 0; i < MAX_WINDOWS; i++) - { - if( affected[i] || (i == idx) ) - { - win_update(i); - win_set_cursor_char(i, p_windows[i].flags & CURSOR_ON, 0); - } - } - - pwin->saved_text = ch; - pwin->saved_attr = color; - win_set_cursor_char(idx, pwin->flags & CURSOR_ON, 0); - - /* Now that the window is opened, if there's a resize handler available, */ - /* call it! */ - - if( pwin->Resize ) - pwin->Resize(idx, pwin); - - return(TRUE); -} - -/************************************************************************ - * - * Name : win_close - * - * Entry: Window # - * - * Exit : Nothing - * - * Description: - * - * This routine will close down a currently opened window and erase it from - * the visual screen. - * - ************************************************************************/ - -void win_close(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - if( NULL == pwin->text ) - return; - - /* Call the shutdown client if applicable */ - - if( pwin->Close ) - { - if( FALSE == pwin->Close(idx, pwin) ) - return; - } - - /* Erase the window from the screen */ - - win_erase(idx); - - /* Delete all we've allocated */ - - MyFree((void **) &pwin->text, "win_close()"); /* Free our video data */ - MyFree((void **) &pwin->attr, "win_close()"); /* Free our video data */ - MyFree((void **) &pwin->title, "win_close()"); /* Free our video data */ -} - -/************************************************************************ - * - * Name : win_scroll - * - * Entry: Window # to scroll - * - * Exit : Window is scrolled and updated (if currently visible) - * - * Description: - * - * This routine will scroll a window - * - ************************************************************************/ - -UINT32 win_scroll(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT32 i; - UINT8 *ptext, *pattr, color; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - /* Is the window already open? Return FALSE if so */ - - if( NULL == pwin->text ) - return(FALSE); - - /* If we don't scroll it, don't scroll it! */ - - if( pwin->flags & NO_SCROLL ) - return(FALSE); - - /* Let's do the scroll */ - - ptext = pwin->text; - pattr = pwin->attr; - - if( pwin->h != 1 ) - { - memcpy( ptext, ptext + screen_w, screen_w * (pwin->h - 1) ); - memcpy( pattr, pattr + screen_w, screen_w * (pwin->h - 1) ); - } - - /* Now that we've done the scroll, let's clear out the bottom line */ - - color = pwin->co_text; - for (i = 0; i < pwin->w; i++) - { - *ptext++ = ' '; - *pattr++ = color; - } - - win_update(idx); - return(TRUE); -} - -/************************************************************************ - * - * Name : win_internal_putchar - * - * Entry: Character to display - * - * Exit : relative offset of the cursor after the output - * - * Description: - * - * This routine will put a character to the currently active window. This - * routine does not take into account the cursor! Use win_putc or win_printf - * instead! - * - ************************************************************************/ - -INT32 win_internal_putchar(UINT32 idx, UINT8 ch) -{ - struct sWindow *pwin = &p_windows[idx]; - INT32 rel = 0; - UINT32 x0, y0; - UINT8 color; - - if( NULL == pwin->text ) - return 0; - - color = pwin->co_text; - - switch( ch ) - { - case '\b': /* Backspace? */ - if( pwin->cx ) - { - pwin->cx--; - rel--; - } - break; - - case '\r': /* Carriage return */ - rel = - pwin->cx; - pwin->cx = 0; - break; - - case '\n': /* Newline or linefeed? */ -#if NEWLINE_ERASE_EOL - win_erase_eol( idx, ' ' ); -#endif - rel = - pwin->cx; - pwin->cx = 0; - pwin->cy++; - if( pwin->cy >= pwin->h ) - { - pwin->cy--; - win_scroll(idx); - } - break; - - case '\t': /* Tab? */ - do - { - rel += win_internal_putchar( idx, ' '); - } while( pwin->cx % TAB_STOP ); - break; - - default: - x0 = pwin->x + pwin->cx; - y0 = pwin->y + pwin->cy; - - if( pwin->flags & BORDER_LEFT ) - ++x0; - if( pwin->flags & BORDER_TOP ) - ++y0; - - /* Sanity check */ - if( x0 < screen_w && y0 < screen_h ) - { - pwin->text[pwin->cy * screen_w + pwin->cx] = ch; - pwin->attr[pwin->cy * screen_w + pwin->cx] = color; - if( pwin->cx < pwin->w ) - { - if( p_prio_map[y0 * screen_w + x0] >= pwin->prio && !(pwin->flags & HIDDEN) ) - win_out(ch, color, x0, y0, idx); - } - } - - rel++; - pwin->cx++; - if( pwin->cx >= pwin->w ) - { - /* If we do not wrap at the right side, just exit */ - if( pwin->flags & NO_WRAP ) - return rel; - pwin->cx = 0; - pwin->cy++; - if( pwin->cy >= pwin->h ) - { - win_scroll(idx); - pwin->cy--; - } - } - } - return rel; -} - -/************************************************************************ - * - * Name : win_putc - * - * Entry: Character to print - * - * Exit : relative offset of the cursor after the output - * - * Description: - * - * This routine will put a character to the currently defined window. - * - ************************************************************************/ - -INT32 win_putc(UINT32 idx, UINT8 bChar) -{ - struct sWindow *pwin = &p_windows[idx]; - INT32 rel; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - if( NULL == pwin->text ) - return 0; - - if( pwin->flags & CURSOR_ON ) - win_set_cursor_char(idx, 0, pwin->flags); - - rel = win_internal_putchar(idx, bChar); - - if( pwin->flags & CURSOR_ON ) - win_set_cursor_char(idx, 1, 0); - - return rel; -} - -/************************************************************************ - * - * Name : win_erase_eol - * - * Entry: Window # and character to fill with - * - * Exit : None - * - * Description: - * - * This routine will fill a character to the end of the line - * - ************************************************************************/ - -void win_erase_eol(UINT32 idx, UINT8 ch) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT32 i, x, y; - UINT32 flags_old; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - if( NULL == pwin->text ) - return; - - flags_old = pwin->flags; - pwin->flags |= NO_SCROLL; - - if( pwin->flags & CURSOR_ON ) - win_set_cursor_char(idx, 0, pwin->flags); - - /* Do the fill! */ - - x = pwin->cx; - y = pwin->cy; - for( i = x; i < pwin->w ; i++ ) - win_internal_putchar(idx, ch); - - pwin->cx = x; - pwin->cy = y; - pwin->flags = flags_old; - - if( pwin->flags & CURSOR_ON ) - win_set_cursor_char(idx, 1, 0); -} - -/************************************************************************ - * - * Name : win_set_curpos - * - * Entry: Window # and x/y coordinates within the window - * - * Exit : Nothing - * - * Description: - * - * This routine will position the cursor within the Window. - * - ************************************************************************/ - -void win_set_curpos(UINT32 idx, UINT32 x, UINT32 y) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - if( NULL == pwin->text ) - return; - - /* Make sure we're in range */ - - /* If we do not wrap at the right side, just exit */ - if( !(pwin->flags & NO_WRAP) ) - { - if( x >= pwin->w ) - return; - if( y >= pwin->h ) - return; - } - - win_set_cursor_char(idx, 0, pwin->flags & CURSOR_ON); - - /* Now put the cursor there */ - - pwin->cx = x; - pwin->cy = y; - win_set_cursor_char(idx, pwin->flags & CURSOR_ON, 0); -} - -static char tmp_text[450]; - -/************************************************************************ - * - * Name : win_vprintf - * - * Entry: window # to and format (with optional arguments) to print - * - * Exit : Nothing - * - * Description: - * - * This routine will send a null terminated string to a window - * - ************************************************************************/ - -INT32 win_vprintf(UINT32 idx, const char *fmt, va_list arg) -{ - struct sWindow *pwin = &p_windows[idx]; - char *src = tmp_text; - int length = 0; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - if( NULL == pwin->text ) - return length; - - if( pwin->flags & CURSOR_ON ) - win_set_cursor_char(idx, 0, pwin->flags & CURSOR_ON); - - length = vsprintf(tmp_text, fmt, arg); - - while( *src ) - win_internal_putchar( idx, *src++ ); - - if( pwin->flags & CURSOR_ON ) - win_set_cursor_char(idx, 1, 0); - - return length; -} - - -/************************************************************************ - * - * Name : win_printf - * - * Entry: window # to and format (with optional arguments) to print - * - * Exit : Nothing - * - * Description: - * - * This routine will send a null terminated string to a window - * - ************************************************************************/ - -INT32 DECL_SPEC win_printf(UINT32 idx, const char *fmt, ...) -{ - struct sWindow *pwin = &p_windows[idx]; - char *src = tmp_text; - int length = 0; - va_list arg; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - if( NULL == pwin->text ) - return length; - - if( pwin->flags & CURSOR_ON ) - win_set_cursor_char(idx, 0, pwin->flags & CURSOR_ON); - - va_start(arg, fmt); - length = vsprintf(tmp_text, fmt, arg); - va_end(arg); - - while( *src ) - win_internal_putchar( idx, *src++ ); - - if( pwin->flags & CURSOR_ON ) - win_set_cursor_char(idx, 1, 0); - - return length; -} - -/************************************************************************ - * - * Name : win_set_color - * - * Entry: Window # and color - * - * Exit : Nothing - * - * Description: - * - * This routine sets the fore- and background colors for - * subsequent text outputs (win_putc and win_printf) - * - ************************************************************************/ - -void win_set_color(UINT32 idx, UINT32 color) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - if( NULL == pwin->text ) - return; - - pwin->co_text = color; -} - -/************************************************************************ - * - * Name : win_set_title_color - * - * Entry: Window # and new title color - * - * Exit : Nothing - * - * Description: - * - * This routine sets the color for title of a window - * - ************************************************************************/ - -void win_set_title_color(UINT32 idx, UINT32 color) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - if( NULL == pwin->text ) - return; - - pwin->co_title = color; - win_update( idx ); -} - -/************************************************************************ - * - * Name : win_set_frame_color - * - * Entry: Window # and new frame color - * - * Exit : Nothing - * - * Description: - * - * This routine sets the color for title of a window - * - ************************************************************************/ - -void win_set_frame_color(UINT32 idx, UINT32 color) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - if( NULL == pwin->text ) - return; - - pwin->co_frame = color; - win_update( idx ); -} - -/************************************************************************ - * - * Name : win_set_cursor - * - * Entry: Window # and cursor state - * - * Exit : Nothing - * - * Description: - * - * This routine sets the cursor state to on (non zero) or off (zero) - * - ************************************************************************/ - -void win_set_cursor(UINT32 idx, UINT32 state) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT32 cursor; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - if( NULL == pwin->text ) - return; - - if( state ) - cursor = pwin->flags |= CURSOR_ON; - else - cursor = pwin->flags &= ~CURSOR_ON; - - win_set_cursor_char(idx, state, pwin->flags & CURSOR_ON); - - pwin->flags = cursor; -} - -/************************************************************************ - * - * Name : win_hide - * - * Entry: Window # to hide - * - * Exit : Nothing - * - * Description: - * - * This routine will hide a window. - * - ************************************************************************/ - -void win_hide(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - /* If it's already hidden, don't hide it again! */ - - if( pwin->flags & HIDDEN ) - return; - - /* Otherwise, hide it */ - - win_erase(idx); - pwin->flags |= HIDDEN; -} - -/************************************************************************ - * - * Name : win_show - * - * Entry: Window # to show - * - * Exit : Nothing - * - * Description: - * - * This routine will show a window. - * - ************************************************************************/ - -void win_show(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - /* Don't redraw the window if it's already shown */ - - if( pwin->flags & HIDDEN ) - { - pwin->flags &= ~HIDDEN; - win_update_map(); - } - - /* But update them */ - win_update(idx); -} - -/************************************************************************ - * - * Name : win_set_title - * - * Entry: Window # and new title - * - * Exit : - * - * Description: - * - * Changes the title of a window and updates the screen - * - ************************************************************************/ - -UINT32 DECL_SPEC win_set_title(UINT32 idx, const char *fmt, ... ) -{ - struct sWindow *pwin = &p_windows[idx]; - va_list arg; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - /* If BORDER_TOP is not set, changing a title makes no sense */ - if( (pwin->flags & BORDER_TOP) == 0 ) - return FALSE; - - va_start(arg, fmt); - vsprintf(tmp_text, fmt, arg); - va_end(arg); - - /* If a title is there and did not change, just exit */ - if( pwin->title && !strcmp(pwin->title, tmp_text) ) - return TRUE; - - strncpy( pwin->title, tmp_text, screen_w ); - - win_update(idx); - return TRUE; -} - -/************************************************************************ - * - * Name : win_get_cx - * - * Entry: Window # - * - * Exit : Cursor X - * - * Description: - * - * Returns the cursor X coordinate for a window - * - ************************************************************************/ - -UINT32 win_get_cx(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - return pwin->cx; -} - -/************************************************************************ - * - * Name : win_get_cy - * - * Entry: Window # - * - * Exit : Cursor Y - * - * Description: - * - * Returns the cursor Y coordinate for a window - * - ************************************************************************/ - -UINT32 win_get_cy(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - return pwin->cy; -} - -/************************************************************************ - * - * Name : win_get_cx_abs - * - * Entry: Window # - * - * Exit : Cursor X - * - * Description: - * - * Returns the screen (absolute) Cursor X coordinate for a window - * - ************************************************************************/ - -UINT32 win_get_cx_abs(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT32 x; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - x = pwin->x + pwin->cx; - if( pwin->flags & BORDER_LEFT ) - x++; - - return x; -} - -/************************************************************************ - * - * Name : win_get_cy_abs - * - * Entry: Window # - * - * Exit : Cursor Y - * - * Description: - * - * Returns the screen (absolute) Cursor Y coordinate for a window - * - ************************************************************************/ - -UINT32 win_get_cy_abs(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT32 y; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - y = pwin->y + pwin->cy; - if( pwin->flags & BORDER_TOP ) - y++; - - return y; -} - -/************************************************************************ - * - * Name : win_get_x_abs - * - * Entry: Window # - * - * Exit : AbsX - * - * Description: - * - * Returns the screen (absolute) X coordinate for a window - * - ************************************************************************/ - -UINT32 win_get_x_abs(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT32 x; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - x = pwin->x; - if( pwin->flags & BORDER_LEFT ) - x++; - - return x; -} - -/************************************************************************ - * - * Name : win_get_y_abs - * - * Entry: Window # - * - * Exit : AbsY - * - * Description: - * - * Returns the screen (absolute) Y coordinate for a window - * - ************************************************************************/ - -UINT32 win_get_y_abs(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT32 y; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - y = pwin->y; - if( pwin->flags & BORDER_TOP ) - y++; - - return y; -} - -/************************************************************************ - * - * Name : win_get_w - * - * Entry: Window # - * - * Exit : Width - * - * Description: - * - * Returns the width of a window - * - ************************************************************************/ - -UINT32 win_get_w(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - return pwin->w; -} - -/************************************************************************ - * - * Name : win_get_h - * - * Entry: Window # - * - * Exit : Height - * - * Description: - * - * Returns the height of a window - * - ************************************************************************/ - -UINT32 win_get_h(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - return pwin->h; -} - -/************************************************************************ - * - * Name : win_set_w - * - * Entry: Window # and new width - * - * Exit : Nothing - * - * Description: - * - * Changes the width of a window - * - ************************************************************************/ - -void win_set_w(UINT32 idx, UINT32 w) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - win_erase(idx); - pwin->w = w; - win_update_map(); - win_update(idx); -} - -/************************************************************************ - * - * Name : win_set_h - * - * Entry: Window # and new height - * - * Exit : Nothing - * - * Description: - * - * Changes the height of a window - * - ************************************************************************/ - -void win_set_h(UINT32 idx, UINT32 h) -{ - struct sWindow *pwin = &p_windows[idx]; - UINT32 yadd; - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - yadd = 0; - - if( pwin->flags & BORDER_TOP ) - ++yadd; - if( pwin->flags & BORDER_BOTTOM ) - ++yadd; - - win_erase(idx); - pwin->text = MyReAlloc(pwin->text, screen_w * (h + yadd), "win_set_h()"); - pwin->attr = MyReAlloc(pwin->attr, screen_w * (h + yadd), "win_set_h()"); - pwin->h = h; - if( pwin->cy >= pwin->h ) - pwin->cy = pwin->h - 1; - win_update_map(); - win_update(idx); -} - -/************************************************************************ - * - * Name : win_get_prio - * - * Entry: Window # - * - * Exit : Priority of window - * - * Description: - * - * Returns the current priority of a window - * - ************************************************************************/ - -UINT8 win_get_prio(UINT32 idx) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - return pwin->prio; -} - -/************************************************************************ - * - * Name : win_set_prio - * - * Entry: Window # and new priority - * - * Exit : Nothing - * - * Description: - * - * Changes the priority of a window - * - ************************************************************************/ - -void win_set_prio(UINT32 idx, UINT8 prio) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - - if( pwin->prio == prio ) - return; - - win_erase(idx); - pwin->prio = prio; - win_update_map(); - win_update(idx); -} - -/************************************************************************ - * - * Name : win_move - * - * Entry: Window #, new x and y coordinates - * - * Exit : - * - * Description: - * - * Moves a window to a new position - * - ************************************************************************/ - -void win_move(UINT32 idx, UINT32 x, UINT32 y) -{ - struct sWindow *pwin = &p_windows[idx]; - - ASSERT(idx < MAX_WINDOWS); /* This had better be in range */ - ASSERT(p_windows); /* And this had better be initialized */ - win_erase(idx); - pwin->x = x; - pwin->y = y; - win_update_map(); - win_update(idx); -} - -/************************************************************************ - * - * Name : win_invalidate_video - * - * Entry: Nothing - * - * Exit : Nothing - * - * Description: - * - * Invalidates the video memory (eg. after a switch to graphics mode) - * - ************************************************************************/ - -void win_invalidate_video(void) -{ - - if( p_text == NULL || p_attr == NULL ) - return; - - memset( p_text, 0xff, screen_w * screen_h ); - memset( p_attr, 0xff, screen_w * screen_h ); -} - -#endif diff --git a/src/debug/window.h b/src/debug/window.h deleted file mode 100644 index bd92a77b6..000000000 --- a/src/debug/window.h +++ /dev/null @@ -1,181 +0,0 @@ -/********************************************************************* - - window.h - - Text mode window engine - - Copyright (c) 1996-2006, Nicola Salmoria and the MAME Team. - Visit http://mamedev.org for licensing and usage restrictions. - -*********************************************************************/ - -#ifndef _WINDOW_H_ -#define _WINDOW_H_ - -#include "mamedbg.h" - -#ifndef DECL_SPEC -#define DECL_SPEC -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef INVALID -#define INVALID 0xffffffff -#endif - -#ifndef WIN_EMPTY -#define WIN_EMPTY 176 /* checkered pattern */ -#endif -#ifndef CAPTION_L -#define CAPTION_L 174 /* >> */ -#endif -#ifndef CAPTION_R -#define CAPTION_R 175 /* << */ -#endif -#ifndef FRAME_TL -#define FRAME_TL 218 /* top, left border */ -#endif -#ifndef FRAME_BL -#define FRAME_BL 192 /* bottom, left border */ -#endif -#ifndef FRAME_TR -#define FRAME_TR 191 /* top, right border */ -#endif -#ifndef FRAME_BR -#define FRAME_BR 217 /* bottom, right border */ -#endif -#ifndef FRAME_V -#define FRAME_V 179 /* vertical line */ -#endif -#ifndef FRAME_H -#define FRAME_H 196 /* horizontal line */ -#endif - -/* This is our window structure */ - -struct sWindow -{ - UINT8 filler; /* Character */ - UINT8 prio; /* This window's priority */ - UINT32 x; /* X Position (in characters) of our window */ - UINT32 y; /* Y Position (in characters) of our window */ - UINT32 w; /* X Size of our window (in characters) */ - UINT32 h; /* Y Size (lines) of our window (in character lengths) */ - UINT32 cx; /* Current cursor's X position */ - UINT32 cy; /* Current cursor's Y position */ - UINT32 flags; /* Window's attributes (below) */ - UINT8 co_text; /* Default color */ - UINT8 co_frame; /* Frame color */ - UINT8 co_title; /* Title color */ - UINT8 saved_text; /* Character under the cursor position */ - UINT8 saved_attr; /* Attribute under the cursor position */ - - /* Stuff that needs to be saved off differently */ - - char *title; /* Window title (if any) */ - UINT8 *text; /* Pointer to video data - characters */ - UINT8 *attr; /* Pointer to video data - attributes */ - - /* These are the callbacks when certain things happen. All fields have been - * updated BEFORE the call. Return FALSE if the moves, resizes, closes, - * refocus aren't accepted. - */ - - UINT32 (*Resize)(UINT32 idx, struct sWindow *); - UINT32 (*Close)(UINT32 idx, struct sWindow *); - UINT32 (*Move)(UINT32 idx, struct sWindow *); - UINT32 (*Refocus)(UINT32 idx, struct sWindow *); /* Bring it to the front */ -}; - -/* These defines are for various aspects of the window */ - -#define BORDER_LEFT 0x01 /* Border on left side of window */ -#define BORDER_RIGHT 0x02 /* Border on right side of window */ -#define BORDER_TOP 0x04 /* Border on top side of window */ -#define BORDER_BOTTOM 0x08 /* Border on bottom side of window */ -#define HIDDEN 0x10 /* Is it hidden currently? */ -#define CURSOR_ON 0x20 /* Is the cursor on? */ -#define NO_WRAP 0x40 /* Do we actually wrap at the right side? */ -#define NO_SCROLL 0x80 /* Do we actually scroll it? */ -#define SHADOW 0x100 /* Do we cast a shadow? */ -#define MOVEABLE 0x200 /* Is this Window moveable? */ -#define RESIZEABLE 0x400 /* IS this Window resiable? */ - -#define MAX_WINDOWS 32 /* Up to 32 windows active at once */ -#define TAB_STOP 8 /* 8 Spaces for a tab stop! */ - -#define AUTO_FIX_XYWH TRUE -#define NEWLINE_ERASE_EOL TRUE /* Shall newline also erase to end of line? */ - -/* Special characters */ - -#define CHAR_CURSORON 219 /* Cursor on character */ -#define CHAR_CURSOROFF 32 /* Cursor off character */ - -/* Standard color set for IBM character set. DO NOT ALTER! */ - -#define WIN_BLACK DBG_BLACK -#define WIN_BLUE DBG_BLUE -#define WIN_GREEN DBG_GREEN -#define WIN_CYAN DBG_CYAN -#define WIN_RED DBG_RED -#define WIN_MAGENTA DBG_MAGENTA -#define WIN_BROWN DBG_BROWN -#define WIN_WHITE DBG_LIGHTGRAY -#define WIN_GRAY DBG_GRAY -#define WIN_LIGHT_BLUE DBG_LIGHTBLUE -#define WIN_LIGHT_GREEN DBG_LIGHTGREEN -#define WIN_LIGHT_CYAN DBG_LIGHTCYAN -#define WIN_LIGHT_RED DBG_LIGHTRED -#define WIN_LIGHT_MAGENTA DBG_LIGHTMAGENTA -#define WIN_YELLOW DBG_YELLOW -#define WIN_BRIGHT_WHITE DBG_WHITE - -#define WIN_BRIGHT 0x08 - -/* Externs! */ - -extern UINT32 screen_w; -extern UINT32 screen_h; - -extern void win_erase_eol(UINT32 idx, UINT8 bChar); -extern INT32 win_putc(UINT32 idx, UINT8 bChar); -extern UINT32 win_open(UINT32 idx, struct sWindow *psWin); -extern UINT32 win_init_engine(UINT32 w, UINT32 h); -extern UINT32 win_is_initalized(UINT32 idx); -extern void win_exit_engine(void); -extern void win_close(UINT32 idx); -extern INT32 win_vprintf(UINT32 idx, const char *pszString, va_list arg); -extern INT32 DECL_SPEC win_printf(UINT32 idx, const char *pszString, ...) ATTR_PRINTF(2,3); -extern UINT32 DECL_SPEC win_set_title(UINT32 idx, const char *pszTitle, ... ) ATTR_PRINTF(2,3); -extern UINT32 win_get_cx(UINT32 idx); -extern UINT32 win_get_cy(UINT32 idx); -extern UINT32 win_get_cx_abs(UINT32 idx); -extern UINT32 win_get_cy_abs(UINT32 idx); -extern UINT32 win_get_x_abs(UINT32 idx); -extern UINT32 win_get_y_abs(UINT32 idx); -extern UINT32 win_get_w(UINT32 idx); -extern UINT32 win_get_h(UINT32 idx); -extern void win_set_w(UINT32 idx, UINT32 w); -extern void win_set_h(UINT32 idx, UINT32 w); -extern void win_set_color(UINT32 idx, UINT32 color); -extern void win_set_title_color(UINT32 idx, UINT32 color); -extern void win_set_frame_color(UINT32 idx, UINT32 color); -extern void win_set_curpos(UINT32 idx, UINT32 x, UINT32 y); -extern void win_set_cursor(UINT32 idx, UINT32 dwCursorState); -extern void win_hide(UINT32 idx); -extern void win_show(UINT32 idx); -extern void win_update(UINT32 idx); -extern UINT8 win_get_prio(UINT32 idx); -extern void win_set_prio(UINT32 idx, UINT8 prio); -extern void win_move(UINT32 idx, UINT32 dwX, UINT32 dwY); -extern void win_invalidate_video(void); - -#endif diff --git a/src/debugger.h b/src/debugger.h index 75b43fb13..320dfc1b4 100644 --- a/src/debugger.h +++ b/src/debugger.h @@ -43,7 +43,7 @@ ***************************************************************************/ /* initialize the debugger */ -void mame_debug_init(void); +void mame_debug_init(running_machine *machine); /* call this once per instruction from CPU cores */ void mame_debug_hook(void); @@ -61,7 +61,7 @@ int mame_debug_is_active(void); ***************************************************************************/ #ifndef MAME_DEBUG -#define mame_debug_init() do { } while (0) +#define mame_debug_init(m) do { } while (0) #define mame_debug_hook() do { } while (0) #define mame_debug_break() do { } while (0) #define mame_debug_is_active() FALSE diff --git a/src/drawgfx.c b/src/drawgfx.c index 3769601e0..9e17ef3a3 100644 --- a/src/drawgfx.c +++ b/src/drawgfx.c @@ -93,7 +93,7 @@ INLINE int readbit(const UINT8 *src, int bitnum) INITIALIZATION ***************************************************************************/ -void drawgfx_init(void) +void drawgfx_init(running_machine *machine) { int lev, byte; @@ -794,9 +794,9 @@ int pdrawgfx_shadow_lowpri = 0; /* 32-bit version */ //* AAT032503: added limited 32-bit shadow and highlight support -INLINE UINT32 SHADOW32(UINT32 c) { +INLINE UINT32 SHADOW32(pen_t *shadow_table, UINT32 c) { c = (c>>9&0x7c00) | (c>>6&0x03e0) | (c>>3&0x001f); - return(((UINT32*)palette_shadow_table)[c]); } + return(shadow_table[c]); } #define DATA_TYPE UINT32 #define DEPTH 32 @@ -816,7 +816,7 @@ INLINE UINT32 SHADOW32(UINT32 c) { #define COLOR_ARG unsigned int colorbase,UINT8 *pridata,UINT32 pmask #define INCREMENT_DST(n) {dstdata+=(n);pridata += (n);} #define LOOKUP(n) (colorbase + (n)) -#define SETPIXELCOLOR(dest,n) { UINT8 r8=pridata[dest]; if(!(1<<(r8&0x1f)&pmask)){ if(afterdrawmask){ r8&=0x7f; r8|=0x1f; dstdata[dest]=(n); pridata[dest]=r8; } else if(!(r8&0x80)){ dstdata[dest]=SHADOW32(n); pridata[dest]|=0x80; } } } +#define SETPIXELCOLOR(dest,n) { UINT8 r8=pridata[dest]; if(!(1<<(r8&0x1f)&pmask)){ if(afterdrawmask){ r8&=0x7f; r8|=0x1f; dstdata[dest]=(n); pridata[dest]=r8; } else if(!(r8&0x80)){ dstdata[dest]=SHADOW32(palette_shadow_table,n); pridata[dest]|=0x80; } } } #define DECLARE_SWAP_RAW_PRI(function,args,body) void function##_raw_pri32 args body #include "drawgfx.c" #undef DECLARE_SWAP_RAW_PRI @@ -826,7 +826,7 @@ INLINE UINT32 SHADOW32(UINT32 c) { #define COLOR_ARG const pen_t *paldata,UINT8 *pridata,UINT32 pmask #define LOOKUP(n) (paldata[n]) -#define SETPIXELCOLOR(dest,n) { UINT8 r8=pridata[dest]; if(!(1<<(r8&0x1f)&pmask)){ if(afterdrawmask){ r8&=0x7f; r8|=0x1f; dstdata[dest]=(n); pridata[dest]=r8; } else if(!(r8&0x80)){ dstdata[dest]=SHADOW32(n); pridata[dest]|=0x80; } } } +#define SETPIXELCOLOR(dest,n) { UINT8 r8=pridata[dest]; if(!(1<<(r8&0x1f)&pmask)){ if(afterdrawmask){ r8&=0x7f; r8|=0x1f; dstdata[dest]=(n); pridata[dest]=r8; } else if(!(r8&0x80)){ dstdata[dest]=SHADOW32(palette_shadow_table,n); pridata[dest]|=0x80; } } } #define DECLARE_SWAP_RAW_PRI(function,args,body) void function##_pri32 args body #include "drawgfx.c" #undef DECLARE_SWAP_RAW_PRI @@ -1928,6 +1928,7 @@ INLINE void common_drawgfxzoom( mame_bitmap *dest_bmp,const gfx_element *gfx, /* case 4: TRANSPARENCY_PEN_TABLE */ if (transparency == TRANSPARENCY_PEN_TABLE) { + pen_t *palette_shadow_table = Machine->shadow_table; if (pri_buffer) { for( y=sy; yshadow_table; if (pri_buffer) { for( y=sy; yshadow_table; if (pri_buffer) { for( y=sy; yshadow_table; if (pri_buffer) { for( y=sy; yshadow_table; UINT8 *source, *pri; UINT32 *dest; int c, x, x_index; @@ -3225,7 +3230,7 @@ INLINE void common_drawgfxzoom( mame_bitmap *dest_bmp,const gfx_element *gfx, } else if (!(ah & 0x80)) { - ebx = SHADOW32(dest[x]); + ebx = SHADOW32(palette_shadow_table,dest[x]); pri[x] |= 0x80; dest[x] = ebx; } @@ -3251,7 +3256,7 @@ INLINE void common_drawgfxzoom( mame_bitmap *dest_bmp,const gfx_element *gfx, if (gfx_drawmode_table[c] == DRAWMODE_SOURCE) dest[x] = pal[c]; else - dest[x] = SHADOW32(dest[x]); + dest[x] = SHADOW32(palette_shadow_table,dest[x]); } } } @@ -3260,6 +3265,7 @@ INLINE void common_drawgfxzoom( mame_bitmap *dest_bmp,const gfx_element *gfx, /* case 4b: TRANSPARENCY_PEN_TABLE_RAW */ if (transparency == TRANSPARENCY_PEN_TABLE_RAW) { + pen_t *palette_shadow_table = Machine->shadow_table; UINT8 *source, *pri; UINT32 *dest; int c, x, x_index; @@ -3298,7 +3304,7 @@ INLINE void common_drawgfxzoom( mame_bitmap *dest_bmp,const gfx_element *gfx, } else if (!(ah & 0x80)) { - ebx = SHADOW32(dest[x]); + ebx = SHADOW32(palette_shadow_table,dest[x]); pri[x] |= 0x80; dest[x] = ebx; } @@ -3324,7 +3330,7 @@ INLINE void common_drawgfxzoom( mame_bitmap *dest_bmp,const gfx_element *gfx, if (gfx_drawmode_table[c] == DRAWMODE_SOURCE) dest[x] = color + c; else - dest[x] = SHADOW32(dest[x]); + dest[x] = SHADOW32(palette_shadow_table,dest[x]); } } } @@ -3553,7 +3559,7 @@ void draw_crosshair(mame_bitmap *bitmap,int x,int y,const rectangle *clip,int pl if (!crosshair_enable) return; - white = get_white_pen(); + white = get_white_pen(Machine); for (i = 1;i < 6;i++) { @@ -3655,8 +3661,11 @@ void draw_crosshair(mame_bitmap *bitmap,int x,int y,const rectangle *clip,int pl DECLARE_SWAP_RAW_PRI(blockmove_8toN_opaque,(COMMON_ARGS, COLOR_ARG), { + pen_t *palette_shadow_table = Machine->shadow_table; ADJUST_8 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; @@ -3726,8 +3735,11 @@ DECLARE_SWAP_RAW_PRI(blockmove_8toN_opaque,(COMMON_ARGS, DECLARE_SWAP_RAW_PRI(blockmove_4toN_opaque,(COMMON_ARGS, COLOR_ARG), { + pen_t *palette_shadow_table = Machine->shadow_table; ADJUST_4 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; @@ -3819,8 +3831,11 @@ DECLARE_SWAP_RAW_PRI(blockmove_4toN_opaque,(COMMON_ARGS, DECLARE_SWAP_RAW_PRI(blockmove_8toN_transpen,(COMMON_ARGS, COLOR_ARG,int transpen), { + pen_t *palette_shadow_table = Machine->shadow_table; ADJUST_8 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; @@ -3928,8 +3943,11 @@ DECLARE_SWAP_RAW_PRI(blockmove_8toN_transpen,(COMMON_ARGS, DECLARE_SWAP_RAW_PRI(blockmove_4toN_transpen,(COMMON_ARGS, COLOR_ARG,int transpen), { + pen_t *palette_shadow_table = Machine->shadow_table; ADJUST_4 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; @@ -4001,8 +4019,11 @@ DECLARE_SWAP_RAW_PRI(blockmove_4toN_transpen,(COMMON_ARGS, DECLARE_SWAP_RAW_PRI(blockmove_8toN_transblend,(COMMON_ARGS, COLOR_ARG,int transpen), { + pen_t *palette_shadow_table = Machine->shadow_table; ADJUST_8 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; @@ -4113,8 +4134,11 @@ DECLARE_SWAP_RAW_PRI(blockmove_8toN_transblend,(COMMON_ARGS, DECLARE_SWAP_RAW_PRI(blockmove_8toN_transmask,(COMMON_ARGS, COLOR_ARG,int transmask), { + pen_t *palette_shadow_table = Machine->shadow_table; ADJUST_8 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; @@ -4216,8 +4240,11 @@ DECLARE_SWAP_RAW_PRI(blockmove_8toN_transmask,(COMMON_ARGS, DECLARE_SWAP_RAW_PRI(blockmove_8toN_transcolor,(COMMON_ARGS, COLOR_ARG,const UINT16 *colortable,int transcolor), { + pen_t *palette_shadow_table = Machine->shadow_table; ADJUST_8 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; @@ -4261,8 +4288,11 @@ DECLARE_SWAP_RAW_PRI(blockmove_8toN_transcolor,(COMMON_ARGS, DECLARE_SWAP_RAW_PRI(blockmove_4toN_transcolor,(COMMON_ARGS, COLOR_ARG,const UINT16 *colortable,int transcolor), { + pen_t *palette_shadow_table = Machine->shadow_table; ADJUST_4 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; @@ -4335,8 +4365,11 @@ DECLARE_SWAP_RAW_PRI(blockmove_4toN_transcolor,(COMMON_ARGS, DECLARE_SWAP_RAW_PRI(blockmove_8toN_pen_table,(COMMON_ARGS, COLOR_ARG,int transcolor), { + pen_t *palette_shadow_table = Machine->shadow_table; ADJUST_8 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; @@ -4410,10 +4443,13 @@ DECLARE_SWAP_RAW_PRI(blockmove_8toN_pen_table,(COMMON_ARGS, DECLARE_SWAP_RAW_PRI(blockmove_8toN_pen_table,(COMMON_ARGS, COLOR_ARG,int transcolor), { + pen_t *palette_shadow_table = Machine->shadow_table; int eax = (pdrawgfx_shadow_lowpri) ? 0 : 0x80; ADJUST_8 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; @@ -4450,6 +4486,7 @@ DECLARE_SWAP_RAW_PRI(blockmove_8toN_pen_table,(COMMON_ARGS, } else { + pen_t *palette_shadow_table = Machine->shadow_table; DATA_TYPE *end; while (dstheight) @@ -4489,8 +4526,11 @@ DECLARE_SWAP_RAW_PRI(blockmove_8toN_pen_table,(COMMON_ARGS, DECLARE_SWAP_RAW_PRI(blockmove_8toN_alphaone,(COMMON_ARGS, COLOR_ARG,int transpen, int alphapen), { + pen_t *palette_shadow_table = Machine->shadow_table; ADJUST_8 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; @@ -4672,8 +4712,11 @@ DECLARE_SWAP_RAW_PRI(blockmove_8toN_alphaone,(COMMON_ARGS, DECLARE_SWAP_RAW_PRI(blockmove_8toN_alpha,(COMMON_ARGS, COLOR_ARG,int transpen), { + pen_t *palette_shadow_table = Machine->shadow_table; ADJUST_8 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; @@ -4782,8 +4825,11 @@ DECLARE_SWAP_RAW_PRI(blockmove_8toN_alpha,(COMMON_ARGS, DECLARE_SWAP_RAW_PRI(blockmove_8toN_alpharange,(COMMON_ARGS, COLOR_ARG,int transpen), { + pen_t *palette_shadow_table = Machine->shadow_table; ADJUST_8 + (void)palette_shadow_table; + if (flipx) { DATA_TYPE *end; diff --git a/src/drawgfx.h b/src/drawgfx.h index 998b1cb3c..12fe204bf 100644 --- a/src/drawgfx.h +++ b/src/drawgfx.h @@ -155,7 +155,7 @@ extern int pdrawgfx_shadow_lowpri; #define read_pixel(bm,x,y) (*(bm)->read)(bm,x,y) #define plot_box(bm,x,y,w,h,p) (*(bm)->plot_box)(bm,x,y,w,h,p) -void drawgfx_init(void); +void drawgfx_init(running_machine *machine); void decodechar(gfx_element *gfx,int num,const unsigned char *src,const gfx_layout *gl); gfx_element *allocgfx(const gfx_layout *gl); diff --git a/src/driver.c b/src/driver.c index f91f485a5..f00b51171 100644 --- a/src/driver.c +++ b/src/driver.c @@ -322,7 +322,7 @@ int driver_get_index(const char *name) /* scan the LRU list first */ for (lurnum = 0; lurnum < DRIVER_LRU_SIZE; lurnum++) - if (strcmp(drivers[driver_lru[lurnum]]->name, name) == 0) + if (mame_stricmp(drivers[driver_lru[lurnum]]->name, name) == 0) { /* if not first, swap with the head */ if (lurnum != 0) @@ -336,7 +336,7 @@ int driver_get_index(const char *name) /* scan for a match in the drivers -- slow! */ for (drvnum = 0; drivers[drvnum] != NULL; drvnum++) - if (strcmp(drivers[drvnum]->name, name) == 0) + if (mame_stricmp(drivers[drvnum]->name, name) == 0) { memmove((void *)&driver_lru[1], (void *)&driver_lru[0], sizeof(driver_lru[0]) * (DRIVER_LRU_SIZE - 1)); driver_lru[0] = drvnum; @@ -436,7 +436,7 @@ static int penalty_compare(const char *source, const char *target) int last = 1; /* scan the strings */ - for (; *source && *target; target++) + for ( ; *source && *target; target++) { /* do a case insensitive match */ int match = (tolower(*source) == tolower(*target)); diff --git a/src/driver.h b/src/driver.h index e55bf5f7a..7e96f0033 100644 --- a/src/driver.h +++ b/src/driver.h @@ -17,24 +17,24 @@ MACROS (must be *before* the includes below) ***************************************************************************/ -#define DRIVER_INIT(name) void init_##name(void) +#define DRIVER_INIT(name) void init_##name(running_machine *machine) -#define NVRAM_HANDLER(name) void nvram_handler_##name(mame_file *file, int read_or_write) +#define NVRAM_HANDLER(name) void nvram_handler_##name(running_machine *machine, mame_file *file, int read_or_write) -#define MEMCARD_HANDLER(name) void memcard_handler_##name(mame_file *file, int action) +#define MEMCARD_HANDLER(name) void memcard_handler_##name(running_machine *machine, mame_file *file, int action) -#define MACHINE_START(name) int machine_start_##name(void) -#define MACHINE_RESET(name) void machine_reset_##name(void) +#define MACHINE_START(name) int machine_start_##name(running_machine *machine) +#define MACHINE_RESET(name) void machine_reset_##name(running_machine *machine) -#define SOUND_START(name) int sound_start_##name(void) -#define SOUND_RESET(name) void sound_reset_##name(void) +#define SOUND_START(name) int sound_start_##name(running_machine *machine) +#define SOUND_RESET(name) void sound_reset_##name(running_machine *machine) -#define VIDEO_START(name) int video_start_##name(void) -#define VIDEO_RESET(name) void video_reset_##name(void) +#define VIDEO_START(name) int video_start_##name(running_machine *machine) +#define VIDEO_RESET(name) void video_reset_##name(running_machine *machine) -#define PALETTE_INIT(name) void palette_init_##name(UINT16 *colortable, const UINT8 *color_prom) -#define VIDEO_EOF(name) void video_eof_##name(void) -#define VIDEO_UPDATE(name) UINT32 video_update_##name(int screen, mame_bitmap *bitmap, const rectangle *cliprect) +#define PALETTE_INIT(name) void palette_init_##name(running_machine *machine, UINT16 *colortable, const UINT8 *color_prom) +#define VIDEO_EOF(name) void video_eof_##name(running_machine *machine) +#define VIDEO_UPDATE(name) UINT32 video_update_##name(running_machine *machine, int screen, mame_bitmap *bitmap, const rectangle *cliprect) /* NULL versions */ #define init_NULL NULL @@ -147,6 +147,9 @@ /* Mish 181099: See comments in vidhrdw/generic.c for details */ #define VIDEO_BUFFERS_SPRITERAM 0x0040 +/* force VIDEO_UPDATE to be called even for skipped frames */ +#define VIDEO_ALWAYS_UPDATE 0x0080 + /* ----- flags for game drivers ----- */ @@ -182,16 +185,18 @@ /* In mamecore.h: typedef struct _machine_config machine_config; */ struct _machine_config { + UINT32 driver_data_size; /* amount of memory needed for driver_data */ + cpu_config cpu[MAX_CPU]; /* array of CPUs in the system */ UINT32 cpu_slices_per_frame; /* number of times to interleave execution per frame */ INT32 watchdog_vblank_count; /* number of VBLANKs until the watchdog kills us */ double watchdog_time; /* length of time until the watchdog kills us */ - int (*machine_start)(void); /* one-time machine start callback */ - void (*machine_reset)(void); /* machine reset callback */ + int (*machine_start)(running_machine *machine); /* one-time machine start callback */ + void (*machine_reset)(running_machine *machine); /* machine reset callback */ - void (*nvram_handler)(mame_file *file, int read_or_write); /* NVRAM save/load callback */ - void (*memcard_handler)(mame_file *file, int action); /* memory card save/load callback */ + void (*nvram_handler)(running_machine *machine, mame_file *file, int read_or_write); /* NVRAM save/load callback */ + void (*memcard_handler)(running_machine *machine, mame_file *file, int action); /* memory card save/load callback */ UINT32 video_attributes; /* flags describing the video system */ const gfx_decode * gfxdecodeinfo; /* pointer to graphics decoding information */ @@ -200,17 +205,17 @@ struct _machine_config const char * default_layout; /* default layout for this machine */ screen_config screen[MAX_SCREENS]; /* total number of screens */ - void (*init_palette)(UINT16 *colortable, const UINT8 *color_prom); /* one-time palette init callback */ - int (*video_start)(void); /* one-time video start callback */ - void (*video_reset)(void); /* video reset callback */ - void (*video_eof)(void); /* end-of-frame video callback */ - UINT32 (*video_update)(int screen, mame_bitmap *bitmap, const rectangle *cliprect); /* video update callback */ + void (*init_palette)(running_machine *machine, UINT16 *colortable, const UINT8 *color_prom); /* one-time palette init callback */ + int (*video_start)(running_machine *machine); /* one-time video start callback */ + void (*video_reset)(running_machine *machine); /* video reset callback */ + void (*video_eof)(running_machine *machine); /* end-of-frame video callback */ + UINT32 (*video_update)(running_machine *machine, int screen, mame_bitmap *bitmap, const rectangle *cliprect); /* video update callback */ sound_config sound[MAX_SOUND]; /* array of sound chips in the system */ speaker_config speaker[MAX_SPEAKER]; /* array of speakers in the system */ - int (*sound_start)(void); /* one-time sound start callback */ - void (*sound_reset)(void); /* sound reset callback */ + int (*sound_start)(running_machine *machine); /* one-time sound start callback */ + void (*sound_reset)(running_machine *machine); /* sound reset callback */ }; @@ -226,7 +231,7 @@ struct _game_driver const char * manufacturer; /* manufacturer of the game */ void (*drv)(machine_config *); /* machine driver constructor */ void (*construct_ipt)(input_port_init_params *param); /* input port constructor */ - void (*driver_init)(void); /* DRIVER_INIT callback */ + void (*driver_init)(running_machine *machine); /* DRIVER_INIT callback */ const rom_entry * rom; /* pointer to list of ROMs for the game */ #ifdef MESS @@ -338,6 +343,9 @@ struct _game_driver /* core parameters */ +#define MDRV_DRIVER_DATA(_struct) \ + machine->driver_data_size = sizeof(_struct); \ + #define MDRV_INTERLEAVE(interleave) \ machine->cpu_slices_per_frame = (interleave); \ diff --git a/src/drivers/1943.c b/src/drivers/1943.c index c849f763a..accf30f02 100644 --- a/src/drivers/1943.c +++ b/src/drivers/1943.c @@ -121,7 +121,7 @@ INPUT_PORTS_START( 1943 ) PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START_TAG("DSW0") - PORT_DIPNAME( 0x0f, 0x08, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x0f, 0x08, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:5,6,7,8") PORT_DIPSETTING( 0x0f, "1 (Easy)" ) PORT_DIPSETTING( 0x0e, "2" ) PORT_DIPSETTING( 0x0d, "3" ) @@ -138,19 +138,19 @@ INPUT_PORTS_START( 1943 ) PORT_DIPSETTING( 0x02, "14" ) PORT_DIPSETTING( 0x01, "15" ) PORT_DIPSETTING( 0x00, "16 (Difficult)" ) - PORT_DIPNAME( 0x10, 0x10, "2 Player Game" ) + PORT_DIPNAME( 0x10, 0x10, "2 Player Game" ) PORT_DIPLOCATION("SW1:4") PORT_DIPSETTING( 0x00, "1 Credit/2 Players" ) PORT_DIPSETTING( 0x10, "2 Credits/2 Players" ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:3") PORT_DIPSETTING( 0x20, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x40, 0x40, "Freeze" ) + PORT_DIPNAME( 0x40, 0x40, "Freeze" ) PORT_DIPLOCATION("SW1:2") PORT_DIPSETTING( 0x40, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_SERVICE( 0x80, IP_ACTIVE_LOW ) + PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW1:1" ) PORT_START_TAG("DSW1") - PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) + PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW2:6,7,8") PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C )) PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) ) @@ -159,7 +159,7 @@ INPUT_PORTS_START( 1943 ) PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0x03, DEF_STR( 1C_5C ) ) - PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) ) + PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW2:3,4,5") PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C )) PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) ) @@ -168,10 +168,10 @@ INPUT_PORTS_START( 1943 ) PORT_DIPSETTING( 0x28, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0x18, DEF_STR( 1C_5C ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:2") PORT_DIPSETTING( 0x00, DEF_STR( No ) ) PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:1") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x80, DEF_STR( On ) ) INPUT_PORTS_END diff --git a/src/drivers/1945kiii.c b/src/drivers/1945kiii.c index 8df864f71..449670e5f 100644 --- a/src/drivers/1945kiii.c +++ b/src/drivers/1945kiii.c @@ -194,7 +194,7 @@ INPUT_PORTS_START( k3 ) PORT_START_TAG("DSW1") - PORT_DIPNAME( 0x007, 0x0007, DEF_STR( Coin_A ) ) + PORT_DIPNAME( 0x007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3") PORT_DIPSETTING( 0x0002, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x0001, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x0005, DEF_STR( 3C_1C ) ) @@ -203,39 +203,39 @@ INPUT_PORTS_START( k3 ) PORT_DIPSETTING( 0x0004, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x0000, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x0003, DEF_STR( Free_Play ) ) - PORT_DIPNAME( 0x0018, 0x0008, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x0018, 0x0008, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:4,5") PORT_DIPSETTING( 0x0000, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x0008, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x0010, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x0018, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x0060, 0x0060, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x0060, 0x0060, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:6,7") PORT_DIPSETTING( 0x0040, "2" ) PORT_DIPSETTING( 0x0060, "3" ) PORT_DIPSETTING( 0x0020, "4" ) PORT_DIPSETTING( 0x0000, "5" ) - PORT_SERVICE( 0x0080, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Demo_Sounds ) ) + PORT_SERVICE_DIPLOC( 0x0080, IP_ACTIVE_LOW, "SW1:8" ) + PORT_DIPNAME( 0x0100, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:1") PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Allow_Continue ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:2") PORT_DIPSETTING( 0x0000, DEF_STR( No ) ) PORT_DIPSETTING( 0x0200, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:3") PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:5") PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:6") PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7") PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:8") PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) INPUT_PORTS_END diff --git a/src/drivers/40love.c b/src/drivers/40love.c index ef177c443..2eed112d4 100644 --- a/src/drivers/40love.c +++ b/src/drivers/40love.c @@ -895,32 +895,32 @@ ADDRESS_MAP_END INPUT_PORTS_START( 40love ) PORT_START_TAG("DSW1") - PORT_DIPNAME( 0x01, 0x00, "DSW1 Unknown 0" ) + PORT_DIPNAME( 0x01, 0x00, "DSW1 Unknown 0" ) PORT_DIPLOCATION("SW1:1") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x00, "DSW1 Unknown 1" ) + PORT_DIPNAME( 0x02, 0x00, "DSW1 Unknown 1" ) PORT_DIPLOCATION("SW1:2") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SW1:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x18, 0x10, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x18, 0x10, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:4,5") PORT_DIPSETTING( 0x00, "1" ) PORT_DIPSETTING( 0x08, "2" ) PORT_DIPSETTING( 0x10, "3" ) PORT_DIPSETTING( 0x18, "4" ) - PORT_DIPNAME( 0x20, 0x00, "DSW1 Unknown 5" ) + PORT_DIPNAME( 0x20, 0x00, "DSW1 Unknown 5" ) PORT_DIPLOCATION("SW1:6") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x00, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:8") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) PORT_START_TAG("DSW2") /* All OK */ - PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) ) + PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW2:1,2,3,4") PORT_DIPSETTING( 0x0f, DEF_STR( 9C_1C ) ) PORT_DIPSETTING( 0x0e, DEF_STR( 8C_1C ) ) PORT_DIPSETTING( 0x0d, DEF_STR( 7C_1C ) ) @@ -937,7 +937,7 @@ INPUT_PORTS_START( 40love ) PORT_DIPSETTING( 0x05, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x06, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x07, DEF_STR( 1C_8C ) ) - PORT_DIPNAME( 0xf0, 0x00, DEF_STR( Coin_B ) ) + PORT_DIPNAME( 0xf0, 0x00, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW2:5,6,7,8") PORT_DIPSETTING( 0xf0, DEF_STR( 9C_1C ) ) PORT_DIPSETTING( 0xe0, DEF_STR( 8C_1C ) ) PORT_DIPSETTING( 0xd0, DEF_STR( 7C_1C ) ) @@ -956,26 +956,26 @@ INPUT_PORTS_START( 40love ) PORT_DIPSETTING( 0x70, DEF_STR( 1C_8C ) ) PORT_START_TAG("DSW3") - PORT_DIPNAME( 0x03, 0x00, "DSW3 Unknown 0" ) + PORT_DIPNAME( 0x03, 0x00, "DSW3 Unknown 0" ) PORT_DIPLOCATION("SW3:1,2") PORT_DIPSETTING( 0x00, "00" ) PORT_DIPSETTING( 0x01, "01" ) PORT_DIPSETTING( 0x02, "02" ) PORT_DIPSETTING( 0x03, "03" ) - PORT_DIPNAME( 0x0c, 0x0c, "DSW3 Unknown 1" ) + PORT_DIPNAME( 0x0c, 0x0c, "DSW3 Unknown 1" ) PORT_DIPLOCATION("SW3:3,4") PORT_DIPSETTING( 0x00, "00" ) PORT_DIPSETTING( 0x04, "04" ) PORT_DIPSETTING( 0x08, "08" ) PORT_DIPSETTING( 0x0c, "0c" ) - PORT_DIPNAME( 0x10, 0x10, "Display Credit Settings" ) + PORT_DIPNAME( 0x10, 0x10, "Display Credit Settings" ) PORT_DIPLOCATION("SW3:5") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x10, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, "Year Display" ) + PORT_DIPNAME( 0x20, 0x20, "Year Display" ) PORT_DIPLOCATION("SW3:6") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, "Score points to: (Cheat)") + PORT_DIPNAME( 0x40, 0x40, "Score points to: (Cheat)") PORT_DIPLOCATION("SW3:7") PORT_DIPSETTING( 0x40, "Winner" ) PORT_DIPSETTING( 0x00, "Human" ) - PORT_DIPNAME( 0x80, 0x00, "Coin Door Type" ) + PORT_DIPNAME( 0x80, 0x00, "Coin Door Type" ) PORT_DIPLOCATION("SW3:8") PORT_DIPSETTING( 0x00, "Single Slot" ) PORT_DIPSETTING( 0x80, "Double Slot" ) diff --git a/src/drivers/4enraya.c b/src/drivers/4enraya.c index 5621ca9f2..1bed09b0c 100644 --- a/src/drivers/4enraya.c +++ b/src/drivers/4enraya.c @@ -105,24 +105,24 @@ ADDRESS_MAP_END INPUT_PORTS_START( 4enraya ) PORT_START_TAG("DSW") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:1") PORT_DIPSETTING( 0x01, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) - PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:2") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, "Pieces" ) + PORT_DIPNAME( 0x04, 0x04, "Pieces" ) PORT_DIPLOCATION("SW1:3") PORT_DIPSETTING( 0x04, "30" ) PORT_DIPSETTING( 0x00, "16" ) - PORT_DIPNAME( 0x08, 0x08, "Speed" ) + PORT_DIPNAME( 0x08, 0x08, "Speed" ) PORT_DIPLOCATION("SW1:4") PORT_DIPSETTING( 0x08, "Slow" ) PORT_DIPSETTING( 0x00, "Fast" ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_B ) ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:5,6") PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) PORT_DIPSETTING( 0x10, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) ) - PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_A ) ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:7,8") PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) diff --git a/src/drivers/8080bw.c b/src/drivers/8080bw.c index f11d12f3c..03eea7e7f 100644 --- a/src/drivers/8080bw.c +++ b/src/drivers/8080bw.c @@ -44,6 +44,13 @@ /* c. Score not cleared when starting a new game */ /* d. Game begins on the wrong level */ /* */ +/* - Space War (Sanritsu) */ +/* */ +/* 1. Game misbehaves frequently, usually on level 2 */ +/* 2. I seem to recall that the flashing ufo had its own sample */ +/* sound, a sort of rattling noise. Unable to find evidence */ +/* of this in the hardware. */ +/* */ /* */ /* Change Log: */ /* ---------- */ @@ -67,6 +74,10 @@ /* schasrcv - allow bottom line to show on screen */ /* */ /* */ +/* 10 Sep 2006 - invadpt2 - add name reset button */ +/* spcewars - add bitstream circuit, fix dipswitches */ +/* */ +/* */ /****************************************************************************/ #include "driver.h" @@ -280,7 +291,8 @@ INPUT_PORTS_START( invadpt2 ) 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_LOW, IPT_UNKNOWN ) /* otherwise high score entry ends right away */ + // Name Reset - if name of high scorer was rude, owner can press this button + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Name Reset") PORT_CODE(KEYCODE_F1) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_START_TAG("IN1") @@ -330,6 +342,80 @@ static MACHINE_DRIVER_START( invadpt2 ) MDRV_PALETTE_INIT(invadpt2) MACHINE_DRIVER_END +/*******************************************************/ +/* */ +/* Space Wars (Sanritsu) */ +/* */ +/*******************************************************/ + +INPUT_PORTS_START( spcewars ) + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + 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_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("DSW0") + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x01, "4" ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_TILT ) + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x00, "1500" ) + PORT_DIPSETTING( 0x08, "2000" ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(2) + PORT_DIPNAME( 0x80, 0x00, "Coin Info" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START_TAG("FAKE") /* Dummy port for cocktail mode */ + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Cocktail ) ) +INPUT_PORTS_END + +static MACHINE_DRIVER_START( spcewars ) + + /* basic machine hardware */ + MDRV_IMPORT_FROM(8080bw) + MDRV_CPU_MODIFY("main") + MDRV_MACHINE_RESET(spcewars) + + /* video hardware */ + MDRV_VISIBLE_AREA(1*8, 31*8-1, 4*8, 32*8-1) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(SAMPLES, 0) + MDRV_SOUND_CONFIG(invaders_samples_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + + MDRV_SOUND_ADD(SN76477, 0) + MDRV_SOUND_CONFIG(invaders_sn76477_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + + /* extra audio channel */ + MDRV_SOUND_ADD(SPEAKER, 0) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_DRIVER_END /*******************************************************/ /* */ @@ -2248,9 +2334,9 @@ INPUT_PORTS_END static PALETTE_INIT( phantom2 ) { - palette_set_color(0,0x00,0x00,0x00); /* black */ - palette_set_color(1,0xff,0xff,0xff); /* white */ - palette_set_color(2,0xc0,0xc0,0xc0); /* grey */ + palette_set_color(machine,0,0x00,0x00,0x00); /* black */ + palette_set_color(machine,1,0xff,0xff,0xff); /* white */ + palette_set_color(machine,2,0xc0,0xc0,0xc0); /* grey */ } @@ -4386,7 +4472,7 @@ ROM_END GAMEL(19??, tst_invd, invaders, invaders, invaders, 8080bw, ROT0, "Test ROM", "Space Invaders Test ROM", 0, layout_invaders ) GAMEL(19??, alieninv, invaders, invaders, earthinv, 8080bw, ROT270, "bootleg", "Alien Invasion Part II", 0, layout_invaders ) GAMEL(1978, spceking, invaders, invaders, spceking, 8080bw, ROT270, "Leijac (Konami)","Space King", 0, layout_invaders ) - GAMEL(1978, spcewars, invaders, invaders, invadpt2, 8080bw, ROT270, "Sanritsu", "Space War (Sanritsu)", 0, layout_invaders ) + GAMEL(1978, spcewars, invaders, spcewars, spcewars, 8080bw, ROT270, "Sanritsu", "Space War (Sanritsu)", 0, layout_invaders ) GAMEL(1978, spacewr3, invaders, invaders, spacewr3, 8080bw, ROT270, "bootleg", "Space War Part 3", 0, layout_invaders ) GAMEL(1978, invaderl, invaders, invaders, invaders, 8080bw, ROT270, "bootleg", "Space Invaders (Logitec)", 0, layout_invaders ) GAMEL(1978, invader4, invaders, invaders, invaders, 8080bw, ROT270, "bootleg", "Space Invaders Part Four", 0, layout_invaders ) diff --git a/src/drivers/88games.c b/src/drivers/88games.c index fa68691e3..859035fb4 100644 --- a/src/drivers/88games.c +++ b/src/drivers/88games.c @@ -181,14 +181,14 @@ INPUT_PORTS_START( 88games ) // PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Fake button to press buttons 1 and 3 impossibly fast. Handle via cheat?_r */ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Run Like Hell (Cheat)") PORT_PLAYER(1) - 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, "World Records" ) + PORT_DIPNAME( 0x20, 0x20, "World Records" ) PORT_DIPLOCATION("SW3:2") PORT_DIPSETTING( 0x20, "Don't Erase" ) PORT_DIPSETTING( 0x00, "Erase on Reset" ) - PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_SERVICE_DIPLOC( 0x40, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:4") // Listed in the manual as "continue" PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -213,7 +213,7 @@ INPUT_PORTS_START( 88games ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START4 ) PORT_START_TAG("DSW1") - PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) + 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 ) ) @@ -230,7 +230,7 @@ INPUT_PORTS_START( 88games ) 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_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 ) ) @@ -249,27 +249,26 @@ INPUT_PORTS_START( 88games ) // PORT_DIPSETTING( 0x00, "Disabled" ) PORT_START_TAG("DSW2") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2: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, 0x00, DEF_STR( Cabinet ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x06, 0x02, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW2:2,3") + PORT_DIPSETTING( 0x06, DEF_STR( Cocktail ) ) + PORT_DIPSETTING( 0x04, "Cocktail (A)" ) + PORT_DIPSETTING( 0x02, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x00, "Upright (D)" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) 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, 0x60, 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 ) ) INPUT_PORTS_END diff --git a/src/drivers/ace.c b/src/drivers/ace.c index b7964d7d4..1e1011e35 100644 --- a/src/drivers/ace.c +++ b/src/drivers/ace.c @@ -112,8 +112,8 @@ VIDEO_UPDATE( ace ) static PALETTE_INIT( ace ) { - palette_set_color(0,0x10,0x20,0xd0); /* light bluish */ - palette_set_color(1,0xff,0xff,0xff); /* white */ + palette_set_color(machine,0,0x10,0x20,0xd0); /* light bluish */ + palette_set_color(machine,1,0xff,0xff,0xff); /* white */ } diff --git a/src/drivers/actfancr.c b/src/drivers/actfancr.c index ed06a4fac..de8318d01 100644 --- a/src/drivers/actfancr.c +++ b/src/drivers/actfancr.c @@ -194,50 +194,50 @@ INPUT_PORTS_START( actfancr ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) PORT_START_TAG("DSW1") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2") 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_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) + 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_1C ) ) PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) /* Listed as "Unused" in the manual */ + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:5") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:6") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:8") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) PORT_START_TAG("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, "100 (Cheat)") - PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:3,4") PORT_DIPSETTING( 0x04, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x0c, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:5") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:6") PORT_DIPSETTING( 0x20, "800000" ) PORT_DIPSETTING( 0x00, DEF_STR( None ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) /* Listed as "Unused" in the manual */ + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:7") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) /* Listed as "Unused" in the manual */ + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:1") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -274,50 +274,50 @@ INPUT_PORTS_START( triothep ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) PORT_START_TAG("DSW1") /* Dip switch bank 1 */ - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2") 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_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) + 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_1C ) ) PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) /* Listed as "Unused" in the manual */ + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:5") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:6") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7") PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:8") PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) PORT_START_TAG("DSW2") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x00, "8" ) PORT_DIPSETTING( 0x01, "10" ) PORT_DIPSETTING( 0x03, "12" ) PORT_DIPSETTING( 0x02, "14" ) - PORT_DIPNAME( 0x0c, 0x0c, "Difficulty (Time)" ) + PORT_DIPNAME( 0x0c, 0x0c, "Difficulty (Time)" ) PORT_DIPLOCATION("SW2:3,4") PORT_DIPSETTING( 0x08, "Easy (130)" ) PORT_DIPSETTING( 0x0c, "Normal (100)" ) PORT_DIPSETTING( 0x04, "Hard (70)" ) PORT_DIPSETTING( 0x00, "Hardest (60)" ) - PORT_DIPNAME( 0x10, 0x10, "Bonus Lives" ) + PORT_DIPNAME( 0x10, 0x10, "Bonus Lives" ) PORT_DIPLOCATION("SW2:5") PORT_DIPSETTING( 0x00, "2" ) PORT_DIPSETTING( 0x10, "3" ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) /* Listed as "Unused" in the manual */ + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:6") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) /* Listed as "Unused" in the manual */ + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:7") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) /* Listed as "Unused" in the manual */ + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:8") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END diff --git a/src/drivers/aeroboto.c b/src/drivers/aeroboto.c index 41ad42835..00d641ae2 100644 --- a/src/drivers/aeroboto.c +++ b/src/drivers/aeroboto.c @@ -149,23 +149,23 @@ INPUT_PORTS_START( formatz ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START_TAG("DSW1") - PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2") PORT_DIPSETTING( 0x00, "3" ) PORT_DIPSETTING( 0x01, "4" ) PORT_DIPSETTING( 0x02, "5" ) PORT_DIPSETTING( 0x03, "Infinite (Cheat)") - PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) + PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW1:3,4") PORT_DIPSETTING( 0x0c, "30000" ) PORT_DIPSETTING( 0x08, "40000" ) PORT_DIPSETTING( 0x04, "70000" ) PORT_DIPSETTING( 0x00, "100000" ) - PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:5") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x10, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:6") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Cabinet ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:7") PORT_DIPSETTING( 0x40, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) /* The last dip switch is directly connected to the video hardware and @@ -174,7 +174,7 @@ INPUT_PORTS_START( formatz ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) PORT_START_TAG("DSW2") - PORT_DIPNAME( 0x07, 0x00, DEF_STR( Coinage ) ) + PORT_DIPNAME( 0x07, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW2:1,2,3") PORT_DIPSETTING( 0x07, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x05, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x03, DEF_STR( 3C_1C ) ) @@ -183,18 +183,18 @@ INPUT_PORTS_START( formatz ) PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x04, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x06, DEF_STR( 1C_4C ) ) - PORT_DIPNAME( 0x18, 0x08, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x18, 0x08, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:4,5") PORT_DIPSETTING( 0x00, "0(Easy)" ) PORT_DIPSETTING( 0x08, "1(Medium)" ) PORT_DIPSETTING( 0x10, "2(Hard)" ) PORT_DIPSETTING( 0x18, "3(Hardest)" ) - PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:6") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:7") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:8") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x80, DEF_STR( On ) ) INPUT_PORTS_END diff --git a/src/drivers/airbustr.c b/src/drivers/airbustr.c index f10f3b749..ed407e730 100644 --- a/src/drivers/airbustr.c +++ b/src/drivers/airbustr.c @@ -340,7 +340,6 @@ static WRITE8_HANDLER( soundcommand2_w ) static WRITE8_HANDLER( airbustr_paletteram_w ) { - int r, g, b; int val; /* ! byte 1 ! ! byte 0 ! */ @@ -350,11 +349,7 @@ static WRITE8_HANDLER( airbustr_paletteram_w ) paletteram[offset] = data; val = (paletteram[offset | 1] << 8) | paletteram[offset & ~1]; - g = (val >> 10) & 0x1f; - r = (val >> 5) & 0x1f; - b = (val >> 0) & 0x1f; - - palette_set_color(offset/2, (r * 0xff) / 0x1f, (g * 0xff) / 0x1f, (b * 0xff) / 0x1f); + palette_set_color(Machine, offset/2, pal5bit(val >> 5), pal5bit(val >> 10), pal5bit(val >> 0)); } static WRITE8_HANDLER( airbustr_coin_counter_w ) @@ -458,15 +453,17 @@ INPUT_PORTS_START( airbustr ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // used PORT_START_TAG("DSW1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:2") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x08, 0x08, "Coin Mode" ) // routine at 0x056d : - PORT_DIPSETTING( 0x08, "Mode 1" ) // 11 21 12 16 (bit 3 active) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW1:3" ) + PORT_DIPNAME( 0x08, 0x08, "Coin Mode" ) PORT_DIPLOCATION("SW1:4") + PORT_DIPSETTING( 0x08, "Mode 1" ) // routine at 0x056d: 11 21 12 16 (bit 3 active) PORT_DIPSETTING( 0x00, "Mode 2" ) // 11 21 13 14 (bit 3 not active) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:5,6") PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSW1", 0x08, PORTCOND_NOTEQUALS, 0x00) PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSW1", 0x08, PORTCOND_NOTEQUALS, 0x00) PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSW1", 0x08, PORTCOND_NOTEQUALS, 0x00) @@ -475,7 +472,7 @@ INPUT_PORTS_START( airbustr ) PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSW1", 0x08, PORTCOND_EQUALS, 0x00) PORT_DIPSETTING( 0x10, DEF_STR( 1C_3C ) ) PORT_CONDITION("DSW1", 0x08, PORTCOND_EQUALS, 0x00) PORT_DIPSETTING( 0x00, DEF_STR( 1C_4C ) ) PORT_CONDITION("DSW1", 0x08, PORTCOND_EQUALS, 0x00) - PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:7,8") PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSW1", 0x08, PORTCOND_NOTEQUALS, 0x00) PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSW1", 0x08, PORTCOND_NOTEQUALS, 0x00) PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSW1", 0x08, PORTCOND_NOTEQUALS, 0x00) @@ -486,37 +483,43 @@ INPUT_PORTS_START( airbustr ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_4C ) ) PORT_CONDITION("DSW1", 0x08, PORTCOND_EQUALS, 0x00) PORT_START_TAG("DSW2") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2") PORT_DIPSETTING( 0x02, DEF_STR( Easy ) ) PORT_DIPSETTING( 0x03, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x01, "Difficult" ) PORT_DIPSETTING( 0x00, "Very Difficult" ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_DIPNAME( 0x08, 0x08, "Freeze" ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:3") + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "Freeze" ) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:5,6") PORT_DIPSETTING( 0x30, "3" ) PORT_DIPSETTING( 0x20, "4" ) PORT_DIPSETTING( 0x10, "5" ) PORT_DIPSETTING( 0x00, "7" ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:7") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END INPUT_PORTS_START( airbustj ) PORT_INCLUDE(airbustr) PORT_MODIFY("DSW1") - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_A ) ) // routine at 0x0546 : 11 12 21 23 + 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( 0x30, 0x30, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:5,6") // routine at 0x0546 : 11 12 21 23 PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) PORT_DIPSETTING( 0x20, DEF_STR( 1C_2C ) ) - PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:7,8") PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) ) diff --git a/src/drivers/ajax.c b/src/drivers/ajax.c index 6d7213f8b..f6b3000d4 100644 --- a/src/drivers/ajax.c +++ b/src/drivers/ajax.c @@ -100,7 +100,7 @@ ADDRESS_MAP_END INPUT_PORTS_START( ajax ) PORT_START_TAG("DSW1") - PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) + 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 ) ) @@ -117,7 +117,7 @@ INPUT_PORTS_START( ajax ) 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_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 ) ) @@ -136,37 +136,37 @@ INPUT_PORTS_START( ajax ) // PORT_DIPSETTING( 0x00, "Coin Slot 2 Invalid" ) PORT_START_TAG("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, "30000 150000" ) PORT_DIPSETTING( 0x10, "50000 200000" ) PORT_DIPSETTING( 0x08, "30000" ) PORT_DIPSETTING( 0x00, "50000" ) - 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, "Difficult" ) PORT_DIPSETTING( 0x00, "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 ) ) PORT_START_TAG("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") // Listed as "unused" and forced to be off in the manual. PORT_DIPSETTING( 0x02, DEF_STR( Single ) ) PORT_DIPSETTING( 0x00, DEF_STR( Dual ) ) - PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x08, 0x08, "Control in 3D Stages" ) + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPNAME( 0x08, 0x08, "Control in 3D Stages" ) PORT_DIPLOCATION("SW3:4") // The manual make reference to "general control" PORT_DIPSETTING( 0x08, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x00, "Inverted" ) PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) diff --git a/src/drivers/aleck64.c b/src/drivers/aleck64.c index a3c1f2356..9e6714581 100644 --- a/src/drivers/aleck64.c +++ b/src/drivers/aleck64.c @@ -174,15 +174,15 @@ PCB Layout static READ32_HANDLER( aleck_dips_r ) { - //return 0xff0fffff; if (offset == 0) { - return (readinputport(3) << 16) | 0xffff; + return (readinputport(3)); } else if (offset == 1) { - return (readinputport(4) << 16) | 0xffff; + return (readinputport(4)); } + return 0; } @@ -203,7 +203,8 @@ static ADDRESS_MAP_START( n64_map, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x1fc007c0, 0x1fc007ff) AM_READWRITE(n64_pif_ram_r, n64_pif_ram_w) AM_RANGE(0xc0800000, 0xc08fffff) AM_READWRITE(aleck_dips_r, MWA32_NOP) - AM_RANGE(0xd0000000, 0xd08fffff) AM_NOP + AM_RANGE(0xd0000000, 0xd0000fff) AM_RAM + AM_RANGE(0xd0010000, 0xd00109ff) AM_RAM ADDRESS_MAP_END static ADDRESS_MAP_START( rsp_map, ADDRESS_SPACE_PROGRAM, 32 ) @@ -236,61 +237,96 @@ INPUT_PORTS_START( aleck64 ) PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y ) PORT_MINMAX(0xff,0x00) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(1) PORT_START - PORT_DIPNAME( 0x8000, 0x8000, "DIPSW1 #8" ) - PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x4000, 0x4000, "DIPSW1 #7" ) - PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x2000, 0x2000, "DIPSW1 #6" ) - PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x1000, 0x1000, "DIPSW1 #5" ) - PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0800, 0x0800, "DIPSW1 #4" ) - PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0400, 0x0400, "DIPSW1 #3" ) - PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0200, 0x0200, "DIPSW1 #2" ) - PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0100, 0x0100, "DIPSW1 #1" ) - PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0080, 0x0080, "Test Mode" ) - PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0040, 0x0040, "DIPSW2 #7" ) - PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0020, 0x0020, "DIPSW2 #6" ) - PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0010, "DIPSW2 #5" ) - PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0008, "DIPSW2 #4" ) - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0004, 0x0004, "DIPSW2 #3" ) - PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0002, 0x0002, "DIPSW2 #2" ) - PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0001, 0x0001, "DIPSW2 #1" ) - PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x80000000, 0x80000000, "DIPSW1 #8" ) + PORT_DIPSETTING( 0x80000000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x40000000, 0x40000000, "DIPSW1 #7" ) + PORT_DIPSETTING( 0x40000000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x20000000, 0x20000000, "DIPSW1 #6" ) + PORT_DIPSETTING( 0x20000000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x10000000, 0x10000000, "DIPSW1 #5" ) + PORT_DIPSETTING( 0x10000000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x08000000, 0x08000000, "DIPSW1 #4" ) + PORT_DIPSETTING( 0x08000000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x04000000, 0x04000000, "DIPSW1 #3" ) + PORT_DIPSETTING( 0x04000000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x02000000, 0x02000000, "DIPSW1 #2" ) + PORT_DIPSETTING( 0x02000000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x01000000, 0x01000000, "DIPSW1 #1" ) + PORT_DIPSETTING( 0x01000000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x00800000, 0x00800000, "Test Mode" ) + PORT_DIPSETTING( 0x00800000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x00400000, 0x00400000, "DIPSW2 #7" ) + PORT_DIPSETTING( 0x00400000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x00200000, 0x00200000, "DIPSW2 #6" ) + PORT_DIPSETTING( 0x00200000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x00100000, 0x00100000, "DIPSW2 #5" ) + PORT_DIPSETTING( 0x00100000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x00080000, 0x00080000, "DIPSW2 #4" ) + PORT_DIPSETTING( 0x00080000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x00040000, 0x00040000, "DIPSW2 #3" ) + PORT_DIPSETTING( 0x00040000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x00020000, 0x00020000, "DIPSW2 #2" ) + PORT_DIPSETTING( 0x00020000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_DIPNAME( 0x00010000, 0x00010000, "DIPSW2 #1" ) + PORT_DIPSETTING( 0x00010000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00000000, DEF_STR( On ) ) + PORT_BIT(0x0000ffff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START - PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0xff00ffff, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00200000, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME( DEF_STR( Service_Mode )) PORT_CODE(KEYCODE_F2) + PORT_BIT( 0x00100000, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service Button") PORT_CODE(KEYCODE_7) + PORT_BIT( 0x00080000, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x00040000, IP_ACTIVE_LOW, IPT_COIN1 ) +INPUT_PORTS_END + +INPUT_PORTS_START( mtetrisc ) + // The basic N64 controls are unused in this game + PORT_START_TAG("P1") + PORT_START_TAG("P1_ANALOG_X") + PORT_START_TAG("P1_ANALOG_Y") + + PORT_START + PORT_BIT( 0xffff0000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00008000, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00002000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) + PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + + PORT_START + PORT_BIT( 0xffcc, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME( DEF_STR( Service_Mode )) PORT_CODE(KEYCODE_F2) PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Service Button") PORT_CODE(KEYCODE_7) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) + INPUT_PORTS_END /* ?? */ @@ -328,7 +364,7 @@ MACHINE_DRIVER_START( aleck64 ) MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_RGB_DIRECT | VIDEO_NEEDS_6BITS_PER_GUN) MDRV_SCREEN_SIZE(640, 525) - MDRV_VISIBLE_AREA(0, 639, 0, 479) + MDRV_VISIBLE_AREA(0, 639, 0, 239) MDRV_PALETTE_LENGTH(0x1000) MDRV_VIDEO_START(n64) @@ -374,5 +410,5 @@ ROM_START( mtetrisc ) ROM_LOAD ( "at24c01.u34", 0x000000, 0x80, CRC(ba7e503f) SHA1(454aa4fdde7d8694d1affaf25cd750fa678686bb) ) ROM_END -GAME( 1998, 11beat, 0, aleck64, aleck64, aleck64, ROT0, "Hudson", "Eleven Beat", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 1998, mtetrisc, 0, aleck64, aleck64, aleck64, ROT0, "Capcom", "Magical Tetris Challenge (981009 Japan)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 1998, 11beat, 0, aleck64, aleck64, aleck64, ROT0, "Hudson", "Eleven Beat", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 1998, mtetrisc, 0, aleck64, mtetrisc, aleck64, ROT0, "Capcom", "Magical Tetris Challenge (981009 Japan)", GAME_NOT_WORKING|GAME_NO_SOUND ) diff --git a/src/drivers/aliens.c b/src/drivers/aliens.c index d407013e1..e9f10e1f3 100644 --- a/src/drivers/aliens.c +++ b/src/drivers/aliens.c @@ -136,7 +136,7 @@ ADDRESS_MAP_END INPUT_PORTS_START( aliens ) PORT_START_TAG("DSW1") - PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) + 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 ) ) @@ -153,7 +153,7 @@ INPUT_PORTS_START( aliens ) 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_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 ) ) @@ -172,38 +172,38 @@ INPUT_PORTS_START( aliens ) // PORT_DIPSETTING( 0x00, "Invalid" ) PORT_START_TAG("DSW2") - PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x03, 0x02, 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( Unused ) ) /* Listed as "Unused" in the manual */ + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:3") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) /* Listed as "Unused" in the manual */ + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:4") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) /* Listed as "Unused" in the manual */ + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:5") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - 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( 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_TAG("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( Unused ) ) /* Listed as "Unused" in the manual */ + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW3:2") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) /* Listed as "Unused" in the manual */ + PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_LOW, "SW3:3" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW3:4") /* Listed as "Unused" in the manual */ PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN3 ) diff --git a/src/drivers/arcadia.c b/src/drivers/arcadia.c index a0abbe3ad..43065c988 100644 --- a/src/drivers/arcadia.c +++ b/src/drivers/arcadia.c @@ -656,7 +656,7 @@ INLINE void generic_decode(int region, int bit7, int bit6, int bit5, int bit4, i * *************************************/ -DRIVER_INIT( arcadia ) +static void arcadia_init(void) { static const amiga_machine_interface arcadia_intf = { @@ -696,17 +696,17 @@ DRIVER_INIT( arcadia ) * *************************************/ -DRIVER_INIT( none ) { init_arcadia(); } -DRIVER_INIT( airh ) { generic_decode(REGION_USER3, 5, 0, 2, 4, 7, 6, 1, 3); init_arcadia(); } -DRIVER_INIT( bowl ) { generic_decode(REGION_USER3, 7, 6, 0, 1, 2, 3, 4, 5); init_arcadia(); } -DRIVER_INIT( dart ) { generic_decode(REGION_USER3, 4, 0, 7, 6, 3, 1, 2, 5); init_arcadia(); } -DRIVER_INIT( ldrba ) { generic_decode(REGION_USER3, 2, 3, 4, 1, 0, 7, 5, 6); init_arcadia(); } -DRIVER_INIT( ninj ) { generic_decode(REGION_USER3, 1, 6, 5, 7, 4, 2, 0, 3); init_arcadia(); } -DRIVER_INIT( rdwr ) { generic_decode(REGION_USER3, 3, 1, 6, 4, 0, 5, 2, 7); init_arcadia(); } -DRIVER_INIT( sdwr ) { generic_decode(REGION_USER3, 6, 3, 4, 5, 2, 1, 0, 7); init_arcadia(); } -DRIVER_INIT( socc ) { generic_decode(REGION_USER3, 0, 7, 1, 6, 5, 4, 3, 2); init_arcadia(); } -DRIVER_INIT( sprg ) { generic_decode(REGION_USER3, 4, 7, 3, 0, 6, 5, 2, 1); init_arcadia(); } -DRIVER_INIT( xeon ) { generic_decode(REGION_USER3, 3, 1, 2, 4, 0, 5, 6, 7); init_arcadia(); } +DRIVER_INIT( none ) { arcadia_init(); } +DRIVER_INIT( airh ) { generic_decode(REGION_USER3, 5, 0, 2, 4, 7, 6, 1, 3); arcadia_init(); } +DRIVER_INIT( bowl ) { generic_decode(REGION_USER3, 7, 6, 0, 1, 2, 3, 4, 5); arcadia_init(); } +DRIVER_INIT( dart ) { generic_decode(REGION_USER3, 4, 0, 7, 6, 3, 1, 2, 5); arcadia_init(); } +DRIVER_INIT( ldrba ) { generic_decode(REGION_USER3, 2, 3, 4, 1, 0, 7, 5, 6); arcadia_init(); } +DRIVER_INIT( ninj ) { generic_decode(REGION_USER3, 1, 6, 5, 7, 4, 2, 0, 3); arcadia_init(); } +DRIVER_INIT( rdwr ) { generic_decode(REGION_USER3, 3, 1, 6, 4, 0, 5, 2, 7); arcadia_init(); } +DRIVER_INIT( sdwr ) { generic_decode(REGION_USER3, 6, 3, 4, 5, 2, 1, 0, 7); arcadia_init(); } +DRIVER_INIT( socc ) { generic_decode(REGION_USER3, 0, 7, 1, 6, 5, 4, 3, 2); arcadia_init(); } +DRIVER_INIT( sprg ) { generic_decode(REGION_USER3, 4, 7, 3, 0, 6, 5, 2, 1); arcadia_init(); } +DRIVER_INIT( xeon ) { generic_decode(REGION_USER3, 3, 1, 2, 4, 0, 5, 6, 7); arcadia_init(); } diff --git a/src/drivers/arkanoid.c b/src/drivers/arkanoid.c index ded3e56f4..c87498819 100644 --- a/src/drivers/arkanoid.c +++ b/src/drivers/arkanoid.c @@ -43,37 +43,428 @@ player will die for no reason. +Stephh's notes (based on the games Z80 code and some tests) : + +0) Useful addresses and routines + +0a) "Game Corporation" bootlegs, Tayto bootlegs, 'arkmcubl', 'ark1ball' + + - Basic routines : + * 0x2044 : BC += A; + * 0x204a : DE += A; + * 0x2050 : HL += A; + * 0x2056 : HL += A; DE = (HL); + * 0x21f1 : Display string : + Inputs : DE = string address in ROM + HL = adress where the string will be displayed + (most of the times in video RAM) + A = colour + String begins with the number of chars to display + (eg: 0x02 "OK" to display "OK") + * 0x210d : Display 1 char (called by previous routine) + * 0x264a : Display score : + Inputs : DE = score address + HL = adress where the score will be displayed + (most of the times in video RAM) + * 0x266f : Display 1 digit (called by previous routine) + * 0x67ae : Play sound (input : register A) - to be confirmed ! + + - Level issues : + * 0xed72 : Level (0x00-0x20) + * 0xed83 : Breakable bricks left (gold bricks are NOT counted) + * 0x55a0 : Display level background + * 0x55d9 : Display level bricks : + Inputs : IY = index for bricks counter + B = number of bricks to display + * 0x55f6 : Display 1 background "column" + * 0x5639 : Display 1 brick with its shadow + * 0xed6b : Hits in the head of last level (0x00-0x10) + This value is reset to 0x00 each time you lose a life. + * 0x8d15 : Check if head of last level is dead + + - Lives issues : + * 0xed71 : Current player lives + * 0xed76 : Player 1 lives + * 0xed7b : Player 2 lives + * 0xef68 : When bit 0 set to 1, no more lives on score for player 1 + * 0xef69 : When bit 0 set to 1, no more lives on score for player 2 + * 0xef6a : Player 1 counter for extra lives on score + * 0xef6b : Player 2 counter for extra lives on score + * 0x22a0 : Draw lives at the bottom left of the screen + * 0x2785 : Check player score for extra life + + - Score issues : + * 0xc4d7 : Player 1 score / 10 (3 bytes, BCD coded, MSB first) + * 0xc4db : Player 2 score / 10 (3 bytes, BCD coded, MSB first) + * 0xc4df : Highscore / 10 (3 bytes, BCD coded, MSB first) + * 0xef6c : Player 1 score / 1000 for next life (2 bytes, BCD coded, MSB first) + * 0xef6e : Player 2 score / 1000 for next life (2 bytes, BCD coded, MSB first) + * 0x2723 : Player score += DE; (BCD => 'daa' instructions) + * 0x274a : Check player score for highscore + + - Speed issues : + * 0xef63 : Speed counter which is increased each time the ball touches + your paddle, any wall (up, left or right) or a brick; + it is reset when speed changes or when you lose a life. + * 0x094c : Speed table (16 bytes) + * 0xc462 : Speed (0x01-0x0e) : + Speed +1 when counter is above the value in the table + (check code at 0x0900) + Speed -2 when you get the slow pill ("S") + (check code at 0x5423) + Speed is sometimes increased when up wall is hit + (check code at 0x1442 and table at 0x1462) + + - Pills issues : + * 0xc658 : Falling pill (0x80 = none - 0x81-0x87) + * 0x5474 : Pills routines table (7 * 2 bytes, LSB first) : + . 0x53ff : "L" pill (laser) + . 0x540d : "E" pill (enlarge) + . 0x5418 : "C" pill (glue) + . 0x5423 : "S" pill (slow) + . 0x5436 : "B" pill (warp door) + . 0x5446 : "D" pill (3 balls) + . 0x5451 : "P" pill (extra life) + * 0x53c8 : Check pill effect + + - Miscellaneous addresses : + * 0xef66 : 0x00 in demo mode else 0x01 + * 0xed6f : Bit 1 determines player : 0 = player 1 - 1 = player 2 + * 0xc4ce : Warp door status : 0x00 = closed - 0x01 = opened + * 0xc469 : Balls in play : 0x00 = 1 ball - 0x02 = 2 or 3 balls + + - Miscellaneous routines : + * 0xa234 : Enter initials + * 0xa343 : Check if player has entered "SEX" as initials; + if so, replace them with "H !" (no side effect) + + +1) Bootlegs with MCU + +1a) 'arkmcubl' + + - Region = 0x76 (Japan). + - The bootleg is based on a Japenese early version we don't have. + - The MCU is dumped, but the game doesn't run with it. + However, there is no problem if I use the one from the World early version. + Until I know what to do with it, I use the MCU from the World early version + and "save" the existing one in REGION_USER1. Let me know if it's good. + - "(c) Taito Corporation 1986". + - Displays the "Arkanoid" title. + - "HARDWARE TEST" message is written, tests are performed, countdown 11 to 0. + - "NOTICE" screen replaces by "WAIT" without any more text. + However, the text is still in the ROM at 0x7b81 with changes at the begining : + * "NOTICE" -> "WAIT " + * 0xbe "THIS GAME IS" -> 0x01 " " 0x7b "IS" 0xde "GAME" 0x6d "IS" + IMO these changes are made to bypass the checksums + - You can't select your starting level + - Known bugs : NONE ! + +1b) 'ark1ball' + + - Note from the dumper (f205v, 2005.09.29) : "It's a bootleg of "Arkanoid (Japan)", + with notice screen eliminated (it only shows a black screen with a red WAIT) + and a fix (no dips selection) 1 ball x game and NO starting level selection". + However, there is still code in the game which tests the Dip Switches ! + - Region = 0x76 (Japan). + - The bootleg is based on a Japenese early version we don't have. + In fact, it is completely based on 'arkmcubl' : + + Z:\MAME\roms>romcmp ark1ball.zip arkmcubl.zip -d + 3 and 2 files + e1.6d a-1.7d IDENTICAL + e2.6f 2palline.7f 99.957275% + 68705p3.6i NO MATCH + + Z:\MAME\data>fc /B e2.6f 2palline.7f + Comparing files e2.6f and 2PALLINE.7F + 000013BE: 20 60 + 00001A28: 05 02 + 00001A29: 03 01 + 00001C80: 20 60 + 00001C9C: 20 60 + 00001ED9: 53 36 + 00001EDA: 53 35 + 00001EE0: 53 33 + 00001EE7: 54 34 + 00001EE9: 52 42 + 00001EF7: 52 42 + 00001EF9: 66 46 + + - The MCU is not dumped, and the game doesn't run with the one from 'arkmcubl'. + However, there is no problem if I use the one from the World early version. + Until I know what to do with it, I use the MCU from the World early version. + - This version is supposed to be a harder version : + * less lives (1 or 2 instead of 3 or 5) + * 60K for 1st bonus life instead of 20K + - Known bugs : + * Names on highscores table are wrong + (ingame bug to bypass the checksums) + +2) "Game Corporation" bootlegs and assimilated ones. + + - Region = 0x76 (Japan). + - All bootlegs are based on a (bootleg) version we don't have. + - Team credits have been replaced by bootleggers code. + - Start of levels table at 0x7bd5 (32 * 2 bytes - MSB first) + +2a) 'arkangc' + + - "(c) Game Corporation 1986". + - Displays the "Arkanoid" title but routine to display "BLOCK" with bricks exists. + - No hardware test and no "NOTICE" screen. + - All reads from 0xf002 are patched. + - No reads from 0xd008. + - "Continue" Dip Switch has been replaced by sort of "Debug" Dip Switch : + * affects ball speed at start of level (0x06 or 0x08) + * affects level 2 (same as normal version or same as level 30) + - You can select your starting level (between 1 and 30) + but they aren't displayed like in the original Japanese set we have ('arknoidj'). + - Level 30 differs from original Japanese version + - There seems to be code to edit levels (check code at 0x8082), but the routines + don't seem to be called anymore. + - Known bugs : + * The paddle isn't centered when starting a new life and / or level; + it doesn't "backup" the paddle position when a life is lost as well + (I can't tell at the moment if it's an ingame bug or not) + So the paddle can sometimes appear in the left wall ! + * You are told be to able to select your starting level from level 1 to level 32 + (ingame bug - check code at 0x3425) + +2a) 'arkangc2' + + - "(c) Game Corporation 1986". + - Displays the "Arkanoid" title but routine to display "BLOCK" with bricks exists. + - No hardware test and no "NOTICE" screen. + - No reads from 0xf002. + - Reads bit 1 from 0xd008. + - "Continue" Dip Switch has been replaced by sort of "Debug" Dip Switch : + * affects ball speed at start of level (0x04 or 0x06) + * affects level 2 (same as normal version or same as level 30) + - You can select your starting level (between 1 and 30) + but they aren't displayed like in the original Japanese set we have ('arknoidj'). + No "What round do you want to start from ?" message though. + - Level 30 differs from original Japanese version (it also differs from 'arkangc') + - The routine to handle the paddle is completely different as in 'arkangc' + and any other bootlegs (check code at 0x96b0) + - There seems to be code to edit levels (check code at 0x8082), but the routines + don't seem to be called anymore. + - Known bugs : + * The paddle isn't centered when starting a new life and / or level; + it doesn't "backup" the paddle position when a life is lost as well + (I can't tell at the moment if it's an ingame bug or not) + So the paddle can sometimes appear in the left wall ! + * You are told be to able to select your starting level from level 1 to level 32 + (ingame bug - check code at 0x3425) + * The "test mode" display is completely corrupted + (ingame bug - check unused code at 0x2f00 instead of standard text) + But you can still press the buttons and test the paddle and the Dip Switches. + +2c) 'arkblock' + + - Same as 'arkangc', the only difference is that it displays "BLOCK" with bricks + instead of displaying the "Arkanoid" title : + + Z:\MAME\dasm>diff arkangc.asm arkbloc2.asm + 8421,8422c8421,8424 + < 32EF: 21 80 03 ld hl,$0380 + < 32F2: CD D1 20 call $20D1 + --- + > 32EF: F3 di + > 32F0: CD 90 7C call $7C90 + > 32F3: C9 ret + > 32F4: 14 inc d + +2d) 'arkbloc2' + + - "(c) Game Corporation 1986". + - Displays "BLOCK" with bricks. + - No hardware test and no "NOTICE" screen. + - All reads from 0xf002 are patched. + - Reads bit 5 from 0xd008. + - You can select your starting level (between 1 and 30) but they aren't displayed + like in the original Japanese set we have ('arknoidj'). + - "Continue" Dip Switch has been replaced by sort of "Debug" Dip Switch : + * affects ball speed at start of level (0x06 or 0x08) + * affects level 2 (same as normal version or same as level 30) + - You can select your starting level (between 1 and 30) + but they aren't displayed like in the original Japanese set we have ('arknoidj'). + - Level 30 differs from original Japanese version (same as the one from 'arkangc2') + - Known bugs : + * You can go from one side of the screen to the other through the walls + (I can't tell at the moment if it's an ingame bug or not) + * You are told be to able to select your starting level from level 1 to level 32 + (ingame bug - check code at 0x3425) + +2e) 'arkgcbl' + + - "1986 ARKANOID 1986". + - Displays the "Arkanoid" title but routine to display "BLOCK" with bricks exists. + - No hardware test and no "NOTICE" screen. + - Most reads from 0xf002 are patched. I need to fix the remaining ones (0x8a and 0xff). + - Reads bits 1 and 5 from 0xd008. + - "Continue" Dip Switch has been replaced by "Round Select" Dip Switch + ("debug" functions from 'arkangc' have been patched). + - Different "Bonus Lives" Dip Switch : + * "60K 100K 60K+" or "60K" when you start a new game + * "20K 60K 60K+" or "20K" when you continue + - Different "Lives" Dip Switch (check table at 0x9a28) + - Specific coinage (always 2C_1C) + - If Dip Switch is set, you can select your starting level (between 1 and 30) + but they aren't displayed like in the original Japanese set we have ('arknoidj'). + - Same level 30 as original Japanese version + - Known bugs : + * You can go from one side of the screen to the other through the walls + (I can't tell at the moment if it's an ingame bug or not) + * You are told be to able to select your starting level from level 1 to level 32 + (ingame bug - check code at 0x3425) + * Sound in "Demo Mode" if 1 coin is inserted (ingame bug - check code at 0x0283) + * Red square on upper middle left "led" when it is supposed to be yellow (ingame bug) + +2f) 'paddle2' + + - Different title, year, and inside texts but routine to display "BLOCK" with bricks exists. + - No hardware test and no "NOTICE" screen. + - I need to fix ALL reads from 0xf002. + - Reads bits 0 to 3 and 5 from 0xd008. + - "Continue" Dip Switch has been replaced by "Round Select" Dip Switch + ("debug" functions from 'arkangc' have been patched). + - No more "Service Mode" Dip Switch (even if code is still there for it). + This Dip Switch now selects how spinners are handled : + * bit 2 = 0 => read from 0xd018 only + * bit 2 = 1 => read from 0xd018 + read from 0xd008 + I set its default to 1 as parts of the game still branch to 0x96b0. + - Different "Bonus Lives" Dip Switch : + * "60K 100K 60K+" or "60K" when you start a new game + * "20K 60K 60K+" or "20K" when you continue + - Different "Lives" Dip Switch (check table at 0x9a28) + - If Dip Switch is set, you can select your starting level (between 1 and 30) + but they aren't displayed like in the original Japanese set we have ('arknoidj'). + - Levels are based on the ones from "Arkanoid II". + - Known bugs : + * You can go from one side of the screen to the other through the walls + (I can't tell at the moment if it's an ingame bug or not) + * You can't correctly enter your initials at the end of the game + (ingame bug ? check code at 0xa23e and difference at 0xa273) + * On intro and last screen, colour around main ship is yellow instead of red + (ingame bug due to numerous patches) + +3) "Tayto" bootlegs and assimilated ones. + + - Region = 0x76 (Japan). + - All bootlegs are based on a Japenese early version we don't have. + - Start of levels table at 0xbd75 (32 * 2 bytes - LSB first) + +3a) 'arkatayt' + + - "(c) Tayto Corporation 1986" but the Taito original logo is displayed. + - Displays the "Arkanoid" title. + - "HARDWARE TEST" message is written, tests are performed, but no countdown. + - "NOTICE" screen replaces by "WAIT" without any more text. + However, the text is still in the ROM at 0x7b81 with changes at the begining : + * "NOTICE" -> "WAIT " + * 0xbe "THIS" -> 0x01 " HIS" + IMO these changes are made to bypass the checksums + - You can't select your starting level + - Known bugs : + * level 16 is corrupted with extra bricks + (ingame bug due to extra code from 0x5042 to 0x5086) + * level 25 is shifted 8 "columns" to the right + (ingame bug due to bad level offset at 0xbda5 : 0xe5 instead of 0xed) + +3b) 'arktayt2' + + - This version is supposed to be a harder version of 'arkatayt' : + * less lives (2 or 3 instead of 3 or 5) + * 60K for 1st bonus life instead of 20K + Same as 'arkatayt' otherwise + - Known bugs : + * level 16 is corrupted with extra bricks + (ingame bug due to extra code from 0x5042 to 0x5086) + * level 25 is shifted 8 "columns" to the right + (ingame bug due to bad level offset at 0xbda5 : 0xe5 instead of 0xed) + * Names on highscores table are wrong + (ingame bug to bypass the checksums) + + +TO DO (2006.09.12) : + + - Check the following Taito sets (adresses, routines and Dip Switches) : + * 'arkanoid' = 'arknoiuo' + * 'arknoidj' + * 'arknoidu' + * 'arkatour' + - Add more notes about main addresses and routines in the Z80 + - Try to understand the problem with the MCU in the following sets : + * 'arkmcubl' + * 'ark1ball' + + +Stephh's log (2006.09.05) : + + - Interverted 'arkblock' and 'arkbloc2' sets for better comparaison + - Renamed sets : + * 'arkbl2' -> 'arkmcubl' + * 'arkbl3' -> 'arkgcbl' + - Changed some games descriptions + - Removed flags from the following sets : + * 'arkbloc2' (old 'arkblock') + * 'arkgcbl' (old 'arkbl3') + * 'paddle2' + This way, even if emulation isn't perfect, people can try them and report bugs. + + +Stephh's log (2006.09.12) : + + - Renamed sets : + * 'arkatayt' -> 'arktayt2' + - Changed some games descriptions + - Added sets : + * 'ark1ball' + * 'arkangc2' + * 'arkatayt' + - Removed flags from the following sets : + * 'arkmcubl' + This way, even if emulation isn't perfect, people can try them and report bugs. + +*************************************************************************** + +Stephh's notes on 'tetrsark' (based on the game Z80 code and some tests) : + + - No reads from 0xd00c, 0xd010 nor 0xd018. + - "Cabinet" Dip Switch : + * when set to "Upright" : + . each player can join and play on its half screen while + the other is already playing + . the screen is never flipped + * when set to "Cocktail" : + . only one player can play : the other player has to wait until + current player is "GAME OVER" to press the Start button + . screen is flipped when player 2 is playing and + it remains flipped until player 1 starts a game + (so "demo mode" can be upside down) + - Credits : even if display is limited to 9, the value still increases; + so if you insert too many coins, it can be reset to 0 ! + - Routines : + * 0x56e3 : Play sound (input : register A) - to be confirmed ! + - Adresses : + * 0xc52b : credits + * 0xc541 : ~(IN5) - test for coins "buttons" (code at 0x0232) + * 0xc516 : ~(IN5) + * 0xc517 : ~(IN4) + - Known bugs : + * Coins "buttons" don't work - we need to use fake BUTTON2 for each player + ***************************************************************************/ #include "driver.h" +#include "arkanoid.h" #include "sound/ay8910.h" -extern WRITE8_HANDLER( arkanoid_videoram_w ); -extern VIDEO_START( arkanoid ); -extern VIDEO_UPDATE( arkanoid ); - -extern MACHINE_START( arkanoid ); -extern MACHINE_RESET( arkanoid ); - -extern WRITE8_HANDLER( arkanoid_d008_w ); - -extern READ8_HANDLER( arkanoid_Z80_mcu_r ); -extern WRITE8_HANDLER( arkanoid_Z80_mcu_w ); - -extern READ8_HANDLER( arkanoid_68705_portA_r ); -extern WRITE8_HANDLER( arkanoid_68705_portA_w ); -extern WRITE8_HANDLER( arkanoid_68705_ddrA_w ); +int arkanoid_bootleg_id; -extern READ8_HANDLER( arkanoid_68705_portC_r ); -extern WRITE8_HANDLER( arkanoid_68705_portC_w ); -extern WRITE8_HANDLER( arkanoid_68705_ddrC_w ); -extern READ8_HANDLER( arkanoid_68705_input_0_r ); -extern READ8_HANDLER( arkanoid_input_2_r ); - -extern READ8_HANDLER( paddle2_prot_r ); -extern WRITE8_HANDLER( paddle2_prot_w ); -extern READ8_HANDLER( paddle2_track_kludge_r ); +/***************************************************************************/ /* Memory Maps */ @@ -118,7 +509,12 @@ static ADDRESS_MAP_START( mcu_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0080, 0x07ff) AM_ROM ADDRESS_MAP_END + +/***************************************************************************/ + + /* Input Ports */ + #define ARKNOI_IN0\ PORT_START_TAG("IN0")\ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )\ @@ -162,20 +558,17 @@ INPUT_PORTS_START( arkanoid ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x10, "20K 60K 60K+" ) PORT_DIPSETTING( 0x00, "20K" ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Lives ) ) /* Table at 0x9a28 */ PORT_DIPSETTING( 0x20, "3" ) PORT_DIPSETTING( 0x00, "5" ) - PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coinage ) ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coinage ) ) /* Table at 0x0328 */ PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_6C ) ) INPUT_PORTS_END -/* These are the input ports of the real Japanese ROM set */ -/* 'Block' uses the these ones as well. The Tayto bootleg is different */ -/* in coinage and # of lives. */ - +/* Different coinage and additionnal "Cabinet" Dip Switch */ INPUT_PORTS_START( arknoidj ) ARKNOI_IN0 ARKNOI_IN1 @@ -195,10 +588,10 @@ INPUT_PORTS_START( arknoidj ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x10, "20K 60K 60K+" ) PORT_DIPSETTING( 0x00, "20K" ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Lives ) ) /* Table at 0x9a28 */ PORT_DIPSETTING( 0x20, "3" ) PORT_DIPSETTING( 0x00, "5" ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Coinage ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Coinage ) ) /* table at 0x0320 */ PORT_DIPSETTING( 0x40, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_2C ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) @@ -206,91 +599,117 @@ INPUT_PORTS_START( arknoidj ) PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) INPUT_PORTS_END -/* Is the same as arkanoij, but the Coinage, - Lives and Bonus_Life dips are different */ -INPUT_PORTS_START( arkatayt ) - ARKNOI_IN0 - ARKNOI_IN1 - ARKNOI_SPINNERS +INPUT_PORTS_START( ark1ball ) + PORT_INCLUDE(arknoidj) PORT_START_TAG("DSW") - PORT_DIPNAME( 0x01, 0x00, DEF_STR( Allow_Continue ) ) - PORT_DIPSETTING( 0x01, DEF_STR( No ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Bonus_Life ) ) /* "ld a,$60" at 0x93bd and "ld a,$60" at 0x9c7f and 0x9c9b */ + PORT_DIPSETTING( 0x10, "60K 100K 60K+" ) + PORT_DIPSETTING( 0x00, "60K" ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Lives ) ) /* Table at 0x9a28 */ + PORT_DIPSETTING( 0x20, "1" ) + PORT_DIPSETTING( 0x00, "2" ) +INPUT_PORTS_END + +INPUT_PORTS_START( arkangc ) + PORT_INCLUDE(arknoidj) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x01, "Ball Speed" ) /* Speed at 0xc462 (code at 0x18aa) - Also affects level 2 (code at 0x7b82) */ + PORT_DIPSETTING( 0x01, DEF_STR( Normal ) ) /* 0xc462 = 0x06 - Normal level 2 */ + PORT_DIPSETTING( 0x00, "Faster" ) /* 0xc462 = 0x08 - Level 2 same as level 30 */ +INPUT_PORTS_END + +INPUT_PORTS_START( arkangc2 ) + PORT_INCLUDE(arknoidj) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x01, "Ball Speed" ) /* Speed at 0xc462 (code at 0x18aa) - Also affects level 2 (code at 0x7b82) */ + PORT_DIPSETTING( 0x01, "Slower" ) /* 0xc462 = 0x04 - Normal level 2 */ + PORT_DIPSETTING( 0x00, DEF_STR ( Normal ) ) /* 0xc462 = 0x06 - Level 2 same as level 30 */ +INPUT_PORTS_END + +INPUT_PORTS_START( arkgcbl ) + PORT_INCLUDE(arknoidj) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x00, "Round Select" ) /* Check code at 0x7bc2 - Speed at 0xc462 (code at 0x18aa) */ + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) /* 0xc462 = 0x06 */ + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) /* 0xc462 = 0x06 */ + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Bonus_Life ) ) /* "ld a,$60" at 0x93bd and "ld a,$20" at 0x9c7f and 0x9c9b */ + PORT_DIPSETTING( 0x10, "60K 100K 60K+" ) /* But "20K 60K 60K+" when continue */ + PORT_DIPSETTING( 0x00, "60K" ) /* But "20K" when continue */ + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPSETTING( 0x20, "3" ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) /* Always 2C_1C - check code at 0x7d5e */ + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Bonus_Life ) ) +INPUT_PORTS_END + +INPUT_PORTS_START( paddle2 ) + PORT_INCLUDE(arknoidj) + + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x01, 0x00, "Round Select" ) /* Check code at 0x7bc2 - Speed at 0xc462 (code at 0x18aa) */ + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) /* 0xc462 = 0x06 */ + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) /* 0xc462 = 0x06 */ + PORT_DIPNAME( 0x04, 0x04, "Controls ?" ) /* Check code at 0x96a1 and read notes */ + PORT_DIPSETTING( 0x04, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Alternate ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Bonus_Life ) ) /* "ld a,$60" at 0x93bd and "ld a,$20" at 0x9c7f and 0x9c9b */ + PORT_DIPSETTING( 0x10, "60K 100K 60K+" ) /* But "20K 60K 60K+" when continue */ + PORT_DIPSETTING( 0x00, "60K" ) /* But "20K" when continue */ + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Lives ) ) /* Table at 0x9a28 */ + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPSETTING( 0x20, "3" ) +INPUT_PORTS_END + +INPUT_PORTS_START( arktayt2 ) + PORT_INCLUDE(arknoidj) + + PORT_START_TAG("DSW") + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Bonus_Life ) ) /* "ld a,$60" at 0x93bd and "ld a,$60" at 0x9c7f and 0x9c9b */ PORT_DIPSETTING( 0x10, "60K 100K 60K+" ) PORT_DIPSETTING( 0x00, "60K" ) - PORT_DIPNAME( 0x20, 0x00, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Lives ) ) /* Table at 0x9a28 */ PORT_DIPSETTING( 0x20, "2" ) PORT_DIPSETTING( 0x00, "3" ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Coinage ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Coinage ) ) /* Table at 0x0320 */ PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_1C ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) INPUT_PORTS_END + INPUT_PORTS_START( tetrsark ) - /* most of these probably just aren't connected rather than being dipswitches */ PORT_START_TAG("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_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_START_TAG("IN1") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START_TAG("IN2") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START_TAG("IN3") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_START_TAG("IN4") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) // or up? it rotates the piece. - /* coinage? */ - 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( 0x10, 0x10, DEF_STR( Cabinet ) ) /* Also affects numbers of players - read notes */ + PORT_DIPSETTING( 0x10, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coinage ) ) /* Table at 0x0207 */ + PORT_DIPSETTING( 0xc0, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x40, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) ) PORT_START_TAG("IN5") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) @@ -305,6 +724,9 @@ INPUT_PORTS_START( tetrsark ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) INPUT_PORTS_END + +/***************************************************************************/ + /* Graphics Layouts */ static const gfx_layout charlayout = @@ -382,6 +804,9 @@ static MACHINE_DRIVER_START( bootleg ) MDRV_CPU_REMOVE("mcu") MACHINE_DRIVER_END + +/***************************************************************************/ + /* ROMs */ ROM_START( arkanoid ) @@ -389,7 +814,7 @@ ROM_START( arkanoid ) ROM_LOAD( "a75-01-1.rom", 0x0000, 0x8000, CRC(5bcda3b0) SHA1(52cadd38b5f8e8856f007a9c602d6b508f30be65) ) ROM_LOAD( "a75-11.rom", 0x8000, 0x8000, CRC(eafd7191) SHA1(d2f8843b716718b1de209e97a874e8ce600f3f87) ) - ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 8k for the microcontroller */ + ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 2k for the microcontroller */ ROM_LOAD( "arkanoid.uc", 0x0000, 0x0800, CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) @@ -408,7 +833,7 @@ ROM_START( arknoidu ) ROM_LOAD( "a75-19.bin", 0x0000, 0x8000, CRC(d3ad37d7) SHA1(a172a1ef5bb83ee2d8ed2842ef8968af19ad411e) ) ROM_LOAD( "a75-18.bin", 0x8000, 0x8000, CRC(cdc08301) SHA1(05f54353cc8333af14fa985a2764960e20e8161a) ) - ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 8k for the microcontroller */ + ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 2k for the microcontroller */ ROM_LOAD( "arknoidu.uc", 0x0000, 0x0800, BAD_DUMP CRC(de518e47) SHA1(b8eddd1c566505fb69e3d1207c7a9720dfb9f503) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) @@ -427,7 +852,7 @@ ROM_START( arknoiuo ) ROM_LOAD( "a75-01-1.rom", 0x0000, 0x8000, CRC(5bcda3b0) SHA1(52cadd38b5f8e8856f007a9c602d6b508f30be65) ) ROM_LOAD( "a75-10.rom", 0x8000, 0x8000, CRC(a1769e15) SHA1(fbb45731246a098b29eb08de5d63074b496aaaba) ) - ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 8k for the microcontroller */ + ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 2k for the microcontroller */ ROM_LOAD( "arkanoid.uc", 0x0000, 0x0800, CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) @@ -446,7 +871,7 @@ ROM_START( arkatour ) ROM_LOAD( "t_ark1.bin", 0x0000, 0x8000, CRC(e3b8faf5) SHA1(4c09478fa41881fa89ee6afb676aeb780f17ac2e) ) ROM_LOAD( "t_ark2.bin", 0x8000, 0x8000, CRC(326aca4d) SHA1(5a194b7a0361236d471b24905dc6434372f81252) ) - ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 8k for the microcontroller */ + ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 2k for the microcontroller */ ROM_LOAD( "arkatour.uc", 0x0000, 0x0800, BAD_DUMP CRC(d3249559) SHA1(b1542764450016614e9e03cedd6a2f1e59961789) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) @@ -465,7 +890,7 @@ ROM_START( arknoidj ) ROM_LOAD( "a75-21.rom", 0x0000, 0x8000, CRC(bf0455fc) SHA1(250522b84b9f491c3f4efc391bf6aa6124361369) ) ROM_LOAD( "a75-22.rom", 0x8000, 0x8000, CRC(3a2688d3) SHA1(9633a661352def3d85f95ca830f6d761b0b5450e) ) - ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 8k for the microcontroller */ + ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 2k for the microcontroller */ ROM_LOAD( "arknoidj.uc", 0x0000, 0x0800, BAD_DUMP CRC(0a4abef6) SHA1(fdce0b7a2eab7fd4f1f4fc3b93120b1ebc16078e) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) @@ -479,13 +904,14 @@ ROM_START( arknoidj ) ROM_LOAD( "a75-09.bpr", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ ROM_END -ROM_START( arkbl2 ) +ROM_START( arkmcubl ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ ROM_LOAD( "e1.6d", 0x0000, 0x8000, CRC(dd4f2b72) SHA1(399a8636030a702dafc1da926f115df6f045bef1) ) ROM_LOAD( "e2.6f", 0x8000, 0x8000, CRC(bbc33ceb) SHA1(e9b6fef98d0d20e77c7a1c25eff8e9a8c668a258) ) - ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 8k for the microcontroller */ - ROM_LOAD( "68705p3.6i", 0x0000, 0x0800, CRC(389a8cfb) SHA1(9530c051b61b5bdec7018c6fdc1ea91288a406bd) ) + /* MCU from the World early version ('arkanoid'), so the game is playable */ + ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 2k for the microcontroller */ + ROM_LOAD( "arkmcubl.uc", 0x0000, 0x0800, BAD_DUMP CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) ROM_LOAD( "a75-03.rom", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) ) @@ -496,12 +922,36 @@ ROM_START( arkbl2 ) ROM_LOAD( "a75-07.bpr", 0x0000, 0x0200, CRC(0af8b289) SHA1(6bc589e8a609b4cf450aebedc8ce02d5d45c970f) ) /* red component */ ROM_LOAD( "a75-08.bpr", 0x0200, 0x0200, CRC(abb002fb) SHA1(c14f56b8ef103600862e7930709d293b0aa97a73) ) /* green component */ ROM_LOAD( "a75-09.bpr", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ + + /* Until we know what this MCU is supposed to do, we put it here */ + ROM_REGION( 0x0800, REGION_USER1, 0 ) + ROM_LOAD( "68705p3.6i", 0x0000, 0x0800, CRC(389a8cfb) SHA1(9530c051b61b5bdec7018c6fdc1ea91288a406bd) ) ROM_END -ROM_START( arkbl3 ) +ROM_START( ark1ball ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "arkanunk.1", 0x0000, 0x8000, CRC(b0f73900) SHA1(2c9a36cc1d2a3f33ec81d63c1c325554b818d2d3) ) - ROM_LOAD( "arkanunk.2", 0x8000, 0x8000, CRC(9827f297) SHA1(697874e73e045eb5a7bf333d7310934b239c0adf) ) + ROM_LOAD( "a-1.7d", 0x0000, 0x8000, CRC(dd4f2b72) SHA1(399a8636030a702dafc1da926f115df6f045bef1) ) + ROM_LOAD( "2palline.7f", 0x8000, 0x8000, CRC(ed6b62ab) SHA1(4d4991b422756bd304fc5ef236aac1422fe1f999) ) + + /* MCU from the World early version ('arkanoid'), so the game is playable */ + ROM_REGION( 0x0800, REGION_CPU2, 0 ) /* 2k for the microcontroller */ + ROM_LOAD( "ark1ball.uc", 0x0000, 0x0800, BAD_DUMP CRC(515d77b6) SHA1(a302937683d11f663abd56a2fd7c174374e4d7fb) ) + + ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "a-3.3a", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) ) + ROM_LOAD( "a-4.3d", 0x08000, 0x8000, CRC(71fae199) SHA1(5d253c46ccf4cd2976a5fb8b8713f0f345443d06) ) + ROM_LOAD( "a-5.3f", 0x10000, 0x8000, CRC(c76374e2) SHA1(7520dd48de20db60a2038f134dcaa454988e7874) ) + + ROM_REGION( 0x0600, REGION_PROMS, 0 ) + ROM_LOAD( "a75-07.bpr", 0x0000, 0x0200, CRC(0af8b289) SHA1(6bc589e8a609b4cf450aebedc8ce02d5d45c970f) ) /* red component */ + ROM_LOAD( "a75-08.bpr", 0x0200, 0x0200, CRC(abb002fb) SHA1(c14f56b8ef103600862e7930709d293b0aa97a73) ) /* green component */ + ROM_LOAD( "a75-09.bpr", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ +ROM_END + +ROM_START( arkangc ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ + ROM_LOAD( "arkgc.1", 0x0000, 0x8000, CRC(c54232e6) SHA1(beb759cee68009a06824b755d2aa26d7d436b5b0) ) + ROM_LOAD( "arkgc.2", 0x8000, 0x8000, CRC(9f0d4754) SHA1(731c9224616a338084edd6944c754d68eabba7f2) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) ROM_LOAD( "a75-03.rom", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) ) @@ -514,10 +964,10 @@ ROM_START( arkbl3 ) ROM_LOAD( "a75-09.bpr", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ ROM_END -ROM_START( paddle2 ) +ROM_START( arkangc2 ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "paddle2.16", 0x0000, 0x8000, CRC(a286333c) SHA1(0b2c9cb0df236f327413d0c541453e1ba979ea38) ) - ROM_LOAD( "paddle2.17", 0x8000, 0x8000, CRC(04c2acb5) SHA1(7ce8ba31224f705b2b6ed0200404ef5f8f688001) ) + ROM_LOAD( "1.81", 0x0000, 0x8000, CRC(bd6eb996) SHA1(a048ff01156166595dca0b6bee46344f7db548a8) ) + ROM_LOAD( "2.82", 0x8000, 0x8000, CRC(29dbe452) SHA1(b99cb98549bddf1e673e2e715c80664001581f9f) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) ROM_LOAD( "a75-03.rom", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) ) @@ -530,23 +980,23 @@ ROM_START( paddle2 ) ROM_LOAD( "a75-09.bpr", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ ROM_END -ROM_START( arkatayt ) +ROM_START( arkblock ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "ic81.3f", 0x0000, 0x8000, CRC(6e0a2b6f) SHA1(5227d7a944cb1e815f60ec87a67f7462870ff9fe) ) - ROM_LOAD( "ic82.5f", 0x8000, 0x8000, CRC(5a97dd56) SHA1(b71c7b5ced2b0eebbcc5996dd21a1bb1c2da4819) ) + ROM_LOAD( "ark-6.bin", 0x0000, 0x8000, CRC(0be015de) SHA1(f4209085b59d2c96a62ac9657c7bf097da55362b) ) + ROM_LOAD( "arkgc.2", 0x8000, 0x8000, CRC(9f0d4754) SHA1(731c9224616a338084edd6944c754d68eabba7f2) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "1-ic33.2c", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) ) - ROM_LOAD( "2-ic34.3c", 0x08000, 0x8000, CRC(71fae199) SHA1(5d253c46ccf4cd2976a5fb8b8713f0f345443d06) ) - ROM_LOAD( "3-ic35.5c", 0x10000, 0x8000, CRC(c76374e2) SHA1(7520dd48de20db60a2038f134dcaa454988e7874) ) + ROM_LOAD( "a75-03.rom", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) ) + ROM_LOAD( "a75-04.rom", 0x08000, 0x8000, CRC(71fae199) SHA1(5d253c46ccf4cd2976a5fb8b8713f0f345443d06) ) + ROM_LOAD( "a75-05.rom", 0x10000, 0x8000, CRC(c76374e2) SHA1(7520dd48de20db60a2038f134dcaa454988e7874) ) ROM_REGION( 0x0600, REGION_PROMS, 0 ) - ROM_LOAD( "ic73.11e", 0x0000, 0x0200, CRC(0af8b289) SHA1(6bc589e8a609b4cf450aebedc8ce02d5d45c970f) ) /* red component */ - ROM_LOAD( "ic74.12e", 0x0200, 0x0200, CRC(abb002fb) SHA1(c14f56b8ef103600862e7930709d293b0aa97a73) ) /* green component */ - ROM_LOAD( "ic75.13e", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ + ROM_LOAD( "a75-07.bpr", 0x0000, 0x0200, CRC(0af8b289) SHA1(6bc589e8a609b4cf450aebedc8ce02d5d45c970f) ) /* red component */ + ROM_LOAD( "a75-08.bpr", 0x0200, 0x0200, CRC(abb002fb) SHA1(c14f56b8ef103600862e7930709d293b0aa97a73) ) /* green component */ + ROM_LOAD( "a75-09.bpr", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ ROM_END -ROM_START( arkblock ) +ROM_START( arkbloc2 ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ ROM_LOAD( "block01.bin", 0x0000, 0x8000, CRC(5be667e1) SHA1(fbc5c97d836c404a2e6c007c3836e36b52ae75a1) ) ROM_LOAD( "block02.bin", 0x8000, 0x8000, CRC(4f883ef1) SHA1(cb090a57fc75f17a3e2ba637f0e3ec93c1d02cea) ) @@ -562,10 +1012,10 @@ ROM_START( arkblock ) ROM_LOAD( "a75-09.bpr", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ ROM_END -ROM_START( arkbloc2 ) +ROM_START( arkgcbl ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "ark-6.bin", 0x0000, 0x8000, CRC(0be015de) SHA1(f4209085b59d2c96a62ac9657c7bf097da55362b) ) - ROM_LOAD( "arkgc.2", 0x8000, 0x8000, CRC(9f0d4754) SHA1(731c9224616a338084edd6944c754d68eabba7f2) ) + ROM_LOAD( "arkanunk.1", 0x0000, 0x8000, CRC(b0f73900) SHA1(2c9a36cc1d2a3f33ec81d63c1c325554b818d2d3) ) + ROM_LOAD( "arkanunk.2", 0x8000, 0x8000, CRC(9827f297) SHA1(697874e73e045eb5a7bf333d7310934b239c0adf) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) ROM_LOAD( "a75-03.rom", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) ) @@ -578,10 +1028,10 @@ ROM_START( arkbloc2 ) ROM_LOAD( "a75-09.bpr", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ ROM_END -ROM_START( arkangc ) +ROM_START( paddle2 ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "arkgc.1", 0x0000, 0x8000, CRC(c54232e6) SHA1(beb759cee68009a06824b755d2aa26d7d436b5b0) ) - ROM_LOAD( "arkgc.2", 0x8000, 0x8000, CRC(9f0d4754) SHA1(731c9224616a338084edd6944c754d68eabba7f2) ) + ROM_LOAD( "paddle2.16", 0x0000, 0x8000, CRC(a286333c) SHA1(0b2c9cb0df236f327413d0c541453e1ba979ea38) ) + ROM_LOAD( "paddle2.17", 0x8000, 0x8000, CRC(04c2acb5) SHA1(7ce8ba31224f705b2b6ed0200404ef5f8f688001) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) ROM_LOAD( "a75-03.rom", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) ) @@ -594,12 +1044,44 @@ ROM_START( arkangc ) ROM_LOAD( "a75-09.bpr", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ ROM_END +ROM_START( arkatayt ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ + ROM_LOAD( "ic81-v.3f", 0x0000, 0x8000, CRC(154e2c6f) SHA1(dce3ae1ca83b5071ebec96f3ae18b96abe828ce5) ) + ROM_LOAD( "ic82-w.5f", 0x8000, 0x8000, CRC(4fa8cefa) SHA1(fb825834da9c8638e6a328784922b5dc23f16564) ) + + ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "1-ic33.2c", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) ) + ROM_LOAD( "2-ic34.3c", 0x08000, 0x8000, CRC(71fae199) SHA1(5d253c46ccf4cd2976a5fb8b8713f0f345443d06) ) + ROM_LOAD( "3-ic35.5c", 0x10000, 0x8000, CRC(c76374e2) SHA1(7520dd48de20db60a2038f134dcaa454988e7874) ) + + ROM_REGION( 0x0600, REGION_PROMS, 0 ) + ROM_LOAD( "ic73.11e", 0x0000, 0x0200, CRC(0af8b289) SHA1(6bc589e8a609b4cf450aebedc8ce02d5d45c970f) ) /* red component */ + ROM_LOAD( "ic74.12e", 0x0200, 0x0200, CRC(abb002fb) SHA1(c14f56b8ef103600862e7930709d293b0aa97a73) ) /* green component */ + ROM_LOAD( "ic75.13e", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ +ROM_END + +ROM_START( arktayt2 ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ + ROM_LOAD( "ic81.3f", 0x0000, 0x8000, CRC(6e0a2b6f) SHA1(5227d7a944cb1e815f60ec87a67f7462870ff9fe) ) + ROM_LOAD( "ic82.5f", 0x8000, 0x8000, CRC(5a97dd56) SHA1(b71c7b5ced2b0eebbcc5996dd21a1bb1c2da4819) ) + + ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "1-ic33.2c", 0x00000, 0x8000, CRC(038b74ba) SHA1(ac053cc4908b4075f918748b89570e07a0ba5116) ) + ROM_LOAD( "2-ic34.3c", 0x08000, 0x8000, CRC(71fae199) SHA1(5d253c46ccf4cd2976a5fb8b8713f0f345443d06) ) + ROM_LOAD( "3-ic35.5c", 0x10000, 0x8000, CRC(c76374e2) SHA1(7520dd48de20db60a2038f134dcaa454988e7874) ) + + ROM_REGION( 0x0600, REGION_PROMS, 0 ) + ROM_LOAD( "ic73.11e", 0x0000, 0x0200, CRC(0af8b289) SHA1(6bc589e8a609b4cf450aebedc8ce02d5d45c970f) ) /* red component */ + ROM_LOAD( "ic74.12e", 0x0200, 0x0200, CRC(abb002fb) SHA1(c14f56b8ef103600862e7930709d293b0aa97a73) ) /* green component */ + ROM_LOAD( "ic75.13e", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ +ROM_END + /* the other Dr. Korea game (Hexa, hexa.c) also appears to be derived from Arkanoid hardware */ ROM_START( tetrsark ) - ROM_REGION( 0x18000, REGION_CPU1, 0 ) /* 64k for code + 32k for banked ROM */ + ROM_REGION( 0x18000, REGION_CPU1, 0 ) /* 64k for code */ ROM_LOAD( "ic17.1", 0x00000, 0x8000, CRC(1a505eda) SHA1(92f171a12cf0c326d29c244514718df04b998426) ) - ROM_LOAD( "ic16.2", 0x08000, 0x8000, CRC(157bc4df) SHA1(b2c704148e7e3ca61ab51308ee0d66ea1088bff3) ) // it doens't care if this is here?? + ROM_LOAD( "ic16.2", 0x08000, 0x8000, CRC(157bc4df) SHA1(b2c704148e7e3ca61ab51308ee0d66ea1088bff3) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) ROM_LOAD( "ic64.3", 0x00000, 0x8000, CRC(c3e9b290) SHA1(6e99520606c654e531dbeb9a598cfbb443c24dff) ) @@ -612,15 +1094,53 @@ ROM_START( tetrsark ) ROM_LOAD( "a75-09.bpr", 0x0400, 0x0200, CRC(a7c6c277) SHA1(adaa003dcd981576ea1cc5f697d709b2d6b2ea29) ) /* blue component */ ROM_END + /* Driver Initialization */ +static void arkanoid_bootleg_init( void ) +{ + memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xf002, 0xf002, 0, 0, arkanoid_bootleg_f002_r ); + memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xd018, 0xd018, 0, 0, arkanoid_bootleg_d018_w ); + memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xd008, 0xd008, 0, 0, arkanoid_bootleg_d008_r ); +} + +static DRIVER_INIT( arkangc ) +{ + arkanoid_bootleg_id = ARKANGC; + arkanoid_bootleg_init(); +} + +static DRIVER_INIT( arkangc2 ) +{ + arkanoid_bootleg_id = ARKANGC2; + arkanoid_bootleg_init(); +} + +static DRIVER_INIT( arkblock ) +{ + arkanoid_bootleg_id = ARKBLOCK; + arkanoid_bootleg_init(); +} + +static DRIVER_INIT( arkbloc2 ) +{ + arkanoid_bootleg_id = ARKBLOC2; + arkanoid_bootleg_init(); +} + +static DRIVER_INIT( arkgcbl ) +{ + arkanoid_bootleg_id = ARKGCBL; + arkanoid_bootleg_init(); +} + static DRIVER_INIT( paddle2 ) { - memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xf002, 0xf002, 0, 0, paddle2_prot_r ); - memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xd018, 0xd018, 0, 0, paddle2_prot_w ); - memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xd008, 0xd008, 0, 0, paddle2_track_kludge_r ); + arkanoid_bootleg_id = PADDLE2; + arkanoid_bootleg_init(); } + static DRIVER_INIT( tetrsark ) { unsigned char *ROM = memory_region(REGION_CPU1); @@ -632,18 +1152,23 @@ static DRIVER_INIT( tetrsark ) } } + /* Game Drivers */ -GAME( 1986, arkanoid, 0, arkanoid, arkanoid, 0, ROT90, "Taito Corporation Japan", "Arkanoid (World)", GAME_SUPPORTS_SAVE ) -GAME( 1986, arknoidu, arkanoid, arkanoid, arkanoid, 0, ROT90, "Taito America Corporation (Romstar license)", "Arkanoid (US)", GAME_SUPPORTS_SAVE ) -GAME( 1986, arknoiuo, arkanoid, arkanoid, arkanoid, 0, ROT90, "Taito America Corporation (Romstar license)", "Arkanoid (US, older)", GAME_SUPPORTS_SAVE ) -GAME( 1986, arknoidj, arkanoid, arkanoid, arknoidj, 0, ROT90, "Taito Corporation", "Arkanoid (Japan)", GAME_SUPPORTS_SAVE ) -GAME( 1986, arkbl2, arkanoid, arkanoid, arknoidj, 0, ROT90, "bootleg", "Arkanoid (Japanese bootleg Set 2)", GAME_NOT_WORKING ) -GAME( 1986, arkbl3, arkanoid, bootleg, arknoidj, paddle2, ROT90, "bootleg", "Arkanoid (Japanese bootleg Set 3)", GAME_NOT_WORKING ) -GAME( 1988, paddle2, arkanoid, bootleg, arknoidj, paddle2, ROT90, "bootleg", "Paddle 2", GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE ) -GAME( 1986, arkatayt, arkanoid, bootleg, arkatayt, 0, ROT90, "bootleg", "Arkanoid (Tayto bootleg, Japanese)", GAME_SUPPORTS_SAVE ) -GAME( 1986, arkblock, arkanoid, bootleg, arknoidj, 0, ROT90, "bootleg", "Block (bootleg, Japanese)", GAME_NOT_WORKING ) -GAME( 1986, arkbloc2, arkanoid, bootleg, arknoidj, 0, ROT90, "bootleg", "Block (Game Corporation bootleg)", GAME_SUPPORTS_SAVE ) -GAME( 1986, arkangc, arkanoid, bootleg, arknoidj, 0, ROT90, "bootleg", "Arkanoid (Game Corporation bootleg)", GAME_SUPPORTS_SAVE ) -GAME( 1987, arkatour, arkanoid, arkanoid, arkanoid, 0, ROT90, "Taito America Corporation (Romstar license)", "Tournament Arkanoid (US)", GAME_SUPPORTS_SAVE ) -GAME( 19??, tetrsark, 0, bootleg, tetrsark, tetrsark,ROT0, "D.R. Korea", "Tetris (D.R. Korea)", GAME_SUPPORTS_SAVE | GAME_WRONG_COLORS ) +GAME( 1986, arkanoid, 0, arkanoid, arkanoid, 0, ROT90, "Taito Corporation Japan", "Arkanoid (World)", GAME_SUPPORTS_SAVE ) +GAME( 1986, arknoidu, arkanoid, arkanoid, arkanoid, 0, ROT90, "Taito America Corporation (Romstar license)", "Arkanoid (US)", GAME_SUPPORTS_SAVE ) +GAME( 1986, arknoiuo, arkanoid, arkanoid, arkanoid, 0, ROT90, "Taito America Corporation (Romstar license)", "Arkanoid (US, older)", GAME_SUPPORTS_SAVE ) +GAME( 1986, arknoidj, arkanoid, arkanoid, arknoidj, 0, ROT90, "Taito Corporation", "Arkanoid (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1986, arkmcubl, arkanoid, arkanoid, arknoidj, 0, ROT90, "bootleg", "Arkanoid (bootleg with MCU)", GAME_SUPPORTS_SAVE ) +GAME( 1986, ark1ball, arkanoid, arkanoid, ark1ball, 0, ROT90, "bootleg", "Arkanoid (bootleg with MCU, harder)", GAME_SUPPORTS_SAVE ) +GAME( 1986, arkangc, arkanoid, bootleg, arkangc, arkangc, ROT90, "bootleg", "Arkanoid (Game Corporation bootleg, set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1986, arkangc2, arkanoid, bootleg, arkangc2, arkangc2, ROT90, "bootleg", "Arkanoid (Game Corporation bootleg, set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1986, arkblock, arkanoid, bootleg, arkangc, arkblock, ROT90, "bootleg", "Block (Game Corporation bootleg, set 1)", GAME_SUPPORTS_SAVE ) +GAME( 1986, arkbloc2, arkanoid, bootleg, arkangc, arkbloc2, ROT90, "bootleg", "Block (Game Corporation bootleg, set 2)", GAME_SUPPORTS_SAVE ) +GAME( 1986, arkgcbl, arkanoid, bootleg, arkgcbl, arkgcbl, ROT90, "bootleg", "Arkanoid (bootleg on Block hardware)", GAME_SUPPORTS_SAVE ) +GAME( 1988, paddle2, arkanoid, bootleg, paddle2, paddle2, ROT90, "bootleg", "Paddle 2 (bootleg on Block hardware)", GAME_SUPPORTS_SAVE ) +GAME( 1986, arkatayt, arkanoid, bootleg, arknoidj, 0, ROT90, "bootleg", "Arkanoid (Tayto bootleg)", GAME_SUPPORTS_SAVE ) +GAME( 1986, arktayt2, arkanoid, bootleg, arktayt2, 0, ROT90, "bootleg", "Arkanoid (Tayto bootleg, harder)", GAME_SUPPORTS_SAVE ) +GAME( 1987, arkatour, arkanoid, arkanoid, arkanoid, 0, ROT90, "Taito America Corporation (Romstar license)", "Tournament Arkanoid (US)", GAME_SUPPORTS_SAVE ) +GAME( 19??, tetrsark, 0, bootleg, tetrsark, tetrsark, ROT0, "D.R. Korea", "Tetris (D.R. Korea)", GAME_SUPPORTS_SAVE | GAME_WRONG_COLORS ) + diff --git a/src/drivers/artmagic.c b/src/drivers/artmagic.c index 76e80bb42..dcf52b34b 100644 --- a/src/drivers/artmagic.c +++ b/src/drivers/artmagic.c @@ -155,7 +155,7 @@ static void ultennis_protection(void) { case 0x00: /* reset */ prot_input_index = prot_output_index = 0; - prot_output[0] = mame_rand(); + prot_output[0] = mame_rand(Machine); break; case 0x01: /* 01 aaaa bbbb cccc dddd (xxxx) */ @@ -245,7 +245,7 @@ static void cheesech_protection(void) { case 0x00: /* reset */ prot_input_index = prot_output_index = 0; - prot_output[0] = mame_rand(); + prot_output[0] = mame_rand(Machine); break; case 0x01: /* 01 aaaa bbbb (xxxx) */ diff --git a/src/drivers/asteroid.c b/src/drivers/asteroid.c index 2256e22f6..8db570fe9 100644 --- a/src/drivers/asteroid.c +++ b/src/drivers/asteroid.c @@ -10,6 +10,26 @@ Known bugs: * the ERROR message in Asteroids Deluxe self test is related to a pokey problem +Information from a Tech Tip: + +Asteroids Modification: + +As a result of inquires regarding the achievement of extremely high scores on Asteroids, +we have developed a modification that will accomplish the following: + When the small flying saucer enters the screen, it fires immediately in the direction + of the player. The missiles also have a wraparound capability. + Originally, the program was entered so that the saucer would go one-sixth of the way + across the screen before firing, without the wraparound capability. + +There are two revisions currently in the field, ROM revision 02 has the flip-flop capability, + version 01 does not. +Kits are available immediately from your Atari Distributor. To determine which kit you + require, check ROMs on your Asteroids PCB. If ROM code is "-01" order kit no. 08-0303009. + If ROM code is "-02", order no. 08-0303008. + +*** It looks like both current sets are the older "easier" version. We need dumps of the updates + for both sets. + Asteroids-deluxe state-prom added by HIGHWAYMAN. The prom pcb location is:C8 and is 256x4 (i need to update the dump, this one is read in 8bit-mode) @@ -148,6 +168,9 @@ #include "sound/discrete.h" #include "sound/pokey.h" +#define MASTER_CLOCK (12096000) +#define CLOCK_3KHZ (MASTER_CLOCK / 4096) + /************************************* * * Coin counters @@ -188,7 +211,9 @@ static WRITE8_HANDLER( llander_led_w ) static ADDRESS_MAP_START( asteroid_map, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(15) ) - AM_RANGE(0x0000, 0x03ff) AM_RAM + AM_RANGE(0x0000, 0x01ff) AM_RAM + AM_RANGE(0x0200, 0x02ff) AM_RAM AM_RAMBANK(1) AM_BASE(&asteroid_ram1) + AM_RANGE(0x0300, 0x03ff) AM_RAM AM_RAMBANK(2) AM_BASE(&asteroid_ram2) AM_RANGE(0x2000, 0x2007) AM_READ(asteroid_IN0_r) /* IN0 */ AM_RANGE(0x2400, 0x2407) AM_READ(asteroid_IN1_r) /* IN1 */ AM_RANGE(0x2800, 0x2803) AM_READ(asteroid_DSW1_r) /* DSW1 */ @@ -207,7 +232,9 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( astdelux_map, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(15) ) - AM_RANGE(0x0000, 0x03ff) AM_RAM + AM_RANGE(0x0000, 0x01ff) AM_RAM + AM_RANGE(0x0200, 0x02ff) AM_RAM AM_RAMBANK(1) AM_BASE(&asteroid_ram1) + AM_RANGE(0x0300, 0x03ff) AM_RAM AM_RAMBANK(2) AM_BASE(&asteroid_ram2) AM_RANGE(0x2000, 0x2007) AM_READ(asteroid_IN0_r) /* IN0 */ AM_RANGE(0x2400, 0x2407) AM_READ(asteroid_IN1_r) /* IN1 */ AM_RANGE(0x2800, 0x2803) AM_READ(asteroid_DSW1_r) /* DSW1 */ @@ -231,7 +258,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( llander_map, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(15) ) - AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x100) AM_RAM + AM_RANGE(0x0000, 0x00ff) AM_RAM AM_MIRROR(0x1f00) AM_RANGE(0x2000, 0x2000) AM_READ(llander_IN0_r) /* IN0 */ AM_RANGE(0x2400, 0x2407) AM_READ(asteroid_IN1_r) /* IN1 */ AM_RANGE(0x2800, 0x2803) AM_READ(asteroid_DSW1_r) /* DSW1 */ @@ -595,9 +622,9 @@ static struct POKEYinterface pokey_interface = static MACHINE_DRIVER_START( asteroid ) /* basic machine hardware */ - MDRV_CPU_ADD_TAG("main", M6502, 1500000) + MDRV_CPU_ADD_TAG("main", M6502, MASTER_CLOCK/8) MDRV_CPU_PROGRAM_MAP(asteroid_map,0) - MDRV_CPU_VBLANK_INT(asteroid_interrupt,4) /* 250 Hz */ + MDRV_CPU_PERIODIC_INT(asteroid_interrupt, TIME_IN_HZ(CLOCK_3KHZ / 12)) MDRV_FRAMES_PER_SECOND(60) MDRV_MACHINE_RESET(asteroid) @@ -605,10 +632,9 @@ static MACHINE_DRIVER_START( asteroid ) /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_VECTOR | VIDEO_RGB_DIRECT) MDRV_SCREEN_SIZE(400,300) - MDRV_VISIBLE_AREA(0, 1040, 70, 950) + MDRV_VISIBLE_AREA(0, 1044, 0, 800) MDRV_PALETTE_LENGTH(32768) - MDRV_PALETTE_INIT(avg_white) MDRV_VIDEO_START(dvg) MDRV_VIDEO_UPDATE(vector) @@ -625,7 +651,7 @@ static MACHINE_DRIVER_START( asterock ) /* basic machine hardware */ MDRV_IMPORT_FROM(asteroid) MDRV_CPU_MODIFY("main") - MDRV_CPU_VBLANK_INT(asterock_interrupt,4) /* 250 Hz */ + MDRV_CPU_PERIODIC_INT(asterock_interrupt, TIME_IN_HZ(CLOCK_3KHZ / 12)) MACHINE_DRIVER_END @@ -643,7 +669,7 @@ static MACHINE_DRIVER_START( astdelux ) MDRV_SOUND_CONFIG(astdelux_discrete_interface) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) - MDRV_SOUND_ADD(POKEY, 1500000) + MDRV_SOUND_ADD(POKEY, MASTER_CLOCK/8) MDRV_SOUND_CONFIG(pokey_interface) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_DRIVER_END @@ -655,15 +681,12 @@ static MACHINE_DRIVER_START( llander ) MDRV_IMPORT_FROM(asteroid) MDRV_CPU_MODIFY("main") MDRV_CPU_PROGRAM_MAP(llander_map,0) - MDRV_CPU_VBLANK_INT(llander_interrupt,6) /* 250 Hz */ + MDRV_CPU_PERIODIC_INT(llander_interrupt, TIME_IN_HZ(CLOCK_3KHZ / 12)) MDRV_FRAMES_PER_SECOND(40) - MDRV_MACHINE_RESET(NULL) + MDRV_MACHINE_RESET(avgdvg) - /* video hardware */ - MDRV_VISIBLE_AREA(0, 1050, 0, 900) - - MDRV_PALETTE_INIT(avg_white) + MDRV_VISIBLE_AREA(0, 1023, 0, 1023) MDRV_VIDEO_START(dvg) MDRV_VIDEO_UPDATE(vector) @@ -688,6 +711,10 @@ ROM_START( asteroid ) ROM_LOAD( "035143.02", 0x7800, 0x0800, CRC(312caa02) SHA1(1ce2eac1ab90b972e3f1fc3d250908f26328d6cb) ) /* Vector ROM */ ROM_LOAD( "035127.02", 0x5000, 0x0800, CRC(8b71fd9e) SHA1(8cd5005e531eafa361d6b7e9eed159d164776c70) ) + /* DVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "034602-01.c8", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) + ROM_END ROM_START( asteroi1 ) @@ -697,6 +724,9 @@ ROM_START( asteroi1 ) ROM_LOAD( "035143.01", 0x7800, 0x0800, CRC(7d4e3d05) SHA1(d88000e904e158efde50e453e2889ecd2cb95f24) ) /* Vector ROM */ ROM_LOAD( "035127.01", 0x5000, 0x0800, CRC(99699366) SHA1(9b2828fc1cef7727f65fa65e1e11e309b7c98792) ) + /* DVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "034602-01.c8", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) ROM_END ROM_START( asteroib ) @@ -706,6 +736,9 @@ ROM_START( asteroib ) ROM_LOAD( "035143ll.bin", 0x7800, 0x0800, CRC(6b1d8594) SHA1(ff3cd93f1bc5734bface285e442125b395602d7d) ) /* Vector ROM */ ROM_LOAD( "035127.02", 0x5000, 0x0800, CRC(8b71fd9e) SHA1(8cd5005e531eafa361d6b7e9eed159d164776c70) ) + /* DVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "034602-01.c8", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) ROM_END ROM_START( asterock ) @@ -719,6 +752,9 @@ ROM_START( asterock ) /* Vector ROM */ ROM_LOAD( "sidamas.0", 0x5000, 0x0400, CRC(6bd2053f) SHA1(790f2858f44bbb1854e2d9d549e29f4815c4665b) ) ROM_LOAD( "sidamas.1", 0x5400, 0x0400, CRC(231ce201) SHA1(710f4c19864d725ba1c9ea447a97e84001a679f7) ) + /* DVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "034602-01.c8", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) ROM_END ROM_START( meteorts ) @@ -728,6 +764,9 @@ ROM_START( meteorts ) ROM_LOAD( "m2_j1.bin", 0x7800, 0x0800, CRC(64bd0408) SHA1(141d053cb4cce3fece98293136928b527d3ade0f) ) /* Vector ROM */ ROM_LOAD( "mv_np3.bin", 0x5000, 0x0800, CRC(11d1c4ae) SHA1(433c2c05b92094bbe102c356d7f1a907db13da67) ) + /* DVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "034602-01.c8", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) ROM_END @@ -741,8 +780,8 @@ ROM_START( astdelux ) ROM_LOAD( "036800.02", 0x4800, 0x0800, CRC(bb8cabe1) SHA1(cebaa1b91b96e8b80f2b2c17c6fd31fa9f156386) ) ROM_LOAD( "036799.01", 0x5000, 0x0800, CRC(7d511572) SHA1(1956a12bccb5d3a84ce0c1cc10c6ad7f64e30b40) ) - ROM_REGION( 0x0100, REGION_PROMS, 0 ) - ROM_LOAD( "034602.bin", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "034602-01.c8", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) ROM_END ROM_START( astdelu2 ) @@ -756,7 +795,7 @@ ROM_START( astdelu2 ) ROM_LOAD( "036799.01", 0x5000, 0x0800, CRC(7d511572) SHA1(1956a12bccb5d3a84ce0c1cc10c6ad7f64e30b40) ) ROM_REGION( 0x0100, REGION_PROMS, 0 ) - ROM_LOAD( "034602.bin", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) + ROM_LOAD( "034602-01.c8", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) ROM_END /*************************************************************************** @@ -808,7 +847,7 @@ ROM_START( astdelu1 ) ROM_LOAD( "036799.01", 0x5000, 0x0800, CRC(7d511572) SHA1(1956a12bccb5d3a84ce0c1cc10c6ad7f64e30b40) ) ROM_REGION( 0x0100, REGION_PROMS, 0 ) - ROM_LOAD( "034602.bin", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) + ROM_LOAD( "034602-01.c8", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) ROM_END @@ -824,6 +863,10 @@ ROM_START( llander ) /* This _should_ be the rom for international versions. */ /* Unfortunately, is it not currently available. */ ROM_LOAD( "034597.01", 0x5800, 0x0800, NO_DUMP ) + + /* DVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "034602-01.c8", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) ROM_END ROM_START( llander1 ) @@ -838,6 +881,10 @@ ROM_START( llander1 ) /* This _should_ be the rom for international versions. */ /* Unfortunately, is it not currently available. */ ROM_LOAD( "034597.01", 0x5800, 0x0800, NO_DUMP ) + + /* DVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "034602-01.c8", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) ROM_END diff --git a/src/drivers/astinvad.c b/src/drivers/astinvad.c index 9e25851bd..72dc5d6b4 100644 --- a/src/drivers/astinvad.c +++ b/src/drivers/astinvad.c @@ -40,12 +40,7 @@ static PALETTE_INIT( astinvad ) int i; for (i = 0; i < 8; i++) - { - palette_set_color(i, - (i & 1) ? 0xff : 0, - (i & 4) ? 0xff : 0, - (i & 2) ? 0xff : 0); - } + palette_set_color(machine, i, pal1bit(i >> 0), pal1bit(i >> 2), pal1bit(i >> 1)); } diff --git a/src/drivers/astrocde.c b/src/drivers/astrocde.c index 109d8fd6e..3aa744327 100644 --- a/src/drivers/astrocde.c +++ b/src/drivers/astrocde.c @@ -590,12 +590,12 @@ INPUT_PORTS_START( robby ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START_TAG("DSW") - PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unknown ) ) - 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( 0x01, 0x01, "Use NVRAM" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x02, 0x02, "Use Service Mode Settings" ) + PORT_DIPSETTING( 0x00, "Reset" ) + PORT_DIPSETTING( 0x02, DEF_STR( Yes ) ) PORT_DIPNAME( 0x04, 0x04, DEF_STR( Free_Play ) ) PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -681,7 +681,7 @@ INPUT_PORTS_START( profpac ) PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x01, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x02, 0x00, "Reset on powerup" ) + PORT_DIPNAME( 0x02, 0x02, "Reset on powerup" ) PORT_DIPSETTING( 0x02, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_DIPNAME( 0x04, 0x00, "Halt on error" ) @@ -693,7 +693,15 @@ INPUT_PORTS_START( profpac ) PORT_DIPNAME( 0x10, 0x10, "ROM" ) PORT_DIPSETTING( 0x10, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0xe0, 0xe0, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) INPUT_PORTS_END diff --git a/src/drivers/astrof.c b/src/drivers/astrof.c index 42fe80cc3..7a0df8183 100644 --- a/src/drivers/astrof.c +++ b/src/drivers/astrof.c @@ -67,7 +67,7 @@ static int abattle_count; static READ8_HANDLER( shoot_r ) { /* not really sure about this */ - return mame_rand() & 8; + return mame_rand(Machine) & 8; } static READ8_HANDLER( abattle_coin_prot_r ) { @@ -471,6 +471,8 @@ ROM_START( afire ) ROM_LOAD( "astrf.clr", 0x0000, 0x0020, CRC(61329fd1) SHA1(15782d8757d4dda5a8b97815e94c90218f0e08dd) ) ROM_END +/* This is a newer revision of "Astro Combat" (most probably manufactured by Sidam), + with correct spelling for FUEL and the main boss sporting "CB". */ ROM_START( acombat ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ ROM_LOAD( "b.bin", 0xd000, 0x0400, CRC(16ad2bcc) SHA1(e7f55d17ee18afbb045cd0fd8d3ffc0c8300130a) ) @@ -490,6 +492,27 @@ ROM_START( acombat ) ROM_LOAD( "astrf.clr", 0x0000, 0x0020, CRC(61329fd1) SHA1(15782d8757d4dda5a8b97815e94c90218f0e08dd) ) ROM_END +/* It is on older revision of "Astro Combat" (most probably manufactured by Sidam), + with incorrect spelling for fuel as FLUEL and the main boss sporting "PZ" */ +ROM_START( acombato ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ + ROM_LOAD( "b.bin", 0xd000, 0x0400, CRC(16ad2bcc) SHA1(e7f55d17ee18afbb045cd0fd8d3ffc0c8300130a) ) + ROM_LOAD( "a.bin", 0xd400, 0x0400, CRC(ce8b6e4f) SHA1(b85ab709d80324df5d2c4b0dbbc5e6aeb4003077) ) + ROM_LOAD( "9.bin", 0xd800, 0x0400, CRC(e0f45b07) SHA1(091e1ea4b3726888dc488bb01e0bd4e588eccae5) ) + ROM_LOAD( "8.bin", 0xdc00, 0x0400, CRC(85b96728) SHA1(dbbfbc085f19184d861c42a0307f95f9105a677b) ) + ROM_LOAD( "4.bin", 0xe000, 0x0400, CRC(271f90ad) SHA1(fe41a0f35d30d38fc21ac19982899d93cbd292f0) ) + ROM_LOAD( "6.bin", 0xe400, 0x0400, CRC(568efbfe) SHA1(ef39f0fc4c030fc7f688515415aedeb4c039b73a) ) + ROM_LOAD( "5.bin", 0xe800, 0x0400, CRC(1c0b298a) SHA1(61677f8f402679fcfbb9fb12f9dfde7b6e1cdd1c) ) + ROM_LOAD( "3.bin", 0xec00, 0x0400, CRC(2938c641) SHA1(c8655a8218818c12eca0f00a361412e4946f8b5c) ) + ROM_LOAD( "7.bin", 0xf000, 0x0400, CRC(912c8fe1) SHA1(1ae1eb13858d39200386f59c3381eef2699e4647) ) + ROM_LOAD( "1a", 0xf400, 0x0400, CRC(7193f999) SHA1(13ddeddb1f22cae973102203ab4917b1407b6401) ) + ROM_LOAD( "2a", 0xf800, 0x0400, CRC(3b6ccbbe) SHA1(f9cf023557ee769bcb92df808628a39630b258f2) ) + ROM_LOAD( "0", 0xfc00, 0x0400, CRC(c4f3eaad) SHA1(51f03f35c45ac00a7f38fd97386be92bcb562ca2) ) + + ROM_REGION( 0x0020, REGION_PROMS, 0 ) + ROM_LOAD( "astrf.clr", 0x0000, 0x0020, CRC(61329fd1) SHA1(15782d8757d4dda5a8b97815e94c90218f0e08dd) ) +ROM_END + ROM_START( sstarbtl ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ ROM_LOAD( "b.bin", 0xd000, 0x0400, CRC(16ad2bcc) SHA1(e7f55d17ee18afbb045cd0fd8d3ffc0c8300130a) ) @@ -590,7 +613,8 @@ GAME( 1979, astrof3, astrof, astrof, astrof, 0, ROT90, "Data East", " GAME( 1979, abattle, astrof, abattle, abattle, abattle, ROT90, "Sidam", "Astro Battle (set 1)", 0 ) GAME( 1979, abattle2, astrof, abattle, abattle, abattle, ROT90, "Sidam", "Astro Battle (set 2)", 0 ) GAME( 1979, afire, astrof, abattle, abattle, afire, ROT90, "Rene Pierre", "Astro Fire", 0 ) -GAME( 1979, acombat, astrof, abattle, abattle, afire, ROT90, "bootleg", "Astro Combat", 0 ) +GAME( 1979, acombat, astrof, abattle, abattle, afire, ROT90, "bootleg", "Astro Combat (newer, CB)", 0 ) +GAME( 1979, acombato, astrof, abattle, abattle, afire, ROT90, "bootleg", "Astro Combat (older, PZ)", 0 ) GAME( 1979, sstarbtl, astrof, abattle, abattle, sstarbtl,ROT90, "bootleg", "Super Star Battle", 0 ) GAME( 1980, tomahawk, 0, tomahawk, tomahawk, 0, ROT90, "Data East", "Tomahawk 777 (Revision 1)", GAME_NO_SOUND ) GAME( 1980, tomahaw5, tomahawk, tomahawk, tomahawk, 0, ROT90, "Data East", "Tomahawk 777 (Revision 5)", GAME_NO_SOUND ) diff --git a/src/drivers/asuka.c b/src/drivers/asuka.c index dcd2261d2..dde2f80fc 100644 --- a/src/drivers/asuka.c +++ b/src/drivers/asuka.c @@ -1030,7 +1030,7 @@ static MACHINE_DRIVER_START( bonzeadv ) MDRV_INTERLEAVE(10) /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_BUFFERS_SPRITERAM) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_SCREEN_SIZE(40*8, 32*8) MDRV_VISIBLE_AREA(0*8, 40*8-1, 3*8, 31*8-1) MDRV_GFXDECODE(gfxdecodeinfo) @@ -1065,7 +1065,7 @@ static MACHINE_DRIVER_START( asuka ) MDRV_INTERLEAVE(10) /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_BUFFERS_SPRITERAM) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_SCREEN_SIZE(40*8, 32*8) MDRV_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) MDRV_GFXDECODE(gfxdecodeinfo) @@ -1103,7 +1103,7 @@ static MACHINE_DRIVER_START( cadash ) MDRV_INTERLEAVE(10) /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_BUFFERS_SPRITERAM) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_SCREEN_SIZE(40*8, 32*8) MDRV_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) MDRV_GFXDECODE(gfxdecodeinfo) @@ -1137,7 +1137,7 @@ static MACHINE_DRIVER_START( mofflott ) MDRV_INTERLEAVE(10) /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_BUFFERS_SPRITERAM) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_SCREEN_SIZE(40*8, 32*8) MDRV_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) MDRV_GFXDECODE(gfxdecodeinfo) @@ -1175,7 +1175,7 @@ static MACHINE_DRIVER_START( galmedes ) MDRV_INTERLEAVE(10) /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_BUFFERS_SPRITERAM) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_SCREEN_SIZE(40*8, 32*8) MDRV_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) MDRV_GFXDECODE(gfxdecodeinfo) @@ -1209,7 +1209,7 @@ static MACHINE_DRIVER_START( eto ) MDRV_INTERLEAVE(10) /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_BUFFERS_SPRITERAM) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_SCREEN_SIZE(40*8, 32*8) MDRV_VISIBLE_AREA(0*8, 40*8-1, 2*8, 32*8-1) MDRV_GFXDECODE(gfxdecodeinfo) diff --git a/src/drivers/atarifb.c b/src/drivers/atarifb.c index 653b80196..1e20cfb87 100644 --- a/src/drivers/atarifb.c +++ b/src/drivers/atarifb.c @@ -133,10 +133,10 @@ static const unsigned short colortable_source[] = static PALETTE_INIT( atarifb ) { - palette_set_color(0,0x00,0x00,0x00); /* black */ - palette_set_color(1,0x80,0x80,0x80); /* grey */ - palette_set_color(2,0xff,0xff,0xff); /* white */ - palette_set_color(3,0x40,0x40,0x40); /* dark grey (?) - used in Soccer only */ + palette_set_color(machine,0,0x00,0x00,0x00); /* black */ + palette_set_color(machine,1,0x80,0x80,0x80); /* grey */ + palette_set_color(machine,2,0xff,0xff,0xff); /* white */ + palette_set_color(machine,3,0x40,0x40,0x40); /* dark grey (?) - used in Soccer only */ memcpy(colortable,colortable_source,sizeof(colortable_source)); } diff --git a/src/drivers/atarig1.c b/src/drivers/atarig1.c index afde069ab..c462babb9 100644 --- a/src/drivers/atarig1.c +++ b/src/drivers/atarig1.c @@ -257,6 +257,8 @@ INPUT_PORTS_START( hydra ) PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(100) PORT_KEYDELTA(16) JSA_II_PORT /* audio board port */ + PORT_MODIFY( "JSAII" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END @@ -303,6 +305,8 @@ INPUT_PORTS_START( pitfight ) PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED ) JSA_II_PORT /* audio board port */ + PORT_MODIFY( "JSAII" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END @@ -341,6 +345,8 @@ INPUT_PORTS_START( pitfighj ) PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED ) JSA_II_PORT /* audio board port */ + PORT_MODIFY( "JSAII" ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END diff --git a/src/drivers/attckufo.c b/src/drivers/attckufo.c index e85f433e3..d9a279038 100644 --- a/src/drivers/attckufo.c +++ b/src/drivers/attckufo.c @@ -56,7 +56,7 @@ static UINT8 *tileram; static PALETTE_INIT( attckufo ) { - palette_set_colors(0, attckufo_palette, sizeof(attckufo_palette) / 3); + palette_set_colors(machine, 0, attckufo_palette, sizeof(attckufo_palette) / 3); } int attckufo_dma_read (int offset) diff --git a/src/drivers/avalnche.c b/src/drivers/avalnche.c index 3eadf83e0..09a8484c3 100644 --- a/src/drivers/avalnche.c +++ b/src/drivers/avalnche.c @@ -44,8 +44,8 @@ static PALETTE_INIT( avalnche ) { /* 2 colors in the palette: black & white */ - palette_set_color(0,0x00,0x00,0x00); - palette_set_color(1,0xff,0xff,0xff); + palette_set_color(machine,0,0x00,0x00,0x00); + palette_set_color(machine,1,0xff,0xff,0xff); } diff --git a/src/drivers/backfire.c b/src/drivers/backfire.c index 4dd3c6a65..026ec245e 100644 --- a/src/drivers/backfire.c +++ b/src/drivers/backfire.c @@ -263,15 +263,8 @@ static WRITE32_HANDLER(backfire_eeprom_w) static WRITE32_HANDLER(wcvol95_nonbuffered_palette_w) { - int r,g,b; - COMBINE_DATA(&paletteram32[offset]); - - b = (paletteram32[offset] >>10) & 0x1f; - g = (paletteram32[offset] >> 5) & 0x1f; - r = (paletteram32[offset] >> 0) & 0x1f; - - palette_set_color(offset,r<<3,g<<3,b<<3); + palette_set_color(Machine,offset,pal5bit(paletteram32[offset] >> 0),pal5bit(paletteram32[offset] >> 5),pal5bit(paletteram32[offset] >> 10)); } @@ -318,12 +311,12 @@ READ32_HANDLER( backfire_unknown_wheel_r ) READ32_HANDLER( backfire_wheel1_r ) { - return mame_rand(); + return mame_rand(Machine); } READ32_HANDLER( backfire_wheel2_r ) { - return mame_rand(); + return mame_rand(Machine); } diff --git a/src/drivers/bagman.c b/src/drivers/bagman.c index 03140cc0d..5cb42de85 100644 --- a/src/drivers/bagman.c +++ b/src/drivers/bagman.c @@ -459,6 +459,53 @@ INPUT_PORTS_START( pickin ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) INPUT_PORTS_END +INPUT_PORTS_START( botanic ) + PORT_START /* IN0 */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) + + PORT_START /* IN1 */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN4 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + + PORT_START /* DSW */ + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x00, "2" ) + PORT_DIPSETTING( 0x03, "3" ) + PORT_DIPSETTING( 0x02, "4" ) + PORT_DIPSETTING( 0x01, "5" ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Coinage ) ) + PORT_DIPSETTING( 0x04, "2C/1C 1C/1C 1C/3C 1C/7C" ) + PORT_DIPSETTING( 0x00, "1C/1C 1C/2C 1C/6C 1C/14C" ) + PORT_DIPNAME( 0x08, 0x08, "Invulnerability Fruits" ) + PORT_DIPSETTING( 0x08, "3" ) + PORT_DIPSETTING( 0x00, DEF_STR( None ) ) + 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( Cabinet ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) +INPUT_PORTS_END + static const gfx_layout charlayout = @@ -907,5 +954,5 @@ GAME( 1982, bagmans2, bagman, bagman, bagman, 0, ROT270, "Valadon Auto GAME( 1984, sbagman, 0, bagman, sbagman, 0, ROT270, "Valadon Automation", "Super Bagman", 0 ) GAME( 1984, sbagmans, sbagman, bagman, sbagman, 0, ROT270, "Valadon Automation (Stern license)", "Super Bagman (Stern)", 0 ) GAME( 1983, pickin, 0, pickin, pickin, 0, ROT270, "Valadon Automation", "Pickin'", 0 ) -GAME( 1984, botanic, 0, botanic, pickin, 0, ROT270, "Valadon Automation (Itisa license)", "Botanic", 0 ) +GAME( 1984, botanic, 0, botanic, botanic, 0, ROT270, "Valadon Automation (Itisa license)", "Botanic", 0 ) diff --git a/src/drivers/balsente.c b/src/drivers/balsente.c index 7caa0347f..da20b6854 100644 --- a/src/drivers/balsente.c +++ b/src/drivers/balsente.c @@ -1736,9 +1736,6 @@ static MACHINE_DRIVER_START( shrike ) MDRV_CPU_PROGRAM_MAP(shrike68k_map,0) MDRV_INTERLEAVE(100) - - /* video hardware */ - MDRV_PALETTE_LENGTH(1025) MACHINE_DRIVER_END diff --git a/src/drivers/beaminv.c b/src/drivers/beaminv.c index 9eefb9813..a4b368cc6 100644 --- a/src/drivers/beaminv.c +++ b/src/drivers/beaminv.c @@ -154,6 +154,18 @@ ROM_START( beaminv ) ROM_LOAD( "5a", 0x1400, 0x0400, CRC(ec08bc1f) SHA1(e1df6704298e470a77158740c275fdca105e8f69) ) ROM_END +ROM_START( beaminva ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "rom_0", 0x0000, 0x0400, CRC(67e100dd) SHA1(5f58e2ed3da14c48f7c382ee6091a59caf8e0609) ) + ROM_LOAD( "rom_1", 0x0400, 0x0400, CRC(442bbe98) SHA1(0e0382d4f6491629449759747019bd453a458b66) ) + ROM_LOAD( "rom_2", 0x0800, 0x0400, CRC(5d5d2f68) SHA1(e363f9445bbba1492188efe1830cae96f6078878) ) + ROM_LOAD( "rom_3", 0x0c00, 0x0400, CRC(527906b8) SHA1(9bda7da653db64246597ca386adab4cbab319189) ) + ROM_LOAD( "rom_4", 0x1000, 0x0400, CRC(920bb3f0) SHA1(3b9897d31c551e0b9193f775a6be65376b4a8c34) ) + ROM_LOAD( "rom_5", 0x1400, 0x0400, CRC(3f6980e4) SHA1(cb73cbc474677e6e302cb3842f32923ef2cdc98d) ) +ROM_END + + + /************************************* * @@ -161,4 +173,5 @@ ROM_END * *************************************/ -GAME( 19??, beaminv, 0, beaminv, beaminv, 0, ROT0, "Tekunon Kougyou", "Beam Invader", GAME_NO_SOUND) +GAME( 19??, beaminv, 0 , beaminv, beaminv, 0, ROT0, "Tekunon Kougyou", "Beam Invader", GAME_NO_SOUND) +GAME( 1979, beaminva, beaminv, beaminv, beaminv, 0, ROT0, "Tekunon Kougyou", "Beam Invader (set 2)", GAME_NO_SOUND) // what's the real title? diff --git a/src/drivers/bfm_sc2.c b/src/drivers/bfm_sc2.c index 9ebd665f1..25f73df52 100644 --- a/src/drivers/bfm_sc2.c +++ b/src/drivers/bfm_sc2.c @@ -553,7 +553,7 @@ static INTERRUPT_GEN( timer_irq ) watchdog_cnt++; if ( watchdog_cnt > 2 ) // this is a hack, i don't know what the watchdog timeout is, 3 IRQ's works fine { // reset board - mame_schedule_soft_reset(); // reset entire machine. CPU 0 should be enough, but that doesn't seem to work !! + mame_schedule_soft_reset(Machine); // reset entire machine. CPU 0 should be enough, but that doesn't seem to work !! on_scorpion2_reset(); return; } @@ -2685,8 +2685,8 @@ static MACHINE_DRIVER_START( scorpion2_vid ) MDRV_SCREEN_ADD("VFD", 0x000) MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) - MDRV_SCREEN_SIZE( 288, 29) - MDRV_VISIBLE_AREA( 0, 288-1, 0, 29-1) + MDRV_SCREEN_SIZE( 288, 34) + MDRV_VISIBLE_AREA( 0, 288-1, 0, 34-1) MDRV_PALETTE_LENGTH(16) MDRV_COLORTABLE_LENGTH(16) diff --git a/src/drivers/bigfghtr.c b/src/drivers/bigfghtr.c index 6b445782e..2b1ea6875 100644 --- a/src/drivers/bigfghtr.c +++ b/src/drivers/bigfghtr.c @@ -257,7 +257,7 @@ VIDEO_UPDATE( bigfghtr ) } else { - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); } if( sprite_enable ) draw_sprites( bitmap, cliprect, 2 ); diff --git a/src/drivers/blockade.c b/src/drivers/blockade.c index 39a9f98ef..148c89b95 100644 --- a/src/drivers/blockade.c +++ b/src/drivers/blockade.c @@ -440,19 +440,19 @@ static const gfx_decode blasto_gfxdecodeinfo[] = static PALETTE_INIT( green ) { - palette_set_color(0,0x00,0x00,0x00); /* BLACK */ - palette_set_color(1,0x00,0xff,0x00); /* GREEN */ /* overlay (Blockade) */ + palette_set_color(machine,0,0x00,0x00,0x00); /* BLACK */ + palette_set_color(machine,1,0x00,0xff,0x00); /* GREEN */ /* overlay (Blockade) */ } static PALETTE_INIT( yellow ) { - palette_set_color(0,0x00,0x00,0x00); /* BLACK */ - palette_set_color(1,0xff,0xff,0x20); /* YELLOW */ /* overlay (Hustle) */ + palette_set_color(machine,0,0x00,0x00,0x00); /* BLACK */ + palette_set_color(machine,1,0xff,0xff,0x20); /* YELLOW */ /* overlay (Hustle) */ } static PALETTE_INIT( bw ) { - palette_set_color(0,0x00,0x00,0x00); /* BLACK */ - palette_set_color(1,0xff,0xff,0xff); /* WHITE */ /* Comotion/Blasto */ + palette_set_color(machine,0,0x00,0x00,0x00); /* BLACK */ + palette_set_color(machine,1,0xff,0xff,0xff); /* WHITE */ /* Comotion/Blasto */ } diff --git a/src/drivers/bmcbowl.c b/src/drivers/bmcbowl.c index ce2520615..076f8d2a6 100644 --- a/src/drivers/bmcbowl.c +++ b/src/drivers/bmcbowl.c @@ -132,7 +132,7 @@ VIDEO_UPDATE( bmcbowl ) */ int x,y,z,pixdat; - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); z=0; for (y=0;y<230;y++) @@ -176,7 +176,7 @@ VIDEO_UPDATE( bmcbowl ) static READ16_HANDLER( bmc_random_read ) { - return mame_rand(); + return mame_rand(Machine); } static READ16_HANDLER( bmc_protection_r ) @@ -193,7 +193,7 @@ static READ16_HANDLER( bmc_protection_r ) break; } logerror("Protection read @ %X\n",activecpu_get_previouspc()); - return mame_rand(); + return mame_rand(Machine); } static WRITE16_HANDLER( bmc_RAMDAC_offset_w ) @@ -204,7 +204,7 @@ static WRITE16_HANDLER( bmc_RAMDAC_offset_w ) static WRITE16_HANDLER( bmc_RAMDAC_color_w ) { colorram[clr_offset]=data; - palette_set_color(clr_offset/3,colorram[(clr_offset/3)*3]*4,colorram[(clr_offset/3)*3+1]*4,colorram[(clr_offset/3)*3+2]*4); + palette_set_color(Machine,clr_offset/3,pal6bit(colorram[(clr_offset/3)*3]),pal6bit(colorram[(clr_offset/3)*3+1]),pal6bit(colorram[(clr_offset/3)*3+2])); clr_offset=(clr_offset+1)%768; } diff --git a/src/drivers/boxer.c b/src/drivers/boxer.c index ad60b90dd..c962f35a5 100644 --- a/src/drivers/boxer.c +++ b/src/drivers/boxer.c @@ -73,8 +73,8 @@ static void periodic_callback(int scanline) static PALETTE_INIT( boxer ) { - palette_set_color(0, 0x00, 0x00, 0x00); - palette_set_color(1, 0xff, 0xff, 0xff); + palette_set_color(machine,0, 0x00, 0x00, 0x00); + palette_set_color(machine,1, 0xff, 0xff, 0xff); colortable[0] = 0; colortable[1] = 1; diff --git a/src/drivers/bsktball.c b/src/drivers/bsktball.c index 0d19daba3..e06bd5457 100644 --- a/src/drivers/bsktball.c +++ b/src/drivers/bsktball.c @@ -122,10 +122,10 @@ static unsigned short colortable_source[] = static PALETTE_INIT( bsktball ) { - palette_set_color(0,0x00,0x00,0x00); /* BLACK */ - palette_set_color(1,0x80,0x80,0x80); /* LIGHT GREY */ - palette_set_color(2,0x50,0x50,0x50); /* DARK GREY */ - palette_set_color(3,0xff,0xff,0xff); /* WHITE */ + palette_set_color(machine,0,0x00,0x00,0x00); /* BLACK */ + palette_set_color(machine,1,0x80,0x80,0x80); /* LIGHT GREY */ + palette_set_color(machine,2,0x50,0x50,0x50); /* DARK GREY */ + palette_set_color(machine,3,0xff,0xff,0xff); /* WHITE */ memcpy(colortable,colortable_source,sizeof(colortable_source)); } diff --git a/src/drivers/btime.c b/src/drivers/btime.c index 3f644c4c7..ee666fc28 100644 --- a/src/drivers/btime.c +++ b/src/drivers/btime.c @@ -1841,7 +1841,7 @@ static DRIVER_INIT( zoar ) I'm NOPing it out for now. */ memset(&rom[0xd50a],0xea,8); - init_btime(); + init_btime(machine); } static DRIVER_INIT( lnc ) @@ -1852,14 +1852,14 @@ static DRIVER_INIT( lnc ) static DRIVER_INIT( cookrace ) { memcpy(&sound_rambase[0x200], memory_region(REGION_CPU2) + 0xf200, 0x200); - init_lnc(); + init_lnc(machine); } static DRIVER_INIT( wtennis ) { memcpy(&sound_rambase[0x200], memory_region(REGION_CPU2) + 0xf200, 0x200); memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xc15f, 0xc15f, 0, 0, wtennis_reset_hack_r); - init_lnc(); + init_lnc(machine); } static DRIVER_INIT( sdtennis ) diff --git a/src/drivers/bublbobl.c b/src/drivers/bublbobl.c index 511d57fea..ae112179d 100644 --- a/src/drivers/bublbobl.c +++ b/src/drivers/bublbobl.c @@ -1240,7 +1240,7 @@ static DRIVER_INIT( tokiob ) { memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xfe00, 0xfe00, 0, 0, tokiob_mcu_r ); - init_tokio(); + init_tokio(machine); } diff --git a/src/drivers/bwidow.c b/src/drivers/bwidow.c index e98c7fc2e..72dc482ec 100644 --- a/src/drivers/bwidow.c +++ b/src/drivers/bwidow.c @@ -220,6 +220,8 @@ #include "sound/pokey.h" #include "bzone.h" +#define MASTER_CLOCK (12096000) +#define CLOCK_3KHZ (MASTER_CLOCK / 4096) #define IN_LEFT (1 << 0) #define IN_RIGHT (1 << 1) @@ -316,6 +318,16 @@ WRITE8_HANDLER( bwidow_misc_w ) lastdata = data; } +/************************************* + * + * Interrupt ack + * + *************************************/ + +static WRITE8_HANDLER( irq_ack_w ) +{ + cpunum_set_input_line(0, 0, CLEAR_LINE); +} /************************************* @@ -337,7 +349,7 @@ static ADDRESS_MAP_START( bwidow_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x8800, 0x8800) AM_WRITE(bwidow_misc_w) /* coin counters, leds */ AM_RANGE(0x8840, 0x8840) AM_WRITE(avgdvg_go_w) AM_RANGE(0x8880, 0x8880) AM_WRITE(avgdvg_reset_w) - AM_RANGE(0x88c0, 0x88c0) AM_WRITE(MWA8_NOP) /* interrupt acknowledge */ + AM_RANGE(0x88c0, 0x88c0) AM_WRITE(irq_ack_w) /* interrupt acknowledge */ AM_RANGE(0x8900, 0x8900) AM_WRITE(atari_vg_earom_ctrl_w) AM_RANGE(0x8940, 0x897f) AM_WRITE(atari_vg_earom_w) AM_RANGE(0x8980, 0x89ed) AM_WRITE(MWA8_NOP) /* watchdog clear */ @@ -355,7 +367,7 @@ static ADDRESS_MAP_START( spacduel_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0c80, 0x0c80) AM_WRITE(avgdvg_go_w) AM_RANGE(0x0d00, 0x0d00) AM_WRITE(MWA8_NOP) /* watchdog clear */ AM_RANGE(0x0d80, 0x0d80) AM_WRITE(avgdvg_reset_w) - AM_RANGE(0x0e00, 0x0e00) AM_WRITE(MWA8_NOP) /* interrupt acknowledge */ + AM_RANGE(0x0e00, 0x0e00) AM_WRITE(irq_ack_w) /* interrupt acknowledge */ AM_RANGE(0x0e80, 0x0e80) AM_WRITE(atari_vg_earom_ctrl_w) AM_RANGE(0x0f00, 0x0f3f) AM_WRITE(atari_vg_earom_w) AM_RANGE(0x1000, 0x100f) AM_READWRITE(pokey1_r, pokey1_w) @@ -671,9 +683,9 @@ static struct POKEYinterface pokey_interface_2 = static MACHINE_DRIVER_START( bwidow ) /* basic machine hardware */ - MDRV_CPU_ADD_TAG("main", M6502, 1500000) /* 1.5 MHz */ + MDRV_CPU_ADD_TAG("main", M6502, MASTER_CLOCK / 8) MDRV_CPU_PROGRAM_MAP(bwidow_map,0) - MDRV_CPU_VBLANK_INT(irq0_line_hold,4) /* 4.1ms */ + MDRV_CPU_PERIODIC_INT(irq0_line_assert, TIME_IN_HZ(CLOCK_3KHZ / 12)) MDRV_FRAMES_PER_SECOND(60) MDRV_NVRAM_HANDLER(atari_vg) @@ -684,18 +696,17 @@ static MACHINE_DRIVER_START( bwidow ) MDRV_VISIBLE_AREA(0, 480, 0, 440) MDRV_PALETTE_LENGTH(32768) - MDRV_PALETTE_INIT(avg_multi) MDRV_VIDEO_START(avg) MDRV_VIDEO_UPDATE(vector) /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") - MDRV_SOUND_ADD(POKEY, 1500000) + MDRV_SOUND_ADD(POKEY, MASTER_CLOCK / 8) MDRV_SOUND_CONFIG(pokey_interface_1) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) - MDRV_SOUND_ADD(POKEY, 1500000) + MDRV_SOUND_ADD(POKEY, MASTER_CLOCK / 8) MDRV_SOUND_CONFIG(pokey_interface_2) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) MACHINE_DRIVER_END @@ -761,6 +772,10 @@ ROM_START( bwidow ) ROM_LOAD( "136017.105", 0xd000, 0x1000, CRC(1fdf801c) SHA1(33da2ba3cefa3d0dddc8647f9b6caf5d5bfe9b3b) ) ROM_LOAD( "136017.106", 0xe000, 0x1000, CRC(ccc9b26c) SHA1(f1398e3ff2b62af1509bc117028845b671ff1ca2) ) ROM_RELOAD( 0xf000, 0x1000 ) /* for reset/interrupt vectors */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.n4", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END ROM_START( gravitar ) @@ -778,6 +793,10 @@ ROM_START( gravitar ) ROM_LOAD( "136010.305", 0xd000, 0x1000, CRC(840603af) SHA1(4a7124f91d3ee940686c51374a861efe6cb5d282) ) ROM_LOAD( "136010.306", 0xe000, 0x1000, CRC(3f3805ad) SHA1(baf080deaa8eea43af2f3be71dacc63e4666c453) ) ROM_RELOAD( 0xf000, 0x1000 ) /* for reset/interrupt vectors */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.n4", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END ROM_START( gravitr2 ) @@ -795,6 +814,10 @@ ROM_START( gravitr2 ) ROM_LOAD( "136010.205", 0xd000, 0x1000, CRC(0db1ff34) SHA1(288d9ffff9d18025621be249ea25a7444f58f3a9) ) ROM_LOAD( "136010.206", 0xe000, 0x1000, CRC(4521ca48) SHA1(5770cb46c4ac28d632ad5910723a9edda8283ce5) ) ROM_RELOAD( 0xf000, 0x1000 ) /* for reset/interrupt vectors */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.n4", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END ROM_START( gravp ) @@ -812,6 +835,10 @@ ROM_START( gravp ) ROM_LOAD( "kl1.bin", 0xd000, 0x1000, CRC(032b5806) SHA1(b719792a177e74ec49e6952e445b9cdeaca7505f) ) ROM_LOAD( "m1.bin", 0xe000, 0x1000, CRC(47fe97a0) SHA1(7cbde4b59abde679c28d7547700b342f25762e4a) ) ROM_RELOAD( 0xf000, 0x1000 ) /* for reset/interrupt vectors */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.n4", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END ROM_START( lunarbat ) @@ -828,6 +855,10 @@ ROM_START( lunarbat ) ROM_LOAD( "005.010", 0xd000, 0x1000, CRC(4feb6f81) SHA1(b852f1093e56343225c1b2b2554a93c88fc58637) ) ROM_LOAD( "006.010", 0xe000, 0x1000, CRC(f8ad139d) SHA1(e9e0dcb0872b19af09825a979f8b3747c9632091) ) ROM_RELOAD( 0xf000, 0x1000 ) /* for reset/interrupt vectors */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.n4", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END ROM_START( lunarba1 ) @@ -848,6 +879,10 @@ ROM_START( lunarba1 ) ROM_RELOAD( 0xd000, 0x1000 ) ROM_RELOAD( 0xe000, 0x1000 ) ROM_RELOAD( 0xf000, 0x1000 ) /* for reset/interrupt vectors */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.n4", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END ROM_START( spacduel ) @@ -867,7 +902,12 @@ ROM_START( spacduel ) ROM_RELOAD( 0xc000, 0x1000 ) ROM_RELOAD( 0xd000, 0x1000 ) ROM_RELOAD( 0xe000, 0x1000 ) + ROM_RELOAD( 0xf000, 0x1000 ) /* for reset/interrupt vectors */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.n4 ", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END diff --git a/src/drivers/bzone.c b/src/drivers/bzone.c index 2526aa9c3..e424fcca4 100644 --- a/src/drivers/bzone.c +++ b/src/drivers/bzone.c @@ -31,7 +31,7 @@ 1860-187f Mathbox RAM 2000-2fff Vector generator RAM - 3000-37ff Mathbox ROM + 3000-37ff Vector Generator ROM 5000-7fff ROM Battlezone settings: @@ -109,7 +109,7 @@ 1860-187f Mathbox RAM 2000-2fff Vector generator RAM - 3000-37ff Mathbox ROM + 3000-37ff Vector generator ROM 5000-7fff ROM RED BARON DIP SWITCH SETTINGS @@ -210,6 +210,9 @@ #define IN0_3KHZ (1<<7) #define IN0_VG_HALT (1<<6) +#define MASTER_CLOCK (12096000) +#define CLOCK_3KHZ (MASTER_CLOCK / 4096) + static UINT8 analog_data; @@ -570,9 +573,9 @@ static struct CustomSound_interface redbaron_custom_interface = static MACHINE_DRIVER_START( bzone ) /* basic machine hardware */ - MDRV_CPU_ADD_TAG("main", M6502, 1500000) + MDRV_CPU_ADD_TAG("main", M6502, MASTER_CLOCK / 8) MDRV_CPU_PROGRAM_MAP(bzone_map,0) - MDRV_CPU_VBLANK_INT(bzone_interrupt,6) /* 4.1ms */ + MDRV_CPU_PERIODIC_INT(bzone_interrupt, TIME_IN_HZ(CLOCK_3KHZ / 12)) MDRV_FRAMES_PER_SECOND(40) @@ -584,14 +587,13 @@ static MACHINE_DRIVER_START( bzone ) MDRV_VISIBLE_AREA(0, 580, 0, 400) MDRV_PALETTE_LENGTH(32768) - MDRV_PALETTE_INIT(avg_white) MDRV_VIDEO_START(avg_bzone) MDRV_VIDEO_UPDATE(vector) /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") - MDRV_SOUND_ADD_TAG("pokey", POKEY, 1500000) + MDRV_SOUND_ADD_TAG("pokey", POKEY, MASTER_CLOCK / 8) MDRV_SOUND_CONFIG(bzone_pokey_interface) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) @@ -607,7 +609,7 @@ static MACHINE_DRIVER_START( bradley ) MDRV_IMPORT_FROM(bzone) /* sound hardware */ - MDRV_SOUND_REPLACE("pokey", POKEY, 1500000) + MDRV_SOUND_REPLACE("pokey", POKEY, MASTER_CLOCK / 8) MDRV_SOUND_CONFIG(bzone_pokey_interface) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_DRIVER_END @@ -619,17 +621,17 @@ static MACHINE_DRIVER_START( redbaron ) MDRV_IMPORT_FROM(bzone) MDRV_CPU_MODIFY("main") MDRV_CPU_PROGRAM_MAP(redbaron_map,0) - MDRV_CPU_VBLANK_INT(bzone_interrupt,4) /* 5.4ms */ + MDRV_CPU_PERIODIC_INT(bzone_interrupt, TIME_IN_HZ(CLOCK_3KHZ / 12)) MDRV_MACHINE_START(redbaron) - MDRV_FRAMES_PER_SECOND(45) + MDRV_FRAMES_PER_SECOND(60) MDRV_NVRAM_HANDLER(atari_vg) /* video hardware */ MDRV_VISIBLE_AREA(0, 520, 0, 400) - MDRV_VIDEO_START(avg_redbaron) + MDRV_VIDEO_START(avg_bzone) /* sound hardware */ MDRV_SOUND_REPLACE("pokey", POKEY, 1500000) @@ -657,9 +659,13 @@ ROM_START( bzone ) ROM_LOAD( "036411.01", 0x6800, 0x0800, CRC(ad281297) SHA1(54c5e06b2e69eb731a6c9b1704e4340f493e7ea5) ) ROM_LOAD( "036410.01", 0x7000, 0x0800, CRC(0b7bfaa4) SHA1(33ae0f68b4e2eae9f3aecbee2d0b29003ce460b2) ) ROM_LOAD( "036409.01", 0x7800, 0x0800, CRC(1e14e919) SHA1(448fab30535e6fad7e0ab4427bc06bbbe075e797) ) - /* Mathbox ROMs */ + /* Vector Generator ROMs */ ROM_LOAD( "036422.01", 0x3000, 0x0800, CRC(7414177b) SHA1(147d97a3b475e738ce00b1a7909bbd787ad06eda) ) ROM_LOAD( "036421.01", 0x3800, 0x0800, CRC(8ea8f939) SHA1(b71e0ab0e220c3e64dc2b094c701fb1a960b64e4) ) + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "036498-01.k7", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END @@ -671,9 +677,13 @@ ROM_START( bzone2 ) ROM_LOAD( "036411.01", 0x6800, 0x0800, CRC(ad281297) SHA1(54c5e06b2e69eb731a6c9b1704e4340f493e7ea5) ) ROM_LOAD( "036410.01", 0x7000, 0x0800, CRC(0b7bfaa4) SHA1(33ae0f68b4e2eae9f3aecbee2d0b29003ce460b2) ) ROM_LOAD( "036409.01", 0x7800, 0x0800, CRC(1e14e919) SHA1(448fab30535e6fad7e0ab4427bc06bbbe075e797) ) - /* Mathbox ROMs */ + /* Vector Generator ROMs */ ROM_LOAD( "036422.01", 0x3000, 0x0800, CRC(7414177b) SHA1(147d97a3b475e738ce00b1a7909bbd787ad06eda) ) ROM_LOAD( "036421.01", 0x3800, 0x0800, CRC(8ea8f939) SHA1(b71e0ab0e220c3e64dc2b094c701fb1a960b64e4) ) + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "036498-01.k7", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END @@ -686,9 +696,13 @@ ROM_START( bzonec ) /* cocktail version */ ROM_LOAD( "bz1c6800", 0x6800, 0x0800, CRC(5adc64bd) SHA1(4574e4fe375d4ab3151a988235efa11e8744e2c6) ) ROM_LOAD( "bz1b7000", 0x7000, 0x0800, CRC(ed8a860e) SHA1(316a3c4870ba44bb3e9cb9fc5200eb081318facf) ) ROM_LOAD( "bz1a7800", 0x7800, 0x0800, CRC(04babf45) SHA1(a59da5ff49fc398ca4a948e28f05250af776b898) ) - /* Mathbox ROMs */ + /* Vector Generator ROMs */ ROM_LOAD( "036422.01", 0x3000, 0x0800, CRC(7414177b) SHA1(147d97a3b475e738ce00b1a7909bbd787ad06eda) ) // bz3a3000 ROM_LOAD( "bz3b3800", 0x3800, 0x0800, CRC(76cf57f6) SHA1(1b8f3fcd664ed04ce60d94fdf27e56b20d52bdbd) ) + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "036498-01.k7", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END @@ -702,9 +716,13 @@ ROM_START( bradley ) ROM_LOAD( "btk1.bin", 0x6800, 0x0800, CRC(f5c2904e) SHA1(f2cbf720c4f5ce0fc912dbc2f0445cb2c51ffac1) ) ROM_LOAD( "btlm.bin", 0x7000, 0x0800, CRC(7d0313bf) SHA1(17e3d8df62b332cf889133f1943c8f27308df027) ) ROM_LOAD( "btn1.bin", 0x7800, 0x0800, CRC(182c8c64) SHA1(511af60d86551291d2dc28442970b4863c62624a) ) - /* Mathbox ROMs */ + /* Vector Generator ROMs */ ROM_LOAD( "btb3.bin", 0x3000, 0x0800, CRC(88206304) SHA1(6a2e2ff35a929acf460f244db7968f3978b1d239) ) ROM_LOAD( "bta3.bin", 0x3800, 0x0800, CRC(d669d796) SHA1(ad606882320cd13612c7962d4718680fe5a35dd3) ) + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "036498-01.k7", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END @@ -717,9 +735,13 @@ ROM_START( redbaron ) ROM_LOAD( "036997.01e", 0x6800, 0x0800, CRC(7434acb4) SHA1(c950c4c12ab556b5051ad356ab4a0ed6b779ba1f) ) ROM_LOAD( "036996.01e", 0x7000, 0x0800, CRC(c0e7589e) SHA1(c1aedc95966afffd860d7e0009d5a43e8b292036) ) ROM_LOAD( "036995.01e", 0x7800, 0x0800, CRC(ad81d1da) SHA1(8bd66e5f34fc1c75f31eb6b168607e52aa3aa4df) ) - /* Mathbox ROMs */ + /* Vector Generator ROMs */ ROM_LOAD( "037006.01e", 0x3000, 0x0800, CRC(9fcffea0) SHA1(69b76655ee75742fcaa0f39a4a1cf3aa58088343) ) ROM_LOAD( "037007.01e", 0x3800, 0x0800, CRC(60250ede) SHA1(9c48952bd69863bee0c6dce09f3613149e0151ef) ) + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "036408-01.k7", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END diff --git a/src/drivers/canyon.c b/src/drivers/canyon.c index 90680e0b2..48142bbe9 100644 --- a/src/drivers/canyon.c +++ b/src/drivers/canyon.c @@ -47,9 +47,9 @@ static PALETTE_INIT( canyon ) { - palette_set_color(0, 0x00, 0x00, 0x00); /* BLACK */ - palette_set_color(1, 0xff, 0xff, 0xff); /* WHITE */ - palette_set_color(2, 0x80, 0x80, 0x80); /* GREY */ + palette_set_color(machine, 0, 0x00, 0x00, 0x00); /* BLACK */ + palette_set_color(machine, 1, 0xff, 0xff, 0xff); /* WHITE */ + palette_set_color(machine, 2, 0x80, 0x80, 0x80); /* GREY */ colortable[0] = 2; colortable[1] = 0; diff --git a/src/drivers/cardline.c b/src/drivers/cardline.c index 8d6e3e747..25533c7de 100644 --- a/src/drivers/cardline.c +++ b/src/drivers/cardline.c @@ -210,7 +210,7 @@ PALETTE_INIT(cardline) bit0 = (data >> 0) & 0x01; bit1 = (data >> 1) & 0x01; b = 0x55 * bit0 + 0xaa * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/drivers/carrera.c b/src/drivers/carrera.c new file mode 100644 index 000000000..1d727cbfd --- /dev/null +++ b/src/drivers/carrera.c @@ -0,0 +1,340 @@ +/* + +This is a simple 'Pairs' game called +Carrera by BS Electronics + + + +PCB Layout +---------- + +|----------------------------------------------| +| 22.1184MHz Z80 | +| ROM.IC1 | +|_ BATTERY ROM.IC22 | + | | + _| 6116 ROM.IC2 | +| | +| | +|J AY-3-8910 ROM.IC3 | +|A DSW1(8) | +|M | +|M DSW2(8) ROM.IC4 | +|A | +| DSW3(8) | +| ROM.IC5 | +|_ PROM.IC39 DSW4(8) | + | 6116 | + _| | +| HD6845 6116 | +|----------------------------------------------| +Notes: + Z80 @ 3.6864MHz [22.1184/6] + AY-3-8910 @ 1.8432MHz [22.1184/12] + + +Emulation Notes: + Corrupt Tile on the first R in Carrera? (unlikely to be a bug, HW is very simple..) + There is also a 'Bomberman' title in the GFX roms, unused from what I can see. + +*/ + +#define MASTER_CLOCK 22118400 + +#include "driver.h" +#include "sound/ay8910.h" +#include "vidhrdw/crtc6845.h" + +UINT8* carrera_tileram; + +static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x4fff) AM_READ(MRA8_ROM) + AM_RANGE(0xe000, 0xe7ff) AM_READ(MRA8_RAM) + AM_RANGE(0xf000, 0xffff) AM_READ(MRA8_RAM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x4fff) AM_WRITE(MWA8_ROM) + AM_RANGE(0xe000, 0xe7ff) AM_WRITE(MWA8_RAM) + AM_RANGE(0xe800, 0xe800) AM_WRITE(crtc6845_address_w) + AM_RANGE(0xe801, 0xe801) AM_WRITE(crtc6845_register_w) + AM_RANGE(0xf000, 0xffff) AM_WRITE(MWA8_RAM) AM_BASE(&carrera_tileram) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( readport, ADDRESS_SPACE_IO, 8 ) + ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) + AM_RANGE(0x00, 0x00) AM_READ(input_port_0_r) + AM_RANGE(0x01, 0x01) AM_READ(input_port_1_r) + AM_RANGE(0x02, 0x02) AM_READ(input_port_2_r) + AM_RANGE(0x03, 0x03) AM_READ(input_port_3_r) + AM_RANGE(0x04, 0x04) AM_READ(input_port_4_r) + AM_RANGE(0x05, 0x05) AM_READ(input_port_5_r) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( writeport, ADDRESS_SPACE_IO, 8 ) + ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) + AM_RANGE(0x06, 0x06) AM_WRITE(MWA8_NOP) // ? + + AM_RANGE(0x08, 0x08) AM_WRITE(AY8910_control_port_0_w) + AM_RANGE(0x09, 0x09) AM_WRITE(AY8910_write_port_0_w) +ADDRESS_MAP_END + + +INPUT_PORTS_START( carrera ) + PORT_START_TAG("IN0") /* Port 0 */ + 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 ) + /* unused / unknown inputs, not dips */ + PORT_DIPNAME( 0x20, 0x20, "0" ) + 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_TAG("IN1") /* Port 1 */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) + /* unused / unknown inputs, not dips */ + PORT_DIPNAME( 0x04, 0x04, "1" ) + 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 ) ) + + /* I suspect the 4 below are the 4xDSWs */ + PORT_START_TAG("IN2") /* Port 2 */ + 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_TAG("IN3") /* Port 3 */ + 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_TAG("IN4") /* Port 4 */ + 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_TAG("IN5") /* Port 5 */ + 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, "Playing Graphics" ) + PORT_DIPSETTING( 0x08, "Bricks" ) + PORT_DIPSETTING( 0x00, "Fruits" ) + 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, "Debug?" ) // displays numbers over the game area + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + +static const gfx_layout tiles8x8_layout = +{ + 8,8, + RGN_FRAC(1,5), + 5, + { RGN_FRAC(0,5), RGN_FRAC(1,5),RGN_FRAC(2,5),RGN_FRAC(3,5),RGN_FRAC(4,5) }, + { 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 const gfx_decode gfxdecodeinfo[] = +{ + { REGION_GFX1, 0, &tiles8x8_layout, 0, 16 }, + { -1 } +}; + +VIDEO_START(carrera) +{ + return 0; +} + +VIDEO_UPDATE(carrera) +{ + + int x,y; + int count = 0; + + for (y=0;y<32;y++) + { + for (x=0;x<64;x++) + { + int tile = carrera_tileram[count&0x7ff] | carrera_tileram[(count&0x7ff)+0x800]<<8; + + drawgfx(bitmap,Machine->gfx[0],tile,0,0,0,x*8,y*8,cliprect,TRANSPARENCY_NONE,0); + count++; + } + } + return 0; +} + +static READ8_HANDLER( unknown_r ) +{ + return mame_rand(Machine); +} + +/* these are set as input, but I have no idea which input port it uses is for the AY */ +static struct AY8910interface ay8910_interface = +{ + unknown_r, + unknown_r, +}; + +PALETTE_INIT(carrera) +{ + int x; + UINT8 *src = memory_region ( REGION_PROMS ); + + for (x=0;x<32;x++) + palette_set_color(machine, x, pal3bit(src[x] >> 0), pal3bit(src[x] >> 3), pal2bit(src[x] >> 6)); +} + +static MACHINE_DRIVER_START( carrera ) + /* basic machine hardware */ + MDRV_CPU_ADD(Z80,MASTER_CLOCK/6) + MDRV_CPU_PROGRAM_MAP(readmem,writemem) + MDRV_CPU_IO_MAP(readport,writeport) + MDRV_CPU_VBLANK_INT(nmi_line_pulse,1) + + MDRV_FRAMES_PER_SECOND(60) + MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER ) + MDRV_SCREEN_SIZE(512, 256) + MDRV_VISIBLE_AREA(0, 512-1, 0, 256-1) + MDRV_GFXDECODE(gfxdecodeinfo) + MDRV_PALETTE_LENGTH(32) + MDRV_PALETTE_INIT(carrera) + MDRV_VIDEO_START(carrera) + MDRV_VIDEO_UPDATE(carrera) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(AY8910, MASTER_CLOCK/12) + MDRV_SOUND_CONFIG(ay8910_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) +MACHINE_DRIVER_END + + + + + +ROM_START( carrera ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "27512.ic22", 0x00000, 0x10000, CRC(2385b9c8) SHA1(12d4397779e074096fbb23b114985f104366b79c) ) + + ROM_REGION( 0x50000, REGION_GFX1, 0 ) + ROM_LOAD( "27512.ic1", 0x00000, 0x10000, CRC(a16e914e) SHA1(09f2271f193a7bffd62ef6e428ecbf9aa1154860) ) + ROM_LOAD( "27512.ic2", 0x10000, 0x10000, CRC(147036a5) SHA1(34b4818fe61c5b13220b0a2001987b68b655b2cb) ) + ROM_LOAD( "27512.ic3", 0x20000, 0x10000, CRC(920eee0e) SHA1(85e6d5292b751c57c64d17858bd00292356599e3) ) + ROM_LOAD( "27512.ic4", 0x30000, 0x10000, CRC(97433f36) SHA1(39f3c6b76ad540693682832aba6e4fc400ca3753) ) + ROM_LOAD( "27512.ic5", 0x40000, 0x10000, CRC(ffa75920) SHA1(aa5619f5aabcdfa250bb24bcad101a8c512a1776) ) + + ROM_REGION( 0x20, REGION_PROMS, 0 ) + ROM_LOAD( "82s123.ic39", 0x00, 0x20, CRC(af16359f) SHA1(1ff5c9d7807e52be09c0ded56fb68a47e41b3fcf) ) +ROM_END + + +GAME( 19??, carrera, 0, carrera, carrera,0, ROT0, "BS Electronics", "Carrera (Version 6.7)", GAME_WRONG_COLORS ) diff --git a/src/drivers/cave.c b/src/drivers/cave.c index 87fd40123..d1809f5e6 100644 --- a/src/drivers/cave.c +++ b/src/drivers/cave.c @@ -4066,7 +4066,7 @@ DRIVER_INIT( cave ) DRIVER_INIT( agallet ) { - init_cave(); + init_cave(machine); sailormn_unpack_tiles( REGION_GFX4 ); @@ -4082,7 +4082,7 @@ DRIVER_INIT( agallet ) DRIVER_INIT( dfeveron ) { - init_cave(); + init_cave(machine); cave_default_eeprom = cave_default_eeprom_type1; cave_default_eeprom_length = sizeof(cave_default_eeprom_type1); @@ -4094,7 +4094,7 @@ DRIVER_INIT( dfeveron ) DRIVER_INIT( feversos ) { - init_cave(); + init_cave(machine); cave_default_eeprom = cave_default_eeprom_type1feversos; cave_default_eeprom_length = sizeof(cave_default_eeprom_type1feversos); @@ -4106,7 +4106,7 @@ DRIVER_INIT( feversos ) DRIVER_INIT( ddonpach ) { - init_cave(); + init_cave(machine); cave_default_eeprom = cave_default_eeprom_type2; cave_default_eeprom_length = sizeof(cave_default_eeprom_type2); @@ -4119,7 +4119,7 @@ DRIVER_INIT( ddonpach ) DRIVER_INIT( donpachi ) { - init_cave(); + init_cave(machine); cave_default_eeprom = cave_default_eeprom_type2; cave_default_eeprom_length = sizeof(cave_default_eeprom_type2); @@ -4134,7 +4134,7 @@ DRIVER_INIT( donpachi ) DRIVER_INIT( esprade ) { - init_cave(); + init_cave(machine); cave_default_eeprom = cave_default_eeprom_type2; cave_default_eeprom_length = sizeof(cave_default_eeprom_type2); @@ -4153,7 +4153,7 @@ DRIVER_INIT( esprade ) DRIVER_INIT( gaia ) { - init_cave(); + init_cave(machine); /* No EEPROM */ @@ -4164,7 +4164,7 @@ DRIVER_INIT( gaia ) DRIVER_INIT( guwange ) { - init_cave(); + init_cave(machine); cave_default_eeprom = cave_default_eeprom_type1; cave_default_eeprom_length = sizeof(cave_default_eeprom_type1); @@ -4176,7 +4176,7 @@ DRIVER_INIT( guwange ) DRIVER_INIT( hotdogst ) { - init_cave(); + init_cave(machine); cave_default_eeprom = cave_default_eeprom_type4; cave_default_eeprom_length = sizeof(cave_default_eeprom_type4); @@ -4193,7 +4193,7 @@ DRIVER_INIT( mazinger ) UINT8 *src = memory_region(REGION_GFX1); int len = memory_region_length(REGION_GFX1); - init_cave(); + init_cave(machine); /* decrypt sprites */ if ((buffer = malloc(len))) @@ -4221,7 +4221,7 @@ DRIVER_INIT( mazinger ) DRIVER_INIT( metmqstr ) { - init_cave(); + init_cave(machine); unpack_sprites(); cave_spritetype = 2; // Normal sprites with different position handling @@ -4237,7 +4237,7 @@ DRIVER_INIT( pwrins2j ) int len = memory_region_length(REGION_GFX1); int i, j; - init_cave(); + init_cave(machine); if ((buffer = malloc(len))) { @@ -4264,7 +4264,7 @@ DRIVER_INIT( pwrinst2 ) { /* this patch fixes on of the moves, why is it needed? is the rom bad or is there another problem? does the Japan set need it or not? */ - init_pwrins2j(); + init_pwrins2j(machine); #if 1 //ROM PATCH { @@ -4282,7 +4282,7 @@ DRIVER_INIT( sailormn ) UINT8 *src = memory_region(REGION_GFX1); int len = memory_region_length(REGION_GFX1); - init_cave(); + init_cave(machine); /* decrypt sprites */ if ((buffer = malloc(len))) @@ -4308,7 +4308,7 @@ DRIVER_INIT( sailormn ) DRIVER_INIT( uopoko ) { - init_cave(); + init_cave(machine); cave_default_eeprom = cave_default_eeprom_type3; cave_default_eeprom_length = sizeof(cave_default_eeprom_type4); @@ -4321,7 +4321,7 @@ DRIVER_INIT( uopoko ) DRIVER_INIT( korokoro ) { - init_cave(); + init_cave(machine); irq_level = 2; diff --git a/src/drivers/cball.c b/src/drivers/cball.c index ce2772ae6..bb16ee62f 100644 --- a/src/drivers/cball.c +++ b/src/drivers/cball.c @@ -80,12 +80,12 @@ static MACHINE_RESET( cball ) static PALETTE_INIT( cball ) { - palette_set_color(0, 0x80, 0x80, 0x80); - palette_set_color(1, 0x00, 0x00, 0x00); - palette_set_color(2, 0x80, 0x80, 0x80); - palette_set_color(3, 0xff, 0xff, 0xff); - palette_set_color(4, 0x80, 0x80, 0x80); - palette_set_color(5, 0xc0, 0xc0, 0xc0); + palette_set_color(machine, 0, 0x80, 0x80, 0x80); + palette_set_color(machine, 1, 0x00, 0x00, 0x00); + palette_set_color(machine, 2, 0x80, 0x80, 0x80); + palette_set_color(machine, 3, 0xff, 0xff, 0xff); + palette_set_color(machine, 4, 0x80, 0x80, 0x80); + palette_set_color(machine, 5, 0xc0, 0xc0, 0xc0); } diff --git a/src/drivers/ccastles.c b/src/drivers/ccastles.c index 38996ed19..6d1a7d6c3 100644 --- a/src/drivers/ccastles.c +++ b/src/drivers/ccastles.c @@ -164,7 +164,7 @@ INLINE void schedule_next_irq(int curscanline) break; /* next one at the start of this scanline */ - timer_adjust(irq_timer, cpu_getscanlinetime(curscanline), curscanline, 0); + mame_timer_adjust(irq_timer, video_screen_get_time_until_pos(0, curscanline, 0), curscanline, time_zero); } @@ -178,7 +178,7 @@ static void clock_irq(int param) } /* force an update now */ - video_screen_update_partial(0, cpu_getscanline()); + video_screen_update_partial(0, video_screen_get_vpos(0)); /* find the next edge */ schedule_next_irq(param); @@ -187,7 +187,7 @@ static void clock_irq(int param) static UINT32 get_vblank(void *param) { - int scanline = cpu_getscanline(); + int scanline = video_screen_get_vpos(0); return syncprom[scanline & 0xff] & 1; } diff --git a/src/drivers/centiped.c b/src/drivers/centiped.c index a2496f272..b2479bd8f 100644 --- a/src/drivers/centiped.c +++ b/src/drivers/centiped.c @@ -12,6 +12,23 @@ The prom pcb location is:P4 and is 256x4 (i need to update the dump, this one is read in 8bit-mode) +Known roms (listed in the manual) that need to be dumped/verified: + +Centipede: + 136001-203.d1 <-- Are these the proper labels for the timed version??? + 136001-204.e1 + 136001-205.fh1 + 136001-206.j1 + + 136001-303.d1 <-- Revision 3 set for the above listed roms + 136001-304.e1 + 136001-305.fh1 + 136001-306.j1 + +Milipede: + 136013-109.5p + 136013-110.5r + **************************************************************************** Main clock: XTAL = 12.096 MHz @@ -330,7 +347,7 @@ static MACHINE_RESET( centiped ) static MACHINE_RESET( magworm ) { - machine_reset_centiped(); + machine_reset_centiped(machine); /* kludge: clear RAM so that magworm can be reset cleanly */ memset(rambase, 0, 0x400); @@ -445,7 +462,7 @@ static WRITE8_HANDLER( led_w ) static READ8_HANDLER( caterplr_rand_r ) { - return mame_rand() % 0xff; + return mame_rand(Machine) % 0xff; } @@ -1461,33 +1478,33 @@ MACHINE_DRIVER_END ROM_START( centiped ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "centiped.307", 0x2000, 0x0800, CRC(5ab0d9de) SHA1(8ea6e3304202831aabaf31dbd0f970a7b3bfe421) ) - ROM_LOAD( "centiped.308", 0x2800, 0x0800, CRC(4c07fd3e) SHA1(af4fdbf32c23b1864819d620a874e7f205da3cdb) ) - ROM_LOAD( "centiped.309", 0x3000, 0x0800, CRC(ff69b424) SHA1(689fa560d40a384dcbcad7c8095bc12e91875580) ) - ROM_LOAD( "centiped.310", 0x3800, 0x0800, CRC(44e40fa4) SHA1(c557db83876afc8ab52047ab1a3c3bfef34d6351) ) + ROM_LOAD( "136001-307.d1", 0x2000, 0x0800, CRC(5ab0d9de) SHA1(8ea6e3304202831aabaf31dbd0f970a7b3bfe421) ) + ROM_LOAD( "136001-308.e1", 0x2800, 0x0800, CRC(4c07fd3e) SHA1(af4fdbf32c23b1864819d620a874e7f205da3cdb) ) + ROM_LOAD( "136001-309.fh1", 0x3000, 0x0800, CRC(ff69b424) SHA1(689fa560d40a384dcbcad7c8095bc12e91875580) ) + ROM_LOAD( "136001-310.j1", 0x3800, 0x0800, CRC(44e40fa4) SHA1(c557db83876afc8ab52047ab1a3c3bfef34d6351) ) ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "centiped.211", 0x0000, 0x0800, CRC(880acfb9) SHA1(6c862352c329776f2f9974a0df9dbe41f9dbc361) ) - ROM_LOAD( "centiped.212", 0x0800, 0x0800, CRC(b1397029) SHA1(974c03d29aeca672fffa4dfc00a06be6a851aacb) ) + ROM_LOAD( "136001-211.f7", 0x0000, 0x0800, CRC(880acfb9) SHA1(6c862352c329776f2f9974a0df9dbe41f9dbc361) ) /* May be labeled "136001-201", same data */ + ROM_LOAD( "136001-212.hj7", 0x0800, 0x0800, CRC(b1397029) SHA1(974c03d29aeca672fffa4dfc00a06be6a851aacb) ) /* May be labeled "136001-202", same data */ ROM_REGION( 0x0100, REGION_PROMS, 0 ) - ROM_LOAD( "136001.213", 0x0000, 0x0100, CRC(6fa3093a) SHA1(2b7aeca74c1ae4156bf1878453a047330f96f0a8) ) + ROM_LOAD( "136001-213.p4", 0x0000, 0x0100, CRC(6fa3093a) SHA1(2b7aeca74c1ae4156bf1878453a047330f96f0a8) ) ROM_END ROM_START( centipd2 ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "centiped.207", 0x2000, 0x0800, CRC(b2909e2f) SHA1(90ec90bd1e262861730afd5b113ec8dddd958ed8) ) - ROM_LOAD( "centiped.208", 0x2800, 0x0800, CRC(110e04ff) SHA1(4cb481792411b6aefac561744cfbe107aba8bab3) ) - ROM_LOAD( "centiped.209", 0x3000, 0x0800, CRC(cc2edb26) SHA1(b3ea580afa6a1ac44662051fae19c1efc320fcd3) ) - ROM_LOAD( "centiped.210", 0x3800, 0x0800, CRC(93999153) SHA1(8788c2b39fc5bfbb147a5e7c26ad360bba8d1063) ) + ROM_LOAD( "136001-207.d1", 0x2000, 0x0800, CRC(b2909e2f) SHA1(90ec90bd1e262861730afd5b113ec8dddd958ed8) ) + ROM_LOAD( "136001-208.e1", 0x2800, 0x0800, CRC(110e04ff) SHA1(4cb481792411b6aefac561744cfbe107aba8bab3) ) + ROM_LOAD( "136001-209.fh1", 0x3000, 0x0800, CRC(cc2edb26) SHA1(b3ea580afa6a1ac44662051fae19c1efc320fcd3) ) + ROM_LOAD( "136001-210.j1", 0x3800, 0x0800, CRC(93999153) SHA1(8788c2b39fc5bfbb147a5e7c26ad360bba8d1063) ) ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "centiped.211", 0x0000, 0x0800, CRC(880acfb9) SHA1(6c862352c329776f2f9974a0df9dbe41f9dbc361) ) - ROM_LOAD( "centiped.212", 0x0800, 0x0800, CRC(b1397029) SHA1(974c03d29aeca672fffa4dfc00a06be6a851aacb) ) + ROM_LOAD( "136001-211.f7", 0x0000, 0x0800, CRC(880acfb9) SHA1(6c862352c329776f2f9974a0df9dbe41f9dbc361) ) /* May be labeled "136001-201", same data */ + ROM_LOAD( "136001-212.hj7", 0x0800, 0x0800, CRC(b1397029) SHA1(974c03d29aeca672fffa4dfc00a06be6a851aacb) ) /* May be labeled "136001-202", same data */ ROM_REGION( 0x0100, REGION_PROMS, 0 ) - ROM_LOAD( "136001.213", 0x0000, 0x0100, CRC(6fa3093a) SHA1(2b7aeca74c1ae4156bf1878453a047330f96f0a8) ) + ROM_LOAD( "136001-213.p4", 0x0000, 0x0100, CRC(6fa3093a) SHA1(2b7aeca74c1ae4156bf1878453a047330f96f0a8) ) ROM_END @@ -1499,11 +1516,11 @@ ROM_START( centtime ) ROM_LOAD( "cent_j1.bin", 0x3800, 0x0800, CRC(33ce4640) SHA1(780c2eb320f64fad6b265c0dada961646ed30174) ) ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "centiped.211", 0x0000, 0x0800, CRC(880acfb9) SHA1(6c862352c329776f2f9974a0df9dbe41f9dbc361) ) - ROM_LOAD( "centiped.212", 0x0800, 0x0800, CRC(b1397029) SHA1(974c03d29aeca672fffa4dfc00a06be6a851aacb) ) + ROM_LOAD( "136001-211.f7", 0x0000, 0x0800, CRC(880acfb9) SHA1(6c862352c329776f2f9974a0df9dbe41f9dbc361) ) /* May be labeled "136001-201", same data */ + ROM_LOAD( "136001-212.hj7", 0x0800, 0x0800, CRC(b1397029) SHA1(974c03d29aeca672fffa4dfc00a06be6a851aacb) ) /* May be labeled "136001-202", same data */ ROM_REGION( 0x0100, REGION_PROMS, 0 ) - ROM_LOAD( "136001.213", 0x0000, 0x0100, CRC(6fa3093a) SHA1(2b7aeca74c1ae4156bf1878453a047330f96f0a8) ) + ROM_LOAD( "136001-213.p4", 0x0000, 0x0100, CRC(6fa3093a) SHA1(2b7aeca74c1ae4156bf1878453a047330f96f0a8) ) ROM_END @@ -1519,24 +1536,24 @@ ROM_START( caterplr ) ROM_LOAD( "olympia.c33", 0x0800, 0x0800, CRC(c2b08489) SHA1(9427e54537312ee0a70ec7bd1c039e92f8cfadad) ) ROM_REGION( 0x0100, REGION_PROMS, 0 ) - ROM_LOAD( "136001.213", 0x0000, 0x0100, CRC(6fa3093a) SHA1(2b7aeca74c1ae4156bf1878453a047330f96f0a8) ) + ROM_LOAD( "136001-213.p4", 0x0000, 0x0100, CRC(6fa3093a) SHA1(2b7aeca74c1ae4156bf1878453a047330f96f0a8) ) ROM_END ROM_START( centipdb ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "d1", 0x2000, 0x0800, CRC(b17b8e0b) SHA1(01944cf040cf23aeb4c50d4f2e63181e08a07310) ) - ROM_LOAD( "e1", 0x2800, 0x0800, CRC(7684398e) SHA1(eea8e05506a7af2fec55c2689e3caafc62ea524f) ) - ROM_LOAD( "h1", 0x3000, 0x0800, CRC(74580fe4) SHA1(35b8a8675e4e020e234e51c3e4bd4ee5c24b79d2) ) - ROM_LOAD( "j1", 0x3800, 0x0800, CRC(84600161) SHA1(e9a6801c6f59e2b34e692e9aa71845d2e64a2379) ) - ROM_LOAD( "k1", 0x6000, 0x0800, CRC(f1aa329b) SHA1(e4689de0f94d11f125ee7548a3f8128ff8e8da51) ) + ROM_LOAD( "d1", 0x2000, 0x0800, CRC(b17b8e0b) SHA1(01944cf040cf23aeb4c50d4f2e63181e08a07310) ) + ROM_LOAD( "e1", 0x2800, 0x0800, CRC(7684398e) SHA1(eea8e05506a7af2fec55c2689e3caafc62ea524f) ) + ROM_LOAD( "h1", 0x3000, 0x0800, CRC(74580fe4) SHA1(35b8a8675e4e020e234e51c3e4bd4ee5c24b79d2) ) + ROM_LOAD( "j1", 0x3800, 0x0800, CRC(84600161) SHA1(e9a6801c6f59e2b34e692e9aa71845d2e64a2379) ) + ROM_LOAD( "k1", 0x6000, 0x0800, CRC(f1aa329b) SHA1(e4689de0f94d11f125ee7548a3f8128ff8e8da51) ) ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "centiped.211", 0x0000, 0x0800, CRC(880acfb9) SHA1(6c862352c329776f2f9974a0df9dbe41f9dbc361) ) - ROM_LOAD( "centiped.212", 0x0800, 0x0800, CRC(b1397029) SHA1(974c03d29aeca672fffa4dfc00a06be6a851aacb) ) + ROM_LOAD( "136001-211.f7", 0x0000, 0x0800, CRC(880acfb9) SHA1(6c862352c329776f2f9974a0df9dbe41f9dbc361) ) + ROM_LOAD( "136001-212.hj7", 0x0800, 0x0800, CRC(b1397029) SHA1(974c03d29aeca672fffa4dfc00a06be6a851aacb) ) ROM_REGION( 0x0100, REGION_PROMS, 0 ) - ROM_LOAD( "136001.213", 0x0000, 0x0100, CRC(6fa3093a) SHA1(2b7aeca74c1ae4156bf1878453a047330f96f0a8) ) + ROM_LOAD( "136001-213.p4", 0x0000, 0x0100, CRC(6fa3093a) SHA1(2b7aeca74c1ae4156bf1878453a047330f96f0a8) ) ROM_END ROM_START( millpac ) @@ -1558,27 +1575,30 @@ ROM_END ROM_START( magworm ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "magworm.0", 0x2000, 0x0800, CRC(a88e970a) SHA1(f0cc6fdcdecf05f11cef7ebae4e11783a8bbc5ba) ) - ROM_LOAD( "magworm.1", 0x2800, 0x0800, CRC(7a04047e) SHA1(3c00756c8ffbc5e78d4a7409802cc2ed8f668264) ) - ROM_LOAD( "magworm.2", 0x3000, 0x0800, CRC(f127f1c3) SHA1(3fddcd6f458ac60eaebacef921b522dd2c7b8141) ) - ROM_LOAD( "magworm.3", 0x3800, 0x0800, CRC(478d92b4) SHA1(99cce957c50ca80ddde408d9188fc2ed04d8da68) ) + ROM_LOAD( "11005-0.k0", 0x2000, 0x0800, CRC(a88e970a) SHA1(f0cc6fdcdecf05f11cef7ebae4e11783a8bbc5ba) ) + ROM_LOAD( "11005-1.k1", 0x2800, 0x0800, CRC(7a04047e) SHA1(3c00756c8ffbc5e78d4a7409802cc2ed8f668264) ) + ROM_LOAD( "11005-2.k2", 0x3000, 0x0800, CRC(f127f1c3) SHA1(3fddcd6f458ac60eaebacef921b522dd2c7b8141) ) + ROM_LOAD( "11005-3p.k3", 0x3800, 0x0800, CRC(478d92b4) SHA1(99cce957c50ca80ddde408d9188fc2ed04d8da68) ) ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "magworm.4", 0x0000, 0x0800, CRC(cea64e1a) SHA1(9022102124e1ad93f912ce8bdf85f8a886b0879b) ) - ROM_LOAD( "magworm.5", 0x0800, 0x0800, CRC(24558ea5) SHA1(8cd7131e19afd7a96191b1b3c3fba7ae9a140f4b) ) + ROM_LOAD( "11005-4.c4", 0x0000, 0x0800, CRC(cea64e1a) SHA1(9022102124e1ad93f912ce8bdf85f8a886b0879b) ) + ROM_LOAD( "11005-5.c5", 0x0800, 0x0800, CRC(24558ea5) SHA1(8cd7131e19afd7a96191b1b3c3fba7ae9a140f4b) ) ROM_END ROM_START( milliped ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "milliped.104", 0x4000, 0x1000, CRC(40711675) SHA1(b595d6a0f5d3c611ade1b83a94c3b909d2124dc4) ) - ROM_LOAD( "milliped.103", 0x5000, 0x1000, CRC(fb01baf2) SHA1(9c1d0bbc20bf25dd21761a311fd1ed80aa029241) ) - ROM_LOAD( "milliped.102", 0x6000, 0x1000, CRC(62e137e0) SHA1(9fe40db55ba1d20d4f11704f7f5df9ff75b87f30) ) - ROM_LOAD( "milliped.101", 0x7000, 0x1000, CRC(46752c7d) SHA1(ab06b1fd80271849946f90757b3837b617394929) ) + ROM_LOAD( "136013-104.1mn", 0x4000, 0x1000, CRC(40711675) SHA1(b595d6a0f5d3c611ade1b83a94c3b909d2124dc4) ) + ROM_LOAD( "136013-103.1l", 0x5000, 0x1000, CRC(fb01baf2) SHA1(9c1d0bbc20bf25dd21761a311fd1ed80aa029241) ) + ROM_LOAD( "136013-102.1jk", 0x6000, 0x1000, CRC(62e137e0) SHA1(9fe40db55ba1d20d4f11704f7f5df9ff75b87f30) ) + ROM_LOAD( "136013-101.1h", 0x7000, 0x1000, CRC(46752c7d) SHA1(ab06b1fd80271849946f90757b3837b617394929) ) ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "milliped.107", 0x0000, 0x0800, CRC(68c3437a) SHA1(4c7ea33d9501456ee8f5a642da7d6c972f2bb90d) ) - ROM_LOAD( "milliped.106", 0x0800, 0x0800, CRC(f4468045) SHA1(602fcc7290f9f4eacb841c76665961ebf4307f80) ) + ROM_LOAD( "136013-107.5r", 0x0000, 0x0800, CRC(68c3437a) SHA1(4c7ea33d9501456ee8f5a642da7d6c972f2bb90d) ) + ROM_LOAD( "136013-106.5p", 0x0800, 0x0800, CRC(f4468045) SHA1(602fcc7290f9f4eacb841c76665961ebf4307f80) ) + + ROM_REGION( 0x0100, REGION_PROMS, 0 ) + ROM_LOAD( "136001-213.7e", 0x0000, 0x0100, CRC(6fa3093a) SHA1(2b7aeca74c1ae4156bf1878453a047330f96f0a8) ) /* not used */ ROM_END diff --git a/src/drivers/champbwl.c b/src/drivers/champbwl.c index c71a2aa39..988ef0ce4 100644 --- a/src/drivers/champbwl.c +++ b/src/drivers/champbwl.c @@ -3,6 +3,13 @@ Championship Bowling Romstar Inc., 1989 +Driver by Pierpaolo Prazzoli + +To Do: + Hook up player 2 controls for cocktail mode + +----------------------------------------------------------- + This game runs on Seta Hardware. PCB Layout @@ -93,7 +100,53 @@ PO-047A AB003002.3-2 2M MaskROM (DIP32) | AB003003.3-3 2M MaskROM (DIP32) / - Driver by Pierpaolo Prazzoli + + + Main Jamma Connector + Solder Side | Parts Side +------------------------------------------------------------------ + GND | A | 1 | GND + GND | B | 2 | GND + +5V | C | 3 | +5V + +5V | D | 4 | +5V + -5V | E | 5 | -5V + +12V | F | 6 | +12V +------------ KEY ------------| H | 7 |------------ KEY ----------- + Coin Counter 2 | J | 8 | Coin Counter 1 + Coin Lock Out 2 | K | 9 | Coin Lock Out 1 + Speaker (-) | L | 10| Speaker (+) + | M | 11| + Video Green | N | 12| Video Red + Video Sync | P | 13| Video Blue + Service SW | R | 14| Video GND + Tilt Switch | S | 15| Test Switch + Coin Switch 2 | T | 16| Coin Switch 1 + Player 2 Start | U | 17| Player 1 Start + #2 Trackball X Direction* | V | 18| #1 Trackball X Direction + #2 Trackball Y Direction* | W | 19| #1 Trackball Y Direction + #2 Trackball X Clock* | X | 20| #1 Trackball X Clock + #2 Trackball Y Clock* | Y | 21| #1 Trackball Y Clock + Player 2 Hook Right* | Z | 22| Player 1 Hook Right + Player 2 Hook Left* | a | 23| Player 1 Hook Left + | b | 24| Player Select + | c | 25| + | d | 26| + GND | e | 27| GND + GND | f | 28| GND + +* Cocktail Mode only. + + Standard 6 pin Trackball connector + + Pin Wire Funtion +------------------------------ + 1 | BLK | Ground + 2 | RED | +5 Volts DC + 3 | YEL | Y Clock + 4 | GRN | Y Direction + 5 | BLU | X Direction + 6 | PUR | X Clock + */ @@ -204,14 +257,14 @@ INPUT_PORTS_START( champbwl ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START - PORT_SERVICE( 0x01, IP_ACTIVE_LOW ) - 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( Free_Play ) ) + PORT_SERVICE_DIPLOC( 0x01, IP_ACTIVE_LOW, "SW1:1" ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW1:2") + PORT_DIPSETTING( 0x02, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("SW1:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x00, DEF_STR( Demo_Sounds ) ) + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) @@ -228,13 +281,13 @@ INPUT_PORTS_START( champbwl ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:5") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:6") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x0c, 0x0c, "License" ) + PORT_DIPNAME( 0x0c, 0x0c, "License" ) PORT_DIPLOCATION("SW1:7,8") PORT_DIPSETTING( 0x00, "Romstar (1)") PORT_DIPSETTING( 0x04, "Romstar (2)") PORT_DIPSETTING( 0x08, "Seta U.S.A, Romstar License" ) diff --git a/src/drivers/changela.c b/src/drivers/changela.c index 1e48ccd1e..efa675725 100644 --- a/src/drivers/changela.c +++ b/src/drivers/changela.c @@ -664,7 +664,7 @@ static WRITE8_HANDLER (colors_w) bit2 = (c >> 8) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(color_index,r,g,b); + palette_set_color(Machine,color_index,r,g,b); } static READ8_HANDLER( mcu_r ) diff --git a/src/drivers/cherrym.c b/src/drivers/cherrym.c index d37fc0255..fe7065894 100644 --- a/src/drivers/cherrym.c +++ b/src/drivers/cherrym.c @@ -46,7 +46,7 @@ PALETTE_INIT( cm ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 0) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/drivers/chqflag.c b/src/drivers/chqflag.c index 90c09ae71..2aea27bad 100644 --- a/src/drivers/chqflag.c +++ b/src/drivers/chqflag.c @@ -95,9 +95,9 @@ static WRITE8_HANDLER( chqflag_vreg_w ) /* the headlight (which have the shadow bit set) become highlights */ /* Maybe one of the bits inverts the SHAD line while the other darkens the background. */ if (data & 0x08) - palette_set_shadow_factor(1/PALETTE_DEFAULT_SHADOW_FACTOR); + palette_set_shadow_factor(Machine,1/PALETTE_DEFAULT_SHADOW_FACTOR); else - palette_set_shadow_factor(PALETTE_DEFAULT_SHADOW_FACTOR); + palette_set_shadow_factor(Machine,PALETTE_DEFAULT_SHADOW_FACTOR); if ((data & 0x80) != last) { @@ -108,7 +108,7 @@ static WRITE8_HANDLER( chqflag_vreg_w ) /* only affect the background */ for (i = 512;i < 1024;i++) - palette_set_brightness(i,brt); + palette_set_brightness(Machine,i,brt); } //if ((data & 0xf8) && (data & 0xf8) != 0x88) diff --git a/src/drivers/cischeat.c b/src/drivers/cischeat.c index 231d0a85c..1d871ea68 100644 --- a/src/drivers/cischeat.c +++ b/src/drivers/cischeat.c @@ -226,22 +226,22 @@ static READ16_HANDLER( rom_3_r ) {return rom_3[offset];} WRITE16_HANDLER( bigrun_paletteram16_w ) { UINT16 word = COMBINE_DATA(&paletteram16[offset]); - int r = ((word >> 8) & 0xF0 ) | ((word << 0) & 0x08); - int g = ((word >> 4) & 0xF0 ) | ((word << 1) & 0x08); - int b = ((word >> 0) & 0xF0 ) | ((word << 2) & 0x08); + int r = pal5bit(((word >> 11) & 0x1E ) | ((word >> 3) & 0x01)); + int g = pal5bit(((word >> 7 ) & 0x1E ) | ((word >> 2) & 0x01)); + int b = pal5bit(((word >> 3 ) & 0x1E ) | ((word >> 1) & 0x01)); // Scroll 0 - if ( (offset >= 0x0e00/2) && (offset <= 0x0fff/2) ) { palette_set_color(0x000 + offset - 0x0e00/2, r,g,b ); return;} + if ( (offset >= 0x0e00/2) && (offset <= 0x0fff/2) ) { palette_set_color(Machine, 0x000 + offset - 0x0e00/2, r,g,b ); return;} // Scroll 1 - if ( (offset >= 0x1600/2) && (offset <= 0x17ff/2) ) { palette_set_color(0x100 + offset - 0x1600/2, r,g,b ); return;} + if ( (offset >= 0x1600/2) && (offset <= 0x17ff/2) ) { palette_set_color(Machine, 0x100 + offset - 0x1600/2, r,g,b ); return;} // Road 0 - if ( (offset >= 0x1800/2) && (offset <= 0x1fff/2) ) { palette_set_color(0x200 + offset - 0x1800/2, r,g,b ); return;} + if ( (offset >= 0x1800/2) && (offset <= 0x1fff/2) ) { palette_set_color(Machine, 0x200 + offset - 0x1800/2, r,g,b ); return;} // Road 1 - if ( (offset >= 0x2000/2) && (offset <= 0x27ff/2) ) { palette_set_color(0x600 + offset - 0x2000/2, r,g,b ); return;} + if ( (offset >= 0x2000/2) && (offset <= 0x27ff/2) ) { palette_set_color(Machine, 0x600 + offset - 0x2000/2, r,g,b ); return;} // Sprites - if ( (offset >= 0x2800/2) && (offset <= 0x2fff/2) ) { palette_set_color(0xa00 + offset - 0x2800/2, r,g,b ); return;} + if ( (offset >= 0x2800/2) && (offset <= 0x2fff/2) ) { palette_set_color(Machine, 0xa00 + offset - 0x2800/2, r,g,b ); return;} // Scroll 2 - if ( (offset >= 0x3600/2) && (offset <= 0x37ff/2) ) { palette_set_color(0xe00 + offset - 0x3600/2, r,g,b ); return;} + if ( (offset >= 0x3600/2) && (offset <= 0x37ff/2) ) { palette_set_color(Machine, 0xe00 + offset - 0x3600/2, r,g,b ); return;} } static ADDRESS_MAP_START( bigrun_readmem, ADDRESS_SPACE_PROGRAM, 16 ) @@ -298,22 +298,22 @@ ADDRESS_MAP_END WRITE16_HANDLER( cischeat_paletteram16_w ) { UINT16 word = COMBINE_DATA(&paletteram16[offset]); - int r = ((word >> 8) & 0xF0 ) | ((word << 0) & 0x08); - int g = ((word >> 4) & 0xF0 ) | ((word << 1) & 0x08); - int b = ((word >> 0) & 0xF0 ) | ((word << 2) & 0x08); + int r = pal5bit(((word >> 11) & 0x1E ) | ((word >> 3) & 0x01)); + int g = pal5bit(((word >> 7 ) & 0x1E ) | ((word >> 2) & 0x01)); + int b = pal5bit(((word >> 3 ) & 0x1E ) | ((word >> 1) & 0x01)); // Scroll 0 - if ( (offset >= 0x1c00/2) && (offset <= 0x1fff/2) ) { palette_set_color(0x000 + offset - 0x1c00/2, r,g,b ); return;} + if ( (offset >= 0x1c00/2) && (offset <= 0x1fff/2) ) { palette_set_color(Machine, 0x000 + offset - 0x1c00/2, r,g,b ); return;} // Scroll 1 - if ( (offset >= 0x2c00/2) && (offset <= 0x2fff/2) ) { palette_set_color(0x200 + offset - 0x2c00/2, r,g,b ); return;} + if ( (offset >= 0x2c00/2) && (offset <= 0x2fff/2) ) { palette_set_color(Machine, 0x200 + offset - 0x2c00/2, r,g,b ); return;} // Scroll 2 - if ( (offset >= 0x6c00/2) && (offset <= 0x6fff/2) ) { palette_set_color(0x400 + offset - 0x6c00/2, r,g,b ); return;} + if ( (offset >= 0x6c00/2) && (offset <= 0x6fff/2) ) { palette_set_color(Machine, 0x400 + offset - 0x6c00/2, r,g,b ); return;} // Road 0 - if ( (offset >= 0x3800/2) && (offset <= 0x3fff/2) ) { palette_set_color(0x600 + offset - 0x3800/2, r,g,b ); return;} + if ( (offset >= 0x3800/2) && (offset <= 0x3fff/2) ) { palette_set_color(Machine, 0x600 + offset - 0x3800/2, r,g,b ); return;} // Road 1 - if ( (offset >= 0x4800/2) && (offset <= 0x4fff/2) ) { palette_set_color(0xa00 + offset - 0x4800/2, r,g,b ); return;} + if ( (offset >= 0x4800/2) && (offset <= 0x4fff/2) ) { palette_set_color(Machine, 0xa00 + offset - 0x4800/2, r,g,b ); return;} // Sprites - if ( (offset >= 0x5000/2) && (offset <= 0x5fff/2) ) { palette_set_color(0xe00 + offset - 0x5000/2, r,g,b ); return;} + if ( (offset >= 0x5000/2) && (offset <= 0x5fff/2) ) { palette_set_color(Machine, 0xe00 + offset - 0x5000/2, r,g,b ); return;} } static ADDRESS_MAP_START( cischeat_readmem, ADDRESS_SPACE_PROGRAM, 16 ) @@ -366,22 +366,22 @@ ADDRESS_MAP_END WRITE16_HANDLER( f1gpstar_paletteram16_w ) { UINT16 word = COMBINE_DATA(&paletteram16[offset]); - int r = ((word >> 8) & 0xF0 ) | ((word << 0) & 0x08); - int g = ((word >> 4) & 0xF0 ) | ((word << 1) & 0x08); - int b = ((word >> 0) & 0xF0 ) | ((word << 2) & 0x08); + int r = pal5bit(((word >> 11) & 0x1E ) | ((word >> 3) & 0x01)); + int g = pal5bit(((word >> 7 ) & 0x1E ) | ((word >> 2) & 0x01)); + int b = pal5bit(((word >> 3 ) & 0x1E ) | ((word >> 1) & 0x01)); // Scroll 0 - if ( (offset >= 0x1e00/2) && (offset <= 0x1fff/2) ) { palette_set_color(0x000 + offset - 0x1e00/2, r,g,b ); return;} + if ( (offset >= 0x1e00/2) && (offset <= 0x1fff/2) ) { palette_set_color(Machine, 0x000 + offset - 0x1e00/2, r,g,b ); return;} // Scroll 1 - if ( (offset >= 0x2e00/2) && (offset <= 0x2fff/2) ) { palette_set_color(0x100 + offset - 0x2e00/2, r,g,b ); return;} + if ( (offset >= 0x2e00/2) && (offset <= 0x2fff/2) ) { palette_set_color(Machine, 0x100 + offset - 0x2e00/2, r,g,b ); return;} // Scroll 2 - if ( (offset >= 0x6e00/2) && (offset <= 0x6fff/2) ) { palette_set_color(0x200 + offset - 0x6e00/2, r,g,b ); return;} + if ( (offset >= 0x6e00/2) && (offset <= 0x6fff/2) ) { palette_set_color(Machine, 0x200 + offset - 0x6e00/2, r,g,b ); return;} // Road 0 - if ( (offset >= 0x3800/2) && (offset <= 0x3fff/2) ) { palette_set_color(0x300 + offset - 0x3800/2, r,g,b ); return;} + if ( (offset >= 0x3800/2) && (offset <= 0x3fff/2) ) { palette_set_color(Machine, 0x300 + offset - 0x3800/2, r,g,b ); return;} // Road 1 - if ( (offset >= 0x4800/2) && (offset <= 0x4fff/2) ) { palette_set_color(0x700 + offset - 0x4800/2, r,g,b ); return;} + if ( (offset >= 0x4800/2) && (offset <= 0x4fff/2) ) { palette_set_color(Machine, 0x700 + offset - 0x4800/2, r,g,b ); return;} // Sprites - if ( (offset >= 0x5000/2) && (offset <= 0x5fff/2) ) { palette_set_color(0xb00 + offset - 0x5000/2, r,g,b ); return;} + if ( (offset >= 0x5000/2) && (offset <= 0x5fff/2) ) { palette_set_color(Machine, 0xb00 + offset - 0x5000/2, r,g,b ); return;} } /* F1 GP Star tests: @@ -479,16 +479,16 @@ WRITE16_HANDLER( scudhamm_paletteram16_w ) { int newword = COMBINE_DATA(&paletteram16[offset]); - int r = ((newword >> 8) & 0xF0 ) | ((newword << 0) & 0x08); - int g = ((newword >> 4) & 0xF0 ) | ((newword << 1) & 0x08); - int b = ((newword >> 0) & 0xF0 ) | ((newword << 2) & 0x08); + int r = pal5bit(((newword >> 11) & 0x1E ) | ((newword >> 3) & 0x01)); + int g = pal5bit(((newword >> 7 ) & 0x1E ) | ((newword >> 2) & 0x01)); + int b = pal5bit(((newword >> 3 ) & 0x1E ) | ((newword >> 1) & 0x01)); // Scroll 0 - if ( (offset >= 0x1e00/2) && (offset <= 0x1fff/2) ) { palette_set_color(0x000 + offset - 0x1e00/2, r,g,b ); return;} + if ( (offset >= 0x1e00/2) && (offset <= 0x1fff/2) ) { palette_set_color(Machine, 0x000 + offset - 0x1e00/2, r,g,b ); return;} // Scroll 2 - if ( (offset >= 0x4e00/2) && (offset <= 0x4fff/2) ) { palette_set_color(0x100 + offset - 0x4e00/2, r,g,b ); return;} + if ( (offset >= 0x4e00/2) && (offset <= 0x4fff/2) ) { palette_set_color(Machine, 0x100 + offset - 0x4e00/2, r,g,b ); return;} // Sprites - if ( (offset >= 0x3000/2) && (offset <= 0x3fff/2) ) { palette_set_color(0x200 + offset - 0x3000/2, r,g,b ); return;} + if ( (offset >= 0x3000/2) && (offset <= 0x3fff/2) ) { palette_set_color(Machine, 0x200 + offset - 0x3000/2, r,g,b ); return;} } @@ -1041,17 +1041,20 @@ INPUT_PORTS_START( bigrun ) PORT_START_TAG("IN4") // DSW 2 & 3 - $80006.w // DSW 3 - PORT_DIPNAME( 0x0003, 0x0003, "Unknown 3-0&1*" ) - PORT_DIPSETTING( 0x0003, "3" ) - PORT_DIPSETTING( 0x0002, "2" ) - PORT_DIPSETTING( 0x0001, "1" ) - PORT_DIPSETTING( 0x0000, "0" ) + PORT_DIPNAME( 0x0003, 0x0003, "Extra Setting For Coin B" ) + PORT_DIPSETTING( 0x0003, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x0001, DEF_STR( 1C_5C ) ) PORT_CONDITION("IN4",0x1c00,PORTCOND_NOTEQUALS,0x0000) + PORT_DIPSETTING( 0x0002, DEF_STR( 1C_6C ) ) PORT_CONDITION("IN4",0x1c00,PORTCOND_NOTEQUALS,0x0000) + PORT_DIPSETTING( 0x0000, DEF_STR( 1C_7C ) ) PORT_CONDITION("IN4",0x1c00,PORTCOND_NOTEQUALS,0x0000) + PORT_DIPSETTING( 0x0001, DEF_STR( Unused ) ) PORT_CONDITION("IN4",0x1c00,PORTCOND_EQUALS,0x0000) + PORT_DIPSETTING( 0x0002, DEF_STR( Unused ) ) PORT_CONDITION("IN4",0x1c00,PORTCOND_EQUALS,0x0000) + PORT_DIPSETTING( 0x0000, DEF_STR( Unused ) ) PORT_CONDITION("IN4",0x1c00,PORTCOND_EQUALS,0x0000) PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Allow_Continue ) ) PORT_DIPSETTING( 0x0004, DEF_STR( No ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x0008, 0x0008, "Unknown 3-3" ) - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Region ) ) // If you try to change Unit ID the game show the error message in different language + PORT_DIPSETTING( 0x0008, DEF_STR( Japanese ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( English) ) PORT_DIPNAME( 0x0010, 0x0010, "Move Cabinet" ) PORT_DIPSETTING( 0x0000, DEF_STR( No ) ) PORT_DIPSETTING( 0x0010, DEF_STR( Yes ) ) @@ -1071,7 +1074,7 @@ INPUT_PORTS_START( bigrun ) PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Demo_Sounds ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0200, DEF_STR( On ) ) - PORT_DIPNAME( 0x1c00, 0x1c00, DEF_STR( Coin_B ) ) + PORT_DIPNAME( 0x1c00, 0x1c00, DEF_STR( Coin_B ) ) PORT_CONDITION("IN4",0x0003,PORTCOND_EQUALS,0x0003) PORT_DIPSETTING( 0x1000, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x0800, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x1800, DEF_STR( 2C_1C ) ) @@ -1080,6 +1083,9 @@ INPUT_PORTS_START( bigrun ) PORT_DIPSETTING( 0x1400, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x0400, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0x1c00, 0x1c00, DEF_STR( Coin_B ) ) PORT_CONDITION("IN4",0x0003,PORTCOND_NOTEQUALS,0x0003) + PORT_DIPSETTING( 0x1c00, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( Free_Play ) ) PORT_DIPNAME( 0xe000, 0xe000, DEF_STR( Coin_A ) ) PORT_DIPSETTING( 0x8000, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x4000, DEF_STR( 3C_1C ) ) @@ -1228,22 +1234,22 @@ INPUT_PORTS_START( f1gpstar ) Japan "race together" in Test Mode, Always Choose Race Japanese, Km/h, "handle shock" , "(c)1991", USA English, Mph , "steering shock", "(c)1992 North America Only" - England English, Mph , "steering shock", "(c)1992" + Europe English, Mph , "steering shock", "(c)1992" France French, Km/h, "steering shock", "(c)1992" */ PORT_START_TAG("IN1") // DSW 1 & 2 - $80000.w -> !f9012 // DSW 1 ( Coinage - it changes with Country: we use IN6 & IN7 ) - PORT_DIPNAME( 0x0040, 0x0040, "Free Play (UK FR)" ) + PORT_DIPNAME( 0x0040, 0x0040, "Free Play (EU & FR)" ) PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) // unused? PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) // DSW 2 - PORT_DIPNAME( 0x0300, 0x0100, "Country" ) // -> !f901e + PORT_DIPNAME( 0x0300, 0x0100, DEF_STR( Region ) ) // -> !f901e PORT_DIPSETTING( 0x0300, DEF_STR( Japan ) ) PORT_DIPSETTING( 0x0200, DEF_STR( USA ) ) - PORT_DIPSETTING( 0x0100, "UK" ) + PORT_DIPSETTING( 0x0100, DEF_STR( Europe ) ) PORT_DIPSETTING( 0x0000, "France" ) PORT_DIPNAME( 0x0c00, 0x0c00, DEF_STR( Difficulty ) ) // -> !f9026 PORT_DIPSETTING( 0x0000, DEF_STR( Easy ) ) // 58 <- Initial Time (seconds, Germany) @@ -1256,7 +1262,7 @@ INPUT_PORTS_START( f1gpstar ) PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Demo_Sounds ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x2000, DEF_STR( On ) ) - PORT_DIPNAME( 0x4000, 0x4000, "Choose Race (US UK FR)" ) // -> f0020 + PORT_DIPNAME( 0x4000, 0x4000, "Choose Race (US EU FR)" ) // -> f0020 PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x4000, DEF_STR( On ) ) PORT_DIPNAME( 0x8000, 0x8000, "Vibrations" ) @@ -1335,8 +1341,8 @@ INPUT_PORTS_START( f1gpstar ) PORT_DIPSETTING( 0x0028, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x0020, DEF_STR( 1C_4C ) ) - PORT_START_TAG("IN7") // Coinage UK & France (it changes with Country) - PORT_DIPNAME( 0x0007, 0x0007, "Coin A (UK FR)" ) + PORT_START_TAG("IN7") // Coinage Europe & France (it changes with Country) + PORT_DIPNAME( 0x0007, 0x0007, "Coin A (EU FR)" ) PORT_DIPSETTING( 0x0007, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x0000, DEF_STR( 2C_3C ) ) PORT_DIPSETTING( 0x0006, DEF_STR( 1C_2C ) ) @@ -1345,7 +1351,7 @@ INPUT_PORTS_START( f1gpstar ) PORT_DIPSETTING( 0x0003, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x0002, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x0001, DEF_STR( 1C_7C ) ) - PORT_DIPNAME( 0x0038, 0x0038, "Coin B (UK FR)" ) + PORT_DIPNAME( 0x0038, 0x0038, "Coin B (EU FR)" ) PORT_DIPSETTING( 0x0000, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x0008, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x0010, DEF_STR( 3C_1C ) ) @@ -1402,15 +1408,14 @@ INPUT_PORTS_START( wildplt ) PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Demo_Sounds ) ) PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x1000, 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_DIPNAME( 0x2000, 0x2000, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x2000, "2" ) + PORT_DIPSETTING( 0x0000, "4" ) + PORT_DIPNAME( 0xc000, 0xc000, DEF_STR( Region ) ) + PORT_DIPSETTING( 0x4000, "Europe?" ) + PORT_DIPSETTING( 0x8000, DEF_STR( USA ) ) + PORT_DIPSETTING( 0xc000, DEF_STR( Japan ) ) + PORT_DIPSETTING( 0x0000, "France?" ) PORT_START_TAG("IN1") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) @@ -1423,12 +1428,12 @@ INPUT_PORTS_START( wildplt ) PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) - 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_BIT( 0x8000, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Emergency Button") //E Stop for motors? + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Up Limit SW. + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Dow Limit SW. + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Center SW. + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Senser SW. #1 + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // Senser SW. #2 + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Emergency Button") //E Stop for motors? ( Senser SW. #3 ) PORT_START_TAG("IN2") PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_MINMAX(0,0xff) PORT_SENSITIVITY(35) PORT_KEYDELTA(15) PORT_REVERSE @@ -2689,7 +2694,7 @@ DRIVER_INIT( wildplt ) { memory_install_read16_handler(0, ADDRESS_SPACE_PROGRAM, 0x080000, 0x087fff, 0, 0, wildplt_vregs_r ); - init_f1gpstar(); + init_f1gpstar(machine); } diff --git a/src/drivers/cloud9.c b/src/drivers/cloud9.c index 2a3aba92e..65e8a0804 100644 --- a/src/drivers/cloud9.c +++ b/src/drivers/cloud9.c @@ -131,7 +131,7 @@ INLINE void schedule_next_irq(int curscanline) curscanline = (curscanline + 64) & 255; /* next one at the start of this scanline */ - timer_adjust(irq_timer, cpu_getscanlinetime(curscanline), curscanline, 0); + mame_timer_adjust(irq_timer, video_screen_get_time_until_pos(0, curscanline, 0), curscanline, time_zero); } @@ -145,7 +145,7 @@ static void clock_irq(int param) } /* force an update now */ - video_screen_update_partial(0, cpu_getscanline()); + video_screen_update_partial(0, video_screen_get_vpos(0)); /* find the next edge */ schedule_next_irq(param); @@ -154,7 +154,7 @@ static void clock_irq(int param) static UINT32 get_vblank(void *param) { - int scanline = cpu_getscanline(); + int scanline = video_screen_get_vpos(0); return (~syncprom[scanline & 0xff] >> 1) & 1; } diff --git a/src/drivers/cntsteer.c b/src/drivers/cntsteer.c index 25b1eb172..5a0380ea2 100644 --- a/src/drivers/cntsteer.c +++ b/src/drivers/cntsteer.c @@ -60,7 +60,7 @@ PALETTE_INIT( zerotrgt ) bit2 = (color_prom[i+256] >> 2) & 0x01; b = /*255 - */(0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } static int colo=0; diff --git a/src/drivers/coinmstr.c b/src/drivers/coinmstr.c index 8c41a92aa..0c7a6da58 100644 --- a/src/drivers/coinmstr.c +++ b/src/drivers/coinmstr.c @@ -181,32 +181,72 @@ ADDRESS_MAP_END INPUT_PORTS_START( quizmstr ) PORT_START - PORT_DIPNAME( 0x01, 0x01, "0" ) + PORT_BIT ( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT ( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1) PORT_NAME("Bookkeeping") PORT_TOGGLE /* Button 2 for second page, Button 3 erases data */ + PORT_BIT ( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT ( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT ( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT ( 0x20, IP_ACTIVE_LOW, IPT_SERVICE) PORT_TOGGLE + PORT_BIT ( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT ( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) + + PORT_START + PORT_BIT ( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) + PORT_BIT ( 0x02, IP_ACTIVE_LOW, IPT_BUTTON5 ) + PORT_BIT ( 0x04, IP_ACTIVE_LOW, IPT_BUTTON6 ) + PORT_BIT ( 0x08, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT ( 0x10, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT ( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) + /* If 0x40 is HIGH the DIP Test Mode does work but bookkeeping shows always 0's */ + /* If 0x40 is LOW Bookkeeping does work, but the second page (selected categories) is missing */ + PORT_BIT ( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT ( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START + PORT_DIPNAME( 0x01, 0x01, "2-01" ) PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Show Information" ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_DIPNAME( 0x20, 0x20, "Question Roms Test" ) + 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_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) + 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 - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) - PORT_DIPNAME( 0x02, 0x02, "1" ) + PORT_DIPNAME( 0x01, 0x01, "3-01" ) + 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_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) + 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 ) ) @@ -214,6 +254,66 @@ INPUT_PORTS_START( quizmstr ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_1C ) ) + PORT_DIPNAME( 0x02, 0x02, "4-02" ) + 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, "Test Mode" ) + 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, "NVRAM Reset?" ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Self Test" ) + PORT_DIPSETTING( 0x00, DEF_STR( No )) + PORT_DIPSETTING( 0x80, DEF_STR( Yes )) +INPUT_PORTS_END + +INPUT_PORTS_START( trailblz ) + PORT_START + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN4 ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_SERVICE( 0x80, IP_ACTIVE_LOW ) + + PORT_START + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 ) + PORT_DIPNAME( 0x02, 0x02, "1" ) + 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_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Cont") + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Pass") + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Sel") + PORT_DIPNAME( 0x40, 0x40, "Show Refill" ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Show Stats" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START PORT_DIPNAME( 0x01, 0x01, "2" ) PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) @@ -276,7 +376,7 @@ INPUT_PORTS_START( quizmstr ) 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_DIPNAME( 0x08, 0x08, "Tests" ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) @@ -288,12 +388,12 @@ INPUT_PORTS_START( quizmstr ) PORT_DIPNAME( 0x40, 0x40, "NVRAM Reset?" ) PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, "Test?" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x80, 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 -INPUT_PORTS_START( trailblz ) +INPUT_PORTS_START( supnudg2 ) PORT_START PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) @@ -319,10 +419,10 @@ INPUT_PORTS_START( trailblz ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Cont") PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Pass") PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Sel") - PORT_DIPNAME( 0x40, 0x40, "Show Refill" ) + PORT_DIPNAME( 0x40, 0x40, "Show Refill?" ) PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, "Show Stats" ) + PORT_DIPNAME( 0x80, 0x80, "Show Stats?" ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -388,7 +488,7 @@ INPUT_PORTS_START( trailblz ) PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, "Tests" ) + PORT_DIPNAME( 0x08, 0x08, "Tests?" ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) @@ -397,10 +497,10 @@ INPUT_PORTS_START( trailblz ) PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, "NVRAM Reset" ) + PORT_DIPNAME( 0x40, 0x40, "NVRAM Reset?" ) PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x80, 0x80, "First Install (DIL 8)" ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END @@ -729,6 +829,6 @@ DRIVER_INIT( coinmstr ) } -GAME( 1985, quizmstr, 0, quizmstr, quizmstr, coinmstr, ROT0, "Coinmaster", "Quizmaster", GAME_WRONG_COLORS | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING ) -GAME( 1987, trailblz, 0, trailblz, trailblz, coinmstr, ROT0, "Coinmaster", "Trail Blazer", GAME_WRONG_COLORS | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING ) // or Trail Blazer 2 ? -GAME( 1989, supnudg2, 0, supnudg2, quizmstr, coinmstr, ROT0, "Coinmaster", "Super Nudger II (Version 5.21)", GAME_WRONG_COLORS | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING ) +GAME( 1985, quizmstr, 0, quizmstr, quizmstr, coinmstr, ROT0, "Loewen Spielautomaten", "Quizmaster (German)", GAME_WRONG_COLORS | GAME_UNEMULATED_PROTECTION ) +GAME( 1987, trailblz, 0, trailblz, trailblz, coinmstr, ROT0, "Coinmaster", "Trail Blazer", GAME_WRONG_COLORS | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING ) // or Trail Blazer 2 ? +GAME( 1989, supnudg2, 0, supnudg2, supnudg2, coinmstr, ROT0, "Coinmaster", "Super Nudger II (Version 5.21)", GAME_WRONG_COLORS | GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING ) diff --git a/src/drivers/commando.c b/src/drivers/commando.c index 822ab555c..f270e64d9 100644 --- a/src/drivers/commando.c +++ b/src/drivers/commando.c @@ -384,6 +384,50 @@ ROM_START( commandj ) ROM_LOAD( "vtb6.6e", 0x0500, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) /* video timing (not used) */ ROM_END +ROM_START( commandb ) + ROM_REGION( 2*0x10000, REGION_CPU1, 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_LOAD( "commandb_04_9m_27256.bin", 0x0000, 0x8000, CRC(348a7654) SHA1(f3668c47c154a9c7d7afeabb0259c9bc56e847ac) ) + ROM_LOAD( "cm03.8m", 0x8000, 0x4000, CRC(35486542) SHA1(531a85c9e03970ce037be84f2240c2df6f6e3ec1) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */ + ROM_LOAD( "cm02.9f", 0x0000, 0x4000, CRC(f9cc4a74) SHA1(ee8dd73919c6f47f62cc6d999de9510db9f79b8f) ) + + ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "vt01.5d", 0x0000, 0x4000, CRC(505726e0) SHA1(2435c87c9c9d78a6e703cf0e1f6a0288207fcd4c) ) // characters + + ROM_REGION( 0x18000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "vt11.5a", 0x00000, 0x4000, CRC(7b2e1b48) SHA1(5d49e1d8146e4ef744445b68f35677302e875a85) ) // SCR X (tiles) + ROM_LOAD( "vt12.6a", 0x04000, 0x4000, CRC(81b417d3) SHA1(5ec7e3f0c8069384a5f6eb39232c228b9d7b8c0c) ) // SCR X + ROM_LOAD( "vt13.7a", 0x08000, 0x4000, CRC(5612dbd2) SHA1(9e4e1a22b6cbf60607b9a81dae34482ae55f7c47) ) // SCR Y + ROM_LOAD( "vt14.8a", 0x0c000, 0x4000, CRC(2b2dee36) SHA1(8792278464fa3da47176582025f6673a15a581e2) ) // SCR Y + ROM_LOAD( "vt15.9a", 0x10000, 0x4000, CRC(de70babf) SHA1(6717e23baf55f84d3143fb432140a7c3e102ac26) ) // SCR Z + ROM_LOAD( "vt16.10a", 0x14000, 0x4000, CRC(14178237) SHA1(f896e71c7004349c9a46155edfd9f0aaa186065d) ) // SCR Z + + ROM_REGION( 0x18000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD( "vt05.7e", 0x00000, 0x4000, CRC(79f16e3d) SHA1(04e1f03a4d6b4cc2b81bce3a290bbb95de900d35) ) // sprites + ROM_LOAD( "vt06.8e", 0x04000, 0x4000, CRC(26fee521) SHA1(2fbfc73ee860f72a20229a01d4da9f5cc2e858d3) ) + ROM_LOAD( "vt07.9e", 0x08000, 0x4000, CRC(ca88bdfd) SHA1(548b05460bc7983cc81f15c70e87f47d10db2812) ) + ROM_LOAD( "vt08.7h", 0x0c000, 0x4000, CRC(2019c883) SHA1(883c0156ceab99f4849fe36972c4162b4ac8c216) ) + ROM_LOAD( "vt09.8h", 0x10000, 0x4000, CRC(98703982) SHA1(ba9a9b0dcadd4f52502828408c4a19b0bd518351) ) + ROM_LOAD( "vt10.9h", 0x14000, 0x4000, CRC(f069d2f8) SHA1(2c92300a9407470b34965021de882f1f7a84730c) ) + + /* I did not dumped the PROMs of the bootleg board, I'm just adding the parent ones, it has the same + number of PROMs on the same board locations as the original board. */ + ROM_REGION( 0x600, REGION_PROMS, 0 ) + ROM_LOAD( "vtb1.1d", 0x0000, 0x0100, CRC(3aba15a1) SHA1(8b057f6e26155dd9e48bde182e680fce4519f600) ) /* red */ + ROM_LOAD( "vtb2.2d", 0x0100, 0x0100, CRC(88865754) SHA1(ca6dddca98baf00a65b2fb70b69cf4704ef8c831) ) /* green */ + ROM_LOAD( "vtb3.3d", 0x0200, 0x0100, CRC(4c14c3f6) SHA1(644ac17c7413f094ec9a15cba87bbd421b26321f) ) /* blue */ + ROM_LOAD( "vtb4.1h", 0x0300, 0x0100, CRC(b388c246) SHA1(038f9851699331ad887b6281a9df053dca3db8fd) ) /* palette selector (not used) */ + ROM_LOAD( "vtb5.6l", 0x0400, 0x0100, CRC(712ac508) SHA1(5349d722ab6733afdda65f6e0a98322f0d515e86) ) /* interrupt timing (not used) */ + ROM_LOAD( "vtb6.6e", 0x0500, 0x0100, CRC(0eaf5158) SHA1(bafd4108708f66cd7b280e47152b108f3e254fc9) ) /* video timing (not used) */ + + /* There's a 16L8A PAL (with a 74LS244P and a 74LS367AP) on a tiny sub-board between the CPU1 ROMs + and the CPU1 (a Z80 compatible NEC D780C-1). This sub-board is plugged on what seems to be + a ROM socket. */ + ROM_REGION( 0x0200, REGION_PLDS, ROMREGION_DISPOSE ) + ROM_LOAD( "commandb_pal16l8a.bin", 0x0000, 0x0104, NO_DUMP ) /* I Didn't try to dump it... */ +ROM_END + ROM_START( sinvasn ) ROM_REGION( 2*0x10000, REGION_CPU1, 0 ) /* 64k for code + 64k for decrypted opcodes */ ROM_LOAD( "sp04.9m", 0x0000, 0x8000, CRC(33f9601e) SHA1(71182227b77fccbbc1d89b5828aa86dcc64ca05e) ) @@ -500,5 +544,6 @@ static DRIVER_INIT( spaceinv ) GAME( 1985, commando, 0, commando, commando, commando, ROT90, "Capcom", "Commando (World)", 0 ) GAME( 1985, commandu, commando, commando, commandu, commando, ROT90, "Capcom (Data East USA license)", "Commando (US)", 0 ) GAME( 1985, commandj, commando, commando, commando, commando, ROT90, "Capcom", "Senjou no Ookami", 0 ) +GAME( 1985, commandb, commando, commando, commando, spaceinv, ROT90, "bootleg", "Commando (bootleg)", 0 ) GAME( 1985, sinvasn, commando, commando, commando, commando, ROT90, "Capcom", "Space Invasion (Europe)", 0 ) GAME( 1985, sinvasnb, commando, commando, commando, spaceinv, ROT90, "bootleg", "Space Invasion (bootleg)", 0 ) diff --git a/src/drivers/contra.c b/src/drivers/contra.c index d101154a3..5048f1ef2 100644 --- a/src/drivers/contra.c +++ b/src/drivers/contra.c @@ -377,7 +377,7 @@ ROM_END ROM_START( contrajb ) ROM_REGION( 0x28000, REGION_CPU1, 0 ) /* 64k for code + 96k for banked ROMs */ - ROM_LOAD( "g-2.rom", 0x20000, 0x08000, CRC(bdb9196d) SHA1(fad170e8fda94c9c9d7b82433daa30b80af12efc) ) + ROM_LOAD( "g-2.18a", 0x20000, 0x08000, CRC(bdb9196d) SHA1(fad170e8fda94c9c9d7b82433daa30b80af12efc) ) ROM_CONTINUE( 0x08000, 0x08000 ) ROM_LOAD( "633k02.17a", 0x10000, 0x10000, CRC(5d5f7438) SHA1(489fe56ca57ef4f6a7792fba07a9656009f3f285) ) @@ -401,9 +401,33 @@ ROM_END ROM_START( gryzor ) ROM_REGION( 0x28000, REGION_CPU1, 0 ) /* 64k for code + 96k for banked ROMs */ - ROM_LOAD( "g2", 0x20000, 0x08000, CRC(92ca77bd) SHA1(3a56f51a617edff9f2a60df0141dff040881b82a) ) + ROM_LOAD( "g2.18a", 0x20000, 0x08000, CRC(92ca77bd) SHA1(3a56f51a617edff9f2a60df0141dff040881b82a) ) ROM_CONTINUE( 0x08000, 0x08000 ) - ROM_LOAD( "g3", 0x10000, 0x10000, CRC(bbd9e95e) SHA1(fd5de1bcc485de7b8fc2e321351c2e3ddd25d053) ) + ROM_LOAD( "g3.17a", 0x10000, 0x10000, CRC(bbd9e95e) SHA1(fd5de1bcc485de7b8fc2e321351c2e3ddd25d053) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for SOUND code */ + ROM_LOAD( "633e01.12a", 0x08000, 0x08000, CRC(d1549255) SHA1(d700c7de36746ba247e3a5d0410b7aa036aa4073) ) + + ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "633e04.7d", 0x00000, 0x40000, CRC(14ddc542) SHA1(c7d8592672a6e50c2fe6b0670001c340022f16f9) ) + ROM_LOAD16_BYTE( "633e05.7f", 0x00001, 0x40000, CRC(42185044) SHA1(a6e2598d766e6995c1a912e4a04987e6f4d547ff) ) + + ROM_REGION( 0x80000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD16_BYTE( "633e06.16d", 0x00000, 0x40000, CRC(9cf6faae) SHA1(9ab79c06cb541ce6fdac322886b8a14a2f3f5cf7) ) + ROM_LOAD16_BYTE( "633e07.16f", 0x00001, 0x40000, CRC(f2d06638) SHA1(0fa0fbfc53ab5c31b9de22f90153d9af37ff22ce) ) + + ROM_REGION( 0x0400, REGION_PROMS, 0 ) + ROM_LOAD( "633e08.10g", 0x0000, 0x0100, CRC(9f0949fa) SHA1(7c8fefdcae4523d008a7d39062194c7a80aa3500) ) /* 007121 #0 sprite lookup table */ + ROM_LOAD( "633e09.12g", 0x0100, 0x0100, CRC(14ca5e19) SHA1(eeee2f8b3d1e4acf47de1e74c4e507ff924591e7) ) /* 007121 #0 char lookup table */ + ROM_LOAD( "633f10.18g", 0x0200, 0x0100, CRC(2b244d84) SHA1(c3bde7afb501bae58d07721c637dc06938c22150) ) /* 007121 #1 sprite lookup table */ + ROM_LOAD( "633f11.20g", 0x0300, 0x0100, CRC(14ca5e19) SHA1(eeee2f8b3d1e4acf47de1e74c4e507ff924591e7) ) /* 007121 #1 char lookup table */ +ROM_END + +ROM_START( gryzora ) + ROM_REGION( 0x28000, REGION_CPU1, 0 ) /* 64k for code + 96k for banked ROMs */ + ROM_LOAD( "633j03.18a", 0x20000, 0x08000, CRC(20919162) SHA1(2f375166428ee03f6e8ac0372a373bb8ab35e64c) ) + ROM_CONTINUE( 0x08000, 0x08000 ) + ROM_LOAD( "633j02.17a", 0x10000, 0x10000, CRC(b5922f9a) SHA1(441a23dc99a908ec2c09c855e73070dbab8c5ae2) ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for SOUND code */ ROM_LOAD( "633e01.12a", 0x08000, 0x08000, CRC(d1549255) SHA1(d700c7de36746ba247e3a5d0410b7aa036aa4073) ) @@ -429,4 +453,5 @@ GAME( 1987, contra, 0, contra, contra, 0, ROT90, "Konami", "Contra (US)", GAME( 1987, contrab, contra, contra, contra, 0, ROT90, "bootleg", "Contra (US bootleg)", 0 ) GAME( 1987, contraj, contra, contra, contra, 0, ROT90, "Konami", "Contra (Japan)", 0 ) GAME( 1987, contrajb, contra, contra, contra, 0, ROT90, "bootleg", "Contra (Japan bootleg)", 0 ) -GAME( 1987, gryzor, contra, contra, contra, 0, ROT90, "Konami", "Gryzor", 0 ) +GAME( 1987, gryzor, contra, contra, contra, 0, ROT90, "Konami", "Gryzor (Set 1)", 0 ) +GAME( 1987, gryzora, contra, contra, contra, 0, ROT90, "Konami", "Gryzor (Set 2)", 0 ) diff --git a/src/drivers/coolpool.c b/src/drivers/coolpool.c index 23c4a63ee..3d976f8c7 100644 --- a/src/drivers/coolpool.c +++ b/src/drivers/coolpool.c @@ -87,7 +87,7 @@ static VIDEO_UPDATE( amerdart ) /* if we're blank, just blank the screen */ if (tms34010_io_display_blanked(0)) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } @@ -95,10 +95,7 @@ static VIDEO_UPDATE( amerdart ) for (x = 0; x < 16; x++) { UINT16 pal = vram_base[x]; - int r = (pal >> 4) & 0x0f; - int g = (pal >> 8) & 0x0f; - int b = (pal >> 12) & 0x0f; - palette_set_color(x, (r << 4) | r, (g << 4) | g, (b << 4) | b); + palette_set_color(machine, x, pal4bit(pal >> 4), pal4bit(pal >> 8), pal4bit(pal >> 12)); } /* loop over scanlines */ @@ -130,7 +127,7 @@ static VIDEO_UPDATE( coolpool ) /* if we're blank, just blank the screen */ if (tms34010_io_display_blanked(0)) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } diff --git a/src/drivers/copsnrob.c b/src/drivers/copsnrob.c index e6b603e8a..012ab58e2 100644 --- a/src/drivers/copsnrob.c +++ b/src/drivers/copsnrob.c @@ -66,8 +66,8 @@ static PALETTE_INIT( copsnrob ) { - palette_set_color(0,0x00,0x00,0x00); /* black */ - palette_set_color(1,0xff,0xff,0xff); /* white */ + palette_set_color(machine,0,0x00,0x00,0x00); /* black */ + palette_set_color(machine,1,0xff,0xff,0xff); /* white */ } diff --git a/src/drivers/couple.c b/src/drivers/couple.c index 13c5f1bc5..adf126ae9 100644 --- a/src/drivers/couple.c +++ b/src/drivers/couple.c @@ -193,7 +193,7 @@ static PALETTE_INIT( couple ) bit3 = (color_prom[i] >> 2) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x42 * bit2 + 0x90 * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); //color_prom++; } } diff --git a/src/drivers/cps1.c b/src/drivers/cps1.c index 27c6266c6..24ab68b6f 100644 --- a/src/drivers/cps1.c +++ b/src/drivers/cps1.c @@ -10,6 +10,146 @@ 68000 clock speeds are unknown for all games (except where commented) + +Stephh's notes (based on the games M68000 code and some tests) : + +1) 'forgottn' and clones + + - Keys in the "scroll 1 test" screen : + * P1 UP : char code += 0x0200 + * P1 DOWN : char code -= 0x0200 + * P1 RIGHT : attribute ^= 0x20 ; also affects Hflip + * P1 LEFT : attribute ^= 0x40 ; also affects Vflip + * P1 button 1 : (attribute++) & 0x1f ; also affects color + * P1 button 2 : (attribute--) & 0x1f ; also affects color + +2) 'ghouls' and clones + +2a) 'ghouls' + + - NO debug features + +2b) 'ghoulsu' + + - How to activate the debug features : + * set "Game Mode" Dip Switch to "Game" + * set both "Coin A" and "Coin B" Dip Switches to 1C_1C + * reset the game (F3 key) + * insert a coin + * set "Game Mode" Dip Switch to "Test" + * set the debug Dip Switches to what you want + * start a 1 player game + - Some debug features : + * "Armor on New Life" is effective at the begining of a new life + Note that even when you start without armor, you need to be hit twice + * "Starting Weapon" is effective only when you start a new game + or when you continue play + * "Starting Level" is effective only when you start a new game + (you must NOT continue play !) + * "Slow Motion" and "Invulnerability" can be changed at any time + +2c) 'daimakai' + + - NO debug features + - Different Dip Switches than in 'ghouls' + +3) 'strider' and clones + + - TO DO ! + +4) 'dynwar' and clones + +4a) 'dynwar' + + - According to code at 0x0125fa and 0x012634, bits 0 and 1 of DSWC also affect the energy cost + (table at 0x012662) when you press button 3 ("tactics" in the manual) : + + bit 0 bit 1 cost possible BCD values (based on kind of "tactics") + OFF OFF normal 0x10 (rockslide) 0x08 (ambush) 0x14 (flame) 0x12 (explosion) + ON OFF very low 0x03 0x02 0x05 0x04 + OFF ON low 0x06 0x04 0x10 0x08 + ON ON high 0x13 0x10 0x19 0x16 + + So IMO, there might be an ingame bug at 0x000c7e which should read bits 2 and 3 of DSWC + (instead of having them unused) : + 000C7E: 0240 0003 andi.w #$3, D0 + should be + 000C7E: 0240 000c andi.w #$c, D0 + However, only bits 4 to 7 are tested while you are in the "test mode". + + Note that code at 0x000c7e is only executed once when you reset the machine; + this means that you can change the "Freeze" and "Turbo Mode" Dip Switches before + reseting the game to change the energy cost settings, then put them back to "Off" + after the startup routine (when screen is black) so you can play the game. + - Both "Coin A" and "Coin B" Dip Switches must be set to "2 Coins/1 Credit" to make + this mode available. If only one Dip Switch is set to it, it is the same as 2C_1C. + +4b) 'dynwarj' + + - The "energy cost" bug also exists in this version as well as code at 0x000c7e; + in fact, only code that reads these settings is at a different address : + check code at 0x01267a and 0x0126b4 and table at 0x0126e2. + - Both "Coin A" and "Coin B" Dip Switches must be set to "2 Coins/1 Credit" to make + this mode available. If only one Dip Switch is set to it, it is the same as 2C_1C. + +5) 'willow' and clones + + - How to activate the debug features : + * set "Game Mode" Dip Switch to "Game" + * set both "Coin A" and "Coin B" Dip Switches to 1C_1C + * reset the game (F3 key) + * insert a coin + * set "Game Mode" Dip Switch to "Test" + * set the debug Dip Switches to what you want + * start a 1 player game + - Some debug features : + * "Starting Level" is effective only when you start a new game + (you must NOT continue play !) + * Once you set "Maximum magic/sword power" to "On", setting it to "Off" won't have + any effect until you start a new game (you must NOT continue play !) + * "Slow Motion Delay" is effective only when "Slow Motion" is set to "On" + * Even if "Freeze" Dip Switch is set to "On" a message will be displayed to its end. + * I can't tell what kind of infos are displayed when "Display Debug Infos" + Dip Switch is sry to "On" :( Any hint about them are welcome ! + - Both "Coin A" and "Coin B" Dip Switches must be set to "2 Coins/1 Credit" to make + this mode available. If only one Dip Switch is set to it, it is the same as 2C_1C. + - When the "Stage Magic Continue" Dip Switch is set to "On", your magic and sword power + will be increased at the end of the level if you haven't bought the magic/sword item. + But you won't notice this before you use the character again. + For example, magic power will be increased at the end of level 1 but you won't notice + it before level 3, and sword power will be increased at the end of level 2 but you + won't notice it before level 4. + +TO DO (2006.09.20) : + + - Check 'strider' and its clones and add debug features + - Check other games to see if there are some debug or hidden features + - Add addresses from routines with debug features in the notes + - Look at what IN2 and IN3 do for the following sets : + * 'cworld2j' (IN2 only) + * 'qad' and 'qadj' + * 'qtono2' + +Stephh's log (2006.09.20) : + + - Changed the "readinputport" reads by "readinputportbytag" reads. + This way, inputs and Dip Switch can be in any order + (and I don't have the nasty conditional Dip Switch bug). + BTW, I've slightly changed the read memory map : + * one handler for the 3 Dip Switches banks : cps1_dsw_r + * one handler for the system inputs (IN0) : cps1_in0_r + * one handler for the player inputs (IN1) : cps1_in1_r + * renamed cps1_input2_r to cps_in2_r + * renamed cps1_input3_r to cps_in3_r + - Applied these changes to src/drivers/fcrash.c as well. + - Added debug features in the following sets : + * 'ghoulsu' + * 'willow', 'willowj' and 'willowje' + - Checked sets with no debug features : + * 'forgottn' and 'lostwrld' + * 'ghouls' and 'daimakai' + * 'dynwar' and 'dynwarj' + ***************************************************************************/ #include "driver.h" @@ -28,21 +168,34 @@ void slammast_decode(void); -READ16_HANDLER( cps1_input_r ) +READ16_HANDLER( cps1_dsw_r ) { - int control=readinputport(offset); - return (control<<8) | control; + static const char *dswname[3] = { "DSWA", "DSWB", "DSWC" }; + int control = readinputportbytag(dswname[offset]); + return control << 8 | control; } -READ16_HANDLER( cps1_input2_r ) +READ16_HANDLER( cps1_in0_r ) { - int buttons=readinputport(5); + int buttons = readinputportbytag("IN0"); return buttons << 8 | buttons; } -READ16_HANDLER( cps1_input3_r ) +READ16_HANDLER( cps1_in1_r ) { - int buttons=readinputport(6); + int buttons = readinputportbytag("IN1"); + return buttons; +} + +READ16_HANDLER( cps1_in2_r ) +{ + int buttons = readinputportbytag("IN2"); + return buttons << 8 | buttons; +} + +READ16_HANDLER( cps1_in3_r ) +{ + int buttons = readinputportbytag("IN3"); return buttons << 8 | buttons; } @@ -51,22 +204,22 @@ static int dial[2]; static READ16_HANDLER( forgottn_dial_0_r ) { - return ((readinputport(5) - dial[0]) >> (8*offset)) & 0xff; + return ((readinputportbytag("DIAL0") - dial[0]) >> (8*offset)) & 0xff; } static READ16_HANDLER( forgottn_dial_1_r ) { - return ((readinputport(6) - dial[1]) >> (8*offset)) & 0xff; + return ((readinputportbytag("DIAL1") - dial[1]) >> (8*offset)) & 0xff; } static WRITE16_HANDLER( forgottn_dial_0_reset_w ) { - dial[0] = readinputport(5); + dial[0] = readinputportbytag("DIAL0"); } static WRITE16_HANDLER( forgottn_dial_1_reset_w ) { - dial[1] = readinputport(6); + dial[1] = readinputportbytag("DIAL1"); } @@ -296,41 +449,42 @@ WRITE16_HANDLER( cps1_eeprom_port_w ) static ADDRESS_MAP_START( cps1_readmem, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x1fffff) AM_READ(MRA16_ROM) /* 68000 ROM */ - AM_RANGE(0x800000, 0x800001) AM_READ(input_port_4_word_r) /* Player input ports */ - AM_RANGE(0x800010, 0x800011) AM_READ(input_port_4_word_r) /* ?? */ - AM_RANGE(0x800018, 0x80001f) AM_READ(cps1_input_r) /* Input ports */ - AM_RANGE(0x800020, 0x800021) AM_READ(MRA16_NOP) /* ? Used by Rockman ? */ - AM_RANGE(0x800052, 0x800055) AM_READ(forgottn_dial_0_r) /* forgotten worlds */ - AM_RANGE(0x80005a, 0x80005d) AM_READ(forgottn_dial_1_r) /* forgotten worlds */ - AM_RANGE(0x800176, 0x800177) AM_READ(cps1_input2_r) /* Extra input ports */ - AM_RANGE(0x800178, 0x800179) AM_READ(cps1_input3_r) /* Captain Commando player 4 controls */ - AM_RANGE(0x8001fc, 0x8001fd) AM_READ(cps1_input2_r) /* Input ports (SF Rev E) */ - AM_RANGE(0x800100, 0x8001ff) AM_READ(cps1_output_r) /* Output ports */ - AM_RANGE(0x900000, 0x92ffff) AM_READ(MRA16_RAM) /* SF2CE executes code from here */ + AM_RANGE(0x000000, 0x1fffff) AM_READ(MRA16_ROM) /* 68000 ROM */ + AM_RANGE(0x800000, 0x800001) AM_READ(cps1_in1_r) /* Player input ports */ + AM_RANGE(0x800010, 0x800011) AM_READ(cps1_in1_r) /* ?? */ + AM_RANGE(0x800018, 0x800019) AM_READ(cps1_in0_r) /* System input ports */ + AM_RANGE(0x80001a, 0x80001f) AM_READ(cps1_dsw_r) /* Dip Switches */ + AM_RANGE(0x800020, 0x800021) AM_READ(MRA16_NOP) /* ? Used by Rockman ? */ + AM_RANGE(0x800052, 0x800055) AM_READ(forgottn_dial_0_r) /* Forgotten Worlds */ + AM_RANGE(0x80005a, 0x80005d) AM_READ(forgottn_dial_1_r) /* Forgotten Worlds */ + AM_RANGE(0x800176, 0x800177) AM_READ(cps1_in2_r) /* Extra input ports */ + AM_RANGE(0x800178, 0x800179) AM_READ(cps1_in3_r) /* Player 4 controls ("Captain Commando") */ + AM_RANGE(0x8001fc, 0x8001fd) AM_READ(cps1_in2_r) /* Extra input ports ("SF Rev E") */ + AM_RANGE(0x800100, 0x8001ff) AM_READ(cps1_output_r) /* Output ports */ + AM_RANGE(0x900000, 0x92ffff) AM_READ(MRA16_RAM) /* SF2CE executes code from here */ AM_RANGE(0xf00000, 0xf0ffff) AM_READ(qsound_rom_r) /* Slammasters protection */ AM_RANGE(0xf18000, 0xf19fff) AM_READ(qsound_sharedram1_r) /* Q RAM */ - AM_RANGE(0xf1c000, 0xf1c001) AM_READ(cps1_input2_r) /* Player 3 controls (later games) */ - AM_RANGE(0xf1c002, 0xf1c003) AM_READ(cps1_input3_r) /* Player 4 controls (later games - muscle bombers) */ + AM_RANGE(0xf1c000, 0xf1c001) AM_READ(cps1_in2_r) /* Player 3 controls (later games) */ + AM_RANGE(0xf1c002, 0xf1c003) AM_READ(cps1_in3_r) /* Player 4 controls ("Muscle Bombers") */ AM_RANGE(0xf1c006, 0xf1c007) AM_READ(cps1_eeprom_port_r) AM_RANGE(0xf1e000, 0xf1ffff) AM_READ(qsound_sharedram2_r) /* Q RAM */ - AM_RANGE(0xff0000, 0xffffff) AM_READ(MRA16_RAM) /* RAM */ + AM_RANGE(0xff0000, 0xffffff) AM_READ(MRA16_RAM) /* RAM */ ADDRESS_MAP_END static ADDRESS_MAP_START( cps1_writemem, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x1fffff) AM_WRITE(MWA16_ROM) /* ROM */ + AM_RANGE(0x000000, 0x1fffff) AM_WRITE(MWA16_ROM) /* ROM */ AM_RANGE(0x800030, 0x800031) AM_WRITE(cps1_coinctrl_w) AM_RANGE(0x800040, 0x800041) AM_WRITE(forgottn_dial_0_reset_w) AM_RANGE(0x800048, 0x800049) AM_WRITE(forgottn_dial_1_reset_w) - AM_RANGE(0x800180, 0x800181) AM_WRITE(cps1_sound_command_w) /* Sound command */ + AM_RANGE(0x800180, 0x800181) AM_WRITE(cps1_sound_command_w) /* Sound command */ AM_RANGE(0x800188, 0x800189) AM_WRITE(cps1_sound_fade_w) AM_RANGE(0x800100, 0x8001ff) AM_WRITE(cps1_output_w) AM_BASE(&cps1_output) AM_SIZE(&cps1_output_size) /* Output ports */ AM_RANGE(0x900000, 0x92ffff) AM_WRITE(cps1_gfxram_w) AM_BASE(&cps1_gfxram) AM_SIZE(&cps1_gfxram_size) - AM_RANGE(0xf18000, 0xf19fff) AM_WRITE(qsound_sharedram1_w) /* Q RAM */ - AM_RANGE(0xf1c004, 0xf1c005) AM_WRITE(cpsq_coinctrl2_w) /* Coin control2 (later games) */ + AM_RANGE(0xf18000, 0xf19fff) AM_WRITE(qsound_sharedram1_w) /* Q RAM */ + AM_RANGE(0xf1c004, 0xf1c005) AM_WRITE(cpsq_coinctrl2_w) /* Coin control2 (later games) */ AM_RANGE(0xf1c006, 0xf1c007) AM_WRITE(cps1_eeprom_port_w) - AM_RANGE(0xf1e000, 0xf1ffff) AM_WRITE(qsound_sharedram2_w) /* Q RAM */ - AM_RANGE(0xff0000, 0xffffff) AM_WRITE(MWA16_RAM) /* RAM */ + AM_RANGE(0xf1e000, 0xf1ffff) AM_WRITE(qsound_sharedram2_w) /* Q RAM */ + AM_RANGE(0xff0000, 0xffffff) AM_WRITE(MWA16_RAM) /* RAM */ ADDRESS_MAP_END @@ -461,56 +615,56 @@ INPUT_PORTS_START( forgottn ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START_TAG("DSWA") - CPS1_COINAGE_1 - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) + PORT_START_TAG("DSWC") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - - PORT_START_TAG("DSWB") - CPS1_DIFFICULTY_1 - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) // Check code at 0x00111c - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) // (0x00112c in 'lostwrld') - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) // Check code at 0x013c78 + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) // (0x013690 in 'lostwrld') 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, "Freeze" ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - - PORT_START_TAG("DSWC") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START_TAG("DSWB") + PORT_DIPNAME( 0x80, 0x80, "Freeze" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) // Check code at 0x013c78 - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) // (0x013690 in 'lostwrld') + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) // Check code at 0x00111c + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) // (0x00112c in 'lostwrld') + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + CPS1_DIFFICULTY_1 + + PORT_START_TAG("DSWA") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + CPS1_COINAGE_1 PORT_START_TAG("IN1") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) @@ -530,10 +684,10 @@ INPUT_PORTS_START( forgottn ) PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START_TAG("IN2") + PORT_START_TAG("DIAL0") PORT_BIT( 0x0fff, 0x0000, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(20) PORT_CODE_DEC(KEYCODE_Z) PORT_CODE_INC(KEYCODE_X) PORT_PLAYER(1) - PORT_START_TAG("IN3") + PORT_START_TAG("DIAL1") PORT_BIT( 0x0fff, 0x0000, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(20) PORT_CODE_DEC(KEYCODE_N) PORT_CODE_INC(KEYCODE_M) PORT_PLAYER(2) INPUT_PORTS_END @@ -548,55 +702,55 @@ INPUT_PORTS_START( ghouls ) PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START_TAG("DSWA") - CPS1_COINAGE_1 - PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Cabinet ) ) - PORT_DIPSETTING( 0xc0, "Upright 1 Player" ) - PORT_DIPSETTING( 0x80, "Upright 2 Players" ) -// PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) - - PORT_START_TAG("DSWB") - CPS1_DIFFICULTY_2 + PORT_START_TAG("DSWC") + PORT_DIPNAME( 0x80, 0x80, "Game Mode") + PORT_DIPSETTING( 0x80, "Game" ) + PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) // "Demo Sounds" in manual; doesn't work + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Bonus_Life ) ) - PORT_DIPSETTING( 0x20, "10K, 30K and every 30K" ) - PORT_DIPSETTING( 0x10, "20K, 50K and every 70K" ) - PORT_DIPSETTING( 0x30, "30K, 60K and every 70K" ) - PORT_DIPSETTING( 0x00, "40K, 70K and every 80K" ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - - PORT_START_TAG("DSWC") PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "6" ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + + PORT_START_TAG("DSWB") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x20, "10K, 30K and every 30K" ) + PORT_DIPSETTING( 0x10, "20K, 50K and every 70K" ) + PORT_DIPSETTING( 0x30, "30K, 60K and every 70K" ) + PORT_DIPSETTING( 0x00, "40K, 70K and every 80K" ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) // "Demo Sounds" in manual; doesn't work - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x80, 0x80, "Game Mode") - PORT_DIPSETTING( 0x80, "Game" ) - PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) + CPS1_DIFFICULTY_2 + + PORT_START_TAG("DSWA") + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0xc0, "Upright 1 Player" ) + PORT_DIPSETTING( 0x80, "Upright 2 Players" ) +// PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + CPS1_COINAGE_1 PORT_START_TAG("IN1") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) @@ -618,7 +772,7 @@ INPUT_PORTS_START( ghouls ) INPUT_PORTS_END /* Same as 'ghouls' but additional "Freeze" Dip Switch, different "Lives" Dip Switch, - and LOTS of "debug" features (to be implemented) */ + and LOTS of "debug" features (read the notes to know how to activate them) */ INPUT_PORTS_START( ghoulsu ) PORT_START_TAG("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) @@ -630,55 +784,125 @@ INPUT_PORTS_START( ghoulsu ) PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START_TAG("DSWA") - CPS1_COINAGE_1 - PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Cabinet ) ) - PORT_DIPSETTING( 0xc0, "Upright 1 Player" ) - PORT_DIPSETTING( 0x80, "Upright 2 Players" ) -// PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) - - PORT_START_TAG("DSWB") - CPS1_DIFFICULTY_2 + PORT_START_TAG("DSWC") + PORT_DIPNAME( 0x80, 0x80, "Game Mode" ) + PORT_DIPSETTING( 0x80, "Game" ) + PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) // "Demo Sounds" in manual; doesn't work + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Bonus_Life ) ) - PORT_DIPSETTING( 0x20, "10K, 30K and every 30K" ) - PORT_DIPSETTING( 0x10, "20K, 50K and every 70K" ) - PORT_DIPSETTING( 0x30, "30K, 60K and every 70K" ) - PORT_DIPSETTING( 0x00, "40K, 70K and every 80K" ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, "Freeze" ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - - PORT_START_TAG("DSWC") PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_DIPSETTING( 0x00, "2" ) PORT_DIPSETTING( 0x03, "3" ) PORT_DIPSETTING( 0x02, "4" ) PORT_DIPSETTING( 0x01, "5" ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + + PORT_START_TAG("DSWB") + PORT_DIPNAME( 0x80, 0x80, "Freeze" ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) // "Demo Sounds" in manual; doesn't work - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x80, 0x80, "Game Mode") - PORT_DIPSETTING( 0x80, "Game" ) - PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) + /* Standard Dip Switches */ + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Bonus_Life ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x20, "10K, 30K and every 30K" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x10, "20K, 50K and every 70K" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x30, "30K, 60K and every 70K" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, "40K, 70K and every 80K" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPNAME( 0x07, 0x07, DEF_STR( Difficulty ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x04, "1 (Easiest)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x05, "2" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x06, "3" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x07, "4 (Normal)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x03, "5" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x02, "6" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x01, "7" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, "8 (Hardest)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + /* Debug Dip Switches */ + PORT_DIPNAME( 0x38, 0x30, "Armor on New Life" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) +// PORT_DIPSETTING( 0x38, "Silver Armor" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x18, "Golden Armor" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x30, "Silver Armor" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x28, "None (young man)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x20, "None (old man)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) +// PORT_DIPSETTING( 0x10, "INVALID !" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) +// PORT_DIPSETTING( 0x08, "INVALID !" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) +// PORT_DIPSETTING( 0x00, "INVALID !" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPNAME( 0x07, 0x07, "Starting Weapon" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x07, "Spear" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x06, "Knife" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x05, "Torch" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x04, "Sword" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x03, "Axe" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x02, "Shield" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x01, "Super Weapon" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) +// PORT_DIPSETTING( 0x00, "INVALID !" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + + PORT_START_TAG("DSWA") + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0xc0, "Upright 1 Player" ) + PORT_DIPSETTING( 0x80, "Upright 2 Players" ) +// PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + /* Standard Dip Switches */ + PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x38, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x30, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x28, DEF_STR( 1C_3C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x18, DEF_STR( 1C_6C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_6C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + /* Debug Dip Switches */ + PORT_DIPNAME( 0x20, 0x20, "Slow Motion" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPNAME( 0x10, 0x10, "Invulnerability" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPNAME( 0x0f, 0x0f, "Starting Level" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x0f, "Level 1 (1st half)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x0e, "Level 1 (2nd half)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x0d, "Level 2 (1st half)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x0c, "Level 2 (2nd half)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x0b, "Level 3 (1st half)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x0a, "Level 3 (2nd half)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x09, "Level 4 (1st half)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x08, "Level 4 (2nd half)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x07, "Level 5 (1st half)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x06, "Level 5 (2nd half)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x05, "Level 6" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) +// PORT_DIPSETTING( 0x04, "INVALID !" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) +// PORT_DIPSETTING( 0x03, "INVALID !" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) +// PORT_DIPSETTING( 0x02, "INVALID !" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) +// PORT_DIPSETTING( 0x01, "INVALID !" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) +// PORT_DIPSETTING( 0x00, "INVALID !" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) PORT_START_TAG("IN1") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) @@ -701,83 +925,12 @@ INPUT_PORTS_END /* Same as 'ghouls' but additional "Freeze" Dip Switch */ INPUT_PORTS_START( daimakai ) - PORT_START_TAG("IN0") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) /* Service, but it doesn't give any credit */ - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) - PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_INCLUDE(ghouls) - PORT_START_TAG("DSWA") - CPS1_COINAGE_1 - PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Cabinet ) ) - PORT_DIPSETTING( 0xc0, "Upright 1 Player" ) - PORT_DIPSETTING( 0x80, "Upright 2 Players" ) -// PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) - - PORT_START_TAG("DSWB") - CPS1_DIFFICULTY_2 - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Bonus_Life ) ) - PORT_DIPSETTING( 0x20, "10K, 30K and every 30K" ) - PORT_DIPSETTING( 0x10, "20K, 50K and every 70K" ) - PORT_DIPSETTING( 0x30, "30K, 60K and every 70K" ) - PORT_DIPSETTING( 0x00, "40K, 70K and every 80K" ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_MODIFY("DSWB") PORT_DIPNAME( 0x80, 0x80, "Freeze" ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - - PORT_START_TAG("DSWC") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) - PORT_DIPSETTING( 0x03, "3" ) - PORT_DIPSETTING( 0x02, "4" ) - PORT_DIPSETTING( 0x01, "5" ) - PORT_DIPSETTING( 0x00, "6" ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) // "Demo Sounds" in manual; doesn't work - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x80, 0x80, "Game Mode") - PORT_DIPSETTING( 0x80, "Game" ) - PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) - - PORT_START_TAG("IN1") - PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) - PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) - PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) - PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END /* "Debug" features to be implemented */ @@ -813,7 +966,7 @@ INPUT_PORTS_START( strider ) PORT_DIPSETTING( 0x20, "30K, 50K then every 70K" ) PORT_DIPSETTING( 0x10, "20K & 60K only" ) PORT_DIPSETTING( 0x00, "30K & 60K only" ) - PORT_DIPNAME( 0xc0, 0x00, "Internal Diff. on Life Loss" ) // Check code at 0x00d15a + PORT_DIPNAME( 0xc0, 0x80, "Internal Diff. on Life Loss" ) // Check code at 0x00d15a PORT_DIPSETTING( 0xc0, "-3" ) // PORT_DIPSETTING( 0x40, "-1" ) PORT_DIPSETTING( 0x00, "-1" ) @@ -842,7 +995,7 @@ INPUT_PORTS_START( strider ) PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) PORT_DIPNAME( 0x80, 0x80, "Game Mode") PORT_DIPSETTING( 0x80, "Game" ) - PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) // To enable the "debug" features + PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) // To enable the "debug" features PORT_START_TAG("IN1") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) @@ -863,8 +1016,8 @@ INPUT_PORTS_START( strider ) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END -/* "Debug" features to be implemented - Same as strider but additional "2 Coins to Start, 1 to Continue" Dip Switch */ +/* Same as 'strider' but additional "2 Coins to Start, 1 to Continue" Dip Switch */ +/* "Debug" features to be implemented */ INPUT_PORTS_START( stridrua ) PORT_START_TAG("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) @@ -897,7 +1050,7 @@ INPUT_PORTS_START( stridrua ) PORT_DIPSETTING( 0x20, "30K, 50K then every 70K" ) PORT_DIPSETTING( 0x10, "20K & 60K only" ) PORT_DIPSETTING( 0x00, "30K & 60K only" ) - PORT_DIPNAME( 0xc0, 0x00, "Internal Diff. on Life Loss" ) // Check code at 0x00d15a + PORT_DIPNAME( 0xc0, 0x80, "Internal Diff. on Life Loss" ) // Check code at 0x00d15a PORT_DIPSETTING( 0xc0, "-3" ) // PORT_DIPSETTING( 0x40, "-1" ) PORT_DIPSETTING( 0x00, "-1" ) @@ -926,7 +1079,7 @@ INPUT_PORTS_START( stridrua ) PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) PORT_DIPNAME( 0x80, 0x80, "Game Mode") PORT_DIPSETTING( 0x80, "Game" ) - PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) // To enable the "debug" features + PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) // To enable the "debug" features PORT_START_TAG("IN1") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) @@ -958,61 +1111,60 @@ INPUT_PORTS_START( dynwar ) PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START_TAG("DSWA") - CPS1_COINAGE_3 - /* According to the manual, ALL bits 0 to 5 must be ON to have - "2 Coins/1 Credit (1 to continue)" for both coin slots */ - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Free_Play ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_START_TAG("DSWC") + PORT_DIPNAME( 0x80, 0x80, "Game Mode") + PORT_DIPSETTING( 0x80, "Game" ) + PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) // "ON" in the "test mode" + PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) // "OFF" in the "test mode" + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) // "ON" in the "test mode" + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) // "OFF" in the "test mode" + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - - PORT_START_TAG("DSWB") - CPS1_DIFFICULTY_2 PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPNAME( 0x02, 0x02, "Turbo Mode" ) // Also affects energy cost - read notes + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPNAME( 0x01, 0x01, "Freeze" ) // Also affects energy cost - read notes + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START_TAG("DSWB") PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - - PORT_START_TAG("DSWC") - PORT_DIPNAME( 0x01, 0x01, "Freeze" ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Turbo Mode" ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unused ) ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) // "ON" in the "test mode" - PORT_DIPSETTING( 0x20, DEF_STR( On ) ) // "OFF" in the "test mode" - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) - PORT_DIPSETTING( 0x00, DEF_STR( No ) ) // "ON" in the "test mode" - PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) // "OFF" in the "test mode" - PORT_DIPNAME( 0x80, 0x80, "Game Mode") - PORT_DIPSETTING( 0x80, "Game" ) - PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) + CPS1_DIFFICULTY_2 + PORT_START_TAG("DSWA") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Free_Play ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + /* According to the manual, ALL bits 0 to 5 must be ON to have + "2 Coins/1 Credit (1 to continue)" for both coin slots */ + CPS1_COINAGE_3 PORT_START_TAG("IN1") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) @@ -1033,7 +1185,7 @@ INPUT_PORTS_START( dynwar ) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END -/* "Debug" features to be implemented */ +/* Read the notes to know how to activate the "debug" features */ INPUT_PORTS_START( willow ) PORT_START_TAG("IN0") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) @@ -1045,66 +1197,139 @@ INPUT_PORTS_START( willow ) PORT_SERVICE_NO_TOGGLE( 0x40, IP_ACTIVE_LOW ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START_TAG("DSWA") - CPS1_COINAGE_3 - /* According to the manual, ALL bits 0 to 5 must be ON to have - "2 Coins/1 Credit (1 to continue)" for both coin slots */ - PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Cabinet ) ) - PORT_DIPSETTING( 0xc0, "Upright 1 Player" ) - PORT_DIPSETTING( 0x80, "Upright 2 Players" ) -// PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) - - PORT_START_TAG("DSWB") - CPS1_DIFFICULTY_2 - PORT_DIPNAME( 0x18, 0x18, "Nando Speed" ) - PORT_DIPSETTING( 0x10, "Slow" ) - PORT_DIPSETTING( 0x18, DEF_STR( Normal ) ) - PORT_DIPSETTING( 0x08, "Fast" ) - PORT_DIPSETTING( 0x00, "Very Fast" ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, "Stage Magic Continue" ) // Check code at 0x002e1c - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - /* When the Dip Switch is set to "On" , your magic and sword power will be increased - at the end of the level if you haven't bought the magic/sword item. But you won't - notice this before you use the character again. For example, magic power will be - increased at the end of level 1 but you won't notice it before level 3, and sword - power will be increased at the end of level 2 but you won't notice it before level 4. - Useful addresses to know : - - 0xff8344.w ($344,A5) : level (00-05) - - 0xff8366.b ($366,A5) : magic power (00-06) - - 0xff8367.b ($367,A5) : sword power (00-04) - */ - PORT_START_TAG("DSWC") - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) - PORT_DIPSETTING( 0x02, "1" ) - PORT_DIPSETTING( 0x03, "2" ) - PORT_DIPSETTING( 0x01, "3" ) - PORT_DIPSETTING( 0x00, "4" ) - PORT_DIPNAME( 0x0c, 0x0c, "Vitality" ) - PORT_DIPSETTING( 0x00, "2" ) - PORT_DIPSETTING( 0x0c, "3" ) - PORT_DIPSETTING( 0x08, "4" ) - PORT_DIPSETTING( 0x04, "5" ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, "Game Mode") + PORT_DIPSETTING( 0x80, "Game" ) + PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) // To enable the "debug" features PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) PORT_DIPSETTING( 0x00, DEF_STR( No ) ) PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x80, 0x80, "Game Mode") - PORT_DIPSETTING( 0x80, "Game" ) - PORT_DIPSETTING( 0x00, DEF_STR( Test ) ) // To enable the "debug" features + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + /* Standard Dip Switches */ + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPNAME( 0x0c, 0x0c, "Vitality" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, "2" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x0c, "3" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x08, "4" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x04, "5" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Lives ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x02, "1" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x03, "2" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x01, "3" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, "4" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + /* Debug Dip Switches */ + PORT_DIPNAME( 0x20, 0x20, "Display Debug Infos" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x20, DEF_STR( No ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPNAME( 0x08, 0x08, "Invulnerability" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPNAME( 0x04, 0x04, "Slow Motion" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPNAME( 0x02, 0x02, "Freeze" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPNAME( 0x01, 0x01, "Turbo Mode" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + + PORT_START_TAG("DSWB") + /* Standard Dip Switches */ + PORT_DIPNAME( 0x80, 0x80, "Stage Magic Continue" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unused ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPNAME( 0x18, 0x18, "Nando Speed" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x10, "Slow" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x18, DEF_STR( Normal ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x08, "Fast" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, "Very Fast" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPNAME( 0x07, 0x07, DEF_STR( Difficulty ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x04, "1 (Easiest)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x05, "2" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x06, "3" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x07, "4 (Normal)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x03, "5" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x02, "6" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x01, "7" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, "8 (Hardest)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + /* Debug Dip Switches */ + PORT_DIPNAME( 0xe0, 0xe0, "Starting Level" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0xe0, "Level 1" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0xc0, "Level 2" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0xa0, "Level 3" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x80, "Level 4" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x60, "Level 5" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x40, "Level 6" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) +// PORT_DIPSETTING( 0x20, "INVALID !" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) +// PORT_DIPSETTING( 0x00, "INVALID !" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPNAME( 0x1e, 0x1e, "Slow Motion Delay" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x1e, "2 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x1c, "3 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x1a, "4 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x18, "5 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x16, "6 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x14, "7 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x12, "8 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x10, "9 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x0e, "10 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x0c, "11 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x0a, "12 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x08, "13 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x06, "14 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x04, "15 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x02, "16 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x00, "17 Frames" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + + PORT_START_TAG("DSWA") + /* Standard Dip Switches */ + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Cabinet ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0xc0, "Upright 1 Player" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x80, "Upright 2 Players" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) +// PORT_DIPSETTING( 0x40, DEF_STR( Cocktail ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x01, DEF_STR( 4C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x02, DEF_STR( 3C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, "2 Coins/1 Credit (1 to continue)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x08, DEF_STR( 4C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x10, DEF_STR( 3C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x18, DEF_STR( 2C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x00, "2 Coins/1 Credit (1 to continue)" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x38, DEF_STR( 1C_1C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x30, DEF_STR( 1C_2C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x28, DEF_STR( 1C_3C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x80) + /* Debug Dip Switches */ + PORT_DIPNAME( 0x80, 0x80, "Maximum magic/sword power" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Cabinet ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x40, "Upright 1 Player" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x00, "Upright 2 Players" ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPNAME( 0x3f, 0x3f, DEF_STR( Free_Play ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x3f, DEF_STR( Off ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + PORT_DIPSETTING( 0x38, DEF_STR( On ) ) PORT_CONDITION("DSWC",0x80,PORTCOND_EQUALS,0x00) + /* Other values don't give free play */ PORT_START_TAG("IN1") PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) @@ -1113,7 +1338,7 @@ INPUT_PORTS_START( willow ) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* BUTTON3 in the "Input" test screen */ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) @@ -1121,7 +1346,7 @@ INPUT_PORTS_START( willow ) PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* BUTTON3 in the "Input" test screen */ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END @@ -1236,16 +1461,16 @@ INPUT_PORTS_START( ffight ) PORT_DIPNAME( 0x07, 0x04, "Difficulty Level 1" ) PORT_DIPSETTING( 0x07, DEF_STR( Easiest ) ) // "01" PORT_DIPSETTING( 0x06, DEF_STR( Easier ) ) // "02" - PORT_DIPSETTING( 0x05, DEF_STR( Easy ) ) // "03" + PORT_DIPSETTING( 0x05, DEF_STR( Easy ) ) // "03" PORT_DIPSETTING( 0x04, DEF_STR( Normal ) ) // "04" PORT_DIPSETTING( 0x03, DEF_STR( Medium ) ) // "05" - PORT_DIPSETTING( 0x02, DEF_STR( Hard ) ) // "06" + PORT_DIPSETTING( 0x02, DEF_STR( Hard ) ) // "06" PORT_DIPSETTING( 0x01, DEF_STR( Harder ) ) // "07" PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) // "08" PORT_DIPNAME( 0x18, 0x10, "Difficulty Level 2" ) - PORT_DIPSETTING( 0x18, DEF_STR( Easy ) ) // "01" + PORT_DIPSETTING( 0x18, DEF_STR( Easy ) ) // "01" PORT_DIPSETTING( 0x10, DEF_STR( Normal ) ) // "02" - PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) // "03" + PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) // "03" PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) // "04" PORT_DIPNAME( 0x60, 0x60, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x60, "100k" ) @@ -1604,23 +1829,23 @@ INPUT_PORTS_START( msword ) PORT_START_TAG("DSWB") PORT_DIPNAME( 0x07, 0x04, "Player's vitality consumption" ) // "Level 1" - PORT_DIPSETTING( 0x07, "1 (Easiest)" ) // "Easy 3" (-1 every 28 frames) + PORT_DIPSETTING( 0x07, "1 (Easiest)" ) // "Easy 3" (-1 every 28 frames) PORT_DIPSETTING( 0x06, "2" ) // "Easy 2" (-1 every 24 frames) PORT_DIPSETTING( 0x05, "3" ) // "Easy 1" (-1 every 20 frames) - PORT_DIPSETTING( 0x04, "4 (Normal)" ) // DEF_STR( Normal ) (-1 every 18 frames) + PORT_DIPSETTING( 0x04, "4 (Normal)" ) // DEF_STR( Normal ) (-1 every 18 frames) PORT_DIPSETTING( 0x03, "5" ) // "Difficult 1" (-1 every 16 frames) PORT_DIPSETTING( 0x02, "6" ) // "Difficult 2" (-1 every 14 frames) PORT_DIPSETTING( 0x01, "7" ) // "Difficult 3" (-1 every 12 frames) - PORT_DIPSETTING( 0x00, "8 (Hardest)" ) // "Difficult 4" (-1 every 8 frames) - PORT_DIPNAME( 0x38, 0x38, "Enemy's vitality and attacking power" ) // "Level 2" - PORT_DIPSETTING( 0x20, "1 (Easiest)" ) // "Easy 3" + PORT_DIPSETTING( 0x00, "8 (Hardest)" ) // "Difficult 4" (-1 every 8 frames) + PORT_DIPNAME( 0x38, 0x38, "Enemy's vitality and attacking power" )// "Level 2" + PORT_DIPSETTING( 0x20, "1 (Easiest)" ) // "Easy 3" PORT_DIPSETTING( 0x28, "2" ) // "Easy 2" PORT_DIPSETTING( 0x30, "3" ) // "Easy 1" - PORT_DIPSETTING( 0x38, "4 (Normal)" ) // DEF_STR( Normal ) + PORT_DIPSETTING( 0x38, "4 (Normal)" ) // DEF_STR( Normal ) PORT_DIPSETTING( 0x18, "5" ) // "Difficult 1" PORT_DIPSETTING( 0x10, "6" ) // "Difficult 2" PORT_DIPSETTING( 0x08, "7" ) // "Difficult 3" - PORT_DIPSETTING( 0x00, "8 (Hardest)" ) // "Difficult 4" + PORT_DIPSETTING( 0x00, "8 (Hardest)" ) // "Difficult 4" PORT_DIPNAME( 0x40, 0x00, "Stage Select" ) PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) @@ -2720,6 +2945,9 @@ INPUT_PORTS_START( cworld2j ) PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) + + PORT_START_TAG("IN2") /* check code at 0x000614, 0x0008ac and 0x000e36 */ + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END /* Needs further checking */ @@ -3124,6 +3352,9 @@ INPUT_PORTS_START( qad ) PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) + + PORT_START_TAG("IN2") /* check code at 0x01d2d2 */ + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END /* Needs further checking */ @@ -3225,6 +3456,12 @@ INPUT_PORTS_START( qadj ) PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) + + PORT_START_TAG("IN2") /* check code at 0x000c48 */ + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN3") /* check code at 0x000c3e */ + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END /* Needs further checking */ @@ -3318,6 +3555,12 @@ INPUT_PORTS_START( qtono2 ) PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2) + + PORT_START_TAG("IN2") /* check code at 0x000f80 */ + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START_TAG("IN3") /* check code at 0x000f76 */ + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END /* Needs further checking */ @@ -7486,25 +7729,25 @@ ROM_END static DRIVER_INIT( wof ) { wof_decode(); - init_cps1(); + init_cps1(machine); } static DRIVER_INIT( dino ) { dino_decode(); - init_cps1(); + init_cps1(machine); } static DRIVER_INIT( punisher ) { punisher_decode(); - init_cps1(); + init_cps1(machine); } static DRIVER_INIT( slammast ) { slammast_decode(); - init_cps1(); + init_cps1(machine); } static DRIVER_INIT( pang3 ) @@ -7528,7 +7771,7 @@ static DRIVER_INIT( pang3 ) rom[A/2] = dst; } - init_cps1(); + init_cps1(machine); } diff --git a/src/drivers/cps2.c b/src/drivers/cps2.c index bd0f4127b..3e857ca87 100644 --- a/src/drivers/cps2.c +++ b/src/drivers/cps2.c @@ -1355,7 +1355,7 @@ static READ16_HANDLER( pl2_port_0_word_r ) static DRIVER_INIT ( puzloop2 ) { - init_cps2(); + init_cps2(machine); memory_install_read16_handler(0, ADDRESS_SPACE_PROGRAM, 0x804000, 0x804001, 0, 0, pl2_port_0_word_r); } diff --git a/src/drivers/cps3.c b/src/drivers/cps3.c index d913cbcba..616bb85c1 100644 --- a/src/drivers/cps3.c +++ b/src/drivers/cps3.c @@ -342,7 +342,10 @@ ROM_END ROM_START( sfiii3 ) ROM_REGION( 0x080000, REGION_USER1, 0 ) /* bios region */ - ROM_LOAD( "29f400.u2", 0x000000, 0x080000, CRC(74205250) SHA1(c3e83ace7121d32da729162662ec6b5285a31211) ) + /* why was this loading the sfiii.zip bios?? mistake? or does it work with both? */ +// ROM_LOAD( "29f400.u2", 0x000000, 0x080000, CRC(74205250) SHA1(c3e83ace7121d32da729162662ec6b5285a31211) ) // uuh, this is the sfiii bios... + /* this one is from a usa version of sf3 3rd strike */ + ROM_LOAD( "sf33usa.bin", 0x000000, 0x080000, CRC(ecc545c1) SHA1(e39083820aae914fd8b80c9765129bedb745ceba) ) #ifdef LOAD_CD_CONTENT /* Note: These regions contains the rom data extracted from the cd. diff --git a/src/drivers/cshooter.c b/src/drivers/cshooter.c index 3c8bc904b..97d66e62a 100644 --- a/src/drivers/cshooter.c +++ b/src/drivers/cshooter.c @@ -145,7 +145,7 @@ VIDEO_START(cshooter) VIDEO_UPDATE(cshooter) { - fillbitmap(bitmap, 0/*get_black_pen()*/, &Machine->screen[0].visarea); + fillbitmap(bitmap, 0/*get_black_pen(machine)*/, &Machine->screen[0].visarea); tilemap_mark_all_tiles_dirty(cshooter_txtilemap); //sprites @@ -247,25 +247,16 @@ WRITE8_HANDLER ( bank_w ) static WRITE8_HANDLER(pal_w) { - int r,g,b; paletteram[offset]=data; offset&=0xff; - b=paletteram[offset+0x100]&0xf; - r=(paletteram[offset])>>4; - g=paletteram[offset]&0x0f; - palette_set_color(offset, r * 0x11, g * 0x11, b * 0x11); - + palette_set_color(Machine, offset, pal4bit(paletteram[offset] >> 4), pal4bit(paletteram[offset]), pal4bit(paletteram[offset+0x100])); } static WRITE8_HANDLER(pal2_w) { - int r,g,b; //guess paletteram[offset]=data; offset&=0x1ff; - b=paletteram[offset+0x200]&0xf; - r=(paletteram[offset])>>4; - g=paletteram[offset]&0x0f; - palette_set_color(offset, r * 0x11, g * 0x11, b * 0x11); + palette_set_color(Machine, offset, pal4bit(paletteram[offset] >> 4), pal4bit(paletteram[offset]), pal4bit(paletteram[offset+0x200])); } static READ8_HANDLER(pal_r) diff --git a/src/drivers/csk.c b/src/drivers/csk.c index a28e927cb..9f2adf917 100644 --- a/src/drivers/csk.c +++ b/src/drivers/csk.c @@ -651,7 +651,7 @@ ROM_END /* Decode a simple PAL encryption */ -static void init_cska(void) +static DRIVER_INIT( cska ) { int A; unsigned char *rom = memory_region(REGION_CPU1); diff --git a/src/drivers/darkhors.c b/src/drivers/darkhors.c index c43591205..a56a5b053 100644 --- a/src/drivers/darkhors.c +++ b/src/drivers/darkhors.c @@ -169,7 +169,7 @@ VIDEO_UPDATE( darkhors ) } #endif - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); tilemap_set_scrollx(darkhors_tmap,0, (darkhors_tmapscroll[0] >> 16) - 5); tilemap_set_scrolly(darkhors_tmap,0, (darkhors_tmapscroll[0] & 0xffff) - 0xff ); diff --git a/src/drivers/dassault.c b/src/drivers/dassault.c index 7205d9e05..e9bf1d9c2 100644 --- a/src/drivers/dassault.c +++ b/src/drivers/dassault.c @@ -856,7 +856,7 @@ static READ16_HANDLER( thndzone_main_skip ) return ret; } -static void init_dassault(void) +static DRIVER_INIT( dassault ) { const UINT8 *src = memory_region(REGION_GFX1); UINT8 *dst = memory_region(REGION_GFX2); @@ -876,7 +876,7 @@ static void init_dassault(void) memory_install_read16_handler(0, ADDRESS_SPACE_PROGRAM, 0x3f8000, 0x3f8001, 0, 0, dassault_main_skip); } -static void init_thndzone(void) +static DRIVER_INIT( thndzone ) { const UINT8 *src = memory_region(REGION_GFX1); UINT8 *dst = memory_region(REGION_GFX2); diff --git a/src/drivers/dblewing.c b/src/drivers/dblewing.c index 65537599d..c6c020a87 100644 --- a/src/drivers/dblewing.c +++ b/src/drivers/dblewing.c @@ -274,7 +274,7 @@ READ16_HANDLER ( dlbewing_prot_r ) printf("dblewing prot r %08x, %04x, %04x\n",activecpu_get_pc(), offset*2, mem_mask); - return 0;//mame_rand(); + return 0;//mame_rand(Machine); } WRITE16_HANDLER( dblewing_prot_w ) diff --git a/src/drivers/ddenlovr.c b/src/drivers/ddenlovr.c index 6f9fe9a9a..051224eb0 100644 --- a/src/drivers/ddenlovr.c +++ b/src/drivers/ddenlovr.c @@ -162,7 +162,7 @@ VIDEO_START(ddenlovr) VIDEO_START(mmpanic) { - if (video_start_ddenlovr()) + if (video_start_ddenlovr(machine)) return 1; extra_layers = 1; @@ -1468,11 +1468,7 @@ static WRITE8_HANDLER( rongrong_palette_w ) /* what were they smoking??? */ b = ((d1 & 0xe0) >> 5) | (d2 & 0xc0) >> 3; - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(indx,r,g,b); + palette_set_color(Machine,indx,pal5bit(r),pal5bit(g),pal5bit(b)); } static WRITE16_HANDLER( ddenlovr_palette_w ) @@ -2422,11 +2418,7 @@ static WRITE8_HANDLER( hanakanz_palette_w ) int g = dynax_blit_reg & 0x1f; int r = data & 0x1f; int b = ((data & 0xe0) >> 5) | ((dynax_blit_reg & 0x60) >> 2); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color((palette_index++)&0x1ff,r,g,b); + palette_set_color(Machine,(palette_index++)&0x1ff,pal5bit(r),pal5bit(g),pal5bit(b)); } } @@ -2437,7 +2429,7 @@ static WRITE8_HANDLER( hanakanz_oki_bank_w ) static READ8_HANDLER( hanakanz_rand_r ) { - return mame_rand(); + return mame_rand(Machine); } static ADDRESS_MAP_START( hanakanz_readport, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) @@ -2606,11 +2598,7 @@ static WRITE8_HANDLER( mjchuuka_palette_w ) int r = (rgb >> 0) & 0x1f; int g = (rgb >> 8) & 0x1f; int b = ((rgb >> 5) & 0x07) | ((rgb & 0x6000) >> 10); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color((palette_index++)&0x1ff,r,g,b); + palette_set_color(Machine,(palette_index++)&0x1ff,pal5bit(r),pal5bit(g),pal5bit(b)); } } diff --git a/src/drivers/deadang.c b/src/drivers/deadang.c index dbe5090c9..008c64ce1 100644 --- a/src/drivers/deadang.c +++ b/src/drivers/deadang.c @@ -330,7 +330,7 @@ static MACHINE_DRIVER_START( deadang ) MDRV_MACHINE_RESET(seibu_sound_2) /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_BUFFERS_SPRITERAM) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_SCREEN_SIZE(32*8, 32*8) MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) MDRV_GFXDECODE(gfxdecodeinfo) diff --git a/src/drivers/dec8.c b/src/drivers/dec8.c index 2f1054189..0d54960cc 100644 --- a/src/drivers/dec8.c +++ b/src/drivers/dec8.c @@ -3157,8 +3157,8 @@ static DRIVER_INIT( meikyuh ) static DRIVER_INIT( ghostb ) { - init_deco222(); - init_meikyuh(); + init_deco222(machine); + init_meikyuh(machine); } /******************************************************************************/ diff --git a/src/drivers/deco156.c b/src/drivers/deco156.c index 7462adb92..13c4da045 100644 --- a/src/drivers/deco156.c +++ b/src/drivers/deco156.c @@ -211,15 +211,8 @@ static WRITE32_HANDLER(wcvol95_eeprom_w) static WRITE32_HANDLER(wcvol95_nonbuffered_palette_w) { - int r,g,b; - COMBINE_DATA(&paletteram32[offset]); - - b = (paletteram32[offset] >>10) & 0x1f; - g = (paletteram32[offset] >> 5) & 0x1f; - r = (paletteram32[offset] >> 0) & 0x1f; - - palette_set_color(offset,r<<3,g<<3,b<<3); + palette_set_color(Machine,offset,pal5bit(paletteram32[offset] >> 0),pal5bit(paletteram32[offset] >> 5),pal5bit(paletteram32[offset] >> 10)); } diff --git a/src/drivers/deco32.c b/src/drivers/deco32.c index 890bc43d1..594a16029 100644 --- a/src/drivers/deco32.c +++ b/src/drivers/deco32.c @@ -33,6 +33,10 @@ Video backgrounds in Dragongun? + Locked'N Loaded (parent set) is a slightly different hardware + revision: board # DE-0420-1 where the US set is DE-0359-2. + The sound is _not_ hooked up correctly for this set. + Locked 'n Loaded (US) @@ -2685,7 +2689,80 @@ ROM_START( fghthsta ) ROM_LOAD( "pal16l8b.4d", 0x0200, 0x0104, NO_DUMP ) /* PAL is read protected */ ROM_END -ROM_START( lockload ) +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_REGION(0x400000, REGION_CPU1, 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-03-1.d8", 0x000001, 0x80000, CRC(51a53ece) SHA1(ee2c8858844a47fa1e83c30c06d78cf49219dc33) ) + + ROM_REGION(0x10000, REGION_CPU2, 0 ) /* Sound CPU */ + ROM_LOAD( "nm-06-.n22", 0x00000, 0x10000, CRC(31d1c245) SHA1(326e35e7ebd8ea761d90e856c50d86512327f2a5) ) + + ROM_REGION( 0x020000, REGION_GFX1, ROMREGION_DISPOSE ) + 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_REGION( 0x100000, REGION_GFX2, ROMREGION_DISPOSE ) + 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, REGION_GFX3, ROMREGION_DISPOSE ) + 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, REGION_GFX4, ROMREGION_DISPOSE ) + 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( 0x100000, REGION_GFX5, ROMREGION_ERASE00 ) /* Video data - unique PCB and this region is not used? */ + + ROM_REGION(0x100000, REGION_SOUND1, 0 ) + ROM_LOAD( "mbm-06.n17", 0x00000, 0x100000, CRC(f34d5999) SHA1(265b5f4e8598bcf9183bf9bd95db69b01536acb2) ) + + ROM_REGION(0x80000, REGION_SOUND2, ROMREGION_ERASE00 ) /* Sound data - unique PCB and this region is not used? */ + + ROM_REGION(0x80000, REGION_SOUND3, 0 ) + ROM_LOAD( "mbm-07.n19", 0x00000, 0x80000, CRC(414f3793) SHA1(ed5f63e57390d503193fd1e9f7294ae1da6d3539) ) /* Does this go here or REGION_SOUND2 ?? */ +ROM_END + +ROM_START( locklodu ) ROM_REGION(0x400000, REGION_CPU1, 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) ) @@ -2748,18 +2825,18 @@ ROM_START( lockload ) ROM_LOAD32_BYTE( "mbm-15.a25", 0x400003, 0x100000, CRC(789ce7b1) SHA1(3fb390ce0620ce7a63f7f46eac1ff0eb8ed76d26) ) ROM_REGION( 0x100000, REGION_GFX5, ROMREGION_ERASE00 ) /* Video data - same as Dragongun, probably leftover from a conversion */ -// ROM_LOAD( "dgma17.bin", 0x00000, 0x100000, CRC(7799ed23) SHA1(ae28ad4fa6033a3695fa83356701b3774b26e6b0) ) /* Todo - fix filenames */ -// ROM_LOAD( "dgma18.bin", 0x00000, 0x100000, CRC(ded66da9) SHA1(5134cb47043cc190a35ebdbf1912166669f9c055) ) -// ROM_LOAD( "dgma19.bin", 0x00000, 0x100000, CRC(bdd1ed20) SHA1(2435b23210b8fee4d39c30d4d3c6ea40afaa3b93) ) -// ROM_LOAD( "dgma20.bin", 0x00000, 0x100000, CRC(fa0462f0) SHA1(1a52617ad4d7abebc0f273dd979f4cf2d6a0306b) ) -// ROM_LOAD( "dgma21.bin", 0x00000, 0x100000, CRC(2d0a28ae) SHA1(d87f6f71bb76880e4d4f1eab8e0451b5c3df69a5) ) -// ROM_LOAD( "dgma22.bin", 0x00000, 0x100000, CRC(c85f3559) SHA1(a5d5cf9b18c9ef6a92d7643ca1ec9052de0d4a01) ) -// ROM_LOAD( "dgma23.bin", 0x00000, 0x100000, CRC(ba907d6a) SHA1(1fd99b66e6297c8d927c1cf723a613b4ee2e2f90) ) -// ROM_LOAD( "dgma24.bin", 0x00000, 0x100000, CRC(5cec45c8) SHA1(f99a26afaca9d9320477e469b09e3873bc8c156f) ) -// ROM_LOAD( "dgma25.bin", 0x00000, 0x100000, CRC(d65d895c) SHA1(4508dfff95a7aff5109dc74622cbb4503b0b5840) ) -// ROM_LOAD( "dgma26.bin", 0x00000, 0x100000, CRC(246a06c5) SHA1(447252be976a5059925f4ad98df8564b70198f62) ) -// ROM_LOAD( "dgma27.bin", 0x00000, 0x100000, CRC(3fcbd10f) SHA1(70fc7b88bbe35bbae1de14364b03d0a06d541de5) ) -// ROM_LOAD( "dgma28.bin", 0x00000, 0x100000, CRC(5a2ec71d) SHA1(447c404e6bb696f7eb7c61992a99b9be56f5d6b0) ) +// 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) ) ROM_REGION(0x100000, REGION_SOUND1, 0 ) ROM_LOAD( "mbm-06.n17", 0x00000, 0x100000, CRC(f34d5999) SHA1(265b5f4e8598bcf9183bf9bd95db69b01536acb2) ) @@ -3186,7 +3263,8 @@ GAME( 1993, dragngun, 0, dragngun, dragngun, dragngun, ROT0, "Data East C GAME( 1993, fghthist, 0, fghthist, fghthist, fghthist, ROT0, "Data East Corporation", "Fighter's History (World ver 43-07)", 0 ) GAME( 1993, fghthstu, fghthist, fghthist, fghthist, fghthist, ROT0, "Data East Corporation", "Fighter's History (US ver 42-03)", 0 ) GAME( 1993, fghthsta, fghthist, fghthsta, fghthist, fghthist, ROT0, "Data East Corporation", "Fighter's History (US ver 42-05, alternate hardware )", 0 ) -GAME( 1994, lockload, 0, lockload, lockload, lockload, ROT0, "Data East Corporation", "Locked 'n Loaded (US)", GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING ) +GAME( 1994, lockload, 0, lockload, lockload, lockload, ROT0, "Data East Corporation", "Locked 'n Loaded (World)", GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING ) +GAME( 1994, locklodu, 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 ) GAME( 1994, nslasher, 0, nslasher, nslasher, nslasher, ROT0, "Data East Corporation", "Night Slashers (Korea Rev 1.3)", GAME_IMPERFECT_GRAPHICS ) diff --git a/src/drivers/deco_mlc.c b/src/drivers/deco_mlc.c index cec6a66ac..87e914960 100644 --- a/src/drivers/deco_mlc.c +++ b/src/drivers/deco_mlc.c @@ -159,16 +159,9 @@ static WRITE32_HANDLER( avengrs_eprom_w ) static WRITE32_HANDLER( avengrs_palette_w ) { - int r,g,b; - COMBINE_DATA(&paletteram32[offset]); - /* x bbbbb ggggg rrrrr */ - b = (paletteram32[offset] >> 10) & 0x1f; - g = (paletteram32[offset] >> 5) & 0x1f; - r = (paletteram32[offset] >> 0) & 0x1f; - - palette_set_color(offset,r*8,g*8,b*8); + palette_set_color(Machine,offset,pal5bit(paletteram32[offset] >> 0),pal5bit(paletteram32[offset] >> 5),pal5bit(paletteram32[offset] >> 10)); } static READ32_HANDLER( avengrs_sound_r ) diff --git a/src/drivers/decocass.c b/src/drivers/decocass.c index af8590a71..d806a1ba8 100644 --- a/src/drivers/decocass.c +++ b/src/drivers/decocass.c @@ -1179,7 +1179,7 @@ static DRIVER_INIT( decocrom ) int i; /* standard init */ - init_decocass(); + init_decocass(machine); /* decrypt the ROMs */ for (i = 0; i < romlength; i++) diff --git a/src/drivers/destroyr.c b/src/drivers/destroyr.c index b3814e274..fc66e615d 100644 --- a/src/drivers/destroyr.c +++ b/src/drivers/destroyr.c @@ -323,14 +323,14 @@ static const gfx_decode destroyr_gfx_decode_info[] = static PALETTE_INIT( destroyr ) { - palette_set_color(0, 0x00, 0x00, 0x00); /* major objects */ - palette_set_color(1, 0x50, 0x50, 0x50); - palette_set_color(2, 0xAF, 0xAF, 0xAF); - palette_set_color(3, 0xFF ,0xFF, 0xFF); - palette_set_color(4, 0x00, 0x00, 0x00); /* alpha numerics, waves, minor objects */ - palette_set_color(5, 0xFF, 0xFF, 0xFF); - palette_set_color(6, 0x00, 0x00, 0x00); /* cursor */ - palette_set_color(7, 0x78, 0x78, 0x78); + palette_set_color(machine, 0, 0x00, 0x00, 0x00); /* major objects */ + palette_set_color(machine, 1, 0x50, 0x50, 0x50); + palette_set_color(machine, 2, 0xAF, 0xAF, 0xAF); + palette_set_color(machine, 3, 0xFF ,0xFF, 0xFF); + palette_set_color(machine, 4, 0x00, 0x00, 0x00); /* alpha numerics, waves, minor objects */ + palette_set_color(machine, 5, 0xFF, 0xFF, 0xFF); + palette_set_color(machine, 6, 0x00, 0x00, 0x00); /* cursor */ + palette_set_color(machine, 7, 0x78, 0x78, 0x78); } diff --git a/src/drivers/dgpix.c b/src/drivers/dgpix.c index 3a2c2618a..c6ad5bf5b 100644 --- a/src/drivers/dgpix.c +++ b/src/drivers/dgpix.c @@ -227,7 +227,7 @@ static ADDRESS_MAP_START( io_map, ADDRESS_SPACE_IO, 32 ) ADDRESS_MAP_END -void nvram_handler_flashroms(mame_file *file,int read_or_write) +NVRAM_HANDLER( flashroms ) { if (read_or_write) { diff --git a/src/drivers/djmain.c b/src/drivers/djmain.c index 7565536db..f11c25dc3 100644 --- a/src/drivers/djmain.c +++ b/src/drivers/djmain.c @@ -82,7 +82,7 @@ static WRITE32_HANDLER( paletteram32_w ) g = (data >> 8) & 0xff; b = (data >> 16) & 0xff; - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, r, g, b); } @@ -1247,9 +1247,7 @@ static DRIVER_INIT( beatmania ) { UINT8 *region; - if (new_memory_region(REGION_SOUND1, 0x80000 * 32, 0) != 0) - return; - region = memory_region(REGION_SOUND1); + region = new_memory_region(machine, REGION_SOUND1, 0x80000 * 32, 0); /* spin up the hard disk */ ide_controller_init(0, &ide_intf); @@ -1275,7 +1273,7 @@ static DRIVER_INIT( hmcompmx ) 0x6b, 0x09, 0x02, 0x0f, 0x05, 0x00, 0x7d, 0x1b }; - init_beatmania(); + init_beatmania(machine); ide_set_master_password(0, beatmania_master_password); ide_set_user_password(0, hmcompmx_user_password); @@ -1292,7 +1290,7 @@ static DRIVER_INIT( bm4thmix ) 0x18, 0x06, 0x1e, 0x07, 0x77, 0x1a, 0x7d, 0x77 }; - init_beatmania(); + init_beatmania(machine); ide_set_user_password(0, bm4thmix_user_password); } @@ -1308,7 +1306,7 @@ static DRIVER_INIT( bm5thmix ) 0x6b, 0x1a, 0x1e, 0x06, 0x04, 0x01, 0x7d, 0x1f }; - init_beatmania(); + init_beatmania(machine); ide_set_master_password(0, beatmania_master_password); ide_set_user_password(0, bm5thmix_user_password); @@ -1325,7 +1323,7 @@ static DRIVER_INIT( bmcompm2 ) 0x6b, 0x0d, 0x71, 0x0f, 0x1d, 0x10, 0x7d, 0x7a }; - init_beatmania(); + init_beatmania(machine); ide_set_master_password(0, beatmania_master_password); ide_set_user_password(0, bmcompm2_user_password); @@ -1342,7 +1340,7 @@ static DRIVER_INIT( hmcompm2 ) 0x09, 0x68, 0x71, 0x0b, 0x77, 0x15, 0x17, 0x1e }; - init_beatmania(); + init_beatmania(machine); ide_set_master_password(0, beatmania_master_password); ide_set_user_password(0, hmcompm2_user_password); @@ -1359,7 +1357,7 @@ static DRIVER_INIT( bmdct ) 0x0e, 0x0a, 0x05, 0x0f, 0x13, 0x74, 0x09, 0x19 }; - init_beatmania(); + init_beatmania(machine); ide_set_master_password(0, beatmania_master_password); ide_set_user_password(0, bmdct_user_password); @@ -1376,7 +1374,7 @@ static DRIVER_INIT( bmcorerm ) 0x05, 0x09, 0x14, 0x0d, 0x7a, 0x74, 0x7d, 0x7a }; - init_beatmania(); + init_beatmania(machine); ide_set_master_password(0, beatmania_master_password); ide_set_user_password(0, bmcorerm_user_password); @@ -1393,7 +1391,7 @@ static DRIVER_INIT( bm6thmix ) 0x02, 0x06, 0x09, 0x0f, 0x7a, 0x74, 0x7d, 0x7a }; - init_beatmania(); + init_beatmania(machine); ide_set_master_password(0, beatmania_master_password); ide_set_user_password(0, bm6thmix_user_password); diff --git a/src/drivers/dkong.c b/src/drivers/dkong.c index 26acdcd81..ebeb02aa3 100644 --- a/src/drivers/dkong.c +++ b/src/drivers/dkong.c @@ -309,7 +309,7 @@ static MACHINE_RESET( strtheat ) { UINT8 *ROM = memory_region(REGION_CPU1); - machine_reset_dkong(); + machine_reset_dkong(machine); /* The initial state of the counter is 0x08 */ memory_configure_bank(1, 0, 4, &ROM[0x10000], 0x4000); @@ -321,7 +321,7 @@ static MACHINE_RESET( drakton ) { UINT8 *ROM = memory_region(REGION_CPU1); - machine_reset_dkong(); + machine_reset_dkong(machine); /* The initial state of the counter is 0x09 */ memory_configure_bank(1, 0, 4, &ROM[0x10000], 0x4000); diff --git a/src/drivers/dmndrby.c b/src/drivers/dmndrby.c index a5f67fe80..5a67ece43 100644 --- a/src/drivers/dmndrby.c +++ b/src/drivers/dmndrby.c @@ -42,7 +42,7 @@ static UINT8* dderby_vid; static READ8_HANDLER( dderby_random_reader ) { - return mame_rand(); + return mame_rand(Machine); } static ADDRESS_MAP_START( memmap, ADDRESS_SPACE_PROGRAM, 8 ) @@ -145,7 +145,7 @@ VIDEO_UPDATE(dderby) int x,y,count; const gfx_element *gfx = Machine->gfx[0]; - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); count=0; for (y=0;y<32;y++) diff --git a/src/drivers/dooyong.c b/src/drivers/dooyong.c index e040d4e39..3caa7704b 100644 --- a/src/drivers/dooyong.c +++ b/src/drivers/dooyong.c @@ -1113,7 +1113,7 @@ static MACHINE_DRIVER_START( primella ) MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION) /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_BUFFERS_SPRITERAM) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_SCREEN_SIZE(64*8, 32*8) MDRV_VISIBLE_AREA(8*8, (64-8)*8-1, 0*8, 32*8-1 ) MDRV_GFXDECODE(primella_gfxdecodeinfo) diff --git a/src/drivers/dragrace.c b/src/drivers/dragrace.c index 01b93460f..f67d6a3d9 100644 --- a/src/drivers/dragrace.c +++ b/src/drivers/dragrace.c @@ -304,22 +304,22 @@ static const gfx_decode dragrace_gfx_decode_info[] = static PALETTE_INIT( dragrace ) { - palette_set_color(0, 0xFF, 0xFF, 0xFF); /* 2 color tiles */ - palette_set_color(1, 0x00, 0x00, 0x00); - palette_set_color(2, 0x00, 0x00, 0x00); - palette_set_color(3, 0xFF, 0xFF, 0xFF); - palette_set_color(4, 0x00, 0x00, 0x00); - palette_set_color(5, 0x00, 0x00, 0x00); - palette_set_color(6, 0xFF, 0xFF, 0xFF); - palette_set_color(7, 0xFF, 0xFF, 0xFF); - palette_set_color(8, 0xFF, 0xFF, 0xFF); /* 4 color tiles */ - palette_set_color(9, 0xB0, 0xB0, 0xB0); - palette_set_color(10,0x5F, 0x5F, 0x5F); - palette_set_color(11,0x00, 0x00, 0x00); - palette_set_color(12,0xFF, 0xFF, 0xFF); - palette_set_color(13,0x5F, 0x5F, 0x5F); - palette_set_color(14,0xB0, 0xB0, 0xB0); - palette_set_color(15,0x00, 0x00, 0x00); + palette_set_color(machine, 0, 0xFF, 0xFF, 0xFF); /* 2 color tiles */ + palette_set_color(machine, 1, 0x00, 0x00, 0x00); + palette_set_color(machine, 2, 0x00, 0x00, 0x00); + palette_set_color(machine, 3, 0xFF, 0xFF, 0xFF); + palette_set_color(machine, 4, 0x00, 0x00, 0x00); + palette_set_color(machine, 5, 0x00, 0x00, 0x00); + palette_set_color(machine, 6, 0xFF, 0xFF, 0xFF); + palette_set_color(machine, 7, 0xFF, 0xFF, 0xFF); + palette_set_color(machine, 8, 0xFF, 0xFF, 0xFF); /* 4 color tiles */ + palette_set_color(machine, 9, 0xB0, 0xB0, 0xB0); + palette_set_color(machine, 10,0x5F, 0x5F, 0x5F); + palette_set_color(machine, 11,0x00, 0x00, 0x00); + palette_set_color(machine, 12,0xFF, 0xFF, 0xFF); + palette_set_color(machine, 13,0x5F, 0x5F, 0x5F); + palette_set_color(machine, 14,0xB0, 0xB0, 0xB0); + palette_set_color(machine, 15,0x00, 0x00, 0x00); } diff --git a/src/drivers/dreamwld.c b/src/drivers/dreamwld.c index 374ddc0e4..ba38039ff 100644 --- a/src/drivers/dreamwld.c +++ b/src/drivers/dreamwld.c @@ -133,7 +133,7 @@ VIDEO_START(dreamwld) VIDEO_UPDATE(dreamwld) { tilemap_draw(bitmap,cliprect,dreamwld_bg_tilemap,0,0); -// fillbitmap(bitmap, get_black_pen(), cliprect); +// fillbitmap(bitmap, get_black_pen(machine), cliprect); dreamwld_drawsprites(bitmap,cliprect); @@ -143,7 +143,7 @@ VIDEO_UPDATE(dreamwld) static READ32_HANDLER( dreamwld_random_read) { - return mame_rand(); + return mame_rand(Machine); } static READ32_HANDLER( inputs_r_1 ) @@ -156,7 +156,7 @@ static READ32_HANDLER( inputs_r_1 ) logerror("Protection Read Offset %08x, Mem_mask %08x\n",offset*4, mem_mask); - return mame_rand()^ (mame_rand()<<16); + return mame_rand(Machine)^ (mame_rand(Machine)<<16); } diff --git a/src/drivers/dwarfd.c b/src/drivers/dwarfd.c index 7a2f5a3d0..1fede36c5 100644 --- a/src/drivers/dwarfd.c +++ b/src/drivers/dwarfd.c @@ -144,7 +144,7 @@ VIDEO_UPDATE(dwarfd) int x,y; int count=0; - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); for (y=0;y<128;y++) { diff --git a/src/drivers/dynadice.c b/src/drivers/dynadice.c index c67f0863e..2e0c30f67 100644 --- a/src/drivers/dynadice.c +++ b/src/drivers/dynadice.c @@ -198,7 +198,7 @@ PALETTE_INIT( dynadice ) { int i; for(i=0;i<8;i++) - palette_set_color(i,(i&2)?255:0,(i&4)?255:0,(i&1)?255:0); + palette_set_color(machine,i,pal1bit(i >> 1),pal1bit(i >> 2),pal1bit(i >> 0)); } static MACHINE_DRIVER_START( dynadice ) diff --git a/src/drivers/dynax.c b/src/drivers/dynax.c index e564a62de..6bad44ed4 100644 --- a/src/drivers/dynax.c +++ b/src/drivers/dynax.c @@ -321,10 +321,7 @@ static WRITE8_HANDLER( hnoridur_palette_w ) int r = BITSWAP8((x >> 0) & 0x1f, 7,6,5, 0,1,2,3,4 ); int g = BITSWAP8((x >> 5) & 0x1f, 7,6,5, 0,1,2,3,4 ); int b = BITSWAP8((x >> 10) & 0x1f, 7,6,5, 0,1,2,3,4 ); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - palette_set_color(256*palbank + offset,r,g,b); + palette_set_color(Machine,256*palbank + offset,pal5bit(r),pal5bit(g),pal5bit(b)); } } @@ -352,10 +349,7 @@ static WRITE8_HANDLER( yarunara_palette_w ) int r = br & 0x1f; int g = bg & 0x1f; int b = ((bg & 0xc0)>>3) | ((br & 0xe0)>>5); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - palette_set_color( 256*palbank + ((offset&0xf)|((offset&0x1e0)>>1)) ,r,g,b); + palette_set_color(Machine, 256*palbank + ((offset&0xf)|((offset&0x1e0)>>1)) ,pal5bit(r),pal5bit(g),pal5bit(b)); } } @@ -382,10 +376,7 @@ static WRITE8_HANDLER( nanajign_palette_w ) int r = br & 0x1f; int g = bg & 0x1f; int b = ((bg & 0xc0)>>3) | ((br & 0xe0)>>5); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - palette_set_color(256*palbank + offset,r,g,b); + palette_set_color(Machine,256*palbank + offset,pal5bit(r),pal5bit(g),pal5bit(b)); } } @@ -3955,7 +3946,7 @@ static DRIVER_INIT( mjelct3a ) free(rom1); } - init_mjelct3(); + init_mjelct3(machine); } diff --git a/src/drivers/enigma2.c b/src/drivers/enigma2.c index de420ca8d..6666acd5a 100644 --- a/src/drivers/enigma2.c +++ b/src/drivers/enigma2.c @@ -190,14 +190,14 @@ ADDRESS_MAP_END PALETTE_INIT( enigma2 ) { - palette_set_color(0,0,0,0); - palette_set_color(1,0,0xff,0); - palette_set_color(2,0,0,0xff); - palette_set_color(3,0,0xff,0xff); - palette_set_color(4,0xff,0,0); - palette_set_color(5,0xff,0xff,0); - palette_set_color(6,0xff,0,0xff); - palette_set_color(7,0xff,0xff,0xff); + palette_set_color(machine,0,0,0,0); + palette_set_color(machine,1,0,0xff,0); + palette_set_color(machine,2,0,0,0xff); + palette_set_color(machine,3,0,0xff,0xff); + palette_set_color(machine,4,0xff,0,0); + palette_set_color(machine,5,0xff,0xff,0); + palette_set_color(machine,6,0xff,0,0xff); + palette_set_color(machine,7,0xff,0xff,0xff); } VIDEO_UPDATE( enigma2 ) diff --git a/src/drivers/eolith.c b/src/drivers/eolith.c index 05f19ccf4..166f77e2b 100644 --- a/src/drivers/eolith.c +++ b/src/drivers/eolith.c @@ -96,7 +96,7 @@ static READ32_HANDLER( eeprom_r ) bit 9 = ??? */ - return (readinputport(0) & ~0x308) | (EEPROM_read_bit() << 3) | (mame_rand() & 0x300); + return (readinputport(0) & ~0x308) | (EEPROM_read_bit() << 3) | (mame_rand(Machine) & 0x300); } static WRITE32_HANDLER( systemcontrol_w ) diff --git a/src/drivers/eolith16.c b/src/drivers/eolith16.c index 106df3916..848dcc737 100644 --- a/src/drivers/eolith16.c +++ b/src/drivers/eolith16.c @@ -123,7 +123,7 @@ VIDEO_UPDATE( eolith16 ) return 0; } -void nvram_handler_eolith16_eeprom(mame_file *file,int read_or_write) +static NVRAM_HANDLER( eolith16_eeprom ) { if (read_or_write) EEPROM_save(file); @@ -154,7 +154,7 @@ PALETTE_INIT( eolith16 ) bit1 = (c >> 7) & 0x01; b = 0x55 * bit0 + 0xaa * bit1; - palette_set_color(c,r,g,b); + palette_set_color(machine,c,r,g,b); } } diff --git a/src/drivers/ertictac.c b/src/drivers/ertictac.c index 5ab45645e..691cc35b0 100644 --- a/src/drivers/ertictac.c +++ b/src/drivers/ertictac.c @@ -296,7 +296,7 @@ PALETTE_INIT(ertictac) g = ((c & 0x20) >> 3) | ((c & 0x40) >> 3) | i; b = ((c & 0x08) >> 1) | ((c & 0x80) >> 4) | i; - palette_set_color(c, r * 0x11, g * 0x11, b * 0x11); + palette_set_color(machine, c, pal4bit(r), pal4bit(g), pal4bit(b)); } } diff --git a/src/drivers/exerion.c b/src/drivers/exerion.c index 9622f64f9..ce5710fe6 100644 --- a/src/drivers/exerion.c +++ b/src/drivers/exerion.c @@ -505,7 +505,7 @@ static DRIVER_INIT( exerionb ) ram[addr] = (ram[addr] & 0xf9) | ((ram[addr] & 2) << 1) | ((ram[addr] & 4) >> 1); /* also convert the gfx as in Exerion */ - init_exerion(); + init_exerion(machine); } diff --git a/src/drivers/exprraid.c b/src/drivers/exprraid.c index 8dfd820ad..376b474ef 100644 --- a/src/drivers/exprraid.c +++ b/src/drivers/exprraid.c @@ -594,7 +594,7 @@ static DRIVER_INIT( exprraid ) rom[0xffff] = rom[0xfff2]; /* HACK!: Implement custom opcode as regular with a mapped io read */ - init_wexpress(); + init_wexpress(machine); } static DRIVER_INIT( wexpresb ) diff --git a/src/drivers/fantland.c b/src/drivers/fantland.c index 02e927e51..e4e829ff0 100644 --- a/src/drivers/fantland.c +++ b/src/drivers/fantland.c @@ -774,7 +774,7 @@ static MACHINE_RESET( borntofi ) { int voice; - machine_reset_fantland(); + machine_reset_fantland(machine); for (voice = 0; voice < 4; voice++) borntofi_adpcm_stop(voice); diff --git a/src/drivers/fcrash.c b/src/drivers/fcrash.c index 2a7b52f39..97f9d05e5 100644 --- a/src/drivers/fcrash.c +++ b/src/drivers/fcrash.c @@ -40,9 +40,11 @@ from 2.bin to 9.bin program eproms #include "cps1.h" /* in drivers/cps1.c */ -extern READ16_HANDLER( cps1_input_r ); -extern READ16_HANDLER( cps1_input2_r ); -extern READ16_HANDLER( cps1_input3_r ); +extern READ16_HANDLER( cps1_dsw_r ); +extern READ16_HANDLER( cps1_in0_r ); +extern READ16_HANDLER( cps1_in1_r ); +extern READ16_HANDLER( cps1_in2_r ); +extern READ16_HANDLER( cps1_in3_r ); extern WRITE16_HANDLER( cps1_coinctrl_w ); extern WRITE16_HANDLER( cps1_coinctrl2_w ); extern gfx_decode cps1_gfxdecodeinfo[]; @@ -186,6 +188,28 @@ VIDEO_UPDATE( fcrash ) return 0; } + +static ADDRESS_MAP_START( fcrash_readmem, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x1fffff) AM_READ(MRA16_ROM) /* 68000 ROM */ + AM_RANGE(0x880000, 0x880001) AM_READ(cps1_in1_r) /* Player input ports */ + AM_RANGE(0x880008, 0x880009) AM_READ(cps1_in0_r) /* System input ports */ + AM_RANGE(0x88000a, 0x88000f) AM_READ(cps1_dsw_r) /* Dip Switches */ + AM_RANGE(0x800100, 0x8001ff) AM_READ(cps1_output_r) /* Output ports */ + AM_RANGE(0x900000, 0x92ffff) AM_READ(MRA16_RAM) /* SF2CE executes code from here */ + AM_RANGE(0xf1c000, 0xf1c001) AM_READ(cps1_in2_r) + AM_RANGE(0xf1c002, 0xf1c003) AM_READ(cps1_in3_r) + AM_RANGE(0xff0000, 0xffffff) AM_READ(MRA16_RAM) /* RAM */ +ADDRESS_MAP_END + +static ADDRESS_MAP_START( fcrash_writemem, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x1fffff) AM_WRITE(MWA16_ROM) /* ROM */ + AM_RANGE(0x800030, 0x800031) AM_WRITE(cps1_coinctrl_w) + AM_RANGE(0x800100, 0x8001ff) AM_WRITE(cps1_output_w) AM_BASE(&cps1_output) AM_SIZE(&cps1_output_size) /* Output ports */ + AM_RANGE(0x900000, 0x92ffff) AM_WRITE(cps1_gfxram_w) AM_BASE(&cps1_gfxram) AM_SIZE(&cps1_gfxram_size) + AM_RANGE(0xff0000, 0xffffff) AM_WRITE(MWA16_RAM) /* RAM */ +ADDRESS_MAP_END + + #define CPS1_COINAGE_1 \ PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) \ PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) ) \ @@ -230,16 +254,16 @@ INPUT_PORTS_START( fcrash ) PORT_DIPNAME( 0x07, 0x04, "Difficulty Level 1" ) PORT_DIPSETTING( 0x07, DEF_STR( Easiest ) ) // "01" PORT_DIPSETTING( 0x06, DEF_STR( Easier ) ) // "02" - PORT_DIPSETTING( 0x05, DEF_STR( Easy ) ) // "03" + PORT_DIPSETTING( 0x05, DEF_STR( Easy ) ) // "03" PORT_DIPSETTING( 0x04, DEF_STR( Normal ) ) // "04" PORT_DIPSETTING( 0x03, DEF_STR( Medium ) ) // "05" - PORT_DIPSETTING( 0x02, DEF_STR( Hard ) ) // "06" + PORT_DIPSETTING( 0x02, DEF_STR( Hard ) ) // "06" PORT_DIPSETTING( 0x01, DEF_STR( Harder ) ) // "07" PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) // "08" PORT_DIPNAME( 0x18, 0x10, "Difficulty Level 2" ) - PORT_DIPSETTING( 0x18, DEF_STR( Easy ) ) // "01" + PORT_DIPSETTING( 0x18, DEF_STR( Easy ) ) // "01" PORT_DIPSETTING( 0x10, DEF_STR( Normal ) ) // "02" - PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) // "03" + PORT_DIPSETTING( 0x08, DEF_STR( Hard ) ) // "03" PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) // "04" PORT_DIPNAME( 0x60, 0x60, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x60, "100k" ) @@ -295,26 +319,6 @@ INPUT_PORTS_START( fcrash ) INPUT_PORTS_END -static ADDRESS_MAP_START( fcrash_readmem, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x1fffff) AM_READ(MRA16_ROM) /* 68000 ROM */ - AM_RANGE(0x880000, 0x880001) AM_READ(input_port_4_word_r) /* Player input ports */ - AM_RANGE(0x880008, 0x88000f) AM_READ(cps1_input_r) /* Input ports */ - AM_RANGE(0x800100, 0x8001ff) AM_READ(cps1_output_r) /* Output ports */ - AM_RANGE(0x900000, 0x92ffff) AM_READ(MRA16_RAM) /* SF2CE executes code from here */ - AM_RANGE(0xf1c000, 0xf1c001) AM_READ(cps1_input2_r) /* Player 3 controls (later games) */ - AM_RANGE(0xf1c002, 0xf1c003) AM_READ(cps1_input3_r) /* Player 4 controls (later games - muscle bombers) */ - AM_RANGE(0xff0000, 0xffffff) AM_READ(MRA16_RAM) /* RAM */ -ADDRESS_MAP_END - -static ADDRESS_MAP_START( fcrash_writemem, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x1fffff) AM_WRITE(MWA16_ROM) /* ROM */ - AM_RANGE(0x800030, 0x800031) AM_WRITE(cps1_coinctrl_w) - AM_RANGE(0x800100, 0x8001ff) AM_WRITE(cps1_output_w) AM_BASE(&cps1_output) AM_SIZE(&cps1_output_size) /* Output ports */ - AM_RANGE(0x900000, 0x92ffff) AM_WRITE(cps1_gfxram_w) AM_BASE(&cps1_gfxram) AM_SIZE(&cps1_gfxram_size) - AM_RANGE(0xff0000, 0xffffff) AM_WRITE(MWA16_RAM) /* RAM */ -ADDRESS_MAP_END - - static MACHINE_DRIVER_START( fcrash ) /* basic machine hardware */ diff --git a/src/drivers/fgoal.c b/src/drivers/fgoal.c index f92b6fdc1..ed7842158 100644 --- a/src/drivers/fgoal.c +++ b/src/drivers/fgoal.c @@ -71,18 +71,18 @@ static PALETTE_INIT( fgoal ) int g = (i >> 2) & 3; int b = (i >> 0) & 3; - palette_set_color(i, + palette_set_color(machine,i, intensity(r), intensity(g), intensity(b)); } - palette_set_color(0x40, + palette_set_color(machine,0x40, 0x2e, 0x80, 0x2e); - palette_set_color(0x41, + palette_set_color(machine,0x41, 0x2e, 0x2e, 0x2e); diff --git a/src/drivers/findout.c b/src/drivers/findout.c index b3a79725f..2d2d17fdd 100644 --- a/src/drivers/findout.c +++ b/src/drivers/findout.c @@ -1,5 +1,6 @@ /*************************************************************************** +Reel Fun (c) 1986 Find Out (c) 1987 Trivia (c) 1984 / 1986 Quiz (c) 1991 @@ -69,16 +70,26 @@ static READ8_HANDLER( portC_r ) static WRITE8_HANDLER( lamps_w ) { + /* 5 button lamps */ set_led_status(0,data & 0x01); set_led_status(1,data & 0x02); set_led_status(2,data & 0x04); set_led_status(3,data & 0x08); set_led_status(4,data & 0x10); + /* lamps 6, 7, 8 in gt507, may be hopper slide 1, 2, 3 ? */ + set_led_status(5,data & 0x20); + set_led_status(6,data & 0x40); + set_led_status(7,data & 0x80); } static WRITE8_HANDLER( sound_w ) { - /* bit 3 used but unknown */ + /* bit 3 enables coin lockout (lamp6 in test modes, set to lamp 10 as in getrivia.c) */ + coin_lockout_global_w(~data & 0x08); + set_led_status(9,data & 0x08); + + /* bit 5 enables ticket out in trivia games; remove this led if ticket dispenser is added */ + set_led_status(8,data & 0x20); /* bit 6 enables NMI */ interrupt_enable_w(0,data & 0x40); @@ -198,8 +209,80 @@ ADDRESS_MAP_END -INPUT_PORTS_START( findout ) +#define REELFUN_STANDARD_INPUT \ + PORT_START_TAG("IN0") \ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) \ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2) \ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) \ + PORT_SERVICE( 0x08, IP_ACTIVE_LOW ) \ + 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 /* IN1 */\ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("1 Left A-Z") \ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("2 Right A-Z") \ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("3 Select Letter") \ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("4 Start")\ + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_NAME("5 Solve Puzzle") \ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) \ + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) \ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + +#define TRIVIA_STANDARD_INPUT \ + PORT_START_TAG("IN0") \ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) \ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2) \ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) \ + PORT_SERVICE( 0x08, IP_ACTIVE_LOW ) \ + 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 /* IN1 */\ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) \ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) \ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) \ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) \ + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) \ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) \ + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) \ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + +INPUT_PORTS_START( reelfun ) PORT_START + PORT_DIPNAME( 0x07, 0x01, "Coinage Multiplier" ) + PORT_DIPSETTING( 0x07, "7" ) + PORT_DIPSETTING( 0x06, "6" ) + PORT_DIPSETTING( 0x05, "5" ) + PORT_DIPSETTING( 0x04, "4" ) + PORT_DIPSETTING( 0x03, "3" ) + PORT_DIPSETTING( 0x02, "2" ) + PORT_DIPSETTING( 0x01, "1" ) + PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Coinage ) ) + PORT_DIPSETTING( 0x08, "Credits per Coin" ) + PORT_DIPSETTING( 0x00, "Coins per Credit" ) + PORT_DIPNAME( 0x10, 0x10, "Screen" ) + PORT_DIPSETTING( 0x10, "Horizontal" ) + PORT_DIPSETTING( 0x00, "Vertical" ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + 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 ) ) + + REELFUN_STANDARD_INPUT +INPUT_PORTS_END + +INPUT_PORTS_START( findout ) + PORT_START /* DSW A */ PORT_DIPNAME( 0x07, 0x01, DEF_STR( Coinage ) ) PORT_DIPSETTING( 0x07, DEF_STR( 7C_1C ) ) PORT_DIPSETTING( 0x06, DEF_STR( 6C_1C ) ) @@ -225,30 +308,42 @@ INPUT_PORTS_START( findout ) PORT_DIPSETTING( 0x80, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_START - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_SERVICE( 0x08, IP_ACTIVE_LOW ) - 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 ) + REELFUN_STANDARD_INPUT +INPUT_PORTS_END - PORT_START - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_START( gt103 ) + PORT_START /* DSW A */ + PORT_DIPNAME( 0x07, 0x01, "Coinage Multiplier" ) + PORT_DIPSETTING( 0x07, "7" ) + PORT_DIPSETTING( 0x06, "6" ) + PORT_DIPSETTING( 0x05, "5" ) + PORT_DIPSETTING( 0x04, "4" ) + PORT_DIPSETTING( 0x03, "3" ) + PORT_DIPSETTING( 0x02, "2" ) + PORT_DIPSETTING( 0x01, "1" ) + PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Coinage ) ) + PORT_DIPSETTING( 0x08, "Credits per Coin" ) + PORT_DIPSETTING( 0x00, "Coins per Credit" ) + PORT_DIPNAME( 0x10, 0x10, "Screen" ) + PORT_DIPSETTING( 0x10, "Horizontal" ) + PORT_DIPSETTING( 0x00, "Vertical" ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + 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 ) ) + + TRIVIA_STANDARD_INPUT INPUT_PORTS_END -INPUT_PORTS_START( quiz ) - PORT_START - PORT_DIPNAME( 0x03, 0x03, "Questions" ) +INPUT_PORTS_START( gt103a ) + PORT_START_TAG ("DSWA") + PORT_DIPNAME( 0x03, 0x01, "Questions" ) PORT_DIPSETTING( 0x00, "4" ) PORT_DIPSETTING( 0x01, "5" ) // PORT_DIPSETTING( 0x02, "5" ) @@ -256,25 +351,27 @@ INPUT_PORTS_START( quiz ) PORT_DIPNAME( 0x04, 0x00, "Show Answer" ) PORT_DIPSETTING( 0x04, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - 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, "No Coin Counter" ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x00, "Max Coins" ) + PORT_DIPSETTING( 0x08, "30" ) + PORT_DIPSETTING( 0x00, "10" ) + PORT_DIPNAME( 0x10, 0x00, "Timeout" ) + PORT_DIPSETTING( 0x10, DEF_STR( No ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x20, 0x20, "Tickets" ) + PORT_DIPSETTING( 0x20, DEF_STR( No ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x40, 0x40, "No Coins" ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) /* if on, coin inputs are replaced by a 6th button to start games. */ + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) /* this is a feature of the PCB for private use. */ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) PORT_CONDITION("DSWA", 0x40, PORTCOND_EQUALS, 0x40) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_IMPULSE(2) PORT_CONDITION("DSWA", 0x40, PORTCOND_EQUALS, 0x00) PORT_NAME ("Start in no coins mode") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2) PORT_CONDITION("DSWA", 0x40, PORTCOND_EQUALS, 0x40) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSWA", 0x40, PORTCOND_EQUALS, 0x00) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_SERVICE( 0x08, IP_ACTIVE_LOW ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -282,7 +379,7 @@ INPUT_PORTS_START( quiz ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START + PORT_START /* IN1 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) @@ -293,6 +390,47 @@ INPUT_PORTS_START( quiz ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END +INPUT_PORTS_START( quiz ) + PORT_INCLUDE( gt103a ) + + PORT_MODIFY("IN0") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* no coin 2 */ +INPUT_PORTS_END + +INPUT_PORTS_START( gt507uk ) + PORT_START /* DSW A */ + PORT_DIPNAME( 0x01, 0x00, "If Ram Error" ) + PORT_DIPSETTING( 0x01, "Freeze" ) + PORT_DIPSETTING( 0x00, "Play" ) + PORT_DIPNAME( 0x0a, 0x08, "Payout" ) + PORT_DIPSETTING( 0x0a, "Bank" ) + PORT_DIPSETTING( 0x08, "N/A" ) + PORT_DIPSETTING( 0x02, "Credit" ) + PORT_DIPSETTING( 0x00, "Direct" ) + PORT_DIPNAME( 0x04, 0x04, "Payout Hardware" ) + PORT_DIPSETTING( 0x04, "Hopper" ) + PORT_DIPSETTING( 0x00, "Solenoid" ) + 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 ) ) + + TRIVIA_STANDARD_INPUT + PORT_MODIFY("IN0") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN3 ) PORT_IMPULSE(2) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2) /* coin 3, 2, 4 order verified in test mode */ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN4 ) PORT_IMPULSE(2) +INPUT_PORTS_END + + static MACHINE_DRIVER_START( findout ) @@ -331,6 +469,17 @@ MACHINE_DRIVER_END ***************************************************************************/ +ROM_START( reelfun ) /* v7.01 */ + ROM_REGION( 0x38000, REGION_CPU1, 0 ) + ROM_LOAD( "reelfun.cnt", 0x00000, 0x4000, CRC(d9d1e92b) SHA1(337f66a37b3734d565b3ff3d912e0f690fd7c445) ) + ROM_LOAD( "reelfun.prg", 0x08000, 0x2000, CRC(615d846a) SHA1(ffa1c47393f4f364aa34d14cf3ac2f56d9eaecb0) ) /* banked */ + ROM_LOAD( "reelfun-1-title", 0x10000, 0x8000, CRC(0e165fbc) SHA1(a3a5b7db72ab86efe973f649f5dfe5133830e3fc) ) /* banked ROMs for solution data */ + ROM_LOAD( "reelfun-2-place", 0x18000, 0x8000, CRC(a0066bfd) SHA1(b6f031ab50eb396be79e79e06f2101400683ec3e) ) + ROM_LOAD( "reelfun-3-phrase", 0x20000, 0x8000, CRC(199e36b0) SHA1(d9dfe39c9a4fca1169150f8941f8ebc499dfbaf5) ) + ROM_LOAD( "reelfun-4-person", 0x28000, 0x8000, CRC(49b0710b) SHA1(a38b3251bcb8683d43bdb903036970140a9735e6) ) + ROM_LOAD( "reelfun-5-song_title", 0x30000, 0x8000, CRC(cce01c45) SHA1(c484f5828928edf39335cedf21acab0b9e2a6881) ) +ROM_END + ROM_START( findout ) ROM_REGION( 0x38000, REGION_CPU1, 0 ) ROM_LOAD( "12.bin", 0x00000, 0x4000, CRC(21132d4c) SHA1(e3562ee2f46b3f022a852a0e0b1c8fb8164f64a3) ) @@ -481,30 +630,25 @@ ROM_START( quiz211 ) ROM_END /* - -When game is first run a RAM error will occur because the nvram needs initialising. - -gt507uk - Press F2 to get into test mode, then press control/fire1 to continue -gt103 - When RAM Error appears press F3 to reset and the game will start -gt103a - When ERROR appears, press F2, then F3 to reset, then F2 again and the game will start - +When games are first run a RAM error will occur because the nvram needs initialising. +When ERROR appears, press F2, then F3 to reset, then F2 again and the game will start */ -GAME( 1986, gt507uk, 0, findout, findout, 0, ROT0, "Grayhound Electronics", "Trivia (UK Version 5.07)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1986, gt103, 0, findout, findout, 0, ROT0, "Grayhound Electronics", "Trivia (Version 1.03)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1984, gt5, 0, findout, findout, 0, ROT0, "Grayhound Electronics", "Trivia (Version 5)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) +GAME( 1986, gt507uk, 0, findout, gt507uk, 0, ROT0, "Grayhound Electronics", "Trivia (UK Version 5.07)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1986, gt103, 0, findout, gt103, 0, ROT0, "Grayhound Electronics", "Trivia (Version 1.03)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1986, gt5, 0, findout, gt103a, 0, ROT0, "Grayhound Electronics", "Trivia (Version 5)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) -GAME( 1984, gt103a, 0, findout, findout, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1984, gt103a1, gt103a, findout, findout, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a) (alt 1)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1984, gt103a2, gt103a, findout, findout, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a) (alt 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1984, gt103a3, gt103a, findout, findout, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a) (alt 3)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1984, gt103aa, gt103a, findout, findout, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a Alt questions 1)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1984, gt103ab, gt103a, findout, findout, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a Alt questions 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1984, gt103asx, gt103a, findout, findout, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a Sex questions)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1984, gt103a, 0, findout, gt103a, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1984, gt103a1, gt103a, findout, gt103a, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a) (alt 1)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1984, gt103a2, gt103a, findout, gt103a, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a) (alt 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1984, gt103a3, gt103a, findout, gt103a, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a) (alt 3)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1984, gt103aa, gt103a, findout, gt103a, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a Alt questions 1)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1984, gt103ab, gt103a, findout, gt103a, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a Alt questions 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1984, gt103asx, gt103a, findout, gt103a, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.03a Sex questions)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) GAME( 1986, quiz, 0, findout, quiz, 0, ROT0, "Italian bootleg", "Quiz (Revision 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1986, reelfun, 0, findout, reelfun, 0, ROT0, "Grayhound Electronics", "Reel Fun (Version 7.01)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) GAME( 1987, findout, 0, findout, findout, 0, ROT0, "Elettronolo", "Find Out (Version 4.04)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1991, quiz211, 0, findout, quiz, 0, ROT0, "Elettronolo", "Quiz (Revision 2.1)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) - +GAME( 1991, quiz211, 0, findout, quiz, 0, ROT0, "Elettronolo", "Quiz (Revision 2.11)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) diff --git a/src/drivers/firetrk.c b/src/drivers/firetrk.c index c3e6cebcb..23ebc6fb8 100644 --- a/src/drivers/firetrk.c +++ b/src/drivers/firetrk.c @@ -253,10 +253,10 @@ static PALETTE_INIT( firetrk ) 3, 0, 0, 3 }; - palette_set_color(0, 0x00, 0x00, 0x00); - palette_set_color(1, 0x5b, 0x5b, 0x5b); - palette_set_color(2, 0xa4, 0xa4, 0xa4); - palette_set_color(3, 0xff, 0xff, 0xff); + palette_set_color(machine, 0, 0x00, 0x00, 0x00); + palette_set_color(machine, 1, 0x5b, 0x5b, 0x5b); + palette_set_color(machine, 2, 0xa4, 0xa4, 0xa4); + palette_set_color(machine, 3, 0xff, 0xff, 0xff); memcpy(colortable, colortable_source, sizeof(colortable_source)); } @@ -264,10 +264,7 @@ static PALETTE_INIT( firetrk ) static void prom_to_palette(int number, UINT8 val) { - palette_set_color(number, - (val & 4) ? 0xff : 0x00, - (val & 2) ? 0xff : 0x00, - (val & 1) ? 0xff : 0x00); + palette_set_color(Machine, number, pal1bit(val >> 2), pal1bit(val >> 1), pal1bit(val >> 0)); } @@ -341,8 +338,8 @@ static PALETTE_INIT( montecar ) prom_to_palette(number++, p[0x1C8]); prom_to_palette(number++, p[0x1CC]); - palette_set_color(number++, 0x00, 0x00, 0x00); - palette_set_color(number++, 0xff, 0xff, 0xff); + palette_set_color(machine, number++, 0x00, 0x00, 0x00); + palette_set_color(machine, number++, 0xff, 0xff, 0xff); memcpy(colortable, colortable_source, sizeof(colortable_source)); } diff --git a/src/drivers/flyball.c b/src/drivers/flyball.c index 88dd57d13..b23706812 100644 --- a/src/drivers/flyball.c +++ b/src/drivers/flyball.c @@ -250,10 +250,10 @@ static const gfx_decode flyball_gfx_decode_info[] = PALETTE_INIT( flyball ) { - palette_set_color(0, 0x3F, 0x3F, 0x3F); /* tiles, ball */ - palette_set_color(1, 0xFF, 0xFF, 0xFF); - palette_set_color(2, 0xFF ,0xFF, 0xFF); /* sprites */ - palette_set_color(3, 0x00, 0x00, 0x00); + palette_set_color(machine, 0, 0x3F, 0x3F, 0x3F); /* tiles, ball */ + palette_set_color(machine, 1, 0xFF, 0xFF, 0xFF); + palette_set_color(machine, 2, 0xFF ,0xFF, 0xFF); /* sprites */ + palette_set_color(machine, 3, 0x00, 0x00, 0x00); } diff --git a/src/drivers/funkybee.c b/src/drivers/funkybee.c index 4b0eaadcd..cf453256e 100644 --- a/src/drivers/funkybee.c +++ b/src/drivers/funkybee.c @@ -41,6 +41,39 @@ Known issues: * skylancr fires in the same spot regardless of player position when in cocktail mode. + +Stephh's notes (based on the games Z80 code and some tests) : + +1) 'funkybee' and clones + +1a) 'funkybee' + + - Possible "Lives" settings : 3, 4, 5 or 6 (code at 0x0501) + - Bonus life routine at 0x2d03 (test on DSW bit 6) + +1b) 'funkbeeb' + + - Removal of ORCA copyright on title screen (text at 0x0e9a). + However, high scores table remains unchanged. + - Bypass ROM check (code at 0x3ee3) + - Possible "Lives" settings : 1, 2, 3 or 4 (code at 0x0501) + - Bonus life routine at 0x2d03 (test on DSW bit 6) + +2) 'skylancr' and clones + +2a) 'skylancr' + + - Possible "Lives" settings : 1, 2, 3 or 4 (code at 0x0601) + - Bonus life routine at 0x1ef6 (test on DSW bit 5 !) + I can't tell if it's an ingame bug or if this was done on purpose, + but "Bonus Life" settings depend on the starting number of lives. + DSW bit 6 has no effect because of this. + +2a) 'skylance' + + - Possible "Lives" settings : 3, 4, 5 or 6 (code at 0x0601) + - Bonus life routine at 0x1f28 (test on DSW bit 6) + ***************************************************************************/ #include "driver.h" @@ -105,7 +138,7 @@ ADDRESS_MAP_END INPUT_PORTS_START( funkybee ) - PORT_START /* IN0 */ + PORT_START_TAG("IN0") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) @@ -114,7 +147,7 @@ INPUT_PORTS_START( funkybee ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START /* IN1 */ + PORT_START_TAG("IN1") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY @@ -122,7 +155,7 @@ INPUT_PORTS_START( funkybee ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START /* IN2 */ + PORT_START_TAG("IN2") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL @@ -130,7 +163,7 @@ INPUT_PORTS_START( funkybee ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START /* DSW */ + PORT_START_TAG("DSW") PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) @@ -146,66 +179,27 @@ INPUT_PORTS_START( funkybee ) PORT_DIPSETTING( 0x20, "4" ) PORT_DIPSETTING( 0x10, "5" ) PORT_DIPSETTING( 0x00, "6" ) - PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x40, "20000" ) + PORT_DIPSETTING( 0x00, DEF_STR( None ) ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) INPUT_PORTS_END -INPUT_PORTS_START( skylancr ) - PORT_START /* IN0 */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) - PORT_DIPNAME( 0x20, 0x20, "Freeze" ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - - PORT_START /* IN1 */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) +INPUT_PORTS_START( funkbeeb ) + PORT_INCLUDE(funkybee) - PORT_START /* IN2 */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - - PORT_START /* DSW */ - PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_6C ) ) - PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_B ) ) - PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) - PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x04, "1st 1C/1C - 2nd 1C/2C" ) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_6C ) ) - PORT_DIPNAME( 0x30, 0x10, DEF_STR( Lives ) ) + PORT_MODIFY("DSW") + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPSETTING( 0x30, "1" ) PORT_DIPSETTING( 0x20, "2" ) PORT_DIPSETTING( 0x10, "3" ) PORT_DIPSETTING( 0x00, "4" ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Bonus_Life ) ) - PORT_DIPSETTING( 0x40, "20000 50000" ) - PORT_DIPSETTING( 0x00, "40000 70000" ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) INPUT_PORTS_END -INPUT_PORTS_START( skylance ) - PORT_START /* IN0 */ +INPUT_PORTS_START( skylancr ) + PORT_START_TAG("IN0") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START1 ) @@ -214,7 +208,7 @@ INPUT_PORTS_START( skylance ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START /* IN1 */ + PORT_START_TAG("IN1") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY @@ -222,7 +216,7 @@ INPUT_PORTS_START( skylance ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START /* IN2 */ + PORT_START_TAG("IN2") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL @@ -230,7 +224,7 @@ INPUT_PORTS_START( skylance ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_BIT( 0xe0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START /* DSW */ + PORT_START_TAG("DSW") PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) ) PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) @@ -241,6 +235,23 @@ INPUT_PORTS_START( skylance ) PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x04, DEF_STR( 2C_3C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_6C ) ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) /* Also affects bonus life */ + PORT_DIPSETTING( 0x30, "1" ) /* Bonus life at 20000 and 50000 */ + PORT_DIPSETTING( 0x20, "2" ) /* Bonus life at 20000 and 50000 */ + PORT_DIPSETTING( 0x10, "3" ) /* Bonus life at 40000 and 70000 */ + PORT_DIPSETTING( 0x00, "4" ) /* Bonus life at 40000 and 70000 */ + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) +INPUT_PORTS_END + +INPUT_PORTS_START( skylance ) + PORT_INCLUDE(skylancr) + + PORT_MODIFY("DSW") PORT_DIPNAME( 0x30, 0x30, DEF_STR( Lives ) ) PORT_DIPSETTING( 0x30, "3" ) PORT_DIPSETTING( 0x20, "4" ) @@ -249,9 +260,6 @@ INPUT_PORTS_START( skylance ) PORT_DIPNAME( 0x40, 0x40, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x40, "20000 50000" ) PORT_DIPSETTING( 0x00, "40000 70000" ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Cabinet ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) INPUT_PORTS_END @@ -351,6 +359,26 @@ ROM_START( funkybee ) ROM_LOAD( "funkybee.clr", 0x0000, 0x0020, CRC(e2cf5fe2) SHA1(50b293f48f078cbcebccb045aa779ced2fb298c8) ) ROM_END +/* This is a bootleg of "Funky Bee", where ORCA copyright has been removed and difficulty is harder, + there are 2 lives less then in the original game + TODO: insert correct DIPSWITCH, where lives is "1,2,3,4" instead of "3,4,5,6" */ +ROM_START( funkbeeb ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ + ROM_LOAD( "senza_orca.fb1", 0x0000, 0x1000, CRC(7f2e7f85) SHA1(d4b63add3a97fc80aeafcd72a261302ab52d60a7) ) + ROM_LOAD( "funkybee.3", 0x1000, 0x1000, CRC(7bf7c62f) SHA1(f8e5514c17fddb8ed95e5e18aab81ad0ebcc41af) ) + ROM_LOAD( "funkybee.2", 0x2000, 0x1000, CRC(8cc0fe8e) SHA1(416d97db0a2219ea46f2caa55787253e16a5ef32) ) + ROM_LOAD( "senza_orca.fb4", 0x3000, 0x1000, CRC(53c2db3b) SHA1(0bda1eb87d7c41b67a5ff00b6675defdc8fe9274) ) + + ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "funkybee.5", 0x0000, 0x2000, CRC(86126655) SHA1(d91682121d7f6a70f10a946ab81b248cc29bdf8c) ) + + ROM_REGION( 0x2000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "funkybee.6", 0x0000, 0x2000, CRC(5fffd323) SHA1(9de9c869bd1e2daab3b94275444ecbe904bcd6aa) ) + + ROM_REGION( 0x0020, REGION_PROMS, 0 ) + ROM_LOAD( "funkybee.clr", 0x0000, 0x0020, CRC(e2cf5fe2) SHA1(50b293f48f078cbcebccb045aa779ced2fb298c8) ) +ROM_END + ROM_START( skylancr ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ ROM_LOAD( "1sl.5a", 0x0000, 0x2000, CRC(e80b315e) SHA1(0c02aa9f0d4bdfc3482c400d0e4e38fd3912a512) ) @@ -383,8 +411,7 @@ ROM_START( skylance ) ROM_LOAD( "18s030.1a", 0x0000, 0x0020, CRC(e645bacb) SHA1(5f4c299c4cf165fd229731c0e5799a34892bf28e) ) ROM_END - - -GAME( 1982, funkybee, 0, funkybee, funkybee, 0, ROT90, "Orca", "Funky Bee", 0 ) -GAME( 1983, skylancr, 0, funkybee, skylancr, 0, ROT90, "Orca", "Sky Lancer", 0 ) +GAME( 1982, funkybee, 0, funkybee, funkybee, 0, ROT90, "Orca", "Funky Bee", 0 ) +GAME( 1982, funkbeeb, funkybee, funkybee, funkybee, 0, ROT90, "bootleg", "Funky Bee (bootleg, harder)", 0 ) +GAME( 1983, skylancr, 0, funkybee, skylancr, 0, ROT90, "Orca", "Sky Lancer", 0 ) GAME( 1983, skylance, skylancr, funkybee, skylance, 0, ROT90, "Orca (Esco Trading Co license)", "Sky Lancer (Esco Trading Co license)", 0 ) diff --git a/src/drivers/fuukifg3.c b/src/drivers/fuukifg3.c index 6cce8c8c4..d144fd1bd 100644 --- a/src/drivers/fuukifg3.c +++ b/src/drivers/fuukifg3.c @@ -124,11 +124,7 @@ static WRITE32_HANDLER( paletteram32_xRRRRRGGGGGBBBBB_dword_w ) g = (paletteram32[offset] & 0x03e00000) >> (5+16); b = (paletteram32[offset] & 0x001f0000) >> (0+16); - b = b << 3; - r = r << 3; - g = g << 3; - - palette_set_color(offset*2,r,g,b); + palette_set_color(Machine,offset*2,pal5bit(r),pal5bit(g),pal5bit(b)); } if(ACCESSING_LSW32) @@ -140,11 +136,7 @@ static WRITE32_HANDLER( paletteram32_xRRRRRGGGGGBBBBB_dword_w ) g = (paletteram32[offset] & 0x000003e0) >> (5); b = (paletteram32[offset] & 0x0000001f) >> (0); - b = b << 3; - r = r << 3; - g = g << 3; - - palette_set_color(offset*2+1,r,g,b); + palette_set_color(Machine,offset*2+1,pal5bit(r),pal5bit(g),pal5bit(b)); } } diff --git a/src/drivers/gaiden.c b/src/drivers/gaiden.c index cbbfdc75e..b90e08da2 100644 --- a/src/drivers/gaiden.c +++ b/src/drivers/gaiden.c @@ -1063,159 +1063,214 @@ MACHINE_DRIVER_END ROM_START( shadoww ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) /* 2*128k for 68000 code */ - ROM_LOAD16_BYTE( "shadowa.1", 0x00000, 0x20000, CRC(8290d567) SHA1(1e2f80c1548c853ec1127e79438f62eda6592a07) ) - ROM_LOAD16_BYTE( "shadowa.2", 0x00001, 0x20000, CRC(f3f08921) SHA1(df6bb7302714e0eab12cbd0a7f2a4ca751a600e1) ) + ROM_LOAD16_BYTE( "shadowa_1.3s", 0x00000, 0x20000, CRC(8290d567) SHA1(1e2f80c1548c853ec1127e79438f62eda6592a07) ) + ROM_LOAD16_BYTE( "shadowa_2.4s", 0x00001, 0x20000, CRC(f3f08921) SHA1(df6bb7302714e0eab12cbd0a7f2a4ca751a600e1) ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */ - ROM_LOAD( "gaiden.3", 0x0000, 0x10000, CRC(75fd3e6a) SHA1(3333e84ed4983caa133e60a8e8895fa897ab4949) ) /* Audio CPU is a Z80 */ + ROM_LOAD( "gaiden_3.4b", 0x0000, 0x10000, CRC(75fd3e6a) SHA1(3333e84ed4983caa133e60a8e8895fa897ab4949) ) /* Audio CPU is a Z80 */ ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "gaiden.5", 0x000000, 0x10000, CRC(8d4035f7) SHA1(3473456cdd24e312e3073586d7e8f24eb71bbea1) ) /* 8x8 tiles */ + ROM_LOAD( "gaiden_5.7a", 0x000000, 0x10000, CRC(8d4035f7) SHA1(3473456cdd24e312e3073586d7e8f24eb71bbea1) ) /* 8x8 tiles */ ROM_REGION( 0x080000, REGION_GFX2, ROMREGION_DISPOSE ) - ROM_LOAD( "14.bin", 0x000000, 0x20000, CRC(1ecfddaa) SHA1(e71d60ae1a98fe8512498f91cce01c16be9f0871) ) - ROM_LOAD( "15.bin", 0x020000, 0x20000, CRC(1291a696) SHA1(023b05260214adc39bdba81d5e2aa246b6d74a6a) ) - ROM_LOAD( "16.bin", 0x040000, 0x20000, CRC(140b47ca) SHA1(6ffd9b7116658a46a124f9085602d88aa143d829) ) - ROM_LOAD( "17.bin", 0x060000, 0x20000, CRC(7638cccb) SHA1(780d47d3aa248346e0e7abc6e6284542e7392919) ) + ROM_LOAD( "14.3a", 0x000000, 0x20000, CRC(1ecfddaa) SHA1(e71d60ae1a98fe8512498f91cce01c16be9f0871) ) + ROM_LOAD( "15.3b", 0x020000, 0x20000, CRC(1291a696) SHA1(023b05260214adc39bdba81d5e2aa246b6d74a6a) ) + ROM_LOAD( "16.1a", 0x040000, 0x20000, CRC(140b47ca) SHA1(6ffd9b7116658a46a124f9085602d88aa143d829) ) + ROM_LOAD( "17.1b", 0x060000, 0x20000, CRC(7638cccb) SHA1(780d47d3aa248346e0e7abc6e6284542e7392919) ) ROM_REGION( 0x080000, REGION_GFX3, ROMREGION_DISPOSE ) - ROM_LOAD( "18.bin", 0x000000, 0x20000, CRC(3fadafd6) SHA1(0cb5387a354c631d5c6aca8f77ecbbc0d175a574) ) - ROM_LOAD( "19.bin", 0x020000, 0x20000, CRC(ddae9d5b) SHA1(108b202ae7ae124a32400a0a404c7d2b614c60bd) ) - ROM_LOAD( "20.bin", 0x040000, 0x20000, CRC(08cf7a93) SHA1(fd3278c3fb3ef30ed03c8a95656d86ba82a163d8) ) - ROM_LOAD( "21.bin", 0x060000, 0x20000, CRC(1ac892f5) SHA1(28364266ca9d1955fb7953f5c2d6f35e114beec6) ) + ROM_LOAD( "18.6a", 0x000000, 0x20000, CRC(3fadafd6) SHA1(0cb5387a354c631d5c6aca8f77ecbbc0d175a574) ) + ROM_LOAD( "19.6b", 0x020000, 0x20000, CRC(ddae9d5b) SHA1(108b202ae7ae124a32400a0a404c7d2b614c60bd) ) + ROM_LOAD( "20.4b", 0x040000, 0x20000, CRC(08cf7a93) SHA1(fd3278c3fb3ef30ed03c8a95656d86ba82a163d8) ) + ROM_LOAD( "21.4b", 0x060000, 0x20000, CRC(1ac892f5) SHA1(28364266ca9d1955fb7953f5c2d6f35e114beec6) ) ROM_REGION( 0x100000, REGION_GFX4, ROMREGION_DISPOSE ) - ROM_LOAD( "gaiden.6", 0x000000, 0x20000, CRC(e7ccdf9f) SHA1(80ffcefc95660471124898a9c2bee55df36bda13) ) /* sprites A1 */ - ROM_LOAD( "gaiden.8", 0x020000, 0x20000, CRC(7ef7f880) SHA1(26ba9a76adce24beea3cffa1cb95aeafe6f82f96) ) /* sprites B1 */ - ROM_LOAD( "gaiden.10", 0x040000, 0x20000, CRC(a6451dec) SHA1(553e7a1453b59055fa0b10ca04125543d9f8987c) ) /* sprites C1 */ - ROM_LOAD( "shadoww.12a", 0x060000, 0x10000, CRC(9bb07731) SHA1(b799b1958dc9b84797fdab2591e33bd5d28884a3) ) /* sprites D1 */ - ROM_LOAD( "shadoww.12b", 0x070000, 0x10000, CRC(a4a950a2) SHA1(9766b5e88edd16554e59179a37cca49d29f83367) ) /* sprites D1 */ - ROM_LOAD( "gaiden.7", 0x080000, 0x20000, CRC(016bec95) SHA1(6a6757c52ca9a2398ea43d1af4a8d5adde6f4cd2) ) /* sprites A2 */ - ROM_LOAD( "gaiden.9", 0x0a0000, 0x20000, CRC(6e9b7fd3) SHA1(c86ff61844fc94c02625bb812b9062d0649c8fdf) ) /* sprites B2 */ - ROM_LOAD( "gaiden.11", 0x0c0000, 0x20000, CRC(7fbfdf5e) SHA1(ab67b72dcadb5f2236d29de751de5bf890a9e423) ) /* sprites C2 */ - ROM_LOAD( "shadoww.13a", 0x0e0000, 0x10000, CRC(996d2fa5) SHA1(a32526949af3635914927ebbbe684c3de9562a9d) ) /* sprites D2 */ - ROM_LOAD( "shadoww.13b", 0x0f0000, 0x10000, CRC(b8df8a34) SHA1(6810f7961052a983b8c78b42d550038051012c6d) ) /* sprites D2 */ + /* Should all these roms be 0x10000 bytes on this board? */ + ROM_LOAD( "6.3m", 0x000000, 0x20000, CRC(e7ccdf9f) SHA1(80ffcefc95660471124898a9c2bee55df36bda13) ) /* sprites A1 */ + ROM_LOAD( "8.3n", 0x020000, 0x20000, CRC(7ef7f880) SHA1(26ba9a76adce24beea3cffa1cb95aeafe6f82f96) ) /* sprites B1 */ + ROM_LOAD( "10.3r", 0x040000, 0x20000, CRC(a6451dec) SHA1(553e7a1453b59055fa0b10ca04125543d9f8987c) ) /* sprites C1 */ + ROM_LOAD( "shadoww_12a.xx", 0x060000, 0x10000, CRC(9bb07731) SHA1(b799b1958dc9b84797fdab2591e33bd5d28884a3) ) /* sprites D1 */ + ROM_LOAD( "shadoww_12b.xx", 0x070000, 0x10000, CRC(a4a950a2) SHA1(9766b5e88edd16554e59179a37cca49d29f83367) ) /* sprites D1 */ + + ROM_LOAD( "7.1m", 0x080000, 0x20000, CRC(016bec95) SHA1(6a6757c52ca9a2398ea43d1af4a8d5adde6f4cd2) ) /* sprites A2 */ + ROM_LOAD( "9.1n", 0x0a0000, 0x20000, CRC(6e9b7fd3) SHA1(c86ff61844fc94c02625bb812b9062d0649c8fdf) ) /* sprites B2 */ + ROM_LOAD( "11.1r", 0x0c0000, 0x20000, CRC(7fbfdf5e) SHA1(ab67b72dcadb5f2236d29de751de5bf890a9e423) ) /* sprites C2 */ + ROM_LOAD( "shadoww_13a.xx", 0x0e0000, 0x10000, CRC(996d2fa5) SHA1(a32526949af3635914927ebbbe684c3de9562a9d) ) /* sprites D2 */ + ROM_LOAD( "shadoww_13b.xx", 0x0f0000, 0x10000, CRC(b8df8a34) SHA1(6810f7961052a983b8c78b42d550038051012c6d) ) /* sprites D2 */ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* 128k for ADPCM samples - sound chip is OKIM6295 */ - ROM_LOAD( "gaiden.4", 0x0000, 0x20000, CRC(b0e0faf9) SHA1(2275d2ef5eee356ccf80b9e9644d16fc30a4d107) ) /* samples */ + ROM_LOAD( "4.4a", 0x0000, 0x20000, CRC(b0e0faf9) SHA1(2275d2ef5eee356ccf80b9e9644d16fc30a4d107) ) /* samples */ ROM_END ROM_START( shadowwa ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) /* 2*128k for 68000 code */ - ROM_LOAD16_BYTE( "shadoww.1", 0x00000, 0x20000, CRC(fefba387) SHA1(20ce28da5877009494c3f3f67488bbe805d91340) ) - ROM_LOAD16_BYTE( "shadoww.2", 0x00001, 0x20000, CRC(9b9d6b18) SHA1(75068611fb1de61120be8bf840f61d90c0dc86ca) ) + ROM_LOAD16_BYTE( "shadoww_1.3s", 0x00000, 0x20000, CRC(fefba387) SHA1(20ce28da5877009494c3f3f67488bbe805d91340) ) + ROM_LOAD16_BYTE( "shadoww_2.4s", 0x00001, 0x20000, CRC(9b9d6b18) SHA1(75068611fb1de61120be8bf840f61d90c0dc86ca) ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */ - ROM_LOAD( "gaiden.3", 0x0000, 0x10000, CRC(75fd3e6a) SHA1(3333e84ed4983caa133e60a8e8895fa897ab4949) ) /* Audio CPU is a Z80 */ + ROM_LOAD( "gaiden_3.4b", 0x0000, 0x10000, CRC(75fd3e6a) SHA1(3333e84ed4983caa133e60a8e8895fa897ab4949) ) /* Audio CPU is a Z80 */ ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "gaiden.5", 0x000000, 0x10000, CRC(8d4035f7) SHA1(3473456cdd24e312e3073586d7e8f24eb71bbea1) ) /* 8x8 tiles */ + ROM_LOAD( "gaiden_5.7a", 0x000000, 0x10000, CRC(8d4035f7) SHA1(3473456cdd24e312e3073586d7e8f24eb71bbea1) ) /* 8x8 tiles */ ROM_REGION( 0x080000, REGION_GFX2, ROMREGION_DISPOSE ) - ROM_LOAD( "14.bin", 0x000000, 0x20000, CRC(1ecfddaa) SHA1(e71d60ae1a98fe8512498f91cce01c16be9f0871) ) - ROM_LOAD( "15.bin", 0x020000, 0x20000, CRC(1291a696) SHA1(023b05260214adc39bdba81d5e2aa246b6d74a6a) ) - ROM_LOAD( "16.bin", 0x040000, 0x20000, CRC(140b47ca) SHA1(6ffd9b7116658a46a124f9085602d88aa143d829) ) - ROM_LOAD( "17.bin", 0x060000, 0x20000, CRC(7638cccb) SHA1(780d47d3aa248346e0e7abc6e6284542e7392919) ) + ROM_LOAD( "14.3a", 0x000000, 0x20000, CRC(1ecfddaa) SHA1(e71d60ae1a98fe8512498f91cce01c16be9f0871) ) + ROM_LOAD( "15.3b", 0x020000, 0x20000, CRC(1291a696) SHA1(023b05260214adc39bdba81d5e2aa246b6d74a6a) ) + ROM_LOAD( "16.1a", 0x040000, 0x20000, CRC(140b47ca) SHA1(6ffd9b7116658a46a124f9085602d88aa143d829) ) + ROM_LOAD( "17.1b", 0x060000, 0x20000, CRC(7638cccb) SHA1(780d47d3aa248346e0e7abc6e6284542e7392919) ) ROM_REGION( 0x080000, REGION_GFX3, ROMREGION_DISPOSE ) - ROM_LOAD( "18.bin", 0x000000, 0x20000, CRC(3fadafd6) SHA1(0cb5387a354c631d5c6aca8f77ecbbc0d175a574) ) - ROM_LOAD( "19.bin", 0x020000, 0x20000, CRC(ddae9d5b) SHA1(108b202ae7ae124a32400a0a404c7d2b614c60bd) ) - ROM_LOAD( "20.bin", 0x040000, 0x20000, CRC(08cf7a93) SHA1(fd3278c3fb3ef30ed03c8a95656d86ba82a163d8) ) - ROM_LOAD( "21.bin", 0x060000, 0x20000, CRC(1ac892f5) SHA1(28364266ca9d1955fb7953f5c2d6f35e114beec6) ) + ROM_LOAD( "18.6a", 0x000000, 0x20000, CRC(3fadafd6) SHA1(0cb5387a354c631d5c6aca8f77ecbbc0d175a574) ) + ROM_LOAD( "19.6b", 0x020000, 0x20000, CRC(ddae9d5b) SHA1(108b202ae7ae124a32400a0a404c7d2b614c60bd) ) + ROM_LOAD( "20.4b", 0x040000, 0x20000, CRC(08cf7a93) SHA1(fd3278c3fb3ef30ed03c8a95656d86ba82a163d8) ) + ROM_LOAD( "21.4b", 0x060000, 0x20000, CRC(1ac892f5) SHA1(28364266ca9d1955fb7953f5c2d6f35e114beec6) ) ROM_REGION( 0x100000, REGION_GFX4, ROMREGION_DISPOSE ) - ROM_LOAD( "gaiden.6", 0x000000, 0x20000, CRC(e7ccdf9f) SHA1(80ffcefc95660471124898a9c2bee55df36bda13) ) /* sprites A1 */ - ROM_LOAD( "gaiden.8", 0x020000, 0x20000, CRC(7ef7f880) SHA1(26ba9a76adce24beea3cffa1cb95aeafe6f82f96) ) /* sprites B1 */ - ROM_LOAD( "gaiden.10", 0x040000, 0x20000, CRC(a6451dec) SHA1(553e7a1453b59055fa0b10ca04125543d9f8987c) ) /* sprites C1 */ - ROM_LOAD( "shadoww.12a", 0x060000, 0x10000, CRC(9bb07731) SHA1(b799b1958dc9b84797fdab2591e33bd5d28884a3) ) /* sprites D1 */ - ROM_LOAD( "shadoww.12b", 0x070000, 0x10000, CRC(a4a950a2) SHA1(9766b5e88edd16554e59179a37cca49d29f83367) ) /* sprites D1 */ - ROM_LOAD( "gaiden.7", 0x080000, 0x20000, CRC(016bec95) SHA1(6a6757c52ca9a2398ea43d1af4a8d5adde6f4cd2) ) /* sprites A2 */ - ROM_LOAD( "gaiden.9", 0x0a0000, 0x20000, CRC(6e9b7fd3) SHA1(c86ff61844fc94c02625bb812b9062d0649c8fdf) ) /* sprites B2 */ - ROM_LOAD( "gaiden.11", 0x0c0000, 0x20000, CRC(7fbfdf5e) SHA1(ab67b72dcadb5f2236d29de751de5bf890a9e423) ) /* sprites C2 */ - ROM_LOAD( "shadoww.13a", 0x0e0000, 0x10000, CRC(996d2fa5) SHA1(a32526949af3635914927ebbbe684c3de9562a9d) ) /* sprites D2 */ - ROM_LOAD( "shadoww.13b", 0x0f0000, 0x10000, CRC(b8df8a34) SHA1(6810f7961052a983b8c78b42d550038051012c6d) ) /* sprites D2 */ + /* Should all these roms be 0x10000 bytes on this board? */ + ROM_LOAD( "6.3m", 0x000000, 0x20000, CRC(e7ccdf9f) SHA1(80ffcefc95660471124898a9c2bee55df36bda13) ) /* sprites A1 */ + ROM_LOAD( "8.3n", 0x020000, 0x20000, CRC(7ef7f880) SHA1(26ba9a76adce24beea3cffa1cb95aeafe6f82f96) ) /* sprites B1 */ + ROM_LOAD( "10.3r", 0x040000, 0x20000, CRC(a6451dec) SHA1(553e7a1453b59055fa0b10ca04125543d9f8987c) ) /* sprites C1 */ + ROM_LOAD( "shadoww_12a.xx", 0x060000, 0x10000, CRC(9bb07731) SHA1(b799b1958dc9b84797fdab2591e33bd5d28884a3) ) /* sprites D1 */ + ROM_LOAD( "shadoww_12b.xx", 0x070000, 0x10000, CRC(a4a950a2) SHA1(9766b5e88edd16554e59179a37cca49d29f83367) ) /* sprites D1 */ + + ROM_LOAD( "7.1m", 0x080000, 0x20000, CRC(016bec95) SHA1(6a6757c52ca9a2398ea43d1af4a8d5adde6f4cd2) ) /* sprites A2 */ + ROM_LOAD( "9.1n", 0x0a0000, 0x20000, CRC(6e9b7fd3) SHA1(c86ff61844fc94c02625bb812b9062d0649c8fdf) ) /* sprites B2 */ + ROM_LOAD( "11.1r", 0x0c0000, 0x20000, CRC(7fbfdf5e) SHA1(ab67b72dcadb5f2236d29de751de5bf890a9e423) ) /* sprites C2 */ + ROM_LOAD( "shadoww_13a.xx", 0x0e0000, 0x10000, CRC(996d2fa5) SHA1(a32526949af3635914927ebbbe684c3de9562a9d) ) /* sprites D2 */ + ROM_LOAD( "shadoww_13b.xx", 0x0f0000, 0x10000, CRC(b8df8a34) SHA1(6810f7961052a983b8c78b42d550038051012c6d) ) /* sprites D2 */ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* 128k for ADPCM samples - sound chip is OKIM6295 */ - ROM_LOAD( "gaiden.4", 0x0000, 0x20000, CRC(b0e0faf9) SHA1(2275d2ef5eee356ccf80b9e9644d16fc30a4d107) ) /* samples */ + ROM_LOAD( "4.4a", 0x0000, 0x20000, CRC(b0e0faf9) SHA1(2275d2ef5eee356ccf80b9e9644d16fc30a4d107) ) /* samples */ ROM_END ROM_START( gaiden ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) /* 2*128k for 68000 code */ - ROM_LOAD16_BYTE( "gaiden.1", 0x00000, 0x20000, CRC(e037ff7c) SHA1(5418bcb80d4c52f05e3c26668193452fd51f1283) ) - ROM_LOAD16_BYTE( "gaiden.2", 0x00001, 0x20000, CRC(454f7314) SHA1(231296423870f00ea2e545faf0fbb37577430a4f) ) + ROM_LOAD16_BYTE( "gaiden_1.3s", 0x00000, 0x20000, CRC(e037ff7c) SHA1(5418bcb80d4c52f05e3c26668193452fd51f1283) ) + ROM_LOAD16_BYTE( "gaiden_2.4s", 0x00001, 0x20000, CRC(454f7314) SHA1(231296423870f00ea2e545faf0fbb37577430a4f) ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */ - ROM_LOAD( "gaiden.3", 0x0000, 0x10000, CRC(75fd3e6a) SHA1(3333e84ed4983caa133e60a8e8895fa897ab4949) ) /* Audio CPU is a Z80 */ + ROM_LOAD( "gaiden_3.4b", 0x0000, 0x10000, CRC(75fd3e6a) SHA1(3333e84ed4983caa133e60a8e8895fa897ab4949) ) /* Audio CPU is a Z80 */ ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "gaiden.5", 0x000000, 0x10000, CRC(8d4035f7) SHA1(3473456cdd24e312e3073586d7e8f24eb71bbea1) ) /* 8x8 tiles */ + ROM_LOAD( "gaiden_5.7a", 0x000000, 0x10000, CRC(8d4035f7) SHA1(3473456cdd24e312e3073586d7e8f24eb71bbea1) ) /* 8x8 tiles */ ROM_REGION( 0x080000, REGION_GFX2, ROMREGION_DISPOSE ) - ROM_LOAD( "14.bin", 0x000000, 0x20000, CRC(1ecfddaa) SHA1(e71d60ae1a98fe8512498f91cce01c16be9f0871) ) - ROM_LOAD( "15.bin", 0x020000, 0x20000, CRC(1291a696) SHA1(023b05260214adc39bdba81d5e2aa246b6d74a6a) ) - ROM_LOAD( "16.bin", 0x040000, 0x20000, CRC(140b47ca) SHA1(6ffd9b7116658a46a124f9085602d88aa143d829) ) - ROM_LOAD( "17.bin", 0x060000, 0x20000, CRC(7638cccb) SHA1(780d47d3aa248346e0e7abc6e6284542e7392919) ) + ROM_LOAD( "14.3a", 0x000000, 0x20000, CRC(1ecfddaa) SHA1(e71d60ae1a98fe8512498f91cce01c16be9f0871) ) + ROM_LOAD( "15.3b", 0x020000, 0x20000, CRC(1291a696) SHA1(023b05260214adc39bdba81d5e2aa246b6d74a6a) ) + ROM_LOAD( "16.1a", 0x040000, 0x20000, CRC(140b47ca) SHA1(6ffd9b7116658a46a124f9085602d88aa143d829) ) + ROM_LOAD( "17.1b", 0x060000, 0x20000, CRC(7638cccb) SHA1(780d47d3aa248346e0e7abc6e6284542e7392919) ) ROM_REGION( 0x080000, REGION_GFX3, ROMREGION_DISPOSE ) - ROM_LOAD( "18.bin", 0x000000, 0x20000, CRC(3fadafd6) SHA1(0cb5387a354c631d5c6aca8f77ecbbc0d175a574) ) - ROM_LOAD( "19.bin", 0x020000, 0x20000, CRC(ddae9d5b) SHA1(108b202ae7ae124a32400a0a404c7d2b614c60bd) ) - ROM_LOAD( "20.bin", 0x040000, 0x20000, CRC(08cf7a93) SHA1(fd3278c3fb3ef30ed03c8a95656d86ba82a163d8) ) - ROM_LOAD( "21.bin", 0x060000, 0x20000, CRC(1ac892f5) SHA1(28364266ca9d1955fb7953f5c2d6f35e114beec6) ) + ROM_LOAD( "18.6a", 0x000000, 0x20000, CRC(3fadafd6) SHA1(0cb5387a354c631d5c6aca8f77ecbbc0d175a574) ) + ROM_LOAD( "19.6b", 0x020000, 0x20000, CRC(ddae9d5b) SHA1(108b202ae7ae124a32400a0a404c7d2b614c60bd) ) + ROM_LOAD( "20.4b", 0x040000, 0x20000, CRC(08cf7a93) SHA1(fd3278c3fb3ef30ed03c8a95656d86ba82a163d8) ) + ROM_LOAD( "21.4b", 0x060000, 0x20000, CRC(1ac892f5) SHA1(28364266ca9d1955fb7953f5c2d6f35e114beec6) ) ROM_REGION( 0x100000, REGION_GFX4, ROMREGION_DISPOSE ) - ROM_LOAD( "gaiden.6", 0x000000, 0x20000, CRC(e7ccdf9f) SHA1(80ffcefc95660471124898a9c2bee55df36bda13) ) /* sprites A1 */ - ROM_LOAD( "gaiden.8", 0x020000, 0x20000, CRC(7ef7f880) SHA1(26ba9a76adce24beea3cffa1cb95aeafe6f82f96) ) /* sprites B1 */ - ROM_LOAD( "gaiden.10", 0x040000, 0x20000, CRC(a6451dec) SHA1(553e7a1453b59055fa0b10ca04125543d9f8987c) ) /* sprites C1 */ - ROM_LOAD( "gaiden.12", 0x060000, 0x20000, CRC(90f1e13a) SHA1(3fe9fe62aa9e92c871c791a3b11f96c9a48099a9) ) /* sprites D1 */ - ROM_LOAD( "gaiden.7", 0x080000, 0x20000, CRC(016bec95) SHA1(6a6757c52ca9a2398ea43d1af4a8d5adde6f4cd2) ) /* sprites A2 */ - ROM_LOAD( "gaiden.9", 0x0a0000, 0x20000, CRC(6e9b7fd3) SHA1(c86ff61844fc94c02625bb812b9062d0649c8fdf) ) /* sprites B2 */ - ROM_LOAD( "gaiden.11", 0x0c0000, 0x20000, CRC(7fbfdf5e) SHA1(ab67b72dcadb5f2236d29de751de5bf890a9e423) ) /* sprites C2 */ - ROM_LOAD( "gaiden.13", 0x0e0000, 0x20000, CRC(7d9f5c5e) SHA1(200102532ea9a88c7c708e03f8893c46dff827d1) ) /* sprites D2 */ + ROM_LOAD( "6.3m", 0x000000, 0x20000, CRC(e7ccdf9f) SHA1(80ffcefc95660471124898a9c2bee55df36bda13) ) /* sprites A1 */ + ROM_LOAD( "8.3n", 0x020000, 0x20000, CRC(7ef7f880) SHA1(26ba9a76adce24beea3cffa1cb95aeafe6f82f96) ) /* sprites B1 */ + ROM_LOAD( "10.3r", 0x040000, 0x20000, CRC(a6451dec) SHA1(553e7a1453b59055fa0b10ca04125543d9f8987c) ) /* sprites C1 */ + ROM_LOAD( "gaiden_12.3s", 0x060000, 0x20000, CRC(90f1e13a) SHA1(3fe9fe62aa9e92c871c791a3b11f96c9a48099a9) ) /* sprites D1 */ + + ROM_LOAD( "7.1m", 0x080000, 0x20000, CRC(016bec95) SHA1(6a6757c52ca9a2398ea43d1af4a8d5adde6f4cd2) ) /* sprites A2 */ + ROM_LOAD( "9.1n", 0x0a0000, 0x20000, CRC(6e9b7fd3) SHA1(c86ff61844fc94c02625bb812b9062d0649c8fdf) ) /* sprites B2 */ + ROM_LOAD( "11.1r", 0x0c0000, 0x20000, CRC(7fbfdf5e) SHA1(ab67b72dcadb5f2236d29de751de5bf890a9e423) ) /* sprites C2 */ + ROM_LOAD( "gaiden_13.1s", 0x0e0000, 0x20000, CRC(7d9f5c5e) SHA1(200102532ea9a88c7c708e03f8893c46dff827d1) ) /* sprites D2 */ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* 128k for ADPCM samples - sound chip is OKIM6295 */ - ROM_LOAD( "gaiden.4", 0x0000, 0x20000, CRC(b0e0faf9) SHA1(2275d2ef5eee356ccf80b9e9644d16fc30a4d107) ) /* samples */ + ROM_LOAD( "4.4a", 0x0000, 0x20000, CRC(b0e0faf9) SHA1(2275d2ef5eee356ccf80b9e9644d16fc30a4d107) ) /* samples */ ROM_END ROM_START( ryukendn ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) /* 2*128k for 68000 code */ - ROM_LOAD16_BYTE( "ryukendn.1", 0x00000, 0x20000, CRC(6203a5e2) SHA1(8cfe05c483a351e938b067ffa642d515e28605a3) ) - ROM_LOAD16_BYTE( "ryukendn.2", 0x00001, 0x20000, CRC(9e99f522) SHA1(b2277d8934b5e6e2f556aee5092f5d1050774a34) ) + ROM_LOAD16_BYTE( "ryukendn_1.3s", 0x00000, 0x20000, CRC(6203a5e2) SHA1(8cfe05c483a351e938b067ffa642d515e28605a3) ) + ROM_LOAD16_BYTE( "ryukendn_2.4s", 0x00001, 0x20000, CRC(9e99f522) SHA1(b2277d8934b5e6e2f556aee5092f5d1050774a34) ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */ - ROM_LOAD( "ryukendn.3", 0x0000, 0x10000, CRC(6b686b69) SHA1(f0fa553acb3945f8dbbf466073c8bae35a0375ef) ) /* Audio CPU is a Z80 */ + ROM_LOAD( "3.4b", 0x0000, 0x10000, CRC(6b686b69) SHA1(f0fa553acb3945f8dbbf466073c8bae35a0375ef) ) /* Audio CPU is a Z80 */ ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "ryukendn.5", 0x000000, 0x10000, CRC(765e7baa) SHA1(4d0a50f091b284739b6d9a8ceb4f81999da445fc) ) /* 8x8 tiles */ + ROM_LOAD( "hn27512p.7a", 0x000000, 0x10000, CRC(765e7baa) SHA1(4d0a50f091b284739b6d9a8ceb4f81999da445fc) ) /* 8x8 tiles */ ROM_REGION( 0x080000, REGION_GFX2, ROMREGION_DISPOSE ) - ROM_LOAD( "14.bin", 0x000000, 0x20000, CRC(1ecfddaa) SHA1(e71d60ae1a98fe8512498f91cce01c16be9f0871) ) - ROM_LOAD( "15.bin", 0x020000, 0x20000, CRC(1291a696) SHA1(023b05260214adc39bdba81d5e2aa246b6d74a6a) ) - ROM_LOAD( "16.bin", 0x040000, 0x20000, CRC(140b47ca) SHA1(6ffd9b7116658a46a124f9085602d88aa143d829) ) - ROM_LOAD( "17.bin", 0x060000, 0x20000, CRC(7638cccb) SHA1(780d47d3aa248346e0e7abc6e6284542e7392919) ) + ROM_LOAD( "14.3a", 0x000000, 0x20000, CRC(1ecfddaa) SHA1(e71d60ae1a98fe8512498f91cce01c16be9f0871) ) + ROM_LOAD( "15.3b", 0x020000, 0x20000, CRC(1291a696) SHA1(023b05260214adc39bdba81d5e2aa246b6d74a6a) ) + ROM_LOAD( "16.1a", 0x040000, 0x20000, CRC(140b47ca) SHA1(6ffd9b7116658a46a124f9085602d88aa143d829) ) + ROM_LOAD( "17.1b", 0x060000, 0x20000, CRC(7638cccb) SHA1(780d47d3aa248346e0e7abc6e6284542e7392919) ) ROM_REGION( 0x080000, REGION_GFX3, ROMREGION_DISPOSE ) - ROM_LOAD( "18.bin", 0x000000, 0x20000, CRC(3fadafd6) SHA1(0cb5387a354c631d5c6aca8f77ecbbc0d175a574) ) - ROM_LOAD( "19.bin", 0x020000, 0x20000, CRC(ddae9d5b) SHA1(108b202ae7ae124a32400a0a404c7d2b614c60bd) ) - ROM_LOAD( "20.bin", 0x040000, 0x20000, CRC(08cf7a93) SHA1(fd3278c3fb3ef30ed03c8a95656d86ba82a163d8) ) - ROM_LOAD( "21.bin", 0x060000, 0x20000, CRC(1ac892f5) SHA1(28364266ca9d1955fb7953f5c2d6f35e114beec6) ) + ROM_LOAD( "18.6a", 0x000000, 0x20000, CRC(3fadafd6) SHA1(0cb5387a354c631d5c6aca8f77ecbbc0d175a574) ) + ROM_LOAD( "19.6b", 0x020000, 0x20000, CRC(ddae9d5b) SHA1(108b202ae7ae124a32400a0a404c7d2b614c60bd) ) + ROM_LOAD( "20.4b", 0x040000, 0x20000, CRC(08cf7a93) SHA1(fd3278c3fb3ef30ed03c8a95656d86ba82a163d8) ) + ROM_LOAD( "21.4b", 0x060000, 0x20000, CRC(1ac892f5) SHA1(28364266ca9d1955fb7953f5c2d6f35e114beec6) ) ROM_REGION( 0x100000, REGION_GFX4, ROMREGION_DISPOSE ) - ROM_LOAD( "gaiden.6", 0x000000, 0x20000, CRC(e7ccdf9f) SHA1(80ffcefc95660471124898a9c2bee55df36bda13) ) /* sprites A1 */ - ROM_LOAD( "gaiden.8", 0x020000, 0x20000, CRC(7ef7f880) SHA1(26ba9a76adce24beea3cffa1cb95aeafe6f82f96) ) /* sprites B1 */ - ROM_LOAD( "gaiden.10", 0x040000, 0x20000, CRC(a6451dec) SHA1(553e7a1453b59055fa0b10ca04125543d9f8987c) ) /* sprites C1 */ - ROM_LOAD( "shadoww.12a", 0x060000, 0x10000, CRC(9bb07731) SHA1(b799b1958dc9b84797fdab2591e33bd5d28884a3) ) /* sprites D1 */ - ROM_LOAD( "ryukendn.12b", 0x070000, 0x10000, CRC(1773628a) SHA1(e7eacc880f2a4174f17b263bedf8c1bc64007dbd) ) /* sprites D1 */ - ROM_LOAD( "gaiden.7", 0x080000, 0x20000, CRC(016bec95) SHA1(6a6757c52ca9a2398ea43d1af4a8d5adde6f4cd2) ) /* sprites A2 */ - ROM_LOAD( "ryukendn.9a", 0x0a0000, 0x10000, CRC(c821e200) SHA1(5867e5055e16c8739d7699ede5e4a708e4c48895) ) /* sprites B2 */ - ROM_LOAD( "ryukendn.9b", 0x0b0000, 0x10000, CRC(6a6233b3) SHA1(21b8693335496b851628e6b62c6012e6624d13bf) ) /* sprites B2 */ - ROM_LOAD( "gaiden.11", 0x0c0000, 0x20000, CRC(7fbfdf5e) SHA1(ab67b72dcadb5f2236d29de751de5bf890a9e423) ) /* sprites C2 */ - ROM_LOAD( "shadoww.13a", 0x0e0000, 0x10000, CRC(996d2fa5) SHA1(a32526949af3635914927ebbbe684c3de9562a9d) ) /* sprites D2 */ - ROM_LOAD( "ryukendn.13b", 0x0f0000, 0x10000, CRC(1f43c507) SHA1(29f655442c16677855073284c7ab41059c99c497) ) /* sprites D2 */ + /* Should all these roms be 0x10000 bytes on this board? */ + ROM_LOAD( "6.3m", 0x000000, 0x20000, CRC(e7ccdf9f) SHA1(80ffcefc95660471124898a9c2bee55df36bda13) ) /* sprites A1 */ + ROM_LOAD( "8.3n", 0x020000, 0x20000, CRC(7ef7f880) SHA1(26ba9a76adce24beea3cffa1cb95aeafe6f82f96) ) /* sprites B1 */ + ROM_LOAD( "10.3r", 0x040000, 0x20000, CRC(a6451dec) SHA1(553e7a1453b59055fa0b10ca04125543d9f8987c) ) /* sprites C1 */ + ROM_LOAD( "shadoww_12a.xx", 0x060000, 0x10000, CRC(9bb07731) SHA1(b799b1958dc9b84797fdab2591e33bd5d28884a3) ) /* sprites D1 */ + ROM_LOAD( "ryukendn_12b.xx", 0x070000, 0x10000, CRC(1773628a) SHA1(e7eacc880f2a4174f17b263bedf8c1bc64007dbd) ) /* sprites D1 */ + + ROM_LOAD( "7.1m", 0x080000, 0x20000, CRC(016bec95) SHA1(6a6757c52ca9a2398ea43d1af4a8d5adde6f4cd2) ) /* sprites A2 */ + ROM_LOAD( "9.1n", 0x0a0000, 0x20000, CRC(6e9b7fd3) SHA1(c86ff61844fc94c02625bb812b9062d0649c8fdf) ) /* sprites B2 */ + ROM_LOAD( "11.1r", 0x0c0000, 0x20000, CRC(7fbfdf5e) SHA1(ab67b72dcadb5f2236d29de751de5bf890a9e423) ) /* sprites C2 */ + ROM_LOAD( "shadoww_13a.xx", 0x0e0000, 0x10000, CRC(996d2fa5) SHA1(a32526949af3635914927ebbbe684c3de9562a9d) ) /* sprites D2 */ + ROM_LOAD( "ryukendn_13b.xx", 0x0f0000, 0x10000, CRC(1f43c507) SHA1(29f655442c16677855073284c7ab41059c99c497) ) /* sprites D2 */ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* 128k for ADPCM samples - sound chip is OKIM6295 */ - ROM_LOAD( "gaiden.4", 0x0000, 0x20000, CRC(b0e0faf9) SHA1(2275d2ef5eee356ccf80b9e9644d16fc30a4d107) ) /* samples */ + ROM_LOAD( "4.4a", 0x0000, 0x20000, CRC(b0e0faf9) SHA1(2275d2ef5eee356ccf80b9e9644d16fc30a4d107) ) /* samples */ ROM_END +/* + +Ninja Ryukenden (Japan) (Tecmo 1989) +Dumped from an original Tecmo board. Board No. 6215-A. Serial A-59488. + +------------------------------------------------------------------------------------- + +*/ + +ROM_START( ryukenda ) + ROM_REGION( 0x40000, REGION_CPU1, 0 ) /* 2*128k for 68000 code */ + ROM_LOAD16_BYTE( "1.3s", 0x00000, 0x20000, CRC(0ed5464c) SHA1(2eab6650ad1c38cd560ec3d084f47156756c97a4) ) + ROM_LOAD16_BYTE( "2.4s", 0x00001, 0x20000, CRC(a93a8256) SHA1(6bf6c189f82cb9341d3427a822de83cbaed27bc0) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */ + ROM_LOAD( "3.4b", 0x0000, 0x10000, CRC(6b686b69) SHA1(f0fa553acb3945f8dbbf466073c8bae35a0375ef) ) /* Audio CPU is a Z80 */ + + ROM_REGION( 0x010000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "hn27512p.7a", 0x000000, 0x10000, CRC(765e7baa) SHA1(4d0a50f091b284739b6d9a8ceb4f81999da445fc) ) /* 8x8 tiles */ + + ROM_REGION( 0x080000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "14.3a", 0x000000, 0x20000, CRC(1ecfddaa) SHA1(e71d60ae1a98fe8512498f91cce01c16be9f0871) ) + ROM_LOAD( "15.3b", 0x020000, 0x20000, CRC(1291a696) SHA1(023b05260214adc39bdba81d5e2aa246b6d74a6a) ) + ROM_LOAD( "16.1a", 0x040000, 0x20000, CRC(140b47ca) SHA1(6ffd9b7116658a46a124f9085602d88aa143d829) ) + ROM_LOAD( "17.1b", 0x060000, 0x20000, CRC(7638cccb) SHA1(780d47d3aa248346e0e7abc6e6284542e7392919) ) + + ROM_REGION( 0x080000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD( "18.6a", 0x000000, 0x20000, CRC(3fadafd6) SHA1(0cb5387a354c631d5c6aca8f77ecbbc0d175a574) ) + ROM_LOAD( "19.6b", 0x020000, 0x20000, CRC(ddae9d5b) SHA1(108b202ae7ae124a32400a0a404c7d2b614c60bd) ) + ROM_LOAD( "20.4b", 0x040000, 0x20000, CRC(08cf7a93) SHA1(fd3278c3fb3ef30ed03c8a95656d86ba82a163d8) ) + ROM_LOAD( "21.4b", 0x060000, 0x20000, CRC(1ac892f5) SHA1(28364266ca9d1955fb7953f5c2d6f35e114beec6) ) + + ROM_REGION( 0x100000, REGION_GFX4, ROMREGION_DISPOSE ) + ROM_LOAD( "6.3m", 0x000000, 0x20000, CRC(e7ccdf9f) SHA1(80ffcefc95660471124898a9c2bee55df36bda13) ) /* sprites A1 */ + ROM_LOAD( "8.3n", 0x020000, 0x20000, CRC(7ef7f880) SHA1(26ba9a76adce24beea3cffa1cb95aeafe6f82f96) ) /* sprites B1 */ + ROM_LOAD( "10.3r", 0x040000, 0x20000, CRC(a6451dec) SHA1(553e7a1453b59055fa0b10ca04125543d9f8987c) ) /* sprites C1 */ + ROM_LOAD( "12.3s", 0x060000, 0x20000, CRC(277204f0) SHA1(918e05f10959f2b50c16b6e0dc62e3076c99250e) ) /* sprites D1 */ + + ROM_LOAD( "7.1m", 0x080000, 0x20000, CRC(016bec95) SHA1(6a6757c52ca9a2398ea43d1af4a8d5adde6f4cd2) ) /* sprites A2 */ + ROM_LOAD( "9.1n", 0x0a0000, 0x20000, CRC(6e9b7fd3) SHA1(c86ff61844fc94c02625bb812b9062d0649c8fdf) ) /* sprites B2 */ + ROM_LOAD( "11.1r", 0x0c0000, 0x20000, CRC(7fbfdf5e) SHA1(ab67b72dcadb5f2236d29de751de5bf890a9e423) ) /* sprites C2 */ + ROM_LOAD( "13.1s", 0x0e0000, 0x20000, CRC(4e56a508) SHA1(f89a6037e602b26d6ce11859e0b43a602b50d985) ) /* sprites D2 */ + + ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* 128k for ADPCM samples - sound chip is OKIM6295 */ + ROM_LOAD( "4.4a", 0x0000, 0x20000, CRC(b0e0faf9) SHA1(2275d2ef5eee356ccf80b9e9644d16fc30a4d107) ) /* samples */ +ROM_END + + + ROM_START( tknight ) ROM_REGION( 0x40000, REGION_CPU1, 0 ) /* 2*128k for 68000 code */ ROM_LOAD16_BYTE( "tkni1.bin", 0x00000, 0x20000, CRC(9121daa8) SHA1(06ba7779602df8fae32e859371d27c0dbb8d3430) ) @@ -1476,10 +1531,11 @@ static DRIVER_INIT( drgnbowl ) } -GAME( 1988, shadoww, 0, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Shadow Warriors (World set 1)", 0 ) -GAME( 1988, shadowwa, shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Shadow Warriors (World set 2)", 0 ) +GAME( 1988, shadoww, 0, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Shadow Warriors (World, set 1)", 0 ) +GAME( 1988, shadowwa, shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Shadow Warriors (World, set 2)", 0 ) GAME( 1988, gaiden, shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Ninja Gaiden (US)", 0 ) -GAME( 1989, ryukendn, shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Ninja Ryukenden (Japan)", 0 ) +GAME( 1989, ryukendn, shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Ninja Ryukenden (Japan, set 1)", 0 ) +GAME( 1989, ryukenda, shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Ninja Ryukenden (Japan, set 2)", 0 ) GAME( 1989, wildfang, 0, shadoww, wildfang, wildfang, ROT0, "Tecmo", "Wild Fang / Tecmo Knight", 0 ) GAME( 1989, tknight, wildfang, shadoww, tknight, wildfang, ROT0, "Tecmo", "Tecmo Knight", 0 ) GAME( 1991, stratof, 0, raiga, raiga, raiga, ROT0, "Tecmo", "Raiga - Strato Fighter (US)", GAME_IMPERFECT_GRAPHICS ) diff --git a/src/drivers/galaga.c b/src/drivers/galaga.c index 0a9c6a9bf..5476a44aa 100644 --- a/src/drivers/galaga.c +++ b/src/drivers/galaga.c @@ -3074,7 +3074,7 @@ static DRIVER_INIT (galaga) static DRIVER_INIT (gatsbee) { - init_galaga(); + init_galaga(machine); /* Gatsbee has a larger character ROM, we need a handler for banking */ memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x1000, 0x1000, 0, 0, gatsbee_bank_w); @@ -3112,7 +3112,7 @@ static DRIVER_INIT( xevios ) rom[A] = BITSWAP8(rom[A],3,7,5,1,2,6,4,0); } - init_xevious(); + init_xevious(machine); } @@ -3124,7 +3124,7 @@ static DRIVER_INIT( battles ) memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x7000, 0x700f, 0, 0, battles_customio_data0_w ); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x7100, 0x7100, 0, 0, battles_customio0_w ); - init_xevious(); + init_xevious(machine); } diff --git a/src/drivers/galaxian.c b/src/drivers/galaxian.c index 66427cc76..4f04d092b 100644 --- a/src/drivers/galaxian.c +++ b/src/drivers/galaxian.c @@ -990,7 +990,7 @@ INPUT_PORTS_START( gmgalax ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_DIPNAME( 0x20, 0x00, "Ghost Muncher - Cabinet" ) + PORT_DIPNAME( 0x20, 0x00, "Ghost Muncher - Cabinet" ) PORT_CONDITION("FAKE",0x01,PORTCOND_NOTEQUALS,0x01) PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x20, DEF_STR( Cocktail ) ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY @@ -1003,19 +1003,19 @@ INPUT_PORTS_START( gmgalax ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL - PORT_DIPNAME( 0xc0, 0x40, "Ghost Muncher - Bonus Life" ) + PORT_DIPNAME( 0xc0, 0x40, "Ghost Muncher - Bonus Life" ) PORT_CONDITION("FAKE",0x01,PORTCOND_NOTEQUALS,0x01) PORT_DIPSETTING( 0x40, "10000" ) PORT_DIPSETTING( 0x80, "15000" ) PORT_DIPSETTING( 0xc0, "20000" ) PORT_DIPSETTING( 0x00, DEF_STR( None ) ) PORT_START_TAG("GMDSW0") /* Ghost Muncher - DSW0 */ - PORT_DIPNAME( 0x03, 0x02, "Ghost Muncher - Coinage" ) + PORT_DIPNAME( 0x03, 0x02, "Ghost Muncher - Coinage" ) PORT_CONDITION("FAKE",0x01,PORTCOND_NOTEQUALS,0x01) PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x02, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x03, DEF_STR( Free_Play ) ) - PORT_DIPNAME( 0x0c, 0x04, "Ghost Muncher - Lives" ) + PORT_DIPNAME( 0x0c, 0x04, "Ghost Muncher - Lives" ) PORT_CONDITION("FAKE",0x01,PORTCOND_NOTEQUALS,0x01) PORT_DIPSETTING( 0x0c, "1" ) PORT_DIPSETTING( 0x08, "2" ) PORT_DIPSETTING( 0x04, "3" ) @@ -1028,7 +1028,7 @@ INPUT_PORTS_START( gmgalax ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_DIPNAME( 0x20, 0x00, "Galaxian - Cabinet" ) + PORT_DIPNAME( 0x20, 0x00, "Galaxian - Cabinet" ) PORT_CONDITION("FAKE",0x01,PORTCOND_EQUALS,0x01) PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x20, DEF_STR( Cocktail ) ) PORT_SERVICE( 0x40, IP_ACTIVE_HIGH ) @@ -1041,19 +1041,19 @@ INPUT_PORTS_START( gmgalax ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_COCKTAIL PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_DIPNAME( 0xc0, 0x00, "Galaxian - Coinage" ) + PORT_DIPNAME( 0xc0, 0x00, "Galaxian - Coinage" ) PORT_CONDITION("FAKE",0x01,PORTCOND_EQUALS,0x01) PORT_DIPSETTING( 0x40, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x80, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0xc0, DEF_STR( Free_Play ) ) PORT_START_TAG("DSW0") /* Galaxian - DSW0 */ - PORT_DIPNAME( 0x03, 0x01, "Galaxian - Bonus Life" ) + PORT_DIPNAME( 0x03, 0x01, "Galaxian - Bonus Life" ) PORT_CONDITION("FAKE",0x01,PORTCOND_EQUALS,0x01) PORT_DIPSETTING( 0x01, "4000" ) PORT_DIPSETTING( 0x02, "5000" ) PORT_DIPSETTING( 0x03, "7000" ) PORT_DIPSETTING( 0x00, DEF_STR( None ) ) - PORT_DIPNAME( 0x04, 0x00, "Galaxian - Lives" ) + PORT_DIPNAME( 0x04, 0x00, "Galaxian - Lives" ) PORT_CONDITION("FAKE",0x01,PORTCOND_EQUALS,0x01) PORT_DIPSETTING( 0x00, "3" ) PORT_DIPSETTING( 0x04, "5" ) PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unused ) ) diff --git a/src/drivers/galivan.c b/src/drivers/galivan.c index 6b45365ec..aab5f03cd 100644 --- a/src/drivers/galivan.c +++ b/src/drivers/galivan.c @@ -2,7 +2,6 @@ TODO: - Find out how layers are enabled\disabled -- sprite/char priority - dangar input ports - wrong title screen in ninjemak - bit 3 of ninjemak_gfxbank_w, there currently is a kludge to clear text RAM @@ -910,11 +909,11 @@ ROM_END -GAME( 1985, galivan, 0, galivan, galivan, 0, ROT270, "Nichibutsu", "Galivan - Cosmo Police (12/16/1985)", 0 ) -GAME( 1985, galivan2, galivan, galivan, galivan, 0, ROT270, "Nichibutsu", "Galivan - Cosmo Police (12/11/1985)", 0 ) -GAME( 1986, dangar, 0, galivan, dangar, 0, ROT270, "Nichibutsu", "Dangar - Ufo Robo (12/1/1986)", 0 ) -GAME( 1986, dangar2, dangar, galivan, dangar2, 0, ROT270, "Nichibutsu", "Dangar - Ufo Robo (9/26/1986)", 0 ) -GAME( 1986, dangarb, dangar, galivan, dangarb, 0, ROT270, "bootleg", "Dangar - Ufo Robo (bootleg)", 0 ) -GAME( 1986, ninjemak, 0, ninjemak, ninjemak, 0, ROT270, "Nichibutsu", "Ninja Emaki (US)", 0 ) -GAME( 1986, youma, ninjemak, ninjemak, ninjemak, 0, ROT270, "Nichibutsu", "Youma Ninpou Chou (Japan)", 0 ) +GAME( 1985, galivan, 0, galivan, galivan, 0, ROT270, "Nichibutsu", "Galivan - Cosmo Police (12/16/1985)", GAME_SUPPORTS_SAVE ) +GAME( 1985, galivan2, galivan, galivan, galivan, 0, ROT270, "Nichibutsu", "Galivan - Cosmo Police (12/11/1985)", GAME_SUPPORTS_SAVE ) +GAME( 1986, dangar, 0, galivan, dangar, 0, ROT270, "Nichibutsu", "Dangar - Ufo Robo (12/1/1986)", GAME_SUPPORTS_SAVE ) +GAME( 1986, dangar2, dangar, galivan, dangar2, 0, ROT270, "Nichibutsu", "Dangar - Ufo Robo (9/26/1986)", GAME_SUPPORTS_SAVE ) +GAME( 1986, dangarb, dangar, galivan, dangarb, 0, ROT270, "bootleg", "Dangar - Ufo Robo (bootleg)", GAME_SUPPORTS_SAVE ) +GAME( 1986, ninjemak, 0, ninjemak, ninjemak, 0, ROT270, "Nichibutsu", "Ninja Emaki (US)", GAME_SUPPORTS_SAVE ) +GAME( 1986, youma, ninjemak, ninjemak, ninjemak, 0, ROT270, "Nichibutsu", "Youma Ninpou Chou (Japan)", GAME_SUPPORTS_SAVE ) diff --git a/src/drivers/galpani2.c b/src/drivers/galpani2.c index 8d40a3f6c..a1ca53a1d 100644 --- a/src/drivers/galpani2.c +++ b/src/drivers/galpani2.c @@ -71,7 +71,7 @@ static UINT16 *galpani2_ram, *galpani2_ram2; static MACHINE_RESET( galpani2 ) { - machine_reset_kaneko16(); + machine_reset_kaneko16(machine); kaneko16_sprite_type = 1; @@ -637,6 +637,57 @@ ROM_START( galpani2 ) ROM_RELOAD( 0x300000, 0x100000 ) ROM_END +ROM_START( galpan2g ) + ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* CPU#1 Code */ + ROM_LOAD16_BYTE( "g000g1.u133-0", 0x000000, 0x080000, CRC(5a9c4886) SHA1(6fbc443612e72bafc5cac30de78c72815db20c4c) ) + ROM_LOAD16_BYTE( "g001g1.u134-0", 0x000001, 0x080000, CRC(c92937c3) SHA1(0c9e894c0e23e319bd2d01ec573f02ed510e3ed6) ) + + ROM_REGION( 0x1000000, REGION_CPU2, 0 ) /* CPU#2 Code */ + ROM_LOAD16_BYTE( "g002t1.125", 0x000000, 0x020000, CRC(a3034e1c) SHA1(493e4be36f2aea0083d5d37e16486ed66dab952e) ) + ROM_LOAD16_BYTE( "g003t1.126", 0x000001, 0x020000, CRC(20d3a2ad) SHA1(93450e5a23456c242ebf1a3560013a17c6b05354) ) + + ROM_REGION16_BE( 0x1500000, REGION_USER1, 0 ) /* Backgrounds (CPU2) */ + ROM_LOAD16_BYTE( "g300a0.u44-00", 0x0000000, 0x080000, CRC(50406294) SHA1(fc1165b7b31a44ab204cd5ac3e7b2733ed6b1534) ) + ROM_LOAD16_BYTE( "g300a1.u41-00", 0x0000001, 0x080000, CRC(d26b7c4f) SHA1(b491170010977ba1e5111893937cc6bab0539e7d) ) + ROM_LOAD16_BYTE( "g300b0.u45-00", 0x0100000, 0x080000, CRC(9637934c) SHA1(d3b39d9f44825bdf24d4aa39ca32035bc5af4905) ) + ROM_LOAD16_BYTE( "g300b1.u42-00", 0x0100001, 0x080000, CRC(d72e154b) SHA1(e367c8f9af47b999fcba4afcd293565bad2038ec) ) + ROM_LOAD( "gp2-301.035", 0x0200000, 0x200000, CRC(e71e749d) SHA1(420c4c085e89d9641a84e34fa870df2bc02165b6) ) + ROM_LOAD( "gp2-302.036", 0x0400000, 0x200000, CRC(832ebbb0) SHA1(a753285d874fcab979e70d6a289cf9fcd48affc6) ) + ROM_LOAD( "gp2-303.037", 0x0600000, 0x200000, CRC(36c872d0) SHA1(e0aa3089dfa1765ba70ce60e8696b1ba87c95703) ) + ROM_LOAD( "gp2-304.038", 0x0800000, 0x200000, CRC(7200f918) SHA1(6d23bd371b32319fdd08923deb81278b36b9cd79) ) + ROM_LOAD( "gp2-305.039", 0x0a00000, 0x200000, CRC(a308dc4b) SHA1(db40329c383c765471941ab89fded6b8789d29c7) ) + ROM_LOAD( "gp2-306.040", 0x0c00000, 0x200000, CRC(cd294225) SHA1(c51c95d5edd5e5d7191ccbfa1ba2e92199bb04b9) ) + ROM_LOAD( "gp2-307.041", 0x0e00000, 0x200000, CRC(0fda01af) SHA1(ca30d995ff8d83b46c05898a2ecde3f08a95c788) ) + ROM_LOAD( "gp2-308.042", 0x1000000, 0x200000, CRC(3c806376) SHA1(5c440a0cfd5d5c07ff074bc0c2563956d256a80e) ) + ROM_LOAD16_BYTE( "gp2-309a.050", 0x1200000, 0x100000, CRC(2c025ec3) SHA1(bc25ad92415e662d6b0f845aa4621a733fbf5a48) ) + ROM_LOAD16_BYTE( "gp2-309b.051", 0x1200001, 0x100000, CRC(e8bf1730) SHA1(0d9a446aecc19a43368550348745c9b167ec4941) ) + ROM_LOAD( "gp2-310a.055", 0x1400000, 0x100000, CRC(01eca246) SHA1(19cb35d7873b84486f9105127a1e3cf3235d3109) ) + + ROM_REGION( 0x480000, REGION_GFX1, ROMREGION_DISPOSE ) /* Sprites */ + ROM_LOAD( "gp2-200.046", 0x080000, 0x080000, CRC(11b49470) SHA1(d11c2374a7c9b9b0d1f27c29759b16630700561d) ) + ROM_CONTINUE( 0x000000, 0x080000 ) + ROM_LOAD( "gp2-201.047", 0x180000, 0x080000, CRC(2f6392b4) SHA1(67446974c00481a7a806f4bc5b10eb6e442a1186) ) + ROM_CONTINUE( 0x100000, 0x080000 ) + ROM_LOAD( "gp2-202.048", 0x280000, 0x080000, CRC(c8177181) SHA1(30d0a49334e370eb1b45d2eb6501df3f857a95d5) ) + ROM_CONTINUE( 0x200000, 0x080000 ) + ROM_LOAD( "gp2-203.049", 0x380000, 0x080000, CRC(14e0cb38) SHA1(d9a778ebf0c6b67bee5f6f7016cb9ead96c6a992) ) + ROM_CONTINUE( 0x300000, 0x080000 ) + ROM_LOAD16_BYTE( "g204a0.u33-00", 0x400000, 0x040000, CRC(2867cbfd) SHA1(89af600fb33ce72a7a3fbdf9ff05a4916454a205) ) + ROM_LOAD16_BYTE( "g204a1.u27-00", 0x400001, 0x040000, CRC(c50503bc) SHA1(5003aa414660358900857901d5e9eca6739f14e3) ) + + ROM_REGION( 0x140000, REGION_SOUND1, 0 ) /* Samples */ + ROM_LOAD( "gp2-100.043", 0x040000, 0x100000, CRC(4235ac5b) SHA1(7e35831523fbb2d0587b9ab93c13b2b43dc481a8) ) // $10 x $10000 + ROM_COPY( REGION_SOUND1, 0x0c0000, 0, 0x40000 ) + + ROM_REGION( 0x400000, REGION_SOUND2, 0 ) /* Samples */ + ROM_LOAD( "gp2-102.045", 0x000000, 0x100000, CRC(b4bee779) SHA1(a41098e4b8e48577719dc4bd7f09f5e893e8b388) ) // $8 x $40000 + ROM_CONTINUE( 0x200000, 0x100000 ) + ROM_LOAD( "gp2-101.044", 0x100000, 0x100000, CRC(f75ba6a0) SHA1(91cc0c019a7ebfa2562bbe570af029f00b5e0699) ) // $4 x $40000 + ROM_RELOAD( 0x300000, 0x100000 ) + /* Sound samples: unknown load position, but included here to retain the rom in this set */ + ROM_LOAD( "g104g1.u04-00", 0x300000, 0x080000, CRC(03539013) SHA1(36b96c59c59d0e747eb000472c22a30de0810902) ) +ROM_END + ROM_START( galpan2t ) ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* CPU#1 Code */ ROM_LOAD16_BYTE( "g000t1.133", 0x000000, 0x080000, CRC(332048e7) SHA1(1a353d4b29f7a08158fc454309dc496df6b5b108) ) @@ -750,5 +801,6 @@ ROM_START( gpan2qiz ) ROM_END GAME( 1993, galpani2, 0, galpani2, galpani2, 0, ROT90, "Kaneko", "Gals Panic II (Asia)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION ) +GAME( 1993, galpan2g, galpani2, galpani2, galpani2, 0, ROT90, "Kaneko", "Gals Panic II (German)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION ) GAME( 1993, galpan2t, galpani2, galpani2, galpani2, 0, ROT90, "Kaneko", "Gals Panic II (Taiwan)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION ) GAME( 1993, gpan2qiz, 0, galpani2, galpani2, 0, ROT90, "Kaneko", "Gals Panic II - Quiz Version (Japan)", GAME_NOT_WORKING | GAME_UNEMULATED_PROTECTION ) diff --git a/src/drivers/galpani3.c b/src/drivers/galpani3.c index 5d870138b..5d2e4ac9c 100644 --- a/src/drivers/galpani3.c +++ b/src/drivers/galpani3.c @@ -103,7 +103,7 @@ extern void skns_drawsprites( mame_bitmap *bitmap, const rectangle *cliprect ); VIDEO_UPDATE(galpani3) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); skns_drawsprites (bitmap,cliprect); return 0; diff --git a/src/drivers/galpanic.c b/src/drivers/galpanic.c index 2e730eea3..8042a7a49 100644 --- a/src/drivers/galpanic.c +++ b/src/drivers/galpanic.c @@ -280,7 +280,7 @@ ADDRESS_MAP_END static READ16_HANDLER( kludge ) { - return mame_rand() & 0x0700; + return mame_rand(Machine) & 0x0700; } /* a kludge! */ @@ -289,7 +289,7 @@ READ16_HANDLER( comad_OKIM6295_status_0_msb_r ) UINT16 retvalue; // retvalue = OKIM6295_status_0_msb_r(offset,mem_mask); // doesn't work, causes lockups when girls change.. - retvalue = mame_rand(); + retvalue = mame_rand(Machine); return retvalue; } @@ -388,7 +388,7 @@ ADDRESS_MAP_END /* READ16_HANDLER( zipzap_random_read ) { - return mame_rand(); + return mame_rand(Machine); } */ static ADDRESS_MAP_START( zipzap_readmem, ADDRESS_SPACE_PROGRAM, 16 ) diff --git a/src/drivers/gameplan.c b/src/drivers/gameplan.c index 36d0ed678..a81262690 100644 --- a/src/drivers/gameplan.c +++ b/src/drivers/gameplan.c @@ -923,14 +923,14 @@ INPUT_PORTS_END static PALETTE_INIT( gameplan ) { - palette_set_color(0,0x00,0x00,0x00); /* 0 BLACK */ - palette_set_color(1,0xff,0x00,0x00); /* 1 RED */ - palette_set_color(2,0x00,0xff,0x00); /* 2 GREEN */ - palette_set_color(3,0xff,0xff,0x00); /* 3 YELLOW */ - palette_set_color(4,0x00,0x00,0xff); /* 4 BLUE */ - palette_set_color(5,0xff,0x00,0xff); /* 5 MAGENTA */ - palette_set_color(6,0x00,0xff,0xff); /* 6 CYAN */ - palette_set_color(7,0xff,0xff,0xff); /* 7 WHITE */ + palette_set_color(machine,0,0x00,0x00,0x00); /* 0 BLACK */ + palette_set_color(machine,1,0xff,0x00,0x00); /* 1 RED */ + palette_set_color(machine,2,0x00,0xff,0x00); /* 2 GREEN */ + palette_set_color(machine,3,0xff,0xff,0x00); /* 3 YELLOW */ + palette_set_color(machine,4,0x00,0x00,0xff); /* 4 BLUE */ + palette_set_color(machine,5,0xff,0x00,0xff); /* 5 MAGENTA */ + palette_set_color(machine,6,0x00,0xff,0xff); /* 6 CYAN */ + palette_set_color(machine,7,0xff,0xff,0xff); /* 7 WHITE */ } diff --git a/src/drivers/getrivia.c b/src/drivers/getrivia.c index 03bc71e52..5db4c716a 100644 --- a/src/drivers/getrivia.c +++ b/src/drivers/getrivia.c @@ -71,25 +71,51 @@ static WRITE8_HANDLER( getrivia_bitmap_w ) static WRITE8_HANDLER( lamps_w ) { + /* 5 button lamps */ set_led_status(0,data & 0x01); set_led_status(1,data & 0x02); set_led_status(2,data & 0x04); set_led_status(3,data & 0x08); set_led_status(4,data & 0x10); + + /* 3 additional button lamps for poker games; + lamp 8, 6, 7 order verified in poker/selection games self test; + selection has 13 lamps in test mode, where are 9-13 mapped ? */ + set_led_status(7,data & 0x20); + set_led_status(5,data & 0x40); + set_led_status(6,data & 0x80); } static WRITE8_HANDLER( sound_w ) { - /* bit 3 used but unknown */ + /* bit 3 enables coin lockout (lamp10 in poker / lamp6 in trivia test modes) */ + coin_lockout_global_w(~data & 0x08); + set_led_status(9,data & 0x08); + + /* bit 5 enables ticket out in trivia games; remove this led if ticket dispenser is added */ + set_led_status(8,data & 0x20); /* bit 6 enables NMI */ interrupt_enable_w(0,data & 0x40); /* bit 7 goes directly to the sound amplifier */ DAC_data_w(0,((data & 0x80) >> 7) * 255); +} + +static WRITE8_HANDLER( sound2_w ) +{ + /* bit 3 enables coin lockout (lamp10 in selection test mode) */ + coin_lockout_global_w(~data & 0x08); + set_led_status(9,data & 0x08); + + /* bit 7 goes directly to the sound amplifier */ + DAC_data_w(0,((data & 0x80) >> 7) * 255); +} -// logerror("%04x: sound_w %02x\n",activecpu_get_pc(),data); -// popmessage("%02x",data); +static WRITE8_HANDLER( nmi_w ) +{ + /* bit 6 enables NMI */ + interrupt_enable_w(0,data & 0x40); } static WRITE8_HANDLER( banksel_1_1_w ) @@ -186,35 +212,97 @@ static ADDRESS_MAP_START( gepoker_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0xc000, 0xffff) AM_READWRITE(MRA8_RAM, getrivia_bitmap_w) AM_BASE(&videoram) ADDRESS_MAP_END -INPUT_PORTS_START( getrivia ) + + +INPUT_PORTS_START( gselect ) + PORT_START /* DSW A */ + PORT_DIPNAME( 0x01, 0x01, "Poker: Discard Cards" ) + PORT_DIPSETTING( 0x01, "5" ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPNAME( 0x06, 0x06, "Poker: Pay on" ) + PORT_DIPSETTING( 0x06, "any Pair" ) + PORT_DIPSETTING( 0x04, "Pair of Eights or better" ) + PORT_DIPSETTING( 0x02, "Pair of Jacks or better" ) + PORT_DIPSETTING( 0x00, "Pair of Aces only" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "Poker: Credits needed for 2 Jokers" ) + PORT_DIPSETTING( 0x10, "8" ) + PORT_DIPSETTING( 0x00, "4" ) + PORT_DIPNAME( 0xe0, 0x80, "Payout in %" ) + PORT_DIPSETTING( 0xe0, "35" ) + PORT_DIPSETTING( 0xc0, "40" ) + PORT_DIPSETTING( 0xa0, "45" ) + PORT_DIPSETTING( 0x80, "50" ) + PORT_DIPSETTING( 0x60, "55" ) + PORT_DIPSETTING( 0x40, "60" ) + PORT_DIPSETTING( 0x20, "65" ) + PORT_DIPSETTING( 0x00, "70" ) + + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_SERVICE( 0x08, IP_ACTIVE_LOW ) + 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 /* IN1 */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_NAME ("Deal") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_NAME ("Cancel") + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_NAME ("Stand") +/* Button 8, 6, 7 order verified in test mode switch test */ + PORT_START - PORT_DIPNAME( 0x03, 0x03, "Questions" ) + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END + +INPUT_PORTS_START( gepoker ) + PORT_INCLUDE( gselect ) + + PORT_MODIFY("IN0") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* no coin 2 */ +INPUT_PORTS_END + +INPUT_PORTS_START( getrivia ) + PORT_START_TAG("DSWA") + PORT_DIPNAME( 0x03, 0x01, "Questions" ) PORT_DIPSETTING( 0x00, "4" ) PORT_DIPSETTING( 0x01, "5" ) -// PORT_DIPSETTING( 0x02, "5" ) +/* PORT_DIPSETTING( 0x02, "5" )*/ PORT_DIPSETTING( 0x03, "6" ) - PORT_DIPNAME( 0x04, 0x04, "Show Answer" ) + PORT_DIPNAME( 0x04, 0x00, "Show Answer" ) PORT_DIPSETTING( 0x04, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) - PORT_DIPNAME( 0x08, 0x08, "Max Coins" ) + PORT_DIPNAME( 0x08, 0x00, "Max Coins" ) PORT_DIPSETTING( 0x00, "10" ) PORT_DIPSETTING( 0x08, "30" ) - PORT_DIPNAME( 0x10, 0x10, "Timeout" ) + PORT_DIPNAME( 0x10, 0x00, "Timeout" ) PORT_DIPSETTING( 0x10, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_DIPNAME( 0x20, 0x20, "Tickets" ) PORT_DIPSETTING( 0x20, DEF_STR( No ) ) PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_DIPNAME( 0x40, 0x40, "No Coins" ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) /* if on, coin inputs are replaced by a 6th button to start games. */ + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) /* this is a feature of the PCB for private use. */ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) PORT_CONDITION("DSWA", 0x40, PORTCOND_EQUALS, 0x40) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_IMPULSE(2) PORT_CONDITION("DSWA", 0x40, PORTCOND_EQUALS, 0x00) PORT_NAME ("Start in no coins mode") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2) PORT_CONDITION("DSWA", 0x40, PORTCOND_EQUALS, 0x40) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_CONDITION("DSWA", 0x40, PORTCOND_EQUALS, 0x00) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_SERVICE( 0x08, IP_ACTIVE_LOW ) PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -222,88 +310,47 @@ INPUT_PORTS_START( getrivia ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_START - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_IMPULSE(2) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_IMPULSE(2) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_IMPULSE(2) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_IMPULSE(2) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_IMPULSE(2) + PORT_START /* IN1 */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + INPUT_PORTS_END -INPUT_PORTS_START( gselect ) - PORT_START - 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( 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_START( sextriv1 ) + PORT_INCLUDE( getrivia ) - PORT_START - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_SERVICE( 0x08, IP_ACTIVE_LOW ) - 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_MODIFY("IN0") + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* no coin 2 */ +INPUT_PORTS_END - PORT_START - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_IMPULSE(2) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_IMPULSE(2) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_IMPULSE(2) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_IMPULSE(2) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_IMPULSE(2) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_IMPULSE(2) PORT_NAME("Deal") - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_IMPULSE(2) PORT_NAME("Cancel") - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_IMPULSE(2) PORT_NAME("Stand") - PORT_START - PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) -INPUT_PORTS_END static ppi8255_interface getrivia_ppi8255_intf = { - 2, /* 2 chips */ - { input_port_0_r, input_port_2_r }, /* Port A read */ - { input_port_1_r, NULL }, /* Port B read */ - { NULL, NULL }, /* Port C read */ - { NULL, NULL }, /* Port A write */ - { NULL, lamps_w }, /* Port B write */ - { sound_w, NULL }, /* Port C write */ + 2, /* 2 chips */ + { input_port_0_r, input_port_2_r }, /* Port A read */ + { input_port_1_r, NULL }, /* Port B read */ + { NULL, NULL }, /* Port C read */ + { NULL, NULL }, /* Port A write */ + { NULL, lamps_w }, /* Port B write */ + { sound_w, NULL }, /* Port C write */ }; static ppi8255_interface gselect_ppi8255_intf = { - 2, /* 2 chips */ - { input_port_0_r, input_port_2_r }, /* Port A read */ - { input_port_1_r, NULL }, /* Port B read */ - { NULL, input_port_3_r }, /* Port C read */ - { NULL, NULL }, /* Port A write */ - { NULL, lamps_w }, /* Port B write */ - { NULL, sound_w }, /* Port C write */ + 2, /* 2 chips */ + { input_port_0_r, input_port_2_r }, /* Port A read */ + { input_port_1_r, NULL }, /* Port B read */ + { NULL, input_port_3_r }, /* Port C read */ + { NULL, NULL }, /* Port A write */ + { NULL, lamps_w }, /* Port B write */ + { sound2_w, nmi_w }, /* Port C write */ }; static MACHINE_RESET( getrivia ) @@ -566,19 +613,19 @@ ROM_START( gepoker3 ) /* v50.02 with control dated 9-30-84 */ ROM_END -GAME( 1982, gs4002, 0, gselect, gselect, 0, ROT0, "G.E.I.", "Selection (Version 40.02TMB) set 1", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1982, gs4002a, gs4002, gselect, gselect, 0, ROT0, "G.E.I.", "Selection (Version 40.02TMB) set 2", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1982, gs4002, 0, gselect, gselect, 0, ROT0, "Greyhound Electronics", "Selection (Version 40.02TMB) set 1", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1982, gs4002a, gs4002, gselect, gselect, 0, ROT0, "Greyhound Electronics", "Selection (Version 40.02TMB) set 2", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1984, gepoker, 0, gepoker, gselect, 0, ROT0, "Greyhound Electronics", "Poker (Version 50.02 ICB)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1984, gepoker1, 0, gepoker, gselect, 0, ROT0, "Greyhound Electronics", "Poker (Version 50.08 IAM)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) -GAME( 1984, gepoker2, gepoker, gepoker, gselect, 0, ROT0, "Greyhound Electronics", "Poker (Version 50.02 ICB set 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1984, gepoker3, gepoker, gepoker, gselect, 0, ROT0, "Greyhound Electronics", "Poker (Version 50.02 ICB set 3)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1984, gepoker, 0, gepoker, gepoker, 0, ROT0, "Greyhound Electronics", "Poker (Version 50.02 ICB)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1984, gepoker1, 0, gepoker, gepoker, 0, ROT0, "Greyhound Electronics", "Poker (Version 50.08 IAM)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) +GAME( 1984, gepoker2, gepoker, gepoker, gepoker, 0, ROT0, "Greyhound Electronics", "Poker (Version 50.02 ICB set 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1984, gepoker3, gepoker, gepoker, gepoker, 0, ROT0, "Greyhound Electronics", "Poker (Version 50.02 ICB set 3)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1984, gt102c, 0, getrivia, getrivia, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.02C)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1984, gt102b, 0, getrivia, getrivia, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.02B)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1985, gt102c1, gt102c, getrivia, getrivia, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.02C Alt questions 1)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1985, gt102c2, gt102c, getrivia, getrivia, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.02C Alt questions 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1985, gt102c3, gt102c, getrivia, getrivia, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.02C Alt questions 3)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1984, gt102b, 0, getrivia, getrivia, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.02B)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1984, gt102c, 0, getrivia, getrivia, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.02C)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1985, gt102c1, gt102c, getrivia, getrivia, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.02C Alt questions 1)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1985, gt102c2, gt102c, getrivia, getrivia, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.02C Alt questions 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1985, gt102c3, gt102c, getrivia, getrivia, 0, ROT0, "Greyhound Electronics", "Trivia (Version 1.02C Alt questions 3)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1985, sextriv1, 0, getrivia, getrivia, 0, ROT0, "Kinky Kit and Game Co.", "Sexual Trivia (Version 1.02SB set 1)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) -GAME( 1985, sextriv2, sextriv1, getrivia, getrivia, 0, ROT0, "Kinky Kit and Game Co.", "Sexual Trivia (Version 1.02SB set 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1985, sextriv1, 0, getrivia, sextriv1, 0, ROT0, "Kinky Kit and Game Co.", "Sexual Trivia (Version 1.02SB set 1)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) +GAME( 1985, sextriv2, sextriv1, getrivia, sextriv1, 0, ROT0, "Kinky Kit and Game Co.", "Sexual Trivia (Version 1.02SB set 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) diff --git a/src/drivers/grchamp.c b/src/drivers/grchamp.c index a24c19150..6d40a88dd 100644 --- a/src/drivers/grchamp.c +++ b/src/drivers/grchamp.c @@ -1,41 +1,43 @@ /*************************************************************************** -Grand Champion -(C) 1981 Taito + Grand Champion + (C) 1981 Taito -MAME driver by Ernesto Corvi and Phil Stroffolino + MAME driver by Ernesto Corvi and Phil Stroffolino -Known Issues: +**************************************************************************** -- PC3259 handling (for collision detection) is not accurate. - Collision detection does work, but there are bits which define - the type of collision (and determine whether a pit stop is - required) that I don't know how to handle. + Known Issues: -- sound: missing engine noise + - pc3259 handling (for collision detection) is not accurate. + Collision detection does work, but there are bits which define + the type of collision (and determine whether a pit stop is + required) that I don't know how to handle. -- "radar" is probably wrong + - sound: missing engine noise -- LED and tachometer display are missing/faked - Note that a dipswitch setting allows score to be displayed - onscreen, but there's no equivalent for tachometer. + - "radar" is probably wrong -Notes: + - LED and tachometer display are missing/faked + Note that a dipswitch setting allows score to be displayed + onscreen, but there's no equivalent for tachometer. -- The object of the game is to avoid the opposing cars. + Notes: -- The player has to drive through Dark Tunnels, Rain, - Lightning, Sleet, Snow, and a Track that suddenly - divides to get to the Finish Line first. + - The object of the game is to avoid the opposing cars. -- "GRAND CHAMPION" has a Radar Feature which enables - the Player to see his position relative to the other - cars. + - The player has to drive through Dark Tunnels, Rain, + Lightning, Sleet, Snow, and a Track that suddenly + divides to get to the Finish Line first. -- A Rank Feature is also provided which shows the - Player's numerical rank all through the race. + - "GRAND CHAMPION" has a Radar Feature which enables + the Player to see his position relative to the other + cars. -- The Speech Feature enhances the game play. + - A Rank Feature is also provided which shows the + Player's numerical rank all through the race. + + - The Speech Feature enhances the game play. ***************************************************************************/ @@ -44,84 +46,353 @@ Known Issues: #include "sound/ay8910.h" #include "grchamp.h" -/***************************************************************************/ -static UINT8 grchamp_led_data0; -static UINT8 grchamp_led_data1; -static UINT8 grchamp_led_data2; -UINT8 grchamp_led_reg[8][3]; -/* 5 digits for score -** 2 digits for time -** 1 digit for rank (?) -*/ +/************************************* + * + * Constants + * + *************************************/ + +#define MASTER_CLOCK (18432000) + +#define PIXEL_CLOCK (MASTER_CLOCK/3) + +#define HTOTAL (384) +#define HBEND (0) +#define HBSTART (256) + +#define VTOTAL (264) +#define VBEND (16) +#define VBSTART (240) + + -WRITE8_HANDLER( grchamp_led_data0_w ) +/************************************* + * + * Machine setup + * + *************************************/ + +MACHINE_START( grchamp ) { - grchamp_led_data0 = data; + /* if the coin system is 1 way, lock Coin B (Page 40) */ + if (readinputport(1) & 0x10) + coin_lockout_w(1, 1); + + return 0; } -WRITE8_HANDLER( grchamp_led_data1_w ) + + + +/************************************* + * + * Main CPU outputs + * + *************************************/ + +static WRITE8_HANDLER( cpu0_outputs_w ) { - grchamp_led_data1 = data; + grchamp_state *state = Machine->driver_data; + UINT8 diff = data ^ state->cpu0_out[offset]; + state->cpu0_out[offset] = data; + + switch (offset) + { + case 0x00: /* OUT0 */ + + /* bit 0: low = clear IRQ on main CPU */ + /* bit 1: /HTCLR = clear collision detect */ + /* bit 4: HEAD LAMP */ + /* bit 5: CHANGE */ + /* bit 6: FOG OUT */ + /* bit 7: RADARON */ + if ((diff & 0x01) && !(data & 0x01)) + cpunum_set_input_line(0, 0, CLEAR_LINE); + if ((diff & 0x02) && !(data & 0x02)) + state->collide = 0; + break; + + case 0x01: /* OUT1 */ + /* connects to pc3259, pin 23 (read collision data?) */ + printf("OUT1\n"); + break; + + case 0x02: /* OUT2 */ + /* bit 0-7: MYDH (car X position) */ + break; + + case 0x03: /* OUT3 */ + /* bit 0-7: MYDV (car Y position) */ + break; + + case 0x04: /* OUT4 */ + /* bit 0-3: player car tile select */ + /* bit 4-7: rain tile select */ + break; + + case 0x07: /* OUT7 */ + /* bit 0-7: rain Y position */ + break; + + case 0x08: /* OUT8 */ + /* bit 0-7: rain X position */ + break; + + case 0x09: /* OUT9 */ + /* bit 0-3: n/c */ + /* bit 4: coin lockout */ + /* bit 5: Game Over lamp */ + /* bit 6/7: n/c */ + coin_lockout_global_w((data >> 4) & 1); + output_set_value("led0", (~data >> 5) & 1); + break; + + case 0x0a: /* OUT10 */ + /* bit 0: n/c */ + /* bit 1: G-12 */ + /* bit 2: G-S */ + /* bit 3: G-16 */ + /* bit 4: G-Y */ + /* bit 5: n/c */ + /* bit 6: G-Z */ + if (diff) + printf("OUT10=%02X\n", data); + break; + + case 0x0d: /* OUT13 */ + watchdog_reset(); + break; + + case 0x0e: /* OUT14 */ + /* O-21 connector */ + soundlatch_w(0, data); + cpunum_set_input_line(2, INPUT_LINE_NMI, PULSE_LINE); + break; + } } -WRITE8_HANDLER( grchamp_led_data2_w ) + + +static WRITE8_HANDLER( led_board_w ) { - grchamp_led_data2 = data; + grchamp_state *state = Machine->driver_data; + + switch (offset) + { + case 0x00: + state->ledlatch = (state->ledlatch & 0xff00) | (data << 0); + break; + + case 0x04: + state->ledlatch = (state->ledlatch & 0x00ff) | (data << 8); + break; + + case 0x08: + state->ledaddr = data & 0x0f; + break; + + case 0x0c: + state->ledram[state->ledaddr & 0x07] = state->ledlatch; + output_set_digit_value(state->ledaddr & 0x07, state->ledram[state->ledaddr & 0x07] & 0x0f); + /* + ledram[0] & 0x0f = score LSD + ledram[1] & 0x0f = score + ledram[2] & 0x0f = score + ledram[3] & 0x0f = score + ledram[4] & 0x0f = score MSD + ledram[5] & 0x0f = time LSD + ledram[6] & 0x0f = time MSD + ledram[7] & 0x0f = ??? + */ + break; + } } -WRITE8_HANDLER( grchamp_led_data3_w ) + + + +/************************************* + * + * Sub CPU outputs + * + *************************************/ + +WRITE8_HANDLER( cpu1_outputs_w ) { - if( data ) + grchamp_state *state = Machine->driver_data; + UINT8 diff = data ^ state->cpu1_out[offset]; + state->cpu1_out[offset] = data; + + switch (offset) { - int which = data&0x7; - grchamp_led_reg[which][0] = grchamp_led_data0; /* digit */ - grchamp_led_reg[which][1] = grchamp_led_data1; /* ? */ - grchamp_led_reg[which][2] = grchamp_led_data2; + /* OUT0 - OUTF (Page 48) */ + /* OUT0 - Page 43: writes to 'Left Synk Bus' */ /* bg0 yscroll lsb */ + /* OUT1 - Page 43: writes to 'Left Synk Bus' */ /* bg0 yscroll msb */ + /* OUT2 - Page 43: writes to 'Left Synk Bus' */ /* bg0 xscroll? */ + + case 0x03: /* OUT3 - Page 45 */ + /* bit0-bit3 = Analog Tachometer output + bit4 = Palette selector. (Goes to A4 on the color prom). I believe this + select between colors 0-15 and colors 16-31. + bit5 = Center Layer 256H line enable. This bit enables/disables the + 256H line (The extra higher bit for scroll) on the center (road) layer. + bit 6 and 7 = unused. + */ + break; + + case 0x04: /* OUT4 - Page 46 */ + /* trigger irq on cpu2 when vblank arrives */ + if ((diff & 0x01) && !(data & 0x01)) + cpunum_set_input_line(1, 0, CLEAR_LINE); + break; + + /* OUT5 - unused */ /* bg1 yscroll lsb */ + /* OUT6 - unused */ /* bg1 yscroll msb */ + /* OUT7 - Page 44: writes to 'Right Synk Bus' */ /* bg1 xscroll? */ + + case 0x08: /* OUT8 - Page 47 */ + state->comm_latch = data; + break; + /* OUT9 - Page 47: writes to 'Center Synk Bus' */ /* bg2 yscroll lsb */ + /* OUTA - Page 47: writes to 'Center Synk Bus' */ /* bg2 yscroll msb? */ + /* OUTB - Page 47: writes to 'Center Synk Bus' */ /* bg2 xscroll? */ + + case 0x0C: /* OUTC - Page 48: goes to connector Q-23 */ + discrete_sound_w(GRCHAMP_ENGINE_CS_EN, data & 0x80); + discrete_sound_w(GRCHAMP_SIFT_DATA, (data >> 5) & 0x03); + discrete_sound_w(GRCHAMP_ATTACK_UP_DATA, (data >> 2) & 0x07); + discrete_sound_w(GRCHAMP_IDLING_EN, data & 0x02); + discrete_sound_w(GRCHAMP_FOG_EN, data & 0x01); + break; + + case 0x0D: /* OUTD - Page 48: goes to connector Q-25 */ + discrete_sound_w(GRCHAMP_PLAYER_SPEED_DATA, (data >> 4) & 0x0f); + discrete_sound_w(GRCHAMP_ATTACK_SPEED_DATA, data & 0x0f); + break; + + default: + /* OUTE - Page 48: goes to connector Q-27 */ + /* OUTF - unused */ + break; } } -/***************************************************************************/ -static int PC3259_data; -WRITE8_HANDLER( PC3259_control_w ) +/************************************* + * + * CPU 0 Inputs + * + *************************************/ + +INLINE UINT8 get_pc3259_bits(grchamp_state *state, int offs) +{ + int bits; + + /* force a partial update to the current position */ + video_screen_update_partial(0, video_screen_get_vpos(0)); + + /* get the relevant 4 bits */ + bits = (state->collide >> (offs*4)) & 0x0f; + + /* replicate to both nibbles */ + return bits | (bits << 4); +} + + +READ8_HANDLER( pc3259_0_r ) { - PC3259_data = data; + grchamp_state *state = Machine->driver_data; + return get_pc3259_bits(state, 0); } -READ8_HANDLER( PC3259_0_r ) -{ /* 0x01 (401a)*/ - return 0xff; /* unknown */ + +READ8_HANDLER( pc3259_1_r ) +{ + grchamp_state *state = Machine->driver_data; + return get_pc3259_bits(state, 1); } -READ8_HANDLER( PC3259_1_r ) -{ /* 0x09 (401b)*/ - return 0xff; /* unknown */ + +READ8_HANDLER( pc3259_2_r ) +{ + grchamp_state *state = Machine->driver_data; + return get_pc3259_bits(state, 2); } -READ8_HANDLER( PC3259_2_r ) -{ /* 0x11 (401c)*/ - int result = 0; - if( grchamp_player_ypos<128 ) - { - result |= 0x4; // crash on bottom half of screen - } - if( grchamp_collision&2 ) - { - result = rand()&0xff; // OBJECT crash - } - return result; + +READ8_HANDLER( pc3259_3_r ) +{ + grchamp_state *state = Machine->driver_data; + return get_pc3259_bits(state, 3); } -READ8_HANDLER( PC3259_3_r ) -{ /* 0x19 (401d)*/ - int result = grchamp_collision?1:0; /* crash */ - return result; + + +/************************************* + * + * Inter-CPU communication + * + *************************************/ + +READ8_HANDLER( sub_to_main_comm_r ) +{ + grchamp_state *state = Machine->driver_data; + return state->comm_latch; } -/***************************************************************************/ + +static void main_to_sub_comm_sync_w(int param) +{ + grchamp_state *state = Machine->driver_data; + int offset = param >> 8; + state->comm_latch2[offset & 3] = param; +} + + +WRITE8_HANDLER( main_to_sub_comm_w ) +{ + timer_set(TIME_NOW, data | (offset << 8), main_to_sub_comm_sync_w); +} + + +READ8_HANDLER( main_to_sub_comm_r ) +{ + grchamp_state *state = Machine->driver_data; + return state->comm_latch2[offset]; +} -static WRITE8_HANDLER( NC_w ) + +/*************************************************************************** + + CPU 3 + +***************************************************************************/ + +WRITE8_HANDLER( grchamp_portA_0_w ) // IC 3B +{ + discrete_sound_w(GRCHAMP_A_DATA, data); +} +WRITE8_HANDLER( grchamp_portB_0_w ) // IC 3B +{ + discrete_sound_w(GRCHAMP_B_DATA, 255-data); +} + +WRITE8_HANDLER( grchamp_portA_1_w ) // IC 2B +{ + +} + +WRITE8_HANDLER( grchamp_portB_1_w ) // IC 2B +{ + +} + +WRITE8_HANDLER( grchamp_portA_2_w ) // IC 1B +{ + +} +WRITE8_HANDLER( grchamp_portB_2_w ) // IC 1B { } @@ -155,219 +426,94 @@ static struct AY8910interface ay8910_interface_3 = static const gfx_layout char_layout = { 8,8, - 0x200, + RGN_FRAC(1,2), 2, - { 0,0x1000*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 }, + { 0,RGN_FRAC(1,2) }, + { STEP8(0,1) }, + { STEP8(0,8) }, 8*8 }; -static const gfx_layout tile_layout = -{ - 8,8, - 0x300, - 4, - { 0,4,0x3000*8,0x3000*8+4 }, - { 8*8+3,8*8+2,8*8+1,8*8+0,3,2,1,0 }, - { 7*8,6*8,5*8,4*8,3*8,2*8,1*8,0*8 }, - 16*8 -}; - -static const gfx_layout player_layout = -{ - 32,32, - 0x10, - 2, - { 0,4 }, - { - 0x000,0x001,0x002,0x003,0x008,0x009,0x00a,0x00b, - 0x010,0x011,0x012,0x013,0x018,0x019,0x01a,0x01b, - 0x020,0x021,0x022,0x023,0x028,0x029,0x02a,0x02b, - 0x030,0x031,0x032,0x033,0x038,0x039,0x03a,0x03b, - }, - { - 0x40*0x00,0x40*0x01,0x40*0x02,0x40*0x03, - 0x40*0x04,0x40*0x05,0x40*0x06,0x40*0x07, - 0x40*0x08,0x40*0x09,0x40*0x0a,0x40*0x0b, - 0x40*0x0c,0x40*0x0d,0x40*0x0e,0x40*0x0f, - 0x40*0x10,0x40*0x11,0x40*0x12,0x40*0x13, - 0x40*0x14,0x40*0x15,0x40*0x16,0x40*0x17, - 0x40*0x18,0x40*0x19,0x40*0x1a,0x40*0x1b, - 0x40*0x1c,0x40*0x1d,0x40*0x1e,0x40*0x1f, - }, - 0x800 -}; - -static const gfx_layout rain_layout = -{ - 16,16, - 0x10, - 1, - { 0 }, - { /* ? */ - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 - }, - { /* ? */ - 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 - }, - 0x100 -}; - static const gfx_layout sprite_layout = { 16,16, - 0x80, + RGN_FRAC(1,2), 2, - { 0,0x1000*8 }, - { - 0,1,2,3,4,5,6,7, - 64+0,64+1,64+2,64+3,64+4,64+5,64+6,64+7 - }, - { - 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, - 128+0*8, 128+1*8, 128+2*8, 128+3*8, 128+4*8, 128+5*8, 128+6*8, 128+7*8 - }, - 0x100 -}; - - -static const UINT32 headlights_layout_xoffset[64] = -{ - 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, - 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, - 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, - 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f, - 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, - 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, - 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f + { 0,RGN_FRAC(1,2) }, + { STEP8(0,1),STEP8(64,1) }, + { STEP8(0,8),STEP8(128,8) }, + 16*16 }; -static const UINT32 headlights_layout_yoffset[64] = -{ - 0x0000,0x0040,0x0080,0x00c0,0x0100,0x0140,0x0180,0x01c0, - 0x0200,0x0240,0x0280,0x02c0,0x0300,0x0340,0x0380,0x03c0, - 0x0400,0x0440,0x0480,0x04c0,0x0500,0x0540,0x0580,0x05c0, - 0x0600,0x0640,0x0680,0x06c0,0x0700,0x0740,0x0780,0x07c0, - 0x0800,0x0840,0x0880,0x08c0,0x0900,0x0940,0x0980,0x09c0, - 0x0a00,0x0a40,0x0a80,0x0ac0,0x0b00,0x0b40,0x0b80,0x0bc0, - 0x0c00,0x0c40,0x0c80,0x0cc0,0x0d00,0x0d40,0x0d80,0x0dc0, - 0x0e00,0x0e40,0x0e80,0x0ec0,0x0f00,0x0f40,0x0f80,0x0fc0 -}; - -static const gfx_layout headlights_layout = +static const gfx_layout tile_layout = { - 64,64, - 4, // Number of sprites - 1, // One bitplane - {0}, - EXTENDED_XOFFS, - EXTENDED_YOFFS, - 4096, - headlights_layout_xoffset, - headlights_layout_yoffset + 8,8, + RGN_FRAC(1,2), + 4, + { 0,4,RGN_FRAC(1,2),RGN_FRAC(1,2)+4 }, + { STEP4(0,1),STEP4(8*8+0,1) }, + { STEP8(0,8) }, + 16*8 }; static const gfx_decode gfxdecodeinfo[] = { - { REGION_GFX1, 0x0000, &char_layout, 0x20, 8 }, - { REGION_GFX2, 0x0000, &tile_layout, 0x00, 16 }, - { REGION_GFX1, 0x2000, &player_layout, 0x20, 32 }, - { REGION_GFX1, 0x0000, &sprite_layout, 0x20, 32 }, - { REGION_GFX3, 0x0000, &rain_layout, 0x20, 1 }, - { REGION_GFX4, 0x0000, &headlights_layout, 0x00, 1 }, + { REGION_GFX1, 0x0000, &char_layout, 0, 8 }, + { REGION_GFX2, 0x0000, &tile_layout, 0, 16 }, + { REGION_GFX3, 0x0000, &tile_layout, 0, 16 }, + { REGION_GFX4, 0x0000, &tile_layout, 0, 16 }, + { REGION_GFX1, 0x0000, &sprite_layout, 0, 32 }, { -1 } }; /***************************************************************************/ -static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x3fff) AM_READ(MRA8_ROM) - AM_RANGE(0x4000, 0x43ff) AM_READ(MRA8_RAM) - AM_RANGE(0x4800, 0x4bff) AM_READ(MRA8_RAM) /* radar */ - AM_RANGE(0x5000, 0x53ff) AM_READ(MRA8_RAM) /* text layer */ - AM_RANGE(0x5800, 0x58ff) AM_READ(MRA8_RAM) +/* complete memory map derived from schematics */ +static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x3fff) AM_ROM + AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0x0400) AM_RAM + AM_RANGE(0x4800, 0x4bff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(grchamp_state, radarram) + AM_RANGE(0x5000, 0x53ff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(grchamp_state, videoram) + AM_RANGE(0x5800, 0x58ff) AM_MIRROR(0x0700) AM_RAM AM_BASE_MEMBER(grchamp_state, spriteram) ADDRESS_MAP_END -static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x3fff) AM_WRITE(MWA8_ROM) - AM_RANGE(0x4000, 0x43ff) AM_WRITE(MWA8_RAM) - AM_RANGE(0x4800, 0x4bff) AM_WRITE(MWA8_RAM) AM_BASE(&grchamp_radar) - AM_RANGE(0x5000, 0x53ff) AM_WRITE(MWA8_RAM) AM_BASE(&videoram) - AM_RANGE(0x5800, 0x583f) AM_WRITE(MWA8_RAM) AM_BASE(&colorram) - AM_RANGE(0x5840, 0x58ff) AM_WRITE(MWA8_RAM) AM_BASE(&spriteram) -ADDRESS_MAP_END -static ADDRESS_MAP_START( readport, ADDRESS_SPACE_IO, 8 ) +static ADDRESS_MAP_START( main_portmap, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) - AM_RANGE(0x00, 0x00) AM_READ(input_port_3_r) /* accel */ - AM_RANGE(0x01, 0x01) AM_READ(PC3259_0_r) - AM_RANGE(0x02, 0x02) AM_READ(grchamp_port_0_r) /* comm */ - AM_RANGE(0x03, 0x03) AM_READ(input_port_4_r) /* wheel */ - AM_RANGE(0x00, 0x03) AM_READ(grchamp_port_0_r) /* scanline read, cpu2 read, etc */ - AM_RANGE(0x04, 0x04) AM_READ(input_port_0_r) /* DSWA */ - AM_RANGE(0x05, 0x05) AM_READ(input_port_1_r) /* DSWB */ - AM_RANGE(0x06, 0x06) AM_READ(input_port_2_r) /* tilt, coin, reset HS, etc */ - AM_RANGE(0x09, 0x09) AM_READ(PC3259_1_r) - AM_RANGE(0x11, 0x11) AM_READ(PC3259_2_r) - AM_RANGE(0x19, 0x19) AM_READ(PC3259_3_r) -ADDRESS_MAP_END - -static ADDRESS_MAP_START( writeport, ADDRESS_SPACE_IO, 8 ) - ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) - AM_RANGE(0x00, 0x00) AM_WRITE(grchamp_control0_w) - AM_RANGE(0x01, 0x01) AM_WRITE(PC3259_control_w) // ? - AM_RANGE(0x02, 0x02) AM_WRITE(grchamp_player_xpos_w) - AM_RANGE(0x03, 0x03) AM_WRITE(grchamp_player_ypos_w) - AM_RANGE(0x04, 0x04) AM_WRITE(grchamp_tile_select_w) - AM_RANGE(0x05, 0x05) AM_WRITE(MWA8_NOP) // NC according to schematics - AM_RANGE(0x06, 0x06) AM_WRITE(MWA8_NOP) // NC according to schematics - AM_RANGE(0x07, 0x07) AM_WRITE(grchamp_rain_xpos_w) - AM_RANGE(0x08, 0x08) AM_WRITE(grchamp_rain_ypos_w) - AM_RANGE(0x09, 0x09) AM_WRITE(grchamp_coinled_w) - AM_RANGE(0x0a, 0x0a) AM_WRITE(MWA8_NOP) // Unknown - AM_RANGE(0x0b, 0x0b) AM_WRITE(MWA8_NOP) // NC according to schematics - AM_RANGE(0x0c, 0x0c) AM_WRITE(MWA8_NOP) // NC according to schematics - AM_RANGE(0x0d, 0x0d) AM_WRITE(MWA8_NOP) // Unknown, watchdog? - AM_RANGE(0x0e, 0x0e) AM_WRITE(grchamp_sound_w) - AM_RANGE(0x0f, 0x0f) AM_WRITE(MWA8_NOP) // NC according to schematics - AM_RANGE(0x10, 0x13) AM_WRITE(grchamp_comm_w) - AM_RANGE(0x20, 0x20) AM_WRITE(grchamp_led_data0_w) - AM_RANGE(0x24, 0x24) AM_WRITE(grchamp_led_data1_w) - AM_RANGE(0x28, 0x28) AM_WRITE(grchamp_led_data2_w) - AM_RANGE(0x2c, 0x2c) AM_WRITE(grchamp_led_data3_w) + AM_RANGE(0x00, 0x00) AM_MIRROR(0x78) AM_READ(port_tag_to_handler8("ACCEL")) + AM_RANGE(0x02, 0x02) AM_MIRROR(0x78) AM_READ(sub_to_main_comm_r) + AM_RANGE(0x03, 0x03) AM_MIRROR(0x78) AM_READ(port_tag_to_handler8("WHEEL")) + AM_RANGE(0x04, 0x04) AM_MIRROR(0x78) AM_READ(port_tag_to_handler8("DSWA")) + AM_RANGE(0x05, 0x05) AM_MIRROR(0x78) AM_READ(port_tag_to_handler8("DSWB")) + AM_RANGE(0x06, 0x06) AM_MIRROR(0x78) AM_READ(port_tag_to_handler8("TILT")) + AM_RANGE(0x01, 0x01) AM_MIRROR(0x60) AM_READ(pc3259_0_r) + AM_RANGE(0x09, 0x09) AM_MIRROR(0x60) AM_READ(pc3259_1_r) + AM_RANGE(0x11, 0x11) AM_MIRROR(0x60) AM_READ(pc3259_2_r) + AM_RANGE(0x19, 0x19) AM_MIRROR(0x60) AM_READ(pc3259_3_r) + AM_RANGE(0x00, 0x0f) AM_MIRROR(0x40) AM_WRITE(cpu0_outputs_w) + AM_RANGE(0x10, 0x13) AM_MIRROR(0x40) AM_WRITE(main_to_sub_comm_w) + AM_RANGE(0x20, 0x2f) AM_MIRROR(0x53) AM_WRITE(led_board_w) ADDRESS_MAP_END /***************************************************************************/ -static ADDRESS_MAP_START( readmem2, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x1fff) AM_READ(MRA8_ROM) - AM_RANGE(0x2000, 0x37ff) AM_READ(MRA8_RAM) /* tilemaps */ - AM_RANGE(0x3800, 0x3fff) AM_READ(MRA8_RAM) - AM_RANGE(0x4000, 0x43ff) AM_READ(MRA8_RAM) - AM_RANGE(0x5000, 0x6fff) AM_READ(MRA8_ROM) +/* complete memory map derived from schematics */ +static ADDRESS_MAP_START( sub_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x1fff) AM_ROM + AM_RANGE(0x2000, 0x27ff) AM_READWRITE(MRA8_RAM, grchamp_left_w) AM_BASE_MEMBER(grchamp_state, leftram) + AM_RANGE(0x2800, 0x2fff) AM_READWRITE(MRA8_RAM, grchamp_right_w) AM_BASE_MEMBER(grchamp_state, rightram) + AM_RANGE(0x3000, 0x37ff) AM_READWRITE(MRA8_RAM, grchamp_center_w) AM_BASE_MEMBER(grchamp_state, centerram) + AM_RANGE(0x4000, 0x43ff) AM_MIRROR(0x0400) AM_RAM + AM_RANGE(0x5000, 0x6fff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( writemem2, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x1fff) AM_WRITE(MWA8_ROM) - AM_RANGE(0x2000, 0x37ff) AM_WRITE(grchamp_videoram_w) AM_BASE(&grchamp_videoram) - AM_RANGE(0x3800, 0x3fff) AM_WRITE(MWA8_RAM) - AM_RANGE(0x4000, 0x43ff) AM_WRITE(MWA8_RAM) /* working ram */ - AM_RANGE(0x5000, 0x6fff) AM_WRITE(MWA8_ROM) -ADDRESS_MAP_END - -static ADDRESS_MAP_START( readport2, ADDRESS_SPACE_IO, 8 ) +static ADDRESS_MAP_START( sub_portmap, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) - AM_RANGE(0x00, 0x03) AM_READ(grchamp_port_1_r) + AM_RANGE(0x00, 0x03) AM_READ(main_to_sub_comm_r) + AM_RANGE(0x00, 0x0f) AM_MIRROR(0x70) AM_WRITE(cpu1_outputs_w) ADDRESS_MAP_END -static ADDRESS_MAP_START( writeport2, ADDRESS_SPACE_IO, 8 ) - ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) - AM_RANGE(0x00, 0x0f) AM_WRITE(grchamp_port_1_w) -ADDRESS_MAP_END /***************************************************************************/ @@ -395,74 +541,44 @@ ADDRESS_MAP_END static INTERRUPT_GEN( grchamp_interrupt ) { + grchamp_state *state = Machine->driver_data; int cpu = cpu_getactivecpu(); - if ( grchamp_cpu_irq_enable[cpu] ) - { - grchamp_cpu_irq_enable[cpu] = 0; - cpunum_set_input_line(cpu, 0, HOLD_LINE); - } + if (cpu == 0 && (state->cpu0_out[0] & 0x01)) + cpunum_set_input_line(cpu, 0, ASSERT_LINE); + if (cpu == 1 && (state->cpu1_out[4] & 0x01)) + cpunum_set_input_line(cpu, 0, ASSERT_LINE); } -static MACHINE_DRIVER_START( grchamp ) - /* basic machine hardware */ - /* CPU BOARD */ - MDRV_CPU_ADD(Z80, 3000000) - MDRV_CPU_PROGRAM_MAP(readmem,writemem) - MDRV_CPU_IO_MAP(readport,writeport) - MDRV_CPU_VBLANK_INT(grchamp_interrupt,1) - /* GAME BOARD */ - MDRV_CPU_ADD(Z80, 3000000) - MDRV_CPU_PROGRAM_MAP(readmem2,writemem2) - MDRV_CPU_IO_MAP(readport2,writeport2) - MDRV_CPU_VBLANK_INT(grchamp_interrupt,1) /* irq's are triggered from the main cpu */ +/************************************* + * + * Port definitions + * + *************************************/ - /* SOUND BOARD */ - MDRV_CPU_ADD(Z80, 3000000) - /* audio CPU */ - MDRV_CPU_PROGRAM_MAP(readmem_sound,writemem_sound) - MDRV_CPU_PERIODIC_INT(irq0_line_hold,TIME_IN_HZ(75)) /* irq's are triggered every 75 Hz */ - - MDRV_FRAMES_PER_SECOND(60) - MDRV_VBLANK_DURATION(DEFAULT_REAL_60HZ_VBLANK_DURATION) - MDRV_INTERLEAVE(100) - - /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_HAS_SHADOWS | VIDEO_HAS_HIGHLIGHTS | VIDEO_NEEDS_6BITS_PER_GUN) - MDRV_SCREEN_SIZE(256, 256) - MDRV_VISIBLE_AREA(0, 255, 16, 255-16) - MDRV_GFXDECODE(gfxdecodeinfo) - MDRV_PALETTE_LENGTH(0x40+0x40*70) - MDRV_COLORTABLE_LENGTH(0x40+0x40*70) - - MDRV_PALETTE_INIT(grchamp) - MDRV_VIDEO_START(grchamp) - MDRV_VIDEO_UPDATE(grchamp) - - /* sound hardware */ - MDRV_SPEAKER_STANDARD_MONO("mono") - - MDRV_SOUND_ADD(AY8910, 1500000) - MDRV_SOUND_CONFIG(ay8910_interface_1) - MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.2) +INPUT_PORTS_START( grchamp ) - MDRV_SOUND_ADD(AY8910, 1500000) - MDRV_SOUND_CONFIG(ay8910_interface_2) - MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.2) + PORT_START_TAG("TILT") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) /* High Score reset switch */ + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_TOGGLE /* High Gear */ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_TILT ) /* Tilt */ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) /* Service */ + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) /* Coin A */ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) /* Coin B */ - MDRV_SOUND_ADD(AY8910, 1500000) - MDRV_SOUND_CONFIG(ay8910_interface_3) - MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.2) + PORT_START_TAG("ACCEL") + PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(100) PORT_KEYDELTA(16) PORT_CODE_DEC(KEYCODE_LCONTROL) + //mask,default,type,sensitivity,delta,min,max - MDRV_SOUND_ADD(DISCRETE, 0) - MDRV_SOUND_CONFIG(grchamp_discrete_interface) - MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) -MACHINE_DRIVER_END + PORT_START_TAG("WHEEL") + PORT_BIT( 0xff, 0x40, IPT_DIAL ) PORT_MINMAX(0x00,0x7f) PORT_SENSITIVITY(25) PORT_KEYDELTA(5) PORT_REVERSE + //mask,default,type,sensitivity,delta,min,max -INPUT_PORTS_START( grchamp ) - PORT_START /* DSW A */ + PORT_START_TAG("DSWA") PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) ) PORT_DIPSETTING( 0x0f, DEF_STR( 9C_1C ) ) PORT_DIPSETTING( 0x0e, DEF_STR( 8C_1C ) ) @@ -498,13 +614,15 @@ INPUT_PORTS_START( grchamp ) PORT_DIPSETTING( 0x60, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x70, DEF_STR( 1C_8C ) ) - PORT_START /* DSW B */ + PORT_START_TAG("DSWB") PORT_DIPNAME( 0x03, 0x02, "Extra Race" ) PORT_DIPSETTING( 0x00, "4th" ) PORT_DIPSETTING( 0x02, "5th" ) PORT_DIPSETTING( 0x01, "6th" ) PORT_DIPSETTING( 0x03, "7th" ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unused ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x08, 0x00, "RAM Test" ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x08, DEF_STR( On ) ) @@ -520,34 +638,88 @@ INPUT_PORTS_START( grchamp ) PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x80, DEF_STR( On ) ) +INPUT_PORTS_END - PORT_START - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) /* High Score reset switch */ - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_TOGGLE /* High Gear */ - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_TILT ) /* Tilt */ - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) /* Service */ - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) /* Coin A */ - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) /* Coin B */ - PORT_START /* Accel */ - PORT_BIT( 0xff, 0x00, IPT_PEDAL ) PORT_MINMAX(0x00,0xff) PORT_SENSITIVITY(100) PORT_KEYDELTA(16) PORT_CODE_DEC(KEYCODE_LCONTROL) - //mask,default,type,sensitivity,delta,min,max - PORT_START /* Wheel */ - PORT_BIT( 0xff, 0x40, IPT_DIAL ) PORT_MINMAX(0x00,0x7f) PORT_SENSITIVITY(25) PORT_KEYDELTA(5) PORT_REVERSE - //mask,default,type,sensitivity,delta,min,max -INPUT_PORTS_END +/************************************* + * + * Machine drivers + * + *************************************/ + +static MACHINE_DRIVER_START( grchamp ) + MDRV_DRIVER_DATA(grchamp_state) + + /* basic machine hardware */ + /* CPU BOARD */ + MDRV_CPU_ADD(Z80, PIXEL_CLOCK/2) + MDRV_CPU_PROGRAM_MAP(main_map,0) + MDRV_CPU_IO_MAP(main_portmap,0) + MDRV_CPU_VBLANK_INT(grchamp_interrupt,1) + + /* GAME BOARD */ + MDRV_CPU_ADD(Z80, PIXEL_CLOCK/2) + MDRV_CPU_PROGRAM_MAP(sub_map,0) + MDRV_CPU_IO_MAP(sub_portmap,0) + MDRV_CPU_VBLANK_INT(grchamp_interrupt,1) + + /* SOUND BOARD */ + MDRV_CPU_ADD(Z80, 3000000) + MDRV_CPU_PROGRAM_MAP(readmem_sound,writemem_sound) + MDRV_CPU_PERIODIC_INT(irq0_line_hold,TIME_IN_HZ(75)) /* irq's are triggered every 75 Hz */ + + MDRV_MACHINE_START(grchamp) + MDRV_WATCHDOG_VBLANK_INIT(8) + MDRV_INTERLEAVE(100) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_RGB_DIRECT | VIDEO_NEEDS_6BITS_PER_GUN | VIDEO_ALWAYS_UPDATE) + MDRV_GFXDECODE(gfxdecodeinfo) + + MDRV_SCREEN_ADD("main", 0) + MDRV_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) + + MDRV_PALETTE_INIT(grchamp) + MDRV_VIDEO_START(grchamp) + MDRV_VIDEO_UPDATE(grchamp) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(AY8910, 1500000) + MDRV_SOUND_CONFIG(ay8910_interface_1) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.2) + + MDRV_SOUND_ADD(AY8910, 1500000) + MDRV_SOUND_CONFIG(ay8910_interface_2) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.2) + + MDRV_SOUND_ADD(AY8910, 1500000) + MDRV_SOUND_CONFIG(ay8910_interface_3) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.2) + + MDRV_SOUND_ADD(DISCRETE, 0) + MDRV_SOUND_CONFIG(grchamp_discrete_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) +MACHINE_DRIVER_END + + + +/************************************* + * + * ROM definitions + * + *************************************/ ROM_START( grchamp ) - ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_REGION( 0x4000, REGION_CPU1, 0 ) ROM_LOAD( "gm03", 0x0000, 0x1000, CRC(47fda76e) SHA1(fd5f1a651481669d64e5e0799369c22472265535) ) ROM_LOAD( "gm04", 0x1000, 0x1000, CRC(07a623dc) SHA1(bb8a6531d95e996148c06fd336db4054eb1d28dd) ) ROM_LOAD( "gm05", 0x2000, 0x1000, CRC(716e1fba) SHA1(fe596873c932513227b982cd23af440d31612de9) ) ROM_LOAD( "gm06", 0x3000, 0x1000, CRC(157db30b) SHA1(a74314d3aef4659ea96ed659e5db2883e7ae1cb1) ) - ROM_REGION( 0x10000, REGION_CPU2, 0 ) + ROM_REGION( 0x8000, REGION_CPU2, 0 ) ROM_LOAD( "gm09", 0x0000, 0x1000, CRC(d57bd109) SHA1(d1cb5ba783eaceda45893f6404fe9dbac740a2de) ) ROM_LOAD( "gm10", 0x1000, 0x1000, CRC(41ba07f1) SHA1(103eeacdd36b4347fc62debb6b5f4163083313f4) ) ROM_LOAD( "gr16", 0x5000, 0x1000, CRC(885d708e) SHA1(d5d2978a0eeca167ec1fb9f6f981388de46fbf81) ) @@ -557,30 +729,42 @@ ROM_START( grchamp ) ROM_LOAD( "gm07", 0x0000, 0x1000, CRC(65dcc572) SHA1(c9b19af365fa7ade2698be0bb892591ba281ecb0) ) ROM_LOAD( "gm08", 0x1000, 0x1000, CRC(224d880c) SHA1(68aaaa0213d09cf34ba50c91d8c031d041f8a76f) ) - ROM_REGION( 0x3000, REGION_GFX1, ROMREGION_DISPOSE ) /* characters */ + ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE ) /* characters/sprites */ ROM_LOAD( "gm01", 0x0000, 0x1000, CRC(846f8e89) SHA1(346bfd69268606fde27643b4d135b481536b73b1) ) ROM_LOAD( "gm02", 0x1000, 0x1000, CRC(5911948d) SHA1(6f3a9a7f8d6a04b8e6d83756764c9c4185983d9b) ) - ROM_LOAD( "gr11", 0x2000, 0x1000, CRC(54eb3ec9) SHA1(22739240f53c708d8e53094d96916778e12beeed) ) - ROM_REGION( 0x6000, REGION_GFX2, ROMREGION_DISPOSE ) /* tiles */ + ROM_REGION( 0x2000, REGION_GFX2, ROMREGION_DISPOSE ) /* left tiles */ ROM_LOAD( "gr20", 0x0000, 0x1000, CRC(88ba2c03) SHA1(4dfd136f122663223043c6cd79566f8eeec72681) ) - ROM_LOAD( "gr21", 0x1000, 0x1000, CRC(2f77a9f3) SHA1(9e20a776c5e8c7577c3e8467d4f8ac7ac909901f) ) - ROM_LOAD( "gr13", 0x2000, 0x1000, CRC(d5e19ebd) SHA1(d0ca553eec87619ec489f7ba6238f1fdde7c480b) ) - ROM_LOAD( "gr19", 0x3000, 0x1000, CRC(ff34b444) SHA1(51c67a1691da3a2d8ddcff5fd8fa816b1f9c60c0) ) - ROM_LOAD( "gr22", 0x4000, 0x1000, CRC(31bb5fc7) SHA1(9f638e632e7c72461bedecb710ac9b30f015eebf) ) - ROM_LOAD( "gr14", 0x5000, 0x1000, CRC(d129b8e4) SHA1(db25bfde2a48e14d38a43133d88d479c3cc1397a) ) + ROM_LOAD( "gr19", 0x1000, 0x1000, CRC(ff34b444) SHA1(51c67a1691da3a2d8ddcff5fd8fa816b1f9c60c0) ) + + ROM_REGION( 0x2000, REGION_GFX3, ROMREGION_DISPOSE ) /* right tiles */ + ROM_LOAD( "gr21", 0x0000, 0x1000, CRC(2f77a9f3) SHA1(9e20a776c5e8c7577c3e8467d4f8ac7ac909901f) ) + ROM_LOAD( "gr22", 0x1000, 0x1000, CRC(31bb5fc7) SHA1(9f638e632e7c72461bedecb710ac9b30f015eebf) ) - ROM_REGION( 0x0800, REGION_GFX3, ROMREGION_DISPOSE ) /* rain */ + ROM_REGION( 0x2000, REGION_GFX4, ROMREGION_DISPOSE ) /* center tiles */ + ROM_LOAD( "gr13", 0x0000, 0x1000, CRC(d5e19ebd) SHA1(d0ca553eec87619ec489f7ba6238f1fdde7c480b) ) + ROM_LOAD( "gr14", 0x1000, 0x1000, CRC(d129b8e4) SHA1(db25bfde2a48e14d38a43133d88d479c3cc1397a) ) + + ROM_REGION( 0x0800, REGION_GFX5, 0 ) /* rain */ ROM_LOAD( "gr10", 0x0000, 0x0800, CRC(b1f0a873) SHA1(f7ef1a16556ae3e7d70209bcb38ea3ae94208789) ) - ROM_REGION( 0x0800, REGION_GFX4, 0 ) /* headlights */ + ROM_REGION( 0x0800, REGION_GFX6, 0 ) /* headlights */ ROM_LOAD( "gr12", 0x0000, 0x0800, CRC(f3bc599e) SHA1(3ec19584896a0bf10b9c5750f3c78ad3e722cc49) ) + ROM_REGION( 0x1000, REGION_GFX7, 0 ) /* player */ + ROM_LOAD( "gr11", 0x0000, 0x1000, CRC(54eb3ec9) SHA1(22739240f53c708d8e53094d96916778e12beeed) ) + ROM_REGION( 0x0040, REGION_PROMS, 0 ) ROM_LOAD( "gr23.bpr", 0x00, 0x20, CRC(41c6c48d) SHA1(8bd14b5f02f9da0a68e3125955be18462b57401d) ) /* background colors */ ROM_LOAD( "gr09.bpr", 0x20, 0x20, CRC(260fb2b9) SHA1(db0bf49f12a944613d113317d7dfea25bd7469fc) ) /* sprite/text colors */ ROM_END -/***************************************************************************/ -GAME( 1981, grchamp, 0, grchamp, grchamp, grchamp, ROT90, "Taito", "Grand Champion", GAME_IMPERFECT_SOUND ) + +/************************************* + * + * Game drivers + * + *************************************/ + +GAME( 1981, grchamp, 0, grchamp, grchamp, 0, ROT270, "Taito", "Grand Champion", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) diff --git a/src/drivers/groundfx.c b/src/drivers/groundfx.c index 56400f889..0718faf3e 100644 --- a/src/drivers/groundfx.c +++ b/src/drivers/groundfx.c @@ -96,7 +96,7 @@ static WRITE32_HANDLER( color_ram_w ) g = (a &0xff00) >> 8; b = (a &0xff); - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } } diff --git a/src/drivers/gticlub.c b/src/drivers/gticlub.c index f4d7b3122..f6b6a1505 100644 --- a/src/drivers/gticlub.c +++ b/src/drivers/gticlub.c @@ -39,20 +39,9 @@ rectangle K001005_cliprect; static WRITE32_HANDLER( paletteram32_w ) { - int r,g,b; - COMBINE_DATA(&paletteram32[offset]); data = paletteram32[offset]; - - b = ((data >> 0) & 0x1f); - g = ((data >> 5) & 0x1f); - r = ((data >> 10) & 0x1f); - - b = (b << 3) | (b >> 2); - g = (g << 3) | (g >> 2); - r = (r << 3) | (r >> 2); - - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0)); } #define MAX_K001006_CHIPS 2 diff --git a/src/drivers/gunbustr.c b/src/drivers/gunbustr.c index 59ba8dc61..57940ff82 100644 --- a/src/drivers/gunbustr.c +++ b/src/drivers/gunbustr.c @@ -75,26 +75,14 @@ static INTERRUPT_GEN( gunbustr_interrupt ) static WRITE32_HANDLER( gunbustr_palette_w ) { - int a,r,g,b; + int a; COMBINE_DATA(&paletteram32[offset]); a = paletteram32[offset] >> 16; - r = (a &0x7c00) >> 10; - g = (a &0x03e0) >> 5; - b = (a &0x001f); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - palette_set_color(offset*2,r,g,b); + palette_set_color(Machine,offset*2,pal5bit(a >> 10),pal5bit(a >> 5),pal5bit(a >> 0)); a = paletteram32[offset] &0xffff; - r = (a &0x7c00) >> 10; - g = (a &0x03e0) >> 5; - b = (a &0x001f); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - palette_set_color(offset*2+1,r,g,b); + palette_set_color(Machine,offset*2+1,pal5bit(a >> 10),pal5bit(a >> 5),pal5bit(a >> 0)); } static READ32_HANDLER( gunbustr_input_r ) diff --git a/src/drivers/hal21.c b/src/drivers/hal21.c index cf3a2ec88..849766f4d 100644 --- a/src/drivers/hal21.c +++ b/src/drivers/hal21.c @@ -163,7 +163,7 @@ PALETTE_INIT( aso ) bit3 = (color_prom[i + num_colors] >> 1) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } /* prepare shadow draw table */ @@ -333,7 +333,7 @@ VIDEO_UPDATE( aso ) attr = snk_blink_parity; snk_blink_parity ^= 0xdf; - for (i=6; i<0x80; i+=8) { palette_set_color(i, attr, attr, attr); } + for (i=6; i<0x80; i+=8) { palette_set_color(machine, i, attr, attr, attr); } hal21_draw_sprites(bitmap, spsx, spsy, Machine->gfx[2]); } diff --git a/src/drivers/halleys.c b/src/drivers/halleys.c index 0925f4498..f41d2795a 100644 --- a/src/drivers/halleys.c +++ b/src/drivers/halleys.c @@ -218,6 +218,8 @@ static int game_id, init_success, blitter_busy, collision_count, stars_enabled, static int mVectorType, sndnmi_mask, firq_level; static void *blitter_reset_timer; +static offs_t halleys_collision_detection; + //************************************************************************** // MB1551x Blitter Functions @@ -1038,7 +1040,7 @@ static READ8_HANDLER( collision_id_r ) UPDATE: re-implemented pixel collision to accompany the hack method. */ - if (game_id==GAME_HALLEYS && activecpu_get_pc()==0xb114) // HACK: collision detection bypass + if (game_id==GAME_HALLEYS && activecpu_get_pc()==halleys_collision_detection) // HACK: collision detection bypass { if (collision_count) { collision_count--; return(collision_list[collision_count]); } @@ -1060,7 +1062,7 @@ static PALETTE_INIT( halleys ) for (count=0; count<1024; count++) { pal_ptr[count] = 0; - palette_set_color(count, 0, 0, 0); + palette_set_color(machine, count, 0, 0, 0); } // 00-31: palette RAM(ffc0-ffdf) @@ -1081,7 +1083,7 @@ static PALETTE_INIT( halleys ) g = r + count + BG_MONO; r += i; pal_ptr[g] = d; - palette_set_color(g, r, r, r); + palette_set_color(machine, g, r, r, r); } } @@ -1092,11 +1094,11 @@ static PALETTE_INIT( halleys ) pal_ptr[j] = j; i = d>>6 & 0x03; - r = d>>2 & 0x0c; r |= i; r = r<<4 | r; - g = d & 0x0c; g |= i; g = g<<4 | g; - b = d<<2 & 0x0c; b |= i; b = b<<4 | b; + r = d>>2 & 0x0c; r |= i; + g = d & 0x0c; g |= i; + b = d<<2 & 0x0c; b |= i; - palette_set_color(j, r, g, b); + palette_set_color(machine, j, pal4bit(r), pal4bit(g), pal4bit(b)); } } @@ -1164,13 +1166,13 @@ static WRITE8_HANDLER( halleys_paletteram_IIRRGGBB_w ) g = d & 0x0c; g |= i; g = g<<4 | g; b = d<<2 & 0x0c; b |= i; b = b<<4 | b; - palette_set_color(offset, r, g, b); - palette_set_color(offset+SP_2BACK, r, g, b); - palette_set_color(offset+SP_ALPHA, r, g, b); - palette_set_color(offset+SP_COLLD, r, g, b); + palette_set_color(Machine, offset, r, g, b); + palette_set_color(Machine, offset+SP_2BACK, r, g, b); + palette_set_color(Machine, offset+SP_ALPHA, r, g, b); + palette_set_color(Machine, offset+SP_COLLD, r, g, b); halleys_decode_rgb(&r, &g, &b, offset, 0); - palette_set_color(offset+0x20, r, g, b); + palette_set_color(Machine, offset+0x20, r, g, b); } @@ -1936,7 +1938,7 @@ static MACHINE_RESET( halleys ) blitter_busy = 0; collision_count = 0; stars_enabled = 0; - bgcolor = get_black_pen(); + bgcolor = get_black_pen(machine); fftail = ffhead = ffcount = 0; memset(io_ram, 0xff, io_ramsize); @@ -2244,6 +2246,15 @@ static DRIVER_INIT( benberob ) static DRIVER_INIT( halleys ) { game_id = GAME_HALLEYS; + halleys_collision_detection = 0xb114; + + init_success = init_common(); +} + +static DRIVER_INIT( halley87 ) +{ + game_id = GAME_HALLEYS; + halleys_collision_detection = 0xb10d; init_success = init_common(); } @@ -2252,8 +2263,8 @@ static DRIVER_INIT( halleys ) //************************************************************************** // Game Definitions -GAME( 1984, benberob, 0, benberob, benberob, benberob, ROT0, "Taito", "Ben Bero Beh (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_COLORS ) -GAME( 1986, halleys, 0, halleys, halleys, halleys, ROT90, "Taito America Corporation (Coin-It license)", "Halley's Comet (US)", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) -GAME( 1986, halleysc, halleys, halleys, halleys, halleys, ROT90, "Taito Corporation", "Halley's Comet (Japan, Newer)", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) -GAME( 1986, halleycj, halleys, halleys, halleys, halleys, ROT90, "Taito Corporation", "Halley's Comet (Japan, Older)", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) -GAME( 1986, halley87, halleys, halleys, halleys, halleys, ROT90, "Taito Corporation", "Halley's Comet '87", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL | GAME_NOT_WORKING ) /* No Collision detection */ +GAME( 1984, benberob, 0, benberob, benberob, benberob, ROT0, "Taito", "Ben Bero Beh (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_COLORS ) +GAME( 1986, halleys, 0, halleys, halleys, halleys, ROT90, "Taito America Corporation (Coin-It license)", "Halley's Comet (US)", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) +GAME( 1986, halleysc, halleys, halleys, halleys, halleys, ROT90, "Taito Corporation", "Halley's Comet (Japan, Newer)", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) +GAME( 1986, halleycj, halleys, halleys, halleys, halleys, ROT90, "Taito Corporation", "Halley's Comet (Japan, Older)", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) +GAME( 1986, halley87, halleys, halleys, halleys, halley87, ROT90, "Taito Corporation", "Halley's Comet '87", GAME_IMPERFECT_GRAPHICS | GAME_NO_COCKTAIL ) diff --git a/src/drivers/hanaroku.c b/src/drivers/hanaroku.c index 3c9519d03..466cbfbaa 100644 --- a/src/drivers/hanaroku.c +++ b/src/drivers/hanaroku.c @@ -31,7 +31,7 @@ PALETTE_INIT( hanaroku ) g = ((color_prom[i*2+1] & 0xe0) | ( (color_prom[i*2+0]& 0x03) <<8) ) >> 5; r = (color_prom[i*2+0]&0x7c) >> 2; - palette_set_color(i,r<<3,g<<3,b<<3); + palette_set_color(machine,i,pal5bit(r),pal5bit(g),pal5bit(b)); } } diff --git a/src/drivers/harddriv.c b/src/drivers/harddriv.c index 3749abf9f..32b872ba4 100644 --- a/src/drivers/harddriv.c +++ b/src/drivers/harddriv.c @@ -3183,14 +3183,14 @@ ROM_END /* COMMON INIT: find all the CPUs */ static void find_cpus(void) { - hdcpu_main = mame_find_cpu_index("main"); - hdcpu_gsp = mame_find_cpu_index("gsp"); - hdcpu_msp = mame_find_cpu_index("msp"); - hdcpu_adsp = mame_find_cpu_index("adsp"); - hdcpu_sound = mame_find_cpu_index("sound"); - hdcpu_sounddsp = mame_find_cpu_index("sounddsp"); - hdcpu_jsa = mame_find_cpu_index("jsa"); - hdcpu_dsp32 = mame_find_cpu_index("dsp32"); + hdcpu_main = mame_find_cpu_index(Machine, "main"); + hdcpu_gsp = mame_find_cpu_index(Machine, "gsp"); + hdcpu_msp = mame_find_cpu_index(Machine, "msp"); + hdcpu_adsp = mame_find_cpu_index(Machine, "adsp"); + hdcpu_sound = mame_find_cpu_index(Machine, "sound"); + hdcpu_sounddsp = mame_find_cpu_index(Machine, "sounddsp"); + hdcpu_jsa = mame_find_cpu_index(Machine, "jsa"); + hdcpu_dsp32 = mame_find_cpu_index(Machine, "dsp32"); } diff --git a/src/drivers/hng64.c b/src/drivers/hng64.c index ce19bf43f..b3f18a5a4 100644 --- a/src/drivers/hng64.c +++ b/src/drivers/hng64.c @@ -602,7 +602,7 @@ WRITE32_HANDLER( hng64_videoram_w ) READ32_HANDLER( hng64_random_reader ) { - return 0 ; // return mame_rand()&0xffffffff; + return 0 ; // return mame_rand(Machine)&0xffffffff; } @@ -630,13 +630,13 @@ static WRITE32_HANDLER( hng64_pal_w ) a = ((paletteram32[offset] & 0xff000000) >>24); // a sure ain't alpha ??? - // alpha_set_level(mame_rand()) ; + // alpha_set_level(mame_rand(Machine)) ; // printf("Alpha : %d %d %d %d\n", a, b, g, r) ; // if (a != 0) // popmessage("Alpha is not zero!") ; - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } @@ -649,7 +649,7 @@ static READ32_HANDLER( hng64_port_read ) if(offset==0x441) return hng64_interrupt_level_request; - return 0 ; // return mame_rand(); + return 0 ; // return mame_rand(Machine); } @@ -1291,13 +1291,13 @@ DRIVER_INIT( hng64 ) DRIVER_INIT(hng64_fght) { no_machine_error_code=0x01010101; - init_hng64(); + init_hng64(machine); } DRIVER_INIT(hng64_race) { no_machine_error_code=0x02020202; - init_hng64(); + init_hng64(machine); } diff --git a/src/drivers/hornet.c b/src/drivers/hornet.c index abec439b0..c6e3930b6 100644 --- a/src/drivers/hornet.c +++ b/src/drivers/hornet.c @@ -323,18 +323,8 @@ void K037122_tile_draw(mame_bitmap *bitmap, const rectangle *cliprect) static void update_palette_color(UINT32 palette_base, int color) { - int r,g,b; UINT32 data = K037122_tile_ram[(palette_base/4) + color]; - - r = ((data >> 6) & 0x1f); - g = ((data >> 0) & 0x3f); - b = ((data >> 11) & 0x1f); - - b = (b << 3) | (b >> 2); - g = (g << 2) | (g >> 3); - r = (r << 3) | (r >> 2); - - palette_set_color(color, r, g, b); + palette_set_color(Machine, color, pal5bit(data >> 6), pal5bit(data >> 0), pal5bit(data >> 11)); } READ32_HANDLER(K037122_sram_r) @@ -1062,7 +1052,7 @@ static DRIVER_INIT(gradius4) backup_ram[0x0f] = 0xd7; // checksum voodoo_version = 0; - init_hornet(); + init_hornet(machine); } static DRIVER_INIT(nbapbp) @@ -1096,7 +1086,7 @@ static DRIVER_INIT(nbapbp) backup_ram[0x0f] = (checksum >> 0) & 0xff; // checksum voodoo_version = 0; - init_hornet(); + init_hornet(machine); } static DRIVER_INIT(sscope) @@ -1130,7 +1120,7 @@ static DRIVER_INIT(sscope) backup_ram[0x0f] = (checksum >> 0) & 0xff; // checksum voodoo_version = 0; - init_hornet_2board(); + init_hornet_2board(machine); } static DRIVER_INIT(sscope2) @@ -1192,7 +1182,7 @@ static DRIVER_INIT(sscope2) backup_ram[0x1f4f] = (checksum >> 0) & 0xff; // checksum voodoo_version = 1; - init_hornet_2board(); + init_hornet_2board(machine); } /*****************************************************************************/ diff --git a/src/drivers/hotblock.c b/src/drivers/hotblock.c index e234d04d7..df32db719 100644 --- a/src/drivers/hotblock.c +++ b/src/drivers/hotblock.c @@ -127,17 +127,12 @@ VIDEO_UPDATE(hotblock) int i; static int xxx=320,yyy=204; - fillbitmap(bitmap, get_black_pen(), 0); + fillbitmap(bitmap, get_black_pen(machine), 0); for (i=0;i<256;i++) { - int dat,r,g,b; - dat=(hotblock_pal[i*2+1]<<8)|hotblock_pal[i*2]; - - b = (dat>>10)&0x1f; - g = (dat>>5)&0x1f; - r = (dat>>0)&0x1f; - palette_set_color(i,r*8,g*8,b*8); + int dat=(hotblock_pal[i*2+1]<<8)|hotblock_pal[i*2]; + palette_set_color(machine,i,pal5bit(dat>>0),pal5bit(dat>>5),pal5bit(dat>>10)); } count=0; diff --git a/src/drivers/hshavoc.c b/src/drivers/hshavoc.c index cdd7d5991..55a31f55a 100644 --- a/src/drivers/hshavoc.c +++ b/src/drivers/hshavoc.c @@ -321,7 +321,7 @@ DRIVER_INIT(hshavoc) - init_genesis(); + init_genesis(machine); } diff --git a/src/drivers/hyhoo.c b/src/drivers/hyhoo.c index 07aab47bc..d161fbb3e 100644 --- a/src/drivers/hyhoo.c +++ b/src/drivers/hyhoo.c @@ -48,14 +48,14 @@ static DRIVER_INIT( hyhoo ) { nb1413m3_type = NB1413M3_HYHOO; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( hyhoo2 ) { nb1413m3_type = NB1413M3_HYHOO2; - init_nb1413m3(); + init_nb1413m3(machine); } diff --git a/src/drivers/igs_blit.c b/src/drivers/igs_blit.c index 28eea3b00..a9885cc5b 100644 --- a/src/drivers/igs_blit.c +++ b/src/drivers/igs_blit.c @@ -136,7 +136,7 @@ VIDEO_UPDATE(igs) #ifdef MAME_DEBUG if ((layer_enable != -1) && (pri_addr == 0xff)) - plot_pixel( bitmap, x,y, get_black_pen() ); + plot_pixel( bitmap, x,y, get_black_pen(machine) ); else #endif plot_pixel( bitmap, x,y, layer[l][scr_addr] | (l << 8) ); @@ -353,21 +353,12 @@ IGS_INPUT_RW( 5 ) static WRITE16_HANDLER( igs_palette_w ) { - int r,g,b, rgb; + int rgb; COMBINE_DATA(&paletteram16[offset]); rgb = (paletteram16[offset & 0x7ff] & 0xff) | ((paletteram16[offset | 0x800] & 0xff) << 8); - - r = (rgb >> 0) & 0x1f; - g = (rgb >> 5) & 0x1f; - b = (rgb >> 10) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset & 0x7ff,r,g,b); + palette_set_color(Machine,offset & 0x7ff,pal5bit(rgb >> 0),pal5bit(rgb >> 5),pal5bit(rgb >> 10)); } @@ -1907,7 +1898,145 @@ INPUT_PORTS_START( vbowl ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, "Sexy Interlude" ) + PORT_DIPNAME( 0x10, 0x10, "Special Picture" ) /* Sexy Interlude pics */ + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x20, 0x20, "Open Pitcure" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Yes ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Controls ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Joystick ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Trackball ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Free_Play ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START // IN1 - DSW2 + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x03, DEF_STR( Easy ) ) // 5 + PORT_DIPSETTING( 0x02, DEF_STR( Normal ) ) // 7 + PORT_DIPSETTING( 0x01, DEF_STR( Medium ) ) // 9 + PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) // 11 + PORT_DIPNAME( 0x04, 0x04, "Spares To Win (Frames 1-5)" ) + PORT_DIPSETTING( 0x04, "3" ) + PORT_DIPSETTING( 0x00, "4" ) + PORT_DIPNAME( 0x18, 0x18, "Points To Win (Frames 6-10)" ) + PORT_DIPSETTING( 0x18, "160" ) + PORT_DIPSETTING( 0x10, "170" ) + PORT_DIPSETTING( 0x08, "180" ) + PORT_DIPSETTING( 0x00, "190" ) + 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 - DSW3 + PORT_DIPNAME( 0x03, 0x03, "Cabinet ID" ) + PORT_DIPSETTING( 0x03, "1" ) + PORT_DIPSETTING( 0x02, "2" ) + PORT_DIPSETTING( 0x01, "3" ) + PORT_DIPSETTING( 0x00, "4" ) + PORT_DIPNAME( 0x04, 0x04, "Linked Cabinets" ) + 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_SERVICE( 0x80, IP_ACTIVE_LOW ) + + PORT_START // IN3 - DSW4 + 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( 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_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 ) + 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 // IN5 + 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_DOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) + + PORT_START // IN6 + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + + PORT_START // IN7 + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(1) + + PORT_START // IN8 + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(1) +INPUT_PORTS_END + + +INPUT_PORTS_START( vbowlj ) + PORT_START // IN0 - DSW1 + PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_5C ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "Special Picture" ) /* Sexy Interlude pics */ PORT_DIPSETTING( 0x00, DEF_STR( No ) ) PORT_DIPSETTING( 0x10, DEF_STR( Yes ) ) PORT_DIPNAME( 0x20, 0x20, DEF_STR( Controls ) ) @@ -2506,14 +2635,14 @@ static DRIVER_INIT( lhb ) -// To do: + DRIVER_INIT( vbowl ) { -// UINT16 *rom = (UINT16 *) memory_region(REGION_CPU1); + UINT16 *rom = (UINT16 *) memory_region(REGION_CPU1); UINT8 *gfx = (UINT8 *) memory_region(REGION_GFX1); int i; - vbowl_decrypt(); + vbowlj_decrypt(); for (i = 0x400000-1; i >= 0; i--) { @@ -2522,7 +2651,7 @@ DRIVER_INIT( vbowl ) } // PROTECTION CHECKS -// rom[0x37b4/2] = 0x4e75; // 0037B4: 4E56 0000 link A6, #$0 + rom[0x3764/2] = 0x4e75; // 003764: 4E56 0000 link A6, #$0 } DRIVER_INIT( vbowlj ) @@ -2540,7 +2669,7 @@ DRIVER_INIT( vbowlj ) } // PROTECTION CHECKS - rom[0x37b4/2] = 0x4e75; // 0037B4: 4E56 0000 link A6, #$0 + rom[0x37b4/2] = 0x4e75; // 0037B4: 4E56 0000 link A6, #$0 } @@ -2782,6 +2911,9 @@ there are 4 banks of 8 dip switches ROM_START( vbowl ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) + /* + This version reboots at the end of the game. Is this a bad dump?? Don't think it's a protection check + */ ROM_LOAD( "bowlingv101xcm.u45", 0x00000, 0x80000, CRC(ab8e3f1f) SHA1(69159e22559d6a26fe2afafd770aa640c192ba4b) ) ROM_REGION( 0x800000, REGION_GFX1, 0) @@ -2856,7 +2988,7 @@ GAME( 1995, chugokur, drgnwrld, chindrag, chindrag, chugokur, ROT0, "IGS / ALTA" GAME( 1996, chmplst2, 0, chmplst2, chmplst2, chmplst2, ROT0, "IGS", "Long Hu Bang II", GAME_IMPERFECT_GRAPHICS ) GAME( 1996, xymg, 0, xymg, xymg, xymg, ROT0, "IGS", "Xing Yen Man Guan (V651C)", GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING ) GAME( 1996, grtwall, xymg, grtwall, grtwall, grtwall, ROT0, "IGS", "Wan Li Chang Cheng (V638C)", GAME_IMPERFECT_GRAPHICS ) -GAME( 1996, vbowl, 0, vbowl, vbowl, vbowlj, ROT0, "Alta / IGS", "Virtua Bowling (World, V101XCM)", GAME_NOT_WORKING ) -GAME( 1996, vbowlj, vbowl, vbowl, vbowl, vbowlj, ROT0, "Alta / IGS", "Virtua Bowling (Japan, V100JCM)", GAME_IMPERFECT_SOUND ) +GAME( 1996, vbowl, 0, vbowl, vbowl, vbowl, ROT0, "Alta / IGS", "Virtua Bowling (World, V101XCM)", GAME_IMPERFECT_SOUND ) /* Bad dump?? it reboots at end of game */ +GAME( 1996, vbowlj, vbowl, vbowl, vbowlj, vbowlj, ROT0, "Alta / IGS", "Virtua Bowling (Japan, V100JCM)", GAME_IMPERFECT_SOUND ) GAME( 1997, drgnwrld, 0, chindrag, drgnwrld, drgnwrld, ROT0, "IGS", "Dragon World (World, V0400)", 0 ) GAME( 1995, drgwrld3, drgnwrld, chindrag, drgnwrld, drgnwrld, ROT0, "IGS", "Dragon World (World, V0300)", 0 ) diff --git a/src/drivers/intrscti.c b/src/drivers/intrscti.c index 53d74fc40..9612ad48a 100644 --- a/src/drivers/intrscti.c +++ b/src/drivers/intrscti.c @@ -15,7 +15,7 @@ I've not had a chance to wire up the board yet, but it might be possible to writ static READ8_HANDLER( unk_r ) { - return mame_rand(); + return mame_rand(Machine); } UINT8 *intrscti_ram; @@ -71,7 +71,7 @@ VIDEO_UPDATE(intrscti) int y,x; int count; - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); count = 0; for (y=0;y<64;y++) diff --git a/src/drivers/itech32.c b/src/drivers/itech32.c index 3962df283..73bf1e55e 100644 --- a/src/drivers/itech32.c +++ b/src/drivers/itech32.c @@ -12,7 +12,7 @@ * Hard Yardage (2 sets) * Pairs (2 sets) * Driver's Edge (1 set) - * World Class Bowling (6 sets) + * World Class Bowling (7 sets) * Street Fighter: The Movie (4 sets) * Shuffleshot (3 sets) * Golden Tee 3D Golf (11 sets) @@ -64,7 +64,7 @@ with a 3Dfx video card and is hard drive based. This series starts with GT Fore! in 2000 and continues through 2005, it is also I.T.'s current gaming platform. Some time in 2004 I.T. introduced a new bowling game called Silver Strike Bowling on a full blown PC type - system to replace it's aging World Class Bowling game. + system to replace it's aging World Class Bowling game. Later versions of games (Golden Tee Golf, Shuffle Shot & World Class Bowling) converged to a single platform, the large single PCB @@ -327,7 +327,7 @@ static MACHINE_RESET( itech32 ) static MACHINE_RESET( drivedge ) { - machine_reset_itech32(); + machine_reset_itech32(machine); cpunum_set_input_line(2, INPUT_LINE_RESET, ASSERT_LINE); cpunum_set_input_line(3, INPUT_LINE_RESET, ASSERT_LINE); @@ -815,8 +815,8 @@ static NVRAM_HANDLER( itech020 ) static NVRAM_HANDLER( gt3dt ) { - nvram_handler_itech020( file, read_or_write ); - nvram_handler_timekeeper_0( file, read_or_write ); + nvram_handler_itech020( machine, file, read_or_write ); + nvram_handler_timekeeper_0( machine, file, read_or_write ); } /************************************* @@ -2014,7 +2014,7 @@ ROM_START( wcbowldx ) /* Deluxe version 2.00 (PCB P/N 1082 Rev 2) */ ROM_END -ROM_START( wcbowl ) /* Version 1.66 (PCB P/N 1082 Rev 2) */ +ROM_START( wcbowl ) /* Version 1.66 (PCB P/N 1082 Rev 2) */ ROM_REGION32_BE( CODE_SIZE, REGION_USER1, 0 ) ROM_LOAD32_BYTE( "wcb_prm0.166", 0x00000, 0x20000, CRC(f6774112) SHA1(cb09bb3e40490b3cdc3a5f7d18168384b5b29d85) ) ROM_LOAD32_BYTE( "wcb_prm1.166", 0x00001, 0x20000, CRC(931821ae) SHA1(328cd78ba70fe3cb0bdbc53833fe6fb153aceaea) ) @@ -2146,17 +2146,58 @@ ROM_START( wcbwl140 ) /* Version 1.40 Tournament (PCB P/N 1082 Rev 2) */ ROM_END -ROM_START( wcbwl12 ) /* Version 1.2 (unique Hardware, 3-tier type board) */ - /* v1.0, v1.3 & v1.5 for this platform have been confirmed, but not dumped */ +ROM_START( wcbwl15 ) /* Version 1.5 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) */ + /* v1.0 & v1.3 for this platform have been confirmed, but not dumped */ ROM_REGION16_BE( 0x40000, REGION_USER1, 0 ) - ROM_LOAD16_BYTE( "wcb_prgm.u83", 0x00000, 0x20000, CRC(0602c5ce) SHA1(4339f77301f9c607c6f1dc81270d03681e874e69) ) - ROM_LOAD16_BYTE( "wcb_prgm.u88", 0x00001, 0x20000, CRC(49573493) SHA1(42813573f4ab951cd830193c0ffe2ce7d79c354b) ) + ROM_LOAD16_BYTE( "wcb_v15.u83", 0x00000, 0x20000, CRC(3ca9ab85) SHA1(364946dceb3f7279b7d67d9d685a98ba7f4901aa) ) /* Labeled as "WCB V1.5 (U83)" */ + ROM_LOAD16_BYTE( "wcb_v15.u88", 0x00001, 0x20000, CRC(d43e6fad) SHA1(fd72f6945e7f5ef86dc28503749d18086dd29906) ) /* Labeled as "WCB V1.5 (U88)" */ ROM_REGION( 0x28000, REGION_CPU2, 0 ) - ROM_LOAD( "wcb_snd.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) + ROM_LOAD( "wcb_snd2.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) /* Labeled as "WCB SND V2.0" */ ROM_CONTINUE( 0x08000, 0x08000 ) ROM_REGION( 0x880000, REGION_GFX1, 0 ) + /* No known set specificly checks for this, however the GROM data may be in the form of four 8 Meg roms: + ROM_LOAD32_BYTE( "wcb8grom.0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect + ROM_LOAD32_BYTE( "wcb8grom.0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) ) + ROM_LOAD32_BYTE( "wcb8grom.0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) ) + ROM_LOAD32_BYTE( "wcb8grom.0_3", 0x000003, 0x100000, CRC(0348a7f0) SHA1(462f77514c0e9a28da63732a4f31e9483d4c483e) ) + */ + ROM_LOAD32_BYTE( "wcb_grm0.0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) + ROM_LOAD32_BYTE( "wcb_grm0.1", 0x000001, 0x080000, CRC(e26dcedb) SHA1(15441b97dd3d50d28007062fe28841fa3f762ec9) ) + ROM_LOAD32_BYTE( "wcb_grm0.2", 0x000002, 0x080000, CRC(32735875) SHA1(4017a8577d8efa8c5b95bd30723ebbf6ecaeba2b) ) + ROM_LOAD32_BYTE( "wcb_grm0.3", 0x000003, 0x080000, CRC(019d0ab8) SHA1(3281eada296ad746da80ef6e5909c50b03b90d08) ) + ROM_LOAD32_BYTE( "wcb_grm1.0", 0x200000, 0x080000, CRC(8bd31762) SHA1(a7274c8173b4fb04a6aed0b6a622b52a811a8c83) ) + ROM_LOAD32_BYTE( "wcb_grm1.1", 0x200001, 0x080000, CRC(b3f761fc) SHA1(5880ca1423cea9a7ca3d0875c8db33787f4056d4) ) + ROM_LOAD32_BYTE( "wcb_grm1.2", 0x200002, 0x080000, CRC(c22f44ad) SHA1(b25b11346ee1812b2be79105faf64faa0302c105) ) + ROM_LOAD32_BYTE( "wcb_grm1.3", 0x200003, 0x080000, CRC(036084c4) SHA1(6d2e402d2f4565e037a2676ba676e4b1da2b5dfe) ) + ROM_FILL( 0x400000, 0x480000, 0xff ) + + ROM_REGION16_BE( 0x400000, REGION_SOUND1, ROMREGION_ERASE00 ) + ROM_LOAD16_BYTE( "ensoniq.2mx", 0x000000, 0x200000, CRC(0814ab80) SHA1(e92525f7cf58cf480510c278fea705f67225e58f) ) /* Ensoniq 2MX16U 1350901801 */ + + ROM_REGION16_BE( 0x400000, REGION_SOUND3, ROMREGION_ERASE00 ) + ROM_LOAD16_BYTE( "wcb_srm.0", 0x000000, 0x080000, CRC(115bcd1f) SHA1(c321bf3145c11de1351c8f9cd554ab3d6600e854) ) + ROM_LOAD16_BYTE( "wcb_srm.1", 0x100000, 0x080000, CRC(87a4a4d8) SHA1(60db2f466686481857eb39b90ac7a19d0a96adac) ) +ROM_END + + +ROM_START( wcbwl12 ) /* Version 1.2 (3-tier board set: P/N 1059 Rev 3, P/N 1079 Rev 1 & P/N 1060 Rev 0) */ + ROM_REGION16_BE( 0x40000, REGION_USER1, 0 ) + ROM_LOAD16_BYTE( "wcb_v12.u83", 0x00000, 0x20000, CRC(0602c5ce) SHA1(4339f77301f9c607c6f1dc81270d03681e874e69) ) /* Labeled as "WCB V1.2 (U83)" */ + ROM_LOAD16_BYTE( "wcb_v12.u88", 0x00001, 0x20000, CRC(49573493) SHA1(42813573f4ab951cd830193c0ffe2ce7d79c354b) ) /* Labeled as "WCB V1.2 (U88)" */ + + ROM_REGION( 0x28000, REGION_CPU2, 0 ) + ROM_LOAD( "wcb_snd2.u17", 0x10000, 0x18000, CRC(c14907ba) SHA1(e52fb87c1f9b5847efc0ef15eb7e6c04dcf38110) ) /* Labeled as "WCB SND V2.0" */ + ROM_CONTINUE( 0x08000, 0x08000 ) + + ROM_REGION( 0x880000, REGION_GFX1, 0 ) + /* No known set specificly checks for this, however the GROM data may be in the form of four 8 Meg roms: + ROM_LOAD32_BYTE( "wcb8grom.0_0", 0x000000, 0x100000, CRC(40837737) SHA1(f073943ec6f84285a8559553fb292ec1f8a629d0) ) Labeled as "WCB GROM0_0 *" ect + ROM_LOAD32_BYTE( "wcb8grom.0_1", 0x000001, 0x100000, CRC(1615aee8) SHA1(6184919371a894b1d6f2e06a2b328cb55abed4a9) ) + ROM_LOAD32_BYTE( "wcb8grom.0_2", 0x000002, 0x100000, CRC(d8e0b06e) SHA1(4981c0cf16df68a1b4da7ebf65ca587c21292478) ) + ROM_LOAD32_BYTE( "wcb8grom.0_3", 0x000003, 0x100000, CRC(0348a7f0) SHA1(462f77514c0e9a28da63732a4f31e9483d4c483e) ) + */ ROM_LOAD32_BYTE( "wcb_grm0.0", 0x000000, 0x080000, CRC(5d79aaae) SHA1(e1bf5c46843f69b8bac41dde73d89ba59b4c8b7f) ) ROM_LOAD32_BYTE( "wcb_grm0.1", 0x000001, 0x080000, CRC(e26dcedb) SHA1(15441b97dd3d50d28007062fe28841fa3f762ec9) ) ROM_LOAD32_BYTE( "wcb_grm0.2", 0x000002, 0x080000, CRC(32735875) SHA1(4017a8577d8efa8c5b95bd30723ebbf6ecaeba2b) ) @@ -3537,7 +3578,7 @@ ROM_END * *************************************/ -static void init_program_rom(void) +static void init_program_rom(running_machine *machine) { memcpy(main_ram, main_rom, 0x80); } @@ -3545,7 +3586,7 @@ static void init_program_rom(void) static DRIVER_INIT( timekill ) { - init_program_rom(); + init_program_rom(machine); via_config(0, &via_interface); via_set_clock(0, CLOCK_8MHz/4); itech32_vram_height = 512; @@ -3556,7 +3597,7 @@ static DRIVER_INIT( timekill ) static DRIVER_INIT( hardyard ) { - init_program_rom(); + init_program_rom(machine); via_config(0, &via_interface); via_set_clock(0, CLOCK_8MHz/4); itech32_vram_height = 1024; @@ -3567,7 +3608,7 @@ static DRIVER_INIT( hardyard ) static DRIVER_INIT( bloodstm ) { - init_program_rom(); + init_program_rom(machine); via_config(0, &via_interface); via_set_clock(0, CLOCK_8MHz/4); itech32_vram_height = 1024; @@ -3578,7 +3619,7 @@ static DRIVER_INIT( bloodstm ) static DRIVER_INIT( drivedge ) { - init_program_rom(); + init_program_rom(machine); via_config(0, &drivedge_via_interface); via_set_clock(0, CLOCK_8MHz/4); itech32_vram_height = 1024; @@ -3592,7 +3633,13 @@ static DRIVER_INIT( drivedge ) static DRIVER_INIT( wcbowl ) { - init_program_rom(); + /* + This is the 3 tier PCB set: + Main P/N 1059 Rev 3 (see Hot Memory PCB layout above) + ROM P/N 1079 Rev 1 (contains graphic roms, 4MHz OSC + ITBWL-1 security PIC chip) + Sound P/N 1060 Rev 0 (see Hot Memory PCB layout above) + */ + init_program_rom(machine); via_config(0, &via_interface); via_set_clock(0, CLOCK_8MHz/4); itech32_vram_height = 1024; @@ -3606,9 +3653,9 @@ static DRIVER_INIT( wcbowl ) } -static void init_sftm_common(int prot_addr) +static void init_sftm_common(running_machine *machine, int prot_addr) { - init_program_rom(); + init_program_rom(machine); itech32_vram_height = 1024; itech32_planes = 1; is_drivedge = 0; @@ -3622,24 +3669,24 @@ static void init_sftm_common(int prot_addr) static DRIVER_INIT( sftm ) { - init_sftm_common(0x7a6a); + init_sftm_common(machine, 0x7a6a); } static DRIVER_INIT( sftm110 ) { - init_sftm_common(0x7a66); + init_sftm_common(machine, 0x7a66); } -static void init_shuffle_bowl_common(int prot_addr) +static void init_shuffle_bowl_common(running_machine *machine, int prot_addr) { /* The newest versions of World Class Bowling are on the same exact platform as Shuffle Shot. So We'll use the same general INIT routine for these two programs. IE: PCB P/N 1082 Rev 2 */ - init_program_rom(); + init_program_rom(machine); itech32_vram_height = 1024; itech32_planes = 1; is_drivedge = 0; @@ -3655,29 +3702,29 @@ static void init_shuffle_bowl_common(int prot_addr) static DRIVER_INIT( shufshot ) /* PIC 16C54 labeled as ITSHF-1 (ITBWL-4 for WCB Deluxe) */ { - init_shuffle_bowl_common(0x111a); + init_shuffle_bowl_common(machine, 0x111a); } static DRIVER_INIT( wcbowln ) /* PIC 16C54 labeled as ITBWL-3 */ { /* The security PROM is NOT interchangable between the Deluxe and "normal" versions. */ - init_shuffle_bowl_common(0x1116); + init_shuffle_bowl_common(machine, 0x1116); } static DRIVER_INIT( wcbowlt ) /* PIC 16C54 labeled as ITBWL-4 */ { /* Tournament Version */ - init_shuffle_bowl_common(0x111a); + init_shuffle_bowl_common(machine, 0x111a); timekeeper_init( 0, TIMEKEEPER_M48T02, NULL ); memory_install_read32_handler (0, ADDRESS_SPACE_PROGRAM, 0x681000, 0x6817ff, 0, 0, timekeeper_0_32be_r); memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x681000, 0x6817ff, 0, 0, timekeeper_0_32be_w); } -static void init_gt_common(void) +static void init_gt_common(running_machine *machine) { - init_program_rom(); + init_program_rom(machine); itech32_vram_height = 1024; itech32_planes = 2; is_drivedge = 0; @@ -3696,7 +3743,7 @@ static DRIVER_INIT( gt3d ) through GTClassic. This is _NOT_ a factory modification */ memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x200000, 0x200003, 0, 0, trackball32_8bit_r); - init_gt_common(); + init_gt_common(machine); } @@ -3710,7 +3757,7 @@ static DRIVER_INIT( aama ) */ memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x180800, 0x180803, 0, 0, trackball32_4bit_r); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x181000, 0x181003, 0, 0, trackball32_4bit_p2_r); - init_gt_common(); + init_gt_common(machine); } @@ -3719,7 +3766,7 @@ static DRIVER_INIT( aamat ) /* Tournament Version */ - init_aama(); + init_aama(machine); timekeeper_init( 0, TIMEKEEPER_M48T02, NULL ); memory_install_read32_handler (0, ADDRESS_SPACE_PROGRAM, 0x681000, 0x6817ff, 0, 0, timekeeper_0_32be_r); memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x681000, 0x6817ff, 0, 0, timekeeper_0_32be_w); @@ -3735,7 +3782,7 @@ static DRIVER_INIT( s_ver ) Trackball info is read through 200202 (actually 200203). */ memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x200200, 0x200203, 0, 0, trackball32_4bit_r); - init_gt_common(); + init_gt_common(machine); } @@ -3749,7 +3796,7 @@ static DRIVER_INIT( gt3dl ) Player 2 trackball read through 200002 */ memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x200000, 0x200003, 0, 0, trackball32_4bit_combined_r); - init_gt_common(); + init_gt_common(machine); } @@ -3757,7 +3804,7 @@ static DRIVER_INIT( gtclassp ) { /* a little extra protection */ memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x680000, 0x680003, 0, 0, gtclass_prot_result_r); - init_aama(); + init_aama(machine); /* The protection code is: @@ -3797,6 +3844,7 @@ GAME( 1995, wcbowl, 0, sftm, wcbowln, wcbowln, ROT0, "Incredible GAME( 1995, wcbwl165, wcbowl, sftm, shufbowl, wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.65)" , 0) /* PIC 16C54 labeled as ITBWL-3 */ GAME( 1995, wcbwl161, wcbowl, sftm, shufbowl, wcbowln, ROT0, "Incredible Technologies", "World Class Bowling (v1.61)" , 0) /* PIC 16C54 labeled as ITBWL-3 */ GAME( 1997, wcbwl140, wcbowldx, wcbowlt, wcbowldx, wcbowlt, ROT0, "Incredible Technologies", "World Class Bowling Tournament (v1.40)" , 0) /* PIC 16C54 labeled as ITBWL-4 */ +GAME( 1995, wcbwl15, wcbowl, wcbowl, wcbowl, wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.5)" , 0) /* PIC 16C54 labeled as ITBWL-1 */ GAME( 1995, wcbwl12, wcbowl, wcbowl, wcbowl, wcbowl, ROT0, "Incredible Technologies", "World Class Bowling (v1.2)" , 0) /* PIC 16C54 labeled as ITBWL-1 */ GAME( 1995, sftm, 0, sftm, sftm, sftm, ROT0, "Capcom/Incredible Technologies", "Street Fighter: The Movie (v1.12)" , 0) /* PIC 16C54 labeled as ITSF-1 */ GAME( 1995, sftm111, sftm, sftm, sftm, sftm110, ROT0, "Capcom/Incredible Technologies", "Street Fighter: The Movie (v1.11)" , 0) /* PIC 16C54 labeled as ITSF-1 */ @@ -3840,6 +3888,11 @@ GAME( 1999, wcbowldx, 0, sftm, wcbowldx, shufshot, ROT0, "Incredible GT Diamond Edition Tournament is a Euro GT Classic (Not currently dumped) This would be the only known tournament version of Classic +NOTE: There is an "8 Meg board" version of the P/N 1082 Rev 2 PCB, so GROM0_0 through GROM0_3 are 8 meg roms and labeled "GTxx GROM0_0 **" ect + while GROM1_0 through GROM1_3 are 4 meg roms matching "4 Meg board" GROM2_0 through GROM2_3 and are labeled "GTxx GROM1_0 *" ect + It is possible to find these rom combinations on any given GT board set. There is only 1 known GT set which specificly checks for 8 meg + roms under the GROM Checksum test. + Parent set will always be gt(year) with the most recent version. IE: gt97 is Golden Tee '97 v1.30 */ @@ -3875,7 +3928,7 @@ GAME( 1999, gtroyal, gt99, gt3dt, gt98s, aamat, ROT0, "Incredible Tech GAME( 2000, gt2k, 0, gt3d, aama, aama, ROT0, "Incredible Technologies", "Golden Tee 2K (v1.00)" , 0) /* PIC 16C54 labeled as ITGF2K */ GAME( 2000, gt2ks100, gt2k, gt3d, s_ver, s_ver, ROT0, "Incredible Technologies", "Golden Tee 2K (v1.00S)" , 0) /* PIC 16C54 labeled as ITGF2K-M */ GAME( 2000, gt2kt500, gt2k, gt3dt, gt98s, aamat, ROT0, "Incredible Technologies", "Golden Tee 2K Tournament (v5.00)" , 0) /* PIC 16C54 labeled as ITGF2K */ -GAME( 2002, gtsuprem, gt2k, gt3dt, gt98s, aamat, ROT0, "Incredible Technologies", "Golden Tee Supreme Edition Tournament (v5.10)" , 0) /* PIC 16C54 labeled as ITGF2K-1 */ +GAME( 2002, gtsuprem, gt2k, gt3dt, gt98s, aamat, ROT0, "Incredible Technologies", "Golden Tee Supreme Edition Tournament (v5.10)" , 0) /* PIC 16C54 labeled as ITGF2K-I */ GAME( 2001, gtclassc, 0, gt3d, aama, aama, ROT0, "Incredible Technologies", "Golden Tee Classic (v1.00)" , 0) /* PIC 16C54 labeled as ITGFCL */ GAME( 2001, gtclassp, gtclassc, gt3d, aama, gtclassp, ROT0, "Incredible Technologies", "Golden Tee Classic (v1.00) Alt" , 0) /* PIC 16C54 labeled as ITGFCL */ diff --git a/src/drivers/jackpool.c b/src/drivers/jackpool.c index e2f144eec..b938420f7 100644 --- a/src/drivers/jackpool.c +++ b/src/drivers/jackpool.c @@ -75,7 +75,7 @@ WRITE16_HANDLER( jackpool_layer2_videoram_w ) static READ16_HANDLER( jackpool_io_r ) { -// return mame_rand(); +// return mame_rand(Machine); return 0xffff; } diff --git a/src/drivers/jalmah.c b/src/drivers/jalmah.c index 00bfb7e15..1c5801ff9 100644 --- a/src/drivers/jalmah.c +++ b/src/drivers/jalmah.c @@ -244,7 +244,7 @@ static void daireika_mcu_run(void) MCU_READ(3,0x0002,0x000/2,0x13);/*CHI (trusted)*/ MCU_READ(2,0x0004,0x000/2,0x14);/*START1*/ } - jm_regs[0x00c/2] = mame_rand() & 0xffff; + jm_regs[0x00c/2] = mame_rand(Machine) & 0xffff; prg_prot++; if(prg_prot > 0x10) { prg_prot = 0; } jm_regs[0x00e/2] = prg_prot; @@ -289,7 +289,7 @@ static void urashima_mcu_run(void) MCU_READ(3,0x0002,0x300/2,0x13);/*CHI (trusted)*/ MCU_READ(2,0x0004,0x300/2,0x14);/*START1*/ } - jm_regs[0x30c/2] = mame_rand() & 0xffff; + jm_regs[0x30c/2] = mame_rand(Machine) & 0xffff; prg_prot++; if(prg_prot > 0x10) { prg_prot = 0; } jm_regs[0x30e/2] = prg_prot; @@ -330,7 +330,7 @@ static void second_mcu_run(void) // MCU_READ(2,0x0004,0x7b8/2,0x03);/*START1(correct?) */ } - jm_regs[0x20c/2] = mame_rand() & 0xffff; //kakumei2 + jm_regs[0x20c/2] = mame_rand(Machine) & 0xffff; //kakumei2 } diff --git a/src/drivers/jchan.c b/src/drivers/jchan.c index 783be628f..f1df1742e 100644 --- a/src/drivers/jchan.c +++ b/src/drivers/jchan.c @@ -441,7 +441,7 @@ extern void skns_drawsprites( mame_bitmap *bitmap, const rectangle *cliprect ); VIDEO_UPDATE(jchan) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); skns_drawsprites (bitmap,cliprect); return 0; diff --git a/src/drivers/jollyjgr.c b/src/drivers/jollyjgr.c index cc97ff467..1c601d0d8 100644 --- a/src/drivers/jollyjgr.c +++ b/src/drivers/jollyjgr.c @@ -255,19 +255,13 @@ static PALETTE_INIT( jollyjgr ) bit1 = BIT(*color_prom,7); b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } /* bitmap palette */ for (i = 0;i < 8;i++) - { - int r = (i >> 0) & 1; - int g = (i >> 1) & 1; - int b = (i >> 2) & 1; - - palette_set_color(32 + i,r * 0xff,g * 0xff,b * 0xff); - } + palette_set_color(machine,32 + i,pal1bit(i >> 0),pal1bit(i >> 1),pal1bit(i >> 2)); } /* Tilemap is the same as in Galaxian */ diff --git a/src/drivers/kaneko16.c b/src/drivers/kaneko16.c index 09ebe3b06..f668e294e 100644 --- a/src/drivers/kaneko16.c +++ b/src/drivers/kaneko16.c @@ -109,14 +109,14 @@ MACHINE_RESET( kaneko16 ) static MACHINE_RESET( berlwall ) { - machine_reset_kaneko16(); + machine_reset_kaneko16(machine); kaneko16_sprite_type = 2; // like type 0, but using 16 instead of 8 bytes } static MACHINE_RESET( blazeon ) { - machine_reset_kaneko16(); + machine_reset_kaneko16(machine); kaneko16_sprite_xoffs = 0x10000 - 0x680; kaneko16_sprite_yoffs = 0x000; @@ -168,7 +168,7 @@ static MACHINE_RESET( bonkadv ) static MACHINE_RESET( bakubrkr ) { - machine_reset_kaneko16(); + machine_reset_kaneko16(machine); kaneko16_priority.sprite[0] = 8; // above all kaneko16_priority.sprite[1] = 8; // above all @@ -180,7 +180,7 @@ static MACHINE_RESET( bakubrkr ) static MACHINE_RESET( gtmr ) { - machine_reset_kaneko16(); + machine_reset_kaneko16(machine); kaneko16_sprite_type = 1; @@ -192,7 +192,7 @@ static MACHINE_RESET( gtmr ) static MACHINE_RESET( mgcrystl ) { - machine_reset_kaneko16(); + machine_reset_kaneko16(machine); /* Sx = Sprites with priority x, x = tiles with priority x, Sprites - Tiles Order: @@ -219,7 +219,7 @@ static MACHINE_RESET( mgcrystl ) static MACHINE_RESET( sandscrp ) { - machine_reset_kaneko16(); + machine_reset_kaneko16(machine); kaneko16_sprite_type = 3; // "different" sprites layout @@ -228,7 +228,7 @@ static MACHINE_RESET( sandscrp ) static MACHINE_RESET( shogwarr ) { - machine_reset_kaneko16(); + machine_reset_kaneko16(machine); calc3_mcu_init(); } @@ -244,7 +244,7 @@ static MACHINE_RESET( shogwarr ) READ16_HANDLER( kaneko16_rnd_r ) { - return mame_rand() & 0xffff; + return mame_rand(Machine) & 0xffff; } WRITE16_HANDLER( kaneko16_coin_lockout_w ) @@ -3649,7 +3649,7 @@ ROM_END DRIVER_INIT( shogwarr ) { - init_kaneko16(); + init_kaneko16(machine); /* ROM test at 2237e: diff --git a/src/drivers/kinstb.c b/src/drivers/kinstb.c new file mode 100644 index 000000000..b60d1c525 --- /dev/null +++ b/src/drivers/kinstb.c @@ -0,0 +1,288 @@ +/*************************************************************************** + + Killer Instinct bootleg/hack. + ----------------------------- + + Driver (based on nss.c ) by Tomasz Slanina analog[at]op.pl + + PCB Info: + --------- + + (Nintendo SNES hardware) + + PQFP 100(?)pin chip marked "SP-BE0" + PQFP 100(?)pin chip marked "SP-BH0" + PQFP 100(?)pin chip marked "SP-AF0" + Lattice pLSI 1024-60LJ B604S03 + 6116 SRAM x2 + AS7C256 SRAM x8 + jumper pack (12) + dsw8 x2 + Xtal 24.576 MHz + Xtal 21.47727 MHz + volume pot + 27c801 x4 + two empty eprom sockets + + It's SNES version of KI with few mods (removed copyright messages, + extra code for coin input, etc). + + 256 bytes of RAM ( mapped to reserved area) are shared with some + device (probably Lattice PLD) used for handle coin inputs and dips + + Data lines of eproms are bitswapped. + +***************************************************************************/ +#include "driver.h" +#include "includes/snes.h" + +extern DRIVER_INIT( snes_hirom ); + +static INT8 shared_ram[0x100]; + +static READ8_HANDLER(sharedram_r) +{ + //check coins + static INT32 oldinput=0; + INT32 coincnt; +#ifdef MAME_DEBUG + INT32 input=readinputport(13); +#else + INT32 input=readinputport(10); +#endif + + if(input&3) + { + if( ((input&1)==1)&&((oldinput&1)==0)) {shared_ram[0]++;} + + coincnt=shared_ram[0]; + + if(coincnt>99){coincnt=99;} + + shared_ram[0xb]=(coincnt/10)+'0'; + shared_ram[0xa]=(coincnt%10)+'0'; + } + oldinput=input; + return shared_ram[offset]; +} + +static WRITE8_HANDLER(sharedram_w) +{ + shared_ram[offset]=data; +} + +static ADDRESS_MAP_START( kinstb_map, ADDRESS_SPACE_PROGRAM, 8) + AM_RANGE(0x000000, 0x2fffff) AM_READWRITE(snes_r_bank1, snes_w_bank1) /* I/O and ROM (repeats for each bank) */ + AM_RANGE(0x300000, 0x3fffff) AM_READWRITE(snes_r_bank2, snes_w_bank2) /* I/O and ROM (repeats for each bank) */ + AM_RANGE(0x400000, 0x5fffff) AM_READWRITE(snes_r_bank3, MWA8_ROM) /* ROM (and reserved in Mode 20) */ + AM_RANGE(0x600000, 0x6fffff) AM_READWRITE(snes_r_bank6, snes_w_bank6) /* used by Mode 20 DSP-1 */ + AM_RANGE(0x700000, 0x77ffff) AM_READWRITE(snes_r_sram, snes_w_sram) /* 256KB Mode 20 save ram + reserved from 0x8000 - 0xffff */ + AM_RANGE(0x781000, 0x7810ff) AM_READWRITE(sharedram_r, sharedram_w) /*shared with some device - mcu ? */ + AM_RANGE(0x7e0000, 0x7fffff) AM_RAM /* 8KB Low RAM, 24KB High RAM, 96KB Expanded RAM */ + AM_RANGE(0x800000, 0xffffff) AM_READWRITE(snes_r_bank4, snes_w_bank4) /* Mirror and ROM */ +ADDRESS_MAP_END + +static READ8_HANDLER( spc_ram_100_r ) +{ + return spc_ram_r(offset + 0x100); +} + +static WRITE8_HANDLER( spc_ram_100_w ) +{ + spc_ram_w(offset + 0x100, data); +} + +static ADDRESS_MAP_START( spc_mem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x00ef) AM_READWRITE(spc_ram_r, spc_ram_w) AM_BASE(&spc_ram) /* lower 32k ram */ + AM_RANGE(0x00f0, 0x00ff) AM_READWRITE(spc_io_r, spc_io_w) /* spc io */ + AM_RANGE(0x0100, 0xffff) AM_WRITE(spc_ram_100_w) + AM_RANGE(0x0100, 0xffbf) AM_READ(spc_ram_100_r) + AM_RANGE(0xffc0, 0xffff) AM_READ(spc_ipl_r) +ADDRESS_MAP_END + +INPUT_PORTS_START( kinstb ) + PORT_START /* IN 0 : Joypad 1 - L */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Button A") PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Button X") PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Button L") PORT_PLAYER(1) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P1 Button R") PORT_PLAYER(1) + PORT_START /* IN 1 : Joypad 1 - H */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Button B") PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Button Y") PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("P1 Select") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 ) PORT_NAME("P1 Start") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + + PORT_START /* IN 2 : Joypad 2 - L */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P2 Button A") PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P2 Button X") PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P2 Button L") PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P2 Button R") PORT_PLAYER(2) + PORT_START /* IN 3 : Joypad 2 - H */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P2 Button B") PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P2 Button Y") PORT_PLAYER(2) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_NAME("P2 Select") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_NAME("P2 Start") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) + + PORT_START /* IN 4 : Joypad 3 - L */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P3 Button A") PORT_PLAYER(3) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P3 Button X") PORT_PLAYER(3) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P3 Button L") PORT_PLAYER(3) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P3 Button R") PORT_PLAYER(3) + PORT_START /* IN 5 : Joypad 3 - H */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P3 Button B") PORT_PLAYER(3) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P3 Button Y") PORT_PLAYER(3) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE3 ) PORT_NAME("P3 Select") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START3 ) PORT_NAME("P3 Start") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(3) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(3) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(3) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(3) + + PORT_START /* IN 6 : Joypad 4 - L */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P4 Button A") PORT_PLAYER(4) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P4 Button X") PORT_PLAYER(4) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P4 Button L") PORT_PLAYER(4) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("P4 Button R") PORT_PLAYER(4) + PORT_START /* IN 7 : Joypad 4 - H */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P4 Button B") PORT_PLAYER(4) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P4 Button Y") PORT_PLAYER(4) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE4 ) PORT_NAME("P4 Select") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START4 ) PORT_NAME("P4 Start") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(4) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(4) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(4) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(4) + + PORT_START /* IN 8 : Internal switches */ + PORT_DIPNAME( 0x1, 0x1, "Enforce 32 sprites/line" ) + PORT_DIPSETTING( 0x0, DEF_STR( No ) ) + PORT_DIPSETTING( 0x1, DEF_STR( Yes ) ) + +#ifdef MAME_DEBUG + PORT_START /* IN 9 : debug switches */ + PORT_DIPNAME( 0x3, 0x0, "Browse tiles" ) + PORT_DIPSETTING( 0x0, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x1, "2bpl" ) + PORT_DIPSETTING( 0x2, "4bpl" ) + PORT_DIPSETTING( 0x3, "8bpl" ) + PORT_DIPNAME( 0xc, 0x0, "Browse maps" ) + PORT_DIPSETTING( 0x0, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x4, "2bpl" ) + PORT_DIPSETTING( 0x8, "4bpl" ) + PORT_DIPSETTING( 0xc, "8bpl" ) + + PORT_START /* IN 10 : debug switches */ + PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Toggle BG 1") PORT_PLAYER(2) + PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Toggle BG 2") PORT_PLAYER(2) + PORT_BIT( 0x4, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Toggle BG 3") PORT_PLAYER(2) + PORT_BIT( 0x8, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Toggle BG 4") PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Toggle Objects") PORT_PLAYER(3) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Toggle Main/Sub") PORT_PLAYER(3) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Toggle Back col") PORT_PLAYER(3) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Toggle Windows") PORT_PLAYER(3) + + PORT_START /* IN 11 : debug input */ + PORT_BIT( 0x1, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Pal prev") + PORT_BIT( 0x2, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Pal next") + PORT_BIT( 0x4, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Toggle Transparency") PORT_PLAYER(4) +#endif + + PORT_START /* IN 12 : dip-switches */ + + PORT_START /* IN 13 : coins */ + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) + +INPUT_PORTS_END + +static struct CustomSound_interface snes_sound_interface = +{ snes_sh_start }; + +static const gfx_decode gfxdecodeinfo[] = +{ + { -1 } /* end of array */ +}; + +static PALETTE_INIT( snes ) +{ + int i; + + for( i = 0; i < 32768; i++ ) + palette_set_color( machine, i, pal5bit(i >> 0), pal5bit(i >> 5), pal5bit(i >> 10) ); + + /* The colortable can be black */ + for( i = 0; i < 256; i++ ) + colortable[i] = 0; +} + +static MACHINE_DRIVER_START( kinstb ) + /* basic machine hardware */ + MDRV_CPU_ADD_TAG("main", G65816, 3580000) /* 2.68Mhz, also 3.58Mhz */ + MDRV_CPU_PROGRAM_MAP(kinstb_map, 0) + + MDRV_CPU_ADD_TAG("sound", SPC700, 2048000/2) /* 2.048 Mhz, but internal divider */ + /* audio CPU */ + MDRV_CPU_PROGRAM_MAP(spc_mem, 0) + MDRV_CPU_VBLANK_INT(NULL, 0) + + MDRV_FRAMES_PER_SECOND(60) + MDRV_VBLANK_DURATION((int)(((262. - 224.) / 262.) * 1000000. / 60.)) + MDRV_INTERLEAVE(400) + + MDRV_MACHINE_START( snes ) + MDRV_MACHINE_RESET( snes ) + + /* video hardware */ + MDRV_VIDEO_START( generic_bitmapped ) + MDRV_VIDEO_UPDATE( snes ) + + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_SIZE(SNES_SCR_WIDTH * 2, SNES_SCR_HEIGHT * 2) + MDRV_VISIBLE_AREA(0, SNES_SCR_WIDTH*2-1, 0, SNES_SCR_HEIGHT*2-1 ) + MDRV_GFXDECODE(gfxdecodeinfo) + MDRV_PALETTE_LENGTH(32768) + MDRV_COLORTABLE_LENGTH(257) + MDRV_PALETTE_INIT( snes ) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_STEREO("left", "right") + + MDRV_SOUND_ADD(CUSTOM, 0) + MDRV_SOUND_CONFIG(snes_sound_interface) + MDRV_SOUND_ROUTE(0, "left", 1.00) + MDRV_SOUND_ROUTE(1, "right", 1.00) +MACHINE_DRIVER_END + +static DRIVER_INIT(kinstb) +{ + INT32 i; + for(i=0;i<0x400000;i++) + { + memory_region(REGION_USER3)[i]=BITSWAP8(memory_region(REGION_USER3)[i],5,0,6,1,7,4,3,2 ); + } + init_snes_hirom(machine); +} + +ROM_START( kinstb ) + ROM_REGION( 0x400000, REGION_USER3, ROMREGION_DISPOSE ) + ROM_LOAD( "1.u14", 0x000000, 0x100000, CRC(70889919) SHA1(1451714cbdacb7f6ced2bc7afa478ad7264cf3b7) ) + ROM_LOAD( "2.u15", 0x100000, 0x100000, CRC(e4a5d1da) SHA1(6ae566bd2f740a251d7a81b8ebb92a651cfaac8d) ) + ROM_LOAD( "3.u16", 0x200000, 0x100000, CRC(7a40f7dd) SHA1(cebe632e8d2d68d0619077cc1e931af73c9a723b) ) + ROM_LOAD( "4.u17", 0x300000, 0x100000, CRC(3d7564c1) SHA1(392b513991897668d5dd469ac84a34f785895774) ) + + ROM_REGION(0x100, REGION_USER5, 0) + ROM_LOAD("spc700.rom", 0, 0x40, CRC(44bb3a40) SHA1(97e352553e94242ae823547cd853eecda55c20f0) ) + + ROM_REGION(0x800, REGION_USER6, ROMREGION_ERASEFF) + +ROM_END + +GAME( 199?, kinstb, 0, kinstb, kinstb, kinstb, ROT0, "bootleg", "Killer Instinct (SNES bootleg)", GAME_NOT_WORKING | GAME_IMPERFECT_SOUND ) diff --git a/src/drivers/konamigq.c b/src/drivers/konamigq.c index d8c2f8c0a..3a4864007 100644 --- a/src/drivers/konamigq.c +++ b/src/drivers/konamigq.c @@ -218,7 +218,7 @@ static READ32_HANDLER( pcmram_r ) static VIDEO_UPDATE( konamigq ) { - video_update_psx( screen, bitmap, cliprect ); + video_update_psx( machine, screen, bitmap, cliprect ); draw_crosshair( bitmap, GUNX( 5 ), GUNY( 6 ), cliprect, 0 ); draw_crosshair( bitmap, GUNX( 7 ), GUNY( 8 ), cliprect, 1 ); diff --git a/src/drivers/konamigv.c b/src/drivers/konamigv.c index fe8195da0..f6effb844 100644 --- a/src/drivers/konamigv.c +++ b/src/drivers/konamigv.c @@ -429,11 +429,11 @@ INPUT_PORTS_END static NVRAM_HANDLER( simpbowl ) { - nvram_handler_konamigv_93C46( file, read_or_write ); - nvram_handler_intelflash( 0, file, read_or_write ); - nvram_handler_intelflash( 1, file, read_or_write ); - nvram_handler_intelflash( 2, file, read_or_write ); - nvram_handler_intelflash( 3, file, read_or_write ); + nvram_handler_konamigv_93C46( machine, file, read_or_write ); + nvram_handler_intelflash( machine, 0, file, read_or_write ); + nvram_handler_intelflash( machine, 1, file, read_or_write ); + nvram_handler_intelflash( machine, 2, file, read_or_write ); + nvram_handler_intelflash( machine, 3, file, read_or_write ); } static int flash_address; @@ -541,7 +541,7 @@ static DRIVER_INIT( simpbowl ) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x1f6800c0, 0x1f6800c7, 0, 0, trackball_r ); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x1f6800c8, 0x1f6800cb, 0, 0, unknown_r ); /* ?? */ - init_konamigv(); + init_konamigv(machine); } static MACHINE_DRIVER_START( simpbowl ) @@ -676,8 +676,8 @@ static WRITE32_HANDLER( btc_trackball_w ) static NVRAM_HANDLER( btchamp ) { - nvram_handler_konamigv_93C46( file, read_or_write ); - nvram_handler_intelflash( 0, file, read_or_write ); + nvram_handler_konamigv_93C46( machine, file, read_or_write ); + nvram_handler_intelflash( machine, 0, file, read_or_write ); } static DRIVER_INIT( btchamp ) @@ -690,7 +690,7 @@ static DRIVER_INIT( btchamp ) memory_install_read32_handler (0, ADDRESS_SPACE_PROGRAM, 0x1f380000, 0x1f3fffff, 0, 0, btcflash_r ); memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x1f380000, 0x1f3fffff, 0, 0, btcflash_w ); - init_konamigv(); + init_konamigv(machine); } static MACHINE_DRIVER_START( btchamp ) @@ -842,7 +842,7 @@ static int kdeadeye_crosshair_y( int port ) static VIDEO_UPDATE( kdeadeye ) { - video_update_psx( screen, bitmap, cliprect ); + video_update_psx( machine, screen, bitmap, cliprect ); draw_crosshair( bitmap, kdeadeye_crosshair_x( 3 ), kdeadeye_crosshair_y( 4 ), cliprect, 0 ); draw_crosshair( bitmap, kdeadeye_crosshair_x( 5 ), kdeadeye_crosshair_y( 6 ), cliprect, 1 ); @@ -862,7 +862,7 @@ static DRIVER_INIT( kdeadeye ) memory_install_read32_handler ( 0, ADDRESS_SPACE_PROGRAM, 0x1f380000, 0x1f3fffff, 0, 0, btcflash_r ); memory_install_write32_handler( 0, ADDRESS_SPACE_PROGRAM, 0x1f380000, 0x1f3fffff, 0, 0, btcflash_w ); - init_konamigv(); + init_konamigv(machine); } static MACHINE_DRIVER_START( kdeadeye ) diff --git a/src/drivers/laserbas.c b/src/drivers/laserbas.c index 43f0f07a1..19ef6d687 100644 --- a/src/drivers/laserbas.c +++ b/src/drivers/laserbas.c @@ -74,7 +74,7 @@ static READ8_HANDLER( read_unk ) static WRITE8_HANDLER(palette_w) { - palette_set_color(offset,(data&0xe0),(data<<3)&0xe0,(data<<6)&0xe0); + palette_set_color(Machine,offset,pal3bit(data>>5),pal3bit(data>>2),pal2bit(data)); } static WRITE8_HANDLER(vrambank_w) diff --git a/src/drivers/lastfght.c b/src/drivers/lastfght.c index 5247e8518..4403c5833 100644 --- a/src/drivers/lastfght.c +++ b/src/drivers/lastfght.c @@ -82,7 +82,7 @@ static VIDEO_UPDATE( lastfght ) int count; static int base = 0; - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); fillbitmap( priority_bitmap, 0, cliprect ); if ( code_pressed_memory(KEYCODE_Z) ) @@ -152,7 +152,7 @@ static WRITE16_HANDLER(colordac_w) if(ACCESSING_LSB) { colorram[clr_offset]=data; - palette_set_color(clr_offset/3,colorram[(clr_offset/3)*3]*4,colorram[(clr_offset/3)*3+1]*4,colorram[(clr_offset/3)*3+2]*4); + palette_set_color(Machine,clr_offset/3,pal6bit(colorram[(clr_offset/3)*3]),pal6bit(colorram[(clr_offset/3)*3+1]),pal6bit(colorram[(clr_offset/3)*3+2])); clr_offset=(clr_offset+1)%768; } diff --git a/src/drivers/lazercmd.c b/src/drivers/lazercmd.c index 54451aa55..b15bb82c4 100644 --- a/src/drivers/lazercmd.c +++ b/src/drivers/lazercmd.c @@ -644,9 +644,9 @@ static unsigned short colortable_source[] = }; static PALETTE_INIT( lazercmd ) { - palette_set_color(0,0x00,0x00,0x00); /* black */ - palette_set_color(1,0xb0,0xb0,0xb0); /* white */ - palette_set_color(2,0xff,0xff,0xff); /* bright white */ + palette_set_color(machine,0,0x00,0x00,0x00); /* black */ + palette_set_color(machine,1,0xb0,0xb0,0xb0); /* white */ + palette_set_color(machine,2,0xff,0xff,0xff); /* bright white */ memcpy(colortable,colortable_source,sizeof(colortable_source)); } diff --git a/src/drivers/legionna.c b/src/drivers/legionna.c index 21f9ddb30..525e081b5 100644 --- a/src/drivers/legionna.c +++ b/src/drivers/legionna.c @@ -83,20 +83,10 @@ static UINT16 *mcu_ram; static WRITE16_HANDLER( legionna_paletteram16_w ) /* xBBBBxRRRRxGGGGx */ { - int a,r,g,b; + int a; COMBINE_DATA(&paletteram16[offset]); - a = paletteram16[offset]; - - r = (a >> 1) & 0x0f; - g = (a >> 6) & 0x0f; - b = (a >> 11) & 0x0f; - - r = (r << 4) | r; - g = (g << 4) | g; - b = (b << 4) | b; - - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,pal4bit(a >> 1),pal4bit(a >> 6),pal4bit(a >> 11)); } /* Mcu reads in attract in Legionnaire game demo diff --git a/src/drivers/lemmings.c b/src/drivers/lemmings.c index f195685ae..bea6de845 100644 --- a/src/drivers/lemmings.c +++ b/src/drivers/lemmings.c @@ -68,7 +68,7 @@ static WRITE16_HANDLER( lemmings_palette_24bit_w ) g = (paletteram16[offset+1] >> 8) & 0xff; r = (paletteram16[offset+1] >> 0) & 0xff; - palette_set_color(offset/2,r,g,b); + palette_set_color(Machine,offset/2,r,g,b); } static WRITE16_HANDLER( lemmings_sound_w ) diff --git a/src/drivers/lethal.c b/src/drivers/lethal.c index 38e9c686e..55fa3e22d 100644 --- a/src/drivers/lethal.c +++ b/src/drivers/lethal.c @@ -562,6 +562,54 @@ INPUT_PORTS_START( lethalen ) PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_MINMAX(0,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2) INPUT_PORTS_END +INPUT_PORTS_START( lethalej ) + /* IN 0 */ + PORT_START + 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_SERVICE_NO_TOGGLE(0x08, IP_ACTIVE_LOW ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 ) + + /* IN 1 */ + PORT_START + 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_DIPNAME( 0x10, 0x10, DEF_STR(Language) ) + PORT_DIPSETTING( 0x10, DEF_STR(English) ) + PORT_DIPSETTING( 0x00, DEF_STR(Spanish) ) + PORT_DIPNAME( 0x20, 0x00, "Game Type" ) + PORT_DIPSETTING( 0x20, "Street" ) + PORT_DIPSETTING( 0x00, "Arcade" ) + PORT_DIPNAME( 0x40, 0x40, "Coin Mechanism" ) + PORT_DIPSETTING( 0x40, "Common" ) + PORT_DIPSETTING( 0x00, "Independent" ) + PORT_DIPNAME( 0x0080, 0x0080, "Sound Output" ) + PORT_DIPSETTING( 0x0000, DEF_STR( Mono ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Stereo ) ) + + /* IN 2 */ + PORT_START + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_MINMAX(0,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) PORT_REVERSE + + /* IN 3 */ + PORT_START + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_MINMAX(0,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) PORT_REVERSE + + /* IN 4 */ + PORT_START + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_MINMAX(0,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2) PORT_REVERSE + + /* IN 5 */ + PORT_START + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_MINMAX(0,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(2) PORT_REVERSE +INPUT_PORTS_END + static struct K054539interface k054539_interface = { REGION_SOUND1, @@ -716,6 +764,144 @@ ROM_START( lethalej ) // Japan version JAD ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c)) ROM_END +ROM_START( lethalux ) // US version ?, proto / hack?, very different to other sets + ROM_REGION( 0x50000, REGION_CPU1, 0 ) + /* main program */ + ROM_LOAD( "191xxx01.u4", 0x10000, 0x40000, CRC(a3b9e790) SHA1(868b422850be129952c8b11c3c4aa730d8ea1544) ) // hacked? fails rom test + + ROM_REGION( 0x020000, REGION_CPU2, 0 ) + /* Z80 sound program */ + ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) ) + ROM_RELOAD( 0x010000, 0x010000 ) + + ROM_REGION( 0x400000, REGION_GFX1, 0 ) + /* tilemaps */ + ROM_LOAD32_WORD( "191a08", 0x000002, 0x100000, CRC(555bd4db) SHA1(d2e55796b4ab2306ae549fa9e7288e41eaa8f3de) ) + ROM_LOAD32_WORD( "191a10", 0x000000, 0x100000, CRC(2fa9bf51) SHA1(1e4ec56b41dfd8744347a7b5799e3ebce0939adc) ) + ROM_LOAD32_WORD( "191a07", 0x200002, 0x100000, CRC(1dad184c) SHA1(b2c4a8e48084005056aef2c8eaccb3d2eca71b73) ) + ROM_LOAD32_WORD( "191a09", 0x200000, 0x100000, CRC(e2028531) SHA1(63ccce7855d829763e9e248a6c3eb6ea89ab17ee) ) + + ROM_REGION( 0x400000, REGION_GFX2, ROMREGION_ERASE00 ) + /* sprites - fake 6bpp decode is done from here */ + ROM_LOAD( "191a04", 0x000000, 0x100000, CRC(5c3eeb2b) SHA1(33ea8b3968b78806334b5a0aab3a2c24e45c604e) ) + ROM_LOAD( "191a05", 0x100000, 0x100000, CRC(f2e3b58b) SHA1(0bbc2fe87a4fd00b5073a884bcfebcf9c2c402ad) ) + ROM_LOAD( "191a06", 0x200000, 0x100000, CRC(ee11fc08) SHA1(ec6dd684e8261b181d65b8bf1b9e97da5c4468f7) ) + + ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_ERASE00 ) + ROM_COPY(REGION_GFX2,0,0, 0x200000) + + ROM_REGION( 0x200000, REGION_GFX4, ROMREGION_ERASE00 ) + ROM_COPY(REGION_GFX2,0x200000,0, 0x200000) + + ROM_REGION( 0x200000, REGION_SOUND1, 0 ) + /* K054539 samples */ + ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c)) +ROM_END + +ROM_START( letheab ) // Euro ver. EAB + ROM_REGION( 0x50000, REGION_CPU1, 0 ) + /* main program */ + ROM_LOAD( "191eab01.u4", 0x10000, 0x40000, CRC(d7ce111e) SHA1(e56137a0ba7664f09b5d05bb39ec6eb4d1e412c7) ) + + ROM_REGION( 0x020000, REGION_CPU2, 0 ) + /* Z80 sound program */ + ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) ) + ROM_RELOAD( 0x010000, 0x010000 ) + + ROM_REGION( 0x400000, REGION_GFX1, 0 ) + /* tilemaps */ + ROM_LOAD32_WORD( "191a08", 0x000002, 0x100000, CRC(555bd4db) SHA1(d2e55796b4ab2306ae549fa9e7288e41eaa8f3de) ) + ROM_LOAD32_WORD( "191a10", 0x000000, 0x100000, CRC(2fa9bf51) SHA1(1e4ec56b41dfd8744347a7b5799e3ebce0939adc) ) + ROM_LOAD32_WORD( "191a07", 0x200002, 0x100000, CRC(1dad184c) SHA1(b2c4a8e48084005056aef2c8eaccb3d2eca71b73) ) + ROM_LOAD32_WORD( "191a09", 0x200000, 0x100000, CRC(e2028531) SHA1(63ccce7855d829763e9e248a6c3eb6ea89ab17ee) ) + + ROM_REGION( 0x400000, REGION_GFX2, ROMREGION_ERASE00 ) + /* sprites - fake 6bpp decode is done from here */ + ROM_LOAD( "191a04", 0x000000, 0x100000, CRC(5c3eeb2b) SHA1(33ea8b3968b78806334b5a0aab3a2c24e45c604e) ) + ROM_LOAD( "191a05", 0x100000, 0x100000, CRC(f2e3b58b) SHA1(0bbc2fe87a4fd00b5073a884bcfebcf9c2c402ad) ) + ROM_LOAD( "191a06", 0x200000, 0x100000, CRC(ee11fc08) SHA1(ec6dd684e8261b181d65b8bf1b9e97da5c4468f7) ) + + ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_ERASE00 ) + ROM_COPY(REGION_GFX2,0,0, 0x200000) + + ROM_REGION( 0x200000, REGION_GFX4, ROMREGION_ERASE00 ) + ROM_COPY(REGION_GFX2,0x200000,0, 0x200000) + + ROM_REGION( 0x200000, REGION_SOUND1, 0 ) + /* K054539 samples */ + ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c)) +ROM_END + +ROM_START( letheae ) // Euro ver. EAE + ROM_REGION( 0x50000, REGION_CPU1, 0 ) + /* main program */ + ROM_LOAD( "191eae01.u4", 0x10000, 0x40000, CRC(c6a3c6ac) SHA1(96a209a3a5b4af40af36bd7090c59a74f8c8df59) ) + + ROM_REGION( 0x020000, REGION_CPU2, 0 ) + /* Z80 sound program */ + ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) ) + ROM_RELOAD( 0x010000, 0x010000 ) + + ROM_REGION( 0x400000, REGION_GFX1, 0 ) + /* tilemaps */ + ROM_LOAD32_WORD( "191a08", 0x000002, 0x100000, CRC(555bd4db) SHA1(d2e55796b4ab2306ae549fa9e7288e41eaa8f3de) ) + ROM_LOAD32_WORD( "191a10", 0x000000, 0x100000, CRC(2fa9bf51) SHA1(1e4ec56b41dfd8744347a7b5799e3ebce0939adc) ) + ROM_LOAD32_WORD( "191a07", 0x200002, 0x100000, CRC(1dad184c) SHA1(b2c4a8e48084005056aef2c8eaccb3d2eca71b73) ) + ROM_LOAD32_WORD( "191a09", 0x200000, 0x100000, CRC(e2028531) SHA1(63ccce7855d829763e9e248a6c3eb6ea89ab17ee) ) + + ROM_REGION( 0x400000, REGION_GFX2, ROMREGION_ERASE00 ) + /* sprites - fake 6bpp decode is done from here */ + ROM_LOAD( "191a04", 0x000000, 0x100000, CRC(5c3eeb2b) SHA1(33ea8b3968b78806334b5a0aab3a2c24e45c604e) ) + ROM_LOAD( "191a05", 0x100000, 0x100000, CRC(f2e3b58b) SHA1(0bbc2fe87a4fd00b5073a884bcfebcf9c2c402ad) ) + ROM_LOAD( "191a06", 0x200000, 0x100000, CRC(ee11fc08) SHA1(ec6dd684e8261b181d65b8bf1b9e97da5c4468f7) ) + + ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_ERASE00 ) + ROM_COPY(REGION_GFX2,0,0, 0x200000) + + ROM_REGION( 0x200000, REGION_GFX4, ROMREGION_ERASE00 ) + ROM_COPY(REGION_GFX2,0x200000,0, 0x200000) + + ROM_REGION( 0x200000, REGION_SOUND1, 0 ) + /* K054539 samples */ + ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c)) +ROM_END + +ROM_START( lethalua ) // *might* be UAA (writes UA to Eeprom) + ROM_REGION( 0x50000, REGION_CPU1, 0 ) + /* main program */ + ROM_LOAD( "6_usa.u4", 0x10000, 0x40000, CRC(ab6b8f16) SHA1(8de6c429a6e71144270e79d18ad47b5aad13fe04) ) + + ROM_REGION( 0x020000, REGION_CPU2, 0 ) + /* Z80 sound program */ + ROM_LOAD( "191a02.f4", 0x000000, 0x010000, CRC(72b843cc) SHA1(b44b2f039358c26fa792d740639b66a5c8bf78e7) ) + ROM_RELOAD( 0x010000, 0x010000 ) + + ROM_REGION( 0x400000, REGION_GFX1, 0 ) + /* tilemaps */ + ROM_LOAD32_WORD( "191a08", 0x000002, 0x100000, CRC(555bd4db) SHA1(d2e55796b4ab2306ae549fa9e7288e41eaa8f3de) ) + ROM_LOAD32_WORD( "191a10", 0x000000, 0x100000, CRC(2fa9bf51) SHA1(1e4ec56b41dfd8744347a7b5799e3ebce0939adc) ) + ROM_LOAD32_WORD( "191a07", 0x200002, 0x100000, CRC(1dad184c) SHA1(b2c4a8e48084005056aef2c8eaccb3d2eca71b73) ) + ROM_LOAD32_WORD( "191a09", 0x200000, 0x100000, CRC(e2028531) SHA1(63ccce7855d829763e9e248a6c3eb6ea89ab17ee) ) + + ROM_REGION( 0x400000, REGION_GFX2, ROMREGION_ERASE00 ) + /* sprites - fake 6bpp decode is done from here */ + ROM_LOAD( "191a04", 0x000000, 0x100000, CRC(5c3eeb2b) SHA1(33ea8b3968b78806334b5a0aab3a2c24e45c604e) ) + ROM_LOAD( "191a05", 0x100000, 0x100000, CRC(f2e3b58b) SHA1(0bbc2fe87a4fd00b5073a884bcfebcf9c2c402ad) ) + ROM_LOAD( "191a06", 0x200000, 0x100000, CRC(ee11fc08) SHA1(ec6dd684e8261b181d65b8bf1b9e97da5c4468f7) ) + + ROM_REGION( 0x200000, REGION_GFX3, ROMREGION_ERASE00 ) + ROM_COPY(REGION_GFX2,0,0, 0x200000) + + ROM_REGION( 0x200000, REGION_GFX4, ROMREGION_ERASE00 ) + ROM_COPY(REGION_GFX2,0x200000,0, 0x200000) + + ROM_REGION( 0x200000, REGION_SOUND1, 0 ) + /* K054539 samples */ + ROM_LOAD( "191a03", 0x000000, 0x200000, CRC(9b13fbe8) SHA1(19b02dbd9d6da54045b0ba4dfe7b282c72745c9c)) +ROM_END + + + static DRIVER_INIT( lethalen ) { konami_rom_deinterleave_2_half(REGION_GFX2); @@ -723,5 +909,10 @@ static DRIVER_INIT( lethalen ) konami_rom_deinterleave_2(REGION_GFX4); } -GAME( 1992, lethalen, 0, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver UAE)", GAME_IMPERFECT_GRAPHICS) -GAME( 1992, lethalej, lethalen, lethalej, lethalen, lethalen, ORIENTATION_FLIP_X, "Konami", "Lethal Enforcers (ver JAD)", GAME_NOT_WORKING) +GAME( 1992, lethalen, 0, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver UAE, 11/19/92 15:04)", GAME_IMPERFECT_GRAPHICS) // writes UE to eeprom +GAME( 1992, lethalua, lethalen, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver unknown, US, 08/17/92 21:38)", GAME_IMPERFECT_GRAPHICS) // UAA? (writes UA to eeprom) +GAME( 1992, lethalux, lethalen, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver unknown, US, 08/06/92 15:11, hacked/proto?)", GAME_IMPERFECT_GRAPHICS) // writes UA to eeprom but earlier than suspected UAA set, might be a proto, might be hacked, fails rom test +GAME( 1992, letheab, lethalen, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver EAB, 10/14/92 19:53)", GAME_IMPERFECT_GRAPHICS) // writes EC to eeprom?! +GAME( 1992, letheae, lethalen, lethalen, lethalen, lethalen, ORIENTATION_FLIP_Y, "Konami", "Lethal Enforcers (ver EAE, 11/19/92 16:24)", GAME_IMPERFECT_GRAPHICS) // writes EE to eeprom +// different mirror / display setup, shoot off the top of the screen to reload.. +GAME( 1992, lethalej, lethalen, lethalej, lethalej, lethalen, ORIENTATION_FLIP_X, "Konami", "Lethal Enforcers (ver JAD, 12/04/92 17:16)", GAME_IMPERFECT_GRAPHICS) // writes JC to eeprom?! diff --git a/src/drivers/liberate.c b/src/drivers/liberate.c index 93d02c7d1..d107c8baa 100644 --- a/src/drivers/liberate.c +++ b/src/drivers/liberate.c @@ -888,7 +888,7 @@ static DRIVER_INIT( prosport ) static DRIVER_INIT( yellowcb ) { - init_prosport(); + init_prosport(machine); memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xa000, 0xa000, 0, 0, input_port_0_r); } diff --git a/src/drivers/limenko.c b/src/drivers/limenko.c index 3386e2b37..094d7ac83 100644 --- a/src/drivers/limenko.c +++ b/src/drivers/limenko.c @@ -63,13 +63,13 @@ static WRITE32_HANDLER( limenko_paletteram_w ) if(ACCESSING_LSW32) { paldata = paletteram32[offset] & 0x7fff; - palette_set_color(offset * 2 + 1, pal5bit(paldata >> 0), pal5bit(paldata >> 5), pal5bit(paldata >> 10)); + palette_set_color(Machine, offset * 2 + 1, pal5bit(paldata >> 0), pal5bit(paldata >> 5), pal5bit(paldata >> 10)); } if(ACCESSING_MSW32) { paldata = (paletteram32[offset] >> 16) & 0x7fff; - palette_set_color(offset * 2 + 0, pal5bit(paldata >> 0), pal5bit(paldata >> 5), pal5bit(paldata >> 10)); + palette_set_color(Machine, offset * 2 + 0, pal5bit(paldata >> 0), pal5bit(paldata >> 5), pal5bit(paldata >> 10)); } } diff --git a/src/drivers/littlerb.c b/src/drivers/littlerb.c index 2c76f6b0e..f549235c6 100644 --- a/src/drivers/littlerb.c +++ b/src/drivers/littlerb.c @@ -104,7 +104,7 @@ void littlerb_data_write(UINT16 data) r = littlerb_region2[x+1]; g = littlerb_region2[x+2]; - palette_set_color(x/3,r,g,b); + palette_set_color(Machine,x/3,r,g,b); } @@ -297,7 +297,7 @@ PALETTE_INIT( littlerb ) { int i; for(i = 0; i < 256; i++) - palette_set_color(i,i,i,i); + palette_set_color(machine,i,i,i,i); } VIDEO_START(littlerb) @@ -348,7 +348,7 @@ VIDEO_UPDATE(littlerb) int x,y,offs, code; int xsize,ysize; UINT16* spriteregion = &littlerb_region4[0x400]; - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); /* the spriteram format is something like this .. */ for (offs=0x26/2;offs<0xc00;offs+=6) // start at 00x26? diff --git a/src/drivers/looping.c b/src/drivers/looping.c index d02efd172..0f6a734df 100644 --- a/src/drivers/looping.c +++ b/src/drivers/looping.c @@ -87,7 +87,7 @@ PALETTE_INIT( looping ) bit1 = (*color_prom >> 7) & 0x01; b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/drivers/lucky8.c b/src/drivers/lucky8.c index 002ac1a9c..6c11f8c53 100644 --- a/src/drivers/lucky8.c +++ b/src/drivers/lucky8.c @@ -66,7 +66,7 @@ PALETTE_INIT( lucky8 ) b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); color_prom++; } diff --git a/src/drivers/m62.c b/src/drivers/m62.c index 6e33a5d56..4fe8af529 100644 --- a/src/drivers/m62.c +++ b/src/drivers/m62.c @@ -84,6 +84,8 @@ WRITE8_HANDLER( kungfum_tileram_w ); VIDEO_START( ldrun ); VIDEO_UPDATE( ldrun ); +VIDEO_START( ldrun2 ); + VIDEO_START( battroad ); VIDEO_UPDATE( battroad ); @@ -1440,6 +1442,9 @@ static MACHINE_DRIVER_START( ldrun2 ) MDRV_CPU_PROGRAM_MAP(ldrun2_readmem,ldrun2_writemem) MDRV_CPU_IO_MAP(ldrun2_readport,ldrun2_writeport) + MDRV_VIDEO_START(ldrun2) + MDRV_VIDEO_UPDATE(ldrun) + MDRV_VISIBLE_AREA((64*8-384)/2, 64*8-(64*8-384)/2-1, 0*8, 31*8-1) MACHINE_DRIVER_END @@ -1455,7 +1460,7 @@ static MACHINE_DRIVER_START( ldrun3 ) /* video hardware */ MDRV_GFXDECODE(ldrun3_gfxdecodeinfo) - MDRV_VISIBLE_AREA((64*8-384)/2, 64*8-(64*8-384)/2-1-8, 0*8, 31*8-1) + MDRV_VISIBLE_AREA((64*8-384)/2, 64*8-(64*8-384)/2-1, 0*8, 31*8-1) MACHINE_DRIVER_END diff --git a/src/drivers/m79amb.c b/src/drivers/m79amb.c index d5acdbb54..365744621 100644 --- a/src/drivers/m79amb.c +++ b/src/drivers/m79amb.c @@ -109,13 +109,13 @@ INPUT_PORTS_END static PALETTE_INIT( m79amb ) { - palette_set_color(0,0x00,0x00,0x00); /* BLACK */ - palette_set_color(1,0xff,0xff,0xff); /* WHITE */ - palette_set_color(2,0xff,0x20,0x20); /* RED */ - palette_set_color(3,0x20,0xff,0x20); /* GREEN */ - palette_set_color(4,0xff,0xff,0x20); /* YELLOW */ - palette_set_color(5,0x20,0xff,0xff); /* CYAN */ - palette_set_color(6,0xff,0x20,0xff); /* PURPLE */ + palette_set_color(machine,0,0x00,0x00,0x00); /* BLACK */ + palette_set_color(machine,1,0xff,0xff,0xff); /* WHITE */ + palette_set_color(machine,2,0xff,0x20,0x20); /* RED */ + palette_set_color(machine,3,0x20,0xff,0x20); /* GREEN */ + palette_set_color(machine,4,0xff,0xff,0x20); /* YELLOW */ + palette_set_color(machine,5,0x20,0xff,0xff); /* CYAN */ + palette_set_color(machine,6,0xff,0x20,0xff); /* PURPLE */ } static INTERRUPT_GEN( M79_interrupt ) diff --git a/src/drivers/macrossp.c b/src/drivers/macrossp.c index e4fb69bbb..1d62c044a 100644 --- a/src/drivers/macrossp.c +++ b/src/drivers/macrossp.c @@ -252,7 +252,7 @@ static WRITE32_HANDLER( paletteram32_macrossp_w ) g = ((paletteram32[offset] & 0x00ff0000) >>16); r = ((paletteram32[offset] & 0xff000000) >>24); - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } diff --git a/src/drivers/madalien.c b/src/drivers/madalien.c index 1ca7a6706..8267cae81 100644 --- a/src/drivers/madalien.c +++ b/src/drivers/madalien.c @@ -146,7 +146,7 @@ PALETTE_INIT( madalien ) bit1 = (color_prom[i] >> 5) & 0x01; b = 0x40 * bit0 + 0x80 * bit1; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); /* Colors for bits 1 and 2 swapped */ j = i; @@ -160,7 +160,7 @@ PALETTE_INIT( madalien ) j |= 0x02; break; }; - palette_set_color(j+n, r, g, b); + palette_set_color(machine, j+n, r, g, b); } } diff --git a/src/drivers/magic10.c b/src/drivers/magic10.c index 599999a76..2a43374b4 100644 --- a/src/drivers/magic10.c +++ b/src/drivers/magic10.c @@ -44,12 +44,8 @@ static WRITE16_HANDLER( layer2_videoram_w ) static WRITE16_HANDLER( paletteram_w ) { - int r,g,b; data = COMBINE_DATA(&paletteram16[offset]); - g = (data >> 0) & 0xF; - r = (data >> 4) & 0xF; - b = (data >> 8) & 0xF; - palette_set_color( offset, r * 0x11, g * 0x11, b * 0x11 ); + palette_set_color( Machine, offset, pal4bit(data >> 4), pal4bit(data >> 0), pal4bit(data >> 8)); } static WRITE16_HANDLER( magic10_misc_w ) diff --git a/src/drivers/malzak.c b/src/drivers/malzak.c index de11cebd4..9d97412d2 100644 --- a/src/drivers/malzak.c +++ b/src/drivers/malzak.c @@ -433,7 +433,7 @@ static const gfx_decode malzak_gfxdecodeinfo[] = static PALETTE_INIT( malzak ) { - palette_set_colors(0, saa5050_palette, sizeof(saa5050_palette) / 3); + palette_set_colors(machine, 0, saa5050_palette, sizeof(saa5050_palette) / 3); memcpy(colortable, saa5050_colortable, sizeof (saa5050_colortable)); } diff --git a/src/drivers/mappy.c b/src/drivers/mappy.c index 3a2cb567b..922879063 100644 --- a/src/drivers/mappy.c +++ b/src/drivers/mappy.c @@ -645,10 +645,10 @@ static DRIVER_INIT( 56out_56 ) namcoio_init(1, NAMCOIO_56XX, &intf1); } -static DRIVER_INIT( 56out_PP ) +static DRIVER_INIT( 56out_59 ) { namcoio_init(0, NAMCOIO_56XX, &intf0_lamps); - namcoio_init(1, NAMCOIO_PACNPAL, &intf1); + namcoio_init(1, NAMCOIO_59XX, &intf1); } static DRIVER_INIT( 58_58 ) @@ -2112,23 +2112,23 @@ static DRIVER_INIT( grobda ) */ memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x0002, 0x0002, 0, 0, grobda_DAC_w ); - init_58_56(); + init_58_56(machine); } static DRIVER_INIT( digdug2 ) { /* appears to not use the watchdog */ memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x8000, 0x8000, 0, 0, MWA8_NOP); - init_58_56(); + init_58_56(machine); } /* 2x6809, static tilemap, 2bpp sprites (Super Pacman type) */ GAME( 1982, superpac, 0, superpac, superpac, 56_56, ROT90, "Namco", "Super Pac-Man", 0 ) GAME( 1982, superpcm, superpac, superpac, superpac, 56_56, ROT90, "[Namco] (Bally Midway license)", "Super Pac-Man (Midway)", 0 ) -GAME( 1983, pacnpal, 0, superpac, pacnpal, 56out_PP, ROT90, "Namco", "Pac & Pal", 0 ) -GAME( 1983, pacnpal2, pacnpal, superpac, pacnpal, 56out_PP, ROT90, "Namco", "Pac & Pal (older)", 0 ) -GAME( 1983, pacnchmp, pacnpal, superpac, pacnpal, 56out_PP, ROT90, "Namco", "Pac-Man & Chomp Chomp", 0 ) +GAME( 1983, pacnpal, 0, superpac, pacnpal, 56out_59, ROT90, "Namco", "Pac & Pal", 0 ) +GAME( 1983, pacnpal2, pacnpal, superpac, pacnpal, 56out_59, ROT90, "Namco", "Pac & Pal (older)", 0 ) +GAME( 1983, pacnchmp, pacnpal, superpac, pacnpal, 56out_59, ROT90, "Namco", "Pac-Man & Chomp Chomp", 0 ) GAME( 1984, grobda, 0, grobda, grobda, grobda, ROT90, "Namco", "Grobda (New Ver.)", 0 ) GAME( 1984, grobda2, grobda, grobda, grobda, grobda, ROT90, "Namco", "Grobda (Old Ver. set 1)", 0 ) GAME( 1984, grobda3, grobda, grobda, grobda, grobda, ROT90, "Namco", "Grobda (Old Ver. set 2)", 0 ) diff --git a/src/drivers/marineb.c b/src/drivers/marineb.c index 8891b1787..f5d8f5d12 100644 --- a/src/drivers/marineb.c +++ b/src/drivers/marineb.c @@ -61,13 +61,13 @@ VIDEO_UPDATE( hopprobo ); static MACHINE_RESET( marineb ) { marineb_active_low_flipscreen = 0; - machine_reset_espial(); + machine_reset_espial(machine); } static MACHINE_RESET( springer ) { marineb_active_low_flipscreen = 1; - machine_reset_espial(); + machine_reset_espial(machine); } static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 ) diff --git a/src/drivers/marinedt.c b/src/drivers/marinedt.c index 4e23dd63e..89c62aff0 100644 --- a/src/drivers/marinedt.c +++ b/src/drivers/marinedt.c @@ -439,7 +439,7 @@ bit0=0; // *(palette++) = 0x92 * bit0 + 0x46 * bit1 + 0x27 * bit2; b = 0x27 * bit0 + 0x46 * bit1 + 0x92 * bit2; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); } } diff --git a/src/drivers/maxaflex.c b/src/drivers/maxaflex.c index 12ef19780..5768e3875 100644 --- a/src/drivers/maxaflex.c +++ b/src/drivers/maxaflex.c @@ -74,31 +74,26 @@ READ8_HANDLER( mcu_portB_r ) WRITE8_HANDLER( mcu_portB_w ) { + UINT8 diff = data ^ portB_out; portB_out = data; + if ( data & 0x4 ) { cpunum_set_input_line( 1, M6805_IRQ_LINE, CLEAR_LINE ); } + /* latch for lamps */ - if ( (data & (1<<6)) == 0 ) + if ((diff & 0x40) && !(data & 0x40)) { - output_set_value("lamp0", (portC_out >> 0) & 1); - output_set_value("lamp1", (portC_out >> 1) & 1); - output_set_value("lamp2", (portC_out >> 2) & 1); - output_set_value("lamp3", (portC_out >> 3) & 1); + output_set_lamp_value(0, (portC_out >> 0) & 1); + output_set_lamp_value(1, (portC_out >> 1) & 1); + output_set_lamp_value(2, (portC_out >> 2) & 1); + output_set_lamp_value(3, (portC_out >> 3) & 1); } + /* RES600 */ - if ( (data & (1<<4)) == 0 ) - { - cpunum_set_input_line( 0, INPUT_LINE_RESET, ASSERT_LINE ); - } - else - { - cpunum_set_input_line( 0, INPUT_LINE_RESET, CLEAR_LINE ); - } - if ( (data & 0x3) == 0x3 ) - { - } + if (diff & 0x10) + cpunum_set_input_line(0, INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE); } /* Port C: @@ -106,6 +101,7 @@ WRITE8_HANDLER( mcu_portB_w ) 1 (out) lamp PLAY 2 (out) lamp START 3 (out) lamp OVER */ + READ8_HANDLER( mcu_portC_r ) { return (portC_in & ~ddrC) | (portC_out & ddrC); @@ -113,17 +109,20 @@ READ8_HANDLER( mcu_portC_r ) WRITE8_HANDLER( mcu_portC_w ) { + /* guessing that this is an LS48 */ + static const UINT8 ls48_map[16] = + { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0x00 }; + portC_out = data & 0x0f; /* displays */ switch( portB_out & 0x3 ) { - case 0x0: output_set_value("digit0", portC_out); break; - case 0x1: output_set_value("digit1", portC_out); break; - case 0x2: output_set_value("digit2", portC_out); break; + case 0x0: output_set_digit_value(0, ls48_map[portC_out]); break; + case 0x1: output_set_digit_value(1, ls48_map[portC_out]); break; + case 0x2: output_set_digit_value(2, ls48_map[portC_out]); break; case 0x3: break; } - } READ8_HANDLER( mcu_ddr_r ) @@ -229,8 +228,8 @@ void supervisor_board_check_coin_input(void) static MACHINE_START(maxaflex) { - add_reset_callback(machine_reset_supervisor_board); - return machine_start_a600xl(); + add_reset_callback(Machine, machine_reset_supervisor_board); + return machine_start_a600xl(machine); } int atari_input_disabled(void) @@ -313,7 +312,7 @@ INPUT_PORTS_START( a600xl ) PORT_BIT(0x1, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_START /* IN5 DSW */ - PORT_DIPNAME(0xf, 0x0, "Coin/Time" ) + PORT_DIPNAME(0xf, 0x9, "Coin/Time" ) PORT_DIPSETTING( 0x0, "30 sec" ) PORT_DIPSETTING( 0x1, "60 sec" ) PORT_DIPSETTING( 0x2, "90 sec" ) @@ -440,7 +439,7 @@ static unsigned short atari_colortable[] = /* Initialise the palette */ static PALETTE_INIT( atari ) { - palette_set_colors(0, atari_palette, sizeof(atari_palette) / 3); + palette_set_colors(machine, 0, atari_palette, sizeof(atari_palette) / 3); memcpy(colortable,atari_colortable,sizeof(atari_colortable)); } diff --git a/src/drivers/mazerbla.c b/src/drivers/mazerbla.c index ef72e237f..e128a918e 100644 --- a/src/drivers/mazerbla.c +++ b/src/drivers/mazerbla.c @@ -591,7 +591,7 @@ static WRITE8_HANDLER(cfb_backgnd_color_w) bit0 = (data >> 0) & 0x01; b = combine_3_weights(weights_b, bit0, bit1, bit2); - palette_set_color(255, r, g, b); + palette_set_color(Machine, 255, r, g, b); //logerror("background color (port 01) write=%02x\n",data); } } @@ -984,7 +984,7 @@ unsigned char * rom = memory_region(REGION_CPU3) + (gfx_rom_bank * 0x2000) + 0x1 b = combine_3_weights(weights_b, bit0, bit1, bit2); if ((x+y*16)<255)//keep color 255 free for use as background color - palette_set_color(x+y*16, r, g, b); + palette_set_color(Machine, x+y*16, r, g, b); lookup_RAM[ lookup_offs + x + y*16 ] = colour; } diff --git a/src/drivers/meadows.c b/src/drivers/meadows.c index 6abc289bf..4575ca8a0 100644 --- a/src/drivers/meadows.c +++ b/src/drivers/meadows.c @@ -340,8 +340,8 @@ static INTERRUPT_GEN( sound_interrupt ) static PALETTE_INIT( meadows ) { - palette_set_color(0,0x00,0x00,0x00); /* BLACK */ - palette_set_color(1,0xff,0xff,0xff); /* WHITE */ + palette_set_color(machine,0,0x00,0x00,0x00); /* BLACK */ + palette_set_color(machine,1,0xff,0xff,0xff); /* WHITE */ } diff --git a/src/drivers/mediagx.c b/src/drivers/mediagx.c index 0115d2a9d..b6614adcb 100644 --- a/src/drivers/mediagx.c +++ b/src/drivers/mediagx.c @@ -134,7 +134,7 @@ static VIDEO_START(mediagx) int i; for (i=0; i < 16; i++) { - palette_set_color(i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]); + palette_set_color(machine, i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]); } return 0; } @@ -829,7 +829,7 @@ static READ32_HANDLER ( a51site4_speedup5_r ) static DRIVER_INIT( a51site4 ) { - init_mediagx(); + init_mediagx(machine); #if SPEEDUP_HACKS // 55038+14 diff --git a/src/drivers/megaplay.c b/src/drivers/megaplay.c index 34e7eea7f..ebb67a4b9 100644 --- a/src/drivers/megaplay.c +++ b/src/drivers/megaplay.c @@ -66,7 +66,7 @@ static MACHINE_RESET( megaplay ) memory_set_bankptr(2, &ic36_ram[0]); memory_set_bankptr(3, &genesis_68k_ram[0]); - machine_reset_genesis(); + machine_reset_genesis(machine); } diff --git a/src/drivers/meijinsn.c b/src/drivers/meijinsn.c index b193e7f2d..cc47b4940 100644 --- a/src/drivers/meijinsn.c +++ b/src/drivers/meijinsn.c @@ -251,7 +251,7 @@ PALETTE_INIT( meijinsn ) bit1 = (color_prom[i] >> 7) & 0x01; b = combine_2_weights(weights_b, bit0, bit1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/drivers/merit.c b/src/drivers/merit.c index 77511270e..97a55624b 100644 --- a/src/drivers/merit.c +++ b/src/drivers/merit.c @@ -136,29 +136,40 @@ static WRITE8_HANDLER( palette_w ) // int bit = (i & 0x300)>>8; offset = ((i & 0x7f)<<3) | ((i & 0x80) >> 5); - palette_set_color(i, - BIT(paletteram[offset],0)*0x10 + BIT(paletteram[offset+1],0)*0x20 + BIT(paletteram[offset+2],0)*0x40 + BIT(paletteram[offset+3],0)*0x80, - BIT(paletteram[offset],1)*0x10 + BIT(paletteram[offset+1],1)*0x20 + BIT(paletteram[offset+2],1)*0x40 + BIT(paletteram[offset+3],1)*0x80, - BIT(paletteram[offset],2)*0x10 + BIT(paletteram[offset+1],2)*0x20 + BIT(paletteram[offset+2],2)*0x40 + BIT(paletteram[offset+3],2)*0x80); + palette_set_color(Machine,i, + pal4bit(BIT(paletteram[offset],0)*0x1 + BIT(paletteram[offset+1],0)*0x2 + BIT(paletteram[offset+2],0)*0x4 + BIT(paletteram[offset+3],0)*0x8), + pal4bit(BIT(paletteram[offset],1)*0x1 + BIT(paletteram[offset+1],1)*0x2 + BIT(paletteram[offset+2],1)*0x4 + BIT(paletteram[offset+3],1)*0x8), + pal4bit(BIT(paletteram[offset],2)*0x1 + BIT(paletteram[offset+1],2)*0x2 + BIT(paletteram[offset+2],2)*0x4 + BIT(paletteram[offset+3],2)*0x8)); } } -static WRITE8_HANDLER( unk_1_w ) +static WRITE8_HANDLER( led1_w ) { - // every bit unknown + /* 5 button lamps player 1 */ + set_led_status(0,~data & 0x01); + set_led_status(1,~data & 0x02); + set_led_status(2,~data & 0x04); + set_led_status(3,~data & 0x08); + set_led_status(4,~data & 0x10); } -static WRITE8_HANDLER( misc_w ) +static WRITE8_HANDLER( led2_w ) { - flip_screen_set(~data & 0x10); - extra_video_bank_bit = (data & 2) << 8; - - // other bits unknown + /* 5 button lamps player 2 */ + set_led_status(5,~data & 0x01); + set_led_status(6,~data & 0x02); + set_led_status(7,~data & 0x04); + set_led_status(8,~data & 0x08); + set_led_status(9,~data & 0x10); + + /* coin counter */ + coin_counter_w(0,0x80-(data & 0x80)); } -static WRITE8_HANDLER( led_w ) +static WRITE8_HANDLER( misc_w ) { - set_led_status(0,~data & 0x80); + flip_screen_set(~data & 0x10); + extra_video_bank_bit = (data & 2) << 8; // other bits unknown } @@ -252,12 +263,13 @@ static ADDRESS_MAP_START( trvwhziv_map, ADDRESS_SPACE_PROGRAM, 8 ) ADDRESS_MAP_END -// To enter hidden test-mode: enable "Enable Test Mode", enable "Service Mode", -// enable "Freeze ?" and disable "Service Mode" + +// in service mode: // keep service test button pressed to clear the coin counter. -// keep it for other 5 seconds to clear all the memory. +// keep it pressed for 10 seconds to clear all the memory. +// to enter hidden test mode enable "Enable Test Mode", enable "Reset High Scores" INPUT_PORTS_START( phrcraze ) - PORT_START + PORT_START /* IN0 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) @@ -269,11 +281,11 @@ INPUT_PORTS_START( phrcraze ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_START + PORT_START /* IN1 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_SERVICE_NO_TOGGLE( 0x04, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x08, 0x08, "Freeze ?" ) // ? + PORT_DIPNAME( 0x08, 0x08, "Reset High Scores" ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) @@ -303,33 +315,32 @@ INPUT_PORTS_START( phrcraze ) 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( Lives ) ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Lives ) ) PORT_DIPSETTING( 0x00, "5" ) PORT_DIPSETTING( 0x02, "6" ) PORT_DIPNAME( 0x04, 0x04, "Topic \"8\"" ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x04, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_1C ) ) 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( Cabinet ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Upright ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x80, 0x80, "Cocktail sides" ) - PORT_DIPSETTING( 0x00, "1" ) - PORT_DIPSETTING( 0x80, "2" ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0xc0, "Upright 1 Player" ) + PORT_DIPSETTING( 0x00, "Upright 2 Players" ) + PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) +// PORT_DIPSETTING( 0x40, "Upright 1 Player" ) INPUT_PORTS_END -// To enter hidden test-mode: enable "Enable Test Mode", enable "Service Mode", -// enable "Freeze ?" and disable "Service Mode" -// keep service test button pressed for 5 seconds to clear the coin counter. -// keep it for other 5 seconds to clear all the memory. +// in service mode: +// keep service test button pressed to clear the coin counter. +// keep it pressed for 10 seconds to clear all the memory. +// to enter hidden test mode enable "Enable Test Mode", enable "Reset High Scores" INPUT_PORTS_START( phrcrazs ) PORT_START PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) @@ -347,7 +358,7 @@ INPUT_PORTS_START( phrcrazs ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_SERVICE_NO_TOGGLE( 0x04, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x08, 0x08, "Freeze ?" ) // ? + PORT_DIPNAME( 0x08, 0x08, "Reset High Scores" ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) @@ -390,14 +401,16 @@ INPUT_PORTS_START( phrcrazs ) PORT_DIPNAME( 0x20, 0x20, "Random Sex Category" ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Cabinet ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Upright ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x80, 0x80, "Cocktail sides" ) - PORT_DIPSETTING( 0x00, "1" ) - PORT_DIPSETTING( 0x80, "2" ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0xc0, "Upright 1 Player" ) + PORT_DIPSETTING( 0x00, "Upright 2 Players" ) + PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) +// PORT_DIPSETTING( 0x40, "Upright 1 Player" ) INPUT_PORTS_END +// keep service test button pressed to clear the coin counter. +// To enter hidden test-mode in service mode: +// enable "Reset High Scores" then press "Service Mode" INPUT_PORTS_START( tictac ) PORT_START PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) @@ -412,8 +425,8 @@ INPUT_PORTS_START( tictac ) PORT_START PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) - PORT_SERVICE( 0x04, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) // ? + PORT_SERVICE_NO_TOGGLE( 0x04, IP_ACTIVE_LOW ) + PORT_DIPNAME( 0x08, 0x08, "Reset High Scores" ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) @@ -440,7 +453,7 @@ INPUT_PORTS_START( tictac ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_START - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x01, 0x01, "Lightning Round 1 Credit" ) PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) @@ -458,6 +471,73 @@ INPUT_PORTS_START( tictac ) PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0xc0, "Upright 1 Player" ) + PORT_DIPSETTING( 0x00, "Upright 2 Players" ) + PORT_DIPSETTING( 0x80, DEF_STR( Cocktail ) ) +// PORT_DIPSETTING( 0x40, "Upright 1 Player" ) +INPUT_PORTS_END + +INPUT_PORTS_START( trivia ) + PORT_START /* IN0 */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) + 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 /* IN1 */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_SERVICE_NO_TOGGLE( 0x04, IP_ACTIVE_LOW ) + PORT_DIPNAME( 0x08, 0x08, "Reset High Scores" ) + 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_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) 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 ) + + PORT_START_TAG("DSWA") + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) ) + 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, "On 0 Points" ) + PORT_DIPSETTING( 0x04, "Continue" ) + PORT_DIPSETTING( 0x00, "Game Over" ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_1C ) ) + 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( Cabinet ) ) PORT_DIPSETTING( 0x40, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) @@ -466,6 +546,18 @@ INPUT_PORTS_START( tictac ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END +// in service mode: +// keep service test button pressed to clear the coin counter. +// keep it pressed for 10 seconds to clear all the memory. +// to enter hidden test mode enable "Enable Test Mode", enable "Reset High Scores" +INPUT_PORTS_START( trvwhziv ) + PORT_INCLUDE( trivia ) + + PORT_MODIFY("DSWA") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) /* no coinage DSW */ + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END INPUT_PORTS_START( pitboss ) PORT_START @@ -507,6 +599,8 @@ INPUT_PORTS_START( pitboss ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END + + static void get_tile_info_bg(int tile_index) { int attr = phrcraze_attr[tile_index]; @@ -569,19 +663,19 @@ gfx_decode merit_gfxdecodeinfo[] = static ppi8255_interface ppi8255_intf = { - 2, /* 2 chips */ + 2, /* 2 chips */ { input_port_0_r, input_port_3_r }, /* Port A read */ - { input_port_1_r, NULL }, /* Port B read */ - { input_port_2_r, NULL }, /* Port C read */ - { NULL, NULL }, /* Port A write */ - { NULL, unk_1_w }, /* Port B write */ - { NULL, misc_w }, /* Port C write */ + { input_port_1_r, NULL }, /* Port B read */ + { input_port_2_r, NULL }, /* Port C read */ + { NULL, NULL }, /* Port A write */ + { NULL, led1_w }, /* Port B write */ + { NULL, misc_w }, /* Port C write */ }; struct AY8910interface merit_ay8912_interface = { 0,0, - led_w,0 + led2_w,0 }; static MACHINE_RESET( merit ) @@ -968,13 +1062,13 @@ DRIVER_INIT( key_7 ) GAME( 1983, pitboss, 0, pitboss, pitboss, 0, ROT0, "Merit", "Pit Boss", GAME_WRONG_COLORS | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING ) GAME( 1983, casino5, 0, pitboss, pitboss, 0, ROT0, "Merit", "Casino 5", GAME_WRONG_COLORS | GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING ) -GAME( 1985, trvwhzho, 0, trvwhiz, tictac, key_0, ROT0, "Merit", "Trivia ? Whiz (Horizontal - Question set 1)", GAME_WRONG_COLORS ) -GAME( 1985, trvwhzha, trvwhzho,trvwhiz, tictac, key_0, ROT0, "Merit", "Trivia ? Whiz (Horizontal - Question set 2)", GAME_WRONG_COLORS ) -GAME( 1985, trvwhzve, 0, trvwhiz, tictac, key_0, ROT90, "Merit", "Trivia ? Whiz (Vertical - Question set 1)", GAME_WRONG_COLORS ) -GAME( 1985, trvwhzva, trvwhzve,trvwhiz, tictac, key_0, ROT90, "Merit", "Trivia ? Whiz (Vertical - Question set 2)", GAME_WRONG_COLORS ) -GAME( 1985, trvwhzii, 0, trvwhiz, tictac, key_2, ROT90, "Merit", "Trivia ? Whiz (Edition 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_GRAPHICS ) -GAME( 1985, trvwziii, 0, trvwhiz, tictac, key_0, ROT0, "Merit", "Trivia ? Whiz (Edition 3)", GAME_WRONG_COLORS | GAME_IMPERFECT_GRAPHICS ) -GAME( 1985, trvwhziv, 0, trvwhziv, tictac, key_5, ROT90, "Merit", "Trivia ? Whiz (Edition 4)", GAME_WRONG_COLORS | GAME_IMPERFECT_GRAPHICS ) -GAME( 1985, tictac, 0, tictac, tictac, key_4, ROT0, "Merit", "Tic Tac Trivia", GAME_WRONG_COLORS ) -GAME( 1986, phrcraze, 0, phrcraze, phrcraze, key_7, ROT0, "Merit", "Phraze Craze", GAME_WRONG_COLORS ) -GAME( 1986, phrcrazs, 0, phrcraze, phrcrazs, key_7, ROT90, "Merit", "Phraze Craze (Sex Kit)", GAME_WRONG_COLORS ) +GAME( 1985, trvwhzho, 0, trvwhiz, trivia, key_0, ROT0, "Merit", "Trivia ? Whiz (Horizontal - Question set 1)", GAME_WRONG_COLORS ) +GAME( 1985, trvwhzha, trvwhzho,trvwhiz, trivia, key_0, ROT0, "Merit", "Trivia ? Whiz (Horizontal - Question set 2)", GAME_WRONG_COLORS ) +GAME( 1985, trvwhzve, 0, trvwhiz, trivia, key_0, ROT90, "Merit", "Trivia ? Whiz (Vertical - Question set 1)", GAME_WRONG_COLORS ) +GAME( 1985, trvwhzva, trvwhzve,trvwhiz, trivia, key_0, ROT90, "Merit", "Trivia ? Whiz (Vertical - Question set 2)", GAME_WRONG_COLORS ) +GAME( 1985, trvwhzii, 0, trvwhiz, trivia, key_2, ROT90, "Merit", "Trivia ? Whiz (Edition 2)", GAME_WRONG_COLORS | GAME_IMPERFECT_GRAPHICS ) +GAME( 1985, trvwziii, 0, trvwhiz, trivia, key_0, ROT0, "Merit", "Trivia ? Whiz (Edition 3)", GAME_WRONG_COLORS | GAME_IMPERFECT_GRAPHICS ) +GAME( 1985, trvwhziv, 0, trvwhziv, trvwhziv, key_5, ROT90, "Merit", "Trivia ? Whiz (Edition 4)", GAME_WRONG_COLORS | GAME_IMPERFECT_GRAPHICS ) +GAME( 1985, tictac, 0, tictac, tictac, key_4, ROT0, "Merit", "Tic Tac Trivia", GAME_WRONG_COLORS ) +GAME( 1986, phrcraze, 0, phrcraze, phrcraze, key_7, ROT0, "Merit", "Phraze Craze", GAME_WRONG_COLORS ) +GAME( 1986, phrcrazs, 0, phrcraze, phrcrazs, key_7, ROT90, "Merit", "Phraze Craze (Sex Kit)", GAME_WRONG_COLORS ) diff --git a/src/drivers/metro.c b/src/drivers/metro.c index 4738bc907..487566ca3 100644 --- a/src/drivers/metro.c +++ b/src/drivers/metro.c @@ -4588,7 +4588,7 @@ int i; for (i = 0;i < (0x20000*3)/2;i++) RAM[i] = rand(); - init_metro(); + init_metro(machine); } static DRIVER_INIT( daitorid ) diff --git a/src/drivers/mgolf.c b/src/drivers/mgolf.c index 3fa7a6625..db551d642 100644 --- a/src/drivers/mgolf.c +++ b/src/drivers/mgolf.c @@ -132,10 +132,10 @@ static MACHINE_RESET( mgolf ) static PALETTE_INIT( mgolf ) { - palette_set_color(0, 0x80, 0x80, 0x80); - palette_set_color(1, 0x00, 0x00, 0x00); - palette_set_color(2, 0x80, 0x80, 0x80); - palette_set_color(3, 0xff, 0xff, 0xff); + palette_set_color(machine, 0, 0x80, 0x80, 0x80); + palette_set_color(machine, 1, 0x00, 0x00, 0x00); + palette_set_color(machine, 2, 0x80, 0x80, 0x80); + palette_set_color(machine, 3, 0xff, 0xff, 0xff); } diff --git a/src/drivers/mhavoc.c b/src/drivers/mhavoc.c index de8506b9d..117cddcbc 100644 --- a/src/drivers/mhavoc.c +++ b/src/drivers/mhavoc.c @@ -244,39 +244,26 @@ static WRITE8_HANDLER( mhavoc_gammaram_w ) * *************************************/ -static ADDRESS_MAP_START( alpha_readmem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x01ff) AM_READ(MRA8_RAM) /* 0.5K Program Ram */ - AM_RANGE(0x0200, 0x07ff) AM_READ(MRA8_BANK1) /* 3K Paged Program RAM */ - AM_RANGE(0x0800, 0x09ff) AM_READ(MRA8_RAM) /* 0.5K Program RAM */ - AM_RANGE(0x1000, 0x1000) AM_READ(mhavoc_gamma_r) /* Gamma Read Port */ - AM_RANGE(0x1200, 0x1200) AM_READ(mhavoc_port_0_r) /* Alpha Input Port 0 */ - AM_RANGE(0x1800, 0x1fff) AM_READ(MRA8_RAM) /* Shared Beta Ram */ - AM_RANGE(0x2000, 0x3fff) AM_READ(MRA8_BANK2) /* Paged Program ROM (32K) */ - AM_RANGE(0x4000, 0x4fff) AM_READ(MRA8_RAM) /* Vector RAM (4K) */ - AM_RANGE(0x5000, 0x5fff) AM_READ(MRA8_ROM) /* Vector ROM (4K) */ - AM_RANGE(0x6000, 0x7fff) AM_READ(MRA8_BANK3) /* Paged Vector ROM (32K) */ - AM_RANGE(0x8000, 0xffff) AM_READ(MRA8_ROM) /* Program ROM (32K) */ -ADDRESS_MAP_END - - -static ADDRESS_MAP_START( alpha_writemem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x01ff) AM_WRITE(MWA8_RAM) /* 0.5K Program Ram */ - AM_RANGE(0x0200, 0x07ff) AM_WRITE(MWA8_BANK1) /* 3K Paged Program RAM */ - AM_RANGE(0x0800, 0x09ff) AM_WRITE(MWA8_RAM) /* 0.5K Program RAM */ - AM_RANGE(0x1200, 0x1200) AM_WRITE(MWA8_NOP) /* don't care */ - AM_RANGE(0x1400, 0x141f) AM_WRITE(mhavoc_colorram_w) /* ColorRAM */ - AM_RANGE(0x1600, 0x1600) AM_WRITE(mhavoc_out_0_w) /* Control Signals */ - AM_RANGE(0x1640, 0x1640) AM_WRITE(avgdvg_go_w) /* Vector Generator GO */ - AM_RANGE(0x1680, 0x1680) AM_WRITE(watchdog_reset_w) /* Watchdog Clear */ - AM_RANGE(0x16c0, 0x16c0) AM_WRITE(avgdvg_reset_w) /* Vector Generator Reset */ - AM_RANGE(0x1700, 0x1700) AM_WRITE(mhavoc_alpha_irq_ack_w)/* IRQ ack */ - AM_RANGE(0x1740, 0x1740) AM_WRITE(mhavoc_rom_banksel_w)/* Program ROM Page Select */ - AM_RANGE(0x1780, 0x1780) AM_WRITE(mhavoc_ram_banksel_w)/* Program RAM Page Select */ - AM_RANGE(0x17c0, 0x17c0) AM_WRITE(mhavoc_gamma_w) /* Gamma Communication Write Port */ - AM_RANGE(0x1800, 0x1fff) AM_WRITE(MWA8_RAM) /* Shared Beta Ram */ - AM_RANGE(0x2000, 0x3fff) AM_WRITE(MWA8_ROM) /* Major Havoc writes here.*/ - AM_RANGE(0x4000, 0x4fff) AM_WRITE(MWA8_RAM) AM_BASE(&vectorram) AM_SIZE(&vectorram_size) AM_REGION(REGION_CPU1, 0x4000)/* Vector Generator RAM */ - AM_RANGE(0x6000, 0xffff) AM_WRITE(MWA8_ROM) +static ADDRESS_MAP_START( alpha_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x01ff) AM_RAM /* 0.5K Program Ram */ + AM_RANGE(0x0200, 0x07ff) AM_RAMBANK(1) /* 3K Paged Program RAM */ + AM_RANGE(0x0800, 0x09ff) AM_RAM /* 0.5K Program RAM */ + AM_RANGE(0x1000, 0x1000) AM_READ(mhavoc_gamma_r) /* Gamma Read Port */ + AM_RANGE(0x1200, 0x1200) AM_READWRITE(mhavoc_port_0_r, MWA8_NOP) /* Alpha Input Port 0 */ + AM_RANGE(0x1400, 0x141f) AM_RAM AM_BASE(&mhavoc_colorram) /* ColorRAM */ + AM_RANGE(0x1600, 0x1600) AM_WRITE(mhavoc_out_0_w) /* Control Signals */ + AM_RANGE(0x1640, 0x1640) AM_WRITE(avgdvg_go_w) /* Vector Generator GO */ + AM_RANGE(0x1680, 0x1680) AM_WRITE(watchdog_reset_w) /* Watchdog Clear */ + AM_RANGE(0x16c0, 0x16c0) AM_WRITE(avgdvg_reset_w) /* Vector Generator Reset */ + AM_RANGE(0x1700, 0x1700) AM_WRITE(mhavoc_alpha_irq_ack_w) /* IRQ ack */ + AM_RANGE(0x1740, 0x1740) AM_WRITE(mhavoc_rom_banksel_w) /* Program ROM Page Select */ + AM_RANGE(0x1780, 0x1780) AM_WRITE(mhavoc_ram_banksel_w) /* Program RAM Page Select */ + AM_RANGE(0x17c0, 0x17c0) AM_WRITE(mhavoc_gamma_w) /* Gamma Communication Write Port */ + AM_RANGE(0x1800, 0x1fff) AM_RAM /* Shared Beta Ram */ + AM_RANGE(0x2000, 0x3fff) AM_ROMBANK(2) /* Paged Program ROM (32K) */ + AM_RANGE(0x4000, 0x4fff) AM_RAM AM_BASE(&vectorram) AM_SIZE(&vectorram_size) AM_REGION(REGION_CPU1, 0x4000)/* Vector Generator RAM */ + AM_RANGE(0x5000, 0x7fff) AM_ROM /* Vector ROM */ + AM_RANGE(0x8000, 0xffff) AM_READ(MRA8_ROM) /* Program ROM (32K) */ ADDRESS_MAP_END @@ -287,27 +274,18 @@ ADDRESS_MAP_END * *************************************/ -static ADDRESS_MAP_START( gamma_readmem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x07ff) AM_READ(MRA8_RAM) /* Program RAM (2K) */ - AM_RANGE(0x0800, 0x1fff) AM_READ(mhavoc_gammaram_r) /* wraps to 0x000-0x7ff */ - AM_RANGE(0x2000, 0x203f) AM_READ(quad_pokey_r) /* Quad Pokey read */ - AM_RANGE(0x2800, 0x2800) AM_READ(mhavoc_port_1_r) /* Gamma Input Port */ - AM_RANGE(0x3000, 0x3000) AM_READ(mhavoc_alpha_r) /* Alpha Comm. Read Port*/ - AM_RANGE(0x3800, 0x3803) AM_READ(input_port_2_r) /* Roller Controller Input*/ - AM_RANGE(0x4000, 0x4000) AM_READ(input_port_4_r) /* DSW at 8S */ - AM_RANGE(0x6000, 0x61ff) AM_READ(MRA8_RAM) /* EEROM */ - AM_RANGE(0x8000, 0xffff) AM_READ(MRA8_ROM) /* Program ROM (16K) */ -ADDRESS_MAP_END - - -static ADDRESS_MAP_START( gamma_writemem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x07ff) AM_WRITE(MWA8_RAM) /* Program RAM (2K) */ - AM_RANGE(0x0800, 0x1fff) AM_WRITE(mhavoc_gammaram_w) AM_BASE(&gammaram) /* wraps to 0x000-0x7ff */ - AM_RANGE(0x2000, 0x203f) AM_WRITE(quad_pokey_w) /* Quad Pokey write */ - AM_RANGE(0x4000, 0x4000) AM_WRITE(mhavoc_gamma_irq_ack_w) /* IRQ Acknowledge */ - AM_RANGE(0x4800, 0x4800) AM_WRITE(mhavoc_out_1_w) /* Coin Counters */ - AM_RANGE(0x5000, 0x5000) AM_WRITE(mhavoc_alpha_w) /* Alpha Comm. Write Port */ - AM_RANGE(0x6000, 0x61ff) AM_WRITE(MWA8_RAM) AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) /* EEROM */ +static ADDRESS_MAP_START( gamma_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x07ff) AM_RAM /* Program RAM (2K) */ + AM_RANGE(0x0800, 0x1fff) AM_READWRITE(mhavoc_gammaram_r, mhavoc_gammaram_w) AM_BASE(&gammaram) /* wraps to 0x000-0x7ff */ + AM_RANGE(0x2000, 0x203f) AM_READWRITE(quad_pokey_r, quad_pokey_w) /* Quad Pokey read */ + AM_RANGE(0x2800, 0x2800) AM_READ(mhavoc_port_1_r) /* Gamma Input Port */ + AM_RANGE(0x3000, 0x3000) AM_READ(mhavoc_alpha_r) /* Alpha Comm. Read Port*/ + AM_RANGE(0x3800, 0x3803) AM_READ(input_port_2_r) /* Roller Controller Input*/ + AM_RANGE(0x4000, 0x4000) AM_READWRITE(input_port_4_r, mhavoc_gamma_irq_ack_w) /* DSW at 8S, IRQ Acknowledge*/ + AM_RANGE(0x4800, 0x4800) AM_WRITE(mhavoc_out_1_w) /* Coin Counters */ + AM_RANGE(0x5000, 0x5000) AM_WRITE(mhavoc_alpha_w) /* Alpha Comm. Write Port */ + AM_RANGE(0x6000, 0x61ff) AM_RAM AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) /* EEROM */ + AM_RANGE(0x8000, 0xffff) AM_READ(MRA8_ROM) /* Program ROM (16K) */ ADDRESS_MAP_END @@ -318,41 +296,27 @@ ADDRESS_MAP_END * *************************************/ -static ADDRESS_MAP_START( alphaone_readmem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x01ff) AM_READ(MRA8_RAM) /* 0.5K Program Ram */ - AM_RANGE(0x0200, 0x07ff) AM_READ(MRA8_BANK1) /* 3K Paged Program RAM */ - AM_RANGE(0x0800, 0x09ff) AM_READ(MRA8_RAM) /* 0.5K Program RAM */ - AM_RANGE(0x1020, 0x103f) AM_READ(dual_pokey_r) - AM_RANGE(0x1040, 0x1040) AM_READ(alphaone_port_0_r) /* Alpha Input Port 0 */ - AM_RANGE(0x1060, 0x1060) AM_READ(input_port_1_r) /* Gamma Input Port */ - AM_RANGE(0x1080, 0x1080) AM_READ(input_port_2_r) /* Roller Controller Input*/ - AM_RANGE(0x1800, 0x18ff) AM_READ(MRA8_RAM) /* EEROM */ - AM_RANGE(0x2000, 0x3fff) AM_READ(MRA8_BANK2) /* Paged Program ROM (32K) */ - AM_RANGE(0x4000, 0x4fff) AM_READ(MRA8_RAM) /* Vector RAM (4K) */ - AM_RANGE(0x5000, 0x5fff) AM_READ(MRA8_ROM) /* Vector ROM (4K) */ - AM_RANGE(0x6000, 0x7fff) AM_READ(MRA8_BANK3) /* Paged Vector ROM (32K) */ - AM_RANGE(0x8000, 0xffff) AM_READ(MRA8_ROM) /* Program ROM (32K) */ -ADDRESS_MAP_END - - -static ADDRESS_MAP_START( alphaone_writemem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x01ff) AM_WRITE(MWA8_RAM) /* 0.5K Program Ram */ - AM_RANGE(0x0200, 0x07ff) AM_WRITE(MWA8_BANK1) /* 3K Paged Program RAM */ - AM_RANGE(0x0800, 0x09ff) AM_WRITE(MWA8_RAM) /* 0.5K Program RAM */ - AM_RANGE(0x1020, 0x103f) AM_WRITE(dual_pokey_w) - AM_RANGE(0x1040, 0x1040) AM_WRITE(MWA8_NOP) /* Nothing here */ - AM_RANGE(0x10a0, 0x10a0) AM_WRITE(alphaone_out_0_w) /* Control Signals */ - AM_RANGE(0x10a4, 0x10a4) AM_WRITE(avgdvg_go_w) /* Vector Generator GO */ - AM_RANGE(0x10a8, 0x10a8) AM_WRITE(watchdog_reset_w) /* Watchdog Clear */ - AM_RANGE(0x10ac, 0x10ac) AM_WRITE(avgdvg_reset_w) /* Vector Generator Reset */ - AM_RANGE(0x10b0, 0x10b0) AM_WRITE(mhavoc_alpha_irq_ack_w) /* IRQ ack */ +static ADDRESS_MAP_START( alphaone_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x01ff) AM_RAM /* 0.5K Program Ram */ + AM_RANGE(0x0200, 0x07ff) AM_RAMBANK(1) /* 3K Paged Program RAM */ + AM_RANGE(0x0800, 0x09ff) AM_RAM /* 0.5K Program RAM */ + AM_RANGE(0x1020, 0x103f) AM_READWRITE(dual_pokey_r, dual_pokey_w) + AM_RANGE(0x1040, 0x1040) AM_READWRITE(alphaone_port_0_r, MWA8_NOP) /* Alpha Input Port 0 */ + AM_RANGE(0x1060, 0x1060) AM_READ(input_port_1_r) /* Gamma Input Port */ + AM_RANGE(0x1080, 0x1080) AM_READ(input_port_2_r) /* Roller Controller Input*/ + AM_RANGE(0x10a0, 0x10a0) AM_WRITE(alphaone_out_0_w) /* Control Signals */ + AM_RANGE(0x10a4, 0x10a4) AM_WRITE(avgdvg_go_w) /* Vector Generator GO */ + AM_RANGE(0x10a8, 0x10a8) AM_WRITE(watchdog_reset_w) /* Watchdog Clear */ + AM_RANGE(0x10ac, 0x10ac) AM_WRITE(avgdvg_reset_w) /* Vector Generator Reset */ + AM_RANGE(0x10b0, 0x10b0) AM_WRITE(mhavoc_alpha_irq_ack_w) /* IRQ ack */ AM_RANGE(0x10b4, 0x10b4) AM_WRITE(mhavoc_rom_banksel_w) AM_RANGE(0x10b8, 0x10b8) AM_WRITE(mhavoc_ram_banksel_w) - AM_RANGE(0x10e0, 0x10ff) AM_WRITE(mhavoc_colorram_w) /* ColorRAM */ - AM_RANGE(0x1800, 0x18ff) AM_WRITE(MWA8_RAM) AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) /* EEROM */ - AM_RANGE(0x2000, 0x3fff) AM_WRITE(MWA8_ROM) /* Major Havoc writes here.*/ - AM_RANGE(0x4000, 0x4fff) AM_WRITE(MWA8_RAM) AM_BASE(&vectorram) AM_SIZE(&vectorram_size) AM_REGION(REGION_CPU1, 0x4000)/* Vector Generator RAM */ - AM_RANGE(0x6000, 0xffff) AM_WRITE(MWA8_ROM) + AM_RANGE(0x10e0, 0x10ff) AM_WRITE(MWA8_RAM) AM_BASE(&mhavoc_colorram) /* ColorRAM */ + AM_RANGE(0x1800, 0x18ff) AM_RAM AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) /* EEROM */ + AM_RANGE(0x2000, 0x3fff) AM_ROMBANK(2) /* Paged Program ROM (32K) */ + AM_RANGE(0x4000, 0x4fff) AM_RAM AM_BASE(&vectorram) AM_SIZE(&vectorram_size) AM_REGION(REGION_CPU1, 0x4000) /* Vector Generator RAM */ + AM_RANGE(0x5000, 0x7fff) AM_ROM /* Vector ROM */ + AM_RANGE(0x8000, 0xffff) AM_ROM /* Program ROM (32K) */ ADDRESS_MAP_END @@ -549,10 +513,10 @@ static MACHINE_DRIVER_START( mhavoc ) /* basic machine hardware */ MDRV_CPU_ADD_TAG("alpha", M6502, MHAVOC_CLOCK_2_5M) /* 2.5 MHz */ - MDRV_CPU_PROGRAM_MAP(alpha_readmem,alpha_writemem) + MDRV_CPU_PROGRAM_MAP(alpha_map, 0) MDRV_CPU_ADD_TAG("gamma", M6502, MHAVOC_CLOCK_1_25M) /* 1.25 MHz */ - MDRV_CPU_PROGRAM_MAP(gamma_readmem,gamma_writemem) + MDRV_CPU_PROGRAM_MAP(gamma_map, 0) MDRV_FRAMES_PER_SECOND(50) MDRV_MACHINE_RESET(mhavoc) @@ -564,7 +528,6 @@ static MACHINE_DRIVER_START( mhavoc ) MDRV_VISIBLE_AREA(0, 300, 0, 260) MDRV_PALETTE_LENGTH(32768) - MDRV_PALETTE_INIT(avg_multi) MDRV_VIDEO_START(avg_mhavoc) MDRV_VIDEO_UPDATE(vector) @@ -591,12 +554,10 @@ static MACHINE_DRIVER_START( alphaone ) /* basic machine hardware */ MDRV_IMPORT_FROM(mhavoc) MDRV_CPU_MODIFY("alpha") - MDRV_CPU_PROGRAM_MAP(alphaone_readmem,alphaone_writemem) + MDRV_CPU_PROGRAM_MAP(alphaone_map, 0) MDRV_CPU_REMOVE("gamma") - /* video hardware */ MDRV_VISIBLE_AREA(0, 580, 0, 500) - MDRV_VIDEO_START(avg_alphaone) /* sound hardware */ MDRV_SOUND_REPLACE("pokey.1", POKEY, MHAVOC_CLOCK_1_25M) @@ -649,6 +610,11 @@ ROM_START( mhavoc ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 16k for code */ ROM_LOAD( "136025.108", 0x08000, 0x4000, CRC(93faf210) SHA1(7744368a1d520f986d1c4246113a7e24fcdd6d04) ) ROM_RELOAD( 0x0c000, 0x4000 ) /* reset+interrupt vectors */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "036408-01.b1", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) + ROM_END @@ -676,6 +642,10 @@ ROM_START( mhavoc2 ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 16k for code */ ROM_LOAD( "136025.108", 0x08000, 0x4000, CRC(93faf210) SHA1(7744368a1d520f986d1c4246113a7e24fcdd6d04) ) ROM_RELOAD( 0x0c000, 0x4000 ) /* reset+interrupt vectors */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "036408-01.b1", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END @@ -701,6 +671,10 @@ ROM_START( mhavocrv ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 16k for code */ ROM_LOAD( "136025.908", 0x08000, 0x4000, CRC(c52ec664) SHA1(08120a385f71b17ec02a3c2ef856ff835a91773e) ) ROM_RELOAD( 0x0c000, 0x4000 ) /* reset+interrupt vectors */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "036408-01.b1", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END @@ -728,6 +702,10 @@ ROM_START( mhavocp ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 16k for code */ ROM_LOAD( "136025.008", 0x8000, 0x4000, CRC(22ea7399) SHA1(eeda8cc40089506063835a62c3273e7dd3918fd5) ) ROM_RELOAD( 0xc000, 0x4000 )/* reset+interrupt vectors */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "036408-01.b1", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END @@ -751,6 +729,10 @@ ROM_START( alphaone ) ROM_LOAD( "vec_pg23.tw", 0x1c000, 0x4000, CRC(1ff74292) SHA1(90e61c48544c62d905e207bba5c67ae7694e86a5) ) /* the last 0x1000 is used for the 2 RAM pages */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "036408-01.b1", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END @@ -774,6 +756,10 @@ ROM_START( alphaona ) ROM_LOAD( "vec_pg23.tw", 0x1c000, 0x4000, CRC(1ff74292) SHA1(90e61c48544c62d905e207bba5c67ae7694e86a5) ) /* the last 0x1000 is used for the 2 RAM pages */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.6c", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END diff --git a/src/drivers/midzeus.c b/src/drivers/midzeus.c index 570959ad6..c6c8ec224 100644 --- a/src/drivers/midzeus.c +++ b/src/drivers/midzeus.c @@ -48,12 +48,7 @@ VIDEO_START( midzeus ) return 1; for (i = 0; i < 32768; i++) - { - int r = (i >> 10) & 0x1f; - int g = (i >> 5) & 0x1f; - int b = (i >> 0) & 0x1f; - palette_set_color(i, (r << 3) | (r >> 2), (g << 3) | (g >> 2), (b << 3) | (b >> 2)); - } + palette_set_color(machine, i, pal5bit(i >> 10), pal5bit(i >> 5), pal5bit(i >> 0)); return 0; } diff --git a/src/drivers/missb2.c b/src/drivers/missb2.c index 32416bf3e..9d441fd34 100644 --- a/src/drivers/missb2.c +++ b/src/drivers/missb2.c @@ -130,18 +130,7 @@ VIDEO_UPDATE( missb2 ) INLINE void bg_changecolor_RRRRGGGGBBBBxxxx(pen_t color,int data) { - int r,g,b; - - - r = (data >> 12) & 0x0f; - g = (data >> 8) & 0x0f; - b = (data >> 4) & 0x0f; - - r = (r << 4) | r; - g = (g << 4) | g; - b = (b << 4) | b; - - palette_set_color(color+256,r,g,b); + palette_set_color(Machine,color+256,pal4bit(data >> 12),pal4bit(data >> 8),pal4bit(data >> 4)); } static WRITE8_HANDLER( bg_paletteram_RRRRGGGGBBBBxxxx_be_w ) diff --git a/src/drivers/missile.c b/src/drivers/missile.c index e4d4da49f..7a38e4739 100644 --- a/src/drivers/missile.c +++ b/src/drivers/missile.c @@ -302,7 +302,7 @@ INLINE void schedule_next_irq(int curv) curv = ((curv + 32) & 0xff) & ~0x10; /* next one at the start of this scanline */ - timer_adjust(irq_timer, cpu_getscanlinetime(v_to_scanline(curv)), curv, 0); + mame_timer_adjust(irq_timer, video_screen_get_time_until_pos(0, v_to_scanline(curv), 0), curv, time_zero); } @@ -322,7 +322,7 @@ static void clock_irq(int curv) static UINT32 get_vblank(void *param) { - int v = scanline_to_v(cpu_getscanline()); + int v = scanline_to_v(video_screen_get_vpos(0)); return v < 24; } @@ -344,7 +344,7 @@ static void adjust_cpu_speed(int curv) /* scanline for the next run */ curv ^= 224; - timer_adjust(cpu_timer, cpu_getscanlinetime(v_to_scanline(curv)), curv, 0); + mame_timer_adjust(cpu_timer, video_screen_get_time_until_pos(0, v_to_scanline(curv), 0), curv, time_zero); } @@ -385,7 +385,7 @@ static MACHINE_START( missile ) /* create a timer to speed/slow the CPU */ cpu_timer = timer_alloc(adjust_cpu_speed); - timer_adjust(cpu_timer, cpu_getscanlinetime(v_to_scanline(0)), 0, 0); + mame_timer_adjust(cpu_timer, video_screen_get_time_until_pos(0, v_to_scanline(0), 0), 0, time_zero); /* create a timer for IRQs and set up the first callback */ irq_timer = timer_alloc(clock_irq); @@ -528,7 +528,7 @@ static UINT8 read_vram(offs_t address) VIDEO_UPDATE( missile ) { - pen_t black = get_black_pen(); + pen_t black = get_black_pen(machine); int x, y; /* draw the bitmap to the screen, looping over Y */ @@ -621,7 +621,7 @@ static WRITE8_HANDLER( missile_w ) /* color RAM */ else if (offset >= 0x4b00 && offset < 0x4c00) - palette_set_color(offset & 7, pal1bit(~data >> 3), pal1bit(~data >> 2), pal1bit(~data >> 1)); + palette_set_color(Machine, offset & 7, pal1bit(~data >> 3), pal1bit(~data >> 2), pal1bit(~data >> 1)); /* watchdog */ else if (offset >= 0x4c00 && offset < 0x4d00) diff --git a/src/drivers/mjkjidai.c b/src/drivers/mjkjidai.c index f7eb04b57..9fe92ade0 100644 --- a/src/drivers/mjkjidai.c +++ b/src/drivers/mjkjidai.c @@ -140,7 +140,7 @@ static WRITE8_HANDLER( keyboard_select_w ) static UINT8 *nvram; static size_t nvram_size; -void nvram_handler_mjkjidai(mame_file *file, int read_or_write) +NVRAM_HANDLER( mjkjidai ) { if (read_or_write) mame_fwrite(file, nvram, nvram_size); diff --git a/src/drivers/mlanding.c b/src/drivers/mlanding.c index 0b41c4251..5001b5548 100644 --- a/src/drivers/mlanding.c +++ b/src/drivers/mlanding.c @@ -8,7 +8,7 @@ READ16_HANDLER( mlanding_unk_r ) { - return mame_rand(); + return mame_rand(Machine); } WRITE16_HANDLER( mlanding_unk_w ) diff --git a/src/drivers/model2.c b/src/drivers/model2.c index ceb5709bf..2a759b80e 100644 --- a/src/drivers/model2.c +++ b/src/drivers/model2.c @@ -229,7 +229,7 @@ static void copro_fifoout_push(UINT32 data) static NVRAM_HANDLER( model2 ) { - nvram_handler_93C46(file, read_or_write); + nvram_handler_93C46(machine, file, read_or_write); if (read_or_write) { @@ -333,7 +333,7 @@ static MACHINE_RESET(model2o) static MACHINE_RESET(model2) { - machine_reset_model2o(); + machine_reset_model2o(machine); memory_set_bankptr(4, memory_region(REGION_SOUND1) + 0x200000); memory_set_bankptr(5, memory_region(REGION_SOUND1) + 0x600000); @@ -344,7 +344,7 @@ static MACHINE_RESET(model2) static MACHINE_RESET(model2b) { - machine_reset_model2(); + machine_reset_model2(machine); cpunum_set_input_line(2, INPUT_LINE_HALT, ASSERT_LINE); //cpunum_set_input_line(3, INPUT_LINE_HALT, ASSERT_LINE); @@ -357,17 +357,7 @@ static MACHINE_RESET(model2b) static void chcolor(pen_t color, UINT16 data) { - int r,g,b; - - r = (data >> 0) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 10) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(color,r,g,b); + palette_set_color(Machine,color,pal5bit(data >> 0),pal5bit(data >> 5),pal5bit(data >> 10)); } static WRITE32_HANDLER(pal32_w) @@ -1587,11 +1577,15 @@ static int scsp_last_line = 0; static void scsp_irq(int irq) { - if (irq) + if (irq > 0) { scsp_last_line = irq; cpunum_set_input_line(1, irq, ASSERT_LINE); } + else if ( irq < 0) + { + cpunum_set_input_line(1, irq, CLEAR_LINE); + } else { cpunum_set_input_line(1, scsp_last_line, CLEAR_LINE); diff --git a/src/drivers/model3.c b/src/drivers/model3.c index 521d52b0f..9900e3ee7 100644 --- a/src/drivers/model3.c +++ b/src/drivers/model3.c @@ -949,7 +949,7 @@ static NVRAM_HANDLER( model3 ) { eeprom_handler(file, read_or_write); } else { - nvram_handler_93C46(file, read_or_write); + nvram_handler_93C46(machine, file, read_or_write); } if (read_or_write) @@ -3963,7 +3963,7 @@ static DRIVER_INIT( lostwsga ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_15(); + init_model3_15(machine); /* TODO: there's an M68K device at 0xC0000000 - FF, maybe lightgun controls ? */ memory_install_read64_handler( 0, ADDRESS_SPACE_PROGRAM, 0xc1000000, 0xc10000ff, 0, 0, scsi_r ); memory_install_write64_handler( 0, ADDRESS_SPACE_PROGRAM, 0xc1000000, 0xc10000ff, 0, 0, scsi_w ); @@ -3977,7 +3977,7 @@ static DRIVER_INIT( scud ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_15(); + init_model3_15(machine); /* TODO: network device at 0xC0000000 - FF */ memory_install_read64_handler( 0, ADDRESS_SPACE_PROGRAM, 0xf9000000, 0xf90000ff, 0, 0, scsi_r ); memory_install_write64_handler( 0, ADDRESS_SPACE_PROGRAM, 0xf9000000, 0xf90000ff, 0, 0, scsi_w ); @@ -3990,7 +3990,7 @@ static DRIVER_INIT( scudp ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_15(); + init_model3_15(machine); /* TODO: network device at 0xC0000000 - FF */ memory_install_read64_handler( 0, ADDRESS_SPACE_PROGRAM, 0xc1000000, 0xc10000ff, 0, 0, scsi_r ); memory_install_write64_handler( 0, ADDRESS_SPACE_PROGRAM, 0xc1000000, 0xc10000ff, 0, 0, scsi_w ); @@ -4007,7 +4007,7 @@ static DRIVER_INIT( scudp ) static DRIVER_INIT( lemans24 ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_15(); + init_model3_15(machine); memory_install_read64_handler( 0, ADDRESS_SPACE_PROGRAM, 0xc1000000, 0xc10000ff, 0, 0, scsi_r ); memory_install_write64_handler( 0, ADDRESS_SPACE_PROGRAM, 0xc1000000, 0xc10000ff, 0, 0, scsi_w ); @@ -4023,7 +4023,7 @@ static DRIVER_INIT( vf3 ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_10(); + init_model3_10(machine); rom[(0x713c7c^4)/4] = 0x60000000; rom[(0x713e54^4)/4] = 0x60000000; @@ -4128,7 +4128,7 @@ static DRIVER_INIT( vs2 ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); rom[(0x705884^4)/4] = 0x60000000; rom[(0x7058a4^4)/4] = 0x60000000; @@ -4138,7 +4138,7 @@ static DRIVER_INIT( vs298 ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); rom[(0x603868^4)/4] = 0x60000000; rom[(0x603888^4)/4] = 0x60000000; @@ -4149,7 +4149,7 @@ static DRIVER_INIT( vs2v991 ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); rom[(0x603868^4)/4] = 0x60000000; rom[(0x603888^4)/4] = 0x60000000; @@ -4159,7 +4159,7 @@ static DRIVER_INIT( vs299 ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); rom[(0x603868^4)/4] = 0x60000000; rom[(0x603888^4)/4] = 0x60000000; @@ -4168,7 +4168,7 @@ static DRIVER_INIT( vs299 ) static DRIVER_INIT( harley ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); memory_install_read64_handler( 0, ADDRESS_SPACE_PROGRAM, 0xc0000000, 0xc00fffff, 0, 0, network_r ); memory_install_write64_handler( 0, ADDRESS_SPACE_PROGRAM, 0xc0000000, 0xc00fffff, 0, 0, network_w ); @@ -4183,7 +4183,7 @@ static DRIVER_INIT( harley ) static DRIVER_INIT( srally2 ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); rom[(0x7c0c4^4)/4] = 0x60000000; rom[(0x7c0c8^4)/4] = 0x60000000; @@ -4193,7 +4193,7 @@ static DRIVER_INIT( srally2 ) static DRIVER_INIT( swtrilgy ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); rom[(0xf0e48^4)/4] = 0x60000000; rom[(0x043dc^4)/4] = 0x48000090; @@ -4204,7 +4204,7 @@ static DRIVER_INIT( swtrilgy ) static DRIVER_INIT( swtrilga ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); rom[(0xf6dd0^4)/4] = 0x60000000; } @@ -4212,7 +4212,7 @@ static DRIVER_INIT( swtrilga ) static DRIVER_INIT( von2 ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); rom[(0x189168^4)/4] = 0x60000000; rom[(0x1890ac^4)/4] = 0x60000000; @@ -4224,7 +4224,7 @@ static DRIVER_INIT( von2 ) static DRIVER_INIT( dirtdvls ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); rom[(0x0600a0^4)/4] = 0x60000000; rom[(0x0608a4^4)/4] = 0x60000000; @@ -4237,7 +4237,7 @@ static DRIVER_INIT( dirtdvls ) static DRIVER_INIT( daytona2 ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); memory_install_write64_handler( 0, ADDRESS_SPACE_PROGRAM, 0xc3800000, 0xc3800007, 0, 0, daytona2_rombank_w ); @@ -4250,7 +4250,7 @@ static DRIVER_INIT( daytona2 ) static DRIVER_INIT( dayto2pe ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); memory_install_write64_handler( 0, ADDRESS_SPACE_PROGRAM, 0xc3800000, 0xc3800007, 0, 0, daytona2_rombank_w ); @@ -4264,7 +4264,7 @@ static DRIVER_INIT( dayto2pe ) static DRIVER_INIT( spikeout ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); rom[(0x6059cc^4)/4] = 0x60000000; rom[(0x6059ec^4)/4] = 0x60000000; @@ -4273,7 +4273,7 @@ static DRIVER_INIT( spikeout ) static DRIVER_INIT( spikeofe ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); rom[(0x6059cc^4)/4] = 0x60000000; rom[(0x6059ec^4)/4] = 0x60000000; @@ -4282,7 +4282,7 @@ static DRIVER_INIT( spikeofe ) static DRIVER_INIT( eca ) { UINT32 *rom = (UINT32*)memory_region(REGION_USER1); - init_model3_20(); + init_model3_20(machine); rom[(0x535580^4)/4] = 0x60000000; rom[(0x5023b4^4)/4] = 0x60000000; diff --git a/src/drivers/mogura.c b/src/drivers/mogura.c index b7a00c65a..8b28cd43e 100644 --- a/src/drivers/mogura.c +++ b/src/drivers/mogura.c @@ -33,7 +33,7 @@ PALETTE_INIT( mogura ) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(j,r,g,b); + palette_set_color(machine,j,r,g,b); j+=4; if (j>31) j-=31; } diff --git a/src/drivers/mpu4.c b/src/drivers/mpu4.c index 32c29900c..83b011be4 100644 --- a/src/drivers/mpu4.c +++ b/src/drivers/mpu4.c @@ -1,5 +1,35 @@ /*************************************************************************** -MPU4 highly preliminary driver +MPU4 highly preliminary driver by ElCondor, and Anonymous. + + 23-09-2006: Converted 7Segment code to cleaner version, but have yet to add new 16k EPROM, as + the original image was purported to come from a Barcrest BBS service, and is probably + more 'official'. + 07-09-2006: It appears that the video firmware is intended to be a 16k EPROM, not 64k as dumped. + In fact, the current dump is just the code repeated 4 times, when nothing earlier than + 0xC000 is ever called. Presumably, the ROM is loaded into C000, and the remainder of the + 'ROM' space is in fact the extra 32k of RAM apparently needed to hold the video board data. + For now, we'll continue to use the old dump, as I am unsure as to how to map this in MAME. + Changed Turn Over's name in AGEMAME, it's either 12 Pound or 20 Pound Turn Over, depending on settings. + + Not that I know how to hook this up, but the O3 pin from IC2 seems to be able to influence + the audio filter in some way - see the circuit diagram on my site for the layout. + + At this stage, I cannot see how to progress any further with the emulation, so I have transferred + a non-AWP version of this driver to MAME for further study. + + 06-09-2006: Connect 4 added - VFD is currently reversed, although it looks to me like + that's the correct behaviour, and that my 'correction' for Old Timer was wrong. + Yamaha sound does work, but is horrendous - presumably there's a filter on the + sound that I haven't spotted. Trackball is apparently connected to AUX1, via + Schmitt triggers - I wish I had a clue what this meant (El Condor). + + 05-09-2006: And the award for most bone-headed bug goes to.. me! the 6840 handler wasn't + resetting the clocks after timeout, so the wave frequencies were way off. + Machines now hang on reset due to a lack of reel support. + CHR decoding now included, but still requires knowledge of the data table + location - this should be present in the ROMs somewhere. + 6850 ACIA code now taken from the SAC-1, with a few alterations for the clocking + in and out - doesn't seem to be copying the right data, though. 11-08-2006: It appears that the PIA IRQ's are not connected after all - but even disabling these won't get around the PTM issues. @@ -7,10 +37,16 @@ MPU4 highly preliminary driver of the original, byte-based chip, meaning that should be fairly simple to emulate too, when the time comes. - 04-08-2006: El Condor + 08-07-2006: Revised mapping of peripherals, and found method of calculating CHR + values - although their use is still unknown. + + 11-05-2006: El Condor, working from schematics and photos at present 28-04-2006: El Condor 20-05-2004: Re-Animator + See http://www.mameworld.net/agemame/techinfo/mpu4main.php for map. + See http://www.mameworld.net/agemame/techinfo/mpu4.php for Video Card information. + --- Board Setup --- The MPU4 BOARD is the driver board, originally designed to run Fruit Machines made by the Barcrest Group, but later @@ -19,6 +55,7 @@ licensed to other firms as a general purpose unit (even some old Photo-Me booths This original board uses a ~1.72 Mhz 6809B CPU, and a number of PIA6821 chips for multiplexing inputs and the like. A 6840PTM is used for internal timing, one of it's functions is to act with an AY8913 chip as a crude analogue sound device. +(Data is transmitted through a PIA, with a square wave from the PTM being used as part of the filtering process) A MPU4 GAME CARD (cartridge) plugs into the MPU4 board containing the game, and a protection PAL (the 'characteriser'). This PAL, as well as protecting the games, also controlled some of the lamp address matrix for many games, and acted as @@ -28,8 +65,8 @@ One of the advantages of the hardware setup was that the developer could change up to a point, adding extra lamp support, different amounts of RAM, and (in many cases) an OKI MSM6376 and related PIA and PTM for improved ADPCM sample support (This was eventually endorsed in the most recent official 'MOD' of the board) -For the Barcrest MPU4 Video system, the cartridge contains the MPU4 video bios in the usual ROM space, interface chips to connect -an additional Video board, and a 6850 serial IO to communicate with said board. This version of the game card does not +For the Barcrest MPU4 Video system, the cartridge contains the MPU4 video bios in the usual ROM space (occupying 16k), interface chips +to connect an additional Video board, and a 6850 serial IO to communicate with said board. This version of the game card does not have the OKI chip, or the characteriser. The VIDEO BOARD is driven by a 10mhz 68000 processor, and contains a 6840PTM, 6850 serial IO (the other end of the @@ -38,7 +75,7 @@ communications), an SAA1099 for stereo sound and SCN2674 gfx chip. The VIDEO CARTRIDGE plugs into the video board, and contains the program roms for the video based game. Like the MPU4 game card, in some cases an extra OKI sound chip is added to the video board's game card,as well as extra RAM. There is a protection chip similar to and replacing the MPU4 Characteriser, which is often fed question data to descramble -(unknown how it works). +(unknown how it works). In non-question cases, however, the protection chip works near identically to the original. A decent schematic for the MPU4 board, amongst other info is available, see http://www.mameworld.net/agemame/techinfo/mpu4.php . @@ -47,22 +84,19 @@ see http://www.mameworld.net/agemame/techinfo/mpu4.php . IC3 causes an infinite loop if IRQA is connected) No video card schematics ever left the PCB factory, but some decent scans of the board have been made, -and will be made available at some stage. +now also available for review. Additional: 68k HALT line is tied to the reset circuit of the MPU4. Emulating the standalone MPU4 is a priority, unless this works, the video won't run. -The copy of this driver held by AGEMAME is currently set up to run a standalone -game (Celebration Club), as well as a title using one of the later 'mods' (Old Timer, +The copy of this driver held by AGEMAME is currently set up to run two UK standalone +games (Celebration Club and Connect 4), as well as a title using one of the later 'mods' (Old Timer, a Dutch machine). Interestingly, on the Video card version of the MPU4, the 6840 IRQ is in fact the FIRQ, in order to help with communications. Everything here is preliminary... the boards are quite fussy with regards their self tests and the timing may have to be perfect for them to function correctly. (as the comms are timer driven, the video is capable of various raster effects etc.) -The 6840 core linked to here should be powerful enough to cover the timing we need, but -Celebration Club currently reports BAD IRQ PULS ALM - meaning that timer 1 on the PTM -is not outputting at 500Hz +- 10% (although the 6840 core claims it is). Datasheets are available for the main components, The AGEMAME site mirrors a few of the harder-to-find ones. @@ -222,90 +256,73 @@ IRQ line connected to CPU 1000-FFFF | R | D D D D D D D D | ROM (can be banked switched by 0x850 in 8 banks of 64 k ) (NV) -----------+---+-----------------+-------------------------------------------------------------------------- - 4000, appears to be something special? - - TODO: - get better memorymap. + TODO: - confirm map, based on 6809 code. - Get MPU4 board working properly, so that video layer will operate. - Confirm that MC6850 emulation is sufficient. */ #include "driver.h" -#include "cpu/m68000/m68000.h" + #include "machine/6821pia.h" #include "machine/6840ptm.h" -#include "machine/6850acia.h" -#include "machine/74148.h" // MPU4 +#include "ui.h" #include "cpu/m6809/m6809.h" #include "sound/ay8910.h" -#include "sound/saa1099.h" -//#include "vidhrdw/awpvid.h" Fruit Machines Only +//#include "vidhrdw/awpvid.h" //Fruit Machines Only #include "machine/lamps.h" #include "machine/steppers.h" // stepper motor #include "machine/vacfdisp.h" // vfd #include "machine/mmtr.h" -#define VERBOSE 0 +// Video +#include "cpu/m68000/m68000.h" +#include "machine/mpu4.c" +//#include "machine/74148.h" +#include "sound/saa1099.h" -#if VERBOSE +#ifdef MAME_DEBUG #define LOG(x) logerror x +#define LOG_CHR(x) logerror x +#define LOG_IC3(x) logerror x +#define LOG_IC8(x) logerror x +#define LOGSTUFF(x) logerror x #else #define LOG(x) +#define LOG_CHR(x) +#define LOG_IC3(x) +#define LOG_IC8(x) +#define LOGSTUFF(x) #endif -#define LOGSTUFF popmessage +#include "mpu4.lh" -#define LOG_IC3(x) //logerror x - -#define LOG_IC8(x) //logerror x - - - -void draw_7segment_led_temp(mame_bitmap *bitmap, int x, int y, UINT8 value, int col_on, int col_off) +void draw_MPU4_led(UINT8 id, UINT8 value) { - - plot_box(bitmap, x-1, y-1, 7, 11, 0); - - /* Top */ - plot_box(bitmap, x+1, y+0, 3, 1, (value & 0x40) ? col_on : col_off); - /* Middle */ - plot_box(bitmap, x+1, y+4, 3, 1, (value & 0x01) ? col_on : col_off); - /* Bottom */ - plot_box(bitmap, x+1, y+8, 3, 1, (value & 0x08) ? col_on : col_off); - /* Top Left */ - plot_box(bitmap, x+0, y+1, 1, 3, (value & 0x02) ? col_on : col_off); - /* Top Right */ - plot_box(bitmap, x+4, y+1, 1, 3, (value & 0x20) ? col_on : col_off); - /* Bottom Left */ - plot_box(bitmap, x+0, y+5, 1, 3, (value & 0x04) ? col_on : col_off); - /* Bottom Right */ - plot_box(bitmap, x+4, y+5, 1, 3, (value & 0x10) ? col_on : col_off); + output_set_digit_value(id,value); } -// local prototypes /////////////////////////////////////////////////////// - - // local vars ///////////////////////////////////////////////////////////// - +static int mmtr_latch; // mechanical meter latch +static int drive; static int alpha_data_line; static int alpha_clock; static int ay8910_address; -//static int expansion_latch; -//static int global_volume; OKI chip only +//static int expansion_latch; MOD 4 and above only +//static int global_volume; static int serial_data; static int signal_50hz; static int ic4_input_b; static int IC23GC; static int IC23GB; static int IC23GA; -//static int prot_row; Needed for CHR emulation -//static int prot_col; +static int prot_col; // user interface stuff /////////////////////////////////////////////////// -//static UINT8 lamps[224]; // 224 multiplexed lamps (2 8X8 matrices) PIAs take care of this in some form +static UINT8 Lamps[128]; // 128 multiplexed lamps (2 8X8 matrices) //static UINT8 inputs[32]; // 32 multiplexed inputs - but a further 8 possible per AUX. // Two connectors 'orange' (sampled every 8ms) and 'black' (sampled every 16ms) // Each connector carries two banks of eight inputs and two enable signals @@ -318,11 +335,16 @@ static UINT8 IC3ca1; static UINT8 yamdata; //static int led_mux_strobe; -//static UINT8 chr_data[16][8]; +static UINT8 chr_data[128]; +static UINT16 chr16_data[128]; static UINT8 led_segs[8]; /* LED Segments related to pins (5 is not connected): +Unlike the controllers emulated in the layout code, each +segment of an MPU4 LED can be set individually, even +being used as individual lamps. However, we can get away +with settings like this in the majority of cases. _9_ | | 3 8 @@ -338,11 +360,14 @@ LED Segments related to pins (5 is not connected): static int input_strobe; // IC23 74LS138 A = CA2 IC7, B = CA2 IC4, C = CA2 IC8 static int output_strobe; // same -// \MPU4 +// Video static UINT8 m6840_irq_state; -extern UINT8 m6850_irq_state; // referenced in machine/6850acia.c +extern UINT8 m6850_irq_state; static UINT8 scn2674_irq_state; +static void update_irq(void); + +int vid_rx; static int mpu4_gfx_index; static UINT16 * mpu4_vid_vidram; @@ -358,56 +383,115 @@ static UINT8 scn2674_cursor_h; static UINT8 scn2674_screen2_l; static UINT8 scn2674_screen2_h; +static const UINT8 MPU4_strcnv[] = +{ //1 //9 //10 //17 + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,//1 + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47//9 +}; -/************************************* - * - * Interrupt system - * - *************************************/ +void update_lamps(void) +{ + if (!IC23GC) + { + if (!IC23GB) + { + if (IC23GA) + { + Lamps[MPU4_strcnv[(16*input_strobe)+0]] = (lamp_strobe & 0x0001) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+1]] = (lamp_strobe & 0x0002) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+2]] = (lamp_strobe & 0x0004) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+3]] = (lamp_strobe & 0x0008) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+4]] = (lamp_strobe & 0x0010) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+5]] = (lamp_strobe & 0x0020) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+6]] = (lamp_strobe & 0x0040) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+7]] = (lamp_strobe & 0x0080) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+8]] = (lamp_strobe & 0x0100) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+9]] = (lamp_strobe & 0x0200) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+10]] = (lamp_strobe & 0x0400) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+11]] = (lamp_strobe & 0x0800) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+12]] = (lamp_strobe & 0x1000) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+13]] = (lamp_strobe & 0x2000) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+14]] = (lamp_strobe & 0x4000) != 0; + Lamps[MPU4_strcnv[(16*input_strobe)+15]] = (lamp_strobe & 0x8000) != 0; + Lamps_SetBrightness(0, 127, Lamps); + } + } + } +} +void awp_lamp_draw(void) +{ + int i,nrlamps; + char lampno[7]; -/* the interrupt system consists of a 74148 priority encoder - with the following interrupt priorites. A lower number - indicates a lower priority: + nrlamps = Lamps_GetNumberLamps(); + for ( i = 0; i < (nrlamps+1); i++ ) + { + sprintf(lampno, "lamp%d", i); + output_set_value(lampno,Lamps_GetBrightness(i)); + } +} - 7 - Game Card - 6 - Game Card - 5 - Game Card - 4 - Game Card - 3 - 2674 AVDC - 2 - 6850 ACIA - 1 - 6840 PTM - 0 - Unused (no such IRQ on 68k) -*/ +// video initialisation /////////////////////////////////////////////////// -void update_mpu68_interrupts(void) +VIDEO_START( mpu4 ) { - int newstate = 0; + return 0; +} - if (m6840_irq_state)//1 - newstate = 1; - if (m6850_irq_state)//2 - newstate = 2; - if (scn2674_irq_state)//3 - newstate = 3; +// video update /////////////////////////////////////////////////////////// -// m6840_irq_state = 0; -// m6850_irq_state = 0; -// scn2674_irq_state = 0; +VIDEO_UPDATE( mpu4 ) +{ + awp_lamp_draw(); - /* set the new state of the IRQ lines */ - if (newstate) - cpunum_set_input_line(1, newstate, HOLD_LINE); - else - cpunum_set_input_line(1, 7, CLEAR_LINE); + if (screen == 0) + { + draw_16seg(bitmap,0,3,9); + } + draw_MPU4_led(0, led_segs[0]); + draw_MPU4_led(1, led_segs[1]); + draw_MPU4_led(2, led_segs[2]); + draw_MPU4_led(3, led_segs[3]); + draw_MPU4_led(4, led_segs[4]); + draw_MPU4_led(5, led_segs[5]); + draw_MPU4_led(6, led_segs[6]); + draw_MPU4_led(7, led_segs[7]); + + return 0; } +// palette initialisation ///////////////////////////////////////////////// +PALETTE_INIT( mpu4 ) +{ + palette_set_color(machine, 0,0x00,0x00,0x00); + palette_set_color(machine, 1,0x00,0x00,0xFF); + palette_set_color(machine, 2,0x00,0xFF,0x00); + palette_set_color(machine, 3,0x00,0xFF,0xFF); + palette_set_color(machine, 4,0xFF,0x00,0x00); + palette_set_color(machine, 5,0xFF,0x00,0xFF); + palette_set_color(machine, 6,0xFF,0xFF,0x00); + palette_set_color(machine, 7,0xFF,0xFF,0xFF); + palette_set_color(machine, 8,0x80,0x80,0x80); + palette_set_color(machine, 9,0x00,0x00,0x80); + palette_set_color(machine,10,0x00,0x80,0x00); + palette_set_color(machine,11,0x00,0x80,0x80); + palette_set_color(machine,12,0x80,0x00,0x00); + palette_set_color(machine,13,0x80,0x00,0x80); + palette_set_color(machine,14,0x80,0x80,0x00); + palette_set_color(machine,15,0x80,0x80,0x80); +} -// MPU4 /////////////////////////////////////////////////////////////////////////// // called if board is reset /////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// -static MACHINE_RESET( mpu4_vid ) +static MACHINE_RESET( mpu4 ) { vfd_reset(0); // reset display1 @@ -430,13 +514,46 @@ static MACHINE_RESET( mpu4_vid ) IC23GC = 0; IC23GB = 0; IC23GA = 0; + prot_col = 0; + +// init rom bank //////////////////////////////////////////////////////// + + { + UINT8 *rom = memory_region(REGION_CPU1); + + memory_configure_bank(1, 0, 8, &rom[0x01000], 0x10000); + + memory_set_bank(1,0);//? + } + +} + +/////////////////////////////////////////////////////////////////////////// + +static MACHINE_RESET( mpu4_vid ) +{ + vfd_reset(0); // reset display1 + +// reset stepper motors ///////////////////////////////////////////////// + { + int pattern =0,i; - uart1_status = 0x02; // MC6850 transmit buffer empty !!! - uart2_status = 0x02; // MC6850 transmit buffer empty !!! - vid_rx = 0; - vid_acia_triggered = 0; - vid_data_from_norm = 0; - norm_data_from_vid = 0; + for ( i = 0; i < 6; i++) + { + Stepper_reset_position(i); + if ( Stepper_optic_state(i) ) pattern |= 1<> 8) & 0xff); - if (ACCESSING_LSB) - send_to_norm(vid_normdata & 0xff); - } - if (norm_uart_status & 0x02) - send_to_vid(norm_viddata); - - if (vid_uart_status & 0x01) - { - aciadata = read_from_norm(); - } - if (norm_uart_status & 0x01) - { - aciadata2 = read_from_vid(); - }*/ -} - -static const ptm6840_interface ptm_vid_intf = +static const ptm6840_interface ptm_ic2b_intf = { - 1000000, - 6880000/4, 0, 0, - vid_o1_callback, vid_o2_callback, vid_o3_callback, - cpu1_irq + 6880000/4, + 0, 0, 0, + ic2_o1_callback, ic2_o2_callback, ic2_o3_callback, + cpu0_firq }; /*************************************************************************** @@ -562,6 +640,7 @@ static WRITE8_HANDLER( pia_ic3_porta_w ) LOG_IC3(("%04x IC3 PIA Port A Set to %2x (lamp strobes 1 - 9)\n", activecpu_get_previouspc(),data)); lamp_strobe = (lamp_strobe & 0xFF00) | data; + update_lamps(); } static WRITE8_HANDLER( pia_ic3_portb_w ) @@ -569,12 +648,19 @@ static WRITE8_HANDLER( pia_ic3_portb_w ) LOG_IC3(("%04x IC3 PIA Port B Set to %2x (lamp strobes 10 - 17)\n", activecpu_get_previouspc(),data)); lamp_strobe = (lamp_strobe & 0x00FF) | (data<<8); + update_lamps(); +} + +static READ8_HANDLER( pia_ic3_ca1_r ) +{ + LOG_IC3(("%04x IC3 PIA Read CA1 (PTM) %x \n",activecpu_get_previouspc(),IC3ca1)); + return IC3ca1; } static READ8_HANDLER( pia_ic3_ca2_r ) { LOG_IC3(("%04x IC3 PIA Read CA2\n",activecpu_get_previouspc())); - return alpha_data_line;//0; + return alpha_data_line; } static WRITE8_HANDLER( pia_ic3_ca2_w ) @@ -593,24 +679,6 @@ static WRITE8_HANDLER( pia_ic3_cb2_w ) /* UNUSED FUNCTION -static READ8_HANDLER( pia_ic3_ca1_r ) -{ - LOG_IC3(("%04x IC3 PIA Read CA1 (PTM) %x \n",activecpu_get_previouspc(),IC3ca1)); - return IC3ca1; -} - -static READ8_HANDLER( pia_ic3_porta_r ) -{ - LOG_IC3(("%04x IC3 PIA Read of Port A (lamp strobes 1 - 9) %2x \n",activecpu_get_previouspc(),lamp_strobe)); - return lamp_strobe; -} - -static READ8_HANDLER( pia_ic3_portb_r ) -{ - LOG_IC3(("%04x IC3 PIA Read of Port B (lamp strobes 10 - 17) %2x \n",activecpu_get_previouspc(),lamp_strobe)); - return lamp_strobe; -} - static READ8_HANDLER( pia_ic3_cb1_r ) { // LOG_IC3(("%04x IC3 PIA Read CB1\n",activecpu_get_previouspc())); @@ -695,6 +763,12 @@ static READ8_HANDLER( pia_ic4_portb_r ) return ic4_input_b; } +static READ8_HANDLER( pia_ic4_ca1_r ) +{ + LOG(("%04x IC4 50Hz %x\n",activecpu_get_previouspc(),signal_50hz)); + return signal_50hz; +} + static WRITE8_HANDLER( pia_ic4_ca2_w ) { LOG_IC3(("%04x IC4 PIA Write CA (input MUX strobe /LED B), %02X\n", activecpu_get_previouspc(),data&0xFF)); @@ -718,12 +792,6 @@ static READ8_HANDLER( pia_ic4_cb1_r ) return 0; //serial data } -static READ8_HANDLER( pia_ic4_ca1_r ) -{ - LOG(("%04x IC4 50Hz %x\n",activecpu_get_previouspc(),signal_50hz)); - return signal_50hz; -} - static WRITE8_HANDLER( pia_ic4_portb_w ) { logerror("%04x IC4 PIA Port B Set to %2x\n", activecpu_get_previouspc(),data); @@ -747,7 +815,7 @@ static const pia6821_interface pia_ic4_intf = { /*inputs : A/B,CA/B1,CA/B2 */ 0, pia_ic4_portb_r, 0, 0, 0, 0, /*outputs: A/B,CA/B2 */ pia_ic4_porta_w, 0, pia_ic4_ca2_w, pia_ic4_cb2_w, - /*irqs : A/B */ 0, 0 + /*irqs : A/B */ cpu0_irq, cpu0_irq }; static READ8_HANDLER( pia_ic5_porta_r ) @@ -786,33 +854,6 @@ static READ8_HANDLER( pia_ic5_cb1_r ) return readinputportbytag("AUX2") & 0x80; } -static WRITE8_HANDLER( pia_ic5_porta_w ) -{ - int changed = lamp_data ^ data; - - lamp_data = data; - - LOG(("%04x IC5 PIA Port A Set to %2x\n", activecpu_get_previouspc(), data)); - - if ( changed & 0x80 ) - { - if ( !(data & 0x80) ) - { - int i = 0; - UINT16 p = 1; - - while ( p ) - { - if ( lamp_strobe & p ) lamps[i<<3] = data; - - p <<= 1; - i++; - } - - Lamps_SetBrightness(0, 255, lamps); - } - } -} static WRITE8_HANDLER( pia_ic5_portb_w ) { LOG(("%04x IC5 PIA Port B Set to %2x\n", activecpu_get_previouspc(), data)); @@ -873,7 +914,7 @@ BDIR BC1 | static void update_yam(void) { - switch (ay8910_address) + switch (ay8910_address) { case 0x00: { @@ -914,10 +955,22 @@ static READ8_HANDLER( pia_ic6_porta_r ) static WRITE8_HANDLER( pia_ic6_portb_w ) { - LOG(("%04x IC6 PIA Port B Set to %2x\n", activecpu_get_previouspc(),data)); + LOG(("%04x IC6 PIA Port B Set to %2x (Reel A and B)\n", activecpu_get_previouspc(),data)); + +// Stepper_update(0, (data >> 4) & 0x0F ); +// Stepper_update(1, data & 0x0F ); + Stepper_update(0, data >> 4); + Stepper_update(1, (data)); + + if ( Stepper_optic_state(0) ) optic_pattern |= 0x01; + else optic_pattern &= ~0x01; + if ( Stepper_optic_state(1) ) optic_pattern |= 0x02; + else optic_pattern &= ~0x02; + + if (!optic_pattern == 0) + pia_set_input_cb2(1,0); // signal is connected to IC4 CB2 + pia_set_input_cb2(1,1); - Stepper_update(0, (data >> 4) & 0x0F ); - Stepper_update(1, data & 0x0F ); } static WRITE8_HANDLER( pia_ic6_porta_w ) @@ -989,9 +1042,78 @@ static WRITE8_HANDLER( pia_ic7_porta_w ) static WRITE8_HANDLER( pia_ic7_portb_w ) { + int changed = mmtr_latch ^ data; + long cycles = MAME_TIME_TO_CYCLES(0, mame_timer_get_time() ); + + mmtr_latch = data; + if (drive) + { + if ( changed & 0x01 ) + { + if ( Mechmtr_update(0, cycles, data & 0x01 ) ) + { + LOG(("meter %d = %ld\n", 1, MechMtr_Getcount(0) )); + } + } + + if ( changed & 0x02 ) + { + if ( Mechmtr_update(1, cycles, data & 0x02 ) ) + { + LOG(("meter %d = %ld\n", 2, MechMtr_Getcount(1) )); + } + } + + if ( changed & 0x04 ) + { + if ( Mechmtr_update(2, cycles, data & 0x04 ) ) + { + LOG(("meter %d = %ld\n", 3, MechMtr_Getcount(2) )); + } + } + + if ( changed & 0x08 ) + { + if ( Mechmtr_update(3, cycles, data & 0x08 ) ) + { + LOG(("meter %d = %ld\n", 4, MechMtr_Getcount(3) )); + } + } + + if ( changed & 0x10 ) + { + if ( Mechmtr_update(4, cycles, data & 0x10 ) ) + { + LOG(("meter %d = %ld\n", 5, MechMtr_Getcount(4) )); + } + } + + if ( changed & 0x20 ) + { + if ( Mechmtr_update(5, cycles, data & 0x20 ) ) + { + LOG(("meter %d = %ld\n", 6, MechMtr_Getcount(5) )); + } + } + + if ( changed & 0x40 ) + { + if ( Mechmtr_update(6, cycles, data & 0x40 ) ) + { + LOG(("meter %d = %ld\n", 7, MechMtr_Getcount(6) )); + } + } + if ( changed & 0x80 ) + { + if ( Mechmtr_update(7, cycles, data & 0x80 ) ) + { + LOG(("meter %d = %ld\n", 8, MechMtr_Getcount(7) )); + } + } + } LOG(("%04x IC7 PIA Port B Set to %2x (Meters, Reel E and F)\n", activecpu_get_previouspc(),data)); -// Stepper_update(4, (data >> 4) & 0x0F ); -// Stepper_update(5, data & 0x0F ); + // Stepper_update(4, (data >> 4) & 0x0F ); + // Stepper_update(5, data & 0x0F ); } static WRITE8_HANDLER( pia_ic7_ca2_w ) @@ -1009,6 +1131,7 @@ static WRITE8_HANDLER( pia_ic7_ca2_w ) static WRITE8_HANDLER( pia_ic7_cb2_w ) { LOG(("%04x IC7 PIA write CB2 %2x (meter driver PL3)\n", activecpu_get_previouspc(),data)); + drive = data; } /* @@ -1047,7 +1170,7 @@ static READ8_HANDLER( pia_ic8_porta_r ) { pia_set_input_cb1(2, (readinputportbytag("AUX2") & 0x80)); } - return readinputport(input_strobe);//inputs[ input_strobe&0x07 ]; + return readinputport(input_strobe); } static WRITE8_HANDLER( pia_ic8_portb_w ) @@ -1119,34 +1242,123 @@ static const pia6821_interface pia_ic8_intf = /*irqs : A/B */ 0,0 }; -// \MPU4 -// SCN2674 AVDC emulation +// Video -/* the chip is actually more complex than this.. character aren't limited to 8 rows high... but I - don't *think* the MPU4 stuff needs otherwise.. yet .. */ +/************************************* + * + * Interrupt system + * + *************************************/ -static const gfx_layout mpu4_vid_char_8x8_layout = -{ - 8,8, - 0x1000, // 0x1000 tiles (128k of GFX Ram, 0x20 bytes per tile) - 4, - { 0,8,16,24 }, - { 0,1,2,3,4,5,6,7 }, - { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32}, - 8*32 -}; +/* the interrupt system consists of a 74148 priority encoder + with the following interrupt priorites. A lower number + indicates a lower priority: -/* double height */ -static const gfx_layout mpu4_vid_char_8x16_layout = -{ - 8,16, - 0x1000, // 0x1000 tiles (128k of GFX Ram, 0x20 bytes per tile) - 4, - { 0,8,16,24 }, - { 0,1,2,3,4,5,6,7 }, - { 0*32, 0*32, 1*32, 1*32, 2*32, 2*32, 3*32, 3*32, 4*32, 4*32, 5*32, 5*32, 6*32, 6*32, 7*32, 7*32}, - 8*32 -}; + 7 - Game Card + 6 - Game Card + 5 - Game Card + 4 - Game Card + 3 - 2674 AVDC + 2 - 6850 ACIA + 1 - 6840 PTM + 0 - Unused (no such IRQ on 68k) +*/ + +void update_mpu68_interrupts(void) +{ + int newstate = 0; + + if (m6840_irq_state)//1 + newstate = 1; + if (m6850_irq_state)//2 + newstate = 2; + if (scn2674_irq_state)//3 + newstate = 3; + + /* set the new state of the IRQ lines */ + if (newstate) + { + LOG(("68k IRQ, %x\n", newstate)); + cpunum_set_input_line(1, newstate, ASSERT_LINE); + } + else + { + LOG(("68k IRQ Clear, %x\n", newstate)); + cpunum_set_input_line(1, 7, CLEAR_LINE); + } + m6840_irq_state = 0; + m6850_irq_state = 0; + scn2674_irq_state = 0; + +} + +static void cpu1_irq(int state) +{ + LOG(("68k IRQ set, %x\n", state)); + m6840_irq_state = state; + update_mpu68_interrupts(); +} + +static WRITE8_HANDLER( vid_o1_callback ) +{ + ptm6840_set_c2( 1, data); // copy output value to c2 +} + +static WRITE8_HANDLER( vid_o2_callback ) +{ + ptm6840_set_c3( 1, data); // copy output value to c3 +} + +static WRITE8_HANDLER( vid_o3_callback ) +{ + ptm6840_set_c1( 1, data); // copy output value to c1 + + //Unknown function, believed to be 6850 Tx,Rx clocks + + if (!m6850_mpu4_status & 0x02); + m6850_mpu4_data_ready_callback(m6850_mpu4_output_temp); + + if (!m6850_status & 0x02); + m6850_data_ready_callback(m6850_output_temp); + +} + +static const ptm6840_interface ptm_vid_intf = +{ + 1000000, + 6880000/4, 0, 0, + vid_o1_callback, vid_o2_callback, vid_o3_callback, + cpu1_irq +}; + + +// SCN2674 AVDC emulation + +/* the chip is actually more complex than this.. character aren't limited to 8 rows high... but I + don't *think* the MPU4 stuff needs otherwise.. yet .. */ + +static const gfx_layout mpu4_vid_char_8x8_layout = +{ + 8,8, + 0x1000, // 0x1000 tiles (128k of GFX Ram, 0x20 bytes per tile) + 4, + { 0,8,16,24 }, + { 0,1,2,3,4,5,6,7 }, + { 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32}, + 8*32 +}; + +/* double height */ +static const gfx_layout mpu4_vid_char_8x16_layout = +{ + 8,16, + 0x1000, // 0x1000 tiles (128k of GFX Ram, 0x20 bytes per tile) + 4, + { 0,8,16,24 }, + { 0,1,2,3,4,5,6,7 }, + { 0*32, 0*32, 1*32, 1*32, 2*32, 2*32, 3*32, 3*32, 4*32, 4*32, 5*32, 5*32, 6*32, 6*32, 7*32, 7*32}, + 8*32 +}; /* double width */ static const gfx_layout mpu4_vid_char_16x8_layout = @@ -1217,8 +1429,8 @@ VIDEO_UPDATE( mpu4_vid ) /* this is in main ram.. i think it must transfer it out of here??? */ -// count = 0x0018b6/2; // crmaze -// count = 0x004950/2; // turnover + // count = 0x0018b6/2; // crmaze + // count = 0x004950/2; // turnover /* we're in row table mode...thats why */ @@ -1255,15 +1467,16 @@ VIDEO_UPDATE( mpu4_vid ) popmessage("%02x %02x %02x %02x %02x %02x",scn2674_screen1_l,scn2674_screen1_h,scn2674_cursor_l, scn2674_cursor_h,scn2674_screen2_l,scn2674_screen2_h); - draw_7segment_led_temp(bitmap, 300, 504, led_segs[0], 4, 0); - draw_7segment_led_temp(bitmap, 308, 504, led_segs[1], 4, 0); - draw_7segment_led_temp(bitmap, 316, 504, led_segs[2], 4, 0); - draw_7segment_led_temp(bitmap, 324, 504, led_segs[3], 4, 0); - draw_7segment_led_temp(bitmap, 332, 504, led_segs[4], 4, 0); - draw_7segment_led_temp(bitmap, 340, 504, led_segs[5], 4, 0); - draw_7segment_led_temp(bitmap, 348, 504, led_segs[6], 4, 0); - draw_7segment_led_temp(bitmap, 356, 504, led_segs[7], 4, 0); - + #if 0 + draw_MPU4_led(0, led_segs[0]); + draw_MPU4_led(1, led_segs[1]); + draw_MPU4_led(2, led_segs[2]); + draw_MPU4_led(3, led_segs[3]); + draw_MPU4_led(4, led_segs[4]); + draw_MPU4_led(5, led_segs[5]); + draw_MPU4_led(6, led_segs[6]); + draw_MPU4_led(7, led_segs[7]); + #endif return 0; } @@ -1306,7 +1519,7 @@ IR14 ---- ---- void scn2674_write_init_regs(UINT8 data) { - LOGSTUFF("scn2674_write_init_regs %02x %02x\n",scn2675_IR_pointer,data); + LOGSTUFF(("scn2674_write_init_regs %02x %02x\n",scn2675_IR_pointer,data)); scn2674_IR[scn2675_IR_pointer]=data; @@ -1319,18 +1532,18 @@ void scn2674_write_init_regs(UINT8 data) IR0_scn2674_sync_select = (data&0x04)>>2; IR0_scn2674_buffer_mode_select = (data&0x03); - LOGSTUFF("IR0 - Double Ht Wd %02x\n",IR0_scn2674_double_ht_wd); - LOGSTUFF("IR0 - Scanlines per Character Row %02x\n",IR0_scn2674_scanline_per_char_row); - LOGSTUFF("IR0 - Sync Select %02x\n",IR0_scn2674_sync_select); - LOGSTUFF("IR0 - Buffer Mode Select %02x\n",IR0_scn2674_buffer_mode_select); + LOGSTUFF(("IR0 - Double Ht Wd %02x\n",IR0_scn2674_double_ht_wd)); + LOGSTUFF(("IR0 - Scanlines per Character Row %02x\n",IR0_scn2674_scanline_per_char_row)); + LOGSTUFF(("IR0 - Sync Select %02x\n",IR0_scn2674_sync_select)); + LOGSTUFF(("IR0 - Buffer Mode Select %02x\n",IR0_scn2674_buffer_mode_select)); break; case 1: IR1_scn2674_interlace_enable = (data&0x80)>>7; IR1_scn2674_equalizing_constant = (data&0x7f); - LOGSTUFF("IR1 - Interlace Enable %02x\n",IR1_scn2674_interlace_enable); - LOGSTUFF("IR1 - Equalizing Constant %02x\n",IR1_scn2674_equalizing_constant); + LOGSTUFF(("IR1 - Interlace Enable %02x\n",IR1_scn2674_interlace_enable)); + LOGSTUFF(("IR1 - Equalizing Constant %02x\n",IR1_scn2674_equalizing_constant)); break; case 2: @@ -1338,25 +1551,25 @@ void scn2674_write_init_regs(UINT8 data) IR2_scn2674_horz_sync_width = (data&0x78)>>3; IR2_scn2674_horz_back_porch = (data&0x07); - LOGSTUFF("IR2 - Row Table %02x\n",IR2_scn2674_row_table); - LOGSTUFF("IR2 - Horizontal Sync Width %02x\n",IR2_scn2674_horz_sync_width); - LOGSTUFF("IR2 - Horizontal Back Porch %02x\n",IR2_scn2674_horz_back_porch); + LOGSTUFF(("IR2 - Row Table %02x\n",IR2_scn2674_row_table)); + LOGSTUFF(("IR2 - Horizontal Sync Width %02x\n",IR2_scn2674_horz_sync_width)); + LOGSTUFF(("IR2 - Horizontal Back Porch %02x\n",IR2_scn2674_horz_back_porch)); break; case 3: IR3_scn2674_vert_front_porch = (data&0xe0)>>5; IR3_scn2674_vert_back_porch = (data&0x1f)>>0; - LOGSTUFF("IR3 - Vertical Front Porch %02x\n",IR3_scn2674_vert_front_porch); - LOGSTUFF("IR3 - Vertical Back Porch %02x\n",IR3_scn2674_vert_back_porch); + LOGSTUFF(("IR3 - Vertical Front Porch %02x\n",IR3_scn2674_vert_front_porch)); + LOGSTUFF(("IR3 - Vertical Back Porch %02x\n",IR3_scn2674_vert_back_porch)); break; case 4: IR4_scn2674_rows_per_screen = data&0x7f; IR4_scn2674_character_blink_rate = (data & 0x80)>>7; - LOGSTUFF("IR4 - Rows Per Screen %02x\n",IR4_scn2674_rows_per_screen); - LOGSTUFF("IR4 - Character Blink Rate %02x\n",IR4_scn2674_character_blink_rate); + LOGSTUFF(("IR4 - Rows Per Screen %02x\n",IR4_scn2674_rows_per_screen)); + LOGSTUFF(("IR4 - Character Blink Rate %02x\n",IR4_scn2674_character_blink_rate)); break; case 5: @@ -1364,7 +1577,7 @@ void scn2674_write_init_regs(UINT8 data) cccc cccc c = Characters Per Row */ IR5_scn2674_character_per_row = data; - LOGSTUFF("IR5 - Active Characters Per Row %02x\n",IR5_scn2674_character_per_row); + LOGSTUFF(("IR5 - Active Characters Per Row %02x\n",IR5_scn2674_character_per_row)); break; case 6: @@ -1375,38 +1588,38 @@ void scn2674_write_init_regs(UINT8 data) case 8: IR8_scn2674_display_buffer_first_address_LSB = data; - LOGSTUFF("IR8 - Display Buffer First Address LSB %02x\n",IR8_scn2674_display_buffer_first_address_LSB); + LOGSTUFF(("IR8 - Display Buffer First Address LSB %02x\n",IR8_scn2674_display_buffer_first_address_LSB)); break; case 9: IR9_scn2674_display_buffer_first_address_MSB = data & 0x0f; IR9_scn2674_display_buffer_last_address = (data & 0xf0)>>4; - LOGSTUFF("IR9 - Display Buffer First Address MSB %02x\n",IR9_scn2674_display_buffer_first_address_MSB); - LOGSTUFF("IR9 - Display Buffer Last Address %02x\n",IR9_scn2674_display_buffer_last_address); + LOGSTUFF(("IR9 - Display Buffer First Address MSB %02x\n",IR9_scn2674_display_buffer_first_address_MSB)); + LOGSTUFF(("IR9 - Display Buffer Last Address %02x\n",IR9_scn2674_display_buffer_last_address)); break; case 10: IR10_scn2674_display_pointer_address_lower = data; - LOGSTUFF("IR10 - Display Pointer Address Lower %02x\n",IR10_scn2674_display_pointer_address_lower); + LOGSTUFF(("IR10 - Display Pointer Address Lower %02x\n",IR10_scn2674_display_pointer_address_lower)); break; case 11: IR11_scn2674_display_pointer_address_upper= data&0x3f; - LOGSTUFF("IR11 - Display Pointer Address Lower %02x\n",IR11_scn2674_display_pointer_address_upper); + LOGSTUFF(("IR11 - Display Pointer Address Lower %02x\n",IR11_scn2674_display_pointer_address_upper)); break; case 12: IR12_scn2674_scroll_start = (data & 0x80)>>7; IR12_scn2674_split_register_1 = (data & 0x7f); - LOGSTUFF("IR12 - Scroll Start %02x\n",IR12_scn2674_scroll_start); - LOGSTUFF("IR12 - Split Register 1 %02x\n",IR12_scn2674_split_register_1); + LOGSTUFF(("IR12 - Scroll Start %02x\n",IR12_scn2674_scroll_start)); + LOGSTUFF(("IR12 - Split Register 1 %02x\n",IR12_scn2674_split_register_1)); break; case 13: IR13_scn2674_scroll_end = (data & 0x80)>>7; IR13_scn2674_split_register_2 = (data & 0x7f); - LOGSTUFF("IR13 - Scroll End %02x\n",IR13_scn2674_scroll_end); - LOGSTUFF("IR13 - Split Register 2 %02x\n",IR13_scn2674_split_register_2); + LOGSTUFF(("IR13 - Scroll End %02x\n",IR13_scn2674_scroll_end)); + LOGSTUFF(("IR13 - Split Register 2 %02x\n",IR13_scn2674_split_register_2)); break; case 14: @@ -1433,18 +1646,18 @@ void scn2674_write_command(UINT8 data) { UINT8 oprand; - LOGSTUFF("scn2674_write_command %02x\n",data); + LOGSTUFF(("scn2674_write_command %02x\n",data)); if (data==0x00) { // master reset - LOGSTUFF("master reset %02x\n",data); + LOGSTUFF(("master reset %02x\n",data)); } if ((data&0xf0)==0x10) { // set IR pointer - LOGSTUFF("set IR pointer %02x\n",data); + LOGSTUFF(("set IR pointer %02x\n",data)); oprand = data & 0x0f; scn2675_IR_pointer=oprand; @@ -1456,14 +1669,14 @@ void scn2674_write_command(UINT8 data) if ((data&0xe3)==0x22) { // Disable GFX - LOGSTUFF("disable GFX %02x\n",data); + LOGSTUFF(("disable GFX %02x\n",data)); scn2674_gfx_enabled = 0; } if ((data&0xe3)==0x23) { // Enable GFX - LOGSTUFF("enable GFX %02x\n",data); + LOGSTUFF(("enable GFX %02x\n",data)); scn2674_gfx_enabled = 1; } @@ -1475,9 +1688,9 @@ void scn2674_write_command(UINT8 data) scn2674_display_enabled = 0; if (oprand) - LOGSTUFF("display OFF - float DADD bus %02x\n",data); + LOGSTUFF(("display OFF - float DADD bus %02x\n",data)); else - LOGSTUFF("display OFF - no float DADD bus %02x\n",data); + LOGSTUFF(("display OFF - no float DADD bus %02x\n",data)); } if ((data&0xe9)==0x29) @@ -1488,23 +1701,23 @@ void scn2674_write_command(UINT8 data) scn2674_display_enabled = 1; if (oprand) - LOGSTUFF("display ON - next field %02x\n",data); + LOGSTUFF(("display ON - next field %02x\n",data)); else - LOGSTUFF("display ON - next scanline %02x\n",data); + LOGSTUFF(("display ON - next scanline %02x\n",data)); } if ((data&0xf1)==0x30) { // Cursor Off - LOGSTUFF("cursor off %02x\n",data); + LOGSTUFF(("cursor off %02x\n",data)); scn2674_cursor_enabled = 0; } if ((data&0xf1)==0x31) { // Cursor On - LOGSTUFF("cursor on %02x\n",data); + LOGSTUFF(("cursor on %02x\n",data)); scn2674_cursor_enabled = 1; } @@ -1514,20 +1727,20 @@ void scn2674_write_command(UINT8 data) { // Reset Interrupt / Status bit oprand = data & 0x1f; - LOGSTUFF("reset interrupt / status bit %02x\n",data); + LOGSTUFF(("reset interrupt / status bit %02x\n",data)); - LOGSTUFF("Split 2 IRQ: %d Reset\n",(data>>0)&1); - LOGSTUFF("Ready IRQ: %d Reset\n",(data>>1)&1); - LOGSTUFF("Split 1 IRQ: %d Reset\n",(data>>2)&1); - LOGSTUFF("Line Zero IRQ: %d Reset\n",(data>>3)&1); - LOGSTUFF("V-Blank IRQ: %d Reset\n",(data>>4)&1); + LOGSTUFF(("Split 2 IRQ: %d Reset\n",(data>>0)&1)); + LOGSTUFF(("Ready IRQ: %d Reset\n",(data>>1)&1)); + LOGSTUFF(("Split 1 IRQ: %d Reset\n",(data>>2)&1)); + LOGSTUFF(("Line Zero IRQ: %d Reset\n",(data>>3)&1)); + LOGSTUFF(("V-Blank IRQ: %d Reset\n",(data>>4)&1)); scn2674_irq_register &= ((data & 0x1f)^0x1f); scn2674_status_register &= ((data & 0x1f)^0x1f); if(data&0x10) //cpunum_set_input_line(1, 3, ASSERT_LINE); // maybe .. or maybe it just changes the register { - scn2674_irq_state = 1; //need to check priorities + scn2674_irq_state = 1; update_mpu68_interrupts(); } else @@ -1538,12 +1751,12 @@ void scn2674_write_command(UINT8 data) { // Disable Interrupt oprand = data & 0x1f; - LOGSTUFF("disable interrupt %02x\n",data); - LOGSTUFF("Split 2 IRQ: %d Disabled\n",(data>>0)&1); - LOGSTUFF("Ready IRQ: %d Disabled\n",(data>>1)&1); - LOGSTUFF("Split 1 IRQ: %d Disabled\n",(data>>2)&1); - LOGSTUFF("Line Zero IRQ: %d Disabled\n",(data>>3)&1); - LOGSTUFF("V-Blank IRQ: %d Disabled\n",(data>>4)&1); + LOGSTUFF(("disable interrupt %02x\n",data)); + LOGSTUFF(("Split 2 IRQ: %d Disabled\n",(data>>0)&1)); + LOGSTUFF(("Ready IRQ: %d Disabled\n",(data>>1)&1)); + LOGSTUFF(("Split 1 IRQ: %d Disabled\n",(data>>2)&1)); + LOGSTUFF(("Line Zero IRQ: %d Disabled\n",(data>>3)&1)); + LOGSTUFF(("V-Blank IRQ: %d Disabled\n",(data>>4)&1)); // scn2674_irq_mask &= ((data & 0x1f)^0x1f); // disables.. doesn't enable? @@ -1560,12 +1773,12 @@ void scn2674_write_command(UINT8 data) if ((data&0xe0)==0x60) { // Enable Interrupt - LOGSTUFF("enable interrupt %02x\n",data); - LOGSTUFF("Split 2 IRQ: %d Enabled\n",(data>>0)&1); - LOGSTUFF("Ready IRQ: %d Enabled\n",(data>>1)&1); - LOGSTUFF("Split 1 IRQ: %d Enabled\n",(data>>2)&1); - LOGSTUFF("Line Zero IRQ: %d Enabled\n",(data>>3)&1); - LOGSTUFF("V-Blank IRQ: %d Enabled\n",(data>>4)&1); + LOGSTUFF(("enable interrupt %02x\n",data)); + LOGSTUFF(("Split 2 IRQ: %d Enabled\n",(data>>0)&1)); + LOGSTUFF(("Ready IRQ: %d Enabled\n",(data>>1)&1)); + LOGSTUFF(("Split 1 IRQ: %d Enabled\n",(data>>2)&1)); + LOGSTUFF(("Line Zero IRQ: %d Enabled\n",(data>>3)&1)); + LOGSTUFF(("V-Blank IRQ: %d Enabled\n",(data>>4)&1)); scn2674_irq_mask |= (data & 0x1f); // enables .. doesn't disable? @@ -1576,55 +1789,55 @@ void scn2674_write_command(UINT8 data) if (data == 0xa4) { // read at pointer address - LOGSTUFF("read at pointer address %02x\n",data); + LOGSTUFF(("read at pointer address %02x\n",data)); } if (data == 0xa2) { // write at pointer address - LOGSTUFF("write at pointer address %02x\n",data); + LOGSTUFF(("write at pointer address %02x\n",data)); } if (data == 0xa9) { // increase cursor address - LOGSTUFF("increase cursor address %02x\n",data); + LOGSTUFF(("increase cursor address %02x\n",data)); } if (data == 0xac) { // read at cursor address - LOGSTUFF("read at cursor address %02x\n",data); + LOGSTUFF(("read at cursor address %02x\n",data)); } if (data == 0xaa) { // write at cursor address - LOGSTUFF("write at cursor address %02x\n",data); + LOGSTUFF(("write at cursor address %02x\n",data)); } if (data == 0xad) { // read at cursor address + incrememnt - LOGSTUFF("read at cursor address+incrememnt %02x\n",data); + LOGSTUFF(("read at cursor address+increment %02x\n",data)); } if (data == 0xab) { // write at cursor address + incrememnt - LOGSTUFF("write at cursor address+incrememnt %02x\n",data); + LOGSTUFF(("write at cursor address+increment %02x\n",data)); } if (data == 0xbb) { // write from cursor address to pointer address - LOGSTUFF("write from cursor address to pointer address %02x\n",data); + LOGSTUFF(("write from cursor address to pointer address %02x\n",data)); } if (data == 0xbd) { // read from cursor address to pointer address - LOGSTUFF("read from cursor address to pointer address %02x\n",data); + LOGSTUFF(("read from cursor address to pointer address %02x\n",data)); } } @@ -1659,21 +1872,21 @@ READ16_HANDLER( mpu4_vid_scn2674_r ) s = Split 2 */ case 0: - printf("Read Irq Register %06x\n",activecpu_get_pc()); + LOGSTUFF(("Read Irq Register %06x\n",activecpu_get_pc())); // return scn2674_irq_register|0x08; // return 0x04; return scn2674_irq_register; case 1: - printf("Read Status Register %06x\n",activecpu_get_pc()); - return mame_rand();//scn2674_irq_register; - - case 2: printf("Read Screen1_l Register %06x\n",activecpu_get_pc());return scn2674_screen1_l; - case 3: printf("Read Screen1_h Register %06x\n",activecpu_get_pc());return scn2674_screen1_h; - case 4: printf("Read Cursor_l Register %06x\n",activecpu_get_pc());return scn2674_cursor_l; - case 5: printf("Read Cursor_h Register %06x\n",activecpu_get_pc());return scn2674_cursor_h; - case 6: printf("Read Screen2_l Register %06x\n",activecpu_get_pc());return scn2674_screen2_l; - case 7: printf("Read Screen2_h Register %06x\n",activecpu_get_pc());return scn2674_screen2_h; + LOGSTUFF(("Read Status Register %06x\n",activecpu_get_pc())); + return mame_rand(Machine);//scn2674_irq_register; + + case 2: LOGSTUFF(("Read Screen1_l Register %06x\n",activecpu_get_pc()));return scn2674_screen1_l; + case 3: LOGSTUFF(("Read Screen1_h Register %06x\n",activecpu_get_pc()));return scn2674_screen1_h; + case 4: LOGSTUFF(("Read Cursor_l Register %06x\n",activecpu_get_pc()));return scn2674_cursor_l; + case 5: LOGSTUFF(("Read Cursor_h Register %06x\n",activecpu_get_pc()));return scn2674_cursor_h; + case 6: LOGSTUFF(("Read Screen2_l Register %06x\n",activecpu_get_pc()));return scn2674_screen2_l; + case 7: LOGSTUFF(("Read Screen2_h Register %06x\n",activecpu_get_pc()));return scn2674_screen2_h; } return 0xffff; @@ -1717,7 +1930,7 @@ WRITE16_HANDLER( mpu4_vid_scn2674_w ) READ16_HANDLER( mpu4_vid_unmap_r ) { //logerror("Data %s Offset %s", data, offset); - return mame_rand(); + return mame_rand(Machine); } WRITE16_HANDLER( mpu4_vid_unmap_w ) @@ -1772,7 +1985,6 @@ UINT8 ef9369_counter; WRITE16_HANDLER( ef9369_data_w ) { int color; - int r,g,b; UINT16 coldat; data &=0x00ff; @@ -1781,12 +1993,7 @@ WRITE16_HANDLER( ef9369_data_w ) color = ef9369_counter/2; coldat = (ef9369_palette[color*2+1]<<8)|ef9369_palette[color*2]; - - r = (coldat & 0x000f)>>0; - b = (coldat & 0x00f0)>>4; - g = (coldat & 0x0f00)>>8; - - palette_set_color(color,r<<4,g<<4,b<<4); + palette_set_color(Machine,color,pal4bit(coldat >> 0),pal4bit(coldat >> 8),pal4bit(coldat >> 4)); ef9369_counter++; if (ef9369_counter>31) ef9369_counter = 31; @@ -1802,20 +2009,7 @@ WRITE16_HANDLER( ef9369_address_w ) } - #if 0 -/* 6840 emulation, see cchasm.c? */ -READ16_HANDLER( mpu4_vid_6840_r ) -{ - return 0xffff; -} - -WRITE16_HANDLER( mpu4_vid_6840_w ) -{ - logerror("WData %d WOffset %d", data, offset); -} - - /* 6850 emulation */ UINT8 mpu4_vid_6850_status_register; @@ -1881,95 +2075,85 @@ WRITE16_HANDLER ( mpu4_vid_6850_w ) case 0: mpu4_vid_6850_control_register_w(data);break; case 1: mpu4_vid_6850_data_w(data);break; } - printf("6850 write to %02x = %02x\n",offset,data); + LOGSTUFF(("6850 write to %02x = %02x\n",offset,data)); } #endif +INPUT_PORTS_START( connect4 ) -static ADDRESS_MAP_START( mpu4_vid_map, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x7fffff) AM_ROM - -// AM_RANGE(0x600000, 0x63ffff) AM_RAM? In expanded games (mating) - - AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_BASE(&mpu4_vid_mainram) // mainram / char address ram? - - /* what is here, the sound chip? Assume so */ - AM_RANGE(0x900000, 0x900001) AM_WRITE(saa1099_control_port_0_lsb_w) - AM_RANGE(0x900002, 0x900003) AM_WRITE(saa1099_write_port_0_lsb_w) - - /* the palette chip */ - AM_RANGE(0xa00000, 0xa00001) AM_WRITE(ef9369_data_w) - AM_RANGE(0xa00002, 0xa00003) AM_WRITE(ef9369_address_w) - AM_RANGE(0xa00004, 0xa0000f) //AM_READWRITE(mpu4_vid_unmap_r, mpu4_vid_unmap_w) - - AM_RANGE(0xb00000, 0xb0000f) AM_READWRITE(mpu4_vid_scn2674_r, mpu4_vid_scn2674_w) - - AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) - - /* comms with the MPU4? - disabling this gives MPU4 communication breakdown */ - AM_RANGE(0xff8000, 0xff8001) AM_READ( vidcard_uart_ctrl_r ) // 6850 compatible uart control reg read - AM_RANGE(0xff8000, 0xff8001) AM_WRITE( vidcard_uart_ctrl_w )// 6850 compatible uart control reg write - AM_RANGE(0xff8002, 0xff8003) AM_READ( vidcard_uart_rx_r ) // 6850 compatible uart read data - AM_RANGE(0xff8002, 0xff8003) AM_WRITE( vidcard_uart_tx_w ) // 6850 compatible uart write data - - AM_RANGE(0xff9000, 0xff900f) AM_READ( ptm6840_1_lsb_r) // 6840PTM IC2 - AM_RANGE(0xff9000, 0xff900f) AM_WRITE( ptm6840_1_lsb_w) // 6840PTM IC2 - - /* characterizer??? */ -// AM_RANGE(0xffd000, 0xffd00f) AM_RAM // crmaze et al??? - -ADDRESS_MAP_END - -/* TODO: Fix up MPU4 map*/ -static ADDRESS_MAP_START( mpu4_map, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x07ff) AM_RAM AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) - - AM_RANGE(0x0800, 0x0800) AM_READ( mpu4_uart_ctrl_r) // video uart control reg read - AM_RANGE(0x0800, 0x0800) AM_WRITE(mpu4_uart_ctrl_w) // video uart control reg write - AM_RANGE(0x0801, 0x0801) AM_READ( mpu4_uart_rx_r) // video uart receive reg - AM_RANGE(0x0801, 0x0801) AM_WRITE(mpu4_uart_tx_w) // video uart transmit reg - - AM_RANGE(0x0850, 0x0850) AM_WRITE(bankswitch_w) // write bank (rom page select) - - //AM_RANGE(0x0880, 0x0880) AM_READ(uart1stat_r) // Could be a UART datalogger is here. - //AM_RANGE(0x0880, 0x0880) AM_WRITE(uart1ctrl_w) // Or a PIA? - //AM_RANGE(0x0881, 0x0881) AM_READ(uart1data_r) - //AM_RANGE(0x0881, 0x0881) AM_WRITE(uart1data_w) - - AM_RANGE(0x0900, 0x0907) AM_READ( ptm6840_0_r) // 6840PTM IC2 - AM_RANGE(0x0900, 0x0907) AM_WRITE(ptm6840_0_w) - - AM_RANGE(0x0A00, 0x0A03) AM_WRITE(pia_0_w) // PIA6821 IC3 - AM_RANGE(0x0A00, 0x0A03) AM_READ( pia_0_r) - - AM_RANGE(0x0B00, 0x0B03) AM_WRITE(pia_1_w) // PIA6821 IC4 - AM_RANGE(0x0B00, 0x0B03) AM_READ( pia_1_r) - - AM_RANGE(0x0C00, 0x0C03) AM_WRITE(pia_2_w) // PIA6821 IC5 - AM_RANGE(0x0C00, 0x0C03) AM_READ( pia_2_r) + PORT_START_TAG("IN1A") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("00") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("01") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("02") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("03") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("04") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("05") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("06") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("07") - AM_RANGE(0x0D00, 0x0D03) AM_WRITE(pia_3_w) // PIA6821 IC6 - AM_RANGE(0x0D00, 0x0D03) AM_READ( pia_3_r) + PORT_START_TAG("IN1B") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("08") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("09") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("10") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("11") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("12") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("13") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("14") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("15") - AM_RANGE(0x0E00, 0x0E03) AM_WRITE(pia_4_w) // PIA6821 IC7 - AM_RANGE(0x0E00, 0x0E03) AM_READ( pia_4_r) + PORT_START_TAG("IN2A") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("16") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("17") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("18") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("19") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("20") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("21") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Refill Key") PORT_CODE(KEYCODE_R) PORT_TOGGLE + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Software Reset") - AM_RANGE(0x0F00, 0x0F03) AM_WRITE(pia_5_w) // PIA6821 IC8 - AM_RANGE(0x0F00, 0x0F03) AM_READ( pia_5_r) + PORT_START_TAG("IN2B") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Select") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("25") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_START2) PORT_NAME("Pass") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_START1) PORT_NAME("Play") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("28") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("29") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("30") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_NAME("Drop") - //AM_RANGE(0x1000, 0xFFFF) AM_READ(MRA8_ROM) // 64k ROM + PORT_START_TAG("AUX1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("32") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("33") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("34") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("35") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("36") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("37") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("38") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("39") - AM_RANGE(0x1000, 0x3FFF) AM_RAM - AM_RANGE(0x4000, 0x40FF) AM_RAM // it actually runs code from here... - AM_RANGE(0x4100, 0xBFFF) AM_RAM + PORT_START_TAG("AUX2") + PORT_DIPNAME( 0x01, 0x00, "10p Enable?" ) + PORT_DIPSETTING( 0x00, "Enabled") + PORT_DIPSETTING( 0x01, "Disabled") + PORT_DIPNAME( 0x02, 0x00, "20p Enable?" ) + PORT_DIPSETTING( 0x00, "Enabled") + PORT_DIPSETTING( 0x02, "Disabled") + PORT_DIPNAME( 0x04, 0x00, "50p Enable?" ) + PORT_DIPSETTING( 0x00, "Enabled") + PORT_DIPSETTING( 0x04, "Disabled") + PORT_DIPNAME( 0x08, 0x00, "100p Enable?" ) + PORT_DIPSETTING( 0x00, "Enabled") + PORT_DIPSETTING( 0x08, "Disabled") - //AM_RANGE(0xBE00, 0xBFFF) AM_RAM //00 written on startup -// AM_RANGE(0xC000, 0xFFFF) AM_ROM + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_COIN1) PORT_NAME("10p")PORT_IMPULSE(5) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_COIN2) PORT_NAME("20p")PORT_IMPULSE(5) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_COIN3) PORT_NAME("50p")PORT_IMPULSE(5) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_COIN4) PORT_NAME("100p")PORT_IMPULSE(5) - AM_RANGE(0x1000, 0xffff) AM_READ(MRA8_BANK1) // 64k paged ROM (4 pages) -ADDRESS_MAP_END + //2X8 dips +INPUT_PORTS_END -INPUT_PORTS_START( mpu4_vid ) +INPUT_PORTS_START( mpu4 ) PORT_START_TAG("IN1A") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("00") @@ -2012,6 +2196,85 @@ INPUT_PORTS_START( mpu4_vid ) PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("31") PORT_START_TAG("AUX1") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("32") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("33") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("34") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("35") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("36") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("37") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("38") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("39") + + PORT_START_TAG("AUX2") + PORT_DIPNAME( 0x01, 0x00, "10p Enable?" ) + PORT_DIPSETTING( 0x00, "Enabled") + PORT_DIPSETTING( 0x01, "Disabled") + PORT_DIPNAME( 0x02, 0x00, "20p Enable?" ) + PORT_DIPSETTING( 0x00, "Enabled") + PORT_DIPSETTING( 0x02, "Disabled") + PORT_DIPNAME( 0x04, 0x00, "50p Enable?" ) + PORT_DIPSETTING( 0x00, "Enabled") + PORT_DIPSETTING( 0x04, "Disabled") + PORT_DIPNAME( 0x08, 0x00, "100p Enable?" ) + PORT_DIPSETTING( 0x00, "Enabled") + PORT_DIPSETTING( 0x08, "Disabled") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_COIN1) PORT_NAME("10p")PORT_IMPULSE(100) + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_COIN2) PORT_NAME("20p")PORT_IMPULSE(100) + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_COIN3) PORT_NAME("50p")PORT_IMPULSE(100) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_COIN4) PORT_NAME("100p")PORT_IMPULSE(100) + +INPUT_PORTS_END + +INPUT_PORTS_START( mpu4_vid ) +PORT_INCLUDE(mpu4) + //PORT_BIT( 0x01, IP_ACTIVE_HIGH,IPT_OTHER) PORT_NAME("Refill Key") PORT_CODE(KEYCODE_R) PORT_TOGGLE + //PORT_BIT( 0x02, IP_ACTIVE_HIGH,IPT_OTHER) PORT_NAME("Bookkeeping") PORT_CODE(KEYCODE_F1) PORT_TOGGLE + //2X8 dips +INPUT_PORTS_END + +INPUT_PORTS_START( crmaze ) + + PORT_START_TAG("IN1A") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("00") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("01") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("02") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("03") + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("04") + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("05") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("06") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("07") + + PORT_START_TAG("IN1B") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("08") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("09") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("10") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("11") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("12") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("13") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("14") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("200p?") + + PORT_START_TAG("IN2A") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("16") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("17") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("18") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("19") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("20") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("21") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("22") + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("23") + + PORT_START_TAG("IN2B") + PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Right Yellow") + PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Right Red") + PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("26") + PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Left Yellow") + PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Left Red") + PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Getout Yellow") + PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Getout Red")//Labelled Escape on cabinet + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("100p Service?")PORT_IMPULSE(100) + + PORT_START_TAG("AUX1")//Presumed to be trackball PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("0") PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("1") PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("2") @@ -2039,7 +2302,6 @@ INPUT_PORTS_START( mpu4_vid ) PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_COIN3) PORT_NAME("50p")PORT_IMPULSE(100) PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_COIN4) PORT_NAME("100p")PORT_IMPULSE(100) - //2X8 dips INPUT_PORTS_END /* @@ -2056,7 +2318,7 @@ INTERRUPT_GEN(mpu4_vid_irq) // if (cpu_getiloops()&1) // cpunum_set_input_line(1, 1, HOLD_LINE); // else -// LOGSTUFF("scn2674_irq_mask %02x",scn2674_irq_mask); +// LOGSTUFF(("scn2674_irq_mask %02x",scn2674_irq_mask)); if (cpu_getiloops()==0) // vbl { @@ -2064,10 +2326,9 @@ INTERRUPT_GEN(mpu4_vid_irq) { if (scn2674_irq_mask&0x10) { - LOGSTUFF("vblank irq\n"); - scn2674_irq_state = 1; //need to check priorities + LOGSTUFF(("vblank irq\n")); + scn2674_irq_state = 1; update_mpu68_interrupts(); - //cpunum_set_input_line(1, 3, ASSERT_LINE); scn2674_irq_register |= 0x10; } @@ -2077,6 +2338,7 @@ INTERRUPT_GEN(mpu4_vid_irq) } } +// machine start (called only once) ///////////////////////////////////// MACHINE_START( mpu4_vid ) { @@ -2087,11 +2349,12 @@ MACHINE_START( mpu4_vid ) pia_config(4, PIA_STANDARD_ORDERING, &pia_ic7_intf); pia_config(5, PIA_STANDARD_ORDERING, &pia_ic8_intf); + pia_reset(); // setup ptm //////////////////////////////////////////////////////////// - ptm6840_config(0, &ptm_ic2_intf ); + ptm6840_config(0, &ptm_ic2b_intf ); ptm6840_config(1, &ptm_vid_intf ); // setup 224 lamps ////////////////////////////////////////////////////// @@ -2111,26 +2374,261 @@ MACHINE_START( mpu4_vid ) // setup the standard oki MSC1937 display /////////////////////////////// -// vfd_init(0, VFDTYPE_MSC1937); // ? + vfd_init(0, VFDTYPE_MSC1937,0); // ? + + return 0; +} + +static MACHINE_START( mpu4 ) +{ + pia_config(0, PIA_STANDARD_ORDERING, &pia_ic3_intf); + pia_config(1, PIA_STANDARD_ORDERING, &pia_ic4_intf); + pia_config(2, PIA_STANDARD_ORDERING, &pia_ic5_intf); + pia_config(3, PIA_STANDARD_ORDERING, &pia_ic6_intf); + pia_config(4, PIA_STANDARD_ORDERING, &pia_ic7_intf); + pia_config(5, PIA_STANDARD_ORDERING, &pia_ic8_intf); + + pia_reset(); + +// setup ptm //////////////////////////////////////////////////////////// + + ptm6840_config(0, &ptm_ic2_intf ); + +// setup 224 lamps ////////////////////////////////////////////////////// + + Lamps_init(224); + +// setup 8 mechanical meters //////////////////////////////////////////// + + Mechmtr_init(8); + +// setup 4 default 96 half step reels /////////////////////////////////// + + Stepper_init(0, STEPPER_48STEP_REEL); + Stepper_init(1, STEPPER_48STEP_REEL); + Stepper_init(2, STEPPER_48STEP_REEL); + Stepper_init(3, STEPPER_48STEP_REEL); + // Stepper_init(4, STEPPER_48STEP_REEL); + // Stepper_init(5, STEPPER_48STEP_REEL); + +// setup the standard oki MSC1937 display /////////////////////////////// + + vfd_init(0, VFDTYPE_MSC1937,0); // does oldtimer use a OKI MSC1937 alpha display controller ? return 0; } +/* +Characteriser (CHR) + +I haven't been able to work out all the ways of finding the CHR data, but there must be a flag in the ROMs +somewhere to pick it out. As built, the CHR is a PAL which holds an internal data table that is inaccessible to +anything other than the CPU. However, the programmers decided to best use this protection device in read/write/compare +cycles, storing almost the entire 'hidden' data table in the ROMs in plain sight. Only later rebuilds by BwB +avoided this 'feature' of the development kit, and as such, only low level access can defeat their protection. + +For most Barcrest games, though, the following can be used: + +To calculate the values necessary to program the CHR, we must first find the version string, +which starts at ff28 and terminates at ff2f. For Club Celebration (an AWP) ff2f then represents the CHR address. +For some reason, the tables always start and end with '00 00'. + +From that point on, every word represents a call and response pair, until we have generated 8 8 byte rows of data. + +The initial 'PALTEST' routine as found in the Barcrest programs simply writes the first 'call' to the CHR space, +to read back the 'response'. There is no attempt to alter the order or anything else of that matter, just +a simple runthrough of the entire data table. The only 'catch' in this is to note that the CHR chip always scans +through the table starting at the last accessed data value - there are duplications within the table to catch out +the unwary. + +However, a final 8 byte row, that controls the lamp matrix is not tested - to date, no-one outside of Barcrest knows +how this is generated, and currently trial and error is the only sensible method. It is noted that the default, +of all 00, is sometimes the correct answer, particularly in non-Barcrest use of the CHR chip. + +Despite the potential to radically overhaul the design, the video card version of the chip appears to just be a +16-bit version of the previous design.It is unclear, however, if it has any capacity to affect lamp matrices in the same +way as before. That said, the 'quiz' games on the board did use an address-scrambling PAL for encryption, and the very +last mod had a characteriser capable of scrambling the ROM address lines. +*/ +static WRITE8_HANDLER( characteriser_w ) +{ + int x; + int call=data; + LOG_CHR(("Characteriser write offset %02X data %02X\n",offset,data)); + for ( x = prot_col+(offset*16); x < 128; x++ ) + { + if ((chr_data[(x)] == call) && ((x & 1) == 0)) + { + prot_col = (x)+1; + LOG_CHR(("Characteriser find column %02X\n",prot_col)); + break; + } + } +} + +static READ8_HANDLER( characteriser_r ) +{ + LOG_CHR(("Characteriser read offset %02X \n",offset)); + LOG_CHR(("Characteriser read data %02X \n",chr_data[prot_col])); + return chr_data[prot_col]; +} + +static WRITE16_HANDLER( characteriser16_w ) +{ + int x; + int call=data; + LOG_CHR(("Characteriser write offset %02X data %02X\n",offset,data)); + for ( x = prot_col+(offset*16)+1; x < 128; x++ ) + { + if ((chr16_data[(x)] == call) && ((x & 1) == 1)) + { + prot_col = (x)-1; + LOG_CHR(("Characteriser find column %02X\n",prot_col)); + break; + } + } +} + +static READ16_HANDLER( characteriser16_r ) +{ + LOG_CHR(("Characteriser read offset %02X \n",offset)); + LOG_CHR(("Characteriser read data %02X \n",chr16_data[prot_col])); + return chr16_data[prot_col]; +} // generate a 50 Hz signal (based on an RC time) ////////////////////////// static INTERRUPT_GEN( gen_50hz ) { signal_50hz = signal_50hz?0:1; - // update IC4 input port b - - if ( signal_50hz ) ic4_input_b |= 0x04; - else ic4_input_b &= ~0x04; + LOGSTUFF(("50hz generate %x\n",signal_50hz)); - pia_set_input_ca1(1,signal_50hz); // signal is connected to IC4 CA2 - pia_set_input_b( 1, ic4_input_b); // signal is connected to IC4 port B +// pia_set_input_ca1(1,signal_50hz); // signal is connected to IC4 CA1 + pia_set_input_ca1(1,0); // signal is connected to IC4 CA1 + pia_set_input_ca1(1,1); // signal is connected to IC4 CA1 } +static ADDRESS_MAP_START( mpu4_vid_map, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x7fffff) AM_ROM + +// AM_RANGE(0x600000, 0x63ffff) AM_RAM? In expanded games (mating) + + AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_BASE(&mpu4_vid_mainram) // mainram / char address ram? + + /* what is here, the sound chip? Assume so */ + AM_RANGE(0x900000, 0x900001) AM_WRITE(saa1099_control_port_0_lsb_w) + AM_RANGE(0x900002, 0x900003) AM_WRITE(saa1099_write_port_0_lsb_w) + + /* the palette chip */ + AM_RANGE(0xa00000, 0xa00001) AM_WRITE(ef9369_data_w) + AM_RANGE(0xa00002, 0xa00003) AM_WRITE(ef9369_address_w) + AM_RANGE(0xa00004, 0xa0000f) //AM_READWRITE(mpu4_vid_unmap_r, mpu4_vid_unmap_w) + + AM_RANGE(0xb00000, 0xb0000f) AM_READWRITE(mpu4_vid_scn2674_r, mpu4_vid_scn2674_w) + + AM_RANGE(0xc00000, 0xc1ffff) AM_READWRITE(mpu4_vid_vidram_r, mpu4_vid_vidram_w) + + /* comms with the MPU4? - disabling this gives MPU4 communication breakdown */ + AM_RANGE(0xff8000, 0xff8003) AM_READ( vidcard_uart_rx_r ) // 6850 compatible uart read data. + AM_RANGE(0xff8000, 0xff8003) AM_WRITE( vidcard_uart_tx_w ) // 6850 compatible uart write data + + AM_RANGE(0xff9000, 0xff900f) AM_READ( ptm6840_1_lsb_r) // 6840PTM IC2 + AM_RANGE(0xff9000, 0xff900f) AM_WRITE( ptm6840_1_lsb_w) // 6840PTM IC2 + + /* characterizer??? */ + AM_RANGE(0xffd000, 0xffd00f) AM_READWRITE(characteriser16_r, characteriser16_w) // Word-based version of old CHR??? + +ADDRESS_MAP_END + +/* TODO: Fix up MPU4 map*/ +static ADDRESS_MAP_START( mpu4_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x07ff) AM_RAM AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) + + AM_RANGE(0x0800, 0x0801) AM_READ( mpu4_uart_rx_r) // video uart receive reg + AM_RANGE(0x0800, 0x0801) AM_WRITE(mpu4_uart_tx_w) // video uart transmit reg + +// AM_RANGE(0x0850, 0x0850) AM_WRITE(bankswitch_w) // write bank (rom page select) + + //AM_RANGE(0x0880, 0x0880) AM_READ(uart1stat_r) // Could be a UART datalogger is here. + //AM_RANGE(0x0880, 0x0880) AM_WRITE(uart1ctrl_w) // Or a PIA? + //AM_RANGE(0x0881, 0x0881) AM_READ(uart1data_r) + //AM_RANGE(0x0881, 0x0881) AM_WRITE(uart1data_w) + + AM_RANGE(0x0900, 0x0907) AM_READ( ptm6840_0_r) // 6840PTM IC2 + AM_RANGE(0x0900, 0x0907) AM_WRITE(ptm6840_0_w) + + AM_RANGE(0x0A00, 0x0A03) AM_WRITE(pia_0_w) // PIA6821 IC3 + AM_RANGE(0x0A00, 0x0A03) AM_READ( pia_0_r) + + AM_RANGE(0x0B00, 0x0B03) AM_WRITE(pia_1_w) // PIA6821 IC4 + AM_RANGE(0x0B00, 0x0B03) AM_READ( pia_1_r) + + AM_RANGE(0x0C00, 0x0C03) AM_WRITE(pia_2_w) // PIA6821 IC5 + AM_RANGE(0x0C00, 0x0C03) AM_READ( pia_2_r) + + AM_RANGE(0x0D00, 0x0D03) AM_WRITE(pia_3_w) // PIA6821 IC6 + AM_RANGE(0x0D00, 0x0D03) AM_READ( pia_3_r) + + AM_RANGE(0x0E00, 0x0E03) AM_WRITE(pia_4_w) // PIA6821 IC7 + AM_RANGE(0x0E00, 0x0E03) AM_READ( pia_4_r) + + AM_RANGE(0x0F00, 0x0F03) AM_WRITE(pia_5_w) // PIA6821 IC8 + AM_RANGE(0x0F00, 0x0F03) AM_READ( pia_5_r) + + //AM_RANGE(0x1000, 0x3FFF) AM_RAM + //AM_RANGE(0x4000, 0x40FF) AM_RAM // it actually runs code from here... + //AM_RANGE(0x4100, 0xBFFF) AM_RAM + + AM_RANGE(0x1000, 0xBFFF) AM_RAM + AM_RANGE(0xC000, 0xffff) AM_ROM // 64k ROM +// AM_RANGE(0x1000, 0xffff) AM_ROM//READ(MRA8_BANK1) // 64k paged ROM (4 pages) + +ADDRESS_MAP_END + +static ADDRESS_MAP_START( memmap, ADDRESS_SPACE_PROGRAM, 8 ) + + AM_RANGE(0x0000, 0x07ff) AM_RAM AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) + + AM_RANGE(0x0800, 0x0810) AM_WRITE(characteriser_w) + AM_RANGE(0x0800, 0x0810) AM_READ( characteriser_r) + + AM_RANGE(0x0850, 0x0850) AM_WRITE(bankswitch_w) // write bank (rom page select) + + AM_RANGE(0x0880, 0x0883) AM_WRITE(pia_6_w) // PIA6821 on game board + AM_RANGE(0x0880, 0x0883) AM_READ( pia_6_r) + +// AM_RANGE(0x08C0, 0x08C7) AM_READ( ptm6840_1_r) // 6840PTM on game board +// AM_RANGE(0x08C0, 0x08C7) AM_WRITE(ptm6840_1_w) + +// AM_RANGE(0x08E0, 0x08E7) AM_READ( 68681_duart_r) +// AM_RANGE(0x08E0, 0x08E7) AM_WRITE( 68681_duart_w) + + AM_RANGE(0x0900, 0x0907) AM_READ( ptm6840_0_r) // 6840PTM + AM_RANGE(0x0900, 0x0907) AM_WRITE(ptm6840_0_w) + + AM_RANGE(0x0A00, 0x0A03) AM_WRITE(pia_0_w) // PIA6821 IC3 + AM_RANGE(0x0A00, 0x0A03) AM_READ( pia_0_r) + + AM_RANGE(0x0B00, 0x0B03) AM_WRITE(pia_1_w) // PIA6821 IC4 + AM_RANGE(0x0B00, 0x0B03) AM_READ( pia_1_r) + + AM_RANGE(0x0C00, 0x0C03) AM_WRITE(pia_2_w) // PIA6821 IC5 + AM_RANGE(0x0C00, 0x0C03) AM_READ( pia_2_r) + + AM_RANGE(0x0D00, 0x0D03) AM_WRITE(pia_3_w) // PIA6821 IC6 + AM_RANGE(0x0D00, 0x0D03) AM_READ( pia_3_r) + + AM_RANGE(0x0E00, 0x0E03) AM_WRITE(pia_4_w) // PIA6821 IC7 + AM_RANGE(0x0E00, 0x0E03) AM_READ( pia_4_r) + + AM_RANGE(0x0F00, 0x0F03) AM_WRITE(pia_5_w) // PIA6821 IC8 + AM_RANGE(0x0F00, 0x0F03) AM_READ( pia_5_r) + +// AM_RANGE(0x0000, 0x0fff) AM_ROM // 64k ROM + AM_RANGE(0x1000, 0xffff) AM_READ(MRA8_BANK1) // 64k paged ROM (4 pages) + +ADDRESS_MAP_END + static MACHINE_DRIVER_START( mpu4_vid ) MDRV_CPU_ADD_TAG("main", M6809, 6880000/4 ) @@ -2166,12 +2664,66 @@ static MACHINE_DRIVER_START( mpu4_vid ) MACHINE_DRIVER_END -/* - It appears there were two different games with the same name. +// machine driver for barcrest mpu4 board ///////////////////////////////// + +static MACHINE_DRIVER_START( mpu4 ) + + MDRV_MACHINE_START(mpu4) // main mpu4 board initialisation + MDRV_MACHINE_RESET(mpu4) + MDRV_CPU_ADD_TAG("main", M6809, 6880000/4 ) // 6809 CPU + MDRV_CPU_PROGRAM_MAP(memmap,0) // setup read and write memorymap + + MDRV_CPU_PERIODIC_INT(gen_50hz, TIME_IN_HZ(50) ) // generate 50 hz signal + + MDRV_SPEAKER_STANDARD_MONO("mono") + MDRV_SOUND_ADD(AY8910, 6880000/4) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) + + MDRV_NVRAM_HANDLER(generic_0fill) // load/save nv RAM + MDRV_DEFAULT_LAYOUT(layout_mpu4) + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_SIZE(288, 34) + MDRV_VISIBLE_AREA(0, 288-1, 0, 34-1) + MDRV_FRAMES_PER_SECOND(50) + MDRV_VIDEO_START( mpu4) + MDRV_VIDEO_UPDATE(mpu4) + + MDRV_PALETTE_LENGTH(16) + MDRV_COLORTABLE_LENGTH(16) + MDRV_PALETTE_INIT(mpu4) - One is non-video, and uses only the 6809, and the other is the one we're interested in (the older one) +MACHINE_DRIVER_END + +DRIVER_INIT (crmaze) +{ + int x; + UINT8 *rom; + rom = memory_region(REGION_CPU2); + for ( x = 0; x < 128; x++ ) + { + chr16_data[x] = rom[(0x04c6)+(x)]; + LOG_CHR(("%02X",chr16_data[x])); + } +} + +DRIVER_INIT (mating) +{ + int x; + UINT8 *rom; + rom = memory_region(REGION_CPU2); + for ( x = 0; x < 128; x++ ) + { + chr16_data[x] = rom[(0x04f6)+(x)]; + LOG_CHR(("%02X",chr16_data[x])); + } +} - Some of the dumps available seem to confuse the two. */ +/* + Barcrest released two different games called The Crystal Maze. + One is a non-video AWP, and uses only the MPU4 card, and the other SWP is the one we're interested in running + Some of the dumps available seem to confuse the two, due to an early database not distinguishing + between MPU4 and MPU4Video, as the latter had not been emulated at all at that stage. */ #define VID_BIOS \ ROM_LOAD("vid.p1", 0x0000, 0x10000, CRC(e996bc18) SHA1(49798165640627eb31024319353da04380787b10)) @@ -2335,14 +2887,21 @@ ROM_START( matinga ) ROM_LOAD( "matsnd.p4", 0x180000, 0x080000, CRC(d7e65c5b) SHA1(5575fb9f948158f2e94c986bf4bca9c9ee66a489) ) ROM_END +ROM_START( connect4 ) + ROM_REGION( 0x10000, REGION_CPU1, ROMREGION_ERASE00 ) /* 64k for code */ + ROM_LOAD( "connect4.p2", 0x8000, 0x4000, CRC(6090633c) ) + ROM_LOAD( "connect4.p1", 0xC000, 0x4000, CRC(b1af50c0) ) +ROM_END + /* YEAR NAME PARENT MACHINE INPUT INIT MONITOR COMPANY FULLNAME FLAGS (0 if none) */ -GAME( 199?, bctvidbs,0, mpu4_vid, mpu4_vid, 0, ROT0, "Barcrest", "MPU4 Video Firmware", NOT_A_DRIVER ) +GAME( 198?, connect4,0, mpu4, connect4, 0, 0, "Dolbeck Systems", "Connect 4", GAME_NOT_WORKING|GAME_IMPERFECT_SOUND ) +GAME( 199?, bctvidbs,0, mpu4, mpu4, 0, ROT0, "Barcrest", "MPU4 Video Firmware", NOT_A_DRIVER ) -GAME( 1994, crmaze, bctvidbs,mpu4_vid, mpu4_vid, 0, ROT0, "Barcrest", "The Crystal Maze: Team Challenge (SWP)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 1994, crmazea, crmaze, mpu4_vid, mpu4_vid, 0, ROT0, "Barcrest", "The Crystal Maze (AMLD version SWP)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 1994, crmazeb, crmaze, mpu4_vid, mpu4_vid, 0, ROT0, "Barcrest", "The Crystal Maze - Now Featuring Ocean Zone (AMLD Version SWP)", GAME_NOT_WORKING|GAME_NO_SOUND ) // unprotected? +GAME( 1994, crmaze, bctvidbs,mpu4_vid, crmaze, crmaze,ROT0, "Barcrest", "The Crystal Maze: Team Challenge (SWP)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 1994, crmazea, crmaze, mpu4_vid, crmaze, crmaze,ROT0, "Barcrest", "The Crystal Maze (AMLD version SWP)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 1994, crmazeb, crmaze, mpu4_vid, crmaze, 0, ROT0, "Barcrest", "The Crystal Maze - Now Featuring Ocean Zone (AMLD Version SWP)", GAME_NOT_WORKING|GAME_NO_SOUND ) // unprotected? GAME( 1990, turnover,bctvidbs,mpu4_vid, mpu4_vid, 0, ROT0, "Barcrest", "Turnover", GAME_NOT_WORKING|GAME_NO_SOUND ) // unprotected? GAME( 1992, skiltrek,bctvidbs,mpu4_vid, mpu4_vid, 0, ROT0, "Barcrest", "Skill Trek", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, mating, bctvidbs,mpu4_vid, mpu4_vid, 0, ROT0, "Barcrest", "The Mating Game (Datapak)", GAME_NOT_WORKING|GAME_NO_SOUND ) -GAME( 199?, matinga, mating, mpu4_vid, mpu4_vid, 0, ROT0, "Barcrest", "The Mating Game (Standard)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 199?, mating, bctvidbs,mpu4_vid, mpu4_vid, mating,ROT0, "Barcrest", "The Mating Game (Datapak)", GAME_NOT_WORKING|GAME_NO_SOUND ) +GAME( 199?, matinga, mating, mpu4_vid, mpu4_vid, mating,ROT0, "Barcrest", "The Mating Game (Standard)", GAME_NOT_WORKING|GAME_NO_SOUND ) diff --git a/src/drivers/ms32.c b/src/drivers/ms32.c index 7d969eead..b58fe042e 100644 --- a/src/drivers/ms32.c +++ b/src/drivers/ms32.c @@ -2328,7 +2328,7 @@ static DRIVER_INIT (kirarast) // { 0xfcc00004, 0xfcc00007, ms32_mahjong_read_inputs1 } memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0xfcc00004, 0xfcc00007, 0, 0, ms32_mahjong_read_inputs1 ); - init_ss92047_01(); + init_ss92047_01(machine); } static DRIVER_INIT (47pie2) @@ -2336,14 +2336,14 @@ static DRIVER_INIT (47pie2) // { 0xfcc00004, 0xfcc00007, ms32_mahjong_read_inputs1 } memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0xfcc00004, 0xfcc00007, 0, 0, ms32_mahjong_read_inputs1 ); - init_ss92048_01(); + init_ss92048_01(machine); } static DRIVER_INIT (f1superb) { UINT32 *pROM = (UINT32 *)memory_region(REGION_CPU1); pROM[0x19d04/4]=0x167a021a; // bne->br : sprite Y offset table is always copied to RAM - init_ss92046_01(); + init_ss92046_01(machine); } /********** GAME DRIVERS **********/ diff --git a/src/drivers/murogem.c b/src/drivers/murogem.c index 300da6291..8d4020735 100644 --- a/src/drivers/murogem.c +++ b/src/drivers/murogem.c @@ -77,6 +77,20 @@ f205v | | ------------------------------------------------------------------------ + +*** Notes by Roberto Fresca *** + +- Added Muroge Monaco (set 2). +- Added the missing 74s288 dump (32x8 PROM located at 1B) from the new set. +- Confirmed the MC6845 at $4000/$4001. +- Corrected screen size acording to MC6845 registers. +- Corrected visible area acording to MC6845 registers. The last characters line looks odd, but should be visible. +- There are not illegal opcodes. The above mentioned are in fact strings (plain ASCII text). + +MC6845 registers: +reg (hex): 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 +val (hex): 27 20 22 04 26 00 20 20 00 07 00 00 80 00 00 00 ns ns + */ #include "driver.h" @@ -86,8 +100,8 @@ static UINT8 *murogem_videoram; static ADDRESS_MAP_START( murogem_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x007f) AM_RAM - AM_RANGE(0x4000, 0x4000) AM_WRITE(crtc6845_address_w)// i think - AM_RANGE(0x4001, 0x4001) AM_WRITE(crtc6845_register_w)// i think + AM_RANGE(0x4000, 0x4000) AM_WRITE(crtc6845_address_w) + AM_RANGE(0x4001, 0x4001) AM_WRITE(crtc6845_register_w) AM_RANGE(0x5000, 0x5000) AM_READ(input_port_0_r) AM_RANGE(0x5800, 0x5800) AM_READ(input_port_1_r) AM_RANGE(0x7000, 0x7000) AM_WRITE(MWA8_NOP) // sound? payout? @@ -148,6 +162,10 @@ static const gfx_decode gfxdecodeinfo[] = { -1 } }; + +PALETTE_INIT(murogem) +{} + VIDEO_START(murogem) { return 0; @@ -190,11 +208,12 @@ static MACHINE_DRIVER_START( murogem ) /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER ) - MDRV_SCREEN_SIZE(256, 256) - MDRV_VISIBLE_AREA(0, 256-1, 0, 256-16-1) + MDRV_SCREEN_SIZE((39+1)*8, (38+1)*8) // Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1). + MDRV_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1) // Taken from MC6845 init, registers 01 & 06. MDRV_GFXDECODE(gfxdecodeinfo) MDRV_PALETTE_LENGTH(0x100) + MDRV_PALETTE_INIT(murogem) MDRV_VIDEO_START(murogem) MDRV_VIDEO_UPDATE(murogem) MACHINE_DRIVER_END @@ -208,7 +227,24 @@ ROM_START( murogem ) ROM_REGION( 0x400, REGION_GFX1, 0 ) ROM_LOAD( "a2.6e", 0x000, 0x400, CRC(86e053da) SHA1(b7cdddca273204513c818384860883bf54cf9434) ) + ROM_REGION( 0x20, REGION_PROMS, 0 ) + ROM_LOAD( "a3.1b", 0x0000, 0x0020, CRC(abddfb6b) SHA1(ed78b93701b5a3bf2053d2584e9a354fb6cec203) ) /* 74s288 at 1B */ + +ROM_END + +ROM_START( murogema ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "poker.02", 0xf000, 0x0800, CRC(e82a5bed) SHA1(556a041cd90e628b6c26824e58cee679dfd59f50) ) + ROM_LOAD( "poker.03", 0xf800, 0x0800, CRC(f3fe3f12) SHA1(9c73fbaee20098c734431c6af3168986630dcb67) ) + + ROM_REGION( 0x400, REGION_GFX1, 0 ) + ROM_LOAD( "poker.01", 0x000, 0x400, CRC(164d7443) SHA1(1421a3d32d1296a2544da16b51ade94a58e8ba03) ) + + ROM_REGION( 0x20, REGION_PROMS, 0 ) + ROM_LOAD( "a3.1b", 0x0000, 0x0020, CRC(abddfb6b) SHA1(ed78b93701b5a3bf2053d2584e9a354fb6cec203) ) /* 74s288 at 1B. Originally named 6336.pkr */ + ROM_END -GAME( 198?, murogem, 0, murogem, murogem, 0, ROT0, "unknown", "Muroge Monaco",GAME_NO_SOUND|GAME_WRONG_COLORS ) +GAME( 198?, murogem, 0, murogem, murogem, 0, ROT0, "unknown", "Muroge Monaco (set 1)",GAME_NO_SOUND|GAME_WRONG_COLORS ) +GAME( 198?, murogema, murogem, murogem, murogem, 0, ROT0, "unknown", "Muroge Monaco (set 2)",GAME_NO_SOUND|GAME_WRONG_COLORS ) diff --git a/src/drivers/mwarr.c b/src/drivers/mwarr.c index 2d643ca48..d7ac01760 100644 --- a/src/drivers/mwarr.c +++ b/src/drivers/mwarr.c @@ -131,7 +131,7 @@ static WRITE16_HANDLER( mwarr_brightness_w ) brightness = (double)(data & 0xff); for (i=0;i<0x800;i++) { - palette_set_brightness(i, brightness/255); + palette_set_brightness(Machine, i, brightness/255); } } diff --git a/src/drivers/namcofl.c b/src/drivers/namcofl.c index e54f529d5..11953fb4c 100644 --- a/src/drivers/namcofl.c +++ b/src/drivers/namcofl.c @@ -174,7 +174,7 @@ static ADDRESS_MAP_START( sysfl_mem, ADDRESS_SPACE_PROGRAM, 32 ) AM_RANGE(0x00000000, 0x000fffff) AM_READWRITE(MRA32_BANK1, MWA32_BANK1) AM_RANGE(0x10000000, 0x100fffff) AM_READWRITE(MRA32_BANK2, MWA32_BANK2) AM_RANGE(0x20000000, 0x201fffff) AM_ROM AM_REGION(REGION_USER1, 0) /* data */ - AM_RANGE(0x30000000, 0x30001fff) AM_RAM AM_BASE((UINT32 **)&generic_nvram) AM_SIZE(&generic_nvram_size) /* nvram */ + AM_RANGE(0x30000000, 0x30001fff) AM_RAM AM_BASE(&generic_nvram32) AM_SIZE(&generic_nvram_size) /* nvram */ AM_RANGE(0x30100000, 0x30100003) AM_WRITE(namcofl_spritebank_w) AM_RANGE(0x30284000, 0x3028bfff) AM_RAM AM_BASE(&namcofl_mcuram) /* shared RAM with C75 MCU */ AM_RANGE(0x30300000, 0x30303fff) AM_RAM /* COMRAM */ @@ -387,7 +387,7 @@ ROM_START( speedrcr ) ROM_LOAD("se1_voi.23s", 0x000000, 0x400000, CRC(b95e2ffb) SHA1(7669232d772caa9afa4c7593d018e8b6e534114a) ) ROM_END -ROM_START( finalapr ) +ROM_START( finalapb ) ROM_REGION( 0x200000, REGION_CPU1, 0 ) // i960 program ROM_LOAD32_WORD("flr2mpeb.19a", 0x000000, 0x080000, CRC(8bfe615f) SHA1(7b867eb261268a83177f1f873689f77d1b6c47ca) ) ROM_LOAD32_WORD("flr2mpob.18a", 0x000002, 0x080000, CRC(91c14e4f) SHA1(934a86daaef0e3e2c2b3066f4677ccb3aaab6eaf) ) @@ -461,6 +461,43 @@ ROM_START( finalapo ) ROM_LOAD("flr1voi.23s", 0x000000, 0x200000, CRC(ff6077cd) SHA1(73c289125ddeae3e43153e4c570549ca04501262) ) ROM_END +ROM_START( finalapr ) + ROM_REGION( 0x200000, REGION_CPU1, 0 ) // i960 program + ROM_LOAD32_WORD("flr1_mpec.19a", 0x000000, 0x080000, CRC(52735494) SHA1(db9873cb39bcfdd3dbe2e5079249fecac2c46df9) ) + ROM_LOAD32_WORD("flr1_mpoc.18a", 0x000002, 0x080000, CRC(b11fe577) SHA1(70b51a1e66a3bb92f027aad7ba0f358c0e139b3c) ) + + ROM_REGION( 0x200000, REGION_USER1, ROMREGION_ERASEFF ) // Data + + ROM_REGION( 0x200000, NAMCONB1_ROTGFXREGION, 0 ) // "RCHAR" (roz characters) + ROM_LOAD("flr1rch0.19j", 0x000000, 0x100000, CRC(f413f50d) SHA1(cdd8073dda4feaea78e3b94520cf20a9799fd04d) ) + ROM_LOAD("flr1rch1.18j", 0x100000, 0x100000, CRC(4654d519) SHA1(f8bb473013cdca48dd98df0de2f78c300c156e91) ) + + ROM_REGION( 0x400000, NAMCONB1_TILEGFXREGION, 0 ) // "SCHAR" (regular BG characters) + ROM_LOAD("flr1sch0.21p", 0x000000, 0x100000, CRC(7169efca) SHA1(66c7aa1b50b236b4700b07be0dca7aebdabedb8c) ) + ROM_LOAD("flr1sch1.20p", 0x100000, 0x100000, CRC(aa233a02) SHA1(0011329f585658d90f820daf0ba08ce2735bddfc) ) + ROM_LOAD("flr1sch2.19p", 0x200000, 0x100000, CRC(9b6b7abd) SHA1(5cdec70db1b46bc5d0866ca155b520157fef3adf) ) + ROM_LOAD("flr1sch3.18p", 0x300000, 0x100000, CRC(50a14f54) SHA1(ab9c2f2e11f006a9dc7e5aedd5788d7d67166d36) ) + + ROM_REGION( 0x800000, NAMCONB1_SPRITEGFXREGION, 0 ) // OBJ + ROM_LOAD16_BYTE("flr1obj0l.ic1", 0x000001, 0x200000, CRC(364a902c) SHA1(4a1ea48eee86d410e36096cc100b4c9a5a645034) ) + ROM_LOAD16_BYTE("flr1obj0u.ic2", 0x000000, 0x200000, CRC(a5c7b80e) SHA1(4e0e863cfdd8c051c3c4594bb21e11fb93c28f0c) ) + ROM_LOAD16_BYTE("flr1obj1l.ic3", 0x400001, 0x200000, CRC(51fd8de7) SHA1(b1571c45e8c33d746716fd790c704a3361d02bdc) ) + ROM_LOAD16_BYTE("flr1obj1u.ic4", 0x400000, 0x200000, CRC(1737aa3c) SHA1(8eaf0dc5d60a270d2c1626f54f5edbddbb0a59c8) ) + + ROM_REGION( 0x80000, NAMCONB1_ROTMASKREGION, 0 ) // "RSHAPE" (roz mask like NB-1?) + ROM_LOAD("flr1rsh.14k", 0x000000, 0x080000, CRC(037c0983) SHA1(c48574a8ad125cedfaf2538c5ff824e121204629) ) + + ROM_REGION( 0x80000, NAMCONB1_TILEMASKREGION, 0 ) // "SSHAPE" (mask for other tiles?) + ROM_LOAD("flr1ssh.18u", 0x000000, 0x080000, CRC(f70cb2bf) SHA1(dbddda822287783a43415172b81d0382a8ac43d8) ) + + ROM_REGION( 0x100000, REGION_USER4, 0 ) /* sound data and MCU BIOS */ + ROM_LOAD("flr1spr.21l", 0x000000, 0x20000, CRC(69bb0f5e) SHA1(6831d618de42a165e508ad37db594d3aa290c530) ) + NAMCO_C7X_BIOS + + ROM_REGION( 0x200000, REGION_SOUND1, 0 ) // Samples + ROM_LOAD("flr1voi.23s", 0x000000, 0x200000, CRC(ff6077cd) SHA1(73c289125ddeae3e43153e4c570549ca04501262) ) +ROM_END + static void namcofl_common_init(void) { namcofl_workram = auto_malloc(0x100000); @@ -485,5 +522,6 @@ static DRIVER_INIT(finalapr) } GAME( 1995, speedrcr, 0, sysfl, sysfl, speedrcr, ROT0, "Namco", "Speed Racer", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAME( 1995, finalapr, 0, sysfl, sysfl, finalapr, ROT0, "Namco", "Final Lap R (Rev B)", GAME_IMPERFECT_SOUND ) +GAME( 1995, finalapr, 0, sysfl, sysfl, finalapr, ROT0, "Namco", "Final Lap R (Japan Rev. C)", GAME_IMPERFECT_SOUND ) +GAME( 1995, finalapb, finalapr, sysfl, sysfl, finalapr, ROT0, "Namco", "Final Lap R (Rev. B)", GAME_IMPERFECT_SOUND ) GAME( 1995, finalapo, finalapr, sysfl, sysfl, finalapr, ROT0, "Namco", "Final Lap R", GAME_IMPERFECT_SOUND ) diff --git a/src/drivers/namcona1.c b/src/drivers/namcona1.c index 7ed3529c3..ee9153af0 100644 --- a/src/drivers/namcona1.c +++ b/src/drivers/namcona1.c @@ -747,7 +747,7 @@ static READ16_HANDLER( custom_key_r ) old_count = count; do { - count = mame_rand(); + count = mame_rand(Machine); } while( old_count == count ); switch( namcona1_gametype ) @@ -818,7 +818,7 @@ static READ16_HANDLER( custom_key_r ) default: return 0; } - return mame_rand()&0xffff; + return mame_rand(Machine)&0xffff; } /* custom_key_r */ static WRITE16_HANDLER( custom_key_w ) diff --git a/src/drivers/namconb1.c b/src/drivers/namconb1.c index 7b5b82220..863975a77 100644 --- a/src/drivers/namconb1.c +++ b/src/drivers/namconb1.c @@ -527,7 +527,7 @@ static READ32_HANDLER( custom_key_r ) do { /* pick a random number, but don't pick the same twice in a row */ - count = mame_rand(); + count = mame_rand(Machine); } while( count==old_count ); switch( namcos2_gametype ) @@ -681,7 +681,7 @@ static READ32_HANDLER( gunbulet_gun_r ) static READ32_HANDLER( randgen_r ) { - return mame_rand(); + return mame_rand(Machine); } /* randgen_r */ static diff --git a/src/drivers/namcos11.c b/src/drivers/namcos11.c index 548e27ef4..10b0066b7 100644 --- a/src/drivers/namcos11.c +++ b/src/drivers/namcos11.c @@ -4,10 +4,11 @@ ===================================== Driver by smf & Ryan Holtz Board notes by The Guru - Thanks to R Belmont & The Zinc Team. + Sound by R Belmont + Thanks to the original Zinc Team. Issues: - There is no sound as the Namco C76 (Mitsubishi M37702) & Namco C352 are not emulated. + The C76 internal rom is not dumped, we use the sound program from Prop Cycle and patch the inputs. Random draw list corruption in soul edge v2 & dunkmania. soul edge, dunk mania & prime goal ex try to access joypads/memory cards. It is unknown what they would do if they found one. @@ -15,37 +16,39 @@ Known Dumps ----------- Game Description CPU board Mother board Daughter board Keycus ROM0L +-------------------------------------------------------------------------------------------------------------------------------------- +tekken Tekken (TE4/VER.C) COH-100 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB none 5 +tekkena Tekken (TE2/VER.C) COH-100 " " " " +tekkenb Tekken (TE2/VER.B) COH-100 " " " " +tekkenc Tekken (TE1/VER.B) COH-100 " " " " +tekken2 Tekken 2 Ver.B (TES3/VER.B) COH-100 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C406 6 +tekken2a Tekken 2 Ver.B (TES2/VER.B) COH-100 " " " " +tekken2b Tekken 2 (TES2/VER.A) COH-100 " " " " +souledge Soul Edge Ver. II (SO4/VER.C) COH-100 / COH-110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C409 6 +souledga Soul Edge Ver. II (SO3/VER.C) COH-100 / COH-110 " " " " +souledgb Soul Edge (SO3/VER.A) COH-100 / COH-110 " " " " +souledgc Soul Edge (SO1/VER.A) COH-100 / COH-110 " " " " +dunkmnia Dunk Mania (DM2/VER.C) COH-100 / COH-110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C410 5 +dunkmnic Dunk Mania (DM1/VER.C) COH-100 / COH-110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C410 5 +xevi3dg Xevious 3D/G (XV31/VER.A) COH-100 / COH-110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C430 5 +primglex Prime Goal EX (PG1/VER.A) COH-100 / COH-110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C411 6 +danceyes Dancing Eyes (DC1/VER.A) COH-100 / COH-110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C431 5 +pocketrc Pocket Racer (PKR1/VER.B) COH-110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C432 5 +starswep Star Sweep (STP1/VER.A) COH-100 / COH-110 SYSTEM11 MOTHER(B) PCB C442 - +myangel3 Kosodate Quiz My Angel 3 (KQT1/VER.A) COH-110 SYSTEM11 MOTHER(B) PCB SYSTEM11 ROM8(64) PCB C443 2 +ptblnk2a Point Blank 2 (GNB3/VER.A) COH-100 / COH-110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8(64) PCB C443 2 -tekken Tekken (TE4/VER.C) COH 100 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB none 5 -tekkena Tekken (TE2/VER.C) COH 100 " " " " -tekkenb Tekken (TE2/VER.B) COH 100 " " " " -tekkenc Tekken (TE1/VER.B) COH 100 " " " " -tekken2 Tekken 2 Ver.B (TES3/VER.B) COH 100 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C406 6 -tekken2a Tekken 2 Ver.B (TES2/VER.B) COH 100 " " " " -tekken2b Tekken 2 (TES2/VER.A) COH 100 " " " " -souledge Soul Edge Ver. II (SO4/VER.C) COH 100 / COH 110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C409 6 -souledga Soul Edge Ver. II (SO3/VER.C) COH 100 / COH 110 " " " " -souledgb Soul Edge (SO3/VER.A) COH 100 / COH 110 " " " " -souledgc Soul Edge (SO1/VER.A) COH 100 / COH 110 " " " " -dunkmnia Dunk Mania (DM2/VER.C) COH 100 / COH 110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C410 5 -dunkmnic Dunk Mania (DM1/VER.C) COH 100 / COH 110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C410 5 -xevi3dg Xevious 3D/G (XV31/VER.A) COH 100 / COH 110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C430 5 -primglex Prime Goal EX (PG1/VER.A) COH 100 / COH 110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C411 6 -danceyes Dancing Eyes (DC1/VER.A) COH 100 / COH 110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8 PCB C431 5 -starswep Star Sweep (STP1/VER.A) COH 100 / COH 110 SYSTEM11 MOTHER(B) PCB C442 - -myangel3 Kosodate Quiz My Angel 3 (KQT1/VER.A) COH 110 SYSTEM11 MOTHER(B) PCB SYSTEM11 ROM8(64) PCB C443 2 -ptblnk2a Point Blank 2 (GNB3/VER.A) COH 110 / COH 110 SYSTEM11 MOTHER PCB SYSTEM11 ROM8(64) PCB C443 2 Not Dumped Yet -------------- - Don Bear Near (C) Namco, 1996 -Pocket Racer (C) Namco, 1996 Point Blank 3 (C) Namco, 2001 Soul Edge Ver. III (C) Namco, 1996 Tekken Ver.C (C) Namco, 1995 Tekken II Ver.C (C) Namco, 1995 +If you can help with the remaining undumped S11 games, please contact http://www.mameworld.net/gurudumps/comments.html + The Namco System 11 system comprises 3 PCB's.... MOTHER PCB- This is the main PCB. It holds all sound circuitry, sound ROMs, program ROMs, shared RAM, bank-switching logic, @@ -95,8 +98,8 @@ SYSTEM11 MOTHER PCB 8645960103 (8645970103) C195 - Namco custom (QFP160) C384 - Namco custom (QFP48) C352 - Namco custom C352 PCM sound chip (QFP100) - AT28C16 - 2K x8 EEPROM (DIP28) - 61C256 - 32K x8 SRAM (x2, SOJ28) + AT28C16 - 2k x8 EEPROM (DIP28) + 61C256 - 32k x8 SRAM (x2, SOJ28) 2061ASC-1- IC Designs 2061ASC-1 programmable clock generator (SOIC16) S11MOT* - Standard System 11 PALs (DIP20) WAVE.8K - Sound samples, 42 pin DIP MASKROM, either 16MBit or 32MBit. If 32MBit, it is programmed in Byte Mode. @@ -122,7 +125,7 @@ SYSTEM11 MOTHER PCB 8645960103 (8645970103) Dunk Mania DM C410 Kosodate Quiz My Angel 3 KQT C443 Prime Goal EX PG C411 - Pocket Racer + Pocket Racer PKR C432 Point Blank 2 GNB C443 Point Blank 3 Soul Edge SO C409 @@ -279,7 +282,7 @@ INLINE void verboselog( int n_level, const char *s_fmt, ... ) va_start( v, s_fmt ); vsprintf( buf, s_fmt, v ); va_end( v ); - logerror( "%08x: %s", activecpu_get_pc(), buf ); + logerror( "%02x:%08x: %s", cpu_getactivecpu(), safe_activecpu_get_pc(), buf ); } } @@ -464,6 +467,39 @@ static READ32_HANDLER( keycus_c431_r ) return data; } +/* pocket racer */ +static READ32_HANDLER( keycus_c432_r ) +{ + UINT32 data; + UINT16 n_value; + + if( ( namcos11_keycus[ 3 ] & 0x0000ffff ) == 0x00002f15 ) + { + n_value = namcos11_keycus[ 1 ] & 0x0000ffff; + } + else + { + n_value = 432; + } + + data = namcos11_keycus[ offset ]; + switch( offset ) + { + case 1: + data = ( data & 0xffff0000 ) | ( ( ( n_value / 10 ) % 10 ) << 8 ) | ( ( n_value / 1 ) % 10 ); + break; + case 2: + data = ( data & 0xffff0000 ) | ( ( ( n_value / 1000 ) % 10 ) << 8 ) | ( ( n_value / 100 ) % 10 ); + break; + case 3: + data = ( data & 0xffff0000 ) | ( ( ( n_value / 100000 ) % 10 ) << 8 ) | ( ( n_value / 10000 ) % 10 ); + break; + } + + verboselog( 1, "keycus_c432_r( %08x, %08x, %08x )\n", offset, data, mem_mask ); + return data; +} + /* star sweep */ static READ32_HANDLER( keycus_c442_r ) { @@ -532,42 +568,73 @@ static READ32_HANDLER( sharedram_r ) #define SHRAM( x ) namcos11_sharedram[ ( x - 0x4000 ) / 4 ] +static UINT16 m_n_oldcoin; + static INTERRUPT_GEN( namcos11_vblank ) { UINT16 n_coin; UINT32 n_input; - static UINT16 n_oldcoin = 0; - n_input = readinputport( 0 ) | ( readinputport( 1 ) << 16 ); - SHRAM( 0xbd00 ) = n_input | ( ( n_input & ~SHRAM( 0xbd00 ) ) >> 8 ); + n_input = ( readinputportbytag( "PLAYER1" ) << 16 ); + SHRAM( 0xbd00 ) = n_input | ( ( n_input & ~SHRAM( 0xbd00 ) ) >> 8 ) | ( SHRAM( 0xbd00 ) & 0x0000ffff ); - n_input = readinputport( 2 ) | ( readinputport( 3 ) << 16 ); + n_input = readinputportbytag( "PLAYER2" ) | ( readinputportbytag( "PLAYER3" ) << 16 ); SHRAM( 0xbd04 ) = n_input | ( ( n_input & ~SHRAM( 0xbd04 ) ) >> 8 ); - n_input = readinputport( 4 ); - SHRAM( 0xbd08 ) = n_input | ( ( n_input & ~SHRAM( 0xbd08 ) ) >> 8 ); + n_input = readinputportbytag( "PLAYER4" ); + SHRAM( 0xbd08 ) = n_input | ( ( n_input & ~SHRAM( 0xbd08 ) ) >> 8 ) | ( SHRAM( 0xbd08 ) & 0xffff0000 ); - n_coin = readinputport( 5 ); + n_coin = readinputportbytag( "COIN" ); - if( ( n_coin & n_oldcoin & 0x08 ) != 0 ) + if( ( n_coin & m_n_oldcoin & 0x08 ) != 0 ) { SHRAM( 0xbd1c ) = ( SHRAM( 0xbd1c ) & 0x0000ffff ) | ( ( SHRAM( 0xbd1c ) + 0x00010000 ) & 0xffff0000 ); } - if( ( n_coin & n_oldcoin & 0x04 ) != 0 ) + if( ( n_coin & m_n_oldcoin & 0x04 ) != 0 ) { SHRAM( 0xbd20 ) = ( SHRAM( 0xbd20 ) & 0xffff0000 ) | ( ( SHRAM( 0xbd20 ) + 0x00000001 ) & 0x0000ffff ); } - if( ( n_coin & n_oldcoin & 0x02 ) != 0 ) + if( ( n_coin & m_n_oldcoin & 0x02 ) != 0 ) { SHRAM( 0xbd20 ) = ( SHRAM( 0xbd20 ) & 0x0000ffff ) | ( ( SHRAM( 0xbd20 ) + 0x00010000 ) & 0xffff0000 ); } - if( ( n_coin & n_oldcoin & 0x01 ) != 0 ) + if( ( n_coin & m_n_oldcoin & 0x01 ) != 0 ) { SHRAM( 0xbd24 ) = ( SHRAM( 0xbd24 ) & 0xffff0000 ) | ( ( SHRAM( 0xbd24 ) + 0x00000001 ) & 0x0000ffff ); } - n_oldcoin = ~n_coin; + m_n_oldcoin = ~n_coin; psx_vblank(); + + if( strcmp( Machine->gamedrv->name, "pocketrc" ) == 0 ) + { + if( g_p_n_psxram[ 0x12c74 / 4 ] == 0x1440fff9 ) + { + g_p_n_psxram[ 0x12c74 / 4 ] = 0; + } + if( g_p_n_psxram[ 0x64694 / 4 ] == 0x1443000c ) + { + g_p_n_psxram[ 0x64694 / 4 ] = 0; + } + + if( ( SHRAM( 0xbe88 ) & 0x0000ffff ) == 2 ) + { + cpunum_set_input_line( 0, INPUT_LINE_RESET, PULSE_LINE ); + memset( namcos11_keycus, 0, namcos11_keycus_size ); + + SHRAM( 0xbe88 ) = ( SHRAM( 0xbe88 ) & 0xffff0000 ); + } + + SHRAM( 0xbd30 ) = ( SHRAM( 0xbd30 ) & 0x0000ffff ) | ( 0x0080 << 16 ); + + SHRAM( 0xbd08 ) = ( SHRAM( 0xbd08 ) & 0x0000ffff ) | ( readinputportbytag( "STEERING" ) << 16 ); + SHRAM( 0xbd0c ) = ( SHRAM( 0xbd0c ) & 0xffff0000 ) | ( readinputportbytag( "GAS" ) << 0 ); + } +} + +static void mcu_timer( int unused ) +{ + SHRAM( 0xbd00 ) = ( SHRAM( 0xbd00 ) & 0xffffff00 ) | readinputportbytag( "SWITCH" ); } static UINT32 m_n_bankoffset; @@ -648,14 +715,11 @@ static WRITE32_HANDLER( lightgun_w ) { if( ACCESSING_LSW32 ) { - /* start 1 */ - set_led_status(0, !(data & 0x08)); - /* start 2 */ - set_led_status(1, !(data & 0x04)); - /* blowback 1 */ - /* !(data & 0x02) */ - /* blowback 2 */ - /* !(data & 0x01) */ + output_set_value( "led0", !( data & 0x08 ) ); + output_set_value( "led1", !( data & 0x04 ) ); + output_set_value( "recoil0", !( data & 0x02 ) ); + output_set_value( "recoil1", !( data & 0x01 ) ); + verboselog( 1, "lightgun_w: outputs (%08x %08x)\n", data, mem_mask ); } if( ACCESSING_MSW32 ) @@ -670,16 +734,16 @@ static READ32_HANDLER( lightgun_r ) switch( offset ) { case 0: - data = readinputport( 6 ); + data = readinputportbytag( "GUN1X" ); break; case 1: - data = ( readinputport( 7 ) ) | ( ( readinputport( 7 ) + 1 ) << 16 ); + data = ( readinputportbytag( "GUN1Y" ) ) | ( ( readinputportbytag( "GUN1Y" ) + 1 ) << 16 ); break; case 2: - data = readinputport( 8 ); + data = readinputportbytag( "GUN2X" ); break; case 3: - data = ( readinputport( 9 ) ) | ( ( readinputport( 9 ) + 1 ) << 16 ); + data = ( readinputportbytag( "GUN2Y" ) ) | ( ( readinputportbytag( "GUN2Y" ) + 1 ) << 16 ); break; } verboselog( 2, "lightgun_r( %08x, %08x ) %08x\n", offset, mem_mask, data ); @@ -748,6 +812,7 @@ static struct { "xevi3dg", keycus_c430_r, 32 }, { "primglex", keycus_c411_r, 32 }, { "danceyes", keycus_c431_r, 32 }, + { "pocketrc", keycus_c432_r, 32 }, { "starswep", keycus_c442_r, 0 }, { "myangel3", keycus_c443_r, 64 }, { "ptblnk2a", keycus_c443_r, 64 }, @@ -757,6 +822,10 @@ static struct static DRIVER_INIT( namcos11 ) { int n_game; + void *timer; + + timer = timer_alloc( mcu_timer ); + timer_adjust( timer, TIME_IN_HZ( 600 ), 0, TIME_IN_HZ( 600 ) ); psx_driver_init(); namcoc7x_on_driver_init(); @@ -810,6 +879,8 @@ static DRIVER_INIT( namcos11 ) memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x1f788000, 0x1f788003, 0, 0, lightgun_w ); memory_install_read32_handler (0, ADDRESS_SPACE_PROGRAM, 0x1f780000, 0x1f78000f, 0, 0, lightgun_r ); } + + state_save_register_global( m_n_oldcoin ); } MACHINE_RESET( namcos11 ) @@ -821,7 +892,7 @@ MACHINE_RESET( namcos11 ) NAMCO_C7X_HARDWARE -static MACHINE_DRIVER_START( coh100ns ) +static MACHINE_DRIVER_START( coh100 ) /* basic machine hardware */ MDRV_CPU_ADD( PSXCPU, 33868800 / 2 ) /* 33MHz ?? */ MDRV_CPU_PROGRAM_MAP( namcos11_map, 0 ) @@ -842,39 +913,31 @@ static MACHINE_DRIVER_START( coh100ns ) MDRV_PALETTE_INIT( psx ) MDRV_VIDEO_START( psx_type1 ) MDRV_VIDEO_UPDATE( psx ) -MACHINE_DRIVER_END -static MACHINE_DRIVER_START( coh100 ) - MDRV_IMPORT_FROM( coh100ns ) NAMCO_C7X_MCU_SHARED(16384000) NAMCO_C7X_SOUND(16384000) MACHINE_DRIVER_END -static MACHINE_DRIVER_START( coh110ns ) - MDRV_IMPORT_FROM( coh100ns ) - MDRV_VIDEO_START( psx_type2 ) -MACHINE_DRIVER_END - static MACHINE_DRIVER_START( coh110 ) MDRV_IMPORT_FROM( coh100 ) MDRV_VIDEO_START( psx_type2 ) MACHINE_DRIVER_END -static int lightgunx( int port ) +static int lightgunx( const char *tag ) { const int portmin = 0xd8; const int portmax = 0x387; - int x = ( readinputport( port ) - portmin ); + int x = ( readinputportbytag( tag ) - portmin ); x *= ( Machine->screen[0].visarea.max_x - Machine->screen[0].visarea.min_x ); x /= ( portmax - portmin ); return Machine->screen[0].visarea.min_x + x; } -static int lightguny( int port ) +static int lightguny( const char *tag ) { const int portmin = 0x2c; const int portmax = 0x11b; - int y = ( readinputport( port ) - portmin ); + int y = ( readinputportbytag( tag ) - portmin ); y *= ( Machine->screen[0].visarea.max_y - Machine->screen[0].visarea.min_y ); y /= ( portmax - portmin ); return Machine->screen[0].visarea.min_y + y; @@ -882,10 +945,10 @@ static int lightguny( int port ) static VIDEO_UPDATE( lightgun ) { - video_update_psx( screen, bitmap, cliprect ); + video_update_psx( machine, screen, bitmap, cliprect ); - draw_crosshair( bitmap, lightgunx( 6 ), lightguny( 7 ), cliprect, 0 ); - draw_crosshair( bitmap, lightgunx( 8 ), lightguny( 9 ), cliprect, 1 ); + draw_crosshair( bitmap, lightgunx( "GUN1X" ), lightguny( "GUN1Y" ), cliprect, 0 ); + draw_crosshair( bitmap, lightgunx( "GUN2X" ), lightguny( "GUN2Y" ), cliprect, 1 ); return 0; } @@ -895,11 +958,13 @@ static MACHINE_DRIVER_START( coh110g ) MACHINE_DRIVER_END INPUT_PORTS_START( namcos11 ) - /* IN 0 */ - PORT_START - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_START_TAG( "SWITCH" ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* read by pocket racer */ + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Test Switch") PORT_CODE(KEYCODE_F2) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "Test Switch" ) PORT_CODE( KEYCODE_F2 ) PORT_DIPNAME( 0x02, 0x00, "DIP1 (Test)" ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x02, DEF_STR( On ) ) @@ -907,8 +972,7 @@ INPUT_PORTS_START( namcos11 ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) - /* IN 1 */ - PORT_START + PORT_START_TAG( "PLAYER1" ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY @@ -918,41 +982,37 @@ INPUT_PORTS_START( namcos11 ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START1 ) - /* IN 2 */ - PORT_START - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_START_TAG( "PLAYER2" ) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER( 2 ) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER( 2 ) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER( 2 ) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER( 2 ) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER( 2 ) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER( 2 ) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER( 2 ) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START2 ) - /* IN 3 */ - PORT_START - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(3) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(3) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(3) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(3) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(3) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(3) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(3) + PORT_START_TAG( "PLAYER3" ) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER( 3 ) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER( 3 ) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER( 3 ) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER( 3 ) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER( 3 ) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER( 3 ) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER( 3 ) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START3 ) - /* IN 4 */ - PORT_START - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(4) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(4) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(4) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(4) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(4) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(4) + PORT_START_TAG( "PLAYER4" ) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER( 4 ) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER( 4 ) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER( 4 ) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER( 4 ) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER( 4 ) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER( 4 ) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER( 4 ) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START4 ) - /* IN 5 */ - PORT_START + PORT_START_TAG( "COIN" ) PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 ) @@ -961,42 +1021,15 @@ INPUT_PORTS_START( namcos11 ) INPUT_PORTS_END INPUT_PORTS_START( tekken ) - /* IN 0 */ - PORT_START - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Test Switch") PORT_CODE(KEYCODE_F2) - PORT_DIPNAME( 0x02, 0x00, "DIP1 (Test)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x01, 0x00, "DIP2 (Freeze)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_INCLUDE( namcos11 ) - /* IN 1 */ - PORT_START - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + PORT_MODIFY( "PLAYER1" ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START1 ) - /* IN 2 */ - PORT_START - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) + PORT_MODIFY( "PLAYER2" ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START2 ) - /* IN 3 */ - PORT_START + PORT_MODIFY( "PLAYER3" ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -1006,63 +1039,21 @@ INPUT_PORTS_START( tekken ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) - /* IN 4 */ - PORT_START + PORT_MODIFY( "PLAYER4" ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER( 2 ) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER( 2 ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) - - /* IN 5 */ - PORT_START - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN3 ) - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN4 ) INPUT_PORTS_END INPUT_PORTS_START( souledge ) - /* IN 0 */ - PORT_START - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Test Switch") PORT_CODE(KEYCODE_F2) - PORT_DIPNAME( 0x02, 0x00, "DIP1 (Test)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x01, 0x00, "DIP2 (Freeze)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_INCLUDE( namcos11 ) - /* IN 1 */ - PORT_START - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START1 ) - - /* IN 2 */ - PORT_START - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START2 ) - - /* IN 3 */ - PORT_START + PORT_MODIFY( "PLAYER3" ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -1072,42 +1063,21 @@ INPUT_PORTS_START( souledge ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) - /* IN 4 */ - PORT_START + PORT_MODIFY( "PLAYER4" ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER( 2 ) PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) - - /* IN 5 */ - PORT_START - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN3 ) - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN4 ) INPUT_PORTS_END INPUT_PORTS_START( myangel3 ) - /* IN 0 */ - PORT_START - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Test Switch") PORT_CODE(KEYCODE_F2) - PORT_DIPNAME( 0x02, 0x00, "DIP1 (Test)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x01, 0x00, "DIP2 (Freeze)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_INCLUDE( namcos11 ) - /* IN 1 */ - PORT_START - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START1 ) + PORT_MODIFY( "PLAYER1" ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -1116,19 +1086,16 @@ INPUT_PORTS_START( myangel3 ) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) - /* IN 2 */ - PORT_START - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START2 ) + PORT_MODIFY( "PLAYER2" ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) - PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER( 2 ) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER( 2 ) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER( 2 ) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER( 2 ) - /* IN 3 */ - PORT_START + PORT_MODIFY( "PLAYER3" ) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -1138,8 +1105,7 @@ INPUT_PORTS_START( myangel3 ) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) - /* IN 4 */ - PORT_START + PORT_MODIFY( "PLAYER4" ) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -1148,53 +1114,28 @@ INPUT_PORTS_START( myangel3 ) PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) - - /* IN 5 */ - PORT_START - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END INPUT_PORTS_START( ptblnk2a ) - /* IN 0 */ - PORT_START - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Test Switch") PORT_CODE(KEYCODE_F2) - PORT_DIPNAME( 0x02, 0x00, "DIP1 (Test)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x01, 0x00, "DIP2 (Freeze)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_INCLUDE( namcos11 ) - /* IN 1 */ - PORT_START + PORT_MODIFY( "PLAYER1" ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START1 ) - /* IN 2 */ - PORT_START + PORT_MODIFY( "PLAYER2" ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START2 ) - /* IN 3 */ - PORT_START + PORT_MODIFY( "PLAYER3" ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -1204,8 +1145,7 @@ INPUT_PORTS_START( ptblnk2a ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) - /* IN 4 */ - PORT_START + PORT_MODIFY( "PLAYER4" ) PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) @@ -1215,31 +1155,73 @@ INPUT_PORTS_START( ptblnk2a ) PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) - /* IN 5 */ - PORT_START - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) - - /* IN 6 */ - PORT_START - PORT_BIT( 0xffff, 0x022f, IPT_LIGHTGUN_X ) PORT_MINMAX(0xd8,0x387) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_PLAYER(1) + PORT_START_TAG( "GUN1X" ) + PORT_BIT( 0xffff, 0x022f, IPT_LIGHTGUN_X ) PORT_MINMAX( 0xd8, 0x387 ) PORT_SENSITIVITY( 100 ) PORT_KEYDELTA( 15 ) PORT_PLAYER( 1 ) - /* IN 7 */ - PORT_START - PORT_BIT( 0xffff, 0x00a8, IPT_LIGHTGUN_Y ) PORT_MINMAX(0x2c,0x11b) PORT_SENSITIVITY(50) PORT_KEYDELTA(15) PORT_PLAYER(1) + PORT_START_TAG( "GUN1Y" ) + PORT_BIT( 0xffff, 0x00a8, IPT_LIGHTGUN_Y ) PORT_MINMAX( 0x2c, 0x11b ) PORT_SENSITIVITY( 50 ) PORT_KEYDELTA( 15 ) PORT_PLAYER( 1 ) - /* IN 8 */ - PORT_START - PORT_BIT( 0xffff, 0x022f, IPT_LIGHTGUN_X ) PORT_MINMAX(0xd8,0x387) PORT_SENSITIVITY(100) PORT_KEYDELTA(15) PORT_PLAYER(2) + PORT_START_TAG( "GUN2X" ) + PORT_BIT( 0xffff, 0x022f, IPT_LIGHTGUN_X ) PORT_MINMAX( 0xd8, 0x387 ) PORT_SENSITIVITY( 100 ) PORT_KEYDELTA( 15 ) PORT_PLAYER( 2 ) - /* IN 9 */ - PORT_START - PORT_BIT( 0xffff, 0x00a8, IPT_LIGHTGUN_Y ) PORT_MINMAX(0x2c,0x11b) PORT_SENSITIVITY(50) PORT_KEYDELTA(15) PORT_PLAYER(2) + PORT_START_TAG( "GUN2Y" ) + PORT_BIT( 0xffff, 0x00a8, IPT_LIGHTGUN_Y ) PORT_MINMAX( 0x2c, 0x11b ) PORT_SENSITIVITY( 50 ) PORT_KEYDELTA( 15 ) PORT_PLAYER( 2 ) INPUT_PORTS_END +INPUT_PORTS_START( pocketrc ) + PORT_INCLUDE( namcos11 ) + + PORT_MODIFY( "PLAYER1" ) + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_MODIFY( "PLAYER2" ) + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_MODIFY( "PLAYER3" ) + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_MODIFY( "PLAYER4" ) + PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x4000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CODE( KEYCODE_A ) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + + PORT_MODIFY( "COIN" ) + PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START_TAG( "STEERING" ) + PORT_BIT( 0xffff, 0x0000, IPT_PADDLE ) PORT_MINMAX( 0xff00, 0x00ff ) PORT_SENSITIVITY( 100 ) PORT_KEYDELTA( 3 ) PORT_CENTERDELTA( 128 ) PORT_PLAYER( 1 ) PORT_REVERSE + + PORT_START_TAG( "GAS" ) + PORT_BIT( 0x00ff, 0x0000, IPT_PEDAL ) PORT_MINMAX( 0x0000, 0x00ff ) PORT_SENSITIVITY( 100 ) PORT_KEYDELTA( 15 ) PORT_PLAYER( 1 ) PORT_REVERSE +INPUT_PORTS_END ROM_START( danceyes ) ROM_REGION32_LE( 0x0400000, REGION_USER1, 0 ) /* main prg */ @@ -1338,6 +1320,24 @@ ROM_START( myangel3 ) ROM_RELOAD( 0x800000, 0x400000 ) ROM_END +ROM_START( pocketrc ) + ROM_REGION32_LE( 0x0400000, REGION_USER1, 0 ) /* main prg */ + ROM_LOAD16_BYTE( "pkr1verb.2l", 0x000000, 0x100000, CRC(300d906a) SHA1(f521858f78284d69e6a6ec2c35a468c87dd0628c) ) + ROM_LOAD16_BYTE( "pkr1verb.2j", 0x000001, 0x100000, CRC(d5f47526) SHA1(b1d5b6f714510d0cfcc9b32708287755f9f27ead) ) + + ROM_REGION32_LE( 0x1000000, REGION_USER2, 0 ) /* main data */ + ROM_LOAD16_BYTE( "pkr1rom0l.ic5", 0x000000, 0x200000, CRC(6c9b074c) SHA1(885f342bd178e4146e1f75259206f6625c0b3c18) ) + ROM_LOAD16_BYTE( "pkr1rom0u.ic6", 0x000001, 0x200000, CRC(a55c0906) SHA1(3b6abfa877f88a4d96222d98af02498b0c777af6) ) + + ROM_REGION16_LE( 0x100000, REGION_USER4, 0 ) /* sound data and MCU BIOS */ + ROM_LOAD( "pkr1verb.6d", 0x000000, 0x040000, CRC(9bf08992) SHA1(fca7943f7bcf0ee758fa63fbdef8f7456b9e46cb) ) + NAMCO_C7X_BIOS + + ROM_REGION( 0x1000000, REGION_SOUND1, 0 ) /* samples */ + ROM_LOAD( "pkr1wave.8k", 0x000000, 0x400000, CRC(72517c46) SHA1(d0dcc750fe8eca9e965e7c366ac39a42ffd76557) ) + ROM_RELOAD( 0x800000, 0x400000 ) +ROM_END + ROM_START( primglex ) ROM_REGION32_LE( 0x0400000, REGION_USER1, 0 ) /* main prg */ ROM_LOAD16_BYTE( "pg1vera.2l", 0x0000000, 0x100000, CRC(fc15fd1a) SHA1(6ca5ebdc096cab3296dc7c1f675d78dfc7c69a05) ) @@ -1708,6 +1708,7 @@ GAME( 1995, dunkmnic, dunkmnia, coh110, namcos11, namcos11, ROT0, "Namco", "Dun GAME( 1995, xevi3dg, 0, coh110, namcos11, namcos11, ROT0, "Namco", "Xevious 3D/G (XV31/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, primglex, 0, coh110, tekken, namcos11, ROT0, "Namco", "Prime Goal EX (PG1/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1996, danceyes, 0, coh110, namcos11, namcos11, ROT0, "Namco", "Dancing Eyes (DC1/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) +GAME( 1996, pocketrc, 0, coh110, pocketrc, namcos11, ROT0, "Namco", "Pocket Racer (PKR1/VER.B)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1997, starswep, 0, coh110, namcos11, namcos11, ROT0, "Axela/Namco", "Star Sweep (STP1/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1998, myangel3, 0, coh110, myangel3, namcos11, ROT0, "Namco", "Kosodate Quiz My Angel 3 (KQT1/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) GAME( 1999, ptblnk2a, ptblank2, coh110g, ptblnk2a, namcos11, ROT0, "Namco", "Point Blank 2 (GNB3/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) diff --git a/src/drivers/namcos12.c b/src/drivers/namcos12.c index a15c14317..7a51e181c 100644 --- a/src/drivers/namcos12.c +++ b/src/drivers/namcos12.c @@ -1373,7 +1373,7 @@ static void s12_draw_crosshair( mame_bitmap *bitmap, const char *xtag, const cha static VIDEO_UPDATE( coh700g ) { - video_update_psx( screen, bitmap, cliprect ); + video_update_psx( machine, screen, bitmap, cliprect ); s12_draw_crosshair( bitmap, "IN3", "IN4", cliprect, 0 ); s12_draw_crosshair( bitmap, "IN5", "IN6", cliprect, 1 ); @@ -1389,7 +1389,7 @@ static DRIVER_INIT( namcos12 ) static DRIVER_INIT( ptblank2 ) { - init_namcos12(); + init_namcos12(machine); /* patch out wait for dma 5 to complete */ *( (UINT32 *)( memory_region( REGION_USER1 ) + 0x331c4 ) ) = 0; @@ -1407,7 +1407,7 @@ static DRIVER_INIT( ptblank2 ) static DRIVER_INIT( ghlpanic ) { - init_namcos12(); + init_namcos12(machine); system11gun_install(); @@ -1422,7 +1422,7 @@ static DRIVER_INIT( ghlpanic ) static DRIVER_INIT( golgo13 ) { - init_namcos12(); + init_namcos12(machine); gunxmin = 0x9c; gunxmax = 0x29b; diff --git a/src/drivers/namcos22.c b/src/drivers/namcos22.c index 4634025e1..c1f2334df 100644 --- a/src/drivers/namcos22.c +++ b/src/drivers/namcos22.c @@ -1596,6 +1596,12 @@ static WRITE8_HANDLER( mcu_port5_w ) // prop cycle outputs: // bit 1 = fan // bit 2 = button light + + if (!strcmp(Machine->gamedrv->name, "propcycl")) + { + output_set_value("fan0", data & 1); + set_led_status(0, data & 2); + } } static READ8_HANDLER( mcu_port6_r ) @@ -1781,27 +1787,8 @@ static READ8_HANDLER( mcu_port4_s22_r ) return p4 | 0x10; // for C74, 0x10 selects sound MCU role, 0x00 selects control-reading role } -static READ8_HANDLER( mcu_port5_s22_r ) -{ - return 0xff; -} - -static READ8_HANDLER( mcu_port6_s22_r ) -{ - return 0; -} - -static READ8_HANDLER( mcu_port7_s22_r ) -{ - return 0; -} - static ADDRESS_MAP_START( mcu_s22_io, ADDRESS_SPACE_IO, 8 ) - AM_RANGE(M37710_PORT4, M37710_PORT4) AM_READ( mcu_port4_s22_r ) //AM_WRITE( mcu_port4_w ) -// AM_RANGE(M37710_PORT5, M37710_PORT5) AM_READ( mcu_port5_s22_r ) AM_WRITE( mcu_port5_w ) -// AM_RANGE(M37710_PORT6, M37710_PORT6) AM_READ( mcu_port6_s22_r ) AM_WRITENOP -// AM_RANGE(M37710_PORT7, M37710_PORT7) AM_READ( mcu_port7_s22_r ) -// AM_RANGE(0x10, 0x1f) AM_NOP + AM_RANGE(M37710_PORT4, M37710_PORT4) AM_READ( mcu_port4_s22_r ) ADDRESS_MAP_END static INTERRUPT_GEN( mcu_interrupt ) @@ -1863,10 +1850,10 @@ static MACHINE_DRIVER_START( namcos22s ) MDRV_SOUND_ADD(C352, SS22_MASTER_CLOCK/3) MDRV_SOUND_CONFIG(c352_interface) - MDRV_SOUND_ROUTE(0, "right", 0.60) - MDRV_SOUND_ROUTE(1, "left", 0.60) - MDRV_SOUND_ROUTE(2, "right", 0.60) - MDRV_SOUND_ROUTE(3, "left", 0.60) + MDRV_SOUND_ROUTE(0, "right", 1.00) + MDRV_SOUND_ROUTE(1, "left", 1.00) + MDRV_SOUND_ROUTE(2, "right", 1.00) + MDRV_SOUND_ROUTE(3, "left", 1.00) MACHINE_DRIVER_END /*********************************************************************************/ @@ -2275,10 +2262,10 @@ static MACHINE_DRIVER_START( namcos22 ) MDRV_SOUND_ADD(C352, SS22_MASTER_CLOCK/3) MDRV_SOUND_CONFIG(c352_interface) - MDRV_SOUND_ROUTE(0, "right", 0.60) - MDRV_SOUND_ROUTE(1, "left", 0.60) - MDRV_SOUND_ROUTE(2, "right", 0.60) - MDRV_SOUND_ROUTE(3, "left", 0.60) + MDRV_SOUND_ROUTE(0, "right", 1.00) + MDRV_SOUND_ROUTE(1, "left", 1.00) + MDRV_SOUND_ROUTE(2, "right", 1.00) + MDRV_SOUND_ROUTE(3, "left", 1.00) MACHINE_DRIVER_END /*********************************************************************************/ @@ -2296,8 +2283,7 @@ ROM_START( airco22b ) ROM_REGION( 0x10000*2, REGION_CPU3, 0 ) /* Slave DSP */ ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) ) - ROM_REGION( 0x080000, REGION_CPU4, 0 ) /* S22-BIOS ver1.30 */ - ROM_LOAD( "c74.bin", 0x0000, 0x4000, NO_DUMP ) + ROM_REGION( 0x080000, REGION_CPU4, ROMREGION_ERASE00 ) /* S22-BIOS ver1.30 */ ROM_REGION( 0x080000, REGION_USER4, 0 ) /* MCU BIOS */ ROM_LOAD( "acs1data.8k", 0, 0x080000, CRC(33824bc9) SHA1(80ec63883770e5eec1f5f1ddc16a85ef8f22a48b) ) @@ -2354,8 +2340,7 @@ ROM_START( alpinerc ) ROM_REGION( 0x10000*2, REGION_CPU3, 0 ) /* Slave DSP */ ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) ) - ROM_REGION( 0x080000, REGION_CPU4, 0 ) /* S22-BIOS ver1.30 */ - ROM_LOAD( "c74.bin", 0x0000, 0x4000, NO_DUMP ) + ROM_REGION( 0x080000, REGION_CPU4, ROMREGION_ERASE00 ) /* S22-BIOS ver1.30 */ ROM_REGION( 0x080000, REGION_USER4, 0 ) /* MCU BIOS */ ROM_LOAD( "ar1datab.8k", 0, 0x080000, CRC(c26306f8) SHA1(6d8d993c076d5ced523143a86bd0938b3794478d) ) @@ -2517,8 +2502,7 @@ ROM_START( alpinerd ) ROM_REGION( 0x10000*2, REGION_CPU3, 0 ) /* Slave DSP */ ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) ) - ROM_REGION( 0x080000, REGION_CPU4, 0 ) /* S22-BIOS ver1.30 */ - ROM_LOAD( "c74.bin", 0x0000, 0x4000, NO_DUMP ) + ROM_REGION( 0x080000, REGION_CPU4, ROMREGION_ERASE00 ) /* S22-BIOS ver1.30 */ ROM_REGION16_LE( 0x080000, REGION_USER4, 0 ) /* MCU BIOS */ ROM_LOAD( "ar1datab.8k", 0, 0x080000, CRC(c26306f8) SHA1(6d8d993c076d5ced523143a86bd0938b3794478d) ) @@ -2574,8 +2558,7 @@ ROM_START( alpinr2b ) ROM_REGION( 0x10000*2, REGION_CPU3, 0 ) /* Slave DSP */ ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) ) - ROM_REGION( 0x080000, REGION_CPU4, 0 ) /* S22-BIOS ver1.30 */ - ROM_LOAD( "c74.bin", 0x0000, 0x4000, NO_DUMP ) + ROM_REGION( 0x080000, REGION_CPU4, ROMREGION_ERASE00 ) /* S22-BIOS ver1.30 */ ROM_REGION16_LE( 0x080000, REGION_USER4, 0 ) /* MCU BIOS */ ROM_LOAD( "ars2data.8k", 0x000000, 0x080000, CRC(29b36dcb) SHA1(70fde130c11789c822829493a70ecefb077c0c15) ) @@ -2629,8 +2612,7 @@ ROM_START( alpinesa ) ROM_REGION( 0x10000*2, REGION_CPU3, 0 ) /* Slave DSP */ ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) ) - ROM_REGION( 0x080000, REGION_CPU4, 0 ) /* S22-BIOS ver1.41 */ - ROM_LOAD( "c74.bin", 0x0000, 0x4000, NO_DUMP ) + ROM_REGION( 0x080000, REGION_CPU4, ROMREGION_ERASE00 ) /* S22-BIOS ver1.41 */ ROM_REGION16_LE( 0x080000, REGION_USER4, 0 ) /* MCU BIOS */ ROM_LOAD( "af1data.8k", 0x000000, 0x080000, CRC(ef13ebe8) SHA1(5d3f697994d4b5b19ee7fea1e2aef8e39449b68e) ) @@ -2674,8 +2656,7 @@ ROM_START( cybrcomm ) ROM_REGION( 0x10000*2, REGION_CPU3, 0 ) /* Slave DSP */ ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) ) - ROM_REGION( 0x080000, REGION_CPU4, 0 ) /* BIOS */ - ROM_LOAD( "c74.bin", 0x0000, 0x4000, CRC(a3dce360) SHA1(8f3248b1890abb2e649927240ae46f73bb171e3b) ) + ROM_REGION( 0x080000, REGION_CPU4, ROMREGION_ERASE00 ) /* BIOS */ ROM_REGION16_LE( 0x100000, REGION_USER4, 0 ) /* MCU BIOS */ ROM_LOAD( "cy1data.6r", 0, 0x020000, CRC(10d0005b) SHA1(10508eeaf74d24a611b44cd3bb12417ceb78904f) ) @@ -2733,8 +2714,7 @@ ROM_START( cybrcycc ) ROM_REGION( 0x10000*2, REGION_CPU3, 0 ) /* Slave DSP */ ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) ) - ROM_REGION( 0x080000, REGION_CPU4, 0 ) /* S22-BIOS ver1.30 */ - ROM_LOAD( "c74.bin", 0x0000, 0x4000, NO_DUMP ) + ROM_REGION( 0x080000, REGION_CPU4, ROMREGION_ERASE00 ) /* S22-BIOS ver1.30 */ ROM_REGION16_LE( 0x080000, REGION_USER4, 0 ) /* MCU BIOS */ ROM_LOAD( "cb1datab.8k", 0, 0x080000, CRC(e2404221) SHA1(b88810dd45aee8a5475c30806cdfded25fa14e0e) ) @@ -2787,8 +2767,7 @@ ROM_START( propcycl ) ROM_REGION( 0x10000*2, REGION_CPU3, 0 ) /* Slave DSP */ ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) ) - ROM_REGION( 0x080000, REGION_CPU4, 0 ) /* SS22-BIOS ver1.41 */ - ROM_LOAD( "c74.bin", 0x0000, 0x4000, NO_DUMP ) + ROM_REGION( 0x080000, REGION_CPU4, ROMREGION_ERASE00 ) /* SS22-BIOS ver1.41 */ ROM_REGION16_LE( 0x080000, REGION_USER4, 0 ) /* MCU BIOS */ ROM_LOAD( "pr1data.8k", 0, 0x080000, CRC(2e5767a4) SHA1(390bf05c90044d841fe2dd4a427177fa1570b9a6) ) @@ -3151,7 +3130,7 @@ ROM_START( ridgera2 ) ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) ) ROM_REGION( 0x80000, REGION_CPU4, 0 ) /* BIOS */ - ROM_LOAD( "c74.bin", 0x0000, 0x4000, NO_DUMP ) + ROM_LOAD( "c74.bin", 0x0000, 0x4000, CRC(a3dce360) SHA1(8f3248b1890abb2e649927240ae46f73bb171e3b) ) ROM_REGION( 0x100000, REGION_USER4, 0 ) /* sound data and MCU BIOS */ ROM_LOAD( "rrs1data.6r", 0, 0x080000, CRC(b7063aa8) SHA1(08ff689e8dd529b91eee423c93f084945c6de417) ) @@ -3202,7 +3181,7 @@ ROM_START( ridger2a ) ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) ) ROM_REGION( 0x80000, REGION_CPU4, 0 ) /* BIOS */ - ROM_LOAD( "c74.bin", 0x0000, 0x4000, NO_DUMP ) + ROM_LOAD( "c74.bin", 0x0000, 0x4000, CRC(a3dce360) SHA1(8f3248b1890abb2e649927240ae46f73bb171e3b) ) ROM_REGION( 0x100000, REGION_USER4, 0 ) /* sound data and MCU BIOS */ ROM_LOAD( "rrs1data.6r", 0, 0x080000, CRC(b7063aa8) SHA1(08ff689e8dd529b91eee423c93f084945c6de417) ) @@ -3360,7 +3339,6 @@ ROM_START( ridgeraj ) ROM_REGION( 0x100000, REGION_USER4, 0 ) /* sound data and MCU BIOS */ ROM_LOAD( "rr1data.6r", 0, 0x080000, CRC(18f5f748) SHA1(e0d149a66de36156edd9b55f604c9a9801aaefa8) ) - ROM_LOAD( "c74.bin", 0x08c000, 0x4000, CRC(a3dce360) SHA1(8f3248b1890abb2e649927240ae46f73bb171e3b) ) ROM_REGION( 0x200000*8, REGION_TEXTURE_TILE, ROMREGION_DISPOSE) /* 16x16x8bpp texture tiles */ ROM_LOAD( "rr1cg0.bin", 0x200000*0x4, 0x200000, CRC(b557a795) SHA1(f345486ffbe797246ad80a55d3c4a332ed6e2888) )//,CRC(d1b0eec6) SHA1(f66922c324dfc3ff408db7556c587ef90ca64c3b) ) @@ -3407,8 +3385,7 @@ ROM_START( timecris ) ROM_REGION( 0x10000*2, REGION_CPU3, 0 ) /* Slave DSP */ ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) ) - ROM_REGION( 0x80000, REGION_CPU4, 0 ) /* BIOS */ - ROM_LOAD( "c74.bin", 0x0000, 0x4000, NO_DUMP ) + ROM_REGION( 0x80000, REGION_CPU4, ROMREGION_ERASE00 ) /* BIOS */ ROM_REGION16_LE( 0x080000, REGION_USER4, 0 ) /* MCU BIOS */ ROM_LOAD( "ts1data.8k", 0, 0x080000, CRC(e68aa973) SHA1(663e80d249be5d5841139d98a9d72e2396851272) ) @@ -3461,8 +3438,7 @@ ROM_START( timecrsa ) ROM_REGION( 0x10000*2, REGION_CPU3, 0 ) /* Slave DSP */ ROM_LOAD16_WORD( "c71.bin", 0,0x1000*2, CRC(47c623ab) SHA1(e363ac50f5556f83308d4cc191b455e9b62bcfc8) ) - ROM_REGION( 0x80000, REGION_CPU4, 0 ) /* BIOS */ - ROM_LOAD( "c74.bin", 0x0000, 0x4000, NO_DUMP ) + ROM_REGION( 0x80000, REGION_CPU4, ROMREGION_ERASE00 ) /* BIOS */ ROM_REGION16_LE( 0x080000, REGION_USER4, 0 ) /* MCU BIOS */ ROM_LOAD( "ts1data.8k", 0, 0x080000, CRC(e68aa973) SHA1(663e80d249be5d5841139d98a9d72e2396851272) ) diff --git a/src/drivers/namcos23.c b/src/drivers/namcos23.c index 7e4691c70..7df374925 100644 --- a/src/drivers/namcos23.c +++ b/src/drivers/namcos23.c @@ -470,7 +470,7 @@ DrawPoly( mame_bitmap *bitmap, const UINT32 *pSource, int n, int bNew ) VIDEO_UPDATE( ss23 ) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); fillbitmap(priority_bitmap, 0, cliprect); tilemap_mark_all_tiles_dirty(bgtilemap); @@ -570,7 +570,7 @@ INLINE void UpdatePalette( int entry ) int r = nthbyte(paletteram32,which+0x00001); int g = nthbyte(paletteram32,which+0x08001); int b = nthbyte(paletteram32,which+0x18001); - palette_set_color( which,r,g,b ); + palette_set_color( Machine,which,r,g,b ); } } diff --git a/src/drivers/nbmj8688.c b/src/drivers/nbmj8688.c index e79a60efd..51d31a592 100644 --- a/src/drivers/nbmj8688.c +++ b/src/drivers/nbmj8688.c @@ -77,21 +77,21 @@ static DRIVER_INIT( mjsikaku ) { nb1413m3_type = NB1413M3_MJSIKAKU; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mmsikaku ) { nb1413m3_type = NB1413M3_MMSIKAKU; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( otonano ) { nb1413m3_type = NB1413M3_OTONANO; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mjcamera ) @@ -112,7 +112,7 @@ static DRIVER_INIT( mjcamera ) nb1413m3_type = NB1413M3_MJCAMERA; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( kanatuen ) @@ -127,7 +127,7 @@ static DRIVER_INIT( kanatuen ) nb1413m3_type = NB1413M3_KANATUEN; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( kyuhito ) @@ -143,7 +143,7 @@ static DRIVER_INIT( kyuhito ) nb1413m3_type = NB1413M3_KYUHITO; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( idhimitu ) @@ -164,14 +164,14 @@ static DRIVER_INIT( idhimitu ) nb1413m3_type = NB1413M3_IDHIMITU; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( kaguya ) { nb1413m3_type = NB1413M3_KAGUYA; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( kaguya2 ) @@ -192,175 +192,175 @@ static DRIVER_INIT( kaguya2 ) nb1413m3_type = NB1413M3_KAGUYA2; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( secolove ) { nb1413m3_type = NB1413M3_SECOLOVE; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( citylove ) { nb1413m3_type = NB1413M3_CITYLOVE; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mcitylov ) { nb1413m3_type = NB1413M3_MCITYLOV; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( seiha ) { nb1413m3_type = NB1413M3_SEIHA; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( seiham ) { nb1413m3_type = NB1413M3_SEIHAM; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( korinai ) { nb1413m3_type = NB1413M3_KORINAI; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( korinaim ) { nb1413m3_type = NB1413M3_KORINAIM; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( iemoto ) { nb1413m3_type = NB1413M3_IEMOTO; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( iemotom ) { nb1413m3_type = NB1413M3_IEMOTOM; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( ryuuha ) { nb1413m3_type = NB1413M3_RYUUHA; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( ojousan ) { nb1413m3_type = NB1413M3_OJOUSAN; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( ojousanm ) { nb1413m3_type = NB1413M3_OJOUSANM; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( bijokkoy ) { nb1413m3_type = NB1413M3_BIJOKKOY; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( bijokkog ) { nb1413m3_type = NB1413M3_BIJOKKOG; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( housemnq ) { nb1413m3_type = NB1413M3_HOUSEMNQ; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( housemn2 ) { nb1413m3_type = NB1413M3_HOUSEMN2; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( orangec ) { nb1413m3_type = NB1413M3_ORANGEC; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( orangeci ) { nb1413m3_type = NB1413M3_ORANGECI; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( vipclub ) { nb1413m3_type = NB1413M3_VIPCLUB; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( livegal ) { nb1413m3_type = NB1413M3_LIVEGAL; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( crystalg ) { nb1413m3_type = NB1413M3_CRYSTALG; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( crystal2 ) { nb1413m3_type = NB1413M3_CRYSTAL2; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( apparel ) { nb1413m3_type = NB1413M3_APPAREL; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( nightlov ) { nb1413m3_type = NB1413M3_NIGHTLOV; - init_nb1413m3(); + init_nb1413m3(machine); } diff --git a/src/drivers/nbmj8891.c b/src/drivers/nbmj8891.c index 7c07b3e3b..52632f0fd 100644 --- a/src/drivers/nbmj8891.c +++ b/src/drivers/nbmj8891.c @@ -98,14 +98,14 @@ static DRIVER_INIT( gionbana ) nb1413m3_type = NB1413M3_GIONBANA; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mgion ) { nb1413m3_type = NB1413M3_MGION; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( omotesnd ) @@ -141,7 +141,7 @@ static DRIVER_INIT( omotesnd ) // ROM[0x026a] = 0x00; #endif - init_nb1413m3(); + init_nb1413m3(machine); nb1413m3_type = NB1413M3_OMOTESND; } @@ -150,21 +150,21 @@ static DRIVER_INIT( abunai ) { nb1413m3_type = NB1413M3_ABUNAI; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( hanamomo ) { nb1413m3_type = NB1413M3_HANAMOMO; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( msjiken ) { nb1413m3_type = NB1413M3_MSJIKEN; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( telmahjn ) @@ -184,7 +184,7 @@ static DRIVER_INIT( telmahjn ) nb1413m3_type = NB1413M3_TELMAHJN; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mgmen89 ) @@ -204,7 +204,7 @@ static DRIVER_INIT( mgmen89 ) nb1413m3_type = NB1413M3_MGMEN89; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mjfocus ) @@ -228,7 +228,7 @@ static DRIVER_INIT( mjfocus ) nb1413m3_type = NB1413M3_MJFOCUS; // mjfocus & peepshow - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mjfocusm ) @@ -243,7 +243,7 @@ static DRIVER_INIT( mjfocusm ) #endif nb1413m3_type = NB1413M3_MJFOCUSM; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( scandal ) @@ -255,14 +255,14 @@ static DRIVER_INIT( scandal ) nb1413m3_type = NB1413M3_SCANDAL; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( scandalm ) { nb1413m3_type = NB1413M3_SCANDALM; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mjnanpas ) @@ -287,63 +287,63 @@ static DRIVER_INIT( mjnanpas ) nb1413m3_type = NB1413M3_MJNANPAS; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( bananadr ) { nb1413m3_type = NB1413M3_BANANADR; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( club90s ) { nb1413m3_type = NB1413M3_CLUB90S; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( lovehous ) { nb1413m3_type = NB1413M3_LOVEHOUS; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mladyhtr ) { nb1413m3_type = NB1413M3_MLADYHTR; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( chinmoku ) { nb1413m3_type = NB1413M3_CHINMOKU; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( maiko ) { nb1413m3_type = NB1413M3_MAIKO; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mmaiko ) { nb1413m3_type = NB1413M3_MMAIKO; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( hanaoji ) { nb1413m3_type = NB1413M3_HANAOJI; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( pairsnb ) @@ -363,7 +363,7 @@ static DRIVER_INIT( pairsnb ) nb1413m3_type = NB1413M3_PAIRSNB; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( pairsten ) @@ -383,21 +383,21 @@ static DRIVER_INIT( pairsten ) nb1413m3_type = NB1413M3_PAIRSTEN; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mmcamera ) { nb1413m3_type = NB1413M3_MMCAMERA; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( taiwanmb ) { nb1413m3_type = NB1413M3_TAIWANMB; - init_nb1413m3(); + init_nb1413m3(machine); } diff --git a/src/drivers/nbmj8991.c b/src/drivers/nbmj8991.c index 0cc78eac7..63c6a4414 100644 --- a/src/drivers/nbmj8991.c +++ b/src/drivers/nbmj8991.c @@ -83,7 +83,7 @@ static MACHINE_RESET( nbmj8991 ) memory_configure_bank(1, 0, 4, memory_region(REGION_CPU2) + 0x8000, 0x8000); memory_set_bank(1, 0); } - machine_reset_nb1413m3(); + machine_reset_nb1413m3(machine); } static DRIVER_INIT( pstadium ) @@ -135,14 +135,14 @@ static DRIVER_INIT( galkoku ) { nb1413m3_type = NB1413M3_GALKOKU; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( hyouban ) { nb1413m3_type = NB1413M3_HYOUBAN; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( galkaika ) @@ -155,7 +155,7 @@ static DRIVER_INIT( galkaika ) #endif nb1413m3_type = NB1413M3_GALKAIKA; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( tokyogal ) @@ -168,7 +168,7 @@ static DRIVER_INIT( tokyogal ) #endif nb1413m3_type = NB1413M3_TOKYOGAL; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( tokimbsj ) @@ -181,28 +181,28 @@ static DRIVER_INIT( tokimbsj ) #endif nb1413m3_type = NB1413M3_TOKIMBSJ; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mcontest ) { nb1413m3_type = NB1413M3_MCONTEST; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( uchuuai ) { nb1413m3_type = NB1413M3_UCHUUAI; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( mjgottub ) { nb1413m3_type = NB1413M3_MJGOTTUB; - init_nb1413m3(); + init_nb1413m3(machine); } static DRIVER_INIT( av2mj1bb ) diff --git a/src/drivers/neogeo.c b/src/drivers/neogeo.c index 566cefabc..6bb0bfe13 100644 --- a/src/drivers/neogeo.c +++ b/src/drivers/neogeo.c @@ -7354,13 +7354,13 @@ ROM_END DRIVER_INIT( fatfury2 ) { - init_neogeo(); + init_neogeo(machine); fatfury2_install_protection(); } DRIVER_INIT( mslugx ) { - init_neogeo(); + init_neogeo(machine); mslugx_install_protection(); } @@ -7369,7 +7369,7 @@ DRIVER_INIT( kof99 ) kof99_decrypt_68k(); neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0x00); - init_neogeo(); + init_neogeo(machine); kof99_install_protection(); } @@ -7378,7 +7378,7 @@ DRIVER_INIT( garou ) garou_decrypt_68k(); neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0x06); - init_neogeo(); + init_neogeo(machine); garou_install_protection(); } @@ -7387,7 +7387,7 @@ DRIVER_INIT( garouo ) garouo_decrypt_68k(); neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0x06); - init_neogeo(); + init_neogeo(machine); garouo_install_protection(); } @@ -7396,7 +7396,7 @@ DRIVER_INIT( mslug3 ) mslug3_decrypt_68k(); neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0xad); - init_neogeo(); + init_neogeo(machine); mslug3_install_protection(); } @@ -7405,7 +7405,7 @@ DRIVER_INIT( kof2000 ) kof2000_decrypt_68k(); neogeo_fix_bank_type = 2; kof2000_neogeo_gfx_decrypt(0x00); - init_neogeo(); + init_neogeo(machine); kof2000_install_protection(); } @@ -7413,14 +7413,14 @@ DRIVER_INIT( kof2001 ) { neogeo_fix_bank_type = 0; kof2000_neogeo_gfx_decrypt(0x1e); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( mslug4 ) { neogeo_fix_bank_type = 1; /* USA violent content screen is wrong -- not a bug, confirmed on real hardware! */ kof2000_neogeo_gfx_decrypt(0x31); - init_neogeo(); + init_neogeo(machine); neo_pcm2_snk_1999(8); } @@ -7428,76 +7428,76 @@ DRIVER_INIT( kof99n ) { neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0x00); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( ganryu ) { neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0x07); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( s1945p ) { neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0x05); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( preisle2 ) { neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0x9f); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( mslug3n ) { neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0xad); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( kof2000n ) { neogeo_fix_bank_type = 2; kof2000_neogeo_gfx_decrypt(0x00); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( bangbead ) { neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0xf8); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( nitd ) { neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0xff); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( zupapa ) { neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0xbd); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( sengoku3 ) { neogeo_fix_bank_type = 1; kof99_neogeo_gfx_decrypt(0xfe); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT ( kof98 ) { kof98_decrypt_68k(); - init_neogeo(); + init_neogeo(machine); install_kof98_protection(); } @@ -7507,7 +7507,7 @@ DRIVER_INIT( mjneogeo ) { memory_install_read16_handler(0, ADDRESS_SPACE_PROGRAM, 0x300000, 0x300001, 0, 0, mjneogeo_r); memory_install_write16_handler(0, ADDRESS_SPACE_PROGRAM, 0x380000, 0x380001, 0, 0, mjneogeo_w); - init_neogeo(); + init_neogeo(machine); } /* Pop and Bounce and use a custom Spinner for Controls */ @@ -7515,7 +7515,7 @@ DRIVER_INIT( popbounc ) { memory_install_read16_handler(0, ADDRESS_SPACE_PROGRAM, 0x300000, 0x300001, 0, 0, popbounc1_16_r); memory_install_read16_handler(0, ADDRESS_SPACE_PROGRAM, 0x340000, 0x340001, 0, 0, popbounc2_16_r); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( rotd ) @@ -7523,7 +7523,7 @@ DRIVER_INIT( rotd ) neo_pcm2_snk_1999(16); neogeo_fix_bank_type = 1; kof2000_neogeo_gfx_decrypt(0x3f); - init_neogeo(); + init_neogeo(machine); } @@ -7533,7 +7533,7 @@ DRIVER_INIT( kof2002 ) neo_pcm2_swap(0); neogeo_fix_bank_type = 0; kof2000_neogeo_gfx_decrypt(0xec); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( kf2k2pls ) @@ -7542,7 +7542,7 @@ DRIVER_INIT( kf2k2pls ) neo_pcm2_swap(0); neogeo_fix_bank_type = 0; cmc50_neogeo_gfx_decrypt(0xec); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( kf2k2mp ) @@ -7552,7 +7552,7 @@ DRIVER_INIT( kf2k2mp ) neogeo_bootleg_sx_decrypt(2); neogeo_fix_bank_type = 0; cmc50_neogeo_gfx_decrypt(0xec); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( kof2km2 ) @@ -7562,7 +7562,7 @@ DRIVER_INIT( kof2km2 ) neogeo_bootleg_sx_decrypt(1); neogeo_fix_bank_type = 0; cmc50_neogeo_gfx_decrypt(0xec); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( matrim ) @@ -7571,7 +7571,7 @@ DRIVER_INIT( matrim ) neo_pcm2_swap(1); neogeo_fix_bank_type = 2; kof2000_neogeo_gfx_decrypt(0x6a); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( pnyaa ) @@ -7579,7 +7579,7 @@ DRIVER_INIT( pnyaa ) neo_pcm2_snk_1999(4); neogeo_fix_bank_type = 1; kof2000_neogeo_gfx_decrypt(0x2e); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( mslug5 ) /* By HalRIN */ @@ -7588,7 +7588,7 @@ DRIVER_INIT( mslug5 ) /* By HalRIN */ neo_pcm2_swap(2); neogeo_fix_bank_type = 1; kof2000_neogeo_gfx_decrypt(0x19); - init_neogeo(); + init_neogeo(machine); install_pvc_protection(); } @@ -7600,7 +7600,7 @@ DRIVER_INIT( ms5pcb ) neogeo_fix_bank_type = 2; svcpcb_s1data_decrypt(); neo_pcm2_swap(2); - init_neogeo(); + init_neogeo(machine); install_pvc_protection(); } @@ -7611,7 +7611,7 @@ DRIVER_INIT( ms5plus ) // decrypt_ms5plus_s1(); neogeo_bootleg_sx_decrypt(1); neogeo_fix_bank_type = 1; - init_neogeo(); + init_neogeo(machine); install_ms5plus_protection(); } @@ -7623,7 +7623,7 @@ DRIVER_INIT( svcpcb ) svcpcb_s1data_decrypt(); neo_pcm2_swap(3); neogeo_fix_bank_type = 2; - init_neogeo(); + init_neogeo(machine); install_pvc_protection(); } @@ -7633,7 +7633,7 @@ DRIVER_INIT( svchaosa ) /* By HalRIN */ neo_pcm2_swap(3); neogeo_fix_bank_type = 2; kof2000_neogeo_gfx_decrypt(0x57); - init_neogeo(); + init_neogeo(machine); install_pvc_protection(); } @@ -7641,7 +7641,7 @@ DRIVER_INIT( svcboot ) { svcboot_px_decrypt(); svcboot_cx_decrypt(); - init_neogeo(); + init_neogeo(machine); install_pvc_protection(); } @@ -7652,7 +7652,7 @@ DRIVER_INIT( svcplus ) // svcplus_sx_decrypt(); neogeo_bootleg_sx_decrypt(1); svcplus_px_hack(); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( svcplusa ) @@ -7660,7 +7660,7 @@ DRIVER_INIT( svcplusa ) svcplusa_px_decrypt(); svcboot_cx_decrypt(); svcplus_px_hack(); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( svcsplus ) @@ -7670,7 +7670,7 @@ DRIVER_INIT( svcsplus ) neogeo_bootleg_sx_decrypt(2); svcboot_cx_decrypt(); svcsplus_px_hack(); - init_neogeo(); + init_neogeo(machine); install_pvc_protection(); } @@ -7680,7 +7680,7 @@ DRIVER_INIT( samsho5 ) neo_pcm2_swap(4); neogeo_fix_bank_type = 1; kof2000_neogeo_gfx_decrypt(0x0f); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( samsho5b ) @@ -7689,7 +7689,7 @@ DRIVER_INIT( samsho5b ) neogeo_fix_bank_type = 1; kof2000_neogeo_gfx_decrypt(0x0f); samsh5bl_px_decrypt(); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( kf2k3pcb ) /* Jamama, Single Board */ @@ -7702,7 +7702,7 @@ DRIVER_INIT( kf2k3pcb ) /* Jamama, Single Board */ /* rom[i] = BITSWAP8(rom[i], 5, 6, 1, 4, 3, 0, 7, 2) -- extra encrypted m1 swap? not confirmed */ neo_pcm2_swap(5); neogeo_fix_bank_type = 2; - init_neogeo(); + init_neogeo(machine); install_pvc_protection(); memory_install_read16_handler( 0, ADDRESS_SPACE_PROGRAM, 0xc00000, 0xc7ffff, 0, 0, MRA16_BANK3 ); // 512k bios } @@ -7714,7 +7714,7 @@ DRIVER_INIT( kof2003 ) neo_pcm2_swap(5); neogeo_fix_bank_type = 2; kof2000_neogeo_gfx_decrypt(0x9d); - init_neogeo(); + init_neogeo(machine); install_pvc_protection(); } @@ -7722,7 +7722,7 @@ DRIVER_INIT( kof2003b ) { // kof2003b_sx_decrypt(); neogeo_bootleg_sx_decrypt(1); - init_neogeo(); + init_neogeo(machine); kof2003b_install_protection(); } @@ -7731,7 +7731,7 @@ DRIVER_INIT( kof2k3pl ) kof2k3pl_px_decrypt(); //decrypt_ms5plus_s1(); neogeo_bootleg_sx_decrypt(1); - init_neogeo(); + init_neogeo(machine); kf2k3pl_install_protection(); } @@ -7741,7 +7741,7 @@ DRIVER_INIT( kof2k3up ) kof2k3up_px_decrypt(); // kof2k3up_sx_decrypt(); neogeo_bootleg_sx_decrypt(2); - init_neogeo(); + init_neogeo(machine); kof2k3up_install_protection(); } @@ -7753,7 +7753,7 @@ DRIVER_INIT( samsh5sp ) neo_pcm2_swap(6); neogeo_fix_bank_type = 1; kof2000_neogeo_gfx_decrypt(0x0d); - init_neogeo(); + init_neogeo(machine); } @@ -7808,7 +7808,7 @@ DRIVER_INIT( jockeygp ) // memory_install_read16_handler( 0, ADDRESS_SPACE_PROGRAM, 0x280000, 0x280001, 0, 0, vliner_coins_r ); // memory_install_read16_handler( 0, ADDRESS_SPACE_PROGRAM, 0x2c0000, 0x2c0001, 0, 0, vliner_2c0000_r ); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( vliner ) @@ -7821,7 +7821,7 @@ DRIVER_INIT( vliner ) memory_install_read16_handler( 0, ADDRESS_SPACE_PROGRAM, 0x280000, 0x280001, 0, 0, vliner_coins_r ); memory_install_read16_handler( 0, ADDRESS_SPACE_PROGRAM, 0x2c0000, 0x2c0001, 0, 0, vliner_2c0000_r ); - init_neogeo(); + init_neogeo(machine); } /* bootleg related INITs */ @@ -7831,48 +7831,48 @@ DRIVER_INIT( kog ) kog_px_decrypt(); neogeo_bootleg_sx_decrypt(1); neogeo_bootleg_cx_decrypt(); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( kof10th ) { decrypt_kof10th(); - init_neogeo(); + init_neogeo(machine); install_kof10th_protection(); } DRIVER_INIT( kf10thep ) { decrypt_kf10thep(); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( kf2k5uni ) { decrypt_kf2k5uni(); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( cthd2003 ) { decrypt_cthd2003(); - init_neogeo(); + init_neogeo(machine); patch_cthd2003(); } DRIVER_INIT ( ct2k3sp ) { decrypt_ct2k3sp(); - init_neogeo(); + init_neogeo(machine); patch_cthd2003(); } DRIVER_INIT( kof2k4se ) { decrypt_kof2k4se_68k(); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( lans2004 ) @@ -7881,14 +7881,14 @@ DRIVER_INIT( lans2004 ) lans2004_vx_decrypt(); neogeo_bootleg_sx_decrypt(1); neogeo_bootleg_cx_decrypt(); - init_neogeo(); + init_neogeo(machine); } DRIVER_INIT( mslug3b6 ) { neogeo_bootleg_sx_decrypt(2); cmc42_neogeo_gfx_decrypt(0xad); - init_neogeo(); + init_neogeo(machine); } diff --git a/src/drivers/nmg5.c b/src/drivers/nmg5.c index fa1c6df68..033fb3a54 100644 --- a/src/drivers/nmg5.c +++ b/src/drivers/nmg5.c @@ -370,51 +370,50 @@ INPUT_PORTS_END INPUT_PORTS_START( wondstck ) PORT_START_TAG("DSW") - PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:8") PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:7") PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:6") PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW1:5") PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0010, "Number of Helps" ) + PORT_DIPNAME( 0x0010, 0x0010, "Number of Jumps" ) PORT_DIPLOCATION("SW1:4") /* AKA "Helps" */ PORT_DIPSETTING( 0x0010, "3" ) PORT_DIPSETTING( 0x0000, "5" ) - PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Lives ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:3") PORT_DIPSETTING( 0x0020, "3" ) PORT_DIPSETTING( 0x0000, "5" ) - PORT_DIPNAME( 0x00c0, 0x00c0, DEF_STR( Coinage ) ) + PORT_DIPNAME( 0x00c0, 0x00c0, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:1,2") PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x0040, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x00c0, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x0080, DEF_STR( 1C_2C ) ) - PORT_SERVICE( 0x0100, IP_ACTIVE_LOW ) - PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Demo_Sounds ) ) + PORT_SERVICE_DIPLOC( 0x0100, IP_ACTIVE_LOW, "SW2:8" ) + PORT_DIPNAME( 0x0200, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:7") PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:6") PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:5") PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:3") 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_DIPNAME( 0xc000, 0xc000, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2") + PORT_DIPSETTING( 0x8000, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0xc000, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( Very_Hard ) ) PORT_START /* Coins */ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) diff --git a/src/drivers/nmk16.c b/src/drivers/nmk16.c index 29b60f967..08812e952 100644 --- a/src/drivers/nmk16.c +++ b/src/drivers/nmk16.c @@ -188,7 +188,7 @@ static MACHINE_RESET( NMK004 ) static MACHINE_RESET( mustang_sound ) { - machine_reset_seibu_sound_1(); + machine_reset_seibu_sound_1(machine); } WRITE16_HANDLER ( ssmissin_sound_w ) @@ -4838,7 +4838,7 @@ static DRIVER_INIT( mustang ) static DRIVER_INIT( bjtwin ) { - init_nmk(); + init_nmk(machine); /* Patch rom to enable test mode */ diff --git a/src/drivers/nss.c b/src/drivers/nss.c index 5436744e5..bea33625a 100644 --- a/src/drivers/nss.c +++ b/src/drivers/nss.c @@ -453,15 +453,10 @@ static const gfx_decode gfxdecodeinfo[] = static PALETTE_INIT( snes ) { - int i, r, g, b; + int i; for( i = 0; i < 32768; i++ ) - { - r = (i & 0x1F) << 3; - g = ((i >> 5) & 0x1F) << 3; - b = ((i >> 10) & 0x1F) << 3; - palette_set_color( i, r, g, b ); - } + palette_set_color( machine, i, pal5bit(i >> 0), pal5bit(i >> 5), pal5bit(i >> 10) ); /* The colortable can be black */ for( i = 0; i < 256; i++ ) diff --git a/src/drivers/nwk-tr.c b/src/drivers/nwk-tr.c index 4b03c667d..9e912b81c 100644 --- a/src/drivers/nwk-tr.c +++ b/src/drivers/nwk-tr.c @@ -18,20 +18,9 @@ WRITE32_HANDLER(pci_3dfx_w); static WRITE32_HANDLER( paletteram32_w ) { - int r,g,b; - COMBINE_DATA(&paletteram32[offset]); data = paletteram32[offset]; - - b = ((data >> 0) & 0x1f); - g = ((data >> 5) & 0x1f); - r = ((data >> 10) & 0x1f); - - b = (b << 3) | (b >> 2); - g = (g << 3) | (g >> 2); - r = (r << 3) | (r >> 2); - - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0)); } @@ -730,7 +719,7 @@ static DRIVER_INIT(thrilld) backup_ram[0x0e] = (checksum >> 8) & 0xff; // checksum backup_ram[0x0f] = (checksum >> 0) & 0xff; // checksum - init_nwktr(); + init_nwktr(machine); } static DRIVER_INIT(racingj) @@ -764,7 +753,7 @@ static DRIVER_INIT(racingj) backup_ram[0x0e] = (checksum >> 8) & 0xff; // checksum backup_ram[0x0f] = (checksum >> 0) & 0xff; // checksum - init_nwktr(); + init_nwktr(machine); } static DRIVER_INIT(racingj2) @@ -798,7 +787,7 @@ static DRIVER_INIT(racingj2) backup_ram[0x0e] = (checksum >> 8) & 0xff; // checksum backup_ram[0x0f] = (checksum >> 0) & 0xff; // checksum - init_nwktr(); + init_nwktr(machine); } diff --git a/src/drivers/olibochu.c b/src/drivers/olibochu.c index f30f5e595..57b8496d5 100644 --- a/src/drivers/olibochu.c +++ b/src/drivers/olibochu.c @@ -42,7 +42,7 @@ PALETTE_INIT( olibochu ) bit1 = (*color_prom >> 7) & 0x01; b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/drivers/omegrace.c b/src/drivers/omegrace.c index 26a4c654d..9fdb6168a 100644 --- a/src/drivers/omegrace.c +++ b/src/drivers/omegrace.c @@ -333,74 +333,47 @@ WRITE8_HANDLER( omegrace_soundlatch_w ) * *************************************/ -static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x3fff) AM_READ(MRA8_ROM) - AM_RANGE(0x4000, 0x4bff) AM_READ(MRA8_RAM) - AM_RANGE(0x5c00, 0x5cff) AM_READ(MRA8_RAM) /* NVRAM */ - AM_RANGE(0x8000, 0x8fff) AM_READ(MRA8_RAM) - AM_RANGE(0x9000, 0x9fff) AM_READ(MRA8_ROM) /* vector rom */ +static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x3fff) AM_ROM + AM_RANGE(0x4000, 0x4bff) AM_RAM + AM_RANGE(0x5c00, 0x5cff) AM_RAM AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) /* NVRAM */ + AM_RANGE(0x8000, 0x8fff) AM_RAM AM_BASE(&vectorram) AM_SIZE(&vectorram_size) AM_REGION(REGION_CPU1, 0x8000) /* vector ram */ + AM_RANGE(0x9000, 0x9fff) AM_ROM /* vector rom */ ADDRESS_MAP_END -static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x3fff) AM_WRITE(MWA8_ROM) /* Omega Race tries to write there! */ - AM_RANGE(0x4000, 0x4bff) AM_WRITE(MWA8_RAM) - AM_RANGE(0x5c00, 0x5cff) AM_WRITE(MWA8_RAM) AM_BASE(&generic_nvram) AM_SIZE(&generic_nvram_size) /* NVRAM */ - AM_RANGE(0x8000, 0x8fff) AM_WRITE(MWA8_RAM) AM_BASE(&vectorram) AM_SIZE(&vectorram_size) AM_REGION(REGION_CPU1, 0x8000) /* vector ram */ - AM_RANGE(0x9000, 0x9fff) AM_WRITE(MWA8_ROM) /* vector rom */ -ADDRESS_MAP_END - - -static ADDRESS_MAP_START( readport, ADDRESS_SPACE_IO, 8 ) +static ADDRESS_MAP_START( port_map, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) AM_RANGE(0x08, 0x08) AM_READ(omegrace_vg_go_r) AM_RANGE(0x09, 0x09) AM_READ(watchdog_reset_r) + AM_RANGE(0x0a, 0x0a) AM_WRITE(avgdvg_reset_w) AM_RANGE(0x0b, 0x0b) AM_READ(omegrace_vg_status_r) /* vg_halt */ AM_RANGE(0x10, 0x10) AM_READ(input_port_0_r) /* DIP SW C4 */ AM_RANGE(0x17, 0x17) AM_READ(input_port_1_r) /* DIP SW C6 */ AM_RANGE(0x11, 0x11) AM_READ(input_port_2_r) /* Player 1 input */ AM_RANGE(0x12, 0x12) AM_READ(input_port_3_r) /* Player 2 input */ - AM_RANGE(0x15, 0x15) AM_READ(omegrace_spinner1_r) /* 1st controller */ - AM_RANGE(0x16, 0x16) AM_READ(input_port_5_r) /* 2nd controller (cocktail) */ -ADDRESS_MAP_END - - -static ADDRESS_MAP_START( writeport, ADDRESS_SPACE_IO, 8 ) - ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) - AM_RANGE(0x0a, 0x0a) AM_WRITE(avgdvg_reset_w) AM_RANGE(0x13, 0x13) AM_WRITE(omegrace_leds_w) /* coin counters, leds, flip screen */ AM_RANGE(0x14, 0x14) AM_WRITE(omegrace_soundlatch_w) /* Sound command */ + AM_RANGE(0x15, 0x15) AM_READ(omegrace_spinner1_r) /* 1st controller */ + AM_RANGE(0x16, 0x16) AM_READ(input_port_5_r) /* 2nd controller (cocktail) */ ADDRESS_MAP_END - /************************************* * * Sound CPU memory handlers * *************************************/ -static ADDRESS_MAP_START( sound_readmem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x07ff) AM_READ(MRA8_ROM) - AM_RANGE(0x1000, 0x13ff) AM_READ(MRA8_RAM) -ADDRESS_MAP_END - - -static ADDRESS_MAP_START( sound_writemem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x07ff) AM_WRITE(MWA8_ROM) - AM_RANGE(0x1000, 0x13ff) AM_WRITE(MWA8_RAM) +static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x07ff) AM_ROM + AM_RANGE(0x1000, 0x13ff) AM_RAM ADDRESS_MAP_END -static ADDRESS_MAP_START( sound_readport, ADDRESS_SPACE_IO, 8 ) +static ADDRESS_MAP_START( sound_port, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) - AM_RANGE(0x00, 0x00) AM_READ(soundlatch_r) -ADDRESS_MAP_END - - -static ADDRESS_MAP_START( sound_writeport, ADDRESS_SPACE_IO, 8 ) - ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) - AM_RANGE(0x00, 0x00) AM_WRITE(AY8910_control_port_0_w) + AM_RANGE(0x00, 0x00) AM_READWRITE(soundlatch_r, AY8910_control_port_0_w) AM_RANGE(0x01, 0x01) AM_WRITE(AY8910_write_port_0_w) AM_RANGE(0x02, 0x02) AM_WRITE(AY8910_control_port_1_w) AM_RANGE(0x03, 0x03) AM_WRITE(AY8910_write_port_1_w) @@ -503,14 +476,14 @@ static MACHINE_DRIVER_START( omegrace ) /* basic machine hardware */ MDRV_CPU_ADD(Z80, 3000000) - MDRV_CPU_PROGRAM_MAP(readmem,writemem) - MDRV_CPU_IO_MAP(readport,writeport) + MDRV_CPU_PROGRAM_MAP(main_map, 0) + MDRV_CPU_IO_MAP(port_map, 0) MDRV_CPU_PERIODIC_INT(irq0_line_hold,TIME_IN_HZ(250)) MDRV_CPU_ADD(Z80, 1500000) /* audio CPU */ - MDRV_CPU_PROGRAM_MAP(sound_readmem,sound_writemem) - MDRV_CPU_IO_MAP(sound_readport,sound_writeport) + MDRV_CPU_PROGRAM_MAP(sound_map, 0) + MDRV_CPU_IO_MAP(sound_port, 0) MDRV_CPU_PERIODIC_INT(nmi_line_pulse,TIME_IN_HZ(250)) MDRV_FRAMES_PER_SECOND(40) @@ -521,10 +494,9 @@ static MACHINE_DRIVER_START( omegrace ) /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_VECTOR | VIDEO_RGB_DIRECT) MDRV_SCREEN_SIZE(400, 300) - MDRV_VISIBLE_AREA(0, 1020, -10, 1010) + MDRV_VISIBLE_AREA(0, 1044, 0, 1024) MDRV_PALETTE_LENGTH(32768) - MDRV_PALETTE_INIT(avg_white) MDRV_VIDEO_START(dvg) MDRV_VIDEO_UPDATE(vector) @@ -557,6 +529,10 @@ ROM_START( omegrace ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for audio cpu */ ROM_LOAD( "sound.k5", 0x0000, 0x0800, CRC(7d426017) SHA1(370f0fb5608819de873c845f6010cbde75a9818e) ) + + /* DVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "01-34602.bin", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) ROM_END ROM_START( deltrace ) @@ -570,6 +546,10 @@ ROM_START( deltrace ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for audio cpu */ ROM_LOAD( "sound.k5", 0x0000, 0x0800, CRC(7d426017) SHA1(370f0fb5608819de873c845f6010cbde75a9818e) ) + + /* DVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "01-34602.bin", 0x0000, 0x0100, CRC(97953db8) SHA1(8cbded64d1dd35b18c4d5cece00f77e7b2cab2ad) ) ROM_END diff --git a/src/drivers/orbit.c b/src/drivers/orbit.c index 19210485a..f42605649 100644 --- a/src/drivers/orbit.c +++ b/src/drivers/orbit.c @@ -258,8 +258,8 @@ static const gfx_decode orbit_gfx_decode_info[] = static PALETTE_INIT( orbit ) { - palette_set_color(0, 0x00, 0x00, 0x00); - palette_set_color(1, 0xFF, 0xFF, 0xFF); + palette_set_color(machine, 0, 0x00, 0x00, 0x00); + palette_set_color(machine, 1, 0xFF, 0xFF, 0xFF); } diff --git a/src/drivers/pacman.c b/src/drivers/pacman.c index 18b1c72d9..f941db897 100644 --- a/src/drivers/pacman.c +++ b/src/drivers/pacman.c @@ -5041,7 +5041,7 @@ GAME( 19??, crush4, crush, crush4, crush4, 0, ROT90, "Kural TWT GAME( 1981, maketrax, crush, pacman, maketrax, maketrax, ROT270, "[Kural] (Williams license)", "Make Trax (set 1)", GAME_SUPPORTS_SAVE ) GAME( 1981, maketrxb, crush, pacman, maketrax, maketrax, ROT270, "[Kural] (Williams license)", "Make Trax (set 2)", GAME_SUPPORTS_SAVE ) GAME( 1981, korosuke, crush, pacman, korosuke, korosuke, ROT90, "Kural Electric", "Korosuke Roller", GAME_SUPPORTS_SAVE ) -GAME( 1981, mbrush, crush, pacman, mbrush, 0, ROT90, "bootleg", "Magic Brush", GAME_SUPPORTS_SAVE ) +GAME( 1981, mbrush, crush, pacman, mbrush, maketrax, ROT90, "bootleg", "Magic Brush", GAME_SUPPORTS_SAVE ) GAME( 1981, paintrlr, crush, pacman, paintrlr, 0, ROT90, "bootleg", "Paint Roller", GAME_SUPPORTS_SAVE ) 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 ) diff --git a/src/drivers/panicr.c b/src/drivers/panicr.c index cd9582adf..0563ff0d2 100644 --- a/src/drivers/panicr.c +++ b/src/drivers/panicr.c @@ -68,7 +68,7 @@ PALETTE_INIT( panicr ) int i; - palette_init_RRRR_GGGG_BBBB(colortable, color_prom); + palette_init_RRRR_GGGG_BBBB(machine, colortable, color_prom); color_prom += 256*3; // txt lookup table @@ -181,7 +181,7 @@ VIDEO_UPDATE( panicr) mainram[0x4a2]++; } - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); tilemap_mark_all_tiles_dirty( txttilemap ); tilemap_set_scrollx( bgtilemap,0, ((scrollram[0x02]&0x0f)<<12)+((scrollram[0x02]&0xf0)<<4)+((scrollram[0x04]&0x7f)<<1)+((scrollram[0x04]&0x80)>>7) ); tilemap_draw(bitmap,cliprect,bgtilemap,0,0); diff --git a/src/drivers/paradise.c b/src/drivers/paradise.c index 235042eb9..aa143ca3e 100644 --- a/src/drivers/paradise.c +++ b/src/drivers/paradise.c @@ -15,7 +15,7 @@ Year + Game Board# 94+ Paradise YS-1600 94+ Paradise Deluxe YS-1604 95 Target Ball YS-2002 -96 Torus ? +96 Torus YS-0402? Looks identical 98 Mad Ball YS-0402 --------------------------------------------------------------------------- @@ -27,44 +27,6 @@ paradise: I'm not sure it's working correctly: - The chance to play a bonus game is very slim. I think I got to play a couple in total. Is there a way to trigger them !? -Target Ball -Yunsung, 1995 - -PCB Layout ----------- - -YS-2002 YUNSUNG -|---------------------------------------------------------| -| M6295 M6295 Z80 4MHz YUNSUNG.110 | -| YUNSUNG.113 YUNSUNG.128 YUNSUNG.111 | -| YUNSUNG.85 6264 | -| YUNSUNG.92 | -| YUNSUNG.93 | -| | -| 6116 | -| 6116 6116 | -|J 6116 | -|A | -|M 6116 | -|M 6116 | -|A |-------| | -| | ACTEL | | -| |A1020B | | -|DSW1(8) |PLCC84 | | -| 12MHz |-------| | -| 4464 | -| 4464 YUNSUNG.114 | -| 4464 YUNSUNG.115 | -|DSW2(8) 4464 | -| | -|---------------------------------------------------------| -Notes: - Z80 clock: 6.000MHz - 6295 clock: 1.000MHz (both), sample rate = 1000000/132 (both) - VSync: 54Hz - - note even with these settings game runs slightly faster in Mame than real PCB - ***************************************************************************/ #include "driver.h" @@ -749,6 +711,50 @@ ROM_START( paradlx ) ROM_LOAD( "9.u113", 0x00000, 0x80000, CRC(9c5337f0) SHA1(4d7a8069be4551aad9d7d32d835dcf91be079359) ) ROM_END +/*************************************************************************** + + Target Ball + +Yunsung, 1995 + +PCB Layout +---------- + +YS-2002 YUNSUNG +|---------------------------------------------------------| +| M6295 M6295 Z80 4MHz YUNSUNG.110 | +| YUNSUNG.113 YUNSUNG.128 YUNSUNG.111 | +| YUNSUNG.85 6264 | +| YUNSUNG.92 | +| YUNSUNG.93 | +| | +| 6116 | +| 6116 6116 | +|J 6116 | +|A | +|M 6116 | +|M 6116 | +|A |-------| | +| | ACTEL | | +| |A1020B | | +|DSW1(8) |PLCC84 | | +| 12MHz |-------| | +| 4464 | +| 4464 YUNSUNG.114 | +| 4464 YUNSUNG.115 | +|DSW2(8) 4464 | +| | +|---------------------------------------------------------| +Notes: + Z80 clock: 6.000MHz + 6295 clock: 1.000MHz (both), sample rate = 1000000/132 (both) + VSync: 54Hz + + note even with these settings game runs slightly faster in Mame than real PCB + + +***************************************************************************/ + ROM_START( tgtball ) ROM_REGION( 0x44000, REGION_CPU1, 0 ) /* Z80 Code */ ROM_LOAD( "rom7.bin", 0x00000, 0x0c000, CRC(8dbeab12) SHA1(7181c23459990aecbe2d13377aaf19f65108eac6) ) @@ -803,7 +809,7 @@ ROM_START( tgtballa ) ROM_LOAD( "yunsung.113", 0x00000, 0x40000, CRC(150a6cc6) SHA1(b435fcf8ba48006f506db6b63ba54a30a6b3eade) ) ROM_END -ROM_START( torus ) +ROM_START( torus ) /* Board looks identical to the YS-0402 but has no number printed on the PCB */ ROM_REGION( 0x14000, REGION_CPU1, 0 ) /* Z80 Code */ ROM_LOAD( "bc13.bin", 0x00000, 0xc000, CRC(55d3ef3e) SHA1(195463271fdb3f9f5c19068efd1c99105f761fe9) ) ROM_CONTINUE( 0x10000, 0x4000 ) @@ -835,7 +841,7 @@ PCB: YS-0402 Z80A AD-65 (OKI M6295) -Actel A1020B PLC84C +Actel A1020B PLC84C (or compatible QuickLogic QL12X16B-XPL84C) OSC: 12.000 MHz, 4.000Mhz RAM 4 Hyundai HY62256ALP-70 @@ -857,7 +863,7 @@ All roms read with manufacturer's IDs and routines */ -ROM_START( madball ) +ROM_START( madball ) /* Models in swimsuits only, no nudity */ ROM_REGION( 0x24000, REGION_CPU1, 0 ) /* Z80 Code */ ROM_LOAD( "p.u1", 0x00000, 0xc000, CRC(73008425) SHA1(6eded60fd5c637a63783247c858d999d5974d378) ) ROM_CONTINUE( 0x10000, 0x14000 ) @@ -881,6 +887,30 @@ ROM_START( madball ) ROM_LOAD( "s.u28", 0x00000, 0x80000, CRC(78f02584) SHA1(70542e126db73a573db9ef41399d3a07fb7ea94b) ) ROM_END +ROM_START( madballn ) /* Even numbered stages show topless models. Is nudity controlled by a dipswitch? */ + ROM_REGION( 0x24000, REGION_CPU1, 0 ) /* Z80 Code */ + ROM_LOAD( "bc13.u1", 0x00000, 0xc000, CRC(531fa919) SHA1(0eafc663b9ad50d0dfc5491fe96c9bcf30483991) ) + ROM_CONTINUE( 0x10000, 0x14000 ) + + ROM_REGION( 0x80000, REGION_GFX1, ROMREGION_DISPOSE | ROMREGION_INVERT) /* 16x16x8 Sprites */ + ROM_LOAD( "2.u67", 0x00000, 0x40000, CRC(1f3a6cd5) SHA1(7a17549f2fff003605d91703c84a398488b2f74c) ) + ROM_LOAD( "1.u66", 0x40000, 0x40000, CRC(8637c7b4) SHA1(e0026e48f0e8f3554a5b448e0d1f9d1c5551dbfb) ) + + ROM_REGION( 0x20000, REGION_GFX2, ROMREGION_DISPOSE | ROMREGION_ERASEFF) /* 8x8x4 Background */ + /* not for this game */ + + ROM_REGION( 0x100000, REGION_GFX3, ROMREGION_DISPOSE | ROMREGION_INVERT) /* 8x8x8 Foreground */ + ROM_LOAD( "bc2.u105", 0x00000, 0x80000, CRC(d75faa62) SHA1(95badf932e8a8084e67aa7df8d6cb2cb2917d5fc) ) + ROM_LOAD( "bc1.u106", 0x80000, 0x80000, CRC(04b8f7a5) SHA1(97555880f200d0ecc521f8c76bcaa4a0f0eb1aa9) ) + + ROM_REGION( 0x100000, REGION_GFX4, ROMREGION_DISPOSE | ROMREGION_INVERT) /* 8x8x8 Midground */ + ROM_LOAD( "bc3.u93", 0x80000, 0x80000, CRC(f07a5fe6) SHA1(0b1117d8ff0f2a6c953ab1988065b75a33e2c949) ) + ROM_LOAD( "bc4.u92", 0x00000, 0x80000, CRC(7ed233ab) SHA1(8a4bc31741b4e6e1c03974f9b00f747a29c78ebf) ) + + ROM_REGION( 0x80000, REGION_SOUND1, 0 ) /* Samples */ + ROM_LOAD( "s.u28", 0x00000, 0x80000, CRC(78f02584) SHA1(70542e126db73a573db9ef41399d3a07fb7ea94b) ) +ROM_END + DRIVER_INIT (paradise) { paradise_sprite_inc = 0x20; @@ -912,3 +942,4 @@ GAME( 1995, tgtball, 0, tgtball, tgtball, tgtball, ROT0, "Yun Sung", GAME( 1995, tgtballa, tgtball, tgtball, tgtball, tgtball, ROT0, "Yun Sung", "Target Ball", 0 ) GAME( 1996, torus, 0, torus, torus, torus, ROT90, "Yun Sung", "Torus", 0 ) GAME( 1998, madball, 0, madball, madball, tgtball, ROT0, "Yun Sung", "Mad Ball V2.0", 0 ) +GAME( 1997, madballn, madball, madball, madball, tgtball, ROT0, "Yun Sung", "Mad Ball V2.0 (With Nudity)", 0 ) diff --git a/src/drivers/pasha2.c b/src/drivers/pasha2.c index 3ea6a5e81..5d4f8f25c 100644 --- a/src/drivers/pasha2.c +++ b/src/drivers/pasha2.c @@ -113,10 +113,10 @@ static WRITE16_HANDLER( pasha2_palette_w ) offset &= 0xff; color = (paletteram16[offset] >> 8) | (paletteram16[offset+0x100] & 0xff00); - palette_set_color(offset*2+0,pal5bit(color),pal5bit(color >> 5),pal5bit(color >> 10)); + palette_set_color(Machine,offset*2+0,pal5bit(color),pal5bit(color >> 5),pal5bit(color >> 10)); color = (paletteram16[offset] & 0xff) | ((paletteram16[offset+0x100] & 0xff) << 8); - palette_set_color(offset*2+1,pal5bit(color),pal5bit(color >> 5),pal5bit(color >> 10)); + palette_set_color(Machine,offset*2+1,pal5bit(color),pal5bit(color >> 5),pal5bit(color >> 10)); } static WRITE16_HANDLER( vbuffer_set_w ) diff --git a/src/drivers/pastelg.c b/src/drivers/pastelg.c index 332747e46..713cffc4d 100644 --- a/src/drivers/pastelg.c +++ b/src/drivers/pastelg.c @@ -48,7 +48,7 @@ static DRIVER_INIT( pastelg ) { nb1413m3_type = NB1413M3_PASTELG; - init_nb1413m3(); + init_nb1413m3(machine); } static READ8_HANDLER( pastelg_sndrom_r ) diff --git a/src/drivers/pcktgal.c b/src/drivers/pcktgal.c index 10b9063ad..d8e5493d5 100644 --- a/src/drivers/pcktgal.c +++ b/src/drivers/pcktgal.c @@ -287,25 +287,25 @@ MACHINE_DRIVER_END ROM_START( pcktgal ) ROM_REGION( 0x14000, REGION_CPU1, 0 ) /* 64k for code + 16k for banks */ - ROM_LOAD( "eb04.rom", 0x10000, 0x4000, CRC(8215d60d) SHA1(ac26dfce7e215be21f2a17f864c5e966b8b8322e) ) + ROM_LOAD( "eb04.j7", 0x10000, 0x4000, CRC(8215d60d) SHA1(ac26dfce7e215be21f2a17f864c5e966b8b8322e) ) ROM_CONTINUE( 0x04000, 0xc000) /* 4000-7fff is banked but code falls through from 7fff to 8000, so */ /* I have to load the bank directly at 4000. */ ROM_REGION( 0x18000, REGION_CPU2, 0 ) /* 96k for code + 96k for decrypted opcodes */ - ROM_LOAD( "eb03.rom", 0x10000, 0x8000, CRC(cb029b02) SHA1(fbb3da08ed05ae73fbeeb13e0e2ff735aaf83db8) ) + ROM_LOAD( "eb03.f2", 0x10000, 0x8000, CRC(cb029b02) SHA1(fbb3da08ed05ae73fbeeb13e0e2ff735aaf83db8) ) ROM_CONTINUE( 0x08000, 0x8000 ) ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "eb01.rom", 0x00000, 0x10000, CRC(63542c3d) SHA1(4f42af99a6d9d4766afe0bebe10d6a97811a0082) ) - ROM_LOAD( "eb02.rom", 0x10000, 0x10000, CRC(a9dcd339) SHA1(245824ab86cdfe4b842ce1be0af60f2ff4c6ae07) ) + ROM_LOAD( "eb01.d11", 0x00000, 0x10000, CRC(63542c3d) SHA1(4f42af99a6d9d4766afe0bebe10d6a97811a0082) ) + ROM_LOAD( "eb02.d12", 0x10000, 0x10000, CRC(a9dcd339) SHA1(245824ab86cdfe4b842ce1be0af60f2ff4c6ae07) ) ROM_REGION( 0x10000, REGION_GFX2, ROMREGION_DISPOSE ) - ROM_LOAD( "eb00.rom", 0x00000, 0x10000, CRC(6c1a14a8) SHA1(03201197304c5f1d854b8c4f4a5c78336b51f872) ) + ROM_LOAD( "eb00.a1", 0x00000, 0x10000, CRC(6c1a14a8) SHA1(03201197304c5f1d854b8c4f4a5c78336b51f872) ) ROM_REGION( 0x0400, REGION_PROMS, 0 ) - ROM_LOAD( "eb05.rom", 0x0000, 0x0200, CRC(3b6198cb) SHA1(d32b364cfce99637998ca83ad21783f80364dd65) ) /* 82s147.084 */ - ROM_LOAD( "eb06.rom", 0x0200, 0x0200, CRC(1fbd4b59) SHA1(84e20329003cf09b849b49e1d83edc330d49f404) ) /* 82s131.101 */ + ROM_LOAD( "eb05.k14", 0x0000, 0x0200, CRC(3b6198cb) SHA1(d32b364cfce99637998ca83ad21783f80364dd65) ) /* 82s147.084 */ + ROM_LOAD( "eb06.k15", 0x0200, 0x0200, CRC(1fbd4b59) SHA1(84e20329003cf09b849b49e1d83edc330d49f404) ) /* 82s131.101 */ ROM_END ROM_START( pcktgalb ) @@ -316,7 +316,7 @@ ROM_START( pcktgalb ) /* I have to load the bank directly at 4000. */ ROM_REGION( 0x18000, REGION_CPU2, 0 ) /* 96k for code + 96k for decrypted opcodes */ - ROM_LOAD( "eb03.rom", 0x10000, 0x8000, CRC(cb029b02) SHA1(fbb3da08ed05ae73fbeeb13e0e2ff735aaf83db8) ) + ROM_LOAD( "eb03.f2", 0x10000, 0x8000, CRC(cb029b02) SHA1(fbb3da08ed05ae73fbeeb13e0e2ff735aaf83db8) ) ROM_CONTINUE( 0x08000, 0x8000 ) ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_DISPOSE ) @@ -328,19 +328,19 @@ ROM_START( pcktgalb ) ROM_LOAD( "sexybill.004", 0x08000, 0x08000, CRC(33a67af6) SHA1(6d9c04658ed75b970821a5c8b1f60c3c08fdda0a) ) ROM_REGION( 0x0400, REGION_PROMS, 0 ) - ROM_LOAD( "eb05.rom", 0x0000, 0x0200, CRC(3b6198cb) SHA1(d32b364cfce99637998ca83ad21783f80364dd65) ) /* 82s147.084 */ - ROM_LOAD( "eb06.rom", 0x0200, 0x0200, CRC(1fbd4b59) SHA1(84e20329003cf09b849b49e1d83edc330d49f404) ) /* 82s131.101 */ + ROM_LOAD( "eb05.k14", 0x0000, 0x0200, CRC(3b6198cb) SHA1(d32b364cfce99637998ca83ad21783f80364dd65) ) /* 82s147.084 */ + ROM_LOAD( "eb06.k15", 0x0200, 0x0200, CRC(1fbd4b59) SHA1(84e20329003cf09b849b49e1d83edc330d49f404) ) /* 82s131.101 */ ROM_END ROM_START( pcktgal2 ) ROM_REGION( 0x14000, REGION_CPU1, 0 ) /* 64k for code + 16k for banks */ - ROM_LOAD( "eb04-2.rom", 0x10000, 0x4000, CRC(0c7f2905) SHA1(882dbc1888a0149486c1fac5568dc3d297c2dadd) ) + ROM_LOAD( "eb04-2.j7", 0x10000, 0x4000, CRC(0c7f2905) SHA1(882dbc1888a0149486c1fac5568dc3d297c2dadd) ) ROM_CONTINUE( 0x04000, 0xc000) /* 4000-7fff is banked but code falls through from 7fff to 8000, so */ /* I have to load the bank directly at 4000. */ ROM_REGION( 0x18000, REGION_CPU2, 0 ) /* audio cpu */ - ROM_LOAD( "eb03-2.rom", 0x10000, 0x8000, CRC(9408ffb4) SHA1(ddcb67da4acf3d986d54ad10404f213528a8bb62) ) + ROM_LOAD( "eb03-2.f2", 0x10000, 0x8000, CRC(9408ffb4) SHA1(ddcb67da4acf3d986d54ad10404f213528a8bb62) ) ROM_CONTINUE( 0x08000, 0x8000) ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_DISPOSE ) @@ -348,22 +348,45 @@ ROM_START( pcktgal2 ) ROM_LOAD( "eb02-2.rom", 0x10000, 0x10000, CRC(f30d965d) SHA1(a787457b33ad39e78fcf8da0715fab7a63869bf9) ) ROM_REGION( 0x10000, REGION_GFX2, ROMREGION_DISPOSE ) - ROM_LOAD( "eb00.rom", 0x00000, 0x10000, CRC(6c1a14a8) SHA1(03201197304c5f1d854b8c4f4a5c78336b51f872) ) + ROM_LOAD( "eb00.a1", 0x00000, 0x10000, CRC(6c1a14a8) SHA1(03201197304c5f1d854b8c4f4a5c78336b51f872) ) ROM_REGION( 0x0400, REGION_PROMS, 0 ) - ROM_LOAD( "eb05.rom", 0x0000, 0x0200, CRC(3b6198cb) SHA1(d32b364cfce99637998ca83ad21783f80364dd65) ) /* 82s147.084 */ - ROM_LOAD( "eb06.rom", 0x0200, 0x0200, CRC(1fbd4b59) SHA1(84e20329003cf09b849b49e1d83edc330d49f404) ) /* 82s131.101 */ + ROM_LOAD( "eb05.k14", 0x0000, 0x0200, CRC(3b6198cb) SHA1(d32b364cfce99637998ca83ad21783f80364dd65) ) /* 82s147.084 */ + ROM_LOAD( "eb06.k15", 0x0200, 0x0200, CRC(1fbd4b59) SHA1(84e20329003cf09b849b49e1d83edc330d49f404) ) /* 82s131.101 */ +ROM_END + +ROM_START( pcktgl2j ) + ROM_REGION( 0x14000, REGION_CPU1, 0 ) /* 64k for code + 16k for banks */ + ROM_LOAD( "eb04-2.j7", 0x10000, 0x4000, CRC(0c7f2905) SHA1(882dbc1888a0149486c1fac5568dc3d297c2dadd) ) + ROM_CONTINUE( 0x04000, 0xc000) + /* 4000-7fff is banked but code falls through from 7fff to 8000, so */ + /* I have to load the bank directly at 4000. */ + + ROM_REGION( 0x18000, REGION_CPU2, 0 ) /* audio cpu */ + ROM_LOAD( "eb03-2.f2", 0x10000, 0x8000, CRC(9408ffb4) SHA1(ddcb67da4acf3d986d54ad10404f213528a8bb62) ) + ROM_CONTINUE( 0x08000, 0x8000) + + ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "eb01-2.d11", 0x00000, 0x10000, CRC(8f42ab1a) SHA1(315fb26bbe004c08629a0a3a6e9d129768119e6b) ) + ROM_LOAD( "eb02-2.d12", 0x10000, 0x10000, CRC(f394cb35) SHA1(f351b8b6fd8a6637ef9031f7a410a334da8ea5ae) ) + + ROM_REGION( 0x10000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "eb00.a1", 0x00000, 0x10000, CRC(6c1a14a8) SHA1(03201197304c5f1d854b8c4f4a5c78336b51f872) ) + + ROM_REGION( 0x0400, REGION_PROMS, 0 ) + ROM_LOAD( "eb05.k14", 0x0000, 0x0200, CRC(3b6198cb) SHA1(d32b364cfce99637998ca83ad21783f80364dd65) ) /* 82s147.084 */ + ROM_LOAD( "eb06.k15", 0x0200, 0x0200, CRC(1fbd4b59) SHA1(84e20329003cf09b849b49e1d83edc330d49f404) ) /* 82s131.101 */ ROM_END ROM_START( spool3 ) ROM_REGION( 0x14000, REGION_CPU1, 0 ) /* 64k for code + 16k for banks */ - ROM_LOAD( "eb04-2.rom", 0x10000, 0x4000, CRC(0c7f2905) SHA1(882dbc1888a0149486c1fac5568dc3d297c2dadd) ) + ROM_LOAD( "eb04-2.j7", 0x10000, 0x4000, CRC(0c7f2905) SHA1(882dbc1888a0149486c1fac5568dc3d297c2dadd) ) ROM_CONTINUE( 0x04000, 0xc000) /* 4000-7fff is banked but code falls through from 7fff to 8000, so */ /* I have to load the bank directly at 4000. */ ROM_REGION( 0x18000, REGION_CPU2, 0 ) /* audio cpu */ - ROM_LOAD( "eb03-2.rom", 0x10000, 0x8000, CRC(9408ffb4) SHA1(ddcb67da4acf3d986d54ad10404f213528a8bb62) ) + ROM_LOAD( "eb03-2.f2", 0x10000, 0x8000, CRC(9408ffb4) SHA1(ddcb67da4acf3d986d54ad10404f213528a8bb62) ) ROM_CONTINUE( 0x08000, 0x8000) ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_DISPOSE ) @@ -371,11 +394,11 @@ ROM_START( spool3 ) ROM_LOAD( "deco3.bin", 0x10000, 0x10000, CRC(55ea7c45) SHA1(a8a6ff0c8a5aaee3afbfc3e71a171fb1d2360b45) ) ROM_REGION( 0x10000, REGION_GFX2, ROMREGION_DISPOSE ) - ROM_LOAD( "eb00.rom", 0x00000, 0x10000, CRC(6c1a14a8) SHA1(03201197304c5f1d854b8c4f4a5c78336b51f872) ) + ROM_LOAD( "eb00.a1", 0x00000, 0x10000, CRC(6c1a14a8) SHA1(03201197304c5f1d854b8c4f4a5c78336b51f872) ) ROM_REGION( 0x0400, REGION_PROMS, 0 ) - ROM_LOAD( "eb05.rom", 0x0000, 0x0200, CRC(3b6198cb) SHA1(d32b364cfce99637998ca83ad21783f80364dd65) ) /* 82s147.084 */ - ROM_LOAD( "eb06.rom", 0x0200, 0x0200, CRC(1fbd4b59) SHA1(84e20329003cf09b849b49e1d83edc330d49f404) ) /* 82s131.101 */ + ROM_LOAD( "eb05.k14", 0x0000, 0x0200, CRC(3b6198cb) SHA1(d32b364cfce99637998ca83ad21783f80364dd65) ) /* 82s147.084 */ + ROM_LOAD( "eb06.k15", 0x0200, 0x0200, CRC(1fbd4b59) SHA1(84e20329003cf09b849b49e1d83edc330d49f404) ) /* 82s131.101 */ ROM_END ROM_START( spool3i ) @@ -386,7 +409,7 @@ ROM_START( spool3i ) /* I have to load the bank directly at 4000. */ ROM_REGION( 0x18000, REGION_CPU2, 0 ) /* audio cpu */ - ROM_LOAD( "eb03-2.rom", 0x10000, 0x8000, CRC(9408ffb4) SHA1(ddcb67da4acf3d986d54ad10404f213528a8bb62) ) + ROM_LOAD( "eb03-2.f2", 0x10000, 0x8000, CRC(9408ffb4) SHA1(ddcb67da4acf3d986d54ad10404f213528a8bb62) ) ROM_CONTINUE( 0x08000, 0x8000) ROM_REGION( 0x20000, REGION_GFX1, ROMREGION_DISPOSE ) @@ -394,11 +417,11 @@ ROM_START( spool3i ) ROM_LOAD( "deco3.bin", 0x10000, 0x10000, CRC(55ea7c45) SHA1(a8a6ff0c8a5aaee3afbfc3e71a171fb1d2360b45) ) ROM_REGION( 0x10000, REGION_GFX2, ROMREGION_DISPOSE ) - ROM_LOAD( "eb00.rom", 0x00000, 0x10000, CRC(6c1a14a8) SHA1(03201197304c5f1d854b8c4f4a5c78336b51f872) ) + ROM_LOAD( "eb00.a1", 0x00000, 0x10000, CRC(6c1a14a8) SHA1(03201197304c5f1d854b8c4f4a5c78336b51f872) ) ROM_REGION( 0x0400, REGION_PROMS, 0 ) - ROM_LOAD( "eb05.rom", 0x0000, 0x0200, CRC(3b6198cb) SHA1(d32b364cfce99637998ca83ad21783f80364dd65) ) /* 82s147.084 */ - ROM_LOAD( "eb06.rom", 0x0200, 0x0200, CRC(1fbd4b59) SHA1(84e20329003cf09b849b49e1d83edc330d49f404) ) /* 82s131.101 */ + ROM_LOAD( "eb05.k14", 0x0000, 0x0200, CRC(3b6198cb) SHA1(d32b364cfce99637998ca83ad21783f80364dd65) ) /* 82s147.084 */ + ROM_LOAD( "eb06.k15", 0x0200, 0x0200, CRC(1fbd4b59) SHA1(84e20329003cf09b849b49e1d83edc330d49f404) ) /* 82s131.101 */ ROM_END /***************************************************************************/ @@ -441,14 +464,15 @@ static DRIVER_INIT( graphics ) static DRIVER_INIT( pcktgal ) { - init_deco222(); - init_graphics(); + init_deco222(machine); + init_graphics(machine); } /***************************************************************************/ GAME( 1987, pcktgal, 0, pcktgal, pcktgal, pcktgal, ROT0, "Data East Corporation", "Pocket Gal (Japan)", 0 ) GAME( 1987, pcktgalb, pcktgal, bootleg, pcktgal, deco222, ROT0, "bootleg", "Pocket Gal (bootleg)", 0 ) -GAME( 1989, pcktgal2, pcktgal, pcktgal, pcktgal, graphics, ROT0, "Data East Corporation", "Pocket Gal 2 (World?)", 0 ) -GAME( 1989, spool3, pcktgal, pcktgal, pcktgal, graphics, ROT0, "Data East Corporation", "Super Pool III (World?)", 0 ) +GAME( 1989, pcktgal2, pcktgal, pcktgal, pcktgal, graphics, ROT0, "Data East Corporation", "Pocket Gal 2 (English)", 0 ) +GAME( 1989, pcktgl2j, pcktgal, pcktgal, pcktgal, graphics, ROT0, "Data East Corporation", "Pocket Gal 2 (Japanese)", 0 ) +GAME( 1989, spool3, pcktgal, pcktgal, pcktgal, graphics, ROT0, "Data East Corporation", "Super Pool III (English)", 0 ) GAME( 1990, spool3i, pcktgal, pcktgal, pcktgal, graphics, ROT0, "Data East Corporation (I-Vics license)", "Super Pool III (I-Vics)", 0 ) diff --git a/src/drivers/pgm.c b/src/drivers/pgm.c index e5ec26e3d..1a423de3c 100644 --- a/src/drivers/pgm.c +++ b/src/drivers/pgm.c @@ -1950,7 +1950,7 @@ static MACHINE_RESET( killbld ) { int i; - machine_reset_pgm(); + machine_reset_pgm(machine); /* fill the protection ram with a5 */ for (i = 0;i < 0x4000/2;i++) @@ -2091,7 +2091,7 @@ static MACHINE_RESET( olds ) // UINT16 *mem16_a = (UINT16 *)memory_region(REGION_CPU1); int i; - machine_reset_pgm(); + machine_reset_pgm(machine); /* populate shared protection ram with data read from pcb .. */ diff --git a/src/drivers/pipeline.c b/src/drivers/pipeline.c index f3815e5a2..fbe9646d6 100644 --- a/src/drivers/pipeline.c +++ b/src/drivers/pipeline.c @@ -192,7 +192,7 @@ static WRITE8_HANDLER(vram2_w) if(offset<0x300) { offset&=0xff; - palette_set_color(offset, palram[offset]<<2, palram[offset+0x100]<<2, palram[offset+0x200]<<2); + palette_set_color(Machine, offset, pal6bit(palram[offset]), pal6bit(palram[offset+0x100]), pal6bit(palram[offset+0x200])); } } } @@ -349,7 +349,7 @@ static PALETTE_INIT(pipeline) r*=36; g*=36; b*=85; - palette_set_color(0x100+i, r, g, b); + palette_set_color(machine, 0x100+i, r, g, b); } } diff --git a/src/drivers/pktgaldx.c b/src/drivers/pktgaldx.c index af376a86b..d8952d09e 100644 --- a/src/drivers/pktgaldx.c +++ b/src/drivers/pktgaldx.c @@ -124,7 +124,7 @@ WRITE16_HANDLER( paletteram16_xRGB_w ) g = ((paldat & 0x0000ff00) >>8); b = ((paldat & 0x00ff0000) >>16); - palette_set_color(pen,r,g,b); + palette_set_color(Machine,pen,r,g,b); } READ16_HANDLER( pckgaldx_protection_r ) diff --git a/src/drivers/playch10.c b/src/drivers/playch10.c index 246fe0417..6d12d80d5 100644 --- a/src/drivers/playch10.c +++ b/src/drivers/playch10.c @@ -291,7 +291,7 @@ Notes & Todo: ***************************************************************************/ #include "driver.h" -#include "vidhrdw/ppu2c03b.h" +#include "vidhrdw/ppu2c0x.h" #include "cpu/z80/z80.h" #include "machine/rp5h01.h" #include "sound/dac.h" @@ -379,7 +379,7 @@ static WRITE8_HANDLER( ram_8w_w ) static WRITE8_HANDLER( sprite_dma_w ) { int source = ( data & 7 ); - ppu2c03b_spriteram_dma(source ); + ppu2c0x_spriteram_dma( 0, source ); } static NVRAM_HANDLER( playch10 ) @@ -453,7 +453,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( cart_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_RAM AM_MIRROR(0x1800) AM_BASE(&work_ram) - AM_RANGE(0x2000, 0x3fff) AM_READWRITE(ppu2c03b_0_r, ppu2c03b_0_w) + AM_RANGE(0x2000, 0x3fff) AM_READWRITE(ppu2c0x_0_r, ppu2c0x_0_w) AM_RANGE(0x4011, 0x4011) AM_WRITE(DAC_0_data_w) AM_RANGE(0x4000, 0x4013) AM_READWRITE(NESPSG_0_r, NESPSG_0_w) AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_w) @@ -747,7 +747,7 @@ static MACHINE_DRIVER_START( playch10 ) // video hardware MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_GFXDECODE(gfxdecodeinfo) - MDRV_PALETTE_LENGTH(256+4*16) + MDRV_PALETTE_LENGTH(256+8*4*16) MDRV_COLORTABLE_LENGTH(256+4*8) MDRV_DEFAULT_LAYOUT(layout_dualhuov) diff --git a/src/drivers/pmpoker.c b/src/drivers/pmpoker.c new file mode 100644 index 000000000..9db6ffc5c --- /dev/null +++ b/src/drivers/pmpoker.c @@ -0,0 +1,977 @@ +/****************************************************************************** + + PLAYMAN POKER + ------------- + + Driver by Roberto Fresca. + + + Games running on this hardware: + + * PlayMan Poker (Germany). + * Golden Poker Double Up. 198?, Bonanza Enterprises, Ltd. + * Joker Poker. 1981, Coinmaster-Gaming, Ltd + * Jack Potten's Poker. 1981, (unknown) + + +******************************************************************************* + + + I think "Diamond Poker Double Up" from Bonanza Enterprises should run on this hardware too. + http://www.arcadeflyers.com/?page=thumbs&id=4539 + + Big-Boy and Mini-Boy are different sized cabinets for Bonanza Enterprises games. + http://www.arcadeflyers.com/?page=thumbs&id=4616 + http://www.arcadeflyers.com/?page=thumbs&id=4274 + + + Preliminary Notes (pmpoker): + + - This set was found as "unknown playman-poker". + - The ROMs didn't match any currently supported set (0.108u2 romident switch). + - All this driver was made using reverse engineering in the program roms. + + + Game Notes (goldnpkr): + + - Key 9 for Meters/Stats. To reset meters push CANCEL + SMALL buttons. HOLD5 to exit. + This is a timed function and after 30-40 seconds switch back to the game. + In goldnpkr you can switch between Permanent/Interim Meters. + In pmpoker you can see only Permanent Meters. + + - Service (F2) for settings. + This is a timed function and after 30-40 seconds switch back to the game. + Press DOUBLE UP to change Double Up 7 settings between 'Even' and 'Lose'. + Press BET to adjust the maximum bet (20-200). + Press HOLD4 for Meter Over (5000-50000). + Press BIG to change Double Up settings (Normal-Hard). + Press TAKE SCORE to set Half Gamble (Yes/No). + Press SMALL to set win sound (Yes/No). + Press HOLD1 to set coinage 1. + Press HOLD2 to set coinage 2. + Press HOLD3 to set coinage 3. + Press HOLD5 to exit. + + + Buttons/Inputs: goldnpkr pmpoker jokerpkr pottnpkr + + - HOLD (5 buttons) mapped mapped mapped mapped + - CANCEL mapped mapped mapped mapped + - BIG mapped mapped --- --- + - SMALL mapped mapped --- --- + - DOUBLE UP mapped mapped --- --- + - TAKE SCORE mapped mapped mapped mapped + - DEAL/DRAW mapped mapped mapped mapped + - BET mapped mapped mapped mapped + + - Coin 1 (coins) mapped mapped mapped mapped + - Coin 2 (notes) coin1 coin1 coin1 coin1 + - Coin 3 (coupons) coin1 n/a n/a n/a + - Payout mapped mapped mapped mapped + + - SETTINGS mapped n/a mapped mapped + - METERS mapped mapped mapped mapped + + Inputs are different for some games. In goldnpkr, each button has only one function. + In pmpoker, some buttons have different functions. + + + "How to play"... (from "Golden Poker Double Up" instruction card): + + 1st GAME + - Insert coin / bank note. + - Push BET button, 1-10 credits multiple play. + - Push DEAL/DRAW button. + - Push HOLD buttons to hold cards you need. + - Cards held can be cancelled by pushing CANCEL button. + - Push DEAL/DRAW button to draw cards. + + 2nd GAME - Double Up game + - When you win, choose TAKE SCORE or DOUBLE UP game. + - Bet winnings on + "BIG (8 or more number)" or + "SMALL (6 and less number)" of next one card dealt. + - Over 5,000 winnings will be storaged automatically. + + + + Hardware Notes (pmpoker): + + - CPU: 1x M6502. + - Video: 1x MC6845. + - RAM: 4x uPD2114LC + - I/O 2x 6821 PIAs. + - prg ROMs: 3x 2732 (32Kb) or similar. + - gfx ROMs: 4x 2716 (16Kb) or similar. + - sound: DAC?? + - battery backup: 2x S8423 + + + PCB Layout (pmpoker): (XX) = unreadable. + _______________________________________________________________________________ + | _________ | + | | | -- DIP SW x8 -- | + | | Battery | _________ _______________ _________ _________ ________ | + | | 055 | | 74LS32 | |1|2|3|4|5|6|7|8| | HCF4011 || HCF4096 | | LM339N | | + | |_________| |_________| |_|_|_|_|_|_|_|_| |_________||_________| |________| | + | _________ _________ _________ _________ | + | | 74LS138 | | S-8423 | | 74LS08N | | 74LS(XX)| | + | |_________| |_________| |_________| |_________| | + | _______________ _________ ____________________ ____| + | | | | S-8423 | | | | + | | 2732 | |_________| | 6502P | | + | |_______________| _________ |____________________| | + | _______________ | 7432 | ____________________ |____ + | | | |_________| | | ____| + | | 2732 | _________ | 6821P | ____| + | |_______________| | 74LS157 | |____________________| ____| + | _______________ |_________| ____________________ ____| + | | | _________ | | ____| + | | 2732 | | 74LS157 | | 6821P | ____| + | |_______________| |_________| |____________________| ____| + | _______________ _________ ____________________ ____| + | | | | 74LS157 | | | ____| + | | 2732 | |_________| | 6845SP | ____| + | |_______________| _________ |____________________| ____| + | | 2114-LC | ____| 28x2 + | |_________| ____| connector + | _________ _________ ____| + | | 74LS245 | | 2114-LC | ____| + | |_________| |_________| ____| + | _________ _________ _________ ____| + | | 74LS245 | | 2114-LC | | 74LS174 | ____| + | |_________| |_________| |_________| ____| + | ________________ _________ _________ _________ ____| + | | | | 2114-LC | | 74LS08H | | TI (XX) | <-- socketed. ____| + | | 2716 | |_________| |_________| |_________| PROM? ____| + | |________________| _________ _________ ____| + | ________________ | 74LS04P | | 74LS174 | ____| + | | | |_________| |_________| ____| + | | 2716 | _________ _________ ____| + | |________________| | 74166P | | 74LS86C | ____| + | ________________ |_________| |_________| ____| + | | | _________ _______ | + | | 2716 | | 74166P | | 555TC | | + | |________________| |_________| |_______| | + | ________________ |____ + | | | ____| + | | 2716 | _________ _________ ________ ____| 5x2 + | |________________| | 74166P | | 7407N | | LM380N | ____| connector + | |_________| |_________| |________| ____| + | ________ ______ _________ _________ ___ ____| + | | 74LS04 || osc. | | 74LS193 | | 7407N | / \ | + | |________||10 MHz| |_________| |_________| | POT | | + | |______| \___/ | + |__________________________________________________________________________| + + + + Some odds: + + - There are pieces of code like the following sub: + + 78DE: 18 clc + 78DF: 69 07 adc #$07 + 78E1: 9D 20 10 sta $1020,x + 78E4: A9 00 lda #$00 + 78E6: 9D 20 18 sta $1820,x + 78E9: E8 inx + + 78EA: 82 DOP ; use of DOP (double NOP) + 78EB: A2 0A dummy (ldx #$0A) + + 78ED: AD 82 08 lda $0882 + + 78F0: 82 DOP ; use of DOP (double NOP) + 78F1: 48 08 dummy + 78F3: D0 F6 bne $78EB ; branch to the 1st DOP dummy arguments (now ldx #$0A). + 78F5: CA dex + 78F6: D0 F8 bne $78F0 + 78F8: 29 10 and #$10 + 78FA: 60 rts + + Offset $78EA and $78F0 contains an undocumented 6502 opcode (0x82). + + At beginning, I thought that the main processor was a 65sc816, since 0x82 is a documented opcode (BRL) for this CPU. + Even the vector $FFF8 contain 0x09 (used to indicate "Emulation Mode" for the 65sc816). + I dropped the idea following the code. Impossible to use BRL (branch relative long) in this structure. + + Some 6502 sources list the 0x82 mnemonic as DOP (double NOP), with 2 dummy bytes as argument. + The above routine dynamically change the X register value using the DOP undocumented opcode. + Now all have sense. + + + -------------------- + *** Memory Map *** + -------------------- + + $0000 - $00FF RAM ; zero page (pointers and registers) + + ; $45 - $47 Coin settings. + ; $50 - Input Port. + ; $5C - Input Port. + ; $5D - Input Port. + ; $5E - Input Port. + ; $5F - Input Port. + + $0100 - $01FF RAM ; 6502 Stack Pointer. + + $0200 - $02FF RAM ; R/W. (settings) + $0300 - $03FF RAM ; R/W (mainly to $0383). still not totally understood. $0340 - $035f (settings). + + $0800 - $0801 MC6845 ; mc6845 use $0800 for register addressing and $0801 for register values. + + *** pmpoker mc6845 init at $65B9 *** + register: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 + value: 0x27 0x20 0x22 0x02 0x1F 0x04 0x1D 0x1E 0x00 0x07 0x00 0x00 0x00 0x00 #$00 #$00 #$00 #$00. + + *** goldnpkr mc6845 init at $5E75 *** + register: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 + value: 0x27 0x20 0x23 0x03 0x1F 0x04 0x1D 0x1F 0x00 0x07 0x00 0x00 0x00 0x00 #$00 #$00 #$00 #$00. + + $0844 - $0847 PIA1 ; writes: 0xFF 0x04 0xFF 0x04. initialized at $5000. + $0848 - $084b PIA2 ; writes: 0xFF 0x04 0xFF 0x04. initialized at $5000. + + $1000 - $13FF Video RAM ; initialized in subroutine starting at $5042. + $1800 - $1BFF Color RAM ; initialized in subroutine starting at $5042. + + $5000 - $7FFF ROM + $F000 - $FFFF ROM ; mirrored from $7000 - $7FFF for vectors/pointers purposes. + + + ------------------------------------------------------------------------- + + + Driver updates: + + + [2006-09-02] + - Initial release. + + + [2006-09-06] + + - Understood the GFX banks: + - 1 bank (1bpp) for text layer and minor graphics. + - 1 bank (3bpp) for the undumped cards deck graphics. + + - Partially added inputs through 6821 PIAs. + ("Bitte techniker rufen" error messages. Press 'W' to reset the machine) + + - Confirmed the CPU as 6502. (was in doubt due to use of illegal opcodes) + + + [2006-09-15] + + - Confirmed the GFX banks (a complete dump appeared!). + - Improved technical notes and added a PCB layout based on PCB picture. + - Found and fixed the 3rd bitplane of BigBoy gfx. + - Renamed Big-Boy to Golden Poker Double Up. (Big-Boy and Mini-Boy are names of cabinet models). + - Added 'Joker Poker' (Golden Poker version without the 'double-up' feature). + - Added 'Jack Potten's Poker' (same as Joker Poker, but with 'Aces or better' instead of jacks). + - Simulated colors for all sets till color PROMs appear. + - Fixed bit corruption in goldnpkr rom u40_4a.bin. + - Completed inputs in all sets (except DIP switches). + - Removed flags GAME_WRONG_COLORS and GAME_IMPERFECT_GRAPHICS in all sets. + - Removed flag GAME_NOT_WORKING. All sets are now playable. :) + + + TODO: + + - Check interrupts (some buttons are very sensitive) + - Check and complete connections for both PIAs. + - Battery backed RAM. + - Figure out the sound. + - Cleanup and split the driver. + + +*******************************************************************************/ + + +#include "driver.h" +#include "vidhrdw/generic.h" +#include "vidhrdw/crtc6845.h" +#include "machine/6821pia.h" + + +/************************* +* Video Hardware * +*************************/ + +static tilemap *bg_tilemap; + +WRITE8_HANDLER( pmpoker_videoram_w ) +{ + if (videoram[offset] != data) + { + videoram[offset] = data; + tilemap_mark_tile_dirty(bg_tilemap, offset); + } +} + +WRITE8_HANDLER( pmpoker_colorram_w ) +{ + if (colorram[offset] != data) + { + colorram[offset] = data; + tilemap_mark_tile_dirty(bg_tilemap, offset); + } +} + +static void get_bg_tile_info(int tile_index) +{ +// - bits - +// 7654 3210 +// --xx xx-- tiles color. +// ---- --x- tiles bank. +// xx-- ---x seems unused. + + int attr = colorram[tile_index]; + int code = videoram[tile_index]; + int bank = (attr & 0x02) >> 1; // bit 1 switch the gfx banks. + int color = (attr & 0x3c) >> 2; // bits 2-3-4-5 for color. + + SET_TILE_INFO(bank, code, color, 0) +} + +VIDEO_START( pmpoker ) +{ + bg_tilemap = tilemap_create(get_bg_tile_info, tilemap_scan_rows, + TILEMAP_OPAQUE, 8, 8, 32, 29); + + if ( !bg_tilemap ) + return 1; + + return 0; +} + +VIDEO_UPDATE( pmpoker ) +{ + tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); + return 0; +} + +unsigned char pmpoker_palette[] = +{ + /* attempt to get bank1 colors */ + + 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, + + /* attempt to get bank2 colors */ + + 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, 0xff, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00 +}; + +static PALETTE_INIT( pmpoker ) +{ + palette_set_colors(machine, 0, pmpoker_palette, 64); +} + + +/************************* +* Memory map information * +*************************/ + +static ADDRESS_MAP_START( pmpoker_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x004f) AM_RAM // zero page (pointers and registers). + + AM_RANGE(0x0050, 0x0050) AM_READ(input_port_1_r) // while understand if passing through PIAs. + AM_RANGE(0x005c, 0x005c) AM_READ(input_port_2_r) // while understand if passing through PIAs. + AM_RANGE(0x005d, 0x005d) AM_READ(input_port_3_r) // while understand if passing through PIAs. + AM_RANGE(0x005e, 0x005e) AM_READ(input_port_4_r) // while understand if passing through PIAs. + AM_RANGE(0x005f, 0x005f) AM_READ(input_port_5_r) // while understand if passing through PIAs. + + AM_RANGE(0x0060, 0x00ff) AM_RAM + AM_RANGE(0x0100, 0x01ff) AM_RAM // stack pointer. + AM_RANGE(0x0200, 0x07ff) AM_RAM + + AM_RANGE(0x0800, 0x0800) AM_WRITE(crtc6845_address_w) // crtc6845 register addressing. + AM_RANGE(0x0801, 0x0801) AM_READWRITE(crtc6845_register_r, crtc6845_register_w) // crtc6845 register values. + + AM_RANGE(0x0844, 0x0847) AM_READWRITE(pia_0_r, pia_0_w) + AM_RANGE(0x0848, 0x084b) AM_READWRITE(pia_1_r, pia_1_w) + + AM_RANGE(0x1000, 0x13ff) AM_RAM AM_WRITE(pmpoker_videoram_w) AM_BASE(&videoram) + AM_RANGE(0x1800, 0x1bff) AM_RAM AM_WRITE(pmpoker_colorram_w) AM_BASE(&colorram) + AM_RANGE(0x4000, 0x7fff) AM_ROM + AM_RANGE(0xf000, 0xffff) AM_ROM +ADDRESS_MAP_END + +static ADDRESS_MAP_START( jokerpkr_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x004f) AM_RAM // zero page (pointers and registers). + + AM_RANGE(0x0050, 0x0050) AM_READ(input_port_1_r) // while understand if passing through PIAs. + AM_RANGE(0x005c, 0x005c) AM_READ(input_port_2_r) // while understand if passing through PIAs. + AM_RANGE(0x005d, 0x005d) AM_READ(input_port_3_r) // while understand if passing through PIAs. + AM_RANGE(0x005e, 0x005e) AM_READ(input_port_4_r) // while understand if passing through PIAs. + AM_RANGE(0x005f, 0x005f) AM_READ(input_port_5_r) // while understand if passing through PIAs. + + AM_RANGE(0x0060, 0x00ff) AM_RAM + AM_RANGE(0x0100, 0x01ff) AM_RAM // stack pointer. + AM_RANGE(0x0200, 0x07ff) AM_RAM + + AM_RANGE(0x0800, 0x0800) AM_WRITE(crtc6845_address_w) // crtc6845 register addressing. + AM_RANGE(0x0801, 0x0801) AM_READWRITE(crtc6845_register_r, crtc6845_register_w) // crtc6845 register values. + + AM_RANGE(0x0844, 0x0847) AM_READWRITE(pia_0_r, pia_0_w) + AM_RANGE(0x0848, 0x084b) AM_READWRITE(pia_1_r, pia_1_w) + + AM_RANGE(0x1000, 0x13ff) AM_RAM AM_WRITE(pmpoker_videoram_w) AM_BASE(&videoram) + AM_RANGE(0x1800, 0x1bff) AM_RAM AM_WRITE(pmpoker_colorram_w) AM_BASE(&colorram) + AM_RANGE(0x2000, 0x3fff) AM_ROM + AM_RANGE(0xf000, 0xffff) AM_ROM +ADDRESS_MAP_END + + +/************************* +* Input ports * +*************************/ + +INPUT_PORTS_START( pmpoker ) + + PORT_START_TAG("IN0") // PIA1 - timing issues + 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_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + +// PORT_START_TAG("IN0") // PIA1 - timing issues +// PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 0") PORT_CODE(KEYCODE_Q) +// PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 1") PORT_CODE(KEYCODE_W) +// PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 2") PORT_CODE(KEYCODE_E) +// PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 3") PORT_CODE(KEYCODE_R) +// PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 4") PORT_CODE(KEYCODE_T) +// PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 5") PORT_CODE(KEYCODE_Y) +// PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 6") PORT_CODE(KEYCODE_U) +// PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 7") PORT_CODE(KEYCODE_I) + + PORT_START_TAG("IN1") // $50 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // should be coin1 (coin) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + 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_TAG("IN2") // $5c + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Meters/Stats")// GP: Permanent/Interim Meters (timed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Deal/Draw") PORT_CODE(KEYCODE_A) + 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_TAG("IN3") // $5d + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Payout") PORT_CODE(KEYCODE_S) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + 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_TAG("IN4") // $5e + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Hold1 / Take Score (Kasse)") PORT_CODE(KEYCODE_Z) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Hold2 / Small (Tief)") PORT_CODE(KEYCODE_X) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Hold3 / Bet (Setze)") PORT_CODE(KEYCODE_C) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Hold4 / Big (Hoch)") PORT_CODE(KEYCODE_V) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Hold5 / Double Up (Dopp.)") PORT_CODE(KEYCODE_B) + 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_TAG("IN5") // $5f + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // service/settings? + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // "Notes In" + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 ) + 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_TAG("DSW0") // still not connected + 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( 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 + +INPUT_PORTS_START( goldnpkr ) + + PORT_START_TAG("IN0") // PIA1 - timing issues + 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_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + +// PORT_START_TAG("IN0") // PIA1 - timing issues +// PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 0") PORT_CODE(KEYCODE_Q) +// PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 1") PORT_CODE(KEYCODE_W) +// PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 2") PORT_CODE(KEYCODE_E) +// PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 3") PORT_CODE(KEYCODE_R) +// PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 4") PORT_CODE(KEYCODE_T) +// PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 5") PORT_CODE(KEYCODE_Y) +// PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 6") PORT_CODE(KEYCODE_U) +// PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 7") PORT_CODE(KEYCODE_I) + + PORT_START_TAG("IN1") // $50 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // PORT_NAME("Coins In"); need to check more closely. + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + 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_TAG("IN2") // $5c + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Meters/Stats")// GP: Permanent/Interim Meters (timed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_NAME("Double Up") PORT_CODE(KEYCODE_3) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Deal/Draw") PORT_CODE(KEYCODE_2) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Cancel") PORT_CODE(KEYCODE_N) + 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_TAG("IN3") // $5d + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_NAME("Payout") PORT_CODE(KEYCODE_D) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_NAME("Take Score") PORT_CODE(KEYCODE_4) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Big") PORT_CODE(KEYCODE_A) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Small") PORT_CODE(KEYCODE_S) + 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_TAG("IN4") // $5e + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Hold 1") PORT_CODE(KEYCODE_Z) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Hold 2") PORT_CODE(KEYCODE_X) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Hold 3") PORT_CODE(KEYCODE_C) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Hold 4") PORT_CODE(KEYCODE_V) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Hold 5") PORT_CODE(KEYCODE_B) + 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_TAG("IN5") // $5f + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE ) // GP: service: 'double up' to change even/lose; 'bet' to change max bet. + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN1 ) // PORT_NAME("Notes In") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Bet") PORT_CODE(KEYCODE_1) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN2 ) // PORT_NAME("Coupons In") + 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_TAG("DSW0") // still not connected + 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( 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 + +INPUT_PORTS_START( jokerpkr ) + + PORT_START_TAG("IN0") // PIA1 - timing issues + 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_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + +// PORT_START_TAG("IN0") // PIA1 - timing issues +// PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 0") PORT_CODE(KEYCODE_Q) +// PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 1") PORT_CODE(KEYCODE_W) +// PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 2") PORT_CODE(KEYCODE_E) +// PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 3") PORT_CODE(KEYCODE_R) +// PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 4") PORT_CODE(KEYCODE_T) +// PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 5") PORT_CODE(KEYCODE_Y) +// PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 6") PORT_CODE(KEYCODE_U) +// PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Bit 7") PORT_CODE(KEYCODE_I) + + PORT_START_TAG("IN1") // $50 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // PORT_NAME("Coins In"); need to check more closely. + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + 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_TAG("IN2") // $5c + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Meters/Stats")// GP: Permanent/Interim Meters (timed) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Double Up button + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Deal/Draw") PORT_CODE(KEYCODE_2) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Cancel") PORT_CODE(KEYCODE_N) + 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_TAG("IN3") // $5d + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_NAME("Payout") PORT_CODE(KEYCODE_D) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_NAME("Take Score") PORT_CODE(KEYCODE_4) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Big button + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // Small button + 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_TAG("IN4") // $5e + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Hold 1") PORT_CODE(KEYCODE_Z) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Hold 2") PORT_CODE(KEYCODE_X) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Hold 3") PORT_CODE(KEYCODE_C) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Hold 4") PORT_CODE(KEYCODE_V) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Hold 5") PORT_CODE(KEYCODE_B) + 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_TAG("IN5") // $5f + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE ) // JP: service. + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN1 ) // PORT_NAME("Notes In") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Bet") PORT_CODE(KEYCODE_1) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN2 ) // PORT_NAME("Coupons In") + 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_TAG("DSW0") // still not connected + 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( 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 + +/************************* +* Graphics Layouts * +*************************/ + +static const gfx_layout charlayout = +{ + 8, 8, + RGN_FRAC(1,1), + 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 const gfx_layout tilelayout = +{ + 8, 8, + RGN_FRAC(1,3), + 3, + { 0, RGN_FRAC(1,3), RGN_FRAC(2,3) }, // bitplanes are separated. + { 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 +}; + + +/****************************** +* Graphics Decode Information * +******************************/ + +static const gfx_decode gfxdecodeinfo[] = +{ + { REGION_GFX1, 0, &charlayout, 0, 16 }, + { REGION_GFX2, 0, &tilelayout, 0, 16 }, + { -1 } +}; + + +/*********************** +* PIA Interfaces * +**********************/ + + static const pia6821_interface pia0_intf = +{ + /* PIA inputs: A, B, CA1, CB1, CA2, CB2 */ + input_port_0_r, 0, 0, 0, 0, 0, + + /* PIA outputs: A, B, CA2, CB2 */ + 0, 0, 0, 0, + + /* PIA IRQs: A, B */ + 0, 0 +}; + +static const pia6821_interface pia1_intf = +{ + /* PIA inputs: A, B, CA1, CB1, CA2, CB2 */ + 0, 0, 0, 0, 0, 0, + + /* PIA outputs: A, B, CA2, CB2 */ + 0, 0, 0, 0, + + /* PIA IRQs: A, B */ + 0, 0 +}; + + +/************************* +* Machine Driver * +*************************/ + +static MACHINE_DRIVER_START( pmpoker ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M6502, 10000000/16) // guessing... + MDRV_CPU_PROGRAM_MAP(pmpoker_map, 0) + MDRV_CPU_VBLANK_INT(nmi_line_pulse, 1) + + MDRV_FRAMES_PER_SECOND(60) + MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_SIZE((39+1)*8, (31+1)*8) // Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1). + MDRV_VISIBLE_AREA(0*8, 32*8-1, 0*8, 29*8-1) // Taken from MC6845 init, registers 01 & 06. + + MDRV_GFXDECODE(gfxdecodeinfo) + MDRV_PALETTE_LENGTH(64) + MDRV_PALETTE_INIT(pmpoker) + MDRV_COLORTABLE_LENGTH(256) + + MDRV_VIDEO_START(pmpoker) + MDRV_VIDEO_UPDATE(pmpoker) + +MACHINE_DRIVER_END + +static MACHINE_DRIVER_START( jokerpkr ) + + /* basic machine hardware */ + MDRV_CPU_ADD(M6502, 10000000/16) // guessing... + MDRV_CPU_PROGRAM_MAP(jokerpkr_map, 0) + MDRV_CPU_VBLANK_INT(nmi_line_pulse, 1) + + MDRV_FRAMES_PER_SECOND(60) + MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION) + + /* video hardware */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_SCREEN_SIZE((39+1)*8, (31+1)*8) // Taken from MC6845 init, registers 00 & 04. Normally programmed with (value-1). + MDRV_VISIBLE_AREA(0*8, 32*8-1, 0*8, 29*8-1) // Taken from MC6845 init, registers 01 & 06. + + MDRV_GFXDECODE(gfxdecodeinfo) + MDRV_PALETTE_LENGTH(64) + MDRV_PALETTE_INIT(pmpoker) + MDRV_COLORTABLE_LENGTH(256) + + MDRV_VIDEO_START(pmpoker) + MDRV_VIDEO_UPDATE(pmpoker) + +MACHINE_DRIVER_END + + +/************************* +* Rom Load * +*************************/ + +ROM_START( pmpoker ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "2-5.bin", 0x5000, 0x1000, CRC(3446a643) SHA1(e67854e3322e238c17fed4e05282922028b5b5ea) ) + ROM_LOAD( "2-6.bin", 0x6000, 0x1000, CRC(50d2d026) SHA1(7f58ab176de0f0f7666d87271af69a845faec090) ) + ROM_LOAD( "2-7.bin", 0x7000, 0x1000, CRC(a9ab972e) SHA1(477441b7ff3acae3a5d5a3e4c2a428e0b3121534) ) + ROM_RELOAD( 0xf000, 0x1000 ) // for vectors/pointers + + ROM_REGION( 0x0800, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "1-4.bin", 0x0000, 0x0800, CRC(62b9f90d) SHA1(39c61a01225027572fdb75543bb6a78ed74bb2fb) ) // text layer + + ROM_REGION( 0x1800, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "1-1.bin", 0x0000, 0x0800, CRC(f2f94661) SHA1(f37f7c0dff680fd02897dae64e13e297d0fdb3e7) ) // cards deck gfx, bitplane1. + ROM_LOAD( "1-2.bin", 0x0800, 0x0800, CRC(6bbb1e2d) SHA1(51ee282219bf84218886ad11a24bc6a8e7337527) ) // cards deck gfx, bitplane2. + ROM_LOAD( "1-3.bin", 0x1000, 0x0800, CRC(6e3e9b1d) SHA1(14eb8d14ce16719a6ad7d13db01e47c8f05955f0) ) // cards deck gfx, bitplane3. +ROM_END + +/* the original goldnpkr u40_4a.bin rom is bit corrupted. + +U43_2A.bin BADADDR --xxxxxxxxxxx +U38_5A.bin 1ST AND 2ND HALF IDENTICAL +UPS39_12A.bin 0xxxxxxxxxxxxxx = 0xFF +*/ +ROM_START( goldnpkr ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "ups39_12a.bin", 0x0000, 0x8000, CRC(216b45fb) SHA1(fbfcd98cc39b2e791cceb845b166ff697f584add) ) + ROM_RELOAD( 0x8000, 0x8000 ) // for vectors/pointers + + ROM_REGION( 0x2000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "u38_5a.bin", 0x0000, 0x2000, CRC(32705e1d) SHA1(84f9305af38179985e0224ae2ea54c01dfef6e12) ) // text layer + + ROM_REGION( 0x6000, REGION_GFX2, ROMREGION_DISPOSE ) + /* u40_4a.bin need to be redumped */ + ROM_LOAD( "u43_2a.bin", 0x0000, 0x2000, CRC(10b34856) SHA1(52e4cc81b36b4c807b1d4471c0f7bea66108d3fd) ) // cards deck gfx, bitplane1. + ROM_LOAD( "u40_4a.bin", 0x2000, 0x2000, CRC(5fc965ef) SHA1(d9ecd7e9b4915750400e76ca604bec8152df1fe4) ) // cards deck gfx, bitplane2. + ROM_COPY( REGION_GFX1, 0x0800, 0x4000, 0x0800 ) // rgn,srcoffset,offset,length - cards deck gfx, bitplane3. + /* found the 3rd bitplane in the 2nd quarter of the text layer rom */ + +/* pmpoker goldnpkr + 1-4.bin u38_5a (1st quarter) 96.582031% \ 1st and 2nd halves are identical. + 1-3.bin u38_5a (2nd quarter) IDENTICAL / + 1-1.bin u43_2a (1st quarter) IDENTICAL ; 4 quarters are identical. +*/ +ROM_END + +ROM_START( jokerpkr ) // Is this a Coinmaster game? + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "vp-5.bin", 0x2000, 0x1000, CRC(1443d0ff) SHA1(36625d24d9a871cc8c03bdeda983982ba301b385) ) + ROM_LOAD( "vp-6.bin", 0x3000, 0x1000, CRC(94f82fc1) SHA1(ce95fc429f5389eea45fec877bac992fa7ba2b3c) ) + ROM_RELOAD( 0xf000, 0x1000 ) // for vectors/pointers + + ROM_REGION( 0x0800, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "vp-4.bin", 0x0000, 0x0800, CRC(2c53493f) SHA1(9e71db51499294bb4b16e7d8013e5daf6f1f9d18) ) // text layer + + ROM_REGION( 0x1800, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "vp-1.bin", 0x0000, 0x0800, CRC(f2f94661) SHA1(f37f7c0dff680fd02897dae64e13e297d0fdb3e7) ) // cards deck gfx, bitplane1. + ROM_LOAD( "vp-2.bin", 0x0800, 0x0800, CRC(6bbb1e2d) SHA1(51ee282219bf84218886ad11a24bc6a8e7337527) ) // cards deck gfx, bitplane2. + ROM_LOAD( "vp-3.bin", 0x1000, 0x0800, CRC(6e3e9b1d) SHA1(14eb8d14ce16719a6ad7d13db01e47c8f05955f0) ) // cards deck gfx, bitplane3. +ROM_END + +/* the alternative Jack Potten set is identical, but with different sized roms. + + pot1.bin 1ST AND 2ND HALF IDENTICAL + pot2.bin 1ST AND 2ND HALF IDENTICAL +pottpok1.bin pot34.bin (1st half) IDENTICAL +pottpok2.bin pot34.bin (2nd half) IDENTICAL +pottpok3.bin pot2.bin (1st half) IDENTICAL +pottpok4.bin pot1.bin (1st half) IDENTICAL +pottpok5.bin pot5.bin IDENTICAL +pottpok6.bin pot6.bin IDENTICAL +*/ +ROM_START( pottnpkr ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) + ROM_LOAD( "pottpok5.bin", 0x2000, 0x1000, CRC(d74e50f4) SHA1(c3a8a6322a3f1622898c6759e695b4e702b79b28) ) + ROM_LOAD( "pottpok6.bin", 0x3000, 0x1000, CRC(53237873) SHA1(b640cb3db2513784c8d2d8983a17352276c11e07) ) + ROM_RELOAD( 0xf000, 0x1000 ) // for vectors/pointers + + ROM_REGION( 0x0800, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "pottpok1.bin", 0x0000, 0x0800, CRC(2c53493f) SHA1(9e71db51499294bb4b16e7d8013e5daf6f1f9d18) ) // text layer + + ROM_REGION( 0x1800, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "pottpok4.bin", 0x0000, 0x0800, CRC(f2f94661) SHA1(f37f7c0dff680fd02897dae64e13e297d0fdb3e7) ) // cards deck gfx, bitplane1. + ROM_LOAD( "pottpok3.bin", 0x0800, 0x0800, CRC(6bbb1e2d) SHA1(51ee282219bf84218886ad11a24bc6a8e7337527) ) // cards deck gfx, bitplane2. + ROM_LOAD( "pottpok2.bin", 0x1000, 0x0800, CRC(6e3e9b1d) SHA1(14eb8d14ce16719a6ad7d13db01e47c8f05955f0) ) // cards deck gfx, bitplane3. +ROM_END + + +/************************* +* Driver Init * +*************************/ + +static DRIVER_INIT( pmpoker ) +{ + pia_config(0, PIA_STANDARD_ORDERING, &pia0_intf); + pia_config(1, PIA_STANDARD_ORDERING, &pia1_intf); +} + + +/************************* +* Game Drivers * +*************************/ + +// YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS +GAME( 198?, pmpoker, 0, pmpoker, pmpoker, pmpoker, ROT0, "PlayMan?", "PlayMan Poker (Germany)", GAME_NO_SOUND ) +GAME( 198?, goldnpkr, pmpoker, pmpoker, goldnpkr, pmpoker, ROT0, "Bonanza Enterprises, Ltd", "Golden Poker Double Up", GAME_NO_SOUND ) +GAME( 198?, jokerpkr, pmpoker, jokerpkr, jokerpkr, pmpoker, ROT0, "Coinmaster-Gaming, Ltd", "Joker Poker", GAME_NO_SOUND ) +GAME( 198?, pottnpkr, pmpoker, jokerpkr, goldnpkr, pmpoker, ROT0, "Unknown", "Jack Potten's Poker", GAME_NO_SOUND ) + diff --git a/src/drivers/pntnpuzl.c b/src/drivers/pntnpuzl.c index 338c94d7f..92e0cf0c2 100644 --- a/src/drivers/pntnpuzl.c +++ b/src/drivers/pntnpuzl.c @@ -273,7 +273,7 @@ WRITE16_HANDLER( pntnpuzl_palette_w ) rgb[sub++] = data & 0xff; if (sub == 3) { - palette_set_color(indx++,rgb[0]<<2,rgb[1]<<2,rgb[2]<<2); + palette_set_color(Machine,indx++,pal6bit(rgb[0]),pal6bit(rgb[1]),pal6bit(rgb[2])); sub = 0; if (indx == 256) indx = 0; } @@ -284,7 +284,7 @@ WRITE16_HANDLER( pntnpuzl_palette_w ) READ16_HANDLER ( pntnpuzl_random_r ) { - return mame_rand(); + return mame_rand(Machine); } READ16_HANDLER( pntnpuzl_vid_r ) diff --git a/src/drivers/pokechmp.c b/src/drivers/pokechmp.c index 019fffc42..315f4a6e9 100644 --- a/src/drivers/pokechmp.c +++ b/src/drivers/pokechmp.c @@ -99,7 +99,7 @@ static WRITE8_HANDLER( pokechmp_sound_w ) INLINE void pokechmp_set_color(pen_t color, int rshift, int gshift, int bshift, UINT16 data) { - palette_set_color(color, pal5bit(data >> rshift), pal5bit(data >> gshift), pal5bit(data >> bshift)); + palette_set_color(Machine, color, pal5bit(data >> rshift), pal5bit(data >> gshift), pal5bit(data >> bshift)); } diff --git a/src/drivers/polepos.c b/src/drivers/polepos.c index 2fad671e9..12181fa62 100644 --- a/src/drivers/polepos.c +++ b/src/drivers/polepos.c @@ -1691,7 +1691,7 @@ static DRIVER_INIT( polepos2 ) /* note that the bootleg version doesn't need this custom IC; it has a hacked ROM in its place */ memory_install_read16_handler(1, ADDRESS_SPACE_PROGRAM, 0x4000, 0x5fff, 0, 0, polepos2_ic25_r); - init_polepos(); + init_polepos(machine); } diff --git a/src/drivers/polyplay.c b/src/drivers/polyplay.c index 09da92809..4949ee01c 100644 --- a/src/drivers/polyplay.c +++ b/src/drivers/polyplay.c @@ -268,7 +268,7 @@ static WRITE8_HANDLER( polyplay_start_timer2 ) static READ8_HANDLER( polyplay_random_read ) { - return mame_rand() & 0xff; + return mame_rand(Machine) & 0xff; } /* graphic structures */ diff --git a/src/drivers/poolshrk.c b/src/drivers/poolshrk.c index 77aea5396..13d3c8b78 100644 --- a/src/drivers/poolshrk.c +++ b/src/drivers/poolshrk.c @@ -205,10 +205,10 @@ static const gfx_decode poolshrk_gfx_decode_info[] = static PALETTE_INIT( poolshrk ) { - palette_set_color(0,0x7F, 0x7F, 0x7F); - palette_set_color(1,0xFF, 0xFF, 0xFF); - palette_set_color(2,0x7F, 0x7F, 0x7F); - palette_set_color(3,0x00, 0x00, 0x00); + palette_set_color(machine,0,0x7F, 0x7F, 0x7F); + palette_set_color(machine,1,0xFF, 0xFF, 0xFF); + palette_set_color(machine,2,0x7F, 0x7F, 0x7F); + palette_set_color(machine,3,0x00, 0x00, 0x00); } diff --git a/src/drivers/prehisle.c b/src/drivers/prehisle.c index 8eef92521..ab5ee6928 100644 --- a/src/drivers/prehisle.c +++ b/src/drivers/prehisle.c @@ -411,6 +411,6 @@ static DRIVER_INIT( gensitou ) /******************************************************************************/ -GAME( 1989, prehisle, 0, prehisle, prehisle, prehisle, ROT0, "SNK", "Prehistoric Isle in 1930 (World)", 0 ) -GAME( 1989, prehislu, prehisle, prehisle, prehisle, prehislu, ROT0, "SNK of America", "Prehistoric Isle in 1930 (US)", 0 ) -GAME( 1989, gensitou, prehisle, prehisle, prehisle, gensitou, ROT0, "SNK", "Genshi-Tou 1930's", 0 ) +GAME( 1989, prehisle, 0, prehisle, prehisle, prehisle, ROT0, "SNK", "Prehistoric Isle in 1930 (World)", GAME_SUPPORTS_SAVE ) +GAME( 1989, prehislu, prehisle, prehisle, prehisle, prehislu, ROT0, "SNK of America", "Prehistoric Isle in 1930 (US)", GAME_SUPPORTS_SAVE ) +GAME( 1989, gensitou, prehisle, prehisle, prehisle, gensitou, ROT0, "SNK", "Genshi-Tou 1930's", GAME_SUPPORTS_SAVE ) diff --git a/src/drivers/psikyo.c b/src/drivers/psikyo.c index a2c6bb12c..0dfec9eeb 100644 --- a/src/drivers/psikyo.c +++ b/src/drivers/psikyo.c @@ -1199,7 +1199,7 @@ INPUT_PORTS_START( s1945 ) Came from a Japan board apparently!!! Japan is listed in the code but how do you activate it? - No effect on set s1945j + No effect on set s1945j or s1945k ************************************************/ @@ -2162,6 +2162,36 @@ ROM_START( s1945j ) ROM_END +ROM_START( s1945k ) /* Same MCU as the current parent set, region dip has no effect on this set */ + + ROM_REGION( 0x100000, REGION_CPU1, 0 ) /* Main CPU Code */ + ROM_LOAD32_WORD_SWAP( "10.u40", 0x000000, 0x040000, CRC(5a32af36) SHA1(2eada37fd043c097a11bcf4e3e0bebb473bbc0df) ) // 1&0 + ROM_LOAD32_WORD_SWAP( "9.u41", 0x000002, 0x040000, CRC(29cc6d7d) SHA1(aeee9e88922c25c75885483d115e064c6b71540b) ) // 3&2 + + ROM_REGION( 0x030000, REGION_CPU2, 0 ) /* Sound CPU Code */ + ROM_LOAD( "3-u63.bin", 0x00000, 0x20000, CRC(42d40ae1) SHA1(530a5a3f78ac489b84a631ea6ce21010a4f4d31b) ) + ROM_RELOAD( 0x10000, 0x20000 ) + + ROM_REGION( 0x000100, REGION_CPU3, 0 ) /* MCU */ + ROM_LOAD( "4-u59.bin", 0x00000, 0x00100, NO_DUMP ) + + ROM_REGION( 0x800000, REGION_GFX1, ROMREGION_DISPOSE ) /* Sprites */ + ROM_LOAD( "u20.bin", 0x000000, 0x200000, CRC(28a27fee) SHA1(913f3bc4d0c6fb6b776a020c8099bf96f16fd06f) ) + ROM_LOAD( "u22.bin", 0x200000, 0x200000, CRC(ca152a32) SHA1(63efee83cb5982c77ca473288b3d1a96b89e6388) ) + ROM_LOAD( "u21.bin", 0x400000, 0x200000, CRC(c5d60ea9) SHA1(e5ce90788211c856172e5323b01b2c7ab3d3fe50) ) + ROM_LOAD( "u23.bin", 0x600000, 0x200000, CRC(48710332) SHA1(db38b732a09b31ce55a96ec62987baae9b7a00c1) ) + + ROM_REGION( 0x200000, REGION_GFX2, ROMREGION_DISPOSE ) /* Layer 0 + 1 */ + ROM_LOAD( "u34.bin", 0x000000, 0x200000, CRC(aaf83e23) SHA1(1c75d09ff42c0c215f8c66c699ca75688c95a05e) ) + + ROM_REGION( 0x200000, REGION_SOUND1, 0 ) /* Samples */ + ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(a839cf47) SHA1(e179eb505c80d5bb3ccd9e228f2cf428c62b72ee) ) // 8 bit signed pcm (16KHz) + + ROM_REGION( 0x040000, REGION_USER1, 0 ) /* */ + ROM_LOAD( "u1.bin", 0x000000, 0x040000, CRC(dee22654) SHA1(5df05b0029ff7b1f7f04b41da7823d2aa8034bd2) ) + +ROM_END + DRIVER_INIT( s1945 ) { /* input ports */ @@ -2284,14 +2314,15 @@ DRIVER_INIT( tengai ) ***************************************************************************/ /* Working Games */ -GAME( 1993, samuraia, 0, sngkace, samuraia, sngkace, ROT270, "Psikyo", "Samurai Aces (World)" , 0) // Banpresto? -GAME( 1993, sngkace, samuraia, sngkace, sngkace, sngkace, ROT270, "Psikyo", "Sengoku Ace (Japan)" , 0) // Banpresto? -GAME( 1994, gunbird, 0, gunbird, gunbird, gunbird, ROT270, "Psikyo", "Gunbird (World)" , 0 ) -GAME( 1994, gunbirdk, gunbird, gunbird, gunbirdj, gunbird, ROT270, "Psikyo", "Gunbird (Korea)" , 0 ) -GAME( 1994, gunbirdj, gunbird, gunbird, gunbirdj, gunbird, ROT270, "Psikyo", "Gunbird (Japan)" , 0 ) +GAME( 1993, samuraia, 0, sngkace, samuraia, sngkace, ROT270, "Psikyo", "Samurai Aces (World)", 0) // Banpresto? +GAME( 1993, sngkace, samuraia, sngkace, sngkace, sngkace, ROT270, "Psikyo", "Sengoku Ace (Japan)", 0) // Banpresto? +GAME( 1994, gunbird, 0, gunbird, gunbird, gunbird, ROT270, "Psikyo", "Gunbird (World)", 0 ) +GAME( 1994, gunbirdk, gunbird, gunbird, gunbirdj, gunbird, ROT270, "Psikyo", "Gunbird (Korea)", 0 ) +GAME( 1994, gunbirdj, gunbird, gunbird, gunbirdj, gunbird, ROT270, "Psikyo", "Gunbird (Japan)", 0 ) GAME( 1994, btlkroad, 0, gunbird, btlkroad, gunbird, ROT0, "Psikyo", "Battle K-Road", 0 ) GAME( 1995, s1945, 0, s1945, s1945, s1945, ROT270, "Psikyo", "Strikers 1945", 0 ) -GAME( 1995, s1945a, s1945, s1945, s1945a, s1945a, ROT270, "Psikyo", "Strikers 1945 (Alt)" , 0) // Region dip - 0x0f=Japan, anything else=World +GAME( 1995, s1945a, s1945, s1945, s1945a, s1945a, ROT270, "Psikyo", "Strikers 1945 (Alt)", 0) // Region dip - 0x0f=Japan, anything else=World GAME( 1995, s1945j, s1945, s1945, s1945j, s1945j, ROT270, "Psikyo", "Strikers 1945 (Japan)", 0 ) GAME( 1995, s1945jn, s1945, gunbird, s1945j, s1945jn, ROT270, "Psikyo", "Strikers 1945 (Japan, unprotected)", 0 ) +GAME( 1995, s1945k, s1945, s1945, s1945j, s1945, ROT270, "Psikyo", "Strikers 1945 (Korea)", 0 ) GAME( 1996, tengai, 0, s1945, tengai, tengai, ROT0, "Psikyo", "Tengai / Sengoku Blade: Sengoku Ace Episode II", 0 ) diff --git a/src/drivers/psikyo4.c b/src/drivers/psikyo4.c index ab22166b3..67813a023 100644 --- a/src/drivers/psikyo4.c +++ b/src/drivers/psikyo4.c @@ -189,8 +189,8 @@ static WRITE32_HANDLER( ps4_paletteram32_RRRRRRRRGGGGGGGGBBBBBBBBxxxxxxxx_dword_ g = ((paletteram32[offset] & 0x00ff0000) >>16); r = ((paletteram32[offset] & 0xff000000) >>24); - palette_set_color(offset,r,g,b); - palette_set_color(offset+0x800,r,g,b); // For screen 2 + palette_set_color(Machine,offset,r,g,b); + palette_set_color(Machine,offset+0x800,r,g,b); // For screen 2 } static WRITE32_HANDLER( ps4_bgpen_1_dword_w ) @@ -202,7 +202,7 @@ static WRITE32_HANDLER( ps4_bgpen_1_dword_w ) g = ((bgpen_1[0] & 0x00ff0000) >>16); r = ((bgpen_1[0] & 0xff000000) >>24); - palette_set_color(0x1000,r,g,b); // Clear colour for screen 1 + palette_set_color(Machine,0x1000,r,g,b); // Clear colour for screen 1 } static WRITE32_HANDLER( ps4_bgpen_2_dword_w ) @@ -214,7 +214,7 @@ static WRITE32_HANDLER( ps4_bgpen_2_dword_w ) g = ((bgpen_2[0] & 0x00ff0000) >>16); r = ((bgpen_2[0] & 0xff000000) >>24); - palette_set_color(0x1001,r,g,b); // Clear colour for screen 2 + palette_set_color(Machine,0x1001,r,g,b); // Clear colour for screen 2 } static WRITE32_HANDLER( ps4_screen1_brt_w ) @@ -232,7 +232,7 @@ static WRITE32_HANDLER( ps4_screen1_brt_w ) int i; for (i = 0; i < 0x800; i++) - palette_set_brightness(i,brt1); + palette_set_brightness(Machine,i,brt1); oldbrt1 = brt1; } @@ -259,7 +259,7 @@ static WRITE32_HANDLER( ps4_screen2_brt_w ) int i; for (i = 0x800; i < 0x1000; i++) - palette_set_brightness(i,brt2); + palette_set_brightness(Machine,i,brt2); oldbrt2 = brt2; } diff --git a/src/drivers/psikyosh.c b/src/drivers/psikyosh.c index d7cb1dd94..50bd18a75 100644 --- a/src/drivers/psikyosh.c +++ b/src/drivers/psikyosh.c @@ -424,7 +424,7 @@ static WRITE32_HANDLER( paletteram32_RRRRRRRRGGGGGGGGBBBBBBBBxxxxxxxx_dword_w ) g = ((paletteram32[offset] & 0x00ff0000) >>16); r = ((paletteram32[offset] & 0xff000000) >>24); - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } static WRITE32_HANDLER( psikyosh_vidregs_w ) diff --git a/src/drivers/qix.c b/src/drivers/qix.c index 5d2da2089..166b9c582 100644 --- a/src/drivers/qix.c +++ b/src/drivers/qix.c @@ -3241,7 +3241,7 @@ static DRIVER_INIT( kram3 ) i += 3; } - init_kram(); + init_kram(machine); } static DRIVER_INIT( zookeep ) diff --git a/src/drivers/quantum.c b/src/drivers/quantum.c index 70b11f7a4..c368b80c5 100644 --- a/src/drivers/quantum.c +++ b/src/drivers/quantum.c @@ -48,6 +48,8 @@ #include "vidhrdw/avgdvg.h" #include "sound/pokey.h" +#define MASTER_CLOCK (12096000) +#define CLOCK_3KHZ (MASTER_CLOCK / 4096) /************************************* @@ -133,43 +135,29 @@ static READ16_HANDLER( pokey_word_r ) } - /************************************* * * Main CPU memory handlers * *************************************/ -ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x013fff) AM_READ(MRA16_ROM) - AM_RANGE(0x018000, 0x01cfff) AM_READ(MRA16_RAM) - AM_RANGE(0x800000, 0x801fff) AM_READ(MRA16_RAM) - AM_RANGE(0x840000, 0x84003f) AM_READ(pokey_word_r) - AM_RANGE(0x900000, 0x9001ff) AM_READ(MRA16_RAM) +ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x013fff) AM_ROM + AM_RANGE(0x018000, 0x01cfff) AM_RAM + AM_RANGE(0x800000, 0x801fff) AM_RAM AM_BASE(&quantum_vectorram) AM_SIZE(&vectorram_size) + AM_RANGE(0x840000, 0x84003f) AM_READWRITE(pokey_word_r, pokey_word_w) + AM_RANGE(0x900000, 0x9001ff) AM_RAM AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size) AM_RANGE(0x940000, 0x940001) AM_READ(trackball_r) /* trackball */ AM_RANGE(0x948000, 0x948001) AM_READ(switches_r) - AM_RANGE(0x978000, 0x978001) AM_READ(MRA16_NOP) /* ??? */ -ADDRESS_MAP_END - - -ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x013fff) AM_WRITE(MWA16_ROM) - AM_RANGE(0x018000, 0x01cfff) AM_WRITE(MWA16_RAM) - AM_RANGE(0x800000, 0x801fff) AM_WRITE(MWA16_RAM) AM_BASE((UINT16 **)&vectorram) AM_SIZE(&vectorram_size) - AM_RANGE(0x840000, 0x84003f) AM_WRITE(pokey_word_w) - AM_RANGE(0x900000, 0x9001ff) AM_WRITE(MWA16_RAM) AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size) - AM_RANGE(0x950000, 0x95001f) AM_WRITE(quantum_colorram_w) + AM_RANGE(0x950000, 0x95001f) AM_WRITE(MWA16_RAM) AM_BASE(&quantum_colorram) AM_RANGE(0x958000, 0x958001) AM_WRITE(led_w) - AM_RANGE(0x960000, 0x960001) AM_WRITE(MWA16_NOP) /* enable NVRAM? */ + AM_RANGE(0x960000, 0x960001) AM_WRITE(MWA16_NOP) AM_RANGE(0x968000, 0x968001) AM_WRITE(avgdvg_reset_word_w) -// AM_RANGE(0x970000, 0x970001) AM_WRITE(avgdvg_go_w) -// AM_RANGE(0x978000, 0x978001) AM_WRITE(watchdog_reset_w) - /* the following is wrong, but it's the only way I found to fix the service mode */ - AM_RANGE(0x978000, 0x978001) AM_WRITE(avgdvg_go_word_w) + AM_RANGE(0x970000, 0x970001) AM_WRITE(avgdvg_go_word_w) + AM_RANGE(0x978000, 0x978001) AM_READWRITE(MRA16_NOP, watchdog_reset16_w) ADDRESS_MAP_END - /************************************* * * Port definitions @@ -249,9 +237,9 @@ static struct POKEYinterface pokey_interface_2 = static MACHINE_DRIVER_START( quantum ) /* basic machine hardware */ - MDRV_CPU_ADD(M68000,6000000) - MDRV_CPU_PROGRAM_MAP(readmem,writemem) - MDRV_CPU_VBLANK_INT(irq1_line_hold,3) /* IRQ rate = 750kHz/4096 */ + MDRV_CPU_ADD(M68000, MASTER_CLOCK / 2) + MDRV_CPU_PROGRAM_MAP(main_map, 0) + MDRV_CPU_PERIODIC_INT(irq1_line_hold, TIME_IN_HZ(CLOCK_3KHZ / 12)) MDRV_FRAMES_PER_SECOND(60) MDRV_NVRAM_HANDLER(generic_1fill) @@ -262,7 +250,6 @@ static MACHINE_DRIVER_START( quantum ) MDRV_VISIBLE_AREA(0, 900, 0, 600) MDRV_PALETTE_LENGTH(32768) - MDRV_PALETTE_INIT(avg_multi) MDRV_VIDEO_START(avg_quantum) MDRV_VIDEO_UPDATE(vector) @@ -298,6 +285,10 @@ ROM_START( quantum ) ROM_LOAD16_BYTE( "136016.109", 0x00C001, 0x002000, CRC(d2894424) SHA1(5390025136b677b66d948c8cf6ea5e20203a4bae) ) ROM_LOAD16_BYTE( "136016.105", 0x010000, 0x002000, CRC(13ec512c) SHA1(22a0395135b83ba47eacb5129f34fc97aa1b70a1) ) ROM_LOAD16_BYTE( "136016.110", 0x010001, 0x002000, CRC(acb50363) SHA1(9efa9ca88efdd2d5e212bd537903892b67b4fe53) ) + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.6h", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END @@ -313,6 +304,10 @@ ROM_START( quantum1 ) ROM_LOAD16_BYTE( "136016.109", 0x00C001, 0x002000, CRC(d2894424) SHA1(5390025136b677b66d948c8cf6ea5e20203a4bae) ) ROM_LOAD16_BYTE( "136016.105", 0x010000, 0x002000, CRC(13ec512c) SHA1(22a0395135b83ba47eacb5129f34fc97aa1b70a1) ) ROM_LOAD16_BYTE( "136016.110", 0x010001, 0x002000, CRC(acb50363) SHA1(9efa9ca88efdd2d5e212bd537903892b67b4fe53) ) + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.6h", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END @@ -328,6 +323,10 @@ ROM_START( quantump ) ROM_LOAD16_BYTE( "quantump.3k", 0x00C001, 0x002000, CRC(1aac576c) SHA1(28bdb5fcbd8cccc657d6e00ace3c083c21015564) ) ROM_LOAD16_BYTE( "quantump.2l", 0x010000, 0x002000, CRC(1285b5e7) SHA1(0e01e361da2d9cf1fac1896f8f44c4c2e75a3061) ) ROM_LOAD16_BYTE( "quantump.3l", 0x010001, 0x002000, CRC(e19de844) SHA1(cb4f9d80807b26d6b95405b2d830799984667f54) ) + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.6h", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END diff --git a/src/drivers/r2dtank.c b/src/drivers/r2dtank.c index 528bdbbfd..337a681bd 100644 --- a/src/drivers/r2dtank.c +++ b/src/drivers/r2dtank.c @@ -260,14 +260,14 @@ PALETTE_INIT( r2dtank ) { /* colours derived from tim's screenshots */ - palette_set_color(0x0,0,0,0); // background - palette_set_color(0x1,0,255,0); // credits - palette_set_color(0x2,0,0,251); // presented by sigma - palette_set_color(0x3,0,214,255); // per points etc. - palette_set_color(0x4,255,0,0); // r2dtank logo - palette_set_color(0x5,255,255,128); // unused? - palette_set_color(0x6,255,0,255); // pink tank - palette_set_color(0x7,236,141,181); // sigma (c) + palette_set_color(machine,0x0,0,0,0); // background + palette_set_color(machine,0x1,0,255,0); // credits + palette_set_color(machine,0x2,0,0,251); // presented by sigma + palette_set_color(machine,0x3,0,214,255); // per points etc. + palette_set_color(machine,0x4,255,0,0); // r2dtank logo + palette_set_color(machine,0x5,255,255,128); // unused? + palette_set_color(machine,0x6,255,0,255); // pink tank + palette_set_color(machine,0x7,236,141,181); // sigma (c) } diff --git a/src/drivers/rabbit.c b/src/drivers/rabbit.c index 479ec5d2e..dde39de95 100644 --- a/src/drivers/rabbit.c +++ b/src/drivers/rabbit.c @@ -410,7 +410,7 @@ VIDEO_UPDATE(rabbit) { int prilevel; - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); // popmessage("%08x %08x", rabbit_viewregs0[0], rabbit_viewregs0[1]); // popmessage("%08x %08x %08x %08x %08x %08x", rabbit_tilemap_regs[0][0],rabbit_tilemap_regs[0][1],rabbit_tilemap_regs[0][2],rabbit_tilemap_regs[0][3],rabbit_tilemap_regs[0][4],rabbit_tilemap_regs[0][5]); @@ -473,7 +473,7 @@ static WRITE32_HANDLER( rabbit_paletteram_dword_w ) r = ((paletteram32[offset] & 0x0000ff00) >>8); g = ((paletteram32[offset] & 0x00ff0000) >>16); - palette_set_color(offset^0xff,r,g,b); + palette_set_color(Machine,offset^0xff,r,g,b); } READ32_HANDLER( rabbit_tilemap0_r ) @@ -498,7 +498,7 @@ READ32_HANDLER( rabbit_tilemap3_r ) READ32_HANDLER( randomrabbits ) { - return mame_rand(); + return mame_rand(Machine); } static ADDRESS_MAP_START( rabbit_readmem, ADDRESS_SPACE_PROGRAM, 32 ) @@ -792,7 +792,7 @@ static WRITE32_HANDLER( tmmjprd_paletteram_dword_w ) r = ((paletteram32[offset] & 0x0000ff00) >>8); g = ((paletteram32[offset] & 0x00ff0000) >>16); - palette_set_color((offset^0xff)+0x2000,r,g,b); + palette_set_color(Machine,(offset^0xff)+0x2000,r,g,b); } @@ -1175,7 +1175,7 @@ VIDEO_UPDATE( tmmjprd ) // popmessage("%08x %08x %08x %08x %08x", rabbit_viewregs10[0],rabbit_viewregs10[1],rabbit_viewregs10[2],rabbit_viewregs10[3],rabbit_viewregs10[4]); - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); tilemap_draw(bitmap,cliprect,rabbit_tilemap[3],0,0); tilemap_draw(bitmap,cliprect,rabbit_tilemap[1],0,0); //same as 3? tilemap_draw(bitmap,cliprect,rabbit_tilemap[2],0,0); @@ -1214,7 +1214,7 @@ DRIVER_INIT( rabbit_common ) DRIVER_INIT(rabbit) { - init_rabbit_common(); + init_rabbit_common(machine); rabbit_banking = 1; rabbit_vblirqlevel = 6; rabbit_bltirqlevel = 4; @@ -1223,7 +1223,7 @@ DRIVER_INIT(rabbit) DRIVER_INIT(tmmjprd) { - init_rabbit_common(); + init_rabbit_common(machine); rabbit_banking = 0; rabbit_vblirqlevel = 5; rabbit_bltirqlevel = 3; // actually palette related? diff --git a/src/drivers/raiden2.c b/src/drivers/raiden2.c index 0b87c1fbc..c39f5b73e 100644 --- a/src/drivers/raiden2.c +++ b/src/drivers/raiden2.c @@ -425,7 +425,7 @@ VIDEO_UPDATE (raiden2) } #endif - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); if(!code_pressed(KEYCODE_Q)) tilemap_draw(bitmap,cliprect,background_layer,0,0); diff --git a/src/drivers/rbmk.c b/src/drivers/rbmk.c index 56c1a32e8..157a44493 100644 --- a/src/drivers/rbmk.c +++ b/src/drivers/rbmk.c @@ -66,7 +66,7 @@ static UINT16 tilebank=0; static READ16_HANDLER( gms_read ) { - return mame_rand(); + return mame_rand(Machine); } @@ -483,7 +483,7 @@ VIDEO_UPDATE(rbmk) return 0; } -void nvram_handler_syf(mame_file *file,int read_or_write) +NVRAM_HANDLER( syf ) { if (read_or_write) EEPROM_save(file); diff --git a/src/drivers/rcasino.c b/src/drivers/rcasino.c index 1b091d89e..b47a4f2ac 100644 --- a/src/drivers/rcasino.c +++ b/src/drivers/rcasino.c @@ -74,7 +74,7 @@ PALETTE_INIT( rcasino ) b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); color_prom++; } diff --git a/src/drivers/redalert.c b/src/drivers/redalert.c index 76b93289f..ff9c4e8ea 100644 --- a/src/drivers/redalert.c +++ b/src/drivers/redalert.c @@ -323,15 +323,15 @@ static unsigned short colortable_source[] = static PALETTE_INIT( redalert ) { /* Arbitrary colors */ - palette_set_color(0,0x40,0x80,0xff); /* Background */ - palette_set_color(1,0x00,0x00,0xff); /* Blue */ - palette_set_color(2,0xff,0x00,0xff); /* Magenta */ - palette_set_color(3,0x00,0xff,0xff); /* Cyan */ - palette_set_color(4,0xff,0x00,0x00); /* Red */ - palette_set_color(5,0xff,0x80,0x00); /* Orange */ - palette_set_color(6,0xff,0xff,0x00); /* Yellow */ - palette_set_color(7,0xff,0xff,0xff); /* White */ - palette_set_color(8,0x00,0x00,0x00); /* Black */ + palette_set_color(machine,0,0x40,0x80,0xff); /* Background */ + palette_set_color(machine,1,0x00,0x00,0xff); /* Blue */ + palette_set_color(machine,2,0xff,0x00,0xff); /* Magenta */ + palette_set_color(machine,3,0x00,0xff,0xff); /* Cyan */ + palette_set_color(machine,4,0xff,0x00,0x00); /* Red */ + palette_set_color(machine,5,0xff,0x80,0x00); /* Orange */ + palette_set_color(machine,6,0xff,0xff,0x00); /* Yellow */ + palette_set_color(machine,7,0xff,0xff,0xff); /* White */ + palette_set_color(machine,8,0x00,0x00,0x00); /* Black */ memcpy(colortable,colortable_source,sizeof(colortable_source)); } diff --git a/src/drivers/rockola.c b/src/drivers/rockola.c index ad5dbe8d6..c7978094f 100644 --- a/src/drivers/rockola.c +++ b/src/drivers/rockola.c @@ -1009,7 +1009,7 @@ static MACHINE_RESET( pballoon ) // 40.3 Hz update (measured) rockola_set_music_clock(1 / 40.3); - machine_reset_fantasy(); + machine_reset_fantasy(machine); } /* Machine Drivers */ diff --git a/src/drivers/rotaryf.c b/src/drivers/rotaryf.c index 4f71a4339..7c1fdd74a 100644 --- a/src/drivers/rotaryf.c +++ b/src/drivers/rotaryf.c @@ -17,8 +17,8 @@ driver by Barry Rodewald static PALETTE_INIT( rotaryf ) { - palette_set_color(0,0x00,0x00,0x00); /* black */ - palette_set_color(1,0xff,0xff,0xff); /* white */ + palette_set_color(machine,0,0x00,0x00,0x00); /* black */ + palette_set_color(machine,1,0xff,0xff,0xff); /* white */ } INTERRUPT_GEN( rotaryf_interrupt ) diff --git a/src/drivers/route16.c b/src/drivers/route16.c index 47613612c..7ac03007d 100644 --- a/src/drivers/route16.c +++ b/src/drivers/route16.c @@ -645,7 +645,7 @@ DRIVER_INIT( route16 ) rom[0x0755] = 0x63; rom[0x0756] = 0x07; - init_route16b(); + init_route16b(machine); } DRIVER_INIT( route16a ) @@ -668,7 +668,7 @@ DRIVER_INIT( route16a ) ROM[0x0748] = 0x56; ROM[0x0749] = 0x07; - init_route16b(); + init_route16b(machine); } diff --git a/src/drivers/royalmah.c b/src/drivers/royalmah.c index 3885f0b2f..0b3a00c86 100644 --- a/src/drivers/royalmah.c +++ b/src/drivers/royalmah.c @@ -156,7 +156,7 @@ PALETTE_INIT( royalmah ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } @@ -176,7 +176,7 @@ PALETTE_INIT( mjderngr ) r = (r << 3) | (r >> 2); g = (g << 3) | (g >> 2); b = (b << 3) | (b >> 2); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/drivers/safarir.c b/src/drivers/safarir.c index 84c9082ef..a349e65bd 100644 --- a/src/drivers/safarir.c +++ b/src/drivers/safarir.c @@ -138,15 +138,15 @@ static unsigned short colortable_source[] = static PALETTE_INIT( safarir ) { - palette_set_color(0, 0x00, 0x00, 0x00); - palette_set_color(1, 0x80, 0x80, 0x80); - palette_set_color(2, 0xff, 0xff, 0xff); - - palette_set_color(3, 0x00, 0x00, 0x00); - palette_set_color(4, 0x00, 0x00, 0x00); - palette_set_color(5, 0x00, 0x00, 0x00); - palette_set_color(6, 0x00, 0x00, 0x00); - palette_set_color(7, 0x00, 0x00, 0x00); + palette_set_color(machine, 0, 0x00, 0x00, 0x00); + palette_set_color(machine, 1, 0x80, 0x80, 0x80); + palette_set_color(machine, 2, 0xff, 0xff, 0xff); + + palette_set_color(machine, 3, 0x00, 0x00, 0x00); + palette_set_color(machine, 4, 0x00, 0x00, 0x00); + palette_set_color(machine, 5, 0x00, 0x00, 0x00); + palette_set_color(machine, 6, 0x00, 0x00, 0x00); + palette_set_color(machine, 7, 0x00, 0x00, 0x00); memcpy(colortable, colortable_source, sizeof(colortable_source)); } diff --git a/src/drivers/sangho.c b/src/drivers/sangho.c index 715034a37..254cfaaca 100644 --- a/src/drivers/sangho.c +++ b/src/drivers/sangho.c @@ -226,7 +226,7 @@ static INTERRUPT_GEN( sangho_interrupt ) static VIDEO_START( sangho ) { - return v9938_init (MODEL_V9938, 0x20000, msx_vdp_interrupt); + return v9938_init (machine, MODEL_V9938, 0x20000, msx_vdp_interrupt); } static MACHINE_DRIVER_START(pzlestar) diff --git a/src/drivers/sbowling.c b/src/drivers/sbowling.c index 1847ac30f..7dac5e650 100644 --- a/src/drivers/sbowling.c +++ b/src/drivers/sbowling.c @@ -324,7 +324,7 @@ static PALETTE_INIT( sbowling ) bit2 = (color_prom[i+0x400] >> 3) & 0x01; r = (int)(outputs_r[ (bit0<<0) | (bit1<<1) | (bit2<<2) ] + 0.5); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/drivers/sbrkout.c b/src/drivers/sbrkout.c index 101fa0b52..20917199e 100644 --- a/src/drivers/sbrkout.c +++ b/src/drivers/sbrkout.c @@ -94,8 +94,8 @@ static MACHINE_RESET( sbrkout ) static PALETTE_INIT( sbrkout ) { - palette_set_color(0,0x00,0x00,0x00); - palette_set_color(1,0xff,0xff,0xff); + palette_set_color(machine,0,0x00,0x00,0x00); + palette_set_color(machine,1,0xff,0xff,0xff); } diff --git a/src/drivers/sbugger.c b/src/drivers/sbugger.c index 1cabac234..22344fd4d 100644 --- a/src/drivers/sbugger.c +++ b/src/drivers/sbugger.c @@ -1,11 +1,63 @@ -/* Space Bugger */ +/* -/* is the rom mapping ok, are the roms good? it jumps to the 0x800 region and I don't have a rom for there, -the only remaining rom has fixed bits, then the game crashes .. */ - -#include "driver.h" - -/* readme info +Space Bugger +Game-A-Tron, 1981 + +TS 20060821: +- there's really huge difference between both sets (code and data). wierd +- wrong colros, it looks like tehre's direct color mapping - bits from attribute ram connected to r/g/b outputs without + use of color prom or color table +- interrupt is generated by 8156 - very old combination chip containing 256*8 RAM (used as stack area), + a timer and 8+8+6 ports. After game start all 8156 ports are set as inputs, timer is working in mode 3 - automatic reload. + TC register is set to 0x7f. Timer input frequency is unknown. Output should be close to 1440 Hz. + + +PCB Layout +---------- + +CPU +2.81 +GAT + |------------------------------------------------------| + | 74LS393 | + | 74LS00 TIP41A CN1| + | | +|-| 74LS32 74LS00 74LS161 | +| | +| 74LS10 CN2| +| 74LS139 74LS240 | +| |-----------| | +| 74LS240 74LS244 | TMP8085 | 74LS04 | +| |-----------|6MHz | +| 74LS244 74LS373 74LS244 DSW(7) 74LS04 | +| |-----------| | +| uPB8216 uPB8216 | TMP8156 | | +| |-----------| | +| 2114 2114 74LS244 U32 | +| | +| 2114 2114 74LS32 U33 U20 | +|-| | + | 2114 2114 74LS138 U34 U21 | + | | + | 2114 2114 74LS138 U35 U22 | + |------------------------------------------------------| +Notes: + All IC's shown. + uPB8216 - NEC uPB8216 4 Bit Bi-directional Bus Driver + 2114 - Hitachi HM572114P-4 1k x4 SRAM + TMP8156 - RIOT, 256 bytes Static RAM with I/O Ports and Timer + TMP8085 - 8085 CPU, clock 3MHz [6/2] + CN1/2 - 10 pin connectors + U20-U22 - Hitachi HM462716G 2k x8 EPROMs + U32-U35 / + + Note, this PCB plugs into a motherboard containing connectors. There is + also a sound and graphics board that plugs into the motherboard as well. + However those PCBs are not available and are therefore not documented. + + + Set 2: +-------- Space Bugger Game-A-Tron 1981 @@ -45,8 +97,11 @@ Sound PCB */ +#include "driver.h" +#include "sound/sn76496.h" - +//arbitrary +#define NUM_INTS_FRAME 24 UINT8* sbugger_videoram, *sbugger_videoram_attr; @@ -60,35 +115,31 @@ WRITE8_HANDLER( sbugger_videoram_w ); static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x37ff) AM_READ(MRA8_ROM) - AM_RANGE(0xc800, 0xcfff) AM_READ(MRA8_RAM) /* video ram */ - - AM_RANGE(0xe000, 0xe0ff) AM_READ(MRA8_RAM) /* sp is set to e0ff */ - + AM_RANGE(0xe000, 0xe0ff) AM_READ(MRA8_RAM) /* sp is set to e0ff = iternal 8156 RAM*/ AM_RANGE(0xf400, 0xffff) AM_READ(MRA8_RAM) - ADDRESS_MAP_END static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x37ff) AM_WRITE(MWA8_ROM) - AM_RANGE(0xc800, 0xcbff) AM_WRITE(sbugger_videoram_attr_w) AM_BASE(&sbugger_videoram_attr) AM_RANGE(0xcc00, 0xcfff) AM_WRITE(sbugger_videoram_w) AM_BASE(&sbugger_videoram) - AM_RANGE(0xe000, 0xe0ff) AM_WRITE(MWA8_RAM) /* sp is set to e0ff */ - AM_RANGE(0xf400, 0xffff) AM_WRITE(MWA8_RAM) - ADDRESS_MAP_END static ADDRESS_MAP_START( readport, ADDRESS_SPACE_IO, 8 ) - AM_RANGE(0xe1, 0xe1) AM_READ(input_port_0_r) - AM_RANGE(0xe2, 0xe2) AM_READ(input_port_1_r) - AM_RANGE(0xe3, 0xe3) AM_READ(input_port_2_r) + AM_RANGE(0xe0, 0xe0) AM_WRITENOP // 8156 command/status reg (write c0 = command START = (start of timer) + AM_RANGE(0xe1, 0xe1) AM_READ(input_port_0_r) //8156 PA + AM_RANGE(0xe2, 0xe2) AM_READ(input_port_1_r) //8156 PB + AM_RANGE(0xe3, 0xe3) AM_READ(input_port_2_r) //8156 PC = 6 bit ! //2 bits tested af f4c6 + AM_RANGE(0xe4, 0xe4) AM_WRITENOP // 8156 timer reg1 (write 7f = CNT length) + AM_RANGE(0xe5, 0xe5) AM_WRITENOP // 8156 timer reg2 (write c0 = timer mode - automatic reload, i.e. single pulse every time TC is reached) + + AM_RANGE(0xe8, 0xe8) AM_WRITE(SN76496_0_w) + AM_RANGE(0xe9, 0xe9) AM_WRITE(SN76496_1_w) ADDRESS_MAP_END -/* there are some port writes */ - /* gfx decode */ static const gfx_layout char16layout = @@ -114,62 +165,55 @@ static const gfx_decode gfxdecodeinfo[] = INPUT_PORTS_START( sbugger ) PORT_START /* 8-bit */ - PORT_DIPNAME( 0x01, 0x01, "E1" ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_2WAY + PORT_DIPNAME( 0x02, 0x02, "PA 1" ) 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_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_2WAY + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x80, 0x80, "PA 7" ) PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START /* 8-bit */ - PORT_DIPNAME( 0x01, 0x01, "E2" ) + PORT_DIPNAME( 0x01, 0x01, "PB 0" ) PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x02, 0x02, "PB 1" ) PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x04, 0x04, "PB 2" ) PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x08, 0x08, "PB 3" ) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x10, 0x10, "PB 4" ) PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x20, 0x20, "PB 5" ) PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPNAME( 0x40, 0x40, "PB 6" ) PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_START /* 8-bit */ - PORT_DIPNAME( 0x01, 0x01, "E3" ) - 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_START /* 6-bit */ + PORT_DIPNAME( 0x03, 0x01, DEF_STR( Difficulty ) ) //enemy speed + PORT_DIPSETTING( 0x00, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x03, DEF_STR( Hardest ) ) + + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Allow_Continue ) ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) + + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) //bonus stage related (code at $f94 & $df8) PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) @@ -178,23 +222,16 @@ INPUT_PORTS_START( sbugger ) 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_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END -/* sound stuff */ - /* machine driver */ static MACHINE_DRIVER_START( sbugger ) MDRV_CPU_ADD(8085A, 6000000/2) /* 3.00 MHz??? */ MDRV_CPU_PROGRAM_MAP(readmem,writemem) MDRV_CPU_IO_MAP(readport,0) - + MDRV_CPU_VBLANK_INT(irq3_line_hold,NUM_INTS_FRAME) MDRV_FRAMES_PER_SECOND(60) MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION) @@ -211,6 +248,14 @@ static MACHINE_DRIVER_START( sbugger ) MDRV_VIDEO_UPDATE(sbugger) /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD_TAG("sn76496.1", SN76496, 3000000) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + + MDRV_SOUND_ADD_TAG("sn76496.2", SN76496, 3000000) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) + MACHINE_DRIVER_END /* rom loading */ @@ -230,7 +275,20 @@ ROM_START( sbugger ) ROM_LOAD( "spbugger.gfx", 0x0000, 0x1000, CRC(d3f345b5) SHA1(a5082ffc3043352e9b731af95770bdd62fb928bf) ) ROM_END -/* game drivers */ +ROM_START( sbuggera ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 8085 Code */ + ROM_LOAD( "bug_g10.u35", 0x0000, 0x0800, CRC(60a3044d) SHA1(5b2be551a84e4a7a35637208a19b3477629f20d9) ) + ROM_LOAD( "bug_c10.u22", 0x0800, 0x0800, CRC(34a829f7) SHA1(135ec2739879c2e47f3c6d4a5196c865b5940a84) ) + ROM_LOAD( "bug_f10.u34", 0x1000, 0x0800, CRC(e2f7a51c) SHA1(ee221f6697021d14838fd6c4aff41678ce62e4ba) ) + ROM_LOAD( "bug_b10.u21", 0x1800, 0x0800, CRC(3c9a467a) SHA1(be64fddc294be38ff4f997e6666aaea15ed7d0e9) ) + ROM_LOAD( "bug_a10.u20", 0x2000, 0x0800, CRC(f6f58aba) SHA1(95bf03b8876ff36f52d93f5f5f9b38021c8b7979) ) + ROM_LOAD( "bug_e10.u33", 0x2800, 0x0800, CRC(fefd9c5e) SHA1(1b0bbf462231c32014d45ec21b105a669665d90d) ) + ROM_LOAD( "bug_d10.u32", 0x3000, 0x0800, BAD_DUMP CRC(c807742f) SHA1(cb5c44ffd6dd184c6a0722003ff6674caf865bee) ) // missing in this set + + ROM_REGION( 0x4000, REGION_GFX1, ROMREGION_DISPOSE ) /* GFX */ + ROM_LOAD( "spbugger.gfx", 0x0000, 0x1000, CRC(d3f345b5) SHA1(a5082ffc3043352e9b731af95770bdd62fb928bf) ) +ROM_END -GAME( 1981, sbugger, 0, sbugger, sbugger, 0, ROT270, "Game-A-Tron", "Space Bugger", GAME_NO_SOUND | GAME_NOT_WORKING ) +GAME( 1981, sbugger, 0, sbugger, sbugger, 0, ROT270, "Game-A-Tron", "Space Bugger (set 1)", GAME_NOT_WORKING ) +GAME( 1981, sbuggera, sbugger, sbugger, sbugger, 0, ROT270, "Game-A-Tron", "Space Bugger (set 2)", GAME_IMPERFECT_COLORS ) diff --git a/src/drivers/scobra.c b/src/drivers/scobra.c index 38fe1ce80..bab6897e3 100644 --- a/src/drivers/scobra.c +++ b/src/drivers/scobra.c @@ -1331,7 +1331,7 @@ static MACHINE_DRIVER_START( moonwar ) MDRV_IMPORT_FROM(type1) /* video hardware */ - MDRV_PALETTE_LENGTH(32+64+2) /* 32 for characters, 64 for stars, 2 for bullets */ + MDRV_PALETTE_LENGTH(32+64+2+1) /* 32 for characters, 64 for stars, 2 for bullets, 1 for bg */ MDRV_PALETTE_INIT(moonwar) MACHINE_DRIVER_END @@ -1419,7 +1419,7 @@ static MACHINE_DRIVER_START( darkplnt ) MDRV_IMPORT_FROM(type2) /* video hardware */ - MDRV_PALETTE_LENGTH(32+2) /* 32 for characters, 2 for bullets */ + MDRV_PALETTE_LENGTH(32+64+2) /* 32 for characters, 64 (buffer) for stars, 2 for bullets */ MDRV_PALETTE_INIT(darkplnt) MDRV_VIDEO_START(darkplnt) @@ -2129,7 +2129,7 @@ GAME( 1982, tazmania, 0, type1, tazmania, scobra, ROT90, "Stern GAME( 1982, tazmani2, tazmania, type2, tazmania, tazmani2, ROT90, "Stern", "Tazz-Mania (set 2)", GAME_SUPPORTS_SAVE ) GAME( 1982, calipso, 0, calipso, calipso, scobra, ROT90, "[Stern] (Tago license)", "Calipso", GAME_SUPPORTS_SAVE ) GAME( 1982, anteater, 0, type1, anteater, anteater, ROT90, "[Stern] (Tago license)", "Anteater", GAME_SUPPORTS_SAVE ) -GAME( 1983, anteatg, anteater, anteatg, anteatg, scramble_ppi, ROT90, "TV-Tuning 2000 (F.E.G. license)", "Ameisenbaer (German)", GAME_SUPPORTS_SAVE ) +GAME( 1983, anteatg, anteater, anteatg, anteatg, scramble_ppi, ROT90, "TV-Tuning (F.E.G. license)", "Ameisenbaer (German)", GAME_SUPPORTS_SAVE ) GAME( 1983, anteatgb, anteater, anteatgb, anteatgb, scramble_ppi, ROT90, "Free Enterprise Games", "The Anteater (UK)", GAME_SUPPORTS_SAVE ) GAME( 1982, rescue, 0, rescue, rescue, rescue, ROT90, "Stern", "Rescue", GAME_SUPPORTS_SAVE ) GAME( 1982, aponow, rescue, rescue, rescue, rescue, ROT90, "bootleg", "Apocaljpse Now", GAME_SUPPORTS_SAVE ) diff --git a/src/drivers/seattle.c b/src/drivers/seattle.c index 56d9cadb2..c68e2882b 100644 --- a/src/drivers/seattle.c +++ b/src/drivers/seattle.c @@ -553,12 +553,12 @@ static MACHINE_RESET( seattle ) cpu_stalled_on_voodoo = FALSE; /* reset either the DCS2 board or the CAGE board */ - if (mame_find_cpu_index("dcs2") != -1) + if (mame_find_cpu_index(machine, "dcs2") != -1) { dcs_reset_w(1); dcs_reset_w(0); } - else if (mame_find_cpu_index("cage") != -1) + else if (mame_find_cpu_index(machine, "cage") != -1) { cage_control_w(0); cage_control_w(3); diff --git a/src/drivers/segac2.c b/src/drivers/segac2.c index 796c761de..56c292ced 100644 --- a/src/drivers/segac2.c +++ b/src/drivers/segac2.c @@ -127,7 +127,7 @@ static UINT8 bloxeed_sound; /* use kludge for bloxeed sound? */ static MACHINE_START( segac2 ) { - if (machine_start_genesis()) + if (machine_start_genesis(machine)) return 1; state_save_register_global_array(misc_io_data); state_save_register_global(prot_write_buf); @@ -139,7 +139,7 @@ static MACHINE_START( segac2 ) MACHINE_RESET( segac2 ) { /* set up interrupts and such */ - machine_reset_genesis(); + machine_reset_genesis(machine); /* determine how many sound banks */ sound_banks = 0; @@ -272,15 +272,12 @@ static WRITE16_HANDLER( palette_w ) newword = paletteram16[offset]; /* up to 8 bits */ - r = ((newword << 4) & 0xf0) | ((newword >> 9) & 0x08); - g = ((newword >> 0) & 0xf0) | ((newword >> 10) & 0x08); - b = ((newword >> 4) & 0xf0) | ((newword >> 11) & 0x08); - r |= r >> 5; - g |= g >> 5; - b |= b >> 5; + r = ((newword << 1) & 0x1e) | ((newword >> 12) & 0x01); + g = ((newword >> 3) & 0x1e) | ((newword >> 13) & 0x01); + b = ((newword >> 7) & 0x1e) | ((newword >> 14) & 0x01); /* set the color */ - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal5bit(r), pal5bit(g), pal5bit(b)); } @@ -2027,19 +2024,17 @@ static DRIVER_INIT( puyopuy2 ) static DRIVER_INIT( potopoto ) { - /* note: this is not the real table; Poto Poto only tests one */ - /* very specific case, so we don't have enough data to provide */ - /* the correct table in its entirety */ + /* 317-0218 */ static const UINT32 table[256/8] = { - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x22222222, 0x22222222, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000 + 0xb33ba22a, 0xa23bb32a, 0xa22aa22a, 0xb32ab32a, + 0xb139a028, 0xa039b128, 0xa028a028, 0xb128b128, + 0x3f3f2e2e, 0x2e3f3f2e, 0x2e2e2e2e, 0x3f2e3f2e, + 0x3d3d2c2c, 0x2c3d3d2c, 0x2c2c2c2c, 0x3d2c3d2c, + 0xdd11ee22, 0xcc11ff22, 0xcc00ee22, 0xdd00ff22, + 0xdf13ec20, 0xce13fd20, 0xce02ec20, 0xdf02fd20, + 0x51156226, 0x40157326, 0x40046226, 0x51047326, + 0x53176024, 0x42177124, 0x42066024, 0x53067124 }; segac2_common_init(table); } diff --git a/src/drivers/segag80r.c b/src/drivers/segag80r.c index b9d1dfc66..435defff6 100644 --- a/src/drivers/segag80r.c +++ b/src/drivers/segag80r.c @@ -882,6 +882,7 @@ static MACHINE_DRIVER_START( spaceod ) MDRV_IMPORT_FROM(g80r_base) /* background board changes */ + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_ALWAYS_UPDATE) MDRV_GFXDECODE(spaceod_gfxdecodeinfo) MDRV_PALETTE_LENGTH(64+64) @@ -1123,7 +1124,7 @@ ROM_START( spaceod ) ROM_LOAD( "spod943a.prom-u3", 0x1800, 0x0800, CRC(0d87a8f3) SHA1(04aaa5f58f4b656d058b116da118bd5731c3fad8) ) ROM_LOAD( "spod944a.prom-u4", 0x2000, 0x0800, CRC(9c79f505) SHA1(219a1ae73711b485d7b97801d8b25f31046826b0) ) ROM_LOAD( "spod945a.prom-u5", 0x2800, 0x0800, CRC(375681e4) SHA1(3c79b43f5e91e8f13788e7f11abdcc33ef12d90a) ) - ROM_LOAD( "spod946a.prom-u6", 0x3000, 0x0800, BAD_DUMP CRC(8ccb4d54) SHA1(d203d93559c08525c332e756e3ebfd66af4fc056) ) + ROM_LOAD( "spod946a.prom-u6", 0x3000, 0x0800, BAD_DUMP CRC(4a27ff64) SHA1(bec51c734dfab2fad1be1ddc992bc954e4a1fc81) ) ROM_LOAD( "spod947a.prom-u7", 0x3800, 0x0800, CRC(6170de1c) SHA1(5939c5a7fbd0d7b73d4d20a6c641753042682293) ) ROM_LOAD( "spod948a.prom-u8", 0x4000, 0x0800, CRC(44fbbc87) SHA1(199b9214a44bda053d711348329cea80209cbaf1) ) ROM_LOAD( "spod949a.prom-u9", 0x4800, 0x0800, CRC(b2705596) SHA1(fc02a929b28985fcf6995aa2ccfb5a361183c1be) ) @@ -1565,7 +1566,7 @@ GAME( 1981, astrob1, astrob, astrob, astrob1, astrob, ROT270, "Sega", "As GAME( 1981, 005, 0, 005, 005, 005, ROT270, "Sega", "005", GAME_IMPERFECT_SOUND ) /* basic G-80 system with individual background boards */ -GAME( 1981, spaceod, 0, spaceod, spaceod, spaceod, ROT270, "Sega", "Space Odyssey (version 2)", GAME_NOT_WORKING ) +GAME( 1981, spaceod, 0, spaceod, spaceod, spaceod, ROT270, "Sega", "Space Odyssey (version 2)", 0 ) GAME( 1981, spaceod2, spaceod, spaceod, spaceod, spaceod, ROT270, "Sega", "Space Odyssey (version 1)", 0 ) GAME( 1982, monsterb, 0, monsterb, monsterb, monsterb, ROT270, "Sega", "Monster Bash", 0 ) diff --git a/src/drivers/segag80v.c b/src/drivers/segag80v.c index 4c8ab3b4f..ff02f0a85 100644 --- a/src/drivers/segag80v.c +++ b/src/drivers/segag80v.c @@ -289,7 +289,7 @@ static READ8_HANDLER( spinner_input_r ) INT8 delta; if (spinner_select & 1) - return readinputportbytag("IN8"); + return readinputportbytag("FC"); /* * The values returned are always increasing. That is, regardless of whether @@ -334,7 +334,7 @@ static READ8_HANDLER( elim4_input_r ) { case 6: /* player 3 & 4 controls */ - result = readinputportbytag("IN8"); + result = readinputportbytag("FC"); break; case 7: /* the 4 coin inputs */ @@ -420,6 +420,7 @@ static ADDRESS_MAP_START( main_portmap, ADDRESS_SPACE_IO, 8 ) AM_RANGE(0xf9, 0xf9) AM_MIRROR(0x04) AM_WRITE(coin_count_w) AM_RANGE(0xf8, 0xfb) AM_READ(mangled_ports_r) + AM_RANGE(0xfc, 0xfc) AM_READ(port_tag_to_handler8("FC")) ADDRESS_MAP_END @@ -431,95 +432,97 @@ ADDRESS_MAP_END *************************************/ INPUT_PORTS_START( g80v_generic ) - PORT_START_TAG("D7") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START_TAG("D6") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(1) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START_TAG("D5") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START_TAG("D4") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) - - PORT_START_TAG("D3") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:1") + PORT_START_TAG("D7D6") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(3) /* P1.5 */ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* n/c */ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* n/c */ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) /* n/c */ + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(3) /* P1.8 */ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.13 */ + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.14 */ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) /* n/c */ + + PORT_START_TAG("D5D4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) /* P1.10 */ + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) /* P1.15 */ + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.16 */ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.17 */ + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.18 */ + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) /* P1.19 */ + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.20 */ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.21 */ + + PORT_START_TAG("D3D2") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:8") PORT_DIPSETTING( 0x01, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:2") + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:7") PORT_DIPSETTING( 0x02, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:3") + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:6") PORT_DIPSETTING( 0x04, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:4") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:5") PORT_DIPSETTING( 0x08, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - - PORT_START_TAG("D2") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:5") + PORT_DIPNAME( 0x10, 0x01, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:4") PORT_DIPSETTING( 0x01, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:6") + PORT_DIPNAME( 0x20, 0x02, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:3") PORT_DIPSETTING( 0x02, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:7") + PORT_DIPNAME( 0x40, 0x04, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:2") PORT_DIPSETTING( 0x04, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:8") + PORT_DIPNAME( 0x80, 0x08, DEF_STR( Unknown )) PORT_DIPLOCATION("SW1:1") PORT_DIPSETTING( 0x08, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - PORT_START_TAG("D1") - PORT_DIPNAME( 0x0f, 0x03, DEF_STR ( Coin_A )) PORT_DIPLOCATION("SW2:1,2,3,4") - PORT_DIPSETTING( 0x00, DEF_STR ( 4C_1C )) - PORT_DIPSETTING( 0x01, DEF_STR ( 3C_1C )) - PORT_DIPSETTING( 0x09, "2 Coins/1 Credit 5/3 6/4" ) - PORT_DIPSETTING( 0x0a, "2 Coins/1 Credit 4/3" ) - PORT_DIPSETTING( 0x02, DEF_STR ( 2C_1C )) - PORT_DIPSETTING( 0x03, DEF_STR ( 1C_1C )) - PORT_DIPSETTING( 0x0b, "1 Coin/1 Credit 5/6" ) - PORT_DIPSETTING( 0x0c, "1 Coin/1 Credit 4/5" ) - PORT_DIPSETTING( 0x0d, "1 Coin/1 Credit 2/3" ) - PORT_DIPSETTING( 0x04, DEF_STR ( 1C_2C )) - PORT_DIPSETTING( 0x0f, "1 Coin/2 Credits 4/9" ) - PORT_DIPSETTING( 0x0e, "1 Coin/2 Credits 5/11" ) - PORT_DIPSETTING( 0x05, DEF_STR ( 1C_3C )) - PORT_DIPSETTING( 0x06, DEF_STR ( 1C_4C )) - PORT_DIPSETTING( 0x07, DEF_STR ( 1C_5C )) - PORT_DIPSETTING( 0x08, DEF_STR ( 1C_6C )) - - PORT_START_TAG("D0") - PORT_DIPNAME( 0x0f, 0x03, DEF_STR ( Coin_B )) PORT_DIPLOCATION("SW2:5,6,7,8") - PORT_DIPSETTING( 0x00, DEF_STR ( 4C_1C )) - PORT_DIPSETTING( 0x01, DEF_STR ( 3C_1C )) + PORT_START_TAG("D1D0") + PORT_DIPNAME( 0x0f, 0x03, DEF_STR( Coin_A )) PORT_DIPLOCATION("SW2:8,7,6,5") + PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C )) + PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C )) PORT_DIPSETTING( 0x09, "2 Coins/1 Credit 5/3 6/4" ) PORT_DIPSETTING( 0x0a, "2 Coins/1 Credit 4/3" ) - PORT_DIPSETTING( 0x02, DEF_STR ( 2C_1C )) - PORT_DIPSETTING( 0x03, DEF_STR ( 1C_1C )) + PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C )) + PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C )) PORT_DIPSETTING( 0x0b, "1 Coin/1 Credit 5/6" ) PORT_DIPSETTING( 0x0c, "1 Coin/1 Credit 4/5" ) PORT_DIPSETTING( 0x0d, "1 Coin/1 Credit 2/3" ) - PORT_DIPSETTING( 0x04, DEF_STR ( 1C_2C )) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_2C )) PORT_DIPSETTING( 0x0f, "1 Coin/2 Credits 4/9" ) PORT_DIPSETTING( 0x0e, "1 Coin/2 Credits 5/11" ) - PORT_DIPSETTING( 0x05, DEF_STR ( 1C_3C )) - PORT_DIPSETTING( 0x06, DEF_STR ( 1C_4C )) - PORT_DIPSETTING( 0x07, DEF_STR ( 1C_5C )) - PORT_DIPSETTING( 0x08, DEF_STR ( 1C_6C )) + PORT_DIPSETTING( 0x05, DEF_STR( 1C_3C )) + PORT_DIPSETTING( 0x06, DEF_STR( 1C_4C )) + PORT_DIPSETTING( 0x07, DEF_STR( 1C_5C )) + PORT_DIPSETTING( 0x08, DEF_STR( 1C_6C )) + PORT_DIPNAME( 0xf0, 0x30, DEF_STR( Coin_B )) PORT_DIPLOCATION("SW2:4,3,2,1") + PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C )) + PORT_DIPSETTING( 0x10, DEF_STR( 3C_1C )) + PORT_DIPSETTING( 0x90, "2 Coins/1 Credit 5/3 6/4" ) + PORT_DIPSETTING( 0xa0, "2 Coins/1 Credit 4/3" ) + PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C )) + PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C )) + PORT_DIPSETTING( 0xb0, "1 Coin/1 Credit 5/6" ) + PORT_DIPSETTING( 0xc0, "1 Coin/1 Credit 4/5" ) + PORT_DIPSETTING( 0xd0, "1 Coin/1 Credit 2/3" ) + PORT_DIPSETTING( 0x40, DEF_STR( 1C_2C )) + PORT_DIPSETTING( 0xf0, "1 Coin/2 Credits 4/9" ) + PORT_DIPSETTING( 0xe0, "1 Coin/2 Credits 5/11" ) + PORT_DIPSETTING( 0x50, DEF_STR( 1C_3C )) + PORT_DIPSETTING( 0x60, DEF_STR( 1C_4C )) + PORT_DIPSETTING( 0x70, DEF_STR( 1C_5C )) + PORT_DIPSETTING( 0x80, DEF_STR( 1C_6C )) + + PORT_START_TAG("FC") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.23 */ + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.24 */ + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.25 */ + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.26 */ + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.27 */ + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.28 */ + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.29 */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.30 */ PORT_START_TAG("SERVICESW") PORT_SERVICE_NO_TOGGLE( 0x01, IP_ACTIVE_HIGH ) @@ -536,20 +539,18 @@ INPUT_PORTS_END INPUT_PORTS_START( elim2 ) PORT_INCLUDE( g80v_generic ) - PORT_MODIFY("D6") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_MODIFY("D7D6") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) - PORT_MODIFY("D5") + PORT_MODIFY("D5D4") PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - PORT_MODIFY("D4") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) - - PORT_MODIFY("D3") + PORT_MODIFY("D3D2") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet )) PORT_DIPLOCATION("SW1:1") PORT_DIPSETTING( 0x01, DEF_STR( Upright )) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail )) @@ -557,42 +558,36 @@ INPUT_PORTS_START( elim2 ) PORT_DIPSETTING( 0x04, "3" ) PORT_DIPSETTING( 0x08, "4" ) PORT_DIPSETTING( 0x0c, "5" ) - - PORT_MODIFY("D2") - PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW1:5,6") + PORT_DIPNAME( 0x30, 0x00, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW1:5,6") PORT_DIPSETTING( 0x00, DEF_STR( Easy )) - PORT_DIPSETTING( 0x01, DEF_STR( Normal )) - PORT_DIPSETTING( 0x02, DEF_STR( Hard )) - PORT_DIPSETTING( 0x03, DEF_STR( Very_Hard )) - PORT_DIPNAME( 0x0c, 0x04, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW1:7,8") - PORT_DIPSETTING( 0x0c, DEF_STR( None )) - PORT_DIPSETTING( 0x08, "10000" ) - PORT_DIPSETTING( 0x04, "20000" ) + PORT_DIPSETTING( 0x10, DEF_STR( Normal )) + PORT_DIPSETTING( 0x20, DEF_STR( Hard )) + PORT_DIPSETTING( 0x30, DEF_STR( Very_Hard )) + PORT_DIPNAME( 0xc0, 0x40, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW1:7,8") + PORT_DIPSETTING( 0xc0, DEF_STR( None )) + PORT_DIPSETTING( 0x80, "10000" ) + PORT_DIPSETTING( 0x40, "20000" ) PORT_DIPSETTING( 0x00, "30000" ) - PORT_START_TAG("IN8") + PORT_MODIFY("FC") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) - PORT_BIT( 0xf8, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END INPUT_PORTS_START( elim2c ) PORT_INCLUDE( elim2 ) - PORT_MODIFY("D6") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_MODIFY("D7D6") + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_MODIFY("D5") + PORT_MODIFY("D5D4") PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_MODIFY("D4") - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) - - PORT_MODIFY("IN8") - PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_MODIFY("FC") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) @@ -603,25 +598,21 @@ INPUT_PORTS_END INPUT_PORTS_START( elim4 ) PORT_INCLUDE( g80v_generic ) - PORT_MODIFY("D7") + PORT_MODIFY("D7D6") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM(elim4_joint_coin_r, 0) /* combination of all four coin inputs */ + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - PORT_MODIFY("D6") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) - - PORT_MODIFY("D5") + PORT_MODIFY("D5D4") PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) - PORT_MODIFY("D4") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) - - PORT_MODIFY("D3") + PORT_MODIFY("D3D2") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet )) PORT_DIPLOCATION("SW1:1") PORT_DIPSETTING( 0x01, DEF_STR( Upright )) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail )) @@ -629,20 +620,18 @@ INPUT_PORTS_START( elim4 ) PORT_DIPSETTING( 0x04, "3" ) PORT_DIPSETTING( 0x08, "4" ) PORT_DIPSETTING( 0x0c, "5" ) - - PORT_MODIFY("D2") - PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW1:5,6") + PORT_DIPNAME( 0x30, 0x00, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW1:5,6") PORT_DIPSETTING( 0x00, DEF_STR( Easy )) - PORT_DIPSETTING( 0x01, DEF_STR( Normal )) - PORT_DIPSETTING( 0x02, DEF_STR( Hard )) - PORT_DIPSETTING( 0x03, DEF_STR( Very_Hard )) - PORT_DIPNAME( 0x0c, 0x04, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW1:7,8") - PORT_DIPSETTING( 0x0c, DEF_STR( None )) - PORT_DIPSETTING( 0x08, "10000" ) - PORT_DIPSETTING( 0x04, "20000" ) + PORT_DIPSETTING( 0x10, DEF_STR( Normal )) + PORT_DIPSETTING( 0x20, DEF_STR( Hard )) + PORT_DIPSETTING( 0x30, DEF_STR( Very_Hard )) + PORT_DIPNAME( 0xc0, 0x40, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW1:7,8") + PORT_DIPSETTING( 0xc0, DEF_STR( None )) + PORT_DIPSETTING( 0x80, "10000" ) + PORT_DIPSETTING( 0x40, "20000" ) PORT_DIPSETTING( 0x00, "30000" ) - PORT_MODIFY("D1") + PORT_MODIFY("D1D0") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown )) PORT_DIPLOCATION("SW2:1") PORT_DIPSETTING( 0x01, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) @@ -655,22 +644,20 @@ INPUT_PORTS_START( elim4 ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown )) PORT_DIPLOCATION("SW2:4") PORT_DIPSETTING( 0x08, DEF_STR( Off )) PORT_DIPSETTING( 0x00, DEF_STR( On )) - - PORT_MODIFY("D0") - PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown )) PORT_DIPLOCATION("SW2:5") + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown )) PORT_DIPLOCATION("SW2:5") PORT_DIPSETTING( 0x00, DEF_STR( Off )) - PORT_DIPSETTING( 0x01, DEF_STR( On )) - PORT_DIPNAME( 0x0e, 0x00, DEF_STR( Coin_A )) PORT_DIPLOCATION("SW2:6,7,8") - PORT_DIPSETTING( 0x0e, DEF_STR( 8C_1C )) - PORT_DIPSETTING( 0x0c, DEF_STR( 7C_1C )) - PORT_DIPSETTING( 0x0a, DEF_STR( 6C_1C )) - PORT_DIPSETTING( 0x08, DEF_STR( 5C_1C )) - PORT_DIPSETTING( 0x06, DEF_STR( 4C_1C )) - PORT_DIPSETTING( 0x04, DEF_STR( 3C_1C )) - PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C )) + PORT_DIPSETTING( 0x10, DEF_STR( On )) + PORT_DIPNAME( 0xe0, 0x00, DEF_STR( Coin_A )) PORT_DIPLOCATION("SW2:6,7,8") + PORT_DIPSETTING( 0xe0, DEF_STR( 8C_1C )) + PORT_DIPSETTING( 0xc0, DEF_STR( 7C_1C )) + PORT_DIPSETTING( 0xa0, DEF_STR( 6C_1C )) + PORT_DIPSETTING( 0x80, DEF_STR( 5C_1C )) + PORT_DIPSETTING( 0x60, DEF_STR( 4C_1C )) + PORT_DIPSETTING( 0x40, DEF_STR( 3C_1C )) + PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C )) PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C )) - PORT_START_TAG("IN8") + PORT_MODIFY("FC") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(4) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(4) @@ -692,17 +679,15 @@ INPUT_PORTS_END INPUT_PORTS_START( spacfury ) PORT_INCLUDE( g80v_generic ) - PORT_MODIFY("D5") + PORT_MODIFY("D5D4") PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_MODIFY("D4") - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) - - PORT_MODIFY("D3") + PORT_MODIFY("D3D2") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet )) PORT_DIPLOCATION("SW1:1") PORT_DIPSETTING( 0x01, DEF_STR( Upright )) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail )) @@ -714,20 +699,18 @@ INPUT_PORTS_START( spacfury ) PORT_DIPSETTING( 0x04, "3" ) PORT_DIPSETTING( 0x08, "4" ) PORT_DIPSETTING( 0x0c, "5" ) - - PORT_MODIFY("D2") - PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW1:5,6") + PORT_DIPNAME( 0x30, 0x00, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW1:5,6") PORT_DIPSETTING( 0x00, DEF_STR( Easy )) - PORT_DIPSETTING( 0x01, DEF_STR( Normal )) - PORT_DIPSETTING( 0x02, DEF_STR( Hard )) - PORT_DIPSETTING( 0x03, DEF_STR( Very_Hard )) - PORT_DIPNAME( 0x0c, 0x08, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW1:7,8") + PORT_DIPSETTING( 0x10, DEF_STR( Normal )) + PORT_DIPSETTING( 0x20, DEF_STR( Hard )) + PORT_DIPSETTING( 0x30, DEF_STR( Very_Hard )) + PORT_DIPNAME( 0xc0, 0x80, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW1:7,8") PORT_DIPSETTING( 0x00, "10000" ) - PORT_DIPSETTING( 0x04, "20000" ) - PORT_DIPSETTING( 0x08, "30000" ) - PORT_DIPSETTING( 0x0c, "40000" ) + PORT_DIPSETTING( 0x40, "20000" ) + PORT_DIPSETTING( 0x80, "30000" ) + PORT_DIPSETTING( 0xc0, "40000" ) - PORT_START_TAG("IN8") + PORT_MODIFY("FC") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) @@ -738,7 +721,7 @@ INPUT_PORTS_END INPUT_PORTS_START( zektor ) PORT_INCLUDE( g80v_generic ) - PORT_MODIFY("D3") + PORT_MODIFY("D3D2") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet )) PORT_DIPLOCATION("SW1:1") PORT_DIPSETTING( 0x01, DEF_STR( Upright )) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail )) @@ -750,25 +733,22 @@ INPUT_PORTS_START( zektor ) PORT_DIPSETTING( 0x04, "3" ) PORT_DIPSETTING( 0x08, "4" ) PORT_DIPSETTING( 0x0c, "5" ) - - PORT_MODIFY("D2") - PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW1:5,6") + PORT_DIPNAME( 0x30, 0x00, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW1:5,6") PORT_DIPSETTING( 0x00, DEF_STR( Easy )) - PORT_DIPSETTING( 0x01, DEF_STR( Normal )) - PORT_DIPSETTING( 0x02, DEF_STR( Hard )) - PORT_DIPSETTING( 0x03, DEF_STR( Very_Hard )) - PORT_DIPNAME( 0x0c, 0x08, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW1:7,8") + PORT_DIPSETTING( 0x10, DEF_STR( Normal )) + PORT_DIPSETTING( 0x20, DEF_STR( Hard )) + PORT_DIPSETTING( 0x30, DEF_STR( Very_Hard )) + PORT_DIPNAME( 0xc0, 0x80, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW1:7,8") PORT_DIPSETTING( 0x00, DEF_STR( None )) - PORT_DIPSETTING( 0x0c, "10000" ) - PORT_DIPSETTING( 0x08, "20000" ) - PORT_DIPSETTING( 0x04, "30000" ) + PORT_DIPSETTING( 0xc0, "10000" ) + PORT_DIPSETTING( 0x80, "20000" ) + PORT_DIPSETTING( 0x40, "30000" ) - PORT_START_TAG("IN8") + PORT_MODIFY("FC") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_START_TAG("SPINNER") PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(3) PORT_RESET @@ -778,7 +758,7 @@ INPUT_PORTS_END INPUT_PORTS_START( tacscan ) PORT_INCLUDE( g80v_generic ) - PORT_MODIFY("D3") + PORT_MODIFY("D3D2") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet )) PORT_DIPLOCATION("SW1:1") PORT_DIPSETTING( 0x01, DEF_STR( Upright )) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail )) @@ -790,25 +770,22 @@ INPUT_PORTS_START( tacscan ) PORT_DIPSETTING( 0x04, "4" ) PORT_DIPSETTING( 0x08, "6" ) PORT_DIPSETTING( 0x0c, "8" ) - - PORT_MODIFY("D2") - PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW1:5,6") + PORT_DIPNAME( 0x30, 0x00, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW1:5,6") PORT_DIPSETTING( 0x00, DEF_STR( Easy )) - PORT_DIPSETTING( 0x01, DEF_STR( Normal )) - PORT_DIPSETTING( 0x02, DEF_STR( Hard )) - PORT_DIPSETTING( 0x03, DEF_STR( Very_Hard )) - PORT_DIPNAME( 0x0c, 0x08, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW1:7,8") + PORT_DIPSETTING( 0x10, DEF_STR( Normal )) + PORT_DIPSETTING( 0x20, DEF_STR( Hard )) + PORT_DIPSETTING( 0x30, DEF_STR( Very_Hard )) + PORT_DIPNAME( 0xc0, 0x80, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW1:7,8") PORT_DIPSETTING( 0x00, DEF_STR( None )) - PORT_DIPSETTING( 0x0c, "10000" ) - PORT_DIPSETTING( 0x08, "20000" ) - PORT_DIPSETTING( 0x04, "30000" ) + PORT_DIPSETTING( 0xc0, "10000" ) + PORT_DIPSETTING( 0x80, "20000" ) + PORT_DIPSETTING( 0x40, "30000" ) - PORT_START_TAG("IN8") + PORT_MODIFY("FC") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON2 ) - PORT_BIT( 0xf0, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_START_TAG("SPINNER") PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_RESET @@ -818,7 +795,7 @@ INPUT_PORTS_END INPUT_PORTS_START( startrek ) PORT_INCLUDE( g80v_generic ) - PORT_MODIFY("D3") + PORT_MODIFY("D3D2") PORT_DIPNAME( 0x01, 0x01, DEF_STR( Cabinet )) PORT_DIPLOCATION("SW1:1") PORT_DIPSETTING( 0x01, DEF_STR( Upright )) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail )) @@ -830,27 +807,24 @@ INPUT_PORTS_START( startrek ) PORT_DIPSETTING( 0x04, "2" ) PORT_DIPSETTING( 0x08, "3" ) PORT_DIPSETTING( 0x0c, "4" ) - - PORT_MODIFY("D2") - PORT_DIPNAME( 0x03, 0x00, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW1:5,6") + PORT_DIPNAME( 0x30, 0x00, DEF_STR( Difficulty )) PORT_DIPLOCATION("SW1:5,6") PORT_DIPSETTING( 0x00, DEF_STR( Easy )) - PORT_DIPSETTING( 0x01, DEF_STR( Normal )) - PORT_DIPSETTING( 0x02, DEF_STR( Hard )) - PORT_DIPSETTING( 0x03, "Tournament" ) - PORT_DIPNAME( 0x0c, 0x08, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW1:7,8") + PORT_DIPSETTING( 0x10, DEF_STR( Normal )) + PORT_DIPSETTING( 0x20, DEF_STR( Hard )) + PORT_DIPSETTING( 0x30, "Tournament" ) + PORT_DIPNAME( 0xc0, 0x80, DEF_STR( Bonus_Life )) PORT_DIPLOCATION("SW1:7,8") PORT_DIPSETTING( 0x00, "10000" ) - PORT_DIPSETTING( 0x04, "20000" ) - PORT_DIPSETTING( 0x08, "30000" ) - PORT_DIPSETTING( 0x0c, "40000" ) + PORT_DIPSETTING( 0x40, "20000" ) + PORT_DIPSETTING( 0x80, "30000" ) + PORT_DIPSETTING( 0xc0, "40000" ) - PORT_START_TAG("IN8") + PORT_MODIFY("FC") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON4 ) - PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_START_TAG("SPINNER") PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_RESET @@ -1373,9 +1347,6 @@ DRIVER_INIT( elim2 ) has_usb = FALSE; memory_install_write8_handler(0, ADDRESS_SPACE_IO, 0x3e, 0x3e, 0, 0, elim1_sh_w); memory_install_write8_handler(0, ADDRESS_SPACE_IO, 0x3f, 0x3f, 0, 0, elim2_sh_w); - - /* configure inputs */ - memory_install_read8_handler(0, ADDRESS_SPACE_IO, 0xfc, 0xfc, 0, 0, port_tag_to_handler8("IN8")); } @@ -1406,9 +1377,6 @@ DRIVER_INIT( spacfury ) memory_install_write8_handler(0, ADDRESS_SPACE_IO, 0x3b, 0x3b, 0, 0, sega_speech_control_w); memory_install_write8_handler(0, ADDRESS_SPACE_IO, 0x3e, 0x3e, 0, 0, spacfury1_sh_w); memory_install_write8_handler(0, ADDRESS_SPACE_IO, 0x3f, 0x3f, 0, 0, spacfury2_sh_w); - - /* configure inputs */ - memory_install_read8_handler(0, ADDRESS_SPACE_IO, 0xfc, 0xfc, 0, 0, port_tag_to_handler8("IN8")); } diff --git a/src/drivers/segahang.c b/src/drivers/segahang.c index 2cd477dcf..05f16c067 100644 --- a/src/drivers/segahang.c +++ b/src/drivers/segahang.c @@ -88,7 +88,7 @@ static void hangon_generic_init(void) static void suspend_i8751(ATTR_UNUSED int param) { - cpunum_suspend(mame_find_cpu_index("mcu"), SUSPEND_REASON_DISABLE, 1); + cpunum_suspend(mame_find_cpu_index(Machine, "mcu"), SUSPEND_REASON_DISABLE, 1); } diff --git a/src/drivers/segas16a.c b/src/drivers/segas16a.c index cc46b0caf..35bce45c0 100644 --- a/src/drivers/segas16a.c +++ b/src/drivers/segas16a.c @@ -201,10 +201,10 @@ static ppi8255_interface single_ppi_intf = * *************************************/ -static void system16a_generic_init(void) +static void system16a_generic_init(running_machine *machine) { /* call the generic init */ - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); /* init the FD1094 */ fd1094_driver_init(); @@ -222,7 +222,7 @@ static void system16a_generic_init(void) static void suspend_i8751(ATTR_UNUSED int param) { - cpunum_suspend(mame_find_cpu_index("mcu"), SUSPEND_REASON_DISABLE, 1); + cpunum_suspend(mame_find_cpu_index(Machine, "mcu"), SUSPEND_REASON_DISABLE, 1); } @@ -1643,10 +1643,10 @@ ROM_START( aceattaa ) ROM_LOAD( "7751.bin", 0x0000, 0x0400, CRC(6a9534fc) SHA1(67ad94674db5c2aab75785668f610f6f4eccd158) ) /* 7751 - U34 */ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* 7751 sound data */ - ROM_LOAD( "epr-11579.1", 0x0000, 0x8000, CRC(1a994135) SHA1(f42444521a878d32b189876f8854f6363e1b353b) ) - ROM_LOAD( "epr-11580.2", 0x0000, 0x8000, CRC(961646ed) SHA1(4c8f87a10ffd7035145dedba86deb373368b0e49) ) - ROM_LOAD( "epr-11581.4", 0x0000, 0x8000, CRC(d271a6e5) SHA1(de303f70abfa28e599e5eb0c2b314f43faa1b484) ) - ROM_LOAD( "epr-11582.5", 0x0000, 0x8000, CRC(bcbe3d8a) SHA1(2e4bb0ebffdd594b192c5b854ea425029d92fdb1) ) + ROM_LOAD( "epr-11579.1", 0x00000, 0x8000, CRC(1a994135) SHA1(f42444521a878d32b189876f8854f6363e1b353b) ) + ROM_LOAD( "epr-11580.2", 0x08000, 0x8000, CRC(961646ed) SHA1(4c8f87a10ffd7035145dedba86deb373368b0e49) ) + ROM_LOAD( "epr-11581.4", 0x10000, 0x8000, CRC(d271a6e5) SHA1(de303f70abfa28e599e5eb0c2b314f43faa1b484) ) + ROM_LOAD( "epr-11582.5", 0x18000, 0x8000, CRC(bcbe3d8a) SHA1(2e4bb0ebffdd594b192c5b854ea425029d92fdb1) ) ROM_END /************************************************************************************************************************** @@ -2434,10 +2434,10 @@ ROM_START( sjryuko1 ) ROM_LOAD( "7751.bin", 0x0000, 0x0400, CRC(6a9534fc) SHA1(67ad94674db5c2aab75785668f610f6f4eccd158) ) /* 7751 - U34 */ ROM_REGION( 0x20000, REGION_SOUND1, 0 ) /* 7751 sound data */ - ROM_LOAD( "epr12228.1", 0x0000, 0x8000, CRC(6b2e6aef) SHA1(64ae6ec327c32cdb877a493ebfe11af15e2388ac) ) - ROM_LOAD( "epr12229.2", 0x0000, 0x8000, CRC(b7aa015c) SHA1(0ef023f73722e27180c271b207a5097220f40b5e) ) - ROM_LOAD( "epr12230.4", 0x0000, 0x8000, CRC(d0f61fd4) SHA1(e6f29459d7395122f26957f56e38926aebd9004c) ) - ROM_LOAD( "epr12231.5", 0x0000, 0x8000, CRC(780bdc57) SHA1(8c859043bba389292604385b88c743728180f9a9) ) + ROM_LOAD( "epr12228.1", 0x00000, 0x8000, CRC(6b2e6aef) SHA1(64ae6ec327c32cdb877a493ebfe11af15e2388ac) ) + ROM_LOAD( "epr12229.2", 0x08000, 0x8000, CRC(b7aa015c) SHA1(0ef023f73722e27180c271b207a5097220f40b5e) ) + ROM_LOAD( "epr12230.4", 0x10000, 0x8000, CRC(d0f61fd4) SHA1(e6f29459d7395122f26957f56e38926aebd9004c) ) + ROM_LOAD( "epr12231.5", 0x18000, 0x8000, CRC(780bdc57) SHA1(8c859043bba389292604385b88c743728180f9a9) ) ROM_END @@ -2660,14 +2660,14 @@ ROM_END static DRIVER_INIT( generic_16a ) { - system16a_generic_init(); + system16a_generic_init(machine); } static DRIVER_INIT( afighter ) { void fd1089_decrypt_0018(void); - system16a_generic_init(); + system16a_generic_init(machine); fd1089_decrypt_0018(); } @@ -2675,7 +2675,7 @@ static DRIVER_INIT( afighter ) static DRIVER_INIT( alexkid1 ) { void fd1089_decrypt_alexkidd(void); - system16a_generic_init(); + system16a_generic_init(machine); fd1089_decrypt_alexkidd(); } @@ -2683,14 +2683,14 @@ static DRIVER_INIT( alexkid1 ) static DRIVER_INIT( aliensy1 ) { void fd1089_decrypt_0033(void); - system16a_generic_init(); + system16a_generic_init(machine); fd1089_decrypt_0033(); } static DRIVER_INIT( bodyslam ) { - system16a_generic_init(); + system16a_generic_init(machine); i8751_vblank_hook = bodyslam_i8751_sim; } @@ -2699,14 +2699,14 @@ static DRIVER_INIT( mjleague ) { UINT16 *rombase = (UINT16 *)memory_region(REGION_CPU1); rombase[0xbd42/2] = (rombase[0xbd42/2] & 0x00ff) | 0x6600; - system16a_generic_init(); + system16a_generic_init(machine); custom_io_r = mjleague_custom_io_r; } static DRIVER_INIT( quartet ) { - system16a_generic_init(); + system16a_generic_init(machine); i8751_vblank_hook = quartet_i8751_sim; } @@ -2714,7 +2714,7 @@ static DRIVER_INIT( quartet ) static DRIVER_INIT( sdi ) { void fd1089_decrypt_0027(void); - system16a_generic_init(); + system16a_generic_init(machine); fd1089_decrypt_0027(); custom_io_r = sdi_custom_io_r; } @@ -2723,7 +2723,7 @@ static DRIVER_INIT( sdi ) static DRIVER_INIT( sjryukoa ) { void fd1089_decrypt_5021(void); - system16a_generic_init(); + system16a_generic_init(machine); fd1089_decrypt_5021(); custom_io_r = sjryuko_custom_io_r; lamp_changed_w = sjryuko_lamp_changed_w; @@ -2733,7 +2733,7 @@ static DRIVER_INIT( sjryukoa ) static DRIVER_INIT( timesca1 ) { void fd1089_decrypt_0024(void); - system16a_generic_init(); + system16a_generic_init(machine); fd1089_decrypt_0024(); } diff --git a/src/drivers/segas16b.c b/src/drivers/segas16b.c index 82fc9a852..87465ebae 100644 --- a/src/drivers/segas16b.c +++ b/src/drivers/segas16b.c @@ -1009,13 +1009,13 @@ static void system16b_generic_init(int _rom_board) disable_screen_blanking = 0; /* see if we have a sound CPU and a UPD7759 chip */ - has_sound_cpu = (mame_find_cpu_index("sound") != -1); + has_sound_cpu = (mame_find_cpu_index(Machine, "sound") != -1); } static void suspend_i8751(ATTR_UNUSED int param) { - cpunum_suspend(mame_find_cpu_index("mcu"), SUSPEND_REASON_DISABLE, 1); + cpunum_suspend(mame_find_cpu_index(Machine, "mcu"), SUSPEND_REASON_DISABLE, 1); } @@ -1057,7 +1057,7 @@ static void atomicp_sound_irq(int param) static MACHINE_RESET( atomicp ) { - machine_reset_system16b(); + machine_reset_system16b(machine); timer_pulse(TIME_IN_HZ(atomicp_sound_rate), 0, atomicp_sound_irq); } @@ -5820,28 +5820,28 @@ static DRIVER_INIT( generic_5797 ) static DRIVER_INIT( aliensy3_5358 ) { void fd1089_decrypt_0033(void); - init_generic_5358(); + init_generic_5358(machine); fd1089_decrypt_0033(); } static DRIVER_INIT( altbeast_5521 ) { - init_generic_5521(); + init_generic_5521(machine); i8751_vblank_hook = altbeast_i8751_sim; } static DRIVER_INIT( altbeasj_5521 ) { - init_generic_5521(); + init_generic_5521(machine); i8751_vblank_hook = altbeasj_i8751_sim; } static DRIVER_INIT( altbeas5_5521 ) { - init_generic_5521(); + init_generic_5521(machine); i8751_vblank_hook = altbeas5_i8751_sim; } @@ -5849,7 +5849,7 @@ static DRIVER_INIT( altbeas5_5521 ) static DRIVER_INIT( altbeas4_5521 ) { extern void mc8123_decrypt_0066(void); - init_generic_5521(); + init_generic_5521(machine); mc8123_decrypt_0066(); } @@ -5857,7 +5857,7 @@ static DRIVER_INIT( altbeas4_5521 ) static DRIVER_INIT( aurail1_5704 ) { void fd1089_decrypt_0168(void); - init_generic_5704(); + init_generic_5704(machine); fd1089_decrypt_0168(); } @@ -5865,14 +5865,14 @@ static DRIVER_INIT( aurail1_5704 ) static DRIVER_INIT( aurailj_5704 ) { void fd1089_decrypt_0167(void); - init_generic_5704(); + init_generic_5704(machine); fd1089_decrypt_0167(); } static DRIVER_INIT( ddux_5704 ) { - init_generic_5704(); + init_generic_5704(machine); i8751_vblank_hook = ddux_i8751_sim; } @@ -5880,7 +5880,7 @@ static DRIVER_INIT( ddux_5704 ) static DRIVER_INIT( dunkshot_5358 ) { void fd1089_decrypt_0022(void); - init_generic_5358(); + init_generic_5358(machine); fd1089_decrypt_0022(); custom_io_r = dunkshot_custom_io_r; } @@ -5888,7 +5888,7 @@ static DRIVER_INIT( dunkshot_5358 ) static DRIVER_INIT( goldnaxe_5704 ) { - init_generic_5704(); + init_generic_5704(machine); goldnaxe_i8751_init(); i8751_vblank_hook = goldnaxe_i8751_sim; } @@ -5896,7 +5896,7 @@ static DRIVER_INIT( goldnaxe_5704 ) static DRIVER_INIT( goldnaxe_5797 ) { - init_generic_5797(); + init_generic_5797(machine); goldnaxe_i8751_init(); i8751_vblank_hook = goldnaxe_i8751_sim; } @@ -5904,7 +5904,7 @@ static DRIVER_INIT( goldnaxe_5797 ) static DRIVER_INIT( hwchamp_5521 ) { - init_generic_5521(); + init_generic_5521(machine); custom_io_r = hwchamp_custom_io_r; custom_io_w = hwchamp_custom_io_w; } @@ -5912,14 +5912,14 @@ static DRIVER_INIT( hwchamp_5521 ) static DRIVER_INIT( sdi_5358 ) { - init_generic_5358(); + init_generic_5358(machine); custom_io_r = sdi_custom_io_r; } static DRIVER_INIT( defense_5358 ) { void fd1089_decrypt_0028(void); - init_generic_5358(); + init_generic_5358(machine); fd1089_decrypt_0028(); custom_io_r = sdi_custom_io_r; } @@ -5928,7 +5928,7 @@ static DRIVER_INIT( defense_5358 ) static DRIVER_INIT( sjryuko_5358 ) { void fd1089_decrypt_5021(void); - init_generic_5358(); + init_generic_5358(machine); fd1089_decrypt_5021(); custom_io_r = sjryuko_custom_io_r; custom_io_w = sjryuko_custom_io_w; @@ -5937,34 +5937,34 @@ static DRIVER_INIT( sjryuko_5358 ) static DRIVER_INIT( passshtj_5358 ) { - init_generic_5358(); + init_generic_5358(machine); custom_io_r = passshtj_custom_io_r; } static DRIVER_INIT( tturf_5704 ) { - init_generic_5704(); + init_generic_5704(machine); i8751_vblank_hook = tturf_i8751_sim; } static DRIVER_INIT( tturf_5358 ) { - init_generic_5358(); + init_generic_5358(machine); i8751_vblank_hook = tturf_i8751_sim; } static DRIVER_INIT( wb3_5704 ) { - init_generic_5704(); + init_generic_5704(machine); i8751_vblank_hook = wb3_i8751_sim; } static DRIVER_INIT( wrestwar_8751 ) { - init_generic_5704(); + init_generic_5704(machine); i8751_vblank_hook = wrestwar_i8751_sim; } diff --git a/src/drivers/segas18.c b/src/drivers/segas18.c index 30cafe77e..d70ebd98f 100644 --- a/src/drivers/segas18.c +++ b/src/drivers/segas18.c @@ -488,7 +488,7 @@ static VIDEO_UPDATE( lghost ) int y2 = readinputportbytag("GUNY2"); int x3 = readinputportbytag("GUNX3"); int y3 = readinputportbytag("GUNY3"); - video_update_system18(screen, bitmap, cliprect); + video_update_system18(machine, screen, bitmap, cliprect); draw_crosshair(bitmap, x1 * (Machine->screen[0].width - 1) / 255, y1 * (Machine->screen[0].height - 1) / 255, cliprect, 0); draw_crosshair(bitmap, x2 * (Machine->screen[0].width - 1) / 255, y2 * (Machine->screen[0].height - 1) / 255, cliprect, 1); draw_crosshair(bitmap, x3 * (Machine->screen[0].width - 1) / 255, y3 * (Machine->screen[0].height - 1) / 255, cliprect, 2); @@ -2237,20 +2237,20 @@ static DRIVER_INIT( generic_5987 ) static DRIVER_INIT( ddcrew ) { - init_generic_5987(); + init_generic_5987(machine); custom_io_r = ddcrew_custom_io_r; } static DRIVER_INIT( lghost ) { - init_generic_5987(); + init_generic_5987(machine); custom_io_r = lghost_custom_io_r; custom_io_w = lghost_custom_io_w; } static DRIVER_INIT( wwally ) { - init_generic_5987(); + init_generic_5987(machine); custom_io_r = wwally_custom_io_r; custom_io_w = wwally_custom_io_w; } diff --git a/src/drivers/segas32.c b/src/drivers/segas32.c index 56482bff9..a45ef977a 100644 --- a/src/drivers/segas32.c +++ b/src/drivers/segas32.c @@ -800,7 +800,7 @@ static WRITE16_HANDLER( random_number_16_w ) static READ16_HANDLER( random_number_16_r ) { - return mame_rand(); + return mame_rand(Machine); } static WRITE32_HANDLER( random_number_32_w ) @@ -810,7 +810,7 @@ static WRITE32_HANDLER( random_number_32_w ) static READ32_HANDLER( random_number_32_r ) { - return mame_rand() ^ (mame_rand() << 16); + return mame_rand(Machine) ^ (mame_rand(Machine) << 16); } diff --git a/src/drivers/segaxbd.c b/src/drivers/segaxbd.c index 3d9ac780a..374860896 100644 --- a/src/drivers/segaxbd.c +++ b/src/drivers/segaxbd.c @@ -449,7 +449,7 @@ static VIDEO_UPDATE( loffire ) int y1 = readinputportbytag("ADC1"); int x2 = readinputportbytag("ADC2"); int y2 = readinputportbytag("ADC3"); - video_update_xboard(screen, bitmap, cliprect); + video_update_xboard(machine, screen, bitmap, cliprect); draw_crosshair(bitmap, x1 * (Machine->screen[0].width - 1) / 255, y1 * (Machine->screen[0].height - 1) / 255, cliprect, 0); draw_crosshair(bitmap, x2 * (Machine->screen[0].width - 1) / 255, y2 * (Machine->screen[0].height - 1) / 255, cliprect, 1); return 0; @@ -2229,110 +2229,113 @@ ROM_END /************************************************************************************************************************** ************************************************************************************************************************** ************************************************************************************************************************** - GP Rider, Sega X-board + GP Rider (World), Sega X-board CPU: FD1094 (317-0163) + Custom Chip 315-5304 (IC 127) + IC BD Number: 834-7626-03 (roms are "MPR") / 834-7626-05 (roms are "EPR") */ -/* we have a key for this set but no prgroms */ ROM_START( gprider ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "prg1", 0x00001, 0x20000, NO_DUMP ) - ROM_LOAD16_BYTE( "prg2", 0x00000, 0x20000, NO_DUMP ) + ROM_LOAD16_BYTE( "epr-13408.ic63", 0x00001, 0x20000, NO_DUMP ) /* we have a key for this set but no program roms */ + ROM_LOAD16_BYTE( "epr-13409.ic58", 0x00000, 0x20000, NO_DUMP ) ROM_REGION( 0x2000, REGION_USER1, 0 ) /* decryption key */ ROM_LOAD( "317-0163.key", 0x0000, 0x2000, CRC(fb3fe94a) SHA1(88a928b15ce676e6fce5de09df130013316e563c) ) ROM_REGION( 0x80000, REGION_CPU2, 0 ) /* 2nd 68000 code */ - ROM_LOAD16_BYTE( "epr13395.bin", 0x00000, 0x20000,CRC(d6ccfac7) SHA1(9287ab08600163a0d9bd33618c629f99391316bd) ) - ROM_LOAD16_BYTE( "epr13394.bin", 0x00001, 0x20000,CRC(914a55ec) SHA1(84fe1df12478990418b46b6800425e5599e9eff9) ) - ROM_LOAD16_BYTE( "epr13393.bin", 0x40000, 0x20000,CRC(08d023cc) SHA1(d008d57e494f484a1a84896065d53fb9b1d8d60e) ) - ROM_LOAD16_BYTE( "epr13392.bin", 0x40001, 0x20000,CRC(f927cd42) SHA1(67eab328c1fb878fe3d086d0639f5051b135a037)) + ROM_LOAD16_BYTE( "epr-13395.ic20", 0x00000, 0x20000,CRC(d6ccfac7) SHA1(9287ab08600163a0d9bd33618c629f99391316bd) ) + ROM_LOAD16_BYTE( "epr-13394.ic29", 0x00001, 0x20000,CRC(914a55ec) SHA1(84fe1df12478990418b46b6800425e5599e9eff9) ) + ROM_LOAD16_BYTE( "epr-13393.ic21", 0x40000, 0x20000,CRC(08d023cc) SHA1(d008d57e494f484a1a84896065d53fb9b1d8d60e) ) + ROM_LOAD16_BYTE( "epr-13392.ic30", 0x40001, 0x20000,CRC(f927cd42) SHA1(67eab328c1fb878fe3d086d0639f5051b135a037) ) ROM_REGION( 0x30000, REGION_GFX1, ROMREGION_DISPOSE ) /* tiles */ - ROM_LOAD( "epr13383.bin", 0x00000, 0x10000, CRC(24f897a7) SHA1(68ba17067d90f07bb5a549017be4773b33ae81d0) ) - ROM_LOAD( "epr13384.bin", 0x10000, 0x10000, CRC(fe8238bd) SHA1(601910bd86536e6b08f5308b298c8f01fa60f233) ) - ROM_LOAD( "epr13385.bin", 0x20000, 0x10000, CRC(6df1b995) SHA1(5aab19b87a9ef162c30ccf5974cb795e37dba91f) ) + ROM_LOAD( "epr-13383.ic154", 0x00000, 0x10000, CRC(24f897a7) SHA1(68ba17067d90f07bb5a549017be4773b33ae81d0) ) + ROM_LOAD( "epr-13384.ic153", 0x10000, 0x10000, CRC(fe8238bd) SHA1(601910bd86536e6b08f5308b298c8f01fa60f233) ) + ROM_LOAD( "epr-13385.ic152", 0x20000, 0x10000, CRC(6df1b995) SHA1(5aab19b87a9ef162c30ccf5974cb795e37dba91f) ) ROM_REGION32_LE( 0x200000, REGION_GFX2, 0 ) /* sprites */ - ROM_LOAD32_BYTE( "epr13382.bin", 0x000000, 0x20000, CRC(01dac209) SHA1(4c6b03308193c472f6cdbcede306f8ce6db0cc4b) ) - ROM_LOAD32_BYTE( "epr13381.bin", 0x000001, 0x20000, CRC(3a50d931) SHA1(9d9cb1793f3b8f562ce0ea49f2afeef099f20859) ) - ROM_LOAD32_BYTE( "epr13380.bin", 0x000002, 0x20000, CRC(ad1024c8) SHA1(86e941424b2e2e00940886e5daed640a78ed7403) ) - ROM_LOAD32_BYTE( "epr13379.bin", 0x000003, 0x20000, CRC(1ac17625) SHA1(7aefd382041dd3f97936ecb8738a3f2c9780c58f) ) - ROM_LOAD32_BYTE( "opr13378.bin", 0x080000, 0x20000, CRC(50c9b867) SHA1(dd9702b369ea8abd50da22ce721b7040428e9d4b) ) - ROM_LOAD32_BYTE( "epr13377.bin", 0x080001, 0x20000, CRC(9b12f5c0) SHA1(2060420611b3354974c49bc80f556f945512570b) ) - ROM_LOAD32_BYTE( "epr13376.bin", 0x080002, 0x20000, CRC(449ac518) SHA1(0438a72e53a7889d39ea7e2530e49a2594d97e90) ) - ROM_LOAD32_BYTE( "epr13375.bin", 0x080003, 0x20000, CRC(5489a9ff) SHA1(c458cb55d957edae340535f54189438296f3ec2f) ) - ROM_LOAD32_BYTE( "opr13374.bin", 0x100000, 0x20000, CRC(6a319e4f) SHA1(d9f92b15f4baa14745048073205add35b7d42d27) ) - ROM_LOAD32_BYTE( "epr13373.bin", 0x100001, 0x20000, CRC(eca5588b) SHA1(11def0c293868193d457958fe7459fd8c31dbd2b) ) - ROM_LOAD32_BYTE( "epr13372.bin", 0x100002, 0x20000, CRC(0b45a433) SHA1(82fa2b208eaf70b70524681fbc3ec70085e70d83) ) - ROM_LOAD32_BYTE( "epr13371.bin", 0x100003, 0x20000, CRC(b68f4cff) SHA1(166f2a685cbc230c098fdc1646b6e632dd2b09dd) ) - ROM_LOAD32_BYTE( "epr13370.bin", 0x180000, 0x20000, CRC(78276620) SHA1(2c4505c57a1e765f9cfd48fb1637d67d199a2f1d) ) - ROM_LOAD32_BYTE( "epr13369.bin", 0x180001, 0x20000, CRC(8625bf0f) SHA1(0ae70bc0d54e25eecf4a11cf0600225dca35914d) ) - ROM_LOAD32_BYTE( "epr13368.bin", 0x180002, 0x20000, CRC(0f50716c) SHA1(eb4c7f47e11c58fe0d58f67e6dafabc6291eabb8) ) - ROM_LOAD32_BYTE( "epr13367.bin", 0x180003, 0x20000, CRC(4b1bb51f) SHA1(17fd5ac9e18dd6097a015e9d7b6815826f9c53f1) ) + ROM_LOAD32_BYTE( "epr-13382.ic90", 0x000000, 0x20000, CRC(01dac209) SHA1(4c6b03308193c472f6cdbcede306f8ce6db0cc4b) ) + ROM_LOAD32_BYTE( "epr-13381.ic94", 0x000001, 0x20000, CRC(3a50d931) SHA1(9d9cb1793f3b8f562ce0ea49f2afeef099f20859) ) + ROM_LOAD32_BYTE( "epr-13380.ic98", 0x000002, 0x20000, CRC(ad1024c8) SHA1(86e941424b2e2e00940886e5daed640a78ed7403) ) + ROM_LOAD32_BYTE( "epr-13379.ic102", 0x000003, 0x20000, CRC(1ac17625) SHA1(7aefd382041dd3f97936ecb8738a3f2c9780c58f) ) + ROM_LOAD32_BYTE( "epr-13378.ic91", 0x080000, 0x20000, CRC(50c9b867) SHA1(dd9702b369ea8abd50da22ce721b7040428e9d4b) ) + ROM_LOAD32_BYTE( "epr-13377.ic95", 0x080001, 0x20000, CRC(9b12f5c0) SHA1(2060420611b3354974c49bc80f556f945512570b) ) + ROM_LOAD32_BYTE( "epr-13376.ic99", 0x080002, 0x20000, CRC(449ac518) SHA1(0438a72e53a7889d39ea7e2530e49a2594d97e90) ) + ROM_LOAD32_BYTE( "epr-13375.ic103", 0x080003, 0x20000, CRC(5489a9ff) SHA1(c458cb55d957edae340535f54189438296f3ec2f) ) + ROM_LOAD32_BYTE( "epr-13374.ic92", 0x100000, 0x20000, CRC(6a319e4f) SHA1(d9f92b15f4baa14745048073205add35b7d42d27) ) + ROM_LOAD32_BYTE( "epr-13373.ic96", 0x100001, 0x20000, CRC(eca5588b) SHA1(11def0c293868193d457958fe7459fd8c31dbd2b) ) + ROM_LOAD32_BYTE( "epr-13372.ic100", 0x100002, 0x20000, CRC(0b45a433) SHA1(82fa2b208eaf70b70524681fbc3ec70085e70d83) ) + ROM_LOAD32_BYTE( "epr-13371.ic104", 0x100003, 0x20000, CRC(b68f4cff) SHA1(166f2a685cbc230c098fdc1646b6e632dd2b09dd) ) + ROM_LOAD32_BYTE( "epr-13370.ic93", 0x180000, 0x20000, CRC(78276620) SHA1(2c4505c57a1e765f9cfd48fb1637d67d199a2f1d) ) + ROM_LOAD32_BYTE( "epr-13369.ic97", 0x180001, 0x20000, CRC(8625bf0f) SHA1(0ae70bc0d54e25eecf4a11cf0600225dca35914d) ) + ROM_LOAD32_BYTE( "epr-13368.ic101", 0x180002, 0x20000, CRC(0f50716c) SHA1(eb4c7f47e11c58fe0d58f67e6dafabc6291eabb8) ) + ROM_LOAD32_BYTE( "epr-13367.ic105", 0x180003, 0x20000, CRC(4b1bb51f) SHA1(17fd5ac9e18dd6097a015e9d7b6815826f9c53f1) ) ROM_REGION( 0x10000, REGION_GFX3, ROMREGION_ERASE00 ) /* road gfx */ /* none?? */ ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* sound CPU */ - ROM_LOAD( "epr13388.bin", 0x00000, 0x10000, CRC(706581e4) SHA1(51c9dbf2bf0d6b8826de24cd33596f5c95136870) ) + ROM_LOAD( "epr-13388.ic17", 0x00000, 0x10000, CRC(706581e4) SHA1(51c9dbf2bf0d6b8826de24cd33596f5c95136870) ) ROM_REGION( 0x80000, REGION_SOUND1, ROMREGION_ERASEFF ) /* Sega PCM sound data */ - ROM_LOAD( "epr13391.bin", 0x00000, 0x20000, CRC(8c30c867) SHA1(0d735291b1311890938f8a1143fae6af9feb2a69) ) - ROM_LOAD( "epr13390.bin", 0x20000, 0x20000, CRC(8c93cd05) SHA1(bb08094abac6c104eddf14f634e9791f03122946) ) - ROM_LOAD( "epr13389.bin", 0x40000, 0x20000, CRC(4e4c758e) SHA1(181750dfcdd6d5b28b063c980c251991163d9474) ) + ROM_LOAD( "epr-13391.ic11", 0x00000, 0x20000, CRC(8c30c867) SHA1(0d735291b1311890938f8a1143fae6af9feb2a69) ) + ROM_LOAD( "epr-13390.ic12", 0x20000, 0x20000, CRC(8c93cd05) SHA1(bb08094abac6c104eddf14f634e9791f03122946) ) + ROM_LOAD( "epr-13389.ic13", 0x40000, 0x20000, CRC(4e4c758e) SHA1(181750dfcdd6d5b28b063c980c251991163d9474) ) ROM_END /************************************************************************************************************************** - GP Rider, Sega X-board + GP Rider (US), Sega X-board CPU: FD1094 (317-0162) + Custom Chip 315-5304 (IC 127) + IC BD Number: 834-7626-01 (roms are "MPR") / 834-7626-04 (roms are "EPR") */ ROM_START( gprider1 ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 68000 code */ - ROM_LOAD16_BYTE( "epr13406.bin", 0x00001, 0x20000, CRC(122c711f) SHA1(2bcc51347e771a7e7f770e68b24d82497d24aa2e) ) - ROM_LOAD16_BYTE( "epr13407.bin", 0x00000, 0x20000, CRC(03553ebd) SHA1(041a71a2dce2ad56360f500cb11e29a629020160) ) + ROM_LOAD16_BYTE( "epr-13406.ic63", 0x00001, 0x20000, CRC(122c711f) SHA1(2bcc51347e771a7e7f770e68b24d82497d24aa2e) ) + ROM_LOAD16_BYTE( "epr-13407.ic58", 0x00000, 0x20000, CRC(03553ebd) SHA1(041a71a2dce2ad56360f500cb11e29a629020160) ) ROM_REGION( 0x2000, REGION_USER1, 0 ) /* decryption key */ ROM_LOAD( "317-0162.key", 0x0000, 0x2000, CRC(8067de53) SHA1(e8cd1dfbad94856c6bd51569557667e72f0a5dd4) ) ROM_REGION( 0x80000, REGION_CPU2, 0 ) /* 2nd 68000 code */ - ROM_LOAD16_BYTE( "epr13395.bin", 0x00000, 0x20000,CRC(d6ccfac7) SHA1(9287ab08600163a0d9bd33618c629f99391316bd) ) - ROM_LOAD16_BYTE( "epr13394.bin", 0x00001, 0x20000,CRC(914a55ec) SHA1(84fe1df12478990418b46b6800425e5599e9eff9) ) - ROM_LOAD16_BYTE( "epr13393.bin", 0x40000, 0x20000,CRC(08d023cc) SHA1(d008d57e494f484a1a84896065d53fb9b1d8d60e) ) - ROM_LOAD16_BYTE( "epr13392.bin", 0x40001, 0x20000,CRC(f927cd42) SHA1(67eab328c1fb878fe3d086d0639f5051b135a037)) + ROM_LOAD16_BYTE( "epr-13395.ic20", 0x00000, 0x20000,CRC(d6ccfac7) SHA1(9287ab08600163a0d9bd33618c629f99391316bd) ) + ROM_LOAD16_BYTE( "epr-13394.ic29", 0x00001, 0x20000,CRC(914a55ec) SHA1(84fe1df12478990418b46b6800425e5599e9eff9) ) + ROM_LOAD16_BYTE( "epr-13393.ic21", 0x40000, 0x20000,CRC(08d023cc) SHA1(d008d57e494f484a1a84896065d53fb9b1d8d60e) ) + ROM_LOAD16_BYTE( "epr-13392.ic30", 0x40001, 0x20000,CRC(f927cd42) SHA1(67eab328c1fb878fe3d086d0639f5051b135a037) ) ROM_REGION( 0x30000, REGION_GFX1, ROMREGION_DISPOSE ) /* tiles */ - ROM_LOAD( "epr13383.bin", 0x00000, 0x10000, CRC(24f897a7) SHA1(68ba17067d90f07bb5a549017be4773b33ae81d0) ) - ROM_LOAD( "epr13384.bin", 0x10000, 0x10000, CRC(fe8238bd) SHA1(601910bd86536e6b08f5308b298c8f01fa60f233) ) - ROM_LOAD( "epr13385.bin", 0x20000, 0x10000, CRC(6df1b995) SHA1(5aab19b87a9ef162c30ccf5974cb795e37dba91f) ) + ROM_LOAD( "epr-13383.ic154", 0x00000, 0x10000, CRC(24f897a7) SHA1(68ba17067d90f07bb5a549017be4773b33ae81d0) ) + ROM_LOAD( "epr-13384.ic153", 0x10000, 0x10000, CRC(fe8238bd) SHA1(601910bd86536e6b08f5308b298c8f01fa60f233) ) + ROM_LOAD( "epr-13385.ic152", 0x20000, 0x10000, CRC(6df1b995) SHA1(5aab19b87a9ef162c30ccf5974cb795e37dba91f) ) ROM_REGION32_LE( 0x200000, REGION_GFX2, 0 ) /* sprites */ - ROM_LOAD32_BYTE( "epr13382.bin", 0x000000, 0x20000, CRC(01dac209) SHA1(4c6b03308193c472f6cdbcede306f8ce6db0cc4b) ) - ROM_LOAD32_BYTE( "epr13381.bin", 0x000001, 0x20000, CRC(3a50d931) SHA1(9d9cb1793f3b8f562ce0ea49f2afeef099f20859) ) - ROM_LOAD32_BYTE( "epr13380.bin", 0x000002, 0x20000, CRC(ad1024c8) SHA1(86e941424b2e2e00940886e5daed640a78ed7403) ) - ROM_LOAD32_BYTE( "epr13379.bin", 0x000003, 0x20000, CRC(1ac17625) SHA1(7aefd382041dd3f97936ecb8738a3f2c9780c58f) ) - ROM_LOAD32_BYTE( "opr13378.bin", 0x080000, 0x20000, CRC(50c9b867) SHA1(dd9702b369ea8abd50da22ce721b7040428e9d4b) ) - ROM_LOAD32_BYTE( "epr13377.bin", 0x080001, 0x20000, CRC(9b12f5c0) SHA1(2060420611b3354974c49bc80f556f945512570b) ) - ROM_LOAD32_BYTE( "epr13376.bin", 0x080002, 0x20000, CRC(449ac518) SHA1(0438a72e53a7889d39ea7e2530e49a2594d97e90) ) - ROM_LOAD32_BYTE( "epr13375.bin", 0x080003, 0x20000, CRC(5489a9ff) SHA1(c458cb55d957edae340535f54189438296f3ec2f) ) - ROM_LOAD32_BYTE( "opr13374.bin", 0x100000, 0x20000, CRC(6a319e4f) SHA1(d9f92b15f4baa14745048073205add35b7d42d27) ) - ROM_LOAD32_BYTE( "epr13373.bin", 0x100001, 0x20000, CRC(eca5588b) SHA1(11def0c293868193d457958fe7459fd8c31dbd2b) ) - ROM_LOAD32_BYTE( "epr13372.bin", 0x100002, 0x20000, CRC(0b45a433) SHA1(82fa2b208eaf70b70524681fbc3ec70085e70d83) ) - ROM_LOAD32_BYTE( "epr13371.bin", 0x100003, 0x20000, CRC(b68f4cff) SHA1(166f2a685cbc230c098fdc1646b6e632dd2b09dd) ) - ROM_LOAD32_BYTE( "epr13370.bin", 0x180000, 0x20000, CRC(78276620) SHA1(2c4505c57a1e765f9cfd48fb1637d67d199a2f1d) ) - ROM_LOAD32_BYTE( "epr13369.bin", 0x180001, 0x20000, CRC(8625bf0f) SHA1(0ae70bc0d54e25eecf4a11cf0600225dca35914d) ) - ROM_LOAD32_BYTE( "epr13368.bin", 0x180002, 0x20000, CRC(0f50716c) SHA1(eb4c7f47e11c58fe0d58f67e6dafabc6291eabb8) ) - ROM_LOAD32_BYTE( "epr13367.bin", 0x180003, 0x20000, CRC(4b1bb51f) SHA1(17fd5ac9e18dd6097a015e9d7b6815826f9c53f1) ) + ROM_LOAD32_BYTE( "epr-13382.ic90", 0x000000, 0x20000, CRC(01dac209) SHA1(4c6b03308193c472f6cdbcede306f8ce6db0cc4b) ) + ROM_LOAD32_BYTE( "epr-13381.ic94", 0x000001, 0x20000, CRC(3a50d931) SHA1(9d9cb1793f3b8f562ce0ea49f2afeef099f20859) ) + ROM_LOAD32_BYTE( "epr-13380.ic98", 0x000002, 0x20000, CRC(ad1024c8) SHA1(86e941424b2e2e00940886e5daed640a78ed7403) ) + ROM_LOAD32_BYTE( "epr-13379.ic102", 0x000003, 0x20000, CRC(1ac17625) SHA1(7aefd382041dd3f97936ecb8738a3f2c9780c58f) ) + ROM_LOAD32_BYTE( "epr-13378.ic91", 0x080000, 0x20000, CRC(50c9b867) SHA1(dd9702b369ea8abd50da22ce721b7040428e9d4b) ) + ROM_LOAD32_BYTE( "epr-13377.ic95", 0x080001, 0x20000, CRC(9b12f5c0) SHA1(2060420611b3354974c49bc80f556f945512570b) ) + ROM_LOAD32_BYTE( "epr-13376.ic99", 0x080002, 0x20000, CRC(449ac518) SHA1(0438a72e53a7889d39ea7e2530e49a2594d97e90) ) + ROM_LOAD32_BYTE( "epr-13375.ic103", 0x080003, 0x20000, CRC(5489a9ff) SHA1(c458cb55d957edae340535f54189438296f3ec2f) ) + ROM_LOAD32_BYTE( "epr-13374.ic92", 0x100000, 0x20000, CRC(6a319e4f) SHA1(d9f92b15f4baa14745048073205add35b7d42d27) ) + ROM_LOAD32_BYTE( "epr-13373.ic96", 0x100001, 0x20000, CRC(eca5588b) SHA1(11def0c293868193d457958fe7459fd8c31dbd2b) ) + ROM_LOAD32_BYTE( "epr-13372.ic100", 0x100002, 0x20000, CRC(0b45a433) SHA1(82fa2b208eaf70b70524681fbc3ec70085e70d83) ) + ROM_LOAD32_BYTE( "epr-13371.ic104", 0x100003, 0x20000, CRC(b68f4cff) SHA1(166f2a685cbc230c098fdc1646b6e632dd2b09dd) ) + ROM_LOAD32_BYTE( "epr-13370.ic93", 0x180000, 0x20000, CRC(78276620) SHA1(2c4505c57a1e765f9cfd48fb1637d67d199a2f1d) ) + ROM_LOAD32_BYTE( "epr-13369.ic97", 0x180001, 0x20000, CRC(8625bf0f) SHA1(0ae70bc0d54e25eecf4a11cf0600225dca35914d) ) + ROM_LOAD32_BYTE( "epr-13368.ic101", 0x180002, 0x20000, CRC(0f50716c) SHA1(eb4c7f47e11c58fe0d58f67e6dafabc6291eabb8) ) + ROM_LOAD32_BYTE( "epr-13367.ic105", 0x180003, 0x20000, CRC(4b1bb51f) SHA1(17fd5ac9e18dd6097a015e9d7b6815826f9c53f1) ) ROM_REGION( 0x10000, REGION_GFX3, ROMREGION_ERASE00 ) /* road gfx */ /* none?? */ ROM_REGION( 0x10000, REGION_CPU3, 0 ) /* sound CPU */ - ROM_LOAD( "epr13388.bin", 0x00000, 0x10000, CRC(706581e4) SHA1(51c9dbf2bf0d6b8826de24cd33596f5c95136870) ) + ROM_LOAD( "epr-13388.ic17", 0x00000, 0x10000, CRC(706581e4) SHA1(51c9dbf2bf0d6b8826de24cd33596f5c95136870) ) ROM_REGION( 0x80000, REGION_SOUND1, ROMREGION_ERASEFF ) /* Sega PCM sound data */ - ROM_LOAD( "epr13391.bin", 0x00000, 0x20000, CRC(8c30c867) SHA1(0d735291b1311890938f8a1143fae6af9feb2a69) ) - ROM_LOAD( "epr13390.bin", 0x20000, 0x20000, CRC(8c93cd05) SHA1(bb08094abac6c104eddf14f634e9791f03122946) ) - ROM_LOAD( "epr13389.bin", 0x40000, 0x20000, CRC(4e4c758e) SHA1(181750dfcdd6d5b28b063c980c251991163d9474) ) + ROM_LOAD( "epr-13391.ic11", 0x00000, 0x20000, CRC(8c30c867) SHA1(0d735291b1311890938f8a1143fae6af9feb2a69) ) + ROM_LOAD( "epr-13390.ic12", 0x20000, 0x20000, CRC(8c93cd05) SHA1(bb08094abac6c104eddf14f634e9791f03122946) ) + ROM_LOAD( "epr-13389.ic13", 0x40000, 0x20000, CRC(4e4c758e) SHA1(181750dfcdd6d5b28b063c980c251991163d9474) ) ROM_END @@ -2412,5 +2415,5 @@ GAME( 1989, smgpu2, smgp, smgp, smgp, smgp, ROT0, "Sega", GAME( 1989, smgpu3, smgp, smgp, smgp, smgp, ROT0, "Sega", "Super Monaco GP (set 2, US, FD1094 317-0125a)", 0 ) GAME( 1989, smgpj, smgp, smgp, smgp, smgp, ROT0, "Sega", "Super Monaco GP (set 1, Japan, Rev B, FD1094 317-0124a)", 0 ) GAME( 1990, abcop, 0, xboard, abcop, generic_xboard, ROT0, "Sega", "A.B. Cop (FD1094 317-0169b)", 0 ) -GAME( 1990, gprider, 0, xboard, gprider, gprider, ROT0, "Sega", "GP Rider (set 2, FD1094 317-0163)", GAME_NOT_WORKING ) // no prg roms +GAME( 1990, gprider, 0, xboard, gprider, gprider, ROT0, "Sega", "GP Rider (set 2, World, FD1094 317-0163)", GAME_NOT_WORKING ) // no prg roms GAME( 1990, gprider1, gprider, xboard, gprider, gprider, ROT0, "Sega", "GP Rider (set 1, US, FD1094 317-0162)", 0 ) diff --git a/src/drivers/segaybd.c b/src/drivers/segaybd.c index 9221c3a47..544ec173e 100644 --- a/src/drivers/segaybd.c +++ b/src/drivers/segaybd.c @@ -370,7 +370,7 @@ static VIDEO_UPDATE( rchase ) int y1 = readinputportbytag("ADC1"); int x2 = readinputportbytag("ADC2"); int y2 = readinputportbytag("ADC3"); - video_update_yboard(screen, bitmap, cliprect); + video_update_yboard(machine, screen, bitmap, cliprect); draw_crosshair(bitmap, x1 * (Machine->screen[0].width - 1) / 255, y1 * (Machine->screen[0].height - 1) / 255, cliprect, 0); draw_crosshair(bitmap, x2 * (Machine->screen[0].width - 1) / 255, y2 * (Machine->screen[0].height - 1) / 255, cliprect, 1); return 0; @@ -784,7 +784,7 @@ static INPUT_PORTS_START( pdrift ) INPUT_PORTS_END -static INPUT_PORTS_START( pdrifta ) +static INPUT_PORTS_START( pdrifte ) PORT_INCLUDE( pdrift ) PORT_MODIFY("DSW") @@ -1407,14 +1407,94 @@ ROM_START( pdrift ) ROM_RELOAD( 0x160000, 0x20000 ) ROM_REGION( 0x100000, REGION_USER1, 0 ) - /* These are mpr-11754.107 split into 4 roms, for alternate sound board config. They would be located on seperate daughter card. */ - ROM_LOAD( "epr-11895.bin", 0x000000, 0x20000, CRC(ee99a6fd) SHA1(4444826e751d9186e6d46b081e47cd99ee3cf853) ) - ROM_LOAD( "epr-11896.bin", 0x000000, 0x20000, CRC(4bebc015) SHA1(307022ea1c1ee87c9ef3782526888c48c3c69fd2) ) - ROM_LOAD( "epr-11897.bin", 0x000000, 0x20000, CRC(4463cb95) SHA1(e86fd4611cf83fe72d59950a60fc8c3a7381a1c7) ) - ROM_LOAD( "epr-11898.bin", 0x000000, 0x20000, CRC(5d19d767) SHA1(d335cd3ef57c75e388df04b04fc3e2881a3902cf) ) + /* These are mpr-11754.107 split into 4 roms. They would be located on a Sega 839-0221 daughter card. */ + ROM_LOAD( "epr-11895.ic1", 0x000000, 0x20000, CRC(ee99a6fd) SHA1(4444826e751d9186e6d46b081e47cd99ee3cf853) ) + ROM_LOAD( "epr-11896.ic2", 0x000000, 0x20000, CRC(4bebc015) SHA1(307022ea1c1ee87c9ef3782526888c48c3c69fd2) ) + ROM_LOAD( "epr-11897.ic3", 0x000000, 0x20000, CRC(4463cb95) SHA1(e86fd4611cf83fe72d59950a60fc8c3a7381a1c7) ) + ROM_LOAD( "epr-11898.ic4", 0x000000, 0x20000, CRC(5d19d767) SHA1(d335cd3ef57c75e388df04b04fc3e2881a3902cf) ) ROM_END -ROM_START( pdrifta ) /* Earlier set based on eprom numbers & Sega Eprom/Mask Rom Locations sheet 421-7708 */ +ROM_START( pdrifta ) + ROM_REGION( 0x080000, REGION_CPU1, 0 ) // M + ROM_LOAD16_BYTE( "epr-12017.25", 0x000000, 0x20000, CRC(31190322) SHA1(18df4bd6078b1c76c7061c05a476a7cbf7d0b37b) ) + ROM_LOAD16_BYTE( "epr-12016.24", 0x000001, 0x20000, CRC(499f64a6) SHA1(506652bdb0f3d23a2cf7ff29732b8ec77c389b46) ) + ROM_LOAD16_BYTE( "epr-11748.27", 0x040000, 0x20000, CRC(82a76cab) SHA1(f8d3fe059e18896cd0e64711f1a3ee8b6372b4e0) ) + ROM_LOAD16_BYTE( "epr-11747.26", 0x040001, 0x20000, CRC(9796ece5) SHA1(f84f5689c2edc0853ff173ce20f93f89758b2f31) ) + + ROM_REGION( 0x040000, REGION_CPU2, 0 ) // X + ROM_LOAD16_BYTE( "epr-11905.81", 0x000000, 0x20000, CRC(1cf68109) SHA1(198c1f9d4278586d1e0f50acaaf08e60ba464f8a) ) + ROM_LOAD16_BYTE( "epr-11904.80", 0x000001, 0x20000, CRC(bb993681) SHA1(c5107e8d52cba3a0fc813ffa9e3752e0f9c3c0df) ) + + ROM_REGION( 0x040000, REGION_CPU3, 0 ) // Y + ROM_LOAD16_BYTE( "epr-12019.54", 0x000000, 0x20000, CRC(e514d7b6) SHA1(27ae99f5f3e8d2f248916f7a252e2c0686638df5) ) + ROM_LOAD16_BYTE( "epr-12018.53", 0x000001, 0x20000, CRC(0a3f7faf) SHA1(fe20a164a7a2c9e9bf0e7aade75b0488bdc93d79) ) + + ROM_REGION16_BE( 0x080000, REGION_GFX2, 0 ) + ROM_LOAD16_BYTE( "epr-11789.16", 0x000000, 0x20000, CRC(b86f8d2b) SHA1(a053f2021841fd0ef89fd3f28050a698b36c435e) ) + ROM_LOAD16_BYTE( "epr-11791.14", 0x000001, 0x20000, CRC(36b2910a) SHA1(9948b91837f944a7a606542fa685525e74bbe398) ) + ROM_LOAD16_BYTE( "epr-11790.17", 0x040000, 0x20000, CRC(2a564e66) SHA1(5f30fc15bfd017d75cfffe1e9e62ed0bcf32a98e) ) + ROM_LOAD16_BYTE( "epr-11792.15", 0x040001, 0x20000, CRC(c85caf6e) SHA1(2411ea99ec7f6e2b0b4f219e86ff2172539ad2c4) ) + + ROM_REGION64_BE( 0x400000, REGION_GFX1, 0) + ROMX_LOAD( "epr-11757.67", 0x000000, 0x20000, CRC(e46dc478) SHA1(baf79e230aef3d63fb50373b2b1626f7c56ee94f), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11758.75", 0x000001, 0x20000, CRC(5b435c87) SHA1(6b42b08e73957c36cd8faa896ca14461d00afd29), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11773.63", 0x000002, 0x20000, CRC(1b5d5758) SHA1(54f58a274740a0566e0553d145c0c284ffd1d36b), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11774.71", 0x000003, 0x20000, CRC(2ca0c170) SHA1(7de74c045bf084659ba70da9458d720125ff25ae), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11759.86", 0x000004, 0x20000, CRC(ac8111f6) SHA1(6412716dc97ae697b438d9c9cd554d1087416bc2), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11760.114", 0x000005, 0x20000, CRC(91282af9) SHA1(fddee7982949b7da724c7830e7bd139aeb84672d), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11775.82", 0x000006, 0x20000, CRC(48225793) SHA1(ee003c2ea24c14e0968da94bac139735660932fe), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11776.110", 0x000007, 0x20000, CRC(78c46198) SHA1(d299e631843da47cb7a46103d52a3dabfab71746), ROM_SKIP(7) ) + + ROMX_LOAD( "epr-11761.66", 0x100000, 0x20000, CRC(baa5d065) SHA1(56dc71814e3f0f327781b0c1587038351c60f7b7), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11762.74", 0x100001, 0x20000, CRC(1d1af7a5) SHA1(86c02565b5aca201588c98678fb0c54faa8d4d6b), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11777.62", 0x100002, 0x20000, CRC(9662dd32) SHA1(454ec914b6c936f692bf90d2232c8169acec470a), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11778.70", 0x100003, 0x20000, CRC(2dfb7494) SHA1(4b9f1609e425c5e634e95dbc2d0ca820dd9212bc), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11763.85", 0x100004, 0x20000, CRC(1ee23407) SHA1(776c868e0e4e601fd6d0a83561b064b4be0560e2), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11764.113", 0x100005, 0x20000, CRC(e859305e) SHA1(aafcc3209a4fb6e0e8169ae6cce386b370b824f7), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11779.81", 0x100006, 0x20000, CRC(a49cd793) SHA1(efe77949be39a2ff88b50bfb2b4664b9267d9a09), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11780.109", 0x100007, 0x20000, CRC(d514ed81) SHA1(fbac3ad085363972a79e77aebb7fdae2200e7cda), ROM_SKIP(7) ) + + ROMX_LOAD( "epr-11765.65", 0x200000, 0x20000, CRC(649e2dff) SHA1(a6c61b71d08b31a0ca175ab0404e2eaf1d09ccc2), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11766.73", 0x200001, 0x20000, CRC(d92fb7fc) SHA1(2f5c2d88ae0766351b9efe8ffcbebc88fc3a6c59), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11781.61", 0x200002, 0x20000, CRC(9692d4cd) SHA1(967351ba2c781ca865e3c1ee9eeef1aad2247c27), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11782.69", 0x200003, 0x20000, CRC(c913bb43) SHA1(9bc15a3180cf4c3134bb55e99e6092f0faf95c56), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11767.84", 0x200004, 0x20000, CRC(1f8ad054) SHA1(289f5795116ee29540f28e35c3b4f72adeca7891), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11768.112", 0x200005, 0x20000, CRC(db2c4053) SHA1(a5b6daa6deb7afb0019e289acb81c82d507ec93a), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11783.80", 0x200006, 0x20000, CRC(6d189007) SHA1(dd871ea3166fdcb59d49707d35dde8b6c7fdc76b), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11784.108", 0x200007, 0x20000, CRC(57f5fd64) SHA1(6aff54d3f3f76ce0f1a93485d1a35a3987d456d9), ROM_SKIP(7) ) + + ROMX_LOAD( "epr-11769.64", 0x300000, 0x20000, CRC(28f0ab51) SHA1(d7cb7b83e5d85eb59d34cfd5c0d8e6c7ff81e24c), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11770.72", 0x300001, 0x20000, CRC(d7557ea9) SHA1(62430505d399ee2cc0f94e03144860056345573c), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11785.60", 0x300002, 0x20000, CRC(e6ef32c4) SHA1(869ba3816f5e3125f613f3b284fec74cd19db79e), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11786.68", 0x300003, 0x20000, CRC(2066b49d) SHA1(905ce70c921043d07591422a87fedd6e897ff38e), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11771.83", 0x300004, 0x20000, CRC(67635618) SHA1(f690ace026130ecb95532c92f2ad3741d0d167c1), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11772.111", 0x300005, 0x20000, CRC(0f798d3a) SHA1(71565ce28b93ae50d64af8c965fba6408a07f031), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11787.79", 0x300006, 0x20000, CRC(e631dc12) SHA1(3fd6db2eb297890b35dec566b6a90fc2d96bd085), ROM_SKIP(7) ) + ROMX_LOAD( "epr-11788.107", 0x300007, 0x20000, CRC(8464c66e) SHA1(af93cbcc50acbd929d0298fb9a75da0369e13ff7), ROM_SKIP(7) ) + + ROM_REGION( 0x10000, REGION_CPU4, 0 ) /* Z80 sound CPU */ + ROM_LOAD( "epr-11899.102", 0x000000, 0x10000, CRC(ed9fa889) SHA1(25d1a069254b34c31d8ee82d301ada895e8dc391) ) + + ROM_REGION( 0x200000, REGION_SOUND1, ROMREGION_ERASEFF ) /* SegaPCM samples */ + ROM_LOAD( "mpr-11754.107", 0x000000, 0x80000, CRC(ebeb8484) SHA1(269f33cb1a9be126bada858e25291385d48686a2) ) + ROM_LOAD( "epr-11755.105", 0x080000, 0x20000, CRC(12e43f8a) SHA1(0f9a11ba6b7c1a352daa1146a01ce147945e91e4) ) + ROM_RELOAD( 0x0a0000, 0x20000 ) + ROM_RELOAD( 0x0c0000, 0x20000 ) + ROM_RELOAD( 0x0e0000, 0x20000 ) + ROM_LOAD( "epr-11756.106", 0x100000, 0x20000, CRC(c2db1244) SHA1(c98fe17c9f04a639a862cc2a86fab17d1f5d025c) ) + ROM_RELOAD( 0x120000, 0x20000 ) + ROM_RELOAD( 0x140000, 0x20000 ) + ROM_RELOAD( 0x160000, 0x20000 ) + + ROM_REGION( 0x100000, REGION_USER1, 0 ) + /* These are mpr-11754.107 split into 4 roms. They would be located on a Sega 839-0221 daughter card. */ + ROM_LOAD( "epr-11895.ic1", 0x000000, 0x20000, CRC(ee99a6fd) SHA1(4444826e751d9186e6d46b081e47cd99ee3cf853) ) + ROM_LOAD( "epr-11896.ic2", 0x000000, 0x20000, CRC(4bebc015) SHA1(307022ea1c1ee87c9ef3782526888c48c3c69fd2) ) + ROM_LOAD( "epr-11897.ic3", 0x000000, 0x20000, CRC(4463cb95) SHA1(e86fd4611cf83fe72d59950a60fc8c3a7381a1c7) ) + ROM_LOAD( "epr-11898.ic4", 0x000000, 0x20000, CRC(5d19d767) SHA1(d335cd3ef57c75e388df04b04fc3e2881a3902cf) ) +ROM_END + +ROM_START( pdrifte ) /* Earlier set based on eprom numbers & Sega Eprom/Mask Rom Locations sheet 421-7708 */ ROM_REGION( 0x080000, REGION_CPU1, 0 ) // M ROM_LOAD16_BYTE( "epr-11901.25", 0x000000, 0x20000, CRC(16744be8) SHA1(51d06f1b590621d37b2eb8f6cc88f17b248402ad) ) ROM_LOAD16_BYTE( "epr-11900.24", 0x000001, 0x20000, CRC(0a170d06) SHA1(525dec21708fb33c6c7e6d86cb82fd16f6bddfa0) ) @@ -1487,11 +1567,11 @@ ROM_START( pdrifta ) /* Earlier set based on eprom numbers & Sega Eprom/Mask Rom ROM_RELOAD( 0x160000, 0x20000 ) ROM_REGION( 0x100000, REGION_USER1, 0 ) - /* These are mpr-11754.107 split into 4 roms, for alternate sound board config. They would be located on seperate daughter card. */ - ROM_LOAD( "epr-11895.bin", 0x000000, 0x20000, CRC(ee99a6fd) SHA1(4444826e751d9186e6d46b081e47cd99ee3cf853) ) - ROM_LOAD( "epr-11896.bin", 0x000000, 0x20000, CRC(4bebc015) SHA1(307022ea1c1ee87c9ef3782526888c48c3c69fd2) ) - ROM_LOAD( "epr-11897.bin", 0x000000, 0x20000, CRC(4463cb95) SHA1(e86fd4611cf83fe72d59950a60fc8c3a7381a1c7) ) - ROM_LOAD( "epr-11898.bin", 0x000000, 0x20000, CRC(5d19d767) SHA1(d335cd3ef57c75e388df04b04fc3e2881a3902cf) ) + /* These are mpr-11754.107 split into 4 roms. They would be located on a Sega 839-0221 daughter card. */ + ROM_LOAD( "epr-11895.ic1", 0x000000, 0x20000, CRC(ee99a6fd) SHA1(4444826e751d9186e6d46b081e47cd99ee3cf853) ) + ROM_LOAD( "epr-11896.ic2", 0x000000, 0x20000, CRC(4bebc015) SHA1(307022ea1c1ee87c9ef3782526888c48c3c69fd2) ) + ROM_LOAD( "epr-11897.ic3", 0x000000, 0x20000, CRC(4463cb95) SHA1(e86fd4611cf83fe72d59950a60fc8c3a7381a1c7) ) + ROM_LOAD( "epr-11898.ic4", 0x000000, 0x20000, CRC(5d19d767) SHA1(d335cd3ef57c75e388df04b04fc3e2881a3902cf) ) ROM_END /************************************************************************************************************************** @@ -1573,11 +1653,11 @@ ROM_START( pdriftj ) ROM_RELOAD( 0x160000, 0x20000 ) ROM_REGION( 0x100000, REGION_USER1, 0 ) - /* These are mpr-11754.107 split into 4 roms, for alternate sound board config. They would be located on seperate daughter card. */ - ROM_LOAD( "epr-11895.bin", 0x000000, 0x20000, CRC(ee99a6fd) SHA1(4444826e751d9186e6d46b081e47cd99ee3cf853) ) - ROM_LOAD( "epr-11896.bin", 0x000000, 0x20000, CRC(4bebc015) SHA1(307022ea1c1ee87c9ef3782526888c48c3c69fd2) ) - ROM_LOAD( "epr-11897.bin", 0x000000, 0x20000, CRC(4463cb95) SHA1(e86fd4611cf83fe72d59950a60fc8c3a7381a1c7) ) - ROM_LOAD( "epr-11898.bin", 0x000000, 0x20000, CRC(5d19d767) SHA1(d335cd3ef57c75e388df04b04fc3e2881a3902cf) ) + /* These are mpr-11754.107 split into 4 roms. They would be located on a Sega 839-0221 daughter card. */ + ROM_LOAD( "epr-11895.ic1", 0x000000, 0x20000, CRC(ee99a6fd) SHA1(4444826e751d9186e6d46b081e47cd99ee3cf853) ) + ROM_LOAD( "epr-11896.ic2", 0x000000, 0x20000, CRC(4bebc015) SHA1(307022ea1c1ee87c9ef3782526888c48c3c69fd2) ) + ROM_LOAD( "epr-11897.ic3", 0x000000, 0x20000, CRC(4463cb95) SHA1(e86fd4611cf83fe72d59950a60fc8c3a7381a1c7) ) + ROM_LOAD( "epr-11898.ic4", 0x000000, 0x20000, CRC(5d19d767) SHA1(d335cd3ef57c75e388df04b04fc3e2881a3902cf) ) ROM_END @@ -1743,8 +1823,9 @@ GAME( 1988, gforce2, 0, yboard, gforce2, generic_yboard, ROT0, "Sega", " GAME( 1988, gforce2j, gforce2, yboard, gforce2, generic_yboard, ROT0, "Sega", "Galaxy Force 2 (Japan)" , GAME_SUPPORTS_SAVE ) GAME( 1990, gloc, 0, yboard, gloc, generic_yboard, ROT0, "Sega", "G-LOC Air Battle (US)" , GAME_SUPPORTS_SAVE ) GAME( 1990, glocr360, gloc, yboard, glocr360, generic_yboard, ROT0, "Sega", "G-LOC R360", GAME_SUPPORTS_SAVE ) -GAME( 1988, pdrift, 0, yboard, pdrift, generic_yboard, ROT0, "Sega", "Power Drift (World)", GAME_SUPPORTS_SAVE ) -GAME( 1988, pdrifta, pdrift, yboard, pdrifta, generic_yboard, ROT0, "Sega", "Power Drift (World, Earlier)", GAME_SUPPORTS_SAVE ) +GAME( 1988, pdrift, 0, yboard, pdrift, generic_yboard, ROT0, "Sega", "Power Drift (World, Rev A)", GAME_SUPPORTS_SAVE ) +GAME( 1988, pdrifta, pdrift, yboard, pdrift, generic_yboard, ROT0, "Sega", "Power Drift (World)", GAME_SUPPORTS_SAVE ) +GAME( 1988, pdrifte, pdrift, yboard, pdrifte, generic_yboard, ROT0, "Sega", "Power Drift (World, Earlier)", GAME_SUPPORTS_SAVE ) GAME( 1988, pdriftj, pdrift, yboard, pdriftj, generic_yboard, ROT0, "Sega", "Power Drift (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1991, rchase, 0, rchase, rchase, generic_yboard, ROT0, "Sega", "Rail Chase (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1991, strkfgtr, 0, yboard, strkfgtr, generic_yboard, ROT0, "Sega", "Strike Fighter (Japan)", GAME_SUPPORTS_SAVE ) diff --git a/src/drivers/seibuspi.c b/src/drivers/seibuspi.c index 2ecd3dc93..a1673a7e5 100644 --- a/src/drivers/seibuspi.c +++ b/src/drivers/seibuspi.c @@ -1562,8 +1562,8 @@ static NVRAM_HANDLER( spi ) } } - nvram_handler_intelflash(0, file, read_or_write); - nvram_handler_intelflash(1, file, read_or_write); + nvram_handler_intelflash(machine, 0, file, read_or_write); + nvram_handler_intelflash(machine, 1, file, read_or_write); } /* this is a 93C46 but with reset delay */ @@ -1824,28 +1824,28 @@ static DRIVER_INIT( rdft ) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x00298d0, 0x00298d3, 0, 0, rdft_speedup_r ); - init_spi(); + init_spi(machine); } static DRIVER_INIT( senkyu ) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x0018cb4, 0x0018cb7, 0, 0, senkyu_speedup_r ); - init_spi(); + init_spi(machine); } static DRIVER_INIT( senkyua ) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x0018c9c, 0x0018c9f, 0, 0, senkyua_speedup_r ); - init_spi(); + init_spi(machine); } static DRIVER_INIT( batlball ) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x0018db4, 0x0018db7, 0, 0, batlball_speedup_r ); - init_spi(); + init_spi(machine); } static DRIVER_INIT( ejanhs ) @@ -1853,21 +1853,21 @@ static DRIVER_INIT( ejanhs ) // idle skip doesn't work properly? // memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x002d224, 0x002d227, 0, 0, ejanhs_speedup_r ); - init_spi(); + init_spi(machine); } static DRIVER_INIT( viprp1 ) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x001e2e0, 0x001e2e3, 0, 0, viprp1_speedup_r ); - init_spi(); + init_spi(machine); } static DRIVER_INIT( viprp1o ) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x001d49c, 0x001d49f, 0, 0, viprp1o_speedup_r ); - init_spi(); + init_spi(machine); } @@ -1887,12 +1887,12 @@ static DRIVER_INIT( rf2 ) static DRIVER_INIT( rdft2 ) { - init_rf2(); + init_rf2(machine); } static DRIVER_INIT( rdft2us ) { - init_rf2(); + init_rf2(machine); } @@ -1913,7 +1913,7 @@ static DRIVER_INIT( rfjet ) static DRIVER_INIT( rdft22kc ) { - init_rf2(); + init_rf2(machine); } static MACHINE_RESET( seibu386 ) diff --git a/src/drivers/senjyo.c b/src/drivers/senjyo.c index bb6cc90a4..becbb2bed 100644 --- a/src/drivers/senjyo.c +++ b/src/drivers/senjyo.c @@ -147,17 +147,14 @@ static WRITE8_HANDLER( paletteram_IIBBGGRR_w ) /* red component */ r = (data << 2) & 0x0c; if (r) r |= i; - r *= 0x11; /* green component */ g = (data >> 0) & 0x0c; if (g) g |= i; - g *= 0x11; /* blue component */ b = (data >> 2) & 0x0c; if (b) b |= i; - b *= 0x11; - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,pal4bit(r),pal4bit(g),pal4bit(b)); } diff --git a/src/drivers/seta.c b/src/drivers/seta.c index e452dde1f..a32774052 100644 --- a/src/drivers/seta.c +++ b/src/drivers/seta.c @@ -1750,19 +1750,8 @@ WRITE16_HANDLER( usclssic_lockout_w ) INLINE void usc_changecolor_xRRRRRGGGGGBBBBB(pen_t color,int data) { - int r,g,b; - - - r = (data >> 10) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 0) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - if (color>=0x100) palette_set_color(color-0x100,r,g,b); - else palette_set_color(color+0x200,r,g,b); + if (color>=0x100) palette_set_color(Machine,color-0x100,pal5bit(data >> 10),pal5bit(data >> 5),pal5bit(data >> 0)); + else palette_set_color(Machine,color+0x200,pal5bit(data >> 10),pal5bit(data >> 5),pal5bit(data >> 0)); } WRITE16_HANDLER( usc_paletteram16_xRRRRRGGGGGBBBBB_word_w ) @@ -9076,7 +9065,7 @@ DRIVER_INIT( crazyfgt ) seta_vregs = (UINT16*)auto_malloc(sizeof(UINT16)*3); seta_vregs[0] = seta_vregs[1] = seta_vregs[2] = 0; - init_blandia(); + init_blandia(machine); } /*************************************************************************** diff --git a/src/drivers/shadfrce.c b/src/drivers/shadfrce.c index 310889829..ceb64d672 100644 --- a/src/drivers/shadfrce.c +++ b/src/drivers/shadfrce.c @@ -220,7 +220,7 @@ static WRITE16_HANDLER ( shadfrce_sound_brt_w ) double brt = (data & 0xff) / 255.0; for (i = 0; i < 0x4000; i++) - palette_set_brightness(i,brt); + palette_set_brightness(Machine,i,brt); } } diff --git a/src/drivers/shangha3.c b/src/drivers/shangha3.c index 48e2a64be..72901f028 100644 --- a/src/drivers/shangha3.c +++ b/src/drivers/shangha3.c @@ -498,7 +498,7 @@ static struct YM3438interface ym3438_interface = static MACHINE_DRIVER_START( shangha3 ) /* basic machine hardware */ - MDRV_CPU_ADD(M68000, 16000000) /* 16 MHz ??? */ + MDRV_CPU_ADD(M68000, 8000000) MDRV_CPU_PROGRAM_MAP(shangha3_readmem,shangha3_writemem) MDRV_CPU_VBLANK_INT(irq4_line_hold,1) @@ -531,7 +531,7 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( heberpop ) /* basic machine hardware */ - MDRV_CPU_ADD(M68000, 16000000) /* 16 MHz ??? */ + MDRV_CPU_ADD(M68000, 8000000) MDRV_CPU_PROGRAM_MAP(heberpop_readmem,heberpop_writemem) MDRV_CPU_VBLANK_INT(irq4_line_hold,1) @@ -569,7 +569,7 @@ MACHINE_DRIVER_END static MACHINE_DRIVER_START( blocken ) /* basic machine hardware */ - MDRV_CPU_ADD(M68000, 16000000) /* 16 MHz ??? */ + MDRV_CPU_ADD(M68000, 8000000) MDRV_CPU_PROGRAM_MAP(blocken_readmem,blocken_writemem) MDRV_CPU_VBLANK_INT(irq4_line_hold,1) diff --git a/src/drivers/shanghai.c b/src/drivers/shanghai.c index 3b544f4d2..1174473e6 100644 --- a/src/drivers/shanghai.c +++ b/src/drivers/shanghai.c @@ -704,7 +704,7 @@ PALETTE_INIT( shanghai ) bit2 = (i >> 1) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/drivers/shougi.c b/src/drivers/shougi.c index 10f46447d..254560d24 100644 --- a/src/drivers/shougi.c +++ b/src/drivers/shougi.c @@ -149,7 +149,7 @@ static PALETTE_INIT( shougi ) bit1 = (color_prom[i] >> 7) & 0x01; b = combine_2_weights(weights_b, bit0, bit1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/drivers/sidearms.c b/src/drivers/sidearms.c index deb08aef3..e7afa109a 100644 --- a/src/drivers/sidearms.c +++ b/src/drivers/sidearms.c @@ -1142,66 +1142,66 @@ ROM_END ROM_START( twinfalc ) /* Shows "Notice This game is for use in Korea only..." The real PCB displays the same :-) */ ROM_REGION( 0x20000, REGION_CPU1, 0 ) /* 64k for code + banked ROMs images */ - ROM_LOAD( "t15.bin", 0x00000, 0x08000, CRC(e1f20144) SHA1(911781232fc1a7d6e36abb1c45e68a4398d8deac) ) - ROM_LOAD( "t14.bin", 0x10000, 0x10000, CRC(c499ff83) SHA1(d99bb8cb04485638c5f05584cffdd2fbbe061af7) ) + ROM_LOAD( "t-15.bin", 0x00000, 0x08000, CRC(e1f20144) SHA1(911781232fc1a7d6e36abb1c45e68a4398d8deac) ) + ROM_LOAD( "t-14.bin", 0x10000, 0x10000, CRC(c499ff83) SHA1(d99bb8cb04485638c5f05584cffdd2fbbe061af7) ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */ - ROM_LOAD( "whizz.t1", 0x0000, 0x8000, CRC(b84bc980) SHA1(d2d302a96a9e3197f27144e525a901cfb9da09e4) ) + ROM_LOAD( "t-1.b4", 0x0000, 0x8000, CRC(b84bc980) SHA1(d2d302a96a9e3197f27144e525a901cfb9da09e4) ) ROM_REGION( 0x8000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "whizz.t6", 0x04000, 0x04000, CRC(8e4ca776) SHA1(412a47f030e3b491e23e5696ef88d065f9de0220) ) /* characters */ - ROM_CONTINUE( 0x00000, 0x04000 ) /* is the first half used? */ + ROM_LOAD( "t-6.r6", 0x04000, 0x04000, CRC(8e4ca776) SHA1(412a47f030e3b491e23e5696ef88d065f9de0220) ) /* characters */ + ROM_CONTINUE( 0x00000, 0x04000 ) /* is the first half used? */ ROM_REGION( 0x80000, REGION_GFX2, ROMREGION_DISPOSE ) - ROM_LOAD( "whizz.t10", 0x00000, 0x10000, CRC(b678ef5b) SHA1(cdddd2a033291585e25839e864e898ef36f4d287) ) - ROM_LOAD( "whizz.t9", 0x10000, 0x10000, CRC(d7345fb9) SHA1(9da907c2bcacc750426a2989bae3c3e5fcc3e3ab) ) - ROM_RELOAD( 0x30000, 0x10000) - ROM_LOAD( "whizz.t8", 0x20000, 0x10000, CRC(41428dac) SHA1(16ae6c178b91e5cd859deb13176b7333f05c378a) ) - ROM_LOAD( "whizz.t13", 0x40000, 0x10000, CRC(0eba10bd) SHA1(e2504a5576c6af6c5bdb0263e1d3cb9ccabde3f8) ) - ROM_LOAD( "whizz.t12", 0x50000, 0x10000, CRC(c65050ce) SHA1(f90616aa4e1f80d8d7fccf5748f564cb7bc2d83a) ) - ROM_RELOAD( 0x70000, 0x10000) - ROM_LOAD( "whizz.t11", 0x60000, 0x10000, CRC(51a2c65d) SHA1(a89f46d581d2907b7813454925ce690af007997d) ) + ROM_LOAD( "t-10.y10", 0x00000, 0x10000, CRC(b678ef5b) SHA1(cdddd2a033291585e25839e864e898ef36f4d287) ) + ROM_LOAD( "t-9.w10", 0x10000, 0x10000, CRC(d7345fb9) SHA1(9da907c2bcacc750426a2989bae3c3e5fcc3e3ab) ) + ROM_RELOAD( 0x30000, 0x10000) + ROM_LOAD( "t-8.u10", 0x20000, 0x10000, CRC(41428dac) SHA1(16ae6c178b91e5cd859deb13176b7333f05c378a) ) + ROM_LOAD( "t-13.y11", 0x40000, 0x10000, CRC(0eba10bd) SHA1(e2504a5576c6af6c5bdb0263e1d3cb9ccabde3f8) ) + ROM_LOAD( "t-12.w11", 0x50000, 0x10000, CRC(c65050ce) SHA1(f90616aa4e1f80d8d7fccf5748f564cb7bc2d83a) ) + ROM_RELOAD( 0x70000, 0x10000) + ROM_LOAD( "t-11.u11", 0x60000, 0x10000, CRC(51a2c65d) SHA1(a89f46d581d2907b7813454925ce690af007997d) ) ROM_REGION( 0x40000, REGION_GFX3, ROMREGION_DISPOSE ) - ROM_LOAD( "whizz.t2", 0x00000, 0x10000, CRC(9c106835) SHA1(7e032e65e78c380b5f03a4febd6dcd3f0bdb642b) ) /* sprites */ - ROM_LOAD( "whizz.t3", 0x10000, 0x10000, CRC(9b421ccf) SHA1(0365d48437da0f90c1c146da0605139a3da0b03b) ) - ROM_LOAD( "whizz.t4", 0x20000, 0x10000, CRC(3a1db986) SHA1(5435e891eebe5b95a5a97ee8743a8a10282e4d19) ) - ROM_LOAD( "whizz.t5", 0x30000, 0x10000, CRC(9bd22190) SHA1(7a571becde02ea4b64db4138f00408f312bf54c0) ) + ROM_LOAD( "t-2.a5", 0x00000, 0x10000, CRC(9c106835) SHA1(7e032e65e78c380b5f03a4febd6dcd3f0bdb642b) ) /* sprites */ + ROM_LOAD( "t-3.b5", 0x10000, 0x10000, CRC(9b421ccf) SHA1(0365d48437da0f90c1c146da0605139a3da0b03b) ) + ROM_LOAD( "t-4.a7", 0x20000, 0x10000, CRC(3a1db986) SHA1(5435e891eebe5b95a5a97ee8743a8a10282e4d19) ) + ROM_LOAD( "t-5.b7", 0x30000, 0x10000, CRC(9bd22190) SHA1(7a571becde02ea4b64db4138f00408f312bf54c0) ) ROM_REGION( 0x08000, REGION_GFX4, 0 ) /* background tilemaps */ - ROM_LOAD( "whizz.t7", 0x0000, 0x8000, CRC(a8b5f750) SHA1(94eb7af3cb8bee87ce3d31260e3bde062ebbc8f0) ) + ROM_LOAD( "t-7.y8", 0x0000, 0x8000, CRC(a8b5f750) SHA1(94eb7af3cb8bee87ce3d31260e3bde062ebbc8f0) ) ROM_END -ROM_START( whizz ) +ROM_START( whizz ) /* Whizz Philko 1989. Original pcb. Boardnumber: 01-90 / Serial: WZ-089-00845 */ ROM_REGION( 0x20000, REGION_CPU1, 0 ) /* 64k for code + banked ROMs images */ - ROM_LOAD( "whizz.t15", 0x00000, 0x08000, CRC(73161302) SHA1(de815bba66c376cea775139f4285de0b1a589d88) ) - ROM_LOAD( "whizz.t14", 0x10000, 0x10000, CRC(bf248879) SHA1(f46f15e3949221e59d8c37de9c23473a74c2927e) ) + ROM_LOAD( "t-15.l11", 0x00000, 0x08000, CRC(73161302) SHA1(de815bba66c376cea775139f4285de0b1a589d88) ) + ROM_LOAD( "t-14.k11", 0x10000, 0x10000, CRC(bf248879) SHA1(f46f15e3949221e59d8c37de9c23473a74c2927e) ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */ - ROM_LOAD( "whizz.t1", 0x0000, 0x8000, CRC(b84bc980) SHA1(d2d302a96a9e3197f27144e525a901cfb9da09e4) ) + ROM_LOAD( "t-1.b4", 0x0000, 0x8000, CRC(b84bc980) SHA1(d2d302a96a9e3197f27144e525a901cfb9da09e4) ) ROM_REGION( 0x8000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "whizz.t6", 0x04000, 0x04000, CRC(8e4ca776) SHA1(412a47f030e3b491e23e5696ef88d065f9de0220) ) /* characters */ - ROM_CONTINUE( 0x00000, 0x04000 ) /* is the first half used? */ + ROM_LOAD( "t-6.r6", 0x04000, 0x04000, CRC(8e4ca776) SHA1(412a47f030e3b491e23e5696ef88d065f9de0220) ) /* characters */ + ROM_CONTINUE( 0x00000, 0x04000 ) /* is the first half used? */ ROM_REGION( 0x80000, REGION_GFX2, ROMREGION_DISPOSE ) - ROM_LOAD( "whizz.t10", 0x00000, 0x10000, CRC(b678ef5b) SHA1(cdddd2a033291585e25839e864e898ef36f4d287) ) - ROM_LOAD( "whizz.t9", 0x10000, 0x10000, CRC(d7345fb9) SHA1(9da907c2bcacc750426a2989bae3c3e5fcc3e3ab) ) - ROM_RELOAD( 0x30000, 0x10000) - ROM_LOAD( "whizz.t8", 0x20000, 0x10000, CRC(41428dac) SHA1(16ae6c178b91e5cd859deb13176b7333f05c378a) ) - ROM_LOAD( "whizz.t13", 0x40000, 0x10000, CRC(0eba10bd) SHA1(e2504a5576c6af6c5bdb0263e1d3cb9ccabde3f8) ) - ROM_LOAD( "whizz.t12", 0x50000, 0x10000, CRC(c65050ce) SHA1(f90616aa4e1f80d8d7fccf5748f564cb7bc2d83a) ) - ROM_RELOAD( 0x70000, 0x10000) - ROM_LOAD( "whizz.t11", 0x60000, 0x10000, CRC(51a2c65d) SHA1(a89f46d581d2907b7813454925ce690af007997d) ) + ROM_LOAD( "t-10.y10", 0x00000, 0x10000, CRC(b678ef5b) SHA1(cdddd2a033291585e25839e864e898ef36f4d287) ) + ROM_LOAD( "t-9.w10", 0x10000, 0x10000, CRC(d7345fb9) SHA1(9da907c2bcacc750426a2989bae3c3e5fcc3e3ab) ) + ROM_RELOAD( 0x30000, 0x10000) + ROM_LOAD( "t-8.u10", 0x20000, 0x10000, CRC(41428dac) SHA1(16ae6c178b91e5cd859deb13176b7333f05c378a) ) + ROM_LOAD( "t-13.y11", 0x40000, 0x10000, CRC(0eba10bd) SHA1(e2504a5576c6af6c5bdb0263e1d3cb9ccabde3f8) ) + ROM_LOAD( "t-12.w11", 0x50000, 0x10000, CRC(c65050ce) SHA1(f90616aa4e1f80d8d7fccf5748f564cb7bc2d83a) ) + ROM_RELOAD( 0x70000, 0x10000) + ROM_LOAD( "t-11.u11", 0x60000, 0x10000, CRC(51a2c65d) SHA1(a89f46d581d2907b7813454925ce690af007997d) ) ROM_REGION( 0x40000, REGION_GFX3, ROMREGION_DISPOSE ) - ROM_LOAD( "whizz.t2", 0x00000, 0x10000, CRC(9c106835) SHA1(7e032e65e78c380b5f03a4febd6dcd3f0bdb642b) ) /* sprites */ - ROM_LOAD( "whizz.t3", 0x10000, 0x10000, CRC(9b421ccf) SHA1(0365d48437da0f90c1c146da0605139a3da0b03b) ) - ROM_LOAD( "whizz.t4", 0x20000, 0x10000, CRC(3a1db986) SHA1(5435e891eebe5b95a5a97ee8743a8a10282e4d19) ) - ROM_LOAD( "whizz.t5", 0x30000, 0x10000, CRC(9bd22190) SHA1(7a571becde02ea4b64db4138f00408f312bf54c0) ) + ROM_LOAD( "t-2.a5", 0x00000, 0x10000, CRC(9c106835) SHA1(7e032e65e78c380b5f03a4febd6dcd3f0bdb642b) ) /* sprites */ + ROM_LOAD( "t-3.b5", 0x10000, 0x10000, CRC(9b421ccf) SHA1(0365d48437da0f90c1c146da0605139a3da0b03b) ) + ROM_LOAD( "t-4.a7", 0x20000, 0x10000, CRC(3a1db986) SHA1(5435e891eebe5b95a5a97ee8743a8a10282e4d19) ) + ROM_LOAD( "t-5.b7", 0x30000, 0x10000, CRC(9bd22190) SHA1(7a571becde02ea4b64db4138f00408f312bf54c0) ) ROM_REGION( 0x08000, REGION_GFX4, 0 ) /* background tilemaps */ - ROM_LOAD( "whizz.t7", 0x0000, 0x8000, CRC(a8b5f750) SHA1(94eb7af3cb8bee87ce3d31260e3bde062ebbc8f0) ) + ROM_LOAD( "t-7.y8", 0x0000, 0x8000, CRC(a8b5f750) SHA1(94eb7af3cb8bee87ce3d31260e3bde062ebbc8f0) ) ROM_END static DRIVER_INIT( sidearms ) { sidearms_gameid = 0; } diff --git a/src/drivers/silkroad.c b/src/drivers/silkroad.c index 76a25f74c..d23c8b205 100644 --- a/src/drivers/silkroad.c +++ b/src/drivers/silkroad.c @@ -140,18 +140,8 @@ VIDEO_UPDATE(silkroad); static WRITE32_HANDLER( paletteram32_xRRRRRGGGGGBBBBB_dword_w ) { - int r,g,b; COMBINE_DATA(&paletteram32[offset]); - - r = (paletteram32[offset] & 0x7c000000) >> (10+16); - g = (paletteram32[offset] & 0x03e00000) >> (5+16); - b = (paletteram32[offset] & 0x001f0000) >> (0+16); - - b = b << 3; - r = r << 3; - g = g << 3; - - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,pal5bit(paletteram32[offset] >> (10+16)),pal5bit(paletteram32[offset] >> (5+16)),pal5bit(paletteram32[offset] >> (0+16))); } /* player inputs */ diff --git a/src/drivers/simpl156.c b/src/drivers/simpl156.c index 1496a2d3f..fb16fa6a5 100644 --- a/src/drivers/simpl156.c +++ b/src/drivers/simpl156.c @@ -140,7 +140,6 @@ READ32_HANDLER( simpl156_palette_r ) WRITE32_HANDLER( simpl156_palette_w ) { - int r,g,b; UINT16 dat; int color; @@ -151,16 +150,7 @@ WRITE32_HANDLER( simpl156_palette_w ) color = offset; dat = paletteram16[offset]&0xffff; - - g = (dat >> 5) & 0x1f; - r = (dat >> 0) & 0x1f; - b = (dat >> 10) & 0x1f; - - g = (g << 3) | (g >> 2); - r = (r << 3) | (r >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(color,r,g,b); + palette_set_color(Machine,color,pal5bit(dat >> 0),pal5bit(dat >> 5),pal5bit(dat >> 10)); } @@ -1065,7 +1055,7 @@ static READ32_HANDLER( joemacr_speedup_r ) static DRIVER_INIT (joemacr) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x0201018, 0x020101b, 0, 0, joemacr_speedup_r ); - init_simpl156(); + init_simpl156(machine); } static READ32_HANDLER( chainrec_speedup_r ) @@ -1077,7 +1067,7 @@ static READ32_HANDLER( chainrec_speedup_r ) static DRIVER_INIT (chainrec) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x0201018, 0x020101b, 0, 0, chainrec_speedup_r ); - init_simpl156(); + init_simpl156(machine); simpl156_default_eeprom = chainrec_eeprom; } @@ -1090,14 +1080,14 @@ static READ32_HANDLER( prtytime_speedup_r ) static DRIVER_INIT (prtytime) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x0201ae0, 0x0201ae3, 0, 0, prtytime_speedup_r ); - init_simpl156(); + init_simpl156(machine); simpl156_default_eeprom = prtytime_eeprom; } static DRIVER_INIT (gangonta) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x0201ae0, 0x0201ae3, 0, 0, prtytime_speedup_r ); - init_simpl156(); + init_simpl156(machine); simpl156_default_eeprom = gangonta_eeprom; } @@ -1111,7 +1101,7 @@ static READ32_HANDLER( charlien_speedup_r ) static DRIVER_INIT (charlien) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x0201010, 0x0201013, 0, 0, charlien_speedup_r ); - init_simpl156(); + init_simpl156(machine); } static READ32_HANDLER( osman_speedup_r ) @@ -1123,7 +1113,7 @@ static READ32_HANDLER( osman_speedup_r ) static DRIVER_INIT (osman) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x0201010, 0x0201013, 0, 0, osman_speedup_r ); - init_simpl156(); + init_simpl156(machine); simpl156_default_eeprom = osman_eeprom; } @@ -1131,7 +1121,7 @@ static DRIVER_INIT (osman) static DRIVER_INIT (candance) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x0201010, 0x0201013, 0, 0, osman_speedup_r ); - init_simpl156(); + init_simpl156(machine); simpl156_default_eeprom = candance_eeprom; } diff --git a/src/drivers/skyarmy.c b/src/drivers/skyarmy.c index 20edeabcc..69e0530a1 100644 --- a/src/drivers/skyarmy.c +++ b/src/drivers/skyarmy.c @@ -92,7 +92,7 @@ PALETTE_INIT( skyarmy ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/drivers/skychut.c b/src/drivers/skychut.c index aadfc2c2a..4170c5c0f 100644 --- a/src/drivers/skychut.c +++ b/src/drivers/skychut.c @@ -102,14 +102,14 @@ static PALETTE_INIT( skychut ) { int i; - palette_set_color(0,0xff,0xff,0xff); - palette_set_color(1,0xff,0xff,0x00); - palette_set_color(2,0xff,0x00,0xff); - palette_set_color(3,0xff,0x00,0x00); - palette_set_color(4,0x00,0xff,0xff); - palette_set_color(5,0x00,0xff,0x00); - palette_set_color(6,0x00,0x00,0xff); - palette_set_color(7,0x00,0x00,0x00); + palette_set_color(machine,0,0xff,0xff,0xff); + palette_set_color(machine,1,0xff,0xff,0x00); + palette_set_color(machine,2,0xff,0x00,0xff); + palette_set_color(machine,3,0xff,0x00,0x00); + palette_set_color(machine,4,0x00,0xff,0xff); + palette_set_color(machine,5,0x00,0xff,0x00); + palette_set_color(machine,6,0x00,0x00,0xff); + palette_set_color(machine,7,0x00,0x00,0x00); for (i = 0;i < 8;i++) { diff --git a/src/drivers/skydiver.c b/src/drivers/skydiver.c index e171ece02..bd7f88694 100644 --- a/src/drivers/skydiver.c +++ b/src/drivers/skydiver.c @@ -110,9 +110,9 @@ static unsigned short colortable_source[] = static PALETTE_INIT( skydiver ) { - palette_set_color(0,0x00,0x00,0x00); /* black */ - palette_set_color(1,0xff,0xff,0xff); /* white */ - palette_set_color(2,0xa0,0xa0,0xa0); /* grey */ + palette_set_color(machine,0,0x00,0x00,0x00); /* black */ + palette_set_color(machine,1,0xff,0xff,0xff); /* white */ + palette_set_color(machine,2,0xa0,0xa0,0xa0); /* grey */ memcpy(colortable,colortable_source,sizeof(colortable_source)); } diff --git a/src/drivers/skyraid.c b/src/drivers/skyraid.c index e8aee8ab9..25b77e045 100644 --- a/src/drivers/skyraid.c +++ b/src/drivers/skyraid.c @@ -21,26 +21,26 @@ static int analog_offset; static PALETTE_INIT( skyraid ) { - palette_set_color( 0, 0x00, 0x00, 0x00); /* terrain */ - palette_set_color( 1, 0x18, 0x18, 0x18); - palette_set_color( 2, 0x30, 0x30, 0x30); - palette_set_color( 3, 0x48, 0x48, 0x48); - palette_set_color( 4, 0x60, 0x60, 0x60); - palette_set_color( 5, 0x78, 0x78, 0x78); - palette_set_color( 6, 0x90, 0x90, 0x90); - palette_set_color( 7, 0xA8, 0xA8, 0xA8); - palette_set_color( 8, 0x10, 0x10, 0x10); /* sprites */ - palette_set_color( 9, 0xE0, 0xE0, 0xE0); - palette_set_color(10, 0xA0, 0xA0, 0xA0); - palette_set_color(11, 0x48, 0x48, 0x48); - palette_set_color(12, 0x10, 0x10, 0x10); - palette_set_color(13, 0x48, 0x48, 0x48); - palette_set_color(14, 0xA0, 0xA0, 0xA0); - palette_set_color(15, 0xE0, 0xE0, 0xE0); - palette_set_color(16, 0x00, 0x00, 0x00); /* missiles */ - palette_set_color(17, 0xFF, 0xFF, 0xFF); - palette_set_color(18, 0x00, 0x00, 0x00); /* text */ - palette_set_color(19, 0xE0, 0xE0, 0xE0); + palette_set_color(machine, 0, 0x00, 0x00, 0x00); /* terrain */ + palette_set_color(machine, 1, 0x18, 0x18, 0x18); + palette_set_color(machine, 2, 0x30, 0x30, 0x30); + palette_set_color(machine, 3, 0x48, 0x48, 0x48); + palette_set_color(machine, 4, 0x60, 0x60, 0x60); + palette_set_color(machine, 5, 0x78, 0x78, 0x78); + palette_set_color(machine, 6, 0x90, 0x90, 0x90); + palette_set_color(machine, 7, 0xA8, 0xA8, 0xA8); + palette_set_color(machine, 8, 0x10, 0x10, 0x10); /* sprites */ + palette_set_color(machine, 9, 0xE0, 0xE0, 0xE0); + palette_set_color(machine, 10, 0xA0, 0xA0, 0xA0); + palette_set_color(machine, 11, 0x48, 0x48, 0x48); + palette_set_color(machine, 12, 0x10, 0x10, 0x10); + palette_set_color(machine, 13, 0x48, 0x48, 0x48); + palette_set_color(machine, 14, 0xA0, 0xA0, 0xA0); + palette_set_color(machine, 15, 0xE0, 0xE0, 0xE0); + palette_set_color(machine, 16, 0x00, 0x00, 0x00); /* missiles */ + palette_set_color(machine, 17, 0xFF, 0xFF, 0xFF); + palette_set_color(machine, 18, 0x00, 0x00, 0x00); /* text */ + palette_set_color(machine, 19, 0xE0, 0xE0, 0xE0); } diff --git a/src/drivers/slapshot.c b/src/drivers/slapshot.c index 1f16232dc..4f76240e1 100644 --- a/src/drivers/slapshot.c +++ b/src/drivers/slapshot.c @@ -170,7 +170,7 @@ static WRITE16_HANDLER( color_ram_word_w ) g = (color_ram[offset] &0xff00) >> 8; b = (color_ram[offset] &0xff); - palette_set_color(offset/2,r,g,b); + palette_set_color(Machine,offset/2,r,g,b); } } diff --git a/src/drivers/sliver.c b/src/drivers/sliver.c index e4790c22e..33867be28 100644 --- a/src/drivers/sliver.c +++ b/src/drivers/sliver.c @@ -62,7 +62,7 @@ WS16-AJ-940820 READ16_HANDLER( sliver_rand ) { - return mame_rand(); + return mame_rand(Machine); } static ADDRESS_MAP_START( sliver_map, ADDRESS_SPACE_PROGRAM, 16 ) diff --git a/src/drivers/solomon.c b/src/drivers/solomon.c index a253f9217..d37813429 100644 --- a/src/drivers/solomon.c +++ b/src/drivers/solomon.c @@ -49,49 +49,35 @@ static READ8_HANDLER( solomon_0xe603_r ) } -static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0xbfff) AM_READ(MRA8_ROM) - AM_RANGE(0xc000, 0xcfff) AM_READ(MRA8_RAM) /* RAM */ - AM_RANGE(0xd000, 0xdfff) AM_READ(MRA8_RAM) /* video + color + bg */ - AM_RANGE(0xe000, 0xe07f) AM_READ(MRA8_RAM) /* spriteram */ - AM_RANGE(0xe400, 0xe5ff) AM_READ(MRA8_RAM) /* paletteram */ +static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0xbfff) AM_ROM + AM_RANGE(0xc000, 0xcfff) AM_RAM + AM_RANGE(0xd000, 0xd3ff) AM_READWRITE(MRA8_RAM, solomon_colorram_w) AM_BASE(&colorram) + AM_RANGE(0xd400, 0xd7ff) AM_READWRITE(MRA8_RAM, solomon_videoram_w) AM_BASE(&videoram) + AM_RANGE(0xd800, 0xdbff) AM_READWRITE(MRA8_RAM, solomon_colorram2_w) AM_BASE(&solomon_colorram2) + AM_RANGE(0xdc00, 0xdfff) AM_READWRITE(MRA8_RAM, solomon_videoram2_w) AM_BASE(&solomon_videoram2) + AM_RANGE(0xe000, 0xe07f) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) + AM_RANGE(0xe400, 0xe5ff) AM_READWRITE(MRA8_RAM, paletteram_xxxxBBBBGGGGRRRR_le_w) AM_BASE(&paletteram) AM_RANGE(0xe600, 0xe600) AM_READ(input_port_0_r) AM_RANGE(0xe601, 0xe601) AM_READ(input_port_1_r) AM_RANGE(0xe602, 0xe602) AM_READ(input_port_2_r) AM_RANGE(0xe603, 0xe603) AM_READ(solomon_0xe603_r) AM_RANGE(0xe604, 0xe604) AM_READ(input_port_3_r) /* DSW1 */ AM_RANGE(0xe605, 0xe605) AM_READ(input_port_4_r) /* DSW2 */ - AM_RANGE(0xf000, 0xffff) AM_READ(MRA8_ROM) -ADDRESS_MAP_END - -static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0xbfff) AM_WRITE(MWA8_ROM) - AM_RANGE(0xc000, 0xcfff) AM_WRITE(MWA8_RAM) - AM_RANGE(0xd000, 0xd3ff) AM_WRITE(solomon_colorram_w) AM_BASE(&colorram) - AM_RANGE(0xd400, 0xd7ff) AM_WRITE(solomon_videoram_w) AM_BASE(&videoram) - AM_RANGE(0xd800, 0xdbff) AM_WRITE(solomon_colorram2_w) AM_BASE(&solomon_colorram2) - AM_RANGE(0xdc00, 0xdfff) AM_WRITE(solomon_videoram2_w) AM_BASE(&solomon_videoram2) - AM_RANGE(0xe000, 0xe07f) AM_WRITE(MWA8_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) - AM_RANGE(0xe400, 0xe5ff) AM_WRITE(paletteram_xxxxBBBBGGGGRRRR_le_w) AM_BASE(&paletteram) AM_RANGE(0xe600, 0xe600) AM_WRITE(interrupt_enable_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_WRITE(MWA8_ROM) + AM_RANGE(0xf000, 0xffff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( solomon_sound_readmem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x3fff) AM_READ(MRA8_ROM) - AM_RANGE(0x4000, 0x47ff) AM_READ(MRA8_RAM) +static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x3fff) AM_ROM + AM_RANGE(0x4000, 0x47ff) AM_RAM AM_RANGE(0x8000, 0x8000) AM_READ(soundlatch_r) -ADDRESS_MAP_END - -static ADDRESS_MAP_START( solomon_sound_writemem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x3fff) AM_WRITE(MWA8_ROM) - AM_RANGE(0x4000, 0x47ff) AM_WRITE(MWA8_RAM) AM_RANGE(0xffff, 0xffff) AM_WRITE(MWA8_NOP) /* watchdog? */ ADDRESS_MAP_END -static ADDRESS_MAP_START( solomon_sound_writeport, ADDRESS_SPACE_IO, 8 ) +static ADDRESS_MAP_START( sound_portmap, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) AM_RANGE(0x10, 0x10) AM_WRITE(AY8910_control_port_0_w) AM_RANGE(0x11, 0x11) AM_WRITE(AY8910_write_port_0_w) @@ -220,13 +206,12 @@ static MACHINE_DRIVER_START( solomon ) /* basic machine hardware */ MDRV_CPU_ADD(Z80, 4000000) /* 4.0 MHz (?????) */ - MDRV_CPU_PROGRAM_MAP(readmem,writemem) + MDRV_CPU_PROGRAM_MAP(main_map,0) MDRV_CPU_VBLANK_INT(nmi_line_pulse,1) MDRV_CPU_ADD(Z80, 3072000) - /* audio CPU */ - MDRV_CPU_PROGRAM_MAP(solomon_sound_readmem,solomon_sound_writemem) - MDRV_CPU_IO_MAP(0,solomon_sound_writeport) + MDRV_CPU_PROGRAM_MAP(sound_map,0) + MDRV_CPU_IO_MAP(sound_portmap,0) MDRV_CPU_VBLANK_INT(irq0_line_hold,2) /* ??? */ /* NMIs are caused by the main CPU */ MDRV_FRAMES_PER_SECOND(60) @@ -262,6 +247,33 @@ MACHINE_DRIVER_END ***************************************************************************/ ROM_START( solomon ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ + ROM_LOAD( "6.3f", 0x00000, 0x4000, CRC(645eb0f3) SHA1(b911aa157ad94aa539dbe329a197d8902860c809) ) + ROM_LOAD( "7.3h", 0x08000, 0x4000, CRC(1bf5c482) SHA1(3b6a8dde72cddf95438539c5dc4622c95f932a04) ) + ROM_CONTINUE( 0x04000, 0x4000 ) + ROM_LOAD( "8.3jk", 0x0f000, 0x1000, CRC(0a6cdefc) SHA1(101acaa19b779cb8b4fffddbe63fe011c7d4b6e9) ) + ROM_IGNORE( 0x7000 ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */ + ROM_LOAD( "1.3jk", 0x0000, 0x4000, CRC(fa6e562e) SHA1(713036c0a80b623086aa674bb5f8a135b6fedb01) ) + + ROM_REGION( 0x10000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "12.3t", 0x00000, 0x08000, CRC(b371291c) SHA1(27302898c64330870c47025e61bd5acbd9483865) ) /* characters */ + ROM_LOAD( "11.3r", 0x08000, 0x08000, CRC(6f94d2af) SHA1(2e070c0fd5b9d7eb9b7e0d53f25b1a5063ef3095) ) + + ROM_REGION( 0x10000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "10.3p", 0x00000, 0x08000, CRC(8310c2a1) SHA1(8cc87ab8faacdb1973791d207bb25ea9b444b66d) ) + ROM_LOAD( "9.3m", 0x08000, 0x08000, CRC(ab7e6c42) SHA1(0fc3b4a0bd2b17b79e2d1f7d4fe445c09ce4e730) ) + + ROM_REGION( 0x10000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD( "2.5lm", 0x00000, 0x04000, CRC(80fa2be3) SHA1(8e7a78186473a6b5c42577ac9e4591ee2d1151f2) ) /* sprites */ + ROM_LOAD( "3.6lm", 0x04000, 0x04000, CRC(236106b4) SHA1(8eaf3150568c407bd8dc1cdf874b8417e5cca3d2) ) + ROM_LOAD( "4.7lm", 0x08000, 0x04000, CRC(088fe5d9) SHA1(e29ffb9fcff50ce982d5e502e10a8e29a4c47390) ) + ROM_LOAD( "5.8lm", 0x0c000, 0x04000, CRC(8366232a) SHA1(1c7a01dab056ec7d787a6f55772b9fa6fe67305a) ) +ROM_END + + +ROM_START( solomonj ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ ROM_LOAD( "slmn_06.bin", 0x00000, 0x4000, CRC(e4d421ff) SHA1(9599fa6e2d42bf0cfe77d62c6b162f56eae5efff) ) ROM_LOAD( "slmn_07.bin", 0x08000, 0x4000, CRC(d52d7e38) SHA1(8439eeeedd1e47d2b9719a05c85a05283c11d7a8) ) @@ -288,4 +300,5 @@ ROM_END -GAME( 1986, solomon, 0, solomon, solomon, 0, ROT0, "Tecmo", "Solomon's Key (Japan)", 0 ) +GAME( 1986, solomon, 0, solomon, solomon, 0, ROT0, "Tecmo", "Solomon's Key (US)", 0 ) +GAME( 1986, solomonj, solomon, solomon, solomon, 0, ROT0, "Tecmo", "Solomon's Key (Japan)", 0 ) diff --git a/src/drivers/spaceg.c b/src/drivers/spaceg.c index e30cba891..1d63400f3 100644 --- a/src/drivers/spaceg.c +++ b/src/drivers/spaceg.c @@ -186,26 +186,26 @@ static PALETTE_INIT( spaceg ) int i; for (i=0; i<128; i++) - palette_set_color (i, 0x00,0x00,0x00); - - - palette_set_color (0, 0x00,0x00,0x00); //ok czarny - palette_set_color (1, 0x7f,0x00,0x00);//??? - palette_set_color (2, 0xff,0xff,0xff); //ok+ bialy - palette_set_color (3, 0xff,0x00,0x00); //ok j.czerw. - palette_set_color (4, 0x3f,0x3f,0xff); //ok j.niebieski - palette_set_color (5, 0x3f,0xff,0x3f); //ok j.zielony - palette_set_color (6, 0xff,0xbf,0xbf); //ok+ 'majtki' - palette_set_color (7, 0xff,0xff,0x00); //ok+ zolty - - palette_set_color (8, 0xff,0x7f,0x00); //ok+ pomaranczowy - palette_set_color (9, 0x3f,0xbf,0xff); //ok j.niebieski (ciemniejszy od 13) - palette_set_color (10,0x3f,0xbf,0x3f); //ok+ c.zielony - palette_set_color (11,0x00,0xff,0x00); //ok j.zielony - palette_set_color (12,0x7f,0x00,0x00); //ok brazowy (c.czerw) - palette_set_color (13,0x7f,0xbf,0xff); //ok j.niebieski (jasniejszy od 9) - palette_set_color (14,0x00,0xff,0xff);//??? - palette_set_color (15,0x7f,0x7f,0x7f);//??? + palette_set_color (machine, i, 0x00,0x00,0x00); + + + palette_set_color (machine,0, 0x00,0x00,0x00); //ok czarny + palette_set_color (machine,1, 0x7f,0x00,0x00);//??? + palette_set_color (machine,2, 0xff,0xff,0xff); //ok+ bialy + palette_set_color (machine,3, 0xff,0x00,0x00); //ok j.czerw. + palette_set_color (machine,4, 0x3f,0x3f,0xff); //ok j.niebieski + palette_set_color (machine,5, 0x3f,0xff,0x3f); //ok j.zielony + palette_set_color (machine,6, 0xff,0xbf,0xbf); //ok+ 'majtki' + palette_set_color (machine,7, 0xff,0xff,0x00); //ok+ zolty + + palette_set_color (machine,8, 0xff,0x7f,0x00); //ok+ pomaranczowy + palette_set_color (machine,9, 0x3f,0xbf,0xff); //ok j.niebieski (ciemniejszy od 13) + palette_set_color (machine,10,0x3f,0xbf,0x3f); //ok+ c.zielony + palette_set_color (machine,11,0x00,0xff,0x00); //ok j.zielony + palette_set_color (machine,12,0x7f,0x00,0x00); //ok brazowy (c.czerw) + palette_set_color (machine,13,0x7f,0xbf,0xff); //ok j.niebieski (jasniejszy od 9) + palette_set_color (machine,14,0x00,0xff,0xff);//??? + palette_set_color (machine,15,0x7f,0x7f,0x7f);//??? } @@ -272,23 +272,15 @@ int rgbcolor; if ((offset>=0x200) && (offset<0x220)) /* 0xa200- 0xa21f */ { /* palette 1 */ - int r,g,b,col_ind; - r = (rgbcolor >> 0) & 7; - b = (rgbcolor >> 3) & 7; - g = (rgbcolor >> 6) & 7; - col_ind = offset & 0x1f; - palette_set_color(0x10 + 0x00 + col_ind, r*(255.0/7), g*(255.0/7), b*(255.0/7)); + int col_ind = offset & 0x1f; + palette_set_color(Machine, 0x10 + 0x00 + col_ind, pal3bit(rgbcolor >> 0), pal3bit(rgbcolor >> 6), pal3bit(rgbcolor >> 3)); } else if ((offset>=0x300) && (offset<0x320)) /* 0xa300- 0xa31f */ { /* palette 2 */ - int r,g,b,col_ind; - r = (rgbcolor >> 0) & 7; - b = (rgbcolor >> 3) & 7; - g = (rgbcolor >> 6) & 7; - col_ind = offset & 0x1f; - palette_set_color(0x10 + 0x00 + col_ind, r*(255.0/7), g*(255.0/7), b*(255.0/7)); + int col_ind = offset & 0x1f; + palette_set_color(Machine, 0x10 + 0x00 + col_ind, pal3bit(rgbcolor >> 0), pal3bit(rgbcolor >> 6), pal3bit(rgbcolor >> 3)); } else logerror("palette? read from unkram offset = %04x\n",offset); diff --git a/src/drivers/spcforce.c b/src/drivers/spcforce.c index efbf35644..a097dcacd 100644 --- a/src/drivers/spcforce.c +++ b/src/drivers/spcforce.c @@ -245,7 +245,7 @@ static PALETTE_INIT( spcforce ) { int i; for (i = 0; i < 8; i++) - palette_set_color(i, (i & 1) * 0xff, ((i >> 1) & 1) * 0xff, ((i >> 2) & 1) * 0xff); + palette_set_color(machine, i, pal1bit(i >> 0), pal1bit(i >> 1), pal1bit(i >> 2)); memcpy(colortable,colortable_source,sizeof(colortable_source)); } diff --git a/src/drivers/sprint2.c b/src/drivers/sprint2.c index 7194d934e..69c18212f 100644 --- a/src/drivers/sprint2.c +++ b/src/drivers/sprint2.c @@ -120,10 +120,10 @@ static INTERRUPT_GEN( sprint2 ) static PALETTE_INIT( sprint2 ) { - palette_set_color(0, 0x00, 0x00, 0x00); - palette_set_color(1, 0x5b, 0x5b, 0x5b); - palette_set_color(2, 0xa4, 0xa4, 0xa4); - palette_set_color(3, 0xff, 0xff, 0xff); + palette_set_color(machine, 0, 0x00, 0x00, 0x00); + palette_set_color(machine, 1, 0x5b, 0x5b, 0x5b); + palette_set_color(machine, 2, 0xa4, 0xa4, 0xa4); + palette_set_color(machine, 3, 0xff, 0xff, 0xff); colortable[0x0] = 1; /* black playfield */ colortable[0x1] = 0; diff --git a/src/drivers/sprint8.c b/src/drivers/sprint8.c index ea6c9d5c0..cd87000db 100644 --- a/src/drivers/sprint8.c +++ b/src/drivers/sprint8.c @@ -68,7 +68,7 @@ static void input_callback(int dummy) } -static void fill_palette(int team) +static void fill_palette(running_machine *machine, int team) { int i; @@ -76,30 +76,30 @@ static void fill_palette(int team) { if (team) { - palette_set_color(i + 0, 0xff, 0x00, 0x00); /* red */ - palette_set_color(i + 1, 0x00, 0x00, 0xff); /* blue */ - palette_set_color(i + 2, 0xff, 0x00, 0x00); /* red */ - palette_set_color(i + 3, 0x00, 0x00, 0xff); /* blue */ - palette_set_color(i + 4, 0xff, 0x00, 0x00); /* red */ - palette_set_color(i + 5, 0x00, 0x00, 0xff); /* blue */ - palette_set_color(i + 6, 0xff, 0x00, 0x00); /* red */ - palette_set_color(i + 7, 0x00, 0x00, 0xff); /* blue */ + palette_set_color(machine, i + 0, 0xff, 0x00, 0x00); /* red */ + palette_set_color(machine, i + 1, 0x00, 0x00, 0xff); /* blue */ + palette_set_color(machine, i + 2, 0xff, 0x00, 0x00); /* red */ + palette_set_color(machine, i + 3, 0x00, 0x00, 0xff); /* blue */ + palette_set_color(machine, i + 4, 0xff, 0x00, 0x00); /* red */ + palette_set_color(machine, i + 5, 0x00, 0x00, 0xff); /* blue */ + palette_set_color(machine, i + 6, 0xff, 0x00, 0x00); /* red */ + palette_set_color(machine, i + 7, 0x00, 0x00, 0xff); /* blue */ } else { - palette_set_color(i + 0, 0xff, 0x00, 0x00); /* red */ - palette_set_color(i + 1, 0x00, 0x00, 0xff); /* blue */ - palette_set_color(i + 2, 0xff, 0xff, 0x00); /* yellow */ - palette_set_color(i + 3, 0x00, 0xff, 0x00); /* green */ - palette_set_color(i + 4, 0xff, 0x00, 0xff); /* magenta */ - palette_set_color(i + 5, 0xe0, 0xc0, 0x70); /* puce */ - palette_set_color(i + 6, 0x00, 0xff, 0xff); /* cyan */ - palette_set_color(i + 7, 0xff, 0xaa, 0xaa); /* pink */ + palette_set_color(machine, i + 0, 0xff, 0x00, 0x00); /* red */ + palette_set_color(machine, i + 1, 0x00, 0x00, 0xff); /* blue */ + palette_set_color(machine, i + 2, 0xff, 0xff, 0x00); /* yellow */ + palette_set_color(machine, i + 3, 0x00, 0xff, 0x00); /* green */ + palette_set_color(machine, i + 4, 0xff, 0x00, 0xff); /* magenta */ + palette_set_color(machine, i + 5, 0xe0, 0xc0, 0x70); /* puce */ + palette_set_color(machine, i + 6, 0x00, 0xff, 0xff); /* cyan */ + palette_set_color(machine, i + 7, 0xff, 0xaa, 0xaa); /* pink */ } } - palette_set_color(16, 0x00, 0x00, 0x00); - palette_set_color(17, 0xff, 0xff, 0xff); + palette_set_color(machine, 16, 0x00, 0x00, 0x00); + palette_set_color(machine, 17, 0xff, 0xff, 0xff); } @@ -107,7 +107,7 @@ static PALETTE_INIT( sprint8 ) { int i; - fill_palette(0); + fill_palette(machine, 0); for (i = 0; i < 16; i++) { @@ -162,7 +162,7 @@ static WRITE8_HANDLER( sprint8_lockout_w ) static WRITE8_HANDLER( sprint8_team_w ) { - fill_palette(!(data & 1)); + fill_palette(Machine, !(data & 1)); } diff --git a/src/drivers/srmp6.c b/src/drivers/srmp6.c index 4f702dec6..7c7c60593 100644 --- a/src/drivers/srmp6.c +++ b/src/drivers/srmp6.c @@ -127,7 +127,7 @@ VIDEO_UPDATE(srmp6) const UINT16 *finish = source+spriteram_size/2; const gfx_element *gfx = Machine->gfx[0]; - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); // parse sprite list while( source>28)) { - palette_set_color(PS7500_FIFO[1]&0xff, data&0xff,(data>>8)&0xff,(data>>16)&0xff); + palette_set_color(Machine, PS7500_FIFO[1]&0xff, data&0xff,(data>>8)&0xff,(data>>16)&0xff); PS7500_FIFO[1]++; //autoinc } } @@ -314,7 +314,7 @@ static READ32_HANDLER(PS7500_IO_r) switch(offset) { case MSECR: - return mame_rand(); + return mame_rand(Machine); break; case IOLINES: //TODO: eeprom 24c01 @@ -325,7 +325,7 @@ static READ32_HANDLER(PS7500_IO_r) if(flashType==1) return 0; else - return mame_rand(); + return mame_rand(Machine); case IRQSTA: return (PS7500_IO[offset]&(~2))|0x80; @@ -353,7 +353,7 @@ static READ32_HANDLER(PS7500_IO_r) //default: //printf("ior %i @%x\n",offset,activecpu_get_pc()); } - return mame_rand();//PS7500_IO[offset]; + return mame_rand(Machine);//PS7500_IO[offset]; } static WRITE32_HANDLER(PS7500_IO_w) @@ -475,17 +475,17 @@ static WRITE32_HANDLER(debug_w) static READ32_HANDLER(ff4_r) { - return mame_rand()&0x20; + return mame_rand(Machine)&0x20; } static READ32_HANDLER(SIMPLEIO_r) { - return mame_rand()&1; + return mame_rand(Machine)&1; } static READ32_HANDLER(randomized_r) { - return mame_rand(); + return mame_rand(Machine); } static ADDRESS_MAP_START( ssfindo_map, ADDRESS_SPACE_PROGRAM, 32 ) diff --git a/src/drivers/ssingles.c b/src/drivers/ssingles.c index ef8501cc7..c155b9264 100644 --- a/src/drivers/ssingles.c +++ b/src/drivers/ssingles.c @@ -1,15 +1,53 @@ /* - 'Swinging Singles' by Yachiyo + 'Swinging Singles' by Ent. Ent. Ltd + driver by Tomasz Slanina - xxx game - very preliminary driver by Tomasz Slanina + Crap XXX game. + Three roms contains text "BY YACHIYO" - Bad dump ? - upper half of 7.bin = upper half of 8.bin + Upper half of 7.bin = upper half of 8.bin = intentional or bad dump ? + + TODO: + - colors (proms ? one of unk writes?) + - 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) + + Unknown reads/writes: + - AY i/o ports (writes) + - mem $c000, $c001 = protection device ? if tests fails, game crashes (problems with stack - skipped code with "pop af") + - i/o port $8 = data read used for $e command arg for onr of AY chips (volume? - could be a sample player (based on volume changes?) + - i/o port $1a = 1 or 0, rarely accessed + - i/o ports $fe,$ff (pair, unknown device , $fe = register, $ff = data ?? sample player) + initialized with data: + + 0 34 + 1 24 + 2 2c + 3 14 + 4 f + 5 0 + 6 e + 7 e + 8 0 + 9 f + a 0 + b 0 + c 0 + d 0 + e 0 + f 0 */ #include "driver.h" +#include "sound/ay8910.h" + +static UINT8* ssingles_vram; + +static WRITE8_HANDLER(ssingles_vram_w) +{ + ssingles_vram[offset]=data; +} VIDEO_START(ssingles) { @@ -18,66 +56,173 @@ VIDEO_START(ssingles) VIDEO_UPDATE(ssingles) { + int x,y; + int addr=0; + for(y=0;y<32;y++) + { + for(x=0;x<18;x++) + { + int code=ssingles_vram[addr]+256*(ssingles_vram[addr+0x800]&3); + addr++; + drawgfx(bitmap,Machine->gfx[0], + code, + 0, + 0,0, + x<<4, y<<4, + 0,TRANSPARENCY_NONE,0); + } + } return 0; } +static READ8_HANDLER(prot_r) +{ + int address=activecpu_get_pc(); + switch(address) + { + case 0x638c: + case 0x638e: return 0; // not used = device reset /clear ? + case 0x6392: return 0x80; //1st check + case 0x639c: return 0xc4; //2nd check + default: logerror("unk protection read @ %x\n",address); + } + return 0; +} + +static WRITE8_HANDLER(prot_w) +{ + int address=activecpu_get_pc(); + switch(address) + { + case 0x6390: + case 0x639a: break;// do nothing + default: logerror("unk protection write %x @ %x\n",data,address); + } +} + +static READ8_HANDLER(controls_r) +{ + int data=7; + switch(input_port_1_r(0)) //multiplexed + { + case 0x01: data=1; break; + case 0x02: data=2; break; + case 0x04: data=3; break; + case 0x08: data=4; break; + case 0x10: data=5; break; + case 0x20: data=6; break; + case 0x40: data=0; break; + } + return (input_port_0_r(0)&(~0x1c))|(data<<2); +} + static ADDRESS_MAP_START( ssingles_map, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x1fff) AM_ROM + AM_RANGE(0x0000, 0x1fff) AM_READ( MRA8_ROM ) AM_WRITE(ssingles_vram_w) + AM_RANGE(0xc000, 0xc001) AM_READWRITE( prot_r, prot_w ) //protection AM_RANGE(0x6000, 0xbfff) AM_ROM AM_RANGE(0xf800, 0xffff) AM_RAM ADDRESS_MAP_END static ADDRESS_MAP_START( ssingles_io_map, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) - AM_RANGE(0x00, 0x00) AM_WRITENOP //e 3f - audio 1 (volume?) - AM_RANGE(0x04, 0x04) AM_WRITENOP + AM_RANGE(0x00, 0x00) AM_WRITE(AY8910_control_port_0_w) + AM_RANGE(0x04, 0x04) AM_WRITE(AY8910_write_port_0_w) + AM_RANGE(0x06, 0x06) AM_WRITE(AY8910_control_port_1_w) + AM_RANGE(0x08, 0x08) AM_READNOP + AM_RANGE(0x0a, 0x0a) AM_WRITE(AY8910_write_port_1_w) + AM_RANGE(0x16, 0x16) AM_READ(input_port_2_r) + AM_RANGE(0x18, 0x18) AM_READ(input_port_3_r) + AM_RANGE(0x1c, 0x1c) AM_READ(controls_r) + AM_RANGE(0x1a, 0x1a) AM_WRITENOP + AM_RANGE(0xfe, 0xff) AM_WRITENOP +ADDRESS_MAP_END + +INPUT_PORTS_START( ssingles ) +PORT_START_TAG("IN0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) //must be LOW - AM_RANGE(0x06, 0x06) AM_WRITENOP //e 3f - audio 2 (volume?) - AM_RANGE(0x0a, 0x0a) AM_WRITENOP + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON4 ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON3 ) - AM_RANGE(0x16, 0x16) AM_READNOP // $6049 - dips ? - AM_RANGE(0x18, 0x18) AM_READNOP // $604e - dips ? - AM_RANGE(0x1c, 0x1c) AM_READNOP // $635c - coin(s) ? (inc+daa after read) +PORT_START_TAG("IN1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START2 ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - AM_RANGE(0x1a, 0x1a) AM_WRITENOP +PORT_START_TAG("DSW0") +PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x03, DEF_STR( Free_Play ) ) +PORT_DIPNAME( 0x20, 0x20, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) - AM_RANGE(0xfe, 0xfe) AM_WRITENOP // index ? (0-f) - AM_RANGE(0xff, 0xff) AM_WRITENOP // data ? -ADDRESS_MAP_END +PORT_DIPNAME( 0x04, 0x04, "Unk1" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) +PORT_DIPNAME( 0x08, 0x08, "Unk2" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Yes ) ) +PORT_DIPNAME( 0x10, 0x10, "Unk3" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Yes ) ) +PORT_DIPNAME( 0x40, 0x40, "Unk4" ) //tested in game, every frame, could be difficulty related + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) +PORT_DIPNAME( 0x80, 0x80, "Unk5" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Yes ) ) -INPUT_PORTS_START( ssingles ) +PORT_START_TAG("DSW1") +PORT_DIPNAME( 0x03, 0x03, "Unk 6" ) + PORT_DIPSETTING( 0x01, "Pos 1" ) + PORT_DIPSETTING( 0x03, "Pos 2" ) + PORT_DIPSETTING( 0x00, "Pos 3" ) + PORT_DIPSETTING( 0x02, "Pos 4" ) +PORT_DIPNAME( 0x04, 0x04, "Unk7" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Yes ) ) +PORT_DIPNAME( 0x08, 0x08, "Unk8" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Yes ) ) +PORT_DIPNAME( 0x10, 0x10, "Unk9" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Yes ) ) +PORT_DIPNAME( 0x20, 0x20, "UnkA" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Yes ) ) +PORT_DIPNAME( 0x40, 0x40, "UnkB" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) +PORT_DIPNAME( 0x80, 0x80, "UnkC" ) + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Yes ) ) INPUT_PORTS_END - static const gfx_layout charlayout = -{ - 8,8, - RGN_FRAC(1,2), - 2, - { 0, RGN_FRAC(1,2) }, - { 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 const gfx_layout charlayout2 = { 16,16, RGN_FRAC(1,4), 2, { 0, RGN_FRAC(1,2) }, - { 0,1,2,3,4,5,6,7,RGN_FRAC(1,4),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 }, + { RGN_FRAC(1,4),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,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}, 8*8*2 }; - static const gfx_decode gfxdecodeinfo[] = { - { REGION_GFX1, 0, &charlayout2, 0x0000, 1 }, - { REGION_GFX1, 0, &charlayout, 0x0000, 1 }, + { REGION_GFX1, 0, &charlayout, 0x0000, 1 }, { -1 } }; @@ -90,21 +235,30 @@ static MACHINE_DRIVER_START( ssingles ) MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION) MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER ) - MDRV_SCREEN_SIZE(256, 256) + MDRV_SCREEN_SIZE(288, 288) - MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) + MDRV_VISIBLE_AREA(0*8, 288-1, 0*8, 224-1) MDRV_GFXDECODE(gfxdecodeinfo) - MDRV_PALETTE_LENGTH(256*200) + MDRV_PALETTE_LENGTH(16*4) //guess MDRV_VIDEO_START(ssingles) MDRV_VIDEO_UPDATE(ssingles) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD(AY8910, 1500000) /* ? MHz */ + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5) + + MDRV_SOUND_ADD(AY8910, 1500000) /* ? MHz */ + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.5) + MACHINE_DRIVER_END ROM_START( ssingles ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* Z80 main CPU */ ROM_LOAD( "1.bin", 0x00000, 0x2000, CRC(43f02215) SHA1(9f04a7d4671ff39fd2bd8ec7afced4981ee7be05) ) - ROM_LOAD( "2.bin", 0x06000, 0x2000, CRC(281f27e4) SHA1(cef28717ab2ed991a5709464c01490f0ab1dc17c) ) ROM_LOAD( "3.bin", 0x08000, 0x2000, CRC(14fdcb65) SHA1(70f7fcb46e74937de0e4037c9fe79349a30d0d07) ) ROM_LOAD( "4.bin", 0x0a000, 0x2000, CRC(acb44685) SHA1(d68aab8b7e68d842a350d3fb76985ac857b1d972) ) @@ -115,7 +269,7 @@ ROM_START( ssingles ) ROM_LOAD( "11.bin", 0x8000, 0x4000, CRC(f7107b29) SHA1(a405926fd3cb4b3d2a1c705dcde25d961dba5884) ) ROM_LOAD( "12.bin", 0xc000, 0x4000, CRC(e5585a93) SHA1(04d55699b56d869066f2be2c6ac48042aa6c3108) ) - ROM_REGION( 0x08000, REGION_USER1, 0 ) /* code ? data ? */ + ROM_REGION( 0x08000, REGION_USER1, 0 ) /* samples ? */ ROM_LOAD( "5.bin", 0x00000, 0x2000, CRC(242a8dda) SHA1(e140893cc05fb8cee75904d98b02626f2565ed1b) ) ROM_LOAD( "6.bin", 0x02000, 0x2000, CRC(85ab8aab) SHA1(566f034e1ba23382442f27457447133a0e0f1cfc) ) ROM_LOAD( "7.bin", 0x04000, 0x2000, CRC(57cc112d) SHA1(fc861c58ae39503497f04d302a9f16fca19b37fb) ) @@ -123,4 +277,11 @@ ROM_START( ssingles ) ROM_END -GAME ( 19??, ssingles, 0, ssingles, ssingles, 0, ROT90, "Yachiyo", "Swinging Singles",GAME_NOT_WORKING|GAME_NO_SOUND ) +static DRIVER_INIT(ssingles) +{ + ssingles_vram=auto_malloc(0x2000); + memset(ssingles_vram,0,0x2000); + state_save_register_global_pointer(ssingles_vram, 0x2000); +} + +GAME ( 1983, ssingles, 0, ssingles, ssingles, ssingles, ROT90, "Ent. Ent. Ltd", "Swinging Singles", GAME_SUPPORTS_SAVE | GAME_WRONG_COLORS | GAME_IMPERFECT_SOUND ) diff --git a/src/drivers/sspeedr.c b/src/drivers/sspeedr.c index 0c3707be4..2c56bf47f 100644 --- a/src/drivers/sspeedr.c +++ b/src/drivers/sspeedr.c @@ -48,7 +48,7 @@ static PALETTE_INIT( sspeedr ) b += 0x4f; } - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); } } diff --git a/src/drivers/ssv.c b/src/drivers/ssv.c index d01d48c61..ab0d93da1 100644 --- a/src/drivers/ssv.c +++ b/src/drivers/ssv.c @@ -135,6 +135,10 @@ To Do: tilemap sprites use the yoffset specified in the sprites-list? (see the 8 pixel gap between the backgrounds and the black rows) +- keithlcy : Backgrounds are offset by $20 pixels, so they're kludged to work; there is a + x&y offsets in the sprite list but in a same frame there are sprite with yoffset = 0 + and sprite with a yoffset = $7c but for all sprite the offset must be the same ($20) + - srmp4 : Backgrounds are offset by $60 pixels, so they're kludged to work - srmp7 : Needs interrupts by the sound chip (not properly hooked up yet). Kludged to work. @@ -143,10 +147,11 @@ To Do: there till the end of the game (a piece of sky to the left of the screen). It seems that the x&y offsets in the sprite list should be apllied to it (-$200,-$200) to move it off screen. But currently those offsets - are ignored for "tilemap" sprites. This may be related to the kludge for srmp4. + are ignored for "tilemap" sprites. This may be related to the kludge for srmp4 + and to the kludge for keithlcy; + +- ultrax : Backgrounds are offset by $10 pixels, so they're kludged to work -- ultrax : bad gfx offsets and wrong visible area -- twineag2 : bad gfx offsets on some scenes code @ $e75cdc @@ -441,7 +446,7 @@ static UINT16 *ssv_input_sel; static READ16_HANDLER( drifto94_rand_r ) { - return mame_rand() & 0xffff; + return mame_rand(Machine) & 0xffff; } static ADDRESS_MAP_START( drifto94_readmem, ADDRESS_SPACE_PROGRAM, 16 ) @@ -3344,7 +3349,7 @@ DRIVER_INIT( survarts ) { init_ssv(); ssv_tilemap_offsx = +0; ssv_tilemap_offsy = -0xef; } DRIVER_INIT( dynagear ) { init_ssv(); ssv_sprites_offsx = -8; ssv_sprites_offsy = +0xec; - ssv_tilemap_offsx = +0; ssv_tilemap_offsy = -0xec; } + ssv_tilemap_offsx = +0; ssv_tilemap_offsy = -0xef; } DRIVER_INIT( sxyreact ) { init_ssv_hypreac2(); // different ssv_sprites_offsx = +0; ssv_sprites_offsy = +0xe8; ssv_tilemap_offsx = +0; ssv_tilemap_offsy = -0xef; } @@ -3352,11 +3357,11 @@ DRIVER_INIT( sxyreac2 ) { init_ssv_hypreac2(); ssv_sprites_offsx = +0; ssv_sprites_offsy = +0xe8; ssv_tilemap_offsx = +0; ssv_tilemap_offsy = -0xef; } DRIVER_INIT( twineag2 ) { init_ssv();interrupt_ultrax=1; - ssv_sprites_offsx = -6; ssv_sprites_offsy = -7; - ssv_tilemap_offsx = -10;ssv_tilemap_offsy = -8; } + ssv_sprites_offsx = -6; ssv_sprites_offsy = +0x01; + ssv_tilemap_offsx = -2; ssv_tilemap_offsy = +0x00; } DRIVER_INIT( ultrax ) { init_ssv();interrupt_ultrax=1; - ssv_sprites_offsx = -8; ssv_sprites_offsy = 0; - ssv_tilemap_offsx = +0; ssv_tilemap_offsy = 0; } + ssv_sprites_offsx = -8; ssv_sprites_offsy = +0x01; + ssv_tilemap_offsx = +0; ssv_tilemap_offsy = +0x00; } DRIVER_INIT( vasara ) { init_ssv(); ssv_sprites_offsx = +0; ssv_sprites_offsy = +0xf0; ssv_tilemap_offsx = +0; ssv_tilemap_offsy = -0xf8; } @@ -5244,7 +5249,7 @@ GAME( 1993, survartu, survarts, survarts, survarts, survarts, ROT0, "American GAME( 1994, drifto94, 0, drifto94, drifto94, drifto94, ROT0, "Visco", "Drift Out '94 - The Hard Order (Japan)", GAME_NO_COCKTAIL ) GAME( 1994, eaglshot, 0, eaglshot, eaglshot, eaglshot, ROT0, "Sammy", "Eagle Shot Golf", GAME_NO_COCKTAIL | GAME_IMPERFECT_GRAPHICS ) GAME( 1995, hypreact, 0, hypreact, hypreact, hypreact, ROT0, "Sammy", "Mahjong Hyper Reaction (Japan)", GAME_NO_COCKTAIL ) -GAME( 1994, twineag2, 0, twineag2, twineag2, twineag2, ROT270, "Seta", "Twin Eagle II - The Rescue Mission", GAME_NO_COCKTAIL | GAME_IMPERFECT_GRAPHICS ) +GAME( 1994, twineag2, 0, twineag2, twineag2, twineag2, ROT270, "Seta", "Twin Eagle II - The Rescue Mission", GAME_NO_COCKTAIL ) GAME( 1995, gdfs, 0, gdfs, gdfs, gdfs, ROT0, "Banpresto", "Mobil Suit Gundam Final Shooting (Japan)", GAME_NO_COCKTAIL ) GAME( 1995, ultrax, 0, ultrax, ultrax, ultrax, ROT270, "Banpresto + Tsuburaya Prod.", "Ultra X Weapons / Ultra Keibitai", GAME_NO_COCKTAIL | GAME_IMPERFECT_GRAPHICS ) GAME( 1996, janjans1, 0, janjans1, janjans1, janjans1, ROT0, "Visco", "Lovely Pop Mahjong JangJang Shimasho (Japan)", GAME_NO_COCKTAIL | GAME_IMPERFECT_GRAPHICS ) diff --git a/src/drivers/starcrus.c b/src/drivers/starcrus.c index af2c1318a..2468accc2 100644 --- a/src/drivers/starcrus.c +++ b/src/drivers/starcrus.c @@ -158,8 +158,8 @@ static unsigned short colortable_source[] = }; static PALETTE_INIT( starcrus ) { - palette_set_color(0,0x00,0x00,0x00); /* Black */ - palette_set_color(1,0xff,0xff,0xff); /* White */ + palette_set_color(machine,0,0x00,0x00,0x00); /* Black */ + palette_set_color(machine,1,0xff,0xff,0xff); /* White */ memcpy(colortable,colortable_source,sizeof(colortable_source)); } diff --git a/src/drivers/starshp1.c b/src/drivers/starshp1.c index 555b61b3c..b66b1f0f8 100644 --- a/src/drivers/starshp1.c +++ b/src/drivers/starshp1.c @@ -55,16 +55,16 @@ static INTERRUPT_GEN( starshp1_interrupt ) } -static void starshp1_write_palette(int inverse) +static void starshp1_write_palette(running_machine *machine, int inverse) { - palette_set_color(inverse ? 7 : 0, 0x00, 0x00, 0x00); - palette_set_color(inverse ? 6 : 1, 0x1e, 0x1e, 0x1e); - palette_set_color(inverse ? 5 : 2, 0x4e, 0x4e, 0x4e); - palette_set_color(inverse ? 4 : 3, 0x6c, 0x6c, 0x6c); - palette_set_color(inverse ? 3 : 4, 0x93, 0x93, 0x93); - palette_set_color(inverse ? 2 : 5, 0xb1, 0xb1, 0xb1); - palette_set_color(inverse ? 1 : 6, 0xe1, 0xe1, 0xe1); - palette_set_color(inverse ? 0 : 7, 0xff, 0xff, 0xff); + palette_set_color(machine, inverse ? 7 : 0, 0x00, 0x00, 0x00); + palette_set_color(machine, inverse ? 6 : 1, 0x1e, 0x1e, 0x1e); + palette_set_color(machine, inverse ? 5 : 2, 0x4e, 0x4e, 0x4e); + palette_set_color(machine, inverse ? 4 : 3, 0x6c, 0x6c, 0x6c); + palette_set_color(machine, inverse ? 3 : 4, 0x93, 0x93, 0x93); + palette_set_color(machine, inverse ? 2 : 5, 0xb1, 0xb1, 0xb1); + palette_set_color(machine, inverse ? 1 : 6, 0xe1, 0xe1, 0xe1); + palette_set_color(machine, inverse ? 0 : 7, 0xff, 0xff, 0xff); } @@ -79,7 +79,7 @@ static PALETTE_INIT( starshp1 ) 0, 6, 6, 7 /* for the spaceship (EXPLODE=1) */ }; - starshp1_write_palette(0); + starshp1_write_palette(machine, 0); memcpy(colortable, colortable_source, sizeof(colortable_source)); } @@ -209,7 +209,7 @@ static WRITE8_HANDLER( starshp1_misc_w ) starshp1_starfield_kill = data; break; case 4: - starshp1_write_palette(data); + starshp1_write_palette(Machine, data); break; case 5: /* BLACK HOLE, not used */ diff --git a/src/drivers/starwars.c b/src/drivers/starwars.c index d39e6ebee..bca23bf7a 100644 --- a/src/drivers/starwars.c +++ b/src/drivers/starwars.c @@ -24,7 +24,6 @@ #include "driver.h" #include "cpu/m6809/m6809.h" -//#include "machine/atari_vg.h" #include "vidhrdw/vector.h" #include "vidhrdw/avgdvg.h" #include "sound/5220intf.h" @@ -32,12 +31,15 @@ #include "starwars.h" #include "slapstic.h" +#define MASTER_CLOCK (12096000) +#define CLOCK_3KHZ (MASTER_CLOCK / 4096) + +UINT8 starwars_is_esb; /* Local variables */ static UINT8 *slapstic_source; static UINT8 *slapstic_base; static UINT8 current_bank; -UINT8 starwars_is_esb; @@ -377,15 +379,16 @@ INPUT_PORTS_END static MACHINE_DRIVER_START( starwars ) /* basic machine hardware */ - MDRV_CPU_ADD(M6809,1500000) + MDRV_CPU_ADD(M6809, MASTER_CLOCK / 8) MDRV_CPU_PROGRAM_MAP(main_map,0) - MDRV_CPU_VBLANK_INT(irq0_line_assert,8) /* 244Hz */ + MDRV_CPU_PERIODIC_INT(irq0_line_assert, TIME_IN_HZ(CLOCK_3KHZ / 12)) + MDRV_WATCHDOG_TIME_INIT(TIME_IN_HZ(CLOCK_3KHZ / 128)) - MDRV_CPU_ADD(M6809,1500000) + MDRV_CPU_ADD(M6809, MASTER_CLOCK / 8) /* audio CPU */ MDRV_CPU_PROGRAM_MAP(sound_map,0) - MDRV_FRAMES_PER_SECOND(30) + MDRV_FRAMES_PER_SECOND(40) MDRV_MACHINE_RESET(starwars) MDRV_NVRAM_HANDLER(generic_0fill) @@ -395,7 +398,6 @@ static MACHINE_DRIVER_START( starwars ) MDRV_VISIBLE_AREA(0, 250, 0, 280) MDRV_PALETTE_LENGTH(32768) - MDRV_PALETTE_INIT(avg_multi) MDRV_VIDEO_START(avg_starwars) MDRV_VIDEO_UPDATE(vector) @@ -444,11 +446,12 @@ ROM_START( starwar1 ) ROM_RELOAD( 0xe000, 0x2000 ) /* Mathbox PROMs */ - ROM_REGION( 0x1000, REGION_PROMS, ROMREGION_DISPOSE ) + ROM_REGION( 0x1100, REGION_PROMS, 0) ROM_LOAD( "136021.110", 0x0000, 0x0400, CRC(01061762) SHA1(199549ead9ff9a5d5db75a2d15aef0240feb1aca) ) /* PROM 0 */ ROM_LOAD( "136021.111", 0x0400, 0x0400, CRC(2e619b70) SHA1(f76132b884ffdf3a4fe58637238c5235aab50408) ) /* PROM 1 */ ROM_LOAD( "136021.112", 0x0800, 0x0400, CRC(6cfa3544) SHA1(be059bfffe6b5bfcb4af78e9e7a98870ccf21985) ) /* PROM 2 */ ROM_LOAD( "136021.113", 0x0c00, 0x0400, CRC(03f6acb2) SHA1(1bad540950575581067b97e3a1cadd479c68adf1) ) /* PROM 3 */ + ROM_LOAD( "136021-105.1l", 0x1000, 0x0100, CRC(82fc3eb2) SHA1(184231c7baef598294860a7d2b8a23798c5c7da6) ) /* AVG PROM */ ROM_END @@ -470,11 +473,12 @@ ROM_START( starwars ) ROM_RELOAD( 0xe000, 0x2000 ) /* Mathbox PROMs */ - ROM_REGION( 0x1000, REGION_PROMS, ROMREGION_DISPOSE ) + ROM_REGION( 0x1100, REGION_PROMS, 0 ) ROM_LOAD( "136021.110", 0x0000, 0x0400, CRC(01061762) SHA1(199549ead9ff9a5d5db75a2d15aef0240feb1aca) ) /* PROM 0 */ ROM_LOAD( "136021.111", 0x0400, 0x0400, CRC(2e619b70) SHA1(f76132b884ffdf3a4fe58637238c5235aab50408) ) /* PROM 1 */ ROM_LOAD( "136021.112", 0x0800, 0x0400, CRC(6cfa3544) SHA1(be059bfffe6b5bfcb4af78e9e7a98870ccf21985) ) /* PROM 2 */ ROM_LOAD( "136021.113", 0x0c00, 0x0400, CRC(03f6acb2) SHA1(1bad540950575581067b97e3a1cadd479c68adf1) ) /* PROM 3 */ + ROM_LOAD( "136021-105.1l", 0x1000, 0x0100, CRC(82fc3eb2) SHA1(184231c7baef598294860a7d2b8a23798c5c7da6) ) /* AVG PROM */ ROM_END ROM_START( tomcatsw ) @@ -493,11 +497,12 @@ ROM_START( tomcatsw ) ROM_RELOAD( 0xe000, 0x2000 ) /* Mathbox PROMs */ - ROM_REGION( 0x1000, REGION_PROMS, ROMREGION_DISPOSE ) + ROM_REGION( 0x1100, REGION_PROMS, 0 ) ROM_LOAD( "136021.110", 0x0000, 0x0400, CRC(01061762) SHA1(199549ead9ff9a5d5db75a2d15aef0240feb1aca) ) /* PROM 0 */ ROM_LOAD( "136021.111", 0x0400, 0x0400, CRC(2e619b70) SHA1(f76132b884ffdf3a4fe58637238c5235aab50408) ) /* PROM 1 */ ROM_LOAD( "136021.112", 0x0800, 0x0400, CRC(6cfa3544) SHA1(be059bfffe6b5bfcb4af78e9e7a98870ccf21985) ) /* PROM 2 */ ROM_LOAD( "136021.113", 0x0c00, 0x0400, CRC(03f6acb2) SHA1(1bad540950575581067b97e3a1cadd479c68adf1) ) /* PROM 3 */ + ROM_LOAD( "136021-105.1l", 0x1000, 0x0100, CRC(82fc3eb2) SHA1(184231c7baef598294860a7d2b8a23798c5c7da6) ) /* AVG PROM */ ROM_END @@ -525,11 +530,12 @@ ROM_START( esb ) ROM_CONTINUE( 0xe000, 0x2000 ) /* Mathbox PROMs */ - ROM_REGION( 0x1000, REGION_PROMS, ROMREGION_DISPOSE ) + ROM_REGION( 0x1100, REGION_PROMS, 0 ) ROM_LOAD( "136031.110", 0x0000, 0x0400, CRC(b8d0f69d) SHA1(c196f1a592bd1ac482a81e23efa224d9dfaefc0a) ) /* PROM 0 */ ROM_LOAD( "136031.109", 0x0400, 0x0400, CRC(6a2a4d98) SHA1(cefca71f025f92a193c5a7d8b5ab8be10db2fd44) ) /* PROM 1 */ ROM_LOAD( "136031.108", 0x0800, 0x0400, CRC(6a76138f) SHA1(9ef7af898a3e29d03f35045901023615a6a55205) ) /* PROM 2 */ ROM_LOAD( "136031.107", 0x0c00, 0x0400, CRC(afbf6e01) SHA1(0a6438e6c106d98e5d67a019751e1584324f5e5c) ) /* PROM 3 */ + ROM_LOAD( "136021-105.1l", 0x1000, 0x0100, CRC(82fc3eb2) SHA1(184231c7baef598294860a7d2b8a23798c5c7da6) ) /* AVG PROM */ ROM_END diff --git a/src/drivers/statriv2.c b/src/drivers/statriv2.c index c04563701..cf69ad313 100644 --- a/src/drivers/statriv2.c +++ b/src/drivers/statriv2.c @@ -132,12 +132,7 @@ PALETTE_INIT(statriv2) int i; for (i = 0; i < 8; i++) - { - palette_set_color(i, - 0xff * ((i >> 2) & 1), - 0xff * ((i >> 0) & 1), - 0xff * ((i >> 1) & 1)); - } + palette_set_color(machine,i,pal1bit(i >> 2),pal1bit(i >> 0),pal1bit(i >> 1)); for (i = 0; i < 64; i++) { @@ -546,9 +541,9 @@ INPUT_PORTS_START( hangman ) 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( 0x80, 0x00, "Keep High Scores" ) + PORT_DIPSETTING( 0x80, DEF_STR( No ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) INPUT_PORTS_END INPUT_PORTS_START( sextriv ) diff --git a/src/drivers/stepstag.c b/src/drivers/stepstag.c index 6d76bd605..1b18207ec 100644 --- a/src/drivers/stepstag.c +++ b/src/drivers/stepstag.c @@ -12,17 +12,17 @@ READ16_HANDLER( unknown_read_0xc00000 ) { - return mame_rand(); + return mame_rand(Machine); } READ16_HANDLER( unknown_read_0xd00000 ) { - return mame_rand(); + return mame_rand(Machine); } READ16_HANDLER( unknown_read_0xffff00 ) { - return mame_rand(); + return mame_rand(Machine); } static ADDRESS_MAP_START( stepstag_readmem, ADDRESS_SPACE_PROGRAM, 16 ) @@ -71,7 +71,7 @@ ADDRESS_MAP_END READ16_HANDLER( unknown_sub_read_0xbe0004 ) { - return mame_rand(); + return mame_rand(Machine); } diff --git a/src/drivers/stlforce.c b/src/drivers/stlforce.c index e82eeada8..19f21decc 100644 --- a/src/drivers/stlforce.c +++ b/src/drivers/stlforce.c @@ -222,7 +222,7 @@ static UINT8 twinbrat_default_eeprom[128] = { }; -void nvram_handler_stlforce(mame_file *file,int read_or_write) +static NVRAM_HANDLER( stlforce ) { if (read_or_write) EEPROM_save(file); diff --git a/src/drivers/stv.c b/src/drivers/stv.c index 47d3f6f17..ae7e4ee50 100644 --- a/src/drivers/stv.c +++ b/src/drivers/stv.c @@ -221,7 +221,7 @@ DRIVER_INIT(vfremix); DRIVER_INIT(diehard); DRIVER_INIT(sss); DRIVER_INIT(othellos); -DRIVER_INIT(sassisu); +DRIVER_INIT(sasissu); DRIVER_INIT(gaxeduel); DRIVER_INIT(suikoenb); DRIVER_INIT(sokyugrt); @@ -2924,11 +2924,15 @@ static void scsp_irq(int irq) return; } - if (irq) + if (irq > 0) { scsp_last_line = irq; cpunum_set_input_line(2, irq, ASSERT_LINE); } + else if (irq < 0) + { + cpunum_set_input_line(2, -irq, CLEAR_LINE); + } else { cpunum_set_input_line(2, scsp_last_line, CLEAR_LINE); @@ -2945,7 +2949,7 @@ static struct SCSPinterface scsp_interface = static VIDEO_UPDATE(critcrsh) { int gun_x, gun_y; - video_update_stv_vdp2(screen, bitmap, cliprect); + video_update_stv_vdp2(machine, screen, bitmap, cliprect); gun_x = readinputport(7); gun_y = readinputport(8); if ( gun_y <= 46 ) @@ -3549,7 +3553,7 @@ ROM_START( thunt ) ROM_LOAD16_WORD_SWAP( "th-e-5.ic5", 0x1000000, 0x0400000, CRC(3914b805) SHA1(1331ce82ba0bdfc76fe3456a5252e69c00e2cf1f) ) ROM_END -ROM_START( sassisu ) +ROM_START( sasissu ) STV_BIOS ROM_REGION32_BE( 0x3000000, REGION_USER1, 0 ) /* SH2 code */ @@ -3919,7 +3923,7 @@ DRIVER_INIT( sfish2 ) rom[0xf10/4] = (rom[0xf10/4] & 0xff000000)|((rom[0xf10/4]/2)&0x00ffffff); rom[0xf20/4] = (rom[0xf20/4] & 0xff000000)|((rom[0xf20/4]/2)&0x00ffffff); rom[0xf30/4] = (rom[0xf30/4] & 0xff000000)|((rom[0xf30/4]/2)&0x00ffffff); - init_stv(); + init_stv(machine); } DRIVER_INIT( sfish2j ) @@ -3929,7 +3933,7 @@ DRIVER_INIT( sfish2j ) rom[0xf10/4] = (rom[0xf10/4] & 0xff000000)|((rom[0xf10/4]/2)&0x00ffffff); rom[0xf20/4] = (rom[0xf20/4] & 0xff000000)|((rom[0xf20/4]/2)&0x00ffffff); rom[0xf30/4] = (rom[0xf30/4] & 0xff000000)|((rom[0xf30/4]/2)&0x00ffffff); - init_stv(); + init_stv(machine); } @@ -3964,9 +3968,9 @@ GAMEB( 1996, colmns97, stvbios, stvbios, stv, stv, colmns97, ROT0, "Sega", GAMEB( 1997, cotton2, stvbios, stvbios, stv, stv, cotton2, ROT0, "Success", "Cotton 2 (JUET 970902 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1998, cottonbm, stvbios, stvbios, stv, stv, cottonbm, ROT0, "Success", "Cotton Boomerang (JUET 980709 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1995, critcrsh, stvbios, stvbios, critcrsh, critcrsh, ic13, ROT0, "Sega", "Critter Crusher (EA 951204 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) -GAMEB( 1999, danchih, stvbios, stvbios, stv, stvmp,danchih, ROT0, "Altron (Tecmo license)", "Danchi de Hanafuoda (J 990607 V1.400)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) -GAMEB( 1996, diehard, stvbios, stvbios, stv, stv, diehard, ROT0, "Sega", "Die Hard Arcade (UET 960515 V1.000)", GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS ) -GAMEB( 1996, dnmtdeka, diehard, stvbios, stv, stv, dnmtdeka, ROT0, "Sega", "Dynamite Deka (J 960515 V1.000)", GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS ) +GAMEB( 1999, danchih, stvbios, stvbios, stv, stvmp,danchih, ROT0, "Altron (Tecmo license)", "Danchi de Hanafuda (J 990607 V1.400)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) +GAMEB( 1996, diehard, stvbios, stvbios, stv, stv, diehard, ROT0, "Sega", "Die Hard Arcade (UET 960515 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) +GAMEB( 1996, dnmtdeka, diehard, stvbios, stv, stv, dnmtdeka, ROT0, "Sega", "Dynamite Deka (J 960515 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1995, ejihon, stvbios, stvbios, stv, stv, ic13, ROT0, "Sega", "Ejihon Tantei Jimusyo (J 950613 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1995, fhboxers, stvbios, stvbios, stv, stv, fhboxers, ROT0, "Sega", "Funky Head Boxers (JUETBKAL 951218 V1.000)", GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1994, gaxeduel, stvbios, stvbios, stv, stv, gaxeduel, ROT0, "Sega", "Golden Axe - The Duel (JUETL 950117 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) @@ -3982,7 +3986,7 @@ GAMEB( 1995, pblbeach, stvbios, stvbios, stv, stv, pblbeach, ROT0, "T&E Sof GAMEB( 1996, prikura, stvbios, stvbios, stv, stv, prikura, ROT0, "Atlus", "Princess Clara Daisakusen (J 960910 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1996, puyosun, stvbios, stvbios, stv, stv, puyosun, ROT0, "Compile", "Puyo Puyo Sun (J 961115 V0.001)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1998, rsgun, stvbios, stvbios, stv, stv, rsgun, ROT0, "Treasure", "Radiant Silvergun (JUET 980523 V1.000)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) -GAMEB( 1996, sassisu, stvbios, stvbios, stv, stv, sassisu, ROT0, "Sega", "Taisen Tanto-R Sashissu!! (J 980216 V1.000)", GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS ) +GAMEB( 1996, sasissu, stvbios, stvbios, stv, stv, sasissu, ROT0, "Sega", "Taisen Tanto-R Sashissu!! (J 980216 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1998, seabass, stvbios, stvbios, stv, stv, seabass, ROT0, "A wave inc. (Able license)","Sea Bass Fishing (JUET 971110 V0.001)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1995, shanhigw, stvbios, stvbios, stv, stv, shanhigw, ROT0, "Sunsoft / Activision", "Shanghai - The Great Wall / Shanghai Triple Threat (JUE 950623 V1.005)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1997, shienryu, stvbios, stvbios, stv, stv, shienryu, ROT270, "Warashi", "Shienryu (JUET 961226 V1.000)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) @@ -3991,9 +3995,9 @@ GAMEB( 1995, finlarch, smleague,stvbios, stv, stv, finlarch, ROT0, "Sega", GAMEB( 1998, sss, stvbios, stvbios, stv, stv, sss, ROT0, "Capcom / Cave / Victor", "Steep Slope Sliders (JUET 981110 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1995, sandor, stvbios, stvbios, stv, stv, sandor, ROT0, "Sega", "Sando-R (J 951114 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1996, sokyugrt, stvbios, stvbios, stv, stv, sokyugrt, ROT0, "Raizing / 8ing", "Soukyugurentai / Terra Diver (JUET 960821 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) -GAMEB( 1995, suikoenb, stvbios, stvbios, stv, stv, suikoenb, ROT0, "Data East", "Suikoenbu (J 950314 V2.001)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) +GAMEB( 1995, suikoenb, stvbios, stvbios, stv, stv, suikoenb, ROT0, "Data East", "Suikoenbu / Outlaws of the Lost Dynasty (JUETL 950314 V2.001)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1995, thunt, sandor, stvbios, stv, stv, thunt, ROT0, "Sega (Deniam license?)", "Treasure Hunt (JUET 970901 V2.00E)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) -GAMEB( 1996, vfkids, stvbios, stvbios, stv, stv, ic13, ROT0, "Sega", "Virtua Fighter Kids (JUET 960319 V0.000)", GAME_NO_SOUND | GAME_IMPERFECT_GRAPHICS ) +GAMEB( 1996, vfkids, stvbios, stvbios, stv, stv, ic13, ROT0, "Sega", "Virtua Fighter Kids (JUET 960319 V0.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) GAMEB( 1997, winterht, stvbios, stvbios, stv, stv, winterht, ROT0, "Sega", "Winter Heat (JUET 971012 V1.000)", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS ) /* Almost */ diff --git a/src/drivers/stvhacks.c b/src/drivers/stvhacks.c index 7fc2269c1..ab274006d 100644 --- a/src/drivers/stvhacks.c +++ b/src/drivers/stvhacks.c @@ -75,7 +75,7 @@ static void ic13_shifter(void) DRIVER_INIT ( ic13 ) { ic13_shifter(); - init_stv(); + init_stv(machine); } /* EEPROM write 0000 to address 2d @@ -222,7 +222,7 @@ DRIVER_INIT(shienryu) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ae8e0, 0x60ae8e3, 0, 0, shienryu_speedup_r ); // after you enable sound cpu memory_install_read32_handler(1, ADDRESS_SPACE_PROGRAM, 0x60ae8e4, 0x60ae8e7, 0, 0, shienryu_slave_speedup_r ); // after you enable sound cpu - init_stv(); + init_stv(machine); } static READ32_HANDLER( prikura_speedup_r ) @@ -250,7 +250,7 @@ DRIVER_INIT(prikura) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60b9228, 0x60b922b, 0, 0, prikura_speedup_r ); cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)prikura_slave_speedup ); - init_stv(); + init_stv(machine); minit_boost = sinit_boost = 0; minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); @@ -295,7 +295,7 @@ DRIVER_INIT(hanagumi) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6094188, 0x609418b, 0, 0, hanagumi_speedup_r ); memory_install_read32_handler(1, ADDRESS_SPACE_PROGRAM, 0x6015438, 0x601543b, 0, 0, hanagumi_slave_off ); - init_stv(); + init_stv(machine); } @@ -337,7 +337,7 @@ DRIVER_INIT(puyosun) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ffc10, 0x60ffc13, 0, 0, puyosun_speedup_r ); // idle loop of main cpu cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)puyosun_slave_speedup ); - init_ic13(); + init_ic13(machine); minit_boost = sinit_boost = 0; minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); @@ -364,7 +364,7 @@ DRIVER_INIT(mausuke) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ffc10, 0x60ffc13, 0, 0, mausuke_speedup_r ); // idle loop of main cpu - init_ic13(); + init_ic13(machine); minit_boost = sinit_boost = 0; minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); @@ -402,7 +402,7 @@ DRIVER_INIT(cottonbm) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ffc10, 0x60ffc13, 0, 0, cottonbm_speedup_r ); // idle loop of main cpu cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)cottonbm_slave_speedup ); - init_stv(); + init_stv(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(10); } @@ -438,26 +438,138 @@ DRIVER_INIT(cotton2) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ffc10, 0x60ffc13, 0, 0, cotton2_speedup_r ); // idle loop of main cpu cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)cotton2_slave_speedup ); - init_stv(); + init_stv(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); } +static int dnmtdeka_pending_commands; + static READ32_HANDLER( dnmtdeka_speedup_r ) { - if (activecpu_get_pc()==0x6027c93) cpu_spinuntil_time(TIME_IN_USEC(20)); - + if (activecpu_get_pc()==0x6027c92) cpu_spinuntil_int();//cpu_spinuntil_time(TIME_IN_USEC(20)); return stv_workram_h[0x0985a0/4]; } +static WRITE32_HANDLER(dnmtdeka_cmd_write) +{ + COMBINE_DATA(&stv_workram_h[0x0e0ad4/4 + offset]); + if ( (cpu_getactivecpu() == 0) && (activecpu_get_pc() == 0x00000d06) ) + return; + + if ( data != 0 ) dnmtdeka_pending_commands++; + //logerror( "CMD: Written by cpu=%d, at = %08X, offset = %08X, data = %08X, commands = %d\n", cpu_getactivecpu(), activecpu_get_pc(), offset, data, dnmtdeka_pending_commands ); + cpu_trigger(1000); +} + +static READ32_HANDLER(dnmtdeka_cmd_read) +{ + //logerror( "CMD: Read by cpu=%d, at = %08X, offset = %08X, data = %08X, commands = %d\n", cpu_getactivecpu(), activecpu_get_pc(), offset, stv_workram_h[0xe0bd0/4 + offset], dnmtdeka_pending_commands ); + if ( activecpu_get_pc() == 0x060051f4 ) + { + if ( stv_workram_h[0x0e0ad4/4 + offset] == 0 ) + { + if ( dnmtdeka_pending_commands == 0 ) + cpu_spinuntil_trigger(1000); + } + else + { + dnmtdeka_pending_commands--; + } + } + + return stv_workram_h[0x0e0ad4/4 + offset]; +} + DRIVER_INIT(dnmtdeka) { -// memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60985a0, 0x60985a3, 0, 0, dnmtdeka_speedup_r ); // idle loop of main cpu + dnmtdeka_pending_commands = 0; + + memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60985a0, 0x60985a3, 0, 0, dnmtdeka_speedup_r ); // idle loop of main cpu + memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x060e0ad4, 0x060e0bab, 0, 0, dnmtdeka_cmd_write ); + memory_install_read32_handler(1, ADDRESS_SPACE_PROGRAM, 0x060e0ad4, 0x060e0bab, 0, 0, dnmtdeka_cmd_read ); + + init_ic13(machine); +} + +static int diehard_pending_commands; + +static READ32_HANDLER(diehard_speedup_r) +{ + if ( activecpu_get_pc() == 0x06027c9a ) cpu_spinuntil_int(); + return stv_workram_h[0x000986ac/4]; +} + +static WRITE32_HANDLER(diehard_cmd_write) +{ + COMBINE_DATA(&stv_workram_h[0xe0bd0/4 + offset]); + if ( (cpu_getactivecpu() == 0) && (activecpu_get_pc() == 0x00000d06) ) + return; + + if ( data != 0 ) diehard_pending_commands++; + //logerror( "CMD: Written by cpu=%d, at = %08X, offset = %08X, data = %08X, commands = %d\n", cpu_getactivecpu(), activecpu_get_pc(), offset, data, diehard_pending_commands ); + cpu_trigger(1000); +} + +static READ32_HANDLER(diehard_cmd_read) +{ + //logerror( "CMD: Read by cpu=%d, at = %08X, offset = %08X, data = %08X, commands = %d\n", cpu_getactivecpu(), activecpu_get_pc(), offset, stv_workram_h[0xe0bd0/4 + offset], diehard_pending_commands ); + if ( activecpu_get_pc() == 0x060051f4 ) + { + if ( stv_workram_h[0xe0bd0/4 + offset] == 0 ) + { + if ( diehard_pending_commands == 0 ) + cpu_spinuntil_trigger(1000); + } + } + + return stv_workram_h[0xe0bd0/4 + offset]; +} + +static READ32_HANDLER(diehard_cmd_ack_read) +{ + //logerror( "CMDACK: Read by cpu=%d, at = %08X, offset = %08X, data = %08X, commands = %d\n", cpu_getactivecpu(), activecpu_get_pc(), offset, stv_workram_h[0x000e0dd8/4], diehard_pending_commands ); + if ( (stv_workram_h[0x000e0dd8/4] & 0xff000000) == 0 && + diehard_pending_commands == 0 ) + { + cpu_trigger(1000); + } + return stv_workram_h[0x000e0dd8/4]; +} + +static WRITE32_HANDLER(diehard_cmd_ack_write) +{ + //logerror( "CMDACK: Write by cpu=%d, at = %08X, offset = %08X, data = %08X, commands = %d\n", cpu_getactivecpu(), activecpu_get_pc(), offset, data, diehard_pending_commands ); + if ( diehard_pending_commands > 0 ) + { + diehard_pending_commands--; + } + COMBINE_DATA(&stv_workram_h[0x000e0dd8/4]); +} - init_ic13(); +static WRITE32_HANDLER(diehard_cmd_ack_write_cpu0) +{ + //logerror( "CMDACK: Write by cpu=%d, at = %08X, offset = %08X, data = %08X, commands = %d\n", cpu_getactivecpu(), activecpu_get_pc(), offset, data, diehard_pending_commands ); + COMBINE_DATA(&stv_workram_h[0x000e0dd8/4]); + cpu_trigger(1000); } +DRIVER_INIT(diehard) +{ + diehard_pending_commands = 0; + + memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x060986ac, 0x060986af, 0, 0, diehard_speedup_r ); + memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x060e0bd0, 0x060e0ca7, 0, 0, diehard_cmd_write ); + memory_install_read32_handler(1, ADDRESS_SPACE_PROGRAM, 0x060e0bd0, 0x060e0ca7, 0, 0, diehard_cmd_read ); + memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x060e0dd8, 0x060e0dd8, 0, 0, diehard_cmd_ack_read ); + memory_install_write32_handler(0, ADDRESS_SPACE_PROGRAM, 0x060e0dd8, 0x060e0dd8, 0, 0, diehard_cmd_ack_write_cpu0 ); + memory_install_write32_handler(1, ADDRESS_SPACE_PROGRAM, 0x060e0dd8, 0x060e0dd8, 0, 0, diehard_cmd_ack_write ); + + + init_ic13(machine); + +} static READ32_HANDLER( fhboxers_speedup_r ) { @@ -488,7 +600,7 @@ DRIVER_INIT(fhboxers) memory_install_read32_handler(1, ADDRESS_SPACE_PROGRAM, 0x6090740, 0x6090743, 0, 0, fhboxers_speedup2_r ); // idle loop of second cpu memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x06090bb4, 0x06090bb7, 0, 0, fhboxers_speedup3_r ); // idle loop of main cpu - init_ic13(); + init_ic13(machine); } @@ -519,7 +631,7 @@ DRIVER_INIT(bakubaku) memory_install_read32_handler(1, ADDRESS_SPACE_PROGRAM, 0x60fdfe8, 0x60fdfeb, 0, 0, bakubaku_speedup2_r ); // turn off slave sh2, is it needed after boot ?? //memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6033660, 0x6033663, 0, 0, bakubaku_hangskip_r ); // it waits for a ram address to change what should change it? - init_ic13(); + init_ic13(machine); } static READ32_HANDLER( groovef_hack1_r ) @@ -573,7 +685,7 @@ DRIVER_INIT( groovef ) // memory_install_read32_handler(1, ADDRESS_SPACE_PROGRAM, 0x60060dc, 0x60060df, 0, 0, groovef_second_cpu_off_r ); // not a good idea, needs it for ai. cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)groovef_slave_speedup ); - init_stv(); + init_stv(machine); minit_boost = sinit_boost = 0; minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); @@ -635,7 +747,7 @@ DRIVER_INIT( danchih ) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ffc10, 0x60ffc13, 0, 0, danchih_speedup_r ); cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)danchih_slave_speedup ); - init_stv(); + init_stv(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(5); @@ -682,7 +794,7 @@ DRIVER_INIT( astrass ) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x0608e4d8, 0x0608e4db, 0, 0, astrass_speedup_r ); - init_ic13(); + init_ic13(machine); } /* Treasure Hunt idle loop skipping */ @@ -737,7 +849,7 @@ DRIVER_INIT(thunt) cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf *)thunt_slave_speedup); - init_ic13(); + init_ic13(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(1); } @@ -767,7 +879,7 @@ DRIVER_INIT(sandor) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x060314f8, 0x060314fb, 0, 0, sandor_speedup_r ); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x06075a2c, 0x06075a2f, 0, 0, sandor_speedup2_r ); cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf *)sandor_slave_speedup); - init_ic13(); + init_ic13(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(1); } @@ -814,7 +926,7 @@ DRIVER_INIT(grdforce) cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf *)grdforce_slave_speedup); - init_stv(); + init_stv(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); } @@ -831,7 +943,7 @@ DRIVER_INIT(batmanfr) { cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)batmanfr_slave_speedup ); - init_stv(); + init_stv(machine); minit_boost = sinit_boost = 0; minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); @@ -853,7 +965,7 @@ DRIVER_INIT(colmns97) { cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)colmns97_slave_speedup ); - init_ic13(); + init_ic13(machine); minit_boost = sinit_boost = 0; @@ -878,7 +990,7 @@ DRIVER_INIT(winterht) cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)winterht_slave_speedup ); - init_ic13(); + init_ic13(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(2); } @@ -903,7 +1015,7 @@ DRIVER_INIT(seabass) cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)seabass_slave_speedup ); - init_ic13(); + init_ic13(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(5); } @@ -926,35 +1038,11 @@ DRIVER_INIT(vfremix) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x06074f98, 0x06074f9b, 0, 0, vfremix_speedup_r ); cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)vfremix_slave_speedup ); - init_ic13(); + init_ic13(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(20); } -static READ32_HANDLER(diehard_speedup_r) -{ - if ( activecpu_get_pc() == 0x06027c9a ) cpu_spinuntil_int(); - return stv_workram_h[0x000986ac/4]; -} - -static READ32_HANDLER(diehard_slave_speedup_r) -{ - if ( activecpu_get_pc() == 0x060051f4 ) - if (stv_workram_h[0x000e0be0/4] == 0) - cpunum_spinuntil_trigger(1, 1000); - - return stv_workram_h[0x000986ac/4]; -} - -DRIVER_INIT(diehard) -{ - memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x060986ac, 0x060986af, 0, 0, diehard_speedup_r ); - //memory_install_read32_handler(1, ADDRESS_SPACE_PROGRAM, 0x060e0be0, 0x060e0be3, 0, 0, diehard_slave_speedup_r ); - - init_ic13(); - - minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); -} static READ32_HANDLER(sss_speedup_r) { @@ -974,7 +1062,7 @@ DRIVER_INIT(sss) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x060ffc10, 0x060ffc13, 0, 0, sss_speedup_r ); cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)sss_slave_speedup ); - init_ic13(); + init_ic13(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); } @@ -1001,24 +1089,24 @@ DRIVER_INIT(othellos) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x060ffc10, 0x060ffc13, 0, 0, othellos_speedup_r ); cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)othellos_slave_speedup ); - init_stv(); + init_stv(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); } -static void sassisu_slave_speedup( UINT32 data ) +static void sasissu_slave_speedup( UINT32 data ) { if ( activecpu_get_pc() == 0x060710C0 ) if ( (data & 0x00800000) == 0 ) cpunum_spinuntil_trigger(1, 1000); } -DRIVER_INIT(sassisu) +DRIVER_INIT(sasissu) { - cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)sassisu_slave_speedup ); + cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)sasissu_slave_speedup ); - init_ic13(); + init_ic13(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(2); } @@ -1032,7 +1120,7 @@ static READ32_HANDLER(gaxeduel_speedup_r) DRIVER_INIT(gaxeduel) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x002f4068, 0x002f406b, 0, 0, gaxeduel_speedup_r); - init_ic13(); + init_ic13(machine); } static READ32_HANDLER(suikoenb_speedup_r) @@ -1044,7 +1132,7 @@ static READ32_HANDLER(suikoenb_speedup_r) DRIVER_INIT(suikoenb) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x060705d0, 0x060705d3, 0, 0, suikoenb_speedup_r); - init_ic13(); + init_ic13(machine); } static void sokyugrt_slave_speedup( UINT32 data ) @@ -1066,7 +1154,7 @@ DRIVER_INIT(sokyugrt) { cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)sokyugrt_slave_speedup ); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x060788cc, 0x060788cf, 0, 0, sokyugrt_speedup_r); - init_ic13(); + init_ic13(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); } @@ -1099,7 +1187,7 @@ DRIVER_INIT(znpwfv) cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)znpwfv_slave_speedup ); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ffc10, 0x60ffc13, 0, 0, znpwfv_speedup_r ); - init_ic13(); + init_ic13(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(2); } @@ -1121,7 +1209,7 @@ DRIVER_INIT(twcup98) cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)twcup98_slave_speedup ); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ffc10, 0x60ffc13, 0, 0, twcup98_speedup_r ); - init_ic13(); + init_ic13(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(5); } @@ -1144,7 +1232,7 @@ DRIVER_INIT(smleague) cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)smleague_slave_speedup ); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ffc10, 0x60ffc13, 0, 0, smleague_speedup_r ); - init_ic13(); + init_ic13(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); } @@ -1160,7 +1248,7 @@ DRIVER_INIT(finlarch) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ffc10, 0x60ffc13, 0, 0, finlarch_speedup_r ); - init_ic13(); + init_ic13(machine); } @@ -1191,7 +1279,7 @@ DRIVER_INIT(maruchan) cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf*)maruchan_slave_speedup ); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ffc10, 0x60ffc13, 0, 0, maruchan_speedup_r ); - init_ic13(); + init_ic13(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(50); } @@ -1208,7 +1296,7 @@ DRIVER_INIT(pblbeach) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x0606c398, 0x0606c39b, 0, 0, pblbeach_speedup_r ); - init_ic13(); + init_ic13(machine); } static READ32_HANDLER( shanhigw_speedup_r ) @@ -1222,7 +1310,7 @@ DRIVER_INIT(shanhigw) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x06095cd8, 0x06095cdb, 0, 0, shanhigw_speedup_r ); - init_stv(); + init_stv(machine); } static READ32_HANDLER( elandore_speedup_r ) @@ -1248,7 +1336,7 @@ DRIVER_INIT(elandore) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ffc10, 0x60ffc13, 0, 0, elandore_speedup_r ); cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf *)elandore_slave_speedup); - init_stv(); + init_stv(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(0); } @@ -1276,7 +1364,7 @@ DRIVER_INIT(rsgun) memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60ffc10, 0x60ffc13, 0, 0, rsgun_speedup_r ); cpunum_set_info_fct(1, CPUINFO_PTR_SH2_FTCSR_READ_CALLBACK, (genf *)rsgun_slave_speedup); - init_stv(); + init_stv(machine); minit_boost_timeslice = sinit_boost_timeslice = TIME_IN_USEC(20); diff --git a/src/drivers/subs.c b/src/drivers/subs.c index 4ce7ce647..d3e52c65a 100644 --- a/src/drivers/subs.c +++ b/src/drivers/subs.c @@ -36,10 +36,10 @@ static unsigned short colortable_source[] = static PALETTE_INIT( subs ) { - palette_set_color(0,0x00,0x00,0x00); /* BLACK - modified on video invert */ - palette_set_color(1,0xff,0xff,0xff); /* WHITE - modified on video invert */ - palette_set_color(2,0x00,0x00,0x00); /* BLACK - modified on video invert */ - palette_set_color(3,0xff,0xff,0xff); /* WHITE - modified on video invert*/ + palette_set_color(machine,0,0x00,0x00,0x00); /* BLACK - modified on video invert */ + palette_set_color(machine,1,0xff,0xff,0xff); /* WHITE - modified on video invert */ + palette_set_color(machine,2,0x00,0x00,0x00); /* BLACK - modified on video invert */ + palette_set_color(machine,3,0xff,0xff,0xff); /* WHITE - modified on video invert*/ memcpy(colortable,colortable_source,sizeof(colortable_source)); } diff --git a/src/drivers/superchs.c b/src/drivers/superchs.c index 1c7275501..98e0fbf47 100644 --- a/src/drivers/superchs.c +++ b/src/drivers/superchs.c @@ -107,7 +107,7 @@ static WRITE32_HANDLER( superchs_palette_w ) g = (a &0xff00) >> 8; b = (a &0xff); - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } static READ32_HANDLER( superchs_input_r ) diff --git a/src/drivers/supertnk.c b/src/drivers/supertnk.c index 2a2c4223c..af710ed68 100644 --- a/src/drivers/supertnk.c +++ b/src/drivers/supertnk.c @@ -107,15 +107,11 @@ static UINT8 *supertnk_videoram; PALETTE_INIT( supertnk ) { - int i, r, g, b; + int i; for (i = 0;i < 0x20;i++) { - r = (*color_prom & 0x04) ? 0xff : 0x00; /* red component */ - g = (*color_prom & 0x20) ? 0xff : 0x00; /* green component */ - b = (*color_prom & 0x40) ? 0xff : 0x00; /* blue component */ - - palette_set_color(i, r, g, b); + palette_set_color(machine, i, pal1bit(*color_prom >> 2), pal1bit(*color_prom >> 5), pal1bit(*color_prom >> 6)); color_prom++; } } @@ -128,7 +124,7 @@ VIDEO_START( supertnk ) memset(supertnk_videoram, 0, 0x6000); - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } diff --git a/src/drivers/suprnova.c b/src/drivers/suprnova.c index 42bb1c8ff..bf3d780ad 100644 --- a/src/drivers/suprnova.c +++ b/src/drivers/suprnova.c @@ -370,7 +370,7 @@ READ32_HANDLER( skns_hit_r ) switch(adr) { case 0x28: case 0x2a: - return (UINT16)mame_rand(); + return (UINT16)mame_rand(Machine); case 0x00: case 0x10: return (UINT16)hit.x_in; @@ -854,7 +854,7 @@ static void palette_set_rgb_brightness (int offset, UINT8 brightness_r, UINT8 br r <<= 3; } - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } // This ignores the alpha values atm. @@ -976,7 +976,7 @@ static WRITE32_HANDLER ( skns_palette_ram_w ) r <<= 3; } - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } static WRITE32_HANDLER( skns_v3t_w ) @@ -1244,23 +1244,23 @@ static READ32_HANDLER( sengekij_speedup_r ) // 60006ee 600308e } static DRIVER_INIT( skns ) { memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6000028, 0x600002b, 0, 0, bios_skip_r ); } -static DRIVER_INIT( galpani4 ) { skns_sprite_kludge(-5,-1); init_skns(); } // Idle Loop caught by sh-2 core -static DRIVER_INIT( galpanis ) { skns_sprite_kludge(-5,-1); init_skns(); } // Idle Loop caught by sh-2 core -static DRIVER_INIT( cyvern ) { skns_sprite_kludge(+0,+2); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x604d3c8, 0x604d3cb, 0, 0, cyvern_speedup_r ); } -static DRIVER_INIT( galpans2 ) { skns_sprite_kludge(-1,-1); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60fb6bc, 0x60fb6bf, 0, 0, galpans2_speedup_r ); } -static DRIVER_INIT( gutsn ) { skns_sprite_kludge(+0,+0); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x600c780, 0x600c783, 0, 0, gutsn_speedup_r ); } -static DRIVER_INIT( panicstr ) { skns_sprite_kludge(-1,-1); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60f19e4, 0x60f19e7, 0, 0, panicstr_speedup_r ); } -static DRIVER_INIT( senknow ) { skns_sprite_kludge(+1,+1); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60000dc, 0x60000df, 0, 0, senknow_speedup_r ); } -static DRIVER_INIT( puzzloop ) { skns_sprite_kludge(-9,-1); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6081d38, 0x6081d3b, 0, 0, puzzloop_speedup_r ); } -static DRIVER_INIT( puzloopj ) { skns_sprite_kludge(-9,-1); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6086714, 0x6086717, 0, 0, puzloopj_speedup_r ); } -static DRIVER_INIT( puzloopu ) { skns_sprite_kludge(-9,-1); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6085cec, 0x6085cef, 0, 0, puzloopu_speedup_r ); } -static DRIVER_INIT( jjparads ) { skns_sprite_kludge(+5,+1); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6000994, 0x6000997, 0, 0, jjparads_speedup_r ); } -static DRIVER_INIT( jjparad2 ) { skns_sprite_kludge(+5,+1); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6000984, 0x6000987, 0, 0, jjparad2_speedup_r ); } -static DRIVER_INIT( ryouran ) { skns_sprite_kludge(+5,+1); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6000a14, 0x6000a17, 0, 0, ryouran_speedup_r ); } -static DRIVER_INIT( teljan ) { skns_sprite_kludge(+5,+1); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6002fb4, 0x6002fb7, 0, 0, teljan_speedup_r ); } -static DRIVER_INIT( sengekis ) { skns_sprite_kludge(-192,-272); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60b74bc, 0x60b74bf, 0, 0, sengekis_speedup_r ); } -static DRIVER_INIT( sengekij ) { skns_sprite_kludge(-192,-272); init_skns(); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60b7380, 0x60b7383, 0, 0, sengekij_speedup_r ); } -static DRIVER_INIT( sarukani ) { skns_sprite_kludge(-1,-1); init_skns(); } // Speedup is in skns_io_w() +static DRIVER_INIT( galpani4 ) { skns_sprite_kludge(-5,-1); init_skns(machine); } // Idle Loop caught by sh-2 core +static DRIVER_INIT( galpanis ) { skns_sprite_kludge(-5,-1); init_skns(machine); } // Idle Loop caught by sh-2 core +static DRIVER_INIT( cyvern ) { skns_sprite_kludge(+0,+2); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x604d3c8, 0x604d3cb, 0, 0, cyvern_speedup_r ); } +static DRIVER_INIT( galpans2 ) { skns_sprite_kludge(-1,-1); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60fb6bc, 0x60fb6bf, 0, 0, galpans2_speedup_r ); } +static DRIVER_INIT( gutsn ) { skns_sprite_kludge(+0,+0); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x600c780, 0x600c783, 0, 0, gutsn_speedup_r ); } +static DRIVER_INIT( panicstr ) { skns_sprite_kludge(-1,-1); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60f19e4, 0x60f19e7, 0, 0, panicstr_speedup_r ); } +static DRIVER_INIT( senknow ) { skns_sprite_kludge(+1,+1); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60000dc, 0x60000df, 0, 0, senknow_speedup_r ); } +static DRIVER_INIT( puzzloop ) { skns_sprite_kludge(-9,-1); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6081d38, 0x6081d3b, 0, 0, puzzloop_speedup_r ); } +static DRIVER_INIT( puzloopj ) { skns_sprite_kludge(-9,-1); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6086714, 0x6086717, 0, 0, puzloopj_speedup_r ); } +static DRIVER_INIT( puzloopu ) { skns_sprite_kludge(-9,-1); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6085cec, 0x6085cef, 0, 0, puzloopu_speedup_r ); } +static DRIVER_INIT( jjparads ) { skns_sprite_kludge(+5,+1); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6000994, 0x6000997, 0, 0, jjparads_speedup_r ); } +static DRIVER_INIT( jjparad2 ) { skns_sprite_kludge(+5,+1); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6000984, 0x6000987, 0, 0, jjparad2_speedup_r ); } +static DRIVER_INIT( ryouran ) { skns_sprite_kludge(+5,+1); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6000a14, 0x6000a17, 0, 0, ryouran_speedup_r ); } +static DRIVER_INIT( teljan ) { skns_sprite_kludge(+5,+1); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x6002fb4, 0x6002fb7, 0, 0, teljan_speedup_r ); } +static DRIVER_INIT( sengekis ) { skns_sprite_kludge(-192,-272); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60b74bc, 0x60b74bf, 0, 0, sengekis_speedup_r ); } +static DRIVER_INIT( sengekij ) { skns_sprite_kludge(-192,-272); init_skns(machine); memory_install_read32_handler(0, ADDRESS_SPACE_PROGRAM, 0x60b7380, 0x60b7383, 0, 0, sengekij_speedup_r ); } +static DRIVER_INIT( sarukani ) { skns_sprite_kludge(-1,-1); init_skns(machine); } // Speedup is in skns_io_w() diff --git a/src/drivers/system1.c b/src/drivers/system1.c index 77ce40382..83cae4696 100644 --- a/src/drivers/system1.c +++ b/src/drivers/system1.c @@ -16,6 +16,9 @@ TODO: - background is misplaced in wbmlju ******************************************************************************/ +static unsigned char *system1_ram; + + #include "driver.h" #include "vidhrdw/system1.h" #include "cpu/z80/z80.h" @@ -29,7 +32,7 @@ static MACHINE_RESET( system1 ) static MACHINE_RESET( system1_banked ) { - machine_reset_system1(); + machine_reset_system1(machine); memory_configure_bank(1, 0, 4, memory_region(REGION_CPU1) + 0x10000, 0x4000); } @@ -161,13 +164,13 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( brain_readmem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM) AM_RANGE(0x8000, 0xbfff) AM_READ(MRA8_BANK1) - AM_RANGE(0xc000, 0xffff) AM_READ(MRA8_RAM) + AM_RANGE(0xc000, 0xffff) AM_READ(MRA8_RAM) AM_BASE(&system1_ram) ADDRESS_MAP_END static ADDRESS_MAP_START( wbml_readmem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM) AM_RANGE(0x8000, 0xbfff) AM_READ(MRA8_BANK1) - AM_RANGE(0xc000, 0xdfff) AM_READ(MRA8_RAM) + AM_RANGE(0xc000, 0xdfff) AM_READ(MRA8_RAM) AM_BASE(&system1_ram) AM_RANGE(0xe000, 0xefff) AM_READ(wbml_paged_videoram_r) AM_RANGE(0xf000, 0xf3ff) AM_READ(MRA8_RAM) AM_RANGE(0xf800, 0xfbff) AM_READ(MRA8_RAM) @@ -263,6 +266,31 @@ static ADDRESS_MAP_START( wbml_readport, ADDRESS_SPACE_IO, 8 ) AM_RANGE(0x19, 0x19) AM_READ(system1_videomode_r) /* mirror address */ ADDRESS_MAP_END +static ADDRESS_MAP_START( sht_readport, ADDRESS_SPACE_IO, 8 ) + ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) +// AM_RANGE(0x00, 0x00) AM_READ(input_port_0_r) /* joy1 */ +// AM_RANGE(0x04, 0x04) AM_READ(input_port_1_r) /* joy2 */ + AM_RANGE(0x08, 0x08) AM_READ(input_port_2_r) /* coin,start */ + AM_RANGE(0x0c, 0x0c) AM_READ(input_port_3_r) /* DIP2 */ + AM_RANGE(0x0d, 0x0d) AM_READ(input_port_4_r) /* DIP1 some games read it from here... */ + AM_RANGE(0x10, 0x10) AM_READ(input_port_4_r) /* DIP1 ... and some others from here */ + /* but there are games which check BOTH! */ + + AM_RANGE(0x12, 0x12) AM_READ(input_port_5_r) // trigger is here.. + + AM_RANGE(0x1c, 0x1c) AM_READ(input_port_6_r) // gunx + AM_RANGE(0x1d, 0x1d) AM_READ(input_port_7_r) // guny + + AM_RANGE(0x18, 0x18) AM_READ(input_port_8_r) // ?? + + + AM_RANGE(0x15, 0x15) AM_READ(system1_videomode_r) + AM_RANGE(0x16, 0x16) AM_READ(wbml_videoram_bank_latch_r) + AM_RANGE(0x19, 0x19) AM_READ(system1_videomode_r) /* mirror address */ +ADDRESS_MAP_END + + + static ADDRESS_MAP_START( nobo_readport, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) AM_RANGE(0x00, 0x00) AM_READ(input_port_0_r) /* Player 1 inputs */ @@ -296,6 +324,55 @@ static ADDRESS_MAP_START( brain_writeport, ADDRESS_SPACE_IO, 8 ) AM_RANGE(0x19, 0x19) AM_WRITE(brain_videomode_w) ADDRESS_MAP_END +/* protection values from real hardware, these were verified to be the same on the title + screen and in the first level... they're all jumps that the MCU appears to put in RAM + at some point */ +static int shtngtab[]= +{ + 0xC3,0xC1,0x39, + 0xC3,0x6F,0x0A, + 0xC3,0x56,0x39, + 0xC3,0x57,0x0C, + 0xC3,0xE2,0x0B, + 0xC3,0x68,0x03, + 0xC3,0xF1,0x06, + 0xC3,0xCA,0x06, + 0xC3,0xC4,0x06, + 0xC3,0xD6,0x07, + 0xC3,0x89,0x13, + 0xC3,0x75,0x13, + 0xC3,0x9F,0x13, + 0xC3,0xFF,0x38, + 0xC3,0x60,0x13, + 0xC3,0x62,0x00, + 0xC3,0x39,0x04, + -1 +}; +static WRITE8_HANDLER(mcuenable_hack_w) +{ + //in fact it's gun feedback write, not mcu related + int i=0; + while(shtngtab[i]>=0) + { + system1_ram[i+0x40]=shtngtab[i]; + i++; + } + + system1_ram[0x2ff]=0x49; // I ? + system1_ram[0x3ff]=0x54; // T ? +} + +static ADDRESS_MAP_START( sht_writeport, ADDRESS_SPACE_IO, 8 ) + ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) + AM_RANGE(0x10,0x10) AM_WRITE(mcuenable_hack_w) + + AM_RANGE(0x14, 0x14) AM_WRITE(system1_soundport_w) /* sound commands */ + AM_RANGE(0x15, 0x15) AM_WRITE(chplft_videomode_w) + + AM_RANGE(0x16, 0x16) AM_WRITE(wbml_videoram_bank_latch_w) +ADDRESS_MAP_END + + static ADDRESS_MAP_START( chplft_writeport, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) AM_RANGE(0x14, 0x14) AM_WRITE(system1_soundport_w) /* sound commands */ @@ -1360,55 +1437,105 @@ INPUT_PORTS_END INPUT_PORTS_START( shtngmst ) PORT_START /* IN1 */ - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY + /* + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY + */ PORT_START /* IN2 */ - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL + /* + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL + */ PORT_START /* IN0 */ IN0_PORT PORT_START /* DSW1 */ - PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Cocktail ) ) - PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Lives ) ) - PORT_DIPSETTING( 0x0c, "3" ) - PORT_DIPSETTING( 0x08, "4" ) - PORT_DIPSETTING( 0x04, "5" ) - PORT_DIPSETTING( 0x00, DEF_STR( Infinite ) ) - PORT_DIPNAME( 0x30, 0x30, DEF_STR( Bonus_Life ) ) - PORT_DIPSETTING( 0x30, "100k 500k" ) - PORT_DIPSETTING( 0x20, "150k 600k" ) - PORT_DIPSETTING( 0x10, "200k 700k" ) - PORT_DIPSETTING( 0x00, "300k 800k" ) - PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Difficulty ) ) - PORT_DIPSETTING( 0xc0, DEF_STR( Easy ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Medium ) ) - PORT_DIPSETTING( 0x40, DEF_STR( Hard ) ) - PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) + 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 /* DSW0 */ DSW1_PORT + + PORT_START /* trigger is in here */ + PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) + + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START /* 1c */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_X ) PORT_MINMAX(0,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) + + PORT_START /* 1d */ + PORT_BIT( 0xff, 0x80, IPT_LIGHTGUN_Y ) PORT_MINMAX(0,0xff) PORT_SENSITIVITY(25) PORT_KEYDELTA(15) PORT_PLAYER(1) PORT_REVERSE + + PORT_START /* 18 */ + /* what is this? check the game code... */ + PORT_DIPNAME( 0x01, 0x01, "port 18" ) + 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 + INPUT_PORTS_START( chplft ) PORT_START /* IN1 */ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -2309,7 +2436,7 @@ static MACHINE_DRIVER_START( system1 ) MDRV_MACHINE_RESET(system1) /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER|VIDEO_ALWAYS_UPDATE)// hw collisions MDRV_SCREEN_SIZE(256, 256) MDRV_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) MDRV_GFXDECODE(gfxdecodeinfo) @@ -2380,6 +2507,7 @@ static MACHINE_DRIVER_START( chplft ) MACHINE_DRIVER_END + static MACHINE_DRIVER_START( brain ) /* basic machine hardware */ @@ -2409,6 +2537,25 @@ static MACHINE_DRIVER_START( wbml ) MACHINE_DRIVER_END +static MACHINE_DRIVER_START( shtngmst ) + + /* basic machine hardware */ + MDRV_IMPORT_FROM( system1 ) + MDRV_CPU_MODIFY("main") + MDRV_CPU_PROGRAM_MAP(brain_readmem,chplft_writemem) + MDRV_CPU_IO_MAP(sht_readport,sht_writeport) + + MDRV_MACHINE_RESET(system1_banked) + + /* video hardware - same as small - left / right 8 pixels clipped */ + MDRV_VISIBLE_AREA(0*8+8, 32*8-1-8, 0*8, 28*8-1) + + MDRV_VIDEO_UPDATE(choplifter) + + +MACHINE_DRIVER_END + + static MACHINE_DRIVER_START( noboranb ) /* basic machine hardware */ @@ -3347,22 +3494,107 @@ ROM_START( shtngmst ) ROM_LOAD( "epr7041", 0x08000, 0x8000, CRC(f3e273f9) SHA1(b8715c528299dc1e4f0c19c50d91ca9861a423a1) ) ROM_LOAD( "epr7042", 0x10000, 0x8000, CRC(6841c917) SHA1(6553843eea0131eb7b5a9aa29dddf641e41d8cc3) ) - ROM_REGION( 0x38000, REGION_GFX2, 0 ) /* 224 for sprites data - PROBABLY WRONG! */ - ROM_LOAD( "epr7105", 0x00000, 0x8000, CRC(13111729) SHA1(57ca2b945db36b056d0e40a39456fd8bf9d0a3ec) ) - ROM_LOAD( "epr7104", 0x08000, 0x8000, CRC(84a679c5) SHA1(19a21b1b33fc215f606093bfd61d597e4bd0b3d0) ) - ROM_LOAD( "epr7107", 0x10000, 0x8000, CRC(8f50ea24) SHA1(781687e202dedca7b72c9bd5b97d9d46fcfd601c) ) - ROM_LOAD( "epr7106", 0x18000, 0x8000, CRC(ae7ab7a2) SHA1(153691e468d29d21b95f1fbffb6896a3140d7e14) ) + ROM_REGION( 0x40000, REGION_GFX2, ROMREGION_ERASEFF ) + ROM_LOAD( "epr7110", 0x00000, 0x8000, CRC(5d1a5048) SHA1(d1626ab1981080451c912df7e4ad7f76c0cb3459) ) + ROM_LOAD( "epr7106", 0x08000, 0x8000, CRC(ae7ab7a2) SHA1(153691e468d29d21b95f1fbffb6896a3140d7e14) ) + ROM_LOAD( "epr7108", 0x10000, 0x8000, CRC(816180ac) SHA1(a59670ec77d4359041ebf12dae5b74add55d82ac) ) + ROM_LOAD( "epr7104", 0x18000, 0x8000, CRC(84a679c5) SHA1(19a21b1b33fc215f606093bfd61d597e4bd0b3d0) ) + ROM_LOAD( "epr7109", 0x20000, 0x8000, CRC(097f7481) SHA1(4d93ea01b811af1cd3e136116625e4b8e06358a2) ) + ROM_LOAD( "epr7105", 0x28000, 0x8000, CRC(13111729) SHA1(57ca2b945db36b056d0e40a39456fd8bf9d0a3ec) ) + ROM_LOAD( "epr7107", 0x30000, 0x8000, CRC(8f50ea24) SHA1(781687e202dedca7b72c9bd5b97d9d46fcfd601c) ) + + ROM_REGION( 0x0400, REGION_PROMS, 0 ) + ROM_LOAD( "epr7113", 0x0000, 0x0100, CRC(5c0e1360) SHA1(2011b3eef2a58f9bd3f3b1bb9e6c201db85727c2) ) /* palette red component */ + ROM_LOAD( "epr7112", 0x0100, 0x0100, CRC(46fbd351) SHA1(1fca7fbc5d5f8e13e58bbac735511bd0af392446) ) /* palette green component */ + ROM_LOAD( "epr7111", 0x0200, 0x0100, CRC(8123b6b9) SHA1(fb2c5498f0603b5cd270402a738c891a85453666) ) /* palette blue component */ + ROM_LOAD( "epr5317", 0x0300, 0x0100, CRC(648350b8) SHA1(c7986aa9127ef5b50b845434cb4e81dff9861cd2) ) /* timing? (not used) */ +ROM_END + +/* + +Shooting Master (EVG) +Year: 1985 +Manufacturer: E.V.G. SRL Milano made in Italy (Sega license) + +CPU +1x Z8400AB1-Z80ACPU-Y28548 (main board) +1x iC8751H-88-L5310039 (main board) +1x AMD P8255A-8526YP (main board) +1x SEGA 315-5012-8605P5 (main board) +1x SEGA 315-5011-8549X5 (main board) +1x SEGA 315-5049-8551PX (main board) +1x SEGA 315-5139-8537-CK2605-V-J (main board) +1x oscillator 20.000MHz (main board) +1x SYS Z8400AB1-Z80ACPU-Y28535 (upper board) +1x NEC D8255AC-2 (upper board) +1x oscillator 4.9152MHz (upper board) + +ROMs +1x HN27256G-25 (7043)(main board close to Z80) +2x HN27256G-25 (7101-7102)(main board close to C8751) +3x HN27256G-25 (7040-7041-7042)(main board close to 315-5049) +2x PAL16R4A (315-5137 and 315-5138) +1x HN27256G-25 (7100)(upper board close to oscillator) +7x HN27256G-25 (7104 to 7110)(upper board close to Z80 and 8255) + +7040.4 = epr7040 Shooting Master +7041.5 = epr7041 Shooting Master +7042.6 = epr7042 Shooting Master +7043.126 = epr7043 Shooting Master +7100.18 NO MATCH +7101.91 = epr7101 Shooting Master +7102.92 = epr7102 Shooting Master +7104.20 = epr7104 Shooting Master +7105.21 = epr7105 Shooting Master +7106.22 = epr7106 Shooting Master +7107.23 = epr7107 Shooting Master +7108.24 = epr7108 Shooting Master +7109.25 = epr7109 Shooting Master +7110.26 = epr7110 Shooting Master +8751.74.bad.dump NO MATCH +pal16r4a(315-5137).jed NOT A ROM --> converted into bin format on 20060915 +pal16r4a(315-5138).jed = pal16r4a.ic9 Choplifter + = pal16r4a.ic9 Choplifter (bootleg) + +this set seems to hang sometimes, is it bad, it could be hacked and failing checks hidden in the game. + +*/ + +ROM_START( shtngmsa ) + ROM_REGION( 0x20000, REGION_CPU1, 0 ) /* 128k for code */ + ROM_LOAD( "7100.18", 0x00000, 0x8000, CRC(268ecb1d) SHA1(a9274c9718f7244235cc6df76331d6a0b7e4e4c8) ) // different.. + ROM_LOAD( "epr7101", 0x10000, 0x8000, CRC(ebf5ff72) SHA1(13ae06e3a81cf00b80ec939d5baf30143d61d480) ) + ROM_LOAD( "epr7102", 0x18000, 0x8000, CRC(c890a4ad) SHA1(4b59d37902ace3a69b380ff40652ee37c85f0e9d) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for sound cpu */ + ROM_LOAD( "epr7043", 0x0000, 0x8000, CRC(99a368ab) SHA1(a9451f39ee2613e5c3e2791d4d8d837b4a3ab666) ) + + ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "epr7040", 0x00000, 0x8000, CRC(f30769fa) SHA1(366c1fbe4e1c8943b209f6c831c9a6b7e4372105) ) + ROM_LOAD( "epr7041", 0x08000, 0x8000, CRC(f3e273f9) SHA1(b8715c528299dc1e4f0c19c50d91ca9861a423a1) ) + ROM_LOAD( "epr7042", 0x10000, 0x8000, CRC(6841c917) SHA1(6553843eea0131eb7b5a9aa29dddf641e41d8cc3) ) + + ROM_REGION( 0x40000, REGION_GFX2, ROMREGION_ERASEFF ) + ROM_LOAD( "epr7110", 0x00000, 0x8000, CRC(5d1a5048) SHA1(d1626ab1981080451c912df7e4ad7f76c0cb3459) ) + ROM_LOAD( "epr7106", 0x08000, 0x8000, CRC(ae7ab7a2) SHA1(153691e468d29d21b95f1fbffb6896a3140d7e14) ) + ROM_LOAD( "epr7108", 0x10000, 0x8000, CRC(816180ac) SHA1(a59670ec77d4359041ebf12dae5b74add55d82ac) ) + ROM_LOAD( "epr7104", 0x18000, 0x8000, CRC(84a679c5) SHA1(19a21b1b33fc215f606093bfd61d597e4bd0b3d0) ) ROM_LOAD( "epr7109", 0x20000, 0x8000, CRC(097f7481) SHA1(4d93ea01b811af1cd3e136116625e4b8e06358a2) ) - ROM_LOAD( "epr7108", 0x28000, 0x8000, CRC(816180ac) SHA1(a59670ec77d4359041ebf12dae5b74add55d82ac) ) - ROM_LOAD( "epr7110", 0x30000, 0x8000, CRC(5d1a5048) SHA1(d1626ab1981080451c912df7e4ad7f76c0cb3459) ) + ROM_LOAD( "epr7105", 0x28000, 0x8000, CRC(13111729) SHA1(57ca2b945db36b056d0e40a39456fd8bf9d0a3ec) ) + ROM_LOAD( "epr7107", 0x30000, 0x8000, CRC(8f50ea24) SHA1(781687e202dedca7b72c9bd5b97d9d46fcfd601c) ) ROM_REGION( 0x0400, REGION_PROMS, 0 ) ROM_LOAD( "epr7113", 0x0000, 0x0100, CRC(5c0e1360) SHA1(2011b3eef2a58f9bd3f3b1bb9e6c201db85727c2) ) /* palette red component */ ROM_LOAD( "epr7112", 0x0100, 0x0100, CRC(46fbd351) SHA1(1fca7fbc5d5f8e13e58bbac735511bd0af392446) ) /* palette green component */ ROM_LOAD( "epr7111", 0x0200, 0x0100, CRC(8123b6b9) SHA1(fb2c5498f0603b5cd270402a738c891a85453666) ) /* palette blue component */ ROM_LOAD( "epr5317", 0x0300, 0x0100, CRC(648350b8) SHA1(c7986aa9127ef5b50b845434cb4e81dff9861cd2) ) /* timing? (not used) */ + + ROM_REGION( 0x0400, REGION_PLDS, ROMREGION_DISPOSE ) + ROM_LOAD( "pal16r4a.ic9", 0x0000, 0x0104, CRC(dd223015) SHA1(8d70f91b118e8653dda1efee3eaea287ae63809f) ) /* label on chip is: 315-5137 */ + ROM_LOAD( "pal16r4a(315-5137).bin", 0x0200, 0x0104, CRC(6ffd9e6f) SHA1(a60a3a2ec5bc256b18bfff0fec0172ee2e4fd955) ) ROM_END + ROM_START( chplft ) ROM_REGION( 0x20000, REGION_CPU1, 0 ) /* 128k for code */ ROM_LOAD( "epr-7124.90", 0x00000, 0x8000, CRC(678d5c41) SHA1(7553979f78270c2ddc5b3f3ebf7817ead8e08de7) ) @@ -4114,9 +4346,9 @@ ROM_START( wbmlbg ) ROM_LOAD( "epr11037.126", 0x0000, 0x8000, CRC(7a4ee585) SHA1(050436106cced5dcbf40a3d94d48202eedddc3ad) ) ROM_REGION( 0x18000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "galaxy.ic6", 0x00000, 0x8000, CRC(6bb5e601) SHA1(465d67dcde4e775d1b93640ef1a300e958cbe707) ) - ROM_LOAD( "galaxy.ic5", 0x08000, 0x8000, CRC(3c11d151) SHA1(7b0c6792ae919ac309a709ca0c89006487e1d6e9) ) - ROM_LOAD( "galaxy.ic4", 0x10000, 0x8000, CRC(ab75d056) SHA1(d90d9c723536d0ec21900dc70b51715300b01fe7) ) + ROM_LOAD( "galaxy.ic4", 0x00000, 0x8000, CRC(ab75d056) SHA1(d90d9c723536d0ec21900dc70b51715300b01fe7) ) + ROM_LOAD( "galaxy.ic6", 0x08000, 0x8000, CRC(6bb5e601) SHA1(465d67dcde4e775d1b93640ef1a300e958cbe707) ) + ROM_LOAD( "galaxy.ic5", 0x10000, 0x8000, CRC(3c11d151) SHA1(7b0c6792ae919ac309a709ca0c89006487e1d6e9) ) ROM_REGION( 0x20000, REGION_GFX2, 0 ) /* 128k for sprites data */ ROM_LOAD( "epr11028.87", 0x00000, 0x8000, CRC(af0b3972) SHA1(413825f66b84c7e45aa1855131482abead8f7f3b) ) @@ -4394,8 +4626,9 @@ GAME( 1985, hvymetal, 0, hvymetal, hvymetal, hvymetal, ROT0, "Sega", GAME( 1985, myhero, 0, system1, myhero, 0, ROT0, "Sega", "My Hero (US)", GAME_SUPPORTS_SAVE ) GAME( 1985, sscandal, myhero, system1, myhero, myheroj, ROT0, "Coreland / Sega", "Seishun Scandal (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1985, myherok, myhero, system1, myhero, myherok, ROT0, "Coreland / Sega", "My Hero (Korea)", GAME_SUPPORTS_SAVE ) -GAME( 1985, shtngmst, 0, chplft, chplft, 0, ROT0, "Sega", "Shooting Master", GAME_UNEMULATED_PROTECTION | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE) /* 8751 protection, mcu = 315-5159 */ -GAME( 1985, chplft, 0, chplft, chplft, 0, ROT0, "Sega", "Choplifter", GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE) /* 8751 protection */ +GAME( 1985, shtngmst, 0, shtngmst, shtngmst, 0, ROT0, "Sega", "Shooting Master", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) /* 8751 protection, mcu = 315-5159 */ +GAME( 1985, shtngmsa, shtngmst, shtngmst, shtngmst, 0, ROT0, "Sega [EVG]", "Shooting Master (EVG)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) /* 8751 protection, mcu = 315-5159 */ +GAME( 1985, chplft, 0, chplft, chplft, 0, ROT0, "Sega", "Choplifter", GAME_UNEMULATED_PROTECTION | GAME_SUPPORTS_SAVE | GAME_NOT_WORKING ) /* 8751 protection */ GAME( 1985, chplftb, chplft, chplft, chplft, 0, ROT0, "Sega", "Choplifter (alternate)", GAME_SUPPORTS_SAVE ) GAME( 1985, chplftbl, chplft, chplft, chplft, 0, ROT0, "bootleg", "Choplifter (bootleg)", GAME_SUPPORTS_SAVE ) GAME( 1985, 4dwarrio, 0, system1, 4dwarrio, 4dwarrio, ROT0, "Coreland / Sega", "4-D Warriors", GAME_SUPPORTS_SAVE ) diff --git a/src/drivers/system16.c b/src/drivers/system16.c index fc1c887dd..8131c7fdd 100644 --- a/src/drivers/system16.c +++ b/src/drivers/system16.c @@ -715,7 +715,7 @@ static MACHINE_RESET( bayroute ) static DRIVER_INIT( bayrtbl1 ) { int i; - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); /* invert the graphics bits on the tiles */ for (i = 0; i < 0x30000; i++) memory_region(REGION_GFX1)[i] ^= 0xff; @@ -877,7 +877,7 @@ static DRIVER_INIT( dduxbl ) 0,2,0,0 }; - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); sys16_video_config(dduxbl_update_proc, -0x48, bank); } /***************************************************************************/ @@ -1007,7 +1007,7 @@ static MACHINE_RESET( eswatbl ) static DRIVER_INIT( eswatbl ) { - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); sys16_rowscroll_scroll=0x8000; sys18_splittab_fg_x=&sys16_textram[0x0f80]; } @@ -1131,7 +1131,7 @@ static MACHINE_RESET( fpointbl ) static DRIVER_INIT( fpointbl ) { - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); sys16_video_config(fpoint_update_proc, -0xb8, NULL); } /***************************************************************************/ @@ -1367,7 +1367,7 @@ static DRIVER_INIT( goldnabl ) { int i; - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); /* invert the graphics bits on the tiles */ for (i = 0; i < 0x60000; i++) @@ -1584,14 +1584,14 @@ static MACHINE_RESET( passht4b ) static DRIVER_INIT( passsht ) { - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); } static DRIVER_INIT( passht4b ) { int i; - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); /* invert the graphics bits on the tiles */ for (i = 0; i < 0x30000; i++) @@ -1762,7 +1762,7 @@ MACHINE_DRIVER_END static DRIVER_INIT( shinobi ) { - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); } /***************************************************************************/ @@ -1934,7 +1934,7 @@ static MACHINE_RESET( tetrisbl ) static DRIVER_INIT( tetrisbl ) { - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); } @@ -2141,7 +2141,7 @@ static DRIVER_INIT( tturfbl ) UINT8 *mem; int i; - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); /* invert the graphics bits on the tiles */ for (i = 0; i < 0x30000; i++) @@ -2309,7 +2309,7 @@ static DRIVER_INIT( wb3bbl ) { int i; - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); /* invert the graphics bits on the tiles */ for (i = 0; i < 0x30000; i++) diff --git a/src/drivers/system18.c b/src/drivers/system18.c index 95e031952..1ac09751a 100644 --- a/src/drivers/system18.c +++ b/src/drivers/system18.c @@ -776,7 +776,7 @@ static DRIVER_INIT( shdancbl ) for(i = 0; i < 0xc0000; i++) mem[i] ^= 0xFF; - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); memory_install_read16_handler(0, ADDRESS_SPACE_PROGRAM, 0xffc000, 0xffc001, 0, 0, shdancbl_skip_r ); sys18_splittab_fg_x=&sys16_textram[0x0f80/2]; @@ -919,7 +919,7 @@ static DRIVER_INIT( mwalkbl ){ 0x1f, 0xA0000 // ROM #4 = 256K }; - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); sys18_splittab_fg_x=&sys16_textram[0x0f80/2]; sys18_splittab_bg_x=&sys16_textram[0x0fc0/2]; @@ -1100,7 +1100,7 @@ static DRIVER_INIT( astormbl ){ 0x1f, 0xA0000 // ROM #4 = 256K }; - machine_reset_sys16_onetime(); + machine_reset_sys16_onetime(machine); sys18_splittab_fg_x=&sys16_textram[0x0f80/2]; sys18_splittab_bg_x=&sys16_textram[0x0fc0/2]; sys16_MaxShadowColors = 0; // doesn't seem to use transparent shadows diff --git a/src/drivers/system24.c b/src/drivers/system24.c index 8be898f34..b98e94606 100644 --- a/src/drivers/system24.c +++ b/src/drivers/system24.c @@ -901,7 +901,7 @@ static READ16_HANDLER(irq_r) if (activecpu_get_pc()==0x0084aa) { ggground_kludge = 1; - return mame_rand(); + return mame_rand(Machine); } if (activecpu_get_pc()==0x084ba) diff --git a/src/drivers/taito_b.c b/src/drivers/taito_b.c index d990cd3d5..03f1def09 100644 --- a/src/drivers/taito_b.c +++ b/src/drivers/taito_b.c @@ -3344,14 +3344,14 @@ MACHINE_DRIVER_END ROM_START( rastsag2 ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 512k for 68000 code */ - ROM_LOAD16_BYTE( "b81-08.50" , 0x00000, 0x20000, CRC(d6da9169) SHA1(33d74315754576e6f879059de033f96f9003f819) ) - ROM_LOAD16_BYTE( "b81-07.31" , 0x00001, 0x20000, CRC(8edf17d7) SHA1(b0c03002ed520abffefd55d4969d0ed4fcf3a3a4) ) - ROM_LOAD16_BYTE( "b81-10.49" , 0x40000, 0x20000, CRC(53f34344) SHA1(9930c3fd9c17f7d9b654221da3896d0ff5778c97) ) - ROM_LOAD16_BYTE( "b81-09.30" , 0x40001, 0x20000, CRC(630d34af) SHA1(42452111b10f1d543e03661012dda879218dea62) ) + ROM_LOAD16_BYTE( "b81-08.50", 0x00000, 0x20000, CRC(d6da9169) SHA1(33d74315754576e6f879059de033f96f9003f819) ) + ROM_LOAD16_BYTE( "b81-07.31", 0x00001, 0x20000, CRC(8edf17d7) SHA1(b0c03002ed520abffefd55d4969d0ed4fcf3a3a4) ) + ROM_LOAD16_BYTE( "b81-10.49", 0x40000, 0x20000, CRC(53f34344) SHA1(9930c3fd9c17f7d9b654221da3896d0ff5778c97) ) + ROM_LOAD16_BYTE( "b81-09.30", 0x40001, 0x20000, CRC(630d34af) SHA1(42452111b10f1d543e03661012dda879218dea62) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ ROM_LOAD( "b81-11.37", 0x00000, 0x4000, CRC(3704bf09) SHA1(a0a37b23e3df482c5f5aa43825345ea8affbba34) ) - ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ + ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ ROM_REGION( 0x100000, REGION_GFX1, ROMREGION_DISPOSE ) ROM_LOAD( "b81-03.14", 0x000000, 0x080000, CRC(551b75e6) SHA1(5b8388ee2c6262f359c9e6d04c951ea8dc3901c9) ) @@ -3366,14 +3366,14 @@ ROM_END ROM_START( nastarw ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 512k for 68000 code */ - ROM_LOAD16_BYTE( "b81-08.50" , 0x00000, 0x20000, CRC(d6da9169) SHA1(33d74315754576e6f879059de033f96f9003f819) ) - ROM_LOAD16_BYTE( "b81-12.31" , 0x00001, 0x20000, CRC(f9d82741) SHA1(f5f3a1101d92b6c241e819dcdcdcdc4b125140f7) ) - ROM_LOAD16_BYTE( "b81-10.49" , 0x40000, 0x20000, CRC(53f34344) SHA1(9930c3fd9c17f7d9b654221da3896d0ff5778c97) ) - ROM_LOAD16_BYTE( "b81-09.30" , 0x40001, 0x20000, CRC(630d34af) SHA1(42452111b10f1d543e03661012dda879218dea62) ) + ROM_LOAD16_BYTE( "b81-08.50", 0x00000, 0x20000, CRC(d6da9169) SHA1(33d74315754576e6f879059de033f96f9003f819) ) + ROM_LOAD16_BYTE( "b81-12.31", 0x00001, 0x20000, CRC(f9d82741) SHA1(f5f3a1101d92b6c241e819dcdcdcdc4b125140f7) ) + ROM_LOAD16_BYTE( "b81-10.49", 0x40000, 0x20000, CRC(53f34344) SHA1(9930c3fd9c17f7d9b654221da3896d0ff5778c97) ) + ROM_LOAD16_BYTE( "b81-09.30", 0x40001, 0x20000, CRC(630d34af) SHA1(42452111b10f1d543e03661012dda879218dea62) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ ROM_LOAD( "b81-11.37", 0x00000, 0x4000, CRC(3704bf09) SHA1(a0a37b23e3df482c5f5aa43825345ea8affbba34) ) - ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ + ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ ROM_REGION( 0x100000, REGION_GFX1, ROMREGION_DISPOSE ) ROM_LOAD( "b81-03.14", 0x000000, 0x080000, CRC(551b75e6) SHA1(5b8388ee2c6262f359c9e6d04c951ea8dc3901c9) ) @@ -3388,14 +3388,14 @@ ROM_END ROM_START( nastar ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 512k for 68000 code */ - ROM_LOAD16_BYTE( "b81-08.50" , 0x00000, 0x20000, CRC(d6da9169) SHA1(33d74315754576e6f879059de033f96f9003f819) ) - ROM_LOAD16_BYTE( "b81-13.31" , 0x00001, 0x20000, CRC(60d176fb) SHA1(fbe3a0603bcd23e565b0d474a63742d20a3ce8cc) ) - ROM_LOAD16_BYTE( "b81-10.49" , 0x40000, 0x20000, CRC(53f34344) SHA1(9930c3fd9c17f7d9b654221da3896d0ff5778c97) ) - ROM_LOAD16_BYTE( "b81-09.30" , 0x40001, 0x20000, CRC(630d34af) SHA1(42452111b10f1d543e03661012dda879218dea62) ) + ROM_LOAD16_BYTE( "b81-08.50", 0x00000, 0x20000, CRC(d6da9169) SHA1(33d74315754576e6f879059de033f96f9003f819) ) + ROM_LOAD16_BYTE( "b81-13.31", 0x00001, 0x20000, CRC(60d176fb) SHA1(fbe3a0603bcd23e565b0d474a63742d20a3ce8cc) ) + ROM_LOAD16_BYTE( "b81-10.49", 0x40000, 0x20000, CRC(53f34344) SHA1(9930c3fd9c17f7d9b654221da3896d0ff5778c97) ) + ROM_LOAD16_BYTE( "b81-09.30", 0x40001, 0x20000, CRC(630d34af) SHA1(42452111b10f1d543e03661012dda879218dea62) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ ROM_LOAD( "b81-11.37", 0x00000, 0x4000, CRC(3704bf09) SHA1(a0a37b23e3df482c5f5aa43825345ea8affbba34) ) - ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ + ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ ROM_REGION( 0x100000, REGION_GFX1, ROMREGION_DISPOSE ) ROM_LOAD( "b81-03.14", 0x000000, 0x080000, CRC(551b75e6) SHA1(5b8388ee2c6262f359c9e6d04c951ea8dc3901c9) ) @@ -3414,67 +3414,67 @@ ROM_END ROM_START( crimec ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 512k for 68000 code */ - ROM_LOAD16_BYTE( "b99_07.40", 0x00000, 0x20000, CRC(26e886e6) SHA1(b7d0024a084216c1139eb6705f1b8143902cbed3) ) - ROM_LOAD16_BYTE( "b99_05.29", 0x00001, 0x20000, CRC(ff7f9a9d) SHA1(c1897a141eea423879d2792640a9ee85636ed5be) ) - ROM_LOAD16_BYTE( "b99_06.39", 0x40000, 0x20000, CRC(1f26aa92) SHA1(10ab253812db83204c136d01d865063a2210cb92) ) - ROM_LOAD16_BYTE( "b99_14.28", 0x40001, 0x20000, CRC(71c8b4d7) SHA1(55068c9cac75200f564b10f98f322e30aaa6849e) ) + ROM_LOAD16_BYTE( "b99-07.40", 0x00000, 0x20000, CRC(26e886e6) SHA1(b7d0024a084216c1139eb6705f1b8143902cbed3) ) + ROM_LOAD16_BYTE( "b99-05.29", 0x00001, 0x20000, CRC(ff7f9a9d) SHA1(c1897a141eea423879d2792640a9ee85636ed5be) ) + ROM_LOAD16_BYTE( "b99-06.39", 0x40000, 0x20000, CRC(1f26aa92) SHA1(10ab253812db83204c136d01d865063a2210cb92) ) + ROM_LOAD16_BYTE( "b99-14.28", 0x40001, 0x20000, CRC(71c8b4d7) SHA1(55068c9cac75200f564b10f98f322e30aaa6849e) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ - ROM_LOAD( "b99_08.45", 0x00000, 0x4000, CRC(26135451) SHA1(651c77285eb12a13a2fe4069031c6f01150ecba4) ) + ROM_LOAD( "b99-08.45", 0x00000, 0x4000, CRC(26135451) SHA1(651c77285eb12a13a2fe4069031c6f01150ecba4) ) ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ ROM_REGION( 0x100000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "b99_02.18", 0x000000, 0x080000, CRC(2a5d4a26) SHA1(94bdfca9365970a80a639027b195b71cebc5ab9c) ) - ROM_LOAD( "b99_01.19", 0x080000, 0x080000, CRC(a19e373a) SHA1(2208c9142473dc2218fd8b97fd6d0c861aeba011) ) + ROM_LOAD( "b99-02.18", 0x000000, 0x080000, CRC(2a5d4a26) SHA1(94bdfca9365970a80a639027b195b71cebc5ab9c) ) + ROM_LOAD( "b99-01.19", 0x080000, 0x080000, CRC(a19e373a) SHA1(2208c9142473dc2218fd8b97fd6d0c861aeba011) ) ROM_REGION( 0x80000, REGION_SOUND1, 0 ) - ROM_LOAD( "b99_03.37", 0x000000, 0x080000, CRC(dda10df7) SHA1(ffbe1423794035e6f049fddb096b7282610b7cee) ) + ROM_LOAD( "b99-03.37", 0x000000, 0x080000, CRC(dda10df7) SHA1(ffbe1423794035e6f049fddb096b7282610b7cee) ) ROM_END ROM_START( crimecu ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 512k for 68000 code */ - ROM_LOAD16_BYTE( "b99_07.40", 0x00000, 0x20000, CRC(26e886e6) SHA1(b7d0024a084216c1139eb6705f1b8143902cbed3) ) - ROM_LOAD16_BYTE( "b99_05.29", 0x00001, 0x20000, CRC(ff7f9a9d) SHA1(c1897a141eea423879d2792640a9ee85636ed5be) ) - ROM_LOAD16_BYTE( "b99_06.39", 0x40000, 0x20000, CRC(1f26aa92) SHA1(10ab253812db83204c136d01d865063a2210cb92) ) - ROM_LOAD16_BYTE( "b99_13.28", 0x40001, 0x20000, CRC(06cf8441) SHA1(0395fd1f38366bd56b4b53e435dc7c3676d9e9bf) ) + ROM_LOAD16_BYTE( "b99-07.40", 0x00000, 0x20000, CRC(26e886e6) SHA1(b7d0024a084216c1139eb6705f1b8143902cbed3) ) + ROM_LOAD16_BYTE( "b99-05.29", 0x00001, 0x20000, CRC(ff7f9a9d) SHA1(c1897a141eea423879d2792640a9ee85636ed5be) ) + ROM_LOAD16_BYTE( "b99-06.39", 0x40000, 0x20000, CRC(1f26aa92) SHA1(10ab253812db83204c136d01d865063a2210cb92) ) + ROM_LOAD16_BYTE( "b99-13.28", 0x40001, 0x20000, CRC(06cf8441) SHA1(0395fd1f38366bd56b4b53e435dc7c3676d9e9bf) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ - ROM_LOAD( "b99_08.45", 0x00000, 0x4000, CRC(26135451) SHA1(651c77285eb12a13a2fe4069031c6f01150ecba4) ) + ROM_LOAD( "b99-08.45", 0x00000, 0x4000, CRC(26135451) SHA1(651c77285eb12a13a2fe4069031c6f01150ecba4) ) ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ ROM_REGION( 0x100000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "b99_02.18", 0x000000, 0x080000, CRC(2a5d4a26) SHA1(94bdfca9365970a80a639027b195b71cebc5ab9c) ) - ROM_LOAD( "b99_01.19", 0x080000, 0x080000, CRC(a19e373a) SHA1(2208c9142473dc2218fd8b97fd6d0c861aeba011) ) + ROM_LOAD( "b99-02.18", 0x000000, 0x080000, CRC(2a5d4a26) SHA1(94bdfca9365970a80a639027b195b71cebc5ab9c) ) + ROM_LOAD( "b99-01.19", 0x080000, 0x080000, CRC(a19e373a) SHA1(2208c9142473dc2218fd8b97fd6d0c861aeba011) ) ROM_REGION( 0x80000, REGION_SOUND1, 0 ) - ROM_LOAD( "b99_03.37", 0x000000, 0x080000, CRC(dda10df7) SHA1(ffbe1423794035e6f049fddb096b7282610b7cee) ) + ROM_LOAD( "b99-03.37", 0x000000, 0x080000, CRC(dda10df7) SHA1(ffbe1423794035e6f049fddb096b7282610b7cee) ) ROM_END ROM_START( crimecj ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 512k for 68000 code */ - ROM_LOAD16_BYTE( "b99_07.40", 0x00000, 0x20000, CRC(26e886e6) SHA1(b7d0024a084216c1139eb6705f1b8143902cbed3) ) - ROM_LOAD16_BYTE( "b99_05.29", 0x00001, 0x20000, CRC(ff7f9a9d) SHA1(c1897a141eea423879d2792640a9ee85636ed5be) ) - ROM_LOAD16_BYTE( "b99_06.39", 0x40000, 0x20000, CRC(1f26aa92) SHA1(10ab253812db83204c136d01d865063a2210cb92) ) - ROM_LOAD16_BYTE( "b99_15.28", 0x40001, 0x20000, CRC(e8c1e56d) SHA1(ba0dc181db843e26676223f54cb121df738be987) ) + ROM_LOAD16_BYTE( "b99-07.40", 0x00000, 0x20000, CRC(26e886e6) SHA1(b7d0024a084216c1139eb6705f1b8143902cbed3) ) + ROM_LOAD16_BYTE( "b99-05.29", 0x00001, 0x20000, CRC(ff7f9a9d) SHA1(c1897a141eea423879d2792640a9ee85636ed5be) ) + ROM_LOAD16_BYTE( "b99-06.39", 0x40000, 0x20000, CRC(1f26aa92) SHA1(10ab253812db83204c136d01d865063a2210cb92) ) + ROM_LOAD16_BYTE( "b99-15.28", 0x40001, 0x20000, CRC(e8c1e56d) SHA1(ba0dc181db843e26676223f54cb121df738be987) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ - ROM_LOAD( "b99_08.45", 0x00000, 0x4000, CRC(26135451) SHA1(651c77285eb12a13a2fe4069031c6f01150ecba4) ) + ROM_LOAD( "b99-08.45", 0x00000, 0x4000, CRC(26135451) SHA1(651c77285eb12a13a2fe4069031c6f01150ecba4) ) ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ ROM_REGION( 0x100000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "b99_02.18", 0x000000, 0x080000, CRC(2a5d4a26) SHA1(94bdfca9365970a80a639027b195b71cebc5ab9c) ) - ROM_LOAD( "b99_01.19", 0x080000, 0x080000, CRC(a19e373a) SHA1(2208c9142473dc2218fd8b97fd6d0c861aeba011) ) + ROM_LOAD( "b99-02.18", 0x000000, 0x080000, CRC(2a5d4a26) SHA1(94bdfca9365970a80a639027b195b71cebc5ab9c) ) + ROM_LOAD( "b99-01.19", 0x080000, 0x080000, CRC(a19e373a) SHA1(2208c9142473dc2218fd8b97fd6d0c861aeba011) ) ROM_REGION( 0x80000, REGION_SOUND1, 0 ) - ROM_LOAD( "b99_03.37", 0x000000, 0x080000, CRC(dda10df7) SHA1(ffbe1423794035e6f049fddb096b7282610b7cee) ) + ROM_LOAD( "b99-03.37", 0x000000, 0x080000, CRC(dda10df7) SHA1(ffbe1423794035e6f049fddb096b7282610b7cee) ) ROM_END ROM_START( ashura ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 512k for 68000 code */ - ROM_LOAD16_BYTE( "c4307-1.50", 0x00000, 0x20000, CRC(d5ceb20f) SHA1(59bc9468d7f43d3b1388c2915fafeba7e2cf13a5) ) - ROM_LOAD16_BYTE( "c4305-1.31", 0x00001, 0x20000, CRC(a6f3bb37) SHA1(6959f3bcbcd2d5b13c95dcfd7a536541dcab49f8) ) - ROM_LOAD16_BYTE( "c4306-1.49", 0x40000, 0x20000, CRC(0f331802) SHA1(e7ed01b0d664c4db6ea9acc54b57e674e10685aa) ) - ROM_LOAD16_BYTE( "c4304-1.30", 0x40001, 0x20000, CRC(e06a2414) SHA1(77ebe1e61b6303f328757de2c90fae6588026414) ) + ROM_LOAD16_BYTE( "c43-07-1.50", 0x00000, 0x20000, CRC(d5ceb20f) SHA1(59bc9468d7f43d3b1388c2915fafeba7e2cf13a5) ) + ROM_LOAD16_BYTE( "c43-05-1.31", 0x00001, 0x20000, CRC(a6f3bb37) SHA1(6959f3bcbcd2d5b13c95dcfd7a536541dcab49f8) ) + ROM_LOAD16_BYTE( "c43-06-1.49", 0x40000, 0x20000, CRC(0f331802) SHA1(e7ed01b0d664c4db6ea9acc54b57e674e10685aa) ) + ROM_LOAD16_BYTE( "c43-04-1.30", 0x40001, 0x20000, CRC(e06a2414) SHA1(77ebe1e61b6303f328757de2c90fae6588026414) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ ROM_LOAD( "c43-16", 0x00000, 0x4000, CRC(cb26fce1) SHA1(7cc60326455c7bb2ca543ddfd4002462cc079837) ) @@ -3490,10 +3490,10 @@ ROM_END ROM_START( ashurau ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 512k for 68000 code */ - ROM_LOAD16_BYTE( "c43-11", 0x00000, 0x20000, CRC(d5aefc9b) SHA1(0fdfa166942ea70a77f956d16fd3b31225044c54) ) - ROM_LOAD16_BYTE( "c43-09", 0x00001, 0x20000, CRC(e91d0ab1) SHA1(992f63ebba538e624c695c1a868b14f4baa66ab9) ) - ROM_LOAD16_BYTE( "c43-10", 0x40000, 0x20000, CRC(c218e7ea) SHA1(d9b19ad26206238f8417efe3b80c020fea0dd573) ) - ROM_LOAD16_BYTE( "c43-08", 0x40001, 0x20000, CRC(5ef4f19f) SHA1(864e3a4a4e92adaa63249debad6292c528289fbe) ) + ROM_LOAD16_BYTE( "c43-11.50", 0x00000, 0x20000, CRC(d5aefc9b) SHA1(0fdfa166942ea70a77f956d16fd3b31225044c54) ) + ROM_LOAD16_BYTE( "c43-09.31", 0x00001, 0x20000, CRC(e91d0ab1) SHA1(992f63ebba538e624c695c1a868b14f4baa66ab9) ) + ROM_LOAD16_BYTE( "c43-10.49", 0x40000, 0x20000, CRC(c218e7ea) SHA1(d9b19ad26206238f8417efe3b80c020fea0dd573) ) + ROM_LOAD16_BYTE( "c43-08.30", 0x40001, 0x20000, CRC(5ef4f19f) SHA1(864e3a4a4e92adaa63249debad6292c528289fbe) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ ROM_LOAD( "c43-16", 0x00000, 0x4000, CRC(cb26fce1) SHA1(7cc60326455c7bb2ca543ddfd4002462cc079837) ) @@ -3532,8 +3532,8 @@ ROM_START( tetrista ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 512k for 68000 code */ ROM_LOAD16_BYTE( "c35-04.bin", 0x000000, 0x020000, CRC(fa6e42ff) SHA1(1c586243aaf57b46338f22ae0fcdba2897ccb98a) ) ROM_LOAD16_BYTE( "c35-03.bin", 0x000001, 0x020000, CRC(aebd8539) SHA1(5230c0513581513ba971da55c04da8ba451a16e2) ) - ROM_LOAD16_BYTE( "c35-02.bin", 0x040000, 0x020000, CRC(128e9927) SHA1(227b4a43074b66c9ba6f4497eb329fbcc5e3f52b) ) // ==c12_05 - ROM_LOAD16_BYTE( "c35-01.bin", 0x040001, 0x020000, CRC(5da7a319) SHA1(0c903b3274f6eafe24c8b5ef476dc5e8e3131b20) ) // ==c12_04 + ROM_LOAD16_BYTE( "c35-02.bin", 0x040000, 0x020000, CRC(128e9927) SHA1(227b4a43074b66c9ba6f4497eb329fbcc5e3f52b) ) // ==c12-05 + ROM_LOAD16_BYTE( "c35-01.bin", 0x040001, 0x020000, CRC(5da7a319) SHA1(0c903b3274f6eafe24c8b5ef476dc5e8e3131b20) ) // ==c12-04 ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ ROM_LOAD( "c35-05.bin", 0x00000, 0x4000, CRC(785c63fb) SHA1(13db76d8ce52ff21bfda0866c9c6b52147c6fc9d) ) @@ -3674,8 +3674,8 @@ ROM_END ROM_START( spacedx ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 512k for 68000 code */ - ROM_LOAD16_BYTE( "d89-06", 0x00000, 0x40000, CRC(7122751e) SHA1(4b4eb58af28f1988ff102251407449d0affbd4c2) ) - ROM_LOAD16_BYTE( "si-dxusa.ic2", 0x00001, 0x40000, CRC(50a4b8d1) SHA1(a8feac97c03cc8dc303dd9f4dae28f3daf851181) ) + ROM_LOAD16_BYTE( "d89-06", 0x00000, 0x40000, CRC(7122751e) SHA1(4b4eb58af28f1988ff102251407449d0affbd4c2) ) + ROM_LOAD16_BYTE( "d89-xx.ic2", 0x00001, 0x40000, CRC(56b0be6c) SHA1(37e3e28a23fb4af35bdf7c751e4c3a743e505c46) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ ROM_LOAD( "d89-07.27", 0x00000, 0x4000, CRC(bd743401) SHA1(bf1ff2255bbd79be21855814d52daced71fbe198) ) @@ -3725,7 +3725,7 @@ ROM_END ROM_START( spacedxo ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 256k for 68000 code */ ROM_LOAD16_BYTE( "d89-08.bin", 0x00000, 0x20000, CRC(0c2fe7f9) SHA1(a0773c059c8ff2c9e367e0fb460d7e5f9a762ab1) ) - ROM_LOAD16_BYTE( "d89-09j.bin", 0x00001, 0x20000, CRC(7f0a0ba4) SHA1(479df027929201997aeebbea5901a0a494f2dd61) ) + ROM_LOAD16_BYTE( "d89-09.bin", 0x00001, 0x20000, CRC(7f0a0ba4) SHA1(479df027929201997aeebbea5901a0a494f2dd61) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ ROM_LOAD( "d89-07.27", 0x00000, 0x4000, CRC(bd743401) SHA1(bf1ff2255bbd79be21855814d52daced71fbe198) ) @@ -3784,7 +3784,7 @@ ROM_END ROM_START( viofighu ) ROM_REGION( 0x080000, REGION_CPU1, 0 ) /* 1M for 68000 code */ ROM_LOAD16_BYTE( "c16-11.42", 0x00000, 0x10000, CRC(23dbd388) SHA1(488f928826d16b201dcc4b491b09955d0af91f19) ) - ROM_LOAD16_BYTE( "c16-13.bin",0x00001, 0x10000, CRC(ab947ffc) SHA1(103023cee4b20afa5086ba60522ea5aa723aebef) ) + ROM_LOAD16_BYTE( "c16-13.23", 0x00001, 0x10000, CRC(ab947ffc) SHA1(103023cee4b20afa5086ba60522ea5aa723aebef) ) ROM_LOAD16_BYTE( "c16-07.41", 0x40000, 0x20000, CRC(64d1d059) SHA1(643ac7fa5076147b24810a8e1b925dfe09f75864) ) ROM_LOAD16_BYTE( "c16-06.22", 0x40001, 0x20000, CRC(043761d8) SHA1(4587cadd73b628b4b9ac5c537cec20f90fb4959d) ) @@ -3808,82 +3808,106 @@ ROM_END ROM_START( masterw ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 512k for 68000 code */ - ROM_LOAD16_BYTE( "b72-06.rom" , 0x00000, 0x20000, CRC(ae848eff) SHA1(8715e64c5e03097aff5bf1a27e3809619a7731f0) ) - ROM_LOAD16_BYTE( "b72-12.rom" , 0x00001, 0x20000, CRC(7176ce70) SHA1(f3462ab9fe7e118b16fbe31d8caca27452280bf9) ) - ROM_LOAD16_BYTE( "b72-04.rom" , 0x40000, 0x20000, CRC(141e964c) SHA1(324e881317a3bf9885c81bb53cdc3de782ec2952) ) - ROM_LOAD16_BYTE( "b72-03.rom" , 0x40001, 0x20000, CRC(f4523496) SHA1(2c3e9d014ace1ae5127f432292f8d19c3a0ae1b0) ) + ROM_LOAD16_BYTE( "b72-06.rom", 0x00000, 0x20000, CRC(ae848eff) SHA1(8715e64c5e03097aff5bf1a27e3809619a7731f0) ) + ROM_LOAD16_BYTE( "b72-12.rom", 0x00001, 0x20000, CRC(7176ce70) SHA1(f3462ab9fe7e118b16fbe31d8caca27452280bf9) ) + ROM_LOAD16_BYTE( "b72-04.rom", 0x40000, 0x20000, CRC(141e964c) SHA1(324e881317a3bf9885c81bb53cdc3de782ec2952) ) + ROM_LOAD16_BYTE( "b72-03.rom", 0x40001, 0x20000, CRC(f4523496) SHA1(2c3e9d014ace1ae5127f432292f8d19c3a0ae1b0) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ ROM_LOAD( "b72-07.rom", 0x00000, 0x4000, CRC(2b1a946f) SHA1(cc9512e44bd92020ab5a53716b6399b7a6cde76d) ) ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ ROM_REGION( 0x100000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "mow-m02.rom", 0x000000, 0x080000, CRC(c519f65a) SHA1(f40cd7e09fa50abdafa95b7f9edf229e94e53d6f) ) - ROM_LOAD( "mow-m01.rom", 0x080000, 0x080000, CRC(a24ac26e) SHA1(895715a2bb0cb15334cba2283bd228b4fc08cd0c) ) + ROM_LOAD( "b72-02.rom", 0x000000, 0x080000, CRC(c519f65a) SHA1(f40cd7e09fa50abdafa95b7f9edf229e94e53d6f) ) + ROM_LOAD( "b72-01.rom", 0x080000, 0x080000, CRC(a24ac26e) SHA1(895715a2bb0cb15334cba2283bd228b4fc08cd0c) ) ROM_END ROM_START( masterwu ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 512k for 68000 code */ - ROM_LOAD16_BYTE( "b72-06.rom" , 0x00000, 0x20000, CRC(ae848eff) SHA1(8715e64c5e03097aff5bf1a27e3809619a7731f0) ) - ROM_LOAD16_BYTE( "b72-11.bin" , 0x00001, 0x20000, CRC(0671fee6) SHA1(6bec65d5e6704b4ec62c91f814675841ae9316a0) ) - ROM_LOAD16_BYTE( "b72-04.rom" , 0x40000, 0x20000, CRC(141e964c) SHA1(324e881317a3bf9885c81bb53cdc3de782ec2952) ) - ROM_LOAD16_BYTE( "b72-03.rom" , 0x40001, 0x20000, CRC(f4523496) SHA1(2c3e9d014ace1ae5127f432292f8d19c3a0ae1b0) ) + ROM_LOAD16_BYTE( "b72-06.rom", 0x00000, 0x20000, CRC(ae848eff) SHA1(8715e64c5e03097aff5bf1a27e3809619a7731f0) ) + ROM_LOAD16_BYTE( "b72-11.rom", 0x00001, 0x20000, CRC(0671fee6) SHA1(6bec65d5e6704b4ec62c91f814675841ae9316a0) ) + ROM_LOAD16_BYTE( "b72-04.rom", 0x40000, 0x20000, CRC(141e964c) SHA1(324e881317a3bf9885c81bb53cdc3de782ec2952) ) + ROM_LOAD16_BYTE( "b72-03.rom", 0x40001, 0x20000, CRC(f4523496) SHA1(2c3e9d014ace1ae5127f432292f8d19c3a0ae1b0) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ ROM_LOAD( "b72-07.rom", 0x00000, 0x4000, CRC(2b1a946f) SHA1(cc9512e44bd92020ab5a53716b6399b7a6cde76d) ) ROM_CONTINUE( 0x10000, 0xc000 ) /* banked stuff */ ROM_REGION( 0x100000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "mow-m02.rom", 0x000000, 0x080000, CRC(c519f65a) SHA1(f40cd7e09fa50abdafa95b7f9edf229e94e53d6f) ) - ROM_LOAD( "mow-m01.rom", 0x080000, 0x080000, CRC(a24ac26e) SHA1(895715a2bb0cb15334cba2283bd228b4fc08cd0c) ) + ROM_LOAD( "b72-02.rom", 0x000000, 0x080000, CRC(c519f65a) SHA1(f40cd7e09fa50abdafa95b7f9edf229e94e53d6f) ) + ROM_LOAD( "b72-01.rom", 0x080000, 0x080000, CRC(a24ac26e) SHA1(895715a2bb0cb15334cba2283bd228b4fc08cd0c) ) ROM_END ROM_START( silentd ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 256k for 68000 code */ - ROM_LOAD16_BYTE( "sr_12-1.rom", 0x00000, 0x20000, CRC(5883d362) SHA1(21c3af053fa92c26f119466ecd655697cc72ff3a) ) - ROM_LOAD16_BYTE( "sr_15-1.rom", 0x00001, 0x20000, CRC(8c0a72ae) SHA1(2199c4d6b87913ffb24cdccd6ca5176a97132baa) ) - ROM_LOAD16_BYTE( "sr_11.rom", 0x40000, 0x20000, CRC(35da4428) SHA1(5374bd97ad58aa2d67404cb05c862bb3aba40d6a) ) - ROM_LOAD16_BYTE( "sr_09.rom", 0x40001, 0x20000, CRC(2f05b14a) SHA1(f9ae935612e95d8ac2596af1728a6062569e9a42) ) + ROM_LOAD16_BYTE( "east-12-1.ic32", 0x00000, 0x20000, CRC(5883d362) SHA1(21c3af053fa92c26f119466ecd655697cc72ff3a) ) + ROM_LOAD16_BYTE( "east-15-1.ic10", 0x00001, 0x20000, CRC(8c0a72ae) SHA1(2199c4d6b87913ffb24cdccd6ca5176a97132baa) ) + ROM_LOAD16_BYTE( "east-11.ic31", 0x40000, 0x20000, CRC(35da4428) SHA1(5374bd97ad58aa2d67404cb05c862bb3aba40d6a) ) + ROM_LOAD16_BYTE( "east-09.ic9", 0x40001, 0x20000, CRC(2f05b14a) SHA1(f9ae935612e95d8ac2596af1728a6062569e9a42) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ - ROM_LOAD( "sr_13.rom", 0x00000, 0x04000, CRC(651861ab) SHA1(f94a120b70a4d59e17a6e120ca461b1f37587c0c) ) + ROM_LOAD( "east-13.ic15", 0x00000, 0x04000, CRC(651861ab) SHA1(f94a120b70a4d59e17a6e120ca461b1f37587c0c) ) ROM_CONTINUE( 0x10000, 0x0c000 ) /* banked stuff */ ROM_REGION( 0x400000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "sd_m04.rom", 0x000000, 0x100000, CRC(53237217) SHA1(fec044c26b8c99235f88c8be0d9ac63b81a3a094) ) - ROM_LOAD( "sd_m06.rom", 0x100000, 0x100000, CRC(e6e6dfa7) SHA1(913fa9a21cea175a1af87023144ebc98b3b0f33b) ) - ROM_LOAD( "sd_m03.rom", 0x200000, 0x100000, CRC(1b9b2846) SHA1(d9c87e130bc3baa949d8a8738daad648fcf284df) ) - ROM_LOAD( "sd_m05.rom", 0x300000, 0x100000, CRC(e02472c5) SHA1(35572610f6823ec980a928a75abd689197ebe207) ) + ROM_LOAD( "east-04.ic28", 0x000000, 0x100000, CRC(53237217) SHA1(fec044c26b8c99235f88c8be0d9ac63b81a3a094) ) + ROM_LOAD( "east-06.ic29", 0x100000, 0x100000, CRC(e6e6dfa7) SHA1(913fa9a21cea175a1af87023144ebc98b3b0f33b) ) + ROM_LOAD( "east-03.ic39", 0x200000, 0x100000, CRC(1b9b2846) SHA1(d9c87e130bc3baa949d8a8738daad648fcf284df) ) + ROM_LOAD( "east-05.ic40", 0x300000, 0x100000, CRC(e02472c5) SHA1(35572610f6823ec980a928a75abd689197ebe207) ) ROM_REGION( 0x80000, REGION_SOUND1, 0 ) - ROM_LOAD( "sd_m02.rom", 0x00000, 0x80000, CRC(e0de5c39) SHA1(75d0e193d882e67921c216c3293454e34304d25e) ) + ROM_LOAD( "east-02.ic3", 0x00000, 0x80000, CRC(e0de5c39) SHA1(75d0e193d882e67921c216c3293454e34304d25e) ) ROM_REGION( 0x80000, REGION_SOUND2, 0 ) - ROM_LOAD( "sd_m01.rom", 0x00000, 0x80000, CRC(b41fff1a) SHA1(54920d13fa2b3000eedab9d0050a299ae743c663) ) + ROM_LOAD( "east-01.ic1", 0x00000, 0x80000, CRC(b41fff1a) SHA1(54920d13fa2b3000eedab9d0050a299ae743c663) ) ROM_END ROM_START( silentdj ) ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 256k for 68000 code */ - ROM_LOAD16_BYTE( "sr_12-1.rom", 0x00000, 0x20000, CRC(5883d362) SHA1(21c3af053fa92c26f119466ecd655697cc72ff3a) ) - ROM_LOAD16_BYTE( "10-1.10", 0x00001, 0x20000, CRC(584306fc) SHA1(961cb6aaa426e3d83c499d101ef369b86a84c5d8) ) - ROM_LOAD16_BYTE( "sr_11.rom", 0x40000, 0x20000, CRC(35da4428) SHA1(5374bd97ad58aa2d67404cb05c862bb3aba40d6a) ) - ROM_LOAD16_BYTE( "sr_09.rom", 0x40001, 0x20000, CRC(2f05b14a) SHA1(f9ae935612e95d8ac2596af1728a6062569e9a42) ) + ROM_LOAD16_BYTE( "east-12-1.ic32", 0x00000, 0x20000, CRC(5883d362) SHA1(21c3af053fa92c26f119466ecd655697cc72ff3a) ) + ROM_LOAD16_BYTE( "east-10-1.ic10", 0x00001, 0x20000, CRC(584306fc) SHA1(961cb6aaa426e3d83c499d101ef369b86a84c5d8) ) + ROM_LOAD16_BYTE( "east-11.ic31", 0x40000, 0x20000, CRC(35da4428) SHA1(5374bd97ad58aa2d67404cb05c862bb3aba40d6a) ) + ROM_LOAD16_BYTE( "east-09.ic9", 0x40001, 0x20000, CRC(2f05b14a) SHA1(f9ae935612e95d8ac2596af1728a6062569e9a42) ) + + ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ + ROM_LOAD( "east-13.ic15", 0x00000, 0x04000, CRC(651861ab) SHA1(f94a120b70a4d59e17a6e120ca461b1f37587c0c) ) + ROM_CONTINUE( 0x10000, 0x0c000 ) /* banked stuff */ + + ROM_REGION( 0x400000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "east-04.ic28", 0x000000, 0x100000, CRC(53237217) SHA1(fec044c26b8c99235f88c8be0d9ac63b81a3a094) ) + ROM_LOAD( "east-06.ic29", 0x100000, 0x100000, CRC(e6e6dfa7) SHA1(913fa9a21cea175a1af87023144ebc98b3b0f33b) ) + ROM_LOAD( "east-03.ic39", 0x200000, 0x100000, CRC(1b9b2846) SHA1(d9c87e130bc3baa949d8a8738daad648fcf284df) ) + ROM_LOAD( "east-05.ic40", 0x300000, 0x100000, CRC(e02472c5) SHA1(35572610f6823ec980a928a75abd689197ebe207) ) + + ROM_REGION( 0x80000, REGION_SOUND1, 0 ) + ROM_LOAD( "east-02.ic3", 0x00000, 0x80000, CRC(e0de5c39) SHA1(75d0e193d882e67921c216c3293454e34304d25e) ) + + ROM_REGION( 0x80000, REGION_SOUND2, 0 ) + ROM_LOAD( "east-01.ic1", 0x00000, 0x80000, CRC(b41fff1a) SHA1(54920d13fa2b3000eedab9d0050a299ae743c663) ) +ROM_END + +ROM_START( silentdu ) + ROM_REGION( 0x80000, REGION_CPU1, 0 ) /* 256k for 68000 code */ + ROM_LOAD16_BYTE( "east-12-1.ic32", 0x00000, 0x20000, CRC(5883d362) SHA1(21c3af053fa92c26f119466ecd655697cc72ff3a) ) + ROM_LOAD16_BYTE( "east-14-1.ic10", 0x00001, 0x20000, CRC(3267bcd5) SHA1(358a717d0cdd22d84eb0d928c36e4e72a40c2882) ) + ROM_LOAD16_BYTE( "east-11.ic31", 0x40000, 0x20000, CRC(35da4428) SHA1(5374bd97ad58aa2d67404cb05c862bb3aba40d6a) ) + ROM_LOAD16_BYTE( "east-09.ic9", 0x40001, 0x20000, CRC(2f05b14a) SHA1(f9ae935612e95d8ac2596af1728a6062569e9a42) ) ROM_REGION( 0x1c000, REGION_CPU2, 0 ) /* 64k for Z80 code */ - ROM_LOAD( "sr_13.rom", 0x00000, 0x04000, CRC(651861ab) SHA1(f94a120b70a4d59e17a6e120ca461b1f37587c0c) ) + ROM_LOAD( "east-13.ic15", 0x00000, 0x04000, CRC(651861ab) SHA1(f94a120b70a4d59e17a6e120ca461b1f37587c0c) ) ROM_CONTINUE( 0x10000, 0x0c000 ) /* banked stuff */ ROM_REGION( 0x400000, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "sd_m04.rom", 0x000000, 0x100000, CRC(53237217) SHA1(fec044c26b8c99235f88c8be0d9ac63b81a3a094) ) - ROM_LOAD( "sd_m06.rom", 0x100000, 0x100000, CRC(e6e6dfa7) SHA1(913fa9a21cea175a1af87023144ebc98b3b0f33b) ) - ROM_LOAD( "sd_m03.rom", 0x200000, 0x100000, CRC(1b9b2846) SHA1(d9c87e130bc3baa949d8a8738daad648fcf284df) ) - ROM_LOAD( "sd_m05.rom", 0x300000, 0x100000, CRC(e02472c5) SHA1(35572610f6823ec980a928a75abd689197ebe207) ) + ROM_LOAD( "east-04.ic28", 0x000000, 0x100000, CRC(53237217) SHA1(fec044c26b8c99235f88c8be0d9ac63b81a3a094) ) + ROM_LOAD( "east-06.ic29", 0x100000, 0x100000, CRC(e6e6dfa7) SHA1(913fa9a21cea175a1af87023144ebc98b3b0f33b) ) + ROM_LOAD( "east-03.ic39", 0x200000, 0x100000, CRC(1b9b2846) SHA1(d9c87e130bc3baa949d8a8738daad648fcf284df) ) + ROM_LOAD( "east-05.ic40", 0x300000, 0x100000, CRC(e02472c5) SHA1(35572610f6823ec980a928a75abd689197ebe207) ) ROM_REGION( 0x80000, REGION_SOUND1, 0 ) - ROM_LOAD( "sd_m02.rom", 0x00000, 0x80000, CRC(e0de5c39) SHA1(75d0e193d882e67921c216c3293454e34304d25e) ) + ROM_LOAD( "east-02.ic3", 0x00000, 0x80000, CRC(e0de5c39) SHA1(75d0e193d882e67921c216c3293454e34304d25e) ) ROM_REGION( 0x80000, REGION_SOUND2, 0 ) - ROM_LOAD( "sd_m01.rom", 0x00000, 0x80000, CRC(b41fff1a) SHA1(54920d13fa2b3000eedab9d0050a299ae743c663) ) + ROM_LOAD( "east-01.ic1", 0x00000, 0x80000, CRC(b41fff1a) SHA1(54920d13fa2b3000eedab9d0050a299ae743c663) ) ROM_END ROM_START( selfeena ) @@ -3973,6 +3997,7 @@ GAME( 1990, hitice, 0, hitice, hitice, taito_b, ROT0, "Williams", GAME( 1991, selfeena, 0, selfeena, selfeena, taito_b, ROT0, "East Technology", "Sel Feena", GAME_SUPPORTS_SAVE ) GAME( 1992, silentd, 0, silentd, silentd, taito_b, ROT0, "Taito Corporation Japan", "Silent Dragon (World)", GAME_SUPPORTS_SAVE ) GAME( 1992, silentdj, silentd, silentd, silentdj, taito_b, ROT0, "Taito Corporation", "Silent Dragon (Japan)", GAME_SUPPORTS_SAVE ) +GAME( 1992, silentdu, silentd, silentd, silentdj, taito_b, ROT0, "Taito America Corporation", "Silent Dragon (US)", GAME_SUPPORTS_SAVE ) GAME( 1993, ryujin, 0, ryujin, ryujin, taito_b, ROT270, "Taito Corporation", "Ryu Jin (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1993, qzshowby, 0, qzshowby, qzshowby, taito_b, ROT0, "Taito Corporation", "Quiz Sekai wa SHOW by shobai (Japan)", GAME_SUPPORTS_SAVE ) GAME( 1994, pbobble, 0, pbobble, pbobble, taito_b, ROT0, "Taito Corporation", "Puzzle Bobble (Japan, B-System)", GAME_SUPPORTS_SAVE ) diff --git a/src/drivers/taito_l.c b/src/drivers/taito_l.c index 1618979a8..881d81a1c 100644 --- a/src/drivers/taito_l.c +++ b/src/drivers/taito_l.c @@ -119,10 +119,6 @@ static void palette_notifier(int addr) unsigned char byte0 = *p++; unsigned char byte1 = *p; - unsigned int b = (byte1 & 0xf) * 0x11; - unsigned int g = ((byte0 & 0xf0)>>4) * 0x11; - unsigned int r = (byte0 & 0xf) * 0x11; - // addr &= 0x1ff; if(addr > 0x200) @@ -132,7 +128,7 @@ logerror("Large palette ? %03x (%04x)\n", addr, activecpu_get_pc()); else { // r = g = b = ((addr & 0x1e) != 0)*255; - palette_set_color(addr/2, r, g, b); + palette_set_color(Machine, addr/2, pal4bit(byte0), pal4bit(byte0 >> 4), pal4bit(byte1)); } } diff --git a/src/drivers/taitoair.c b/src/drivers/taitoair.c index 3376bc945..bee941ed6 100644 --- a/src/drivers/taitoair.c +++ b/src/drivers/taitoair.c @@ -251,20 +251,11 @@ static WRITE16_HANDLER( dsp_HOLDA_signal_w ) static WRITE16_HANDLER( airsys_paletteram16_w ) /* xxBBBBxRRRRxGGGG */ { - int a,r,g,b; + int a; COMBINE_DATA(&paletteram16[offset]); a = paletteram16[offset]; - - r = (a >> 0) & 0x0f; - g = (a >> 5) & 0x0f; - b = (a >> 10) & 0x0f; - - r = (r << 4) | r; - g = (g << 4) | g; - b = (b << 4) | b; - - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,pal4bit(a >> 0),pal4bit(a >> 5),pal4bit(a >> 10)); } @@ -335,98 +326,59 @@ static MACHINE_START( taitoair ) MEMORY STRUCTURES ***********************************************************/ -static ADDRESS_MAP_START( airsys_readmem, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x0bffff) AM_READ(MRA16_ROM) - AM_RANGE(0x0c0000, 0x0cffff) AM_READ(MRA16_RAM) /* 68000 RAM */ - AM_RANGE(0x180000, 0x183fff) AM_READ(MRA16_RAM) /* "gradiation ram (0)" */ - AM_RANGE(0x184000, 0x187fff) AM_READ(MRA16_RAM) /* "gradiation ram (1)" */ - AM_RANGE(0x188000, 0x18bfff) AM_READ(paletteram16_word_r)/* "color ram" */ - AM_RANGE(0x800000, 0x820fff) AM_READ(TC0080VCO_word_r) /* tilemaps, sprites */ - AM_RANGE(0x908000, 0x90ffff) AM_READ(MRA16_RAM) /* "line ram" */ - AM_RANGE(0x910000, 0x91ffff) AM_READ(MRA16_RAM) /* "dsp common ram" (TMS320C25) */ +static ADDRESS_MAP_START( airsys_map, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x000000, 0x0bffff) AM_ROM + AM_RANGE(0x0c0000, 0x0cffff) AM_RAM AM_BASE(&taitoh_68000_mainram) + AM_RANGE(0x140000, 0x140001) AM_WRITE(system_control_w) /* Pause the TMS32025 */ + AM_RANGE(0x180000, 0x183fff) AM_RAM /* "gradiation ram (0)" */ + AM_RANGE(0x184000, 0x187fff) AM_RAM /* "gradiation ram (1)" */ + AM_RANGE(0x188000, 0x18bfff) AM_READWRITE(paletteram16_word_r, airsys_paletteram16_w) AM_BASE(&paletteram16) + AM_RANGE(0x800000, 0x820fff) AM_READWRITE(TC0080VCO_word_r, TC0080VCO_word_w) /* tilemaps, sprites */ + AM_RANGE(0x908000, 0x90ffff) AM_RAM AM_BASE(&taitoair_line_ram) /* "line ram" */ + AM_RANGE(0x910000, 0x91ffff) AM_RAM AM_BASE(&dsp_ram) /* "dsp common ram" (TMS320C25) */ AM_RANGE(0xa00000, 0xa00007) AM_READ(stick_input_r) AM_RANGE(0xa00100, 0xa00107) AM_READ(stick2_input_r) - AM_RANGE(0xa00200, 0xa0020f) AM_READ(TC0220IOC_halfword_r) /* other I/O */ - AM_RANGE(0xa80000, 0xa80001) AM_READ(MRA16_NOP) - AM_RANGE(0xa80002, 0xa80003) AM_READ(taitosound_comm16_lsb_r) - AM_RANGE(0xb00000, 0xb007ff) AM_READ(MRA16_RAM) /* "power common ram" (mecha drive) */ -ADDRESS_MAP_END - -static ADDRESS_MAP_START( airsys_writemem, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x000000, 0x0bffff) AM_WRITE(MWA16_ROM) - AM_RANGE(0x0c0000, 0x0cffff) AM_WRITE(MWA16_RAM) AM_BASE(&taitoh_68000_mainram) - AM_RANGE(0x140000, 0x140001) AM_WRITE(system_control_w) /* Pause the TMS32025 */ - AM_RANGE(0x180000, 0x183fff) AM_WRITE(MWA16_RAM) /* "gradiation ram (0)" */ - AM_RANGE(0x184000, 0x187fff) AM_WRITE(MWA16_RAM) /* "gradiation ram (1)" */ - AM_RANGE(0x188000, 0x18bfff) AM_WRITE(airsys_paletteram16_w) AM_BASE(&paletteram16) -// AM_RANGE(0x188000, 0x18bfff) AM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE(&paletteram16) - AM_RANGE(0x800000, 0x820fff) AM_WRITE(TC0080VCO_word_w) /* tilemaps, sprites */ - AM_RANGE(0x908000, 0x90ffff) AM_WRITE(MWA16_RAM) AM_BASE(&taitoair_line_ram) /* "line ram" */ - AM_RANGE(0x910000, 0x91ffff) AM_WRITE(MWA16_RAM) AM_BASE(&dsp_ram) /* "dsp common ram" (TMS320C25) */ - AM_RANGE(0xa00200, 0xa0020f) AM_WRITE(TC0220IOC_halfword_w) /* I/O */ - AM_RANGE(0xa80000, 0xa80001) AM_WRITE(taitosound_port16_lsb_w) - AM_RANGE(0xa80002, 0xa80003) AM_WRITE(taitosound_comm16_lsb_w) - AM_RANGE(0xb00000, 0xb007ff) AM_WRITE(MWA16_RAM) /* "power common ram" (mecha drive) */ + AM_RANGE(0xa00200, 0xa0020f) AM_READWRITE(TC0220IOC_halfword_r, TC0220IOC_halfword_w) /* other I/O */ + AM_RANGE(0xa80000, 0xa80001) AM_READWRITE(MRA16_NOP, taitosound_port16_lsb_w) + AM_RANGE(0xa80002, 0xa80003) AM_READWRITE(taitosound_comm16_lsb_r, taitosound_comm16_lsb_w) + AM_RANGE(0xb00000, 0xb007ff) AM_RAM /* "power common ram" (mecha drive) */ ADDRESS_MAP_END /************************** Z80 ****************************/ -static ADDRESS_MAP_START( sound_readmem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x3fff) AM_READ(MRA8_ROM) - AM_RANGE(0x4000, 0x7fff) AM_READ(MRA8_BANK1) - AM_RANGE(0xc000, 0xdfff) AM_READ(MRA8_RAM) - AM_RANGE(0xe000, 0xe000) AM_READ(YM2610_status_port_0_A_r) - AM_RANGE(0xe001, 0xe001) AM_READ(YM2610_read_port_0_r) - AM_RANGE(0xe002, 0xe002) AM_READ(YM2610_status_port_0_B_r) - AM_RANGE(0xe200, 0xe200) AM_READ(MRA8_NOP) - AM_RANGE(0xe201, 0xe201) AM_READ(taitosound_slave_comm_r) - AM_RANGE(0xea00, 0xea00) AM_READ(MRA8_NOP) -ADDRESS_MAP_END - -static ADDRESS_MAP_START( sound_writemem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM) - AM_RANGE(0xc000, 0xdfff) AM_WRITE(MWA8_RAM) - AM_RANGE(0xe000, 0xe000) AM_WRITE(YM2610_control_port_0_A_w) - AM_RANGE(0xe001, 0xe001) AM_WRITE(YM2610_data_port_0_A_w) - AM_RANGE(0xe002, 0xe002) AM_WRITE(YM2610_control_port_0_B_w) +static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x3fff) AM_ROM + AM_RANGE(0x4000, 0x7fff) AM_ROMBANK(1) + AM_RANGE(0xc000, 0xdfff) AM_RAM + AM_RANGE(0xe000, 0xe000) AM_READWRITE(YM2610_status_port_0_A_r, YM2610_control_port_0_A_w) + AM_RANGE(0xe001, 0xe001) AM_READWRITE(YM2610_read_port_0_r, YM2610_data_port_0_A_w) + AM_RANGE(0xe002, 0xe002) AM_READWRITE(YM2610_status_port_0_B_r, YM2610_control_port_0_B_w) AM_RANGE(0xe003, 0xe003) AM_WRITE(YM2610_data_port_0_B_w) - AM_RANGE(0xe200, 0xe200) AM_WRITE(taitosound_slave_port_w) - AM_RANGE(0xe201, 0xe201) AM_WRITE(taitosound_slave_comm_w) + AM_RANGE(0xe200, 0xe200) AM_READWRITE(MRA8_NOP, taitosound_slave_port_w) + AM_RANGE(0xe201, 0xe201) AM_READWRITE(taitosound_slave_comm_r, taitosound_slave_comm_w) AM_RANGE(0xe400, 0xe403) AM_WRITE(MWA8_NOP) /* pan control */ + AM_RANGE(0xea00, 0xea00) AM_READ(MRA8_NOP) AM_RANGE(0xee00, 0xee00) AM_WRITE(MWA8_NOP) /* ? */ AM_RANGE(0xf000, 0xf000) AM_WRITE(MWA8_NOP) /* ? */ AM_RANGE(0xf200, 0xf200) AM_WRITE(sound_bankswitch_w) ADDRESS_MAP_END /********************************** TMS32025 ********************************/ -static ADDRESS_MAP_START( DSP_read_program, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x0000, 0x1fff) AM_READ(MRA16_ROM) +static ADDRESS_MAP_START( DSP_map_program, ADDRESS_SPACE_PROGRAM, 16 ) + AM_RANGE(0x0000, 0x1fff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( DSP_write_program, ADDRESS_SPACE_PROGRAM, 16 ) - AM_RANGE(0x0000, 0x1fff) AM_WRITE(MWA16_ROM) +static ADDRESS_MAP_START( DSP_map_data, ADDRESS_SPACE_DATA, 16 ) + AM_RANGE(0x4000, 0x7fff) AM_READWRITE(lineram_r, lineram_w) + AM_RANGE(0x8000, 0xffff) AM_READWRITE(dspram_r, dspram_w) ADDRESS_MAP_END -static ADDRESS_MAP_START( DSP_read_data, ADDRESS_SPACE_DATA, 16 ) - AM_RANGE(0x4000, 0x7fff) AM_READ(lineram_r) - AM_RANGE(0x8000, 0xffff) AM_READ(dspram_r) -ADDRESS_MAP_END - -static ADDRESS_MAP_START( DSP_write_data, ADDRESS_SPACE_DATA, 16 ) - AM_RANGE(0x4000, 0x7fff) AM_WRITE(lineram_w) - AM_RANGE(0x8000, 0xffff) AM_WRITE(dspram_w) -ADDRESS_MAP_END - -static ADDRESS_MAP_START( DSP_read_io, ADDRESS_SPACE_IO, 16 ) +static ADDRESS_MAP_START( DSP_map_io, ADDRESS_SPACE_IO, 16 ) AM_RANGE(TMS32025_HOLD, TMS32025_HOLD) AM_READ(dsp_HOLD_signal_r) -ADDRESS_MAP_END - -static ADDRESS_MAP_START( DSP_write_io, ADDRESS_SPACE_IO, 16 ) AM_RANGE(TMS32025_HOLDA, TMS32025_HOLDA) AM_WRITE(dsp_HOLDA_signal_w) ADDRESS_MAP_END - /************************************************************ INPUT PORTS & DIPS ************************************************************/ @@ -649,16 +601,16 @@ static MACHINE_DRIVER_START( airsys ) /* basic machine hardware */ MDRV_CPU_ADD(M68000,24000000 / 2) /* 12 MHz ??? */ - MDRV_CPU_PROGRAM_MAP(airsys_readmem,airsys_writemem) + MDRV_CPU_PROGRAM_MAP(airsys_map, 0) MDRV_CPU_VBLANK_INT(irq5_line_hold,1) MDRV_CPU_ADD(Z80,8000000 / 2) /* 4 MHz ??? */ - MDRV_CPU_PROGRAM_MAP(sound_readmem,sound_writemem) + MDRV_CPU_PROGRAM_MAP(sound_map, 0) MDRV_CPU_ADD(TMS32025,24000000) /* 24 MHz ??? */// - MDRV_CPU_PROGRAM_MAP(DSP_read_program,DSP_write_program) - MDRV_CPU_DATA_MAP(DSP_read_data,DSP_write_data) - MDRV_CPU_IO_MAP(DSP_read_io,DSP_write_io) + MDRV_CPU_PROGRAM_MAP(DSP_map_program, 0) + MDRV_CPU_DATA_MAP(DSP_map_data, 0) + MDRV_CPU_IO_MAP(DSP_map_io, 0) MDRV_FRAMES_PER_SECOND(60) MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION) diff --git a/src/drivers/taitojc.c b/src/drivers/taitojc.c index eb60d0954..c84ef6a1f 100644 --- a/src/drivers/taitojc.c +++ b/src/drivers/taitojc.c @@ -596,7 +596,7 @@ static WRITE32_HANDLER( taitojc_palette_w ) g = (color >> 16) & 0xff; b = (color >> 0) & 0xff; - palette_set_color(offset, r, g, b); + palette_set_color(Machine,offset, r, g, b); } static READ32_HANDLER ( jc_control_r ) @@ -1172,28 +1172,28 @@ static DRIVER_INIT( dendeg ) //rom[(0x12bec2 / 2) ^ 1] = 0xffff; // enable debug mode - init_taitojc(); + init_taitojc(machine); } static DRIVER_INIT( dendegx ) { //UINT16 *rom = (UINT16*)memory_region(REGION_CPU1); - init_taitojc(); + init_taitojc(machine); } static DRIVER_INIT( dendeg2 ) { //UINT16 *rom = (UINT16*)memory_region(REGION_CPU1); - init_taitojc(); + init_taitojc(machine); } static DRIVER_INIT( dendeg2x ) { //UINT16 *rom = (UINT16*)memory_region(REGION_CPU1); - init_taitojc(); + init_taitojc(machine); } static DRIVER_INIT( sidebs ) @@ -1202,21 +1202,21 @@ static DRIVER_INIT( sidebs ) //rom[((0x100000 + 0x33c30) / 2) ^ 1] = 0xffff; // enable debug mode - init_taitojc(); + init_taitojc(machine); } static DRIVER_INIT( sidebs2 ) { //UINT16 *rom = (UINT16*)memory_region(REGION_CPU1); - init_taitojc(); + init_taitojc(machine); } static DRIVER_INIT( landgear ) { //UINT16 *rom = (UINT16*)memory_region(REGION_CPU1); - init_taitojc(); + init_taitojc(machine); } ROM_START( sidebs ) diff --git a/src/drivers/taitowlf.c b/src/drivers/taitowlf.c index 12fa5444a..6b3c6ea60 100644 --- a/src/drivers/taitowlf.c +++ b/src/drivers/taitowlf.c @@ -32,7 +32,7 @@ static VIDEO_START(taitowlf) int i; for (i=0; i < 16; i++) { - palette_set_color(i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]); + palette_set_color(machine, i, cga_palette[i][0], cga_palette[i][1], cga_palette[i][2]); } return 0; } diff --git a/src/drivers/talbot.c b/src/drivers/talbot.c index 8c43ce914..a743a0f58 100644 --- a/src/drivers/talbot.c +++ b/src/drivers/talbot.c @@ -225,7 +225,7 @@ PALETTE_INIT( talbot ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/drivers/tank8.c b/src/drivers/tank8.c index 998a0c9cc..eb7bda1d8 100644 --- a/src/drivers/tank8.c +++ b/src/drivers/tank8.c @@ -20,29 +20,29 @@ void tank8_collision_callback(int index) } -static void fill_palette(int team) +static void fill_palette(running_machine *machine, int team) { if (team) { - palette_set_color(0, 0xff, 0x00, 0x00); /* red */ - palette_set_color(2, 0xff, 0x00, 0x00); /* red */ - palette_set_color(4, 0xff, 0x00, 0x00); /* red */ - palette_set_color(6, 0xff, 0x00, 0x00); /* red */ - palette_set_color(1, 0x00, 0x00, 0xff); /* blue */ - palette_set_color(3, 0x00, 0x00, 0xff); /* blue */ - palette_set_color(5, 0x00, 0x00, 0xff); /* blue */ - palette_set_color(7, 0x00, 0x00, 0xff); /* blue */ + palette_set_color(machine,0, 0xff, 0x00, 0x00); /* red */ + palette_set_color(machine,2, 0xff, 0x00, 0x00); /* red */ + palette_set_color(machine,4, 0xff, 0x00, 0x00); /* red */ + palette_set_color(machine,6, 0xff, 0x00, 0x00); /* red */ + palette_set_color(machine,1, 0x00, 0x00, 0xff); /* blue */ + palette_set_color(machine,3, 0x00, 0x00, 0xff); /* blue */ + palette_set_color(machine,5, 0x00, 0x00, 0xff); /* blue */ + palette_set_color(machine,7, 0x00, 0x00, 0xff); /* blue */ } else { - palette_set_color(0, 0xff, 0x00, 0x00); /* red */ - palette_set_color(1, 0x00, 0x00, 0xff); /* blue */ - palette_set_color(2, 0xff, 0xff, 0x00); /* yellow */ - palette_set_color(3, 0x00, 0xff, 0x00); /* green */ - palette_set_color(4, 0xff, 0x00, 0xff); /* magenta */ - palette_set_color(5, 0xe0, 0xc0, 0x70); /* puce */ - palette_set_color(6, 0x00, 0xff, 0xff); /* cyan */ - palette_set_color(7, 0xff, 0xaa, 0xaa); /* pink */ + palette_set_color(machine,0, 0xff, 0x00, 0x00); /* red */ + palette_set_color(machine,1, 0x00, 0x00, 0xff); /* blue */ + palette_set_color(machine,2, 0xff, 0xff, 0x00); /* yellow */ + palette_set_color(machine,3, 0x00, 0xff, 0x00); /* green */ + palette_set_color(machine,4, 0xff, 0x00, 0xff); /* magenta */ + palette_set_color(machine,5, 0xe0, 0xc0, 0x70); /* puce */ + palette_set_color(machine,6, 0x00, 0xff, 0xff); /* cyan */ + palette_set_color(machine,7, 0xff, 0xaa, 0xaa); /* pink */ } } @@ -51,10 +51,10 @@ static PALETTE_INIT( tank8 ) { int i; - fill_palette(0); + fill_palette(machine,0); - palette_set_color(8, 0x00, 0x00, 0x00); - palette_set_color(9, 0xff, 0xff, 0xff); + palette_set_color(machine, 8, 0x00, 0x00, 0x00); + palette_set_color(machine, 9, 0xff, 0xff, 0xff); for (i = 0; i < 8; i++) { @@ -88,7 +88,7 @@ static WRITE8_HANDLER( tank8_lockout_w ) static WRITE8_HANDLER( tank8_team_w ) { - fill_palette(~data & 1); + fill_palette(Machine,~data & 1); } diff --git a/src/drivers/tankbatt.c b/src/drivers/tankbatt.c index 2cc4b2072..31b8ad472 100644 --- a/src/drivers/tankbatt.c +++ b/src/drivers/tankbatt.c @@ -317,17 +317,17 @@ MACHINE_DRIVER_END ROM_START( tankbatt ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "tb1-1.bin", 0x6000, 0x0800, CRC(278a0b8c) SHA1(11ea8fe8401b3cd986616a30a759c0ac1a5ce73b) ) - ROM_LOAD( "tb1-2.bin", 0x6800, 0x0800, CRC(e0923370) SHA1(8d3dbea877bed9f9c267d8002dc180f6eb1e5a8f) ) - ROM_LOAD( "tb1-3.bin", 0x7000, 0x0800, CRC(85005ea4) SHA1(91583081803a5ef600fb90bee34be9edd87f157e) ) - ROM_LOAD( "tb1-4.bin", 0x7800, 0x0800, CRC(3dfb5bcf) SHA1(aa24bf74f4d5dc81baf3843196c837e0b731077b) ) - ROM_RELOAD( 0xf800, 0x0800 ) /* for the reset and interrupt vectors */ + ROM_LOAD( "tb1-1.1a", 0x6000, 0x0800, CRC(278a0b8c) SHA1(11ea8fe8401b3cd986616a30a759c0ac1a5ce73b) ) + ROM_LOAD( "tb1-2.1b", 0x6800, 0x0800, CRC(e0923370) SHA1(8d3dbea877bed9f9c267d8002dc180f6eb1e5a8f) ) + ROM_LOAD( "tb1-3.1c", 0x7000, 0x0800, CRC(85005ea4) SHA1(91583081803a5ef600fb90bee34be9edd87f157e) ) + ROM_LOAD( "tb1-4.1d", 0x7800, 0x0800, CRC(3dfb5bcf) SHA1(aa24bf74f4d5dc81baf3843196c837e0b731077b) ) + ROM_RELOAD( 0xf800, 0x0800 ) /* for the reset and interrupt vectors */ ROM_REGION( 0x0800, REGION_GFX1, ROMREGION_DISPOSE ) - ROM_LOAD( "tb1-5.bin", 0x0000, 0x0800, CRC(aabd4fb1) SHA1(5cff659b531d0f1b6faa503f7c06045c3a209a84) ) + ROM_LOAD( "tb1-5.2k", 0x0000, 0x0800, CRC(aabd4fb1) SHA1(5cff659b531d0f1b6faa503f7c06045c3a209a84) ) ROM_REGION( 0x0100, REGION_PROMS, 0 ) - ROM_LOAD( "tankbatt.clr", 0x0000, 0x0100, CRC(1150d613) SHA1(33bb50c199198ba5a129b9e3cfd0f8afca4bf95f) ) + ROM_LOAD( "bct1-1.l3", 0x0000, 0x0100, CRC(d17518bc) SHA1(f3b0deffa586808bc59e9a24ec1699c54ebe84cc) ) /* prom is a Fujitsu MB7052 or equivalent */ ROM_END diff --git a/src/drivers/tankbust.c b/src/drivers/tankbust.c index 9c2c5d875..8bea70743 100644 --- a/src/drivers/tankbust.c +++ b/src/drivers/tankbust.c @@ -173,7 +173,7 @@ PALETTE_INIT( tankbust ) r = 0x55 * bit0 + 0xaa * bit1; #endif - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/drivers/tattack.c b/src/drivers/tattack.c index 0ef34a922..f7702a1d4 100644 --- a/src/drivers/tattack.c +++ b/src/drivers/tattack.c @@ -178,8 +178,8 @@ static PALETTE_INIT( tattack ) else r=g=b=128; - palette_set_color(2*i,0x00,0x00,0x00); - palette_set_color(2*i+1,r,g,b); + palette_set_color(machine,2*i,0x00,0x00,0x00); + palette_set_color(machine,2*i+1,r,g,b); } } diff --git a/src/drivers/tecmosys.c b/src/drivers/tecmosys.c index c43dd32ae..cfebc8e17 100644 --- a/src/drivers/tecmosys.c +++ b/src/drivers/tecmosys.c @@ -447,9 +447,9 @@ VIDEO_UPDATE(deroon) // bg color , to see text in deroon if(!gametype) - palette_set_color(0x800,0x80,0x80,0x80); + palette_set_color(machine,0x800,0x80,0x80,0x80); else - palette_set_color(0x800,0x0,0x0,0x0); + palette_set_color(machine,0x800,0x0,0x0,0x0); fillbitmap(bitmap,0x800,cliprect); diff --git a/src/drivers/tempest.c b/src/drivers/tempest.c index 1d87b4b1a..379287192 100644 --- a/src/drivers/tempest.c +++ b/src/drivers/tempest.c @@ -9,6 +9,9 @@ Known bugs: * none at this time + To do: + * correctly hook up player 2 controls in cocktail mode + **************************************************************************** TEMPEST @@ -184,7 +187,7 @@ is a 12% chance that a program bug may award 40 credits for one quarter. The ROM (#136002-217) in this package, replaces the ROM in -location J-1 on the main PCB and will correcct the problem. +location J-1 on the main PCB and will correct the problem. All cabaret and cocktail cabinets will have the correct ROM Installed. @@ -257,6 +260,23 @@ last game Level choices this game 74 through 81 1,3,5,7,9,11,13,15,17,20,22,24,26,28,31,33,36,40,44,47,49,52,56,60,63,65,73 82 through 99 1,3,5,7,9,11,13,15,17,20,22,24,26,28,31,33,36,40,44,47,49,52,56,60,63,65,73,81 +Rom revisions and bug fixes / effects: + +Revision 2 +136002-217.j1 Fixes the score cheat (see tech notes above) +136002-222.r1 In test mode, changes spinner letters to a line, described in Tempest manual C0-190-01 New Roms + +Revision 3 +136002-316.h1 Fixes screen collapse between players when using newer deflection board + +Note: Roms for Tempest Analog Vector-Generator PCB Assembly A037383-03 or A037383-04 are twice + the size as those for Tempest Analog Vector-Generator PCB Assembly A037383-01 or A037383-02 + +Known roms (listed in the manual) currently not dumped: + +Version 1 for Tempest Analog Vector-Generator PCB Assembly A037383-01 or A037383-02 + 136002-137.p1 + 136002-135.j1 ***************************************************************************/ @@ -267,8 +287,22 @@ last game Level choices this game #include "machine/atari_vg.h" #include "sound/pokey.h" +#define MASTER_CLOCK (12096000) +#define CLOCK_3KHZ (MASTER_CLOCK / 4096) +/************************************* + * + * Interrupt ack + * + *************************************/ + +static WRITE8_HANDLER( wdclr_w ) +{ + cpunum_set_input_line(0, 0, CLEAR_LINE); + watchdog_reset(); +} + /************************************* * * Input ports @@ -334,44 +368,32 @@ static WRITE8_HANDLER( tempest_coin_w ) * *************************************/ -static ADDRESS_MAP_START( readmem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x07ff) AM_READ(MRA8_RAM) +static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x07ff) AM_RAM + AM_RANGE(0x0800, 0x080f) AM_WRITE(MWA8_RAM) AM_BASE(&tempest_colorram) AM_RANGE(0x0c00, 0x0c00) AM_READ(tempest_IN0_r) /* IN0 */ AM_RANGE(0x0d00, 0x0d00) AM_READ(input_port_3_r) /* DSW1 */ AM_RANGE(0x0e00, 0x0e00) AM_READ(input_port_4_r) /* DSW2 */ - AM_RANGE(0x2000, 0x2fff) AM_READ(MRA8_RAM) + AM_RANGE(0x2000, 0x2fff) AM_RAM AM_BASE(&vectorram) AM_SIZE(&vectorram_size) AM_REGION(REGION_CPU1, 0x2000) AM_RANGE(0x3000, 0x3fff) AM_READ(MRA8_ROM) - AM_RANGE(0x6040, 0x6040) AM_READ(mb_status_r) - AM_RANGE(0x6050, 0x6050) AM_READ(atari_vg_earom_r) - AM_RANGE(0x6060, 0x6060) AM_READ(mb_lo_r) - AM_RANGE(0x6070, 0x6070) AM_READ(mb_hi_r) - AM_RANGE(0x60c0, 0x60cf) AM_READ(pokey1_r) - AM_RANGE(0x60d0, 0x60df) AM_READ(pokey2_r) - AM_RANGE(0x9000, 0xdfff) AM_READ(MRA8_ROM) - AM_RANGE(0xf000, 0xffff) AM_READ(MRA8_ROM) /* for the reset / interrupt vectors */ -ADDRESS_MAP_END - - -static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x07ff) AM_WRITE(MWA8_RAM) - AM_RANGE(0x0800, 0x080f) AM_WRITE(tempest_colorram_w) - AM_RANGE(0x2000, 0x2fff) AM_WRITE(MWA8_RAM) AM_BASE(&vectorram) AM_SIZE(&vectorram_size) AM_REGION(REGION_CPU1, 0x2000) - AM_RANGE(0x3000, 0x3fff) AM_WRITE(MWA8_ROM) AM_RANGE(0x4000, 0x4000) AM_WRITE(tempest_coin_w) AM_RANGE(0x4800, 0x4800) AM_WRITE(avgdvg_go_w) - AM_RANGE(0x5000, 0x5000) AM_WRITE(watchdog_reset_w) + AM_RANGE(0x5000, 0x5000) AM_WRITE(wdclr_w) AM_RANGE(0x5800, 0x5800) AM_WRITE(avgdvg_reset_w) AM_RANGE(0x6000, 0x603f) AM_WRITE(atari_vg_earom_w) - AM_RANGE(0x6040, 0x6040) AM_WRITE(atari_vg_earom_ctrl_w) + AM_RANGE(0x6040, 0x6040) AM_READWRITE(mb_status_r, atari_vg_earom_ctrl_w) + AM_RANGE(0x6050, 0x6050) AM_READ(atari_vg_earom_r) + AM_RANGE(0x6060, 0x6060) AM_READ(mb_lo_r) + AM_RANGE(0x6070, 0x6070) AM_READ(mb_hi_r) AM_RANGE(0x6080, 0x609f) AM_WRITE(mb_go_w) - AM_RANGE(0x60c0, 0x60cf) AM_WRITE(pokey1_w) - AM_RANGE(0x60d0, 0x60df) AM_WRITE(pokey2_w) + AM_RANGE(0x60c0, 0x60cf) AM_READWRITE(pokey1_r, pokey1_w) + AM_RANGE(0x60d0, 0x60df) AM_READWRITE(pokey2_r, pokey2_w) AM_RANGE(0x60e0, 0x60e0) AM_WRITE(tempest_led_w) - AM_RANGE(0x9000, 0xdfff) AM_WRITE(MWA8_ROM) + AM_RANGE(0x9000, 0xdfff) AM_ROM + AM_RANGE(0xf000, 0xffff) AM_ROM /* for the reset / interrupt vectors */ ADDRESS_MAP_END - /************************************* * * Port definitions @@ -503,10 +525,10 @@ static struct POKEYinterface pokey_interface_2 = static MACHINE_DRIVER_START( tempest ) /* basic machine hardware */ - MDRV_CPU_ADD(M6502, 12096000/8) /* 1.512 MHz */ - MDRV_CPU_PROGRAM_MAP(readmem,writemem) - MDRV_CPU_VBLANK_INT(irq0_line_hold,4) /* 4.1ms */ - + MDRV_CPU_ADD(M6502, MASTER_CLOCK / 8) + MDRV_CPU_PROGRAM_MAP(main_map, 0) + MDRV_CPU_PERIODIC_INT(irq0_line_assert, TIME_IN_HZ(CLOCK_3KHZ / 12)) + MDRV_WATCHDOG_TIME_INIT(TIME_IN_HZ(CLOCK_3KHZ / 256)) MDRV_FRAMES_PER_SECOND(60) MDRV_NVRAM_HANDLER(atari_vg) @@ -516,7 +538,6 @@ static MACHINE_DRIVER_START( tempest ) MDRV_VISIBLE_AREA(0, 580, 0, 570) MDRV_PALETTE_LENGTH(256) - MDRV_PALETTE_INIT(avg_multi) MDRV_VIDEO_START(avg_tempest) MDRV_VIDEO_UPDATE(vector) @@ -542,107 +563,116 @@ MACHINE_DRIVER_END ROM_START( tempest ) /* rev 3 */ ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "136002.113", 0x9000, 0x0800, CRC(65d61fe7) SHA1(38a1e8a8f65b7887cf3e190269fe4ce2c6f818aa) ) - ROM_LOAD( "136002.114", 0x9800, 0x0800, CRC(11077375) SHA1(ed8ff0ca969da6672a7683b93d4fcf2935a0d903) ) - ROM_LOAD( "136002.115", 0xa000, 0x0800, CRC(f3e2827a) SHA1(bd04fcfbbba995e08c3144c1474fcddaaeb1c700) ) - ROM_LOAD( "136002.316", 0xa800, 0x0800, CRC(aeb0f7e9) SHA1(a5cc25015b98692673cfc1c7c2e9634efd750870) ) - ROM_LOAD( "136002.217", 0xb000, 0x0800, CRC(ef2eb645) SHA1(b1a2c969e8897e335d5354de6ae04a65d4b2a1e4) ) - ROM_LOAD( "136002.118", 0xb800, 0x0800, CRC(beb352ab) SHA1(f213166d3970e0bd0f29d8dea8d6afa6990cce38) ) - ROM_LOAD( "136002.119", 0xc000, 0x0800, CRC(a4de050f) SHA1(ea302e43a313a5a18115e74ddbaaedde0fbecda7) ) - ROM_LOAD( "136002.120", 0xc800, 0x0800, CRC(35619648) SHA1(48f1e8bed7ec6afa0b4c549a30e5ec331c071e40) ) - ROM_LOAD( "136002.121", 0xd000, 0x0800, CRC(73d38e47) SHA1(9980606376a79ba94f8e2a325871a6c8d10d83fc) ) - ROM_LOAD( "136002.222", 0xd800, 0x0800, CRC(707bd5c3) SHA1(2f0af6fb7154c244c794f7247e5c16a1e06ddf7d) ) - ROM_RELOAD( 0xf800, 0x0800 ) /* for reset/interrupt vectors */ + /* Roms are for Tempest Analog Vector-Generator PCB Assembly A037383-01 or A037383-02 */ + ROM_LOAD( "136002-113.d1", 0x9000, 0x0800, CRC(65d61fe7) SHA1(38a1e8a8f65b7887cf3e190269fe4ce2c6f818aa) ) + ROM_LOAD( "136002-114.e1", 0x9800, 0x0800, CRC(11077375) SHA1(ed8ff0ca969da6672a7683b93d4fcf2935a0d903) ) + ROM_LOAD( "136002-115.f1", 0xa000, 0x0800, CRC(f3e2827a) SHA1(bd04fcfbbba995e08c3144c1474fcddaaeb1c700) ) + ROM_LOAD( "136002-316.h1", 0xa800, 0x0800, CRC(aeb0f7e9) SHA1(a5cc25015b98692673cfc1c7c2e9634efd750870) ) + ROM_LOAD( "136002-217.j1", 0xb000, 0x0800, CRC(ef2eb645) SHA1(b1a2c969e8897e335d5354de6ae04a65d4b2a1e4) ) + ROM_LOAD( "136002-118.k1", 0xb800, 0x0800, CRC(beb352ab) SHA1(f213166d3970e0bd0f29d8dea8d6afa6990cce38) ) + ROM_LOAD( "136002-119.lm1", 0xc000, 0x0800, CRC(a4de050f) SHA1(ea302e43a313a5a18115e74ddbaaedde0fbecda7) ) + ROM_LOAD( "136002-120.mn1", 0xc800, 0x0800, CRC(35619648) SHA1(48f1e8bed7ec6afa0b4c549a30e5ec331c071e40) ) + ROM_LOAD( "136002-121.p1", 0xd000, 0x0800, CRC(73d38e47) SHA1(9980606376a79ba94f8e2a325871a6c8d10d83fc) ) + ROM_LOAD( "136002-222.r1", 0xd800, 0x0800, CRC(707bd5c3) SHA1(2f0af6fb7154c244c794f7247e5c16a1e06ddf7d) ) + ROM_RELOAD( 0xf800, 0x0800 ) /* for reset/interrupt vectors */ /* Mathbox ROMs */ - ROM_LOAD( "136002.123", 0x3000, 0x0800, CRC(29f7e937) SHA1(686c8b9b8901262e743497cee7f2f7dd5cb3af7e) ) - ROM_LOAD( "136002.124", 0x3800, 0x0800, CRC(c16ec351) SHA1(a30a3662c740810c0f20e3712679606921b8ca06) ) + ROM_LOAD( "136002-123.np3", 0x3000, 0x0800, CRC(29f7e937) SHA1(686c8b9b8901262e743497cee7f2f7dd5cb3af7e) ) /* May be labeled "136002-111", same data */ + ROM_LOAD( "136002-124.r3", 0x3800, 0x0800, CRC(c16ec351) SHA1(a30a3662c740810c0f20e3712679606921b8ca06) ) /* May be labeled "136002-112", same data */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.d7", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END ROM_START( tempest1 ) /* rev 1 */ ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "136002.113", 0x9000, 0x0800, CRC(65d61fe7) SHA1(38a1e8a8f65b7887cf3e190269fe4ce2c6f818aa) ) - ROM_LOAD( "136002.114", 0x9800, 0x0800, CRC(11077375) SHA1(ed8ff0ca969da6672a7683b93d4fcf2935a0d903) ) - ROM_LOAD( "136002.115", 0xa000, 0x0800, CRC(f3e2827a) SHA1(bd04fcfbbba995e08c3144c1474fcddaaeb1c700) ) - ROM_LOAD( "136002.116", 0xa800, 0x0800, CRC(7356896c) SHA1(a013ede292189a8f5a907de882ee1a573d784b3c) ) - ROM_LOAD( "136002.117", 0xb000, 0x0800, CRC(55952119) SHA1(470d914fa52fce3786cb6330889876d3547dca65) ) - ROM_LOAD( "136002.118", 0xb800, 0x0800, CRC(beb352ab) SHA1(f213166d3970e0bd0f29d8dea8d6afa6990cce38) ) - ROM_LOAD( "136002.119", 0xc000, 0x0800, CRC(a4de050f) SHA1(ea302e43a313a5a18115e74ddbaaedde0fbecda7) ) - ROM_LOAD( "136002.120", 0xc800, 0x0800, CRC(35619648) SHA1(48f1e8bed7ec6afa0b4c549a30e5ec331c071e40) ) - ROM_LOAD( "136002.121", 0xd000, 0x0800, CRC(73d38e47) SHA1(9980606376a79ba94f8e2a325871a6c8d10d83fc) ) - ROM_LOAD( "136002.122", 0xd800, 0x0800, CRC(796a9918) SHA1(c862a0d4ea330161e4c3cc8e5e9ad38893fffbd4) ) - ROM_RELOAD( 0xf800, 0x0800 ) /* for reset/interrupt vectors */ + /* Roms are for Tempest Analog Vector-Generator PCB Assembly A037383-01 or A037383-02 */ + ROM_LOAD( "136002-113.d1", 0x9000, 0x0800, CRC(65d61fe7) SHA1(38a1e8a8f65b7887cf3e190269fe4ce2c6f818aa) ) + ROM_LOAD( "136002-114.e1", 0x9800, 0x0800, CRC(11077375) SHA1(ed8ff0ca969da6672a7683b93d4fcf2935a0d903) ) + ROM_LOAD( "136002-115.f1", 0xa000, 0x0800, CRC(f3e2827a) SHA1(bd04fcfbbba995e08c3144c1474fcddaaeb1c700) ) + ROM_LOAD( "136002-116.h1", 0xa800, 0x0800, CRC(7356896c) SHA1(a013ede292189a8f5a907de882ee1a573d784b3c) ) + ROM_LOAD( "136002-117.j1", 0xb000, 0x0800, CRC(55952119) SHA1(470d914fa52fce3786cb6330889876d3547dca65) ) + ROM_LOAD( "136002-118.k1", 0xb800, 0x0800, CRC(beb352ab) SHA1(f213166d3970e0bd0f29d8dea8d6afa6990cce38) ) + ROM_LOAD( "136002-119.lm1", 0xc000, 0x0800, CRC(a4de050f) SHA1(ea302e43a313a5a18115e74ddbaaedde0fbecda7) ) + ROM_LOAD( "136002-120.mn1", 0xc800, 0x0800, CRC(35619648) SHA1(48f1e8bed7ec6afa0b4c549a30e5ec331c071e40) ) + ROM_LOAD( "136002-121.p1", 0xd000, 0x0800, CRC(73d38e47) SHA1(9980606376a79ba94f8e2a325871a6c8d10d83fc) ) + ROM_LOAD( "136002-122.r1", 0xd800, 0x0800, CRC(796a9918) SHA1(c862a0d4ea330161e4c3cc8e5e9ad38893fffbd4) ) + ROM_RELOAD( 0xf800, 0x0800 ) /* for reset/interrupt vectors */ /* Mathbox ROMs */ - ROM_LOAD( "136002.123", 0x3000, 0x0800, CRC(29f7e937) SHA1(686c8b9b8901262e743497cee7f2f7dd5cb3af7e) ) - ROM_LOAD( "136002.124", 0x3800, 0x0800, CRC(c16ec351) SHA1(a30a3662c740810c0f20e3712679606921b8ca06) ) + ROM_LOAD( "136002-123.np3", 0x3000, 0x0800, CRC(29f7e937) SHA1(686c8b9b8901262e743497cee7f2f7dd5cb3af7e) ) /* May be labeled "136002-111", same data */ + ROM_LOAD( "136002-124.r3", 0x3800, 0x0800, CRC(c16ec351) SHA1(a30a3662c740810c0f20e3712679606921b8ca06) ) /* May be labeled "136002-112", same data */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.d7", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END ROM_START( tempest2 ) /* rev 2 */ ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "136002.113", 0x9000, 0x0800, CRC(65d61fe7) SHA1(38a1e8a8f65b7887cf3e190269fe4ce2c6f818aa) ) - ROM_LOAD( "136002.114", 0x9800, 0x0800, CRC(11077375) SHA1(ed8ff0ca969da6672a7683b93d4fcf2935a0d903) ) - ROM_LOAD( "136002.115", 0xa000, 0x0800, CRC(f3e2827a) SHA1(bd04fcfbbba995e08c3144c1474fcddaaeb1c700) ) - ROM_LOAD( "136002.116", 0xa800, 0x0800, CRC(7356896c) SHA1(a013ede292189a8f5a907de882ee1a573d784b3c) ) - ROM_LOAD( "136002.217", 0xb000, 0x0800, CRC(ef2eb645) SHA1(b1a2c969e8897e335d5354de6ae04a65d4b2a1e4) ) - ROM_LOAD( "136002.118", 0xb800, 0x0800, CRC(beb352ab) SHA1(f213166d3970e0bd0f29d8dea8d6afa6990cce38) ) - ROM_LOAD( "136002.119", 0xc000, 0x0800, CRC(a4de050f) SHA1(ea302e43a313a5a18115e74ddbaaedde0fbecda7) ) - ROM_LOAD( "136002.120", 0xc800, 0x0800, CRC(35619648) SHA1(48f1e8bed7ec6afa0b4c549a30e5ec331c071e40) ) - ROM_LOAD( "136002.121", 0xd000, 0x0800, CRC(73d38e47) SHA1(9980606376a79ba94f8e2a325871a6c8d10d83fc) ) - ROM_LOAD( "136002.222", 0xd800, 0x0800, CRC(707bd5c3) SHA1(2f0af6fb7154c244c794f7247e5c16a1e06ddf7d) ) - ROM_RELOAD( 0xf800, 0x0800 ) /* for reset/interrupt vectors */ + /* Roms are for Tempest Analog Vector-Generator PCB Assembly A037383-01 or A037383-02 */ + ROM_LOAD( "136002-113.d1", 0x9000, 0x0800, CRC(65d61fe7) SHA1(38a1e8a8f65b7887cf3e190269fe4ce2c6f818aa) ) + ROM_LOAD( "136002-114.e1", 0x9800, 0x0800, CRC(11077375) SHA1(ed8ff0ca969da6672a7683b93d4fcf2935a0d903) ) + ROM_LOAD( "136002-115.f1", 0xa000, 0x0800, CRC(f3e2827a) SHA1(bd04fcfbbba995e08c3144c1474fcddaaeb1c700) ) + ROM_LOAD( "136002-116.h1", 0xa800, 0x0800, CRC(7356896c) SHA1(a013ede292189a8f5a907de882ee1a573d784b3c) ) + ROM_LOAD( "136002-217.j1", 0xb000, 0x0800, CRC(ef2eb645) SHA1(b1a2c969e8897e335d5354de6ae04a65d4b2a1e4) ) + ROM_LOAD( "136002-118.k1", 0xb800, 0x0800, CRC(beb352ab) SHA1(f213166d3970e0bd0f29d8dea8d6afa6990cce38) ) + ROM_LOAD( "136002-119.lm1", 0xc000, 0x0800, CRC(a4de050f) SHA1(ea302e43a313a5a18115e74ddbaaedde0fbecda7) ) + ROM_LOAD( "136002-120.mn1", 0xc800, 0x0800, CRC(35619648) SHA1(48f1e8bed7ec6afa0b4c549a30e5ec331c071e40) ) + ROM_LOAD( "136002-121.p1", 0xd000, 0x0800, CRC(73d38e47) SHA1(9980606376a79ba94f8e2a325871a6c8d10d83fc) ) + ROM_LOAD( "136002-222.r1", 0xd800, 0x0800, CRC(707bd5c3) SHA1(2f0af6fb7154c244c794f7247e5c16a1e06ddf7d) ) + ROM_RELOAD( 0xf800, 0x0800 ) /* for reset/interrupt vectors */ /* Mathbox ROMs */ - ROM_LOAD( "136002.123", 0x3000, 0x0800, CRC(29f7e937) SHA1(686c8b9b8901262e743497cee7f2f7dd5cb3af7e) ) - ROM_LOAD( "136002.124", 0x3800, 0x0800, CRC(c16ec351) SHA1(a30a3662c740810c0f20e3712679606921b8ca06) ) + ROM_LOAD( "136002-123.np3", 0x3000, 0x0800, CRC(29f7e937) SHA1(686c8b9b8901262e743497cee7f2f7dd5cb3af7e) ) /* May be labeled "136002-111", same data */ + ROM_LOAD( "136002-124.r3", 0x3800, 0x0800, CRC(c16ec351) SHA1(a30a3662c740810c0f20e3712679606921b8ca06) ) /* May be labeled "136002-112", same data */ + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.d7", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END -ROM_START( tempest3 ) /* rev ? */ +ROM_START( tempest3 ) /* rev 2 */ ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "237.002", 0x9000, 0x1000, CRC(1d0cc503) SHA1(7bef95db9b1102d6b1166bda0ccb276ef4cc3764) ) - ROM_LOAD( "136.002", 0xa000, 0x1000, CRC(c88e3524) SHA1(89144baf1efc703b2336774793ce345b37829ee7) ) - ROM_LOAD( "235.002", 0xb000, 0x1000, CRC(a4b2ce3f) SHA1(a5f5fb630a48c5d25346f90d4c13aaa98f60b228) ) - ROM_LOAD( "134.002", 0xc000, 0x1000, CRC(65a9a9f9) SHA1(73aa7d6f4e7093ccb2d97f6344f354872bcfd72a) ) - ROM_LOAD( "133.002", 0xd000, 0x1000, CRC(de4e9e34) SHA1(04be074e45bf5cd95a852af97cd04e35b7f27fc4) ) - ROM_RELOAD( 0xf000, 0x1000 ) /* for reset/interrupt vectors */ + /* Roms are for Tempest Analog Vector-Generator PCB Assembly A037383-03 or A037383-04 */ + ROM_LOAD( "136002-237.p1", 0x9000, 0x1000, CRC(1d0cc503) SHA1(7bef95db9b1102d6b1166bda0ccb276ef4cc3764) ) + ROM_LOAD( "136002-136.lm1", 0xa000, 0x1000, CRC(c88e3524) SHA1(89144baf1efc703b2336774793ce345b37829ee7) ) + ROM_LOAD( "136002-235.j1", 0xb000, 0x1000, CRC(a4b2ce3f) SHA1(a5f5fb630a48c5d25346f90d4c13aaa98f60b228) ) + ROM_LOAD( "136002-134.f1", 0xc000, 0x1000, CRC(65a9a9f9) SHA1(73aa7d6f4e7093ccb2d97f6344f354872bcfd72a) ) + ROM_LOAD( "136002-133.d1", 0xd000, 0x1000, CRC(de4e9e34) SHA1(04be074e45bf5cd95a852af97cd04e35b7f27fc4) ) + ROM_RELOAD( 0xf000, 0x1000 ) /* for reset/interrupt vectors */ /* Mathbox ROMs */ - ROM_LOAD( "138.002", 0x3000, 0x1000, CRC(9995256d) SHA1(2b725ee1a57d423c7d7377a1744f48412e0f2f69) ) + ROM_LOAD( "136002-138.np3", 0x3000, 0x1000, CRC(9995256d) SHA1(2b725ee1a57d423c7d7377a1744f48412e0f2f69) ) + + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.d7", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END ROM_START( temptube ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "136002.113", 0x9000, 0x0800, CRC(65d61fe7) SHA1(38a1e8a8f65b7887cf3e190269fe4ce2c6f818aa) ) - ROM_LOAD( "136002.114", 0x9800, 0x0800, CRC(11077375) SHA1(ed8ff0ca969da6672a7683b93d4fcf2935a0d903) ) - ROM_LOAD( "136002.115", 0xa000, 0x0800, CRC(f3e2827a) SHA1(bd04fcfbbba995e08c3144c1474fcddaaeb1c700) ) - ROM_LOAD( "136002.316", 0xa800, 0x0800, CRC(aeb0f7e9) SHA1(a5cc25015b98692673cfc1c7c2e9634efd750870) ) - ROM_LOAD( "136002.217", 0xb000, 0x0800, CRC(ef2eb645) SHA1(b1a2c969e8897e335d5354de6ae04a65d4b2a1e4) ) - ROM_LOAD( "tube.118", 0xb800, 0x0800, CRC(cefb03f0) SHA1(41ddfa4991fa49a31d4740a04551556acca66196) ) - ROM_LOAD( "136002.119", 0xc000, 0x0800, CRC(a4de050f) SHA1(ea302e43a313a5a18115e74ddbaaedde0fbecda7) ) - ROM_LOAD( "136002.120", 0xc800, 0x0800, CRC(35619648) SHA1(48f1e8bed7ec6afa0b4c549a30e5ec331c071e40) ) - ROM_LOAD( "136002.121", 0xd000, 0x0800, CRC(73d38e47) SHA1(9980606376a79ba94f8e2a325871a6c8d10d83fc) ) - ROM_LOAD( "136002.222", 0xd800, 0x0800, CRC(707bd5c3) SHA1(2f0af6fb7154c244c794f7247e5c16a1e06ddf7d) ) - ROM_RELOAD( 0xf800, 0x0800 ) /* for reset/interrupt vectors */ + /* Roms are for Tempest Analog Vector-Generator PCB Assembly A037383-01 or A037383-02 */ + ROM_LOAD( "136002-113.d1", 0x9000, 0x0800, CRC(65d61fe7) SHA1(38a1e8a8f65b7887cf3e190269fe4ce2c6f818aa) ) + ROM_LOAD( "136002-114.e1", 0x9800, 0x0800, CRC(11077375) SHA1(ed8ff0ca969da6672a7683b93d4fcf2935a0d903) ) + ROM_LOAD( "136002-115.f1", 0xa000, 0x0800, CRC(f3e2827a) SHA1(bd04fcfbbba995e08c3144c1474fcddaaeb1c700) ) + ROM_LOAD( "136002-316.h1", 0xa800, 0x0800, CRC(aeb0f7e9) SHA1(a5cc25015b98692673cfc1c7c2e9634efd750870) ) + ROM_LOAD( "136002-217.j1", 0xb000, 0x0800, CRC(ef2eb645) SHA1(b1a2c969e8897e335d5354de6ae04a65d4b2a1e4) ) + ROM_LOAD( "tube-118.k1", 0xb800, 0x0800, CRC(cefb03f0) SHA1(41ddfa4991fa49a31d4740a04551556acca66196) ) + ROM_LOAD( "136002-119.lm1", 0xc000, 0x0800, CRC(a4de050f) SHA1(ea302e43a313a5a18115e74ddbaaedde0fbecda7) ) + ROM_LOAD( "136002-120.mn1", 0xc800, 0x0800, CRC(35619648) SHA1(48f1e8bed7ec6afa0b4c549a30e5ec331c071e40) ) + ROM_LOAD( "136002-121.p1", 0xd000, 0x0800, CRC(73d38e47) SHA1(9980606376a79ba94f8e2a325871a6c8d10d83fc) ) + ROM_LOAD( "136002-222.r1", 0xd800, 0x0800, CRC(707bd5c3) SHA1(2f0af6fb7154c244c794f7247e5c16a1e06ddf7d) ) + ROM_RELOAD( 0xf800, 0x0800 ) /* for reset/interrupt vectors */ /* Mathbox ROMs */ - ROM_LOAD( "136002.123", 0x3000, 0x0800, CRC(29f7e937) SHA1(686c8b9b8901262e743497cee7f2f7dd5cb3af7e) ) - ROM_LOAD( "136002.124", 0x3800, 0x0800, CRC(c16ec351) SHA1(a30a3662c740810c0f20e3712679606921b8ca06) ) -ROM_END + ROM_LOAD( "136002-123.np3", 0x3000, 0x0800, CRC(29f7e937) SHA1(686c8b9b8901262e743497cee7f2f7dd5cb3af7e) ) /* May be labeled "136002-111", same data */ + ROM_LOAD( "136002-124.r3", 0x3800, 0x0800, CRC(c16ec351) SHA1(a30a3662c740810c0f20e3712679606921b8ca06) ) /* May be labeled "136002-112", same data */ - -#if 0 /* identical to rom_tempest, only different rom sizes */ -ROM_START( tempest3 ) - ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "tempest.x", 0x9000, 0x1000, NO_DUMP ) - ROM_LOAD( "tempest.1", 0xa000, 0x1000, NO_DUMP ) - ROM_LOAD( "tempest.3", 0xb000, 0x1000, NO_DUMP ) - ROM_LOAD( "tempest.5", 0xc000, 0x1000, NO_DUMP ) - ROM_LOAD( "tempest.7", 0xd000, 0x1000, NO_DUMP ) - ROM_RELOAD( 0xf000, 0x1000 ) /* for reset/interrupt vectors */ - /* Mathbox ROMs */ - ROM_LOAD( "tempest.np3", 0x3000, 0x1000, NO_DUMP ) + /* AVG PROM */ + ROM_REGION( 0x100, REGION_PROMS, 0 ) + ROM_LOAD( "136002-125.d7", 0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) ) ROM_END -#endif - /************************************* @@ -654,5 +684,5 @@ ROM_END GAME( 1980, tempest, 0, tempest, tempest, 0, ROT270, "Atari", "Tempest (rev 3)", 0 ) GAME( 1980, tempest1, tempest, tempest, tempest, 0, ROT270, "Atari", "Tempest (rev 1)", 0 ) GAME( 1980, tempest2, tempest, tempest, tempest, 0, ROT270, "Atari", "Tempest (rev 2)", 0 ) -GAME( 1980, tempest3, tempest, tempest, tempest, 0, ROT270, "Atari", "Tempest (rev ?)", 0 ) -GAME( 1980, temptube, tempest, tempest, tempest, 0, ROT270, "hack", "Tempest Tubes", 0 ) +GAME( 1980, tempest3, tempest, tempest, tempest, 0, ROT270, "Atari", "Tempest (rev 2, Revised Hardware)", 0 ) +GAME( 1980, temptube, tempest, tempest, tempest, 0, ROT270, "hack", "Tempest Tubes", 0 ) diff --git a/src/drivers/tetrisp2.c b/src/drivers/tetrisp2.c index af7710920..8b314577a 100644 --- a/src/drivers/tetrisp2.c +++ b/src/drivers/tetrisp2.c @@ -1040,25 +1040,25 @@ DRIVER_INIT( rockn_timer ) DRIVER_INIT( rockn ) { - init_rockn_timer(); + init_rockn_timer(machine); rockn_protectdata = 1; } DRIVER_INIT( rockn1 ) { - init_rockn_timer(); + init_rockn_timer(machine); rockn_protectdata = 1; } DRIVER_INIT( rockn2 ) { - init_rockn_timer(); + init_rockn_timer(machine); rockn_protectdata = 2; } DRIVER_INIT( rocknms ) { - init_rockn_timer(); + init_rockn_timer(machine); timer_pulse(TIME_IN_MSEC(32), 0, rockn_timer_sub_level1_callback); rockn_timer_sub_l4 = timer_alloc(rockn_timer_sub_level4_callback); @@ -1069,7 +1069,7 @@ DRIVER_INIT( rocknms ) DRIVER_INIT( rockn3 ) { - init_rockn_timer(); + init_rockn_timer(machine); rockn_protectdata = 4; } diff --git a/src/drivers/tiamc1.c b/src/drivers/tiamc1.c index ce1387862..20f93d747 100644 --- a/src/drivers/tiamc1.c +++ b/src/drivers/tiamc1.c @@ -8,26 +8,39 @@ Games supported: * Konek-Gorbunok + Other games known to exist on this hardware (interchangeable by the ROM swap): + * Avtogonki + * Billiard + * Istrebitel' + * Kot-Rybolov + * Kotigoroshko + * Ostrov Drakona + * Ostrov Sokrovisch + * Perehvatchik + * Snezhnaja Koroleva + * Zvezdnyj Rycar' + *************************************************************** - To enter test mode hold F2 on emulator startup - Also use F2 to skip screens during the gameplay (factory-made cheat) + During bootup hold F2 to enter test mode. + Also use F2 to switch the screens during the gameplay (feature of the original + machine) *************************************************************** - This is one of last Soviet-made arcades. Several games are known on this - platform. It was created by government company Terminal (Vinnitsa, Ukraine), - which later was turned into EXTREMA-Ukraine company which manufactures - fruit mashines these days (http://www.extrema-ua.com). + This is one of the last USSR-made arcades. Several games are known to exist on + this hardware. It was created by the state company Terminal (Vinnitsa, Ukraine), + which was later turned into EXTREMA-Ukraine company. These days it manufactures + various gambling machines (http://www.extrema-ua.com). *************************************************************** TIA-MC1 arcade internals - This arcade consists of four boards: + This arcade machine contains four PCBs: BEIA-100 - Main CPU board. Also contains address PROM, color DAC and input ports + Main CPU board. Also contains address PROM, color DAC, input ports and sound BEIA-101 Video board 1. Background generator, video tiles RAM and video sync schematics @@ -36,15 +49,74 @@ Video board 2. Sprite generator, video buffer RAM (hardware triple buffering) BEIA-103 - ROM banks, RAM. Contains ROMs and multiplexors. Interchangeable between games + ROM banks, RAM. Contains ROMs and multiplexors + + + BEIA-103 PCB Layout + + |----------------------------------| + | | + |--| g1.d17 RU8A | + | | | + | | | + | | g2.d17 RU8A IR13 a2.b07 | + | | | + | | | + | | g3.d17 RU8A IR13 a3.g07 |--| + | | | | + |--| | | + | g4.d17 RU8A kp11 | | + | | | + | | | + | g5.d17 IR13 a5.l07 | | + |--| | | + | | id7 | | + | | g6.d17 IR13 a6.r07 |--| + | | id7 | + | | | + | | g7.d17 | + | | ll1 | + | | | + |--| ap6 le1 | + | | + |----------------------------------| + + Notes: + + g1.d17 \ + g2.d17 | + g3.d17 | + g4.d17 | + g5.d17 | + g6.d17 +- EPROM K573RF4A (2764 analog) + g7.d17 | + a2.b07 | + a3.g07 | + a5.l07 | + a6.r07 / + + RU8A - KR537RU8A SRAM 2k x8 (TC5516 analog) + IR13 - K155IR13 register (74198 analog) + kp11 - K555KP11 selector/multiplexor (74LS257 analog) + id7 - K555ID7 (74LS138 analog) + ap6 - K555AP6 (74LS245 analog) + ll1 - K555LL1 (74LS32 analog) + le1 - K555LE1 (74LS02 analog) + + *************************************************************** - TODO - o Sound + TODO: + - Use machine/pit8253.c in sound + - Check sprites priorities on the real hardware + - Check background scrolling on the real hardware + - What charset control is used for? */ #include "driver.h" +#include "sound/custom.h" +/* routines defined in vidhrdw */ extern PALETTE_INIT( tiamc1 ); extern VIDEO_START( tiamc1 ); extern VIDEO_UPDATE( tiamc1 ); @@ -56,26 +128,51 @@ extern WRITE8_HANDLER( tiamc1_sprite_x_w ); extern WRITE8_HANDLER( tiamc1_sprite_y_w ); extern WRITE8_HANDLER( tiamc1_sprite_a_w ); extern WRITE8_HANDLER( tiamc1_sprite_n_w ); +extern WRITE8_HANDLER( tiamc1_bg_vshift_w ); +extern WRITE8_HANDLER( tiamc1_bg_hshift_w ); extern UINT8 *tiamc1_charram, *tiamc1_tileram; extern UINT8 *tiamc1_spriteram_x, *tiamc1_spriteram_y, *tiamc1_spriteram_n, *tiamc1_spriteram_a; +/* routines defined in sndhrdw */ +extern void *tiamc1_sh_start(int clock, const struct CustomSound_interface *config); +extern WRITE8_HANDLER( tiamc1_timer0_w ); +extern WRITE8_HANDLER( tiamc1_timer1_w ); +extern WRITE8_HANDLER( tiamc1_timer1_gate_w ); + +UINT8 *video_ram; + +DRIVER_INIT( tiamc1 ) +{ + video_ram = auto_malloc(0x3040); +} + MACHINE_RESET( tiamc1 ) { - UINT8 *RAM = memory_region(REGION_CPU1) + 0x10000; + video_ram = auto_malloc(0x3040); + memset(video_ram, 0, 0x3040); - tiamc1_charram = RAM + 0x0800; // Ram is banked - tiamc1_tileram = RAM + 0x0000; + tiamc1_charram = video_ram + 0x0800; /* Ram is banked */ + tiamc1_tileram = video_ram + 0x0000; - tiamc1_spriteram_y = RAM + 0x3000; - tiamc1_spriteram_x = RAM + 0x3010; - tiamc1_spriteram_n = RAM + 0x3020; - tiamc1_spriteram_a = RAM + 0x3030; + tiamc1_spriteram_y = video_ram + 0x3000; + tiamc1_spriteram_x = video_ram + 0x3010; + tiamc1_spriteram_n = video_ram + 0x3020; + tiamc1_spriteram_a = video_ram + 0x3030; tiamc1_bankswitch_w(0, 0); + + state_save_register_global_pointer(video_ram, 0x3040); } +WRITE8_HANDLER( tiamc1_control_w ) +{ + coin_lockout_w(0, ~data & 0x02); + coin_counter_w(0, data & 0x04); +} + + static ADDRESS_MAP_START( tiamc1_readmem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0xdfff) AM_READ(MRA8_ROM) AM_RANGE(0xe000, 0xffff) AM_READ(MRA8_RAM) @@ -93,11 +190,16 @@ static ADDRESS_MAP_START( tiamc1_writeport, ADDRESS_SPACE_IO, 8 ) AM_RANGE(0x50, 0x5f) AM_WRITE(tiamc1_sprite_x_w) /* sprites X */ AM_RANGE(0x60, 0x6f) AM_WRITE(tiamc1_sprite_n_w) /* sprites # */ AM_RANGE(0x70, 0x7f) AM_WRITE(tiamc1_sprite_a_w) /* sprites attributes */ - AM_RANGE(0xa0, 0xaf) AM_WRITE(tiamc1_palette_w) /* color ram */ - AM_RANGE(0xbc, 0xbc) AM_WRITENOP /* background H scroll */ - AM_RANGE(0xbd, 0xbd) AM_WRITENOP /* background V scroll */ + AM_RANGE(0xa0, 0xaf) AM_WRITE(tiamc1_palette_w) /* color ram */ + AM_RANGE(0xbc, 0xbc) AM_WRITE(tiamc1_bg_hshift_w)/* background H scroll */ + AM_RANGE(0xbd, 0xbd) AM_WRITE(tiamc1_bg_vshift_w)/* background V scroll */ AM_RANGE(0xbe, 0xbe) AM_WRITE(tiamc1_bankswitch_w) /* VRAM selector */ - AM_RANGE(0xbf, 0xbf) AM_WRITENOP /* charset control */ + AM_RANGE(0xbf, 0xbf) AM_WRITENOP /* charset control */ + AM_RANGE(0xc0, 0xc3) AM_WRITE(tiamc1_timer0_w) /* timer 0 */ + AM_RANGE(0xd2, 0xd2) AM_WRITE(tiamc1_control_w) /* coin counter and lockout */ + AM_RANGE(0xd3, 0xd3) AM_WRITENOP /* 8255 ctrl. Used for i/o ports */ + AM_RANGE(0xd4, 0xd7) AM_WRITE(tiamc1_timer1_w) /* timer 1 */ + AM_RANGE(0xda, 0xda) AM_WRITE(tiamc1_timer1_gate_w) /* timer 1 gate control */ ADDRESS_MAP_END static ADDRESS_MAP_START( tiamc1_readport, ADDRESS_SPACE_IO, 8 ) @@ -105,43 +207,37 @@ static ADDRESS_MAP_START( tiamc1_readport, ADDRESS_SPACE_IO, 8 ) AM_RANGE(0xd0, 0xd0) AM_READ(input_port_0_r) AM_RANGE(0xd1, 0xd1) AM_READ(input_port_1_r) AM_RANGE(0xd2, 0xd2) AM_READ(input_port_2_r) - AM_RANGE(0xb3, 0xb3) AM_READNOP /* i/o port 8355 */ - AM_RANGE(0xb4, 0xb6) AM_READNOP /* timer 1 */ - AM_RANGE(0xb7, 0xb7) AM_READNOP /* timer 1 control word */ - AM_RANGE(0xbb, 0xbb) AM_READNOP /* sound */ - AM_RANGE(0xc0, 0xc2) AM_READNOP /* timer 2 */ - AM_RANGE(0xc3, 0xc3) AM_READNOP /* timer 2 control word */ ADDRESS_MAP_END INPUT_PORTS_START( tiamc1 ) PORT_START_TAG("IN0") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) /* Player 0 JOYSTICK_RIGHT */ + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) /* Player 2 JOYSTICK_RIGHT */ + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) /* Player 3 JOYSTICK_RIGHT */ + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) /* Player 0 JOYSTICK_LEFT */ + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) /* Player 2 JOYSTICK_LEFT */ + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) /* Player 3 JOYSTICK_LEFT */ PORT_START_TAG("IN1") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) /* Player 0 JOYSTICK_UP */ + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) /* Player 2 JOYSTICK_UP */ + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) /* Player 3 JOYSTICK_UP */ + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) /* Player 0 JOYSTICK_DOWN */ + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) /* Player 2 JOYSTICK_DOWN */ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_START_TAG("IN2") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SPECIAL ) /* OUT:coin lockout */ + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SPECIAL ) /* OUT:game counter */ + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* RAZR ??? */ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 ) - PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Player 1 Kick") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Player 1 Jump") PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_VBLANK ) INPUT_PORTS_END @@ -169,20 +265,25 @@ static const gfx_layout char_layout = static const gfx_decode gfxdecodeinfo[] = { - { REGION_CPU1, 0x10800, &char_layout, 0, 16 }, + { 0, 0x0000, &char_layout, 0, 16 }, { REGION_GFX1, 0x0000, &sprites16x16_layout, 0, 16 }, { -1 } }; +static struct CustomSound_interface tiamc1_custom_interface = +{ + tiamc1_sh_start +}; + static MACHINE_DRIVER_START( tiamc1 ) /* basic machine hardware */ - MDRV_CPU_ADD(8080,15750000/9) /* 1.575 MHz */ + MDRV_CPU_ADD(8080,16000000/9) /* 16 MHz */ MDRV_CPU_PROGRAM_MAP(tiamc1_readmem,tiamc1_writemem) MDRV_CPU_IO_MAP(tiamc1_readport,tiamc1_writeport) - MDRV_FRAMES_PER_SECOND(60) - MDRV_VBLANK_DURATION(128) // (??) + MDRV_FRAMES_PER_SECOND(50) + MDRV_VBLANK_DURATION(1600) MDRV_CPU_VBLANK_INT(irq1_line_hold,1) MDRV_MACHINE_RESET(tiamc1) @@ -198,20 +299,25 @@ static MACHINE_DRIVER_START( tiamc1 ) MDRV_PALETTE_INIT(tiamc1) MDRV_VIDEO_START(tiamc1) MDRV_VIDEO_UPDATE(tiamc1) + + /* sound hardware */ + MDRV_SPEAKER_STANDARD_MONO("mono") + + MDRV_SOUND_ADD_TAG("2 x 8253", CUSTOM, 16000000/9) + MDRV_SOUND_CONFIG(tiamc1_custom_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MACHINE_DRIVER_END ROM_START( konek ) - ROM_REGION( 0x13040, REGION_CPU1, 0 ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) ROM_LOAD( "g1.d17", 0x00000, 0x2000, CRC(f41d82c9) SHA1(63ac1be2ad58af0e5ef2d33e5c8d790769d80af9) ) ROM_LOAD( "g2.d17", 0x02000, 0x2000, CRC(b44e7491) SHA1(ff4cb1d76a36f504d670a207ee25556c5faad435) ) ROM_LOAD( "g3.d17", 0x04000, 0x2000, CRC(91301282) SHA1(cb448a1bb7a9c1768f870a8c062e37807431c9c7) ) ROM_LOAD( "g4.d17", 0x06000, 0x2000, CRC(3ff0c20b) SHA1(3d999c05b3986149e569630779ed5581fc202842) ) ROM_LOAD( "g5.d17", 0x08000, 0x2000, CRC(e3196d30) SHA1(a03d9f75926be9fcf5ee05df8b00fbf87361ea5b) ) - ROM_FILL( 0xa000, 0x2000, 0x00 ) + ROM_FILL( 0xa000, 0x2000, 0x00 ) /* g6.d17 is unpopulated */ ROM_LOAD( "g7.d17", 0x0c000, 0x2000, CRC(fe4e9fdd) SHA1(2033585a6c53455d1dafee85cbb807d424ed231d) ) - ROM_FILL( 0x10000, 0x2800, 0x00 ) // Banked tilemap and charmap - ROM_FILL( 0x13000, 0x0040, 0x00 ) // Sprites data ROM_REGION( 0x8000, REGION_GFX1, 0 ) ROM_LOAD( "a2.b07", 0x00000, 0x2000, CRC(9eed06ee) SHA1(1b64a3f8fe3df4b4870315dbdf69bf60b1c272d0) ) @@ -219,6 +325,13 @@ ROM_START( konek ) ROM_LOAD( "a5.l07", 0x04000, 0x2000, CRC(fff9e089) SHA1(f0d64dceaf72da785d55316bf8a7433faa09fabb) ) ROM_LOAD( "a6.r07", 0x06000, 0x2000, CRC(092e8ee2) SHA1(6c4842e992c592b9f0663e039668f61a7b56700f) ) + ROM_REGION( 0x0400, REGION_PROMS, 0 ) + ROM_LOAD( "prom100.e10", 0x0000, 0x100, NO_DUMP ) /* i/o ports map 256x8 */ + ROM_LOAD( "prom101.a01", 0x0100, 0x100, NO_DUMP ) /* video sync 256x8 */ + ROM_LOAD( "prom102.b03", 0x0200, 0x080, NO_DUMP ) /* sprites rom index 256x4 */ + ROM_LOAD( "prom102.b06", 0x0280, 0x080, NO_DUMP ) /* buffer optimization logic 256x4 */ + ROM_LOAD( "prom102.b05", 0x0300, 0x100, NO_DUMP ) /* sprites rom index 256x8 */ + ROM_END -GAME( 1988, konek, 0, tiamc1, tiamc1, 0, ROT0, "Terminal", "Konek-Gorbunok", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND ) +GAME( 1988, konek, 0, tiamc1, tiamc1, 0, ROT0, "Terminal", "Konek-Gorbunok", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE ) diff --git a/src/drivers/tmnt.c b/src/drivers/tmnt.c index 094f06bcd..149d7e6e4 100644 --- a/src/drivers/tmnt.c +++ b/src/drivers/tmnt.c @@ -3481,18 +3481,18 @@ ROM_START( blswhstl ) ROM_LOAD16_BYTE( "060_l10.g11", 0x040001, 0x20000, CRC(f738ad4a) SHA1(5aea4afa4bf935d3e92856eff745f61ed4d98165) ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */ - ROM_LOAD( "060j01.rom", 0x0000, 0x10000, CRC(f9d9a673) SHA1(8e5631c20dc37913cc7fa84f7ef786ff1ef85f09) ) + ROM_LOAD( "060j01.f3", 0x0000, 0x10000, CRC(f9d9a673) SHA1(8e5631c20dc37913cc7fa84f7ef786ff1ef85f09) ) ROM_REGION( 0x100000, REGION_GFX1, 0 ) /* graphics (addressable by the main CPU) */ - ROM_LOAD16_WORD_SWAP( "060e07", 0x000000, 0x080000, CRC(c400edf3) SHA1(3f507df8804c1774e2e213f5eb8be0aa7e818d65) ) /* tiles */ - ROM_LOAD16_WORD_SWAP( "060e08", 0x080000, 0x080000, CRC(70dddba1) SHA1(2acb94f249cf89b3d53798a6ee1c960f84a04d2e) ) + ROM_LOAD16_WORD_SWAP( "060e07.k16", 0x000000, 0x080000, CRC(c400edf3) SHA1(3f507df8804c1774e2e213f5eb8be0aa7e818d65) ) /* tiles */ + ROM_LOAD16_WORD_SWAP( "060e08.k12", 0x080000, 0x080000, CRC(70dddba1) SHA1(2acb94f249cf89b3d53798a6ee1c960f84a04d2e) ) ROM_REGION( 0x100000, REGION_GFX2, 0 ) /* graphics (addressable by the main CPU) */ - ROM_LOAD16_WORD_SWAP( "060e06", 0x000000, 0x080000, CRC(09381492) SHA1(5a3008dec99a8e0043405e9c4f5145794b8606e0) ) /* sprites */ - ROM_LOAD16_WORD_SWAP( "060e05", 0x080000, 0x080000, CRC(32454241) SHA1(7a246b255ff30118c4f8e07e6ba03a22fd5ddc8a) ) + ROM_LOAD16_WORD_SWAP( "060e06.k7", 0x000000, 0x080000, CRC(09381492) SHA1(5a3008dec99a8e0043405e9c4f5145794b8606e0) ) /* sprites */ + ROM_LOAD16_WORD_SWAP( "060e05.k3", 0x080000, 0x080000, CRC(32454241) SHA1(7a246b255ff30118c4f8e07e6ba03a22fd5ddc8a) ) ROM_REGION( 0x100000, REGION_SOUND1, 0 ) /* samples for the 053260 */ - ROM_LOAD( "060e04", 0x0000, 0x100000, CRC(c680395d) SHA1(acde593a5ec501e89c8aaca6c4fbacf707a727e1) ) + ROM_LOAD( "060e04.d1", 0x0000, 0x100000, CRC(c680395d) SHA1(acde593a5ec501e89c8aaca6c4fbacf707a727e1) ) ROM_END ROM_START( detatwin ) @@ -3503,18 +3503,18 @@ ROM_START( detatwin ) ROM_LOAD16_BYTE( "060_j10.g11", 0x040001, 0x20000, CRC(36eefdbc) SHA1(a3ec5078779b4ab33edf32e04db3e221e52b36c7) ) ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */ - ROM_LOAD( "060j01.rom", 0x0000, 0x10000, CRC(f9d9a673) SHA1(8e5631c20dc37913cc7fa84f7ef786ff1ef85f09) ) + ROM_LOAD( "060j01.f3", 0x0000, 0x10000, CRC(f9d9a673) SHA1(8e5631c20dc37913cc7fa84f7ef786ff1ef85f09) ) ROM_REGION( 0x100000, REGION_GFX1, 0 ) /* graphics (addressable by the main CPU) */ - ROM_LOAD16_WORD_SWAP( "060e07", 0x000000, 0x080000, CRC(c400edf3) SHA1(3f507df8804c1774e2e213f5eb8be0aa7e818d65) ) /* tiles */ - ROM_LOAD16_WORD_SWAP( "060e08", 0x080000, 0x080000, CRC(70dddba1) SHA1(2acb94f249cf89b3d53798a6ee1c960f84a04d2e) ) + ROM_LOAD16_WORD_SWAP( "060e07.k16", 0x000000, 0x080000, CRC(c400edf3) SHA1(3f507df8804c1774e2e213f5eb8be0aa7e818d65) ) /* tiles */ + ROM_LOAD16_WORD_SWAP( "060e08.k12", 0x080000, 0x080000, CRC(70dddba1) SHA1(2acb94f249cf89b3d53798a6ee1c960f84a04d2e) ) ROM_REGION( 0x100000, REGION_GFX2, 0 ) /* graphics (addressable by the main CPU) */ - ROM_LOAD16_WORD_SWAP( "060e06", 0x000000, 0x080000, CRC(09381492) SHA1(5a3008dec99a8e0043405e9c4f5145794b8606e0) ) /* sprites */ - ROM_LOAD16_WORD_SWAP( "060e05", 0x080000, 0x080000, CRC(32454241) SHA1(7a246b255ff30118c4f8e07e6ba03a22fd5ddc8a) ) + ROM_LOAD16_WORD_SWAP( "060e06.k7", 0x000000, 0x080000, CRC(09381492) SHA1(5a3008dec99a8e0043405e9c4f5145794b8606e0) ) /* sprites */ + ROM_LOAD16_WORD_SWAP( "060e05.k3", 0x080000, 0x080000, CRC(32454241) SHA1(7a246b255ff30118c4f8e07e6ba03a22fd5ddc8a) ) ROM_REGION( 0x100000, REGION_SOUND1, 0 ) /* samples for the 053260 */ - ROM_LOAD( "060e04", 0x0000, 0x100000, CRC(c680395d) SHA1(acde593a5ec501e89c8aaca6c4fbacf707a727e1) ) + ROM_LOAD( "060e04.d1", 0x0000, 0x100000, CRC(c680395d) SHA1(acde593a5ec501e89c8aaca6c4fbacf707a727e1) ) ROM_END ROM_START( glfgreat ) @@ -4056,7 +4056,7 @@ static DRIVER_INIT( mia ) unsigned char *temp; - init_gfx(); + init_gfx(machine); /* along with the normal byte reordering, TMNT also needs the bits to @@ -4152,7 +4152,7 @@ static DRIVER_INIT( tmnt ) unsigned char *temp; - init_gfx(); + init_gfx(machine); /* along with the normal byte reordering, TMNT also needs the bits to diff --git a/src/drivers/toaplan2.c b/src/drivers/toaplan2.c index 9c14ce328..efaf206e6 100644 --- a/src/drivers/toaplan2.c +++ b/src/drivers/toaplan2.c @@ -392,7 +392,7 @@ static MACHINE_RESET( ghox ) old_p1_paddle_h = 0; old_p2_paddle_h = 0; - machine_reset_toaplan2(); + machine_reset_toaplan2(machine); } static MACHINE_RESET( dogyuun ) @@ -409,7 +409,7 @@ static MACHINE_RESET( batrider ) { current_bank = 2; - machine_reset_toaplan2(); + machine_reset_toaplan2(machine); } static DRIVER_INIT( T2_Z80 ) /* init_t2_Z80(); */ diff --git a/src/drivers/trackfld.c b/src/drivers/trackfld.c index 2173496db..e550fd645 100644 --- a/src/drivers/trackfld.c +++ b/src/drivers/trackfld.c @@ -210,6 +210,53 @@ static ADDRESS_MAP_START( writemem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x6000, 0xffff) AM_WRITE(MWA8_ROM) ADDRESS_MAP_END +static ADDRESS_MAP_START( reaktor_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_READ(MRA8_ROM) + /* all usual addresses +0x8000 */ + AM_RANGE(0x9200, 0x9200) AM_READ(input_port_4_r) /* DIP 2 */ + AM_RANGE(0x9280, 0x9280) AM_READ(input_port_0_r) /* IO Coin */ + AM_RANGE(0x9281, 0x9281) AM_READ(input_port_1_r) /* P1 IO */ + AM_RANGE(0x9282, 0x9282) AM_READ(input_port_2_r) /* P2 IO */ + AM_RANGE(0x9283, 0x9283) AM_READ(input_port_3_r) /* DIP 1 */ + AM_RANGE(0x9800, 0x9fff) AM_READ(MRA8_RAM) + AM_RANGE(0xa800, 0xbfff) AM_READ(MRA8_RAM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( reaktor_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x7fff) AM_WRITE(MWA8_ROM) + /* all usual addresses +0x8000 */ + AM_RANGE(0x9000, 0x9000) AM_WRITE(watchdog_reset_w) + 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(0x9100, 0x9100) AM_WRITE(soundlatch_w) + AM_RANGE(0x9800, 0x983f) AM_WRITE(MWA8_RAM) AM_BASE(&spriteram_2) + AM_RANGE(0x9840, 0x985f) AM_WRITE(MWA8_RAM) AM_BASE(&trackfld_scroll) + AM_RANGE(0x9860, 0x9bff) AM_WRITE(MWA8_RAM) + AM_RANGE(0x9c00, 0x9c3f) AM_WRITE(MWA8_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) + AM_RANGE(0x9c40, 0x9c5f) AM_WRITE(MWA8_RAM) AM_BASE(&trackfld_scroll2) + AM_RANGE(0x9c60, 0x9fff) AM_WRITE(MWA8_RAM) + AM_RANGE(0xa800, 0xabff) AM_WRITE(MWA8_RAM) + AM_RANGE(0xac00, 0xafff) AM_WRITE(MWA8_RAM) AM_BASE(&nvram) AM_SIZE(&nvram_size) + AM_RANGE(0xb000, 0xb7ff) AM_WRITE(trackfld_videoram_w) AM_BASE(&videoram) + AM_RANGE(0xb800, 0xbfff) AM_WRITE(trackfld_colorram_w) AM_BASE(&colorram) +ADDRESS_MAP_END + +/* Reaktor reads / writes some I/O ports, no idea what they're connected to, if anything */ +static ADDRESS_MAP_START( reaktor_readport, ADDRESS_SPACE_IO, 8 ) + ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) + AM_RANGE(0x01, 0x01) AM_READ(MRA8_NOP) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( reaktor_writeport, ADDRESS_SPACE_IO, 8 ) + ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) + AM_RANGE(0x00, 0x00) AM_WRITE(MWA8_NOP) + AM_RANGE(0x01, 0x01) AM_WRITE(MWA8_NOP) + AM_RANGE(0x02, 0x02) AM_WRITE(MWA8_NOP) + AM_RANGE(0x03, 0x03) AM_WRITE(MWA8_NOP) +ADDRESS_MAP_END + static ADDRESS_MAP_START( mastkin_readmem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x1200, 0x1200) AM_READ(input_port_4_r) /* DIP 2 */ AM_RANGE(0x1280, 0x1280) AM_READ(input_port_0_r) /* IO Coin */ @@ -274,6 +321,8 @@ static ADDRESS_MAP_START( sound_readmem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x4000, 0x43ff) AM_READ(MRA8_RAM) AM_RANGE(0x6000, 0x6000) AM_READ(soundlatch_r) AM_RANGE(0x8000, 0x8000) AM_READ(trackfld_sh_timer_r) + AM_RANGE(0xc000, 0xc000) AM_READ(MRA8_NOP) // reaktor reads here + AM_RANGE(0xe001, 0xe001) AM_READ(MRA8_NOP) // reaktor reads here AM_RANGE(0xe002, 0xe002) AM_READ(trackfld_speech_r) ADDRESS_MAP_END @@ -681,7 +730,89 @@ INPUT_PORTS_START( wizzquiz ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END +INPUT_PORTS_START( reaktor ) + PORT_START_TAG("IN0") + 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_START1 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 ) + 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_TAG("IN1") + /* controls seem to be shared by both players */ + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused + PORT_START_TAG("IN2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // probably unused + + PORT_START_TAG("DSW0") + PORT_DIPNAME( 0x01, 0x01, "Pricing" ) + PORT_DIPSETTING( 0x01, "10p / 25c per play" ) + PORT_DIPSETTING( 0x00, "20p / 50c per play" ) + 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, "Coinage Type" ) + PORT_DIPSETTING( 0x10, "English (10p / 20p)" ) + PORT_DIPSETTING( 0x00, "American (25c / 50c)" ) + PORT_DIPNAME( 0x60, 0x20, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x60, "2" ) + PORT_DIPSETTING( 0x40, "3" ) + PORT_DIPSETTING( 0x20, "4" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x80, "20000" ) + PORT_DIPSETTING( 0x00, "30000" ) + + PORT_START_TAG("DSW1") + PORT_DIPNAME( 0x01, 0x01, "Game Orientation" ) + PORT_DIPSETTING( 0x01, "For Vertical Monitor" ) + PORT_DIPSETTING( 0x00, "For Horizontal Monitor" ) + 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( Free_Play ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x00, "Wipe Highscores" ) // it doesn't have NVRAM does it? + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, 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 = { @@ -838,6 +969,17 @@ static MACHINE_DRIVER_START( wizzquiz ) MDRV_NVRAM_HANDLER(generic_0fill) MACHINE_DRIVER_END +static MACHINE_DRIVER_START( reaktor ) + + /* basic machine hardware */ + MDRV_IMPORT_FROM(trackfld) + MDRV_CPU_REPLACE("main",Z80,18432000/6) + MDRV_CPU_PROGRAM_MAP(reaktor_readmem,reaktor_writemem) + MDRV_CPU_IO_MAP(reaktor_readport,reaktor_writeport) + MDRV_CPU_VBLANK_INT(irq0_line_hold,1) +MACHINE_DRIVER_END + + /*************************************************************************** Game driver(s) @@ -1116,6 +1258,45 @@ ROM_START( wizzquza ) /* not used */ ROM_END +ROM_START( reaktor ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code + 64k for decrypted opcodes */ + ROM_LOAD( "prog3.bin", 0x0000, 0x8000, CRC(8ba956fa) SHA1(8085b85da1b81f5d9e0da80fcfec44d70f59c208) ) + + /* most of these were 27128 roms, but they have identical halves, 2764 chips could have been used + instead, and one was actually used for rom 12c. I'm not cutting the others because this is the + form in which they were found */ + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for the audio CPU */ + ROM_LOAD( "2c.bin", 0x0000, 0x2000, CRC(105a8beb) SHA1(4bd9a0076fece8dc9a830e76a60fbcefe08940f7) ) + ROM_CONTINUE(0x0000,0x2000) + + ROM_REGION( 0x6000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "16h.bin", 0x0000, 0x2000, CRC(cb062c3b) SHA1(4a1c1a662dec26cb49310de596e1e1416d101d5d) ) + ROM_CONTINUE(0x0000,0x2000) + ROM_LOAD( "15h.bin", 0x2000, 0x2000, CRC(df83e659) SHA1(435523f3747c5aaf0a2d3a826766cb9b9ebb821e) ) + ROM_CONTINUE(0x2000,0x2000) + ROM_LOAD( "14h.bin", 0x4000, 0x2000, CRC(5ca53215) SHA1(650338a95465b61d9388bede716053523855eeee) ) + ROM_CONTINUE(0x4000,0x2000) + + ROM_REGION( 0x8000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "11c.bin", 0x0000, 0x2000, CRC(d24553fa) SHA1(ad4f2dd6c7236f33841bc59ce150a212fbe871cd) ) + ROM_CONTINUE(0x0000,0x2000) + ROM_LOAD( "14c.bin", 0x4000, 0x2000, CRC(4d0ab831) SHA1(2009b263fff3fd512a055fef23e667e76af1c584) ) + ROM_CONTINUE(0x4000,0x2000) + ROM_LOAD( "12c.bin", 0x2000, 0x2000, CRC(d0d39e66) SHA1(769fb526f6cd4b016fcfe9d08710fdb456cb4e47) ) + + ROM_LOAD( "15c.bin", 0x6000, 0x2000, CRC(bf1e608d) SHA1(ad5f16c091439358bbece9bc50e5979d44e85980) ) + ROM_CONTINUE(0x6000,0x2000) + + /* Proms, and speech rom (unused?) are unchanged from the original */ + ROM_REGION( 0x0220, REGION_PROMS, 0 ) + ROM_LOAD( "361b16.f1", 0x0000, 0x0020, CRC(d55f30b5) SHA1(4d6a851f4886778307f75771645078b97ad55f5f) ) /* palette */ + ROM_LOAD( "361b17.b16", 0x0020, 0x0100, CRC(d2ba4d32) SHA1(894b5cedf01ba9225a0d6215291857e455b84903) ) /* sprite lookup table */ + ROM_LOAD( "361b18.e15", 0x0120, 0x0100, CRC(053e5861) SHA1(6740a62cf7b6938a4f936a2fed429704612060a5) ) /* char lookup table */ + + ROM_REGION( 0x10000, REGION_SOUND1, 0 ) /* 64k for speech rom */ + ROM_LOAD( "c9_d15.bin", 0x0000, 0x2000, CRC(f546a56b) SHA1(caee3d8546eb7a75ce2a578c6a1a630246aec6b8) ) +ROM_END static DRIVER_INIT( trackfld ) { @@ -1196,3 +1377,4 @@ GAME( 1996, atlantol, trackfld, hyprolyb, atlantol, atlantol, ROT0, "bootleg", " GAME( 1988, mastkin, 0, mastkin, mastkin, mastkin, ROT0, "Du Tech", "The Masters of Kin", GAME_WRONG_COLORS ) GAME( 1985, wizzquiz, 0, wizzquiz, wizzquiz, wizzquiz, ROT0, "Konami", "Wizz Quiz (Konami version)", 0 ) GAME( 1985, wizzquza, wizzquiz, wizzquiz, wizzquiz, wizzquiz, ROT0, "Zilec - Zenitone", "Wizz Quiz (version 4)", 0 ) +GAME( 1987, reaktor, 0, reaktor, reaktor, 0, ROT90, "Zilec", "Reaktor (Track & Field Conversion)", 0 ) diff --git a/src/drivers/triplhnt.c b/src/drivers/triplhnt.c index 0989daaf9..6eea3df12 100644 --- a/src/drivers/triplhnt.c +++ b/src/drivers/triplhnt.c @@ -296,14 +296,14 @@ static const gfx_decode triplhnt_gfx_decode_info[] = static PALETTE_INIT( triplhnt ) { - palette_set_color(0, 0xAF, 0xAF, 0xAF); /* sprites */ - palette_set_color(1, 0x00, 0x00, 0x00); - palette_set_color(2, 0xFF, 0xFF, 0xFF); - palette_set_color(3, 0x50, 0x50, 0x50); - palette_set_color(4, 0x00, 0x00, 0x00); /* tiles */ - palette_set_color(5, 0x3F, 0x3F, 0x3F); - palette_set_color(6, 0x00, 0x00, 0x00); - palette_set_color(7, 0x3F, 0x3F, 0x3F); + palette_set_color(machine, 0, 0xAF, 0xAF, 0xAF); /* sprites */ + palette_set_color(machine, 1, 0x00, 0x00, 0x00); + palette_set_color(machine, 2, 0xFF, 0xFF, 0xFF); + palette_set_color(machine, 3, 0x50, 0x50, 0x50); + palette_set_color(machine, 4, 0x00, 0x00, 0x00); /* tiles */ + palette_set_color(machine, 5, 0x3F, 0x3F, 0x3F); + palette_set_color(machine, 6, 0x00, 0x00, 0x00); + palette_set_color(machine, 7, 0x3F, 0x3F, 0x3F); } diff --git a/src/drivers/trvmadns.c b/src/drivers/trvmadns.c index 1b2171e40..0462a985c 100644 --- a/src/drivers/trvmadns.c +++ b/src/drivers/trvmadns.c @@ -163,7 +163,7 @@ static WRITE8_HANDLER( trvmadns_palette_w ) g = (paletteram[offset | 1] & 0xf0) >> 4; b = paletteram[offset | 1] & 0xf; - palette_set_color(offset >> 1, r | (r << 4), g | (g << 4), b | (b << 4)); + palette_set_color(Machine, offset >> 1, pal4bit(r), pal4bit(g), pal4bit(b)); } static WRITE8_HANDLER( w2 ) diff --git a/src/drivers/trvquest.c b/src/drivers/trvquest.c index 55fe9279b..1a75d0e7b 100644 --- a/src/drivers/trvquest.c +++ b/src/drivers/trvquest.c @@ -253,14 +253,14 @@ static struct via6522_interface via_2_interface = static PALETTE_INIT( trvquest ) { - palette_set_color(0,0x00,0x00,0x00); /* 0 BLACK */ - palette_set_color(1,0xff,0x00,0x00); /* 1 RED */ - palette_set_color(2,0x00,0xff,0x00); /* 2 GREEN */ - palette_set_color(3,0xff,0xff,0x00); /* 3 YELLOW */ - palette_set_color(4,0x00,0x00,0xff); /* 4 BLUE */ - palette_set_color(5,0xff,0x00,0xff); /* 5 MAGENTA */ - palette_set_color(6,0x00,0xff,0xff); /* 6 CYAN */ - palette_set_color(7,0xff,0xff,0xff); /* 7 WHITE */ + palette_set_color(machine,0,0x00,0x00,0x00); /* 0 BLACK */ + palette_set_color(machine,1,0xff,0x00,0x00); /* 1 RED */ + palette_set_color(machine,2,0x00,0xff,0x00); /* 2 GREEN */ + palette_set_color(machine,3,0xff,0xff,0x00); /* 3 YELLOW */ + palette_set_color(machine,4,0x00,0x00,0xff); /* 4 BLUE */ + palette_set_color(machine,5,0xff,0x00,0xff); /* 5 MAGENTA */ + palette_set_color(machine,6,0x00,0xff,0xff); /* 6 CYAN */ + palette_set_color(machine,7,0xff,0xff,0xff); /* 7 WHITE */ } static MACHINE_RESET( trvquest ) diff --git a/src/drivers/ttchamp.c b/src/drivers/ttchamp.c index 1a0792260..abdbb9e7a 100644 --- a/src/drivers/ttchamp.c +++ b/src/drivers/ttchamp.c @@ -56,7 +56,7 @@ VIDEO_UPDATE(ttchamp) // int i; static int xxx=320,yyy=204; - fillbitmap(bitmap, get_black_pen(), 0); + fillbitmap(bitmap, get_black_pen(machine), 0); // for (i=0;i<256;i++) // { @@ -66,7 +66,7 @@ VIDEO_UPDATE(ttchamp) // b = (dat>>10)&0x1f; // g = (dat>>5)&0x1f; // r = (dat>>0)&0x1f; -// palette_set_color(i,r*8,g*8,b*8); +// palette_set_color(machine,i,pal5bit(r),pal5bit(g),pal5bit(b)); // } count=0; @@ -117,7 +117,6 @@ static WRITE8_HANDLER( paldat_h_w ) { int paldat; int paloff; - int r,g,b; paldat_h = data; @@ -125,11 +124,7 @@ static WRITE8_HANDLER( paldat_h_w ) paloff = (paloff_h <<8)|paloff_l; paloff &=0x7fff; - b = (paldat>>10)&0x1f; - g = (paldat>>5)&0x1f; - r = (paldat>>0)&0x1f; - - palette_set_color(paloff,r*8,g*8,b*8); + palette_set_color(Machine,paloff,pal5bit(paldat>>0),pal5bit(paldat>>5),pal5bit(paldat>>10)); } static READ8_HANDLER( peno_rand ) diff --git a/src/drivers/tugboat.c b/src/drivers/tugboat.c index 405f6b840..62099ff1e 100644 --- a/src/drivers/tugboat.c +++ b/src/drivers/tugboat.c @@ -50,7 +50,7 @@ PALETTE_INIT( tugboat ) g = brt * ((color_prom[i] >> 1) & 0x01); b = brt * ((color_prom[i] >> 2) & 0x01); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/drivers/tumbleb.c b/src/drivers/tumbleb.c index c0d130fcc..154185f27 100644 --- a/src/drivers/tumbleb.c +++ b/src/drivers/tumbleb.c @@ -619,7 +619,7 @@ ADDRESS_MAP_END READ16_HANDLER( semibase_unknown_r ) { - return mame_rand(); + return mame_rand(Machine); } static ADDRESS_MAP_START( htchctch_readmem, ADDRESS_SPACE_PROGRAM, 16 ) AM_RANGE(0x000000, 0x07ffff) AM_READ(MRA16_ROM) @@ -3186,7 +3186,7 @@ DRIVER_INIT( suprtrio ) DRIVER_INIT( chokchok ) { - init_htchctch(); + init_htchctch(machine); /* different palette format, closer to tumblep -- is this controlled by a register? the palette was right with the hatch catch trojan */ memory_install_write16_handler(0, ADDRESS_SPACE_PROGRAM, 0x140000, 0x140fff, 0, 0, paletteram16_xxxxBBBBGGGGRRRR_word_w); diff --git a/src/drivers/turbo.c b/src/drivers/turbo.c index 55a767f6f..28943226c 100644 --- a/src/drivers/turbo.c +++ b/src/drivers/turbo.c @@ -156,6 +156,503 @@ +/************************************* + * + * Constants + * + *************************************/ + +#define TURBO_MASTER_CLOCK (20000000) +#define SUBROC_MASTER_CLOCK (19968000) + +#define TURBO_PIXEL_CLOCK (TURBO_MASTER_CLOCK/4*TURBO_X_SCALE) +#define SUBROC_PIXEL_CLOCK (SUBROC_MASTER_CLOCK/4*TURBO_X_SCALE) + +#define HTOTAL (320*TURBO_X_SCALE) +#define HBEND (0) +#define HBSTART (256*TURBO_X_SCALE) + +#define VTOTAL (264) +#define VBEND (0) +#define VBSTART (224) + + + +static READ8_HANDLER( turbo_analog_r ); + + + +/************************************* + * + * Machine init + * + *************************************/ + +static MACHINE_RESET( buckrog ) +{ + turbo_state *state = Machine->driver_data; + state->buckrog_command = 0x00; +} + + + +/************************************* + * + * Turbo 8255 PPI handling + * + *************************************/ + +/* + chip index: + 0 = IC75 - CPU Board, Sheet 6, D7 + 1 = IC32 - CPU Board, Sheet 6, D6 + 2 = IC123 - CPU Board, Sheet 6, D4 + 3 = IC6 - CPU Board, Sheet 5, D7 +*/ + +static WRITE8_HANDLER( turbo_ppi0a_w ) +{ + /* bit0-7 = 0PA0-7 */ + turbo_state *state = Machine->driver_data; + state->turbo_opa = data; +} + + +static WRITE8_HANDLER( turbo_ppi0b_w ) +{ + /* bit0-7 = 0PB0-7 */ + turbo_state *state = Machine->driver_data; + state->turbo_opb = data; +} + + +static WRITE8_HANDLER( turbo_ppi0c_w ) +{ + /* bit0-7 = 0PC0-7 */ + turbo_state *state = Machine->driver_data; + state->turbo_opc = data; +} + + +static WRITE8_HANDLER( turbo_ppi1a_w ) +{ + /* bit0-7 = 1PA0-7 */ + turbo_state *state = Machine->driver_data; + state->turbo_ipa = data; +} + + +static WRITE8_HANDLER( turbo_ppi1b_w ) +{ + /* bit0-7 = 1PB0-7 */ + turbo_state *state = Machine->driver_data; + state->turbo_ipb = data; +} + + +static WRITE8_HANDLER( turbo_ppi1c_w ) +{ + /* bit0-7 = 1PC0-7 */ + turbo_state *state = Machine->driver_data; + state->turbo_ipc = data; +} + + +static WRITE8_HANDLER( turbo_ppi3c_w ) +{ + /* bit 0-3 = PLA0-3 */ + /* bit 4-6 = COL0-2 */ + /* bit 7 = n/c */ + turbo_state *state = Machine->driver_data; + state->turbo_fbpla = data & 0x0f; + state->turbo_fbcol = (data >> 4) & 0x07; +} + + + +/************************************* + * + * Subroc 3D PPI handling + * + *************************************/ + +/* + chip index: + 0 = IC117 - CPU Board, Sheet 3, A6 + 1 = IC119 - CPU Board, Sheet 3, A5 +*/ + +static WRITE8_HANDLER( subroc3d_ppi0a_w ) +{ + /* bit 0-3 = PLY0-3 */ + /* bit 4-7 = n/c */ + turbo_state *state = Machine->driver_data; + state->subroc3d_ply = data & 0x0f; +} + + +static WRITE8_HANDLER( subroc3d_ppi0c_w ) +{ + /* bit 0-3 = COL0-3 */ + turbo_state *state = Machine->driver_data; + state->subroc3d_col = data & 0x0f; +} + + +static WRITE8_HANDLER( subroc3d_ppi0b_w ) +{ + /* bit 0 = COM1 (COIN METER 1) */ + /* bit 1 = COM2 (COIN METER 2) */ + /* bit 2 = STLA (START LAMP) */ + /* bit 3 = NOUSE (n/c) */ + /* bit 4 = FLIP (not really flip, just offset) */ + turbo_state *state = Machine->driver_data; + coin_counter_w(0, data & 0x01); + coin_counter_w(1, data & 0x02); + set_led_status(0, data & 0x04); + state->subroc3d_flip = (data >> 4) & 1; +} + + + +/************************************* + * + * Buck Rogers PPI handling + * + *************************************/ + +static WRITE8_HANDLER( buckrog_ppi0a_w ) +{ + /* bit 0-7 = data to be read on the /IOREQ */ + turbo_state *state = Machine->driver_data; + state->buckrog_command = data; +} + + +static WRITE8_HANDLER( buckrog_ppi0b_w ) +{ + /* bit 0-5 = MOV0-5 */ + /* bit 6-7 = n/c */ + turbo_state *state = Machine->driver_data; + state->buckrog_mov = data & 0x3f; +} + + +static WRITE8_HANDLER( buckrog_ppi0c_w ) +{ + /* bit 0-2 = FCHG0 */ + /* bit 3-5 = n/c */ + /* bit 6 = /IOREQ on the 2nd CPU */ + /* bit 7 = /INT on the 2nd CPU */ + turbo_state *state = Machine->driver_data; + state->buckrog_fchg = data & 0x07; + cpunum_set_input_line(1, 0, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE); +} + + +static WRITE8_HANDLER( buckrog_ppi1c_w ) +{ + /* bit 0-2 = OBCH0-2 */ + /* bit 3 = n/c */ + /* bit 4 = COM1 (COIN METER 1) */ + /* bit 5 = COM2 (COIN METER 2) */ + /* bit 6 = STLA (START LAMP) */ + /* bit 7 = NOUSE (BODY SONIC) */ + turbo_state *state = Machine->driver_data; + state->buckrog_obch = data & 0x07; + coin_counter_w(0, data & 0x10); + coin_counter_w(1, data & 0x20); + set_led_status(0, data & 0x40); +} + + + +/************************************* + * + * 8279 display/keyboard driver + * + *************************************/ + +static void update_outputs(i8279_state *chip, UINT16 which) +{ + static const UINT8 ls48_map[16] = + { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0x00 }; + int i; + + /* update the items in the bitmask */ + for (i = 0; i < 16; i++) + if (which & (1 << i)) + { + int val; + + val = chip->ram[i] & 0x0f; + if (chip->inhibit & 0x01) + val = chip->clear & 0x0f; + output_set_digit_value(i * 2 + 0, ls48_map[val]); + + val = chip->ram[i] >> 4; + if (chip->inhibit & 0x02) + val = chip->clear >> 4; + output_set_digit_value(i * 2 + 1, ls48_map[val]); + } +} + + +static READ8_HANDLER( turbo_8279_r ) +{ + turbo_state *state = Machine->driver_data; + i8279_state *chip = &state->i8279; + UINT8 result = 0xff; + UINT8 addr; + + /* read data */ + if ((offset & 1) == 0) + { + switch (chip->command & 0xe0) + { + /* read sensor RAM */ + case 0x40: + result = ~readinputport(1); /* DSW 1 - inverted! */ + break; + + /* read display RAM */ + case 0x60: + + /* set the value of the corresponding outputs */ + addr = chip->command & 0x0f; + result = chip->ram[addr]; + + /* handle autoincrement */ + if (chip->command & 0x10) + chip->command = (chip->command & 0xf0) | ((addr + 1) & 0x0f); + break; + } + } + + /* read status word */ + else + { + logerror("read 0xfc%02x\n", offset); + result = 0x10; + } + return result; +} + + +static WRITE8_HANDLER( turbo_8279_w ) +{ + turbo_state *state = Machine->driver_data; + i8279_state *chip = &state->i8279; + UINT8 addr; + + /* write data */ + if ((offset & 1) == 0) + { + switch (chip->command & 0xe0) + { + /* write display RAM */ + case 0x80: + + /* set the value of the corresponding outputs */ + addr = chip->command & 0x0f; + if (!(chip->inhibit & 0x04)) + chip->ram[addr] = (chip->ram[addr] & 0xf0) | (data & 0x0f); + if (!(chip->inhibit & 0x08)) + chip->ram[addr] = (chip->ram[addr] & 0x0f) | (data & 0xf0); + update_outputs(chip, 1 << addr); + + /* handle autoincrement */ + if (chip->command & 0x10) + chip->command = (chip->command & 0xf0) | ((addr + 1) & 0x0f); + break; + } + } + + /* write command */ + else + { + chip->command = data; + + switch (data & 0xe0) + { + /* command 0: set mode */ + /* + Display modes: + + 00 = 8 x 8-bit character display -- left entry + 01 = 16 x 8-bit character display -- left entry + 10 = 8 x 8-bit character display -- right entry + 11 = 16 x 8-bit character display -- right entry + + Keyboard modes: + + 000 = Encoded scan keyboard -- 2 key lockout + 001 = Decoded scan keyboard -- 2 key lockout + 010 = Encoded scan keyboard -- N-key rollover + 011 = Decoded scan keyboard -- N-key rollover + 100 = Encoded scan sensor matrix + 101 = Decoded scan sensor matrix + 110 = Strobed input, encoded display scan + 111 = Strobed input, decoded display scan + */ + case 0x00: + logerror("turbo_8279: display mode = %d, keyboard mode = %d\n", (data >> 3) & 3, data & 7); + chip->mode = data & 0x1f; + break; + + /* command 1: program clock */ + case 0x20: + logerror("turbo_8279: clock prescaler set to %02X\n", data & 0x1f); + chip->prescale = data & 0x1f; + break; + + /* command 2: read FIFO/sensor RAM */ + /* command 3: read display RAM */ + /* command 4: write display RAM */ + case 0x40: + case 0x60: + case 0x80: + break; + + /* command 5: display write inhibit/blanking */ + case 0xa0: + chip->inhibit = data & 0x0f; + update_outputs(chip, ~0); + logerror("turbo_8279: clock prescaler set to %02X\n", data & 0x1f); + break; + + /* command 6: clear */ + case 0xc0: + chip->clear = (data & 0x08) ? ((data & 0x04) ? 0xff : 0x20) : 0x00; + if (data & 0x11) + memset(chip->ram, chip->clear, sizeof(chip->ram)); + break; + + /* command 7: end interrupt/error mode set */ + case 0xe0: + break; + } + } +} + + + +/************************************* + * + * Misc Turbo inputs/outputs + * + *************************************/ + +static READ8_HANDLER( turbo_collision_r ) +{ + turbo_state *state = Machine->driver_data; + video_screen_update_partial(0, video_screen_get_vpos(0)); + return readinputport(3) | (state->turbo_collision & 15); +} + + +static WRITE8_HANDLER( turbo_collision_clear_w ) +{ + turbo_state *state = Machine->driver_data; + video_screen_update_partial(0, video_screen_get_vpos(0)); + state->turbo_collision = 0; +} + + +static READ8_HANDLER( turbo_analog_r ) +{ + turbo_state *state = Machine->driver_data; + return readinputport(4) - state->turbo_last_analog; +} + + +static WRITE8_HANDLER( turbo_analog_reset_w ) +{ + turbo_state *state = Machine->driver_data; + state->turbo_last_analog = readinputport(4); +} + + +static WRITE8_HANDLER( turbo_coin_and_lamp_w ) +{ + switch (offset & 7) + { + case 0: + coin_counter_w(0, data & 1); + break; + case 1: + coin_counter_w(1, data & 1); + break; + case 3: + set_led_status(0, data & 1); + break; + } +} + + + +/************************************* + * + * Misc Buck Rogers inputs/outputs + * + *************************************/ + +static READ8_HANDLER( buckrog_cpu2_command_r ) +{ + /* assert ACK */ + turbo_state *state = Machine->driver_data; + ppi8255_set_portC(0, 0x00); + return state->buckrog_command; +} + + +static READ8_HANDLER( buckrog_port_2_r ) +{ + int inp1 = readinputport(2); + int inp2 = readinputport(3); + + return (((inp2 >> 6) & 1) << 7) | + (((inp2 >> 4) & 1) << 6) | + (((inp2 >> 3) & 1) << 5) | + (((inp2 >> 0) & 1) << 4) | + (((inp1 >> 6) & 1) << 3) | + (((inp1 >> 4) & 1) << 2) | + (((inp1 >> 3) & 1) << 1) | + (((inp1 >> 0) & 1) << 0); +} + + +static READ8_HANDLER( buckrog_port_3_r ) +{ + int inp1 = readinputport(2); + int inp2 = readinputport(3); + + return (((inp2 >> 7) & 1) << 7) | + (((inp2 >> 5) & 1) << 6) | + (((inp2 >> 2) & 1) << 5) | + (((inp2 >> 1) & 1) << 4) | + (((inp1 >> 7) & 1) << 3) | + (((inp1 >> 5) & 1) << 2) | + (((inp1 >> 2) & 1) << 1) | + (((inp1 >> 1) & 1) << 0); +} + + +static void delayed_ppi8255_w(int param) +{ + ppi8255_0_w(param >> 8, param & 0xff); +} + + +static WRITE8_HANDLER( buckrog_ppi8255_0_w ) +{ + /* the port C handshaking signals control the sub CPU IRQ, */ + /* so we have to sync whenever we access this PPI */ + timer_set(TIME_NOW, ((offset & 3) << 8) | (data & 0xff), delayed_ppi8255_w); +} + + + /************************************* * * Turbo CPU memory handlers @@ -164,18 +661,18 @@ static ADDRESS_MAP_START( turbo_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x5fff) AM_ROM - AM_RANGE(0xa000, 0xa0ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) - AM_RANGE(0xa800, 0xa807) AM_WRITE(turbo_coin_and_lamp_w) - AM_RANGE(0xb000, 0xb1ff) AM_RAM AM_BASE(&sega_sprite_position) - AM_RANGE(0xb800, 0xb800) AM_WRITE(MWA8_NOP) /* resets the analog wheel value */ - AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE(&videoram) AM_SIZE(&videoram_size) - AM_RANGE(0xe800, 0xe800) AM_WRITE(turbo_collision_clear_w) + AM_RANGE(0xa000, 0xa0ff) AM_MIRROR(0x0700) AM_MASK(0x0f7) AM_RAM AM_BASE_MEMBER(turbo_state, spriteram) + AM_RANGE(0xa800, 0xa807) AM_MIRROR(0x07f8) AM_WRITE(turbo_coin_and_lamp_w) + AM_RANGE(0xb000, 0xb3ff) AM_MIRROR(0x0400) AM_RAM AM_BASE_MEMBER(turbo_state, sprite_position) + AM_RANGE(0xb800, 0xbfff) AM_WRITE(turbo_analog_reset_w) + AM_RANGE(0xe000, 0xe7ff) AM_READWRITE(MRA8_RAM, turbo_videoram_w) AM_BASE_MEMBER(turbo_state, videoram) + AM_RANGE(0xe800, 0xefff) AM_WRITE(turbo_collision_clear_w) AM_RANGE(0xf000, 0xf7ff) AM_RAM - AM_RANGE(0xf800, 0xf803) AM_READWRITE(ppi8255_0_r, ppi8255_0_w) - AM_RANGE(0xf900, 0xf903) AM_READWRITE(ppi8255_1_r, ppi8255_1_w) - AM_RANGE(0xfa00, 0xfa03) AM_READWRITE(ppi8255_2_r, ppi8255_2_w) - AM_RANGE(0xfb00, 0xfb03) AM_READWRITE(ppi8255_3_r, ppi8255_3_w) - AM_RANGE(0xfc00, 0xfcff) AM_READWRITE(turbo_8279_r, turbo_8279_w) + AM_RANGE(0xf800, 0xf803) AM_MIRROR(0x00fc) AM_READWRITE(ppi8255_0_r, ppi8255_0_w) + AM_RANGE(0xf900, 0xf903) AM_MIRROR(0x00fc) AM_READWRITE(ppi8255_1_r, ppi8255_1_w) + AM_RANGE(0xfa00, 0xfa03) AM_MIRROR(0x00fc) AM_READWRITE(ppi8255_2_r, ppi8255_2_w) + AM_RANGE(0xfb00, 0xfb03) AM_MIRROR(0x00fc) AM_READWRITE(ppi8255_3_r, ppi8255_3_w) + AM_RANGE(0xfc00, 0xfc01) AM_MIRROR(0x00fe) AM_READWRITE(turbo_8279_r, turbo_8279_w) AM_RANGE(0xfd00, 0xfdff) AM_READ(input_port_0_r) AM_RANGE(0xfe00, 0xfeff) AM_READ(turbo_collision_r) ADDRESS_MAP_END @@ -189,18 +686,19 @@ ADDRESS_MAP_END *************************************/ static ADDRESS_MAP_START( subroc3d_map, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x5fff) AM_ROM - AM_RANGE(0xa000, 0xa3ff) AM_RAM AM_BASE(&sega_sprite_position) - AM_RANGE(0xa400, 0xa7ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) - AM_RANGE(0xa800, 0xa800) AM_READ(input_port_0_r) - AM_RANGE(0xa801, 0xa801) AM_READ(input_port_1_r) - AM_RANGE(0xa802, 0xa802) AM_READ(input_port_2_r) - AM_RANGE(0xa803, 0xa803) AM_READ(input_port_3_r) - AM_RANGE(0xb000, 0xb7ff) AM_RAM - AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE(&videoram) AM_SIZE(&videoram_size) - AM_RANGE(0xe800, 0xe803) AM_READWRITE(ppi8255_0_r, ppi8255_0_w) - AM_RANGE(0xf000, 0xf003) AM_READWRITE(ppi8255_1_r, ppi8255_1_w) - AM_RANGE(0xf800, 0xf801) AM_WRITE(turbo_8279_w) + AM_RANGE(0x0000, 0x9fff) AM_ROM + AM_RANGE(0xa000, 0xa3ff) AM_RAM AM_BASE_MEMBER(turbo_state, sprite_position) // CONT RAM + AM_RANGE(0xa400, 0xa7ff) AM_RAM AM_BASE_MEMBER(turbo_state, spriteram) // CONT RAM + AM_RANGE(0xa800, 0xa800) AM_MIRROR(0x07fc) AM_READ(input_port_0_r) // INPUT 253 + AM_RANGE(0xa801, 0xa801) AM_MIRROR(0x07fc) AM_READ(input_port_1_r) // INPUT 253 + AM_RANGE(0xa802, 0xa802) AM_MIRROR(0x07fc) AM_READ(input_port_2_r) // INPUT 253 + AM_RANGE(0xa803, 0xa803) AM_MIRROR(0x07fc) AM_READ(input_port_3_r) // INPUT 253 + AM_RANGE(0xb000, 0xb7ff) AM_RAM // SCRATCH + AM_RANGE(0xb800, 0xbfff) // HANDLE CL + AM_RANGE(0xe000, 0xe7ff) AM_READWRITE(MRA8_RAM, turbo_videoram_w) AM_BASE_MEMBER(turbo_state, videoram) // FIX PAGE + AM_RANGE(0xe800, 0xe803) AM_MIRROR(0x07fc) AM_READWRITE(ppi8255_0_r, ppi8255_0_w) + AM_RANGE(0xf000, 0xf003) AM_MIRROR(0x07fc) AM_READWRITE(ppi8255_1_r, ppi8255_1_w) + AM_RANGE(0xf800, 0xf801) AM_MIRROR(0x07fe) AM_READWRITE(turbo_8279_r, turbo_8279_w) ADDRESS_MAP_END @@ -213,35 +711,32 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( buckrog_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x7fff) AM_ROM - AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_BASE(&videoram) AM_SIZE(&videoram_size) - AM_RANGE(0xc800, 0xc803) AM_READWRITE(ppi8255_0_r, buckrog_ppi8255_0_w) - AM_RANGE(0xd000, 0xd003) AM_READWRITE(ppi8255_1_r, ppi8255_1_w) - AM_RANGE(0xd800, 0xd801) AM_WRITE(turbo_8279_w) - AM_RANGE(0xe000, 0xe1ff) AM_RAM AM_BASE(&sega_sprite_position) - AM_RANGE(0xe400, 0xe4ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) - AM_RANGE(0xe800, 0xe800) AM_READ(input_port_0_r) - AM_RANGE(0xe801, 0xe801) AM_READ(input_port_1_r) - AM_RANGE(0xe802, 0xe802) AM_READ(buckrog_port_2_r) - AM_RANGE(0xe803, 0xe803) AM_READ(buckrog_port_3_r) - AM_RANGE(0xf800, 0xffff) AM_RAM + AM_RANGE(0x8000, 0xbfff) AM_ROM + AM_RANGE(0xc000, 0xc7ff) AM_READWRITE(MRA8_RAM, turbo_videoram_w) AM_BASE_MEMBER(turbo_state, videoram) // FIX PAGE + AM_RANGE(0xc800, 0xc803) AM_MIRROR(0x07fc) AM_READWRITE(ppi8255_0_r, buckrog_ppi8255_0_w) // 8255 + AM_RANGE(0xd000, 0xd003) AM_MIRROR(0x07fc) AM_READWRITE(ppi8255_1_r, ppi8255_1_w) // 8255 + AM_RANGE(0xd800, 0xd801) AM_MIRROR(0x07fe) AM_READWRITE(turbo_8279_r, turbo_8279_w) // 8279 + AM_RANGE(0xe000, 0xe3ff) AM_RAM AM_BASE_MEMBER(turbo_state, sprite_position) // CONT RAM + AM_RANGE(0xe400, 0xe7ff) AM_RAM AM_BASE_MEMBER(turbo_state, spriteram) // CONT RAM + AM_RANGE(0xe800, 0xe800) AM_MIRROR(0x07fc) AM_READ(input_port_0_r) // INPUT + AM_RANGE(0xe801, 0xe801) AM_MIRROR(0x07fc) AM_READ(input_port_1_r) + AM_RANGE(0xe802, 0xe802) AM_MIRROR(0x07fc) AM_READ(buckrog_port_2_r) + AM_RANGE(0xe803, 0xe803) AM_MIRROR(0x07fc) AM_READ(buckrog_port_3_r) + AM_RANGE(0xf000, 0xf000) + AM_RANGE(0xf800, 0xffff) AM_RAM // SCRATCH ADDRESS_MAP_END -static ADDRESS_MAP_START( buckrog_readmem2, ADDRESS_SPACE_PROGRAM, 8 ) - AM_RANGE(0x0000, 0x0fff) AM_READ(MRA8_ROM) - AM_RANGE(0xf000, 0xf7ff) AM_READ(MRA8_RAM) -ADDRESS_MAP_END - - -static ADDRESS_MAP_START( buckrog_writemem2, ADDRESS_SPACE_PROGRAM, 8 ) +static ADDRESS_MAP_START( buckrog_cpu2_map, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x0000, 0xdfff) AM_WRITE(buckrog_bitmap_w) - AM_RANGE(0xf000, 0xf7ff) AM_WRITE(MWA8_RAM) + AM_RANGE(0xe000, 0xe7ff) AM_MIRROR(0x1800) AM_RAM ADDRESS_MAP_END -static ADDRESS_MAP_START( buckrog_readport2, ADDRESS_SPACE_IO, 8 ) +static ADDRESS_MAP_START( buckrog_cpu2_portmap, ADDRESS_SPACE_IO, 8 ) ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) - AM_RANGE(0x00, 0x00) AM_READ(buckrog_cpu2_command_r) + AM_RANGE(0x00, 0xff) AM_READ(buckrog_cpu2_command_r) ADDRESS_MAP_END @@ -265,35 +760,35 @@ INPUT_PORTS_START( turbo ) PORT_START /* DSW 1 */ PORT_DIPNAME( 0x03, 0x03, "Car On Extended Play" ) PORT_DIPLOCATION("SW1:1,2") - PORT_DIPSETTING( 0x00, "1" ) - PORT_DIPSETTING( 0x01, "2" ) - PORT_DIPSETTING( 0x02, "3" ) - PORT_DIPSETTING( 0x03, "4" ) - PORT_DIPNAME( 0x04, 0x04, DEF_STR( Game_Time ) ) PORT_DIPLOCATION("SW1:3") - PORT_DIPSETTING( 0x04, "Fixed (55 sec)" ) - PORT_DIPSETTING( 0x00, "Adjustable" ) + PORT_DIPSETTING( 0x00, "1" ) + PORT_DIPSETTING( 0x01, "2" ) + PORT_DIPSETTING( 0x02, "3" ) + PORT_DIPSETTING( 0x03, "4" ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Game_Time ) ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x04, "Fixed (55 sec)" ) + PORT_DIPSETTING( 0x00, "Adjustable" ) PORT_DIPNAME( 0x08, 0x08, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW1:4") - PORT_DIPSETTING( 0x08, DEF_STR( Easy )) - PORT_DIPSETTING( 0x00, DEF_STR( Hard )) + PORT_DIPSETTING( 0x08, DEF_STR( Easy )) + PORT_DIPSETTING( 0x00, DEF_STR( Hard )) PORT_DIPNAME( 0x10, 0x10, "Game Mode" ) PORT_DIPLOCATION("SW1:5") - PORT_DIPSETTING( 0x00, "No Collisions (cheat)" ) - PORT_DIPSETTING( 0x10, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x00, "No Collisions (cheat)" ) + PORT_DIPSETTING( 0x10, DEF_STR( Normal ) ) PORT_DIPNAME( 0x20, 0x20, "Initial Entry" ) PORT_DIPLOCATION("SW1:6") - PORT_DIPSETTING( 0x00, DEF_STR( Off )) - PORT_DIPSETTING( 0x20, DEF_STR( On )) + PORT_DIPSETTING( 0x00, DEF_STR( Off )) + PORT_DIPSETTING( 0x20, DEF_STR( On )) PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:7") - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:8") - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_START /* DSW 2 */ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Game_Time ) ) PORT_DIPLOCATION("SW2:1,2") - PORT_DIPSETTING( 0x00, "60 seconds" ) - PORT_DIPSETTING( 0x01, "70 seconds" ) - PORT_DIPSETTING( 0x02, "80 seconds" ) - PORT_DIPSETTING( 0x03, "90 seconds" ) + PORT_DIPSETTING( 0x00, "60 seconds" ) + PORT_DIPSETTING( 0x01, "70 seconds" ) + PORT_DIPSETTING( 0x02, "80 seconds" ) + PORT_DIPSETTING( 0x03, "90 seconds" ) PORT_DIPNAME( 0x1c, 0x1c, DEF_STR( Coin_B )) PORT_DIPLOCATION("SW2:3,4,5") PORT_DIPSETTING( 0x18, DEF_STR( 4C_1C )) PORT_DIPSETTING( 0x14, DEF_STR( 3C_1C )) @@ -314,13 +809,13 @@ INPUT_PORTS_START( turbo ) PORT_DIPSETTING( 0x60, DEF_STR( 1C_6C )) PORT_START /* Collision and DSW 3 */ - PORT_BIT( 0x0f, 0x00, IPT_SPECIAL ) /* Merged with collision bits */ + PORT_BIT( 0x0f, 0x00, IPT_SPECIAL ) /* Merged with collision bits */ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:1") - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:2") - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x40, 0x40, "Tachometer" ) PORT_DIPLOCATION("SW3:3") PORT_DIPSETTING( 0x40, "Analog (Meter)") PORT_DIPSETTING( 0x00, "Digital (LED)") @@ -329,7 +824,15 @@ INPUT_PORTS_START( turbo ) PORT_DIPSETTING( 0x00, "Cockpit") PORT_START /* IN0 */ - PORT_BIT( 0xff, 0, IPT_DIAL ) PORT_SENSITIVITY(10) PORT_KEYDELTA(30) PORT_RESET + PORT_BIT( 0xff, 0, IPT_DIAL ) PORT_SENSITIVITY(10) PORT_KEYDELTA(30) + + /* this is actually a variable resistor */ + PORT_START_TAG("VR1") + PORT_ADJUSTER(50, "Sprite scale offset") + + /* this is actually a variable resistor */ + PORT_START_TAG("VR2") + PORT_ADJUSTER(50, "Sprite scale gain") INPUT_PORTS_END @@ -477,80 +980,14 @@ INPUT_PORTS_END /************************************* * - * Sound interfaces + * Graphics definitions * *************************************/ -static const char *turbo_sample_names[]= -{ - "*turbo", - "01.wav", /* Trig1 */ - "02.wav", /* Trig2 */ - "03.wav", /* Trig3 */ - "04.wav", /* Trig4 */ - "05.wav", /* Screech */ - "06.wav", /* Crash */ - "skidding.wav", /* Spin */ - "idle.wav", /* Idle */ - "ambulanc.wav", /* Ambulance */ - 0 -}; - - -static struct Samplesinterface turbo_samples_interface = -{ - 8, /* eight channels */ - turbo_sample_names -}; - - -static const char *buckrog_sample_names[]= -{ - "*buckrog", - "alarm0.wav", - "alarm1.wav", - "alarm2.wav", - "alarm3.wav", - "exp.wav", - "fire.wav", - "rebound.wav", - "hit.wav", - "shipsnd1.wav", - "shipsnd2.wav", - "shipsnd3.wav", - 0 -}; - - -static struct Samplesinterface buckrog_samples_interface = +static const gfx_decode gfxdecodeinfo[] = { - 6, /* 6 channels */ - buckrog_sample_names -}; - - -static const char *subroc3d_sample_names[] = -{ - "*subroc3d", - "01.wav", /* enemy missile */ - "02.wav", /* enemy torpedo */ - "03.wav", /* enemy fighter */ - "04.wav", /* explosion in sky */ - "05.wav", /* explosion on sea */ - "06.wav", /* missile shoot */ - "07.wav", /* torpedo shoot */ - "08.wav", /* my ship expl */ - "09.wav", /* prolog sound */ - "11.wav", /* alarm 0 */ - "12.wav", /* alarm 1 */ - 0 -}; - - -static struct Samplesinterface subroc3d_samples_interface = -{ - 8, /* eight channels */ - subroc3d_sample_names + { REGION_GFX2, 0, &gfx_8x8x2_planar, 0, 64 }, + { -1 } }; @@ -562,98 +999,84 @@ static struct Samplesinterface subroc3d_samples_interface = *************************************/ static MACHINE_DRIVER_START( turbo ) + MDRV_DRIVER_DATA(turbo_state) /* basic machine hardware */ - MDRV_CPU_ADD(Z80, 5000000) + MDRV_CPU_ADD(Z80, TURBO_MASTER_CLOCK/4) MDRV_CPU_PROGRAM_MAP(turbo_map,0) MDRV_CPU_VBLANK_INT(irq0_line_hold,1) - MDRV_FRAMES_PER_SECOND(60) - MDRV_VBLANK_DURATION(DEFAULT_REAL_60HZ_VBLANK_DURATION) - MDRV_MACHINE_RESET(turbo) - /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) - MDRV_SCREEN_SIZE(32*8, 32*8) - MDRV_VISIBLE_AREA(1*8, 32*8-1, 1*8, 27*8-1) - MDRV_PALETTE_LENGTH(512) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_ALWAYS_UPDATE) + MDRV_GFXDECODE(gfxdecodeinfo) + MDRV_PALETTE_LENGTH(256) + + MDRV_SCREEN_ADD("main", 0) + MDRV_SCREEN_RAW_PARAMS(TURBO_PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) MDRV_PALETTE_INIT(turbo) MDRV_VIDEO_START(turbo) - MDRV_VIDEO_EOF(turbo) MDRV_VIDEO_UPDATE(turbo) /* sound hardware */ - MDRV_SPEAKER_STANDARD_MONO("mono") - - MDRV_SOUND_ADD(SAMPLES, 0) - MDRV_SOUND_CONFIG(turbo_samples_interface) - MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + MDRV_IMPORT_FROM(turbo_samples) MACHINE_DRIVER_END static MACHINE_DRIVER_START( subroc3d ) + MDRV_DRIVER_DATA(turbo_state) /* basic machine hardware */ - MDRV_CPU_ADD(Z80, 5000000) + MDRV_CPU_ADD(Z80, SUBROC_MASTER_CLOCK/4) MDRV_CPU_PROGRAM_MAP(subroc3d_map,0) MDRV_CPU_VBLANK_INT(irq0_line_hold,1) - MDRV_FRAMES_PER_SECOND(60) - MDRV_VBLANK_DURATION(DEFAULT_REAL_60HZ_VBLANK_DURATION) - MDRV_MACHINE_RESET(subroc3d) - /* video hardware */ - MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_UPDATE_AFTER_VBLANK) - MDRV_SCREEN_SIZE(32*8, 32*8) - MDRV_VISIBLE_AREA(0*8, 30*8-1, 0*8, 28*8-1) - MDRV_PALETTE_LENGTH(512) + MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) + MDRV_GFXDECODE(gfxdecodeinfo) + MDRV_PALETTE_LENGTH(256) + + MDRV_SCREEN_ADD("main", 0) + MDRV_SCREEN_RAW_PARAMS(SUBROC_PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) MDRV_PALETTE_INIT(subroc3d) - MDRV_VIDEO_START(subroc3d) + MDRV_VIDEO_START(turbo) MDRV_VIDEO_UPDATE(subroc3d) /* sound hardware */ - MDRV_SPEAKER_STANDARD_MONO("mono") - - MDRV_SOUND_ADD(SAMPLES, 0) - MDRV_SOUND_CONFIG(subroc3d_samples_interface) - MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) + MDRV_IMPORT_FROM(subroc3d_samples) MACHINE_DRIVER_END static MACHINE_DRIVER_START( buckrog ) + MDRV_DRIVER_DATA(turbo_state) /* basic machine hardware */ - MDRV_CPU_ADD(Z80, 5000000) + MDRV_CPU_ADD(Z80, TURBO_MASTER_CLOCK/4) MDRV_CPU_PROGRAM_MAP(buckrog_map,0) MDRV_CPU_VBLANK_INT(irq0_line_hold,1) - MDRV_CPU_ADD(Z80, 5000000) - MDRV_CPU_PROGRAM_MAP(buckrog_readmem2,buckrog_writemem2) - MDRV_CPU_IO_MAP(buckrog_readport2,0) + MDRV_CPU_ADD(Z80, TURBO_MASTER_CLOCK/4) + MDRV_CPU_PROGRAM_MAP(buckrog_cpu2_map,0) + MDRV_CPU_IO_MAP(buckrog_cpu2_portmap,0) - MDRV_FRAMES_PER_SECOND(60) - MDRV_VBLANK_DURATION(DEFAULT_REAL_60HZ_VBLANK_DURATION) MDRV_INTERLEAVE(10) MDRV_MACHINE_RESET(buckrog) /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) - MDRV_SCREEN_SIZE(32*8, 32*8) - MDRV_VISIBLE_AREA(0*8, 32*8-1, 0*8, 28*8-1) - MDRV_PALETTE_LENGTH(1024+512+256) + MDRV_GFXDECODE(gfxdecodeinfo) + MDRV_PALETTE_LENGTH(1024) + + MDRV_SCREEN_ADD("main", 0) + MDRV_SCREEN_RAW_PARAMS(TURBO_PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) MDRV_PALETTE_INIT(buckrog) MDRV_VIDEO_START(buckrog) MDRV_VIDEO_UPDATE(buckrog) /* sound hardware */ - MDRV_SPEAKER_STANDARD_MONO("mono") - - MDRV_SOUND_ADD(SAMPLES, 0) - MDRV_SOUND_CONFIG(buckrog_samples_interface) - MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) + MDRV_IMPORT_FROM(buckrog_samples) MACHINE_DRIVER_END @@ -665,320 +1088,434 @@ MACHINE_DRIVER_END *************************************/ ROM_START( turbo ) - ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "epr1513.bin", 0x0000, 0x2000, CRC(0326adfc) SHA1(d9f06f0bc78667fa58c4b8ab3a3897d0dd0bdfbf) ) - ROM_LOAD( "epr1514.bin", 0x2000, 0x2000, CRC(25af63b0) SHA1(9af4b3da83a4cef79b7dd0e9061132c499872c1c) ) - ROM_LOAD( "epr1515.bin", 0x4000, 0x2000, CRC(059c1c36) SHA1(ba870e6f45ff15aa148b2c2f213c879144aaacf0) ) + ROM_REGION( 0x6000, REGION_CPU1, 0 ) + ROM_LOAD( "epr-1513.cpu-ic76", 0x0000, 0x2000, CRC(0326adfc) SHA1(d9f06f0bc78667fa58c4b8ab3a3897d0dd0bdfbf) ) + ROM_LOAD( "epr-1514.cpu-ic89", 0x2000, 0x2000, CRC(25af63b0) SHA1(9af4b3da83a4cef79b7dd0e9061132c499872c1c) ) + ROM_LOAD( "epr-1515.cpu-ic103", 0x4000, 0x2000, CRC(059c1c36) SHA1(ba870e6f45ff15aa148b2c2f213c879144aaacf0) ) ROM_REGION( 0x20000, REGION_GFX1, 0 ) /* sprite data */ - ROM_LOAD( "epr1246.rom", 0x00000, 0x2000, CRC(555bfe9a) SHA1(1e56385475eeff044dcd9b44a154991d3efe995e) ) /* level 0 */ - ROM_RELOAD( 0x02000, 0x2000 ) - ROM_LOAD( "epr1247.rom", 0x04000, 0x2000, CRC(c8c5e4d5) SHA1(da70297340ddea0cd7fe04f2d94ea65f8202d0e5) ) /* level 1 */ - ROM_RELOAD( 0x06000, 0x2000 ) - ROM_LOAD( "epr1248.rom", 0x08000, 0x2000, CRC(82fe5b94) SHA1(b96688ca0cfd90fdc4ee7c2e6c0b66726cc5713c) ) /* level 2 */ - ROM_RELOAD( 0x0a000, 0x2000 ) - ROM_LOAD( "epr1249.rom", 0x0c000, 0x2000, CRC(e258e009) SHA1(598d382db0f789ea2fde749b7467abed545de25a) ) /* level 3 */ - ROM_LOAD( "epr1250.rom", 0x0e000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - ROM_LOAD( "epr1251.rom", 0x10000, 0x2000, CRC(292573de) SHA1(3ddc980d11478a6a6e4082c2f76c1ab82ffe2f36) ) /* level 4 */ - ROM_LOAD( "epr1252.rom", 0x12000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - ROM_LOAD( "epr1253.rom", 0x14000, 0x2000, CRC(92783626) SHA1(13979eb964112436182d2a92f21803bcc28f4a4a) ) /* level 5 */ - ROM_LOAD( "epr1254.rom", 0x16000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - ROM_LOAD( "epr1255.rom", 0x18000, 0x2000, CRC(485dcef9) SHA1(0f760ebb42cc2580a29758c72428a41d74477ce6) ) /* level 6 */ - ROM_LOAD( "epr1256.rom", 0x1a000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - ROM_LOAD( "epr1257.rom", 0x1c000, 0x2000, CRC(4ca984ce) SHA1(99f294fb203f23929b44baa2dd1825c67dde08a1) ) /* level 7 */ - ROM_LOAD( "epr1258.rom", 0x1e000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - - ROM_REGION( 0x1000, REGION_GFX2, 0 ) /* foreground data */ - ROM_LOAD( "epr1244.rom", 0x0000, 0x0800, CRC(17f67424) SHA1(6126562510f1509f3487faaa3b9d7470ab600a2c) ) - ROM_LOAD( "epr1245.rom", 0x0800, 0x0800, CRC(2ba0b46b) SHA1(5d4d4f19ad7a911c7b37db190a420faf665546b4) ) + ROM_LOAD( "epr-1246.prom-ic84", 0x00000, 0x2000, CRC(555bfe9a) SHA1(1e56385475eeff044dcd9b44a154991d3efe995e) ) /* level 0 */ + ROM_RELOAD( 0x02000, 0x2000 ) + ROM_LOAD( "epr-1247.prom-ic86", 0x04000, 0x2000, CRC(c8c5e4d5) SHA1(da70297340ddea0cd7fe04f2d94ea65f8202d0e5) ) /* level 1 */ + ROM_RELOAD( 0x06000, 0x2000 ) + ROM_LOAD( "epr-1248.prom-ic88", 0x08000, 0x2000, CRC(82fe5b94) SHA1(b96688ca0cfd90fdc4ee7c2e6c0b66726cc5713c) ) /* level 2 */ + ROM_RELOAD( 0x0a000, 0x2000 ) + ROM_LOAD( "epr-1249.prom-ic90", 0x0c000, 0x2000, CRC(e258e009) SHA1(598d382db0f789ea2fde749b7467abed545de25a) ) /* level 3 */ + ROM_LOAD( "epr-1250.prom-ic108",0x0e000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + ROM_LOAD( "epr-1251.prom-ic92", 0x10000, 0x2000, CRC(292573de) SHA1(3ddc980d11478a6a6e4082c2f76c1ab82ffe2f36) ) /* level 4 */ + ROM_LOAD( "epr-1252.prom-ic110",0x12000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + ROM_LOAD( "epr-1253.prom-ic94", 0x14000, 0x2000, CRC(92783626) SHA1(13979eb964112436182d2a92f21803bcc28f4a4a) ) /* level 5 */ + ROM_LOAD( "epr-1254.prom-ic112",0x16000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + ROM_LOAD( "epr-1255.prom-ic32", 0x18000, 0x2000, CRC(485dcef9) SHA1(0f760ebb42cc2580a29758c72428a41d74477ce6) ) /* level 6 */ + ROM_LOAD( "epr-1256.prom-ic47", 0x1a000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + ROM_LOAD( "epr-1257.prom-ic34", 0x1c000, 0x2000, CRC(4ca984ce) SHA1(99f294fb203f23929b44baa2dd1825c67dde08a1) ) /* level 7 */ + ROM_LOAD( "epr-1258.prom-ic49", 0x1e000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + + ROM_REGION( 0x1000, REGION_GFX2, ROMREGION_DISPOSE ) /* foreground data */ + ROM_LOAD( "epr-1244.cpu-ic111", 0x0000, 0x0800, CRC(17f67424) SHA1(6126562510f1509f3487faaa3b9d7470ab600a2c) ) + ROM_LOAD( "epr-1245.cpu-ic122", 0x0800, 0x0800, CRC(2ba0b46b) SHA1(5d4d4f19ad7a911c7b37db190a420faf665546b4) ) ROM_REGION( 0x4800, REGION_GFX3, 0 ) /* road data */ - ROM_LOAD( "epr1125.rom", 0x0000, 0x0800, CRC(65b5d44b) SHA1(bbdd5db013c9d876e9666f17c48569c7531bfc08) ) - ROM_LOAD( "epr1126.rom", 0x0800, 0x0800, CRC(685ace1b) SHA1(99c8d36ac910169b27676d18c894433c2ba44853) ) - ROM_LOAD( "epr1127.rom", 0x1000, 0x0800, CRC(9233c9ca) SHA1(cbf9a0f564d8ace1ccd701c1769dbc001d465851) ) - ROM_LOAD( "epr1238.rom", 0x1800, 0x0800, CRC(d94fd83f) SHA1(1e3a68259d2ede623d5a7306fdf693a4eab301f0) ) - ROM_LOAD( "epr1239.rom", 0x2000, 0x0800, CRC(4c41124f) SHA1(d73a9441552c77fb3078553195794311a950d589) ) - ROM_LOAD( "epr1240.rom", 0x2800, 0x0800, CRC(371d6282) SHA1(f5902b357d976822d46aa6404b7bd30855d435a9) ) - ROM_LOAD( "epr1241.rom", 0x3000, 0x0800, CRC(1109358a) SHA1(27a5351a4e87309671e72115299420315a93dba6) ) - ROM_LOAD( "epr1242.rom", 0x3800, 0x0800, CRC(04866769) SHA1(1f9c0d53766fdaf8de57d3df05f291c2ca3dc5fb) ) - ROM_LOAD( "epr1243.rom", 0x4000, 0x0800, CRC(29854c48) SHA1(cab89bc30f83d9746931ddf6f95a6d0c8a517e5d) ) - - ROM_REGION( 0x1000, REGION_PROMS, 0 ) /* various PROMs */ - ROM_LOAD( "pr1121.bin", 0x0000, 0x0200, CRC(7692f497) SHA1(42468c0705df9928e15ff8deb7e793a6c0c04353) ) /* palette */ - ROM_LOAD( "pr1122.bin", 0x0200, 0x0400, CRC(1a86ce70) SHA1(cab708b9a089b2e28f2298c1e4fae6e200923527) ) /* sprite priorities */ - ROM_LOAD( "pr1123.bin", 0x0600, 0x0400, CRC(02d2cb52) SHA1(c34d6b60355747ce20fcb8d322df0e188d187f10) ) /* sprite/road/background priorities */ - ROM_LOAD( "pr-1118.bin", 0x0a00, 0x0100, CRC(07324cfd) SHA1(844abc2042d6810fa34d84ff1ed57744886c6ea6) ) /* background color table */ - ROM_LOAD( "pr1114.bin", 0x0b00, 0x0020, CRC(78aded46) SHA1(c78afe804f8b8e837b0c502de5b8715a41fb92b9) ) /* road red/green color table */ - ROM_LOAD( "pr1117.bin", 0x0b20, 0x0020, CRC(f06d9907) SHA1(f11db7800f41b03e79f5eef8d7ef3ae0a6277518) ) /* road green/blue color table */ - ROM_LOAD( "pr1115.bin", 0x0b40, 0x0020, CRC(5394092c) SHA1(129ff61104979ff6a3c3af8bf81c04ae9b133c9e) ) /* road collision/enable */ - ROM_LOAD( "pr1116.bin", 0x0b60, 0x0020, CRC(3956767d) SHA1(073aaf57175526660fcf7af2e16e7f1d1aaba9a9) ) /* collision detection */ - ROM_LOAD( "sndprom.bin", 0x0b80, 0x0020, CRC(b369a6ae) SHA1(dda7c6cf58ce5173f29a3084c85393c0c4587086) ) - ROM_LOAD( "pr-1119.bin", 0x0c00, 0x0200, CRC(628d3f1d) SHA1(570f8999603d02e52106ec2df203f63edfb883dd) ) /* timing - not used */ - ROM_LOAD( "pr-1120.bin", 0x0e00, 0x0200, CRC(591b6a68) SHA1(85de39d9e14a1f0c65c1308c27a106e3c2dd9b5b) ) /* timing - not used */ + ROM_LOAD( "epr-1125.cpu-ic1", 0x0000, 0x0800, CRC(65b5d44b) SHA1(bbdd5db013c9d876e9666f17c48569c7531bfc08) ) + ROM_LOAD( "epr-1126.cpu-ic2", 0x0800, 0x0800, CRC(685ace1b) SHA1(99c8d36ac910169b27676d18c894433c2ba44853) ) + ROM_LOAD( "epr-1127.cpu-ic13", 0x1000, 0x0800, CRC(9233c9ca) SHA1(cbf9a0f564d8ace1ccd701c1769dbc001d465851) ) + ROM_LOAD( "epr-1238.cpu-ic14", 0x1800, 0x0800, CRC(d94fd83f) SHA1(1e3a68259d2ede623d5a7306fdf693a4eab301f0) ) + ROM_LOAD( "epr-1239.cpu-ic27", 0x2000, 0x0800, CRC(4c41124f) SHA1(d73a9441552c77fb3078553195794311a950d589) ) + ROM_LOAD( "epr-1240.cpu-ic28", 0x2800, 0x0800, CRC(371d6282) SHA1(f5902b357d976822d46aa6404b7bd30855d435a9) ) + ROM_LOAD( "epr-1241.cpu-ic41", 0x3000, 0x0800, CRC(1109358a) SHA1(27a5351a4e87309671e72115299420315a93dba6) ) + ROM_LOAD( "epr-1242.cpu-ic42", 0x3800, 0x0800, CRC(04866769) SHA1(1f9c0d53766fdaf8de57d3df05f291c2ca3dc5fb) ) + ROM_LOAD( "epr-1243.cpu-ic74", 0x4000, 0x0800, CRC(29854c48) SHA1(cab89bc30f83d9746931ddf6f95a6d0c8a517e5d) ) + + ROM_REGION( 0x1020, REGION_PROMS, 0 ) /* various PROMs */ + ROM_LOAD( "pr-1114.prom-ic13", 0x0000, 0x0020, CRC(78aded46) SHA1(c78afe804f8b8e837b0c502de5b8715a41fb92b9) ) /* road red/green color table */ + ROM_LOAD( "pr-1115.prom-ic18", 0x0020, 0x0020, CRC(5394092c) SHA1(129ff61104979ff6a3c3af8bf81c04ae9b133c9e) ) /* road collision/enable */ + ROM_LOAD( "pr-1116.prom-ic20", 0x0040, 0x0020, CRC(3956767d) SHA1(073aaf57175526660fcf7af2e16e7f1d1aaba9a9) ) /* collision detection */ + ROM_LOAD( "pr-1117.prom-ic21", 0x0060, 0x0020, CRC(f06d9907) SHA1(f11db7800f41b03e79f5eef8d7ef3ae0a6277518) ) /* road green/blue color table */ + ROM_LOAD( "pr-1118.cpu-ic99", 0x0100, 0x0100, CRC(07324cfd) SHA1(844abc2042d6810fa34d84ff1ed57744886c6ea6) ) /* background color table */ + ROM_LOAD( "pr-1119.cpu-ic50", 0x0200, 0x0200, CRC(57ebd4bc) SHA1(932649da3537666f95833a8a8aff506217bd9aa1) ) /* sprite Y scaling */ + ROM_LOAD( "pr-1120.cpu-ic62", 0x0400, 0x0200, CRC(8dd4c8a8) SHA1(e8d9cf08f115d57c44746fa0ff28f47b064b4193) ) /* video timing */ + ROM_LOAD( "pr-1121.prom-ic29", 0x0600, 0x0200, CRC(7692f497) SHA1(42468c0705df9928e15ff8deb7e793a6c0c04353) ) /* palette */ + ROM_LOAD( "pr-1122.prom-ic11", 0x0800, 0x0400, CRC(1a86ce70) SHA1(cab708b9a089b2e28f2298c1e4fae6e200923527) ) /* sprite priorities */ + ROM_LOAD( "pr-1123.prom-ic12", 0x0c00, 0x0400, CRC(02d2cb52) SHA1(c34d6b60355747ce20fcb8d322df0e188d187f10) ) /* sprite/road/background priorities */ + ROM_LOAD( "pr-1279.sound-ic40", 0x1000, 0x0020, CRC(b369a6ae) SHA1(dda7c6cf58ce5173f29a3084c85393c0c4587086) ) /* sound board PROM */ ROM_END ROM_START( turboa ) - ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "epr1262.rom", 0x0000, 0x2000, CRC(1951b83a) SHA1(31933676140db66281b7ca016a1b42cb985f44dd) ) - ROM_LOAD( "epr1263.rom", 0x2000, 0x2000, CRC(45e01608) SHA1(0a9812714c41904bef7a8777b4aae63b5a1dd633) ) - ROM_LOAD( "epr1264.rom", 0x4000, 0x2000, CRC(1802f6c7) SHA1(5c575821d849d955059868b3dd3167b4bef9a8c4) ) + ROM_REGION( 0x6000, REGION_CPU1, 0 ) + ROM_LOAD( "epr-1262.cpu-ic76", 0x0000, 0x2000, CRC(1951b83a) SHA1(31933676140db66281b7ca016a1b42cb985f44dd) ) + ROM_LOAD( "epr-1263.cpu-ic89", 0x2000, 0x2000, CRC(45e01608) SHA1(0a9812714c41904bef7a8777b4aae63b5a1dd633) ) + ROM_LOAD( "epr-1264.cpu-ic103", 0x4000, 0x2000, CRC(1802f6c7) SHA1(5c575821d849d955059868b3dd3167b4bef9a8c4) ) ROM_REGION( 0x20000, REGION_GFX1, 0 ) /* sprite data */ - ROM_LOAD( "epr1246.rom", 0x00000, 0x2000, CRC(555bfe9a) SHA1(1e56385475eeff044dcd9b44a154991d3efe995e) ) /* level 0 */ - ROM_RELOAD( 0x02000, 0x2000 ) - ROM_LOAD( "epr1247.rom", 0x04000, 0x2000, CRC(c8c5e4d5) SHA1(da70297340ddea0cd7fe04f2d94ea65f8202d0e5) ) /* level 1 */ - ROM_RELOAD( 0x06000, 0x2000 ) - ROM_LOAD( "epr1248.rom", 0x08000, 0x2000, CRC(82fe5b94) SHA1(b96688ca0cfd90fdc4ee7c2e6c0b66726cc5713c) ) /* level 2 */ - ROM_RELOAD( 0x0a000, 0x2000 ) - ROM_LOAD( "epr1249.rom", 0x0c000, 0x2000, CRC(e258e009) SHA1(598d382db0f789ea2fde749b7467abed545de25a) ) /* level 3 */ - ROM_LOAD( "epr1250.rom", 0x0e000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - ROM_LOAD( "epr1251.rom", 0x10000, 0x2000, CRC(292573de) SHA1(3ddc980d11478a6a6e4082c2f76c1ab82ffe2f36) ) /* level 4 */ - ROM_LOAD( "epr1252.rom", 0x12000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - ROM_LOAD( "epr1253.rom", 0x14000, 0x2000, CRC(92783626) SHA1(13979eb964112436182d2a92f21803bcc28f4a4a) ) /* level 5 */ - ROM_LOAD( "epr1254.rom", 0x16000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - ROM_LOAD( "epr1255.rom", 0x18000, 0x2000, CRC(485dcef9) SHA1(0f760ebb42cc2580a29758c72428a41d74477ce6) ) /* level 6 */ - ROM_LOAD( "epr1256.rom", 0x1a000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - ROM_LOAD( "epr1257.rom", 0x1c000, 0x2000, CRC(4ca984ce) SHA1(99f294fb203f23929b44baa2dd1825c67dde08a1) ) /* level 7 */ - ROM_LOAD( "epr1258.rom", 0x1e000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - - ROM_REGION( 0x1000, REGION_GFX2, 0 ) /* foreground data */ - ROM_LOAD( "epr1244.rom", 0x0000, 0x0800, CRC(17f67424) SHA1(6126562510f1509f3487faaa3b9d7470ab600a2c) ) - ROM_LOAD( "epr1245.rom", 0x0800, 0x0800, CRC(2ba0b46b) SHA1(5d4d4f19ad7a911c7b37db190a420faf665546b4) ) + ROM_LOAD( "epr-1246.prom-ic84", 0x00000, 0x2000, CRC(555bfe9a) SHA1(1e56385475eeff044dcd9b44a154991d3efe995e) ) /* level 0 */ + ROM_RELOAD( 0x02000, 0x2000 ) + ROM_LOAD( "epr-1247.prom-ic86", 0x04000, 0x2000, CRC(c8c5e4d5) SHA1(da70297340ddea0cd7fe04f2d94ea65f8202d0e5) ) /* level 1 */ + ROM_RELOAD( 0x06000, 0x2000 ) + ROM_LOAD( "epr-1248.prom-ic88", 0x08000, 0x2000, CRC(82fe5b94) SHA1(b96688ca0cfd90fdc4ee7c2e6c0b66726cc5713c) ) /* level 2 */ + ROM_RELOAD( 0x0a000, 0x2000 ) + ROM_LOAD( "epr-1249.prom-ic90", 0x0c000, 0x2000, CRC(e258e009) SHA1(598d382db0f789ea2fde749b7467abed545de25a) ) /* level 3 */ + ROM_LOAD( "epr-1250.prom-ic108",0x0e000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + ROM_LOAD( "epr-1251.prom-ic92", 0x10000, 0x2000, CRC(292573de) SHA1(3ddc980d11478a6a6e4082c2f76c1ab82ffe2f36) ) /* level 4 */ + ROM_LOAD( "epr-1252.prom-ic110",0x12000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + ROM_LOAD( "epr-1253.prom-ic94", 0x14000, 0x2000, CRC(92783626) SHA1(13979eb964112436182d2a92f21803bcc28f4a4a) ) /* level 5 */ + ROM_LOAD( "epr-1254.prom-ic112",0x16000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + ROM_LOAD( "epr-1255.prom-ic32", 0x18000, 0x2000, CRC(485dcef9) SHA1(0f760ebb42cc2580a29758c72428a41d74477ce6) ) /* level 6 */ + ROM_LOAD( "epr-1256.prom-ic47", 0x1a000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + ROM_LOAD( "epr-1257.prom-ic34", 0x1c000, 0x2000, CRC(4ca984ce) SHA1(99f294fb203f23929b44baa2dd1825c67dde08a1) ) /* level 7 */ + ROM_LOAD( "epr-1258.prom-ic49", 0x1e000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + + ROM_REGION( 0x1000, REGION_GFX2, ROMREGION_DISPOSE ) /* foreground data */ + ROM_LOAD( "epr-1244.cpu-ic111", 0x0000, 0x0800, CRC(17f67424) SHA1(6126562510f1509f3487faaa3b9d7470ab600a2c) ) + ROM_LOAD( "epr-1245.cpu-ic122", 0x0800, 0x0800, CRC(2ba0b46b) SHA1(5d4d4f19ad7a911c7b37db190a420faf665546b4) ) ROM_REGION( 0x4800, REGION_GFX3, 0 ) /* road data */ - ROM_LOAD( "epr1125.rom", 0x0000, 0x0800, CRC(65b5d44b) SHA1(bbdd5db013c9d876e9666f17c48569c7531bfc08) ) - ROM_LOAD( "epr1126.rom", 0x0800, 0x0800, CRC(685ace1b) SHA1(99c8d36ac910169b27676d18c894433c2ba44853) ) - ROM_LOAD( "epr1127.rom", 0x1000, 0x0800, CRC(9233c9ca) SHA1(cbf9a0f564d8ace1ccd701c1769dbc001d465851) ) - ROM_LOAD( "epr1238.rom", 0x1800, 0x0800, CRC(d94fd83f) SHA1(1e3a68259d2ede623d5a7306fdf693a4eab301f0) ) - ROM_LOAD( "epr1239.rom", 0x2000, 0x0800, CRC(4c41124f) SHA1(d73a9441552c77fb3078553195794311a950d589) ) - ROM_LOAD( "epr1240.rom", 0x2800, 0x0800, CRC(371d6282) SHA1(f5902b357d976822d46aa6404b7bd30855d435a9) ) - ROM_LOAD( "epr1241.rom", 0x3000, 0x0800, CRC(1109358a) SHA1(27a5351a4e87309671e72115299420315a93dba6) ) - ROM_LOAD( "epr1242.rom", 0x3800, 0x0800, CRC(04866769) SHA1(1f9c0d53766fdaf8de57d3df05f291c2ca3dc5fb) ) - ROM_LOAD( "epr1243.rom", 0x4000, 0x0800, CRC(29854c48) SHA1(cab89bc30f83d9746931ddf6f95a6d0c8a517e5d) ) - - ROM_REGION( 0x1000, REGION_PROMS, 0 ) /* various PROMs */ - ROM_LOAD( "pr1121.bin", 0x0000, 0x0200, CRC(7692f497) SHA1(42468c0705df9928e15ff8deb7e793a6c0c04353) ) /* palette */ - ROM_LOAD( "pr1122.bin", 0x0200, 0x0400, CRC(1a86ce70) SHA1(cab708b9a089b2e28f2298c1e4fae6e200923527) ) /* sprite priorities */ - ROM_LOAD( "pr1123.bin", 0x0600, 0x0400, CRC(02d2cb52) SHA1(c34d6b60355747ce20fcb8d322df0e188d187f10) ) /* sprite/road/background priorities */ - ROM_LOAD( "pr-1118.bin", 0x0a00, 0x0100, CRC(07324cfd) SHA1(844abc2042d6810fa34d84ff1ed57744886c6ea6) ) /* background color table */ - ROM_LOAD( "pr1114.bin", 0x0b00, 0x0020, CRC(78aded46) SHA1(c78afe804f8b8e837b0c502de5b8715a41fb92b9) ) /* road red/green color table */ - ROM_LOAD( "pr1117.bin", 0x0b20, 0x0020, CRC(f06d9907) SHA1(f11db7800f41b03e79f5eef8d7ef3ae0a6277518) ) /* road green/blue color table */ - ROM_LOAD( "pr1115.bin", 0x0b40, 0x0020, CRC(5394092c) SHA1(129ff61104979ff6a3c3af8bf81c04ae9b133c9e) ) /* road collision/enable */ - ROM_LOAD( "pr1116.bin", 0x0b60, 0x0020, CRC(3956767d) SHA1(073aaf57175526660fcf7af2e16e7f1d1aaba9a9) ) /* collision detection */ - ROM_LOAD( "sndprom.bin", 0x0b80, 0x0020, CRC(b369a6ae) SHA1(dda7c6cf58ce5173f29a3084c85393c0c4587086) ) - ROM_LOAD( "pr-1119.bin", 0x0c00, 0x0200, CRC(628d3f1d) SHA1(570f8999603d02e52106ec2df203f63edfb883dd) ) /* timing - not used */ - ROM_LOAD( "pr-1120.bin", 0x0e00, 0x0200, CRC(591b6a68) SHA1(85de39d9e14a1f0c65c1308c27a106e3c2dd9b5b) ) /* timing - not used */ + ROM_LOAD( "epr-1125.cpu-ic1", 0x0000, 0x0800, CRC(65b5d44b) SHA1(bbdd5db013c9d876e9666f17c48569c7531bfc08) ) + ROM_LOAD( "epr-1126.cpu-ic2", 0x0800, 0x0800, CRC(685ace1b) SHA1(99c8d36ac910169b27676d18c894433c2ba44853) ) + ROM_LOAD( "epr-1127.cpu-ic13", 0x1000, 0x0800, CRC(9233c9ca) SHA1(cbf9a0f564d8ace1ccd701c1769dbc001d465851) ) + ROM_LOAD( "epr-1238.cpu-ic14", 0x1800, 0x0800, CRC(d94fd83f) SHA1(1e3a68259d2ede623d5a7306fdf693a4eab301f0) ) + ROM_LOAD( "epr-1239.cpu-ic27", 0x2000, 0x0800, CRC(4c41124f) SHA1(d73a9441552c77fb3078553195794311a950d589) ) + ROM_LOAD( "epr-1240.cpu-ic28", 0x2800, 0x0800, CRC(371d6282) SHA1(f5902b357d976822d46aa6404b7bd30855d435a9) ) + ROM_LOAD( "epr-1241.cpu-ic41", 0x3000, 0x0800, CRC(1109358a) SHA1(27a5351a4e87309671e72115299420315a93dba6) ) + ROM_LOAD( "epr-1242.cpu-ic42", 0x3800, 0x0800, CRC(04866769) SHA1(1f9c0d53766fdaf8de57d3df05f291c2ca3dc5fb) ) + ROM_LOAD( "epr-1243.cpu-ic74", 0x4000, 0x0800, CRC(29854c48) SHA1(cab89bc30f83d9746931ddf6f95a6d0c8a517e5d) ) + + ROM_REGION( 0x1020, REGION_PROMS, 0 ) /* various PROMs */ + ROM_LOAD( "pr-1114.prom-ic13", 0x0000, 0x0020, CRC(78aded46) SHA1(c78afe804f8b8e837b0c502de5b8715a41fb92b9) ) /* road red/green color table */ + ROM_LOAD( "pr-1115.prom-ic18", 0x0020, 0x0020, CRC(5394092c) SHA1(129ff61104979ff6a3c3af8bf81c04ae9b133c9e) ) /* road collision/enable */ + ROM_LOAD( "pr-1116.prom-ic20", 0x0040, 0x0020, CRC(3956767d) SHA1(073aaf57175526660fcf7af2e16e7f1d1aaba9a9) ) /* collision detection */ + ROM_LOAD( "pr-1117.prom-ic21", 0x0060, 0x0020, CRC(f06d9907) SHA1(f11db7800f41b03e79f5eef8d7ef3ae0a6277518) ) /* road green/blue color table */ + ROM_LOAD( "pr-1118.cpu-ic99", 0x0100, 0x0100, CRC(07324cfd) SHA1(844abc2042d6810fa34d84ff1ed57744886c6ea6) ) /* background color table */ + ROM_LOAD( "pr-1119.cpu-ic50", 0x0200, 0x0200, CRC(57ebd4bc) SHA1(932649da3537666f95833a8a8aff506217bd9aa1) ) /* sprite Y scaling */ + ROM_LOAD( "pr-1120.cpu-ic62", 0x0400, 0x0200, CRC(8dd4c8a8) SHA1(e8d9cf08f115d57c44746fa0ff28f47b064b4193) ) /* video timing */ + ROM_LOAD( "pr-1121.prom-ic29", 0x0600, 0x0200, CRC(7692f497) SHA1(42468c0705df9928e15ff8deb7e793a6c0c04353) ) /* palette */ + ROM_LOAD( "pr-1122.prom-ic11", 0x0800, 0x0400, CRC(1a86ce70) SHA1(cab708b9a089b2e28f2298c1e4fae6e200923527) ) /* sprite priorities */ + ROM_LOAD( "pr-1123.prom-ic12", 0x0c00, 0x0400, CRC(02d2cb52) SHA1(c34d6b60355747ce20fcb8d322df0e188d187f10) ) /* sprite/road/background priorities */ + ROM_LOAD( "pr-1279.sound-ic40", 0x1000, 0x0020, CRC(b369a6ae) SHA1(dda7c6cf58ce5173f29a3084c85393c0c4587086) ) /* sound board PROM */ ROM_END ROM_START( turbob ) - ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "epr-1363.cpu", 0x0000, 0x2000, CRC(5c110fb6) SHA1(fdcdf488bd112db12aa22c4b7e9f34004185d4ce) ) - ROM_LOAD( "epr-1364.cpu", 0x2000, 0x2000, CRC(6a341693) SHA1(428927c4a14bf82225875012c255d25dcffaf2ab) ) - ROM_LOAD( "epr-1365.cpu", 0x4000, 0x2000, CRC(3b6b0dc8) SHA1(3ebfa3f9fabd444ee105591acb6984b6b3523725) ) + ROM_REGION( 0x6000, REGION_CPU1, 0 ) /* 64k for code */ + ROM_LOAD( "epr-1363.cpu-ic76", 0x0000, 0x2000, CRC(5c110fb6) SHA1(fdcdf488bd112db12aa22c4b7e9f34004185d4ce) ) + ROM_LOAD( "epr-1364.cpu-ic89", 0x2000, 0x2000, CRC(6a341693) SHA1(428927c4a14bf82225875012c255d25dcffaf2ab) ) + ROM_LOAD( "epr-1365.cpu-ic103", 0x4000, 0x2000, CRC(3b6b0dc8) SHA1(3ebfa3f9fabd444ee105591acb6984b6b3523725) ) ROM_REGION( 0x20000, REGION_GFX1, 0 ) /* sprite data */ - ROM_LOAD( "epr1246.rom", 0x00000, 0x2000, CRC(555bfe9a) SHA1(1e56385475eeff044dcd9b44a154991d3efe995e) ) /* level 0 */ - ROM_RELOAD( 0x02000, 0x2000 ) - ROM_LOAD( "mpr1290.rom", 0x04000, 0x2000, CRC(95182020) SHA1(cd392a311da222727ce92801cb9d926ccdb08797) ) /* is this good? */ - ROM_RELOAD( 0x06000, 0x2000 ) - ROM_LOAD( "epr1248.rom", 0x08000, 0x2000, CRC(82fe5b94) SHA1(b96688ca0cfd90fdc4ee7c2e6c0b66726cc5713c) ) /* level 2 */ - ROM_RELOAD( 0x0a000, 0x2000 ) - ROM_LOAD( "mpr1291.rom", 0x0c000, 0x2000, CRC(0e857f82) SHA1(fbf0dcd11fd4fa09235c3f05d8e284b7dcc8f303) ) /* is this good? */ - ROM_LOAD( "epr1250.rom", 0x0e000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - ROM_LOAD( "epr1251.rom", 0x10000, 0x2000, CRC(292573de) SHA1(3ddc980d11478a6a6e4082c2f76c1ab82ffe2f36) ) /* level 4 */ - ROM_LOAD( "epr1252.rom", 0x12000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - ROM_LOAD( "epr1253.rom", 0x14000, 0x2000, CRC(92783626) SHA1(13979eb964112436182d2a92f21803bcc28f4a4a) ) /* level 5 */ - ROM_LOAD( "epr1254.rom", 0x16000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - ROM_LOAD( "epr1255.rom", 0x18000, 0x2000, CRC(485dcef9) SHA1(0f760ebb42cc2580a29758c72428a41d74477ce6) ) /* level 6 */ - ROM_LOAD( "epr1256.rom", 0x1a000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - ROM_LOAD( "epr1257.rom", 0x1c000, 0x2000, CRC(4ca984ce) SHA1(99f294fb203f23929b44baa2dd1825c67dde08a1) ) /* level 7 */ - ROM_LOAD( "epr1258.rom", 0x1e000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) - - ROM_REGION( 0x1000, REGION_GFX2, 0 ) /* foreground data */ - ROM_LOAD( "epr1244.rom", 0x0000, 0x0800, CRC(17f67424) SHA1(6126562510f1509f3487faaa3b9d7470ab600a2c) ) - ROM_LOAD( "epr1245.rom", 0x0800, 0x0800, CRC(2ba0b46b) SHA1(5d4d4f19ad7a911c7b37db190a420faf665546b4) ) + ROM_LOAD( "epr-1246.prom-ic84", 0x00000, 0x2000, CRC(555bfe9a) SHA1(1e56385475eeff044dcd9b44a154991d3efe995e) ) /* level 0 */ + ROM_RELOAD( 0x02000, 0x2000 ) + ROM_LOAD( "epr-1247.prom-ic86", 0x04000, 0x2000, CRC(c8c5e4d5) SHA1(da70297340ddea0cd7fe04f2d94ea65f8202d0e5) ) /* level 1 */ + ROM_RELOAD( 0x06000, 0x2000 ) + ROM_LOAD( "epr-1248.prom-ic88", 0x08000, 0x2000, CRC(82fe5b94) SHA1(b96688ca0cfd90fdc4ee7c2e6c0b66726cc5713c) ) /* level 2 */ + ROM_RELOAD( 0x0a000, 0x2000 ) + ROM_LOAD( "epr-1249.prom-ic90", 0x0c000, 0x2000, CRC(e258e009) SHA1(598d382db0f789ea2fde749b7467abed545de25a) ) /* level 3 */ + ROM_LOAD( "epr-1250.prom-ic108",0x0e000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + ROM_LOAD( "epr-1251.prom-ic92", 0x10000, 0x2000, CRC(292573de) SHA1(3ddc980d11478a6a6e4082c2f76c1ab82ffe2f36) ) /* level 4 */ + ROM_LOAD( "epr-1252.prom-ic110",0x12000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + ROM_LOAD( "epr-1253.prom-ic94", 0x14000, 0x2000, CRC(92783626) SHA1(13979eb964112436182d2a92f21803bcc28f4a4a) ) /* level 5 */ + ROM_LOAD( "epr-1254.prom-ic112",0x16000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + ROM_LOAD( "epr-1255.prom-ic32", 0x18000, 0x2000, CRC(485dcef9) SHA1(0f760ebb42cc2580a29758c72428a41d74477ce6) ) /* level 6 */ + ROM_LOAD( "epr-1256.prom-ic47", 0x1a000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + ROM_LOAD( "epr-1257.prom-ic34", 0x1c000, 0x2000, CRC(4ca984ce) SHA1(99f294fb203f23929b44baa2dd1825c67dde08a1) ) /* level 7 */ + ROM_LOAD( "epr-1258.prom-ic49", 0x1e000, 0x2000, CRC(aee6e05e) SHA1(99b9b1ec996746ddf713ed38192f350f1f32a847) ) + + ROM_REGION( 0x1000, REGION_GFX2, ROMREGION_DISPOSE ) /* foreground data */ + ROM_LOAD( "epr-1244.cpu-ic111", 0x0000, 0x0800, CRC(17f67424) SHA1(6126562510f1509f3487faaa3b9d7470ab600a2c) ) + ROM_LOAD( "epr-1245.cpu-ic122", 0x0800, 0x0800, CRC(2ba0b46b) SHA1(5d4d4f19ad7a911c7b37db190a420faf665546b4) ) ROM_REGION( 0x4800, REGION_GFX3, 0 ) /* road data */ - ROM_LOAD( "epr1125.rom", 0x0000, 0x0800, CRC(65b5d44b) SHA1(bbdd5db013c9d876e9666f17c48569c7531bfc08) ) - ROM_LOAD( "epr1126.rom", 0x0800, 0x0800, CRC(685ace1b) SHA1(99c8d36ac910169b27676d18c894433c2ba44853) ) - ROM_LOAD( "epr1127.rom", 0x1000, 0x0800, CRC(9233c9ca) SHA1(cbf9a0f564d8ace1ccd701c1769dbc001d465851) ) - ROM_LOAD( "epr1238.rom", 0x1800, 0x0800, CRC(d94fd83f) SHA1(1e3a68259d2ede623d5a7306fdf693a4eab301f0) ) - ROM_LOAD( "epr1239.rom", 0x2000, 0x0800, CRC(4c41124f) SHA1(d73a9441552c77fb3078553195794311a950d589) ) - ROM_LOAD( "epr1240.rom", 0x2800, 0x0800, CRC(371d6282) SHA1(f5902b357d976822d46aa6404b7bd30855d435a9) ) - ROM_LOAD( "epr1241.rom", 0x3000, 0x0800, CRC(1109358a) SHA1(27a5351a4e87309671e72115299420315a93dba6) ) - ROM_LOAD( "epr1242.rom", 0x3800, 0x0800, CRC(04866769) SHA1(1f9c0d53766fdaf8de57d3df05f291c2ca3dc5fb) ) - ROM_LOAD( "epr1243.rom", 0x4000, 0x0800, CRC(29854c48) SHA1(cab89bc30f83d9746931ddf6f95a6d0c8a517e5d) ) - - ROM_REGION( 0x1000, REGION_PROMS, 0 ) /* various PROMs */ - ROM_LOAD( "pr1121.bin", 0x0000, 0x0200, CRC(7692f497) SHA1(42468c0705df9928e15ff8deb7e793a6c0c04353) ) /* palette */ - ROM_LOAD( "pr1122.bin", 0x0200, 0x0400, CRC(1a86ce70) SHA1(cab708b9a089b2e28f2298c1e4fae6e200923527) ) /* sprite priorities */ - ROM_LOAD( "pr1123.bin", 0x0600, 0x0400, CRC(02d2cb52) SHA1(c34d6b60355747ce20fcb8d322df0e188d187f10) ) /* sprite/road/background priorities */ - ROM_LOAD( "pr-1118.bin", 0x0a00, 0x0100, CRC(07324cfd) SHA1(844abc2042d6810fa34d84ff1ed57744886c6ea6) ) /* background color table */ - ROM_LOAD( "pr1114.bin", 0x0b00, 0x0020, CRC(78aded46) SHA1(c78afe804f8b8e837b0c502de5b8715a41fb92b9) ) /* road red/green color table */ - ROM_LOAD( "pr1117.bin", 0x0b20, 0x0020, CRC(f06d9907) SHA1(f11db7800f41b03e79f5eef8d7ef3ae0a6277518) ) /* road green/blue color table */ - ROM_LOAD( "pr1115.bin", 0x0b40, 0x0020, CRC(5394092c) SHA1(129ff61104979ff6a3c3af8bf81c04ae9b133c9e) ) /* road collision/enable */ - ROM_LOAD( "pr1116.bin", 0x0b60, 0x0020, CRC(3956767d) SHA1(073aaf57175526660fcf7af2e16e7f1d1aaba9a9) ) /* collision detection */ - ROM_LOAD( "sndprom.bin", 0x0b80, 0x0020, CRC(b369a6ae) SHA1(dda7c6cf58ce5173f29a3084c85393c0c4587086) ) - ROM_LOAD( "pr-1119.bin", 0x0c00, 0x0200, CRC(628d3f1d) SHA1(570f8999603d02e52106ec2df203f63edfb883dd) ) /* timing - not used */ - ROM_LOAD( "pr-1120.bin", 0x0e00, 0x0200, CRC(591b6a68) SHA1(85de39d9e14a1f0c65c1308c27a106e3c2dd9b5b) ) /* timing - not used */ + ROM_LOAD( "epr-1125.cpu-ic1", 0x0000, 0x0800, CRC(65b5d44b) SHA1(bbdd5db013c9d876e9666f17c48569c7531bfc08) ) + ROM_LOAD( "epr-1126.cpu-ic2", 0x0800, 0x0800, CRC(685ace1b) SHA1(99c8d36ac910169b27676d18c894433c2ba44853) ) + ROM_LOAD( "epr-1127.cpu-ic13", 0x1000, 0x0800, CRC(9233c9ca) SHA1(cbf9a0f564d8ace1ccd701c1769dbc001d465851) ) + ROM_LOAD( "epr-1238.cpu-ic14", 0x1800, 0x0800, CRC(d94fd83f) SHA1(1e3a68259d2ede623d5a7306fdf693a4eab301f0) ) + ROM_LOAD( "epr-1239.cpu-ic27", 0x2000, 0x0800, CRC(4c41124f) SHA1(d73a9441552c77fb3078553195794311a950d589) ) + ROM_LOAD( "epr-1240.cpu-ic28", 0x2800, 0x0800, CRC(371d6282) SHA1(f5902b357d976822d46aa6404b7bd30855d435a9) ) + ROM_LOAD( "epr-1241.cpu-ic41", 0x3000, 0x0800, CRC(1109358a) SHA1(27a5351a4e87309671e72115299420315a93dba6) ) + ROM_LOAD( "epr-1242.cpu-ic42", 0x3800, 0x0800, CRC(04866769) SHA1(1f9c0d53766fdaf8de57d3df05f291c2ca3dc5fb) ) + ROM_LOAD( "epr-1243.cpu-ic74", 0x4000, 0x0800, CRC(29854c48) SHA1(cab89bc30f83d9746931ddf6f95a6d0c8a517e5d) ) + + ROM_REGION( 0x1020, REGION_PROMS, 0 ) /* various PROMs */ + ROM_LOAD( "pr-1114.prom-ic13", 0x0000, 0x0020, CRC(78aded46) SHA1(c78afe804f8b8e837b0c502de5b8715a41fb92b9) ) /* road red/green color table */ + ROM_LOAD( "pr-1115.prom-ic18", 0x0020, 0x0020, CRC(5394092c) SHA1(129ff61104979ff6a3c3af8bf81c04ae9b133c9e) ) /* road collision/enable */ + ROM_LOAD( "pr-1116.prom-ic20", 0x0040, 0x0020, CRC(3956767d) SHA1(073aaf57175526660fcf7af2e16e7f1d1aaba9a9) ) /* collision detection */ + ROM_LOAD( "pr-1117.prom-ic21", 0x0060, 0x0020, CRC(f06d9907) SHA1(f11db7800f41b03e79f5eef8d7ef3ae0a6277518) ) /* road green/blue color table */ + ROM_LOAD( "pr-1118.cpu-ic99", 0x0100, 0x0100, CRC(07324cfd) SHA1(844abc2042d6810fa34d84ff1ed57744886c6ea6) ) /* background color table */ + ROM_LOAD( "pr-1119.cpu-ic50", 0x0200, 0x0200, CRC(57ebd4bc) SHA1(932649da3537666f95833a8a8aff506217bd9aa1) ) /* sprite Y scaling */ + ROM_LOAD( "pr-1120.cpu-ic62", 0x0400, 0x0200, CRC(8dd4c8a8) SHA1(e8d9cf08f115d57c44746fa0ff28f47b064b4193) ) /* video timing */ + ROM_LOAD( "pr-1121.prom-ic29", 0x0600, 0x0200, CRC(7692f497) SHA1(42468c0705df9928e15ff8deb7e793a6c0c04353) ) /* palette */ + ROM_LOAD( "pr-1122.prom-ic11", 0x0800, 0x0400, CRC(1a86ce70) SHA1(cab708b9a089b2e28f2298c1e4fae6e200923527) ) /* sprite priorities */ + ROM_LOAD( "pr-1123.prom-ic12", 0x0c00, 0x0400, CRC(02d2cb52) SHA1(c34d6b60355747ce20fcb8d322df0e188d187f10) ) /* sprite/road/background priorities */ + ROM_LOAD( "pr-1279.sound-ic40", 0x1000, 0x0020, CRC(b369a6ae) SHA1(dda7c6cf58ce5173f29a3084c85393c0c4587086) ) /* sound board PROM */ ROM_END ROM_START( subroc3d ) - ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "epr1614a.88", 0x0000, 0x2000, CRC(0ed856b4) SHA1(c2f48170365a53bff312ca20df5b74466de6349a) ) - ROM_LOAD( "epr1615.87", 0x2000, 0x2000, CRC(6281eb2e) SHA1(591d7f184f51f33fb583c916eddacf4581d612d7) ) - ROM_LOAD( "epr1616.86", 0x4000, 0x2000, CRC(cc7b0c9b) SHA1(0b44c9a2421a51bdc16a2b590f24fbbfb47ef86f) ) + ROM_REGION( 0xa000, REGION_CPU1, 0 ) + ROM_LOAD( "epr-1614a.cpu-ic88", 0x0000, 0x2000, CRC(0ed856b4) SHA1(c2f48170365a53bff312ca20df5b74466de6349a) ) + ROM_LOAD( "epr-1615.cpu-ic87", 0x2000, 0x2000, CRC(6281eb2e) SHA1(591d7f184f51f33fb583c916eddacf4581d612d7) ) + ROM_LOAD( "epr-1616.cpu-ic86", 0x4000, 0x2000, CRC(cc7b0c9b) SHA1(0b44c9a2421a51bdc16a2b590f24fbbfb47ef86f) ) ROM_REGION( 0x40000, REGION_GFX1, 0 ) /* sprite data */ - ROM_LOAD( "epr1417.29", 0x00000, 0x2000, CRC(2aaff4e0) SHA1(4b4e4f65d63fb9648108c5f01248ffcb3b4bc54f) ) /* level 0 */ - ROM_LOAD( "epr1418.30", 0x02000, 0x2000, CRC(41ff0f15) SHA1(c441c5368a3faf2544d617e1ceb5cb8eac23017d) ) - ROM_LOAD( "epr1419.55", 0x08000, 0x2000, CRC(37ac818c) SHA1(26b15f410c6a6dcde498e20cece973d5ba23b0de) ) /* level 1 */ - ROM_LOAD( "epr1420.56", 0x0a000, 0x2000, CRC(41ff0f15) SHA1(c441c5368a3faf2544d617e1ceb5cb8eac23017d) ) - ROM_LOAD( "epr1422.81", 0x10000, 0x2000, CRC(0221db58) SHA1(8a157168610bf867a038229ad345de8f95741d04) ) /* level 2 */ - ROM_LOAD( "epr1423.82", 0x12000, 0x2000, CRC(08b1a4b8) SHA1(8e64228911863bf93fdf8a17a2ddca739fb20cd6) ) - ROM_LOAD( "epr1421.80", 0x16000, 0x2000, CRC(1db33c09) SHA1(1b2ec0c15fb178bed7cd2c877a6679ac6c59955c) ) - ROM_LOAD( "epr1425.107", 0x18000, 0x2000, CRC(0221db58) SHA1(8a157168610bf867a038229ad345de8f95741d04) ) /* level 3 */ - ROM_LOAD( "epr1426.108", 0x1a000, 0x2000, CRC(08b1a4b8) SHA1(8e64228911863bf93fdf8a17a2ddca739fb20cd6) ) - ROM_LOAD( "epr1424.106", 0x1e000, 0x2000, CRC(1db33c09) SHA1(1b2ec0c15fb178bed7cd2c877a6679ac6c59955c) ) - ROM_LOAD( "epr1664.116", 0x20000, 0x2000, CRC(6c93ece7) SHA1(b6523f08862f70743422283d7d46e226994add8c) ) /* level 4 */ - ROM_LOAD( "epr1427.115", 0x22000, 0x2000, CRC(2f8cfc2d) SHA1(1ee1b57cf7133aee5c12d654112883af36dff2fa) ) - ROM_LOAD( "epr1429.117", 0x26000, 0x2000, CRC(80e649c7) SHA1(433c847e05a072af8fd7a4d1f50ad856f569c0a6) ) - ROM_LOAD( "epr1665.90", 0x28000, 0x2000, CRC(6c93ece7) SHA1(b6523f08862f70743422283d7d46e226994add8c) ) /* level 5 */ - ROM_LOAD( "epr1430.89", 0x2a000, 0x2000, CRC(2f8cfc2d) SHA1(1ee1b57cf7133aee5c12d654112883af36dff2fa) ) - ROM_LOAD( "epr1432.91", 0x2e000, 0x2000, CRC(d9cd98d0) SHA1(4e1c135ea19375c6a97aac3d134572a45972c56a) ) - ROM_LOAD( "epr1666.64", 0x30000, 0x2000, CRC(6c93ece7) SHA1(b6523f08862f70743422283d7d46e226994add8c) ) /* level 6 */ - ROM_LOAD( "epr1433.63", 0x32000, 0x2000, CRC(2f8cfc2d) SHA1(1ee1b57cf7133aee5c12d654112883af36dff2fa) ) - ROM_LOAD( "epr1436.66", 0x34000, 0x2000, CRC(fc4ad926) SHA1(bf6659ac9eaf5e85bc73848ab4e0c6c7413b55a8) ) - ROM_LOAD( "epr1435.65", 0x36000, 0x2000, CRC(40662eef) SHA1(23bf268ea93288af90bd0e8d6f506a5b92490829) ) - ROM_LOAD( "epr1438.38", 0x38000, 0x2000, CRC(d563d4c1) SHA1(81ebb65c3c0a44aaddf6895a80533436b87a15c7) ) /* level 7 */ - ROM_LOAD( "epr1437.37", 0x3a000, 0x2000, CRC(18ba6aad) SHA1(b959f09739909b835d790928f35b7f7e6bd52c31) ) - ROM_LOAD( "epr1440.40", 0x3c000, 0x2000, CRC(3a0e659c) SHA1(51e64b2417cf3b599aa9ecc84457462a5dca2a61) ) - ROM_LOAD( "epr1439.39", 0x3e000, 0x2000, CRC(3d051668) SHA1(aa4f6152235f07ad39019c46dfacf69d70a7fdcc) ) - - ROM_REGION( 0x01000, REGION_GFX2, 0 ) /* foreground data */ - ROM_LOAD( "epr1618.82", 0x0000, 0x0800, CRC(a25fea71) SHA1(283efee3951d081119d756114f9f49c2996de5f2) ) - ROM_LOAD( "epr1617.83", 0x0800, 0x0800, CRC(f70c678e) SHA1(1fabf0011fa4fefd29daf18d4ed6b2cbec14e7b7) ) - - ROM_REGION( 0x01000, REGION_PROMS, 0 ) /* various PROMs */ - ROM_LOAD( "pr1419.108", 0x00000, 0x0200, CRC(2cfa2a3f) SHA1(7e2ed2f4ef3324c41da153828c7976e7ba91af7c) ) /* color prom */ - ROM_LOAD( "pr1620.62", 0x00200, 0x0100, CRC(0ab7ef09) SHA1(b89f8889e2c1220b381e1d6ecc4105cb4152e350) ) /* char color palette */ - ROM_LOAD( "pr1449.14", 0x00300, 0x0200, CRC(5eb9ff47) SHA1(b8b1e7cfb8aa380663684df6090c48c7c57a6d50) ) /* ??? */ - ROM_LOAD( "pr1450.21", 0x00500, 0x0200, CRC(66bdb00c) SHA1(3956647b27a73770bd163eb7ad29fcd9243dac83) ) /* sprite priority */ - ROM_LOAD( "pr1451.58", 0x00700, 0x0200, CRC(6a575261) SHA1(79f690db671e471153cbdf1939e733da74fcdc08) ) /* ??? */ - ROM_LOAD( "pr1453.39", 0x00900, 0x0020, CRC(181c6d23) SHA1(4749b205cbaa513ee65a644946235d2cfe275648) ) /* ??? */ - ROM_LOAD( "pr1454.67", 0x00920, 0x0020, CRC(dc683440) SHA1(8469914d364dc8f9d0839cae3c864de3b2f3c8df) ) /* ??? */ + ROM_LOAD( "epr-1417.prom-ic29", 0x00000, 0x2000, CRC(2aaff4e0) SHA1(4b4e4f65d63fb9648108c5f01248ffcb3b4bc54f) ) /* level 0 */ + ROM_LOAD( "epr-1418.prom-ic30", 0x02000, 0x2000, CRC(41ff0f15) SHA1(c441c5368a3faf2544d617e1ceb5cb8eac23017d) ) + ROM_LOAD( "epr-1419.prom-ic55", 0x08000, 0x2000, CRC(37ac818c) SHA1(26b15f410c6a6dcde498e20cece973d5ba23b0de) ) /* level 1 */ + ROM_LOAD( "epr-1420.prom-ic56", 0x0a000, 0x2000, CRC(41ff0f15) SHA1(c441c5368a3faf2544d617e1ceb5cb8eac23017d) ) + ROM_LOAD( "epr-1422.prom-ic81", 0x10000, 0x2000, CRC(0221db58) SHA1(8a157168610bf867a038229ad345de8f95741d04) ) /* level 2 */ + ROM_LOAD( "epr-1423.prom-ic82", 0x12000, 0x2000, CRC(08b1a4b8) SHA1(8e64228911863bf93fdf8a17a2ddca739fb20cd6) ) + ROM_LOAD( "epr-1421.prom-ic80", 0x16000, 0x2000, CRC(1db33c09) SHA1(1b2ec0c15fb178bed7cd2c877a6679ac6c59955c) ) + ROM_LOAD( "epr-1425.prom-ic107", 0x18000, 0x2000, CRC(0221db58) SHA1(8a157168610bf867a038229ad345de8f95741d04) ) /* level 3 */ + ROM_LOAD( "epr-1426.prom-ic108", 0x1a000, 0x2000, CRC(08b1a4b8) SHA1(8e64228911863bf93fdf8a17a2ddca739fb20cd6) ) + ROM_LOAD( "epr-1424.prom-ic106", 0x1e000, 0x2000, CRC(1db33c09) SHA1(1b2ec0c15fb178bed7cd2c877a6679ac6c59955c) ) + ROM_LOAD( "epr-1664.prom-ic116", 0x20000, 0x2000, CRC(6c93ece7) SHA1(b6523f08862f70743422283d7d46e226994add8c) ) /* level 4 */ + ROM_LOAD( "epr-1427.prom-ic115", 0x22000, 0x2000, CRC(2f8cfc2d) SHA1(1ee1b57cf7133aee5c12d654112883af36dff2fa) ) + ROM_LOAD( "epr-1429.prom-ic117", 0x26000, 0x2000, CRC(80e649c7) SHA1(433c847e05a072af8fd7a4d1f50ad856f569c0a6) ) + ROM_LOAD( "epr-1665.prom-ic90", 0x28000, 0x2000, CRC(6c93ece7) SHA1(b6523f08862f70743422283d7d46e226994add8c) ) /* level 5 */ + ROM_LOAD( "epr-1430.prom-ic89", 0x2a000, 0x2000, CRC(2f8cfc2d) SHA1(1ee1b57cf7133aee5c12d654112883af36dff2fa) ) + ROM_LOAD( "epr-1432.prom-ic91", 0x2e000, 0x2000, CRC(d9cd98d0) SHA1(4e1c135ea19375c6a97aac3d134572a45972c56a) ) + ROM_LOAD( "epr-1666.prom-ic64", 0x30000, 0x2000, CRC(6c93ece7) SHA1(b6523f08862f70743422283d7d46e226994add8c) ) /* level 6 */ + ROM_LOAD( "epr-1433.prom-ic63", 0x32000, 0x2000, CRC(2f8cfc2d) SHA1(1ee1b57cf7133aee5c12d654112883af36dff2fa) ) + ROM_LOAD( "epr-1436.prom-ic66", 0x34000, 0x2000, CRC(fc4ad926) SHA1(bf6659ac9eaf5e85bc73848ab4e0c6c7413b55a8) ) + ROM_LOAD( "epr-1435.prom-ic65", 0x36000, 0x2000, CRC(40662eef) SHA1(23bf268ea93288af90bd0e8d6f506a5b92490829) ) + ROM_LOAD( "epr-1438.prom-ic38", 0x38000, 0x2000, CRC(d563d4c1) SHA1(81ebb65c3c0a44aaddf6895a80533436b87a15c7) ) /* level 7 */ + ROM_LOAD( "epr-1437.prom-ic37", 0x3a000, 0x2000, CRC(18ba6aad) SHA1(b959f09739909b835d790928f35b7f7e6bd52c31) ) + ROM_LOAD( "epr-1440.prom-ic40", 0x3c000, 0x2000, CRC(3a0e659c) SHA1(51e64b2417cf3b599aa9ecc84457462a5dca2a61) ) + ROM_LOAD( "epr-1439.prom-ic39", 0x3e000, 0x2000, CRC(3d051668) SHA1(aa4f6152235f07ad39019c46dfacf69d70a7fdcc) ) + + ROM_REGION( 0x01000, REGION_GFX2, ROMREGION_DISPOSE ) /* foreground data */ + ROM_LOAD( "epr-1618.cpu-ic82", 0x0000, 0x0800, CRC(a25fea71) SHA1(283efee3951d081119d756114f9f49c2996de5f2) ) + ROM_LOAD( "epr-1617.cpu-ic83", 0x0800, 0x0800, CRC(f70c678e) SHA1(1fabf0011fa4fefd29daf18d4ed6b2cbec14e7b7) ) + + ROM_REGION( 0x0a00, REGION_PROMS, 0 ) /* various PROMs */ + ROM_LOAD( "pr-1419.cpu-ic108", 0x00000, 0x0200, CRC(2cfa2a3f) SHA1(7e2ed2f4ef3324c41da153828c7976e7ba91af7c) ) /* color prom */ + ROM_LOAD( "pr-1620.cpu-ic62", 0x00200, 0x0100, CRC(0ab7ef09) SHA1(b89f8889e2c1220b381e1d6ecc4105cb4152e350) ) /* char color palette */ + ROM_LOAD( "pr-1449.cpu-ic5", 0x00300, 0x0200, CRC(5eb9ff47) SHA1(b8b1e7cfb8aa380663684df6090c48c7c57a6d50) ) /* sprite Y scaling */ + ROM_LOAD( "pr-1450.cpu-ic21", 0x00500, 0x0200, CRC(66bdb00c) SHA1(3956647b27a73770bd163eb7ad29fcd9243dac83) ) /* sprite priority */ + ROM_LOAD( "pr-1451.cpu-ic58", 0x00700, 0x0200, CRC(6a575261) SHA1(79f690db671e471153cbdf1939e733da74fcdc08) ) /* video timing */ + ROM_LOAD( "pr-1453.cpu-ic39", 0x00900, 0x0020, CRC(181c6d23) SHA1(4749b205cbaa513ee65a644946235d2cfe275648) ) /* sprite state machine */ + ROM_LOAD( "pr-1454.cpu-ic67", 0x00920, 0x0020, CRC(dc683440) SHA1(8469914d364dc8f9d0839cae3c864de3b2f3c8df) ) /* flipped tilemap addressing */ ROM_END ROM_START( buckrog ) - ROM_REGION( 2*0x10000, REGION_CPU1, 0 ) /* 64k for code + 64k for decrypted opcodes */ - ROM_LOAD( "br-3.bin", 0x0000, 0x4000, CRC(f0055e97) SHA1(f6ee2afd6fef710949087d1cb04cbc242d1fa9f5) ) /* encrypted */ - ROM_LOAD( "br-4.bin", 0x4000, 0x4000, CRC(7d084c39) SHA1(ef2c0a2a59e14d9e196fd3837139fc5acf0f63be) ) /* encrypted */ + ROM_REGION( 0xc000, REGION_CPU1, 0 ) + ROM_LOAD( "cpu-ic3", 0x0000, 0x4000, CRC(f0055e97) SHA1(f6ee2afd6fef710949087d1cb04cbc242d1fa9f5) ) /* encrypted */ + ROM_LOAD( "cpu-ic4", 0x4000, 0x4000, CRC(7d084c39) SHA1(ef2c0a2a59e14d9e196fd3837139fc5acf0f63be) ) /* encrypted */ - ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for code */ - ROM_LOAD( "5200.66", 0x0000, 0x1000, CRC(0d58b154) SHA1(9f3951eb7ea1fa9ff914738462e4b4f755d60802) ) + ROM_REGION( 0x2000, REGION_CPU2, 0 ) + ROM_LOAD( "epr-5200.cpu-ic66", 0x0000, 0x1000, CRC(0d58b154) SHA1(9f3951eb7ea1fa9ff914738462e4b4f755d60802) ) ROM_REGION( 0x40000, REGION_GFX1, 0 ) /* sprite data */ - ROM_LOAD( "5216.100", 0x00000, 0x2000, CRC(8155bd73) SHA1(b6814f03eafe16457655598685b4827456b86335) ) /* level 0 */ - ROM_LOAD( "5213.84", 0x08000, 0x2000, CRC(fd78dda4) SHA1(4328b5782cbe692765eac43a8eba40bdf2e41921) ) /* level 1 */ - ROM_LOAD( "ic68", 0x10000, 0x4000, CRC(2a194270) SHA1(8d4e444bd8a4e2fa32099787849e6c02cffe49b0) ) /* level 2 */ - ROM_LOAD( "ic52", 0x18000, 0x4000, CRC(b31a120f) SHA1(036cdf56cb43b892609a8f793d5ca66940bf128e) ) /* level 3 */ - ROM_LOAD( "ic43", 0x20000, 0x4000, CRC(d3584926) SHA1(7ad410ad84447a3edba2c51c4ec4314a117fffe7) ) /* level 4 */ - ROM_LOAD( "ic59", 0x28000, 0x4000, CRC(d83c7fcf) SHA1(4c4a590762ef87a3057a12e8d4310decbeb8613c) ) /* level 5 */ - ROM_LOAD( "5208.58", 0x2c000, 0x2000, CRC(d181fed2) SHA1(fd46e609b7e04d0661c84ad0faa616d75b8ba89f) ) - ROM_LOAD( "ic75", 0x30000, 0x4000, CRC(1bd6e453) SHA1(472fbc7add05b96e368b961c5ef7ef27f3896216) ) /* level 6 */ - ROM_LOAD( "5239.74", 0x34000, 0x2000, CRC(c34e9b82) SHA1(9e69fe9dcc631783e43abe356657f3c6a6a533d8) ) - ROM_LOAD( "ic91", 0x38000, 0x4000, CRC(221f4ced) SHA1(07498c9105c4c4589b19c2bc36abafb176de7bda) ) /* level 7 */ - ROM_LOAD( "5238.90", 0x3c000, 0x2000, CRC(7aff0886) SHA1(09ed9fa973257bb23b488e02ef9e02d867e4c366) ) - - ROM_REGION( 0x01000, REGION_GFX2, 0 ) /* foreground data */ - ROM_LOAD( "5201.102", 0x0000, 0x0800, CRC(7f21b0a4) SHA1(b6d784031ffecb36863ae1d81eeaaf8f76ab83df) ) - ROM_LOAD( "5202.103", 0x0800, 0x0800, CRC(43f3e5a7) SHA1(2714943b6720311c5d226db3b6fe95d072677793) ) + ROM_LOAD( "epr-5216.prom-ic100", 0x00000, 0x2000, CRC(8155bd73) SHA1(b6814f03eafe16457655598685b4827456b86335) ) /* level 0 */ + ROM_LOAD( "epr-5213.prom-ic84", 0x08000, 0x2000, CRC(fd78dda4) SHA1(4328b5782cbe692765eac43a8eba40bdf2e41921) ) /* level 1 */ + ROM_LOAD( "prom-ic68", 0x10000, 0x4000, CRC(2a194270) SHA1(8d4e444bd8a4e2fa32099787849e6c02cffe49b0) ) /* level 2 */ + ROM_LOAD( "prom-ic52", 0x18000, 0x4000, CRC(b31a120f) SHA1(036cdf56cb43b892609a8f793d5ca66940bf128e) ) /* level 3 */ + ROM_LOAD( "prom-ic43", 0x20000, 0x4000, CRC(d3584926) SHA1(7ad410ad84447a3edba2c51c4ec4314a117fffe7) ) /* level 4 */ + ROM_LOAD( "prom-ic59", 0x28000, 0x4000, CRC(d83c7fcf) SHA1(4c4a590762ef87a3057a12e8d4310decbeb8613c) ) /* level 5 */ + ROM_LOAD( "epr-5208.prom-ic58", 0x2c000, 0x2000, CRC(d181fed2) SHA1(fd46e609b7e04d0661c84ad0faa616d75b8ba89f) ) + ROM_LOAD( "prom-ic75", 0x30000, 0x4000, CRC(1bd6e453) SHA1(472fbc7add05b96e368b961c5ef7ef27f3896216) ) /* level 6 */ + ROM_LOAD( "epr-5239.prom-ic74", 0x34000, 0x2000, CRC(c34e9b82) SHA1(9e69fe9dcc631783e43abe356657f3c6a6a533d8) ) + ROM_LOAD( "prom-ic91", 0x38000, 0x4000, CRC(221f4ced) SHA1(07498c9105c4c4589b19c2bc36abafb176de7bda) ) /* level 7 */ + ROM_LOAD( "epr-5238.prom-ic90", 0x3c000, 0x2000, CRC(7aff0886) SHA1(09ed9fa973257bb23b488e02ef9e02d867e4c366) ) + + ROM_REGION( 0x01000, REGION_GFX2, ROMREGION_DISPOSE ) /* foreground data */ + ROM_LOAD( "epr-5201.cpu-ic102", 0x0000, 0x0800, CRC(7f21b0a4) SHA1(b6d784031ffecb36863ae1d81eeaaf8f76ab83df) ) + ROM_LOAD( "epr-5202.cpu-ic103", 0x0800, 0x0800, CRC(43f3e5a7) SHA1(2714943b6720311c5d226db3b6fe95d072677793) ) ROM_REGION( 0x2000, REGION_GFX3, 0 ) /* background color data */ - ROM_LOAD( "5203.91", 0x0000, 0x2000, CRC(631f5b65) SHA1(ce8b23cf97f7e08a13f426964ef140a20a884335) ) - - ROM_REGION( 0x0600, REGION_PROMS, 0 ) /* various PROMs */ - ROM_LOAD( "ic95", 0x0000, 0x0400, CRC(45e997a8) SHA1(023703b90b503310351b12157b1e732e61430fa5) ) /* sprite colortable */ - ROM_LOAD( "5198.93", 0x0400, 0x0200, CRC(32e74bc8) SHA1(dd2c812efd7b8f6b31a45e698d6453ea6bec132e) ) /* char colortable */ + ROM_LOAD( "epr-5203.cpu-ic91", 0x0000, 0x2000, CRC(631f5b65) SHA1(ce8b23cf97f7e08a13f426964ef140a20a884335) ) + + ROM_REGION( 0x0b00, REGION_PROMS, 0 ) /* various PROMs */ + ROM_LOAD( "pr-5194.cpu-ic39", 0x0000, 0x0020, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) /* char layer X shift */ + ROM_LOAD( "pr-5195.cpu-ic53", 0x0020, 0x0020, CRC(181c6d23) SHA1(4749b205cbaa513ee65a644946235d2cfe275648) ) /* sprite state machine */ + ROM_LOAD( "pr-5196.cpu-ic10", 0x0100, 0x0200, CRC(04204bcf) SHA1(5636eb184463ac58fcfd20012d13d14fb0769124) ) /* sprite Y scaling */ + ROM_LOAD( "pr-5197.cpu-ic78", 0x0300, 0x0200, CRC(a42674af) SHA1(db3590dd0d0f8a85d4ba32ac4ee33f2f4ee4c348) ) /* video timing */ + ROM_LOAD( "pr-5198.cpu-ic93", 0x0500, 0x0200, CRC(32e74bc8) SHA1(dd2c812efd7b8f6b31a45e698d6453ea6bec132e) ) /* char colortable */ + ROM_LOAD( "pr-5199.cpu-ic95", 0x0700, 0x0400, CRC(45e997a8) SHA1(023703b90b503310351b12157b1e732e61430fa5) ) /* sprite colortable */ ROM_END ROM_START( buckrogn ) - ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ - ROM_LOAD( "ic3", 0x0000, 0x4000, CRC(7f1910af) SHA1(22d37750282676d8fd1f602e928c174f823245c9) ) - ROM_LOAD( "ic4", 0x4000, 0x4000, CRC(5ecd393b) SHA1(d069f12326644f2c685e516d91d33b97ec162c56) ) + ROM_REGION( 0xc000, REGION_CPU1, 0 ) + ROM_LOAD( "cpu-ic3", 0x0000, 0x4000, CRC(7f1910af) SHA1(22d37750282676d8fd1f602e928c174f823245c9) ) + ROM_LOAD( "cpu-ic4", 0x4000, 0x4000, CRC(5ecd393b) SHA1(d069f12326644f2c685e516d91d33b97ec162c56) ) - ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for code */ - ROM_LOAD( "5200.66", 0x0000, 0x1000, CRC(0d58b154) SHA1(9f3951eb7ea1fa9ff914738462e4b4f755d60802) ) + ROM_REGION( 0x2000, REGION_CPU2, 0 ) + ROM_LOAD( "epr-5200.cpu-ic66", 0x0000, 0x1000, CRC(0d58b154) SHA1(9f3951eb7ea1fa9ff914738462e4b4f755d60802) ) ROM_REGION( 0x40000, REGION_GFX1, 0 ) /* sprite data */ - ROM_LOAD( "5216.100", 0x00000, 0x2000, CRC(8155bd73) SHA1(b6814f03eafe16457655598685b4827456b86335) ) /* level 0 */ - ROM_LOAD( "5213.84", 0x08000, 0x2000, CRC(fd78dda4) SHA1(4328b5782cbe692765eac43a8eba40bdf2e41921) ) /* level 1 */ - ROM_LOAD( "ic68", 0x10000, 0x4000, CRC(2a194270) SHA1(8d4e444bd8a4e2fa32099787849e6c02cffe49b0) ) /* level 2 */ - ROM_LOAD( "ic52", 0x18000, 0x4000, CRC(b31a120f) SHA1(036cdf56cb43b892609a8f793d5ca66940bf128e) ) /* level 3 */ - ROM_LOAD( "ic43", 0x20000, 0x4000, CRC(d3584926) SHA1(7ad410ad84447a3edba2c51c4ec4314a117fffe7) ) /* level 4 */ - ROM_LOAD( "ic59", 0x28000, 0x4000, CRC(d83c7fcf) SHA1(4c4a590762ef87a3057a12e8d4310decbeb8613c) ) /* level 5 */ - ROM_LOAD( "5208.58", 0x2c000, 0x2000, CRC(d181fed2) SHA1(fd46e609b7e04d0661c84ad0faa616d75b8ba89f) ) - ROM_LOAD( "ic75", 0x30000, 0x4000, CRC(1bd6e453) SHA1(472fbc7add05b96e368b961c5ef7ef27f3896216) ) /* level 6 */ - ROM_LOAD( "5239.74", 0x34000, 0x2000, CRC(c34e9b82) SHA1(9e69fe9dcc631783e43abe356657f3c6a6a533d8) ) - ROM_LOAD( "ic91", 0x38000, 0x4000, CRC(221f4ced) SHA1(07498c9105c4c4589b19c2bc36abafb176de7bda) ) /* level 7 */ - ROM_LOAD( "5238.90", 0x3c000, 0x2000, CRC(7aff0886) SHA1(09ed9fa973257bb23b488e02ef9e02d867e4c366) ) - - ROM_REGION( 0x01000, REGION_GFX2, 0 ) /* foreground data */ - ROM_LOAD( "5201.102", 0x0000, 0x0800, CRC(7f21b0a4) SHA1(b6d784031ffecb36863ae1d81eeaaf8f76ab83df) ) - ROM_LOAD( "5202.103", 0x0800, 0x0800, CRC(43f3e5a7) SHA1(2714943b6720311c5d226db3b6fe95d072677793) ) + ROM_LOAD( "epr-5216.prom-ic100", 0x00000, 0x2000, CRC(8155bd73) SHA1(b6814f03eafe16457655598685b4827456b86335) ) /* level 0 */ + ROM_LOAD( "epr-5213.prom-ic84", 0x08000, 0x2000, CRC(fd78dda4) SHA1(4328b5782cbe692765eac43a8eba40bdf2e41921) ) /* level 1 */ + ROM_LOAD( "prom-ic68", 0x10000, 0x4000, CRC(2a194270) SHA1(8d4e444bd8a4e2fa32099787849e6c02cffe49b0) ) /* level 2 */ + ROM_LOAD( "prom-ic52", 0x18000, 0x4000, CRC(b31a120f) SHA1(036cdf56cb43b892609a8f793d5ca66940bf128e) ) /* level 3 */ + ROM_LOAD( "prom-ic43", 0x20000, 0x4000, CRC(d3584926) SHA1(7ad410ad84447a3edba2c51c4ec4314a117fffe7) ) /* level 4 */ + ROM_LOAD( "prom-ic59", 0x28000, 0x4000, CRC(d83c7fcf) SHA1(4c4a590762ef87a3057a12e8d4310decbeb8613c) ) /* level 5 */ + ROM_LOAD( "epr-5208.prom-ic58", 0x2c000, 0x2000, CRC(d181fed2) SHA1(fd46e609b7e04d0661c84ad0faa616d75b8ba89f) ) + ROM_LOAD( "prom-ic75", 0x30000, 0x4000, CRC(1bd6e453) SHA1(472fbc7add05b96e368b961c5ef7ef27f3896216) ) /* level 6 */ + ROM_LOAD( "epr-5239.prom-ic74", 0x34000, 0x2000, CRC(c34e9b82) SHA1(9e69fe9dcc631783e43abe356657f3c6a6a533d8) ) + ROM_LOAD( "prom-ic91", 0x38000, 0x4000, CRC(221f4ced) SHA1(07498c9105c4c4589b19c2bc36abafb176de7bda) ) /* level 7 */ + ROM_LOAD( "epr-5238.prom-ic90", 0x3c000, 0x2000, CRC(7aff0886) SHA1(09ed9fa973257bb23b488e02ef9e02d867e4c366) ) + + ROM_REGION( 0x01000, REGION_GFX2, ROMREGION_DISPOSE ) /* foreground data */ + ROM_LOAD( "epr-5201.cpu-ic102", 0x0000, 0x0800, CRC(7f21b0a4) SHA1(b6d784031ffecb36863ae1d81eeaaf8f76ab83df) ) + ROM_LOAD( "epr-5202.cpu-ic103", 0x0800, 0x0800, CRC(43f3e5a7) SHA1(2714943b6720311c5d226db3b6fe95d072677793) ) ROM_REGION( 0x2000, REGION_GFX3, 0 ) /* background color data */ - ROM_LOAD( "5203.91", 0x0000, 0x2000, CRC(631f5b65) SHA1(ce8b23cf97f7e08a13f426964ef140a20a884335) ) - - ROM_REGION( 0x0600, REGION_PROMS, 0 ) /* various PROMs */ - ROM_LOAD( "ic95", 0x0000, 0x0400, CRC(45e997a8) SHA1(023703b90b503310351b12157b1e732e61430fa5) ) /* sprite colortable */ - ROM_LOAD( "5198.93", 0x0400, 0x0200, CRC(32e74bc8) SHA1(dd2c812efd7b8f6b31a45e698d6453ea6bec132e) ) /* char colortable */ + ROM_LOAD( "epr-5203.cpu-ic91", 0x0000, 0x2000, CRC(631f5b65) SHA1(ce8b23cf97f7e08a13f426964ef140a20a884335) ) + + ROM_REGION( 0x0b00, REGION_PROMS, 0 ) /* various PROMs */ + ROM_LOAD( "pr-5194.cpu-ic39", 0x0000, 0x0020, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) /* char layer X shift */ + ROM_LOAD( "pr-5195.cpu-ic53", 0x0020, 0x0020, CRC(181c6d23) SHA1(4749b205cbaa513ee65a644946235d2cfe275648) ) /* sprite state machine */ + ROM_LOAD( "pr-5196.cpu-ic10", 0x0100, 0x0200, CRC(04204bcf) SHA1(5636eb184463ac58fcfd20012d13d14fb0769124) ) /* sprite Y scaling */ + ROM_LOAD( "pr-5197.cpu-ic78", 0x0300, 0x0200, CRC(a42674af) SHA1(db3590dd0d0f8a85d4ba32ac4ee33f2f4ee4c348) ) /* video timing */ + ROM_LOAD( "pr-5198.cpu-ic93", 0x0500, 0x0200, CRC(32e74bc8) SHA1(dd2c812efd7b8f6b31a45e698d6453ea6bec132e) ) /* char colortable */ + ROM_LOAD( "pr-5199.cpu-ic95", 0x0700, 0x0400, CRC(45e997a8) SHA1(023703b90b503310351b12157b1e732e61430fa5) ) /* sprite colortable */ ROM_END ROM_START( zoom909 ) - ROM_REGION( 2*0x10000, REGION_CPU1, 0 ) /* 64k for code + 64k for decrypted opcodes */ - ROM_LOAD( "epr-5217b.3", 0x0000, 0x4000, CRC(1b56e7dd) SHA1(ccf638c318ebce754ac9628271d2064e05ced35c) ) /* encrypted */ - ROM_LOAD( "epr-5218b.4", 0x4000, 0x4000, CRC(77dfd911) SHA1(cc1d4aac863b2d6b52eff7de2b8233be21aac3c9) ) /* encrypted */ + ROM_REGION( 0xc000, REGION_CPU1, 0 ) + ROM_LOAD( "epr-5217b.cpu-ic3", 0x0000, 0x4000, CRC(1b56e7dd) SHA1(ccf638c318ebce754ac9628271d2064e05ced35c) ) /* encrypted */ + ROM_LOAD( "epr-5218b.cpu-ic4", 0x4000, 0x4000, CRC(77dfd911) SHA1(cc1d4aac863b2d6b52eff7de2b8233be21aac3c9) ) /* encrypted */ - ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for code */ - ROM_LOAD( "5200.66", 0x0000, 0x1000, CRC(0d58b154) SHA1(9f3951eb7ea1fa9ff914738462e4b4f755d60802) ) + ROM_REGION( 0x2000, REGION_CPU2, 0 ) + ROM_LOAD( "epr-5200.cpu-ic66", 0x0000, 0x1000, CRC(0d58b154) SHA1(9f3951eb7ea1fa9ff914738462e4b4f755d60802) ) ROM_REGION( 0x40000, REGION_GFX1, 0 ) /* sprite data */ - ROM_LOAD( "5216.100", 0x00000, 0x2000, CRC(8155bd73) SHA1(b6814f03eafe16457655598685b4827456b86335) ) /* level 0 */ - ROM_LOAD( "5213.84", 0x08000, 0x2000, CRC(fd78dda4) SHA1(4328b5782cbe692765eac43a8eba40bdf2e41921) ) /* level 1 */ - ROM_LOAD( "epr-5231.68", 0x10000, 0x4000, CRC(f00385fc) SHA1(88f64159fdd9b0b8b6a26e7c52da74189f529eb4) ) /* level 2 */ - ROM_LOAD( "epr-5207.52", 0x18000, 0x4000, CRC(644f29d8) SHA1(301b94a522bf7a79195d96ca7a4c2ec6f63d45d2) ) /* level 3 */ - ROM_LOAD( "epr-5206.43", 0x20000, 0x4000, CRC(049dc998) SHA1(8184a92895b04ea140f073c2345284c23fba7fd4) ) /* level 4 */ - ROM_LOAD( "epr-5209.59", 0x28000, 0x4000, CRC(0ff9ff71) SHA1(9038949b657269a3b3287ad526c0e14ebe87525a) ) /* level 5 */ - ROM_LOAD( "5208.58", 0x2c000, 0x2000, CRC(d181fed2) SHA1(fd46e609b7e04d0661c84ad0faa616d75b8ba89f) ) - ROM_LOAD( "epr-5212.75", 0x30000, 0x4000, CRC(9359ec4f) SHA1(4783527b9961df259e7fbbf8db0b599882dd1207) ) /* level 6 */ - ROM_LOAD( "epr-5211.74", 0x34000, 0x2000, CRC(d181fed2) SHA1(fd46e609b7e04d0661c84ad0faa616d75b8ba89f) ) - ROM_LOAD( "epr-5215.91", 0x38000, 0x4000, CRC(f5dacc53) SHA1(fe536d16ccb249c26a046f60dc804f5d3be430dc) ) /* level 7 */ - ROM_LOAD( "epr-5214.90", 0x3c000, 0x2000, CRC(68306dd6) SHA1(63644e38b36512d93464280d73344c97d9ec1f78) ) - - ROM_REGION( 0x01000, REGION_GFX2, 0 ) /* foreground data */ - ROM_LOAD( "5201.102", 0x0000, 0x0800, CRC(7f21b0a4) SHA1(b6d784031ffecb36863ae1d81eeaaf8f76ab83df) ) - ROM_LOAD( "5202.103", 0x0800, 0x0800, CRC(43f3e5a7) SHA1(2714943b6720311c5d226db3b6fe95d072677793) ) + ROM_LOAD( "epr-5216.prom-ic100", 0x00000, 0x2000, CRC(8155bd73) SHA1(b6814f03eafe16457655598685b4827456b86335) ) /* level 0 */ + ROM_LOAD( "epr-5213.prom-ic84", 0x08000, 0x2000, CRC(fd78dda4) SHA1(4328b5782cbe692765eac43a8eba40bdf2e41921) ) /* level 1 */ + ROM_LOAD( "epr-5231.prom-ic68", 0x10000, 0x4000, CRC(f00385fc) SHA1(88f64159fdd9b0b8b6a26e7c52da74189f529eb4) ) /* level 2 */ + ROM_LOAD( "epr-5207.prom-ic52", 0x18000, 0x4000, CRC(644f29d8) SHA1(301b94a522bf7a79195d96ca7a4c2ec6f63d45d2) ) /* level 3 */ + ROM_LOAD( "epr-5206.prom-ic43", 0x20000, 0x4000, CRC(049dc998) SHA1(8184a92895b04ea140f073c2345284c23fba7fd4) ) /* level 4 */ + ROM_LOAD( "epr-5209.prom-ic59", 0x28000, 0x4000, CRC(0ff9ff71) SHA1(9038949b657269a3b3287ad526c0e14ebe87525a) ) /* level 5 */ + ROM_LOAD( "epr-5208.prom-ic58", 0x2c000, 0x2000, CRC(d181fed2) SHA1(fd46e609b7e04d0661c84ad0faa616d75b8ba89f) ) + ROM_LOAD( "epr-5212.prom-ic75", 0x30000, 0x4000, CRC(9359ec4f) SHA1(4783527b9961df259e7fbbf8db0b599882dd1207) ) /* level 6 */ + ROM_LOAD( "epr-5211.prom-ic74", 0x34000, 0x2000, CRC(d181fed2) SHA1(fd46e609b7e04d0661c84ad0faa616d75b8ba89f) ) + ROM_LOAD( "epr-5215.prom-ic91", 0x38000, 0x4000, CRC(f5dacc53) SHA1(fe536d16ccb249c26a046f60dc804f5d3be430dc) ) /* level 7 */ + ROM_LOAD( "epr-5214.prom-ic90", 0x3c000, 0x2000, CRC(68306dd6) SHA1(63644e38b36512d93464280d73344c97d9ec1f78) ) + + ROM_REGION( 0x01000, REGION_GFX2, ROMREGION_DISPOSE ) /* foreground data */ + ROM_LOAD( "epr-5201.cpu-ic102", 0x0000, 0x0800, CRC(7f21b0a4) SHA1(b6d784031ffecb36863ae1d81eeaaf8f76ab83df) ) + ROM_LOAD( "epr-5202.cpu-ic103", 0x0800, 0x0800, CRC(43f3e5a7) SHA1(2714943b6720311c5d226db3b6fe95d072677793) ) ROM_REGION( 0x2000, REGION_GFX3, 0 ) /* background color data */ - ROM_LOAD( "5203.91", 0x0000, 0x2000, CRC(631f5b65) SHA1(ce8b23cf97f7e08a13f426964ef140a20a884335) ) + ROM_LOAD( "epr-5203.cpu-ic91", 0x0000, 0x2000, CRC(631f5b65) SHA1(ce8b23cf97f7e08a13f426964ef140a20a884335) ) + + ROM_REGION( 0x0b00, REGION_PROMS, 0 ) /* various PROMs */ + ROM_LOAD( "pr-5194.cpu-ic39", 0x0000, 0x0020, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) /* char layer X shift */ + ROM_LOAD( "pr-5195.cpu-ic53", 0x0020, 0x0020, CRC(181c6d23) SHA1(4749b205cbaa513ee65a644946235d2cfe275648) ) /* sprite state machine */ + ROM_LOAD( "pr-5196.cpu-ic10", 0x0100, 0x0200, CRC(04204bcf) SHA1(5636eb184463ac58fcfd20012d13d14fb0769124) ) /* sprite Y scaling */ + ROM_LOAD( "pr-5197.cpu-ic78", 0x0300, 0x0200, CRC(a42674af) SHA1(db3590dd0d0f8a85d4ba32ac4ee33f2f4ee4c348) ) /* video timing */ + ROM_LOAD( "pr-5198.cpu-ic93", 0x0500, 0x0200, CRC(32e74bc8) SHA1(dd2c812efd7b8f6b31a45e698d6453ea6bec132e) ) /* char colortable */ + ROM_LOAD( "pr-5199.cpu-ic95", 0x0700, 0x0400, CRC(45e997a8) SHA1(023703b90b503310351b12157b1e732e61430fa5) ) /* sprite colortable */ +ROM_END - ROM_REGION( 0x0a40, REGION_PROMS, 0 ) /* various PROMs */ - ROM_LOAD( "pr-5199.95", 0x0000, 0x0400, BAD_DUMP CRC(f3cd9254) SHA1(5fc5e4137fa260f5463395719449e4a542f1b08c) ) /* sprite colortable */ - ROM_LOAD( "5198.93", 0x0400, 0x0200, CRC(32e74bc8) SHA1(dd2c812efd7b8f6b31a45e698d6453ea6bec132e) ) /* char colortable */ - /* unknown */ - ROM_LOAD( "pr-5194.39", 0x0600, 0x0020, CRC(bc88cced) SHA1(5055362710c0f58823c05fb4c0e0eec638b91e3d) ) - ROM_LOAD( "pr-5195.53", 0x0620, 0x0020, CRC(181c6d23) SHA1(4749b205cbaa513ee65a644946235d2cfe275648) ) - ROM_LOAD( "pr-5196.10", 0x0640, 0x0200, CRC(04204bcf) SHA1(5636eb184463ac58fcfd20012d13d14fb0769124) ) - ROM_LOAD( "pr-5197.78", 0x0840, 0x0200, CRC(a42674af) SHA1(db3590dd0d0f8a85d4ba32ac4ee33f2f4ee4c348) ) -ROM_END + +/************************************* + * + * Turbo ROM decoding + * + *************************************/ + +void turbo_rom_decode(void) +{ + /* + * The table is arranged this way (second half is mirror image of first) + * + * 0 1 2 3 4 5 6 7 8 9 A B C D E F + * + * 0 00 00 00 00 01 01 01 01 02 02 02 02 03 03 03 03 + * 1 04 04 04 04 05 05 05 05 06 06 06 06 07 07 07 07 + * 2 08 08 08 08 09 09 09 09 0A 0A 0A 0A 0B 0B 0B 0B + * 3 0C 0C 0C 0C 0D 0D 0D 0D 0E 0E 0E 0E 0F 0F 0F 0F + * 4 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 13 + * 5 14 14 14 14 15 15 15 15 16 16 16 16 17 17 17 17 + * 6 18 18 18 18 19 19 19 19 1A 1A 1A 1A 1B 1B 1B 1B + * 7 1C 1C 1C 1C 1D 1D 1D 1D 1E 1E 1E 1E 1F 1F 1F 1F + * 8 1F 1F 1F 1F 1E 1E 1E 1E 1D 1D 1D 1D 1C 1C 1C 1C + * 9 1B 1B 1B 1B 1A 1A 1A 1A 19 19 19 19 18 18 18 18 + * A 17 17 17 17 16 16 16 16 15 15 15 15 14 14 14 14 + * B 13 13 13 13 12 12 12 12 11 11 11 11 10 10 10 10 + * C 0F 0F 0F 0F 0E 0E 0E 0E 0D 0D 0D 0D 0C 0C 0C 0C + * D 0B 0B 0B 0B 0A 0A 0A 0A 09 09 09 09 08 08 08 08 + * E 07 07 07 07 06 06 06 06 05 05 05 05 04 04 04 04 + * F 03 03 03 03 02 02 02 02 01 01 01 01 00 00 00 00 + * + */ + static const UINT8 xortable[][32]= + { + /* Table 0 */ + /* 0x0000-0x3ff */ + /* 0x0800-0xbff */ + /* 0x4000-0x43ff */ + /* 0x4800-0x4bff */ + { 0x00,0x44,0x0c,0x48,0x00,0x44,0x0c,0x48, + 0xa0,0xe4,0xac,0xe8,0xa0,0xe4,0xac,0xe8, + 0x60,0x24,0x6c,0x28,0x60,0x24,0x6c,0x28, + 0xc0,0x84,0xcc,0x88,0xc0,0x84,0xcc,0x88 }, + + /* Table 1 */ + /* 0x0400-0x07ff */ + /* 0x0c00-0x0fff */ + /* 0x1400-0x17ff */ + /* 0x1c00-0x1fff */ + /* 0x2400-0x27ff */ + /* 0x2c00-0x2fff */ + /* 0x3400-0x37ff */ + /* 0x3c00-0x3fff */ + /* 0x4400-0x47ff */ + /* 0x4c00-0x4fff */ + /* 0x5400-0x57ff */ + /* 0x5c00-0x5fff */ + { 0x00,0x44,0x18,0x5c,0x14,0x50,0x0c,0x48, + 0x28,0x6c,0x30,0x74,0x3c,0x78,0x24,0x60, + 0x60,0x24,0x78,0x3c,0x74,0x30,0x6c,0x28, + 0x48,0x0c,0x50,0x14,0x5c,0x18,0x44,0x00 }, //0x00 --> 0x10 ? + + /* Table 2 */ + /* 0x1000-0x13ff */ + /* 0x1800-0x1bff */ + /* 0x5000-0x53ff */ + /* 0x5800-0x5bff */ + { 0x00,0x00,0x28,0x28,0x90,0x90,0xb8,0xb8, + 0x28,0x28,0x00,0x00,0xb8,0xb8,0x90,0x90, + 0x00,0x00,0x28,0x28,0x90,0x90,0xb8,0xb8, + 0x28,0x28,0x00,0x00,0xb8,0xb8,0x90,0x90 }, + + /* Table 3 */ + /* 0x2000-0x23ff */ + /* 0x2800-0x2bff */ + /* 0x3000-0x33ff */ + /* 0x3800-0x3bff */ + { 0x00,0x14,0x88,0x9c,0x30,0x24,0xb8,0xac, + 0x24,0x30,0xac,0xb8,0x14,0x00,0x9c,0x88, + 0x48,0x5c,0xc0,0xd4,0x78,0x6c,0xf0,0xe4, + 0x6c,0x78,0xe4,0xf0,0x5c,0x48,0xd4,0xc0 } + }; + + static const int findtable[]= + { + 0,1,0,1, /* 0x0000-0x0fff */ + 2,1,2,1, /* 0x1000-0x1fff */ + 3,1,3,1, /* 0x2000-0x2fff */ + 3,1,3,1, /* 0x3000-0x3fff */ + 0,1,0,1, /* 0x4000-0x4fff */ + 2,1,2,1 /* 0x5000-0x5fff */ + }; + + UINT8 *RAM = memory_region(REGION_CPU1); + int offs, i, j; + UINT8 src; + + for (offs = 0x0000; offs < 0x6000; offs++) + { + src = RAM[offs]; + i = findtable[offs >> 10]; + j = src >> 2; + if (src & 0x80) j ^= 0x3f; + RAM[offs] = src ^ xortable[i][j]; + } +} @@ -988,15 +1525,63 @@ ROM_END * *************************************/ -static DRIVER_INIT( decode_turbo ) +static DRIVER_INIT( turbo ) +{ + static ppi8255_interface turbo_8255_intf = + { + 4, + { NULL, NULL, NULL, turbo_analog_r }, + { NULL, NULL, NULL, input_port_2_r }, + { NULL, NULL, NULL, NULL }, + { turbo_ppi0a_w, turbo_ppi1a_w, turbo_sound_a_w, NULL }, + { turbo_ppi0b_w, turbo_ppi1b_w, turbo_sound_b_w, NULL }, + { turbo_ppi0c_w, turbo_ppi1c_w, turbo_sound_c_w, turbo_ppi3c_w } + }; + ppi8255_init(&turbo_8255_intf); +} + +static DRIVER_INIT( turbo_enc ) { turbo_rom_decode(); + init_turbo(machine); } -static DRIVER_INIT( decode_buckrog ) +static DRIVER_INIT( subroc3d ) +{ + static ppi8255_interface subroc3d_8255_intf = + { + 2, + { NULL, NULL }, + { NULL, NULL }, + { NULL, NULL }, + { subroc3d_ppi0a_w, subroc3d_sound_a_w }, + { subroc3d_ppi0b_w, subroc3d_sound_b_w }, + { subroc3d_ppi0c_w, subroc3d_sound_c_w } + }; + ppi8255_init(&subroc3d_8255_intf); +} + + +static DRIVER_INIT( buckrog ) +{ + static ppi8255_interface buckrog_8255_intf = + { + 2, + { NULL, NULL }, + { NULL, NULL }, + { NULL, NULL }, + { buckrog_ppi0a_w, buckrog_sound_a_w }, + { buckrog_ppi0b_w, buckrog_sound_b_w }, + { buckrog_ppi0c_w, buckrog_ppi1c_w } + }; + ppi8255_init(&buckrog_8255_intf); +} + +static DRIVER_INIT( buckrog_enc ) { buckrog_decode(); + init_buckrog(machine); } @@ -1007,10 +1592,10 @@ static DRIVER_INIT( decode_buckrog ) * *************************************/ -GAMEL( 1981, turbo, 0, turbo, turbo, 0, ROT270, "Sega", "Turbo", GAME_NO_COCKTAIL, layout_turbo ) -GAMEL( 1981, turboa, turbo, turbo, turbo, decode_turbo, ROT270, "Sega", "Turbo (encrypted set 1)", GAME_NO_COCKTAIL, layout_turbo ) -GAMEL( 1981, turbob, turbo, turbo, turbo, decode_turbo, ROT270, "Sega", "Turbo (encrypted set 2)", GAME_NO_COCKTAIL, layout_turbo ) -GAMEL( 1982, subroc3d, 0, subroc3d, subroc3d, 0, ORIENTATION_FLIP_X, "Sega", "Subroc-3D", 0, layout_subroc3d ) -GAMEL( 1982, buckrog, 0, buckrog, buckrog, decode_buckrog, ROT0, "Sega", "Buck Rogers: Planet of Zoom", 0, layout_buckrog ) -GAMEL( 1982, zoom909, buckrog, buckrog, buckrog, decode_buckrog, ROT0, "Sega", "Zoom 909", GAME_IMPERFECT_COLORS, layout_buckrog ) // bad PROM -GAMEL( 1982, buckrogn, buckrog, buckrog, buckrog, 0, ROT0, "Sega", "Buck Rogers: Planet of Zoom (not encrypted)", 0, layout_buckrog ) +GAMEL( 1981, turbo, 0, turbo, turbo, turbo, ROT270, "Sega", "Turbo", 0, layout_turbo ) +GAMEL( 1981, turboa, turbo, turbo, turbo, turbo_enc, ROT270, "Sega", "Turbo (encrypted set 1)", 0, layout_turbo ) +GAMEL( 1981, turbob, turbo, turbo, turbo, turbo_enc, ROT270, "Sega", "Turbo (encrypted set 2)", 0, layout_turbo ) +GAMEL( 1982, subroc3d, 0, subroc3d, subroc3d, subroc3d, ORIENTATION_FLIP_X, "Sega", "Subroc-3D", 0, layout_subroc3d ) +GAMEL( 1982, buckrog, 0, buckrog, buckrog, buckrog_enc, ROT0, "Sega", "Buck Rogers: Planet of Zoom", 0, layout_buckrog ) +GAMEL( 1982, zoom909, buckrog, buckrog, buckrog, buckrog_enc, ROT0, "Sega", "Zoom 909", GAME_IMPERFECT_COLORS, layout_buckrog ) // bad PROM +GAMEL( 1982, buckrogn, buckrog, buckrog, buckrog, buckrog, ROT0, "Sega", "Buck Rogers: Planet of Zoom (not encrypted)", 0, layout_buckrog ) diff --git a/src/drivers/twins.c b/src/drivers/twins.c index 714739cf9..f6d81b3b8 100644 --- a/src/drivers/twins.c +++ b/src/drivers/twins.c @@ -117,7 +117,7 @@ VIDEO_UPDATE(twins) int i; static int xxx=320,yyy=204; - fillbitmap(bitmap, get_black_pen(), 0); + fillbitmap(bitmap, get_black_pen(machine), 0); for (i=0;i<0x100;i++) { @@ -133,7 +133,7 @@ VIDEO_UPDATE(twins) b = (dat>>10) & 0x1f; b = BITSWAP8(b,7,6,5,0,1,2,3,4); - palette_set_color(i, r*8,g*8,b*8); + palette_set_color(machine,i, pal5bit(r),pal5bit(g),pal5bit(b)); } count=0; diff --git a/src/drivers/undrfire.c b/src/drivers/undrfire.c index 89d50177c..2759850dd 100644 --- a/src/drivers/undrfire.c +++ b/src/drivers/undrfire.c @@ -155,7 +155,7 @@ static WRITE32_HANDLER( color_ram_w ) g = (a &0xff00) >> 8; b = (a &0xff); - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } } diff --git a/src/drivers/unico.c b/src/drivers/unico.c index 8034dffac..335401d76 100644 --- a/src/drivers/unico.c +++ b/src/drivers/unico.c @@ -662,7 +662,7 @@ struct EEPROM_interface zeropnt2_eeprom_interface = // "*10010xxxx" // erase all 1 00 10xxxx }; -void nvram_handler_zeropnt2(mame_file *file,int read_or_write) +NVRAM_HANDLER( zeropnt2 ) { if (read_or_write) EEPROM_save(file); @@ -721,7 +721,7 @@ MACHINE_DRIVER_END MACHINE_RESET( zeropt ) { - machine_reset_unico(); + machine_reset_unico(machine); unico_has_lightgun = 1; } diff --git a/src/drivers/vamphalf.c b/src/drivers/vamphalf.c index aa4af9da5..b04295a2c 100644 --- a/src/drivers/vamphalf.c +++ b/src/drivers/vamphalf.c @@ -293,7 +293,7 @@ UINT8 misncrft_default_nvram[128] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA }; -void nvram_handler_93C46_vamphalf(mame_file *file,int read_or_write) +NVRAM_HANDLER( 93C46_vamphalf ) { if (read_or_write) EEPROM_save(file); diff --git a/src/drivers/vegas.c b/src/drivers/vegas.c index e8c400b9b..9a4323834 100644 --- a/src/drivers/vegas.c +++ b/src/drivers/vegas.c @@ -589,7 +589,7 @@ static MACHINE_RESET( vegas ) memset(pci_3dfx_regs, 0, sizeof(pci_3dfx_regs)); /* reset the DCS system if we have one */ - if (mame_find_cpu_index("dcs2") != -1 || mame_find_cpu_index("dsio") != -1 || mame_find_cpu_index("denver") != -1) + if (mame_find_cpu_index(machine, "dcs2") != -1 || mame_find_cpu_index(machine, "dsio") != -1 || mame_find_cpu_index(machine, "denver") != -1) { dcs_reset_w(1); dcs_reset_w(0); @@ -607,9 +607,9 @@ static MACHINE_RESET( vegas ) /* find out what type of voodoo we have */ voodoo_type = voodoo_get_type(0); - if (mame_find_cpu_index("dsio") != -1) + if (mame_find_cpu_index(machine, "dsio") != -1) dcs_idma_cs = 6; - else if (mame_find_cpu_index("denver") != -1) + else if (mame_find_cpu_index(machine, "denver") != -1) dcs_idma_cs = 7; else dcs_idma_cs = 0; diff --git a/src/drivers/vicdual.c b/src/drivers/vicdual.c index 29f4b312b..300748cf7 100644 --- a/src/drivers/vicdual.c +++ b/src/drivers/vicdual.c @@ -2294,7 +2294,7 @@ GAME( 1980, nsub, 0, 2ports, nsub, safari, ROT270, "Sega", " GAME( 1980, samurai, 0, 4ports, samurai, samurai, ROT270, "Sega", "Samurai", GAME_NO_SOUND ) GAME( 1979, invinco, 0, invinco3, invinco, invinco, ROT270, "Sega", "Invinco", 0 ) GAME( 1979, invds, 0, invinco4, invds, invds, ROT270, "Sega", "Invinco / Deep Scan", GAME_IMPERFECT_SOUND ) -GAME( 1980, tranqgun, 0, 4ports, tranqgun, tranqgun, ROT270, "Sega", "Tranquilizer Gun", GAME_NO_SOUND ) +GAME( 1980, tranqgun, 0, 4ports, tranqgun, tranqgun, ROT270, "Sega", "Tranquillizer Gun", GAME_NO_SOUND ) GAME( 1980, spacetrk, 0, 4ports, spacetrk, spacetrk, ROT270, "Sega", "Space Trek (upright)", GAME_NO_SOUND ) GAME( 1980, sptrekct, spacetrk, 4ports, sptrekct, sptrekct, ROT270, "Sega", "Space Trek (cocktail)", GAME_NO_SOUND ) GAME( 1980, carnival, 0, carnival, carnival, carnival, ROT270, "Sega", "Carnival (upright)", 0 ) diff --git a/src/drivers/vmetal.c b/src/drivers/vmetal.c index f2fddc198..ad73d91ea 100644 --- a/src/drivers/vmetal.c +++ b/src/drivers/vmetal.c @@ -411,7 +411,7 @@ VIDEO_START(varia) VIDEO_UPDATE(varia) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); fillbitmap(priority_bitmap,0,cliprect); tilemap_set_scrollx(vmetal_mid2tilemap,0, vmetal_videoregs[0x06a/2]-64 /*+ vmetal_videoregs[0x066/2]*/); diff --git a/src/drivers/vp906iii.c b/src/drivers/vp906iii.c index 01160a6a2..6e22c5b1d 100644 --- a/src/drivers/vp906iii.c +++ b/src/drivers/vp906iii.c @@ -114,7 +114,7 @@ PALETTE_INIT( vp906iii ) color_prom++; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); } #endif } diff --git a/src/drivers/vroulet.c b/src/drivers/vroulet.c index 756098e88..27fcd4a8b 100644 --- a/src/drivers/vroulet.c +++ b/src/drivers/vroulet.c @@ -60,7 +60,7 @@ static WRITE8_HANDLER(vroulet_paletteram_w) { a=paletteram[((i*8+j)*2)&0xff ]; b=paletteram[((i*8+j)*2+1)&0xff ]; - palette_set_color(i*16+j,(b&0xf)<<4,(b&0xf0),(a&0xf)<<4); + palette_set_color(Machine,i*16+j,pal4bit(b),pal4bit(b>>4),pal4bit(a)); } } } diff --git a/src/drivers/vsnes.c b/src/drivers/vsnes.c index ed6e7b726..762164f26 100644 --- a/src/drivers/vsnes.c +++ b/src/drivers/vsnes.c @@ -131,7 +131,7 @@ TO DO: #include "driver.h" #include "rendlay.h" -#include "vidhrdw/ppu2c03b.h" +#include "vidhrdw/ppu2c0x.h" #include "machine/rp5h01.h" #include "sound/dac.h" #include "sound/nes_apu.h" @@ -198,10 +198,16 @@ extern WRITE8_HANDLER( vsnes_in0_1_w ); static UINT8 *work_ram, *work_ram_1; static int coin; -static WRITE8_HANDLER( sprite_dma_w ) +static WRITE8_HANDLER( sprite_dma_0_w ) { - int source = ( data & 7 ); - ppu2c03b_spriteram_dma( source ); + int source = ( data & 7 ); + ppu2c0x_spriteram_dma( 0, source ); +} + +static WRITE8_HANDLER( sprite_dma_1_w ) +{ + int source = ( data & 7 ); + ppu2c0x_spriteram_dma( 1, source ); } static WRITE8_HANDLER( vsnes_coin_counter_w ) @@ -264,10 +270,10 @@ static WRITE8_HANDLER( psg1_4017_w ) static ADDRESS_MAP_START( vsnes_cpu1_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x1800) AM_RAM AM_BASE(&work_ram) - AM_RANGE(0x2000, 0x3fff) AM_READWRITE(ppu2c03b_0_r, ppu2c03b_0_w) + AM_RANGE(0x2000, 0x3fff) AM_READWRITE(ppu2c0x_0_r, ppu2c0x_0_w) AM_RANGE(0x4011, 0x4011) AM_WRITE(DAC_0_data_w) AM_RANGE(0x4000, 0x4013) AM_READWRITE(NESPSG_0_r, NESPSG_0_w) - AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_w) + AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_0_w) AM_RANGE(0x4015, 0x4015) AM_READWRITE(psg_4015_r, psg_4015_w) /* PSG status / first control register */ AM_RANGE(0x4016, 0x4016) AM_READWRITE(vsnes_in0_r, vsnes_in0_w) AM_RANGE(0x4017, 0x4017) AM_READWRITE(vsnes_in1_r, psg_4017_w) /* IN1 - input port 2 / PSG second control register */ @@ -277,10 +283,10 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( vsnes_cpu2_map, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x1800) AM_RAM AM_BASE(&work_ram_1) - AM_RANGE(0x2000, 0x3fff) AM_READWRITE(ppu2c03b_1_r, ppu2c03b_1_w) + AM_RANGE(0x2000, 0x3fff) AM_READWRITE(ppu2c0x_1_r, ppu2c0x_1_w) AM_RANGE(0x4011, 0x4011) AM_WRITE(DAC_1_data_w) AM_RANGE(0x4000, 0x4013) AM_READWRITE(NESPSG_1_r, NESPSG_1_w) - AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_w) + AM_RANGE(0x4014, 0x4014) AM_WRITE(sprite_dma_1_w) AM_RANGE(0x4015, 0x4015) AM_READWRITE(psg1_4015_r, psg1_4015_w) /* PSG status / first control register */ AM_RANGE(0x4016, 0x4016) AM_READWRITE(vsnes_in0_1_r, vsnes_in0_1_w) AM_RANGE(0x4017, 0x4017) AM_READWRITE(vsnes_in1_1_r, psg1_4017_w) /* IN1 - input port 2 / PSG second control register */ @@ -2095,7 +2101,7 @@ static MACHINE_DRIVER_START( vsnes ) MDRV_SCREEN_SIZE(32*8, 30*8) MDRV_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1) MDRV_GFXDECODE(nes_gfxdecodeinfo) - MDRV_PALETTE_LENGTH(4*16) + MDRV_PALETTE_LENGTH(8*4*16) MDRV_COLORTABLE_LENGTH(4*8) MDRV_PALETTE_INIT(vsnes) @@ -2131,7 +2137,7 @@ static MACHINE_DRIVER_START( vsdual ) /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_GFXDECODE(nes_gfxdecodeinfo) - MDRV_PALETTE_LENGTH(2*4*16) + MDRV_PALETTE_LENGTH(2*8*4*16) MDRV_COLORTABLE_LENGTH(2*4*16) MDRV_DEFAULT_LAYOUT(layout_dualhsxs) diff --git a/src/drivers/wallc.c b/src/drivers/wallc.c index cd4f4a194..6d2138192 100644 --- a/src/drivers/wallc.c +++ b/src/drivers/wallc.c @@ -110,7 +110,7 @@ static PALETTE_INIT( wallc ) bit7 = (color_prom[i] >> 7) & 0x01; b = combine_3_weights(weights_b, bit7, bit1, bit0); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/drivers/welltris.c b/src/drivers/welltris.c index 5c144e8a1..4289866c7 100644 --- a/src/drivers/welltris.c +++ b/src/drivers/welltris.c @@ -731,7 +731,7 @@ static struct YM2610interface ym2610_interface = -static void init_welltris(void) +static DRIVER_INIT( welltris ) { #if WELLTRIS_4P_HACK /* A Hack which shows 4 player mode in code which is disabled */ @@ -741,7 +741,7 @@ static void init_welltris(void) #endif } -static void init_quiz18k(void) +static DRIVER_INIT( quiz18k ) { ; } diff --git a/src/drivers/wgp.c b/src/drivers/wgp.c index bc6072ba8..70061e568 100644 --- a/src/drivers/wgp.c +++ b/src/drivers/wgp.c @@ -1491,7 +1491,7 @@ DRIVER_INIT( wgp2 ) ROM[0x8008 / 2] = 0x0; ROM[0x8010 / 2] = 0x0; - init_wgp(); + init_wgp(machine); } /* Working Games with some graphics problems - e.g. missing rotation */ diff --git a/src/drivers/wheelfir.c b/src/drivers/wheelfir.c index 9d4bfeb74..21239a2ef 100644 --- a/src/drivers/wheelfir.c +++ b/src/drivers/wheelfir.c @@ -55,18 +55,18 @@ READ16_HANDLER( wheelfir_rand1 ) toggle_bit ^= 0x8000; // must toggle.. - return readinputport(0)^toggle_bit;// mame_rand(); + return readinputport(0)^toggle_bit;// mame_rand(Machine); } READ16_HANDLER( wheelfir_rand2 ) { - return readinputport(1);// mame_rand(); + return readinputport(1);// mame_rand(Machine); } READ16_HANDLER( wheelfir_rand4 ) { - return mame_rand(); + return mame_rand(Machine); } static UINT16 *wheelfir_myram; @@ -271,7 +271,7 @@ VIDEO_UPDATE(wheelfir) int x,y; static int base = 0; if ( code_pressed_memory(KEYCODE_W) ) - fillbitmap(wheelfir_tmp_bitmap, get_black_pen(), cliprect); + fillbitmap(wheelfir_tmp_bitmap, get_black_pen(machine), cliprect); if ( code_pressed_memory(KEYCODE_E) ) base += 512*512; @@ -311,7 +311,7 @@ VIDEO_UPDATE(wheelfir) r = wheelfir_palette[x]; g = wheelfir_palette[x+1]; b = wheelfir_palette[x+2]; - palette_set_color(x/3,r,g,b); + palette_set_color(machine,x/3,r,g,b); } @@ -517,8 +517,8 @@ INPUT_PORTS_END static INTERRUPT_GEN( wheelfir_irq ) { -// wheelfir_myram[0x1cb8]=mame_rand()&1; - wheelfir_myram[0x1cb9]=mame_rand()&1; // hack! +// wheelfir_myram[0x1cb8]=mame_rand(Machine)&1; + wheelfir_myram[0x1cb9]=mame_rand(Machine)&1; // hack! switch ( cpu_getiloops() ) { case 0: diff --git a/src/drivers/wilytowr.c b/src/drivers/wilytowr.c index 3f39a35a4..c5e1d3d56 100644 --- a/src/drivers/wilytowr.c +++ b/src/drivers/wilytowr.c @@ -64,7 +64,7 @@ PALETTE_INIT( wilytowr ) bit3 = (color_prom[i + 2*256] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += 3*256; @@ -88,7 +88,7 @@ PALETTE_INIT( wilytowr ) bit1 = (color_prom[i] >> 7) & 0x01; b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i+256,r,g,b); + palette_set_color(machine,i+256,r,g,b); } } diff --git a/src/drivers/wolfpack.c b/src/drivers/wolfpack.c index e0aa6b4e8..100c94ae6 100644 --- a/src/drivers/wolfpack.c +++ b/src/drivers/wolfpack.c @@ -53,21 +53,19 @@ static PALETTE_INIT( wolfpack ) { int i; - palette_set_color(0, 0x00, 0x00, 0x00); - palette_set_color(1, 0xc1, 0xc1, 0xc1); - palette_set_color(2, 0x81, 0x81, 0x81); - palette_set_color(3, 0x48, 0x48, 0x48); + palette_set_color(machine, 0, 0x00, 0x00, 0x00); + palette_set_color(machine, 1, 0xc1, 0xc1, 0xc1); + palette_set_color(machine, 2, 0x81, 0x81, 0x81); + palette_set_color(machine, 3, 0x48, 0x48, 0x48); for (i = 0; i < 4; i++) { - UINT8 r, g, b; + rgb_t color = palette_get_color(machine, i); - palette_get_color(i, &r, &g, &b); - - palette_set_color(4 + i, - r < 0xb8 ? r + 0x48 : 0xff, - g < 0xb8 ? g + 0x48 : 0xff, - b < 0xb8 ? b + 0x48 : 0xff); + palette_set_color(machine, 4 + i, + RGB_RED(color) < 0xb8 ? RGB_RED(color) + 0x48 : 0xff, + RGB_GREEN(color) < 0xb8 ? RGB_GREEN(color) + 0x48 : 0xff, + RGB_BLUE(color) < 0xb8 ? RGB_BLUE(color) + 0x48 : 0xff); } colortable[0] = 0; diff --git a/src/drivers/xtheball.c b/src/drivers/xtheball.c index 983978534..5d3a39009 100644 --- a/src/drivers/xtheball.c +++ b/src/drivers/xtheball.c @@ -55,7 +55,7 @@ static VIDEO_UPDATE( xtheball ) /* check for disabled video */ if (tms34010_io_display_blanked(0)) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } diff --git a/src/drivers/yamato.c b/src/drivers/yamato.c index a44a55336..b28622df0 100644 --- a/src/drivers/yamato.c +++ b/src/drivers/yamato.c @@ -100,7 +100,7 @@ PALETTE_INIT( yamato ) bit3 = (color_prom[64] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } color_prom += 64; @@ -127,7 +127,7 @@ PALETTE_INIT( yamato ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+64,r,g,b); + palette_set_color(machine,i+64,r,g,b); color_prom++; } @@ -152,7 +152,7 @@ PALETTE_INIT( yamato ) /* fake colors for bg gradient */ for (i = 0;i < 256;i++) { - palette_set_color(i+16*4+8*4,0,0,i); + palette_set_color(machine,i+16*4+8*4,0,0,i); } } @@ -188,7 +188,7 @@ PALETTE_INIT( toprollr ) b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/drivers/yard.c b/src/drivers/yard.c index 0e7f07563..489544a08 100644 --- a/src/drivers/yard.c +++ b/src/drivers/yard.c @@ -223,8 +223,41 @@ static MACHINE_DRIVER_START( yard ) MACHINE_DRIVER_END /* ROMs */ +ROM_START( 10yard ) + ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ + ROM_LOAD( "yf-a-3p-b", 0x0000, 0x2000, CRC(2e205ec2) SHA1(fcfa08f45423b35f2c99d4e6b5474ab1b3a84fec) ) + ROM_LOAD( "yf-a-3n-b", 0x2000, 0x2000, CRC(82fcd980) SHA1(7846705b29961cb95ee1571ee7e16baceea522d4) ) + ROM_LOAD( "yf-a-3m-b", 0x4000, 0x2000, CRC(a8d5c311) SHA1(28edb5cfd943a2262d7e37ef9a7245f7017cbc51) ) + + ROM_REGION( 0x10000, REGION_CPU2, 0 ) /* 64k for sound cpu */ + ROM_LOAD( "yf-s.3b", 0x8000, 0x2000, CRC(0392a60c) SHA1(68030504eafc58db250099edd3c3323bdb9eff6b) ) + ROM_LOAD( "yf-s.1b", 0xa000, 0x2000, CRC(6588f41a) SHA1(209305efc68171886427216b9a0b37333f40daa8) ) + ROM_LOAD( "yf-s.3a", 0xc000, 0x2000, CRC(bd054e44) SHA1(f10c32c70d60680229fc0891d0e1308015fa69d6) ) + ROM_LOAD( "yf-s.1a", 0xe000, 0x2000, CRC(2490d4c3) SHA1(e4da7b01e8ad075b7e3c8beb6668faff72db9aa2) ) + + ROM_REGION( 0x06000, REGION_GFX1, ROMREGION_DISPOSE ) + ROM_LOAD( "yf-a.3e", 0x00000, 0x2000, CRC(77e9e9cc) SHA1(90b0226fc125713dbee2804aeceeb5aa2c8e275e) ) /* chars */ + ROM_LOAD( "yf-a.3d", 0x02000, 0x2000, CRC(854d5ff4) SHA1(9ba09bfabf159facb57faecfe73a6258fa48d152) ) + ROM_LOAD( "yf-a.3c", 0x04000, 0x2000, CRC(0cd8ffad) SHA1(bd1262de3823c34f7394b718477fb5bc58a6e293) ) + + ROM_REGION( 0x0c000, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "yf-b.5b", 0x00000, 0x2000, CRC(1299ae30) SHA1(07d47f827d8bc78a41011ec02ab64036fb8a7a18) ) /* sprites */ + ROM_LOAD( "yf-b.5c", 0x02000, 0x2000, CRC(8708b888) SHA1(8c4f305a339f23ec8ed40dfd72fac0f62ee65378) ) + ROM_LOAD( "yf-b.5f", 0x04000, 0x2000, CRC(d9bb8ab8) SHA1(1325308b4c85355298fec4aa3e5fec1b4b13ad86) ) + ROM_LOAD( "yf-b.5e", 0x06000, 0x2000, CRC(47077e8d) SHA1(5f78b15fb360e9926ef11841d5d86f2bd9af04d1) ) + ROM_LOAD( "yf-b.5j", 0x08000, 0x2000, CRC(713ef31f) SHA1(b48df9ed4f26fded3c7eaac3a52b580b2dd60477) ) + ROM_LOAD( "yf-b.5k", 0x0a000, 0x2000, CRC(f49651cc) SHA1(5b87d7360bcd5883ec265b2a01a3e02e10a85345) ) + + ROM_REGION( 0x0520, REGION_PROMS, 0 ) + ROM_LOAD( "yard.1c", 0x0000, 0x0100, CRC(08fa5103) SHA1(98af48dafbbaa42f58232bf74ccbf5da41723e71) ) /* chars palette low 4 bits */ + ROM_LOAD( "yard.1d", 0x0100, 0x0100, CRC(7c04994c) SHA1(790bf1616335b9df4943cffcafa48d8e8aee009e) ) /* chars palette high 4 bits */ + ROM_LOAD( "yard.1f", 0x0200, 0x0020, CRC(b8554da5) SHA1(963ca815b5f791b8a7b0937a5d392d5203049eb3) ) /* sprites palette */ + ROM_LOAD( "yard.2h", 0x0220, 0x0100, CRC(e1cdfb06) SHA1(a8cc3456cfc272e3faac80370b2298d8e1f8c2fe) ) /* sprites lookup table */ + ROM_LOAD( "yard.2n", 0x0320, 0x0100, CRC(cd85b646) SHA1(5268db705006058eec308afe474f4df3c15465bb) ) /* radar palette low 4 bits */ + ROM_LOAD( "yard.2m", 0x0420, 0x0100, CRC(45384397) SHA1(e4c662ee81aef63efd8b4a45f85c4a78dc2d419e) ) /* radar palette high 4 bits */ +ROM_END -ROM_START( yard ) +ROM_START( 10yardj ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ ROM_LOAD( "yf-a.3p", 0x0000, 0x2000, CRC(4586114f) SHA1(a31c68770e7a7eed805c5ba46af302c2895e3cee) ) ROM_LOAD( "yf-a.3n", 0x2000, 0x2000, CRC(947fa760) SHA1(bd6c2ee6e6800b063b81dbdd9fc929120019439d) ) @@ -258,7 +291,7 @@ ROM_START( yard ) ROM_LOAD( "yard.2m", 0x0420, 0x0100, CRC(45384397) SHA1(e4c662ee81aef63efd8b4a45f85c4a78dc2d419e) ) /* radar palette high 4 bits */ ROM_END -ROM_START( vsyard ) +ROM_START( vs10yard ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ ROM_LOAD( "a.3p", 0x0000, 0x2000, CRC(1edac08f) SHA1(c6a3290e9dba663dccf0613853abfab8e912477d) ) ROM_LOAD( "vyf-a.3m", 0x2000, 0x2000, CRC(3b9330f8) SHA1(b35fe72cf724cfb887906060bbcf40b0c896ccf0) ) @@ -292,7 +325,7 @@ ROM_START( vsyard ) ROM_LOAD( "yard.2m", 0x0420, 0x0100, CRC(45384397) SHA1(e4c662ee81aef63efd8b4a45f85c4a78dc2d419e) ) /* radar palette high 4 bits */ ROM_END -ROM_START( vsyard2 ) +ROM_START( vs10yarj ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ ROM_LOAD( "vyf-a.3n", 0x0000, 0x2000, CRC(418e01fc) SHA1(56a6515735cd88ec803e24574a28aef823a5d36b) ) ROM_LOAD( "vyf-a.3m", 0x2000, 0x2000, CRC(3b9330f8) SHA1(b35fe72cf724cfb887906060bbcf40b0c896ccf0) ) @@ -328,6 +361,7 @@ ROM_END /* Game Drivers */ -GAME( 1983, yard, 0, yard, yard, 0, ROT0, "Irem", "10-Yard Fight (Japan)", 0 ) -GAME( 1984, vsyard, yard, yard, vsyard, 0, ROT0, "Irem", "Vs 10-Yard Fight (World, 11/05/84)", 0 ) -GAME( 1984, vsyard2, yard, yard, vsyard, 0, ROT0, "Irem", "Vs 10-Yard Fight (Japan)", 0 ) +GAME( 1983, 10yard, 0, yard, yard, 0, ROT0, "Irem", "10-Yard Fight (World)", 0 ) +GAME( 1983, 10yardj, 10yard, yard, yard, 0, ROT0, "Irem", "10-Yard Fight (Japan)", 0 ) +GAME( 1984, vs10yard, 10yard, yard, vsyard, 0, ROT0, "Irem", "Vs 10-Yard Fight (World, 11/05/84)", 0 ) +GAME( 1984, vs10yarj, 10yard, yard, vsyard, 0, ROT0, "Irem", "Vs 10-Yard Fight (Japan)", 0 ) diff --git a/src/drivers/zac2650.c b/src/drivers/zac2650.c index 02565b473..3b3a51e35 100644 --- a/src/drivers/zac2650.c +++ b/src/drivers/zac2650.c @@ -238,8 +238,8 @@ INPUT_PORTS_END static PALETTE_INIT( zac2650 ) { - palette_set_color(0,0x00,0x00,0x00); /* BLACK */ - palette_set_color(1,0xff,0xff,0xff); /* WHITE */ + palette_set_color(machine,0,0x00,0x00,0x00); /* BLACK */ + palette_set_color(machine,1,0xff,0xff,0xff); /* WHITE */ colortable[0] = 0; colortable[1] = 1; colortable[2] = 0; diff --git a/src/drivers/zaxxon.c b/src/drivers/zaxxon.c index 39340d652..bfd52663a 100644 --- a/src/drivers/zaxxon.c +++ b/src/drivers/zaxxon.c @@ -142,6 +142,162 @@ VBlank triggers IRQ, handled with interrupt mode 1 NMI causes a ROM/RAM test. + ---------------------------------------------------------------------- + + There are two different Congo Bongo boardsets. One is a 3-stack (which I have) + and the other is a 2-stack. + + The smaller third board is just a dedicated sound board, then later they started + making 2-stack boardset versions with merged sound circuits built into the control + board. + + The schematic name for the control board on the two-stack set is "Control Board II" + my boardset uses control board 1. + + The ROMs that are dumped for MAME are from the 3-stack boardset. + The ROMs on control board II are in different socket assignments than the ROMs + found on control board 1. + + For example: + MAME congo1.bin = ROM 1 at location U35 on the 3-stack control board 1 + MAME congo1.bin = ROM 1 at location U21 on the 2-stack control board II + + So the locations are different between the two boardsets but they appear to use + the same ROM. + + The Video boards are exactly the same between the two boardset versions (bottom + board) nothing changed with the video boards. + + The biggest difference to me seems to be the ROM at U87 on Control Board II, + The part number for this ROM is different on the control board 1 three-stack + set at U68. + + Schematic part number for U68 (3-stack) is TBP28S42 PR-5308, and the chip has a + decal with "MR020" on it. + + The 2-stack U87 ROM numbers are TBP28L22 PR-5315. Unknown what the decal or the + top of that chip reads. Schematic shows only U87 and the part number. + + ROM locations are different with ROMs 1-5 on control board II and a different + numbered ROM in U87. + + Possibly an undumped ROM or just a larger capacity bipolar PROM... (?) + + 3-stack control board U68 MR020 = TBP28S42 PR-5308 + + 2-stack control board U87 unknown = TBP28L22 PR-5315 *BIPOLAR PROM* Xref=National 74LS471 + + + some pinout differences between the two: + + 512*8 + +------+ + A0 |1 20| Vcc + A1 |2 19| A8 + A2 |3 18| A7 + A3 |4 17| A6 + A4 |5 16| A5 + O1 |6 15| CE/ + O2 |7 14| O8 + O3 |8 13| O7 + O4 |9 12| O6 + GND|10 11| O5 + +------+ + + cross ref: + Signetics MMI TI Harris Raytheon AMD National Intel Fujitsu + --------- --- -- ------ -------- --- -------- ----- ------- + TS 82S147 (60ns) 6349-1 28S42 7649-5 29621 - 74S472 - TS MB7124 + 82S147A(45ns) 6349-2 - 7649A-5 29621A 27S29 74S472A - + 63S481 + OC - - - - - - 74S473 + + + ---------------------------------------------------------------------- + + 256*8 + +------+ + A0 |1 20| Vcc + A1 |2 19| A7 + A2 |3 18| A6 + A3 |4 17| A5 + A4 |5 16| CE1/ + O1 |6 15| CE2/ + O2 |7 14| O8 + O3 |8 13| O7 + O4 |9 12| O6 + GND|10 11| O5 + +------+ + + cross ref: + Signetics MMI TI Harris Raytheon AMD National Intel + --------- --- -- ------ -------- --- -------- ----- + TS 82S135 (45ns) 6309-1 18S22 - - - - - + 82LS135(100ns)- 28L22 - - - 74LS471 - + + + ----ROM--NAMES------------------------------------- + + + THREE STACK BOARDSET + control board = 834-5166 + video board = 834-5167 + sound board = 834-5168 + + + Current MAME Schematic Board + Names Names Location (3-stack) + ------------ --------- ------------------- + + congo.u68 = MR020 U68 control board + congo1.bin = ROM 1 U35 control board + congo2.bin = ROM 2 U34 control board + congo3.bin = ROM 3 U33 control board + congo4.bin = ROM 4 U32 control board + congo5.bin = ROM 5 U76 control board + congo6.bin = ROM 6 U57 video board + congo7.bin = ROM 7 U58 video board + congo8.bin = ROM 8 U93 video board + congo9.bin = ROM 9 U94 video board + congo10.bin = ROM 10 U95 video board + congo11.bin = ROM 11 U77 video board + congo12.bin = ROM 12 U78 video board + congo13.bin = ROM 13 U79 video board + congo14.bin = ROM 14 U104 video board + congo15.bin = ROM 15 U105 video board + congo16.bin = ROM 16 U106 video board + congo17.bin = ROM 17 U11 sound board + + + + TWO STACK BOARDSET + control board II = 834-5212 + video board = 834-5167 + + + Current MAME Schematic Board + Names Names Location (2-stack) + ------------ --------- ------------------- + + not dumped (?) U87 control board + congo1.bin = ROM 1 U21 control board + congo2.bin = ROM 2 U22 control board + congo3.bin = ROM 3 U23 control board + congo4.bin = ROM 4 U24 control board + congo5.bin = ROM 5 U77 control board + congo6.bin = ROM 6 U57 video board + congo7.bin = ROM 7 U58 video board + congo8.bin = ROM 8 U93 video board + congo9.bin = ROM 9 U94 video board + congo10.bin = ROM 10 U95 video board + congo11.bin = ROM 11 U77 video board + congo12.bin = ROM 12 U78 video board + congo13.bin = ROM 13 U79 video board + congo14.bin = ROM 14 U104 video board + congo15.bin = ROM 15 U105 video board + congo16.bin = ROM 16 U106 video board + congo17.bin = ROM 17 U19 control board + ***************************************************************************/ #include "driver.h" @@ -1271,28 +1427,28 @@ static DRIVER_INIT( zaxxon ) static DRIVER_INIT( zaxxonb ) { zaxxonb_decode(); - init_zaxxon(); + init_zaxxon(machine); } static DRIVER_INIT( szaxxon ) { szaxxon_decode(); - init_zaxxon(); + init_zaxxon(machine); } static DRIVER_INIT( futspy ) { futspy_decode(); - init_zaxxon(); + init_zaxxon(machine); } static DRIVER_INIT( razmataz ) { nprinces_decode(); - init_zaxxon(); + init_zaxxon(machine); /* additional input ports are wired */ memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xc004, 0xc004, 0, 0x18f3, port_tag_to_handler8("SW04")); @@ -1315,7 +1471,7 @@ static DRIVER_INIT( razmataz ) static DRIVER_INIT( ixion ) { szaxxon_decode(); - init_zaxxon(); + init_zaxxon(machine); /* connect the universal sound board */ memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xe03c, 0xe03c, 0, 0x1f00, sega_usb_status_r); diff --git a/src/drivers/zn.c b/src/drivers/zn.c index 06e23da5a..5a4ed103c 100644 --- a/src/drivers/zn.c +++ b/src/drivers/zn.c @@ -1277,7 +1277,7 @@ MACHINE_RESET( coh1000ta ) static NVRAM_HANDLER( coh1000ta ) { - nvram_handler_at28c16_0( file, read_or_write ); + nvram_handler_at28c16_0( machine, file, read_or_write ); if (read_or_write) { mame_fwrite(file, taitofx1_eeprom1, taitofx1_eeprom_size1); @@ -1420,7 +1420,7 @@ MACHINE_RESET( coh1000tb ) static NVRAM_HANDLER( coh1000tb ) { - nvram_handler_at28c16_0( file, read_or_write ); + nvram_handler_at28c16_0( machine, file, read_or_write ); if (read_or_write) { mame_fwrite(file, taitofx1_eeprom1, taitofx1_eeprom_size1); diff --git a/src/drivers/zodiack.c b/src/drivers/zodiack.c index 372f90ad0..23c0b54bd 100644 --- a/src/drivers/zodiack.c +++ b/src/drivers/zodiack.c @@ -48,13 +48,13 @@ extern INTERRUPT_GEN( espial_sound_nmi_gen ); static MACHINE_RESET( zodiack ) { percuss_hardware = 0; - machine_reset_espial(); + machine_reset_espial(machine); } static MACHINE_RESET( percuss ) { percuss_hardware = 1; - machine_reset_espial(); + machine_reset_espial(machine); } diff --git a/src/drivers/zr107.c b/src/drivers/zr107.c index f37c20088..4871c6810 100644 --- a/src/drivers/zr107.c +++ b/src/drivers/zr107.c @@ -17,28 +17,10 @@ static UINT8 led_reg0 = 0x7f, led_reg1 = 0x7f; static WRITE32_HANDLER( paletteram32_w ) { - int r,g,b; - int r2,g2,b2; - COMBINE_DATA(&paletteram32[offset]); data = paletteram32[offset]; - - b = ((data >> 16) & 0x1f); - g = ((data >> 21) & 0x1f); - r = ((data >> 26) & 0x1f); - b2 = ((data >> 0) & 0x1f); - g2 = ((data >> 5) & 0x1f); - r2 = ((data >> 10) & 0x1f); - - b = (b << 3) | (b >> 2); - g = (g << 3) | (g >> 2); - r = (r << 3) | (r >> 2); - b2 = (b2 << 3) | (b2 >> 2); - g2 = (g2 << 3) | (g2 >> 2); - r2 = (r2 << 3) | (r2 >> 2); - - palette_set_color((offset * 2) + 0, r, g, b); - palette_set_color((offset * 2) + 1, r2, g2, b2); + palette_set_color(Machine, (offset * 2) + 0, pal5bit(data >> 26), pal5bit(data >> 21), pal5bit(data >> 16)); + palette_set_color(Machine, (offset * 2) + 1, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0)); } #define NUM_LAYERS 2 @@ -432,7 +414,7 @@ static DRIVER_INIT(zr107) static DRIVER_INIT(midnrun) { - init_zr107(); + init_zr107(machine); } diff --git a/src/fileio.c b/src/fileio.c index 442358838..a7a56db2c 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -135,10 +135,10 @@ static chd_interface mame_chd_interface = call mame_fopen before fileio_init -------------------------------------------------*/ -void fileio_init(void) +void fileio_init(running_machine *machine) { chd_set_interface(&mame_chd_interface); - add_exit_callback(fileio_exit); + add_exit_callback(machine, fileio_exit); } @@ -146,7 +146,7 @@ void fileio_init(void) fileio_exit - clean up behind ourselves -------------------------------------------------*/ -void fileio_exit(void) +void fileio_exit(running_machine *machine) { unzip_cache_clear(); } diff --git a/src/fileio.h b/src/fileio.h index 3e38cf06f..33772b0c0 100644 --- a/src/fileio.h +++ b/src/fileio.h @@ -52,8 +52,8 @@ enum /* samples. If 'write' is not 0, the file is opened for write. Otherwise */ /* it is opened for read. */ -void fileio_init(void); -void fileio_exit(void); +void fileio_init(running_machine *machine); +void fileio_exit(running_machine *machine); int mame_faccess(const char *filename, int filetype); mame_file *mame_fopen(const char *gamename, const char *filename, int filetype, int openforwrite); diff --git a/src/includes/8080bw.h b/src/includes/8080bw.h index b603adbb3..08ce95e58 100644 --- a/src/includes/8080bw.h +++ b/src/includes/8080bw.h @@ -36,6 +36,7 @@ READ8_HANDLER( desertgu_port_1_r ); MACHINE_RESET( invaders ); MACHINE_RESET( sstrangr ); MACHINE_RESET( invad2ct ); +MACHINE_RESET( spcewars ); MACHINE_RESET( gunfight ); MACHINE_RESET( boothill ); MACHINE_RESET( phantom2 ); diff --git a/src/includes/arkanoid.h b/src/includes/arkanoid.h new file mode 100644 index 000000000..56f1def35 --- /dev/null +++ b/src/includes/arkanoid.h @@ -0,0 +1,54 @@ +/* This it the best way to allow game specific kludges until the system is fully understood */ +enum { + ARKUNK=0, /* unknown bootlegs for inclusion of possible new sets */ + ARKANGC, + ARKANGC2, + ARKBLOCK, + ARKBLOC2, + ARKGCBL, + PADDLE2 +}; + + +/*----------- defined in drivers/arkanoid.c -----------*/ + +extern int arkanoid_bootleg_id; + + +/*----------- defined in vidhrdw/arkanoid.c -----------*/ + +extern WRITE8_HANDLER( arkanoid_videoram_w ); + +extern WRITE8_HANDLER( arkanoid_d008_w ); + +extern VIDEO_START( arkanoid ); +extern VIDEO_UPDATE( arkanoid ); + + +/*----------- defined in machine/arkanoid.c -----------*/ + +extern MACHINE_START( arkanoid ); +extern MACHINE_RESET( arkanoid ); + +extern READ8_HANDLER( arkanoid_Z80_mcu_r ); +extern WRITE8_HANDLER( arkanoid_Z80_mcu_w ); + +extern READ8_HANDLER( arkanoid_68705_portA_r ); +extern WRITE8_HANDLER( arkanoid_68705_portA_w ); +extern WRITE8_HANDLER( arkanoid_68705_ddrA_w ); + +extern READ8_HANDLER( arkanoid_68705_portC_r ); +extern WRITE8_HANDLER( arkanoid_68705_portC_w ); +extern WRITE8_HANDLER( arkanoid_68705_ddrC_w ); + +extern READ8_HANDLER( arkanoid_68705_input_0_r ); +extern READ8_HANDLER( arkanoid_input_2_r ); + +extern READ8_HANDLER( paddle2_prot_r ); +extern WRITE8_HANDLER( paddle2_prot_w ); +extern READ8_HANDLER( paddle2_track_kludge_r ); + +extern READ8_HANDLER( arkanoid_bootleg_f002_r ); +extern WRITE8_HANDLER( arkanoid_bootleg_d018_w ); +extern READ8_HANDLER( arkanoid_bootleg_d008_r ); + diff --git a/src/includes/asteroid.h b/src/includes/asteroid.h index b2dd8da4a..8f400e5f5 100644 --- a/src/includes/asteroid.h +++ b/src/includes/asteroid.h @@ -26,6 +26,7 @@ MACHINE_RESET( asteroid ); READ8_HANDLER( llander_IN0_r ); +extern UINT8 *asteroid_ram1, *asteroid_ram2; /*----------- defined in sndhrdw/asteroid.c -----------*/ diff --git a/src/includes/grchamp.h b/src/includes/grchamp.h index c3d2ce6c6..e6bb9aa3a 100644 --- a/src/includes/grchamp.h +++ b/src/includes/grchamp.h @@ -6,6 +6,37 @@ #include "sound/discrete.h" +typedef struct _grchamp_state grchamp_state; +struct _grchamp_state +{ + UINT8 cpu0_out[16]; + UINT8 cpu1_out[16]; + + UINT8 comm_latch; + UINT8 comm_latch2[4]; + + UINT16 ledlatch; + UINT8 ledaddr; + UINT16 ledram[8]; + + UINT16 collide; + + UINT8 * radarram; + UINT8 * videoram; + UINT8 * leftram; + UINT8 * centerram; + UINT8 * rightram; + UINT8 * spriteram; + + mame_bitmap *work_bitmap; + tilemap * text_tilemap; + tilemap * left_tilemap; + tilemap * center_tilemap; + tilemap * right_tilemap; + + rgb_t bgcolor[0x20]; +}; + /* Discrete Sound Input Nodes */ #define GRCHAMP_ENGINE_CS_EN NODE_01 #define GRCHAMP_SIFT_DATA NODE_02 @@ -21,43 +52,13 @@ extern discrete_sound_block grchamp_discrete_interface[]; -/*----------- defined in vidhrdw/grchamp.c -----------*/ +WRITE8_HANDLER( grchamp_sound_w ); -extern UINT8 grchamp_videoreg0; -extern UINT8 grchamp_player_ypos; -extern int grchamp_collision; -extern UINT8 grchamp_vreg1[0x10]; -extern UINT8 *grchamp_videoram; -extern UINT8 *grchamp_radar; +/*----------- defined in vidhrdw/grchamp.c -----------*/ PALETTE_INIT( grchamp ); VIDEO_START( grchamp ); VIDEO_UPDATE( grchamp ); -WRITE8_HANDLER( grchamp_videoram_w ); - -WRITE8_HANDLER( grchamp_player_xpos_w ); -WRITE8_HANDLER( grchamp_player_ypos_w ); -WRITE8_HANDLER( grchamp_tile_select_w ); -WRITE8_HANDLER( grchamp_rain_xpos_w ); -WRITE8_HANDLER( grchamp_rain_ypos_w ); - -/*----------- defined in machine/grchamp.c -----------*/ - -extern int grchamp_cpu_irq_enable[2]; - -DRIVER_INIT( grchamp ); -READ8_HANDLER( grchamp_port_0_r ); -READ8_HANDLER( grchamp_port_1_r ); -WRITE8_HANDLER( grchamp_port_1_w ); - -WRITE8_HANDLER( grchamp_control0_w ); -WRITE8_HANDLER( grchamp_coinled_w ); -WRITE8_HANDLER( grchamp_sound_w ); -WRITE8_HANDLER( grchamp_comm_w ); - -WRITE8_HANDLER( grchamp_portA_0_w ); -WRITE8_HANDLER( grchamp_portB_0_w ); -WRITE8_HANDLER( grchamp_portA_1_w ); -WRITE8_HANDLER( grchamp_portB_1_w ); -WRITE8_HANDLER( grchamp_portA_2_w ); -WRITE8_HANDLER( grchamp_portB_2_w ); +WRITE8_HANDLER( grchamp_left_w ); +WRITE8_HANDLER( grchamp_center_w ); +WRITE8_HANDLER( grchamp_right_w ); diff --git a/src/includes/n64.h b/src/includes/n64.h index 8785c58bb..618598e6c 100644 --- a/src/includes/n64.h +++ b/src/includes/n64.h @@ -24,7 +24,7 @@ extern void rdp_process_list(void); #define SP_STATUS_DMAFULL 0x0008 #define SP_STATUS_IOFULL 0x0010 #define SP_STATUS_SSTEP 0x0020 -#define SP_STATUS_INT_ON_BRK 0x0040 +#define SP_STATUS_INTR_BREAK 0x0040 #define SP_STATUS_SIGNAL0 0x0080 #define SP_STATUS_SIGNAL1 0x0100 #define SP_STATUS_SIGNAL2 0x0200 diff --git a/src/includes/turbo.h b/src/includes/turbo.h index bfd4f0a31..a37dbbafa 100644 --- a/src/includes/turbo.h +++ b/src/includes/turbo.h @@ -6,71 +6,102 @@ #include "sound/discrete.h" -/*----------- defined in machine/turbo.c -----------*/ - -extern UINT8 turbo_opa, turbo_opb, turbo_opc; -extern UINT8 turbo_ipa, turbo_ipb, turbo_ipc; -extern UINT8 turbo_fbpla, turbo_fbcol; -extern UINT8 turbo_speed; - -extern UINT8 subroc3d_col, subroc3d_ply, subroc3d_chofs; - -extern UINT8 buckrog_fchg, buckrog_mov, buckrog_obch; - -MACHINE_RESET( turbo ); -MACHINE_RESET( subroc3d ); -MACHINE_RESET( buckrog ); - -READ8_HANDLER( turbo_8279_r ); -WRITE8_HANDLER( turbo_8279_w ); - -READ8_HANDLER( turbo_collision_r ); -WRITE8_HANDLER( turbo_collision_clear_w ); -WRITE8_HANDLER( turbo_coin_and_lamp_w ); - -void turbo_rom_decode(void); +/* sprites are scaled in the analog domain; to give a better */ +/* rendition of this, we scale in the X direction by this factor */ +#define TURBO_X_SCALE 2 + + +typedef struct _i8279_state i8279_state; +struct _i8279_state +{ + UINT8 command; + UINT8 mode; + UINT8 prescale; + UINT8 inhibit; + UINT8 clear; + UINT8 ram[16]; +}; + + +typedef struct _turbo_state turbo_state; +struct _turbo_state +{ + /* memory pointers */ + UINT8 * videoram; + UINT8 * spriteram; + UINT8 * sprite_position; + UINT8 * buckrog_bitmap_ram; + + /* machine states */ + i8279_state i8279; + + /* sound state */ + UINT8 turbo_osel, turbo_bsel; + UINT8 sound_state[3]; + + /* video state */ + tilemap * fg_tilemap; + + /* Turbo-specific states */ + UINT8 turbo_opa, turbo_opb, turbo_opc; + UINT8 turbo_ipa, turbo_ipb, turbo_ipc; + UINT8 turbo_fbpla, turbo_fbcol; + UINT8 turbo_speed; + UINT8 turbo_collision; + UINT8 turbo_last_analog; + UINT8 turbo_accel; + + /* Subroc-specific states */ + UINT8 subroc3d_col, subroc3d_ply, subroc3d_flip; + UINT8 subroc3d_mdis, subroc3d_mdir; + UINT8 subroc3d_tdis, subroc3d_tdir; + UINT8 subroc3d_fdis, subroc3d_fdir; + UINT8 subroc3d_hdis, subroc3d_hdir; + + /* Buck Rogers-specific states */ + UINT8 buckrog_fchg, buckrog_mov, buckrog_obch; + UINT8 buckrog_command; + UINT8 buckrog_myship; +}; + + +/*----------- defined in drivers/turbo.c -----------*/ void turbo_update_tachometer(void); void turbo_update_segments(void); -READ8_HANDLER( buckrog_cpu2_command_r ); -READ8_HANDLER( buckrog_port_2_r ); -READ8_HANDLER( buckrog_port_3_r ); -WRITE8_HANDLER( buckrog_ppi8255_0_w ); /*----------- defined in sndhrdw/turbo.c -----------*/ -extern discrete_sound_block turbo_sound_interface[]; +MACHINE_DRIVER_EXTERN( turbo_samples ); +MACHINE_DRIVER_EXTERN( subroc3d_samples ); +MACHINE_DRIVER_EXTERN( buckrog_samples ); -WRITE8_HANDLER( turbo_sound_A_w ); -WRITE8_HANDLER( turbo_sound_B_w ); -WRITE8_HANDLER( turbo_sound_C_w ); +WRITE8_HANDLER( turbo_sound_a_w ); +WRITE8_HANDLER( turbo_sound_b_w ); +WRITE8_HANDLER( turbo_sound_c_w ); -WRITE8_HANDLER( subroc3d_sound_A_w ); -WRITE8_HANDLER( subroc3d_sound_B_w ); -WRITE8_HANDLER( subroc3d_sound_C_w ); +WRITE8_HANDLER( subroc3d_sound_a_w ); +WRITE8_HANDLER( subroc3d_sound_b_w ); +WRITE8_HANDLER( subroc3d_sound_c_w ); -WRITE8_HANDLER( buckrog_sound_A_w ); -WRITE8_HANDLER( buckrog_sound_B_w ); +WRITE8_HANDLER( buckrog_sound_a_w ); +WRITE8_HANDLER( buckrog_sound_b_w ); /*----------- defined in vidhrdw/turbo.c -----------*/ -extern UINT8 *sega_sprite_position; -extern UINT8 turbo_collision; - PALETTE_INIT( turbo ); VIDEO_START( turbo ); -VIDEO_EOF( turbo ); VIDEO_UPDATE( turbo ); PALETTE_INIT( subroc3d ); -VIDEO_START( subroc3d ); VIDEO_UPDATE( subroc3d ); PALETTE_INIT( buckrog ); VIDEO_START( buckrog ); VIDEO_UPDATE( buckrog ); +WRITE8_HANDLER( turbo_videoram_w ); WRITE8_HANDLER( buckrog_bitmap_w ); diff --git a/src/inptport.c b/src/inptport.c index 4ce9ba4fd..4f2ef5335 100644 --- a/src/inptport.c +++ b/src/inptport.c @@ -860,48 +860,49 @@ static const input_port_default_entry default_ports_builtin[] = INPUT_PORT_DIGITAL_DEF( 0, IPG_OTHER, KEYBOARD, "Keyboard", SEQ_DEF_0 ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ON_SCREEN_DISPLAY,"On Screen Display", SEQ_DEF_1(KEYCODE_TILDE) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_DEBUG_BREAK, "Break in Debugger", SEQ_DEF_1(KEYCODE_TILDE) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_CONFIGURE, "Config Menu", SEQ_DEF_1(KEYCODE_TAB) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PAUSE, "Pause", SEQ_DEF_1(KEYCODE_P) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_RESET_MACHINE, "Reset Game", SEQ_DEF_2(KEYCODE_F3, KEYCODE_LSHIFT) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SOFT_RESET, "Soft Reset", SEQ_DEF_3(KEYCODE_F3, CODE_NOT, KEYCODE_LSHIFT) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SHOW_GFX, "Show Gfx", SEQ_DEF_1(KEYCODE_F4) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_FRAMESKIP_DEC, "Frameskip Dec", SEQ_DEF_1(KEYCODE_F8) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_FRAMESKIP_INC, "Frameskip Inc", SEQ_DEF_1(KEYCODE_F9) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_THROTTLE, "Throttle", SEQ_DEF_1(KEYCODE_F10) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SHOW_FPS, "Show FPS", SEQ_DEF_5(KEYCODE_F11, CODE_NOT, KEYCODE_LCONTROL, CODE_NOT, KEYCODE_LSHIFT) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SNAPSHOT, "Save Snapshot", SEQ_DEF_3(KEYCODE_F12, CODE_NOT, KEYCODE_LSHIFT) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_RECORD_MOVIE, "Record Movie", SEQ_DEF_2(KEYCODE_F12, KEYCODE_LSHIFT) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_TOGGLE_CHEAT, "Toggle Cheat", SEQ_DEF_1(KEYCODE_F6) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_UP, "UI Up", SEQ_DEF_3(KEYCODE_UP, CODE_OR, JOYCODE_1_UP) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_DOWN, "UI Down", SEQ_DEF_3(KEYCODE_DOWN, CODE_OR, JOYCODE_1_DOWN) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_LEFT, "UI Left", SEQ_DEF_3(KEYCODE_LEFT, CODE_OR, JOYCODE_1_LEFT) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_RIGHT, "UI Right", SEQ_DEF_3(KEYCODE_RIGHT, CODE_OR, JOYCODE_1_RIGHT) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_HOME, "UI Home", SEQ_DEF_1(KEYCODE_HOME) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_END, "UI End", SEQ_DEF_1(KEYCODE_END) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PAGE_UP, "UI Page Up", SEQ_DEF_1(KEYCODE_PGUP) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PAGE_DOWN, "UI Page Down", SEQ_DEF_1(KEYCODE_PGDN) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SELECT, "UI Select", SEQ_DEF_3(KEYCODE_ENTER, CODE_OR, JOYCODE_1_BUTTON1) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_CANCEL, "UI Cancel", SEQ_DEF_1(KEYCODE_ESC) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_CLEAR, "UI Clear", SEQ_DEF_1(KEYCODE_DEL) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ZOOM_IN, "UI Zoom In", SEQ_DEF_1(KEYCODE_EQUALS) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ZOOM_OUT, "UI Zoom Out", SEQ_DEF_1(KEYCODE_MINUS) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PREV_GROUP, "UI Previous Group", SEQ_DEF_1(KEYCODE_OPENBRACE) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_NEXT_GROUP, "UI Next Group", SEQ_DEF_1(KEYCODE_CLOSEBRACE) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ROTATE, "UI Rotate", SEQ_DEF_1(KEYCODE_R) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SHOW_PROFILER, "Show Profiler", SEQ_DEF_2(KEYCODE_F11, KEYCODE_LSHIFT) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_DEBUG_BREAK, "Break in Debugger", SEQ_DEF_1(KEYCODE_TILDE) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_CONFIGURE, "Config Menu", SEQ_DEF_1(KEYCODE_TAB) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PAUSE, "Pause", SEQ_DEF_1(KEYCODE_P) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_RESET_MACHINE, "Reset Game", SEQ_DEF_2(KEYCODE_F3, KEYCODE_LSHIFT) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SOFT_RESET, "Soft Reset", SEQ_DEF_3(KEYCODE_F3, CODE_NOT, KEYCODE_LSHIFT) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SHOW_GFX, "Show Gfx", SEQ_DEF_1(KEYCODE_F4) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_FRAMESKIP_DEC, "Frameskip Dec", SEQ_DEF_1(KEYCODE_F8) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_FRAMESKIP_INC, "Frameskip Inc", SEQ_DEF_1(KEYCODE_F9) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_THROTTLE, "Throttle", SEQ_DEF_1(KEYCODE_F10) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SHOW_FPS, "Show FPS", SEQ_DEF_5(KEYCODE_F11, CODE_NOT, KEYCODE_LCONTROL, CODE_NOT, KEYCODE_LSHIFT) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SNAPSHOT, "Save Snapshot", SEQ_DEF_3(KEYCODE_F12, CODE_NOT, KEYCODE_LSHIFT) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_RECORD_MOVIE, "Record Movie", SEQ_DEF_2(KEYCODE_F12, KEYCODE_LSHIFT) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_TOGGLE_CHEAT, "Toggle Cheat", SEQ_DEF_1(KEYCODE_F6) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_UP, "UI Up", SEQ_DEF_3(KEYCODE_UP, CODE_OR, JOYCODE_1_UP) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_DOWN, "UI Down", SEQ_DEF_3(KEYCODE_DOWN, CODE_OR, JOYCODE_1_DOWN) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_LEFT, "UI Left", SEQ_DEF_3(KEYCODE_LEFT, CODE_OR, JOYCODE_1_LEFT) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_RIGHT, "UI Right", SEQ_DEF_3(KEYCODE_RIGHT, CODE_OR, JOYCODE_1_RIGHT) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_HOME, "UI Home", SEQ_DEF_1(KEYCODE_HOME) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_END, "UI End", SEQ_DEF_1(KEYCODE_END) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PAGE_UP, "UI Page Up", SEQ_DEF_1(KEYCODE_PGUP) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PAGE_DOWN, "UI Page Down", SEQ_DEF_1(KEYCODE_PGDN) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SELECT, "UI Select", SEQ_DEF_3(KEYCODE_ENTER, CODE_OR, JOYCODE_1_BUTTON1) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_CANCEL, "UI Cancel", SEQ_DEF_1(KEYCODE_ESC) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_CLEAR, "UI Clear", SEQ_DEF_1(KEYCODE_DEL) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ZOOM_IN, "UI Zoom In", SEQ_DEF_1(KEYCODE_EQUALS) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ZOOM_OUT, "UI Zoom Out", SEQ_DEF_1(KEYCODE_MINUS) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_PREV_GROUP, "UI Previous Group", SEQ_DEF_1(KEYCODE_OPENBRACE) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_NEXT_GROUP, "UI Next Group", SEQ_DEF_1(KEYCODE_CLOSEBRACE) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ROTATE, "UI Rotate", SEQ_DEF_1(KEYCODE_R) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SHOW_PROFILER, "Show Profiler", SEQ_DEF_2(KEYCODE_F11, KEYCODE_LSHIFT) ) #ifdef MESS - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_TOGGLE_UI, "UI Toggle", SEQ_DEF_1(KEYCODE_SCRLOCK) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_TOGGLE_UI, "UI Toggle", SEQ_DEF_1(KEYCODE_SCRLOCK) ) #endif - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_TOGGLE_DEBUG, "Toggle Debugger", SEQ_DEF_1(KEYCODE_F5) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SAVE_STATE, "Save State", SEQ_DEF_2(KEYCODE_F7, KEYCODE_LSHIFT) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_LOAD_STATE, "Load State", SEQ_DEF_3(KEYCODE_F7, CODE_NOT, KEYCODE_LSHIFT) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ADD_CHEAT, "Add Cheat", SEQ_DEF_1(KEYCODE_A) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_DELETE_CHEAT, "Delete Cheat", SEQ_DEF_1(KEYCODE_D) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SAVE_CHEAT, "Save Cheat", SEQ_DEF_1(KEYCODE_S) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_WATCH_VALUE, "Watch Value", SEQ_DEF_1(KEYCODE_W) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_EDIT_CHEAT, "Edit Cheat", SEQ_DEF_1(KEYCODE_E) ) - INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_TOGGLE_CROSSHAIR,"Toggle Crosshair", SEQ_DEF_1(KEYCODE_F1) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_TOGGLE_DEBUG, "Toggle Debugger", SEQ_DEF_1(KEYCODE_F5) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SAVE_STATE, "Save State", SEQ_DEF_2(KEYCODE_F7, KEYCODE_LSHIFT) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_LOAD_STATE, "Load State", SEQ_DEF_3(KEYCODE_F7, CODE_NOT, KEYCODE_LSHIFT) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_ADD_CHEAT, "Add Cheat", SEQ_DEF_1(KEYCODE_A) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_DELETE_CHEAT, "Delete Cheat", SEQ_DEF_1(KEYCODE_D) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_SAVE_CHEAT, "Save Cheat", SEQ_DEF_1(KEYCODE_S) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_WATCH_VALUE, "Watch Value", SEQ_DEF_1(KEYCODE_W) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_EDIT_CHEAT, "Edit Cheat", SEQ_DEF_1(KEYCODE_E) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_RELOAD_CHEAT, "Reload Database", SEQ_DEF_1(KEYCODE_L) ) + INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, UI_TOGGLE_CROSSHAIR, "Toggle Crosshair", SEQ_DEF_1(KEYCODE_F1) ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, OSD_1, NULL, SEQ_DEF_0 ) INPUT_PORT_DIGITAL_DEF( 0, IPG_UI, OSD_2, NULL, SEQ_DEF_0 ) @@ -957,7 +958,7 @@ static void interpolate_analog_port(int port); * *************************************/ -int input_port_init(void (*construct_ipt)(input_port_init_params *)) +int input_port_init(running_machine *machine, void (*construct_ipt)(input_port_init_params *)) { int ipnum, player; @@ -2119,21 +2120,27 @@ static void update_playback_record(int portnum, UINT32 portvalue) void input_port_update_defaults(void) { - int portnum; + int loopnum, portnum; - /* loop over all input ports */ - for (portnum = 0; portnum < MAX_INPUT_PORTS; portnum++) - { - input_port_info *portinfo = &port_info[portnum]; - input_bit_info *info; - int bitnum; + /* two passes to catch conditionals properly */ + for (loopnum = 0; loopnum < 2; loopnum++) - /* first compute the default value for the entire port */ - portinfo->defvalue = 0; - for (bitnum = 0, info = &portinfo->bit[0]; bitnum < MAX_BITS_PER_PORT && info->port; bitnum++, info++) - if (input_port_condition(info->port)) - portinfo->defvalue = (portinfo->defvalue & ~info->port->mask) | (info->port->default_value & info->port->mask); - } + /* loop over all input ports */ + for (portnum = 0; portnum < MAX_INPUT_PORTS; portnum++) + { + input_port_info *portinfo = &port_info[portnum]; + input_bit_info *info; + int bitnum; + + /* only clear on the first pass */ + if (loopnum == 0) + portinfo->defvalue = 0; + + /* first compute the default value for the entire port */ + for (bitnum = 0, info = &portinfo->bit[0]; bitnum < MAX_BITS_PER_PORT && info->port; bitnum++, info++) + if (input_port_condition(info->port)) + portinfo->defvalue = (portinfo->defvalue & ~info->port->mask) | (info->port->default_value & info->port->mask); + } } @@ -2677,7 +2684,7 @@ void input_port_set_changed_callback(int port, UINT32 mask, void (*callback)(voi input_port_info *portinfo = &port_info[port]; changed_callback_info *cbinfo; - assert_always(mame_get_phase() == MAME_PHASE_INIT, "Can only call input_port_set_changed_callback() at init time!"); + assert_always(mame_get_phase(Machine) == MAME_PHASE_INIT, "Can only call input_port_set_changed_callback() at init time!"); assert_always((port >= 0) && (port < MAX_INPUT_PORTS), "Invalid port number passed to input_port_set_changed_callback()!"); cbinfo = auto_malloc(sizeof(*cbinfo)); diff --git a/src/inptport.h b/src/inptport.h index 1eef15104..1406ae336 100644 --- a/src/inptport.h +++ b/src/inptport.h @@ -250,6 +250,7 @@ enum IPT_UI_SAVE_CHEAT, IPT_UI_WATCH_VALUE, IPT_UI_EDIT_CHEAT, + IPT_UI_RELOAD_CHEAT, IPT_UI_TOGGLE_CROSSHAIR, /* additional OSD-specified UI port types (up to 16) */ @@ -680,7 +681,7 @@ extern const char *input_port_default_strings[]; FUNCTION PROTOTYPES ***************************************************************************/ -int input_port_init(void (*construct_ipt)(input_port_init_params *)); +int input_port_init(running_machine *machine, void (*construct_ipt)(input_port_init_params *)); input_port_entry *input_port_initialize(input_port_init_params *params, UINT32 type, const char *tag, UINT32 mask); input_port_entry *input_port_allocate(void (*construct_ipt)(input_port_init_params *), input_port_entry *memory); diff --git a/src/input.c b/src/input.c index 471253d05..ee5a35378 100644 --- a/src/input.c +++ b/src/input.c @@ -517,7 +517,7 @@ static UINT8 record_analog; /* are we recording an analog sequence? */ * *************************************/ -int code_init(void) +int code_init(running_machine *machine) { const os_code_info *codelist = osd_get_code_list(); const os_code_info *info; diff --git a/src/input.h b/src/input.h index 9248fdffd..d83e26345 100644 --- a/src/input.h +++ b/src/input.h @@ -518,7 +518,7 @@ typedef struct _input_seq input_seq; ***************************************************************************/ /* single code functions */ -int code_init(void); +int code_init(running_machine *machine); INT32 code_analog_value(input_code code); int code_pressed(input_code code); diff --git a/src/layout/bfm_sc2.lay b/src/layout/bfm_sc2.lay index 32255f3c7..f360361bd 100644 --- a/src/layout/bfm_sc2.lay +++ b/src/layout/bfm_sc2.lay @@ -1,22 +1,37 @@ + + + + + + + + + + + + + - + - + - + - + - + + + diff --git a/src/layout/buckrog.lay b/src/layout/buckrog.lay index 7274fca6e..948e3b68c 100644 --- a/src/layout/buckrog.lay +++ b/src/layout/buckrog.lay @@ -1,37 +1,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -44,128 +14,128 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/layout/maxaflex.lay b/src/layout/maxaflex.lay index c55e9fd6c..07e9f748d 100644 --- a/src/layout/maxaflex.lay +++ b/src/layout/maxaflex.lay @@ -41,37 +41,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/src/layout/mpu4.lay b/src/layout/mpu4.lay new file mode 100644 index 000000000..00e28cb98 --- /dev/null +++ b/src/layout/mpu4.lay @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/layout/subroc3d.lay b/src/layout/subroc3d.lay index dca62ce77..ee0394446 100644 --- a/src/layout/subroc3d.lay +++ b/src/layout/subroc3d.lay @@ -1,37 +1,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -43,79 +13,79 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/layout/turbo.lay b/src/layout/turbo.lay index ce3e4b0d4..1c805d8cc 100644 --- a/src/layout/turbo.lay +++ b/src/layout/turbo.lay @@ -1,37 +1,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -104,128 +74,128 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/machine/6526cia.c b/src/machine/6526cia.c index e1ca4cbe3..49282ffb8 100644 --- a/src/machine/6526cia.c +++ b/src/machine/6526cia.c @@ -136,7 +136,7 @@ static void cia_timer_proc(void *param); ***************************************************************************/ -static void cia_exit(void) +static void cia_exit(running_machine *machine) { memset(cia_array, 0, sizeof(*cia_array)); } @@ -149,7 +149,7 @@ void cia_config(int which, const cia6526_interface *intf) cia_state *cia = &cia_array[which]; /* sanity checks */ - assert_always(mame_get_phase() == MAME_PHASE_INIT, "Can only call cia_config at init time!"); + assert_always(mame_get_phase(Machine) == MAME_PHASE_INIT, "Can only call cia_config at init time!"); assert_always((which >= 0) && (which < (sizeof(cia_array) / sizeof(cia_array[0]))), "cia_config called on an invalid CIA!"); @@ -182,7 +182,7 @@ void cia_config(int which, const cia6526_interface *intf) /* special case; for the first CIA, set up an exit handler to clear things out */ if (which == 0) - add_exit_callback(cia_exit); + add_exit_callback(Machine, cia_exit); } diff --git a/src/machine/6821pia.c b/src/machine/6821pia.c index ae51420b6..24efd0580 100644 --- a/src/machine/6821pia.c +++ b/src/machine/6821pia.c @@ -95,7 +95,7 @@ static const UINT8 swizzle_address[4] = { 0, 2, 1, 3 }; void pia_config(int which, int addressing, const pia6821_interface *intf) { - assert_always(mame_get_phase() == MAME_PHASE_INIT, "Can only call pia_config at init time!"); + assert_always(mame_get_phase(Machine) == MAME_PHASE_INIT, "Can only call pia_config at init time!"); assert_always((which >= 0) && (which < MAX_PIA), "pia_config called on an invalid PIA!"); assert_always(intf, "pia_config called with an invalid interface!"); diff --git a/src/machine/6840ptm.c b/src/machine/6840ptm.c index d948ff57e..c9d23c1a0 100644 --- a/src/machine/6840ptm.c +++ b/src/machine/6840ptm.c @@ -27,7 +27,8 @@ If the external clock frequencies are not fixed, they should be entered as '0', and the ptm6840_set_c?(which, state) functions - should be used instead if necessary. + should be used instead if necessary (This should allow the VBLANK + clock on the MCR units to operate). **********************************************************************/ @@ -35,7 +36,11 @@ #include "timer.h" #include "6840ptm.h" +#ifdef MAME_DEBUG #define PTMVERBOSE 1 +#else +#define PTMVERBOSE 0 +#endif #if PTMVERBOSE #define PLOG(x) logerror x @@ -59,10 +64,9 @@ struct _ptm6840 UINT8 control_reg[3], output[3],// output states - input[3],// input gate states + gate[3],// input gate states clock[3],// clock states enabled[3], - interrupt[3], mode[3], fired[3], t3_divisor, @@ -71,6 +75,7 @@ struct _ptm6840 status_read_since_int, lsb_buffer, msb_buffer; + double internal_freq, external_freq[3]; @@ -78,25 +83,9 @@ struct _ptm6840 mame_timer *timer1, *timer2, *timer3; - union - { -#ifdef LSB_FIRST - struct { UINT8 l, u; } b; -#else - struct { UINT8 u, l; } b; -#endif - UINT16 w; - } latch[3]; - union - { -#ifdef LSB_FIRST - struct { UINT8 l, u; } b; -#else - struct { UINT8 u, l; } b; -#endif - UINT16 w; - } counter[3]; + UINT16 latch[3], + counter[3]; }; // local prototypes /////////////////////////////////////////////////////// @@ -123,6 +112,18 @@ static const char *opmode[] = }; #endif +/////////////////////////////////////////////////////////////////////////// +// // +// Get enabled status // +// // +/////////////////////////////////////////////////////////////////////////// + +int ptm6840_get_status(int which, int clock) +{ + ptm6840 *p = ptm + which; + return p->enabled[clock-1]; +} + /////////////////////////////////////////////////////////////////////////// // // // Subtract from Counter // @@ -147,8 +148,8 @@ static void subtract_from_counter(int counter, int count, int which) /* dual-byte mode */ if (currptr->control_reg[counter] & 0x04) { - int lsb = currptr->counter[counter].w & 0xff; - int msb = currptr->counter[counter].w >> 8; + int lsb = currptr->counter[counter] & 0xff; + int msb = currptr->counter[counter] >> 8; /* count the clocks */ lsb -= count; @@ -157,7 +158,7 @@ static void subtract_from_counter(int counter, int count, int which) while (lsb < 0) { /* borrow from the MSB */ - lsb += (currptr->latch[counter].w & 0xff) + 1; + lsb += (currptr->latch[counter] & 0xff) + 1; msb--; /* if MSB goes less than zero, we've expired */ if (msb < 0) @@ -167,34 +168,34 @@ static void subtract_from_counter(int counter, int count, int which) { case 0: ptm6840_t1_timeout(which); - msb = (currptr->latch[counter].w >> 8) + 1; + msb = (currptr->latch[counter] >> 8) + 1; case 1: ptm6840_t2_timeout(which); - msb = (currptr->latch[counter].w >> 8) + 1; + msb = (currptr->latch[counter] >> 8) + 1; case 2: ptm6840_t3_timeout(which); - msb = (currptr->latch[counter].w >> 8) + 1; + msb = (currptr->latch[counter] >> 8) + 1; } } } /* store the result */ - currptr->counter[counter].w = (msb << 8) | lsb; + currptr->counter[counter] = (msb << 8) | lsb; switch (counter) { case 0: - timer_adjust(currptr->timer1, TIME_IN_HZ(freq/((double)currptr->counter[0].w)), which, 0); + timer_adjust(currptr->timer1, TIME_IN_HZ(freq/((double)currptr->counter[0])), which, 0); case 1: - timer_adjust(currptr->timer2, TIME_IN_HZ(freq/((double)currptr->counter[1].w)), which, 0); + timer_adjust(currptr->timer2, TIME_IN_HZ(freq/((double)currptr->counter[1])), which, 0); case 2: - timer_adjust(currptr->timer3, TIME_IN_HZ(freq/((double)currptr->counter[2].w)), which, 0); + timer_adjust(currptr->timer3, TIME_IN_HZ(freq/((double)currptr->counter[2])), which, 0); } } /* word mode */ else { - int word = currptr->counter[counter].w; + int word = currptr->counter[counter]; /* count the clocks */ word -= count; @@ -203,7 +204,7 @@ static void subtract_from_counter(int counter, int count, int which) while (word < 0) { /* borrow from the MSB */ - word += currptr->latch[counter].w + 1; + word += currptr->latch[counter] + 1; /* we've expired */ switch (counter) @@ -218,15 +219,15 @@ static void subtract_from_counter(int counter, int count, int which) } /* store the result */ - currptr->counter[counter].w = word; + currptr->counter[counter] = word; switch (counter) { case 0: - timer_adjust(currptr->timer1, TIME_IN_HZ(freq/((double)currptr->counter[0].w)), which, 0); + timer_adjust(currptr->timer1, TIME_IN_HZ(freq/((double)currptr->counter[0])), which, 0); case 1: - timer_adjust(currptr->timer2, TIME_IN_HZ(freq/((double)currptr->counter[1].w)), which, 0); + timer_adjust(currptr->timer2, TIME_IN_HZ(freq/((double)currptr->counter[1])), which, 0); case 2: - timer_adjust(currptr->timer3, (TIME_IN_HZ(freq/((double)currptr->counter[2].w)))* currptr->t3_divisor, which, 0); + timer_adjust(currptr->timer3, (TIME_IN_HZ(freq/((double)currptr->counter[2])))* currptr->t3_divisor, which, 0); } } } @@ -250,12 +251,8 @@ INLINE void update_interrupts(int which) if ( currptr->intf->irq_func ) { - if (currptr->interrupt[0]|currptr->interrupt[1]|currptr->interrupt[2]) - { - currptr->intf->irq_func(currptr->IRQ); - } + currptr->intf->irq_func(currptr->IRQ); } - } /////////////////////////////////////////////////////////////////////////// @@ -274,7 +271,7 @@ static UINT16 compute_counter(int counter, int which) /* if there's no timer, return the count */ if (!currptr->enabled[counter]) - return currptr->counter[counter].w; + return currptr->counter[counter]; /* determine the clock frequency for this timer */ if (currptr->control_reg[counter] & 0x02) @@ -301,7 +298,7 @@ static UINT16 compute_counter(int counter, int which) /* adjust the count for dual byte mode */ if (currptr->control_reg[counter] & 0x04) { - int divisor = (currptr->counter[counter].w & 0xff) + 1; + int divisor = (currptr->counter[counter] & 0xff) + 1; int msb = remaining / divisor; int lsb = remaining % divisor; remaining = (msb << 8) | lsb; @@ -323,25 +320,7 @@ static void reload_count(int idx, int which) ptm6840 *currptr = ptm + which; /* copy the latched value in */ - currptr->counter[idx].w = currptr->latch[idx].w; - - /* counter 0 is self-updating if clocked externally */ - if (idx == 0 && !(currptr->control_reg[idx] & 0x02)) - { - switch (idx) - { - case 0: - currptr->enabled[0] = 0; - timer_enable(currptr->timer1,FALSE); - case 1: - currptr->enabled[1] = 0; - timer_enable(currptr->timer2,FALSE); - case 2: - currptr->enabled[2] = 0; - timer_enable(currptr->timer3,FALSE); - } - return; - } + currptr->counter[idx] = currptr->latch[idx]; /* determine the clock frequency for this timer */ if (currptr->control_reg[idx] & 0x02) @@ -356,7 +335,7 @@ static void reload_count(int idx, int which) } /* determine the number of clock periods before we expire */ - count = currptr->counter[idx].w; + count = currptr->counter[idx]; if (currptr->control_reg[idx] & 0x04) count = ((count >> 8) + 1) * ((count & 0xff) + 1); else @@ -381,19 +360,11 @@ static void reload_count(int idx, int which) /* set the timer */ PLOG(("MC6840 #%d: reload_count(%d): freq = %lf count = %d\n", which, idx, freq, count)); - if (currptr->interrupt[idx]) - { - currptr->interrupt[idx] = 0; - update_interrupts(which); - } switch (idx) { case 0: timer_adjust(currptr->timer1, TIME_IN_HZ(freq/((double)count)), which, 0); - PLOG(("MC6840 #%d: reload_count(%d): output = %lf\n", which, idx, freq/((double)count))); - currptr->enabled[0] = 1; - timer_enable(currptr->timer1,TRUE); if (!currptr->control_reg[0] & 0x02) { @@ -403,27 +374,33 @@ static void reload_count(int idx, int which) timer_enable(currptr->timer1,FALSE); } } + else + { + currptr->enabled[0] = 1; + timer_enable(currptr->timer1,TRUE); + } break; case 1: timer_adjust(currptr->timer2, TIME_IN_HZ(freq/((double)count)), which, 0); PLOG(("MC6840 #%d: reload_count(%d): output = %lf\n", which, idx, freq/((double)count))); - currptr->enabled[1] = 1; - timer_enable(currptr->timer2,TRUE); if (!currptr->control_reg[1] & 0x02) { if (!currptr->intf->external_clock2) { currptr->enabled[1] = 0; - timer_enable(currptr->timer3,FALSE); + timer_enable(currptr->timer2,FALSE); } } + else + { + currptr->enabled[1] = 1; + timer_enable(currptr->timer2,TRUE); + } break; case 2: timer_adjust(currptr->timer3, (TIME_IN_HZ(freq/((double)count)))*currptr->t3_divisor, which, 0); PLOG(("MC6840 #%d: reload_count(%d): output = %lf\n", which, idx, (freq/((double)count))*currptr->t3_divisor)); - currptr->enabled[2] = 1; - timer_enable(currptr->timer3,TRUE); if (!currptr->control_reg[2] & 0x02) { @@ -433,6 +410,12 @@ static void reload_count(int idx, int which) timer_enable(currptr->timer3,FALSE); } } + else + { + currptr->enabled[2] = 1; + timer_enable(currptr->timer3,TRUE); + } + break; } } @@ -483,7 +466,7 @@ void ptm6840_config(int which, const ptm6840_interface *intf) { ptm6840 *currptr = ptm + which; - assert_always(mame_get_phase() == MAME_PHASE_INIT, "Can only call ptm6840_config at init time!"); + assert_always(mame_get_phase(Machine) == MAME_PHASE_INIT, "Can only call ptm6840_config at init time!"); assert_always((which >= 0) && (which < PTM_6840_MAX), "ptm6840_config called on an invalid PTM!"); assert_always(intf, "ptm6840_config called with an invalid interface!"); ptm[which].intf = intf; @@ -532,37 +515,34 @@ void ptm6840_config(int which, const ptm6840_interface *intf) state_save_register_item("6840ptm", which, currptr->control_reg[0]); state_save_register_item("6840ptm", which, currptr->output[0]); - state_save_register_item("6840ptm", which, currptr->input[0]); + state_save_register_item("6840ptm", which, currptr->gate[0]); state_save_register_item("6840ptm", which, currptr->clock[0]); - state_save_register_item("6840ptm", which, currptr->interrupt[0]); state_save_register_item("6840ptm", which, currptr->mode[0]); state_save_register_item("6840ptm", which, currptr->fired[0]); state_save_register_item("6840ptm", which, currptr->enabled[0]); state_save_register_item("6840ptm", which, currptr->external_freq[0]); - state_save_register_item("6840ptm", which, currptr->counter[0].w); - state_save_register_item("6840ptm", which, currptr->latch[0].w); + state_save_register_item("6840ptm", which, currptr->counter[0]); + state_save_register_item("6840ptm", which, currptr->latch[0]); state_save_register_item("6840ptm", which, currptr->control_reg[1]); state_save_register_item("6840ptm", which, currptr->output[1]); - state_save_register_item("6840ptm", which, currptr->input[1]); + state_save_register_item("6840ptm", which, currptr->gate[1]); state_save_register_item("6840ptm", which, currptr->clock[1]); - state_save_register_item("6840ptm", which, currptr->interrupt[1]); state_save_register_item("6840ptm", which, currptr->mode[1]); state_save_register_item("6840ptm", which, currptr->fired[1]); state_save_register_item("6840ptm", which, currptr->enabled[1]); state_save_register_item("6840ptm", which, currptr->external_freq[1]); - state_save_register_item("6840ptm", which, currptr->counter[1].w); - state_save_register_item("6840ptm", which, currptr->latch[1].w); + state_save_register_item("6840ptm", which, currptr->counter[1]); + state_save_register_item("6840ptm", which, currptr->latch[1]); state_save_register_item("6840ptm", which, currptr->control_reg[2]); state_save_register_item("6840ptm", which, currptr->output[2]); - state_save_register_item("6840ptm", which, currptr->input[2]); + state_save_register_item("6840ptm", which, currptr->gate[2]); state_save_register_item("6840ptm", which, currptr->clock[2]); - state_save_register_item("6840ptm", which, currptr->interrupt[2]); state_save_register_item("6840ptm", which, currptr->mode[2]); state_save_register_item("6840ptm", which, currptr->fired[2]); state_save_register_item("6840ptm", which, currptr->enabled[2]); state_save_register_item("6840ptm", which, currptr->external_freq[2]); - state_save_register_item("6840ptm", which, currptr->counter[2].w); - state_save_register_item("6840ptm", which, currptr->latch[2].w); + state_save_register_item("6840ptm", which, currptr->counter[2]); + state_save_register_item("6840ptm", which, currptr->latch[2]); ptm6840_reset(which); @@ -586,8 +566,8 @@ void ptm6840_reset(int which) for ( i = 0; i < 3; i++ ) { ptm[which].status_read_since_int = 0x00; - ptm[which].counter[i].w = 0xffff; - ptm[which].latch[i].w = 0xffff; + ptm[which].counter[i] = 0xffff; + ptm[which].latch[i] = 0xffff; ptm[which].output[i] = 0; ptm[which].fired[i] = 0; } @@ -601,18 +581,23 @@ void ptm6840_reset(int which) int ptm6840_read(int which, int offset) { + int val; ptm6840 *currptr = ptm + which; - switch ( offset ) { case PTM_6840_CTRL1 ://0 + { + val = 0; break; + } case PTM_6840_CTRL2 ://1 + { PLOG(("%06X: MC6840 #%d: Status read = %04X\n", activecpu_get_previouspc(), which, currptr->status_reg)); currptr->status_read_since_int |= currptr->status_reg & 0x07; - return currptr->status_reg; + val = currptr->status_reg; break; + } case PTM_6840_MSBBUF1://2 { @@ -625,16 +610,16 @@ int ptm6840_read(int which, int offset) update_interrupts(which); } - currptr->counter[0].b.l = result & 0xff; + currptr->lsb_buffer = result & 0xff; PLOG(("%06X: MC6840 #%d: Counter %d read = %04X\n", activecpu_get_previouspc(), which, 0, result >> 8)); - return result >> 8; + val = result >> 8; break; } case PTM_6840_LSB1://3 { - return currptr->counter[0].b.l; + val = currptr->lsb_buffer; break; } @@ -649,18 +634,19 @@ int ptm6840_read(int which, int offset) update_interrupts(which); } - currptr->counter[1].b.l = result & 0xff; + currptr->lsb_buffer = result & 0xff; PLOG(("%06X: MC6840 #%d: Counter %d read = %04X\n", activecpu_get_previouspc(), which, 1, result >> 8)); - return result >> 8; + val = result >> 8; break; } case PTM_6840_LSB2://5 { - return currptr->counter[1].b.l; + val = currptr->lsb_buffer; break; } + case PTM_6840_MSBBUF3://6 { int result = compute_counter(2, which); @@ -672,17 +658,27 @@ int ptm6840_read(int which, int offset) update_interrupts(which); } - currptr->counter[2].b.l = result & 0xff; + currptr->lsb_buffer = result & 0xff; PLOG(("%06X: MC6840 #%d: Counter %d read = %04X\n", activecpu_get_previouspc(), which, 2, result >> 8)); - return result >> 8; + val = result >> 8; break; } case PTM_6840_LSB3://7 - return currptr->counter[2].b.l; + { + val = currptr->lsb_buffer; + break; + } + + default: + { + val = 0; + break; + } + } - return 0; + return val; } /////////////////////////////////////////////////////////////////////////// @@ -760,6 +756,9 @@ void ptm6840_write (int which, int offset, int data) timer_enable(currptr->timer1,FALSE); timer_enable(currptr->timer2,FALSE); timer_enable(currptr->timer3,FALSE); + currptr->enabled[0]=0; + currptr->enabled[1]=0; + currptr->enabled[2]=0; } /* releasing reset */ @@ -772,7 +771,6 @@ void ptm6840_write (int which, int offset, int data) } currptr->status_reg = 0; - update_interrupts(which); /* changing the clock source? (e.g. Zwackery) */ @@ -785,28 +783,21 @@ void ptm6840_write (int which, int offset, int data) case PTM_6840_MSBBUF1://2 { PLOG(("MC6840 #%d msbbuf1 = %02X\n", which, data)); - currptr->status_reg &= ~0x01; currptr->msb_buffer = data; - if ( currptr->intf->irq_func ) - update_interrupts(which); break; } case PTM_6840_MSBBUF2://4 { PLOG(("MC6840 #%d msbbuf2 = %02X\n", which, data)); - currptr->status_reg &= ~0x02; currptr->msb_buffer = data; - update_interrupts(which); break; } case PTM_6840_MSBBUF3://6 { PLOG(("MC6840 #%d msbbuf3 = %02X\n", which, data)); - currptr->status_reg &= ~0x04; currptr->msb_buffer = data; - update_interrupts(which); break; } @@ -814,8 +805,7 @@ void ptm6840_write (int which, int offset, int data) case PTM_6840_LSB1://3 { - currptr->latch[0].b.u = currptr->msb_buffer; - currptr->latch[0].b.l = data; + currptr->latch[0] = (currptr->msb_buffer << 8) | (data & 0xff); /* clear the interrupt */ currptr->status_reg &= ~(1 << 0); update_interrupts(which); @@ -824,14 +814,13 @@ void ptm6840_write (int which, int offset, int data) { reload_count(0, which); } - PLOG(("%06X:MC6840 #%d: Counter %d latch = %04X\n", activecpu_get_previouspc(), which, 0, currptr->latch[0].w)); + PLOG(("%06X:MC6840 #%d: Counter %d latch = %04X\n", activecpu_get_previouspc(), which, 0, currptr->latch[0])); break; } case PTM_6840_LSB2://5 { - currptr->latch[1].b.u = currptr->msb_buffer; - currptr->latch[1].b.l = data; + currptr->latch[1] = (currptr->msb_buffer << 8) | (data & 0xff); /* clear the interrupt */ currptr->status_reg &= ~(1 << 1); update_interrupts(which); @@ -840,14 +829,13 @@ void ptm6840_write (int which, int offset, int data) { reload_count(1, which); } - PLOG(("%06X:MC6840 #%d: Counter %d latch = %04X\n", activecpu_get_previouspc(), which, 1, currptr->latch[1].w)); + PLOG(("%06X:MC6840 #%d: Counter %d latch = %04X\n", activecpu_get_previouspc(), which, 1, currptr->latch[1])); break; } case PTM_6840_LSB3://7 { - currptr->latch[2].b.u = currptr->msb_buffer; - currptr->latch[2].b.l = data; + currptr->latch[2] = (currptr->msb_buffer << 8) | (data & 0xff); /* clear the interrupt */ currptr->status_reg &= ~(1 << 2); update_interrupts(which); @@ -856,7 +844,7 @@ void ptm6840_write (int which, int offset, int data) { reload_count(2, which); } - PLOG(("%06X:MC6840 #%d: Counter %d latch = %04X\n", activecpu_get_previouspc(), which, 2, currptr->latch[2].w)); + PLOG(("%06X:MC6840 #%d: Counter %d latch = %04X\n", activecpu_get_previouspc(), which, 2, currptr->latch[2])); break; } } @@ -877,7 +865,7 @@ static void ptm6840_t1_timeout(int which) if ( p->control_reg[0] & 0x40 ) { // interrupt enabled p->status_reg |= 0x01; - p->interrupt[0] = 1; + p->status_read_since_int &= ~0x01; update_interrupts(which); } @@ -903,6 +891,8 @@ static void ptm6840_t1_timeout(int which) } } } + p->enabled[0]= 0; + reload_count(0,which); } /////////////////////////////////////////////////////////////////////////// // // @@ -919,7 +909,7 @@ static void ptm6840_t2_timeout(int which) if ( p->control_reg[1] & 0x40 ) { // interrupt enabled p->status_reg |= 0x02; - p->interrupt[1] = 1; + p->status_read_since_int &= ~0x02; update_interrupts(which); } @@ -946,6 +936,8 @@ static void ptm6840_t2_timeout(int which) } } + p->enabled[1]= 0; + reload_count(1,which); } /////////////////////////////////////////////////////////////////////////// @@ -963,7 +955,7 @@ static void ptm6840_t3_timeout(int which) if ( p->control_reg[2] & 0x40 ) { // interrupt enabled p->status_reg |= 0x04; - p->interrupt[2] = 1; + p->status_read_since_int &= ~0x04; update_interrupts(which); } @@ -990,6 +982,8 @@ static void ptm6840_t3_timeout(int which) } } + p->enabled[2]= 0; + reload_count(2,which); } /////////////////////////////////////////////////////////////////////////// @@ -1002,13 +996,13 @@ void ptm6840_set_g1(int which, int state) { ptm6840 *p = ptm + which; + if ((p->mode[0] == 0)|(p->mode[0] == 2)|(p->mode[0] == 4)|(p->mode[0] == 6)) { - if (state == 0 && p->input[0]) + if (state == 0 && p->gate[0]) reload_count (0,which); } - - p->input[0] = state; + p->gate[0] = state; } /////////////////////////////////////////////////////////////////////////// @@ -1025,7 +1019,6 @@ void ptm6840_set_c1(int which, int state) if (!(p->control_reg[0] & 0x02)) { - //timer_enable(p->timer1,state?TRUE:FALSE); if (state) subtract_from_counter(0, 1,which); } } @@ -1042,11 +1035,10 @@ void ptm6840_set_g2(int which, int state) if ((p->mode[1] == 0)|(p->mode[1] == 2)|(p->mode[1] == 4)|(p->mode[1] == 6)) { - if (state == 0 && p->input[1]) + if (state == 0 && p->gate[1]) reload_count (1,which); } - - p->input[1] = state; + p->gate[1] = state; } /////////////////////////////////////////////////////////////////////////// @@ -1063,7 +1055,6 @@ void ptm6840_set_c2(int which, int state) if (!(p->control_reg[1] & 0x02)) { - //timer_enable(p->timer2,state?TRUE:FALSE); if (state) subtract_from_counter(1, 1,which); } } @@ -1080,11 +1071,10 @@ void ptm6840_set_g3(int which, int state) if ((p->mode[2] == 0)|(p->mode[2] == 2)|(p->mode[2] == 4)|(p->mode[2] == 6)) { - if (state == 0 && p->input[2]) + if (state == 0 && p->gate[2]) reload_count (2,which); } - - p->input[2] = state; + p->gate[2] = state; } /////////////////////////////////////////////////////////////////////////// @@ -1100,7 +1090,6 @@ void ptm6840_set_c3(int which, int state) p->clock[2] = state; if (!(p->control_reg[2] & 0x02)) { - //timer_enable(p->timer3,state?TRUE:FALSE); if (state) subtract_from_counter(2, 1,which); } } diff --git a/src/machine/6840ptm.h b/src/machine/6840ptm.h index 22b03c42c..22a1110ff 100644 --- a/src/machine/6840ptm.h +++ b/src/machine/6840ptm.h @@ -36,7 +36,7 @@ void ptm6840_reset( int which); int ptm6840_read( int which, int offset); void ptm6840_write( int which, int offset, int data); - +int ptm6840_get_status(int which, int clock); // get whether timer is enabled void ptm6840_set_g1(int which, int state); // set gate1 state void ptm6840_set_c1(int which, int state); // set clock1 state diff --git a/src/machine/6850acia.c b/src/machine/6850acia.c deleted file mode 100644 index 04e538d9f..000000000 --- a/src/machine/6850acia.c +++ /dev/null @@ -1,604 +0,0 @@ -/********************************************************************** - - Motorola 6850 ACIA interface and emulation - - This function is a simple emulation of a pair of MC6850 - Asynchronous Communications Interface Adapters. - -**********************************************************************/ - -#include "driver.h" -#include "6850acia.h" - -UINT8 m6850_irq_state; // referenced from machine/mpu4.c -void update_mpu68_interrupts(void); // referenced from machine/mpu4.c - -#define LOG_SERIAL // log serial communication -#define UART_LOG //enable UART data logging -#define LOG_CTRL // log serial communication - -static int get_normal_uart_status(void); // retrieve status of uart on MPU4 board -int uart1_status; // MC6850 status -int uart2_status; // MC6850 status -int vid_data_from_norm; // data available for vid from MPU4 -int vid_normdata; // data -int norm_data_from_vid; // data available for MPU4 from vid -int norm_viddata; // data -int vid_acia_triggered; // flag <>0, ACIA receive IRQ -int vid_uart_status; -int norm_uart_status; -int aciadata; -int ctrl; - -int vid_rx; - -void send_to_vid(int data) -{ - vid_data_from_norm = 1; // set flag, data from MPU4 board available - vid_normdata = data; // store data - - vid_uart_status |= 0x83; //TX full, RX empty, IRQ - - vid_acia_triggered = 1; // set flag, acia IRQ triggered - - m6850_irq_state = 1; - update_mpu68_interrupts(); - //cpunum_set_input_line(1, 2, HOLD_LINE ); // trigger IRQ - - #ifdef LOG_SERIAL - logerror("svid %02X (%c)\n",data, data ); - #endif -} - -/////////////////////////////////////////////////////////////////////////// - -int read_from_norm(void) -{ - int data = vid_normdata; - - vid_data_from_norm = 0; // clr flag, - - #ifdef LOG_SERIAL - logerror("rnorm:%02X (%c)\n",data, data ); - #endif - - return data; -} - -/////////////////////////////////////////////////////////////////////////// - -int read_from_vid(void) -{ - int data = norm_viddata; - - norm_data_from_vid = 0; // clr flag - - #ifdef LOG_SERIAL - logerror("rvid: %02X(%c)\n",data, data ); - #endif - - return data; -} - -/////////////////////////////////////////////////////////////////////////// - -void send_to_norm(int data) -{ - norm_data_from_vid = 1; // set flag, data from adder available - norm_viddata = data; // store data - - norm_uart_status |= 0x83; //TX full, RX empty, IRQ - - #ifdef LOG_SERIAL - logerror("snorm %02X(%c)\n",data, data ); - #endif -} - -/////////////////////////////////////////////////////////////////////////// - -int get_vid_uart_status(void) -{ - -// if ( vid_data_from_norm ) vid_uart_status |= 0x01; // receive buffer full -// if ( !norm_data_from_vid ) vid_uart_status |= 0x02; // transmit buffer empty - - #ifdef LOG_SERIAL - logerror("Vid control status(%02X)\n",vid_uart_status); - #endif - - return vid_uart_status; -} - -/////////////////////////////////////////////////////////////////////////// - -static int get_normal_uart_status(void) -{ - -// if ( norm_data_from_vid ) norm_uart_status |= 0x01; // receive buffer full -// if ( !vid_data_from_norm) norm_uart_status |= 0x02; // transmit buffer empty - - #ifdef LOG_SERIAL - logerror("MPU4 control status(%02X)\n",norm_uart_status); - #endif - return norm_uart_status; -} - -/////////////////////////////////////////////////////////////////////////// -// serial port //////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////// - -READ8_HANDLER( uart1stat_r ) -{ - return uart1_status; -} - -/////////////////////////////////////////////////////////////////////////// - -READ8_HANDLER( uart1data_r ) -{ -{ -if (norm_uart_status & 0x01) -{ -// int data = read_from_vid(); -} -uart1_status &= 0x7e; // Clear the IRQ and the RDR Full - - return 0x06; //for now -} -} -/////////////////////////////////////////////////////////////////////////// - -WRITE8_HANDLER( uart1ctrl_w ) -{ - switch (data & 0x03) - { - case 0x00: - logerror("#1 Uart clock: x1\n"); - break; - case 0x01: - logerror("#1 Uart clock: x16\n"); - break; - case 0x02: - logerror("#1 Uart clock: x32\n"); - break; - case 0x03: - logerror("Resetting #1 Uart\n"); - uart1_status = 0x02; - break; - } - switch (data & 0x1c) - { - case 0x00: - logerror("#1 Uart - Bits :7 Parity: Even Stop Bits: 2\n"); - break; - case 0x04: - logerror("#1 Uart - Bits :7 Parity: Odd Stop Bits: 2\n"); - break; - case 0x08: - logerror("#1 Uart - Bits :7 Parity: Even Stop Bits: 1\n"); - break; - case 0x0c: - logerror("#1 Uart - Bits :7 Parity: Odd Stop Bits: 1\n"); - break; - case 0x10: - logerror("#1 Uart - Bits :8 Parity: None Stop Bits: 2\n"); - break; - case 0x14: - logerror("#1 Uart - Bits :8 Parity: None Stop Bits: 1\n"); - break; - case 0x18: - logerror("#1 Uart - Bits :8 Parity: Even Stop Bits: 1\n"); - break; - case 0x1c: - logerror("#1 Uart - Bits :7 Parity: Odd Stop Bits: 1\n"); - break; - } - switch (data & 0x60) - { - case 0x00: - logerror("#1 Uart - /RTS=0, TX IRQ=0\n"); - break; - case 0x20: - logerror("#1 Uart - /RTS=0, TX IRQ=1\n"); - break; - case 0x40: - logerror("#1 Uart - /RTS=1, TX IRQ=0\n"); - break; - case 0x60: - logerror("#1 Uart - /RTS=0, TX break level, TX IRQ=0\n"); - break; - } - if (data & 0x80) - { - logerror("#1 Uart - RX IRQ=1\n"); - } - else - { - logerror("#1 Uart - RX IRQ=0\n"); - } -#ifdef LOG_SERIAL -logerror("#1 Uart control reg (%02X)\n",data); -#endif - - } - - - - -/////////////////////////////////////////////////////////////////////////// - -WRITE8_HANDLER( uart1data_w ) -{ -uart1_status &= 0x7d;// Clear the IRQ and the TDR Empty - #ifdef UART_LOG - logerror("uart1:%c\n", data); - #endif -} - -/////////////////////////////////////////////////////////////////////////// - -READ8_HANDLER( uart2stat_r ) -{ - return uart2_status; -} - -/////////////////////////////////////////////////////////////////////////// - -READ8_HANDLER( uart2data_r ) -{ -if (norm_uart_status & 0x01) - { - //int data = read_from_vid(); - } -uart2_status &= 0x7e; // Clear the IRQ and the RDR Full - return 0x06; -} - -/////////////////////////////////////////////////////////////////////////// - -WRITE8_HANDLER( uart2ctrl_w ) -{ - switch (data & 0x03) - { - case 0x00: - logerror("#2 Uart clock: x1\n"); - break; - case 0x01: - logerror("#2 Uart clock: x16\n"); - break; - case 0x02: - logerror("#2 Uart clock: x32\n"); - break; - case 0x03: - logerror("Resetting #2 Uart\n"); - uart2_status = 0x02; - break; - } - - switch (data & 0x1c) - { - case 0x00: - logerror("#2 Uart - Bits :7 Parity: Even Stop Bits: 2\n"); - break; - case 0x04: - logerror("#2 Uart - Bits :7 Parity: Odd Stop Bits: 2\n"); - break; - case 0x08: - logerror("#2 Uart - Bits :7 Parity: Even Stop Bits: 1\n"); - break; - case 0x0c: - logerror("#2 Uart - Bits :7 Parity: Odd Stop Bits: 1\n"); - break; - case 0x10: - logerror("#2 Uart - Bits :8 Parity: None Stop Bits: 2\n"); - break; - case 0x14: - logerror("#2 Uart - Bits :8 Parity: None Stop Bits: 1\n"); - break; - case 0x18: - logerror("#2 Uart - Bits :8 Parity: Even Stop Bits: 1\n"); - break; - case 0x1c: - logerror("#2 Uart - Bits :7 Parity: Odd Stop Bits: 1\n"); - break; - } - - switch (data & 0x60) - { - case 0x00: - logerror("#2 Uart - /RTS=0, TX IRQ=0\n"); - break; - case 0x20: - logerror("#2 Uart - /RTS=0, TX IRQ=1\n"); - break; - case 0x40: - logerror("#2 Uart - /RTS=1, TX IRQ=0\n"); - break; - case 0x60: - logerror("#2 Uart - /RTS=0, TX break level, TX IRQ=0\n"); - break; - } - - if (data & 0x80) - { - logerror("#2 Uart - RX IRQ=1\n"); - } - else - { - logerror("#2 Uart - RX IRQ=0\n"); - } - -#ifdef LOG_SERIAL -logerror("#2 Uart control reg (%02X)\n",data); -#endif -} - -/////////////////////////////////////////////////////////////////////////// - -WRITE8_HANDLER( uart2data_w ) -{ -uart2_status = uart2_status & 0x7d;// Clear the IRQ and the TDR Empty -#ifdef UART_LOG -logerror("uart2:%c\n", data); -#endif -} - -/////////////////////////////////////////////////////////////////////////// - -WRITE8_HANDLER( mpu4_uart_tx_w ) -{ -norm_uart_status = norm_uart_status & 0xfd;// Clear the IRQ and the TDR Empty -#ifdef LOG_SERIAL -logerror("transmitting to VidCard (%02X)\n",data); -#endif - send_to_vid(data); -} - -/////////////////////////////////////////////////////////////////////////// - -WRITE8_HANDLER( mpu4_uart_ctrl_w ) -{ - -int ctrl; - -ctrl = data; - -if ((ctrl & 0x03) == 0x03) - { - logerror("Resetting norm Uart\n"); - norm_uart_status = 0x02; - } - else - { - switch (ctrl & 0x03) - { - case 0x00: - logerror("norm Uart clock: x1\n"); - break; - case 0x01: - logerror("norm Uart clock: x16\n"); - break; - case 0x02: - logerror("norm Uart clock: x32\n"); - break; - } - - switch (ctrl & 0x1c) - { - case 0x00: - logerror("norm Uart - Bits :7 Parity: Even Stop Bits: 2\n"); - break; - case 0x04: - logerror("norm Uart - Bits :7 Parity: Odd Stop Bits: 2\n"); - break; - case 0x08: - logerror("norm Uart - Bits :7 Parity: Even Stop Bits: 1\n"); - break; - case 0x0c: - logerror("norm Uart - Bits :7 Parity: Odd Stop Bits: 1\n"); - break; - case 0x10: - logerror("norm Uart - Bits :8 Parity: None Stop Bits: 2\n"); - break; - case 0x14: - logerror("norm Uart - Bits :8 Parity: None Stop Bits: 1\n"); - break; - case 0x18: - logerror("norm Uart - Bits :8 Parity: Even Stop Bits: 1\n"); - break; - case 0x1c: - logerror("norm Uart - Bits :7 Parity: Odd Stop Bits: 1\n"); - break; - } - - switch (ctrl & 0x60) - { - case 0x00: - logerror("norm Uart - /RTS=0, TX IRQ=0\n"); - break; - case 0x20: - logerror("norm Uart - /RTS=0, TX IRQ=1\n"); - break; - case 0x40: - logerror("norm Uart - /RTS=1, TX IRQ=0\n"); - break; - case 0x60: - logerror("norm Uart - /RTS=0, TX break level, TX IRQ=0\n"); - break; - } - - if (ctrl & 0x80) - { - logerror("norm Uart - RX IRQ=1\n"); - } - else - { - logerror("norm Uart - RX IRQ=0\n"); - } - } - - -#ifdef LOG_SERIAL -logerror("MPU4 control reg (%02X)\n",data); -#endif -} - -/////////////////////////////////////////////////////////////////////////// - -READ8_HANDLER( mpu4_uart_rx_r ) -{ -if (norm_uart_status & 0x01) -{ - aciadata = read_from_vid(); -} -norm_uart_status = norm_uart_status & 0x7e; // Clear the IRQ and the RDR Full - -#ifdef LOG_SERIAL -logerror("Received from VidCard (%02X)\n",aciadata); -#endif - return aciadata; -} - -/////////////////////////////////////////////////////////////////////////// - -READ8_HANDLER( mpu4_uart_ctrl_r ) -{ - return get_normal_uart_status(); -} - -/////////////////////////////////////////////////////////////////////////// - - -/////////////////////////////////////////////////////////////////////////// - -READ16_HANDLER( vidcard_uart_ctrl_r ) -{ - return get_vid_uart_status(); -} - -/////////////////////////////////////////////////////////////////////////// - -WRITE16_HANDLER( vidcard_uart_ctrl_w ) -{ -// vid_data_from_norm = 0; // data available for adder from sc2 -// vid_normdata = 0; // data -// norm_data_from_vid = 0; // data available for sc2 from adder -// norm_viddata = 0; // data - - if (ACCESSING_MSB) - { - ctrl = ((data >> 8) & 0xff); - } - if (ACCESSING_LSB) - { - ctrl = (data & 0xff); - } - - switch (ctrl & 0x03) - { - case 0x00: - logerror("Vid Uart clock: x1\n"); - break; - case 0x01: - logerror("Vid Uart clock: x16\n"); - break; - case 0x02: - logerror("Vid Uart clock: x32\n"); - break; - case 0x03: - logerror("Resetting Vid Uart\n"); - vid_uart_status = 0x02; - break; - } - - switch (ctrl & 0x1c) - { - case 0x00: - logerror("Vid Uart - Bits :7 Parity: Even Stop Bits: 2\n"); - break; - case 0x04: - logerror("Vid Uart - Bits :7 Parity: Odd Stop Bits: 2\n"); - break; - case 0x08: - logerror("Vid Uart - Bits :7 Parity: Even Stop Bits: 1\n"); - break; - case 0x0c: - logerror("Vid Uart - Bits :7 Parity: Odd Stop Bits: 1\n"); - break; - case 0x10: - logerror("Vid Uart - Bits :8 Parity: None Stop Bits: 2\n"); - break; - case 0x14: - logerror("Vid Uart - Bits :8 Parity: None Stop Bits: 1\n"); - break; - case 0x18: - logerror("Vid Uart - Bits :8 Parity: Even Stop Bits: 1\n"); - break; - case 0x1c: - logerror("Vid Uart - Bits :7 Parity: Odd Stop Bits: 1\n"); - break; - } - - switch (ctrl & 0x60) - { - case 0x00: - logerror("Vid Uart - /RTS=0, TX IRQ=0\n"); - break; - case 0x20: - logerror("Vid Uart - /RTS=0, TX IRQ=1\n"); - break; - case 0x40: - logerror("Vid Uart - /RTS=1, TX IRQ=0\n");// In this situation, we need to trigger our RTS function - break; - case 0x60: - logerror("Vid Uart - /RTS=0, TX break level, TX IRQ=0\n"); - break; - } - - if (ctrl & 0x80) - { - logerror("Vid Uart - RX IRQ=1\n"); - } - else - { - logerror("Vid Uart - RX IRQ=0\n"); - } - //} - - #ifdef LOG_CTRL - logerror("VID uart ctrl:%02X\n", ctrl); - #endif -} - -/////////////////////////////////////////////////////////////////////////// - -READ16_HANDLER( vidcard_uart_rx_r ) -{ -if (vid_uart_status & 0x01) -{ - aciadata = read_from_norm(); -} -vid_uart_status = vid_uart_status & 0x7e; // Clear the IRQ and the RDR Full -// return aciadata; - return (aciadata << 8) | 0x00ff; - -#ifdef LOG_SERIAL - logerror("Received from NORM (%02X)\n",aciadata); -#endif - -} - -/////////////////////////////////////////////////////////////////////////// - -WRITE16_HANDLER( vidcard_uart_tx_w ) -{ -vid_uart_status = vid_uart_status & 0xfd;//0x7d;// Clear the IRQ and the TDR Empty - - if (ACCESSING_MSB) - send_to_norm((data >> 8) & 0xff); - if (ACCESSING_LSB) - send_to_norm(data & 0xff); //Fill TDR - -} - -/////////////////////////////////////////////////////////////////////////// diff --git a/src/machine/6850acia.h b/src/machine/6850acia.h deleted file mode 100644 index cc5d99771..000000000 --- a/src/machine/6850acia.h +++ /dev/null @@ -1,34 +0,0 @@ -#include "driver.h" - -extern UINT8 m6850_irq_state; // referenced from machine/mpu4.c -extern int uart1_status; // MC6850 status -extern int uart2_status; // MC6850 status -extern int vid_rx; -extern int vid_acia_triggered; // flag <>0, ACIA receive IRQ -extern int norm_data_from_vid; // data available for MPU4 from vid -extern int vid_data_from_norm; // data available for vid from MPU4 - -READ8_HANDLER( uart1stat_r ); -READ8_HANDLER( uart1data_r ); -WRITE8_HANDLER( uart1ctrl_w ); -WRITE8_HANDLER( uart1data_w ); -READ8_HANDLER( uart2stat_r ); -READ8_HANDLER( uart2data_r ); -WRITE8_HANDLER( uart2ctrl_w ); -WRITE8_HANDLER( uart2data_w ); - -WRITE8_HANDLER( mpu4_uart_tx_w ); -WRITE8_HANDLER( mpu4_uart_ctrl_w ); -READ8_HANDLER( mpu4_uart_rx_r ); -READ8_HANDLER( mpu4_uart_ctrl_r ); - -READ16_HANDLER( vidcard_uart_ctrl_r ); -WRITE16_HANDLER( vidcard_uart_ctrl_w ); -READ16_HANDLER( vidcard_uart_rx_r ); -WRITE16_HANDLER( vidcard_uart_tx_w ); - - -extern void send_to_norm(int data); -extern int read_from_norm(void); - -extern void send_to_vid(int data); diff --git a/src/machine/amiga.c b/src/machine/amiga.c index 4b7dbf014..4024609b5 100644 --- a/src/machine/amiga.c +++ b/src/machine/amiga.c @@ -1267,7 +1267,7 @@ void amiga_add_autoconfig(amiga_autoconfig_device *device) autoconfig_device *dev, **d; /* validate the data */ - assert_always(mame_get_phase() == MAME_PHASE_INIT, "Can only call amiga_add_autoconfig at init time!"); + assert_always(mame_get_phase(Machine) == MAME_PHASE_INIT, "Can only call amiga_add_autoconfig at init time!"); assert_always((device->size & (device->size - 1)) == 0, "device->size must be power of 2!"); /* allocate memory and link it in at the end of the list */ diff --git a/src/machine/arkanoid.c b/src/machine/arkanoid.c index 1c30ddc2d..f681c73f3 100644 --- a/src/machine/arkanoid.c +++ b/src/machine/arkanoid.c @@ -8,16 +8,22 @@ ***************************************************************************/ #include "driver.h" +#include "arkanoid.h" +/* To log specific reads and writes of the bootlegs */ +#define ARKANOID_BOOTLEG_VERBOSE 1 + UINT8 arkanoid_paddle_select; +UINT8 arkanoid_paddle_value; static UINT8 z80write,fromz80,m68705write,toz80; static UINT8 portA_in,portA_out,ddrA; static UINT8 portC_out,ddrC; + MACHINE_START( arkanoid ) { state_save_register_global(arkanoid_paddle_select); @@ -132,90 +138,462 @@ READ8_HANDLER( arkanoid_input_2_r ) { if (arkanoid_paddle_select) { - return input_port_3_r(offset); + arkanoid_paddle_value = input_port_3_r(offset); } else { - return input_port_2_r(offset); + arkanoid_paddle_value = input_port_2_r(offset); } + + return arkanoid_paddle_value; } + /* - Paddle 2 MCU simulation +Bootlegs stuff + +The bootlegs simulate the missing MCU behaviour with writes to 0xd018 and reads value back from 0xf002. +Fortunately, 'arkangc', 'arkbloc2' and 'arkblock' has patched code not to bother with that. +So I've fixed 'arkbl3' and 'paddle2' to return the expected values (code is strongly similar). + +Some bootlegs also test some bits from 0xd008 after reading the paddle value at 0xd018. +Their effect is completely unknown but I need to set some bits to 1 so the games are playable : + + - 'arkangc' : NO read from 0xd008 ! + - 'arkangc2' : + * bit 1 must be set to 1 or you enter sort of endless "demo mode" when you start : + . you can't select your starting level (it always starts at level 1) + . you can't control the paddle (it automoves by following the ball) + . you can use the "fire" button (the game never shoots) + . you are awarded points as in a normal game + . sounds are played + - 'arkblock' : NO read from 0xd008 ! + - 'arkbloc2' : + * bit 5 must sometimes be set to 1 or you can't reach right side of the screen + nor select all levels at the begining of the game + - 'arkgcbl' : + * bit 1 must be set to 1 or you enter sort of endless "demo mode" when you start : + . you can't select your starting level (it always starts at level 1) + . you can't control the paddle (it automoves by following the ball) + . you can use the "fire" button (the game never shoots) + . you are awarded points as in a normal game + . sounds are played + * bit 5 must sometimes be set to 1 or you can't reach right side of the screen + nor select all levels at the begining of the game + - 'paddle2' : + * bits 0 and 1 must be set to 1 or the paddle goes up (joystick issue ?) + * bits 2 and 3 must be set to 1 or the paddle goes down (joystick issue ?) + * bit 5 must sometimes be set to 1 or you can't reach right side of the screen + nor select all levels at the begining of the game + + +TO DO (2006.09.12) : + + - understand reads from 0xd008 (even if the games are playable) + - try to document writes to 0xd018 with unknown effect + +*/ - TODO: - \-Fix crashes and level finishing. - \-Finish the level pointer table & check the real thing for true level pattern... - \-(track_kludge_r)Find a better way to handle the paddle inputs. - \-Code optimizations + add this into machine/arkanoid.c - Notes: - \-This game is an Arkanoid 1 bootleg but with level edited to match the Arkanoid 2 ones. - \-Returning the right values for commands 0x38,0xff and 0x8a gives the level that has to - be played,but I don't have any clue about the true level pattern used.Checking Arkanoid 2 - doesn't help much BTW... +#if ARKANOID_BOOTLEG_VERBOSE +#define LOG_F002_R logerror("%04x: arkanoid_bootleg_f002_r - cmd = %02x - val = %02x\n",activecpu_get_pc(),arkanoid_bootleg_cmd,arkanoid_bootleg_val); +#define LOG_D018_W logerror("%04x: arkanoid_bootleg_d018_w - data = %02x - cmd = %02x\n",activecpu_get_pc(),data,arkanoid_bootleg_cmd); +#define LOG_D008_R logerror("%04x: arkanoid_bootleg_d008_r - val = %02x\n",activecpu_get_pc(),arkanoid_bootleg_d008_val); +#else +#define LOG_F002_R +#define LOG_D018_W +#define LOG_D008_R +#endif -*/ -static int paddle2_prot; +static UINT8 arkanoid_bootleg_cmd; -READ8_HANDLER( paddle2_prot_r ) +/* Kludge for some bootlegs that read this address */ +READ8_HANDLER( arkanoid_bootleg_f002_r ) { - static UINT8 level_table_a[] = - { - 0xf3,0xf7,0xf9,0xfb,0xfd,0xff,0xf5,0xe3, /* 1- 8*/ - 0xe5,0xe7,0xe9,0xeb,0xed,0xef,0xf1,0xf7, /* 9-16*/ - 0xf9,0xfb,0xfd,0xff,0x00,0x00,0x00,0x00, /*17-24*/ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 /*25-32*/ - }; - static UINT8 level_table_b[] = - { - 0x52,0x52,0x52,0x52,0x52,0x52,0x0e,0x0e, /* 1- 8*/ - 0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e, /* 9-16*/ - 0x0e,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00, /*17-24*/ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 /*25-32*/ - }; - UINT8 *RAM = memory_region(REGION_CPU1); -// popmessage("%04x: %02x",activecpu_get_pc(),paddle2_prot); - - switch (paddle2_prot) + UINT8 arkanoid_bootleg_val = 0x00; + + switch (arkanoid_bootleg_id) { - case 0xc3: return 0x1d; - case 0x24: return 0x9b; - /* Level pointer table */ - case 0x38: - if(RAM[0xed83] == 0) return level_table_a[RAM[0xed72]]; - else return RAM[0xed83]; - case 0xff: - if(RAM[0xed83] == 0) return level_table_b[RAM[0xed72]]; - else return RAM[0xed83]; - /* Guess this is used for building level */ - /* pointers too,but I haven't tested yet... */ - case 0x8a: return 0x0a; - /* Goes into sub-routine $2050,controls level finishing(WRONG!!!) */ - case 0xe3: - if(RAM[0xed83] != 0) return 0xff; - else return 0; - /* Gives BAD HW message otherwise */ - case 0x36: return 0x2d; - case 0xf7: return 0; - default: return paddle2_prot; + case ARKANGC: + case ARKBLOCK: + switch (arkanoid_bootleg_cmd) + { + default: + break; + } + LOG_F002_R + break; + case ARKANGC2: /* There are no reads from 0xf002 in this bootleg */ + switch (arkanoid_bootleg_cmd) + { + default: + break; + } + LOG_F002_R + break; + case ARKBLOC2: + switch (arkanoid_bootleg_cmd) + { + default: + break; + } + LOG_F002_R + break; + case ARKGCBL: + switch (arkanoid_bootleg_cmd) + { + case 0x8a: /* Current level (fixed routine) */ + arkanoid_bootleg_val = 0xa5; + break; + case 0xff: /* Avoid "BAD HARDWARE " message (fixed routine) */ + arkanoid_bootleg_val = 0xe2; + break; + default: + break; + } + LOG_F002_R + break; + case PADDLE2: + switch (arkanoid_bootleg_cmd) + { + case 0x24: /* Avoid bad jump to 0x0066 */ + arkanoid_bootleg_val = 0x9b; + break; + case 0x36: /* Avoid "BAD HARDWARE " message */ + arkanoid_bootleg_val = 0x2d; + break; + case 0x38: /* Start of levels table (fixed offset) */ + arkanoid_bootleg_val = 0xf3; + break; + case 0x8a: /* Current level (fixed routine) */ + arkanoid_bootleg_val = 0xa5; + break; + case 0xc3: /* Avoid bad jump to 0xf000 */ + arkanoid_bootleg_val = 0x1d; + break; + case 0xe3: /* Number of bricks left (fixed offset) */ + arkanoid_bootleg_val = 0x61; + break; + case 0xf7: /* Avoid "U69" message */ + arkanoid_bootleg_val = 0x00; + break; + case 0xff: /* Avoid "BAD HARDWARE " message (fixed routine) */ + arkanoid_bootleg_val = 0xe2; + break; + default: + break; + } + LOG_F002_R + break; + default: + logerror("%04x: arkanoid_bootleg_f002_r - cmd = %02x - unknown bootleg !\n",activecpu_get_pc(),arkanoid_bootleg_cmd); + break; } + + return arkanoid_bootleg_val; } -WRITE8_HANDLER( paddle2_prot_w ) +/* Kludge for some bootlegs that write this address */ +WRITE8_HANDLER( arkanoid_bootleg_d018_w ) { - logerror("%04x: prot_w %02x\n",activecpu_get_pc(),data); - paddle2_prot = data; + arkanoid_bootleg_cmd = 0x00; + + switch (arkanoid_bootleg_id) + { + case ARKANGC: + case ARKBLOCK: + switch (data) + { + case 0x36: /* unneeded value : no call 0x2050, unused A and overwritten HL (0x0313 -> 0x0340) */ + if (activecpu_get_pc() == 0x7c47) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x38: /* unneeded value : no call 0x2050, unused A and fixed HL (0x7bd5) */ + if (activecpu_get_pc() == 0x7b87) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x8a: /* unneeded value : no call 0x2050, unused A and overwritten HL (0x7b77 -> 0x7c1c) */ + if (activecpu_get_pc() == 0x9661) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xe3: /* unneeded value : call 0x2050 but fixed A (0x00) and fixed HL (0xed83) */ + if (activecpu_get_pc() == 0x67e3) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xf7: /* unneeded value : 3 * 'NOP' at 0x034f + 2 * 'NOP' at 0x35b */ + if (activecpu_get_pc() == 0x0349) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xff: /* unneeded value : no call 0x2050, unused A and overwritten HL (0x7c4f -> 0x7d31) */ + if (activecpu_get_pc() == 0x9670) + arkanoid_bootleg_cmd = 0x00; + break; + default: + arkanoid_bootleg_cmd = 0x00; + break; + } + LOG_D018_W + break; + case ARKANGC2: + switch (data) + { + case 0x36: /* unneeded value : call 0x2050 but fixed A (0x2d) */ + if (activecpu_get_pc() == 0x7c4c) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x38: /* unneeded value : call 0x2050 but fixed A (0xf3) */ + if (activecpu_get_pc() == 0x7b87) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x88: /* unneeded value : no read back */ + if (activecpu_get_pc() == 0x67e3) + arkanoid_bootleg_cmd = 0x00; + if (activecpu_get_pc() == 0x7c47) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x89: /* unneeded value : no read back */ + if (activecpu_get_pc() == 0x67e5) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x8a: /* unneeded value : call 0x2050 but fixed A (0xa5) */ + if (activecpu_get_pc() == 0x9661) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xc0: /* unneeded value : no read back */ + if (activecpu_get_pc() == 0x67e7) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xe3: /* unneeded value : call 0x2050 but fixed A (0x61) */ + if (activecpu_get_pc() == 0x67e9) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xff: /* unneeded value : call 0x2050 but fixed A (0xe2) */ + if (activecpu_get_pc() == 0x9670) + arkanoid_bootleg_cmd = 0x00; + break; + default: + arkanoid_bootleg_cmd = 0x00; + break; + } + LOG_D018_W + break; + case ARKBLOC2: + switch (data) + { + case 0x36: /* unneeded value : call 0x2050 but fixed A (0x2d) */ + if (activecpu_get_pc() == 0x7c4c) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x38: /* unneeded value : call 0x2050 but fixed A (0xf3) */ + if (activecpu_get_pc() == 0x7b87) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x88: /* unneeded value : no read back */ + if (activecpu_get_pc() == 0x67e3) + arkanoid_bootleg_cmd = 0x00; + if (activecpu_get_pc() == 0x7c47) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x89: /* unneeded value : no read back */ + if (activecpu_get_pc() == 0x67e5) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x8a: /* unneeded value : call 0x2050 but unused HL and fixed DE (0x7c1c) */ + if (activecpu_get_pc() == 0x9661) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xc0: /* unneeded value : no read back */ + if (activecpu_get_pc() == 0x67e7) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xe3: /* unneeded value : call 0x2050 but fixed A (0x61) */ + if (activecpu_get_pc() == 0x67e9) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xf7: /* unneeded value : call 0x2050 but never called (check code at 0x0340) */ + if (activecpu_get_pc() == 0x0349) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xff: /* unneeded value : no call 0x2050, unused A and fixed HL (0x7d31) */ + if (activecpu_get_pc() == 0x9670) + arkanoid_bootleg_cmd = 0x00; + break; + default: + arkanoid_bootleg_cmd = 0x00; + break; + } + LOG_D018_W + break; + case ARKGCBL: + switch (data) + { + case 0x36: /* unneeded value : call 0x2050 but fixed A (0x2d) */ + if (activecpu_get_pc() == 0x7c4c) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x38: /* unneeded value : call 0x2050 but fixed A (0xf3) */ + if (activecpu_get_pc() == 0x7b87) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x88: /* unneeded value : no read back */ + if (activecpu_get_pc() == 0x67e3) + arkanoid_bootleg_cmd = 0x00; + if (activecpu_get_pc() == 0x7c47) + arkanoid_bootleg_cmd = 0x00; + case 0x89: /* unneeded value : no read back */ + if (activecpu_get_pc() == 0x67e5) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x8a: /* call 0x2050 with A read from 0xf002 and wrong HL */ + if (activecpu_get_pc() == 0x9661) + arkanoid_bootleg_cmd = data; + break; + case 0xc0: /* unneeded value : no read back */ + if (activecpu_get_pc() == 0x67e7) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xe3: /* unneeded value : call 0x2050 but fixed A (0x61) */ + if (activecpu_get_pc() == 0x67e9) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xf7: /* unneeded value : 3 * 'NOP' at 0x034f + 'JR NZ,$035D' at 0x35b */ + if (activecpu_get_pc() == 0x0349) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xff: /* call 0x2050 with A read from 0xf002 and wrong HL */ + if (activecpu_get_pc() == 0x9670) + arkanoid_bootleg_cmd = data; + break; + default: + arkanoid_bootleg_cmd = 0x00; + break; + } + LOG_D018_W + break; + case PADDLE2: + switch (data) + { + case 0x24: /* A read from 0xf002 (expected to be 0x9b) */ + if (activecpu_get_pc() == 0xbd7a) + arkanoid_bootleg_cmd = data; + break; + case 0x36: /* call 0x2050 with A read from 0xf002 and wrong HL */ + if (activecpu_get_pc() == 0x7c4c) + arkanoid_bootleg_cmd = data; + break; + case 0x38: /* call 0x2050 with A read from 0xf002 and wrong HL */ + if (activecpu_get_pc() == 0x7b87) + arkanoid_bootleg_cmd = data; + break; + case 0x88: /* unneeded value : no read back */ + if (activecpu_get_pc() == 0x67e3) + arkanoid_bootleg_cmd = 0x00; + if (activecpu_get_pc() == 0x7c47) + arkanoid_bootleg_cmd = 0x00; + case 0x89: /* unneeded value : no read back */ + if (activecpu_get_pc() == 0x67e5) + arkanoid_bootleg_cmd = 0x00; + break; + case 0x8a: /* call 0x2050 with A read from 0xf002 and wrong HL */ + if (activecpu_get_pc() == 0x9661) + arkanoid_bootleg_cmd = data; + break; + case 0xc0: /* unneeded value : no read back */ + if (activecpu_get_pc() == 0x67e7) + arkanoid_bootleg_cmd = 0x00; + break; + case 0xc3: /* A read from 0xf002 (expected to be 0x1d) */ + if (activecpu_get_pc() == 0xbd8a) + arkanoid_bootleg_cmd = data; + break; + case 0xe3: /* call 0x2050 with A read from 0xf002 and wrong HL */ + if (activecpu_get_pc() == 0x67e9) + arkanoid_bootleg_cmd = data; + break; + case 0xf7: /* call 0x2050 with A read from 0xf002 and wrong HL */ + if (activecpu_get_pc() == 0x0349) + arkanoid_bootleg_cmd = data; + break; + case 0xff: /* call 0x2050 with A read from 0xf002 and wrong HL */ + if (activecpu_get_pc() == 0x9670) + arkanoid_bootleg_cmd = data; + break; + default: + arkanoid_bootleg_cmd = 0x00; + break; + } + LOG_D018_W + break; + default: + logerror("%04x: arkanoid_bootleg_d018_w - data = %02x - unknown bootleg !\n",activecpu_get_pc(),data); + break; + } } -READ8_HANDLER( paddle2_track_kludge_r ) +/* Kludge for some bootlegs that read this address */ +READ8_HANDLER( arkanoid_bootleg_d008_r ) { - int track = readinputport(2); + UINT8 arkanoid_bootleg_d008_bit[8]; + UINT8 arkanoid_bootleg_d008_val; + int b; + + arkanoid_bootleg_d008_bit[4] = arkanoid_bootleg_d008_bit[6] = arkanoid_bootleg_d008_bit[7] = 0; /* untested bits */ - /* temp kludge,needed to get the right side of the screen */ - if(track < 0x44) - return 0x23; - return 0x03; + switch (arkanoid_bootleg_id) + { + case ARKANGC: + case ARKBLOCK: + arkanoid_bootleg_d008_bit[0] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[1] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[2] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[3] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[5] = 0; /* untested bit */ + break; + case ARKANGC2: + arkanoid_bootleg_d008_bit[0] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[1] = 1; /* check code at 0x0cad */ + arkanoid_bootleg_d008_bit[2] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[3] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[5] = 0; /* untested bit */ + break; + case ARKBLOC2: + arkanoid_bootleg_d008_bit[0] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[1] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[2] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[3] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[5] = (arkanoid_paddle_value < 0x40); /* check code at 0x96b0 */ + break; + case ARKGCBL: + arkanoid_bootleg_d008_bit[0] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[1] = 1; /* check code at 0x0cad */ + arkanoid_bootleg_d008_bit[2] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[3] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[5] = (arkanoid_paddle_value < 0x40); /* check code at 0x96b0 */ + break; + case PADDLE2: + arkanoid_bootleg_d008_bit[0] = 1; /* check code at 0x7d65 */ + arkanoid_bootleg_d008_bit[1] = 1; /* check code at 0x7d65 */ + arkanoid_bootleg_d008_bit[2] = 1; /* check code at 0x7d65 */ + arkanoid_bootleg_d008_bit[3] = 1; /* check code at 0x7d65 */ + arkanoid_bootleg_d008_bit[5] = (arkanoid_paddle_value < 0x40); /* check code at 0x96b0 */ + break; + default: + arkanoid_bootleg_d008_bit[0] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[1] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[2] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[3] = 0; /* untested bit */ + arkanoid_bootleg_d008_bit[5] = 0; /* untested bit */ + logerror("%04x: arkanoid_bootleg_d008_r - unknown bootleg !\n",activecpu_get_pc()); + break; + } + + arkanoid_bootleg_d008_val = 0; + for (b=0; b<8; b++) + arkanoid_bootleg_d008_val |= (arkanoid_bootleg_d008_bit[b] << b); + LOG_D008_R + + return arkanoid_bootleg_d008_val; } + diff --git a/src/machine/asteroid.c b/src/machine/asteroid.c index c24f12bee..06f452fb0 100644 --- a/src/machine/asteroid.c +++ b/src/machine/asteroid.c @@ -12,6 +12,7 @@ #include "vidhrdw/avgdvg.h" #include "asteroid.h" +UINT8 *asteroid_ram1, *asteroid_ram2; INTERRUPT_GEN( asteroid_interrupt ) { @@ -130,24 +131,17 @@ READ8_HANDLER( asteroid_DSW1_r ) WRITE8_HANDLER( asteroid_bank_switch_w ) { - static int asteroid_bank = 0; - int asteroid_newbank; - unsigned char *RAM = memory_region(REGION_CPU1); - - - asteroid_newbank = (data >> 2) & 1; - if (asteroid_bank != asteroid_newbank) { - /* Perform bankswitching on page 2 and page 3 */ - int temp; - int i; - - asteroid_bank = asteroid_newbank; - for (i = 0; i < 0x100; i++) { - temp = RAM[0x200 + i]; - RAM[0x200 + i] = RAM[0x300 + i]; - RAM[0x300 + i] = temp; - } + if (data & 4) + { + memory_set_bankptr(1, asteroid_ram2); + memory_set_bankptr(2, asteroid_ram1); } + else + { + memory_set_bankptr(1, asteroid_ram1); + memory_set_bankptr(2, asteroid_ram2); + } + set_led_status (0, ~data & 0x02); set_led_status (1, ~data & 0x01); } @@ -155,23 +149,15 @@ WRITE8_HANDLER( asteroid_bank_switch_w ) WRITE8_HANDLER( astdelux_bank_switch_w ) { - static int astdelux_bank = 0; - int astdelux_newbank; - unsigned char *RAM = memory_region(REGION_CPU1); - - - astdelux_newbank = (data >> 7) & 1; - if (astdelux_bank != astdelux_newbank) { - /* Perform bankswitching on page 2 and page 3 */ - int temp; - int i; - - astdelux_bank = astdelux_newbank; - for (i = 0; i < 0x100; i++) { - temp = RAM[0x200 + i]; - RAM[0x200 + i] = RAM[0x300 + i]; - RAM[0x300 + i] = temp; - } + if (data & 0x80) + { + memory_set_bankptr(1, asteroid_ram2); + memory_set_bankptr(2, asteroid_ram1); + } + else + { + memory_set_bankptr(1, asteroid_ram1); + memory_set_bankptr(2, asteroid_ram2); } } @@ -185,6 +171,7 @@ WRITE8_HANDLER( astdelux_led_w ) MACHINE_RESET( asteroid ) { asteroid_bank_switch_w (0,0); + avgdvg_reset_w (0,0); } diff --git a/src/machine/at28c16.c b/src/machine/at28c16.c index 03328940f..da8d2d2cc 100644 --- a/src/machine/at28c16.c +++ b/src/machine/at28c16.c @@ -58,7 +58,7 @@ static void at28c16_init( int chip ) state_save_register_item( "at28c16", chip, c->a9_12v ); } -static void nvram_handler_at28c16( int chip, mame_file *file, int read_or_write ) +static void nvram_handler_at28c16( running_machine *machine, int chip, mame_file *file, int read_or_write ) { struct at28c16_chip *c; if( chip >= MAX_AT28C16_CHIPS ) @@ -84,10 +84,10 @@ static void nvram_handler_at28c16( int chip, mame_file *file, int read_or_write } } -NVRAM_HANDLER( at28c16_0 ) { nvram_handler_at28c16( 0, file, read_or_write ); } -NVRAM_HANDLER( at28c16_1 ) { nvram_handler_at28c16( 1, file, read_or_write ); } -NVRAM_HANDLER( at28c16_2 ) { nvram_handler_at28c16( 2, file, read_or_write ); } -NVRAM_HANDLER( at28c16_3 ) { nvram_handler_at28c16( 3, file, read_or_write ); } +NVRAM_HANDLER( at28c16_0 ) { nvram_handler_at28c16( machine, 0, file, read_or_write ); } +NVRAM_HANDLER( at28c16_1 ) { nvram_handler_at28c16( machine, 1, file, read_or_write ); } +NVRAM_HANDLER( at28c16_2 ) { nvram_handler_at28c16( machine, 2, file, read_or_write ); } +NVRAM_HANDLER( at28c16_3 ) { nvram_handler_at28c16( machine, 3, file, read_or_write ); } /* read / write */ diff --git a/src/machine/at28c16.h b/src/machine/at28c16.h index 9048a3167..3b0a0310c 100644 --- a/src/machine/at28c16.h +++ b/src/machine/at28c16.h @@ -16,10 +16,10 @@ extern void at28c16_a9_12v( int chip, int a9_12v ); /* nvram handlers */ -extern void nvram_handler_at28c16_0( mame_file *file, int read_or_write ); -extern void nvram_handler_at28c16_1( mame_file *file, int read_or_write ); -extern void nvram_handler_at28c16_2( mame_file *file, int read_or_write ); -extern void nvram_handler_at28c16_3( mame_file *file, int read_or_write ); +NVRAM_HANDLER( at28c16_0 ); +NVRAM_HANDLER( at28c16_1 ); +NVRAM_HANDLER( at28c16_2 ); +NVRAM_HANDLER( at28c16_3 ); /* 16bit memory handlers */ diff --git a/src/machine/atari.c b/src/machine/atari.c index 84c80329f..99156311f 100644 --- a/src/machine/atari.c +++ b/src/machine/atari.c @@ -37,7 +37,7 @@ static int a800_cart_is_16k = 0; static void a800xl_mmu(UINT8 new_mmu); static void a600xl_mmu(UINT8 new_mmu); -static void pokey_reset(void); +static void pokey_reset(running_machine *machine); static void make_chksum(UINT8 * chksum, UINT8 data); static void clr_serout(int expect_data); @@ -696,14 +696,14 @@ static void a800_setbank(int n) -static void pokey_reset(void) +static void pokey_reset(running_machine *machine) { pokey1_w(15,0); } -static void cart_reset(void) +static void cart_reset(running_machine *machine) { #ifdef MESS if (a800_cart_loaded) @@ -729,6 +729,16 @@ static void console_write(UINT8 data) } +static void _pia_reset(running_machine *machine) +{ + pia_reset(); +} + +static void _antic_reset(running_machine *machine) +{ + antic_reset(); +} + static void atari_machine_start(int type, const pia6821_interface *pia_intf, int has_cart) { @@ -745,21 +755,21 @@ static void atari_machine_start(int type, const pia6821_interface *pia_intf, int gtia_init(>ia_intf); /* pokey */ - add_reset_callback(pokey_reset); + add_reset_callback(Machine, pokey_reset); /* PIA */ if (pia_intf) { pia_config(0, PIA_ALTERNATE_ORDERING, pia_intf); - add_reset_callback(pia_reset); + add_reset_callback(Machine, _pia_reset); } /* ANTIC */ - add_reset_callback(antic_reset); + add_reset_callback(Machine, _antic_reset); /* cartridge */ if (has_cart) - add_reset_callback(cart_reset); + add_reset_callback(Machine, cart_reset); #ifdef MESS { diff --git a/src/machine/atarifb.c b/src/machine/atarifb.c index fb580b68e..9509c3f93 100644 --- a/src/machine/atarifb.c +++ b/src/machine/atarifb.c @@ -45,14 +45,14 @@ WRITE8_HANDLER( atarifb_out1_w ) if (data & 0x80) { /* Invert video */ - palette_set_color(2,0x00,0x00,0x00); /* black */ - palette_set_color(0,0xff,0xff,0xff); /* white */ + palette_set_color(Machine,2,0x00,0x00,0x00); /* black */ + palette_set_color(Machine,0,0xff,0xff,0xff); /* white */ } else { /* Regular video */ - palette_set_color(0,0x00,0x00,0x00); /* black */ - palette_set_color(2,0xff,0xff,0xff); /* white */ + palette_set_color(Machine,0,0x00,0x00,0x00); /* black */ + palette_set_color(Machine,2,0xff,0xff,0xff); /* white */ } } } diff --git a/src/machine/atarigen.c b/src/machine/atarigen.c index 5218360f9..f903571ae 100644 --- a/src/machine/atarigen.c +++ b/src/machine/atarigen.c @@ -1345,11 +1345,7 @@ WRITE16_HANDLER( atarigen_666_paletteram_w ) g = ((newword >> 4) & 0x3e) | ((newword >> 15) & 1); b = ((newword << 1) & 0x3e) | ((newword >> 15) & 1); - r = (r << 2) | (r >> 4); - g = (g << 2) | (g >> 4); - b = (b << 2) | (b >> 4); - - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal6bit(r), pal6bit(g), pal6bit(b)); } @@ -1373,11 +1369,7 @@ WRITE16_HANDLER( atarigen_expanded_666_paletteram_w ) g = ((newword >> 4) & 0x3e) | ((newword >> 15) & 1); b = ((newword << 1) & 0x3e) | ((newword >> 15) & 1); - r = (r << 2) | (r >> 4); - g = (g << 2) | (g >> 4); - b = (b << 2) | (b >> 4); - - palette_set_color(palentry & 0x1ff, r, g, b); + palette_set_color(Machine, palentry & 0x1ff, pal6bit(r), pal6bit(g), pal6bit(b)); } } @@ -1400,11 +1392,7 @@ WRITE32_HANDLER( atarigen_666_paletteram32_w ) g = ((newword >> 4) & 0x3e) | ((newword >> 15) & 1); b = ((newword << 1) & 0x3e) | ((newword >> 15) & 1); - r = (r << 2) | (r >> 4); - g = (g << 2) | (g >> 4); - b = (b << 2) | (b >> 4); - - palette_set_color(offset * 2, r, g, b); + palette_set_color(Machine, offset * 2, pal6bit(r), pal6bit(g), pal6bit(b)); } if (ACCESSING_LSW32) @@ -1415,11 +1403,7 @@ WRITE32_HANDLER( atarigen_666_paletteram32_w ) g = ((newword >> 4) & 0x3e) | ((newword >> 15) & 1); b = ((newword << 1) & 0x3e) | ((newword >> 15) & 1); - r = (r << 2) | (r >> 4); - g = (g << 2) | (g >> 4); - b = (b << 2) | (b >> 4); - - palette_set_color(offset * 2 + 1, r, g, b); + palette_set_color(Machine, offset * 2 + 1, pal6bit(r), pal6bit(g), pal6bit(b)); } } diff --git a/src/machine/avalnche.c b/src/machine/avalnche.c index 1c90c4014..e7d2790ab 100644 --- a/src/machine/avalnche.c +++ b/src/machine/avalnche.c @@ -43,13 +43,13 @@ WRITE8_HANDLER( avalnche_output_w ) case 0x02: /* VIDEO INVERT */ if (bit) { - palette_set_color(0,0,0,0); - palette_set_color(1,255,255,255); + palette_set_color(Machine,0,0,0,0); + palette_set_color(Machine,1,255,255,255); } else { - palette_set_color(0,255,255,255); - palette_set_color(1,0,0,0); + palette_set_color(Machine,0,255,255,255); + palette_set_color(Machine,1,0,0,0); } break; case 0x03: /* 2 CREDIT LAMP */ diff --git a/src/machine/bublbobl.c b/src/machine/bublbobl.c index 40baee011..04631ca89 100644 --- a/src/machine/bublbobl.c +++ b/src/machine/bublbobl.c @@ -475,7 +475,7 @@ logerror("%04x: 68705 unknown write to address %04x\n",activecpu_get_pc(),addres if ((ddrB & 0x20) && (~data & 0x20) && (portB_out & 0x20)) { /* hack to get random EXTEND letters (who is supposed to do this? 68705? PAL?) */ - bublbobl_mcu_sharedram[0x7c] = mame_rand()%6; + bublbobl_mcu_sharedram[0x7c] = mame_rand(Machine)%6; cpunum_set_input_line_vector(0,0,bublbobl_mcu_sharedram[0]); cpunum_set_input_line(0,0,HOLD_LINE); diff --git a/src/machine/daikaiju.c b/src/machine/daikaiju.c index 9d9d358cc..a4f6423a2 100644 --- a/src/machine/daikaiju.c +++ b/src/machine/daikaiju.c @@ -343,7 +343,7 @@ READ8_HANDLER( daikaiju_mcu_status_r ) { int res = input_port_3_r(0); - res^=mame_rand()&3; + res^=mame_rand(Machine)&3; res |=((lsasquad_sound_pending & 0x02)^2)<<3; //inverted flag lsasquad_sound_pending &= ~0x02; return res; diff --git a/src/machine/eeprom.c b/src/machine/eeprom.c index 1b9259921..0fcc374d8 100644 --- a/src/machine/eeprom.c +++ b/src/machine/eeprom.c @@ -91,7 +91,7 @@ struct EEPROM_interface eeprom_interface_93C46 = }; -void nvram_handler_93C46(mame_file *file,int read_or_write) +NVRAM_HANDLER( 93C46 ) { if (read_or_write) EEPROM_save(file); diff --git a/src/machine/eeprom.h b/src/machine/eeprom.h index ff971e5c0..702b1926e 100644 --- a/src/machine/eeprom.h +++ b/src/machine/eeprom.h @@ -31,6 +31,6 @@ UINT8 * EEPROM_get_data_pointer(int * length); /* 93C46 */ extern struct EEPROM_interface eeprom_interface_93C46; -void nvram_handler_93C46(mame_file *file,int read_or_write); +NVRAM_HANDLER( 93C46 ); #endif diff --git a/src/machine/equites.c b/src/machine/equites.c index 79ece11ab..d16024c24 100644 --- a/src/machine/equites.c +++ b/src/machine/equites.c @@ -260,7 +260,7 @@ void equites_8404init(void) timer_pulse(TIME_IN_HZ(106.0), 0, equites_synth_callback); // hand tuned - seedMT(mame_rand()); + seedMT(mame_rand(Machine)); } void equites_8404rule(unsigned pc, int offset, int data) diff --git a/src/machine/generic.c b/src/machine/generic.c index c267b1c4f..37086474b 100644 --- a/src/machine/generic.c +++ b/src/machine/generic.c @@ -49,7 +49,7 @@ static UINT8 interrupt_enable[MAX_CPU]; static void counters_load(int config_type, xml_data_node *parentnode); static void counters_save(int config_type, xml_data_node *parentnode); -static void interrupt_reset(void); +static void interrupt_reset(running_machine *machine); @@ -62,7 +62,7 @@ static void interrupt_reset(void); register for save states -------------------------------------------------*/ -void generic_machine_init(void) +void generic_machine_init(running_machine *machine) { int counternum; @@ -84,17 +84,17 @@ void generic_machine_init(void) memcard_inserted = -1; /* register a reset callback and save state for interrupt enable */ - add_reset_callback(interrupt_reset); + add_reset_callback(machine, interrupt_reset); state_save_register_item_array("cpu", 0, interrupt_enable); /* register for configuration */ config_register("counters", counters_load, counters_save); /* for memory cards, request save state and an exit callback */ - if (Machine->drv->memcard_handler != NULL) + if (machine->drv->memcard_handler != NULL) { state_save_register_global(memcard_inserted); - add_exit_callback(memcard_eject); + add_exit_callback(machine, memcard_eject); } } @@ -266,7 +266,7 @@ void nvram_load(void) if (Machine->drv->nvram_handler != NULL) { mame_file *nvram_file = mame_fopen(Machine->gamedrv->name, 0, FILETYPE_NVRAM, 0); - (*Machine->drv->nvram_handler)(nvram_file, 0); + (*Machine->drv->nvram_handler)(Machine, nvram_file, 0); if (nvram_file != NULL) mame_fclose(nvram_file); } @@ -284,7 +284,7 @@ void nvram_save(void) mame_file *nvram_file = mame_fopen(Machine->gamedrv->name, 0, FILETYPE_NVRAM, 1); if (nvram_file != NULL) { - (*Machine->drv->nvram_handler)(nvram_file, 1); + (*Machine->drv->nvram_handler)(Machine, nvram_file, 1); mame_fclose(nvram_file); } } @@ -296,7 +296,7 @@ void nvram_save(void) with a 0 fill -------------------------------------------------*/ -void nvram_handler_generic_0fill(mame_file *file, int read_or_write) +NVRAM_HANDLER( generic_0fill ) { if (read_or_write) mame_fwrite(file, nvram_select(), generic_nvram_size); @@ -312,7 +312,7 @@ void nvram_handler_generic_0fill(mame_file *file, int read_or_write) with a 1 fill -------------------------------------------------*/ -void nvram_handler_generic_1fill(mame_file *file, int read_or_write) +NVRAM_HANDLER( generic_1fill ) { if (read_or_write) mame_fwrite(file, nvram_select(), generic_nvram_size); @@ -328,7 +328,7 @@ void nvram_handler_generic_1fill(mame_file *file, int read_or_write) with a random fill -------------------------------------------------*/ -void nvram_handler_generic_randfill(mame_file *file, int read_or_write) +NVRAM_HANDLER( generic_randfill ) { int i; @@ -392,7 +392,7 @@ int memcard_create(int index, int overwrite) /* initialize and then save the card */ if (Machine->drv->memcard_handler) - (*Machine->drv->memcard_handler)(file, MEMCARD_CREATE); + (*Machine->drv->memcard_handler)(Machine, file, MEMCARD_CREATE); /* close the file */ mame_fclose(file); @@ -412,7 +412,7 @@ int memcard_insert(int index) /* if a card is already inserted, eject it first */ if (memcard_inserted != -1) - memcard_eject(); + memcard_eject(Machine); assert(memcard_inserted == -1); /* create a name */ @@ -425,7 +425,7 @@ int memcard_insert(int index) /* initialize and then load the card */ if (Machine->drv->memcard_handler) - (*Machine->drv->memcard_handler)(file, MEMCARD_INSERT); + (*Machine->drv->memcard_handler)(Machine, file, MEMCARD_INSERT); /* close the file */ mame_fclose(file); @@ -439,7 +439,7 @@ int memcard_insert(int index) its contents along the way -------------------------------------------------*/ -void memcard_eject(void) +void memcard_eject(running_machine *machine) { mame_file *file; char name[16]; @@ -452,7 +452,7 @@ void memcard_eject(void) memcard_name(memcard_inserted, name); /* open the file; if we can't, it's an error */ - file = mame_fopen(Machine->gamedrv->name, name, FILETYPE_MEMCARD, TRUE); + file = mame_fopen(machine->gamedrv->name, name, FILETYPE_MEMCARD, TRUE); if (file == NULL) { mame_fclose(file); @@ -460,8 +460,8 @@ void memcard_eject(void) } /* initialize and then load the card */ - if (Machine->drv->memcard_handler) - (*Machine->drv->memcard_handler)(file, MEMCARD_EJECT); + if (machine->drv->memcard_handler) + (*machine->drv->memcard_handler)(machine, file, MEMCARD_EJECT); /* close the file */ mame_fclose(file); @@ -491,16 +491,7 @@ int memcard_present(void) void set_led_status(int num, int on) { - char temp[20]; - char *dest = temp; - *dest++ = 'l'; - *dest++ = 'e'; - *dest++ = 'd'; - if (num > 100) *dest++ = '0' + ((num / 100) % 10); - if (num > 10) *dest++ = '0' + ((num / 10) % 10); - *dest++ = '0' + (num % 10); - *dest++ = 0; - output_set_value(temp, on ? 1 : 0); + output_set_led_value(num, on); } @@ -514,7 +505,7 @@ void set_led_status(int num, int on) states on a reset -------------------------------------------------*/ -static void interrupt_reset(void) +static void interrupt_reset(running_machine *machine) { int cpunum; diff --git a/src/machine/generic.h b/src/machine/generic.h index 2ddb95c3b..d20536680 100644 --- a/src/machine/generic.h +++ b/src/machine/generic.h @@ -56,7 +56,7 @@ extern UINT32 *generic_nvram32; /* ----- initialization ----- */ /* set up all the common systems */ -void generic_machine_init(void); +void generic_machine_init(running_machine *machine); @@ -85,13 +85,13 @@ void nvram_load(void); void nvram_save(void); /* generic NVRAM handler that defaults to a 0 fill */ -void nvram_handler_generic_0fill(mame_file *file, int read_or_write); +NVRAM_HANDLER( generic_0fill ); /* generic NVRAM handler that defaults to a 1 fill */ -void nvram_handler_generic_1fill(mame_file *file, int read_or_write); +NVRAM_HANDLER( generic_1fill ); /* generic NVRAM handler that defaults to a random fill */ -void nvram_handler_generic_randfill(mame_file *file, int read_or_write); +NVRAM_HANDLER( generic_randfill ); @@ -104,7 +104,7 @@ int memcard_create(int index, int overwrite); int memcard_insert(int index); /* "eject" a memory card and save its data */ -void memcard_eject(void); +void memcard_eject(running_machine *machine); /* returns the index of the current memory card, or -1 if none */ int memcard_present(void); diff --git a/src/machine/grchamp.c b/src/machine/grchamp.c deleted file mode 100644 index c398db70c..000000000 --- a/src/machine/grchamp.c +++ /dev/null @@ -1,169 +0,0 @@ -#include "driver.h" -#include "grchamp.h" - -int grchamp_cpu_irq_enable[2]; - -static int comm_latch; -static int comm_latch2[4]; - -/*************************************************************************** - - Machine Init - -***************************************************************************/ - -DRIVER_INIT( grchamp ) { - /* clear the irq latches */ - grchamp_cpu_irq_enable[0] = grchamp_cpu_irq_enable[1] = 0; - - /* if the coin system is 1 way, lock Coin B (Page 40) */ - if ( readinputport( 1 ) & 0x10 ) - coin_lockout_w( 1, 1 ); -} - -/* - A note about port signals (note the preceding asterisk): - *OUTxx = OUT port signals from CPU1 - OUTxx = OUT port signals from CPU2 -*/ - -/*************************************************************************** - - CPU 1 - -***************************************************************************/ - -READ8_HANDLER( grchamp_port_0_r ) { - return comm_latch; -} - -extern WRITE8_HANDLER( PC3259_control_w ); - -WRITE8_HANDLER( grchamp_control0_w ){ - /* *OUT0 - Page 42 */ - /* bit 0 = trigger irq on cpu1 (itself) when vblank arrives */ - /* bit 1 = enable PC3259 (10A), page 41, top-left. TODO */ - /* bit 2/3 = unused */ - /* bit 4 = HEAD LAMP (1-D5) */ - /* bit 5 = CHANGE (1-D5?) */ - /* bit 6 = FOG OUT (1-E4) */ - /* bit 7 = RADAR ON (S26) */ - grchamp_videoreg0 = data; - grchamp_cpu_irq_enable[0] = data & 1; /* bit 0 */ -// osd_led_w( 0, ( ~data >> 4 ) & 1 ); /* bit 4 */ -} - -WRITE8_HANDLER( grchamp_coinled_w ){ - /* *OUT9 - Page 40 */ - /* bit 0-3 = unused */ - /* bit 4 = Coin Lockout */ - /* bit 5 = Game Over lamp */ - /* bit 6/7 = unused */ -// coin_lockout_global_w( 0, ( data >> 4 ) & 1 ); /* bit 4 */ -// osd_led_w( 1, ( ~data >> 5 ) & 1 ); /* bit 5 */ -} - -WRITE8_HANDLER( grchamp_sound_w ){ - /* *OUT14 - Page 42 */ - soundlatch_w( 0, data ); - cpunum_set_input_line(2, INPUT_LINE_NMI, PULSE_LINE ); -} - -WRITE8_HANDLER( grchamp_comm_w ){ - /* *OUT16 - Page 40 */ - comm_latch2[ offset & 3] = data; -} - -/*************************************************************************** - - CPU 2 - -***************************************************************************/ - -READ8_HANDLER( grchamp_port_1_r ) { - return comm_latch2[offset]; -} - -WRITE8_HANDLER( grchamp_port_1_w ) { - grchamp_vreg1[offset] = data; - - switch( offset ) { /* OUT0 - OUTF (Page 48) */ - /* OUT0 - Page 43: writes to 'Left Synk Bus' */ /* bg0 yscroll lsb */ - /* OUT1 - Page 43: writes to 'Left Synk Bus' */ /* bg0 yscroll msb */ - /* OUT2 - Page 43: writes to 'Left Synk Bus' */ /* bg0 xscroll? */ - - case 0x03: /* OUT3 - Page 45 */ - /* bit0-bit3 = Analog Tachometer output - bit4 = Palette selector. (Goes to A4 on the color prom). I believe this - select between colors 0-15 and colors 16-31. - bit5 = Center Layer 256H line enable. This bit enables/disables the - 256H line (The extra higher bit for scroll) on the center (road) layer. - bit 6 and 7 = unused. - */ - break; - - case 0x04: /* OUT4 - Page 46 */ - /* trigger irq on cpu2 when vblank arrives */ - grchamp_cpu_irq_enable[1] = data & 1; - break; - - /* OUT5 - unused */ /* bg1 yscroll lsb */ - /* OUT6 - unused */ /* bg1 yscroll msb */ - /* OUT7 - Page 44: writes to 'Right Synk Bus' */ /* bg1 xscroll? */ - - case 0x08: /* OUT8 - Page 47 */ - comm_latch = data; - break; - /* OUT9 - Page 47: writes to 'Center Synk Bus' */ /* bg2 yscroll lsb */ - /* OUTA - Page 47: writes to 'Center Synk Bus' */ /* bg2 yscroll msb? */ - /* OUTB - Page 47: writes to 'Center Synk Bus' */ /* bg2 xscroll? */ - case 0x0C: /* OUTC - Page 48: goes to connector Q-23 */ - discrete_sound_w(GRCHAMP_ENGINE_CS_EN, data & 0x80); - discrete_sound_w(GRCHAMP_SIFT_DATA, (data >> 5) & 0x03); - discrete_sound_w(GRCHAMP_ATTACK_UP_DATA, (data >> 2) & 0x07); - discrete_sound_w(GRCHAMP_IDLING_EN, data & 0x02); - discrete_sound_w(GRCHAMP_FOG_EN, data & 0x01); - break; - case 0x0D: /* OUTD - Page 48: goes to connector Q-25 */ - discrete_sound_w(GRCHAMP_PLAYER_SPEED_DATA, (data >> 4) & 0x0f); - discrete_sound_w(GRCHAMP_ATTACK_SPEED_DATA, data & 0x0f); - break; - default: - /* OUTE - Page 48: goes to connector Q-27 */ - /* OUTF - unused */ - break; - } -} -/*************************************************************************** - - CPU 3 - -***************************************************************************/ - -WRITE8_HANDLER( grchamp_portA_0_w ) // IC 3B -{ - discrete_sound_w(GRCHAMP_A_DATA, data); -} -WRITE8_HANDLER( grchamp_portB_0_w ) // IC 3B -{ - discrete_sound_w(GRCHAMP_B_DATA, 255-data); -} - -WRITE8_HANDLER( grchamp_portA_1_w ) // IC 2B -{ - -} - -WRITE8_HANDLER( grchamp_portB_1_w ) // IC 2B -{ - -} - -WRITE8_HANDLER( grchamp_portA_2_w ) // IC 1B -{ - -} -WRITE8_HANDLER( grchamp_portB_2_w ) // IC 1B -{ - -} diff --git a/src/machine/idectrl.c b/src/machine/idectrl.c index 0704de63f..f3a4f1ccc 100644 --- a/src/machine/idectrl.c +++ b/src/machine/idectrl.c @@ -274,7 +274,7 @@ INLINE void signal_delayed_interrupt(struct ide_state *ide, double time, int buf * *************************************/ -static void ide_controller_exit(void) +static void ide_controller_exit(running_machine *machine) { int i; @@ -294,8 +294,8 @@ int ide_controller_init_custom(int which, struct ide_interface *intf, chd_file * const hard_disk_info *hdinfo; /* must be called during init phase */ - assert_always(mame_get_phase() == MAME_PHASE_INIT, "ide_controller_init can only be called at init time"); - add_exit_callback(ide_controller_exit); + assert_always(mame_get_phase(Machine) == MAME_PHASE_INIT, "ide_controller_init can only be called at init time"); + add_exit_callback(Machine, ide_controller_exit); /* NULL interface is immediate failure */ if (!intf) diff --git a/src/machine/intelfsh.c b/src/machine/intelfsh.c index a649574de..4b37efddd 100644 --- a/src/machine/intelfsh.c +++ b/src/machine/intelfsh.c @@ -382,7 +382,7 @@ void intelflash_write(int chip, UINT32 address, UINT32 data) } } -void nvram_handler_intelflash(int chip,mame_file *file,int read_or_write) +void nvram_handler_intelflash(running_machine *machine, int chip,mame_file *file,int read_or_write) { struct flash_chip *c; if( chip >= FLASH_CHIPS_MAX ) diff --git a/src/machine/intelfsh.h b/src/machine/intelfsh.h index 7b0a9add5..0f348d4e1 100644 --- a/src/machine/intelfsh.h +++ b/src/machine/intelfsh.h @@ -16,6 +16,6 @@ extern void intelflash_init( int chip, int type, void *data ); extern UINT32 intelflash_read( int chip, UINT32 address ); extern void intelflash_write( int chip, UINT32 address, UINT32 value ); -extern void nvram_handler_intelflash( int chip, mame_file *file, int read_or_write ); +extern void nvram_handler_intelflash( running_machine *machine, int chip, mame_file *file, int read_or_write ); #endif diff --git a/src/machine/kaneko16.c b/src/machine/kaneko16.c index b3458db83..ff0ef56e3 100644 --- a/src/machine/kaneko16.c +++ b/src/machine/kaneko16.c @@ -80,7 +80,7 @@ READ16_HANDLER(galpanib_calc_r) return (((UINT32)hit.mult_a * (UINT32)hit.mult_b) & 0xffff); case 0x14/2: - return (mame_rand() & 0xffff); + return (mame_rand(Machine) & 0xffff); default: logerror("CPU #0 PC %06x: warning - read unmapped calc address %06x\n",activecpu_get_pc(),offset<<1); diff --git a/src/machine/konamigx.c b/src/machine/konamigx.c index 2c39dbb09..c18edb418 100644 --- a/src/machine/konamigx.c +++ b/src/machine/konamigx.c @@ -565,7 +565,7 @@ INLINE void zdrawgfxzoom32GP( mame_bitmap *bitmap, const gfx_element *gfx, const src_base = gfx->gfxdata + (code % gfx->total_elements) * gfx->char_modulo; pal_base = gfx->colortable + (color % gfx->total_colors) * granularity; - shd_base = (UINT32 *)palette_shadow_table; + shd_base = Machine->shadow_table; dst_ptr = bitmap->base; dst_pitch = GX_BMPPW; @@ -1254,7 +1254,7 @@ int konamigx_mixer_init(int objdma) else gx_spriteram = K053247_ram; - palette_set_shadow_dRGB32(3,-80,-80,-80, 0); + palette_set_shadow_dRGB32(Machine, 3,-80,-80,-80, 0); K054338_invert_alpha(1); return(0); @@ -1720,7 +1720,7 @@ void konamigx_mixer(mame_bitmap *bitmap, const rectangle *cliprect, } color &= K055555_COLORMASK; - if (drawmode >= 4) palette_set_shadow_mode(order & 0x0f); + if (drawmode >= 4) palette_set_shadow_mode(Machine, order & 0x0f); if (!(mixerflags & GXMIX_NOZBUF)) { @@ -1991,7 +1991,7 @@ WRITE16_HANDLER( K055550_word_w ) else if (dy < 0) i = 0x80; else - i = mame_rand() & 0xff; // vector direction indeterminate + i = mame_rand(Machine) & 0xff; // vector direction indeterminate prot_data[0x10] = i; break; diff --git a/src/machine/mb3773.c b/src/machine/mb3773.c index dbaee774b..f931091f7 100644 --- a/src/machine/mb3773.c +++ b/src/machine/mb3773.c @@ -13,7 +13,7 @@ static UINT8 ck = 0; static void watchdog_timeout( int unused ) { - mame_schedule_soft_reset(); + mame_schedule_soft_reset(Machine); } static void reset_timer( void ) diff --git a/src/machine/mcr.c b/src/machine/mcr.c index ac5380c3c..e6c4e00fa 100644 --- a/src/machine/mcr.c +++ b/src/machine/mcr.c @@ -394,7 +394,7 @@ MACHINE_START( zwackery ) pia_config(2, PIA_STANDARD_ORDERING, &zwackery_pia_2_intf); pia_config(3, PIA_STANDARD_ORDERING, &zwackery_pia_3_intf); pia_config(4, PIA_STANDARD_ORDERING, &zwackery_pia_4_intf); - return machine_start_mcr68(); + return machine_start_mcr68(machine); } diff --git a/src/machine/midwayic.c b/src/machine/midwayic.c index d02d68dae..7211a0790 100644 --- a/src/machine/midwayic.c +++ b/src/machine/midwayic.c @@ -555,13 +555,13 @@ void midway_ioasic_init(int shuffle, int upper, int yearoffs, void (*irq_callbac }; /* do we have a DCS2 sound chip connected? (most likely) */ - ioasic.has_dcs = (mame_find_cpu_index("dcs2") != -1 || mame_find_cpu_index("dsio") != -1 || mame_find_cpu_index("denver") != -1); - ioasic.has_cage = (mame_find_cpu_index("cage") != -1); - ioasic.dcs_cpu = mame_find_cpu_index("dcs2"); + ioasic.has_dcs = (mame_find_cpu_index(Machine, "dcs2") != -1 || mame_find_cpu_index(Machine, "dsio") != -1 || mame_find_cpu_index(Machine, "denver") != -1); + ioasic.has_cage = (mame_find_cpu_index(Machine, "cage") != -1); + ioasic.dcs_cpu = mame_find_cpu_index(Machine, "dcs2"); if (ioasic.dcs_cpu == (UINT8)-1) - ioasic.dcs_cpu = mame_find_cpu_index("dsio"); + ioasic.dcs_cpu = mame_find_cpu_index(Machine, "dsio"); if (ioasic.dcs_cpu == (UINT8)-1) - ioasic.dcs_cpu = mame_find_cpu_index("denver"); + ioasic.dcs_cpu = mame_find_cpu_index(Machine, "denver"); ioasic.shuffle_type = shuffle; ioasic.shuffle_map = &shuffle_maps[shuffle][0]; ioasic.auto_ack = 0; diff --git a/src/machine/midwunit.c b/src/machine/midwunit.c index 946a431da..e106a9ad5 100644 --- a/src/machine/midwunit.c +++ b/src/machine/midwunit.c @@ -566,7 +566,7 @@ MACHINE_RESET( midwunit ) MACHINE_RESET( midxunit ) { - machine_reset_midwunit(); + machine_reset_midwunit(machine); dcs_set_io_callbacks(midxunit_dcs_output_full, NULL); } diff --git a/src/machine/model1.c b/src/machine/model1.c index c8a711a1d..ac64d768a 100644 --- a/src/machine/model1.c +++ b/src/machine/model1.c @@ -351,9 +351,9 @@ static void f14(void) } if(r == 4) { - cmat[9] += mame_rand(); - cmat[10] += mame_rand(); - cmat[11] += mame_rand(); + cmat[9] += mame_rand(Machine); + cmat[10] += mame_rand(Machine); + cmat[11] += mame_rand(Machine); } next_fn(); @@ -699,7 +699,7 @@ static void f42(void) (void)b; (void)c; logerror("TGP f42 %f, %f, %f (%x)\n", a, b, c, activecpu_get_pc()); - // fifoout_push_f((mame_rand() % 1000) - 500); + // fifoout_push_f((mame_rand(Machine) % 1000) - 500); fifoout_push_f(0); fifoout_push_f(0); fifoout_push_f(0); @@ -1550,7 +1550,7 @@ static void f100(void) int i; logerror("TGP f100 get list (%x)\n", activecpu_get_pc()); for(i=0; i main CPU communications */ + if (!(m6850_mpu4_status & 0x02)) + { + /* set the overrun bit if the data in the destination hasn't been read yet */ + if (m6850_status & 0x01) + m6850_status |= 0x20; + + /* copy the mpu4's output to our input */ + m6850_input = m6850_mpu4_output; + LOGMV(("VID ACIA INPUT = %d \n",m6850_input)); + + /* set the receive register full bit */ + m6850_status |= 0x01; + + /* set the mpu4's transmitter register empty bit */ + m6850_mpu4_status |= 0x02; + } + + /* main -> mpu4 CPU communications */ + if (!(m6850_status & 0x02)) + { + /* set the overrun bit if the data in the destination hasn't been read yet */ + if (m6850_mpu4_status & 0x01) + m6850_mpu4_status |= 0x20; + + /* copy the main CPU's output to our input */ + m6850_mpu4_input = m6850_output; + LOGM4(("MPU4 ACIA INPUT = %d \n",m6850_mpu4_input)); + /* set the receive register full bit */ + m6850_mpu4_status |= 0x01; + + /* set the main CPU's trasmitter register empty bit */ + m6850_status |= 0x02; + } + + /* check for reset states */ + if ((m6850_control & 3) == 3) + { + m6850_status = 0x02; + } + if ((m6850_mpu4_control & 3) == 3) + m6850_mpu4_status = 0x02; + + /* check for transmit/receive IRQs on the main CPU */ + new_state = 0; + if ((m6850_control & 0x80) && (m6850_status & 0x21)) new_state = 1; + if ((m6850_control & 0x60) == 0x20 && (m6850_status & 0x02)) new_state = 1; + + /* apply the change */ + if (new_state && !(m6850_status & 0x80)) + { + m6850_irq_state = 1; + update_mpu68_interrupts(); + m6850_status |= 0x80; + } + else if (!new_state && (m6850_status & 0x80)) + { + m6850_irq_state = 0; + update_mpu68_interrupts(); + m6850_status &= ~0x80; + } + + /* check for transmit/receive IRQs on the mpu4 CPU */ + new_state = 0; + if ((m6850_mpu4_control & 0x80) && (m6850_mpu4_status & 0x21)) new_state = 1; + if ((m6850_mpu4_control & 0x60) == 0x20 && (m6850_mpu4_status & 0x02)) new_state = 1; + + /* apply the change */ + if (new_state && !(m6850_mpu4_status & 0x80)) + { + cpu0_irq(1); + m6850_mpu4_status |= 0x80; + } + else if (!new_state && (m6850_mpu4_status & 0x80)) + { + cpu0_irq(0); + m6850_mpu4_status &= ~0x80; + } +} + +/************************************* + * + * 6850 UART (main CPU) + * + *************************************/ + +READ16_HANDLER( vidcard_uart_rx_r ) +{ + int result; + offset = (offset << 8 | 0x00ff); + + /* status register is at offset 0 */ + if (offset == 0) + { + result = m6850_status; + LOGMV(("MPU4 ACIA STAT = %d \n",m6850_status)); + } + + /* input register is at offset 1 */ + else + { + result = m6850_input; + + /* clear the overrun and receive buffer full bits */ + m6850_status &= ~0x21; + m6850_update_io(); + } + return ((result << 8) | 0x00ff); +} + + +static void m6850_data_ready_callback(int param) +{ + /* set the output data byte and indicate that we're ready to go */ + m6850_output = param; + m6850_data_ready = 1; + m6850_update_io(); +} + +static void m6850_mpu4_data_ready_callback(int param) +{ + /* set the output data byte and indicate that we're ready to go */ + m6850_mpu4_output = param; + m6850_mpu4_data_ready = 1; + m6850_update_io(); +} + + +static void m6850_w_callback(int param) +{ + /* indicate that the transmit buffer is no longer empty and update the I/O state */ + m6850_status &= ~0x02; + m6850_output_temp = param; + m6850_update_io(); + + /* set a timer for 500usec later to actually transmit the data */ +// timer_set(TIME_IN_USEC(500), param, m6850_data_ready_callback); +} + +static void m6850_mpu4_w_callback(int param) +{ + /* indicate that the transmit buffer is no longer empty and update the I/O state */ + m6850_mpu4_status &= ~0x02; + m6850_mpu4_output_temp = param; + m6850_update_io(); + + /* set a timer for 500usec later to actually transmit the data */ +// timer_set(TIME_IN_USEC(500), param, m6850_data_ready_callback); +} + +WRITE16_HANDLER( vidcard_uart_tx_w ) +{ + /* control register is at offset 0 */ + if (offset == 0) + { + m6850_control = (data & 0xff); + LOGMV(("VID ACIA CTRL = %d \n",m6850_control)); + + /* re-update since interrupt enables could have been modified */ + m6850_update_io(); + } + + /* output register is at offset 1; set a timer to synchronize the CPUs */ + else + timer_set(TIME_NOW, (data & 0xff), m6850_w_callback); + LOGMV(("VID ACIA SENDING = %d \n",data&0xff)); +} + + + +/************************************* + * + * 6850 UART (mpu4 CPU) + * + *************************************/ + +READ8_HANDLER( mpu4_uart_rx_r ) +{ + int result; + + /* status register is at offset 0 */ + if (offset == 0) + { + result = m6850_mpu4_status; + LOGM4(("MPU4 ACIA STAT = %d \n",m6850_mpu4_status)); + } + + /* input register is at offset 1 */ + else + { + result = m6850_mpu4_input; + + /* clear the overrun and receive buffer full bits */ + m6850_mpu4_status &= ~0x21; + m6850_update_io(); + } + + return result; +} + + +WRITE8_HANDLER( mpu4_uart_tx_w ) +{ + /* control register is at offset 0 */ + if (offset == 0) + { + m6850_mpu4_control = data; + LOGM4(("MPU4 ACIA CTRL = %d \n",m6850_mpu4_control)); + } + /* output register is at offset 1 */ + else + { +// m6850_mpu4_output_temp = data; +// m6850_mpu4_status &= ~0x02; + timer_set(TIME_NOW, (data), m6850_mpu4_w_callback); + LOGM4(("MPU4 ACIA SENDING = %d \n",data)); + } + + /* re-update since interrupt enables could have been modified */ + m6850_update_io(); +} + diff --git a/src/machine/n64.c b/src/machine/n64.c index 620ba4522..6b8a74a74 100644 --- a/src/machine/n64.c +++ b/src/machine/n64.c @@ -7,10 +7,20 @@ #include "includes/n64.h" #include "sound/dmadac.h" +#if LSB_FIRST + #define BYTE_ADDR_XOR 3 + #define WORD_ADDR_XOR 1 +#else + #define BYTE_ADDR_XOR 0 + #define WORD_ADDR_XOR 0 +#endif + UINT32 *rdram; UINT32 *rsp_imem; UINT32 *rsp_dmem; +static int first_rsp = 1; + // MIPS Interface static UINT32 mi_version; static UINT32 mi_interrupt = 0; @@ -112,19 +122,34 @@ static void sp_dma(int direction) { UINT8 *src, *dst; int i; + int cpu = cpu_getactivecpu(); if (sp_dma_length == 0) { return; } + sp_dma_length++; + + if ((sp_dma_length & 3) != 0) + { + //fatalerror("sp_dma (%s): sp_dma_length unaligned %08X\n", cpu ? "RSP" : "R4300i", sp_dma_length); + sp_dma_length = (sp_dma_length + 3) & ~3; + + //sp_dma_length &= ~3; + } + if (sp_mem_addr & 0x3) { - fatalerror("sp_dma: sp_mem_addr unaligned: %08X\n", sp_mem_addr); + fatalerror("sp_dma (%s): sp_mem_addr unaligned: %08X\n", cpu ? "RSP" : "R4300i", sp_mem_addr); } if (sp_dram_addr & 0x3) { - fatalerror("sp_dma: sp_dram_addr unaligned: %08X\n", sp_dram_addr); + fatalerror("sp_dma (%s): sp_dram_addr unaligned: %08X\n", cpu ? "RSP" : "R4300i", sp_dram_addr); + + // Diddy Kong Racing does unaligned DMA? + //sp_dram_addr &= ~0x3; + //sp_dram_addr = (sp_dram_addr + 3) & ~0x3; } if (sp_dma_count > 0) @@ -136,9 +161,9 @@ static void sp_dma(int direction) fatalerror("sp_dma: dma_skip = %d\n", sp_dma_skip); } - if ((sp_mem_addr & 0xfff) + (sp_dma_length+1) > 0x1000) + if ((sp_mem_addr & 0xfff) + (sp_dma_length) > 0x1000) { - fatalerror("sp_dma: dma out of memory area: %08X, %08X\n", sp_mem_addr, sp_dma_length+1); + fatalerror("sp_dma: dma out of memory area: %08X, %08X\n", sp_mem_addr, sp_dma_length); } if (direction == 0) // RDRAM -> I/DMEM @@ -146,7 +171,9 @@ static void sp_dma(int direction) src = (UINT8*)&rdram[sp_dram_addr / 4]; dst = (sp_mem_addr & 0x1000) ? (UINT8*)&rsp_imem[(sp_mem_addr & 0xfff) / 4] : (UINT8*)&rsp_dmem[(sp_mem_addr & 0xfff) / 4]; - for (i=0; i <= sp_dma_length; i++) + //printf("sp_dma: %08X to %08X, length %08X\n", sp_dram_addr, sp_mem_addr, sp_dma_length); + + for (i=0; i < sp_dma_length; i++) { dst[BYTE4_XOR_BE(i)] = src[BYTE4_XOR_BE(i)]; } @@ -156,13 +183,18 @@ static void sp_dma(int direction) { dst[BYTE4_XOR_BE(sp_mem_addr+i) & 0xfff] = src[BYTE4_XOR_BE(i)]; }*/ + + sp_mem_addr += sp_dma_length; + sp_dram_addr += sp_dma_length; } else // I/DMEM -> RDRAM { src = (sp_mem_addr & 0x1000) ? (UINT8*)&rsp_imem[(sp_mem_addr & 0xfff) / 4] : (UINT8*)&rsp_dmem[(sp_mem_addr & 0xfff) / 4]; dst = (UINT8*)&rdram[sp_dram_addr / 4]; - for (i=0; i <= sp_dma_length; i++) +// printf("sp_dma: %08X to %08X, length %08X\n", sp_mem_addr, sp_dram_addr, sp_dma_length); + + for (i=0; i < sp_dma_length; i++) { dst[BYTE4_XOR_BE(i)] = src[BYTE4_XOR_BE(i)]; } @@ -172,6 +204,9 @@ static void sp_dma(int direction) { dst[BYTE4_XOR_BE(i)] = src[BYTE4_XOR_BE(sp_mem_addr+i) & 0xfff]; }*/ + + sp_mem_addr += sp_dma_length; + sp_dram_addr += sp_dma_length; } } @@ -182,6 +217,8 @@ void sp_set_status(UINT32 status) { if (status & 0x1) { + cpu_trigger(6789); + cpunum_set_input_line(1, INPUT_LINE_HALT, ASSERT_LINE); rsp_sp_status |= SP_STATUS_HALT; } @@ -189,7 +226,7 @@ void sp_set_status(UINT32 status) { rsp_sp_status |= SP_STATUS_BROKE; - if (rsp_sp_status & SP_STATUS_INT_ON_BRK) + if (rsp_sp_status & SP_STATUS_INTR_BREAK) { signal_rcp_interrupt(SP_INTERRUPT); } @@ -261,8 +298,17 @@ WRITE32_HANDLER( n64_sp_reg_w ) { if (data & 0x00000001) // clear halt { - cpunum_set_input_line(1, INPUT_LINE_HALT, CLEAR_LINE); - rsp_sp_status &= ~SP_STATUS_HALT; + if (first_rsp) + { + cpu_spinuntil_trigger(6789); + + cpunum_set_input_line(1, INPUT_LINE_HALT, CLEAR_LINE); + rsp_sp_status &= ~SP_STATUS_HALT; + } + else + { + first_rsp = 1; + } } if (data & 0x00000002) // set halt { @@ -280,8 +326,8 @@ WRITE32_HANDLER( n64_sp_reg_w ) } if (data & 0x00000020) rsp_sp_status &= ~SP_STATUS_SSTEP; // clear single step if (data & 0x00000040) rsp_sp_status |= SP_STATUS_SSTEP; // set single step - if (data & 0x00000080) rsp_sp_status &= ~SP_STATUS_INT_ON_BRK; // clear interrupt on break - if (data & 0x00000100) rsp_sp_status |= SP_STATUS_INT_ON_BRK; // set interrupt on break + if (data & 0x00000080) rsp_sp_status &= ~SP_STATUS_INTR_BREAK; // clear interrupt on break + if (data & 0x00000100) rsp_sp_status |= SP_STATUS_INTR_BREAK; // set interrupt on break if (data & 0x00000200) rsp_sp_status &= ~SP_STATUS_SIGNAL0; // clear signal 0 if (data & 0x00000400) rsp_sp_status |= SP_STATUS_SIGNAL0; // set signal 0 if (data & 0x00000800) rsp_sp_status &= ~SP_STATUS_SIGNAL1; // clear signal 1 @@ -316,7 +362,7 @@ WRITE32_HANDLER( n64_sp_reg_w ) switch (offset & 0xffff) { case 0x00/4: // SP_PC_REG - cpunum_set_info_int(1, CPUINFO_INT_PC, 0x04000000 | (data & 0x1fff)); + cpunum_set_info_int(1, CPUINFO_INT_PC, 0x04001000 | (data & 0xfff)); break; default: @@ -775,7 +821,28 @@ WRITE32_HANDLER( n64_pi_reg_w ) case 0x08/4: // PI_RD_LEN_REG { - fatalerror("PI_RD_LEN_REG: %08X, %08X to %08X\n", data, pi_dram_addr, pi_cart_addr); + int i; + UINT32 dma_length = (data + 1); + + /*if (dma_length & 3) + { + dma_length = (dma_length + 3) & ~3; + }*/ + + //printf("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 = program_read_byte_32be(pi_dram_addr); + program_write_byte_32be(pi_cart_addr, b); + pi_cart_addr += 1; + pi_dram_addr += 1; + } + } + + signal_rcp_interrupt(PI_INTERRUPT); break; } @@ -784,6 +851,11 @@ WRITE32_HANDLER( n64_pi_reg_w ) int i; UINT32 dma_length = (data + 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) @@ -807,6 +879,7 @@ WRITE32_HANDLER( n64_pi_reg_w ) { // TODO: CIC-6105 has different address... program_write_dword_32be(0x00000318, 0x400000); + program_write_dword_32be(0x000003f0, 0x800000); pi_first_dma = 0; } @@ -858,6 +931,49 @@ UINT32 si_dram_addr = 0; UINT32 si_pif_addr = 0; UINT32 si_status = 0; +static UINT8 eeprom[512]; +static UINT8 mempack[0x8000]; + +static UINT8 calc_mempack_crc(UINT8 *buffer, int length) +{ + int i, j; + UINT32 crc = 0; + UINT32 temp2 = 0; + + for (i=0; i <= length; i++) + { + for (j=7; j >= 0; j--) + { + if ((crc & 0x80) != 0) + { + temp2 = 0x85; + } + else + { + temp2 = 0; + } + + crc <<= 1; + + if (i == length) + { + crc &= 0xff; + } + else + { + if ((buffer[i] & (1 << j)) != 0) + { + crc |= 0x1; + } + } + + crc ^= temp2; + } + } + + return crc; +} + static int pif_channel_handle_command(int channel, int slength, UINT8 *sdata, int rlength, UINT8 *rdata) { int i; @@ -878,7 +994,7 @@ static int pif_channel_handle_command(int channel, int slength, UINT8 *sdata, in { rdata[0] = 0x05; rdata[1] = 0x00; - rdata[2] = 0x01; + rdata[2] = 0x02; return 0; } case 1: @@ -893,7 +1009,11 @@ static int pif_channel_handle_command(int channel, int slength, UINT8 *sdata, in rdata[0] = 0x00; rdata[1] = 0x80; rdata[2] = 0x00; - return 0; + //rdata[0] = 0xff; + //rdata[1] = 0xff; + //rdata[2] = 0xff; + + return 1; } case 5: { @@ -940,9 +1060,98 @@ static int pif_channel_handle_command(int channel, int slength, UINT8 *sdata, in break; } + case 0x02: + { + UINT32 address, checksum; + + /*printf("Read from mempack, rlength = %d, slength = %d\n", rlength, slength); + for (i=0; i < slength; i++) + { + printf("%02X ", sdata[i]); + } + printf("\n");*/ + + address = (sdata[1] << 8) | (sdata[2]); + checksum = address & 0x1f; + address &= ~0x1f; + + if (address == 0x400) + { + for (i=0; i < rlength-1; i++) + { + rdata[i] = 0x00; + } + + rdata[rlength-1] = calc_mempack_crc(rdata, rlength-1); + // printf("CRC = %02X\n", rdata[rlength-1]); + } + else if (address < 0x7fe0) + { + for (i=0; i < rlength-1; i++) + { + rdata[i] = mempack[address+i]; + } + + rdata[rlength-1] = calc_mempack_crc(rdata, rlength-1); + // printf("CRC = %02X\n", rdata[rlength-1]); + } + return 1; + } + case 0x03: + { + UINT32 address, checksum; + int i; + /*printf("Write to mempack, rlength = %d, slength = %d\n", rlength, slength); + for (i=0; i < slength; i++) + { + printf("%02X ", sdata[i]); + } + printf("\n");*/ + + address = (sdata[1] << 8) | (sdata[2]); + checksum = address & 0x1f; + address &= ~0x1f; + + if (address == 0x8000) + { + + } + else + { + for (i=3; i < slength; i++) + { + mempack[address++] = sdata[i]; + } + } + + rdata[0] = calc_mempack_crc(&sdata[3], slength-3); + + return 1; + } + case 0x04: // Read from EEPROM { - return 0; + UINT8 block_offset; + + if (channel != 4) + { + //fatalerror("Tried to write to EEPROM on channel %d\n", channel); + return 1; + } + + if (slength != 2 || rlength != 8) + { + fatalerror("handle_pif: write EEPROM (bytes to send %d, bytes to receive %d)\n", slength, rlength); + } + + block_offset = sdata[1] * 8; + + for (i=0; i < 8; i++) + { + rdata[i] = eeprom[block_offset+i]; + } + + return 1; } case 0x05: // Write to EEPROM @@ -951,7 +1160,8 @@ static int pif_channel_handle_command(int channel, int slength, UINT8 *sdata, in if (channel != 4) { - fatalerror("Tried to write to EEPROM on channel %d\n", channel); + //fatalerror("Tried to write to EEPROM on channel %d\n", channel); + return 1; } if (slength != 10 || rlength != 1) @@ -959,17 +1169,18 @@ static int pif_channel_handle_command(int channel, int slength, UINT8 *sdata, in fatalerror("handle_pif: write EEPROM (bytes to send %d, bytes to receive %d)\n", slength, rlength); } - block_offset = sdata[1]; - printf("Write EEPROM: offset %02X: ", block_offset); + block_offset = sdata[1] * 8; + //printf("Write EEPROM: offset %02X: ", block_offset); for (i=0; i < 8; i++) { - printf("%02X ", sdata[2+i]); + //printf("%02X ", sdata[2+i]); + eeprom[block_offset+i] = sdata[2+i]; } - printf("\n"); + //printf("\n"); rdata[0] = 0; - return 0; + return 1; } case 0xff: // reset @@ -986,6 +1197,7 @@ static int pif_channel_handle_command(int channel, int slength, UINT8 *sdata, in return 1; } } + return 0; } @@ -993,7 +1205,8 @@ static void handle_pif(void) { int j; - /*{ + /* + { int i; for (i=0; i < 8; i++) { @@ -1001,8 +1214,8 @@ static void handle_pif(void) printf("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]); } printf("\n"); - }*/ - + } + */ if (pif_cmd[0x3f] == 0x1) // only handle the command if the last byte is 1 { @@ -1013,7 +1226,7 @@ static void handle_pif(void) while (cmd_ptr < 0x3f && !end) { UINT8 bytes_to_send; - UINT8 bytes_to_recv; + INT8 bytes_to_recv; bytes_to_send = pif_cmd[cmd_ptr++]; @@ -1044,6 +1257,10 @@ static void handle_pif(void) if (res == 0) { + if (cmd_ptr + bytes_to_recv > 0x3f) + { + fatalerror("cmd_ptr overflow\n"); + } for (j=0; j < bytes_to_recv; j++) { pif_ram[cmd_ptr++] = recv_buffer[j]; @@ -1051,7 +1268,8 @@ static void handle_pif(void) } else if (res == 1) { - pif_ram[cmd_ptr-2] |= 0x80; + int offset = 0;//bytes_to_send; + pif_ram[cmd_ptr-offset-2] |= 0x80; } } @@ -1087,7 +1305,7 @@ static void pif_dma(int direction) if (direction) // RDRAM -> PIF RAM { - src = &rdram[(si_dram_addr & 0x1fffffff) / 4]; + src = (UINT32*)&rdram[(si_dram_addr & 0x1fffffff) / 4]; for (i=0; i < 64; i+=4) { @@ -1104,7 +1322,7 @@ static void pif_dma(int direction) { handle_pif(); - dst = &rdram[(si_dram_addr & 0x1fffffff) / 4]; + dst = (UINT32*)&rdram[(si_dram_addr & 0x1fffffff) / 4]; for (i=0; i < 64; i+=4) { @@ -1194,7 +1412,7 @@ void n64_machine_reset(void) /* configure fast RAM regions for DRC */ cpunum_set_info_int(0, CPUINFO_INT_MIPS3_FASTRAM_SELECT, 0); cpunum_set_info_int(0, CPUINFO_INT_MIPS3_FASTRAM_START, 0x00000000); - cpunum_set_info_int(0, CPUINFO_INT_MIPS3_FASTRAM_END, 0x003fffff); + cpunum_set_info_int(0, CPUINFO_INT_MIPS3_FASTRAM_END, 0x007fffff); cpunum_set_info_ptr(0, CPUINFO_PTR_MIPS3_FASTRAM_BASE, rdram); cpunum_set_info_int(0, CPUINFO_INT_MIPS3_FASTRAM_READONLY, 0); @@ -1227,6 +1445,8 @@ void n64_machine_reset(void) // CIC-NUS-6105 printf("CIC-NUS-6105 detected\n"); crc_seed = 0x91; + + first_rsp = 0; } else if (boot_checksum == U64(0x000000d6d5de4ba0)) { diff --git a/src/machine/namcoio.c b/src/machine/namcoio.c index 0748f048b..00153419e 100644 --- a/src/machine/namcoio.c +++ b/src/machine/namcoio.c @@ -27,7 +27,7 @@ Pole Position / PP II 51XX 53XX 52XX 54XX 16XX interface: --------------- Super Pac Man 56XX 56XX ---- ---- -Pac & Pal 56XX ???? ---- ---- +Pac & Pal 56XX 59XX ---- ---- Mappy 58XX 58XX ---- ---- Phozon 58XX 56XX ---- ---- The Tower of Druaga 58XX 56XX ---- ---- @@ -86,8 +86,7 @@ For the 52XX, see sound/namco52.c For the 54XX, see sound/namco54.c -Namco custom I/O chips 56XX and 58XX -(plus an unknown one used only by Pac & Pal - could be "57XX", I guess). +Namco custom I/O chips 56XX, 58XX, 59XX These chips work together with a 16XX, that interfaces them with the buffer RAM. Each chip uses 16 nibbles of memory; the 16XX supports up to 4 chips, @@ -976,10 +975,10 @@ static void namco_customio_56XX_run(int chip) -static void namco_customio_pacnpal_run(int chip) +static void namco_customio_59XX_run(int chip) { #if VERBOSE - logerror("execute PACNPAL %d mode %d\n",chip,IORAM_READ(8)); + logerror("execute 59XX %d mode %d\n",chip,IORAM_READ(8)); #endif switch (IORAM_READ(8)) @@ -1161,8 +1160,8 @@ static void namcoio_run(int param) case NAMCOIO_58XX: namco_customio_58XX_run(param); break; - case NAMCOIO_PACNPAL: - namco_customio_pacnpal_run(param); + case NAMCOIO_59XX: + namco_customio_59XX_run(param); break; } } diff --git a/src/machine/namcoio.h b/src/machine/namcoio.h index 6e86d504c..65f253885 100644 --- a/src/machine/namcoio.h +++ b/src/machine/namcoio.h @@ -12,7 +12,7 @@ enum NAMCOIO_54XX, NAMCOIO_56XX, NAMCOIO_58XX, - NAMCOIO_PACNPAL, + NAMCOIO_59XX, NAMCOIO_62XX }; diff --git a/src/machine/namcos1.c b/src/machine/namcos1.c index b9ce6d52c..8826eb8c3 100644 --- a/src/machine/namcos1.c +++ b/src/machine/namcos1.c @@ -527,7 +527,7 @@ static READ8_HANDLER( key_type3_r ) op = (offset & 0x70) >> 4; if (op == key_reg) return key_id; - if (op == key_rng) return mame_rand(); + if (op == key_rng) return mame_rand(Machine); if (op == key_swap4) return (key[key_swap4_arg] << 4) | (key[key_swap4_arg] >> 4); if (op == key_bottom4) return (offset << 4) | (key[key_swap4_arg] & 0x0f); if (op == key_top4) return (offset << 4) | (key[key_swap4_arg] >> 4); diff --git a/src/machine/namcos2.c b/src/machine/namcos2.c index 8dc64044c..4ec020aad 100644 --- a/src/machine/namcos2.c +++ b/src/machine/namcos2.c @@ -321,7 +321,7 @@ READ16_HANDLER( namcos2_68k_key_r ) // case 3: return 0x142; case 4: return 0x142; // case 3: popmessage("blah %08x",activecpu_get_pc()); - default: return mame_rand(); + default: return mame_rand(Machine); } break; @@ -378,7 +378,7 @@ READ16_HANDLER( namcos2_68k_key_r ) - return mame_rand()&0xffff; + return mame_rand(Machine)&0xffff; } WRITE16_HANDLER( namcos2_68k_key_w ) diff --git a/src/machine/neocrypt.c b/src/machine/neocrypt.c index ed2a76042..3630fd11b 100644 --- a/src/machine/neocrypt.c +++ b/src/machine/neocrypt.c @@ -669,8 +669,12 @@ void svcpcb_gfx_decrypt( void ) } for( i = 0; i < rom_size; i += 4 ) { - UINT32 *rom32 = (UINT32*)&rom[ i ]; - *rom32 = BITSWAP32( *rom32, 0x09, 0x0d, 0x13, 0x00, 0x17, 0x0f, 0x03, 0x05, 0x04, 0x0c, 0x11, 0x1e, 0x12, 0x15, 0x0b, 0x06, 0x1b, 0x0a, 0x1a, 0x1c, 0x14, 0x02, 0x0e, 0x1d, 0x18, 0x08, 0x01, 0x10, 0x19, 0x1f, 0x07, 0x16 ); + UINT32 rom32 = rom[i] | rom[i+1]<<8 | rom[i+2]<<16 | rom[i+3]<<24; + rom32 = BITSWAP32( rom32, 0x09, 0x0d, 0x13, 0x00, 0x17, 0x0f, 0x03, 0x05, 0x04, 0x0c, 0x11, 0x1e, 0x12, 0x15, 0x0b, 0x06, 0x1b, 0x0a, 0x1a, 0x1c, 0x14, 0x02, 0x0e, 0x1d, 0x18, 0x08, 0x01, 0x10, 0x19, 0x1f, 0x07, 0x16 ); + rom[i] = rom32&0xff; + rom[i+1] = (rom32>>8)&0xff; + rom[i+2] = (rom32>>16)&0xff; + rom[i+3] = (rom32>>24)&0xff; } memcpy( buf, rom, rom_size ); for( i = 0; i < rom_size / 4; i++ ) @@ -1028,16 +1032,20 @@ void mslug5_decrypt_68k(void) for( i = 0; i < 0x100000; i++ ) { - rom[ i ] ^= xor1[ (i % 0x20) ]; + rom[ i ] ^= xor1[ (BYTE_XOR_LE(i) % 0x20) ]; } for( i = 0x100000; i < 0x800000; i++ ) { - rom[ i ] ^= xor2[ (i % 0x20) ]; + rom[ i ] ^= xor2[ (BYTE_XOR_LE(i) % 0x20) ]; } + for( i = 0x100000; i < 0x0800000; i += 4 ) { - UINT16 *rom16 = (UINT16*)&rom[ i + 1 ]; - *rom16 = BITSWAP16( *rom16, 15, 14, 13, 12, 10, 11, 8, 9, 6, 7, 4, 5, 3, 2, 1, 0 ); + UINT16 rom16; + rom16 = rom[BYTE_XOR_LE(i+1)] | rom[BYTE_XOR_LE(i+2)]<<8; + rom16 = BITSWAP16( rom16, 15, 14, 13, 12, 10, 11, 8, 9, 6, 7, 4, 5, 3, 2, 1, 0 ); + rom[BYTE_XOR_LE(i+1)] = rom16&0xff; + rom[BYTE_XOR_LE(i+2)] = rom16>>8; } memcpy( buf, rom, rom_size ); for( i = 0; i < 0x0100000 / 0x10000; i++ ) @@ -1068,16 +1076,20 @@ void svcchaos_px_decrypt(void) for( i = 0; i < 0x100000; i++ ) { - rom[ i ] ^= xor1[ (i % 0x20) ]; + rom[ i ] ^= xor1[ (BYTE_XOR_LE(i) % 0x20) ]; } for( i = 0x100000; i < 0x800000; i++ ) { - rom[ i ] ^= xor2[ (i % 0x20) ]; + rom[ i ] ^= xor2[ (BYTE_XOR_LE(i) % 0x20) ]; } - for( i = 0x100000; i < 0x800000; i += 4 ) + + for( i = 0x100000; i < 0x0800000; i += 4 ) { - UINT16 *rom16 = (UINT16*)&rom[ i + 1 ]; - *rom16 = BITSWAP16( *rom16, 15, 14, 13, 12, 10, 11, 8, 9, 6, 7, 4, 5, 3, 2, 1, 0 ); + UINT16 rom16; + rom16 = rom[BYTE_XOR_LE(i+1)] | rom[BYTE_XOR_LE(i+2)]<<8; + rom16 = BITSWAP16( rom16, 15, 14, 13, 12, 10, 11, 8, 9, 6, 7, 4, 5, 3, 2, 1, 0 ); + rom[BYTE_XOR_LE(i+1)] = rom16&0xff; + rom[BYTE_XOR_LE(i+2)] = rom16>>8; } memcpy( buf, rom, rom_size ); for( i = 0; i < 0x0100000 / 0x10000; i++ ) @@ -1139,16 +1151,19 @@ void kf2k3pcb_decrypt_68k( void ) for (i = 0; i < 0x100000; i++) { - rom[ 0x800000 + i ] ^= rom[ 0x100002 | i ]; + rom[ 0x800000 + i ] ^= rom[ 0x100002 | BYTE_XOR_LE(i) ]; } for( i = 0x100000; i < 0x800000; i++ ) { - rom[ i ] ^= xor2[ (i % 0x20) ]; + rom[ i ] ^= xor2[ (BYTE_XOR_LE(i) % 0x20) ]; } for( i = 0x100000; i < 0x800000; i += 4 ) { - UINT16 *rom16 = (UINT16*)&rom[ i + 1 ]; - *rom16 = BITSWAP16( *rom16, 15, 14, 13, 12, 4, 5, 6, 7, 8, 9, 10, 11, 3, 2, 1, 0 ); + UINT16 rom16; + rom16 = rom[BYTE_XOR_LE(i+1)] | rom[BYTE_XOR_LE(i+2)]<<8; + rom16 = BITSWAP16( rom16, 15, 14, 13, 12, 4, 5, 6, 7, 8, 9, 10, 11, 3, 2, 1, 0 ); + rom[BYTE_XOR_LE(i+1)] = rom16&0xff; + rom[BYTE_XOR_LE(i+2)] = rom16>>8; } for( i = 0; i < 0x0100000 / 0x10000; i++ ) { @@ -1180,20 +1195,23 @@ void kof2003_decrypt_68k( void ) for (i = 0; i < 0x100000; i++) { - rom[ 0x800000 + i ] ^= rom[ 0x100002 | i ]; + rom[ 0x800000 + i ] ^= rom[ 0x100002 | BYTE_XOR_LE(i) ]; } for( i = 0; i < 0x100000; i++) { - rom[ i ] ^= xor1[ (i % 0x20) ]; + rom[ i ] ^= xor1[ (BYTE_XOR_LE(i) % 0x20) ]; } for( i = 0x100000; i < 0x800000; i++) { - rom[ i ] ^= xor2[ (i % 0x20) ]; + rom[ i ] ^= xor2[ (BYTE_XOR_LE(i) % 0x20) ]; } for( i = 0x100000; i < 0x800000; i += 4) { - UINT16 *rom16 = (UINT16*)&rom[i + 1]; - *rom16 = BITSWAP16( *rom16, 15, 14, 13, 12, 5, 4, 7, 6, 9, 8, 11, 10, 3, 2, 1, 0 ); + UINT16 rom16; + rom16 = rom[BYTE_XOR_LE(i+1)] | rom[BYTE_XOR_LE(i+2)]<<8; + rom16 = BITSWAP16( rom16, 15, 14, 13, 12, 5, 4, 7, 6, 9, 8, 11, 10, 3, 2, 1, 0 ); + rom[BYTE_XOR_LE(i+1)] = rom16&0xff; + rom[BYTE_XOR_LE(i+2)] = rom16>>8; } for( i = 0; i < 0x0100000 / 0x10000; i++ ) { @@ -1238,12 +1256,18 @@ void kof2003biosdecode(void) for (a=0;a<0x80000/2;a++) { //data xor + #ifdef LSB_FIRST if (src[a] & 0x0004) src[a] ^= 0x0001; if (src[a] & 0x0010) src[a] ^= 0x0002; if (src[a] & 0x0020) src[a] ^= 0x0008; + #else + if (src[a] & 0x0400) src[a] ^= 0x0100; + if (src[a] & 0x1000) src[a] ^= 0x0200; + if (src[a] & 0x2000) src[a] ^= 0x0800; + #endif //address xor addr = a & ~0xff; - addr |= address[a & 0x7f]; + addr |= address[BYTE_XOR_LE(a & 0x7f)]; if ( a & 0x00008) addr ^= 0x0008; if ( a & 0x00080) addr ^= 0x0080; if ( a & 0x00200) addr ^= 0x0100; diff --git a/src/machine/neoprot.c b/src/machine/neoprot.c index d410ed6f5..3f2bcabba 100644 --- a/src/machine/neoprot.c +++ b/src/machine/neoprot.c @@ -451,12 +451,12 @@ static unsigned short CartRAM[0x1000]; void pvc_w8(unsigned int offset, unsigned char data) { - *(((unsigned char*)CartRAM)+offset)=data; + *(((unsigned char*)CartRAM)+BYTE_XOR_LE(offset))=data; } unsigned char pvc_r8(unsigned int offset) { - return *(((unsigned char*)CartRAM)+offset); + return *(((unsigned char*)CartRAM)+BYTE_XOR_LE(offset)); } void pvc_prot1( void ) @@ -486,9 +486,9 @@ void pvc_write_bankswitch( void ) { UINT32 bankaddress; bankaddress = ((CartRAM[0xff8]>>8)|(CartRAM[0xff9]<<8)); - *(((unsigned char *)CartRAM) + 0x1ff0) = 0xA0; - *(((unsigned char *)CartRAM) + 0x1ff1) &= 0xFE; - *(((unsigned char *)CartRAM) + 0x1ff3) &= 0x7F; + *(((unsigned char *)CartRAM) + BYTE_XOR_LE(0x1ff0)) = 0xA0; + *(((unsigned char *)CartRAM) + BYTE_XOR_LE(0x1ff1)) &= 0xFE; + *(((unsigned char *)CartRAM) + BYTE_XOR_LE(0x1ff3)) &= 0x7F; neogeo_set_cpu1_second_bank(bankaddress+0x100000); } diff --git a/src/machine/nitedrvr.c b/src/machine/nitedrvr.c index da50a79d1..6ca4ab493 100644 --- a/src/machine/nitedrvr.c +++ b/src/machine/nitedrvr.c @@ -240,8 +240,8 @@ WRITE8_HANDLER( nitedrvr_out1_w ) nitedrvr_crash_data_en = 1; nitedrvr_crash_data = 0x0f; /* Invert video */ - palette_set_color(1,0x00,0x00,0x00); /* BLACK */ - palette_set_color(0,0xff,0xff,0xff); /* WHITE */ + palette_set_color(Machine,1,0x00,0x00,0x00); /* BLACK */ + palette_set_color(Machine,0,0xff,0xff,0xff); /* WHITE */ } discrete_sound_w(NITEDRVR_BANG_DATA, nitedrvr_crash_data_en ? nitedrvr_crash_data : 0); // Crash Volume } @@ -257,14 +257,14 @@ void nitedrvr_crash_toggle(int dummy) if (nitedrvr_crash_data & 0x01) { /* Invert video */ - palette_set_color(1,0x00,0x00,0x00); /* BLACK */ - palette_set_color(0,0xff,0xff,0xff); /* WHITE */ + palette_set_color(Machine,1,0x00,0x00,0x00); /* BLACK */ + palette_set_color(Machine,0,0xff,0xff,0xff); /* WHITE */ } else { /* Normal video */ - palette_set_color(0,0x00,0x00,0x00); /* BLACK */ - palette_set_color(1,0xff,0xff,0xff); /* WHITE */ + palette_set_color(Machine,0,0x00,0x00,0x00); /* BLACK */ + palette_set_color(Machine,1,0xff,0xff,0xff); /* WHITE */ } } } diff --git a/src/machine/pcshare.c b/src/machine/pcshare.c index 3b9ad367e..66b5f1f50 100644 --- a/src/machine/pcshare.c +++ b/src/machine/pcshare.c @@ -20,11 +20,9 @@ ***************************************************************************/ -#include #include "driver.h" #include "memconv.h" #include "machine/8255ppi.h" -#include "vidhrdw/generic.h" #include "machine/pic8259.h" #include "machine/pit8253.h" diff --git a/src/machine/playch10.c b/src/machine/playch10.c index 0f4482582..dd1747103 100644 --- a/src/machine/playch10.c +++ b/src/machine/playch10.c @@ -1,5 +1,5 @@ #include "driver.h" -#include "vidhrdw/ppu2c03b.h" +#include "vidhrdw/ppu2c0x.h" #include "machine/rp5h01.h" /* Globals */ @@ -48,9 +48,9 @@ MACHINE_RESET( pc10 ) RP5H01_enable_w( 0, 1 ); /* reset the ppu */ - ppu2c03b_reset( 0, /* cpu_getscanlineperiod() * */ 1 ); + ppu2c0x_reset( 0, /* cpu_getscanlineperiod() * */ 1 ); - ppu2c03b_set_mirroring( 0, mirroring ); + ppu2c0x_set_mirroring( 0, mirroring ); } /************************************* @@ -112,7 +112,7 @@ WRITE8_HANDLER( pc10_GAMESTOP_w ) WRITE8_HANDLER( pc10_PPURES_w ) { if ( data & 1 ) - ppu2c03b_reset( 0, /* cpu_getscanlineperiod() * */ 1 ); + ppu2c0x_reset( 0, /* cpu_getscanlineperiod() * */ 1 ); } READ8_HANDLER( pc10_detectclr_r ) @@ -227,10 +227,10 @@ READ8_HANDLER( pc10_in1_r ) ret |= 0x08; /* get the pixel at the gun position */ - pix = ppu2c03b_get_pixel( 0, x, y ); + pix = ppu2c0x_get_pixel( 0, x, y ); /* get the color base from the ppu */ - color_base = ppu2c03b_get_colorbase( 0 ); + color_base = ppu2c0x_get_colorbase( 0 ); /* look at the screen and see if the cursor is over a bright pixel */ if ( ( pix == pens[color_base+0x20] ) || ( pix == pens[color_base+0x30] ) || @@ -292,7 +292,7 @@ DRIVER_INIT( playch10 ) DRIVER_INIT( pc_gun ) { /* common init */ - init_playch10(); + init_playch10(machine); /* set the control type */ pc10_gun_controller = 1; @@ -304,7 +304,7 @@ DRIVER_INIT( pc_gun ) DRIVER_INIT( pc_hrz ) { /* common init */ - init_playch10(); + init_playch10(machine); /* setup mirroring */ mirroring = PPU_MIRROR_HORZ; @@ -381,17 +381,17 @@ static WRITE8_HANDLER( mmc1_rom_switch_w ) } /* apply mirroring */ - ppu2c03b_set_mirroring( 0, _mirroring ); + ppu2c0x_set_mirroring( 0, _mirroring ); } break; case 1: /* video rom banking - bank 0 - 4k or 8k */ - ppu2c03b_set_videorom_bank( 0, 0, ( vrom4k ) ? 4 : 8, ( mmc1_shiftreg & 0x1f ), 256 ); + ppu2c0x_set_videorom_bank( 0, 0, ( vrom4k ) ? 4 : 8, ( mmc1_shiftreg & 0x1f ), 256 ); break; case 2: /* video rom banking - bank 1 - 4k only */ if ( vrom4k ) - ppu2c03b_set_videorom_bank( 0, 4, 4, ( mmc1_shiftreg & 0x1f ), 256 ); + ppu2c0x_set_videorom_bank( 0, 4, 4, ( mmc1_shiftreg & 0x1f ), 256 ); break; case 3: /* program banking */ @@ -429,7 +429,7 @@ static WRITE8_HANDLER( mmc1_rom_switch_w ) static WRITE8_HANDLER( aboard_vrom_switch_w ) { - ppu2c03b_set_videorom_bank( 0, 0, 8, ( data & 3 ), 512 ); + ppu2c0x_set_videorom_bank( 0, 0, 8, ( data & 3 ), 512 ); } DRIVER_INIT( pcaboard ) @@ -438,7 +438,7 @@ DRIVER_INIT( pcaboard ) memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0x8fff, 0, 0, aboard_vrom_switch_w ); /* common init */ - init_playch10(); + init_playch10(machine); /* set the mirroring here */ mirroring = PPU_MIRROR_VERT; @@ -465,7 +465,7 @@ DRIVER_INIT( pcbboard ) memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, bboard_rom_switch_w ); /* common init */ - init_playch10(); + init_playch10(machine); /* set the mirroring here */ mirroring = PPU_MIRROR_VERT; @@ -477,7 +477,7 @@ DRIVER_INIT( pcbboard ) static WRITE8_HANDLER( cboard_vrom_switch_w ) { - ppu2c03b_set_videorom_bank( 0, 0, 8, ( ( data >> 1 ) & 1 ), 512 ); + ppu2c0x_set_videorom_bank( 0, 0, 8, ( ( data >> 1 ) & 1 ), 512 ); } DRIVER_INIT( pccboard ) @@ -486,7 +486,7 @@ DRIVER_INIT( pccboard ) memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x6000, 0, 0, cboard_vrom_switch_w ); /* common init */ - init_playch10(); + init_playch10(machine); } /**********************************************************************************/ @@ -505,7 +505,7 @@ DRIVER_INIT( pcdboard ) memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, mmc1_rom_switch_w ); /* common init */ - init_playch10(); + init_playch10(machine); } /* D Board games with extra ram (Metroid) */ @@ -517,7 +517,7 @@ DRIVER_INIT( pcdboard_2 ) memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MWA8_RAM ); /* common init */ - init_pcdboard(); + init_pcdboard(machine); } /**********************************************************************************/ @@ -530,22 +530,22 @@ static void mapper9_latch( offs_t offset ) if( (offset & 0x1ff0) == 0x0fd0 && MMC2_bank_latch[0] != 0xfd ) { MMC2_bank_latch[0] = 0xfd; - ppu2c03b_set_videorom_bank( 0, 0, 4, MMC2_bank[0], 256 ); + ppu2c0x_set_videorom_bank( 0, 0, 4, MMC2_bank[0], 256 ); } else if( (offset & 0x1ff0) == 0x0fe0 && MMC2_bank_latch[0] != 0xfe ) { MMC2_bank_latch[0] = 0xfe; - ppu2c03b_set_videorom_bank( 0, 0, 4, MMC2_bank[1], 256 ); + ppu2c0x_set_videorom_bank( 0, 0, 4, MMC2_bank[1], 256 ); } else if( (offset & 0x1ff0) == 0x1fd0 && MMC2_bank_latch[1] != 0xfd ) { MMC2_bank_latch[1] = 0xfd; - ppu2c03b_set_videorom_bank( 0, 4, 4, MMC2_bank[2], 256 ); + ppu2c0x_set_videorom_bank( 0, 4, 4, MMC2_bank[2], 256 ); } else if( (offset & 0x1ff0) == 0x1fe0 && MMC2_bank_latch[1] != 0xfe ) { MMC2_bank_latch[1] = 0xfe; - ppu2c03b_set_videorom_bank( 0, 4, 4, MMC2_bank[3], 256 ); + ppu2c0x_set_videorom_bank( 0, 4, 4, MMC2_bank[3], 256 ); } } @@ -564,29 +564,29 @@ static WRITE8_HANDLER( eboard_rom_switch_w ) case 0x3000: /* gfx bank 0 - 4k */ MMC2_bank[0] = data; if( MMC2_bank_latch[0] == 0xfd ) - ppu2c03b_set_videorom_bank( 0, 0, 4, data, 256 ); + ppu2c0x_set_videorom_bank( 0, 0, 4, data, 256 ); break; case 0x4000: /* gfx bank 0 - 4k */ MMC2_bank[1] = data; if( MMC2_bank_latch[0] == 0xfe ) - ppu2c03b_set_videorom_bank( 0, 0, 4, data, 256 ); + ppu2c0x_set_videorom_bank( 0, 0, 4, data, 256 ); break; case 0x5000: /* gfx bank 1 - 4k */ MMC2_bank[2] = data; if( MMC2_bank_latch[1] == 0xfd ) - ppu2c03b_set_videorom_bank( 0, 4, 4, data, 256 ); + ppu2c0x_set_videorom_bank( 0, 4, 4, data, 256 ); break; case 0x6000: /* gfx bank 1 - 4k */ MMC2_bank[3] = data; if( MMC2_bank_latch[1] == 0xfe ) - ppu2c03b_set_videorom_bank( 0, 4, 4, data, 256 ); + ppu2c0x_set_videorom_bank( 0, 4, 4, data, 256 ); break; case 0x7000: /* mirroring */ - ppu2c03b_set_mirroring( 0, data ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT ); + ppu2c0x_set_mirroring( 0, data ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT ); break; } @@ -609,7 +609,7 @@ DRIVER_INIT( pceboard ) memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x6fff, 0, 0, MWA8_RAM ); /* common init */ - init_playch10(); + init_playch10(machine); } /**********************************************************************************/ @@ -628,7 +628,7 @@ DRIVER_INIT( pcfboard ) memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, mmc1_rom_switch_w ); /* common init */ - init_playch10(); + init_playch10(machine); } /* F Board games with extra ram (Baseball Stars) */ @@ -640,7 +640,7 @@ DRIVER_INIT( pcfboard_2 ) memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x6fff, 0, 0, MWA8_RAM ); /* common init */ - init_pcfboard(); + init_pcfboard(machine); } /**********************************************************************************/ @@ -717,7 +717,7 @@ static WRITE8_HANDLER( gboard_rom_switch_w ) case 1: /* char banking */ data &= 0xfe; page ^= ( cmd << 1 ); - ppu2c03b_set_videorom_bank( 0, page, 2, data, 64 ); + ppu2c0x_set_videorom_bank( 0, page, 2, data, 64 ); break; case 2: /* char banking */ @@ -725,7 +725,7 @@ static WRITE8_HANDLER( gboard_rom_switch_w ) case 4: /* char banking */ case 5: /* char banking */ page ^= cmd + 2; - ppu2c03b_set_videorom_bank( 0, page, 1, data, 64 ); + ppu2c0x_set_videorom_bank( 0, page, 1, data, 64 ); break; case 6: /* program banking */ @@ -766,9 +766,9 @@ static WRITE8_HANDLER( gboard_rom_switch_w ) if( !gboard_4screen ) { if ( data & 0x40 ) - ppu2c03b_set_mirroring( 0, PPU_MIRROR_HIGH ); + ppu2c0x_set_mirroring( 0, PPU_MIRROR_HIGH ); else - ppu2c03b_set_mirroring( 0, ( data & 1 ) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT ); + ppu2c0x_set_mirroring( 0, ( data & 1 ) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT ); } break; @@ -785,11 +785,11 @@ static WRITE8_HANDLER( gboard_rom_switch_w ) break; case 0x6000: /* disable irqs */ - ppu2c03b_set_scanline_callback( 0, 0 ); + ppu2c0x_set_scanline_callback( 0, 0 ); break; case 0x6001: /* enable irqs */ - ppu2c03b_set_scanline_callback( 0, gboard_scanline_cb ); + ppu2c0x_set_scanline_callback( 0, gboard_scanline_cb ); break; } } @@ -815,13 +815,13 @@ DRIVER_INIT( pcgboard ) gboard_4screen = 0; /* common init */ - init_playch10(); + init_playch10(machine); } DRIVER_INIT( pcgboard_type2 ) { /* common init */ - init_pcgboard(); + init_pcgboard(machine); /* enable 4 screen mirror */ gboard_4screen = 1; @@ -836,9 +836,9 @@ static WRITE8_HANDLER( iboard_rom_switch_w ) int bank = data & 7; if ( data & 0x10 ) - ppu2c03b_set_mirroring( 0, PPU_MIRROR_HIGH ); + ppu2c0x_set_mirroring( 0, PPU_MIRROR_HIGH ); else - ppu2c03b_set_mirroring( 0, PPU_MIRROR_LOW ); + ppu2c0x_set_mirroring( 0, PPU_MIRROR_LOW ); memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[bank * 0x8000 + 0x10000], 0x8000 ); } @@ -853,7 +853,7 @@ DRIVER_INIT( pciboard ) memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, iboard_rom_switch_w ); /* common init */ - init_playch10(); + init_playch10(machine); } /**********************************************************************************/ @@ -878,7 +878,7 @@ DRIVER_INIT( pchboard ) gboard_scanline_latch = 0; /* common init */ - init_playch10(); + init_playch10(machine); } /**********************************************************************************/ @@ -901,5 +901,5 @@ DRIVER_INIT( pckboard ) memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, mmc1_rom_switch_w ); /* common init */ - init_playch10(); + init_playch10(machine); } diff --git a/src/machine/scramble.c b/src/machine/scramble.c index 20b1aeb99..b1024e476 100644 --- a/src/machine/scramble.c +++ b/src/machine/scramble.c @@ -111,7 +111,7 @@ MACHINE_RESET( devilfsg ) MACHINE_RESET( scramble ) { - machine_reset_galaxian(); + machine_reset_galaxian(machine); if (cpu_gettotalcpu() > 1) { @@ -121,7 +121,7 @@ MACHINE_RESET( scramble ) MACHINE_RESET( sfx ) { - machine_reset_scramble(); + machine_reset_scramble(machine); sfx_sh_init(); } @@ -131,7 +131,7 @@ MACHINE_RESET( explorer ) UINT8 *RAM = memory_region(REGION_CPU1); RAM[0x47ff] = 0; /* If not set, it doesn't reset after the 1st time */ - machine_reset_galaxian(); + machine_reset_galaxian(machine); } WRITE8_HANDLER( galaxian_coin_lockout_w ) @@ -753,7 +753,7 @@ DRIVER_INIT( mooncrst ) for (i = 0;i < memory_region_length(REGION_CPU1);i++) rom[i] = decode_mooncrst(rom[i],i); - init_mooncrsu(); + init_mooncrsu(machine); } DRIVER_INIT( mooncrgx ) @@ -840,7 +840,7 @@ Pin layout is such that links can replace the PAL if encryption is not used. DRIVER_INIT( gteikob2 ) { - init_pisces(); + init_pisces(machine); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x7006, 0x7006, 0, 0, gteikob2_flip_screen_x_w); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x7007, 0x7007, 0, 0, gteikob2_flip_screen_y_w); @@ -848,7 +848,7 @@ DRIVER_INIT( gteikob2 ) DRIVER_INIT( azurian ) { - init_pisces(); + init_pisces(machine); memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x6800, 0x6800, 0, 0, azurian_IN1_r); memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x7000, 0x7000, 0, 0, azurian_IN2_r); @@ -896,21 +896,21 @@ DRIVER_INIT( scramble_ppi ) DRIVER_INIT( scobra ) { - init_scramble_ppi(); + init_scramble_ppi(machine); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xa803, 0xa803, 0, 0, scramble_background_enable_w); } DRIVER_INIT( atlantis ) { - init_scramble_ppi(); + init_scramble_ppi(machine); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x6803, 0x6803, 0, 0, scramble_background_enable_w); } DRIVER_INIT( scramble ) { - init_atlantis(); + init_atlantis(machine); ppi8255_set_portCread (1, scramble_protection_r); ppi8255_set_portCwrite(1, scramble_protection_w); @@ -918,7 +918,7 @@ DRIVER_INIT( scramble ) DRIVER_INIT( scrambls ) { - init_atlantis(); + init_atlantis(machine); ppi8255_set_portCread(0, scrambls_input_port_2_r); ppi8255_set_portCread(1, scrambls_protection_r); @@ -927,14 +927,14 @@ DRIVER_INIT( scrambls ) DRIVER_INIT( theend ) { - init_scramble_ppi(); + init_scramble_ppi(machine); ppi8255_set_portCwrite(0, theend_coin_counter_w); } DRIVER_INIT( stratgyx ) { - init_scramble_ppi(); + init_scramble_ppi(machine); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xb000, 0xb000, 0, 0, scramble_background_green_w); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xb002, 0xb002, 0, 0, scramble_background_blue_w); @@ -946,14 +946,14 @@ DRIVER_INIT( stratgyx ) DRIVER_INIT( tazmani2 ) { - init_scramble_ppi(); + init_scramble_ppi(machine); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xb002, 0xb002, 0, 0, scramble_background_enable_w); } DRIVER_INIT( amidar ) { - init_scramble_ppi(); + init_scramble_ppi(machine); /* Amidar has a the DIP switches connected to port C of the 2nd 8255 */ ppi8255_set_portCread(1, input_port_3_r); @@ -961,7 +961,7 @@ DRIVER_INIT( amidar ) DRIVER_INIT( ckongs ) { - init_scramble_ppi(); + init_scramble_ppi(machine); ppi8255_set_portBread(0, ckongs_input_port_1_r); ppi8255_set_portCread(0, ckongs_input_port_2_r); @@ -969,7 +969,7 @@ DRIVER_INIT( ckongs ) DRIVER_INIT( mariner ) { - init_scramble_ppi(); + init_scramble_ppi(machine); /* extra ROM */ memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x5800, 0x67ff, 0, 0, MRA8_BANK1); @@ -989,7 +989,7 @@ DRIVER_INIT( frogger ) UINT8 *ROM; - init_scramble_ppi(); + init_scramble_ppi(machine); /* the first ROM of the second CPU has data lines D0 and D1 swapped. Decode it. */ @@ -1009,7 +1009,7 @@ DRIVER_INIT( froggers ) UINT8 *ROM; - init_scramble_ppi(); + init_scramble_ppi(machine); /* the first ROM of the second CPU has data lines D0 and D1 swapped. Decode it. */ ROM = memory_region(REGION_CPU2); @@ -1023,7 +1023,7 @@ DRIVER_INIT( devilfsh ) UINT8 *RAM; - init_scramble_ppi(); + init_scramble_ppi(machine); /* Address lines are scrambled on the main CPU */ @@ -1052,7 +1052,7 @@ DRIVER_INIT( devilfsh ) DRIVER_INIT( mars ) { - init_devilfsh(); + init_devilfsh(machine); /* extra port */ ppi8255_set_portCread(1, input_port_3_r); @@ -1069,7 +1069,7 @@ DRIVER_INIT( cavelon ) { UINT8 *ROM = memory_region(REGION_CPU1); - init_scramble_ppi(); + init_scramble_ppi(machine); /* banked ROM */ memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x0000, 0x3fff, 0, 0, MRA8_BANK1); @@ -1088,7 +1088,7 @@ DRIVER_INIT( cavelon ) DRIVER_INIT( moonwar ) { - init_scramble_ppi(); + init_scramble_ppi(machine); /* special handler for the spinner */ ppi8255_set_portAread (0, moonwar_input_port_0_r); @@ -1099,7 +1099,7 @@ DRIVER_INIT( moonwar ) DRIVER_INIT( darkplnt ) { - init_scramble_ppi(); + init_scramble_ppi(machine); /* special handler for the spinner */ ppi8255_set_portBread(0, darkplnt_input_port_1_r); @@ -1140,21 +1140,21 @@ DRIVER_INIT( mimonkey ) ctr++; } - init_scramble_ppi(); + init_scramble_ppi(machine); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xa804, 0xa804, 0, 0, scramble_background_enable_w); } DRIVER_INIT( mimonsco ) { - init_scramble_ppi(); + init_scramble_ppi(machine); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0xa804, 0xa804, 0, 0, scramble_background_enable_w); } DRIVER_INIT( mimonscr ) { - init_scramble_ppi(); + init_scramble_ppi(machine); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x6804, 0x6804, 0, 0, scramble_background_enable_w); } @@ -1173,7 +1173,7 @@ DRIVER_INIT( anteater ) UINT8 *scratch; - init_scobra(); + init_scobra(machine); /* * Code To Decode Lost Tomb by Mirko Buffoni @@ -1212,7 +1212,7 @@ DRIVER_INIT( rescue ) UINT8 *scratch; - init_scobra(); + init_scobra(machine); /* * Code To Decode Lost Tomb by Mirko Buffoni @@ -1251,7 +1251,7 @@ DRIVER_INIT( minefld ) UINT8 *scratch; - init_scobra(); + init_scobra(machine); /* * Code To Decode Minefield by Mike Balfour and Nicola Salmoria @@ -1290,7 +1290,7 @@ DRIVER_INIT( losttomb ) UINT8 *scratch; - init_scramble(); + init_scramble(machine); /* * Code To Decode Lost Tomb by Mirko Buffoni @@ -1328,7 +1328,7 @@ DRIVER_INIT( superbon ) UINT8 *RAM; - init_scramble(); + init_scramble(machine); /* Deryption worked out by hand by Chris Hardy. */ @@ -1361,7 +1361,7 @@ DRIVER_INIT( hustler ) offs_t A; - init_scramble_ppi(); + init_scramble_ppi(machine); for (A = 0;A < 0x4000;A++) @@ -1403,7 +1403,7 @@ DRIVER_INIT( billiard ) offs_t A; - init_scramble_ppi(); + init_scramble_ppi(machine); for (A = 0;A < 0x4000;A++) @@ -1458,7 +1458,7 @@ memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x6002, 0x6002, 0, 0, ga DRIVER_INIT( mrkougar ) { - init_devilfsh(); + init_devilfsh(machine); /* no sound enabled bit */ ppi8255_set_portBwrite(1, mrkougar_sh_irqtrigger_w); @@ -1466,7 +1466,7 @@ DRIVER_INIT( mrkougar ) DRIVER_INIT( mrkougb ) { - init_scramble_ppi(); + init_scramble_ppi(machine); /* no sound enabled bit */ ppi8255_set_portBwrite(1, mrkougar_sh_irqtrigger_w); diff --git a/src/machine/slikshot.c b/src/machine/slikshot.c index d0139134c..98171f0e4 100644 --- a/src/machine/slikshot.c +++ b/src/machine/slikshot.c @@ -558,7 +558,7 @@ VIDEO_UPDATE( slikshot ) int temp, i; /* draw the normal video first */ - video_update_itech8_2page(screen, bitmap, cliprect); + video_update_itech8_2page(machine, screen, bitmap, cliprect); /* add the current X,Y positions to the list */ xbuffer[ybuffer_next % YBUFFER_COUNT] = readinputportbytag_safe("FAKEX", 0); diff --git a/src/machine/snes.c b/src/machine/snes.c index 172feae03..4db3fd4b9 100644 --- a/src/machine/snes.c +++ b/src/machine/snes.c @@ -1525,6 +1525,46 @@ DRIVER_INIT( snes ) snes_cart.sram = snes_cart.sram_max; } } + +DRIVER_INIT( snes_hirom ) +{ + int i; + UINT16 totalblocks, readblocks; + UINT8 *rom; + + rom = memory_region( REGION_USER3 ); + snes_ram = auto_malloc(0x1000000); + memset( snes_ram, 0, 0x1000000 ); + + snes_cart.mode = SNES_MODE_21; + snes_cart.sram_max = 0x40000; + + /* Find the number of blocks in this ROM */ + //totalblocks = ((mame_fsize(file) - offset) >> (snes_cart.mode == MODE_20 ? 15 : 16)); + totalblocks = (memory_region_length(REGION_USER3) / 0x10000) - 1; + + /* FIXME: Insert crc check here */ + + readblocks = 0; + { + i = 0; + while( i < 64 && readblocks <= totalblocks ) + { + memcpy( &snes_ram[0xc00000 + (i * 0x10000)], &rom[i * 0x10000], 0x10000); + i++; + readblocks++; + } + } + + /* Find the amount of sram */ + snes_cart.sram = snes_r_bank1(0x00ffd8); + if( snes_cart.sram > 0 ) + { + snes_cart.sram = ((1 << (snes_cart.sram + 3)) / 8); + if( snes_cart.sram > snes_cart.sram_max ) + snes_cart.sram = snes_cart.sram_max; + } +} #endif /* MESS */ void snes_hdma_init() diff --git a/src/machine/starwars.c b/src/machine/starwars.c index 80155f973..47a27b3cc 100644 --- a/src/machine/starwars.c +++ b/src/machine/starwars.c @@ -387,7 +387,7 @@ READ8_HANDLER( swmathbx_prng_r ) */ /* Use MAME's PRNG for now */ - return mame_rand(); + return mame_rand(Machine); } diff --git a/src/machine/stfight.c b/src/machine/stfight.c index 4a14062a0..8bd33d97b 100644 --- a/src/machine/stfight.c +++ b/src/machine/stfight.c @@ -68,7 +68,7 @@ DRIVER_INIT( empcity ) DRIVER_INIT( stfight ) { - init_empcity(); + init_empcity(machine); /* patch out a tight loop during startup - is the code waiting */ /* for NMI to wake it up? */ diff --git a/src/machine/toaplan1.c b/src/machine/toaplan1.c index c49a842de..5f334163d 100644 --- a/src/machine/toaplan1.c +++ b/src/machine/toaplan1.c @@ -307,13 +307,13 @@ void toaplan1_driver_savestate(void) MACHINE_RESET( zerozone ) /* Hack for ZeroWing and OutZone. See the video driver */ { - machine_reset_toaplan1(); + machine_reset_toaplan1(machine); toaplan1_unk_reset_port = 1; } MACHINE_RESET( demonwld ) { - machine_reset_toaplan1(); + machine_reset_toaplan1(machine); dsp_addr_w = 0; main_ram_seg = 0; dsp_execute = 0; @@ -330,7 +330,7 @@ void demonwld_driver_savestate(void) MACHINE_RESET( vimana ) { - machine_reset_toaplan1(); + machine_reset_toaplan1(machine); vimana_credits = 0; vimana_latch = 0; } diff --git a/src/machine/turbo.c b/src/machine/turbo.c deleted file mode 100644 index 42d8a1d6a..000000000 --- a/src/machine/turbo.c +++ /dev/null @@ -1,520 +0,0 @@ -/************************************************************************* - - Sega Z80-3D system - -*************************************************************************/ - -#include "driver.h" -#include "machine/8255ppi.h" -#include "turbo.h" -#include "sound/samples.h" - -/* globals */ -UINT8 turbo_opa, turbo_opb, turbo_opc; -UINT8 turbo_ipa, turbo_ipb, turbo_ipc; -UINT8 turbo_fbpla, turbo_fbcol; -UINT8 turbo_speed; - -UINT8 subroc3d_col, subroc3d_ply, subroc3d_chofs; - -UINT8 buckrog_fchg, buckrog_mov, buckrog_obch; - -/* local data */ -static UINT8 segment_address, segment_increment; -static UINT8 port_8279; - -static UINT8 buckrog_command; - -static UINT8 old_segment_data[32]; -static UINT8 new_segment_data[32]; - -static int segment_init; - - -/******************************************* - - Turbo 8255 PPI handling - -*******************************************/ -/* - chip index: - 0 = IC75 - CPU Board, Sheet 6, D7 - 1 = IC32 - CPU Board, Sheet 6, D6 - 2 = IC123 - CPU Board, Sheet 6, D4 - 3 = IC6 - CPU Board, Sheet 5, D7 -*/ - -static WRITE8_HANDLER( turbo_opa_w ) -{ - turbo_opa = data; /* signals 0PA0 to 0PA7 */ -} - - -static WRITE8_HANDLER( turbo_opb_w ) -{ - turbo_opb = data; /* signals 0PB0 to 0PB7 */ -} - - -static WRITE8_HANDLER( turbo_opc_w ) -{ - turbo_opc = data; /* signals 0PC0 to 0PC7 */ -} - - -static WRITE8_HANDLER( turbo_ipa_w ) -{ - turbo_ipa = data; /* signals 1PA0 to 1PA7 */ -} - - -static WRITE8_HANDLER( turbo_ipb_w ) -{ - turbo_ipb = data; /* signals 1PB0 to 1PB7 */ -} - - -static WRITE8_HANDLER( turbo_ipc_w ) -{ - turbo_ipc = data; /* signals 1PC0 to 1PC7 */ -} - - -static WRITE8_HANDLER( turbo_pla_col_w ) -{ - /* bit 0-3 = signals PLA0 to PLA3 */ - /* bit 4-6 = signals COL0 to COL2 */ - /* bit 7 = unused */ - turbo_fbpla = data & 0x0f; - turbo_fbcol = (data & 0x70) >> 4; -} - - -static ppi8255_interface turbo_8255_intf = -{ - 4, - { NULL, NULL, NULL, input_port_4_r }, - { NULL, NULL, NULL, input_port_2_r }, - { NULL, NULL, NULL, NULL }, - { turbo_opa_w, turbo_ipa_w, turbo_sound_A_w, NULL }, - { turbo_opb_w, turbo_ipb_w, turbo_sound_B_w, NULL }, - { turbo_opc_w, turbo_ipc_w, turbo_sound_C_w, turbo_pla_col_w } -}; - - - -/******************************************* - - Subroc3D 8255 PPI handling - -*******************************************/ - -static WRITE8_HANDLER( subroc3d_sprite_pri_w ) -{ - subroc3d_ply = data & 0x0f; -} - - -static WRITE8_HANDLER( subroc3d_coin_led_w ) -{ - coin_counter_w(0, data & 0x01); - coin_counter_w(1, data & 0x02); - set_led_status(0, data & 0x04); - subroc3d_chofs = ((data >> 4) & 1) * 3; -} - - -static WRITE8_HANDLER( subroc3d_palette_w ) -{ - subroc3d_col = data & 0x0f; -} - - -static ppi8255_interface subroc3d_8255_intf = -{ - 2, - { NULL, NULL }, - { NULL, NULL }, - { NULL, NULL }, - { subroc3d_sprite_pri_w, subroc3d_sound_A_w }, - { subroc3d_coin_led_w, subroc3d_sound_B_w }, - { subroc3d_palette_w, subroc3d_sound_C_w } -}; - - - -/******************************************* - - Buck Rogers 8255 PPI handling - -*******************************************/ - -static WRITE8_HANDLER( buckrog_cpu2_command_w ) -{ - buckrog_command = data; -} - - -static WRITE8_HANDLER( buckrog_back_palette_w ) -{ - buckrog_mov = data & 0x1f; -} - - -static WRITE8_HANDLER( buckrog_fore_palette_w ) -{ - /* OBF is connected to IRQ on the second CPU */ - cpunum_set_input_line(1, 0, (data & 0x80) ? CLEAR_LINE : ASSERT_LINE); - - buckrog_fchg = data & 0x07; -} - - -static WRITE8_HANDLER( buckrog_extra_w ) -{ - buckrog_obch = data & 0x07; - coin_counter_w(0, data & 0x10); - coin_counter_w(1, data & 0x20); - set_led_status(0, data & 0x40); - // NOUSE = data & 0x80 -> body sonic??? -} - - -static ppi8255_interface buckrog_8255_intf = -{ - 2, - { NULL, NULL }, - { NULL, NULL }, - { NULL, NULL }, - { buckrog_cpu2_command_w, buckrog_sound_A_w }, - { buckrog_back_palette_w, buckrog_sound_B_w }, - { buckrog_fore_palette_w, buckrog_extra_w } -}; - - - -/******************************************* - - Machine Init - -*******************************************/ - -MACHINE_RESET( turbo ) -{ - ppi8255_init(&turbo_8255_intf); - segment_address = segment_increment = 0; - segment_init = 1; - port_8279 = 1; -} - - -MACHINE_RESET( subroc3d ) -{ - ppi8255_init(&subroc3d_8255_intf); - segment_address = segment_increment = 0; - segment_init = 1; - sample_start(0, 0, 1); - sample_start(1, 1, 1); - sample_start(2, 2, 1); - sample_start(7, 8, 1); -} - - -MACHINE_RESET( buckrog ) -{ - ppi8255_init(&buckrog_8255_intf); - segment_address = segment_increment = 0; - segment_init = 1; - buckrog_command = 0x00; - port_8279 = 1; -} - - - -/******************************************* - - 8279 handling - IC84 - CPU Board, Sheet 5, C7 - -*******************************************/ - -READ8_HANDLER( turbo_8279_r ) -{ - if ((offset & 1) == 0) - return ~readinputport(1); /* DSW 1 - inverted! */ - else - { - logerror("read 0xfc%02x\n", offset); - return 0x10; - } -} - -WRITE8_HANDLER( turbo_8279_w ) -{ - switch (offset & 1) - { - case 0x00: - new_segment_data[segment_address * 2] = data & 15; - new_segment_data[segment_address * 2 + 1] = (data >> 4) & 15; - segment_address = (segment_address + segment_increment) & 15; - break; - - case 0x01: - switch (data & 0xe0) - { - case 0x80: - segment_address = data & 15; - segment_increment = 0; - break; - case 0x90: - segment_address = data & 15; - segment_increment = 1; - break; - case 0xc0: - memset(new_segment_data, 0, 32); - break; - } - break; - } -} - - -void turbo_update_segments(void) -{ - int i; - - for (i = 0; i < 32; i++) - { - int v_old = old_segment_data[i]; - int v_new = new_segment_data[i]; - - if (segment_init || v_old != v_new) - { - char buf_new[8]; - - sprintf(buf_new, "led%02d", i); - output_set_value(buf_new, (v_new >= 10) ? 10 : v_new); - } - } - - memcpy(old_segment_data, new_segment_data, sizeof old_segment_data); - - segment_init = 0; -} - - -/******************************************* - - Turbo misc handling - -*******************************************/ - -READ8_HANDLER( turbo_collision_r ) -{ - return readinputport(3) | (turbo_collision & 15); -} - - -WRITE8_HANDLER( turbo_collision_clear_w ) -{ - turbo_collision = 0; -} - - -WRITE8_HANDLER( turbo_coin_and_lamp_w ) -{ - switch (offset & 7) - { - case 0: - coin_counter_w(0, data & 1); - break; - case 1: - coin_counter_w(1, data & 1); - break; - case 3: - set_led_status(0, data & 1); - break; - } -} - - -void turbo_update_tachometer(void) -{ - output_set_value("speed", turbo_speed); -} - - -/******************************************* - - Turbo ROM decoding - -*******************************************/ - -void turbo_rom_decode(void) -{ -/* - * The table is arranged this way (second half is mirror image of first) - * - * 0 1 2 3 4 5 6 7 8 9 A B C D E F - * - * 0 00 00 00 00 01 01 01 01 02 02 02 02 03 03 03 03 - * 1 04 04 04 04 05 05 05 05 06 06 06 06 07 07 07 07 - * 2 08 08 08 08 09 09 09 09 0A 0A 0A 0A 0B 0B 0B 0B - * 3 0C 0C 0C 0C 0D 0D 0D 0D 0E 0E 0E 0E 0F 0F 0F 0F - * 4 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 13 - * 5 14 14 14 14 15 15 15 15 16 16 16 16 17 17 17 17 - * 6 18 18 18 18 19 19 19 19 1A 1A 1A 1A 1B 1B 1B 1B - * 7 1C 1C 1C 1C 1D 1D 1D 1D 1E 1E 1E 1E 1F 1F 1F 1F - * 8 1F 1F 1F 1F 1E 1E 1E 1E 1D 1D 1D 1D 1C 1C 1C 1C - * 9 1B 1B 1B 1B 1A 1A 1A 1A 19 19 19 19 18 18 18 18 - * A 17 17 17 17 16 16 16 16 15 15 15 15 14 14 14 14 - * B 13 13 13 13 12 12 12 12 11 11 11 11 10 10 10 10 - * C 0F 0F 0F 0F 0E 0E 0E 0E 0D 0D 0D 0D 0C 0C 0C 0C - * D 0B 0B 0B 0B 0A 0A 0A 0A 09 09 09 09 08 08 08 08 - * E 07 07 07 07 06 06 06 06 05 05 05 05 04 04 04 04 - * F 03 03 03 03 02 02 02 02 01 01 01 01 00 00 00 00 - * - */ - - static const UINT8 xortable[][32]= - { - /* Table 0 */ - /* 0x0000-0x3ff */ - /* 0x0800-0xbff */ - /* 0x4000-0x43ff */ - /* 0x4800-0x4bff */ - { 0x00,0x44,0x0c,0x48,0x00,0x44,0x0c,0x48, - 0xa0,0xe4,0xac,0xe8,0xa0,0xe4,0xac,0xe8, - 0x60,0x24,0x6c,0x28,0x60,0x24,0x6c,0x28, - 0xc0,0x84,0xcc,0x88,0xc0,0x84,0xcc,0x88 }, - - /* Table 1 */ - /* 0x0400-0x07ff */ - /* 0x0c00-0x0fff */ - /* 0x1400-0x17ff */ - /* 0x1c00-0x1fff */ - /* 0x2400-0x27ff */ - /* 0x2c00-0x2fff */ - /* 0x3400-0x37ff */ - /* 0x3c00-0x3fff */ - /* 0x4400-0x47ff */ - /* 0x4c00-0x4fff */ - /* 0x5400-0x57ff */ - /* 0x5c00-0x5fff */ - { 0x00,0x44,0x18,0x5c,0x14,0x50,0x0c,0x48, - 0x28,0x6c,0x30,0x74,0x3c,0x78,0x24,0x60, - 0x60,0x24,0x78,0x3c,0x74,0x30,0x6c,0x28, - 0x48,0x0c,0x50,0x14,0x5c,0x18,0x44,0x00 }, //0x00 --> 0x10 ? - - /* Table 2 */ - /* 0x1000-0x13ff */ - /* 0x1800-0x1bff */ - /* 0x5000-0x53ff */ - /* 0x5800-0x5bff */ - { 0x00,0x00,0x28,0x28,0x90,0x90,0xb8,0xb8, - 0x28,0x28,0x00,0x00,0xb8,0xb8,0x90,0x90, - 0x00,0x00,0x28,0x28,0x90,0x90,0xb8,0xb8, - 0x28,0x28,0x00,0x00,0xb8,0xb8,0x90,0x90 }, - - /* Table 3 */ - /* 0x2000-0x23ff */ - /* 0x2800-0x2bff */ - /* 0x3000-0x33ff */ - /* 0x3800-0x3bff */ - { 0x00,0x14,0x88,0x9c,0x30,0x24,0xb8,0xac, - 0x24,0x30,0xac,0xb8,0x14,0x00,0x9c,0x88, - 0x48,0x5c,0xc0,0xd4,0x78,0x6c,0xf0,0xe4, - 0x6c,0x78,0xe4,0xf0,0x5c,0x48,0xd4,0xc0 } - }; - - static const int findtable[]= - { - 0,1,0,1, /* 0x0000-0x0fff */ - 2,1,2,1, /* 0x1000-0x1fff */ - 3,1,3,1, /* 0x2000-0x2fff */ - 3,1,3,1, /* 0x3000-0x3fff */ - 0,1,0,1, /* 0x4000-0x4fff */ - 2,1,2,1 /* 0x5000-0x5fff */ - }; - - UINT8 *RAM = memory_region(REGION_CPU1); - int offs, i, j; - UINT8 src; - - for (offs = 0x0000; offs < 0x6000; offs++) - { - src = RAM[offs]; - i = findtable[offs >> 10]; - j = src >> 2; - if (src & 0x80) j ^= 0x3f; - RAM[offs] = src ^ xortable[i][j]; - } -} - - - -/******************************************* - - Subroc-3D misc handling - -*******************************************/ - -/******************************************* - - Buck Rogers misc handling - -*******************************************/ - -READ8_HANDLER( buckrog_cpu2_command_r ) -{ - /* assert ACK */ - ppi8255_set_portC(0, 0x00); - - return buckrog_command; -} - - -READ8_HANDLER( buckrog_port_2_r ) -{ - int inp1 = readinputport(2); - int inp2 = readinputport(3); - - return (((inp2 >> 6) & 1) << 7) | - (((inp2 >> 4) & 1) << 6) | - (((inp2 >> 3) & 1) << 5) | - (((inp2 >> 0) & 1) << 4) | - (((inp1 >> 6) & 1) << 3) | - (((inp1 >> 4) & 1) << 2) | - (((inp1 >> 3) & 1) << 1) | - (((inp1 >> 0) & 1) << 0); -} - - -READ8_HANDLER( buckrog_port_3_r ) -{ - int inp1 = readinputport(2); - int inp2 = readinputport(3); - - return (((inp2 >> 7) & 1) << 7) | - (((inp2 >> 5) & 1) << 6) | - (((inp2 >> 2) & 1) << 5) | - (((inp2 >> 1) & 1) << 4) | - (((inp1 >> 7) & 1) << 3) | - (((inp1 >> 5) & 1) << 2) | - (((inp1 >> 2) & 1) << 1) | - (((inp1 >> 1) & 1) << 0); -} - - -static void delayed_ppi8255_w(int param) -{ - ppi8255_0_w(param >> 8, param & 0xff); -} - - -WRITE8_HANDLER( buckrog_ppi8255_0_w ) -{ - /* the port C handshaking signals control the sub CPU IRQ, */ - /* so we have to sync whenever we access this PPI */ - timer_set(TIME_NOW, ((offset & 3) << 8) | (data & 0xff), delayed_ppi8255_w); -} diff --git a/src/machine/vacfdisp.c b/src/machine/vacfdisp.c index de17a8c66..4f25dbfa5 100644 --- a/src/machine/vacfdisp.c +++ b/src/machine/vacfdisp.c @@ -1,15 +1,22 @@ //////////////////////////////////////////////////////////////////////////// // // -// vacfdisp.c: Vacuum Fluorescence Display // -// display emulation for BFM machines, amongst others // +// vacfdisp.c: Vacuum Fluorescent Display and Controller emulation // // // // emulated displays: BFM BD1 vfd display, OKI MSC1937 // // // // 05-03-2004: Re-Animator // // // -// TODO: - BFM sys85 seems to use a slightly different vfd to OKI MSC1937 // +// Theory: VFD controllers have a built in character table, which converts// +// the displayable characters into on/off signals for the various segments// +// However, each controller has its own way of assigning the segments, // +// making standardisation a problem. // +// Currently, the model used by the OKIMSC1937 is considered as a standard// +// with the BD1 model converted to it at drawing time. // // // -// - Implement display flashing and brightness // +// TODO: - BFM sys85 seems to use a slightly different vfd to OKI MSC1937 // +// - Add 'skew' to display - characters usually slope 20 degrees // +// - Implement display flashing (need precise rate figures // +// - Make display better (convert to segment shapes like LED // // // // Any fixes for this driver should be forwarded to AGEMAME HQ // // (http://www.mameworld.net/agemame/) // @@ -19,11 +26,11 @@ #include "driver.h" #include "vacfdisp.h" - static struct { UINT8 type, // type of alpha display // VFDTYPE_BFMBD1 or VFDTYPE_MSC1937 + reversed, // Allows for the data being written from right to left, not left to right. changed, // flag <>0, if vfd contents are changed window_start, // display window start pos 0-15 @@ -45,10 +52,11 @@ static struct flash_rate, // flash rate 0-F flash_control; // flash control 0/1/2/3 - UINT8 string[18]; // text buffer - UINT16 segments[16]; // segments + UINT8 string[18]; // text buffer + UINT16 segments[16], // segments + outputs[16]; // standardised outputs - UINT8 count, // bit counter + UINT8 count, // bit counter data; // receive register } vfds[MAX_VFDS]; @@ -75,12 +83,12 @@ static const char BFM2ASCII[] = // static const char OKI1937ASCII[]= //0123456789ABCDEF0123456789ABC DEF01 23456789ABCDEF0123456789ABCDEF - "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ ?\"#$%%'()*+.-./0123456789&%<=>?"\ - "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ ?\"#$%%'()*+.-./0123456789&%<=>?"\ - "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ ?\"#$%%'()*+.-./0123456789&%<=>?"; + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ ?\"#$%%'()*+;-./0123456789&%<=>?"\ + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ ?\"#$%%'()*+;-./0123456789&%<=>?"\ + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_ ?\"#$%%'()*+;-./0123456789&%<=>?"; /* - 16 segment charset lookup table + BD1 14 segment charset lookup table 2 --------- |\ |3 /| @@ -96,7 +104,7 @@ static const char OKI1937ASCII[]= */ static unsigned short BFMcharset[]= -{ // FEDC BA98 7654 3210 +{ // FEDC BA98 7654 3210 0xA626, // 1010 0110 0010 0110 @. 0xE027, // 1110 0000 0010 0111 A. 0x462E, // 0100 0110 0010 1110 B. @@ -163,32 +171,123 @@ static unsigned short BFMcharset[]= 0x4406, // 0100 0100 0000 0110 ? }; +/* + MSC1937 16 segment charset lookup table + 0 1 + ---- ---- + |\ | /| + 7 | \F |8 /9| 2 + | \ | / | + -E-- --A- + | / | \ | + 6 | /D |C \B| 3 + |/ | \| + ---- ---- .11 + 5 4 ,10 + +In 14 segment mode, 0 represents the whole top line, +and 5 the bottom line, allowing both modes to share +a charset. +*/ + +static unsigned int OKIcharset[]= +{ // 11 10 FEDC BA98 7654 3210 + 0x0507F, // 0 0 0101 0000 0111 1111 @. + 0x044CF, // 0 0 0100 0100 1100 1111 A. + 0x0153F, // 0 0 0001 0101 0011 1111 B. + 0x000F3, // 0 0 0000 0000 1111 0011 C. + 0x0113F, // 0 0 0001 0001 0011 1111 D. + 0x040F3, // 0 0 0100 0000 1111 0011 E. + 0x040C3, // 0 0 0100 0000 1100 0011 F. + 0x004FB, // 0 0 0000 0100 1111 1011 G. + 0x044CC, // 0 0 0100 0100 1100 1100 H. + 0x01133, // 0 0 0001 0001 0011 0011 I. + 0x0007C, // 0 0 0000 0000 0111 1100 J. + 0x04AC0, // 0 0 0100 1010 1100 0000 K. + 0x000F0, // 0 0 0000 0000 1111 0000 L. + 0x082CC, // 0 0 1000 0010 1100 1100 M. + 0x088CC, // 0 0 1000 1000 1100 1100 N. + 0x000FF, // 0 0 0000 0000 1111 1111 O. + 0x044C7, // 0 0 0100 0100 1100 0111 P. + 0x008FF, // 0 0 0000 1000 1111 1111 Q. + 0x04CC7, // 0 0 0100 1100 1100 0111 R. + 0x044BB, // 0 0 0100 0100 1011 1011 S. + 0x01103, // 0 0 0001 0001 0000 0011 T. + 0x000FC, // 0 0 0000 0000 1111 1100 U. + 0x022C0, // 0 0 0010 0010 1100 0000 V. + 0x028CC, // 0 0 0010 1000 1100 1100 W. + 0x0AA00, // 0 0 1010 1010 0000 0000 X. + 0x09200, // 0 0 1001 0010 0000 0000 Y. + 0x02233, // 0 0 0010 0010 0011 0011 Z. + 0x000E1, // 0 0 0000 0000 1110 0001 [. + 0x08800, // 0 0 1000 1000 0000 0000 \. + 0x0001E, // 0 0 0000 0000 0001 1110 ]. + 0x02800, // 0 0 0010 1000 0000 0000 ^. + 0x00030, // 0 0 0000 0000 0011 0000 _. + 0x00000, // 0 0 0000 0000 0000 0000 dummy. + 0x08121, // 0 0 1000 0001 0010 0001 Unknown symbol. + 0x00180, // 0 0 0000 0001 1000 0000 ". + 0x0553C, // 0 0 0101 0101 0011 1100 #. + 0x055BB, // 0 0 0101 0101 1011 1011 $. + 0x07799, // 0 0 0111 0111 1001 1001 %. + 0x0C979, // 0 0 1100 1001 0111 1001 &. + 0x00200, // 0 0 0000 0010 0000 0000 '. + 0x00A00, // 0 0 0000 1010 0000 0000 (. + 0x0A050, // 0 0 1010 0000 0000 0000 ). + 0x0FF00, // 0 0 1111 1111 0000 0000 *. + 0x05500, // 0 0 0101 0101 0000 0000 +. + 0x30000, // 1 1 0000 0000 0000 0000 ;. + 0x04400, // 0 0 0100 0100 0000 0000 --. + 0x20000, // 1 0 0000 0000 0000 0000 . . + 0x02200, // 0 0 0010 0010 0000 0000 /. + 0x022FF, // 0 0 0010 0010 1111 1111 0. + 0x01100, // 0 0 0001 0001 0000 0000 1. + 0x04477, // 0 0 0100 0100 0111 0111 2. + 0x0443F, // 0 0 0100 0100 0011 1111 3. + 0x0448C, // 0 0 0100 0100 1000 1100 4. + 0x044BB, // 0 0 0100 0100 1011 1011 5. + 0x044FB, // 0 0 0100 0100 1111 1011 6. + 0x0000E, // 0 0 0000 0000 0000 1110 7. + 0x044FF, // 0 0 0100 0100 1111 1111 8. + 0x044BF, // 0 0 0100 0100 1011 1111 9. + 0x00021, // 0 0 0000 0000 0010 0001 - + // -. + 0x02001, // 0 0 0010 0000 0000 0001 - + // /. + 0x02430, // 0 0 0010 0100 0011 0000 <. + 0x04430, // 0 0 0100 0100 0011 0000 =. + 0x08830, // 0 0 1000 1000 0011 0000 >. + 0x01407, // 0 0 0001 0100 0000 0111 ?. +}; + static const int poslut1937[]= { - 14, - 13, - 12, - 11, - 10, - 9, - 8, - 7, - 6, - 5, - 4, - 3, + 1,//0 2, - 1, - 0, - 15 + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 0//15 }; + /////////////////////////////////////////////////////////////////////////// -void vfd_init(int id, int type ) +void vfd_init(int id, int type ,int reversed) { memset( &vfds[id], 0, sizeof(vfds[0])); vfds[id].type = type; + vfds[id].reversed = reversed; vfd_reset(id); } @@ -218,10 +317,85 @@ UINT16 *vfd_get_segments(int id) /////////////////////////////////////////////////////////////////////////// +UINT16 *vfd_get_outputs(int id) +{ + return vfds[id].outputs; +} + +/////////////////////////////////////////////////////////////////////////// + +UINT16 *vfd_set_outputs(int id) +{ + int cursor; + switch ( vfds[id].type ) + { + case VFDTYPE_MSC1937: + { + for (cursor = 0; cursor < 16; cursor++) + { + if (!vfds[id].reversed)//Output to the screen is naturally backwards, so we need to invert it + { + vfds[id].outputs[cursor] = vfd_get_segments(id)[15-cursor]; + } + else + { + //If the controller is reversed, things look normal. + vfds[id].outputs[cursor] = vfd_get_segments(id)[cursor]; + } + } + } + break; + case VFDTYPE_BFMBD1: + { + for (cursor = 0; cursor < 16; cursor++) + { + if ( vfd_get_segments(id)[cursor] & 0x01 ) vfds[id].outputs[cursor] |= 0x0080; + else vfds[id].outputs[cursor] &= ~0x0080; + if ( vfd_get_segments(id)[cursor] & 0x02 ) vfds[id].outputs[cursor] |= 0x0004; + else vfds[id].outputs[cursor] &= ~0x0004; + if ( vfd_get_segments(id)[cursor] & 0x04 ) vfds[id].outputs[cursor] |= 0x0001; + else vfds[id].outputs[cursor] &= ~0x0001; + if ( vfd_get_segments(id)[cursor] & 0x08 ) vfds[id].outputs[cursor] |= 0x0100; + else vfds[id].outputs[cursor] &= ~0x0100; + if ( vfd_get_segments(id)[cursor] & 0x10 ) vfds[id].outputs[cursor] |= 0x2000; + else vfds[id].outputs[cursor] &= ~0x2000; + if ( vfd_get_segments(id)[cursor] & 0x20 ) vfds[id].outputs[cursor] |= 0x0008; + else vfds[id].outputs[cursor] &= ~0x0008; + if ( vfd_get_segments(id)[cursor] & 0x40 ) vfds[id].outputs[cursor] |= 0x8000; + else vfds[id].outputs[cursor] &= ~0x8000; + if ( vfd_get_segments(id)[cursor] & 0x80 ) vfds[id].outputs[cursor] |= 0x0200; + else vfds[id].outputs[cursor] &= ~0x0200; + + //Flashing ? Set an unused pin as a control + if ( vfd_get_segments(id)[cursor] & 0x80 ) vfds[id].outputs[cursor] |= 0x40000; + else vfds[id].outputs[cursor] &= ~0x40000; + + if ( vfd_get_segments(id)[cursor] & 0x200 ) vfds[id].outputs[cursor] |= 0x0020; + else vfds[id].outputs[cursor] &= ~0x0020; + if ( vfd_get_segments(id)[cursor] & 0x400 ) vfds[id].outputs[cursor] |= 0x1000; + else vfds[id].outputs[cursor] &= ~0x1000; + if ( vfd_get_segments(id)[cursor] & 0x800 ) vfds[id].outputs[cursor] |= 0x0800; + else vfds[id].outputs[cursor] &= ~0x0800; + if ( vfd_get_segments(id)[cursor] & 0x1000 )vfds[id].outputs[cursor] |= 0x20000; + else vfds[id].outputs[cursor] &= ~0x20000; + if ( vfd_get_segments(id)[cursor] & 0x2000 )vfds[id].outputs[cursor] |= 0x0040; + else vfds[id].outputs[cursor] &= ~0x0040; + if ( vfd_get_segments(id)[cursor] & 0x4000 )vfds[id].outputs[cursor] |= 0x0400; + else vfds[id].outputs[cursor] &= ~0x0400; + if ( vfd_get_segments(id)[cursor] & 0x8000 )vfds[id].outputs[cursor] |= 0x4000; + else vfds[id].outputs[cursor] &= ~0x4000; + } + } + } + return 0; +} +/////////////////////////////////////////////////////////////////////////// + char *vfd_get_string( int id) { return (char *)vfds[id].string; } + /////////////////////////////////////////////////////////////////////////// void vfd_shift_data(int id, int data) @@ -395,7 +569,6 @@ int vfd_newdata(int id, int data) if ( (data & 0xF0) == 0xA0 ) // 1010 xxxx { // 1010 xxxx Buffer Pointer control vfds[id].cursor_pos = poslut1937[data & 0x0F]; - logerror("CUR%d\n", vfds[id].cursor_pos); } else if ( (data & 0xF0) == 0xC0 ) // 1100 xxxx { // 1100 xxxx Set number of digits @@ -423,14 +596,16 @@ int vfd_newdata(int id, int data) switch ( data ) { case 0x2C: // ; + vfds[id].segments[vfds[id].pcursor_pos] |= (1<<17);//. + vfds[id].segments[vfds[id].pcursor_pos] |= (1<<18);//, + break; case 0x2E: // - - vfds[id].segments[vfds[id].pcursor_pos] |= (1<<12); + vfds[id].segments[vfds[id].pcursor_pos] |= (1<<17);//. break; default : vfds[id].pcursor_pos = vfds[id].cursor_pos; vfds[id].string[ vfds[id].cursor_pos ] = OKI1937ASCII[data]; - vfds[id].segments[vfds[id].cursor_pos] = BFMcharset[data & 0x3F]; + vfds[id].segments[vfds[id].cursor_pos] = OKIcharset[data & 0x3F]; vfds[id].cursor_pos++; if ( vfds[id].cursor_pos > vfds[id].window_end ) @@ -603,53 +778,130 @@ static int BD1_setdata(int id, int segdata, int data) return change; } -void draw_16seg(mame_bitmap *bitmap,int x,int y,int vfd, int col_on, int col_off ) +void plot_vfd(mame_bitmap *bitmap,int vfd,int segs,int color, int col_off ) { int cursor; + int curwidth = 288/16; + vfd_set_outputs(vfd); for (cursor = 0; cursor < 16; cursor++) { - plot_box(bitmap, x+(18*cursor), y+2, 1, 9, (vfd_get_segments(vfd)[cursor] & 0x0001) ? col_on : col_off);//0 - plot_box(bitmap, x+12+(18*cursor), y+2, 1, 9, (vfd_get_segments(vfd)[cursor] & 0x0002) ? col_on : col_off);//1 - plot_box(bitmap, x+1+(18*cursor), y, 9, 1, (vfd_get_segments(vfd)[cursor] & 0x0004) ? col_on : col_off);//2 - plot_box(bitmap, x+6+(18*cursor), y+2, 1, 9, (vfd_get_segments(vfd)[cursor] & 0x0008) ? col_on : col_off);//3 + switch (segs) + { + case 14: + { + plot_box(bitmap, 1+(curwidth*cursor), 0, 11, 2, (vfd_get_outputs(vfd)[cursor] & 0x0001) ? color : col_off);//0 + plot_box(bitmap, 1+(curwidth*cursor), 27, 11, 2, (vfd_get_outputs(vfd)[cursor] & 0x0020) ? color : col_off);//5 + break; + } + case 16: + { + plot_box(bitmap, 1+(curwidth*cursor), 0, 5, 2, (vfd_get_outputs(vfd)[cursor] & 0x0001) ? color : col_off);//0 + plot_box(bitmap, 7+(curwidth*cursor), 0, 5, 2, (vfd_get_outputs(vfd)[cursor] & 0x0002) ? color : col_off);//1 + plot_box(bitmap, 7+(curwidth*cursor), 27, 5, 2, (vfd_get_outputs(vfd)[cursor] & 0x0010) ? color : col_off);//4 + plot_box(bitmap, 1+(curwidth*cursor), 27, 5, 2, (vfd_get_outputs(vfd)[cursor] & 0x0020) ? color : col_off);//5 + break; + } + } - plot_box(bitmap, x+5+(18*cursor), y+14, 1, 2, (vfd_get_segments(vfd)[cursor] & 0x0010) ? col_on : col_off);//4 - plot_box(bitmap, x+4+(18*cursor), y+16, 1, 5, (vfd_get_segments(vfd)[cursor] & 0x0010) ? col_on : col_off);//4 first step - plot_box(bitmap, x+3+(18*cursor), y+21, 1, 3, (vfd_get_segments(vfd)[cursor] & 0x0010) ? col_on : col_off);//4 second step + plot_box(bitmap, 12+(curwidth*cursor), 2, 2, 12, (vfd_get_outputs(vfd)[cursor] & 0x0004) ? color : col_off);//2 + plot_box(bitmap, 12+(curwidth*cursor), 16, 2, 12, (vfd_get_outputs(vfd)[cursor] & 0x0008) ? color : col_off);//3 + plot_box(bitmap, (curwidth*cursor), 16, 2, 12, (vfd_get_outputs(vfd)[cursor] & 0x0040) ? color : col_off);//6 + plot_box(bitmap, (curwidth*cursor), 2, 2, 12, (vfd_get_outputs(vfd)[cursor] & 0x0080) ? color : col_off);//7 + plot_box(bitmap, 7+(curwidth*cursor), 2, 2, 12, (vfd_get_outputs(vfd)[cursor] & 0x0100) ? color : col_off);//8 - plot_box(bitmap, x+12+(18*cursor), y+15, 1, 9, (vfd_get_segments(vfd)[cursor] & 0x0020) ? col_on : col_off);//5 + plot_box(bitmap, 10+(curwidth*cursor), 9, 2, 2, (vfd_get_outputs(vfd)[cursor] & 0x0200) ? color : col_off);//9? + plot_box(bitmap, 9+(curwidth*cursor), 10, 2, 4, (vfd_get_outputs(vfd)[cursor] & 0x0200) ? color : col_off);//9? + plot_box(bitmap, 10+(curwidth*cursor), 5, 2, 4, (vfd_get_outputs(vfd)[cursor] & 0x0200) ? color : col_off);//9? - plot_box(bitmap, x+5+(18*cursor), y+10, 1, 2, (vfd_get_segments(vfd)[cursor] & 0x0040) ? col_on : col_off);//6 - plot_box(bitmap, x+4+(18*cursor), y+9, 1, 5, (vfd_get_segments(vfd)[cursor] & 0x0040) ? col_on : col_off);//6 first step - plot_box(bitmap, x+3+(18*cursor), y+4, 1, 3, (vfd_get_segments(vfd)[cursor] & 0x0040) ? col_on : col_off);//6 second step + plot_box(bitmap, 7+(curwidth*cursor), 14, 7, 2, (vfd_get_outputs(vfd)[cursor] & 0x0400) ? color : col_off);//10 - plot_box(bitmap, x+7+(18*cursor), y+10, 1, 2, (vfd_get_segments(vfd)[cursor] & 0x0080) ? col_on : col_off);//7 - plot_box(bitmap, x+8+(18*cursor), y+9, 1, 5, (vfd_get_segments(vfd)[cursor] & 0x0080) ? col_on : col_off);//7 - plot_box(bitmap, x+9+(18*cursor), y+4, 1, 3, (vfd_get_segments(vfd)[cursor] & 0x0080) ? col_on : col_off);//7 + plot_box(bitmap, 10+(curwidth*cursor),21, 2, 2, (vfd_get_outputs(vfd)[cursor] & 0x0800) ? color : col_off);//11? + plot_box(bitmap, 9+(curwidth*cursor), 17, 2, 4, (vfd_get_outputs(vfd)[cursor] & 0x0800) ? color : col_off);//11? + plot_box(bitmap, 10+(curwidth*cursor), 22, 2, 4, (vfd_get_outputs(vfd)[cursor] & 0x0800) ? color : col_off);//11? - plot_box(bitmap, x+7+(18*cursor), y+14, 1, 2, (vfd_get_segments(vfd)[cursor] & 0x0800) ? col_on : col_off);//7 - plot_box(bitmap, x+8+(18*cursor), y+16, 1, 5, (vfd_get_segments(vfd)[cursor] & 0x0800) ? col_on : col_off);//7 - plot_box(bitmap, x+9+(18*cursor), y+21, 1, 3, (vfd_get_segments(vfd)[cursor] & 0x0800) ? col_on : col_off);//7 - plot_box(bitmap, x+6+(18*cursor), y+14, 1, 9, (vfd_get_segments(vfd)[cursor] & 0x0400) ? col_on : col_off);//10 + plot_box(bitmap, 7+(curwidth*cursor), 16, 2, 11, (vfd_get_outputs(vfd)[cursor] & 0x1000) ? color : col_off);//12 + + plot_box(bitmap, 3+(curwidth*cursor), 21, 2, 2, (vfd_get_outputs(vfd)[cursor] & 0x2000) ? color : col_off);//13? + plot_box(bitmap, 4+(curwidth*cursor), 17, 2, 4, (vfd_get_outputs(vfd)[cursor] & 0x2000) ? color : col_off);//13? first step + plot_box(bitmap, 3+(curwidth*cursor), 22, 2, 4, (vfd_get_outputs(vfd)[cursor] & 0x2000) ? color : col_off);//13? second step + + plot_box(bitmap, (curwidth*cursor), 14, 7, 2, (vfd_get_outputs(vfd)[cursor] & 0x4000) ? color : col_off);//14 + + plot_box(bitmap, 3+(curwidth*cursor), 9, 2, 2, (vfd_get_outputs(vfd)[cursor] & 0x8000) ? color : col_off);//15? + plot_box(bitmap, 4+(curwidth*cursor), 10, 2, 4, (vfd_get_outputs(vfd)[cursor] & 0x8000) ? color : col_off);//15? first step + plot_box(bitmap, 3+(curwidth*cursor), 5, 2, 4, (vfd_get_outputs(vfd)[cursor] & 0x8000) ? color : col_off);//15? second step + + switch (vfds[vfd].type) + { + case VFDTYPE_BFMBD1: + { + plot_box(bitmap, 15+(curwidth*cursor), 22, 1, 3, (vfd_get_outputs(vfd)[cursor] & 0x20000) ? color : col_off);//18 + plot_box(bitmap, 16+(curwidth*cursor), 23, 1, 7, (vfd_get_outputs(vfd)[cursor] & 0x20000) ? color : col_off);//18 + plot_box(bitmap, 17+(curwidth*cursor), 27, 1, 6, (vfd_get_outputs(vfd)[cursor] & 0x20000) ? color : col_off);//18 + plot_box(bitmap, 18+(curwidth*cursor), 31, 1, 1, (vfd_get_outputs(vfd)[cursor] & 0x20000) ? color : col_off);//18 + break; + } - plot_box(bitmap, x+(18*cursor), y+14, 1, 9, (vfd_get_segments(vfd)[cursor] & 0x2000) ? col_on : col_off);//13 - plot_box(bitmap, x+15+(18*cursor), y+24, 1, 3, (vfd_get_segments(vfd)[cursor] & 0x1000) ? col_on : col_off);//12 - plot_box(bitmap, x+16+(18*cursor), y+25, 1, 3, (vfd_get_segments(vfd)[cursor] & 0x1000) ? col_on : col_off);//12 - plot_box(bitmap, x+17+(18*cursor), y+28, 1, 1, (vfd_get_segments(vfd)[cursor] & 0x1000) ? col_on : col_off);//12 + case VFDTYPE_MSC1937: + { - plot_box(bitmap, x+(18*cursor), y+24, 10, 1, (vfd_get_segments(vfd)[cursor] & 0x0200) ? col_on : col_off);//8 + plot_box(bitmap, 15+(curwidth*cursor), 27, 1, 6, (vfd_get_outputs(vfd)[cursor] & 0x10000) ? color : col_off);//17 + plot_box(bitmap, 16+(curwidth*cursor), 27, 1, 3, (vfd_get_outputs(vfd)[cursor] & 0x10000) ? color : col_off);//17 + plot_box(bitmap, 15+(curwidth*cursor), 23, 2, 2, (vfd_get_outputs(vfd)[cursor] & 0x20000) ? color : col_off);//18 - plot_box(bitmap, x+7+(18*cursor), y+13, 4, 1, (vfd_get_segments(vfd)[cursor] & 0x4000) ? col_on : col_off);//14 - plot_box(bitmap, x+(18*cursor), y+13, 4, 1, (vfd_get_segments(vfd)[cursor] & 0x8000) ? col_on : col_off);//15 + break; + } - if (vfd_get_segments(vfd)[cursor] & 0x0100) + if (vfd_get_outputs(vfd)[cursor] & 0x40000) { - //activate flashing (unimplemented) + //activate flashing (unimplemented, as my BD1 datasheet is unreadable on that page) } else { //deactivate flashing (unimplemented) } + } } } +void draw_vfd(mame_bitmap *bitmap,int vfd,int segs,int col_on, int col_off ) +{ + int cycle,color; + + if (vfds[vfd].type == VFDTYPE_BFMBD1) + { + if ((segs < 14)||(segs > 14)) + { + logerror("BD1 controller only supports 14 segments - defaulting to 14 seg mode \n"); + segs = 14; + } + color = col_on; + plot_vfd(bitmap,vfd,segs,color,col_off ); + } + if (vfds[vfd].type == VFDTYPE_MSC1937) + { + for (cycle = 0; cycle < 32; cycle++) + { + if ((vfds[vfd].brightness < cycle)||(vfds[vfd].brightness == cycle)) + { + color = col_on; + plot_vfd(bitmap,vfd,segs,color,col_off ); + } + else + { + color = col_off; + plot_vfd(bitmap,vfd,segs,color,col_off ); + } + } + } +} +//Helper functions +void draw_16seg(mame_bitmap *bitmap,int vfd, int col_on, int col_off ) +{ + draw_vfd(bitmap,vfd,16,col_on,col_off ); +} +void draw_14seg(mame_bitmap *bitmap,int vfd, int col_on, int col_off ) +{ + draw_vfd(bitmap,vfd,14,col_on,col_off ); +} + diff --git a/src/machine/vacfdisp.h b/src/machine/vacfdisp.h index 545d8be7b..5867c3454 100644 --- a/src/machine/vacfdisp.h +++ b/src/machine/vacfdisp.h @@ -1,14 +1,15 @@ // Any fixes for this driver should be forwarded to AGEMAME HQ (http://www.mameworld.net/agemame/) -#ifndef BFM_VFD -#define BFM_VFD +#ifndef VACFDISP +#define VACFDISP #define MAX_VFDS 3 // max number of vfd displays emulated #define VFDTYPE_BFMBD1 0 // Bellfruit BD1 display #define VFDTYPE_MSC1937 1 // OKI MSC1937 display +#define REVERSED 1 // display is reversed -void vfd_init( int id, int type ); // setup a vfd +void vfd_init( int id, int type, int reversed ); // setup a vfd void vfd_reset( int id); // reset the vfd @@ -17,10 +18,12 @@ void vfd_shift_data(int id, int data); // clock in a bit of data int vfd_newdata( int id, int data); // clock in 8 bits of data (scorpion2 vfd interface) UINT16 *vfd_get_segments(int id); // get current segments displayed +UINT16 *vfd_set_outputs(int id); // convert segments to standard for display +UINT16 *vfd_get_outputs(int id); // get converted segments char *vfd_get_string( int id); // get current string displayed (not as accurate) -void draw_16seg(mame_bitmap *bitmap,int x,int y,int vfd, int col_on, int col_off ); - +void draw_16seg(mame_bitmap *bitmap,int vfd, int col_on, int col_off ); +void draw_14seg(mame_bitmap *bitmap,int vfd, int col_on, int col_off ); #endif diff --git a/src/machine/vsnes.c b/src/machine/vsnes.c index b526c1061..535b74d12 100644 --- a/src/machine/vsnes.c +++ b/src/machine/vsnes.c @@ -8,7 +8,7 @@ Nintendo VS UniSystem and DualSystem - (c) 1984 Nintendo of America ***************************************************************************/ #include "driver.h" -#include "vidhrdw/ppu2c03b.h" +#include "vidhrdw/ppu2c0x.h" /* Globals */ int vsnes_gun_controller; @@ -222,11 +222,11 @@ MACHINE_RESET( vsnes ) input_latch[2] = input_latch[3] = 0; /* reset the ppu */ - ppu2c03b_reset( 0, 1 ); + ppu2c0x_reset( 0, 1 ); /* if we need to remap, install the callback */ if ( remapped_colortable ) - ppu2c03b_set_vidaccess_callback( 0, remap_colors ); + ppu2c0x_set_vidaccess_callback( 0, remap_colors ); } /************************************* @@ -240,14 +240,14 @@ MACHINE_RESET( vsdual ) input_latch[2] = input_latch[3] = 0; /* reset the ppu */ - ppu2c03b_reset( 0,1); - ppu2c03b_reset( 1,1 ); + ppu2c0x_reset( 0,1); + ppu2c0x_reset( 1,1 ); /* if we need to remap, install the callback */ if ( remapped_colortable ) { - ppu2c03b_set_vidaccess_callback( 0, remap_colors ); - ppu2c03b_set_vidaccess_callback( 1, remap_colors ); + ppu2c0x_set_vidaccess_callback( 0, remap_colors ); + ppu2c0x_set_vidaccess_callback( 1, remap_colors ); } } @@ -274,7 +274,7 @@ DRIVER_INIT( vsnes ) static WRITE8_HANDLER( vsnormal_vrom_banking ) { /* switch vrom */ - ppu2c03b_set_videorom_bank( 0, 0, 8, ( data & 4 ) ? 1 : 0, 512 ); + ppu2c0x_set_videorom_bank( 0, 0, 8, ( data & 4 ) ? 1 : 0, 512 ); /* bit 1 ( data & 2 ) enables writes to extra ram, we ignore it */ @@ -297,11 +297,11 @@ static WRITE8_HANDLER( ppuRC2C05_protection ) if ( offset == 0 ) { - ppu2c03b_0_w( 1, data ); + ppu2c0x_0_w( 1, data ); return; } - ppu2c03b_0_w( 0, data ); + ppu2c0x_0_w( 0, data ); } /**********************************************************************************/ @@ -311,10 +311,10 @@ static WRITE8_HANDLER( ppuRC2C05_protection ) DRIVER_INIT( suprmrio ) { /* common init */ - init_vsnes(); + init_vsnes(machine); /* normal banking */ - init_vsnormal(); + init_vsnormal(machine); /* extra ram at $6000 is enabled with bit 1 of $4016 */ memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MRA8_RAM ); @@ -337,7 +337,7 @@ static WRITE8_HANDLER( gun_in0_w ) if (vsnes_do_vrom_bank) { /* switch vrom */ - ppu2c03b_set_videorom_bank( 0, 0, 8, ( data & 4 ) ? 1 : 0, 512 ); + ppu2c0x_set_videorom_bank( 0, 0, 8, ( data & 4 ) ? 1 : 0, 512 ); } /* here we do things a little different */ @@ -356,10 +356,10 @@ static WRITE8_HANDLER( gun_in0_w ) pen_t *pens = Machine->pens; /* get the pixel at the gun position */ - pix = ppu2c03b_get_pixel( 0, x, y ); + pix = ppu2c0x_get_pixel( 0, x, y ); /* get the color base from the ppu */ - color_base = ppu2c03b_get_colorbase( 0 ); + color_base = ppu2c0x_get_colorbase( 0 ); /* look at the screen and see if the cursor is over a bright pixel */ if ( ( pix == pens[color_base+0x20] ) || ( pix == pens[color_base+0x30] ) || @@ -388,7 +388,7 @@ DRIVER_INIT( duckhunt ) memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x4016, 0x4016, 0, 0, gun_in0_w ); /* common init */ - init_vsnes(); + init_vsnes(machine); /* enable gun controller */ vsnes_gun_controller = 1; @@ -419,11 +419,11 @@ static WRITE8_HANDLER( goonies_rom_banking ) break; case 6: /* vrom bank 0 */ - ppu2c03b_set_videorom_bank( 0, 0, 4, data, 256 ); + ppu2c0x_set_videorom_bank( 0, 0, 4, data, 256 ); break; case 7: /* vrom bank 1 */ - ppu2c03b_set_videorom_bank( 0, 4, 4, data, 256 ); + ppu2c0x_set_videorom_bank( 0, 4, 4, data, 256 ); break; } } @@ -438,7 +438,7 @@ DRIVER_INIT( goonies ) memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, goonies_rom_banking ); /* common init */ - init_vsnes(); + init_vsnes(machine); /* now override the vidaccess callback */ remapped_colortable = rp2c04003_colortable; @@ -454,7 +454,7 @@ DRIVER_INIT( vsgradus ) memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, goonies_rom_banking ); /* common init */ - init_vsnes(); + init_vsnes(machine); /* now override the vidaccess callback */ remapped_colortable = rp2c04001_colortable; @@ -463,10 +463,10 @@ DRIVER_INIT( vsgradus ) DRIVER_INIT( vspinbal ) { /* common init */ - init_vsnes(); + init_vsnes(machine); /* normal banking */ - init_vsnormal(); + init_vsnormal(machine); /* now override the vidaccess callback */ remapped_colortable = rp2c04001_colortable; @@ -481,7 +481,7 @@ DRIVER_INIT( hogalley ) memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x4016, 0x4016, 0, 0, gun_in0_w ); /* common init */ - init_vsnes(); + init_vsnes(machine); /* enable gun controller */ vsnes_gun_controller = 1; @@ -498,7 +498,7 @@ DRIVER_INIT( hogalley ) static READ8_HANDLER( vsgshoe_security_r ) { /* low part must be 0x1c */ - return ppu2c03b_0_r( 2 ) | 0x1c; + return ppu2c0x_0_r( 2 ) | 0x1c; } static WRITE8_HANDLER( vsgshoe_gun_in0_w ) @@ -529,7 +529,7 @@ DRIVER_INIT( vsgshoe ) memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x4016, 0x4016, 0, 0, vsgshoe_gun_in0_w ); /* common init */ - init_vsnes(); + init_vsnes(machine); vsnes_gun_controller = 1; vsnes_do_vrom_bank = 1; @@ -608,17 +608,17 @@ static WRITE8_HANDLER( drmario_rom_banking ) } /* apply mirroring */ - ppu2c03b_set_mirroring( 0, mirroring ); + ppu2c0x_set_mirroring( 0, mirroring ); } break; case 1: /* video rom banking - bank 0 - 4k or 8k */ - ppu2c03b_set_videorom_bank( 0, 0, ( vrom4k ) ? 4 : 8, drmario_shiftreg, ( vrom4k ) ? 256 : 512 ); + ppu2c0x_set_videorom_bank( 0, 0, ( vrom4k ) ? 4 : 8, drmario_shiftreg, ( vrom4k ) ? 256 : 512 ); break; case 2: /* video rom banking - bank 1 - 4k only */ if ( vrom4k ) - ppu2c03b_set_videorom_bank( 0, 4, 4, drmario_shiftreg, 256 ); + ppu2c0x_set_videorom_bank( 0, 4, 4, drmario_shiftreg, 256 ); break; case 3: /* program banking */ @@ -666,7 +666,7 @@ DRIVER_INIT( drmario ) drmario_shiftcount = 0; /* common init */ - init_vsnes(); + init_vsnes(machine); /* now override the vidaccess callback */ remapped_colortable = rp2c04003_colortable; @@ -679,10 +679,10 @@ DRIVER_INIT( drmario ) DRIVER_INIT( excitebk ) { /* common init */ - init_vsnes(); + init_vsnes(machine); /* normal banking */ - init_vsnormal(); + init_vsnormal(machine); /* now override the vidaccess callback */ /* we need to remap color tables */ @@ -693,10 +693,10 @@ DRIVER_INIT( excitebk ) DRIVER_INIT( excitbkj ) { /* common init */ - init_vsnes(); + init_vsnes(machine); /* normal banking */ - init_vsnormal(); + init_vsnormal(machine); /* now override the vidaccess callback */ /* we need to remap color tables */ @@ -712,10 +712,10 @@ DRIVER_INIT( machridr ) { /* common init */ - init_vsnes(); + init_vsnes(machine); /* normal banking */ - init_vsnormal(); + init_vsnormal(machine); /* now override the vidaccess callback */ /* we need to remap color tables */ @@ -730,7 +730,7 @@ DRIVER_INIT( machridr ) DRIVER_INIT( vsslalom ) { /* common init */ - init_vsnes(); + init_vsnes(machine); /* now override the vidaccess callback */ /* we need to remap color tables */ @@ -758,7 +758,7 @@ DRIVER_INIT( cstlevna ) memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, castlevania_rom_banking ); /* common init */ - init_vsnes(); + init_vsnes(machine); /* now override the vidaccess callback */ /* we need to remap color tables */ @@ -773,7 +773,7 @@ DRIVER_INIT( cstlevna ) static READ8_HANDLER( topgun_security_r ) { /* low part must be 0x1b */ - return ppu2c03b_0_r( 2 ) | 0x1b; + return ppu2c0x_0_r( 2 ) | 0x1b; } DRIVER_INIT( topgun ) @@ -789,7 +789,7 @@ DRIVER_INIT( topgun ) memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x2000, 0x2001, 0, 0, ppuRC2C05_protection ); /* common init */ - init_vsnes(); + init_vsnes(machine); } /**********************************************************************************/ @@ -820,12 +820,12 @@ static void mapper4_set_prg (void) static void mapper4_set_chr (void) { UINT8 chr_page = (MMC3_cmd & 0x80) >> 5; - ppu2c03b_set_videorom_bank(0, chr_page ^ 0, 2, MMC3_chr[0], 1); - ppu2c03b_set_videorom_bank(0, chr_page ^ 2, 2, MMC3_chr[1], 1); - ppu2c03b_set_videorom_bank(0, chr_page ^ 4, 1, MMC3_chr[2], 1); - ppu2c03b_set_videorom_bank(0, chr_page ^ 5, 1, MMC3_chr[3], 1); - ppu2c03b_set_videorom_bank(0, chr_page ^ 6, 1, MMC3_chr[4], 1); - ppu2c03b_set_videorom_bank(0, chr_page ^ 7, 1, MMC3_chr[5], 1); + ppu2c0x_set_videorom_bank(0, chr_page ^ 0, 2, MMC3_chr[0], 1); + ppu2c0x_set_videorom_bank(0, chr_page ^ 2, 2, MMC3_chr[1], 1); + ppu2c0x_set_videorom_bank(0, chr_page ^ 4, 1, MMC3_chr[2], 1); + ppu2c0x_set_videorom_bank(0, chr_page ^ 5, 1, MMC3_chr[3], 1); + ppu2c0x_set_videorom_bank(0, chr_page ^ 6, 1, MMC3_chr[4], 1); + ppu2c0x_set_videorom_bank(0, chr_page ^ 7, 1, MMC3_chr[5], 1); } #define BOTTOM_VISIBLE_SCANLINE 239 /* The bottommost visible scanline */ @@ -900,13 +900,13 @@ static WRITE8_HANDLER( mapper4_w ) } case 0x2000: /* $a000 */ if (data & 0x40) - ppu2c03b_set_mirroring(0, PPU_MIRROR_HIGH); + ppu2c0x_set_mirroring(0, PPU_MIRROR_HIGH); else { if (data & 0x01) - ppu2c03b_set_mirroring(0, PPU_MIRROR_HORZ); + ppu2c0x_set_mirroring(0, PPU_MIRROR_HORZ); else - ppu2c03b_set_mirroring(0, PPU_MIRROR_VERT); + ppu2c0x_set_mirroring(0, PPU_MIRROR_VERT); } break; @@ -929,13 +929,13 @@ static WRITE8_HANDLER( mapper4_w ) IRQ_enable = 0; IRQ_count = IRQ_count_latch; - ppu2c03b_set_scanline_callback (0, 0); + ppu2c0x_set_scanline_callback (0, 0); break; case 0x6001: /* $e001 - Enable IRQs */ IRQ_enable = 1; - ppu2c03b_set_scanline_callback (0, mapper4_irq); + ppu2c0x_set_scanline_callback (0, mapper4_irq); break; @@ -971,7 +971,7 @@ DRIVER_INIT( MMC3 ) memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MWA8_RAM ); /* common init */ - init_vsnes(); + init_vsnes(machine); } /* Vs. RBI Baseball */ @@ -1009,7 +1009,7 @@ static READ8_HANDLER( rbi_hack_r) DRIVER_INIT( rbibb ) { - init_MMC3(); + init_MMC3(machine); /* RBI Base ball hack */ memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x5e00, 0x5e01, 0, 0, rbi_hack_r) ; @@ -1059,7 +1059,7 @@ static READ8_HANDLER( supxevs_read_prot_4_r ) DRIVER_INIT( supxevs ) { - init_MMC3(); + init_MMC3(machine); /* Vs. Super Xevious Protection */ memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x54ff, 0x54ff, 0, 0, supxevs_read_prot_1_r ); @@ -1094,7 +1094,7 @@ static READ8_HANDLER( tko_security_r ) DRIVER_INIT( tkoboxng ) { - init_MMC3(); + init_MMC3(machine); /* security device at $5e00-$5e01 */ memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x5e00, 0x5e01, 0, 0, tko_security_r ); @@ -1109,7 +1109,7 @@ DRIVER_INIT( tkoboxng ) DRIVER_INIT( vsfdf ) { - init_MMC3(); + init_MMC3(machine); memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x4016, 0x4016, 0, 0, gun_in0_r ); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x4016, 0x4016, 0, 0, gun_in0_w ); @@ -1128,19 +1128,19 @@ static WRITE8_HANDLER( mapper68_rom_banking ){ switch (offset & 0x7000) { case 0x0000: - ppu2c03b_set_videorom_bank(0,0,2,data,128); + ppu2c0x_set_videorom_bank(0,0,2,data,128); break; case 0x1000: - ppu2c03b_set_videorom_bank(0,2,2,data,128); + ppu2c0x_set_videorom_bank(0,2,2,data,128); break; case 0x2000: - ppu2c03b_set_videorom_bank(0,4,2,data,128); + ppu2c0x_set_videorom_bank(0,4,2,data,128); break; case 0x3000: /* ok? */ - ppu2c03b_set_videorom_bank(0,6,2,data,128); + ppu2c0x_set_videorom_bank(0,6,2,data,128); break; @@ -1163,7 +1163,7 @@ DRIVER_INIT( platoon ) memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, mapper68_rom_banking ); - init_vsnes(); + init_vsnes(machine); remapped_colortable = rp2c04001_colortable; @@ -1198,10 +1198,10 @@ DRIVER_INIT( bnglngby ) ret = 0; /* common init */ - init_vsnes(); + init_vsnes(machine); /* normal banking */ - init_vsnormal(); + init_vsnormal(machine); remapped_colortable = rp2c04002_colortable; } @@ -1212,7 +1212,7 @@ DRIVER_INIT( bnglngby ) static READ8_HANDLER( jajamaru_security_r ) { /* low part must be 0x40 */ - return ppu2c03b_0_r( 2 ) | 0x40; + return ppu2c0x_0_r( 2 ) | 0x40; } DRIVER_INIT( jajamaru ) @@ -1226,10 +1226,10 @@ DRIVER_INIT( jajamaru ) memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x2000, 0x2001, 0, 0, ppuRC2C05_protection ); /* common init */ - init_vsnes(); + init_vsnes(machine); /* normal banking */ - init_vsnormal(); + init_vsnormal(machine); } /***********************************************************************/ @@ -1239,7 +1239,7 @@ DRIVER_INIT( jajamaru ) static READ8_HANDLER( mightybj_security_r ) { /* low part must be 0x3d */ - return ppu2c03b_0_r( 2 ) | 0x3d; + return ppu2c0x_0_r( 2 ) | 0x3d; } DRIVER_INIT( mightybj ) @@ -1249,7 +1249,7 @@ DRIVER_INIT( mightybj ) memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x2000, 0x2001, 0, 0, ppuRC2C05_protection ); /* common init */ - init_vsnes(); + init_vsnes(machine); } /**********************************************************************************/ @@ -1260,7 +1260,7 @@ static WRITE8_HANDLER( vstennis_vrom_banking ) int other_cpu = cpu_getactivecpu() ^ 1; /* switch vrom */ - ppu2c03b_set_videorom_bank( cpu_getactivecpu(), 0, 8, ( data & 4 ) ? 1 : 0, 512 ); + ppu2c0x_set_videorom_bank( cpu_getactivecpu(), 0, 8, ( data & 4 ) ? 1 : 0, 512 ); /* bit 1 ( data & 2 ) triggers irq on the other cpu */ cpunum_set_input_line( other_cpu, 0, ( data & 2 ) ? CLEAR_LINE : ASSERT_LINE ); @@ -1294,7 +1294,7 @@ DRIVER_INIT( wrecking ) { /* only differance between this and vstennis is the colors */ - init_vstennis(); + init_vstennis(machine); remapped_colortable = rp2c04002_colortable; } @@ -1305,7 +1305,7 @@ DRIVER_INIT( balonfgt ) { /* only differance between this and vstennis is the colors */ - init_vstennis(); + init_vstennis(machine); remapped_colortable = rp2c04003_colortable; } @@ -1318,7 +1318,7 @@ DRIVER_INIT( vsbball ) { /* only differance between this and vstennis is the colors */ - init_vstennis(); + init_vstennis(machine); remapped_colortable = rp2c04001_colortable; @@ -1332,7 +1332,7 @@ DRIVER_INIT( iceclmrj ) { /* only differance between this and vstennis is the colors */ - init_vstennis(); + init_vstennis(machine); remapped_colortable = rp2c05004_colortable; @@ -1342,8 +1342,8 @@ DRIVER_INIT( iceclmrj ) /* Battle City */ DRIVER_INIT( btlecity ) { - init_vsnes(); - init_vsnormal(); + init_vsnes(machine); + init_vsnormal(machine); remapped_colortable = rp2c04003_colortable; } @@ -1355,7 +1355,7 @@ DRIVER_INIT( vstetris ) memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MRA8_RAM ); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MWA8_RAM ); - init_vsnes(); - init_vsnormal(); + init_vsnes(machine); + init_vsnormal(machine); remapped_colortable = rp2c04003_colortable; } diff --git a/src/machine/williams.c b/src/machine/williams.c index d811ab2ae..c28b2ff43 100644 --- a/src/machine/williams.c +++ b/src/machine/williams.c @@ -889,7 +889,7 @@ MACHINE_START( joust2 ) MACHINE_RESET( joust2 ) { /* standard init */ - machine_reset_williams2(); + machine_reset_williams2(machine); pia_set_input_ca1(3, 1); state_save_register_global(joust2_current_sound_data); } diff --git a/src/mame.c b/src/mame.c index be3e2398e..fe1de1905 100644 --- a/src/mame.c +++ b/src/mame.c @@ -82,7 +82,7 @@ #include "render.h" #include "ui.h" -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG #include "debug/debugcon.h" #endif @@ -119,57 +119,58 @@ struct _callback_item callback_item * next; union { - void (*exit)(void); - void (*reset)(void); - void (*pause)(int); - void (*log)(const char *); + void (*exit)(running_machine *); + void (*reset)(running_machine *); + void (*pause)(running_machine *, int); + void (*log)(running_machine *, const char *); } func; }; +/* typedef struct _mame_private mame_private; */ +struct _mame_private +{ + /* system state */ + int current_phase; + UINT8 paused; + UINT8 hard_reset_pending; + UINT8 exit_pending; + char * saveload_pending_file; + mame_timer * soft_reset_timer; + + /* callbacks */ + callback_item * reset_callback_list; + callback_item * pause_callback_list; + callback_item * exit_callback_list; + callback_item * logerror_callback_list; + + /* load/save */ + void (*saveload_schedule_callback)(running_machine *); + mame_time saveload_schedule_time; + + /* array of memory regions */ + region_info mem_region[MAX_MEMORY_REGIONS]; + + /* error recovery and exiting */ + jmp_buf fatal_error_jmpbuf; + int fatal_error_jmpbuf_valid; + + /* random number seed */ + UINT32 rand_seed; +}; + + /*************************************************************************** GLOBAL VARIABLES ***************************************************************************/ /* the active machine */ -static running_machine active_machine; running_machine *Machine; -/* the active game driver */ -static machine_config internal_drv; - /* various game options filled in by the OSD */ global_options options; -/* system state statics */ -static int current_phase; -static UINT8 mame_paused; -static UINT8 hard_reset_pending; -static UINT8 exit_pending; -static char *saveload_pending_file; -static mame_timer *soft_reset_timer; - -/* load/save statics */ -static void (*saveload_schedule_callback)(void); -static mame_time saveload_schedule_time; - -/* error recovery and exiting */ -static callback_item *reset_callback_list; -static callback_item *pause_callback_list; -static callback_item *exit_callback_list; -static jmp_buf fatal_error_jmpbuf; -static int fatal_error_jmpbuf_valid; - -/* array of memory regions */ -static region_info mem_region[MAX_MEMORY_REGIONS]; - -/* random number seed */ -static UINT32 rand_seed; - -/* logerror calback info */ -static callback_item *logerror_callback_list; - /* the "disclaimer" that should be printed when run with no parameters */ const char *mame_disclaimer = "MAME is an emulator: it reproduces, more or less faithfully, the behaviour of\n" @@ -229,18 +230,18 @@ const char *memory_region_names[REGION_MAX] = extern int mame_validitychecks(int game); -static void create_machine(int game); -static void destroy_machine(void); -static void init_machine(void); +static running_machine *create_machine(int game); +static void destroy_machine(running_machine *machine); +static void init_machine(running_machine *machine); static void soft_reset(int param); static void free_callback_list(callback_item **cb); -static void saveload_init(void); -static void handle_save(void); -static void handle_load(void); +static void saveload_init(running_machine *machine); +static void handle_save(running_machine *machine); +static void handle_load(running_machine *machine); +static void logfile_callback(running_machine *machine, const char *buffer); -static void logfile_callback(const char *buffer); /*************************************************************************** @@ -253,47 +254,53 @@ static void logfile_callback(const char *buffer); int run_game(int game) { + running_machine *machine; + int error = MAMERR_NONE; + mame_private *mame; callback_item *cb; - int error = 0; + + /* create the machine structure and driver */ + machine = create_machine(game); + mame = machine->mame_data; + + /* looooong term: remove this */ + Machine = machine; /* start in the "pre-init phase" */ - current_phase = MAME_PHASE_PREINIT; + mame->current_phase = MAME_PHASE_PREINIT; /* perform validity checks before anything else */ if (mame_validitychecks(game) != 0) - return 1; + return MAMERR_FAILED_VALIDITY; /* loop across multiple hard resets */ - exit_pending = FALSE; - while (error == 0 && !exit_pending) + mame->exit_pending = FALSE; + while (error == 0 && !mame->exit_pending) { init_resource_tracking(); add_free_resources_callback(timer_free); add_free_resources_callback(state_save_free); /* use setjmp/longjmp for deep error recovery */ - fatal_error_jmpbuf_valid = TRUE; - error = setjmp(fatal_error_jmpbuf); + mame->fatal_error_jmpbuf_valid = TRUE; + error = setjmp(mame->fatal_error_jmpbuf); if (error == 0) { int settingsloaded; /* move to the init phase */ - current_phase = MAME_PHASE_INIT; + mame->current_phase = MAME_PHASE_INIT; /* start tracking resources for real */ begin_resource_tracking(); /* if we have a logfile, set up the callback */ - logerror_callback_list = NULL; + mame->logerror_callback_list = NULL; if (options.logfile) - add_logerror_callback(logfile_callback); - - /* create the Machine structure and driver */ - create_machine(game); + add_logerror_callback(machine, logfile_callback); /* then finish setting up our local machine */ - init_machine(); + init_machine(machine); /* load the configuration settings and NVRAM */ settingsloaded = config_load_settings(); @@ -314,13 +321,13 @@ int run_game(int game) soft_reset(0); /* run the CPUs until a reset or exit */ - hard_reset_pending = FALSE; - while ((!hard_reset_pending && !exit_pending) || saveload_pending_file != NULL) + mame->hard_reset_pending = FALSE; + while ((!mame->hard_reset_pending && !mame->exit_pending) || mame->saveload_pending_file != NULL) { profiler_mark(PROFILER_EXTRA); /* execute CPUs if not paused */ - if (!mame_paused) + if (!mame->paused) cpuexec_timeslice(); /* otherwise, just pump video updates through */ @@ -328,14 +335,14 @@ int run_game(int game) video_frame_update(); /* handle save/load */ - if (saveload_schedule_callback) - (*saveload_schedule_callback)(); + if (mame->saveload_schedule_callback) + (*mame->saveload_schedule_callback)(machine); profiler_mark(PROFILER_END); } /* and out via the exit phase */ - current_phase = MAME_PHASE_EXIT; + mame->current_phase = MAME_PHASE_EXIT; /* stop tracking resources at this level */ end_resource_tracking(); @@ -344,21 +351,24 @@ int run_game(int game) nvram_save(); config_save_settings(); } - fatal_error_jmpbuf_valid = FALSE; + mame->fatal_error_jmpbuf_valid = FALSE; /* call all exit callbacks registered */ - for (cb = exit_callback_list; cb; cb = cb->next) - (*cb->func.exit)(); + for (cb = mame->exit_callback_list; cb; cb = cb->next) + (*cb->func.exit)(machine); /* close all inner resource tracking */ exit_resource_tracking(); /* free our callback lists */ - free_callback_list(&exit_callback_list); - free_callback_list(&reset_callback_list); - free_callback_list(&pause_callback_list); + free_callback_list(&mame->exit_callback_list); + free_callback_list(&mame->reset_callback_list); + free_callback_list(&mame->pause_callback_list); } + /* destroy the machine */ + destroy_machine(machine); + /* return an error */ return error; } @@ -369,9 +379,10 @@ int run_game(int game) phase -------------------------------------------------*/ -int mame_get_phase(void) +int mame_get_phase(running_machine *machine) { - return current_phase; + mame_private *mame = machine->mame_data; + return mame->current_phase; } @@ -380,19 +391,20 @@ int mame_get_phase(void) termination -------------------------------------------------*/ -void add_exit_callback(void (*callback)(void)) +void add_exit_callback(running_machine *machine, void (*callback)(running_machine *)) { + mame_private *mame = machine->mame_data; callback_item *cb; - assert_always(mame_get_phase() == MAME_PHASE_INIT, "Can only call add_exit_callback at init time!"); + assert_always(mame_get_phase(machine) == MAME_PHASE_INIT, "Can only call add_exit_callback at init time!"); /* allocate memory */ cb = malloc_or_die(sizeof(*cb)); /* add us to the head of the list */ cb->func.exit = callback; - cb->next = exit_callback_list; - exit_callback_list = cb; + cb->next = mame->exit_callback_list; + mame->exit_callback_list = cb; } @@ -401,11 +413,12 @@ void add_exit_callback(void (*callback)(void)) reset -------------------------------------------------*/ -void add_reset_callback(void (*callback)(void)) +void add_reset_callback(running_machine *machine, void (*callback)(running_machine *)) { + mame_private *mame = machine->mame_data; callback_item *cb, **cur; - assert_always(mame_get_phase() == MAME_PHASE_INIT, "Can only call add_reset_callback at init time!"); + assert_always(mame_get_phase(machine) == MAME_PHASE_INIT, "Can only call add_reset_callback at init time!"); /* allocate memory */ cb = malloc_or_die(sizeof(*cb)); @@ -413,7 +426,7 @@ void add_reset_callback(void (*callback)(void)) /* add us to the end of the list */ cb->func.reset = callback; cb->next = NULL; - for (cur = &reset_callback_list; *cur; cur = &(*cur)->next) ; + for (cur = &mame->reset_callback_list; *cur; cur = &(*cur)->next) ; *cur = cb; } @@ -423,11 +436,12 @@ void add_reset_callback(void (*callback)(void)) pause -------------------------------------------------*/ -void add_pause_callback(void (*callback)(int)) +void add_pause_callback(running_machine *machine, void (*callback)(running_machine *, int)) { + mame_private *mame = machine->mame_data; callback_item *cb, **cur; - assert_always(mame_get_phase() == MAME_PHASE_INIT, "Can only call add_pause_callback at init time!"); + assert_always(mame_get_phase(machine) == MAME_PHASE_INIT, "Can only call add_pause_callback at init time!"); /* allocate memory */ cb = malloc_or_die(sizeof(*cb)); @@ -435,7 +449,7 @@ void add_pause_callback(void (*callback)(int)) /* add us to the end of the list */ cb->func.pause = callback; cb->next = NULL; - for (cur = &pause_callback_list; *cur; cur = &(*cur)->next) ; + for (cur = &mame->pause_callback_list; *cur; cur = &(*cur)->next) ; *cur = cb; } @@ -449,13 +463,14 @@ void add_pause_callback(void (*callback)(int)) mame_schedule_exit - schedule a clean exit -------------------------------------------------*/ -void mame_schedule_exit(void) +void mame_schedule_exit(running_machine *machine) { - exit_pending = TRUE; + mame_private *mame = machine->mame_data; + mame->exit_pending = TRUE; /* if we're autosaving on exit, schedule a save as well */ - if (options.auto_save && (Machine->gamedrv->flags & GAME_SUPPORTS_SAVE)) - mame_schedule_save(Machine->gamedrv->name); + if (options.auto_save && (machine->gamedrv->flags & GAME_SUPPORTS_SAVE)) + mame_schedule_save(machine, machine->gamedrv->name); } @@ -464,9 +479,10 @@ void mame_schedule_exit(void) reset of the system -------------------------------------------------*/ -void mame_schedule_hard_reset(void) +void mame_schedule_hard_reset(running_machine *machine) { - hard_reset_pending = TRUE; + mame_private *mame = machine->mame_data; + mame->hard_reset_pending = TRUE; } @@ -475,12 +491,14 @@ void mame_schedule_hard_reset(void) reset of the system -------------------------------------------------*/ -void mame_schedule_soft_reset(void) +void mame_schedule_soft_reset(running_machine *machine) { - mame_timer_adjust(soft_reset_timer, time_zero, 0, time_zero); + mame_private *mame = machine->mame_data; + + mame_timer_adjust(mame->soft_reset_timer, time_zero, 0, time_zero); /* we can't be paused since the timer needs to fire */ - mame_pause(FALSE); + mame_pause(machine, FALSE); } @@ -489,19 +507,21 @@ void mame_schedule_soft_reset(void) occur as soon as possible -------------------------------------------------*/ -void mame_schedule_save(const char *filename) +void mame_schedule_save(running_machine *machine, const char *filename) { + mame_private *mame = machine->mame_data; + /* free any existing request and allocate a copy of the requested name */ - if (saveload_pending_file != NULL) - free(saveload_pending_file); - saveload_pending_file = mame_strdup(filename); + if (mame->saveload_pending_file != NULL) + free(mame->saveload_pending_file); + mame->saveload_pending_file = mame_strdup(filename); /* note the start time and set a timer for the next timeslice to actually schedule it */ - saveload_schedule_callback = handle_save; - saveload_schedule_time = mame_timer_get_time(); + mame->saveload_schedule_callback = handle_save; + mame->saveload_schedule_time = mame_timer_get_time(); /* we can't be paused since we need to clear out anonymous timers */ - mame_pause(FALSE); + mame_pause(machine, FALSE); } @@ -510,19 +530,21 @@ void mame_schedule_save(const char *filename) occur as soon as possible -------------------------------------------------*/ -void mame_schedule_load(const char *filename) +void mame_schedule_load(running_machine *machine, const char *filename) { + mame_private *mame = machine->mame_data; + /* free any existing request and allocate a copy of the requested name */ - if (saveload_pending_file != NULL) - free(saveload_pending_file); - saveload_pending_file = mame_strdup(filename); + if (mame->saveload_pending_file != NULL) + free(mame->saveload_pending_file); + mame->saveload_pending_file = mame_strdup(filename); /* note the start time and set a timer for the next timeslice to actually schedule it */ - saveload_schedule_callback = handle_load; - saveload_schedule_time = mame_timer_get_time(); + mame->saveload_schedule_callback = handle_load; + mame->saveload_schedule_time = mame_timer_get_time(); /* we can't be paused since we need to clear out anonymous timers */ - mame_pause(FALSE); + mame_pause(machine, FALSE); } @@ -531,11 +553,12 @@ void mame_schedule_load(const char *filename) scheduled event pending? -------------------------------------------------*/ -int mame_is_scheduled_event_pending(void) +int mame_is_scheduled_event_pending(running_machine *machine) { /* we can't check for saveload_pending_file here because it will bypass */ /* required UI screens if a state is queued from the command line */ - return exit_pending || hard_reset_pending; + mame_private *mame = machine->mame_data; + return mame->exit_pending || mame->hard_reset_pending; } @@ -543,18 +566,19 @@ int mame_is_scheduled_event_pending(void) mame_pause - pause or resume the system -------------------------------------------------*/ -void mame_pause(int pause) +void mame_pause(running_machine *machine, int pause) { + mame_private *mame = machine->mame_data; callback_item *cb; /* ignore if nothing has changed */ - if (mame_paused == pause) + if (mame->paused == pause) return; - mame_paused = pause; + mame->paused = pause; /* call all registered pause callbacks */ - for (cb = pause_callback_list; cb; cb = cb->next) - (*cb->func.pause)(mame_paused); + for (cb = mame->pause_callback_list; cb; cb = cb->next) + (*cb->func.pause)(machine, mame->paused); } @@ -562,9 +586,10 @@ void mame_pause(int pause) mame_is_paused - the system paused? -------------------------------------------------*/ -int mame_is_paused(void) +int mame_is_paused(running_machine *machine) { - return (current_phase != MAME_PHASE_RUNNING) || mame_paused; + mame_private *mame = machine->mame_data; + return (mame->current_phase != MAME_PHASE_RUNNING) || mame->paused; } @@ -578,7 +603,7 @@ int mame_is_paused(void) given either an index or a REGION_* identifier -------------------------------------------------*/ -int memory_region_to_index(int num) +static int memory_region_to_index(mame_private *mame, int num) { int i; @@ -588,7 +613,7 @@ int memory_region_to_index(int num) /* scan for a match */ for (i = 0; i < MAX_MEMORY_REGIONS; i++) - if (mem_region[i].type == num) + if (mame->mem_region[i].type == num) return i; return -1; @@ -600,25 +625,26 @@ int memory_region_to_index(int num) region -------------------------------------------------*/ -int new_memory_region(int type, size_t length, UINT32 flags) +UINT8 *new_memory_region(running_machine *machine, int type, size_t length, UINT32 flags) { + mame_private *mame = machine->mame_data; int num; assert(type >= MAX_MEMORY_REGIONS); /* find a free slot */ for (num = 0; num < MAX_MEMORY_REGIONS; num++) - if (mem_region[num].base == NULL) + if (mame->mem_region[num].base == NULL) break; if (num < 0) - return 1; + fatalerror("Out of memory regions!"); /* allocate the region */ - mem_region[num].length = length; - mem_region[num].type = type; - mem_region[num].flags = flags; - mem_region[num].base = malloc(length); - return (mem_region[num].base == NULL) ? 1 : 0; + mame->mem_region[num].length = length; + mame->mem_region[num].type = type; + mame->mem_region[num].flags = flags; + mame->mem_region[num].base = malloc_or_die(length); + return mame->mem_region[num].base; } @@ -627,16 +653,18 @@ int new_memory_region(int type, size_t length, UINT32 flags) region -------------------------------------------------*/ -void free_memory_region(int num) +void free_memory_region(running_machine *machine, int num) { + mame_private *mame = machine->mame_data; + /* convert to an index and bail if invalid */ - num = memory_region_to_index(num); + num = memory_region_to_index(mame, num); if (num < 0) return; /* free the region in question */ - free(mem_region[num].base); - memset(&mem_region[num], 0, sizeof(mem_region[num])); + free(mame->mem_region[num].base); + memset(&mame->mem_region[num], 0, sizeof(mame->mem_region[num])); } @@ -647,9 +675,12 @@ void free_memory_region(int num) UINT8 *memory_region(int num) { + running_machine *machine = Machine; + mame_private *mame = machine->mame_data; + /* convert to an index and return the result */ - num = memory_region_to_index(num); - return (num >= 0) ? mem_region[num].base : NULL; + num = memory_region_to_index(mame, num); + return (num >= 0) ? mame->mem_region[num].base : NULL; } @@ -660,9 +691,12 @@ UINT8 *memory_region(int num) size_t memory_region_length(int num) { + running_machine *machine = Machine; + mame_private *mame = machine->mame_data; + /* convert to an index and return the result */ - num = memory_region_to_index(num); - return (num >= 0) ? mem_region[num].length : 0; + num = memory_region_to_index(mame, num); + return (num >= 0) ? mame->mem_region[num].length : 0; } @@ -671,11 +705,13 @@ size_t memory_region_length(int num) memory region -------------------------------------------------*/ -UINT32 memory_region_type(int num) +UINT32 memory_region_type(running_machine *machine, int num) { + mame_private *mame = machine->mame_data; + /* convert to an index and return the result */ - num = memory_region_to_index(num); - return (num >= 0) ? mem_region[num].type : 0; + num = memory_region_to_index(mame, num); + return (num >= 0) ? mame->mem_region[num].type : 0; } @@ -684,11 +720,13 @@ UINT32 memory_region_type(int num) memory region -------------------------------------------------*/ -UINT32 memory_region_flags(int num) +UINT32 memory_region_flags(running_machine *machine, int num) { + mame_private *mame = machine->mame_data; + /* convert to an index and return the result */ - num = memory_region_to_index(num); - return (num >= 0) ? mem_region[num].flags : 0; + num = memory_region_to_index(mame, num); + return (num >= 0) ? mame->mem_region[num].flags : 0; } @@ -702,8 +740,25 @@ UINT32 memory_region_flags(int num) to the OSD layer -------------------------------------------------*/ +static void fatalerror_common(running_machine *machine, int exitcode, const char *buffer) +{ + /* output and return */ + printf("%s\n", giant_string_buffer); + + /* break into the debugger if attached */ + osd_break_into_debugger(giant_string_buffer); + + /* longjmp back if we can; otherwise, exit */ + if (machine != NULL && machine->mame_data != NULL && machine->mame_data->fatal_error_jmpbuf_valid) + longjmp(machine->mame_data->fatal_error_jmpbuf, exitcode); + else + exit(exitcode); +} + + void CLIB_DECL fatalerror(const char *text, ...) { + running_machine *machine = Machine; va_list arg; /* dump to the buffer; assume no one writes >2k lines this way */ @@ -711,12 +766,21 @@ void CLIB_DECL fatalerror(const char *text, ...) vsnprintf(giant_string_buffer, GIANT_STRING_BUFFER_SIZE, text, arg); va_end(arg); - /* output and return */ - printf("%s\n", giant_string_buffer); - if (fatal_error_jmpbuf_valid) - longjmp(fatal_error_jmpbuf, 1); - else - exit(-1); + fatalerror_common(machine, MAMERR_FATALERROR, giant_string_buffer); +} + + +void CLIB_DECL fatalerror_exitcode(int exitcode, const char *text, ...) +{ + running_machine *machine = Machine; + va_list arg; + + /* dump to the buffer; assume no one writes >2k lines this way */ + va_start(arg, text); + vsnprintf(giant_string_buffer, GIANT_STRING_BUFFER_SIZE, text, arg); + va_end(arg); + + fatalerror_common(machine, exitcode, giant_string_buffer); } @@ -746,25 +810,32 @@ void CLIB_DECL popmessage(const char *text, ...) void CLIB_DECL logerror(const char *text, ...) { - callback_item *cb; + running_machine *machine = Machine; - /* process only if there is a target */ - if (logerror_callback_list) + /* currently, we need a machine to do this */ + if (machine != NULL) { - va_list arg; + mame_private *mame = machine->mame_data; + callback_item *cb; - profiler_mark(PROFILER_LOGERROR); + /* process only if there is a target */ + if (mame->logerror_callback_list != NULL) + { + va_list arg; - /* dump to the buffer */ - va_start(arg, text); - vsnprintf(giant_string_buffer, GIANT_STRING_BUFFER_SIZE, text, arg); - va_end(arg); + profiler_mark(PROFILER_LOGERROR); - /* log to all callbacks */ - for (cb = logerror_callback_list; cb; cb = cb->next) - cb->func.log(giant_string_buffer); + /* dump to the buffer */ + va_start(arg, text); + vsnprintf(giant_string_buffer, GIANT_STRING_BUFFER_SIZE, text, arg); + va_end(arg); - profiler_mark(PROFILER_END); + /* log to all callbacks */ + for (cb = mame->logerror_callback_list; cb; cb = cb->next) + (*cb->func.log)(machine, giant_string_buffer); + + profiler_mark(PROFILER_END); + } } } @@ -774,17 +845,18 @@ void CLIB_DECL logerror(const char *text, ...) called on logerror() -------------------------------------------------*/ -void add_logerror_callback(void (*callback)(const char *)) +void add_logerror_callback(running_machine *machine, void (*callback)(running_machine *, const char *)) { + mame_private *mame = machine->mame_data; callback_item *cb, **cur; - assert_always(mame_get_phase() == MAME_PHASE_INIT, "Can only call add_logerror_callback at init time!"); + assert_always(mame_get_phase(machine) == MAME_PHASE_INIT, "Can only call add_logerror_callback at init time!"); cb = auto_malloc(sizeof(*cb)); cb->func.log = callback; cb->next = NULL; - for (cur = &logerror_callback_list; *cur; cur = &(*cur)->next) ; + for (cur = &mame->logerror_callback_list; *cur; cur = &(*cur)->next) ; *cur = cb; } @@ -794,7 +866,7 @@ void add_logerror_callback(void (*callback)(const char *)) logfile -------------------------------------------------*/ -static void logfile_callback(const char *buffer) +static void logfile_callback(running_machine *machine, const char *buffer) { if (options.logfile) mame_fputs(options.logfile, buffer); @@ -806,12 +878,12 @@ static void logfile_callback(const char *buffer) given CPU, or -1 if not found -------------------------------------------------*/ -int mame_find_cpu_index(const char *tag) +int mame_find_cpu_index(running_machine *machine, const char *tag) { int cpunum; for (cpunum = 0; cpunum < MAX_CPU; cpunum++) - if (Machine->drv->cpu[cpunum].tag && strcmp(Machine->drv->cpu[cpunum].tag, tag) == 0) + if (machine->drv->cpu[cpunum].tag && strcmp(machine->drv->cpu[cpunum].tag, tag) == 0) return cpunum; return -1; @@ -822,10 +894,11 @@ int mame_find_cpu_index(const char *tag) mame_rand - standardized random numbers -------------------------------------------------*/ -UINT32 mame_rand(void) +UINT32 mame_rand(running_machine *machine) { - rand_seed = 1664525 * rand_seed + 1013904223; - return rand_seed; + mame_private *mame = machine->mame_data; + mame->rand_seed = 1664525 * mame->rand_seed + 1013904223; + return mame->rand_seed; } @@ -839,46 +912,81 @@ UINT32 mame_rand(void) object and initialize it based on options -------------------------------------------------*/ -static void create_machine(int game) +static running_machine *create_machine(int game) { + running_machine *machine; int scrnum; - /* first give the machine a good cleaning */ - Machine = &active_machine; - memset(Machine, 0, sizeof(*Machine)); - - /* initialize the driver-related variables in the Machine */ - Machine->gamedrv = drivers[game]; - Machine->drv = &internal_drv; - expand_machine_driver(Machine->gamedrv->drv, &internal_drv); - for (scrnum = 0; scrnum < MAX_SCREENS; scrnum++) - Machine->screen[scrnum] = Machine->drv->screen[scrnum].defstate; - - /* copy some settings into easier-to-handle variables */ - Machine->record_file = options.record; - Machine->playback_file = options.playback; - Machine->debug_mode = options.mame_debug; + /* allocate memory for the machine */ + machine = malloc(sizeof(*machine)); + if (machine == NULL) + goto error; + memset(machine, 0, sizeof(*machine)); + + /* allocate memory for the internal mame_data */ + machine->mame_data = malloc(sizeof(*machine->mame_data)); + if (machine->mame_data == NULL) + goto error; + memset(machine->mame_data, 0, sizeof(*machine->mame_data)); + + /* initialize the driver-related variables in the machine */ + machine->gamedrv = drivers[game]; + machine->drv = malloc(sizeof(*machine->drv)); + if (machine->drv == NULL) + goto error; + expand_machine_driver(machine->gamedrv->drv, (machine_config *)machine->drv); + + /* allocate the driver data */ + if (machine->drv->driver_data_size != 0) + { + machine->driver_data = malloc(machine->drv->driver_data_size); + if (machine->driver_data == NULL) + goto error; + memset(machine->driver_data, 0, machine->drv->driver_data_size); + } /* determine the color depth */ - Machine->color_depth = 16; - if (Machine->drv->video_attributes & VIDEO_RGB_DIRECT) - Machine->color_depth = (Machine->drv->video_attributes & VIDEO_NEEDS_6BITS_PER_GUN) ? 32 : 15; - - /* initialize the samplerate */ - Machine->sample_rate = options.samplerate; - - /* add an exit callback to clear out the Machine on the way out */ - add_exit_callback(destroy_machine); + machine->color_depth = 16; + if (machine->drv->video_attributes & VIDEO_RGB_DIRECT) + machine->color_depth = (machine->drv->video_attributes & VIDEO_NEEDS_6BITS_PER_GUN) ? 32 : 15; + for (scrnum = 0; scrnum < MAX_SCREENS; scrnum++) + machine->screen[scrnum] = machine->drv->screen[scrnum].defstate; + + /* convert some options into live state */ + machine->sample_rate = options.samplerate; + machine->record_file = options.record; + machine->playback_file = options.playback; + machine->debug_mode = options.mame_debug; + + return machine; + +error: + if (machine->driver_data != NULL) + free(machine->driver_data); + if (machine->drv != NULL) + free((machine_config *)machine->drv); + if (machine->mame_data != NULL) + free(machine->mame_data); + if (machine != NULL) + free(machine); + return NULL; } /*------------------------------------------------- - destroy_machine - "destroy" the Machine by - NULLing it out + destroy_machine - free the machine data -------------------------------------------------*/ -static void destroy_machine(void) +static void destroy_machine(running_machine *machine) { + assert(machine == Machine); + if (machine->driver_data != NULL) + free(machine->driver_data); + if (machine->drv != NULL) + free((machine_config *)machine->drv); + if (machine->mame_data != NULL) + free(machine->mame_data); + free(machine); Machine = NULL; } @@ -887,107 +995,107 @@ static void destroy_machine(void) init_machine - initialize the emulated machine -------------------------------------------------*/ -static void init_machine(void) +static void init_machine(running_machine *machine) { + mame_private *mame = machine->mame_data; int num; /* initialize basic can't-fail systems here */ - cpuintrf_init(); - sndintrf_init(); - fileio_init(); - config_init(); - output_init(); - state_init(); + cpuintrf_init(machine); + sndintrf_init(machine); + fileio_init(machine); + config_init(machine); + output_init(machine); + state_init(machine); state_save_allow_registration(TRUE); - drawgfx_init(); - palette_init(); - render_init(); - ui_init(); - generic_machine_init(); - generic_video_init(); - rand_seed = 0x9d14abd7; + drawgfx_init(machine); + palette_init(machine); + render_init(machine); + ui_init(machine); + generic_machine_init(machine); + generic_video_init(machine); + mame->rand_seed = 0x9d14abd7; /* init the osd layer */ - if (osd_init() != 0) + if (osd_init(machine) != 0) fatalerror("osd_init failed"); /* initialize the input system */ /* this must be done before the input ports are initialized */ - if (code_init() != 0) + if (code_init(machine) != 0) fatalerror("code_init failed"); /* initialize the input ports for the game */ /* this must be done before memory_init in order to allow specifying */ /* callbacks based on input port tags */ - if (input_port_init(Machine->gamedrv->construct_ipt) != 0) + if (input_port_init(machine, machine->gamedrv->construct_ipt) != 0) fatalerror("input_port_init failed"); /* load the ROMs if we have some */ /* this must be done before memory_init in order to allocate memory regions */ - if (rom_init(Machine->gamedrv->rom) != 0) - fatalerror("rom_init failed"); + rom_init(machine, machine->gamedrv->rom); /* initialize the timers and allocate a soft_reset timer */ /* this must be done before cpu_init so that CPU's can allocate timers */ - timer_init(); - soft_reset_timer = timer_alloc(soft_reset); + timer_init(machine); + mame->soft_reset_timer = timer_alloc(soft_reset); /* initialize the memory system for this game */ /* this must be done before cpu_init so that set_context can look up the opcode base */ - if (memory_init() != 0) + if (memory_init(machine) != 0) fatalerror("memory_init failed"); /* now set up all the CPUs */ - if (cpuexec_init() != 0) + if (cpuexec_init(machine) != 0) fatalerror("cpuexec_init failed"); - if (cpuint_init() != 0) + if (cpuint_init(machine) != 0) fatalerror("cpuint_init failed"); #ifdef MESS /* initialize the devices */ - if (devices_init(Machine->gamedrv)) + if (devices_init(machine)) fatalerror("devices_init failed"); #endif /* start the save/load system */ - saveload_init(); + saveload_init(machine); /* call the game driver's init function */ /* this is where decryption is done and memory maps are altered */ /* so this location in the init order is important */ ui_set_startup_text("Initializing...", TRUE); - if (Machine->gamedrv->driver_init != NULL) - (*Machine->gamedrv->driver_init)(); + if (machine->gamedrv->driver_init != NULL) + (*machine->gamedrv->driver_init)(machine); /* start the audio system */ - if (sound_init() != 0) + if (sound_init(machine) != 0) fatalerror("sound_init failed"); /* start the video hardware */ - if (video_init() != 0) + if (video_init(machine) != 0) fatalerror("video_init failed"); /* start the cheat engine */ if (options.cheat) - cheat_init(); + cheat_init(machine); /* call the driver's _START callbacks */ - if (Machine->drv->machine_start != NULL && (*Machine->drv->machine_start)() != 0) + if (machine->drv->machine_start != NULL && (*machine->drv->machine_start)(machine) != 0) fatalerror("Unable to start machine emulation"); - if (Machine->drv->sound_start != NULL && (*Machine->drv->sound_start)() != 0) + if (machine->drv->sound_start != NULL && (*machine->drv->sound_start)(machine) != 0) fatalerror("Unable to start sound emulation"); - if (Machine->drv->video_start != NULL && (*Machine->drv->video_start)() != 0) + if (machine->drv->video_start != NULL && (*machine->drv->video_start)(machine) != 0) fatalerror("Unable to start video emulation"); /* free memory regions allocated with REGIONFLAG_DISPOSE (typically gfx roms) */ for (num = 0; num < MAX_MEMORY_REGIONS; num++) - if (mem_region[num].flags & ROMREGION_DISPOSE) - free_memory_region(num); + if (mame->mem_region[num].flags & ROMREGION_DISPOSE) + free_memory_region(machine, num); #ifdef MAME_DEBUG /* initialize the debugger */ - if (Machine->debug_mode) - mame_debug_init(); + if (machine->debug_mode) + mame_debug_init(machine); #endif } @@ -999,12 +1107,14 @@ static void init_machine(void) static void soft_reset(int param) { + running_machine *machine = Machine; + mame_private *mame = machine->mame_data; callback_item *cb; logerror("Soft reset\n"); /* temporarily in the reset phase */ - current_phase = MAME_PHASE_RESET; + mame->current_phase = MAME_PHASE_RESET; /* a bit gross -- back off of the resource tracking, and put it back at the end */ assert(get_resource_tag() == 2); @@ -1020,22 +1130,22 @@ static void soft_reset(int param) cpuint_reset(); /* run the driver's reset callbacks */ - if (Machine->drv->machine_reset != NULL) - (*Machine->drv->machine_reset)(); - if (Machine->drv->sound_reset != NULL) - (*Machine->drv->sound_reset)(); - if (Machine->drv->video_reset != NULL) - (*Machine->drv->video_reset)(); + if (machine->drv->machine_reset != NULL) + (*machine->drv->machine_reset)(machine); + if (machine->drv->sound_reset != NULL) + (*machine->drv->sound_reset)(machine); + if (machine->drv->video_reset != NULL) + (*machine->drv->video_reset)(machine); /* call all registered reset callbacks */ - for (cb = reset_callback_list; cb; cb = cb->next) - (*cb->func.reset)(); + for (cb = machine->mame_data->reset_callback_list; cb; cb = cb->next) + (*cb->func.reset)(machine); /* disallow save state registrations starting here */ state_save_allow_registration(FALSE); /* now we're running */ - current_phase = MAME_PHASE_RUNNING; + mame->current_phase = MAME_PHASE_RUNNING; /* set the global time to the current time */ /* this allows 0-time queued callbacks to run before any CPUs execute */ @@ -1067,7 +1177,7 @@ static void free_callback_list(callback_item **cb) saveload_init - initialize the save/load logic -------------------------------------------------*/ -static void saveload_init(void) +static void saveload_init(running_machine *machine) { /* if we're coming in with a savegame request, process it now */ if (options.savegame) @@ -1076,16 +1186,16 @@ static void saveload_init(void) if (strlen(options.savegame) == 1) { - sprintf(name, "%s-%c", Machine->gamedrv->name, options.savegame[0]); - mame_schedule_load(name); + sprintf(name, "%s-%c", machine->gamedrv->name, options.savegame[0]); + mame_schedule_load(machine, name); } else - mame_schedule_load(options.savegame); + mame_schedule_load(machine, options.savegame); } /* if we're in autosave mode, schedule a load */ - else if (options.auto_save && (Machine->gamedrv->flags & GAME_SUPPORTS_SAVE)) - mame_schedule_load(Machine->gamedrv->name); + else if (options.auto_save && (machine->gamedrv->flags & GAME_SUPPORTS_SAVE)) + mame_schedule_load(machine, machine->gamedrv->name); } @@ -1093,14 +1203,15 @@ static void saveload_init(void) handle_save - attempt to perform a save -------------------------------------------------*/ -static void handle_save(void) +static void handle_save(running_machine *machine) { + mame_private *mame = machine->mame_data; mame_file *file; /* if no name, bail */ - if (saveload_pending_file == NULL) + if (mame->saveload_pending_file == NULL) { - saveload_schedule_callback = NULL; + mame->saveload_schedule_callback = NULL; return; } @@ -1108,7 +1219,7 @@ static void handle_save(void) if (timer_count_anonymous() > 0) { /* if more than a second has passed, we're probably screwed */ - if (sub_mame_times(mame_timer_get_time(), saveload_schedule_time).seconds > 0) + if (sub_mame_times(mame_timer_get_time(), mame->saveload_schedule_time).seconds > 0) { popmessage("Unable to save due to pending anonymous timers. See error.log for details."); goto cancel; @@ -1117,7 +1228,7 @@ static void handle_save(void) } /* open the file */ - file = mame_fopen(Machine->gamedrv->name, saveload_pending_file, FILETYPE_STATE, 1); + file = mame_fopen(machine->gamedrv->name, mame->saveload_pending_file, FILETYPE_STATE, 1); if (file) { int cpunum; @@ -1156,7 +1267,7 @@ static void handle_save(void) mame_fclose(file); /* pop a warning if the game doesn't support saves */ - if (!(Machine->gamedrv->flags & GAME_SUPPORTS_SAVE)) + if (!(machine->gamedrv->flags & GAME_SUPPORTS_SAVE)) popmessage("State successfully saved.\nWarning: Save states are not officially supported for this game."); else popmessage("State successfully saved."); @@ -1166,9 +1277,9 @@ static void handle_save(void) cancel: /* unschedule the save */ - free(saveload_pending_file); - saveload_pending_file = NULL; - saveload_schedule_callback = NULL; + free(mame->saveload_pending_file); + mame->saveload_pending_file = NULL; + mame->saveload_schedule_callback = NULL; } @@ -1176,14 +1287,15 @@ static void handle_save(void) handle_load - attempt to perform a load -------------------------------------------------*/ -static void handle_load(void) +static void handle_load(running_machine *machine) { + mame_private *mame = machine->mame_data; mame_file *file; /* if no name, bail */ - if (saveload_pending_file == NULL) + if (mame->saveload_pending_file == NULL) { - saveload_schedule_callback = NULL; + mame->saveload_schedule_callback = NULL; return; } @@ -1192,7 +1304,7 @@ static void handle_load(void) if (timer_count_anonymous() > 0) { /* if more than a second has passed, we're probably screwed */ - if (sub_mame_times(mame_timer_get_time(), saveload_schedule_time).seconds > 0) + if (sub_mame_times(mame_timer_get_time(), mame->saveload_schedule_time).seconds > 0) { popmessage("Unable to load due to pending anonymous timers. See error.log for details."); goto cancel; @@ -1201,7 +1313,7 @@ static void handle_load(void) } /* open the file */ - file = mame_fopen(Machine->gamedrv->name, saveload_pending_file, FILETYPE_STATE, 0); + file = mame_fopen(machine->gamedrv->name, mame->saveload_pending_file, FILETYPE_STATE, 0); if (file) { /* start loading */ @@ -1246,7 +1358,7 @@ static void handle_load(void) cancel: /* unschedule the load */ - free(saveload_pending_file); - saveload_pending_file = NULL; - saveload_schedule_callback = NULL; + free(mame->saveload_pending_file); + mame->saveload_pending_file = NULL; + mame->saveload_schedule_callback = NULL; } diff --git a/src/mame.h b/src/mame.h index 2de7849f1..394f5b7b7 100644 --- a/src/mame.h +++ b/src/mame.h @@ -26,6 +26,13 @@ CONSTANTS ***************************************************************************/ +/* return values from run_game */ +#define MAMERR_NONE 0 /* no error */ +#define MAMERR_FAILED_VALIDITY 1 /* failed validity checks */ +#define MAMERR_MISSING_FILES 2 /* missing files */ +#define MAMERR_FATALERROR 3 /* some other fatale error */ + + /* program phases */ #define MAME_PHASE_PREINIT 0 #define MAME_PHASE_INIT 1 @@ -119,8 +126,12 @@ extern const char *memory_region_names[REGION_MAX]; TYPE DEFINITIONS ***************************************************************************/ +/* forward type declarations */ +typedef struct _palette_private palette_private; +typedef struct _mame_private mame_private; + /* description of the currently-running machine */ -typedef struct _running_machine running_machine; +/* typedef struct _running_machine running_machine; -- in mamecore.h */ struct _running_machine { /* game-related information */ @@ -130,10 +141,13 @@ struct _running_machine /* video-related information */ gfx_element * gfx[MAX_GFX_ELEMENTS];/* array of pointers to graphic sets (chars, sprites) */ screen_state screen[MAX_SCREENS];/* current screen state */ + + /* palette-related information */ pen_t * pens; /* remapped palette pen numbers */ UINT16 * game_colortable; /* lookup table used to map gfx pen numbers to color numbers */ pen_t * remapped_colortable;/* the above, already remapped through Machine->pens */ int color_depth; /* video color depth: 16, 15 or 32 */ + pen_t * shadow_table; /* table for looking up a shadowed pen */ /* audio-related information */ int sample_rate; /* the digital audio sample rate */ @@ -145,17 +159,18 @@ struct _running_machine /* debugger-related information */ int debug_mode; /* was debug mode enabled? */ -#if defined(MAME_DEBUG) && !defined(NEW_DEBUGGER) - mame_bitmap * debug_bitmap; /* bitmap where the debugger is rendered */ - pen_t * debug_pens; /* pen array for the debugger, analagous to the pens above */ - pen_t * debug_remapped_colortable;/* colortable mapped through the pens, as for the game */ - gfx_element * debugger_font; /* font used by the debugger */ -#endif /* MESS-specific information */ #ifdef MESS struct IODevice * devices; #endif /* MESS */ + + /* internal core information */ + mame_private * mame_data; /* internal data from mame.c */ + palette_private * palette_data; /* internal data from palette.c */ + + /* driver-specific information */ + void * driver_data; /* drivers can hang data off of here instead of using globals */ }; @@ -253,54 +268,54 @@ extern char build_version[]; int run_game(int game); /* return the current phase */ -int mame_get_phase(void); +int mame_get_phase(running_machine *machine); /* request callback on termination */ -void add_exit_callback(void (*callback)(void)); +void add_exit_callback(running_machine *machine, void (*callback)(running_machine *)); /* request callback on reset */ -void add_reset_callback(void (*callback)(void)); +void add_reset_callback(running_machine *machine, void (*callback)(running_machine *)); /* request callback on pause */ -void add_pause_callback(void (*callback)(int)); +void add_pause_callback(running_machine *machine, void (*callback)(running_machine *, int)); /* ----- global system states ----- */ /* schedule an exit */ -void mame_schedule_exit(void); +void mame_schedule_exit(running_machine *machine); /* schedule a hard reset */ -void mame_schedule_hard_reset(void); +void mame_schedule_hard_reset(running_machine *machine); /* schedule a soft reset */ -void mame_schedule_soft_reset(void); +void mame_schedule_soft_reset(running_machine *machine); /* schedule a save */ -void mame_schedule_save(const char *filename); +void mame_schedule_save(running_machine *machine, const char *filename); /* schedule a load */ -void mame_schedule_load(const char *filename); +void mame_schedule_load(running_machine *machine, const char *filename); /* is a scheduled event pending? */ -int mame_is_scheduled_event_pending(void); +int mame_is_scheduled_event_pending(running_machine *machine); /* pause the system */ -void mame_pause(int pause); +void mame_pause(running_machine *machine, int pause); /* get the current pause state */ -int mame_is_paused(void); +int mame_is_paused(running_machine *machine); /* ----- memory region management ----- */ /* allocate a new memory region */ -int new_memory_region(int type, size_t length, UINT32 flags); +UINT8 *new_memory_region(running_machine *machine, int type, size_t length, UINT32 flags); /* free an allocated memory region */ -void free_memory_region(int num); +void free_memory_region(running_machine *machine, int num); /* return a pointer to a specified memory region */ UINT8 *memory_region(int num); @@ -309,10 +324,10 @@ UINT8 *memory_region(int num); size_t memory_region_length(int num); /* return the type of a specified memory region */ -UINT32 memory_region_type(int num); +UINT32 memory_region_type(running_machine *machine, int num); /* return the flags (defined in romload.h) for a specified memory region */ -UINT32 memory_region_flags(int num); +UINT32 memory_region_flags(running_machine *machine, int num); @@ -325,13 +340,13 @@ void CLIB_DECL popmessage(const char *text,...) ATTR_PRINTF(1,2); void CLIB_DECL logerror(const char *text,...) ATTR_PRINTF(1,2); /* adds a callback to be called on logerror() */ -void add_logerror_callback(void (*callback)(const char *)); +void add_logerror_callback(running_machine *machine, void (*callback)(running_machine *, const char *)); /* standardized random number generator */ -UINT32 mame_rand(void); +UINT32 mame_rand(running_machine *machine); /* return the index of the given CPU, or -1 if not found */ -int mame_find_cpu_index(const char *tag); +int mame_find_cpu_index(running_machine *machine, const char *tag); diff --git a/src/mame.mak b/src/mame.mak index 3fd39a716..09e73c4fd 100644 --- a/src/mame.mak +++ b/src/mame.mak @@ -244,6 +244,7 @@ SOUNDS += VRENDER0 #SOUNDS += VOTRAX SOUNDS += ES8712 SOUNDS += RF5C400 +SOUNDS += SPEAKER @@ -354,7 +355,6 @@ $(OBJ)/shared.a: \ $(OBJ)/machine/6526cia.o \ $(OBJ)/machine/6821pia.o \ $(OBJ)/machine/6840ptm.o \ - $(OBJ)/machine/6850acia.o \ $(OBJ)/machine/7474.o \ $(OBJ)/machine/74123.o \ $(OBJ)/machine/74148.o \ @@ -981,6 +981,7 @@ $(OBJ)/nichibut.a: \ $(OBJ)/nintendo.a: \ $(OBJ)/drivers/dkong.o $(OBJ)/sndhrdw/dkong.o $(OBJ)/vidhrdw/dkong.o \ + $(OBJ)/drivers/kinstb.o \ $(OBJ)/drivers/mario.o $(OBJ)/sndhrdw/mario.o $(OBJ)/vidhrdw/mario.o \ $(OBJ)/drivers/n8080.o $(OBJ)/sndhrdw/n8080.o $(OBJ)/vidhrdw/n8080.o \ $(OBJ)/drivers/nss.o $(OBJ)/machine/snes.o $(OBJ)/sndhrdw/snes.o $(OBJ)/vidhrdw/snes.o \ @@ -992,7 +993,7 @@ $(OBJ)/nintendo.a: \ $(OBJ)/machine/drakton.o \ $(OBJ)/machine/rp5h01.o \ $(OBJ)/machine/strtheat.o \ - $(OBJ)/vidhrdw/ppu2c03b.o \ + $(OBJ)/vidhrdw/ppu2c0x.o \ $(OBJ)/nix.a: \ $(OBJ)/drivers/fitfight.o $(OBJ)/vidhrdw/fitfight.o \ @@ -1110,7 +1111,7 @@ $(OBJ)/sega.a: \ $(OBJ)/drivers/system18.o \ $(OBJ)/drivers/system24.o $(OBJ)/machine/system24.o $(OBJ)/vidhrdw/system24.o \ $(OBJ)/drivers/topshoot.o \ - $(OBJ)/drivers/turbo.o $(OBJ)/machine/turbo.o $(OBJ)/sndhrdw/turbo.o $(OBJ)/vidhrdw/turbo.o \ + $(OBJ)/drivers/turbo.o $(OBJ)/sndhrdw/turbo.o $(OBJ)/vidhrdw/turbo.o \ $(OBJ)/drivers/vicdual.o $(OBJ)/sndhrdw/vicdual.o $(OBJ)/vidhrdw/vicdual.o \ $(OBJ)/drivers/zaxxon.o $(OBJ)/sndhrdw/zaxxon.o $(OBJ)/vidhrdw/zaxxon.o \ $(OBJ)/machine/fd1089.o \ @@ -1228,7 +1229,7 @@ $(OBJ)/taito.a: \ $(OBJ)/drivers/fgoal.o $(OBJ)/vidhrdw/fgoal.o \ $(OBJ)/drivers/flstory.o $(OBJ)/machine/flstory.o $(OBJ)/vidhrdw/flstory.o \ $(OBJ)/drivers/gladiatr.o $(OBJ)/vidhrdw/gladiatr.o \ - $(OBJ)/drivers/grchamp.o $(OBJ)/machine/grchamp.o $(OBJ)/sndhrdw/grchamp.o $(OBJ)/vidhrdw/grchamp.o \ + $(OBJ)/drivers/grchamp.o $(OBJ)/sndhrdw/grchamp.o $(OBJ)/vidhrdw/grchamp.o \ $(OBJ)/drivers/groundfx.o $(OBJ)/vidhrdw/groundfx.o \ $(OBJ)/drivers/gsword.o $(OBJ)/machine/tait8741.o $(OBJ)/vidhrdw/gsword.o \ $(OBJ)/drivers/gunbustr.o $(OBJ)/vidhrdw/gunbustr.o \ @@ -1339,7 +1340,7 @@ $(OBJ)/thepit.a: \ $(OBJ)/drivers/timelimt.o $(OBJ)/vidhrdw/timelimt.o \ $(OBJ)/tiamc1.a: \ - $(OBJ)/drivers/tiamc1.o $(OBJ)/vidhrdw/tiamc1.o \ + $(OBJ)/drivers/tiamc1.o $(OBJ)/vidhrdw/tiamc1.o $(OBJ)/sndhrdw/tiamc1.o \ $(OBJ)/toaplan.a: \ $(OBJ)/drivers/mjsister.o $(OBJ)/vidhrdw/mjsister.o \ @@ -1437,6 +1438,7 @@ $(OBJ)/misc.a: \ $(OBJ)/drivers/aztarac.o $(OBJ)/sndhrdw/aztarac.o $(OBJ)/vidhrdw/aztarac.o \ $(OBJ)/drivers/beaminv.o $(OBJ)/vidhrdw/beaminv.o \ $(OBJ)/drivers/bmcbowl.o \ + $(OBJ)/drivers/carrera.o \ $(OBJ)/drivers/cave.o $(OBJ)/vidhrdw/cave.o \ $(OBJ)/drivers/cherrym.o \ $(OBJ)/drivers/coinmstr.o \ @@ -1495,6 +1497,7 @@ $(OBJ)/misc.a: \ $(OBJ)/drivers/pass.o $(OBJ)/vidhrdw/pass.o \ $(OBJ)/drivers/pipeline.o \ $(OBJ)/drivers/pkscram.o \ + $(OBJ)/drivers/pmpoker.o \ $(OBJ)/drivers/pntnpuzl.o \ $(OBJ)/drivers/policetr.o $(OBJ)/vidhrdw/policetr.o \ $(OBJ)/drivers/polyplay.o $(OBJ)/sndhrdw/polyplay.o $(OBJ)/vidhrdw/polyplay.o \ @@ -1563,6 +1566,8 @@ $(OBJ)/drivers/lazercmd.o: $(OBJ)/layout/lazercmd.lh $(OBJ)/drivers/maxaflex.o: $(OBJ)/layout/maxaflex.lh +$(OBJ)/drivers/mpu4.o: $(OBJ)/layout/mpu4.lh \ + $(OBJ)/drivers/meadows.o: $(OBJ)/layout/deadeye.lh \ $(OBJ)/layout/gypsyjug.lh diff --git a/src/mamecore.h b/src/mamecore.h index 4036b8f45..4bc1e46e0 100644 --- a/src/mamecore.h +++ b/src/mamecore.h @@ -41,6 +41,7 @@ typedef void genf(void); /* These are forward struct declarations that are used to break circular dependencies in the code */ +typedef struct _running_machine running_machine; typedef struct _mame_display mame_display; typedef struct _game_driver game_driver; typedef struct _machine_config machine_config; @@ -612,6 +613,7 @@ INLINE int gregorian_days_in_month(int month, int year) /* Used by assert(), so definition here instead of mame.h */ DECL_NORETURN void CLIB_DECL fatalerror(const char *text,...) ATTR_PRINTF(1,2) ATTR_NORETURN; +DECL_NORETURN void CLIB_DECL fatalerror_exitcode(int exitcode, const char *text,...) ATTR_PRINTF(2,3) ATTR_NORETURN; #endif /* __MAMECORE_H__ */ diff --git a/src/mamedriv.c b/src/mamedriv.c index e6df6a84c..4a7eb5907 100644 --- a/src/mamedriv.c +++ b/src/mamedriv.c @@ -744,6 +744,7 @@ const game_driver * const drivers[] = /* Namco FL games */ DRIVER( speedrcr ) /* (c) 1995 */ DRIVER( finalapr ) /* (c) 1995 */ + DRIVER( finalapb ) /* (c) 1995 */ DRIVER( finalapo ) /* (c) 1995 */ /* Namco NA-1 / NA-2 System games */ @@ -1048,6 +1049,9 @@ const game_driver * const drivers[] = DRIVER( nss_fzer ) DRIVER( nss_sten ) + /* SNES-based hacks */ + DRIVER( kinstb ) + /* Midway 8080 b/w games */ DRIVER( seawolf ) /* 596 [1976] */ DRIVER( gunfight ) /* 597 [1975] */ @@ -1281,9 +1285,10 @@ const game_driver * const drivers[] = DRIVER( mpatrol ) /* M52 (c) 1982 */ DRIVER( mpatrolw ) /* M52 (c) 1982 + Williams license */ DRIVER( troangel ) /* (c) 1983 */ - DRIVER( yard ) /* (c) 1983 */ - DRIVER( vsyard ) /* (c) 1983/1984 */ - DRIVER( vsyard2 ) /* (c) 1983/1984 */ + DRIVER( 10yard ) /* (c) 1983 */ + DRIVER( 10yardj ) /* (c) 1983 */ + DRIVER( vs10yard ) /* (c) 1983/1984 */ + DRIVER( vs10yarj ) /* (c) 1983/1984 */ DRIVER( travrusa ) /* (c) 1983 */ DRIVER( motorace ) /* (c) 1983 Williams license */ DRIVER( shtrider ) /* (c) 1984 Seibu Kaihatsu */ @@ -1579,13 +1584,16 @@ const game_driver * const drivers[] = DRIVER( arknoidu ) /* A75 (c) 1986 Taito America Corporation + Romstar license (US) */ DRIVER( arknoiuo ) /* A75 (c) 1986 Taito America Corporation + Romstar license (US) */ DRIVER( arknoidj ) /* A75 (c) 1986 Taito Corporation (Japan) */ - DRIVER( arkbl2 ) /* bootleg */ - DRIVER( arkbl3 ) /* bootleg */ - DRIVER( paddle2 ) /* bootleg */ - DRIVER( arkatayt ) /* bootleg */ + DRIVER( arkmcubl ) /* bootleg */ + DRIVER( ark1ball ) /* bootleg */ + DRIVER( arkangc ) /* bootleg */ + DRIVER( arkangc2 ) /* bootleg */ DRIVER( arkblock ) /* bootleg */ DRIVER( arkbloc2 ) /* bootleg */ - DRIVER( arkangc ) /* bootleg */ + DRIVER( arkgcbl ) /* bootleg */ + DRIVER( paddle2 ) /* bootleg */ + DRIVER( arkatayt ) /* bootleg */ + DRIVER( arktayt2 ) /* bootleg */ DRIVER( arkatour ) /* ??? (c) 1987 Taito America Corporation + Romstar license (US) */ DRIVER( tetrsark ) /* ??? (c) D.R.Korea */ DRIVER( sqix ) /* B03 1987 */ @@ -1719,6 +1727,7 @@ const game_driver * const drivers[] = DRIVER( sbm ) /* C69 (c) 1990 Taito Corporation (Japan) */ DRIVER( selfeena ) /* ??? (c) 1991 East Technology */ DRIVER( silentd ) /* ??? (c) 1992 Taito Corporation Japan (World) */ + DRIVER( silentdu ) /* ??? (c) 1992 Taito Corporation Japan (World) */ DRIVER( silentdj ) /* ??? (c) 1992 Taito Corporation (Japan) */ DRIVER( ryujin ) /* ??? (c) 1993 Taito Corporation (Japan) */ DRIVER( qzshowby ) /* D72 (c) 1993 Taito Corporation (Japan) */ @@ -2174,6 +2183,7 @@ V-V TP-027 DRIVER( commando ) /* 5/1985 (c) 1985 (World) */ DRIVER( commandu ) /* 5/1985 (c) 1985 + Data East license (US) */ DRIVER( commandj ) /* 5/1985 (c) 1985 (Japan) */ + DRIVER( commandb ) /* bootleg */ DRIVER( sinvasn ) /* Europe original? */ DRIVER( sinvasnb ) /* bootleg */ DRIVER( gng ) /* 9/1985 (c) 1985 */ @@ -2686,6 +2696,7 @@ V-V TP-027 DRIVER( xevi3dg ) /* Xevious 3D/G (XV31/VER.A) */ DRIVER( primglex ) /* Prime Goal EX (PG1/VER.A) */ DRIVER( danceyes ) /* Dancing Eyes (DC1/VER.A) */ + DRIVER( pocketrc ) /* Pocket Racer (PKR1/VER.B) */ DRIVER( starswep ) /* Star Sweep (STP1/VER.A) */ DRIVER( myangel3 ) /* Kosodate Quiz My Angel 3 (KQT1/VER.A) */ DRIVER( ptblnk2a ) /* Point Blank 2 (GNB3/VER.A) */ @@ -2821,6 +2832,7 @@ V-V TP-027 DRIVER( wcbwl165 ) /* (c) 1995 Incredible Technologies */ DRIVER( wcbwl161 ) /* (c) 1995 Incredible Technologies */ DRIVER( wcbwl140 ) /* (c) 1995 Incredible Technologies */ + DRIVER( wcbwl15 ) /* (c) 1995 Incredible Technologies */ DRIVER( wcbwl12 ) /* (c) 1995 Incredible Technologies */ DRIVER( sftm ) /* (c) 1995 Capcom/Incredible Technologies */ DRIVER( sftm110 ) /* (c) 1995 Capcom/Incredible Technologies */ @@ -3024,6 +3036,7 @@ V-V TP-027 DRIVER( sscandal ) /* 834-5755 (c) 1985 Coreland / Sega (S1) */ DRIVER( myherok ) /* 834-5755 (c) 1985 Coreland / Sega (S1) */ DRIVER( shtngmst ) /* 834-5719/5720 (c) 1985 (S2) */ + DRIVER( shtngmsa ) /* 834-5719/5720 (c) 1985 (S2) */ DRIVER( chplft ) /* 834-5795 (c) 1985, (c) 1982 Dan Gorlin (S2) */ DRIVER( chplftb ) /* 834-5795 (c) 1985, (c) 1982 Dan Gorlin (S2) */ DRIVER( chplftbl ) /* bootleg (S2) */ @@ -3287,6 +3300,7 @@ DokiDoki Penguin Land *not confirmed DRIVER( strkfgtr ) /* (c) 1991 */ DRIVER( pdrift ) /* (c) 1988 */ DRIVER( pdrifta ) /* (c) 1988 */ + DRIVER( pdrifte ) /* (c) 1988 */ DRIVER( pdriftj ) /* (c) 1988 */ DRIVER( rchase ) /* (c) 1991 */ @@ -3417,7 +3431,7 @@ Sep.1994 Quiz Ghost Hunter DRIVER( rsgun ) /* (c) 1998 Treasure */ DRIVER( sandor ) /* (c) 1995 */ DRIVER( thunt ) /* (c) 1995 Sega (Deniam License) */ - DRIVER( sassisu ) /* (c) 1992 */ + DRIVER( sasissu ) /* (c) 1992 */ DRIVER( seabass ) /* (c) 1998 A wave Inc (Able License) */ DRIVER( shanhigw ) /* (c) 1996 */ DRIVER( shienryu ) /* (c) 1997 Warashi */ @@ -3749,6 +3763,7 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( abattle2 ) /* Sidam */ DRIVER( afire ) /* Rene Pierre */ DRIVER( acombat ) /* bootleg */ + DRIVER( acombato ) /* bootleg */ DRIVER( sstarbtl ) /* bootleg */ DRIVER( tomahawk ) /* (c) [1980?] */ DRIVER( tomahaw5 ) /* (c) [1980?] */ @@ -3798,6 +3813,7 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( pcktgal ) /* (c) 1987 Data East Corporation (Japan) */ DRIVER( pcktgalb ) /* bootleg */ DRIVER( pcktgal2 ) /* (c) 1989 Data East Corporation (World?) */ + DRIVER( pcktgl2j ) /* (c) 1989 Data East Corporation (World?) */ DRIVER( pokechmp ) /* Korean hack of Pocket Gal */ DRIVER( spool3 ) /* (c) 1989 Data East Corporation (World?) */ DRIVER( spool3i ) /* (c) 1990 Data East Corporation + I-Vics license */ @@ -3966,6 +3982,7 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 /* MBK ?? */ /* MBL ?? */ DRIVER( lockload ) /* MBM (c) 1994 Data East Corporation (US) */ + DRIVER( locklodu ) /* MBM (c) 1994 Data East Corporation (US) */ DRIVER( joemacr ) /* MBN (c) 1994 */ DRIVER( joemacra ) /* MBN (c) 1994 */ /* MBO ?? */ @@ -4026,6 +4043,7 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( gridiron ) /* (c) 1985 Tehkan */ DRIVER( teedoff ) /* 6102 - (c) 1986 Tecmo */ DRIVER( solomon ) /* (c) 1986 Tecmo */ + DRIVER( solomonj ) /* (c) 1986 Tecmo */ DRIVER( rygar ) /* 6002 - (c) 1986 Tecmo */ DRIVER( rygar2 ) /* 6002 - (c) 1986 Tecmo */ DRIVER( rygarj ) /* 6002 - (c) 1986 Tecmo */ @@ -4038,6 +4056,7 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( shadowwa ) /* 6215 - (c) 1988 Tecmo (World) */ DRIVER( gaiden ) /* 6215 - (c) 1988 Tecmo (US) */ DRIVER( ryukendn ) /* 6215 - (c) 1989 Tecmo (Japan) */ + DRIVER( ryukenda ) /* 6215 - (c) 1989 Tecmo (Japan) */ DRIVER( wildfang ) /* (c) 1989 Tecmo */ DRIVER( tknight ) /* (c) 1989 Tecmo */ DRIVER( stratof ) /* (c) 1991 Tecmo */ @@ -4085,6 +4104,7 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( atlantol ) /* bootleg */ DRIVER( wizzquiz ) /* (c) 1985 Konami */ DRIVER( wizzquza ) /* (c) 1985 Zilec-Zenitone */ + DRIVER( reaktor ) /* (c) 1985 Zilec */ DRIVER( mastkin ) /* (c) 1988 Du Tech */ DRIVER( rocnrope ) /* GX364 (c) 1983 */ DRIVER( rocnropk ) /* GX364 (c) 1983 + Kosuka */ @@ -4134,6 +4154,7 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( contraj ) /* GX633 (c) 1987 (Japan) */ DRIVER( contrajb ) /* bootleg */ DRIVER( gryzor ) /* GX633 (c) 1987 */ + DRIVER( gryzora ) /* GX633 (c) 1987 */ DRIVER( combasc ) /* GX611 (c) 1988 */ DRIVER( combasct ) /* GX611 (c) 1987 */ DRIVER( combascj ) /* GX611 (c) 1987 (Japan) */ @@ -4225,6 +4246,10 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( ultraman ) /* GX910 (c) 1991 Banpresto/Bandai */ DRIVER( hexion ) /* GX122 (c) 1992 */ DRIVER( lethalen ) /* GX191 (c) 1992 */ + DRIVER( lethalua ) /* GX191 (c) 1992 */ + DRIVER( lethalux ) /* GX191 (c) 1992 */ + DRIVER( letheab ) /* GX191 (c) 1992 */ + DRIVER( letheae ) /* GX191 (c) 1992 */ DRIVER( lethalej ) /* GX191 (c) 1992 */ /* Konami "Nemesis hardware" games */ @@ -5968,6 +5993,7 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( s1945a ) /* (c) 1995 */ DRIVER( s1945j ) /* (c) 1995 */ DRIVER( s1945jn ) /* (c) 1995 */ + DRIVER( s1945k ) /* (c) 1995 */ DRIVER( tengai ) /* (c) 1996 */ DRIVER( s1945ii ) /* (c) 1997 */ DRIVER( soldivid ) /* (c) 1997 */ @@ -6001,6 +6027,7 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( hopprobo ) /* (c) 1983 Sega */ DRIVER( wanted ) /* (c) 1984 Sigma Ent. Inc. */ DRIVER( funkybee ) /* (c) 1982 Orca */ + DRIVER( funkbeeb ) /* (c) 1982 Orca */ DRIVER( skylancr ) /* (c) 1983 Orca */ DRIVER( skylance ) /* (c) 1983 Orca + Esco Trading Co license */ DRIVER( zodiack ) /* (c) 1983 Orca + Esco Trading Co license */ @@ -6085,6 +6112,7 @@ BOMULEUL CHAJARA SEGA ST-V 1997/04/11 DRIVER( galpanib ) /* (c) 1990 Kaneko */ DRIVER( galpania ) /* (c) 1990 Kaneko */ DRIVER( galpani2 ) /* (c) 1993 Kaneko */ + DRIVER( galpan2g ) /* (c) 1993 Kaneko */ DRIVER( galpan2t ) /* (c) 1993 Kaneko */ DRIVER( gpan2qiz ) /* (c) 1993 Kaneko */ DRIVER( jchan ) /* (c) 1995 Kaneko */ @@ -6462,6 +6490,7 @@ Other Sun games DRIVER( tgtballa ) /* (c) 1995 Yun Sung */ DRIVER( torus ) /* (c) 1996 Yun Sung */ DRIVER( madball ) /* (c) 1998 Yun Sung */ + DRIVER( madballn ) /* (c) 1998 Yun Sung */ DRIVER( cannball ) /* (c) 1995 Yun Sung / Soft Visio */ DRIVER( magix ) /* (c) 1995 Yun Sung */ DRIVER( rocktris ) /* (c) 1994? Yun Sung */ @@ -6810,6 +6839,9 @@ Other Sun games DRIVER( sltblgp1 ) /* 1996 */ DRIVER( gldncrwn ) /* 1997 */ + /* MPU4 Non-Video SWPs */ + DRIVER( connect4 ) /* Dolbeck Systems */ + /* MPU4+Video Board Games */ DRIVER( bctvidbs ) DRIVER( crmaze ) /* 1994 */ @@ -6895,6 +6927,7 @@ Other Sun games DRIVER( gt103asx ) /* (c) 1984 Greyhound Electronics */ DRIVER( gt103aa ) /* (c) 1984 Greyhound Electronics */ DRIVER( gt103ab ) /* (c) 1984 Greyhound Electronics */ + DRIVER( reelfun ) /* (c) 1986 Grayhound Electronics */ DRIVER( findout ) /* (c) 1987 [Elettronolo] */ DRIVER( quiz ) /* (c) 1986 Italian bootleg */ DRIVER( quiz211 ) /* (c) 1986 Italian bootleg */ @@ -6923,6 +6956,7 @@ Other Sun games DRIVER( flower ) /* (c) 1986 Komax */ DRIVER( flowerbl ) /* bootleg but (c) 1986 Sega/Alpha */ DRIVER( beaminv ) /* Tekunon Kougyou */ + DRIVER( beaminva ) /* Tekunon Kougyou */ DRIVER( mcatadv ) /* (c) 1993 Wintechno */ DRIVER( mcatadvj ) /* (c) 1993 Wintechno */ DRIVER( catt ) /* (c) 1993 Wintechno */ @@ -6982,6 +7016,7 @@ Other Sun games DRIVER( cclown ) /* (c) 1999 LAI Games */ DRIVER( rotaryf ) DRIVER( sbugger ) /* (c) 1981 Game-A-Tron */ + DRIVER( sbuggera ) /* (c) 1981 Game-A-Tron */ DRIVER( portrait ) /* (c) 1983 Olympia */ DRIVER( portrata ) /* (c) 1983 Olympia */ DRIVER( enigma2 ) /* (c) 1981 Game Plan (Zilec Electronics license) */ @@ -7116,6 +7151,7 @@ Other Sun games DRIVER( fortecar ) DRIVER( jackpool ) /* (c) 1997 Electronic Projects */ DRIVER( murogem ) /* ??? */ + DRIVER( murogema ) /* ??? */ DRIVER( quizmstr ) /* (c) 1985 Coinmaster */ DRIVER( trailblz ) /* (c) 1987 Coinmaster */ DRIVER( supnudg2 ) /* (c) 1989 Coinmaster */ @@ -7147,5 +7183,10 @@ Other Sun games DRIVER( sb2003 ) /* (c) 2003 Limenko */ DRIVER( sb2003a ) /* (c) 2003 Limenko */ DRIVER( legendoh ) /* (c) 2003 Limenko */ + DRIVER( carrera ) /* (c) 19?? BS Electronics */ + DRIVER( pmpoker ) /* (c) 198? PlayMan? */ + DRIVER( goldnpkr ) /* (c) 198? Bonanza? */ + DRIVER( jokerpkr ) /* (c) 198? Coinmaster-Gaming */ + DRIVER( pottnpkr ) /* (c) 198? ???? */ #endif /* DRIVER_RECURSIVE */ diff --git a/src/memory.c b/src/memory.c index 1a885505b..6ff25e412 100644 --- a/src/memory.c +++ b/src/memory.c @@ -93,7 +93,7 @@ #include "driver.h" #include "profiler.h" -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG #include "debug/debugcpu.h" #endif #include @@ -157,7 +157,7 @@ #define SUBTABLE_PTR(tabledata, entry) (&(tabledata)->table[(1 << LEVEL1_BITS) + (((entry) - SUBTABLE_BASE) << LEVEL2_BITS)]) -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG #define DEBUG_HOOK_READ(a,b,c) if (debug_hook_read) (*debug_hook_read)(a, b, c) #define DEBUG_HOOK_WRITE(a,b,c,d) if (debug_hook_write) (*debug_hook_write)(a, b, c, d) #else @@ -296,7 +296,7 @@ static int log_unmap[ADDRESS_SPACES]; /* log unmapped memory accesses */ static cpu_data cpudata[MAX_CPU]; /* data gathered for each CPU */ static bank_data bankdata[STATIC_COUNT]; /* data gathered for each bank */ -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG static debug_hook_read_ptr debug_hook_read; /* pointer to debugger callback for memory reads */ static debug_hook_write_ptr debug_hook_write; /* pointer to debugger callback for memory writes */ #endif @@ -415,7 +415,7 @@ static void mem_dump(void) memory_init - initialize the memory system -------------------------------------------------*/ -int memory_init(void) +int memory_init(running_machine *machine) { int i; @@ -437,7 +437,7 @@ int memory_init(void) /* init the CPUs */ if (!init_cpudata()) return 1; - add_exit_callback(memory_exit); + add_exit_callback(machine, memory_exit); /* preflight the memory handlers and check banks */ if (!preflight_memory()) @@ -465,7 +465,7 @@ int memory_init(void) memory_exit - free memory -------------------------------------------------*/ -void memory_exit(void) +void memory_exit(running_machine *machine) { int cpunum, spacenum; @@ -538,7 +538,7 @@ void memory_set_context(int activecpu) opbasefunc = cpudata[activecpu].opbase; -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG if (activecpu != -1) debug_get_memory_hooks(activecpu, &debug_hook_read, &debug_hook_write); else @@ -1506,7 +1506,7 @@ static void install_mem_handler(addrspace_data *space, int iswrite, int databits /* sanity check */ if (HANDLER_IS_RAM(handler)) - assert_always(mame_get_phase() == MAME_PHASE_INIT, "RAM/ROM memory handlers can only be installed at init time"); + assert_always(mame_get_phase(Machine) == MAME_PHASE_INIT, "RAM/ROM memory handlers can only be installed at init time"); /* translate ROM to RAM/UNMAP here */ if (HANDLER_IS_ROM(handler)) @@ -2275,7 +2275,8 @@ static int find_memory(void) if (!IS_AMENTRY_EXTENDED(map)) { /* assign base/size values */ - if (map->base) *map->base = map->memory; + if (map->base != NULL) + *map->base = map->memory; if (map->size) { if (!IS_AMENTRY_MATCH_MASK(map)) diff --git a/src/memory.h b/src/memory.h index 254732135..86d536511 100644 --- a/src/memory.h +++ b/src/memory.h @@ -667,9 +667,17 @@ address_map *construct_map_##_name(address_map *map) \ #define AM_BASE(_base) \ map->base = (void **)(base = _base); \ +#define AM_BASE_MEMBER(_struct, _member) \ + if (Machine != NULL && Machine->driver_data != NULL) \ + map->base = (void **)(base = &((_struct *)Machine->driver_data)->_member);\ + #define AM_SIZE(_size) \ map->size = _size; \ +#define AM_SIZE_MEMBER(_struct, _member) \ + if (Machine != NULL && Machine->driver_data != NULL) \ + map->size = &((_struct *)Machine->driver_data)->(_member); \ + /* ----- common shortcuts ----- */ #define AM_READWRITE(_read,_write) AM_READ(_read) AM_WRITE(_write) #define AM_ROM AM_READ((_rh_t)STATIC_ROM) @@ -885,8 +893,8 @@ void io_write_qword_64le(offs_t address, UINT64 data); ***************************************************************************/ /* ----- memory setup function ----- */ -int memory_init(void); -void memory_exit(void); +int memory_init(running_machine *machine); +void memory_exit(running_machine *machine); void memory_set_context(int activecpu); /* ----- address map functions ----- */ diff --git a/src/options.c b/src/options.c index 620cbd472..b8fb9b272 100644 --- a/src/options.c +++ b/src/options.c @@ -336,10 +336,12 @@ void options_output_ini_file(FILE *inifile) /* otherwise, output entries for all non-deprecated and non-command items */ else if ((data->flags & (OPTION_DEPRECATED | OPTION_COMMAND)) == 0 && data->names[0][0] != 0) { - if (data->data != NULL) - fprintf(inifile, "%-25s %s\n", data->names[0], data->data); - else + if (data->data == NULL) fprintf(inifile, "# %-23s (not set)\n", data->names[0]); + else if (strchr(data->data, ' ')) + fprintf(inifile, "%-25s \"%s\"\n", data->names[0], data->data); + else + fprintf(inifile, "%-25s %s\n", data->names[0], data->data); } } } @@ -364,10 +366,12 @@ void options_output_ini_mame_file(mame_file *inifile) /* otherwise, output entries for all non-deprecated and non-command items */ else if ((data->flags & (OPTION_DEPRECATED | OPTION_COMMAND)) == 0 && data->names[0][0] != 0) { - if (data->data != NULL) - mame_fprintf(inifile, "%-25s %s\n", data->names[0], data->data); - else + if (data->data == NULL) mame_fprintf(inifile, "# %-23s (not set)\n", data->names[0]); + else if (strchr(data->data, ' ')) + mame_fprintf(inifile, "%-25s \"%s\"\n", data->names[0], data->data); + else + mame_fprintf(inifile, "%-25s %s\n", data->names[0], data->data); } } } diff --git a/src/osdepend.h b/src/osdepend.h index cb43f0549..d83e6ad54 100644 --- a/src/osdepend.h +++ b/src/osdepend.h @@ -18,11 +18,11 @@ #include "timer.h" #include -int osd_init(void); +int osd_init(running_machine *machine); + -#ifdef NEW_DEBUGGER void osd_wait_for_debugger(void); -#endif + /****************************************************************************** @@ -250,6 +250,9 @@ int osd_display_loading_rom_message(const char *name,rom_load_data *romdata); /* checks to see if a pointer is bad */ int osd_is_bad_read_ptr(const void *ptr, size_t size); +/* breaks into OSD debugger if attached */ +void osd_break_into_debugger(const char *message); + /* multithreading locks; only need to implement if you use threads */ typedef struct _osd_lock osd_lock; osd_lock *osd_lock_alloc(void); diff --git a/src/output.c b/src/output.c index b3b601e4b..2e83ead3f 100644 --- a/src/output.c +++ b/src/output.c @@ -63,7 +63,7 @@ static UINT32 uniqueid = 12345; FUNCTION PROTOTYPES ***************************************************************************/ -static void output_exit(void); +static void output_exit(running_machine *machine); @@ -143,10 +143,10 @@ INLINE output_item *create_new_item(const char *outname, INT32 value) output_init - initialize everything -------------------------------------------------*/ -void output_init(void) +void output_init(running_machine *machine) { /* get a callback when done */ - add_exit_callback(output_exit); + add_exit_callback(machine, output_exit); /* reset the lists */ memset(itemtable, 0, sizeof(itemtable)); @@ -158,7 +158,7 @@ void output_init(void) output_exit - cleanup on exit -------------------------------------------------*/ -static void output_exit(void) +static void output_exit(running_machine *machine) { output_notify *notify; output_item *item; @@ -227,6 +227,32 @@ void output_set_value(const char *outname, INT32 value) } +/*------------------------------------------------- + output_set_indexed_value - set the value of an + indexed output +-------------------------------------------------*/ + +void output_set_indexed_value(const char *basename, int index, int value) +{ + char buffer[100]; + char *dest = buffer; + + /* copy the string */ + while (*basename != 0) + *dest++ = *basename++; + + /* append the index */ + if (index > 1000) *dest++ = '0' + ((index / 1000) % 10); + if (index > 100) *dest++ = '0' + ((index / 100) % 10); + if (index > 10) *dest++ = '0' + ((index / 10) % 10); + *dest++ = '0' + (index % 10); + *dest++ = 0; + + /* set the value */ + output_set_value(buffer, value); +} + + /*------------------------------------------------- output_get_value - return the value of an output @@ -243,6 +269,32 @@ INT32 output_get_value(const char *outname) } +/*------------------------------------------------- + output_get_indexed_value - get the value of an + indexed output +-------------------------------------------------*/ + +INT32 output_get_indexed_value(const char *basename, int index) +{ + char buffer[100]; + char *dest = buffer; + + /* copy the string */ + while (*basename != 0) + *dest++ = *basename++; + + /* append the index */ + if (index > 1000) *dest++ = '0' + ((index / 1000) % 10); + if (index > 100) *dest++ = '0' + ((index / 100) % 10); + if (index > 10) *dest++ = '0' + ((index / 10) % 10); + *dest++ = '0' + (index % 10); + *dest++ = 0; + + /* set the value */ + return output_get_value(buffer); +} + + /*------------------------------------------------- output_set_notifier - sets a notifier callback for a particular output, or for all outputs diff --git a/src/output.h b/src/output.h index 131709bca..4951c27fb 100644 --- a/src/output.h +++ b/src/output.h @@ -28,14 +28,20 @@ typedef void (*output_notifier)(const char *outname, INT32 value, void *param); ***************************************************************************/ /* core initialization */ -void output_init(void); +void output_init(running_machine *machine); /* set the value for a given output */ void output_set_value(const char *outname, INT32 value); +/* set an indexed value for an output (concatenates basename + index) */ +void output_set_indexed_value(const char *basename, int index, int value); + /* return the current value for a given output */ INT32 output_get_value(const char *outname); +/* return the current value for a given indexed output */ +INT32 output_get_indexed_value(const char *outname, int index); + /* set a notifier on a particular output, or globally if NULL */ void output_set_notifier(const char *outname, output_notifier callback, void *param); @@ -49,4 +55,41 @@ UINT32 output_name_to_id(const char *outname); const char *output_id_to_name(UINT32 id); + +/*************************************************************************** + INLINES +***************************************************************************/ + +INLINE void output_set_led_value(int index, int value) +{ + output_set_indexed_value("led", index, value ? 1 : 0); +} + +INLINE void output_set_lamp_value(int index, int value) +{ + output_set_indexed_value("lamp", index, value); +} + +INLINE void output_set_digit_value(int index, int value) +{ + output_set_indexed_value("digit", index, value); +} + + +INLINE void output_get_led_value(int index, int value) +{ + output_get_indexed_value("led", index); +} + +INLINE void output_get_lamp_value(int index, int value) +{ + output_get_indexed_value("lamp", index); +} + +INLINE void output_get_digit_value(int index, int value) +{ + output_get_indexed_value("digit", index); +} + + #endif /* __OUTPUT_H__ */ diff --git a/src/palette.c b/src/palette.c index e6a0c3ffb..a6d5d2bf2 100644 --- a/src/palette.c +++ b/src/palette.c @@ -11,9 +11,6 @@ #include "driver.h" #include -#if defined(MAME_DEBUG) && !defined(NEW_DEBUGGER) -#include "debug/mamedbg.h" -#endif #define VERBOSE 0 @@ -24,6 +21,7 @@ #define PEN_BRIGHTNESS_BITS 8 #define MAX_PEN_BRIGHTNESS (4 << PEN_BRIGHTNESS_BITS) +#define MAX_SHADOW_PRESETS 4 enum { @@ -48,38 +46,71 @@ struct _callback_item }; +/* typedef struct _palette_private palette_private; */ +struct _palette_private +{ + rgb_t *raw_color; + rgb_t *adjusted_color; -/*************************************************************************** - GLOBAL VARIABLES -***************************************************************************/ + UINT16 *pen_brightness; + + UINT16 shadow_factor, highlight_factor; + + UINT8 colormode; + pen_t total_colors; + pen_t total_colors_with_ui; + + pen_t black_pen, white_pen; -UINT16 *palette_shadow_table; + callback_item *notify_callback_list; -rgb_t *game_palette; /* RGB palette as set by the driver */ -rgb_t *adjusted_palette; /* actual RGB palette after brightness/gamma adjustments */ -static UINT16 *pen_brightness; + UINT32 *shadow_table_base[MAX_SHADOW_PRESETS]; + int shadow_dr[MAX_SHADOW_PRESETS]; + int shadow_dg[MAX_SHADOW_PRESETS]; + int shadow_db[MAX_SHADOW_PRESETS]; + int shadow_noclip[MAX_SHADOW_PRESETS]; +}; + + +/* -static UINT16 shadow_factor, highlight_factor; + Machine->drv->total_colors = reported colors -static UINT8 colormode, highlight_method; -static pen_t total_colors; -static pen_t total_colors_with_ui; + palette->total_colors = + Machine->drv->total_colors + + Machine->drv->total_colors (if shadows) + + Machine->drv->total_colors (if highlights) -static pen_t black_pen, white_pen; + palette->total_colors_with_ui = + palette->total_colors -static callback_item *notify_callback_list; + raw_color[palette->total_colors + 2] + adjusted_color[palette->total_colors + 2] + machine->pens[palette->total_colors] + palette->pen_brightness[palette->total_colors] + + machine->game_colortable[Machine->drv->color_table_len] + machine->remapped_colortable[Machine->drv->color_table_len] (or -> machine->pens) + + palette->shadow_table_base[MAX_SHADOW_PRESETS] + - contains array mapping pens to shadow pens + - by default, tables 0 and 2 point to shadows, tables 1 and 3 point to hilights + - shadows go from Machine->drv->total_colors to 2*Machine->drv->total_colors + - hilights go from 2*Machine->drv->total_colors to 3*Machine->drv->total_colors +*/ /*************************************************************************** FUNCTION PROTOTYPES ***************************************************************************/ -static void palette_exit(void); -static void palette_alloc(void); +static void configure_rgb_shadows(running_machine *machine, int mode, float factor); +static void palette_exit(running_machine *machine); +static void palette_alloc(running_machine *machine, palette_private *palette); static void palette_reset(void); -static void recompute_adjusted_palette(void); -static void internal_modify_pen(pen_t pen, rgb_t color, int pen_bright); +static void recompute_adjusted_colors(running_machine *machine); +static void internal_modify_pen(running_machine *machine, palette_private *palette, pen_t pen, rgb_t color, int pen_bright); @@ -99,18 +130,6 @@ INLINE UINT16 rgb_to_direct15(rgb_t rgb) -/*------------------------------------------------- - rgb_to_direct32 - convert an RGB triplet to - a 32-bit OSD-specified RGB value --------------------------------------------------*/ - -INLINE UINT32 rgb_to_direct32(rgb_t rgb) -{ - return rgb; -} - - - /*------------------------------------------------- adjust_palette_entry - adjust a palette entry for brightness and gamma @@ -131,10 +150,10 @@ INLINE rgb_t adjust_palette_entry(rgb_t entry, int pen_bright) notifiers that a pen has changed -------------------------------------------------*/ -INLINE void notify_pen_changed(int pen, rgb_t newval) +INLINE void notify_pen_changed(palette_private *palette, int pen, rgb_t newval) { callback_item *cb; - for (cb = notify_callback_list; cb; cb = cb->next) + for (cb = palette->notify_callback_list; cb; cb = cb->next) (*cb->notify)(cb->param, pen, newval); } @@ -145,547 +164,182 @@ INLINE void notify_pen_changed(int pen, rgb_t newval) takes place before the display is created -------------------------------------------------*/ -void palette_init(void) +void palette_init(running_machine *machine) { - /* init statics */ - shadow_factor = (int)(PALETTE_DEFAULT_SHADOW_FACTOR * (double)(1 << PEN_BRIGHTNESS_BITS)); - highlight_factor = (int)(PALETTE_DEFAULT_HIGHLIGHT_FACTOR * (double)(1 << PEN_BRIGHTNESS_BITS)); + palette_private *palette = auto_malloc(sizeof(*palette)); + machine->palette_data = palette; + + /* request cleanup */ + add_exit_callback(machine, palette_exit); - notify_callback_list = NULL; - add_exit_callback(palette_exit); + /* reset all our data */ + memset(palette, 0, sizeof(*palette)); + palette->shadow_factor = (int)(PALETTE_DEFAULT_SHADOW_FACTOR * (double)(1 << PEN_BRIGHTNESS_BITS)); + palette->highlight_factor = (int)(PALETTE_DEFAULT_HIGHLIGHT_FACTOR * (double)(1 << PEN_BRIGHTNESS_BITS)); /* determine the color mode */ - if (Machine->color_depth == 15) - colormode = DIRECT_15BIT; - else if (Machine->color_depth == 32) - colormode = DIRECT_32BIT; + if (machine->color_depth == 15) + palette->colormode = DIRECT_15BIT; + else if (machine->color_depth == 32) + palette->colormode = DIRECT_32BIT; else - colormode = PALETTIZED_16BIT; - - highlight_method = 0; + palette->colormode = PALETTIZED_16BIT; /* ensure that RGB direct video modes don't have a colortable */ - assert_always(!(Machine->drv->video_attributes & VIDEO_RGB_DIRECT) || Machine->drv->color_table_len == 0, - "Error: VIDEO_RGB_DIRECT requires color_table_len to be 0."); +// assert_always(!(machine->drv->video_attributes & VIDEO_RGB_DIRECT) || machine->drv->color_table_len == 0, +// "Error: VIDEO_RGB_DIRECT requires color_table_len to be 0."); /* compute the total colors, including shadows and highlights */ - total_colors = Machine->drv->total_colors; - if (Machine->drv->video_attributes & VIDEO_HAS_SHADOWS && !(colormode & DIRECT_RGB)) - total_colors += Machine->drv->total_colors; - if (Machine->drv->video_attributes & VIDEO_HAS_HIGHLIGHTS && !(colormode & DIRECT_RGB)) - total_colors += Machine->drv->total_colors; - total_colors_with_ui = total_colors; + palette->total_colors = machine->drv->total_colors; + if ((machine->drv->video_attributes & VIDEO_HAS_SHADOWS) && !(palette->colormode & DIRECT_RGB)) + palette->total_colors += machine->drv->total_colors; + if ((machine->drv->video_attributes & VIDEO_HAS_HIGHLIGHTS) && !(palette->colormode & DIRECT_RGB)) + palette->total_colors += machine->drv->total_colors; + palette->total_colors_with_ui = palette->total_colors; /* make sure we still fit in 16 bits */ - assert_always(total_colors <= 65536, "Error: palette has more than 65536 colors."); + assert_always(palette->total_colors <= 65536, "Error: palette has more than 65536 colors."); /* allocate all the data structures */ - palette_alloc(); + palette_alloc(machine, palette); /* set up save/restore of the palette */ - state_save_register_global_pointer(game_palette, total_colors); - state_save_register_global_pointer(pen_brightness, Machine->drv->total_colors); + state_save_register_global_pointer(palette->raw_color, palette->total_colors); + state_save_register_global_pointer(palette->pen_brightness, machine->drv->total_colors); state_save_register_func_postload(palette_reset); } -static void palette_exit(void) -{ - /* free the list of notifiers */ - while (notify_callback_list != NULL) - { - callback_item *temp = notify_callback_list; - notify_callback_list = notify_callback_list->next; - free(temp); - } -} - - /*------------------------------------------------- - palette_add_notifier - request a callback on - changing of a palette entry --------------------------------------------------*/ - -void palette_add_notifier(void (*callback)(void *, int, rgb_t), void *param) -{ - callback_item *cb; - - assert_always(mame_get_phase() == MAME_PHASE_INIT, "Can only call add_exit_callback at init time!"); - - /* allocate memory */ - cb = malloc_or_die(sizeof(*cb)); - - /* add us to the head of the list */ - cb->notify = callback; - cb->param = param; - cb->next = notify_callback_list; - notify_callback_list = cb; -} - - - - -//* 072703AT (last update) -/*------------------------------------------------- - - palette_set_shadow_mode(mode) - - mode: 0 = use preset 0 (default shadow) - 1 = use preset 1 (default highlight) - 2 = use preset 2 * - 3 = use preset 3 * - - * Preset 2 & 3 work independently under 32bpp, - supporting up to four different types of - shadows at one time. They mirror preset 1 & 2 - in lower depth settings to maintain - compatibility. - - - palette_set_shadow_factor32(factor) - - factor: 1.0(normal) to 0.0(pitch black) - - - palette_set_highlight_factor32(factor) - - factor: 1.0(normal) and up(brighter) - - - palette_set_shadow_dRGB32(mode, dr, dg, db, noclip) - - mode: 0 to 3 (which preset to configure) - - dr: -255 to 255 ( red displacement ) - dg: -255 to 255 ( green displacement ) - db: -255 to 255 ( blue displacement ) - - noclip: 0 = resultant RGB clipped at 0x00/0xff - 1 = resultant RGB wraparound 0x00/0xff - - - * Color shadows only work under 32bpp. - This function has no effect in lower color - depths where - - palette_set_shadow_factor32() or - palette_set_highlight_factor32() - - should be used instead. - - * 32-bit shadows are lossy. Even with zero RGB - displacements the affected area will still look - slightly darkened. - - Drivers should ensure all shadow pens in - gfx_drawmode_table[] are set to DRAWMODE_NONE - when RGB displacements are zero to avoid the - darkening effect. - + palette_exit - free any allocated memory -------------------------------------------------*/ -#define MAX_SHADOW_PRESETS 4 - -static UINT32 *shadow_table_base[MAX_SHADOW_PRESETS]; - -static void internal_set_shadow_preset(int mode, double factor, int dr, int dg, int db, int noclip, int style, int init) +static void palette_exit(running_machine *machine) { -#define FP 16 -#define FMAX (0x1f<= MAX_SHADOW_PRESETS) return; - - if ((table_ptr32 = shadow_table_base[mode]) == NULL) return; - - if (style) // monotone shadows(style 1) or highlights(style 2) - { - if (factor < 0) factor = 0; - - if (!init && oldfactor[mode] == factor) return; - - oldfactor[mode] = factor; - oldRGB[mode][2] = oldRGB[mode][1] = oldRGB[mode][0] = -1; - - if (!(colormode & DIRECT_RGB)) - { - switch (style) - { - // modify shadows(first upper palette) - case 1: - palette_set_shadow_factor(factor); - break; - - // modify highlights(second upper palette) - case 2: - palette_set_highlight_factor(factor); - break; + palette_private *palette = machine->palette_data; - default: return; - } - } - else - { - d32 = (colormode == DIRECT_32BIT); - - if (factor <= 1.0) - { - fl = (int)(factor * (1<>FP & 0x7c00; - g = g>>FP & 0x03e0; - b = b>>FP & 0x001f; - - if (d32) - table_ptr32[i] = (UINT32)(r<<9 | g<<6 | b<<3); - else - ((UINT16*)table_ptr32)[i] = (UINT16)(r | g | b); - } - } - else - { - if (highlight_method == 0) - { - fl = (int)(factor * (1<>10 & 0x1f) * fl; - g = (i>>5 & 0x1f) * fl; - b = (i & 0x1f) * fl; - - if (r >= FMAX) r = 0x7c00; else r = r>>(FP-10) & 0x7c00; - if (g >= FMAX) g = 0x03e0; else g = g>>(FP-5) & 0x03e0; - if (b >= FMAX) b = 0x001f; else b = b>>(FP); - - if (d32) - table_ptr32[i] = (UINT32)(r<<9 | g<<6 | b<<3); - else - ((UINT16*)table_ptr32)[i] = (UINT16)(r | g | b); - } - } - else if (highlight_method == 1) - { - fl = (int)(factor * (1<>10 & 0x1f) * fl; - g = (i>>5 & 0x1f) * fl; - b = (i & 0x1f) * fl; - ov = 0; - - if (r > FMAX) ov += r - FMAX; - if (g > FMAX) ov += g - FMAX; - if (b > FMAX) ov += b - FMAX; - - if (ov) { ov >>= 2; r += ov; g += ov; b += ov; } - - if (r >= FMAX) r = 0x7c00; else r = r>>(FP-10) & 0x7c00; - if (g >= FMAX) g = 0x03e0; else g = g>>(FP-5) & 0x03e0; - if (b >= FMAX) b = 0x001f; else b = b>>(FP); - - if (d32) - table_ptr32[i] = (UINT32)(r<<9 | g<<6 | b<<3); - else - ((UINT16*)table_ptr32)[i] = (UINT16)(r | g | b); - } - } - else - { - fl = (int)(factor * 31 - 31); - dr = fl<<10; - dg = fl<<5; - db = fl; - - for (i=0; i<32768; i++) - { - r = (i & 0x7c00) + dr; - g = (i & 0x03e0) + dg; - b = (i & 0x001f) + db; - - if (r > 0x7c00) r = 0x7c00; - if (g > 0x03e0) g = 0x03e0; - if (b > 0x001f) b = 0x001f; - - if (d32) - table_ptr32[i] = (UINT32)(r<<9 | g<<6 | b<<3); - else - ((UINT16*)table_ptr32)[i] = (UINT16)(r | g | b); - } - } // end of highlight_methods - } // end of factor - } // end of colormode - - #if VERBOSE - popmessage("shadow %d recalc factor:%1.2f style:%d", mode, factor, style); - #endif - } - else // color shadows or highlights(style 0) + /* free the list of notifiers */ + while (palette->notify_callback_list != NULL) { - if (!(colormode & DIRECT_RGB)) return; - - if (dr < -0xff) dr = -0xff; else if (dr > 0xff) dr = 0xff; - if (dg < -0xff) dg = -0xff; else if (dg > 0xff) dg = 0xff; - if (db < -0xff) db = -0xff; else if (db > 0xff) db = 0xff; - dr >>= 3; dg >>= 3; db >>= 3; - - if (!init && oldclip==noclip && oldRGB[mode][0]==dr && oldRGB[mode][1]==dg && oldRGB[mode][2]==db) return; - - oldclip = noclip; - oldRGB[mode][0] = dr; oldRGB[mode][1] = dg; oldRGB[mode][2] = db; - oldfactor[mode] = -1; - - #if VERBOSE - popmessage("shadow %d recalc %d %d %d %02x", mode, dr, dg, db, noclip); - #endif - - dr <<= 10; dg <<= 5; - d32 = (colormode == DIRECT_32BIT); - - if (noclip) - { - for (i=0; i<32768; i++) - { - r = (i & 0x7c00) + dr; - g = (i & 0x03e0) + dg; - b = (i & 0x001f) + db; - - r &= 0x7c00; - g &= 0x03e0; - b &= 0x001f; - - if (d32) - table_ptr32[i] = (UINT32)(r<<9 | g<<6 | b<<3); - else - ((UINT16*)table_ptr32)[i] = (UINT16)(r | g | b); - } - } - else - { - for (i=0; i<32768; i++) - { - r = (i & 0x7c00) + dr; - g = (i & 0x03e0) + dg; - b = (i & 0x001f) + db; - - if (r < 0) r = 0; else if (r > 0x7c00) r = 0x7c00; - if (g < 0) g = 0; else if (g > 0x03e0) g = 0x03e0; - if (b < 0) b = 0; else if (b > 0x001f) b = 0x001f; - - if (d32) - table_ptr32[i] = (UINT32)(r<<9 | g<<6 | b<<3); - else - ((UINT16*)table_ptr32)[i] = (UINT16)(r | g | b); - } - } + callback_item *temp = palette->notify_callback_list; + palette->notify_callback_list = palette->notify_callback_list->next; + free(temp); } -#undef FP -#undef FMAX -} - - -void palette_set_shadow_mode(int mode) -{ - if (mode >= 0 && mode < MAX_SHADOW_PRESETS) palette_shadow_table = (UINT16*)shadow_table_base[mode]; -} - - -void palette_set_shadow_factor32(double factor) -{ - internal_set_shadow_preset(0, factor, 0, 0, 0, 0, 1, 0); } -void palette_set_highlight_factor32(double factor) -{ - internal_set_shadow_preset(1, factor, 0, 0, 0, 0, 2, 0); -} - - -void palette_set_shadow_dRGB32(int mode, int dr, int dg, int db, int noclip) -{ - internal_set_shadow_preset(mode, 0, dr, dg, db, noclip, 0, 0); -} - - -void palette_set_highlight_method(int method) -{ - highlight_method = method; -} - - - /*------------------------------------------------- palette_alloc - allocate memory for palette structures -------------------------------------------------*/ -static void palette_alloc(void) +static void palette_alloc(running_machine *machine, palette_private *palette) { - int max_total_colors = total_colors + 2; + int max_total_colors = palette->total_colors + 2; int i; /* allocate memory for the raw game palette */ - game_palette = auto_malloc(max_total_colors * sizeof(game_palette[0])); + palette->raw_color = auto_malloc(max_total_colors * sizeof(palette->raw_color[0])); for (i = 0; i < max_total_colors; i++) - game_palette[i] = MAKE_RGB((i & 1) * 0xff, ((i >> 1) & 1) * 0xff, ((i >> 2) & 1) * 0xff); + palette->raw_color[i] = MAKE_RGB((i & 1) * 0xff, ((i >> 1) & 1) * 0xff, ((i >> 2) & 1) * 0xff); /* allocate memory for the adjusted game palette */ - adjusted_palette = auto_malloc(max_total_colors * sizeof(adjusted_palette[0])); + palette->adjusted_color = auto_malloc(max_total_colors * sizeof(palette->adjusted_color[0])); for (i = 0; i < max_total_colors; i++) - adjusted_palette[i] = game_palette[i]; + palette->adjusted_color[i] = palette->raw_color[i]; /* for 16bpp, notify that all pens have changed */ - if (colormode == PALETTIZED_16BIT) + if (palette->colormode == PALETTIZED_16BIT) for (i = 0; i < max_total_colors; i++) - notify_pen_changed(i, adjusted_palette[i]); + notify_pen_changed(palette, i, palette->adjusted_color[i]); /* allocate memory for the pen table */ - if (total_colors > 0) + if (palette->total_colors > 0) { - Machine->pens = auto_malloc(total_colors * sizeof(Machine->pens[0])); - for (i = 0; i < total_colors; i++) - Machine->pens[i] = i; + machine->pens = auto_malloc(palette->total_colors * sizeof(machine->pens[0])); + for (i = 0; i < palette->total_colors; i++) + machine->pens[i] = i; /* allocate memory for the per-entry brightness table */ - pen_brightness = auto_malloc(Machine->drv->total_colors * sizeof(pen_brightness[0])); - for (i = 0; i < Machine->drv->total_colors; i++) - pen_brightness[i] = 1 << PEN_BRIGHTNESS_BITS; + palette->pen_brightness = auto_malloc(machine->drv->total_colors * sizeof(palette->pen_brightness[0])); + for (i = 0; i < machine->drv->total_colors; i++) + palette->pen_brightness[i] = 1 << PEN_BRIGHTNESS_BITS; } else { /* this driver does not use a palette */ - Machine->pens = NULL; - pen_brightness = NULL; + machine->pens = NULL; + palette->pen_brightness = NULL; } /* allocate memory for the colortables, if needed */ - if (Machine->drv->color_table_len) + if (machine->drv->color_table_len) { /* first for the raw colortable */ - Machine->game_colortable = auto_malloc(Machine->drv->color_table_len * sizeof(Machine->game_colortable[0])); - for (i = 0; i < Machine->drv->color_table_len; i++) - Machine->game_colortable[i] = i % total_colors; + machine->game_colortable = auto_malloc(machine->drv->color_table_len * sizeof(machine->game_colortable[0])); + for (i = 0; i < machine->drv->color_table_len; i++) + machine->game_colortable[i] = i % palette->total_colors; /* then for the remapped colortable */ - Machine->remapped_colortable = auto_malloc(Machine->drv->color_table_len * sizeof(Machine->remapped_colortable[0])); + machine->remapped_colortable = auto_malloc(machine->drv->color_table_len * sizeof(machine->remapped_colortable[0])); } /* otherwise, keep the game_colortable NULL and point the remapped_colortable to the pens */ else { - Machine->game_colortable = NULL; - Machine->remapped_colortable = Machine->pens; /* straight 1:1 mapping from palette to colortable */ + machine->game_colortable = NULL; + machine->remapped_colortable = machine->pens; /* straight 1:1 mapping from palette to colortable */ } -#if defined(MAME_DEBUG) && !defined(NEW_DEBUGGER) - /* allocate memory for the debugger pens */ - Machine->debug_pens = auto_malloc(DEBUGGER_TOTAL_COLORS * sizeof(Machine->debug_pens[0])); - for (i = 0; i < DEBUGGER_TOTAL_COLORS; i++) - Machine->debug_pens[i] = i; - - /* allocate memory for the debugger colortable */ - Machine->debug_remapped_colortable = auto_malloc(2 * DEBUGGER_TOTAL_COLORS * DEBUGGER_TOTAL_COLORS * sizeof(Machine->debug_remapped_colortable[0])); - for (i = 0; i < DEBUGGER_TOTAL_COLORS * DEBUGGER_TOTAL_COLORS; i++) + /* if we have shadows, allocate shadow tables */ + if (machine->drv->video_attributes & VIDEO_HAS_SHADOWS) { - Machine->debug_remapped_colortable[2*i+0] = i / DEBUGGER_TOTAL_COLORS; - Machine->debug_remapped_colortable[2*i+1] = i % DEBUGGER_TOTAL_COLORS; - } -#endif + pen_t *table = auto_malloc(65536 * sizeof(*table)); -#if 0 //* for reference, do not remove - /* allocate the shadow lookup table for 16bpp modes */ - palette_shadow_table = NULL; - if (colormode == PALETTIZED_16BIT) - { - /* we allocate a full 65536 entries table, to prevent memory corruption - * bugs should the tilemap contains pens >= total_colors - */ - palette_shadow_table = auto_malloc(65536 * sizeof(palette_shadow_table[0])); + /* palettized mode gets a single 64k table in slots 0 and 2 */ + if (!(palette->colormode & DIRECT_RGB)) + { + palette->shadow_table_base[0] = palette->shadow_table_base[2] = table; + for (i = 0; i < 65536; i++) + table[i] = (i < machine->drv->total_colors) ? (i + machine->drv->total_colors) : i; + palette_set_shadow_factor(machine, PALETTE_DEFAULT_SHADOW_FACTOR); + } - /* map entries up to the total_colors so they point to the next block of colors */ - for (i = 0; i < 65536; i++) + /* RGB mode gets two 32k tables in slots 0 and 2 */ + else { - palette_shadow_table[i] = i; - if ((Machine->drv->video_attributes & VIDEO_HAS_SHADOWS) && i < Machine->drv->total_colors) - palette_shadow_table[i] += Machine->drv->total_colors; + palette->shadow_table_base[0] = table; + palette->shadow_table_base[2] = table + 32768; + configure_rgb_shadows(machine, 0, PALETTE_DEFAULT_SHADOW_FACTOR); } } -#else - { - UINT16 *table_ptr16; - UINT32 *table_ptr32; - int c = Machine->drv->total_colors; - int cx2 = c << 1; - for (i=0; idrv->video_attributes & VIDEO_HAS_HIGHLIGHTS) + { + pen_t *table = auto_malloc(65536 * sizeof(*table)); - if (!(colormode & DIRECT_RGB)) + /* palettized mode gets a single 64k table in slots 1 and 3 */ + if (!(palette->colormode & DIRECT_RGB)) { - if (Machine->drv->video_attributes & VIDEO_HAS_SHADOWS) - { - table_ptr16 = auto_malloc(65536 * sizeof(UINT16)); - - shadow_table_base[0] = shadow_table_base[2] = (UINT32*)table_ptr16; - - for (i=0; idrv->video_attributes & VIDEO_HAS_HIGHLIGHTS) - { - table_ptr16 = auto_malloc(65536 * sizeof(UINT16)); - - shadow_table_base[1] = shadow_table_base[3] = (UINT32*)table_ptr16; - - for (i=0; ishadow_table_base[1] = palette->shadow_table_base[3] = table; + for (i = 0; i < 65536; i++) + table[i] = (i < machine->drv->total_colors) ? (i + 2 * machine->drv->total_colors) : i; + palette_set_highlight_factor(machine, PALETTE_DEFAULT_HIGHLIGHT_FACTOR); } + + /* RGB mode gets two 32k tables in slots 1 and 3 */ else { - if (Machine->drv->video_attributes & VIDEO_HAS_SHADOWS) - { - table_ptr32 = auto_malloc(65536 * sizeof(UINT32)); - - shadow_table_base[0] = table_ptr32; - shadow_table_base[2] = table_ptr32 + 32768; - - internal_set_shadow_preset(0, PALETTE_DEFAULT_SHADOW_FACTOR32, 0, 0, 0, 0, 1, 1); - } - - if (Machine->drv->video_attributes & VIDEO_HAS_HIGHLIGHTS) - { - table_ptr32 = auto_malloc(65536 * sizeof(UINT32)); - - shadow_table_base[1] = table_ptr32; - shadow_table_base[3] = table_ptr32 + 32768; - - internal_set_shadow_preset(1, PALETTE_DEFAULT_HIGHLIGHT_FACTOR32, 0, 0, 0, 0, 2, 1); - } + palette->shadow_table_base[1] = table; + palette->shadow_table_base[3] = table + 32768; + configure_rgb_shadows(machine, 1, PALETTE_DEFAULT_HIGHLIGHT_FACTOR); } - palette_shadow_table = (UINT16*)shadow_table_base[0]; } -#endif -} + /* set the default table */ + machine->shadow_table = palette->shadow_table_base[0]; +} /*------------------------------------------------- @@ -693,41 +347,42 @@ static void palette_alloc(void) takes place after the display is created -------------------------------------------------*/ -void palette_config(void) +void palette_config(running_machine *machine) { + palette_private *palette = machine->palette_data; int i; /* recompute the default palette and initalize the color correction table */ - recompute_adjusted_palette(); + recompute_adjusted_colors(machine); /* now let the driver modify the initial palette and colortable */ - if (Machine->drv->init_palette) - (*Machine->drv->init_palette)(Machine->game_colortable, memory_region(REGION_PROMS)); + if (machine->drv->init_palette) + (*machine->drv->init_palette)(machine, machine->game_colortable, memory_region(REGION_PROMS)); /* switch off the color mode */ - switch (colormode) + switch (palette->colormode) { /* 16-bit paletteized case */ case PALETTIZED_16BIT: { /* refresh the palette to support shadows in static palette games */ - for (i = 0; i < Machine->drv->total_colors; i++) - palette_set_color(i, RGB_RED(game_palette[i]), RGB_GREEN(game_palette[i]), RGB_BLUE(game_palette[i])); + for (i = 0; i < machine->drv->total_colors; i++) + palette_set_color(machine, i, RGB_RED(palette->raw_color[i]), RGB_GREEN(palette->raw_color[i]), RGB_BLUE(palette->raw_color[i])); /* map the UI pens */ - if (total_colors_with_ui <= 65534) + if (palette->total_colors_with_ui <= 65534) { - total_colors_with_ui += 2; - black_pen = total_colors + 0; - white_pen = total_colors + 1; + palette->total_colors_with_ui += 2; + palette->black_pen = palette->total_colors + 0; + palette->white_pen = palette->total_colors + 1; } else { - black_pen = 0; - white_pen = 65535; + palette->black_pen = 0; + palette->white_pen = 65535; } - notify_pen_changed(black_pen, game_palette[black_pen] = adjusted_palette[black_pen] = MAKE_RGB(0x00,0x00,0x00)); - notify_pen_changed(white_pen, game_palette[white_pen] = adjusted_palette[white_pen] = MAKE_RGB(0xff,0xff,0xff)); + notify_pen_changed(palette, palette->black_pen, palette->raw_color[palette->black_pen] = palette->adjusted_color[palette->black_pen] = MAKE_RGB(0x00,0x00,0x00)); + notify_pen_changed(palette, palette->white_pen, palette->raw_color[palette->white_pen] = palette->adjusted_color[palette->white_pen] = MAKE_RGB(0xff,0xff,0xff)); break; } @@ -735,36 +390,230 @@ void palette_config(void) case DIRECT_15BIT: { /* remap the game palette into direct RGB pens */ - for (i = 0; i < total_colors; i++) - Machine->pens[i] = rgb_to_direct15(game_palette[i]); + for (i = 0; i < palette->total_colors; i++) + machine->pens[i] = rgb_to_direct15(palette->raw_color[i]); /* map the UI pens */ - black_pen = rgb_to_direct15(MAKE_RGB(0x00,0x00,0x00)); - white_pen = rgb_to_direct15(MAKE_RGB(0xff,0xff,0xff)); + palette->black_pen = rgb_to_direct15(MAKE_RGB(0x00,0x00,0x00)); + palette->white_pen = rgb_to_direct15(MAKE_RGB(0xff,0xff,0xff)); break; } case DIRECT_32BIT: { /* remap the game palette into direct RGB pens */ - for (i = 0; i < total_colors; i++) - Machine->pens[i] = rgb_to_direct32(game_palette[i]); + for (i = 0; i < palette->total_colors; i++) + machine->pens[i] = palette->raw_color[i]; /* map the UI pens */ - black_pen = rgb_to_direct32(MAKE_RGB(0x00,0x00,0x00)); - white_pen = rgb_to_direct32(MAKE_RGB(0xff,0xff,0xff)); + palette->black_pen = MAKE_RGB(0x00,0x00,0x00); + palette->white_pen = MAKE_RGB(0xff,0xff,0xff); break; } } /* now compute the remapped_colortable */ - for (i = 0; i < Machine->drv->color_table_len; i++) + for (i = 0; i < machine->drv->color_table_len; i++) { - pen_t color = Machine->game_colortable[i]; + pen_t color = machine->game_colortable[i]; - /* check for invalid colors set by Machine->drv->init_palette */ - assert(color < total_colors); - Machine->remapped_colortable[i] = Machine->pens[color]; + /* check for invalid colors set by machine->drv->init_palette */ + assert(color < palette->total_colors); + machine->remapped_colortable[i] = machine->pens[color]; + } +} + + +/*------------------------------------------------- + palette_add_notifier - request a callback on + changing of a palette entry +-------------------------------------------------*/ + +void palette_add_notifier(running_machine *machine, void (*callback)(void *, int, rgb_t), void *param) +{ + palette_private *palette = machine->palette_data; + callback_item *cb; + + assert_always(mame_get_phase(machine) == MAME_PHASE_INIT, "Can only call palette_add_notifier at init time!"); + + /* allocate memory */ + cb = malloc_or_die(sizeof(*cb)); + + /* add us to the head of the list */ + cb->notify = callback; + cb->param = param; + cb->next = palette->notify_callback_list; + palette->notify_callback_list = cb; +} + + +/*------------------------------------------------- + palette_add_notifier - request a callback on + changing of a palette entry +-------------------------------------------------*/ + +rgb_t *palette_get_raw_colors(running_machine *machine) +{ + palette_private *palette = machine->palette_data; + return palette->raw_color; +} + + +/*------------------------------------------------- + palette_add_notifier - request a callback on + changing of a palette entry +-------------------------------------------------*/ + +rgb_t *palette_get_adjusted_colors(running_machine *machine) +{ + palette_private *palette = machine->palette_data; + return palette->adjusted_color; +} + + +/*------------------------------------------------- + + palette_set_shadow_mode(mode) + + mode: 0 = use preset 0 (default shadow) + 1 = use preset 1 (default highlight) + 2 = use preset 2 * + 3 = use preset 3 * + + * Preset 2 & 3 work independently under 32bpp, + supporting up to four different types of + shadows at one time. They mirror preset 1 & 2 + in lower depth settings to maintain + compatibility. + + + palette_set_shadow_dRGB32(mode, dr, dg, db, noclip) + + mode: 0 to 3 (which preset to configure) + + dr: -255 to 255 ( red displacement ) + dg: -255 to 255 ( green displacement ) + db: -255 to 255 ( blue displacement ) + + noclip: 0 = resultant RGB clipped at 0x00/0xff + 1 = resultant RGB wraparound 0x00/0xff + + + * Color shadows only work under 32bpp. + This function has no effect in lower color + depths where + + palette_set_shadow_factor() or + palette_set_highlight_factor() + + should be used instead. + + * 32-bit shadows are lossy. Even with zero RGB + displacements the affected area will still look + slightly darkened. + + Drivers should ensure all shadow pens in + gfx_drawmode_table[] are set to DRAWMODE_NONE + when RGB displacements are zero to avoid the + darkening effect. + +-------------------------------------------------*/ + +static void configure_rgb_shadows(running_machine *machine, int mode, float factor) +{ + palette_private *palette = machine->palette_data; + pen_t *table = palette->shadow_table_base[mode]; + int ifactor = (int)(factor * 256.0f); + int i; + + /* only applies to RGB direct modes */ + assert((palette->colormode & DIRECT_RGB) != 0); + assert(table != NULL); + + #if VERBOSE + popmessage("shadow %d recalc %d %d %d %02x", mode, dr, dg, db, noclip); + #endif + + /* regenerate the table */ + for (i = 0; i < 32768; i++) + { + int r = (pal5bit(i >> 10) * ifactor) >> 8; + int g = (pal5bit(i >> 5) * ifactor) >> 8; + int b = (pal5bit(i >> 0) * ifactor) >> 8; + pen_t final; + + /* apply clipping */ + if (r < 0) r = 0; else if (r > 255) r = 255; + if (g < 0) g = 0; else if (g > 255) g = 255; + if (b < 0) b = 0; else if (b > 255) b = 255; + final = MAKE_RGB(r, g, b); + + /* store either 16 or 32 bit */ + if (palette->colormode == DIRECT_32BIT) + table[i] = final; + else + table[i] = rgb_to_direct15(final); + } +} + + +void palette_set_shadow_mode(running_machine *machine, int mode) +{ + palette_private *palette = machine->palette_data; + assert(mode >= 0 && mode < MAX_SHADOW_PRESETS); + machine->shadow_table = palette->shadow_table_base[mode]; +} + + +void palette_set_shadow_dRGB32(running_machine *machine, int mode, int dr, int dg, int db, int noclip) +{ + palette_private *palette = machine->palette_data; + pen_t *table = palette->shadow_table_base[mode]; + int i; + + /* only applies to RGB direct modes */ + assert((palette->colormode & DIRECT_RGB) != 0); + assert(table != NULL); + + /* clamp the deltas (why?) */ + if (dr < -0xff) dr = -0xff; else if (dr > 0xff) dr = 0xff; + if (dg < -0xff) dg = -0xff; else if (dg > 0xff) dg = 0xff; + if (db < -0xff) db = -0xff; else if (db > 0xff) db = 0xff; + + /* early exit if nothing changed */ + if (dr == palette->shadow_dr[mode] && dg == palette->shadow_dg[mode] && db == palette->shadow_db[mode] && noclip == palette->shadow_noclip[mode]) + return; + palette->shadow_dr[mode] = dr; + palette->shadow_dg[mode] = dg; + palette->shadow_db[mode] = db; + palette->shadow_noclip[mode] = noclip; + + #if VERBOSE + popmessage("shadow %d recalc %d %d %d %02x", mode, dr, dg, db, noclip); + #endif + + /* regenerate the table */ + for (i = 0; i < 32768; i++) + { + int r = pal5bit(i >> 10) + dr; + int g = pal5bit(i >> 5) + dg; + int b = pal5bit(i >> 0) + db; + pen_t final; + + /* apply clipping */ + if (!noclip) + { + if (r < 0) r = 0; else if (r > 255) r = 255; + if (g < 0) g = 0; else if (g > 255) g = 255; + if (b < 0) b = 0; else if (b > 255) b = 255; + } + final = MAKE_RGB(r, g, b); + + /* store either 16 or 32 bit */ + if (palette->colormode == DIRECT_32BIT) + table[i] = final; + else + table[i] = rgb_to_direct15(final); } } @@ -776,13 +625,14 @@ void palette_config(void) UI -------------------------------------------------*/ -int palette_get_total_colors_with_ui(void) +int palette_get_total_colors_with_ui(running_machine *machine) { - int result = Machine->drv->total_colors; - if (Machine->drv->video_attributes & VIDEO_HAS_SHADOWS && !(colormode & DIRECT_RGB)) - result += Machine->drv->total_colors; - if (Machine->drv->video_attributes & VIDEO_HAS_HIGHLIGHTS && !(colormode & DIRECT_RGB)) - result += Machine->drv->total_colors; + palette_private *palette = machine->palette_data; + int result = machine->drv->total_colors; + if (machine->drv->video_attributes & VIDEO_HAS_SHADOWS && !(palette->colormode & DIRECT_RGB)) + result += machine->drv->total_colors; + if (machine->drv->video_attributes & VIDEO_HAS_HIGHLIGHTS && !(palette->colormode & DIRECT_RGB)) + result += machine->drv->total_colors; if (result <= 65534) result += 2; return result; @@ -795,39 +645,39 @@ int palette_get_total_colors_with_ui(void) pen and recompute its adjusted RGB value -------------------------------------------------*/ -static void internal_modify_single_pen(pen_t pen, rgb_t color, int pen_bright) +static void internal_modify_single_pen(running_machine *machine, palette_private *palette, pen_t pen, rgb_t color, int pen_bright) { rgb_t adjusted_color; /* skip if out of bounds or not ready */ - if (pen >= total_colors) + if (pen >= palette->total_colors) return; /* update the raw palette */ - game_palette[pen] = color; + palette->raw_color[pen] = color; /* now update the adjusted color if it's different */ adjusted_color = adjust_palette_entry(color, pen_bright); - if (adjusted_color != adjusted_palette[pen]) + if (adjusted_color != palette->adjusted_color[pen]) { /* change the adjusted palette entry */ - adjusted_palette[pen] = adjusted_color; + palette->adjusted_color[pen] = adjusted_color; /* update the pen value */ - switch (colormode) + switch (palette->colormode) { /* 16-bit palettized */ case PALETTIZED_16BIT: - notify_pen_changed(pen, adjusted_color); + notify_pen_changed(palette, pen, adjusted_color); break; - /* 15/32-bit direct: update the Machine->pens array */ + /* 15/32-bit direct: update the machine->pens array */ case DIRECT_15BIT: - Machine->pens[pen] = rgb_to_direct15(adjusted_color); + machine->pens[pen] = rgb_to_direct15(adjusted_color); break; case DIRECT_32BIT: - Machine->pens[pen] = rgb_to_direct32(adjusted_color); + machine->pens[pen] = adjusted_color; break; } } @@ -840,129 +690,42 @@ static void internal_modify_single_pen(pen_t pen, rgb_t color, int pen_bright) its corresponding shadow/highlight -------------------------------------------------*/ -static void internal_modify_pen(pen_t pen, rgb_t color, int pen_bright) //* new highlight operation +static void internal_modify_pen(running_machine *machine, palette_private *palette, pen_t pen, rgb_t color, int pen_bright) //* new highlight operation { -#define FMAX (0xff<drv->total_colors) + if (pen < machine->drv->total_colors) { /* check for shadows */ - if (Machine->drv->video_attributes & VIDEO_HAS_SHADOWS) - { - pen += Machine->drv->total_colors; - - if (shadow_factor > (1 << PEN_BRIGHTNESS_BITS) && highlight_method) // luminance > 1.0 - { - r = color>>16 & 0xff; - g = color>>8 & 0xff; - b = color & 0xff; - - if (highlight_method == 1) - { - fl = shadow_factor; - - r *= fl; g *= fl; b *= fl; - ov = 0; - - if (r > FMAX) ov += r - FMAX; - if (g > FMAX) ov += g - FMAX; - if (b > FMAX) ov += b - FMAX; - - if (ov) { ov >>= 2; r += ov; g += ov; b += ov; } - - if (r >= FMAX) r = 0xff0000; else r = (r >> PEN_BRIGHTNESS_BITS) << 16; - if (g >= FMAX) g = 0x00ff00; else g = (g >> PEN_BRIGHTNESS_BITS) << 8; - if (b >= FMAX) b = 0x0000ff; else b = (b >> PEN_BRIGHTNESS_BITS); - } - else - { - fl = ((shadow_factor - (1 << PEN_BRIGHTNESS_BITS)) * 255) >> PEN_BRIGHTNESS_BITS; - - r += fl; g += fl; b += fl; - - if (r >= 0xff) r = 0xff0000; else r <<= 16; - if (g >= 0xff) g = 0x00ff00; else g <<= 8; - if (b >= 0xff) b = 0x0000ff; - } - - internal_modify_single_pen(pen, r|g|b, pen_bright); - } - else // luminance <= 1.0 - internal_modify_single_pen(pen, color, (pen_bright * shadow_factor) >> PEN_BRIGHTNESS_BITS); - } + if (machine->drv->video_attributes & VIDEO_HAS_SHADOWS) + internal_modify_single_pen(machine, palette, pen + machine->drv->total_colors, color, (pen_bright * palette->shadow_factor) >> PEN_BRIGHTNESS_BITS); /* check for highlights */ - if (Machine->drv->video_attributes & VIDEO_HAS_HIGHLIGHTS) - { - pen += Machine->drv->total_colors; - - if (highlight_factor > (1 << PEN_BRIGHTNESS_BITS) && highlight_method) // luminance > 1.0 - { - r = color>>16 & 0xff; - g = color>>8 & 0xff; - b = color & 0xff; - - if (highlight_method == 1) - { - fl = highlight_factor; - - r *= fl; g *= fl; b *= fl; - ov = 0; - - if (r > FMAX) ov += r - FMAX; - if (g > FMAX) ov += g - FMAX; - if (b > FMAX) ov += b - FMAX; - - if (ov) { ov >>= 2; r += ov; g += ov; b += ov; } - - if (r >= FMAX) r = 0xff0000; else r = (r >> PEN_BRIGHTNESS_BITS) << 16; - if (g >= FMAX) g = 0x00ff00; else g = (g >> PEN_BRIGHTNESS_BITS) << 8; - if (b >= FMAX) b = 0x0000ff; else b = (b >> PEN_BRIGHTNESS_BITS); - } - else - { - fl = ((highlight_factor - (1 << PEN_BRIGHTNESS_BITS)) * 255) >> PEN_BRIGHTNESS_BITS; - - r += fl; g += fl; b += fl; - - if (r >= 0xff) r = 0xff0000; else r <<= 16; - if (g >= 0xff) g = 0x00ff00; else g <<= 8; - if (b >= 0xff) b = 0x0000ff; - } - - internal_modify_single_pen(pen, r|g|b, pen_bright); - } - else // luminance <= 1.0 - internal_modify_single_pen(pen, color, (pen_bright * highlight_factor) >> PEN_BRIGHTNESS_BITS); - } + if (machine->drv->video_attributes & VIDEO_HAS_HIGHLIGHTS) + internal_modify_single_pen(machine, palette, pen + 2*machine->drv->total_colors, color, (pen_bright * palette->highlight_factor) >> PEN_BRIGHTNESS_BITS); } -#undef FMAX } /*------------------------------------------------- - recompute_adjusted_palette - recompute the + recompute_adjusted_colors - recompute the entire palette after some major event -------------------------------------------------*/ -static void recompute_adjusted_palette(void) +static void recompute_adjusted_colors(running_machine *machine) { + palette_private *palette = machine->palette_data; int i; /* now update all the palette entries */ - for (i = 0; i < Machine->drv->total_colors; i++) - internal_modify_pen(i, game_palette[i], pen_brightness[i]); + for (i = 0; i < machine->drv->total_colors; i++) + internal_modify_pen(machine, palette, i, palette->raw_color[i], palette->pen_brightness[i]); } - /*------------------------------------------------- palette_reset - called after restore to actually update the palette @@ -971,139 +734,147 @@ static void recompute_adjusted_palette(void) static void palette_reset(void) { /* recompute everything */ - recompute_adjusted_palette(); + recompute_adjusted_colors(Machine); } - /*------------------------------------------------- palette_set_color - set a single palette entry -------------------------------------------------*/ -void palette_set_color(pen_t pen, UINT8 r, UINT8 g, UINT8 b) +void palette_set_color(running_machine *machine, pen_t pen, UINT8 r, UINT8 g, UINT8 b) { - /* make sure we're in range */ - if (pen >= total_colors) - { - logerror("error: palette_set_color() called with color %d, but only %d allocated.\n", pen, total_colors); - return; - } - - /* set the pen value */ - internal_modify_pen(pen, MAKE_RGB(r, g, b), pen_brightness[pen]); + palette_private *palette = machine->palette_data; + assert(pen < palette->total_colors); + internal_modify_pen(machine, palette, pen, MAKE_RGB(r, g, b), palette->pen_brightness[pen]); } -/* handy wrapper for palette_set_color */ -void palette_set_colors(pen_t color_base, const UINT8 *colors, int color_count) + +/*------------------------------------------------- + palette_set_colors - set multiple palette + entries from an array of RGB triples +-------------------------------------------------*/ + +void palette_set_colors(running_machine *machine, pen_t color_base, const UINT8 *colors, int color_count) { - while(color_count--) - { - palette_set_color(color_base++, colors[0], colors[1], colors[2]); - colors += 3; - } + while (color_count--) + { + palette_set_color(machine, color_base++, colors[0], colors[1], colors[2]); + colors += 3; + } } + /*------------------------------------------------- palette_get_color - return a single palette entry -------------------------------------------------*/ -void palette_get_color(pen_t pen, UINT8 *r, UINT8 *g, UINT8 *b) + +rgb_t palette_get_color(running_machine *machine, pen_t pen) { + palette_private *palette = machine->palette_data; + /* record the result from the game palette */ - if (pen < total_colors) - { - *r = RGB_RED(game_palette[pen]); - *g = RGB_GREEN(game_palette[pen]); - *b = RGB_BLUE(game_palette[pen]); - } + if (pen < palette->total_colors) + return palette->raw_color[pen]; + /* special case the black pen */ - else if (pen == black_pen) - *r = *g = *b = 0; + else if (pen == palette->black_pen) + return MAKE_RGB(0,0,0); + /* special case the white pen (crosshairs) */ - else if (pen == white_pen) - *r = *g = *b = 255; + else if (pen == palette->white_pen) + return MAKE_RGB(255,255,255); + else popmessage("palette_get_color() out of range"); + return 0; } + /*------------------------------------------------- palette_set_brightness - set the per-pen brightness factor -------------------------------------------------*/ -void palette_set_brightness(pen_t pen, double bright) +void palette_set_brightness(running_machine *machine, pen_t pen, double bright) { + palette_private *palette = machine->palette_data; + /* compute the integral brightness value */ int brightval = (int)(bright * (double)(1 << PEN_BRIGHTNESS_BITS)); if (brightval > MAX_PEN_BRIGHTNESS) brightval = MAX_PEN_BRIGHTNESS; /* if it changed, update the array and the adjusted palette */ - if (pen_brightness[pen] != brightval) + if (palette->pen_brightness[pen] != brightval) { - pen_brightness[pen] = brightval; - internal_modify_pen(pen, game_palette[pen], brightval); + palette->pen_brightness[pen] = brightval; + internal_modify_pen(machine, palette, pen, palette->raw_color[pen], brightval); } } - /*------------------------------------------------- palette_set_shadow_factor - set the global shadow brightness factor -------------------------------------------------*/ -void palette_set_shadow_factor(double factor) +void palette_set_shadow_factor(running_machine *machine, double factor) { + palette_private *palette = machine->palette_data; + /* compute the integral shadow factor value */ int factorval = (int)(factor * (double)(1 << PEN_BRIGHTNESS_BITS)); if (factorval > MAX_PEN_BRIGHTNESS) factorval = MAX_PEN_BRIGHTNESS; /* if it changed, update the entire palette */ - if (shadow_factor != factorval) + if (palette->shadow_factor != factorval) { - shadow_factor = factorval; - recompute_adjusted_palette(); + palette->shadow_factor = factorval; + recompute_adjusted_colors(machine); } } - /*------------------------------------------------- palette_set_highlight_factor - set the global highlight brightness factor -------------------------------------------------*/ -void palette_set_highlight_factor(double factor) +void palette_set_highlight_factor(running_machine *machine, double factor) { + palette_private *palette = machine->palette_data; + /* compute the integral highlight factor value */ int factorval = (int)(factor * (double)(1 << PEN_BRIGHTNESS_BITS)); if (factorval > MAX_PEN_BRIGHTNESS) factorval = MAX_PEN_BRIGHTNESS; /* if it changed, update the entire palette */ - if (highlight_factor != factorval) + if (palette->highlight_factor != factorval) { - highlight_factor = factorval; - recompute_adjusted_palette(); + palette->highlight_factor = factorval; + recompute_adjusted_colors(machine); } } - /*------------------------------------------------- get_black_pen - use this if you need to fillbitmap() the background with black -------------------------------------------------*/ -pen_t get_black_pen(void) +pen_t get_black_pen(running_machine *machine) { - return black_pen; + palette_private *palette = machine->palette_data; + return palette->black_pen; } -pen_t get_white_pen(void) +pen_t get_white_pen(running_machine *machine) { - return white_pen; + palette_private *palette = machine->palette_data; + return palette->white_pen; } diff --git a/src/palette.h b/src/palette.h index 23ac74066..12c2c4317 100644 --- a/src/palette.h +++ b/src/palette.h @@ -68,6 +68,25 @@ cases, e.g. to support alpha blending. MachineDriver->video_attributes must contain VIDEO_RGB_DIRECT. + + Shadows(Highlights) Quick Reference + ----------------------------------- + + 1) declare MDRV_VIDEO_ATTRIBUTES( ... VIDEO_HAS_SHADOWS | VIDEO_HAS_HIGHLIGHTS ... ) + + 2) set gfx_drawmode_table[0-n] to DRAWMODE_NONE, DRAWMODE_SOURCE or DRAWMODE_SHADOW + + 3) (optional) set shadow darkness or highlight brightness by + palette_set_shadow_factor(0.0-1.0) or + palette_set_highlight_factor(1.0-n.n) + + 4) before calling drawgfx use + palette_set_shadow_mode(0) to arm shadows or + palette_set_shadow_mode(1) to arm highlights + + 5) call drawgfx with the TRANSPARENCY_PEN_TABLE flag + drawgfx( ..., cliprect, TRANSPARENCY_PEN_TABLE, transparent_color ) + ******************************************************************************/ #pragma once @@ -85,9 +104,6 @@ #define PALETTE_DEFAULT_SHADOW_FACTOR (0.6) #define PALETTE_DEFAULT_HIGHLIGHT_FACTOR (1/PALETTE_DEFAULT_SHADOW_FACTOR) -#define PALETTE_DEFAULT_SHADOW_FACTOR32 (0.6) -#define PALETTE_DEFAULT_HIGHLIGHT_FACTOR32 (1/PALETTE_DEFAULT_SHADOW_FACTOR32) - /*************************************************************************** @@ -106,62 +122,31 @@ -/*************************************************************************** - GLOBAL VARIABLES -***************************************************************************/ - -extern rgb_t *game_palette; -extern rgb_t *adjusted_palette; -extern UINT16 *palette_shadow_table; - - - /*************************************************************************** FUNCTION PROTOTYPES ***************************************************************************/ -void palette_init(void); -void palette_config(void); -void palette_add_notifier(void (*callback)(void *, int, rgb_t), void *param); -int palette_get_total_colors_with_ui(void); +void palette_init(running_machine *machine); +void palette_config(running_machine *machine); +void palette_add_notifier(running_machine *machine, void (*callback)(void *, int, rgb_t), void *param); +int palette_get_total_colors_with_ui(running_machine *machine); -void palette_update_display(mame_display *display); +rgb_t *palette_get_raw_colors(running_machine *machine); +rgb_t *palette_get_adjusted_colors(running_machine *machine); -void palette_set_color(pen_t pen, UINT8 r, UINT8 g, UINT8 b); -void palette_get_color(pen_t pen, UINT8 *r, UINT8 *g, UINT8 *b); -void palette_set_colors(pen_t color_base, const UINT8 *colors, int color_count); +void palette_set_color(running_machine *machine, pen_t pen, UINT8 r, UINT8 g, UINT8 b); +rgb_t palette_get_color(running_machine *machine, pen_t pen); +void palette_set_colors(running_machine *machine, pen_t color_base, const UINT8 *colors, int color_count); -void palette_set_brightness(pen_t pen, double bright); -void palette_set_shadow_factor(double factor); -void palette_set_highlight_factor(double factor); +void palette_set_brightness(running_machine *machine, pen_t pen, double bright); +void palette_set_shadow_factor(running_machine *machine, double factor); +void palette_set_highlight_factor(running_machine *machine, double factor); -/* - Shadows(Highlights) Quick Reference - ----------------------------------- +void palette_set_shadow_mode(running_machine *machine, int mode); +void palette_set_shadow_dRGB32(running_machine *machine, int mode, int dr, int dg, int db, int noclip); - 1) declare MDRV_VIDEO_ATTRIBUTES( ... VIDEO_HAS_SHADOWS | VIDEO_HAS_HIGHLIGHTS ... ) - - 2) set gfx_drawmode_table[0-n] to DRAWMODE_NONE, DRAWMODE_SOURCE or DRAWMODE_SHADOW - - 3) (optional) set shadow darkness or highlight brightness by - palette_set_shadow_factor32(0.0-1.0) or - palette_set_highlight_factor32(1.0-n.n) - - 4) before calling drawgfx use - palette_set_shadow_mode(0) to arm shadows or - palette_set_shadow_mode(1) to arm highlights - - 5) call drawgfx with the TRANSPARENCY_PEN_TABLE flag - drawgfx( ..., cliprect, TRANSPARENCY_PEN_TABLE, transparent_color ) -*/ -void palette_set_shadow_mode(int mode); -void palette_set_shadow_factor32(double factor); -void palette_set_highlight_factor32(double factor); -void palette_set_shadow_dRGB32(int mode, int dr, int dg, int db, int noclip); -void palette_set_highlight_method(int method); //0=default, 1=multiplication with flooding, 2=addition - -pen_t get_black_pen(void); -pen_t get_white_pen(void); +pen_t get_black_pen(running_machine *machine); +pen_t get_white_pen(running_machine *machine); diff --git a/src/png.c b/src/png.c index d09f7ee36..245b84d7f 100644 --- a/src/png.c +++ b/src/png.c @@ -7,19 +7,6 @@ Copyright (c) 1996-2006, Nicola Salmoria and the MAME Team. Visit http://mamedev.org for licensing and usage restrictions. - 07/15/1998 Created by Mathis Rosenhauer - 10/02/1998 Code clean up and abstraction by Mike Balfour - and Mathis Rosenhauer - 10/15/1998 Image filtering. MLR - 11/09/1998 Bit depths 1-8 MLR - 11/10/1998 Some additional PNG chunks recognized MLR - 05/14/1999 Color type 2 and PNG save functions added - 05/15/1999 Handle RGB555 while saving, use mame_fxxx - functions for writing MSH - 04/27/2001 Simple MNG support MLR - - TODO : Fully comply with the "Recommendations for Decoders" - of the W3C *********************************************************************/ @@ -28,867 +15,994 @@ #include "driver.h" #include "png.h" -/* convert_uint is here so we don't have to deal with byte-ordering issues */ -static UINT32 convert_from_network_order (UINT8 *v) + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +typedef struct _image_data_chunk image_data_chunk; +struct _image_data_chunk { - UINT32 i; + image_data_chunk * next; + int length; + UINT8 * data; +}; - i = (v[0]<<24) | (v[1]<<16) | (v[2]<<8) | (v[3]); - return i; -} -int png_unfilter(png_info *p) +typedef struct _png_private png_private; +struct _png_private { - int i, j, bpp, filter; - INT32 prediction, pA, pB, pC, dA, dB, dC; - UINT8 *src, *dst; + png_info * pnginfo; + image_data_chunk * idata; + image_data_chunk ** idata_next; + UINT8 bpp; + UINT32 rowbytes; +}; - if((p->image = (UINT8 *)malloc (p->height*p->rowbytes))==NULL) - { - logerror("Out of memory\n"); - free (p->fimage); - return 0; - } - src = p->fimage; - dst = p->image; - bpp = p->bpp; - for (i=0; iheight; i++) - { - filter = *src++; - if (!filter) - { - memcpy (dst, src, p->rowbytes); - src += p->rowbytes; - dst += p->rowbytes; - } - else - for (j=0; jrowbytes; j++) - { - pA = (jrowbytes); - pC = ((jrowbytes - bpp); +/*************************************************************************** + GLOBAL VARIABLES +***************************************************************************/ - switch (filter) - { - case PNG_PF_Sub: - prediction = pA; - break; - case PNG_PF_Up: - prediction = pB; - break; - case PNG_PF_Average: - prediction = ((pA + pB) / 2); - break; - case PNG_PF_Paeth: - prediction = pA + pB - pC; - dA = abs(prediction - pA); - dB = abs(prediction - pB); - dC = abs(prediction - pC); - if (dA <= dB && dA <= dC) prediction = pA; - else if (dB <= dC) prediction = pB; - else prediction = pC; - break; - default: - logerror("Unknown filter type %i\n",filter); - prediction = 0; - } - *dst = 0xff & (*src + prediction); - dst++; src++; - } - } +static const int samples[] = { 1, 0, 3, 1, 2, 0, 4 }; - free (p->fimage); - return 1; + + +/*************************************************************************** + INLINE FUNCTIONS +***************************************************************************/ + +INLINE UINT8 fetch_8bit(UINT8 *v) +{ + return *v; } -int png_verify_signature (mame_file *fp) + +INLINE UINT16 fetch_16bit(UINT8 *v) { - INT8 signature[8]; + return BIG_ENDIANIZE_INT16(*(UINT16 *)v); +} - if (mame_fread (fp, signature, 8) != 8) - { - logerror("Unable to read PNG signature (EOF)\n"); - return 0; - } - if (memcmp(signature, PNG_Signature, 8)) - { - logerror("PNG signature mismatch found: %s expected: %s\n",signature,PNG_Signature); - return 0; - } - return 1; +INLINE UINT32 fetch_32bit(UINT8 *v) +{ + return BIG_ENDIANIZE_INT32(*(UINT32 *)v); } -int png_inflate_image (png_info *p) + +INLINE void put_8bit(UINT8 *v, UINT8 data) { - unsigned long fbuff_size; + *v = data; +} - fbuff_size = p->height * (p->rowbytes + 1); - if((p->fimage = (UINT8 *)malloc (fbuff_size))==NULL) - { - logerror("Out of memory\n"); - free (p->zimage); - return 0; - } +INLINE void put_16bit(UINT8 *v, UINT16 data) +{ + *(UINT16 *)v = BIG_ENDIANIZE_INT16(data); +} - if (uncompress(p->fimage, &fbuff_size, p->zimage, p->zlength) != Z_OK) - { - logerror("Error while inflating image\n"); - return 0; - } - free (p->zimage); - return 1; +INLINE void put_32bit(UINT8 *v, UINT32 data) +{ + *(UINT32 *)v = BIG_ENDIANIZE_INT32(data); } -int png_read_file(mame_file *fp, png_info *p) + +INLINE int compute_bpp(const png_info *pnginfo) { - /* translates color_type to bytes per pixel */ - static const int samples[] = {1, 0, 3, 1, 2, 0, 4}; + return samples[pnginfo->color_type] * pnginfo->bit_depth / 8; +} - UINT32 chunk_length, chunk_type=0, chunk_crc, crc; - UINT8 *chunk_data, *temp; - UINT8 str_chunk_type[5], v[4]; - struct idat - { - struct idat *next; - int length; - UINT8 *data; - } *ihead, *pidat; +INLINE int compute_rowbytes(const png_info *pnginfo) +{ + return (pnginfo->width * samples[pnginfo->color_type] * pnginfo->bit_depth + 7) / 8; +} - if ((ihead = malloc (sizeof(struct idat))) == 0) - return 0; - pidat = ihead; - p->zlength = 0; - p->num_palette = 0; - p->num_trans = 0; - p->trans = NULL; - p->palette = NULL; +/*************************************************************************** + GENERAL FUNCTIONS +***************************************************************************/ - if (png_verify_signature(fp)==0) - return 0; +/*------------------------------------------------- + png_free - free all memory allocated in a + pnginfo structure +-------------------------------------------------*/ - while (chunk_type != PNG_CN_IEND) +void png_free(png_info *pnginfo) +{ + while (pnginfo->textlist != NULL) { - if (mame_fread(fp, v, 4) != 4) - logerror("Unexpected EOF in PNG\n"); - chunk_length=convert_from_network_order(v); - - if (mame_fread(fp, str_chunk_type, 4) != 4) - logerror("Unexpected EOF in PNG file\n"); + png_text *temp = pnginfo->textlist; + pnginfo->textlist = temp->next; + if (temp->keyword != NULL) + free((void *)temp->keyword); + free(temp); + } - str_chunk_type[4]=0; /* terminate string */ + if (pnginfo->palette != NULL) + free(pnginfo->palette); + pnginfo->palette = NULL; - crc=crc32(0,str_chunk_type, 4); - chunk_type = convert_from_network_order(str_chunk_type); + if (pnginfo->trans != NULL) + free(pnginfo->trans); + pnginfo->trans = NULL; - if (chunk_length) - { - if ((chunk_data = (UINT8 *)malloc(chunk_length+1))==NULL) - { - logerror("Out of memory\n"); - return 0; - } - if (mame_fread (fp, chunk_data, chunk_length) != chunk_length) - { - logerror("Unexpected EOF in PNG file\n"); - free(chunk_data); - return 0; - } + if (pnginfo->image != NULL) + free(pnginfo->image); + pnginfo->image = NULL; +} - crc=crc32(crc,chunk_data, chunk_length); - } - else - chunk_data = NULL; - if (mame_fread(fp, v, 4) != 4) - logerror("Unexpected EOF in PNG\n"); - chunk_crc=convert_from_network_order(v); - if (crc != chunk_crc) - { - logerror("CRC check failed while reading PNG chunk %s\n",str_chunk_type); - logerror("Found: %08X Expected: %08X\n",crc,chunk_crc); - return 0; - } +/*************************************************************************** + PNG READING FUNCTIONS +***************************************************************************/ - logerror("Reading PNG chunk %s\n", str_chunk_type); +/*------------------------------------------------- + verify_header - verify the PNG + header at the current file location +-------------------------------------------------*/ - switch (chunk_type) - { - case PNG_CN_IHDR: - p->width = convert_from_network_order(chunk_data); - p->height = convert_from_network_order(chunk_data+4); - p->bit_depth = *(chunk_data+8); - p->color_type = *(chunk_data+9); - p->compression_method = *(chunk_data+10); - p->filter_method = *(chunk_data+11); - p->interlace_method = *(chunk_data+12); - free (chunk_data); - - logerror("PNG IHDR information:\n"); - logerror("Width: %i, Height: %i\n", p->width, p->height); - logerror("Bit depth %i, color type: %i\n", p->bit_depth, p->color_type); - logerror("Compression method: %i, filter: %i, interlace: %i\n", - p->compression_method, p->filter_method, p->interlace_method); - break; +static int verify_header(mame_file *fp) +{ + UINT8 signature[8]; - case PNG_CN_PLTE: - p->num_palette=chunk_length/3; - p->palette=chunk_data; - logerror("%i palette entries\n", p->num_palette); - break; + /* read 8 bytes */ + if (mame_fread(fp, signature, 8) != 8) + return PNGERR_FILE_TRUNCATED; - case PNG_CN_tRNS: - p->num_trans=chunk_length; - p->trans=chunk_data; - logerror("%i transparent palette entries\n", p->num_trans); - break; + /* return an error if we don't match */ + if (memcmp(signature, PNG_Signature, 8) != 0) + return PNGERR_BAD_SIGNATURE; - case PNG_CN_IDAT: - pidat->data = chunk_data; - pidat->length = chunk_length; - if ((pidat->next = malloc (sizeof(struct idat))) == 0) - return 0; - pidat = pidat->next; - pidat->next = 0; - p->zlength += chunk_length; - break; + return PNGERR_NONE; +} - case PNG_CN_tEXt: - { - char *text = (char *)chunk_data; - while(*text++) ; - chunk_data[chunk_length]=0; - logerror("Keyword: %s\n", chunk_data); - logerror("Text: %s\n", text); - } - free(chunk_data); - break; +/*------------------------------------------------- + read_chunk - read the next PNG chunk +-------------------------------------------------*/ - case PNG_CN_tIME: - { - UINT8 *t=chunk_data; - logerror("Image last-modification time: %i/%i/%i (%i:%i:%i) GMT\n", - ((short)(*t) << 8)+ (short)(*(t+1)), *(t+2), *(t+3), *(t+4), *(t+5), *(t+6)); - } +static int read_chunk(mame_file *fp, UINT8 **data, UINT32 *type, UINT32 *length) +{ + UINT32 crc, chunk_crc; + UINT8 tempbuff[4]; - free(chunk_data); - break; + /* fetch the length of this chunk */ + if (mame_fread(fp, tempbuff, 4) != 4) + return PNGERR_FILE_TRUNCATED; + *length = fetch_32bit(tempbuff); - case PNG_CN_gAMA: - p->source_gamma = convert_from_network_order(chunk_data)/100000.0; - logerror( "Source gamma: %f\n",p->source_gamma); + /* fetch the type of this chunk */ + if (mame_fread(fp, tempbuff, 4) != 4) + return PNGERR_FILE_TRUNCATED; + *type = fetch_32bit(tempbuff); - free(chunk_data); - break; + /* stop when we hit an IEND chunk */ + if (*type == PNG_CN_IEND) + return PNGERR_NONE; - case PNG_CN_pHYs: - p->xres = convert_from_network_order(chunk_data); - p->yres = convert_from_network_order(chunk_data+4); - p->resolution_unit = *(chunk_data+8); - logerror("Pixel per unit, X axis: %i\n",p->xres); - logerror("Pixel per unit, Y axis: %i\n",p->yres); - if (p->resolution_unit) - logerror("Unit is meter\n"); - else - logerror("Unit is unknown\n"); - free(chunk_data); - break; + /* start the CRC with the chunk type (but not the length) */ + crc = crc32(0, tempbuff, 4); - case PNG_CN_IEND: - break; + /* read the chunk itself into an allocated memory buffer */ + *data = NULL; + if (*length != 0) + { + /* allocate memory for this chunk */ + *data = (UINT8 *)malloc(*length); + if (*data == NULL) + return PNGERR_OUT_OF_MEMORY; - default: - if (chunk_type & 0x20000000) - logerror("Ignoring ancillary chunk %s\n",str_chunk_type); - else - logerror("Ignoring critical chunk %s!\n",str_chunk_type); - if (chunk_data) - free(chunk_data); - break; + /* read the data from the file */ + if (mame_fread(fp, *data, *length) != *length) + { + free(*data); + return PNGERR_FILE_TRUNCATED; } + + /* update the CRC */ + crc = crc32(crc, *data, *length); } - if ((p->zimage = (UINT8 *)malloc(p->zlength))==NULL) + + /* read the CRC */ + if (mame_fread(fp, tempbuff, 4) != 4) { - logerror("Out of memory\n"); - return 0; + free(*data); + return PNGERR_FILE_TRUNCATED; } + chunk_crc = fetch_32bit(tempbuff); - /* combine idat chunks to compressed image data */ - temp = p->zimage; - while (ihead->next) + /* validate the CRC */ + if (crc != chunk_crc) { - pidat = ihead; - memcpy (temp, pidat->data, pidat->length); - free (pidat->data); - temp += pidat->length; - ihead = pidat->next; - free (pidat); + free(*data); + return PNGERR_FILE_CORRUPT; } - free(ihead); - p->bpp = (samples[p->color_type] * p->bit_depth) / 8; - p->rowbytes = ceil((p->width * p->bit_depth * samples[p->color_type]) / 8.0); - - if (png_inflate_image(p)==0) - return 0; + return PNGERR_NONE; +} - if(png_unfilter (p)==0) - return 0; - return 1; -} +/*------------------------------------------------- + process_chunk - process a PNG chunk +-------------------------------------------------*/ -int png_read_info(mame_file *fp, png_info *p) +static int process_chunk(png_private *png, UINT8 *data, UINT32 type, UINT32 length, int *keepmem) { - UINT32 chunk_length, chunk_type=0, chunk_crc, crc; - UINT8 *chunk_data; - UINT8 str_chunk_type[5], v[4]; - int res = 0; + /* default to not keeping memory */ + *keepmem = FALSE; - if (png_verify_signature(fp)==0) - return 0; - - while (chunk_type != PNG_CN_IEND) + /* switch off of the type */ + switch (type) { - if (mame_fread(fp, v, 4) != 4) - logerror("Unexpected EOF in PNG\n"); - chunk_length=convert_from_network_order(v); - - if (mame_fread(fp, str_chunk_type, 4) != 4) - logerror("Unexpected EOF in PNG file\n"); - - str_chunk_type[4]=0; /* terminate string */ - - crc=crc32(0,str_chunk_type, 4); - chunk_type = convert_from_network_order(str_chunk_type); + /* image header */ + case PNG_CN_IHDR: + png->pnginfo->width = fetch_32bit(data); + png->pnginfo->height = fetch_32bit(data + 4); + png->pnginfo->bit_depth = fetch_8bit(data + 8); + png->pnginfo->color_type = fetch_8bit(data + 9); + png->pnginfo->compression_method = fetch_8bit(data + 10); + png->pnginfo->filter_method = fetch_8bit(data + 11); + png->pnginfo->interlace_method = fetch_8bit(data + 12); + break; - if (chunk_length) - { - if ((chunk_data = (UINT8 *)malloc(chunk_length+1))==NULL) - { - logerror("Out of memory\n"); - return 0; - } - if (mame_fread (fp, chunk_data, chunk_length) != chunk_length) - { - logerror("Unexpected EOF in PNG file\n"); - free(chunk_data); - return 0; - } + /* palette */ + case PNG_CN_PLTE: + png->pnginfo->num_palette = length / 3; + png->pnginfo->palette = data; + *keepmem = TRUE; + break; - crc=crc32(crc,chunk_data, chunk_length); - } - else - chunk_data = NULL; + /* transparency information */ + case PNG_CN_tRNS: + png->pnginfo->num_trans = length; + png->pnginfo->trans = data; + *keepmem = TRUE; + break; - if (mame_fread(fp, v, 4) != 4) - logerror("Unexpected EOF in PNG\n"); - chunk_crc=convert_from_network_order(v); + /* image data */ + case PNG_CN_IDAT: - if (crc != chunk_crc) - { - logerror("CRC check failed while reading PNG chunk %s\n",str_chunk_type); - logerror("Found: %08X Expected: %08X\n",crc,chunk_crc); - return 0; - } + /* allocate a new image data descriptor */ + *png->idata_next = malloc(sizeof(**png->idata_next)); + if (*png->idata_next == NULL) + return PNGERR_OUT_OF_MEMORY; + + /* add it to the tail of the list */ + (*png->idata_next)->next = NULL; + (*png->idata_next)->length = length; + (*png->idata_next)->data = data; + png->idata_next = &(*png->idata_next)->next; + *keepmem = TRUE; + break; - logerror("Reading PNG chunk %s\n", str_chunk_type); + /* gamma */ + case PNG_CN_gAMA: + png->pnginfo->source_gamma = fetch_32bit(data) / 100000.0; + break; - switch (chunk_type) - { - case PNG_CN_IHDR: - p->width = convert_from_network_order(chunk_data); - p->height = convert_from_network_order(chunk_data+4); - p->bit_depth = *(chunk_data+8); - p->color_type = *(chunk_data+9); - p->compression_method = *(chunk_data+10); - p->filter_method = *(chunk_data+11); - p->interlace_method = *(chunk_data+12); - free (chunk_data); - - logerror("PNG IHDR information:\n"); - logerror("Width: %i, Height: %i\n", p->width, p->height); - logerror("Bit depth %i, color type: %i\n", p->bit_depth, p->color_type); - logerror("Compression method: %i, filter: %i, interlace: %i\n", - p->compression_method, p->filter_method, p->interlace_method); + /* physical information */ + case PNG_CN_pHYs: + png->pnginfo->xres = fetch_32bit(data); + png->pnginfo->yres = fetch_32bit(data + 4); + png->pnginfo->resolution_unit = fetch_8bit(data + 8); break; + /* text */ case PNG_CN_tEXt: - { - char *text = (char *)chunk_data; - int c; + { + png_text *text, *pt, *ct; + + /* allocate a new text item */ + text = malloc(sizeof(*text)); + if (text == NULL) + return PNGERR_OUT_OF_MEMORY; + + /* set the elements */ + text->keyword = (char *)data; + text->text = text->keyword + strlen(text->keyword) + 1; + text->next = NULL; + + /* add to the end of the list */ + for (pt = NULL, ct = png->pnginfo->textlist; ct != NULL; pt = ct, ct = ct->next) ; + if (pt == NULL) + png->pnginfo->textlist = text; + else + pt->next = text; - while(*text++) ; - chunk_data[chunk_length]=0; - if (strcmp ((const char *)chunk_data, "Screen") == 0) - { - c = sscanf (text, "%i%i%i%i", &p->screen.min_x, &p->screen.max_x, - &p->screen.min_y, &p->screen.max_y); - if (c == 4) - { - res = 1; - logerror("Screen location found at %i, %i, %i, %i\n", - p->screen.min_x, p->screen.max_x, - p->screen.min_y, p->screen.max_y); - } - else - logerror("Invalid %s value %s\n", chunk_data, text); - } - } - free(chunk_data); + *keepmem = TRUE; break; + } + /* anything else */ default: - if (chunk_data) - free(chunk_data); + if ((type & 0x20000000) == 0) + return PNGERR_UNKNOWN_CHUNK; break; - } } - return res; + return PNGERR_NONE; } -/* Expands a p->image from p->bit_depth to 8 bit */ -int png_expand_buffer_8bit (png_info *p) + +/*------------------------------------------------- + unfilter_row - unfilter a single row of pixels +-------------------------------------------------*/ + +static int unfilter_row(int type, UINT8 *src, UINT8 *dst, UINT8 *dstprev, int bpp, int rowbytes) { - int i,j, k; - UINT8 *inp, *outp, *outbuf; + int x; - if (p->bit_depth < 8) + /* switch off of it */ + switch (type) { - if ((outbuf = (UINT8 *)malloc(p->width*p->height))==NULL) - { - logerror("Out of memory\n"); - return 0; - } + /* no filter, just copy */ + case PNG_PF_None: + for (x = 0; x < rowbytes; x++) + *dst++ = *src++; + break; - inp = p->image; - outp = outbuf; + /* SUB = previous pixel */ + case PNG_PF_Sub: + for (x = 0; x < bpp; x++) + *dst++ = *src++; + for (x = bpp; x < rowbytes; x++, dst++) + *dst = *src++ + dst[-bpp]; + break; - for (i = 0; i < p->height; i++) - { - for(j = 0; j < p->width / ( 8 / p->bit_depth); j++) + /* UP = pixel above */ + case PNG_PF_Up: + if (dstprev == NULL) + return unfilter_row(PNG_PF_None, src, dst, dstprev, bpp, rowbytes); + for (x = 0; x < rowbytes; x++, dst++) + *dst = *src++ + *dstprev++; + break; + + /* AVERAGE = average of pixel above and previous pixel */ + case PNG_PF_Average: + if (dstprev == NULL) { - for (k = 8 / p->bit_depth-1; k >= 0; k--) - *outp++ = (*inp >> k * p->bit_depth) & (0xff >> (8 - p->bit_depth)); - inp++; + for (x = 0; x < bpp; x++) + *dst++ = *src++; + for (x = bpp; x < rowbytes; x++, dst++) + *dst = *src++ + dst[-bpp] / 2; } - if (p->width % (8 / p->bit_depth)) + else { - for (k = p->width % (8 / p->bit_depth)-1; k >= 0; k--) - *outp++ = (*inp >> k * p->bit_depth) & (0xff >> (8 - p->bit_depth)); - inp++; + for (x = 0; x < bpp; x++, dst++) + *dst = *src++ + *dstprev++ / 2; + for (x = bpp; x < rowbytes; x++, dst++) + *dst = *src++ + (*dstprev++ + dst[-bpp]) / 2; } - } - free (p->image); - p->image = outbuf; + break; + + /* PAETH = special filter */ + case PNG_PF_Paeth: + for (x = 0; x < rowbytes; x++) + { + INT32 pa = (x < bpp) ? 0 : dst[-bpp]; + INT32 pc = (x < bpp || dstprev == NULL) ? 0 : dstprev[-bpp]; + INT32 pb = (dstprev == NULL) ? 0 : *dstprev++; + INT32 prediction = pa + pb - pc; + INT32 da = abs(prediction - pa); + INT32 db = abs(prediction - pb); + INT32 dc = abs(prediction - pc); + if (da <= db && da <= dc) + *dst++ = *src++ + pa; + else if (db <= dc) + *dst++ = *src++ + pb; + else + *dst++ = *src++ + pc; + } + break; + + /* unknown filter type */ + default: + return PNGERR_UNKNOWN_FILTER; } - return 1; + + return PNGERR_NONE; } -void png_delete_unused_colors (png_info *p) + +/*------------------------------------------------- + process_image - post-process a loaded iamge +-------------------------------------------------*/ + +static int process_image(png_private *png) { - int i, tab[256], pen=0, trns=0; - UINT8 ptemp[3*256], ttemp[256]; + int rowbytes, bpp, imagesize; + int error = PNGERR_NONE; + image_data_chunk *idat; + UINT8 *src, *dst; + z_stream stream; + int zerr, y; + + /* compute some basic parameters */ + bpp = compute_bpp(png->pnginfo); + rowbytes = compute_rowbytes(png->pnginfo); + imagesize = png->pnginfo->height * (rowbytes + 1); + + /* allocate memory for the filtered image */ + png->pnginfo->image = (UINT8 *)malloc(imagesize); + if (png->pnginfo->image == NULL) + return PNGERR_OUT_OF_MEMORY; + + /* initialize the stream */ + memset(&stream, 0, sizeof(stream)); + stream.next_out = png->pnginfo->image; + stream.avail_out = imagesize; + zerr = inflateInit(&stream); + if (zerr != Z_OK) + { + error = PNGERR_DECOMPRESS_ERROR; + goto handle_error; + } - memset (tab, 0, 256*sizeof(int)); - memcpy (ptemp, p->palette, 3*p->num_palette); - memcpy (ttemp, p->trans, p->num_trans); + /* loop over IDAT and decompress each as part of a larger stream */ + for (idat = png->idata; idat != NULL; idat = idat->next) + { + /* decompress this chunk */ + stream.next_in = idat->data; + stream.avail_in = idat->length; + zerr = inflate(&stream, Z_NO_FLUSH); - /* check which colors are actually used */ - for (i = 0; i < p->height*p->width; i++) - tab[p->image[i]]++; + /* stop at the end of the stream */ + if (zerr == Z_STREAM_END) + break; - /* shrink palette and transparency */ - for (i = 0; i < p->num_palette; i++) - if (tab[i]) + /* other errors are fatal */ + if (zerr != Z_OK) { - p->palette[3*pen+0]=ptemp[3*i+0]; - p->palette[3*pen+1]=ptemp[3*i+1]; - p->palette[3*pen+2]=ptemp[3*i+2]; - if (i < p->num_trans) - { - p->trans[pen] = ttemp[i]; - trns++; - } - tab[i] = pen++; + error = PNGERR_DECOMPRESS_ERROR; + goto handle_error; } + } - /* remap colors */ - for (i = 0; i < p->height*p->width; i++) - p->image[i]=tab[p->image[i]]; - - if (p->num_palette!=pen) - logerror("%i unused pen(s) deleted\n", p->num_palette-pen); - - p->num_palette = pen; - p->num_trans = trns; -} - -/******************************************************************************** + /* clean up */ + zerr = inflateEnd(&stream); + if (zerr != Z_OK) + { + error = PNGERR_DECOMPRESS_ERROR; + goto handle_error; + } - PNG write functions + /* we de-filter in place */ + src = dst = png->pnginfo->image; -********************************************************************************/ + /* iterate over rows */ + for (y = 0; y < png->pnginfo->height && error == PNGERR_NONE; y++) + { + /* first byte of each row is the filter type */ + int filter = *src++; + error = unfilter_row(filter, src, dst, (y == 0) ? NULL : &dst[-rowbytes], bpp, rowbytes); + src += rowbytes; + dst += rowbytes; + } -struct _png_text -{ - char *data; - int length; - struct _png_text *next; -}; -typedef struct _png_text png_text; +handle_error: + /* if we errored, free the image data */ + if (error != PNGERR_NONE) + { + free(png->pnginfo->image); + png->pnginfo->image = NULL; + } + return error; +} -static png_text *png_text_list = 0; -static void convert_to_network_order (UINT32 i, UINT8 *v) -{ - v[0]=i>>24; - v[1]=(i>>16)&0xff; - v[2]=(i>>8)&0xff; - v[3]=i&0xff; -} +/*------------------------------------------------- + png_read_file - read a PNG from a MAME stream +-------------------------------------------------*/ -int png_add_text (const char *keyword, const char *text) +int png_read_file(mame_file *fp, png_info *pnginfo) { - png_text *pt; + UINT8 *chunk_data = NULL; + png_private png; + int error; + + /* initialize the data structures */ + memset(&png, 0, sizeof(png)); + memset(pnginfo, 0, sizeof(*pnginfo)); + png.pnginfo = pnginfo; + png.idata_next = &png.idata; + + /* verify the signature at the start of the file */ + error = verify_header(fp); + if (error != PNGERR_NONE) + goto handle_error; + + /* loop until we hit an IEND chunk */ + for ( ; ; ) + { + UINT32 chunk_type, chunk_length; + int keepmem; - pt = malloc (sizeof(png_text)); - if (pt == 0) - return 0; + /* read a chunk */ + error = read_chunk(fp, &chunk_data, &chunk_type, &chunk_length); + if (error != PNGERR_NONE) + goto handle_error; - pt->length = strlen(keyword) + strlen(text) + 1; - pt->data = malloc (pt->length + 1); - if (pt->data == 0) - return 0; + /* stop when we hit an IEND chunk */ + if (chunk_type == PNG_CN_IEND) + break; - strcpy (pt->data, keyword); - strcpy (pt->data + strlen(keyword) + 1, text); - pt->next = png_text_list; - png_text_list = pt; + /* process the chunk */ + error = process_chunk(&png, chunk_data, chunk_type, chunk_length, &keepmem); + if (error != PNGERR_NONE) + goto handle_error; - return 1; -} - -static int write_chunk(mame_file *fp, UINT32 chunk_type, UINT8 *chunk_data, UINT32 chunk_length) -{ - UINT32 crc; - UINT8 v[4]; - int written; + /* free memory if we didn't want to keep it */ + if (!keepmem) + free(chunk_data); + chunk_data = NULL; + } - /* write length */ - convert_to_network_order(chunk_length, v); - written = mame_fwrite(fp, v, 4); + /* finish processing the image */ + error = process_image(&png); + if (error != PNGERR_NONE) + goto handle_error; - /* write type */ - convert_to_network_order(chunk_type, v); - written += mame_fwrite(fp, v, 4); +handle_error: - /* calculate crc */ - crc=crc32(0, v, 4); - if (chunk_length > 0) + /* free all intermediate data */ + while (png.idata != NULL) { - /* write data */ - written += mame_fwrite(fp, chunk_data, chunk_length); - crc=crc32(crc, chunk_data, chunk_length); + image_data_chunk *next = png.idata->next; + if (png.idata->data != NULL) + free(png.idata->data); + free(png.idata); + png.idata = next; } - convert_to_network_order(crc, v); - - /* write crc */ - written += mame_fwrite(fp, v, 4); + if (chunk_data != NULL) + free(chunk_data); - if (written != 3*4+chunk_length) + /* if we have an error, free all the other data as well */ + if (error != PNGERR_NONE) { - logerror("Chunk write failed\n"); - return 0; + png_free(pnginfo); + memset(pnginfo, 0, sizeof(*pnginfo)); } - return 1; + return error; } -int png_write_sig(mame_file *fp) + +/*------------------------------------------------- + png_expand_buffer_8bit - expand a buffer from + sub 8-bit to 8-bit +-------------------------------------------------*/ + +int png_expand_buffer_8bit(png_info *pnginfo) { - /* PNG Signature */ - if (mame_fwrite(fp, PNG_Signature, 8) != 8) + int i,j, k; + UINT8 *inp, *outp, *outbuf; + + /* nothing to do if we're at 8 or greater already */ + if (pnginfo->bit_depth >= 8) + return PNGERR_NONE; + + /* allocate a new buffer at 8-bit */ + outbuf = malloc(pnginfo->width * pnginfo->height); + if (outbuf == NULL) + return PNGERR_OUT_OF_MEMORY; + + inp = pnginfo->image; + outp = outbuf; + + for (i = 0; i < pnginfo->height; i++) { - logerror("PNG sig write failed\n"); - return 0; + for(j = 0; j < pnginfo->width / ( 8 / pnginfo->bit_depth); j++) + { + for (k = 8 / pnginfo->bit_depth-1; k >= 0; k--) + *outp++ = (*inp >> k * pnginfo->bit_depth) & (0xff >> (8 - pnginfo->bit_depth)); + inp++; + } + if (pnginfo->width % (8 / pnginfo->bit_depth)) + { + for (k = pnginfo->width % (8 / pnginfo->bit_depth)-1; k >= 0; k--) + *outp++ = (*inp >> k * pnginfo->bit_depth) & (0xff >> (8 - pnginfo->bit_depth)); + inp++; + } } + free (pnginfo->image); + pnginfo->image = outbuf; + return 1; } -int png_write_datastream(mame_file *fp, png_info *p) -{ - UINT8 ihdr[13]; - png_text *pt; - - /* IHDR */ - convert_to_network_order(p->width, ihdr); - convert_to_network_order(p->height, ihdr+4); - *(ihdr+8) = p->bit_depth; - *(ihdr+9) = p->color_type; - *(ihdr+10) = p->compression_method; - *(ihdr+11) = p->filter_method; - *(ihdr+12) = p->interlace_method; - logerror("Type(%d) Color Depth(%d)\n", p->color_type,p->bit_depth); - if (write_chunk(fp, PNG_CN_IHDR, ihdr, 13)==0) - return 0; - - /* PLTE */ - if (p->num_palette > 0) - if (write_chunk(fp, PNG_CN_PLTE, p->palette, p->num_palette*3)==0) - return 0; - - /* IDAT */ - if (write_chunk(fp, PNG_CN_IDAT, p->zimage, p->zlength)==0) - return 0; - - /* tEXt */ - while (png_text_list) - { - pt = png_text_list; - if (write_chunk(fp, PNG_CN_tEXt, (UINT8 *)pt->data, pt->length)==0) - return 0; - free (pt->data); - png_text_list = pt->next; - free (pt); - } - /* IEND */ - if (write_chunk(fp, PNG_CN_IEND, NULL, 0)==0) - return 0; +/*************************************************************************** + PNG WRITING FUNCTIONS +***************************************************************************/ - return 1; -} +/*------------------------------------------------- + add_text - add a text entry to the png_info +-------------------------------------------------*/ -int png_filter(png_info *p) +static int add_text(png_info *pnginfo, const char *keyword, const char *text) { - int i; - UINT8 *src, *dst; - - if((p->fimage = (UINT8 *)malloc (p->height*(p->rowbytes+1)))==NULL) + png_text *newtext, *pt, *ct; + char *textdata; + int keylen; + + /* allocate a new text element */ + newtext = malloc(sizeof(*newtext)); + if (newtext == NULL) + return PNGERR_OUT_OF_MEMORY; + + /* allocate a string long enough to hold both */ + keylen = strlen(keyword); + textdata = malloc(keylen + 1 + strlen(text) + 1); + if (textdata == NULL) { - logerror("Out of memory\n"); - return 0; + free(newtext); + return PNGERR_OUT_OF_MEMORY; } - dst = p->fimage; - src = p->image; + /* copy in the data */ + strcpy(textdata, keyword); + strcpy(textdata + keylen + 1, text); - for (i=0; iheight; i++) - { - *dst++ = 0; /* No filter */ - memcpy (dst, src, p->rowbytes); - src += p->rowbytes; - dst += p->rowbytes; - } - return 1; + /* text follows a trailing NULL */ + newtext->keyword = textdata; + newtext->text = textdata + keylen + 1; + newtext->next = NULL; + + /* add us to the end of the linked list */ + for (pt = NULL, ct = pnginfo->textlist; ct != NULL; pt = ct, ct = ct->next) ; + if (pt == NULL) + pnginfo->textlist = newtext; + else + pt->next = newtext; + + return PNGERR_NONE; } -int png_deflate_image(png_info *p) + +/*------------------------------------------------- + write_chunk - write an in-memory chunk to + the given file +-------------------------------------------------*/ + +static int write_chunk(mame_file *fp, const UINT8 *data, UINT32 type, UINT32 length) { - unsigned long zbuff_size; + UINT8 tempbuff[8]; + UINT32 crc; - zbuff_size = (p->height*(p->rowbytes+1))*1.1+12; + /* stuff the length/type into the buffer */ + put_32bit(tempbuff + 0, length); + put_32bit(tempbuff + 4, type); + crc = crc32(0, tempbuff + 4, 4); - if((p->zimage = (UINT8 *)malloc (zbuff_size))==NULL) - { - logerror("Out of memory\n"); - return 0; - } + /* write that data */ + if (mame_fwrite(fp, tempbuff, 8) != 8) + return PNGERR_FILE_ERROR; - if (compress(p->zimage, &zbuff_size, p->fimage, p->height*(p->rowbytes+1)) != Z_OK) + /* append the actual data */ + if (length > 0) { - logerror("Error while deflating image\n"); - return 0; + if (mame_fwrite(fp, data, length) != length) + return PNGERR_FILE_ERROR; + crc = crc32(crc, data, length); } - p->zlength = zbuff_size; - return 1; + /* write the CRC */ + put_32bit(tempbuff, crc); + if (mame_fwrite(fp, tempbuff, 4) != 4) + return PNGERR_FILE_ERROR; + + return PNGERR_NONE; } -static int png_pack_buffer (png_info *p) -{ - UINT8 *outp, *inp; - int i,j,k; - outp = inp = p->image; +/*------------------------------------------------- + write_deflated_chunk - write an in-memory + chunk to the given file by deflating it +-------------------------------------------------*/ - if (p->bit_depth < 8) +static int write_deflated_chunk(mame_file *fp, UINT8 *data, UINT32 type, UINT32 length) +{ + UINT64 lengthpos = mame_ftell(fp); + UINT8 tempbuff[8192]; + UINT32 zlength = 0; + z_stream stream; + UINT32 crc; + int zerr; + + /* stuff the length/type into the buffer */ + put_32bit(tempbuff + 0, length); + put_32bit(tempbuff + 4, type); + crc = crc32(0, tempbuff + 4, 4); + + /* write that data */ + if (mame_fwrite(fp, tempbuff, 8) != 8) + return PNGERR_FILE_ERROR; + + /* initialize the stream */ + memset(&stream, 0, sizeof(stream)); + stream.next_in = data; + stream.avail_in = length; + zerr = deflateInit(&stream, Z_DEFAULT_COMPRESSION); + if (zerr != Z_OK) + return PNGERR_COMPRESS_ERROR; + + /* now loop until we run out of data */ + for ( ; ; ) { - for (i=0; iheight; i++) + /* compress this chunk */ + stream.next_out = tempbuff; + stream.avail_out = sizeof(tempbuff); + zerr = deflate(&stream, Z_FINISH); + + /* if there's data to write, do it */ + if (stream.avail_out < sizeof(tempbuff)) { - for(j=0; jwidth/(8/p->bit_depth); j++) - { - for (k=8/p->bit_depth-1; k>=0; k--) - *outp |= *inp++ << k * p->bit_depth; - outp++; - *outp = 0; - } - if (p->width % (8/p->bit_depth)) + int bytes = sizeof(tempbuff) - stream.avail_out; + if (mame_fwrite(fp, tempbuff, bytes) != bytes) { - for (k=p->width%(8/p->bit_depth)-1; k>=0; k--) - *outp |= *inp++ << k * p->bit_depth; - outp++; - *outp = 0; + deflateEnd(&stream); + return PNGERR_FILE_ERROR; } + crc = crc32(crc, tempbuff, bytes); + zlength += bytes; + } + + /* stop at the end of the stream */ + if (zerr == Z_STREAM_END) + break; + + /* other errors are fatal */ + if (zerr != Z_OK) + { + deflateEnd(&stream); + return PNGERR_COMPRESS_ERROR; } } - return 1; + + /* clean up deflater(maus) */ + zerr = deflateEnd(&stream); + if (zerr != Z_OK) + return PNGERR_COMPRESS_ERROR; + + /* write the CRC */ + put_32bit(tempbuff, crc); + if (mame_fwrite(fp, tempbuff, 4) != 4) + return PNGERR_FILE_ERROR; + + /* seek back and update the length */ + mame_fseek(fp, lengthpos, SEEK_SET); + put_32bit(tempbuff + 0, zlength); + if (mame_fwrite(fp, tempbuff, 4) != 4) + return PNGERR_FILE_ERROR; + + /* return to the end */ + mame_fseek(fp, lengthpos + 8 + zlength + 4, SEEK_SET); + return PNGERR_NONE; } -/********************************************************************* +/*------------------------------------------------- + convert_bitmap_to_image_palette - convert a + bitmap to a palettized image +-------------------------------------------------*/ - Writes an mame_bitmap in a PNG file. If the depth of the bitmap - is 8, a color type 3 PNG with palette is written. Otherwise a - color type 2 true color RGB PNG is written. +static int convert_bitmap_to_image_palette(png_info *pnginfo, const mame_bitmap *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->bit_depth = 8; + pnginfo->color_type = 3; + pnginfo->num_palette = 256; + rowbytes = pnginfo->width; + + /* allocate memory for the palette */ + pnginfo->palette = malloc(3 * 256); + if (pnginfo->palette == NULL) + return PNGERR_OUT_OF_MEMORY; + + /* build the palette */ + memset(pnginfo->palette, 0, 3 * 256); + for (x = 0; x < palette_length; x++) + { + rgb_t color = palette[x]; + pnginfo->palette[3 * x + 0] = RGB_RED(color); + pnginfo->palette[3 * x + 1] = RGB_GREEN(color); + pnginfo->palette[3 * x + 2] = RGB_BLUE(color); + } - *********************************************************************/ + /* allocate memory for the image */ + pnginfo->image = malloc(pnginfo->height * (rowbytes + 1)); + if (pnginfo->image == NULL) + { + free(pnginfo->palette); + return PNGERR_OUT_OF_MEMORY; + } -static int png_create_datastream(void *fp, mame_bitmap *bitmap) -{ - int i, j; - int r, g, b; - UINT32 color; - UINT8 *ip; - png_info p; - - memset (&p, 0, sizeof (png_info)); - p.xscale = p.yscale = p.source_gamma = 0.0; - p.palette = p.trans = p.image = p.zimage = p.fimage = NULL; - p.width = bitmap->width; - p.height = bitmap->height; - - if ((bitmap->depth == 16) && (Machine->drv->total_colors <= 256)) + /* copy in the pixels, specifying a NULL filter */ + for (y = 0; y < pnginfo->height; y++) { - p.color_type = 3; - if((p.palette = (UINT8 *)malloc (3*256))==NULL) - { - logerror("Out of memory\n"); - return 0; - } - memset (p.palette, 0, 3*256); - /* get palette */ - for (i = 0; i < Machine->drv->total_colors; i++) - palette_get_color(i,&p.palette[3*i],&p.palette[3*i+1],&p.palette[3*i+2]); + UINT16 *src = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + UINT8 *dst = pnginfo->image + y * (rowbytes + 1); - p.num_palette = 256; - if((p.image = (UINT8 *)malloc (p.height*p.width))==NULL) - { - logerror("Out of memory\n"); - return 0; - } + /* store the filter byte, then copy the data */ + *dst++ = 0; + for (x = 0; x < pnginfo->width; x++) + *dst++ = *src++; + } - for (i = 0; i < p.height; i++) - for (j = 0; j < p.width; j++) - p.image[i * p.width + j] = ((UINT16 *)bitmap->line[i])[j]; + return PNGERR_NONE; +} - png_delete_unused_colors (&p); - p.bit_depth = p.num_palette > 16 ? 8 : p.num_palette > 4 ? 4 : p.num_palette > 2 ? 2 : 1; - p.rowbytes=ceil((p.width*p.bit_depth)/8.0); - if (png_pack_buffer (&p) == 0) - return 0; - } - else +/*------------------------------------------------- + convert_bitmap_to_image_rgb - convert a + bitmap to an RGB image +-------------------------------------------------*/ + +static int convert_bitmap_to_image_rgb(png_info *pnginfo, const mame_bitmap *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->bit_depth = 8; + pnginfo->color_type = 2; + rowbytes = pnginfo->width * 3; + + /* allocate memory for the image */ + pnginfo->image = malloc(pnginfo->height * (rowbytes + 1)); + if (pnginfo->image == NULL) + return PNGERR_OUT_OF_MEMORY; + + /* copy in the pixels, specifying a NULL filter */ + for (y = 0; y < pnginfo->height; y++) { - p.color_type = 2; - p.rowbytes = p.width * 3; - p.bit_depth = 8; - if((p.image = (UINT8 *)malloc (p.height * p.rowbytes))==NULL) - { - logerror("Out of memory\n"); - return 0; - } + UINT32 *src32 = (UINT32 *)bitmap->base + y * bitmap->rowpixels; + UINT16 *src16 = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + UINT8 *dst = pnginfo->image + y * (rowbytes + 1); - ip = p.image; + /* store the filter byte, then copy the data */ + *dst++ = 0; + /* based on the bitmap depth, we need to translate */ switch (bitmap->depth) { - case 16: /* 16BIT */ - for (i = 0; i < p.height; i++) - for (j = 0; j < p.width; j++) + /* 16bpp palettized */ + case 16: + for (x = 0; x < pnginfo->width; x++) { - palette_get_color(((UINT16 *)bitmap->line[i])[j],ip, ip+1, ip+2); - ip += 3; + rgb_t color = palette[*src16++]; + *dst++ = RGB_RED(color); + *dst++ = RGB_GREEN(color); + *dst++ = RGB_BLUE(color); } - break; - case 15: /* DIRECT_15BIT */ - for (i = 0; i < p.height; i++) - for (j = 0; j < p.width; j++) - { - color = ((UINT16 *)bitmap->line[i])[j]; - - r = (color >> 10) & 0x1f; - g = (color >> 5) & 0x1f; - b = (color >> 0) & 0x1f; + break; - *ip++ = (r << 3) | (r >> 2); - *ip++ = (g << 3) | (g >> 2); - *ip++ = (b << 3) | (b >> 2); - } - break; - case 32: /* DIRECT_32BIT */ - for (i = 0; i < p.height; i++) - for (j = 0; j < p.width; j++) + /* 15-bit RGB direct */ + case 15: + for (x = 0; x < pnginfo->width; x++) { - color = ((UINT32 *)bitmap->line[i])[j]; - - r = (color >> 16) & 0xff; - g = (color >> 8) & 0xff; - b = (color >> 0) & 0xff; + UINT16 raw = *src16++; + *dst++ = pal5bit(raw >> 10); + *dst++ = pal5bit(raw >> 5); + *dst++ = pal5bit(raw >> 0); + } + break; - *ip++ = r; - *ip++ = g; - *ip++ = b; + /* 32-bit RGB direct */ + case 32: + for (x = 0; x < pnginfo->width; x++) + { + UINT32 raw = *src32++; + *dst++ = RGB_RED(raw); + *dst++ = RGB_GREEN(raw); + *dst++ = RGB_BLUE(raw); } - break; - default: - logerror("Unknown color depth\n"); - break; + break; } } - if(png_filter (&p)==0) - return 0; + return PNGERR_NONE; +} - if (png_deflate_image(&p)==0) - return 0; - if (png_write_datastream(fp, &p)==0) - return 0; +/*------------------------------------------------- + write_png_stream - stream a series of PNG + chunks to the given file +-------------------------------------------------*/ - if (p.palette) free (p.palette); - if (p.image) free (p.image); - if (p.zimage) free (p.zimage); - if (p.fimage) free (p.fimage); - return 1; +static int write_png_stream(void *fp, png_info *pnginfo, const mame_bitmap *bitmap, int palette_length, const rgb_t *palette) +{ + UINT8 tempbuff[16]; + png_text *text; + int error; + + /* create an unfiltered image in either palette or RGB form */ + if (bitmap->depth == 16 && 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); + if (error != PNGERR_NONE) + goto handle_error; + + /* if we wanted to get clever and do filtering, we would do it here */ + + /* write the IHDR chunk */ + put_32bit(tempbuff + 0, pnginfo->width); + put_32bit(tempbuff + 4, pnginfo->height); + put_8bit(tempbuff + 8, pnginfo->bit_depth); + put_8bit(tempbuff + 9, pnginfo->color_type); + put_8bit(tempbuff + 10, pnginfo->compression_method); + put_8bit(tempbuff + 11, pnginfo->filter_method); + put_8bit(tempbuff + 12, pnginfo->interlace_method); + error = write_chunk(fp, tempbuff, PNG_CN_IHDR, 13); + if (error != PNGERR_NONE) + goto handle_error; + + /* write the PLTE chunk */ + if (pnginfo->num_palette > 0) + error = write_chunk(fp, pnginfo->palette, PNG_CN_PLTE, pnginfo->num_palette * 3); + if (error != PNGERR_NONE) + goto handle_error; + + /* write a single IDAT chunk */ + error = write_deflated_chunk(fp, pnginfo->image, PNG_CN_IDAT, pnginfo->height * (compute_rowbytes(pnginfo) + 1)); + if (error != PNGERR_NONE) + goto handle_error; + + /* write TEXT chunks */ + for (text = pnginfo->textlist; text != NULL; text = text->next) + { + error = write_chunk(fp, (UINT8 *)text->keyword, PNG_CN_tEXt, strlen(text->keyword) + 1 + strlen(text->text)); + if (error != PNGERR_NONE) + goto handle_error; + } + + /* write an IEND chunk */ + error = write_chunk(fp, NULL, PNG_CN_IEND, 0); + +handle_error: + return error; } + + int png_write_bitmap(mame_file *fp, mame_bitmap *bitmap) { + png_info pnginfo; char text[1024]; + int error; - sprintf (text, APPNAME " %s", build_version); - png_add_text("Software", text); - sprintf (text, "%s %s", Machine->gamedrv->manufacturer, Machine->gamedrv->description); - png_add_text("System", text); + /* reset all entries in the PNG info */ + memset(&pnginfo, 0, sizeof(pnginfo)); - if(png_write_sig(fp) == 0) - return 0; + /* add two text entries describing the image */ + sprintf(text, APPNAME " %s", build_version); + add_text(&pnginfo, "Software", text); + sprintf(text, "%s %s", Machine->gamedrv->manufacturer, Machine->gamedrv->description); + add_text(&pnginfo, "System", text); - if(png_create_datastream(fp, bitmap) == 0) - return 0; + /* write the PNG signature */ + if (mame_fwrite(fp, PNG_Signature, 8) != 8) + { + png_free(&pnginfo); + return PNGERR_FILE_ERROR; + } - return 1; + /* write the rest of the PNG data */ + error = write_png_stream(fp, &pnginfo, bitmap, Machine->drv->total_colors, palette_get_adjusted_colors(Machine)); + png_free(&pnginfo); + return error; } /******************************************************************************** @@ -897,49 +1011,49 @@ int png_write_bitmap(mame_file *fp, mame_bitmap *bitmap) ********************************************************************************/ +/* temporary hack for now */ +static png_info mnginfo; int mng_capture_start(mame_file *fp, mame_bitmap *bitmap) { UINT8 mhdr[28]; char text[1024]; + int error; + + memset(&mnginfo, 0, sizeof(mnginfo)); sprintf (text, APPNAME " %s", build_version); - png_add_text("Software", text); + add_text(&mnginfo, "Software", text); sprintf (text, "%s %s", Machine->gamedrv->manufacturer, Machine->gamedrv->description); - png_add_text("System", text); + add_text(&mnginfo, "System", text); if (mame_fwrite(fp, MNG_Signature, 8) != 8) { - logerror("MNG sig write failed\n"); - return 0; + png_free(&mnginfo); + return PNGERR_FILE_ERROR; } - memset (mhdr, 0, 28); - convert_to_network_order(bitmap->width, mhdr); - convert_to_network_order(bitmap->height, mhdr+4); - convert_to_network_order(Machine->screen[0].refresh, mhdr+8); - convert_to_network_order(0x0041, mhdr+24); /* Simplicity profile */ + memset(mhdr, 0, 28); + put_32bit(mhdr + 0, bitmap->width); + put_32bit(mhdr + 4, bitmap->height); + put_32bit(mhdr + 8, Machine->screen[0].refresh); + put_32bit(mhdr + 24, 0x0041); /* Simplicity profile */ /* frame count and play time unspecified because we don't know at this stage */ - if (write_chunk(fp, MNG_CN_MHDR, mhdr, 28)==0) - return 0; + error = write_chunk(fp, mhdr, MNG_CN_MHDR, 28); + if (error != PNGERR_NONE) + return error; - return 1; + return PNGERR_NONE; } int mng_capture_frame(mame_file *fp, mame_bitmap *bitmap) { - if(png_create_datastream(fp, bitmap) == 0) - return 0; - - return 1; + return write_png_stream(fp, &mnginfo, bitmap, Machine->drv->total_colors, palette_get_adjusted_colors(Machine)); } int mng_capture_stop(mame_file *fp) { - if (write_chunk(fp, MNG_CN_MEND, NULL, 0)==0) - return 0; - - return 1; + return write_chunk(fp, NULL, MNG_CN_MEND, 0); } diff --git a/src/png.h b/src/png.h index d58cd5d10..8c96409cc 100644 --- a/src/png.h +++ b/src/png.h @@ -16,85 +16,113 @@ #include "mamecore.h" + + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + #define PNG_Signature "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A" #define MNG_Signature "\x8A\x4D\x4E\x47\x0D\x0A\x1A\x0A" -#define PNG_CN_IHDR 0x49484452L /* Chunk names */ -#define PNG_CN_PLTE 0x504C5445L -#define PNG_CN_IDAT 0x49444154L -#define PNG_CN_IEND 0x49454E44L -#define PNG_CN_gAMA 0x67414D41L -#define PNG_CN_sBIT 0x73424954L -#define PNG_CN_cHRM 0x6348524DL -#define PNG_CN_tRNS 0x74524E53L -#define PNG_CN_bKGD 0x624B4744L -#define PNG_CN_hIST 0x68495354L -#define PNG_CN_tEXt 0x74455874L -#define PNG_CN_zTXt 0x7A545874L -#define PNG_CN_pHYs 0x70485973L -#define PNG_CN_oFFs 0x6F464673L -#define PNG_CN_tIME 0x74494D45L -#define PNG_CN_sCAL 0x7343414CL - -#define PNG_PF_None 0 /* Prediction filters */ -#define PNG_PF_Sub 1 -#define PNG_PF_Up 2 -#define PNG_PF_Average 3 -#define PNG_PF_Paeth 4 - -#define MNG_CN_MHDR 0x4D484452L /* MNG Chunk names */ -#define MNG_CN_MEND 0x4D454E44L -#define MNG_CN_TERM 0x5445524DL -#define MNG_CN_BACK 0x4241434BL - - -/* PNG support */ -struct _png_info +/* Chunk names */ +#define PNG_CN_IHDR 0x49484452L +#define PNG_CN_PLTE 0x504C5445L +#define PNG_CN_IDAT 0x49444154L +#define PNG_CN_IEND 0x49454E44L +#define PNG_CN_gAMA 0x67414D41L +#define PNG_CN_sBIT 0x73424954L +#define PNG_CN_cHRM 0x6348524DL +#define PNG_CN_tRNS 0x74524E53L +#define PNG_CN_bKGD 0x624B4744L +#define PNG_CN_hIST 0x68495354L +#define PNG_CN_tEXt 0x74455874L +#define PNG_CN_zTXt 0x7A545874L +#define PNG_CN_pHYs 0x70485973L +#define PNG_CN_oFFs 0x6F464673L +#define PNG_CN_tIME 0x74494D45L +#define PNG_CN_sCAL 0x7343414CL + +/* MNG Chunk names */ +#define MNG_CN_MHDR 0x4D484452L +#define MNG_CN_MEND 0x4D454E44L +#define MNG_CN_TERM 0x5445524DL +#define MNG_CN_BACK 0x4241434BL + +/* Prediction filters */ +#define PNG_PF_None 0 +#define PNG_PF_Sub 1 +#define PNG_PF_Up 2 +#define PNG_PF_Average 3 +#define PNG_PF_Paeth 4 + +/* Error types */ +#define PNGERR_NONE 0 +#define PNGERR_OUT_OF_MEMORY 1 +#define PNGERR_UNKNOWN_FILTER 2 +#define PNGERR_FILE_ERROR 3 +#define PNGERR_BAD_SIGNATURE 4 +#define PNGERR_DECOMPRESS_ERROR 5 +#define PNGERR_FILE_TRUNCATED 6 +#define PNGERR_FILE_CORRUPT 7 +#define PNGERR_UNKNOWN_CHUNK 8 +#define PNGERR_COMPRESS_ERROR 9 + + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +typedef struct _png_text png_text; +struct _png_text { - UINT32 width, height; - UINT32 xres, yres; - rectangle screen; - double xscale, yscale; - double source_gamma; - UINT32 chromaticities[8]; - UINT32 resolution_unit, offset_unit, scale_unit; - UINT8 bit_depth; - UINT32 significant_bits[4]; - UINT32 background_color[4]; - UINT8 color_type; - UINT8 compression_method; - UINT8 filter_method; - UINT8 interlace_method; - UINT32 num_palette; - UINT8 *palette; - UINT32 num_trans; - UINT8 *trans; - UINT8 *image; - - /* The rest is private and should not be used - * by the public functions - */ - UINT8 bpp; - UINT32 rowbytes; - UINT8 *zimage; - UINT32 zlength; - UINT8 *fimage; + png_text * next; + const char * keyword; /* this is allocated */ + const char * text; /* this points to a part of keyword */ }; + + typedef struct _png_info png_info; +struct _png_info +{ + UINT8 * image; + UINT32 width, height; + UINT32 xres, yres; + rectangle screen; + double xscale, yscale; + double source_gamma; + UINT32 resolution_unit; + UINT8 bit_depth; + UINT8 color_type; + UINT8 compression_method; + UINT8 filter_method; + UINT8 interlace_method; + + UINT8 * palette; + UINT32 num_palette; + + UINT8 * trans; + UINT32 num_trans; + + png_text * textlist; +}; + + -int png_verify_signature (mame_file *fp); -int png_inflate_image (png_info *p); -int png_read_file(mame_file *fp, png_info *p); -int png_read_info(mame_file *fp, png_info *p); -int png_expand_buffer_8bit (png_info *p); -void png_delete_unused_colors (png_info *p); -int png_add_text (const char *keyword, const char *text); -int png_unfilter(png_info *p); +/*************************************************************************** + FUNCTION PROTOTYPES +***************************************************************************/ + +void png_free(png_info *pnginfo); + +int png_read_file(mame_file *fp, png_info *pnginfo); +int png_expand_buffer_8bit(png_info *p); + +int png_add_text(const char *keyword, const char *text); int png_filter(png_info *p); -int png_deflate_image(png_info *p); -int png_write_sig(mame_file *fp); -int png_write_datastream(mame_file *fp, png_info *p); int png_write_bitmap(mame_file *fp, mame_bitmap *bitmap); + int mng_capture_start(mame_file *fp, mame_bitmap *bitmap); int mng_capture_frame(mame_file *fp, mame_bitmap *bitmap); int mng_capture_stop(mame_file *fp); diff --git a/src/render.c b/src/render.c index a8f739b57..a49622499 100644 --- a/src/render.c +++ b/src/render.c @@ -44,7 +44,6 @@ #include "config.h" #include "output.h" #include "xmlfile.h" -#include "png.h" #include @@ -206,6 +205,9 @@ struct _render_container static render_target *targetlist; static render_target *ui_target; +/* notifier callbacks */ +static int (*rescale_notify)(running_machine *, int, int); + /* free lists */ static render_primitive *render_primitive_free_list; static container_item *container_item_free_list; @@ -240,7 +242,7 @@ static const render_quad_texuv oriented_texcoords[8] = ***************************************************************************/ /* core system */ -static void render_exit(void); +static void render_exit(running_machine *machine); static void render_load(int config_type, xml_data_node *parentnode); static void render_save(int config_type, xml_data_node *parentnode); @@ -255,7 +257,7 @@ static void add_clear_and_optimize_primitive_list(render_target *target, render_ static void invalidate_all_render_ref(void *refptr); /* render textures */ -static void render_texture_get_scaled(render_texture *texture, UINT32 dwidth, UINT32 dheight, render_texinfo *texinfo, render_ref **reflist); +static int render_texture_get_scaled(render_texture *texture, UINT32 dwidth, UINT32 dheight, render_texinfo *texinfo, render_ref **reflist); /* render containers */ static render_container *render_container_alloc(void); @@ -459,12 +461,12 @@ INLINE void free_render_ref(render_ref *ref) the rendering system -------------------------------------------------*/ -void render_init(void) +void render_init(running_machine *machine) { int scrnum; /* make sure we clean up after ourselves */ - add_exit_callback(render_exit); + add_exit_callback(machine, render_exit); /* set up the list of render targets */ targetlist = NULL; @@ -500,7 +502,7 @@ void render_init(void) render_exit - free all rendering data -------------------------------------------------*/ -static void render_exit(void) +static void render_exit(running_machine *machine) { int screen; @@ -823,6 +825,18 @@ static void render_save(int config_type, xml_data_node *parentnode) } +/*------------------------------------------------- + render_set_rescale_notify - set a notifier + that we call before doing long scaling + operations +-------------------------------------------------*/ + +void render_set_rescale_notify(running_machine *machine, int (*notifier)(running_machine *, int, int)) +{ + rescale_notify = notifier; +} + + /*------------------------------------------------- render_get_live_screens_mask - return a bitmask indicating the live screens @@ -1364,7 +1378,7 @@ const render_primitive_list *render_target_get_primitives(render_target *target) layer_order = alternate_order; /* iterate over layers back-to-front, but only if we're running */ - if (mame_get_phase() >= MAME_PHASE_RESET) + if (mame_get_phase(Machine) >= MAME_PHASE_RESET) for (layernum = 0; layernum < ITEM_LAYER_MAX; layernum++) { int layer = layer_order[layernum]; @@ -1437,7 +1451,6 @@ const render_primitive_list *render_target_get_primitives(render_target *target) append_render_primitive(&target->primlist[listnum], prim); } - /* process the UI if we are the UI target */ if (target == render_get_ui_target()) { @@ -1662,27 +1675,28 @@ static void add_container_primitives(render_target *target, render_primitive_lis height = (finalorient & ORIENTATION_SWAP_XY) ? (prim->bounds.x1 - prim->bounds.x0) : (prim->bounds.y1 - prim->bounds.y0); width = MIN(width, target->maxtexwidth); height = MIN(height, target->maxtexheight); - render_texture_get_scaled(item->texture, width, height, &prim->texture, &list->reflist); - - /* override the palette with our adjusted palette */ - switch (item->texture->format) + if (render_texture_get_scaled(item->texture, width, height, &prim->texture, &list->reflist)) { - case TEXFORMAT_PALETTE16: prim->texture.palette = &container->bcglookup[0]; break; - case TEXFORMAT_RGB15: prim->texture.palette = &container->bcglookup32[0]; break; - case TEXFORMAT_RGB32: prim->texture.palette = &container->bcglookup256[0]; break; - case TEXFORMAT_ARGB32: prim->texture.palette = &container->bcglookup256[0]; break; - default: assert(FALSE); + /* override the palette with our adjusted palette */ + switch (item->texture->format) + { + case TEXFORMAT_PALETTE16: prim->texture.palette = &container->bcglookup[0]; break; + case TEXFORMAT_RGB15: prim->texture.palette = &container->bcglookup32[0]; break; + case TEXFORMAT_RGB32: prim->texture.palette = &container->bcglookup256[0]; break; + case TEXFORMAT_ARGB32: prim->texture.palette = &container->bcglookup256[0]; break; + default: assert(FALSE); + } + + /* determine UV coordinates and apply clipping */ + prim->texcoords = oriented_texcoords[finalorient]; + clipped = render_clip_quad(&prim->bounds, &cliprect, &prim->texcoords); + + /* apply the final orientation from the quad flags and then build up the final flags */ + prim->flags = (item->flags & ~(PRIMFLAG_TEXORIENT_MASK | PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) | + PRIMFLAG_TEXORIENT(finalorient) | + PRIMFLAG_BLENDMODE(blendmode) | + PRIMFLAG_TEXFORMAT(item->texture->format); } - - /* determine UV coordinates and apply clipping */ - prim->texcoords = oriented_texcoords[finalorient]; - clipped = render_clip_quad(&prim->bounds, &cliprect, &prim->texcoords); - - /* apply the final orientation from the quad flags and then build up the final flags */ - prim->flags = (item->flags & ~(PRIMFLAG_TEXORIENT_MASK | PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) | - PRIMFLAG_TEXORIENT(finalorient) | - PRIMFLAG_BLENDMODE(blendmode) | - PRIMFLAG_TEXFORMAT(item->texture->format); } else { @@ -1719,18 +1733,21 @@ static void add_container_primitives(render_target *target, render_primitive_lis prim->color = container_xform.color; width = render_round_nearest(prim->bounds.x1) - render_round_nearest(prim->bounds.x0); height = render_round_nearest(prim->bounds.y1) - render_round_nearest(prim->bounds.y0); - render_texture_get_scaled(container->overlaytexture, + if (render_texture_get_scaled(container->overlaytexture, (container_xform.orientation & ORIENTATION_SWAP_XY) ? height : width, - (container_xform.orientation & ORIENTATION_SWAP_XY) ? width : height, &prim->texture, &list->reflist); - - /* determine UV coordinates */ - prim->texcoords = oriented_texcoords[container_xform.orientation]; + (container_xform.orientation & ORIENTATION_SWAP_XY) ? width : height, &prim->texture, &list->reflist)) + { + /* determine UV coordinates */ + prim->texcoords = oriented_texcoords[container_xform.orientation]; - /* set the flags and add it to the list */ - prim->flags = PRIMFLAG_TEXORIENT(container_xform.orientation) | - PRIMFLAG_BLENDMODE(BLENDMODE_RGB_MULTIPLY) | - PRIMFLAG_TEXFORMAT(container->overlaytexture->format); - append_render_primitive(list, prim); + /* set the flags and add it to the list */ + prim->flags = PRIMFLAG_TEXORIENT(container_xform.orientation) | + PRIMFLAG_BLENDMODE(BLENDMODE_RGB_MULTIPLY) | + PRIMFLAG_TEXFORMAT(container->overlaytexture->format); + append_render_primitive(list, prim); + } + else + free_render_primitive(prim); } } @@ -1746,7 +1763,7 @@ static void add_element_primitives(render_target *target, render_primitive_list INT32 height = render_round_nearest(xform->yscale); render_texture *texture; render_bounds cliprect; - int clipped; + int clipped = TRUE; /* if we're out of range, bail */ if (state > element->maxstate) @@ -1772,18 +1789,19 @@ static void add_element_primitives(render_target *target, render_primitive_list height = MIN(height, target->maxtexheight); /* get the scaled texture and append it */ - render_texture_get_scaled(texture, width, height, &prim->texture, &list->reflist); - - /* compute the clip rect */ - cliprect.x0 = render_round_nearest(xform->xoffs); - cliprect.y0 = render_round_nearest(xform->yoffs); - cliprect.x1 = render_round_nearest(xform->xoffs + xform->xscale); - cliprect.y1 = render_round_nearest(xform->yoffs + xform->yscale); - sect_render_bounds(&cliprect, &target->bounds); - - /* determine UV coordinates and apply clipping */ - prim->texcoords = oriented_texcoords[xform->orientation]; - clipped = render_clip_quad(&prim->bounds, &cliprect, &prim->texcoords); + if (render_texture_get_scaled(texture, width, height, &prim->texture, &list->reflist)) + { + /* compute the clip rect */ + cliprect.x0 = render_round_nearest(xform->xoffs); + cliprect.y0 = render_round_nearest(xform->yoffs); + cliprect.x1 = render_round_nearest(xform->xoffs + xform->xscale); + cliprect.y1 = render_round_nearest(xform->yoffs + xform->yscale); + sect_render_bounds(&cliprect, &target->bounds); + + /* determine UV coordinates and apply clipping */ + prim->texcoords = oriented_texcoords[xform->orientation]; + clipped = render_clip_quad(&prim->bounds, &cliprect, &prim->texcoords); + } /* add to the list or free if we're clipped out */ if (!clipped) @@ -1818,10 +1836,10 @@ static int remove_clear_extent(const render_bounds *bounds) INT32 *max = &clear_extents[MAX_CLEAR_EXTENTS]; INT32 *last = &clear_extents[clear_extent_count]; INT32 *ext = &clear_extents[0]; - INT32 boundsx0 = render_round_nearest(bounds->x0); - INT32 boundsx1 = render_round_nearest(bounds->x1); - INT32 boundsy0 = render_round_nearest(bounds->y0); - INT32 boundsy1 = render_round_nearest(bounds->y1); + INT32 boundsx0 = ceil(bounds->x0); + INT32 boundsx1 = floor(bounds->x1); + INT32 boundsy0 = ceil(bounds->y0); + INT32 boundsy1 = floor(bounds->y1); INT32 y0, y1 = 0; /* loop over Y extents */ @@ -2187,7 +2205,7 @@ void render_texture_set_bitmap(render_texture *texture, mame_bitmap *bitmap, con bitmap (if we can) -------------------------------------------------*/ -static void render_texture_get_scaled(render_texture *texture, UINT32 dwidth, UINT32 dheight, render_texinfo *texinfo, render_ref **reflist) +static int render_texture_get_scaled(render_texture *texture, UINT32 dwidth, UINT32 dheight, render_texinfo *texinfo, render_ref **reflist) { UINT8 bpp = (texture->format == TEXFORMAT_PALETTE16 || texture->format == TEXFORMAT_RGB15) ? 16 : 32; scaled_texture *scaled = NULL; @@ -2212,7 +2230,7 @@ static void render_texture_get_scaled(render_texture *texture, UINT32 dwidth, UI texinfo->height = sheight; texinfo->palette = texture->palette; texinfo->seqid = ++texture->curseq; - return; + return TRUE; } /* is it a size we already have? */ @@ -2228,8 +2246,13 @@ static void render_texture_get_scaled(render_texture *texture, UINT32 dwidth, UI /* did we get one? */ if (scalenum == ARRAY_LENGTH(texture->scaled)) { - /* didn't find one -- take the entry with the lowest seqnum */ int lowest = -1; + + /* ask our notifier if we can scale now */ + if (rescale_notify != NULL && !(*rescale_notify)(Machine, dwidth, dheight)) + return FALSE; + + /* didn't find one -- take the entry with the lowest seqnum */ for (scalenum = 0; scalenum < ARRAY_LENGTH(texture->scaled); scalenum++) if ((lowest == -1 || texture->scaled[scalenum].seqid < texture->scaled[lowest].seqid) && !has_render_ref(*reflist, texture->scaled[scalenum].bitmap)) lowest = scalenum; @@ -2259,6 +2282,7 @@ static void render_texture_get_scaled(render_texture *texture, UINT32 dwidth, UI texinfo->height = dheight; texinfo->palette = texture->palette; texinfo->seqid = scaled->seqid; + return TRUE; } @@ -2304,7 +2328,7 @@ static render_container *render_container_alloc(void) /* allocate a notifier */ render_container_recompute_lookups(container); - palette_add_notifier(render_container_update_palette, container); + palette_add_notifier(Machine, render_container_update_palette, container); return container; } @@ -2692,7 +2716,8 @@ static void render_container_overlay_scale(mame_bitmap *dest, const mame_bitmap static void render_container_recompute_lookups(render_container *container) { - int colors = palette_get_total_colors_with_ui(); + pen_t *adjusted_palette = palette_get_adjusted_colors(Machine); + int colors = palette_get_total_colors_with_ui(Machine); int i; /* recompute the 256 entry lookup table */ diff --git a/src/render.h b/src/render.h index 2eb665315..a538ae3bb 100644 --- a/src/render.h +++ b/src/render.h @@ -291,7 +291,8 @@ struct _render_primitive_list FUNCTION PROTOTYPES ***************************************************************************/ -void render_init(void); +void render_init(running_machine *machine); +void render_set_rescale_notify(running_machine *machine, int (*notifier)(running_machine *, int, int)); UINT32 render_get_live_screens_mask(void); float render_get_ui_aspect(void); void render_set_ui_target(render_target *target); diff --git a/src/rendersw.c b/src/rendersw.c index ebaab2782..aa5c4b166 100644 --- a/src/rendersw.c +++ b/src/rendersw.c @@ -154,7 +154,11 @@ INLINE int vec_div(int parm1, int parm2) /* source 15-bit pixels are in MAME standardized format */ #define SOURCE15_R(pix) (((pix) >> (7 + SRCSHIFT_R)) & (0xf8 >> SRCSHIFT_R)) #define SOURCE15_G(pix) (((pix) >> (2 + SRCSHIFT_G)) & (0xf8 >> SRCSHIFT_G)) +#if (SRCSHIFT_B < 3) #define SOURCE15_B(pix) (((pix) << (3 - SRCSHIFT_B)) & (0xf8 >> SRCSHIFT_B)) +#else +#define SOURCE15_B(pix) (((pix) >> (SRCSHIFT_B - 3)) & (0xf8 >> SRCSHIFT_B)) +#endif /* source 32-bit pixels are in MAME standardized format */ #define SOURCE32_R(pix) (((pix) >> (16 + SRCSHIFT_R)) & (0xff >> SRCSHIFT_R)) diff --git a/src/rendlay.c b/src/rendlay.c index 7cf4279ea..af11e35cc 100644 --- a/src/rendlay.c +++ b/src/rendlay.c @@ -123,8 +123,10 @@ struct _element_component render_bounds bounds; /* bounds of the element */ render_color color; /* color of the element */ const char * string; /* string for text components */ - int pattern; /* LED segment patterns */ mame_bitmap * bitmap; /* source bitmap for images */ + const char * dirname; /* directory name of image file (for lazy loading) */ + const char * imagefile; /* name of the image file (for lazy loading) */ + const char * alphafile; /* name of the alpha file (for lazy loading) */ int hasalpha; /* is there any alpha component present? */ }; @@ -142,7 +144,7 @@ static void layout_element_scale(mame_bitmap *dest, const mame_bitmap *source, c static void layout_element_draw_rect(mame_bitmap *dest, const rectangle *bounds, const render_color *color); static void layout_element_draw_disk(mame_bitmap *dest, const rectangle *bounds, const render_color *color); static void layout_element_draw_text(mame_bitmap *dest, const rectangle *bounds, const render_color *color, const char *string); -static void layout_element_draw_led7seg(mame_bitmap *dest, const rectangle *bounds, const render_color *color, int pattern); +static void layout_element_draw_led7seg(mame_bitmap *dest, const rectangle *bounds, const render_color *color, int state); /* layout file parsing */ static layout_element *load_layout_element(xml_data_node *elemnode, const char *dirname); @@ -351,6 +353,8 @@ static void layout_element_scale(mame_bitmap *dest, const mame_bitmap *source, c switch (component->type) { case COMPONENT_TYPE_IMAGE: + if (component->bitmap == NULL) + component->bitmap = load_component_bitmap(component->dirname, component->imagefile, component->alphafile, &component->hasalpha); render_resample_argb_bitmap_hq( (UINT32 *)dest->base + bounds.min_y * dest->rowpixels + bounds.min_x, dest->rowpixels, @@ -372,7 +376,7 @@ static void layout_element_scale(mame_bitmap *dest, const mame_bitmap *source, c break; case COMPONENT_TYPE_LED7SEG: - layout_element_draw_led7seg(dest, &bounds, &component->color, component->pattern); + layout_element_draw_led7seg(dest, &bounds, &component->color, elemtex->state); break; } } @@ -663,23 +667,23 @@ static void layout_element_draw_led7seg(mame_bitmap *dest, const rectangle *boun /* top bar */ draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 0)) ? onpen : offpen); - /* top-left bar */ - draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, 0 + segwidth/2, segwidth, (pattern & (1 << 1)) ? onpen : offpen); - /* top-right bar */ - draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 2)) ? onpen : offpen); + draw_segment_vertical(tempbitmap, 0 + 2*segwidth/3, bmheight/2 - segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 1)) ? onpen : offpen); - /* middle bar */ - draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight/2, segwidth, (pattern & (1 << 3)) ? 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); + + /* bottom bar */ + 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); - /* bottom-right bar */ - draw_segment_vertical(tempbitmap, bmheight/2 + segwidth/3, bmheight - 2*segwidth/3, bmwidth - segwidth/2, segwidth, (pattern & (1 << 5)) ? 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); - /* bottom bar */ - draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight - segwidth/2, segwidth, (pattern & (1 << 6)) ? onpen : offpen); + /* middle bar */ + draw_segment_horizontal(tempbitmap, 0 + 2*segwidth/3, bmwidth - 2*segwidth/3, bmheight/2, segwidth, (pattern & (1 << 6)) ? onpen : offpen); /* apply skew */ for (y = 0; y < tempbitmap->height; y++) @@ -975,6 +979,8 @@ static layout_element *load_layout_element(xml_data_node *elemnode, const char * /* determine the maximum state */ if (component->state > element->maxstate) element->maxstate = component->state; + if (component->type == COMPONENT_TYPE_LED7SEG) + element->maxstate = 255; } /* determine the scale/offset for normalization */ @@ -1003,7 +1009,7 @@ static layout_element *load_layout_element(xml_data_node *elemnode, const char * /* look for at least one visible component in this state */ for (component = element->complist; component != NULL; component = component->next) - if (component->state == -1 || component->state == state) + if (component->state == -1 || component->state == state || component->type == COMPONENT_TYPE_LED7SEG) break; /* allocate a texture only if we have some visible components in this state */ @@ -1048,14 +1054,9 @@ static element_component *load_element_component(xml_data_node *compnode, const /* load and allocate the bitmap */ component->type = COMPONENT_TYPE_IMAGE; - component->bitmap = load_component_bitmap(dirname, file, afile, &component->hasalpha); - if (component->bitmap == NULL) - { - if (afile == NULL) - fatalerror("Unable to load component bitmap '%s'", file); - else - fatalerror("Unable to load component bitmap '%s'/'%s'", file, afile); - } + component->dirname = (dirname == NULL) ? NULL : copy_string(dirname); + component->imagefile = (file == NULL) ? NULL : copy_string(file); + component->alphafile = (afile == NULL) ? NULL : copy_string(afile); } /* text nodes */ @@ -1073,17 +1074,7 @@ static element_component *load_element_component(xml_data_node *compnode, const /* led7seg nodes */ else if (strcmp(compnode->name, "led7seg") == 0) - { - const char *pattern = xml_get_attribute_string_with_subst(compnode, "pattern", "0000000"); - int i; - - /* extract the pattern from the binary digits */ component->type = COMPONENT_TYPE_LED7SEG; - component->pattern = 0; - for (i = 0; pattern[i] != 0; i++) - if (pattern[i] == '1') - component->pattern |= 1 << i; - } /* rect nodes */ else if (strcmp(compnode->name, "rect") == 0) @@ -1247,6 +1238,25 @@ static mame_bitmap *load_component_bitmap(const char *dirname, const char *file, bitmap = NULL; } + /* if we can't load the bitmap, allocate a dummy one and report an error */ + if (bitmap == NULL) + { + int step, line; + + /* draw some stripes in the bitmap */ + bitmap = bitmap_alloc_depth(100, 100, 32); + fillbitmap(bitmap, 0, NULL); + for (step = 0; step < 100; step += 25) + for (line = 0; line < 100; line++) + *((UINT32 *)bitmap->base + ((step + line) % 100) * bitmap->rowbytes + line % 100) = MAKE_ARGB(0xff,0xff,0xff,0xff); + + /* log an error */ + if (alphafile == NULL) + logerror("Unable to load component bitmap '%s'", file); + else + logerror("Unable to load component bitmap '%s'/'%s'", file, alphafile); + } + return bitmap; } @@ -1435,6 +1445,12 @@ static void layout_element_free(layout_element *element) element->complist = temp->next; if (temp->string != NULL) free((void *)temp->string); + if (temp->dirname != NULL) + free((void *)temp->dirname); + if (temp->imagefile != NULL) + free((void *)temp->imagefile); + if (temp->alphafile != NULL) + free((void *)temp->alphafile); if (temp->bitmap != NULL) bitmap_free(temp->bitmap); free(temp); diff --git a/src/rendutil.c b/src/rendutil.c index 681d7f043..283891625 100644 --- a/src/rendutil.c +++ b/src/rendutil.c @@ -566,23 +566,26 @@ mame_bitmap *render_load_png(const char *dirname, const char *filename, mame_bit /* read the PNG data */ result = png_read_file(file, &png); mame_fclose(file); - if (result == 0) + if (result != PNGERR_NONE) return NULL; /* 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; } if (png.interlace_method != 0) { logerror("%s: Interlace unsupported\n", filename); + png_free(&png); return NULL; } 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; } @@ -608,10 +611,7 @@ mame_bitmap *render_load_png(const char *dirname, const char *filename, mame_bit } /* free PNG data */ - if (png.palette != NULL) - free(png.palette); - free(png.image); - + png_free(&png); return bitmap; } diff --git a/src/romload.c b/src/romload.c index 0e3878c51..570308fc5 100644 --- a/src/romload.c +++ b/src/romload.c @@ -125,7 +125,7 @@ const rom_entry *rom_first_chunk(const rom_entry *romp) const rom_entry *rom_next_chunk(const rom_entry *romp) { romp++; - return (ROMENTRY_ISCONTINUE(romp)) ? romp : NULL; + return (ROMENTRY_ISCONTINUE(romp) || ROMENTRY_ISIGNORE(romp)) ? romp : NULL; } @@ -386,7 +386,7 @@ static int display_loading_rom_message(const char *name, rom_load_data *romdata) results of ROM loading -------------------------------------------------*/ -static int display_rom_load_results(rom_load_data *romdata) +static void display_rom_load_results(rom_load_data *romdata) { int region; @@ -394,10 +394,15 @@ static int display_rom_load_results(rom_load_data *romdata) display_loading_rom_message(NULL, romdata); /* if we had errors, they are fatal */ - if (romdata->errors) + if (romdata->errors != 0) { + /* clean up any regions */ + for (region = 0; region < MAX_MEMORY_REGIONS; region++) + free_memory_region(Machine, region); + + /* create the error message and exit fatally */ strcat(romdata->errorbuf, "ERROR: required files are missing, the game cannot be run."); - fatalerror("%s", romdata->errorbuf); + fatalerror_exitcode(MAMERR_MISSING_FILES, "%s", romdata->errorbuf); } /* if we had warnings, output them, but continue */ @@ -406,14 +411,6 @@ static int display_rom_load_results(rom_load_data *romdata) strcat(romdata->errorbuf, "WARNING: the game might not run correctly."); printf("%s\n", romdata->errorbuf); } - - /* clean up any regions */ - if (romdata->errors) - for (region = 0; region < MAX_MEMORY_REGIONS; region++) - free_memory_region(region); - - /* return true if we had any errors */ - return (romdata->errors != 0); } @@ -538,24 +535,15 @@ static int read_rom_data(rom_load_data *romdata, const rom_entry *romp) /* make sure the length was an even multiple of the group size */ if (numbytes % groupsize != 0) - { - printf("Error in RomModule definition: %s length not an even multiple of group size\n", ROM_GETNAME(romp)); - return -1; - } + fatalerror("Error in RomModule definition: %s length not an even multiple of group size\n", ROM_GETNAME(romp)); /* make sure we only fill within the region space */ if (ROM_GETOFFSET(romp) + numgroups * groupsize + (numgroups - 1) * skip > romdata->regionlength) - { - printf("Error in RomModule definition: %s out of memory region space\n", ROM_GETNAME(romp)); - return -1; - } + fatalerror("Error in RomModule definition: %s out of memory region space\n", ROM_GETNAME(romp)); /* make sure the length was valid */ if (numbytes == 0) - { - printf("Error in RomModule definition: %s has an invalid length\n", ROM_GETNAME(romp)); - return -1; - } + fatalerror("Error in RomModule definition: %s has an invalid length\n", ROM_GETNAME(romp)); /* special case for simple loads */ if (datamask == 0xff && (groupsize == 1 || !reversed) && skip == 0) @@ -640,28 +628,21 @@ static int read_rom_data(rom_load_data *romdata, const rom_entry *romp) fill_rom_data - fill a region of ROM space -------------------------------------------------*/ -static int fill_rom_data(rom_load_data *romdata, const rom_entry *romp) +static void fill_rom_data(rom_load_data *romdata, const rom_entry *romp) { UINT32 numbytes = ROM_GETLENGTH(romp); UINT8 *base = romdata->regionbase + ROM_GETOFFSET(romp); /* make sure we fill within the region space */ if (ROM_GETOFFSET(romp) + numbytes > romdata->regionlength) - { - printf("Error in RomModule definition: FILL out of memory region space\n"); - return 0; - } + fatalerror("Error in RomModule definition: FILL out of memory region space\n"); /* make sure the length was valid */ if (numbytes == 0) - { - printf("Error in RomModule definition: FILL has an invalid length\n"); - return 0; - } + fatalerror("Error in RomModule definition: FILL has an invalid length\n"); /* fill the data (filling value is stored in place of the hashdata) */ memset(base, (UINT32)ROM_GETHASHDATA(romp) & 0xff, numbytes); - return 1; } @@ -669,7 +650,7 @@ static int fill_rom_data(rom_load_data *romdata, const rom_entry *romp) copy_rom_data - copy a region of ROM space -------------------------------------------------*/ -static int copy_rom_data(rom_load_data *romdata, const rom_entry *romp) +static void copy_rom_data(rom_load_data *romdata, const rom_entry *romp) { UINT8 *base = romdata->regionbase + ROM_GETOFFSET(romp); int srcregion = ROM_GETFLAGS(romp) >> 24; @@ -679,36 +660,23 @@ static int copy_rom_data(rom_load_data *romdata, const rom_entry *romp) /* make sure we copy within the region space */ if (ROM_GETOFFSET(romp) + numbytes > romdata->regionlength) - { - printf("Error in RomModule definition: COPY out of target memory region space\n"); - return 0; - } + fatalerror("Error in RomModule definition: COPY out of target memory region space\n"); /* make sure the length was valid */ if (numbytes == 0) - { - printf("Error in RomModule definition: COPY has an invalid length\n"); - return 0; - } + fatalerror("Error in RomModule definition: COPY has an invalid length\n"); /* make sure the source was valid */ srcbase = memory_region(srcregion); if (!srcbase) - { - printf("Error in RomModule definition: COPY from an invalid region\n"); - return 0; - } + fatalerror("Error in RomModule definition: COPY from an invalid region\n"); /* make sure we find within the region space */ if (srcoffs + numbytes > memory_region_length(srcregion)) - { - printf("Error in RomModule definition: COPY out of source memory region space\n"); - return 0; - } + fatalerror("Error in RomModule definition: COPY out of source memory region space\n"); /* fill the data */ memcpy(base, srcbase + srcoffs, numbytes); - return 1; } @@ -717,7 +685,7 @@ static int copy_rom_data(rom_load_data *romdata, const rom_entry *romp) for a region -------------------------------------------------*/ -static int process_rom_entries(rom_load_data *romdata, const rom_entry *romp) +static void process_rom_entries(rom_load_data *romdata, const rom_entry *romp) { UINT32 lastflags = 0; @@ -726,31 +694,23 @@ static int process_rom_entries(rom_load_data *romdata, const rom_entry *romp) { /* if this is a continue entry, it's invalid */ if (ROMENTRY_ISCONTINUE(romp)) - { - printf("Error in RomModule definition: ROM_CONTINUE not preceded by ROM_LOAD\n"); - goto fatalerror; - } + fatalerror("Error in RomModule definition: ROM_CONTINUE not preceded by ROM_LOAD\n"); + + /* if this is an ignore entry, it's invalid */ + if (ROMENTRY_ISIGNORE(romp)) + fatalerror("Error in RomModule definition: ROM_IGNORE not preceded by ROM_LOAD\n"); /* if this is a reload entry, it's invalid */ if (ROMENTRY_ISRELOAD(romp)) - { - printf("Error in RomModule definition: ROM_RELOAD not preceded by ROM_LOAD\n"); - goto fatalerror; - } + fatalerror("Error in RomModule definition: ROM_RELOAD not preceded by ROM_LOAD\n"); /* handle fills */ if (ROMENTRY_ISFILL(romp)) - { - if (!fill_rom_data(romdata, romp++)) - goto fatalerror; - } + fill_rom_data(romdata, romp++); /* handle copies */ else if (ROMENTRY_ISCOPY(romp)) - { - if (!copy_rom_data(romdata, romp++)) - goto fatalerror; - } + copy_rom_data(romdata, romp++); /* handle files */ else if (ROMENTRY_ISFILE(romp)) @@ -768,7 +728,7 @@ static int process_rom_entries(rom_load_data *romdata, const rom_entry *romp) /* loop until we run out of reloads */ do { - /* loop until we run out of continues */ + /* loop until we run out of continues/ignores */ do { rom_entry modified_romp = *romp++; @@ -783,11 +743,10 @@ static int process_rom_entries(rom_load_data *romdata, const rom_entry *romp) explength += ROM_GETLENGTH(&modified_romp); /* attempt to read using the modified entry */ - readresult = read_rom_data(romdata, &modified_romp); - if (readresult == -1) - goto fatalerror; + if (!ROMENTRY_ISIGNORE(&modified_romp)) + readresult = read_rom_data(romdata, &modified_romp); } - while (ROMENTRY_ISCONTINUE(romp)); + while (ROMENTRY_ISCONTINUE(romp) || ROMENTRY_ISIGNORE(romp)); /* if this was the first use of this file, verify the length and CRC */ if (baserom) @@ -823,14 +782,6 @@ static int process_rom_entries(rom_load_data *romdata, const rom_entry *romp) romp++; /* something else; skip */ } } - return 1; - - /* error case */ -fatalerror: - if (romdata->file) - mame_fclose(romdata->file); - romdata->file = NULL; - return 0; } @@ -839,7 +790,7 @@ static int process_rom_entries(rom_load_data *romdata, const rom_entry *romp) for a region -------------------------------------------------*/ -static int process_disk_entries(rom_load_data *romdata, const rom_entry *romp) +static void process_disk_entries(rom_load_data *romdata, const rom_entry *romp) { /* loop until we hit the end of this region */ while (!ROMENTRY_ISREGIONEND(romp)) @@ -931,7 +882,6 @@ static int process_disk_entries(rom_load_data *romdata, const rom_entry *romp) romp++; } } - return 1; } @@ -940,7 +890,7 @@ static int process_disk_entries(rom_load_data *romdata, const rom_entry *romp) loading system -------------------------------------------------*/ -int rom_init(const rom_entry *romp) +void rom_init(running_machine *machine, const rom_entry *romp) { const rom_entry *regionlist[REGION_MAX]; const rom_entry *region; @@ -949,7 +899,10 @@ int rom_init(const rom_entry *romp) /* if no roms, bail */ if (romp == NULL) - return 0; + return; + + /* make sure we get called back on the way out */ + add_exit_callback(machine, rom_exit); /* reset the region list */ memset((void *)regionlist, 0, sizeof(regionlist)); @@ -972,22 +925,11 @@ int rom_init(const rom_entry *romp) debugload("Processing region %02X (length=%X)\n", regiontype, ROMREGION_GETLENGTH(region)); /* the first entry must be a region */ - if (!ROMENTRY_ISREGION(region)) - { - printf("Error: missing ROM_REGION header\n"); - return 1; - } - - /* allocate memory for the region */ - if (new_memory_region(regiontype, ROMREGION_GETLENGTH(region), ROMREGION_GETFLAGS(region)) != 0) - { - printf("Error: unable to allocate memory for region %d\n", regiontype); - return 1; - } + assert(ROMENTRY_ISREGION(region)); /* remember the base and length */ - romdata.regionlength = memory_region_length(regiontype); - romdata.regionbase = memory_region(regiontype); + romdata.regionbase = new_memory_region(machine, regiontype, ROMREGION_GETLENGTH(region), ROMREGION_GETFLAGS(region)); + romdata.regionlength = ROMREGION_GETLENGTH(region); debugload("Allocated %X bytes @ %08X\n", romdata.regionlength, (int)romdata.regionbase); /* clear the region if it's requested */ @@ -1006,15 +948,9 @@ int rom_init(const rom_entry *romp) /* now process the entries in the region */ if (ROMREGION_ISROMDATA(region)) - { - if (!process_rom_entries(&romdata, region + 1)) - return 1; - } + process_rom_entries(&romdata, region + 1); else if (ROMREGION_ISDISKDATA(region)) - { - if (!process_disk_entries(&romdata, region + 1)) - return 1; - } + process_disk_entries(&romdata, region + 1); /* add this region to the list */ if (regiontype < REGION_MAX) @@ -1034,8 +970,7 @@ int rom_init(const rom_entry *romp) /* display the results and exit */ total_rom_load_warnings = romdata.warnings; - add_exit_callback(rom_exit); - return display_rom_load_results(&romdata); + display_rom_load_results(&romdata); } @@ -1043,13 +978,13 @@ int rom_init(const rom_entry *romp) rom_exit - clean up after ourselves -------------------------------------------------*/ -void rom_exit(void) +void rom_exit(running_machine *machine) { int i; /* free the memory allocated for various regions */ for (i = 0; i < MAX_MEMORY_REGIONS; i++) - free_memory_region(i); + free_memory_region(machine, i); /* close all hard drives */ chd_close_all(); diff --git a/src/romload.h b/src/romload.h index cb9c1f4eb..a04ccac4c 100644 --- a/src/romload.h +++ b/src/romload.h @@ -30,7 +30,8 @@ #define ROMENTRYTYPE_FILL 5 /* this entry fills an area with a constant value */ #define ROMENTRYTYPE_COPY 6 /* this entry copies data from another region/offset */ #define ROMENTRYTYPE_CARTRIDGE 7 /* this entry specifies a cartridge (MESS) */ -#define ROMENTRYTYPE_COUNT 8 +#define ROMENTRYTYPE_IGNORE 8 /* this entry continues loading the previous ROM but throws the data away */ +#define ROMENTRYTYPE_COUNT 9 /* ----- per-region constants ----- */ @@ -170,6 +171,7 @@ struct _rom_load_data #define ROMENTRY_FILL ((const char *)ROMENTRYTYPE_FILL) #define ROMENTRY_COPY ((const char *)ROMENTRYTYPE_COPY) #define ROMENTRY_CARTRIDGE ((const char *)ROMENTRYTYPE_CARTRIDGE) +#define ROMENTRY_IGNORE ((const char *)ROMENTRYTYPE_IGNORE) #define ROMENTRY_GETTYPE(r) ((FPTR)(r)->_name) #define ROMENTRY_ISSPECIAL(r) (ROMENTRY_GETTYPE(r) < ROMENTRYTYPE_COUNT) @@ -180,6 +182,7 @@ struct _rom_load_data #define ROMENTRY_ISCONTINUE(r) ((r)->_name == ROMENTRY_CONTINUE) #define ROMENTRY_ISFILL(r) ((r)->_name == ROMENTRY_FILL) #define ROMENTRY_ISCOPY(r) ((r)->_name == ROMENTRY_COPY) +#define ROMENTRY_ISIGNORE(r) ((r)->_name == ROMENTRY_IGNORE) #define ROMENTRY_ISREGIONEND(r) (ROMENTRY_ISREGION(r) || ROMENTRY_ISEND(r)) #define BIOSENTRY_ISEND(b) ((b)->_name == NULL) @@ -251,6 +254,7 @@ struct _rom_load_data #define ROM_RELOAD(offset,length) ROMX_LOAD(ROMENTRY_RELOAD, offset, length, 0, ROM_INHERITFLAGS) #define ROM_FILL(offset,length,value) ROM_LOAD(ROMENTRY_FILL, offset, length, (const char*)value) #define ROM_COPY(rgn,srcoffset,offset,length) ROMX_LOAD(ROMENTRY_COPY, offset, length, (const char*)srcoffset, (rgn) << 24) +#define ROM_IGNORE(length) ROMX_LOAD(ROMENTRY_IGNORE, 0, length, 0, ROM_INHERITFLAGS) /* ----- specialized loading macros ----- */ @@ -293,8 +297,8 @@ struct _rom_load_data chd_file *get_disk_handle(int diskindex); /* ROM processing */ -int rom_init(const rom_entry *romp); -void rom_exit(void); +void rom_init(running_machine *machine, const rom_entry *romp); +void rom_exit(running_machine *machine); int rom_load_warnings(void); const rom_entry *rom_first_region(const game_driver *drv); const rom_entry *rom_next_region(const rom_entry *romp); diff --git a/src/sndhrdw/8080bw.c b/src/sndhrdw/8080bw.c index 44bf56e39..17f73dcfa 100644 --- a/src/sndhrdw/8080bw.c +++ b/src/sndhrdw/8080bw.c @@ -37,8 +37,10 @@ #include "sound/discrete.h" #include "sound/dac.h" #include "sound/custom.h" +#include "sound/speaker.h" static WRITE8_HANDLER( invad2ct_sh_port1_w ); +static WRITE8_HANDLER( spcewars_sh_port3_w ); static WRITE8_HANDLER( invaders_sh_port3_w ); static WRITE8_HANDLER( invaders_sh_port5_w ); static WRITE8_HANDLER( invad2ct_sh_port7_w ); @@ -193,6 +195,19 @@ MACHINE_RESET( invaders ) SN76477_vco_w(0, 1); } +MACHINE_RESET( spcewars ) +{ + memory_install_write8_handler(0, ADDRESS_SPACE_IO, 0x03, 0x03, 0, 0, spcewars_sh_port3_w); + memory_install_write8_handler(0, ADDRESS_SPACE_IO, 0x05, 0x05, 0, 0, invaders_sh_port5_w); + + SN76477_envelope_1_w(0, 1); + SN76477_envelope_2_w(0, 0); + SN76477_mixer_a_w(0, 0); + SN76477_mixer_b_w(0, 0); + SN76477_mixer_c_w(0, 0); + SN76477_vco_w(0, 1); +} + MACHINE_RESET( sstrangr ) { memory_install_write8_handler(0, ADDRESS_SPACE_IO, 0x42, 0x42, 0, 0, invaders_sh_port3_w); @@ -208,7 +223,7 @@ MACHINE_RESET( sstrangr ) MACHINE_RESET( invad2ct ) { - machine_reset_invaders(); + machine_reset_invaders(machine); memory_install_write8_handler(0, ADDRESS_SPACE_IO, 0x01, 0x01, 0, 0, invad2ct_sh_port1_w); memory_install_write8_handler(0, ADDRESS_SPACE_IO, 0x07, 0x07, 0, 0, invad2ct_sh_port7_w); @@ -285,6 +300,33 @@ static void invaders_sh_2_w(int board, int data, unsigned char *last) *last = data; } +static void spcewars_sh_1_w(int board, int data, unsigned char *last) +{ + int base_channel, base_sample; + + base_channel = 4 * board; + base_sample = 9 * board; + + SN76477_enable_w(board, !(data & 0x01)); /* Saucer Sound */ + + if (data & 0x02 && ~*last & 0x02) + sample_start (base_channel+0, base_sample+0, 0); /* Shot Sound */ + + if (data & 0x04 && ~*last & 0x04) + sample_start (base_channel+1, base_sample+1, 0); /* Base Hit */ + + if (~data & 0x04 && *last & 0x04) + sample_stop (base_channel+1); + + if (data & 0x08 && ~*last & 0x08) + sample_start (base_channel+0, base_sample+2, 0); /* Invader Hit */ + + speaker_level_w(0, (data & 0x10) ? 1 : 0); /* Various bitstream tunes */ + + c8080bw_screen_red_w(data & 0x04); + + *last = data; +} static WRITE8_HANDLER( invad2ct_sh_port1_w ) { @@ -300,6 +342,13 @@ static WRITE8_HANDLER( invaders_sh_port3_w ) invaders_sh_1_w(0, data, &last); } +static WRITE8_HANDLER( spcewars_sh_port3_w ) +{ + static unsigned char last = 0; + + spcewars_sh_1_w(0, data, &last); +} + static WRITE8_HANDLER( invaders_sh_port5_w ) { static unsigned char last = 0; @@ -314,7 +363,6 @@ static WRITE8_HANDLER( invad2ct_sh_port7_w ) invaders_sh_2_w(1, data, &last); } - /*******************************************************/ /* */ /* Midway "Gun Fight" */ diff --git a/src/sndhrdw/attckufo.c b/src/sndhrdw/attckufo.c index 9c3aa74bb..004d9b4e4 100644 --- a/src/sndhrdw/attckufo.c +++ b/src/sndhrdw/attckufo.c @@ -75,7 +75,7 @@ void attckufo_soundport_w (int offset, int data) if (!(old & 0x80) && TONE1_ON) { tone1pos = 0; - tone1samples = options.samplerate / TONE1_FREQUENCY; + tone1samples = Machine->sample_rate / TONE1_FREQUENCY; if (tone1samples == 0) tone1samples = 1; } @@ -86,7 +86,7 @@ void attckufo_soundport_w (int offset, int data) if (!(old & 0x80) && TONE2_ON) { tone2pos = 0; - tone2samples = options.samplerate / TONE2_FREQUENCY; + tone2samples = Machine->sample_rate / TONE2_FREQUENCY; if (tone2samples == 0) tone2samples = 1; } @@ -97,7 +97,7 @@ void attckufo_soundport_w (int offset, int data) if (!(old & 0x80) && TONE3_ON) { tone3pos = 0; - tone3samples = options.samplerate / TONE3_FREQUENCY; + tone3samples = Machine->sample_rate / TONE3_FREQUENCY; if (tone2samples == 0) tone2samples = 1; } @@ -107,7 +107,7 @@ void attckufo_soundport_w (int offset, int data) attckufo_regs[offset] = data; if (NOISE_ON) { - noisesamples = (int) ((double) NOISE_FREQUENCY_MAX * options.samplerate + noisesamples = (int) ((double) NOISE_FREQUENCY_MAX * Machine->sample_rate * NOISE_BUFFER_SIZE_SEC / NOISE_FREQUENCY); if ((double) noisepos / noisesamples >= 1.0) @@ -146,7 +146,7 @@ static void attckufo_update (void *param,stream_sample_t **inputs, stream_sample if (tone1pos >= tone1samples) { tone1pos = 0; - tone1samples = options.samplerate / TONE1_FREQUENCY; + tone1samples = Machine->sample_rate / TONE1_FREQUENCY; if (tone1samples == 0) tone1samples = 1; } @@ -159,7 +159,7 @@ static void attckufo_update (void *param,stream_sample_t **inputs, stream_sample if (tone2pos >= tone2samples) { tone2pos = 0; - tone2samples = options.samplerate / TONE2_FREQUENCY; + tone2samples = Machine->sample_rate / TONE2_FREQUENCY; if (tone2samples == 0) tone2samples = 1; } @@ -173,7 +173,7 @@ static void attckufo_update (void *param,stream_sample_t **inputs, stream_sample if (tone3pos >= tone3samples) { tone3pos = 0; - tone3samples = options.samplerate / TONE3_FREQUENCY; + tone3samples = Machine->sample_rate / TONE3_FREQUENCY; if (tone3samples == 0) tone3samples = 1; } @@ -210,7 +210,7 @@ void *attckufo_custom_start(int clock, const struct CustomSound_interface *confi { int i; - channel = stream_create(0, 1, options.samplerate, 0, attckufo_update); + channel = stream_create(0, 1, Machine->sample_rate, 0, attckufo_update); /* buffer for fastest played sample for 5 second @@ -247,7 +247,7 @@ void *attckufo_custom_start(int clock, const struct CustomSound_interface *confi noiseshift <<= 1; } } - tonesize = options.samplerate / TONE_FREQUENCY_MIN; + tonesize = Machine->sample_rate / TONE_FREQUENCY_MIN; tone = (INT16*) auto_malloc (tonesize * sizeof (tone[0])); diff --git a/src/sndhrdw/cage.c b/src/sndhrdw/cage.c index 032cf7847..af1f0ec78 100644 --- a/src/sndhrdw/cage.c +++ b/src/sndhrdw/cage.c @@ -159,7 +159,7 @@ void cage_init(int boot_region, offs_t speedup) memory_set_bankptr(10, memory_region(boot_region)); memory_set_bankptr(11, memory_region(boot_region + 1)); - cage_cpu = mame_find_cpu_index("cage"); + cage_cpu = mame_find_cpu_index(Machine, "cage"); cage_cpu_clock_period = 1.0 / (double)Machine->drv->cpu[cage_cpu].cpu_clock; cage_cpu_h1_clock = cage_cpu_clock_period * 2.0; diff --git a/src/sndhrdw/cinemat.c b/src/sndhrdw/cinemat.c index 82a5087d4..36da2e402 100644 --- a/src/sndhrdw/cinemat.c +++ b/src/sndhrdw/cinemat.c @@ -93,10 +93,10 @@ WRITE8_HANDLER( cinemat_sound_control_w ) * *************************************/ -static void generic_init(void (*callback)(UINT8, UINT8)) +static void generic_init(running_machine *machine, void (*callback)(UINT8, UINT8)) { /* call the standard init */ - machine_reset_cinemat(); + machine_reset_cinemat(machine); /* set the sound handler */ sound_handler = callback; @@ -197,7 +197,7 @@ static void spacewar_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( spacewar ) { - generic_init(spacewar_sound_w); + generic_init(machine, spacewar_sound_w); } MACHINE_DRIVER_START( spacewar_sound ) @@ -250,7 +250,7 @@ static void barrier_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( barrier ) { - generic_init(barrier_sound_w); + generic_init(machine, barrier_sound_w); } MACHINE_DRIVER_START( barrier_sound ) @@ -308,7 +308,7 @@ static void speedfrk_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( speedfrk ) { - generic_init(speedfrk_sound_w); + generic_init(machine, speedfrk_sound_w); } MACHINE_DRIVER_START( speedfrk_sound ) @@ -382,7 +382,7 @@ static void starhawk_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( starhawk ) { - generic_init(starhawk_sound_w); + generic_init(machine, starhawk_sound_w); } MACHINE_DRIVER_START( starhawk_sound ) @@ -450,7 +450,7 @@ static void sundance_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( sundance ) { - generic_init(sundance_sound_w); + generic_init(machine, sundance_sound_w); } MACHINE_DRIVER_START( sundance_sound ) @@ -537,7 +537,7 @@ static void tailg_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( tailg ) { - generic_init(tailg_sound_w); + generic_init(machine, tailg_sound_w); } MACHINE_DRIVER_START( tailg_sound ) @@ -604,7 +604,7 @@ static void warrior_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( warrior ) { - generic_init(warrior_sound_w); + generic_init(machine, warrior_sound_w); } MACHINE_DRIVER_START( warrior_sound ) @@ -697,7 +697,7 @@ static void armora_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( armora ) { - generic_init(armora_sound_w); + generic_init(machine, armora_sound_w); } MACHINE_DRIVER_START( armora_sound ) @@ -787,7 +787,7 @@ static void ripoff_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( ripoff ) { - generic_init(ripoff_sound_w); + generic_init(machine, ripoff_sound_w); } MACHINE_DRIVER_START( ripoff_sound ) @@ -899,7 +899,7 @@ static void starcas_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( starcas ) { - generic_init(starcas_sound_w); + generic_init(machine, starcas_sound_w); } MACHINE_DRIVER_START( starcas_sound ) @@ -1034,7 +1034,7 @@ static void solarq_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( solarq ) { - generic_init(solarq_sound_w); + generic_init(machine, solarq_sound_w); } MACHINE_DRIVER_START( solarq_sound ) @@ -1167,7 +1167,7 @@ static void boxingb_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( boxingb ) { - generic_init(boxingb_sound_w); + generic_init(machine, boxingb_sound_w); } MACHINE_DRIVER_START( boxingb_sound ) @@ -1279,7 +1279,7 @@ static void wotw_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( wotw ) { - generic_init(wotw_sound_w); + generic_init(machine, wotw_sound_w); } MACHINE_DRIVER_START( wotw_sound ) @@ -1391,7 +1391,7 @@ static void wotwc_sound_w(UINT8 sound_val, UINT8 bits_changed) static MACHINE_RESET( wotwc ) { - generic_init(wotwc_sound_w); + generic_init(machine, wotwc_sound_w); } MACHINE_DRIVER_START( wotwc_sound ) @@ -1505,7 +1505,7 @@ static z80ctc_interface demon_z80ctc_interface = static MACHINE_RESET( demon_sound ) { /* generic init */ - generic_init(demon_sound_w); + generic_init(machine, demon_sound_w); /* initialize the CTC interface */ demon_z80ctc_interface.baseclock = Machine->drv->cpu[1].cpu_clock; @@ -1593,7 +1593,7 @@ static WRITE8_HANDLER( qb3_sound_w ) static MACHINE_RESET( qb3_sound ) { - machine_reset_demon_sound(); + machine_reset_demon_sound(machine); memory_install_write8_handler(0, ADDRESS_SPACE_IO, 0x04, 0x04, 0, 0, qb3_sound_w); /* this patch prevents the sound ROM from eating itself when command $0A is sent */ diff --git a/src/sndhrdw/dcs.c b/src/sndhrdw/dcs.c index 1e8c28294..f7d1d3570 100644 --- a/src/sndhrdw/dcs.c +++ b/src/sndhrdw/dcs.c @@ -833,7 +833,7 @@ void dcs_init(void) memset(&dcs, 0, sizeof(dcs)); /* find the DCS CPU and the sound ROMs */ - dcs.cpunum = mame_find_cpu_index("dcs"); + dcs.cpunum = mame_find_cpu_index(Machine, "dcs"); dcs.rev = 1; dcs.channels = 1; @@ -860,16 +860,16 @@ void dcs2_init(int dram_in_mb, offs_t polling_offset) memset(&dcs, 0, sizeof(dcs)); /* find the DCS CPU and the sound ROMs */ - dcs.cpunum = mame_find_cpu_index("dcs2"); + dcs.cpunum = mame_find_cpu_index(Machine, "dcs2"); dcs.rev = 2; if ((INT8)dcs.cpunum == -1) { - dcs.cpunum = mame_find_cpu_index("dsio"); + dcs.cpunum = mame_find_cpu_index(Machine, "dsio"); dcs.rev = 3; } if ((INT8)dcs.cpunum == -1) { - dcs.cpunum = mame_find_cpu_index("denver"); + dcs.cpunum = mame_find_cpu_index(Machine, "denver"); dcs.rev = 4; } dcs.channels = 2; diff --git a/src/sndhrdw/segag80r.c b/src/sndhrdw/segag80r.c index 849d07ee8..ca1199a13 100644 --- a/src/sndhrdw/segag80r.c +++ b/src/sndhrdw/segag80r.c @@ -250,30 +250,30 @@ WRITE8_HANDLER( astrob_sound_w ) switch (offset) { case 0: - /* INVADER-1 */ + /* INVADER-1: channel 0 */ if ((diff & 0x01) && !(data & 0x01)) sample_start(0, (data & 0x80) ? 0 : 1, TRUE); if ((data & 0x01) && sample_playing(0)) sample_stop(0); - /* INVADER-2 */ + /* INVADER-2: channel 1 */ if ((diff & 0x02) && !(data & 0x02)) sample_start(1, (data & 0x80) ? 2 : 3, TRUE); if ((data & 0x02) && sample_playing(1)) sample_stop(1); - /* INVADER-3 */ + /* INVADER-3: channel 2 */ if ((diff & 0x04) && !(data & 0x04)) sample_start(2, (data & 0x80) ? 4 : 5, TRUE); if ((data & 0x04) && sample_playing(2)) sample_stop(2); - /* INVADER-4 */ + /* INVADER-4: channel 3 */ if ((diff & 0x08) && !(data & 0x08)) sample_start(3, (data & 0x80) ? 6 : 7, TRUE); if ((data & 0x08) && sample_playing(3)) sample_stop(3); - /* ASTROIDS */ + /* ASTROIDS: channel 4 */ if ((diff & 0x10) && !(data & 0x10)) sample_start(4, 8, TRUE); if ((data & 0x10) && sample_playing(4)) sample_stop(4); /* MUTE */ sound_global_enable(!(data & 0x20)); - /* REFILL */ + /* REFILL: channel 5 */ if (!(data & 0x40) && !sample_playing(5)) sample_start(5, 9, FALSE); if ( (data & 0x40) && sample_playing(5)) sample_stop(5); @@ -288,16 +288,16 @@ WRITE8_HANDLER( astrob_sound_w ) break; case 1: - /* LASER #1 */ + /* LASER #1: channel 6 */ if ((diff & 0x01) && !(data & 0x01)) sample_start(6, 10, FALSE); - /* LASER #2 */ + /* LASER #2: channel 7 */ if ((diff & 0x02) && !(data & 0x02)) sample_start(7, 11, FALSE); - /* SHORT EXPL */ + /* SHORT EXPL: channel 8 */ if ((diff & 0x04) && !(data & 0x04)) sample_start(8, 12, FALSE); - /* LONG EXPL */ + /* LONG EXPL: channel 8 */ if ((diff & 0x08) && !(data & 0x08)) sample_start(8, 13, FALSE); /* ATTACK RATE */ @@ -306,10 +306,10 @@ WRITE8_HANDLER( astrob_sound_w ) /* RATE RESET */ if (!(data & 0x20)) sound_rate = 0; - /* BONUS */ + /* BONUS: channel 9 */ if ((diff & 0x40) && !(data & 0x40)) sample_start(9, 14, FALSE); - /* SONAR */ + /* SONAR: channel 10 */ if ((diff & 0x80) && !(data & 0x80)) sample_start(10, 15, FALSE); break; } @@ -482,26 +482,26 @@ WRITE8_HANDLER( sega005_sound_a_w ) UINT8 diff = data ^ sound_state[0]; sound_state[0] = data; - /* LARGE EXPL */ + /* LARGE EXPL: channel 0 */ if ((diff & 0x01) && !(data & 0x01)) sample_start(0, 0, FALSE); - /* SMALL EXPL */ + /* SMALL EXPL: channel 1 */ if ((diff & 0x02) && !(data & 0x02)) sample_start(1, 1, FALSE); - /* DROP BOMB */ + /* DROP BOMB: channel 2 */ if ((diff & 0x04) && !(data & 0x04)) sample_start(2, 2, FALSE); - /* SHOOT PISTOL */ + /* SHOOT PISTOL: channel 3 */ if ((diff & 0x08) && !(data & 0x08)) sample_start(3, 3, FALSE); - /* MISSILE */ + /* MISSILE: channel 4 */ if ((diff & 0x10) && !(data & 0x10)) sample_start(4, 4, FALSE); - /* HELICOPTER */ + /* HELICOPTER: channel 5 */ if ((diff & 0x20) && !(data & 0x20) && !sample_playing(5)) sample_start(5, 5, TRUE); if ((diff & 0x20) && (data & 0x20)) sample_stop(5); - /* WHISTLE */ + /* WHISTLE: channel 6 */ if ((diff & 0x40) && !(data & 0x40) && !sample_playing(6)) sample_start(6, 6, TRUE); if ((diff & 0x40) && (data & 0x40)) sample_stop(6); } @@ -699,40 +699,40 @@ WRITE8_HANDLER( spaceod_sound_w ) switch (offset) { case 0: - /* BACK G */ + /* BACK G: channel 0 */ if ((diff & 0x01) && !(data & 0x01) && !sample_playing(0)) sample_start(0, 7, TRUE); if ((diff & 0x01) && (data & 0x01)) sample_stop(0); - /* SHORT EXP */ + /* SHORT EXP: channel 1 */ if ((diff & 0x04) && !(data & 0x04)) sample_start(1, 2, FALSE); - /* ACCELERATE */ + /* ACCELERATE: channel 2 */ if ((diff & 0x10) && !(data & 0x10)) sample_start(2, 8, FALSE); - /* BATTLE STAR */ + /* BATTLE STAR: channel 3 */ if ((diff & 0x20) && !(data & 0x20)) sample_start(3, 10, FALSE); - /* D BOMB */ + /* D BOMB: channel 4 */ if ((diff & 0x40) && !(data & 0x40)) sample_start(4, 1, FALSE); - /* LONG EXP */ + /* LONG EXP: channel 5 */ if ((diff & 0x80) && !(data & 0x80)) sample_start(5, 3, FALSE); break; case 1: - /* SHOT */ + /* SHOT: channel 6 */ if ((diff & 0x01) && !(data & 0x01)) sample_start(6, 0, FALSE); - /* BONUS UP */ + /* BONUS UP: channel 7 */ if ((diff & 0x02) && !(data & 0x02)) sample_start(7, 6, FALSE); - /* WARP */ + /* WARP: channel 8 */ if ((diff & 0x08) && !(data & 0x08)) sample_start(8, 4, FALSE); - /* APPEARANCE UFO */ + /* APPEARANCE UFO: channel 9 */ if ((diff & 0x40) && !(data & 0x40)) sample_start(9, 5, FALSE); - /* BLACK HOLE */ + /* BLACK HOLE: channel 10 */ if ((diff & 0x80) && !(data & 0x80)) sample_start(10, 9, FALSE); break; } @@ -905,10 +905,10 @@ static WRITE8_HANDLER( monsterb_sound_b_w ) UINT8 diff = data ^ sound_state[1]; sound_state[1] = data; - /* SHOT */ + /* SHOT: channel 0 */ if ((diff & 0x01) && !(data & 0x01)) sample_start(0, 0, FALSE); - /* DIVE */ + /* DIVE: channel 1 */ if ((diff & 0x02) && !(data & 0x02)) sample_start(1, 1, FALSE); /* TODO: D7 on Port B might affect TMS3617 output (mute?) */ diff --git a/src/sndhrdw/segasnd.c b/src/sndhrdw/segasnd.c index 911b4d753..e5b87fb8a 100644 --- a/src/sndhrdw/segasnd.c +++ b/src/sndhrdw/segasnd.c @@ -643,7 +643,7 @@ static void *usb_start(int clock, const struct CustomSound_interface *config) int tchan, tgroup; /* find the CPU we are associated with */ - usb.cpunum = mame_find_cpu_index("usb"); + usb.cpunum = mame_find_cpu_index(Machine, "usb"); assert(usb.cpunum != (UINT8)-1); /* allocate work RAM */ diff --git a/src/sndhrdw/tiamc1.c b/src/sndhrdw/tiamc1.c new file mode 100644 index 000000000..ed35b73e4 --- /dev/null +++ b/src/sndhrdw/tiamc1.c @@ -0,0 +1,314 @@ +/*************************************************************************** + + TIA-MC1 sound hardware + + driver by Eugene Sandulenko + special thanks to Shiru for his standalone emulator and documentation + + timer1 timer0 + |--------| |--------| + | 8253 | | 8253 | |---| + in0 | | | | | 1 | |---| + ----+ g0 o0 +---+ g0 o0 +---+ | | & | + in1 | | | | | o---+ | out + ----+ g1 o1 +---+ g1 o1 +---+ | | +----- + in2 | | | | |---| | | + ----+ g2 o2 +---+ g2 o2 +-----------+ | + clk1| | | | |---| + ----+ clk | +-+ clk | + | | | | | + |--------| | |--------| + clk0 | + ---------------+ + + in0-in2 comes from port #da + clk0 comes from 8224 and equals to 1777777Hz, i.e. processor clock + clk1 comes from divider 16000000/4/16/16/2 = 7812Hz + + ******************** + + TODO: use machine/pit8253.c + +***************************************************************************/ + +#include "driver.h" +#include "streams.h" +#include "sound/custom.h" + +#define CLOCK_DIVIDER 16 +#define BUF_LEN 100000 + +static sound_stream *channel; +static int timer1_divider; + +struct timer8253chan { + UINT16 count; + UINT16 cnval; + UINT8 bcdMode; + UINT8 cntMode; + UINT8 valMode; + UINT8 gate; + UINT8 output; + UINT8 loadCnt; + UINT8 enable; +}; + +struct timer8253struct { + struct timer8253chan channel[3]; +}; + +static struct timer8253struct timer0; +static struct timer8253struct timer1; + + +#define T8253_CHAN0 0 +#define T8253_CHAN1 1 +#define T8253_CHAN2 2 +#define T8253_CWORD 3 + + +void timer8253_reset(struct timer8253struct *t) { + memset(t,0,sizeof(struct timer8253struct)); +} + + +void timer8253_tick(struct timer8253struct *t,int chn) { + if (t->channel[chn].enable && t->channel[chn].gate) { + switch (t->channel[chn].cntMode) { + case 0: + t->channel[chn].count--; + if (t->channel[chn].count == 0xffff) + t->channel[chn].output = 1; + break; + + case 3: + t->channel[chn].count--; + + if (t->channel[chn].count < (t->channel[chn].cnval >> 1)) + t->channel[chn].output = 0; + else + t->channel[chn].output = 1; + + if (t->channel[chn].count == 0xffff) + t->channel[chn].count = t->channel[chn].cnval; + break; + + case 4: + t->channel[chn].count--; + if(t->channel[chn].count==0) + t->channel[chn].output = 1; + + if(t->channel[chn].count == 0xffff) { + t->channel[chn].enable = 0; + t->channel[chn].output = 1; + } + break; + } + } +} + + + +void timer8253_wr(struct timer8253struct *t, int reg, unsigned char val) +{ + int chn; + + switch (reg) { + case T8253_CWORD: + chn = val >> 6; + if (chn < 3) { + t->channel[chn].bcdMode = (val & 1) ? 1 : 0; + t->channel[chn].cntMode = (val >> 1) & 0x07; + t->channel[chn].valMode = (val >> 4) & 0x03; + + switch (t->channel[chn].valMode) { + case 1: + case 2: + t->channel[chn].loadCnt = 1; + break; + + case 3: + t->channel[chn].loadCnt = 2; + break; + + default: + printf("unhandled val mode %i\n", t->channel[chn].valMode); + } + + switch (t->channel[chn].cntMode) { + case 0: + t->channel[chn].output = 0; + t->channel[chn].enable = 0; + break; + + case 3: + t->channel[chn].output = 1; + break; + + case 4: + t->channel[chn].output = 1; + t->channel[chn].enable = 0; + break; + + default: + printf("unhandled cnt mode %i\n", t->channel[chn].cntMode); + } + } + break; + + default: + chn = reg; + + switch (t->channel[chn].valMode) { + case 1: + t->channel[chn].cnval = (t->channel[chn].cnval & 0xff00) | val; + break; + case 2: + t->channel[chn].cnval = (t->channel[chn].cnval & 0x00ff) | (val << 8); + break; + case 3: + t->channel[chn].cnval = (t->channel[chn].cnval >> 8) | (val << 8); + break; + default: + printf("unhandled val mode %i\n", t->channel[chn].valMode); + } + + if (t->channel[chn].cntMode==0) { + t->channel[chn].enable = 0; + } + + t->channel[chn].loadCnt--; + + if (t->channel[chn].loadCnt == 0) { + switch (t->channel[chn].valMode) { + case 1: + case 2: + t->channel[chn].loadCnt = 1; + break; + + case 3: + t->channel[chn].loadCnt = 2; + break; + + default: + printf("unhandled val mode %i\n", t->channel[chn].valMode); + } + + switch (t->channel[chn].cntMode) { + case 3: + t->channel[chn].count = t->channel[chn].cnval; + t->channel[chn].enable = 1; + break; + + case 0: + case 4: + t->channel[chn].count = t->channel[chn].cnval; + t->channel[chn].enable = 1; + break; + + default: + printf("unhandled cnt mode %i\n", t->channel[chn].cntMode); + } + } + } +} + +void timer8253_set_gate(struct timer8253struct *t, int chn, UINT8 gate) +{ + t->channel[chn].gate = gate; +} + + + +char timer8253_get_output(struct timer8253struct *t, int chn) +{ + return t->channel[chn].output; +} + + +WRITE8_HANDLER( tiamc1_timer0_w ) +{ + timer8253_wr(&timer0, offset, data); +} + +WRITE8_HANDLER( tiamc1_timer1_w ) +{ + timer8253_wr(&timer1, offset, data); +} + +WRITE8_HANDLER( tiamc1_timer1_gate_w ) +{ + timer8253_set_gate(&timer1, 0, (data & 1) ? 1 : 0); + timer8253_set_gate(&timer1, 1, (data & 2) ? 1 : 0); + timer8253_set_gate(&timer1, 2, (data & 4) ? 1 : 0); +} + + +static void tiamc1_sound_update(void *param, stream_sample_t **inputs, stream_sample_t **outputs, int length) +{ + int count, o0, o1, o2, len, or = 0; + + len = length * CLOCK_DIVIDER; + + for (count = 0; count < len; count++) { + timer1_divider++; + if (timer1_divider == 228) { + timer1_divider = 0; + timer8253_tick(&timer1, 0); + timer8253_tick(&timer1, 1); + timer8253_tick(&timer1, 2); + + timer8253_set_gate(&timer0, 0, timer8253_get_output(&timer1, 0)); + timer8253_set_gate(&timer0, 1, timer8253_get_output(&timer1, 1)); + timer8253_set_gate(&timer0, 2, timer8253_get_output(&timer1, 2)); + } + + timer8253_tick(&timer0, 0); + timer8253_tick(&timer0, 1); + timer8253_tick(&timer0, 2); + + o0 = timer8253_get_output(&timer0, 0) ? 1 : 0; + o1 = timer8253_get_output(&timer0, 1) ? 1 : 0; + o2 = timer8253_get_output(&timer0, 2) ? 1 : 0; + + or = (or << 1) | (((o0 | o1) ^ 0xff) & o2); + + if ((count + 1) % CLOCK_DIVIDER == 0) { + outputs[0][count / CLOCK_DIVIDER] = or ? 0x2828 : 0; + or = 0; + } + } +} + +void *tiamc1_sh_start(int clock, const struct CustomSound_interface *config) +{ + int i, j; + + timer8253_reset(&timer0); + timer8253_reset(&timer1); + + channel = stream_create(0, 1, clock / CLOCK_DIVIDER, 0, tiamc1_sound_update); + + timer1_divider = 0; + + for (i = 0; i < 2; i++) { + struct timer8253struct *t = (i ? &timer1 : &timer0); + + for (j = 0; j < 3; j++) { + state_save_register_item("channel", i * 3 + j, t->channel[j].count); + state_save_register_item("channel", i * 3 + j, t->channel[j].cnval); + state_save_register_item("channel", i * 3 + j, t->channel[j].bcdMode); + state_save_register_item("channel", i * 3 + j, t->channel[j].cntMode); + state_save_register_item("channel", i * 3 + j, t->channel[j].valMode); + state_save_register_item("channel", i * 3 + j, t->channel[j].gate); + state_save_register_item("channel", i * 3 + j, t->channel[j].output); + state_save_register_item("channel", i * 3 + j, t->channel[j].loadCnt); + state_save_register_item("channel", i * 3 + j, t->channel[j].enable); + } + } + + state_save_register_global(timer1_divider); + + return channel; +} + diff --git a/src/sndhrdw/turbo.c b/src/sndhrdw/turbo.c index b69e7eed8..0a056c5a1 100644 --- a/src/sndhrdw/turbo.c +++ b/src/sndhrdw/turbo.c @@ -11,17 +11,603 @@ #define DISCRETE_TEST (0) -/* local data */ -static UINT8 osel, bsel; -static UINT8 turbo_accel; -static UINT8 buckrog_hit; -static UINT8 buckrog_myship; +/************************************* + * + * Turbo shared state updates + * + *************************************/ + +static void turbo_update_samples(turbo_state *state) +{ + /* accelerator sounds */ + /* BSEL == 3 --> off */ + /* BSEL == 2 --> standard */ + /* BSEL == 1 --> tunnel */ + /* BSEL == 0 --> ??? */ + if (state->turbo_bsel == 3 && sample_playing(5)) + sample_stop(5); + else if (state->turbo_bsel != 3 && !sample_playing(5)) + sample_start(5, 7, TRUE); + if (sample_playing(5)) + sample_set_freq(5, sample_get_base_freq(5) * ((state->turbo_accel & 0x3f) / 5.25 + 1)); +} + + +#if (DISCRETE_TEST) +static int last_sound_a; + +static void update_sound_a(int data) +{ + /* missing short crash sample, but I've never seen it triggered */ + discrete_sound_w(0, !(data & 0x01)); + discrete_sound_w(1, (data >> 1) & 1); + discrete_sound_w(2, (data >> 2) & 1); + discrete_sound_w(3, (data >> 3) & 1); + discrete_sound_w(4, (data >> 4) & 1); + discrete_sound_w(5, !(data & 0x20)); + discrete_sound_w(6, !(data & 0x40)); + +if (!((data >> 1) & 1)) printf("/TRIG1\n"); +if (!((data >> 2) & 1)) printf("/TRIG2\n"); +if (!((data >> 3) & 1)) printf("/TRIG3\n"); +if (!((data >> 4) & 1)) printf("/TRIG4\n"); + +// osel = (osel & 6) | ((data >> 5) & 1); +// turbo_update_samples(); +} +#endif + + + +/************************************* + * + * Turbo PPI write handlers + * + *************************************/ + +WRITE8_HANDLER( turbo_sound_a_w ) +{ + turbo_state *state = Machine->driver_data; + UINT8 diff = data ^ state->sound_state[0]; + state->sound_state[0] = data; + +#if (!DISCRETE_TEST) + + /* /CRASH.S: channel 0 */ + if ((diff & 0x01) && !(data & 0x01)) sample_start(0, 5, FALSE); + + /* /TRIG1: channel 1 */ + if ((diff & 0x02) && !(data & 0x02)) sample_start(1, 0, FALSE); + + /* /TRIG2: channel 1 */ + if ((diff & 0x04) && !(data & 0x04)) sample_start(1, 1, FALSE); + + /* /TRIG3: channel 1 */ + if ((diff & 0x08) && !(data & 0x08)) sample_start(1, 2, FALSE); + + /* /TRIG4: channel 1 */ + if ((diff & 0x10) && !(data & 0x10)) sample_start(1, 3, FALSE); + + /* OSEL0 */ + state->turbo_osel = (state->turbo_osel & 6) | ((data >> 5) & 1); + + /* /SLIP: channel 2 */ + if ((diff & 0x40) && !(data & 0x40)) sample_start(2, 4, FALSE); + + /* /CRASH.L: channel 3 */ + if ((diff & 0x80) && !(data & 0x80)) sample_start(3, 5, FALSE); + + /* update any samples */ + turbo_update_samples(state); + +#else + + if (((data ^ last_sound_a) & 0x1e) && (last_sound_a & 0x1e) != 0x1e) + timer_set(TIME_IN_HZ(20000), data, update_sound_a); + else + update_sound_a(data); + + last_sound_a = data; + +#endif +} + + +WRITE8_HANDLER( turbo_sound_b_w ) +{ + turbo_state *state = Machine->driver_data; + UINT8 diff = data ^ state->sound_state[1]; + state->sound_state[1] = data; + + /* ACC0-ACC5 */ + state->turbo_accel = data & 0x3f; + output_set_value("tachometer", state->turbo_accel); + + /* /AMBU: channel 4 */ + if ((diff & 0x40) && !(data & 0x40) && !sample_playing(4)) sample_start(4, 8, TRUE); + if ((diff & 0x40) && (data & 0x40)) sample_stop(4); + + /* /SPIN: channel 2 */ + if ((diff & 0x80) && !(data & 0x80)) sample_start(2, 6, FALSE); + + /* update any samples */ + turbo_update_samples(state); +} + + +WRITE8_HANDLER( turbo_sound_c_w ) +{ + turbo_state *state = Machine->driver_data; + + /* OSEL1-2 */ + state->turbo_osel = (state->turbo_osel & 1) | ((data & 3) << 1); + + /* BSEL0-1 */ + state->turbo_bsel = (data >> 2) & 3; + + /* SPEED0-3 */ + output_set_value("speed", (data >> 4) & 0x0f); + + /* update any samples */ + turbo_update_samples(state); +} + + + +/************************************* + * + * Turbo sound hardware description + * + *************************************/ + +static const char *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 */ + 0 +}; + + +static struct Samplesinterface turbo_samples_interface = +{ + 10, + turbo_sample_names +}; + + +MACHINE_DRIVER_START( turbo_samples ) + + /* this is the cockpit speaker configuration */ + MDRV_SPEAKER_ADD("front", 0.0, 0.0, 1.0) + MDRV_SPEAKER_ADD("rear", 0.0, 0.0, -0.5) + MDRV_SPEAKER_ADD("left", -0.2, 0.0, 1.0) + MDRV_SPEAKER_ADD("right", 0.2, 0.0, 1.0) + + MDRV_SOUND_ADD(SAMPLES, 0) + MDRV_SOUND_CONFIG(turbo_samples_interface) + + /* channel 0 = CRASH.S -> CRASH.S/SM */ + MDRV_SOUND_ROUTE(0, "front", 0.25) + + /* channel 1 = TRIG1-4 -> ALARM.M/F/R/L */ + MDRV_SOUND_ROUTE(1, "front", 0.25) + MDRV_SOUND_ROUTE(1, "right", 0.25) + MDRV_SOUND_ROUTE(1, "left", 0.25) + + /* channel 2 = SLIP/SPIN -> SKID.F/R/L/M */ + MDRV_SOUND_ROUTE(2, "front", 0.25) + MDRV_SOUND_ROUTE(2, "right", 0.25) + MDRV_SOUND_ROUTE(2, "left", 0.25) + + /* channel 3 = CRASH.L -> CRASH.L/LM */ + MDRV_SOUND_ROUTE(3, "rear", 0.25) + + /* channel 4 = AMBU -> AMBULANCE/AMBULANCE.M */ + MDRV_SOUND_ROUTE(4, "front", 0.25) + + /* channel 5 = ACCEL+BSEL -> MYCAR.F/W/M + MYCAR0.F/M + MYCAR1.F/M */ + MDRV_SOUND_ROUTE(5, "front", 0.25) + MDRV_SOUND_ROUTE(5, "rear", 0.25) + + /* channel 6 = OSEL -> OCAR.F/FM */ + MDRV_SOUND_ROUTE(6, "front", 0.25) + + /* channel 7 = OSEL -> OCAR.L/LM */ + MDRV_SOUND_ROUTE(7, "left", 0.25) + + /* channel 8 = OSEL -> OCAR.R/RM */ + MDRV_SOUND_ROUTE(8, "right", 0.25) + + /* channel 9 = OSEL -> OCAR.W/WM */ + MDRV_SOUND_ROUTE(9, "rear", 0.25) +MACHINE_DRIVER_END + +/* + Cockpit: CN2 1+2 -> FRONT + CN2 3+4 -> REAR + CN2 5+6 -> RIGHT + CN2 7+8 -> LEFT + + Upright: CN2 1+2 -> UPPER + CN2 3+4 -> LOWER + + F.OUT = CRASH.S + + ALARM.F + + SKID.F + + OCAR.F + + MYCAR.F + + MYCAR0.F + + MYCAR1.F + + AMBULACE + + W.OUT = CRASH.L + + OCAR.W + + MYCAR.W + + MYCAR0.W + + MYCAR1.W + + SLF + + R.OUT = ALARM.R + + SKID.R + + OCAR.R + + L.OUT = ALARM.L + + SKID.L + + OCAR.L + + M.OUT = CRASH.SM + + CRASH.LM + + SKID.M + + ALARM.M + + AMBULACE.M + + MYCAR.M + + MYCAR0.M + + MYCAR1.M + + OCAR.FM + + OCAR.LM + + OCAR.RM + + OCAR.WM +*/ + + + +/************************************* + * + * Subroc 3D PPI write handlers + * + *************************************/ + +WRITE8_HANDLER( subroc3d_sound_a_w ) +{ + turbo_state *state = Machine->driver_data; + state->sound_state[0] = data; + + /* DIS0-3 contained in bits 0-3 */ + /* DIR0-2 contained in bits 4-6 */ +} + + +INLINE void subroc3d_update_volume(int leftchan, UINT8 dis, UINT8 dir) +{ + float volume = (float)(15 - dis) / 16.0f; + float lvol, rvol; + + /* compute the left/right volume from the data */ + if (dir != 7) + { + lvol = volume * (float)(6 - dir) / 6.0f; + rvol = volume * (float)dir / 6.0f; + } + else + lvol = rvol = 0; + + /* if the sample is playing, adjust it */ + sample_set_volume(leftchan + 0, lvol); + sample_set_volume(leftchan + 1, rvol); +} + + +WRITE8_HANDLER( subroc3d_sound_b_w ) +{ + turbo_state *state = Machine->driver_data; + UINT8 diff = data ^ state->sound_state[1]; + state->sound_state[1] = data; + + /* bit 0 latches direction/volume for missile */ + if ((diff & 0x01) && (data & 0x01)) + { + state->subroc3d_mdis = state->sound_state[0] & 0x0f; + state->subroc3d_mdir = (state->sound_state[0] >> 4) & 0x07; + if (!sample_playing(0)) + { + sample_start(0, 0, TRUE); + sample_start(1, 0, TRUE); + } + subroc3d_update_volume(0, state->subroc3d_mdis, state->subroc3d_mdir); + } + + /* bit 1 latches direction/volume for torpedo */ + if ((diff & 0x02) && (data & 0x02)) + { + state->subroc3d_tdis = state->sound_state[0] & 0x0f; + state->subroc3d_tdir = (state->sound_state[0] >> 4) & 0x07; + if (!sample_playing(2)) + { + sample_start(2, 1, TRUE); + sample_start(3, 1, TRUE); + } + subroc3d_update_volume(2, state->subroc3d_tdis, state->subroc3d_tdir); + } + + /* bit 2 latches direction/volume for fighter */ + if ((diff & 0x04) && (data & 0x04)) + { + state->subroc3d_fdis = state->sound_state[0] & 0x0f; + state->subroc3d_fdir = (state->sound_state[0] >> 4) & 0x07; + if (!sample_playing(4)) + { + sample_start(4, 2, TRUE); + sample_start(5, 2, TRUE); + } + subroc3d_update_volume(4, state->subroc3d_fdis, state->subroc3d_fdir); + } + + /* bit 3 latches direction/volume for hit */ + if ((diff & 0x08) && (data & 0x08)) + { + state->subroc3d_hdis = state->sound_state[0] & 0x0f; + state->subroc3d_hdir = (state->sound_state[0] >> 4) & 0x07; + subroc3d_update_volume(6, state->subroc3d_hdis, state->subroc3d_hdir); + } +} + + +WRITE8_HANDLER( subroc3d_sound_c_w ) +{ + turbo_state *state = Machine->driver_data; + UINT8 diff = data ^ state->sound_state[2]; + state->sound_state[2] = data; + + /* /FIRE TRIG */ + /* FIRE SELECT */ + if ((diff & 0x01) && (data & 0x01)) + sample_start(8, (data & 0x02) ? 6 : 5, FALSE); + + /* /SHIP EXP TRIG -> MY SHIP EXP: channel 9 */ + if ((diff & 0x04) && (data & 0x04)) + sample_start(9, 7, FALSE); + + /* /HIT TRIG -> HIT.L/R: channels 6+7 */ + if ((diff & 0x08) && (data & 0x08)) + { + sample_start(6, (state->sound_state[0] & 0x80) ? 4 : 3, FALSE); + sample_start(7, (state->sound_state[0] & 0x80) ? 4 : 3, FALSE); + } + + /* /ALARM TRIG -> ALARM.M: channel 10 */ + /* ALARM SELECT */ + if ((diff & 0x10) && (data & 0x10)) + sample_start(10, (data & 0x20) ? 10 : 9, FALSE); + + /* /PROLOGUE */ + if (!sample_playing(11)) + sample_start(11, 8, TRUE); + sample_set_volume(11, (data & 0x40) ? 0 : 1.0); + + /* /GAME START */ + sound_global_enable(!(data & 0x80)); +} + + + +/************************************* + * + * Subroc 3D sound hardware description + * + *************************************/ + +static const char *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 */ + 0 +}; + + +static struct Samplesinterface subroc3d_samples_interface = +{ + 12, + subroc3d_sample_names +}; + + +MACHINE_DRIVER_START( subroc3d_samples ) + MDRV_SPEAKER_STANDARD_STEREO("left", "right") + + MDRV_SOUND_ADD(SAMPLES, 0) + MDRV_SOUND_CONFIG(subroc3d_samples_interface) + + /* MISSILE in channels 0 and 1 */ + MDRV_SOUND_ROUTE(0, "left", 0.25) + MDRV_SOUND_ROUTE(1, "right", 0.25) + + /* TORPEDO in channels 2 and 3 */ + MDRV_SOUND_ROUTE(2, "left", 0.25) + MDRV_SOUND_ROUTE(3, "right", 0.25) + + /* FIGHTER in channels 4 and 5 */ + MDRV_SOUND_ROUTE(4, "left", 0.25) + MDRV_SOUND_ROUTE(5, "right", 0.25) + + /* HIT in channels 6 and 7 */ + MDRV_SOUND_ROUTE(6, "left", 0.25) + MDRV_SOUND_ROUTE(7, "right", 0.25) + + /* FIRE sound in channel 8 */ + MDRV_SOUND_ROUTE(8, "left", 0.25) + MDRV_SOUND_ROUTE(8, "right", 0.25) + + /* SHIP EXP sound in channel 9 */ + MDRV_SOUND_ROUTE(9, "left", 0.25) + MDRV_SOUND_ROUTE(9, "right", 0.25) + + /* ALARM TRIG sound in channel 10 */ + MDRV_SOUND_ROUTE(10, "left", 0.25) + MDRV_SOUND_ROUTE(10, "right", 0.25) + + /* PROLOGUE sound in channel 11 */ + MDRV_SOUND_ROUTE(11, "left", 0.25) + MDRV_SOUND_ROUTE(11, "right", 0.25) +MACHINE_DRIVER_END + -static UINT8 subroc3d_volume; -static UINT8 subroc3d_select; +/************************************* + * + * Buck Rogers PPI write handlers + * + *************************************/ + +static void buckrog_update_samples(turbo_state *state) +{ + /* accelerator sounds */ + if (sample_playing(5)) + sample_set_freq(5, sample_get_base_freq(5) * (state->buckrog_myship / 100.25 + 1)); +} + + +WRITE8_HANDLER( buckrog_sound_a_w ) +{ + turbo_state *state = Machine->driver_data; + UINT8 diff = data ^ state->sound_state[0]; + state->sound_state[0] = data; + + /* clock HIT DIS from bits 0-2 */ + if ((diff & 0x10) && (data & 0x10)) + sample_set_volume(3, (float)(/*7 - */(data & 7)) / 7.0f); + + /* clock ACC from bits 0-3 */ + if ((diff & 0x20) && (data & 0x20)) + { + state->buckrog_myship = data & 0x0f; + buckrog_update_samples(state); + } + + /* /ALARM0: channel 0 */ + if ((diff & 0x40) && !(data & 0x40)) sample_start(0, 0, FALSE); + + /* /ALARM1: channel 0 */ + if ((diff & 0x80) && !(data & 0x80)) sample_start(0, 1, FALSE); +} + + +WRITE8_HANDLER( buckrog_sound_b_w ) +{ + turbo_state *state = Machine->driver_data; + UINT8 diff = data ^ state->sound_state[1]; + state->sound_state[1] = data; + + /* /ALARM3: channel 0 */ + if ((diff & 0x01) && !(data & 0x01)) sample_start(0, 2, FALSE); + + /* /ALARM4: channel 0 */ + if ((diff & 0x02) && !(data & 0x02)) sample_start(0, 3, FALSE); + + /* /FIRE: channel 1 */ + if ((diff & 0x04) && !(data & 0x04)) sample_start(1, 5, FALSE); + + /* /EXP: channel 2 */ + if ((diff & 0x08) && !(data & 0x08)) sample_start(2, 4, FALSE); + + /* /HIT: channel 3 */ + if ((diff & 0x10) && !(data & 0x10)) + { + sample_start(3, 7, FALSE); + buckrog_update_samples(state); + } + + /* /REBOUND: channel 4 */ + if ((diff & 0x20) && !(data & 0x20)) sample_start(4, 6, FALSE); + + /* SHIP: channel 5 */ + if ((diff & 0x40) && (data & 0x40) && !sample_playing(5)) + { + sample_start(5, 8, TRUE); + buckrog_update_samples(state); + } + if ((diff & 0x40) && !(data & 0x40) && sample_playing(5)) sample_stop(5); + + /* GAME ON */ + sound_global_enable(data & 0x80); +} + + + +/************************************* + * + * Sound interfaces + * + *************************************/ + +static const char *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 */ + 0 +}; + + +static struct Samplesinterface buckrog_samples_interface = +{ + 6, /* 6 channels */ + buckrog_sample_names +}; + + +MACHINE_DRIVER_START( buckrog_samples ) + MDRV_SPEAKER_STANDARD_MONO("mono") + MDRV_SOUND_ADD(SAMPLES, 0) + MDRV_SOUND_CONFIG(buckrog_samples_interface) + MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) +MACHINE_DRIVER_END + + + +/************************************* + * + * Discrete test code + * + *************************************/ #if (DISCRETE_TEST) @@ -147,262 +733,3 @@ DISCRETE_SOUND_START(turbo_sound_interface) DISCRETE_SOUND_END #endif - - - -/******************************************* - - Sample handling - -*******************************************/ - -static void turbo_update_samples(void) -{ - /* accelerator sounds */ - /* BSEL == 3 --> off */ - /* BSEL == 2 --> standard */ - /* BSEL == 1 --> tunnel */ - /* BSEL == 0 --> ??? */ - if (bsel == 3 && sample_playing(6)) - sample_stop(6); - else if (bsel != 3 && !sample_playing(6)) - sample_start(6, 7, 1); - if (sample_playing(6)) - sample_set_freq(6, 44100 * (turbo_accel & 0x3f) / 5.25 + 44100); -} - - -static void buckrog_update_samples(void) -{ - /* accelerator sounds -- */ - if (sample_playing(0)) - sample_set_freq(0, 44100 * buckrog_myship / 100.25 + 44100); - - if (sample_playing(1)) - sample_set_freq(1, 44100 * buckrog_hit / 5.25 + 44100); -} - - - -/******************************************* - - Turbo sound handling - -*******************************************/ - -#if (DISCRETE_TEST) -static int last_sound_A; - -static void update_sound_A(int data) -{ - /* missing short crash sample, but I've never seen it triggered */ - discrete_sound_w(0, !(data & 0x01)); - discrete_sound_w(1, (data >> 1) & 1); - discrete_sound_w(2, (data >> 2) & 1); - discrete_sound_w(3, (data >> 3) & 1); - discrete_sound_w(4, (data >> 4) & 1); - discrete_sound_w(5, !(data & 0x20)); - discrete_sound_w(6, !(data & 0x40)); - -if (!((data >> 1) & 1)) printf("/TRIG1\n"); -if (!((data >> 2) & 1)) printf("/TRIG2\n"); -if (!((data >> 3) & 1)) printf("/TRIG3\n"); -if (!((data >> 4) & 1)) printf("/TRIG4\n"); - -// osel = (osel & 6) | ((data >> 5) & 1); -// turbo_update_samples(); -} -#endif - - -WRITE8_HANDLER( turbo_sound_A_w ) -{ - /* - 2PA0 = /CRASH - 2PA1 = /TRIG1 - 2PA2 = /TRIG2 - 2PA3 = /TRIG3 - 2PA4 = /TRIG4 - 2PA5 = OSEL0 - 2PA6 = /SLIP - 2PA7 = /CRASHL - */ -#if (DISCRETE_TEST) - if (((data ^ last_sound_A) & 0x1e) && (last_sound_A & 0x1e) != 0x1e) - timer_set(TIME_IN_HZ(20000), data, update_sound_A); - else - update_sound_A(data); - - last_sound_A = data; -#else - /* missing short crash sample, but I've never seen it triggered */ - if (!(data & 0x02)) sample_start(0, 0, 0); - if (!(data & 0x04)) sample_start(0, 1, 0); - if (!(data & 0x08)) sample_start(0, 2, 0); - if (!(data & 0x10)) sample_start(0, 3, 0); - if (!(data & 0x40)) sample_start(1, 4, 0); - if (!(data & 0x80)) sample_start(2, 5, 0); - osel = (osel & 6) | ((data >> 5) & 1); - turbo_update_samples(); -#endif -} - - -WRITE8_HANDLER( turbo_sound_B_w ) -{ - /* - 2PB0 = ACC0 - 2PB1 = ACC1 - 2PB2 = ACC2 - 2PB3 = ACC3 - 2PB4 = ACC4 - 2PB5 = ACC5 - 2PB6 = /AMBU - 2PB7 = /SPIN - */ - turbo_accel = data & 0x3f; - turbo_update_samples(); - if (!(data & 0x40)) - { - if (!sample_playing(7)) - sample_start(7, 8, 0); - else - logerror("ambu didnt start\n"); - } - else - sample_stop(7); - if (!(data & 0x80)) sample_start(3, 6, 0); -} - - -WRITE8_HANDLER( turbo_sound_C_w ) -{ - /* - 2PC0 = OSEL1 - 2PC1 = OSEL2 - 2PC2 = BSEL0 - 2PC3 = BSEL1 - 2PC4 = SPEED0 - 2PC5 = SPEED1 - 2PC6 = SPEED2 - 2PC7 = SPEED3 - */ - turbo_speed = (data >> 4) & 0x0f; - bsel = (data >> 2) & 3; - osel = (osel & 1) | ((data & 3) << 1); - turbo_update_samples(); - turbo_update_tachometer(); -} - - - -/******************************************* - - Subroc3D 8255 PPI handling - -*******************************************/ - -WRITE8_HANDLER( subroc3d_sound_A_w ) -{ - /* bits 4 to 6 control balance */ - - subroc3d_volume = (data & 0x0f); - subroc3d_select = (data & 0x80); -} - - -WRITE8_HANDLER( subroc3d_sound_B_w ) -{ - static UINT8 last = 0; - - float volume = (15 - subroc3d_volume) / 15.0; - - if ((data & 1) && !(last & 1)) - sample_set_volume(0, volume); - if ((data & 2) && !(last & 2)) - sample_set_volume(1, volume); - if ((data & 4) && !(last & 4)) - sample_set_volume(2, volume); - if ((data & 8) && !(last & 8)) - sample_set_volume(3, volume); - - last = data; -} - - -WRITE8_HANDLER( subroc3d_sound_C_w ) -{ - static UINT8 last = 0; - - if ((data & 0x01) && !(last & 0x01)) - sample_start(4, (data & 0x02) ? 6 : 5, 0); - if ((data & 0x04) && !(last & 0x04)) - sample_start(6, 7, 0); - if ((data & 0x08) && !(last & 0x08)) - sample_start(3, subroc3d_select ? 4 : 3, 0); - if ((data & 0x10) && !(last & 0x10)) - sample_start(5, (data & 0x20) ? 10 : 9, 0); - - sample_set_volume(7, (data & 0x40) ? 0 : 1.0); - - last = data; - - sound_global_enable(!(data & 0x80)); -} - - - -/******************************************* - - Buck Rogers 8255 PPI handling - -*******************************************/ - -WRITE8_HANDLER( buckrog_sound_A_w ) -{ - /* sound controls */ - static int last = -1; - - if ((last & 0x10) && !(data & 0x10)) - { - buckrog_hit = data & 0x07; - buckrog_update_samples(); - } - - if ((last & 0x20) && !(data & 0x20)) - { - buckrog_myship = data & 0x0f; - buckrog_update_samples(); - } - - if ((last & 0x40) && !(data & 0x40)) sample_start(5, 0, 0); /* alarm0 */ - if ((last & 0x80) && !(data & 0x80)) sample_start(5, 1, 0); /* alarm1 */ - - last = data; -} - - -WRITE8_HANDLER( buckrog_sound_B_w ) -{ - /* sound controls */ - static int last = -1; - - if ((last & 0x01) && !(data & 0x01)) sample_start(5, 2, 0); /* alarm2 */ - if ((last & 0x02) && !(data & 0x02)) sample_start(5, 3, 0); /* alarm3 */ - if ((last & 0x04) && !(data & 0x04)) sample_start(2, 5, 0); /* fire */ - if ((last & 0x08) && !(data & 0x08)) sample_start(3, 4, 0); /* exp */ - if ((last & 0x10) && !(data & 0x10)) { sample_start(1, 7, 0); buckrog_update_samples(); } /* hit */ - if ((last & 0x20) && !(data & 0x20)) sample_start(4, 6, 0); /* rebound */ - - if ((data & 0x40) && !sample_playing(0)) - { - sample_start(0, 8, 1); /* ship */ - buckrog_update_samples(); - } - if (!(data & 0x40) && sample_playing(0)) - sample_stop(0); - - sound_global_enable(data & 0x80); - - last = data; -} diff --git a/src/sndhrdw/williams.c b/src/sndhrdw/williams.c index 0139d80d7..1a3e0c507 100644 --- a/src/sndhrdw/williams.c +++ b/src/sndhrdw/williams.c @@ -252,7 +252,7 @@ void williams_cvsd_init(int pianum) int bank; /* configure the CPU */ - sound_cpunum = mame_find_cpu_index("cvsd"); + sound_cpunum = mame_find_cpu_index(Machine, "cvsd"); soundalt_cpunum = -1; /* configure the PIA */ @@ -284,8 +284,8 @@ void williams_narc_init(void) int bank; /* configure the CPU */ - sound_cpunum = mame_find_cpu_index("narc1"); - soundalt_cpunum = mame_find_cpu_index("narc2"); + sound_cpunum = mame_find_cpu_index(Machine, "narc1"); + soundalt_cpunum = mame_find_cpu_index(Machine, "narc2"); /* configure master CPU banks */ ROM = memory_region(REGION_CPU1 + sound_cpunum); @@ -326,7 +326,7 @@ void williams_adpcm_init(void) UINT8 *ROM; /* configure the CPU */ - sound_cpunum = mame_find_cpu_index("adpcm"); + sound_cpunum = mame_find_cpu_index(Machine, "adpcm"); soundalt_cpunum = -1; /* configure banks */ diff --git a/src/sndintrf.c b/src/sndintrf.c index 32ea5e130..034e2c2ec 100644 --- a/src/sndintrf.c +++ b/src/sndintrf.c @@ -144,10 +144,10 @@ void vrender0_get_info(void *token, UINT32 state, sndinfo *info); void votrax_get_info(void *token, UINT32 state, sndinfo *info); void es8712_get_info(void *token, UINT32 state, sndinfo *info); void rf5c400_get_info(void *token, UINT32 state, sndinfo *info); +void speaker_get_info(void *token, UINT32 state, sndinfo *info); #ifdef MESS void beep_get_info(void *token, UINT32 state, sndinfo *info); -void speaker_get_info(void *token, UINT32 state, sndinfo *info); void wave_get_info(void *token, UINT32 state, sndinfo *info); void sid6581_get_info(void *token, UINT32 state, sndinfo *info); void sid8580_get_info(void *token, UINT32 state, sndinfo *info); @@ -399,14 +399,14 @@ static const struct #if (HAS_RF5C400) { SOUND_RF5C400, rf5c400_get_info }, #endif +#if (HAS_SPEAKER) + { SOUND_SPEAKER, speaker_get_info }, +#endif #ifdef MESS #if (HAS_BEEP) { SOUND_BEEP, beep_get_info }, #endif -#if (HAS_SPEAKER) - { SOUND_SPEAKER, speaker_get_info }, -#endif #if (HAS_WAVE) { SOUND_WAVE, wave_get_info }, #endif @@ -461,7 +461,7 @@ static int totalsnd; (type,index) pairs for the current Machine -------------------------------------------------*/ -void sndintrf_init(void) +void sndintrf_init(running_machine *machine) { int mapindex; diff --git a/src/sndintrf.h b/src/sndintrf.h index c71127171..72bf56708 100644 --- a/src/sndintrf.h +++ b/src/sndintrf.h @@ -104,10 +104,10 @@ enum SOUND_VOTRAX, SOUND_ES8712, SOUND_RF5C400, + SOUND_SPEAKER, #ifdef MESS SOUND_BEEP, - SOUND_SPEAKER, SOUND_WAVE, SOUND_SID6581, SOUND_SID8580, @@ -253,7 +253,7 @@ const char *sndtype_get_info_string(int sndtype, UINT32 state); ***************************************************************************/ /* Initialization/Tear down */ -void sndintrf_init(void); +void sndintrf_init(running_machine *machine); int sndintrf_init_sound(int sndnum, int sndtype, int clock, const void *config); void sndintrf_exit_sound(int sndnum); void sndintrf_register_token(void *token); diff --git a/src/sound.c b/src/sound.c index edb065487..32a4cd003 100644 --- a/src/sound.c +++ b/src/sound.c @@ -113,9 +113,9 @@ static wav_file *wavfile; FUNCTION PROTOTYPES ***************************************************************************/ -static void sound_reset(void); -static void sound_pause(int pause); -static void sound_exit(void); +static void sound_reset(running_machine *machine); +static void sound_pause(running_machine *machine, int pause); +static void sound_exit(running_machine *machine); static void sound_load(int config_type, xml_data_node *parentnode); static void sound_save(int config_type, xml_data_node *parentnode); static int start_sound_chips(void); @@ -170,7 +170,7 @@ INLINE sound_info *find_sound_by_tag(const char *tag) sound_init - start up the sound system -------------------------------------------------*/ -int sound_init(void) +int sound_init(running_machine *machine) { /* handle -nosound */ nosound_mode = (Machine->sample_rate == 0); @@ -222,9 +222,9 @@ int sound_init(void) /* register callbacks */ config_register("mixer", sound_load, sound_save); - add_pause_callback(sound_pause); - add_reset_callback(sound_reset); - add_exit_callback(sound_exit); + add_pause_callback(machine, sound_pause); + add_reset_callback(machine, sound_reset); + add_exit_callback(machine, sound_exit); return 0; } @@ -234,7 +234,7 @@ int sound_init(void) sound_exit - clean up after ourselves -------------------------------------------------*/ -static void sound_exit(void) +static void sound_exit(running_machine *machine) { int sndnum; @@ -523,7 +523,7 @@ static int route_sound(void) sound_reset - reset all sound chips -------------------------------------------------*/ -static void sound_reset(void) +static void sound_reset(running_machine *machine) { int sndnum; @@ -538,7 +538,7 @@ static void sound_reset(void) sound_pause - pause sound output -------------------------------------------------*/ -static void sound_pause(int pause) +static void sound_pause(running_machine *machine, int pause) { osd_sound_enable(!pause); } @@ -650,7 +650,7 @@ void sound_frame_update(void) memset(rightmix, 0, samples_this_frame * sizeof(*rightmix)); /* if we're not paused, keep the sounds going */ - if (!mame_is_paused()) + if (!mame_is_paused(Machine)) { /* force all the speaker streams to generate the proper number of samples */ for (spknum = 0; spknum < totalspeakers; spknum++) @@ -724,7 +724,7 @@ void sound_frame_update(void) finalmix[sample*2+1] = samp; } - if (wavfile && !mame_is_paused()) + if (wavfile && !mame_is_paused(Machine)) wav_add_data_16(wavfile, finalmix, samples_this_frame * 2); /* play the result */ diff --git a/src/sound.h b/src/sound.h index 92371476a..2740bde0c 100644 --- a/src/sound.h +++ b/src/sound.h @@ -66,7 +66,7 @@ struct _speaker_config ***************************************************************************/ /* core interfaces */ -int sound_init(void); +int sound_init(running_machine *machine); void sound_frame_update(void); int sound_scalebufferpos(int value); diff --git a/src/sound/3812intf.c b/src/sound/3812intf.c index b45270a93..49aff2193 100644 --- a/src/sound/3812intf.c +++ b/src/sound/3812intf.c @@ -92,7 +92,7 @@ static void *ym3812_start(int sndindex, int clock, const void *config) rate = clock/72; /* stream system initialize */ - info->chip = YM3812Init(clock,rate); + info->chip = YM3812Init(sndindex,clock,rate); if (!info->chip) return NULL; @@ -263,7 +263,7 @@ static void *ym3526_start(int sndindex, int clock, const void *config) rate = clock/72; /* stream system initialize */ - info->chip = YM3526Init(clock,rate); + info->chip = YM3526Init(sndindex,clock,rate); if (!info->chip) return NULL; @@ -461,7 +461,7 @@ static void *y8950_start(int sndindex, int clock, const void *config) rate = clock/72; /* stream system initialize */ - info->chip = Y8950Init(clock,rate); + info->chip = Y8950Init(sndindex,clock,rate); if (!info->chip) return NULL; diff --git a/src/sound/dac.c b/src/sound/dac.c index 1cadb972d..007018a17 100644 --- a/src/sound/dac.c +++ b/src/sound/dac.c @@ -10,10 +10,10 @@ struct dac_info { - sound_stream *channel; - int output; - int UnsignedVolTable[256]; - int SignedVolTable[256]; + sound_stream *channel; + INT16 output; + INT16 UnsignedVolTable[256]; + INT16 SignedVolTable[256]; }; @@ -22,7 +22,7 @@ static void DAC_update(void *param,stream_sample_t **inputs, stream_sample_t **_ { struct dac_info *info = param; stream_sample_t *buffer = _buffer[0]; - int out = info->output; + INT16 out = info->output; while (length--) *(buffer++) = out; } @@ -31,7 +31,7 @@ static void DAC_update(void *param,stream_sample_t **inputs, stream_sample_t **_ void DAC_data_w(int num,UINT8 data) { struct dac_info *info = sndti_token(SOUND_DAC, num); - int out = info->UnsignedVolTable[data]; + INT16 out = info->UnsignedVolTable[data]; if (info->output != out) { @@ -45,7 +45,7 @@ void DAC_data_w(int num,UINT8 data) void DAC_signed_data_w(int num,UINT8 data) { struct dac_info *info = sndti_token(SOUND_DAC, num); - int out = info->SignedVolTable[data]; + INT16 out = info->SignedVolTable[data]; if (info->output != out) { @@ -59,7 +59,7 @@ void DAC_signed_data_w(int num,UINT8 data) void DAC_data_16_w(int num,UINT16 data) { struct dac_info *info = sndti_token(SOUND_DAC, num); - int out = data >> 1; /* range 0..32767 */ + INT16 out = data >> 1; /* range 0..32767 */ if (info->output != out) { @@ -73,7 +73,8 @@ void DAC_data_16_w(int num,UINT16 data) void DAC_signed_data_16_w(int num,UINT16 data) { struct dac_info *info = sndti_token(SOUND_DAC, num); - int out = data - 0x8000; /* range -32768..32767 */ + INT16 out = (INT32)data - (INT32)0x08000; /* range -32768..32767 */ + /* casts avoid potential overflow on some ABIs */ if (info->output != out) { diff --git a/src/sound/es5503.c b/src/sound/es5503.c index e5b0cc8f7..131979c4a 100644 --- a/src/sound/es5503.c +++ b/src/sound/es5503.c @@ -1,9 +1,9 @@ /* - ES5503 - Ensoniq ES5503 "DOC" emulator v0.1 + ES5503 - Ensoniq ES5503 "DOC" emulator v0.2 By R. Belmont. - Copyright (c) 2005 R. Belmont. + Copyright (c) 2005-2006 R. Belmont. This software is dual-licensed: it may be used in MAME and properly licensed MAME derivatives under the terms of the MAME license. For use outside of @@ -25,6 +25,9 @@ cause audible clicks and a general degradation of audio quality if the correct sample data at that point isn't 0x80 or very near it. + Changes: + 0.2 (RB) - improved behavior for volumes > 127, fixes missing notes in Nucleus & missing voices in Thexder + */ #include @@ -44,7 +47,7 @@ typedef struct UINT16 freq; UINT16 wtsize; UINT8 control; - INT8 vol; + UINT8 vol; UINT8 data; UINT32 wavetblpointer; UINT8 wavetblsize; @@ -70,6 +73,8 @@ typedef struct UINT8 irqpending; // irq pending register UINT8 lastirqosc; // last oscillator that caused an IRQ INT8 oscsenabled; // # of oscillators enabled + + UINT32 frames; // frame # } ES5503Chip; static UINT16 wavesizes[8] = { 256, 512, 1024, 2048, 4096, 8192, 16384, 32768 }; @@ -77,6 +82,14 @@ static UINT32 wavemasks[8] = { 0x1ff00, 0x1fe00, 0x1fc00, 0x1f800, 0x1f000, 0x1e static UINT32 accmasks[8] = { 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff }; static int resshifts[8] = { 9, 10, 11, 12, 13, 14, 15, 16 }; +enum +{ + MODE_FREE = 0, + MODE_ONESHOT = 1, + MODE_SYNCAM = 2, + MODE_SWAP = 3 +}; + // halt_osc: handle halting an oscillator // chip = chip # // onum = oscillator # @@ -92,13 +105,14 @@ static void halt_osc(ES5503Chip *chip, int onum, int type) // if 0 found in sample data or mode is not free-run, halt this oscillator if ((type) || (mode > 0)) { +// printf("stopping\n"); pOsc->control |= 1; } // if swap mode, start the partner - if (mode == 3) + if (mode == MODE_SWAP) { -// printf("swap mode, starting partner\n"); +// printf("swap mode, starting partner\n"); pPartner->control &= ~1; // clear the halt bit pPartner->accumulator = 0; // make sure it's at the beginning } @@ -140,24 +154,23 @@ static void es5503_pcm_update(void *param, stream_sample_t **inputs, stream_samp UINT16 wtsize = pOsc->wtsize-1; UINT8 ctrl = pOsc->control; UINT16 freq = pOsc->freq; - INT8 vol = pOsc->vol; + INT16 vol = pOsc->vol; INT8 data = -128; int resshift = resshifts[pOsc->resolution] - pOsc->wavetblsize; - UINT32 resmask = accmasks[pOsc->resolution]; - -// printf("Acc: %08x => %08x\n", acc, (acc>>resshift) & resmask); + UINT32 sizemask = accmasks[pOsc->wavetblsize]; -// printf("Ch [%02d]: wtptr: %04x (wtsize %d, ptr %x)\n", osc, wtptr, pOsc->wavetblsize, pOsc->wavetblpointer); +// printf("Acc: %08x => %08x\n", acc, (acc>>resshift) & sizemask); +// printf("Ch [%02d]: wtptr: %04x (wtsize %d, ptr %x) acc %x shift %d\n", osc, wtptr, pOsc->wavetblsize, pOsc->wavetblpointer, acc, resshift); for (snum = 0; snum < length; snum++) { - ramptr = (acc >> resshift) & resmask; + ramptr = (acc >> resshift) & sizemask; acc += freq; -// printf("[%02d] Acc: %08x Frq: %04x RAMptr: %08x WTsize: %04x (wtsize %d res %d)\n", osc, acc, freq, ramptr, wtsize, pOsc->wavetblsize, pOsc->resolution); +// printf("[%02d] Acc: %08x Frq: %04x RAMptr: %08x WTsize: %04x (wtsize %d res %d)\n", osc, acc, freq, ramptr, wtsize, pOsc->wavetblsize, pOsc->resolution); - data = chip->docram[ramptr + wtptr] ^ 0x80; + data = (INT32)chip->docram[ramptr + wtptr] ^ 0x80; if (pOsc->control & 0x10) { @@ -172,7 +185,7 @@ static void es5503_pcm_update(void *param, stream_sample_t **inputs, stream_samp if (chip->docram[ramptr + wtptr] == 0x00) { -// printf("osc %d hit zero @ %x (mode %d pmode %d)\n", osc, ramptr + wtptr, (pOsc->control>>1)&3, (chip->oscillators[osc^1].control>>1)&3); +// printf("[%d] osc %d hit zero @ %x (mode %d pmode %d)\n", chip->frames, osc, ramptr + wtptr, (pOsc->control>>1)&3, (chip->oscillators[osc^1].control>>1)&3); halt_osc(chip, osc, 1); acc = 0; } @@ -205,6 +218,8 @@ static void es5503_pcm_update(void *param, stream_sample_t **inputs, stream_samp outputs[0][i] = (*mixp++)>>1; outputs[1][i] = (*mixp++)>>1; } + + chip->frames++; } @@ -369,10 +384,10 @@ WRITE8_HANDLER(ES5503_reg_0_w) break; case 0xa0: // oscillator control -// printf("5503: %02x to control for voice %02d\n", data, osc); - // if a fresh key-on, reset the accumulator + // if a fresh key-on, reset the ccumulator if ((chip->oscillators[osc].control & 1) && (!(data&1))) { +// printf("[%d] %02x to control for voice %02d (wtptr %x vol %x wts %d res %d)\n", chip->frames, data, osc, chip->oscillators[osc].wavetblpointer, chip->oscillators[osc].vol, chip->oscillators[osc].wavetblsize, chip->oscillators[osc].resolution); chip->oscillators[osc].accumulator = 0; } chip->oscillators[osc].control = data; @@ -453,9 +468,9 @@ void es5503_get_info(void *token, UINT32 state, sndinfo *info) /* --- the following bits of info are returned as NULL-terminated strings --- */ case SNDINFO_STR_NAME: info->s = "ES5503"; break; case SNDINFO_STR_CORE_FAMILY: info->s = "Ensoniq ES550x"; break; - case SNDINFO_STR_CORE_VERSION: info->s = "0.1"; break; + case SNDINFO_STR_CORE_VERSION: info->s = "0.2"; break; case SNDINFO_STR_CORE_FILE: info->s = __FILE__; break; - case SNDINFO_STR_CORE_CREDITS: info->s = "Copyright (c) 2005 R. Belmont"; break; + case SNDINFO_STR_CORE_CREDITS: info->s = "Copyright (c) 2005-2006 R. Belmont"; break; } } diff --git a/src/sound/fmopl.c b/src/sound/fmopl.c index b3291255c..440a869f8 100644 --- a/src/sound/fmopl.c +++ b/src/sound/fmopl.c @@ -241,7 +241,7 @@ typedef struct{ UINT8 vib; /* LFO Phase Modulation enable flag (active high)*/ /* waveform select */ - unsigned int wavetable; + UINT16 wavetable; } OPL_SLOT; typedef struct{ @@ -281,7 +281,7 @@ typedef struct fm_opl_f { UINT8 wavesel; /* waveform select enable flag */ - int T[2]; /* timer counters */ + UINT32 T[2]; /* timer counters */ UINT8 st[2]; /* timer enable */ #if BUILD_Y8950 @@ -314,8 +314,8 @@ typedef struct fm_opl_f { UINT8 statusmask; /* status mask */ UINT8 mode; /* Reg.08 : CSM,notesel,etc. */ - int clock; /* master clock (Hz) */ - int rate; /* sampling rate (Hz) */ + UINT32 clock; /* master clock (Hz) */ + UINT32 rate; /* sampling rate (Hz) */ double freqbase; /* frequency base */ double TimerBase; /* Timer base time (==sampling time)*/ } FM_OPL; @@ -1819,10 +1819,165 @@ static void OPLResetChip(FM_OPL *OPL) #endif } + +static void OPL_postload(void *param) +{ + FM_OPL *OPL = (FM_OPL *)param; + int slot, ch; + + for( ch=0 ; ch < 9 ; ch++ ) + { + OPL_CH *CH = &OPL->P_CH[ch]; + + /* Look up key scale level */ + UINT32 block_fnum = CH->block_fnum; + CH->ksl_base = ksl_tab[block_fnum >> 6]; + CH->fc = OPL->fn_tab[block_fnum & 0x03ff] >> (7 - (block_fnum >> 10)); + + for( slot=0 ; slot < 2 ; slot++ ) + { + OPL_SLOT *SLOT = &CH->SLOT[slot]; + + /* Calculate key scale rate */ + SLOT->ksr = CH->kcode >> SLOT->KSR; + + /* Calculate attack, decay and release rates */ + if ((SLOT->ar + SLOT->ksr) < 16+62) + { + SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ]; + SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ]; + } + else + { + SLOT->eg_sh_ar = 0; + SLOT->eg_sel_ar = 13*RATE_STEPS; + } + SLOT->eg_sh_dr = eg_rate_shift [SLOT->dr + SLOT->ksr ]; + SLOT->eg_sel_dr = eg_rate_select[SLOT->dr + SLOT->ksr ]; + SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr ]; + SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr ]; + + /* Calculate phase increment */ + SLOT->Incr = CH->fc * SLOT->mul; + + /* Total level */ + SLOT->TLL = SLOT->TL + (CH->ksl_base >> SLOT->ksl); + + /* Connect output */ + SLOT->connect1 = SLOT->CON ? &output[0] : &phase_modulation; + } + } +#if BUILD_Y8950 + if ( (OPL->type & OPL_TYPE_ADPCM) && (OPL->deltat) ) + { + // We really should call the postlod function for the YM_DELTAT, but it's hard without registers + // (see the way the YM2610 does it) + //YM_DELTAT_postload(OPL->deltat, REGS); + } +#endif +} + + +static void OPLsave_state_channel(const char *name, int num, OPL_CH *CH) +{ + int slot, ch; + char state_name[20]; + static const char slot_array[2] = { 1, 2 }; + + for( ch=0 ; ch < 9 ; ch++, CH++ ) + { + /* channel */ + sprintf(state_name, "%s.CH%d", name,ch); + state_save_register_item(state_name, num, CH->block_fnum); + state_save_register_item(state_name, num, CH->kcode); + /* slots */ + for( slot=0 ; slot < 2 ; slot++ ) + { + OPL_SLOT *SLOT = &CH->SLOT[slot]; + + sprintf(state_name, "%s.CH%d.SLOT%d", name, ch, slot_array[slot]); + + state_save_register_item(state_name, num, SLOT->ar); + state_save_register_item(state_name, num, SLOT->dr); + state_save_register_item(state_name, num, SLOT->rr); + state_save_register_item(state_name, num, SLOT->KSR); + state_save_register_item(state_name, num, SLOT->ksl); + state_save_register_item(state_name, num, SLOT->mul); + + state_save_register_item(state_name, num, SLOT->Cnt); + state_save_register_item(state_name, num, SLOT->FB); + state_save_register_item_array(state_name, num, SLOT->op1_out); + state_save_register_item(state_name, num, SLOT->CON); + + state_save_register_item(state_name, num, SLOT->eg_type); + state_save_register_item(state_name, num, SLOT->state); + state_save_register_item(state_name, num, SLOT->TL); + state_save_register_item(state_name, num, SLOT->volume); + state_save_register_item(state_name, num, SLOT->sl); + state_save_register_item(state_name, num, SLOT->key); + + state_save_register_item(state_name, num, SLOT->AMmask); + state_save_register_item(state_name, num, SLOT->vib); + + state_save_register_item(state_name, num, SLOT->wavetable); + } + } +} + + +/* Register savestate for a virtual YM3812/YM3526Y8950 */ + +static void OPL_save_state(FM_OPL *OPL, const char *statename, int index) +{ + OPLsave_state_channel(statename, index, OPL->P_CH); + + state_save_register_item(statename, index, OPL->eg_cnt); + state_save_register_item(statename, index, OPL->eg_timer); + + state_save_register_item(statename, index, OPL->rhythm); + + state_save_register_item(statename, index, OPL->lfo_am_depth); + state_save_register_item(statename, index, OPL->lfo_pm_depth_range); + state_save_register_item(statename, index, OPL->lfo_am_cnt); + state_save_register_item(statename, index, OPL->lfo_pm_cnt); + + state_save_register_item(statename, index, OPL->noise_rng); + state_save_register_item(statename, index, OPL->noise_p); + + if( OPL->type & OPL_TYPE_WAVESEL ) + { + state_save_register_item(statename, index, OPL->wavesel); + } + + state_save_register_item_array(statename, index, OPL->T); + state_save_register_item_array(statename, index, OPL->st); + +#if BUILD_Y8950 + if ( (OPL->type & OPL_TYPE_ADPCM) && (OPL->deltat) ) + { + YM_DELTAT_savestate(statename, index, OPL->deltat); + } + + if ( OPL->type & OPL_TYPE_IO ) + { + state_save_register_item(statename, index, OPL->portDirection); + state_save_register_item(statename, index, OPL->portLatch); + } +#endif + + state_save_register_item(statename, index, OPL->address); + state_save_register_item(statename, index, OPL->status); + state_save_register_item(statename, index, OPL->statusmask); + state_save_register_item(statename, index, OPL->mode); + + state_save_register_func_postload_ptr(OPL_postload, OPL); +} + + /* Create one of virtual YM3812/YM3526/Y8950 */ /* 'clock' is chip clock in Hz */ /* 'rate' is sampling rate */ -static FM_OPL *OPLCreate(int type, int clock, int rate) +static FM_OPL *OPLCreate(int type, UINT32 clock, UINT32 rate) { char *ptr; FM_OPL *OPL; @@ -2015,12 +2170,15 @@ static int OPLTimerOver(FM_OPL *OPL,int c) #if (BUILD_YM3812) -void * YM3812Init(int clock, int rate) +void * YM3812Init(int sndindex, UINT32 clock, UINT32 rate) { /* emulator create */ FM_OPL *YM3812 = OPLCreate(OPL_TYPE_YM3812,clock,rate); if (YM3812) + { + OPL_save_state(YM3812, "YM3812", sndindex); YM3812ResetChip(YM3812); + } return YM3812; } @@ -2148,12 +2306,15 @@ void YM3812UpdateOne(void *chip, OPLSAMPLE *buffer, int length) #if (BUILD_YM3526) -void *YM3526Init(int clock, int rate) +void *YM3526Init(int sndindex, UINT32 clock, UINT32 rate) { /* emulator create */ FM_OPL *YM3526 = OPLCreate(OPL_TYPE_YM3526,clock,rate); if (YM3526) + { + OPL_save_state(YM3526, "YM3526", sndindex); YM3526ResetChip(YM3526); + } return YM3526; } @@ -2292,7 +2453,7 @@ static void Y8950_deltat_status_reset(void *chip, UINT8 changebits) OPL_STATUS_RESET(Y8950, changebits); } -void *Y8950Init(int clock, int rate) +void *Y8950Init(int sndindex, UINT32 clock, UINT32 rate) { /* emulator create */ FM_OPL *Y8950 = OPLCreate(OPL_TYPE_Y8950,clock,rate); @@ -2307,6 +2468,7 @@ void *Y8950Init(int clock, int rate) /*Y8950->deltat->write_time = 10.0 / clock;*/ /* a single byte write takes 10 cycles of main clock */ /*Y8950->deltat->read_time = 8.0 / clock;*/ /* a single byte read takes 8 cycles of main clock */ /* reset */ + OPL_save_state(Y8950, "Y8950", sndindex); Y8950ResetChip(Y8950); } diff --git a/src/sound/fmopl.h b/src/sound/fmopl.h index 5cc774503..d7190b98e 100644 --- a/src/sound/fmopl.h +++ b/src/sound/fmopl.h @@ -39,7 +39,7 @@ typedef unsigned char (*OPL_PORTHANDLER_R)(void *param); #if BUILD_YM3812 -void *YM3812Init(int clock, int rate); +void *YM3812Init(int sndindex, UINT32 clock, UINT32 rate); void YM3812Shutdown(void *chip); void YM3812ResetChip(void *chip); int YM3812Write(void *chip, int a, int v); @@ -63,7 +63,7 @@ void YM3812SetUpdateHandler(void *chip, OPL_UPDATEHANDLER UpdateHandler, void *p ** 'clock' is the chip clock in Hz ** 'rate' is sampling rate */ -void *YM3526Init(int clock, int rate); +void *YM3526Init(int sndindex, UINT32 clock, UINT32 rate); /* shutdown the YM3526 emulators*/ void YM3526Shutdown(void *chip); void YM3526ResetChip(void *chip); @@ -93,7 +93,7 @@ void Y8950SetPortHandler(void *chip, OPL_PORTHANDLER_W PortHandler_w, OPL_PORTHA void Y8950SetKeyboardHandler(void *chip, OPL_PORTHANDLER_W KeyboardHandler_w, OPL_PORTHANDLER_R KeyboardHandler_r, void *param); void Y8950SetDeltaTMemory(void *chip, void * deltat_mem_ptr, int deltat_mem_size ); -void * Y8950Init (int clock, int rate); +void * Y8950Init (int sndindex, UINT32 clock, UINT32 rate); void Y8950Shutdown (void *chip); void Y8950ResetChip (void *chip); int Y8950Write (void *chip, int a, int v); diff --git a/src/sound/scsp.c b/src/sound/scsp.c index 1fb42e09a..dd3d4b889 100644 --- a/src/sound/scsp.c +++ b/src/sound/scsp.c @@ -233,6 +233,15 @@ static unsigned char DecodeSCI(struct _SCSP *SCSP,unsigned char irq) return SCI; } +static void ResetInterrupts(struct _SCSP *SCSP) +{ + UINT32 reset = SCSP->udata.data[0x22/2]; + if (reset & 0x40) + SCSP->Int68kCB(-SCSP->IrqTimA); + if (reset & 0xc0) + SCSP->Int68kCB(-SCSP->IrqTimBC); +} + static void CheckPendingIRQ(struct _SCSP *SCSP) { UINT32 pend=SCSP->udata.data[0x20/2]; @@ -615,7 +624,7 @@ static void SCSP_UpdateReg(struct _SCSP *SCSP, int reg) if(SCSP->Master) { SCSP->udata.data[0x20/2]&=~SCSP->udata.data[0x22/2]; - CheckPendingIRQ(SCSP); + ResetInterrupts(SCSP); } break; case 0x24: diff --git a/src/sound/sound.mak b/src/sound/sound.mak index 2146c8033..a086f2654 100644 --- a/src/sound/sound.mak +++ b/src/sound/sound.mak @@ -33,6 +33,7 @@ endif SOUNDDEFS += -DHAS_DAC=$(if $(filter DAC,$(SOUNDS)),1,0) SOUNDDEFS += -DHAS_DMADAC=$(if $(filter DMADAC,$(SOUNDS)),1,0) +SOUNDDEFS += -DHAS_SPEAKER=$(if $(filter SPEAKER,$(SOUNDS)),1,0) ifneq ($(filter DAC,$(SOUNDS)),) SOUNDOBJS += $(OBJ)/sound/dac.o @@ -42,6 +43,10 @@ ifneq ($(filter DMADAC,$(SOUNDS)),) SOUNDOBJS += $(OBJ)/sound/dmadac.o endif +ifneq ($(filter SPEAKER,$(SOUNDS)),) +SOUNDOBJS += $(OBJ)/sound/speaker.o +endif + #------------------------------------------------- diff --git a/mess/sound/speaker.c b/src/sound/speaker.c similarity index 96% rename from mess/sound/speaker.c rename to src/sound/speaker.c index 00e72503d..104e27d5d 100644 --- a/mess/sound/speaker.c +++ b/src/sound/speaker.c @@ -1,9 +1,9 @@ /*************************************************************************** - speaker.c + speaker.c - Sound driver to emulate a simple speaker, - driven by one or more output bits + Sound driver to emulate a simple speaker, + driven by one or more output bits ****************************************************************************/ diff --git a/mess/sound/speaker.h b/src/sound/speaker.h similarity index 100% rename from mess/sound/speaker.h rename to src/sound/speaker.h diff --git a/src/sound/upd7759.c b/src/sound/upd7759.c index ffa5b6f4f..053fee7b5 100644 --- a/src/sound/upd7759.c +++ b/src/sound/upd7759.c @@ -164,12 +164,12 @@ struct upd7759_chip void (*drqcallback)(int param); /* drq callback */ /* internal state machine */ - int state; /* current overall chip state */ - int clocks_left; /* number of clocks left in this state */ - int nibbles_left; /* number of ADPCM nibbles left to process */ - int repeat_count; /* number of repeats remaining in current repeat block */ - int post_drq_state; /* state we will be in after the DRQ line is dropped */ - int post_drq_clocks; /* clocks that will be left after the DRQ line is dropped */ + INT8 state; /* current overall chip state */ + INT32 clocks_left; /* number of clocks left in this state */ + UINT16 nibbles_left; /* number of ADPCM nibbles left to process */ + UINT8 repeat_count; /* number of repeats remaining in current repeat block */ + INT8 post_drq_state; /* state we will be in after the DRQ line is dropped */ + INT32 post_drq_clocks; /* clocks that will be left after the DRQ line is dropped */ UINT8 req_sample; /* requested sample number */ UINT8 last_sample; /* last sample number available */ UINT8 block_header; /* header byte */ @@ -186,6 +186,7 @@ struct upd7759_chip /* ROM access */ UINT8 * rom; /* pointer to ROM data or NULL for slave mode */ UINT8 * rombase; /* pointer to ROM data or NULL for slave mode */ + UINT32 romoffset; /* ROM offset to make save/restore easier */ }; @@ -404,7 +405,7 @@ static void advance_state(struct upd7759_chip *chip) /* The expected response will be the first data byte */ case STATE_NIBBLE_COUNT: chip->nibbles_left = (chip->rom ? chip->rom[chip->offset++ & 0x1ffff] : chip->fifo_in) + 1; - if (DEBUG_STATES) DEBUG_METHOD("UPD7759: nibble_count = %d, requesting next byte\n", chip->nibbles_left); + if (DEBUG_STATES) DEBUG_METHOD("UPD7759: nibble_count = %u, requesting next byte\n", (unsigned)chip->nibbles_left); chip->drq = 1; /* 36?? cycles later, we will latch this value and request another byte */ @@ -578,6 +579,47 @@ static void upd7759_reset(struct upd7759_chip *chip) } +static void upd7759_postload(void *param) +{ + struct upd7759_chip *chip = (struct upd7759_chip *)param; + chip->rom = chip->rombase + chip->romoffset; +} + + +static void register_for_save(struct upd7759_chip *chip, int index) +{ + state_save_register_item("upd7759", index, chip->pos); + state_save_register_item("upd7759", index, chip->step); + state_save_register_item("upd7759", index, chip->clock_period); + + state_save_register_item("upd7759", index, chip->fifo_in); + state_save_register_item("upd7759", index, chip->reset); + state_save_register_item("upd7759", index, chip->start); + state_save_register_item("upd7759", index, chip->drq); + + state_save_register_item("upd7759", index, chip->state); + state_save_register_item("upd7759", index, chip->clocks_left); + state_save_register_item("upd7759", index, chip->nibbles_left); + state_save_register_item("upd7759", index, chip->repeat_count); + state_save_register_item("upd7759", index, chip->post_drq_state); + state_save_register_item("upd7759", index, chip->post_drq_clocks); + state_save_register_item("upd7759", index, chip->req_sample); + state_save_register_item("upd7759", index, chip->last_sample); + state_save_register_item("upd7759", index, chip->block_header); + state_save_register_item("upd7759", index, chip->sample_rate); + state_save_register_item("upd7759", index, chip->first_valid_header); + state_save_register_item("upd7759", index, chip->offset); + state_save_register_item("upd7759", index, chip->repeat_offset); + + state_save_register_item("upd7759", index, chip->adpcm_state); + state_save_register_item("upd7759", index, chip->adpcm_data); + state_save_register_item("upd7759", index, chip->sample); + + state_save_register_item("upd7759", index, chip->romoffset); + state_save_register_func_postload_ptr(upd7759_postload, chip); +} + + static void *upd7759_start(int sndindex, int clock, const void *config) { const struct upd7759_interface *intf = config; @@ -614,6 +656,8 @@ static void *upd7759_start(int sndindex, int clock, const void *config) /* toggle the reset line to finish the reset */ upd7759_reset(chip); + register_for_save(chip, sndindex); + return chip; } @@ -684,6 +728,7 @@ void upd7759_set_bank_base(int which, UINT32 base) { struct upd7759_chip *chip = sndti_token(SOUND_UPD7759, which); chip->rom = chip->rombase + base; + chip->romoffset = base; } diff --git a/src/state.c b/src/state.c index 3586108f6..85171c936 100644 --- a/src/state.c +++ b/src/state.c @@ -149,7 +149,7 @@ static void (*ss_conv[])(UINT8 *, UINT32) = { 0, 0, ss_c2, 0, ss_c4, 0, 0, 0, ss all registrations -------------------------------------------------*/ -void state_init(void) +void state_init(running_machine *machine) { ss_illegal_regs = 0; ss_current_tag = 0; diff --git a/src/state.h b/src/state.h index 9ecb3052f..7ccdc428e 100644 --- a/src/state.h +++ b/src/state.h @@ -72,7 +72,7 @@ do { \ FUNCTION PROTOTYPES ***************************************************************************/ -void state_init(void); +void state_init(running_machine *machine); /* Initializes the save state registrations */ void state_save_free(void); diff --git a/src/streams.c b/src/streams.c index 9f11d76ca..01da10e2d 100644 --- a/src/streams.c +++ b/src/streams.c @@ -598,6 +598,13 @@ static void stream_generate_samples(sound_stream *stream, int samples) /* okay, all the inputs are up-to-date ... call the callback */ VPRINTF((" callback(%p, %d)\n", stream, samples)); + + /* aye, a bug is lurking here; sometimes we have extreme sample counts */ + if (samples > stream->sample_rate) + { + logerror("samples > sample rate?! %d %d\n", samples, stream->sample_rate); + samples = stream->sample_rate; + } (*stream->callback)(stream->param, stream->input_array, stream->output_array, samples); VPRINTF((" callback done\n")); } diff --git a/src/tilemap.c b/src/tilemap.c index 1b9983ddd..e8d274379 100644 --- a/src/tilemap.c +++ b/src/tilemap.c @@ -755,7 +755,7 @@ INLINE tilemap_draw_func pick_draw_func( mame_bitmap *dest ) /***********************************************************************************/ -int tilemap_init( void ) +int tilemap_init( running_machine *machine ) { screen_width = Machine->screen[0].width; screen_height = Machine->screen[0].height; @@ -765,13 +765,13 @@ int tilemap_init( void ) if( priority_bitmap ) { priority_bitmap_pitch_line = ((UINT8 *)priority_bitmap->line[1]) - ((UINT8 *)priority_bitmap->line[0]); - add_exit_callback(tilemap_exit); + add_exit_callback(machine, tilemap_exit); return 0; } return -1; } -void tilemap_exit( void ) +void tilemap_exit( running_machine *machine ) { tilemap *next; diff --git a/src/tilemap.h b/src/tilemap.h index 0318f3d91..bc814d15c 100644 --- a/src/tilemap.h +++ b/src/tilemap.h @@ -110,8 +110,8 @@ extern tile_data tile_info; extern mame_bitmap *priority_bitmap; /* don't call these from drivers - they are called from mame.c */ -int tilemap_init( void ); -void tilemap_exit( void ); +int tilemap_init( running_machine *machine ); +void tilemap_exit( running_machine *machine ); tilemap *tilemap_create( void (*tile_get_info)( int memory_offset ), diff --git a/src/timer.c b/src/timer.c index aef5050f2..54d606e7b 100644 --- a/src/timer.c +++ b/src/timer.c @@ -114,15 +114,15 @@ INLINE mame_time get_current_time(void) { int activecpu; + /* if we're currently in a callback, use the timer's expiration time as a base */ + if (callback_timer != NULL) + return callback_timer_expire_time; + /* if we're executing as a particular CPU, use its local time as a base */ activecpu = cpu_getactivecpu(); if (activecpu >= 0) return cpunum_get_localtime(activecpu); - /* if we're currently in a callback, use the timer's expiration time as a base */ - if (callback_timer) - return callback_timer_expire_time; - /* otherwise, return the current global base time */ return global_basetime; } @@ -245,7 +245,7 @@ INLINE void timer_list_remove(mame_timer *timer) timer_init - initialize the timer system -------------------------------------------------*/ -void timer_init(void) +void timer_init(running_machine *machine) { int i; diff --git a/src/timer.h b/src/timer.h index 5dcf68b1d..a07b04d3b 100644 --- a/src/timer.h +++ b/src/timer.h @@ -126,7 +126,7 @@ extern double sec_to_cycles[]; FUNCTION PROTOTYPES ***************************************************************************/ -void timer_init(void); +void timer_init(running_machine *machine); void timer_free(void); int timer_count_anonymous(void); diff --git a/src/ui.c b/src/ui.c index ccfa9fb7d..b841b0079 100644 --- a/src/ui.c +++ b/src/ui.c @@ -113,13 +113,17 @@ static slider_state slider_list[100]; static int slider_count; static int slider_current; +static int display_rescale_message; +static int allow_rescale; + /*************************************************************************** FUNCTION PROTOTYPES ***************************************************************************/ -static void ui_exit(void); +static void ui_exit(running_machine *machine); +static int rescale_notifier(running_machine *machine, int width, int height); /* text generators */ static int sprintf_disclaimer(char *buffer); @@ -195,10 +199,10 @@ INLINE void slider_config(slider_state *state, INT32 minval, INT32 defval, INT32 ui_init - set up the user interface -------------------------------------------------*/ -int ui_init(void) +int ui_init(running_machine *machine) { /* make sure we clean up after ourselves */ - add_exit_callback(ui_exit); + add_exit_callback(machine, ui_exit); /* load the localization file */ if (uistring_init(options.language_file) != 0) @@ -208,12 +212,17 @@ int ui_init(void) ui_font = render_font_alloc("ui.bdf"); /* initialize the other UI bits */ - ui_menu_init(); - ui_gfx_init(); + ui_menu_init(machine); + ui_gfx_init(machine); /* reset globals */ single_step = FALSE; ui_set_handler(handler_messagebox, 0); + + /* request callbacks when the renderer does resizing */ + render_set_rescale_notify(machine, rescale_notifier); + allow_rescale = 0; + display_rescale_message = FALSE; return 0; } @@ -222,7 +231,7 @@ int ui_init(void) ui_exit - clean up ourselves on exit -------------------------------------------------*/ -static void ui_exit(void) +static void ui_exit(running_machine *machine) { /* free the font */ if (ui_font != NULL) @@ -231,6 +240,26 @@ static void ui_exit(void) } +/*------------------------------------------------- + rescale_notifier - notifier to trigger a + rescale message during long operations +-------------------------------------------------*/ + +static int rescale_notifier(running_machine *machine, int width, int height) +{ + /* always allow "small" rescaling */ + if (width < 500 || height < 500) + return TRUE; + + /* if we've currently disallowed rescaling, turn on a message next frame */ + if (allow_rescale == 0) + display_rescale_message = TRUE; + + /* only allow rescaling once we're sure the message is visible */ + return (allow_rescale == 1); +} + + /*------------------------------------------------- ui_display_startup_screens - display the various startup screens @@ -250,7 +279,7 @@ int ui_display_startup_screens(int show_disclaimer, int show_warnings, int show_ /* loop over states */ ui_set_handler(handler_ingame, 0); - for (state = 0; state < maxstate && !mame_is_scheduled_event_pending(); state++) + for (state = 0; state < maxstate && !mame_is_scheduled_event_pending(Machine); state++) { /* default to standard colors */ messagebox_backcolor = UI_FILLCOLOR; @@ -286,7 +315,7 @@ int ui_display_startup_screens(int show_disclaimer, int show_warnings, int show_ while (code_read_async() != CODE_NONE) ; /* loop while we have a handler */ - while (ui_handler_callback != handler_ingame && !mame_is_scheduled_event_pending()) + while (ui_handler_callback != handler_ingame && !mame_is_scheduled_event_pending(Machine)) video_frame_update(); /* clear the handler and force an update */ @@ -331,7 +360,7 @@ void ui_update_and_render(void) render_container_empty(render_container_get_ui()); /* if we're paused, dim the whole screen */ - if (mame_get_phase() >= MAME_PHASE_RESET && (single_step || mame_is_paused())) + if (mame_get_phase(Machine) >= MAME_PHASE_RESET && (single_step || mame_is_paused(Machine))) { int alpha = (1.0f - options.pause_bright) * 255.0f; if (alpha > 255) @@ -369,6 +398,19 @@ void ui_update_and_render(void) else popup_text_end = 0; + /* add a message if we are rescaling */ + if (display_rescale_message) + { + display_rescale_message = FALSE; + if (allow_rescale == 0) + allow_rescale = 2; + ui_draw_text_box("Updating Artwork...", JUSTIFY_CENTER, 0.5f, 0.5f, messagebox_backcolor); + } + + /* decrement the frame counter if it is non-zero */ + else if (allow_rescale != 0) + allow_rescale--; + #ifdef MESS /* let MESS display its stuff */ mess_ui_update(); @@ -1005,7 +1047,7 @@ static UINT32 handler_messagebox_ok(UINT32 state) /* if the user cancels, exit out completely */ else if (input_ui_pressed(IPT_UI_CANCEL)) { - mame_schedule_exit(); + mame_schedule_exit(Machine); state = UI_HANDLER_CANCEL; } @@ -1027,7 +1069,7 @@ static UINT32 handler_messagebox_anykey(UINT32 state) /* if the user cancels, exit out completely */ if (input_ui_pressed(IPT_UI_CANCEL)) { - mame_schedule_exit(); + mame_schedule_exit(Machine); state = UI_HANDLER_CANCEL; } @@ -1046,12 +1088,12 @@ static UINT32 handler_messagebox_anykey(UINT32 state) static UINT32 handler_ingame(UINT32 state) { - int is_paused = mame_is_paused(); + int is_paused = mame_is_paused(Machine); /* if we're single-stepping, pause now */ if (single_step) { - mame_pause(TRUE); + mame_pause(Machine, TRUE); single_step = FALSE; } @@ -1062,7 +1104,7 @@ static UINT32 handler_ingame(UINT32 state) /* if the user pressed ESC, stop the emulation */ if (input_ui_pressed(IPT_UI_CANCEL)) - mame_schedule_exit(); + mame_schedule_exit(Machine); /* turn on menus if requested */ if (input_ui_pressed(IPT_UI_CONFIGURE)) @@ -1077,29 +1119,29 @@ static UINT32 handler_ingame(UINT32 state) /* handle a reset request */ if (input_ui_pressed(IPT_UI_RESET_MACHINE)) - mame_schedule_hard_reset(); + mame_schedule_hard_reset(Machine); if (input_ui_pressed(IPT_UI_SOFT_RESET)) - mame_schedule_soft_reset(); + mame_schedule_soft_reset(Machine); /* handle a request to display graphics/palette */ if (input_ui_pressed(IPT_UI_SHOW_GFX)) { if (!is_paused) - mame_pause(TRUE); + mame_pause(Machine, TRUE); return ui_set_handler(ui_gfx_ui_handler, is_paused); } /* handle a save state request */ if (input_ui_pressed(IPT_UI_SAVE_STATE)) { - mame_pause(TRUE); + mame_pause(Machine, TRUE); return ui_set_handler(handler_load_save, LOADSAVE_SAVE); } /* handle a load state request */ if (input_ui_pressed(IPT_UI_LOAD_STATE)) { - mame_pause(TRUE); + mame_pause(Machine, TRUE); return ui_set_handler(handler_load_save, LOADSAVE_LOAD); } @@ -1114,10 +1156,10 @@ static UINT32 handler_ingame(UINT32 state) if (is_paused && (code_pressed(KEYCODE_LSHIFT) || code_pressed(KEYCODE_RSHIFT))) { single_step = TRUE; - mame_pause(FALSE); + mame_pause(Machine, FALSE); } else - mame_pause(!mame_is_paused()); + mame_pause(Machine, !mame_is_paused(Machine)); } /* toggle movie recording */ @@ -1247,7 +1289,7 @@ static UINT32 handler_load_save(UINT32 state) popmessage("Load cancelled"); /* reset the state */ - mame_pause(FALSE); + mame_pause(Machine, FALSE); return UI_HANDLER_CANCEL; } @@ -1271,16 +1313,16 @@ static UINT32 handler_load_save(UINT32 state) if (state == LOADSAVE_SAVE) { popmessage("Save to position %c", file); - mame_schedule_save(filename); + mame_schedule_save(Machine, filename); } else { popmessage("Load from position %c", file); - mame_schedule_load(filename); + mame_schedule_load(Machine, filename); } /* remove the pause and reset the state */ - mame_pause(FALSE); + mame_pause(Machine, FALSE); return UI_HANDLER_CANCEL; } diff --git a/src/ui.h b/src/ui.h index 85dd489dd..02b025b1a 100644 --- a/src/ui.h +++ b/src/ui.h @@ -79,7 +79,7 @@ enum ***************************************************************************/ /* main init/exit routines */ -int ui_init(void); +int ui_init(running_machine *machine); /* display the startup screens */ int ui_display_startup_screens(int show_disclaimer, int show_warnings, int show_gameinfo); diff --git a/src/ui/mame32.rc b/src/ui/mame32.rc index 36ad01d67..ee45e36ee 100644 --- a/src/ui/mame32.rc +++ b/src/ui/mame32.rc @@ -290,8 +290,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,108,0,0 - PRODUCTVERSION 0,108,0,0 + FILEVERSION 0,109,0,0 + PRODUCTVERSION 0,109,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -317,7 +317,7 @@ BEGIN VALUE "CompanyName", "MAME Team" VALUE "FileDescription", "Multiple Arcade Machine Emulator for Win32" #endif - VALUE "FileVersion", "0, 108, 0, 0" + VALUE "FileVersion", "0, 109, 0, 0" VALUE "InternalName", "MAME32" VALUE "LegalCopyright", "Copyright 1997-2006 Nicola Salmoria and the MAME team" #ifdef MESS @@ -327,7 +327,7 @@ BEGIN VALUE "OriginalFilename", "MAME32.exe" VALUE "ProductName", "MAME32" #endif - VALUE "ProductVersion", "0, 108, 0, 0" + VALUE "ProductVersion", "0, 109, 0, 0" END END BLOCK "VarFileInfo" diff --git a/src/ui/options.c b/src/ui/options.c index 5c8759571..a2f465c2c 100644 --- a/src/ui/options.c +++ b/src/ui/options.c @@ -391,8 +391,9 @@ static const REG_OPTION regGameOpts[] = { "bios", RO_STRING, offsetof(options_type, bios), "default" }, #ifdef MESS { "autosave", RO_BOOL, offsetof(options_type, autosave), "0" }, -#endif +#else { "autosave", RO_BOOL, offsetof(options_type, autosave), "1" }, +#endif #ifdef MESS /* mess options */ @@ -501,7 +502,7 @@ BOOL OptionsInit() #endif /* MAME_DEBUG */ num_games = GetNumGames(); - code_init(); + code_init(NULL); // Load all default settings LoadDefaultOptions(&settings, regSettings); LoadDefaultOptions(&settings, global_game_options); diff --git a/src/ui/picker.c b/src/ui/picker.c index 771cb078f..d1e5a20b4 100644 --- a/src/ui/picker.c +++ b/src/ui/picker.c @@ -427,7 +427,7 @@ void Picker_ResetColumnDisplay(HWND hWnd) -static void Picker_ClearIdle(HWND hwndPicker) +void Picker_ClearIdle(HWND hwndPicker) { struct PickerInfo *pPickerInfo; diff --git a/src/ui/picker.h b/src/ui/picker.h index 4ea06adbd..d76bc6511 100644 --- a/src/ui/picker.h +++ b/src/ui/picker.h @@ -77,6 +77,7 @@ int Picker_GetSelectedItem(HWND hwndPicker); void Picker_SetSelectedItem(HWND hwndPicker, int nItem); void Picker_SetSelectedPick(HWND hwndPicker, int nIndex); int Picker_GetNumColumns(HWND hWnd); +void Picker_ClearIdle(HWND hwndPicker); void Picker_ResetIdle(HWND hwndPicker); BOOL Picker_IsIdling(HWND hwndPicker); void Picker_SetHeaderImageList(HWND hwndPicker, HIMAGELIST hHeaderImages); diff --git a/src/ui/properties.c b/src/ui/properties.c index 653d17bf3..59d9d91c6 100644 --- a/src/ui/properties.c +++ b/src/ui/properties.c @@ -654,7 +654,7 @@ static char *GameInfoCPU(UINT nIndex) ZeroMemory(buf, sizeof(buf)); - cpuintrf_init(); + cpuintrf_init(NULL); i = 0; while (i < MAX_CPU && drv.cpu[i].cpu_type) diff --git a/src/ui/screenshot.c b/src/ui/screenshot.c index 4cc33edc1..f360391cb 100644 --- a/src/ui/screenshot.c +++ b/src/ui/screenshot.c @@ -402,7 +402,7 @@ static int png_read_bitmap(LPVOID mfile, HGLOBAL *phDIB, HPALETTE *pPAL) UINT32 i; int bytespp; - if (!png_read_file(mfile, &p)) + if (png_read_file(mfile, &p) != PNGERR_NONE) return 0; if (p.color_type != 3 && p.color_type != 2) diff --git a/src/ui/treeview.c b/src/ui/treeview.c index 1bc61a59e..664787e90 100644 --- a/src/ui/treeview.c +++ b/src/ui/treeview.c @@ -856,7 +856,7 @@ void CreateCPUFolders(int parent_index) LPTREEFOLDER map[CPU_COUNT]; ZeroMemory(map, sizeof(map)); - cpuintrf_init(); + cpuintrf_init(NULL); // no games in top level folder SetAllBits(lpFolder->m_lpGameBits,FALSE); @@ -913,7 +913,7 @@ void CreateSoundFolders(int parent_index) LPTREEFOLDER lpFolder = treeFolders[parent_index]; LPTREEFOLDER map[SOUND_COUNT]; - sndintrf_init(); + sndintrf_init(NULL); // no games in top level folder SetAllBits(lpFolder->m_lpGameBits,FALSE); diff --git a/src/ui/win32ui.c b/src/ui/win32ui.c index 7d701eb6f..34b15f42d 100644 --- a/src/ui/win32ui.c +++ b/src/ui/win32ui.c @@ -645,6 +645,14 @@ static int CommandToString[] = -1 }; +static const int s_nPickers[] = +{ + IDC_LIST +#ifdef MESS + ,IDC_SWLIST +#endif +}; + /* How to resize main window */ static ResizeItem main_resize_items[] = { @@ -1090,8 +1098,9 @@ static DWORD RunMAME(int nGameIndex) char pCmdLine[2048]; HWND hGameWnd = NULL; long lGameWndStyle = 0; - int UIPriority = GetThreadPriority(GetCurrentThread()); - //Save the Priority + int UIPriority = GetThreadPriority(GetCurrentThread()); //Save the Priority + BOOL bPickerIdling[sizeof(s_nPickers) / sizeof(s_nPickers[0])]; + int i; #ifdef MESS SaveGameOptions(nGameIndex); @@ -1135,6 +1144,15 @@ static DWORD RunMAME(int nGameIndex) } time(&start); + // Save idling info + for (i = 0; i < sizeof(s_nPickers) / sizeof(s_nPickers[0]); i++) + { + HWND hwndPicker = GetDlgItem(hMain, s_nPickers[i]); + bPickerIdling[i] = Picker_IsIdling(hwndPicker); + if (bPickerIdling[i]) + Picker_ClearIdle(hwndPicker); + } + // Wait until child process exits. WaitWithMessageLoop(pi.hProcess); @@ -1156,6 +1174,14 @@ static DWORD RunMAME(int nGameIndex) CloseHandle(pi.hProcess); CloseHandle(pi.hThread); + // Restore idling, if necessary + for (i = 0; i < sizeof(s_nPickers) / sizeof(s_nPickers[0]); i++) + { + HWND hwndPicker = GetDlgItem(hMain, s_nPickers[i]); + if (bPickerIdling[i]) + Picker_ResetIdle(hwndPicker); + } + #ifdef MESS LoadGameOptions(nGameIndex); MessReadMountedSoftware(nGameIndex); @@ -1822,7 +1848,8 @@ static BOOL Win32UI_init(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow) srand((unsigned)time(NULL)); #ifdef MAME_DEBUG - validity_failed = mame_validitychecks(-1); + /* NPW 16-Sep-2006 - commenting this out because this cannot be run outside of MAME */ + //validity_failed = mame_validitychecks(-1); #endif // MAME_DEBUG init_resource_tracking(); @@ -2416,10 +2443,8 @@ static long WINAPI MameWindowProc(HWND hWnd, UINT message, UINT wParam, LONG lPa SetSplitterPos(i, nSplitterOffset[i]); SetWindowState(state); - Picker_SaveColumnWidths(hwndList); -#ifdef MESS - Picker_SaveColumnWidths(GetDlgItem(hMain, IDC_SWLIST)); -#endif /* MESS */ + for (i = 0; i < sizeof(s_nPickers) / sizeof(s_nPickers[0]); i++) + Picker_SaveColumnWidths(GetDlgItem(hMain, s_nPickers[i])); GetWindowRect(hWnd, &rect); area.x = rect.left; @@ -3876,6 +3901,7 @@ static void PressKey(HWND hwnd, UINT vk) static void SetView(int menu_id) { BOOL force_reset = FALSE; + int i; // first uncheck previous menu item, check new one CheckMenuRadioItem(GetMenu(hMain), ID_VIEW_LARGE_ICON, ID_VIEW_GROUPED, menu_id, MF_CHECKED); @@ -3887,18 +3913,13 @@ static void SetView(int menu_id) force_reset = TRUE; } - Picker_SetViewID(hwndList, menu_id - ID_VIEW_LARGE_ICON); -#ifdef MESS - Picker_SetViewID(GetDlgItem(hMain, IDC_SWLIST), menu_id - ID_VIEW_LARGE_ICON); -#endif - + for (i = 0; i < sizeof(s_nPickers) / sizeof(s_nPickers[0]); i++) + Picker_SetViewID(GetDlgItem(hMain, s_nPickers[i]), menu_id - ID_VIEW_LARGE_ICON); if (force_reset) { - Picker_Sort(hwndList); -#ifdef MESS - Picker_Sort(GetDlgItem(hMain, IDC_SWLIST)); -#endif + for (i = 0; i < sizeof(s_nPickers) / sizeof(s_nPickers[0]); i++) + Picker_Sort(GetDlgItem(hMain, s_nPickers[i])); } } @@ -5101,6 +5122,7 @@ static void CreateIcons(void) HICON hIcon; int icon_count; DWORD dwStyle; + int i; icon_count = 0; while(g_iconData[icon_count].icon_name) @@ -5142,10 +5164,8 @@ static void CreateIcons(void) hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_HEADER_DOWN)); ImageList_AddIcon(hHeaderImages,hIcon); - Picker_SetHeaderImageList(hwndList, hHeaderImages); -#ifdef MESS - Picker_SetHeaderImageList(GetDlgItem(hMain, IDC_SWLIST), hHeaderImages); -#endif + for (i = 0; i < sizeof(s_nPickers) / sizeof(s_nPickers[0]); i++) + Picker_SetHeaderImageList(GetDlgItem(hMain, s_nPickers[i]), hHeaderImages); } @@ -5767,7 +5787,7 @@ static void MamePlayRecordGame() } } -static void MamePlayGame() +static void MamePlayGame(void) { int nGame; diff --git a/src/uigfx.c b/src/uigfx.c index dac7349ec..a306d4d99 100644 --- a/src/uigfx.c +++ b/src/uigfx.c @@ -73,7 +73,7 @@ static ui_gfx_state ui_gfx; FUNCTION PROTOTYPES ***************************************************************************/ -static void ui_gfx_exit(void); +static void ui_gfx_exit(running_machine *machine); /* palette handling */ static void palette_handle_keys(ui_gfx_state *state); @@ -100,13 +100,13 @@ static void tilemap_handler(ui_gfx_state *state); ui_gfx_init - initialize the menu system -------------------------------------------------*/ -void ui_gfx_init(void) +void ui_gfx_init(running_machine *machine) { ui_gfx_state *state = &ui_gfx; int gfx; /* make sure we clean up after ourselves */ - add_exit_callback(ui_gfx_exit); + add_exit_callback(machine, ui_gfx_exit); /* initialize our global state */ memset(state, 0, sizeof(*state)); @@ -130,7 +130,7 @@ void ui_gfx_init(void) ui_gfx_exit - clean up after ourselves -------------------------------------------------*/ -static void ui_gfx_exit(void) +static void ui_gfx_exit(running_machine *machine) { /* free the texture */ if (ui_gfx.texture != NULL) @@ -157,7 +157,7 @@ UINT32 ui_gfx_ui_handler(UINT32 uistate) goto cancel; /* if we're not paused, mark the bitmap dirty */ - if (!mame_is_paused()) + if (!mame_is_paused(Machine)) state->bitmap_dirty = TRUE; /* switch off the state to display something */ @@ -206,7 +206,7 @@ UINT32 ui_gfx_ui_handler(UINT32 uistate) } if (input_ui_pressed(IPT_UI_PAUSE)) - mame_pause(!mame_is_paused()); + mame_pause(Machine, !mame_is_paused(Machine)); if (input_ui_pressed(IPT_UI_CANCEL) || input_ui_pressed(IPT_UI_SHOW_GFX)) goto cancel; @@ -215,7 +215,7 @@ UINT32 ui_gfx_ui_handler(UINT32 uistate) cancel: if (!uistate) - mame_pause(FALSE); + mame_pause(Machine, FALSE); state->bitmap_dirty = TRUE; return UI_HANDLER_CANCEL; } @@ -236,6 +236,7 @@ static void palette_handler(ui_gfx_state *state) int total = state->palette.which ? Machine->drv->color_table_len : Machine->drv->total_colors; UINT16 *pens = state->palette.which ? Machine->game_colortable : NULL; const char *title = state->palette.which ? "COLORTABLE" : "PALETTE"; + rgb_t *raw_color = palette_get_raw_colors(Machine); render_font *ui_font = ui_get_font(); float cellwidth, cellheight; float chwidth, chheight; @@ -337,7 +338,7 @@ static void palette_handler(ui_gfx_state *state) pen_t pen = (pens != NULL) ? pens[index] : index; render_ui_add_rect(cellboxbounds.x0 + x * cellwidth, cellboxbounds.y0 + y * cellheight, cellboxbounds.x0 + (x + 1) * cellwidth, cellboxbounds.y0 + (y + 1) * cellheight, - 0xff000000 | game_palette[pen], PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); + 0xff000000 | raw_color[pen], PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA)); } } @@ -760,18 +761,29 @@ static void gfxset_update_bitmap(ui_gfx_state *state, int xcells, int ycells, gf static void gfxset_draw_item(const gfx_element *gfx, int index, mame_bitmap *bitmap, int dstx, int dsty, int color, int rotate) { + static const pen_t default_palette[] = + { + MAKE_RGB(0,0,0), MAKE_RGB(0,0,255), MAKE_RGB(0,255,0), MAKE_RGB(0,255,255), + MAKE_RGB(255,0,0), MAKE_RGB(255,0,255), MAKE_RGB(255,255,0), MAKE_RGB(255,255,255) + }; int width = (rotate & ORIENTATION_SWAP_XY) ? gfx->height : gfx->width; int height = (rotate & ORIENTATION_SWAP_XY) ? gfx->width : gfx->height; + const pen_t *palette = (Machine->drv->total_colors != 0) ? palette_get_raw_colors(Machine) : NULL; UINT32 rowpixels = bitmap->rowpixels; - const pen_t *palette = game_palette; const UINT16 *colortable = NULL; + UINT32 palette_mask = ~0; int x, y; /* select either the raw palette or the colortable */ if (Machine->game_colortable != NULL) colortable = &Machine->game_colortable[(gfx->colortable - Machine->remapped_colortable) + color * gfx->color_granularity]; - else + else if (palette != NULL) palette += (gfx->colortable - Machine->remapped_colortable) + color * gfx->color_granularity; + else + { + palette = default_palette; + palette_mask = 7; + } /* loop over rows in the cell */ for (y = 0; y < height; y++) @@ -814,7 +826,7 @@ static void gfxset_draw_item(const gfx_element *gfx, int index, mame_bitmap *bit pixel = s[effx]; if (colortable != NULL) pixel = colortable[pixel]; - *dest++ = 0xff000000 | palette[pixel]; + *dest++ = 0xff000000 | palette[pixel & palette_mask]; } } } @@ -1050,7 +1062,7 @@ static void tilemap_update_bitmap(ui_gfx_state *state, int width, int height) /* allocate new stuff */ state->bitmap = bitmap_alloc_depth(width, height, Machine->color_depth); - state->texture = render_texture_alloc(state->bitmap, NULL, adjusted_palette, format, NULL, NULL); + state->texture = render_texture_alloc(state->bitmap, NULL, palette_get_adjusted_colors(Machine), format, NULL, NULL); /* force a redraw */ state->bitmap_dirty = TRUE; @@ -1062,7 +1074,7 @@ static void tilemap_update_bitmap(ui_gfx_state *state, int width, int height) tilemap_nb_draw(state->bitmap, state->tilemap.which, state->tilemap.xoffs, state->tilemap.yoffs); /* reset the texture to force an update */ - render_texture_set_bitmap(state->texture, state->bitmap, NULL, adjusted_palette, format); + render_texture_set_bitmap(state->texture, state->bitmap, NULL, palette_get_adjusted_colors(Machine), format); state->bitmap_dirty = FALSE; } } diff --git a/src/uigfx.h b/src/uigfx.h index 3cd716d1b..6c8eb427b 100644 --- a/src/uigfx.h +++ b/src/uigfx.h @@ -22,7 +22,7 @@ ***************************************************************************/ /* initialization */ -void ui_gfx_init(void); +void ui_gfx_init(running_machine *machine); /* master handler */ UINT32 ui_gfx_ui_handler(UINT32 state); diff --git a/src/uimenu.c b/src/uimenu.c index 2995d5388..9bfd2f820 100644 --- a/src/uimenu.c +++ b/src/uimenu.c @@ -170,7 +170,7 @@ INLINE const char *CLIB_DECL menu_string_pool_add(const char *format, ...) ui_menu_init - initialize the menu system -------------------------------------------------*/ -void ui_menu_init(void) +void ui_menu_init(running_machine *machine) { ui_menu_stack_reset(); } @@ -1058,7 +1058,7 @@ static UINT32 menu_memory_card(UINT32 state) /* handle eject */ else if (selected == ejectindex) { - memcard_eject(); + memcard_eject(Machine); popmessage("%s", ui_getstring(UI_cardejected)); } @@ -1257,7 +1257,7 @@ static UINT32 menu_video(UINT32 state) static UINT32 menu_reset_game(UINT32 state) { /* request a reset */ - mame_schedule_soft_reset(); + mame_schedule_soft_reset(Machine); /* reset the menu stack */ ui_menu_stack_reset(); diff --git a/src/uimenu.h b/src/uimenu.h index 8b4edf0ec..e93d524c7 100644 --- a/src/uimenu.h +++ b/src/uimenu.h @@ -50,7 +50,7 @@ struct _ui_menu_item ***************************************************************************/ /* initialization */ -void ui_menu_init(void); +void ui_menu_init(running_machine *machine); /* draw a menu */ void ui_menu_draw(const ui_menu_item *items, int numitems, int selected); diff --git a/src/validity.c b/src/validity.c index 6c355cd6d..dea28d60d 100644 --- a/src/validity.c +++ b/src/validity.c @@ -963,8 +963,8 @@ int mame_validitychecks(int game) if (sizeof(UINT64) != 8) { printf("UINT64 must be 64 bits\n"); error = TRUE; } /* make sure the CPU and sound interfaces are up and running */ - cpuintrf_init(); - sndintrf_init(); + cpuintrf_init(NULL); + sndintrf_init(NULL); init_resource_tracking(); begin_resource_tracking(); diff --git a/src/version.c b/src/version.c index cecdfa69a..ddee146a2 100644 --- a/src/version.c +++ b/src/version.c @@ -9,4 +9,4 @@ ***************************************************************************/ -char build_version[] = "0.108 ("__DATE__")"; +char build_version[] = "0.109 ("__DATE__")"; diff --git a/src/video.c b/src/video.c index 2355483af..a5205eea7 100644 --- a/src/video.c +++ b/src/video.c @@ -20,9 +20,6 @@ #include "snap.lh" -#if defined(MAME_DEBUG) && !defined(NEW_DEBUGGER) -#include "mamedbg.h" -#endif /*************************************************************************** @@ -56,8 +53,7 @@ struct _internal_screen_info int last_partial_scanline; subseconds_t scantime; subseconds_t pixeltime; - mame_timer * vblank_timer; - mame_timer * refresh_timer; + mame_time vblank_time; }; @@ -95,7 +91,7 @@ static UINT32 leds_status; FUNCTION PROTOTYPES ***************************************************************************/ -static void video_exit(void); +static void video_exit(running_machine *machine); static void allocate_graphics(const gfx_decode *gfxdecodeinfo); static void decode_graphics(const gfx_decode *gfxdecodeinfo); static void scale_vectorgames(int gfx_width, int gfx_height, int *width, int *height); @@ -114,51 +110,54 @@ static void rgb888_draw_primitives(const render_primitive *primlist, void *dstda video_init - start up the video system -------------------------------------------------*/ -int video_init(void) +int video_init(running_machine *machine) { int scrnum; - add_exit_callback(video_exit); + add_exit_callback(machine, video_exit); /* reset globals */ memset(scrinfo, 0, sizeof(scrinfo)); /* configure all of the screens */ for (scrnum = 0; scrnum < MAX_SCREENS; scrnum++) - if (Machine->drv->screen[scrnum].tag != NULL) + if (machine->drv->screen[scrnum].tag != NULL) { internal_screen_info *info = &scrinfo[scrnum]; - screen_state *state = &Machine->screen[scrnum]; + screen_state *state = &machine->screen[scrnum]; /* configure the screen with the default parameters */ video_screen_configure(scrnum, state->width, state->height, &state->visarea, state->refresh); - /* create timers for VBLANK and refresh */ - info->vblank_timer = mame_timer_alloc(NULL); - info->refresh_timer = mame_timer_alloc(NULL); + /* reset VBLANK timing */ + info->vblank_time = time_zero; + + /* register for save states */ + state_save_register_item("video", scrnum, info->vblank_time.seconds); + state_save_register_item("video", scrnum, info->vblank_time.subseconds); } /* create spriteram buffers if necessary */ - if (Machine->drv->video_attributes & VIDEO_BUFFERS_SPRITERAM) + if (machine->drv->video_attributes & VIDEO_BUFFERS_SPRITERAM) init_buffered_spriteram(); /* convert the gfx ROMs into character sets. This is done BEFORE calling the driver's */ - /* palette_init() routine because it might need to check the Machine->gfx[] data */ - if (Machine->drv->gfxdecodeinfo != NULL) - allocate_graphics(Machine->drv->gfxdecodeinfo); + /* palette_init() routine because it might need to check the machine->gfx[] data */ + if (machine->drv->gfxdecodeinfo != NULL) + allocate_graphics(machine->drv->gfxdecodeinfo); /* configure the palette */ - palette_config(); + palette_config(machine); /* actually decode the graphics */ - if (Machine->drv->gfxdecodeinfo != NULL) - decode_graphics(Machine->drv->gfxdecodeinfo); + if (machine->drv->gfxdecodeinfo != NULL) + decode_graphics(machine->drv->gfxdecodeinfo); /* reset performance data */ last_fps_time = osd_cycles(); rendered_frames_since_last_fps = frames_since_last_fps = 0; performance.game_speed_percent = 100; - performance.frames_per_second = Machine->screen[0].refresh; + performance.frames_per_second = machine->screen[0].refresh; performance.vector_updates_last_second = 0; /* reset video statics and get out of here */ @@ -166,7 +165,7 @@ int video_init(void) leds_status = 0; /* initialize tilemaps */ - if (tilemap_init() != 0) + if (tilemap_init(machine) != 0) fatalerror("tilemap_init failed"); /* create a render target for snapshots */ @@ -185,7 +184,7 @@ int video_init(void) video_exit - close down the video system -------------------------------------------------*/ -static void video_exit(void) +static void video_exit(running_machine *machine) { int scrnum; int i; @@ -196,8 +195,8 @@ static void video_exit(void) /* free all the graphics elements */ for (i = 0; i < MAX_GFX_ELEMENTS; i++) { - freegfx(Machine->gfx[i]); - Machine->gfx[i] = 0; + freegfx(machine->gfx[i]); + machine->gfx[i] = 0; } /* free all the textures and bitmaps */ @@ -227,12 +226,12 @@ static void video_exit(void) void video_vblank_start(void) { + mame_time curtime = mame_timer_get_time(); int scrnum; /* reset VBLANK timers for each screen -- fix me */ for (scrnum = 0; scrnum < MAX_SCREENS; scrnum++) - if (Machine->drv->screen[scrnum].tag != NULL) - mame_timer_reset(scrinfo[scrnum].vblank_timer, time_zero); + scrinfo[scrnum].vblank_time = curtime; } @@ -464,7 +463,7 @@ void video_screen_configure(int scrnum, int width, int height, const rectangle * /* allocate new stuff */ info->bitmap[0] = bitmap_alloc_depth(curwidth, curheight, Machine->color_depth); info->bitmap[1] = bitmap_alloc_depth(curwidth, curheight, Machine->color_depth); - info->texture = render_texture_alloc(info->bitmap[0], visarea, &adjusted_palette[config->palette_base], info->format, NULL, NULL); + info->texture = render_texture_alloc(info->bitmap[0], visarea, palette_get_adjusted_colors(Machine) + config->palette_base, info->format, NULL, NULL); } } @@ -517,11 +516,22 @@ void video_screen_update_partial(int scrnum, int scanline) LOG_PARTIAL_UPDATES(("Partial: video_screen_update_partial(%d,%d): ", scrnum, scanline)); - /* if skipping this frame, bail */ - if (video_skip_this_frame()) + /* these two checks only apply if we're allowed to skip frames */ + if (!(Machine->drv->video_attributes & VIDEO_ALWAYS_UPDATE)) { - LOG_PARTIAL_UPDATES(("skipped due to frameskipping\n")); - return; + /* if skipping this frame, bail */ + if (video_skip_this_frame()) + { + LOG_PARTIAL_UPDATES(("skipped due to frameskipping\n")); + return; + } + + /* skip if this screen is not visible anywhere */ + if (!(render_get_live_screens_mask() & (1 << scrnum))) + { + LOG_PARTIAL_UPDATES(("skipped because screen not live\n")); + return; + } } /* skip if less than the lowest so far */ @@ -531,13 +541,6 @@ void video_screen_update_partial(int scrnum, int scanline) return; } - /* skip if this screen is not visible anywhere */ - if (!(render_get_live_screens_mask() & (1 << scrnum))) - { - LOG_PARTIAL_UPDATES(("skipped because screen not live\n")); - return; - } - /* set the start/end scanlines */ if (screen->last_partial_scanline > clip.min_y) clip.min_y = screen->last_partial_scanline; @@ -551,7 +554,7 @@ void video_screen_update_partial(int scrnum, int scanline) profiler_mark(PROFILER_VIDEO); LOG_PARTIAL_UPDATES(("updating %d-%d\n", clip.min_y, clip.max_y)); - flags = (*Machine->drv->video_update)(scrnum, screen->bitmap[screen->curbitmap], &clip); + flags = (*Machine->drv->video_update)(Machine, scrnum, screen->bitmap[screen->curbitmap], &clip); performance.partial_updates_this_frame++; profiler_mark(PROFILER_END); @@ -572,7 +575,7 @@ void video_screen_update_partial(int scrnum, int scanline) int video_screen_get_vpos(int scrnum) { - mame_time delta = mame_timer_timeelapsed(scrinfo[scrnum].vblank_timer); + mame_time delta = sub_mame_times(mame_timer_get_time(), scrinfo[scrnum].vblank_time); int vpos; assert(delta.seconds == 0); @@ -589,7 +592,7 @@ int video_screen_get_vpos(int scrnum) int video_screen_get_hpos(int scrnum) { - mame_time delta = mame_timer_timeelapsed(scrinfo[scrnum].vblank_timer); + mame_time delta = sub_mame_times(mame_timer_get_time(), scrinfo[scrnum].vblank_time); int vpos, hpos; assert(delta.seconds == 0); @@ -631,13 +634,17 @@ int video_screen_get_hblank(int scrnum) mame_time video_screen_get_time_until_pos(int scrnum, int vpos, int hpos) { - mame_time curdelta = mame_timer_timeelapsed(scrinfo[scrnum].vblank_timer); + mame_time curdelta = sub_mame_times(mame_timer_get_time(), scrinfo[scrnum].vblank_time); subseconds_t targetdelta; assert(curdelta.seconds == 0); + /* since we measure time relative to VBLANK, compute the scanline offset from VBLANK */ + vpos += Machine->screen[scrnum].height - (Machine->screen[scrnum].visarea.max_y + 1); + vpos %= Machine->screen[scrnum].height; + /* compute the delta for the given X,Y position */ - targetdelta = vpos * scrinfo[scrnum].scantime + hpos * scrinfo[scrnum].pixeltime; + targetdelta = (subseconds_t)vpos * scrinfo[scrnum].scantime + (subseconds_t)hpos * scrinfo[scrnum].pixeltime; /* if we're past that time, head to the next frame */ if (targetdelta <= curdelta.subseconds) @@ -726,8 +733,8 @@ int video_skip_this_frame(void) void video_frame_update(void) { int skipped_it = video_skip_this_frame(); - int paused = mame_is_paused(); - int phase = mame_get_phase(); + int paused = mame_is_paused(Machine); + int phase = mame_get_phase(Machine); int livemask; int scrnum; @@ -738,6 +745,7 @@ void video_frame_update(void) sound_frame_update(); /* finish updating the screens */ + if (!paused) for (scrnum = 0; scrnum < MAX_SCREENS; scrnum++) if (Machine->drv->screen[scrnum].tag != NULL) video_screen_update_partial(scrnum, Machine->screen[scrnum].visarea.max_y); @@ -762,7 +770,7 @@ void video_frame_update(void) rectangle fixedvis = Machine->screen[scrnum].visarea; fixedvis.max_x++; fixedvis.max_y++; - render_texture_set_bitmap(screen->texture, bitmap, &fixedvis, &adjusted_palette[Machine->drv->screen[scrnum].palette_base], screen->format); + render_texture_set_bitmap(screen->texture, bitmap, &fixedvis, palette_get_adjusted_colors(Machine) + Machine->drv->screen[scrnum].palette_base, screen->format); screen->curbitmap = 1 - screen->curbitmap; } render_screen_add_quad(scrnum, 0.0f, 0.0f, 1.0f, 1.0f, MAKE_ARGB(0xff,0xff,0xff,0xff), screen->texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_SCREENTEX(1)); @@ -777,10 +785,6 @@ void video_frame_update(void) /* draw the user interface */ ui_update_and_render(); -#if defined(MAME_DEBUG) && !defined(NEW_DEBUGGER) - debug_trace_delay = 0; -#endif - /* call the OSD to update */ skipping_this_frame = osd_update(mame_timer_get_time()); @@ -803,7 +807,7 @@ void video_frame_update(void) else if (Machine->drv->video_eof != NULL) { profiler_mark(PROFILER_VIDEO); - (*Machine->drv->video_eof)(); + (*Machine->drv->video_eof)(Machine); profiler_mark(PROFILER_END); } } @@ -835,6 +839,7 @@ static void save_frame_with(mame_file *fp, int scrnum, int (*write_handler)(mame { const render_primitive_list *primlist; INT32 width, height; + int error; assert(scrnum >= 0 && scrnum < MAX_SCREENS); @@ -861,7 +866,7 @@ static void save_frame_with(mame_file *fp, int scrnum, int (*write_handler)(mame osd_lock_release(primlist->lock); /* now do the actual work */ - (*write_handler)(fp, snap_bitmap); + error = (*write_handler)(fp, snap_bitmap); } diff --git a/src/video.h b/src/video.h index 5dbd59e5b..0275561db 100644 --- a/src/video.h +++ b/src/video.h @@ -82,7 +82,7 @@ struct _performance_info /* ----- screen rendering and management ----- */ /* core initialization */ -int video_init(void); +int video_init(running_machine *machine); /* core VBLANK callback */ void video_vblank_start(void); diff --git a/src/vidhrdw/1942.c b/src/vidhrdw/1942.c index c554d2098..439c2ff9a 100644 --- a/src/vidhrdw/1942.c +++ b/src/vidhrdw/1942.c @@ -62,7 +62,7 @@ PALETTE_INIT( 1942 ) bit3 = (color_prom[i + 2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += 3*Machine->drv->total_colors; diff --git a/src/vidhrdw/1943.c b/src/vidhrdw/1943.c index 13bdc8bb0..fd2d2adbe 100644 --- a/src/vidhrdw/1943.c +++ b/src/vidhrdw/1943.c @@ -54,7 +54,7 @@ PALETTE_INIT( 1943 ) b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); } color_prom += 3*Machine->drv->total_colors; @@ -256,7 +256,7 @@ VIDEO_UPDATE( 1943 ) if (sc2on) tilemap_draw(bitmap, cliprect, bg2_tilemap, 0, 0); else - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); if (objon) c1943_draw_sprites(bitmap, cliprect, 0); if (sc1on) tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); diff --git a/src/vidhrdw/40love.c b/src/vidhrdw/40love.c index b8163fa2b..259a62c26 100644 --- a/src/vidhrdw/40love.c +++ b/src/vidhrdw/40love.c @@ -56,7 +56,7 @@ PALETTE_INIT( fortyl ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/4enraya.c b/src/vidhrdw/4enraya.c index d34a5866d..1cc66200a 100644 --- a/src/vidhrdw/4enraya.c +++ b/src/vidhrdw/4enraya.c @@ -30,7 +30,7 @@ static void get_tile_info(int tile_index) VIDEO_START( 4enraya ) { bg_tilemap = tilemap_create( get_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,8,8,32,32 ); - return video_start_generic(); + return video_start_generic(machine); } VIDEO_UPDATE( 4enraya) diff --git a/src/vidhrdw/8080bw.c b/src/vidhrdw/8080bw.c index 79b20a1b0..998dee5c8 100644 --- a/src/vidhrdw/8080bw.c +++ b/src/vidhrdw/8080bw.c @@ -19,7 +19,7 @@ static UINT8 cloud_pos; static UINT8 bowler_bonus_display; static write8_handler videoram_w_p; -static UINT32 (*video_update_p)(int screen,mame_bitmap *bitmap,const rectangle *cliprect); +static UINT32 (*video_update_p)(running_machine *machine,int screen,mame_bitmap *bitmap,const rectangle *cliprect); static WRITE8_HANDLER( bw_videoram_w ); static WRITE8_HANDLER( rollingc_videoram_w ); @@ -68,13 +68,13 @@ DRIVER_INIT( 8080bw ) DRIVER_INIT( invaddlx ) { - init_8080bw(); + init_8080bw(machine); /* artwork_set_overlay(invdpt2m_overlay);*/ } DRIVER_INIT( sstrngr2 ) { - init_8080bw(); + init_8080bw(machine); videoram_w_p = sstrngr2_videoram_w; screen_red_enabled = 1; } @@ -86,7 +86,7 @@ DRIVER_INIT( schaser ) schaser_effect_555_timer = timer_alloc(schaser_effect_555_cb); - init_8080bw(); + init_8080bw(machine); videoram_w_p = schaser_videoram_w; // make background palette same as foreground one for (i = 0; i < 0x80; i++) promm[i] = 0; @@ -105,82 +105,82 @@ DRIVER_INIT( schaser ) DRIVER_INIT( schasrcv ) { - init_8080bw(); + init_8080bw(machine); videoram_w_p = rollingc_videoram_w; background_color = 2; /* blue */ } DRIVER_INIT( rollingc ) { - init_8080bw(); + init_8080bw(machine); videoram_w_p = rollingc_videoram_w; background_color = 0; /* black */ } DRIVER_INIT( polaris ) { - init_8080bw(); + init_8080bw(machine); videoram_w_p = polaris_videoram_w; } DRIVER_INIT( lupin3 ) { - init_8080bw(); + init_8080bw(machine); videoram_w_p = lupin3_videoram_w; } DRIVER_INIT( invadpt2 ) { - init_8080bw(); + init_8080bw(machine); videoram_w_p = invadpt2_videoram_w; screen_red_enabled = 1; } DRIVER_INIT( cosmo ) { - init_8080bw(); + init_8080bw(machine); videoram_w_p = cosmo_videoram_w; } DRIVER_INIT( seawolf ) { - init_8080bw(); + init_8080bw(machine); video_update_p = video_update_seawolf; } DRIVER_INIT( blueshrk ) { - init_8080bw(); + init_8080bw(machine); video_update_p = video_update_blueshrk; } DRIVER_INIT( desertgu ) { - init_8080bw(); + init_8080bw(machine); video_update_p = video_update_desertgu; } DRIVER_INIT( bowler ) { - init_8080bw(); + init_8080bw(machine); video_update_p = video_update_bowler; } DRIVER_INIT( phantom2 ) { - init_8080bw(); + init_8080bw(machine); videoram_w_p = phantom2_videoram_w; } DRIVER_INIT( indianbt ) { - init_8080bw(); + init_8080bw(machine); videoram_w_p = invadpt2_videoram_w; } DRIVER_INIT( shuttlei ) { - init_8080bw(); + init_8080bw(machine); videoram_w_p = shuttlei_videoram_w; } @@ -503,7 +503,7 @@ static WRITE8_HANDLER( shuttlei_videoram_w ) ***************************************************************************/ VIDEO_UPDATE( 8080bw ) { - video_update_p(screen, bitmap, cliprect); + video_update_p(machine, screen, bitmap, cliprect); return 0; } @@ -592,7 +592,7 @@ static void draw_sight(mame_bitmap *bitmap,const rectangle *cliprect,int x_cente static VIDEO_UPDATE( seawolf ) { /* update the bitmap (and erase old cross) */ - video_update_8080bw_common(screen, bitmap, cliprect); + video_update_8080bw_common(machine, screen, bitmap, cliprect); draw_sight(bitmap,cliprect,((input_port_0_r(0) & 0x1f) * 8) + 4, 63); return 0; @@ -601,7 +601,7 @@ static VIDEO_UPDATE( seawolf ) static VIDEO_UPDATE( blueshrk ) { /* update the bitmap (and erase old cross) */ - video_update_8080bw_common(screen, bitmap, cliprect); + video_update_8080bw_common(machine, screen, bitmap, cliprect); draw_sight(bitmap,cliprect,((input_port_0_r(0) & 0x7f) * 2) - 12, 63); return 0; @@ -610,7 +610,7 @@ static VIDEO_UPDATE( blueshrk ) static VIDEO_UPDATE( desertgu ) { /* update the bitmap (and erase old cross) */ - video_update_8080bw_common(screen, bitmap, cliprect); + video_update_8080bw_common(machine, screen, bitmap, cliprect); draw_sight(bitmap,cliprect, ((input_port_0_r(0) & 0x7f) * 2) - 30, @@ -633,7 +633,7 @@ static VIDEO_UPDATE( bowler ) { /* update the bitmap */ - video_update_8080bw_common(screen, bitmap, cliprect); + video_update_8080bw_common(machine, screen, bitmap, cliprect); /* draw the current bonus value - on the original game this @@ -695,10 +695,7 @@ PALETTE_INIT( invadpt2 ) for (i = 0;i < Machine->drv->total_colors;i++) { /* this bit arrangment is a little unusual but are confirmed by screen shots */ - int r = 0xff * ((i >> 0) & 1); - int g = 0xff * ((i >> 2) & 1); - int b = 0xff * ((i >> 1) & 1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal1bit(i >> 0),pal1bit(i >> 2),pal1bit(i >> 1)); } } @@ -711,12 +708,9 @@ PALETTE_INIT( sflush ) for (i = 0;i < Machine->drv->total_colors;i++) { /* this bit arrangment is a little unusual but are confirmed by screen shots */ - int r = 0xff * ((i >> 0) & 1); - int g = 0xff * ((i >> 2) & 1); - int b = 0xff * ((i >> 1) & 1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal1bit(i >> 0),pal1bit(i >> 2),pal1bit(i >> 1)); } - palette_set_color(0,0x80,0x80,0xff); + palette_set_color(machine,0,0x80,0x80,0xff); } PALETTE_INIT( indianbt ) @@ -725,10 +719,7 @@ PALETTE_INIT( indianbt ) for (i = 0;i < Machine->drv->total_colors;i++) { - int r = 0xff * ((i >> 0) & 1); - int b = 0xff * ((i >> 2) & 1); - int g = 0xff * ((i >> 1) & 1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal1bit(i >> 0),pal1bit(i >> 1),pal1bit(i >> 2)); } } @@ -764,10 +755,7 @@ PALETTE_INIT( cosmo ) for (i = 0;i < Machine->drv->total_colors;i++) { - int r = 0xff * ((i >> 0) & 1); - int g = 0xff * ((i >> 1) & 1); - int b = 0xff * ((i >> 2) & 1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal1bit(i >> 0),pal1bit(i >> 1),pal1bit(i >> 2)); } } diff --git a/src/vidhrdw/aerofgt.c b/src/vidhrdw/aerofgt.c index dbc576cee..32c5844e9 100644 --- a/src/vidhrdw/aerofgt.c +++ b/src/vidhrdw/aerofgt.c @@ -410,7 +410,9 @@ static void turbofrc_drawsprites(mame_bitmap *bitmap,const rectangle *cliprect,i // int zoomtable[16] = { 0,7,14,20,25,30,34,38,42,46,49,52,54,57,59,61 }; if (!(aerofgt_spriteram3[attr_start + 2] & 0x0080)) continue; - + pri = aerofgt_spriteram3[attr_start + 2] & 0x0010; + if ( chip_disabled_pri & !pri) continue; + if (!chip_disabled_pri & (pri>>4)) continue; ox = aerofgt_spriteram3[attr_start + 1] & 0x01ff; xsize = (aerofgt_spriteram3[attr_start + 2] & 0x0700) >> 8; zoomx = (aerofgt_spriteram3[attr_start + 1] & 0xf000) >> 12; @@ -420,7 +422,7 @@ static void turbofrc_drawsprites(mame_bitmap *bitmap,const rectangle *cliprect,i flipx = aerofgt_spriteram3[attr_start + 2] & 0x0800; flipy = aerofgt_spriteram3[attr_start + 2] & 0x8000; color = (aerofgt_spriteram3[attr_start + 2] & 0x000f) + 16 * spritepalettebank; - pri = aerofgt_spriteram3[attr_start + 2] & 0x0010; + map_start = aerofgt_spriteram3[attr_start + 3]; // aerofgt has this adjustment, but doing it here would break turbo force title screen @@ -456,8 +458,7 @@ static void turbofrc_drawsprites(mame_bitmap *bitmap,const rectangle *cliprect,i sx,sy, cliprect,TRANSPARENCY_PEN,15, zoomx << 11, zoomy << 11, - (pri || chip == chip_disabled_pri) ? 0 : 2); - + pri ? 0 : 2); map_start++; } @@ -611,6 +612,7 @@ VIDEO_UPDATE( pspikes ) tilemap_draw(bitmap,cliprect,bg1_tilemap,0,0); turbofrc_drawsprites(bitmap,cliprect,0,-1); + turbofrc_drawsprites(bitmap,cliprect,0, 0); return 0; } @@ -639,11 +641,13 @@ VIDEO_UPDATE( karatblz ) fillbitmap(priority_bitmap,0,cliprect); tilemap_draw(bitmap,cliprect,bg1_tilemap,0,0); - tilemap_draw(bitmap,cliprect,bg2_tilemap,0,1); + tilemap_draw(bitmap,cliprect,bg2_tilemap,0,0); /* we use the priority buffer so sprites are drawn front to back */ - turbofrc_drawsprites(bitmap,cliprect,1, 1); + turbofrc_drawsprites(bitmap,cliprect,1,-1); + turbofrc_drawsprites(bitmap,cliprect,1, 0); turbofrc_drawsprites(bitmap,cliprect,0,-1); + turbofrc_drawsprites(bitmap,cliprect,0, 0); return 0; } @@ -666,7 +670,9 @@ VIDEO_UPDATE( spinlbrk ) /* we use the priority buffer so sprites are drawn front to back */ turbofrc_drawsprites(bitmap,cliprect,0,-1); + turbofrc_drawsprites(bitmap,cliprect,0, 0); turbofrc_drawsprites(bitmap,cliprect,1,-1); + turbofrc_drawsprites(bitmap,cliprect,1, 0); return 0; } @@ -689,8 +695,10 @@ VIDEO_UPDATE( turbofrc ) tilemap_draw(bitmap,cliprect,bg2_tilemap,0,1); /* we use the priority buffer so sprites are drawn front to back */ - turbofrc_drawsprites(bitmap,cliprect,1,-1); - turbofrc_drawsprites(bitmap,cliprect,0,-1); + turbofrc_drawsprites(bitmap,cliprect,1,-1); //ship + turbofrc_drawsprites(bitmap,cliprect,1, 0); //intro + turbofrc_drawsprites(bitmap,cliprect,0,-1); //enemy + turbofrc_drawsprites(bitmap,cliprect,0, 0); //enemy return 0; } @@ -761,5 +769,6 @@ VIDEO_UPDATE( wbbc97 ) } turbofrc_drawsprites(bitmap,cliprect,0,-1); + turbofrc_drawsprites(bitmap,cliprect,0, 0); return 0; } diff --git a/src/vidhrdw/afega.c b/src/vidhrdw/afega.c index 0a347faa1..27c8c5a87 100644 --- a/src/vidhrdw/afega.c +++ b/src/vidhrdw/afega.c @@ -61,10 +61,10 @@ WRITE16_HANDLER( afega_palette_w ) { int r,g,b; data = COMBINE_DATA(&paletteram16[offset]); - b = ((data & 0x00F0) >> 0) + ((data & 0x0002) << 2); - g = ((data & 0x0F00) >> 4) + ((data & 0x0004) << 1); - r = ((data & 0xF000) >> 8) + ((data & 0x0008) << 0); - palette_set_color( offset, r , g , b ); + b = ((data & 0x00F0) >> 3 ) + ((data & 0x0002) >> 1); + g = ((data & 0x0F00) >> 7 ) + ((data & 0x0004) >> 2); + r = ((data & 0xF000) >> 11) + ((data & 0x0008) >> 3); + palette_set_color( Machine, offset, pal5bit(r) , pal5bit(g) , pal5bit(b) ); } /* This game uses 8 bit tiles, so it ignores the color codes and just @@ -339,7 +339,7 @@ if ( code_pressed(KEYCODE_Z) ) #endif if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect,tilemap_0,0,0); - else fillbitmap(bitmap,get_black_pen(),cliprect); + else fillbitmap(bitmap,get_black_pen(Machine),cliprect); if (layers_ctrl & 4) afega_draw_sprites(bitmap,cliprect, attr_mask); diff --git a/src/vidhrdw/ajax.c b/src/vidhrdw/ajax.c index 44a87978c..e522097d1 100644 --- a/src/vidhrdw/ajax.c +++ b/src/vidhrdw/ajax.c @@ -99,7 +99,7 @@ VIDEO_UPDATE( ajax ) fillbitmap(priority_bitmap,0,cliprect); - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); tilemap_draw(bitmap,cliprect,K052109_tilemap[2],0,1); if (ajax_priority) { diff --git a/src/vidhrdw/alpha68k.c b/src/vidhrdw/alpha68k.c index 2dc158165..38297146b 100644 --- a/src/vidhrdw/alpha68k.c +++ b/src/vidhrdw/alpha68k.c @@ -37,11 +37,7 @@ WRITE16_HANDLER( alpha68k_paletteram_w ) g = ((newword >> 3) & 0x1e) | ((newword >> 13) & 0x01); b = ((newword << 1) & 0x1e) | ((newword >> 12) & 0x01); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,pal5bit(r),pal5bit(g),pal5bit(b)); } /******************************************************************************/ @@ -398,7 +394,7 @@ PALETTE_INIT( kyros ) bit3 = (color_prom[0x200] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -435,7 +431,7 @@ PALETTE_INIT( paddlem ) bit3 = (color_prom[0x200] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/ambush.c b/src/vidhrdw/ambush.c index e6d09e602..2e3f44dee 100644 --- a/src/vidhrdw/ambush.c +++ b/src/vidhrdw/ambush.c @@ -44,7 +44,7 @@ PALETTE_INIT( ambush ) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/amiga.c b/src/vidhrdw/amiga.c index d945cf92b..f2574753b 100644 --- a/src/vidhrdw/amiga.c +++ b/src/vidhrdw/amiga.c @@ -125,7 +125,7 @@ PALETTE_INIT( amiga ) int i; for (i = 0; i < 0x1000; i++) - palette_set_color(i, pal4bit(i >> 8), pal4bit(i >> 4), pal4bit(i)); + palette_set_color(machine, i, pal4bit(i >> 8), pal4bit(i >> 4), pal4bit(i)); } @@ -150,7 +150,7 @@ VIDEO_START( amiga ) separate_bitplanes[1][j] = pf2pix ? (pf2pix + 8) : pf1pix; } - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } diff --git a/src/vidhrdw/angelkds.c b/src/vidhrdw/angelkds.c index 37dc22cc1..b9ea37593 100644 --- a/src/vidhrdw/angelkds.c +++ b/src/vidhrdw/angelkds.c @@ -256,20 +256,13 @@ static void draw_sprites( mame_bitmap *bitmap, const rectangle *cliprect, int en WRITE8_HANDLER( angelkds_paletteram_w ) { - int no, r,g,b; + int no; paletteram[offset] = data; no=offset & 0xff; - - g = (paletteram[no] & 0xf0)<< 0; - - r = (paletteram[no] & 0x0f) << 4; - - b = (paletteram[no+0x100] & 0x0f) << 4; - - palette_set_color(no,r,g,b); + palette_set_color(Machine,no,pal4bit(paletteram[no]),pal4bit(paletteram[no]>>4),pal4bit(paletteram[no+0x100])); } /*** Video Start & Update diff --git a/src/vidhrdw/appoooh.c b/src/vidhrdw/appoooh.c index 4fc6087d8..e52c858f0 100644 --- a/src/vidhrdw/appoooh.c +++ b/src/vidhrdw/appoooh.c @@ -56,7 +56,7 @@ PALETTE_INIT( appoooh ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -101,7 +101,7 @@ PALETTE_INIT( robowres ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/arabian.c b/src/vidhrdw/arabian.c index 2709aeeda..696924a6a 100644 --- a/src/vidhrdw/arabian.c +++ b/src/vidhrdw/arabian.c @@ -39,7 +39,7 @@ PALETTE_INIT( arabian ) /* there are effectively 6 bits of color: 2 red, 2 green, 2 blue */ for (i = 0; i < 64; i++) { - palette_set_color(i, + palette_set_color(machine, i, ((i >> 5) & 1) * (153*192/255) + ((i >> 4) & 1) * (102*192/255) + ((i & 0x30) ? 63 : 0), ((i >> 3) & 1) * (156*192/255) + ((i >> 2) & 1) * (99*192/255) + ((i & 0x0c) ? 63 : 0), ((i >> 1) & 1) * 192 + ((i >> 0) & 1) * 63); diff --git a/src/vidhrdw/argus.c b/src/vidhrdw/argus.c index f4811400c..48fae37fd 100644 --- a/src/vidhrdw/argus.c +++ b/src/vidhrdw/argus.c @@ -470,41 +470,15 @@ static void argus_write_dummy_rams( int dramoffs, int vromoffs ) static void bombsa_change_palette(int color, int data) { - int r, g, b;//, a; - - r = (data >> 12) & 0x0f; - g = (data >> 8) & 0x0f; - b = (data >> 4) & 0x0f; -// a = (data ) & 0x0f; - - r = (r << 4) | r; - g = (g << 4) | g; - b = (b << 4) | b; -// a = (a << 4) | a; - -// jal_blend_table[color] = a ; - - palette_set_color(color, r, g, b); + palette_set_color(Machine, color, pal4bit(data >> 12), pal4bit(data >> 8), pal4bit(data >> 4)); } static void argus_change_palette(int color, int data) { - int r, g, b, a; + jal_blend_table[color] = data & 0x0f ; - r = (data >> 12) & 0x0f; - g = (data >> 8) & 0x0f; - b = (data >> 4) & 0x0f; - a = (data ) & 0x0f; - - r = (r << 4) | r; - g = (g << 4) | g; - b = (b << 4) | b; - a = (a << 4) | a; - - jal_blend_table[color] = a ; - - palette_set_color(color, r, g, b); + palette_set_color(Machine, color, pal4bit(data >> 12), pal4bit(data >> 8), pal4bit(data >> 4)); } static void argus_change_bg_palette(int color, int data) @@ -532,11 +506,7 @@ static void argus_change_bg_palette(int color, int data) g = 0; } - r = (r << 4) | r; - g = (g << 4) | g; - b = (b << 4) | b; - - palette_set_color(color, r, g, b); + palette_set_color(Machine, color, pal4bit(r), pal4bit(g), pal4bit(b)); } diff --git a/src/vidhrdw/armedf.c b/src/vidhrdw/armedf.c index d5b8a0e90..3a11f9d00 100644 --- a/src/vidhrdw/armedf.c +++ b/src/vidhrdw/armedf.c @@ -347,7 +347,7 @@ VIDEO_UPDATE( armedf ) } else { - fillbitmap( bitmap, get_black_pen()&0x0f, cliprect ); + fillbitmap( bitmap, get_black_pen(machine)&0x0f, cliprect ); }*/ if ((mcu_mode&0x0030)==0x0030) tilemap_draw( bitmap, cliprect, armedf_tx_tilemap, 0, 0); diff --git a/src/vidhrdw/artmagic.c b/src/vidhrdw/artmagic.c index cf0cde4ed..ce61bf7bc 100644 --- a/src/vidhrdw/artmagic.c +++ b/src/vidhrdw/artmagic.c @@ -362,7 +362,7 @@ VIDEO_UPDATE( artmagic ) vram = address_to_vram(&offset); if (!vram || tms34010_io_display_blanked(0)) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } offset += cliprect->min_y * TOWORD(0x2000); diff --git a/src/vidhrdw/astinvad.c b/src/vidhrdw/astinvad.c index 20d164456..893fc154b 100644 --- a/src/vidhrdw/astinvad.c +++ b/src/vidhrdw/astinvad.c @@ -97,7 +97,7 @@ VIDEO_START( astinvad ) { astinvad_adjust = 0x80; - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } @@ -105,7 +105,7 @@ VIDEO_START( spcking2 ) { astinvad_adjust = 0; - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } @@ -114,7 +114,7 @@ VIDEO_START( spaceint ) colorram = auto_malloc(0x2000); memset(colorram, 0, 0x2000); - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } diff --git a/src/vidhrdw/astrocde.c b/src/vidhrdw/astrocde.c index 10a487f0a..07d652d4f 100644 --- a/src/vidhrdw/astrocde.c +++ b/src/vidhrdw/astrocde.c @@ -114,7 +114,7 @@ PALETTE_INIT( astrocde ) B = 255; /* Round, and set the value */ - palette_set_color(i*8+j,floor(R+.5),floor(G+.5),floor(B+.5)); + palette_set_color(machine,i*8+j,floor(R+.5),floor(G+.5),floor(B+.5)); } } } @@ -336,19 +336,19 @@ WRITE8_HANDLER( profpac_screenram_ctrl_w ) { switch (offset) { - UINT8 r, g, b; + rgb_t color; case 0: /* port 0xC0 - red component */ - palette_get_color( (data>>4)&0x0f, &r, &g, &b); - palette_set_color( (data>>4)&0x0f, (data&0x0f)*0x11, g, b ); + color = palette_get_color(Machine, (data>>4)&0x0f); + palette_set_color(Machine, (data>>4)&0x0f, pal4bit(data), RGB_GREEN(color), RGB_BLUE(color) ); break; case 1: /* port 0xC1 - green component */ - palette_get_color( (data>>4)&0x0f, &r, &g, &b); - palette_set_color( (data>>4)&0x0f, r, (data&0x0f)*0x11, b ); + color = palette_get_color(Machine, (data>>4)&0x0f); + palette_set_color(Machine, (data>>4)&0x0f, RGB_RED(color), pal4bit(data), RGB_BLUE(color) ); break; case 2: /* port 0xC2 - blue component */ - palette_get_color( (data>>4)&0x0f, &r, &g, &b); - palette_set_color( (data>>4)&0x0f, r, g, (data&0x0f)*0x11 ); + color = palette_get_color(Machine, (data>>4)&0x0f); + palette_set_color(Machine, (data>>4)&0x0f, RGB_RED(color), RGB_GREEN(color), pal4bit(data) ); break; case 3: /* port 0xC3 - set 2bpp to 4bpp mapping */ profpac_color_mapping[(data>>4)&0x03] = data&0x0f; @@ -923,7 +923,7 @@ VIDEO_START( astrocde_stars ) { int res; - res = video_start_astrocde(); + res = video_start_astrocde(machine); sparkle[0][0] = 1; /* wow doesn't initialize this */ init_star_field(); @@ -1066,7 +1066,7 @@ VIDEO_UPDATE( seawolf2 ) int player = program_read_byte(0xc1fb); - video_update_astrocde(screen,bitmap,cliprect); + video_update_astrocde(machine,screen,bitmap,cliprect); /* Draw a sight */ diff --git a/src/vidhrdw/astrof.c b/src/vidhrdw/astrof.c index 39db9edfd..9c47936fc 100644 --- a/src/vidhrdw/astrof.c +++ b/src/vidhrdw/astrof.c @@ -67,7 +67,7 @@ static void modify_palette(void) col_index++; - palette_set_color(i,r,g,b); + palette_set_color(Machine,i,r,g,b); } } @@ -80,7 +80,8 @@ static void modify_palette(void) VIDEO_START( astrof ) { colorram = auto_malloc(videoram_size); - if (video_start_generic()) + memset(colorram, 0, videoram_size); + if (video_start_generic(machine)) return 1; do_modify_palette = 0; diff --git a/src/vidhrdw/atari.c b/src/vidhrdw/atari.c index b57926b47..4eb01d701 100644 --- a/src/vidhrdw/atari.c +++ b/src/vidhrdw/atari.c @@ -770,7 +770,7 @@ VIDEO_START( atari ) memset(antic.video[i], 0, sizeof(VIDEO)); } - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } /************************************************************************ @@ -782,7 +782,7 @@ VIDEO_UPDATE( atari ) { UINT32 new_tv_artifacts; - video_update_generic_bitmapped(screen, bitmap, cliprect); + video_update_generic_bitmapped(machine, screen, bitmap, cliprect); new_tv_artifacts = readinputportbytag_safe("artifacts", 0); if( tv_artifacts != new_tv_artifacts ) diff --git a/src/vidhrdw/atarifb.c b/src/vidhrdw/atarifb.c index 8c026249b..f20b8a916 100644 --- a/src/vidhrdw/atarifb.c +++ b/src/vidhrdw/atarifb.c @@ -48,7 +48,7 @@ WRITE8_HANDLER( atarifb_scroll_w ) VIDEO_START( atarifb ) { - if (video_start_generic()) + if (video_start_generic(machine)) return 1; memset(dirtybuffer, 1, videoram_size); diff --git a/src/vidhrdw/atarig1.c b/src/vidhrdw/atarig1.c index 5d5568605..fa2e51c55 100644 --- a/src/vidhrdw/atarig1.c +++ b/src/vidhrdw/atarig1.c @@ -159,7 +159,7 @@ void atarig1_scanline_update(int scanline) UINT16 *base = &atarigen_alpha[(scanline / 8) * 64 + 48]; int i; - if (scanline == 0) logerror("-------\n"); + //if (scanline == 0) logerror("-------\n"); /* keep in range */ if (base >= &atarigen_alpha[0x800]) diff --git a/src/vidhrdw/atarisy2.c b/src/vidhrdw/atarisy2.c index d7b184cf8..899b8f09e 100644 --- a/src/vidhrdw/atarisy2.c +++ b/src/vidhrdw/atarisy2.c @@ -241,7 +241,7 @@ WRITE16_HANDLER( atarisy2_paletteram_w ) red = (color_table[(newword >> 12) & 15] * inten) >> 4; green = (color_table[(newword >> 8) & 15] * inten) >> 4; blue = (color_table[(newword >> 4) & 15] * inten) >> 4; - palette_set_color(offset, red, green, blue); + palette_set_color(Machine, offset, red, green, blue); } diff --git a/src/vidhrdw/attckufo.c b/src/vidhrdw/attckufo.c index a60616095..ed8f8ade9 100644 --- a/src/vidhrdw/attckufo.c +++ b/src/vidhrdw/attckufo.c @@ -57,7 +57,7 @@ static UINT16 mono[2]; VIDEO_START( attckufo ) { mono[0]=0; - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } diff --git a/src/vidhrdw/avgdvg.c b/src/vidhrdw/avgdvg.c index 672421330..262c35a48 100644 --- a/src/vidhrdw/avgdvg.c +++ b/src/vidhrdw/avgdvg.c @@ -1,1148 +1,1415 @@ /************************************************************************* - avgdvg.c: Atari DVG and AVG simulators + avgdvg.c: Atari DVG and AVG - Copyright 1991, 1992, 1996 Eric Smith + Some parts of this code are based on the original version by Eric + Smith, Brad Oliver, Bernd Wiebelt, Aaron Giles, Andrew Caldwell - Modified for the MAME project 1997 by - Brad Oliver, Bernd Wiebelt, Aaron Giles, Andrew Caldwell + The Schematics and Jed Margolin's article on Vector Generators were + very helpful in understanding the hardware. - 971108 Disabled vector timing routines, introduced an ugly (but fast!) - busy flag hack instead. BW - 980202 New anti aliasing code by Andrew Caldwell (.ac) - 980206 New (cleaner) busy flag handling. - Moved LBO's buffered point into generic vector code. BW - 980212 Introduced timing code based on Aaron timer routines. BW - 980318 Better color handling, Bzone and MHavoc clipping. BW - Battlezone uses a red overlay for the top of the screen and a green one - for the rest. There is a circuit to clip color 0 lines extending to the - red zone. This is emulated now. Thanks to Neil Bradley for the info. BW - - Frame and interrupt rates (Neil Bradley) BW - ~60 fps/4.0ms: Asteroid, Asteroid Deluxe - ~40 fps/4.0ms: Lunar Lander - ~40 fps/4.1ms: Battle Zone - ~45 fps/5.4ms: Space Duel, Red Baron - ~30 fps/5.4ms: StarWars - - Games with self adjusting framerate - 4.1ms: Black Widow, Gravitar - 4.1ms: Tempest - Major Havoc - Quantum - - TODO: accurate vector timing (need timing diagramm) - -************************************************************************/ +**************************************************************************/ #include "driver.h" #include "avgdvg.h" #include "vector.h" -//#define VG_DEBUG -#ifdef VG_DEBUG -#define VGLOG(x) logerror x -#else -#define VGLOG(x) -#endif +/************************************* + * + * Global variables + * + *************************************/ + +UINT8 *tempest_colorram; +UINT8 *mhavoc_colorram; +UINT16 *quantum_colorram; + +UINT16 *quantum_vectorram; + +/* From vector.c */ +extern int vector_updates; /************************************* * - * Constants + * Macros and defines * *************************************/ -#define BRIGHTNESS 12 +#define MASTER_CLOCK (12096000) +#define VGSLICE (10000) +#define MAXVECT (10000) -#define MAXSTACK 8 /* Tempest needs more than 4 */ +#define VGVECTOR 0 +#define VGCLIP 1 -/* AVG commands */ -#define VCTR 0 -#define HALT 1 -#define SVEC 2 -#define STAT 3 -#define CNTR 4 -#define JSRL 5 -#define RTSL 6 -#define JMPL 7 -#define SCAL 8 +#define OP0 (vg->op & 1) +#define OP1 (vg->op & 2) +#define OP2 (vg->op & 4) +#define OP3 (vg->op & 8) -/* DVG commands */ -#define DVCTR 0x01 -#define DLABS 0x0a -#define DHALT 0x0b -#define DJSRL 0x0c -#define DRTSL 0x0d -#define DJMPL 0x0e -#define DSVEC 0x0f +#define ST3 (vg->state_latch & 8) +#define TWOSC(num,bits) ((INT32)((num) << (32 - (bits))) >> (32 - (bits))) /************************************* * - * Static variables + * Typedefs * *************************************/ -static UINT8 vector_engine; -static UINT8 flipword; -static UINT8 busy; -static rgb_t vcolorram[32]; - -static int width, height; -static int xcenter, ycenter; -static int xmin, xmax; -static int ymin, ymax; +typedef struct _vgvector +{ + int x; int y; + rgb_t color; + int intensity; + int arg1; int arg2; + int status; +} vgvector; + +typedef struct _vgdata +{ + UINT16 pc; + UINT8 sp; + UINT16 dvx; + UINT16 dvy; + UINT8 dvy12; + UINT16 timer; + UINT16 stack[4]; + UINT16 data; + + UINT8 state_latch; + UINT8 int_latch; + UINT8 scale; + UINT8 bin_scale; + UINT8 intensity; + UINT8 color; + UINT8 enspkl; + UINT8 map; + + UINT16 hst; + UINT16 lst; + UINT16 izblank; + + UINT8 op; + UINT8 halt; + UINT8 sync_halt; + + INT32 xpos; + INT32 ypos; + + INT32 clipx_min; + INT32 clipy_min; + INT32 clipx_max; + INT32 clipy_max; + + UINT8 *state_prom; +} vgdata; + +typedef struct _vgconf +{ + int (*handler[8])(vgdata *); + UINT8 (*state_addr)(vgdata *); + void (*update_databus)(vgdata *); + void (*vggo)(vgdata *); + void (*vgrst)(vgdata *); +} vgconf; -static int flip_x, flip_y, swap_xy; -extern int vector_updates; /* avgdvg_go_w()'s per Mame frame, should be 1 */ +/************************************* + * + * Static variables + * + *************************************/ +static int xmin, xmax, ymin, ymax; +static int xcenter, ycenter; +static mame_timer *vg_run_timer, *vg_halt_timer; -#define BANK_SIZE (0x2000) -#define NUM_BANKS (2) -static unsigned char *vectorbank[NUM_BANKS]; +static int flip_x, flip_y; +static vgdata vgd, *vg; +static vgconf *vgc; +static int nvect; +static vgvector vectbuf[MAXVECT]; /************************************* * - * Compute 2's complement value + * Flipping * *************************************/ -INLINE int twos_comp_val(int num, int bits) +void avg_set_flip_x(int flip) { - return (INT32)(num << (32 - bits)) >> (32 - bits); + flip_x = flip; } +void avg_set_flip_y(int flip) +{ + flip_y = flip; +} + +static void avg_apply_flipping(int *x, int *y) +{ + if (flip_x) + *x += (xcenter - *x) << 1; + if (flip_y) + *y += (ycenter - *y) << 1; +} /************************************* * - * Vector RAM accesses + * Vector buffering * *************************************/ -INLINE UINT16 vector_word(UINT16 offset) +static void vg_flush (void) { - UINT8 *base; + int i; - /* convert from word offset to byte */ - offset *= 2; + for (i = 0; i < nvect; i++) + { + if (vectbuf[i].status == VGVECTOR) + vector_add_point(vectbuf[i].x, vectbuf[i].y, vectbuf[i].color, vectbuf[i].intensity); - /* get address of the word */ - base = &vectorbank[offset / BANK_SIZE][offset % BANK_SIZE]; + if (vectbuf[i].status == VGCLIP) + vector_add_clip(vectbuf[i].x, vectbuf[i].y, vectbuf[i].arg1, vectbuf[i].arg2); + } - /* result is based on flipword */ - if (flipword) - return base[1] | (base[0] << 8); - else - return base[0] | (base[1] << 8); + nvect=0; } +static void vg_add_point_buf(int x, int y, rgb_t color, int intensity) +{ + if (nvect < MAXVECT) + { + vectbuf[nvect].status = VGVECTOR; + vectbuf[nvect].x = x; + vectbuf[nvect].y = y; + vectbuf[nvect].color = color; + vectbuf[nvect].intensity = intensity; + nvect++; + } +} + +static void vg_add_clip (int xmin, int ymin, int xmax, int ymax) +{ + if (nvect < MAXVECT) + { + vectbuf[nvect].status = VGCLIP; + vectbuf[nvect].x = xmin; + vectbuf[nvect].y = ymin; + vectbuf[nvect].arg1 = xmax; + vectbuf[nvect].arg2 = ymax; + nvect++; + } +} /************************************* * - * Vector timing + * DVG handler functions * *************************************/ -INLINE int vector_timer(int deltax, int deltay) +static void dvg_data(vgdata *vg) { - deltax = abs(deltax); - deltay = abs(deltay); - if (deltax > deltay) - return deltax >> 16; - else - return deltay >> 16; + /* + * DVG uses low bit of state for address + */ + vg->data = vectorram[(vg->pc << 1) | (vg->state_latch & 1)]; } - -INLINE int dvg_vector_timer(int scale) +static UINT8 dvg_state_addr(vgdata *vg) { - return scale; -} + UINT8 addr; + addr =((((vg->state_latch >> 4) ^ 1) & 1) << 7) | (vg->state_latch & 0xf); + if (OP3) + addr |= ((vg->op & 7) << 4); -/************************************* - * - * AVG brightness computation - * - *************************************/ + return addr; +} -INLINE int effective_z(int z, int statz) +static int dvg_dmapush(vgdata *vg) { - /* Star Wars blends Z and an 8-bit STATZ */ - /* STATZ of 128 should give highest intensity */ - if (vector_engine == USE_AVG_SWARS) + if (OP0 == 0) { - z = (z * statz) / 8; - if (z > 0xff) - z = 0xff; + vg->sp = (vg->sp + 1) & 0xf; + vg->stack[vg->sp & 3] = vg->pc; } + return 0; +} - /* everyone else uses this */ +static int dvg_dmald(vgdata *vg) +{ + if (OP0) + { + vg->pc = vg->stack[vg->sp & 3]; + vg->sp = (vg->sp - 1) & 0xf; + } else { - /* special case for Alpha One -- no idea if this is right */ - if (vector_engine == USE_AVG_ALPHAONE) - { - if (z) - z ^= 0x15; - } - - /* Z == 2 means use the value from STATZ */ - else if (z == 2) - z = statz; - - z *= BRIGHTNESS; + vg->pc = vg->dvy; } - return z; + return 0; } +static void dvg_draw_to(int x, int y, int intensity) +{ + if (((x | y) & 0x400) == 0) + vg_add_point_buf(xcenter - ((0x200 - x) << 16), + ycenter + ((0x200 - y) << 16), + VECTOR_COLOR111(7), intensity << 4); +} - -/************************************* - * - * DVG vector generator - * - *************************************/ - -static int dvg_generate_vector_list(void) +static int dvg_gostrobe(vgdata *vg) { - static const char *dvg_mnem[] = + int scale, fin, dx, dy, c, mx, my, countx, county, bit, cycles; + + if (vg->op == 0xf) { - "????", "vct1", "vct2", "vct3", - "vct4", "vct5", "vct6", "vct7", - "vct8", "vct9", "labs", "halt", - "jsrl", "rtsl", "jmpl", "svec" - }; - - int stack[MAXSTACK]; - int pc = 0; - int sp = 0; - int scale = 0; - int currentx = 0, currenty = 0; - int total_length = 1; - int done = 0; - - int firstwd, secondwd = 0; - int opcode; - int x, y, z, temp, a; - int deltax, deltay; - - /* reset the vector list */ - vector_clear_list(); - - /* loop until finished */ - while (!done) + + scale = (vg->scale + + (((vg->dvy & 0x800) >> 11) + | (((vg->dvx & 0x800) ^ 0x800) >> 10) + | ((vg->dvx & 0x800) >> 9))) & 0xf; + + vg->dvy &= 0xf00; + vg->dvx &= 0xf00; + } + else { - /* fetch the first word and get its opcode */ - firstwd = vector_word(pc++); - opcode = firstwd >> 12; + scale = (vg->scale + vg->op) & 0xf; + } + + if (scale > 9) + fin = 1; + else + fin = 0x1000 - ((2 << scale) ^ 0xfff); + - /* the DVCTR and DLABS opcodes take two words */ - if (opcode >= 0 && opcode <= DLABS) - secondwd = vector_word(pc++); + /* Count up or down */ + dx = (vg->dvx & 0x400)? -1: +1; + dy = (vg->dvy & 0x400)? -1: +1; - /* debugging */ - VGLOG(("%4x: %4x ", pc, firstwd)); - if (opcode <= DLABS) + /* Scale factor for rate multipliers */ + mx = (vg->dvx << 2) & 0xfff; + my = (vg->dvy << 2) & 0xfff; + + cycles = 8 * fin; + c=0; + while (fin--) + { + + /* + * The 7497 Bit Rate Multiplier is a 6 bit counter with + * clever decoding of output bits to perform the following + * operation: + * + * fout = m/64 * fin + * + * where fin is the input frequency, fout is the output + * frequency and m is a factor at the input pins. Output + * pulses are more or less evenly spaced so we get straight + * lines. The DVG has two cascaded 7497s for each coordinate. + */ + + countx = 0; + county = 0; + + for (bit = 0; bit < 12; bit++) { - (void)dvg_mnem; - VGLOG(("%s ", dvg_mnem[opcode])); - VGLOG(("%4x ", secondwd)); + if ((c & ((1 << (bit+1)) - 1)) == (1 << bit)) + { + if (mx & (1 << (11 - bit))) + countx = 1; + + if (my & (1 << (11 - bit))) + county = 1; + } } - /* switch off the opcode */ - switch (opcode) + c = (c + 1) & 0xfff; + + /* + * Since x- and y-counters always hold the correct count + * wrt. to each other, we can do clipping exactly like the + * hardware does. That is, as soon as any counter's bit 10 + * changes to high, we finish the vector. If bit 10 changes + * from high to low, we start a new vector. + */ + + if (countx) { - /* 0 is an invalid opcode */ - case 0: - VGLOG(("Error: DVG opcode 0! Addr %4x Instr %4x %4x\n", pc-2, firstwd, secondwd)); -#ifdef VG_DEBUG - done = 1; - break; -#endif - - /* 1-9 are DVCTR ops: draw a vector */ - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - - /* compute raw X and Y values */ - y = firstwd & 0x03ff; - x = secondwd & 0x3ff; - if (firstwd & 0x400) - y = -y; - if (secondwd & 0x400) - x = -x; - - /* determine the brightness */ - z = secondwd >> 12; - VGLOG(("(%d,%d) z: %d scal: %d", x, y, z, opcode)); - - /* compute the effective brightness */ - z = effective_z(z, z); - - /* determine the scale factor; scale 9 means -1 */ - temp = ((scale + opcode) & 0x0f); - if (temp > 9) - temp = -1; - - /* compute the deltas */ - deltax = (x << 16) >> (9-temp); - deltay = (y << 16) >> (9-temp); - - /* adjust the current position and compute timing */ - currentx += deltax; - currenty -= deltay; - total_length += dvg_vector_timer(temp); - - /* add the new point */ - vector_add_point(currentx, currenty, vcolorram[1], z); - break; - - /* DSVEC: draw a short vector */ - case DSVEC: - - /* compute raw X and Y values */ - y = firstwd & 0x0300; - x = (firstwd & 0x03) << 8; - if (firstwd & 0x0400) - y = -y; - if (firstwd & 0x04) - x = -x; - - /* determine the brightness */ - z = (firstwd >> 4) & 0x0f; - - /* compute the effective brightness */ - z = effective_z(z, z); - - /* determine the scale factor; scale 9 means -1 */ - temp = 2 + ((firstwd >> 2) & 0x02) + ((firstwd >> 11) & 0x01); - temp = (scale + temp) & 0x0f; - if (temp > 9) - temp = -1; - VGLOG(("(%d,%d) z: %d scal: %d", x, y, z, temp)); - - /* compute the deltas */ - deltax = (x << 16) >> (9 - temp); - deltay = (y << 16) >> (9 - temp); - - /* adjust the current position and compute timing */ - currentx += deltax; - currenty -= deltay; - total_length += dvg_vector_timer(temp); - - /* add the new point */ - vector_add_point(currentx, currenty, vcolorram[1], z); - break; - - /* DLABS: move to an absolute location */ - case DLABS: - - /* extract the new X,Y coordinates */ - y = twos_comp_val(firstwd, 12); - x = twos_comp_val(secondwd, 12); - - /* global scale comes from upper 4 bits of second word */ - scale = secondwd >> 12; - - /* set the current X,Y */ - currentx = (x - xmin) << 16; - currenty = (ymax - y) << 16; - VGLOG(("(%d,%d) scal: %d", x, y, secondwd >> 12)); - break; - - /* DRTSL: return from subroutine */ - case DRTSL: - - /* handle stack underflow */ - if (sp == 0) - { - logerror("\n*** Vector generator stack underflow! ***\n"); - done = 1; - sp = MAXSTACK - 1; - } - else - sp--; - - /* pull the new PC from the stack */ - pc = stack[sp]; - - /* debugging */ - if (firstwd & 0x1fff) - VGLOG(("(%d?)", firstwd & 0x1fff)); - break; - - /* DHALT: all done! */ - case DHALT: - done = 1; - - /* debugging */ - if (firstwd & 0x1fff) - VGLOG(("(%d?)", firstwd & 0x0fff)); - break; - - /* DJMPL: jump to a new program location */ - case DJMPL: - a = firstwd & 0x0fff; - VGLOG(("%4x", a)); - pc = a; - - if (!pc) - done=1; - break; - - /* DJSRL: jump to a new program location as subroutine */ - case DJSRL: - a = firstwd & 0x0fff; - VGLOG(("%4x", a)); - - /* push the next PC on the stack */ - stack[sp] = pc; - - /* check for stack overflows */ - if (sp == (MAXSTACK - 1)) - { - logerror("\n*** Vector generator stack overflow! ***\n"); - done = 1; - sp = 0; - } + /* Is y valid and x entering or leaving the valid range? */ + if (((vg->ypos & 0x400) == 0) + && ((vg->xpos ^ (vg->xpos + dx)) & 0x400)) + { + if ((vg->xpos + dx) & 0x400) + /* We are leaving the valid range */ + dvg_draw_to(vg->xpos, vg->ypos, vg->intensity); else - sp++; - - /* jump to the new location */ - pc = a; - break; + /* We are entering the valid range */ + dvg_draw_to((vg->xpos + dx) & 0xfff, vg->ypos, 0); + } + vg->xpos = (vg->xpos + dx) & 0xfff; + } - /* anything else gets caught here */ - default: - logerror("Unknown DVG opcode found\n"); - done = 1; + if (county) + { + if (((vg->xpos & 0x400) == 0) + && ((vg->ypos ^ (vg->ypos + dy)) & 0x400)) + { + if ((vg->xpos & 0x400) == 0) + { + if ((vg->ypos + dy) & 0x400) + dvg_draw_to(vg->xpos, vg->ypos, vg->intensity); + else + dvg_draw_to(vg->xpos, (vg->ypos + dy) & 0xfff, 0); + } + } + vg->ypos = (vg->ypos + dy) & 0xfff; } - VGLOG(("\n")); + } - /* return the total length of everything drawn */ - return total_length; + dvg_draw_to(vg->xpos, vg->ypos, vg->intensity); + + return cycles; } -void avg_set_flip_x(int flip) +static int dvg_haltstrobe(vgdata *vg) { - if (flip) - flip_x = 1; - else - flip_x = 0; + vg->halt = OP0; + + if (OP0 == 0) + { + vg->xpos = vg->dvx & 0xfff; + vg->ypos = vg->dvy & 0xfff; + dvg_draw_to(vg->xpos, vg->ypos, 0); + } + return 0; } -void avg_set_flip_y(int flip) +static int dvg_latch3(vgdata *vg) { - if (flip) - flip_y = 1; - else - flip_y = 0; + vg->dvx = (vg->dvx & 0xff) | ((vg->data & 0xf) << 8); + vg->intensity = vg->data >> 4; + return 0; } -void avg_apply_flipping_and_swapping(int *x, int *y) +static int dvg_latch2(vgdata *vg) { - if (flip_x) - *x += (xcenter-*x)<<1; - if (flip_y) - *y += (ycenter-*y)<<1; + vg->dvx &= 0xf00; + if (vg->op != 0xf) + vg->dvx = (vg->dvx & 0xf00) | vg->data; + + if ((vg->op & 0xa) == 0xa) + vg->scale = vg->intensity; + + vg->pc++; + return 0; +} - if (swap_xy) +static int dvg_latch1(vgdata *vg) +{ + vg->dvy = (vg->dvy & 0xff) + | ((vg->data & 0xf) << 8); + vg->op = vg->data >> 4; + + if (vg->op == 0xf) { - int temp = *x; - *x = *y - ycenter + xcenter; - *y = temp - xcenter + ycenter; + vg->dvx &= 0xf00; + vg->dvy &= 0xf00; } + + return 0; } -void avg_add_point(int x, int y, rgb_t color, int intensity) +static int dvg_latch0(vgdata *vg) { - avg_apply_flipping_and_swapping(&x, &y); - vector_add_point(x, y, color, intensity); + vg->dvy &= 0xf00; + if (vg->op == 0xf) + dvg_latch3(vg); + else + vg->dvy = (vg->dvy & 0xf00) | vg->data; + + vg->pc++; + return 0; } -/************************************* + +/******************************************************************** * - * AVG vector generator + * AVG handler functions * - ************************************* - - Atari Analog Vector Generator Instruction Set - - Compiled from Atari schematics and specifications - Eric Smith 7/2/92 - --------------------------------------------- - - NOTE: The vector generator is little-endian. The instructions are 16 bit - words, which need to be stored with the least significant byte in the - lower (even) address. They are shown here with the MSB on the left. - - The stack allows four levels of subroutine calls in the TTL version, but only - three levels in the gate array version. - - inst bit pattern description - ---- ------------------- ------------------- - VCTR 000- yyyy yyyy yyyy normal vector - zzz- xxxx xxxx xxxx - HALT 001- ---- ---- ---- halt - does CNTR also on newer hardware - SVEC 010y yyyy zzzx xxxx short vector - don't use zero length - STAT 0110 ---- zzzz cccc status - SCAL 0111 -bbb llll llll scaling - CNTR 100- ---- dddd dddd center - JSRL 101a aaaa aaaa aaaa jump to subroutine - RTSL 110- ---- ---- ---- return - JMPL 111a aaaa aaaa aaaa jump - - - unused bits - x, y relative x and y coordinates in two's complement (5 or 13 bit, - 5 bit quantities are scaled by 2, so x=1 is really a length 2 vector. - z intensity, 0 = blank, 1 means use z from STAT instruction, 2-7 are - doubled for actual range of 4-14 - c color - b binary scaling, multiplies all lengths by 2**(1-b), 0 is double size, - 1 is normal, 2 is half, 3 is 1/4, etc. - l linear scaling, multiplies all lengths by 1-l/256, don't exceed $80 - d delay time, use $40 - a address (word address relative to base of vector memory) - - Notes: - - Quantum: - the VCTR instruction has a four bit Z field, that is not - doubled. The value 2 means use Z from STAT instruction. - - the SVEC instruction can't be used - - Major Havoc: - SCAL bit 11 is used for setting a Y axis window. - - STAT bit 11 is used to enable "sparkle" color. - STAT bit 10 inverts the X axis of vectors. - STAT bits 9 and 8 are the Vector ROM bank select. - - Star Wars: - STAT bits 10, 9, and 8 are used directly for R, G, and B. + * AVG is in many ways different from DVG. The only thing they have + * in common is the state machine approach. There are small + * differences among the AVGs, mostly related to color and vector + * clipping. + * + *******************************************************************/ - *************************************/ +static void avg_data(vgdata *vg) +{ + vg->data = vectorram[vg->pc ^ 1]; +} + +static void starwars_data(vgdata *vg) +{ + vg->data = vectorram[vg->pc]; +} -static int avg_generate_vector_list(void) +static void quantum_data(vgdata *vg) { - static const char *avg_mnem[] = + vg->data = quantum_vectorram[vg->pc >> 1]; +} + +static void mhavoc_data(vgdata *vg) +{ + UINT8 *bank; + + if (vg->pc & 0x2000) { - "vctr", "halt", "svec", "stat", "cntr", - "jsrl", "rtsl", "jmpl", "scal" - }; - - int stack[MAXSTACK]; - int pc = 0; - int sp = 0; - int scale = 0; - int statz = 0; - int sparkle = 0; - int xflip = 0; - int color = 0; - int ywindow = 1; - int currentx = xcenter; - int currenty = ycenter; - int total_length = 1; - int done = 0; - - int firstwd, secondwd = 0; - int opcode; - int x, y, z = 0, b, l, d, a; - int deltax, deltay; - - /* check for zeroed vector RAM */ - if (vector_word(pc) == 0 && vector_word(pc + 1) == 0) + bank = &memory_region(REGION_CPU1)[0x18000]; + vg->data = bank[(vg->map << 13) | ((vg->pc ^ 1) & 0x1fff)]; + } + else { - logerror("VGO with zeroed vector memory\n"); - return total_length; + vg->data = vectorram[vg->pc ^ 1]; } +} - /* kludge to bypass Major Havoc's empty frames */ - if ((vector_engine == USE_AVG_MHAVOC || vector_engine == USE_AVG_ALPHAONE) && vector_word(pc) == 0xafe2) - return total_length; - - /* reset the vector list */ - vector_clear_list(); +static UINT8 avg_state_addr(vgdata *vg) +{ + return (((vg->state_latch >> 4) ^ 1) << 7) + | (vg->op << 4) + | (vg->state_latch & 0xf); +} - /* loop until finished... */ - while (!done) - { - /* fetch the first word and get its opcode */ - firstwd = vector_word(pc++); - opcode = firstwd >> 13; - - /* the VCTR opcode takes two words */ - if (opcode == VCTR) - secondwd = vector_word(pc++); - - /* SCAL is a variant of STAT; convert it here */ - else if (opcode == STAT && (firstwd & 0x1000)) - opcode = SCAL; - - /* debugging */ - (void)avg_mnem; - VGLOG(("%4x: %4x ", pc, firstwd)); - if (opcode == VCTR) - VGLOG(("%4x ", secondwd)); - else - VGLOG((" ")); - VGLOG(("%s ", avg_mnem[opcode])); +static int avg_latch0(vgdata *vg) +{ + vg->dvy = (vg->dvy & 0x1f00) | vg->data; + vg->pc++; - /* switch off the opcode */ - switch (opcode) - { - /* VCTR: draw a long vector */ - case VCTR: + return 0; +} - /* Quantum uses 12-bit vectors and a 4-bit Z value */ - if (vector_engine == USE_AVG_QUANTUM) - { - x = twos_comp_val(secondwd, 12); - y = twos_comp_val(firstwd, 12); - z = (secondwd >> 12) & 0x0f; - } +static int quantum_st2st3(vgdata *vg) +{ + /* Quantum doesn't decode latch0 or latch2 but ST2 and ST3 are fed + * into the address controller which incremets the PC + */ + vg->pc++; + return 0; +} - /* everyone else uses 13-bit vectors and a 3-bit Z value */ - else - { - x = twos_comp_val(secondwd, 13); - y = twos_comp_val(firstwd, 13); - z = (secondwd >> 12) & 0x0e; - } +static int avg_latch1(vgdata *vg) +{ + vg->dvy12 = (vg->data >> 4) &1; + vg->op = vg->data >> 5; - /* compute the effective brightness */ - z = effective_z(z, statz); + vg->int_latch = 0; + vg->dvy = (vg->dvy12 << 12) + | ((vg->data & 0xf) << 8 ); + vg->dvx = 0; + vg->pc++; - /* compute the deltas */ - deltax = x * scale; - deltay = y * scale; - if (xflip) deltax = -deltax; + return 0; +} - /* adjust the current position and compute timing */ - currentx += deltax; - currenty -= deltay; - total_length += vector_timer(deltax, deltay); +static int quantum_latch1(vgdata *vg) +{ + vg->dvy = vg->data & 0x1fff; + vg->dvy12 = (vg->data >> 12) & 1; + vg->op = vg->data >> 13; - /* add the new point */ - if (sparkle) - avg_add_point(currentx, currenty, vcolorram[16 + ((rand() >> 8) & 15)], z); - else - avg_add_point(currentx, currenty, vcolorram[color], z); - VGLOG(("VCTR x:%d y:%d z:%d statz:%d", x, y, z, statz)); - break; - - /* SVEC: draw a short vector */ - case SVEC: - - /* Quantum doesn't support this */ - if (vector_engine == USE_AVG_QUANTUM) - break; - - /* two 5-bit vectors plus a 3-bit Z value */ - x = twos_comp_val(firstwd, 5) * 2; - y = twos_comp_val(firstwd >> 8, 5) * 2; - z = (firstwd >> 4) & 0x0e; - - /* compute the effective brightness */ - z = effective_z(z, statz); - - /* compute the deltas */ - deltax = x * scale; - deltay = y * scale; - if (xflip) deltax = -deltax; - - /* adjust the current position and compute timing */ - currentx += deltax; - currenty -= deltay; - total_length += vector_timer(deltax, deltay); - - /* add the new point */ - if (sparkle) - avg_add_point(currentx, currenty, vcolorram[16 + ((rand() >> 8) & 15)], z); - else - avg_add_point(currentx, currenty, vcolorram[color], z); - VGLOG(("SVEC x:%d y:%d z:%d statz:%d", x, y, z, statz)); - break; + vg->int_latch = 0; + vg->dvx = 0; + vg->pc++; - /* STAT: control colors, clipping, sparkling, and flipping */ - case STAT: + return 0; +} - /* Star Wars takes RGB directly and has an 8-bit brightness */ - if (vector_engine == USE_AVG_SWARS) - { - color = (firstwd >> 8) & 7; - statz = firstwd & 0xff; - } +static int bzone_latch1(vgdata *vg) +{ + /* + * Battle Zone has clipping hardware. We need to remember the + * position of the beam when the analog switches hst or lst get + * turened off. + */ - /* everyone else has a 4-bit color and 4-bit brightness */ - else - { - color = firstwd & 0x0f; - statz = (firstwd >> 4) & 0x0f; - } + if (vg->hst == 0) + { + vg->clipx_max = vg->xpos; + vg->clipy_min = vg->ypos; + } - /* Tempest has the sparkle bit in bit 11 */ - if (vector_engine == USE_AVG_TEMPEST) - sparkle = !(firstwd & 0x0800); + if (vg->lst == 0) + { + vg->clipx_min = vg->xpos; + vg->clipy_max = vg->ypos; + } - /* Major Havoc/Alpha One have sparkle bit, xflip, and banking */ - else if (vector_engine == USE_AVG_MHAVOC || vector_engine == USE_AVG_ALPHAONE) - { - sparkle = firstwd & 0x0800; - xflip = firstwd & 0x0400; - vectorbank[1] = &memory_region(REGION_CPU1)[0x18000 + ((firstwd >> 8) & 3) * 0x2000]; - } + if (vg->lst==0 || vg->hst==0) + { + vg_add_clip(vg->clipx_min, vg->clipy_min, vg->clipx_max, vg->clipy_max); + } + vg->lst = vg->hst = 1; - /* BattleZone has a clipping circuit */ - else if (vector_engine == USE_AVG_BZONE) - { - int newymin = (color == 0) ? 0x0050 : ymin; - vector_add_clip(xmin << 16, newymin << 16, - xmax << 16, ymax << 16); - } + return avg_latch1(vg); +} - /* debugging */ - VGLOG(("STAT: statz: %d color: %d", statz, color)); - if (xflip || sparkle) - VGLOG(("xflip: %02x sparkle: %02x\n", xflip, sparkle)); - break; - - /* SCAL: set the scale factor */ - case SCAL: - b = ((firstwd >> 8) & 7) + 8; - l = ~firstwd & 0xff; - scale = (l << 16) >> b; - - /* Y-Window toggle for Major Havoc */ - if (vector_engine == USE_AVG_MHAVOC || vector_engine == USE_AVG_ALPHAONE) - if (firstwd & 0x0800) - { - int newymin = ymin; - logerror("CLIP %d\n", firstwd & 0x0800); - - /* toggle the current state */ - ywindow = !ywindow; - - /* adjust accordingly */ - if (ywindow) - newymin = (vector_engine == USE_AVG_MHAVOC) ? 0x0048 : 0x0083; - vector_add_clip(xmin << 16, newymin << 16, - xmax << 16, ymax << 16); - } - - /* debugging */ - VGLOG(("bin: %d, lin: ", b)); - if (l > 0x80) - VGLOG(("(%d?)", l)); - else - VGLOG(("%d", l)); - VGLOG((" scale: %f", (scale/(float)(1<<16)))); - break; +static int mhavoc_latch1(vgdata *vg) +{ + /* + * Major Havoc just has ymin clipping + */ - /* CNTR: center the beam */ - case CNTR: + if (vg->lst == 0) + { + vg_add_clip(0, vg->ypos, xmax << 16, ymax << 16); + } + vg->lst = 1; - /* delay stored in low 8 bits; normally is 0x40 */ - d = firstwd & 0xff; - if (d != 0x40) VGLOG(("%d", d)); + return avg_latch1(vg); +} - /* move back to the middle */ - currentx = xcenter; - currenty = ycenter; - avg_add_point(currentx, currenty, 0, 0); - break; +static int avg_latch2(vgdata *vg) +{ + vg->dvx = (vg->dvx & 0x1f00) | vg->data; + vg->pc++; - /* RTSL: return from subroutine */ - case RTSL: + return 0; +} - /* handle stack underflow */ - if (sp == 0) - { - logerror("\n*** Vector generator stack underflow! ***\n"); - done = 1; - sp = MAXSTACK - 1; - } - else - sp--; +static int avg_latch3(vgdata *vg) +{ + vg->int_latch = vg->data >> 4; + vg->dvx = ((vg->int_latch & 1) << 12) + | ((vg->data & 0xf) << 8 ) + | (vg->dvx & 0xff); + vg->pc++; - /* pull the new PC from the stack */ - pc = stack[sp]; + return 0; +} - /* debugging */ - if (firstwd & 0x1fff) - VGLOG(("(%d?)", firstwd & 0x1fff)); - break; +static int quantum_latch3(vgdata *vg) +{ + vg->int_latch = vg->data >> 12; + vg->dvx = vg->data & 0xfff; + vg->pc++; - /* HALT: all done! */ - case HALT: - done = 1; + return 0; +} - /* debugging */ - if (firstwd & 0x1fff) - VGLOG(("(%d?)", firstwd & 0x1fff)); - break; - /* JMPL: jump to a new program location */ - case JMPL: - a = firstwd & 0x1fff; - VGLOG(("%4x", a)); +static int avg_strobe0(vgdata *vg) +{ + int i; - /* if a = 0x0000, treat as HALT */ - if (a == 0x0000) - done = 1; - else - pc = a; - break; + if (OP0) + { + vg->stack[vg->sp & 3] = vg->pc; + } + else + { + /* + * Normalization is done to get roughly constant deflection + * speeds. See Jed's essay why this is important. In addition + * to the intensity and overall time saving issues it is also + * needed to avoid accumulation of DAC errors. The X/Y DACs + * only use bits 3-12. The normalization ensures that the + * first three bits hold no important information. + * + * The circuit doesn't check for dvx=dvy=0. In this case + * shifting goes on as long as VCTR, SCALE and CNTR are + * low. We cut off after 16 shifts. + */ + i = 0; + while ((((vg->dvy ^ (vg->dvy << 1)) & 0x1000) == 0) + && (((vg->dvx ^ (vg->dvx << 1)) & 0x1000) == 0) + && (i++ < 16)) + { + vg->dvy = (vg->dvy & 0x1000) | ((vg->dvy << 1) & 0x1fff); + vg->dvx = (vg->dvx & 0x1000) | ((vg->dvx << 1) & 0x1fff); + vg->timer >>= 1; + vg->timer |= 0x4000 | (OP1 << 6); + } - /* JSRL: jump to a new program location as subroutine */ - case JSRL: - a = firstwd & 0x1fff; - VGLOG(("%4x", a)); + if (OP1) + vg->timer &= 0xff; + } - /* if a = 0x0000, treat as HALT */ - if (a == 0x0000) - done = 1; - else - { - /* push the next PC on the stack */ - stack[sp] = pc; - - /* check for stack overflows */ - if (sp == (MAXSTACK - 1)) - { - logerror("\n*** Vector generator stack overflow! ***\n"); - done = 1; - sp = 0; - } - else - sp++; + return 0; +} - /* jump to the new location */ - pc = a; - } - break; +static int quantum_strobe0(vgdata *vg) +{ + int i; - /* anything else gets caught here */ - default: - logerror("internal error\n"); + if (OP0) + { + vg->stack[vg->sp & 3] = vg->pc; + } + else + { + /* + * Quantum normalizes to 12 bit + */ + i = 0; + while ((((vg->dvy ^ (vg->dvy << 1)) & 0x800) == 0) + && (((vg->dvx ^ (vg->dvx << 1)) & 0x800) == 0) + && (i++ < 16)) + { + vg->dvy = (vg->dvy << 1) & 0xfff; + vg->dvx = (vg->dvx << 1) & 0xfff; + vg->timer >>= 1; + vg->timer |= 0x2000 ; } - VGLOG(("\n")); } - /* return the total length of everything drawn */ - return total_length; + return 0; } +static int avg_common_strobe1(vgdata *vg) +{ + if (OP2) + { + if (OP1) + vg->sp = (vg->sp - 1) & 0xf; + else + vg->sp = (vg->sp + 1) & 0xf; + } + return 0; +} +static int avg_strobe1(vgdata *vg) +{ + int i; -/************************************* - * - * AVG execution/busy detection - * - ************************************/ + if (OP2 == 0) + { + for (i = vg->bin_scale; i > 0; i--) + { + vg->timer >>= 1; + vg->timer |= 0x4000 | (OP1 << 6); + } + if (OP1) + vg->timer &= 0xff; + } -int avgdvg_done(void) + return avg_common_strobe1(vg); +} + +static int quantum_strobe1(vgdata *vg) { - return !busy; + int i; + + if (OP2 == 0) + { + for (i = vg->bin_scale; i > 0; i--) + { + vg->timer >>= 1; + vg->timer |= 0x2000; + } + } + + return avg_common_strobe1(vg); } +static int avg_common_strobe2(vgdata *vg) +{ + if (OP2) + { + if (OP0) + { + vg->pc = vg->dvy << 1; + + if (vg->dvy == 0) + { + /* + * Tempest and Quantum keep the AVG in an endless + * loop. I.e. at one point the AVG jumps to address 0 + * and starts over again. The main CPU updates vector + * RAM while AVG is running. The hardware takes care + * that the AVG dosen't read vector RAM while the CPU + * writes to it. Usually we wait until the AVG stops + * (halt flag) and then draw all vectors at once. This + * doesn't work for Tempest and Quantum so we wait for + * the jump to zero and draw vectors then. + * + * Note that this has nothing to do with the real hardware + * because for a vector monitor it is perfectly okay to + * have the AVG drawing all the time. In the emulation we + * somehow have to divide the stream of vectors into + * 'frames'. + */ + + vector_clear_list(); + vector_updates++; + vg_flush(); + } + } + else + { + vg->pc = vg->stack[vg->sp & 3]; + } + } + else + { + if (vg->dvy12) + { + vg->scale = vg->dvy & 0xff; + vg->bin_scale = (vg->dvy >> 8) & 7; + } + } -static void avgdvg_clr_busy(int dummy) + return 0; +} + +static int avg_strobe2(vgdata *vg) { - busy = 0; + if ((OP2 == 0) && (vg->dvy12 == 0)) + { + vg->color = vg->dvy & 0x7; + vg->intensity = (vg->dvy >> 4) & 0xf; + } + + return avg_common_strobe2(vg); } +static int mhavoc_strobe2(vgdata *vg) +{ + if (OP2 == 0) + { + if (vg->dvy12) + { + if (vg->dvy & 0x800) + vg->lst = 0; + } + else + { + vg->color = vg->dvy & 0xf; + + vg->intensity = (vg->dvy >> 4) & 0xf; + vg->map = (vg->dvy >> 8) & 0x3; -WRITE8_HANDLER( avgdvg_go_w ) + vg->enspkl = (vg->dvy & 0x800) >> 11; + } + } + + return avg_common_strobe2(vg); +} + +static int tempest_strobe2(vgdata *vg) { - int total_length; + if ((OP2 == 0) && (vg->dvy12 == 0)) + { + if (vg->dvy & 0x800) + vg->color = vg->dvy & 0xf; + else + vg->intensity = (vg->dvy >> 4) & 0xf; + } + + return avg_common_strobe2(vg); +} - /* skip if already busy */ - if (busy) - return; +static int quantum_strobe2(vgdata *vg) +{ + if ((OP2 == 0) && (vg->dvy12 == 0) && (vg->dvy & 0x800)) + { + vg->color = vg->dvy & 0xf; + vg->intensity = (vg->dvy >> 4) & 0xf; + } - /* count vector updates and mark ourselves busy */ - vector_updates++; - busy = 1; + return avg_common_strobe2(vg); +} - /* DVG case */ - if (vector_engine == USE_DVG) +static int starwars_strobe2(vgdata *vg) +{ + if ((OP2 == 0) && (vg->dvy12 == 0)) { - total_length = dvg_generate_vector_list(); - timer_set(TIME_IN_NSEC(4500) * total_length, 0, avgdvg_clr_busy); + vg->intensity = vg->dvy & 0xff; + vg->color = (vg->dvy >> 8) & 0xf; } - /* AVG case */ - else + return avg_common_strobe2(vg); +} + +static int bzone_strobe2(vgdata *vg) +{ + if ((OP2 == 0) && (vg->dvy12 == 0)) { - total_length = avg_generate_vector_list(); + vg->intensity = (vg->dvy >> 4) & 0xf; - /* for Major Havoc, we need to look for empty frames */ - if (total_length > 1) - timer_set(TIME_IN_NSEC(1500) * total_length, 0, avgdvg_clr_busy); - else + if (!(vg->dvy & 0x400)) { - vector_updates--; - busy = 0; + vg->lst = vg->dvy & 0x200; + vg->hst = vg->lst ^ 0x200; + /* + * If izblank is true the zblank signal gets + * inverted. This behaviour can't be handled with the + * clipping we have right now. Battle Zone doesn't seem to + * invert zblank so it's no issue. + */ + vg->izblank = vg->dvy & 0x100; } } + return avg_common_strobe2(vg); } - -WRITE16_HANDLER( avgdvg_go_word_w ) +static int avg_common_strobe3(vgdata *vg) { - avgdvg_go_w(offset, data); -} + int cycles=0; + vg->halt = OP0; + if ((vg->op & 5) == 0) + { + if (OP1) + { + cycles = 0x100 - (vg->timer & 0xff); + } + else + { + cycles = 0x8000 - vg->timer; + } + vg->timer = 0; -/************************************* - * - * AVG reset - * - ************************************/ + vg->xpos += (TWOSC(vg->dvx>>3, 10) * cycles * (vg->scale ^ 0xff)) >> 4; + vg->ypos -= (TWOSC(vg->dvy>>3, 10) * cycles * (vg->scale ^ 0xff)) >> 4; + } + if (OP2) + { + cycles = 0x8000 - vg->timer; + vg->timer = 0; + vg->xpos = xcenter; + vg->ypos = ycenter; + vg_add_point_buf(vg->xpos, vg->ypos, 0, 0); + } -WRITE8_HANDLER( avgdvg_reset_w ) -{ - avgdvg_clr_busy(0); + return cycles; + return 0; } +static int avg_strobe3(vgdata *vg) +{ + int cycles; -WRITE16_HANDLER( avgdvg_reset_word_w ) + cycles = avg_common_strobe3(vg); + + if ((vg->op & 5) == 0) + { + vg_add_point_buf(vg->xpos, vg->ypos, VECTOR_COLOR111(vg->color), + (((vg->int_latch >> 1) == 1)? vg->intensity: vg->int_latch & 0xe) << 4); + } + + return cycles; +} + +static int bzone_strobe3(vgdata *vg) { - avgdvg_clr_busy(0); + /* Battle Zone is B/W */ + int cycles; + + cycles = avg_common_strobe3(vg); + + if ((vg->op & 5) == 0) + { + vg_add_point_buf(vg->xpos, vg->ypos, VECTOR_COLOR111(7), + (((vg->int_latch >> 1) == 1)? vg->intensity: vg->int_latch & 0xe) << 4); + } + + return cycles; } +static int tempest_strobe3(vgdata *vg) +{ + int cycles, r, g, b, bit0, bit1, bit2, bit3, x, y; + UINT8 data; + cycles = avg_common_strobe3(vg); -/************************************* - * - * Vector generator init - * - ************************************/ + if ((vg->op & 5) == 0) + { + data = tempest_colorram[vg->color]; + bit3 = (~data >> 3) & 1; + bit2 = (~data >> 2) & 1; + bit1 = (~data >> 1) & 1; + bit0 = (~data >> 0) & 1; + + r = bit1 * 0xf3 + bit0 * 0x0c; + g = bit3 * 0xf3; + b = bit2 * 0xf3; + + x = vg->xpos; + y = vg->ypos; + + avg_apply_flipping(&x, &y); + + vg_add_point_buf(y - ycenter + xcenter, + x - xcenter + ycenter, MAKE_RGB(r, g, b), + (((vg->int_latch >> 1) == 1)? vg->intensity: vg->int_latch & 0xe) << 4); + } + + return cycles; +} -int avgdvg_init(int vector_type) +static int mhavoc_strobe3(vgdata *vg) { - int i; + int cycles, r, g, b, bit0, bit1, bit2, bit3; + + UINT8 data; + + cycles = avg_common_strobe3(vg); - /* 0 vector RAM size is invalid */ - if (vectorram_size == 0) + if ((vg->op & 5) == 0) { - logerror("Error: vectorram_size not initialized\n"); - return 1; + if (vg->enspkl) + data = mhavoc_colorram[16 + (mame_rand(Machine) & 0xf)]; + else + data = mhavoc_colorram[vg->color]; + + bit3 = (~data >> 3) & 1; + bit2 = (~data >> 2) & 1; + bit1 = (~data >> 1) & 1; + bit0 = (~data >> 0) & 1; + r = bit3 * 0xcb + bit2 * 0x34; + g = bit1 * 0xcb; + b = bit0 * 0xcb; + + vg_add_point_buf(vg->xpos, vg->ypos, MAKE_RGB(r, g, b), + (((vg->int_latch >> 1) == 1)? vg->intensity: vg->int_latch & 0xe) << 4); } - /* initialize the pages */ - for (i = 0; i < NUM_BANKS; i++) - vectorbank[i] = vectorram + i * BANK_SIZE; - if (vector_type == USE_AVG_MHAVOC || vector_type == USE_AVG_ALPHAONE) - vectorbank[1] = &memory_region(REGION_CPU1)[0x18000]; + return cycles; +} + +static int starwars_strobe3(vgdata *vg) +{ + int cycles; + + cycles = avg_common_strobe3(vg); - /* set the engine type and validate it */ - vector_engine = vector_type; - if (vector_engine < AVGDVG_MIN || vector_engine > AVGDVG_MAX) + if ((vg->op & 5) == 0) { - logerror("Error: unknown Atari Vector Game Type\n"); - return 1; + vg_add_point_buf(vg->xpos, vg->ypos, VECTOR_COLOR111(vg->color), + ((vg->int_latch >> 1) * vg->intensity) >> 3); } - /* Star Wars is reverse-endian */ - if (vector_engine == USE_AVG_SWARS) - flipword = 1; + return cycles; +} - /* Quantum may be reverse-endian depending on the platform */ -#ifndef LSB_FIRST - else if (vector_engine==USE_AVG_QUANTUM) - flipword = 1; -#endif +static int quantum_strobe3(vgdata *vg) +{ + int cycles=0, r, g, b, bit0, bit1, bit2, bit3, x, y; - /* everyone else is standard */ - else - flipword = 0; + UINT16 data; - /* clear the busy state */ - busy = 0; + vg->halt = OP0; - /* compute the min/max values */ - xmin = Machine->screen[0].visarea.min_x; - ymin = Machine->screen[0].visarea.min_y; - xmax = Machine->screen[0].visarea.max_x; - ymax = Machine->screen[0].visarea.max_y; - width = xmax - xmin; - height = ymax - ymin; + if ((vg->op & 5) == 0) + { + data = quantum_colorram[vg->color]; + bit3 = (~data >> 3) & 1; + bit2 = (~data >> 2) & 1; + bit1 = (~data >> 1) & 1; + bit0 = (~data >> 0) & 1; - /* determine the center points */ - xcenter = ((xmax + xmin) / 2) << 16; - ycenter = ((ymax + ymin) / 2) << 16; + g = bit1 * 0xaa + bit0 * 0x54; + b = bit2 * 0xce; + r = bit3 * 0xce; - /* initialize to no avg flipping */ - flip_x = flip_y = 0; + cycles = 0x4000 - vg->timer; + vg->timer = 0; - /* Tempest and Quantum have X and Y swapped */ - if ((vector_type == USE_AVG_TEMPEST) || - (vector_type == USE_AVG_QUANTUM)) - swap_xy = 1; - else - swap_xy = 0; + vg->xpos += (TWOSC((vg->dvx & 0xfff)>>2, 10) * cycles * (vg->scale ^ 0xff)) >> 4; + vg->ypos -= (TWOSC((vg->dvy & 0xfff)>>2, 10) * cycles * (vg->scale ^ 0xff)) >> 4; - return video_start_vector(); -} + x = vg->xpos; + y = vg->ypos; + avg_apply_flipping(&x, &y); + vg_add_point_buf(y - ycenter + xcenter, + x - xcenter + ycenter, MAKE_RGB(r, g, b), + ((vg->int_latch == 2)? vg->intensity: vg->int_latch) << 4); + } + if (OP2) + { + cycles = 0x4000 - vg->timer; + vg->timer = 0; + vg->xpos = xcenter; + vg->ypos = ycenter; + vg_add_point_buf(vg->xpos, vg->ypos, 0, 0); + } -/************************************* - * - * Video startup - * - ************************************/ + return cycles; +} -VIDEO_START( dvg ) +static void avg_vggo(vgdata *vg) { - return avgdvg_init(USE_DVG); + vg->pc = 0; + vg->sp = 0; } - -VIDEO_START( avg ) +static void dvg_vggo(vgdata *vg) { - return avgdvg_init(USE_AVG); + vg->dvy = 0; + vg->op = 0; } - -VIDEO_START( avg_starwars ) +static void avg_vgrst(vgdata *vg) { - return avgdvg_init(USE_AVG_SWARS); + vg->state_latch = 0; + vg->bin_scale = 0; + vg->scale = 0; + vg->color = 0; } +static void dvg_vgrst(vgdata *vg) +{ + vg->state_latch = 0; + vg->dvy = 0; + vg->op = 0; +} -VIDEO_START( avg_tempest ) +static void vg_set_halt(int dummy) { - return avgdvg_init(USE_AVG_TEMPEST); + vg->halt = dummy; + vg->sync_halt = dummy; } -VIDEO_START( avg_mhavoc ) +/******************************************************************** + * + * State Machine + * + * The state machine is a 256x4 bit PROM connected to a latch. The + * address of the next state is generated from the latched previous + * state, an op code and the halt flag. Op codes come from vector + * RAM/ROM. The state machine is clocked with 1.5 MHz. Three bits of + * the state are decoded and used to trigger various parts of the + * hardware. + * + *******************************************************************/ + +static void run_state_machine(int dummy) { - return avgdvg_init(USE_AVG_MHAVOC); + int cycles = 0; + + while (cycles < VGSLICE) + { + /* Get next state */ + vg->state_latch = (vg->state_latch & 0x10) + | (vg->state_prom[vgc->state_addr(vg)] & 0xf); + + if (ST3) + { + /* Read vector RAM/ROM */ + vgc->update_databus(vg); + + /* Decode state and call the corresponding handler */ + cycles += (vgc->handler[vg->state_latch & 7])(vg); + } + + /* If halt flag was set, let CPU catch up before we make halt visible */ + if (vg->halt && !(vg->state_latch & 0x10)) + timer_adjust(vg_halt_timer, TIME_IN_HZ(MASTER_CLOCK) * cycles, 1, 0); + + vg->state_latch = (vg->halt << 4) | (vg->state_latch & 0xf); + cycles += 8; + } + + timer_adjust(vg_run_timer, TIME_IN_HZ(MASTER_CLOCK) * cycles, 0, 0); } -VIDEO_START( avg_alphaone ) +/************************************* + * + * VG halt/vggo + * + ************************************/ + +int avgdvg_done(void) { - return avgdvg_init(USE_AVG_ALPHAONE); + return vg->sync_halt; } +WRITE8_HANDLER( avgdvg_go_w ) +{ + if (vg->sync_halt && (nvect > 10)) + { + /* + * This is a good time to start a new frame. Major Havoc + * sometimes sets VGGO after a very short vector list. That's + * why we ignore frames with less than 10 vectors. + */ + vector_clear_list(); + vector_updates++; + } + vg_flush(); + + vgc->vggo(vg); + vg_set_halt(0); + timer_adjust(vg_run_timer, TIME_NOW, 0, 0); +} -VIDEO_START( avg_bzone ) +WRITE16_HANDLER( avgdvg_go_word_w ) { - return avgdvg_init(USE_AVG_BZONE); + avgdvg_go_w(offset, data); } -VIDEO_START( avg_quantum ) +/************************************* + * + * Reset + * + ************************************/ + +WRITE8_HANDLER( avgdvg_reset_w ) { - return avgdvg_init(USE_AVG_QUANTUM); + vgc->vgrst(vg); + vg_set_halt(1); } - -VIDEO_START( avg_redbaron ) +WRITE16_HANDLER( avgdvg_reset_word_w ) { - return avgdvg_init(USE_AVG_RBARON); + avgdvg_reset_w (0,0); } +MACHINE_RESET( avgdvg ) +{ + avgdvg_reset_w (0,0); +} /************************************* * - * Palette generation + * Vector generator init * ************************************/ -/* Black and White vector colors for Asteroids, Lunar Lander, Omega Race */ -PALETTE_INIT( avg_white ) +static int avgdvg_init(void) { - int i; - for (i = 0; i < 32; i++) - vcolorram[i] = MAKE_RGB(0xff, 0xff, 0xff); -} + xmin = Machine->screen[0].visarea.min_x; + ymin = Machine->screen[0].visarea.min_y; + xmax = Machine->screen[0].visarea.max_x; + ymax = Machine->screen[0].visarea.max_y; + xcenter = ((xmax + xmin) / 2) << 16; + ycenter = ((ymax + ymin) / 2) << 16; -/* Basic 8 rgb vector colors for Tempest, Gravitar, Major Havoc etc. */ -PALETTE_INIT( avg_multi ) -{ - int i; - for (i = 0; i < 32; i++) - vcolorram[i] = VECTOR_COLOR111(i); + flip_x = flip_y = 0; + + vg_halt_timer = timer_alloc(vg_set_halt); + vg_run_timer = timer_alloc(run_state_machine); + + return video_start_vector(Machine); } +/************************************* + * + * Configuration of VG variants + * + *************************************/ + +static vgconf dvg_default = +{ + { + dvg_dmapush, + dvg_dmald, + dvg_gostrobe, + dvg_haltstrobe, + dvg_latch0, + dvg_latch1, + dvg_latch2, + dvg_latch3 + }, + dvg_state_addr, + dvg_data, + dvg_vggo, + dvg_vgrst +}; + +static vgconf avg_default = +{ + { + avg_latch0, + avg_latch1, + avg_latch2, + avg_latch3, + avg_strobe0, + avg_strobe1, + avg_strobe2, + avg_strobe3 + }, + avg_state_addr, + avg_data, + avg_vggo, + avg_vgrst +}; + +static vgconf avg_mhavoc = +{ + { + avg_latch0, + mhavoc_latch1, + avg_latch2, + avg_latch3, + avg_strobe0, + avg_strobe1, + mhavoc_strobe2, + mhavoc_strobe3 + }, + avg_state_addr, + mhavoc_data, + avg_vggo, + avg_vgrst +}; + +static vgconf avg_starwars = +{ + { + avg_latch0, + avg_latch1, + avg_latch2, + avg_latch3, + avg_strobe0, + avg_strobe1, + starwars_strobe2, + starwars_strobe3 + }, + avg_state_addr, + starwars_data, + avg_vggo, + avg_vgrst +}; + +static vgconf avg_tempest = +{ + { + avg_latch0, + avg_latch1, + avg_latch2, + avg_latch3, + avg_strobe0, + avg_strobe1, + tempest_strobe2, + tempest_strobe3 + }, + avg_state_addr, + avg_data, + avg_vggo, + avg_vgrst +}; + +static vgconf avg_bzone = +{ + { + avg_latch0, + bzone_latch1, + avg_latch2, + avg_latch3, + avg_strobe0, + avg_strobe1, + bzone_strobe2, + bzone_strobe3 + }, + avg_state_addr, + avg_data, + avg_vggo, + avg_vgrst +}; + +static vgconf avg_quantum = +{ + { + quantum_st2st3, + quantum_latch1, + quantum_st2st3, + quantum_latch3, + quantum_strobe0, + quantum_strobe1, + quantum_strobe2, + quantum_strobe3 + }, + avg_state_addr, + quantum_data, + avg_vggo, + avg_vgrst +}; + /************************************* * - * Color RAM handling + * Video startup * ************************************/ -WRITE8_HANDLER( tempest_colorram_w ) +VIDEO_START( dvg ) { - int bit3 = (~data >> 3) & 1; - int bit2 = (~data >> 2) & 1; - int bit1 = (~data >> 1) & 1; - int bit0 = (~data >> 0) & 1; - int r = bit1 * 0xee + bit0 * 0x11; - int g = bit3 * 0xee; - int b = bit2 * 0xee; + vgc = &dvg_default; + vg = &vgd; + vg->state_prom = memory_region(REGION_PROMS); + return avgdvg_init(); +} - vcolorram[offset] = MAKE_RGB(r, g, b); +VIDEO_START( avg ) +{ + vgc = &avg_default; + vg = &vgd; + vg->state_prom = memory_region(REGION_PROMS); + return avgdvg_init(); } +VIDEO_START( avg_starwars ) +{ + vgc = &avg_starwars; + vg = &vgd; + vg->state_prom = memory_region(REGION_PROMS) + 0x1000; + return avgdvg_init(); +} -WRITE8_HANDLER( mhavoc_colorram_w ) +VIDEO_START( avg_tempest ) { - int bit3 = (~data >> 3) & 1; - int bit2 = (~data >> 2) & 1; - int bit1 = (~data >> 1) & 1; - int bit0 = (~data >> 0) & 1; - int r = bit3 * 0xee + bit2 * 0x11; - int g = bit1 * 0xee; - int b = bit0 * 0xee; + vgc = &avg_tempest; + vg = &vgd; + vg->state_prom = memory_region(REGION_PROMS); + return avgdvg_init(); +} - vcolorram[offset] = MAKE_RGB(r, g, b); +VIDEO_START( avg_mhavoc ) +{ + vgc = &avg_mhavoc; + vg = &vgd; + vg->state_prom = memory_region(REGION_PROMS); + return avgdvg_init(); } +VIDEO_START( avg_bzone ) +{ + vgc = &avg_bzone; + vg = &vgd; + vg->state_prom = memory_region(REGION_PROMS); + return avgdvg_init(); +} -WRITE16_HANDLER( quantum_colorram_w ) +VIDEO_START( avg_quantum ) { - if (ACCESSING_LSB) - { - int bit3 = (~data >> 3) & 1; - int bit2 = (~data >> 2) & 1; - int bit1 = (~data >> 1) & 1; - int bit0 = (~data >> 0) & 1; - int r = bit3 * 0xee; - int g = bit1 * 0xee + bit0 * 0x11; - int b = bit2 * 0xee; - - vcolorram[offset & 0x0f] = MAKE_RGB(r, g, b); - } + vgc = &avg_quantum; + vg = &vgd; + vg->state_prom = memory_region(REGION_PROMS); + return avgdvg_init(); } + diff --git a/src/vidhrdw/avgdvg.h b/src/vidhrdw/avgdvg.h index 55f7cc510..065c0cd28 100644 --- a/src/vidhrdw/avgdvg.h +++ b/src/vidhrdw/avgdvg.h @@ -1,53 +1,29 @@ #ifndef __AVGDVG__ #define __AVGDVG__ -/* vector engine types, passed to vg_init */ - -#define AVGDVG_MIN 1 -#define USE_DVG 1 -#define USE_AVG_RBARON 2 -#define USE_AVG_BZONE 3 -#define USE_AVG 4 -#define USE_AVG_TEMPEST 5 -#define USE_AVG_MHAVOC 6 -#define USE_AVG_ALPHAONE 7 -#define USE_AVG_SWARS 8 -#define USE_AVG_QUANTUM 9 -#define AVGDVG_MAX 10 +extern UINT8 *tempest_colorram; +extern UINT8 *mhavoc_colorram; +extern UINT16 *quantum_colorram; +extern UINT16 *quantum_vectorram; int avgdvg_done(void); WRITE8_HANDLER( avgdvg_go_w ); WRITE8_HANDLER( avgdvg_reset_w ); WRITE16_HANDLER( avgdvg_go_word_w ); WRITE16_HANDLER( avgdvg_reset_word_w ); -int avgdvg_init(int vgType); /* Tempest and Quantum use this capability */ void avg_set_flip_x(int flip); void avg_set_flip_y(int flip); -/* Apart from the color mentioned below, the vector games will make additional - * entries for translucency/antialiasing and for backdrop/overlay artwork */ - -/* Black and White vector colors for Asteroids, Lunar Lander, Omega Race */ -PALETTE_INIT( avg_white ); -/* Basic 8 rgb vector colors for Tempest, Gravitar, Major Havoc etc. */ -PALETTE_INIT( avg_multi ); - -/* Some games use a colorram. This is not handled via the Mame core functions - * right now, but in src/vidhrdw/avgdvg.c itself. */ -WRITE8_HANDLER( tempest_colorram_w ); -WRITE8_HANDLER( mhavoc_colorram_w ); -WRITE16_HANDLER( quantum_colorram_w ); - VIDEO_START( dvg ); VIDEO_START( avg ); VIDEO_START( avg_tempest ); VIDEO_START( avg_mhavoc ); -VIDEO_START( avg_alphaone ); VIDEO_START( avg_starwars ); VIDEO_START( avg_quantum ); VIDEO_START( avg_bzone ); -VIDEO_START( avg_redbaron ); + +MACHINE_RESET( avgdvg ); #endif diff --git a/src/vidhrdw/aztarac.c b/src/vidhrdw/aztarac.c index dc90d9f33..5e2870201 100644 --- a/src/vidhrdw/aztarac.c +++ b/src/vidhrdw/aztarac.c @@ -91,5 +91,5 @@ VIDEO_START( aztarac ) xcenter=((xmax + xmin) / 2) << 16; ycenter=((ymax + ymin) / 2) << 16; - return video_start_vector(); + return video_start_vector(machine); } diff --git a/src/vidhrdw/bagman.c b/src/vidhrdw/bagman.c index 985399bc9..76bbd7c80 100644 --- a/src/vidhrdw/bagman.c +++ b/src/vidhrdw/bagman.c @@ -85,7 +85,7 @@ PALETTE_INIT( bagman ) bit1 = (color_prom[i] >> 7) & 0x01; b = combine_2_weights(weights_b, bit0, bit1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/balsente.c b/src/vidhrdw/balsente.c index 052834a2c..3cdbd1f03 100644 --- a/src/vidhrdw/balsente.c +++ b/src/vidhrdw/balsente.c @@ -179,7 +179,7 @@ WRITE8_HANDLER( balsente_paletteram_w ) r = paletteram[(offset & ~3) + 0]; g = paletteram[(offset & ~3) + 1]; b = paletteram[(offset & ~3) + 2]; - palette_set_color(offset / 4, (r << 4) | r, (g << 4) | g, (b << 4) | b); + palette_set_color(Machine, offset / 4, pal4bit(r), pal4bit(g), pal4bit(b)); } /************************************* @@ -303,9 +303,6 @@ VIDEO_UPDATE( balsente ) screen_refresh_counter++; update_palette(); - /* make sure color 1024 is white for our crosshair */ - palette_set_color(1024, 0xff, 0xff, 0xff); - /* draw any dirty scanlines from the VRAM directly */ for (y = cliprect->min_y; y <= cliprect->max_y; y++) if (scanline_dirty[y] || update_all) diff --git a/src/vidhrdw/bankp.c b/src/vidhrdw/bankp.c index b66531909..19e9b5f73 100644 --- a/src/vidhrdw/bankp.c +++ b/src/vidhrdw/bankp.c @@ -66,7 +66,7 @@ PALETTE_INIT( bankp ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/baraduke.c b/src/vidhrdw/baraduke.c index 76a0ae393..2109f9213 100644 --- a/src/vidhrdw/baraduke.c +++ b/src/vidhrdw/baraduke.c @@ -48,7 +48,7 @@ PALETTE_INIT( baraduke ) bit3 = (color_prom[0] >> 7) & 0x01; b = 0x0e*bit0 + 0x1f*bit1 + 0x43*bit2 + 0x8f*bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/battlane.c b/src/vidhrdw/battlane.c index a83a199fd..0ab790ac8 100644 --- a/src/vidhrdw/battlane.c +++ b/src/vidhrdw/battlane.c @@ -50,7 +50,7 @@ WRITE8_HANDLER( battlane_palette_w ) bit2 = (~data >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, r, g, b); } WRITE8_HANDLER( battlane_scrollx_w ) diff --git a/src/vidhrdw/battlera.c b/src/vidhrdw/battlera.c index 6de7b4b87..543c54dc5 100644 --- a/src/vidhrdw/battlera.c +++ b/src/vidhrdw/battlera.c @@ -52,17 +52,13 @@ VIDEO_START( battlera ) WRITE8_HANDLER( battlera_palette_w ) { - int r,g,b,pal_word; + int pal_word; paletteram[offset]=data; if (offset%2) offset-=1; pal_word=paletteram[offset] | (paletteram[offset+1]<<8); - - r = ((pal_word >> 3) & 7) << 5; - g = ((pal_word >> 6) & 7) << 5; - b = ((pal_word >> 0) & 7) << 5; - palette_set_color(offset/2, r, g, b); + palette_set_color(Machine, offset/2, pal3bit(pal_word >> 3), pal3bit(pal_word >> 6), pal3bit(pal_word >> 0)); } /******************************************************************************/ diff --git a/src/vidhrdw/battlex.c b/src/vidhrdw/battlex.c index c53114e74..f43a4514c 100644 --- a/src/vidhrdw/battlex.c +++ b/src/vidhrdw/battlex.c @@ -14,9 +14,9 @@ PALETTE_INIT( battlex ) for (i = 0;i < 16;i++) { int data = i | col; - int g = ((data & 1) >> 0) * 0xff; - int b = ((data & 2) >> 1) * 0xff; - int r = ((data & 4) >> 2) * 0xff; + int g = pal1bit(data >> 0); + int b = pal1bit(data >> 1); + int r = pal1bit(data >> 2); #if 0 /* from Tim's shots, bit 3 seems to have no effect (see e.g. Laser Ship on title screen) */ @@ -28,18 +28,14 @@ PALETTE_INIT( battlex ) } #endif - palette_set_color(i + 16 * col,r,g,b); + palette_set_color(machine, i + 16 * col,r,g,b); } } } WRITE8_HANDLER( battlex_palette_w ) { - int g = ((data & 1) >> 0) * 0xff; - int b = ((data & 2) >> 1) * 0xff; - int r = ((data & 4) >> 2) * 0xff; - - palette_set_color(16*8 + offset,r,g,b); + palette_set_color(Machine,16*8 + offset,pal1bit(data >> 2),pal1bit(data >> 0),pal1bit(data >> 1)); } WRITE8_HANDLER( battlex_scroll_x_lsb_w ) diff --git a/src/vidhrdw/beathead.c b/src/vidhrdw/beathead.c index b5fa84110..9fe0d9e17 100644 --- a/src/vidhrdw/beathead.c +++ b/src/vidhrdw/beathead.c @@ -137,12 +137,7 @@ WRITE32_HANDLER( beathead_palette_w ) int r = ((newword >> 9) & 0x3e) | ((newword >> 15) & 0x01); int g = ((newword >> 4) & 0x3e) | ((newword >> 15) & 0x01); int b = ((newword << 1) & 0x3e) | ((newword >> 15) & 0x01); - - r = (r << 2) | (r >> 4); - g = (g << 2) | (g >> 4); - b = (b << 2) | (b >> 4); - - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal6bit(r), pal6bit(g), pal6bit(b)); } diff --git a/src/vidhrdw/beezer.c b/src/vidhrdw/beezer.c index 78dc32967..555f5c384 100644 --- a/src/vidhrdw/beezer.c +++ b/src/vidhrdw/beezer.c @@ -62,7 +62,7 @@ WRITE8_HANDLER( beezer_map_w ) bit1 = (data >> 7) & 0x01; b = 0x5f * bit0 + 0xa0 * bit1; - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, r, g, b); } WRITE8_HANDLER( beezer_ram_w ) diff --git a/src/vidhrdw/berzerk.c b/src/vidhrdw/berzerk.c index 8a7ea08ae..0aa039695 100644 --- a/src/vidhrdw/berzerk.c +++ b/src/vidhrdw/berzerk.c @@ -40,7 +40,7 @@ PALETTE_INIT( berzerk ) int g = (i & 2) ? 0xff : bk; int b = (i & 4) ? 0xff : bk; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } @@ -266,7 +266,7 @@ VIDEO_START( berzerk ) shifters_and_floppers_init(); alu_init(); - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } diff --git a/src/vidhrdw/bfm_adr2.c b/src/vidhrdw/bfm_adr2.c index 45682e955..4604dcd50 100644 --- a/src/vidhrdw/bfm_adr2.c +++ b/src/vidhrdw/bfm_adr2.c @@ -93,7 +93,7 @@ E000-FFFF | R | D D D D D D D D | 8K ROM #include "machine/vacfdisp.h" // vfd #include "vidhrdw/bfm_adr2.h" #include "bfm_sc2.h" -#include "ui.h" +#include "rendlay.h" int adder2_show_alpha_display; // flag, set if alpha display need to be displayed @@ -238,22 +238,18 @@ VIDEO_UPDATE( adder2 ) if (screen == 0) { adder2_update(bitmap); + if ( sc2_show_door ) + { + output_set_value("door",( Scorpion2_GetSwitchState(sc2_door_state>>4, sc2_door_state & 0x0F) ) ); + } } if (screen == 1) { if ( adder2_show_alpha_display ) - draw_16seg(bitmap,0,0,0,3,1); - - #if 0 //Better to wait for new textbox - if ( sc2_show_door ) { - if ( Scorpion2_GetSwitchState(sc2_door_state>>4, sc2_door_state & 0x0F) ) - popmessage("Door Closed"); - else - popmessage("Door Open "); + draw_14seg(bitmap,0,3,1); } - #endif } return 0; } @@ -268,22 +264,22 @@ void adder2_update(mame_bitmap *bitmap) PALETTE_INIT( adder2 ) { - palette_set_color( 0,0x00,0x00,0x00); - palette_set_color( 1,0x00,0x00,0xFF); - palette_set_color( 2,0x00,0xFF,0x00); - palette_set_color( 3,0x00,0xFF,0xFF); - palette_set_color( 4,0xFF,0x00,0x00); - palette_set_color( 5,0xFF,0x00,0xFF); - palette_set_color( 6,0xFF,0xFF,0x00); - palette_set_color( 7,0xFF,0xFF,0xFF); - palette_set_color( 8,0x80,0x80,0x80); - palette_set_color( 9,0x00,0x00,0x80); - palette_set_color(10,0x00,0x80,0x00); - palette_set_color(11,0x00,0x80,0x80); - palette_set_color(12,0x80,0x00,0x00); - palette_set_color(13,0x80,0x00,0x80); - palette_set_color(14,0x80,0x80,0x00); - palette_set_color(15,0x80,0x80,0x80); + palette_set_color(machine, 0,0x00,0x00,0x00); + palette_set_color(machine, 1,0x00,0x00,0xFF); + palette_set_color(machine, 2,0x00,0xFF,0x00); + palette_set_color(machine, 3,0x00,0xFF,0xFF); + palette_set_color(machine, 4,0xFF,0x00,0x00); + palette_set_color(machine, 5,0xFF,0x00,0xFF); + palette_set_color(machine, 6,0xFF,0xFF,0x00); + palette_set_color(machine, 7,0xFF,0xFF,0xFF); + palette_set_color(machine, 8,0x80,0x80,0x80); + palette_set_color(machine, 9,0x00,0x00,0x80); + palette_set_color(machine,10,0x00,0x80,0x00); + palette_set_color(machine,11,0x00,0x80,0x80); + palette_set_color(machine,12,0x80,0x00,0x00); + palette_set_color(machine,13,0x80,0x00,0x80); + palette_set_color(machine,14,0x80,0x80,0x00); + palette_set_color(machine,15,0x80,0x80,0x80); } /////////////////////////////////////////////////////////////////////////// @@ -292,7 +288,7 @@ MACHINE_RESET( adder2_init_vid ) { // setup the standard bellfruit BD1 display ///////////////////////////// - vfd_init(0, VFDTYPE_BFMBD1); + vfd_init(0, VFDTYPE_BFMBD1,0); // reset the board ////////////////////////////////////////////////////// @@ -334,7 +330,7 @@ static WRITE8_HANDLER( screen_ram_w ) r = ((data & 0x18)>>3) * 85; // 00011000b = 0x18 g = ((data & 0x06)>>1) * 85; // 00000110b = 0x06 b = ((data & 0x01) ) * 255; - palette_set_color( pal, r,g,b); + palette_set_color(Machine, pal, r,g,b); } if ( adder2_screen_page_reg & SL_ACCESS ) diff --git a/src/vidhrdw/bigevglf.c b/src/vidhrdw/bigevglf.c index 2b7444bdf..d775534b8 100644 --- a/src/vidhrdw/bigevglf.c +++ b/src/vidhrdw/bigevglf.c @@ -26,7 +26,7 @@ WRITE8_HANDLER(beg_palette_w) paletteram[offset] = data; color = paletteram[offset&0x3ff] | (paletteram[0x400+(offset&0x3ff)] << 8); - palette_set_color(offset&0x3ff, color&0xf0, (color&0xf)<<4, (color&0xf00)>>4); + palette_set_color(Machine, offset&0x3ff, pal4bit(color >> 4), pal4bit(color >> 0), pal4bit(color >> 8)); } WRITE8_HANDLER( beg_gfxcontrol_w ) diff --git a/src/vidhrdw/bigstrkb.c b/src/vidhrdw/bigstrkb.c index d5c3eb127..5eefc2b99 100644 --- a/src/vidhrdw/bigstrkb.c +++ b/src/vidhrdw/bigstrkb.c @@ -140,7 +140,7 @@ VIDEO_START(bigstrkb) VIDEO_UPDATE(bigstrkb) { -// fillbitmap(bitmap,get_black_pen(),cliprect); +// fillbitmap(bitmap,get_black_pen(machine),cliprect); tilemap_set_scrollx(bsb_tilemap2,0, bsb_vidreg1[0]+(256-14)); tilemap_set_scrolly(bsb_tilemap2,0, bsb_vidreg2[0]); diff --git a/src/vidhrdw/bking2.c b/src/vidhrdw/bking2.c index f601955df..13a4f9253 100644 --- a/src/vidhrdw/bking2.c +++ b/src/vidhrdw/bking2.c @@ -79,7 +79,7 @@ PALETTE_INIT( bking2 ) bit2 = 0; b = 0x92 * bit0 + 0x46 * bit1 + 0x27 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/blmbycar.c b/src/vidhrdw/blmbycar.c index c75e08b40..cf88a22c9 100644 --- a/src/vidhrdw/blmbycar.c +++ b/src/vidhrdw/blmbycar.c @@ -48,12 +48,8 @@ UINT16 *blmbycar_vram_1, *blmbycar_scroll_1; WRITE16_HANDLER( blmbycar_palette_w ) { - int r,g,b; data = COMBINE_DATA(&paletteram16[offset]); - g = (data >> 0) & 0xF; - r = (data >> 4) & 0xF; - b = (data >> 8) & 0xF; - palette_set_color( offset, r * 0x11, g * 0x11, b * 0x11 ); + palette_set_color( Machine, offset, pal4bit(data >> 4), pal4bit(data >> 0), pal4bit(data >> 8)); } diff --git a/src/vidhrdw/blockout.c b/src/vidhrdw/blockout.c index c5b1dfb41..acdbae507 100644 --- a/src/vidhrdw/blockout.c +++ b/src/vidhrdw/blockout.c @@ -34,7 +34,7 @@ static void setcolor(int color,int rgb) bit3 = (rgb >> 11) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(color,r,g,b); + palette_set_color(Machine,color,r,g,b); } WRITE16_HANDLER( blockout_paletteram_w ) diff --git a/src/vidhrdw/blueprnt.c b/src/vidhrdw/blueprnt.c index 5f9c669c1..7bffc9dea 100644 --- a/src/vidhrdw/blueprnt.c +++ b/src/vidhrdw/blueprnt.c @@ -27,7 +27,7 @@ PALETTE_INIT( blueprnt ) int r = ((i >> 0) & 1) * ((i & 0x08) ? 0xbf : 0xff); int g = ((i >> 2) & 1) * ((i & 0x08) ? 0xbf : 0xff); int b = ((i >> 1) & 1) * ((i & 0x08) ? 0xbf : 0xff); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } /* chars */ @@ -136,7 +136,7 @@ VIDEO_UPDATE( blueprnt ) for (i = 0; i < 32; i++) tilemap_set_scrolly(bg_tilemap, i, blueprnt_scrollram[30 - i]); - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); blueprnt_draw_sprites(bitmap, cliprect); tilemap_draw(bitmap, cliprect, bg_tilemap, 1, 0); diff --git a/src/vidhrdw/bogeyman.c b/src/vidhrdw/bogeyman.c index 632b17468..207de4d6f 100644 --- a/src/vidhrdw/bogeyman.c +++ b/src/vidhrdw/bogeyman.c @@ -32,7 +32,7 @@ PALETTE_INIT( bogeyman ) bit2 = (color_prom[256] >> 3) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+16,r,g,b); + palette_set_color(machine,i+16,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/bosco.c b/src/vidhrdw/bosco.c index 048822ff6..9aebb006e 100644 --- a/src/vidhrdw/bosco.c +++ b/src/vidhrdw/bosco.c @@ -52,7 +52,7 @@ PALETTE_INIT( bosco ) bit2 = ((*color_prom) >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -84,7 +84,7 @@ PALETTE_INIT( bosco ) bits = (i >> 4) & 0x03; b = map[bits]; - palette_set_color(i + 32,r,g,b); + palette_set_color(machine,i + 32,r,g,b); } } diff --git a/src/vidhrdw/brkthru.c b/src/vidhrdw/brkthru.c index b78e4cf70..ff12d069b 100644 --- a/src/vidhrdw/brkthru.c +++ b/src/vidhrdw/brkthru.c @@ -67,7 +67,7 @@ PALETTE_INIT( brkthru ) bit3 = (color_prom[Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/btime.c b/src/vidhrdw/btime.c index 426209ea5..e10200848 100644 --- a/src/vidhrdw/btime.c +++ b/src/vidhrdw/btime.c @@ -72,7 +72,7 @@ PALETTE_INIT( btime ) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } @@ -117,7 +117,7 @@ PALETTE_INIT( lnc ) bit2 = (color_prom[i] >> 0) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } @@ -135,7 +135,7 @@ Start the video hardware emulation. ***************************************************************************/ VIDEO_START( bnj ) { - if (video_start_generic() != 0) + if (video_start_generic(machine) != 0) return 1; dirtybuffer2 = auto_malloc(bnj_backgroundram_size); @@ -156,7 +156,7 @@ VIDEO_START( btime ) bnj_scroll1 = 0; bnj_scroll2 = 0; - return video_start_generic(); + return video_start_generic(machine); } diff --git a/src/vidhrdw/btoads.c b/src/vidhrdw/btoads.c index ad3ccfa82..fc2903ad1 100644 --- a/src/vidhrdw/btoads.c +++ b/src/vidhrdw/btoads.c @@ -339,7 +339,7 @@ VIDEO_UPDATE( btoads ) /* check for disabled video */ if (tms34010_io_display_blanked(0)) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } diff --git a/src/vidhrdw/buggychl.c b/src/vidhrdw/buggychl.c index 7555db8fb..eff6dc048 100644 --- a/src/vidhrdw/buggychl.c +++ b/src/vidhrdw/buggychl.c @@ -20,7 +20,7 @@ PALETTE_INIT( buggychl ) /* arbitrary blue shading for the sky */ for (i = 0;i < 128;i++) - palette_set_color(i+128,0,i,2*i); + palette_set_color(machine,i+128,0,i,2*i); } diff --git a/src/vidhrdw/bwing.c b/src/vidhrdw/bwing.c index 0865e08b5..b988c0e2f 100644 --- a/src/vidhrdw/bwing.c +++ b/src/vidhrdw/bwing.c @@ -153,7 +153,7 @@ WRITE8_HANDLER( bwing_paletteram_w ) if (b > 0xff) b = 0xff; } - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, r, g, b); #if BW_DEBUG paletteram[offset+0x40] = palatch; @@ -276,7 +276,7 @@ VIDEO_UPDATE( bwing ) tilemap_draw(bitmap, cliprect, bgmap, 0, 0); } else - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); // draw low priority sprites bwing_drawsprites(bitmap, cliprect, buffered_spriteram, 0); diff --git a/src/vidhrdw/capbowl.c b/src/vidhrdw/capbowl.c index ca86b8fec..45cb8d239 100644 --- a/src/vidhrdw/capbowl.c +++ b/src/vidhrdw/capbowl.c @@ -166,7 +166,7 @@ VIDEO_UPDATE( capbowl ) /* if we're blanked, just fill with black */ if (state.blanked) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } @@ -180,10 +180,8 @@ VIDEO_UPDATE( capbowl ) /* first update the palette for this scanline */ for (x = 0; x < 16; x++) { - int r = *src++ & 0x0f; - int g = *src >> 4; - int b = *src++ & 0x0f; - palette_set_color(ybase + x, (r << 4) | r, (g << 4) | g, (b << 4) | b); + palette_set_color(machine, ybase + x, pal4bit(src[0]), pal4bit(src[0] >> 4), pal4bit(src[1])); + src += 2; } /* expand row to 8bpp */ diff --git a/src/vidhrdw/carjmbre.c b/src/vidhrdw/carjmbre.c index 63594fa4f..aff8b0417 100644 --- a/src/vidhrdw/carjmbre.c +++ b/src/vidhrdw/carjmbre.c @@ -32,7 +32,7 @@ PALETTE_INIT( carjmbre ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } @@ -57,7 +57,7 @@ WRITE8_HANDLER( carjmbre_bgcolor_w ) memset(dirtybuffer,1,videoram_size); for (i=0;i<64;i+=4) - palette_set_color(i, (carjmbre_bgcolor&0xff)*0x50, (carjmbre_bgcolor&0xff)*0x50, (carjmbre_bgcolor&0xff)!=0?0x50:0); + palette_set_color(Machine, i, (carjmbre_bgcolor&0xff)*0x50, (carjmbre_bgcolor&0xff)*0x50, (carjmbre_bgcolor&0xff)!=0?0x50:0); } } diff --git a/src/vidhrdw/carpolo.c b/src/vidhrdw/carpolo.c index afa7d10ab..9fdde3ad3 100644 --- a/src/vidhrdw/carpolo.c +++ b/src/vidhrdw/carpolo.c @@ -121,12 +121,12 @@ PALETTE_INIT( carpolo ) b = ((b_voltage[*color_prom & 0x03 ] - MIN_VOLTAGE) / (MAX_VOLTAGE - MIN_VOLTAGE)) * 255.; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); // score color is same as net color if (i == NET_COLOR) { - palette_set_color(SCORE_COLOR,r,g,b); + palette_set_color(machine,SCORE_COLOR,r,g,b); } color_prom++; diff --git a/src/vidhrdw/cbuster.c b/src/vidhrdw/cbuster.c index a65f1b051..e6cbc8b4f 100644 --- a/src/vidhrdw/cbuster.c +++ b/src/vidhrdw/cbuster.c @@ -45,7 +45,7 @@ static void update_24bitcol(int offset) g = (UINT8)((float)((paletteram16[offset] >> 8) & 0xff)*1.75); b = (UINT8)((float)((paletteram16_2[offset] >> 0) & 0xff)*1.75); - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } WRITE16_HANDLER( twocrude_palette_24bit_rg_w ) diff --git a/src/vidhrdw/ccastles.c b/src/vidhrdw/ccastles.c index 3b6c9ef03..d53bd7676 100644 --- a/src/vidhrdw/ccastles.c +++ b/src/vidhrdw/ccastles.c @@ -125,7 +125,7 @@ WRITE8_HANDLER( ccastles_paletteram_w ) bit2 = (~b >> 2) & 0x01; b = combine_3_weights(bweights, bit0, bit1, bit2); - palette_set_color(offset & 0x1f, r, g, b); + palette_set_color(Machine, offset & 0x1f, r, g, b); } @@ -277,7 +277,7 @@ VIDEO_UPDATE( ccastles ) { UINT8 *spriteaddr = &spriteram[video_control[7] * 0x100]; /* BUF1/BUF2 */ int flip = video_control[4] ? 0xff : 0x00; /* PLAYER2 */ - pen_t black = get_black_pen(); + pen_t black = get_black_pen(machine); int x, y, offs; /* draw the sprites */ diff --git a/src/vidhrdw/cchasm.c b/src/vidhrdw/cchasm.c index bb616dad8..4039997a7 100644 --- a/src/vidhrdw/cchasm.c +++ b/src/vidhrdw/cchasm.c @@ -132,5 +132,5 @@ VIDEO_START( cchasm ) xcenter=((xmax+xmin)/2) << 16; ycenter=((ymax+ymin)/2) << 16; - return video_start_vector(); + return video_start_vector(machine); } diff --git a/src/vidhrdw/cclimber.c b/src/vidhrdw/cclimber.c index 23b521991..641e06cca 100644 --- a/src/vidhrdw/cclimber.c +++ b/src/vidhrdw/cclimber.c @@ -63,7 +63,7 @@ PALETTE_INIT( cclimber ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -154,7 +154,7 @@ PALETTE_INIT( swimmer ) bit2 = (color_prom[i+256] >> 3) & 0x01; b = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); /* side panel */ if (i % 8) @@ -194,20 +194,20 @@ PALETTE_INIT( swimmer ) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2; - palette_set_color(i+256,r,g,b); + palette_set_color(machine,i+256,r,g,b); if (i % 8 == 0) COLOR(2,i) = BGPEN; /* enforce transparency */ else COLOR(2,i) = i+256; } /* background */ - palette_set_color(BGPEN,0,0,0); + palette_set_color(machine,BGPEN,0,0,0); /* side panel background color */ #if 0 // values calculated from the resistors don't seem to match the real board - palette_set_color(SIDEPEN,0x24,0x5d,0x4e); + palette_set_color(machine,SIDEPEN,0x24,0x5d,0x4e); #endif - palette_set_color(SIDEPEN,0x20,0x98,0x79); + palette_set_color(machine,SIDEPEN,0x20,0x98,0x79); } @@ -252,7 +252,7 @@ WRITE8_HANDLER( swimmer_bgcolor_w ) bit2 = (data >> 2) & 0x01; b = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2; - palette_set_color(BGPEN,r,g,b); + palette_set_color(Machine,BGPEN,r,g,b); } diff --git a/src/vidhrdw/centiped.c b/src/vidhrdw/centiped.c index 6922a28e3..a18abc8ca 100644 --- a/src/vidhrdw/centiped.c +++ b/src/vidhrdw/centiped.c @@ -254,7 +254,7 @@ WRITE8_HANDLER( centiped_paletteram_w ) /* any palette changes unless the write is to a palette RAM address */ /* that is actually used */ if (offset & 4) - palette_set_color(((offset >> 1) & 4) | (offset & 3), r, g, b); + palette_set_color(Machine, ((offset >> 1) & 4) | (offset & 3), r, g, b); } @@ -289,7 +289,7 @@ PALETTE_INIT( warlords ) int grey = (r * 0x4d / 0xff) + (g * 0x96 / 0xff) + (b * 0x1c / 0xff); r = g = b = grey; } - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -373,7 +373,7 @@ WRITE8_HANDLER( milliped_paletteram_w ) bit2 = (~data >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, r, g, b); } diff --git a/src/vidhrdw/chaknpop.c b/src/vidhrdw/chaknpop.c index a94585512..fe937589d 100644 --- a/src/vidhrdw/chaknpop.c +++ b/src/vidhrdw/chaknpop.c @@ -65,7 +65,7 @@ PALETTE_INIT( chaknpop ) bit2 = (col >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); } } diff --git a/src/vidhrdw/champbas.c b/src/vidhrdw/champbas.c index 7e15ed4e2..fd364732d 100644 --- a/src/vidhrdw/champbas.c +++ b/src/vidhrdw/champbas.c @@ -61,7 +61,7 @@ PALETTE_INIT( champbas ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/cheekyms.c b/src/vidhrdw/cheekyms.c index c032cdf33..ed69cf51d 100644 --- a/src/vidhrdw/cheekyms.c +++ b/src/vidhrdw/cheekyms.c @@ -35,7 +35,7 @@ PALETTE_INIT( cheekyms ) bit = (color_prom[0x20*(i/2)+j] >> ((4*(i&1))+2)) & 0x01; b = 0xff * bit; - palette_set_color((i*0x20)+j,r,g,b); + palette_set_color(machine,(i*0x20)+j,r,g,b); } } } diff --git a/src/vidhrdw/cinemat.c b/src/vidhrdw/cinemat.c index a1a0e581b..9bb9b29a8 100644 --- a/src/vidhrdw/cinemat.c +++ b/src/vidhrdw/cinemat.c @@ -180,35 +180,35 @@ WRITE8_HANDLER(cinemat_vector_control_w) VIDEO_START( cinemat_bilevel ) { color_mode = COLOR_BILEVEL; - return video_start_vector(); + return video_start_vector(machine); } VIDEO_START( cinemat_16level ) { color_mode = COLOR_16LEVEL; - return video_start_vector(); + return video_start_vector(machine); } VIDEO_START( cinemat_64level ) { color_mode = COLOR_64LEVEL; - return video_start_vector(); + return video_start_vector(machine); } VIDEO_START( cinemat_color ) { color_mode = COLOR_RGB; - return video_start_vector(); + return video_start_vector(machine); } VIDEO_START( cinemat_qb3color ) { color_mode = COLOR_QB3; - return video_start_vector(); + return video_start_vector(machine); } @@ -236,7 +236,7 @@ VIDEO_UPDATE( spacewar ) { int sw_option = readinputportbytag("INPUTS"); - video_update_vector(screen, bitmap, cliprect); + video_update_vector(machine, screen, bitmap, cliprect); /* set the state of the artwork */ output_set_value("pressed3", (~sw_option >> 0) & 1); diff --git a/src/vidhrdw/circusc.c b/src/vidhrdw/circusc.c index 1e4210c10..abe3f9b01 100644 --- a/src/vidhrdw/circusc.c +++ b/src/vidhrdw/circusc.c @@ -63,7 +63,7 @@ PALETTE_INIT( circusc ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/cischeat.c b/src/vidhrdw/cischeat.c index 03c3af462..0254f5db4 100644 --- a/src/vidhrdw/cischeat.c +++ b/src/vidhrdw/cischeat.c @@ -141,7 +141,7 @@ static void prepare_shadows(void) /* 32 colour codes for the tiles */ VIDEO_START( cischeat ) { - if (video_start_megasys1()) return 1; + if (video_start_megasys1(machine)) return 1; megasys1_bits_per_color_code = 5; @@ -157,7 +157,7 @@ VIDEO_START( cischeat ) /* 16 colour codes for the tiles */ VIDEO_START( f1gpstar ) { - if (video_start_cischeat()) return 1; + if (video_start_cischeat(machine)) return 1; megasys1_bits_per_color_code = 4; @@ -166,7 +166,7 @@ VIDEO_START( f1gpstar ) VIDEO_START( bigrun ) { - return video_start_f1gpstar(); + return video_start_f1gpstar(machine); } diff --git a/src/vidhrdw/citycon.c b/src/vidhrdw/citycon.c index e9401f56a..2f7204112 100644 --- a/src/vidhrdw/citycon.c +++ b/src/vidhrdw/citycon.c @@ -154,18 +154,8 @@ static void draw_sprites(mame_bitmap *bitmap, const rectangle *cliprect) INLINE void changecolor_RRRRGGGGBBBBxxxx(int color,int indx) { - int r,g,b; int data = paletteram[2*indx | 1] | (paletteram[2*indx] << 8); - - r = (data >> 12) & 0x0f; - g = (data >> 8) & 0x0f; - b = (data >> 4) & 0x0f; - - r = (r << 4) | r; - g = (g << 4) | g; - b = (b << 4) | b; - - palette_set_color(color,r,g,b); + palette_set_color(Machine,color,pal4bit(data >> 12),pal4bit(data >> 8),pal4bit(data >> 4)); } VIDEO_UPDATE( citycon ) diff --git a/src/vidhrdw/clayshoo.c b/src/vidhrdw/clayshoo.c index 2ddfb5daa..01c62319a 100644 --- a/src/vidhrdw/clayshoo.c +++ b/src/vidhrdw/clayshoo.c @@ -18,8 +18,8 @@ PALETTE_INIT( clayshoo ) { - palette_set_color(0,0x00,0x00,0x00); /* black */ - palette_set_color(1,0xff,0xff,0xff); /* white */ + palette_set_color(machine,0,0x00,0x00,0x00); /* black */ + palette_set_color(machine,1,0xff,0xff,0xff); /* white */ } diff --git a/src/vidhrdw/cloak.c b/src/vidhrdw/cloak.c index 9977345ad..85cbaceb2 100644 --- a/src/vidhrdw/cloak.c +++ b/src/vidhrdw/cloak.c @@ -66,7 +66,7 @@ WRITE8_HANDLER( cloak_paletteram_w ) bit2 = (b >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(offset & 0x3f,r,g,b); + palette_set_color(Machine,offset & 0x3f,r,g,b); } WRITE8_HANDLER( cloak_clearbmp_w ) diff --git a/src/vidhrdw/cloud9.c b/src/vidhrdw/cloud9.c index e0567635a..60ba97fad 100644 --- a/src/vidhrdw/cloud9.c +++ b/src/vidhrdw/cloud9.c @@ -112,7 +112,7 @@ WRITE8_HANDLER( cloud9_paletteram_w ) bit2 = (~b >> 2) & 0x01; b = combine_3_weights(bweights, bit0, bit1, bit2); - palette_set_color(offset & 0x3f, r, g, b); + palette_set_color(Machine, offset & 0x3f, r, g, b); } @@ -257,7 +257,7 @@ VIDEO_UPDATE( cloud9 ) { UINT8 *spriteaddr = spriteram; int flip = video_control[5] ? 0xff : 0x00; /* PLAYER2 */ - pen_t black = get_black_pen(); + pen_t black = get_black_pen(machine); int x, y, offs; /* draw the sprites */ diff --git a/src/vidhrdw/clshroad.c b/src/vidhrdw/clshroad.c index 05155ab98..2786be4a6 100644 --- a/src/vidhrdw/clshroad.c +++ b/src/vidhrdw/clshroad.c @@ -56,9 +56,9 @@ PALETTE_INIT( clshroad ) { int i; for (i = 0;i < 256;i++) - palette_set_color(i, color_prom[i + 256 * 0] * 0x11, - color_prom[i + 256 * 1] * 0x11, - color_prom[i + 256 * 2] * 0x11 ); + palette_set_color(machine,i, pal4bit(color_prom[i + 256 * 0]), + pal4bit(color_prom[i + 256 * 1]), + pal4bit(color_prom[i + 256 * 2])); } PALETTE_INIT( firebatl ) @@ -93,7 +93,7 @@ PALETTE_INIT( firebatl ) bit3 = (color_prom[i + 2*256] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } #endif diff --git a/src/vidhrdw/compgolf.c b/src/vidhrdw/compgolf.c index a58f05573..b34ea5835 100644 --- a/src/vidhrdw/compgolf.c +++ b/src/vidhrdw/compgolf.c @@ -32,7 +32,7 @@ PALETTE_INIT( compgolf ) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/cop01.c b/src/vidhrdw/cop01.c index 49b221fa1..c6fa1c738 100644 --- a/src/vidhrdw/cop01.c +++ b/src/vidhrdw/cop01.c @@ -43,7 +43,7 @@ PALETTE_INIT( cop01 ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/cosmic.c b/src/vidhrdw/cosmic.c index 747426d9f..a01f9d0bf 100644 --- a/src/vidhrdw/cosmic.c +++ b/src/vidhrdw/cosmic.c @@ -110,7 +110,7 @@ PALETTE_INIT( panic ) b = 0xaa; else b = 0xff * ((i >> 2) & 1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } @@ -139,12 +139,7 @@ PALETTE_INIT( cosmica ) #define COLOR(gfxn,offs) (colortable[Machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs]) for (i = 0;i < Machine->drv->total_colors;i++) - { - int r = 0xff * ((i >> 0) & 1); - int g = 0xff * ((i >> 1) & 1); - int b = 0xff * ((i >> 2) & 1); - palette_set_color(i,r,g,b); - } + palette_set_color(machine,i,pal1bit(i >> 0),pal1bit(i >> 1),pal1bit(i >> 2)); for (i = 0;i < TOTAL_COLORS(0)/2;i++) @@ -181,7 +176,7 @@ PALETTE_INIT( cosmicg ) g = 0xaa * ((i >> 1) & 1); b = 0xaa * ((i >> 2) & 1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } @@ -206,7 +201,7 @@ PALETTE_INIT( magspot2 ) g = 0xff * ((i >> 1) & 1); b = 0xff * ((i >> 2) & 1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } @@ -229,14 +224,7 @@ PALETTE_INIT( nomnlnd ) for (i = 0;i < Machine->drv->total_colors;i++) - { - int r,g,b; - - r = 0xff * ((i >> 0) & 1); - g = 0xff * ((i >> 1) & 1); - b = 0xff * ((i >> 2) & 1); - palette_set_color(i,r,g,b); - } + palette_set_color(machine,i,pal1bit(i >> 0),pal1bit(i >> 1),pal1bit(i >> 2)); for (i = 0;i < TOTAL_COLORS(0);i++) diff --git a/src/vidhrdw/cps1.c b/src/vidhrdw/cps1.c index dcecc1146..e80ad92ec 100644 --- a/src/vidhrdw/cps1.c +++ b/src/vidhrdw/cps1.c @@ -1148,7 +1148,7 @@ VIDEO_START( cps ) { int i; - machine_reset_cps(); + machine_reset_cps(machine); cps1_bg_tilemap[0] = tilemap_create(get_tile0_info,tilemap0_scan,TILEMAP_SPLIT, 8, 8,64,64); cps1_bg_tilemap[1] = tilemap_create(get_tile1_info,tilemap1_scan,TILEMAP_SPLIT,16,16,64,64); @@ -1167,7 +1167,7 @@ VIDEO_START( cps ) memset(cps1_old_palette, 0x00, cps1_palette_size); for (i = 0;i < cps1_palette_entries*16;i++) { - palette_set_color(i,0,0,0); + palette_set_color(machine,i,0,0,0); } cps1_buffered_obj = auto_malloc (cps1_obj_size); @@ -1220,7 +1220,7 @@ VIDEO_START( cps ) VIDEO_START( cps1 ) { cps_version=1; - return video_start_cps(); + return video_start_cps(machine); } VIDEO_START( cps2 ) @@ -1229,7 +1229,7 @@ VIDEO_START( cps2 ) { cps_version=2; } - return video_start_cps(); + return video_start_cps(machine); } /*************************************************************************** @@ -1270,7 +1270,7 @@ void cps1_build_palette(void) blue = ((palette>>0)&0x0f) * bright; } - palette_set_color (offset, red, green, blue); + palette_set_color (Machine, offset, red, green, blue); cps1_old_palette[offset] = palette; } } @@ -1319,7 +1319,7 @@ void cps1_find_last_sprite(void) /* Find the offset of last sprite */ while (offset < cps1_obj_size/2) { int colour=cps1_buffered_obj[offset+3]; - if (colour == 0xff00) + if ((colour & 0xff00) == 0xff00) { /* Marker found. This is the last sprite. */ cps1_last_sprite_offset=offset-4; diff --git a/src/vidhrdw/crbaloon.c b/src/vidhrdw/crbaloon.c index 8f09085d7..24479f1c9 100644 --- a/src/vidhrdw/crbaloon.c +++ b/src/vidhrdw/crbaloon.c @@ -47,7 +47,7 @@ PALETTE_INIT( crbaloon ) g = intensity * ((~i >> 1) & 1); /* blue component */ b = intensity * ((~i >> 2) & 1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } for (i = 0;i < TOTAL_COLORS(0);i += 2) diff --git a/src/vidhrdw/crgolf.c b/src/vidhrdw/crgolf.c index 6925d6295..bbfdbf482 100644 --- a/src/vidhrdw/crgolf.c +++ b/src/vidhrdw/crgolf.c @@ -176,7 +176,7 @@ PALETTE_INIT( crgolf ) bit1 = (*color_prom >> 7) & 0x01; b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); color_prom++; } } diff --git a/src/vidhrdw/crshrace.c b/src/vidhrdw/crshrace.c index c266c4ab1..e0d7ab306 100644 --- a/src/vidhrdw/crshrace.c +++ b/src/vidhrdw/crshrace.c @@ -196,7 +196,7 @@ VIDEO_UPDATE( crshrace ) { if (gfxctrl & 0x04) /* display disable? */ { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); return 0; } diff --git a/src/vidhrdw/csk.c b/src/vidhrdw/csk.c index f76093897..e916a173c 100644 --- a/src/vidhrdw/csk.c +++ b/src/vidhrdw/csk.c @@ -38,22 +38,12 @@ WRITE8_HANDLER( cpk_palette_w ) WRITE8_HANDLER( cpk_palette2_w ) { - int r,g,b,newword; + int newword; cpk_palette2[offset] = data; newword = cpk_palette[offset] + 256 * cpk_palette2[offset]; - - b = ((newword >> 10) & 0x1f); - g = ((newword >> 5) & 0x1f); - r = ((newword >> 0) & 0x1f); - /* bit 15 is never used */ - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,pal5bit(newword >> 0),pal5bit(newword >> 5),pal5bit(newword >> 10)); } /* Video handling */ diff --git a/src/vidhrdw/cvs.c b/src/vidhrdw/cvs.c index 9b64b8ba1..08569f67c 100644 --- a/src/vidhrdw/cvs.c +++ b/src/vidhrdw/cvs.c @@ -233,7 +233,7 @@ WRITE8_HANDLER( cvs_bullet_w ) data ^= 0xff; paletteram[offset] = data; - palette_set_color(offset, pal2bit(data >> 0), pal3bit(data >> 2), pal3bit(data >> 5)); + palette_set_color(Machine, offset, pal2bit(data >> 0), pal3bit(data >> 2), pal3bit(data >> 5)); } } @@ -369,7 +369,7 @@ VIDEO_START( cvs ) colorram = auto_malloc(0x400); paletteram = auto_malloc(0x100); - video_start_generic(); + video_start_generic(machine); /* precalculate the star background */ diff --git a/src/vidhrdw/cyberbal.c b/src/vidhrdw/cyberbal.c index 05a41c0d3..3f183456d 100644 --- a/src/vidhrdw/cyberbal.c +++ b/src/vidhrdw/cyberbal.c @@ -267,11 +267,7 @@ INLINE void set_palette_entry(int entry, UINT16 value) g = ((value >> 4) & 0x3e) | ((value >> 15) & 1); b = ((value << 1) & 0x3e) | ((value >> 15) & 1); - r = (r << 2) | (r >> 4); - g = (g << 2) | (g >> 4); - b = (b << 2) | (b >> 4); - - palette_set_color(entry, r, g, b); + palette_set_color(Machine, entry, pal6bit(r), pal6bit(g), pal6bit(b)); } diff --git a/src/vidhrdw/darkmist.c b/src/vidhrdw/darkmist.c index 0d1ce91fe..e9928776a 100644 --- a/src/vidhrdw/darkmist.c +++ b/src/vidhrdw/darkmist.c @@ -77,7 +77,7 @@ PALETTE_INIT(darkmist) int i; /* black color */ - palette_set_color(0x100, 0,0,0); + palette_set_color(machine, 0x100, 0,0,0); /* color lookup tables */ @@ -120,15 +120,9 @@ PALETTE_INIT(darkmist) WRITE8_HANDLER(darkmist_palette_w) { - int r,g,b; - paletteram[offset]=data; offset&=0xff; - r=paletteram[offset+0x200]&0xf; - g=(paletteram[offset])>>4; - b=paletteram[offset]&0x0f; - - palette_set_color(offset, r * 0x11, g * 0x11, b * 0x11); + palette_set_color(Machine, offset, pal4bit(paletteram[offset+0x200]), pal4bit(paletteram[offset] >> 4), pal4bit(paletteram[offset])); } READ8_HANDLER(darkmist_palette_r) @@ -162,7 +156,7 @@ VIDEO_UPDATE( darkmist) tilemap_set_scrollx(fgtilemap, 0, DM_GETSCROLL(0xa)); tilemap_set_scrolly(fgtilemap, 0, DM_GETSCROLL(0xe)); - fillbitmap(bitmap, get_black_pen(), &Machine->screen[0].visarea); + fillbitmap(bitmap, get_black_pen(machine), &Machine->screen[0].visarea); if(darkmist_hw & DISPLAY_BG) { diff --git a/src/vidhrdw/darkseal.c b/src/vidhrdw/darkseal.c index e67e86558..e82503f60 100644 --- a/src/vidhrdw/darkseal.c +++ b/src/vidhrdw/darkseal.c @@ -146,7 +146,7 @@ static void update_24bitcol(int offset) g = (paletteram16[offset] >> 8) & 0xff; b = (paletteram16_2[offset] >> 0) & 0xff; - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } WRITE16_HANDLER( darkseal_palette_24bit_rg_w ) diff --git a/src/vidhrdw/dcheese.c b/src/vidhrdw/dcheese.c index 954a6e18c..7e7417567 100644 --- a/src/vidhrdw/dcheese.c +++ b/src/vidhrdw/dcheese.c @@ -44,7 +44,7 @@ static mame_timer *blitter_timer; PALETTE_INIT( dcheese ) { - UINT16 *src = (UINT16 *)memory_region(REGION_USER1); + const UINT16 *src = (UINT16 *)memory_region(REGION_USER1); int i; /* really 65536 colors, but they don't use the later ones so we can stay */ @@ -52,15 +52,7 @@ PALETTE_INIT( dcheese ) for (i = 0; i < 65534; i++) { int data = *src++; - int b = (data >> 11) & 0x1f; - int g = (data >> 6) & 0x1f; - int r = (data >> 0) & 0x3f; - - /* up to 8 bits */ - r = (r << 2) | (r >> 4); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - palette_set_color(i, r, g, b); + palette_set_color(machine, i, pal6bit(data >> 0), pal5bit(data >> 6), pal5bit(data >> 11)); } } diff --git a/src/vidhrdw/dday.c b/src/vidhrdw/dday.c index 1a9b12509..482bcc730 100644 --- a/src/vidhrdw/dday.c +++ b/src/vidhrdw/dday.c @@ -63,7 +63,7 @@ PALETTE_INIT( dday ) int i; - palette_set_shadow_factor(1.0/8); /* this matches the previos version of the driver (>>3) */ + palette_set_shadow_factor(machine, 1.0/8); /* this matches the previos version of the driver (>>3) */ for (i = 0; i < Machine->drv->total_colors; i++) { @@ -89,7 +89,7 @@ PALETTE_INIT( dday ) bit3 = (color_prom[i + 2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } diff --git a/src/vidhrdw/deadang.c b/src/vidhrdw/deadang.c index a38e6bae6..652938adb 100644 --- a/src/vidhrdw/deadang.c +++ b/src/vidhrdw/deadang.c @@ -150,7 +150,7 @@ VIDEO_UPDATE( deadang ) tilemap_set_enable(pf2_layer,!(deadang_scroll_ram[0x68]&4)); flip_screen_set( deadang_scroll_ram[0x68]&0x40 ); - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); fillbitmap(priority_bitmap,0,cliprect); tilemap_draw(bitmap,cliprect,pf3_layer,0,1); tilemap_draw(bitmap,cliprect,pf1_layer,0,2); diff --git a/src/vidhrdw/dec0.c b/src/vidhrdw/dec0.c index 11dfea65e..d90f21a68 100644 --- a/src/vidhrdw/dec0.c +++ b/src/vidhrdw/dec0.c @@ -130,7 +130,7 @@ static void update_24bitcol(int offset) g = (paletteram16[offset] >> 8) & 0xff; b = (paletteram16_2[offset] >> 0) & 0xff; - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } WRITE16_HANDLER( dec0_paletteram_rg_w ) @@ -726,7 +726,7 @@ VIDEO_START( dec0_nodma ) VIDEO_START( dec0 ) { - video_start_dec0_nodma(); + video_start_dec0_nodma(machine); dec0_spriteram=auto_malloc(0x800); return 0; diff --git a/src/vidhrdw/dec8.c b/src/vidhrdw/dec8.c index c8d446020..50cb961c4 100644 --- a/src/vidhrdw/dec8.c +++ b/src/vidhrdw/dec8.c @@ -99,7 +99,7 @@ PALETTE_INIT( ghostb ) bit3 = (color_prom[i + Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/deco16ic.c b/src/vidhrdw/deco16ic.c index bdd3b8c1d..63a984b10 100644 --- a/src/vidhrdw/deco16ic.c +++ b/src/vidhrdw/deco16ic.c @@ -194,7 +194,7 @@ WRITE16_HANDLER( deco16_nonbuffered_palette_w ) g = (paletteram16[offset+1] >> 8) & 0xff; r = (paletteram16[offset+1] >> 0) & 0xff; - palette_set_color(offset/2,r,g,b); + palette_set_color(Machine,offset/2,r,g,b); } WRITE16_HANDLER( deco16_buffered_palette_w ) @@ -216,7 +216,7 @@ WRITE16_HANDLER( deco16_palette_dma_w ) g = (paletteram16[i*2+1] >> 8) & 0xff; r = (paletteram16[i*2+1] >> 0) & 0xff; - palette_set_color(i,r,g,b); + palette_set_color(Machine,i,r,g,b); } } } diff --git a/src/vidhrdw/deco32.c b/src/vidhrdw/deco32.c index 6aa452a7e..1e335bfae 100644 --- a/src/vidhrdw/deco32.c +++ b/src/vidhrdw/deco32.c @@ -150,7 +150,7 @@ static void updateAceRam(void) r = (UINT8)((float)r + (((float)fadeptr - (float)r) * (float)fadepsr/255.0f)); } - palette_set_color(i,r,g,b); + palette_set_color(Machine,i,r,g,b); } } @@ -169,7 +169,7 @@ WRITE32_HANDLER( deco32_nonbuffered_palette_w ) g = (paletteram32[offset] >> 8) & 0xff; r = (paletteram32[offset] >> 0) & 0xff; - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } WRITE32_HANDLER( deco32_buffered_palette_w ) @@ -197,7 +197,7 @@ WRITE32_HANDLER( deco32_palette_dma_w ) g = (paletteram32[i] >> 8) & 0xff; r = (paletteram32[i] >> 0) & 0xff; - palette_set_color(i,r,g,b); + palette_set_color(Machine,i,r,g,b); } } } @@ -1277,7 +1277,7 @@ VIDEO_UPDATE( captaven ) if (pf3_enable) tilemap_draw(bitmap,cliprect,pf3_tilemap,TILEMAP_IGNORE_TRANSPARENCY,0); else - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); if (deco32_raster_display_position) tilemap_raster_draw(bitmap,cliprect,0,1); @@ -1291,7 +1291,7 @@ VIDEO_UPDATE( captaven ) tilemap_draw(bitmap,cliprect,pf2_tilemap,0,0); } else - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); tilemap_draw(bitmap,cliprect,pf3_tilemap,0,1); } @@ -1342,7 +1342,7 @@ VIDEO_UPDATE( dragngun ) tilemap_set_enable(pf4_tilemap, deco32_pf34_control[5]&0x8000); if ((deco32_pf34_control[5]&0x8000)==0) - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); tilemap_draw(bitmap,cliprect,pf4_tilemap,0,0); tilemap_draw(bitmap,cliprect,pf3_tilemap,0,0); diff --git a/src/vidhrdw/deniam.c b/src/vidhrdw/deniam.c index 6c82c9576..796fd809e 100644 --- a/src/vidhrdw/deniam.c +++ b/src/vidhrdw/deniam.c @@ -156,12 +156,7 @@ WRITE16_HANDLER( deniam_palette_w ) r = ((data << 1) & 0x1e) | ((data >> 12) & 0x01); g = ((data >> 3) & 0x1e) | ((data >> 13) & 0x01); b = ((data >> 7) & 0x1e) | ((data >> 14) & 0x01); - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,pal5bit(r),pal5bit(g),pal5bit(b)); } diff --git a/src/vidhrdw/digdug.c b/src/vidhrdw/digdug.c index da9b985d2..9c13f67dc 100644 --- a/src/vidhrdw/digdug.c +++ b/src/vidhrdw/digdug.c @@ -50,7 +50,7 @@ PALETTE_INIT( digdug ) bit1 = (*color_prom >> 6) & 0x01; bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/diverboy.c b/src/vidhrdw/diverboy.c index 2734f9cf5..783ead334 100644 --- a/src/vidhrdw/diverboy.c +++ b/src/vidhrdw/diverboy.c @@ -48,7 +48,7 @@ static void diverboy_drawsprites( mame_bitmap *bitmap, const rectangle *cliprect VIDEO_UPDATE(diverboy) { -// fillbitmap(bitmap,get_black_pen(),cliprect); +// fillbitmap(bitmap,get_black_pen(machine),cliprect); diverboy_drawsprites(bitmap,cliprect); return 0; } diff --git a/src/vidhrdw/djboy.c b/src/vidhrdw/djboy.c index 60a51d608..6ab1a5c94 100644 --- a/src/vidhrdw/djboy.c +++ b/src/vidhrdw/djboy.c @@ -95,22 +95,13 @@ draw_sprites( mame_bitmap *bitmap,const rectangle *cliprect ) WRITE8_HANDLER( djboy_paletteram_w ) { - int r,g,b; int val; paletteram[offset] = data; offset &= ~1; val = (paletteram[offset]<<8) | paletteram[offset+1]; - r = (val >> 8) & 0xf; - g = (val >> 4) & 0xf; - b = (val >> 0) & 0xf; - - palette_set_color( - offset/2, - (r * 0xff) / 0xf, - (g * 0xff) / 0xf, - (b * 0xff) / 0xf ); + palette_set_color(Machine,offset/2,pal4bit(val >> 8),pal4bit(val >> 4),pal4bit(val >> 0)); } VIDEO_UPDATE( djboy ) diff --git a/src/vidhrdw/dkong.c b/src/vidhrdw/dkong.c index f616db926..7fbe9e664 100644 --- a/src/vidhrdw/dkong.c +++ b/src/vidhrdw/dkong.c @@ -71,7 +71,7 @@ PALETTE_INIT( dkong ) bit1 = (color_prom[0] >> 1) & 1; b = 255 - (0x55 * bit0 + 0xaa * bit1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -141,7 +141,7 @@ PALETTE_INIT( dkong3 ) bit3 = (color_prom[256] >> 3) & 0x01; b = 255 - (0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -224,8 +224,8 @@ WRITE8_HANDLER( radarscp_grid_color_w ) r = ((~data >> 0) & 0x01) * 0xff; g = ((~data >> 1) & 0x01) * 0xff; b = ((~data >> 2) & 0x01) * 0xff; -// palette_set_color(257,r,g,b); - palette_set_color(257,0x00,0x00,0xff); +// palette_set_color(Machine,257,r,g,b); + palette_set_color(Machine,257,0x00,0x00,0xff); } WRITE8_HANDLER( dkong_flipscreen_w ) @@ -335,7 +335,7 @@ static void draw_grid(mame_bitmap *bitmap) VIDEO_UPDATE( radarscp ) { - palette_set_color(256,0xff,0x00,0x00); /* stars */ + palette_set_color(Machine,256,0xff,0x00,0x00); /* stars */ tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); draw_grid(bitmap); diff --git a/src/vidhrdw/docastle.c b/src/vidhrdw/docastle.c index a2e262b04..289339286 100644 --- a/src/vidhrdw/docastle.c +++ b/src/vidhrdw/docastle.c @@ -29,7 +29,7 @@ static tilemap *bg_tilemap, *fg_tilemap; bit 0 -- 390 ohm resistor -- BLUE ***************************************************************************/ -static void convert_color_prom(unsigned short *colortable,const unsigned char *color_prom, +static void convert_color_prom(running_machine *machine,unsigned short *colortable,const unsigned char *color_prom, int priority) { int i,j; @@ -58,15 +58,15 @@ static void convert_color_prom(unsigned short *colortable,const unsigned char *c bit2 = (*color_prom >> 1) & 0x01; b = 0x23 * bit0 + 0x4b * bit1 + 0x91 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } /* reserve one color for the transparent pen (none of the game colors can have */ /* these RGB components) */ - palette_set_color(256,1,1,1); + palette_set_color(machine,256,1,1,1); /* and the last color for the sprite covering pen */ - palette_set_color(257,2,2,2); + palette_set_color(machine,257,2,2,2); /* characters */ @@ -131,12 +131,12 @@ static void convert_color_prom(unsigned short *colortable,const unsigned char *c PALETTE_INIT( docastle ) { - convert_color_prom(colortable,color_prom,0); + convert_color_prom(machine,colortable,color_prom,0); } PALETTE_INIT( dorunrun ) { - convert_color_prom(colortable,color_prom,1); + convert_color_prom(machine,colortable,color_prom,1); } WRITE8_HANDLER( docastle_videoram_w ) diff --git a/src/vidhrdw/dogfgt.c b/src/vidhrdw/dogfgt.c index 0f246d80b..c04f14fcb 100644 --- a/src/vidhrdw/dogfgt.c +++ b/src/vidhrdw/dogfgt.c @@ -51,7 +51,7 @@ PALETTE_INIT( dogfgt ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+16,r,g,b); + palette_set_color(machine,i+16,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/dooyong.c b/src/vidhrdw/dooyong.c index 697caa798..6e700921e 100644 --- a/src/vidhrdw/dooyong.c +++ b/src/vidhrdw/dooyong.c @@ -533,7 +533,7 @@ static void rshark_draw_sprites(mame_bitmap *bitmap) VIDEO_UPDATE( lastday ) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); if(!(lastday_bgscroll[6] & 0x10)) draw_layer(bitmap,2,lastday_bgscroll,memory_region(REGION_GFX5),TRANSPARENCY_NONE); @@ -550,7 +550,7 @@ VIDEO_UPDATE( lastday ) VIDEO_UPDATE( gulfstrm ) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); if(!(lastday_bgscroll[6] & 0x10)) draw_layer(bitmap,2,lastday_bgscroll,memory_region(REGION_GFX5),TRANSPARENCY_NONE); @@ -565,7 +565,7 @@ VIDEO_UPDATE( gulfstrm ) VIDEO_UPDATE( pollux ) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); if(!(lastday_bgscroll[6] & 0x10)) draw_layer(bitmap,2,lastday_bgscroll,memory_region(REGION_GFX5),TRANSPARENCY_NONE); @@ -580,7 +580,7 @@ VIDEO_UPDATE( pollux ) VIDEO_UPDATE( flytiger ) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); if(flytiger_pri) { diff --git a/src/vidhrdw/dotrikun.c b/src/vidhrdw/dotrikun.c index a49d3da23..3906cc036 100644 --- a/src/vidhrdw/dotrikun.c +++ b/src/vidhrdw/dotrikun.c @@ -18,17 +18,8 @@ Driver by Takahiro Nogi (nogi@kt.rim.or.jp) 1999/12/15 - *******************************************************************/ WRITE8_HANDLER( dotrikun_color_w ) { - int r, g, b; - - r = ((data & 0x08) ? 0xff : 0x00); - g = ((data & 0x10) ? 0xff : 0x00); - b = ((data & 0x20) ? 0xff : 0x00); - palette_set_color(0, r, g, b); // BG color - - r = ((data & 0x01) ? 0xff : 0x00); - g = ((data & 0x02) ? 0xff : 0x00); - b = ((data & 0x04) ? 0xff : 0x00); - palette_set_color(1, r, g, b); // DOT color + palette_set_color(Machine, 0, pal1bit(data >> 3), pal1bit(data >> 4), pal1bit(data >> 5)); // BG color + palette_set_color(Machine, 1, pal1bit(data >> 0), pal1bit(data >> 1), pal1bit(data >> 2)); // DOT color } diff --git a/src/vidhrdw/dribling.c b/src/vidhrdw/dribling.c index 495a83582..13b49167d 100644 --- a/src/vidhrdw/dribling.c +++ b/src/vidhrdw/dribling.c @@ -30,7 +30,7 @@ PALETTE_INIT( dribling ) g *= 0x55; b *= 0xff; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/drmicro.c b/src/vidhrdw/drmicro.c index d2f87c322..b98cf3abe 100644 --- a/src/vidhrdw/drmicro.c +++ b/src/vidhrdw/drmicro.c @@ -91,7 +91,7 @@ PALETTE_INIT( drmicro ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/dynax.c b/src/vidhrdw/dynax.c index 5115c31d6..9fdfc43dc 100644 --- a/src/vidhrdw/dynax.c +++ b/src/vidhrdw/dynax.c @@ -36,10 +36,7 @@ PALETTE_INIT( sprtmtch ) int r = BITSWAP8((x >> 0) & 0x1f, 7,6,5, 0,1,2,3,4 ); int g = BITSWAP8((x >> 5) & 0x1f, 7,6,5, 0,1,2,3,4 ); int b = BITSWAP8((x >> 10) & 0x1f, 7,6,5, 0,1,2,3,4 ); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal5bit(r),pal5bit(g),pal5bit(b)); } } @@ -745,7 +742,7 @@ VIDEO_START( hnoridur ) VIDEO_START( mcnpshnt ) { - if (video_start_hnoridur()) return 1; + if (video_start_hnoridur(machine)) return 1; priority_table = priority_mcnpshnt; return 0; } @@ -807,7 +804,7 @@ VIDEO_START( mjdialq2 ) VIDEO_START( mjelctrn ) { - if (video_start_hnoridur()) return 1; + if (video_start_hnoridur(machine)) return 1; priority_table = priority_mjelctrn; update_irq_func = mjelctrn_update_irq; @@ -817,7 +814,7 @@ VIDEO_START( mjelctrn ) VIDEO_START( neruton ) { - if (video_start_hnoridur()) return 1; + if (video_start_hnoridur(machine)) return 1; // priority_table = priority_mjelctrn; update_irq_func = neruton_update_irq; diff --git a/src/vidhrdw/dynduke.c b/src/vidhrdw/dynduke.c index 2a914b91e..346cf33f2 100644 --- a/src/vidhrdw/dynduke.c +++ b/src/vidhrdw/dynduke.c @@ -11,27 +11,17 @@ static int back_enable,fore_enable,sprite_enable; WRITE8_HANDLER( dynduke_paletteram_w ) { - int r,g,b; int color; paletteram[offset]=data; color=paletteram[offset&0xffe]|(paletteram[offset|1]<<8); - - r = (color >> 0) & 0x0f; - g = (color >> 4) & 0x0f; - b = (color >> 8) & 0x0f; - - r = (r << 4) | r; - g = (g << 4) | g; - b = (b << 4) | b; - - palette_set_color(offset/2,r,g,b); + palette_set_color(Machine,offset/2,pal4bit(color >> 0),pal4bit(color >> 4),pal4bit(color >> 8)); /* This is a kludge to handle 5bpp graphics but 4bpp palette data */ /* the 5th bit is actually transparency, so I should use TILEMAP_BITMASK */ if (offset<1024) { - palette_set_color(((offset&0x1f)/2) | (offset&0xffe0) | 2048,r,g,b); - palette_set_color(((offset&0x1f)/2) | (offset&0xffe0) | 2048 | 16,r,g,b); + palette_set_color(Machine,((offset&0x1f)/2) | (offset&0xffe0) | 2048,pal4bit(color >> 0),pal4bit(color >> 4),pal4bit(color >> 8)); + palette_set_color(Machine,((offset&0x1f)/2) | (offset&0xffe0) | 2048 | 16,pal4bit(color >> 0),pal4bit(color >> 4),pal4bit(color >> 8)); } } @@ -189,7 +179,7 @@ VIDEO_UPDATE( dynduke ) if (back_enable) tilemap_draw(bitmap,cliprect,bg_layer,TILEMAP_BACK,0); else - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); draw_sprites(bitmap,cliprect,0); // Untested: does anything use it? Could be behind background draw_sprites(bitmap,cliprect,1); diff --git a/src/vidhrdw/epos.c b/src/vidhrdw/epos.c index 4d853e7e5..0ba70c0cc 100644 --- a/src/vidhrdw/epos.c +++ b/src/vidhrdw/epos.c @@ -51,7 +51,7 @@ PALETTE_INIT( epos ) bit1 = (*color_prom >> 0) & 0x01; b = 0xad * bit0 + 0x52 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/equites.c b/src/vidhrdw/equites.c index 65e6c936f..f613e499d 100644 --- a/src/vidhrdw/equites.c +++ b/src/vidhrdw/equites.c @@ -53,7 +53,7 @@ static void video_init_common(void) // set defaults maskwidth = 8; maskheight = Machine->screen[0].visarea.max_y - Machine->screen[0].visarea.min_y + 1; - maskcolor = get_black_pen(); + maskcolor = get_black_pen(Machine); scrollx = scrolly = 0; for (i=0; i<4; i++) bgcolor[i] = 0; @@ -78,18 +78,11 @@ static void video_init_common(void) PALETTE_INIT( equites ) { UINT8 *clut_ptr; - int i, r, g, b; + int i; for (i=0; i<256; i++) { - r = color_prom[i] & 0xf; - r = (r << 4) + r; - g = color_prom[i+0x100] & 0xf; - g = (g << 4) + g; - b = color_prom[i+0x200] & 0xf; - b = (b << 4) + b; - - palette_set_color(i, r, g, b); + palette_set_color(machine, i, pal4bit(color_prom[i]), pal4bit(color_prom[i+0x100]), pal4bit(color_prom[i+0x200])); colortable[i] = i; } @@ -127,18 +120,11 @@ VIDEO_START( equites ) PALETTE_INIT( splndrbt ) { UINT8 *prom_ptr; - int i, r, g, b; + int i; for (i=0; i<0x100; i++) { - r = color_prom[i] & 0xf; - r = (r << 4) + r; - g = color_prom[i+0x100] & 0xf; - g = (g << 4) + g; - b = color_prom[i+0x200] & 0xf; - b = (b << 4) + b; - - palette_set_color(i, r, g, b); + palette_set_color(machine, i, pal4bit(color_prom[i]), pal4bit(color_prom[i+0x100]), pal4bit(color_prom[i+0x200])); colortable[i] = (i & 3 || (i > 0x3f && i < 0x80) || i > 0xbf) ? i : 0; } diff --git a/src/vidhrdw/espial.c b/src/vidhrdw/espial.c index 2c852315a..32279a521 100644 --- a/src/vidhrdw/espial.c +++ b/src/vidhrdw/espial.c @@ -67,7 +67,7 @@ PALETTE_INIT( espial ) bit2 = (color_prom[i + Machine->drv->total_colors] >> 3) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/exctsccr.c b/src/vidhrdw/exctsccr.c index 72d1e6f39..7e8d801a5 100644 --- a/src/vidhrdw/exctsccr.c +++ b/src/vidhrdw/exctsccr.c @@ -40,7 +40,7 @@ PALETTE_INIT( exctsccr ) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += Machine->drv->total_colors; diff --git a/src/vidhrdw/exedexes.c b/src/vidhrdw/exedexes.c index 4c6c3ff18..0c48ef04d 100644 --- a/src/vidhrdw/exedexes.c +++ b/src/vidhrdw/exedexes.c @@ -64,7 +64,7 @@ PALETTE_INIT( exedexes ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/exerion.c b/src/vidhrdw/exerion.c index b7925858a..207575fef 100644 --- a/src/vidhrdw/exerion.c +++ b/src/vidhrdw/exerion.c @@ -76,7 +76,7 @@ PALETTE_INIT( exerion ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -178,7 +178,7 @@ VIDEO_START( exerion ) } } - return video_start_generic(); + return video_start_generic(machine); } diff --git a/src/vidhrdw/exidy.c b/src/vidhrdw/exidy.c index 4d91dbd76..2556dba5d 100644 --- a/src/vidhrdw/exidy.c +++ b/src/vidhrdw/exidy.c @@ -139,7 +139,7 @@ PALETTE_INIT( exidy ) int i; for (i = 0; i < PALETTE_LEN; i++) - palette_set_color(i,exidy_palette[i*3+0],exidy_palette[i*3+1],exidy_palette[i*3+2]); + palette_set_color(machine,i,exidy_palette[i*3+0],exidy_palette[i*3+1],exidy_palette[i*3+2]); } memcpy(colortable, exidy_colortable, COLORTABLE_LEN * sizeof(colortable[0])); } @@ -154,7 +154,7 @@ PALETTE_INIT( exidy ) VIDEO_START( exidy ) { - if (video_start_generic()) + if (video_start_generic(machine)) return 1; motion_object_1_vid = auto_bitmap_alloc(16, 16); @@ -250,12 +250,7 @@ WRITE8_HANDLER( exidy_color_w ) color_latch[offset] = data; for (i = 0; i < 8; i++) - { - int b = ((color_latch[0] >> i) & 0x01) * 0xff; - int g = ((color_latch[1] >> i) & 0x01) * 0xff; - int r = ((color_latch[2] >> i) & 0x01) * 0xff; - palette_set_color(i, r, g, b); - } + palette_set_color(Machine, i, pal1bit(color_latch[2] >> i), pal1bit(color_latch[1] >> i), pal1bit(color_latch[0] >> i)); } diff --git a/src/vidhrdw/exidy440.c b/src/vidhrdw/exidy440.c index 6666827f4..db52ec639 100644 --- a/src/vidhrdw/exidy440.c +++ b/src/vidhrdw/exidy440.c @@ -135,7 +135,7 @@ WRITE8_HANDLER( exidy440_paletteram_w ) word = (local_paletteram[offset] << 8) + local_paletteram[offset + 1]; /* extract the 5-5-5 RGB colors */ - palette_set_color(offset / 2, ((word >> 10) & 31) << 3, ((word >> 5) & 31) << 3, (word & 31) << 3); + palette_set_color(Machine, offset / 2, pal5bit(word >> 10), pal5bit(word >> 5), pal5bit(word >> 0)); } } @@ -221,7 +221,7 @@ WRITE8_HANDLER( exidy440_control_w ) { /* extract a word and the 5-5-5 RGB components */ int word = (local_paletteram[offset] << 8) + local_paletteram[offset + 1]; - palette_set_color(i, ((word >> 10) & 31) << 3, ((word >> 5) & 31) << 3, (word & 31) << 3); + palette_set_color(Machine, i, pal5bit(word >> 10), pal5bit(word >> 5), pal5bit(word >> 0)); } } } diff --git a/src/vidhrdw/exterm.c b/src/vidhrdw/exterm.c index d45752382..0f34e63d7 100644 --- a/src/vidhrdw/exterm.c +++ b/src/vidhrdw/exterm.c @@ -25,19 +25,7 @@ PALETTE_INIT( exterm ) /* initialize 555 RGB lookup */ for (i = 0; i < 32768; i++) - { - int r,g,b; - - r = (i >> 10) & 0x1f; - g = (i >> 5) & 0x1f; - b = (i >> 0) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(i+4096,r,g,b); - } + palette_set_color(machine, i+4096, pal5bit(i >> 10), pal5bit(i >> 5), pal5bit(i >> 0)); } @@ -86,7 +74,7 @@ VIDEO_UPDATE( exterm ) /* if the display is blanked, fill with black */ if (tms34010_io_display_blanked(0)) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } diff --git a/src/vidhrdw/f1gp.c b/src/vidhrdw/f1gp.c index 5afaf7952..91bcfb37c 100644 --- a/src/vidhrdw/f1gp.c +++ b/src/vidhrdw/f1gp.c @@ -402,7 +402,7 @@ VIDEO_UPDATE( f1gp2 ) { if (gfxctrl & 4) /* blank screen */ { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); } else { diff --git a/src/vidhrdw/fastfred.c b/src/vidhrdw/fastfred.c index 245f40142..6ea0a40c0 100644 --- a/src/vidhrdw/fastfred.c +++ b/src/vidhrdw/fastfred.c @@ -70,7 +70,7 @@ static void set_color(pen_t pen, int i) bit3 = (fastfred_color_prom[i + 0x200] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(pen,r,g,b); + palette_set_color(Machine,pen,r,g,b); } PALETTE_INIT( fastfred ) @@ -403,8 +403,8 @@ VIDEO_START( imago ) galaxian_stars_on = 1; /* web colors */ - palette_set_color(256+64+0,0x50,0x00,0x00); - palette_set_color(256+64+1,0x00,0x00,0x00); + palette_set_color(machine,256+64+0,0x50,0x00,0x00); + palette_set_color(machine,256+64+1,0x00,0x00,0x00); return 0; } diff --git a/src/vidhrdw/fcombat.c b/src/vidhrdw/fcombat.c index 80885b4b7..e531e04d1 100644 --- a/src/vidhrdw/fcombat.c +++ b/src/vidhrdw/fcombat.c @@ -80,7 +80,7 @@ PALETTE_INIT( fcombat ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -116,7 +116,7 @@ PALETTE_INIT( fcombat ) VIDEO_START( fcombat ) { bgmap = tilemap_create(get_bg_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE, 16, 16,32*8*2,32); - return video_start_generic(); + return video_start_generic(machine); } diff --git a/src/vidhrdw/finalizr.c b/src/vidhrdw/finalizr.c index ff7ea44e6..56ab8cf91 100644 --- a/src/vidhrdw/finalizr.c +++ b/src/vidhrdw/finalizr.c @@ -47,7 +47,7 @@ PALETTE_INIT( finalizr ) bit3 = (color_prom[Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/firetrap.c b/src/vidhrdw/firetrap.c index d83552eba..691ec6029 100644 --- a/src/vidhrdw/firetrap.c +++ b/src/vidhrdw/firetrap.c @@ -68,7 +68,7 @@ PALETTE_INIT( firetrap ) bit3 = (color_prom[i + Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/fitfight.c b/src/vidhrdw/fitfight.c index c6e8d5fa1..2b648f2d7 100644 --- a/src/vidhrdw/fitfight.c +++ b/src/vidhrdw/fitfight.c @@ -124,7 +124,7 @@ VIDEO_UPDATE(fitfight) vblank = (fof_700000[0] & 0x8000); if (vblank > 0) - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); else { // if (code_pressed(KEYCODE_Q)) // scrollbak = ((fof_a00000[0]&0xff00) >> 5) - ((fof_700000[0] & 0x0038) >> 3); diff --git a/src/vidhrdw/flower.c b/src/vidhrdw/flower.c index 6a1ac2d83..caf4869a8 100644 --- a/src/vidhrdw/flower.c +++ b/src/vidhrdw/flower.c @@ -8,18 +8,11 @@ UINT8 *flower_textram, *flower_bg0ram, *flower_bg1ram, *flower_bg0_scroll, *flow PALETTE_INIT( flower ) { - int i, r, g, b; + int i; for (i=0; i<256; i++) { - r = color_prom[i] & 0xf; - r = (r << 4) + r; - g = color_prom[i+0x100] & 0xf; - g = (g << 4) + g; - b = color_prom[i+0x200] & 0xf; - b = (b << 4) + b; - - palette_set_color(i, r, g, b); + palette_set_color(machine, i, pal4bit(color_prom[i]), pal4bit(color_prom[i+0x100]), pal4bit(color_prom[i+0x200])); colortable[i] = i; } } diff --git a/src/vidhrdw/flstory.c b/src/vidhrdw/flstory.c index ceb950e63..ae556e0ef 100644 --- a/src/vidhrdw/flstory.c +++ b/src/vidhrdw/flstory.c @@ -53,7 +53,7 @@ VIDEO_START( flstory ) paletteram = auto_malloc(0x200); paletteram_2 = auto_malloc(0x200); - return video_start_generic(); + return video_start_generic(machine); } VIDEO_START( victnine ) @@ -63,7 +63,7 @@ VIDEO_START( victnine ) paletteram = auto_malloc(0x200); paletteram_2 = auto_malloc(0x200); - return video_start_generic(); + return video_start_generic(machine); } WRITE8_HANDLER( flstory_videoram_w ) diff --git a/src/vidhrdw/foodf.c b/src/vidhrdw/foodf.c index 824210df1..4153e9f0e 100644 --- a/src/vidhrdw/foodf.c +++ b/src/vidhrdw/foodf.c @@ -97,7 +97,7 @@ WRITE16_HANDLER( foodf_paletteram_w ) bit2 = (newword >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, r, g, b); } diff --git a/src/vidhrdw/fromanc2.c b/src/vidhrdw/fromanc2.c index e1ce9bd14..1c2240a28 100644 --- a/src/vidhrdw/fromanc2.c +++ b/src/vidhrdw/fromanc2.c @@ -77,41 +77,23 @@ READ16_HANDLER( fromanc2_paletteram_1_r ) WRITE16_HANDLER( fromanc2_paletteram_0_w ) { UINT16 color; - UINT8 r, g, b; COMBINE_DATA(&fromanc2_paletteram[0][offset]); // GGGG_GRRR_RRBB_BBBx - r = (data >> 6) & 0x1f; - g = (data >> 11) & 0x1f; - b = (data >> 1) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - color = ((offset & 0x0700) << 1) + (offset & 0x00ff); - palette_set_color(0x000 + color, r, g, b); + palette_set_color(Machine, 0x000 + color, pal5bit(data >> 6), pal5bit(data >> 11), pal5bit(data >> 1)); } WRITE16_HANDLER( fromanc2_paletteram_1_w ) { UINT16 color; - UINT8 r, g, b; COMBINE_DATA(&fromanc2_paletteram[1][offset]); // GGGG_GRRR_RRBB_BBBx - r = (data >> 6) & 0x1f; - g = (data >> 11) & 0x1f; - b = (data >> 1) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - color = ((offset & 0x0700) << 1) + (offset & 0x00ff); - palette_set_color(0x100 + color, r, g, b); + palette_set_color(Machine, 0x100 + color, pal5bit(data >> 6), pal5bit(data >> 11), pal5bit(data >> 1)); } @@ -128,41 +110,23 @@ READ16_HANDLER( fromancr_paletteram_1_r ) WRITE16_HANDLER( fromancr_paletteram_0_w ) { UINT16 color; - UINT8 r, g, b; COMBINE_DATA(&fromanc2_paletteram[0][offset]); // xGGG_GGRR_RRRB_BBBB - r = (data >> 5) & 0x1f; - g = (data >> 10) & 0x1f; - b = (data >> 0) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - color = ((offset & 0x0700) << 1) + (offset & 0x00ff); - palette_set_color(0x000 + color, r, g, b); + palette_set_color(Machine, 0x000 + color, pal5bit(data >> 5), pal5bit(data >> 10), pal5bit(data >> 0)); } WRITE16_HANDLER( fromancr_paletteram_1_w ) { UINT16 color; - UINT8 r, g, b; COMBINE_DATA(&fromanc2_paletteram[1][offset]); // xGGG_GGRR_RRRB_BBBB - r = (data >> 5) & 0x1f; - g = (data >> 10) & 0x1f; - b = (data >> 0) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - color = ((offset & 0x0700) << 1) + (offset & 0x00ff); - palette_set_color(0x100 + color, r, g, b); + palette_set_color(Machine, 0x100 + color, pal5bit(data >> 5), pal5bit(data >> 10), pal5bit(data >> 0)); } @@ -179,41 +143,23 @@ READ16_HANDLER( fromanc4_paletteram_1_r ) WRITE16_HANDLER( fromanc4_paletteram_0_w ) { UINT16 color; - UINT8 r, g, b; COMBINE_DATA(&fromanc2_paletteram[0][offset]); // xRRR_RRGG_GGGB_BBBB - r = (data >> 10) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 0) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - color = ((offset & 0x0700) << 1) + (offset & 0x00ff); - palette_set_color(0x000 + color, r, g, b); + palette_set_color(Machine, 0x000 + color, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0)); } WRITE16_HANDLER( fromanc4_paletteram_1_w ) { UINT16 color; - UINT8 r, g, b; COMBINE_DATA(&fromanc2_paletteram[1][offset]); // xRRR_RRGG_GGGB_BBBB - r = (data >> 10) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 0) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - color = ((offset & 0x0700) << 1) + (offset & 0x00ff); - palette_set_color(0x100 + color, r, g, b); + palette_set_color(Machine, 0x100 + color, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0)); } diff --git a/src/vidhrdw/fromance.c b/src/vidhrdw/fromance.c index aa9851888..72d474b6d 100644 --- a/src/vidhrdw/fromance.c +++ b/src/vidhrdw/fromance.c @@ -163,7 +163,6 @@ READ8_HANDLER( fromance_paletteram_r ) WRITE8_HANDLER( fromance_paletteram_w ) { int palword; - int r, g, b; /* adjust for banking and modify */ offset |= selected_paletteram << 11; @@ -171,15 +170,7 @@ WRITE8_HANDLER( fromance_paletteram_w ) /* compute R,G,B */ palword = (local_paletteram[offset | 1] << 8) | local_paletteram[offset & ~1]; - r = (palword >> 10) & 0x1f; - g = (palword >> 5) & 0x1f; - b = (palword >> 0) & 0x1f; - - /* up to 8 bits */ - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - palette_set_color(offset / 2, r, g, b); + palette_set_color(Machine, offset / 2, pal5bit(palword >> 10), pal5bit(palword >> 5), pal5bit(palword >> 0)); } diff --git a/src/vidhrdw/funkybee.c b/src/vidhrdw/funkybee.c index 7eeee50c1..d83b80dce 100644 --- a/src/vidhrdw/funkybee.c +++ b/src/vidhrdw/funkybee.c @@ -37,7 +37,7 @@ PALETTE_INIT( funkybee ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/funybubl.c b/src/vidhrdw/funybubl.c index 30410c014..cfec0d8ed 100644 --- a/src/vidhrdw/funybubl.c +++ b/src/vidhrdw/funybubl.c @@ -16,7 +16,6 @@ WRITE8_HANDLER ( funybubl_paldatawrite ) int colchanged ; UINT32 coldat; - int r,g,b; funybubl_paletteram[offset] = data; @@ -24,11 +23,7 @@ WRITE8_HANDLER ( funybubl_paldatawrite ) coldat = funybubl_paletteram[colchanged*4] | (funybubl_paletteram[colchanged*4+1] << 8) | (funybubl_paletteram[colchanged*4+2] << 16) | (funybubl_paletteram[colchanged*4+3] << 24); - g = coldat & 0x003f; - b = (coldat >> 6) & 0x3f; - r = (coldat >> 12) & 0x3f; - - palette_set_color(colchanged,r<<2,g<<2,b<<2); + palette_set_color(Machine,colchanged,pal6bit(coldat >> 12),pal6bit(coldat >> 0),pal6bit(coldat >> 6)); } @@ -87,7 +82,7 @@ VIDEO_UPDATE(funybubl) offs = 0; - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); /* tilemap .. convert it .. banking makes it slightly more annoying but still easy */ diff --git a/src/vidhrdw/fuukifg2.c b/src/vidhrdw/fuukifg2.c index 12c108cb5..eb3bb64f4 100644 --- a/src/vidhrdw/fuukifg2.c +++ b/src/vidhrdw/fuukifg2.c @@ -90,7 +90,7 @@ PALETTE_INIT( fuuki16 ) /* The game does not initialise the palette at startup. It should be totally black */ for (pen = 0; pen < Machine->drv->total_colors; pen++) - palette_set_color(pen,0,0,0); + palette_set_color(machine,pen,0,0,0); } VIDEO_START( fuuki16 ) diff --git a/src/vidhrdw/gaelco2.c b/src/vidhrdw/gaelco2.c index fedca96ad..2a17b38b6 100644 --- a/src/vidhrdw/gaelco2.c +++ b/src/vidhrdw/gaelco2.c @@ -240,12 +240,12 @@ WRITE16_HANDLER( gaelco2_palette_w ) g = (color >> 5) & 0x1f; b = (color >> 0) & 0x1f; - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); + r = pal5bit(r); + g = pal5bit(g); + b = pal5bit(b); /* update game palette */ - palette_set_color(4096*0 + offset, r, g, b); + palette_set_color(Machine, 4096*0 + offset, r, g, b); /* update shadow/highligh palettes */ for (i = 1; i < 16; i++){ @@ -257,7 +257,7 @@ WRITE16_HANDLER( gaelco2_palette_w ) auxg = ADJUST_COLOR(g + pen_color_adjust[i]); auxb = ADJUST_COLOR(b + pen_color_adjust[i]); - palette_set_color(4096*i + offset, auxr, auxg, auxb); + palette_set_color(Machine, 4096*i + offset, auxr, auxg, auxb); } } @@ -479,7 +479,7 @@ VIDEO_UPDATE( gaelco2 ) VIDEO_UPDATE( bang ) { /* standard rendering on this hardware */ - video_update_gaelco2(screen, bitmap, cliprect); + video_update_gaelco2(machine, screen, bitmap, cliprect); /* draw crosshairs */ { diff --git a/src/vidhrdw/galaga.c b/src/vidhrdw/galaga.c index 707e79152..d387a47a4 100644 --- a/src/vidhrdw/galaga.c +++ b/src/vidhrdw/galaga.c @@ -356,7 +356,7 @@ PALETTE_INIT( galaga ) bit2 = ((*color_prom) >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -382,7 +382,7 @@ PALETTE_INIT( galaga ) bits = (i >> 4) & 0x03; b = map[bits]; - palette_set_color(i + 32,r,g,b); + palette_set_color(machine,i + 32,r,g,b); } } diff --git a/src/vidhrdw/galaxian.c b/src/vidhrdw/galaxian.c index 3b95e2829..d644604d4 100644 --- a/src/vidhrdw/galaxian.c +++ b/src/vidhrdw/galaxian.c @@ -209,7 +209,7 @@ PALETTE_INIT( galaxian ) bit1 = BIT(*color_prom,7); b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -218,26 +218,26 @@ PALETTE_INIT( galaxian ) /* bullets - yellow and white */ - palette_set_color(BULLETS_COLOR_BASE+0,0xef,0xef,0x00); - palette_set_color(BULLETS_COLOR_BASE+1,0xef,0xef,0xef); + palette_set_color(machine,BULLETS_COLOR_BASE+0,0xef,0xef,0x00); + palette_set_color(machine,BULLETS_COLOR_BASE+1,0xef,0xef,0xef); } PALETTE_INIT( scramble ) { - palette_init_galaxian(colortable, color_prom); + palette_init_galaxian(machine, colortable, color_prom); /* blue background - 390 ohm resistor */ - palette_set_color(BACKGROUND_COLOR_BASE,0,0,0x56); + palette_set_color(machine,BACKGROUND_COLOR_BASE,0,0,0x56); } PALETTE_INIT( moonwar ) { - palette_init_scramble(colortable, color_prom); + palette_init_scramble(machine, colortable, color_prom); /* wire mod to connect the bullet blue output to the 220 ohm resistor */ - palette_set_color(BULLETS_COLOR_BASE+0,0xef,0xef,0x97); + palette_set_color(machine,BULLETS_COLOR_BASE+0,0xef,0xef,0x97); } PALETTE_INIT( turtles ) @@ -245,7 +245,7 @@ PALETTE_INIT( turtles ) int i; - palette_init_galaxian(colortable, color_prom); + palette_init_galaxian(machine, colortable, color_prom); /* The background color generator is connected this way: @@ -260,7 +260,7 @@ PALETTE_INIT( turtles ) int g = BIT(i,1) * 0x47; int b = BIT(i,2) * 0x55; - palette_set_color(BACKGROUND_COLOR_BASE+i,r,g,b); + palette_set_color(machine,BACKGROUND_COLOR_BASE+i,r,g,b); } } @@ -269,7 +269,7 @@ PALETTE_INIT( stratgyx ) int i; - palette_init_galaxian(colortable, color_prom); + palette_init_galaxian(machine, colortable, color_prom); /* The background color generator is connected this way: @@ -284,17 +284,17 @@ PALETTE_INIT( stratgyx ) int g = BIT(i,1) * 0x3c; int b = BIT(i,2) * 0x47; - palette_set_color(BACKGROUND_COLOR_BASE+i,r,g,b); + palette_set_color(machine,BACKGROUND_COLOR_BASE+i,r,g,b); } } PALETTE_INIT( frogger ) { - palette_init_galaxian(colortable, color_prom); + palette_init_galaxian(machine, colortable, color_prom); /* blue background - 470 ohm resistor */ - palette_set_color(BACKGROUND_COLOR_BASE,0,0,0x47); + palette_set_color(machine,BACKGROUND_COLOR_BASE,0,0,0x47); } PALETTE_INIT( rockclim ) @@ -323,7 +323,7 @@ PALETTE_INIT( rockclim ) bit1 = BIT(*color_prom,7); b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } @@ -369,14 +369,14 @@ PALETTE_INIT( darkplnt ) bit2 = BIT(*color_prom,5); b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } /* bullets - red and blue */ - palette_set_color(BULLETS_COLOR_BASE+0,0xef,0x00,0x00); - palette_set_color(BULLETS_COLOR_BASE+1,0x00,0x00,0xef); + palette_set_color(machine,BULLETS_COLOR_BASE+0,0xef,0x00,0x00); + palette_set_color(machine,BULLETS_COLOR_BASE+1,0x00,0x00,0xef); } PALETTE_INIT( minefld ) @@ -384,7 +384,7 @@ PALETTE_INIT( minefld ) int i; - palette_init_galaxian(colortable, color_prom); + palette_init_galaxian(machine, colortable, color_prom); /* set up background colors */ @@ -396,7 +396,7 @@ PALETTE_INIT( minefld ) int r = 0; int g = i; int b = i * 2; - palette_set_color(BACKGROUND_COLOR_BASE+i,r,g,b); + palette_set_color(machine,BACKGROUND_COLOR_BASE+i,r,g,b); } /* graduated brown */ @@ -406,7 +406,7 @@ PALETTE_INIT( minefld ) int r = i * 1.5; int g = i * 0.75; int b = i / 2; - palette_set_color(BACKGROUND_COLOR_BASE+128+i,r,g,b); + palette_set_color(machine,BACKGROUND_COLOR_BASE+128+i,r,g,b); } } @@ -415,7 +415,7 @@ PALETTE_INIT( rescue ) int i; - palette_init_galaxian(colortable, color_prom); + palette_init_galaxian(machine, colortable, color_prom); /* set up background colors */ @@ -427,7 +427,7 @@ PALETTE_INIT( rescue ) int r = 0; int g = i; int b = i * 2; - palette_set_color(BACKGROUND_COLOR_BASE+i,r,g,b); + palette_set_color(machine,BACKGROUND_COLOR_BASE+i,r,g,b); } } @@ -436,7 +436,7 @@ PALETTE_INIT( mariner ) int i; - palette_init_galaxian(colortable, color_prom); + palette_init_galaxian(machine, colortable, color_prom); /* set up background colors */ @@ -456,7 +456,7 @@ PALETTE_INIT( mariner ) g = 0; b = 0x0e * BIT(i,0) + 0x1f * BIT(i,1) + 0x43 * BIT(i,2) + 0x8f * BIT(i,3); - palette_set_color(BACKGROUND_COLOR_BASE+i,r,g,b); + palette_set_color(machine,BACKGROUND_COLOR_BASE+i,r,g,b); } } @@ -465,7 +465,7 @@ PALETTE_INIT( dambustr ) { int i; - palette_init_galaxian(colortable, color_prom); + palette_init_galaxian(machine, colortable, color_prom); /* @@ -482,7 +482,7 @@ PALETTE_INIT( dambustr ) int r = BIT(i,0) * 0x47; int g = BIT(i,1) * 0x47; int b = BIT(i,2) * 0x4f; - palette_set_color(BACKGROUND_COLOR_BASE+i,r,g,b); + palette_set_color(machine,BACKGROUND_COLOR_BASE+i,r,g,b); } } @@ -565,7 +565,7 @@ VIDEO_START( galaxian_plain ) VIDEO_START( galaxian ) { - int ret = video_start_galaxian_plain(); + int ret = video_start_galaxian_plain(machine); draw_stars = galaxian_draw_stars; @@ -576,7 +576,7 @@ VIDEO_START( galaxian ) VIDEO_START( gmgalax ) { - int ret = video_start_galaxian(); + int ret = video_start_galaxian(machine); modify_charcode = gmgalax_modify_charcode; modify_spritecode = gmgalax_modify_spritecode; @@ -587,7 +587,7 @@ VIDEO_START( gmgalax ) VIDEO_START( mooncrst ) { - int ret = video_start_galaxian(); + int ret = video_start_galaxian(machine); modify_charcode = mooncrst_modify_charcode; modify_spritecode = mooncrst_modify_spritecode; @@ -597,7 +597,7 @@ VIDEO_START( mooncrst ) VIDEO_START( mooncrgx ) { - int ret = video_start_galaxian(); + int ret = video_start_galaxian(machine); modify_charcode = mooncrgx_modify_charcode; modify_spritecode = mooncrgx_modify_spritecode; @@ -607,7 +607,7 @@ VIDEO_START( mooncrgx ) VIDEO_START( moonqsr ) { - int ret = video_start_galaxian(); + int ret = video_start_galaxian(machine); modify_charcode = moonqsr_modify_charcode; modify_spritecode = moonqsr_modify_spritecode; @@ -617,7 +617,7 @@ VIDEO_START( moonqsr ) VIDEO_START( mshuttle ) { - int ret = video_start_galaxian(); + int ret = video_start_galaxian(machine); modify_charcode = mshuttle_modify_charcode; modify_spritecode = mshuttle_modify_spritecode; @@ -627,7 +627,7 @@ VIDEO_START( mshuttle ) VIDEO_START( pisces ) { - int ret = video_start_galaxian(); + int ret = video_start_galaxian(machine); modify_charcode = pisces_modify_charcode; modify_spritecode = pisces_modify_spritecode; @@ -637,7 +637,7 @@ VIDEO_START( pisces ) VIDEO_START( gteikob2 ) { - int ret = video_start_pisces(); + int ret = video_start_pisces(machine); draw_bullets = gteikob2_draw_bullets; @@ -646,7 +646,7 @@ VIDEO_START( gteikob2 ) VIDEO_START( batman2 ) { - int ret = video_start_galaxian(); + int ret = video_start_galaxian(machine); modify_charcode = batman2_modify_charcode; modify_spritecode = batman2_modify_spritecode; @@ -656,7 +656,7 @@ VIDEO_START( batman2 ) VIDEO_START( scramble ) { - int ret = video_start_galaxian_plain(); + int ret = video_start_galaxian_plain(machine); draw_stars = scramble_draw_stars; @@ -685,7 +685,7 @@ VIDEO_START( sfx ) VIDEO_START( turtles ) { - int ret = video_start_galaxian_plain(); + int ret = video_start_galaxian_plain(machine); draw_background = turtles_draw_background; @@ -694,7 +694,7 @@ VIDEO_START( turtles ) VIDEO_START( theend ) { - int ret = video_start_galaxian(); + int ret = video_start_galaxian(machine); draw_bullets = theend_draw_bullets; @@ -703,7 +703,7 @@ VIDEO_START( theend ) VIDEO_START( darkplnt ) { - int ret = video_start_galaxian_plain(); + int ret = video_start_galaxian_plain(machine); draw_bullets = darkplnt_draw_bullets; @@ -712,7 +712,7 @@ VIDEO_START( darkplnt ) VIDEO_START( rescue ) { - int ret = video_start_scramble(); + int ret = video_start_scramble(machine); draw_stars = rescue_draw_stars; @@ -723,7 +723,7 @@ VIDEO_START( rescue ) VIDEO_START( minefld ) { - int ret = video_start_scramble(); + int ret = video_start_scramble(machine); draw_stars = rescue_draw_stars; @@ -734,7 +734,7 @@ VIDEO_START( minefld ) VIDEO_START( stratgyx ) { - int ret = video_start_galaxian_plain(); + int ret = video_start_galaxian_plain(machine); draw_background = stratgyx_draw_background; @@ -743,7 +743,7 @@ VIDEO_START( stratgyx ) VIDEO_START( ckongs ) { - int ret = video_start_scramble(); + int ret = video_start_scramble(machine); modify_spritecode = mshuttle_modify_spritecode; @@ -752,7 +752,7 @@ VIDEO_START( ckongs ) VIDEO_START( calipso ) { - int ret = video_start_galaxian_plain(); + int ret = video_start_galaxian_plain(machine); draw_bullets = scramble_draw_bullets; @@ -765,7 +765,7 @@ VIDEO_START( calipso ) VIDEO_START( mariner ) { - int ret = video_start_galaxian_plain(); + int ret = video_start_galaxian_plain(machine); draw_stars = mariner_draw_stars; @@ -780,7 +780,7 @@ VIDEO_START( mariner ) VIDEO_START( froggers ) { - int ret = video_start_galaxian_plain(); + int ret = video_start_galaxian_plain(machine); draw_background = frogger_draw_background; modify_color = frogger_modify_color; @@ -790,7 +790,7 @@ VIDEO_START( froggers ) VIDEO_START( frogger ) { - int ret = video_start_froggers(); + int ret = video_start_froggers(machine); modify_ypos = frogger_modify_ypos; @@ -799,7 +799,7 @@ VIDEO_START( frogger ) VIDEO_START( jumpbug ) { - int ret = video_start_scramble(); + int ret = video_start_scramble(machine); draw_stars = jumpbug_draw_stars; @@ -811,7 +811,7 @@ VIDEO_START( jumpbug ) VIDEO_START( azurian ) { - int ret = video_start_galaxian_plain(); + int ret = video_start_galaxian_plain(machine); draw_stars = galaxian_draw_stars; draw_bullets = scramble_draw_bullets; /* Shots are yellow like in Scramble */ @@ -821,7 +821,7 @@ VIDEO_START( azurian ) VIDEO_START( mimonkey ) { - int ret = video_start_scramble(); + int ret = video_start_scramble(machine); modify_charcode = mimonkey_modify_charcode; modify_spritecode = mimonkey_modify_spritecode; @@ -831,7 +831,7 @@ VIDEO_START( mimonkey ) VIDEO_START( dkongjrm ) { - int ret = video_start_galaxian_plain(); + int ret = video_start_galaxian_plain(machine); modify_charcode = pisces_modify_charcode; modify_spritecode = dkongjrm_modify_spritecode; @@ -843,7 +843,7 @@ VIDEO_START( dkongjrm ) VIDEO_START( newsin7 ) { - int ret = video_start_scramble(); + int ret = video_start_scramble(machine); spritevisiblearea = &_spritevisibleareaflipx; spritevisibleareaflipx = &_spritevisiblearea; @@ -853,7 +853,7 @@ VIDEO_START( newsin7 ) VIDEO_START( scorpion ) { - int ret = video_start_scramble(); + int ret = video_start_scramble(machine); modify_spritecode = batman2_modify_spritecode; @@ -872,7 +872,7 @@ static void rockclim_modify_spritecode(UINT8 *spriteram,int *code,int *flipx,int VIDEO_START( rockclim ) { - int ret = video_start_galaxian(); + int ret = video_start_galaxian(machine); rockclim_tilemap = tilemap_create(rockclim_get_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,8,8,64,32); draw_background = rockclim_draw_background; modify_charcode = mooncrst_modify_charcode; @@ -1044,7 +1044,7 @@ VIDEO_START( racknrol ) VIDEO_START( bongo ) { - int ret = video_start_galaxian_plain(); + int ret = video_start_galaxian_plain(machine); modify_spritecode = batman2_modify_spritecode; @@ -1073,7 +1073,7 @@ static void dambustr_get_tile_info2(int tile_index) VIDEO_START( dambustr ) { - int ret = video_start_galaxian(); + int ret = video_start_galaxian(machine); dambustr_bg_split_line = 0; dambustr_bg_color_1 = 0; @@ -1838,7 +1838,7 @@ void galaxian_init_stars(int colors_offset) g = map[bits]; bits = (i >> 4) & 0x03; b = map[bits]; - palette_set_color(colors_offset+i,r,g,b); + palette_set_color(Machine,colors_offset+i,r,g,b); } diff --git a/src/vidhrdw/galivan.c b/src/vidhrdw/galivan.c index 033c3c10d..6eeef4b87 100644 --- a/src/vidhrdw/galivan.c +++ b/src/vidhrdw/galivan.c @@ -31,20 +31,27 @@ background: 0x4000 bytes of ROM: 76543210 tile code low bits #include "driver.h" -static unsigned char scrollx[2], scrolly[2]; +static UINT8 scrollx[2], scrolly[2]; /* Layers has only bits 5-6 active. 6 selects background off/on - 5 is unknown (active only on title screen, + 5 controls sprite priority (active only on title screen, not for scores or push start nor game) */ -static int flipscreen, layers; +static UINT8 flipscreen; +static UINT8 write_layers, layers; +static UINT8 ninjemak_dispdisable; static tilemap *bg_tilemap, *tx_tilemap; -static const unsigned char *spritepalettebank; -static int ninjemak_dispdisable; +static const UINT8 *spritepalettebank; + +/* Notes: + write_layers and layers are used in galivan/dangar but not ninjemak + ninjemak_dispdisable is used in ninjemak but not galivan/dangar + spritepalettebank is set at palette init and doesn't need to be saved +*/ @@ -80,7 +87,7 @@ PALETTE_INIT( galivan ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -137,7 +144,7 @@ PALETTE_INIT( galivan ) static void get_bg_tile_info(int tile_index) { - unsigned char *BGROM = memory_region(REGION_GFX4); + UINT8 *BGROM = memory_region(REGION_GFX4); int attr = BGROM[tile_index + 0x4000]; int code = BGROM[tile_index] | ((attr & 0x03) << 8); SET_TILE_INFO( @@ -156,12 +163,12 @@ static void get_tx_tile_info(int tile_index) code, (attr & 0xe0) >> 5, /* not sure */ 0) - tile_info.priority = attr & 8 ? 0 : 1; /* wrong */ + tile_info.priority = attr & 8 ? 0 : 1; /* seems correct */ } static void ninjemak_get_bg_tile_info(int tile_index) { - unsigned char *BGROM = memory_region(REGION_GFX4); + UINT8 *BGROM = memory_region(REGION_GFX4); int attr = BGROM[tile_index + 0x4000]; int code = BGROM[tile_index] | ((attr & 0x03) << 8); SET_TILE_INFO( @@ -192,6 +199,10 @@ static void ninjemak_get_tx_tile_info(int tile_index) VIDEO_START( galivan ) { + /* configure ROM banking */ + UINT8 *rombase = memory_region(REGION_CPU1); + memory_configure_bank(1, 0, 2, &rombase[0x10000], 0x2000); + bg_tilemap = tilemap_create(get_bg_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE, 16,16,128,128); tx_tilemap = tilemap_create(get_tx_tile_info,tilemap_scan_cols,TILEMAP_TRANSPARENT,8,8,32,32); @@ -200,11 +211,22 @@ VIDEO_START( galivan ) tilemap_set_transparent_pen(tx_tilemap,15); + /* register for saving */ + state_save_register_global_array(scrollx); + state_save_register_global_array(scrolly); + state_save_register_global(flipscreen); + state_save_register_global(write_layers); + state_save_register_global(layers); + return 0; } VIDEO_START( ninjemak ) { + /* configure ROM banking */ + UINT8 *rombase = memory_region(REGION_CPU1); + memory_configure_bank(1, 0, 4, &rombase[0x10000], 0x2000); + bg_tilemap = tilemap_create(ninjemak_get_bg_tile_info,tilemap_scan_cols,TILEMAP_OPAQUE, 16,16,512,32); tx_tilemap = tilemap_create(ninjemak_get_tx_tile_info,tilemap_scan_cols,TILEMAP_TRANSPARENT,8,8,32,32); @@ -213,6 +235,12 @@ VIDEO_START( ninjemak ) tilemap_set_transparent_pen(tx_tilemap,15); + /* register for saving */ + state_save_register_global_array(scrollx); + state_save_register_global_array(scrolly); + state_save_register_global(flipscreen); + state_save_register_global(ninjemak_dispdisable); + return 0; } @@ -255,12 +283,7 @@ WRITE8_HANDLER( galivan_gfxbank_w ) tilemap_set_flip (tx_tilemap, flipscreen ? TILEMAP_FLIPX|TILEMAP_FLIPY : 0); /* bit 7 selects one of two ROM banks for c000-dfff */ - { - int bank = (data & 0x80) >> 7; - unsigned char *RAM = memory_region(REGION_CPU1); - - memory_set_bankptr(1,&RAM[0x10000 + 0x2000 * bank]); - } + memory_set_bank(1, (data & 0x80) >> 7); /* logerror("Address: %04X - port 40 = %02x\n",activecpu_get_pc(),data); */ } @@ -301,12 +324,7 @@ logerror("%04x: write %02x to port 80\n",activecpu_get_pc(),data); /* bit 5 sprite flag ??? */ /* bit 6, 7 ROM bank select */ - { - int bank = (data & 0xc0) >> 6; - unsigned char *RAM = memory_region(REGION_CPU1); - - memory_set_bankptr(1,&RAM[0x10000 + 0x2000 * bank]); - } + memory_set_bank(1, (data & 0xc0) >> 6); #if 0 { @@ -327,13 +345,12 @@ logerror("%04x: write %02x to port 80\n",activecpu_get_pc(),data); /* Written through port 41-42 */ WRITE8_HANDLER( galivan_scrollx_w ) { - static int up = 0; if (offset == 1) { if (data & 0x80) - up = 1; - else if (up) { + write_layers = 1; + else if (write_layers) { layers = data & 0x60; - up = 0; + write_layers = 0; } } scrollx[offset] = data; @@ -411,11 +428,16 @@ VIDEO_UPDATE( galivan ) else tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); - tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); - - draw_sprites(bitmap,cliprect); + if (layers & 0x20) { + tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); + tilemap_draw(bitmap,cliprect,tx_tilemap,1,0); + draw_sprites(bitmap,cliprect); + } else { + draw_sprites(bitmap,cliprect); + tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); + tilemap_draw(bitmap,cliprect,tx_tilemap,1,0); + } - tilemap_draw(bitmap,cliprect,tx_tilemap,1,0); return 0; } diff --git a/src/vidhrdw/galpani2.c b/src/vidhrdw/galpani2.c index d0afb9c62..255e217d0 100644 --- a/src/vidhrdw/galpani2.c +++ b/src/vidhrdw/galpani2.c @@ -71,10 +71,7 @@ WRITE16_HANDLER( galpani2_bg8_##_n_##_w ) \ WRITE16_HANDLER( galpani2_palette_##_n_##_w ) \ { \ UINT16 newword = COMBINE_DATA(&galpani2_palette_##_n_[offset]); \ - int r = (newword >> 5) & 0x1f; \ - int g = (newword >> 10) & 0x1f; \ - int b = (newword >> 0) & 0x1f; \ - palette_set_color( offset + 0x4000 + _n_ * 0x100, (r << 3) | (r >> 2),(g << 3) | (g >> 2),(b << 3) | (b >> 2) ); \ + palette_set_color( Machine, offset + 0x4000 + _n_ * 0x100, pal5bit(newword >> 5), pal5bit(newword >> 10), pal5bit(newword >> 0) ); \ } galpani2_BG8_REGS_R( 0 ) @@ -129,17 +126,7 @@ PALETTE_INIT( galpani2 ) /* initialize 555 RGB lookup */ for (i = 0; i < 0x8000; i++) - { - int r,g,b; - r = (i >> 5) & 0x1f; - g = (i >> 10) & 0x1f; - b = (i >> 0) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - palette_set_color(0x4200+i,r,g,b); - } + palette_set_color(machine,0x4200+i,pal5bit(i >> 5),pal5bit(i >> 10),pal5bit(i >> 0)); } VIDEO_START( galpani2 ) @@ -149,7 +136,7 @@ VIDEO_START( galpani2 ) if ((galpani2_bg8_bitmap_0 = auto_bitmap_alloc_depth(512, 256, 16)) == 0) return 1; if ((galpani2_bg8_bitmap_1 = auto_bitmap_alloc_depth(512, 256, 16)) == 0) return 1; - return video_start_kaneko16_sprites(); + return video_start_kaneko16_sprites(machine); } diff --git a/src/vidhrdw/galpanic.c b/src/vidhrdw/galpanic.c index 0a805be83..3cb22f532 100644 --- a/src/vidhrdw/galpanic.c +++ b/src/vidhrdw/galpanic.c @@ -29,18 +29,7 @@ PALETTE_INIT( galpanic ) /* initialize 555 RGB lookup */ for (i = 0;i < 32768;i++) - { - int r,g,b; - - r = (i >> 5) & 0x1f; - g = (i >> 10) & 0x1f; - b = (i >> 0) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - palette_set_color(i+1024,r,g,b); - } + palette_set_color(machine,i+1024,pal5bit(i >> 5),pal5bit(i >> 10),pal5bit(i >> 0)); } @@ -60,20 +49,9 @@ WRITE16_HANDLER( galpanic_bgvideoram_w ) WRITE16_HANDLER( galpanic_paletteram_w ) { - int r,g,b; - data = COMBINE_DATA(&paletteram16[offset]); - - r = (data >> 6) & 0x1f; - g = (data >> 11) & 0x1f; - b = (data >> 1) & 0x1f; /* bit 0 seems to be a transparency flag for the front bitmap */ - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,pal5bit(data >> 6),pal5bit(data >> 11),pal5bit(data >> 1)); } diff --git a/src/vidhrdw/galspnbl.c b/src/vidhrdw/galspnbl.c index 47a305451..3f178bbbc 100644 --- a/src/vidhrdw/galspnbl.c +++ b/src/vidhrdw/galspnbl.c @@ -12,18 +12,7 @@ PALETTE_INIT( galspnbl ) /* initialize 555 RGB lookup */ for (i = 0;i < 32768;i++) - { - int r,g,b; - - r = (i >> 5) & 0x1f; - g = (i >> 10) & 0x1f; - b = (i >> 0) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - palette_set_color(i+1024,r,g,b); - } + palette_set_color(machine,i+1024,pal5bit(i >> 5),pal5bit(i >> 10),pal5bit(i >> 0)); } diff --git a/src/vidhrdw/gaplus.c b/src/vidhrdw/gaplus.c index 5526b8d42..50633a2fe 100644 --- a/src/vidhrdw/gaplus.c +++ b/src/vidhrdw/gaplus.c @@ -59,7 +59,7 @@ PALETTE_INIT( gaplus ) bit3 = (color_prom[i + 0x200] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += 0x300; diff --git a/src/vidhrdw/gberet.c b/src/vidhrdw/gberet.c index dfb9fb052..fdb6f9036 100644 --- a/src/vidhrdw/gberet.c +++ b/src/vidhrdw/gberet.c @@ -50,7 +50,7 @@ PALETTE_INIT( gberet ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/generic.c b/src/vidhrdw/generic.c index b2a319927..9d3cb7d13 100644 --- a/src/vidhrdw/generic.c +++ b/src/vidhrdw/generic.c @@ -218,7 +218,7 @@ INLINE UINT32 paletteram32_be(offs_t offset) INLINE void set_color_444(pen_t color, int rshift, int gshift, int bshift, UINT16 data) { - palette_set_color(color, pal4bit(data >> rshift), pal4bit(data >> gshift), pal4bit(data >> bshift)); + palette_set_color(Machine, color, pal4bit(data >> rshift), pal4bit(data >> gshift), pal4bit(data >> bshift)); } @@ -239,7 +239,7 @@ INLINE void set_color_4444(pen_t color, int ishift, int rshift, int gshift, int g = ((data >> gshift) & 15) * i; b = ((data >> bshift) & 15) * i; - palette_set_color(color, r, g, b); + palette_set_color(Machine, color, r, g, b); } @@ -251,7 +251,7 @@ INLINE void set_color_4444(pen_t color, int ishift, int rshift, int gshift, int INLINE void set_color_555(pen_t color, int rshift, int gshift, int bshift, UINT16 data) { - palette_set_color(color, pal5bit(data >> rshift), pal5bit(data >> gshift), pal5bit(data >> bshift)); + palette_set_color(Machine, color, pal5bit(data >> rshift), pal5bit(data >> gshift), pal5bit(data >> bshift)); } @@ -263,7 +263,7 @@ INLINE void set_color_555(pen_t color, int rshift, int gshift, int bshift, UINT1 INLINE void set_color_888(pen_t color, int rshift, int gshift, int bshift, UINT32 data) { - palette_set_color(color, (data >> rshift) & 0xff, (data >> gshift) & 0xff, (data >> bshift) & 0xff); + palette_set_color(Machine, color, (data >> rshift) & 0xff, (data >> gshift) & 0xff, (data >> bshift) & 0xff); } @@ -277,7 +277,7 @@ INLINE void set_color_888(pen_t color, int rshift, int gshift, int bshift, UINT3 register for save states -------------------------------------------------*/ -void generic_video_init(void) +void generic_video_init(running_machine *machine) { videoram = NULL; videoram16 = NULL; @@ -694,8 +694,8 @@ int get_vh_global_attribute_changed(void) PALETTE_INIT( black_and_white ) { - palette_set_color(0,0x00,0x00,0x00); /* black */ - palette_set_color(1,0xff,0xff,0xff); /* white */ + palette_set_color(machine,0,0x00,0x00,0x00); /* black */ + palette_set_color(machine,1,0xff,0xff,0xff); /* white */ } @@ -738,7 +738,7 @@ PALETTE_INIT( RRRR_GGGG_BBBB ) bit3 = (color_prom[i + 2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } @@ -800,7 +800,7 @@ READ32_HANDLER( paletteram32_r ) WRITE8_HANDLER( paletteram_RRRGGGBB_w ) { paletteram[offset] = data; - palette_set_color(offset, pal3bit(data >> 5), pal3bit(data >> 2), pal2bit(data >> 0)); + palette_set_color(Machine, offset, pal3bit(data >> 5), pal3bit(data >> 2), pal2bit(data >> 0)); } @@ -811,7 +811,7 @@ WRITE8_HANDLER( paletteram_RRRGGGBB_w ) WRITE8_HANDLER( paletteram_BBGGGRRR_w ) { paletteram[offset] = data; - palette_set_color(offset, pal3bit(data >> 0), pal3bit(data >> 3), pal2bit(data >> 6)); + palette_set_color(Machine, offset, pal3bit(data >> 0), pal3bit(data >> 3), pal2bit(data >> 6)); } @@ -824,9 +824,9 @@ WRITE8_HANDLER( paletteram_BBGGRRII_w ) int i = (data >> 0) & 3; paletteram[offset] = data; - palette_set_color(offset, pal4bit(((data >> 0) & 0x0c) | i), - pal4bit(((data >> 2) & 0x0c) | i), - pal4bit(((data >> 4) & 0x0c) | i)); + palette_set_color(Machine, offset, pal4bit(((data >> 0) & 0x0c) | i), + pal4bit(((data >> 2) & 0x0c) | i), + pal4bit(((data >> 4) & 0x0c) | i)); } @@ -1089,9 +1089,9 @@ WRITE16_HANDLER( paletteram16_RRRRGGGGBBBBRGBx_word_w ) { COMBINE_DATA(&paletteram16[offset]); data = paletteram16[offset]; - palette_set_color(offset, pal5bit(((data >> 11) & 0x1e) | ((data >> 3) & 0x01)), - pal5bit(((data >> 7) & 0x1e) | ((data >> 2) & 0x01)), - pal5bit(((data >> 3) & 0x1e) | ((data >> 1) & 0x01))); + palette_set_color(Machine, offset, pal5bit(((data >> 11) & 0x1e) | ((data >> 3) & 0x01)), + pal5bit(((data >> 7) & 0x1e) | ((data >> 2) & 0x01)), + pal5bit(((data >> 3) & 0x1e) | ((data >> 1) & 0x01))); } diff --git a/src/vidhrdw/generic.h b/src/vidhrdw/generic.h index 28046360e..3e38859a0 100644 --- a/src/vidhrdw/generic.h +++ b/src/vidhrdw/generic.h @@ -93,7 +93,7 @@ extern const gfx_layout gfx_16x16x4_planar; /* ----- initialization ----- */ /* set up all the common systems */ -void generic_video_init(void); +void generic_video_init(running_machine *machine); /* generic video start with dirty buffers */ VIDEO_START( generic ); @@ -158,8 +158,8 @@ int get_vh_global_attribute_changed(void); /* ----- generic palette init routines ----- */ -void palette_init_black_and_white(UINT16 *colortable, const UINT8 *color_prom); -void palette_init_RRRR_GGGG_BBBB(UINT16 *colortable, const UINT8 *color_prom); +PALETTE_INIT( black_and_white ); +PALETTE_INIT( RRRR_GGGG_BBBB ); diff --git a/src/vidhrdw/genesis.c b/src/vidhrdw/genesis.c index 7c5c6f055..99da710a5 100644 --- a/src/vidhrdw/genesis.c +++ b/src/vidhrdw/genesis.c @@ -295,9 +295,9 @@ VIDEO_UPDATE( genesis ) VIDEO_UPDATE( segac2 ) { if (!display_enable) - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); else - video_update_genesis(screen, bitmap, cliprect); + video_update_genesis(machine, screen, bitmap, cliprect); return 0; } @@ -523,15 +523,7 @@ static void vdp_data_w(int data) case 0x03: /* Palette write */ { int offset = (vdp_address/2) % CRAM_SIZE; - int r = (data >> 1) & 0x07; - int g = (data >> 5) & 0x07; - int b = (data >> 9) & 0x07; - - r = (r << 5) | (r << 2) | (r >> 1); - g = (g << 5) | (g << 2) | (g >> 1); - b = (b << 5) | (b << 2) | (b >> 1); - - palette_set_color(offset + genesis_palette_base, r, g, b); + palette_set_color(Machine, offset + genesis_palette_base, pal3bit(data >> 1), pal3bit(data >> 5), pal3bit(data >> 9)); } break; diff --git a/src/vidhrdw/gijoe.c b/src/vidhrdw/gijoe.c index ddafa2d09..ae02db56d 100644 --- a/src/vidhrdw/gijoe.c +++ b/src/vidhrdw/gijoe.c @@ -146,7 +146,7 @@ VIDEO_UPDATE( gijoe ) sortlayers(layer, layer_pri); - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); fillbitmap(priority_bitmap, 0, cliprect); K056832_tilemap_draw(bitmap,cliprect, layer[0], 0, 1); diff --git a/src/vidhrdw/gladiatr.c b/src/vidhrdw/gladiatr.c index ecf5c801a..eca4b18f0 100644 --- a/src/vidhrdw/gladiatr.c +++ b/src/vidhrdw/gladiatr.c @@ -136,11 +136,7 @@ WRITE8_HANDLER( gladiatr_paletteram_w ) g = (g << 1) + ((paletteram[offset + 0x400] >> 5) & 0x01); b = (b << 1) + ((paletteram[offset + 0x400] >> 6) & 0x01); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,pal5bit(r),pal5bit(g),pal5bit(b)); } @@ -327,6 +323,6 @@ VIDEO_UPDATE( gladiatr ) tilemap_draw(bitmap,cliprect,fg_tilemap,0,0); } else - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); return 0; } diff --git a/src/vidhrdw/glass.c b/src/vidhrdw/glass.c index 913513771..3243aa744 100644 --- a/src/vidhrdw/glass.c +++ b/src/vidhrdw/glass.c @@ -210,7 +210,7 @@ VIDEO_UPDATE( glass ) tilemap_set_scrollx(pant[1], 0, glass_vregs[3]); /* draw layers + sprites */ - fillbitmap(bitmap, get_black_pen(), &Machine->screen[0].visarea); + fillbitmap(bitmap, get_black_pen(machine), &Machine->screen[0].visarea); copybitmap(bitmap,screen_bitmap,0,0,0x18,0x24,cliprect,TRANSPARENCY_NONE,0); tilemap_draw(bitmap,cliprect,pant[1],0,0); tilemap_draw(bitmap,cliprect,pant[0],0,0); diff --git a/src/vidhrdw/goal92.c b/src/vidhrdw/goal92.c index f33277fe2..5697eaa18 100644 --- a/src/vidhrdw/goal92.c +++ b/src/vidhrdw/goal92.c @@ -173,7 +173,7 @@ VIDEO_UPDATE( goal92 ) tilemap_set_scrolly(foreground_layer, 0, goal92_scrollram16[3] + 8); } - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); tilemap_draw(bitmap,cliprect,background_layer,0,0); draw_sprites(bitmap,cliprect,2); diff --git a/src/vidhrdw/goldstar.c b/src/vidhrdw/goldstar.c index 1a9326bbf..96801725e 100644 --- a/src/vidhrdw/goldstar.c +++ b/src/vidhrdw/goldstar.c @@ -29,7 +29,7 @@ VIDEO_START( goldstar ) { // int i; - if (video_start_generic() != 0) + if (video_start_generic(machine) != 0) return 1; dirtybuffer1 = auto_malloc(3 * goldstar_video_size * sizeof(UINT8)); diff --git a/src/vidhrdw/gomoku.c b/src/vidhrdw/gomoku.c index 20e212d34..1a8ba3faa 100644 --- a/src/vidhrdw/gomoku.c +++ b/src/vidhrdw/gomoku.c @@ -51,7 +51,7 @@ PALETTE_INIT( gomoku ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i, r, g, b); + palette_set_color(machine,i, r, g, b); color_prom++; } } diff --git a/src/vidhrdw/gottlieb.c b/src/vidhrdw/gottlieb.c index e44ea832e..eef8a364c 100644 --- a/src/vidhrdw/gottlieb.c +++ b/src/vidhrdw/gottlieb.c @@ -85,7 +85,7 @@ WRITE8_HANDLER( gottlieb_paletteram_w ) b = 0x10 * bit0 + 0x21 * bit1 + 0x46 * bit2 + 0x88 * bit3; - palette_set_color(offset / 2, r, g, b); + palette_set_color(Machine, offset / 2, r, g, b); } WRITE8_HANDLER( gottlieb_video_outputs_w ) diff --git a/src/vidhrdw/gotya.c b/src/vidhrdw/gotya.c index 449925c59..efc9b68d0 100644 --- a/src/vidhrdw/gotya.c +++ b/src/vidhrdw/gotya.c @@ -49,7 +49,7 @@ PALETTE_INIT( gotya ) b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); color_prom++; } @@ -107,10 +107,18 @@ static void get_bg_tile_info(int tile_index) SET_TILE_INFO(0, code, color, 0) } +UINT32 tilemap_scan_rows_thehand( UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows ) +{ + /* logical (col,row) -> memory offset */ + row = 31-row; + col = 63-col; + return ((row)*(num_cols>>1)) + (col&31) + ((col>>5)*0x400); +} + VIDEO_START( gotya ) { - bg_tilemap = tilemap_create(get_bg_tile_info, tilemap_scan_rows_flip_xy, - TILEMAP_OPAQUE, 8, 8, 32, 32); + bg_tilemap = tilemap_create(get_bg_tile_info, tilemap_scan_rows_thehand, + TILEMAP_OPAQUE, 8, 8, 64, 32); if ( !bg_tilemap ) return 1; diff --git a/src/vidhrdw/grchamp.c b/src/vidhrdw/grchamp.c index 906fb3b2f..aea3e3d22 100644 --- a/src/vidhrdw/grchamp.c +++ b/src/vidhrdw/grchamp.c @@ -3,274 +3,134 @@ /* updated by Hans Andersson, dec 2005 */ #include #include "driver.h" +#include "res_net.h" #include "includes/grchamp.h" #define FOG_SIZE 70 -UINT8 grchamp_videoreg0; -static UINT8 grchamp_player_xpos; -UINT8 grchamp_player_ypos; -int grchamp_collision; -static UINT8 grchamp_tile_number; -static UINT8 grchamp_rain_xpos; -static UINT8 grchamp_rain_ypos; -static int bg_palette_bank; -static mame_bitmap *work_bitmap; +#define RGB_MAX 191 -UINT8 grchamp_vreg1[0x10]; /* background control registers */ -UINT8 *grchamp_videoram; /* background tilemaps */ -UINT8 *grchamp_radar; /* bitmap for radar */ -static tilemap *bg_tilemap[3]; - -WRITE8_HANDLER( grchamp_player_xpos_w ) +PALETTE_INIT( grchamp ) { - grchamp_player_xpos = data; -} + static const int resistances[3] = { 100, 270, 470 }; + double rweights[3], gweights[3], bweights[2]; + grchamp_state *state = machine->driver_data; + int i; + + /* compute the color output resistor weights */ + compute_resistor_weights(0, RGB_MAX, -1.0, + 3, &resistances[0], rweights, 0, 100, + 3, &resistances[0], gweights, 0, 100, + 2, &resistances[0], bweights, 0, 100); + + /* initialize the palette with these colors */ + for (i = 0; i < 0x20; i++) + { + int bit0, bit1, bit2, r, g, b; -WRITE8_HANDLER( grchamp_player_ypos_w ) -{ - grchamp_player_ypos = data; -} + /* red component */ + bit0 = (color_prom[i] >> 0) & 1; + bit1 = (color_prom[i] >> 1) & 1; + bit2 = (color_prom[i] >> 2) & 1; + r = combine_3_weights(rweights, bit0, bit1, bit2); -WRITE8_HANDLER( grchamp_tile_select_w ) -{ - /* tile select: bits 4..7:rain; bits 0..3:player car */ - grchamp_tile_number = data; -} + /* green component */ + bit0 = (color_prom[i] >> 3) & 1; + bit1 = (color_prom[i] >> 4) & 1; + bit2 = (color_prom[i] >> 5) & 1; + g = combine_3_weights(gweights, bit0, bit1, bit2); -WRITE8_HANDLER( grchamp_rain_xpos_w ) -{ - grchamp_rain_xpos = data; + /* blue component */ + bit0 = (color_prom[i] >> 6) & 1; + bit1 = (color_prom[i] >> 7) & 1; + b = combine_2_weights(bweights, bit0, bit1); + + state->bgcolor[i] = MAKE_RGB(r, g, b); + } } -WRITE8_HANDLER( grchamp_rain_ypos_w ) + +WRITE8_HANDLER( grchamp_left_w ) { - grchamp_rain_ypos = data; + grchamp_state *state = Machine->driver_data; + state->leftram[offset] = data; + tilemap_mark_tile_dirty(state->left_tilemap, offset); } -static void add_fog(UINT8 inc, UINT8 *col) +WRITE8_HANDLER( grchamp_center_w ) { - int add = *col + inc; - - if(add > 240) - add = 240; - *col = (UINT8) add; + grchamp_state *state = Machine->driver_data; + state->centerram[offset] = data; + tilemap_mark_tile_dirty(state->center_tilemap, offset); } - -PALETTE_INIT( grchamp ) +WRITE8_HANDLER( grchamp_right_w ) { - int i,j; - UINT8 r,g,b; - static const UINT8 rg_bits[8] = {0,42,67,92,126,139,148,156}; // Calculated values as below - static const UINT8 b_bits[4] = {0,67,126,148}; // Calculated values as below - - /* for r & g DAC is 100, 270, 470 Ohm wired together, connected to 100 Ohm pull-up and finally 100 Ohm in series */ - /* for b DAC is 100, 270 Ohm wired together, connected to 100 Ohm pull-up and finally 100 Ohm in series */ - - for( i=0; i<0x20; i++ ) - { - UINT8 data = *color_prom++; - // data = BBGGGRRR - /* red component */ - r = rg_bits[data & 7]; - /* green component */ - g = rg_bits[(data & 56) >> 3]; - /* blue component */ - b = b_bits[(data & 192) >> 6]; - palette_set_color(i,r,g,b); - } - - /* The two color proms uses the same DAC to controll RGB, but second prom has less resolution, */ - /* Meaning on is the same as all bits are on */ - - for( i=0; i<0x20; i++ ) - { - int data = *color_prom++; - r = (data&4)?0:rg_bits[7]; - g = (data&2)?0:rg_bits[7]; - b = (data&1)?0:b_bits[3]; - - //Bit 3 indicate that the pixel is an object - //and is used in the collision check (on the real board) - //objects[i]=(data&8)?0:1; - - palette_set_color(i+0x20,r,g,b); - } - - /* Fog pens*/ - for ( j=0; jdriver_data; + state->rightram[offset] = data; + tilemap_mark_tile_dirty(state->right_tilemap, offset); } -WRITE8_HANDLER( grchamp_videoram_w ) +static void get_text_tile_info(int offset) { - if( grchamp_videoram[offset]!=data ) - { - grchamp_videoram[offset] = data; - tilemap_mark_tile_dirty( bg_tilemap[offset/0x800], offset%0x800 ); - } + grchamp_state *state = Machine->driver_data; + SET_TILE_INFO(0, state->videoram[offset], 0, 0); } -static void get_bg0_tile_info( int offset ) +static void get_left_tile_info(int offset) { - int tile_number = grchamp_videoram[offset]; - SET_TILE_INFO( - 1, - tile_number, - bg_palette_bank, - 0) + grchamp_state *state = Machine->driver_data; + SET_TILE_INFO(1, state->leftram[offset], 0, 0); } -static void get_bg1_tile_info( int offset ) +static void get_right_tile_info(int offset) { - int tile_number = grchamp_videoram[offset+0x800]+256; - SET_TILE_INFO( - 1, - tile_number, - bg_palette_bank, - 0) + grchamp_state *state = Machine->driver_data; + SET_TILE_INFO(2, state->rightram[offset], 0, 0); } -static void get_bg2_tile_info( int offset ) +static void get_center_tile_info(int offset) { - int tile_number = grchamp_videoram[offset+0x800*2]+256*2; - SET_TILE_INFO( - 1, - tile_number, - 0, - 0) + grchamp_state *state = Machine->driver_data; + SET_TILE_INFO(3, state->centerram[offset], 0, 0); } -static UINT32 get_memory_offset( UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows ) +static UINT32 get_memory_offset(UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows) { - int offset = (31-row)*32; - offset += 31-(col%32); - if( col/32 ) offset += 0x400; - return offset; + return (col % 32) + row * 32 + (col / 32) * 32*32; } VIDEO_START( grchamp ) { - work_bitmap = auto_bitmap_alloc( 32,32 ); - if( !work_bitmap ) - return 1; + grchamp_state *state = machine->driver_data; - bg_tilemap[0] = tilemap_create(get_bg0_tile_info,get_memory_offset,TILEMAP_OPAQUE,8,8,64,32); - if(!bg_tilemap[0]) + state->work_bitmap = auto_bitmap_alloc(32,32); + if (!state->work_bitmap) return 1; - bg_tilemap[1] = tilemap_create(get_bg1_tile_info,get_memory_offset,TILEMAP_TRANSPARENT,8,8,64,32); - if(!bg_tilemap[1]) - return 1; - bg_tilemap[2] = tilemap_create(get_bg2_tile_info,get_memory_offset,TILEMAP_TRANSPARENT,8,8,64,32); - if(!bg_tilemap[2]) + + /* allocate tilemaps for each of the three sections */ + state->text_tilemap = tilemap_create(get_text_tile_info, tilemap_scan_rows, TILEMAP_OPAQUE, 8,8, 32,32); + state->left_tilemap = tilemap_create(get_left_tile_info, get_memory_offset, TILEMAP_OPAQUE, 8,8, 64,32); + state->right_tilemap = tilemap_create(get_right_tile_info, get_memory_offset, TILEMAP_OPAQUE, 8,8, 64,32); + state->center_tilemap = tilemap_create(get_center_tile_info, get_memory_offset, TILEMAP_OPAQUE, 8,8, 64,32); + if (!state->left_tilemap || !state->center_tilemap || !state->right_tilemap) return 1; - tilemap_set_transparent_pen( bg_tilemap[1], 0 ); - tilemap_set_transparent_pen( bg_tilemap[2], 0 ); return 0; } -static void draw_text( mame_bitmap *bitmap, const rectangle *cliprect ) -{ - const gfx_element *gfx = Machine->gfx[0]; - const UINT8 *source = videoram; - int bank = (grchamp_videoreg0&0x20)?256:0; - int offs; - for( offs=0; offs<0x400; offs++ ) - { - int col = offs%32; - int row = offs/32; - int scroll = colorram[col*2]-1; - int attributes = colorram[col*2+1]; - int tile_number = source[offs]; - - drawgfx(bitmap, - gfx, - bank + tile_number, - attributes, - 0,0, /* no flip */ - 8*col, - (8*row-scroll)&0xff, - cliprect, - (col==31)?TRANSPARENCY_NONE:TRANSPARENCY_PEN,0); - } -} - -static void draw_background( mame_bitmap *bitmap, const rectangle *cliprect) -{ - int dx = -48; - int dy = 16; - int attributes = grchamp_vreg1[0x3]; - /* ----xxxx Analog Tachometer output - ** ---x---- palette select - ** --x----- enables msb of bg#3 xscroll - ** xx------ unused - */ - - int color = (attributes&0x10)?1:0; - if( color != bg_palette_bank ) - { - bg_palette_bank = color; - tilemap_mark_all_tiles_dirty( ALL_TILEMAPS ); - } - - tilemap_set_scrollx( bg_tilemap[0], 0, dx-(grchamp_vreg1[0x0]+grchamp_vreg1[0x1]*256) ); - tilemap_set_scrolly( bg_tilemap[0], 0, dy - grchamp_vreg1[0x2] ); - tilemap_set_scrollx( bg_tilemap[1], 0, dx-(grchamp_vreg1[0x5]+grchamp_vreg1[0x6]*256) ); - tilemap_set_scrolly( bg_tilemap[1], 0, dy - grchamp_vreg1[0x7] ); - tilemap_set_scrollx( bg_tilemap[2], 0, dx-(grchamp_vreg1[0x9]+ ((attributes&0x20)?256:(grchamp_vreg1[0xa]*256)))); - tilemap_set_scrolly( bg_tilemap[2], 0, dy - grchamp_vreg1[0xb] ); - - tilemap_draw(bitmap,cliprect,bg_tilemap[0],0,0); //Left lane - tilemap_draw(bitmap,cliprect,bg_tilemap[1],0,0); //Right lane - tilemap_draw(bitmap,cliprect,bg_tilemap[2],0,0); //Center lane -} - -static void draw_player_car( mame_bitmap *bitmap, const rectangle *cliprect ) -{ - drawgfx( bitmap, - Machine->gfx[2], - grchamp_tile_number&0xf, - 1, /* color = red */ - 0,0, /* flip */ - 256-grchamp_player_xpos, - 240-grchamp_player_ypos, - cliprect, - TRANSPARENCY_PEN, 0 ); -} - -static int collision_check( mame_bitmap *bitmap, int which ) +#if 0 +static int collision_check(grchamp_state *state, mame_bitmap *bitmap, int which ) { int bgcolor = Machine->pens[0]; int sprite_transp = Machine->pens[0x24]; const rectangle *clip = &Machine->screen[0].visarea; - int y0 = 240-grchamp_player_ypos; - int x0 = 256-grchamp_player_xpos; + int y0 = 240 - state->cpu0_out[3]; + int x0 = 256 - state->cpu0_out[2]; int x,y,sx,sy; int pixel; int result = 0; @@ -278,9 +138,9 @@ static int collision_check( mame_bitmap *bitmap, int which ) if( which==0 ) { /* draw the current player sprite into a work bitmap */ - drawgfx( work_bitmap, - Machine->gfx[2], - grchamp_tile_number&0xf, + drawgfx( state->work_bitmap, + Machine->gfx[4], + state->cpu0_out[4]&0xf, 1, /* color */ 0,0, 0,0, @@ -292,7 +152,7 @@ static int collision_check( mame_bitmap *bitmap, int which ) { for( x = 0; x<32; x++ ) { - pixel = read_pixel(work_bitmap,x,y); + pixel = read_pixel(state->work_bitmap,x,y); if( pixel != sprite_transp ){ sx = x+x0; sy = y+y0; @@ -316,36 +176,12 @@ static int collision_check( mame_bitmap *bitmap, int which ) return result?(1<gfx[4]; - int tile_number = grchamp_tile_number>>4; - if( tile_number ){ - int scrollx = grchamp_rain_xpos; - int scrolly = grchamp_rain_ypos; - int sx,sy; - - palette_set_highlight_factor32(1.7); - - for( sy=0; sy<256; sy+=16 ){ - for( sx=0; sx<256; sx+=16 ){ - drawgfx( bitmap, - gfx, - tile_number, - 1, - 0,0, - (sx+scrollx)&0xff,(sy+scrolly)&0xff, - cliprect, - TRANSPARENCY_PEN_TABLE, 0 ); - } - } - } -} - -static void draw_fog( mame_bitmap *bitmap, const rectangle *cliprect, int fog ){ +static void draw_fog(grchamp_state *state, mame_bitmap *bitmap, const rectangle *cliprect, int fog) +{ int x,y,pen,offs; // Emulation of analog fog effect - for(x=0;x<100;x++) + for (x = 0; x < 100; x++) { offs = 0x40; if(x > (100-FOG_SIZE-1)) @@ -354,139 +190,370 @@ static void draw_fog( mame_bitmap *bitmap, const rectangle *cliprect, int fog ){ { pen = read_pixel(bitmap, x, y); plot_pixel(bitmap,x, y, pen + offs); - } } } -static void draw_headlights( mame_bitmap *bitmap, const rectangle *cliprect, int fog ) +static void draw_sprites(grchamp_state *state, mame_bitmap *bitmap, const rectangle *cliprect) { - int x0 = 256-grchamp_player_xpos-64; - int y0 = 240-grchamp_player_ypos-64; const gfx_element *gfx = Machine->gfx[5]; - int code=0; + int bank = (state->cpu0_out[0] & 0x20) ? 0x40 : 0x00; + const UINT8 *source = state->spriteram + 0x40; + const UINT8 *finish = source + 0x40; - if(!fog) + while (source < finish) { - code +=2; - palette_set_highlight_factor32(1.7); + int sx = source[3]; + int sy = 240-source[0]; + int color = source[2]; + int code = source[1]; + drawgfx(bitmap, gfx, + bank + (code & 0x3f), + color, + code & 0x40, + code & 0x80, + sx,sy, + cliprect, + TRANSPARENCY_PEN, 0); + source += 4; } - else - palette_set_highlight_factor32(1.3); +} +#endif - // TODO - fog headlights should have highlights without blue component - // i.e if(fog) palette_set_shadow_dRGB32(1,10,10,0,0);, but that appears - // not to be supported. - drawgfx( bitmap, - gfx, - code+0, - 1, - 0,0, - x0, - y0, - cliprect, - TRANSPARENCY_PEN_TABLE, 0 ); +static void draw_objects(grchamp_state *state, int y, UINT8 *objdata) +{ +/* + CPU 5/7: - drawgfx( bitmap, - gfx, - code+1, - 1, - 0,0, - x0, - y0+64, - cliprect, - TRANSPARENCY_PEN_TABLE, 0 ); + TOP-LEFT: + 2xLS163 counters + /CNTRLD loads HPOSI0-7 + /CNTRCLR | /256H clears (i.e., cleared on /CNTRCLR only during HBLANK) + clocks on 6MHz + + Output from counters is inverted if /256H = 1 (during visible area) + + Becomes address in line buffer + + TOP-CENTER: (POINT "A" == output from 74LS02 pin 13) + 0 during visible area (always) + 0 during HBLANK if: + 2xLS163 counters & 0xf8 == 0xf8 or + 2xLS163 counters & 0xf8 == 0x00 + When 0, forces /RC0, /RC1, /RC2, /RV0, /RV1 to 1 + + When drawing (during HBLANK): + /RC0 = 0 iff (RAW0 | RAW1) & (prev /RC11) & (prev /RC22) & HPOSI0 + /RC1 = 0 iff (RAW0 | RAW1) & (prev /RC00) & (prev /RC22) & HPOSI1 + /RC2 = 0 iff (RAW0 | RAW1) & (prev /RC00) & (prev /RC11) & HPOSI2 + /RV0 = RAW0 | (prev bit value & !(RAW0 | RAW1)) + /RV1 = RAW1 | (prev bit value & !(RAW0 | RAW1)) -} -static void draw_radar( mame_bitmap *bitmap, const rectangle *cliprect ){ - const UINT8 *source = grchamp_radar; - int color = Machine->pens[3]; - int offs; - for( offs=0; offs<0x400; offs++ ){ - int data = source[offs]; - if( data ){ - int x = (offs%32)*8; - int y = (offs/32)+16; - int bit; - for( bit=0; bit<8; bit++ ){ - if( data&0x80 ) - if ((x+bit) >= cliprect->min_x && (x+bit) <= cliprect->max_x && - y >= cliprect->min_y && y <= cliprect->max_y) - plot_pixel( bitmap, x+bit, y, color ); - data <<= 1; + + /RC00 = (RAW0|RAW1) | DOUT(2) + /RC11 = (RAW0|RAW1) | DOUT(3) + /RC22 = (RAW0|RAW1) | DOUT(4) + + +*/ + const UINT8 *prom = memory_region(REGION_PROMS) + 0x20; + const gfx_element *gfx; + int change = (state->cpu0_out[0] & 0x20) << 3; + int num; + + /* first clear to 0; this is done as the previous scanline was scanned */ + memset(objdata, 0, 256); + + /* now draw the sprites; this is done during HBLANK */ + gfx = Machine->gfx[4]; + for (num = 0; num < 16; num++) + { + /* + Each sprite is 4 bytes. The logic reads one byte every 2H: + 5C,7D,5E,7F, 5C,5D,5E,5F, 58,79,5A,7B, 58,59,5A,5B, + 54,75,56,77, 54,55,56,57, 50,71,52,73, 50,51,52,53, + 4C,6D,4E,6F, 4C,4D,4E,4F, 48,69,4A,6B, 48,49,4A,4B, + 44,65,46,67, 44,45,46,47, 40,61,42,63, 40,41,42,43, + */ + int dataoffs = ((~num & 0x0e) << 1) | ((~num & 0x01) << 5); + + /* the first of the 4 bytes is the Y position; this is used to match the scanline */ + /* we match this scanline if the sum & 0xf0 == 0 */ + int sy = state->spriteram[0x40 + (dataoffs & ~0x20)]; + int dy = sy + ~y; + if ((dy & 0xf0) == 0) + { + /* the second byte is: code is in bits 0-5, xflip in bit 6, yflip in bit 7 */ + /* note that X flip is reversed (on purpose) */ + int codeflip = state->spriteram[0x41 + dataoffs]; + int code = (codeflip & 0x3f) + (change >> 2); + int yflip = (codeflip & 0x80) ? 0x0f : 0x00; + int xflip = (codeflip & 0x40) ? 0x0f : 0x00; + const UINT8 *src = gfx->gfxdata + code * gfx->char_modulo + ((dy ^ yflip) & 15) * gfx->line_modulo; + + /* the third byte is: color in bits 0-2 */ + int color = (state->spriteram[0x42 + (dataoffs & ~0x20)] & 0x07) << 2; + + /* the fourth byte is the X position */ + int sx = state->spriteram[0x43 + dataoffs]; + int x; + + /* draw 16 pixels */ + for (x = 0; x < 16; x++) + { + int dx = ~(x + sx) & 0xff; + + /* the line buffer circuit clips between $08 and $F8 */ + if (dx >= 0x08 && dx < 0xf8) + { + int pix = src[x ^ xflip]; + + /* only non-zero pixels are written */ + if (pix != 0) + objdata[dx] = pix | color; + } } } } -} -static void draw_tachometer( mame_bitmap *bitmap, const rectangle *cliprect ){ -/* - int value = grchamp_vreg1[0x03]&0xf; - int i; - for( i=0; igfx[0]; + for (num = 0; num < 32; num++) + { + /* + The logic reads one byte every 4H, 64 bytes total: + 3E,3F,3C,3D, 3A,3B,38,39, 36,37,34,35, 32,33,30,31, + 2E,2F,2C,2D, 2A,2B,28,29, 26,27,24,25, 22,23,20,21, + 1E,1F,1C,1D, 1A,1B,18,19, 16,17,14,15, 12,13,10,11, + 0E,0F,0C,0D, 0A,0B,08,09, 06,07,04,05, 02,03,00,01 + */ + int hprime = num ^ 0x1f; + int dataoffs = hprime << 1; + int sy = state->spriteram[0x00 + dataoffs]; + int dy = sy + ~y; + int color = (state->spriteram[0x01 + dataoffs] & 0x07) << 2; + int code = state->videoram[hprime | ((dy & 0xf8) << 2)] + change; + const UINT8 *src = gfx->gfxdata + code * gfx->char_modulo + (dy & 7) * gfx->line_modulo; + int x; + + /* draw 8 pixels */ + for (x = 0; x < 8; x++) + { + int pix = src[x ^ 7]; + + /* look up the final result in the PROM */ + /* bit 4 = CHARAC (we add this in) */ + /* bit 3 = /OBJECT */ + /* bit 2 = /RADA */ + /* bit 1 = /GREENA */ + /* bit 0 = /BLUEA */ + + /* if non-zero pixels, just OR in the color */ + if (pix != 0) + objdata[num * 8 + x] = (prom[pix | color] ^ 0x0f) | 0x10; + + /* otherwise, fetch the sprite data */ + else + objdata[num * 8 + x] = prom[objdata[num * 8 + x]] ^ 0x0f; + } + } } -static void draw_sprites( mame_bitmap *bitmap, const rectangle *cliprect){ - const gfx_element *gfx = Machine->gfx[3]; - int bank = (grchamp_videoreg0&0x20)?0x40:0x00; - const UINT8 *source = spriteram; - const UINT8 *finish = source+0x40; +VIDEO_UPDATE( grchamp ) +{ + static const rgb_t objpix_lookup[8] = + { + MAKE_RGB(0,0,0), + MAKE_RGB(0,0,RGB_MAX), + MAKE_RGB(0,RGB_MAX,0), + MAKE_RGB(0,RGB_MAX,RGB_MAX), + MAKE_RGB(RGB_MAX,0,0), + MAKE_RGB(RGB_MAX,0,RGB_MAX), + MAKE_RGB(RGB_MAX,RGB_MAX,0), + MAKE_RGB(RGB_MAX,RGB_MAX,RGB_MAX) + }; + + grchamp_state *state = machine->driver_data; + const UINT8 *amedata = memory_region(REGION_GFX5); + const UINT8 *headdata = memory_region(REGION_GFX6); + const UINT8 *pldata = memory_region(REGION_GFX7); + mame_bitmap *lpixmap = tilemap_get_pixmap(state->left_tilemap); + mame_bitmap *rpixmap = tilemap_get_pixmap(state->right_tilemap); + mame_bitmap *cpixmap = tilemap_get_pixmap(state->center_tilemap); + int lrxscroll, cxscroll, lyscroll, ryscroll, cyscroll; + int bgcolor = state->cpu1_out[3] & 0x10; + int amebase = state->cpu0_out[4] >> 4; + int plbase = state->cpu0_out[4] & 0x0f; + int cxmask; + 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); + + /* extract background scroll values; left and right share the same X scroll */ + lrxscroll = state->cpu1_out[0] + (state->cpu1_out[1] & 1) * 256; + lyscroll = state->cpu1_out[2]; + ryscroll = state->cpu1_out[7]; + cxscroll = state->cpu1_out[9] + (state->cpu1_out[10] & 1) * 256; + cyscroll = state->cpu1_out[11]; + + /* determine the center background mask, controlled by attribute bit 0x20 */ + cxmask = (state->cpu1_out[3] & 0x20) ? 0xff : 0x1ff; + + /* iterate over scanlines */ + for (y = cliprect->min_y; y <= cliprect->max_y; y++) + { + /* select either left or right tilemaps based on Y */ + mame_bitmap *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; + UINT8 objdata[256]; + + /* draw the objects for this scanline */ + draw_objects(state, y, objdata); + + /* iterate over columns */ + for (x = cliprect->min_x; x <= cliprect->max_x; x++) + { + rgb_t finalpix; + int headbit = 0; + int kill = 0; + int mydh, mydv; + int objpix; + int mvid; + + /* the X counter starts counting when HSYNC goes to 0 */ + /* HYSYNC is high from X=304 through X=336; this means it has */ + /* been counting from 336 through 384 before HBLANK is low */ + mvid = csrc[(cxscroll + x + (384-336)) & cxmask]; + if ((mvid & 0x0f) == 0) + mvid = lrsrc[(lrxscroll + x + (384-336)) & 0x1ff]; + + /* objdata contains the REDA/GREENA/BLUEA states */ + objpix = objdata[x]; + + /* if the headlamp is visible, determine that now */ + mydh = (state->cpu0_out[2] - x) & 0xff; + mydv = (state->cpu0_out[3] - (y - 16)) & 0xff; + if ((state->cpu0_out[0] & 0x10) && (mydh & 0xc0) == 0xc0 && ((mydv ^ (mydv >> 1)) & 0x40) == 0) + { + int bits = headdata[((mydh & 0x38) >> 3) | + ((mydv & 0x3f) << 3) | + ((~mydv & 0x40) << 3) | + ((state->cpu0_out[0] & 0x10) << 6)]; + headbit = (bits >> (~mydh & 0x07)) & 0x01; + } + + /* if the headlamp is on and we're not in the headlamp area, */ + /* and this isn't a character pixel, the /KILL switch is set */ + if ((state->cpu0_out[0] & 0x10) && !headbit && !(objpix & 0x10)) + { + kill = 1; + objpix &= ~7; + } - while( source> 2) | (mydv << 3) | (plbase << 8)] >> (~mydh & 0x03); + if (bits & 0x01) + { + objpix |= 4; /* MYCAR(A) */ + + /* handle collision detection between MYCARRED and MVID/OBJECT */ + + /* skip if the state is being held clear, or if we already have a collision */ + if ((state->cpu0_out[0] & 0x02) && !(state->collide & 0x1000)) + { + if (objpix & 0x08) + { +printf("Collide car/object @ (%d,%d)\n", x, y); + state->collide = 0x1000 | 0x2000/* guess */ | ((~y & 0x80) << 3) | ((~y & 0xf8) << 2) | ((~x & 0xf8) >> 3); } + else if ((mvid & 0x0f) != 0) + { +printf("Collide car/bg @ (%d,%d)\n", x, y); + state->collide = 0x1000 | 0x4000/* guess */ | ((~y & 0x80) << 3) | ((~y & 0xf8) << 2) | ((~x & 0xf8) >> 3); +} + } + } + if (bits & 0x10) + objpix |= 3; /* MYCAR(B) */ + } -VIDEO_UPDATE( grchamp ){ - int fog = grchamp_videoreg0&0x40; - int tunnel = grchamp_videoreg0&0x10; + /* if rain is enabled, it ORs against the bits */ + if (amebase != 0) + { + int effx = (state->cpu0_out[8] + x) & 0x0f; + int effy = (state->cpu0_out[7] - y) & 0x0f; + if ((amedata[(amebase << 5) | (effy << 1) | (effx >> 3)] >> (effx & 0x07)) & 0x01) + objpix |= 7; + } - draw_background( bitmap,cliprect ); /* 3 layers */ + /* if the radar is on, it ORs against the bits */ + if (y >= 192 && (state->cpu0_out[0] & 0x80)) + { + if ((state->radarram[((~y & 0x3e) << 4) | ((~x & 0xf8) >> 3)] >> (x & 0x07)) & 0x01) + objpix |= 7; + } + + /* handle collision detection between MVID and OBJECT */ + if (!(state->collide & 0x1000) && (objpix & 0x08) && (mvid & 0x0f) != 0) + { +printf("Collide bg/object @ (%d,%d)\n", x, y); + state->collide = 0x1000 | 0x8000 | ((~y & 0x80) << 3) | ((~y & 0xf8) << 2) | ((~x & 0xf8) >> 3); + } - grchamp_collision = collision_check( bitmap, 0 ); - draw_sprites( bitmap, cliprect); /* computer cars */ - grchamp_collision |= collision_check( bitmap, 1 ); - draw_player_car( bitmap,cliprect ); + /* - draw_rain( bitmap,cliprect ); - draw_text( bitmap,cliprect ); + OBJECT LAYER: - if( grchamp_videoreg0&0x80 ) - draw_radar( bitmap,cliprect ); - draw_tachometer( bitmap,cliprect ); + R = REDA | MYRADAR | MYCAR(A) | RADARVID | AMEOUT + G = GREENA | MYCAR(B) | RADARVID | AMEOUT + B = BLUEA | MYCAR(B) | RADARVID | AMEOUT - /* Highlight the visible area exposed by headlights shape */ - if( fog || tunnel ){ - draw_headlights( bitmap, cliprect, fog ); - } + if (R | G | B) display object, + else display background + */ - /* Draw fog last, since it will affect the whole bitmap */ - if( fog ){ - draw_fog( bitmap,cliprect, fog ); + + /* still to do: + collision detection + myradar + fog + real headlamp effect + */ + + /* if the object data is non-zero, it gets priority */ + if ((objpix & 7) != 0) + finalpix = objpix_lookup[objpix & 7]; + + /* otherwise, it's the background, unless it's been KILL'ed */ + else if (!kill) + finalpix = state->bgcolor[mvid | bgcolor]; + + /* in which case it's black */ + else + finalpix = MAKE_RGB(0,0,0); + + /* if the headlamp is visible, adjust the brightness */ + if (headbit) + finalpix += MAKE_RGB(64,64,64); + + dest[x] = finalpix; + } } + + return 0; } diff --git a/src/vidhrdw/gridlee.c b/src/vidhrdw/gridlee.c index d8b7db1dc..cdb6b71af 100644 --- a/src/vidhrdw/gridlee.c +++ b/src/vidhrdw/gridlee.c @@ -46,10 +46,7 @@ PALETTE_INIT( gridlee ) for (i = 0; i < Machine->drv->total_colors; i++) { - int r = color_prom[0x0000] | (color_prom[0x0000] << 4); - int g = color_prom[0x0800] | (color_prom[0x0800] << 4); - int b = color_prom[0x1000] | (color_prom[0x1000] << 4); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal4bit(color_prom[0x0000]),pal4bit(color_prom[0x0800]),pal4bit(color_prom[0x1000])); color_prom++; } } diff --git a/src/vidhrdw/gstriker.c b/src/vidhrdw/gstriker.c index 7caab15ff..9b837e143 100644 --- a/src/vidhrdw/gstriker.c +++ b/src/vidhrdw/gstriker.c @@ -533,7 +533,7 @@ WRITE16_HANDLER( gsx_videoram3_w ) VIDEO_UPDATE(gstriker) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); // Sandwitched screen/sprite0/score/sprite1. Surely wrong, probably // needs sprite orthogonality diff --git a/src/vidhrdw/gsword.c b/src/vidhrdw/gsword.c index 841e860b8..d6bb5024d 100644 --- a/src/vidhrdw/gsword.c +++ b/src/vidhrdw/gsword.c @@ -49,7 +49,7 @@ PALETTE_INIT( josvolly ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -92,7 +92,7 @@ PALETTE_INIT( gsword ) bit2 = (color_prom[i] >> 3) & 1; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += 2*256; diff --git a/src/vidhrdw/gtia.c b/src/vidhrdw/gtia.c index b4b16eb08..39ec7a3bb 100644 --- a/src/vidhrdw/gtia.c +++ b/src/vidhrdw/gtia.c @@ -27,7 +27,7 @@ gtia_struct gtia; #define CHECK_GRACTL 0 #define VERBOSE 0 -static void gtia_reset(void); +static void gtia_reset(running_machine *machine); static void gtia_state(void); static void gtia_state_postload(void); @@ -68,7 +68,7 @@ void gtia_init(const gtia_interface *intf) memset(>ia, 0, sizeof(gtia)); gtia.intf = *intf; - add_reset_callback(gtia_reset); + add_reset_callback(Machine, gtia_reset); /* state saves */ gtia_state(); @@ -151,7 +151,7 @@ static int is_ntsc(void) -static void gtia_reset(void) +static void gtia_reset(running_machine *machine) { int i; /* reset the GTIA read/write/helper registers */ diff --git a/src/vidhrdw/gundealr.c b/src/vidhrdw/gundealr.c index 8b73598bb..1afe056d0 100644 --- a/src/vidhrdw/gundealr.c +++ b/src/vidhrdw/gundealr.c @@ -111,11 +111,7 @@ WRITE8_HANDLER( gundealr_paletteram_w ) b = (val >> 4) & 0x0f; /* TODO: the bottom 4 bits are used as well, but I'm not sure about the meaning */ - r = 0x11 * r; - g = 0x11 * g; - b = 0x11 * b; - - palette_set_color(offset / 2,r,g,b); + palette_set_color(Machine,offset / 2,pal4bit(r),pal4bit(g),pal4bit(b)); } WRITE8_HANDLER( gundealr_fg_scroll_w ) diff --git a/src/vidhrdw/gunsmoke.c b/src/vidhrdw/gunsmoke.c index aa6d75385..7d087d47b 100644 --- a/src/vidhrdw/gunsmoke.c +++ b/src/vidhrdw/gunsmoke.c @@ -54,7 +54,7 @@ PALETTE_INIT( gunsmoke ) b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); color_prom++; } @@ -215,7 +215,7 @@ VIDEO_UPDATE( gunsmoke ) if (bgon) tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); else - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); if (objon) gunsmoke_draw_sprites(bitmap, cliprect); if (chon) tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); diff --git a/src/vidhrdw/gyruss.c b/src/vidhrdw/gyruss.c index 136bd5741..44fcdc533 100644 --- a/src/vidhrdw/gyruss.c +++ b/src/vidhrdw/gyruss.c @@ -65,7 +65,7 @@ PALETTE_INIT( gyruss ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -86,7 +86,7 @@ VIDEO_START( gyruss ) { sprite_mux_buffer = auto_malloc(256 * spriteram_size); - return video_start_generic(); + return video_start_generic(machine); } diff --git a/src/vidhrdw/hanaawas.c b/src/vidhrdw/hanaawas.c index 3d56420a8..339869cd8 100644 --- a/src/vidhrdw/hanaawas.c +++ b/src/vidhrdw/hanaawas.c @@ -44,7 +44,7 @@ PALETTE_INIT( hanaawas ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/harddriv.c b/src/vidhrdw/harddriv.c index 2299d267a..77d166ac3 100644 --- a/src/vidhrdw/harddriv.c +++ b/src/vidhrdw/harddriv.c @@ -405,7 +405,7 @@ INLINE void gsp_palette_change(int offset) int red = (hdgsp_paletteram_lo[offset] >> 8) & 0xff; int green = hdgsp_paletteram_lo[offset] & 0xff; int blue = hdgsp_paletteram_hi[offset] & 0xff; - palette_set_color(offset, red, green, blue); + palette_set_color(Machine, offset, red, green, blue); } @@ -482,7 +482,7 @@ VIDEO_EOF( harddriv ) VIDEO_UPDATE( harddriv ) { pen_t *pens = &Machine->pens[gfx_palettebank * 256]; - pen_t black = get_black_pen(); + pen_t black = get_black_pen(machine); offs_t adjusted_offs; int start, end, x, y; int lzero, rzero, draw; diff --git a/src/vidhrdw/higemaru.c b/src/vidhrdw/higemaru.c index 63d87280c..13b0cf067 100644 --- a/src/vidhrdw/higemaru.c +++ b/src/vidhrdw/higemaru.c @@ -52,7 +52,7 @@ PALETTE_INIT( higemaru ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/hng64.c b/src/vidhrdw/hng64.c index 509ea5f7a..131b5c1e5 100644 --- a/src/vidhrdw/hng64.c +++ b/src/vidhrdw/hng64.c @@ -1051,7 +1051,6 @@ static void plotTilemap3Line(mame_bitmap *tilemapBitmap, INT32 screenY, mame_bitmap *bitmap) { int i ; - UINT8 r, g, b ; int numPix ; UINT16 penList[0x1000] ; // 4k of pixels to be safe @@ -1081,9 +1080,8 @@ static void plotTilemap3Line(mame_bitmap *tilemapBitmap, { // Nearest-neighbor interpolation for now (but i doubt it does linear) UINT16 tmPen = penList[(int)pixOffset] ; - palette_get_color(tmPen, &r, &g, &b); - ((UINT32 *)(bitmap->line[screenY]))[i] = MAKE_ARGB((UINT8)255, (UINT8)r, (UINT8)g, (UINT8)b) ; + ((UINT32 *)(bitmap->line[screenY]))[i] = palette_get_color(Machine, tmPen) | 0xff000000; pixOffset += pixStride ; } @@ -1238,7 +1236,7 @@ static void hng64_drawtilemap1( mame_bitmap *bitmap, const rectangle *cliprect ) VIDEO_UPDATE( hng64 ) { - fillbitmap(bitmap, get_black_pen(), 0); + fillbitmap(bitmap, get_black_pen(machine), 0); // Debug // for (int iii = 0; iii < 0x0f; iii++) diff --git a/src/vidhrdw/homedata.c b/src/vidhrdw/homedata.c index a8dfc2ae3..a9c362616 100644 --- a/src/vidhrdw/homedata.c +++ b/src/vidhrdw/homedata.c @@ -350,11 +350,7 @@ PALETTE_INIT( mrokumei ) g = ((color >> 7) & 0x1e) | ((color >> 2) & 1); b = ((color >> 3) & 0x1e) | ((color >> 1) & 1); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal5bit(r),pal5bit(g),pal5bit(b)); } } @@ -376,11 +372,7 @@ PALETTE_INIT( reikaids ) r = ((color >> 7) & 0x1e) | ((color >> 2) & 1); b = ((color >> 3) & 0x1e) | ((color >> 1) & 1); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal5bit(r),pal5bit(g),pal5bit(b)); } } @@ -402,11 +394,7 @@ PALETTE_INIT( pteacher ) r = ((color >> 6) & 0x1f); b = ((color >> 1) & 0x1f); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal5bit(r),pal5bit(g),pal5bit(b)); } } @@ -723,7 +711,7 @@ VIDEO_UPDATE( mrokumei ) /* blank screen */ if (homedata_vreg[0x3] == 0xc1 && homedata_vreg[0x4] == 0xc0 && homedata_vreg[0x5] == 0xff) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); return 0; } @@ -784,7 +772,7 @@ VIDEO_UPDATE( reikaids ) } - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); pri = (blitter_bank & 0x70) >> 4; for (i = 0;i < 4;i++) @@ -830,7 +818,7 @@ VIDEO_UPDATE( reikaids ) } - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); pri = (blitter_bank & 0x70) >> 4; for (i = 0;i < 4;i++) @@ -847,7 +835,7 @@ VIDEO_UPDATE( pteacher ) /* blank screen */ if (homedata_vreg[0x3] == 0xc1 && homedata_vreg[0x4] == 0xc0 && homedata_vreg[0x5] == 0xff) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); return 0; } diff --git a/src/vidhrdw/homerun.c b/src/vidhrdw/homerun.c index b6e2abab1..cc31312f2 100644 --- a/src/vidhrdw/homerun.c +++ b/src/vidhrdw/homerun.c @@ -48,7 +48,7 @@ WRITE8_HANDLER(homerun_color_w) bit1 = (data >> 6) & 0x01; bit2 = (data >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } static void get_homerun_tile_info(int tile_index) diff --git a/src/vidhrdw/hyhoo.c b/src/vidhrdw/hyhoo.c index 76c5a3a68..04b76fe30 100644 --- a/src/vidhrdw/hyhoo.c +++ b/src/vidhrdw/hyhoo.c @@ -37,21 +37,12 @@ static void hyhoo_gfxdraw(void); PALETTE_INIT( hyhoo ) { int i; - int r, g, b; /* initialize 655 RGB lookup */ for (i = 0; i < 65536; i++) { // bbbbbggg_ggrrrrrr - r = ((i >> 0) & 0x3f); - g = ((i >> 6) & 0x1f); - b = ((i >> 11) & 0x1f); - - r = ((r << 2) | (r >> 3)); - g = ((g << 3) | (g >> 2)); - b = ((b << 3) | (b >> 2)); - - palette_set_color(i, r, g, b); + palette_set_color(machine, i, pal6bit(i >> 0), pal5bit(i >> 6), pal5bit(i >> 11)); } } diff --git a/src/vidhrdw/hyperspt.c b/src/vidhrdw/hyperspt.c index b8040703b..28007b609 100644 --- a/src/vidhrdw/hyperspt.c +++ b/src/vidhrdw/hyperspt.c @@ -57,7 +57,7 @@ PALETTE_INIT( hyperspt ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/hyprduel.c b/src/vidhrdw/hyprduel.c index def73d1ad..906aab270 100644 --- a/src/vidhrdw/hyprduel.c +++ b/src/vidhrdw/hyprduel.c @@ -81,16 +81,9 @@ static UINT16 *hypr_tiletable_old; WRITE16_HANDLER( hyprduel_paletteram_w ) { - int r,g,b; - data = COMBINE_DATA(&paletteram16[offset]); - - b = (data >> 1) & 0x1f; - r = (data >> 6) & 0x1f; - g = (data >> 11) & 0x1f; - /* We need the ^0xff because we had to invert the pens in the gfx */ - palette_set_color(offset^0xff,(r << 3) | (r >> 2),(g << 3) | (g >> 2),(b << 3) | (b >> 2)); + palette_set_color(Machine,offset^0xff,pal5bit(data >> 6),pal5bit(data >> 11),pal5bit(data >> 1)); } diff --git a/src/vidhrdw/ikki.c b/src/vidhrdw/ikki.c index 88c30e03a..be9286fea 100644 --- a/src/vidhrdw/ikki.c +++ b/src/vidhrdw/ikki.c @@ -18,20 +18,14 @@ PALETTE_INIT( ikki ) for (i = 0; i<256; i++) { - int r,g,b; - - r = color_prom[0]*0x11; - g = color_prom[256]*0x11; - b = color_prom[2*256]*0x11; - - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal4bit(color_prom[0]),pal4bit(color_prom[256]),pal4bit(color_prom[2*256])); color_prom++; } /* 256th color is not drawn on screen */ /* this is used for special transparent function */ - palette_set_color(256,0,0,1); + palette_set_color(machine,256,0,0,1); color_prom += 2*256; diff --git a/src/vidhrdw/inufuku.c b/src/vidhrdw/inufuku.c index bb49b8836..a9ce37cb6 100644 --- a/src/vidhrdw/inufuku.c +++ b/src/vidhrdw/inufuku.c @@ -248,7 +248,7 @@ VIDEO_UPDATE( inufuku ) { int i; - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); fillbitmap(priority_bitmap, 0, NULL); if (inufuku_bg_raster) { diff --git a/src/vidhrdw/irobot.c b/src/vidhrdw/irobot.c index e9bd83aae..57f781791 100644 --- a/src/vidhrdw/irobot.c +++ b/src/vidhrdw/irobot.c @@ -51,12 +51,7 @@ PALETTE_INIT( irobot ) /* the palette will be initialized by the game. We just set it to some */ /* pre-cooked values so the startup copyright notice can be displayed. */ for (i = 0;i < 64;i++) - { - int r = ((i & 1) >> 0) * 0xff; - int g = ((i & 2) >> 1) * 0xff; - int b = ((i & 4) >> 2) * 0xff; - palette_set_color(i,r,g,b); - } + palette_set_color(machine,i,pal1bit(i >> 0),pal1bit(i >> 1),pal1bit(i >> 2)); /* Convert the color prom for the text palette */ for (i = 0;i < 32;i++) @@ -73,7 +68,7 @@ PALETTE_INIT( irobot ) g = 28 * bits * intensity; bits = (color >> 2) & 0x03; b = 28 * bits * intensity; - palette_set_color(i+64,r,g,b); + palette_set_color(machine,i+64,r,g,b); color_prom++; } @@ -103,7 +98,7 @@ WRITE8_HANDLER( irobot_paletteram_w ) g = 12 * bits * intensity; bits = (color >> 7) & 0x03; r = 12 * bits * intensity; - palette_set_color((offset >> 1) & 0x3F,r,g,b); + palette_set_color(Machine,(offset >> 1) & 0x3F,r,g,b); } diff --git a/src/vidhrdw/ironhors.c b/src/vidhrdw/ironhors.c index 5d233abc8..fed6f1d3a 100644 --- a/src/vidhrdw/ironhors.c +++ b/src/vidhrdw/ironhors.c @@ -56,7 +56,7 @@ PALETTE_INIT( ironhors ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/itech32.c b/src/vidhrdw/itech32.c index d5466be65..08de3acf0 100644 --- a/src/vidhrdw/itech32.c +++ b/src/vidhrdw/itech32.c @@ -272,7 +272,7 @@ WRITE16_HANDLER( timekill_intensity_w ) double intensity = (double)(data & 0xff) / (double)0x60; int i; for (i = 0; i < 8192; i++) - palette_set_brightness(i, intensity); + palette_set_brightness(Machine, i, intensity); } } @@ -350,7 +350,7 @@ WRITE16_HANDLER( timekill_paletteram_w ) g = paletteram16[offset & ~1] >> 8; b = paletteram16[offset | 1] >> 8; - palette_set_color(offset / 2, r, g, b); + palette_set_color(Machine, offset / 2, r, g, b); } @@ -367,7 +367,7 @@ WRITE16_HANDLER( bloodstm_paletteram_w ) g = paletteram16[offset & ~1] >> 8; b = paletteram16[offset | 1] & 0xff; - palette_set_color(offset / 2, r, g, b); + palette_set_color(Machine, offset / 2, r, g, b); } @@ -381,7 +381,7 @@ WRITE32_HANDLER( drivedge_paletteram_w ) g = (paletteram32[offset] >> 8) & 0xff; b = (paletteram32[offset] >> 16) & 0xff; - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, r, g, b); } @@ -395,7 +395,7 @@ WRITE32_HANDLER( itech020_paletteram_w ) g = (paletteram32[offset] >> 8) & 0xff; b = paletteram32[offset] & 0xff; - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, r, g, b); } diff --git a/src/vidhrdw/itech8.c b/src/vidhrdw/itech8.c index b3f40c6c0..f7813393d 100644 --- a/src/vidhrdw/itech8.c +++ b/src/vidhrdw/itech8.c @@ -582,7 +582,7 @@ VIDEO_UPDATE( itech8_2layer ) /* if we're blanked, just fill with black */ if (tms_state.blanked) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } @@ -617,7 +617,7 @@ VIDEO_UPDATE( itech8_2page ) /* if we're blanked, just fill with black */ if (tms_state.blanked) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } @@ -647,7 +647,7 @@ VIDEO_UPDATE( itech8_2page_large ) /* if we're blanked, just fill with black */ if (tms_state.blanked) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } diff --git a/src/vidhrdw/jack.c b/src/vidhrdw/jack.c index f56943319..3c925ba15 100644 --- a/src/vidhrdw/jack.c +++ b/src/vidhrdw/jack.c @@ -133,7 +133,7 @@ PALETTE_INIT( joinem ) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/jaguar.c b/src/vidhrdw/jaguar.c index e11abf339..17970235f 100644 --- a/src/vidhrdw/jaguar.c +++ b/src/vidhrdw/jaguar.c @@ -381,7 +381,7 @@ void jaguar_set_palette(UINT16 vmode) case 0x000: { /* set color 0 to black */ - palette_set_color(colors++, 0, 0, 0); + palette_set_color(Machine, colors++, 0, 0, 0); /* due to the way YCC colorspace maps onto RGB, there are multiple entries for black */ /* take advantage of this so we don't have to use all 64k colors */ @@ -396,7 +396,7 @@ void jaguar_set_palette(UINT16 vmode) else { pen_table[i] = colors; - palette_set_color(colors++, r, g, b); + palette_set_color(Machine, colors++, r, g, b); } } break; @@ -407,7 +407,7 @@ void jaguar_set_palette(UINT16 vmode) case 0x107: { /* set color 0 to black */ - palette_set_color(colors++, 0, 0, 0); + palette_set_color(Machine, colors++, 0, 0, 0); /* due to the way YCC colorspace maps onto RGB, there are multiple entries for black */ /* take advantage of this so we don't have to use all 64k colors */ @@ -433,7 +433,7 @@ void jaguar_set_palette(UINT16 vmode) else { pen_table[i] = colors; - palette_set_color(colors++, r, g, b); + palette_set_color(Machine, colors++, r, g, b); } } break; @@ -443,9 +443,9 @@ void jaguar_set_palette(UINT16 vmode) case 0x006: { /* we cheat a little here to squeeze into 65534 colors */ - palette_set_color(colors++, 0, 0, 0); - palette_set_color(colors++, 0, 8, 0); - palette_set_color(colors++, 0, 16, 0); + palette_set_color(Machine, colors++, 0, 0, 0); + palette_set_color(Machine, colors++, 0, 8, 0); + palette_set_color(Machine, colors++, 0, 16, 0); pen_table[0] = 0; pen_table[1] = 1; pen_table[2] = 1; @@ -455,15 +455,8 @@ void jaguar_set_palette(UINT16 vmode) /* map the remaining colors normally */ for (i = 5; i < 65536; i++) { - UINT8 r = (i >> 11) & 31; - UINT8 g = i & 63; - UINT8 b = (i >> 6) & 31; - r = (r << 3) | (r >> 2); - g = (g << 2) | (g >> 4); - b = (b << 3) | (b >> 2); - pen_table[i] = colors; - palette_set_color(colors++, r, g, b); + palette_set_color(Machine, colors++, pal5bit(i >> 11), pal6bit(i >> 0), pal5bit(i >> 6)); } break; } diff --git a/src/vidhrdw/jailbrek.c b/src/vidhrdw/jailbrek.c index 1235259bf..a0c6f839e 100644 --- a/src/vidhrdw/jailbrek.c +++ b/src/vidhrdw/jailbrek.c @@ -34,7 +34,7 @@ PALETTE_INIT( jailbrek ) bit3 = (color_prom[Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/jcross.c b/src/vidhrdw/jcross.c index b25f642e6..7475c5b36 100644 --- a/src/vidhrdw/jcross.c +++ b/src/vidhrdw/jcross.c @@ -16,7 +16,7 @@ WRITE8_HANDLER( jcross_palettebank_w ) } -static void stuff_palette( int source_index, int dest_index, int num_colors ) +static void stuff_palette( running_machine *machine, int source_index, int dest_index, int num_colors ) { UINT8 *color_prom = memory_region(REGION_PROMS) + source_index; int i; @@ -43,7 +43,7 @@ static void stuff_palette( int source_index, int dest_index, int num_colors ) bit3 = (color_prom[0x400] >> 1) & 0x01; blue = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color( dest_index++, red, green, blue ); + palette_set_color( machine, dest_index++, red, green, blue ); color_prom++; } } @@ -52,7 +52,7 @@ static void update_palette( int type ) { if( fg_color!=old_fg_color ) { - stuff_palette( 128+16*(fg_color&0x7), (0x10+type)*16, 16 ); + stuff_palette( Machine, 128+16*(fg_color&0x7), (0x10+type)*16, 16 ); old_fg_color = fg_color; } } @@ -93,8 +93,8 @@ VIDEO_START( jcross ) { flipscreen = -1; old_fg_color = -1; - stuff_palette( 0, 0, 16*8 ); - stuff_palette( 16*8*3, 16*8, 16*8 ); + stuff_palette( machine, 0, 0, 16*8 ); + stuff_palette( machine, 16*8*3, 16*8, 16*8 ); bg_tilemap = tilemap_create(get_bg_tilemap_info,tilemap_scan_cols,TILEMAP_OPAQUE,8,8,64,64); tx_tilemap = tilemap_create(get_tx_tilemap_info,tilemap_scan_cols,TILEMAP_TRANSPARENT,8,8,32,32); diff --git a/src/vidhrdw/jedi.c b/src/vidhrdw/jedi.c index 601ed3cc4..edb4675fe 100644 --- a/src/vidhrdw/jedi.c +++ b/src/vidhrdw/jedi.c @@ -69,7 +69,7 @@ VIDEO_START( jedi ) return 1; /* reserve color 1024 for black (disabled display) */ - palette_set_color(1024, 0, 0, 0); + palette_set_color(machine, 1024, 0, 0, 0); /* register for saving */ state_save_register_global(jedi_vscroll); @@ -126,7 +126,7 @@ WRITE8_HANDLER( jedi_paletteram_w ) bits = (color >> 0) & 7; b = 5 * bits * intensity; - palette_set_color(offset & 0x3ff, r, g, b); + palette_set_color(Machine, offset & 0x3ff, r, g, b); } diff --git a/src/vidhrdw/kaneko16.c b/src/vidhrdw/kaneko16.c index c622d1aba..f605caaa6 100644 --- a/src/vidhrdw/kaneko16.c +++ b/src/vidhrdw/kaneko16.c @@ -142,7 +142,7 @@ VIDEO_START( kaneko16_sprites ) VIDEO_START( kaneko16_1xVIEW2 ) { - if ( video_start_kaneko16_sprites() ) + if ( video_start_kaneko16_sprites(machine) ) return 1; kaneko16_tmap_0 = tilemap_create( get_tile_info_0, tilemap_scan_rows, @@ -195,7 +195,7 @@ VIDEO_START( kaneko16_1xVIEW2 ) VIDEO_START( kaneko16_2xVIEW2 ) { - if ( video_start_kaneko16_1xVIEW2() ) + if ( video_start_kaneko16_1xVIEW2(machine) ) return 1; kaneko16_tmap_2 = tilemap_create( get_tile_info_2, tilemap_scan_rows, @@ -240,7 +240,7 @@ VIDEO_START( kaneko16_2xVIEW2 ) VIDEO_START( sandscrp_1xVIEW2 ) { - if ( video_start_kaneko16_1xVIEW2() ) + if ( video_start_kaneko16_1xVIEW2(machine) ) return 1; tilemap_set_scrolldy( kaneko16_tmap_0, 0, 256 - 1 ); @@ -259,19 +259,7 @@ PALETTE_INIT( berlwall ) /* initialize 555 RGB lookup */ for (i = 0; i < 32768; i++) - { - int r,g,b; - - r = (i >> 5) & 0x1f; - g = (i >> 10) & 0x1f; - b = (i >> 0) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(2048 + i,r,g,b); - } + palette_set_color(machine,2048 + i,pal5bit(i >> 5),pal5bit(i >> 10),pal5bit(i >> 0)); } VIDEO_START( berlwall ) @@ -320,7 +308,7 @@ VIDEO_START( berlwall ) Machine->pens[2048 + ((g << 10) | (r << 5) | b)] ); } - return video_start_kaneko16_1xVIEW2(); + return video_start_kaneko16_1xVIEW2(machine); } diff --git a/src/vidhrdw/kangaroo.c b/src/vidhrdw/kangaroo.c index 20f7b2661..64c0fcd68 100644 --- a/src/vidhrdw/kangaroo.c +++ b/src/vidhrdw/kangaroo.c @@ -42,12 +42,7 @@ PALETTE_INIT( kangaroo ) int i; for (i = 0;i < Machine->drv->total_colors;i++) - { - int r = ((i & 4) >> 2) * 0xff; - int g = ((i & 2) >> 1) * 0xff; - int b = ((i & 1) >> 0) * 0xff; - palette_set_color(i,r,g,b); - } + palette_set_color(machine,i,pal1bit(i >> 2),pal1bit(i >> 1),pal1bit(i >> 0)); } @@ -124,7 +119,7 @@ WRITE8_HANDLER( kangaroo_color_mask_w ) g = ((i & 2) >> 1) * ((data & 0x10) ? 0xff : 0x7f); b = ((i & 1) >> 0) * ((data & 0x08) ? 0xff : 0x7f); - palette_set_color(8+i,r,g,b); + palette_set_color(Machine,8+i,r,g,b); } /* color mask for B plane */ @@ -137,7 +132,7 @@ WRITE8_HANDLER( kangaroo_color_mask_w ) g = ((i & 2) >> 1) * ((data & 0x02) ? 0xff : 0x7f); b = ((i & 1) >> 0) * ((data & 0x01) ? 0xff : 0x7f); - palette_set_color(16+i,r,g,b); + palette_set_color(Machine,16+i,r,g,b); } } diff --git a/src/vidhrdw/karnov.c b/src/vidhrdw/karnov.c index e68f3f4cf..7acc4ad73 100644 --- a/src/vidhrdw/karnov.c +++ b/src/vidhrdw/karnov.c @@ -63,7 +63,7 @@ PALETTE_INIT( karnov ) bit3 = (color_prom[Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/kchamp.c b/src/vidhrdw/kchamp.c index 7a60e69ff..a57c09877 100644 --- a/src/vidhrdw/kchamp.c +++ b/src/vidhrdw/kchamp.c @@ -23,7 +23,7 @@ PALETTE_INIT( kchamp ) green = color_prom[Machine->drv->total_colors+i]; blue = color_prom[2*Machine->drv->total_colors+i]; - palette_set_color(i,red*0x11,green*0x11,blue*0x11); + palette_set_color(machine,i,pal4bit(red),pal4bit(green),pal4bit(blue)); *(colortable++) = i; } diff --git a/src/vidhrdw/kingobox.c b/src/vidhrdw/kingobox.c index 4932a1d52..a22f838ec 100644 --- a/src/vidhrdw/kingobox.c +++ b/src/vidhrdw/kingobox.c @@ -60,22 +60,14 @@ PALETTE_INIT( kingofb ) bit3 = (color_prom[2*256] >> 3) & 0x01; b = 0x10 * bit0 + 0x21 * bit1 + 0x45 * bit2 + 0x89 * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } /* the foreground chars directly map to primary colors */ for (i = 0;i < 8;i++) - { - /* red component */ - int r = 0xff * ((i >> 2) & 0x01); - /* green component */ - int g = 0xff * ((i >> 1) & 0x01); - /* blue component */ - int b = 0xff * ((i >> 0) & 0x01); - palette_set_color(i+256,r,g,b); - } + palette_set_color(machine,i+256,pal1bit(i >> 2),pal1bit(i >> 1),pal1bit(i >> 0)); for (i = 0;i < TOTAL_COLORS(0)/2;i++) { @@ -117,22 +109,14 @@ PALETTE_INIT( ringking ) bit3 = (color_prom[256] >> 3) & 0x01; b = 0x10 * bit0 + 0x21 * bit1 + 0x45 * bit2 + 0x89 * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } /* the foreground chars directly map to primary colors */ for (i = 0;i < 8;i++) - { - /* red component */ - int r = 0xff * ((i >> 2) & 0x01); - /* green component */ - int g = 0xff * ((i >> 1) & 0x01); - /* blue component */ - int b = 0xff * ((i >> 0) & 0x01); - palette_set_color(i+256,r,g,b); - } + palette_set_color(machine,i+256,pal1bit(i >> 2),pal1bit(i >> 1),pal1bit(i >> 0)); for (i = 0;i < TOTAL_COLORS(0)/2;i++) { diff --git a/src/vidhrdw/kncljoe.c b/src/vidhrdw/kncljoe.c index 9c12f13bf..82c0066ca 100644 --- a/src/vidhrdw/kncljoe.c +++ b/src/vidhrdw/kncljoe.c @@ -45,7 +45,7 @@ PALETTE_INIT( kncljoe ) bit3 = (color_prom[0x200] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -71,7 +71,7 @@ PALETTE_INIT( kncljoe ) bit2 = (*color_prom >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+128,r,g,b); + palette_set_color(machine,i+128,r,g,b); color_prom ++; } diff --git a/src/vidhrdw/konamigx.c b/src/vidhrdw/konamigx.c index 9b45bf731..5ffa79e47 100644 --- a/src/vidhrdw/konamigx.c +++ b/src/vidhrdw/konamigx.c @@ -506,7 +506,7 @@ WRITE32_HANDLER( konamigx_palette_w ) g = (paletteram32[offset] >> 8) & 0xff; b = (paletteram32[offset] >> 0) & 0xff; - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } WRITE32_HANDLER( konamigx_palette2_w ) @@ -523,7 +523,7 @@ WRITE32_HANDLER( konamigx_palette2_w ) g = (paletteram32[offset] >> 8) & 0xff; b = (paletteram32[offset] >> 0) & 0xff; - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } // main monitor for type 3 diff --git a/src/vidhrdw/konamiic.c b/src/vidhrdw/konamiic.c index 4bc314b64..6c82d35d7 100644 --- a/src/vidhrdw/konamiic.c +++ b/src/vidhrdw/konamiic.c @@ -4380,14 +4380,14 @@ void K053247_sprites_draw(mame_bitmap *bitmap,const rectangle *cliprect) //* color = 0; shadow = -1; for (temp=1; temp= 0) { shadow = (color & K053247_CUSTOMSHADOW) ? (color>>K053247_SHDSHIFT) : (shadow>>10); - if (shadow &= 3) palette_set_shadow_mode((shadow-1) & shdmask); + if (shadow &= 3) palette_set_shadow_mode(Machine, (shadow-1) & shdmask); } else shadow = 0; @@ -7279,9 +7279,9 @@ void K054338_update_all_shadows(void) K054338_shdRGB[i] = d; } - palette_set_shadow_dRGB32(0, K054338_shdRGB[0], K054338_shdRGB[1], K054338_shdRGB[2], noclip); - palette_set_shadow_dRGB32(1, K054338_shdRGB[3], K054338_shdRGB[4], K054338_shdRGB[5], noclip); - palette_set_shadow_dRGB32(2, K054338_shdRGB[6], K054338_shdRGB[7], K054338_shdRGB[8], noclip); + palette_set_shadow_dRGB32(Machine, 0, K054338_shdRGB[0], K054338_shdRGB[1], K054338_shdRGB[2], noclip); + palette_set_shadow_dRGB32(Machine, 1, K054338_shdRGB[3], K054338_shdRGB[4], K054338_shdRGB[5], noclip); + palette_set_shadow_dRGB32(Machine, 2, K054338_shdRGB[6], K054338_shdRGB[7], K054338_shdRGB[8], noclip); } // K054338 BG color fill diff --git a/src/vidhrdw/kopunch.c b/src/vidhrdw/kopunch.c index c8ecbe286..bbd803462 100644 --- a/src/vidhrdw/kopunch.c +++ b/src/vidhrdw/kopunch.c @@ -32,7 +32,7 @@ PALETTE_INIT( kopunch ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/ksayakyu.c b/src/vidhrdw/ksayakyu.c index fcbf58dec..debd862e6 100644 --- a/src/vidhrdw/ksayakyu.c +++ b/src/vidhrdw/ksayakyu.c @@ -32,7 +32,7 @@ WRITE8_HANDLER(ksayakyu_videoctrl_w) PALETTE_INIT( ksayakyu ) { - int i,j,r,g,b,b1,b2; + int i,j,b1,b2; for(j=0;j<16;j++) for(i=0;i<8;i++) { @@ -40,11 +40,7 @@ PALETTE_INIT( ksayakyu ) b2=memory_region(REGION_PROMS)[j*16+i+8]; b1=b2|(b1<<8); - g=(b1&31)<<3; - b=((b1>>5)&31)<<3; - r=((b1>>10)&31)<<3; - - palette_set_color(j*8+i,r,g,b); + palette_set_color(machine,j*8+i,pal5bit(b1 >> 10),pal5bit(b1 >> 0),pal5bit(b1 >> 5)); } } diff --git a/src/vidhrdw/labyrunr.c b/src/vidhrdw/labyrunr.c index 23efff95f..c90d1ee92 100644 --- a/src/vidhrdw/labyrunr.c +++ b/src/vidhrdw/labyrunr.c @@ -154,7 +154,7 @@ VIDEO_UPDATE( labyrunr ) rectangle finalclip0, finalclip1; fillbitmap(priority_bitmap,0,cliprect); - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); if(~K007121_ctrlram[0][3] & 0x20) { diff --git a/src/vidhrdw/ladybug.c b/src/vidhrdw/ladybug.c index fe8bef074..8021532fc 100644 --- a/src/vidhrdw/ladybug.c +++ b/src/vidhrdw/ladybug.c @@ -53,7 +53,7 @@ PALETTE_INIT( ladybug ) bit1 = (~color_prom[i] >> 4) & 0x01; bit2 = (~color_prom[i] >> 7) & 0x01; b = 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } /* characters */ @@ -105,7 +105,7 @@ PALETTE_INIT( sraider ) bit1 = (~color_prom[i] >> 7) & 0x01; bit2 = (~color_prom[i] >> 6) & 0x01; b = 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } /* This is for the stars colors */ @@ -122,11 +122,11 @@ PALETTE_INIT( sraider ) g = 0x47 * bit1 + 0x97 * bit2; bit1 = i & 0x01; r = 0x47 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } /* This is reserved for the grid color */ - palette_set_color(64,0,0,0); + palette_set_color(machine,64,0,0,0); /* characters */ for (i = 0;i < 8;i++) @@ -294,7 +294,7 @@ WRITE8_HANDLER( sraider_io_w ) tilemap_mark_all_tiles_dirty(ALL_TILEMAPS); } - palette_set_color(64, + palette_set_color(Machine,64, ((data&0x40)>>6)*0xff, ((data&0x20)>>5)*0xff, ((data&0x10)>>4)*0xff); diff --git a/src/vidhrdw/lasso.c b/src/vidhrdw/lasso.c index ea68c3424..e311dfd36 100644 --- a/src/vidhrdw/lasso.c +++ b/src/vidhrdw/lasso.c @@ -71,7 +71,7 @@ static void lasso_set_color(int i, int data) bit1 = (data >> 7) & 0x01; b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color( i,r,g,b ); + palette_set_color( Machine,i,r,g,b ); } PALETTE_INIT( lasso ) @@ -90,7 +90,7 @@ PALETTE_INIT( wwjgtin ) { int color, pen; - palette_init_lasso(colortable,color_prom); + palette_init_lasso(machine,colortable,color_prom); for( color = 0; color < 0x10; color++ ) for( pen = 0; pen < 16; pen++ ) diff --git a/src/vidhrdw/lazercmd.c b/src/vidhrdw/lazercmd.c index d29d40ed6..d1b571a26 100644 --- a/src/vidhrdw/lazercmd.c +++ b/src/vidhrdw/lazercmd.c @@ -79,7 +79,7 @@ static void plot_pattern(mame_bitmap *bitmap, int x, int y) VIDEO_START( lazercmd ) { - if( video_start_generic() ) + if( video_start_generic(machine) ) return 1; return 0; diff --git a/src/vidhrdw/legionna.c b/src/vidhrdw/legionna.c index 0b3c92168..bbb302ec2 100644 --- a/src/vidhrdw/legionna.c +++ b/src/vidhrdw/legionna.c @@ -298,7 +298,7 @@ VIDEO_UPDATE( legionna ) // if ((legionna_enable&1)!=1) - fillbitmap(bitmap,get_black_pen(),cliprect); /* wrong color? */ + fillbitmap(bitmap,get_black_pen(machine),cliprect); /* wrong color? */ #ifdef MAME_DEBUG if (dislayer[2]==0) @@ -332,7 +332,7 @@ VIDEO_UPDATE( godzilla ) tilemap_set_scrollx( text_layer, 0, 0 ); tilemap_set_scrolly( text_layer, 0, 112 ); - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); tilemap_draw(bitmap,cliprect,background_layer,0,0); draw_sprites(bitmap,cliprect,2); @@ -357,7 +357,7 @@ VIDEO_UPDATE( sdgndmrb ) // tilemap_set_scrollx( text_layer, 0, 128 /* legionna_scrollram16[6] */); // tilemap_set_scrolly( text_layer, 0, 0 /* legionna_scrollram16[7] */ ); - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); tilemap_draw(bitmap,cliprect,background_layer,0,0); draw_sprites(bitmap,cliprect,2); diff --git a/src/vidhrdw/leland.c b/src/vidhrdw/leland.c index 55dfea676..2826949a3 100644 --- a/src/vidhrdw/leland.c +++ b/src/vidhrdw/leland.c @@ -76,7 +76,7 @@ VIDEO_START( leland ) VIDEO_START( ataxx ) { /* first do the standard stuff */ - if (video_start_leland()) + if (video_start_leland(machine)) return 1; /* allocate memory */ diff --git a/src/vidhrdw/lemmings.c b/src/vidhrdw/lemmings.c index a8cbf06ca..8fe3e5fc1 100644 --- a/src/vidhrdw/lemmings.c +++ b/src/vidhrdw/lemmings.c @@ -179,7 +179,7 @@ VIDEO_UPDATE( lemmings ) } } - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); lemmings_drawsprites(bitmap,sprite_triple_buffer_1,1,0x0000); /* Pixel layer can be windowed in hardware (two player mode) */ diff --git a/src/vidhrdw/leprechn.c b/src/vidhrdw/leprechn.c index dfa71d060..c6c2c7ba3 100644 --- a/src/vidhrdw/leprechn.c +++ b/src/vidhrdw/leprechn.c @@ -28,7 +28,7 @@ PALETTE_INIT( leprechn ) int g = (i & 2) ? 0xff : bk; int b = (i & 4) ? 0xff : bk; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } @@ -41,7 +41,7 @@ VIDEO_START( leprechn ) /* allocate our own dirty buffer */ videoram = auto_malloc(videoram_size); - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } diff --git a/src/vidhrdw/lethal.c b/src/vidhrdw/lethal.c index 698a0ff39..23b273bc7 100644 --- a/src/vidhrdw/lethal.c +++ b/src/vidhrdw/lethal.c @@ -42,11 +42,6 @@ static void lethalen_sprite_callback(int *code, int *color, int *priority_mask) static void lethalen_tile_callback(int layer, int *code, int *color) { - /* where are the flip bits? lethal enforcers needs them on reload and p2 start screen */ - /* they don't seem to be anywhere in the ram we're looking at... */ -// tile_info.flags = TILE_FLIPYX(1);; - - *color = layer_colorbase[layer] + ((*color & 0x3c)<<2); } @@ -72,22 +67,22 @@ VIDEO_START(lethalen) K056832_SetExtLinescroll(); // the US and Japanese cabinets apparently use different mirror setups - if (!strcmp(Machine->gamedrv->name, "lethalen")) + if (!strcmp(Machine->gamedrv->name, "lethalej")) { + K056832_set_LayerOffset(0, -196, 0); + K056832_set_LayerOffset(1, -194, 0); + K056832_set_LayerOffset(2, -192, 0); + K056832_set_LayerOffset(3, -190, 0); + K053245_set_SpriteOffset(0, -105, 0); + } + else + { /* fixme */ K056832_set_LayerOffset(0, 188, 0); K056832_set_LayerOffset(1, 190, 0); K056832_set_LayerOffset(2, 192, 0); K056832_set_LayerOffset(3, 194, 0); K053245_set_SpriteOffset(0, 95, 0); } - else - { /* fixme */ - K056832_set_LayerOffset(0, 64, 0); - K056832_set_LayerOffset(1, 64, 0); - K056832_set_LayerOffset(2, 64, 0); - K056832_set_LayerOffset(3, 64, 0); - K053245_set_SpriteOffset(0, -96, 8); - } layer_colorbase[0] = 0x00; layer_colorbase[1] = 0x40; @@ -137,8 +132,17 @@ VIDEO_UPDATE(lethalen) // force "A" layer over top of everything K056832_tilemap_draw(bitmap, cliprect, 0, 0, 0); - draw_crosshair(bitmap, GUNX(2)+216, 240-GUNY(3), cliprect, 0); - draw_crosshair(bitmap, GUNX(4)+216, 240-GUNY(5), cliprect, 1); + if (!strcmp(Machine->gamedrv->name, "lethalej")) + { + draw_crosshair(bitmap, GUNX(2)+224, 245-GUNY(3), cliprect, 0); + draw_crosshair(bitmap, GUNX(4)+224, 245-GUNY(5), cliprect, 1); + } + else + { + draw_crosshair(bitmap, GUNX(2)+216, 240-GUNY(3), cliprect, 0); + draw_crosshair(bitmap, GUNX(4)+216, 240-GUNY(5), cliprect, 1); + } + #if 0 { diff --git a/src/vidhrdw/liberate.c b/src/vidhrdw/liberate.c index 431a504a8..4179c3c0b 100644 --- a/src/vidhrdw/liberate.c +++ b/src/vidhrdw/liberate.c @@ -189,9 +189,9 @@ PALETTE_INIT( liberate ) b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; color_prom++; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } - palette_set_color(32,0,0,0); /* Allocate black for when no background is displayed */ + palette_set_color(machine,32,0,0,0); /* Allocate black for when no background is displayed */ } /***************************************************************************/ diff --git a/src/vidhrdw/liberatr.c b/src/vidhrdw/liberatr.c index 659e4aa13..032684acf 100644 --- a/src/vidhrdw/liberatr.c +++ b/src/vidhrdw/liberatr.c @@ -133,7 +133,7 @@ WRITE8_HANDLER( liberatr_colorram_w ) offset ^= 0x0f; } - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } diff --git a/src/vidhrdw/lordgun.c b/src/vidhrdw/lordgun.c index f6e69e27a..9a4b5c2c0 100644 --- a/src/vidhrdw/lordgun.c +++ b/src/vidhrdw/lordgun.c @@ -286,7 +286,7 @@ if (code_pressed(KEYCODE_Z)) if (lordgun_whitescreen) { - fillbitmap( bitmap, get_white_pen(), cliprect ); + fillbitmap( bitmap, get_white_pen(machine), cliprect ); return 0; } diff --git a/src/vidhrdw/lvcards.c b/src/vidhrdw/lvcards.c index c39c41b54..35ac9c662 100644 --- a/src/vidhrdw/lvcards.c +++ b/src/vidhrdw/lvcards.c @@ -39,7 +39,7 @@ PALETTE_INIT( ponttehk ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -74,7 +74,7 @@ PALETTE_INIT( lvcards ) //Ever so slightly different, but different enough. bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x11; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/lwings.c b/src/vidhrdw/lwings.c index 5a1c13d48..55a840151 100644 --- a/src/vidhrdw/lwings.c +++ b/src/vidhrdw/lwings.c @@ -121,7 +121,7 @@ VIDEO_START( trojan ) VIDEO_START( avengers ) { - int result = video_start_trojan(); + int result = video_start_trojan(machine); bAvengersHardware = 1; return result; } diff --git a/src/vidhrdw/m62.c b/src/vidhrdw/m62.c index e8c04cb2d..20fff51aa 100644 --- a/src/vidhrdw/m62.c +++ b/src/vidhrdw/m62.c @@ -77,7 +77,7 @@ PALETTE_INIT( irem ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -116,7 +116,7 @@ PALETTE_INIT( battroad ) bit3 = (color_prom[2*512] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -142,7 +142,7 @@ PALETTE_INIT( battroad ) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+512,r,g,b); + palette_set_color(machine,i+512,r,g,b); } color_prom += 32; @@ -180,7 +180,7 @@ PALETTE_INIT( spelunk2 ) bit3 = (color_prom[2*256] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -211,7 +211,7 @@ PALETTE_INIT( spelunk2 ) bit3 = (color_prom[2*256] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i+512,r,g,b); + palette_set_color(machine,i+512,r,g,b); color_prom++; } @@ -461,7 +461,7 @@ static void get_ldrun_bg_tile_info( int offs ) flags |= TILE_FLIPX; } SET_TILE_INFO( 0, code | ( ( color & 0xc0 ) << 2 ), color & 0x1f, flags ); - if( ( ( color & 0x0f ) >> 1 ) >= 0x04 ) + if( ( ( color & 0x1f ) >> 1 ) >= 0x0c ) { tile_info.priority = 1; } @@ -488,6 +488,33 @@ VIDEO_START( ldrun ) return m62_start( get_ldrun_bg_tile_info, 1, 1, 8, 8, 64, 32 ); } +static void get_ldrun2_bg_tile_info( int offs ) +{ + int code; + int color; + int flags; + code = m62_tileram[ offs << 1 ]; + color = m62_tileram[ ( offs << 1 ) | 1 ]; + flags = 0; + if( ( color & 0x20 ) ) + { + flags |= TILE_FLIPX; + } + SET_TILE_INFO( 0, code | ( ( color & 0xc0 ) << 2 ), color & 0x1f, flags ); + if( ( ( color & 0x1f ) >> 1 ) >= 0x04 ) + { + tile_info.priority = 1; + } + else + { + tile_info.priority = 0; + } +} + +VIDEO_START( ldrun2 ) +{ + return m62_start( get_ldrun2_bg_tile_info, 1, 1, 8, 8, 64, 32 ); +} static void get_battroad_bg_tile_info( int offs ) { @@ -502,7 +529,7 @@ static void get_battroad_bg_tile_info( int offs ) flags |= TILE_FLIPX; } SET_TILE_INFO( 0, code | ( ( color & 0x40 ) << 3 ) | ( ( color & 0x10 ) << 4 ), color & 0x0f, flags ); - if( ( ( color & 0x0f ) >> 1 ) >= 0x04 ) + if( ( ( color & 0x1f ) >> 1 ) >= 0x04 ) { tile_info.priority = 1; } diff --git a/src/vidhrdw/m72.c b/src/vidhrdw/m72.c index 52c32a271..4d9a4c3d5 100644 --- a/src/vidhrdw/m72.c +++ b/src/vidhrdw/m72.c @@ -17,19 +17,19 @@ static int irqbase; MACHINE_RESET( m72 ) { irqbase = 0x20; - machine_reset_m72_sound(); + machine_reset_m72_sound(machine); } MACHINE_RESET( xmultipl ) { irqbase = 0x08; - machine_reset_m72_sound(); + machine_reset_m72_sound(machine); } MACHINE_RESET( kengo ) { irqbase = 0x18; - machine_reset_m72_sound(); + machine_reset_m72_sound(machine); } INTERRUPT_GEN( m72_interrupt ) @@ -221,7 +221,7 @@ VIDEO_START( rtype2 ) VIDEO_START( poundfor ) { - int res = video_start_rtype2(); + int res = video_start_rtype2(machine); xadjust = -6; @@ -320,11 +320,7 @@ READ8_HANDLER( m72_palette2_r ) INLINE void changecolor(int color,int r,int g,int b) { - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(color,r,g,b); + palette_set_color(Machine,color,pal5bit(r),pal5bit(g),pal5bit(b)); } WRITE8_HANDLER( m72_palette1_w ) @@ -603,7 +599,7 @@ VIDEO_UPDATE( m72 ) { if (video_off) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); return 0; } @@ -628,7 +624,7 @@ VIDEO_UPDATE( majtitle ) if (video_off) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); return 0; } diff --git a/src/vidhrdw/macrossp.c b/src/vidhrdw/macrossp.c index bfc79044c..f3ea481be 100644 --- a/src/vidhrdw/macrossp.c +++ b/src/vidhrdw/macrossp.c @@ -374,7 +374,7 @@ VIDEO_UPDATE(macrossp) int layers[3],layerpri[3]; - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); layers[0] = 0; layerpri[0] = (macrossp_scra_videoregs[0] & 0x0000c000) >> 14; diff --git a/src/vidhrdw/magmax.c b/src/vidhrdw/magmax.c index 776f89b4f..760411f5a 100644 --- a/src/vidhrdw/magmax.c +++ b/src/vidhrdw/magmax.c @@ -68,7 +68,7 @@ PALETTE_INIT( magmax ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/mainsnk.c b/src/vidhrdw/mainsnk.c index 8d3a9f321..7a4b2936d 100644 --- a/src/vidhrdw/mainsnk.c +++ b/src/vidhrdw/mainsnk.c @@ -27,7 +27,7 @@ static void get_me_fg_tile_info(int tile_index) 0) } -static void stuff_palette( int source_index, int dest_index, int num_colors ) +static void stuff_palette( running_machine *machine, int source_index, int dest_index, int num_colors ) { @@ -57,7 +57,7 @@ static void stuff_palette( int source_index, int dest_index, int num_colors ) bit3 = (color_prom[0x800] >> 1) & 0x01; blue = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color( dest_index++, red, green, blue ); + palette_set_color( machine, dest_index++, red, green, blue ); color_prom++; } @@ -67,7 +67,7 @@ static void update_palette( int type ) { if( bg_color!=old_bg_color ) { - stuff_palette( 256+16*(bg_color&0x7), (0x11-type)*16, 16 ); + stuff_palette( Machine, 256+16*(bg_color&0x7), (0x11-type)*16, 16 ); old_bg_color = bg_color; } } @@ -102,8 +102,8 @@ WRITE8_HANDLER( me_bgram_w ) VIDEO_START(mainsnk) { old_bg_color = -1; - stuff_palette( 0, 0, 16*8 ); - stuff_palette( 16*8*3, 16*8, 16*8 ); + stuff_palette( machine, 0, 0, 16*8 ); + stuff_palette( machine, 16*8*3, 16*8, 16*8 ); me_fg_tilemap = tilemap_create(get_me_fg_tile_info,tilemap_scan_cols,TILEMAP_TRANSPARENT,8,8,32, 32); tilemap_set_transparent_pen(me_fg_tilemap,15); me_bg_tilemap = tilemap_create(get_me_bg_tile_info,tilemap_scan_cols,TILEMAP_OPAQUE,8,8,32, 32); diff --git a/src/vidhrdw/mappy.c b/src/vidhrdw/mappy.c index 506be4aec..59be1b5fa 100644 --- a/src/vidhrdw/mappy.c +++ b/src/vidhrdw/mappy.c @@ -58,7 +58,7 @@ PALETTE_INIT( superpac ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -92,7 +92,7 @@ PALETTE_INIT( mappy ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -145,7 +145,7 @@ PALETTE_INIT( phozon ) bit3 = (color_prom[i + 0x200] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += 0x300; diff --git a/src/vidhrdw/mario.c b/src/vidhrdw/mario.c index eb152332e..08ed0dd83 100644 --- a/src/vidhrdw/mario.c +++ b/src/vidhrdw/mario.c @@ -59,7 +59,7 @@ PALETTE_INIT( mario ) bit1 = (*color_prom >> 1) & 1; b = 255 - (0x55 * bit0 + 0xaa * bit1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/markham.c b/src/vidhrdw/markham.c index 66b20828c..2ef3b333e 100644 --- a/src/vidhrdw/markham.c +++ b/src/vidhrdw/markham.c @@ -20,11 +20,11 @@ PALETTE_INIT( markham ) for (i = 0;i < Machine->drv->total_colors;i++) { - int r = color_prom[0]*0x11; - int g = color_prom[Machine->drv->total_colors]*0x11; - int b = color_prom[2*Machine->drv->total_colors]*0x11; + int r = color_prom[0]; + int g = color_prom[Machine->drv->total_colors]; + int b = color_prom[2*Machine->drv->total_colors]; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal4bit(r),pal4bit(g),pal4bit(b)); color_prom++; } diff --git a/src/vidhrdw/marvins.c b/src/vidhrdw/marvins.c index a1554b632..4776f70f1 100644 --- a/src/vidhrdw/marvins.c +++ b/src/vidhrdw/marvins.c @@ -31,7 +31,7 @@ WRITE8_HANDLER( marvins_palette_bank_w ) fg_color = data&0xf; } -static void stuff_palette( int source_index, int dest_index, int num_colors ) +static void stuff_palette( running_machine *machine, int source_index, int dest_index, int num_colors ) { UINT8 *color_prom = memory_region(REGION_PROMS) + source_index; int i; @@ -58,7 +58,7 @@ static void stuff_palette( int source_index, int dest_index, int num_colors ) bit3 = (color_prom[0x400] >> 1) & 0x01; blue = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color( dest_index++, red, green, blue ); + palette_set_color( machine, dest_index++, red, green, blue ); color_prom++; } @@ -72,13 +72,13 @@ static void update_palette( int type ) { if( bg_color!=old_bg_color ) { - stuff_palette( 256+16*(bg_color&0x7), (0x11-type)*16, 16 ); + stuff_palette( Machine, 256+16*(bg_color&0x7), (0x11-type)*16, 16 ); old_bg_color = bg_color; } if( fg_color!=old_fg_color ) { - stuff_palette( 128+16*(fg_color&0x7), (0x10+type)*16, 16 ); + stuff_palette( Machine, 128+16*(fg_color&0x7), (0x10+type)*16, 16 ); old_fg_color = fg_color; } } @@ -159,8 +159,8 @@ VIDEO_START( marvins ) { flipscreen = -1; old_bg_color = old_fg_color = -1; - stuff_palette( 0, 0, 16*8 ); /* load sprite colors */ - stuff_palette( 16*8*3, 16*8, 16*8 ); /* load text colors */ + stuff_palette( machine, 0, 0, 16*8 ); /* load sprite colors */ + stuff_palette( machine, 16*8*3, 16*8, 16*8 ); /* load text colors */ fg_tilemap = tilemap_create(get_fg_tilemap_info,tilemap_scan_cols,TILEMAP_TRANSPARENT,8,8,64,32); bg_tilemap = tilemap_create(get_bg_tilemap_info,tilemap_scan_cols,TILEMAP_TRANSPARENT,8,8,64,32); diff --git a/src/vidhrdw/matmania.c b/src/vidhrdw/matmania.c index 4585b1d64..078e8dcff 100644 --- a/src/vidhrdw/matmania.c +++ b/src/vidhrdw/matmania.c @@ -79,7 +79,7 @@ PALETTE_INIT( matmania ) bit3 = (color_prom[64] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } @@ -117,7 +117,7 @@ WRITE8_HANDLER( matmania_paletteram_w ) bit3 = (val >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(offs2 + 64,r,g,b); + palette_set_color(Machine,offs2 + 64,r,g,b); } diff --git a/src/vidhrdw/mcatadv.c b/src/vidhrdw/mcatadv.c index 244872ee9..8f779113e 100644 --- a/src/vidhrdw/mcatadv.c +++ b/src/vidhrdw/mcatadv.c @@ -167,7 +167,7 @@ VIDEO_UPDATE( mcatadv ) { int i, scrollx, scrolly, flip; - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); fillbitmap(priority_bitmap, 0, cliprect); if(mcatadv_scroll[2] != palette_bank1) { diff --git a/src/vidhrdw/mcr.c b/src/vidhrdw/mcr.c index f38b67a35..c019f5be2 100644 --- a/src/vidhrdw/mcr.c +++ b/src/vidhrdw/mcr.c @@ -128,18 +128,7 @@ VIDEO_START( mcr ) static void mcr_set_color(int index, int data) { - /* 3 bits each, RGB */ - int r = (data >> 6) & 7; - int g = (data >> 0) & 7; - int b = (data >> 3) & 7; - - /* up to 8 bits */ - r = (r << 5) | (r << 2) | (r >> 1); - g = (g << 5) | (g << 2) | (g >> 1); - b = (b << 5) | (b << 2) | (b >> 1); - - /* set the color */ - palette_set_color(index, r, g, b); + palette_set_color(Machine, index, pal3bit(data >> 6), pal3bit(data >> 0), pal3bit(data >> 3)); } @@ -156,7 +145,7 @@ static void journey_set_color(int index, int data) b = (b << 5) | (b << 1); /* set the BG color */ - palette_set_color(index, r, g, b); + palette_set_color(Machine, index, r, g, b); /* if this is an odd entry in the upper palette bank, the hardware */ /* hard-codes a low 1 bit -- this is used for better grayscales */ @@ -168,7 +157,7 @@ static void journey_set_color(int index, int data) } /* set the FG color */ - palette_set_color(index + 64, r, g, b); + palette_set_color(Machine, index + 64, r, g, b); } diff --git a/src/vidhrdw/mcr3.c b/src/vidhrdw/mcr3.c index a2679f541..c2581d027 100644 --- a/src/vidhrdw/mcr3.c +++ b/src/vidhrdw/mcr3.c @@ -91,10 +91,10 @@ static void spyhunt_get_alpha_tile_info(int tile_index) PALETTE_INIT( spyhunt ) { /* alpha colors are hard-coded */ - palette_set_color(4*16+0,0x00,0x00,0x00); - palette_set_color(4*16+1,0x00,0xff,0x00); - palette_set_color(4*16+2,0x00,0x00,0xff); - palette_set_color(4*16+3,0xff,0xff,0xff); + palette_set_color(machine,4*16+0,0x00,0x00,0x00); + palette_set_color(machine,4*16+1,0x00,0xff,0x00); + palette_set_color(machine,4*16+2,0x00,0x00,0xff); + palette_set_color(machine,4*16+3,0xff,0xff,0xff); } @@ -156,22 +156,11 @@ VIDEO_START( spyhunt ) WRITE8_HANDLER( mcr3_paletteram_w ) { - int r, g, b; - paletteram[offset] = data; offset &= 0x7f; /* high bit of red comes from low bit of address */ - r = ((offset & 1) << 2) + (data >> 6); - g = (data >> 0) & 7; - b = (data >> 3) & 7; - - /* up to 8 bits */ - r = (r << 5) | (r << 2) | (r >> 1); - g = (g << 5) | (g << 2) | (g >> 1); - b = (b << 5) | (b << 2) | (b >> 1); - - palette_set_color(offset / 2, r, g, b); + palette_set_color(Machine, offset / 2, pal3bit(((offset & 1) << 2) + (data >> 6)), pal3bit(data >> 0), pal3bit(data >> 3)); } diff --git a/src/vidhrdw/mcr68.c b/src/vidhrdw/mcr68.c index e87e9ddde..b15d6d4e5 100644 --- a/src/vidhrdw/mcr68.c +++ b/src/vidhrdw/mcr68.c @@ -138,41 +138,21 @@ VIDEO_START( zwackery ) WRITE16_HANDLER( mcr68_paletteram_w ) { - int newword, r, g, b; + int newword; COMBINE_DATA(&paletteram16[offset]); newword = paletteram16[offset]; - - r = (newword >> 6) & 7; - b = (newword >> 3) & 7; - g = (newword >> 0) & 7; - - /* up to 8 bits */ - r = (r << 5) | (r << 2) | (r >> 1); - g = (g << 5) | (g << 2) | (g >> 1); - b = (b << 5) | (b << 2) | (b >> 1); - - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal3bit(newword >> 6), pal3bit(newword >> 0), pal3bit(newword >> 3)); } WRITE16_HANDLER( zwackery_paletteram_w ) { - int newword, r, g, b; + int newword; COMBINE_DATA(&paletteram16[offset]); newword = paletteram16[offset]; - - r = (~newword >> 10) & 31; - b = (~newword >> 5) & 31; - g = (~newword >> 0) & 31; - - /* up to 8 bits */ - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal5bit(~newword >> 10), pal5bit(~newword >> 0), pal5bit(~newword >> 5)); } diff --git a/src/vidhrdw/megazone.c b/src/vidhrdw/megazone.c index 0d5a60b2d..b4e543fb1 100644 --- a/src/vidhrdw/megazone.c +++ b/src/vidhrdw/megazone.c @@ -68,7 +68,7 @@ PALETTE_INIT( megazone ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/mermaid.c b/src/vidhrdw/mermaid.c index 857582a47..09f902f50 100644 --- a/src/vidhrdw/mermaid.c +++ b/src/vidhrdw/mermaid.c @@ -34,13 +34,13 @@ PALETTE_INIT( mermaid ) int g = 0x21 * BIT(*color_prom, 3) + 0x47 * BIT(*color_prom, 4) + 0x97 * BIT(*color_prom, 5); int b = 0x47 * BIT(*color_prom, 6) + 0x97 * BIT(*color_prom, 7); - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); color_prom++; } // blue background - palette_set_color(TOTAL_COLORS(0), 0, 0, 0xff); + palette_set_color(machine, TOTAL_COLORS(0), 0, 0, 0xff); // set up background palette COLOR(2,0) = 32; diff --git a/src/vidhrdw/metro.c b/src/vidhrdw/metro.c index c5d2f8621..1b749657d 100644 --- a/src/vidhrdw/metro.c +++ b/src/vidhrdw/metro.c @@ -128,16 +128,9 @@ UINT32 tilemap_scan_gstrik2( UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num WRITE16_HANDLER( metro_paletteram_w ) { - int r,g,b; - data = COMBINE_DATA(&paletteram16[offset]); - - b = (data >> 1) & 0x1f; - r = (data >> 6) & 0x1f; - g = (data >> 11) & 0x1f; - /* We need the ^0xff because we had to invert the pens in the gfx */ - palette_set_color(offset^0xff,(r << 3) | (r >> 2),(g << 3) | (g >> 2),(b << 3) | (b >> 2)); + palette_set_color(Machine,offset^0xff,pal5bit(data >> 6),pal5bit(data >> 11),pal5bit(data >> 1)); } @@ -488,7 +481,7 @@ VIDEO_START( metro_14300 ) VIDEO_START( blzntrnd ) { - if (video_start_metro_14220()) + if (video_start_metro_14220(machine)) return 1; has_zoom = 1; @@ -511,7 +504,7 @@ VIDEO_START( blzntrnd ) VIDEO_START( gstrik2 ) { - if (video_start_metro_14220()) + if (video_start_metro_14220(machine)) return 1; has_zoom = 1; diff --git a/src/vidhrdw/mexico86.c b/src/vidhrdw/mexico86.c index 0eca88f5f..7c3addce5 100644 --- a/src/vidhrdw/mexico86.c +++ b/src/vidhrdw/mexico86.c @@ -190,7 +190,7 @@ VIDEO_UPDATE( kikikai ) int goffs,code,color,y; int tx, ty; - fillbitmap(bitmap, get_black_pen(), &Machine->screen[0].visarea); + fillbitmap(bitmap, get_black_pen(machine), &Machine->screen[0].visarea); sx = 0; for (offs=0; offs> 6) & 0x1f; - g = (data >> 1) & 0x1f; - b = (data >> 11) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(color,r,g,b); + palette_set_color(Machine,color,pal5bit(data >> 6),pal5bit(data >> 1),pal5bit(data >> 11)); } WRITE16_HANDLER( paletteram16_BBBBBRRRRRGGGGGG_word_w ) @@ -101,7 +91,7 @@ static int bank=0; if(keyboard_pressed(KEYCODE_F1)) { UINT8 transmit=0; - mame_pause(1); + mame_pause(Machine, 1); do { @@ -145,7 +135,7 @@ if(keyboard_pressed(KEYCODE_F1)) M68681.RBA=transmit<<8; M68681.SRA|=0x100; - mame_pause(0); + mame_pause(Machine, 0); return 0; } */ diff --git a/src/vidhrdw/midtunit.c b/src/vidhrdw/midtunit.c index 73a48f5de..3f81a0f20 100644 --- a/src/vidhrdw/midtunit.c +++ b/src/vidhrdw/midtunit.c @@ -115,7 +115,7 @@ VIDEO_START( midtunit ) VIDEO_START( midwunit ) { - int result = video_start_midtunit(); + int result = video_start_midtunit(machine); midtunit_gfx_rom_large = 1; return result; } @@ -123,7 +123,7 @@ VIDEO_START( midwunit ) VIDEO_START( midxunit ) { - int result = video_start_midtunit(); + int result = video_start_midtunit(machine); midtunit_gfx_rom_large = 1; midtunit_using_34020 = 1; videobank_select = 1; @@ -305,20 +305,11 @@ READ16_HANDLER( midwunit_control_r ) WRITE16_HANDLER( midtunit_paletteram_w ) { - int newword, r, g, b; + int newword; COMBINE_DATA(&paletteram16[offset]); newword = paletteram16[offset]; - - r = (newword >> 10) & 0x1f; - g = (newword >> 5) & 0x1f; - b = (newword ) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0)); } diff --git a/src/vidhrdw/midvunit.c b/src/vidhrdw/midvunit.c index fa84e0b33..d3645eaaa 100644 --- a/src/vidhrdw/midvunit.c +++ b/src/vidhrdw/midvunit.c @@ -1132,20 +1132,11 @@ READ32_HANDLER( midvunit_videoram_r ) WRITE32_HANDLER( midvunit_paletteram_w ) { - int newword, r, g, b; + int newword; COMBINE_DATA(&paletteram32[offset]); newword = paletteram32[offset]; - - r = (newword >> 10) & 0x1f; - g = (newword >> 5) & 0x1f; - b = (newword ) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal5bit(newword >> 10), pal5bit(newword >> 5), pal5bit(newword >> 0)); } diff --git a/src/vidhrdw/midyunit.c b/src/vidhrdw/midyunit.c index d400d5ded..a39cf74fd 100644 --- a/src/vidhrdw/midyunit.c +++ b/src/vidhrdw/midyunit.c @@ -106,7 +106,7 @@ static VIDEO_START( common ) VIDEO_START( midyunit_4bit ) { - int result = video_start_common(); + int result = video_start_common(machine); int i; /* handle failure */ @@ -124,7 +124,7 @@ VIDEO_START( midyunit_4bit ) VIDEO_START( midyunit_6bit ) { - int result = video_start_common(); + int result = video_start_common(machine); int i; /* handle failure */ @@ -142,7 +142,7 @@ VIDEO_START( midyunit_6bit ) VIDEO_START( mkyawdim ) { - int result = video_start_midyunit_6bit(); + int result = video_start_midyunit_6bit(machine); yawdim_dma = 1; return result; } @@ -150,7 +150,7 @@ VIDEO_START( mkyawdim ) VIDEO_START( midzunit ) { - int result = video_start_common(); + int result = video_start_common(machine); int i; /* handle failure */ @@ -305,20 +305,11 @@ WRITE16_HANDLER( midyunit_control_w ) WRITE16_HANDLER( midyunit_paletteram_w ) { - int newword, r, g, b; + int newword; COMBINE_DATA(&paletteram16[offset]); newword = paletteram16[offset]; - - r = (newword >> 10) & 0x1f; - g = (newword >> 5) & 0x1f; - b = (newword ) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset & palette_mask, r, g, b); + palette_set_color(Machine, offset & palette_mask, pal5bit(newword >> 10), pal5bit(newword >> 5), pal5bit(newword >> 0)); } @@ -850,7 +841,7 @@ VIDEO_UPDATE( midyunit ) { rectangle erase = *cliprect; erase.max_x = leftscroll - 1; - fillbitmap(bitmap, get_black_pen(), &erase); + fillbitmap(bitmap, get_black_pen(machine), &erase); } return 0; } diff --git a/src/vidhrdw/mikie.c b/src/vidhrdw/mikie.c index a9c2eded5..acb056b46 100644 --- a/src/vidhrdw/mikie.c +++ b/src/vidhrdw/mikie.c @@ -55,7 +55,7 @@ PALETTE_INIT( mikie ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/minivadr.c b/src/vidhrdw/minivadr.c index 92a08ad43..23edf9284 100644 --- a/src/vidhrdw/minivadr.c +++ b/src/vidhrdw/minivadr.c @@ -19,8 +19,8 @@ Driver by Takahiro Nogi (nogi@kt.rim.or.jp) 1999/12/19 - PALETTE_INIT( minivadr ) { - palette_set_color(0,0x00,0x00,0x00); - palette_set_color(1,0xff,0xff,0xff); + palette_set_color(machine,0,0x00,0x00,0x00); + palette_set_color(machine,1,0xff,0xff,0xff); } diff --git a/src/vidhrdw/mjkjidai.c b/src/vidhrdw/mjkjidai.c index 39597f73a..b2c35aac2 100644 --- a/src/vidhrdw/mjkjidai.c +++ b/src/vidhrdw/mjkjidai.c @@ -137,7 +137,7 @@ VIDEO_UPDATE( mjkjidai ) { if (!display_enable) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); } else { diff --git a/src/vidhrdw/mjsister.c b/src/vidhrdw/mjsister.c index caef1a514..8900ba76d 100644 --- a/src/vidhrdw/mjsister.c +++ b/src/vidhrdw/mjsister.c @@ -110,6 +110,6 @@ VIDEO_UPDATE( mjsister ) copybitmap(bitmap,mjsister_tmpbitmap1,f,f,2,0,cliprect,TRANSPARENCY_PEN,0); } else - fillbitmap(bitmap, get_black_pen(), &Machine->screen[0].visarea); + fillbitmap(bitmap, get_black_pen(machine), &Machine->screen[0].visarea); return 0; } diff --git a/src/vidhrdw/model1.c b/src/vidhrdw/model1.c index 14b69ff95..a2f54d364 100644 --- a/src/vidhrdw/model1.c +++ b/src/vidhrdw/model1.c @@ -442,10 +442,10 @@ static void draw_quads(mame_bitmap *bitmap, const rectangle *cliprect) fill_quad(bitmap, q); #if 0 - draw_line(bitmap, get_black_pen(), 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(), 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(), 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(), 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(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(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(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(machine), q->p[3]->s.x, q->p[3]->s.y, q->p[0]->s.x, q->p[0]->s.y); #endif } } diff --git a/src/vidhrdw/mole.c b/src/vidhrdw/mole.c index dbdbfc827..9155eddd9 100644 --- a/src/vidhrdw/mole.c +++ b/src/vidhrdw/mole.c @@ -15,13 +15,9 @@ static tilemap *bg_tilemap; PALETTE_INIT( mole ) { int i; - int r, g, b; for (i = 0; i < 8; i++) { - r = (i & 1) ? 0xff : 0x00; - g = (i & 4) ? 0xff : 0x00; - b = (i & 2) ? 0xff : 0x00; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, pal1bit(i >> 0), pal1bit(i >> 2), pal1bit(i >> 1)); } } diff --git a/src/vidhrdw/mouser.c b/src/vidhrdw/mouser.c index e089f598c..495e807ab 100644 --- a/src/vidhrdw/mouser.c +++ b/src/vidhrdw/mouser.c @@ -38,7 +38,7 @@ PALETTE_INIT( mouser ) bit1 = BIT(*color_prom,7); b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/mpatrol.c b/src/vidhrdw/mpatrol.c index eb746f25d..5db9899f0 100644 --- a/src/vidhrdw/mpatrol.c +++ b/src/vidhrdw/mpatrol.c @@ -82,7 +82,7 @@ PALETTE_INIT( mpatrol ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -108,7 +108,7 @@ PALETTE_INIT( mpatrol ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+512,r,g,b); + palette_set_color(machine,i+512,r,g,b); color_prom++; } @@ -136,7 +136,7 @@ PALETTE_INIT( mpatrol ) bit2 = (*color_prom >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+512+32,r,g,b); + palette_set_color(machine,i+512+32,r,g,b); color_prom++; } diff --git a/src/vidhrdw/mrdo.c b/src/vidhrdw/mrdo.c index 147446c36..108d5ed3d 100644 --- a/src/vidhrdw/mrdo.c +++ b/src/vidhrdw/mrdo.c @@ -96,7 +96,7 @@ PALETTE_INIT( mrdo ) bits0 = (color_prom[a1] >> 4) & 0x03; bits2 = (color_prom[a2] >> 4) & 0x03; b = weight[bits0 + (bits2 << 2)]; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += 64; diff --git a/src/vidhrdw/mrjong.c b/src/vidhrdw/mrjong.c index d81650453..a9b18d393 100644 --- a/src/vidhrdw/mrjong.c +++ b/src/vidhrdw/mrjong.c @@ -41,7 +41,7 @@ PALETTE_INIT( mrjong ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/ms32.c b/src/vidhrdw/ms32.c index 3c56705d9..05e2a0d40 100644 --- a/src/vidhrdw/ms32.c +++ b/src/vidhrdw/ms32.c @@ -120,7 +120,7 @@ static void update_color(int color) b = ((ms32_palram[color*2+1] & 0x00ff) >>0 ); } - palette_set_color(color,r,g,b); + palette_set_color(Machine,color,r,g,b); } WRITE32_HANDLER( ms32_brightness_w ) diff --git a/src/vidhrdw/munchmo.c b/src/vidhrdw/munchmo.c index 187615dd7..ac556e08f 100644 --- a/src/vidhrdw/munchmo.c +++ b/src/vidhrdw/munchmo.c @@ -33,7 +33,7 @@ PALETTE_INIT( mnchmobl ) bit1 = (color_prom[i] >> 7) & 0x01; b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/mustache.c b/src/vidhrdw/mustache.c index c850e3167..9611e0ac3 100644 --- a/src/vidhrdw/mustache.c +++ b/src/vidhrdw/mustache.c @@ -40,7 +40,7 @@ PALETTE_INIT(mustache) bit3 = (color_prom[i + 512] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/mystston.c b/src/vidhrdw/mystston.c index c7397d3de..a234f7ed3 100644 --- a/src/vidhrdw/mystston.c +++ b/src/vidhrdw/mystston.c @@ -62,7 +62,7 @@ PALETTE_INIT( mystston ) b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i + 24, r, g, b); // first 24 colors are from RAM + palette_set_color(machine, i + 24, r, g, b); // first 24 colors are from RAM color_prom++; } diff --git a/src/vidhrdw/n64.c b/src/vidhrdw/n64.c index 366bb03f1..36293aec9 100644 --- a/src/vidhrdw/n64.c +++ b/src/vidhrdw/n64.c @@ -29,6 +29,21 @@ static UINT32 rdp_cmd_data[0x1000]; static int rdp_cmd_ptr = 0; static int rdp_cmd_cur = 0; +typedef struct +{ + int lx, rx; + int s, ds; + int t, dt; + int w, dw; + int r, dr; + int g, dg; + int b, db; + int a, da; + int z, dz; +} SPAN; + +static SPAN span[1024]; + /*****************************************************************************/ #if LSB_FIRST @@ -64,10 +79,73 @@ typedef struct UINT32 tmem; int palette; // TODO: clamp & mirror parameters + int ct, mt, cs, ms; + int mask_t, shift_t, mask_s, shift_s; UINT16 sl, tl, sh, th; // 10.2 fixed-point } TILE; +typedef struct +{ + int sub_a_rgb0; + int sub_b_rgb0; + int mul_rgb0; + int add_rgb0; + int sub_a_a0; + int sub_b_a0; + int mul_a0; + int add_a0; + + int sub_a_rgb1; + int sub_b_rgb1; + int mul_rgb1; + int add_rgb1; + int sub_a_a1; + int sub_b_a1; + int mul_a1; + int add_a1; +} COMBINE_MODES; + +typedef struct +{ + int cycle_type; + int persp_tex_en; + int detail_tex_en; + int sharpen_tex_en; + int tex_lod_en; + int en_tlut; + int tlut_type; + int sample_type; + int mid_texel; + int bi_lerp0; + int bi_lerp1; + int convert_one; + int key_en; + int rgb_dither_sel; + int alpha_dither_sel; + int blend_m1a_0; + int blend_m1a_1; + int blend_m1b_0; + int blend_m1b_1; + int blend_m2a_0; + int blend_m2a_1; + int blend_m2b_0; + int blend_m2b_1; + int force_blend; + int alpha_cvg_select; + int cvg_times_alpha; + int z_mode; + int cvg_dest; + int color_on_cvg; + int image_read_en; + int z_update_en; + int z_compare_en; + int antialias_en; + int z_source_sel; + int dither_alpha_en; + int alpha_compare_en; +} OTHER_MODES; + /*****************************************************************************/ #define PIXEL_SIZE_4BIT 0 @@ -75,33 +153,62 @@ typedef struct #define PIXEL_SIZE_16BIT 2 #define PIXEL_SIZE_32BIT 3 -#define OTHER_MODES_PERSP_TEX U64(0x0008000000000000) -#define OTHER_MODES_DETAIL_TEX U64(0x0004000000000000) -#define OTHER_MODES_SHARPEN_TEX U64(0x0002000000000000) -#define OTHER_MODES_TEX_LOD U64(0x0001000000000000) -#define OTHER_MODES_TLUT_EN U64(0x0000800000000000) -#define OTHER_MODES_TLUT_TYPE U64(0x0000400000000000) -#define OTHER_MODES_SAMPLE_TYPE U64(0x0000200000000000) -#define OTHER_MODES_MIDTEXEL U64(0x0000100000000000) -#define OTHER_MODES_BILERP_0 U64(0x0000080000000000) -#define OTHER_MODES_BILERP_1 U64(0x0000040000000000) -#define OTHER_MODES_CONVERT_ONE U64(0x0000020000000000) -#define OTHER_MODES_CHROMA_KEY_EN U64(0x0000010000000000) -#define OTHER_MODES_FORCE_BLEND U64(0x0000000000004000) -#define OTHER_MODES_ALPHA_CVG_SEL U64(0x0000000000002000) -#define OTHER_MODES_CVG_TIMES_ALPHA U64(0x0000000000001000) -#define OTHER_MODES_COLOR_ON_CVG U64(0x0000000000000040) -#define OTHER_MODES_ZUPDATE U64(0x0000000000000020) -#define OTHER_MODES_ZCOMPARE U64(0x0000000000000010) -#define OTHER_MODES_ANTIALIAS U64(0x0000000000000008) -#define OTHER_MODES_ZSOURCE_SEL U64(0x0000000000000004) -#define OTHER_MODES_DITHER_ALPHA U64(0x0000000000000002) -#define OTHER_MODES_ALPHA_COMPARE U64(0x0000000000000001) +#define CYCLE_TYPE_1 0 +#define CYCLE_TYPE_2 1 +#define CYCLE_TYPE_COPY 2 +#define CYCLE_TYPE_FILL 3 + +static COMBINE_MODES combine; +static OTHER_MODES other_modes; static COLOR blend_color; static COLOR prim_color; static COLOR env_color; static COLOR fog_color; +static COLOR combined_color; +static COLOR texel0_color; +static COLOR texel1_color; +static COLOR shade_color; + +static COLOR one_color = { 0xff, 0xff, 0xff, 0xff }; +static COLOR zero_color = { 0x00, 0x00, 0x00, 0x00 }; + +// combiner inputs +static UINT8 *combiner_rgbsub_a_r[2]; +static UINT8 *combiner_rgbsub_a_g[2]; +static UINT8 *combiner_rgbsub_a_b[2]; +static UINT8 *combiner_rgbsub_b_r[2]; +static UINT8 *combiner_rgbsub_b_g[2]; +static UINT8 *combiner_rgbsub_b_b[2]; +static UINT8 *combiner_rgbmul_r[2]; +static UINT8 *combiner_rgbmul_g[2]; +static UINT8 *combiner_rgbmul_b[2]; +static UINT8 *combiner_rgbadd_r[2]; +static UINT8 *combiner_rgbadd_g[2]; +static UINT8 *combiner_rgbadd_b[2]; + +static UINT8 *combiner_alphasub_a[2]; +static UINT8 *combiner_alphasub_b[2]; +static UINT8 *combiner_alphamul[2]; +static UINT8 *combiner_alphaadd[2]; + +// blender input +static UINT8 *blender1a_r[2]; +static UINT8 *blender1a_g[2]; +static UINT8 *blender1a_b[2]; +static UINT8 *blender1b_a[2]; +static UINT8 *blender2a_r[2]; +static UINT8 *blender2a_g[2]; +static UINT8 *blender2a_b[2]; +static UINT8 *blender2b_a[2]; + + +static COLOR pixel_color; +static COLOR inv_pixel_color; +static COLOR blended_pixel_color; +static COLOR memory_color; + + static UINT32 fill_color; // packed 16-bit or 32-bit, depending on framebuffer format @@ -124,11 +231,43 @@ static TILE tile[8]; static RECTANGLE clip; -static UINT64 other_modes; - static UINT8 *texture_cache; static UINT32 tlut[256]; +#define CLAMP(S, T) \ +do \ +{ \ + if (clamp_s) \ + { \ + if (S < (tsl >> 2)) S = (tsl >> 2); \ + if (S > (tsh >> 2)) S = (tsh >> 2); \ + } \ + if (mirror_s) \ + { \ + if (S < (tsl >> 2)) S = abs(S - (tsl >> 2)); \ + if (S > (tsh >> 2)) S = abs(S - (tsh >> 2)); \ + } \ + if (mask_s != 0) \ + { \ + S &= (((UINT32)(0xffffffff) >> (32-mask_s))); \ + } \ + if (clamp_t) \ + { \ + if (T < (ttl >> 2)) T = (ttl >> 2); \ + if (T > (tth >> 2)) T = (tth >> 2); \ + } \ + if (mirror_t) \ + { \ + if (T < (ttl >> 2)) T = abs(T - (ttl >> 2)); \ + if (T > (tth >> 2)) T = abs(T - (tth >> 2)); \ + } \ + if (mask_t != 0) \ + { \ + T &= (((UINT32)(0xffffffff) >> (32-mask_t))); \ + } \ +} \ +while (0) + /*****************************************************************************/ @@ -141,6 +280,32 @@ VIDEO_START(n64) texture_cache = auto_malloc(0x100000); + combiner_rgbsub_a_r[0] = combiner_rgbsub_a_r[1] = &one_color.r; + combiner_rgbsub_a_g[0] = combiner_rgbsub_a_g[1] = &one_color.g; + combiner_rgbsub_a_b[0] = combiner_rgbsub_a_b[1] = &one_color.b; + combiner_rgbsub_b_r[0] = combiner_rgbsub_b_r[1] = &one_color.r; + combiner_rgbsub_b_g[0] = combiner_rgbsub_b_g[1] = &one_color.g; + combiner_rgbsub_b_b[0] = combiner_rgbsub_b_b[1] = &one_color.b; + combiner_rgbmul_r[0] = combiner_rgbmul_r[1] = &one_color.r; + combiner_rgbmul_g[0] = combiner_rgbmul_g[1] = &one_color.g; + combiner_rgbmul_b[0] = combiner_rgbmul_b[1] = &one_color.b; + combiner_rgbadd_r[0] = combiner_rgbadd_r[1] = &one_color.r; + combiner_rgbadd_g[0] = combiner_rgbadd_g[1] = &one_color.g; + combiner_rgbadd_b[0] = combiner_rgbadd_b[1] = &one_color.b; + + combiner_alphasub_a[0] = combiner_alphasub_a[1] = &one_color.a; + combiner_alphasub_b[0] = combiner_alphasub_b[1] = &one_color.a; + combiner_alphamul[0] = combiner_alphamul[1] = &one_color.a; + combiner_alphaadd[0] = combiner_alphaadd[1] = &one_color.a; + + blender1a_r[0] = blender1a_r[1] = &pixel_color.r; + blender1a_g[0] = blender1a_g[1] = &pixel_color.r; + blender1a_b[0] = blender1a_b[1] = &pixel_color.r; + blender1b_a[0] = blender1b_a[1] = &pixel_color.r; + blender2a_r[0] = blender2a_r[1] = &pixel_color.r; + blender2a_g[0] = blender2a_g[1] = &pixel_color.r; + blender2a_b[0] = blender2a_b[1] = &pixel_color.r; + blender2b_a[0] = blender2b_a[1] = &pixel_color.r; return 0; } @@ -164,7 +329,7 @@ VIDEO_UPDATE(n64) for (j=0; j line[j]; - for (i=0; i < vi_width; i++) + for (i=0; i < fb_width; i++) { UINT16 pix = *frame_buffer++; int r = ((pix >> 11) & 0x1f) << 3; @@ -185,7 +350,7 @@ VIDEO_UPDATE(n64) for (j=0; j < height; j++) { UINT32 *d = bitmap->line[j]; - for (i=0; i < vi_width; i++) + for (i=0; i < fb_width; i++) { UINT32 pix = *frame_buffer++; *d++ = pix & 0xffffff; @@ -200,384 +365,356 @@ VIDEO_UPDATE(n64) return 0; } - /*****************************************************************************/ -static void fill_rectangle_16bit(RECTANGLE *rect) +INLINE void SET_SUBA_RGB_INPUT(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code) { - UINT16 *fb = (UINT16*)&rdram[(fb_address / 4)]; - int index, i, j; - int x1 = rect->xh / 4; - int x2 = rect->xl / 4; - int y1 = rect->yh / 4; - int y2 = rect->yl / 4; - - // TODO: clip - - for (j=y1; j <= y2; j++) + switch (code & 0xf) { - index = j * fb_width; - for (i=x1; i <= x2; i++) + case 0: *input_r = &combined_color.r; *input_g = &combined_color.g; *input_b = &combined_color.b; break; + case 1: *input_r = &texel0_color.r; *input_g = &texel0_color.g; *input_b = &texel0_color.b; break; + case 2: *input_r = &texel1_color.r; *input_g = &texel1_color.g; *input_b = &texel1_color.b; break; + case 3: *input_r = &prim_color.r; *input_g = &prim_color.g; *input_b = &prim_color.b; break; + case 4: *input_r = &shade_color.r; *input_g = &shade_color.g; *input_b = &shade_color.b; break; + case 5: *input_r = &env_color.r; *input_g = &env_color.g; *input_b = &env_color.b; break; + case 6: *input_r = &one_color.r; *input_g = &one_color.g; *input_b = &one_color.b; break; + case 7: fatalerror("SET_SUBA_RGB_INPUT: noise\n"); break; + case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: { - fb[(index + i) ^ 1] = (i & 1) ? (UINT16)(fill_color >> 16) : (UINT16)(fill_color); + *input_r = &zero_color.r; *input_g = &zero_color.g; *input_b = &zero_color.b; break; } } } -static void texture_rectangle_16bit(TEX_RECTANGLE *rect) +INLINE void SET_SUBB_RGB_INPUT(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code) { - UINT16 *fb = (UINT16*)&rdram[(fb_address / 4)]; - int index, i, j, tline; - int x1, x2, y1, y2; - int clipx1, clipx2, clipy1, clipy2; - - UINT32 tb = tile[rect->tilenum].tmem; - UINT32 twidth = tile[rect->tilenum].line; - - INT32 s = 0; - INT32 t = 0; - - x1 = rect->xh / 4; - x2 = rect->xl / 4; - y1 = rect->yh / 4; - y2 = rect->yl / 4; - - clipx1 = clip.xh / 4; - clipx2 = clip.xl / 4; - clipy1 = clip.yh / 4; - clipy2 = clip.yl / 4; - - // clip - if (x1 < clipx1) + switch (code & 0xf) { - s += ((clipx1 - x1) * rect->dsdx) >> 5; - x1 = clipx1; + case 0: *input_r = &combined_color.r; *input_g = &combined_color.g; *input_b = &combined_color.b; break; + case 1: *input_r = &texel0_color.r; *input_g = &texel0_color.g; *input_b = &texel0_color.b; break; + case 2: *input_r = &texel1_color.r; *input_g = &texel1_color.g; *input_b = &texel1_color.b; break; + case 3: *input_r = &prim_color.r; *input_g = &prim_color.g; *input_b = &prim_color.b; break; + case 4: *input_r = &shade_color.r; *input_g = &shade_color.g; *input_b = &shade_color.b; break; + case 5: *input_r = &env_color.r; *input_g = &env_color.g; *input_b = &env_color.b; break; + case 6: fatalerror("SET_SUBB_RGB_INPUT: key_center\n"); break; + case 7: fatalerror("SET_SUBB_RGB_INPUT: convert_k4\n"); break; + case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: + { + *input_r = &zero_color.r; *input_g = &zero_color.g; *input_b = &zero_color.b; break; + } } - if (y1 < clipy1) +} + +INLINE void SET_MUL_RGB_INPUT(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code) +{ + switch (code & 0x1f) { - t += ((clipy1 - y1) * rect->dtdy) >> 5; - y1 = clipy1; + case 0: *input_r = &combined_color.r; *input_g = &combined_color.g; *input_b = &combined_color.b; break; + case 1: *input_r = &texel0_color.r; *input_g = &texel0_color.g; *input_b = &texel0_color.b; break; + case 2: *input_r = &texel1_color.r; *input_g = &texel1_color.g; *input_b = &texel1_color.b; break; + case 3: *input_r = &prim_color.r; *input_g = &prim_color.g; *input_b = &prim_color.b; break; + case 4: *input_r = &shade_color.r; *input_g = &shade_color.g; *input_b = &shade_color.b; break; + case 5: *input_r = &env_color.r; *input_g = &env_color.g; *input_b = &env_color.b; break; + case 6: fatalerror("SET_MUL_RGB_INPUT: key scale\n"); break; + case 7: *input_r = &combined_color.a; *input_g = &combined_color.a; *input_b = &combined_color.a; break; + case 8: *input_r = &texel0_color.a; *input_g = &texel0_color.a; *input_b = &texel0_color.a; break; + case 9: *input_r = &texel1_color.a; *input_g = &texel1_color.a; *input_b = &texel1_color.a; break; + case 10: *input_r = &prim_color.a; *input_g = &prim_color.a; *input_b = &prim_color.a; break; + case 11: *input_r = &shade_color.a; *input_g = &shade_color.a; *input_b = &shade_color.a; break; + case 12: *input_r = &env_color.a; *input_g = &env_color.a; *input_b = &env_color.a; break; + case 13: break;//TODO fatalerror("SET_MUL_RGB_INPUT: lod fraction\n"); break; + case 14: break;//TODO fatalerror("SET_MUL_RGB_INPUT: primitive lod fraction\n"); break; + case 15: break;//TODO fatalerror("SET_MUL_RGB_INPUT: convert k5\n"); 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 = &zero_color.r; *input_g = &zero_color.g; *input_b = &zero_color.b; break; + } } - if (x2 >= clipx2) +} + +INLINE void SET_ADD_RGB_INPUT(UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, int code) +{ + switch (code & 0x7) { - x2 = clipx2-1; + case 0: *input_r = &combined_color.r; *input_g = &combined_color.g; *input_b = &combined_color.b; break; + case 1: *input_r = &texel0_color.r; *input_g = &texel0_color.g; *input_b = &texel0_color.b; break; + case 2: *input_r = &texel1_color.r; *input_g = &texel1_color.g; *input_b = &texel1_color.b; break; + case 3: *input_r = &prim_color.r; *input_g = &prim_color.g; *input_b = &prim_color.b; break; + case 4: *input_r = &shade_color.r; *input_g = &shade_color.g; *input_b = &shade_color.b; break; + case 5: *input_r = &env_color.r; *input_g = &env_color.g; *input_b = &env_color.b; break; + case 6: *input_r = &one_color.r; *input_g = &one_color.g; *input_b = &one_color.b; break; + case 7: *input_r = &zero_color.r; *input_g = &zero_color.g; *input_b = &zero_color.b; break; } - if (y2 >= clipy2) +} + +INLINE void SET_SUB_ALPHA_INPUT(UINT8 **input, int code) +{ + switch (code & 0x7) { - y2 = clipy2-1; + case 0: *input = &combined_color.a; break; + case 1: *input = &texel0_color.a; break; + case 2: *input = &texel1_color.a; break; + case 3: *input = &prim_color.a; break; + case 4: *input = &shade_color.a; break; + case 5: *input = &env_color.a; break; + case 6: *input = &one_color.a; break; + case 7: *input = &zero_color.a; break; } +} - if (((other_modes >> 52) & 3) >= 2) +INLINE void SET_MUL_ALPHA_INPUT(UINT8 **input, int code) +{ + switch (code & 0x7) { - rect->dsdx >>= 2; - x2 += 1; - y2 += 1; + case 0: break;//TODO fatalerror("SET_MUL_ALPHA_INPUT: lod fraction\n"); break; + case 1: *input = &texel0_color.a; break; + case 2: *input = &texel1_color.a; break; + case 3: *input = &prim_color.a; break; + case 4: *input = &shade_color.a; break; + case 5: *input = &env_color.a; break; + case 6: break;//TODO fatalerror("SET_MUL_ALPHA_INPUT: primitive lod fraction\n"); break; + case 7: *input = &zero_color.a; break; } +} - t = rect->t << 5; // to .10 fixed - switch (tile[rect->tilenum].format) - { - case 0: // RGBA - { - switch (tile[rect->tilenum].size) - { - case PIXEL_SIZE_16BIT: - { - UINT16 *tc = (UINT16*)texture_cache; - for (j=y1; j < y2; j++) - { - index = j * fb_width; - tline = (tb/2) + ((t >> 10) * (twidth/2)); +INLINE COLOR COLOR_COMBINER(int cycle) +{ + COLOR c; + UINT32 r, g, b, a; - s = rect->s << 5; // to .10 fixed + r = (((int)((UINT8)(*combiner_rgbsub_a_r[cycle]) - (UINT8)(*combiner_rgbsub_b_r[cycle])) * + *combiner_rgbmul_r[cycle]) >> 8) + *combiner_rgbadd_r[cycle]; - for (i=x1; i < x2; i++) - { - fb[(index + i) ^ WORD_ADDR_XOR] = tc[(tline + (s >> 10)) ^ WORD_ADDR_XOR]; - s += rect->dsdx; + g = (((int)((UINT8)(*combiner_rgbsub_a_g[cycle]) - (UINT8)(*combiner_rgbsub_b_g[cycle])) * + *combiner_rgbmul_g[cycle]) >> 8) + *combiner_rgbadd_g[cycle]; - if (s > tile[rect->tilenum].sh << 8) - s = tile[rect->tilenum].sl << 8; - } - t += rect->dtdy; - if (t > tile[rect->tilenum].th << 8) - t = tile[rect->tilenum].tl << 8; - } - break; - } - case PIXEL_SIZE_32BIT: - { - UINT32 *tc = (UINT32*)texture_cache; - for (j=y1; j < y2; j++) - { - index = j * fb_width; - tline = (tb/4) + ((t >> 10) * (twidth / 4)); + b = (((int)((UINT8)(*combiner_rgbsub_a_b[cycle]) - (UINT8)(*combiner_rgbsub_b_b[cycle])) * + *combiner_rgbmul_b[cycle]) >> 8) + *combiner_rgbadd_b[cycle]; - s = rect->s << 5; // to .10 fixed + a = (((int)((UINT8)(*combiner_alphasub_a[cycle]) - (UINT8)(*combiner_alphasub_b[cycle])) * + *combiner_alphamul[cycle]) >> 8) + *combiner_alphaadd[cycle]; - for (i=x1; i < x2; i++) - { - UINT32 pix = tc[tline + (s >> 10)]; - UINT32 r = ((pix >> 24) >> 3) & 0x1f; - UINT32 g = ((pix >> 16) >> 3) & 0x1f; - UINT32 b = ((pix >> 8) >> 3) & 0x1f; - UINT32 a = ((pix >> 0) >> 3) & 0x1f; - if (a > 0) - { - fb[(index + i) ^ WORD_ADDR_XOR] = (r << 11) | (g << 6) | (b << 1); - } - s += rect->dsdx; + if (r > 255) r = 255; + if (g > 255) g = 255; + if (b > 255) b = 255; + if (a > 255) a = 255; + + c.r = r; c.g = g; c.b = b; c.a = a; + return c; +} - if (s > tile[rect->tilenum].sh << 8) - s = tile[rect->tilenum].sl << 8; - } - t += rect->dtdy; - if (t > tile[rect->tilenum].th << 8) - t = tile[rect->tilenum].tl << 8; - } - break; - } - //default: osd_die("RDP: texture_rectangle 16-bit RGBA: tile pixel size = %d\n", tile[rect->tilenum].size); break; + +INLINE void SET_BLENDER_INPUT(int cycle, int which, UINT8 **input_r, UINT8 **input_g, UINT8 **input_b, UINT8 **input_a, int a, int b) +{ + switch (a & 0x3) + { + case 0: + { + if (cycle == 0) + { + *input_r = &pixel_color.r; + *input_g = &pixel_color.g; + *input_b = &pixel_color.b; + } + else + { + *input_r = &blended_pixel_color.r; + *input_g = &blended_pixel_color.g; + *input_b = &blended_pixel_color.b; } break; } - case 2: // Color Index + case 1: { - switch (tile[rect->tilenum].size) - { - case PIXEL_SIZE_4BIT: - { - UINT8 *tc = (UINT8*)texture_cache; - for (j=y1; j < y2; j++) - { - index = j * fb_width; - tline = tb + ((t >> 10) * twidth); + //fatalerror("SET_BLENDER_INPUT: cycle %d, input A: memory color\n", cycle); + // TODO + *input_r = &memory_color.r; + *input_g = &memory_color.g; + *input_b = &memory_color.b; + break; + } - s = rect->s << 5; // to .10 fixed - for (i=x1; i < x2; i++) - { - UINT16 color; - UINT8 pix = tc[(tline + ((s >> 10) / 2)) ^ BYTE_ADDR_XOR]; - pix = ((s >> 10) & 1) ? (pix >> 0) & 0xf : (pix >> 4) & 0xf; - color = tlut[pix ^ WORD_ADDR_XOR]; - if (color & 1) - { - fb[(index + i) ^ WORD_ADDR_XOR] = color; - } + case 2: + { + *input_r = &blend_color.r; *input_g = &blend_color.g; *input_b = &blend_color.b; + break; + } - s += rect->dsdx; - if (s > tile[rect->tilenum].sh << 8) - s = tile[rect->tilenum].sl << 8; - } + case 3: + { + *input_r = &fog_color.r; *input_g = &fog_color.g; *input_b = &fog_color.b; + break; + } + } - t += rect->dtdy; - if (t > tile[rect->tilenum].th << 8) - t = tile[rect->tilenum].tl << 8; - } - break; - } - case PIXEL_SIZE_8BIT: - { - UINT8 *tc = (UINT8*)texture_cache; - for (j=y1; j < y2; j++) - { - UINT32 xor = 0; - index = j * fb_width; - tline = tb + ((t >> 10) * twidth); + if (which == 0) + { + switch (b & 0x3) + { + case 0: *input_a = &pixel_color.a; break; + case 1: *input_a = &one_color.a; break; + case 2: *input_a = &shade_color.a; break; + case 3: *input_a = &zero_color.a; break; + } + } + else + { + switch (b & 0x3) + { + case 0: *input_a = &inv_pixel_color.a; break; + case 1: *input_a = &memory_color.a; break; + case 2: *input_a = &one_color.a; break; + case 3: *input_a = &zero_color.a; break; + } + } +} - //xor = (t >> 10) & 1 ? 4 : 0; +static const UINT8 dither_matrix_4x4[16] = +{ + 0, 8, 2, 10, + 12, 4, 14, 6, + 3, 11, 1, 9, + 15, 7, 13, 5 +}; - s = rect->s << 5; // to .10 fixed - for (i=x1; i < x2; i++) - { - UINT8 pix = tc[(tline + (s >> 10)) ^ BYTE_ADDR_XOR ^ xor]; - UINT16 color = tlut[pix ^ WORD_ADDR_XOR]; - if (color & 1) - { - fb[(index + i) ^ WORD_ADDR_XOR] = color; - } +#define DITHER_RB(val,dith) ((((val) << 1) - ((val) >> 4) + ((val) >> 7) + (dith)) >> 1) +#define DITHER_G(val,dith) ((((val) << 2) - ((val) >> 4) + ((val) >> 6) + (dith)) >> 2) - s += rect->dsdx; - if (s > tile[rect->tilenum].sh << 8) - s = tile[rect->tilenum].sl << 8; - } +INLINE void BLENDER1_16(UINT16 *fb, COLOR c, int dith) +{ + int r, g, b; - t += rect->dtdy; - if (t > tile[rect->tilenum].th << 8) - t = tile[rect->tilenum].tl << 8; - } - break; - } + pixel_color.r = c.r; inv_pixel_color.r = 0xff - c.r; + pixel_color.g = c.g; inv_pixel_color.g = 0xff - c.g; + pixel_color.b = c.b; inv_pixel_color.b = 0xff - c.b; + pixel_color.a = c.a; inv_pixel_color.a = 0xff - c.a; - default: fatalerror("RDP: texture_rectangle 16-bit CI: tile pixel size = %d\n", tile[rect->tilenum].size); break; - } - break; - } - case 3: // IA - { - switch (tile[rect->tilenum].size) - { - case PIXEL_SIZE_8BIT: - { - UINT8 *tc = (UINT8*)texture_cache; - for (j=y1; j < y2; j++) - { - index = j * fb_width; - tline = tb + ((t >> 10) * twidth); - s = rect->s << 5; // to .10 fixed - for (i=x1; i < x2; i++) - { - UINT8 pix = tc[(tline + (s >> 10)) ^ BYTE_ADDR_XOR]; - UINT8 lum = (pix >> 4) << 1; - UINT8 alpha = (pix & 0xf); - if (alpha != 0) - { - UINT16 oldpix = fb[(index + i) ^ WORD_ADDR_XOR]; - UINT32 r = oldpix & 0xf800; - UINT32 g = oldpix & 0x07c0; - UINT32 b = oldpix & 0x003e; + if (other_modes.image_read_en) + { + UINT16 mem = *fb; + memory_color.r = ((mem >> 11) & 0x1f) << 3; + memory_color.g = ((mem >> 6) & 0x1f) << 3; + memory_color.b = ((mem >> 1) & 0x1f) << 3; + memory_color.a = 0; + } - r = (((lum << 11) * alpha) + (r * (15-alpha))) >> 4; - g = (((lum << 6) * alpha) + (g * (15-alpha))) >> 4; - b = (((lum << 1) * alpha) + (b * (15-alpha))) >> 4; + r = (((int)(*blender1a_r[0]) * (int)(*blender1b_a[0])) >> 8) + + (((int)(*blender2a_r[0]) * (int)(*blender2b_a[0])) >> 8); - fb[(index + i) ^ WORD_ADDR_XOR] = r | g | b; - } - s += rect->dsdx; - } - t += rect->dtdy; - } - break; - } + g = (((int)(*blender1a_g[0]) * (int)(*blender1b_a[0])) >> 8) + + (((int)(*blender2a_g[0]) * (int)(*blender2b_a[0])) >> 8); - case PIXEL_SIZE_16BIT: - { - UINT16 *tc = (UINT16*)texture_cache; - for (j=y1; j < y2; j++) - { - index = j * fb_width; - tline = (tb/2) + ((t >> 10) * (twidth/2)); + b = (((int)(*blender1a_b[0]) * (int)(*blender1b_a[0])) >> 8) + + (((int)(*blender2a_b[0]) * (int)(*blender2b_a[0])) >> 8); - s = rect->s << 5; // to .10 fixed - for (i=x1; i < x2; i++) - { - UINT16 pix = tc[(tline + (s >> 10)) ^ WORD_ADDR_XOR]; - UINT8 alpha = (pix >> 8); - UINT8 lum = (pix & 0xff); - if (alpha != 0) - { - UINT16 oldpix = fb[(index + i) ^ WORD_ADDR_XOR]; - UINT32 r = oldpix & 0xf800; - UINT32 g = oldpix & 0x07c0; - UINT32 b = oldpix & 0x003e; + //r = g = b = 0xff; - r = (((lum << 11) * alpha) + (r * (255-alpha))) >> 8; - g = (((lum << 6) * alpha) + (g * (255-alpha))) >> 8; - b = (((lum << 1) * alpha) + (b * (255-alpha))) >> 8; + if (r > 255) r = 255; + if (g > 255) g = 255; + if (b > 255) b = 255; - lum >>= 3; + if (other_modes.rgb_dither_sel != 3) + { + r = DITHER_RB(r, dith); + g = DITHER_G (g, dith); + b = DITHER_RB(b, dith); + } - fb[(index + i) ^ WORD_ADDR_XOR] = lum << 11 | lum << 6 | lum << 1;//r | g | b; - } - s += rect->dsdx; - } - t += rect->dtdy; - } - break; - } + if (c.a != 0) + { + *fb = ((r >> 3) << 11) | ((g >> 3) << 6) | ((b >> 3) << 1); + } +} - default: fatalerror("RDP: texture_rectangle 16-bit IA: tile pixel size = %d\n", tile[rect->tilenum].size); break; - } - break; - } +INLINE void BLENDER2_16(UINT16 *fb, COLOR c1, COLOR c2, int dith) +{ + int r, g, b; - case 4: // I - { - switch (tile[rect->tilenum].size) - { - case PIXEL_SIZE_4BIT: - { - UINT8 *tc = (UINT8*)texture_cache; - for (j=y1; j < y2; j++) - { - index = j * fb_width; - tline = tb + ((t >> 10) * twidth); + pixel_color.r = c1.r; inv_pixel_color.r = 0xff - c1.r; + pixel_color.g = c1.g; inv_pixel_color.g = 0xff - c1.g; + pixel_color.b = c1.b; inv_pixel_color.b = 0xff - c1.b; + pixel_color.a = c1.a; inv_pixel_color.a = 0xff - c1.a; - s = rect->s << 5; // to .10 fixed - for (i=x1; i < x2; i++) - { - UINT8 lum = tc[(tline + ((s >> 10) / 2)) ^ BYTE_ADDR_XOR]; - lum = ((s >> 10) & 1) ? ((lum >> 0) & 0xf) : ((lum >> 4) & 0xf); - lum <<= 1; - fb[(index + i) ^ WORD_ADDR_XOR] = lum << 11 | lum << 6 | lum << 1; + if (other_modes.image_read_en) + { + UINT16 mem = *fb; + memory_color.r = ((mem >> 11) & 0x1f) << 3; + memory_color.g = ((mem >> 6) & 0x1f) << 3; + memory_color.b = ((mem >> 1) & 0x1f) << 3; + memory_color.a = 0; + } - s += rect->dsdx; + r = (((int)(*blender1a_r[0]) * (int)(*blender1b_a[0])) >> 8) + + (((int)(*blender2a_r[0]) * (int)(*blender2b_a[0])) >> 8); - if (s > tile[rect->tilenum].sh << 8) - s = tile[rect->tilenum].sl << 8; - } - t += rect->dtdy; + g = (((int)(*blender1a_g[0]) * (int)(*blender1b_a[0])) >> 8) + + (((int)(*blender2a_g[0]) * (int)(*blender2b_a[0])) >> 8); - if (t > tile[rect->tilenum].th << 8) - t = tile[rect->tilenum].tl << 8; - } - break; - } + b = (((int)(*blender1a_b[0]) * (int)(*blender1b_a[0])) >> 8) + + (((int)(*blender2a_b[0]) * (int)(*blender2b_a[0])) >> 8); - default: fatalerror("RDP: texture_rectangle 16-bit I: tile pixel size = %d\n", tile[rect->tilenum].size); break; - } - break; - } + blended_pixel_color.r = r; + blended_pixel_color.g = g; + blended_pixel_color.b = b; + + pixel_color.r = c2.r; inv_pixel_color.r = 0xff - c2.r; + pixel_color.g = c2.g; inv_pixel_color.g = 0xff - c2.g; + pixel_color.b = c2.b; inv_pixel_color.b = 0xff - c2.b; + pixel_color.a = c2.a; inv_pixel_color.a = 0xff - c2.a; + + r = (((int)(*blender1a_r[1]) * (int)(*blender1b_a[1])) >> 8) + + (((int)(*blender2a_r[1]) * (int)(*blender2b_a[1])) >> 8); + + g = (((int)(*blender1a_g[1]) * (int)(*blender1b_a[1])) >> 8) + + (((int)(*blender2a_g[1]) * (int)(*blender2b_a[1])) >> 8); + + b = (((int)(*blender1a_b[1]) * (int)(*blender1b_a[1])) >> 8) + + (((int)(*blender2a_b[1]) * (int)(*blender2b_a[1])) >> 8); + + r = c1.r; + g = c1.g; + b = c1.b; + + if (r > 255) r = 255; + if (g > 255) g = 255; + if (b > 255) b = 255; + + if (other_modes.rgb_dither_sel != 3) + { + r = DITHER_RB(r, dith); + g = DITHER_G (g, dith); + b = DITHER_RB(b, dith); + } - default: fatalerror("RDP: texture_rectangle 16-bit: tile format = %d\n", tile[rect->tilenum].format); break; + { + *fb = ((r >> 3) << 11) | ((g >> 3) << 6) | ((b >> 3) << 1); } } -static void fill_rectangle_32bit(RECTANGLE *rect) +/*****************************************************************************/ + +static void fill_rectangle_16bit(RECTANGLE *rect) { - UINT32 *fb = (UINT32*)&rdram[(fb_address / 4)]; + UINT16 *fb = (UINT16*)&rdram[(fb_address / 4)]; int index, i, j; int x1 = rect->xh / 4; int x2 = rect->xl / 4; int y1 = rect->yh / 4; int y2 = rect->yl / 4; - - // TODO: clip - - for (j=y1; j <= y2; j++) - { - index = j * fb_width; - for (i=x1; i <= x2; i++) - { - fb[index + i] = fill_color; - } - } -} - -static void texture_rectangle_32bit(TEX_RECTANGLE *rect) -{ - UINT32 *fb = (UINT32*)&rdram[(fb_address / 4)]; - int index, i, j, tline; - int x1, x2, y1, y2; int clipx1, clipx2, clipy1, clipy2; - UINT32 tb = tile[rect->tilenum].tmem; - UINT32 twidth = tile[rect->tilenum].line; - - UINT32 s = 0; - UINT32 t = 0; - - x1 = rect->xh / 4; - x2 = rect->xl / 4; - y1 = rect->yh / 4; - y2 = rect->yl / 4; + UINT16 fill_color1, fill_color2; + fill_color1 = (fill_color >> 16) & 0xffff; + fill_color2 = (fill_color >> 0) & 0xffff; + // TODO: clip clipx1 = clip.xh / 4; clipx2 = clip.xl / 4; clipy1 = clip.yh / 4; @@ -586,12 +723,10 @@ static void texture_rectangle_32bit(TEX_RECTANGLE *rect) // clip if (x1 < clipx1) { - s += ((clipx1 - x1) * rect->dsdx) >> 5; x1 = clipx1; } if (y1 < clipy1) { - t += ((clipy1 - y1) * rect->dtdy) >> 5; y1 = clipy1; } if (x2 >= clipx2) @@ -603,206 +738,1680 @@ static void texture_rectangle_32bit(TEX_RECTANGLE *rect) y2 = clipy2-1; } - if (((other_modes >> 52) & 3) >= 2) + if (other_modes.cycle_type == CYCLE_TYPE_FILL) { - rect->dsdx >>= 2; // 4 pixels at a time in fill and copy modes - x2 += 1; - y2 += 1; + for (j=y1; j <= y2; j++) + { + index = j * fb_width; + for (i=x1; i <= x2; i++) + { + fb[(index + i) ^ 1] = (i & 1) ? fill_color1 : fill_color2; + } + } } - - t = rect->t << 5; // to .10 fixed - - - switch (tile[rect->tilenum].format) + else if (other_modes.cycle_type == CYCLE_TYPE_1) { - case 0: // RGBA + shade_color.r = prim_color.r; + shade_color.g = prim_color.g; + shade_color.b = prim_color.b; + shade_color.a = prim_color.a; + + for (j=y1; j <= y2; j++) { - switch (tile[rect->tilenum].size) + index = j * fb_width; + for (i=x1; i <= x2; i++) { - case PIXEL_SIZE_16BIT: + COLOR c = COLOR_COMBINER(0); + + //BLENDER1_16(&fb[(index + i) ^ 1], c); { - UINT16 *tc = (UINT16*)texture_cache; - for (j=y1; j < y2; j++) - { - index = j * fb_width; - tline = (tb/2) + ((t >> 10) * (twidth / 2)); + int dith = dither_matrix_4x4[(((j) & 3) << 2) + ((i^WORD_ADDR_XOR) & 3)]; + BLENDER1_16(&fb[(index + i) ^ WORD_ADDR_XOR], c, dith); + } + } + } + } + else if (other_modes.cycle_type == CYCLE_TYPE_2) + { + shade_color.r = prim_color.r; + shade_color.g = prim_color.g; + shade_color.b = prim_color.b; + shade_color.a = prim_color.a; - s = rect->s << 5; // to .10 fixed + for (j=y1; j <= y2; j++) + { + index = j * fb_width; + for (i=x1; i <= x2; i++) + { + COLOR c1 = COLOR_COMBINER(0); + COLOR c2 = COLOR_COMBINER(1); - for (i=x1; i < x2; i++) - { - UINT32 r, g, b; - UINT16 color = tc[(tline + (s >> 10)) ^ WORD_ADDR_XOR]; - r = ((color >> 11) & 0x1f); - r = (r << 3) | (r >> 5); - g = ((color >> 6) & 0x1f); - g = (g << 3) | (g >> 5); - b = ((color >> 1) & 0x1f); - b = (b << 3) | (b >> 5); - - if (color & 0x1) - { - fb[index + i] = (r << 16) | (g << 8) | b; - } + //BLENDER1_16(&fb[(index + i) ^ 1], c); + { + int dith = dither_matrix_4x4[(((j) & 3) << 2) + ((i^WORD_ADDR_XOR) & 3)]; + BLENDER2_16(&fb[(index + i) ^ WORD_ADDR_XOR], c1, c2, dith); + } + } + } + } + else + { + fatalerror("fill_rectangle_16bit: cycle type copy"); + } +} + +#define XOR_SWAP_BYTE 4 +#define XOR_SWAP_WORD 2 +#define XOR_SWAP_DWORD 1 + +INLINE void FETCH_TEXEL(COLOR *color, int s, int t, UINT32 twidth, UINT32 tformat, UINT32 tsize, UINT32 tbase) +{ + if (t < 0) t = 0; + if (s < 0) s = 0; + + switch (tformat) + { + case 0: // RGBA + { + switch (tsize) + { + case 0: break; + case 1: break; // FIXME?: Extreme-G 2 does this + case PIXEL_SIZE_16BIT: + { + UINT16 *tc = (UINT16*)texture_cache; + int taddr = ((tbase/2) + ((t) * (twidth/2)) + (s)) ^ ((t & 1) ? XOR_SWAP_WORD : 0); + UINT16 c = tc[taddr ^ WORD_ADDR_XOR]; + + color->r = ((c >> 11) & 0x1f) << 3; + color->g = ((c >> 6) & 0x1f) << 3; + color->b = ((c >> 1) & 0x1f) << 3; + color->a = (c & 1) ? 0xff : 0; + break; + } + case PIXEL_SIZE_32BIT: + { + UINT32 *tc = (UINT32*)texture_cache; + int taddr = ((tbase/4) + ((t) * (twidth/2)) + (s)) ^ ((t & 1) ? XOR_SWAP_DWORD : 0); + UINT32 c = tc[taddr]; + + color->r = ((c >> 24) & 0xff); + color->g = ((c >> 16) & 0xff); + color->b = ((c >> 8) & 0xff); + color->a = ((c >> 0) & 0xff); + break; + } + default: fatalerror("FETCH_TEXEL: unknown RGBA texture size %d\n", tsize); break; + } + break; + } + case 2: // Color Index + { + switch (tsize) + { + case PIXEL_SIZE_4BIT: + { + UINT8 *tc = (UINT8*)texture_cache; + int taddr = (tbase + ((t) * twidth) + ((s) / 2)) ^ ((t & 1) ? XOR_SWAP_BYTE : 0); + UINT8 p = ((s) & 1) ? (tc[taddr ^ BYTE_ADDR_XOR] & 0xf) : (tc[taddr ^ BYTE_ADDR_XOR] >> 4); + UINT16 c = tlut[p ^ WORD_ADDR_XOR]; + + if (other_modes.tlut_type == 0) + { + color->r = ((c >> 11) & 0x1f) << 3; + color->g = ((c >> 6) & 0x1f) << 3; + color->b = ((c >> 1) & 0x1f) << 3; + color->a = (c & 1) ? 0xff : 0; + } + else + { + color->r = color->g = color->b = (c >> 8) & 0xff; + color->a = c & 0xff; + } + break; + } + case PIXEL_SIZE_8BIT: + { + UINT8 *tc = (UINT8*)texture_cache; + int taddr = (tbase + ((t) * twidth) + ((s))) ^ ((t & 1) ? XOR_SWAP_BYTE : 0); + UINT8 p = tc[taddr ^ BYTE_ADDR_XOR]; + UINT16 c = tlut[p ^ WORD_ADDR_XOR]; + + if (other_modes.tlut_type == 0) + { + color->r = ((c >> 11) & 0x1f) << 3; + color->g = ((c >> 6) & 0x1f) << 3; + color->b = ((c >> 1) & 0x1f) << 3; + color->a = (c & 1) ? 0xff : 0; + } + else + { + color->r = color->g = color->b = (c >> 8) & 0xff; + color->a = c & 0xff; + } + break; + } + case 2: break; // FIXME?: Clay Fighter Sculptor's Cut does this.. + default: fatalerror("FETCH_TEXEL: unknown CI texture size %d\n", tsize); break; + } + break; + } + case 3: // Intensity + Alpha + { + switch (tsize) + { + case PIXEL_SIZE_4BIT: + { + UINT8 *tc = (UINT8*)texture_cache; + int taddr = (tbase + ((t) * twidth) + ((s) / 2)) ^ ((t & 1) ? XOR_SWAP_BYTE : 0); + UINT8 p = ((s) & 1) ? (tc[taddr ^ BYTE_ADDR_XOR] & 0xf) : (tc[taddr ^ BYTE_ADDR_XOR] >> 4); + UINT8 i = ((p & 0xe) << 4) | ((p & 0xe) << 1) | (p & 0xe >> 2); + + color->r = i; + color->g = i; + color->b = i; + color->a = (p & 0x1) ? 0xff : 0; + break; + } + case PIXEL_SIZE_8BIT: + { + UINT8 *tc = (UINT8*)texture_cache; + int taddr = (tbase + ((t) * twidth) + ((s))) ^ ((t & 1) ? XOR_SWAP_BYTE : 0); + UINT8 p = tc[taddr ^ BYTE_ADDR_XOR]; + UINT8 i = (p >> 4) | (p & 0xf0); + + color->r = i; + color->g = i; + color->b = i; + color->a = (p & 0xf) | ((p << 4) & 0xf0); + break; + } + case PIXEL_SIZE_16BIT: + { + UINT16 *tc = (UINT16*)texture_cache; + int taddr = (tbase + ((t) * (twidth/2)) + (s)) ^ ((t & 1) ? XOR_SWAP_WORD : 0); + UINT16 c = tc[taddr ^ WORD_ADDR_XOR]; + UINT8 i = (c >> 8); + + color->r = i; + color->g = i; + color->b = i; + color->a = c & 0xff; + break; + } + default: fatalerror("FETCH_TEXEL: unknown IA texture size %d\n", tsize); break; + } + break; + } + case 4: // Intensity + { + switch (tsize) + { + case PIXEL_SIZE_4BIT: + { + UINT8 *tc = (UINT8*)texture_cache; + int taddr = (tbase + ((t) * twidth) + ((s) / 2)) ^ ((t & 1) ? XOR_SWAP_BYTE : 0); + UINT8 c = ((s) & 1) ? (tc[taddr ^ BYTE_ADDR_XOR] & 0xf) : (tc[taddr ^ BYTE_ADDR_XOR] >> 4); + c |= (c << 4); + + color->r = c; + color->g = c; + color->b = c; + color->a = c; + break; + } + case PIXEL_SIZE_8BIT: + { + UINT8 *tc = (UINT8*)texture_cache; + int taddr = (tbase + ((t) * twidth) + ((s))) ^ ((t & 1) ? XOR_SWAP_BYTE : 0); + UINT8 c = tc[taddr ^ BYTE_ADDR_XOR]; + + color->r = c; + color->g = c; + color->b = c; + color->a = c; + break; + } + default: fatalerror("FETCH_TEXEL: unknown I texture size %d\n", tsize); break; + } + break; + } + default: + { + fatalerror("FETCH_TEXEL: unknown texture format %d\n", tformat); + break; + } + } +} + +#if 1 +#define TEXTURE_PIPELINE(TEX, SSS, SST, NOBILINEAR) \ +do \ +{ \ + if (other_modes.sample_type && !NOBILINEAR) \ + { \ + COLOR t0, t1, t2, t3; \ + int sss1, sst1, sss2, sst2; \ + \ + /* bilinear */ \ + \ + sss1 = (SSS >> 10) - (tsl >> 2); \ + sss2 = sss1 + 1; \ + \ + sst1 = (SST >> 10) - (ttl >> 2); \ + sst2 = sst1 + 1; \ + \ + CLAMP(sss1, sst1); \ + CLAMP(sss2, sst2); \ + \ + FETCH_TEXEL(&t0, sss1, sst1, twidth, tformat, tsize, tbase); \ + FETCH_TEXEL(&t1, sss2, sst1, twidth, tformat, tsize, tbase); \ + FETCH_TEXEL(&t2, sss1, sst2, twidth, tformat, tsize, tbase); \ + FETCH_TEXEL(&t3, sss2, sst2, twidth, tformat, tsize, tbase); \ + \ + TEX.r = (((( (t0.r * (0x3ff - (SSS & 0x3ff))) + (t1.r * ((SSS & 0x3ff))) ) >> 10) * (0x3ff - (SST & 0x3ff))) >> 10) + \ + (((( (t2.r * (0x3ff - (SSS & 0x3ff))) + (t3.r * ((SSS & 0x3ff))) ) >> 10) * ((SST & 0x3ff))) >> 10); \ + \ + TEX.g = (((( (t0.g * (0x3ff - (SSS & 0x3ff))) + (t1.g * ((SSS & 0x3ff))) ) >> 10) * (0x3ff - (SST & 0x3ff))) >> 10) + \ + (((( (t2.g * (0x3ff - (SSS & 0x3ff))) + (t3.g * ((SSS & 0x3ff))) ) >> 10) * ((SST & 0x3ff))) >> 10); \ + \ + TEX.b = (((( (t0.b * (0x3ff - (SSS & 0x3ff))) + (t1.b * ((SSS & 0x3ff))) ) >> 10) * (0x3ff - (SST & 0x3ff))) >> 10) + \ + (((( (t2.b * (0x3ff - (SSS & 0x3ff))) + (t3.b * ((SSS & 0x3ff))) ) >> 10) * ((SST & 0x3ff))) >> 10); \ + \ + TEX.a = (((( (t0.a * (0x3ff - (SSS & 0x3ff))) + (t1.a * ((SSS & 0x3ff))) ) >> 10) * (0x3ff - (SST & 0x3ff))) >> 10) + \ + (((( (t2.a * (0x3ff - (SSS & 0x3ff))) + (t3.a * ((SSS & 0x3ff))) ) >> 10) * ((SST & 0x3ff))) >> 10); \ + } \ + else \ + { \ + int sss1, sst1; \ + sss1 = (SSS >> 10) - (tsl >> 2); \ + if ((SSS & 0x3ff) >= 0x200) sss1++; \ + \ + sst1 = (SST >> 10) - (ttl >> 2); \ + if ((SST & 0x3ff) >= 0x200) sst1++; \ + \ + CLAMP(sss1, sst1); \ + \ + /* point sample */ \ + FETCH_TEXEL(&TEX, sss1, sst1, twidth, tformat, tsize, tbase); \ + } \ +} \ +while(0) +#endif + +// This is the implementation with 3-sample bilinear filtering, which should be more correct, but not yet working properly +// TODO: check the correct texel samples and weighting values + +#if 0 +#define TEXTURE_PIPELINE(TEX, SSS, SST, NOBILINEAR) \ +do \ +{ \ + if (other_modes.sample_type && !NOBILINEAR) \ + { \ + COLOR t0, t1, t2; \ + int sss1, sst1, sss2, sst2; \ + \ + /* bilinear */ \ + \ + sss1 = (SSS >> 10) - (tsl >> 2); \ + sss2 = sss1 + 1; \ + \ + sst1 = (SST >> 10) - (ttl >> 2); \ + sst2 = sst1 + 1; \ + \ + CLAMP(sss1, sst1); \ + CLAMP(sss2, sst2); \ + \ + FETCH_TEXEL(&t0, sss1, sst1, twidth, tformat, tsize, tbase); \ + FETCH_TEXEL(&t1, sss2, sst1, twidth, tformat, tsize, tbase); \ + FETCH_TEXEL(&t2, sss2, sst2, twidth, tformat, tsize, tbase); \ + \ + TEX.r = (((( (t0.r * (0x3ff - (SSS & 0x3ff))) + (t1.r * ((SSS & 0x3ff))) ) >> 10) * (0x3ff - (SST & 0x3ff))) >> 10) + \ + (( (t2.r) * ((SST & 0x3ff))) >> 10); \ + \ + TEX.g = (((( (t0.g * (0x3ff - (SSS & 0x3ff))) + (t1.g * ((SSS & 0x3ff))) ) >> 10) * (0x3ff - (SST & 0x3ff))) >> 10) + \ + (( (t2.g) * ((SST & 0x3ff))) >> 10); \ + \ + TEX.b = (((( (t0.b * (0x3ff - (SSS & 0x3ff))) + (t1.b * ((SSS & 0x3ff))) ) >> 10) * (0x3ff - (SST & 0x3ff))) >> 10) + \ + (( (t2.b) * ((SST & 0x3ff))) >> 10); \ + \ + TEX.a = (((( (t0.a * (0x3ff - (SSS & 0x3ff))) + (t1.a * ((SSS & 0x3ff))) ) >> 10) * (0x3ff - (SST & 0x3ff))) >> 10) + \ + (( (t2.a) * ((SST & 0x3ff))) >> 10); \ + } \ + else \ + { \ + int sss1, sst1; \ + sss1 = (SSS >> 10) - (tsl >> 2); \ + if ((SSS & 0x3ff) >= 0x200) sss1++; \ + \ + sst1 = (SST >> 10) - (ttl >> 2); \ + if ((SST & 0x3ff) >= 0x200) sst1++; \ + \ + CLAMP(sss1, sst1); \ + \ + /* point sample */ \ + FETCH_TEXEL(&TEX, sss1, sst1, twidth, tformat, tsize, tbase); \ + } \ +} \ +while(0) +#endif + +#define TEXTURE_PIPELINE1(SSS, SST, NOBILINEAR) \ +do \ +{ \ + TEXTURE_PIPELINE(texel0_color, SSS, SST, NOBILINEAR); \ +} \ +while(0) + +#define TEXTURE_PIPELINE2(SSS, SST, NOBILINEAR) \ +do \ +{ \ + TEXTURE_PIPELINE(texel0_color, SSS, SST, NOBILINEAR); \ + TEXTURE_PIPELINE(texel1_color, SSS, SST, NOBILINEAR); \ +} \ +while(0) + + + +static void texture_rectangle_16bit(TEX_RECTANGLE *rect) +{ + UINT16 *fb = (UINT16*)&rdram[(fb_address / 4)]; + int i, j; + int x1, x2, y1, y2; + int tsl, tsh, ttl, tth; + int s, t; + int twidth, tformat, tsize, tbase; + int clamp_s, clamp_t, mask_s, mask_t, mirror_s, mirror_t; + int clipx1, clipx2, clipy1, clipy2; + + x1 = (rect->xh / 4); + x2 = (rect->xl / 4); + y1 = (rect->yh / 4); + y2 = (rect->yl / 4); + + if (other_modes.cycle_type == CYCLE_TYPE_FILL || other_modes.cycle_type == CYCLE_TYPE_COPY) + { + rect->dsdx /= 4; + x2 += 1; + y2 += 1; + } + + clipx1 = clip.xh / 4; + clipx2 = clip.xl / 4; + clipy1 = clip.yh / 4; + clipy2 = clip.yl / 4; + + // clip + if (x1 < clipx1) + { + x1 = clipx1; + } + if (y1 < clipy1) + { + y1 = clipy1; + } + if (x2 >= clipx2) + { + x2 = clipx2-1; + } + if (y2 >= clipy2) + { + y2 = clipy2-1; + } + + tsl = tile[rect->tilenum].sl; + tsh = tile[rect->tilenum].sh; + ttl = tile[rect->tilenum].tl; + tth = tile[rect->tilenum].th; + + twidth = tile[rect->tilenum].line; + tformat = tile[rect->tilenum].format; + tsize = tile[rect->tilenum].size; + tbase = tile[rect->tilenum].tmem; + + // FIXME?: clamping breaks at least Rampage World Tour + clamp_t = 0; //tile[rect->tilenum].ct; + clamp_s = 0; //tile[rect->tilenum].cs; + + mirror_t = tile[rect->tilenum].mt; + mirror_s = tile[rect->tilenum].ms; + mask_t = tile[rect->tilenum].mask_t; + mask_s = tile[rect->tilenum].mask_s; + + t = (int)(rect->t) << 5; + + if (other_modes.cycle_type == CYCLE_TYPE_1 || other_modes.cycle_type == CYCLE_TYPE_2) + { + } + + if (other_modes.cycle_type == CYCLE_TYPE_1) + { + for (j = y1; j < y2; j++) + { + int fb_index = j * fb_width; + + s = (int)(rect->s) << 5; + + for (i = x1; i < x2; i++) + { + COLOR c; + + //ss = (s >> 10) - (tsl >> 2); + //if ((s & 0x3ff) >= 0x200) ss++; + //st = (t >> 10) - (ttl >> 2); + //if ((t & 0x3ff) >= 0x200) st++; + + //CLAMP(ss, st); + //FETCH_TEXEL(&texel0_color, ss, st, twidth, tformat, tsize, tbase); + + TEXTURE_PIPELINE1(s, t, (rect->dsdx == (1 << 10)) && (rect->dtdy == (1 << 10))); + + c = COLOR_COMBINER(0); + + { + int dith = dither_matrix_4x4[(((j) & 3) << 2) + ((i^WORD_ADDR_XOR) & 3)]; + BLENDER1_16(&fb[(fb_index + i) ^ WORD_ADDR_XOR], c, dith); + } + + s += rect->dsdx; + } + + t += rect->dtdy; + } + } + else if (other_modes.cycle_type == CYCLE_TYPE_2) + { + for (j = y1; j < y2; j++) + { + int fb_index = j * fb_width; + + s = (int)(rect->s) << 5; + + for (i = x1; i < x2; i++) + { + COLOR c1, c2; + + //ss = (s >> 10) - (tsl >> 2); + //if ((s & 0x3ff) >= 0x200) ss++; + //st = (t >> 10) - (ttl >> 2); + //if ((t & 0x3ff) >= 0x200) st++; + + //CLAMP(ss, st); + //FETCH_TEXEL(&texel0_color, ss, st, twidth, tformat, tsize, tbase); + //FETCH_TEXEL(&texel1_color, ss, st, twidth, tformat, tsize, tbase); + + TEXTURE_PIPELINE2(s, t, (rect->dsdx == (1 << 10)) && (rect->dtdy == (1 << 10))); + + c1 = COLOR_COMBINER(0); + c2 = COLOR_COMBINER(1); + + //BLENDER2_16(&fb[(fb_index + i) ^ WORD_ADDR_XOR], c1, c2); + { + int dith = dither_matrix_4x4[(((j) & 3) << 2) + ((i^WORD_ADDR_XOR) & 3)]; + BLENDER2_16(&fb[(fb_index + i) ^ WORD_ADDR_XOR], c1, c2, dith); + } + + s += rect->dsdx; + } + + t += rect->dtdy; + } + } + else if (other_modes.cycle_type == CYCLE_TYPE_COPY) + { + for (j = y1; j < y2; j++) + { + int fb_index = j * fb_width; + + s = (int)(rect->s) << 5; + + for (i = x1; i < x2; i++) + { + /* + if (clamp_s) + { + if (s < (tsl << 8)) s = (tsl << 8); + if (s > (tsh << 8)) s = (tsh << 8); + } + if (clamp_t) + { + if (t < (ttl << 8)) t = (ttl << 8); + if (t > (tth << 8)) t = (tth << 8); + } + if (mask_s) + { + s &= (((UINT32)(0xffffffff) >> (32-mask_s)) << 10) | 0x3ff; + } + if (mask_t) + { + t &= (((UINT32)(0xffffffff) >> (32-mask_t)) << 10) | 0x3ff; + } + + FETCH_TEXEL(&c, (s-tile[rect->tilenum].sl) >> 10, (t-tile[rect->tilenum].tl) >> 10, twidth, tformat, tsize, tbase); + */ + //ss = (s >> 10) - (tsl >> 2); + //if ((s & 0x3ff) >= 0x200) ss++; + //st = (t >> 10) - (ttl >> 2); + //if ((t & 0x3ff) >= 0x200) st++; + + //CLAMP(ss, st); + //FETCH_TEXEL(&c, ss, st, twidth, tformat, tsize, tbase); + + TEXTURE_PIPELINE1(s, t, (rect->dsdx == (1 << 10)) && (rect->dtdy == (1 << 10))); + + if (texel0_color.a != 0) + { + fb[(fb_index + i) ^ WORD_ADDR_XOR] = ((texel0_color.r >> 3) << 11) | ((texel0_color.g >> 3) << 6) | ((texel0_color.b >> 3) << 1); + } + + s += rect->dsdx; + } + + t += rect->dtdy; + } + } + else + { + fatalerror("texture_rectangle_16bit: unknown cycle type %d\n", other_modes.cycle_type); + } +} + +/*****************************************************************************/ + +INLINE void BLENDER1_32(UINT32 *fb, COLOR c) +{ + int r, g, b; + + pixel_color.r = c.r; inv_pixel_color.r = 0xff - c.r; + pixel_color.g = c.g; inv_pixel_color.g = 0xff - c.g; + pixel_color.b = c.b; inv_pixel_color.b = 0xff - c.b; + pixel_color.a = c.a; inv_pixel_color.a = 0xff - c.a; + + if (other_modes.image_read_en) + { + UINT32 mem = *fb; + memory_color.r = ((mem >> 16) & 0xff); + memory_color.g = ((mem >> 8) & 0xff); + memory_color.b = ((mem >> 0) & 0xff); + memory_color.a = 0; + } + + r = (((int)(*blender1a_r[0]) * (int)(*blender1b_a[0])) >> 8) + + (((int)(*blender2a_r[0]) * (int)(*blender2b_a[0])) >> 8); + + g = (((int)(*blender1a_g[0]) * (int)(*blender1b_a[0])) >> 8) + + (((int)(*blender2a_g[0]) * (int)(*blender2b_a[0])) >> 8); + + b = (((int)(*blender1a_b[0]) * (int)(*blender1b_a[0])) >> 8) + + (((int)(*blender2a_b[0]) * (int)(*blender2b_a[0])) >> 8); + + //r = g = b = 0xff; + + if (r > 255) r = 255; + if (g > 255) g = 255; + if (b > 255) b = 255; + + *fb = (r << 16) | (g << 8) | b; +} + +INLINE void BLENDER2_32(UINT32 *fb, COLOR c1, COLOR c2) +{ + int r, g, b; + + pixel_color.r = c1.r; inv_pixel_color.r = 0xff - c1.r; + pixel_color.g = c1.g; inv_pixel_color.g = 0xff - c1.g; + pixel_color.b = c1.b; inv_pixel_color.b = 0xff - c1.b; + pixel_color.a = c1.a; inv_pixel_color.a = 0xff - c1.a; + + if (other_modes.image_read_en) + { + UINT32 mem = *fb; + memory_color.r = ((mem >> 16) & 0xff); + memory_color.g = ((mem >> 8) & 0xff); + memory_color.b = ((mem >> 0) & 0xff); + memory_color.a = 0; + } + + r = (((int)(*blender1a_r[0]) * (int)(*blender1b_a[0])) >> 8) + + (((int)(*blender2a_r[0]) * (int)(*blender2b_a[0])) >> 8); + + g = (((int)(*blender1a_g[0]) * (int)(*blender1b_a[0])) >> 8) + + (((int)(*blender2a_g[0]) * (int)(*blender2b_a[0])) >> 8); + + b = (((int)(*blender1a_b[0]) * (int)(*blender1b_a[0])) >> 8) + + (((int)(*blender2a_b[0]) * (int)(*blender2b_a[0])) >> 8); + + blended_pixel_color.r = r; + blended_pixel_color.g = g; + blended_pixel_color.b = b; + + pixel_color.r = c2.r; inv_pixel_color.r = 0xff - c2.r; + pixel_color.g = c2.g; inv_pixel_color.g = 0xff - c2.g; + pixel_color.b = c2.b; inv_pixel_color.b = 0xff - c2.b; + pixel_color.a = c2.a; inv_pixel_color.a = 0xff - c2.a; + + r = (((int)(*blender1a_r[1]) * (int)(*blender1b_a[1])) >> 8) + + (((int)(*blender2a_r[1]) * (int)(*blender2b_a[1])) >> 8); + + g = (((int)(*blender1a_g[1]) * (int)(*blender1b_a[1])) >> 8) + + (((int)(*blender2a_g[1]) * (int)(*blender2b_a[1])) >> 8); + + b = (((int)(*blender1a_b[1]) * (int)(*blender1b_a[1])) >> 8) + + (((int)(*blender2a_b[1]) * (int)(*blender2b_a[1])) >> 8); + + if (r > 255) r = 255; + if (g > 255) g = 255; + if (b > 255) b = 255; + + *fb = (c1.r << 16) | (c1.g << 8) | c1.b; +} + +static void fill_rectangle_32bit(RECTANGLE *rect) +{ + UINT32 *fb = (UINT32*)&rdram[(fb_address / 4)]; + int index, i, j; + int x1 = rect->xh / 4; + int x2 = rect->xl / 4; + int y1 = rect->yh / 4; + int y2 = rect->yl / 4; + int clipx1, clipx2, clipy1, clipy2; + + // TODO: clip + clipx1 = clip.xh / 4; + clipx2 = clip.xl / 4; + clipy1 = clip.yh / 4; + clipy2 = clip.yl / 4; + + // clip + if (x1 < clipx1) + { + x1 = clipx1; + } + if (y1 < clipy1) + { + y1 = clipy1; + } + if (x2 >= clipx2) + { + x2 = clipx2-1; + } + if (y2 >= clipy2) + { + y2 = clipy2-1; + } + + if (other_modes.cycle_type == CYCLE_TYPE_FILL) + { + for (j=y1; j <= y2; j++) + { + index = j * fb_width; + for (i=x1; i <= x2; i++) + { + fb[(index + i) ^ 1] = fill_color; + } + } + } + else if (other_modes.cycle_type == CYCLE_TYPE_1) + { + shade_color.r = prim_color.r; + shade_color.g = prim_color.g; + shade_color.b = prim_color.b; + shade_color.a = prim_color.a; + + for (j=y1; j <= y2; j++) + { + index = j * fb_width; + for (i=x1; i <= x2; i++) + { + COLOR c = COLOR_COMBINER(0); + + BLENDER1_32(&fb[(index + i)], c); + } + } + } + else if (other_modes.cycle_type == CYCLE_TYPE_2) + { + shade_color.r = prim_color.r; + shade_color.g = prim_color.g; + shade_color.b = prim_color.b; + shade_color.a = prim_color.a; + + for (j=y1; j <= y2; j++) + { + index = j * fb_width; + for (i=x1; i <= x2; i++) + { + COLOR c1 = COLOR_COMBINER(0); + COLOR c2 = COLOR_COMBINER(1); + + BLENDER2_32(&fb[(index + i)], c1, c2); + } + } + } + else + { + fatalerror("fill_rectangle_32bit: cycle type copy"); + } +} + +static void texture_rectangle_32bit(TEX_RECTANGLE *rect) +{ + UINT32 *fb = (UINT32*)&rdram[(fb_address / 4)]; + int i, j; + int x1, x2, y1, y2; + int tsl, tsh, ttl, tth; + int s, t; + int twidth, tformat, tsize, tbase; + int clamp_s, clamp_t, mask_s, mask_t, mirror_s, mirror_t; + int clipx1, clipx2, clipy1, clipy2; + + x1 = (rect->xh / 4); + x2 = (rect->xl / 4); + y1 = (rect->yh / 4); + y2 = (rect->yl / 4); + + if (other_modes.cycle_type == CYCLE_TYPE_FILL || other_modes.cycle_type == CYCLE_TYPE_COPY) + { + rect->dsdx /= 4; + x2 += 1; + y2 += 1; + } + + clipx1 = clip.xh / 4; + clipx2 = clip.xl / 4; + clipy1 = clip.yh / 4; + clipy2 = clip.yl / 4; + + // clip + if (x1 < clipx1) + { + x1 = clipx1; + } + if (y1 < clipy1) + { + y1 = clipy1; + } + if (x2 >= clipx2) + { + x2 = clipx2-1; + } + if (y2 >= clipy2) + { + y2 = clipy2-1; + } - s += rect->dsdx; + tsl = tile[rect->tilenum].sl; + tsh = tile[rect->tilenum].sh; + ttl = tile[rect->tilenum].tl; + tth = tile[rect->tilenum].th; - if (s > tile[rect->tilenum].sh << 8) - s = tile[rect->tilenum].sl << 8; - } - t += rect->dtdy; - if (t > tile[rect->tilenum].th << 8) - t = tile[rect->tilenum].tl << 8; + twidth = tile[rect->tilenum].line; + tformat = tile[rect->tilenum].format; + tsize = tile[rect->tilenum].size; + tbase = tile[rect->tilenum].tmem; + + // FIXME?: clamping breaks at least Rampage World Tour + clamp_t = 0; //tile[rect->tilenum].ct; + clamp_s = 0; //tile[rect->tilenum].cs; + + mirror_t = tile[rect->tilenum].mt; + mirror_s = tile[rect->tilenum].ms; + mask_t = tile[rect->tilenum].mask_t; + mask_s = tile[rect->tilenum].mask_s; + + t = (int)(rect->t) << 5; + + if (other_modes.cycle_type == CYCLE_TYPE_1 || other_modes.cycle_type == CYCLE_TYPE_2) + { + } + + if (other_modes.cycle_type == CYCLE_TYPE_1) + { + for (j = y1; j < y2; j++) + { + int fb_index = j * fb_width; + + s = (int)(rect->s) << 5; + + for (i = x1; i < x2; i++) + { + COLOR c; + + //ss = (s >> 10) - (tsl >> 2); + //if ((s & 0x3ff) >= 0x200) ss++; + //st = (t >> 10) - (ttl >> 2); + //if ((t & 0x3ff) >= 0x200) st++; + + //CLAMP(ss, st); + //FETCH_TEXEL(&texel0_color, ss, st, twidth, tformat, tsize, tbase); + + TEXTURE_PIPELINE1(s, t, (rect->dsdx == (1 << 10)) && (rect->dtdy == (1 << 10))); + + c = COLOR_COMBINER(0); + + BLENDER1_32(&fb[(fb_index + i)], c); + + s += rect->dsdx; + } + + t += rect->dtdy; + } + } + else if (other_modes.cycle_type == CYCLE_TYPE_2) + { + for (j = y1; j < y2; j++) + { + int fb_index = j * fb_width; + + s = (int)(rect->s) << 5; + + for (i = x1; i < x2; i++) + { + COLOR c1, c2; + + //ss = (s >> 10) - (tsl >> 2); + //if ((s & 0x3ff) >= 0x200) ss++; + //st = (t >> 10) - (ttl >> 2); + //if ((t & 0x3ff) >= 0x200) st++; + + //CLAMP(ss, st); + //FETCH_TEXEL(&texel0_color, ss, st, twidth, tformat, tsize, tbase); + //FETCH_TEXEL(&texel1_color, ss, st, twidth, tformat, tsize, tbase); + + TEXTURE_PIPELINE2(s, t, (rect->dsdx == (1 << 10)) && (rect->dtdy == (1 << 10))); + + c1 = COLOR_COMBINER(0); + c2 = COLOR_COMBINER(1); + + BLENDER2_32(&fb[(fb_index + i)], c1, c2); + + s += rect->dsdx; + } + + t += rect->dtdy; + } + } + else if (other_modes.cycle_type == CYCLE_TYPE_COPY) + { + for (j = y1; j < y2; j++) + { + int fb_index = j * fb_width; + + s = (int)(rect->s) << 5; + + for (i = x1; i < x2; i++) + { + /* + if (clamp_s) + { + if (s < (tsl << 8)) s = (tsl << 8); + if (s > (tsh << 8)) s = (tsh << 8); + } + if (clamp_t) + { + if (t < (ttl << 8)) t = (ttl << 8); + if (t > (tth << 8)) t = (tth << 8); + } + if (mask_s) + { + s &= (((UINT32)(0xffffffff) >> (32-mask_s)) << 10) | 0x3ff; + } + if (mask_t) + { + t &= (((UINT32)(0xffffffff) >> (32-mask_t)) << 10) | 0x3ff; + } + + FETCH_TEXEL(&c, (s-tile[rect->tilenum].sl) >> 10, (t-tile[rect->tilenum].tl) >> 10, twidth, tformat, tsize, tbase); + */ + //ss = (s >> 10) - (tsl >> 2); + //if ((s & 0x3ff) >= 0x200) ss++; + //st = (t >> 10) - (ttl >> 2); + //if ((t & 0x3ff) >= 0x200) st++; + + TEXTURE_PIPELINE1(s, t, (rect->dsdx == (1 << 10)) && (rect->dtdy == (1 << 10))); + + //CLAMP(ss, st); + //FETCH_TEXEL(&c, ss, st, twidth, tformat, tsize, tbase); + + if (texel0_color.a != 0) + { + fb[(fb_index + i) ^ WORD_ADDR_XOR] = (texel0_color.r << 16) | (texel0_color.g << 8) | (texel0_color.b << 0); + } + + s += rect->dsdx; + } + + t += rect->dtdy; + } + } + else + { + fatalerror("texture_rectangle_32bit: unknown cycle type %d\n", other_modes.cycle_type); + } +} + + +static void render_spans_32(int start, int end, int tilenum, int shade, int texture, int zbuffer, int flip) +{ + UINT32 *fb = (UINT32*)&rdram[fb_address / 4]; + UINT16 *zb = (UINT16*)&rdram[zb_address / 4]; + int i, j; + int tsl, tsh, ttl, tth; + int twidth, tformat, tsize, tbase; + int clamp_s, clamp_t, mask_s, mask_t, mirror_s, mirror_t; + + int clipx1, clipx2, clipy1, clipy2; + + clipx1 = clip.xh / 4; + clipx2 = clip.xl / 4; + clipy1 = clip.yh / 4; + clipy2 = clip.yl / 4; + + tsl = tile[tilenum].sl; + tsh = tile[tilenum].sh; + ttl = tile[tilenum].tl; + tth = tile[tilenum].th; + + twidth = tile[tilenum].line; + tformat = tile[tilenum].format; + tsize = tile[tilenum].size; + tbase = tile[tilenum].tmem; + + clamp_t = tile[tilenum].ct; + clamp_s = tile[tilenum].cs; + mirror_t = tile[tilenum].mt; + mirror_s = tile[tilenum].ms; + mask_t = tile[tilenum].mask_t; + mask_s = tile[tilenum].mask_s; + + if (start < clipy1) + { + start = clipy1; + } + if (start >= clipy2) + { + start = clipy2-1; + } + if (end < clipy1) + { + end = clipy1; + } + if (end >= clipy2) + { + end = clipy2-1; + } + + for (i=start; i <= end; i++) + { + int xstart = span[i].lx; + int xend = span[i].rx; + int r = span[i].r; + int g = span[i].g; + int b = span[i].b; + int a = span[i].a; + int z = span[i].z; + int s = span[i].s; + int t = span[i].t; + int w = span[i].w; + int dr = span[i].dr; + int dg = span[i].dg; + int db = span[i].db; + int da = span[i].da; + int dz = span[i].dz; + int ds = span[i].ds; + int dt = span[i].dt; + int dw = span[i].dw; + int drinc, dginc, dbinc, dainc, dzinc, dsinc, dtinc, dwinc; + + int x; + int xinc; + + int fb_index = fb_width * i; + int length; + + drinc = flip ? (dr) : -dr; + dginc = flip ? (dg) : -dg; + dbinc = flip ? (db) : -db; + dainc = flip ? (da) : -da; + dzinc = flip ? (dz) : -dz; + dsinc = flip ? (ds) : -ds; + dtinc = flip ? (dt) : -dt; + dwinc = flip ? (dw) : -dw; + + xinc = flip ? 1 : -1; + x = xend; + + length = flip ? (xstart - xend) : (xend - xstart); + + for (j=0; j <= length; j++) + { + int sr = r >> 16; + int sg = g >> 16; + int sb = b >> 16; + int sa = a >> 16; + int ss = s >> 16; + int st = t >> 16; + int sw = w >> 16; + UINT16 sz = z >> 16; + int oz; + int sss = 0, sst = 0; + + if (x >= clipx1 && x < clipx2) + { + COLOR c1, c2; + + if ((z & 0xffff) >= 0x8000) sz++; + if ((w & 0xffff) >= 0x8000) sw++; + + if (other_modes.persp_tex_en) + { + if (sw != 0) + { + sss = (((INT64)(ss) << 20) / sw); + sst = (((INT64)(st) << 20) / sw); } - break; + } + else + { + sss = ss; + sst = st; } - case PIXEL_SIZE_32BIT: + if (sr > 0xff) sr = 0xff; if (sg > 0xff) sg = 0xff; if (sb > 0xff) sb = 0xff; + + shade_color.r = sr; shade_color.g = sg; shade_color.b = sb; shade_color.a = sa; + + if (texture) { - UINT32 *tc = (UINT32*)texture_cache; - for (j=y1; j < y2; j++) + /*if (other_modes.sample_type) + { + // bilinear + + sss1 = (sss >> 10) - (tsl >> 2); + sss2 = sss1 + 1; + + sst1 = (sst >> 10) - (ttl >> 2); + sst2 = sst1 + 1; + + CLAMP(sss1, sst1); + CLAMP(sss2, sst2); + + FETCH_TEXEL(&t0, sss1, sst1, twidth, tformat, tsize, tbase); + FETCH_TEXEL(&t1, sss2, sst1, twidth, tformat, tsize, tbase); + FETCH_TEXEL(&t2, sss1, sst2, twidth, tformat, tsize, tbase); + FETCH_TEXEL(&t3, sss2, sst2, twidth, tformat, tsize, tbase); + + texel0_color.r = (((( (t0.r * (0x3ff - (sss & 0x3ff))) + (t1.r * ((sss & 0x3ff))) ) >> 10) * (0x3ff - (sst & 0x3ff))) >> 10) + + (((( (t2.r * (0x3ff - (sss & 0x3ff))) + (t3.r * ((sss & 0x3ff))) ) >> 10) * ((sst & 0x3ff))) >> 10); + + texel0_color.g = (((( (t0.g * (0x3ff - (sss & 0x3ff))) + (t1.g * ((sss & 0x3ff))) ) >> 10) * (0x3ff - (sst & 0x3ff))) >> 10) + + (((( (t2.g * (0x3ff - (sss & 0x3ff))) + (t3.g * ((sss & 0x3ff))) ) >> 10) * ((sst & 0x3ff))) >> 10); + + texel0_color.b = (((( (t0.b * (0x3ff - (sss & 0x3ff))) + (t1.b * ((sss & 0x3ff))) ) >> 10) * (0x3ff - (sst & 0x3ff))) >> 10) + + (((( (t2.b * (0x3ff - (sss & 0x3ff))) + (t3.b * ((sss & 0x3ff))) ) >> 10) * ((sst & 0x3ff))) >> 10); + + texel0_color.a = (((( (t0.a * (0x3ff - (sss & 0x3ff))) + (t1.a * ((sss & 0x3ff))) ) >> 10) * (0x3ff - (sst & 0x3ff))) >> 10) + + (((( (t2.a * (0x3ff - (sss & 0x3ff))) + (t3.a * ((sss & 0x3ff))) ) >> 10) * ((sst & 0x3ff))) >> 10); + } + else + { + sss1 = (sss >> 10) - (tsl >> 2); + if ((sss & 0x3ff) >= 0x200) sss1++; + + sst1 = (sst >> 10) - (ttl >> 2); + if ((sst & 0x3ff) >= 0x200) sst1++; + + CLAMP(sss1, sst1); + + // point sample + FETCH_TEXEL(&texel0_color, sss1, sst1, twidth, tformat, tsize, tbase); + }*/ + + if (other_modes.cycle_type == CYCLE_TYPE_1) + { + TEXTURE_PIPELINE1(sss, sst, 0); + } + else { - index = j * fb_width; - tline = (tb/4) + ((t >> 10) * (twidth / 4)); + TEXTURE_PIPELINE2(sss, sst, 0); + } + } - s = rect->s << 5; // to .10 fixed + if (other_modes.cycle_type == CYCLE_TYPE_1) + { + c1 = COLOR_COMBINER(0); + } + else if (other_modes.cycle_type == CYCLE_TYPE_2) + { + c1 = COLOR_COMBINER(0); + c2 = COLOR_COMBINER(1); + } - for (i=x1; i < x2; i++) + oz = (UINT16)zb[(fb_index + x) ^ WORD_ADDR_XOR]; + if (zbuffer) + { + if (sz < oz /*&& c.a != 0*/) + { + if (other_modes.cycle_type == CYCLE_TYPE_1) + { + BLENDER1_32(&fb[(fb_index + x)], c1); + } + else { - UINT32 color = tc[(tline + (s >> 10))]; - fb[index + i] = color; - s += rect->dsdx; + BLENDER2_32(&fb[(fb_index + x)], c1, c2); + } - if (s > tile[rect->tilenum].sh << 8) - s = tile[rect->tilenum].sl << 8; + if (other_modes.z_compare_en && other_modes.z_update_en) + { + zb[(fb_index + x) ^ WORD_ADDR_XOR] = sz; } - t += rect->dtdy; - if (t > tile[rect->tilenum].th << 8) - t = tile[rect->tilenum].tl << 8; } - break; } - - default: fatalerror("RDP: texture_rectangle 32-bit RGBA: tile pixel size = %d\n", tile[rect->tilenum].size); break; + else + { + if (other_modes.cycle_type == CYCLE_TYPE_1) + { + BLENDER1_32(&fb[(fb_index + x)], c1); + } + else + { + BLENDER2_32(&fb[(fb_index + x)], c1, c2); + } + } } - break; + + r += drinc; + g += dginc; + b += dbinc; + a += dainc; + z += dzinc; + s += dsinc; + t += dtinc; + w += dwinc; + + x += xinc; } + } +} - case 2: // Color Index +/*****************************************************************************/ + + + +static void render_spans_16(int start, int end, int tilenum, int shade, int texture, int zbuffer, int flip) +{ + UINT16 *fb = (UINT16*)&rdram[fb_address / 4]; + UINT16 *zb = (UINT16*)&rdram[zb_address / 4]; + int i, j; + int tsl, tsh, ttl, tth; + int twidth, tformat, tsize, tbase; + int clamp_s, clamp_t, mask_s, mask_t, mirror_s, mirror_t; + + int clipx1, clipx2, clipy1, clipy2; + + clipx1 = clip.xh / 4; + clipx2 = clip.xl / 4; + clipy1 = clip.yh / 4; + clipy2 = clip.yl / 4; + + tsl = tile[tilenum].sl; + tsh = tile[tilenum].sh; + ttl = tile[tilenum].tl; + tth = tile[tilenum].th; + + twidth = tile[tilenum].line; + tformat = tile[tilenum].format; + tsize = tile[tilenum].size; + tbase = tile[tilenum].tmem; + + clamp_t = tile[tilenum].ct; + clamp_s = tile[tilenum].cs; + mirror_t = tile[tilenum].mt; + mirror_s = tile[tilenum].ms; + mask_t = tile[tilenum].mask_t; + mask_s = tile[tilenum].mask_s; + + if (start < clipy1) + { + start = clipy1; + } + if (start >= clipy2) + { + start = clipy2-1; + } + if (end < clipy1) + { + end = clipy1; + } + if (end >= clipy2) + { + end = clipy2-1; + } + + for (i=start; i <= end; i++) + { + int xstart = span[i].lx; + int xend = span[i].rx; + int r = span[i].r; + int g = span[i].g; + int b = span[i].b; + int a = span[i].a; + int z = span[i].z; + int s = span[i].s; + int t = span[i].t; + int w = span[i].w; + int dr = span[i].dr; + int dg = span[i].dg; + int db = span[i].db; + int da = span[i].da; + int dz = span[i].dz; + int ds = span[i].ds; + int dt = span[i].dt; + int dw = span[i].dw; + int drinc, dginc, dbinc, dainc, dzinc, dsinc, dtinc, dwinc; + + int x; + int xinc; + + int fb_index = fb_width * i; + int length; + + drinc = flip ? (dr) : -dr; + dginc = flip ? (dg) : -dg; + dbinc = flip ? (db) : -db; + dainc = flip ? (da) : -da; + dzinc = flip ? (dz) : -dz; + dsinc = flip ? (ds) : -ds; + dtinc = flip ? (dt) : -dt; + dwinc = flip ? (dw) : -dw; + + /*if (flip) + { + if (xend > clipx2) + { + int d = xend-clipx2; + r += d * drinc; + g += d * dginc; + b += d * dbinc; + a += d * dainc; + z += d * dzinc; + s += d * dsinc; + t += d * dtinc; + w += d * dwinc; + + xend = clipx2; + } + if (xstart < clipx1) + { + xstart = clipx1; + } + } + else + { + if (xstart > clipx2) + { + int d = xstart-clipx2; + r += d * drinc; + g += d * dginc; + b += d * dbinc; + a += d * dainc; + z += d * dzinc; + s += d * dsinc; + t += d * dtinc; + w += d * dwinc; + + xstart = clipx2; + } + if (xend < clipx1) + { + xend = clipx1; + } + }*/ + + xinc = flip ? 1 : -1; + x = xend; + + length = flip ? (xstart - xend) : (xend - xstart); + + for (j=0; j <= length; j++) { - switch (tile[rect->tilenum].size) + COLOR c1, c2; + int sr = r >> 16; + int sg = g >> 16; + int sb = b >> 16; + int sa = a >> 16; + int ss = s >> 16; + int st = t >> 16; + int sw = w >> 16; + UINT16 sz = z >> 16; + int oz; + int sss = 0, sst = 0; + + if (x >= clipx1 && x < clipx2) { - case PIXEL_SIZE_4BIT: + if ((z & 0xffff) >= 0x8000) sz++; + if ((w & 0xffff) >= 0x8000) sw++; + + if (other_modes.persp_tex_en) { - UINT8 *tc = (UINT8*)texture_cache; - for (j=y1; j < y2; j++) + if (sw != 0) + { + sss = (((INT64)(ss) << 20) / sw); + sst = (((INT64)(st) << 20) / sw); + } + } + else + { + sss = ss; + sst = st; + } + + if (sr > 0xff) sr = 0xff; if (sg > 0xff) sg = 0xff; if (sb > 0xff) sb = 0xff; + + shade_color.r = sr; shade_color.g = sg; shade_color.b = sb; shade_color.a = sa; + + if (texture) + { + /*if (other_modes.sample_type) + { + // bilinear + + sss1 = (sss >> 10) - (tsl >> 2); + sss2 = sss1 + 1; + + sst1 = (sst >> 10) - (ttl >> 2); + sst2 = sst1 + 1; + + CLAMP(sss1, sst1); + CLAMP(sss2, sst2); + + FETCH_TEXEL(&t0, sss1, sst1, twidth, tformat, tsize, tbase); + FETCH_TEXEL(&t1, sss2, sst1, twidth, tformat, tsize, tbase); + FETCH_TEXEL(&t2, sss1, sst2, twidth, tformat, tsize, tbase); + FETCH_TEXEL(&t3, sss2, sst2, twidth, tformat, tsize, tbase); + + texel0_color.r = (((( (t0.r * (0x3ff - (sss & 0x3ff))) + (t1.r * ((sss & 0x3ff))) ) >> 10) * (0x3ff - (sst & 0x3ff))) >> 10) + + (((( (t2.r * (0x3ff - (sss & 0x3ff))) + (t3.r * ((sss & 0x3ff))) ) >> 10) * ((sst & 0x3ff))) >> 10); + + texel0_color.g = (((( (t0.g * (0x3ff - (sss & 0x3ff))) + (t1.g * ((sss & 0x3ff))) ) >> 10) * (0x3ff - (sst & 0x3ff))) >> 10) + + (((( (t2.g * (0x3ff - (sss & 0x3ff))) + (t3.g * ((sss & 0x3ff))) ) >> 10) * ((sst & 0x3ff))) >> 10); + + texel0_color.b = (((( (t0.b * (0x3ff - (sss & 0x3ff))) + (t1.b * ((sss & 0x3ff))) ) >> 10) * (0x3ff - (sst & 0x3ff))) >> 10) + + (((( (t2.b * (0x3ff - (sss & 0x3ff))) + (t3.b * ((sss & 0x3ff))) ) >> 10) * ((sst & 0x3ff))) >> 10); + + texel0_color.a = (((( (t0.a * (0x3ff - (sss & 0x3ff))) + (t1.a * ((sss & 0x3ff))) ) >> 10) * (0x3ff - (sst & 0x3ff))) >> 10) + + (((( (t2.a * (0x3ff - (sss & 0x3ff))) + (t3.a * ((sss & 0x3ff))) ) >> 10) * ((sst & 0x3ff))) >> 10); + } + else + { + sss1 = (sss >> 10) - (tsl >> 2); + if ((sss & 0x3ff) >= 0x200) sss1++; + + sst1 = (sst >> 10) - (ttl >> 2); + if ((sst & 0x3ff) >= 0x200) sst1++; + + CLAMP(sss1, sst1); + + // point sample + FETCH_TEXEL(&texel0_color, sss1, sst1, twidth, tformat, tsize, tbase); + }*/ + + if (other_modes.cycle_type == CYCLE_TYPE_1) + { + TEXTURE_PIPELINE1(sss, sst, 0); + } + else + { + TEXTURE_PIPELINE2(sss, sst, 0); + } + } + + if (other_modes.cycle_type == CYCLE_TYPE_1) + { + c1 = COLOR_COMBINER(0); + } + else if (other_modes.cycle_type == CYCLE_TYPE_2) + { + c1 = COLOR_COMBINER(0); + c2 = COLOR_COMBINER(1); + } + + oz = (UINT16)zb[(fb_index + x) ^ WORD_ADDR_XOR]; + if (zbuffer) + { + if (sz < oz /*&& c.a != 0*/) + { + //BLENDER1_16(&fb[(fb_index + x) ^ WORD_ADDR_XOR], c); + { + int dith = dither_matrix_4x4[(((j) & 3) << 2) + ((i^WORD_ADDR_XOR) & 3)]; + if (other_modes.cycle_type == CYCLE_TYPE_1) + { + BLENDER1_16(&fb[(fb_index + x) ^ WORD_ADDR_XOR], c1, dith); + } + else + { + BLENDER2_16(&fb[(fb_index + x) ^ WORD_ADDR_XOR], c1, c2, dith); + } + } + + if (other_modes.z_compare_en && other_modes.z_update_en) + { + zb[(fb_index + x) ^ WORD_ADDR_XOR] = sz; + } + } + } + else + { + //BLENDER1_16(&fb[(fb_index + x) ^ WORD_ADDR_XOR], c); + { - index = j * fb_width; - tline = tb + ((t >> 10) * twidth); + int dith = dither_matrix_4x4[(((j) & 3) << 2) + ((i^WORD_ADDR_XOR) & 3)]; + if (other_modes.cycle_type == CYCLE_TYPE_1) + { + BLENDER1_16(&fb[(fb_index + x) ^ WORD_ADDR_XOR], c1, dith); + } + else + { + BLENDER2_16(&fb[(fb_index + x) ^ WORD_ADDR_XOR], c1, c2, dith); + } + } + } + } + + r += drinc; + g += dginc; + b += dbinc; + a += dainc; + z += dzinc; + s += dsinc; + t += dtinc; + w += dwinc; + + x += xinc; + } + } +} + +static void triangle(UINT32 w1, UINT32 w2, int shade, int texture, int zbuffer) +{ + int j; + int xleft, xright, xleft_inc, xright_inc; + int xstart, xend; + int r, g, b, a, z, s, t, w; + int dr, dg, db, da; + int drdx = 0, dgdx = 0, dbdx = 0, dadx = 0, dzdx = 0, dsdx = 0, dtdx = 0, dwdx = 0; + int drdy = 0, dgdy = 0, dbdy = 0, dady = 0, dzdy = 0, dsdy = 0, dtdy = 0, dwdy = 0; + int drde = 0, dgde = 0, dbde = 0, dade = 0, dzde = 0, dsde = 0, dtde = 0, dwde = 0; + int tile; + int flip = (w1 & 0x800000) ? 1 : 0; + + INT32 yl, ym, yh; + INT32 xl, xm, xh; + INT64 dxldy, dxhdy, dxmdy; + UINT32 w3, w4, w5, w6, w7, w8; + + int shade_base = rdp_cmd_cur + 8; + int texture_base = rdp_cmd_cur + 8; + int zbuffer_base = rdp_cmd_cur + 8; + if (shade) + { + texture_base += 16; + zbuffer_base += 16; + } + if (texture) + { + zbuffer_base += 16; + } + + w3 = rdp_cmd_data[rdp_cmd_cur+2]; + w4 = rdp_cmd_data[rdp_cmd_cur+3]; + w5 = rdp_cmd_data[rdp_cmd_cur+4]; + w6 = rdp_cmd_data[rdp_cmd_cur+5]; + w7 = rdp_cmd_data[rdp_cmd_cur+6]; + w8 = rdp_cmd_data[rdp_cmd_cur+7]; + + yl = (w1 & 0x3fff) >> 2; + ym = ((w2 >> 16) & 0x3fff) >> 2; + yh = ((w2 >> 0) & 0x3fff) >> 2; + xl = (INT32)(w3); + xh = (INT32)(w5); + xm = (INT32)(w7); + dxldy = (INT32)(w4); + dxhdy = (INT32)(w6); + dxmdy = (INT32)(w8); - s = rect->s << 5; // to .10 fixed - for (i=x1; i < x2; i++) - { - UINT32 color, r, g, b; - UINT8 pix = tc[(tline + ((s >> 10) / 2)) ^ BYTE_ADDR_XOR]; - pix = ((s >> 10) & 1) ? (pix >> 0) & 0xf : (pix >> 4) & 0xf; - color = tlut[pix^1]; + if (yl & 0x800) yl |= 0xfffff000; + if (ym & 0x800) ym |= 0xfffff000; + if (yh & 0x800) yh |= 0xfffff000; - if (other_modes & OTHER_MODES_TLUT_TYPE) - { - // 1A (8/8) - int lum = (color >> 8) & 0xff; - // int alpha = (color & 0xff); - r = g = b = lum; - } - else - { - // RGBA5551 - r = ((color >> 11) & 0x1f); - r = (r << 3) | (r >> 5); - g = ((color >> 6) & 0x1f); - g = (g << 3) | (g >> 5); - b = ((color >> 1) & 0x1f); - b = (b << 3) | (b >> 5); - } + yl += (w1 >> 1) & 1; + ym += (w2 >> 17) & 1; + yh += (w2 >> 1) & 1; - //if (color & 1) - { - fb[(index + i)] = (r << 16) | (g << 8) | b; - } - s += rect->dsdx; - } - t += rect->dtdy; - } - break; - } - case PIXEL_SIZE_8BIT: - { - UINT8 *tc = (UINT8*)texture_cache; - for (j=y1; j < y2; j++) - { - UINT32 xor_mask = 0; - index = j * fb_width; - tline = tb + ((t >> 10) * twidth); + tile = (w1 >> 16) & 0x7; - if ((t >> 10) & 1) - xor_mask = BYTE_ADDR_XOR | 4; - else - xor_mask = BYTE_ADDR_XOR; + r = 0xff; g = 0xff; b = 0xff; a = 0xff; z = 0; s = 0; t = 0; w = 0; + dr = 0; dg = 0; db = 0; da = 0; - s = rect->s << 5; // to .10 fixed - for (i=x1; i < x2; i++) - { - UINT16 color; - UINT32 r,g,b; - UINT8 pix = tc[(tline + (s >> 10))]; - color = tlut[pix ^ 1]; - if (other_modes & OTHER_MODES_TLUT_TYPE) - { - // 1A (8/8) - int lum = (color >> 8) & 0xff; - // int alpha = (color & 0xff); - r = g = b = lum; - } - else - { - // RGBA5551 - r = ((color >> 11) & 0x1f); - r = (r << 3) | (r >> 5); - g = ((color >> 6) & 0x1f); - g = (g << 3) | (g >> 5); - b = ((color >> 1) & 0x1f); - b = (b << 3) | (b >> 5); - } - //if (color & 1) - { - fb[(index + i)] = (r << 16) | (g << 8) | b; - } - s += rect->dsdx; - } - t += rect->dtdy; - } - break; - } + if (shade) + { + r = (rdp_cmd_data[shade_base+0 ] & 0xffff0000) | ((rdp_cmd_data[shade_base+4 ] >> 16) & 0x0000ffff); + g = ((rdp_cmd_data[shade_base+0 ] << 16) & 0xffff0000) | (rdp_cmd_data[shade_base+4 ] & 0x0000ffff); + b = (rdp_cmd_data[shade_base+1 ] & 0xffff0000) | ((rdp_cmd_data[shade_base+5 ] >> 16) & 0x0000ffff); + a = ((rdp_cmd_data[shade_base+1 ] << 16) & 0xffff0000) | (rdp_cmd_data[shade_base+5 ] & 0x0000ffff); + drdx = (rdp_cmd_data[shade_base+2 ] & 0xffff0000) | ((rdp_cmd_data[shade_base+6 ] >> 16) & 0x0000ffff); + dgdx = ((rdp_cmd_data[shade_base+2 ] << 16) & 0xffff0000) | (rdp_cmd_data[shade_base+6 ] & 0x0000ffff); + dbdx = (rdp_cmd_data[shade_base+3 ] & 0xffff0000) | ((rdp_cmd_data[shade_base+7 ] >> 16) & 0x0000ffff); + dadx = ((rdp_cmd_data[shade_base+3 ] << 16) & 0xffff0000) | (rdp_cmd_data[shade_base+7 ] & 0x0000ffff); + drde = (rdp_cmd_data[shade_base+8 ] & 0xffff0000) | ((rdp_cmd_data[shade_base+12] >> 16) & 0x0000ffff); + dgde = ((rdp_cmd_data[shade_base+8 ] << 16) & 0xffff0000) | (rdp_cmd_data[shade_base+12] & 0x0000ffff); + dbde = (rdp_cmd_data[shade_base+9 ] & 0xffff0000) | ((rdp_cmd_data[shade_base+13] >> 16) & 0x0000ffff); + dade = ((rdp_cmd_data[shade_base+9 ] << 16) & 0xffff0000) | (rdp_cmd_data[shade_base+13] & 0x0000ffff); + drdy = (rdp_cmd_data[shade_base+10] & 0xffff0000) | ((rdp_cmd_data[shade_base+14] >> 16) & 0x0000ffff); + dgdy = ((rdp_cmd_data[shade_base+10] << 16) & 0xffff0000) | (rdp_cmd_data[shade_base+14] & 0x0000ffff); + dbdy = (rdp_cmd_data[shade_base+11] & 0xffff0000) | ((rdp_cmd_data[shade_base+15] >> 16) & 0x0000ffff); + dady = ((rdp_cmd_data[shade_base+11] << 16) & 0xffff0000) | (rdp_cmd_data[shade_base+15] & 0x0000ffff); + } + if (texture) + { + s = (rdp_cmd_data[texture_base+0 ] & 0xffff0000) | ((rdp_cmd_data[texture_base+4 ] >> 16) & 0x0000ffff); + t = ((rdp_cmd_data[texture_base+0 ] << 16) & 0xffff0000) | (rdp_cmd_data[texture_base+4 ] & 0x0000ffff); + w = (rdp_cmd_data[texture_base+1 ] & 0xffff0000) | ((rdp_cmd_data[texture_base+5 ] >> 16) & 0x0000ffff); + dsdx = (rdp_cmd_data[texture_base+2 ] & 0xffff0000) | ((rdp_cmd_data[texture_base+6 ] >> 16) & 0x0000ffff); + dtdx = ((rdp_cmd_data[texture_base+2 ] << 16) & 0xffff0000) | (rdp_cmd_data[texture_base+6 ] & 0x0000ffff); + dwdx = (rdp_cmd_data[texture_base+3 ] & 0xffff0000) | ((rdp_cmd_data[texture_base+7 ] >> 16) & 0x0000ffff); + dsde = (rdp_cmd_data[texture_base+8 ] & 0xffff0000) | ((rdp_cmd_data[texture_base+12] >> 16) & 0x0000ffff); + dtde = ((rdp_cmd_data[texture_base+8 ] << 16) & 0xffff0000) | (rdp_cmd_data[texture_base+12] & 0x0000ffff); + dwde = (rdp_cmd_data[texture_base+9 ] & 0xffff0000) | ((rdp_cmd_data[texture_base+13] >> 16) & 0x0000ffff); + dsdy = (rdp_cmd_data[texture_base+10] & 0xffff0000) | ((rdp_cmd_data[texture_base+14] >> 16) & 0x0000ffff); + dtdy = ((rdp_cmd_data[texture_base+10] << 16) & 0xffff0000) | (rdp_cmd_data[texture_base+14] & 0x0000ffff); + dwdy = (rdp_cmd_data[texture_base+11] & 0xffff0000) | ((rdp_cmd_data[texture_base+15] >> 16) & 0x0000ffff); + } + if (zbuffer) + { + z = rdp_cmd_data[zbuffer_base+0]; + dzdx = rdp_cmd_data[zbuffer_base+1]; + dzde = rdp_cmd_data[zbuffer_base+2]; + dzdy = rdp_cmd_data[zbuffer_base+3]; + } - default: fatalerror("RDP: texture_rectangle 32-bit CI: tile pixel size = %d\n", tile[rect->tilenum].size); break; - } - break; + xleft = xm; + xright = xh; + xleft_inc = dxmdy; + xright_inc = dxhdy; + + for (j=yh; j < ym; j++) + { + xstart = xleft >> 16; + xend = xright >> 16; + + if (j >= 0) + { + span[j].lx = xstart; + span[j].rx = xend; + span[j].s = s; span[j].ds = dsdx; + span[j].t = t; span[j].dt = dtdx; + span[j].w = w; span[j].dw = dwdx; + span[j].r = r; span[j].dr = drdx; + span[j].g = g; span[j].dg = dgdx; + span[j].b = b; span[j].db = dbdx; + span[j].a = a; span[j].da = dadx; + span[j].z = z; span[j].dz = dzdx; } - case 3: // IA + xleft += xleft_inc; + xright += xright_inc; + s += dsde; + t += dtde; + w += dwde; + r += drde; + g += dgde; + b += dbde; + a += dade; + z += dzde; + } + + xleft = xl; + xleft_inc = dxldy; + xright_inc = dxhdy; + + for (j=ym; j <= yl; j++) + { + xstart = xleft >> 16; + xend = xright >> 16; + + if (j >= 0) { - switch (tile[rect->tilenum].size) - { - default: fatalerror("RDP: texture_rectangle 32-bit IA: tile pixel size = %d\n", tile[rect->tilenum].size); break; - } - break; + span[j].lx = xstart; + span[j].rx = xend; + span[j].s = s; span[j].ds = dsdx; + span[j].t = t; span[j].dt = dtdx; + span[j].w = w; span[j].dw = dwdx; + span[j].r = r; span[j].dr = drdx; + span[j].g = g; span[j].dg = dgdx; + span[j].b = b; span[j].db = dbdx; + span[j].a = a; span[j].da = dadx; + span[j].z = z; span[j].dz = dzdx; } - default: fatalerror("RDP: texture_rectangle 32-bit: tile format = %d\n", tile[rect->tilenum].format); break; + xleft += xleft_inc; + xright += xright_inc; + s += dsde; + t += dtde; + w += dwde; + r += drde; + g += dgde; + b += dbde; + a += dade; + z += dzde; } -} + switch (fb_size) + { + case PIXEL_SIZE_16BIT: render_spans_16(yh, yl, tile, shade, texture, zbuffer, flip); break; + case PIXEL_SIZE_32BIT: render_spans_32(yh, yl, tile, shade, texture, zbuffer, flip); break; + } +} /*****************************************************************************/ @@ -921,7 +2530,7 @@ static int rdp_dasm(char *buffer) cmd[0] = rdp_cmd_data[rdp_cmd_cur+0]; cmd[1] = rdp_cmd_data[rdp_cmd_cur+1]; - tile = (w[1] >> 24) & 0x7; + tile = (cmd[1] >> 24) & 0x7; sprintf(sl, "%4.2f", (float)((cmd[0] >> 12) & 0xfff) / 4.0f); sprintf(tl, "%4.2f", (float)((cmd[0] >> 0) & 0xfff) / 4.0f); sprintf(sh, "%4.2f", (float)((cmd[1] >> 12) & 0xfff) / 4.0f); @@ -969,6 +2578,56 @@ static int rdp_dasm(char *buffer) sprintf(buffer, "Tri_NoShade %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh); break; } + case 0x0a: // Tri_Tex + { + int lft = (command >> 23) & 0x1; + + if (length < rdp_command_length[command]) + { + sprintf(buffer, "ERROR: Tri_Tex length = %d\n", length); + return 0; + } + + for (i=2; i < 24; i++) + { + cmd[i] = rdp_cmd_data[rdp_cmd_cur+i]; + } + + sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f); + sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f); + sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f); + sprintf(xl, "%4.4f", (float)((INT32)cmd[2] / 65536.0f)); + sprintf(dxldy, "%4.4f", (float)((INT32)cmd[3] / 65536.0f)); + sprintf(xh, "%4.4f", (float)((INT32)cmd[4] / 65536.0f)); + sprintf(dxhdy, "%4.4f", (float)((INT32)cmd[5] / 65536.0f)); + sprintf(xm, "%4.4f", (float)((INT32)cmd[6] / 65536.0f)); + sprintf(dxmdy, "%4.4f", (float)((INT32)cmd[7] / 65536.0f)); + + sprintf(s, "%4.4f", (float)(INT32)((cmd[ 8] & 0xffff0000) | ((cmd[12] >> 16) & 0xffff)) / 65536.0f); + sprintf(t, "%4.4f", (float)(INT32)(((cmd[ 8] & 0xffff) << 16) | (cmd[12] & 0xffff)) / 65536.0f); + sprintf(w, "%4.4f", (float)(INT32)((cmd[ 9] & 0xffff0000) | ((cmd[13] >> 16) & 0xffff)) / 65536.0f); + sprintf(dsdx, "%4.4f", (float)(INT32)((cmd[10] & 0xffff0000) | ((cmd[14] >> 16) & 0xffff)) / 65536.0f); + sprintf(dtdx, "%4.4f", (float)(INT32)(((cmd[10] & 0xffff) << 16) | (cmd[14] & 0xffff)) / 65536.0f); + sprintf(dwdx, "%4.4f", (float)(INT32)((cmd[11] & 0xffff0000) | ((cmd[15] >> 16) & 0xffff)) / 65536.0f); + sprintf(dsde, "%4.4f", (float)(INT32)((cmd[16] & 0xffff0000) | ((cmd[20] >> 16) & 0xffff)) / 65536.0f); + sprintf(dtde, "%4.4f", (float)(INT32)(((cmd[16] & 0xffff) << 16) | (cmd[20] & 0xffff)) / 65536.0f); + sprintf(dwde, "%4.4f", (float)(INT32)((cmd[17] & 0xffff0000) | ((cmd[21] >> 16) & 0xffff)) / 65536.0f); + sprintf(dsdy, "%4.4f", (float)(INT32)((cmd[18] & 0xffff0000) | ((cmd[22] >> 16) & 0xffff)) / 65536.0f); + sprintf(dtdy, "%4.4f", (float)(INT32)(((cmd[18] & 0xffff) << 16) | (cmd[22] & 0xffff)) / 65536.0f); + sprintf(dwdy, "%4.4f", (float)(INT32)((cmd[19] & 0xffff0000) | ((cmd[23] >> 16) & 0xffff)) / 65536.0f); + + + buffer+=sprintf(buffer, "Tri_Tex %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh); + buffer+=sprintf(buffer, " "); + buffer+=sprintf(buffer, " S: %s, T: %s, W: %s\n", s, t, w); + buffer+=sprintf(buffer, " "); + buffer+=sprintf(buffer, " DSDX: %s, DTDX: %s, DWDX: %s\n", dsdx, dtdx, dwdx); + buffer+=sprintf(buffer, " "); + buffer+=sprintf(buffer, " DSDE: %s, DTDE: %s, DWDE: %s\n", dsde, dtde, dwde); + buffer+=sprintf(buffer, " "); + buffer+=sprintf(buffer, " DSDY: %s, DTDY: %s, DWDY: %s\n", dsdy, dtdy, dwdy); + break; + } case 0x0c: // Tri_Shade { int lft = (command >> 23) & 0x1; @@ -1099,7 +2758,7 @@ static int rdp_dasm(char *buffer) case 0x24: case 0x25: { - if (length != 16) + if (length < 16) { sprintf(buffer, "ERROR: Texture_Rectangle length = %d\n", length); return 0; @@ -1148,120 +2807,6 @@ static int rdp_dasm(char *buffer) /*****************************************************************************/ -static void triangle(UINT32 w1, UINT32 w2, int shade) -{ - int i, j; - int xleft, xright, xleft_inc, xright_inc; - int xstart, xend; - UINT16 *fb = (UINT16*)&rdram[fb_address / 4]; - UINT16 color; - - INT32 yl, ym, yh; - INT32 xl, xm, xh; - INT64 dxldy, dxhdy, dxmdy; - UINT32 w3, w4, w5, w6, w7, w8; - - w3 = rdp_cmd_data[rdp_cmd_cur+2]; - w4 = rdp_cmd_data[rdp_cmd_cur+3]; - w5 = rdp_cmd_data[rdp_cmd_cur+4]; - w6 = rdp_cmd_data[rdp_cmd_cur+5]; - w7 = rdp_cmd_data[rdp_cmd_cur+6]; - w8 = rdp_cmd_data[rdp_cmd_cur+7]; - - yl = (w1 & 0x1fff) >> 2; - ym = ((w2 >> 16) & 0x1fff) >> 2; - yh = ((w2 >> 0) & 0x1fff) >> 2; - xl = (INT32)(w3); - xh = (INT32)(w5); - xm = (INT32)(w7); - dxldy = (INT32)(w4); - dxhdy = (INT32)(w6); - dxmdy = (INT32)(w8); - - color = 0xffff; - - if (shade) - { - UINT32 shade1 = rdp_cmd_data[rdp_cmd_cur+8]; - UINT32 shade2 = rdp_cmd_data[rdp_cmd_cur+9]; - int r = (shade1 >> 16) & 0xff; - int g = (shade1 >> 0) & 0xff; - int b = (shade2 >> 16) & 0xff; - r >>= 3; - g >>= 3; - b >>= 3; - color = r << 11 | g << 6 | b << 1; - } - - if ((w1 & 0x800000) == 0) - { - xleft = xm; - xright = xh; - xleft_inc = dxmdy; - xright_inc = dxhdy; - } - else - { - xright = xm; - xleft = xh; - xright_inc = dxmdy; - xleft_inc = dxhdy; - } - - - - for (j=yh; j < ym; j++) - { - xstart = xleft >> 16; - if ((xleft & 0xffff) >= 0x8000) - xstart++; - - xend = xright >> 16; - if ((xright & 0xffff) >= 0x8000) - xend++; - - for (i=xstart; i <= xend; i++) - { - //if (i >= (clip.xh >> 2) && i < (clip.xl >> 2) && j >= (clip.yh >> 2) && j < (clip.yl >> 2)) - fb[(j * fb_width + i) ^ 1] = color; - } - xleft += xleft_inc; - xright += xright_inc; - } - - if ((w1 & 0x800000) == 0) - { - xleft = xl; - xleft_inc = dxldy; - xright_inc = dxhdy; - } - else - { - xright = xl; - xright_inc = dxldy; - xleft_inc = dxhdy; - } - - for (j=ym; j <= yl; j++) - { - xstart = xleft >> 16; - if ((xleft & 0xffff) >= 0x8000) - xstart++; - - xend = xright >> 16; - if ((xright & 0xffff) >= 0x8000) - xend++; - - for (i=xstart; i <= xend; i++) - { - //if (i >= (clip.xh >> 2) && i < (clip.xl >> 2) && j >= (clip.yh >> 2) && j < (clip.yl >> 2)) - fb[(j * fb_width + i) ^ 1] = color; - } - xleft += xleft_inc; - xright += xright_inc; - } -} - //////////////////////// // RDP COMMANDS //////////////////////// @@ -1279,55 +2824,55 @@ static void rdp_noop(UINT32 w1, UINT32 w2) static void rdp_tri_noshade(UINT32 w1, UINT32 w2) { //fatalerror("RDP: unhandled command tri_noshade, %08X %08X\n", w1, w2); - triangle(w1, w2, 0); + triangle(w1, w2, 0, 0, 0); } static void rdp_tri_noshade_z(UINT32 w1, UINT32 w2) { //fatalerror("RDP: unhandled command tri_noshade_z, %08X %08X\n", w1, w2); - triangle(w1, w2, 0); + triangle(w1, w2, 0, 0, 1); } static void rdp_tri_tex(UINT32 w1, UINT32 w2) { //osd_die("RDP: unhandled command tri_tex, %08X %08X\n", w1, w2); - triangle(w1, w2, 0); + triangle(w1, w2, 0, 1, 0); } static void rdp_tri_tex_z(UINT32 w1, UINT32 w2) { //osd_die("RDP: unhandled command tri_tex_z, %08X %08X\n", w1, w2); - triangle(w1, w2, 0); + triangle(w1, w2, 0, 1, 1); } static void rdp_tri_shade(UINT32 w1, UINT32 w2) { //osd_die("RDP: unhandled command tri_shade, %08X %08X\n", w1, w2); - triangle(w1, w2, 1); + triangle(w1, w2, 1, 0, 0); } static void rdp_tri_shade_z(UINT32 w1, UINT32 w2) { //osd_die("RDP: unhandled command tri_shade_z, %08X %08X\n", w1, w2); - triangle(w1, w2, 1); + triangle(w1, w2, 1, 0, 1); } static void rdp_tri_texshade(UINT32 w1, UINT32 w2) { //osd_die("RDP: unhandled command tri_texshade, %08X %08X\n", w1, w2); - triangle(w1, w2, 1); + triangle(w1, w2, 1, 1, 0); } static void rdp_tri_texshade_z(UINT32 w1, UINT32 w2) { //osd_die("RDP: unhandled command tri_texshade_z, %08X %08X\n", w1, w2); - triangle(w1, w2, 1); + triangle(w1, w2, 1, 1, 1); } static void rdp_tex_rect(UINT32 w1, UINT32 w2) @@ -1357,7 +2902,27 @@ static void rdp_tex_rect(UINT32 w1, UINT32 w2) static void rdp_tex_rect_flip(UINT32 w1, UINT32 w2) { - fatalerror("RDP: unhandled command tex_rect_flip, %08X %08X\n", w1, w2); + UINT32 w3, w4; + TEX_RECTANGLE rect; + + w3 = rdp_cmd_data[rdp_cmd_cur+2]; + w4 = rdp_cmd_data[rdp_cmd_cur+3]; + + rect.tilenum = (w2 >> 24) & 0x7; + rect.xl = (w1 >> 12) & 0xfff; + rect.yl = (w1 >> 0) & 0xfff; + rect.xh = (w2 >> 12) & 0xfff; + rect.yh = (w2 >> 0) & 0xfff; + rect.t = (w3 >> 16) & 0xffff; + rect.s = (w3 >> 0) & 0xffff; + rect.dtdy = (w4 >> 16) & 0xffff; + rect.dsdx = (w4 >> 0) & 0xffff; + + switch (fb_size) + { + case PIXEL_SIZE_16BIT: texture_rectangle_16bit(&rect); break; + case PIXEL_SIZE_32BIT: texture_rectangle_32bit(&rect); break; + } } static void rdp_sync_load(UINT32 w1, UINT32 w2) @@ -1413,7 +2978,61 @@ static void rdp_set_prim_depth(UINT32 w1, UINT32 w2) static void rdp_set_other_modes(UINT32 w1, UINT32 w2) { - other_modes = ((UINT64)(w1) << 32) | w2; + other_modes.cycle_type = (w1 >> 20) & 0x3; + other_modes.persp_tex_en = (w1 & 0x80000) ? 1 : 0; + other_modes.detail_tex_en = (w1 & 0x40000) ? 1 : 0; + other_modes.sharpen_tex_en = (w1 & 0x20000) ? 1 : 0; + other_modes.tex_lod_en = (w1 & 0x10000) ? 1 : 0; + other_modes.en_tlut = (w1 & 0x08000) ? 1 : 0; + other_modes.tlut_type = (w1 & 0x04000) ? 1 : 0; + other_modes.sample_type = (w1 & 0x02000) ? 1 : 0; + other_modes.mid_texel = (w1 & 0x01000) ? 1 : 0; + other_modes.bi_lerp0 = (w1 & 0x00800) ? 1 : 0; + other_modes.bi_lerp1 = (w1 & 0x00400) ? 1 : 0; + other_modes.convert_one = (w1 & 0x00200) ? 1 : 0; + other_modes.key_en = (w1 & 0x00100) ? 1 : 0; + other_modes.rgb_dither_sel = (w1 >> 6) & 0x3; + other_modes.alpha_dither_sel = (w1 >> 4) & 0x3; + other_modes.blend_m1a_0 = (w2 >> 30) & 0x3; + other_modes.blend_m1a_1 = (w2 >> 28) & 0x3; + other_modes.blend_m1b_0 = (w2 >> 26) & 0x3; + other_modes.blend_m1b_1 = (w2 >> 24) & 0x3; + other_modes.blend_m2a_0 = (w2 >> 22) & 0x3; + other_modes.blend_m2a_1 = (w2 >> 20) & 0x3; + other_modes.blend_m2b_0 = (w2 >> 18) & 0x3; + other_modes.blend_m2b_1 = (w2 >> 16) & 0x3; + other_modes.force_blend = (w2 & 0x4000) ? 1 : 0; + other_modes.alpha_cvg_select = (w2 & 0x2000) ? 1 : 0; + other_modes.cvg_times_alpha = (w2 & 0x1000) ? 1 : 0; + other_modes.z_mode = (w2 >> 10) & 0x3; + other_modes.cvg_dest = (w2 >> 8) & 0x3; + other_modes.color_on_cvg = (w2 & 0x80) ? 1 : 0; + other_modes.image_read_en = (w2 & 0x40) ? 1 : 0; + other_modes.z_update_en = (w2 & 0x20) ? 1 : 0; + other_modes.z_compare_en = (w2 & 0x10) ? 1 : 0; + other_modes.antialias_en = (w2 & 0x08) ? 1 : 0; + other_modes.z_source_sel = (w2 & 0x04) ? 1 : 0; + other_modes.dither_alpha_en = (w2 & 0x02) ? 1 : 0; + other_modes.alpha_compare_en = (w2 & 0x01) ? 1 : 0; + + SET_BLENDER_INPUT(0, 0, &blender1a_r[0], &blender1a_g[0], &blender1a_b[0], &blender1b_a[0], + other_modes.blend_m1a_0, other_modes.blend_m1b_0); + SET_BLENDER_INPUT(0, 1, &blender2a_r[0], &blender2a_g[0], &blender2a_b[0], &blender2b_a[0], + other_modes.blend_m2a_0, other_modes.blend_m2b_0); + SET_BLENDER_INPUT(1, 0, &blender1a_r[1], &blender1a_g[1], &blender1a_b[1], &blender1b_a[1], + other_modes.blend_m1a_1, other_modes.blend_m1b_1); + SET_BLENDER_INPUT(1, 1, &blender2a_r[1], &blender2a_g[1], &blender2a_b[1], &blender2b_a[1], + other_modes.blend_m2a_1, other_modes.blend_m2b_1); + +// printf("blend: m1a = %d, m1b = %d, m2a = %d, m2b = %d\n", other_modes.blend_m1a_0, other_modes.blend_m1b_0, other_modes.blend_m2a_0, other_modes.blend_m2b_0); + + switch (other_modes.rgb_dither_sel) + { + case 0: break; + case 1: break; //fatalerror("bayer matrix dither\n"); break; + case 2: break; /////fatalerror("noise dither\n"); break; + case 3: break; + } } static void rdp_load_tlut(UINT32 w1, UINT32 w2) @@ -1465,9 +3084,11 @@ static void rdp_set_tile_size(UINT32 w1, UINT32 w2) static void rdp_load_block(UINT32 w1, UINT32 w2) { - int i, c; + int i, width; UINT16 sl, sh, tl, dxt; int tilenum = (w2 >> 24) & 0x7; + UINT32 *src, *tc; + int tb; if (ti_format != tile[tilenum].format || ti_size != tile[tilenum].size) fatalerror("RDP: load_block: format conversion required!\n"); @@ -1477,97 +3098,40 @@ static void rdp_load_block(UINT32 w1, UINT32 w2) sh = ((w2 >> 12) & 0xfff); dxt = ((w2 >> 0) & 0xfff); + width = (sh - sl) + 1; + switch (ti_size) { - case PIXEL_SIZE_4BIT: - { - UINT8 *src = (UINT8*)&rdram[ti_address / 4]; - UINT8 *tc = (UINT8*)texture_cache; - int tb = tile[tilenum].tmem; - - c=0; - for (i=sl>>1; i <= sh>>1; i++) - { - int tline = tb + ((tile[tilenum].line) * (tl >> 11)); - tc[(tline+i) ^ BYTE_ADDR_XOR] = src[i ^ BYTE_ADDR_XOR]; - //tc[tb+i] = src[i^3]; - tl += dxt; + case PIXEL_SIZE_4BIT: width >>= 1; break; + case PIXEL_SIZE_8BIT: break; + case PIXEL_SIZE_16BIT: width <<= 1; break; + case PIXEL_SIZE_32BIT: width <<= 2; break; + } - c++; - if ((c & 7) == 7) - { - tl += dxt; // TL is increased every 8 bytes (8 8-bit pixels) - } - } - break; - } - case PIXEL_SIZE_8BIT: - { - UINT8 *src = (UINT8*)&rdram[ti_address / 4]; - UINT8 *tc = (UINT8*)texture_cache; - int tb = tile[tilenum].tmem; - c=0; - for (i=sl; i <= sh; i++) - { - int tline = tb + ((tile[tilenum].line) * (tl >> 11)); - tc[(tline+i) ^ BYTE_ADDR_XOR] = src[i ^ BYTE_ADDR_XOR]; - //tc[tb+i] = src[i^3]; + src = (UINT32*)&rdram[ti_address / 4]; + tc = (UINT32*)texture_cache; + tb = tile[tilenum].tmem; - c++; - if ((c & 7) == 7) - { - tl += dxt; // TL is increased every 8 bytes (8 8-bit pixels) - } - } - break; - } - case PIXEL_SIZE_16BIT: + if (dxt != 0) + { + int j=0; + for (i=0; i < width; i+=2) { - UINT16 *src = (UINT16*)&rdram[ti_address / 4]; - UINT16 *tc = (UINT16*)texture_cache; - int tb = tile[tilenum].tmem / 2; - int tline = 0; + int t = j >> 11; - c=0; - for (i=sl; i <= sh; i++) - { - tline = tb + ((tile[tilenum].line/2) * (tl >> 11)); - tc[(tline+i) ^ WORD_ADDR_XOR] = src[i ^ WORD_ADDR_XOR]; - //tc[tb+i] = *src++; - - c++; - if ((c & 3) == 3) - { - tl += dxt; // TL is increased every 8 bytes (4 16-bit pixels) - } - } + tc[((tb+i) + 0)] = src[((((tl * ti_width) / 4) + sl + i + 0) ^ ((t & 1) ? 1 : 0))]; + tc[((tb+i) + 1)] = src[((((tl * ti_width) / 4) + sl + i + 1) ^ ((t & 1) ? 1 : 0))]; - break; + j += dxt; } - case PIXEL_SIZE_32BIT: + } + else + { + for (i=0; i < width / 4; i++) { - UINT32 *src = (UINT32*)&rdram[ti_address / 4]; - UINT32 *tc = (UINT32*)texture_cache; - int tb = tile[tilenum].tmem / 4; - - c=0; - for (i=sl; i <= sh; i++) - { - int tline = tb + ((tile[tilenum].line / 4) * (tl >> 11)); - tc[(tline+i)] = src[i]; - //tc[tb+i] = *src++; - - c++; - if ((c & 1) == 1) - { - tl += dxt; // TL is increased every 8 bytes (2 32-bit pixels) - } - } - break; + tc[(tb+i)] = src[((tl * ti_width) / 4) + sl + i]; } - - default: fatalerror("RDP: load_block: size = %d\n", ti_format); } } @@ -1575,6 +3139,7 @@ static void rdp_load_tile(UINT32 w1, UINT32 w2) { int i, j; UINT16 sl, sh, tl, th; + int width, height; int tilenum = (w2 >> 24) & 0x7; if (ti_format != tile[tilenum].format || ti_size != tile[tilenum].size) @@ -1585,6 +3150,9 @@ static void rdp_load_tile(UINT32 w1, UINT32 w2) sh = ((w2 >> 12) & 0xfff) / 4; th = ((w2 >> 0) & 0xfff) / 4; + width = (sh - sl) + 1; + height = (th - tl) + 1; + switch (ti_size) { case PIXEL_SIZE_8BIT: @@ -1593,14 +3161,19 @@ static void rdp_load_tile(UINT32 w1, UINT32 w2) UINT8 *tc = (UINT8*)texture_cache; int tb = tile[tilenum].tmem; - for (j=tl; j <= th; j++) + if (tb + (width * height) > 4096) + { + fatalerror("rdp_load_tile 8-bit: tmem %04X, width %d, height %d = %d\n", tile[tilenum].tmem, width, height, width*height); + } + + for (j=0; j < height; j++) { int tline = tb + (tile[tilenum].line * j); - int sline = ti_width * j; + int s = ((j + tl) * ti_width) + sl; - for (i=sl; i <= sh; i++) + for (i=0; i < width; i++) { - tc[(tline+i) ^ BYTE_ADDR_XOR] = src[(sline+i) ^ BYTE_ADDR_XOR]; + tc[((tline+i) ^ BYTE_ADDR_XOR) ^ ((j & 1) ? 4 : 0)] = src[(s++) ^ BYTE_ADDR_XOR]; } } break; @@ -1611,14 +3184,19 @@ static void rdp_load_tile(UINT32 w1, UINT32 w2) UINT16 *tc = (UINT16*)texture_cache; int tb = (tile[tilenum].tmem / 2); - for (j=tl; j <= th; j++) + if (tb + (width * height) > 2048) + { + //fatalerror("rdp_load_tile 16-bit: tmem %04X, width %d, height %d = %d\n", tile[tilenum].tmem, width, height, width*height); + } + + for (j=0; j < height; j++) { int tline = tb + ((tile[tilenum].line / 2) * j); - int sline = ti_width * j; + int s = ((j + tl) * ti_width) + sl; - for (i=sl; i <= sh; i++) + for (i=0; i < width; i++) { - tc[(tline+i) ^ WORD_ADDR_XOR] = src[(sline+i) ^ WORD_ADDR_XOR]; + tc[((tline+i) ^ WORD_ADDR_XOR) ^ ((j & 1) ? 2 : 0)] = src[(s++) ^ WORD_ADDR_XOR]; } } break; @@ -1629,14 +3207,19 @@ static void rdp_load_tile(UINT32 w1, UINT32 w2) UINT32 *tc = (UINT32*)texture_cache; int tb = (tile[tilenum].tmem / 4); - for (j=tl; j <= th; j++) + if (tb + (width * height) > 1024) + { + fatalerror("rdp_load_tile 32-bit: tmem %04X, width %d, height %d = %d\n", tile[tilenum].tmem, width, height, width*height); + } + + for (j=0; j < height; j++) { int tline = tb + ((tile[tilenum].line / 4) * j); - int sline = ti_width * j; + int s = ((j + tl) * ti_width) + sl; - for (i=sl; i <= sh; i++) + for (i=0; i < width; i++) { - tc[(tline+i)] = src[(sline+i)]; + tc[(tline+i) ^ ((j & 1) ? 1 : 0)] = src[(s++)]; } } break; @@ -1644,6 +3227,7 @@ static void rdp_load_tile(UINT32 w1, UINT32 w2) default: fatalerror("RDP: load_tile: size = %d\n", ti_size); } + } static void rdp_set_tile(UINT32 w1, UINT32 w2) @@ -1654,6 +3238,14 @@ static void rdp_set_tile(UINT32 w1, UINT32 w2) tile[tilenum].size = (w1 >> 19) & 0x3; tile[tilenum].line = ((w1 >> 9) & 0x1ff) * 8; tile[tilenum].tmem = ((w1 >> 0) & 0x1ff) * 8; + tile[tilenum].ct = (w2 >> 19) & 0x1; + tile[tilenum].mt = (w2 >> 18) & 0x1; + tile[tilenum].mask_t = (w2 >> 14) & 0xf; + tile[tilenum].shift_t = (w2 >> 10) & 0xf; + tile[tilenum].cs = (w2 >> 9) & 0x1; + tile[tilenum].ms = (w2 >> 8) & 0x1; + tile[tilenum].mask_s = (w2 >> 4) & 0xf; + tile[tilenum].shift_s = (w2 >> 0) & 0xf; // TODO: clamp & mirror parameters } @@ -1713,8 +3305,41 @@ static void rdp_set_env_color(UINT32 w1, UINT32 w2) static void rdp_set_combine(UINT32 w1, UINT32 w2) { - //TODO! - + combine.sub_a_rgb0 = (w1 >> 20) & 0xf; + combine.mul_rgb0 = (w1 >> 15) & 0x1f; + combine.sub_a_a0 = (w1 >> 12) & 0x7; + combine.mul_a0 = (w1 >> 9) & 0x7; + combine.sub_a_rgb1 = (w1 >> 5) & 0xf; + combine.mul_rgb1 = (w1 >> 0) & 0x1f; + + combine.sub_b_rgb0 = (w2 >> 28) & 0xf; + combine.sub_b_rgb1 = (w2 >> 24) & 0xf; + combine.sub_a_a1 = (w2 >> 21) & 0x7; + combine.mul_a1 = (w2 >> 18) & 0x7; + combine.add_rgb0 = (w2 >> 15) & 0x7; + combine.sub_b_a0 = (w2 >> 12) & 0x7; + combine.add_a0 = (w2 >> 9) & 0x7; + combine.add_rgb1 = (w2 >> 6) & 0x7; + combine.sub_b_a1 = (w2 >> 3) & 0x7; + combine.add_a1 = (w2 >> 0) & 0x7; + + SET_SUBA_RGB_INPUT(&combiner_rgbsub_a_r[0], &combiner_rgbsub_a_g[0], &combiner_rgbsub_a_b[0], combine.sub_a_rgb0); + SET_SUBB_RGB_INPUT(&combiner_rgbsub_b_r[0], &combiner_rgbsub_b_g[0], &combiner_rgbsub_b_b[0], combine.sub_b_rgb0); + SET_MUL_RGB_INPUT(&combiner_rgbmul_r[0], &combiner_rgbmul_g[0], &combiner_rgbmul_b[0], combine.mul_rgb0); + SET_ADD_RGB_INPUT(&combiner_rgbadd_r[0], &combiner_rgbadd_g[0], &combiner_rgbadd_b[0], combine.add_rgb0); + SET_SUB_ALPHA_INPUT(&combiner_alphasub_a[0], combine.sub_a_a0); + SET_SUB_ALPHA_INPUT(&combiner_alphasub_b[0], combine.sub_b_a0); + SET_MUL_ALPHA_INPUT(&combiner_alphamul[0], combine.mul_a0); + SET_SUB_ALPHA_INPUT(&combiner_alphaadd[0], combine.add_a0); + + SET_SUBA_RGB_INPUT(&combiner_rgbsub_a_r[1], &combiner_rgbsub_a_g[1], &combiner_rgbsub_a_b[1], combine.sub_a_rgb1); + SET_SUBB_RGB_INPUT(&combiner_rgbsub_b_r[1], &combiner_rgbsub_b_g[1], &combiner_rgbsub_b_b[1], combine.sub_b_rgb1); + SET_MUL_RGB_INPUT(&combiner_rgbmul_r[1], &combiner_rgbmul_g[1], &combiner_rgbmul_b[1], combine.mul_rgb1); + SET_ADD_RGB_INPUT(&combiner_rgbadd_r[1], &combiner_rgbadd_g[1], &combiner_rgbadd_b[1], combine.add_rgb1); + SET_SUB_ALPHA_INPUT(&combiner_alphasub_a[1], combine.sub_a_a1); + SET_SUB_ALPHA_INPUT(&combiner_alphasub_b[1], combine.sub_b_a1); + SET_MUL_ALPHA_INPUT(&combiner_alphamul[1], combine.mul_a1); + SET_SUB_ALPHA_INPUT(&combiner_alphaadd[1], combine.add_a1); } static void rdp_set_texture_image(UINT32 w1, UINT32 w2) @@ -1778,6 +3403,10 @@ void rdp_process_list(void) for (i=0; i < length; i += 4) { rdp_cmd_data[rdp_cmd_ptr++] = READ_RDP_DATA(dp_current + i); + if (rdp_cmd_ptr >= 0x1000) + { + fatalerror("rdp_process_list: rdp_cmd_ptr overflow\n"); + } } dp_current = dp_end; @@ -1794,18 +3423,23 @@ void rdp_process_list(void) while (rdp_cmd_cur < rdp_cmd_ptr) { cmd = (rdp_cmd_data[rdp_cmd_cur] >> 24) & 0x3f; + // if (((rdp_cmd_data[rdp_cmd_cur] >> 24) & 0xc0) != 0xc0) + // { + // fatalerror("rdp_process_list: invalid rdp command %08X at %08X\n", rdp_cmd_data[rdp_cmd_cur], dp_start+(rdp_cmd_cur * 4)); + // } + + if (((rdp_cmd_ptr-rdp_cmd_cur) * 4) < rdp_command_length[cmd]) + { + //return; + fatalerror("rdp_process_list: not enough rdp command data: cur = %d, ptr = %d, expected = %d\n", rdp_cmd_cur, rdp_cmd_ptr, rdp_command_length[cmd]); + } #if LOG_RDP_EXECUTION { char string[4000]; - int l = rdp_dasm(string); + rdp_dasm(string); fprintf(rdp_exec, "%08X: %08X %08X %s\n", dp_start+(rdp_cmd_cur * 4), rdp_cmd_data[rdp_cmd_cur+0], rdp_cmd_data[rdp_cmd_cur+1], string); - - if (l < cmd_length) - { - fprintf(rdp_exec, "%08X extra words...\n", cmd_length-l); - } } #endif diff --git a/src/vidhrdw/n8080.c b/src/vidhrdw/n8080.c index be6d4ede9..5516831e9 100644 --- a/src/vidhrdw/n8080.c +++ b/src/vidhrdw/n8080.c @@ -37,12 +37,7 @@ PALETTE_INIT( n8080 ) int i; for (i = 0; i < 8; i++) - { - palette_set_color(i, - (i & 1) ? 255 : 0, - (i & 2) ? 255 : 0, - (i & 4) ? 255 : 0); - } + palette_set_color(machine,i,pal1bit(i >> 0),pal1bit(i >> 1),pal1bit(i >> 2)); } @@ -50,17 +45,17 @@ PALETTE_INIT( helifire ) { int i; - palette_init_n8080(NULL, NULL); + palette_init_n8080(machine, NULL, NULL); for (i = 0; i < 0x100; i++) { int level = 0xff * exp(-3 * i / 255.); /* capacitor discharge */ - palette_set_color(0x000 + 8 + i, 0x00, 0x00, level); /* shades of blue */ - palette_set_color(0x100 + 8 + i, 0x00, 0xC0, level); /* shades of blue w/ green star */ + palette_set_color(machine,0x000 + 8 + i, 0x00, 0x00, level); /* shades of blue */ + palette_set_color(machine,0x100 + 8 + i, 0x00, 0xC0, level); /* shades of blue w/ green star */ - palette_set_color(0x200 + 8 + i, level, 0x00, 0x00); /* shades of red */ - palette_set_color(0x300 + 8 + i, level, 0xC0, 0x00); /* shades of red w/ green star */ + palette_set_color(machine,0x200 + 8 + i, level, 0x00, 0x00); /* shades of red */ + palette_set_color(machine,0x300 + 8 + i, level, 0xC0, 0x00); /* shades of red w/ green star */ } } @@ -402,7 +397,7 @@ VIDEO_EOF( helifire ) } } - palette_set_color(i, + palette_set_color(machine,i, R ? 255 : 0, G ? 255 : 0, B ? 255 : 0); diff --git a/src/vidhrdw/namcofl.c b/src/vidhrdw/namcofl.c index 7c41fdaba..54924be05 100644 --- a/src/vidhrdw/namcofl.c +++ b/src/vidhrdw/namcofl.c @@ -69,7 +69,7 @@ namcofl_install_palette( void ) for( byte_offset=0; byte_offset<4; byte_offset++ ) { - palette_set_color( pen++, r&0xff, g&0xff, b&0xff); + palette_set_color( Machine, pen++, r&0xff, g&0xff, b&0xff); r>>=8; g>>=8; b>>=8; } } @@ -145,7 +145,7 @@ VIDEO_UPDATE( namcofl ) handle_mcu(); namcofl_install_palette(); - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); for( pri=0; pri<16; pri++ ) { diff --git a/src/vidhrdw/namcona1.c b/src/vidhrdw/namcona1.c index a42801e2d..1efe93f58 100644 --- a/src/vidhrdw/namcona1.c +++ b/src/vidhrdw/namcona1.c @@ -79,20 +79,11 @@ static void UpdatePalette( int offset ) { UINT16 color; - int r,g,b; color = paletteram16[offset]; /* -RRRRRGGGGGBBBBB */ - r = (color>>10)&0x1f; - g = (color>>5)&0x1f; - b = (color)&0x1f; - - r = (r<<3)|(r>>2); - g = (g<<3)|(g>>2); - b = (b<<3)|(b>>2); - - palette_set_color( offset, r,g,b ); + palette_set_color( Machine, offset, pal5bit(color >> 10), pal5bit(color >> 5), pal5bit(color >> 0)); } /* namcona1_paletteram_w */ READ16_HANDLER( namcona1_paletteram_r ) diff --git a/src/vidhrdw/namconb1.c b/src/vidhrdw/namconb1.c index 53d38d6e5..6fdd40b0a 100644 --- a/src/vidhrdw/namconb1.c +++ b/src/vidhrdw/namconb1.c @@ -95,7 +95,7 @@ namconb1_install_palette( void ) for( byte_offset=0; byte_offset<4; byte_offset++ ) { - palette_set_color( pen++, r>>24, g>>24, b>>24 ); + palette_set_color( Machine, pen++, r>>24, g>>24, b>>24 ); r<<=8; g<<=8; b<<=8; } } @@ -159,7 +159,7 @@ handle_mcu( void ) } /* handle_mcu */ static void -video_update_common( mame_bitmap *bitmap, const rectangle *cliprect, int bROZ ) +video_update_common(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int bROZ ) { int pri; handle_mcu(); @@ -207,9 +207,9 @@ VIDEO_UPDATE( namconb1 ) 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; } - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); - video_update_common( bitmap, &clip, 0 ); + video_update_common( machine, bitmap, &clip, 0 ); if( namcos2_gametype == NAMCONB1_GUNBULET ) { @@ -260,14 +260,14 @@ VIDEO_UPDATE( namconb2 ) 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; } - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); if( memcmp(tilemap_tile_bank,namconb1_tilebank32,sizeof(tilemap_tile_bank))!=0 ) { namco_tilemap_invalidate(); memcpy(tilemap_tile_bank,namconb1_tilebank32,sizeof(tilemap_tile_bank)); } - video_update_common( bitmap, &clip, 1 ); + video_update_common( machine, bitmap, &clip, 1 ); return 0; } diff --git a/src/vidhrdw/namcos1.c b/src/vidhrdw/namcos1.c index 6fd10bfaf..1ebbd2779 100644 --- a/src/vidhrdw/namcos1.c +++ b/src/vidhrdw/namcos1.c @@ -135,14 +135,14 @@ VIDEO_START( namcos1 ) memset(namcos1_paletteram, 0, 0x8000); memset(namcos1_cus116, 0, 0x10); for (i = 0; i < 0x2000; i++) - palette_set_color(i, 0, 0, 0); + palette_set_color(machine, i, 0, 0, 0); /* all palette entries are not affected by shadow sprites... */ for (i = 0;i < 0x2000;i++) - palette_shadow_table[Machine->pens[i]] = Machine->pens[i]; + machine->shadow_table[machine->pens[i]] = machine->pens[i]; /* ... except for tilemap colors */ for (i = 0x0800;i < 0x1000;i++) - palette_shadow_table[Machine->pens[i]] = Machine->pens[i + 0x0800]; + machine->shadow_table[machine->pens[i]] = machine->pens[i + 0x0800]; spriteram = &namcos1_spriteram[0x800]; @@ -200,7 +200,7 @@ WRITE8_HANDLER( namcos1_paletteram_w ) r = namcos1_paletteram[offset]; g = namcos1_paletteram[offset + 0x0800]; b = namcos1_paletteram[offset + 0x1000]; - palette_set_color(color,r,g,b); + palette_set_color(Machine,color,r,g,b); } else { @@ -354,7 +354,7 @@ VIDEO_UPDATE( namcos1 ) /* background color */ - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); /* berabohm uses asymmetrical visibility windows to iris on the character */ i = ((namcos1_cus116[0] << 8) | namcos1_cus116[1]) - 1; // min x diff --git a/src/vidhrdw/namcos2.c b/src/vidhrdw/namcos2.c index 0c2dc470f..be1388317 100644 --- a/src/vidhrdw/namcos2.c +++ b/src/vidhrdw/namcos2.c @@ -286,7 +286,7 @@ UpdatePalette( void ) int r = namcos2_68k_palette_ram[offset | 0x0000] & 0x00ff; int g = namcos2_68k_palette_ram[offset | 0x0800] & 0x00ff; int b = namcos2_68k_palette_ram[offset | 0x1000] & 0x00ff; - palette_set_color(pen++,r,g,b); + palette_set_color(Machine,pen++,r,g,b); offset++; } } @@ -307,7 +307,7 @@ DrawSpriteInit( void ) gfx_drawmode_table[255] = DRAWMODE_NONE; for( i = 0; i<16*256; i++ ) { - palette_shadow_table[i] = i+0x2000; + Machine->shadow_table[i] = i+0x2000; } } @@ -405,7 +405,7 @@ VIDEO_UPDATE( namcos2_default ) int pri; UpdatePalette(); - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); ApplyClip( &clip, cliprect ); /* HACK: enable ROZ layer only if it has priority > 0 */ @@ -447,7 +447,7 @@ VIDEO_UPDATE( finallap ) int pri; UpdatePalette(); - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); ApplyClip( &clip, cliprect ); for( pri=0; pri<16; pri++ ) @@ -488,7 +488,7 @@ VIDEO_UPDATE( luckywld ) int pri; UpdatePalette(); - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); ApplyClip( &clip, cliprect ); for( pri=0; pri<16; pri++ ) @@ -526,7 +526,7 @@ VIDEO_UPDATE( sgunner ) int pri; UpdatePalette(); - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); ApplyClip( &clip, cliprect ); for( pri=0; pri<8; pri++ ) @@ -557,7 +557,7 @@ VIDEO_UPDATE( metlhawk ) int pri; UpdatePalette(); - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); ApplyClip( &clip, cliprect ); for( pri=0; pri<16; pri++ ) diff --git a/src/vidhrdw/namcos21.c b/src/vidhrdw/namcos21.c index a599ae394..64728447b 100644 --- a/src/vidhrdw/namcos21.c +++ b/src/vidhrdw/namcos21.c @@ -135,7 +135,7 @@ update_palette( void ) g = data1&0xff; b = data2&0xff; - palette_set_color( i, r,g,b ); + palette_set_color( Machine,i, r,g,b ); } } /* update_palette */ @@ -147,7 +147,7 @@ VIDEO_UPDATE( namcos21_default ) update_palette(); /* paint background */ - fillbitmap( bitmap, get_black_pen(), cliprect ); + fillbitmap( bitmap, get_black_pen(machine), cliprect ); /* draw low priority 2d sprites */ for( pri=0; pri> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/naughtyb.c b/src/vidhrdw/naughtyb.c index 517c00eec..6972ba91f 100644 --- a/src/vidhrdw/naughtyb.c +++ b/src/vidhrdw/naughtyb.c @@ -107,7 +107,7 @@ PALETTE_INIT( naughtyb ) /*b = 0x55 * bit0 + 0xaa * bit1;*/ b = combine_2_weights(weights_b, bit0, bit1); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/nbmj8688.c b/src/vidhrdw/nbmj8688.c index 69ab1bb88..ad06efc44 100644 --- a/src/vidhrdw/nbmj8688.c +++ b/src/vidhrdw/nbmj8688.c @@ -85,7 +85,7 @@ PALETTE_INIT( mbmj8688_8bit ) bit2 = ((i >> 7) & 0x01); b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); } } @@ -102,11 +102,7 @@ PALETTE_INIT( mbmj8688_12bit ) g = ((i & 0x38) >> 2) | (((i >> 8) & 0x02) >> 1); b = ((i & 0xc0) >> 4) | (((i >> 8) & 0x0c) >> 2); - r = ((r << 4) | r); - g = ((g << 4) | g); - b = ((b << 4) | b); - - palette_set_color(i, r, g, b); + palette_set_color(machine, i, pal4bit(r), pal4bit(g), pal4bit(b)); } } @@ -122,11 +118,7 @@ PALETTE_INIT( mbmj8688_16bit ) g = (((i & 0x3800) >> 9) | ((i & 0x0018) >> 3)); // G 5bit b = (((i & 0xc000) >> 11) | ((i & 0x00e0) >> 5)); // B 5bit - r = ((r << 2) | (r >> 4)); - g = ((g << 3) | (g >> 2)); - b = ((b << 3) | (b >> 2)); - - palette_set_color(i, r, g, b); + palette_set_color(machine, i, pal6bit(r), pal5bit(g), pal5bit(b)); } } @@ -723,7 +715,7 @@ VIDEO_UPDATE( mbmj8688_LCD ) { int x, y, b; - if(screen==0) video_update_mbmj8688(screen,bitmap,cliprect); + if(screen==0) video_update_mbmj8688(machine,screen,bitmap,cliprect); if (screen==1) { diff --git a/src/vidhrdw/nbmj8891.c b/src/vidhrdw/nbmj8891.c index 44bde78dc..d0164f104 100644 --- a/src/vidhrdw/nbmj8891.c +++ b/src/vidhrdw/nbmj8891.c @@ -52,15 +52,11 @@ WRITE8_HANDLER( nbmj8891_palette_type1_w ) offset &= 0x1fe; - r = ((nbmj8891_palette[offset + 0] & 0x0f) << 4); - g = ((nbmj8891_palette[offset + 1] & 0xf0) << 0); - b = ((nbmj8891_palette[offset + 1] & 0x0f) << 4); + r = ((nbmj8891_palette[offset + 0] & 0x0f) >> 0); + g = ((nbmj8891_palette[offset + 1] & 0xf0) >> 4); + b = ((nbmj8891_palette[offset + 1] & 0x0f) >> 0); - r = (r | (r >> 4)); - g = (g | (g >> 4)); - b = (b | (b >> 4)); - - palette_set_color((offset >> 1), r, g, b); + palette_set_color(Machine, (offset >> 1), pal4bit(r), pal4bit(g), pal4bit(b)); } READ8_HANDLER( nbmj8891_palette_type2_r ) @@ -78,15 +74,11 @@ WRITE8_HANDLER( nbmj8891_palette_type2_w ) offset &= 0x0ff; - r = ((nbmj8891_palette[offset + 0x000] & 0x0f) << 4); - g = ((nbmj8891_palette[offset + 0x000] & 0xf0) << 0); - b = ((nbmj8891_palette[offset + 0x100] & 0x0f) << 4); - - r = (r | (r >> 4)); - g = (g | (g >> 4)); - b = (b | (b >> 4)); + r = ((nbmj8891_palette[offset + 0x000] & 0x0f) >> 0); + g = ((nbmj8891_palette[offset + 0x000] & 0xf0) >> 4); + b = ((nbmj8891_palette[offset + 0x100] & 0x0f) >> 0); - palette_set_color((offset & 0x0ff), r, g, b); + palette_set_color(Machine, (offset & 0x0ff), pal4bit(r), pal4bit(g), pal4bit(b)); } READ8_HANDLER( nbmj8891_palette_type3_r ) @@ -104,15 +96,11 @@ WRITE8_HANDLER( nbmj8891_palette_type3_w ) offset &= 0x1fe; - r = ((nbmj8891_palette[offset + 1] & 0x0f) << 4); - g = ((nbmj8891_palette[offset + 0] & 0xf0) << 0); - b = ((nbmj8891_palette[offset + 0] & 0x0f) << 4); - - r = (r | (r >> 4)); - g = (g | (g >> 4)); - b = (b | (b >> 4)); + r = ((nbmj8891_palette[offset + 1] & 0x0f) >> 0); + g = ((nbmj8891_palette[offset + 0] & 0xf0) >> 4); + b = ((nbmj8891_palette[offset + 0] & 0x0f) >> 0); - palette_set_color((offset >> 1), r, g, b); + palette_set_color(Machine, (offset >> 1), pal4bit(r), pal4bit(g), pal4bit(b)); } WRITE8_HANDLER( nbmj8891_clutsel_w ) diff --git a/src/vidhrdw/nbmj8991.c b/src/vidhrdw/nbmj8991.c index 357640a52..9026fbf7b 100644 --- a/src/vidhrdw/nbmj8991.c +++ b/src/vidhrdw/nbmj8991.c @@ -46,15 +46,11 @@ WRITE8_HANDLER( nbmj8991_palette_type1_w ) offset &= 0x1fe; - r = ((paletteram[offset + 0] & 0x0f) << 4); - g = ((paletteram[offset + 1] & 0xf0) << 0); - b = ((paletteram[offset + 1] & 0x0f) << 4); + r = ((paletteram[offset + 0] & 0x0f) >> 0); + g = ((paletteram[offset + 1] & 0xf0) >> 4); + b = ((paletteram[offset + 1] & 0x0f) >> 0); - r = (r | (r >> 4)); - g = (g | (g >> 4)); - b = (b | (b >> 4)); - - palette_set_color((offset >> 1), r, g, b); + palette_set_color(Machine, (offset >> 1), pal4bit(r), pal4bit(g), pal4bit(b)); } WRITE8_HANDLER( nbmj8991_palette_type2_w ) @@ -71,11 +67,7 @@ WRITE8_HANDLER( nbmj8991_palette_type2_w ) g = (((paletteram[offset + 0] & 0x03) << 3) | ((paletteram[offset + 1] & 0xe0) >> 5)); b = ((paletteram[offset + 1] & 0x1f) >> 0); - r = ((r << 3) | (r >> 2)); - g = ((g << 3) | (g >> 2)); - b = ((b << 3) | (b >> 2)); - - palette_set_color((offset / 2), r, g, b); + palette_set_color(Machine, (offset / 2), pal5bit(r), pal5bit(g), pal5bit(b)); } WRITE8_HANDLER( nbmj8991_palette_type3_w ) @@ -88,15 +80,11 @@ WRITE8_HANDLER( nbmj8991_palette_type3_w ) offset &= 0x1fe; - r = ((paletteram[offset + 1] & 0x0f) << 4); - g = ((paletteram[offset + 0] & 0xf0) << 0); - b = ((paletteram[offset + 0] & 0x0f) << 4); - - r = (r | (r >> 4)); - g = (g | (g >> 4)); - b = (b | (b >> 4)); + r = ((paletteram[offset + 1] & 0x0f) >> 0); + g = ((paletteram[offset + 0] & 0xf0) >> 4); + b = ((paletteram[offset + 0] & 0x0f) >> 0); - palette_set_color((offset >> 1), r, g, b); + palette_set_color(Machine, (offset >> 1), pal4bit(r), pal4bit(g), pal4bit(b)); } /****************************************************************************** diff --git a/src/vidhrdw/nbmj9195.c b/src/vidhrdw/nbmj9195.c index c1b3fb824..f1a0cfbf9 100644 --- a/src/vidhrdw/nbmj9195.c +++ b/src/vidhrdw/nbmj9195.c @@ -64,15 +64,11 @@ WRITE8_HANDLER( nbmj9195_palette_w ) { offset &= 0x1fe; - r = ((nbmj9195_palette[offset + 0] & 0x0f) << 4); - g = ((nbmj9195_palette[offset + 0] & 0xf0) << 0); - b = ((nbmj9195_palette[offset + 1] & 0x0f) << 4); + r = ((nbmj9195_palette[offset + 0] & 0x0f) >> 0); + g = ((nbmj9195_palette[offset + 0] & 0xf0) >> 4); + b = ((nbmj9195_palette[offset + 1] & 0x0f) >> 0); - r = (r | (r >> 4)); - g = (g | (g >> 4)); - b = (b | (b >> 4)); - - palette_set_color((offset >> 1), r, g, b); + palette_set_color(Machine, (offset >> 1), pal4bit(r), pal4bit(g), pal4bit(b)); } } @@ -95,7 +91,7 @@ WRITE8_HANDLER( nbmj9195_nb22090_palette_w ) g = nbmj9195_nb22090_palette[(0x100 + (offs_h * 0x300) + offs_l)]; b = nbmj9195_nb22090_palette[(0x200 + (offs_h * 0x300) + offs_l)]; - palette_set_color(((offs_h * 0x100) + offs_l), r, g, b); + palette_set_color(Machine, ((offs_h * 0x100) + offs_l), r, g, b); } /****************************************************************************** diff --git a/src/vidhrdw/nemesis.c b/src/vidhrdw/nemesis.c index fd97760c7..a36a46bd2 100644 --- a/src/vidhrdw/nemesis.c +++ b/src/vidhrdw/nemesis.c @@ -138,27 +138,16 @@ WRITE16_HANDLER( nemesis_palette_word_w ) bit5=(data >> 14)&1; b = MULTIPLIER; - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } WRITE16_HANDLER( salamander_palette_word_w ) { - int r,g,b; - COMBINE_DATA(paletteram16 + offset); offset &= ~1; data = ((paletteram16[offset] << 8) & 0xff00) | (paletteram16[offset+1] & 0xff); - - r = (data >> 0) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 10) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset / 2,r,g,b); + palette_set_color(Machine,offset / 2,pal5bit(data >> 0),pal5bit(data >> 5),pal5bit(data >> 10)); } WRITE16_HANDLER( nemesis_videoram1b_word_w ) diff --git a/src/vidhrdw/neogeo.c b/src/vidhrdw/neogeo.c index 10b44a58e..78b50ceac 100644 --- a/src/vidhrdw/neogeo.c +++ b/src/vidhrdw/neogeo.c @@ -312,11 +312,7 @@ static void set_palettebank_on_postload(void) g = ((newword >> 3) & 0x1e) | ((newword >> 13) & 0x01); b = ((newword << 1) & 0x1e) | ((newword >> 12) & 0x01); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(i, r, g, b); + palette_set_color(Machine, i, pal5bit(r), pal5bit(g), pal5bit(b)); } } @@ -384,11 +380,7 @@ static void swap_palettes(void) g = ((newword >> 3) & 0x1e) | ((newword >> 13) & 0x01); b = ((newword << 1) & 0x1e) | ((newword >> 12) & 0x01); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(i, r, g, b); + palette_set_color(Machine, i, pal5bit(r), pal5bit(g), pal5bit(b)); } } @@ -438,11 +430,7 @@ WRITE16_HANDLER( neogeo_paletteram16_w ) g = ((newword >> 3) & 0x1e) | ((newword >> 13) & 0x01) ; b = ((newword << 1) & 0x1e) | ((newword >> 12) & 0x01) ; - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal5bit(r), pal5bit(g), pal5bit(b)); } /******************************************************************************/ diff --git a/src/vidhrdw/ninjaw.c b/src/vidhrdw/ninjaw.c index 9c15fea01..9713a11a2 100644 --- a/src/vidhrdw/ninjaw.c +++ b/src/vidhrdw/ninjaw.c @@ -55,7 +55,7 @@ static VIDEO_START( ninjaw_core ) VIDEO_START( ninjaw ) { taito_hide_pixels = 22; - return video_start_ninjaw_core(); + return video_start_ninjaw_core(machine); } /************************************************************ @@ -160,7 +160,7 @@ VIDEO_UPDATE( ninjaw ) nodraw = TC0100SCN_tilemap_draw(bitmap,cliprect,screen,layer[0],TILEMAP_IGNORE_TRANSPARENCY,0); /* left */ /* Ensure screen blanked even when bottom layers not drawn due to disable bit */ - if (nodraw) fillbitmap(bitmap, get_black_pen(), cliprect); + if (nodraw) fillbitmap(bitmap, get_black_pen(machine), cliprect); /* Sprites can be under/over the layer below text layer */ ninjaw_draw_sprites(bitmap,cliprect,1,xoffs,8); // draw sprites with priority 1 which are under the mid layer diff --git a/src/vidhrdw/niyanpai.c b/src/vidhrdw/niyanpai.c index ffbca1b7b..04e35d00a 100644 --- a/src/vidhrdw/niyanpai.c +++ b/src/vidhrdw/niyanpai.c @@ -67,7 +67,7 @@ WRITE16_HANDLER( niyanpai_palette_w ) g = ((niyanpai_palette[(0x080 + (offs_h * 0x180) + offs_l)] & 0xff00) >> 8); b = ((niyanpai_palette[(0x100 + (offs_h * 0x180) + offs_l)] & 0xff00) >> 8); - palette_set_color(((offs_h << 8) + (offs_l << 1) + 0), r, g, b); + palette_set_color(Machine, ((offs_h << 8) + (offs_l << 1) + 0), r, g, b); } if (ACCESSING_LSB16) @@ -76,7 +76,7 @@ WRITE16_HANDLER( niyanpai_palette_w ) g = ((niyanpai_palette[(0x080 + (offs_h * 0x180) + offs_l)] & 0x00ff) >> 0); b = ((niyanpai_palette[(0x100 + (offs_h * 0x180) + offs_l)] & 0x00ff) >> 0); - palette_set_color(((offs_h << 8) + (offs_l << 1) + 1), r, g, b); + palette_set_color(Machine, ((offs_h << 8) + (offs_l << 1) + 1), r, g, b); } } } diff --git a/src/vidhrdw/nmk16.c b/src/vidhrdw/nmk16.c index f60bd76aa..5bfefdd25 100644 --- a/src/vidhrdw/nmk16.c +++ b/src/vidhrdw/nmk16.c @@ -839,7 +839,7 @@ VIDEO_UPDATE( gunnail ) } tilemap_set_scrolly(bg_tilemap,0,gunnail_scrolly); - video_update_macross(screen,bitmap,cliprect); + video_update_macross(machine,screen,bitmap,cliprect); return 0; } diff --git a/src/vidhrdw/nova2001.c b/src/vidhrdw/nova2001.c index 37a6f32c8..c9eb9e1aa 100644 --- a/src/vidhrdw/nova2001.c +++ b/src/vidhrdw/nova2001.c @@ -56,7 +56,7 @@ PALETTE_INIT( nova2001 ) /* blue component */ b = (((*color_prom >> 4) & 0x0c) | intensity) * 0x11; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/nycaptor.c b/src/vidhrdw/nycaptor.c index 9fa340299..00e8a7e41 100644 --- a/src/vidhrdw/nycaptor.c +++ b/src/vidhrdw/nycaptor.c @@ -80,7 +80,7 @@ VIDEO_START( nycaptor ) paletteram = auto_malloc(0x200); paletteram_2 = auto_malloc(0x200); tilemap_set_scroll_cols(bg_tilemap,32); - return video_start_generic(); + return video_start_generic(machine); } WRITE8_HANDLER( nycaptor_videoram_w ) diff --git a/src/vidhrdw/nyny.c b/src/vidhrdw/nyny.c index dad09102f..784c8f2bc 100644 --- a/src/vidhrdw/nyny.c +++ b/src/vidhrdw/nyny.c @@ -22,7 +22,7 @@ PALETTE_INIT( nyny ) for (i = 0;i < Machine->drv->total_colors;i++) { - palette_set_color(i,((i >> 0) & 1) * 0xff,((i >> 1) & 1) * 0xff,((i >> 2) & 1) * 0xff); + palette_set_color(machine,i,pal1bit(i >> 0),pal1bit(i >> 1),pal1bit(i >> 2)); } } diff --git a/src/vidhrdw/ojankohs.c b/src/vidhrdw/ojankohs.c index b4c76b777..682d0b10c 100644 --- a/src/vidhrdw/ojankohs.c +++ b/src/vidhrdw/ojankohs.c @@ -55,7 +55,7 @@ PALETTE_INIT( ojankoy ) bit4 = (color_prom[Machine->drv->total_colors] >> 4) & 0x01; b = 0x08 * bit0 + 0x11 * bit1 + 0x21 * bit2 + 0x43 * bit3 + 0x82 * bit4; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); color_prom++; } } @@ -78,11 +78,7 @@ WRITE8_HANDLER( ojankohs_palette_w ) ((ojankohs_paletteram[offset + 1] & 0xe0) >> 5); b = (ojankohs_paletteram[offset + 1] & 0x1f) >> 0; - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset >> 1, r, g, b); + palette_set_color(Machine,offset >> 1, pal5bit(r), pal5bit(g), pal5bit(b)); } WRITE8_HANDLER( ccasino_palette_w ) @@ -101,11 +97,7 @@ WRITE8_HANDLER( ccasino_palette_w ) ((ojankohs_paletteram[offset + 1] & 0xe0) >> 5); b = (ojankohs_paletteram[offset + 1] & 0x1f) >> 0; - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset >> 1, r, g, b); + palette_set_color(Machine,offset >> 1, pal5bit(r), pal5bit(g), pal5bit(b)); } WRITE8_HANDLER( ojankoc_palette_w ) @@ -123,11 +115,7 @@ WRITE8_HANDLER( ojankoc_palette_w ) g = (color >> 5) & 0x1f; b = (color >> 0) & 0x1f; - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset >> 1, r, g, b); + palette_set_color(Machine,offset >> 1, pal5bit(r), pal5bit(g), pal5bit(b)); } diff --git a/src/vidhrdw/oneshot.c b/src/vidhrdw/oneshot.c index 710b1ae6f..a97c31d6d 100644 --- a/src/vidhrdw/oneshot.c +++ b/src/vidhrdw/oneshot.c @@ -185,7 +185,7 @@ static void oneshot_drawsprites( mame_bitmap *bitmap, const rectangle *cliprect VIDEO_UPDATE( oneshot ) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); tilemap_set_scrollx(oneshot_mid_tilemap,0, oneshot_scroll[0]-0x1f5); tilemap_set_scrolly(oneshot_mid_tilemap,0, oneshot_scroll[1]); @@ -200,7 +200,7 @@ VIDEO_UPDATE( oneshot ) VIDEO_UPDATE( maddonna ) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); tilemap_set_scrolly(oneshot_mid_tilemap,0, oneshot_scroll[1]); // other registers aren't used so we don't know which layers they relate to diff --git a/src/vidhrdw/othunder.c b/src/vidhrdw/othunder.c index f35d23da8..1b0252542 100644 --- a/src/vidhrdw/othunder.c +++ b/src/vidhrdw/othunder.c @@ -46,7 +46,7 @@ VIDEO_START( othunder ) alignment, but the bg layers [or one of them] are wrong */ taito_hide_pixels = 4; - return video_start_othunder_core(); + return video_start_othunder_core(machine); } diff --git a/src/vidhrdw/pacland.c b/src/vidhrdw/pacland.c index 2f05bc368..314e3a55c 100644 --- a/src/vidhrdw/pacland.c +++ b/src/vidhrdw/pacland.c @@ -64,7 +64,7 @@ static int scroll0,scroll1; ***************************************************************************/ -static void switch_palette(void) +static void switch_palette(running_machine *machine) { int i; const UINT8 *color_prom = pacland_color_prom + 256 * palette_bank; @@ -92,7 +92,7 @@ static void switch_palette(void) color_prom++; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } @@ -123,7 +123,7 @@ PALETTE_INIT( pacland ) } palette_bank = 0; - switch_palette(); + switch_palette(machine); } @@ -236,7 +236,7 @@ WRITE8_HANDLER( pacland_bankswitch_w ) if (palette_bank != ((data & 0x18) >> 3)) { palette_bank = (data & 0x18) >> 3; - switch_palette(); + switch_palette(Machine); } } diff --git a/src/vidhrdw/pacman.c b/src/vidhrdw/pacman.c index 4646f85e9..8f6ab9a33 100644 --- a/src/vidhrdw/pacman.c +++ b/src/vidhrdw/pacman.c @@ -100,7 +100,7 @@ PALETTE_INIT( pacman ) bit1 = (color_prom[i] >> 6) & 0x01; bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } /* color_prom now points to the beginning of the lookup table */ @@ -348,7 +348,7 @@ Van Van WRITE8_HANDLER( vanvan_bgcolor_w ) { int c = 0xaa * (data & 1); - palette_set_color(0,c,c,c); + palette_set_color(Machine,0,c,c,c); } diff --git a/src/vidhrdw/pandoras.c b/src/vidhrdw/pandoras.c index 242f90136..164b5cc76 100644 --- a/src/vidhrdw/pandoras.c +++ b/src/vidhrdw/pandoras.c @@ -50,7 +50,7 @@ PALETTE_INIT( pandoras ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/paradise.c b/src/vidhrdw/paradise.c index 6026e9112..eb125ac69 100644 --- a/src/vidhrdw/paradise.c +++ b/src/vidhrdw/paradise.c @@ -53,9 +53,9 @@ WRITE8_HANDLER( paradise_palette_w ) { paletteram[offset] = data; offset %= 0x800; - palette_set_color(offset, paletteram[offset + 0x800 * 0], - paletteram[offset + 0x800 * 1], - paletteram[offset + 0x800 * 2] ); + palette_set_color(Machine,offset, paletteram[offset + 0x800 * 0], + paletteram[offset + 0x800 * 1], + paletteram[offset + 0x800 * 2] ); } /*************************************************************************** @@ -89,9 +89,9 @@ WRITE8_HANDLER( paradise_palbank_w ) int bank2 = (data & 0xf0); for (i = 0; i < 15; i++) - palette_set_color(0x800+i, paletteram[0x200 + bank2 + i + 0x800 * 0], - paletteram[0x200 + bank2 + i + 0x800 * 1], - paletteram[0x200 + bank2 + i + 0x800 * 2] ); + palette_set_color(Machine,0x800+i, paletteram[0x200 + bank2 + i + 0x800 * 0], + paletteram[0x200 + bank2 + i + 0x800 * 1], + paletteram[0x200 + bank2 + i + 0x800 * 2] ); if (paradise_palbank != bank1) { paradise_palbank = bank1; @@ -266,7 +266,7 @@ if (code_pressed(KEYCODE_Z)) } #endif - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); if (!(paradise_priority & 4)) /* Screen blanking */ return 0; @@ -296,7 +296,7 @@ if (code_pressed(KEYCODE_Z)) /* no pix layer, no tilemap_0, different priority bits */ VIDEO_UPDATE( torus ) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); if (!(paradise_priority & 2)) /* Screen blanking */ return 0; @@ -326,7 +326,7 @@ VIDEO_UPDATE( torus ) /* I don't know how the priority bits work on this one */ VIDEO_UPDATE( madball ) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); tilemap_draw(bitmap,cliprect, tilemap_0, 0,0); tilemap_draw(bitmap,cliprect, tilemap_1, 0,0); tilemap_draw(bitmap,cliprect, tilemap_2, 0,0); diff --git a/src/vidhrdw/pastelg.c b/src/vidhrdw/pastelg.c index be552cd35..b156959b8 100644 --- a/src/vidhrdw/pastelg.c +++ b/src/vidhrdw/pastelg.c @@ -56,7 +56,7 @@ PALETTE_INIT( pastelg ) bit3 = (color_prom[Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/pcktgal.c b/src/vidhrdw/pcktgal.c index fc4137b2e..3013d794b 100644 --- a/src/vidhrdw/pcktgal.c +++ b/src/vidhrdw/pcktgal.c @@ -26,7 +26,7 @@ PALETTE_INIT( pcktgal ) bit3 = (color_prom[i + Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/pgm.c b/src/vidhrdw/pgm.c index 4c97eeb36..db3af19fe 100644 --- a/src/vidhrdw/pgm.c +++ b/src/vidhrdw/pgm.c @@ -334,7 +334,7 @@ VIDEO_UPDATE( pgm ) { int y; - fillbitmap(bitmap,get_black_pen(),&Machine->screen[0].visarea); + fillbitmap(bitmap,get_black_pen(machine),&Machine->screen[0].visarea); pgm_sprite_source = pgm_spritebufferram; pgm_drawsprites(1, bitmap); diff --git a/src/vidhrdw/phoenix.c b/src/vidhrdw/phoenix.c index bf4c912c1..1e801fafe 100644 --- a/src/vidhrdw/phoenix.c +++ b/src/vidhrdw/phoenix.c @@ -63,7 +63,7 @@ PALETTE_INIT( phoenix ) bit1 = (color_prom[Machine->drv->total_colors] >> 1) & 0x01; b = 0x55 * bit0 + 0xaa * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -103,7 +103,7 @@ PALETTE_INIT( pleiads ) bit1 = (color_prom[Machine->drv->total_colors] >> 1) & 0x01; b = 0x55 * bit0 + 0xaa * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/pingpong.c b/src/vidhrdw/pingpong.c index 046fcd2e7..183707174 100644 --- a/src/vidhrdw/pingpong.c +++ b/src/vidhrdw/pingpong.c @@ -67,7 +67,7 @@ PALETTE_INIT( pingpong ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/pitnrun.c b/src/vidhrdw/pitnrun.c index d74fdb65d..5193d6ad1 100644 --- a/src/vidhrdw/pitnrun.c +++ b/src/vidhrdw/pitnrun.c @@ -148,7 +148,7 @@ PALETTE_INIT (pitnrun) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } /* fake bg palette for lightning effect*/ @@ -170,7 +170,7 @@ PALETTE_INIT (pitnrun) g/=3; b/=3; - palette_set_color(i+16,(r>0xff)?0xff:r,(g>0xff)?0xff:g,(b>0xff)?0xff:b); + palette_set_color(machine,i+16,(r>0xff)?0xff:r,(g>0xff)?0xff:g,(b>0xff)?0xff:b); } } @@ -185,7 +185,7 @@ VIDEO_START(pitnrun) tmp_bitmap[2] = auto_bitmap_alloc(128,128); tmp_bitmap[3] = auto_bitmap_alloc(128,128); pitnrun_spotlights(); - return video_start_generic(); + return video_start_generic(machine); } static void pitnrun_draw_sprites( mame_bitmap *bitmap, const rectangle *cliprect ) diff --git a/src/vidhrdw/pktgaldx.c b/src/vidhrdw/pktgaldx.c index bd953269d..57d5d86a3 100644 --- a/src/vidhrdw/pktgaldx.c +++ b/src/vidhrdw/pktgaldx.c @@ -113,7 +113,7 @@ VIDEO_UPDATE(pktgaldb) int tileno; int colour; - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); /* the bootleg seems to treat the tilemaps as sprites */ for (offset = 0;offset<0x1600/2;offset+=8) diff --git a/src/vidhrdw/playch10.c b/src/vidhrdw/playch10.c index ccff34ca0..2b89b7e09 100644 --- a/src/vidhrdw/playch10.c +++ b/src/vidhrdw/playch10.c @@ -1,5 +1,5 @@ #include "driver.h" -#include "vidhrdw/ppu2c03b.h" +#include "vidhrdw/ppu2c0x.h" /* from machine */ extern int pc10_sdcs; /* ShareD Chip Select */ @@ -57,12 +57,12 @@ PALETTE_INIT( playch10 ) b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } - ppu2c03b_init_palette( 256 ); + ppu2c0x_init_palette( 256 ); } static void ppu_irq( int num, int *ppu_regs ) @@ -73,10 +73,11 @@ static void ppu_irq( int num, int *ppu_regs ) /* our ppu interface */ /* things like mirroring and wether to use vrom or vram */ -/* can be set by calling 'ppu2c03b_override_hardware_options' */ +/* can be set by calling 'ppu2c0x_override_hardware_options' */ -static const ppu2c03b_interface ppu_interface = +static const ppu2c0x_interface ppu_interface = { + PPU_2C03B, /* type */ 1, /* num */ { REGION_GFX2 }, /* vrom gfx region */ { 1 }, /* gfxlayout num */ @@ -102,7 +103,7 @@ VIDEO_START( playch10 ) if ( !bg_tilemap ) return 1; - ppu2c03b_init( &ppu_interface ); + ppu2c0x_init( &ppu_interface ); return 0; } @@ -129,7 +130,7 @@ VIDEO_UPDATE( playch10 ) if ( !pc10_dispmask ) { /* render the ppu */ - ppu2c03b_render( 0, bitmap, 0, 0, 0, 0 ); + ppu2c0x_render( 0, bitmap, 0, 0, 0, 0 ); /* if this is a gun game, draw a simple crosshair */ if ( pc10_gun_controller ) @@ -171,7 +172,7 @@ VIDEO_UPDATE( playch10 ) if ( pc10_game_mode ) { /* render the ppu */ - ppu2c03b_render( 0, bitmap, 0, 0, 0, 0 ); + ppu2c0x_render( 0, bitmap, 0, 0, 0, 0 ); /* if this is a gun game, draw a simple crosshair */ if ( pc10_gun_controller ) diff --git a/src/vidhrdw/playmark.c b/src/vidhrdw/playmark.c index 53b3d888a..27225ef8a 100644 --- a/src/vidhrdw/playmark.c +++ b/src/vidhrdw/playmark.c @@ -281,11 +281,7 @@ WRITE16_HANDLER( bigtwin_paletteram_w ) g |= ((val & 0x04) >> 2); b |= ((val & 0x02) >> 1); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,pal5bit(r),pal5bit(g),pal5bit(b)); } WRITE16_HANDLER( bigtwin_scroll_w ) @@ -506,7 +502,7 @@ VIDEO_UPDATE( hrdtimes ) } else { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); } return 0; } diff --git a/src/vidhrdw/plygonet.c b/src/vidhrdw/plygonet.c index 538ce8a9c..269885713 100644 --- a/src/vidhrdw/plygonet.c +++ b/src/vidhrdw/plygonet.c @@ -103,7 +103,7 @@ VIDEO_START(polygonet_vh_start) VIDEO_UPDATE(polygonet_vh_screenrefresh) { fillbitmap(priority_bitmap, 0, NULL); - fillbitmap(bitmap, get_black_pen(), &Machine->screen[0].visarea); + fillbitmap(bitmap, get_black_pen(machine), &Machine->screen[0].visarea); tilemap_draw(bitmap, cliprect, ttl_tilemap, 0, 1<<0); return 0; diff --git a/src/vidhrdw/polepos.c b/src/vidhrdw/polepos.c index fa1b139e4..a542ca13e 100644 --- a/src/vidhrdw/polepos.c +++ b/src/vidhrdw/polepos.c @@ -83,7 +83,7 @@ PALETTE_INIT( polepos ) bit3 = (color_prom[0x200 + i] >> 3) & 1; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } /******************************************************* diff --git a/src/vidhrdw/policetr.c b/src/vidhrdw/policetr.c index 23badf2b0..1d5f4edbe 100644 --- a/src/vidhrdw/policetr.c +++ b/src/vidhrdw/policetr.c @@ -339,7 +339,7 @@ WRITE32_HANDLER( policetr_palette_data_w ) palette_data[palette_index] = (data >> 16) & 0xff; if (++palette_index == 3) { - palette_set_color(palette_offset, palette_data[0], palette_data[1], palette_data[2]); + palette_set_color(Machine, palette_offset, palette_data[0], palette_data[1], palette_data[2]); palette_index = 0; } } diff --git a/src/vidhrdw/polyplay.c b/src/vidhrdw/polyplay.c index b6dbff11f..6140cada0 100644 --- a/src/vidhrdw/polyplay.c +++ b/src/vidhrdw/polyplay.c @@ -18,17 +18,17 @@ static unsigned char dirtycharacter[256]; PALETTE_INIT( polyplay ) { - palette_set_color(0,0x00,0x00,0x00); - palette_set_color(1,0xff,0xff,0xff); - - palette_set_color(2,0x00,0x00,0x00); - palette_set_color(3,0xff,0x00,0x00); - palette_set_color(4,0x00,0xff,0x00); - palette_set_color(5,0xff,0xff,0x00); - palette_set_color(6,0x00,0x00,0xff); - palette_set_color(7,0xff,0x00,0xff); - palette_set_color(8,0x00,0xff,0xff); - palette_set_color(9,0xff,0xff,0xff); + palette_set_color(machine,0,0x00,0x00,0x00); + palette_set_color(machine,1,0xff,0xff,0xff); + + palette_set_color(machine,2,0x00,0x00,0x00); + palette_set_color(machine,3,0xff,0x00,0x00); + palette_set_color(machine,4,0x00,0xff,0x00); + palette_set_color(machine,5,0xff,0xff,0x00); + palette_set_color(machine,6,0x00,0x00,0xff); + palette_set_color(machine,7,0xff,0x00,0xff); + palette_set_color(machine,8,0x00,0xff,0xff); + palette_set_color(machine,9,0xff,0xff,0xff); } diff --git a/src/vidhrdw/pooyan.c b/src/vidhrdw/pooyan.c index 6af62467a..f5244f3fb 100644 --- a/src/vidhrdw/pooyan.c +++ b/src/vidhrdw/pooyan.c @@ -56,7 +56,7 @@ PALETTE_INIT( pooyan ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/popeye.c b/src/vidhrdw/popeye.c index 255799cd8..e487e7560 100644 --- a/src/vidhrdw/popeye.c +++ b/src/vidhrdw/popeye.c @@ -57,7 +57,7 @@ static tilemap *fg_tilemap; The bootleg is the same, but the outputs are not inverted. ***************************************************************************/ -static void convert_color_prom(unsigned short *colortable,const unsigned char *color_prom) +static void convert_color_prom(running_machine *machine,unsigned short *colortable,const unsigned char *color_prom) { int i,pal_index; @@ -89,7 +89,7 @@ static void convert_color_prom(unsigned short *colortable,const unsigned char *c bit2 = ((color_prom[prom_offs] ^ invertmask) >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(pal_index++,r,g,b); + palette_set_color(machine,pal_index++,r,g,b); } color_prom += 32; @@ -116,7 +116,7 @@ static void convert_color_prom(unsigned short *colortable,const unsigned char *c bit2 = ((color_prom[256] ^ invertmask) >> 3) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(pal_index++,r,g,b); + palette_set_color(machine,pal_index++,r,g,b); color_prom++; } @@ -140,17 +140,17 @@ PALETTE_INIT( popeye ) { invertmask = 0xff; - convert_color_prom(colortable,color_prom); + convert_color_prom(machine,colortable,color_prom); } PALETTE_INIT( popeyebl ) { invertmask = 0x00; - convert_color_prom(colortable,color_prom); + convert_color_prom(machine,colortable,color_prom); } -static void set_background_palette(int bank) +static void set_background_palette(running_machine *machine,int bank) { int i; UINT8 *color_prom = memory_region(REGION_PROMS) + 16 * bank; @@ -182,7 +182,7 @@ static void set_background_palette(int bank) } b = 0x1c * bit0 + 0x31 * bit1 + 0x47 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -318,7 +318,7 @@ static void popeye_draw_background(mame_bitmap *bitmap, const rectangle *cliprec lastflip = flip_screen; } - set_background_palette((*popeye_palettebank & 0x08) >> 3); + set_background_palette(Machine, (*popeye_palettebank & 0x08) >> 3); if (popeye_background_pos[1] == 0) /* no background */ { diff --git a/src/vidhrdw/popper.c b/src/vidhrdw/popper.c index e5e98178b..2413c4c36 100644 --- a/src/vidhrdw/popper.c +++ b/src/vidhrdw/popper.c @@ -33,7 +33,7 @@ PALETTE_INIT( popper ) bit1 = (*color_prom >> 6) & 0x01; bit2 = (*color_prom >> 7) & 0x01; b = 0x97 * bit1 + 0x68 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/portrait.c b/src/vidhrdw/portrait.c index 05442b714..4c781a85b 100644 --- a/src/vidhrdw/portrait.c +++ b/src/vidhrdw/portrait.c @@ -96,7 +96,7 @@ PALETTE_INIT( portrait ) bit2 = (color_prom[i] >> 4) & 0x01; b = 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/powerins.c b/src/vidhrdw/powerins.c index c07cd1974..7ca0c6622 100644 --- a/src/vidhrdw/powerins.c +++ b/src/vidhrdw/powerins.c @@ -91,11 +91,11 @@ WRITE16_HANDLER( powerins_paletteram16_w ) UINT16 newword = COMBINE_DATA(&paletteram16[offset]); - int r = ((newword >> 8) & 0xF0 ) | ((newword << 0) & 0x08); - int g = ((newword >> 4) & 0xF0 ) | ((newword << 1) & 0x08); - int b = ((newword >> 0) & 0xF0 ) | ((newword << 2) & 0x08); + int r = ((newword >> 11) & 0x1E ) | ((newword >> 3) & 0x01); + int g = ((newword >> 7) & 0x1E ) | ((newword >> 2) & 0x01); + int b = ((newword >> 3) & 0x1E ) | ((newword >> 1) & 0x01); - palette_set_color( offset, r,g,b ); + palette_set_color( Machine,offset, pal5bit(r),pal5bit(g),pal5bit(b) ); } diff --git a/src/vidhrdw/ppu2c03b.c b/src/vidhrdw/ppu2c03b.c index 637ec356f..3ff1bd1c0 100644 --- a/src/vidhrdw/ppu2c03b.c +++ b/src/vidhrdw/ppu2c03b.c @@ -165,7 +165,7 @@ void ppu2c03b_init_palette( int first_entry ) { B = 255; /* Round, and set the value */ - palette_set_color(first_entry++, floor(R+.5), floor(G+.5), floor(B+.5)); + palette_set_color(Machine,first_entry++, floor(R+.5), floor(G+.5), floor(B+.5)); } } diff --git a/mess/vidhrdw/ppu2c0x.c b/src/vidhrdw/ppu2c0x.c similarity index 99% rename from mess/vidhrdw/ppu2c0x.c rename to src/vidhrdw/ppu2c0x.c index 3c5998820..ebc98a4b7 100644 --- a/mess/vidhrdw/ppu2c0x.c +++ b/src/vidhrdw/ppu2c0x.c @@ -204,7 +204,7 @@ void ppu2c0x_init_palette( int first_entry ) u = sat * cos( rad ); v = sat * sin( rad ); - + /* Transform to RGB */ R = ( y + Kv * v ) * 255.0; G = ( y - ( Kb * Ku * u + Kr * Kv * v) / (1 - Kb - Kr) ) * 255.0; @@ -225,7 +225,7 @@ void ppu2c0x_init_palette( int first_entry ) B = 255; /* Round, and set the value */ - palette_set_color(first_entry++, floor(R+.5), floor(G+.5), floor(B+.5)); + palette_set_color(Machine, first_entry++, floor(R+.5), floor(G+.5), floor(B+.5)); } } } @@ -357,7 +357,7 @@ static void hblank_callback (int num) int blanked = ( ppu_regs[PPU_CONTROL1] & ( PPU_CONTROL1_BACKGROUND | PPU_CONTROL1_SPRITES ) ) == 0; int vblank = ((this_ppu->scanline >= PPU_VBLANK_FIRST_SCANLINE-1) && (this_ppu->scanline < this_ppu->scanlines_per_frame-1)) ? 1 : 0; -// update_scanline (num); +// update_scanline (num); if (this_ppu->hblank_callback_proc) (*this_ppu->hblank_callback_proc) (num, this_ppu->scanline, vblank, blanked); @@ -640,7 +640,7 @@ static void draw_sprites( const int num, UINT8 *line_priority ) if ( ( spriteXPos + pixel ) < VISIBLE_SCREEN_WIDTH ) line_priority[ spriteXPos + pixel ] |= 0x01; } - + /* set the "sprite 0 hit" flag if appropriate */ if ( spriteIndex == 0 && (pixelData & 0x03) && ((spriteXPos + pixel) < 255) && ( line_priority[ spriteXPos + pixel ] & 0x02 )) ppu_regs[PPU_STATUS] |= PPU_STATUS_SPRITE0_HIT; @@ -672,7 +672,7 @@ static void draw_sprites( const int num, UINT8 *line_priority ) drawn = 1; } } - + /* set the "sprite 0 hit" flag if appropriate */ if ( spriteIndex == 0 && (pixelData & 0x03) && ((spriteXPos + pixel) < 255) && ( line_priority[ spriteXPos + pixel ] & 0x02 )) ppu_regs[PPU_STATUS] |= PPU_STATUS_SPRITE0_HIT; @@ -687,7 +687,7 @@ static void draw_sprites( const int num, UINT8 *line_priority ) if ( spriteCount == 8 ) { ppu_regs[PPU_STATUS] |= PPU_STATUS_8SPRITES; -// logerror ("> 8 sprites, scanline: %d\n", scanline); +// logerror ("> 8 sprites, scanline: %d\n", scanline); /* the real NES only draws up to 8 sprites - the rest should be invisible */ break; @@ -860,7 +860,7 @@ static void scanline_callback( int num ) logerror("vlbank 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) { @@ -919,7 +919,7 @@ logerror("vlbank ending\n"); next_scanline = 0; // Call us back when the hblank starts for this scanline - mame_timer_adjust(this_ppu->hblank_timer, MAME_TIME_IN_CYCLES(86.67, 0), num, time_never); // ¥¥¥ FIXME - hardcoding NTSC, need better calculation + mame_timer_adjust(this_ppu->hblank_timer, MAME_TIME_IN_CYCLES(86.67, 0), num, time_never); // ??? FIXME - hardcoding NTSC, need better calculation // trigger again at the start of the next scanline mame_timer_adjust(this_ppu->scanline_timer, cpu_getscanlinetime_mt( next_scanline * this_ppu->scan_scale), num, make_mame_time(0,0)); @@ -950,7 +950,7 @@ void ppu2c0x_reset( int num, int scan_scale ) mame_timer_adjust(chips[num].nmi_timer, time_never, num, time_never); // Call us back when the hblank starts for this scanline - mame_timer_adjust(chips[num].hblank_timer, MAME_TIME_IN_CYCLES(86.67, 0), num, time_never); // ¥¥¥ FIXME - hardcoding NTSC, need better calculation + mame_timer_adjust(chips[num].hblank_timer, MAME_TIME_IN_CYCLES(86.67, 0), num, time_never); // ??? FIXME - hardcoding NTSC, need better calculation // Call us back at the start of the next scanline mame_timer_adjust(chips[num].scanline_timer, cpu_getscanlinetime_mt(1), num, make_mame_time(0,0)); @@ -1007,7 +1007,7 @@ void ppu2c0x_reset( int num, int scan_scale ) int ppu2c0x_r( int num, offs_t offset ) { ppu2c0x_chip* this_ppu; - + /* check bounds */ if ( num >= intf->num ) { @@ -1081,7 +1081,7 @@ void ppu2c0x_w( int num, offs_t offset, UINT8 data ) { ppu2c0x_chip* this_ppu; int color_base; - + /* check bounds */ if ( num >= intf->num ) { @@ -1230,7 +1230,7 @@ void ppu2c0x_w( int num, offs_t offset, UINT8 data ) else if ( tempAddr >= 0x3f00 ) { int colorEmphasis = (this_ppu->regs[PPU_CONTROL1] & PPU_CONTROL1_COLOR_EMPHASIS) * 2; - + /* store the data */ if (tempAddr & 0x03) this_ppu->videoram[tempAddr & 0x3F1F] = data; @@ -1312,7 +1312,7 @@ void ppu2c0x_spriteram_dma (int num, const UINT8 page) // should last 513 CPU cycles. activecpu_adjust_icount(-513); - // ¥¥¥ÊTODO : need to account for PPU rendering - this is roughly 4.5 scanlines eaten up. + // ????TODO : need to account for PPU rendering - this is roughly 4.5 scanlines eaten up. // Because the DMA is only useful during vblank, this may not be strictly necessary since // the scanline timers should catch us up before drawing actually happens. #if 0 @@ -1426,7 +1426,7 @@ int ppu2c0x_get_current_scanline( int num ) void ppu2c0x_set_mirroring( int num, int mirroring ) { ppu2c0x_chip* this_ppu; - + /* check bounds */ if ( num >= intf->num ) { diff --git a/mess/vidhrdw/ppu2c0x.h b/src/vidhrdw/ppu2c0x.h similarity index 99% rename from mess/vidhrdw/ppu2c0x.h rename to src/vidhrdw/ppu2c0x.h index db87a0f37..93f592ab5 100644 --- a/mess/vidhrdw/ppu2c0x.h +++ b/src/vidhrdw/ppu2c0x.h @@ -61,7 +61,7 @@ enum { PPU_NTSC_SCANLINES_PER_FRAME = 262, PPU_PAL_SCANLINES_PER_FRAME = 312, - + PPU_BOTTOM_VISIBLE_SCANLINE = 239, PPU_VBLANK_FIRST_SCANLINE = 241, PPU_VBLANK_LAST_SCANLINE_NTSC = 260, diff --git a/src/vidhrdw/prehisle.c b/src/vidhrdw/prehisle.c index 195406ce5..1d6d38811 100644 --- a/src/vidhrdw/prehisle.c +++ b/src/vidhrdw/prehisle.c @@ -11,7 +11,7 @@ UINT16 *prehisle_bg_videoram16; -static int invert_controls; +static UINT16 invert_controls; static tilemap *bg2_tilemap, *bg_tilemap, *fg_tilemap; @@ -61,7 +61,7 @@ WRITE16_HANDLER( prehisle_control16_w ) case 0x08: tilemap_set_scrollx(bg_tilemap, 0, scroll); break; case 0x10: tilemap_set_scrolly(bg2_tilemap, 0, scroll); break; case 0x18: tilemap_set_scrollx(bg2_tilemap, 0, scroll); break; - case 0x23: invert_controls = data ? 0xff : 0x00; break; + case 0x23: invert_controls = data ? 0x00ff : 0x0000; break; case 0x28: coin_counter_w(0, data & 1); break; case 0x29: coin_counter_w(1, data & 1); break; case 0x30: flip_screen_set(data & 0x01); break; @@ -123,10 +123,13 @@ VIDEO_START( prehisle ) tilemap_set_transparent_pen(bg_tilemap, 15); tilemap_set_transparent_pen(fg_tilemap, 15); + /* register for saving */ + state_save_register_global(invert_controls); + return 0; } -static void prehisle_draw_sprites( mame_bitmap *bitmap, const rectangle *cliprect ) +static void prehisle_draw_sprites( mame_bitmap *bitmap, const rectangle *cliprect, int foreground ) { int offs; @@ -135,6 +138,7 @@ static void prehisle_draw_sprites( mame_bitmap *bitmap, const rectangle *cliprec int attr = spriteram16[offs + 2]; int code = attr & 0x1fff; int color = spriteram16[offs + 3] >> 12; + int priority = (color < 0x4); int flipx = attr & 0x4000; int flipy = attr & 0x8000; int sx = spriteram16[offs + 1]; @@ -150,16 +154,20 @@ static void prehisle_draw_sprites( mame_bitmap *bitmap, const rectangle *cliprec flipy = !flipy; } - drawgfx(bitmap, Machine->gfx[3], code, color, flipx, flipy, sx, sy, - cliprect, TRANSPARENCY_PEN, 15); + if ((foreground && priority) || (!foreground && !priority)) + { + drawgfx(bitmap, Machine->gfx[3], code, color, flipx, flipy, sx, sy, + cliprect, TRANSPARENCY_PEN, 15); + } } } VIDEO_UPDATE( prehisle ) { tilemap_draw(bitmap, cliprect, bg2_tilemap, 0, 0); + prehisle_draw_sprites(bitmap, cliprect, 0); tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); - prehisle_draw_sprites(bitmap, cliprect); + prehisle_draw_sprites(bitmap, cliprect, 1); tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); return 0; } diff --git a/src/vidhrdw/psikyo.c b/src/vidhrdw/psikyo.c index 3c8fc98fa..704fa10d9 100644 --- a/src/vidhrdw/psikyo.c +++ b/src/vidhrdw/psikyo.c @@ -587,7 +587,7 @@ VIDEO_UPDATE( psikyo ) tilemap_set_transparent_pen(tilemap_1_size2,(layer1_ctrl & 8 ?0:15)); tilemap_set_transparent_pen(tilemap_1_size3,(layer1_ctrl & 8 ?0:15)); - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); fillbitmap(priority_bitmap,0,cliprect); diff --git a/src/vidhrdw/psikyosh.c b/src/vidhrdw/psikyosh.c index b50b4e8d1..b16f2cdb6 100644 --- a/src/vidhrdw/psikyosh.c +++ b/src/vidhrdw/psikyosh.c @@ -294,7 +294,7 @@ static void psikyosh_drawbglayerscroll( int layer, mame_bitmap *bitmap, const re /* Looks better with blending and one scroll value than with 1D linescroll and no zoom */ #if 0 int bg_scrollx[256], bg_scrolly[512]; - fillbitmap(zoom_bitmap, get_black_pen(), NULL); + fillbitmap(zoom_bitmap, get_black_pen(machine), NULL); for (offs=0; offs<(0x400/4); offs++) /* 224 values for each */ { bg_scrollx[offs] = (psikyosh_bgram[(scrollbank*0x800)/4 + offs - 0x4000/4] & 0x000001ff) >> 0; @@ -1135,7 +1135,7 @@ static void psikyosh_postlineblend( mame_bitmap *bitmap, const rectangle *clipre VIDEO_UPDATE( psikyosh ) /* Note the z-buffer on each sprite to get correct priority */ { int i; - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); fillbitmap(z_bitmap,0,cliprect); /* z-buffer */ psikyosh_prelineblend(bitmap, cliprect); diff --git a/src/vidhrdw/psx.c b/src/vidhrdw/psx.c index 889506b19..a1304ae2c 100644 --- a/src/vidhrdw/psx.c +++ b/src/vidhrdw/psx.c @@ -261,18 +261,11 @@ static UINT16 m_p_n_b1g1[ 0x10000 ]; PALETTE_INIT( psx ) { - UINT32 n_r; - UINT32 n_g; - UINT32 n_b; UINT32 n_colour; for( n_colour = 0; n_colour < 0x10000; n_colour++ ) { - n_r = ( ( n_colour & 0x1f ) * 0xff ) / 0x1f; - n_g = ( ( ( n_colour >> 5 ) & 0x1f ) * 0xff ) / 0x1f; - n_b = ( ( ( n_colour >> 10 ) & 0x1f ) * 0xff ) / 0x1f; - - palette_set_color( n_colour, n_r, n_g, n_b ); + palette_set_color( machine, n_colour, pal5bit(n_colour >> 0), pal5bit(n_colour >> 5), pal5bit(n_colour >> 10) ); } } diff --git a/src/vidhrdw/psychic5.c b/src/vidhrdw/psychic5.c index 2752480ca..7bb97b1c5 100644 --- a/src/vidhrdw/psychic5.c +++ b/src/vidhrdw/psychic5.c @@ -59,16 +59,13 @@ void psychic5_paletteram_w(int color_offs, int offset, int data) ps5_palette_ram[offset] = data; /* red component */ - val = (ps5_palette_ram[offset & ~1] >> 4) & 0x0f ; - r = (val << 4) | val ; + r = (ps5_palette_ram[offset & ~1] >> 4) & 0x0f ; /* green component */ - val = (ps5_palette_ram[offset & ~1]) & 0x0f ; - g = (val << 4) | val ; + g = (ps5_palette_ram[offset & ~1]) & 0x0f ; /* blue component */ - val = (ps5_palette_ram[offset | 1] >> 4) & 0x0f ; - b = (val << 4) | val ; + b = (ps5_palette_ram[offset | 1] >> 4) & 0x0f ; /* "alpha" component */ val = (ps5_palette_ram[offset | 1] & 0x0f) & 0x0f ; @@ -76,7 +73,7 @@ void psychic5_paletteram_w(int color_offs, int offset, int data) jal_blend_table[(offset / 2)-color_offs] = a ; - palette_set_color((offset / 2)-color_offs,r,g,b); + palette_set_color(Machine,(offset / 2)-color_offs,pal4bit(r),pal4bit(g),pal4bit(b)); } static void set_background_palette_intensity(void) @@ -115,11 +112,11 @@ static void set_background_palette_intensity(void) if (ix != 0x0) /* Tint the grey */ { UINT32 result = jal_blend_func(MAKE_RGB(val,val,val), MAKE_RGB(ir, ig, ib), jal_blend_table[0xff]) ; - palette_set_color(0x100+i, RGB_RED(result), RGB_GREEN(result), RGB_BLUE(result)) ; + palette_set_color(Machine, 0x100+i, RGB_RED(result), RGB_GREEN(result), RGB_BLUE(result)) ; } else /* Just leave plain grey */ { - palette_set_color(0x100+i,val,val,val); + palette_set_color(Machine,0x100+i,val,val,val); } } else @@ -130,11 +127,11 @@ static void set_background_palette_intensity(void) if (ix != 0x0) /* Tint the world */ { UINT32 result = jal_blend_func(MAKE_RGB(r, g, b), MAKE_RGB(ir, ig, ib), jal_blend_table[0xff]) ; - palette_set_color(0x100+i, RGB_RED(result), RGB_GREEN(result), RGB_BLUE(result)) ; + palette_set_color(Machine, 0x100+i, RGB_RED(result), RGB_GREEN(result), RGB_BLUE(result)) ; } else /* Leave the world as-is */ { - palette_set_color(0x100+i,r,g,b) ; + palette_set_color(Machine,0x100+i,r,g,b) ; } } } @@ -462,7 +459,7 @@ static void psychic5_draw_background( mame_bitmap *bitmap, const rectangle *clip clip.max_y = 0; } - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(Machine), cliprect); tilemap_draw(bitmap, &clip, bg_tilemap, 0, 0); } else @@ -472,7 +469,7 @@ static void psychic5_draw_background( mame_bitmap *bitmap, const rectangle *clip tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); } else - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(Machine), cliprect); } VIDEO_UPDATE( psychic5 ) diff --git a/src/vidhrdw/punchout.c b/src/vidhrdw/punchout.c index b90469943..ebce21c2e 100644 --- a/src/vidhrdw/punchout.c +++ b/src/vidhrdw/punchout.c @@ -42,7 +42,7 @@ static UINT8 top_palette_bank,bottom_palette_bank; bit 0 -- 2 kohm resistor -- inverter -- RED/GREEN/BLUE ***************************************************************************/ -static void convert_palette(const UINT8 *color_prom) +static void convert_palette(running_machine *machine,const UINT8 *color_prom) { int i; @@ -68,13 +68,13 @@ static void convert_palette(const UINT8 *color_prom) bit3 = (color_prom[2*1024] >> 3) & 0x01; b = 255 - (0x10 * bit0 + 0x21 * bit1 + 0x46 * bit2 + 0x88 * bit3); - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } /* reserve the last color for the transparent pen (none of the game colors has */ /* these RGB components) */ - palette_set_color(1024,240,240,240); + palette_set_color(machine,1024,240,240,240); } @@ -88,7 +88,7 @@ PALETTE_INIT( punchout ) #define COLOR(gfxn,offs) (colortable[Machine->drv->gfxdecodeinfo[gfxn].color_codes_start + (offs)]) - convert_palette(color_prom); + convert_palette(machine,color_prom); /* top monitor chars */ @@ -121,7 +121,7 @@ PALETTE_INIT( armwrest ) #define COLOR(gfxn,offs) (colortable[Machine->drv->gfxdecodeinfo[gfxn].color_codes_start + (offs)]) - convert_palette(color_prom); + convert_palette(machine,color_prom); /* top monitor / bottom monitor backround chars */ diff --git a/src/vidhrdw/qdrmfgp.c b/src/vidhrdw/qdrmfgp.c index 9fcdfaf77..edce81398 100644 --- a/src/vidhrdw/qdrmfgp.c +++ b/src/vidhrdw/qdrmfgp.c @@ -65,7 +65,7 @@ VIDEO_START( qdrmfgp2 ) VIDEO_UPDATE( qdrmfgp ) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); K056832_tilemap_draw(bitmap,cliprect, 3, 0, 1); K056832_tilemap_draw(bitmap,cliprect, 2, 0, 2); diff --git a/src/vidhrdw/qix.c b/src/vidhrdw/qix.c index b991e64e7..168c50ff1 100644 --- a/src/vidhrdw/qix.c +++ b/src/vidhrdw/qix.c @@ -207,7 +207,7 @@ WRITE8_HANDLER( qix_paletteram_w ) blue = table[(bits << 2) | intensity]; /* update the palette */ - palette_set_color(offset, red, green, blue); + palette_set_color(Machine, offset, red, green, blue); } diff --git a/src/vidhrdw/quasar.c b/src/vidhrdw/quasar.c index 60ecdaf67..f8eaada37 100644 --- a/src/vidhrdw/quasar.c +++ b/src/vidhrdw/quasar.c @@ -68,7 +68,7 @@ PALETTE_INIT( quasar ) for(col = 0;col < 8; col++) { - palette_set_color(col,(col & 1) * 255,((col >> 1) & 1) * 255,((col >> 2) & 1) * 255); + palette_set_color(machine,col,pal1bit(col >> 0),pal1bit(col >> 1),pal1bit(col >> 2)); } // Address 0-2 from graphic rom @@ -108,13 +108,13 @@ PALETTE_INIT( quasar ) b = 0x4f * bit0 + 0xa8 * bit1; // Intensity 1 - palette_set_color(256+i,r>>2,g>>2,b>>2); + palette_set_color(machine,256+i,r>>2,g>>2,b>>2); // Intensity 2 - palette_set_color(512+i,(r>>2)+(r>>3),(g>>2)+(g>>3),(b>>2)+(b>>2)); + palette_set_color(machine,512+i,(r>>2)+(r>>3),(g>>2)+(g>>3),(b>>2)+(b>>2)); // Intensity 3 - palette_set_color(768+i,r>>1,g>>1,b>>1); + palette_set_color(machine,768+i,r>>1,g>>1,b>>1); } /* Sprites */ @@ -145,7 +145,7 @@ VIDEO_START( quasar ) if ((effect_bitmap = auto_bitmap_alloc(Machine->screen[0].width,Machine->screen[0].height)) == 0) return 1; - return video_start_cvs(); + return video_start_cvs(machine); } VIDEO_UPDATE( quasar ) diff --git a/src/vidhrdw/quizdna.c b/src/vidhrdw/quizdna.c index faf6393a2..c40d86411 100644 --- a/src/vidhrdw/quizdna.c +++ b/src/vidhrdw/quizdna.c @@ -137,11 +137,7 @@ WRITE8_HANDLER( paletteram_xBGR_RRRR_GGGG_BBBB_w ) g = ((d0 >> 3) & 0x1e) | ((d1 >> 5) & 1); b = ((d0 << 1) & 0x1e) | ((d1 >> 6) & 1); - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offs/2,r,g,b); + palette_set_color(Machine,offs/2,pal5bit(r),pal5bit(g),pal5bit(b)); } static void quizdna_drawsprites(mame_bitmap *bitmap, const rectangle *cliprect) @@ -206,6 +202,6 @@ VIDEO_UPDATE( quizdna ) tilemap_draw(bitmap, cliprect, quizdna_fg_tilemap, 0, 0); } else - fillbitmap(bitmap, get_black_pen(), &Machine->screen[0].visarea); + fillbitmap(bitmap, get_black_pen(machine), &Machine->screen[0].visarea); return 0; } diff --git a/src/vidhrdw/rallyx.c b/src/vidhrdw/rallyx.c index c0a39e208..a8e72648f 100644 --- a/src/vidhrdw/rallyx.c +++ b/src/vidhrdw/rallyx.c @@ -145,7 +145,7 @@ PALETTE_INIT( rallyx ) b = 0x50 * bit0 + 0xab * bit1; } - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -178,7 +178,7 @@ PALETTE_INIT( rallyx ) bits = (i >> 4) & 0x03; b = map[bits]; - palette_set_color(i + 32,r,g,b); + palette_set_color(machine,i + 32,r,g,b); } } } @@ -284,9 +284,9 @@ VIDEO_START( rallyx ) rallyx_radary = rallyx_radarx + 0x800; for (i = 0;i < 16;i++) - palette_shadow_table[i] = i+16; + Machine->shadow_table[i] = i+16; for (i = 16;i < 32;i++) - palette_shadow_table[i] = i; + Machine->shadow_table[i] = i; for (i = 0;i < 3;i++) gfx_drawmode_table[i] = DRAWMODE_SHADOW; gfx_drawmode_table[3] = DRAWMODE_NONE; diff --git a/src/vidhrdw/realbrk.c b/src/vidhrdw/realbrk.c index c5624adaa..7296dd0df 100644 --- a/src/vidhrdw/realbrk.c +++ b/src/vidhrdw/realbrk.c @@ -353,7 +353,7 @@ if ( code_pressed(KEYCODE_Z) ) if (disable_video) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); return 0; } else diff --git a/src/vidhrdw/redclash.c b/src/vidhrdw/redclash.c index 807181dc2..1d8dcc2a9 100644 --- a/src/vidhrdw/redclash.c +++ b/src/vidhrdw/redclash.c @@ -39,7 +39,7 @@ PALETTE_INIT( redclash ) bit1 = (color_prom[i] >> 4) & 0x01; bit2 = (color_prom[i] >> 7) & 0x01; b = 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } /* This is for the stars colors */ @@ -55,7 +55,7 @@ PALETTE_INIT( redclash ) g = 0x47 * bit1 + 0x97 * bit2; bit1 = i & 0x01; r = 0x47 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } /* characters */ @@ -412,7 +412,7 @@ VIDEO_EOF( redclash ) VIDEO_UPDATE( redclash ) { - fillbitmap(bitmap, get_black_pen(), &Machine->screen[0].visarea); + fillbitmap(bitmap, get_black_pen(machine), &Machine->screen[0].visarea); redclash_draw_stars(bitmap, 32, 0, 0x00, 0xff); redclash_draw_sprites(bitmap); redclash_draw_bullets(bitmap); diff --git a/src/vidhrdw/retofinv.c b/src/vidhrdw/retofinv.c index 6072fbc8b..bafacf0ba 100644 --- a/src/vidhrdw/retofinv.c +++ b/src/vidhrdw/retofinv.c @@ -46,7 +46,7 @@ PALETTE_INIT( retofinv ) bit3 = (color_prom[i + 2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += 3*Machine->drv->total_colors; diff --git a/src/vidhrdw/rockola.c b/src/vidhrdw/rockola.c index ccbfdf33a..574b7ad81 100644 --- a/src/vidhrdw/rockola.c +++ b/src/vidhrdw/rockola.c @@ -58,7 +58,7 @@ PALETTE_INIT( rockola ) b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i, r, g, b); + palette_set_color(machine,i, r, g, b); color_prom++; } @@ -250,7 +250,7 @@ PALETTE_INIT( satansat ) b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); color_prom++; } diff --git a/src/vidhrdw/rocnrope.c b/src/vidhrdw/rocnrope.c index cc594bf2d..34e4de912 100644 --- a/src/vidhrdw/rocnrope.c +++ b/src/vidhrdw/rocnrope.c @@ -55,7 +55,7 @@ PALETTE_INIT( rocnrope ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/route16.c b/src/vidhrdw/route16.c index 6f8f09c63..5c693e17a 100644 --- a/src/vidhrdw/route16.c +++ b/src/vidhrdw/route16.c @@ -322,13 +322,9 @@ VIDEO_UPDATE( route16 ) ***************************************************************************/ static void modify_pen(int pen, int colorindex) { - int r,g,b,color; + int color; color = route16_color_prom[colorindex]; - r = ((color & 1) ? 0xff : 0x00); - g = ((color & 2) ? 0xff : 0x00); - b = ((color & 4) ? 0xff : 0x00); - - palette_set_color(pen,r,g,b); + palette_set_color(Machine,pen,pal1bit(color >> 0),pal1bit(color >> 1),pal1bit(color >> 2)); } diff --git a/src/vidhrdw/runaway.c b/src/vidhrdw/runaway.c index a58aa27d0..4a35dc4a8 100644 --- a/src/vidhrdw/runaway.c +++ b/src/vidhrdw/runaway.c @@ -33,7 +33,7 @@ WRITE8_HANDLER( runaway_paletteram_w ) 0x47 * ((~data >> 0) & 1) + 0x97 * ((~data >> 1) & 1); - palette_set_color(offset, R, G, B); + palette_set_color(Machine, offset, R, G, B); } diff --git a/src/vidhrdw/rungun.c b/src/vidhrdw/rungun.c index b05adc0b9..db342f3b9 100644 --- a/src/vidhrdw/rungun.c +++ b/src/vidhrdw/rungun.c @@ -135,7 +135,7 @@ VIDEO_START(rng) VIDEO_UPDATE(rng) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); fillbitmap(priority_bitmap, 0, cliprect); K053936_0_zoom_draw(bitmap, cliprect, rng_936_tilemap, 0, 0); diff --git a/src/vidhrdw/sbasketb.c b/src/vidhrdw/sbasketb.c index 697ad74cf..e58f9de4a 100644 --- a/src/vidhrdw/sbasketb.c +++ b/src/vidhrdw/sbasketb.c @@ -57,7 +57,7 @@ PALETTE_INIT( sbasketb ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/sbugger.c b/src/vidhrdw/sbugger.c index f797e72c3..91ecd641f 100644 --- a/src/vidhrdw/sbugger.c +++ b/src/vidhrdw/sbugger.c @@ -58,8 +58,8 @@ PALETTE_INIT(sbugger) int b = rand()|0x80; if (i == 0) r = g = b = 0; - palette_set_color(i*2+1,r,g,b); - palette_set_color(i*2,0,0,0); + palette_set_color(machine,i*2+1,r,g,b); + palette_set_color(machine,i*2,0,0,0); } diff --git a/src/vidhrdw/scotrsht.c b/src/vidhrdw/scotrsht.c index 5cb8f639d..cbabf90fc 100644 --- a/src/vidhrdw/scotrsht.c +++ b/src/vidhrdw/scotrsht.c @@ -35,7 +35,7 @@ PALETTE_INIT( scotrsht ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/segag80r.c b/src/vidhrdw/segag80r.c index a65b429bf..6a58ddfd5 100644 --- a/src/vidhrdw/segag80r.c +++ b/src/vidhrdw/segag80r.c @@ -114,11 +114,11 @@ static void g80_set_palette_entry(int entry, UINT8 data) bit1 = (b >> 1) & 0x01; b = combine_2_weights(bweights, bit0, bit1); - palette_set_color(entry, r, g, b); + palette_set_color(Machine, entry, r, g, b); } -static void spaceod_bg_init_palette(void) +static void spaceod_bg_init_palette(running_machine *machine) { static const int resistances[2] = { 1800, 1200 }; double trweights[2], tgweights[2], tbweights[2]; @@ -156,7 +156,7 @@ static void spaceod_bg_init_palette(void) bit1 = (b >> 1) & 0x01; b = combine_2_weights(tbweights, bit0, bit1); - palette_set_color(64 + i, r, g, b); + palette_set_color(machine, 64 + i, r, g, b); } } @@ -225,7 +225,7 @@ VIDEO_START( segag80r ) /* create a fixed background palette and two tilemaps, one horizontally scrolling */ /* and one vertically scrolling */ case G80_BACKGROUND_SPACEOD: - spaceod_bg_init_palette(); + spaceod_bg_init_palette(machine); spaceod_bg_htilemap = tilemap_create(spaceod_get_tile_info, spaceod_scan_rows, TILEMAP_OPAQUE, 8,8, 128,32); spaceod_bg_vtilemap = tilemap_create(spaceod_get_tile_info, spaceod_scan_rows, TILEMAP_OPAQUE, 8,8, 32,128); break; diff --git a/src/vidhrdw/segag80v.c b/src/vidhrdw/segag80v.c index aaa3ff53b..fb4165b15 100644 --- a/src/vidhrdw/segag80v.c +++ b/src/vidhrdw/segag80v.c @@ -331,7 +331,7 @@ VIDEO_START( sega ) min_x =Machine->screen[0].visarea.min_x; min_y =Machine->screen[0].visarea.min_y; - return video_start_vector(); + return video_start_vector(machine); } @@ -347,6 +347,6 @@ VIDEO_START( sega ) VIDEO_UPDATE( sega ) { sega_generate_vector_list(); - video_update_vector(screen,bitmap,0); + video_update_vector(machine,screen,bitmap,cliprect); return 0; } diff --git a/src/vidhrdw/segahang.c b/src/vidhrdw/segahang.c index 4ac9b26db..f8ca9c1ce 100644 --- a/src/vidhrdw/segahang.c +++ b/src/vidhrdw/segahang.c @@ -68,7 +68,7 @@ VIDEO_UPDATE( hangon ) /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } diff --git a/src/vidhrdw/segaic16.c b/src/vidhrdw/segaic16.c index 07ccb0a72..10322fc42 100644 --- a/src/vidhrdw/segaic16.c +++ b/src/vidhrdw/segaic16.c @@ -591,9 +591,9 @@ WRITE16_HANDLER( segaic16_paletteram_w ) b = ((newval >> 14) & 0x01) | ((newval >> 7) & 0x1e); /* normal colors */ - palette_set_color(offset + 0 * palette.entries, palette.normal[r], palette.normal[g], palette.normal[b]); - palette_set_color(offset + 1 * palette.entries, palette.shadow[r], palette.shadow[g], palette.shadow[b]); - palette_set_color(offset + 2 * palette.entries, palette.hilight[r], palette.hilight[g], palette.hilight[b]); + palette_set_color(Machine, offset + 0 * palette.entries, palette.normal[r], palette.normal[g], palette.normal[b]); + palette_set_color(Machine, offset + 1 * palette.entries, palette.shadow[r], palette.shadow[g], palette.shadow[b]); + palette_set_color(Machine, offset + 2 * palette.entries, palette.hilight[r], palette.hilight[g], palette.hilight[b]); } @@ -2930,11 +2930,11 @@ static void segaic16_road_hangon_draw(struct road_info *info, mame_bitmap *bitma if (code_pressed(KEYCODE_D)) { - palette_set_color(0, 0, 0, 255); - palette_set_color(1, 0, 255, 0); - palette_set_color(2, 255, 0, 0); - palette_set_color(3, 255, 0, 255); - palette_set_color(7, 255, 255, 255); + palette_set_color(Machine, 0, 0, 0, 255); + palette_set_color(Machine, 1, 0, 255, 0); + palette_set_color(Machine, 2, 255, 0, 0); + palette_set_color(Machine, 3, 255, 0, 255); + palette_set_color(Machine, 7, 255, 255, 255); for (y = cliprect->min_y; y <= cliprect->max_y; y++) { @@ -3226,16 +3226,16 @@ static void segaic16_road_outrun_draw(struct road_info *info, mame_bitmap *bitma { if (code_pressed(KEYCODE_D)) { - palette_set_color(info->colorbase1 ^ 0, 0, 0, 255); - palette_set_color(info->colorbase1 ^ 1, 0, 0, 255); - palette_set_color(info->colorbase1 ^ 2, 0, 255, 0); - palette_set_color(info->colorbase1 ^ 3, 0, 255, 0); - palette_set_color(info->colorbase1 ^ 4, 255, 0, 0); - palette_set_color(info->colorbase1 ^ 5, 255, 0, 0); - palette_set_color(info->colorbase1 ^ 6, 255, 255, 255); - palette_set_color(info->colorbase1 ^ 7, 255, 255, 255); + palette_set_color(Machine, info->colorbase1 ^ 0, 0, 0, 255); + palette_set_color(Machine, info->colorbase1 ^ 1, 0, 0, 255); + palette_set_color(Machine, info->colorbase1 ^ 2, 0, 255, 0); + palette_set_color(Machine, info->colorbase1 ^ 3, 0, 255, 0); + palette_set_color(Machine, info->colorbase1 ^ 4, 255, 0, 0); + palette_set_color(Machine, info->colorbase1 ^ 5, 255, 0, 0); + palette_set_color(Machine, info->colorbase1 ^ 6, 255, 255, 255); + palette_set_color(Machine, info->colorbase1 ^ 7, 255, 255, 255); for (x = 0; x < 16; x++) - palette_set_color(info->colorbase2 ^ x, 255, 0, 255); + palette_set_color(Machine, info->colorbase2 ^ x, 255, 0, 255); } else { diff --git a/src/vidhrdw/segaic24.c b/src/vidhrdw/segaic24.c index 183b2c84d..f5e62ac69 100644 --- a/src/vidhrdw/segaic24.c +++ b/src/vidhrdw/segaic24.c @@ -29,7 +29,7 @@ System 24 68000x2 315-5292 315-5293 315-5294 315-5242 ym2151 da static void set_color(int color, unsigned char r, unsigned char g, unsigned char b, int highlight) { - palette_set_color (color, r, g, b); + palette_set_color (Machine, color, r, g, b); if(highlight) { r = 255-0.6*(255-r); @@ -40,7 +40,7 @@ static void set_color(int color, unsigned char r, unsigned char g, unsigned char g = 0.6*g; b = 0.6*b; } - palette_set_color (color+Machine->drv->total_colors/2, r, g, b); + palette_set_color (Machine,color+Machine->drv->total_colors/2, r, g, b); } // 315-5242 diff --git a/src/vidhrdw/segaorun.c b/src/vidhrdw/segaorun.c index 9817e5014..d2232e772 100644 --- a/src/vidhrdw/segaorun.c +++ b/src/vidhrdw/segaorun.c @@ -100,7 +100,7 @@ VIDEO_UPDATE( outrun ) /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } diff --git a/src/vidhrdw/segas16a.c b/src/vidhrdw/segas16a.c index 521abc98f..e8b05f72a 100644 --- a/src/vidhrdw/segas16a.c +++ b/src/vidhrdw/segas16a.c @@ -45,7 +45,7 @@ VIDEO_UPDATE( system16a ) /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } diff --git a/src/vidhrdw/segas16b.c b/src/vidhrdw/segas16b.c index 875601fb9..d24b31c7d 100644 --- a/src/vidhrdw/segas16b.c +++ b/src/vidhrdw/segas16b.c @@ -57,7 +57,7 @@ VIDEO_UPDATE( system16b ) /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } diff --git a/src/vidhrdw/segas18.c b/src/vidhrdw/segas18.c index 2d914c13e..deadb92ed 100644 --- a/src/vidhrdw/segas18.c +++ b/src/vidhrdw/segas18.c @@ -212,7 +212,7 @@ VIDEO_UPDATE( system18 ) /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } @@ -249,7 +249,7 @@ VIDEO_UPDATE( system18 ) #if DEBUG_VDP if (vdp_enable && code_pressed(KEYCODE_V)) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); update_system18_vdp(bitmap, cliprect); } if (vdp_enable && code_pressed(KEYCODE_B)) diff --git a/src/vidhrdw/segas32.c b/src/vidhrdw/segas32.c index 5793aa43d..7566d1adb 100644 --- a/src/vidhrdw/segas32.c +++ b/src/vidhrdw/segas32.c @@ -412,24 +412,12 @@ INLINE UINT16 xBGRBBBBGGGGRRRR_to_xBBBBBGGGGGRRRRR(UINT16 value) INLINE void update_color(int offset, UINT16 data) { - int r, g, b; - /* note that since we use this RAM directly, we don't technically need */ /* to call palette_set_color() at all; however, it does give us that */ /* nice display when you hit F4, which is useful for debugging */ - /* extract RGB */ - r = (data >> 0) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 10) & 0x1f; - - /* up to 8 bits */ - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - /* set the color */ - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal5bit(data >> 0), pal5bit(data >> 5), pal5bit(data >> 10)); } @@ -2461,7 +2449,7 @@ VIDEO_UPDATE( system32 ) /* if the display is off, punt */ if (!system32_displayenable[0]) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } @@ -2586,7 +2574,7 @@ for (showclip = 0; showclip < 4; showclip++) if (clips & (1 << i)) { rectangle rect; - pen_t white = get_white_pen(); + pen_t white = get_white_pen(machine); if (!flip) { rect.min_x = system32_videoram[0x1ff60/2 + i * 4] & 0x1ff; @@ -2640,7 +2628,7 @@ VIDEO_UPDATE( multi32 ) /* if the display is off, punt */ if (!system32_displayenable[screen]) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } diff --git a/src/vidhrdw/segasyse.c b/src/vidhrdw/segasyse.c index db28b6f23..984010c9d 100644 --- a/src/vidhrdw/segasyse.c +++ b/src/vidhrdw/segasyse.c @@ -171,7 +171,7 @@ int segae_vdp_start( UINT8 chip ) /*- Black the Palette -*/ for (temp=0;temp<32;temp++) - palette_set_color(temp + 32*chip+segasyse_palettebase, 0, 0, 0); + palette_set_color(Machine, temp + 32*chip+segasyse_palettebase, 0, 0, 0); /* Save State Stuff (based on vidhrdw/taitoic.c) */ @@ -271,11 +271,11 @@ void segae_vdp_data_w ( UINT8 chip, UINT8 data ) segae_vdp_cram[chip][segae_vdp_accessaddr[chip]] = data; if (temp != data) { - r = (segae_vdp_cram[chip][segae_vdp_accessaddr[chip]] & 0x03) << 6; - g = (segae_vdp_cram[chip][segae_vdp_accessaddr[chip]] & 0x0c) << 4; - b = (segae_vdp_cram[chip][segae_vdp_accessaddr[chip]] & 0x30) << 2; + r = (segae_vdp_cram[chip][segae_vdp_accessaddr[chip]] & 0x03) >> 0; + g = (segae_vdp_cram[chip][segae_vdp_accessaddr[chip]] & 0x0c) >> 2; + b = (segae_vdp_cram[chip][segae_vdp_accessaddr[chip]] & 0x30) >> 4; - palette_set_color(segae_vdp_accessaddr[chip] + 32*chip+segasyse_palettebase, r, g, b); + palette_set_color(Machine, segae_vdp_accessaddr[chip] + 32*chip+segasyse_palettebase, pal2bit(r), pal2bit(g), pal2bit(b)); } segae_vdp_accessaddr[chip] += 1; diff --git a/src/vidhrdw/segaxbd.c b/src/vidhrdw/segaxbd.c index 70c3d9ae3..0f5613495 100644 --- a/src/vidhrdw/segaxbd.c +++ b/src/vidhrdw/segaxbd.c @@ -73,7 +73,7 @@ VIDEO_UPDATE( xboard ) /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } diff --git a/src/vidhrdw/segaybd.c b/src/vidhrdw/segaybd.c index a31c022c5..cfd42a4b9 100644 --- a/src/vidhrdw/segaybd.c +++ b/src/vidhrdw/segaybd.c @@ -62,7 +62,7 @@ VIDEO_UPDATE( yboard ) /* if no drawing is happening, fill with black and get out */ if (!segaic16_display_enable) { - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); return 0; } diff --git a/src/vidhrdw/seibuspi.c b/src/vidhrdw/seibuspi.c index ab2d0d77f..8c14f27f1 100644 --- a/src/vidhrdw/seibuspi.c +++ b/src/vidhrdw/seibuspi.c @@ -197,20 +197,11 @@ WRITE32_HANDLER( palette_dma_start_w ) int i; for (i=0; i < ((video_dma_length+1) * 2) / 4; i++) { - int r1,g1,b1,r2,g2,b2; - UINT32 color = spimainram[(video_dma_address / 4) + i - 0x200]; if (palette_ram[i] != color) { palette_ram[i] = color; - b1 = ((palette_ram[i] & 0x7c000000) >>26) << 3; - g1 = ((palette_ram[i] & 0x03e00000) >>21) << 3; - r1 = ((palette_ram[i] & 0x001f0000) >>16) << 3; - b2 = ((palette_ram[i] & 0x00007c00) >>10) << 3; - g2 = ((palette_ram[i] & 0x000003e0) >>5) << 3; - r2 = ((palette_ram[i] & 0x0000001f) >>0) << 3; - - palette_set_color( (i * 2), r2, g2, b2 ); - palette_set_color( (i * 2) + 1, r1, g1, b1 ); + palette_set_color( Machine, (i * 2), pal5bit(palette_ram[i] >> 0), pal5bit(palette_ram[i] >> 5), pal5bit(palette_ram[i] >> 10) ); + palette_set_color( Machine, (i * 2) + 1, pal5bit(palette_ram[i] >> 16), pal5bit(palette_ram[i] >> 21), pal5bit(palette_ram[i] >> 26) ); } } } @@ -496,7 +487,7 @@ VIDEO_START( spi ) memset(sprite_ram, 0, 0x1000); for (i=0; i < 6144; i++) { - palette_set_color(i, 0, 0, 0); + palette_set_color(machine, i, 0, 0, 0); } memset(alpha_table, 0, 6144 * sizeof(UINT8)); diff --git a/src/vidhrdw/seicross.c b/src/vidhrdw/seicross.c index 48a3eb753..654febf5d 100644 --- a/src/vidhrdw/seicross.c +++ b/src/vidhrdw/seicross.c @@ -52,7 +52,7 @@ PALETTE_INIT( seicross ) bit1 = (color_prom[i] >> 7) & 0x01; b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/senjyo.c b/src/vidhrdw/senjyo.c index 8c128a3cf..4e05f152d 100644 --- a/src/vidhrdw/senjyo.c +++ b/src/vidhrdw/senjyo.c @@ -350,8 +350,8 @@ VIDEO_UPDATE( senjyo ) /* two colors for the radar dots (verified on the real board) */ - palette_set_color(512,0xff,0x00,0x00); /* red for enemies */ - palette_set_color(513,0xff,0xff,0x00); /* yellow for player */ + palette_set_color(machine,512,0xff,0x00,0x00); /* red for enemies */ + palette_set_color(machine,513,0xff,0xff,0x00); /* yellow for player */ { int scrollx,scrolly; diff --git a/src/vidhrdw/seta.c b/src/vidhrdw/seta.c index fe18db994..54d6cdfe5 100644 --- a/src/vidhrdw/seta.c +++ b/src/vidhrdw/seta.c @@ -525,7 +525,7 @@ VIDEO_START( seta_no_layers ) VIDEO_START( oisipuzl_2_layers ) { - if (video_start_seta_2_layers()) + if (video_start_seta_2_layers(machine)) return 1; tilemaps_flip = 1; return 0; @@ -609,21 +609,12 @@ PALETTE_INIT( usclssic ) /* DECODE PROM */ for (x = 0x000; x < 0x200 ; x++) { - int r,g,b; int data; data = (color_prom[x*2] <<8) | color_prom[x*2+1]; - r = (data >> 10) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 0) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - if (x>=0x100) palette_set_color(x,r,g,b); - else palette_set_color(x+0x300,r,g,b); + if (x>=0x100) palette_set_color(machine,x,pal5bit(data >> 10),pal5bit(data >> 5),pal5bit(data >> 0)); + else palette_set_color(machine,x+0x300,pal5bit(data >> 10),pal5bit(data >> 5),pal5bit(data >> 0)); } for( color = 0; color < 32; color++ ) diff --git a/src/vidhrdw/seta2.c b/src/vidhrdw/seta2.c index a3f92a06f..c17e0a3eb 100644 --- a/src/vidhrdw/seta2.c +++ b/src/vidhrdw/seta2.c @@ -368,7 +368,7 @@ VIDEO_START( seta2 ) VIDEO_START( seta2_offset ) { - video_start_seta2(); + video_start_seta2(machine); yoffset = 0x10; return 0; diff --git a/src/vidhrdw/shangha3.c b/src/vidhrdw/shangha3.c index 7d7138a73..3f8b34845 100644 --- a/src/vidhrdw/shangha3.c +++ b/src/vidhrdw/shangha3.c @@ -87,7 +87,7 @@ VIDEO_START( shangha3 ) gfx_drawmode_table[i] = DRAWMODE_SOURCE; gfx_drawmode_table[14] = DRAWMODE_SHADOW; for (i = 0;i < 128;i++) - palette_shadow_table[Machine->pens[i]] = Machine->pens[i+128]; + Machine->shadow_table[Machine->pens[i]] = Machine->pens[i+128]; } return 0; diff --git a/src/vidhrdw/shangkid.c b/src/vidhrdw/shangkid.c index 2762a88d8..761aa9c81 100644 --- a/src/vidhrdw/shangkid.c +++ b/src/vidhrdw/shangkid.c @@ -188,14 +188,7 @@ PALETTE_INIT( dynamski ) for (i = 0;i < Machine->drv->total_colors;i++) { int data = color_prom[i] + 256 * color_prom[i+32]; - int r = (data >> 1) & 0x1f; - int g = (data >> 6) & 0x1f; - int b = (data >> 11) & 0x1f; - - palette_set_color(i, - (r << 3) | (r >> 2), - (g << 3) | (g >> 2), - (b << 3) | (b >> 2)); + palette_set_color(machine,i,pal5bit(data >> 1),pal5bit(data >> 6),pal5bit(data >> 11)); } color_prom += 2*Machine->drv->total_colors; diff --git a/src/vidhrdw/shaolins.c b/src/vidhrdw/shaolins.c index a6558644e..70165fee4 100644 --- a/src/vidhrdw/shaolins.c +++ b/src/vidhrdw/shaolins.c @@ -56,7 +56,7 @@ PALETTE_INIT( shaolins ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/shisen.c b/src/vidhrdw/shisen.c index a9706b22d..14e1f0793 100644 --- a/src/vidhrdw/shisen.c +++ b/src/vidhrdw/shisen.c @@ -39,20 +39,11 @@ WRITE8_HANDLER( sichuan2_bankswitch_w ) WRITE8_HANDLER( sichuan2_paletteram_w ) { - int r, g, b; - paletteram[offset] = data; offset &= 0xff; - r = paletteram[offset + 0x000] & 0x1f; - g = paletteram[offset + 0x100] & 0x1f; - b = paletteram[offset + 0x200] & 0x1f; - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal5bit(paletteram[offset + 0x000]), pal5bit(paletteram[offset + 0x100]), pal5bit(paletteram[offset + 0x200])); } static void get_bg_tile_info(int tile_index) diff --git a/src/vidhrdw/shootout.c b/src/vidhrdw/shootout.c index 98d3d7cc6..44053dffd 100644 --- a/src/vidhrdw/shootout.c +++ b/src/vidhrdw/shootout.c @@ -34,7 +34,7 @@ PALETTE_INIT( shootout ) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/sidepckt.c b/src/vidhrdw/sidepckt.c index 8c7025b66..ff942994d 100644 --- a/src/vidhrdw/sidepckt.c +++ b/src/vidhrdw/sidepckt.c @@ -32,7 +32,7 @@ PALETTE_INIT( sidepckt ) bit3 = (color_prom[i + Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/skyfox.c b/src/vidhrdw/skyfox.c index 40459ae52..741c7ce10 100644 --- a/src/vidhrdw/skyfox.c +++ b/src/vidhrdw/skyfox.c @@ -119,13 +119,13 @@ PALETTE_INIT( skyfox ) bit3 = (color_prom[i + 2*256] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } /* Grey scale for the background??? */ for (i = 0; i < 256; i++) { - palette_set_color(i+256,i,i,i); + palette_set_color(machine,i+256,i,i,i); } } diff --git a/src/vidhrdw/skykid.c b/src/vidhrdw/skykid.c index c04ce08f5..41e106fca 100644 --- a/src/vidhrdw/skykid.c +++ b/src/vidhrdw/skykid.c @@ -48,7 +48,7 @@ PALETTE_INIT( skykid ) bit3 = (color_prom[totcolors*2] >> 3) & 0x01; b = 0x0e*bit0 + 0x1f*bit1 + 0x43*bit2 + 0x8f*bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/slapshot.c b/src/vidhrdw/slapshot.c index 70bc2dce8..a29ff4302 100644 --- a/src/vidhrdw/slapshot.c +++ b/src/vidhrdw/slapshot.c @@ -74,7 +74,7 @@ VIDEO_START( slapshot ) { taito_hide_pixels = 3; taito_sprite_type = 2; - return video_start_slapshot_core(); + return video_start_slapshot_core(machine); } diff --git a/src/vidhrdw/snk.c b/src/vidhrdw/snk.c index b31ed5c4a..b7620c8f4 100644 --- a/src/vidhrdw/snk.c +++ b/src/vidhrdw/snk.c @@ -36,7 +36,7 @@ int snk_blink_parity = 0; PALETTE_INIT( snk_3bpp_shadow ) { int i; - palette_init_RRRR_GGGG_BBBB(colortable, color_prom); + palette_init_RRRR_GGGG_BBBB(machine, colortable, color_prom); if(!(Machine->drv->video_attributes & VIDEO_HAS_SHADOWS)) popmessage("driver should use VIDEO_HAS_SHADOWS"); @@ -51,7 +51,7 @@ PALETTE_INIT( snk_3bpp_shadow ) PALETTE_INIT( snk_4bpp_shadow ) { int i; - palette_init_RRRR_GGGG_BBBB(colortable, color_prom); + palette_init_RRRR_GGGG_BBBB(machine, colortable, color_prom); if(!(Machine->drv->video_attributes & VIDEO_HAS_SHADOWS)) popmessage("driver should use VIDEO_HAS_SHADOWS"); @@ -417,7 +417,7 @@ static void tdfever_draw_bg( mame_bitmap *bitmap, int xscroll, int yscroll ) // intercept overflown tile indices if(tile_number >= gfx->total_elements) - plot_box(tmpbitmap, sx, sy, gfx->width, gfx->height, get_black_pen()); + plot_box(tmpbitmap, sx, sy, gfx->width, gfx->height, get_black_pen(Machine)); else drawgfx(tmpbitmap,gfx,tile_number,color,0,0,sx,sy,0,TRANSPARENCY_NONE,0); } @@ -497,7 +497,7 @@ static void tdfever_draw_sp( mame_bitmap *bitmap, int xscroll, int yscroll, int tile_number |= attributes<<3 & 0x300; color = attributes & 0x0f; if (snk_gamegroup == 7) // ftsoccer - palette_set_shadow_mode(((attributes & 0x6f) == 0x60) ? 1 : 0); + palette_set_shadow_mode(Machine, ((attributes & 0x6f) == 0x60) ? 1 : 0); } drawgfx(bitmap,gfx,tile_number,color,0,0,sx,sy,clip,pen_mode,15); @@ -564,7 +564,7 @@ VIDEO_UPDATE( tdfever ) gfx_drawmode_table[13] = DRAWMODE_SHADOW; gfx_drawmode_table[14] = DRAWMODE_SOURCE; - for (i=0x10e; i<0x200; i+=0x10) palette_set_color(i,snk_blink_parity,snk_blink_parity,snk_blink_parity); + for (i=0x10e; i<0x200; i+=0x10) palette_set_color(machine,i,snk_blink_parity,snk_blink_parity,snk_blink_parity); snk_blink_parity ^= 0x7f; } tdfever_draw_sp( bitmap, sp_scroll_x, sp_scroll_y, 0 ); diff --git a/src/vidhrdw/snk68.c b/src/vidhrdw/snk68.c index ccc536837..61882ca6a 100644 --- a/src/vidhrdw/snk68.c +++ b/src/vidhrdw/snk68.c @@ -141,11 +141,7 @@ WRITE16_HANDLER( pow_paletteram16_word_w ) g = ((newword >> 3) & 0x1e) | ((newword >> 13) & 0x01) ; b = ((newword << 1) & 0x1e) | ((newword >> 12) & 0x01) ; - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,pal5bit(r),pal5bit(g),pal5bit(b)); } WRITE16_HANDLER( pow_video16_w ) diff --git a/src/vidhrdw/snowbros.c b/src/vidhrdw/snowbros.c index 997280309..448502796 100644 --- a/src/vidhrdw/snowbros.c +++ b/src/vidhrdw/snowbros.c @@ -183,7 +183,7 @@ VIDEO_UPDATE( wintbob ) { int offs; - fillbitmap(bitmap,get_black_pen(),&Machine->screen[0].visarea); + fillbitmap(bitmap,get_black_pen(machine),&Machine->screen[0].visarea); for (offs = 0;offs < spriteram_size/2;offs += 8) { @@ -251,7 +251,7 @@ VIDEO_UPDATE( snowbro3 ) /* This clears & redraws the entire screen each pass */ - fillbitmap(bitmap,get_black_pen(),&Machine->screen[0].visarea); + fillbitmap(bitmap,get_black_pen(machine),&Machine->screen[0].visarea); for (offs = 0;offs < spriteram_size/2;offs += 8) { diff --git a/src/vidhrdw/sonson.c b/src/vidhrdw/sonson.c index 86358cdfb..c7b1923d2 100644 --- a/src/vidhrdw/sonson.c +++ b/src/vidhrdw/sonson.c @@ -70,7 +70,7 @@ PALETTE_INIT( sonson ) bit3 = (color_prom[i] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += 2*Machine->drv->total_colors; diff --git a/src/vidhrdw/spacefb.c b/src/vidhrdw/spacefb.c index 12e2dfe95..555c9c75d 100644 --- a/src/vidhrdw/spacefb.c +++ b/src/vidhrdw/spacefb.c @@ -54,7 +54,7 @@ PALETTE_INIT( spacefb ) if (bit1 | bit2) bit0 = 1; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } for (i = 0;i < 4 * 8;i++) @@ -63,10 +63,10 @@ PALETTE_INIT( spacefb ) else colortable[i] = 0; } // RGB background colour flash.. Only red background is actually used - palette_set_color(32,0x47,0,0); /* Red */ - palette_set_color(33,0,0,0x47); /* Blue */ - palette_set_color(34,0x47,0,0x47); /* Red+Blue */ - palette_set_color(35,0x47,0x47,0x47); /* White */ + palette_set_color(machine,32,0x47,0,0); /* Red */ + palette_set_color(machine,33,0,0,0x47); /* Blue */ + palette_set_color(machine,34,0x47,0,0x47); /* Red+Blue */ + palette_set_color(machine,35,0x47,0x47,0x47); /* White */ } diff --git a/src/vidhrdw/spdodgeb.c b/src/vidhrdw/spdodgeb.c index ef2b77053..85283dc56 100644 --- a/src/vidhrdw/spdodgeb.c +++ b/src/vidhrdw/spdodgeb.c @@ -41,7 +41,7 @@ PALETTE_INIT( spdodgeb ) bit3 = (color_prom[Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/speedatk.c b/src/vidhrdw/speedatk.c index ea6df95c5..413a148e0 100644 --- a/src/vidhrdw/speedatk.c +++ b/src/vidhrdw/speedatk.c @@ -53,7 +53,7 @@ PALETTE_INIT( speedatk ) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += 0x10; diff --git a/src/vidhrdw/speedspn.c b/src/vidhrdw/speedspn.c index 4c4362cd9..64f2f6cc3 100644 --- a/src/vidhrdw/speedspn.c +++ b/src/vidhrdw/speedspn.c @@ -95,7 +95,7 @@ VIDEO_UPDATE(speedspn) { if (speedspn_display_disable) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); return 0; } diff --git a/src/vidhrdw/sprcros2.c b/src/vidhrdw/sprcros2.c index 4903c47b5..7ad0ff018 100644 --- a/src/vidhrdw/sprcros2.c +++ b/src/vidhrdw/sprcros2.c @@ -30,7 +30,7 @@ PALETTE_INIT( sprcros2 ) bit1 = (color_prom[i] >> 6) & 0x01; bit2 = (color_prom[i] >> 7) & 0x01; b = 0x47 * bit1 + 0xb8 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } //cluts diff --git a/src/vidhrdw/sprint4.c b/src/vidhrdw/sprint4.c index 1c0aa3306..95093981f 100644 --- a/src/vidhrdw/sprint4.c +++ b/src/vidhrdw/sprint4.c @@ -18,12 +18,12 @@ int sprint4_collision[4]; PALETTE_INIT( sprint4 ) { - palette_set_color(0, 0x00, 0x00, 0x00); /* black */ - palette_set_color(1, 0xfc, 0xdf, 0x80); /* peach */ - palette_set_color(2, 0xf0, 0x00, 0xf0); /* violet */ - palette_set_color(3, 0x00, 0xf0, 0x0f); /* green */ - palette_set_color(4, 0x30, 0x4f, 0xff); /* blue */ - palette_set_color(5, 0xff, 0xff, 0xff); /* white */ + palette_set_color(machine, 0, 0x00, 0x00, 0x00); /* black */ + palette_set_color(machine, 1, 0xfc, 0xdf, 0x80); /* peach */ + palette_set_color(machine, 2, 0xf0, 0x00, 0xf0); /* violet */ + palette_set_color(machine, 3, 0x00, 0xf0, 0x0f); /* green */ + palette_set_color(machine, 4, 0x30, 0x4f, 0xff); /* blue */ + palette_set_color(machine, 5, 0xff, 0xff, 0xff); /* white */ colortable[0] = 0; colortable[2] = 0; @@ -41,10 +41,10 @@ PALETTE_INIT( sprint4 ) PALETTE_INIT( ultratnk ) { - palette_set_color(0, 0x00, 0x00, 0x00); - palette_set_color(1, 0xa4, 0xa4, 0xa4); - palette_set_color(2, 0x5b, 0x5b, 0x5b); - palette_set_color(3, 0xff, 0xff, 0xff); + palette_set_color(machine, 0, 0x00, 0x00, 0x00); + palette_set_color(machine, 1, 0xa4, 0xa4, 0xa4); + palette_set_color(machine, 2, 0x5b, 0x5b, 0x5b); + palette_set_color(machine, 3, 0xff, 0xff, 0xff); colortable[0] = color_prom[0x00] & 3; colortable[2] = color_prom[0x00] & 3; diff --git a/src/vidhrdw/srmp2.c b/src/vidhrdw/srmp2.c index df962584b..96d58149f 100644 --- a/src/vidhrdw/srmp2.c +++ b/src/vidhrdw/srmp2.c @@ -23,19 +23,11 @@ PALETTE_INIT( srmp2 ) for (i = 0; i < Machine->drv->total_colors; i++) { - int col, r, g, b; + int col; col = (color_prom[i] << 8) + color_prom[i + Machine->drv->total_colors]; - r = (col & 0x7c00) >> 10; - g = (col & 0x03e0) >> 5; - b = (col & 0x001f); - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal5bit(col >> 10),pal5bit(col >> 5),pal5bit(col >> 0)); } for (i = 0; i < Machine->drv->total_colors; i++) @@ -51,19 +43,10 @@ PALETTE_INIT( srmp3 ) for (i = 0; i < Machine->drv->total_colors; i++) { - int col, r, g, b; + int col; col = (color_prom[i] << 8) + color_prom[i + Machine->drv->total_colors]; - - r = (col & 0x7c00) >> 10; - g = (col & 0x03e0) >> 5; - b = (col & 0x001f); - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal5bit(col >> 10),pal5bit(col >> 5),pal5bit(col >> 0)); } } diff --git a/src/vidhrdw/sshangha.c b/src/vidhrdw/sshangha.c index 2aeee6523..2665aad3c 100644 --- a/src/vidhrdw/sshangha.c +++ b/src/vidhrdw/sshangha.c @@ -26,7 +26,7 @@ WRITE16_HANDLER( sshangha_palette_24bit_w ) g = (paletteram16[offset+1] >> 8) & 0xff; r = (paletteram16[offset+1] >> 0) & 0xff; - palette_set_color(offset/2,r,g,b); + palette_set_color(Machine,offset/2,r,g,b); } static void sshangha_tilemap_draw(mame_bitmap *bitmap) @@ -243,7 +243,7 @@ VIDEO_UPDATE( sshangha ) tilemap_set_scrolly( pf1_16x16_tilemap,0, sshangha_control_0[2] ); if ((sshangha_control_0[5]&0x8000)==0) - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); /* Super Shanghai has a mode where the two tilemaps are combined to produce a 6bpp tilemap. We can't precompute this as any tiles can be diff --git a/src/vidhrdw/sslam.c b/src/vidhrdw/sslam.c index 823cd6203..72e76719f 100644 --- a/src/vidhrdw/sslam.c +++ b/src/vidhrdw/sslam.c @@ -173,7 +173,7 @@ VIDEO_UPDATE(sslam) { if(!(sslam_regs[6] & 1)) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); return 0; } @@ -211,7 +211,7 @@ VIDEO_UPDATE(powerbls) { if(!(sslam_regs[6] & 1)) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); return 0; } diff --git a/src/vidhrdw/ssozumo.c b/src/vidhrdw/ssozumo.c index 561d463f2..1fec643b6 100644 --- a/src/vidhrdw/ssozumo.c +++ b/src/vidhrdw/ssozumo.c @@ -42,7 +42,7 @@ PALETTE_INIT( ssozumo ) bit3 = (color_prom[64] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } @@ -113,7 +113,7 @@ WRITE8_HANDLER( ssozumo_paletteram_w ) bit3 = (val >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(offs2 + 64, r, g, b); + palette_set_color(Machine, offs2 + 64, r, g, b); } WRITE8_HANDLER( ssozumo_scroll_w ) diff --git a/src/vidhrdw/ssrj.c b/src/vidhrdw/ssrj.c index 100b9bcc9..361c89466 100644 --- a/src/vidhrdw/ssrj.c +++ b/src/vidhrdw/ssrj.c @@ -276,7 +276,7 @@ PALETTE_INIT( ssrj ) int i,j; for(i=0;i<4*4;i++) for(j=0;j<8;j++) - palette_set_color(i*8+j,fakecols[i][j][0],fakecols[i][j][1],fakecols[i][j][2]); + palette_set_color(machine,i*8+j,fakecols[i][j][0],fakecols[i][j][1],fakecols[i][j][2]); } VIDEO_UPDATE( ssrj ) diff --git a/src/vidhrdw/ssv.c b/src/vidhrdw/ssv.c index e5c152c8b..155b89727 100644 --- a/src/vidhrdw/ssv.c +++ b/src/vidhrdw/ssv.c @@ -201,7 +201,7 @@ VIDEO_START( ssv ) VIDEO_START( eaglshot ) { - if ( video_start_ssv() ) + if ( video_start_ssv(machine) ) return 1; eaglshot_gfxram = (UINT16*)auto_malloc(16 * 0x40000); @@ -227,7 +227,7 @@ WRITE16_HANDLER( gdfs_tmapram_w ) VIDEO_START( gdfs ) { - if ( video_start_ssv() ) + if ( video_start_ssv(machine) ) return 1; Machine->gfx[2]->color_granularity = 64; /* 256 colour sprites with palette selectable on 64 colour boundaries */ @@ -292,6 +292,8 @@ char eaglshot_dirty, *eaglshot_dirty_tile; CRT controller, registers that are written (resolution, visible area, flipping etc. ?) + + 1c0060-7f: drifto94: 0000 0025 00cd 01c6 - 0001 0013 0101 0106 @@ -409,7 +411,7 @@ WRITE16_HANDLER( paletteram16_xrgb_swap_word_w ) g = data1 >> 8; b = data1 & 0xff; - palette_set_color(offset>>1, r, g, b); + palette_set_color(Machine, offset>>1, r, g, b); if (!(Machine->drv->video_attributes & VIDEO_NEEDS_6BITS_PER_GUN)) popmessage("driver should use VIDEO_NEEDS_6BITS_PER_GUN flag"); @@ -814,6 +816,7 @@ static void ssv_draw_sprites(mame_bitmap *bitmap) case 0x4940: sy += 0x60; break; // srmp4 case 0x5940: sy -= 0x20; break; // drifto94, dynagear, eaglshot, keithlcy, mslider, stmblade case 0x5950: sy += 0xdf; break; // gdfs + case 0x7940: sy -= 0x10; break; // ultrax, twineag2 } ssv_draw_row(bitmap, sx, sy, scroll); @@ -867,10 +870,15 @@ static void ssv_draw_sprites(mame_bitmap *bitmap) if (ssv_scroll[0x74/2] == 0x6500) // vasara sy = 0xe8 - sy; - if (ssv_scroll[0x74/2] & 0x8000) // srmp7, twineag2, ultrax + if (ssv_scroll[0x74/2] & 0x8000) // srmp7, twineag2, ultrax { - sx = ssv_sprites_offsx + sx; - sy = ssv_sprites_offsy + sy; + if (ssv_scroll[0x76/2] & 0x4000) { // twineag2, ultrax + sx = ssv_sprites_offsx + sx - (xnum-1) * 8; + sy = ssv_sprites_offsy + sy - (ynum * 8) / 2; + } else { // srmp7 + sx = ssv_sprites_offsx + sx; + sy = ssv_sprites_offsy + sy; + } } else if (ssv_scroll[0x76/2] & 0x1000) // eaglshot { @@ -943,7 +951,7 @@ VIDEO_UPDATE( eaglshot ) } } - video_update_ssv(screen, bitmap, cliprect); + video_update_ssv(machine, screen, bitmap, cliprect); return 0; } @@ -1114,7 +1122,7 @@ VIDEO_UPDATE( gdfs ) { int tile, pri; - video_update_ssv(screen, bitmap, cliprect); + video_update_ssv(machine, screen, bitmap, cliprect); // Decode zooming sprites tiles from ram if (eaglshot_dirty) diff --git a/src/vidhrdw/st0016.c b/src/vidhrdw/st0016.c index 294ad8f90..ba59ed1cb 100644 --- a/src/vidhrdw/st0016.c +++ b/src/vidhrdw/st0016.c @@ -100,17 +100,12 @@ READ8_HANDLER (st0016_palette_ram_r) WRITE8_HANDLER (st0016_palette_ram_w) { int color=(ST0016_PAL_BANK_SIZE*st0016_pal_bank+offset)/2; - int r,g,b,val; + int val; st0016_paletteram[ST0016_PAL_BANK_SIZE*st0016_pal_bank+offset]=data; val=st0016_paletteram[color*2]+(st0016_paletteram[color*2+1]<<8); - r=(val&31)<<3; - val>>=5; - g=(val&31)<<3; - val>>=5; - b=(val&31)<<3; if(!color) - palette_set_color(UNUSED_PEN,r,g,b); /* same as color 0 - bg ? */ - palette_set_color(color,r,g,b); + palette_set_color(Machine,UNUSED_PEN,pal5bit(val >> 0),pal5bit(val >> 5),pal5bit(val >> 10)); /* same as color 0 - bg ? */ + palette_set_color(Machine,color,pal5bit(val >> 0),pal5bit(val >> 5),pal5bit(val >> 10)); } READ8_HANDLER(st0016_character_ram_r) @@ -148,7 +143,7 @@ READ8_HANDLER(st0016_vregs_r) { case 0: case 1: - return mame_rand(); + return mame_rand(Machine); } return st0016_vregs[offset]; diff --git a/src/vidhrdw/stactics.c b/src/vidhrdw/stactics.c index 506c6c78a..71b1e8424 100644 --- a/src/vidhrdw/stactics.c +++ b/src/vidhrdw/stactics.c @@ -179,7 +179,7 @@ PALETTE_INIT( stactics ) /* blue component */ b = 0xff * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } /* The color prom in Space Tactics is used for both */ diff --git a/src/vidhrdw/starfire.c b/src/vidhrdw/starfire.c index 0ca816a76..f1c70f171 100644 --- a/src/vidhrdw/starfire.c +++ b/src/vidhrdw/starfire.c @@ -76,9 +76,6 @@ WRITE8_HANDLER( starfire_colorram_w ) if ((offset & 0xe0) == 0) { int palette_index = (offset & 0x1f) | ((offset & 0x200) >> 4); - int r = ((data << 1) & 0x06) | ((offset >> 8) & 0x01); - int b = (data >> 2) & 0x07; - int g = (data >> 5) & 0x07; /* set RAM regardless */ starfire_colorram[offset & ~0x100] = data; @@ -89,11 +86,7 @@ WRITE8_HANDLER( starfire_colorram_w ) if (!(starfire_vidctrl1 & 0x40)) return; - /* modify the pen */ - r = (r << 5) | (r << 2) | (r >> 1); - b = (b << 5) | (b << 2) | (b >> 1); - g = (g << 5) | (g << 2) | (g >> 1); - palette_set_color(palette_index, r, g, b); + palette_set_color(Machine, palette_index, pal3bit((data << 1) & 0x06) | ((offset >> 8) & 0x01), pal3bit(data >> 5), pal3bit(data >> 2)); } /* handle writes to the rest of color RAM */ diff --git a/src/vidhrdw/stfight.c b/src/vidhrdw/stfight.c index 54ba63955..aa0d0d1b1 100644 --- a/src/vidhrdw/stfight.c +++ b/src/vidhrdw/stfight.c @@ -45,7 +45,7 @@ PALETTE_INIT( stfight ) /* unique color for transparency */ - palette_set_color(256,0x04,0x04,0x04); + palette_set_color(machine,256,0x04,0x04,0x04); /* text uses colors 192-207 */ for (i = 0;i < TOTAL_COLORS(0);i++) diff --git a/src/vidhrdw/strnskil.c b/src/vidhrdw/strnskil.c index 51da16762..e544df4be 100644 --- a/src/vidhrdw/strnskil.c +++ b/src/vidhrdw/strnskil.c @@ -21,11 +21,11 @@ PALETTE_INIT( strnskil ) for (i = 0;i < Machine->drv->total_colors;i++) { - int r = color_prom[0]*0x11; - int g = color_prom[Machine->drv->total_colors]*0x11; - int b = color_prom[2*Machine->drv->total_colors]*0x11; + int r = color_prom[0]; + int g = color_prom[Machine->drv->total_colors]; + int b = color_prom[2*Machine->drv->total_colors]; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal4bit(r),pal4bit(g),pal4bit(b)); color_prom++; } diff --git a/src/vidhrdw/stvvdp1.c b/src/vidhrdw/stvvdp1.c index 6e22a97e5..7253d9c46 100644 --- a/src/vidhrdw/stvvdp1.c +++ b/src/vidhrdw/stvvdp1.c @@ -608,12 +608,58 @@ why they would want to */ extern UINT32* stv_vdp2_cram; -INLINE void drawpixel(UINT16 *dest, int patterndata, int offsetcnt) +static UINT8* gfxdata; +static UINT16 sprite_colorbank; + + +void (*drawpixel)(int x, int y, int patterndata, int offsetcnt); + +void drawpixel_poly(int x, int y, int patterndata, int offsetcnt) +{ + stv_framebuffer_draw_lines[y][x] = stv2_current_sprite.CMDCOLR; +} + +void drawpixel_8bpp(int x, int y, int patterndata, int offsetcnt) +{ + UINT16 pix; + + pix = gfxdata[patterndata+offsetcnt]; + if ( pix & 0xff ) + { + stv_framebuffer_draw_lines[y][x] = pix | sprite_colorbank; + } +}; + +void drawpixel_4bpp_notrans(int x, int y, int patterndata, int offsetcnt) +{ + UINT16 pix; + + pix = gfxdata[patterndata+offsetcnt/2]; + pix = offsetcnt&1 ? (pix & 0x0f):((pix & 0xf0)>>4) ; + stv_framebuffer_draw_lines[y][x] = pix | sprite_colorbank; +} + +void drawpixel_4bpp_trans(int x, int y, int patterndata, int offsetcnt) { - int pix,mode,transmask,spd = stv2_current_sprite.CMDPMOD & 0x40; - UINT8* gfxdata = stv_vdp1_gfx_decode; + UINT16 pix; + + pix = gfxdata[patterndata+offsetcnt/2]; + pix = offsetcnt&1 ? (pix & 0x0f):((pix & 0xf0)>>4) ; + if ( pix ) + stv_framebuffer_draw_lines[y][x] = pix | sprite_colorbank; +} + +void drawpixel_generic(int x, int y, int patterndata, int offsetcnt) +{ + int pix,mode,transmask, spd = stv2_current_sprite.CMDPMOD & 0x40; + int mesh = stv2_current_sprite.CMDPMOD & 0x100; int pix2; + if ( mesh && !((x ^ y) & 1) ) + { + return; + } + if ( stv2_current_sprite.ispoly ) { pix = stv2_current_sprite.CMDCOLR&0xffff; @@ -686,6 +732,7 @@ INLINE void drawpixel(UINT16 *dest, int patterndata, int offsetcnt) case 0x0028: // mode 5 32,768 colour RGB mode (16bits) pix = gfxdata[patterndata+offsetcnt*2+1] | (gfxdata[patterndata+offsetcnt*2]<<8) ; mode = 5; + //transmask = 0x7fff; transmask = 0x8000; break; default: // other settings illegal @@ -709,7 +756,7 @@ INLINE void drawpixel(UINT16 *dest, int patterndata, int offsetcnt) { if ( (pix & transmask) || spd ) { - *dest = pix; + stv_framebuffer_draw_lines[y][x] = pix; } } else @@ -719,38 +766,81 @@ INLINE void drawpixel(UINT16 *dest, int patterndata, int offsetcnt) switch( stv2_current_sprite.CMDPMOD & 0x7 ) { case 0: /* replace */ - *dest = pix; + stv_framebuffer_draw_lines[y][x] = pix; break; case 1: /* shadow */ - if ( *dest & 0x8000 ) + if ( stv_framebuffer_draw_lines[y][x] & 0x8000 ) { - *dest = ((*dest & ~0x8421) >> 1) | 0x8000; + stv_framebuffer_draw_lines[y][x] = ((stv_framebuffer_draw_lines[y][x] & ~0x8421) >> 1) | 0x8000; } break; case 2: /* half luminance */ - *dest = ((pix & ~0x8421) >> 1) | 0x8000; + stv_framebuffer_draw_lines[y][x] = ((pix & ~0x8421) >> 1) | 0x8000; break; case 3: /* half transparent */ - if ( *dest & 0x8000 ) + if ( stv_framebuffer_draw_lines[y][x] & 0x8000 ) { - *dest = alpha_blend_r16( *dest, pix, 0x80 ) | 0x8000; + stv_framebuffer_draw_lines[y][x] = alpha_blend_r16( stv_framebuffer_draw_lines[y][x], pix, 0x80 ) | 0x8000; } else { - *dest = pix; + stv_framebuffer_draw_lines[y][x] = pix; } break; case 4: /* Gouraud shading */ - *dest = stv_apply_gouraud_shading( pix ); + stv_framebuffer_draw_lines[y][x] = stv_apply_gouraud_shading( pix ); break; default: - *dest = pix; - //popmessage( "Unsupported VDP1 draw mode %x", stv2_current_sprite.CMDPMOD & 0x7 ); + stv_framebuffer_draw_lines[y][x] = pix; break; } } } +} + + +static void stv_vdp1_set_drawpixel(void) +{ + int sprite_type = stv2_current_sprite.CMDCTRL & 0x000f; + int sprite_mode = stv2_current_sprite.CMDPMOD&0x0038; + int spd = stv2_current_sprite.CMDPMOD & 0x40; + int mesh = stv2_current_sprite.CMDPMOD & 0x100; + + gfxdata = stv_vdp1_gfx_decode; + + if ( mesh ) + { + drawpixel = drawpixel_generic; + return; + } + if (sprite_type == 4 ) + { + drawpixel = drawpixel_poly; + } + else if ((sprite_type == 2) && + (sprite_mode == 0x20) ) + { + /* distorted sprite, 8bpp */ + sprite_colorbank = (stv2_current_sprite.CMDCOLR&0xff00); + drawpixel = drawpixel_8bpp; + } + else if ((sprite_type == 1) && + (sprite_mode == 0x00) && + spd) + { + sprite_colorbank = (stv2_current_sprite.CMDCOLR&0xfff0); + drawpixel = drawpixel_4bpp_notrans; + } + else if (sprite_mode == 0x00 && !spd ) + { + sprite_colorbank = (stv2_current_sprite.CMDCOLR&0xfff0); + drawpixel = drawpixel_4bpp_trans; + } + else + { + drawpixel = drawpixel_generic; + } } @@ -851,7 +941,7 @@ static void vdp1_fill_slope(mame_bitmap *bitmap, const rectangle *cliprect, int xx2 = cliprect->max_x; while(xx1 <= xx2) { - drawpixel(stv_framebuffer_draw_lines[_y1]+xx1, + drawpixel(xx1,_y1, patterndata, (v>>FRAC_SHIFT)*xsize+(u>>FRAC_SHIFT)); xx1++; @@ -905,7 +995,7 @@ static void vdp1_fill_line(mame_bitmap *bitmap, const rectangle *cliprect, int p xx2 = cliprect->max_x; while(xx1 <= xx2) { - drawpixel(stv_framebuffer_draw_lines[y]+xx1, + drawpixel(xx1,y, patterndata, (v>>FRAC_SHIFT)*xsize+(u>>FRAC_SHIFT)); xx1++; @@ -1089,6 +1179,68 @@ void stv_vdp1_draw_line( mame_bitmap *bitmap, const rectangle *cliprect) vdp1_fill_quad(bitmap, cliprect, 0, 1, q); } +void stv_vdp1_draw_poly_line( mame_bitmap *bitmap, const rectangle *cliprect) +{ + struct spoint q[4]; + + q[0].x = x2s(stv2_current_sprite.CMDXA); + q[0].y = y2s(stv2_current_sprite.CMDYA); + q[1].x = x2s(stv2_current_sprite.CMDXB); + q[1].y = y2s(stv2_current_sprite.CMDYB); + q[2].x = x2s(stv2_current_sprite.CMDXA); + q[2].y = y2s(stv2_current_sprite.CMDYA); + q[3].x = x2s(stv2_current_sprite.CMDXB); + q[3].y = y2s(stv2_current_sprite.CMDYB); + + q[0].u = q[3].u = q[1].u = q[2].u = 0; + q[0].v = q[1].v = q[2].v = q[3].v = 0; + + vdp1_fill_quad(bitmap, cliprect, 0, 1, q); + + q[0].x = x2s(stv2_current_sprite.CMDXB); + q[0].y = y2s(stv2_current_sprite.CMDYB); + q[1].x = x2s(stv2_current_sprite.CMDXC); + q[1].y = y2s(stv2_current_sprite.CMDYC); + q[2].x = x2s(stv2_current_sprite.CMDXB); + q[2].y = y2s(stv2_current_sprite.CMDYB); + q[3].x = x2s(stv2_current_sprite.CMDXC); + q[3].y = y2s(stv2_current_sprite.CMDYC); + + q[0].u = q[3].u = q[1].u = q[2].u = 0; + q[0].v = q[1].v = q[2].v = q[3].v = 0; + + vdp1_fill_quad(bitmap, cliprect, 0, 1, q); + + q[0].x = x2s(stv2_current_sprite.CMDXC); + q[0].y = y2s(stv2_current_sprite.CMDYC); + q[1].x = x2s(stv2_current_sprite.CMDXD); + q[1].y = y2s(stv2_current_sprite.CMDYD); + q[2].x = x2s(stv2_current_sprite.CMDXC); + q[2].y = y2s(stv2_current_sprite.CMDYC); + q[3].x = x2s(stv2_current_sprite.CMDXD); + q[3].y = y2s(stv2_current_sprite.CMDYD); + + q[0].u = q[3].u = q[1].u = q[2].u = 0; + q[0].v = q[1].v = q[2].v = q[3].v = 0; + + vdp1_fill_quad(bitmap, cliprect, 0, 1, q); + + q[0].x = x2s(stv2_current_sprite.CMDXD); + q[0].y = y2s(stv2_current_sprite.CMDYD); + q[1].x = x2s(stv2_current_sprite.CMDXA); + q[1].y = y2s(stv2_current_sprite.CMDYA); + q[2].x = x2s(stv2_current_sprite.CMDXD); + q[2].y = y2s(stv2_current_sprite.CMDYD); + q[3].x = x2s(stv2_current_sprite.CMDXA); + q[3].y = y2s(stv2_current_sprite.CMDYA); + + q[0].u = q[3].u = q[1].u = q[2].u = 0; + q[0].v = q[1].v = q[2].v = q[3].v = 0; + + vdp1_fill_quad(bitmap, cliprect, 0, 1, q); + +} + void stv_vpd1_draw_distorted_sprite(mame_bitmap *bitmap, const rectangle *cliprect) { struct spoint q[4]; @@ -1365,7 +1517,7 @@ void stv_vpd1_draw_normal_sprite(mame_bitmap *bitmap, const rectangle *cliprect, su = u; for (drawxpos = x; drawxpos <= maxdrawxpos; drawxpos++ ) { - drawpixel( destline + drawxpos, patterndata, u ); + drawpixel( drawxpos, drawypos, patterndata, u ); u += dux; } u = su + duy; @@ -1408,7 +1560,7 @@ void stv_vpd1_draw_normal_sprite(mame_bitmap *bitmap, const rectangle *cliprect, offsetcnt = ycnt*xsize+xcnt; - drawpixel(destline+drawxpos, patterndata, offsetcnt); + drawpixel(drawxpos, drawypos, patterndata, offsetcnt); } // drawxpos stv_compute_shading_for_next_point(); @@ -1560,6 +1712,8 @@ void stv_vdp1_process_list(mame_bitmap *bitmap, const rectangle *cliprect) /* continue to draw this sprite only if the command wasn't to skip it */ if (draw_this_sprite ==1) { + stv_vdp1_set_drawpixel(); + switch (stv2_current_sprite.CMDCTRL & 0x000f) { case 0x0000: @@ -1598,6 +1752,8 @@ void stv_vdp1_process_list(mame_bitmap *bitmap, const rectangle *cliprect) case 0x0005: if (vdp1_sprite_log) logerror ("Sprite List Polyline\n"); + stv2_current_sprite.ispoly = 1; + stv_vdp1_draw_poly_line(bitmap,cliprect); break; case 0x0006: @@ -1646,7 +1802,7 @@ void stv_vdp1_process_list(mame_bitmap *bitmap, const rectangle *cliprect) if (vdp1_sprite_log) logerror ("End of list processing!\n"); } -void video_update_vdp1(mame_bitmap *bitmap, const rectangle *cliprect) +void video_update_vdp1(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect) { int framebufer_changed = 0; diff --git a/src/vidhrdw/stvvdp2.c b/src/vidhrdw/stvvdp2.c index f876d73cf..48e45bbe8 100644 --- a/src/vidhrdw/stvvdp2.c +++ b/src/vidhrdw/stvvdp2.c @@ -94,7 +94,7 @@ extern UINT8* stv_vdp1_gfx_decode; static int stv_vdp2_render_rbg0; UINT32* stv_vdp2_cram; -extern void video_update_vdp1(mame_bitmap *bitmap, const rectangle *cliprect); +extern void video_update_vdp1(running_machine *machine,mame_bitmap *bitmap, const rectangle *cliprect); extern int stv_vdp1_start ( void ); static void stv_vdp2_dynamic_res_change(void); static void stv_vdp2_fade_effects(void); @@ -2112,11 +2112,7 @@ static struct _stv_rbg_cache_data } stv_rbg_cache_data; -INLINE INT32 mul_fixed32( INT32 a, INT32 b ) -{ - INT64 result = (INT64)a * b; - return (INT32)((result >> 16) & 0xffffffff); -} +#define mul_fixed32( a, b ) fixed_mul_shift( a, b, 16 ) static void stv_vdp2_fill_rotation_parameter_table( UINT8 rot_parameter ) { @@ -2242,6 +2238,30 @@ static UINT8 stv_vdp2_are_map_registers_equal(void) return 1; } +static void stv_vdp2_check_fade_control_for_layer(void) +{ + if ( stv2_current_tilemap.fade_control & 1 ) + { + if ( stv2_current_tilemap.fade_control & 2 ) + { + if ((STV_VDP2_COBR & 0x1ff) == 0 && + (STV_VDP2_COBG & 0x1ff) == 0 && + (STV_VDP2_COBB & 0x1ff) == 0 ) + { + stv2_current_tilemap.fade_control = 0; + } + } + else + { + if ((STV_VDP2_COAR & 0x1ff) == 0 && + (STV_VDP2_COAG & 0x1ff) == 0 && + (STV_VDP2_COAB & 0x1ff) == 0 ) + { + stv2_current_tilemap.fade_control = 0; + } + } + } +} #define STV_VDP2_CP_NBG0_PNMDR 0x0 #define STV_VDP2_CP_NBG1_PNMDR 0x1 @@ -3997,7 +4017,7 @@ static void stv_vdp2_copy_roz_bitmap(mame_bitmap *bitmap, line = (UINT16*)bitmap->line[vcnt]; - if ( !use_coeff_table || RP.dkast == 0 ) + if ( !use_coeff_table || RP.dkax == 0 ) { if ( use_coeff_table ) { @@ -4252,6 +4272,7 @@ static void stv_vdp2_draw_NBG0(mame_bitmap *bitmap, const rectangle *cliprect) stv2_current_tilemap.plane_size = STV_VDP2_N0PLSZ; stv2_current_tilemap.colour_ram_address_offset = STV_VDP2_N0CAOS; stv2_current_tilemap.fade_control = (STV_VDP2_N0COEN * 1) | (STV_VDP2_N0COSL * 2); + stv_vdp2_check_fade_control_for_layer(); stv2_current_tilemap.window_control = (STV_VDP2_N0LOG * 0x01) | (STV_VDP2_N0W0E * 0x02) | (STV_VDP2_N0W1E * 0x04) | @@ -4340,6 +4361,7 @@ static void stv_vdp2_draw_NBG1(mame_bitmap *bitmap, const rectangle *cliprect) stv2_current_tilemap.plane_size = STV_VDP2_N1PLSZ; stv2_current_tilemap.colour_ram_address_offset = STV_VDP2_N1CAOS; stv2_current_tilemap.fade_control = (STV_VDP2_N1COEN * 1) | (STV_VDP2_N1COSL * 2); + stv_vdp2_check_fade_control_for_layer(); stv2_current_tilemap.window_control = (STV_VDP2_N1LOG * 0x01) | (STV_VDP2_N1W0E * 0x02) | (STV_VDP2_N1W1E * 0x04) | @@ -4436,6 +4458,7 @@ static void stv_vdp2_draw_NBG2(mame_bitmap *bitmap, const rectangle *cliprect) stv2_current_tilemap.colour_ram_address_offset = STV_VDP2_N2CAOS; stv2_current_tilemap.fade_control = (STV_VDP2_N2COEN * 1) | (STV_VDP2_N2COSL * 2); + stv_vdp2_check_fade_control_for_layer(); stv2_current_tilemap.window_control = (STV_VDP2_N2LOG * 0x01) | (STV_VDP2_N2W0E * 0x02) | (STV_VDP2_N2W1E * 0x04) | @@ -4534,6 +4557,7 @@ static void stv_vdp2_draw_NBG3(mame_bitmap *bitmap, const rectangle *cliprect) stv2_current_tilemap.colour_ram_address_offset = STV_VDP2_N3CAOS; stv2_current_tilemap.fade_control = (STV_VDP2_N3COEN * 1) | (STV_VDP2_N3COSL * 2); + stv_vdp2_check_fade_control_for_layer(); stv2_current_tilemap.window_control = (STV_VDP2_N3LOG * 0x01) | (STV_VDP2_N3W0E * 0x02) | (STV_VDP2_N3W1E * 0x04) | @@ -4698,7 +4722,7 @@ static void stv_vdp2_draw_rotation_screen(mame_bitmap *bitmap, const rectangle * 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 ) { - fillbitmap( stv_vdp2_roz_bitmap[iRP-1], get_black_pen(), &roz_clip_rect ); + fillbitmap( stv_vdp2_roz_bitmap[iRP-1], get_black_pen(Machine), &roz_clip_rect ); stv_vdp2_check_tilemap(stv_vdp2_roz_bitmap[iRP-1], &roz_clip_rect); // prepare cache data stv_rbg_cache_data.watch_vdp2_vram_writes |= iRP; @@ -4793,6 +4817,7 @@ static void stv_vdp2_draw_RBG0(mame_bitmap *bitmap, const rectangle *cliprect) stv2_current_tilemap.colour_ram_address_offset = STV_VDP2_R0CAOS; stv2_current_tilemap.fade_control = (STV_VDP2_R0COEN * 1) | (STV_VDP2_R0COSL * 2); + stv_vdp2_check_fade_control_for_layer(); stv2_current_tilemap.window_control = (STV_VDP2_R0LOG * 0x01) | (STV_VDP2_R0W0E * 0x02) | (STV_VDP2_R0W1E * 0x04) | @@ -4846,7 +4871,7 @@ static void stv_vdp2_draw_back(mame_bitmap *bitmap, const rectangle *cliprect) UINT16 data; if(!(STV_VDP2_BDCLMD & 1)) - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(Machine), cliprect); else { #ifdef MAME_DEBUG @@ -4948,7 +4973,7 @@ WRITE32_HANDLER ( stv_vdp2_cram_w ) b = ((stv_vdp2_cram[offset] & 0x00ff0000) >> 16); g = ((stv_vdp2_cram[offset] & 0x0000ff00) >> 8); r = ((stv_vdp2_cram[offset] & 0x000000ff) >> 0); - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } break; /*Mode 0*/ @@ -4959,17 +4984,11 @@ WRITE32_HANDLER ( stv_vdp2_cram_w ) b = ((stv_vdp2_cram[offset] & 0x00007c00) >> 10); g = ((stv_vdp2_cram[offset] & 0x000003e0) >> 5); r = ((stv_vdp2_cram[offset] & 0x0000001f) >> 0); - b*=0x8; - g*=0x8; - r*=0x8; - palette_set_color((offset*2)+1,r,g,b); + palette_set_color(Machine,(offset*2)+1,pal5bit(r),pal5bit(g),pal5bit(b)); b = ((stv_vdp2_cram[offset] & 0x7c000000) >> 26); g = ((stv_vdp2_cram[offset] & 0x03e00000) >> 21); r = ((stv_vdp2_cram[offset] & 0x001f0000) >> 16); - b*=0x8; - g*=0x8; - r*=0x8; - palette_set_color(offset*2,r,g,b); + palette_set_color(Machine,offset*2,pal5bit(r),pal5bit(g),pal5bit(b)); } break; /*Mode 1*/ @@ -4980,17 +4999,11 @@ WRITE32_HANDLER ( stv_vdp2_cram_w ) b = ((stv_vdp2_cram[offset] & 0x00007c00) >> 10); g = ((stv_vdp2_cram[offset] & 0x000003e0) >> 5); r = ((stv_vdp2_cram[offset] & 0x0000001f) >> 0); - b*=0x8; - g*=0x8; - r*=0x8; - palette_set_color((offset*2)+1,r,g,b); + palette_set_color(Machine,(offset*2)+1,pal5bit(r),pal5bit(g),pal5bit(b)); b = ((stv_vdp2_cram[offset] & 0x7c000000) >> 26); g = ((stv_vdp2_cram[offset] & 0x03e00000) >> 21); r = ((stv_vdp2_cram[offset] & 0x001f0000) >> 16); - b*=0x8; - g*=0x8; - r*=0x8; - palette_set_color(offset*2,r,g,b); + palette_set_color(Machine,offset*2,pal5bit(r),pal5bit(g),pal5bit(b)); } break; } @@ -5012,7 +5025,7 @@ static void refresh_palette_data() b = ((stv_vdp2_cram[c_i] & 0x00ff0000) >> 16); g = ((stv_vdp2_cram[c_i] & 0x0000ff00) >> 8); r = ((stv_vdp2_cram[c_i] & 0x000000ff) >> 0); - palette_set_color(c_i,r,g,b); + palette_set_color(Machine,c_i,r,g,b); } break; /*Mode 0*/ @@ -5023,17 +5036,11 @@ static void refresh_palette_data() b = ((stv_vdp2_cram[c_i] & 0x00007c00) >> 10); g = ((stv_vdp2_cram[c_i] & 0x000003e0) >> 5); r = ((stv_vdp2_cram[c_i] & 0x0000001f) >> 0); - b*=0x8; - g*=0x8; - r*=0x8; - palette_set_color((c_i*2)+1,r,g,b); + palette_set_color(Machine,(c_i*2)+1,pal5bit(r),pal5bit(g),pal5bit(b)); b = ((stv_vdp2_cram[c_i] & 0x7c000000) >> 26); g = ((stv_vdp2_cram[c_i] & 0x03e00000) >> 21); r = ((stv_vdp2_cram[c_i] & 0x001f0000) >> 16); - b*=0x8; - g*=0x8; - r*=0x8; - palette_set_color(c_i*2,r,g,b); + palette_set_color(Machine,c_i*2,pal5bit(r),pal5bit(g),pal5bit(b)); } break; /*Mode 1*/ @@ -5044,17 +5051,11 @@ static void refresh_palette_data() b = ((stv_vdp2_cram[c_i] & 0x00007c00) >> 10); g = ((stv_vdp2_cram[c_i] & 0x000003e0) >> 5); r = ((stv_vdp2_cram[c_i] & 0x0000001f) >> 0); - b*=0x8; - g*=0x8; - r*=0x8; - palette_set_color((c_i*2)+1,r,g,b); + palette_set_color(Machine,(c_i*2)+1,pal5bit(r),pal5bit(g),pal5bit(b)); b = ((stv_vdp2_cram[c_i] & 0x7c000000) >> 26); g = ((stv_vdp2_cram[c_i] & 0x03e00000) >> 21); r = ((stv_vdp2_cram[c_i] & 0x001f0000) >> 16); - b*=0x8; - g*=0x8; - r*=0x8; - palette_set_color(c_i*2,r,g,b); + palette_set_color(Machine,c_i*2,pal5bit(r),pal5bit(g),pal5bit(b)); } break; } @@ -5184,15 +5185,16 @@ static void stv_vdp2_fade_effects() */ INT16 t_r,t_g,t_b; UINT8 r,g,b; + rgb_t color; int i; //popmessage("%04x %04x",STV_VDP2_CLOFEN,STV_VDP2_CLOFSL); for(i=0;i<2048;i++) { /*Fade A*/ - palette_get_color(i, &r, &g, &b); - t_r = (STV_VDP2_COAR & 0x100) ? (r - (0x100 - (STV_VDP2_COAR & 0xff))) : ((STV_VDP2_COAR & 0xff) + r); - t_g = (STV_VDP2_COAG & 0x100) ? (g - (0x100 - (STV_VDP2_COAG & 0xff))) : ((STV_VDP2_COAG & 0xff) + g); - t_b = (STV_VDP2_COAB & 0x100) ? (b - (0x100 - (STV_VDP2_COAB & 0xff))) : ((STV_VDP2_COAB & 0xff) + b); + color = palette_get_color(Machine, i); + t_r = (STV_VDP2_COAR & 0x100) ? (RGB_RED(color) - (0x100 - (STV_VDP2_COAR & 0xff))) : ((STV_VDP2_COAR & 0xff) + RGB_RED(color)); + t_g = (STV_VDP2_COAG & 0x100) ? (RGB_GREEN(color) - (0x100 - (STV_VDP2_COAG & 0xff))) : ((STV_VDP2_COAG & 0xff) + RGB_GREEN(color)); + t_b = (STV_VDP2_COAB & 0x100) ? (RGB_BLUE(color) - (0x100 - (STV_VDP2_COAB & 0xff))) : ((STV_VDP2_COAB & 0xff) + RGB_BLUE(color)); if(t_r < 0) { t_r = 0; } if(t_r > 0xff) { t_r = 0xff; } if(t_g < 0) { t_g = 0; } @@ -5202,13 +5204,13 @@ static void stv_vdp2_fade_effects() r = t_r; g = t_g; b = t_b; - palette_set_color(i+(2048*1),r,g,b); + palette_set_color(Machine,i+(2048*1),r,g,b); /*Fade B*/ - palette_get_color(i, &r, &g, &b); - t_r = (STV_VDP2_COBR & 0x100) ? (r - (0xff - (STV_VDP2_COBR & 0xff))) : ((STV_VDP2_COBR & 0xff) + r); - t_g = (STV_VDP2_COBG & 0x100) ? (g - (0xff - (STV_VDP2_COBG & 0xff))) : ((STV_VDP2_COBG & 0xff) + g); - t_b = (STV_VDP2_COBB & 0x100) ? (b - (0xff - (STV_VDP2_COBB & 0xff))) : ((STV_VDP2_COBB & 0xff) + b); + color = palette_get_color(Machine, i); + t_r = (STV_VDP2_COBR & 0x100) ? (RGB_RED(color) - (0xff - (STV_VDP2_COBR & 0xff))) : ((STV_VDP2_COBR & 0xff) + RGB_RED(color)); + t_g = (STV_VDP2_COBG & 0x100) ? (RGB_GREEN(color) - (0xff - (STV_VDP2_COBG & 0xff))) : ((STV_VDP2_COBG & 0xff) + RGB_GREEN(color)); + t_b = (STV_VDP2_COBB & 0x100) ? (RGB_BLUE(color) - (0xff - (STV_VDP2_COBB & 0xff))) : ((STV_VDP2_COBB & 0xff) + RGB_BLUE(color)); if(t_r < 0) { t_r = 0; } if(t_r > 0xff) { t_r = 0xff; } if(t_g < 0) { t_g = 0; } @@ -5218,7 +5220,7 @@ static void stv_vdp2_fade_effects() r = t_r; g = t_g; b = t_b; - palette_set_color(i+(2048*2),r,g,b); + palette_set_color(Machine,i+(2048*2),r,g,b); } //popmessage("%04x %04x %04x %04x %04x %04x",STV_VDP2_COAR,STV_VDP2_COAG,STV_VDP2_COAB,STV_VDP2_COBR,STV_VDP2_COBG,STV_VDP2_COBB); } @@ -5853,7 +5855,7 @@ VIDEO_UPDATE( stv_vdp2 ) stv_vdp2_dynamic_res_change(); - video_update_vdp1(bitmap,cliprect); + video_update_vdp1(machine,bitmap,cliprect); stv_vdp2_fade_effects(); diff --git a/src/vidhrdw/subs.c b/src/vidhrdw/subs.c index a5785c163..0bb84502e 100644 --- a/src/vidhrdw/subs.c +++ b/src/vidhrdw/subs.c @@ -12,13 +12,13 @@ WRITE8_HANDLER( subs_invert1_w ) { if ((offset & 0x01) == 1) { - palette_set_color(0, 0x00, 0x00, 0x00); - palette_set_color(1, 0xFF, 0xFF, 0xFF); + palette_set_color(Machine, 0, 0x00, 0x00, 0x00); + palette_set_color(Machine, 1, 0xFF, 0xFF, 0xFF); } else { - palette_set_color(1, 0x00, 0x00, 0x00); - palette_set_color(0, 0xFF, 0xFF, 0xFF); + palette_set_color(Machine, 1, 0x00, 0x00, 0x00); + palette_set_color(Machine, 0, 0xFF, 0xFF, 0xFF); } } @@ -26,13 +26,13 @@ WRITE8_HANDLER( subs_invert2_w ) { if ((offset & 0x01) == 1) { - palette_set_color(2, 0x00, 0x00, 0x00); - palette_set_color(3, 0xFF, 0xFF, 0xFF); + palette_set_color(Machine, 2, 0x00, 0x00, 0x00); + palette_set_color(Machine, 3, 0xFF, 0xFF, 0xFF); } else { - palette_set_color(3, 0x00, 0x00, 0x00); - palette_set_color(2, 0xFF, 0xFF, 0xFF); + palette_set_color(Machine, 3, 0x00, 0x00, 0x00); + palette_set_color(Machine, 2, 0xFF, 0xFF, 0xFF); } } diff --git a/src/vidhrdw/suna16.c b/src/vidhrdw/suna16.c index d8dda9767..2b69ce3a8 100644 --- a/src/vidhrdw/suna16.c +++ b/src/vidhrdw/suna16.c @@ -94,13 +94,9 @@ READ16_HANDLER( suna16_paletteram16_r ) WRITE16_HANDLER( suna16_paletteram16_w ) { - int r,g,b; if (color_bank) data = COMBINE_DATA(&paletteram16_2[offset]); else data = COMBINE_DATA(&paletteram16[offset]); - r = (data >> 0) & 0x1F; - g = (data >> 5) & 0x1F; - b = (data >> 10) & 0x1F; - palette_set_color( offset + (color_bank ? 0x100 : 0),(r<<3)|(r>>2),(g<<3)|(g>>2),(b<<3)|(b>>2)); + palette_set_color( Machine, offset + (color_bank ? 0x100 : 0),pal5bit(data >> 0),pal5bit(data >> 5),pal5bit(data >> 10)); } diff --git a/src/vidhrdw/suna8.c b/src/vidhrdw/suna8.c index 19571a62f..10ec3166c 100644 --- a/src/vidhrdw/suna8.c +++ b/src/vidhrdw/suna8.c @@ -171,10 +171,7 @@ WRITE8_HANDLER( brickzn_banked_paletteram_w ) (((rgb & (1<<0x6))?1:0)<<2) | (((rgb & (1<<0x7))?1:0)<<3); - r = (r << 4) | r; - g = (g << 4) | g; - b = (b << 4) | b; - palette_set_color(offset/2,r,g,b); + palette_set_color(Machine,offset/2,pal4bit(r),pal4bit(g),pal4bit(b)); } diff --git a/src/vidhrdw/suprloco.c b/src/vidhrdw/suprloco.c index f18c5186f..bd521abdb 100644 --- a/src/vidhrdw/suprloco.c +++ b/src/vidhrdw/suprloco.c @@ -55,15 +55,15 @@ PALETTE_INIT( suprloco ) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); /* hack: generate a second bank of sprite palette with red changed to purple */ if (i >= 256) { if ((i & 0x0f) == 0x09) - palette_set_color(i+256,r,g,0xff); + palette_set_color(machine,i+256,r,g,0xff); else - palette_set_color(i+256,r,g,b); + palette_set_color(machine,i+256,r,g,b); } } } diff --git a/src/vidhrdw/suprnova.c b/src/vidhrdw/suprnova.c index 62b569dd0..4797ed68a 100644 --- a/src/vidhrdw/suprnova.c +++ b/src/vidhrdw/suprnova.c @@ -768,7 +768,7 @@ VIDEO_UPDATE(skns) } } - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); { int supernova_pri_a; diff --git a/src/vidhrdw/suprridr.c b/src/vidhrdw/suprridr.c index c28daf5ce..a357c9a51 100644 --- a/src/vidhrdw/suprridr.c +++ b/src/vidhrdw/suprridr.c @@ -88,7 +88,7 @@ PALETTE_INIT( suprridr ) bit1 = (*color_prom >> 7) & 0x01; b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/suprslam.c b/src/vidhrdw/suprslam.c index a3c580d0f..489446d22 100644 --- a/src/vidhrdw/suprslam.c +++ b/src/vidhrdw/suprslam.c @@ -159,7 +159,7 @@ VIDEO_START( suprslam ) VIDEO_UPDATE( suprslam ) { - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); K053936_0_zoom_draw(bitmap,cliprect,suprslam_bg_tilemap,0,0); diff --git a/src/vidhrdw/system1.c b/src/vidhrdw/system1.c index ccf521fd7..4e4932cb3 100644 --- a/src/vidhrdw/system1.c +++ b/src/vidhrdw/system1.c @@ -98,18 +98,12 @@ WRITE8_HANDLER( system1_paletteram_w ) } else { - val = (data >> 0) & 0x07; - r = (val << 5) | (val << 2) | (val >> 1); - - val = (data >> 3) & 0x07; - g = (val << 5) | (val << 2) | (val >> 1); - - val = (data >> 5) & 0x06; - if (val) val++; - b = (val << 5) | (val << 2) | (val >> 1); + r = pal3bit(data >> 0); + g = pal3bit(data >> 3); + b = pal2bit(data >> 6); } - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } void system1_postload(void) diff --git a/src/vidhrdw/system16.c b/src/vidhrdw/system16.c index d42e50af3..8728d2d7b 100644 --- a/src/vidhrdw/system16.c +++ b/src/vidhrdw/system16.c @@ -520,9 +520,9 @@ WRITE16_HANDLER( sys16_paletteram_w ) gh = combine_6_weights(weights[1][1], g0, g1, g2, g3, g4, 1); bh = combine_6_weights(weights[1][2], b0, b1, b2, b3, b4, 1); - palette_set_color( offset, r, g, b ); + palette_set_color( Machine, offset, r, g, b ); - palette_set_color( offset+Machine->drv->total_colors/2,rs,gs,bs); + palette_set_color( Machine, offset+Machine->drv->total_colors/2,rs,gs,bs); } } @@ -793,7 +793,7 @@ VIDEO_START( system16 ){ /* initialize all entries to black - needed for Golden Axe*/ int i; for( i=0; idrv->total_colors; i++ ){ - palette_set_color( i, 0,0,0 ); + palette_set_color( machine, i, 0,0,0 ); } if(sys16_bg1_trans) tilemap_set_transparent_pen( background, 0 ); @@ -865,7 +865,7 @@ VIDEO_START( system18old ){ if( background2 && foreground2 ){ - if( video_start_system16()==0 ){ + if( video_start_system16(machine)==0 ){ tilemap_set_transparent_pen( foreground2, 0 ); if(sys18_splittab_fg_x){ @@ -1083,7 +1083,7 @@ VIDEO_UPDATE( system18old ){ if (!sys16_refreshenable) { /* should it REALLY not clear the bitmap? ddcrew vdp gfx look ugly if i don't do it like this */ - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); return 0; } diff --git a/src/vidhrdw/system24.c b/src/vidhrdw/system24.c index af8844d12..4095ad3a4 100644 --- a/src/vidhrdw/system24.c +++ b/src/vidhrdw/system24.c @@ -34,7 +34,7 @@ VIDEO_UPDATE(system24) int order[12], spri[4]; if(sys24_mixer_get_reg(13) & 1) { - fillbitmap(bitmap, get_black_pen(), 0); + fillbitmap(bitmap, get_black_pen(machine), 0); return 0; } diff --git a/src/vidhrdw/tagteam.c b/src/vidhrdw/tagteam.c index 97355a309..8ab7226cd 100644 --- a/src/vidhrdw/tagteam.c +++ b/src/vidhrdw/tagteam.c @@ -37,7 +37,7 @@ PALETTE_INIT( tagteam ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/taito_b.c b/src/vidhrdw/taito_b.c index 5409e94cb..d3511f42f 100644 --- a/src/vidhrdw/taito_b.c +++ b/src/vidhrdw/taito_b.c @@ -255,7 +255,7 @@ VIDEO_START( taitob_color_order0 ) b_sp_color_base = 0x40*16; /*sprites */ b_tx_color_base = 0x00; /*text */ - return video_start_taitob_core(); + return video_start_taitob_core(machine); } VIDEO_START( taitob_color_order1 ) @@ -266,7 +266,7 @@ VIDEO_START( taitob_color_order1 ) b_sp_color_base = 0x80*16; b_tx_color_base = 0xc0; - return video_start_taitob_core(); + return video_start_taitob_core(machine); } VIDEO_START( taitob_color_order2 ) @@ -277,13 +277,13 @@ VIDEO_START( taitob_color_order2 ) b_sp_color_base = 0x10*16; b_tx_color_base = 0x00; - return video_start_taitob_core(); + return video_start_taitob_core(machine); } VIDEO_START( hitice ) { - if (video_start_taitob_color_order0()) + if (video_start_taitob_color_order0(machine)) return 1; pixel_bitmap = auto_bitmap_alloc(1024,512); diff --git a/src/vidhrdw/taito_f3.c b/src/vidhrdw/taito_f3.c index c1e590348..e3b479eac 100644 --- a/src/vidhrdw/taito_f3.c +++ b/src/vidhrdw/taito_f3.c @@ -814,7 +814,7 @@ WRITE32_HANDLER( f3_palette_24bit_w ) b = (paletteram32[offset] >> 0) & 0xff; } - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } /******************************************************************************/ diff --git a/src/vidhrdw/taito_l.c b/src/vidhrdw/taito_l.c index de161ae95..e212f067f 100644 --- a/src/vidhrdw/taito_l.c +++ b/src/vidhrdw/taito_l.c @@ -90,7 +90,7 @@ VIDEO_START( taitol ) tilemap_set_transparent_pen(ch1a_tilemap,0); for (i=0;i<256;i++) - palette_set_color(i, 0, 0, 0); + palette_set_color(machine, i, 0, 0, 0); tilemap_set_scrolldx(ch1a_tilemap,-8,-8); tilemap_set_scrolldx(bg18_tilemap,28,-11); diff --git a/src/vidhrdw/taitoic.c b/src/vidhrdw/taitoic.c index 88b6e7249..ccf1b1114 100644 --- a/src/vidhrdw/taitoic.c +++ b/src/vidhrdw/taitoic.c @@ -2765,7 +2765,7 @@ static void TC0100SCN_tilemap_draw_fg(mame_bitmap *bitmap,const rectangle *clipr src_y=(TC0100SCN_fgscrolly[chip] + scrolly_delta)&height_mask; if (TC0100SCN_ctrl[chip][0x7]&1) // Flipscreen - src_y=256-src_y; + 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 @@ -2773,7 +2773,7 @@ static void TC0100SCN_tilemap_draw_fg(mame_bitmap *bitmap,const rectangle *clipr for (y=0; y<=cliprect->max_y; y++) { src_x=(TC0100SCN_fgscrollx[chip] - TC0100SCN_fgscroll_ram[chip][(y + scrolly_delta)&0x1ff] + scrollx_delta + cliprect->min_x)&width_mask; if (TC0100SCN_ctrl[chip][0x7]&1) // Flipscreen - src_x=256 - 64 - src_x; + 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++) { @@ -4792,41 +4792,30 @@ void TC0110PCR_restore_colors(int chip) case 0x00: { - r = (color >> 0) & 0x1f; - g = (color >> 5) & 0x1f; - b = (color >> 10) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); + r = pal5bit(color >> 0); + g = pal5bit(color >> 5); + b = pal5bit(color >> 10); break; } case 0x01: { - b = (color >> 0) & 0x1f; - g = (color >> 5) & 0x1f; - r = (color >> 10) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); + b = pal5bit(color >> 0); + g = pal5bit(color >> 5); + r = pal5bit(color >> 10); break; } case 0x02: { - r = (color >> 0) & 0xf; - g = (color >> 4) & 0xf; - b = (color >> 8) & 0xf; - - r = (r << 4) | r; - g = (g << 4) | g; - b = (b << 4) | b; + r = pal4bit(color >> 0); + g = pal4bit(color >> 4); + b = pal4bit(color >> 8); + break; } } - palette_set_color( i + (chip << 12),r,g,b); + palette_set_color(Machine, i + (chip << 12),r,g,b); } } @@ -4914,19 +4903,8 @@ WRITE16_HANDLER( TC0110PCR_word_w ) case 1: { - int r,g,b; /* data = palette BGR value */ - TC0110PCR_ram[0][(TC0110PCR_addr[0])] = data & 0xffff; - - r = (data >> 0) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 10) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(TC0110PCR_addr[0],r,g,b); + palette_set_color(Machine,TC0110PCR_addr[0],pal5bit(data >> 0),pal5bit(data >> 5),pal5bit(data >> 10)); break; } @@ -4947,19 +4925,8 @@ WRITE16_HANDLER( TC0110PCR_step1_word_w ) case 1: { - int r,g,b; /* data = palette BGR value */ - TC0110PCR_ram[0][(TC0110PCR_addr[0])] = data & 0xffff; - - r = (data >> 0) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 10) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(TC0110PCR_addr[0],r,g,b); + palette_set_color(Machine,TC0110PCR_addr[0],pal5bit(data >> 0),pal5bit(data >> 5),pal5bit(data >> 10)); break; } @@ -4980,20 +4947,9 @@ WRITE16_HANDLER( TC0110PCR_step1_word_1_w ) case 1: { - int r,g,b; /* data = palette RGB value */ - TC0110PCR_ram[1][(TC0110PCR_addr[1])] = data & 0xffff; - - r = (data >> 0) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 10) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - /* change a color in the second color area (4096-8191) */ - palette_set_color(TC0110PCR_addr[1] + 4096,r,g,b); + palette_set_color(Machine,TC0110PCR_addr[1] + 4096,pal5bit(data >> 0),pal5bit(data >> 5),pal5bit(data >> 10)); break; } @@ -5014,20 +4970,9 @@ WRITE16_HANDLER( TC0110PCR_step1_word_2_w ) case 1: { - int r,g,b; /* data = palette RGB value */ - TC0110PCR_ram[2][(TC0110PCR_addr[2])] = data & 0xffff; - - r = (data >> 0) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 10) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - /* change a color in the second color area (8192-12288) */ - palette_set_color(TC0110PCR_addr[2] + 8192,r,g,b); + palette_set_color(Machine,TC0110PCR_addr[2] + 8192,pal5bit(data >> 0),pal5bit(data >> 5),pal5bit(data >> 10)); break; } @@ -5050,19 +4995,8 @@ WRITE16_HANDLER( TC0110PCR_step1_rbswap_word_w ) case 1: { - int r,g,b; /* data = palette RGB value */ - TC0110PCR_ram[0][(TC0110PCR_addr[0])] = data & 0xffff; - - b = (data >> 0) & 0x1f; - g = (data >> 5) & 0x1f; - r = (data >> 10) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(TC0110PCR_addr[0],r,g,b); + palette_set_color(Machine,TC0110PCR_addr[0],pal5bit(data >> 10),pal5bit(data >> 5),pal5bit(data >> 0)); break; } @@ -5085,19 +5019,8 @@ WRITE16_HANDLER( TC0110PCR_step1_4bpg_word_w ) case 1: { - int r,g,b; /* data = palette BGR value */ - TC0110PCR_ram[0][(TC0110PCR_addr[0])] = data & 0xffff; - - r = (data >> 0) & 0xf; - g = (data >> 4) & 0xf; - b = (data >> 8) & 0xf; - - r = (r << 4) | r; - g = (g << 4) | g; - b = (b << 4) | b; - - palette_set_color(TC0110PCR_addr[0],r,g,b); + palette_set_color(Machine,TC0110PCR_addr[0],pal4bit(data >> 0),pal4bit(data >> 4),pal4bit(data >> 8)); break; } diff --git a/src/vidhrdw/taitosj.c b/src/vidhrdw/taitosj.c index 667e2fd9f..d19aee590 100644 --- a/src/vidhrdw/taitosj.c +++ b/src/vidhrdw/taitosj.c @@ -176,7 +176,7 @@ WRITE8_HANDLER( taitosj_paletteram_w ) bit2 = (~val >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(offset / 2,r,g,b); + palette_set_color(Machine,offset / 2,r,g,b); } static void taitosj_postload(void) @@ -207,7 +207,7 @@ VIDEO_START( taitosj ) dirtybuffer3 = dirtybuffer2 = 0; - if (video_start_generic() != 0) + if (video_start_generic(machine) != 0) return 1; dirtybuffer2 = auto_malloc(videoram_size); diff --git a/src/vidhrdw/tankbatt.c b/src/vidhrdw/tankbatt.c index e7f85b0a6..7b8967101 100644 --- a/src/vidhrdw/tankbatt.c +++ b/src/vidhrdw/tankbatt.c @@ -28,7 +28,7 @@ PALETTE_INIT( tankbatt ) #define RES_2 0x3f /* this is a guess */ /* Stick black in there */ - palette_set_color(0,0,0,0); + palette_set_color(machine,0,0,0,0); /* ? Skip the first byte ? */ color_prom++; @@ -54,7 +54,7 @@ PALETTE_INIT( tankbatt ) b = RES_1 * bit3; if (bit3) b += RES_2 * bit0; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom += 4; } diff --git a/src/vidhrdw/tatsumi.c b/src/vidhrdw/tatsumi.c index b4e1d3c9c..de6f9160e 100644 --- a/src/vidhrdw/tatsumi.c +++ b/src/vidhrdw/tatsumi.c @@ -48,7 +48,7 @@ WRITE8_HANDLER(roundup5_vram_w) WRITE8_HANDLER(roundup5_palette_w) { // static int hack=0; - int r,g,b,word; + int word; paletteram[offset]=data; @@ -73,16 +73,12 @@ bit 0: 3.9kOhm resistor offset&=~3; word=(paletteram[offset]<<8)|(paletteram[offset+2]); - r = ((word >>10) & 0x1f)*8; - g = ((word >> 5) & 0x1f)*8; - b = ((word >> 0) & 0x1f)*8; - - palette_set_color(offset/4,r,g,b); + palette_set_color(Machine,offset/4,pal5bit(word >> 10),pal5bit(word >> 5),pal5bit(word >> 0)); } WRITE8_HANDLER(apache3_palette_w) { // static int hack=0; - int r,g,b,word; + int word; paletteram[offset]=data; @@ -107,11 +103,7 @@ bit 0: 3.9kOhm resistor offset&=~1; word=(paletteram[offset+1]<<8)|(paletteram[offset]); - r = ((word >>10) & 0x1f)*8; - g = ((word >> 5) & 0x1f)*8; - b = ((word >> 0) & 0x1f)*8; - - palette_set_color(offset/2,r,g,b); + palette_set_color(Machine,offset/2,pal5bit(word >> 10),pal5bit(word >> 5),pal5bit(word >> 0)); } @@ -949,34 +941,34 @@ static void update_cluts(int fake_palette_offset, int object_base, int length) draw routines. We also note down any uses of the 'shadow' pen (index 255). */ int i; - UINT8 r,g,b; + rgb_t color; const UINT8* bank1=tatsumi_rom_clut0; const UINT8* bank2=tatsumi_rom_clut1; for (i=0; i> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); color_prom++; } diff --git a/src/vidhrdw/terracre.c b/src/vidhrdw/terracre.c index 66974e7d5..474e92d5b 100644 --- a/src/vidhrdw/terracre.c +++ b/src/vidhrdw/terracre.c @@ -119,7 +119,7 @@ PALETTE_INIT( amazon ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -214,7 +214,7 @@ VIDEO_UPDATE( amazon ) { if( xscroll&0x2000 ) { - fillbitmap( bitmap,get_black_pen(),cliprect ); + fillbitmap( bitmap,get_black_pen(machine),cliprect ); } else { diff --git a/src/vidhrdw/tetrisp2.c b/src/vidhrdw/tetrisp2.c index 73e812b88..76cb10a8d 100644 --- a/src/vidhrdw/tetrisp2.c +++ b/src/vidhrdw/tetrisp2.c @@ -71,24 +71,14 @@ WRITE16_HANDLER( tetrisp2_palette_w ) { data = COMBINE_DATA(&paletteram16[offset]); if ((offset & 1) == 0) - { - int r = (data >> 1) & 0x1f; - int g = (data >> 6) & 0x1f; - int b = (data >> 11) & 0x1f; - palette_set_color(offset/2,(r << 3) | (r >> 2),(g << 3) | (g >> 2),(b << 3) | (b >> 2)); - } + palette_set_color(Machine,offset/2,pal5bit(data >> 1),pal5bit(data >> 6),pal5bit(data >> 11)); } WRITE16_HANDLER( rocknms_sub_palette_w ) { data = COMBINE_DATA(&paletteram16_2[offset]); if ((offset & 1) == 0) - { - int r = (data >> 1) & 0x1f; - int g = (data >> 6) & 0x1f; - int b = (data >> 11) & 0x1f; - palette_set_color((0x8000 + (offset/2)),(r << 3) | (r >> 2),(g << 3) | (g >> 2),(b << 3) | (b >> 2)); - } + palette_set_color(Machine,(0x8000 + (offset/2)),pal5bit(data >> 1),pal5bit(data >> 6),pal5bit(data >> 11)); } diff --git a/src/vidhrdw/thedeep.c b/src/vidhrdw/thedeep.c index 11118db80..ba329f366 100644 --- a/src/vidhrdw/thedeep.c +++ b/src/vidhrdw/thedeep.c @@ -103,12 +103,7 @@ PALETTE_INIT( thedeep ) { int i; for (i = 0;i < 512;i++) - { - int b = ((color_prom[0x200 + i] >> 0) & 0xf) * 0x11; - int g = ((color_prom[0x400 + i] >> 4) & 0xf) * 0x11; - int r = ((color_prom[0x400 + i] >> 0) & 0xf) * 0x11; - palette_set_color(i,r,g,b); - } + palette_set_color(machine,i,pal4bit(color_prom[0x400 + i] >> 0),pal4bit(color_prom[0x400 + i] >> 4),pal4bit(color_prom[0x200 + i] >> 0)); } /*************************************************************************** @@ -243,7 +238,7 @@ VIDEO_UPDATE( thedeep ) tilemap_set_scrolly(tilemap_0, x, y + scrolly); } - fillbitmap(bitmap,get_black_pen(),cliprect); + fillbitmap(bitmap,get_black_pen(machine),cliprect); tilemap_draw(bitmap,cliprect,tilemap_0,0,0); draw_sprites(bitmap,cliprect); diff --git a/src/vidhrdw/thepit.c b/src/vidhrdw/thepit.c index 6077c6e32..97aea681e 100644 --- a/src/vidhrdw/thepit.c +++ b/src/vidhrdw/thepit.c @@ -49,12 +49,7 @@ PALETTE_INIT( thepit ) /* first of all, allocate primary colors for the background and foreground */ /* this is wrong, but I don't know where to pick the colors from */ for (i = 0;i < 8;i++) - { - int r = 0xff * ((i >> 2) & 1); - int g = 0xff * ((i >> 1) & 1); - int b = 0xff * ((i >> 0) & 1); - palette_set_color(i,r,g,b); - } + palette_set_color(machine,i,pal1bit(i >> 2),pal1bit(i >> 1),pal1bit(i >> 0)); for (i = 0;i < Machine->drv->total_colors-8;i++) { @@ -73,7 +68,7 @@ PALETTE_INIT( thepit ) bit1 = (color_prom[i] >> 6) & 0x01; bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+8,r,g,b); + palette_set_color(machine,i+8,r,g,b); } for (i = 0;i < Machine->drv->color_table_len;i++) @@ -98,12 +93,7 @@ PALETTE_INIT( suprmous ) /* first of all, allocate primary colors for the background and foreground */ /* this is wrong, but I don't know where to pick the colors from */ for (i = 0;i < 8;i++) - { - int r = 0xff * ((i >> 2) & 1); - int g = 0xff * ((i >> 1) & 1); - int b = 0xff * ((i >> 0) & 1); - palette_set_color(i,r,g,b); - } + palette_set_color(machine,i,pal1bit(i >> 2),pal1bit(i >> 1),pal1bit(i >> 0)); for (i = 0;i < Machine->drv->total_colors-8;i++) { @@ -128,7 +118,7 @@ PALETTE_INIT( suprmous ) bit3 = (color_prom[i] >> 6) & 0x01; bit4 = (color_prom[i] >> 7) & 0x01; b = 0x50 * bit0 + 0x40 * bit1 + 0x30 * bit2 + 0x20 * bit3 + 0x10 * bit4; - palette_set_color(i+8,r,g,b); + palette_set_color(machine,i+8,r,g,b); } for (i = 0;i < Machine->drv->color_table_len;i++) diff --git a/src/vidhrdw/thief.c b/src/vidhrdw/thief.c index fc598b320..b252e97dd 100644 --- a/src/vidhrdw/thief.c +++ b/src/vidhrdw/thief.c @@ -75,7 +75,7 @@ WRITE8_HANDLER( thief_color_map_w ){ int r = intensity[(data & 0x03) >> 0]; int g = intensity[(data & 0x0C) >> 2]; int b = intensity[(data & 0x30) >> 4]; - palette_set_color( offset,r,g,b ); + palette_set_color( Machine,offset,r,g,b ); } /***************************************************************************/ diff --git a/src/vidhrdw/tia.c b/src/vidhrdw/tia.c index f24d69998..3bae96db2 100644 --- a/src/vidhrdw/tia.c +++ b/src/vidhrdw/tia.c @@ -132,7 +132,7 @@ PALETTE_INIT( tia_NTSC ) if (G > 1) G = 1; if (B > 1) B = 1; - palette_set_color(8 * i + j, + palette_set_color(machine,8 * i + j, (UINT8) (255 * R + 0.5), (UINT8) (255 * G + 0.5), (UINT8) (255 * B + 0.5)); @@ -190,7 +190,7 @@ PALETTE_INIT( tia_PAL ) if (G > 1) G = 1; if (B > 1) B = 1; - palette_set_color(8 * i + j, + palette_set_color(machine,8 * i + j, (UINT8) (255 * R + 0.5), (UINT8) (255 * G + 0.5), (UINT8) (255 * B + 0.5)); diff --git a/src/vidhrdw/tiamc1.c b/src/vidhrdw/tiamc1.c index e9703569b..6af4fb134 100644 --- a/src/vidhrdw/tiamc1.c +++ b/src/vidhrdw/tiamc1.c @@ -16,7 +16,11 @@ UINT8 *tiamc1_spriteram_x; UINT8 *tiamc1_spriteram_y; UINT8 *tiamc1_spriteram_a; UINT8 *tiamc1_spriteram_n; -int tiamc1_layers_ctrl; +UINT8 tiamc1_layers_ctrl; +UINT8 tiamc1_bg_vshift; +UINT8 tiamc1_bg_hshift; + +UINT8 tiamc1_colormap[16]; static tilemap *bg_tilemap1, *bg_tilemap2; @@ -53,22 +57,29 @@ WRITE8_HANDLER( tiamc1_bankswitch_w ) WRITE8_HANDLER( tiamc1_sprite_x_w ) { - tiamc1_spriteram_x[offset] = data; + tiamc1_spriteram_x[offset] = data; } WRITE8_HANDLER( tiamc1_sprite_y_w ) { - tiamc1_spriteram_y[offset] = data; + tiamc1_spriteram_y[offset] = data; } WRITE8_HANDLER( tiamc1_sprite_a_w ) { - tiamc1_spriteram_a[offset] = data; + tiamc1_spriteram_a[offset] = data; } WRITE8_HANDLER( tiamc1_sprite_n_w ) { - tiamc1_spriteram_n[offset] = data; + tiamc1_spriteram_n[offset] = data; +} + +WRITE8_HANDLER( tiamc1_bg_vshift_w ) { + tiamc1_bg_vshift = data; +} +WRITE8_HANDLER( tiamc1_bg_hshift_w ) { + tiamc1_bg_hshift = data; } #define COLOR(gfxn,offs) (Machine->gfx[gfxn]->colortable[Machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs]) @@ -77,6 +88,9 @@ WRITE8_HANDLER( tiamc1_palette_w ) { COLOR(0, offset) = data; COLOR(1, offset) = data; + + tiamc1_colormap[offset] = data; + tilemap_mark_all_tiles_dirty(ALL_TILEMAPS); } @@ -86,24 +100,20 @@ PALETTE_INIT( tiamc1 ) //const float g_v[8]={1.05f,0.87f,0.81f,0.62f,0.44f,0.25f,0.19f,0.00f}; //const float r_v[8]={1.37f,1.13f,1.00f,0.75f,0.63f,0.38f,0.25f,0.00f}; //const float b_v[4]={1.16f,0.75f,0.42f,0.00f}; - //const float max_v=1.37f; // Voltage adjusted by Shiru const float g_v[8] = { 1.2071f,0.9971f,0.9259f,0.7159f,0.4912f,0.2812f,0.2100f,0.0000f}; const float r_v[8] = { 1.5937f,1.3125f,1.1562f,0.8750f,0.7187f,0.4375f,0.2812f,0.0000f}; const float b_v[4] = { 1.3523f,0.8750f,0.4773f,0.0000f}; - //const float max_v=1.5937f; int col; int r, g, b, ir, ig, ib; float tcol; - for(col = 0; col < 256; col++) - { + for (col = 0; col < 256; col++) { ir = (col >> 3) & 7; ig = col & 7; ib = (col >> 6) & 3; - tcol = 255.0f * r_v[ir] / r_v[0]; r = 255 - (((int)tcol) & 255); tcol = 255.0f * g_v[ig] / g_v[0]; @@ -111,7 +121,7 @@ PALETTE_INIT( tiamc1 ) tcol = 255.0f * b_v[ib] / b_v[0]; b = 255 - (((int)tcol) & 255); - palette_set_color(col,r,g,b); + palette_set_color(machine,col,r,g,b); } } @@ -120,7 +130,7 @@ static void get_bg1_tile_info(int tile_index) int code = tiamc1_tileram[tile_index]; decodechar(Machine->gfx[0], code, tiamc1_charram, - Machine->drv->gfxdecodeinfo[0].gfxlayout); + Machine->drv->gfxdecodeinfo[0].gfxlayout); SET_TILE_INFO(0, code, 0, 0) } @@ -130,11 +140,21 @@ static void get_bg2_tile_info(int tile_index) int code = tiamc1_tileram[tile_index + 1024]; decodechar(Machine->gfx[0], code, tiamc1_charram, - Machine->drv->gfxdecodeinfo[0].gfxlayout); + Machine->drv->gfxdecodeinfo[0].gfxlayout); SET_TILE_INFO(0, code, 0, 0) } +static void restore_colormap(void) +{ + int i; + + for (i = 0; i < 16; i++) { + COLOR(0, i) = tiamc1_colormap[i]; + COLOR(1, i) = tiamc1_colormap[i]; + } +} + VIDEO_START( tiamc1 ) { bg_tilemap1 = tilemap_create(get_bg1_tile_info, tilemap_scan_rows, @@ -149,6 +169,16 @@ VIDEO_START( tiamc1 ) if ( !bg_tilemap2 ) return 1; + tiamc1_bg_vshift = 0; + tiamc1_bg_hshift = 0; + + state_save_register_global(tiamc1_layers_ctrl); + state_save_register_global(tiamc1_bg_vshift); + state_save_register_global(tiamc1_bg_hshift); + state_save_register_global_pointer(tiamc1_colormap, 16); + + state_save_register_func_postload(restore_colormap); + return 0; } @@ -178,6 +208,22 @@ static void tiamc1_draw_sprites( mame_bitmap *bitmap ) VIDEO_UPDATE( tiamc1 ) { +#if 0 + int i; + + for (i = 0; i < 32; i++) + { + tilemap_set_scrolly(bg_tilemap1, i, tiamc1_bg_vshift ^ 0xff); + tilemap_set_scrolly(bg_tilemap2, i, tiamc1_bg_vshift ^ 0xff); + } + + for (i = 0; i < 32; i++) + { + tilemap_set_scrollx(bg_tilemap1, i, tiamc1_bg_hshift ^ 0xff); + tilemap_set_scrollx(bg_tilemap2, i, tiamc1_bg_hshift ^ 0xff); + } +#endif + if (tiamc1_layers_ctrl & 0x80) tilemap_draw(bitmap, &Machine->screen[0].visarea, bg_tilemap2, 0, 0); else diff --git a/src/vidhrdw/timelimt.c b/src/vidhrdw/timelimt.c index 6cbab1142..7485fb95a 100644 --- a/src/vidhrdw/timelimt.c +++ b/src/vidhrdw/timelimt.c @@ -49,7 +49,7 @@ PALETTE_INIT( timelimt ) { bit1 = (*color_prom >> 7) & 0x01; b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/timeplt.c b/src/vidhrdw/timeplt.c index d56bb02ab..d6fcfe8b5 100644 --- a/src/vidhrdw/timeplt.c +++ b/src/vidhrdw/timeplt.c @@ -69,7 +69,7 @@ PALETTE_INIT( timeplt ) bit4 = (color_prom[i] >> 7) & 0x01; b = 0x19 * bit0 + 0x24 * bit1 + 0x35 * bit2 + 0x40 * bit3 + 0x4d * bit4; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += 2*Machine->drv->total_colors; diff --git a/src/vidhrdw/tlc34076.c b/src/vidhrdw/tlc34076.c index 7dca1f059..e6da29019 100644 --- a/src/vidhrdw/tlc34076.c +++ b/src/vidhrdw/tlc34076.c @@ -50,11 +50,11 @@ static void update_palette(int which) int b = local_paletteram[3 * i + 2]; if (dacbits == 6) { - r = (r << 2) | (r >> 4); - g = (g << 2) | (g >> 4); - b = (b << 2) | (b >> 4); + r = pal6bit(r); + g = pal6bit(g); + b = pal6bit(b); } - palette_set_color(i, r, g, b); + palette_set_color(Machine, i, r, g, b); } } diff --git a/src/vidhrdw/tmnt.c b/src/vidhrdw/tmnt.c index 7c7290659..070799edd 100644 --- a/src/vidhrdw/tmnt.c +++ b/src/vidhrdw/tmnt.c @@ -364,22 +364,11 @@ VIDEO_START( prmrsocr ) WRITE16_HANDLER( tmnt_paletteram_word_w ) { - int r,g,b; - COMBINE_DATA(paletteram16 + offset); offset &= ~1; data = (paletteram16[offset] << 8) | paletteram16[offset+1]; - - r = (data >> 0) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 10) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset / 2,r,g,b); + palette_set_color(Machine,offset / 2,pal5bit(data >> 0),pal5bit(data >> 5),pal5bit(data >> 10)); } @@ -798,24 +787,24 @@ VIDEO_UPDATE( tmnt2 ) // dim all colors before it for (i=0; idrv->total_colors;i++) { col = (color_prom[i]<<8)+color_prom[i+512]; - r = (col & 0x7c00)>>7; /* Red */ - g = (col & 0x03e0)>>2; /* Green */ - b = (col & 0x001f)<<3; /* Blue */ - palette_set_color(i,r,g,b); + palette_set_color(machine,i,pal5bit(col >> 10),pal5bit(col >> 5),pal5bit(col >> 0)); } } diff --git a/src/vidhrdw/toaplan2.c b/src/vidhrdw/toaplan2.c index 4137900fc..fcaedf56d 100644 --- a/src/vidhrdw/toaplan2.c +++ b/src/vidhrdw/toaplan2.c @@ -1580,7 +1580,7 @@ VIDEO_UPDATE( batsugun_1 ) VIDEO_UPDATE( truxton2_0 ) { - video_update_toaplan2_0(screen,bitmap,cliprect); + video_update_toaplan2_0(machine,screen,bitmap,cliprect); tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); return 0; } diff --git a/src/vidhrdw/toobin.c b/src/vidhrdw/toobin.c index 403addcbd..613730904 100644 --- a/src/vidhrdw/toobin.c +++ b/src/vidhrdw/toobin.c @@ -134,11 +134,11 @@ WRITE16_HANDLER( toobin_paletteram_w ) if (green) green += 38; if (blue) blue += 38; - palette_set_color(offset & 0x3ff, red, green, blue); + palette_set_color(Machine, offset & 0x3ff, red, green, blue); if (!(newword & 0x8000)) - palette_set_brightness(offset & 0x3ff, brightness); + palette_set_brightness(Machine, offset & 0x3ff, brightness); else - palette_set_brightness(offset & 0x3ff, 1.0); + palette_set_brightness(Machine, offset & 0x3ff, 1.0); } } @@ -153,7 +153,7 @@ WRITE16_HANDLER( toobin_intensity_w ) for (i = 0; i < 0x400; i++) if (!(paletteram16[i] & 0x8000)) - palette_set_brightness(i, brightness); + palette_set_brightness(Machine, i, brightness); } } diff --git a/src/vidhrdw/toypop.c b/src/vidhrdw/toypop.c index dba6d810f..5583cc42a 100644 --- a/src/vidhrdw/toypop.c +++ b/src/vidhrdw/toypop.c @@ -51,7 +51,7 @@ PALETTE_INIT( toypop ) bit2 = (color_prom[i+0x200] >> 2) & 0x01; bit3 = (color_prom[i+0x200] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } for (i = 0;i < 256;i++) diff --git a/src/vidhrdw/tp84.c b/src/vidhrdw/tp84.c index 47f7b56ed..90f2c2a91 100644 --- a/src/vidhrdw/tp84.c +++ b/src/vidhrdw/tp84.c @@ -78,7 +78,7 @@ PALETTE_INIT( tp84 ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x42 * bit2 + 0x90 * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/trackfld.c b/src/vidhrdw/trackfld.c index 46e23c256..ff8664e70 100644 --- a/src/vidhrdw/trackfld.c +++ b/src/vidhrdw/trackfld.c @@ -60,7 +60,7 @@ PALETTE_INIT( trackfld ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/travrusa.c b/src/vidhrdw/travrusa.c index bfefafd5c..f3fa708b1 100644 --- a/src/vidhrdw/travrusa.c +++ b/src/vidhrdw/travrusa.c @@ -71,7 +71,7 @@ PALETTE_INIT( travrusa ) bit2 = (color_prom[i] >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += 256; @@ -98,7 +98,7 @@ PALETTE_INIT( travrusa ) bit2 = (color_prom[i] >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+128,r,g,b); + palette_set_color(machine,i+128,r,g,b); } color_prom += 32; @@ -139,7 +139,7 @@ PALETTE_INIT( shtrider ) bit2 = (color_prom[i+256] >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom += 512; @@ -167,7 +167,7 @@ PALETTE_INIT( shtrider ) bit2 = (color_prom[i] >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+128,r,g,b); + palette_set_color(machine,i+128,r,g,b); } color_prom += 32; diff --git a/src/vidhrdw/troangel.c b/src/vidhrdw/troangel.c index 116f8acde..eca133561 100644 --- a/src/vidhrdw/troangel.c +++ b/src/vidhrdw/troangel.c @@ -56,7 +56,7 @@ PALETTE_INIT( troangel ) bit2 = (color_prom[0] >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); COLOR(0,i) = i; color_prom++; } @@ -87,7 +87,7 @@ PALETTE_INIT( troangel ) bit2 = (*color_prom >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+256,r,g,b); + palette_set_color(machine,i+256,r,g,b); color_prom++; } diff --git a/src/vidhrdw/truco.c b/src/vidhrdw/truco.c index 4bffb786b..5d66809f8 100644 --- a/src/vidhrdw/truco.c +++ b/src/vidhrdw/truco.c @@ -26,7 +26,7 @@ PALETTE_INIT( truco ) b >>= 1; } - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/trucocl.c b/src/vidhrdw/trucocl.c index 80980d55e..3517acec9 100644 --- a/src/vidhrdw/trucocl.c +++ b/src/vidhrdw/trucocl.c @@ -41,16 +41,7 @@ PALETTE_INIT( trucocl ) int i; for (i = 0;i < 32;i++) - { - int r,g,b; - - r = (color_prom[i] & 0x0f); - g = color_prom[i+32] & 0x0f; - b = (color_prom[i+32] & 0xf0)>>4; - - palette_set_color(i,r<<4,g<<4,b<<4); - } - + palette_set_color(machine,i,pal4bit(color_prom[i] >> 0),pal4bit(color_prom[i+32] >> 0),pal4bit(color_prom[i+32] >> 4)); } WRITE8_HANDLER( trucocl_videoram_w ) diff --git a/src/vidhrdw/tryout.c b/src/vidhrdw/tryout.c index 415aa88fb..5485d6bf7 100644 --- a/src/vidhrdw/tryout.c +++ b/src/vidhrdw/tryout.c @@ -36,7 +36,7 @@ PALETTE_INIT( tryout ) bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/ttmahjng.c b/src/vidhrdw/ttmahjng.c index 0a3239801..049118441 100644 --- a/src/vidhrdw/ttmahjng.c +++ b/src/vidhrdw/ttmahjng.c @@ -238,13 +238,6 @@ VIDEO_UPDATE( ttmahjng ) ***************************************************************************/ static void modify_pen(int pen, int colorindex) { - int r,g,b,color; - - color = ttmahjng_color_prom[colorindex]; - - b = ((color & 1) ? 0xff : 0x00); - g = ((color & 2) ? 0xff : 0x00); - r = ((color & 4) ? 0xff : 0x00); - - palette_set_color(pen,r,g,b); + int color = ttmahjng_color_prom[colorindex]; + palette_set_color(Machine,pen,pal1bit(color >> 2),pal1bit(color >> 1),pal1bit(color >> 0)); } diff --git a/src/vidhrdw/tubep.c b/src/vidhrdw/tubep.c index 34e4f41ab..dc0055891 100644 --- a/src/vidhrdw/tubep.c +++ b/src/vidhrdw/tubep.c @@ -75,7 +75,7 @@ PALETTE_INIT( rjammer ) bit1 = (*color_prom >> 7) & 0x01; b = combine_2_weights(weights_b, bit0, bit1); - palette_set_color(i, r,g,b); + palette_set_color(machine,i, r,g,b); color_prom++; } @@ -267,7 +267,7 @@ PALETTE_INIT( tubep ) bit1 = (*color_prom >> 7) & 0x01; b = combine_2_weights(weights_txt_b, bit0, bit1); - palette_set_color(i, r,g,b); + palette_set_color(machine,i, r,g,b); color_prom++; } @@ -415,7 +415,7 @@ PALETTE_INIT( tubep ) //logerror("Calculate [%x:%x] (active resistors:r=%i g=%i b=%i) = ", i, shade, active_r, active_g, active_b); //logerror("r:%3i g:%3i b:%3i\n",r,g,b ); - palette_set_color(32+i*0x40+sh, r,g,b); + palette_set_color(machine,32+i*0x40+sh, r,g,b); } } } diff --git a/src/vidhrdw/tumbleb.c b/src/vidhrdw/tumbleb.c index 8d55e40ff..3967bbddf 100644 --- a/src/vidhrdw/tumbleb.c +++ b/src/vidhrdw/tumbleb.c @@ -717,7 +717,7 @@ VIDEO_UPDATE( fncywld ) VIDEO_UPDATE( jumppop ) { -// fillbitmap(bitmap, get_black_pen(), cliprect); +// fillbitmap(bitmap, get_black_pen(machine), cliprect); tilemap_set_scrollx( pf1_tilemap,0, jumppop_control[2]-0x3a0 ); tilemap_set_scrolly( pf1_tilemap,0, jumppop_control[3] ); diff --git a/src/vidhrdw/tunhunt.c b/src/vidhrdw/tunhunt.c index 2262591e5..35da4e12a 100644 --- a/src/vidhrdw/tunhunt.c +++ b/src/vidhrdw/tunhunt.c @@ -208,7 +208,7 @@ static void update_palette( void ) green = APPLY_SHADE(green,shade); blue = APPLY_SHADE(blue,shade); - palette_set_color( i,red,green,blue ); + palette_set_color( Machine,i,red,green,blue ); } } diff --git a/src/vidhrdw/turbo.c b/src/vidhrdw/turbo.c index e960b1195..fd2541316 100644 --- a/src/vidhrdw/turbo.c +++ b/src/vidhrdw/turbo.c @@ -6,995 +6,1085 @@ #include "driver.h" #include "turbo.h" +#include "res_net.h" +#include -/* constants */ -#define VIEW_WIDTH (32*8) -#define VIEW_HEIGHT (28*8) -#define END_OF_ROW_VALUE 0x12345678 -/* globals definitions */ -UINT8 *sega_sprite_position; -UINT8 turbo_collision; - -/* internal data */ -static UINT8 *sprite_priority, *sprite_expanded_priority; -static UINT8 *road_gfxdata, *road_palette, *road_enable_collide; -static UINT16 *road_expanded_palette; -static UINT8 *fore_palette, *fore_priority; -static UINT16 *fore_expanded_data; -static UINT8 *back_data; -static UINT8 *overall_priority, *collision_map; - -/* sprite tracking */ -struct sprite_params_data +typedef struct _sprite_info sprite_info; +struct _sprite_info { - UINT32 *base; - UINT8 *enable; - int offset, rowbytes; - int yscale, miny, maxy; - int xscale, xoffs; - int flip; + UINT16 ve; /* VE0-15 signals for this row */ + UINT8 lst; /* LST0-7 signals for this row */ + UINT32 latched[8]; /* latched pixel data */ + UINT8 plb[8]; /* latched PLB state */ + UINT32 offset[8]; /* current offset for this row */ + UINT32 frac[8]; /* leftover fraction */ + UINT32 step[8]; /* stepping value */ }; -static struct sprite_params_data sprite_params[16]; -static UINT32 *sprite_expanded_data; -static UINT8 *sprite_expanded_enable; -/* misc other stuff */ -static UINT8 *buckrog_bitmap_ram; -static UINT8 drew_frame; -static UINT32 sprite_mask; +static const UINT32 sprite_expand[16] = +{ + 0x00000000, 0x00000001, 0x00000100, 0x00000101, + 0x00010000, 0x00010001, 0x00010100, 0x00010101, + 0x01000000, 0x01000001, 0x01000100, 0x01000101, + 0x01010000, 0x01010001, 0x01010100, 0x01010101 +}; -/*************************************************************************** - Convert the color PROMs into a more useable format. -***************************************************************************/ +/************************************* + * + * Palette conversion + * + *************************************/ PALETTE_INIT( turbo ) { + static const int resistances[3] = { 1000, 470, 220 }; + double rweights[3], gweights[3], bweights[2]; int i; - for (i = 0; i < 512; i++, color_prom++) + /* compute the color output resistor weights */ + compute_resistor_weights(0, 255, -1.0, + 3, &resistances[0], rweights, 470, 0, + 3, &resistances[0], gweights, 470, 0, + 2, &resistances[1], bweights, 470, 0); + + /* initialize the palette with these colors */ + for (i = 0; i < 256; i++) { int bit0, bit1, bit2, r, g, b; - /* bits 4,5,6 of the index are inverted before being used as addresses */ - /* to save ourselves lots of trouble, we will undo the inversion when */ - /* generating the palette */ - int adjusted_index = i ^ 0x70; - /* red component */ - bit0 = (*color_prom >> 0) & 1; - bit1 = (*color_prom >> 1) & 1; - bit2 = (*color_prom >> 2) & 1; - r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + bit0 = (i >> 0) & 1; + bit1 = (i >> 1) & 1; + bit2 = (i >> 2) & 1; + r = combine_3_weights(rweights, bit0, bit1, bit2); /* green component */ - bit0 = (*color_prom >> 3) & 1; - bit1 = (*color_prom >> 4) & 1; - bit2 = (*color_prom >> 5) & 1; - g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + bit0 = (i >> 3) & 1; + bit1 = (i >> 4) & 1; + bit2 = (i >> 5) & 1; + g = combine_3_weights(gweights, bit0, bit1, bit2); /* blue component */ - bit0 = 0; - bit1 = (*color_prom >> 6) & 1; - bit2 = (*color_prom >> 7) & 1; - b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + bit0 = (i >> 6) & 1; + bit1 = (i >> 7) & 1; + b = combine_2_weights(bweights, bit0, bit1); - palette_set_color(adjusted_index,r,g,b); + palette_set_color(machine, i, r, g, b); } } PALETTE_INIT( subroc3d ) { + static const int resistances[3] = { 1000, 470, 220 }; + double rweights[3], gweights[3], bweights[2]; int i; - /* Subroc3D uses a common final color PROM with 512 entries */ - for (i = 0; i < 512; i++, color_prom++) + /* compute the color output resistor weights */ + compute_resistor_weights(0, 255, -1.0, + 3, &resistances[0], rweights, 470, 0, + 3, &resistances[0], gweights, 470, 0, + 2, &resistances[1], bweights, 470, 0); + + /* initialize the palette with these colors */ + for (i = 0; i < 256; i++) { int bit0, bit1, bit2, r, g, b; /* red component */ - bit0 = (*color_prom >> 0) & 1; - bit1 = (*color_prom >> 1) & 1; - bit2 = (*color_prom >> 2) & 1; - r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + bit0 = (i >> 0) & 1; + bit1 = (i >> 1) & 1; + bit2 = (i >> 2) & 1; + r = combine_3_weights(rweights, bit0, bit1, bit2); /* green component */ - bit0 = (*color_prom >> 3) & 1; - bit1 = (*color_prom >> 4) & 1; - bit2 = (*color_prom >> 5) & 1; - g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + bit0 = (i >> 3) & 1; + bit1 = (i >> 4) & 1; + bit2 = (i >> 5) & 1; + g = combine_3_weights(gweights, bit0, bit1, bit2); /* blue component */ - bit0 = 0; - bit1 = (*color_prom >> 6) & 1; - bit2 = (*color_prom >> 7) & 1; - b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + bit0 = (i >> 6) & 1; + bit1 = (i >> 7) & 1; + b = combine_2_weights(bweights, bit0, bit1); - palette_set_color(i,r,g,b); + palette_set_color(machine, i, r, g, b); } } PALETTE_INIT( buckrog ) { + static const int resistances[4] = { 2200, 1000, 500, 250 }; + double rweights[3], gweights[3], bweights[4]; int i; - /* Buck Rogers uses 1024 entries for the sprite color PROM */ - for (i = 0; i < 1024; i++, color_prom++) - { - int bit0, bit1, bit2, r, g, b; - - /* red component */ - bit0 = (*color_prom >> 0) & 1; - bit1 = (*color_prom >> 1) & 1; - bit2 = (*color_prom >> 2) & 1; - r = 34 * bit0 + 68 * bit1 + 137 * bit2; - - /* green component */ - bit0 = (*color_prom >> 3) & 1; - bit1 = (*color_prom >> 4) & 1; - bit2 = (*color_prom >> 5) & 1; - g = 34 * bit0 + 68 * bit1 + 137 * bit2; - - /* blue component */ - bit0 = 0; - bit1 = (*color_prom >> 6) & 1; - bit2 = (*color_prom >> 7) & 1; - b = 34 * bit0 + 68 * bit1 + 137 * bit2; - - palette_set_color(i,r,g,b); - } - - /* then another 512 entries for the character color PROM */ - for (i = 0; i < 512; i++, color_prom++) - { - int bit0, bit1, bit2, r, g, b; - - /* red component */ - bit0 = - bit1 = (*color_prom >> 0) & 1; - bit2 = (*color_prom >> 1) & 1; - r = 34 * bit0 + 68 * bit1 + 137 * bit2; + /* compute the color output resistor weights */ + compute_resistor_weights(0, 255, -1.0, + 3, &resistances[1], rweights, 1000, 0, + 3, &resistances[1], gweights, 1000, 0, + 4, &resistances[0], bweights, 1000, 0); - /* green component */ - bit0 = - bit1 = (*color_prom >> 2) & 1; - bit2 = (*color_prom >> 3) & 1; - g = 34 * bit0 + 68 * bit1 + 137 * bit2; - - /* blue component */ - bit0 = 0; - bit1 = (*color_prom >> 4) & 1; - bit2 = (*color_prom >> 5) & 1; - b = 34 * bit0 + 68 * bit1 + 137 * bit2; - - palette_set_color(i+1024,r,g,b); - } - - /* finally, the gradient foreground gets its own set of 256 colors */ - for (i = 0; i < 256; i++) + /* initialize the palette with these colors */ + for (i = 0; i < 1024; i++) { int bit0, bit1, bit2, bit3, r, g, b; /* red component */ - bit0 = 0; - bit1 = 0; - bit2 = (i >> 0) & 1; - r = 34 * bit0 + 68 * bit1 + 137 * bit2; + bit0 = (i >> 0) & 1; + bit1 = (i >> 1) & 1; + bit2 = (i >> 2) & 1; + r = combine_3_weights(rweights, bit0, bit1, bit2); /* green component */ - bit0 = (i >> 1) & 1; - bit1 = (i >> 2) & 1; - bit2 = (i >> 3) & 1; - g = 34 * bit0 + 68 * bit1 + 137 * bit2; - - /* blue component */ - bit0 = (i >> 4) & 1; - bit1 = (i >> 5) & 1; + bit0 = (i >> 3) & 1; + bit1 = (i >> 4) & 1; + bit2 = (i >> 5) & 1; + g = combine_3_weights(gweights, bit0, bit1, bit2); + + /* blue component - note the shuffled bits */ + bit0 = (i >> 8) & 1; + bit1 = (i >> 9) & 1; bit2 = (i >> 6) & 1; bit3 = (i >> 7) & 1; - b = 16 * bit0 + 34 * bit1 + 68 * bit2 + 137 * bit3; + b = combine_4_weights(bweights, bit0, bit1, bit2, bit3); - palette_set_color(i+1024+512,r,g,b); + palette_set_color(machine, i, r, g, b); } } -/*************************************************************************** +/************************************* + * + * Video startup + * + *************************************/ - Sprite startup/shutdown +static void get_fg_tile_info(int tile_index) +{ + turbo_state *state = Machine->driver_data; + int code = state->videoram[tile_index]; + SET_TILE_INFO(0, code, code >> 2, 0) +} -***************************************************************************/ -static int init_sprites(UINT32 sprite_expand[16], UINT8 sprite_enable[16], int expand_shift) +VIDEO_START( turbo ) { - UINT8 *sprite_gfxdata = memory_region(REGION_GFX1); - int sprite_length = memory_region_length(REGION_GFX1); - int sprite_bank_size = sprite_length / 8; - UINT8 *src, *edst; - UINT32 *dst; - int i, j; - - /* allocate the expanded sprite data */ - sprite_expanded_data = auto_malloc(sprite_length * 2 * sizeof(UINT32)); - - /* allocate the expanded sprite enable array */ - sprite_expanded_enable = auto_malloc(sprite_length * 2 * sizeof(UINT8)); - - /* expand the sprite ROMs */ - src = sprite_gfxdata; - dst = sprite_expanded_data; - edst = sprite_expanded_enable; - for (i = 0; i < 8; i++) - { - /* expand this bank */ - for (j = 0; j < sprite_bank_size; j++) - { - int bits = *src++; - *dst++ = sprite_expand[bits >> 4]; - *dst++ = sprite_expand[bits & 15]; - *edst++ = sprite_enable[bits >> 4]; - *edst++ = sprite_enable[bits & 15]; - } - - /* shift for the next bank */ - for (j = 0; j < 16; j++) - { - if (sprite_expand[j] != END_OF_ROW_VALUE) - sprite_expand[j] <<= expand_shift; - sprite_enable[j] <<= 1; - } - } + turbo_state *state = Machine->driver_data; - /* success */ + /* initialize the foreground tilemap */ + state->fg_tilemap = tilemap_create(get_fg_tile_info, tilemap_scan_rows, TILEMAP_OPAQUE, 8,8, 32,32); return 0; } - -/*************************************************************************** - - Foreground startup/shutdown - -***************************************************************************/ - -static int init_fore(void) +VIDEO_START( buckrog ) { - UINT8 *fore_gfxdata = memory_region(REGION_GFX2); - int fore_length = memory_region_length(REGION_GFX2); - UINT16 *dst; - UINT8 *src; - int i, j; - - /* allocate the expanded foreground data */ - fore_expanded_data = auto_malloc(fore_length); - - /* expand the foreground ROMs */ - src = fore_gfxdata; - dst = fore_expanded_data; - for (i = 0; i < fore_length / 2; i++, src++) - { - int bits1 = src[0]; - int bits2 = src[fore_length / 2]; - int newbits = 0; + turbo_state *state = Machine->driver_data; - for (j = 0; j < 8; j++) - { - newbits |= ((bits1 >> (j ^ 7)) & 1) << (j * 2); - newbits |= ((bits2 >> (j ^ 7)) & 1) << (j * 2 + 1); - } - *dst++ = newbits; - } + /* initialize the foreground tilemap */ + state->fg_tilemap = tilemap_create(get_fg_tile_info, tilemap_scan_rows, TILEMAP_OPAQUE, 8,8, 32,32); + /* allocate the bitmap RAM */ + state->buckrog_bitmap_ram = auto_malloc(0xe000); + state_save_register_global_pointer(state->buckrog_bitmap_ram, 0xe000); return 0; } -/*************************************************************************** - - Video startup +/************************************* + * + * Videoram access + * + *************************************/ -***************************************************************************/ - -VIDEO_START( turbo ) +WRITE8_HANDLER( turbo_videoram_w ) { - UINT32 sprite_expand[16]; - UINT8 sprite_enable[16]; - UINT16 *dst; - UINT8 *src; - int i; - - /* determine ROM/PROM addresses */ - sprite_priority = memory_region(REGION_PROMS) + 0x0200; - - road_gfxdata = memory_region(REGION_GFX3); - road_palette = memory_region(REGION_PROMS) + 0x0b00; - road_enable_collide = memory_region(REGION_PROMS) + 0x0b40; - - fore_palette = memory_region(REGION_PROMS) + 0x0a00; - - overall_priority = memory_region(REGION_PROMS) + 0x0600; - collision_map = memory_region(REGION_PROMS) + 0x0b60; - - /* compute the sprite expansion array */ - for (i = 0; i < 16; i++) + turbo_state *state = Machine->driver_data; + state->videoram[offset] = data; + if (offset < 0x400) { - UINT32 value = 0; - if (i & 1) value |= 0x00000001; - if (i & 2) value |= 0x00000100; - if (i & 4) value |= 0x00010000; - - /* special value for the end-of-row */ - if ((i & 0x0c) == 0x04) value = END_OF_ROW_VALUE; - - sprite_expand[i] = value; - sprite_enable[i] = (i >> 3) & 1; + video_screen_update_partial(0, video_screen_get_vpos(0)); + tilemap_mark_tile_dirty(state->fg_tilemap, offset); } - - /* initialize the sprite data */ - if (init_sprites(sprite_expand, sprite_enable, 1)) - return 1; - - /* initialize the fore data */ - if (init_fore()) - return 1; - - /* allocate the expanded road palette */ - road_expanded_palette = auto_malloc(0x40 * sizeof(UINT16)); - - /* expand the road palette */ - src = road_palette; - dst = road_expanded_palette; - for (i = 0; i < 0x20; i++, src++) - *dst++ = src[0] | (src[0x20] << 8); - - /* other stuff */ - drew_frame = 0; - sprite_mask = 0x7fff; - - /* return success */ - return 0; } -VIDEO_START( subroc3d ) +WRITE8_HANDLER( buckrog_bitmap_w ) { - UINT32 sprite_expand[16]; - UINT8 sprite_enable[16]; - int i; + turbo_state *state = Machine->driver_data; + state->buckrog_bitmap_ram[offset] = data & 1; +} - /* determine ROM/PROM addresses */ - sprite_priority = memory_region(REGION_PROMS) + 0x0500; - fore_palette = memory_region(REGION_PROMS) + 0x0200; - /* compute the sprite expansion array */ - for (i = 0; i < 16; i++) - { - sprite_expand[i] = (i == 0x03 || i == 0x0f) ? END_OF_ROW_VALUE : i; - sprite_enable[i] = (i == 0x00 || i == 0x03 || i == 0x0c || i == 0x0f) ? 0 : 1; - } - /* initialize the sprite data */ - if (init_sprites(sprite_expand, sprite_enable, 4)) - return 1; +/************************************* + * + * Sprite X scaling + * + *************************************/ - /* initialize the fore data */ - if (init_fore()) - return 1; +INLINE UINT32 sprite_xscale(UINT8 dacinput, double vr1, double vr2, double cext) +{ + /* compute the effective pixel clock for this sprite */ + /* thanks to Frank Palazzolo for figuring out this logic */ + + /* compute the control voltage to the VCO */ + /* VR1 and VR2 are variable resistors on Turbo, fixed on other boards */ + double iref = 5.0 / (1.5e3 + vr2); + double iout = iref * ((float)dacinput / 256.0); + double vref = 5.0 * 1e3 / (3.8e3 + 1e3 + vr1); + double vco_cv = (2.2e3 * iout) + vref; + + /* based on the control voltage, compute the frequency assuming a 50pF */ + /* external capacitor; this is the graph in the datasheet. Some attempt */ + /* to simulate the non-linearity at the edges has been made, but it is */ + /* admittedly cheesy. */ + double vco_freq; + if (vco_cv > 5.0) + vco_cv = 5.0; + if (vco_cv < 0.0) + vco_cv = 0.0; + if (vco_cv < 1.33) + vco_freq = (0.68129 + pow(vco_cv + 0.6, 1.285)) * 1e6; + else if (vco_cv < 4.3) + vco_freq = (3 + (8 - 3) * ((vco_cv - 1.33) / (4.3 - 1.33))) * 1e6; + else + vco_freq = (-1.560279 + pow(vco_cv - 4.3 + 6, 1.26)) * 1e6; - /* allocate the expanded sprite priority map */ - sprite_expanded_priority = auto_malloc(1 << 12); + /* now scale based on the actual external capacitor; the frequency goes */ + /* up by a factor of 10 for every factor of 10 the capacitance is reduced */ + /* approximately */ + vco_freq *= 50e-12 / cext; - /* expand the sprite priority map */ - for (i = 0; i < (1 << 12); i++) - { - int plb = ~i & 0xff; - int ply = i >> 8; - int byteval = sprite_priority[(plb | ((ply & 0x0e) << 7)) & 0x1ff]; - sprite_expanded_priority[i] = (ply & 1) ? (byteval >> 4) : (byteval & 0x0f); - sprite_expanded_priority[i] *= 4; - } + /* finally, convert to a fraction (8.24) of 5MHz, which is the pixel clock */ + return (UINT32)((vco_freq / (5e6 * TURBO_X_SCALE)) * 16777216.0); +} - /* other stuff */ - sprite_mask = 0xffff; - /* return success */ - return 0; -} +/************************************* + * + * Turbo sprite handling + * + *************************************/ -VIDEO_START( buckrog ) +static void turbo_prepare_sprites(turbo_state *state, UINT8 y, sprite_info *info) { - UINT32 sprite_expand[16]; - UINT8 sprite_enable[16]; - int i; + const UINT8 *pr1119 = memory_region(REGION_PROMS) + 0x200; + int sprnum; - /* determine ROM/PROM addresses */ - fore_priority = memory_region(REGION_PROMS) + 0x400; - back_data = memory_region(REGION_GFX3); + /* initialize the line enable signals to 0 */ + info->ve = 0; + info->lst = 0; - /* compute the sprite expansion array */ - for (i = 0; i < 16; i++) + /* compute the sprite information, which was done on the previous scanline during HBLANK */ + for (sprnum = 0; sprnum < 16; sprnum++) { - sprite_expand[i] = (i == 0x0f) ? END_OF_ROW_VALUE : i; - sprite_enable[i] = (i == 0x00 || i == 0x0f) ? 0 : 1; + UINT8 *rambase = &state->spriteram[sprnum * 0x10]; + int level = sprnum & 7; + UINT8 clo, chi; + UINT32 sum; + + /* perform the first ALU to see if we are within the scanline */ + sum = y + (rambase[0] ^ 0xff); + clo = (sum >> 8) & 1; + sum += (y << 8) + ((rambase[1] ^ 0xff) << 8); + chi = (sum >> 16) & 1; + + /* the AND of the low carry and the inverse of the high carry clocks an enable bit */ + /* for this sprite; note that the logic in the Turbo schematics is reversed here */ + if (clo & (chi ^ 1)) + { + int xscale = rambase[2] ^ 0xff; + int yscale = rambase[3];// ^ 0xff; + UINT16 offset = rambase[6] + (rambase[7] << 8); + int offs; + + /* mark this entry enabled */ + info->ve |= 1 << sprnum; + + /* look up the low byte of the sum plus the yscale value in */ + /* IC50/PR1119 to determine if we write back the sum of the */ + /* offset and the rowbytes this scanline (p. 138) */ + offs = (sum & 0xff) | /* A0-A7 = AL0-AL7 */ + ((yscale & 0x08) << 5); /* A8-A9 = /RO11-/RO12 */ + + /* one of the bits is selected based on the low 7 bits of yscale */ + if (!((pr1119[offs] >> (yscale & 0x07)) & 1)) + { + offset += rambase[4] + (rambase[5] << 8); + rambase[6] = offset; + rambase[7] = offset >> 8; + } + + /* the output of the ALU here goes to the individual level counter */ + info->latched[level] = 0; + info->plb[level] = 0; + info->offset[level] = offset; + info->frac[level] = 0; + info->step[level] = sprite_xscale(xscale, 1.0e3 * readinputportbytag("VR1") / 100.0, 1.0e3 * readinputportbytag("VR2") / 100.0, 100e-12); + } } +} - /* initialize the sprite data */ - if (init_sprites(sprite_expand, sprite_enable, 4)) - return 1; - /* initialize the fore data */ - if (init_fore()) - return 1; +static UINT32 turbo_get_sprite_bits(UINT8 road, sprite_info *sprinfo) +{ + const UINT8 *sprite_gfxdata = memory_region(REGION_GFX1); + UINT8 sprlive = sprinfo->lst; + UINT32 sprdata = 0; + int level; + + /* if we haven't left the road yet, sprites 3-7 are disabled */ + if (!road) + sprlive &= 0x07; + + /* loop over all live levels */ + for (level = 0; level < 8; level++) + if (sprlive & (1 << level)) + { + /* latch the data and advance the offset */ + sprdata |= sprinfo->latched[level]; + sprinfo->frac[level] += sprinfo->step[level]; - /* allocate the expanded sprite priority map */ - sprite_expanded_priority = auto_malloc(1 << 8); + /* if we're live and we've clocked more data, advance */ + while (sprinfo->frac[level] >= 0x1000000) + { + UINT16 offs = sprinfo->offset[level]; + UINT8 pixdata; - /* expand the sprite priority map */ - for (i = 0; i < (1 << 8); i++) - { - if (i & 0x01) sprite_expanded_priority[i] = 0 | 8; - else if (i & 0x02) sprite_expanded_priority[i] = 1 | 8; - else if (i & 0x04) sprite_expanded_priority[i] = 2 | 8; - else if (i & 0x08) sprite_expanded_priority[i] = 3 | 8; - else if (i & 0x10) sprite_expanded_priority[i] = 4 | 8; - else if (i & 0x20) sprite_expanded_priority[i] = 5 | 8; - else if (i & 0x40) sprite_expanded_priority[i] = 6 | 8; - else if (i & 0x80) sprite_expanded_priority[i] = 7 | 8; - else sprite_expanded_priority[i] = 0; - sprite_expanded_priority[i] *= 4; - } + /* bit 0 controls which half of the byte to use */ + /* bits 1-13 go to address lines */ + /* bit 14 selects which of the two ROMs to read from */ + pixdata = sprite_gfxdata[(level << 14) | ((offs >> 1) & 0x3fff)] >> ((~offs & 1) * 4); + sprinfo->latched[level] = sprite_expand[pixdata & 0x0f] << level; - /* allocate the bitmap RAM */ - buckrog_bitmap_ram = auto_malloc(0xe000); + /* if bit 3 is 0 and bit 2 is 1, the enable flip/flip is reset */ + if ((pixdata & 0x0c) == 0x04) + { + sprinfo->lst &= ~(1 << level); + sprlive &= ~(1 << level); + } - /* other stuff */ - sprite_mask = 0xffff; + /* if bit 15 is set, we decrement instead of increment */ + sprinfo->offset[level] += (offs & 0x8000) ? -1 : 1; + sprinfo->frac[level] -= 0x1000000; + } + } - /* return success */ - return 0; + return sprdata; } -/*************************************************************************** - - Sprite data gathering +/************************************* + * + * Turbo video update + * + *************************************/ -***************************************************************************/ - -static void turbo_update_sprite_info(void) +VIDEO_UPDATE( turbo ) { - struct sprite_params_data *data = sprite_params; - int i; + turbo_state *state = Machine->driver_data; + mame_bitmap *fgpixmap = tilemap_get_pixmap(state->fg_tilemap); + const UINT8 *road_gfxdata = memory_region(REGION_GFX3); + const UINT8 *prom_base = memory_region(REGION_PROMS); + const UINT8 *pr1114 = prom_base + 0x000; + const UINT8 *pr1115 = prom_base + 0x020; + const UINT8 *pr1116 = prom_base + 0x040; + const UINT8 *pr1117 = prom_base + 0x060; + const UINT8 *pr1118 = prom_base + 0x100; + const UINT8 *pr1121 = prom_base + 0x600; + const UINT8 *pr1122 = prom_base + 0x800; + const UINT8 *pr1123 = prom_base + 0xc00; + int x, y; - /* first loop over all sprites and update those whose scanlines intersect ours */ - for (i = 0; i < 16; i++, data++) + /* loop over rows */ + for (y = cliprect->min_y; y <= cliprect->max_y; y++) { - UINT8 *sprite_base = spriteram + 16 * i; - - /* snarf all the data */ - data->base = sprite_expanded_data + (i & 7) * 0x8000; - data->enable = sprite_expanded_enable + (i & 7) * 0x8000; - data->offset = (sprite_base[6] + 256 * sprite_base[7]) & sprite_mask; - data->rowbytes = (INT16)(sprite_base[4] + 256 * sprite_base[5]); - data->miny = sprite_base[0]; - data->maxy = sprite_base[1]; - data->xscale = ((5 * 256 - 4 * sprite_base[2]) << 16) / (5 * 256); - data->yscale = (4 << 16) / (sprite_base[3] + 4); - data->xoffs = -1; - data->flip = 0; - } - - /* now find the X positions */ - for (i = 0; i < 0x200; i++) - { - int value = sega_sprite_position[i]; - if (value) - { - int base = (i & 0x100) >> 5; - int which; - for (which = 0; which < 8; which++) - if (value & (1 << which)) - sprite_params[base + which].xoffs = i & 0xff; - } - } -} + const UINT16 *fore = (UINT16 *)fgpixmap->base + y * fgpixmap->rowpixels; + UINT16 *dest = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + int sel, coch, babit, slipar_acciar, area, offs, areatmp, road = 0; + sprite_info sprinfo; + /* compute the Y sum between opa and the current scanline (p. 141) */ + int va = (y + state->turbo_opa) & 0xff; -static void subroc3d_update_sprite_info(void) -{ - struct sprite_params_data *data = sprite_params; - int i; + /* the upper bit of OPC inverts the road (p. 141) */ + if (!(state->turbo_opc & 0x80)) + va ^= 0xff; - /* first loop over all sprites and update those whose scanlines intersect ours */ - for (i = 0; i < 16; i++, data++) - { - UINT8 *sprite_base = spriteram + 8 * i; - - /* snarf all the data */ - data->base = sprite_expanded_data + (i & 7) * 0x10000; - data->enable = sprite_expanded_enable + (i & 7) * 0x10000; - data->offset = ((sprite_base[6] + 256 * sprite_base[7]) * 2) & sprite_mask; - data->rowbytes = (INT16)(sprite_base[4] + 256 * sprite_base[5]) * 2; - data->miny = sprite_base[0] ^ 0xff; - data->maxy = (sprite_base[1] ^ 0xff) - 1; - data->xscale = 65536.0 * (1.0 - 0.004 * (double)(sprite_base[2] - 0x40)); - data->yscale = (4 << 16) / (sprite_base[3] + 4); - data->xoffs = -1; - data->flip = sprite_base[7]>>7; - } + /* compute the sprite information; we use y-1 since this info was computed during HBLANK */ + /* on the previous scanline */ + turbo_prepare_sprites(state, y, &sprinfo); - /* now find the X positions */ - for (i = 0; i < 0x200; i++) - { - int value = sega_sprite_position[i]; - if (value) + /* loop over columns */ + for (x = 0; x <= cliprect->max_x; x += TURBO_X_SCALE) { - int base = (i & 0x01) << 3; - int which; - for (which = 0; which < 8; which++) - if (value & (1 << which)) - sprite_params[base + which].xoffs = ((i & 0x1fe) >> 1); - } - } -} - + int bacol, red, grn, blu, priority, foreraw, forebits, mx, ix; + int xx = x / TURBO_X_SCALE; + UINT8 carry; + UINT32 sprbits; + UINT16 he; + /* load the bitmask from the sprite position for both halves of the sprites (p. 139) */ + he = state->sprite_position[xx] | (state->sprite_position[xx + 0x100] << 8); -/*************************************************************************** + /* the AND of the line enable and horizontal enable is clocked and held in LST0-7 (p. 143) */ + he &= sprinfo.ve; + sprinfo.lst |= he | (he >> 8); - Sprite rendering + /* compute the X sum between opb and the current column; only the carry matters (p. 141) */ + carry = (xx + state->turbo_opb) >> 8; -***************************************************************************/ + /* the carry selects which inputs to use (p. 141) */ + if (carry) + { + sel = state->turbo_ipb; + coch = state->turbo_ipc >> 4; + } + else + { + sel = state->turbo_ipa; + coch = state->turbo_ipc & 15; + } -static void draw_one_sprite(const struct sprite_params_data *data, UINT32 *dest, UINT8 *edest, int xclip, int scanline) -{ - int xstep = data->flip ? -data->xscale : data->xscale; - int xoffs = data->xoffs; - UINT32 xcurr; - UINT32 *src; - UINT8 *esrc; - int offset; - - /* xoffs of -1 means don't draw */ - if (xoffs == -1 || data->xscale <= 0) return; - - /* compute the current data offset */ - scanline = ((scanline - data->miny) * data->yscale) >> 16; - offset = data->offset + (scanline + 1) * data->rowbytes; - - /* clip to the road */ - xcurr = offset << 16; - if (xoffs < xclip) - { - /* the pixel clock starts on xoffs regardless of clipping; take this into account */ - xcurr += ((xclip - xoffs) * xstep) & 0xffff; - xoffs = xclip; + /* look up AREA1 and AREA2 (p. 142) */ + offs = va | /* A0- A7 = VA0-VA7 */ + ((sel & 0x0f) << 8); /* A8-A11 = SEL0-3 */ + + areatmp = road_gfxdata[0x0000 | offs]; + areatmp = ((areatmp + xx) >> 8) & 0x01; + area = areatmp << 0; + + areatmp = road_gfxdata[0x1000 | offs]; + areatmp = ((areatmp + xx) >> 8) & 0x01; + area |= areatmp << 1; + + /* look up AREA3 and AREA4 (p. 142) */ + offs = va | /* A0- A7 = VA0-VA7 */ + ((sel & 0xf0) << 4); /* A8-A11 = SEL4-7 */ + + areatmp = road_gfxdata[0x2000 | offs]; + areatmp = ((areatmp + xx) >> 8) & 0x01; + area |= areatmp << 2; + + areatmp = road_gfxdata[0x3000 | offs]; + areatmp = ((areatmp + xx) >> 8) & 0x01; + area |= areatmp << 3; + + /* look up AREA5 (p. 141) */ + offs = (xx >> 3) | /* A0- A4 = H3-H7 */ + ((state->turbo_opc & 0x3f) << 5); /* A5-A10 = OPC0-5 */ + + areatmp = road_gfxdata[0x4000 | offs]; + areatmp = (areatmp << (xx & 7)) & 0x80; + area |= areatmp >> 3; + + /* compute the final area value and look it up in IC18/PR1115 (p. 144) */ + /* note: SLIPAR is 0 on the road surface only */ + /* ACCIAR is 0 on the road surface and the striped edges only */ + babit = pr1115[area]; + slipar_acciar = babit & 0x30; + if (!road && (slipar_acciar & 0x20)) + road = 1; + + /* also use the coch value to look up color info in IC13/PR1114 and IC21/PR1117 (p. 144) */ + offs = (coch & 0x0f) | /* A0-A3: CONT0-3 = COCH0-3 */ + ((state->turbo_fbcol & 0x01) << 4); /* A4: COL0 */ + bacol = pr1114[offs] | (pr1117[offs] << 8); + + /* at this point, do the character lookup; due to the shift register loading in */ + /* the sync PROM, we latch character 0 during pixel 6 and start clocking in pixel */ + /* 8, effectively shifting the display by 8; at pixel 0x108, the color latch is */ + /* forced clear and isn't touched until the next shift register load */ + foreraw = (xx < 8 || xx >= 0x108) ? 0 : fore[xx - 8]; + + /* perform the foreground color table lookup in IC99/PR1118 (p. 137) */ + forebits = pr1118[foreraw]; + + /* now that we have done all the per-5MHz pixel work, mix the sprites at the scale factor */ + for (ix = 0; ix < TURBO_X_SCALE; ix++) + { + /* iterate over live sprites and update them */ + /* the final 32-bit value is: */ + /* CDB0-7 = D0 -D7 */ + /* CDG0-7 = D8 -D15 */ + /* CDR0-7 = D16-D23 */ + /* PLB0-7 = D24-D31 */ + sprbits = turbo_get_sprite_bits(road, &sprinfo); + + /* perform collision detection here via lookup in IC20/PR1116 (p. 144) */ + state->turbo_collision |= pr1116[((sprbits >> 24) & 7) | (slipar_acciar >> 1)]; + + /* look up the sprite priority in IC11/PR1122 (p. 144) */ + priority = ((sprbits & 0xfe000000) >> 25) | /* A0-A6: PLB1-7 */ + ((state->turbo_fbpla & 0x07) << 7); /* A7-A9: PLA0-2 */ + priority = pr1122[priority]; + + /* use that to look up the overall priority in IC12/PR1123 (p. 144) */ + mx = (priority & 7) | /* A0-A2: PR-1122 output, bits 0-2 */ + ((sprbits & 0x01000000) >> 21) | /* A3: PLB0 */ + ((foreraw & 0x80) >> 3) | /* A4: PLBE */ + ((forebits & 0x08) << 2) | /* A5: PLBF */ + ((babit & 0x07) << 6) | /* A6-A8: BABIT1-3 */ + ((state->turbo_fbpla & 0x08) << 6); /* A9: PLA3 */ + mx = pr1123[mx]; + + /* the MX output selects one of 16 inputs; build up a 16-bit pattern to match */ + /* these in red, green, and blue (p. 144) */ + red = ((sprbits & 0x0000ff) >> 0) | /* D0- D7: CDR0-CDR7 */ + ((forebits & 0x01) << 8) | /* D8: CDRF */ + ((bacol & 0x001f) << 9) | /* D9-D13: BAR0-BAR4 */ + (1 << 14) | /* D14: 1 */ + (0 << 15); /* D15: 0 */ + + grn = ((sprbits & 0x00ff00) >> 8) | /* D0- D7: CDG0-CDG7 */ + ((forebits & 0x02) << 7) | /* D8: CDGF */ + ((bacol & 0x03e0) << 4) | /* D9-D13: BAG0-BAG4 */ + (1 << 14) | /* D14: 1 */ + (0 << 15); /* D15: 0 */ + + blu = ((sprbits & 0xff0000) >> 16) | /* D0- D7: CDB0-CDB7 */ + ((forebits & 0x04) << 6) | /* D8: CDBF */ + ((bacol & 0x7c00) >> 1) | /* D9-D13: BAB0-BAB4 */ + (1 << 14) | /* D14: 1 */ + (0 << 15); /* D15: 0 */ + + /* we then go through a muxer to select one of the 16 outputs computed above (p. 144) */ + offs = mx | /* A0-A3: MX0-MX3 */ + (((~red >> mx) & 1) << 4) | /* A4: CDR */ + (((~grn >> mx) & 1) << 5) | /* A5: CDG */ + (((~blu >> mx) & 1) << 6) | /* A6: CDB */ + ((state->turbo_fbcol & 6) << 6); /* A7-A8: COL1-2 */ + dest[x + ix] = pr1121[offs]; + } + } } + return 0; +} - /* determine the bitmap location */ - src = data->base; - esrc = data->enable; - /* two cases: easy case is with xstep <= 0x10000 */ - if (xstep >= -0x10000 && xstep <= 0x10000) - { - /* loop over columns */ - while (xoffs < VIEW_WIDTH) - { - UINT32 srcval = src[(xcurr >> 16) & sprite_mask]; - UINT8 srcenable = esrc[(xcurr >> 16) & sprite_mask]; - /* stop on the end-of-row signal */ - if (srcval == END_OF_ROW_VALUE) - break; +/************************************* + * + * Subroc 3D sprite handling + * + *************************************/ + +/* + Sprite state machine: + + 1LINE = 0 (V & 0x108 == 0x108) + --------- + 0 1 2 3 4 5 6 7 8 9 A B C D E F + 20 21 21 20 20 21 21 20 20 05 25 2c 07 e7 37 22 + _____ _____ _____ ________ + RAD0 = ___| |_____| |_____| |__| |___ + ___________ + RAD7 = ____________________________________| | + _________________ + YCULL= ___________________________| |___ + __ + AX = _________________________________| |____________ + __ + D/A = __________________________________________| |___ + ___________________________ _____ _________ + /CLK1= |__| |__| + __ + WRPL = _______________________________________| |______ + __ + /CLK2= _______________________________________| |______ + + + + 1LINE = 1 (V & 0x108 != 0x108) + --------- + 0 1 2 3 4 5 6 7 8 9 A B C D E F + 2c 2c 2c 2f 2f 2f 2f 20 2d 2d 2d 2d 0f 6f 2f 20 + ___________ ____________________ + RAD0 = _________| |__| |___ + ___________ ________ + RAD7 = _________| |______________| |___ + _____________________ ____________________ + YCULL= |__| |___ + _____________________ ____________________ + AX = |__| |___ + + D/A = _________________________________________________ + ____________________________________ _________ + /CLK1= |__| + __ + WRPL = _______________________________________| |______ + + /CLK2= _________________________________________________ + +*/ + +static void subroc3d_prepare_sprites(turbo_state *state, UINT8 y, sprite_info *info) +{ + const UINT8 *pr1449 = memory_region(REGION_PROMS) + 0x300; + int sprnum; - /* OR in the bits from this pixel */ - dest[xoffs] |= srcval; - edest[xoffs++] |= srcenable; - xcurr += xstep; - } - } + /* initialize the line enable signals to 0 */ + info->ve = 0; + info->lst = 0; - /* otherwise, we need to make sure we don't skip the end of row */ - else + /* compute the sprite information, which was done on the previous scanline during HBLANK */ + for (sprnum = 0; sprnum < 16; sprnum++) { - int xdir = (xstep < 0) ? -1 : 1; - - /* loop over columns */ - while (xoffs < VIEW_WIDTH) + UINT8 *rambase = &state->spriteram[sprnum * 8]; + int level = sprnum & 7; + UINT8 clo, chi; + UINT32 sum; + + /* perform the first ALU to see if we are within the scanline */ + sum = y + (rambase[0]/* ^ 0xff*/); + clo = (sum >> 8) & 1; + sum += (y << 8) + ((rambase[1]/* ^ 0xff*/) << 8); + chi = (sum >> 16) & 1; + + /* the AND of the low carry and the inverse of the high carry clocks an enable bit */ + /* for this sprite; note that the logic in the Turbo schematics is reversed here */ + if (clo & (chi ^ 1)) { - int xint = (xcurr >> 16) & sprite_mask, newxint; - UINT32 srcval = src[xint]; - UINT8 srcenable = esrc[xint]; - - /* stop on the end-of-row signal */ - if (srcval == END_OF_ROW_VALUE) - break; - - /* OR in the bits from this pixel */ - dest[xoffs] |= srcval; - edest[xoffs++] |= srcenable; - xcurr += xstep; - - /* make sure we don't hit any end of rows along the way */ - newxint = (xcurr >> 16) & sprite_mask; - while ((xint = (xint + xdir) & sprite_mask) != newxint) - if (src[xint] == END_OF_ROW_VALUE) - break; + int xscale = rambase[2] ^ 0xff; + int yscale = rambase[3];// ^ 0xff; + UINT16 offset = rambase[6] + (rambase[7] << 8); + int offs; + + /* mark this entry enabled */ + info->ve |= 1 << sprnum; + + /* look up the low byte of the sum plus the yscale value in */ + /* IC50/PR1119 to determine if we write back the sum of the */ + /* offset and the rowbytes this scanline (p. 138) */ + offs = (sum & 0xff) | /* A0-A7 = AL0-AL7 */ + ((yscale & 0x08) << 5); /* A8-A9 = /RO11-/RO12 */ + + /* one of the bits is selected based on the low 7 bits of yscale */ + if (!((pr1449[offs] >> (yscale & 0x07)) & 1)) + { + offset += rambase[4] + (rambase[5] << 8); + rambase[6] = offset; + rambase[7] = offset >> 8; + } + + /* the output of the ALU here goes to the individual level counter */ + info->latched[level] = 0; + info->plb[level] = 0; + info->offset[level] = offset << 1; + info->frac[level] = 0; + info->step[level] = sprite_xscale(xscale, 1.2e3, 1.2e3, 220e-12); } } } -static void draw_sprites(UINT32 *dest, UINT8 *edest, int scanline, UINT8 mask, int xclip) +static UINT32 subroc3d_get_sprite_bits(sprite_info *sprinfo, UINT8 *plb) { - int i; - - for (i = 0; i < 8; i++) - { - const struct sprite_params_data *data; - - /* check the mask */ - if (mask & (1 << i)) + /* see logic on each sprite: + END = (CDA == 1 && (CDA ^ CDB) == 0 && (CDC ^ CDD) == 0) + PLB = END ^ (CDA == 1 && (CDC ^ CDD) == 0) + end is in bit 1, plb in bit 0 + */ + static const UINT8 plb_end[16] = { 0,1,1,2, 1,1,1,1, 1,1,1,1, 0,1,1,2 }; + const UINT8 *sprite_gfxdata = memory_region(REGION_GFX1); + UINT32 sprdata = 0; + int level; + + *plb = 0; + + /* loop over all live levels */ + for (level = 0; level < 8; level++) + if (sprinfo->lst & (1 << level)) { - /* if the sprite intersects this scanline, draw it */ - data = &sprite_params[i]; - if (scanline >= data->miny && scanline < data->maxy) - draw_one_sprite(data, dest, edest, xclip, scanline); - - /* if the sprite intersects this scanline, draw it */ - data = &sprite_params[8 + i]; - if (scanline >= data->miny && scanline < data->maxy) - draw_one_sprite(data, dest, edest, xclip, scanline); - } - } -} + /* latch the data and advance the offset */ + sprdata |= sprinfo->latched[level]; + *plb |= sprinfo->plb[level]; + sprinfo->frac[level] += sprinfo->step[level]; + /* if we're live and we've clocked more data, advance */ + while (sprinfo->frac[level] >= 0x800000) + { + UINT32 offs = sprinfo->offset[level]; + UINT8 pixdata; + + /* bit 0 controls which half of the byte to use */ + /* bits 1-13 go to address lines */ + /* bit 14 selects which of the two ROMs to read from */ + pixdata = sprite_gfxdata[(level << 15) | ((offs >> 1) & 0x7fff)] >> ((~offs & 1) * 4); + sprinfo->latched[level] = sprite_expand[pixdata & 0x0f] << level; + sprinfo->plb[level] = (plb_end[pixdata & 0x0f] & 1) << level; + + /* if bit 3 is 0 and bit 2 is 1, the enable flip/flip is reset */ + if (plb_end[pixdata & 0x0f] & 2) + sprinfo->lst &= ~(1 << level); + + /* if bit 15 is set, we decrement instead of increment */ + sprinfo->offset[level] += (offs & 0x10000) ? -1 : 1; + sprinfo->frac[level] -= 0x800000; + } + } + return sprdata; +} -/*************************************************************************** - Core drawing routines -***************************************************************************/ +/************************************* + * + * Subroc 3D video update + * + *************************************/ -static void turbo_render(mame_bitmap *bitmap) +VIDEO_UPDATE( subroc3d ) { - UINT8 *overall_priority_base = &overall_priority[(turbo_fbpla & 8) << 6]; - UINT8 *sprite_priority_base = &sprite_priority[(turbo_fbpla & 7) << 7]; - UINT8 *road_gfxdata_base = &road_gfxdata[(turbo_opc << 5) & 0x7e0]; - UINT16 *road_palette_base = &road_expanded_palette[(turbo_fbcol & 1) << 4]; - pen_t *colortable; - int x, y, i; - - /* suck up the sprite parameter data */ - turbo_update_sprite_info(); - - /* determine the color offset */ - colortable = &Machine->pens[(turbo_fbcol & 6) << 6]; + turbo_state *state = Machine->driver_data; + mame_bitmap *fgpixmap = tilemap_get_pixmap(state->fg_tilemap); + const UINT8 *prom_base = memory_region(REGION_PROMS); + const UINT8 *pr1419 = prom_base + 0x000; + const UINT8 *pr1620 = prom_base + 0x200; + const UINT8 *pr1450 = prom_base + 0x500; + const UINT8 *pr1454 = prom_base + 0x920; + int x, y; /* loop over rows */ - for (y = 4; y < VIEW_HEIGHT - 4; y++) + for (y = cliprect->min_y; y <= cliprect->max_y; y++) { - int sel, coch, babit, slipar_acciar, area, area1, area2, area3, area4, area5, road = 0; - UINT32 sprite_buffer[VIEW_WIDTH]; - UINT8 sprite_enable[VIEW_WIDTH]; - UINT8 scanline[VIEW_WIDTH]; + const UINT16 *fore = (UINT16 *)fgpixmap->base + y * fgpixmap->rowpixels; + UINT16 *dest = (UINT16 *)bitmap->base + y * bitmap->rowpixels; + sprite_info sprinfo; - /* compute the Y sum between opa and the current scanline (p. 141) */ - int va = (y + turbo_opa) & 0xff; - - /* the upper bit of OPC inverts the road */ - if (!(turbo_opc & 0x80)) va ^= 0xff; + /* compute the sprite information; we use y-1 since this info was computed during HBLANK */ + /* on the previous scanline */ + subroc3d_prepare_sprites(state, y, &sprinfo); - /* clear the sprite buffer and draw the road sprites */ - memset(sprite_buffer, 0, VIEW_WIDTH * sizeof(UINT32)); - memset(sprite_enable, 0, VIEW_WIDTH * sizeof(UINT8)); - draw_sprites(sprite_buffer, sprite_enable, y, 0x07, 0); - - /* loop over 8-pixel chunks */ - for (x = 8; x < VIEW_WIDTH; x += 8) + /* loop over columns */ + for (x = 0; x <= cliprect->max_x; x += TURBO_X_SCALE) { - int area5_buffer = road_gfxdata_base[0x4000 + (x >> 3)]; - UINT8 fore_data = videoram[(y / 8) * 32 + (x / 8) - 33]; - UINT16 forebits_buffer = fore_expanded_data[(fore_data << 3) | (y & 7)]; - - /* loop over columns */ - for (i = 0; i < 8; i++) + int offs, finalbits, ix; + UINT8 xx = x / TURBO_X_SCALE; + UINT8 foreraw, forebits, mux, cd, plb, mplb; + UINT16 he; + UINT32 sprbits; + + /* load the bitmask from the sprite position for both halves of the sprites (p. 143) */ + he = state->sprite_position[xx * 2] | (state->sprite_position[xx * 2 + 1] << 8); + + /* the AND of the line enable and horizontal enable is clocked and held in LST0-7 (p. 143) */ + he &= sprinfo.ve; + sprinfo.lst |= he | (he >> 8); + + /* at this point, do the character lookup */ + if (!state->subroc3d_flip) + foreraw = fore[xx]; + else + foreraw = fore[(pr1454[(xx >> 3) & 0x1f] << 3) | (xx & 0x07)]; + + /* perform the foreground color table lookup in IC62/PR1620 (p. 141) */ + forebits = pr1620[foreraw]; + + /* MPLB is set based on the high bit of the raw foreground data, as an OR over the output */ + /* of the foreground color PROM */ + mplb = (foreraw & 0x80) || ((forebits & 0x0f) == 0); + + /* now that we have done all the per-5MHz pixel work, mix the sprites at the scale factor */ + for (ix = 0; ix < TURBO_X_SCALE; ix++) { - UINT32 sprite = sprite_buffer[x + i]; - UINT8 enable = sprite_enable[x + i]; - - /* compute the X sum between opb and the current column; only the carry matters (p. 141) */ - int carry = (x + i + turbo_opb) >> 8; - - /* the carry selects which inputs to use (p. 141) */ - if (carry) + /* iterate over live sprites and update them */ + /* the final 32-bit value is: */ + /* CDA0-7 = D0 -D7 */ + /* CDB0-7 = D8 -D15 */ + /* CDC0-7 = D16-D23 */ + /* CDD0-7 = D24-D31 */ + sprbits = subroc3d_get_sprite_bits(&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) */ + if (mplb) { - sel = turbo_ipb; - coch = turbo_ipc >> 4; + offs = (plb ^ 0xff) | /* A0-A7: /PLB0-7 */ + ((state->subroc3d_ply & 0x02) << 7); /* A8: PLY1 */ + mux = pr1450[offs] >> ((state->subroc3d_ply & 0x01) * 4); } else - { - sel = turbo_ipa; - coch = turbo_ipc & 15; - } - - /* at this point we also compute area5 (p. 141) */ - area5 = (area5_buffer >> 3) & 0x10; - area5_buffer <<= 1; - - /* now look up the rest of the road bits (p. 142) */ - area1 = road_gfxdata[0x0000 | ((sel & 15) << 8) | va]; - area1 = ((area1 + x + i) >> 8) & 0x01; - area2 = road_gfxdata[0x1000 | ((sel & 15) << 8) | va]; - area2 = ((area2 + x + i) >> 7) & 0x02; - area3 = road_gfxdata[0x2000 | ((sel >> 4) << 8) | va]; - area3 = ((area3 + x + i) >> 6) & 0x04; - area4 = road_gfxdata[0x3000 | ((sel >> 4) << 8) | va]; - area4 = ((area4 + x + i) >> 5) & 0x08; - - /* compute the final area value and look it up in IC18/PR1115 (p. 144) */ - area = area5 | area4 | area3 | area2 | area1; - babit = road_enable_collide[area] & 0x07; - - /* note: SLIPAR is 0 on the road surface only */ - /* ACCIAR is 0 on the road surface and the striped edges only */ - slipar_acciar = road_enable_collide[area] & 0x30; - if (!road && (slipar_acciar & 0x20)) - { - road = 1; - draw_sprites(sprite_buffer, sprite_enable, y, 0xf8, x + i + 2); - } + mux = 0; - /* perform collision detection here */ - turbo_collision |= collision_map[(enable & 7) | (slipar_acciar >> 1)]; + /* CD0-3 are selected from the sprite bits and MUX0-2 (p. 141) */ + sprbits = (sprbits >> (mux & 0x07)) & 0x01010101; + cd = (sprbits >> (24-3)) | (sprbits >> (16-2)) | (sprbits >> (8-1)) | sprbits; - /* we only need to continue if we're actually drawing */ - if (bitmap) - { - int bacol, red, grn, blu, priority, forebits, mx; - - /* also use the coch value to look up color info in IC13/PR1114 and IC21/PR1117 (p. 144) */ - bacol = road_palette_base[coch & 15]; - - /* at this point, do the character lookup */ - forebits = forebits_buffer & 3; - forebits_buffer >>= 2; - forebits = fore_palette[forebits | (fore_data & 0xfc)]; - - /* look up the sprite priority in IC11/PR1122 */ - priority = sprite_priority_base[enable >> 1]; - - /* use that to look up the overall priority in IC12/PR1123 */ - mx = overall_priority_base[(priority & 7) | ((enable << 3) & 8) | ((fore_data >> 3) & 0x10) | ((forebits << 2) & 0x20) | (babit << 6)]; - - /* the input colors consist of a mix of sprite, road and 1's & 0's */ - red = 0x040000 | ((bacol & 0x001f) << 13) | ((forebits & 1) << 12) | ((sprite << 4) & 0x0ff0); - grn = 0x080000 | ((bacol & 0x03e0) << 9) | ((forebits & 2) << 12) | ((sprite >> 3) & 0x1fe0); - blu = 0x100000 | ((bacol & 0x7c00) << 5) | ((forebits & 4) << 12) | ((sprite >> 10) & 0x3fc0); + /* MUX3 selects either CD0-3 or the foreground output (p. 141) */ + if (mux & 0x08) + finalbits = cd; + else + finalbits = forebits; - /* we then go through a muxer; normally these values are inverted, but */ - /* we've already taken care of that when we generated the palette */ - red = (red >> mx) & 0x10; - grn = (grn >> mx) & 0x20; - blu = (blu >> mx) & 0x40; - scanline[x + i] = mx | red | grn | blu; - } + /* we then go through a muxer to select one of the 16 outputs computed above (p. 141) */ + offs = (finalbits & 0x0f) | /* A0-A3: CD0-CD3 */ + ((mux & 0x08) << 1) | /* A4: MUX3 */ + (state->subroc3d_col << 5); /* A5-A8: COL0-COL3 */ + dest[x + ix] = pr1419[offs]; } } - - /* render the scanline */ - if (bitmap) - draw_scanline8(bitmap, 8, y, VIEW_WIDTH - 8, &scanline[8], colortable, -1); } + return 0; } -static void subroc3d_render(mame_bitmap *bitmap) -{ - UINT8 *sprite_priority_base = &sprite_expanded_priority[(subroc3d_ply & 15) << 8]; - pen_t *colortable; - int y; - /* suck up the sprite parameter data */ - subroc3d_update_sprite_info(); +/************************************* + * + * Buck Rogers sprite handling + * + *************************************/ - /* determine the color offset */ - colortable = &Machine->pens[(subroc3d_col & 15) << 5]; +static void buckrog_prepare_sprites(turbo_state *state, UINT8 y, sprite_info *info) +{ + const UINT8 *pr5196 = memory_region(REGION_PROMS) + 0x100; + int sprnum; - /* loop over rows */ - for (y = 0; y < VIEW_HEIGHT; y++) + /* initialize the line enable signals to 0 */ + info->ve = 0; + info->lst = 0; + + /* compute the sprite information, which was done on the previous scanline during HBLANK */ + for (sprnum = 0; sprnum < 16; sprnum++) { - UINT32 sprite_buffer[VIEW_WIDTH]; - UINT8 sprite_enable[VIEW_WIDTH]; - UINT8 scanline[VIEW_WIDTH]; - int x; - - /* clear the sprite buffer and draw the road sprites */ - memset(sprite_buffer, 0, VIEW_WIDTH * sizeof(UINT32)); - memset(sprite_enable, 0, VIEW_WIDTH * sizeof(UINT8)); - draw_sprites(sprite_buffer, sprite_enable, y, 0xff, 0); - - /* loop over 8-pixel chunks */ - for (x = 0; x < VIEW_WIDTH; x += 8) + UINT8 *rambase = &state->spriteram[sprnum * 8]; + int level = sprnum & 7; + UINT8 clo, chi; + UINT32 sum; + + /* perform the first ALU to see if we are within the scanline */ + sum = y + (rambase[0]/* ^ 0xff*/); + clo = (sum >> 8) & 1; + sum += (y << 8) + ((rambase[1]/* ^ 0xff*/) << 8); + chi = (sum >> 16) & 1; + + /* the AND of the low carry and the inverse of the high carry clocks an enable bit */ + /* for this sprite; note that the logic in the Turbo schematics is reversed here */ + if (clo & (chi ^ 1)) { - UINT8 fore_data = videoram[(y / 8) * 32 + (((x / 8) + subroc3d_chofs) % 32)]; - UINT16 forebits_buffer = fore_expanded_data[(fore_data << 3) | (y & 7)]; - int i; - - /* loop over columns */ - for (i = 0; i < 8; i++) + int xscale = rambase[2] ^ 0xff; + int yscale = rambase[3];// ^ 0xff; + UINT16 offset = rambase[6] + (rambase[7] << 8); + int offs; + + /* mark this entry enabled */ + info->ve |= 1 << sprnum; + + /* look up the low byte of the sum plus the yscale value in */ + /* IC50/PR1119 to determine if we write back the sum of the */ + /* offset and the rowbytes this scanline (p. 138) */ + offs = (sum & 0xff) | /* A0-A7 = AL0-AL7 */ + ((yscale & 0x08) << 5); /* A8-A9 = /RO11-/RO12 */ + + /* one of the bits is selected based on the low 7 bits of yscale */ + if (!((pr5196[offs] >> (yscale & 0x07)) & 1)) { - int bits, forebits, mux, mplb; - - /* at this point, do the character lookup */ - forebits = forebits_buffer & 3; - forebits_buffer >>= 2; - forebits = fore_palette[forebits | (fore_data & 0xfc)] & 0x0f; - - /* determine the value of mplb */ - mplb = (forebits == 0 || (fore_data & 0x80)); - - /* look up the sprite priority in IC11/PR1122 */ - mux = mplb ? sprite_priority_base[sprite_enable[x + i]] : 0; - - /* mux3 selects either sprite or foreground */ - if (mux & 0x20) - bits = (sprite_buffer[x + i] >> (mux & 0x1c)) & 0x0f; - else - bits = forebits; - - scanline[x + i] = ((mux & 0x20) >> 1) | bits; + offset += rambase[4] + (rambase[5] << 8); + rambase[6] = offset; + rambase[7] = offset >> 8; } - } - /* render the scanline */ - draw_scanline8(bitmap, 0, y, VIEW_WIDTH, scanline, colortable, -1); + /* the output of the ALU here goes to the individual level counter */ + info->latched[level] = 0; + info->plb[level] = 0; + info->offset[level] = offset << 1; + info->frac[level] = 0; + info->step[level] = sprite_xscale(xscale, 1.2e3, 500/*820*/, 220e-12); + } } } -static void buckrog_render(mame_bitmap *bitmap) +static UINT32 buckrog_get_sprite_bits(sprite_info *sprinfo, UINT8 *plb) { - int y; - - /* suck up the sprite parameter data */ - subroc3d_update_sprite_info(); - - /* loop over rows */ - for (y = 0; y < VIEW_HEIGHT; y++) - { - UINT32 sprite_buffer[VIEW_WIDTH]; - UINT8 sprite_enable[VIEW_WIDTH]; - UINT16 scanline[VIEW_WIDTH]; - int bgcolor; - int x; - - /* determine background color for this scanline */ - bgcolor = 1024 | 512 | back_data[(buckrog_mov << 8) | y]; - - /* clear the sprite buffer and draw the road sprites */ - memset(sprite_buffer, 0, VIEW_WIDTH * sizeof(UINT32)); - memset(sprite_enable, 0, VIEW_WIDTH * sizeof(UINT8)); - draw_sprites(sprite_buffer, sprite_enable, y, 0xff, 0); - - /* loop over 8-pixel chunks */ - for (x = 0; x < VIEW_WIDTH; x += 8) + /* see logic on each sprite: + END = (CDA == 1 && (CDA ^ CDB) == 0 && (CDC ^ CDD) == 0) + PLB = END ^ (CDA == 1 && (CDC ^ CDD) == 0) + end is in bit 1, plb in bit 0 + */ + static const UINT8 plb_end[16] = { 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,2 }; + const UINT8 *sprite_gfxdata = memory_region(REGION_GFX1); + UINT32 sprdata = 0; + int level; + + *plb = 0; + + /* loop over all live levels */ + for (level = 0; level < 8; level++) + if (sprinfo->lst & (1 << level)) { - UINT8 fore_data = videoram[(y / 8) * 32 + (x / 8)]; - UINT16 forebits_buffer = fore_expanded_data[(fore_data << 3) | (y & 7)]; - UINT16 forebits_upper = ((buckrog_fchg << 7) & 0x180) | ((fore_data >> 1) & 0x7c); - UINT8 *stars = &buckrog_bitmap_ram[y * 256]; - int i; - - /* loop over columns */ - for (i = 0; i < 8; i++) - { - int bits, forebits, forepri, mux; - - /* at this point, do the character lookup */ - forebits = (forebits_buffer & 3) | forebits_upper; - forebits_buffer >>= 2; - - /* look up the foreground priority */ - forepri = fore_priority[forebits]; - - /* look up the sprite priority in IC11/PR1122 */ - mux = sprite_expanded_priority[sprite_enable[x + i]]; - - /* final result is based on sprite/foreground/star priorities */ - if (!(forepri & 0x80)) - bits = 1024 | forebits; - else if (mux & 0x20) - bits = (buckrog_obch << 7) | ((mux & 0x1c) << 2) | ((sprite_buffer[x + i] >> (mux & 0x1c)) & 0x0f); - else if (!(forepri & 0x40)) - bits = 1024 | forebits; - else if (stars[x + i]) - bits = 1024 | 512 | 255; - else - bits = bgcolor; + /* latch the data and advance the offset */ + sprdata |= sprinfo->latched[level]; + *plb |= sprinfo->plb[level]; + sprinfo->frac[level] += sprinfo->step[level]; - scanline[x + i] = bits; + /* if we're live and we've clocked more data, advance */ + while (sprinfo->frac[level] >= 0x800000) + { + UINT32 offs = sprinfo->offset[level]; + UINT8 pixdata; + + /* bit 0 controls which half of the byte to use */ + /* bits 1-13 go to address lines */ + /* bit 14 selects which of the two ROMs to read from */ + pixdata = sprite_gfxdata[(level << 15) | ((offs >> 1) & 0x7fff)] >> ((~offs & 1) * 4); + sprinfo->latched[level] = sprite_expand[pixdata & 0x0f] << level; + sprinfo->plb[level] = (plb_end[pixdata & 0x0f] & 1) << level; + + /* if bit 3 is 0 and bit 2 is 1, the enable flip/flip is reset */ + if (plb_end[pixdata & 0x0f] & 2) + sprinfo->lst &= ~(1 << level); + + /* if bit 15 is set, we decrement instead of increment */ + sprinfo->offset[level] += (offs & 0x10000) ? -1 : 1; + sprinfo->frac[level] -= 0x800000; } } - /* render the scanline */ - draw_scanline16(bitmap, 0, y, VIEW_WIDTH, scanline, Machine->pens, -1); - } + return sprdata; } -/*************************************************************************** +/************************************* + * + * Buck Rogers video update + * + *************************************/ - Main refresh - -***************************************************************************/ - -VIDEO_EOF( turbo ) -{ - /* only do collision checking if we didn't draw */ - if (!drew_frame) - turbo_render(NULL); - drew_frame = 0; -} - - -VIDEO_UPDATE( turbo ) +VIDEO_UPDATE( buckrog ) { - /* perform the actual drawing */ - turbo_render(bitmap); + turbo_state *state = Machine->driver_data; + mame_bitmap *fgpixmap = tilemap_get_pixmap(state->fg_tilemap); + const UINT8 *bgcolor = memory_region(REGION_GFX3); + const UINT8 *prom_base = memory_region(REGION_PROMS); + const UINT8 *pr5194 = prom_base + 0x000; + const UINT8 *pr5198 = prom_base + 0x500; + const UINT8 *pr5199 = prom_base + 0x700; + int x, y; - /* draw the LEDs for the scores */ - turbo_update_segments(); - - /* indicate that we drew this frame, so that the eof callback doesn't bother doing anything */ - drew_frame = 1; - return 0; -} - - -VIDEO_UPDATE( subroc3d ) -{ - /* perform the actual drawing */ - subroc3d_render(bitmap); + /* loop over rows */ + 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; + sprite_info sprinfo; - /* draw the LEDs for the scores */ - turbo_update_segments(); - return 0; -} + /* compute the sprite information; we use y-1 since this info was computed during HBLANK */ + /* on the previous scanline */ + buckrog_prepare_sprites(state, y, &sprinfo); + /* loop over columns */ + for (x = 0; x <= cliprect->max_x; x += TURBO_X_SCALE) + { + UINT8 foreraw, forebits, cd, plb, star, mux; + UINT8 xx = x / TURBO_X_SCALE; + UINT16 he; + UINT32 sprbits; + int palbits, offs, ix; + + /* load the bitmask from the sprite position for both halves of the sprites (p. 143) */ + he = state->sprite_position[xx * 2] | (state->sprite_position[xx * 2 + 1] << 8); + + /* the AND of the line enable and horizontal enable is clocked and held in LST0-7 (p. 143) */ + he &= sprinfo.ve; + sprinfo.lst |= he | (he >> 8); + + /* at this point, do the character lookup and the foreground color table lookup in IC93/PR1598 (SH 5/5)*/ + foreraw = fore[(pr5194[((xx >> 3) - 1) & 0x1f] << 3) | (xx & 0x07)]; + offs = ((foreraw & 0x03) << 0) | /* A0-A1: BIT0-1 */ + ((foreraw & 0xf8) >> 1) | /* A2-A6: BANK3-7 */ + ((state->buckrog_fchg & 0x03) << 7); /* A7-A9: FCHG0-2 */ + forebits = pr5198[offs]; + + /* fetch the STAR bit */ + star = state->buckrog_bitmap_ram[y * 64 + xx]; + + /* now that we have done all the per-5MHz pixel work, mix the sprites at the scale factor */ + for (ix = 0; ix < TURBO_X_SCALE; ix++) + { + /* iterate over live sprites and update them */ + /* the final 32-bit value is: */ + /* CDA0-7 = D0 -D7 */ + /* CDB0-7 = D8 -D15 */ + /* CDC0-7 = D16-D23 */ + /* CDD0-7 = D24-D31 */ + sprbits = buckrog_get_sprite_bits(&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) + mux = 8; + else + { + mux = 7; + while (!(plb & 0x80)) + { + mux--; + plb <<= 1; + } + } -VIDEO_UPDATE( buckrog ) -{ - /* perform the actual drawing */ - buckrog_render(bitmap); + /* MUX then selects one of the sprites and selects CD0-3 */ + sprbits = (sprbits >> (mux & 0x07)) & 0x01010101; + cd = (sprbits >> (24-3)) | (sprbits >> (16-2)) | (sprbits >> (8-1)) | sprbits; - /* draw the LEDs for the scores */ - turbo_update_segments(); - return 0; -} + /* this info goes into an LS148 8-to-3 decoder to determine the priorities (SH 5/5) */ + /* priority 7 is if bit 0x80 of the foreground color is 0; CHNG = 0 */ + if (!(forebits & 0x80)) + { + palbits = ((forebits & 0x3c) << 2) | + ((forebits & 0x06) << 1) | + ((forebits & 0x01) << 0); + } + /* priority 6 is if MUX3 is 0; CHNG = 1 */ + else if (!(mux & 0x08)) + { + offs = (cd & 0x0f) | /* A0-A3: CD0-3 */ + ((mux & 0x07) << 4) | /* A4-A6: MUX0-2 */ + ((state->buckrog_obch & 0x07) << 7); /* A7-A9: OBCH0-2 */ + palbits = pr5199[offs]; + } -/*************************************************************************** + /* priority 3 is if bit 0x40 of the foreground color is 0; CHNG = 0 */ + else if (!(forebits & 0x40)) + { + palbits = ((forebits & 0x3c) << 2) | + ((forebits & 0x06) << 1) | + ((forebits & 0x01) << 0); + } - Buck Rogers misc + /* priority 1 is if the star is set; CHNG = 2 */ + else if (star) + { + palbits = 0xff; + } -***************************************************************************/ + /* otherwise, CHNG = 3 */ + else + { + palbits = bgcolor[y | ((state->buckrog_mov & 0x1f) << 8)]; + palbits = (palbits & 0xc0) | ((palbits & 0x30) << 4) | ((palbits & 0x0f) << 2); + } -WRITE8_HANDLER( buckrog_bitmap_w ) -{ - buckrog_bitmap_ram[offset] = data & 1; + /* store the final bits for this pixel */ + dest[x + ix] = palbits; + } + } + } + return 0; } diff --git a/src/vidhrdw/twin16.c b/src/vidhrdw/twin16.c index ad077db91..5484edc3e 100644 --- a/src/vidhrdw/twin16.c +++ b/src/vidhrdw/twin16.c @@ -51,22 +51,11 @@ WRITE16_HANDLER( twin16_videoram2_w ) WRITE16_HANDLER( twin16_paletteram_word_w ) { // identical to tmnt_paletteram_w - int r, g, b; - COMBINE_DATA(paletteram16 + offset); offset &= ~1; data = ((paletteram16[offset] & 0xff) << 8) | (paletteram16[offset + 1] & 0xff); - - r = (data >> 0) & 0x1f; - g = (data >> 5) & 0x1f; - b = (data >> 10) & 0x1f; - - r = (r << 3) | (r >> 2); - g = (g << 3) | (g >> 2); - b = (b << 3) | (b >> 2); - - palette_set_color(offset / 2, r, g, b); + palette_set_color(Machine, offset / 2, pal5bit(data >> 0), pal5bit(data >> 5), pal5bit(data >> 10)); } WRITE16_HANDLER( fround_gfx_bank_w ) diff --git a/src/vidhrdw/tx1.c b/src/vidhrdw/tx1.c index 458f014c8..24c2d2f55 100644 --- a/src/vidhrdw/tx1.c +++ b/src/vidhrdw/tx1.c @@ -120,7 +120,7 @@ PALETTE_INIT( buggyboy ) bit4 = (color_prom[i+0x300]) & 1; b = 0x06 * bit4 + 0x0d * bit0 + 0x1e * bit1 + 0x41 * bit2 + 0x8a * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } diff --git a/src/vidhrdw/undrfire.c b/src/vidhrdw/undrfire.c index dc97d566a..e3e42fc8f 100644 --- a/src/vidhrdw/undrfire.c +++ b/src/vidhrdw/undrfire.c @@ -33,7 +33,7 @@ VIDEO_START( undrfire ) return 1; for (i=0; i<16384; i++) /* Fix later - some weird colours in places */ - palette_set_color(i,0,0,0); + palette_set_color(machine,i,0,0,0); return 0; } diff --git a/src/vidhrdw/unico.c b/src/vidhrdw/unico.c index f4d60ef6d..8b5ef1e98 100644 --- a/src/vidhrdw/unico.c +++ b/src/vidhrdw/unico.c @@ -68,7 +68,7 @@ WRITE16_HANDLER( unico_palette_w ) COMBINE_DATA(&paletteram16[offset]); data1 = paletteram16[offset & ~1]; data2 = paletteram16[offset | 1]; - palette_set_color( offset/2, + palette_set_color( Machine,offset/2, (data1 >> 8) & 0xFC, (data1 >> 0) & 0xFC, (data2 >> 8) & 0xFC ); @@ -77,7 +77,7 @@ WRITE16_HANDLER( unico_palette_w ) WRITE32_HANDLER( unico_palette32_w ) { UINT32 rgb0 = COMBINE_DATA(&paletteram32[offset]); - palette_set_color( offset, + palette_set_color( Machine,offset, (rgb0 >> 24) & 0xFC, (rgb0 >> 16) & 0xFC, (rgb0 >> 8) & 0xFC ); diff --git a/src/vidhrdw/usgames.c b/src/vidhrdw/usgames.c index bd9e49f88..03e9603b2 100644 --- a/src/vidhrdw/usgames.c +++ b/src/vidhrdw/usgames.c @@ -22,7 +22,7 @@ PALETTE_INIT(usg) g = 0x7f * g * (i + 1); b = 0x7f * b * (i + 1); - palette_set_color(j,r,g,b); + palette_set_color(machine,j,r,g,b); } for (j = 0;j < 256;j++) diff --git a/src/vidhrdw/v9938.c b/src/vidhrdw/v9938.c index 37fe0bd9d..d978a69de 100644 --- a/src/vidhrdw/v9938.c +++ b/src/vidhrdw/v9938.c @@ -112,19 +112,11 @@ b0 is set if b2 and b1 are set (remember, color bus is 3 bits) PALETTE_INIT( v9938 ) { - int i, red, green, blue; + int i; /* create the full 512 colour palette */ for (i=0;i<512;i++) - { - red = (i >> 6) & 7; /* red */ - red = (red << 5) | (red << 2) | (red >> 1); /* convert to 8 bits */ - green = (i >> 3) & 7; /* green */ - green = (green << 5) | (green << 2) | (green >> 1); /* convert to 8 bits */ - blue = i & 7; /* blue */ - blue = (blue << 5) | (blue << 2) | (blue >> 1); /* convert to 8 bits */ - palette_set_color(i, red, green, blue); - } + palette_set_color(machine, i, pal3bit(i >> 6), pal3bit(i >> 3), pal3bit(i >> 0)); } /* @@ -144,7 +136,7 @@ PALETTE_INIT( v9958 ) unsigned char pal[19268*3]; /* init v9938 512-color palette */ - palette_init_v9938(colortable, color_prom); + palette_init_v9938(machine, colortable, color_prom); /* set up YJK table */ if (!pal_indYJK) @@ -187,7 +179,7 @@ PALETTE_INIT( v9958 ) pal[i*3+0] = r; pal[i*3+1] = g; pal[i*3+2] = b; - palette_set_color(i+512, r, g, b); + palette_set_color(machine, i+512, r, g, b); pal_indYJK[y | j << 5 | k << (5 + 6)] = i + 512; i++; } @@ -415,7 +407,7 @@ WRITE8_HANDLER (v9938_command_w) ***************************************************************************/ -int v9938_init (int model, int vram_size, void (*callback)(int) ) +int v9938_init (running_machine *machine, int model, int vram_size, void (*callback)(int) ) { memset (&vdp, 0, sizeof (vdp) ); @@ -442,7 +434,7 @@ int v9938_init (int model, int vram_size, void (*callback)(int) ) else vdp.vram_exp = NULL; - return video_start_generic_bitmapped(); + return video_start_generic_bitmapped(machine); } void v9938_reset (void) diff --git a/src/vidhrdw/v9938.h b/src/vidhrdw/v9938.h index ff0e42b31..53b029c25 100644 --- a/src/vidhrdw/v9938.h +++ b/src/vidhrdw/v9938.h @@ -14,7 +14,7 @@ #define RENDER_LOW (1) #define RENDER_AUTO (2) -int v9938_init (int, int, void (*callback)(int)); +int v9938_init (running_machine *, int, int, void (*callback)(int)); void v9938_reset (void); int v9938_interrupt (void); void v9938_set_sprite_limit (int); diff --git a/src/vidhrdw/vaportra.c b/src/vidhrdw/vaportra.c index a05574ddc..75b2ab0cb 100644 --- a/src/vidhrdw/vaportra.c +++ b/src/vidhrdw/vaportra.c @@ -64,7 +64,7 @@ static void update_24bitcol(int offset) g = (paletteram16[offset] >> 8) & 0xff; b = (paletteram16_2[offset] >> 0) & 0xff; - palette_set_color(offset,r,g,b); + palette_set_color(Machine,offset,r,g,b); } WRITE16_HANDLER( vaportra_palette_24bit_rg_w ) diff --git a/src/vidhrdw/vball.c b/src/vidhrdw/vball.c index e22338517..ce30d9f61 100644 --- a/src/vidhrdw/vball.c +++ b/src/vidhrdw/vball.c @@ -90,8 +90,8 @@ void vb_bgprombank_w( int bank ) color_prom = memory_region(REGION_PROMS) + bank*0x80; for (i=0;i<128;i++, color_prom++) { - palette_set_color(i,(color_prom[0] & 0x0f) << 4,(color_prom[0] & 0xf0) >> 0, - (color_prom[0x800] & 0x0f) << 4); + palette_set_color(Machine,i,pal4bit(color_prom[0] >> 0),pal4bit(color_prom[0] >> 4), + pal4bit(color_prom[0x800] >> 0)); } vb_bgprombank=bank; } @@ -106,8 +106,8 @@ void vb_spprombank_w( int bank ) color_prom = memory_region(REGION_PROMS)+0x400 + bank*0x80; for (i=128;i<256;i++,color_prom++) { - palette_set_color(i,(color_prom[0] & 0x0f) << 4,(color_prom[0] & 0xf0) >> 0, - (color_prom[0x800] & 0x0f) << 4); + palette_set_color(Machine,i,pal4bit(color_prom[0] >> 0),pal4bit(color_prom[0] >> 4), + pal4bit(color_prom[0x800] >> 0)); } vb_spprombank=bank; } diff --git a/src/vidhrdw/vicdual.c b/src/vidhrdw/vicdual.c index b88979f18..d05766973 100644 --- a/src/vidhrdw/vicdual.c +++ b/src/vidhrdw/vicdual.c @@ -53,32 +53,11 @@ PALETTE_INIT( vicdual ) for (i = 0;i < Machine->drv->total_colors / 2;i++) { - int bit,r,g,b; - - - /* background red component */ - bit = (color_prom[i] >> 3) & 0x01; - r = 0xff * bit; - /* background green component */ - bit = (color_prom[i] >> 1) & 0x01; - g = 0xff * bit; - /* background blue component */ - bit = (color_prom[i] >> 2) & 0x01; - b = 0xff * bit; - - palette_set_color(2*i,r,g,b); - - /* foreground red component */ - bit = (color_prom[i] >> 7) & 0x01; - r = 0xff * bit; - /* foreground green component */ - bit = (color_prom[i] >> 5) & 0x01; - g = 0xff * bit; - /* foreground blue component */ - bit = (color_prom[i] >> 6) & 0x01; - b = 0xff * bit; - - palette_set_color(2*i+1,r,g,b); + /* background components */ + palette_set_color(machine,2*i,pal1bit(color_prom[i] >> 3),pal1bit(color_prom[i] >> 1),pal1bit(color_prom[i] >> 2)); + + /* foreground components */ + palette_set_color(machine,2*i+1,pal1bit(color_prom[i] >> 7),pal1bit(color_prom[i] >> 5),pal1bit(color_prom[i] >> 6)); } palette_bank = 0; diff --git a/src/vidhrdw/victory.c b/src/vidhrdw/victory.c index 08c972eae..6b51953cd 100644 --- a/src/vidhrdw/victory.c +++ b/src/vidhrdw/victory.c @@ -170,17 +170,7 @@ WRITE8_HANDLER( victory_charram_w ) WRITE8_HANDLER( victory_paletteram_w ) { - int red = ((offset & 0x80) >> 5) | ((data & 0xc0) >> 6); - int blue = (data & 0x38) >> 3; - int green = data & 0x07; - - /* shift up to 8 bits */ - red = (red << 5) | (red << 2) | (red >> 1); - green = (green << 5) | (green << 2) | (green >> 1); - blue = (blue << 5) | (blue << 2) | (blue >> 1); - - /* set the color */ - palette_set_color(offset & 0x3f, red, green, blue); + palette_set_color(Machine, offset & 0x3f, pal3bit(((offset & 0x80) >> 5) | ((data & 0xc0) >> 6)), pal3bit(data >> 0), pal3bit(data >> 3)); } diff --git a/src/vidhrdw/vigilant.c b/src/vidhrdw/vigilant.c index c81d00070..23a5499e4 100644 --- a/src/vidhrdw/vigilant.c +++ b/src/vidhrdw/vigilant.c @@ -40,7 +40,7 @@ static mame_bitmap *bg_bitmap; VIDEO_START( vigilant ) { - video_start_generic(); + video_start_generic(machine); if ((bg_bitmap = auto_bitmap_alloc(512*4,256)) == 0) return 1; @@ -114,7 +114,7 @@ WRITE8_HANDLER( vigilant_paletteram_w ) g = (paletteram[bank + offset + 0x100] << 3) & 0xFF; b = (paletteram[bank + offset + 0x200] << 3) & 0xFF; - palette_set_color((bank >> 2) + offset,r,g,b); + palette_set_color(Machine, (bank >> 2) + offset,r,g,b); } @@ -299,13 +299,13 @@ VIDEO_UPDATE( vigilant ) g = (paletteram[0x500 + 16 * rear_color + i] << 3) & 0xFF; b = (paletteram[0x600 + 16 * rear_color + i] << 3) & 0xFF; - palette_set_color(512 + i,r,g,b); + palette_set_color(machine,512 + i,r,g,b); r = (paletteram[0x400 + 16 * rear_color + 32 + i] << 3) & 0xFF; g = (paletteram[0x500 + 16 * rear_color + 32 + i] << 3) & 0xFF; b = (paletteram[0x600 + 16 * rear_color + 32 + i] << 3) & 0xFF; - palette_set_color(512 + 16 + i,r,g,b); + palette_set_color(machine,512 + 16 + i,r,g,b); } if (rear_disable) /* opaque foreground */ diff --git a/src/vidhrdw/vindictr.c b/src/vidhrdw/vindictr.c index ea3eb36a9..1592ea085 100644 --- a/src/vidhrdw/vindictr.c +++ b/src/vidhrdw/vindictr.c @@ -138,7 +138,7 @@ WRITE16_HANDLER( vindictr_paletteram_w ) int g = ((data >> 4) & 15) * i; int b = ((data >> 0) & 15) * i; - palette_set_color(offset + c*2048,r,g,b); + palette_set_color(Machine,offset + c*2048,r,g,b); } } diff --git a/src/vidhrdw/vsnes.c b/src/vidhrdw/vsnes.c index 79ee3c654..5292b068f 100644 --- a/src/vidhrdw/vsnes.c +++ b/src/vidhrdw/vsnes.c @@ -1,5 +1,5 @@ #include "driver.h" -#include "vidhrdw/ppu2c03b.h" +#include "vidhrdw/ppu2c0x.h" /* from machine */ extern int vsnes_gun_controller; @@ -7,13 +7,13 @@ extern int vsnes_gun_controller; PALETTE_INIT( vsnes ) { - ppu2c03b_init_palette( 0 ); + ppu2c0x_init_palette( 0 ); } PALETTE_INIT( vsdual ) { - ppu2c03b_init_palette( 0 ); - ppu2c03b_init_palette( 64 ); + ppu2c0x_init_palette( 0 ); + ppu2c0x_init_palette( 8*4*16 ); } static void ppu_irq( int num, int *ppu_regs ) @@ -22,8 +22,9 @@ static void ppu_irq( int num, int *ppu_regs ) } /* our ppu interface */ -static const ppu2c03b_interface ppu_interface = +static const ppu2c0x_interface ppu_interface = { + PPU_2C04, /* type */ 1, /* num */ { REGION_GFX1 }, /* vrom gfx region */ { 0 }, /* gfxlayout num */ @@ -33,8 +34,9 @@ static const ppu2c03b_interface ppu_interface = }; /* our ppu interface for dual games */ -static const ppu2c03b_interface ppu_dual_interface = +static const ppu2c0x_interface ppu_dual_interface = { + PPU_2C04, /* type */ 2, /* num */ { REGION_GFX1, REGION_GFX2 }, /* vrom gfx region */ { 0, 1 }, /* gfxlayout num */ @@ -45,13 +47,13 @@ static const ppu2c03b_interface ppu_dual_interface = VIDEO_START( vsnes ) { - ppu2c03b_init( &ppu_interface ); + ppu2c0x_init( &ppu_interface ); return 0; } VIDEO_START( vsdual ) { - ppu2c03b_init( &ppu_dual_interface ); + ppu2c0x_init( &ppu_dual_interface ); return 0; } @@ -63,7 +65,7 @@ VIDEO_START( vsdual ) VIDEO_UPDATE( vsnes ) { /* render the ppu */ - ppu2c03b_render( 0, bitmap, 0, 0, 0, 0 ); + ppu2c0x_render( 0, bitmap, 0, 0, 0, 0 ); /* if this is a gun game, draw a simple crosshair */ if ( vsnes_gun_controller ) @@ -82,6 +84,6 @@ VIDEO_UPDATE( vsnes ) VIDEO_UPDATE( vsdual ) { /* render the ppu's */ - ppu2c03b_render( screen, bitmap, 0, 0, 0, 0 ); + ppu2c0x_render( screen, bitmap, 0, 0, 0, 0 ); return 0; } diff --git a/src/vidhrdw/vulgus.c b/src/vidhrdw/vulgus.c index 1d6686724..8b5a95a4b 100644 --- a/src/vidhrdw/vulgus.c +++ b/src/vidhrdw/vulgus.c @@ -49,7 +49,7 @@ PALETTE_INIT( vulgus ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/warpwarp.c b/src/vidhrdw/warpwarp.c index 3fd6e2de4..ec2653045 100644 --- a/src/vidhrdw/warpwarp.c +++ b/src/vidhrdw/warpwarp.c @@ -46,7 +46,7 @@ PALETTE_INIT( geebee ) { int i; for (i = 0; i < sizeof(geebee_palette)/3; i++) - palette_set_color(i,geebee_palette[i*3+0],geebee_palette[i*3+1],geebee_palette[i*3+2]); + palette_set_color(machine,i,geebee_palette[i*3+0],geebee_palette[i*3+1],geebee_palette[i*3+2]); memcpy(colortable, geebee_colortable, sizeof (geebee_colortable)); } @@ -55,7 +55,7 @@ PALETTE_INIT( navarone ) { int i; for (i = 0; i < sizeof(geebee_palette)/3; i++) - palette_set_color(i,geebee_palette[i*3+0],geebee_palette[i*3+1],geebee_palette[i*3+2]); + palette_set_color(machine,i,geebee_palette[i*3+0],geebee_palette[i*3+1],geebee_palette[i*3+2]); memcpy(colortable, navarone_colortable, sizeof (navarone_colortable)); } @@ -106,7 +106,7 @@ PALETTE_INIT( warpwarp ) bit2 = (i >> 7) & 0x01; b = 0x1f * bit0 + 0x3c * bit1 + 0xa4 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } for (i = 0;i < Machine->drv->color_table_len;i += 2) diff --git a/src/vidhrdw/warriorb.c b/src/vidhrdw/warriorb.c index 7eeaebf00..167b12763 100644 --- a/src/vidhrdw/warriorb.c +++ b/src/vidhrdw/warriorb.c @@ -130,7 +130,7 @@ VIDEO_UPDATE( warriorb ) nodraw = TC0100SCN_tilemap_draw(bitmap,cliprect,screen,layer[0],TILEMAP_IGNORE_TRANSPARENCY,0); /* left */ /* Ensure screen blanked even when bottom layers not drawn due to disable bit */ - if(nodraw) fillbitmap(bitmap, get_black_pen(), cliprect); + if(nodraw) fillbitmap(bitmap, get_black_pen(machine), cliprect); // draw middle layer TC0100SCN_tilemap_draw(bitmap,cliprect,screen,layer[1],0,1); diff --git a/src/vidhrdw/wecleman.c b/src/vidhrdw/wecleman.c index cfaa46b23..c7e979b6a 100644 --- a/src/vidhrdw/wecleman.c +++ b/src/vidhrdw/wecleman.c @@ -847,32 +847,22 @@ WRITE16_HANDLER( hotchase_paletteram16_SBGRBBBBGGGGRRRR_word_w ) newword = COMBINE_DATA(&paletteram16[offset]); - r = ( (((newword << 1) & 0x1E ) | ((newword >> 12) & 0x01)) * 0xff ) / 0x1f; - g = ( (((newword >> 3) & 0x1E ) | ((newword >> 13) & 0x01)) * 0xff ) / 0x1f; - b = ( (((newword >> 7) & 0x1E ) | ((newword >> 14) & 0x01)) * 0xff ) / 0x1f; + r = ((newword << 1) & 0x1E ) | ((newword >> 12) & 0x01); + g = ((newword >> 3) & 0x1E ) | ((newword >> 13) & 0x01); + b = ((newword >> 7) & 0x1E ) | ((newword >> 14) & 0x01); - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal5bit(r), pal5bit(g), pal5bit(b)); r>>=1; g>>=1; b>>=1; - palette_set_color(offset+0x800, r, g, b); + palette_set_color(Machine, offset+0x800, pal5bit(r)/2, pal5bit(g)/2, pal5bit(b)/2); } WRITE16_HANDLER( wecleman_paletteram16_SSSSBBBBGGGGRRRR_word_w ) { - int newword, r, g, b, r0, g0, b0; - - newword = COMBINE_DATA(&paletteram16[offset]); + int newword = COMBINE_DATA(&paletteram16[offset]); // the highest nibble has some unknown functions // if (newword & 0xf000) logerror("MSN set on color %03x: %1x\n", offset, newword>>12); - - r0 = newword; g0 = newword; b0 = newword; - g0 >>=4; b0 >>=8; - r0 &= 0xf; g0 &= 0xf; b0 &= 0xf; - r = r0; g = g0; b = b0; - r0 <<=4; g0 <<= 4; b0 <<= 4; - r |= r0; g |= g0; b |= b0; - - palette_set_color(offset, r, g, b); + palette_set_color(Machine, offset, pal4bit(newword >> 0), pal4bit(newword >> 4), pal4bit(newword >> 8)); } @@ -1072,7 +1062,7 @@ VIDEO_UPDATE ( wecleman ) get_sprite_info(); - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); /* Draw the road (lines which have priority 0x02) */ if (video_on) wecleman_draw_road(bitmap, cliprect, 0x02); @@ -1131,7 +1121,7 @@ VIDEO_UPDATE( hotchase ) get_sprite_info(); - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(machine), cliprect); /* Draw the background */ if (video_on) K051316_zoom_draw_0(bitmap,cliprect, 0, 0); diff --git a/src/vidhrdw/williams.c b/src/vidhrdw/williams.c index 16b8e60db..cef528192 100644 --- a/src/vidhrdw/williams.c +++ b/src/vidhrdw/williams.c @@ -372,7 +372,7 @@ WRITE8_HANDLER( williams_paletteram_w ) { rgb_t color = palette_lookup[data]; paletteram[offset] = data; - palette_set_color(offset, RGB_RED(color), RGB_GREEN(color), RGB_BLUE(color)); + palette_set_color(Machine, offset, RGB_RED(color), RGB_GREEN(color), RGB_BLUE(color)); } @@ -403,7 +403,7 @@ WRITE8_HANDLER( williams2_paletteram_w ) b = ((entry_hi >> 0) & 15) * i; g = ((entry_lo >> 4) & 15) * i; r = ((entry_lo >> 0) & 15) * i; - palette_set_color(offset / 2, r, g, b); + palette_set_color(Machine, offset / 2, r, g, b); } @@ -559,7 +559,7 @@ WRITE8_HANDLER( blaster_palette_0_w ) video_screen_update_partial(0, cpu_getscanline()); blaster_palette_0[offset] = data; - palette_set_color(16 + offset, RGB_RED(color), RGB_GREEN(color), RGB_BLUE(color)); + palette_set_color(Machine, 16 + offset, RGB_RED(color), RGB_GREEN(color), RGB_BLUE(color)); } diff --git a/src/vidhrdw/wiping.c b/src/vidhrdw/wiping.c index 010a4f4cf..f01584d52 100644 --- a/src/vidhrdw/wiping.c +++ b/src/vidhrdw/wiping.c @@ -45,7 +45,7 @@ PALETTE_INIT( wiping ) bit1 = (*color_prom >> 7) & 0x01; b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/wiz.c b/src/vidhrdw/wiz.c index 6ae526147..f0fe76be0 100644 --- a/src/vidhrdw/wiz.c +++ b/src/vidhrdw/wiz.c @@ -37,7 +37,7 @@ static int palette_bank; VIDEO_START( wiz ) { - if (video_start_generic()) + if (video_start_generic(machine)) return 1; state_save_register_global_array(char_bank); @@ -88,7 +88,7 @@ PALETTE_INIT( wiz ) bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x42 * bit2 + 0x90 * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/wolfpack.c b/src/vidhrdw/wolfpack.c index b79d10818..6cf52165a 100644 --- a/src/vidhrdw/wolfpack.c +++ b/src/vidhrdw/wolfpack.c @@ -41,12 +41,12 @@ WRITE8_HANDLER( wolfpack_ship_size_w ) if (data & 0x40) color += 0x3A; if (data & 0x80) color += 0x48; - palette_set_color(3, + palette_set_color(Machine,3, color, color, color); - palette_set_color(7, + palette_set_color(Machine,7, color < 0xb8 ? color + 0x48 : 0xff, color < 0xb8 ? color + 0x48 : 0xff, color < 0xb8 ? color + 0x48 : 0xff); diff --git a/src/vidhrdw/wwfwfest.c b/src/vidhrdw/wwfwfest.c index 221a7706f..8b1bb564b 100644 --- a/src/vidhrdw/wwfwfest.c +++ b/src/vidhrdw/wwfwfest.c @@ -249,7 +249,7 @@ VIDEO_START( wwfwfest ) VIDEO_START( wwfwfstb ) { - if(video_start_wwfwfest()) + if(video_start_wwfwfest(machine)) return 1; sprite_xoff = 2; diff --git a/src/vidhrdw/xevious.c b/src/vidhrdw/xevious.c index 3f3991ea0..1a895abd2 100644 --- a/src/vidhrdw/xevious.c +++ b/src/vidhrdw/xevious.c @@ -63,12 +63,12 @@ PALETTE_INIT( xevious ) bit3 = (color_prom[2*256] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } /* color 0x80 is used by sprites to mark transparency */ - palette_set_color(0x80,0,0,0); + palette_set_color(machine,0x80,0,0,0); color_prom += 128; /* the bottom part of the PROM is unused */ color_prom += 2*256; @@ -136,12 +136,12 @@ PALETTE_INIT( battles ) bit3 = (color_prom[2*256] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } /* color 0x80 is used by sprites to mark transparency */ - palette_set_color(0x80,0,0,0); + palette_set_color(machine,0x80,0,0,0); color_prom += 128; /* the bottom part of the PROM is unused */ color_prom += 2*256; diff --git a/src/vidhrdw/xorworld.c b/src/vidhrdw/xorworld.c index 3e1825ac2..7066c07d9 100644 --- a/src/vidhrdw/xorworld.c +++ b/src/vidhrdw/xorworld.c @@ -44,7 +44,7 @@ PALETTE_INIT( xorworld ) bit2 = (color_prom[2*Machine->drv->total_colors] >> 2) & 0x01; bit3 = (color_prom[2*Machine->drv->total_colors] >> 3) & 0x01; b = 0x0e*bit0 + 0x1e * bit1 + 0x44*bit2 + 0x8f*bit3; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } diff --git a/src/vidhrdw/xyonix.c b/src/vidhrdw/xyonix.c index 3cd2ede86..350f4c222 100644 --- a/src/vidhrdw/xyonix.c +++ b/src/vidhrdw/xyonix.c @@ -30,7 +30,7 @@ PALETTE_INIT( xyonix ) bit1 = (color_prom[i] >> 4) & 0x01; b = 0x4f * bit0 + 0xa8 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } } diff --git a/src/vidhrdw/yard.c b/src/vidhrdw/yard.c index 6a13f91d3..5cb6298e7 100644 --- a/src/vidhrdw/yard.c +++ b/src/vidhrdw/yard.c @@ -85,7 +85,7 @@ PALETTE_INIT( yard ) bit2 = (color_prom[0] >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } @@ -114,7 +114,7 @@ PALETTE_INIT( yard ) bit2 = (*color_prom >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+256,r,g,b); + palette_set_color(machine,i+256,r,g,b); color_prom++; } @@ -149,7 +149,7 @@ PALETTE_INIT( yard ) bit2 = (color_prom[0] >> 2) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i+256+16,r,g,b); + palette_set_color(machine,i+256+16,r,g,b); color_prom++; } diff --git a/src/vidhrdw/ygv608.c b/src/vidhrdw/ygv608.c index a4ecf0c98..9b45b5094 100644 --- a/src/vidhrdw/ygv608.c +++ b/src/vidhrdw/ygv608.c @@ -1225,10 +1225,10 @@ WRITE16_HANDLER( ygv608_w ) if (++p3_state == 3) { p3_state = 0; - palette_set_color(ygv608.regs.s.cc, - ygv608.colour_palette[ygv608.regs.s.cc][0] << 2, - ygv608.colour_palette[ygv608.regs.s.cc][1] << 2, - ygv608.colour_palette[ygv608.regs.s.cc][2] << 2 ); + palette_set_color(Machine,ygv608.regs.s.cc, + pal6bit(ygv608.colour_palette[ygv608.regs.s.cc][0]), + pal6bit(ygv608.colour_palette[ygv608.regs.s.cc][1]), + pal6bit(ygv608.colour_palette[ygv608.regs.s.cc][2]) ); if (ygv608.regs.s.r2 & r2_cpaw) ygv608.regs.s.cc++; } diff --git a/src/vidhrdw/yiear.c b/src/vidhrdw/yiear.c index c4dea4632..06bc62805 100644 --- a/src/vidhrdw/yiear.c +++ b/src/vidhrdw/yiear.c @@ -56,7 +56,7 @@ PALETTE_INIT( yiear ) bit2 = (*color_prom >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } } diff --git a/src/vidhrdw/yunsung8.c b/src/vidhrdw/yunsung8.c index c55d266b6..3399b5c37 100644 --- a/src/vidhrdw/yunsung8.c +++ b/src/vidhrdw/yunsung8.c @@ -73,7 +73,7 @@ WRITE8_HANDLER( yunsung8_videoram_w ) { int bank = yunsung8_videobank & 2; unsigned char *RAM; - int r,g,b,color; + int color; if (bank) RAM = yunsung8_videoram_0; else RAM = yunsung8_videoram_1; @@ -82,11 +82,7 @@ WRITE8_HANDLER( yunsung8_videoram_w ) color = RAM[offset & ~1] | (RAM[offset | 1] << 8); /* BBBBBGGGGGRRRRRx */ - r = (color >> 0) & 0x1f; - g = (color >> 5) & 0x1f; - b = (color >> 10) & 0x1f; - - palette_set_color(offset/2 + (bank ? 0x400:0), (r << 3)|(r >> 2), (g << 3)|(g >> 2), (b << 3)|(b >> 2)); + palette_set_color(Machine, offset/2 + (bank ? 0x400:0), pal5bit(color >> 0), pal5bit(color >> 5), pal5bit(color >> 10)); } else { diff --git a/src/vidhrdw/zaccaria.c b/src/vidhrdw/zaccaria.c index e0c6bd6b2..9233d7e76 100644 --- a/src/vidhrdw/zaccaria.c +++ b/src/vidhrdw/zaccaria.c @@ -71,7 +71,7 @@ PALETTE_INIT( zaccaria ) */ if (((i % 64) / 8) == 0) { - palette_set_color(i,0,0,0); + palette_set_color(machine,i,0,0,0); } else { @@ -89,7 +89,7 @@ PALETTE_INIT( zaccaria ) bit0 = (color_prom[Machine->drv->total_colors] >> 1) & 0x01; bit1 = (color_prom[Machine->drv->total_colors] >> 0) & 0x01; b = 0x66 * bit0 + 0x96 * bit1; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); } color_prom++; diff --git a/src/vidhrdw/zaxxon.c b/src/vidhrdw/zaxxon.c index c9cde3a7a..364a1cd5c 100644 --- a/src/vidhrdw/zaxxon.c +++ b/src/vidhrdw/zaxxon.c @@ -65,7 +65,7 @@ PALETTE_INIT( zaxxon ) bit1 = (color_prom[i] >> 7) & 0x01; b = combine_2_weights(bweights, bit0, bit1); - palette_set_color(i, r, g, b); + palette_set_color(machine, i, r, g, b); } /* color_prom now points to the beginning of the character color codes */ @@ -367,7 +367,7 @@ static void zaxxon_draw_background(mame_bitmap *bitmap, const rectangle *cliprec /* if not enabled, fill the background with black */ else - fillbitmap(bitmap, get_black_pen(), cliprect); + fillbitmap(bitmap, get_black_pen(Machine), cliprect); } diff --git a/src/vidhrdw/zodiack.c b/src/vidhrdw/zodiack.c index 1aeb4c043..5f5fb5867 100644 --- a/src/vidhrdw/zodiack.c +++ b/src/vidhrdw/zodiack.c @@ -96,14 +96,14 @@ PALETTE_INIT( zodiack ) b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - palette_set_color(i,r,g,b); + palette_set_color(machine,i,r,g,b); color_prom++; } /* white for bullets */ - palette_set_color(Machine->drv->total_colors-1,0xff,0xff,0xff); + palette_set_color(machine,machine->drv->total_colors-1,0xff,0xff,0xff); for (i = 0;i < TOTAL_COLORS(0);i+=2) { diff --git a/src/windows/blit.c b/src/windows/blit.c index 11350a6d2..dc33e5272 100644 --- a/src/windows/blit.c +++ b/src/windows/blit.c @@ -110,7 +110,7 @@ static void generate_blitter(const win_blit_params *blit); // win_blit_exit //============================================================ -static void win_blit_exit(void) +static void win_blit_exit(running_machine *machine) { drc_exit(drc); } @@ -121,7 +121,7 @@ static void win_blit_exit(void) // win_blit_init //============================================================ -void win_blit_init(void) +void win_blit_init(running_machine *machine) { drc_config drconfig; UINT32 features; diff --git a/src/windows/config.c b/src/windows/config.c index 657849f00..96aa189bb 100644 --- a/src/windows/config.c +++ b/src/windows/config.c @@ -25,11 +25,8 @@ #include "video.h" #include "render.h" #include "rendutil.h" - -#ifdef NEW_DEBUGGER #include "debug/debugcpu.h" #include "debug/debugcon.h" -#endif @@ -194,6 +191,7 @@ static const options_entry windows_opts[] = { "sleep", "1", OPTION_BOOLEAN, "enable sleeping, which gives time back to other applications when idle" }, { "rdtsc", "0", OPTION_BOOLEAN, "use the RDTSC instruction for timing; faster but may result in uneven performance" }, { "priority", "0", 0, "thread priority for the main game thread; range from -15 to 1" }, + { "multithreading;mt", "0", OPTION_BOOLEAN, "enable multithreading; this enables rendering and blitting on a separate thread" }, // video options { NULL, NULL, OPTION_HEADER, "VIDEO OPTIONS" }, @@ -604,8 +602,8 @@ static void execute_commands(const char *argv0) int result; init_resource_tracking(); - cpuintrf_init(); - sndintrf_init(); + cpuintrf_init(NULL); + sndintrf_init(NULL); result = (*frontend_options[i].function)(stdout); exit_resource_tracking(); exit(result); @@ -680,7 +678,7 @@ static void extract_options(const game_driver *driver, machine_config *drv) options.vector_flicker = options_get_float("flicker", TRUE); // sound options - options.samplerate = options_get_bool("sound", TRUE) ? options_get_int("samplerate", TRUE) : 0; + options.samplerate = options_get_bool("sound", TRUE) ? options_get_int_range("samplerate", TRUE, 1000, 1000000) : 0; options.use_samples = options_get_bool("samples", TRUE); attenuation = options_get_int("volume", TRUE); audio_latency = options_get_int("audio_latency", TRUE); @@ -718,12 +716,10 @@ static void extract_options(const game_driver *driver, machine_config *drv) } #ifdef MAME_DEBUG options.mame_debug = options_get_bool("debug", TRUE); -#ifdef NEW_DEBUGGER stemp = options_get_string("debugscript", TRUE); if (stemp != NULL) debug_source_script(stemp); #endif -#endif { extern const char *cheatfile; diff --git a/src/windows/debugwin.c b/src/windows/debugwin.c index d1cfb72d7..5d0617505 100644 --- a/src/windows/debugwin.c +++ b/src/windows/debugwin.c @@ -17,12 +17,9 @@ // MAME headers #include "driver.h" - -#ifdef NEW_DEBUGGER #include "debug/debugvw.h" #include "debug/debugcon.h" #include "debug/debugcpu.h" -#endif // MAMEOS headers #include "debugwin.h" @@ -93,7 +90,9 @@ enum ID_SHOW_RAW, ID_SHOW_ENCRYPTED, - ID_SHOW_COMMENTS + ID_SHOW_COMMENTS, + ID_RUN_TO_CURSOR, + ID_TOGGLE_BREAKPOINT }; @@ -903,6 +902,7 @@ static void debug_view_draw_contents(debugview_info *view, HDC windc) if (viewdata[col].attrib & DCA_ANCILLARY) bgcolor = RGB(0xe0,0xe0,0xe0); if (viewdata[col].attrib & DCA_SELECTED) bgcolor = RGB(0xff,0x80,0x80); if (viewdata[col].attrib & DCA_CURRENT) bgcolor = RGB(0xff,0xff,0x00); + if ((viewdata[col].attrib & DCA_SELECTED) && (viewdata[col].attrib & DCA_CURRENT)) bgcolor = RGB(0xff,0xc0,0x80); if (viewdata[col].attrib & DCA_CHANGED) fgcolor = RGB(0xff,0x00,0x00); if (viewdata[col].attrib & DCA_INVALID) fgcolor = RGB(0x00,0x00,0xff); if (viewdata[col].attrib & DCA_DISABLED) fgcolor = RGB((GetRValue(fgcolor) + GetRValue(bgcolor)) / 2, (GetGValue(fgcolor) + GetGValue(bgcolor)) / 2, (GetBValue(fgcolor) + GetBValue(bgcolor)) / 2); @@ -1267,6 +1267,7 @@ static void debug_view_next_view(debugwin_info *info, debugview_info *curview) else if (curindex >= 0 && info->view[curindex].wnd != NULL && debug_view_get_property_UINT32(info->view[curindex].view, DVP_SUPPORTS_CURSOR)) { SetFocus(info->view[curindex].wnd); + InvalidateRect(info->view[curindex].wnd, NULL, FALSE); break; } } @@ -1316,23 +1317,60 @@ static LRESULT CALLBACK debug_view_proc(HWND wnd, UINT message, WPARAM wparam, L debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_UP); info->owner->ignore_char_lparam = lparam >> 16; break; + case VK_DOWN: debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_DOWN); info->owner->ignore_char_lparam = lparam >> 16; break; + case VK_LEFT: - debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_LEFT); + if (GetAsyncKeyState(VK_CONTROL) & 0x8000) + debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_CTRLLEFT); + else + debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_LEFT); info->owner->ignore_char_lparam = lparam >> 16; break; + case VK_RIGHT: - debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_RIGHT); + if (GetAsyncKeyState(VK_CONTROL) & 0x8000) + debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_CTRLRIGHT); + else + debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_RIGHT); info->owner->ignore_char_lparam = lparam >> 16; break; + + case VK_PRIOR: + debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_PUP); + info->owner->ignore_char_lparam = lparam >> 16; + break; + + case VK_NEXT: + debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_PDOWN); + info->owner->ignore_char_lparam = lparam >> 16; + break; + + case VK_HOME: + if (GetAsyncKeyState(VK_CONTROL) & 0x8000) + debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_CTRLHOME); + else + debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_HOME); + info->owner->ignore_char_lparam = lparam >> 16; + break; + + case VK_END: + if (GetAsyncKeyState(VK_CONTROL) & 0x8000) + debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_CTRLEND); + else + debug_view_set_property_UINT32(info->view, DVP_CHARACTER, DCH_END); + info->owner->ignore_char_lparam = lparam >> 16; + break; + case VK_ESCAPE: if (info->owner->focuswnd != NULL) SetFocus(info->owner->focuswnd); info->owner->ignore_char_lparam = lparam >> 16; break; + case VK_TAB: if (GetAsyncKeyState(VK_SHIFT) & 0x8000) debug_view_prev_view(info->owner, info); @@ -1683,11 +1721,11 @@ static void memory_determine_combo_items(void) for (rgnnum = 0; rgnnum < MAX_MEMORY_REGIONS; rgnnum++) { UINT8 *base = memory_region(rgnnum); - UINT32 type = memory_region_type(rgnnum); + UINT32 type = memory_region_type(Machine, rgnnum); if (base != NULL && type > REGION_INVALID && (type - REGION_INVALID) < ARRAY_LENGTH(memory_region_names)) { memorycombo_item *ci = malloc_or_die(sizeof(*ci)); - UINT32 flags = memory_region_flags(rgnnum); + UINT32 flags = memory_region_flags(Machine, rgnnum); UINT8 width, little_endian; memset(ci, 0, sizeof(*ci)); ci->base = base; @@ -2075,6 +2113,9 @@ static void disasm_create_window(void) // create the options menu optionsmenu = CreatePopupMenu(); + AppendMenu(optionsmenu, MF_ENABLED, ID_TOGGLE_BREAKPOINT, "Set breakpoint at cursor\tF9"); + AppendMenu(optionsmenu, MF_ENABLED, ID_RUN_TO_CURSOR, "Run to cursor\tF4"); + AppendMenu(optionsmenu, MF_DISABLED | MF_SEPARATOR, 0, ""); AppendMenu(optionsmenu, MF_ENABLED, ID_SHOW_RAW, "Raw opcodes\tCtrl+R"); AppendMenu(optionsmenu, MF_ENABLED, ID_SHOW_ENCRYPTED, "Encrypted opcodes\tCtrl+E"); AppendMenu(optionsmenu, MF_ENABLED, ID_SHOW_COMMENTS, "Comments\tCtrl+C"); @@ -2239,6 +2280,9 @@ static void disasm_update_checkmarks(debugwin_info *info) static int disasm_handle_command(debugwin_info *info, WPARAM wparam, LPARAM lparam) { + char command[64]; + UINT32 active_address = 0x00; + switch (HIWORD(wparam)) { // combo box selection changed @@ -2297,6 +2341,49 @@ static int disasm_handle_command(debugwin_info *info, WPARAM wparam, LPARAM lpar disasm_update_checkmarks(info); (*info->recompute_children)(info); return 1; + + case ID_RUN_TO_CURSOR: + if (debug_view_get_property_UINT32(info->view[0].view, DVP_CURSOR_VISIBLE)) + { + active_address = debug_view_get_property_UINT32(info->view[0].view, DVP_DASM_ACTIVE_ADDRESS); + sprintf(command, "go %X", active_address); + debug_console_execute_command(command, 1); + } + return 1; + + case ID_TOGGLE_BREAKPOINT: + if (debug_view_get_property_UINT32(info->view[0].view, DVP_CURSOR_VISIBLE)) + { + UINT32 cpu_num = 0; + debug_cpu_info *cpuinfo ; + debug_cpu_breakpoint *bp; + INT8 bp_exists = 0; + UINT32 bp_num = 0; + + /* what address are we dealing with? */ + active_address = debug_view_get_property_UINT32(info->view[0].view, DVP_DASM_ACTIVE_ADDRESS); + + /* is there already a breakpoint there? */ + cpu_num = debug_view_get_property_UINT32(info->view[0].view, DVP_DASM_CPUNUM); + cpuinfo = (debug_cpu_info*)debug_get_cpu_info(cpu_num); + + for (bp = cpuinfo->first_bp; bp; bp = bp->next) + { + if (BYTE2ADDR(active_address, cpuinfo, ADDRESS_SPACE_PROGRAM) == bp->address) + { + bp_exists = 1; + bp_num = bp->index; + } + } + + /* Toggle */ + if (!bp_exists) + sprintf(command, "bpset %X", BYTE2ADDR(active_address, cpuinfo, ADDRESS_SPACE_PROGRAM)); + else + sprintf(command, "bpclear %X", bp_num); + debug_console_execute_command(command, 1); + } + return 1; } break; } @@ -2328,6 +2415,27 @@ static int disasm_handle_key(debugwin_info *info, WPARAM wparam, LPARAM lparam) return 1; } } + + switch (wparam) + { + /* ajg - steals the F4 from the global key handler - but ALT+F4 didn't work anyways ;) */ + case VK_F4: + SendMessage(info->wnd, WM_COMMAND, ID_RUN_TO_CURSOR, 0); + return 1; + + case VK_F9: + SendMessage(info->wnd, WM_COMMAND, ID_TOGGLE_BREAKPOINT, 0); + return 1; + + case VK_RETURN: + if (debug_view_get_property_UINT32(info->view[0].view, DVP_CURSOR_VISIBLE)) + { + SendMessage(info->wnd, WM_COMMAND, ID_STEP, 0); + return 1; + } + break; + } + return global_handle_key(info, wparam, lparam); } @@ -2382,6 +2490,9 @@ void console_create_window(void) // create the options menu optionsmenu = CreatePopupMenu(); + AppendMenu(optionsmenu, MF_ENABLED, ID_TOGGLE_BREAKPOINT, "Set breakpoint at cursor\tF9"); + AppendMenu(optionsmenu, MF_ENABLED, ID_RUN_TO_CURSOR, "Run to cursor\tF4"); + AppendMenu(optionsmenu, MF_DISABLED | MF_SEPARATOR, 0, ""); AppendMenu(optionsmenu, MF_ENABLED, ID_SHOW_RAW, "Raw opcodes\tCtrl+R"); AppendMenu(optionsmenu, MF_ENABLED, ID_SHOW_ENCRYPTED, "Encrypted opcodes\tCtrl+E"); AppendMenu(optionsmenu, MF_ENABLED, ID_SHOW_COMMENTS, "Comments\tCtrl+C"); @@ -2672,16 +2783,16 @@ static int global_handle_command(debugwin_info *info, WPARAM wparam, LPARAM lpar return 1; case ID_HARD_RESET: - mame_schedule_hard_reset(); + mame_schedule_hard_reset(Machine); return 1; case ID_SOFT_RESET: - mame_schedule_soft_reset(); + mame_schedule_soft_reset(Machine); debug_cpu_go(~0); return 1; case ID_EXIT: - mame_schedule_exit(); + mame_schedule_exit(Machine); return 1; } @@ -2715,6 +2826,7 @@ static int global_handle_key(debugwin_info *info, WPARAM wparam, LPARAM lparam) case VK_F4: if (GetAsyncKeyState(VK_MENU) & 0x8000) { + /* ajg - never gets here since 'alt' seems to be captured somewhere else - menu maybe? */ SendMessage(info->wnd, WM_COMMAND, ID_EXIT, 0); return 1; } diff --git a/src/windows/input.c b/src/windows/input.c index 61cd1525b..4370365fd 100644 --- a/src/windows/input.c +++ b/src/windows/input.c @@ -225,7 +225,7 @@ static void extract_input_config(void); // PROTOTYPES //============================================================ -static void wininput_exit(void); +static void wininput_exit(running_machine *machine); static void updatekeyboard(void); static void update_joystick_axes(void); static void init_keycodes(void); @@ -947,13 +947,13 @@ static BOOL CALLBACK enum_joystick_callback(LPCDIDEVICEINSTANCE instance, LPVOID // wininput_init //============================================================ -int wininput_init(void) +int wininput_init(running_machine *machine) { const input_port_entry *inp; HRESULT result; - add_pause_callback(win_pause_input); - add_exit_callback(wininput_exit); + add_pause_callback(machine, win_pause_input); + add_exit_callback(machine, wininput_exit); // allocate a lock raw_mouse_lock = osd_lock_alloc(); @@ -1066,7 +1066,7 @@ int wininput_init(void) // wininput_exit //============================================================ -static void wininput_exit(void) +static void wininput_exit(running_machine *machine) { int i; @@ -1129,7 +1129,7 @@ static void wininput_exit(void) // win_pause_input //============================================================ -void win_pause_input(int paused) +void win_pause_input(running_machine *machine, int paused) { int i; @@ -1248,12 +1248,6 @@ void wininput_poll(void) // update the lagged keyboard updatekeyboard(); -#ifndef NEW_DEBUGGER - // if the debugger is up and visible, don't bother with the rest - if (win_debug_window != NULL && IsWindowVisible(win_debug_window)) - return; -#endif - // poll all joysticks for (i = 0; i < joystick_count; i++) { @@ -1504,7 +1498,7 @@ static int is_key_pressed(os_code keycode) return result; } -#if defined(MAME_DEBUG) && defined(NEW_DEBUGGER) +#ifdef MAME_DEBUG // if the debugger is visible and we don't have focus, the key is not pressed if (debugwin_is_debugger_visible() && GetFocus() != win_window_list->hwnd) return 0; @@ -1976,7 +1970,7 @@ static INT32 get_joycode_value(os_code joycode) if (!mouse_active && win_use_mouse && !win_has_menu(win_window_list)) { mouse_active = 1; - win_pause_input(0); + win_pause_input(Machine, 0); } if (win_use_raw_mouse && (raw_mouse_device[joynum].flags != MOUSE_MOVE_RELATIVE)) @@ -2073,7 +2067,7 @@ static void poll_lightguns(void) if (!mouse_active && (win_use_mouse || use_lightgun) && !win_has_menu(win_window_list)) { mouse_active = 1; - win_pause_input(0); + win_pause_input(Machine, 0); } // if out of range, skip it diff --git a/src/windows/input.h b/src/windows/input.h index f3cc56da3..21f38f5f2 100644 --- a/src/windows/input.h +++ b/src/windows/input.h @@ -32,7 +32,9 @@ extern const int win_key_trans_table[][4]; extern int win_use_mouse; -void win_pause_input(int pause); +int wininput_init(running_machine *machine); + +void win_pause_input(running_machine *machine, int pause); void wininput_poll(void); BOOL win_raw_mouse_update(HANDLE in_device_handle); diff --git a/src/windows/ledutil.c b/src/windows/ledutil.c index cc4c5d9e0..82de312d3 100644 --- a/src/windows/ledutil.c +++ b/src/windows/ledutil.c @@ -44,6 +44,7 @@ #include // MAME output header file +typedef void running_machine; #include "output.h" diff --git a/src/windows/output.c b/src/windows/output.c index a18397494..4d7d16a46 100644 --- a/src/windows/output.c +++ b/src/windows/output.c @@ -68,7 +68,7 @@ static UINT om_mame_get_id_string; // FUNCTION PROTOTYPES //============================================================ -static void winoutput_exit(void); +static void winoutput_exit(running_machine *machine); static int create_window_class(void); static LRESULT CALLBACK output_window_proc(HWND wnd, UINT message, WPARAM wparam, LPARAM lparam); static LRESULT register_client(HWND hwnd, LPARAM id); @@ -82,12 +82,12 @@ static void notifier_callback(const char *outname, INT32 value, void *param); // winoutput_init //============================================================ -void winoutput_init(void) +void winoutput_init(running_machine *machine) { int result; // ensure we get cleaned up - add_exit_callback(winoutput_exit); + add_exit_callback(machine, winoutput_exit); // reset globals clientlist = NULL; @@ -137,7 +137,7 @@ void winoutput_init(void) // winoutput_exit //============================================================ -static void winoutput_exit(void) +static void winoutput_exit(running_machine *machine) { // free all the clients while (clientlist != NULL) diff --git a/src/windows/output.h b/src/windows/output.h index 870c5d5ab..9c5e082fb 100644 --- a/src/windows/output.h +++ b/src/windows/output.h @@ -91,7 +91,7 @@ struct _copydata_id_string // FUNCTION PROTOTYPES //============================================================ -void winoutput_init(void); +void winoutput_init(running_machine *machine); #endif /* __WINDOWS_OUTPUT_H__ */ diff --git a/src/windows/sound.c b/src/windows/sound.c index 973d65f53..ff835ea49 100644 --- a/src/windows/sound.c +++ b/src/windows/sound.c @@ -628,7 +628,7 @@ static int dsound_create_buffers(void) IDirectSoundBuffer_Release(primary_buffer); cant_create_primary: primary_buffer = NULL; - return 0; + return 1; } diff --git a/src/windows/video.c b/src/windows/video.c index 045c01565..092775665 100644 --- a/src/windows/video.c +++ b/src/windows/video.c @@ -38,10 +38,7 @@ #include "window.h" #include "input.h" #include "options.h" - -#ifdef NEW_DEBUGGER #include "debugwin.h" -#endif #ifdef MESS #include "menu.h" @@ -136,7 +133,7 @@ static const int waittable[FRAMESKIP_LEVELS][FRAMESKIP_LEVELS] = // PROTOTYPES //============================================================ -static void video_exit(void); +static void video_exit(running_machine *machine); static void init_monitors(void); static BOOL CALLBACK monitor_enum_callback(HMONITOR handle, HDC dc, LPRECT rect, LPARAM data); static win_monitor_info *pick_monitor(int index); @@ -171,7 +168,7 @@ INLINE int effective_frameskip(void) INLINE int effective_throttle(void) { - return !video_config.fastforward && (video_config.throttle || mame_is_paused() || ui_is_menu_active() || ui_is_slider_active()); + return !video_config.fastforward && (video_config.throttle || mame_is_paused(Machine) || ui_is_menu_active() || ui_is_slider_active()); } @@ -180,13 +177,13 @@ INLINE int effective_throttle(void) // winvideo_init //============================================================ -int winvideo_init(void) +int winvideo_init(running_machine *machine) { const char *stemp; int index; // ensure we get called on the way out - add_exit_callback(video_exit); + add_exit_callback(machine, video_exit); // extract data from the options extract_video_config(); @@ -195,14 +192,15 @@ int winvideo_init(void) init_monitors(); // initialize the window system so we can make windows - if (winwindow_init()) + if (winwindow_init(machine)) goto error; // create the windows for (index = 0; index < video_config.numscreens; index++) if (winwindow_video_window_create(index, pick_monitor(index), &video_config.window[index])) goto error; - SetForegroundWindow(win_window_list->hwnd); + if (video_config.mode != VIDEO_MODE_NONE) + SetForegroundWindow(win_window_list->hwnd); // possibly create the debug window, but don't show it yet #ifdef MAME_DEBUG @@ -231,7 +229,7 @@ int winvideo_init(void) // video_exit //============================================================ -static void video_exit(void) +static void video_exit(running_machine *machine) { // free the overlay effect if (effect_bitmap != NULL) @@ -398,7 +396,7 @@ const char *osd_get_fps_text(const performance_info *performance) char *dest = buffer; // if we're paused, display less info - if (mame_is_paused()) + if (mame_is_paused(Machine)) dest += sprintf(dest, "Paused"); else { @@ -546,7 +544,7 @@ static void update_throttle(mame_time emutime) cycles_t target, curr, cps, diffcycles; int allowed_to_sleep; subseconds_t subsecs_per_cycle; - int paused = mame_is_paused(); + int paused = mame_is_paused(Machine); // if we're only syncing to the refresh, bail now if (video_config.syncrefresh) @@ -656,7 +654,7 @@ static void update_fps(mame_time emutime) video_screen_save_snapshot(fp, 0); mame_fclose(fp); } - mame_schedule_exit(); + mame_schedule_exit(Machine); } fps_end_time = curr; } @@ -671,7 +669,7 @@ static void update_fps(mame_time emutime) static void update_autoframeskip(void) { // skip if paused - if (mame_is_paused()) + if (mame_is_paused(Machine)) return; // don't adjust frameskip if we're paused or if the debugger was diff --git a/src/windows/video.h b/src/windows/video.h index b6d7d674a..24432c67f 100644 --- a/src/windows/video.h +++ b/src/windows/video.h @@ -105,7 +105,7 @@ extern win_video_config video_config; // PROTOTYPES //============================================================ -int winvideo_init(void); +int winvideo_init(running_machine *machine); void winvideo_monitor_refresh(win_monitor_info *monitor); float winvideo_monitor_get_aspect(win_monitor_info *monitor); diff --git a/src/windows/window.c b/src/windows/window.c index d5d146614..437e4193f 100644 --- a/src/windows/window.c +++ b/src/windows/window.c @@ -7,7 +7,7 @@ // //============================================================ -#define ENABLE_THREADS 0 +#define LOG_THREADS 0 // Needed for RAW Input #define _WIN32_WINNT 0x501 @@ -106,6 +106,8 @@ static int in_background; static int ui_temp_pause; static int ui_temp_was_paused; +static int multithreading_enabled; + static HANDLE window_thread; static DWORD window_threadid; @@ -113,13 +115,16 @@ static DWORD last_update_time; static win_draw_callbacks draw; +static HANDLE ui_pause_event; +static HANDLE window_thread_ready_event; + //============================================================ // PROTOTYPES //============================================================ -static void winwindow_exit(void); +static void winwindow_exit(running_machine *machine); static void winwindow_video_window_destroy(win_window_info *window); static void draw_video_contents(win_window_info *window, HDC dc, int update); @@ -127,7 +132,6 @@ static unsigned __stdcall thread_entry(void *param); static int complete_create(win_window_info *window); static int create_window_class(void); static void set_starting_view(int index, win_window_info *window, const char *view); -static void temp_pause_ui(int pause); static void constrain_to_aspect_ratio(win_window_info *window, RECT *rect, int adjustment); static void get_min_bounds(win_window_info *window, RECT *bounds, int constrain); @@ -141,7 +145,7 @@ static void set_fullscreen(win_window_info *window, int fullscreen); // temporary hacks -#if ENABLE_THREADS +#if LOG_THREADS struct _mtlog { cycles_t timestamp; @@ -187,33 +191,52 @@ void mtlog_add(const char *event) { } // (main thread) //============================================================ -int winwindow_init(void) +int winwindow_init(running_machine *machine) { - // get the main thread ID + size_t temp; + + // determine if we are using multithreading or not + multithreading_enabled = options_get_bool("multithreading", FALSE); + + // get the main thread ID before anything else main_threadid = GetCurrentThreadId(); // ensure we get called on the way out - add_exit_callback(winwindow_exit); + add_exit_callback(machine, winwindow_exit); // set up window class and register it if (create_window_class()) return 1; -#if ENABLE_THREADS -{ - // create a thread to run the windows from - size_t temp = _beginthreadex(NULL, 0, thread_entry, NULL, 0, (unsigned *)&window_threadid); - window_thread = (HANDLE)temp; - if (window_thread == NULL) + // create an event to signal UI pausing + ui_pause_event = CreateEvent(NULL, TRUE, FALSE, NULL); + if (!ui_pause_event) return 1; - // set the thread priority equal to the main MAME thread - SetThreadPriority(window_thread, GetThreadPriority(GetCurrentThread())); -} -#else - window_thread = GetCurrentThread(); - window_threadid = main_threadid; -#endif + // if multithreading, create a thread to run the windows + if (multithreading_enabled) + { + // create an event to signal when the window thread is ready + window_thread_ready_event = CreateEvent(NULL, TRUE, FALSE, NULL); + if (!window_thread_ready_event) + return 1; + + // create a thread to run the windows from + temp = _beginthreadex(NULL, 0, thread_entry, NULL, 0, (unsigned *)&window_threadid); + window_thread = (HANDLE)temp; + if (window_thread == NULL) + return 1; + + // set the thread priority equal to the main MAME thread + SetThreadPriority(window_thread, GetThreadPriority(GetCurrentThread())); + } + + // otherwise, treat the window thread as the main thread + else + { + window_thread = GetCurrentThread(); + window_threadid = main_threadid; + } // initialize the drawers if (video_config.mode == VIDEO_MODE_D3D) @@ -249,7 +272,7 @@ int winwindow_init(void) // (main thread) //============================================================ -static void winwindow_exit(void) +static void winwindow_exit(running_machine *machine) { assert(GetCurrentThreadId() == main_threadid); @@ -264,13 +287,24 @@ static void winwindow_exit(void) // kill the drawers (*draw.exit)(); -#if ENABLE_THREADS - // kill the window thread - PostThreadMessage(window_threadid, WM_USER_SELF_TERMINATE, 0, 0); - WaitForSingleObject(window_thread, INFINITE); + // if we're multithreaded, clean up the window thread + if (multithreading_enabled) + { + PostThreadMessage(window_threadid, WM_USER_SELF_TERMINATE, 0, 0); + WaitForSingleObject(window_thread, INFINITE); - mtlog_dump(); +#if (LOG_THREADS) + mtlog_dump(); #endif + } + + // kill the UI pause event + if (ui_pause_event) + CloseHandle(ui_pause_event); + + // kill the window thread ready event + if (window_thread_ready_event) + CloseHandle(window_thread_ready_event); } @@ -319,91 +353,99 @@ void winwindow_process_events(int ingame) // remember the last time we did this last_event_check = osd_cycles(); - // loop over all messages in the queue - while (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) + do { - int dispatch = TRUE; + // if we are paused, lets wait for a message + if (ui_temp_pause > 0) + WaitMessage(); - switch (message.message) + // loop over all messages in the queue + while (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) { - // ignore keyboard messages - case WM_SYSKEYUP: - case WM_SYSKEYDOWN: + int dispatch = TRUE; + + switch (message.message) + { + // ignore keyboard messages + case WM_SYSKEYUP: + case WM_SYSKEYDOWN: #ifndef MESS - case WM_KEYUP: - case WM_KEYDOWN: - case WM_CHAR: + case WM_KEYUP: + case WM_KEYDOWN: + case WM_CHAR: #endif - dispatch = is_debugger_visible; - break; + dispatch = is_debugger_visible; + break; - // special case for quit - case WM_QUIT: - fatalerror("Unexpected WM_QUIT message\n"); - break; + // special case for quit + case WM_QUIT: + fatalerror("Unexpected WM_QUIT message\n"); + break; - // temporary pause from the window thread - case WM_USER_UI_TEMP_PAUSE: - temp_pause_ui(message.wParam); - dispatch = FALSE; - break; + // temporary pause from the window thread + case WM_USER_UI_TEMP_PAUSE: + winwindow_ui_pause_from_main_thread(message.wParam); + dispatch = FALSE; + break; - // request exit from the window thread - case WM_USER_REQUEST_EXIT: - mame_schedule_exit(); - dispatch = FALSE; - break; + // request exit from the window thread + case WM_USER_REQUEST_EXIT: + mame_schedule_exit(Machine); + dispatch = FALSE; + break; - // forward mouse button downs to the input system - case WM_LBUTTONDOWN: - input_mouse_button_down(0, GET_X_LPARAM(message.lParam), GET_Y_LPARAM(message.lParam)); - dispatch = is_debugger_visible; - break; + // forward mouse button downs to the input system + case WM_LBUTTONDOWN: + input_mouse_button_down(0, GET_X_LPARAM(message.lParam), GET_Y_LPARAM(message.lParam)); + dispatch = is_debugger_visible; + break; - case WM_RBUTTONDOWN: - input_mouse_button_down(1, GET_X_LPARAM(message.lParam), GET_Y_LPARAM(message.lParam)); - dispatch = is_debugger_visible; - break; + case WM_RBUTTONDOWN: + input_mouse_button_down(1, GET_X_LPARAM(message.lParam), GET_Y_LPARAM(message.lParam)); + dispatch = is_debugger_visible; + break; - case WM_MBUTTONDOWN: - input_mouse_button_down(2, GET_X_LPARAM(message.lParam), GET_Y_LPARAM(message.lParam)); - dispatch = is_debugger_visible; - break; + case WM_MBUTTONDOWN: + input_mouse_button_down(2, GET_X_LPARAM(message.lParam), GET_Y_LPARAM(message.lParam)); + dispatch = is_debugger_visible; + break; - case WM_XBUTTONDOWN: - input_mouse_button_down(3, GET_X_LPARAM(message.lParam), GET_Y_LPARAM(message.lParam)); - dispatch = is_debugger_visible; - break; + case WM_XBUTTONDOWN: + input_mouse_button_down(3, GET_X_LPARAM(message.lParam), GET_Y_LPARAM(message.lParam)); + dispatch = is_debugger_visible; + break; - // forward mouse button ups to the input system - case WM_LBUTTONUP: - input_mouse_button_up(0); - dispatch = is_debugger_visible; - break; + // forward mouse button ups to the input system + case WM_LBUTTONUP: + input_mouse_button_up(0); + dispatch = is_debugger_visible; + break; - case WM_RBUTTONUP: - input_mouse_button_up(1); - dispatch = is_debugger_visible; - break; + case WM_RBUTTONUP: + input_mouse_button_up(1); + dispatch = is_debugger_visible; + break; - case WM_MBUTTONUP: - input_mouse_button_up(2); - dispatch = is_debugger_visible; - break; + case WM_MBUTTONUP: + input_mouse_button_up(2); + dispatch = is_debugger_visible; + break; - case WM_XBUTTONUP: - input_mouse_button_up(3); - dispatch = is_debugger_visible; - break; - } + case WM_XBUTTONUP: + input_mouse_button_up(3); + dispatch = is_debugger_visible; + break; + } - // dispatch if necessary - if (dispatch) - { - TranslateMessage(&message); - DispatchMessage(&message); + // dispatch if necessary + if (dispatch) + { + TranslateMessage(&message); + DispatchMessage(&message); + } } } + while(ui_temp_pause > 0); } @@ -552,13 +594,19 @@ int winwindow_video_window_create(int index, win_monitor_info *monitor, const wi window->startmaximized = options_get_bool("maximize", TRUE); // finish the window creation on the window thread -#if ENABLE_THREADS - PostThreadMessage(window_threadid, WM_USER_FINISH_CREATE_WINDOW, 0, (LPARAM)window); - while (window->init_state == 0) - Sleep(1); -#else - window->init_state = complete_create(window) ? -1 : 1; -#endif + if (multithreading_enabled) + { + // wait until the window thread is ready to respond to events + WaitForSingleObject(window_thread_ready_event, INFINITE); + + PostThreadMessage(window_threadid, WM_USER_FINISH_CREATE_WINDOW, 0, (LPARAM)window); + while (window->init_state == 0) + Sleep(1); + } + else + window->init_state = complete_create(window) ? -1 : 1; + + // handle error conditions if (window->init_state == -1) goto error; return 0; @@ -668,11 +716,10 @@ void winwindow_video_window_update(win_window_info *window) // post a redraw request with the primitive list as a parameter last_update_time = timeGetTime(); mtlog_add("winwindow_video_window_update: PostMessage start"); -#if ENABLE_THREADS - PostMessage(window->hwnd, WM_USER_REDRAW, 0, (LPARAM)primlist); -#else - SendMessage(window->hwnd, WM_USER_REDRAW, 0, (LPARAM)primlist); -#endif + if (multithreading_enabled) + PostMessage(window->hwnd, WM_USER_REDRAW, 0, (LPARAM)primlist); + else + SendMessage(window->hwnd, WM_USER_REDRAW, 0, (LPARAM)primlist); mtlog_add("winwindow_video_window_update: PostMessage end"); } } @@ -833,12 +880,14 @@ static void set_starting_view(int index, win_window_info *window, const char *vi //============================================================ -// temp_pause_ui +// winwindow_ui_pause_from_main_thread // (main thread) //============================================================ -static void temp_pause_ui(int pause) +void winwindow_ui_pause_from_main_thread(int pause) { + assert(GetCurrentThreadId() == main_threadid); + // if we're pausing, increment the pause counter if (pause) { @@ -846,9 +895,12 @@ static void temp_pause_ui(int pause) if (ui_temp_pause++ == 0) { // only call mame_pause if we weren't already paused due to some external reason - ui_temp_was_paused = mame_is_paused(); + ui_temp_was_paused = mame_is_paused(Machine); if (!ui_temp_was_paused) - mame_pause(TRUE); + { + mame_pause(Machine, TRUE); + SetEvent(ui_pause_event); + } } } @@ -860,13 +912,54 @@ static void temp_pause_ui(int pause) { // but only do it if we were the ones who initiated it if (!ui_temp_was_paused) - mame_pause(FALSE); + { + mame_pause(Machine, FALSE); + ResetEvent(ui_pause_event); + } } } } +//============================================================ +// winwindow_ui_pause_from_window_thread +// (window thread) +//============================================================ + +void winwindow_ui_pause_from_window_thread(int pause) +{ + assert(GetCurrentThreadId() == window_threadid); + + // if we're multithreaded, we have to request a pause on the main thread + if (multithreading_enabled) + { + // request a pause from the main thread + PostThreadMessage(main_threadid, WM_USER_UI_TEMP_PAUSE, pause, 0); + + // if we're pausing, block until it happens + if (pause) + WaitForSingleObject(ui_pause_event, INFINITE); + } + + // otherwise, we just do it directly + else + winwindow_ui_pause_from_main_thread(pause); +} + + + +//============================================================ +// winwindow_ui_is_paused +//============================================================ + +int winwindow_ui_is_paused(void) +{ + return mame_is_paused(Machine) && ui_temp_was_paused; +} + + + //============================================================ // wnd_extra_width // (window thread) @@ -914,6 +1007,9 @@ static unsigned __stdcall thread_entry(void *param) // attach our input to the main thread AttachThreadInput(main_threadid, window_threadid, TRUE); + // signal to the main thread that we are ready to receive events + SetEvent(window_thread_ready_event); + // run the message pump while (GetMessage(&message, NULL, 0, 0)) { @@ -1097,22 +1193,14 @@ LRESULT CALLBACK winwindow_video_window_proc(HWND wnd, UINT message, WPARAM wpar case WM_ENTERSIZEMOVE: window->resize_state = RESIZE_STATE_RESIZING; case WM_ENTERMENULOOP: -#if ENABLE_THREADS - PostThreadMessage(main_threadid, WM_USER_UI_TEMP_PAUSE, TRUE, 0); -#else - temp_pause_ui(TRUE); -#endif + winwindow_ui_pause_from_window_thread(TRUE); break; // unpause the system when we stop a menu or resize and force a redraw case WM_EXITSIZEMOVE: window->resize_state = RESIZE_STATE_PENDING; case WM_EXITMENULOOP: -#if ENABLE_THREADS - PostThreadMessage(main_threadid, WM_USER_UI_TEMP_PAUSE, FALSE, 0); -#else - temp_pause_ui(FALSE); -#endif + winwindow_ui_pause_from_window_thread(FALSE); InvalidateRect(wnd, NULL, FALSE); break; @@ -1165,11 +1253,10 @@ LRESULT CALLBACK winwindow_video_window_proc(HWND wnd, UINT message, WPARAM wpar // close: cause MAME to exit case WM_CLOSE: -#if ENABLE_THREADS - PostThreadMessage(main_threadid, WM_USER_REQUEST_EXIT, 0, 0); -#else - mame_schedule_exit(); -#endif + if (multithreading_enabled) + PostThreadMessage(main_threadid, WM_USER_REQUEST_EXIT, 0, 0); + else + mame_schedule_exit(Machine); break; // destroy: clean up all attached rendering bits and NULL out our hwnd diff --git a/src/windows/window.h b/src/windows/window.h index 2a13152a3..ccb311a0a 100644 --- a/src/windows/window.h +++ b/src/windows/window.h @@ -112,7 +112,7 @@ extern int win_use_raw_mouse; //============================================================ // core initialization -int winwindow_init(void); +int winwindow_init(running_machine *machine); // creation/deletion of windows int winwindow_video_window_create(int index, win_monitor_info *monitor, const win_window_config *config); @@ -127,6 +127,10 @@ void winwindow_toggle_full_screen(void); void winwindow_process_events_periodic(void); void winwindow_process_events(int ingame); +void winwindow_ui_pause_from_window_thread(int pause); +void winwindow_ui_pause_from_main_thread(int pause); +int winwindow_ui_is_paused(void); + #if HAS_WINDOW_MENU int win_create_menu(HMENU *menus); #endif diff --git a/src/windows/winmain.c b/src/windows/winmain.c index e4e99a6bb..c79dc768e 100644 --- a/src/windows/winmain.c +++ b/src/windows/winmain.c @@ -8,6 +8,7 @@ //============================================================ // standard windows headers +#define _WIN32_WINNT 0x0400 #define WIN32_LEAN_AND_MEAN #include #include @@ -183,7 +184,7 @@ int main(int argc, char **argv) // output_oslog //============================================================ -static void output_oslog(const char *buffer) +static void output_oslog(running_machine *machine, const char *buffer) { extern int win_erroroslog; if (win_erroroslog) @@ -196,21 +197,19 @@ static void output_oslog(const char *buffer) // osd_init //============================================================ -int osd_init(void) +int osd_init(running_machine *machine) { - extern int wininput_init(void); - extern void win_blit_init(void); extern int win_erroroslog; int result = 0; if (result == 0) - result = winvideo_init(); + result = winvideo_init(machine); if (result == 0) - result = wininput_init(); + result = wininput_init(machine); if (result == 0) - winoutput_init(); + winoutput_init(machine); #ifdef MESS if (result == 0) @@ -218,7 +217,7 @@ int osd_init(void) #endif if (win_erroroslog) - add_logerror_callback(output_oslog); + add_logerror_callback(machine, output_oslog); return result; } @@ -258,6 +257,21 @@ int osd_is_bad_read_ptr(const void *ptr, size_t size) +//============================================================ +// osd_break_into_debugger +//============================================================ + +void osd_break_into_debugger(const char *message) +{ + if (IsDebuggerPresent()) + { + OutputDebugString(message); + DebugBreak(); + } +} + + + //============================================================ // osd_lock_alloc //============================================================ @@ -465,7 +479,7 @@ static LONG CALLBACK exception_filter(struct _EXCEPTION_POINTERS *info) // if we're hitting this recursively, just exit if (already_hit) - return EXCEPTION_EXECUTE_HANDLER; + ExitProcess(100); already_hit = 1; // find our man @@ -576,12 +590,10 @@ static LONG CALLBACK exception_filter(struct _EXCEPTION_POINTERS *info) } #endif - logerror("shutting down after exception\n"); - cli_frontend_exit(); // exit - return EXCEPTION_EXECUTE_HANDLER; + ExitProcess(100); } diff --git a/sysinfo.dat b/sysinfo.dat index 0369983b0..2fba1de1a 100644 --- a/sysinfo.dat +++ b/sysinfo.dat @@ -10620,7 +10620,7 @@ Click with the lightpen or use keys 1 to 3 to select an option. Cassettes. -Most games were distributed on a cassette which are loaded from the BASIC 1.0 +Most games were distributed on cassettes which are loaded from the BASIC 1.0 cartridge. Thus, to get foo.k7 working, you need to use the both options "-cart basic.m7 -cass foo.k7". Type 1 in the menu to get the BASIC prompt. Two cases may now arise. @@ -10628,7 +10628,7 @@ If the game has a BASIC loader (.BAS, .BAT, .CMP files), type RUN"". If it has a binary loader (.BIN, .ASM files), type LOADM"",,R. Using the wrong command will result in a BASIC error, so you should really try both (do not forget to rewind between two retries). -Also, if you have have the BASIC DOS loaded (see bellow), you must now type +Also, if you have the BASIC DOS loaded (see below), you must now type respectively RUN"CASS:" and LOADM"CASS:",,R because the default device will be the floppy drive 0 instead of the cassette reader. Then, be patient. TO7 tapes are slow: 900 bauds (you can put throttling on). @@ -10641,7 +10641,7 @@ demodulation (done in hardware in the TO7) is not well emulated (except when the signal is very clean, such as the one output by the emulator when saving). Cassettes are always saved in the .wav format. Do not forget to put the -cassette reader into record mode using MESS's in-game menu (Tape Control). +cassette reader into record mode using MESS's in-game menu. Floppies. @@ -10659,7 +10659,7 @@ BASIC DOS extension in the form of a boot disk. Put the boot disk in the first drive (-flop0) as well as the BASIC 1.0 cartridge, and press 1. You should now be able to DIR, LOAD, SAVE. Use DIR"1:", DIR"2:" and DIR"3:" to access to floppies in drives -flop1, -flop2 and -flop3. New floppies must be formatted -using the DSKINI0 (for -flop0) to DSKINI3 (for -flop3) command before +using the DSKINI0 (for -flop0) to DSKINI3 (for -flop3) commands before being usable. Two-sided drives are actually seen as two different drives. A two-sided disk must thus be split into two image files put into different slots @@ -10685,7 +10685,7 @@ Here is the visual layout of the keyboard: Unshifted keys appear on the left, and shifted appear on the right. Caps-lock is SHIFT+SPACE. -Accents are typeset using with the ACC key, followed by A (grave), +Accents are typeset with the ACC key, followed by A (grave), B (acute), C (hat), H (trema), or c (cedilla), then the key to accent. @@ -11004,7 +11004,7 @@ The MO5 is the first Thomson computer with an integrated BASIC. Unlike the TO7 and TO7/70, it does not require an external BASIC cartridge to operate. -Also, the MO5 (and its MO5E variant) is the only Thomson computers without +Also, the MO5 (and its MO5E variant) is the only Thomson computer without a startup menu: it starts directly at the BASIC prompt (or whatever cartridge was plugged-in). @@ -11037,7 +11037,7 @@ Thus, it featured a lot of educational software. It was also a great game computer until the TO8 was built. Unlike the TO7 cassette format, the MO5 cassette format is a quite -simple MFM encoding (Modified Frequency Modulation) and it is decoded +simple MFM encoding (Modified Frequency Modulation) and is decoded fully in software. This gave rise to variants: many games were encoded specially and used a special loader in order to prevent people from disassembling the raw files. Some emulators use a byte-based format that @@ -11045,7 +11045,7 @@ cannot represent these protections, and so, rely on emulator-specific hooks. These hooks are not emulated in MESS. Thus, you should prefer raw .wav files that faithfully emulate protection schemes in MESS. -Note that the byte-based format often have the suffix .k5 to differentiate them +Note that byte-based images often use the suffix .k5 to differentiate them from TO7 files, but many also have a .k7 suffix which is confusing because they cannot be run on a TO7. @@ -11100,7 +11100,7 @@ The MO5E features a much nicer case and keyboard than the original one for the French market. Also, two game ports and 6-bit sound are included (they are optional extensions on the MO5, TO7, and TO7/70). -It exists in both AZERTY and a QWERTY versions. +It exists in both AZERTY and QWERTY versions. Apart form the slightly different BIOS and BASIC ROM, it is internally identical to the MO5, and fully compatible. @@ -11138,9 +11138,13 @@ Features: . 640x200, 2 colors - . 320x200, two 2-color pages that can be overlaid + . 320x200, two 2-color pages - . 160x200, four 2-color pages that can be overlaid + . 320x200, two overlaid pages, 3 colors + + . 160x200, four 2-color pages + + . 160x200, four overlaid pages, 5 colors * Palette: 16 colors to be chosen among 4096. @@ -11268,13 +11272,13 @@ Known Issues: History and Trivia: The TO9 was a high-end product destined to a semi-professional usage. -It includes lots of RAM, software in ROM, a 3"1/2 floppy drive. It has a + It included lots of RAM, software in ROM, a 3"1/2 floppy drive. It had a desktop look with a separate keyboard and an optional mouse. -It is a TO family computer, backward compatible with the TO7 and TO7/70 +It was a TO family computer, backward compatible with the TO7 and TO7/70 (but not the MO5). -It is the first Thomson computer based on the new video gate-array that -increases greatly the video capabilities. -Also, it is the first Thomson to have a dedicated keyboard chip (former ones +It was the first Thomson computer based on the new video gate-array that +increased greatly the video capabilities. + Also, it was the first Thomson to have a dedicated keyboard chip (former ones relied on CPU pooling). Alas it had many problems. @@ -11324,9 +11328,13 @@ Features: . 640x200, 2 colors - . 320x200, two 2-color pages that can be overlaid + . 320x200, two 2-color pages + + . 320x200, two overlaid pages, 3 colors + + . 160x200, four 2-color pages - . 160x200, four 2-color pages that can be overlaid + . 160x200, four overlaid pages, 5 colors * Palette: 16 colors to be chosen among 4096. @@ -11364,7 +11372,7 @@ for special kinds of floppy software (CHG applications). Cartridges. -An optional cartridge can be inserted with -cart option. It can be +An optional cartridge can be inserted with the -cart option. It can be started from the startup menu by pressing SHIFT+0. The TO8 can run TO7 and TO7/70 cartridges, but not MO5 ones. @@ -11437,8 +11445,10 @@ Mouse. A mouse is emulated. However, you cannot use both a mouse and a game-pad as they are connected to the same port. Use MESS's in-game configuration to select between the two. The startup menu automatically detects the presence of a -mouse. It then disables the lightpen and use the mouse as a pointer device -instead. You can revert to the lightpen using the SHIFT+3, and then SHIFT+2 +mouse. It then disables the lightpen and uses the mouse as the pointer device +instead. +You can revert to the lightpen using SHIFT+3 in the startup menu, +and then SHIFT+2 (useful when you revert to game-pad in MESS's in-game configuration, or if a mouse was incorrectly detected when you actually moved a game-pad). The white cross disappears when a mouse is emulated. @@ -11475,10 +11485,10 @@ meant to replace the TO7/70 as a home computer. It has a more compact Amiga-like look, no separate keyboard, and less extension slots. Also, it has no integrated floppy drive, and less application software in ROM. -Despite this, it is considered a much superior computer. +Despite this, it is considered much superior to the TO9. It improves on the gate-array technology developed for the TO9 (the TO8 version is so mature that it will be reused unchanged on the TO9+ and MO6). -This allows a better and more flexible use of the address space (in particular, +It allows a better and more flexible use of the address space (in particular, video page switching is now available in all video modes). The TO8 has more RAM: 256 KB expandable up to 512 KB. The integrated controller is very versatile (again, a custom Thomson @@ -11549,9 +11559,9 @@ We only show the difference with the TO8 and the TO9: * ROM: 96 KB BIOS, BASIC 1.0, BASIC 512, graphical DOS -* Video: similar to TO8 +* Video: similar to the TO8 -* Mouse: similar to TO8 +* Mouse: similar to the TO8 * Floppy: integrated versatile controller, integrated two-sided 3"1/2 floppy drive @@ -11625,9 +11635,13 @@ Features: . 640x200, 2 colors - . 320x200, two 2-color pages that can be overlaid + . 320x200, two 2-color pages + + . 320x200, two overlaid pages, 3 colors + + . 160x200, four 2-color pages - . 160x200, four 2-color pages that can be overlaid + . 160x200, four overlaid pages, 5 colors * Palette: 16 colors to be chosen among 4096. @@ -11682,7 +11696,7 @@ the legacy BASIC 1.0. If you use the newer BASIC 128, you must type RUN"CASS:" and LOADM"CASS:",,R instead. The MO6 should load and run most MO5 software, provided you use the legacy -BASIC 1.0. New, MO6 software generally also work on the BASIC 1.0. +BASIC 1.0. New, MO6 software generally also work with the BASIC 1.0. To improve the compatibility, use preferably .wav image formats and disable the external floppy controller in MESS's in-game menu. The MO6 cannot load cassettes in the "TO" format (TO7, TO7/70, etc.). @@ -11732,9 +11746,9 @@ The mouse behaves as the TO8 one, i.e., you must choose whether a mouse or a game-pad is connected to the port using MESS's in-game menu (both cannot exist at the same time, but you can switch between them dynamically, without a reset). -The startup menu will then automatically detects the presence of the -mouse and disables the lightpen. Use the startup preference menu (2) to -revert back to lightpen pointing device. +The startup menu will then automatically detect the presence of the +mouse and disable the lightpen. Use the startup preference menu (2) to +revert back to the lightpen. Video. @@ -11764,11 +11778,11 @@ It uses the same technology as the TO8. In particular, the very same gate-array is used for the video and memory management. It is versatile enough to adapt to a MO5-like address map and emulate the legacy 320x200 MO5 video mode instead of the legacy TO7/70 -one). +one. It also provides many enhancements from the TO8 (4096 color palette, various video modes, hardware video page flip, flexible memory management, etc.). -The MO6 was made cheaper than the TO8 by limiting the memory to 128 KB (not +The MO6 was made cheaper than the TO8 by limiting its memory to 128 KB (not expandable, in theory) and making it cassette-based (there is no floppy drive, an not even an internal floppy controller: it must be added as in the TO7 and MO5). Even the keyboard shrank and reverted to an archaic management based on diff --git a/whatsnew.txt b/whatsnew.txt index b06cf6691..873f896f3 100644 --- a/whatsnew.txt +++ b/whatsnew.txt @@ -1,470 +1,528 @@ -0.108 +0.109 ----- MAMETesters Bugs Fixed ---------------------- -darius2056gre [robiza] +pitfight0106u3gra [Canim] +turbofrc37b1gre [Canim] Source Changes -------------- -Fixed bug that prevented in-game MNG recording from working. -[Rene Single] +More merit, getrivia, and findout improvements: [wolf676] + - added external coin counters and coin lockouts + - fixed lamps in upright and cocktail modes + - getrivia.c: fixed sound in selection and clone + - located ticket out bit in trivia games and commented it in + both drivers. + - fixed merge collision from u5 -Added more extensive documentation to several of the Sega 16-bit -drivers. [Brian Troha] +Input port cleanup and additional comments in the CPS1 driver. +[steph] -Fixed color decoding in Cheeky Mouse. [Nicola Salmoria] +Fixed ES5503 behavior for voice volumes > 127 (cures missing +sounds/music notes in several Apple IIgs demos and games). +[R. Belmont] -Improved DIP switches for headoni and spacbeam. [wolf676] +Made MSC1937 operation more accurately match datasheet and wiring +diagram. Added indexed getters to the output system to match the +newly introduced setters. [El Condor] -More debugger comments fixes: [Andrew Gardner] - - adding a comment no longer redefines the disasm range. - - comments properly save and load special characters (&,", etc) +Changed input port calculations to go in two passes, to catch +out-of-order conditionals properly. [HobbesAtPlay] -Added sample_get_base_freq() to allow for querying to the base -frequency of samples. [Aaron Giles] +Fixed priorities in the m62 driver, mainly affecting Lode Runner +sequels. [robiza] -More G80 work: [Aaron Giles] - - finished video cleanup - - fixed Space Odyssey controls - - added crude support for Astro Blaster attack rate - - hooked up 005 melody generator, but missing sound PROM - - finished sound cleanup +Fixed PNG code so that it doesn't NULL terminate tEXt chunks. +[Mathis Rosenhauer] -Changed debugger to default to 'on' in debug builds. [Aaron Giles] +Changed disassembler override callbacks to match new disassembler +syntax. [Nathan Woods] +Changed artwork loading to be on-demand rather than all up-front. +Also added a message during artwork resizing/loading so it's more +clear what is going on. [Aaron Giles] +Added new osd function osd_break_into_debugger() which can be hooked +to cause a break into the OSD's debugger when an assertion or +fatal error occurs. Hooked it up on Windows to do just that. +[Aaron Giles] -New games added or promoted from NOT_WORKING status ---------------------------------------------------- -Konek-Gorbunok [Eugene Sandulenko] +Normalized exit codes from mame.exe. The core-specific ones are +defined in mame.h. The Windows build will also return code 100 on +an unhandled exception now. [Aaron Giles] New clones added ---------------- -Teenage Mutant Hero Turtles (UK 2 Players, set 2) [Patrik Styrnell] -Teenage Mutant Hero Turtles - Turtles in Time (2 Players ver EBA) - [Patrik Styrnell] -Wonder Boy (set 4) [Nicola Salmoria] +Astro Combat (older, PZ) [f205v] +Funky Bee (bootleg, harder) [f205v] -0.107u4 +0.108u5 ------- MAMETesters Bugs Fixed ---------------------- -mngrecording0107u1ora [Aaron Giles] -vectorsnapshot0107u1red [Aaron Giles] -tdfever087u4gra [Canim] -quizmeku087u4gra [Canim] +mf_bdash0108u4gre [Aaron Giles] Source Changes -------------- -Fixed the dips for Apache 3 and Dark Mist. [Brian Troha] +Fixed priority in galivan and danger (and clones). Added save state +support to all games in galivan.c. Fixed portability issue in DAC +audio save states. [Vas Crabb] + +Fixed bug in software renderer that prevented lower-resolution +targets from being properly supported. [smf] + +Rewrote the Atari vector generators, using the schematics and actual +state machine PROMs. The state machine is now emulated so timing +should be much more realistic. Clipping hardware in bzone and others +is emulated instead of hardcoded. Improved accuracy of clocks and +various other bits of cleanup. [Mathis Rosenhauer] + +Some more cleanups to the getrivia, findout, and merit drivers: +[wolf676] + - corrected order of buttons and lamps in the games + - removed impulse(2) from buttons -> buttons respond much better now + - added coin 2 to Selection and Trivia + - Poker and Sexual Trivia have no coin 2 -> unique inputs defined + - used PORT_INCLUDE() and PORT_MODIFY() where possible + - connected outputs for use with artwork + +Major updates to the Nintendo 64 based driver. [Ville Linde] + +More improvements to the pmpoker driver: [Roberto Fresca] + - Confirmed the GFX banks (a complete dump appeared!). + - Improved technical notes and added a PCB layout based on PCB pics. + - Found and fixed the 3rd bitplane of BigBoy gfx. + - Renamed Big-Boy to Golden Poker Double Up. + - Added 'Joker Poker' (Golden Poker version without 'double-up'). + - Added 'Jack Potten's Poker' (same as Joker Poker, but with + 'Aces or better' instead of jacks). + - Simulated colors for all sets till color PROMs appear. + - Completed inputs in all sets (except DIP switches). + +Undid previous (incorrect) 'fix' of shangha3 sound clock. [Canim] + +Implemented some port conditions for gmgalax, so you only see the +relevant DIP switches for the active game. [Canim] + +Numerous fixes to the cheat engine. [ShimaPong] + +Updated the TN2A03 CPU to match the proper cycle timings and +unsupported opcodes revealed by Blargg's NES chip test. [Wilbert Pol] + +Another big update to the ST-V driver: [Mariusz Wojcieszek] + - scsp: improved interrupt reset. diehard, dnmtdeka, vfkids, + - colmns97 have sound now + - vdp1: added mesh effect for the sprites + - vdp1: added polylines + - vdp2: optimized rbg rendering + - stv: added speedups for dnmtdeka and diehard + - stv: corrected some set names/descriptions + +Fixed crash in Windows code if we are unable to create sound buffers. +[Nathan Woods] -Added built-in overlays for clowns and maze. [Mr. Do!] +Fixed bug that caused Turbo sprites to be exceedingly large. +[Aaron Giles] -Converted Final Romance 2 to be dual screen. [David Haywood] +Began rewrite of Grand Champion driver. Still work to do on collision +detection, radar, and some glitches. [Aaron Giles] -Converted the VFD display in the BFM games to use a second screen -rather than hacking onto the main screen. [El Condor] +Added new output utilities: output_set_led_value(), +output_set_digit_value(), output_set_lamp_value(), which are used to +set a generic indexed data type. Changed Turbo and Max-a-Flex over to +using output_set_digit_value() for their digits. [Aaron Giles] -Fixed detection of left/right modifier keys when paused. Also added -support for recently added keys so they are detected by MAME when -paused. [Ben Rudiak-Gould] +Rewrote the PNG reading/saving code, improving error reporting and -Changed render_target_alloc() to take a bitmask of flags. In addition -to loading a single file, targets can also be marked "hidden", and -only non-artwork views can be made visible. [Aaron Giles] +simplifying the code significantly. [Aaron Giles] -Added new render target layer config flag to disable screen overlays. -[Aaron Giles] -Changed snapshot taking code to render the particular screen to a -temporary render target. This allows vector games to have snapshots -again. [Aaron Giles] -Normalized the naming of several functions in video.c, most -importantly: [Aaron Giles] +New games added or promoted from NOT_WORKING status +--------------------------------------------------- +Pocket Racer [smf, Guru] +PlayMan Poker (Germany) [Roberto Fresca] +Killer Instinct (SNES bootleg) [Tomasz Slanina] +Real Fun (Version 7.01) [Brian Troha] - force_partial_update -> video_screen_update_partial - configure_screen -> video_screen_configure - set_visible_area -> video_screen_set_visarea -Added new functions that do accurate per-screen timing based on -video parameters: [Aaron Giles] - video_screen_get_hpos - video_screen_get_vpos - video_screen_get_hblank - video_screen_get_vblank - video_screen_get_time_until_pos +New clones added +---------------- +World Class Bowling (v1.5) [Brian Troha] +Gryzor (Set 2) [Stefan Lindberg] +Power Drift (World) [Stefan Lindberg] +Strikers 1945 (Korea) [Arzeno Fabrice] +10-Yard Fight (World) [Brian Troha] +Final Lap R (Japan Rev. C) [Arzeno Fabrice] -Fixed bug that caused the VIDEO_EOF to be called repeatedly while in -the debugger. [Aaron Giles] -Split render.c into rendutil.c, rendlay.c, and render.c to keep the -code more organized. [Aaron Giles] -Abstracted the notion of outputs. A new module, output.c, now controls -all outputs. Each output is tagged with a name; some standardization -eventually needs to happen on these names, but at the moment it's -fully open. The OSD layer can register with output.c to be notified -when outputs change. From there, it is free to do what it wants. LEDs -have now been converted to outputs with the name "led0", "led1", etc. -[Aaron Giles] +0.108u4 +------- -Added support for notifying external clients of changes in output -states in the Windows OSD system. See windows/output.h for a list of -messages that external clients can register to receive. Removed the -built-in hacky LED support in the Windows OSD layer. Created a sample -application ledutil.exe which subscribes to the external events and -routes the "led0", "led1", and "led2" outputs to the keyboard LEDs -just like before. If you want to continue to have LED support, simply -copy ledutil.exe into your startup folder and let it run in the -background. [Aaron Giles] - -Modified the Q*Bert driver to signal a "knocker0" output when the -knocker is triggered. [Aaron Giles] - -Added new layout element component type "text", which lets you draw -text in the built-in MAME font onto an element in a layout. This -can be used for basic lamps and built-in layouts. See maxaflex.c for -an example. [Aaron Giles] - -Added new layout element component type "led7seg", which constructs -a 7-segment LED in an element in a layout. This is commonly used for -external score and timer displays. See maxaflex.c for an example. -[Aaron Giles] -Added built-in layouts for Turbo, Subroc 3D, Buck Rogers, Atari -Football, Atari Baseball, and Super Speed Racer using the new -primitives. [Aaron Giles] +MAMETesters Bugs Fixed +---------------------- +gotya0107u3yel [David Haywood] +spcewars36rc2ora [Robert] +prehisle0104u5gre [Vas Crabb] +shangha3237b7gre [Canim] -Fixed overflow computation in the S2650 core. [Aaron Giles] -More Sega G-80 raster cleanup: [Aaron Giles] - * consolidated the video hardware implementations - * fixed cocktail mode video and controls in all games - * fixed Monster Bash (2 board version) video - * revived Sindbad Mystery and fixed sound chip frequencies +Source Changes +-------------- +Added support for reverse-order entry in the BFM code. [El Condor] +Cleaned up DIP switches and documentation in the merit.c and +coinmstr.c drivers. [wolf676] -New games added or promoted from NOT_WORKING status ---------------------------------------------------- -Trivia Quest [Pierpaolo Prazzoli] -SunA Quiz 6000 Academy [David Haywood] +Updated the MPU4 layout and added more documentation. [El Condor] +Fixed neocrypt.c to work on big-endian machines. [R. Belmont] +Improved DIP switches for spcewars and invadpt2. Fixed sound in +spcewars. [Robert] -New clones added ----------------- -Zero (set 2) [David Haywood] +Fixed UI for cheat system watchpoints, making them usable again. +[Nicola Salmoria] +Fixed flipscreen mode for liquidk and other games using the same +Taito graphics chips. [Robzia] +Added many more notes/info to the arkanoid driver. [steph] -0.107u3 -------- +Added save state support for YM3812, YM3526 and uPD7759 sound chips, +and Prehistoric Isle video hardware. Also added partial save state +support for the Y8950 sound chip. [Vas Crabb] +Did a bit of object-orienting the core. All core init functions now +take a running_machine parameter. All exit, reset, and pause +callbacks now require a running_machine parameter to register, and +pass in the running_machine when called. [Aaron Giles] -MAMETesters Bugs Fixed ----------------------- -pignewt0106u3gre [Aaron Giles] -ui_draw_text0.107u2red [Aaron Giles] -blueprnt0107u2red [Aaron Giles] +Added a running_machine parameter to the following driver callbacks: + DRIVER_INIT + MACHINE_START/MACHINE_RESET + SOUND_START/SOUND_RESET + VIDEO_START/VIDEO_RESET/VIDEO_EOF/VIDEO_UPDATE + NVRAM_HANDLER/MEMCARD_HANDLER +For the most part, this didn't affect the code thanks to the macros, +apart from cases where direct calls were made. [Aaron Giles] +Altered most of the mame.c and palette.c interfaces to take a +running_machine parameter. Hung private data for these modules off of +the running_machine structure instead of using global variables. +[Aaron Giles] +Did some cleanup and de-Achoization of the palette code. Removed some +features used only by Grand Champion, which only complicated things +for all the other drivers. Marked Grand Champion as imperfect graphics +until it gets rewritten. [Aaron Giles] -Source Changes --------------- -Improved DIP switches in benberob. [Brian Troha] +Since I had to visit all call sites of palette_set_color to add the +running_machine parameter, I also updated quite a lot of them to use +the nice palnbit() inlines in palette.h, which cleaned up the code in +many cases. Since this was a manual process, I probably messed up one +or two cases, so if you notice odd colors, please report them to the +http://mametesters.org site. [Aaron Giles] -Added support for real Bubble Bobble MCU. [Trinity, Nicola Salmoria] +More Turbo work: cleaned up the sound code, added support for proper +speaker placement in all games, a few other minor fixes. Sprite +scaling is still not 100%, but I need some real hardware to verify. +Apart from that, no further work is planned. [Aaron Giles] -Fixed track lookup implementation in Virtua Racing, bringing the -game much closer to playable. [Olivier Galibert] -Minor cleanup and speed hack removal in the konamigx.c [R. Belmont] -Improved magicfly driver. All graphics are properly decoded / banked -now. [Roberto Fresca] +New games added or promoted from NOT_WORKING status +--------------------------------------------------- +Shooting Master [David Haywood, Tomasz Slanina] +Quizmaster (German) [wolf676] + + + +New clones added +---------------- +Gals Panic II (German) [Patrik Styrnell] +Pocket Gal 2 (Japanese) [Patrik Styrnell] +Locked 'n Loaded (World) [Patrik Styrnell] +Mad Ball V2.0 (hack? With Nudity) [f205v] +Arkanoid (Tayto bootleg, harder) [steph] +Arkanoid (Game Corporation bootleg, set 2) [steph] +Arkanoid (bootleg with MCU, harder) [steph] -More improvements to the 6840 timer module. Updated the MPU4 driver -to the most recent implementation. Convert Cosmic Chasm over to -using the new system. [El Condor] -65816/377xx update: [R. Belmont] - * Made block transfer instructions interruptable as they are on - both actual chips (previously a single opcode could eat >400,000 - cycles with obvious consequences for interrupt timing) - * M377xx block transfers move one less byte than the 65816, fixed -Adjusted the DAC sound level on the 2612 to something more -reasonable. [David Haywood] +0.108u3 +------- -Taito JC update: [Ville Linde] - * Some general improvements to the driver - * Added some more opcodes to the TMS320C51 core -Improved the M2 driver so that the M2 kernel starts to boot, but it -hangs quite soon due to some multiprocessor issues. [Ville Linde] +Source Changes +-------------- +Improved offsets of the "normal spites" in the SSV games twineag2, +ultrax, and dynagear. [robzia] -Updated several games' input ports to use IPT_BILL1 for bill -acceptors. [ClawGrip] +Added missing video change to the lethalen driver. [David Haywood] -Properly documented and connected the MCU code in the Namco System 1, -System 86, Baraduke, Pacland, and Sky Kid drivers. [Brian Troha] +Some nice improvements to the debugger: [Andrew Gardner] + * added ability to tab between views in the disassembly windows + * added a 'cursor' to the dasm view and hooked up navigation keys + * added F4 'run to here' key when the disasm view has focus + * added F9 'toggle breakpoint' key when the disasm view has focus + * enhanced memory view keyboard navigation -Renamed "Native" views to "Pixel Aspect" views to avoid the confusion -that they are anything but artificial aspect ratios. [Aaron Giles] +Added workaround for crash in the sound code under some edge cases. +[David Haywood] -Added beam width control to the UI sliders. [Aaron Giles] +Fixed background ROM loading in the new wbmlbg set. [David Haywood] -More Zaxxon driver cleanups/fixes: [Aaron Giles] - * fixed sound problems in Razmataz - * corrected background and sprite positioning - * fixed bugs introduced in sample handling - * bootlegs and alternate versions work again - * added state saving support to the Sega universal sound board +Overhauled and corrected the DIP switches in the trivia and quiz +games in the findout driver. [wolf676] -Added several common generic graphics layouts to vidhrdw/generic.c, -for use by multiple drivers. [Aaron Giles] +Added PORT_DIPLOCATION to the airbustr driver. [Roberto Fresca] -Added new option -video none which can be used for CPU benchmarking -without the overhead of the video system. [Aaron Giles] +TIA-MC1 driver improvements: [Eugene Sandulenko] + - fixed documentation + - hooked game counter and coin lockout + - added save state support -Fixed remaining crashes in GDI/ddraw mode when drawing vector games. -[Aaron Giles] +Fixed 6840 counter behavior in continuous mode. [El Condor] -Removed the -artwork option to avoid confusion. If you want to run -without any artwork, use -view standard instead. [Aaron Giles] +Identified some unknown DIP switches in Robby Roto. [wolf676] -Added options -screen, -aspect, -resolution, and -view which apply -to all windows. These values can be individually overridden for each -specific window by using the existing -screen, -aspect, --resolution, and -view options. [Aaron Giles] +Big update to the arkanoid driver which improves emulation of some +bootlegs: [Steph] + - Interverted 'arkblock' and 'arkbloc2' sets for better comparaison + - Renamed sets : + * 'arkbl2' -> 'arkmcubl' + * 'arkbl3' -> 'arkgcbl' + - Changed some games descriptions + - Removed flags from the following sets : + * 'arkbloc2' (old 'arkblock') + * 'arkgcbl' (old 'arkbl3') + * 'paddle2' -Fixed bug that caused the sound sampling code to not track changes in -the refresh rate. [Aaron Giles] +Fixed a multithreading race condition at startup. [Nathan Woods] -Began cleanup/rewrite of the Sega G-80 raster games. This is still -very much a WIP, so don't report any bugs: [Aaron Giles] - * cleaned up input port handling similar to the G-80 vectors - * proper clock and video speeds - * reimplemented Space Odyssey background including collision detect - * fully implemented Pig Newton background - * connected 2-board Monster Bash more correctly +Added some minimal validation on the sample rate configuration +parameters. [Firewave] -Added new macro PORT_SERVICE_DIPLOC for specifying a PORT_SERVICE -and a DIPLOCATION. [Aaron Giles] +Fixed a few dips and added diplocation setting for Wonder Stick +in the nmg5.c driver. [Brian Troha] +Big update to the MPU4 driver: [El Condor] + - added support for reverse clocking in the VFD code. + - changed the 6840 to not run the counter clock if no frequency + is specified + - reworked the MPU4 drastically to be more in sync with AGEMAME + - MPU4 video should now be working a little better + - deprecated 6850acia.c, replacing it with a specialized driver +Updated core.mak to ensure the make clean will remove file2str.exe. +[Nathan Woods] -New games added or promoted from NOT_WORKING status ---------------------------------------------------- -Trivia ? Whiz (Edition 3) [Pierpaolo Prazzoli] -Legend of Heroes [Pierpaolo Prazzoli] -Super Bubble 2003 [Pierpaolo Prazzoli] -Dambusters [Norbert Kehrer] -Catacomb [Mike Coates] +Added new ROM loading option, ROM_IGNORE() which works just like +ROM_CONTINUE() except that you don't need to load the data anywhere. +It can be used when larger ROMs are present and only a portion of the +data is used. See solomon.c for an example. [Aaron Giles] + +Removed support for the old debugger. [Aaron Giles] + +Added driver_data member to the Machine structure, where drivers can +hang data instead of using global variables. Added MDRV_DRIVER_DATA +macro so the core can allocate this structure at startup. Added +AM_BASE_MEMBER and AM_SIZE_MEMBER which are similar to AM_BASE and +AM_SIZE but let you specify a member of a struct hanging off of +driver_data. Updated the Turbo driver to use these new features as an +experiment. [Aaron Giles] + +More Turbo driver cleanup: [Aaron Giles] + * doubled the horizontal resolution to better draw analog sprites + * improved Buck Rogers and Subroc video New clones added ---------------- -Galaga (Midway set 1 with fast shoot hack) [David Widel] -Versus Net Soccer (3 new versions) [R. Belmont, f205v] -Ace Attacker (System 16A) [Arzeno Fabrice] -Arm Champs II v2.6 [Gerald Coy] +Solomon's Key (US) [Bobby Conover] +Commando (bootleg) [ClawGrip] +Beam Invader (set 2) [Peter Townson] New games marked as GAME_NOT_WORKING ------------------------------------ -Casino 5 [Pierpaolo Prazzoli] +Connect 4 [El Condor] +PlayMan Poker (Germany) [Roberto Fresca] +Big Boy [David Haywood] -0.107u2 +0.108u2 ------- MAMETesters Bugs Fixed ---------------------- -savestate0104u7ora [Adam Bousley] -ripoff097gre [Adam Bousley] -cuebrckj0104u2gra_fix [Canim] +loadstate0108u1red [Aaron Giles] +dooyong0108u1red [Aaron Giles] +deadang0108u1red [Aaron Giles] +pang337b15gre [robiza] +botanic080u1gra [robiza] Source Changes -------------- -Massive cleanup/fixing of 16-bit Sega drivers: [AWJ] - * many corrections to descriptive set names, adding revision letters, - cabinet types, etc. - * fixed many DIP switches and added PORT_DIPLOCATION support - * adjusted min/max values for analog controls to improve response - * fixed button ordering between System 16A/B - * cleaned up a number of ROM names and fixed some incorrect guesses - * some cleanup of turbo.c as well - * fixed visible area in Hang-On hardware - * actually disabling 8751 in games that have a fake replacement - * hooked up 8255 PPI correctly now that it has mode 2 support - * fixed behavior of NMI line in later sega sound boards - * fixed addressing in the SegaPCM sound system - * some hardware/documentation cleanup - -Some cleanups in the new UI/video code to make MESS happy. -[Nathan Woods] +Fixed options_output_ini_file() and options_output_ini_mame_file() +to properly handle string options containing spaces. [Nathan Woods] -Added macros to prevent use of strcasecmp and strncasecmp for -better cross-platform compatibility. [Nathan Woods] +Fixed incorrect DIP switches in Trivia (Version 1.03), Selection, +and Poker games (getrivia.c). [wolf676] -Connected unimplemented opcode $01 on the 6809 core. [Antoine Mine] +Added PORT_DIPLOCATION macros to a number of drivers based on +research. [Roberto Fresca] -Implemented CNT pin and some serial features of the 6526 CIA chip. +Fixed several issues with pausing and the multithreading code. [Nathan Woods] -Mapped service button in slammast. [Canim] - -Fixed bug in 8039 CPU handling of A11 latch. [Aaron Giles] +Cleaned up the vacfdisp module to display 14 and 16 segment displays. +Added a separate character set for the OKI MSC1937. Changes Scorpion +2 to the new system. Tidied up the 6840 emulator a bit. [El Condor] + +Attempted to fix the bad Space Odyssey ROM by using data from the +previous dump. It is still marked BAD_DUMP (we would like to get an +actual dump), but the new Space Odyssey is now playable. [MASH] + +Removed recently-introduced case dependency in the ROM naming. +[Buddabing] + +Added new option -multithreading (-mt) which enables the previous +multithreaded rendering code. This code has had problems on some +systems, especially pre-XP systems, so consider it experimental. If +you want to help debug issues, enable LOG_THREADS in windows/window.c +and post them to MAMETesters.org with a description of your problem +and your system. If you don't have hyperthreading, dual core, or a +multi-CPU system, don't bother turning this flag on. [Aaron Giles] + +Changed the behavior of the led7seg primitive. It now no longer takes +a state value but accepts states from 0-255, allowing independent +control over all 7 segments and the decimal. Ordered the segments +according to standard order. Updated the Turbo driver to do its own +BCD decoding via an LS48 decoder to control the segments directly. +This will break existing layouts using the led7seg primitive. +[Aaron Giles] -Rewrote Zaxxon driver from the schematics. This is still a WIP (not -finished yet): [Aaron Giles] - * correct clock speeds and video timing - * complete memory maps - * connected universal sound board to Ixion and Razmataz - * simplified video code and merged common cases together - * palette derived from resistor weights - * background positioning still a little off +Further turbo driver cleanup. Still in WIP. [Aaron Giles] + * derived sprite scaling from PROMs and R/C values (still not 100%) + * rewrote most of the video/sprite handling + * identified all PROMs and used them where appropriate + * added a more complete 8279 implementation + * converted 7-segment LEDs to the new behavior described above -Added service_coin_lockout_w() to lockout service coins. [Aaron Giles] -Added MDRV_SCREEN_RAW_PARAMS() which lets you specify a pixel clock, -horizontal, and vertical video timing values in place of the usual -screen size, visible area, refresh rate, and VBLANK timing values. -[Aaron Giles] -Fixed bug that prevented save/restore from working in the UI. -[Aaron Giles] - -Changed mode selection logic so that refresh is weighted more strongly -when picking a mode. This allows you to specify -resolution 0x0@60 to -force MAME to pick a 60Hz screen refresh while allowing it to choose -the best resolution. [Aaron Giles] +New games added or promoted from NOT_WORKING status +--------------------------------------------------- +Carrera (Version 6.7) [David Haywood] +Swinging Singles [Pierpaolo Prazzoli] New clones added ---------------- -Viper Phase 1 (World, New Version) [Corrado Tomaselli] -Wonder Boy in Monster Land (Galaxy Electronics English bootleg) -Gals Panic II (Asia) [Patrik Styrnell] +Lethal Enforcers (4 sets) [Patrik Styrnell, David Haywood] +Muroge Monaco (set 2) [Roberto Fresca] -0.107u1 +0.108u1 ------- MAMETesters Bugs Fixed ---------------------- -timecrsa0100u1gra [Luigi30] -inputduplication0106u7gra (nyny, joust, lghost, hyhoo) [Luigi30] -lastduel0106u7gra [Luigi30] -jdreddp0106u1gra [Luigi30] -bzone0104u7gra [Aaron Giles] -pturn0104u7gra [ShimaPong] -tsamurai0103gra [Aaron Giles] -pause0102gra [BUT] -mameini0107ora [Aaron Giles] -omegafc0107yel [Aaron Giles] -s2650_0106u11ora [Minuous] -syvalion0107yel [Aaron Giles] -congo0107red [Aaron Giles] +mbrush067gre [robiza] +bonzeadv0107u4red [robiza] Source Changes -------------- -Removed hard core dependency on samples. [Andrew Gardner] +Fixed some DIP switches in bigrun and wildplt, and changed UK region +to Europe in f1gpstar and f1gpstr2. [Sonikos] -Added what seems to be a proper fix for the background transparency -flag that was needed by champbwl to show the green background. -[Pierpaolo Prazzoli] +TIA-MC1 improvements: [Eugene Sandulenko] + - More documentation + - fixed inputs + - fixed video framerate and VSYNC delay + - adjusted CPU freq according to documentation + - removed hack with off-board video RAM + - implemented sound + - added NO_DUMP PROMs -Updates to the MagicFly driver: [Robert Fresca] - - Figured out the MC6845 (mapped at $0800-$0801) - - Fixed the screen size based on MC6845 registers. - - Fixed the visible area based on MC6845 registers. - - Corrected the gfx rom region. - - Solved the NMI/vblank issue. Now attract works. - - Changed CPU clock to 625khz. - - Added new findings to the technical notes. - - Marked magicfly PAL as NO_DUMP (read protected). +Improved documentation in the asteroids and tempest drivers. +[Brian Troha] -Fixed memory write ordering bug in the 68000 core. [Charles MacDonald] +Improved DIP switches and documentation in the Championship Bowling +driver. [Brian Troha] -Added some PPC602 specific opcodes and registers. [Ville Linde] +Major cleanup/rewrite of the NES PPU rendering code. [Brad Oliver] -Removed NEW_RENDER definition and all support for the old rendering -system from the core. Cleaned up a bunch of useless and deprecated -code as a result. [Aaron Giles] +Fixed protection in the world version of Virtua Bowling. [Brian Troha] -Massively rewrote the user interface to rely on the new rendering -systems. Broke the UI into multiple pieces (ui.c, uimenu.c, uigfx.c). -The code is now verging on readable. [Aaron Giles] +Fixed collision detection in Halley's Comet '87. [Brian Troha] -Renamed ui_popup to popmessage across the code, and implemented -popmessage in mame.c. This breaks the dependency between the core -driver code and the user interface in almost all cases. [Aaron Giles] +Added missing DIP switch to Hangman driver. [Wolfi] -Added a red background to serious warning messages in the vain hope -that people might take better notice. [Aaron Giles] +Added a callback to the 68000 emulator for the TAS instruction, +which allows different implementations based on external hardware. +[David Haywood] -Fixed vector game crashes with DirectDraw rendering. [Aaron Giles] +Namco System 22 update: [R. Belmont] + - Fixed ROM loading problems reported by Guru + - Hooked up Prop Cycle fan and lamp to the new output system -Consolidated live screen parameters into a screen_state structure. -Machine->visible_area[num] is now Machine->screen[num].visarea. -Machine->refresh_rate[num] is now Machine->screen[num].refresh. -[Aaron Giles] +Added new flag: VIDEO_ALWAYS_UPDATE, which causes the VIDEO_UPDATE +callback to be called even on skipped frames. This should be used +for games where the process of rendering has side effects such as +collision detection that need to always be present. [Aaron Giles] -Added new function configure_screen() which can control the width, -height, visible area, and refresh rate of each screen. This function -allows for widths and heights larger than what were specified in the -game driver, so you no longer have to specify the maximum width and -height in the driver, but can instead specify a typical width and -height. This function supercedes the old set_visible_area() and -set_refresh_rate() functions. The former has been rewritten to call -configure_screen(), while the latter has been removed entirely. -[Aaron Giles] +Fixed the new scanline timing functions to compute things +correctly and without using unnecessary timers. [Aaron Giles] -Changed the behavior for supporting overscan and other effects. The -width and height of a screen control the overall bitmap size. The -visible area of a screen specify its non-blanked boundaries (and -default visible area, as before). [Aaron Giles] +Fixed inputs in the Sega G80 vector games which were broken in the +last release cycle. [Aaron Giles] -Moved line-to-quad conversion routine into the core render.c as -another utility function. [Aaron Giles] +Began cleanup/rewrite of the Turbo driver: [Aaron Giles] + - proper video timings + - full memory map + - cleanup/simplification of the video code with better documentation + - some things are still broken, this is a WIP New games added or promoted from NOT_WORKING status --------------------------------------------------- -TomCat (Star Wars hardware, prototype) [Mathis Rosenhauer] -Poke Champ [David Haywood] +Space Bugger (set 2) [Tomasz Slanina] +Reaktor (Track & Field Conversion) [Col Turner] New clones added ---------------- -Dungeons & Dragons: Shadow over Mystara (Brazil 960223) [Brian Troha] +Ninja Ryukenden (Japan, set 2) [Patrik Styrnell] +Silent Dragon (US) [Patrik Styrnell]