summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/decbac06.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/decbac06.cpp')
-rw-r--r--src/mame/video/decbac06.cpp153
1 files changed, 91 insertions, 62 deletions
diff --git a/src/mame/video/decbac06.cpp b/src/mame/video/decbac06.cpp
index e89d24f957d..68d3e889124 100644
--- a/src/mame/video/decbac06.cpp
+++ b/src/mame/video/decbac06.cpp
@@ -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);
}