From d75b6cd0cbd61ae2be5823c009f1235e4e478618 Mon Sep 17 00:00:00 2001 From: angelosa Date: Tue, 10 Sep 2024 18:58:17 +0200 Subject: funtech/supracan.cpp: implement linescroll x --- src/mame/funtech/supracan.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/mame/funtech/supracan.cpp b/src/mame/funtech/supracan.cpp index 1ce7320e39c..ffec6a05d43 100644 --- a/src/mame/funtech/supracan.cpp +++ b/src/mame/funtech/supracan.cpp @@ -227,6 +227,7 @@ private: uint16_t m_tilemap_flags[3]{}; uint16_t m_tilemap_mode[3]{}; uint16_t m_tilemap_tile_mode[3]{}; + uint16_t m_tilemap_linescrollx_addr[3]{}; uint32_t m_roz_base_addr = 0; uint16_t m_roz_mode = 0; @@ -1093,14 +1094,22 @@ uint32_t supracan_state::screen_update(screen_device &screen, bitmap_ind16 &bitm uint16_t *src = &src_bitmap.pix(realy & ((ysize * 8) - 1)); uint8_t *priop = &m_prio_bitmap.pix(y); + int line_scroll_x = scrollx; + + // formduel main menu + if (BIT(m_tilemap_tile_mode[layer], 14)) + { + int16_t linescrollx = (int16_t)m_vram[((m_tilemap_linescrollx_addr[layer] << 1) + y) & 0xffff]; + line_scroll_x += linescrollx; + } for (int x = cliprect.min_x; x <= cliprect.max_x; x++) { int actualx = x & mosaic_mask; - int realx = actualx + scrollx; + int realx = actualx + line_scroll_x; if (!wrap) - if (scrollx + x < 0 || scrollx + x > ((xsize * 8) - 1)) + if (line_scroll_x + x < 0 || line_scroll_x + x > ((xsize * 8) - 1)) continue; uint16_t srcpix = src[realx & ((xsize * 8) - 1)]; @@ -1943,6 +1952,7 @@ void supracan_state::video_w(offs_t offset, uint16_t data, uint16_t mem_mask) visarea.set(0, (h320_mode ? 320 : 256) - 1, 8, 232 - 1); m_screen->configure(htotal, 262, visarea, attotime::from_ticks(htotal * 262, U13_CLOCK / divider).as_attoseconds()); + //m_screen->reset_origin(0, 0); } m_video_flags = data; @@ -1991,6 +2001,7 @@ void supracan_state::video_w(offs_t offset, uint16_t data, uint16_t mem_mask) case 0x106/2: m_tilemap_scrolly[0] = data; LOGMASKED(LOG_TILEMAP0, "tilemap_scrolly[0] = %04x\n", data); break; case 0x108/2: m_tilemap_base_addr[0] = data << 1; LOGMASKED(LOG_TILEMAP0, "tilemap_base_addr[0] = %05x\n", data << 2); break; case 0x10a/2: m_tilemap_mode[0] = data; LOGMASKED(LOG_TILEMAP0, "tilemap_mode[0] = %04x\n", data); break; + case 0x10c/2: m_tilemap_linescrollx_addr[0] = data; break; /* Tilemap 1 */ case 0x120/2: { @@ -2004,6 +2015,7 @@ void supracan_state::video_w(offs_t offset, uint16_t data, uint16_t mem_mask) case 0x126/2: m_tilemap_scrolly[1] = data; LOGMASKED(LOG_TILEMAP1, "tilemap_scrolly[1] = %04x\n", data); break; case 0x128/2: m_tilemap_base_addr[1] = data << 1; LOGMASKED(LOG_TILEMAP1, "tilemap_base_addr[1] = %05x\n", data << 2); break; case 0x12a/2: m_tilemap_mode[1] = data; LOGMASKED(LOG_TILEMAP1, "tilemap_mode[1] = %04x\n", data); break; + case 0x12c/2: m_tilemap_linescrollx_addr[1] = data; break; /* Tilemap 2 */ case 0x140/2: { @@ -2017,6 +2029,7 @@ void supracan_state::video_w(offs_t offset, uint16_t data, uint16_t mem_mask) case 0x146/2: m_tilemap_scrolly[2] = data; LOGMASKED(LOG_TILEMAP2, "tilemap_scrolly[2] = %04x\n", data); break; case 0x148/2: m_tilemap_base_addr[2] = data << 1; LOGMASKED(LOG_TILEMAP2, "tilemap_base_addr[2] = %05x\n", data << 2); break; case 0x14a/2: m_tilemap_mode[2] = data; LOGMASKED(LOG_TILEMAP2, "tilemap_mode[2] = %04x\n", data); break; + case 0x14c/2: m_tilemap_linescrollx_addr[2] = data; break; /* ROZ */ case 0x180/2: { -- cgit v1.2.3