/***************************************************************************
Taito Super Speed Race video emulation
***************************************************************************/
#include "driver.h"
static int toggle;
static unsigned driver_horz;
static unsigned driver_vert;
static unsigned driver_pic;
static unsigned drones_horz;
static unsigned drones_vert[3];
static unsigned drones_mask;
static unsigned track_horz;
static unsigned track_vert[2];
static unsigned track_ice;
WRITE8_HANDLER( sspeedr_driver_horz_w )
{
driver_horz = (driver_horz & 0x100) | data;
}
WRITE8_HANDLER( sspeedr_driver_horz_2_w )
{
driver_horz = (driver_horz & 0xff) | ((data & 1) << 8);
}
WRITE8_HANDLER( sspeedr_driver_vert_w )
{
driver_vert = data;
}
WRITE8_HANDLER( sspeedr_driver_pic_w )
{
driver_pic = data & 0x1f;
}
WRITE8_HANDLER( sspeedr_drones_horz_w )
{
drones_horz = (drones_horz & 0x100) | data;
}
WRITE8_HANDLER( sspeedr_drones_horz_2_w )
{
drones_horz = (drones_horz & 0xff) | ((data & 1) << 8);
}
WRITE8_HANDLER( sspeedr_drones_mask_w )
{
drones_mask = data & 0x3f;
}
WRITE8_HANDLER( sspeedr_drones_vert_w )
{
drones_vert[offset] = data;
}
WRITE8_HANDLER( sspeedr_track_horz_w )
{
track_horz = (track_horz & 0x100) | data;
}
WRITE8_HANDLER( sspeedr_track_horz_2_w )
{
track_horz = (track_horz & 0xff) | ((data & 1) << 8);
}
WRITE8_HANDLER( sspeedr_track_vert_w )
{
track_vert[offset] = data & 0x7f;
}
WRITE8_HANDLER( sspeedr_track_ice_w )
{
track_ice = data & 0x07;
}
static void draw_track(mame_bitmap* bitmap)
{
const UINT8* p = memory_region(REGION_GFX3);
int x;
int y;
for (x = 0; x < 376; x++)
{
unsigned counter_x = x + track_horz + 0x50;
int flag = 0;
if (track_ice & 2)
{
flag = 1;
}
else if (track_ice & 4)
{
if (track_ice & 1)
{
flag = (counter_x <= 0x1ff);
}
else
{
flag = (counter_x >= 0x200);
}
}
if (counter_x >= 0x200)
{
counter_x -= 0x1c8;
}
y = 0;
/* upper landscape */
for (; y < track_vert[0]; y++)
{
unsigned counter_y = y - track_vert[0];
int offset =
((counter_y & 0x1f) << 3) |
((counter_x & 0x1c) >> 2) |
((counter_x & 0xe0) << 3);
if (counter_x & 2)
{
*BITMAP_ADDR16(bitmap, y, x) = p[offset] / 16;
}
else
{
*BITMAP_ADDR16(bitmap, y, x) = p[offset] % 16;
}
}
/* street */
for (; y < 128 + track_vert[1]; y++)
{
*BITMAP_ADDR16(bitmap, y, x) = flag ? 15 : 0;
}
/* lower landscape */
for (; y < 248; y++)
{
unsigned counter_y = y - track_vert[1];
int offset =
((counter_y & 0x1f) << 3) |
((counter_x & 0x1c) >> 2) |
((counter_x & 0xe0) << 3);
if (counter_x & 2)
{
*BITMAP_ADDR16(bitmap, y, x) = p[offset] / 16;
}
else
{
*BITMAP_ADDR16(bitmap, y, x) = p[offset] % 16;
}
}
}
}
static void draw_drones(running_machine *machine, mame_bitmap* bitmap, const rectangle* cliprect)
{
static const UINT8 code[6] =
{
0xf, 0x4, 0x3, 0x9, 0x7, 0xc
};
int i;
for (i = 0; i < 6; i++)
{
int x;
int y;
if ((drones_mask >> i) & 1)
{
continue;
}
x = (code[i] << 5) - drones_horz - 0x50;
if (x <= -32)
{
x += 0x1c8;
}
y = 0xf0 - drones_vert[i >> 1];
drawgfx(bitmap, machine->gfx[1],
code[i] ^ toggle,
0,
0, 0,
x,
y,
cliprect,
TRANSPARENCY_PEN, 0);
}
}
static void draw_driver(running_machine *machine, mame_bitmap* bitmap, const rectangle* cliprect)
{
int x;
int y;
if (!(driver_pic & 0x10))
{
return;
}
x = 0x1e0 - driver_horz - 0x50;
if (x <= -32)
{
x += 0x1c8;
}
y = 0xf0 - driver_vert;
drawgfx(bitmap, machine->gfx[0],
driver_pic,
0,
0, 0,
x,
y,
cliprect,
TRANSPARENCY_PEN, 0);
}
VIDEO_START( sspeedr )
{
toggle = 0;
}
VIDEO_UPDATE( sspeedr )
{
draw_track(bitmap);
draw_drones(machine, bitmap, cliprect);
draw_driver(machine, bitmap, cliprect);
return 0;
}
VIDEO_EOF( sspeedr )
{
toggle ^= 1;
}