Various tweaks/fixes from MAMEPlus:

* save state support for FD1094 chips
 * improved graphics in athena
 * improved sound balance in armedf
 * derived refresh rate for toaplan1 games
 * improved sound balance in tmnt games
 * derived clocks for suprridr
 * tweaked xmen visible area
 * derived clocks and refresh rate in twin16 driver
This commit is contained in:
Aaron Giles 2008-04-11 14:25:38 +00:00
parent a8190b80e0
commit 58842fd57b
11 changed files with 169 additions and 27 deletions

View File

@ -92,7 +92,7 @@ enum
XTAL_17_73447MHz = 17734470, /* 4 times the PAL subcarrier */
XTAL_18MHz = 18000000, /* S.A.R, Ikari Warriors 3 */
XTAL_18_432MHz = 18432000, /* Extremely common, used on 100's of PCBs */
XTAL_19_6608MHz = 19660800, /* Euro League (bootleg), labeled as "UKI 19.6608 20PF" */
XTAL_19_6608MHz = 19660800, /* Euro League (bootleg), labeled as "UKI 19.6608 20PF" */
XTAL_19_923MHz = 19923000, /* Cinematronics vectors */
XTAL_19_968MHz = 19968000, /* Used mostly by some Taito games */
XTAL_20MHz = 20000000,

View File

@ -835,10 +835,10 @@ static MACHINE_DRIVER_START( kodure )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MDRV_SOUND_ADD(DAC, 0)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
MDRV_SOUND_ADD(DAC, 0)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( armedf )

View File

@ -352,12 +352,12 @@ static const struct AY8910interface ay8910_interface =
static MACHINE_DRIVER_START( suprridr )
/* basic machine hardware */
MDRV_CPU_ADD(Z80, 10000000/4) /* just a guess */
MDRV_CPU_ADD(Z80, XTAL_49_152MHz/16) /* 3 MHz */
MDRV_CPU_PROGRAM_MAP(main_map,0)
MDRV_CPU_IO_MAP(main_portmap,0)
MDRV_CPU_VBLANK_INT("main", main_nmi_gen)
MDRV_CPU_ADD(Z80, 10000000/4) /* just a guess */
MDRV_CPU_ADD(Z80, 10000000/4) /* 2.5 MHz */
/* audio CPU */
MDRV_CPU_PROGRAM_MAP(sound_map,0)
MDRV_CPU_IO_MAP(sound_portmap,0)
@ -380,10 +380,10 @@ static MACHINE_DRIVER_START( suprridr )
/* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD(AY8910, 10000000/8)
MDRV_SOUND_ADD(AY8910, XTAL_49_152MHz/32)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MDRV_SOUND_ADD(AY8910, 10000000/8)
MDRV_SOUND_ADD(AY8910, XTAL_49_152MHz/32)
MDRV_SOUND_CONFIG(ay8910_interface)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_DRIVER_END

View File

@ -2563,13 +2563,13 @@ static MACHINE_DRIVER_START( blswhstl )
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, XTAL_3_579545MHz)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)
MDRV_SOUND_ROUTE(0, "left", 0.70)
MDRV_SOUND_ROUTE(1, "right", 0.70)
MDRV_SOUND_ADD(K053260, XTAL_3_579545MHz)
MDRV_SOUND_CONFIG(k053260_interface)
MDRV_SOUND_ROUTE(0, "right", 0.75) /* fixed inverted stereo channels */
MDRV_SOUND_ROUTE(1, "left", 0.75)
MDRV_SOUND_ROUTE(0, "right", 0.50) /* fixed inverted stereo channels */
MDRV_SOUND_ROUTE(1, "left", 0.50)
MACHINE_DRIVER_END
@ -2721,8 +2721,8 @@ static MACHINE_DRIVER_START( tmnt2 )
MDRV_SOUND_ADD(K053260, XTAL_3_579545MHz)
MDRV_SOUND_CONFIG(k053260_interface)
MDRV_SOUND_ROUTE(0, "left", 0.70)
MDRV_SOUND_ROUTE(1, "right", 0.70)
MDRV_SOUND_ROUTE(0, "left", 0.75)
MDRV_SOUND_ROUTE(1, "right", 0.75)
MACHINE_DRIVER_END
@ -2764,8 +2764,8 @@ static MACHINE_DRIVER_START( ssriders )
MDRV_SOUND_ADD(K053260, XTAL_3_579545MHz)
MDRV_SOUND_CONFIG(k053260_interface)
MDRV_SOUND_ROUTE(0, "left", 0.75)
MDRV_SOUND_ROUTE(1, "right", 0.75)
MDRV_SOUND_ROUTE(0, "left", 0.70)
MDRV_SOUND_ROUTE(1, "right", 0.70)
MACHINE_DRIVER_END
@ -2839,8 +2839,8 @@ static MACHINE_DRIVER_START( thndrx2 )
MDRV_SOUND_ADD(K053260, XTAL_3_579545MHz)
MDRV_SOUND_CONFIG(k053260_interface)
MDRV_SOUND_ROUTE(0, "left", 0.70)
MDRV_SOUND_ROUTE(1, "right", 0.70)
MDRV_SOUND_ROUTE(0, "left", 0.75)
MDRV_SOUND_ROUTE(1, "right", 0.75)
MACHINE_DRIVER_END

