// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
#include "emu.h"
#include "includes/lsasquad.h"
void lsasquad_state::draw_layer( bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *scrollram )
{
int offs, scrollx, scrolly;
scrollx = scrollram[3];
scrolly = -scrollram[0];
for (offs = 0; offs < 0x080; offs += 4)
{
int base, y, sx, sy, code, color;
base = 64 * scrollram[offs + 1];
sx = 8 * (offs / 4) + scrollx;
if (flip_screen())
sx = 248 - sx;
sx &= 0xff;
for (y = 0; y < 32; y++)
{
int attr;
sy = 8 * y + scrolly;
if (flip_screen())
sy = 248 - sy;
sy &= 0xff;
attr = m_videoram[base + 2 * y + 1];
code = m_videoram[base + 2 * y] + ((attr & 0x0f) << 8);
color = attr >> 4;
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
code,
color,
flip_screen(),flip_screen(),
sx,sy,15);
if (sx > 248) /* wraparound */
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
code,
color,
flip_screen(),flip_screen(),
sx-256,sy,15);
}
}
}
int lsasquad_state::draw_layer_daikaiju( bitmap_ind16 &bitmap, const rectangle &cliprect, int offs, int * previd, int type )
{
int id, scrollx, scrolly, initoffs, globalscrollx;
int stepx = 0;
initoffs = offs;
globalscrollx = 0;
id = m_scrollram[offs + 2];
for( ; offs < 0x400; offs += 4)
{
int base, y, sx, sy, code, color;
//id change
if (id != m_scrollram[offs + 2])
{
*previd = id;
return offs;
}
else
{
id = m_scrollram[offs + 2];
}
//skip empty (??) column, potential probs with 1st column in scrollram (scroll 0, tile 0, id 0)
if ((m_scrollram[offs + 0] | m_scrollram[offs + 1] | m_scrollram[offs + 2] | m_scrollram[offs + 3]) == 0)
continue;
//local scroll x/y
scrolly = -m_scrollram[offs + 0];
scrollx = m_scrollram[offs + 3];
//check for global x scroll used in bg layer in game (starts at offset 0 in scrollram
// and game name/logo on title screen (starts in the middle of scrollram, but with different
// (NOT unique )id than prev coulmn(s)
if (*previd != 1)
{
if (offs != initoffs)
{
scrollx += globalscrollx;
}
else
{
//global scroll init
globalscrollx = scrollx;
}
}
base = 64 * m_scrollram[offs + 1];
sx = scrollx + stepx;
if (flip_screen())
sx = 248 - sx;
sx &= 0xff;
for (y = 0; y < 32; y++)
{
int attr;
sy = 8 * y + scrolly;
if (flip_screen())
sy = 248 - sy;
sy &= 0xff;
attr = m_videoram[base + 2 * y + 1];
code = m_videoram[base + 2 * y] + ((attr & 0x0f) << 8);
color = attr >> 4;
if ((type == 0 && color != 0x0d) || (type != 0 && color == 0x0d))
{
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
code,
color,
flip_screen(),flip_screen(),
sx,sy,15);
if (sx > 248) /* wraparound */
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
code,
color,
flip_screen(),flip_screen(),
sx-256,sy,15);
}
}
}
return offs;
}
void lsasquad_state::drawbg( bitmap_ind16 &bitmap, const rectangle &cliprect, int type )
{
int i = 0;
int id = -1;
while (i < 0x400)
{
if (!(m_scrollram[i + 2] & 1))
{
i = draw_layer_daikaiju(bitmap, cliprect, i, &id, type);
}
else
{
id = m_scrollram[i + 2];
i += 4;
}
}
}
void lsasquad_state::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t priority )
{
uint8_t *spriteram = m_spriteram;
int offs;
for (offs = m_spriteram.bytes() - 4; offs >= 0; offs -= 4)
{
int sx, sy, attr, code, color, flipx, flipy;
attr = spriteram[offs + 1];
code = spriteram[offs + 2] + ((attr & 0x30) << 4);
sx = spriteram[offs + 3];
sy = 240 - spriteram[offs];
color = attr & 0x0f;
flipx = attr & 0x40;
flipy = attr & 0x80;
if (flip_screen())
{
sx = 240 - sx;
sy = 240 - sy;
flipx = !flipx;
flipy = !flipy;
}
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
code,
color,
flipx,flipy,
sx,sy,15);
/* wraparound */
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
code,
color,
flipx,flipy,
sx-256,sy,15);
}
}
uint32_t lsasquad_state::screen_update_lsasquad(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(511, cliprect);
draw_layer(bitmap, cliprect, m_scrollram + 0x000);
draw_layer(bitmap, cliprect, m_scrollram + 0x080);
draw_sprites(bitmap, cliprect, 0);
draw_layer(bitmap, cliprect, m_scrollram + 0x100);
return 0;
}
uint32_t lsasquad_state::screen_update_daikaiju(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(511, cliprect);
drawbg(bitmap, cliprect, 0); // bottom
draw_sprites(bitmap, cliprect, 0);
drawbg(bitmap, cliprect, 1); // top = palette $d ?
return 0;
}