diff options
Diffstat (limited to 'src/mame/video/sspeedr.c')
-rw-r--r-- | src/mame/video/sspeedr.c | 274 |
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; +} |