#include "driver.h" #include "video/konamiic.h" #define SPRITEROM_MEM_REGION REGION_GFX1 #define ZOOMROM0_MEM_REGION REGION_GFX2 #define ZOOMROM1_MEM_REGION REGION_GFX3 #define ZOOMROM2_MEM_REGION REGION_GFX4 static int sprite_colorbase, zoom_colorbase[3]; static int bank0,bank1,bank2; /*************************************************************************** Callbacks for the K051960 ***************************************************************************/ static void sprite_callback(int *code,int *color,int *priority,int *shadow) { *priority = (*color & 0x80) >> 7; *color = sprite_colorbase + ((*color & 0x7e) >> 1); *shadow = 0; } /*************************************************************************** Callbacks for the K051316 ***************************************************************************/ static void zoom_callback_0(int *code,int *color,int *flags) { *code |= ((*color & 0x07) << 8) | (bank0 << 11); *color = zoom_colorbase[0] + ((*color & 0xf8) >> 3); } static void zoom_callback_1(int *code,int *color,int *flags) { *code |= ((*color & 0x07) << 8) | (bank1 << 11); *color = zoom_colorbase[1] + ((*color & 0xf8) >> 3); } static void zoom_callback_2(int *code,int *color,int *flags) { *code |= ((*color & 0x07) << 8) | (bank2 << 11); *color = zoom_colorbase[2] + ((*color & 0xf8) >> 3); } /*************************************************************************** Start the video hardware emulation. ***************************************************************************/ VIDEO_START( ultraman ) { sprite_colorbase = 192; zoom_colorbase[0] = 0; zoom_colorbase[1] = 64; zoom_colorbase[2] = 128; K051960_vh_start(machine,SPRITEROM_MEM_REGION,NORMAL_PLANE_ORDER,sprite_callback); K051316_vh_start_0(machine,ZOOMROM0_MEM_REGION,4,FALSE,0,zoom_callback_0); K051316_vh_start_1(machine,ZOOMROM1_MEM_REGION,4,FALSE,0,zoom_callback_1); K051316_vh_start_2(machine,ZOOMROM2_MEM_REGION,4,TRUE,0,zoom_callback_2); K051316_set_offset(0, 8, 0); K051316_set_offset(1, 8, 0); K051316_set_offset(2, 8, 0); } /*************************************************************************** Memory handlers ***************************************************************************/ WRITE16_HANDLER( ultraman_gfxctrl_w ) { if (ACCESSING_LSB) { /* bit 0: enable wraparound for scr #1 bit 1: msb of code for scr #1 bit 2: enable wraparound for scr #2 bit 3: msb of code for scr #2 bit 4: enable wraparound for scr #3 bit 5: msb of code for scr #3 bit 6: coin counter 1 bit 7: coin counter 2 */ K051316_wraparound_enable(0,data & 0x01); if (bank0 != ((data & 0x02) >> 1)) { bank0 = (data & 0x02) >> 1; tilemap_mark_all_tiles_dirty(ALL_TILEMAPS); /* should mark only zoom0 */ } K051316_wraparound_enable(1,data & 0x04); if (bank1 != ((data & 0x08) >> 3)) { bank1 = (data & 0x08) >> 3; tilemap_mark_all_tiles_dirty(ALL_TILEMAPS); /* should mark only zoom1 */ } K051316_wraparound_enable(2,data & 0x10); if (bank2 != ((data & 0x20) >> 5)) { bank2 = (data & 0x20) >> 5; tilemap_mark_all_tiles_dirty(ALL_TILEMAPS); /* should mark only zoom2 */ } coin_counter_w(0, data & 0x40); coin_counter_w(1, data & 0x80); } } /*************************************************************************** Display Refresh ***************************************************************************/ VIDEO_UPDATE( ultraman ) { K051316_zoom_draw_2(bitmap,cliprect,0,0); K051316_zoom_draw_1(bitmap,cliprect,0,0); K051960_sprites_draw(bitmap,cliprect,0,0); K051316_zoom_draw_0(bitmap,cliprect,0,0); K051960_sprites_draw(bitmap,cliprect,1,1); return 0; }