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:
angelosa 2017-09-26 05:13:29 +02:00
parent 5139bea6f2
commit 36500e4e36
2 changed files with 37 additions and 15 deletions

View File

@ -551,6 +551,13 @@ void ygv608_device::set_gfxbank(uint8_t gfxbank)
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 )
@ -570,7 +577,8 @@ TILE_GET_INFO_MEMBER( ygv608_device::get_tile_info_A_8 )
// extract row,col packed into tile_index
int col = tile_index >> 6;
int row = tile_index & 0x3f;
int translated_column = get_col_division(col);
uint8_t attr = 0;
int pattern_name_base = 0;
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 */
/* - assuming full-screen scroll only for now... */
sy = (int)m_scroll_data_table[0][0x00] +
(((int)m_scroll_data_table[0][0x01] & 0x0f ) << 8);
sy = (int)m_scroll_data_table[0][translated_column] +
(((int)m_scroll_data_table[0][translated_column+1] & 0x0f ) << 8);
sx = (int)m_scroll_data_table[0][0x80] +
(((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 &= 0x1f;
/* add page, base address to pattern name */
j += ( (int)m_scroll_data_table[0][0xc0+page] << 10 );
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
int col = tile_index >> 6;
int row = tile_index & 0x3f;
int translated_column = get_col_division(col);
uint8_t attr = 0;
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 */
/* - assuming full-screen scroll only for now... */
sy = (int)m_scroll_data_table[1][0x00] +
(((int)m_scroll_data_table[1][0x01] & 0x0f ) << 8);
sy = (int)m_scroll_data_table[1][translated_column] +
(((int)m_scroll_data_table[1][translated_column+1] & 0x0f ) << 8);
sx = (int)m_scroll_data_table[1][0x80] +
(((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 &= 0x1f;
/* add page, base address to pattern name */
j += ( (int)m_scroll_data_table[1][0xc0+page] << 10 );
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
int col = tile_index >> 6;
int row = tile_index & 0x3f;
int translated_column = get_col_division(col);
uint8_t attr = 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 */
/* - assuming full-screen scroll only for now... */
sy = (int)m_scroll_data_table[0][0x00] +
(((int)m_scroll_data_table[0][0x01] & 0x0f ) << 8);
sy = (int)m_scroll_data_table[0][translated_column] +
(((int)m_scroll_data_table[0][translated_column+1] & 0x0f ) << 8);
sx = (int)m_scroll_data_table[0][0x80] +
(((int)m_scroll_data_table[0][0x81] & 0x0f ) << 8);
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 &= 0x1f;
/* add page, base address to pattern name */
j += ( (int)m_scroll_data_table[0][0xc0+page] << 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
int col = tile_index >> 6;
int row = tile_index & 0x3f;
int translated_column = get_col_division(col);
uint8_t attr = 0;
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 */
/* - assuming full-screen scroll only for now... */
sy = (int)m_scroll_data_table[1][0x00] +
(((int)m_scroll_data_table[1][0x01] & 0x0f ) << 8);
sy = (int)m_scroll_data_table[1][translated_column] +
(((int)m_scroll_data_table[1][translated_column+1] & 0x0f ) << 8);
sx = (int)m_scroll_data_table[1][0x80] +
(((int)m_scroll_data_table[1][0x81] & 0x0f ) << 8);
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 &= 0x1f;
/* add page, base address to pattern name */
j += ( (int)m_scroll_data_table[1][0xc0+page] << 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++ )
{
m_tilemap_B->set_scrolly(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 ) ) );
int translated_column = get_col_division(col);
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,
( (int)m_scroll_data_table[0][(col>>m_col_shift)<<1] +
( (int)m_scroll_data_table[0][((col>>m_col_shift)<<1)+1] << 8 ) ) );
m_tilemap_A->set_scrolly(col,
( (int)m_scroll_data_table[0][translated_column] +
( (int)m_scroll_data_table[0][translated_column+1] << 8 ) ) );
}
#endif

View File

@ -333,6 +333,7 @@ private:
void raster_irq_check(); /**< mask + pend check for raster irq */
void pattern_name_autoinc_check(); /**< check autoinc for tile pointers */
void pattern_mode_setup(); /**< refresh pattern mode at register 7/8 change*/
int get_col_division(int raw_col); /**< calculate column scroll */
enum
{