// license:BSD-3-Clause // copyright-holders:David Haywood, R. Belmont, Pierpaolo Prazzoli /* Dragon Ball Z (c) 1993 Banpresto Dragon Ball Z 2 Super Battle (c) 1994 Banpresto Video hardware emulation. */ #include "emu.h" #include "includes/dbz.h" K056832_CB_MEMBER(dbz_state::tile_callback) { *color = (m_layer_colorbase[layer] << 1) + ((*color & 0x3c) >> 2); } K053246_CB_MEMBER(dbz_state::sprite_callback) { int pri = (*color & 0x3c0) >> 5; if (pri <= m_layerpri[3]) *priority_mask = 0xff00; else if (pri > m_layerpri[3] && pri <= m_layerpri[2]) *priority_mask = 0xfff0; else if (pri > m_layerpri[2] && pri <= m_layerpri[1]) *priority_mask = 0xfffc; else *priority_mask = 0xfffe; *color = (m_sprite_colorbase << 1) + (*color & 0x1f); } /* Background Tilemaps */ WRITE16_MEMBER(dbz_state::dbz_bg2_videoram_w) { COMBINE_DATA(&m_bg2_videoram[offset]); m_bg2_tilemap->mark_tile_dirty(offset / 2); } TILE_GET_INFO_MEMBER(dbz_state::get_dbz_bg2_tile_info) { int tileno, colour, flag; tileno = m_bg2_videoram[tile_index * 2 + 1] & 0x7fff; colour = (m_bg2_videoram[tile_index * 2] & 0x000f); flag = (m_bg2_videoram[tile_index * 2] & 0x0080) ? TILE_FLIPX : 0; SET_TILE_INFO_MEMBER(0, tileno, colour + (m_layer_colorbase[5] << 1), flag); } WRITE16_MEMBER(dbz_state::dbz_bg1_videoram_w) { COMBINE_DATA(&m_bg1_videoram[offset]); m_bg1_tilemap->mark_tile_dirty(offset / 2); } TILE_GET_INFO_MEMBER(dbz_state::get_dbz_bg1_tile_info) { int tileno, colour, flag; tileno = m_bg1_videoram[tile_index * 2 + 1] & 0x7fff; colour = (m_bg1_videoram[tile_index * 2] & 0x000f); flag = (m_bg1_videoram[tile_index * 2] & 0x0080) ? TILE_FLIPX : 0; SET_TILE_INFO_MEMBER(1, tileno, colour + (m_layer_colorbase[4] << 1), flag); } void dbz_state::video_start() { m_bg1_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(dbz_state::get_dbz_bg1_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 32); m_bg2_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(dbz_state::get_dbz_bg2_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 64, 32); m_bg1_tilemap->set_transparent_pen(0); m_bg2_tilemap->set_transparent_pen(0); if (!strcmp(machine().system().name, "dbz")) m_k056832->set_layer_offs(0, -34, -16); else m_k056832->set_layer_offs(0, -35, -16); m_k056832->set_layer_offs(1, -31, -16); m_k056832->set_layer_offs(3, -31, -16); //? } uint32_t dbz_state::screen_update_dbz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { static const int K053251_CI[6] = { k053251_device::CI3, k053251_device::CI4, k053251_device::CI4, k053251_device::CI4, k053251_device::CI2, k053251_device::CI1 }; int layer[5], plane, new_colorbase; m_sprite_colorbase = m_k053251->get_palette_index(k053251_device::CI0); for (plane = 0; plane < 6; plane++) { new_colorbase = m_k053251->get_palette_index(K053251_CI[plane]); if (m_layer_colorbase[plane] != new_colorbase) { m_layer_colorbase[plane] = new_colorbase; if (plane <= 3) m_k056832->mark_plane_dirty( plane); else if (plane == 4) m_bg1_tilemap->mark_all_dirty(); else if (plane == 5) m_bg2_tilemap->mark_all_dirty(); } } //layers priority layer[0] = 0; m_layerpri[0] = m_k053251->get_priority(k053251_device::CI3); layer[1] = 1; m_layerpri[1] = m_k053251->get_priority(k053251_device::CI4); layer[2] = 3; m_layerpri[2] = m_k053251->get_priority(k053251_device::CI0); layer[3] = 4; m_layerpri[3] = m_k053251->get_priority(k053251_device::CI2); layer[4] = 5; m_layerpri[4] = m_k053251->get_priority(k053251_device::CI1); konami_sortlayers5(layer, m_layerpri); screen.priority().fill(0, cliprect); for (plane = 0; plane < 5; plane++) { int flag, pri; if (plane == 0) { flag = TILEMAP_DRAW_OPAQUE; pri = 0; } else { flag = 0; pri = 1 << (plane - 1); } if(layer[plane] == 4) m_k053936_2->zoom_draw(screen, bitmap, cliprect, m_bg1_tilemap, flag, pri, 1); else if(layer[plane] == 5) m_k053936_1->zoom_draw(screen, bitmap, cliprect, m_bg2_tilemap, flag, pri, 1); else m_k056832->tilemap_draw(screen, bitmap, cliprect, layer[plane], flag, pri); } m_k053246->k053247_sprites_draw( bitmap, cliprect); return 0; }