diff options
Diffstat (limited to 'src/mame/video/cave.cpp')
-rw-r--r-- | src/mame/video/cave.cpp | 120 |
1 files changed, 27 insertions, 93 deletions
diff --git a/src/mame/video/cave.cpp b/src/mame/video/cave.cpp index 75d32eafeb2..de08a215d20 100644 --- a/src/mame/video/cave.cpp +++ b/src/mame/video/cave.cpp @@ -33,8 +33,8 @@ Note: if MAME_DEBUG is defined, pressing: [ 1024 Zooming Sprites ] - There are 2 sprite RAMs. A hardware register's bit selects - the one to display (sprites double buffering). + There are 2 or 4 0x4000 Sprite RAM Areas. A hardware register's + bit selects an area to display (sprites double buffering). The sprites are NOT tile based: the "tile" size and start address is selectable for each sprite with a 16 pixel granularity. @@ -58,8 +58,6 @@ Note: if MAME_DEBUG is defined, pressing: #define SPRITE_FLIPY_CAVE 0x02 #define SPRITE_VISIBLE_CAVE 0x04 -#define SWAP(X,Y) { int temp = X; X = Y; Y = temp; } - /*************************************************************************** @@ -218,10 +216,11 @@ void cave_state::set_pens(int chip) ***************************************************************************/ -inline void cave_state::get_tile_info( tile_data &tileinfo, int tile_index, int GFX ) +template<int Chip> +TILE_GET_INFO_MEMBER(cave_state::get_tile_info) { - uint16_t *VRAM = m_vram[GFX]; - int TDIM = m_tiledim[GFX]; + uint16_t *VRAM = m_vram[Chip]; + int TDIM = m_tiledim[Chip]; uint32_t code, color, pri, tile; if (TDIM) @@ -245,7 +244,7 @@ inline void cave_state::get_tile_info( tile_data &tileinfo, int tile_index, int code = (code & 0x00ffffff); } - SET_TILE_INFO_MEMBER(GFX, code, color, 0 ); + SET_TILE_INFO_MEMBER(Chip, code, color, 0 ); tileinfo.category = pri; } @@ -294,64 +293,6 @@ TILE_GET_INFO_MEMBER(cave_state::sailormn_get_tile_info_2) } -inline void cave_state::vram_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED uint16_t data, ATTR_UNUSED uint16_t mem_mask, int GFX ) -{ - uint16_t *VRAM = m_vram[GFX]; - tilemap_t *TILEMAP = m_tilemap[GFX]; - - if ((VRAM[offset] & mem_mask) == (data & mem_mask)) - return; - - COMBINE_DATA(&VRAM[offset]); - offset /= 2; - if (offset < 0x1000 / 4) // 16x16 tilemap - { - offset = (offset % (512 / 16)) * 2 + (offset / (512 / 16)) * (512 / 8) * 2; - TILEMAP->mark_tile_dirty(offset + 0); - TILEMAP->mark_tile_dirty(offset + 1); - TILEMAP->mark_tile_dirty(offset + 0 + 512 / 8); - TILEMAP->mark_tile_dirty(offset + 1 + 512 / 8); - } - else if (offset >= 0x4000 / 4) // 8x8 tilemap - TILEMAP->mark_tile_dirty(offset - 0x4000 / 4); -} - -/* Some games, that only ever use the 8x8 tiles and no line scroll, - use mirror ram. For example in donpachi, writes to 400000-403fff - and 408000-407fff both go to the 8x8 tilemap ram. Use this function - in this cases. Note that the get_tile_info function looks in the - 4000-7fff range for tiles, so we have to write the data there. */ -inline void cave_state::vram_8x8_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED uint16_t data, ATTR_UNUSED uint16_t mem_mask, int GFX ) -{ - uint16_t *VRAM = m_vram[GFX]; - tilemap_t *TILEMAP = m_tilemap[GFX]; - - offset %= 0x4000 / 2; - if ((VRAM[offset] & mem_mask) == (data & mem_mask)) - return; - - COMBINE_DATA(&VRAM[offset + 0x0000 / 2]); - COMBINE_DATA(&VRAM[offset + 0x4000 / 2]); - TILEMAP->mark_tile_dirty(offset / 2); -} - - -TILE_GET_INFO_MEMBER(cave_state::get_tile_info_0){ get_tile_info(tileinfo, tile_index, 0); } -TILE_GET_INFO_MEMBER(cave_state::get_tile_info_1){ get_tile_info(tileinfo, tile_index, 1); } -TILE_GET_INFO_MEMBER(cave_state::get_tile_info_2){ get_tile_info(tileinfo, tile_index, 2); } -TILE_GET_INFO_MEMBER(cave_state::get_tile_info_3){ get_tile_info(tileinfo, tile_index, 3); } - -WRITE16_MEMBER(cave_state::cave_vram_0_w){ vram_w(space, offset, data, mem_mask, 0); } -WRITE16_MEMBER(cave_state::cave_vram_1_w){ vram_w(space, offset, data, mem_mask, 1); } -WRITE16_MEMBER(cave_state::cave_vram_2_w){ vram_w(space, offset, data, mem_mask, 2); } -WRITE16_MEMBER(cave_state::cave_vram_3_w){ vram_w(space, offset, data, mem_mask, 3); } - -WRITE16_MEMBER(cave_state::cave_vram_0_8x8_w){ vram_8x8_w(space, offset, data, mem_mask, 0); } -WRITE16_MEMBER(cave_state::cave_vram_1_8x8_w){ vram_8x8_w(space, offset, data, mem_mask, 1); } -WRITE16_MEMBER(cave_state::cave_vram_2_8x8_w){ vram_8x8_w(space, offset, data, mem_mask, 2); } -WRITE16_MEMBER(cave_state::cave_vram_3_8x8_w){ vram_8x8_w(space, offset, data, mem_mask, 3); } - - /*************************************************************************** Video Init Routines @@ -385,7 +326,7 @@ void cave_state::cave_vh_start( int num ) switch (num) { case 4: - m_tilemap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_3),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); + m_tilemap[3] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info<3>),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); m_tilemap[3]->set_transparent_pen(0); m_tilemap[3]->set_scroll_rows(1); m_tilemap[3]->set_scroll_cols(1); @@ -393,7 +334,7 @@ void cave_state::cave_vh_start( int num ) save_item(NAME(m_old_tiledim[3])); case 3: - m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_2),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); + m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info<2>),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); m_tilemap[2]->set_transparent_pen(0); m_tilemap[2]->set_scroll_rows(1); m_tilemap[2]->set_scroll_cols(1); @@ -401,7 +342,7 @@ void cave_state::cave_vh_start( int num ) save_item(NAME(m_old_tiledim[2])); case 2: - m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_1),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); + m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info<1>),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); m_tilemap[1]->set_transparent_pen(0); m_tilemap[1]->set_scroll_rows(1); m_tilemap[1]->set_scroll_cols(1); @@ -409,7 +350,7 @@ void cave_state::cave_vh_start( int num ) save_item(NAME(m_old_tiledim[1])); case 1: - m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info_0),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); + m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(cave_state::get_tile_info<0>),this), TILEMAP_SCAN_ROWS, 8, 8, 512 / 8, 512 / 8); m_tilemap[0]->set_transparent_pen(0); m_tilemap[0]->set_scroll_rows(1); m_tilemap[0]->set_scroll_cols(1); @@ -499,10 +440,10 @@ VIDEO_START_MEMBER(cave_state,sailormn_3_layers) void cave_state::get_sprite_info_cave(int chip) { + chip %= 4; pen_t base_pal = 0; - const char *region[4] = { "sprites0", "sprites1", "sprites2", "sprites3" }; - const uint8_t *base_gfx = memregion(region[chip])->base(); - int code_max = memregion(region[chip])->bytes() / (16*16); + const uint8_t *base_gfx = m_spriteregion[chip]->base(); + int code_max = m_spriteregion[chip]->bytes() / (16*16); uint16_t *source; uint16_t *finish; @@ -514,13 +455,9 @@ void cave_state::get_sprite_info_cave(int chip) int max_x = m_screen->width(); int max_y = m_screen->height(); - source = m_spriteram[chip] + ((m_spriteram[chip].bytes() / 2) / 2) * m_spriteram_bank[chip%4]; + source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip]; - if (m_videoregs[chip][4] & 0x02) - if (m_spriteram_2[chip]) - source = m_spriteram_2[chip] + ((m_spriteram[chip].bytes() / 2) / 2) * m_spriteram_bank[chip]; - - finish = source + ((m_spriteram[chip].bytes() / 2) / 2); + finish = source + (0x4000 / 2); for (; source < finish; source += 8) @@ -628,10 +565,10 @@ void cave_state::get_sprite_info_cave(int chip) void cave_state::get_sprite_info_donpachi(int chip) { + chip %= 4; pen_t base_pal = 0; - const char *region[4] = { "sprites0", "sprites1", "sprites2", "sprites3" }; - const uint8_t *base_gfx = memregion(region[chip])->base(); - int code_max = memregion(region[chip])->bytes() / (16*16); + const uint8_t *base_gfx = m_spriteregion[chip]->base(); + int code_max = m_spriteregion[chip]->bytes() / (16*16); uint16_t *source; uint16_t *finish; @@ -643,14 +580,10 @@ void cave_state::get_sprite_info_donpachi(int chip) int max_x = m_screen->width(); int max_y = m_screen->height(); + + source = m_spriteram[chip] + (0x4000 / 2) * m_spriteram_bank[chip]; - source = m_spriteram[chip] + ((m_spriteram[chip].bytes() / 2) / 2) * m_spriteram_bank[chip%4]; - - if (m_videoregs[chip][4] & 0x02) - if (m_spriteram_2[chip]) - source = m_spriteram_2[chip] + ((m_spriteram[chip].bytes() / 2) / 2) * m_spriteram_bank[chip]; - - finish = source + ((m_spriteram[chip].bytes() / 2) / 2); + finish = source + (0x4000 / 2); for (; source < finish; source += 8) { @@ -1386,8 +1319,8 @@ void cave_state::sprite_draw_donpachi_zbuf( int chip, int priority ) .. - 8.w fedc ba98 7654 321- - ---- ---- ---- ---0 Sprite RAM Bank + 8.w fedc ba98 7654 32-- + ---- ---- ---- --10 Sprite RAM Bank There are more! @@ -1632,6 +1565,7 @@ uint32_t cave_state::screen_update_cave(screen_device &screen, bitmap_rgb32 &bit void cave_state::cave_get_sprite_info(int chip) { + int spriteram_bankmax = m_spriteram[chip].bytes() / 0x4000; if (m_videoregs[chip] == nullptr) return; @@ -1642,13 +1576,13 @@ void cave_state::cave_get_sprite_info(int chip) m_spriteram_bank[chip] = m_spriteram_bank_delay[chip]; (this->*m_get_sprite_info)(chip); } - m_spriteram_bank_delay[chip] = m_videoregs[chip][4] & 1; + m_spriteram_bank_delay[chip] = (m_videoregs[chip][4] & 3) % spriteram_bankmax; } else { if (machine().video().skip_this_frame() == 0) { - m_spriteram_bank[chip] = m_videoregs[chip][4] & 1; + m_spriteram_bank[chip] = (m_videoregs[chip][4] & 3) % spriteram_bankmax; (this->*m_get_sprite_info)(chip); } } |