diff options
Diffstat (limited to 'src/mame/kaneko/snowbros_v.cpp')
-rw-r--r-- | src/mame/kaneko/snowbros_v.cpp | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/src/mame/kaneko/snowbros_v.cpp b/src/mame/kaneko/snowbros_v.cpp new file mode 100644 index 00000000000..6910e5b468f --- /dev/null +++ b/src/mame/kaneko/snowbros_v.cpp @@ -0,0 +1,275 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood, Luca Elia +/* bootlegs of Kaneko Pandora chip, with modifications */ + +#include "emu.h" +#include "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; +} |