From 37f94e11ce857afe4a14720865ff34d276091dbf Mon Sep 17 00:00:00 2001 From: angelosa Date: Fri, 13 Sep 2024 21:28:12 +0200 Subject: [PATCH] funtech/supracan.cpp: implement lineselect for tilemaps --- src/mame/funtech/supracan.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/mame/funtech/supracan.cpp b/src/mame/funtech/supracan.cpp index 5dca6e64238..60f8f433434 100644 --- a/src/mame/funtech/supracan.cpp +++ b/src/mame/funtech/supracan.cpp @@ -225,6 +225,7 @@ private: uint16_t m_tilemap_mode[3]{}; uint16_t m_tilemap_tile_mode[3]{}; uint16_t m_tilemap_linescrollx_addr[3]{}; + uint16_t m_tilemap_lineselect_addr[3]{}; uint16_t m_window_control[2]{}; uint16_t m_window_start_addr[2]{}; @@ -1119,6 +1120,13 @@ uint32_t supracan_state::screen_update(screen_device &screen, bitmap_ind16 &bitm if (scrolly + y < 0 || scrolly + y > ((ysize * 8) - 1)) continue; + // slghtsag enables lineselect on load game + if (BIT(m_tilemap_tile_mode[layer], 11)) + { + int16_t lineselect = (int16_t)m_vram[((m_tilemap_lineselect_addr[layer] << 1) + y ) & 0xffff]; + realy = (lineselect + scrolly) & ((ysize * 8) - 1); + } + uint16_t *src = &src_bitmap.pix(realy & ((ysize * 8) - 1)); uint8_t *priop = &m_prio_bitmap.pix(y); int line_scroll_x = scrollx; @@ -1130,6 +1138,7 @@ uint32_t supracan_state::screen_update(screen_device &screen, bitmap_ind16 &bitm line_scroll_x += linescrollx; } + for (int x = cliprect.min_x; x <= cliprect.max_x; x++) { int actualx = x & mosaic_mask; @@ -2085,6 +2094,7 @@ void supracan_state::video_w(offs_t offset, uint16_t data, uint16_t mem_mask) 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; + case 0x10e/2: m_tilemap_lineselect_addr[0] = data; break; /* Tilemap 1 */ case 0x120/2: { @@ -2099,6 +2109,7 @@ void supracan_state::video_w(offs_t offset, uint16_t data, uint16_t mem_mask) 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; + case 0x12e/2: m_tilemap_lineselect_addr[1] = data; break; /* Tilemap 2 */ case 0x140/2: { @@ -2113,6 +2124,7 @@ void supracan_state::video_w(offs_t offset, uint16_t data, uint16_t mem_mask) 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; + case 0x14e/2: m_tilemap_lineselect_addr[2] = data; break; /* ROZ */ case 0x180/2: {