#include "driver.h" UINT16 *galspnbl_bgvideoram,*galspnbl_videoram,*galspnbl_colorram; static int screenscroll; PALETTE_INIT( galspnbl ) { int i; /* initialize 555 RGB lookup */ for (i = 0;i < 32768;i++) palette_set_color_rgb(machine,i+1024,pal5bit(i >> 5),pal5bit(i >> 10),pal5bit(i >> 0)); } WRITE16_HANDLER( galspnbl_bgvideoram_w ) { int sx,sy; data = COMBINE_DATA(&galspnbl_bgvideoram[offset]); sx = offset % 512; sy = offset / 512; *BITMAP_ADDR16(tmpbitmap, sy, sx) = Machine->pens[1024 + (data >> 1)]; } WRITE16_HANDLER( galspnbl_scroll_w ) { if (ACCESSING_LSB) screenscroll = 4-(data & 0xff); } /* sprite format (see also Ninja Gaiden): * * word bit usage * --------+-fedcba9876543210-+---------------- * 0 | ---------------x | flip x * | --------------x- | flip y * | -------------x-- | enable * | ----------xx---- | priority? * | ---------x------ | flicker? * 1 | xxxxxxxxxxxxxxxx | code * 2 | --------xxxx---- | color * | --------------xx | size: 8x8, 16x16, 32x32, 64x64 * 3 | xxxxxxxxxxxxxxxx | y position * 4 | xxxxxxxxxxxxxxxx | x position * 5,6,7| | unused */ static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int priority) { int offs; static const UINT8 layout[8][8] = { {0,1,4,5,16,17,20,21}, {2,3,6,7,18,19,22,23}, {8,9,12,13,24,25,28,29}, {10,11,14,15,26,27,30,31}, {32,33,36,37,48,49,52,53}, {34,35,38,39,50,51,54,55}, {40,41,44,45,56,57,60,61}, {42,43,46,47,58,59,62,63} }; for (offs = (spriteram_size-16)/2;offs >= 0;offs -= 8) { int sx,sy,code,color,size,attr,flipx,flipy; int col,row; attr = spriteram16[offs]; if ((attr & 0x0004) && ((attr & 0x0040) == 0 || (cpu_getcurrentframe() & 1)) // && ((attr & 0x0030) >> 4) == priority) && ((attr & 0x0020) >> 5) == priority) { code = spriteram16[offs+1]; color = spriteram16[offs+2]; size = 1 << (color & 0x0003); // 1,2,4,8 color = (color & 0x00f0) >> 4; sx = spriteram16[offs+4] + screenscroll; sy = spriteram16[offs+3]; flipx = attr & 0x0001; flipy = attr & 0x0002; for (row = 0;row < size;row++) { for (col = 0;col < size;col++) { int x = sx + 8*(flipx?(size-1-col):col); int y = sy + 8*(flipy?(size-1-row):row); drawgfx(bitmap,machine->gfx[1], code + layout[row][col], color, flipx,flipy, x,y, cliprect,TRANSPARENCY_PEN,0); } } } } } VIDEO_UPDATE( galspnbl ) { int offs; /* copy the temporary bitmap to the screen */ copyscrollbitmap(bitmap,tmpbitmap,1,&screenscroll,0,0,cliprect,TRANSPARENCY_NONE,0); draw_sprites(machine,bitmap,cliprect,0); for (offs = 0;offs < 0x1000/2;offs++) { int sx,sy,code,attr,color; code = galspnbl_videoram[offs]; attr = galspnbl_colorram[offs]; color = (attr & 0x00f0) >> 4; sx = offs % 64; sy = offs / 64; /* What is this? A priority/half transparency marker? */ if (!(attr & 0x0008)) { drawgfx(bitmap,machine->gfx[0], code, color, 0,0, 16*sx + screenscroll,8*sy, cliprect,TRANSPARENCY_PEN,0); } } draw_sprites(machine,bitmap,cliprect,1); return 0; }