summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/srmp2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/srmp2.c')
-rw-r--r--src/mame/video/srmp2.c462
1 files changed, 462 insertions, 0 deletions
diff --git a/src/mame/video/srmp2.c b/src/mame/video/srmp2.c
new file mode 100644
index 00000000000..30f25c970ec
--- /dev/null
+++ b/src/mame/video/srmp2.c
@@ -0,0 +1,462 @@
+/***************************************************************************
+
+Functions to emulate the video hardware of the machine.
+
+ Video hardware is very similar with "seta" hardware except color PROM.
+
+***************************************************************************/
+
+
+#include "driver.h"
+
+
+
+
+int srmp2_color_bank;
+int srmp3_gfx_bank;
+int mjyuugi_gfx_bank;
+
+
+PALETTE_INIT( srmp2 )
+{
+ int i;
+
+ for (i = 0; i < machine->drv->total_colors; i++)
+ {
+ int col;
+
+ col = (color_prom[i] << 8) + color_prom[i + machine->drv->total_colors];
+
+ palette_set_color_rgb(machine,i,pal5bit(col >> 10),pal5bit(col >> 5),pal5bit(col >> 0));
+ }
+
+ for (i = 0; i < machine->drv->total_colors; i++)
+ {
+ colortable[i] = i ^ 0x0f;
+ }
+}
+
+
+PALETTE_INIT( srmp3 )
+{
+ int i;
+
+ for (i = 0; i < machine->drv->total_colors; i++)
+ {
+ int col;
+
+ col = (color_prom[i] << 8) + color_prom[i + machine->drv->total_colors];
+ palette_set_color_rgb(machine,i,pal5bit(col >> 10),pal5bit(col >> 5),pal5bit(col >> 0));
+ }
+}
+
+
+static void srmp2_draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
+{
+/*
+ Sprite RAM A: spriteram16_2
+ ==============
+ + 0x000 - 0x3ff
+ x--- ---- ---- ---- : Flip X
+ -x-- ---- ---- ---- : Flip Y
+ --xx xxxx xxxx xxxx : Tile number
+
+ + 0x400 - 0x7ff
+ xxxx x--- ---- ---- : Color
+ ---- ---x xxxx xxxx : X coords
+
+ Sprite RAM B: spriteram16
+ ==============
+ + 0x000 - 0x3ff
+ ---- ---- xxxx xxxx : Y coords
+
+ + 0x600
+ ---- ---- -x-- ---- : Flip screen
+*/
+
+ int offs;
+ int xoffs, yoffs;
+
+ int ctrl = spriteram16[ 0x600/2 ];
+ int ctrl2 = spriteram16[ 0x602/2 ];
+
+ int flip = ctrl & 0x40;
+
+ /* Sprites Banking and/or Sprites Buffering */
+ UINT16 *src = spriteram16_2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
+
+ int max_y = machine -> screen[0].height;
+
+ xoffs = flip ? 0x10 : 0x10;
+ yoffs = flip ? 0x05 : 0x07;
+
+ for (offs = (0x400-2)/2; offs >= 0/2; offs -= 2/2)
+ {
+ int code = src[offs + 0x000/2];
+
+ int x = src[offs + 0x400/2];
+ int y = spriteram16[offs + 0x000/2] & 0xff;
+
+ int flipx = code & 0x8000;
+ int flipy = code & 0x4000;
+
+ int color = (x >> 11) & 0x1f;
+
+ if (flip)
+ {
+ y = max_y - y;
+ flipx = !flipx;
+ flipy = !flipy;
+ }
+
+ code = code & 0x3fff;
+
+ if (srmp2_color_bank) color |= 0x20;
+
+ drawgfx(bitmap, machine->gfx[0],
+ code,
+ color,
+ flipx, flipy,
+ (x + xoffs) & 0x1ff,
+ max_y - ((y + yoffs) & 0x0ff),
+ cliprect, TRANSPARENCY_PEN, 15);
+ }
+}
+
+
+static void srmp3_draw_sprites_map(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
+{
+ int offs, col;
+ int xoffs, yoffs;
+
+ int ctrl = spriteram[ 0x600/2 ];
+ int ctrl2 = spriteram[ 0x602/2 ];
+
+ int flip = ctrl & 0x40;
+ int numcol = ctrl2 & 0x0f;
+
+ int upper = ( spriteram[ 0x604/2 ] & 0xFF ) +
+ ( spriteram[ 0x606/2 ] & 0xFF ) * 256;
+
+ int max_y = 0xf0;
+
+ xoffs = flip ? 0x10 : 0x10;
+ yoffs = flip ? -0x01 : -0x01;
+
+ /* Number of columns to draw - the value 1 seems special, meaning:
+ draw every column */
+ if (numcol == 1) numcol = 16;
+
+ /* The first column is the frontmost, see twineagl test mode */
+ for (col = numcol - 1; col >= 0; col--)
+ {
+ int x = spriteram[(col * 0x20 + 0x08 + 0x400)/2] & 0xff;
+ int y = spriteram[(col * 0x20 + 0x00 + 0x400)/2] & 0xff;
+
+ /* draw this column */
+ for (offs = 0; offs < 0x40/2; offs += 2/2)
+ {
+ int code = (((spriteram_3[((col)&0x0f) * 0x40/2 + offs + 0x800/2] & 0xff) << 8) + (spriteram_2[((col)&0xf) * 0x40/2 + offs + 0x800/2] & 0xff));
+
+ int color = ((spriteram_3[((col)&0x0f) * 0x40/2 + offs + 0xc00/2] & 0xf8) >> 3);
+
+ int flipx = code & 0x8000;
+ int flipy = code & 0x4000;
+
+ int sx = x + xoffs + (offs & 1) * 16;
+ int sy = -(y + yoffs) + (offs / 2) * 16 -
+ (machine->screen[0].height-(machine->screen[0].visarea.max_y + 1));
+
+ if (upper & (1 << col)) sx += 256;
+
+ if (flip)
+ {
+ sy = max_y - 14 - sy - 0x100;
+ flipx = !flipx;
+ flipy = !flipy;
+ }
+
+ code = code & 0x1fff;
+
+#define DRAWTILE(_x_, _y_) \
+ drawgfx(bitmap, machine->gfx[0], \
+ code, \
+ color, \
+ flipx, flipy, \
+ _x_, _y_, \
+ cliprect, TRANSPARENCY_PEN, 0);
+
+ DRAWTILE(sx - 0x000, sy + 0x000)
+ DRAWTILE(sx - 0x200, sy + 0x000)
+ DRAWTILE(sx - 0x000, sy + 0x100)
+ DRAWTILE(sx - 0x200, sy + 0x100)
+
+ }
+ /* next column */
+ }
+}
+
+
+static void srmp3_draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
+{
+/*
+ Sprite RAM A: spriteram_2
+ ==============
+ + 0x000 - 0x1ff
+ xxxx xxxx : Tile number (low)
+
+ + 0x200 - 0x3ff
+ ---- ---- : Color
+ xxxx xxxx : X coords (low)
+
+
+ Sprite RAM B: spriteram_3
+ ==============
+ + 0x000 - 0x1ff
+ x--- ---- : Flip X ?
+ -x-- ---- : Flip Y ?
+ --x- ---- : Use GFX bank flag
+ ---x xxxx : Tile number (high)
+
+ + 0x200 - 0x3ff
+ xxxx x--- : Color
+ ---- ---x : X coords (high)
+
+
+ Sprite RAM C: spriteram
+ ==============
+ + 0x000 - 0x1ff
+ xxxx xxxx : Y coords (low)
+
+ + 0x300
+ -x-- ---- : Flip screen
+*/
+
+ int offs;
+ int xoffs, yoffs;
+
+ int max_y = machine -> screen[0].height;
+
+ int ctrl = spriteram[ 0x600/2 ];
+// int ctrl2 = spriteram[ 0x602/2 ];
+
+ int flip = ctrl & 0x40;
+
+ srmp3_draw_sprites_map(machine, bitmap, cliprect);
+
+ xoffs = flip ? 0x10 : 0x10;
+ yoffs = flip ? 0x06 : 0x06;
+
+ for (offs = 0x200 - 1; offs >= 0; offs--)
+ {
+ int code = (((spriteram_3[offs + 0x000] & 0xff) << 8) + (spriteram_2[offs + 0x000] & 0xff));
+ int gfxbank = (spriteram_3[offs + 0x000] & 0x20);
+
+ int color = ((spriteram_3[offs + 0x200] & 0xf8) >> 3);
+
+ int x = (((spriteram_3[offs + 0x200] & 0x01) << 8) + (spriteram_2[offs + 0x200] & 0xff));
+ int y = (spriteram[offs + 0x000] & 0xff);
+
+ int flipx = code & 0x8000;
+ int flipy = code & 0x4000;
+
+ code = (code & 0x1fff);
+ if (gfxbank) code += ((srmp3_gfx_bank + 1) * 0x2000);
+
+ if (flip)
+ {
+ y = max_y - y;
+ flipx = !flipx;
+ flipy = !flipy;
+ }
+
+ drawgfx(bitmap,machine->gfx[0],
+ code,
+ color,
+ flipx, flipy,
+ (x + xoffs) & 0x1ff,
+ max_y - ((y + yoffs) & 0x0ff),
+ cliprect, TRANSPARENCY_PEN, 0);
+ }
+}
+
+
+static void mjyuugi_draw_sprites_map(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
+{
+ int offs, col;
+ int xoffs, yoffs;
+
+ int total_color_codes = machine->drv->gfxdecodeinfo[0].total_color_codes;
+
+ int ctrl = spriteram16[ 0x600/2 ];
+ int ctrl2 = spriteram16[ 0x602/2 ];
+
+ int flip = ctrl & 0x40;
+ int numcol = ctrl2 & 0x000f;
+
+ /* Sprites Banking and/or Sprites Buffering */
+ UINT16 *src = spriteram16_2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
+
+ int upper = ( spriteram16[ 0x604/2 ] & 0xFF ) +
+ ( spriteram16[ 0x606/2 ] & 0xFF ) * 256;
+
+ int max_y = 0xf0;
+
+ xoffs = flip ? 0x10 : 0x10;
+ yoffs = flip ? 0x09 : 0x07;
+
+ /* Number of columns to draw - the value 1 seems special, meaning:
+ draw every column */
+ if (numcol == 1) numcol = 16;
+
+ /* The first column is the frontmost, see twineagl test mode */
+ for (col = numcol - 1; col >= 0; col--)
+ {
+ int x = spriteram16[(col * 0x20 + 0x08 + 0x400)/2] & 0xff;
+ int y = spriteram16[(col * 0x20 + 0x00 + 0x400)/2] & 0xff;
+
+ /* draw this column */
+ for (offs = 0; offs < 0x40/2; offs += 2/2)
+ {
+ int code = src[((col)&0xf) * 0x40/2 + offs + 0x800/2];
+ int color = src[((col)&0xf) * 0x40/2 + offs + 0xc00/2];
+
+ int gfxbank = color & 0x0200;
+
+ int flipx = code & 0x8000;
+ int flipy = code & 0x4000;
+
+ int sx = x + xoffs + (offs & 1) * 16;
+ int sy = -(y + yoffs) + (offs / 2) * 16 -
+ (machine->screen[0].height-(machine->screen[0].visarea.max_y + 1));
+
+ if (upper & (1 << col)) sx += 256;
+
+ if (flip)
+ {
+ sy = max_y - 16 - sy - 0x100;
+ flipx = !flipx;
+ flipy = !flipy;
+ }
+
+ color = ((color >> (16-5)) % total_color_codes);
+ code = (code & 0x3fff) + (gfxbank ? 0x4000 : 0);
+
+#define DRAWTILE(_x_, _y_) \
+ drawgfx(bitmap, machine->gfx[0], \
+ code, \
+ color, \
+ flipx, flipy, \
+ _x_, _y_, \
+ cliprect, TRANSPARENCY_PEN, 0);
+
+ DRAWTILE(sx - 0x000, sy + 0x000)
+ DRAWTILE(sx - 0x200, sy + 0x000)
+ DRAWTILE(sx - 0x000, sy + 0x100)
+ DRAWTILE(sx - 0x200, sy + 0x100)
+
+ }
+ /* next column */
+ }
+}
+
+
+static void mjyuugi_draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
+{
+/*
+ Sprite RAM A: spriteram16_2
+ ==============
+ + 0x000 - 0x3ff
+ x--- ---- ---- ---- : Flip X
+ -x-- ---- ---- ---- : Flip Y
+ --x- ---- ---- ---- : Use GFX bank flag
+ ---x xxxx xxxx xxxx : Tile number
+
+ + 0x400 - 0x7ff
+ xxxx x--- ---- ---- : Color
+ ---- ---x xxxx xxxx : X coords
+
+ Sprite RAM B: spriteram16
+ ==============
+ + 0x000 - 0x3ff
+ ---- ---- xxxx xxxx : Y coords
+
+ + 0x600
+ ---- ---- -x-- ---- : Flip screen
+*/
+
+ int offs;
+ int xoffs, yoffs;
+
+ int ctrl = spriteram16[ 0x600/2 ];
+ int ctrl2 = spriteram16[ 0x602/2 ];
+
+ int flip = ctrl & 0x40;
+
+ /* Sprites Banking and/or Sprites Buffering */
+ UINT16 *src = spriteram16_2 + ( ((ctrl2 ^ (~ctrl2<<1)) & 0x40) ? 0x2000/2 : 0 );
+
+ int max_y = machine -> screen[0].height;
+
+ mjyuugi_draw_sprites_map(machine, bitmap, cliprect);
+
+ xoffs = flip ? 0x10 : 0x10;
+ yoffs = flip ? 0x06 : 0x06;
+
+ for (offs = (0x400 - 6) / 2; offs >= 0 / 2; offs -= 2 / 2)
+ {
+ int code = src[offs + 0x000 / 2];
+ int gfxbank = code & 0x2000;
+
+ int color = ((src[offs + 0x400 / 2] >> 11) & 0x1f);
+
+ int x = (src[offs + 0x400 / 2] & 0x1ff);
+ int y = (spriteram16[offs + 0x000 / 2] & 0xff);
+
+ int flipx = code & 0x8000;
+ int flipy = code & 0x4000;
+
+ code = (code & 0x1fff);
+ if (gfxbank) code += ((mjyuugi_gfx_bank + 1) * 0x2000);
+
+ if (flip)
+ {
+ y = max_y - y
+ +(machine->screen[0].height-(machine->screen[0].visarea.max_y + 1));
+ flipx = !flipx;
+ flipy = !flipy;
+ }
+
+ drawgfx(bitmap,machine->gfx[0],
+ code,
+ color,
+ flipx, flipy,
+ (x + xoffs) & 0x1ff,
+ max_y - ((y + yoffs) & 0x0ff),
+ cliprect, TRANSPARENCY_PEN, 0);
+ }
+}
+
+
+VIDEO_UPDATE( srmp2 )
+{
+ fillbitmap(bitmap, machine->pens[0x1f0], cliprect);
+ srmp2_draw_sprites(machine, bitmap, cliprect);
+ return 0;
+}
+
+
+VIDEO_UPDATE( srmp3 )
+{
+ fillbitmap(bitmap, machine->pens[0x1f0], cliprect);
+ srmp3_draw_sprites(machine, bitmap, cliprect);
+ return 0;
+}
+
+
+VIDEO_UPDATE( mjyuugi )
+{
+ fillbitmap(bitmap, machine->pens[0x1f0], cliprect);
+ mjyuugi_draw_sprites(machine, bitmap, cliprect);
+ return 0;
+}