// license:BSD-3-Clause
// copyright-holders:Stefan Jokisch
/***************************************************************************
Atari Sky Raider video emulation
***************************************************************************/
#include "emu.h"
#include "includes/skyraid.h"
void skyraid_state::video_start()
{
m_helper.allocate(128, 240);
}
void skyraid_state::draw_text(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
const uint8_t* p = m_alpha_num_ram;
int i;
for (i = 0; i < 4; i++)
{
int x;
int y;
y = 136 + 16 * (i ^ 1);
for (x = 0; x < bitmap.width(); x += 16)
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect, *p++, 0, 0, 0, x, y, 0);
}
}
void skyraid_state::draw_terrain(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
const uint8_t* p = memregion("user1")->base();
int x;
int y;
for (y = 0; y < bitmap.height(); y++)
{
int offset = (16 * m_scroll + 16 * ((y + 1) / 2)) & 0x7FF;
x = 0;
while (x < bitmap.width())
{
uint8_t val = p[offset++];
int color = val / 32;
int count = val % 32;
rectangle r(x, x + 31 - count, y, y+ 1);
bitmap.fill(color, r);
x += 32 - count;
}
}
}
void skyraid_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int i;
for (i = 0; i < 4; i++)
{
int code = m_obj_ram[8 + 2 * i + 0] & 15;
int flag = m_obj_ram[8 + 2 * i + 1] & 15;
int vert = m_pos_ram[8 + 2 * i + 0];
int horz = m_pos_ram[8 + 2 * i + 1];
vert -= 31;
if (flag & 1)
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
code ^ 15, code >> 3, 0, 0,
horz / 2, vert, 2);
}
}
void skyraid_state::draw_missiles(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int i;
/* hardware is restricted to one sprite per scanline */
for (i = 0; i < 4; i++)
{
int code = m_obj_ram[2 * i + 0] & 15;
int vert = m_pos_ram[2 * i + 0];
int horz = m_pos_ram[2 * i + 1];
vert -= 15;
horz -= 31;
m_gfxdecode->gfx(2)->transpen(bitmap,cliprect,
code ^ 15, 0, 0, 0,
horz / 2, vert, 0);
}
}
void skyraid_state::draw_trapezoid(bitmap_ind16& dst, bitmap_ind16& src)
{
const uint8_t* p = memregion("user2")->base();
int x;
int y;
for (y = 0; y < dst.height(); y++)
{
uint16_t* pSrc = &src.pix16(y);
uint16_t* pDst = &dst.pix16(y);
int x1 = 0x000 + p[(y & ~1) + 0];
int x2 = 0x100 + p[(y & ~1) + 1];
for (x = x1; x < x2; x++)
pDst[x] = pSrc[128 * (x - x1) / (x2 - x1)];
}
}
uint32_t skyraid_state::screen_update_skyraid(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(0, cliprect);
rectangle helper_clip = cliprect;
helper_clip &= m_helper.cliprect();
draw_terrain(m_helper, helper_clip);
draw_sprites(m_helper, helper_clip);
draw_missiles(m_helper, helper_clip);
draw_trapezoid(bitmap, m_helper);
draw_text(bitmap, cliprect);
return 0;
}