summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mame/funtech/supracan.cpp17
1 files 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: {