diff options
Diffstat (limited to 'src/mame/video/seta.cpp')
-rw-r--r-- | src/mame/video/seta.cpp | 277 |
1 files changed, 109 insertions, 168 deletions
diff --git a/src/mame/video/seta.cpp b/src/mame/video/seta.cpp index c0f1556cc1b..71bdfd58e2a 100644 --- a/src/mame/video/seta.cpp +++ b/src/mame/video/seta.cpp @@ -371,9 +371,10 @@ Offset + 0x4: ***************************************************************************/ -inline void seta_state::twineagl_tile_info( tile_data &tileinfo, int tile_index, int offset ) +template<int Offset> +TILE_GET_INFO_MEMBER(seta_state::twineagl_get_tile_info) { - uint16_t *vram = m_vram_0 + offset; + uint16_t *vram = m_vram[0] + Offset; uint16_t code = vram[ tile_index ]; uint16_t attr = vram[ tile_index + 0x800 ]; if ((code & 0x3e00) == 0x3e00) @@ -381,15 +382,12 @@ inline void seta_state::twineagl_tile_info( tile_data &tileinfo, int tile_index, SET_TILE_INFO_MEMBER(1, (code & 0x3fff), attr & 0x1f, TILE_FLIPXY((code & 0xc000) >> 14) ); } -TILE_GET_INFO_MEMBER(seta_state::twineagl_get_tile_info_0){ twineagl_tile_info(tileinfo, tile_index, 0x0000 ); } -TILE_GET_INFO_MEMBER(seta_state::twineagl_get_tile_info_1){ twineagl_tile_info(tileinfo, tile_index, 0x1000 ); } - - -inline void seta_state::get_tile_info( tile_data &tileinfo, int tile_index, int layer, int offset ) +template<int Layer, int Offset> +TILE_GET_INFO_MEMBER(seta_state::get_tile_info) { - int gfx = 1 + layer; - uint16_t *vram = (layer == 0) ? m_vram_0 + offset : m_vram_2 + offset; - uint16_t *vctrl = (layer == 0) ? m_vctrl_0 : m_vctrl_2; + int gfx = 1 + Layer; + uint16_t *vram = m_vram[Layer] + Offset; + uint16_t *vctrl = m_vctrl[Layer]; uint16_t code = vram[ tile_index ]; uint16_t attr = vram[ tile_index + 0x800 ]; @@ -399,35 +397,12 @@ inline void seta_state::get_tile_info( tile_data &tileinfo, int tile_index, int } else { - popmessage("Missing Color Mode = 1 for Layer = %d. Contact MAMETesters.",layer); + popmessage("Missing Color Mode = 1 for Layer = %d. Contact MAMETesters.",Layer); } SET_TILE_INFO_MEMBER(gfx, m_tiles_offset + (code & 0x3fff), attr & 0x1f, TILE_FLIPXY((code & 0xc000) >> 14) ); } -TILE_GET_INFO_MEMBER(seta_state::get_tile_info_0){ get_tile_info(tileinfo, tile_index, 0, 0x0000 ); } -TILE_GET_INFO_MEMBER(seta_state::get_tile_info_1){ get_tile_info(tileinfo, tile_index, 0, 0x1000 ); } -TILE_GET_INFO_MEMBER(seta_state::get_tile_info_2){ get_tile_info(tileinfo, tile_index, 1, 0x0000 ); } -TILE_GET_INFO_MEMBER(seta_state::get_tile_info_3){ get_tile_info(tileinfo, tile_index, 1, 0x1000 ); } - - -WRITE16_MEMBER(seta_state::seta_vram_0_w) -{ - COMBINE_DATA(&m_vram_0[offset]); - if (offset & 0x1000) - m_tilemap_1->mark_tile_dirty(offset & 0x7ff); - else - m_tilemap_0->mark_tile_dirty(offset & 0x7ff); -} - -WRITE16_MEMBER(seta_state::seta_vram_2_w) -{ - COMBINE_DATA(&m_vram_2[offset]); - if (offset & 0x1000) - m_tilemap_3->mark_tile_dirty(offset & 0x7ff); - else - m_tilemap_2->mark_tile_dirty(offset & 0x7ff); -} WRITE16_MEMBER(seta_state::twineagl_tilebank_w) { @@ -453,31 +428,30 @@ VIDEO_START_MEMBER(seta_state,seta_2_layers) at any given time */ /* layer 0 */ - m_tilemap_0 = &machine().tilemap().create( - *m_gfxdecode, tilemap_get_info_delegate(FUNC(seta_state::get_tile_info_0),this), TILEMAP_SCAN_ROWS, + m_tilemap[0][0] = &machine().tilemap().create( + *m_gfxdecode, tilemap_get_info_delegate(&seta_state::get_tile_info<0, 0x0000>, "layer1_bank0", this), TILEMAP_SCAN_ROWS, 16,16, 64,32 ); - m_tilemap_1 = &machine().tilemap().create( - *m_gfxdecode, tilemap_get_info_delegate(FUNC(seta_state::get_tile_info_1),this), TILEMAP_SCAN_ROWS, + m_tilemap[0][1] = &machine().tilemap().create( + *m_gfxdecode, tilemap_get_info_delegate(&seta_state::get_tile_info<0, 0x1000>, "layer1_bank1", this), TILEMAP_SCAN_ROWS, 16,16, 64,32 ); /* layer 1 */ - m_tilemap_2 = &machine().tilemap().create( - *m_gfxdecode, tilemap_get_info_delegate(FUNC(seta_state::get_tile_info_2),this), TILEMAP_SCAN_ROWS, + m_tilemap[1][0] = &machine().tilemap().create( + *m_gfxdecode, tilemap_get_info_delegate(&seta_state::get_tile_info<1, 0x0000>, "layer2_bank0", this), TILEMAP_SCAN_ROWS, 16,16, 64,32 ); - m_tilemap_3 = &machine().tilemap().create( - *m_gfxdecode, tilemap_get_info_delegate(FUNC(seta_state::get_tile_info_3),this), TILEMAP_SCAN_ROWS, + m_tilemap[1][1] = &machine().tilemap().create( + *m_gfxdecode, tilemap_get_info_delegate(&seta_state::get_tile_info<1, 0x1000>, "layer2_bank1", this), TILEMAP_SCAN_ROWS, 16,16, 64,32 ); m_tilemaps_flip = 0; m_color_mode_shift = 3; - m_tilemap_0->set_transparent_pen(0); - m_tilemap_1->set_transparent_pen(0); - m_tilemap_2->set_transparent_pen(0); - m_tilemap_3->set_transparent_pen(0); + for (int layer = 0; layer < 2; layer++) + for (int bank = 0; bank < 2; bank++) + m_tilemap[layer][bank]->set_transparent_pen(0); } VIDEO_START_MEMBER(seta_state,oisipuzl_2_layers) @@ -499,18 +473,18 @@ VIDEO_START_MEMBER(seta_state,seta_1_layer) at any given time */ /* layer 0 */ - m_tilemap_0 = &machine().tilemap().create( - *m_gfxdecode, tilemap_get_info_delegate(FUNC(seta_state::get_tile_info_0),this), TILEMAP_SCAN_ROWS, + m_tilemap[0][0] = &machine().tilemap().create( + *m_gfxdecode, tilemap_get_info_delegate(&seta_state::get_tile_info<0, 0x0000>, "layer1_bank0", this), TILEMAP_SCAN_ROWS, 16,16, 64,32 ); - m_tilemap_1 = &machine().tilemap().create( - *m_gfxdecode, tilemap_get_info_delegate(FUNC(seta_state::get_tile_info_1),this), TILEMAP_SCAN_ROWS, + m_tilemap[0][1] = &machine().tilemap().create( + *m_gfxdecode, tilemap_get_info_delegate(&seta_state::get_tile_info<0, 0x1000>, "layer1_bank1", this), TILEMAP_SCAN_ROWS, 16,16, 64,32 ); m_color_mode_shift = 4; - - m_tilemap_0->set_transparent_pen(0); - m_tilemap_1->set_transparent_pen(0); + + for (int bank = 0; bank < 2; bank++) + m_tilemap[0][bank]->set_transparent_pen(0); } VIDEO_START_MEMBER(setaroul_state,setaroul_1_layer) @@ -538,16 +512,16 @@ VIDEO_START_MEMBER(seta_state,twineagl_1_layer) at any given time */ /* layer 0 */ - m_tilemap_0 = &machine().tilemap().create( - *m_gfxdecode, tilemap_get_info_delegate(FUNC(seta_state::twineagl_get_tile_info_0),this), TILEMAP_SCAN_ROWS, + m_tilemap[0][0] = &machine().tilemap().create( + *m_gfxdecode, tilemap_get_info_delegate(FUNC(seta_state::twineagl_get_tile_info<0x0000>),this), TILEMAP_SCAN_ROWS, 16,16, 64,32 ); - m_tilemap_1 = &machine().tilemap().create( - *m_gfxdecode, tilemap_get_info_delegate(FUNC(seta_state::twineagl_get_tile_info_1),this), TILEMAP_SCAN_ROWS, + m_tilemap[0][1] = &machine().tilemap().create( + *m_gfxdecode, tilemap_get_info_delegate(FUNC(seta_state::twineagl_get_tile_info<0x1000>),this), TILEMAP_SCAN_ROWS, 16,16, 64,32 ); - - m_tilemap_0->set_transparent_pen(0); - m_tilemap_1->set_transparent_pen(0); + + for (int bank = 0; bank < 2; bank++) + m_tilemap[0][bank]->set_transparent_pen(0); } SETA001_SPRITE_GFXBANK_CB_MEMBER(seta_state::setac_gfxbank_callback) @@ -561,10 +535,10 @@ SETA001_SPRITE_GFXBANK_CB_MEMBER(seta_state::setac_gfxbank_callback) /* NO layers, only sprites */ VIDEO_START_MEMBER(seta_state,seta_no_layers) { - m_tilemap_0 = nullptr; - m_tilemap_1 = nullptr; - m_tilemap_2 = nullptr; - m_tilemap_3 = nullptr; + m_tilemap[0][0] = nullptr; + m_tilemap[0][1] = nullptr; + m_tilemap[1][0] = nullptr; + m_tilemap[1][1] = nullptr; m_tilemaps_flip = 0; @@ -733,9 +707,9 @@ void seta_state::set_pens() { offs_t i; - for (i = 0; i < m_paletteram.bytes() / 2; i++) + for (i = 0; i < m_paletteram[0].bytes() / 2; i++) { - uint16_t data = m_paletteram[i]; + uint16_t data = m_paletteram[0][i]; rgb_t color = rgb_t(pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0)); @@ -745,18 +719,18 @@ void seta_state::set_pens() m_palette->set_pen_color(i, color); } - if(m_paletteram2 != nullptr) + if(m_paletteram[1] != nullptr) { - for (i = 0; i < m_paletteram2.bytes() / 2; i++) + for (i = 0; i < m_paletteram[1].bytes() / 2; i++) { - uint16_t data = m_paletteram2[i]; + uint16_t data = m_paletteram[1][i]; rgb_t color = rgb_t(pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0)); if (m_palette->indirect_entries() != 0) - m_palette->set_indirect_color(i + m_paletteram.bytes() / 2, color); + m_palette->set_indirect_color(i + m_paletteram[0].bytes() / 2, color); else - m_palette->set_pen_color(i + m_paletteram.bytes() / 2, color); + m_palette->set_pen_color(i + m_paletteram[0].bytes() / 2, color); } } } @@ -768,7 +742,7 @@ void seta_state::usclssic_set_pens() for (i = 0; i < 0x200; i++) { - uint16_t data = m_paletteram[i]; + uint16_t data = m_paletteram[0][i]; rgb_t color = rgb_t(pal5bit(data >> 10), pal5bit(data >> 5), pal5bit(data >> 0)); @@ -854,7 +828,8 @@ uint32_t seta_state::screen_update_seta_no_layers(screen_device &screen, bitmap_ void seta_state::seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int sprite_bank_size, int sprite_setac ) { int layers_ctrl = -1; - int enab_0, enab_1, x_0, x_1=0, y_0, y_1=0; + int bank[2], x[2], y[2]; + int layer; int order = 0; int flip = m_seta001->is_flipped(); @@ -864,20 +839,16 @@ void seta_state::seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap, // check tilemaps color modes - if(m_current_tilemap_mode[0] != (m_vctrl_0[ 4/2 ] & 0x10)) - { - m_current_tilemap_mode[0] = m_vctrl_0[ 4/2 ] & 0x10; - m_tilemap_0->mark_all_dirty(); - m_tilemap_1->mark_all_dirty(); - } - - if(m_tilemap_2 != nullptr && m_tilemap_3 != nullptr) + for (layer = 0; layer < 2; layer++) { - if(m_current_tilemap_mode[1] != (m_vctrl_2[ 4/2 ] & 0x10)) + if(m_tilemap[layer][0]) { - m_current_tilemap_mode[1] = m_vctrl_2[ 4/2 ] & 0x10; - m_tilemap_2->mark_all_dirty(); - m_tilemap_3->mark_all_dirty(); + if(m_current_tilemap_mode[layer] != (m_vctrl[layer][ 4/2 ] & 0x10)) + { + m_current_tilemap_mode[layer] = m_vctrl[layer][ 4/2 ] & 0x10; + for (int bank = 0; bank < 2; bank++) + m_tilemap[layer][bank]->mark_all_dirty(); + } } } @@ -885,59 +856,49 @@ void seta_state::seta_layers_update(screen_device &screen, bitmap_ind16 &bitmap, machine().tilemap().set_flip_all(flip ? (TILEMAP_FLIPX|TILEMAP_FLIPY) : 0 ); - x_0 = m_vctrl_0[ 0/2 ]; - y_0 = m_vctrl_0[ 2/2 ]; - enab_0 = m_vctrl_0[ 4/2 ]; - - /* Only one tilemap per layer is enabled! */ - m_tilemap_0->enable((!(enab_0 & 0x0008)) /*&& (enab_0 & 0x0001)*/ ); - m_tilemap_1->enable(( (enab_0 & 0x0008)) /*&& (enab_0 & 0x0001)*/ ); - - /* the hardware wants different scroll values when flipped */ - - /* bg x scroll flip - metafox 0000 025d = 0, $400-$1a3 = $400 - $190 - $13 - eightfrc ffe8 0272 - fff0 0260 = -$10, $400-$190 -$10 - ffe8 0272 = -$18, $400-$190 -$18 + $1a */ - - x_0 += 0x10 - m_global_offsets->tilemap_offs[flip ? 1 : 0]; - y_0 -= (256 - vis_dimy)/2; - if (flip) + for (layer = 0; layer < 2; layer++) { - x_0 = -x_0 - 512; - y_0 = y_0 - vis_dimy; - } - - m_tilemap_0->set_scrollx(0, x_0); - m_tilemap_1->set_scrollx(0, x_0); - m_tilemap_0->set_scrolly(0, y_0); - m_tilemap_1->set_scrolly(0, y_0); - - if (m_tilemap_2) - { - x_1 = m_vctrl_2[ 0/2 ]; - y_1 = m_vctrl_2[ 2/2 ]; - enab_1 = m_vctrl_2[ 4/2 ]; - - m_tilemap_2->enable((!(enab_1 & 0x0008)) /*&& (enab_1 & 0x0001)*/ ); - m_tilemap_3->enable(( (enab_1 & 0x0008)) /*&& (enab_1 & 0x0001)*/ ); + if (m_tilemap[layer][0]) + { + x[layer] = m_vctrl[layer][ 0/2 ]; + y[layer] = m_vctrl[layer][ 2/2 ]; + bank[layer] = m_vctrl[layer][ 4/2 ]; + bank[layer] = (bank[layer] & 0x0008) ? 1 : 0; /*&& (bank[layer] & 0x0001)*/ + + /* Select tilemap bank, Only one tilemap bank per layer is enabled */ + m_tilemap[layer][0]->enable((!bank[layer])); + m_tilemap[layer][1]->enable(( bank[layer])); + + /* the hardware wants different scroll values when flipped */ + + /* bg x scroll flip + metafox 0000 025d = 0, $400-$1a3 = $400 - $190 - $13 + eightfrc ffe8 0272 + fff0 0260 = -$10, $400-$190 -$10 + ffe8 0272 = -$18, $400-$190 -$18 + $1a */ + + x[layer] += 0x10 - m_global_offsets->tilemap_offs[flip ? 1 : 0]; + y[layer] -= (256 - vis_dimy)/2; + if (flip) + { + x[layer] = -x[layer] - 512; + y[layer] = y[layer] - vis_dimy; + } - x_1 += 0x10 - m_global_offsets->tilemap_offs[flip ? 1 : 0]; - y_1 -= (256 - vis_dimy)/2; - if (flip) + m_tilemap[layer][0]->set_scrollx(0, x[layer]); + m_tilemap[layer][1]->set_scrollx(0, x[layer]); + m_tilemap[layer][0]->set_scrolly(0, y[layer]); + m_tilemap[layer][1]->set_scrolly(0, y[layer]); + } + else { - x_1 = -x_1 - 512; - y_1 = y_1 - vis_dimy; + x[layer] = 0; + y[layer] = 0; } + } - m_tilemap_2->set_scrollx(0, x_1); - m_tilemap_3->set_scrollx(0, x_1); - m_tilemap_2->set_scrolly(0, y_1); - m_tilemap_3->set_scrolly(0, y_1); - + if (m_tilemap[1][0]) order = m_vregs[ 2/2 ]; - } #ifdef MAME_DEBUG @@ -948,10 +909,10 @@ if (screen.machine().input().code_pressed(KEYCODE_Z)) if (screen.machine().input().code_pressed(KEYCODE_A)) msk |= 8; if (msk != 0) layers_ctrl &= msk; - if (m_tilemap_2) + if (m_tilemap[1][0]) popmessage("VR:%04X-%04X-%04X L0:%04X L1:%04X", - m_vregs[0], m_vregs[1], m_vregs[2], m_vctrl_0[4/2], m_vctrl_2[4/2]); - else if (m_tilemap_0) popmessage("L0:%04X", m_vctrl_0[4/2]); + m_vregs[0], m_vregs[1], m_vregs[2], m_vctrl[0][4/2], m_vctrl[1][4/2]); + else if (m_tilemap[0][0]) popmessage("L0:%04X", m_vctrl[0][4/2]); } #endif @@ -959,10 +920,9 @@ if (screen.machine().input().code_pressed(KEYCODE_Z)) if (order & 1) // swap the layers? { - if (m_tilemap_2) + if (m_tilemap[1][bank[1]]) { - if (layers_ctrl & 2) m_tilemap_2->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); - if (layers_ctrl & 2) m_tilemap_3->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + if (layers_ctrl & 2) m_tilemap[1][bank[1]]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); } if (order & 2) // layer-sprite priority? @@ -974,8 +934,7 @@ if (screen.machine().input().code_pressed(KEYCODE_Z)) popmessage("Missing palette effect. Contact MAMETesters."); } - if (layers_ctrl & 1) m_tilemap_0->draw(screen, bitmap, cliprect, 0, 0); - if (layers_ctrl & 1) m_tilemap_1->draw(screen, bitmap, cliprect, 0, 0); + if (layers_ctrl & 1) m_tilemap[0][bank[0]]->draw(screen, bitmap, cliprect, 0, 0); } else { @@ -984,31 +943,22 @@ if (screen.machine().input().code_pressed(KEYCODE_Z)) popmessage("Missing palette effect. Contact MAMETesters."); } - if (layers_ctrl & 1) m_tilemap_0->draw(screen, bitmap, cliprect, 0, 0); - if (layers_ctrl & 1) m_tilemap_1->draw(screen, bitmap, cliprect, 0, 0); + if (layers_ctrl & 1) m_tilemap[0][bank[0]]->draw(screen, bitmap, cliprect, 0, 0); if (layers_ctrl & 8) m_seta001->draw_sprites(screen, bitmap,cliprect,sprite_bank_size, sprite_setac); } } else { - if (layers_ctrl & 1) m_tilemap_0->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); - if (layers_ctrl & 1) m_tilemap_1->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); + if (layers_ctrl & 1) m_tilemap[0][bank[0]]->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0); if (order & 2) // layer-sprite priority? { if (layers_ctrl & 8) m_seta001->draw_sprites(screen, bitmap,cliprect,sprite_bank_size, sprite_setac); - if((order & 4) && m_paletteram2 != nullptr) + if((order & 4) && m_paletteram[1] != nullptr) { - if(m_tilemap_2->enabled()) - { - draw_tilemap_palette_effect(bitmap, cliprect, m_tilemap_2, x_1, y_1, 2 + ((m_vctrl_2[ 4/2 ] & 0x10) >> m_color_mode_shift), flip); - } - else - { - draw_tilemap_palette_effect(bitmap, cliprect, m_tilemap_3, x_1, y_1, 2 + ((m_vctrl_2[ 4/2 ] & 0x10) >> m_color_mode_shift), flip); - } + draw_tilemap_palette_effect(bitmap, cliprect, m_tilemap[1][bank[1]], x[1], y[1], 2 + ((m_vctrl[1][ 4/2 ] & 0x10) >> m_color_mode_shift), flip); } else { @@ -1017,25 +967,17 @@ if (screen.machine().input().code_pressed(KEYCODE_Z)) popmessage("Missing palette effect. Contact MAMETesters."); } - if (m_tilemap_2) + if (m_tilemap[1][bank[1]]) { - if (layers_ctrl & 2) m_tilemap_2->draw(screen, bitmap, cliprect, 0, 0); - if (layers_ctrl & 2) m_tilemap_3->draw(screen, bitmap, cliprect, 0, 0); + if (layers_ctrl & 2) m_tilemap[1][bank[1]]->draw(screen, bitmap, cliprect, 0, 0); } } } else { - if((order & 4) && m_paletteram2 != nullptr) + if((order & 4) && m_paletteram[1] != nullptr) { - if(m_tilemap_2->enabled()) - { - draw_tilemap_palette_effect(bitmap, cliprect, m_tilemap_2, x_1, y_1, 2 + ((m_vctrl_2[ 4/2 ] & 0x10) >> m_color_mode_shift), flip); - } - else - { - draw_tilemap_palette_effect(bitmap, cliprect, m_tilemap_3, x_1, y_1, 2 + ((m_vctrl_2[ 4/2 ] & 0x10) >> m_color_mode_shift), flip); - } + draw_tilemap_palette_effect(bitmap, cliprect, m_tilemap[1][bank[1]], x[1], y[1], 2 + ((m_vctrl[1][ 4/2 ] & 0x10) >> m_color_mode_shift), flip); } else { @@ -1044,10 +986,9 @@ if (screen.machine().input().code_pressed(KEYCODE_Z)) popmessage("Missing palette effect. Contact MAMETesters."); } - if (m_tilemap_2) + if (m_tilemap[1][bank[1]]) { - if (layers_ctrl & 2) m_tilemap_2->draw(screen, bitmap, cliprect, 0, 0); - if (layers_ctrl & 2) m_tilemap_3->draw(screen, bitmap, cliprect, 0, 0); + if (layers_ctrl & 2) m_tilemap[1][bank[1]]->draw(screen, bitmap, cliprect, 0, 0); } } |