From bbdb1f169fcfe03e12f8e34968645efba9e398bb Mon Sep 17 00:00:00 2001 From: Angelo Salese Date: Wed, 14 Nov 2012 18:40:56 +0000 Subject: [PATCH] Various clean-ups of dec8 HW, added irq ack mechanism to Shackled, Last Mission and Captain Silver (they were commented out before) and hooked up SCREEN_RAW_PARAMS to all games in the driver [Angelo Salese] --- src/mame/drivers/dec8.c | 121 ++++++++++++++++++++-------------------- src/mame/video/dec8.c | 15 ++--- 2 files changed, 64 insertions(+), 72 deletions(-) diff --git a/src/mame/drivers/dec8.c b/src/mame/drivers/dec8.c index 0ac75ea195e..f42f6f6916a 100644 --- a/src/mame/drivers/dec8.c +++ b/src/mame/drivers/dec8.c @@ -458,7 +458,7 @@ WRITE8_MEMBER(dec8_state::ghostb_bank_w) membank("bank1")->set_entry(data >> 4); if ((data&1)==0) m_maincpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE); - if (data & 2) m_nmi_enable =1; else m_nmi_enable = 0; + m_nmi_enable = (data & 2) >> 1; flip_screen_set(data & 0x08); } @@ -533,10 +533,6 @@ WRITE8_MEMBER(dec8_state::oscar_int_w) /* Used by Shackled, Last Mission, Captain Silver */ WRITE8_MEMBER(dec8_state::shackled_int_w) { -#if 0 -/* This is correct, but the cpus in Shackled need an interleave of about 5000! - With lower interleave CPU 0 misses an interrupt at the start of the game - (The last interrupt has not finished and been ack'd when the new one occurs */ switch (offset) { case 0: /* CPU 2 - IRQ acknowledge */ @@ -554,23 +550,6 @@ WRITE8_MEMBER(dec8_state::shackled_int_w) m_subcpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE); return; } -#endif - - switch (offset) - { - case 0: /* CPU 2 - IRQ acknowledge */ - return; - case 1: /* CPU 1 - IRQ acknowledge */ - return; - case 2: /* i8751 - FIRQ acknowledge */ - return; - case 3: /* IRQ 1 */ - m_maincpu->set_input_line(M6809_IRQ_LINE, HOLD_LINE); - return; - case 4: /* IRQ 2 */ - m_subcpu->set_input_line(M6809_IRQ_LINE, HOLD_LINE); - return; - } } /******************************************************************************/ @@ -2025,6 +2004,16 @@ void dec8_state::machine_reset() } } +// MCFG_SCREEN_RAW_PARAMS(DEC8_PIXEL_CLOCK, DEC8_HTOTAL, DEC8_HBEND, DEC8_HBSTART, DEC8_VTOTAL, DEC8_VBEND, DEC8_VBSTART) + +/* TODO: These are raw guesses, only to get ~57,41 Hz, assume to be the same as dec0 */ +#define DEC8_PIXEL_CLOCK XTAL_20MHz/4 +#define DEC8_HTOTAL 256+74 +#define DEC8_HBEND 0 +#define DEC8_HBSTART 256 +#define DEC8_VTOTAL 264 +#define DEC8_VBEND 8 +#define DEC8_VBSTART 256-8 static MACHINE_CONFIG_START( lastmisn, dec8_state ) @@ -2038,8 +2027,8 @@ static MACHINE_CONFIG_START( lastmisn, dec8_state ) MCFG_CPU_ADD("audiocpu", M6502, 1500000) MCFG_CPU_PROGRAM_MAP(ym3526_s_map) /* NMIs are caused by the main CPU */ - MCFG_QUANTUM_TIME(attotime::from_hz(12000)) + MCFG_QUANTUM_TIME(attotime::from_hz(12000)) /* video hardware */ MCFG_BUFFERED_SPRITERAM8_ADD("spriteram") @@ -2048,10 +2037,11 @@ static MACHINE_CONFIG_START( lastmisn, dec8_state ) deco_karnovsprites_device::set_gfx_region(*device, 1); MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) +// MCFG_SCREEN_REFRESH_RATE(58) +// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) +// MCFG_SCREEN_SIZE(32*8, 32*8) +// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) + MCFG_SCREEN_RAW_PARAMS(DEC8_PIXEL_CLOCK, DEC8_HTOTAL, DEC8_HBEND, DEC8_HBSTART, DEC8_VTOTAL, DEC8_VBEND, DEC8_VBSTART) MCFG_SCREEN_UPDATE_DRIVER(dec8_state, screen_update_lastmisn) MCFG_GFXDECODE(shackled) @@ -2085,8 +2075,9 @@ static MACHINE_CONFIG_START( shackled, dec8_state ) MCFG_CPU_ADD("audiocpu", M6502, 1500000) MCFG_CPU_PROGRAM_MAP(ym3526_s_map) /* NMIs are caused by the main CPU */ - MCFG_QUANTUM_TIME(attotime::from_hz(4800)) +// MCFG_QUANTUM_TIME(attotime::from_hz(100000)) + MCFG_QUANTUM_PERFECT_CPU("maincpu") // needs heavy sync, otherwise one of the two CPUs will miss an irq and makes the game to hang /* video hardware */ MCFG_BUFFERED_SPRITERAM8_ADD("spriteram") @@ -2095,10 +2086,11 @@ static MACHINE_CONFIG_START( shackled, dec8_state ) deco_karnovsprites_device::set_gfx_region(*device, 1); MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) +// MCFG_SCREEN_REFRESH_RATE(58) +// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) +// MCFG_SCREEN_SIZE(32*8, 32*8) +// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) + MCFG_SCREEN_RAW_PARAMS(DEC8_PIXEL_CLOCK, DEC8_HTOTAL, DEC8_HBEND, DEC8_HBSTART, DEC8_VTOTAL, DEC8_VBEND, DEC8_VBSTART) MCFG_SCREEN_UPDATE_DRIVER(dec8_state, screen_update_shackled) MCFG_GFXDECODE(shackled) @@ -2142,10 +2134,11 @@ static MACHINE_CONFIG_START( gondo, dec8_state ) deco_karnovsprites_device::set_gfx_region(*device, 1); MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) +// MCFG_SCREEN_REFRESH_RATE(58) +// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) +// MCFG_SCREEN_SIZE(32*8, 32*8) +// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) + MCFG_SCREEN_RAW_PARAMS(DEC8_PIXEL_CLOCK, DEC8_HTOTAL, DEC8_HBEND, DEC8_HBSTART, DEC8_VTOTAL, DEC8_VBEND, DEC8_VBSTART) MCFG_SCREEN_UPDATE_DRIVER(dec8_state, screen_update_gondo) MCFG_SCREEN_VBLANK_DRIVER(dec8_state, screen_eof_dec8) @@ -2190,10 +2183,11 @@ static MACHINE_CONFIG_START( garyoret, dec8_state ) deco_karnovsprites_device::set_gfx_region(*device, 1); MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) +// MCFG_SCREEN_REFRESH_RATE(58) +// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) +// MCFG_SCREEN_SIZE(32*8, 32*8) +// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) + MCFG_SCREEN_RAW_PARAMS(DEC8_PIXEL_CLOCK, DEC8_HTOTAL, DEC8_HBEND, DEC8_HBSTART, DEC8_VTOTAL, DEC8_VBEND, DEC8_VBSTART) MCFG_SCREEN_UPDATE_DRIVER(dec8_state, screen_update_garyoret) MCFG_SCREEN_VBLANK_DRIVER(dec8_state, screen_eof_dec8) @@ -2241,10 +2235,11 @@ static MACHINE_CONFIG_START( ghostb, dec8_state ) deco_karnovsprites_device::set_gfx_region(*device, 1); MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) +// MCFG_SCREEN_REFRESH_RATE(58) +// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) +// MCFG_SCREEN_SIZE(32*8, 32*8) +// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) + MCFG_SCREEN_RAW_PARAMS(DEC8_PIXEL_CLOCK, DEC8_HTOTAL, DEC8_HBEND, DEC8_HBSTART, DEC8_VTOTAL, DEC8_VBEND, DEC8_VBSTART) MCFG_SCREEN_UPDATE_DRIVER(dec8_state, screen_update_ghostb) MCFG_SCREEN_VBLANK_DRIVER(dec8_state, screen_eof_dec8) @@ -2281,8 +2276,8 @@ static MACHINE_CONFIG_START( csilver, dec8_state ) MCFG_CPU_ADD("audiocpu", M6502, XTAL_12MHz/8) /* verified on pcb */ MCFG_CPU_PROGRAM_MAP(csilver_s_map) /* NMIs are caused by the main CPU */ - MCFG_QUANTUM_TIME(attotime::from_hz(6000)) + MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* video hardware */ MCFG_BUFFERED_SPRITERAM8_ADD("spriteram") @@ -2291,10 +2286,11 @@ static MACHINE_CONFIG_START( csilver, dec8_state ) deco_karnovsprites_device::set_gfx_region(*device, 1); MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) +// MCFG_SCREEN_REFRESH_RATE(58) +// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) +// MCFG_SCREEN_SIZE(32*8, 32*8) +// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) + MCFG_SCREEN_RAW_PARAMS(DEC8_PIXEL_CLOCK, DEC8_HTOTAL, DEC8_HBEND, DEC8_HBSTART, DEC8_VTOTAL, DEC8_VBEND, DEC8_VBSTART) MCFG_SCREEN_UPDATE_DRIVER(dec8_state, screen_update_lastmisn) MCFG_GFXDECODE(shackled) @@ -2346,10 +2342,11 @@ static MACHINE_CONFIG_START( oscar, dec8_state ) deco_mxc06_device::set_gfx_region(*device, 1); MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) +// MCFG_SCREEN_REFRESH_RATE(58) +// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* 58Hz, 529ms Vblank duration */) +// MCFG_SCREEN_SIZE(32*8, 32*8) +// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) + MCFG_SCREEN_RAW_PARAMS(DEC8_PIXEL_CLOCK, DEC8_HTOTAL, DEC8_HBEND, DEC8_HBSTART, DEC8_VTOTAL, DEC8_VBEND, DEC8_VBSTART) MCFG_SCREEN_UPDATE_DRIVER(dec8_state, screen_update_oscar) MCFG_GFXDECODE(oscar) @@ -2387,10 +2384,11 @@ static MACHINE_CONFIG_START( srdarwin, dec8_state ) MCFG_BUFFERED_SPRITERAM8_ADD("spriteram") MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) +// MCFG_SCREEN_REFRESH_RATE(58) +// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) +// MCFG_SCREEN_SIZE(32*8, 32*8) +// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) + MCFG_SCREEN_RAW_PARAMS(DEC8_PIXEL_CLOCK, DEC8_HTOTAL, DEC8_HBEND, DEC8_HBSTART, DEC8_VTOTAL, DEC8_VBEND, DEC8_VBSTART) MCFG_SCREEN_UPDATE_DRIVER(dec8_state, screen_update_srdarwin) MCFG_GFXDECODE(srdarwin) @@ -2437,10 +2435,11 @@ static MACHINE_CONFIG_START( cobracom, dec8_state ) MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(58) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) - MCFG_SCREEN_SIZE(32*8, 32*8) - MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) +// MCFG_SCREEN_REFRESH_RATE(58) +// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(529) /* 58Hz, 529ms Vblank duration */) +// MCFG_SCREEN_SIZE(32*8, 32*8) +// MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1) + MCFG_SCREEN_RAW_PARAMS(DEC8_PIXEL_CLOCK, DEC8_HTOTAL, DEC8_HBEND, DEC8_HBSTART, DEC8_VTOTAL, DEC8_VBEND, DEC8_VBSTART) MCFG_SCREEN_UPDATE_DRIVER(dec8_state, screen_update_cobracom) MCFG_GFXDECODE(cobracom) diff --git a/src/mame/video/dec8.c b/src/mame/video/dec8.c index ddbe37f83ba..19c1128d3ef 100644 --- a/src/mame/video/dec8.c +++ b/src/mame/video/dec8.c @@ -265,7 +265,6 @@ static void srdarwin_draw_sprites( running_machine& machine, bitmap_ind16 &bitma UINT32 dec8_state::screen_update_cobracom(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - flip_screen_set(m_bg_control[0] >> 7); machine().device("tilegen1")->deco_bac06_pf_draw(machine(),bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00); @@ -301,7 +300,6 @@ VIDEO_START_MEMBER(dec8_state,cobracom) m_game_uses_priority = 0; machine().device("tilegen1")->set_colmask(0x3); machine().device("tilegen2")->set_colmask(0x3); - } /******************************************************************************/ @@ -371,7 +369,6 @@ VIDEO_START_MEMBER(dec8_state,oscar) m_game_uses_priority = 1; machine().device("tilegen1")->set_colmask(0x7); - } /******************************************************************************/ @@ -413,7 +410,7 @@ TILE_GET_INFO_MEMBER(dec8_state::get_lastmisn_tile_info) int tile = m_bg_data[offs + 1] + (m_bg_data[offs] << 8); int color = tile >> 12; - if (color > 7 && m_game_uses_priority) + if (color & 8 && m_game_uses_priority) tileinfo.category = 1; else tileinfo.category = 0; @@ -464,7 +461,7 @@ UINT32 dec8_state::screen_update_srdarwin(screen_device &screen, bitmap_ind16 &b m_bg_tilemap->set_scrollx(0, (m_scroll2[0] << 8) + m_scroll2[1]); m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0); - srdarwin_draw_sprites(machine(), bitmap, cliprect, 0); //* (srdarwin37b5gre) + srdarwin_draw_sprites(machine(), bitmap, cliprect, 0); m_bg_tilemap->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0); srdarwin_draw_sprites(machine(), bitmap, cliprect, 1); m_fix_tilemap->draw(bitmap, cliprect, 0, 0); @@ -476,10 +473,7 @@ TILE_GET_INFO_MEMBER(dec8_state::get_srdarwin_fix_tile_info) int tile = m_videoram[tile_index]; int color = 0; /* ? */ - if (color > 1) - tileinfo.category = 1; - else - tileinfo.category = 0; + tileinfo.category = 0; SET_TILE_INFO_MEMBER( 0, @@ -488,7 +482,6 @@ TILE_GET_INFO_MEMBER(dec8_state::get_srdarwin_fix_tile_info) 0); } -//AT: improved priority and fixed stage 4+ crashes caused by bank overflow TILE_GET_INFO_MEMBER(dec8_state::get_srdarwin_tile_info) { int tile = m_bg_data[2 * tile_index + 1] + (m_bg_data[2 * tile_index] << 8); @@ -564,7 +557,7 @@ TILE_GET_INFO_MEMBER(dec8_state::get_gondo_tile_info) int tile = m_bg_data[offs + 1] + (m_bg_data[offs] << 8); int color = tile>> 12; - if (color > 7 && m_game_uses_priority) + if (color & 8 && m_game_uses_priority) tileinfo.category = 1; else tileinfo.category = 0;