From 36500e4e360f8509e32775aacddd65adbcd10980 Mon Sep 17 00:00:00 2001 From: angelosa Date: Tue, 26 Sep 2017 05:13:29 +0200 Subject: ygv608.cpp: fixed page select boundaries for tilemap drawing, fixes Namco Classics Vol. 2 garbage gfxs in attract mode [Angelo Salese] --- src/mame/video/ygv608.cpp | 51 +++++++++++++++++++++++++++++++++-------------- src/mame/video/ygv608.h | 1 + 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/mame/video/ygv608.cpp b/src/mame/video/ygv608.cpp index 690eb567373..8bf27003549 100644 --- a/src/mame/video/ygv608.cpp +++ b/src/mame/video/ygv608.cpp @@ -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; colset_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 diff --git a/src/mame/video/ygv608.h b/src/mame/video/ygv608.h index c5e3b70d2f4..c5d4d2ff70f 100644 --- a/src/mame/video/ygv608.h +++ b/src/mame/video/ygv608.h @@ -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 { -- cgit v1.2.3