/* fetch the initial source word */
srcword = (this->*word_read)(*m_program, srcwordaddr++ << 1);
+ srcword &= m_plane_mask_inv;
readwrites++;
/* fetch the initial dest word */
if (srcbit + BITS_PER_PIXEL > 16)
{
srcword |= (this->*word_read)(*m_program, srcwordaddr++ << 1) << 16;
+ srcword &= m_plane_mask_inv;
readwrites++;
}
dstbit += BITS_PER_PIXEL;
if (dstbit > 16)
{
- if (m_plane_masking) dstword = do_plane_masking((this->*word_read)(*m_program, dstwordaddr << 1), dstword);
+ if (m_plane_mask) dstword = do_plane_masking((this->*word_read)(*m_program, dstwordaddr << 1), dstword);
(this->*word_write)(*m_program, dstwordaddr++ << 1, dstword);
readwrites++;
dstbit -= 16;
readwrites++;
}
- if (m_plane_masking) dstword = do_plane_masking((this->*word_read)(*m_program, dstwordaddr << 1), dstword);
+ if (m_plane_mask) dstword = do_plane_masking((this->*word_read)(*m_program, dstwordaddr << 1), dstword);
(this->*word_write)(*m_program, dstwordaddr++ << 1, dstword);
readwrites++;
}
/* fetch the initial source word */
srcword = (this->*word_read)(*m_program, --swordaddr << 1);
+ srcword &= m_plane_mask_inv;
srcmask = PIXEL_MASK << ((saddr - BITS_PER_PIXEL) & 15);
/* handle the right partial word */
if (srcmask == 0)
{
srcword = (this->*word_read)(*m_program, --swordaddr << 1);
+ srcword &= m_plane_mask_inv;
srcmask = PIXEL_MASK << (16 - BITS_PER_PIXEL);
}
}
/* write the result */
- if (m_plane_masking) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
+ if (m_plane_mask) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
(this->*word_write)(*m_program, dwordaddr << 1, dstword);
}
if (srcmask == 0)
{
srcword = (this->*word_read)(*m_program, --swordaddr << 1);
+ srcword &= m_plane_mask_inv;
srcmask = PIXEL_MASK << (16 - BITS_PER_PIXEL);
}
}
/* write the result */
- if (m_plane_masking) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
+ if (m_plane_mask) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
(this->*word_write)(*m_program, dwordaddr << 1, dstword);
}
if (srcmask == 0)
{
srcword = (this->*word_read)(*m_program, --swordaddr << 1);
+ srcword &= m_plane_mask_inv;
srcmask = PIXEL_MASK << (16 - BITS_PER_PIXEL);
}
}
/* write the result */
- if (m_plane_masking) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
+ if (m_plane_mask) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
(this->*word_write)(*m_program, dwordaddr << 1, dstword);
}
/* fetch the initial source word */
srcword = (this->*word_read)(*m_program, swordaddr++ << 1);
+ srcword &= m_plane_mask_inv;
srcmask = 1 << (saddr & 15);
/* handle the left partial word */
if (srcmask == 0)
{
srcword = (this->*word_read)(*m_program, swordaddr++ << 1);
+ srcword &= m_plane_mask_inv;
srcmask = 0x0001;
}
}
/* write the result */
- if (m_plane_masking) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
+ if (m_plane_mask) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
(this->*word_write)(*m_program, dwordaddr++ << 1, dstword);
}
if (srcmask == 0)
{
srcword = (this->*word_read)(*m_program, swordaddr++ << 1);
+ srcword &= m_plane_mask_inv;
srcmask = 0x0001;
}
}
/* write the result */
- if (m_plane_masking) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
+ if (m_plane_mask) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
(this->*word_write)(*m_program, dwordaddr++ << 1, dstword);
}
if (srcmask == 0)
{
srcword = (this->*word_read)(*m_program, swordaddr++ << 1);
+ srcword &= m_plane_mask_inv;
srcmask = 0x0001;
}
}
/* write the result */
- if (m_plane_masking) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
+ if (m_plane_mask) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
(this->*word_write)(*m_program, dwordaddr++ << 1, dstword);
}
}
/* write the result */
- if (m_plane_masking) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
+ if (m_plane_mask) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
(this->*word_write)(*m_program, dwordaddr++ << 1, dstword);
}
}
/* write the result */
- if (m_plane_masking) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
+ if (m_plane_mask) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
(this->*word_write)(*m_program, dwordaddr++ << 1, dstword);
}
}
/* write the result */
- if (m_plane_masking) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
+ if (m_plane_mask) dstword = do_plane_masking((this->*word_read)(*m_program, dwordaddr << 1), dstword);
(this->*word_write)(*m_program, dwordaddr++ << 1, dstword);
}
return result | (m_program->read_word(A+2)<<16);
}
+inline UINT32 tms340x0_device::TMS34010_RDMEM_WORD_MASK(offs_t A)
+{
+ UINT32 result = m_program->read_word(A);
+ result &= m_plane_mask_inv;
+ return result;
+}
+inline UINT32 tms340x0_device::TMS34010_RDMEM_DWORD_MASK(offs_t A)
+{
+ UINT32 result = m_program->read_word(A);
+ result |= (m_program->read_word(A + 2) << 16);
+ result &= m_plane_mask_inv;
+ return result;
+}
+
+
#define TMS34010_WRMEM(A,V) (m_program->write_byte(A,V))
#define TMS34010_WRMEM_WORD(A,V) (m_program->write_word(A,V))
inline void tms340x0_device::TMS34010_WRMEM_DWORD(offs_t A, UINT32 V)
inline void tms340x0_device::TMS34010_WRMEM_WORD_MASK(offs_t A, UINT32 V)
{
- if (m_plane_masking) V = do_plane_masking(TMS34010_RDMEM_WORD(A), V);
+ if (m_plane_mask) V = do_plane_masking(TMS34010_RDMEM_WORD(A), V);
m_program->write_word(A, V);
}
inline void tms340x0_device::TMS34010_WRMEM_DWORD_MASK(offs_t A, UINT32 V)
{
- if (m_plane_masking) V = do_plane_masking(TMS34010_RDMEM_DWORD(A), V);
+ if (m_plane_mask) V = do_plane_masking(TMS34010_RDMEM_DWORD(A), V);
m_program->write_word(A, V);
m_program->write_word(A + 2, V >> 16);
}
-UINT32 tms340x0_device::do_plane_masking(UINT32 r, UINT32 w)
+inline UINT32 tms340x0_device::do_plane_masking(UINT32 r, UINT32 w)
{
- UINT32 pmask = IOREG(REG_PMASK);
- pmask |= pmask << 16;
- UINT32 o = (r & pmask) | (w & ~pmask);
+ UINT32 o = (r & m_plane_mask) | (w & m_plane_mask_inv);
return o;
}
/* No Raster Op + No Transparency */
#define WP(m1,m2) \
UINT32 a = TOBYTE(offset & 0xfffffff0); \
- UINT32 pix = TMS34010_RDMEM_WORD(a); \
+ UINT32 pix = TMS34010_RDMEM_WORD_MASK(a); \
UINT32 shiftcount = offset & m1; \
\
data &= m2; \
if (data) \
{ \
UINT32 a = TOBYTE(offset & 0xfffffff0); \
- UINT32 pix = TMS34010_RDMEM_WORD(a); \
+ UINT32 pix = TMS34010_RDMEM_WORD_MASK(a); \
UINT32 shiftcount = offset & m1; \
\
pix = (pix & ~(m2 << shiftcount)) | (data << shiftcount); \
/* Raster Op + No Transparency */
#define WP_R(m1,m2) \
UINT32 a = TOBYTE(offset & 0xfffffff0); \
- UINT32 pix = TMS34010_RDMEM_WORD(a); \
+ UINT32 pix = TMS34010_RDMEM_WORD_MASK(a); \
UINT32 shiftcount = offset & m1; \
\
data = (this->*m_raster_op)(data & m2, (pix >> shiftcount) & m2) & m2; \
/* Raster Op + Transparency */
#define WP_R_T(m1,m2) \
UINT32 a = TOBYTE(offset & 0xfffffff0); \
- UINT32 pix = TMS34010_RDMEM_WORD(a); \
+ UINT32 pix = TMS34010_RDMEM_WORD_MASK(a); \
UINT32 shiftcount = offset & m1; \
\
data = (this->*m_raster_op)(data & m2, (pix >> shiftcount) & m2) & m2; \
void tms340x0_device::write_pixel_r_16(offs_t offset, UINT32 data)
{
UINT32 a = TOBYTE(offset & 0xfffffff0);
- TMS34010_WRMEM_WORD_MASK(a, (this->*m_raster_op)(data, TMS34010_RDMEM_WORD(a)));
+ TMS34010_WRMEM_WORD_MASK(a, (this->*m_raster_op)(data, TMS34010_RDMEM_WORD_MASK(a)));
}
void tms340x0_device::write_pixel_r_32(offs_t offset, UINT32 data)
{
UINT32 a = TOBYTE(offset & 0xffffffe0);
- TMS34010_WRMEM_DWORD_MASK(a, (this->*m_raster_op)(data, TMS34010_RDMEM_DWORD(a)));
+ TMS34010_WRMEM_DWORD_MASK(a, (this->*m_raster_op)(data, TMS34010_RDMEM_DWORD_MASK(a)));
}
/* Raster Op + Transparency */
void tms340x0_device::write_pixel_r_t_16(offs_t offset, UINT32 data)
{
UINT32 a = TOBYTE(offset & 0xfffffff0);
- data = (this->*m_raster_op)(data, TMS34010_RDMEM_WORD(a));
+ data = (this->*m_raster_op)(data, TMS34010_RDMEM_WORD_MASK(a));
if (data)
TMS34010_WRMEM_WORD_MASK(a, data);
void tms340x0_device::write_pixel_r_t_32(offs_t offset, UINT32 data)
{
UINT32 a = TOBYTE(offset & 0xffffffe0);
- data = (this->*m_raster_op)(data, TMS34010_RDMEM_DWORD(a));
+ data = (this->*m_raster_op)(data, TMS34010_RDMEM_DWORD_MASK(a));
if (data)
TMS34010_WRMEM_DWORD_MASK(a, data);
break;
case REG_PMASK:
- m_plane_masking = data != 0;
+ m_plane_mask = (data << 16) | data;
+ m_plane_mask_inv = m_plane_mask ^ 0xffffffff;
break;
case REG_DPYCTL: