// license:BSD-3-Clause
// copyright-holders:David Haywood, Luca Elia
/* bootlegs of Kaneko Pandora chip, with modifications */
#include "emu.h"
#include "includes/snowbros.h"
uint32_t snowbros_state::screen_update_honeydol(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint16_t *spriteram16 = m_bootleg_spriteram16;
int sx=0, sy=0, x=0, y=0, offs;
/* sprites clip on left / right edges when scrolling, but it seems correct,
no extra sprite attribute bits are set during this time, the sprite co-ordinates
are simply set to 0 */
/* not standard snowbros video */
bitmap.fill(0xf0, cliprect);
for (offs = 0x0000/2;offs < 0x2000/2;offs += 8)
{
int dx,dy,tilecolour,attr,flipx,flipy,tile;
/* 8bpp gfx */
dx = (spriteram16[offs+4]>>8) & 0xff;
dy = (spriteram16[offs+5]>>8) & 0xff;
tilecolour = (spriteram16[offs+3]>>8)&3;
attr = spriteram16[offs+7]>>8;
flipx = attr & 0x80;
flipy = (attr & 0x40) << 1;
tile = ((attr & 0x3f)<<8) + ((spriteram16[offs+6]>>8) & 0xff);
x = dx;
y = dy;
if (flip_screen())
{
sx = 240 - x;
sy = 240 - y;
flipx = !flipx;
flipy = !flipy;
}
else
{
sx = x;
sy = y;
}
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect,
tile,
tilecolour,
flipx, flipy,
sx,sy,0);
/* second list interleaved with first (4bpp) ??? */
dx = spriteram16[offs+4] & 0xff;
dy = spriteram16[offs+5] & 0xff;
tilecolour = spriteram16[offs+3];
attr = spriteram16[offs+7];
flipx = attr & 0x80;
flipy = (attr & 0x40) << 1;
tile = ((attr & 0x3f) << 8) + (spriteram16[offs+6] & 0xff);
x = dx;
y = dy;
if (flip_screen())
{
sx = 240 - x;
sy = 240 - y;
flipx = !flipx;
flipy = !flipy;
}
else
{
sx = x;
sy = y;
}
tilecolour = (tilecolour&0x03f0) >> 4;
tilecolour ^=0x3f; // unusual, but correct..
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
tile,
tilecolour,
flipx, flipy,
sx,sy,0);
}
return 0;
}
uint32_t snowbros_state::screen_update_twinadv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint16_t *spriteram16 = m_bootleg_spriteram16;
int sx=0, sy=0, x=0, y=0, offs;
/* sprites clip on left / right edges when scrolling, but it seems correct,
no extra sprite attribute bits are set during this time, the sprite co-ordinates
are simply set to 0 */
/* not standard snowbros video */
bitmap.fill(0xf0, cliprect);
for (offs = 0x0000/2;offs < 0x2000/2;offs += 8)
{
int dx,dy,tilecolour,attr,flipx,flipy,tile;
/* Similar to Honey Doll, but no 8bpp list / gfx */
dx = spriteram16[offs+4] & 0xff;
dy = spriteram16[offs+5] & 0xff;
tilecolour = spriteram16[offs+3];
attr = spriteram16[offs+7];
flipx = attr & 0x80;
flipy = (attr & 0x40) << 1;
tile = ((attr & 0x3f) << 8) + (spriteram16[offs+6] & 0xff);
x = dx;
y = dy;
if (flip_screen())
{
sx = 240 - x;
sy = 240 - y;
flipx = !flipx;
flipy = !flipy;
}
else
{
sx = x;
sy = y;
}
tilecolour = (tilecolour&0x00f0) >> 4;
tilecolour ^=0xf; // unusual, but correct..
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
tile,
tilecolour,
flipx, flipy,
sx,sy,0);
}
return 0;
}
uint32_t snowbros_state::screen_update_wintbob(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint16_t *spriteram16 = m_bootleg_spriteram16;
int offs;
bitmap.fill(m_palette->black_pen(), cliprect);
for (offs = 0;offs < m_bootleg_spriteram16.bytes()/2;offs += 8)
{
int xpos = spriteram16[offs] & 0xff;
int ypos = spriteram16[offs+4] & 0xff;
/* int unk1 = spriteram16[offs+1] & 0x01;*/ /* Unknown .. Set for the Bottom Left part of Sprites */
int disbl = spriteram16[offs+1] & 0x02;
/* int unk2 = spriteram16[offs+1] & 0x04;*/ /* Unknown .. Set for most things */
int wrapr = spriteram16[offs+1] & 0x08;
int colr = (spriteram16[offs+1] & 0xf0) >> 4;
int tilen = (spriteram16[offs+2] << 8) + (spriteram16[offs+3] & 0xff);
int flipx = spriteram16[offs+2] & 0x80;
int flipy = (spriteram16[offs+2] & 0x40) << 1;
if (wrapr == 8) xpos -= 256;
if (flip_screen())
{
xpos = 240 - xpos;
ypos = 240 - ypos;
flipx = !flipx;
flipy = !flipy;
}
if ((xpos > -16) && (ypos > 0) && (xpos < 256) && (ypos < 240) && (disbl !=2))
{
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
tilen,
colr,
flipx, flipy,
xpos,ypos,0);
}
}
return 0;
}
uint32_t snowbros_state::screen_update_snowbro3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint16_t *spriteram16 = m_bootleg_spriteram16;
int sx=0, sy=0, x=0, y=0, offs;
/*
* Sprite Tile Format
* ------------------
*
* Byte | Bit(s) | Use
* -----+-76543210-+----------------
* 0-5 | -------- | ?
* 6 | -------- | ?
* 7 | xxxx.... | Palette Bank
* 7 | .......x | XPos - Sign Bit
* 9 | xxxxxxxx | XPos
* 7 | ......x. | YPos - Sign Bit
* B | xxxxxxxx | YPos
* 7 | .....x.. | Use Relative offsets
* C | -------- | ?
* D | xxxxxxxx | Sprite Number (low 8 bits)
* E | -------- | ?
* F | ....xxxx | Sprite Number (high 4 bits)
* F | x....... | Flip Sprite Y-Axis
* F | .x...... | Flip Sprite X-Axis
*/
/* This clears & redraws the entire screen each pass */
bitmap.fill(m_palette->black_pen(), cliprect);
for (offs = 0;offs < m_bootleg_spriteram16.bytes()/2;offs += 8)
{
gfx_element *gfx = m_gfxdecode->gfx(0);
int dx = spriteram16[offs+4] & 0xff;
int dy = spriteram16[offs+5] & 0xff;
int tilecolour = spriteram16[offs+3];
int attr = spriteram16[offs+7];
int flipx = attr & 0x80;
int flipy = (attr & 0x40) << 1;
int tile = ((attr & 0xff) << 8) + (spriteram16[offs+6] & 0xff);
if (tilecolour & 1) dx = -1 - (dx ^ 0xff);
if (tilecolour & 2) dy = -1 - (dy ^ 0xff);
if (tilecolour & 4)
{
x += dx;
y += dy;
}
else
{
x = dx;
y = dy;
}
if (x > 511) x &= 0x1ff;
if (y > 511) y &= 0x1ff;
if (flip_screen())
{
sx = 240 - x;
sy = 240 - y;
flipx = !flipx;
flipy = !flipy;
}
else
{
sx = x;
sy = y;
}
if (offs < 0x800) /* i guess this is the right way */
{
gfx = m_gfxdecode->gfx(1);
tilecolour = 0x10;
}
gfx->transpen(bitmap,cliprect,
tile,
(tilecolour & 0xf0) >> 4,
flipx, flipy,
sx,sy,0);
}
return 0;
}