decbac06.cpp : Updates (#4274)

* decbac06.cpp : Updates
Make bpp masking related to gfx, Make tilemap draw routine related to cliprect, Cleanup unnecessary address_space in handlers, Fix spacing

* decbac06.cpp : Fix spacing

* decbac06.cpp : Another fix spacing
This commit is contained in:
cam900 2019-04-01 05:58:12 +09:00 committed by R. Belmont
parent 060abb5682
commit 1e3fb5c99a
4 changed files with 158 additions and 130 deletions

View File

@ -160,31 +160,30 @@ uint32_t dec0_automat_state::screen_update_automat(screen_device &screen, bitmap
// layer enables seem different... where are they?
// the bootleg doesn't write these registers, I think they're hardcoded?, so fake them for compatibility with our implementation..
address_space &space = machine().dummy_space();
m_tilegen[0]->pf_control_0_w(space,0,0x0003, 0x00ff); // 8x8
m_tilegen[0]->pf_control_0_w(space,1,0x0003, 0x00ff);
m_tilegen[0]->pf_control_0_w(space,2,0x0000, 0x00ff);
m_tilegen[0]->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions
m_tilegen[0]->pf_control_0_w(0,0x0003, 0x00ff); // 8x8
m_tilegen[0]->pf_control_0_w(1,0x0003, 0x00ff);
m_tilegen[0]->pf_control_0_w(2,0x0000, 0x00ff);
m_tilegen[0]->pf_control_0_w(3,0x0001, 0x00ff); // dimensions
m_tilegen[1]->pf_control_0_w(space,0,0x0082, 0x00ff); // 16x16
m_tilegen[1]->pf_control_0_w(space,1,0x0000, 0x00ff);
m_tilegen[1]->pf_control_0_w(space,2,0x0000, 0x00ff);
m_tilegen[1]->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions
m_tilegen[1]->pf_control_0_w(0,0x0082, 0x00ff); // 16x16
m_tilegen[1]->pf_control_0_w(1,0x0000, 0x00ff);
m_tilegen[1]->pf_control_0_w(2,0x0000, 0x00ff);
m_tilegen[1]->pf_control_0_w(3,0x0001, 0x00ff); // dimensions
m_tilegen[2]->pf_control_0_w(space,0,0x0082, 0x00ff); // 16x16
m_tilegen[2]->pf_control_0_w(space,1,0x0003, 0x00ff);
m_tilegen[2]->pf_control_0_w(space,2,0x0000, 0x00ff);
m_tilegen[2]->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions
m_tilegen[2]->pf_control_0_w(0,0x0082, 0x00ff); // 16x16
m_tilegen[2]->pf_control_0_w(1,0x0003, 0x00ff);
m_tilegen[2]->pf_control_0_w(2,0x0000, 0x00ff);
m_tilegen[2]->pf_control_0_w(3,0x0001, 0x00ff); // dimensions
// scroll registers got written elsewhere, copy them across
m_tilegen[0]->pf_control_1_w(space,0,0x0000, 0xffff); // no scroll?
m_tilegen[0]->pf_control_1_w(space,1,0x0000, 0xffff); // no scroll?
m_tilegen[0]->pf_control_1_w(0,0x0000, 0xffff); // no scroll?
m_tilegen[0]->pf_control_1_w(1,0x0000, 0xffff); // no scroll?
m_tilegen[1]->pf_control_1_w(space,0,m_automat_scroll_regs[3] - 0x010a, 0xffff);
m_tilegen[1]->pf_control_1_w(space,1,m_automat_scroll_regs[2], 0xffff);
m_tilegen[1]->pf_control_1_w(0,m_automat_scroll_regs[3] - 0x010a, 0xffff);
m_tilegen[1]->pf_control_1_w(1,m_automat_scroll_regs[2], 0xffff);
m_tilegen[2]->pf_control_1_w(space,0,m_automat_scroll_regs[1] - 0x0108, 0xffff);
m_tilegen[2]->pf_control_1_w(space,1,m_automat_scroll_regs[0], 0xffff);
m_tilegen[2]->pf_control_1_w(0,m_automat_scroll_regs[1] - 0x0108, 0xffff);
m_tilegen[2]->pf_control_1_w(1,m_automat_scroll_regs[0], 0xffff);
bool flip = m_tilegen[0]->get_flip_state();
@ -231,31 +230,30 @@ uint32_t dec0_automat_state::screen_update_secretab(screen_device &screen, bitma
// layer enables seem different... where are they?
// the bootleg doesn't write these registers, I think they're hardcoded?, so fake them for compatibility with our implementation..
address_space &space = machine().dummy_space();
m_tilegen[0]->pf_control_0_w(space,0,0x0003, 0x00ff); // 8x8
m_tilegen[0]->pf_control_0_w(space,1,0x0003, 0x00ff);
m_tilegen[0]->pf_control_0_w(space,2,0x0000, 0x00ff);
m_tilegen[0]->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions
m_tilegen[0]->pf_control_0_w(0,0x0003, 0x00ff); // 8x8
m_tilegen[0]->pf_control_0_w(1,0x0003, 0x00ff);
m_tilegen[0]->pf_control_0_w(2,0x0000, 0x00ff);
m_tilegen[0]->pf_control_0_w(3,0x0001, 0x00ff); // dimensions
m_tilegen[1]->pf_control_0_w(space,0,0x0082, 0x00ff); // 16x16
m_tilegen[1]->pf_control_0_w(space,1,0x0000, 0x00ff);
m_tilegen[1]->pf_control_0_w(space,2,0x0000, 0x00ff);
m_tilegen[1]->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions
m_tilegen[1]->pf_control_0_w(0,0x0082, 0x00ff); // 16x16
m_tilegen[1]->pf_control_0_w(1,0x0000, 0x00ff);
m_tilegen[1]->pf_control_0_w(2,0x0000, 0x00ff);
m_tilegen[1]->pf_control_0_w(3,0x0001, 0x00ff); // dimensions
m_tilegen[2]->pf_control_0_w(space,0,0x0082, 0x00ff); // 16x16
m_tilegen[2]->pf_control_0_w(space,1,0x0003, 0x00ff);
m_tilegen[2]->pf_control_0_w(space,2,0x0000, 0x00ff);
m_tilegen[2]->pf_control_0_w(space,3,0x0001, 0x00ff); // dimensions
m_tilegen[2]->pf_control_0_w(0,0x0082, 0x00ff); // 16x16
m_tilegen[2]->pf_control_0_w(1,0x0003, 0x00ff);
m_tilegen[2]->pf_control_0_w(2,0x0000, 0x00ff);
m_tilegen[2]->pf_control_0_w(3,0x0001, 0x00ff); // dimensions
// scroll registers got written elsewhere, copy them across
m_tilegen[0]->pf_control_1_w(space,0,0x0000, 0xffff); // no scroll?
m_tilegen[0]->pf_control_1_w(space,1,0x0000, 0xffff); // no scroll?
m_tilegen[0]->pf_control_1_w(0,0x0000, 0xffff); // no scroll?
m_tilegen[0]->pf_control_1_w(1,0x0000, 0xffff); // no scroll?
m_tilegen[1]->pf_control_1_w(space,0,m_automat_scroll_regs[3] - 0x010a, 0xffff);
m_tilegen[1]->pf_control_1_w(space,1,m_automat_scroll_regs[2], 0xffff);
m_tilegen[1]->pf_control_1_w(0,m_automat_scroll_regs[3] - 0x010a, 0xffff);
m_tilegen[1]->pf_control_1_w(1,m_automat_scroll_regs[2], 0xffff);
m_tilegen[2]->pf_control_1_w(space,0,m_automat_scroll_regs[1] - 0x0108, 0xffff);
m_tilegen[2]->pf_control_1_w(space,1,m_automat_scroll_regs[0], 0xffff);
m_tilegen[2]->pf_control_1_w(0,m_automat_scroll_regs[1] - 0x0108, 0xffff);
m_tilegen[2]->pf_control_1_w(1,m_automat_scroll_regs[0], 0xffff);
bool flip = m_tilegen[0]->get_flip_state();
m_tilegen[0]->set_flip_screen(flip);

View File

@ -87,8 +87,10 @@ deco_bac06_device::deco_bac06_device(const machine_config &mconfig, const char *
, m_gfxregion8x8(0)
, m_gfxregion16x16(0)
, m_wide(0)
, m_bppmult(0)
, m_bppmask(0)
, m_bppmult_8x8(0)
, m_bppmask_8x8(0)
, m_bppmult_16x16(0)
, m_bppmask_16x16(0)
, m_gfxdecode(*this, finder_base::DUMMY_TAG)
{
for (int i = 0; i < 8; i++)
@ -110,8 +112,12 @@ void deco_bac06_device::device_start()
create_tilemaps(m_gfxregion8x8, m_gfxregion16x16);
m_gfxcolmask = 0x0f;
m_bppmult = 0x10;
m_bppmask = 0x0f;
m_bppmult_8x8 = m_gfxdecode->gfx(m_gfxregion8x8)->granularity();
m_bppmask_8x8 = m_gfxdecode->gfx(m_gfxregion8x8)->depth() - 1;
m_bppmult_16x16 = m_gfxdecode->gfx(m_gfxregion16x16)->granularity();
m_bppmask_16x16 = m_gfxdecode->gfx(m_gfxregion16x16)->depth() - 1;
m_rambank = 0;
m_flip_screen = false;
@ -247,7 +253,9 @@ void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap,
uint16_t penmask,
uint16_t pencondition,
uint16_t colprimask,
uint16_t colpricondition)
uint16_t colpricondition,
uint8_t bppmult,
uint8_t bppmask)
{
const bitmap_ind16 &src_bitmap = tilemap_ptr->pixmap();
const bitmap_ind8 &flags_bitmap = tilemap_ptr->flagsmap();
@ -305,7 +313,8 @@ void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap,
else
src_y = scrolly;
for (y=0; y<=cliprect.bottom(); y++)
src_y += cliprect.top();
for (y=cliprect.top(); y<=cliprect.bottom(); y++)
{
if (row_scroll_enabled)
src_x=scrollx + rowscroll_ptr[(src_y >> (control1[3]&0xf))&(0x1ff>>(control1[3]&0xf))];
@ -315,7 +324,8 @@ void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap,
if (m_flip_screen)
src_x=(src_bitmap.width() - 256) - src_x;
for (x=0; x<=cliprect.right(); x++)
src_x += cliprect.left();
for (x=cliprect.left(); x<=cliprect.right(); x++)
{
if (col_scroll_enabled)
column_offset=colscroll_ptr[((src_x >> 3) >> (control1[2]&0xf))&(0x3f>>(control1[2]&0xf))];
@ -324,11 +334,11 @@ void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap,
colpri = flags_bitmap.pix8((src_y + column_offset)&height_mask, src_x&width_mask)&0xf;
src_x++;
if ((flags&TILEMAP_DRAW_OPAQUE) || (p&m_bppmask))
if ((flags&TILEMAP_DRAW_OPAQUE) || (p&bppmask))
{
if ((p&penmask)==pencondition)
if((colpri&colprimask)==colpricondition)
bitmap.pix16(y, x) = p+(colpri&m_gfxcolmask)*m_bppmult;
bitmap.pix16(y, x) = p+(colpri&m_gfxcolmask)*bppmult;
}
}
src_y++;
@ -338,6 +348,7 @@ void deco_bac06_device::custom_tilemap_draw(bitmap_ind16 &bitmap,
void deco_bac06_device::deco_bac06_pf_draw(bitmap_ind16 &bitmap,const rectangle &cliprect,int flags,uint16_t penmask, uint16_t pencondition,uint16_t colprimask, uint16_t colpricondition)
{
tilemap_t* tm = nullptr;
uint8_t bppmult = 0, bppmask = 0;
int tm_dimensions = m_pf_control_0[3] & 0x3;
if (tm_dimensions == 3) tm_dimensions = 1; // 3 is invalid / the same as 1?
@ -347,10 +358,14 @@ void deco_bac06_device::deco_bac06_pf_draw(bitmap_ind16 &bitmap,const rectangle
if (m_supports_8x8)
{
tm = m_pf8x8_tilemap[tm_dimensions];
bppmult = m_bppmult_8x8;
bppmask = m_bppmask_8x8;
}
else if (m_supports_16x16)
{
tm = m_pf16x16_tilemap[tm_dimensions];
bppmult = m_bppmult_16x16;
bppmask = m_bppmask_16x16;
}
}
else // 16x16 tiles mode is selected
@ -358,30 +373,45 @@ void deco_bac06_device::deco_bac06_pf_draw(bitmap_ind16 &bitmap,const rectangle
if (m_supports_16x16)
{
tm = m_pf16x16_tilemap[tm_dimensions];
bppmult = m_bppmult_16x16;
bppmask = m_bppmask_16x16;
}
else if (m_supports_8x8)
{
tm = m_pf8x8_tilemap[tm_dimensions];
bppmult = m_bppmult_8x8;
bppmask = m_bppmask_8x8;
}
}
if (tm)
custom_tilemap_draw(bitmap,cliprect,tm,m_pf_rowscroll.get(),m_pf_colscroll.get(),m_pf_control_0,m_pf_control_1,flags, penmask, pencondition, colprimask, colpricondition);
custom_tilemap_draw(bitmap,cliprect,tm,m_pf_rowscroll.get(),m_pf_colscroll.get(),m_pf_control_0,m_pf_control_1,flags, penmask, pencondition, colprimask, colpricondition, bppmult, bppmask);
}
// used for pocket gal bootleg, which doesn't set registers properly and simply expects a fixed size tilemap.
void deco_bac06_device::deco_bac06_pf_draw_bootleg(bitmap_ind16 &bitmap,const rectangle &cliprect,int flags, int mode, int type)
{
tilemap_t* tm = nullptr;
if (!mode) tm = m_pf8x8_tilemap[type];
else tm = m_pf16x16_tilemap[type];
uint8_t bppmult, bppmask;
if (!mode)
{
tm = m_pf8x8_tilemap[type];
bppmult = m_bppmult_8x8;
bppmask = m_bppmask_8x8;
}
else
{
tm = m_pf16x16_tilemap[type];
bppmult = m_bppmult_16x16;
bppmask = m_bppmask_16x16;
}
custom_tilemap_draw(bitmap,cliprect,tm,m_pf_rowscroll.get(),m_pf_colscroll.get(),nullptr,nullptr,flags, 0, 0, 0, 0);
custom_tilemap_draw(bitmap,cliprect,tm,m_pf_rowscroll.get(),m_pf_colscroll.get(),nullptr,nullptr,flags, 0, 0, 0, 0, bppmult, bppmask);
}
WRITE16_MEMBER( deco_bac06_device::pf_control_0_w )
void deco_bac06_device::pf_control_0_w(offs_t offset, u16 data, u16 mem_mask)
{
int old_register0 = m_pf_control_0[0];
@ -412,7 +442,7 @@ WRITE16_MEMBER( deco_bac06_device::pf_control_0_w )
// I don't know WHY Stadium Hero uses this as a bank but the RAM test expects it..
// I'm curious as to if anything else sets it tho
if (strcmp(machine().system().name,"stadhero"))
printf("tilemap ram bank change to %d\n", newbank&1);
logerror("tilemap ram bank change to %02x\n", newbank&1);
dirty_all = true;
m_rambank = newbank&1;
@ -429,19 +459,19 @@ WRITE16_MEMBER( deco_bac06_device::pf_control_0_w )
}
}
READ16_MEMBER( deco_bac06_device::pf_control_1_r )
u16 deco_bac06_device::pf_control_1_r(offs_t offset, u16 mem_mask)
{
offset &= 7;
return m_pf_control_1[offset];
}
WRITE16_MEMBER( deco_bac06_device::pf_control_1_w )
void deco_bac06_device::pf_control_1_w(offs_t offset, u16 data, u16 mem_mask)
{
offset &= 7;
COMBINE_DATA(&m_pf_control_1[offset]);
}
WRITE16_MEMBER( deco_bac06_device::pf_data_w )
void deco_bac06_device::pf_data_w(offs_t offset, u16 data, u16 mem_mask)
{
if (m_rambank&1) offset+=0x1000;
@ -454,144 +484,143 @@ WRITE16_MEMBER( deco_bac06_device::pf_data_w )
}
}
READ16_MEMBER( deco_bac06_device::pf_data_r )
u16 deco_bac06_device::pf_data_r(offs_t offset, u16 mem_mask)
{
if (m_rambank&1) offset+=0x1000;
return m_pf_data[offset];
}
WRITE8_MEMBER( deco_bac06_device::pf_data_8bit_w )
void deco_bac06_device::pf_data_8bit_w(offs_t offset, u8 data)
{
if (offset&1)
pf_data_w(space,offset/2,data,0x00ff);
pf_data_w(offset/2,data,0x00ff);
else
pf_data_w(space,offset/2,data<<8,0xff00);
pf_data_w(offset/2,data<<8,0xff00);
}
READ8_MEMBER( deco_bac06_device::pf_data_8bit_r )
u8 deco_bac06_device::pf_data_8bit_r(offs_t offset)
{
if (offset&1) /* MSB */
return pf_data_r(space,offset/2,0x00ff);
return pf_data_r(offset/2,0x00ff);
else
return pf_data_r(space,offset/2,0xff00)>>8;
return pf_data_r(offset/2,0xff00)>>8;
}
WRITE16_MEMBER( deco_bac06_device::pf_rowscroll_w )
void deco_bac06_device::pf_rowscroll_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_pf_rowscroll[offset]);
}
WRITE16_MEMBER( deco_bac06_device::pf_colscroll_w )
void deco_bac06_device::pf_colscroll_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_pf_colscroll[offset]);
}
READ16_MEMBER( deco_bac06_device::pf_rowscroll_r )
u16 deco_bac06_device::pf_rowscroll_r(offs_t offset, u16 mem_mask)
{
return m_pf_rowscroll[offset];
}
READ16_MEMBER( deco_bac06_device::pf_colscroll_r )
u16 deco_bac06_device::pf_colscroll_r(offs_t offset, u16 mem_mask)
{
return m_pf_colscroll[offset];
}
/* used by dec8.cpp */
WRITE8_MEMBER( deco_bac06_device::pf_control0_8bit_w )
void deco_bac06_device::pf_control0_8bit_w(offs_t offset, u8 data)
{
if (offset&1)
pf_control_0_w(space,offset/2,data,0x00ff); // oscar (mirrors?)
pf_control_0_w(offset/2,data,0x00ff); // oscar (mirrors?)
else
pf_control_0_w(space,offset/2,data,0x00ff);
pf_control_0_w(offset/2,data,0x00ff);
}
/* used by dec8.cpp */
READ8_MEMBER( deco_bac06_device::pf_control1_8bit_r )
u8 deco_bac06_device::pf_control1_8bit_r(offs_t offset)
{
if (offset&1)
return pf_control_1_r(space,offset/2,0x00ff);
return pf_control_1_r(offset/2,0x00ff);
else
return pf_control_1_r(space,offset/2,0xff00)>>8;
return pf_control_1_r(offset/2,0xff00)>>8;
}
/* used by dec8.cpp */
WRITE8_MEMBER( deco_bac06_device::pf_control1_8bit_w )
void deco_bac06_device::pf_control1_8bit_w(offs_t offset, u8 data)
{
if (offset<4) // these registers are 16-bit?
{
if (offset&1)
pf_control_1_w(space,offset/2,data,0x00ff);
pf_control_1_w(offset/2,data,0x00ff);
else
pf_control_1_w(space,offset/2,data<<8,0xff00);
pf_control_1_w(offset/2,data<<8,0xff00);
}
else // these registers are 8-bit and mirror? (triothep vs actfancr)
{
if (offset&1)
pf_control_1_w(space,offset/2,data,0x00ff);
pf_control_1_w(offset/2,data,0x00ff);
else
pf_control_1_w(space,offset/2,data,0x00ff);
pf_control_1_w(offset/2,data,0x00ff);
}
}
READ8_MEMBER( deco_bac06_device::pf_rowscroll_8bit_r )
u8 deco_bac06_device::pf_rowscroll_8bit_r(offs_t offset)
{
if (offset&1)
return pf_rowscroll_r(space,offset/2,0x00ff);
return pf_rowscroll_r(offset/2,0x00ff);
else
return pf_rowscroll_r(space,offset/2,0xff00)>>8;
return pf_rowscroll_r(offset/2,0xff00)>>8;
}
WRITE8_MEMBER( deco_bac06_device::pf_rowscroll_8bit_w )
void deco_bac06_device::pf_rowscroll_8bit_w(offs_t offset, u8 data)
{
if (offset&1)
pf_rowscroll_w(space,offset/2,data,0x00ff);
pf_rowscroll_w(offset/2,data,0x00ff);
else
pf_rowscroll_w(space,offset/2,data<<8,0xff00);
pf_rowscroll_w(offset/2,data<<8,0xff00);
}
READ8_MEMBER( deco_bac06_device::pf_rowscroll_8bit_swap_r )
u8 deco_bac06_device::pf_rowscroll_8bit_swap_r(offs_t offset)
{
if (offset&1)
return pf_rowscroll_r(space,offset/2,0xff00)>>8;
return pf_rowscroll_r(offset/2,0xff00)>>8;
else
return pf_rowscroll_r(space,offset/2,0x00ff);
return pf_rowscroll_r(offset/2,0x00ff);
}
WRITE8_MEMBER( deco_bac06_device::pf_rowscroll_8bit_swap_w )
void deco_bac06_device::pf_rowscroll_8bit_swap_w(offs_t offset, u8 data)
{
if (offset&1)
pf_rowscroll_w(space,offset/2,data<<8,0xff00);
pf_rowscroll_w(offset/2,data<<8,0xff00);
else
pf_rowscroll_w(space,offset/2,data,0x00ff);
pf_rowscroll_w(offset/2,data,0x00ff);
}
/* used by hippodrm */
WRITE8_MEMBER( deco_bac06_device::pf_control0_8bit_packed_w )
void deco_bac06_device::pf_control0_8bit_packed_w(offs_t offset, u8 data)
{
if (offset&1)
pf_control_0_w(space,offset/2,data<<8,0xff00);
pf_control_0_w(offset/2,data<<8,0xff00);
else
pf_control_0_w(space,offset/2,data,0x00ff);
pf_control_0_w(offset/2,data,0x00ff);
}
/* used by hippodrm */
WRITE8_MEMBER( deco_bac06_device::pf_control1_8bit_swap_w )
void deco_bac06_device::pf_control1_8bit_swap_w(offs_t offset, u8 data)
{
pf_control1_8bit_w(space, offset^1, data);
pf_control1_8bit_w(offset^1, data);
}
/* used by hippodrm */
READ8_MEMBER( deco_bac06_device::pf_data_8bit_swap_r )
u8 deco_bac06_device::pf_data_8bit_swap_r(offs_t offset)
{
return pf_data_8bit_r(space, offset^1);
return pf_data_8bit_r(offset^1);
}
/* used by hippodrm */
WRITE8_MEMBER( deco_bac06_device::pf_data_8bit_swap_w )
void deco_bac06_device::pf_data_8bit_swap_w(offs_t offset, u8 data)
{
pf_data_8bit_w(space, offset^1, data);
pf_data_8bit_w(offset^1, data);
}

