summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/galspnbl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/galspnbl.c')
-rw-r--r--src/mame/video/galspnbl.c144
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;
+}