summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/sspeedr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/sspeedr.c')
-rw-r--r--src/mame/video/sspeedr.c274
1 files changed, 274 insertions, 0 deletions
diff --git a/src/mame/video/sspeedr.c b/src/mame/video/sspeedr.c
new file mode 100644
index 00000000000..f4c566bb8cf
--- /dev/null
+++ b/src/mame/video/sspeedr.c
@@ -0,0 +1,274 @@
+/***************************************************************************
+
+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;
+}