diff options
Diffstat (limited to 'src/mame/video/dbz.c')
-rw-r--r-- | src/mame/video/dbz.c | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/src/mame/video/dbz.c b/src/mame/video/dbz.c new file mode 100644 index 00000000000..091a4a3bdd4 --- /dev/null +++ b/src/mame/video/dbz.c @@ -0,0 +1,194 @@ +/* + Dragonball Z + (c) 1993 Banpresto + Dragonball Z 2 Super Battle + (c) 1994 Banpresto + + Video hardware emulation. +*/ + + +#include "driver.h" +#include "video/konamiic.h" + +static tilemap *dbz_bg1_tilemap, *dbz_bg2_tilemap; +UINT16 *dbz_bg1_videoram, *dbz_bg2_videoram; +static int sprite_colorbase, layer_colorbase[6], layer[5], layerpri[5]; + +static void dbz_tile_callback(int layer, int *code, int *color, int *flags) +{ + *color = (layer_colorbase[layer] << 1) + ((*color & 0x3c) >> 2); +} + +static void dbz_sprite_callback(int *code, int *color, int *priority_mask) +{ + int pri = (*color & 0x3c0) >> 5; + + if(pri <= layerpri[3]) *priority_mask = 0xff00; + else if (pri > layerpri[3] && pri <= layerpri[2]) *priority_mask = 0xfff0; + else if (pri > layerpri[2] && pri <= layerpri[1]) *priority_mask = 0xfffc; + else *priority_mask = 0xfffe; + + *color = (sprite_colorbase << 1) + (*color & 0x1f); +} + +/* Background Tilemaps */ + +WRITE16_HANDLER( dbz_bg2_videoram_w ) +{ + COMBINE_DATA(&dbz_bg2_videoram[offset]); + tilemap_mark_tile_dirty(dbz_bg2_tilemap,offset/2); +} + +static TILE_GET_INFO( get_dbz_bg2_tile_info ) +{ + int tileno, colour, flag; + + tileno = dbz_bg2_videoram[tile_index*2+1] & 0x7fff; + colour = (dbz_bg2_videoram[tile_index*2] & 0x000f); + flag = (dbz_bg2_videoram[tile_index*2] & 0x0080) ? TILE_FLIPX : 0; + + SET_TILE_INFO(0,tileno,colour + (layer_colorbase[5] << 1),flag); +} + +WRITE16_HANDLER( dbz_bg1_videoram_w ) +{ + COMBINE_DATA(&dbz_bg1_videoram[offset]); + tilemap_mark_tile_dirty(dbz_bg1_tilemap,offset/2); +} + +static TILE_GET_INFO( get_dbz_bg1_tile_info ) +{ + int tileno, colour, flag; + + tileno = dbz_bg1_videoram[tile_index*2+1] & 0x7fff; + colour = (dbz_bg1_videoram[tile_index*2] & 0x000f); + flag = (dbz_bg1_videoram[tile_index*2] & 0x0080) ? TILE_FLIPX : 0; + + SET_TILE_INFO(1,tileno,colour + (layer_colorbase[4] << 1),flag); +} + +/* useful function to sort the four tile layers by priority order */ +static void sortlayers(int *layer, int *pri) +{ +#define SWAP(a,b) \ + if (pri[a] <= pri[b]) \ + { \ + int t; \ + t = pri[a]; pri[a] = pri[b]; pri[b] = t; \ + t = layer[a]; layer[a] = layer[b]; layer[b] = t; \ + } + + SWAP(0, 1) + SWAP(0, 2) + SWAP(0, 3) + SWAP(0, 4) + SWAP(1, 2) + SWAP(1, 3) + SWAP(1, 4) + SWAP(2, 3) + SWAP(2, 4) + SWAP(3, 4) +} + +VIDEO_START( dbz ) +{ + K053251_vh_start(); + K056832_vh_start(machine, REGION_GFX1, K056832_BPP_4, 1, NULL, dbz_tile_callback, 1); + K053247_vh_start(machine, REGION_GFX2, -52, 16, NORMAL_PLANE_ORDER, dbz_sprite_callback); + + dbz_bg1_tilemap = tilemap_create(get_dbz_bg1_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16, 16,64,32); + dbz_bg2_tilemap = tilemap_create(get_dbz_bg2_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16, 16,64,32); + + tilemap_set_transparent_pen(dbz_bg1_tilemap,0); + tilemap_set_transparent_pen(dbz_bg2_tilemap,0); + + K053936_wraparound_enable(0, 1); + K053936_set_offset(0, -46, -16); + + K053936_wraparound_enable(1, 1); + K053936_set_offset(1, -46, -16); + + if (!strcmp(machine->gamedrv->name, "dbz")) + K056832_set_LayerOffset(0, -34, -16); + else + K056832_set_LayerOffset(0, -35, -16); + + K056832_set_LayerOffset(1, -31, -16); + K056832_set_LayerOffset(3, -31, -16); //? + + K053247_set_SpriteOffset(-87,32); +} + +VIDEO_UPDATE( dbz ) +{ + static const int K053251_CI[6] = { K053251_CI3, K053251_CI4, K053251_CI4, K053251_CI4, K053251_CI2, K053251_CI1 }; + int plane, new_colorbase; + + sprite_colorbase = K053251_get_palette_index(K053251_CI0); + + for (plane=0; plane<6; plane++) + { + new_colorbase = K053251_get_palette_index(K053251_CI[plane]); + if (layer_colorbase[plane] != new_colorbase) + { + layer_colorbase[plane] = new_colorbase; + if(plane <= 3) + K056832_mark_plane_dirty(plane); + else if(plane == 4) + tilemap_mark_all_tiles_dirty(dbz_bg1_tilemap); + else if(plane == 5) + tilemap_mark_all_tiles_dirty(dbz_bg2_tilemap); + } + } + + //layers priority + + layer[0] = 0; + layerpri[0] = K053251_get_priority(K053251_CI3); + layer[1] = 1; + layerpri[1] = K053251_get_priority(K053251_CI4); + layer[2] = 3; + layerpri[2] = K053251_get_priority(K053251_CI0); + layer[3] = 4; + layerpri[3] = K053251_get_priority(K053251_CI2); + layer[4] = 5; + layerpri[4] = K053251_get_priority(K053251_CI1); + + sortlayers(layer, layerpri); + + fillbitmap(priority_bitmap, 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) + { + K053936_1_zoom_draw(bitmap,cliprect,dbz_bg1_tilemap,flag,pri); + } + else if(layer[plane] == 5) + { + K053936_0_zoom_draw(bitmap,cliprect,dbz_bg2_tilemap,flag,pri); + } + else + { + K056832_tilemap_draw(machine, bitmap,cliprect,layer[plane],flag,pri); + } + } + + K053247_sprites_draw(machine, bitmap, cliprect); + return 0; +} + |