From 9904ea5b8b17dbd5d420976cb8004e710d744c47 Mon Sep 17 00:00:00 2001 From: gm-matthew <108370479+gm-matthew@users.noreply.github.com> Date: Tue, 4 Nov 2025 16:07:03 +0000 Subject: [PATCH 1/2] sega/model2: tilemap fixes If all three layers (polygon, tilemap A, tilemap B) are transparent, palette entry #0 from tilemap B is shown --- src/mame/sega/model2_v.cpp | 10 ++++++++-- src/mame/sega/segaic24.cpp | 5 +++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/mame/sega/model2_v.cpp b/src/mame/sega/model2_v.cpp index 48673705d4c16..5f8736f1577cc 100644 --- a/src/mame/sega/model2_v.cpp +++ b/src/mame/sega/model2_v.cpp @@ -2599,8 +2599,14 @@ u32 model2_state::screen_update_model2(screen_device &screen, bitmap_rgb32 &bitm bitmap.fill(m_palette->pen(0), cliprect); m_sys24_bitmap.fill(0, cliprect); - for(int layer = 3; layer >= 0; layer--) - m_tiles->draw(screen, m_sys24_bitmap, cliprect, layer<<1, 0, 0); + for (int layer = 3; layer >= 2; layer--) + { + m_tiles->draw(screen, m_sys24_bitmap, cliprect, layer << 1, 0, 1); + m_tiles->draw(screen, m_sys24_bitmap, cliprect, (layer << 1) | 1, 0, 1); + } + + for (int layer = 1; layer >= 0; layer--) + m_tiles->draw(screen, m_sys24_bitmap, cliprect, layer << 1, 0, 0); copybitmap_trans(bitmap, m_sys24_bitmap, 0, 0, 0, 0, cliprect, 0); diff --git a/src/mame/sega/segaic24.cpp b/src/mame/sega/segaic24.cpp index 5f4223b30ae3e..ce74d79e4d293 100644 --- a/src/mame/sega/segaic24.cpp +++ b/src/mame/sega/segaic24.cpp @@ -350,6 +350,11 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap if(vscr & 0x8000) return; + if (flags & 1) + tile_layer[layer]->map_pen_to_layer(0, 0, TILEMAP_PIXEL_LAYER0); + else + tile_layer[layer]->map_pen_to_layer(0, 0, TILEMAP_PIXEL_TRANSPARENT); + if(ctrl & 0x6000) { // Special window/scroll modes if(layer & 1) From 385e5fc542fd469e48164c5c39958f267c9c3505 Mon Sep 17 00:00:00 2001 From: gm-matthew <108370479+gm-matthew@users.noreply.github.com> Date: Thu, 6 Nov 2025 03:23:55 +0000 Subject: [PATCH 2/2] sega/model2: better tilemap fix --- src/mame/sega/model2_v.cpp | 6 ++-- src/mame/sega/segaic24.cpp | 63 ++++++++++++++++++-------------------- src/mame/sega/segaic24.h | 4 +-- 3 files changed, 33 insertions(+), 40 deletions(-) diff --git a/src/mame/sega/model2_v.cpp b/src/mame/sega/model2_v.cpp index 5f8736f1577cc..e5839a54a624c 100644 --- a/src/mame/sega/model2_v.cpp +++ b/src/mame/sega/model2_v.cpp @@ -2599,11 +2599,9 @@ u32 model2_state::screen_update_model2(screen_device &screen, bitmap_rgb32 &bitm bitmap.fill(m_palette->pen(0), cliprect); m_sys24_bitmap.fill(0, cliprect); + // draw tilemap B as opaque for (int layer = 3; layer >= 2; layer--) - { - m_tiles->draw(screen, m_sys24_bitmap, cliprect, layer << 1, 0, 1); - m_tiles->draw(screen, m_sys24_bitmap, cliprect, (layer << 1) | 1, 0, 1); - } + m_tiles->draw(screen, m_sys24_bitmap, cliprect, layer << 1, 0, TILEMAP_DRAW_OPAQUE); for (int layer = 1; layer >= 0; layer--) m_tiles->draw(screen, m_sys24_bitmap, cliprect, layer << 1, 0, 0); diff --git a/src/mame/sega/segaic24.cpp b/src/mame/sega/segaic24.cpp index ce74d79e4d293..cff5071cecb44 100644 --- a/src/mame/sega/segaic24.cpp +++ b/src/mame/sega/segaic24.cpp @@ -102,7 +102,7 @@ void segas24_tile_device::device_start() } void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bitmap_ind8 &tm, bitmap_ind16 &dm, const uint16_t *mask, - uint16_t tpri, uint8_t lpri, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2) + uint16_t tpri, uint8_t lpri, int flags, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2) { const uint16_t *source = &bm.pix(sy, sx); const uint8_t *trans = &tm.pix(sy, sx); @@ -141,7 +141,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit if(!m) { // 1- 128 pixels from this layer for(int x=0; x<128; x++) { - if(*srct++ == tpri) { + if(*srct++ == tpri || flags & TILEMAP_DRAW_OPAQUE) { *dst = *src; *pr |= lpri; } @@ -163,7 +163,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit if(!(m & 0x8000)) { int xx; for(xx=0; xx<8; xx++) - if(srct[xx] == tpri) { + if(srct[xx] == tpri || flags & TILEMAP_DRAW_OPAQUE) { dst[xx] = src[xx]; pr[xx] |= lpri; } @@ -182,7 +182,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit if(!m) { // 1- 128 pixels from this layer for(int x = cur_x; x> (x >> 3)))) { + if((*srct++ == tpri || flags & TILEMAP_DRAW_OPAQUE) && !(m & (0x8000 >> (x >> 3)))) { *dst = *src; *pr |= lpri; } @@ -229,7 +229,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit // priority_bitmap void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bitmap_ind8 &tm, bitmap_rgb32 &dm, const uint16_t *mask, - uint16_t tpri, uint8_t lpri, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2) + uint16_t tpri, uint8_t lpri, int flags, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2) { const uint16_t *source = &bm.pix(sy, sx); const uint8_t *trans = &tm.pix(sy, sx); @@ -267,7 +267,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit if(!m) { // 1- 128 pixels from this layer for(int x=0; x<128; x++) { - if(*srct++ == tpri) + if(*srct++ == tpri || flags & TILEMAP_DRAW_OPAQUE) *dst = pens[*src]; src++; dst++; @@ -284,7 +284,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit for(int x=0; x<128; x+=8) { if(!(m & 0x8000)) { for(int xx=0; xx<8; xx++) - if(srct[xx] == tpri) + if(srct[xx] == tpri || flags & TILEMAP_DRAW_OPAQUE) dst[xx] = pens[src[xx]]; } src += 8; @@ -300,7 +300,7 @@ void segas24_tile_device::draw_rect(screen_device &screen, bitmap_ind16 &bm, bit if(!m) { // 1- 128 pixels from this layer for(int x = cur_x; x> (x >> 3)))) + if((*srct++ == tpri || flags & TILEMAP_DRAW_OPAQUE) && !(m & (0x8000 >> (x >> 3)))) *dst = pens[*src]; src++; @@ -350,11 +350,6 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap if(vscr & 0x8000) return; - if (flags & 1) - tile_layer[layer]->map_pen_to_layer(0, 0, TILEMAP_PIXEL_LAYER0); - else - tile_layer[layer]->map_pen_to_layer(0, 0, TILEMAP_PIXEL_TRANSPARENT); - if(ctrl & 0x6000) { // Special window/scroll modes if(layer & 1) @@ -385,7 +380,7 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap h = hscr & 0x1ff; tile_layer[l1]->set_scrollx(0, -h); - tile_layer[l1]->draw(screen, bitmap, c, tpri, lpri); + tile_layer[l1]->draw(screen, bitmap, c, tpri | flags, lpri); } break; } @@ -412,8 +407,8 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap c1.min_y = c1.max_y = c2.min_y = c2.max_y = y; - tile_layer[l1]->draw(screen, bitmap, c1, tpri, lpri); - tile_layer[l1^1]->draw(screen, bitmap, c2, tpri, lpri); + tile_layer[l1]->draw(screen, bitmap, c1, tpri | flags, lpri); + tile_layer[l1^1]->draw(screen, bitmap, c2, tpri | flags, lpri); } break; } @@ -436,8 +431,8 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap if(!((-vscr) & 0x200)) layer ^= 1; - tile_layer[layer]->draw(screen, bitmap, c1, tpri, lpri); - tile_layer[layer^1]->draw(screen, bitmap, c2, tpri, lpri); + tile_layer[layer]->draw(screen, bitmap, c1, tpri | flags, lpri); + tile_layer[layer^1]->draw(screen, bitmap, c2, tpri | flags, lpri); break; } case 2: case 3: { @@ -452,8 +447,8 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap if(!((+hscr) & 0x200)) layer ^= 1; - tile_layer[layer]->draw(screen, bitmap, c1, tpri, lpri); - tile_layer[layer^1]->draw(screen, bitmap, c2, tpri, lpri); + tile_layer[layer]->draw(screen, bitmap, c1, tpri | flags, lpri); + tile_layer[layer^1]->draw(screen, bitmap, c2, tpri | flags, lpri); break; } } @@ -474,11 +469,11 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap hscr = (-hscrtb[y]) & 0x1ff; if(hscr + 496 <= 512) { // Horizontal split unnecessary - draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, y, 496, y+1); + draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, vscr, 0, y, 496, y+1); } else { // Horizontal split necessary - draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, y, 512-hscr, y+1); - draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, 0, vscr, 512-hscr, y, 496, y+1); + draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, vscr, 0, y, 512-hscr, y+1); + draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, 0, vscr, 512-hscr, y, 496, y+1); } vscr = (vscr + 1) & 0x1ff; } @@ -490,25 +485,25 @@ void segas24_tile_device::draw_common(screen_device &screen, BitmapClass &bitmap // Horizontal split unnecessary if(vscr + 384 <= 512) { // Vertical split unnecessary - draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 496, 384); + draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, vscr, 0, 0, 496, 384); } else { // Vertical split necessary - draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 496, 512-vscr); - draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, 0, 0, 512-vscr, 496, 384); + draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, vscr, 0, 0, 496, 512-vscr); + draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, 0, 0, 512-vscr, 496, 384); } } else { // Horizontal split necessary if(vscr + 384 <= 512) { // Vertical split unnecessary - draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 512-hscr, 384); - draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, 0, vscr, 512-hscr, 0, 496, 384); + draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, vscr, 0, 0, 512-hscr, 384); + draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, 0, vscr, 512-hscr, 0, 496, 384); } else { // Vertical split necessary - draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, 0, 512-hscr, 512-vscr); - draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, 0, vscr, 512-hscr, 0, 496, 512-vscr); - draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, hscr, 0, 0, 512-vscr, 512-hscr, 384); - draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, win, 0, 0, 512-hscr, 512-vscr, 496, 384); + draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, vscr, 0, 0, 512-hscr, 512-vscr); + draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, 0, vscr, 512-hscr, 0, 496, 512-vscr); + draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, hscr, 0, 0, 512-vscr, 512-hscr, 384); + draw_rect(screen, bm, tm, bitmap, mask, tpri, lpri, flags, win, 0, 0, 512-hscr, 512-vscr, 496, 384); } } } diff --git a/src/mame/sega/segaic24.h b/src/mame/sega/segaic24.h index b5b951b0baf59..40c3f65fae7ce 100644 --- a/src/mame/sega/segaic24.h +++ b/src/mame/sega/segaic24.h @@ -65,9 +65,9 @@ class segas24_tile_device : public device_t, public device_gfx_interface TILE_GET_INFO_MEMBER(tile_info_1w); void draw_rect(screen_device &screen, bitmap_ind16 &bm, bitmap_ind8 &tm, bitmap_ind16 &dm, const uint16_t *mask, - uint16_t tpri, uint8_t lpri, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2); + uint16_t tpri, uint8_t lpri, int flags, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2); void draw_rect(screen_device &screen, bitmap_ind16 &bm, bitmap_ind8 &tm, bitmap_rgb32 &dm, const uint16_t *mask, - uint16_t tpri, uint8_t lpri, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2); + uint16_t tpri, uint8_t lpri, int flags, int win, int sx, int sy, int xx1, int yy1, int xx2, int yy2); template void draw_common(screen_device &screen, BitmapClass &bitmap, const rectangle &cliprect, int layer, int pri, int flags);