mirror of
https://github.com/holub/mame
synced 2025-06-05 20:33:45 +03:00
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:
parent
a8190b80e0
commit
58842fd57b
@ -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,
|
||||
|
@ -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 )
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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 )
|
||||
|
@ -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)
|
||||
|
@ -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 );
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 )
|
||||
|
Loading…
Reference in New Issue
Block a user