From 12d5c2b1b9c51f44338c9b3274fc32b5ce690209 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 11 Nov 2022 21:21:21 +0100 Subject: namcos22: add text layer mid-screen x scroll updates --- src/mame/namco/namcos22.cpp | 9 ++++-- src/mame/namco/namcos22.h | 9 ++++-- src/mame/namco/namcos22_v.cpp | 67 +++++++++++++++++++++++++++---------------- 3 files changed, 56 insertions(+), 29 deletions(-) diff --git a/src/mame/namco/namcos22.cpp b/src/mame/namco/namcos22.cpp index 08c0a80e433..030bffa9548 100644 --- a/src/mame/namco/namcos22.cpp +++ b/src/mame/namco/namcos22.cpp @@ -30,16 +30,16 @@ TODO: + ridgerac waving flag shadowing + cybrcomm enemies should flash white when you shoot them, probably lighting related + timecris helicopter, car, grenade boxes should flash white when you shoot them (similar to cybrcomm) -- improve ss22 spot, used in dirtdash, alpinesa, testmode - not understood well: - + does not work at all on alpinesa highscore entry (maybe not spotram related?) +- improve ss22 spot, used in dirtdash, alpinesa highscore entry, testmode screen#14 - not understood well: + + does not work at all in alpinesa (uses spot_factor, not spotram, should show a spotlight with darkened background) + should be done before global fade, see dirtdash when starting at jungle level + should not apply to some of the sprites in dirtdash jungle level (eg. time/position) + + should not apply to some of the polygons either? see dirtdash jungle level moon + how is it enabled exactly? the enable bit in spotram is set in tokyowar too(which doesn't use spot) + what is the high bit in spot_factor for? not used anywhere + high bits in spot_data are unknown, maybe blend mode + testmode looks wrong, spot_data high bits is 0 here (2 in dirtdash) - PDP command 0xfff9, used in alpinr2b to modify titlescreen logo animation in pointram (should show a snow melting effect) -- support for text layer video partial updates after posirq, alpinesa does raster effects on it - alpha blended sprite/poly with priority over alpha blended text doesn't work right - alpinesa sprites on selection screen should not be fully alpha blended, only the drop shadow should - ss22 poly translucency is probably more limited than currently emulated, not supporting stacked layers @@ -3678,6 +3678,9 @@ void namcos22_state::machine_start() save_item(NAME(m_LitSurfaceCount)); save_item(NAME(m_LitSurfaceIndex)); save_item(NAME(m_tilemapattr)); + save_item(NAME(m_rowscroll)); + save_item(NAME(m_lastrow)); + save_item(NAME(m_rs_frame)); save_item(NAME(m_spot_factor)); save_item(NAME(m_text_palbase)); save_item(NAME(m_bg_palbase)); diff --git a/src/mame/namco/namcos22.h b/src/mame/namco/namcos22.h index 9831c31fb22..4575a403fb5 100644 --- a/src/mame/namco/namcos22.h +++ b/src/mame/namco/namcos22.h @@ -386,6 +386,8 @@ protected: TILE_GET_INFO_MEMBER(get_text_tile_info); virtual void draw_text_layer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + void update_text_rowscroll(); + void apply_text_scroll(); u32 screen_update_namcos22(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(namcos22_interrupt); INTERRUPT_GEN_MEMBER(dsp_vblank_irq); @@ -469,9 +471,12 @@ protected: std::unique_ptr m_pointrom; std::unique_ptr m_dirtypal; std::unique_ptr m_mix_bitmap; + tilemap_t *m_bgtilemap; u16 m_tilemapattr[8] = { }; - + u16 m_rowscroll[480] = { }; + u16 m_lastrow = 0; + u64 m_rs_frame = 0; int m_spot_factor = 0; int m_text_palbase = 0; int m_bg_palbase = 0; @@ -494,7 +499,7 @@ protected: DECLARE_WRITE_LINE_MEMBER(screen_vblank); bool m_pdp_render_done = false; bool m_render_refresh = false; - uint64_t m_pdp_frame = 0; + u64 m_pdp_frame = 0; u16 m_pdp_base = 0; }; diff --git a/src/mame/namco/namcos22_v.cpp b/src/mame/namco/namcos22_v.cpp index 8c0a75368a6..4c3b2602c98 100644 --- a/src/mame/namco/namcos22_v.cpp +++ b/src/mame/namco/namcos22_v.cpp @@ -1795,10 +1795,6 @@ TIMER_CALLBACK_MEMBER(namcos22_state::posirq_callback) if (m_irq_enabled & (1 << line)) { - // driver doesn't support partial updates yet - // partial updates here should apply to the text layer only, not the 3D framebuffer - //m_screen->update_partial(m_screen->vpos()); - m_irq_state |= (1 << line); m_maincpu->set_input_line(m_syscontrol[line] & 7, ASSERT_LINE); } @@ -1818,17 +1814,15 @@ void namcos22_state::namcos22_tilemapattr_w(offs_t offset, u16 data, u16 mem_mas 6: ? - unused? 7: R - ??? */ - COMBINE_DATA(&m_tilemapattr[offset]); - switch (offset) - { - case 4: - posirq_update(); - break; + // alpinesa changes x scroll mid-screen + if (offset == 0) + update_text_rowscroll(); - default: - break; - } + COMBINE_DATA(&m_tilemapattr[offset]); + + if (offset == 4) + posirq_update(); } u16 namcos22_state::namcos22_tilemapattr_r(offs_t offset) @@ -2063,13 +2057,41 @@ void namcos22_state::namcos22_mix_text_layer(screen_device &screen, bitmap_rgb32 } } -void namcos22_state::draw_text_layer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +void namcos22_state::update_text_rowscroll() { - int scroll_x = m_tilemapattr[0] - 0x35c; - int scroll_y = m_tilemapattr[1]; + u64 frame = m_screen->frame_number(); + if (frame != m_rs_frame) + { + m_rs_frame = frame; + m_lastrow = 0; + } + + int scroll_x = (m_tilemapattr[0] - 0x35c) & 0x3ff; + int y = std::min(m_screen->vpos(), 480); + + // save x scroll value until current scanline + for (int i = m_lastrow; i < y; i++) + m_rowscroll[i] = scroll_x; + m_lastrow = y; +} + +void namcos22_state::apply_text_scroll() +{ + update_text_rowscroll(); + int scroll_y = m_tilemapattr[1] & 0x3ff; - m_bgtilemap->set_scrollx(0, scroll_x & 0x3ff); - m_bgtilemap->set_scrolly(0, scroll_y & 0x3ff); + m_bgtilemap->set_scrolly(0, scroll_y); + for (int i = 0; i < 0x400; i++) + m_bgtilemap->set_scrollx(i, m_rowscroll[0]); + + // apply current frame x scroll updates to tilemap + for (int i = 0; i < 480; i++) + m_bgtilemap->set_scrollx((i + scroll_y + 4) & 0x3ff, m_rowscroll[i]); +} + +void namcos22_state::draw_text_layer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +{ + apply_text_scroll(); m_bgtilemap->set_palette_offset(m_text_palbase); m_bgtilemap->draw(screen, *m_mix_bitmap, cliprect, 0, 2, 3); @@ -2078,11 +2100,7 @@ void namcos22_state::draw_text_layer(screen_device &screen, bitmap_rgb32 &bitmap void namcos22s_state::draw_text_layer(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - int scroll_x = m_tilemapattr[0] - 0x35c; - int scroll_y = m_tilemapattr[1]; - - m_bgtilemap->set_scrollx(0, scroll_x & 0x3ff); - m_bgtilemap->set_scrolly(0, scroll_y & 0x3ff); + apply_text_scroll(); m_bgtilemap->set_palette_offset(m_text_palbase); m_bgtilemap->draw(screen, *m_mix_bitmap, cliprect, 0, 4, 4); @@ -2263,7 +2281,7 @@ void namcos22_state::update_mixer() if (!m_is_ss22) { strcat(msg1,"\n"); - for (i = 8; i <= 0x20; i += 8) + for (int i = 8; i <= 0x20; i += 8) { sprintf(msg2,"%04X %08X %08X %08X %08X\n", i*16, m_mixer[i*4+0], m_mixer[i*4+1], m_mixer[i*4+2], m_mixer[i*4+3]); strcat(msg1,msg2); @@ -2577,6 +2595,7 @@ void namcos22_state::video_start() m_mix_bitmap = std::make_unique(640, 480); m_bgtilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(namcos22_state::get_text_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 64); + m_bgtilemap->set_scroll_rows(64 * 16); // fake m_bgtilemap->set_transparent_pen(0xf); m_gfxdecode->gfx(0)->set_source((u8 *)m_cgram.target()); -- cgit v1.2.3