Moved ROZ registers out of the legacy code (nw)

This commit is contained in:
angelosa 2017-06-29 03:07:34 +02:00
parent b85cbce394
commit a19b7271d5
2 changed files with 91 additions and 59 deletions

View File

@ -364,10 +364,21 @@ GFXDECODE_END
// we use decimals here to match documentation
static ADDRESS_MAP_START( regs_map, AS_IO, 8, ygv608_device )
// interrupt section
AM_RANGE(14, 14) AM_READWRITE(irq_mask_r,irq_mask_w)
AM_RANGE(15, 16) AM_READWRITE(irq_ctrl_r,irq_ctrl_w)
// base address
AM_RANGE(17, 24) AM_WRITE(base_address_w)
// ROZ parameters
AM_RANGE(25, 27) AM_WRITE(roz_ax_w)
AM_RANGE(28, 29) AM_WRITE(roz_dx_w)
AM_RANGE(30, 31) AM_WRITE(roz_dxy_w)
AM_RANGE(32, 34) AM_WRITE(roz_ay_w)
AM_RANGE(35, 36) AM_WRITE(roz_dy_w)
AM_RANGE(37, 38) AM_WRITE(roz_dyx_w)
// CRTC
AM_RANGE(39, 46) AM_WRITE(crtc_w)
ADDRESS_MAP_END
@ -1841,6 +1852,60 @@ WRITE8_MEMBER( ygv608_device::base_address_w )
m_tilemap_resize = 1;
}
// R#25W - R#27W - X coordinate of initial value
WRITE8_MEMBER( ygv608_device::roz_ax_w ) { m_ax = roz_convert_raw24(&m_raw_ax,offset,data); }
// R#28W - R#29W - increment of coordinate in X direction
WRITE8_MEMBER( ygv608_device::roz_dx_w ) { m_dx = roz_convert_raw16(&m_raw_dx,offset,data); }
// R#30W - R#31W - increment of coordinate in X direction in movement toward Y direction
WRITE8_MEMBER( ygv608_device::roz_dxy_w ) { m_dxy = roz_convert_raw16(&m_raw_dxy,offset,data); }
// R#32W - R#34W - Y coordinate of initial value
WRITE8_MEMBER( ygv608_device::roz_ay_w ) { m_ay = roz_convert_raw24(&m_raw_ay,offset,data); }
// R#35W - R#36W - increment of coordinate in Y direction
WRITE8_MEMBER( ygv608_device::roz_dy_w ) { m_dy = roz_convert_raw16(&m_raw_dy,offset,data); }
// R#37W - R#38W - increment of coordinate in Y direction in movement toward X direction
WRITE8_MEMBER( ygv608_device::roz_dyx_w ) { m_dyx = roz_convert_raw16(&m_raw_dyx,offset,data); }
// ROZ assign helpers
inline uint32_t ygv608_device::roz_convert_raw24(uint32_t *raw_reg, uint8_t offset, uint8_t data)
{
const uint32_t roz_data_mask24 = 0x1fffff;
const uint32_t mem_mask = (0xff << offset*8) ^ ~0;
uint32_t res;
// substitute the new byte value into the raw register
*raw_reg &= mem_mask;
*raw_reg |= data << offset*8;
// convert raw to the given register
res = *raw_reg & roz_data_mask24;
res <<= 7;
if( res & 0x08000000 ) res |= 0xf8000000; // 2s complement
return res;
}
inline uint32_t ygv608_device::roz_convert_raw16(uint16_t *raw_reg, uint8_t offset, uint8_t data)
{
const uint16_t roz_data_mask16 = 0x1fff;
const uint16_t mem_mask = (0xff << offset*8) ^ ~0;
uint32_t res;
// substitute the new byte value into the raw register
*raw_reg &= mem_mask;
*raw_reg |= data << offset*8;
// convert raw to the given register
res = *raw_reg & roz_data_mask16;
res <<= 7;
if( res & 0x00080000 ) res |= 0xfff80000; // 2s complement
return res;
}
// R#39W - R#46W display scan control write
WRITE8_MEMBER( ygv608_device::crtc_w )
@ -2070,62 +2135,6 @@ void ygv608_device::SetPostShortcuts(int reg )
//ShowYGV608Registers();
break;
#if 0
case 17 : case 18 : case 19 : case 20 :
case 21 : case 22 : case 23 : case 24 :
plane = (reg-17) >> 2;
addr = ( (reg-17) << 1 ) & 0x07;
m_base_addr[plane][addr] = m_regs.b[reg] & 0x0f;
m_base_addr[plane][addr+1] = m_regs.b[reg] >> 4;
break;
#endif
case 25 : case 26 : case 27 :
m_ax = (int)(m_regs.s.ax16 & 0x1f) << 16 |
(int)m_regs.s.ax8 << 8 |
(int)m_regs.s.ax0;
m_ax <<= 7;
if( m_ax & 0x08000000 ) m_ax |= 0xf8000000; // 2s complement
//logerror( "m_ax = $%X\n", m_ax );
break;
case 28 : case 29 :
m_dx = (int)(m_regs.s.dx8 & 0x1f) << 8 | (int)m_regs.s.dx0;
m_dx <<= 7;
if( m_dx & 0x00080000 ) m_dx |= 0xfff80000; // 2s complement
break;
case 30 : case 31 :
m_dxy = (int)(m_regs.s.dxy8 & 0x1f) << 8 | (int)m_regs.s.dxy0;
m_dxy <<= 7;
if( m_dxy & 0x00080000 ) m_dxy |= 0xfff80000; // 2s complement
break;
case 32 : case 33 : case 34 :
m_ay = (int)(m_regs.s.ay16 & 0x1f) << 16 |
(int)m_regs.s.ay8 << 8 |
(int)m_regs.s.ay0;
m_ay <<= 7;
if( m_ay & 0x08000000 ) m_ay |= 0xf8000000; // 2s complement
//logerror( "m_ay = $%X\n", m_ay );
break;
case 35 : case 36 :
m_dy = (int)(m_regs.s.dy8 & 0x1f) << 8 | (int)m_regs.s.dy0;
m_dy <<= 7;
if( m_dy & 0x00080000 ) m_dy |= 0xfff80000; // 2s complement
break;
case 37 : case 38 :
m_dyx = (int)(m_regs.s.dyx8 & 0x1f) << 8 | (int)m_regs.s.dyx0;
m_dyx <<= 7;
if( m_dyx & 0x00080000 ) m_dyx |= 0xfff80000; // 2s complement
break;
case 40 : case 41 : case 42 :
//ShowYGV608Registers();
break;
}
}

