diff options
Diffstat (limited to 'src/mame/video/ambush.c')
-rw-r--r-- | src/mame/video/ambush.c | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/src/mame/video/ambush.c b/src/mame/video/ambush.c new file mode 100644 index 00000000000..60f6273b2a0 --- /dev/null +++ b/src/mame/video/ambush.c @@ -0,0 +1,173 @@ +/*************************************************************************** + + video.c + + Functions to emulate the video hardware of the machine. + +***************************************************************************/ + +#include "driver.h" + + +UINT8 *ambush_scrollram; +UINT8 *ambush_colorbank; + + +/*************************************************************************** + + Convert the color PROMs into a more useable format. + + I'm not sure about the resistor value, I'm using the Galaxian ones. + +***************************************************************************/ +PALETTE_INIT( ambush ) +{ + int i; + + for (i = 0;i < machine->drv->total_colors; i++) + { + int bit0,bit1,bit2,r,g,b; + + /* red component */ + bit0 = (color_prom[i] >> 0) & 0x01; + bit1 = (color_prom[i] >> 1) & 0x01; + bit2 = (color_prom[i] >> 2) & 0x01; + r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + /* green component */ + bit0 = (color_prom[i] >> 3) & 0x01; + bit1 = (color_prom[i] >> 4) & 0x01; + bit2 = (color_prom[i] >> 5) & 0x01; + g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + /* blue component */ + bit0 = 0; + bit1 = (color_prom[i] >> 6) & 0x01; + bit2 = (color_prom[i] >> 7) & 0x01; + b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + + palette_set_color(machine,i,MAKE_RGB(r,g,b)); + } +} + + +static void draw_chars(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int priority) +{ + int offs, transparency; + + + transparency = (priority == 0) ? TRANSPARENCY_NONE : TRANSPARENCY_PEN; + + for (offs = 0; offs < videoram_size; offs++) + { + int code,sx,sy,col; + UINT8 scroll; + + + sy = (offs / 32); + sx = (offs % 32); + + col = colorram[((sy & 0x1c) << 3) + sx]; + + if ((col & 0x10) != priority) continue; + + scroll = ~ambush_scrollram[sx]; + + code = videoram[offs] | ((col & 0x60) << 3); + + if (flip_screen) + { + sx = 31 - sx; + sy = 31 - sy; + scroll = ~scroll - 1; + } + + drawgfx(bitmap,machine->gfx[0], + code, + (col & 0x0f) | ((*ambush_colorbank & 0x03) << 4), + flip_screen,flip_screen, + 8*sx, (8*sy + scroll) & 0xff, + cliprect,transparency,0); + } +} + + +VIDEO_UPDATE( ambush ) +{ + int offs; + + + fillbitmap(bitmap,machine->pens[0],cliprect); + + + /* Draw the background priority characters */ + draw_chars(machine, bitmap, cliprect, 0x00); + + + /* Draw the sprites. */ + for (offs = spriteram_size - 4;offs >= 0;offs -= 4) + { + int code,col,sx,sy,flipx,flipy,gfx; + + + sy = spriteram[offs + 0]; + sx = spriteram[offs + 3]; + + if ( (sy == 0) || + (sy == 0xff) || + ((sx < 0x40) && ( spriteram[offs + 2] & 0x10)) || + ((sx >= 0xc0) && (!(spriteram[offs + 2] & 0x10)))) continue; /* prevent wraparound */ + + + code = (spriteram[offs + 1] & 0x3f) | ((spriteram[offs + 2] & 0x60) << 1); + + if (spriteram[offs + 2] & 0x80) + { + /* 16x16 sprites */ + gfx = 1; + + if (!flip_screen) + { + sy = 240 - sy; + } + else + { + sx = 240 - sx; + } + } + else + { + /* 8x8 sprites */ + gfx = 0; + code <<= 2; + + if (!flip_screen) + { + sy = 248 - sy; + } + else + { + sx = 248 - sx; + } + } + + col = spriteram[offs + 2] & 0x0f; + flipx = spriteram[offs + 1] & 0x40; + flipy = spriteram[offs + 1] & 0x80; + + if (flip_screen) + { + flipx = !flipx; + flipy = !flipy; + } + + drawgfx(bitmap,machine->gfx[gfx], + code, col | ((*ambush_colorbank & 0x03) << 4), + flipx, flipy, + sx,sy, + cliprect,TRANSPARENCY_PEN,0); + } + + + /* Draw the foreground priority characters */ + draw_chars(machine, bitmap, cliprect, 0x10); + return 0; +} |