mirror of
https://github.com/holub/mame
synced 2025-04-21 07:52:35 +03:00
x68k: fix bg layer positioning and another layer selection case
This commit is contained in:
parent
dd1a4eb431
commit
ee6cf73ddc
@ -28055,7 +28055,7 @@ sold through Takeru vending machines -->
|
||||
</part>
|
||||
</software>
|
||||
|
||||
<software name="minic" supported="partial">
|
||||
<software name="minic">
|
||||
<description>Mi ni Ikuzo! Hedgehog</description>
|
||||
<year>1993</year>
|
||||
<publisher><doujin></publisher>
|
||||
|
@ -166,10 +166,8 @@ protected:
|
||||
int gfxlayer_pri[4]{}; // block displayed for each priority level
|
||||
int tile8_dirty[1024]{};
|
||||
int tile16_dirty[256]{};
|
||||
int bg_visible_height = 0;
|
||||
int bg_visible_width = 0;
|
||||
int bg_hshift = 0;
|
||||
int bg_vshift = 0;
|
||||
int bg_hstart = 0;
|
||||
int bg_vstart = 0;
|
||||
int bg_hvres = 0; // bits 0,1 = H-Res, bits 2,3 = V-Res, bit 4 = L/H Freq (0=15.98kHz, 1=31.5kHz)
|
||||
} m_video;
|
||||
struct
|
||||
|
@ -39,8 +39,6 @@ x68k_crtc_device::x68k_crtc_device(const machine_config &mconfig, device_type ty
|
||||
, m_width(0)
|
||||
, m_visible_height(0)
|
||||
, m_visible_width(0)
|
||||
, m_hshift(0)
|
||||
, m_vshift(0)
|
||||
, m_interlace(false)
|
||||
, m_oddscanline(false)
|
||||
{
|
||||
@ -93,8 +91,6 @@ void x68k_crtc_device::device_start()
|
||||
save_item(NAME(m_width));
|
||||
save_item(NAME(m_visible_height));
|
||||
save_item(NAME(m_visible_width));
|
||||
save_item(NAME(m_hshift));
|
||||
save_item(NAME(m_vshift));
|
||||
save_item(NAME(m_interlace));
|
||||
save_item(NAME(m_oddscanline));
|
||||
}
|
||||
|
@ -49,8 +49,6 @@ public:
|
||||
u16 vend() const { return m_vend; }
|
||||
u16 visible_height() const { return m_visible_height; }
|
||||
u16 visible_width() const { return m_visible_width; }
|
||||
u16 hshift() const { return m_hshift; }
|
||||
u16 vshift() const { return m_vshift; }
|
||||
|
||||
protected:
|
||||
// base constructor
|
||||
|
@ -119,32 +119,26 @@ void x68k_state::spritereg_w(offs_t offset, uint16_t data, uint16_t mem_mask)
|
||||
switch(offset)
|
||||
{
|
||||
case 0x400:
|
||||
m_bg0_8->set_scrollx(0,(data - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
|
||||
m_bg0_16->set_scrollx(0,(data - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
|
||||
m_bg0_8->set_scrollx(0,(data - m_video.bg_hstart) & 0x3ff);
|
||||
m_bg0_16->set_scrollx(0,(data - m_video.bg_hstart) & 0x3ff);
|
||||
break;
|
||||
case 0x401:
|
||||
m_bg0_8->set_scrolly(0,(data - m_crtc->vbegin()) & 0x3ff);
|
||||
m_bg0_16->set_scrolly(0,(data - m_crtc->vbegin()) & 0x3ff);
|
||||
m_bg0_8->set_scrolly(0,(data - m_video.bg_vstart) & 0x3ff);
|
||||
m_bg0_16->set_scrolly(0,(data - m_video.bg_vstart) & 0x3ff);
|
||||
break;
|
||||
case 0x402:
|
||||
m_bg1_8->set_scrollx(0,(data - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
|
||||
m_bg1_16->set_scrollx(0,(data - m_crtc->hbegin() - m_video.bg_hshift) & 0x3ff);
|
||||
m_bg1_8->set_scrollx(0,(data - m_video.bg_hstart) & 0x3ff);
|
||||
m_bg1_16->set_scrollx(0,(data - m_video.bg_hstart) & 0x3ff);
|
||||
break;
|
||||
case 0x403:
|
||||
m_bg1_8->set_scrolly(0,(data - m_crtc->vbegin()) & 0x3ff);
|
||||
m_bg1_16->set_scrolly(0,(data - m_crtc->vbegin()) & 0x3ff);
|
||||
m_bg1_8->set_scrolly(0,(data - m_video.bg_vstart) & 0x3ff);
|
||||
m_bg1_16->set_scrolly(0,(data - m_video.bg_vstart) & 0x3ff);
|
||||
break;
|
||||
case 0x406: // BG H-DISP (normally equals CRTC reg 2 value + 4)
|
||||
if(data != 0x00ff)
|
||||
{
|
||||
m_video.bg_visible_width = m_crtc->hend() - ((data & 0x003f) - 4) * 8;
|
||||
m_video.bg_hshift = ((data - 4) * 8) - (m_crtc->hbegin() - 1);
|
||||
if(m_video.bg_hshift > 0)
|
||||
m_video.bg_hshift = 0;
|
||||
}
|
||||
m_video.bg_hstart = (data - 4) * 8;
|
||||
break;
|
||||
case 0x407: // BG V-DISP (like CRTC reg 6)
|
||||
m_video.bg_vshift = m_crtc->vshift();
|
||||
m_video.bg_vstart = data;
|
||||
break;
|
||||
case 0x408: // BG H/V-Res
|
||||
m_video.bg_hvres = data & 0x1f;
|
||||
@ -528,15 +522,12 @@ void x68k_state::draw_sprites(bitmap_ind16 &bitmap, int priority, rectangle clip
|
||||
int sx = (m_spritereg[ptr+0] & 0x3ff) - 16;
|
||||
int sy = (m_spritereg[ptr+1] & 0x3ff) - 16;
|
||||
|
||||
rect.min_x=m_crtc->hshift();
|
||||
rect.min_y=m_crtc->vshift();
|
||||
rect.min_x=m_video.bg_hstart;
|
||||
rect.min_y=m_video.bg_vstart;
|
||||
rect.max_x=rect.min_x + m_crtc->visible_width()-1;
|
||||
rect.max_y=rect.min_y + m_crtc->visible_height()-1;
|
||||
|
||||
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() / divisor)+sy,0x10000,0x10000,0x00);
|
||||
m_gfxdecode->gfx(1)->zoom_transpen(bitmap,cliprect,code,colour,xflip,yflip,m_video.bg_hstart+sx,(m_video.bg_vstart / divisor)+sy,0x10000,0x10000,0x00);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -568,8 +559,8 @@ void x68k_state::draw_bg(bitmap_ind16 &bitmap, screen_device &screen, int layer,
|
||||
else
|
||||
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() / divisor)) & 0x3ff);
|
||||
map->set_scrollx(0,(sclx - m_video.bg_hstart) & 0x3ff);
|
||||
map->set_scrolly(0,(scly - (m_video.bg_vstart / divisor)) & 0x3ff);
|
||||
map->draw(screen, bitmap, rect, opaque ? TILEMAP_DRAW_OPAQUE : 0, 0);
|
||||
}
|
||||
|
||||
@ -675,8 +666,6 @@ uint32_t x68k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
|
||||
|
||||
rect.min_x=m_crtc->hbegin();
|
||||
rect.min_y=m_crtc->vbegin();
|
||||
// rect.max_x=rect.min_x + m_crtc->visible_width()-1;
|
||||
// rect.max_y=rect.min_y + m_crtc->visible_height()-1;
|
||||
rect.max_x=m_crtc->hend();
|
||||
rect.max_y=m_crtc->vend();
|
||||
|
||||
@ -686,7 +675,6 @@ uint32_t x68k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
|
||||
rect.max_y = cliprect.max_y;
|
||||
|
||||
// update tiles
|
||||
//rom = memregion("user1")->base();
|
||||
for(x=0;x<256;x++)
|
||||
{
|
||||
if(m_video.tile16_dirty[x] != 0)
|
||||
@ -787,6 +775,7 @@ uint32_t x68k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
|
||||
}
|
||||
|
||||
bool blend = (((m_video.reg[2] & 0x1900) == 0x1900) && (m_video.gfx_pri != 2));
|
||||
bool bgen = (m_spritereg[0x404] & 0x0008) || (m_spritereg[0x404] & 0x0001);
|
||||
for(scanline=rect.min_y;scanline<=rect.max_y;scanline++)
|
||||
{
|
||||
for(pixel=m_crtc->hbegin();pixel<=m_crtc->hend();pixel++)
|
||||
@ -824,6 +813,8 @@ uint32_t x68k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
|
||||
pix = m_pcgpalette->pen(colour);
|
||||
pcgpix = true;
|
||||
}
|
||||
else if(outpix && bgen && (pcgprio > textprio))
|
||||
pix = outpix;
|
||||
}
|
||||
else if(priority == gfxprio)
|
||||
gfxpix = true;
|
||||
@ -855,6 +846,8 @@ uint32_t x68k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
|
||||
pix = m_pcgpalette->pen(colour);
|
||||
pcgpix = true;
|
||||
}
|
||||
else if(outpix && bgen && (pcgprio > textprio))
|
||||
pix = outpix;
|
||||
}
|
||||
else if(priority == gfxprio)
|
||||
pix = get_gfx_pixel<false>(scanline, pixel, gfx16bcol, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user