summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2016-01-05 14:11:17 -0600
committer cracyc <cracyc@users.noreply.github.com>2016-01-05 14:11:17 -0600
commitd5400e5f69b986977f2657a47717743490efb71c (patch)
tree85752d49279d32b401a8b07f77dabc59ef487daf /src
parent71bb70d96835c80abcf129a6d9540eb2ee70a244 (diff)
x68k: special priority (nw)
Diffstat (limited to 'src')
-rw-r--r--src/mame/includes/x68k.h1
-rw-r--r--src/mame/video/x68k.cpp35
2 files changed, 30 insertions, 6 deletions
diff --git a/src/mame/includes/x68k.h b/src/mame/includes/x68k.h
index ed1c6ca94dc..f1aee48d2f0 100644
--- a/src/mame/includes/x68k.h
+++ b/src/mame/includes/x68k.h
@@ -115,6 +115,7 @@ public:
bitmap_ind16 m_pcgbitmap;
bitmap_ind16 m_gfxbitmap;
+ bitmap_ind16 m_special;
void floppy_load_unload(bool load, floppy_image_device *dev);
int floppy_load(floppy_image_device *dev);
diff --git a/src/mame/video/x68k.cpp b/src/mame/video/x68k.cpp
index 927489ab1a1..f6e4a7cb412 100644
--- a/src/mame/video/x68k.cpp
+++ b/src/mame/video/x68k.cpp
@@ -26,10 +26,10 @@
1 sprite layer - up to 128 16x16 sprites, 16 colours per sprite, maximum 16 sprites per scanline (not yet implemented).
Questions: What do the other bits in m_video.reg[2] do?
- What is "special priority mode"?
How is the intensity applied during blending if at all?
Black appears to be opaque only at priority 2 but not 3, is that right?
Are the gfx layers blended from the bottom up or all at once?
+ Special priority in 16bit color mode?
*/
@@ -783,7 +783,12 @@ bool x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprec
break;
}
if(colour || (priority == 3))
- bitmap.pix16(scanline, pixel) = colour;
+ {
+ if(((m_video.reg[2] & 0x1800) == 0x1000) && (colour & 1))
+ m_special.pix16(scanline, pixel) = colour & ~1;
+ else
+ bitmap.pix16(scanline, pixel) = colour;
+ }
loc++;
loc &= 0x3ff;
}
@@ -824,6 +829,8 @@ bool x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprec
else
bitmap.pix16(scanline, pixel) = (pal[colour] & 0xfffe) + blend;
}
+ else if(((m_video.reg[2] & 0x1800) == 0x1000) && (colour & 1))
+ m_special.pix16(scanline, pixel) = colour;
else
bitmap.pix16(scanline, pixel) = colour;
}
@@ -860,6 +867,8 @@ bool x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprec
else
bitmap.pix16(scanline, pixel) = (pal[colour] & 0xfffe) + blend;
}
+ if(((m_video.reg[2] & 0x1800) == 0x1000) && (colour & 1))
+ m_special.pix16(scanline, pixel) = colour;
else
bitmap.pix16(scanline, pixel) = colour;
}
@@ -901,6 +910,8 @@ void x68k_state::x68k_draw_gfx(bitmap_rgb32 &bitmap,rectangle cliprect)
return;
m_gfxbitmap.fill(0, cliprect);
+ if((m_video.reg[2] & 0x1800) == 0x1000)
+ m_special.fill(0, cliprect);
for(priority=3;priority>=0;priority--)
{
@@ -1102,10 +1113,8 @@ VIDEO_START_MEMBER(x68k_state,x68000)
m_bg1_16->set_transparent_pen(0);
m_screen->register_screen_bitmap(m_pcgbitmap);
- m_pcgbitmap.fill(0);
-
m_screen->register_screen_bitmap(m_gfxbitmap);
- m_gfxbitmap.fill(0);
+ m_screen->register_screen_bitmap(m_special);
// m_scanline_timer->adjust(attotime::zero, 0, attotime::from_hz(55.45)/568);
}
@@ -1118,7 +1127,7 @@ UINT32 x68k_state::screen_update_x68000(screen_device &screen, bitmap_rgb32 &bit
int x;
tilemap_t* x68k_bg0;
tilemap_t* x68k_bg1;
- int pixel, scanline;
+ int pixel = 0, scanline = 0;
//UINT8 *rom;
if((m_spritereg[0x408] & 0x03) == 0x00) // Sprite/BG H-Res 0=8x8, 1=16x16, 2 or 3 = undefined.
@@ -1232,6 +1241,20 @@ UINT32 x68k_state::screen_update_x68000(screen_device &screen, bitmap_rgb32 &bit
}
}
+ if((m_video.reg[2] & 0x1800) == 0x1000) // special priority
+ {
+ UINT16 colour;
+ for(scanline=rect.min_y;scanline<=rect.max_y;scanline++)
+ {
+ for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
+ {
+ colour = m_special.pix16(scanline, pixel) & 0xff;
+ if(colour)
+ bitmap.pix32(scanline, pixel) = m_gfxpalette->pen(colour & ~1);
+ }
+ }
+ }
+
#ifdef MAME_DEBUG
if(machine().input().code_pressed(KEYCODE_9))
{