/***************************************************************************
Renegade Video Hardware
***************************************************************************/
#include "driver.h"
UINT8 *renegade_videoram2;
static INT32 renegade_scrollx;
static tilemap *bg_tilemap;
static tilemap *fg_tilemap;
WRITE8_HANDLER( renegade_videoram_w )
{
videoram[offset] = data;
offset = offset % (64 * 16);
tilemap_mark_tile_dirty(bg_tilemap, offset);
}
WRITE8_HANDLER( renegade_videoram2_w )
{
renegade_videoram2[offset] = data;
offset = offset % (32 * 32);
tilemap_mark_tile_dirty(fg_tilemap, offset);
}
WRITE8_HANDLER( renegade_flipscreen_w )
{
flip_screen_set(~data & 0x01);
}
WRITE8_HANDLER( renegade_scroll0_w )
{
renegade_scrollx = (renegade_scrollx & 0xff00) | data;
}
WRITE8_HANDLER( renegade_scroll1_w )
{
renegade_scrollx = (renegade_scrollx & 0xff) | (data << 8);
}
static TILE_GET_INFO( get_bg_tilemap_info )
{
const UINT8 *source = &videoram[tile_index];
UINT8 attributes = source[0x400]; /* CCC??BBB */
SET_TILE_INFO(
1 + (attributes & 0x7),
source[0],
attributes >> 5,
0);
}
static TILE_GET_INFO( get_fg_tilemap_info )
{
const UINT8 *source = &renegade_videoram2[tile_index];
UINT8 attributes = source[0x400];
SET_TILE_INFO(
0,
(attributes & 3) * 256 + source[0],
attributes >> 6,
0);
}
static void all_tiles_dirty(void)
{
tilemap_mark_all_tiles_dirty(bg_tilemap);
tilemap_mark_all_tiles_dirty(fg_tilemap);
}
VIDEO_START( renegade )
{
bg_tilemap = tilemap_create(get_bg_tilemap_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 16, 16, 64, 16);
fg_tilemap = tilemap_create(get_fg_tilemap_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8, 8, 32, 32);
tilemap_set_transparent_pen(fg_tilemap, 0);
tilemap_set_scrolldx(bg_tilemap, 256, 0);
state_save_register_global(renegade_scrollx);
state_save_register_func_postload(all_tiles_dirty);
}
static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
{
UINT8 *source = spriteram;
UINT8 *finish = source + 96 * 4;
while (source < finish)
{
int sy = 240 - source[0];
if (sy >= 16)
{
int attributes = source[1]; /* SFCCBBBB */
int sx = source[3];
int sprite_number = source[2];
int sprite_bank = 9 + (attributes & 0xf);
int color = (attributes >> 4) & 0x3;
int xflip = attributes & 0x40;
if (sx > 248)
sx -= 256;
if (flip_screen)
{
sx = 240 - sx;
sy = 240 - sy;
xflip = !xflip;
}
if (attributes & 0x80) /* big sprite */
{
sprite_number &= ~1;
drawgfx(bitmap, machine->gfx[sprite_bank],
sprite_number + 1,
color,
xflip, flip_screen,
sx, sy + (flip_screen ? -16 : 16),
cliprect, TRANSPARENCY_PEN, 0);
}
else
{
sy += (flip_screen ? -16 : 16);
}
drawgfx(bitmap, machine->gfx[sprite_bank],
sprite_number,
color,
xflip, flip_screen,
sx, sy,
cliprect, TRANSPARENCY_PEN, 0);
}
source += 4;
}
}
VIDEO_UPDATE( renegade )
{
tilemap_set_scrollx(bg_tilemap, 0, renegade_scrollx);
tilemap_draw(bitmap, cliprect, bg_tilemap, 0 , 0);
draw_sprites(machine, bitmap, cliprect);
tilemap_draw(bitmap, cliprect, fg_tilemap, 0 , 0);
return 0;
}