View File

@ -60,9 +60,7 @@ public:
*/
uint8_t get_flip_state(void) { return m_pf_control_0[0]&0x80; };
void set_colmask(int data) { m_gfxcolmask = data; }
void set_bppmultmask( int mult, int mask ) { m_bppmult = mult; m_bppmask = mask; } // stadium hero has 3bpp tiles
void set_flip_screen(bool flip);
uint8_t m_gfxcolmask;
@ -71,37 +69,37 @@ public:
/* 16-bit accessors */
DECLARE_WRITE16_MEMBER( pf_control_0_w );
DECLARE_READ16_MEMBER( pf_control_1_r );
DECLARE_WRITE16_MEMBER( pf_control_1_w );
void pf_control_0_w(offs_t offset, u16 data, u16 mem_mask);
u16 pf_control_1_r(offs_t offset, u16 mem_mask);
void pf_control_1_w(offs_t offset, u16 data, u16 mem_mask);
DECLARE_WRITE16_MEMBER( pf_data_w );
DECLARE_READ16_MEMBER( pf_data_r );
DECLARE_WRITE16_MEMBER( pf_rowscroll_w );
DECLARE_READ16_MEMBER( pf_rowscroll_r );
DECLARE_WRITE16_MEMBER( pf_colscroll_w );
DECLARE_READ16_MEMBER( pf_colscroll_r );
void pf_data_w(offs_t offset, u16 data, u16 mem_mask);
u16 pf_data_r(offs_t offset, u16 mem_mask);
void pf_rowscroll_w(offs_t offset, u16 data, u16 mem_mask);
u16 pf_rowscroll_r(offs_t offset, u16 mem_mask);
void pf_colscroll_w(offs_t offset, u16 data, u16 mem_mask);
u16 pf_colscroll_r(offs_t offset, u16 mem_mask);
/* 8-bit accessors */
/* for dec8.cpp, pcktgal.cpp */
DECLARE_READ8_MEMBER( pf_data_8bit_r );
DECLARE_WRITE8_MEMBER( pf_data_8bit_w );
/* for dec8.cpp, pcktgal.cpp (Big endian CPU (6809, etc) based games) */
u8 pf_data_8bit_r(offs_t offset);
void pf_data_8bit_w(offs_t offset, u8 data);
DECLARE_WRITE8_MEMBER( pf_control0_8bit_w );
DECLARE_READ8_MEMBER( pf_control1_8bit_r );
DECLARE_WRITE8_MEMBER( pf_control1_8bit_w );
void pf_control0_8bit_w(offs_t offset, u8 data);
u8 pf_control1_8bit_r(offs_t offset);
void pf_control1_8bit_w(offs_t offset, u8 data);
DECLARE_READ8_MEMBER( pf_rowscroll_8bit_r );
DECLARE_WRITE8_MEMBER( pf_rowscroll_8bit_w );
u8 pf_rowscroll_8bit_r(offs_t offset);
void pf_rowscroll_8bit_w(offs_t offset, u8 data);
/* for hippodrm (dec0.cpp) and actfancr / triothep (H6280 based games)*/
DECLARE_WRITE8_MEMBER( pf_control0_8bit_packed_w );
DECLARE_WRITE8_MEMBER( pf_control1_8bit_swap_w );
DECLARE_READ8_MEMBER( pf_data_8bit_swap_r );
DECLARE_WRITE8_MEMBER( pf_data_8bit_swap_w );
DECLARE_READ8_MEMBER( pf_rowscroll_8bit_swap_r );
DECLARE_WRITE8_MEMBER( pf_rowscroll_8bit_swap_w );
/* for hippodrm (dec0.cpp) and actfancr / triothep (Little endian CPU (HuC6280, etc) based games)*/
void pf_control0_8bit_packed_w(offs_t offset, u8 data);
void pf_control1_8bit_swap_w(offs_t offset, u8 data);
u8 pf_data_8bit_swap_r(offs_t offset);
void pf_data_8bit_swap_w(offs_t offset, u8 data);
u8 pf_rowscroll_8bit_swap_r(offs_t offset);
void pf_rowscroll_8bit_swap_w(offs_t offset, u8 data);
protected:
virtual void device_start() override;
@ -111,8 +109,11 @@ protected:
uint8_t m_gfxregion16x16;
int m_wide;
uint8_t m_bppmult;
uint8_t m_bppmask;
uint8_t m_bppmult_8x8;
uint8_t m_bppmask_8x8;
uint8_t m_bppmult_16x16;
uint8_t m_bppmask_16x16;
void custom_tilemap_draw(bitmap_ind16 &bitmap,
const rectangle &cliprect,
@ -122,7 +123,8 @@ protected:
const uint16_t *control0,
const uint16_t *control1,
int flags,
uint16_t penmask, uint16_t pencondition,uint16_t colprimask, uint16_t colpricondition);
uint16_t penmask, uint16_t pencondition,uint16_t colprimask, uint16_t colpricondition,
uint8_t bppmult, uint8_t bppmask);
private:
TILEMAP_MAPPER_MEMBER(tile_shape0_scan);

View File

@ -27,7 +27,6 @@ uint32_t stadhero_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
m_spritegen->set_flip_screen(flip);
m_pf1_tilemap->set_flip(flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
m_tilegen->set_bppmultmask(0x8, 0x7);
m_tilegen->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00);
m_spritegen->draw_sprites(bitmap, cliprect, m_spriteram, 0x00, 0x00, 0x0f);
m_pf1_tilemap->draw(screen, bitmap, cliprect, 0,0);