/*******************************************************************************
Raiders5 (c) 1985 Taito / UPL
Video hardware driver by Uki
02/Jun/2001 -
*******************************************************************************/
#include "driver.h"
UINT8 *raiders5_foreground_videoram;
UINT8 *raiders5_foreground_colorram;
UINT8 *raiders5_background_videoram;
UINT8 *raiders5_background_colorram;
UINT8 *raiders5_spriteram;
size_t raiders5_spriteram_size;
static UINT8 raiders5_scroll_x;
static UINT8 raiders5_scroll_y;
static UINT8 raiders5_flip_screen;
static tilemap *background_tilemap;
static tilemap *foreground_tilemap;
/*************************************
*
* Callbacks for the TileMap code
*
*************************************/
static TILE_GET_INFO( get_background_tile_info )
{
UINT8 bank = ((raiders5_background_colorram[tile_index] >> 1) & 0x01) + 3; /* ? */
UINT16 code = raiders5_background_videoram[tile_index] |
((raiders5_background_colorram[tile_index] & 0x01) << 8);
UINT8 color = raiders5_background_colorram[tile_index] >> 4;
SET_TILE_INFO(bank, code, color, 0);
}
static TILE_GET_INFO( get_foreground_tile_info )
{
UINT16 code = raiders5_foreground_videoram[tile_index];
UINT8 color = raiders5_foreground_colorram[tile_index] >> 4;
SET_TILE_INFO(2, code, color, 0);
}
/*************************************
*
* Video system start
*
*************************************/
VIDEO_START( raiders5 )
{
background_tilemap = tilemap_create(get_background_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32);
foreground_tilemap = tilemap_create(get_foreground_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32);
tilemap_set_scrolldx(background_tilemap, 7, 0);
tilemap_set_transparent_pen(foreground_tilemap, 0);
}
/*************************************
*
* Memory handlers
*
*************************************/
WRITE8_HANDLER( raiders5_scroll_x_w )
{
raiders5_scroll_x = data;
}
WRITE8_HANDLER( raiders5_scroll_y_w )
{
raiders5_scroll_y = data;
}
WRITE8_HANDLER( raiders5_flip_screen_w )
{
raiders5_flip_screen = data & 0x01;
tilemap_set_flip(ALL_TILEMAPS, (raiders5_flip_screen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0));
}
WRITE8_HANDLER( raiders5_foreground_videoram_w )
{
raiders5_foreground_videoram[offset] = data;
tilemap_mark_tile_dirty(foreground_tilemap, offset);
}
WRITE8_HANDLER( raiders5_foreground_colorram_w )
{
raiders5_foreground_colorram[offset] = data;
tilemap_mark_tile_dirty(foreground_tilemap, offset);
}
WRITE8_HANDLER( raiders5_background_videoram_w )
{
offs_t y = (offset + ((raiders5_scroll_y & 0xf8) << 2)) & 0x3e0;
offs_t x = (offset + (raiders5_scroll_x >> 3)) & 0x1f;
raiders5_background_videoram[y | x] = data;
tilemap_mark_tile_dirty(background_tilemap, y | x);
}
READ8_HANDLER( raiders5_background_videoram_r )
{
offs_t y = (offset + ((raiders5_scroll_y & 0xf8) << 2)) & 0x3e0;
offs_t x = (offset + (raiders5_scroll_x >> 3)) & 0x1f;
return raiders5_background_videoram[y | x];
}
WRITE8_HANDLER( raiders5_background_colorram_w )
{
offs_t y = (offset + ((raiders5_scroll_y & 0xf8) << 2)) & 0x3e0;
offs_t x = (offset + (raiders5_scroll_x >> 3)) & 0x1f;
raiders5_background_colorram[y | x] = data;
tilemap_mark_tile_dirty(background_tilemap, y | x);
}
READ8_HANDLER( raiders5_background_colorram_r )
{
offs_t y = (offset + ((raiders5_scroll_y & 0xf8) << 2)) & 0x3e0;
offs_t x = (offset + (raiders5_scroll_x >> 3)) & 0x1f;
return raiders5_background_colorram[y | x];
}
WRITE8_HANDLER( raiders5_paletteram_w )
{
paletteram_BBGGRRII_w(offset, data);
if (offset < 0x10)
{
if (offset != 1)
{
int i;
for (i = 0; i < 0x10; i++)
{
paletteram_BBGGRRII_w(offset + (i * 0x10) + 0x0200, data);
}
}
paletteram_BBGGRRII_w((offset * 0x10) + 0x0201, data);
}
}
/*************************************
*
* Video update
*
*************************************/
static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
{
offs_t offs;
for (offs = 0; offs < raiders5_spriteram_size; offs += 32)
{
UINT8 bank = (raiders5_spriteram[offs + 3] >> 1) & 0x01;
UINT8 code = ((raiders5_spriteram[offs + 3] << 6) & 0x40) | (raiders5_spriteram[offs + 0] >> 2);
UINT8 color = raiders5_spriteram[offs + 3] >> 4;
int flip_y = ((raiders5_spriteram[offs + 0] >> 1) & 0x01) ^ raiders5_flip_screen;
int flip_x = ((raiders5_spriteram[offs + 0] >> 0) & 0x01) ^ raiders5_flip_screen;
UINT8 y = raiders5_spriteram[offs + 2];
UINT8 x = raiders5_spriteram[offs + 1];
if (raiders5_flip_screen)
{
y = 240 - y;
x = 240 - x;
}
drawgfx(bitmap,machine->gfx[bank],
code, color, flip_x, flip_y,
x, y, cliprect, TRANSPARENCY_PEN, 0);
/* draw it wrapped around */
drawgfx(bitmap,machine->gfx[bank],
code, color, flip_x, flip_y,
x - 0x100, y, cliprect, TRANSPARENCY_PEN, 0);
}
}
VIDEO_UPDATE( raiders5 )
{
tilemap_set_scrolly(background_tilemap, 0, raiders5_scroll_y);
tilemap_set_scrollx(background_tilemap, 0, raiders5_scroll_x);
tilemap_draw(bitmap, cliprect, background_tilemap, 0, 0);
draw_sprites(machine, bitmap, cliprect);
tilemap_draw(bitmap, cliprect, foreground_tilemap, 0, 0);
return 0;
}