View File

@ -1357,7 +1357,7 @@ static MACHINE_DRIVER_START( zerowing )
MDRV_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK)
MDRV_SCREEN_ADD("main", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_REFRESH_RATE( (28000000.0 / 4) / (450 * 282) ) /* fixed by SUZ */
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(432, 262) /* copied these from toaplan2, to be verified */
MDRV_SCREEN_VISIBLE_AREA(0, 319, 16, 255)

View File

@ -71,6 +71,7 @@ extern VIDEO_UPDATE( twin16 );
extern VIDEO_EOF( twin16 );
extern VIDEO_UPDATE( vulcan );
extern void twin16_spriteram_process( void );
UINT16 twin16_custom_video;
@ -958,11 +959,11 @@ static MACHINE_DRIVER_START( twin16 )
/* audio CPU */
MDRV_CPU_PROGRAM_MAP(readmem_sound,writemem_sound)
MDRV_CPU_ADD(M68000, 10000000)
MDRV_CPU_ADD(M68000, XTAL_18_432MHz/2)
MDRV_CPU_PROGRAM_MAP(readmem_sub,writemem_sub)
MDRV_CPU_VBLANK_INT("main", CPUB_interrupt)
MDRV_CPU_ADD(M68000, 10000000)
MDRV_CPU_ADD(M68000, XTAL_18_432MHz/2)
MDRV_CPU_PROGRAM_MAP(readmem,writemem)
MDRV_CPU_VBLANK_INT("main", CPUA_interrupt)
@ -972,7 +973,7 @@ static MACHINE_DRIVER_START( twin16 )
MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM)
MDRV_SCREEN_ADD("main", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_REFRESH_RATE(((double)XTAL_18_432MHz / 2) / (576 * 264))
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(40*8, 32*8)
@ -1069,6 +1070,7 @@ static MACHINE_DRIVER_START( mia )
MDRV_SCREEN_MODIFY("main")
MDRV_SCREEN_VISIBLE_AREA(1*8, 39*8-1, 2*8, 30*8-1)
MDRV_VIDEO_START(fround)
MACHINE_DRIVER_END
static MACHINE_DRIVER_START( vulcan )

View File

@ -494,8 +494,7 @@ static MACHINE_DRIVER_START( xmen )
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(64*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(14*8, (64-14)*8-1, 2*8, 30*8-1 )
MDRV_SCREEN_VISIBLE_AREA(13*8, (64-13)*8-1, 2*8, 30*8-1 ) /* correct, same issue of TMNT2 */
MDRV_PALETTE_LENGTH(2048)
MDRV_VIDEO_START(xmen)

View File

@ -31,6 +31,7 @@ extern VIDEO_START( snk );
extern VIDEO_START( sgladiat );
extern VIDEO_UPDATE( tnk3 );
extern VIDEO_UPDATE( athena );
extern VIDEO_UPDATE( ikari );
extern VIDEO_UPDATE( tdfever );
extern VIDEO_UPDATE( gwar );

View File

@ -26,6 +26,9 @@ static UINT16 *fd1094_cacheregion[CACHE_ENTRIES]; // a cache region where CACHE_
static int fd1094_cached_states[CACHE_ENTRIES]; // array of cached state numbers
static int fd1094_current_cacheposition; // current position in cache array
static int fd1094_state;
static int fd1094_selected_state;
static void (*fd1094_set_decrypted)(UINT8 *);
void *fd1094_get_decrypted_base(void)
@ -52,6 +55,16 @@ static void fd1094_setstate_and_decrypt(int state)
int i;
UINT32 addr;
switch (state & 0x300)
{
case 0x000:
case FD1094_STATE_RESET:
fd1094_selected_state = state & 0xff;
break;
}
fd1094_state = state;
cpunum_set_info_int(0, CPUINFO_INT_REGISTER + M68K_PREF_ADDR, 0x0010); // force a flush of the prefetch cache
/* set the FD1094 state ready to decrypt.. */
@ -142,6 +155,20 @@ void fd1094_machine_init(void)
cpunum_set_irq_callback(0, fd1094_int_callback);
}
static STATE_POSTLOAD( fd1094_postload )
{
if (fd1094_state != -1)
{
int selected_state = fd1094_selected_state;
int state = fd1094_state;
fd1094_machine_init();
fd1094_setstate_and_decrypt(selected_state);
fd1094_setstate_and_decrypt(state);
}
}
#ifdef ENABLE_DEBUGGER
static void key_changed(void)
@ -186,7 +213,8 @@ void fd1094_driver_init(void (*set_decrypted)(UINT8 *))
fd1094_cacheregion[i] = auto_malloc(fd1094_cpuregionsize);
fd1094_cached_states[i] = -1;
}
fd1094_current_cacheposition = 0;
fd1094_current_cacheposition = 0;
fd1094_state = -1;
#ifdef ENABLE_DEBUGGER
/* key debugging */
@ -196,4 +224,8 @@ void fd1094_driver_init(void (*set_decrypted)(UINT8 *))
fd1094_init_debugging(REGION_CPU1, REGION_USER1, REGION_USER2, key_changed);
}
#endif
state_save_register_global(fd1094_selected_state);
state_save_register_global(fd1094_state);
state_save_register_postload(Machine, fd1094_postload, NULL);
}

