(With help from Mamesick)

Implemented proper video timing and scanline interrupts.
Fixes m72_0115u3yel
This commit is contained in:
Aaron Giles 2008-01-08 17:55:04 +00:00
parent bc7e03ec5e
commit 5ef1f5ec19
3 changed files with 192 additions and 186 deletions

View File

@ -78,10 +78,67 @@ kengo 0x18 --------------
#include "m72.h"
/* in video/m72.c */
#define MASTER_CLOCK XTAL_32MHz
#define SOUND_CLOCK XTAL_3_579545MHz
static UINT16 *protection_ram;
static emu_timer *scanline_timer;
static UINT8 m72_irq_base;
static TIMER_CALLBACK( m72_scanline_interrupt );
/***************************************************************************/
static MACHINE_START( m72 )
{
scanline_timer = timer_alloc(m72_scanline_interrupt, NULL);
}
static MACHINE_RESET( m72 )
{
m72_irq_base = 0x20;
machine_reset_m72_sound(machine);
timer_adjust(scanline_timer, video_screen_get_time_until_pos(0, 0, 0), 0, attotime_never);
}
static MACHINE_RESET( xmultipl )
{
m72_irq_base = 0x08;
machine_reset_m72_sound(machine);
timer_adjust(scanline_timer, video_screen_get_time_until_pos(0, 0, 0), 0, attotime_never);
}
static MACHINE_RESET( kengo )
{
m72_irq_base = 0x18;
machine_reset_m72_sound(machine);
timer_adjust(scanline_timer, video_screen_get_time_until_pos(0, 0, 0), 0, attotime_never);
}
static TIMER_CALLBACK( m72_scanline_interrupt )
{
int scanline = param;
/* raster interrupt - visible area only? */
if (scanline < 256 && scanline == m72_raster_irq_position - 128)
{
video_screen_update_partial(0, scanline);
cpunum_set_input_line_and_vector(0, 0, HOLD_LINE, m72_irq_base + 2);
}
/* VBLANK interrupt */
else if (scanline == 256)
{
video_screen_update_partial(0, scanline);
cpunum_set_input_line_and_vector(0, 0, HOLD_LINE, m72_irq_base + 0);
}
/* adjust for next scanline */
if (++scanline >= machine->screen[0].height)
scanline = 0;
timer_adjust(scanline_timer, video_screen_get_time_until_pos(0, scanline, 0), scanline, attotime_never);
}
@ -1863,27 +1920,26 @@ static const struct YM2151interface ym2151_interface =
static MACHINE_DRIVER_START( rtype )
/* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(rtype_map,0)
MDRV_CPU_IO_MAP(m72_portmap,0)
MDRV_CPU_VBLANK_INT(m72_interrupt,256)
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_ADD(Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_ram_map,0)
MDRV_CPU_IO_MAP(sound_portmap,0)
/* IRQs are generated by main Z80 and YM2151 */
MDRV_SCREEN_REFRESH_RATE(55)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_MACHINE_START(m72)
MDRV_MACHINE_RESET(m72)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 16*8, (64-16)*8-1 )
MDRV_GFXDECODE(m72)
MDRV_PALETTE_LENGTH(512)
MDRV_SCREEN_ADD("main", 0)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_VIDEO_START(m72)
MDRV_VIDEO_UPDATE(m72)
@ -1891,7 +1947,7 @@ static MACHINE_DRIVER_START( rtype )
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, 3579545)
MDRV_SOUND_ADD(YM2151, SOUND_CLOCK)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)
@ -1930,28 +1986,27 @@ ADDRESS_MAP_END
static MACHINE_DRIVER_START( m72 )
/* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(m72_map,0)
MDRV_CPU_IO_MAP(m72_portmap,0)
MDRV_CPU_VBLANK_INT(m72_interrupt,256)
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_ADD(Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_ram_map,0)
MDRV_CPU_IO_MAP(sound_portmap,0)
MDRV_CPU_VBLANK_INT(fake_nmi,128) /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
MDRV_SCREEN_REFRESH_RATE(55)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_MACHINE_START(m72)
MDRV_MACHINE_RESET(m72)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 16*8, (64-16)*8-1 )
MDRV_GFXDECODE(m72)
MDRV_PALETTE_LENGTH(512)
MDRV_SCREEN_ADD("main", 0)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_VIDEO_START(m72)
MDRV_VIDEO_UPDATE(m72)
@ -1959,7 +2014,7 @@ static MACHINE_DRIVER_START( m72 )
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, 3579545)
MDRV_SOUND_ADD(YM2151, SOUND_CLOCK)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)
@ -1982,28 +2037,27 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( dkgenm72 )
/* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(m72_map,0)
MDRV_CPU_IO_MAP(m72_portmap,0)
MDRV_CPU_VBLANK_INT(m72_interrupt,256)
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_ADD(Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_ram_map,0)
MDRV_CPU_IO_MAP(sound_portmap,0)
MDRV_CPU_VBLANK_INT(fake_nmi,128) /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
MDRV_SCREEN_REFRESH_RATE(55)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_MACHINE_START(m72)
MDRV_MACHINE_RESET(xmultipl)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 16*8, (64-16)*8-1 )
MDRV_GFXDECODE(m72)
MDRV_PALETTE_LENGTH(512)
MDRV_SCREEN_ADD("main", 0)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_VIDEO_START(m72)
MDRV_VIDEO_UPDATE(m72)
@ -2011,7 +2065,7 @@ static MACHINE_DRIVER_START( dkgenm72 )
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, 3579545)
MDRV_SOUND_ADD(YM2151, SOUND_CLOCK)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)
@ -2025,28 +2079,27 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( xmultipl )
/* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(xmultipl_map,0)
MDRV_CPU_IO_MAP(m72_portmap,0)
MDRV_CPU_VBLANK_INT(m72_interrupt,256)
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_ADD(Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_ram_map,0)
MDRV_CPU_IO_MAP(sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
MDRV_SCREEN_REFRESH_RATE(55)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_MACHINE_START(m72)
MDRV_MACHINE_RESET(xmultipl)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 16*8, (64-16)*8-1 )
MDRV_GFXDECODE(m72)
MDRV_PALETTE_LENGTH(512)
MDRV_SCREEN_ADD("main", 0)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_VIDEO_START(m72)
MDRV_VIDEO_UPDATE(m72)
@ -2054,7 +2107,7 @@ static MACHINE_DRIVER_START( xmultipl )
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, 3579545)
MDRV_SOUND_ADD(YM2151, SOUND_CLOCK)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)
@ -2068,27 +2121,27 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( dbreed )
/* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(dbreed_map,0)
MDRV_CPU_IO_MAP(hharry_portmap,0)
MDRV_CPU_VBLANK_INT(m72_interrupt,256)
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_ADD(Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
MDRV_SCREEN_REFRESH_RATE(55)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_MACHINE_START(m72)
MDRV_MACHINE_RESET(xmultipl)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 16*8, (64-16)*8-1 )
MDRV_GFXDECODE(rtype2)
MDRV_PALETTE_LENGTH(512)
MDRV_SCREEN_ADD("main", 0)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_VIDEO_START(hharry)
MDRV_VIDEO_UPDATE(m72)
@ -2096,7 +2149,7 @@ static MACHINE_DRIVER_START( dbreed )
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, 3579545)
MDRV_SOUND_ADD(YM2151, SOUND_CLOCK)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)
@ -2109,35 +2162,32 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( dbreed72 )
/* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(dbreed72_map,0)
MDRV_CPU_IO_MAP(m72_portmap,0)
MDRV_CPU_VBLANK_INT(m72_interrupt,256)
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_ADD(Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_ram_map,0)
MDRV_CPU_IO_MAP(sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
MDRV_SCREEN_REFRESH_RATE(55)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_MACHINE_START(m72)
MDRV_MACHINE_RESET(xmultipl)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 16*8, (64-16)*8-1 )
MDRV_GFXDECODE(m72)
MDRV_PALETTE_LENGTH(512)
MDRV_VIDEO_START(m72)
MDRV_VIDEO_UPDATE(m72)
MDRV_SCREEN_ADD("main", 0)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, 3579545)
MDRV_SOUND_ADD(YM2151, SOUND_CLOCK)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)
@ -2151,28 +2201,27 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( rtype2 )
/* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(rtype2_map,0)
MDRV_CPU_IO_MAP(rtype2_portmap,0)
MDRV_CPU_VBLANK_INT(m72_interrupt,256)
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_ADD(Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
MDRV_SCREEN_REFRESH_RATE(55)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_MACHINE_START(m72)
MDRV_MACHINE_RESET(m72)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 16*8, (64-16)*8-1 )
MDRV_GFXDECODE(rtype2)
MDRV_PALETTE_LENGTH(512)
MDRV_SCREEN_ADD("main", 0)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_VIDEO_START(rtype2)
MDRV_VIDEO_UPDATE(m72)
@ -2180,7 +2229,7 @@ static MACHINE_DRIVER_START( rtype2 )
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, 3579545)
MDRV_SOUND_ADD(YM2151, SOUND_CLOCK)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)
@ -2193,28 +2242,27 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( majtitle )
/* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(majtitle_map,0)
MDRV_CPU_IO_MAP(majtitle_portmap,0)
MDRV_CPU_VBLANK_INT(m72_interrupt,256)
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_ADD(Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
MDRV_SCREEN_REFRESH_RATE(55)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_MACHINE_START(m72)
MDRV_MACHINE_RESET(m72)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 16*8, (64-16)*8-1 )
MDRV_GFXDECODE(majtitle)
MDRV_PALETTE_LENGTH(512)
MDRV_SCREEN_ADD("main", 0)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_VIDEO_START(majtitle)
MDRV_VIDEO_UPDATE(majtitle)
@ -2222,7 +2270,7 @@ static MACHINE_DRIVER_START( majtitle )
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, 3579545)
MDRV_SOUND_ADD(YM2151, SOUND_CLOCK)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)
@ -2235,28 +2283,27 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( hharry )
/* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(hharry_map,0)
MDRV_CPU_IO_MAP(hharry_portmap,0)
MDRV_CPU_VBLANK_INT(m72_interrupt,256)
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_ADD(Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
MDRV_SCREEN_REFRESH_RATE(55)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_MACHINE_START(m72)
MDRV_MACHINE_RESET(xmultipl)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 16*8, (64-16)*8-1 )
MDRV_GFXDECODE(rtype2)
MDRV_PALETTE_LENGTH(512)
MDRV_SCREEN_ADD("main", 0)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_VIDEO_START(hharry)
MDRV_VIDEO_UPDATE(m72)
@ -2264,7 +2311,7 @@ static MACHINE_DRIVER_START( hharry )
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, 3579545)
MDRV_SOUND_ADD(YM2151, SOUND_CLOCK)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)
@ -2278,28 +2325,27 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( hharryu )
/* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(hharryu_map,0)
MDRV_CPU_IO_MAP(rtype2_portmap,0)
MDRV_CPU_VBLANK_INT(m72_interrupt,256)
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_ADD(Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
MDRV_SCREEN_REFRESH_RATE(55)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_MACHINE_START(m72)
MDRV_MACHINE_RESET(xmultipl)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 16*8, (64-16)*8-1 )
MDRV_GFXDECODE(rtype2)
MDRV_PALETTE_LENGTH(512)
MDRV_SCREEN_ADD("main", 0)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_VIDEO_START(rtype2)
MDRV_VIDEO_UPDATE(m72)
@ -2307,7 +2353,7 @@ static MACHINE_DRIVER_START( hharryu )
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, 3579545)
MDRV_SOUND_ADD(YM2151, SOUND_CLOCK)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)
@ -2321,27 +2367,27 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( poundfor )
/* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(rtype2_map,0)
MDRV_CPU_IO_MAP(poundfor_portmap,0)
MDRV_CPU_VBLANK_INT(m72_interrupt,256)
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_ADD(Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(poundfor_sound_portmap,0)
MDRV_CPU_VBLANK_INT(fake_nmi,128) /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
MDRV_SCREEN_REFRESH_RATE(55)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_MACHINE_START(m72)
MDRV_MACHINE_RESET(m72)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 16*8, (64-16)*8-1 )
MDRV_GFXDECODE(rtype2)
MDRV_PALETTE_LENGTH(512)
MDRV_SCREEN_ADD("main", 0)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_VIDEO_START(poundfor)
MDRV_VIDEO_UPDATE(m72)
@ -2349,7 +2395,7 @@ static MACHINE_DRIVER_START( poundfor )
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, 3579545)
MDRV_SOUND_ADD(YM2151, SOUND_CLOCK)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)
@ -2362,28 +2408,27 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( kengo )
/* basic machine hardware */
MDRV_CPU_ADD(V30,32000000/4) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_ADD(V30,MASTER_CLOCK/2/2) /* 16 MHz external freq (8MHz internal) */
MDRV_CPU_PROGRAM_MAP(kengo_map,0)
MDRV_CPU_IO_MAP(kengo_portmap,0)
MDRV_CPU_VBLANK_INT(m72_interrupt,256)
MDRV_CPU_ADD(Z80, 3579545)
MDRV_CPU_ADD(Z80, SOUND_CLOCK)
MDRV_CPU_PROGRAM_MAP(sound_rom_map,0)
MDRV_CPU_IO_MAP(rtype2_sound_portmap,0)
MDRV_CPU_VBLANK_INT(nmi_line_pulse,128) /* clocked by V1? (Vigilante) */
/* IRQs are generated by main Z80 and YM2151 */
MDRV_SCREEN_REFRESH_RATE(55)
MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
MDRV_MACHINE_START(m72)
MDRV_MACHINE_RESET(kengo)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(512, 512)
MDRV_SCREEN_VISIBLE_AREA(8*8, (64-8)*8-1, 16*8, (64-16)*8-1 )
MDRV_GFXDECODE(rtype2)
MDRV_PALETTE_LENGTH(512)
MDRV_SCREEN_ADD("main", 0)
MDRV_SCREEN_RAW_PARAMS(MASTER_CLOCK/4, 512, 64, 448, 284, 0, 256)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_VIDEO_START(poundfor)
MDRV_VIDEO_UPDATE(m72)
@ -2391,7 +2436,7 @@ static MACHINE_DRIVER_START( kengo )
/* sound hardware */
MDRV_SPEAKER_STANDARD_STEREO("left", "right")
MDRV_SOUND_ADD(YM2151, 3579545)
MDRV_SOUND_ADD(YM2151, SOUND_CLOCK)
MDRV_SOUND_CONFIG(ym2151_interface)
MDRV_SOUND_ROUTE(0, "left", 1.0)
MDRV_SOUND_ROUTE(1, "right", 1.0)