View File

@ -48,6 +48,12 @@ public:
DECLARE_WRITE8_MEMBER(irq_ctrl_w);
DECLARE_WRITE8_MEMBER(crtc_w);
DECLARE_WRITE8_MEMBER(base_address_w);
DECLARE_WRITE8_MEMBER(roz_ax_w);
DECLARE_WRITE8_MEMBER(roz_dx_w);
DECLARE_WRITE8_MEMBER(roz_dxy_w);
DECLARE_WRITE8_MEMBER(roz_ay_w);
DECLARE_WRITE8_MEMBER(roz_dy_w);
DECLARE_WRITE8_MEMBER(roz_dyx_w);
// TODO: is this even a real connection?
void set_gfxbank(uint8_t gfxbank);
@ -226,9 +232,6 @@ private:
uint8_t m_na8_mask; // mask on/off na11/9:8
int m_col_shift; // shift in scroll table column index
// rotation, zoom shortcuts
uint32_t m_ax, m_dx, m_dxy, m_ay, m_dy, m_dyx;
// base address shortcuts
uint32_t m_base_addr[2][8];
uint32_t m_base_y_shift; // for extracting pattern y coord 'base'
@ -279,6 +282,26 @@ private:
int border_height; /**< VBW: vertical border size x 8 */
}m_crtc;
// rotation, zoom shortcuts
uint32_t m_ax; /**< AX */
uint32_t m_dx; /**< DX */
uint32_t m_dxy; /**< DXY */
uint32_t m_ay; /**< AY */
uint32_t m_dy; /**< DY */
uint32_t m_dyx; /**< DYX */
// raw register versions of above
uint32_t m_raw_ax;
uint16_t m_raw_dx;
uint16_t m_raw_dxy;
uint32_t m_raw_ay;
uint16_t m_raw_dy;
uint16_t m_raw_dyx;
// inline helpers for raw to ROZ conversion
uint32_t roz_convert_raw24(uint32_t *raw_reg, uint8_t offset, uint8_t data);
uint32_t roz_convert_raw16(uint16_t *raw_reg, uint8_t offset, uint8_t data);
void screen_configure();
attotime raster_sync_offset(); /**< adjust based off raster & CRTC parameters */
};