mirror of
https://github.com/holub/mame
synced 2025-04-25 17:56:43 +03:00
ygv608.cpp: fixed page select boundaries for tilemap drawing, fixes Namco Classics Vol. 2 garbage gfxs in attract mode [Angelo Salese]
This commit is contained in:
parent
5139bea6f2
commit
36500e4e36
@ -551,6 +551,13 @@ void ygv608_device::set_gfxbank(uint8_t gfxbank)
|
|||||||
m_tilemap_resize = 1;
|
m_tilemap_resize = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline int ygv608_device::get_col_division(int raw_col)
|
||||||
|
{
|
||||||
|
if((m_v_div_size & 4) == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return ((raw_col >> m_col_shift) * 2) & 0x7f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
TILEMAP_MAPPER_MEMBER( ygv608_device::get_tile_offset )
|
TILEMAP_MAPPER_MEMBER( ygv608_device::get_tile_offset )
|
||||||
@ -570,7 +577,8 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_A_8 )
|
|||||||
// extract row,col packed into tile_index
|
// extract row,col packed into tile_index
|
||||||
int col = tile_index >> 6;
|
int col = tile_index >> 6;
|
||||||
int row = tile_index & 0x3f;
|
int row = tile_index & 0x3f;
|
||||||
|
int translated_column = get_col_division(col);
|
||||||
|
|
||||||
uint8_t attr = 0;
|
uint8_t attr = 0;
|
||||||
int pattern_name_base = 0;
|
int pattern_name_base = 0;
|
||||||
int set = (m_md == MD_1PLANE_256COLOUR
|
int set = (m_md == MD_1PLANE_256COLOUR
|
||||||
@ -608,8 +616,8 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_A_8 )
|
|||||||
|
|
||||||
/* calculate page according to scroll data */
|
/* calculate page according to scroll data */
|
||||||
/* - assuming full-screen scroll only for now... */
|
/* - assuming full-screen scroll only for now... */
|
||||||
sy = (int)m_scroll_data_table[0][0x00] +
|
sy = (int)m_scroll_data_table[0][translated_column] +
|
||||||
(((int)m_scroll_data_table[0][0x01] & 0x0f ) << 8);
|
(((int)m_scroll_data_table[0][translated_column+1] & 0x0f ) << 8);
|
||||||
sx = (int)m_scroll_data_table[0][0x80] +
|
sx = (int)m_scroll_data_table[0][0x80] +
|
||||||
(((int)m_scroll_data_table[0][0x81] & 0x0f ) << 8);
|
(((int)m_scroll_data_table[0][0x81] & 0x0f ) << 8);
|
||||||
|
|
||||||
@ -629,6 +637,8 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_A_8 )
|
|||||||
page += ( ( ( sy + row * 8 ) % 2048 ) / 512 ) * 8;
|
page += ( ( ( sy + row * 8 ) % 2048 ) / 512 ) * 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
page &= 0x1f;
|
||||||
|
|
||||||
/* add page, base address to pattern name */
|
/* add page, base address to pattern name */
|
||||||
j += ( (int)m_scroll_data_table[0][0xc0+page] << 10 );
|
j += ( (int)m_scroll_data_table[0][0xc0+page] << 10 );
|
||||||
j += ( m_base_addr[0][base] << 8 );
|
j += ( m_base_addr[0][base] << 8 );
|
||||||
@ -663,6 +673,7 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_B_8 )
|
|||||||
// extract row,col packed into tile_index
|
// extract row,col packed into tile_index
|
||||||
int col = tile_index >> 6;
|
int col = tile_index >> 6;
|
||||||
int row = tile_index & 0x3f;
|
int row = tile_index & 0x3f;
|
||||||
|
int translated_column = get_col_division(col);
|
||||||
|
|
||||||
uint8_t attr = 0;
|
uint8_t attr = 0;
|
||||||
int pattern_name_base = ( ( m_page_y << m_pny_shift )
|
int pattern_name_base = ( ( m_page_y << m_pny_shift )
|
||||||
@ -703,8 +714,8 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_B_8 )
|
|||||||
|
|
||||||
/* calculate page according to scroll data */
|
/* calculate page according to scroll data */
|
||||||
/* - assuming full-screen scroll only for now... */
|
/* - assuming full-screen scroll only for now... */
|
||||||
sy = (int)m_scroll_data_table[1][0x00] +
|
sy = (int)m_scroll_data_table[1][translated_column] +
|
||||||
(((int)m_scroll_data_table[1][0x01] & 0x0f ) << 8);
|
(((int)m_scroll_data_table[1][translated_column+1] & 0x0f ) << 8);
|
||||||
sx = (int)m_scroll_data_table[1][0x80] +
|
sx = (int)m_scroll_data_table[1][0x80] +
|
||||||
(((int)m_scroll_data_table[1][0x81] & 0x0f ) << 8);
|
(((int)m_scroll_data_table[1][0x81] & 0x0f ) << 8);
|
||||||
|
|
||||||
@ -724,6 +735,8 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_B_8 )
|
|||||||
page += ( ( ( sy + row * 8 ) % 2048 ) / 512 ) * 8;
|
page += ( ( ( sy + row * 8 ) % 2048 ) / 512 ) * 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
page &= 0x1f;
|
||||||
|
|
||||||
/* add page, base address to pattern name */
|
/* add page, base address to pattern name */
|
||||||
j += ( (int)m_scroll_data_table[1][0xc0+page] << 10 );
|
j += ( (int)m_scroll_data_table[1][0xc0+page] << 10 );
|
||||||
j += ( m_base_addr[1][base] << 8 );
|
j += ( m_base_addr[1][base] << 8 );
|
||||||
@ -760,6 +773,7 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_A_16 )
|
|||||||
// extract row,col packed into tile_index
|
// extract row,col packed into tile_index
|
||||||
int col = tile_index >> 6;
|
int col = tile_index >> 6;
|
||||||
int row = tile_index & 0x3f;
|
int row = tile_index & 0x3f;
|
||||||
|
int translated_column = get_col_division(col);
|
||||||
|
|
||||||
uint8_t attr = 0;
|
uint8_t attr = 0;
|
||||||
int pattern_name_base = 0;
|
int pattern_name_base = 0;
|
||||||
@ -796,8 +810,8 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_A_16 )
|
|||||||
|
|
||||||
/* calculate page according to scroll data */
|
/* calculate page according to scroll data */
|
||||||
/* - assuming full-screen scroll only for now... */
|
/* - assuming full-screen scroll only for now... */
|
||||||
sy = (int)m_scroll_data_table[0][0x00] +
|
sy = (int)m_scroll_data_table[0][translated_column] +
|
||||||
(((int)m_scroll_data_table[0][0x01] & 0x0f ) << 8);
|
(((int)m_scroll_data_table[0][translated_column+1] & 0x0f ) << 8);
|
||||||
sx = (int)m_scroll_data_table[0][0x80] +
|
sx = (int)m_scroll_data_table[0][0x80] +
|
||||||
(((int)m_scroll_data_table[0][0x81] & 0x0f ) << 8);
|
(((int)m_scroll_data_table[0][0x81] & 0x0f ) << 8);
|
||||||
if(m_md == MD_2PLANE_16BIT ) {
|
if(m_md == MD_2PLANE_16BIT ) {
|
||||||
@ -813,6 +827,8 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_A_16 )
|
|||||||
page += ( ( sy + row * 16 ) / 512 ) * 4;
|
page += ( ( sy + row * 16 ) / 512 ) * 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
page &= 0x1f;
|
||||||
|
|
||||||
/* add page, base address to pattern name */
|
/* add page, base address to pattern name */
|
||||||
j += ( (int)m_scroll_data_table[0][0xc0+page] << 8 );
|
j += ( (int)m_scroll_data_table[0][0xc0+page] << 8 );
|
||||||
j += ( m_base_addr[0][base] << 8 );
|
j += ( m_base_addr[0][base] << 8 );
|
||||||
@ -849,6 +865,7 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_B_16 )
|
|||||||
// extract row,col packed into tile_index
|
// extract row,col packed into tile_index
|
||||||
int col = tile_index >> 6;
|
int col = tile_index >> 6;
|
||||||
int row = tile_index & 0x3f;
|
int row = tile_index & 0x3f;
|
||||||
|
int translated_column = get_col_division(col);
|
||||||
|
|
||||||
uint8_t attr = 0;
|
uint8_t attr = 0;
|
||||||
int pattern_name_base = ( ( m_page_y << m_pny_shift )
|
int pattern_name_base = ( ( m_page_y << m_pny_shift )
|
||||||
@ -886,8 +903,8 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_B_16 )
|
|||||||
|
|
||||||
/* calculate page according to scroll data */
|
/* calculate page according to scroll data */
|
||||||
/* - assuming full-screen scroll only for now... */
|
/* - assuming full-screen scroll only for now... */
|
||||||
sy = (int)m_scroll_data_table[1][0x00] +
|
sy = (int)m_scroll_data_table[1][translated_column] +
|
||||||
(((int)m_scroll_data_table[1][0x01] & 0x0f ) << 8);
|
(((int)m_scroll_data_table[1][translated_column+1] & 0x0f ) << 8);
|
||||||
sx = (int)m_scroll_data_table[1][0x80] +
|
sx = (int)m_scroll_data_table[1][0x80] +
|
||||||
(((int)m_scroll_data_table[1][0x81] & 0x0f ) << 8);
|
(((int)m_scroll_data_table[1][0x81] & 0x0f ) << 8);
|
||||||
if(m_md == MD_2PLANE_16BIT ) {
|
if(m_md == MD_2PLANE_16BIT ) {
|
||||||
@ -903,6 +920,8 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_B_16 )
|
|||||||
page += ( ( sy + row * 16 ) / 512 ) * 4;
|
page += ( ( sy + row * 16 ) / 512 ) * 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
page &= 0x1f;
|
||||||
|
|
||||||
/* add page, base address to pattern name */
|
/* add page, base address to pattern name */
|
||||||
j += ( (int)m_scroll_data_table[1][0xc0+page] << 8 );
|
j += ( (int)m_scroll_data_table[1][0xc0+page] << 8 );
|
||||||
j += ( m_base_addr[1][base] << 8 );
|
j += ( m_base_addr[1][base] << 8 );
|
||||||
@ -1244,13 +1263,15 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma
|
|||||||
|
|
||||||
for( col=0; col<m_page_x; col++ )
|
for( col=0; col<m_page_x; col++ )
|
||||||
{
|
{
|
||||||
m_tilemap_B->set_scrolly(col,
|
int translated_column = get_col_division(col);
|
||||||
( (int)m_scroll_data_table[1][(col>>m_col_shift)<<1] +
|
|
||||||
( (int)m_scroll_data_table[1][((col>>m_col_shift)<<1)+1] << 8 ) ) );
|
m_tilemap_B->set_scrolly(col,
|
||||||
|
( (int)m_scroll_data_table[1][translated_column] +
|
||||||
|
( (int)m_scroll_data_table[1][translated_column+1] << 8 ) ) );
|
||||||
|
|
||||||
m_tilemap_A->set_scrolly(col,
|
m_tilemap_A->set_scrolly(col,
|
||||||
( (int)m_scroll_data_table[0][(col>>m_col_shift)<<1] +
|
( (int)m_scroll_data_table[0][translated_column] +
|
||||||
( (int)m_scroll_data_table[0][((col>>m_col_shift)<<1)+1] << 8 ) ) );
|
( (int)m_scroll_data_table[0][translated_column+1] << 8 ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -333,6 +333,7 @@ private:
|
|||||||
void raster_irq_check(); /**< mask + pend check for raster irq */
|
void raster_irq_check(); /**< mask + pend check for raster irq */
|
||||||
void pattern_name_autoinc_check(); /**< check autoinc for tile pointers */
|
void pattern_name_autoinc_check(); /**< check autoinc for tile pointers */
|
||||||
void pattern_mode_setup(); /**< refresh pattern mode at register 7/8 change*/
|
void pattern_mode_setup(); /**< refresh pattern mode at register 7/8 change*/
|
||||||
|
int get_col_division(int raw_col); /**< calculate column scroll */
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user