diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mame/konami/k053246_k053247_k055673.cpp | 490 | ||||
-rw-r--r-- | src/mame/konami/k053246_k053247_k055673.h | 2 | ||||
-rw-r--r-- | src/mame/konami/mystwarr.cpp | 2 | ||||
-rw-r--r-- | src/mame/konami/mystwarr_v.cpp | 26 |
4 files changed, 173 insertions, 347 deletions
diff --git a/src/mame/konami/k053246_k053247_k055673.cpp b/src/mame/konami/k053246_k053247_k055673.cpp index 4e5545c3786..f633521dc68 100644 --- a/src/mame/konami/k053246_k053247_k055673.cpp +++ b/src/mame/konami/k053246_k053247_k055673.cpp @@ -409,9 +409,6 @@ void k053247_device::k053247_sprites_draw_common(BitmapClass &bitmap, const rect /* non-gx only */ primask,shadow,drawmode_table,shadowmode_table,shdmask ); - - - } // end of sprite-list loop #undef NUM_SPRITES } @@ -441,46 +438,18 @@ void k053247_device::k053247_sprites_draw(bitmap_rgb32 &bitmap, const rectangle void k053247_device::zdrawgfxzoom32GP( bitmap_rgb32 &bitmap, const rectangle &cliprect, - u32 code, u32 color, int flipx, int flipy, int sx, int sy, + u32 code, u32 color, bool flipx, bool flipy, int sx, int sy, int scalex, int scaley, int alpha, int drawmode, int zcode, int pri, u8* gx_objzbuf, u8* gx_shdzbuf) { -#define FP 19 -#define FPONE (1<<FP) -#define FPHALF (1<<(FP-1)) -#define FPENT 0 - - // inner loop - const u8 *src_ptr; - int src_x; - int eax, ecx; - int src_fx, src_fdx; - int shdpen; - u8 z8 = 0, p8 = 0; - u8 *ozbuf_ptr; - u8 *szbuf_ptr; - const pen_t *pal_base; - const pen_t *shd_base; - u32 *dst_ptr; - - // outter loop - int src_fby, src_fdy, src_fbx; - const u8 *src_base; - int dst_w, dst_h; - - // one-time - int nozoom, granularity; - int src_fw, src_fh; - int dst_minx, dst_maxx, dst_miny, dst_maxy; - int dst_skipx, dst_skipy, dst_x, dst_y, dst_lastx, dst_lasty; - int src_pitch, dst_pitch; - + constexpr int FP = 19; + constexpr int FPENT = 0; // cull illegal and transparent objects if (!scalex || !scaley) return; // find shadow pens and cull invisible shadows - granularity = shdpen = m_gfx->granularity(); - shdpen--; + const u16 granularity = m_gfx->granularity(); + int shdpen = granularity - 1; if (zcode >= 0) { @@ -496,30 +465,28 @@ void k053247_device::zdrawgfxzoom32GP( if (alpha >= 255) drawmode &= ~2; } + // cull off-screen objects + if (sx > cliprect.max_x || sy > cliprect.max_y) return; + // fill internal data structure with default values - ozbuf_ptr = gx_objzbuf; - szbuf_ptr = gx_shdzbuf; - - src_pitch = 16; - src_fw = 16; - src_fh = 16; - src_base = m_gfx->get_data(code % m_gfx->elements()); - - pal_base = palette().pens() + m_gfx->colorbase() + (color % m_gfx->colors()) * granularity; - shd_base = palette().shadow_table(); - - dst_ptr = &bitmap.pix(0); - dst_pitch = bitmap.rowpixels(); - dst_minx = cliprect.min_x; - dst_maxx = cliprect.max_x; - dst_miny = cliprect.min_y; - dst_maxy = cliprect.max_y; - dst_x = sx; - dst_y = sy; + u8 *ozbuf_ptr = gx_objzbuf; + u8 *szbuf_ptr = gx_shdzbuf; - // cull off-screen objects - if (dst_x > dst_maxx || dst_y > dst_maxy) return; - nozoom = (scalex == 0x10000 && scaley == 0x10000); + const u8 *src_base = m_gfx->get_data(code % m_gfx->elements()); + + const pen_t *pal_base = palette().pens() + m_gfx->colorbase() + (color % m_gfx->colors()) * granularity; + const pen_t *shd_base = palette().shadow_table(); + + u32 *dst_ptr = &bitmap.pix(0); + const int dst_pitch = bitmap.rowpixels(); + int dst_x = sx; + int dst_y = sy; + + int dst_w, dst_h; + int src_fdx, src_fdy; + int src_pitch = 16, src_fw = 16, src_fh = 16; + + const bool nozoom = (scalex == 0x10000 && scaley == 0x10000); if (nozoom) { dst_h = dst_w = 16; @@ -536,18 +503,31 @@ void k053247_device::zdrawgfxzoom32GP( src_fdx = src_fw / dst_w; src_fdy = src_fh / dst_h; } - dst_lastx = dst_x + dst_w - 1; - if (dst_lastx < dst_minx) return; - dst_lasty = dst_y + dst_h - 1; - if (dst_lasty < dst_miny) return; + + const int dst_lastx = dst_x + dst_w - 1; + const int dst_lasty = dst_y + dst_h - 1; + if (dst_lastx < cliprect.min_x || dst_lasty < cliprect.min_y) return; // clip destination - dst_skipx = 0; - eax = dst_minx; if ((eax -= dst_x) > 0) { dst_skipx = eax; dst_w -= eax; dst_x = dst_minx; } - eax = dst_lastx; if ((eax -= dst_maxx) > 0) dst_w -= eax; - dst_skipy = 0; - eax = dst_miny; if ((eax -= dst_y) > 0) { dst_skipy = eax; dst_h -= eax; dst_y = dst_miny; } - eax = dst_lasty; if ((eax -= dst_maxy) > 0) dst_h -= eax; + int dst_skipx = 0; + if (int delta_min_x = cliprect.min_x - dst_x; delta_min_x > 0) + { + dst_skipx = delta_min_x; + dst_w -= delta_min_x; + dst_x = cliprect.min_x; + } + if (int delta_max_x = dst_lastx - cliprect.max_x; delta_max_x > 0) dst_w -= delta_max_x; + + int dst_skipy = 0; + if (int delta_min_y = cliprect.min_y - dst_y; delta_min_y > 0) + { + dst_skipy = delta_min_y; + dst_h -= delta_min_y; + dst_y = cliprect.min_y; + } + if (int delta_max_y = dst_lasty - cliprect.max_y; delta_max_y > 0) dst_h -= delta_max_y; + + int src_fby, src_fbx; // calculate zoom factors and clip source if (nozoom) @@ -564,14 +544,17 @@ void k053247_device::zdrawgfxzoom32GP( src_fby += dst_skipy * src_fdy; // adjust insertion points and pre-entry constants - eax = (dst_y - dst_miny) * GX_ZBUFW + (dst_x - dst_minx) + dst_w; - z8 = (u8)zcode; - p8 = (u8)pri; - ozbuf_ptr += eax; - szbuf_ptr += eax << 1; + const int offset = (dst_y - cliprect.min_y) * GX_ZBUFW + (dst_x - cliprect.min_x) + dst_w; + ozbuf_ptr += offset; + szbuf_ptr += offset << 1; + const u8 z8 = (u8)zcode; + const u8 p8 = (u8)pri; dst_ptr += dst_y * dst_pitch + dst_x + dst_w; dst_w = -dst_w; + int src_fx, src_x, ecx; + const u8 *src_ptr; + if (!nozoom) { ecx = src_fby; src_fby += src_fdy; @@ -585,16 +568,43 @@ void k053247_device::zdrawgfxzoom32GP( { do { do { - eax = src_ptr[src_x]; - src_x = src_fx; + const u8 pal_idx = src_ptr[src_x]; + src_x = src_fx >> FP; + src_fx += src_fdx; + if (!pal_idx || pal_idx >= shdpen) continue; + dst_ptr[ecx] = pal_base[pal_idx]; + } + while (++ecx); + + ecx = src_fby; src_fby += src_fdy; + dst_ptr += dst_pitch; + ecx >>= FP; src_fx = src_fbx; + src_x = src_fbx; src_fx += src_fdx; + ecx <<= 4; src_ptr = src_base; + src_x >>= FP; src_ptr += ecx; + ecx = dst_w; + } + while (--dst_h); + } + else if (drawmode < 4) + { + // 0: all pens solid + // 1: solid pens only + // 2: all pens solid with alpha blending + // 3: solid pens only with alpha blending + do { + do { + const u8 pal_idx = src_ptr[src_x]; + src_x = src_fx >> FP; src_fx += src_fdx; - src_x >>= FP; - if (!eax || eax >= shdpen) continue; - dst_ptr [ecx] = pal_base[eax]; + if (!pal_idx || (drawmode & 0b01 && pal_idx >= shdpen) || ozbuf_ptr[ecx] < z8) continue; + ozbuf_ptr[ecx] = z8; + dst_ptr[ecx] = (drawmode & 0b10) ? alpha_blend_r32(dst_ptr[ecx], pal_base[pal_idx], alpha) : pal_base[pal_idx]; } while (++ecx); ecx = src_fby; src_fby += src_fdy; + ozbuf_ptr += GX_ZBUFW; dst_ptr += dst_pitch; ecx >>= FP; src_fx = src_fbx; src_x = src_fbx; src_fx += src_fdx; @@ -606,144 +616,35 @@ void k053247_device::zdrawgfxzoom32GP( } else { - switch (drawmode) - { - case 0: // all pens solid - do { - do { - eax = src_ptr[src_x]; - src_x = src_fx; - src_fx += src_fdx; - src_x >>= FP; - if (!eax || ozbuf_ptr[ecx] < z8) continue; - eax = pal_base[eax]; - ozbuf_ptr[ecx] = z8; - dst_ptr [ecx] = eax; - } - while (++ecx); - - ecx = src_fby; src_fby += src_fdy; - ozbuf_ptr += GX_ZBUFW; - dst_ptr += dst_pitch; - ecx >>= FP; src_fx = src_fbx; - src_x = src_fbx; src_fx += src_fdx; - ecx <<= 4; src_ptr = src_base; - src_x >>= FP; src_ptr += ecx; - ecx = dst_w; - } - while (--dst_h); - break; - - case 1: // solid pens only - do { - do { - eax = src_ptr[src_x]; - src_x = src_fx; - src_fx += src_fdx; - src_x >>= FP; - if (!eax || eax >= shdpen || ozbuf_ptr[ecx] < z8) continue; - eax = pal_base[eax]; - ozbuf_ptr[ecx] = z8; - dst_ptr [ecx] = eax; - } - while (++ecx); - - ecx = src_fby; src_fby += src_fdy; - ozbuf_ptr += GX_ZBUFW; - dst_ptr += dst_pitch; - ecx >>= FP; src_fx = src_fbx; - src_x = src_fbx; src_fx += src_fdx; - ecx <<= 4; src_ptr = src_base; - src_x >>= FP; src_ptr += ecx; - ecx = dst_w; - } - while (--dst_h); - break; - - case 2: // all pens solid with alpha blending - do { - do { - eax = src_ptr[src_x]; - src_x = src_fx; - src_fx += src_fdx; - src_x >>= FP; - if (!eax || ozbuf_ptr[ecx] < z8) continue; - ozbuf_ptr[ecx] = z8; - - dst_ptr[ecx] = alpha_blend_r32(pal_base[eax], dst_ptr[ecx], alpha); - } - while (++ecx); - - ecx = src_fby; src_fby += src_fdy; - ozbuf_ptr += GX_ZBUFW; - dst_ptr += dst_pitch; - ecx >>= FP; src_fx = src_fbx; - src_x = src_fbx; src_fx += src_fdx; - ecx <<= 4; src_ptr = src_base; - src_x >>= FP; src_ptr += ecx; - ecx = dst_w; - } - while (--dst_h); - break; - - case 3: // solid pens only with alpha blending - do { - do { - eax = src_ptr[src_x]; - src_x = src_fx; - src_fx += src_fdx; - src_x >>= FP; - if (!eax || eax >= shdpen || ozbuf_ptr[ecx] < z8) continue; - ozbuf_ptr[ecx] = z8; - - dst_ptr[ecx] = alpha_blend_r32(pal_base[eax], dst_ptr[ecx], alpha); - } - while (++ecx); - - ecx = src_fby; src_fby += src_fdy; - ozbuf_ptr += GX_ZBUFW; - dst_ptr += dst_pitch; - ecx >>= FP; src_fx = src_fbx; - src_x = src_fbx; src_fx += src_fdx; - ecx <<= 4; src_ptr = src_base; - src_x >>= FP; src_ptr += ecx; - ecx = dst_w; - } - while (--dst_h); - break; - - case 4: // shadow pens only - do { - do { - eax = src_ptr[src_x]; - src_x = src_fx; - src_fx += src_fdx; - src_x >>= FP; - if (eax < shdpen || szbuf_ptr[ecx*2] < z8 || szbuf_ptr[ecx*2+1] <= p8) continue; - rgb_t pix = dst_ptr[ecx]; - szbuf_ptr[ecx*2] = z8; - szbuf_ptr[ecx*2+1] = p8; - - // the shadow tables are 15-bit lookup tables which accept RGB15... lossy, nasty, yuck! - dst_ptr[ecx] = shd_base[pix.as_rgb15()]; - //dst_ptr[ecx] =(eax>>3&0x001f);lend_r32(eax, 0x00000000, 128); - } - while (++ecx); - - ecx = src_fby; src_fby += src_fdy; - szbuf_ptr += (GX_ZBUFW<<1); - dst_ptr += dst_pitch; - ecx >>= FP; src_fx = src_fbx; - src_x = src_fbx; src_fx += src_fdx; - ecx <<= 4; src_ptr = src_base; - src_x >>= FP; src_ptr += ecx; - ecx = dst_w; - } - while (--dst_h); - break; - } // switch (drawmode) - } // if (zcode < 0) - } // if (!nozoom) + // 4: shadow pens only + do { + do { + const u8 pal_idx = src_ptr[src_x]; + src_x = src_fx >> FP; + src_fx += src_fdx; + if (pal_idx < shdpen || szbuf_ptr[ecx*2] < z8 || szbuf_ptr[ecx*2+1] <= p8) continue; + rgb_t pix = dst_ptr[ecx]; + szbuf_ptr[ecx*2] = z8; + szbuf_ptr[ecx*2+1] = p8; + + // the shadow tables are 15-bit lookup tables which accept RGB15... lossy, nasty, yuck! + dst_ptr[ecx] = shd_base[pix.as_rgb15()]; + //dst_ptr[ecx] =(eax>>3&0x001f);lend_r32(eax, 0x00000000, 128); + } + while (++ecx); + + ecx = src_fby; src_fby += src_fdy; + szbuf_ptr += (GX_ZBUFW<<1); + dst_ptr += dst_pitch; + ecx >>= FP; src_fx = src_fbx; + src_x = src_fbx; src_fx += src_fdx; + ecx <<= 4; src_ptr = src_base; + src_x >>= FP; src_ptr += ecx; + ecx = dst_w; + } + while (--dst_h); + } + } // if (!nozoom) else { src_ptr = src_base + (src_fby<<4) + src_fbx; @@ -754,14 +655,37 @@ void k053247_device::zdrawgfxzoom32GP( { do { do { - eax = *src_ptr; + const u8 pal_idx = *src_ptr; + src_ptr += src_fdx; + if (!pal_idx || pal_idx >= shdpen) continue; + dst_ptr[ecx] = pal_base[pal_idx]; + } + while (++ecx); + + src_ptr += src_fdy; + dst_ptr += dst_pitch; + ecx = dst_w; + } + while (--dst_h); + } + else if (drawmode < 4) + { + // 0: all pens solid + // 1: solid pens only + // 2: all pens solid with alpha blending + // 3: solid pens only with alpha blending + do { + do { + const u8 pal_idx = *src_ptr; src_ptr += src_fdx; - if (!eax || eax >= shdpen) continue; - dst_ptr[ecx] = pal_base[eax]; + if (!pal_idx || (drawmode & 0b01 && pal_idx >= shdpen) || ozbuf_ptr[ecx] < z8) continue; + ozbuf_ptr[ecx] = z8; + dst_ptr[ecx] = (drawmode & 0b10) ? alpha_blend_r32(dst_ptr[ecx], pal_base[pal_idx], alpha) : pal_base[pal_idx]; } while (++ecx); src_ptr += src_fdy; + ozbuf_ptr += GX_ZBUFW; dst_ptr += dst_pitch; ecx = dst_w; } @@ -769,117 +693,29 @@ void k053247_device::zdrawgfxzoom32GP( } else { - switch (drawmode) - { - case 0: // all pens solid - do { - do { - eax = *src_ptr; - src_ptr += src_fdx; - if (!eax || ozbuf_ptr[ecx] < z8) continue; - eax = pal_base[eax]; - ozbuf_ptr[ecx] = z8; - dst_ptr[ecx] = eax; - } - while (++ecx); - - src_ptr += src_fdy; - ozbuf_ptr += GX_ZBUFW; - dst_ptr += dst_pitch; - ecx = dst_w; - } - while (--dst_h); - break; - - case 1: // solid pens only - do { - do { - eax = *src_ptr; - src_ptr += src_fdx; - if (!eax || eax >= shdpen || ozbuf_ptr[ecx] < z8) continue; - eax = pal_base[eax]; - ozbuf_ptr[ecx] = z8; - dst_ptr[ecx] = eax; - } - while (++ecx); - - src_ptr += src_fdy; - ozbuf_ptr += GX_ZBUFW; - dst_ptr += dst_pitch; - ecx = dst_w; - } - while (--dst_h); - break; - - case 2: // all pens solid with alpha blending - do { - do { - eax = *src_ptr; - src_ptr += src_fdx; - if (!eax || ozbuf_ptr[ecx] < z8) continue; - ozbuf_ptr[ecx] = z8; - - dst_ptr[ecx] = alpha_blend_r32(pal_base[eax], dst_ptr[ecx], alpha); - } - while (++ecx); - - src_ptr += src_fdy; - ozbuf_ptr += GX_ZBUFW; - dst_ptr += dst_pitch; - ecx = dst_w; - } - while (--dst_h); - break; - - case 3: // solid pens only with alpha blending - do { - do { - eax = *src_ptr; - src_ptr += src_fdx; - if (!eax || eax >= shdpen || ozbuf_ptr[ecx] < z8) continue; - ozbuf_ptr[ecx] = z8; - - dst_ptr[ecx] = alpha_blend_r32(pal_base[eax], dst_ptr[ecx], alpha); - } - while (++ecx); - - src_ptr += src_fdy; - ozbuf_ptr += GX_ZBUFW; - dst_ptr += dst_pitch; - ecx = dst_w; - } - while (--dst_h); - break; - - case 4: // shadow pens only - do { - do { - eax = *src_ptr; - src_ptr += src_fdx; - if (eax < shdpen || szbuf_ptr[ecx*2] < z8 || szbuf_ptr[ecx*2+1] <= p8) continue; - rgb_t pix = dst_ptr[ecx]; - szbuf_ptr[ecx*2] = z8; - szbuf_ptr[ecx*2+1] = p8; - - // the shadow tables are 15-bit lookup tables which accept RGB15... lossy, nasty, yuck! - dst_ptr[ecx] = shd_base[pix.as_rgb15()]; - } - while (++ecx); - - src_ptr += src_fdy; - szbuf_ptr += (GX_ZBUFW<<1); - dst_ptr += dst_pitch; - ecx = dst_w; - } - while (--dst_h); - break; + // 4: shadow pens only + do { + do { + const u8 pal_idx = *src_ptr; + src_ptr += src_fdx; + if (pal_idx < shdpen || szbuf_ptr[ecx*2] < z8 || szbuf_ptr[ecx*2+1] <= p8) continue; + rgb_t pix = dst_ptr[ecx]; + szbuf_ptr[ecx*2] = z8; + szbuf_ptr[ecx*2+1] = p8; + + // the shadow tables are 15-bit lookup tables which accept RGB15... lossy, nasty, yuck! + dst_ptr[ecx] = shd_base[pix.as_rgb15()]; + } + while (++ecx); + + src_ptr += src_fdy; + szbuf_ptr += (GX_ZBUFW<<1); + dst_ptr += dst_pitch; + ecx = dst_w; } + while (--dst_h); } } -#undef FP -#undef FPONE -#undef FPHALF -#undef FPENT } diff --git a/src/mame/konami/k053246_k053247_k055673.h b/src/mame/konami/k053246_k053247_k055673.h index 059f70cea36..d73c9967fe8 100644 --- a/src/mame/konami/k053246_k053247_k055673.h +++ b/src/mame/konami/k053246_k053247_k055673.h @@ -111,7 +111,7 @@ public: /* alt implementation - to be collapsed */ void zdrawgfxzoom32GP( bitmap_rgb32 &bitmap, const rectangle &cliprect, - u32 code, u32 color, int flipx, int flipy, int sx, int sy, + u32 code, u32 color, bool flipx, bool flipy, int sx, int sy, int scalex, int scaley, int alpha, int drawmode, int zcode, int pri, u8* gx_objzbuf, u8* gx_shdzbuf); void zdrawgfxzoom32GP( diff --git a/src/mame/konami/mystwarr.cpp b/src/mame/konami/mystwarr.cpp index b0d2d2ae892..604ed5dfd1f 100644 --- a/src/mame/konami/mystwarr.cpp +++ b/src/mame/konami/mystwarr.cpp @@ -1125,7 +1125,7 @@ void mystwarr_state::dadandrn(machine_config &config) m_k056832->set_tile_callback(FUNC(mystwarr_state::game5bpp_tile_callback)); - m_k055673->set_sprite_callback(FUNC(mystwarr_state::gaiapols_sprite_callback)); + m_k055673->set_sprite_callback(FUNC(mystwarr_state::mystwarr_sprite_callback)); m_k055673->set_config(K055673_LAYOUT_GX, -42, -22); } diff --git a/src/mame/konami/mystwarr_v.cpp b/src/mame/konami/mystwarr_v.cpp index 238891ccf04..8b8c8b9cae1 100644 --- a/src/mame/konami/mystwarr_v.cpp +++ b/src/mame/konami/mystwarr_v.cpp @@ -77,29 +77,19 @@ K056832_CB_MEMBER(mystwarr_state::game4bpp_tile_callback) K055673_CB_MEMBER(mystwarr_state::mystwarr_sprite_callback) { - int c = *color; - *color = m_sprite_colorbase | (c & 0x001f); - *priority_mask = c & 0x00f0; + *priority_mask = *color & 0x00e0; + + const int effect_attributes = ((*color >> 8) & 0b11) << K055555_MIXSHIFT; // used for blending + *color = m_sprite_colorbase | (*color & 0x001f) | effect_attributes; } K055673_CB_MEMBER(mystwarr_state::metamrph_sprite_callback) { - int c = *color; - int attr = c; + *priority_mask = (*color & 0xe0) >> 2; - c = (c & 0x1f) | m_sprite_colorbase; - - // Bit8 & 9 are effect attributes. It is not known whether the effects are generated by external logic. - if ((attr & 0x300) != 0x300) - { - *color = c; - *priority_mask = (attr & 0xe0) >> 2; - } - else - { - *color = c | 3<<K055555_MIXSHIFT | K055555_SKIPSHADOW; // reflection? - *priority_mask = 0x1c; - } + const int shadow = (*color >> 10) & 0b11; + const int effect_attributes = ((*color >> 8) & 0b11) << K055555_MIXSHIFT; // used for blending + *color = (*color & 0x1f) | m_sprite_colorbase | effect_attributes | ((shadow == 0b11) ? K055555_SKIPSHADOW : 0); } K055673_CB_MEMBER(mystwarr_state::gaiapols_sprite_callback) |