summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/kaneko/snowbros_v.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/kaneko/snowbros_v.cpp')
-rw-r--r--src/mame/kaneko/snowbros_v.cpp275
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;
+}