From 5ef1f5ec190b2124eed0ab2c0c23a69da2938da8 Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Tue, 8 Jan 2008 17:55:04 +0000 Subject: [PATCH] (With help from Mamesick) Implemented proper video timing and scanline interrupts. Fixes m72_0115u3yel --- src/mame/drivers/m72.c | 269 +++++++++++++++++++++++----------------- src/mame/includes/m72.h | 7 +- src/mame/video/m72.c | 102 +++++---------- 3 files changed, 192 insertions(+), 186 deletions(-) diff --git a/src/mame/drivers/m72.c b/src/mame/drivers/m72.c index a2ee2e1216f..47b24c5f690 100644 --- a/src/mame/drivers/m72.c +++ b/src/mame/drivers/m72.c @@ -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) diff --git a/src/mame/includes/m72.h b/src/mame/includes/m72.h index ccca0bd8d52..58ea04bb9f7 100644 --- a/src/mame/includes/m72.h +++ b/src/mame/includes/m72.h @@ -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 ); diff --git a/src/mame/video/m72.c b/src/mame/video/m72.c index a0d85fb21aa..86dfe810553 100644 --- a/src/mame/video/m72.c +++ b/src/mame/video/m72.c @@ -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);