From ee6cf73ddc9c73b9ba029b8d99cc111334b13aad Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 13 May 2023 18:15:19 -0500 Subject: x68k: fix bg layer positioning and another layer selection case --- hash/x68k_flop.xml | 2 +- src/mame/sharp/x68k.h | 6 ++---- src/mame/sharp/x68k_crtc.cpp | 4 ---- src/mame/sharp/x68k_crtc.h | 2 -- src/mame/sharp/x68k_v.cpp | 47 +++++++++++++++++++------------------------- 5 files changed, 23 insertions(+), 38 deletions(-) diff --git a/hash/x68k_flop.xml b/hash/x68k_flop.xml index 8445941d5c1..6e1c9db95e5 100644 --- a/hash/x68k_flop.xml +++ b/hash/x68k_flop.xml @@ -28055,7 +28055,7 @@ sold through Takeru vending machines --> - + Mi ni Ikuzo! Hedgehog 1993 <doujin> diff --git a/src/mame/sharp/x68k.h b/src/mame/sharp/x68k.h index 0970e6c3257..ca38a15e414 100644 --- a/src/mame/sharp/x68k.h +++ b/src/mame/sharp/x68k.h @@ -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 diff --git a/src/mame/sharp/x68k_crtc.cpp b/src/mame/sharp/x68k_crtc.cpp index 37e263066ad..0fadfbaf4df 100644 --- a/src/mame/sharp/x68k_crtc.cpp +++ b/src/mame/sharp/x68k_crtc.cpp @@ -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)); } diff --git a/src/mame/sharp/x68k_crtc.h b/src/mame/sharp/x68k_crtc.h index 9da82aced2d..6cccf122840 100644 --- a/src/mame/sharp/x68k_crtc.h +++ b/src/mame/sharp/x68k_crtc.h @@ -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 diff --git a/src/mame/sharp/x68k_v.cpp b/src/mame/sharp/x68k_v.cpp index 4355a8c8261..b63498f57fa 100644 --- a/src/mame/sharp/x68k_v.cpp +++ b/src/mame/sharp/x68k_v.cpp @@ -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(scanline, pixel, gfx16bcol, 0); -- cgit v1.2.3