From 33a691f1162df8c7e5ed44219160fa95abe91965 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Mon, 26 Oct 2015 19:18:43 +0100 Subject: [PATCH] timeplt.c: added presumed video enable, according to Shoestring's findings while creating a Time Pilot diagnostic ROM. Also merged memory maps (nw) --- src/mame/drivers/timeplt.c | 79 ++++++++++++------------------------- src/mame/includes/timeplt.h | 45 +++++++++++++-------- src/mame/video/timeplt.c | 50 ++++++++++++++--------- 3 files changed, 85 insertions(+), 89 deletions(-) diff --git a/src/mame/drivers/timeplt.c b/src/mame/drivers/timeplt.c index 52df64370bd..77d4d7623bf 100644 --- a/src/mame/drivers/timeplt.c +++ b/src/mame/drivers/timeplt.c @@ -34,7 +34,8 @@ c300 interrupt enable c302 flip screen c304 trigger interrupt on audio CPU - c308 Protection ??? Stuffs in some values computed from ROM content + c308 video enable (?). Protection ??? Stuffs in some values computed + from ROM content c30a coin counter 1 c30c coin counter 2 @@ -61,14 +62,14 @@ * *************************************/ -INTERRUPT_GEN_MEMBER(timeplt_state::timeplt_interrupt) +INTERRUPT_GEN_MEMBER(timeplt_state::interrupt) { if (m_nmi_enable) device.execute().set_input_line(INPUT_LINE_NMI, ASSERT_LINE); } -WRITE8_MEMBER(timeplt_state::timeplt_nmi_enable_w) +WRITE8_MEMBER(timeplt_state::nmi_enable_w) { m_nmi_enable = data & 1; if (!m_nmi_enable) @@ -83,7 +84,7 @@ WRITE8_MEMBER(timeplt_state::timeplt_nmi_enable_w) * *************************************/ -WRITE8_MEMBER(timeplt_state::timeplt_coin_counter_w) +WRITE8_MEMBER(timeplt_state::coincounter_w) { coin_counter_w(machine(), offset >> 1, data); } @@ -121,71 +122,39 @@ CUSTOM_INPUT_MEMBER(timeplt_state::chkun_hopper_status_r) * *************************************/ -static ADDRESS_MAP_START( timeplt_main_map, AS_PROGRAM, 8, timeplt_state ) +static ADDRESS_MAP_START( common_main_map, AS_PROGRAM, 8, timeplt_state ) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0000, 0x5fff) AM_ROM - AM_RANGE(0xa000, 0xa3ff) AM_RAM_WRITE(timeplt_colorram_w) AM_SHARE("colorram") - AM_RANGE(0xa400, 0xa7ff) AM_RAM_WRITE(timeplt_videoram_w) AM_SHARE("videoram") + AM_RANGE(0xa000, 0xa3ff) AM_RAM_WRITE(colorram_w) AM_SHARE("colorram") + AM_RANGE(0xa400, 0xa7ff) AM_RAM_WRITE(videoram_w) AM_SHARE("videoram") AM_RANGE(0xa800, 0xafff) AM_RAM AM_RANGE(0xb000, 0xb0ff) AM_MIRROR(0x0b00) AM_RAM AM_SHARE("spriteram") AM_RANGE(0xb400, 0xb4ff) AM_MIRROR(0x0b00) AM_RAM AM_SHARE("spriteram2") - AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x0cff) AM_WRITE(soundlatch_byte_w) - AM_RANGE(0xc200, 0xc200) AM_MIRROR(0x0cff) AM_WRITE(watchdog_reset_w) - AM_RANGE(0xc300, 0xc300) AM_MIRROR(0x0cf1) AM_WRITE(timeplt_nmi_enable_w) - AM_RANGE(0xc302, 0xc302) AM_MIRROR(0x0cf1) AM_WRITE(timeplt_flipscreen_w) - AM_RANGE(0xc304, 0xc304) AM_MIRROR(0x0cf1) AM_DEVWRITE("timeplt_audio", timeplt_audio_device, sh_irqtrigger_w) - AM_RANGE(0xc30a, 0xc30c) AM_MIRROR(0x0cf1) AM_WRITE(timeplt_coin_counter_w) - AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x0cff) AM_READ(timeplt_scanline_r) - AM_RANGE(0xc200, 0xc200) AM_MIRROR(0x0cff) AM_READ_PORT("DSW1") + AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x0cff) AM_READ(scanline_r) AM_WRITE(soundlatch_byte_w) + AM_RANGE(0xc200, 0xc200) AM_MIRROR(0x0cff) AM_READ_PORT("DSW1") AM_WRITE(watchdog_reset_w) AM_RANGE(0xc300, 0xc300) AM_MIRROR(0x0c9f) AM_READ_PORT("IN0") + AM_RANGE(0xc302, 0xc302) AM_MIRROR(0x0cf1) AM_WRITE(flipscreen_w) + AM_RANGE(0xc304, 0xc304) AM_MIRROR(0x0cf1) AM_DEVWRITE("timeplt_audio", timeplt_audio_device, sh_irqtrigger_w) + AM_RANGE(0xc30a, 0xc30c) AM_MIRROR(0x0cf1) AM_WRITE(coincounter_w) AM_RANGE(0xc320, 0xc320) AM_MIRROR(0x0c9f) AM_READ_PORT("IN1") AM_RANGE(0xc340, 0xc340) AM_MIRROR(0x0c9f) AM_READ_PORT("IN2") AM_RANGE(0xc360, 0xc360) AM_MIRROR(0x0c9f) AM_READ_PORT("DSW0") ADDRESS_MAP_END +static ADDRESS_MAP_START( timeplt_main_map, AS_PROGRAM, 8, timeplt_state ) + AM_IMPORT_FROM(common_main_map) + AM_RANGE(0xc300, 0xc300) AM_MIRROR(0x0cf1) AM_WRITE(nmi_enable_w) + AM_RANGE(0xc308, 0xc308) AM_MIRROR(0x0cf1) AM_WRITE(video_enable_w) +ADDRESS_MAP_END + static ADDRESS_MAP_START( psurge_main_map, AS_PROGRAM, 8, timeplt_state ) - ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x5fff) AM_ROM + AM_IMPORT_FROM(common_main_map) AM_RANGE(0x6004, 0x6004) AM_READ(psurge_protection_r) - AM_RANGE(0xa000, 0xa3ff) AM_RAM_WRITE(timeplt_colorram_w) AM_SHARE("colorram") - AM_RANGE(0xa400, 0xa7ff) AM_RAM_WRITE(timeplt_videoram_w) AM_SHARE("videoram") - AM_RANGE(0xa800, 0xafff) AM_RAM - AM_RANGE(0xb000, 0xb0ff) AM_MIRROR(0x0b00) AM_RAM AM_SHARE("spriteram") - AM_RANGE(0xb400, 0xb4ff) AM_MIRROR(0x0b00) AM_RAM AM_SHARE("spriteram2") - AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x0cff) AM_WRITE(soundlatch_byte_w) - AM_RANGE(0xc200, 0xc200) AM_MIRROR(0x0cff) AM_WRITE(watchdog_reset_w) - AM_RANGE(0xc302, 0xc302) AM_MIRROR(0x0cf1) AM_WRITE(timeplt_flipscreen_w) - AM_RANGE(0xc304, 0xc304) AM_MIRROR(0x0cf1) AM_DEVWRITE("timeplt_audio", timeplt_audio_device, sh_irqtrigger_w) - AM_RANGE(0xc30a, 0xc30c) AM_MIRROR(0x0cf1) AM_WRITE(timeplt_coin_counter_w) - AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x0cff) AM_READ(timeplt_scanline_r) - AM_RANGE(0xc200, 0xc200) AM_MIRROR(0x0cff) AM_READ_PORT("DSW1") - AM_RANGE(0xc300, 0xc300) AM_MIRROR(0x0c9f) AM_READ_PORT("IN0") - AM_RANGE(0xc320, 0xc320) AM_MIRROR(0x0c9f) AM_READ_PORT("IN1") - AM_RANGE(0xc340, 0xc340) AM_MIRROR(0x0c9f) AM_READ_PORT("IN2") - AM_RANGE(0xc360, 0xc360) AM_MIRROR(0x0c9f) AM_READ_PORT("DSW0") ADDRESS_MAP_END static ADDRESS_MAP_START( chkun_main_map, AS_PROGRAM, 8, timeplt_state ) - ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x5fff) AM_ROM + AM_IMPORT_FROM(timeplt_main_map) AM_RANGE(0x6000, 0x67ff) AM_RAM - AM_RANGE(0xa000, 0xa3ff) AM_RAM_WRITE(timeplt_colorram_w) AM_SHARE("colorram") - AM_RANGE(0xa400, 0xa7ff) AM_RAM_WRITE(timeplt_videoram_w) AM_SHARE("videoram") - AM_RANGE(0xa800, 0xafff) AM_RAM - AM_RANGE(0xb000, 0xb0ff) AM_MIRROR(0x0b00) AM_RAM AM_SHARE("spriteram") - AM_RANGE(0xb400, 0xb4ff) AM_MIRROR(0x0b00) AM_RAM AM_SHARE("spriteram2") - AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x0cff) AM_WRITE(soundlatch_byte_w) - AM_RANGE(0xc200, 0xc200) AM_MIRROR(0x0cff) AM_WRITE(watchdog_reset_w) - AM_RANGE(0xc300, 0xc300) AM_MIRROR(0x0cf1) AM_WRITE(timeplt_nmi_enable_w) - AM_RANGE(0xc302, 0xc302) AM_MIRROR(0x0cf1) AM_WRITE(timeplt_flipscreen_w) - AM_RANGE(0xc304, 0xc304) AM_MIRROR(0x0cf1) AM_DEVWRITE("timeplt_audio", timeplt_audio_device, sh_irqtrigger_w) - AM_RANGE(0xc30a, 0xc30c) AM_MIRROR(0x0cf1) AM_WRITE(timeplt_coin_counter_w) - AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x0cff) AM_READ(timeplt_scanline_r) - AM_RANGE(0xc200, 0xc200) AM_MIRROR(0x0cff) AM_READ_PORT("DSW1") - AM_RANGE(0xc300, 0xc300) AM_MIRROR(0x0c9f) AM_READ_PORT("IN0") - AM_RANGE(0xc320, 0xc320) AM_MIRROR(0x0c9f) AM_READ_PORT("IN1") - AM_RANGE(0xc340, 0xc340) AM_MIRROR(0x0c9f) AM_READ_PORT("IN2") - AM_RANGE(0xc360, 0xc360) AM_MIRROR(0x0c9f) AM_READ_PORT("DSW0") ADDRESS_MAP_END @@ -457,7 +426,7 @@ static MACHINE_CONFIG_START( timeplt, timeplt_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK/3/2) /* not confirmed, but common for Konami games of the era */ MCFG_CPU_PROGRAM_MAP(timeplt_main_map) - MCFG_CPU_VBLANK_INT_DRIVER("screen", timeplt_state, timeplt_interrupt) + MCFG_CPU_VBLANK_INT_DRIVER("screen", timeplt_state, interrupt) /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -465,7 +434,7 @@ static MACHINE_CONFIG_START( timeplt, timeplt_state ) MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_SIZE(32*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE_DRIVER(timeplt_state, screen_update_timeplt) + MCFG_SCREEN_UPDATE_DRIVER(timeplt_state, screen_update) MCFG_SCREEN_PALETTE("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", timeplt) @@ -483,6 +452,8 @@ static MACHINE_CONFIG_DERIVED( psurge, timeplt ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(psurge_main_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", timeplt_state, nmi_line_pulse) + + MCFG_VIDEO_START_OVERRIDE(timeplt_state,psurge) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( bikkuric, timeplt ) diff --git a/src/mame/includes/timeplt.h b/src/mame/includes/timeplt.h index e51da532aa9..93b390a8cf8 100644 --- a/src/mame/includes/timeplt.h +++ b/src/mame/includes/timeplt.h @@ -15,17 +15,20 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_tc8830f(*this, "tc8830f"), + m_gfxdecode(*this, "gfxdecode"), + m_screen(*this, "screen"), + m_palette(*this, "palette"), m_colorram(*this, "colorram"), m_videoram(*this, "videoram"), m_spriteram(*this, "spriteram"), - m_spriteram2(*this, "spriteram2"), - m_gfxdecode(*this, "gfxdecode"), - m_screen(*this, "screen"), - m_palette(*this, "palette") + m_spriteram2(*this, "spriteram2") { } required_device m_maincpu; optional_device m_tc8830f; + required_device m_gfxdecode; + required_device m_screen; + required_device m_palette; /* memory pointers */ required_shared_ptr m_colorram; @@ -33,33 +36,43 @@ public: required_shared_ptr m_spriteram; required_shared_ptr m_spriteram2; - required_device m_gfxdecode; - required_device m_screen; - required_device m_palette; - /* video-related */ tilemap_t *m_bg_tilemap; /* misc */ UINT8 m_nmi_enable; + bool m_video_enable; - DECLARE_WRITE8_MEMBER(timeplt_nmi_enable_w); - DECLARE_WRITE8_MEMBER(timeplt_coin_counter_w); + /* common */ + DECLARE_WRITE8_MEMBER(coincounter_w); + DECLARE_WRITE8_MEMBER(videoram_w); + DECLARE_WRITE8_MEMBER(colorram_w); + DECLARE_WRITE8_MEMBER(flipscreen_w); + DECLARE_READ8_MEMBER(scanline_r); + + /* all but psurge */ + DECLARE_WRITE8_MEMBER(nmi_enable_w); + DECLARE_WRITE8_MEMBER(video_enable_w); + + /* psurge */ DECLARE_READ8_MEMBER(psurge_protection_r); - DECLARE_WRITE8_MEMBER(timeplt_videoram_w); - DECLARE_WRITE8_MEMBER(timeplt_colorram_w); - DECLARE_WRITE8_MEMBER(timeplt_flipscreen_w); - DECLARE_READ8_MEMBER(timeplt_scanline_r); + + /* chkun */ DECLARE_CUSTOM_INPUT_MEMBER(chkun_hopper_status_r); DECLARE_WRITE8_MEMBER(chkun_sound_w); + TILE_GET_INFO_MEMBER(get_tile_info); TILE_GET_INFO_MEMBER(get_chkun_tile_info); + virtual void machine_start(); virtual void machine_reset(); virtual void video_start(); DECLARE_PALETTE_INIT(timeplt); DECLARE_VIDEO_START(chkun); - UINT32 screen_update_timeplt(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - INTERRUPT_GEN_MEMBER(timeplt_interrupt); + DECLARE_VIDEO_START(psurge); + + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ); + + INTERRUPT_GEN_MEMBER(interrupt); }; diff --git a/src/mame/video/timeplt.c b/src/mame/video/timeplt.c index cff9b230643..ab2e11bcec4 100644 --- a/src/mame/video/timeplt.c +++ b/src/mame/video/timeplt.c @@ -125,6 +125,15 @@ TILE_GET_INFO_MEMBER(timeplt_state::get_chkun_tile_info) void timeplt_state::video_start() { m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(timeplt_state::get_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); + m_video_enable = 0; + + save_item(NAME(m_video_enable)); +} + +VIDEO_START_MEMBER(timeplt_state,psurge) +{ + video_start(); + m_video_enable = 1; //psurge doesn't seem to have the video enable } VIDEO_START_MEMBER(timeplt_state,chkun) @@ -140,27 +149,31 @@ VIDEO_START_MEMBER(timeplt_state,chkun) * *************************************/ -WRITE8_MEMBER(timeplt_state::timeplt_videoram_w) +WRITE8_MEMBER(timeplt_state::videoram_w) { m_videoram[offset] = data; m_bg_tilemap->mark_tile_dirty(offset); } -WRITE8_MEMBER(timeplt_state::timeplt_colorram_w) +WRITE8_MEMBER(timeplt_state::colorram_w) { m_colorram[offset] = data; m_bg_tilemap->mark_tile_dirty(offset); } -WRITE8_MEMBER(timeplt_state::timeplt_flipscreen_w) +WRITE8_MEMBER(timeplt_state::flipscreen_w) { flip_screen_set(~data & 1); } +WRITE8_MEMBER(timeplt_state::video_enable_w) +{ + m_video_enable = data & 1; +} -READ8_MEMBER(timeplt_state::timeplt_scanline_r) +READ8_MEMBER(timeplt_state::scanline_r) { return m_screen->vpos(); } @@ -175,19 +188,15 @@ READ8_MEMBER(timeplt_state::timeplt_scanline_r) void timeplt_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) { - UINT8 *spriteram = m_spriteram; - UINT8 *spriteram_2 = m_spriteram2; - int offs; - - for (offs = 0x3e;offs >= 0x10;offs -= 2) + for (int offs = 0x3e;offs >= 0x10;offs -= 2) { - int sx = spriteram[offs]; - int sy = 241 - spriteram_2[offs + 1]; + int sx = m_spriteram[offs]; + int sy = 241 - m_spriteram2[offs + 1]; - int code = spriteram[offs + 1]; - int color = spriteram_2[offs] & 0x3f; - int flipx = ~spriteram_2[offs] & 0x40; - int flipy = spriteram_2[offs] & 0x80; + int code = m_spriteram[offs + 1]; + int color = m_spriteram2[offs] & 0x3f; + int flipx = ~m_spriteram2[offs] & 0x40; + int flipy = m_spriteram2[offs] & 0x80; m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, code, @@ -205,10 +214,13 @@ void timeplt_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprec * *************************************/ -UINT32 timeplt_state::screen_update_timeplt(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +UINT32 timeplt_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); - draw_sprites(bitmap, cliprect); - m_bg_tilemap->draw(screen, bitmap, cliprect, 1, 0); + if (m_video_enable) + { + m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + draw_sprites(bitmap, cliprect); + m_bg_tilemap->draw(screen, bitmap, cliprect, 1, 0); + } return 0; }