diff options
-rw-r--r-- | src/mame/video/ygv608.cpp | 210 | ||||
-rw-r--r-- | src/mame/video/ygv608.h | 1 |
2 files changed, 137 insertions, 74 deletions
diff --git a/src/mame/video/ygv608.cpp b/src/mame/video/ygv608.cpp index 1dda727ad85..6a29eb1aea9 100644 --- a/src/mame/video/ygv608.cpp +++ b/src/mame/video/ygv608.cpp @@ -448,6 +448,13 @@ inline int ygv608_device::get_col_division(int raw_col) return ((raw_col >> m_col_shift) * 2) & 0x7f; } +inline int ygv608_device::get_row_division(int raw_row) +{ + if(m_h_div_size == 0) + return 0; + + return (raw_row & (m_page_y/2 - 1)) * 2; +} TILEMAP_MAPPER_MEMBER( ygv608_device::get_tile_offset ) { @@ -505,25 +512,30 @@ 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][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) - { - page = ( ( sx + col * 8 ) % 1024 ) / 256; - page += ( ( ( sy + row * 8 ) % 2048 ) / 256 ) * 4; + if (m_v_div_size) { + page = 0; } - else if (m_page_size) - { - page = ( ( sx + col * 8 ) % 2048 ) / 512; - page += ( ( ( sy + row * 8 ) % 2048 ) / 256 ) * 4; - } - else - { - page = ( ( sx + col * 8 ) % 2048 ) / 256; - page += ( ( ( sy + row * 8 ) % 2048 ) / 512 ) * 8; + else { + 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) + { + page = ( ( sx + col * 8 ) % 1024 ) / 256; + page += ( ( ( sy + row * 8 ) % 2048 ) / 256 ) * 4; + } + else if (m_page_size) + { + page = ( ( sx + col * 8 ) % 2048 ) / 512; + page += ( ( ( sy + row * 8 ) % 2048 ) / 256 ) * 4; + } + else + { + page = ( ( sx + col * 8 ) % 2048 ) / 256; + page += ( ( ( sy + row * 8 ) % 2048 ) / 512 ) * 8; + } } page &= 0x1f; @@ -603,25 +615,30 @@ 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][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 ) - { - page = ( ( sx + col * 8 ) % 1024 ) / 256; - page += ( ( ( sy + row * 8 ) % 2048 ) / 256 ) * 4; + if (m_v_div_size) { + page = 0; } - else if (m_page_size) - { - page = ( ( sx + col * 8 ) % 2048 ) / 512; - page += ( ( ( sy + row * 8 ) % 2048 ) / 256 ) * 4; - } - else - { - page = ( ( sx + col * 8 ) % 2048 ) / 256; - page += ( ( ( sy + row * 8 ) % 2048 ) / 512 ) * 8; + else { + 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) + { + page = ( ( sx + col * 8 ) % 1024 ) / 256; + page += ( ( ( sy + row * 8 ) % 2048 ) / 256 ) * 4; + } + else if (m_page_size) + { + page = ( ( sx + col * 8 ) % 2048 ) / 512; + page += ( ( ( sy + row * 8 ) % 2048 ) / 256 ) * 4; + } + else + { + page = ( ( sx + col * 8 ) % 2048 ) / 256; + page += ( ( ( sy + row * 8 ) % 2048 ) / 512 ) * 8; + } } page &= 0x1f; @@ -699,21 +716,27 @@ 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][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 ) { - page = ( ( sx + col * 16 ) % 2048 ) / 512; - page += ( ( sy + row * 16 ) / 512 ) * 4; - } - else if (m_page_size) { - page = ( sx + col * 16 ) / 512; - page += ( ( sy + row * 16 ) / 1024 ) * 8; + if (m_v_div_size) { + page = 0; } else { - page = ( sx + col * 16 ) / 1024; - page += ( ( sy + row * 16 ) / 512 ) * 4; + 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) { + page = ( ( sx + col * 16 ) % 2048 ) / 512; + page += ( ( sy + row * 16 ) / 512 ) * 4; + } + else if (m_page_size) { + page = ( sx + col * 16 ) / 512; + page += ( ( sy + row * 16 ) / 1024 ) * 8; + } + else { + page = ( sx + col * 16 ) / 1024; + page += ( ( sy + row * 16 ) / 512 ) * 4; + } } page &= 0x1f; @@ -792,21 +815,27 @@ 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][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 ) { - page = ( ( sx + col * 16 ) % 2048 ) / 512; - page += ( ( sy + row * 16 ) / 512 ) * 4; - } - else if (m_page_size) { - page = ( sx + col * 16 ) / 512; - page += ( ( sy + row * 16 ) / 1024 ) * 8; + if (m_v_div_size) { + page = 0; } else { - page = ( sx + col * 16 ) / 1024; - page += ( ( sy + row * 16 ) / 512 ) * 4; + 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) { + page = ( ( sx + col * 16 ) % 2048 ) / 512; + page += ( ( sy + row * 16 ) / 512 ) * 4; + } + else if (m_page_size) { + page = ( sx + col * 16 ) / 512; + page += ( ( sy + row * 16 ) / 1024 ) * 8; + } + else { + page = ( sx + col * 16 ) / 1024; + page += ( ( sy + row * 16 ) / 512 ) * 4; + } } page &= 0x1f; @@ -970,6 +999,14 @@ inline void ygv608_device::draw_layer_roz(screen_device &screen, bitmap_ind16 &b //int xc, yc; //double r, alpha, sin_theta, cos_theta; //const rectangle &visarea = screen.visible_area(); + uint32_t sx, sy; + + int ba_select = (source_tilemap == m_tilemap_A) ? 0 : 1; + + sy = (int)m_scroll_data_table[ba_select][0x00] + + (((int)m_scroll_data_table[ba_select][0x01] & 0x0f ) << 8); + sx = (int)m_scroll_data_table[ba_select][0x80] + + (((int)m_scroll_data_table[ba_select][0x81] & 0x0f ) << 8); if( m_zron == true ) { @@ -981,9 +1018,13 @@ inline void ygv608_device::draw_layer_roz(screen_device &screen, bitmap_ind16 &b //sin_theta = (double)m_dyx / (double)0x10000; //cos_theta = (double)m_dx / (double)0x10000; + if (m_v_div_size) { + sx = (sx & 0x1FF) ? (sx - 0x200) : 0; + sy = (sy & 0x1FF) ? (sy - 0x200) : 0; + } source_tilemap->draw_roz(screen, bitmap, cliprect, - m_ax, m_ay, - m_dx, m_dxy, m_dyx, m_dy, m_roz_wrap_disable == false, 0, 0 ); + m_ax + (sx << 16), m_ay + (sy << 16), + m_dx, m_dyx, m_dxy, m_dy, m_roz_wrap_disable == false, 0, 0 ); } else source_tilemap->draw(screen, bitmap, cliprect, 0, 0 ); @@ -998,6 +1039,9 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma #ifdef _ENABLE_SCROLLY int col; #endif +#ifdef _ENABLE_SCROLLX + int row; +#endif rectangle finalclip; const rectangle &visarea = screen.visible_area(); @@ -1040,8 +1084,15 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma m_tilemap_A->mark_all_dirty(); m_tilemap_A->set_transparent_pen(0); - // for NCV1 it's sufficient to scroll only columns - m_tilemap_A->set_scroll_cols(m_page_x); + + if (m_h_div_size == 0) { + m_tilemap_A->set_scroll_cols(m_page_x); + m_tilemap_A->set_scroll_rows(1); + } + else { + m_tilemap_A->set_scroll_cols(1); + m_tilemap_A->set_scroll_rows(m_page_y); + } if (m_pattern_size == PTS_8X8 ) m_tilemap_B = m_tilemap_B_cache_8[index]; @@ -1049,8 +1100,14 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma m_tilemap_B = m_tilemap_B_cache_16[index]; m_tilemap_B->mark_all_dirty(); - // for NCV1 it's sufficient to scroll only columns - m_tilemap_B->set_scroll_cols(m_page_x); + if (m_h_div_size == 0) { + m_tilemap_B->set_scroll_cols(m_page_x); + m_tilemap_B->set_scroll_rows(1); + } + else { + m_tilemap_B->set_scroll_cols(1); + m_tilemap_B->set_scroll_rows(m_page_y); + } // now clear the screen in case we change to 1-plane mode m_work_bitmap.fill(0, finalclip ); @@ -1078,13 +1135,18 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma #ifdef _ENABLE_SCROLLX - m_tilemap_B->set_scrollx(0, - ( (int)m_scroll_data_table[1][0x80] + - ( (int)m_scroll_data_table[1][0x81] << 8 ) ) ); + for( row=0; row<m_page_y; row++ ) + { + int translated_row = get_row_division(row); + + m_tilemap_B->set_scrollx(row, + ( (int)m_scroll_data_table[1][translated_row+0x80] + + ( (int)m_scroll_data_table[1][translated_row+0x81] << 8 ) ) ); - m_tilemap_A->set_scrollx(0, - ( (int)m_scroll_data_table[0][0x80] + - ( (int)m_scroll_data_table[0][0x81] << 8 ) ) ); + m_tilemap_A->set_scrollx(row, + ( (int)m_scroll_data_table[0][translated_row+0x80] + + ( (int)m_scroll_data_table[0][translated_row+0x81] << 8 ) ) ); + } #endif diff --git a/src/mame/video/ygv608.h b/src/mame/video/ygv608.h index 575e5463028..8a1fee7278c 100644 --- a/src/mame/video/ygv608.h +++ b/src/mame/video/ygv608.h @@ -259,6 +259,7 @@ private: 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 */ + int get_row_division(int raw_row); /**< calculate row scroll */ enum { |