diff --git a/src/mame/sega/model2_v.cpp b/src/mame/sega/model2_v.cpp index 48673705d4c16..e5839a54a624c 100644 --- a/src/mame/sega/model2_v.cpp +++ b/src/mame/sega/model2_v.cpp @@ -2599,8 +2599,12 @@ 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); + // draw tilemap B as opaque + for (int layer = 3; layer >= 2; layer--) + 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); 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..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++; @@ -380,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; } @@ -407,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; } @@ -431,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: { @@ -447,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; } } @@ -469,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; } @@ -485,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);