/***************************************************************************
Atari Sprint 8 video emulation
***************************************************************************/
#include "driver.h"
#include "includes/sprint8.h"
UINT8* sprint8_video_ram;
UINT8* sprint8_pos_h_ram;
UINT8* sprint8_pos_v_ram;
UINT8* sprint8_pos_d_ram;
static tilemap* tilemap1;
static tilemap* tilemap2;
static mame_bitmap* helper1;
static mame_bitmap* helper2;
static TILE_GET_INFO( get_tile_info1 )
{
UINT8 code = sprint8_video_ram[tile_index];
int color = 0;
if ((code & 0x30) != 0x30) /* ? */
{
color = 17;
}
else
{
if ((tile_index + 1) & 0x010)
{
color |= 1;
}
if (code & 0x80)
{
color |= 2;
}
if (tile_index & 0x200)
{
color |= 4;
}
}
SET_TILE_INFO(code >> 7, code, color, (code & 0x40) ? (TILE_FLIPX | TILE_FLIPY) : 0);
}
static TILE_GET_INFO( get_tile_info2 )
{
UINT8 code = sprint8_video_ram[tile_index];
int color = 0;
if ((code & 0x38) != 0x28)
{
color = 16;
}
else
{
color = 17;
}
SET_TILE_INFO(code >> 7, code, color, (code & 0x40) ? (TILE_FLIPX | TILE_FLIPY) : 0);
}
WRITE8_HANDLER( sprint8_video_ram_w )
{
sprint8_video_ram[offset] = data;
tilemap_mark_tile_dirty(tilemap1, offset);
tilemap_mark_tile_dirty(tilemap2, offset);
}
VIDEO_START( sprint8 )
{
helper1 = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, machine->screen[0].format);
helper2 = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, machine->screen[0].format);
tilemap1 = tilemap_create(get_tile_info1, tilemap_scan_rows, TILEMAP_TYPE_PEN, 16, 8, 32, 32);
tilemap2 = tilemap_create(get_tile_info2, tilemap_scan_rows, TILEMAP_TYPE_PEN, 16, 8, 32, 32);
tilemap_set_scrolly(tilemap1, 0, +24);
tilemap_set_scrolly(tilemap2, 0, +24);
}
static void draw_sprites(running_machine *machine, mame_bitmap* bitmap, const rectangle *cliprect)
{
int i;
for (i = 0; i < 16; i++)
{
UINT8 code = sprint8_pos_d_ram[i];
int x = sprint8_pos_h_ram[i];
int y = sprint8_pos_v_ram[i];
if (code & 0x80)
{
x |= 0x100;
}
drawgfx(bitmap, machine->gfx[2],
code ^ 7,
i,
!(code & 0x10), !(code & 0x08),
496 - x, y - 31,
cliprect, TRANSPARENCY_PEN, 0);
}
}
static TIMER_CALLBACK( sprint8_collision_callback )
{
sprint8_set_collision(param);
}
VIDEO_UPDATE( sprint8 )
{
tilemap_draw(bitmap, cliprect, tilemap1, 0, 0);
draw_sprites(machine, bitmap, cliprect);
return 0;
}
VIDEO_EOF( sprint8 )
{
int x;
int y;
tilemap_draw(helper2, &machine->screen[0].visarea, tilemap2, 0, 0);
fillbitmap(helper1, 16, &machine->screen[0].visarea);
draw_sprites(machine, helper1, &machine->screen[0].visarea);
for (y = machine->screen[0].visarea.min_y; y <= machine->screen[0].visarea.max_y; y++)
{
const UINT16* p1 = BITMAP_ADDR16(helper1, y, 0);
const UINT16* p2 = BITMAP_ADDR16(helper2, y, 0);
for (x = machine->screen[0].visarea.min_x; x <= machine->screen[0].visarea.max_x; x++)
{
if (p1[x] != 16 && p2[x] != 16)
{
timer_set(video_screen_get_time_until_pos(0, y + 24, x), p1[x], sprint8_collision_callback);
}
}
}
}