From 9ddc319f76320a695d027c9bc477f8d13f13d0ee Mon Sep 17 00:00:00 2001 From: DavidHaywood <28625134+DavidHaywood@users.noreply.github.com> Date: Sun, 24 Nov 2019 01:44:02 +0000 Subject: vt1682 - render sprites line by line, fix rasters on Place Kick title screen --- src/mame/drivers/vt1682.cpp | 102 ++++++++++++++++++++++---------------------- 1 file changed, 52 insertions(+), 50 deletions(-) diff --git a/src/mame/drivers/vt1682.cpp b/src/mame/drivers/vt1682.cpp index 6a16585b7a4..eda21547d33 100644 --- a/src/mame/drivers/vt1682.cpp +++ b/src/mame/drivers/vt1682.cpp @@ -1577,8 +1577,6 @@ READ8_MEMBER(vt_vt1682_state::vt1682_2010_bk1_xscroll_7_0_r) WRITE8_MEMBER(vt_vt1682_state::vt1682_2010_bk1_xscroll_7_0_w) { - m_screen->update_partial(m_screen->vpos()); - LOGMASKED(LOG_OTHER, "%s: vt1682_2010_bk1_xscroll_7_0_w writing: %02x\n", machine().describe_context(), data); m_xscroll_7_0_bk[0] = data; } @@ -1633,7 +1631,6 @@ READ8_MEMBER(vt_vt1682_state::vt1682_2012_bk1_scroll_control_r) WRITE8_MEMBER(vt_vt1682_state::vt1682_2012_bk1_scroll_control_w) { - m_screen->update_partial(m_screen->vpos()); LOGMASKED(LOG_OTHER, "%s: vt1682_2012_bk1_scroll_control_w writing: %02x (hclr: %1x page_layout:%1x ymsb:%1x xmsb:%1x)\n", machine().describe_context(), data, (data & 0x10) >> 4, (data & 0x0c) >> 2, (data & 0x02) >> 1, (data & 0x01) >> 0); @@ -1664,8 +1661,6 @@ READ8_MEMBER(vt_vt1682_state::vt1682_2013_bk1_main_control_r) WRITE8_MEMBER(vt_vt1682_state::vt1682_2013_bk1_main_control_w) { - m_screen->update_partial(m_screen->vpos()); - LOGMASKED(LOG_OTHER, "%s: vt1682_2013_bk1_main_control_w writing: %02x (enable:%01x palette:%01x depth:%01x bpp:%01x linemode:%01x tilesize:%01x)\n", machine().describe_context(), data, (data & 0x80) >> 7, (data & 0x40) >> 6, (data & 0x30) >> 4, (data & 0x0c) >> 2, (data & 0x02) >> 1, (data & 0x01) >> 0 ); @@ -1695,8 +1690,6 @@ READ8_MEMBER(vt_vt1682_state::vt1682_2014_bk2_xscroll_7_0_r) WRITE8_MEMBER(vt_vt1682_state::vt1682_2014_bk2_xscroll_7_0_w) { - m_screen->update_partial(m_screen->vpos()); - LOGMASKED(LOG_OTHER, "%s: vt1682_2014_bk2_xscroll_7_0_w writing: %02x\n", machine().describe_context(), data); m_xscroll_7_0_bk[1] = data; } @@ -1751,8 +1744,6 @@ READ8_MEMBER(vt_vt1682_state::vt1682_2016_bk2_scroll_control_r) WRITE8_MEMBER(vt_vt1682_state::vt1682_2016_bk2_scroll_control_w) { - m_screen->update_partial(m_screen->vpos()); - LOGMASKED(LOG_OTHER, "%s: vt1682_2016_bk2_scroll_control_w writing: %02x ((invalid): %1x page_layout:%1x ymsb:%1x xmsb:%1x)\n", machine().describe_context(), data, (data & 0x10) >> 4, (data & 0x0c) >> 2, (data & 0x02) >> 1, (data & 0x01) >> 0); @@ -1782,8 +1773,6 @@ READ8_MEMBER(vt_vt1682_state::vt1682_2017_bk2_main_control_r) WRITE8_MEMBER(vt_vt1682_state::vt1682_2017_bk2_main_control_w) { - m_screen->update_partial(m_screen->vpos()); - LOGMASKED(LOG_OTHER, "%s: vt1682_2017_bk2_main_control_w writing: %02x (enable:%01x palette:%01x depth:%01x bpp:%01x (invalid):%01x tilesize:%01x)\n", machine().describe_context(), data, (data & 0x80) >> 7, (data & 0x40) >> 6, (data & 0x30) >> 4, (data & 0x0c) >> 2, (data & 0x02) >> 1, (data & 0x01) >> 0 ); @@ -2024,8 +2013,6 @@ READ8_MEMBER(vt_vt1682_state::vt1682_2020_bk_linescroll_r) WRITE8_MEMBER(vt_vt1682_state::vt1682_2020_bk_linescroll_w) { - m_screen->update_partial(m_screen->vpos()); - LOGMASKED(LOG_OTHER, "%s: vt1682_2020_bk_linescroll_w writing: %02x\n", machine().describe_context(), data); m_2020_bk_linescroll = data; @@ -4826,56 +4813,71 @@ void vt_vt1682_state::draw_sprites(const rectangle& cliprect) if (sp_en) { - for (int i = 0; i < 240; i++) + for (int line = cliprect.min_y; line <= cliprect.max_y; line++) { - int tilenum = m_spriteram->read8((i * SPRITE_STEP) + 0); - int attr0 = m_spriteram->read8((i * SPRITE_STEP) + 1); - int x = m_spriteram->read8((i * SPRITE_STEP) + 2); - int attr1 = m_spriteram->read8((i * SPRITE_STEP) + 3); - int y = m_spriteram->read8((i * SPRITE_STEP) + 4); - int attr2 = m_spriteram->read8((i * SPRITE_STEP) + 5); + for (int i = 0; i < 240; i++) + { + int attr2 = m_spriteram->read8((i * SPRITE_STEP) + 5); - tilenum |= (attr0 & 0x0f) << 8; + int ystart = m_spriteram->read8((i * SPRITE_STEP) + 4); - if (!tilenum) // verified - continue; + if (attr2 & 0x01) + ystart -= 256; - int pal = (attr0 & 0xf0) >> 4; + int yend = ystart + ((sp_size & 0x2) ? 16 : 8); - int flipx = (attr1 & 0x02) >> 1; // might not function correctly on hardware - int flipy = (attr1 & 0x04) >> 2; + // TODO, cache first 16 sprites per scanline which meet the critera to a list during hblank, set overflow flag if more requested + // (do tilenum = 0 sprites count against this limit?) - int depth = (attr1 & 0x18) >> 3; + if (line >= ystart && line < yend) + { + int ytileline = line - ystart; + int tilenum = m_spriteram->read8((i * SPRITE_STEP) + 0); + int attr0 = m_spriteram->read8((i * SPRITE_STEP) + 1); + int x = m_spriteram->read8((i * SPRITE_STEP) + 2); + int attr1 = m_spriteram->read8((i * SPRITE_STEP) + 3); - if (attr2 & 0x01) - y -= 256; + tilenum |= (attr0 & 0x0f) << 8; - if (attr1 & 0x01) - x -= 256; + if (!tilenum) // verified + continue; - // guess! Maze Pac needs sprites shifted left by 1, but actual conditions might be more complex - //if ((!sp_size & 0x01)) - // x -= 1; + int pal = (attr0 & 0xf0) >> 4; - int palselect = 0; - if (sp_pal_sel) - { - // sprites are rendered to both buffers - palselect = 3; - } - else - { - if (attr2 & 0x02) - palselect = 2; - else - palselect = 1; - } + int flipx = (attr1 & 0x02) >> 1; // might not function correctly on hardware + int flipy = (attr1 & 0x04) >> 2; + + int depth = (attr1 & 0x18) >> 3; - draw_tile(segment, tilenum, x, y, palselect, pal, sp_size & 0x2, sp_size&0x1, 0, depth * 2, 0, flipx, flipy, cliprect); + if (attr1 & 0x01) + x -= 256; + + // guess! Maze Pac needs sprites shifted left by 1, but actual conditions might be more complex + //if ((!sp_size & 0x01)) + // x -= 1; + + int palselect = 0; + if (sp_pal_sel) + { + // sprites are rendered to both buffers + palselect = 3; + } + else + { + if (attr2 & 0x02) + palselect = 2; + else + palselect = 1; + } + + draw_tile_pixline(segment, tilenum, ytileline, x, line, palselect, pal, sp_size & 0x2, sp_size & 0x1, 0, depth * 2, 0, flipx, flipy, cliprect); + + } + } } + // if more than 16 sprites on any line 0x2001 bit 0x40 (SP_ERR) should be set (updated every line, can only be read in HBLANK) } - // if more than 16 sprites on any line 0x2001 bit 0x40 (SP_ERR) should be set (updated every line, can only be read in HBLANK) } uint32_t vt_vt1682_state::screen_update(screen_device& screen, bitmap_rgb32& bitmap, const rectangle& cliprect) @@ -5195,7 +5197,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(vt_vt1682_state::scanline) { int scanline = param; - //m_screen->update_partial(m_screen->vpos()); + m_screen->update_partial(m_screen->vpos()); if (scanline == 239) // 239 aligns highway racing title, but could actually depend on when registers get latched { -- cgit v1.2.3