View File

@ -22,6 +22,9 @@ static UINT16* s24_fd1094_cacheregion[S16_NUMCACHE]; // a cache region where S16
static int fd1094_cached_states[S16_NUMCACHE]; // array of cached state numbers
static int fd1094_current_cacheposition; // current position in cache array
static int fd1094_state;
static int fd1094_selected_state;
/* this function checks the cache to see if the current state is cached,
if it is then it copies the cached data to the user region where code is
executed from, if its not cached then it gets decrypted to the current
@ -31,6 +34,16 @@ static void s24_fd1094_setstate_and_decrypt(int state)
int i;
UINT32 addr;
switch (state & 0x300)
{
case 0x000:
case FD1094_STATE_RESET:
fd1094_selected_state = state & 0xff;
break;
}
fd1094_state = state;
cpunum_set_info_int(1, CPUINFO_INT_REGISTER + M68K_PREF_ADDR, 0x0010); // force a flush of the prefetch cache
/* set the s24_fd1094 state ready to decrypt.. */
@ -123,6 +136,20 @@ void s24_fd1094_machine_init(void)
cpunum_set_irq_callback(1, s24_fd1094_int_callback);
}
static STATE_POSTLOAD( s24_fd1094_postload )
{
if (fd1094_state != -1)
{
int selected_state = fd1094_selected_state;
int state = fd1094_state;
s24_fd1094_machine_init();
s24_fd1094_setstate_and_decrypt(selected_state);
s24_fd1094_setstate_and_decrypt(state);
}
}
/* startup function, to be called from DRIVER_INIT (once on startup) */
void s24_fd1094_driver_init(void)
{
@ -146,4 +173,10 @@ void s24_fd1094_driver_init(void)
fd1094_cached_states[i] = -1;
fd1094_current_cacheposition = 0;
fd1094_state = -1;
state_save_register_global(fd1094_selected_state);
state_save_register_global(fd1094_state);
state_save_register_postload(Machine, s24_fd1094_postload, NULL);
}

View File

