/* Deco MXC06 sprite generator: used by: madmotor.c Notes (dec0.c) Sprite data: The unknown bits seem to be unused. Byte 0: Bit 0 : Y co-ord hi bit Bit 1,2 : Sprite width (1x, 2x, 4x, 8x) Bit 3,4 : Sprite height (1x, 2x, 4x, 8x) Bit 5 - X flip Bit 6 - Y flip Bit 7 - Only display Sprite if set Byte 1: Y-coords Byte 2: Bit 0,1,2,3: Hi bits of sprite number Bit 4,5,6,7: (Probably unused MSB's of sprite) Byte 3: Low bits of sprite number Byte 4: Bit 0 : X co-ords hi bit Bit 1,2: ?? Bit 3: Sprite flash (sprite is displayed every other frame) Bit 4,5,6,7: - Colour Byte 5: X-coords todo: Implement sprite/tilemap orthogonality (not strictly needed as no games make deliberate use of it). (pdrawgfx, or rendering to bitmap for manual mixing) */ #include "emu.h" #include "decmxc06.h" void deco_mxc06_device::set_gfx_region(device_t &device, int region) { deco_mxc06_device &dev = downcast(device); dev.m_gfxregion = region; } const device_type DECO_MXC06 = &device_creator; deco_mxc06_device::deco_mxc06_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, DECO_MXC06, "decmxc06_device", tag, owner, clock), m_gfxregion(0) { } /* this implementation was originally from Mad Motor */ void deco_mxc06_device::draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT16* spriteram, int pri_mask, int pri_val, int col_mask ) { int offs; offs = 0; while (offs < 0x800 / 2) { int sx, sy, code, color, w, h, flipx, flipy, incy, flash, mult, x, y; sy = spriteram[offs]; sx = spriteram[offs + 2]; color = sx >> 12; flash = sx & 0x800; flipx = sy & 0x2000; flipy = sy & 0x4000; h = (1 << ((sy & 0x1800) >> 11)); /* 1x, 2x, 4x, 8x height */ w = (1 << ((sy & 0x0600) >> 9)); /* 1x, 2x, 4x, 8x width */ /* multi width used only on the title screen? */ sx = sx & 0x01ff; sy = sy & 0x01ff; if (sx >= 256) sx -= 512; if (sy >= 256) sy -= 512; sx = 240 - sx; sy = 240 - sy; if (flip_screen_get(machine)) { sy = 240 - sy; sx = 240 - sx; if (flipx) flipx = 0; else flipx = 1; if (flipy) flipy = 0; else flipy = 1; mult = 16; } else mult = -16; for (x = 0; x < w; x++) { // maybe, birdie try appears to specify the base code for each part.. code = spriteram[offs + 1] & 0x1fff; code &= ~(h-1); if (flipy) incy = -1; else { code += h-1; incy = 1; } for (y = 0; y < h; y++) { if (spriteram[offs] & 0x8000) { int draw = 0; if (!flash || (machine.primary_screen->frame_number() & 1)) { if (m_priority_type==0) // most cases { if ((color & pri_mask) == pri_val) { draw = 1; } } else if (m_priority_type==1) // vaportra { if (pri_mask && (color >= pri_val)) continue; if (!pri_mask && !(color >= pri_val)) continue; draw = 1; } } if (draw) { drawgfx_transpen(bitmap,cliprect,machine.gfx[m_gfxregion], code - y * incy, color & col_mask, flipx,flipy, sx + (mult * x),sy + (mult * y),0); } } } offs += 4; if (offs >= 0x800 / 2) return; } } } void deco_mxc06_device::device_start() { m_priority_type = 0; } void deco_mxc06_device::device_reset() { }