diff options
Diffstat (limited to 'src/mame/video/galspnbl.c')
-rw-r--r-- | src/mame/video/galspnbl.c | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/src/mame/video/galspnbl.c b/src/mame/video/galspnbl.c new file mode 100644 index 00000000000..361ddd41f3c --- /dev/null +++ b/src/mame/video/galspnbl.c @@ -0,0 +1,144 @@ +#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; +} |