View File

@ -7,12 +7,7 @@
/*----------- defined in video/m72.c -----------*/
extern UINT16 *m72_videoram1,*m72_videoram2,*majtitle_rowscrollram;
MACHINE_RESET( m72 );
MACHINE_RESET( xmultipl );
MACHINE_RESET( kengo );
INTERRUPT_GEN( m72_interrupt );
extern UINT32 m72_raster_irq_position;
VIDEO_START( m72 );
VIDEO_START( rtype2 );

View File

@ -5,59 +5,12 @@
UINT16 *m72_videoram1,*m72_videoram2,*majtitle_rowscrollram;
UINT32 m72_raster_irq_position;
static UINT16 *m72_spriteram;
static INT32 splitline;
static tilemap *fg_tilemap,*bg_tilemap;
static int xadjust;
static int bgadjust;
static INT32 scrollx1,scrolly1,scrollx2,scrolly2;
static INT32 video_off;
static int irqbase;
MACHINE_RESET( m72 )
{
irqbase = 0x20;
machine_reset_m72_sound(machine);
}
MACHINE_RESET( xmultipl )
{
irqbase = 0x08;
machine_reset_m72_sound(machine);
}
MACHINE_RESET( kengo )
{
irqbase = 0x18;
machine_reset_m72_sound(machine);
}
INTERRUPT_GEN( m72_interrupt )
{
int line = 255 - cpu_getiloops();
if (line == 255) /* vblank */
{
cpunum_set_input_line_and_vector(0, 0, HOLD_LINE, irqbase+0);
}
else
{
if (line != splitline - 128)
return;
video_screen_update_partial(0, line + 128);
/* this is used to do a raster effect and show the score display at
the bottom of the screen or other things. The line where the
interrupt happens is programmable (and the interrupt can be triggered
multiple times, by changing the interrupt line register in the
interrupt handler).
*/
cpunum_set_input_line_and_vector(0, 0, HOLD_LINE, irqbase+2);
}
}
/***************************************************************************
@ -156,7 +109,7 @@ static TILEMAP_MAPPER( majtitle_scan_rows )
static void register_savestate(void)
{
state_save_register_global(splitline);
state_save_register_global(m72_raster_irq_position);
state_save_register_global(video_off);
state_save_register_global(scrollx1);
state_save_register_global(scrolly1);
@ -183,8 +136,11 @@ VIDEO_START( m72 )
memset(m72_spriteram,0,spriteram_size);
xadjust = 0;
bgadjust = 0;
tilemap_set_scrolldx(fg_tilemap,0,0);
tilemap_set_scrolldy(fg_tilemap,-128,16);
tilemap_set_scrolldx(bg_tilemap,0,0);
tilemap_set_scrolldy(bg_tilemap,-128,16);
register_savestate();
}
@ -206,8 +162,11 @@ VIDEO_START( rtype2 )
memset(m72_spriteram,0,spriteram_size);
xadjust = -4;
bgadjust = 0;
tilemap_set_scrolldx(fg_tilemap,4,0);
tilemap_set_scrolldy(fg_tilemap,-128,16);
tilemap_set_scrolldx(bg_tilemap,4,0);
tilemap_set_scrolldy(bg_tilemap,-128,16);
register_savestate();
}
@ -216,7 +175,8 @@ VIDEO_START( poundfor )
{
video_start_rtype2(machine);
xadjust = -6;
tilemap_set_scrolldx(fg_tilemap,6,0);
tilemap_set_scrolldx(bg_tilemap,6,0);
}
@ -241,8 +201,11 @@ VIDEO_START( majtitle )
memset(m72_spriteram,0,spriteram_size);
xadjust = -4;
bgadjust = 0;
tilemap_set_scrolldx(fg_tilemap,4,0);
tilemap_set_scrolldy(fg_tilemap,-128,16);
tilemap_set_scrolldx(bg_tilemap,4,0);
tilemap_set_scrolldy(bg_tilemap,-128,16);
register_savestate();
}
@ -264,8 +227,11 @@ VIDEO_START( hharry )
memset(m72_spriteram,0,spriteram_size);
xadjust = -4;
bgadjust = -2;
tilemap_set_scrolldx(fg_tilemap,4,0);
tilemap_set_scrolldy(fg_tilemap,-128,16);
tilemap_set_scrolldx(bg_tilemap,6,0);
tilemap_set_scrolldy(bg_tilemap,-128,16);
register_savestate();
}
@ -338,7 +304,7 @@ WRITE16_HANDLER( m72_videoram2_w )
WRITE16_HANDLER( m72_irq_line_w )
{
COMBINE_DATA(&splitline);
COMBINE_DATA(&m72_raster_irq_position);
}
WRITE16_HANDLER( m72_scrollx1_w )
@ -447,7 +413,7 @@ static void m72_draw_sprites(running_machine *machine, mame_bitmap *bitmap,const
code = m72_spriteram[offs+1];
color = m72_spriteram[offs+2] & 0x0f;
sx = -256+(m72_spriteram[offs+3] & 0x3ff);
sy = 512-(m72_spriteram[offs+0] & 0x1ff);
sy = 384-(m72_spriteram[offs+0] & 0x1ff);
flipx = m72_spriteram[offs+2] & 0x0800;
flipy = m72_spriteram[offs+2] & 0x0400;
@ -458,7 +424,7 @@ static void m72_draw_sprites(running_machine *machine, mame_bitmap *bitmap,const
if (flip_screen)
{
sx = 512 - 16*w - sx;
sy = 512 - 16*h - sy;
sy = 284 - 16*h - sy;
flipx = !flipx;
flipy = !flipy;
}
@ -499,7 +465,7 @@ static void majtitle_draw_sprites(running_machine *machine, mame_bitmap *bitmap,
code = spriteram16_2[offs+1];
color = spriteram16_2[offs+2] & 0x0f;
sx = -256+(spriteram16_2[offs+3] & 0x3ff);
sy = 512-(spriteram16_2[offs+0] & 0x1ff);
sy = 384-(spriteram16_2[offs+0] & 0x1ff);
flipx = spriteram16_2[offs+2] & 0x0800;
flipy = spriteram16_2[offs+2] & 0x0400;
@ -510,7 +476,7 @@ static void majtitle_draw_sprites(running_machine *machine, mame_bitmap *bitmap,
if (flip_screen)
{
sx = 512 - 16*w - sx;
sy = 512 - 16*h - sy;
sy = 256 - 16*h - sy;
flipx = !flipx;
flipy = !flipy;
}
@ -545,10 +511,10 @@ VIDEO_UPDATE( m72 )
return 0;
}
tilemap_set_scrollx(fg_tilemap,0,scrollx1 + xadjust);
tilemap_set_scrollx(fg_tilemap,0,scrollx1);
tilemap_set_scrolly(fg_tilemap,0,scrolly1);
tilemap_set_scrollx(bg_tilemap,0,scrollx2 + xadjust + bgadjust);
tilemap_set_scrollx(bg_tilemap,0,scrollx2);
tilemap_set_scrolly(bg_tilemap,0,scrolly2);
tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1,0);
@ -570,7 +536,7 @@ VIDEO_UPDATE( majtitle )
return 0;
}
tilemap_set_scrollx(fg_tilemap,0,scrollx1 + xadjust);
tilemap_set_scrollx(fg_tilemap,0,scrollx1);
tilemap_set_scrolly(fg_tilemap,0,scrolly1);
if (majtitle_rowscroll)
@ -578,12 +544,12 @@ VIDEO_UPDATE( majtitle )
tilemap_set_scroll_rows(bg_tilemap,512);
for (i = 0;i < 512;i++)
tilemap_set_scrollx(bg_tilemap,(i+scrolly2)&0x1ff,
256 + majtitle_rowscrollram[i] + xadjust);
256 + majtitle_rowscrollram[i]);
}
else
{
tilemap_set_scroll_rows(bg_tilemap,1);
tilemap_set_scrollx(bg_tilemap,0,256 + scrollx2 + xadjust);
tilemap_set_scrollx(bg_tilemap,0,256 + scrollx2);
}
tilemap_set_scrolly(bg_tilemap,0,scrolly2);