mirror of
https://github.com/holub/mame
synced 2025-05-06 22:35:43 +03:00
ygv608.cpp: pattern name table pointer access (nw)
This commit is contained in:
parent
da37c10ca3
commit
c3cb63ac92
@ -366,6 +366,9 @@ GFXDECODE_END
|
|||||||
static ADDRESS_MAP_START( regs_map, AS_IO, 8, ygv608_device )
|
static ADDRESS_MAP_START( regs_map, AS_IO, 8, ygv608_device )
|
||||||
|
|
||||||
// address pointers
|
// address pointers
|
||||||
|
AM_RANGE( 0, 0) AM_READWRITE(pattern_name_table_y_r,pattern_name_table_y_w)
|
||||||
|
AM_RANGE( 1, 1) AM_READWRITE(pattern_name_table_x_r,pattern_name_table_x_w)
|
||||||
|
|
||||||
AM_RANGE( 3, 3) AM_READWRITE(sprite_address_r,sprite_address_w)
|
AM_RANGE( 3, 3) AM_READWRITE(sprite_address_r,sprite_address_w)
|
||||||
AM_RANGE( 4, 4) AM_READWRITE(scroll_address_r,scroll_address_w)
|
AM_RANGE( 4, 4) AM_READWRITE(scroll_address_r,scroll_address_w)
|
||||||
AM_RANGE( 5, 5) AM_READWRITE(palette_address_r,palette_address_w)
|
AM_RANGE( 5, 5) AM_READWRITE(palette_address_r,palette_address_w)
|
||||||
@ -1328,23 +1331,21 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma
|
|||||||
READ8_MEMBER( ygv608_device::pattern_name_table_r )
|
READ8_MEMBER( ygv608_device::pattern_name_table_r )
|
||||||
{
|
{
|
||||||
int pn = 0;
|
int pn = 0;
|
||||||
uint8_t xTile = m_regs.s.r1 & r1_pnx;
|
|
||||||
uint8_t yTile = m_regs.s.r0 & r0_pny;
|
|
||||||
|
|
||||||
switch (p0_state_r)
|
switch (p0_state_r)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
/* Are we reading from plane B? */
|
/* Are we reading from plane B? */
|
||||||
if (!((m_regs.s.r7 & r7_md) & MD_1PLANE) && (m_regs.s.r0 & r0_b_a))
|
if (!((m_regs.s.r7 & r7_md) & MD_1PLANE) && (m_plane_select_access == true))
|
||||||
pattern_name_base_r = ((m_page_y << m_pny_shift) << m_bits16);
|
pattern_name_base_r = ((m_page_y << m_pny_shift) << m_bits16);
|
||||||
|
|
||||||
/* read character from ram */
|
/* read character from ram */
|
||||||
pn = pattern_name_base_r + (((yTile << m_pny_shift) + xTile) << m_bits16);
|
pn = pattern_name_base_r + (((m_ytile_ptr << m_pny_shift) + m_xtile_ptr) << m_bits16);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
/* read character from ram */
|
/* read character from ram */
|
||||||
pn = pattern_name_base_r + (((yTile << m_pny_shift) + xTile) << m_bits16) + 1;
|
pn = pattern_name_base_r + (((m_ytile_ptr << m_pny_shift) + m_xtile_ptr) << m_bits16) + 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1358,7 +1359,7 @@ READ8_MEMBER( ygv608_device::pattern_name_table_r )
|
|||||||
pn, m_regs.s.r7 & r7_md, m_regs.s.r8 & r8_pgs,
|
pn, m_regs.s.r7 & r7_md, m_regs.s.r8 & r8_pgs,
|
||||||
m_page_x, m_page_y,
|
m_page_x, m_page_y,
|
||||||
pattern_name_base_r,
|
pattern_name_base_r,
|
||||||
xTile, yTile, m_pny_shift,
|
m_xtile_ptr, m_ytile_ptr, m_pny_shift,
|
||||||
m_bits16 );
|
m_bits16 );
|
||||||
pn = 0;
|
pn = 0;
|
||||||
}
|
}
|
||||||
@ -1369,40 +1370,7 @@ READ8_MEMBER( ygv608_device::pattern_name_table_r )
|
|||||||
|
|
||||||
if (p0_state_r == 2)
|
if (p0_state_r == 2)
|
||||||
{
|
{
|
||||||
if (m_regs.s.r0 & r0_pnya)
|
pattern_name_autoinc_check();
|
||||||
{
|
|
||||||
if (yTile++ == (m_page_y - 1))
|
|
||||||
{
|
|
||||||
yTile = 0;
|
|
||||||
if (xTile++ == (m_page_x - 1))
|
|
||||||
{
|
|
||||||
xTile = 0;
|
|
||||||
// we're now off this tile plane, toggle planes
|
|
||||||
m_regs.s.r0 ^= r0_b_a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_regs.s.r0 &= ~r0_pny;
|
|
||||||
m_regs.s.r0 |= yTile;
|
|
||||||
m_regs.s.r1 &= ~r1_pnx;
|
|
||||||
m_regs.s.r1 |= xTile;
|
|
||||||
}
|
|
||||||
else if (m_regs.s.r1 & r1_pnxa)
|
|
||||||
{
|
|
||||||
if (xTile++ == (m_page_x - 1))
|
|
||||||
{
|
|
||||||
xTile = 0;
|
|
||||||
if (yTile++ == (m_page_y - 1))
|
|
||||||
{
|
|
||||||
yTile = 0;
|
|
||||||
// we're now off this tile plane, toggle planes
|
|
||||||
m_regs.s.r0 ^= r0_b_a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_regs.s.r0 &= ~r0_pny;
|
|
||||||
m_regs.s.r0 |= yTile;
|
|
||||||
m_regs.s.r1 &= ~r1_pnx;
|
|
||||||
m_regs.s.r1 |= xTile;
|
|
||||||
}
|
|
||||||
p0_state_r = 0;
|
p0_state_r = 0;
|
||||||
pattern_name_base_r = 0;
|
pattern_name_base_r = 0;
|
||||||
}
|
}
|
||||||
@ -1503,23 +1471,21 @@ READ8_MEMBER( ygv608_device::system_control_r )
|
|||||||
WRITE8_MEMBER(ygv608_device::pattern_name_table_w)
|
WRITE8_MEMBER(ygv608_device::pattern_name_table_w)
|
||||||
{
|
{
|
||||||
int pn = 0;
|
int pn = 0;
|
||||||
uint8_t xTile = m_regs.s.r1 & r1_pnx;
|
|
||||||
uint8_t yTile = m_regs.s.r0 & r0_pny;
|
|
||||||
|
|
||||||
switch (p0_state_w)
|
switch (p0_state_w)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
/* Are we reading from plane B? */
|
/* Are we reading from plane B? */
|
||||||
if (!((m_regs.s.r7 & r7_md) & MD_1PLANE) && (m_regs.s.r0 & r0_b_a))
|
if (!((m_regs.s.r7 & r7_md) & MD_1PLANE) && (m_plane_select_access == true))
|
||||||
pattern_name_base_w = ((m_page_y << m_pny_shift) << m_bits16);
|
pattern_name_base_w = ((m_page_y << m_pny_shift) << m_bits16);
|
||||||
|
|
||||||
/* read character from ram */
|
/* read character from ram */
|
||||||
pn = pattern_name_base_w + (((yTile << m_pny_shift) + xTile) << m_bits16);
|
pn = pattern_name_base_w + (((m_ytile_ptr << m_pny_shift) + m_xtile_ptr) << m_bits16);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
/* read character from ram */
|
/* read character from ram */
|
||||||
pn = pattern_name_base_w + (((yTile << m_pny_shift) + xTile) << m_bits16) + 1;
|
pn = pattern_name_base_w + (((m_ytile_ptr << m_pny_shift) + m_xtile_ptr) << m_bits16) + 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1533,7 +1499,7 @@ WRITE8_MEMBER(ygv608_device::pattern_name_table_w)
|
|||||||
pn, m_regs.s.r7 & r7_md, m_regs.s.r8 & r8_pgs,
|
pn, m_regs.s.r7 & r7_md, m_regs.s.r8 & r8_pgs,
|
||||||
m_page_x, m_page_y,
|
m_page_x, m_page_y,
|
||||||
pattern_name_base_w,
|
pattern_name_base_w,
|
||||||
xTile, yTile, m_pny_shift,
|
m_xtile_ptr, m_ytile_ptr, m_pny_shift,
|
||||||
m_bits16 );
|
m_bits16 );
|
||||||
pn = 0;
|
pn = 0;
|
||||||
}
|
}
|
||||||
@ -1546,42 +1512,47 @@ WRITE8_MEMBER(ygv608_device::pattern_name_table_w)
|
|||||||
|
|
||||||
if (p0_state_w == 2)
|
if (p0_state_w == 2)
|
||||||
{
|
{
|
||||||
if (m_regs.s.r0 & r0_pnya)
|
pattern_name_autoinc_check();
|
||||||
{
|
|
||||||
if (yTile++ == (m_page_y - 1))
|
|
||||||
{
|
|
||||||
yTile = 0;
|
|
||||||
if (xTile++ == (m_page_x - 1))
|
|
||||||
{
|
|
||||||
xTile = 0;
|
|
||||||
m_regs.s.r0 ^= r0_b_a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_regs.s.r0 &= ~r0_pny;
|
|
||||||
m_regs.s.r0 |= yTile;
|
|
||||||
m_regs.s.r1 &= ~r1_pnx;
|
|
||||||
m_regs.s.r1 |= xTile;
|
|
||||||
}
|
|
||||||
else if (m_regs.s.r1 & r1_pnxa)
|
|
||||||
{
|
|
||||||
if (xTile++ == (m_page_x - 1))
|
|
||||||
{
|
|
||||||
xTile = 0;
|
|
||||||
if (yTile++ == (m_page_y - 1))
|
|
||||||
{
|
|
||||||
yTile = 0;
|
|
||||||
m_regs.s.r0 ^= r0_b_a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_regs.s.r0 &= ~r0_pny;
|
|
||||||
m_regs.s.r0 |= yTile;
|
|
||||||
m_regs.s.r1 &= ~r1_pnx;
|
|
||||||
m_regs.s.r1 |= xTile;
|
|
||||||
}
|
|
||||||
p0_state_w = 0;
|
p0_state_w = 0;
|
||||||
pattern_name_base_w = 0;
|
pattern_name_base_w = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ygv608_device::pattern_name_autoinc_check()
|
||||||
|
{
|
||||||
|
uint8_t xTile = m_xtile_ptr;
|
||||||
|
uint8_t yTile = m_ytile_ptr;
|
||||||
|
|
||||||
|
if (m_ytile_autoinc == true)
|
||||||
|
{
|
||||||
|
// we are incrementing in Y direction
|
||||||
|
if (yTile++ == (m_page_y - 1))
|
||||||
|
{
|
||||||
|
yTile = 0;
|
||||||
|
if (xTile++ == (m_page_x - 1))
|
||||||
|
{
|
||||||
|
xTile = 0;
|
||||||
|
m_plane_select_access ^= 1; // flip A/B plane
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_ytile_ptr = yTile;
|
||||||
|
m_xtile_ptr = xTile;
|
||||||
|
}
|
||||||
|
else if (m_xtile_autoinc == true)
|
||||||
|
{
|
||||||
|
// we are incrementing in X direction
|
||||||
|
if (xTile++ == (m_page_x - 1))
|
||||||
|
{
|
||||||
|
xTile = 0;
|
||||||
|
if (yTile++ == (m_page_y - 1))
|
||||||
|
{
|
||||||
|
yTile = 0;
|
||||||
|
m_plane_select_access ^= 1; // flip A/B plane
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_ytile_ptr = yTile;
|
||||||
|
m_xtile_ptr = xTile;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// P#1W - sprite data port
|
// P#1W - sprite data port
|
||||||
@ -1776,6 +1747,42 @@ void ygv608_device::HandleRomTransfers(uint8_t type)
|
|||||||
*
|
*
|
||||||
****************************************/
|
****************************************/
|
||||||
|
|
||||||
|
// R#0R - Pattern Name Table Access pointer Y
|
||||||
|
READ8_MEMBER( ygv608_device::pattern_name_table_y_r )
|
||||||
|
{
|
||||||
|
return ((m_xtile_autoinc == true) << 7) | ((m_plane_select_access == true) << 6) | m_xtile_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// R#0W - Pattern Name Table Access pointer Y
|
||||||
|
WRITE8_MEMBER( ygv608_device::pattern_name_table_y_w )
|
||||||
|
{
|
||||||
|
m_ytile_ptr = data & 0x3f;
|
||||||
|
//if (yTile >= m_page_y)
|
||||||
|
// logerror ("%s:setting pny(%d) >= page_y(%d)\n", machine().describe_context(),
|
||||||
|
// yTile, m_page_y );
|
||||||
|
m_ytile_ptr &= m_page_y -1;
|
||||||
|
m_ytile_autoinc = BIT(data,7);
|
||||||
|
m_plane_select_access = BIT(data,6);
|
||||||
|
}
|
||||||
|
|
||||||
|
// R#1R - Pattern Name Table Access pointer X
|
||||||
|
READ8_MEMBER( ygv608_device::pattern_name_table_x_r )
|
||||||
|
{
|
||||||
|
return ((m_xtile_autoinc == true) << 7) | m_xtile_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// R#1W - Pattern Name Table Access pointer X
|
||||||
|
WRITE8_MEMBER( ygv608_device::pattern_name_table_x_w )
|
||||||
|
{
|
||||||
|
m_xtile_ptr = data & 0x3f;
|
||||||
|
//if (xTile >= m_page_x)
|
||||||
|
// logerror ("%s:setting pnx(%d) >= page_x(%d)\n", machine().describe_context(),
|
||||||
|
// xTile, m_page_x );
|
||||||
|
m_xtile_ptr &= m_page_x -1;
|
||||||
|
m_xtile_autoinc = BIT(data,7);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// R#3R - sprite attribute table access pointer
|
// R#3R - sprite attribute table access pointer
|
||||||
READ8_MEMBER( ygv608_device::sprite_address_r )
|
READ8_MEMBER( ygv608_device::sprite_address_r )
|
||||||
{
|
{
|
||||||
@ -2111,39 +2118,12 @@ void ygv608_device::SetPreShortcuts( int reg, int data )
|
|||||||
|
|
||||||
// Set any "short-cut" variables after we have updated the YGV608 registers
|
// Set any "short-cut" variables after we have updated the YGV608 registers
|
||||||
// - these are used only in optimisation of the emulation
|
// - these are used only in optimisation of the emulation
|
||||||
|
// TODO: actually this is legacy code that needs to go away
|
||||||
void ygv608_device::SetPostShortcuts(int reg )
|
void ygv608_device::SetPostShortcuts(int reg )
|
||||||
{
|
{
|
||||||
|
|
||||||
switch (reg)
|
switch (reg)
|
||||||
{
|
{
|
||||||
case 0:
|
|
||||||
{
|
|
||||||
uint8_t yTile = m_regs.s.r0 & r0_pny;
|
|
||||||
|
|
||||||
if (yTile >= m_page_y)
|
|
||||||
logerror ("%s:setting pny(%d) >= page_y(%d)\n", machine().describe_context(),
|
|
||||||
yTile, m_page_y );
|
|
||||||
yTile &= (m_page_y - 1);
|
|
||||||
m_regs.s.r0 &= ~r0_pny;
|
|
||||||
m_regs.s.r0 |= yTile;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
uint8_t xTile = m_regs.s.r1 & r1_pnx;
|
|
||||||
|
|
||||||
if (xTile >= m_page_x)
|
|
||||||
logerror ("%s:setting pnx(%d) >= page_x(%d)\n", machine().describe_context(),
|
|
||||||
xTile, m_page_x );
|
|
||||||
xTile &= (m_page_x - 1);
|
|
||||||
m_regs.s.r1 &= ~r1_pnx;
|
|
||||||
m_regs.s.r1 |= xTile;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
m_na8_mask = ((m_regs.s.r7 & r7_flip) ? 0x03 : 0x0f );
|
m_na8_mask = ((m_regs.s.r7 & r7_flip) ? 0x03 : 0x0f );
|
||||||
@ -2218,7 +2198,7 @@ void ygv608_device::ShowYGV608Registers()
|
|||||||
"\tR#00: $%02X : PNYA(%d),B/A(%c),PNY(%d)\n",
|
"\tR#00: $%02X : PNYA(%d),B/A(%c),PNY(%d)\n",
|
||||||
m_regs.b[0],
|
m_regs.b[0],
|
||||||
m_regs.s.r0 & r0_pnya,
|
m_regs.s.r0 & r0_pnya,
|
||||||
((m_regs.s.r0 & r0_b_a) ? 'B' : 'A' ),
|
((m_plane_select_access == true) ? 'B' : 'A' ),
|
||||||
m_regs.s.r0 & r0_pny);
|
m_regs.s.r0 & r0_pny);
|
||||||
|
|
||||||
logerror(
|
logerror(
|
||||||
|
@ -42,6 +42,10 @@ public:
|
|||||||
DECLARE_WRITE8_MEMBER(system_control_w);
|
DECLARE_WRITE8_MEMBER(system_control_w);
|
||||||
|
|
||||||
// register section
|
// register section
|
||||||
|
DECLARE_READ8_MEMBER(pattern_name_table_x_r);
|
||||||
|
DECLARE_WRITE8_MEMBER(pattern_name_table_x_w);
|
||||||
|
DECLARE_READ8_MEMBER(pattern_name_table_y_r);
|
||||||
|
DECLARE_WRITE8_MEMBER(pattern_name_table_y_w);
|
||||||
DECLARE_READ8_MEMBER(sprite_address_r);
|
DECLARE_READ8_MEMBER(sprite_address_r);
|
||||||
DECLARE_WRITE8_MEMBER(sprite_address_w);
|
DECLARE_WRITE8_MEMBER(sprite_address_w);
|
||||||
DECLARE_READ8_MEMBER(scroll_address_r);
|
DECLARE_READ8_MEMBER(scroll_address_r);
|
||||||
@ -247,12 +251,12 @@ private:
|
|||||||
uint8_t m_screen_resize; // screen requires resize
|
uint8_t m_screen_resize; // screen requires resize
|
||||||
uint8_t m_tilemap_resize; // tilemap requires resize
|
uint8_t m_tilemap_resize; // tilemap requires resize
|
||||||
|
|
||||||
/* These were statically allocated in the r/w routines, looks hackish? */
|
/* These were statically allocated in the r/w routines */
|
||||||
int p0_state_r,m_color_state_r;
|
int p0_state_r,m_color_state_r;
|
||||||
int p0_state_w,m_color_state_w;
|
int p0_state_w,m_color_state_w;
|
||||||
int pattern_name_base_r,pattern_name_base_w; /* pattern name table base address */
|
int pattern_name_base_r,pattern_name_base_w; /* pattern name table base address */
|
||||||
|
|
||||||
// new variable handling starts here
|
// === new variable handling starts here ===
|
||||||
uint8_t m_register_address; /**< RN: Register address select */
|
uint8_t m_register_address; /**< RN: Register address select */
|
||||||
bool m_register_autoinc_r; /**< RRAI: Register address auto-increment on read */
|
bool m_register_autoinc_r; /**< RRAI: Register address auto-increment on read */
|
||||||
bool m_register_autoinc_w; /**< RWAI: Register address auto-increment on write */
|
bool m_register_autoinc_w; /**< RWAI: Register address auto-increment on write */
|
||||||
@ -268,7 +272,13 @@ private:
|
|||||||
uint8_t m_palette_address; /**< CC: color palette access pointer */
|
uint8_t m_palette_address; /**< CC: color palette access pointer */
|
||||||
uint8_t m_sprite_address; /**< SAA: sprite attribute table access pointer */
|
uint8_t m_sprite_address; /**< SAA: sprite attribute table access pointer */
|
||||||
uint8_t m_sprite_bank; /**< SBA: sprite generator base address (MA20 to MA13) */
|
uint8_t m_sprite_bank; /**< SBA: sprite generator base address (MA20 to MA13) */
|
||||||
|
uint8_t m_xtile_ptr; /**< PNX: X coordinate of pattern space */
|
||||||
|
uint8_t m_ytile_ptr; /**< PNY: Y coordinate of pattern space */
|
||||||
|
bool m_xtile_autoinc; /**< PNXA: Permits auto-increment in X coordinate */
|
||||||
|
bool m_ytile_autoinc; /**< PNXA: Permits auto-increment in Y coordinate */
|
||||||
|
bool m_plane_select_access; /**< B/(A): A/B plane access select */
|
||||||
|
|
||||||
|
|
||||||
// screen section
|
// screen section
|
||||||
devcb_write_line m_vblank_handler;
|
devcb_write_line m_vblank_handler;
|
||||||
devcb_write_line m_raster_handler;
|
devcb_write_line m_raster_handler;
|
||||||
@ -277,9 +287,10 @@ private:
|
|||||||
emu_timer *m_raster_timer;
|
emu_timer *m_raster_timer;
|
||||||
|
|
||||||
void screen_configure(); /**< Adjust screen parameters based off CRTC ones */
|
void screen_configure(); /**< Adjust screen parameters based off CRTC ones */
|
||||||
attotime raster_sync_offset(); /**< adjust based off raster & CRTC parameters */
|
attotime raster_sync_offset(); /**< Adjust timing based off raster & CRTC parameters */
|
||||||
void vblank_irq_check();
|
void vblank_irq_check(); /**< mask + pend check for vblank irq */
|
||||||
void raster_irq_check();
|
void raster_irq_check(); /**< mask + pend check for raster irq */
|
||||||
|
void pattern_name_autoinc_check(); /**< check autoinc for tile pointers */
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user