#include "driver.h" #include "video/taitoic.h" #define TC0100SCN_GFX_NUM 1 /**********************************************************/ static void warriorb_core_vh_start(running_machine *machine, int x_offs,int multiscrn_xoffs) { int chips; chips = number_of_TC0100SCN(); assert_always(chips > 0, "erroneous TC0100SCN configuration"); TC0100SCN_vh_start(machine,chips,TC0100SCN_GFX_NUM,x_offs,0,0,0,0,0,multiscrn_xoffs); if (has_TC0110PCR()) TC0110PCR_vh_start(); if (has_second_TC0110PCR()) TC0110PCR_1_vh_start(); /* Ensure palette from correct TC0110PCR used for each screen */ TC0100SCN_set_chip_colbanks(0,0x100,0x0); } VIDEO_START( darius2d ) { warriorb_core_vh_start(machine, 4,0); } VIDEO_START( warriorb ) { warriorb_core_vh_start(machine, 4,1); } /************************************************************ SPRITE DRAW ROUTINE ************************************************************/ static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect,int x_offs,int y_offs) { int offs, data, data2, tilenum, color, flipx, flipy; int x, y, priority, pri_mask; #ifdef MAME_DEBUG int unknown=0; #endif /* pdrawgfx() needs us to draw sprites front to back */ for (offs = 0;offs < spriteram_size/2;offs += 4) { data = spriteram16[offs+1]; tilenum = data & 0x7fff; data = spriteram16[offs+0]; y = (-(data &0x1ff) - 24) & 0x1ff; /* (inverted y adjusted for vis area) */ flipy = (data & 0x200) >> 9; data2 = spriteram16[offs+2]; /* 8,4 also seen in msbyte */ priority = (data2 & 0x0100) >> 8; // 1 = low if(priority) pri_mask = 0xfffe; else pri_mask = 0; color = (data2 & 0x7f); data = spriteram16[offs+3]; x = (data & 0x3ff); flipx = (data & 0x400) >> 10; #ifdef MAME_DEBUG if (data2 & 0xf280) unknown |= (data2 &0xf280); #endif x -= x_offs; y += y_offs; /* sprite wrap: coords become negative at high values */ if (x>0x3c0) x -= 0x400; if (y>0x180) y -= 0x200; pdrawgfx(bitmap,machine->gfx[0], tilenum, color, flipx,flipy, x,y, cliprect,TRANSPARENCY_PEN,0,pri_mask); } #ifdef MAME_DEBUG if (unknown) popmessage("unknown sprite bits: %04x",unknown); #endif } /************************************************************** SCREEN REFRESH **************************************************************/ VIDEO_UPDATE( warriorb ) { int xoffs = 40*8*screen; UINT8 layer[3], nodraw; TC0100SCN_tilemap_update(machine); layer[0] = TC0100SCN_bottomlayer(0); layer[1] = layer[0]^1; layer[2] = 2; /* Clear priority bitmap */ fillbitmap(priority_bitmap, 0, cliprect); /* chip 0 does tilemaps on the left, chip 1 does the ones on the right */ // draw bottom layer nodraw = TC0100SCN_tilemap_draw(machine,bitmap,cliprect,screen,layer[0],TILEMAP_DRAW_OPAQUE,0); /* left */ /* Ensure screen blanked even when bottom layers not drawn due to disable bit */ if(nodraw) fillbitmap(bitmap, get_black_pen(machine), cliprect); // draw middle layer TC0100SCN_tilemap_draw(machine,bitmap,cliprect,screen,layer[1],0,1); /* Sprites can be under/over the layer below text layer */ draw_sprites(machine, bitmap,cliprect,xoffs,8); // draw sprites // draw top(text) layer TC0100SCN_tilemap_draw(machine,bitmap,cliprect,screen,layer[2],0,0); return 0; }