summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/cclimber.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/cclimber.c')
-rw-r--r--src/mame/video/cclimber.c935
1 files changed, 935 insertions, 0 deletions
diff --git a/src/mame/video/cclimber.c b/src/mame/video/cclimber.c
new file mode 100644
index 00000000000..1475456b880
--- /dev/null
+++ b/src/mame/video/cclimber.c
@@ -0,0 +1,935 @@
+/***************************************************************************
+
+ video.c
+
+ Functions to emulate the video hardware of the machine.
+
+***************************************************************************/
+
+#include "driver.h"
+#include "includes/cclimber.h"
+
+
+UINT8 *cclimber_bsvideoram;
+size_t cclimber_bsvideoram_size;
+UINT8 *cclimber_bigspriteram;
+UINT8 *cclimber_column_scroll;
+static int palettebank;
+static int sidepanel_enabled;
+
+
+/***************************************************************************
+
+ Convert the color PROMs into a more useable format.
+
+ Crazy Climber has three 32x8 palette PROMs.
+ The palette PROMs are connected to the RGB output this way:
+
+ bit 7 -- 220 ohm resistor -- BLUE
+ -- 470 ohm resistor -- BLUE
+ -- 220 ohm resistor -- GREEN
+ -- 470 ohm resistor -- GREEN
+ -- 1 kohm resistor -- GREEN
+ -- 220 ohm resistor -- RED
+ -- 470 ohm resistor -- RED
+ bit 0 -- 1 kohm resistor -- RED
+
+***************************************************************************/
+PALETTE_INIT( cclimber )
+{
+ int i;
+ #define TOTAL_COLORS(gfxn) (machine->gfx[gfxn]->total_colors * machine->gfx[gfxn]->color_granularity)
+ #define COLOR(gfxn,offs) (colortable[machine->drv->gfxdecodeinfo[gfxn].color_codes_start + (offs)])
+
+
+ for (i = 0;i < machine->drv->total_colors;i++)
+ {
+ int bit0,bit1,bit2,r,g,b;
+
+
+ /* red component */
+ bit0 = (*color_prom >> 0) & 0x01;
+ bit1 = (*color_prom >> 1) & 0x01;
+ bit2 = (*color_prom >> 2) & 0x01;
+ r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+ /* green component */
+ bit0 = (*color_prom >> 3) & 0x01;
+ bit1 = (*color_prom >> 4) & 0x01;
+ bit2 = (*color_prom >> 5) & 0x01;
+ g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+ /* blue component */
+ bit0 = 0;
+ bit1 = (*color_prom >> 6) & 0x01;
+ bit2 = (*color_prom >> 7) & 0x01;
+ b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+
+ palette_set_color(machine,i,MAKE_RGB(r,g,b));
+ color_prom++;
+ }
+
+
+ /* character and sprite lookup table */
+ /* they use colors 0-63 */
+ for (i = 0;i < TOTAL_COLORS(0);i++)
+ {
+ /* pen 0 always uses color 0 (background in River Patrol and Silver Land) */
+ if (i % 4 == 0) COLOR(0,i) = 0;
+ else COLOR(0,i) = i;
+ }
+
+ /* big sprite lookup table */
+ /* it uses colors 64-95 */
+ for (i = 0;i < TOTAL_COLORS(2);i++)
+ {
+ if (i % 4 == 0) COLOR(2,i) = 0;
+ else COLOR(2,i) = i + 64;
+ }
+}
+
+
+/***************************************************************************
+
+ Convert the color PROMs into a more useable format.
+
+ Swimmer has two 256x4 char/sprite palette PROMs and one 32x8 big sprite
+ palette PROM.
+ The palette PROMs are connected to the RGB output this way:
+ (the 500 and 250 ohm resistors are made of 1 kohm resistors in parallel)
+
+ bit 3 -- 250 ohm resistor -- BLUE
+ -- 500 ohm resistor -- BLUE
+ -- 250 ohm resistor -- GREEN
+ bit 0 -- 500 ohm resistor -- GREEN
+ bit 3 -- 1 kohm resistor -- GREEN
+ -- 250 ohm resistor -- RED
+ -- 500 ohm resistor -- RED
+ bit 0 -- 1 kohm resistor -- RED
+
+ bit 7 -- 250 ohm resistor -- BLUE
+ -- 500 ohm resistor -- BLUE
+ -- 250 ohm resistor -- GREEN
+ -- 500 ohm resistor -- GREEN
+ -- 1 kohm resistor -- GREEN
+ -- 250 ohm resistor -- RED
+ -- 500 ohm resistor -- RED
+ bit 0 -- 1 kohm resistor -- RED
+
+ Additionally, the background color of the score panel is determined by
+ these resistors:
+
+ /--- tri-state -- 470 -- BLUE
+ +5V -- 1kohm ------- tri-state -- 390 -- GREEN
+ \--- tri-state -- 1000 -- RED
+
+***************************************************************************/
+
+#define BGPEN (256+32)
+#define SIDEPEN (256+32+1)
+
+PALETTE_INIT( swimmer )
+{
+ int i;
+ #define TOTAL_COLORS(gfxn) (machine->gfx[gfxn]->total_colors * machine->gfx[gfxn]->color_granularity)
+ #define COLOR(gfxn,offs) (colortable[machine->drv->gfxdecodeinfo[gfxn].color_codes_start + (offs)])
+
+
+ for (i = 0;i < 256;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 = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2;
+ /* green component */
+ bit0 = (color_prom[i] >> 3) & 0x01;
+ bit1 = (color_prom[i+256] >> 0) & 0x01;
+ bit2 = (color_prom[i+256] >> 1) & 0x01;
+ g = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2;
+ /* blue component */
+ bit0 = 0;
+ bit1 = (color_prom[i+256] >> 2) & 0x01;
+ bit2 = (color_prom[i+256] >> 3) & 0x01;
+ b = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2;
+
+ palette_set_color(machine,i,MAKE_RGB(r,g,b));
+
+ /* side panel */
+ if (i % 8)
+ {
+ COLOR(0,i) = i;
+ COLOR(0,i+256) = i;
+ }
+ else
+ {
+ /* background */
+ COLOR(0,i) = BGPEN;
+ COLOR(0,i+256) = SIDEPEN;
+ }
+ }
+
+ color_prom += 2 * 256;
+
+ /* big sprite */
+ for (i = 0;i < 32;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 = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2;
+ /* green component */
+ bit0 = (color_prom[i] >> 3) & 0x01;
+ bit1 = (color_prom[i] >> 4) & 0x01;
+ bit2 = (color_prom[i] >> 5) & 0x01;
+ g = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2;
+ /* blue component */
+ bit0 = 0;
+ bit1 = (color_prom[i] >> 6) & 0x01;
+ bit2 = (color_prom[i] >> 7) & 0x01;
+ b = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2;
+
+ palette_set_color(machine,i+256,MAKE_RGB(r,g,b));
+
+ if (i % 8 == 0) COLOR(2,i) = BGPEN; /* enforce transparency */
+ else COLOR(2,i) = i+256;
+ }
+
+ /* background */
+ palette_set_color(machine,BGPEN,MAKE_RGB(0,0,0));
+ /* side panel background color */
+#if 0
+ // values calculated from the resistors don't seem to match the real board
+ palette_set_color(machine,SIDEPEN,MAKE_RGB(0x24,0x5d,0x4e));
+#endif
+ palette_set_color(machine,SIDEPEN,MAKE_RGB(0x20,0x98,0x79));
+}
+
+
+
+/***************************************************************************
+
+ Swimmer can directly set the background color.
+ The latch is connected to the RGB output this way:
+ (the 500 and 250 ohm resistors are made of 1 kohm resistors in parallel)
+
+ bit 7 -- 250 ohm resistor -- RED
+ -- 500 ohm resistor -- RED
+ -- 250 ohm resistor -- GREEN
+ -- 500 ohm resistor -- GREEN
+ -- 1 kohm resistor -- GREEN
+ -- 250 ohm resistor -- BLUE
+ -- 500 ohm resistor -- BLUE
+ bit 0 -- 1 kohm resistor -- BLUE
+
+***************************************************************************/
+WRITE8_HANDLER( swimmer_bgcolor_w )
+{
+ int bit0,bit1,bit2;
+ int r,g,b;
+
+
+ /* red component */
+ bit0 = 0;
+ bit1 = (data >> 6) & 0x01;
+ bit2 = (data >> 7) & 0x01;
+ r = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2;
+
+ /* green component */
+ bit0 = (data >> 3) & 0x01;
+ bit1 = (data >> 4) & 0x01;
+ bit2 = (data >> 5) & 0x01;
+ g = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2;
+
+ /* blue component */
+ bit0 = (data >> 0) & 0x01;
+ bit1 = (data >> 1) & 0x01;
+ bit2 = (data >> 2) & 0x01;
+ b = 0x20 * bit0 + 0x40 * bit1 + 0x80 * bit2;
+
+ palette_set_color(Machine,BGPEN,MAKE_RGB(r,g,b));
+}
+
+
+
+WRITE8_HANDLER( cclimber_colorram_w )
+{
+ /* bit 5 of the address is not used for color memory. There is just */
+ /* 512 bytes of memory; every two consecutive rows share the same memory */
+ /* region. */
+ offset &= 0xffdf;
+
+ colorram[offset] = data;
+ colorram[offset + 0x20] = data;
+}
+
+
+
+WRITE8_HANDLER( cclimber_bigsprite_videoram_w )
+{
+ cclimber_bsvideoram[offset] = data;
+}
+
+
+
+WRITE8_HANDLER( swimmer_palettebank_w )
+{
+ palettebank = data & 1;
+}
+
+
+
+WRITE8_HANDLER( swimmer_sidepanel_enable_w )
+{
+ sidepanel_enabled = data & 1;
+}
+
+
+
+static void cclimber_draw_big_sprite(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
+{
+ int offs;
+ int ox,oy,sx,sy,flipx,flipy;
+ int color;
+
+
+ ox = 136 - cclimber_bigspriteram[3];
+ oy = 128 - cclimber_bigspriteram[2];
+ flipx = cclimber_bigspriteram[1] & 0x10;
+ flipy = cclimber_bigspriteram[1] & 0x20;
+ if (flip_screen_y) /* only the Y direction has to be flipped */
+ {
+ oy = 128 - oy;
+ flipy = !flipy;
+ }
+ color = cclimber_bigspriteram[1] & 0x07; /* cclimber */
+// color = cclimber_bigspriteram[1] & 0x03; /* swimmer */
+
+ for (offs = cclimber_bsvideoram_size - 1;offs >= 0;offs--)
+ {
+ sx = offs % 16;
+ sy = offs / 16;
+ if (flipx) sx = 15 - sx;
+ if (flipy) sy = 15 - sy;
+
+ drawgfx(bitmap,machine->gfx[2],
+// cclimber_bsvideoram[offs], /* cclimber */
+ cclimber_bsvideoram[offs] + ((cclimber_bigspriteram[1] & 0x08) << 5), /* swimmer */
+ color,
+ flipx,flipy,
+ (ox+8*sx) & 0xff,(oy+8*sy) & 0xff,
+ cliprect,TRANSPARENCY_PEN,0);
+
+ /* wraparound */
+ drawgfx(bitmap,machine->gfx[2],
+// cclimber_bsvideoram[offs], /* cclimber */
+ cclimber_bsvideoram[offs] + ((cclimber_bigspriteram[1] & 0x08) << 5), /* swimmer */
+ color,
+ flipx,flipy,
+ ((ox+8*sx) & 0xff) - 256,(oy+8*sy) & 0xff,
+ cliprect,TRANSPARENCY_PEN,0);
+ }
+}
+
+
+VIDEO_UPDATE( cclimber )
+{
+ int offs;
+
+ for (offs = videoram_size - 1;offs >= 0;offs--)
+ {
+ int sx,sy,flipx,flipy;
+
+ sx = offs % 32;
+ sy = offs / 32;
+ flipx = colorram[offs] & 0x40;
+ flipy = colorram[offs] & 0x80;
+ /* vertical flipping flips two adjacent characters */
+ if (flipy) sy ^= 1;
+
+ if (flip_screen_x)
+ {
+ sx = 31 - sx;
+ flipx = !flipx;
+ }
+ if (flip_screen_y)
+ {
+ sy = 31 - sy;
+ flipy = !flipy;
+ }
+
+ drawgfx(tmpbitmap,machine->gfx[(colorram[offs] & 0x10) ? 1 : 0],
+ videoram[offs] + 8 * (colorram[offs] & 0x20),
+ colorram[offs] & 0x0f,
+ flipx,flipy,
+ 8*sx,8*sy,
+ 0,TRANSPARENCY_NONE,0);
+ }
+
+
+ /* copy the temporary bitmap to the screen */
+ {
+ int scroll[32];
+
+
+ if (flip_screen_x)
+ {
+ for (offs = 0;offs < 32;offs++)
+ {
+ scroll[offs] = -cclimber_column_scroll[31 - offs];
+ if (flip_screen_y) scroll[offs] = -scroll[offs];
+ }
+ }
+ else
+ {
+ for (offs = 0;offs < 32;offs++)
+ {
+ scroll[offs] = -cclimber_column_scroll[offs];
+ if (flip_screen_y) scroll[offs] = -scroll[offs];
+ }
+ }
+
+ copyscrollbitmap(bitmap,tmpbitmap,0,0,32,scroll,cliprect,TRANSPARENCY_NONE,0);
+ }
+
+
+ if (cclimber_bigspriteram[0] & 1)
+ /* draw the "big sprite" below sprites */
+ cclimber_draw_big_sprite(machine, bitmap, cliprect);
+
+
+ /* Draw the sprites. Note that it is important to draw them exactly in this */
+ /* order, to have the correct priorities. */
+ for (offs = spriteram_size - 4;offs >= 0;offs -= 4)
+ {
+ int sx,sy,flipx,flipy;
+
+
+ sx = spriteram[offs + 3];
+ sy = 240 - spriteram[offs + 2];
+ flipx = spriteram[offs] & 0x40;
+ flipy = spriteram[offs] & 0x80;
+ if (flip_screen_x)
+ {
+ sx = 240 - sx;
+ flipx = !flipx;
+ }
+ if (flip_screen_y)
+ {
+ sy = 240 - sy;
+ flipy = !flipy;
+ }
+
+ drawgfx(bitmap,machine->gfx[spriteram[offs + 1] & 0x10 ? 4 : 3],
+ (spriteram[offs] & 0x3f) + 2 * (spriteram[offs + 1] & 0x20),
+ spriteram[offs + 1] & 0x0f,
+ flipx,flipy,
+ sx,sy,
+ cliprect,TRANSPARENCY_PEN,0);
+ }
+
+
+ if ((cclimber_bigspriteram[0] & 1) == 0)
+ /* draw the "big sprite" over sprites */
+ cclimber_draw_big_sprite(machine, bitmap, cliprect);
+ return 0;
+}
+
+
+VIDEO_UPDATE( cannonb )
+{
+ int offs;
+
+ for (offs = videoram_size - 1;offs >= 0;offs--)
+ {
+ int attr,code,color,sx,sy,flipx,flipy;
+
+ code = videoram[offs];
+ attr = colorram[offs] & 0x20;
+ color = colorram[offs] & 0x0f;
+ sx = offs % 32;
+ sy = offs / 32;
+ flipx = colorram[offs] & 0x40;
+ flipy = colorram[offs] & 0x80;
+ /* vertical flipping flips two adjacent characters */
+ if (flipy) sy ^= 1;
+
+ if (flip_screen_x)
+ {
+ sx = 31 - sx;
+ flipx = !flipx;
+ }
+ if (flip_screen_y)
+ {
+ sy = 31 - sy;
+ flipy = !flipy;
+ }
+
+ drawgfx(tmpbitmap,machine->gfx[0],
+ code + 8 * attr,
+ color,
+ flipx,flipy,
+ 8*sx,8*sy,
+ 0,TRANSPARENCY_NONE,0);
+ }
+
+
+ /* copy the temporary bitmap to the screen */
+ {
+ int scroll[32];
+
+
+ if (flip_screen_x)
+ {
+ for (offs = 0;offs < 32;offs++)
+ {
+ scroll[offs] = -cclimber_column_scroll[31 - offs];
+ if (flip_screen_y) scroll[offs] = -scroll[offs];
+ }
+ }
+ else
+ {
+ for (offs = 0;offs < 32;offs++)
+ {
+ scroll[offs] = -cclimber_column_scroll[offs];
+ if (flip_screen_y) scroll[offs] = -scroll[offs];
+ }
+ }
+
+ copyscrollbitmap(bitmap,tmpbitmap,0,0,32,scroll,cliprect,TRANSPARENCY_NONE,0);
+ }
+
+
+ if (cclimber_bigspriteram[0] & 1)
+ /* draw the "big sprite" below sprites */
+ cclimber_draw_big_sprite(machine, bitmap, cliprect);
+
+
+ /* Draw the sprites. Note that it is important to draw them exactly in this */
+ /* order, to have the correct priorities. */
+ for (offs = spriteram_size - 4;offs >= 0;offs -= 4)
+ {
+ int code,color,sx,sy,flipx,flipy;
+
+ code = spriteram[offs] & 0x3f;
+ color = spriteram[offs + 1] & 0x0f;
+ sx = spriteram[offs + 3];
+ sy = 240 - spriteram[offs + 2];
+ flipx = spriteram[offs] & 0x40;
+ flipy = spriteram[offs] & 0x80;
+ if (flip_screen_x)
+ {
+ sx = 240 - sx;
+ flipx = !flipx;
+ }
+ if (flip_screen_y)
+ {
+ sy = 240 - sy;
+ flipy = !flipy;
+ }
+
+ drawgfx(bitmap,machine->gfx[3],
+ code + 0x40,
+ color,
+ flipx,flipy,
+ sx,sy,
+ cliprect,TRANSPARENCY_PEN,0);
+ }
+
+ if ((cclimber_bigspriteram[0] & 1) == 0)
+ /* draw the "big sprite" over sprites */
+ cclimber_draw_big_sprite(machine, bitmap, cliprect);
+ return 0;
+}
+
+
+VIDEO_UPDATE( swimmer )
+{
+ int offs;
+
+ for (offs = videoram_size - 1;offs >= 0;offs--)
+ {
+ int sx,sy,flipx,flipy,color;
+
+ sx = offs % 32;
+ sy = offs / 32;
+ flipx = colorram[offs] & 0x40;
+ flipy = colorram[offs] & 0x80;
+ /* vertical flipping flips two adjacent characters */
+ if (flipy) sy ^= 1;
+
+ color = (colorram[offs] & 0x0f) + 0x10 * palettebank;
+ if (sx >= 24 && sidepanel_enabled)
+ {
+ color += 32;
+ }
+
+ if (flip_screen_x)
+ {
+ sx = 31 - sx;
+ flipx = !flipx;
+ }
+ if (flip_screen_y)
+ {
+ sy = 31 - sy;
+ flipy = !flipy;
+ }
+
+ drawgfx(tmpbitmap,machine->gfx[0],
+ videoram[offs] + ((colorram[offs] & 0x10) << 4),
+ color,
+ flipx,flipy,
+ 8*sx,8*sy,
+ 0,TRANSPARENCY_NONE,0);
+ }
+
+
+ /* copy the temporary bitmap to the screen */
+ {
+ int scroll[32];
+
+
+ if (flip_screen_y)
+ {
+ for (offs = 0;offs < 32;offs++)
+ scroll[offs] = cclimber_column_scroll[31 - offs];
+ }
+ else
+ {
+ for (offs = 0;offs < 32;offs++)
+ scroll[offs] = -cclimber_column_scroll[offs];
+ }
+
+ copyscrollbitmap(bitmap,tmpbitmap,0,0,32,scroll,cliprect,TRANSPARENCY_NONE,0);
+ }
+
+
+ if (cclimber_bigspriteram[0] & 1)
+ /* draw the "big sprite" below sprites */
+ cclimber_draw_big_sprite(machine, bitmap, cliprect);
+
+
+ /* Draw the sprites. Note that it is important to draw them exactly in this */
+ /* order, to have the correct priorities. */
+ for (offs = spriteram_size - 4;offs >= 0;offs -= 4)
+ {
+ int sx,sy,flipx,flipy;
+
+
+ sx = spriteram[offs + 3];
+ sy = 240 - spriteram[offs + 2];
+ flipx = spriteram[offs] & 0x40;
+ flipy = spriteram[offs] & 0x80;
+ if (flip_screen_x)
+ {
+ sx = 240 - sx;
+ flipx = !flipx;
+ }
+ if (flip_screen_y)
+ {
+ sy = 240 - sy;
+ flipy = !flipy;
+ }
+
+ drawgfx(bitmap,machine->gfx[1],
+ (spriteram[offs] & 0x3f) | (spriteram[offs + 1] & 0x10) << 2,
+ (spriteram[offs + 1] & 0x0f) + 0x10 * palettebank,
+ flipx,flipy,
+ sx,sy,
+ cliprect,TRANSPARENCY_PEN,0);
+ }
+
+
+ if ((cclimber_bigspriteram[0] & 1) == 0)
+ /* draw the "big sprite" over sprites */
+ cclimber_draw_big_sprite(machine, bitmap, cliprect);
+ return 0;
+}
+
+VIDEO_UPDATE( yamato )
+{
+ int offs;
+ int i,j;
+
+ /* bg gradient */
+ fillbitmap(bitmap, 0, cliprect);
+
+ for(i=8;i<256;i++)
+ {
+ pen_t pen = 16*4+8*4 + memory_region(REGION_USER1)[(flip_screen_x?0x1280:0x1200)+(i>>1)];
+
+ for(j=0;j<256;j++)
+ {
+ *BITMAP_ADDR16(bitmap, j, i-8) = pen;
+ }
+ }
+
+
+ for (offs = videoram_size - 1;offs >= 0;offs--)
+ {
+ int sx,sy,flipx,flipy;
+
+ sx = offs % 32;
+ sy = offs / 32;
+ flipx = colorram[offs] & 0x40;
+ flipy = colorram[offs] & 0x80;
+ /* vertical flipping flips two adjacent characters */
+ if (flipy) sy ^= 1;
+
+ if (flip_screen_x)
+ {
+ sx = 31 - sx;
+ flipx = !flipx;
+ }
+ if (flip_screen_y)
+ {
+ sy = 31 - sy;
+ flipy = !flipy;
+ }
+
+ drawgfx(tmpbitmap,machine->gfx[(colorram[offs] & 0x10) ? 1 : 0],
+ videoram[offs] + 8 * (colorram[offs] & 0x20),
+ colorram[offs] & 0x0f,
+ flipx,flipy,
+ 8*sx,8*sy,
+ 0,TRANSPARENCY_NONE,0);
+ }
+
+
+ /* copy the temporary bitmap to the screen */
+ {
+ int scroll[32];
+
+
+ if (flip_screen_x)
+ {
+ for (offs = 0;offs < 32;offs++)
+ {
+ scroll[offs] = -cclimber_column_scroll[31 - offs];
+ if (flip_screen_y) scroll[offs] = -scroll[offs];
+ }
+ }
+ else
+ {
+ for (offs = 0;offs < 32;offs++)
+ {
+ scroll[offs] = -cclimber_column_scroll[offs];
+ if (flip_screen_y) scroll[offs] = -scroll[offs];
+ }
+ }
+
+ copyscrollbitmap(bitmap,tmpbitmap,0,0,32,scroll,cliprect,TRANSPARENCY_PEN,0);
+ }
+
+
+ if (cclimber_bigspriteram[0] & 1)
+ /* draw the "big sprite" below sprites */
+ cclimber_draw_big_sprite(machine, bitmap, cliprect);
+
+
+ /* Draw the sprites. Note that it is important to draw them exactly in this */
+ /* order, to have the correct priorities. */
+ for (offs = spriteram_size - 4;offs >= 0;offs -= 4)
+ {
+ int sx,sy,flipx,flipy;
+
+
+ sx = spriteram[offs + 3];
+ sy = 240 - spriteram[offs + 2];
+ flipx = spriteram[offs] & 0x40;
+ flipy = spriteram[offs] & 0x80;
+ if (flip_screen_x)
+ {
+ sx = 240 - sx;
+ flipx = !flipx;
+ }
+ if (flip_screen_y)
+ {
+ sy = 240 - sy;
+ flipy = !flipy;
+ }
+
+ drawgfx(bitmap,machine->gfx[spriteram[offs + 1] & 0x10 ? 4 : 3],
+ (spriteram[offs] & 0x3f) + 2 * (spriteram[offs + 1] & 0x20),
+ spriteram[offs + 1] & 0x0f,
+ flipx,flipy,
+ sx,sy,
+ cliprect,TRANSPARENCY_PEN,0);
+ }
+
+
+ if ((cclimber_bigspriteram[0] & 1) == 0)
+ /* draw the "big sprite" over sprites */
+ cclimber_draw_big_sprite(machine, bitmap, cliprect);
+ return 0;
+}
+
+
+/* Top Roller */
+
+#define PRIORITY_OVER 0x20
+#define PRIORITY_UNDER 0x00
+#define PRIORITY_MASK 0x20
+
+static tilemap *bg_tilemap;
+
+UINT8 *toprollr_videoram2;
+UINT8 *toprollr_videoram3;
+UINT8 *toprollr_videoram4;
+
+
+static TILE_GET_INFO( get_tile_info_bg )
+{
+ int code = toprollr_videoram3[tile_index];
+ int attr = toprollr_videoram4[tile_index];
+ int flipx,flipy,bank,palette;
+
+ bank=(attr&0x40)<<2;
+
+
+
+
+
+ flipx=1;
+ flipy=0;
+
+ code+=bank;
+
+ palette=(attr&0xf)+0x18 ;
+
+ SET_TILE_INFO(1, code, palette, (flipx?TILE_FLIPX:0)|(flipy?TILE_FLIPY:0));
+}
+
+VIDEO_START( toprollr )
+{
+ bg_tilemap = tilemap_create(get_tile_info_bg,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32);
+}
+
+static void toprollr_draw_big_sprite(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect,int priority)
+{
+ if((cclimber_bigspriteram[1]&PRIORITY_MASK)==priority)
+ {
+ int code,xs,ys,palette,bank,x,y;
+ int flipx=0;
+ int flipy=0;
+
+ xs=136-cclimber_bigspriteram[3];
+ ys=128-cclimber_bigspriteram[2];
+
+
+ if(xs==0)
+ {
+ return;
+ }
+
+ if (flip_screen_x)
+ {
+ flipx^=1;
+ }
+
+ palette=cclimber_bigspriteram[1]&0x7;
+
+ bank=(cclimber_bigspriteram[1]>>3)&3;
+
+
+ for(y=0;y<16;y++)
+ for(x=0;x<16;x++)
+ {
+ int sx=x;
+ int sy=y;
+ if (flipx) sx = 15 - x;
+ if (flipy) sy = 15 - y;
+
+ code=cclimber_bsvideoram[y*16+x]+bank*256;
+
+ drawgfx(bitmap, machine->gfx[3], code, palette, flipx, flipy,(sx*8+xs)&0xff,(sy*8+ys)&0xff, cliprect, TRANSPARENCY_PEN, 0);
+ drawgfx(bitmap, machine->gfx[3], code, palette, flipx, flipy,((sx*8+xs)&0xff)-256,((sy*8+ys)&0xff)-256, cliprect, TRANSPARENCY_PEN, 0);
+ }
+ }
+}
+
+VIDEO_UPDATE( toprollr )
+{
+
+ UINT32 x,y;
+ int offs;
+ rectangle myclip=*cliprect;
+ myclip.min_x=4*8;
+ myclip.max_x=29*8-1;
+
+ fillbitmap(bitmap, 0, cliprect);
+
+ tilemap_set_scrollx(bg_tilemap,0,toprollr_videoram3[0]+8);
+ tilemap_mark_all_tiles_dirty(bg_tilemap);
+ tilemap_draw(bitmap, &myclip,bg_tilemap,0,0);
+
+ toprollr_draw_big_sprite(machine, bitmap, &myclip, PRIORITY_UNDER);
+
+ for (offs = spriteram_size - 4;offs >= 0;offs -= 4)
+ {
+ int sx,sy,flipx,flipy,palette;
+
+ sx = spriteram[offs + 3]-8;
+ sy = 240 - spriteram[offs + 2];
+ flipx = spriteram[offs] & 0x40;
+ flipy = spriteram[offs] & 0x80;
+ if (flip_screen_x)
+ {
+ sx = 240 - sx;
+ flipx = !flipx;
+ }
+ if (flip_screen_y)
+ {
+ sy = 240 - sy;
+ flipy = !flipy;
+ }
+
+ palette=0x08+(spriteram[offs + 1] & 0x0f);
+
+ drawgfx(bitmap,machine->gfx[2],
+ (spriteram[offs] & 0x3f) + 2 * (spriteram[offs + 1] & 0x20)+8*(spriteram[offs + 1] & 0x10),
+ palette,
+ flipx,flipy,
+ sx,sy,
+ &myclip,TRANSPARENCY_PEN,0);
+ }
+
+ toprollr_draw_big_sprite(machine, bitmap, &myclip, PRIORITY_OVER);
+
+ for(y=0;y<32;y++)
+ for(x=0;x<32;x++)
+ {
+ int sx=x*8;
+ int sy=y*8;
+ int flipx=0;
+ int flipy=0;
+
+ int code=videoram[y*32+x];
+ int attr=(x>16)?(toprollr_videoram2[(y&0xfe)*32+x]):(toprollr_videoram2[y*32+x]);
+ int palette;
+
+ if (flip_screen_x)
+ {
+ sx = 240 - sx;
+ flipx^=1;
+ }
+ if (flip_screen_y)
+ {
+ sy = 240 - sy;
+ flipy^=1;
+ }
+
+ palette=8+(attr&0xf);
+ drawgfx(bitmap, machine->gfx[0], code+((attr&0xf0)<<4),palette, flipx, flipy, sx, sy, cliprect, TRANSPARENCY_PEN, 0);
+
+ }
+ return 0;
+}
+
+
+