summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/x68k.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/x68k.cpp')
-rw-r--r--src/mame/video/x68k.cpp89
1 files changed, 63 insertions, 26 deletions
diff --git a/src/mame/video/x68k.cpp b/src/mame/video/x68k.cpp
index f51eff76886..484292d9748 100644
--- a/src/mame/video/x68k.cpp
+++ b/src/mame/video/x68k.cpp
@@ -203,11 +203,14 @@ void x68k_state::draw_text(bitmap_rgb32 &bitmap, int xscr, int yscr, rectangle r
uint32_t loc; // location in TVRAM
uint32_t colour;
int bit;
+ int divisor = 1;
+ if(m_crtc->gfx_double_scan())
+ divisor = 2;
for(line=rect.min_y;line<=rect.max_y;line++) // per scanline
{
// adjust for scroll registers
- loc = (((line - m_crtc->vbegin()) + yscr) & 0x3ff) * 64;
+ loc = ((((line- m_crtc->vbegin()) / divisor) + yscr) & 0x3ff) * 64;
loc += (xscr / 16) & 0x7f;
loc &= 0xffff;
bit = 15 - (xscr & 0x0f);
@@ -241,6 +244,9 @@ bool x68k_state::draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprect, ui
int shift;
bool blend, ret = false;
uint16_t *pal = (uint16_t *)m_gfxpalette->basemem().base();
+ int divisor = 1;
+ if(m_crtc->gfx_double_scan())
+ divisor = 2;
for(int scanline=cliprect.min_y;scanline<=cliprect.max_y;scanline++) // per scanline
{
@@ -296,7 +302,7 @@ bool x68k_state::draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprect, ui
case 0x00: // 16 colours
xscr = m_crtc->xscr_gfx(page) & 0x1ff;
yscr = m_crtc->yscr_gfx(page) & 0x1ff;
- lineoffset = (((scanline - m_crtc->vbegin()) + yscr) & 0x1ff) * 512;
+ lineoffset = (((scanline - m_crtc->vbegin() / divisor) + yscr) & 0x1ff) * 512;
loc = xscr & 0x1ff;
shift = 4;
if((m_video.reg[2] & 0x1a00) == 0x1a00)
@@ -342,7 +348,7 @@ bool x68k_state::draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprect, ui
{
xscr = m_crtc->xscr_gfx(page) & 0x1ff;
yscr = m_crtc->yscr_gfx(page) & 0x1ff;
- lineoffset = (((scanline - m_crtc->vbegin()) + yscr) & 0x1ff) * 512;
+ lineoffset = (((scanline - m_crtc->vbegin() / divisor) + yscr) & 0x1ff) * 512;
loc = xscr & 0x1ff;
shift = 4;
if((m_video.reg[2] & 0x1a00) == 0x1a00)
@@ -387,7 +393,7 @@ bool x68k_state::draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprect, ui
case 0x03: // 65536 colours
xscr = m_crtc->xscr_gfx(0) & 0x1ff;
yscr = m_crtc->yscr_gfx(0) & 0x1ff;
- lineoffset = (((scanline - m_crtc->vbegin()) + yscr) & 0x1ff) * 512;
+ lineoffset = (((scanline - m_crtc->vbegin() / divisor) + yscr) & 0x1ff) * 512;
loc = xscr & 0x1ff;
for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
{
@@ -409,20 +415,25 @@ void x68k_state::draw_gfx(bitmap_rgb32 &bitmap,rectangle cliprect)
{
int priority, scanline, pixel;
bool gfxblend=false;
- //rectangle rect;
- //int xscr,yscr;
- //int gpage;
+ rectangle gfxrect = cliprect;
+ int divisor = 1;
+ if(m_crtc->gfx_double_scan())
+ {
+ gfxrect.max_y >>= 1;
+ gfxrect.min_y >>= 1;
+ divisor = 2;
+ }
if(m_crtc->gfx_layer_buffer()) // if graphic layers are set to buffer, then they aren't visible
return;
- m_gfxbitmap.fill(0, cliprect);
+ m_gfxbitmap.fill(0, gfxrect);
if((m_video.reg[2] & 0x1800) == 0x1000)
- m_special.fill(0, cliprect);
+ m_special.fill(0, gfxrect);
for(priority=3;priority>=0;priority--)
{
- gfxblend = draw_gfx_scanline(m_gfxbitmap,cliprect,priority);
+ gfxblend = draw_gfx_scanline(m_gfxbitmap,gfxrect,priority);
}
for(scanline=cliprect.min_y;scanline<=cliprect.max_y;scanline++)
@@ -433,13 +444,13 @@ void x68k_state::draw_gfx(bitmap_rgb32 &bitmap,rectangle cliprect)
{
if((m_video.reg[0] & 0x03) == 3)
{
- colour = m_gfxbitmap.pix(scanline, pixel);
+ colour = m_gfxbitmap.pix(scanline / divisor, pixel);
if(colour || (m_video.gfx_pri == 2))
bitmap.pix(scanline, pixel) = GGGGGRRRRRBBBBBI(colour);
}
else if(gfxblend)
{
- colour = m_gfxbitmap.pix(scanline, pixel);
+ colour = m_gfxbitmap.pix(scanline / divisor, pixel);
if(((m_video.reg[2] & 0x1900) == 0x1900) && (m_video.gfx_pri != 2) && (colour & 1))
blend = true;
else
@@ -454,7 +465,7 @@ void x68k_state::draw_gfx(bitmap_rgb32 &bitmap,rectangle cliprect)
}
else
{
- colour = m_gfxbitmap.pix(scanline, pixel) & 0xff;
+ colour = m_gfxbitmap.pix(scanline / divisor, pixel) & 0xff;
if(((m_video.reg[2] & 0x1900) == 0x1900) && (m_video.gfx_pri != 2) && (colour & 1))
{
blend = true;
@@ -507,6 +518,9 @@ void x68k_state::draw_sprites(bitmap_ind16 &bitmap, int priority, rectangle clip
b1-0, H-Res (0 = 8x8 tilemaps, 1 = 16x16 tilemaps, 2 or 3 = unknown)
*/
int ptr,pri;
+ int divisor = 1;
+ if(!(m_video.bg_hvres & 0x0c) && m_crtc->gfx_double_scan())
+ divisor = 2;
for(ptr=508;ptr>=0;ptr-=4) // stepping through sprites
{
@@ -532,7 +546,7 @@ void x68k_state::draw_sprites(bitmap_ind16 &bitmap, int priority, rectangle clip
sx += m_video.bg_hshift;
sx += m_sprite_shift;
- m_gfxdecode->gfx(1)->zoom_transpen(bitmap,cliprect,code,colour,xflip,yflip,m_crtc->hbegin()+sx,m_crtc->vbegin()+(sy*m_video.bg_double),0x10000,0x10000*m_video.bg_double,0x00);
+ m_gfxdecode->gfx(1)->zoom_transpen(bitmap,cliprect,code,colour,xflip,yflip,m_crtc->hbegin()+sx,(m_crtc->vbegin() / divisor)+(sy*m_video.bg_double),0x10000,0x10000*m_video.bg_double,0x00);
}
}
}
@@ -544,6 +558,9 @@ void x68k_state::draw_bg(bitmap_ind16 &bitmap, screen_device &screen, int layer,
tilemap_t* x68k_bg0;
tilemap_t* x68k_bg1;
tilemap_t* map;
+ int divisor = 1;
+ if(!(m_video.bg_hvres & 0x0c) && m_crtc->gfx_double_scan())
+ divisor = 2;
if((m_spritereg[0x408] & 0x03) == 0x00) // Sprite/BG H-Res 0=8x8, 1=16x16, 2 or 3 = undefined.
{
@@ -562,7 +579,7 @@ void x68k_state::draw_bg(bitmap_ind16 &bitmap, screen_device &screen, int layer,
map = (m_spritereg[0x404] & 0x0006) == 0x02 ? x68k_bg0 : x68k_bg1;
map->set_scrollx(0,(sclx - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
- map->set_scrolly(0,(scly - m_crtc->vbegin()) & 0x3ff);
+ map->set_scrolly(0,(scly - (m_crtc->vbegin() / divisor)) & 0x3ff);
map->draw(screen, bitmap, rect, opaque ? TILEMAP_DRAW_OPAQUE : 0, 0);
}
@@ -698,24 +715,33 @@ uint32_t x68k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
bool clear = false;
if(m_video.reg[2] & 0x0040)
{
+ rectangle pcgrect = rect;
+ if(!(m_video.bg_hvres & 0x0c) && m_crtc->gfx_double_scan())
+ {
+ pcgrect.max_y >>= 1;
+ pcgrect.min_y >>= 1;
+ }
if(m_spritereg[0x404] & 0x0008)
{
clear = true;
- draw_bg(m_pcgbitmap, screen, 1, true, rect);
+ draw_bg(m_pcgbitmap, screen, 1, true, pcgrect);
}
else if(m_spritereg[0x404] & 0x0001)
{
clear = true;
- draw_bg(m_pcgbitmap, screen, 0, true, rect);
+ draw_bg(m_pcgbitmap, screen, 0, true, pcgrect);
}
}
if(clear)
{
+ int divisor = 1;
+ if(!(m_video.bg_hvres & 0x0c) && m_crtc->gfx_double_scan())
+ divisor = 2;
for(scanline=rect.min_y;scanline<=rect.max_y;scanline++)
{
for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
{
- uint8_t colour = m_pcgbitmap.pix(scanline, pixel) & 0xff;
+ uint8_t colour = m_pcgbitmap.pix(scanline / divisor, pixel) & 0xff;
bitmap.pix(scanline, pixel) = m_pcgpalette->pen(colour);
}
}
@@ -732,22 +758,30 @@ uint32_t x68k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
// Sprite / BG Tiles
if(priority == m_video.sprite_pri /*&& (m_spritereg[0x404] & 0x0200)*/ && (m_video.reg[2] & 0x0040))
{
- m_pcgbitmap.fill(0, rect);
- draw_sprites(m_pcgbitmap,1,rect);
+ rectangle pcgrect = rect;
+ int divisor = 1;
+ if(!(m_video.bg_hvres & 0x0c) && m_crtc->gfx_double_scan())
+ {
+ pcgrect.max_y >>= 1;
+ pcgrect.min_y >>= 1;
+ divisor = 2;
+ }
+ m_pcgbitmap.fill(0, pcgrect);
+ draw_sprites(m_pcgbitmap,1,pcgrect);
if(m_spritereg[0x404] & 0x0008)
- draw_bg(m_pcgbitmap, screen, 1, false, rect);
+ draw_bg(m_pcgbitmap, screen, 1, false, pcgrect);
- draw_sprites(m_pcgbitmap,2,rect);
+ draw_sprites(m_pcgbitmap,2,pcgrect);
if(m_spritereg[0x404] & 0x0001)
- draw_bg(m_pcgbitmap, screen, 0, false, rect);
+ draw_bg(m_pcgbitmap, screen, 0, false, pcgrect);
- draw_sprites(m_pcgbitmap,3,rect);
+ draw_sprites(m_pcgbitmap,3,pcgrect);
for(scanline=rect.min_y;scanline<=rect.max_y;scanline++)
{
for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
{
- uint8_t colour = m_pcgbitmap.pix(scanline, pixel) & 0xff;
+ uint8_t colour = m_pcgbitmap.pix(scanline / divisor, pixel) & 0xff;
if(colour && (m_pcgpalette->pen(colour) & 0xffffff))
bitmap.pix(scanline, pixel) = m_pcgpalette->pen(colour);
}
@@ -767,11 +801,14 @@ uint32_t x68k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
if((m_video.reg[2] & 0x1800) == 0x1000) // special priority
{
uint16_t colour;
+ int divisor = 1;
+ if(m_crtc->gfx_double_scan())
+ divisor = 2;
for(scanline=rect.min_y;scanline<=rect.max_y;scanline++)
{
for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
{
- colour = m_special.pix(scanline, pixel) & 0xff;
+ colour = m_special.pix(scanline / divisor, pixel) & 0xff;
if(colour)
bitmap.pix(scanline, pixel) = m_gfxpalette->pen(colour & ~1);
}