@ -169,6 +169,7 @@ static void tnk3_draw_sprites(running_machine *machine, bitmap_t *bitmap, const
const gfx_element *gfx = machine->gfx[2];
int tile_number, attributes, color, sx, sy;
int yflip;
int offs;
for(offs = 0; offs < 50*4; offs+=4)
@ -176,9 +177,8 @@ static void tnk3_draw_sprites(running_machine *machine, bitmap_t *bitmap, const
if(*(UINT32*)(spriteram+offs) == 0 || *(UINT32*)(spriteram+offs) == -1) continue;
tile_number = spriteram[offs+1];
attributes = spriteram[offs+3]; /* YBBX.CCCC */
attributes = spriteram[offs+3]; /* YBFX.CCCC */
if(attributes & 0x40) tile_number |= 256;
if(attributes & 0x20) tile_number |= 512;
color = attributes & 0xf;
sx = xscroll - spriteram[offs+2];
@ -189,8 +189,9 @@ static void tnk3_draw_sprites(running_machine *machine, bitmap_t *bitmap, const
sy &= 0x1ff;
if (sx > 512-16) sx -= 512;
if (sy > 512-16) sy -= 512;
yflip = attributes & 0x20;
drawgfx(bitmap,gfx,tile_number,color,0,0,sx,sy,cliprect,TRANSPARENCY_PEN_TABLE,7);
drawgfx(bitmap,gfx,tile_number,color,0,yflip,sx,sy,cliprect,TRANSPARENCY_PEN_TABLE,7);
}
}
@ -237,6 +238,80 @@ VIDEO_UPDATE( tnk3 )
return 0;
}
void athena_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int xscroll, int yscroll )
{
const gfx_element *gfx = machine->gfx[2];
int tile_number, attributes, color, sx, sy;
int offs;
for(offs = 0; offs < 50*4; offs+=4)
{
if(*(UINT32*)(spriteram+offs) == 0 || *(UINT32*)(spriteram+offs) == -1) continue;
tile_number = spriteram[offs+1];
attributes = spriteram[offs+3]; /* YBBX.CCCC */
if(attributes & 0x40) tile_number |= 256;
if(attributes & 0x20) tile_number |= 512;
color = attributes & 0xf;
sx = xscroll - spriteram[offs+2];
if(!(attributes & 0x80)) sx += 256;
sy = -yscroll + spriteram[offs];
if(attributes & 0x10) sy += 256;
sx &= 0x1ff;
sy &= 0x1ff;
if (sx > 512-16) sx -= 512;
if (sy > 512-16) sy -= 512;
drawgfx(bitmap,gfx,tile_number,color,0,0,sx,sy,cliprect,TRANSPARENCY_PEN_TABLE,7);
}
}
/* Same as tnk3 but sprite attribute bit 5 is extra bank bit instead of y-flip. */
VIDEO_UPDATE( athena )
{
UINT8 *ram = snk_rambase - 0xd000;
int attributes = ram[0xc800];
/*
X-------
-X------ character bank (for text layer)
--X-----
---X---- scrolly MSB (background)
----X--- scrolly MSB (sprites)
-----X--
------X- scrollx MSB (background)
-------X scrollx MSB (sprites)
*/
/* to be moved to memmap */
spriteram = &ram[0xd000];
{
int bg_scrollx = -ram[0xcc00] + 15;
int bg_scrolly = -ram[0xcb00] + 8;
if(attributes & 0x02) bg_scrollx += 256;
if(attributes & 0x10) bg_scrolly += 256;
tnk3_draw_background(screen->machine, bitmap, cliprect, bg_scrollx, bg_scrolly, 64, 64, 0 );
}
{
int sp_scrollx = ram[0xca00] + 29;
int sp_scrolly = ram[0xc900] + 9;
if(attributes & 0x01) sp_scrollx += 256;
if(attributes & 0x08) sp_scrolly += 256;
athena_draw_sprites(screen->machine, bitmap, cliprect, sp_scrollx, sp_scrolly );
}
{
int bank = (attributes & 0x40) ? 1:0;
tnk3_draw_text(screen->machine, bitmap, cliprect, bank, &ram[0xf800] );
tnk3_draw_status(screen->machine, bitmap, cliprect, bank, &ram[0xfc00] );
}
return 0;
}
/************************************************************************************/
VIDEO_START( sgladiat )