new clones

Speed Up (Spanish bootleg of Pole Position) [Marcos75 (from AUMAP)]

not to be confused with the Gaelco game of the same name, this one isn't translated as such but has billboards for Spanish locations etc.  There is said to be a more Spanish version out there somewhere with actual Spanish voices.

also shuffled some more Konami bits around for later.
This commit is contained in:
David Haywood 2013-07-15 16:44:52 +00:00
parent 134615242c
commit 8f79fe8b75
6 changed files with 382 additions and 313 deletions

View File

@ -1529,6 +1529,86 @@ ROM_START( topracera )
ROM_END
ROM_START( ppspeed )
/* Z80 memory/ROM data */
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "tr9b.bin", 0x0000, 0x2000, CRC(538bd0cb) SHA1(36a0628ce735c76e5db83d195af3a9bed5155c60) )
ROM_LOAD( "tr10.bin", 0x2000, 0x1000, CRC(7174bcb7) SHA1(460326a6cea201db2df813013c95562a222ea95d) )
/* Z8002 #1 memory/ROM data */
ROM_REGION( 0x10000, "sub", 0 )
ROM_LOAD16_BYTE( "tr1b.bin", 0x0001, 0x2000, CRC(127f0750) SHA1(97ae6c6f8086187c7cdb8bff5fec94914791890b) )
ROM_LOAD16_BYTE( "tr2b.bin", 0x0000, 0x2000, CRC(6bd4ff6b) SHA1(cf992de39a8cf7804961a8e6773fc4f7feb1878b) )
/* Z8002 #2 memory/ROM data */
ROM_REGION( 0x10000, "sub2", 0 )
ROM_LOAD16_BYTE( "tr5b.bin", 0x0001, 0x2000, CRC(4e5f7b9c) SHA1(d26b1f24dd9ef00388987890bc5b95d4db403815) )
ROM_LOAD16_BYTE( "tr6b.bin", 0x0000, 0x2000, CRC(b3641d0c) SHA1(38ce172b2e38895749cbd3cc1c0e2c0fe8be744a) )
/* graphics data */
ROM_REGION( 0x01000, "gfx1", 0 ) /* 2bpp alpha layer */
ROM_LOAD( "tr28.bin", 0x0000, 0x1000, CRC(cd80b4c3) SHA1(5f237c1e7eb94ecb2680270afdf31c8e111164c5) )
ROM_REGION( 0x01000, "gfx2", 0 ) /* 2bpp view layer */
ROM_LOAD( "tr29.bin", 0x0000, 0x1000, CRC(c6e15c21) SHA1(e2a70b3f7ce51a003068eb75d9fe82548f0206d7) )
ROM_REGION( 0x04000, "gfx3", 0 ) /* 4bpp 16x16 sprites */
ROM_LOAD( "tr25.bin", 0x0000, 0x2000, CRC(f44d33c1) SHA1(e09bcc127e61b351e99c54bf0e3cbab8583949ec) ) /* 4bpp sm sprites, planes 0+1 */
ROM_LOAD( "tr26.bin", 0x2000, 0x2000, CRC(87e8482d) SHA1(3f1c7f0f9b27e8b61e62db55dd4332c75dc31558) ) /* 4bpp sm sprites, planes 2+3 */
ROM_REGION( 0x10000, "gfx4", 0 ) /* 4bpp 32x32 sprites */
ROM_LOAD( "tr17.bin", 0x0000, 0x2000, CRC(613ab0df) SHA1(88aa4500275aae010fc9783c1d8d843feab89afa) ) /* 4bpp lg sprites, planes 0+1 */
ROM_LOAD( "tr19.bin", 0x2000, 0x2000, CRC(1ea04ccd) SHA1(1cec1e4d0f47365245d92489f78d3edd4f23481f) )
ROM_LOAD( "tr21.bin", 0x4000, 0x2000, CRC(bd7b4a62) SHA1(66175a9382f627053097f0bc9a3fd49a26f8ac8f) )
ROM_LOAD( "tr18.bin", 0x8000, 0x2000, CRC(5fd933e3) SHA1(5b27a8519234c935308f943cd58abc1efc463726) ) /* 4bpp lg sprites, planes 2+3 */
ROM_LOAD( "tr20.bin", 0xa000, 0x2000, CRC(c572c6ed) SHA1(c2398a82a57be92a0bdc58330504e821878492ea) )
ROM_LOAD( "tr22.bin", 0xc000, 0x2000, CRC(db1bcdd8) SHA1(ffd4edd8c02914a0a85cd7e39153c27d79526457) )
ROM_REGION( 0x5000, "gfx5", 0 ) /* road generation ROMs needed at runtime */
ROM_LOAD( "tr30.bin", 0x0000, 0x2000, CRC(ee6b3315) SHA1(9cc26c6d3604c0f60d716f86e67e9d9c0487f87d) ) /* road control */
ROM_LOAD( "tr31.bin", 0x2000, 0x2000, CRC(6d1e7042) SHA1(90113ff0c93ed86d95067290088705bb5e6608d1) ) /* road bits 1 */
ROM_LOAD( "tr32.bin", 0x4000, 0x1000, CRC(4e97f101) SHA1(f377d053821c74aee93ebcd30a4d43e6156f3cfe) ) /* road bits 2 */
ROM_REGION( 0x1000, "gfx6", 0 ) /* sprite scaling */
ROM_LOAD( "tr27.bin", 0x0000, 0x1000, CRC(a61bff15) SHA1(f7a59970831cdaaa7bf59c2221a38e4746c54244) ) /* vertical scaling */
ROM_REGION( 0x4000, "engine", 0 )
ROM_LOAD( "tr15.bin", 0x0000, 0x2000, CRC(b5ad4d5f) SHA1(c07e77a050200d6fe9952031f971ca35f4d15ff8) ) /* engine sound */
ROM_LOAD( "tr16.bin", 0x2000, 0x2000, CRC(8fdd2f6f) SHA1(3818dc94c60cd78c4212ab7a4367cf3d98166ee6) ) /* engine sound */
// nothing below was verified on this boardset, assumed to be the same
/* graphics (P)ROM data */
ROM_REGION( 0x1040, "proms", 0 )
ROM_LOAD( "7052-7.k21", 0x0000, 0x0100, CRC(f07ff2ad) SHA1(e1f3cb10a03d23f8c1d422acf271dba4e7b98cb1) ) /* red palette */
ROM_LOAD( "7052-8.k20", 0x0100, 0x0100, CRC(adbde7d7) SHA1(956ac5117c1e310f554ac705aa2dc24a796c36a5) ) /* green palette */
ROM_LOAD( "7052-9.k19", 0x0200, 0x0100, CRC(ddac786a) SHA1(d1860105bf91297533ccc4aa6775987df198d0fa) ) /* blue palette */
ROM_LOAD( "7052-10.h15", 0x0300, 0x0100, CRC(5af3f710) SHA1(da13d17acf8abd0f6ebb4b51b23c3324c6197b7d) ) /* alpha color */
ROM_LOAD( "7052-11.j15", 0x0400, 0x0100, CRC(8c90e36e) SHA1(2646288d9e0f86300da7f06e1dc0595673205bb4) ) /* background color */
ROM_LOAD( "7052-15.d1", 0x0500, 0x0100, CRC(2d502464) SHA1(682b7dd22e51d5db52c0804b7e27e47641dfa6bd) ) /* vertical position low */
ROM_LOAD( "7052-16.d2", 0x0600, 0x0100, CRC(027aa62c) SHA1(c7030d8b64b80e107c446f6fbdd63f560c0a91c0) ) /* vertical position med */
ROM_LOAD( "7052-17.d3", 0x0700, 0x0100, CRC(1f8d0df3) SHA1(b8f17758f114f5e247b65b3f2922ca2660757e66) ) /* vertical position hi */
ROM_LOAD( "7122.a19", 0x0800, 0x0400, CRC(7afc7cfc) SHA1(ba2407f6eff124e881b354f13205a4c058b7cf60) ) /* road color */
ROM_LOAD( "7122.e7", 0x0c00, 0x0400, CRC(2f1079ee) SHA1(18a27998a78deff13dd198f3668a7e92f084f467) ) /* sprite color */
ROM_LOAD( "7051-13.l7", 0x1000, 0x0020, CRC(4330a51b) SHA1(9531d18ce2de4eda9913d47ef8c5cd8f05791716) ) /* video RAM address decoder (not used) */
ROM_LOAD( "7051-14.l8", 0x1020, 0x0020, CRC(4330a51b) SHA1(9531d18ce2de4eda9913d47ef8c5cd8f05791716) ) /* video RAM address decoder (not used) */
/* sound (P)ROM data */
ROM_REGION( 0x0100, "namco", 0 )
ROM_LOAD( "7052-5.e9", 0x0000, 0x0100, CRC(8568decc) SHA1(0aac1fa082858d4d201e21511c609a989f9a1535) ) /* Namco sound */
ROM_REGION( 0x6000, "52xx", 0 )
ROM_LOAD( "tr11.b1", 0x0000, 0x2000, CRC(5b4cf05e) SHA1(52342572940489175607bbf5b6cfd05ee9b0f004) ) /* voice */
/* unknown or unused (P)ROM data */
ROM_REGION( 0x0100, "user1", 0 )
ROM_LOAD( "7052-4.c14", 0x0000, 0x0100, CRC(0e742cb1) SHA1(3ae43270aab4848fdeece1648e7e040ab216b08e) ) /* sync chain */
ROM_END
/* Top Racer (bootleg without MB8841 / MB8842)
CPU Lower Board (label "1081-C")
@ -2010,6 +2090,7 @@ GAME( 1982, poleposa, polepos, polepos, poleposa, driver_device, 0,
GAME( 1982, polepos1, polepos, polepos, poleposa, driver_device, 0, ROT0, "Namco (Atari license)", "Pole Position (Atari version 1)", 0 )
GAME( 1984, topracer, polepos, polepos, polepos, driver_device, 0, ROT0, "bootleg", "Top Racer (with MB8841 + MB8842, 1984)", 0 ) // the NAMCO customs have been cloned on these bootlegs
GAME( 1983, topracera, polepos, polepos, polepos, driver_device, 0, ROT0, "bootleg", "Top Racer (with MB8841 + MB8842, 1983)", 0 ) // the only difference between them is the year displayed on the title screen
GAME( 1983, ppspeed, polepos, polepos, polepos, driver_device, 0, ROT0, "bootleg", "Speed Up (Spanish bootleg of Pole Position)", 0 ) // very close to topracer / topracera
GAME( 1982, topracern, polepos, topracern, topracern, polepos_state,topracern,ROT0, "bootleg", "Top Racer (no MB8841 + MB8842)", 0 )
GAME( 1983, polepos2, 0, polepos, polepos2, polepos_state, polepos2, ROT0, "Namco", "Pole Position II", 0 )

View File

@ -129,13 +129,6 @@ public:
/*----------- defined in video/konamigx.c -----------*/
// 2nd-Tier GX/MW Hardware Functions
void K053936GP_set_offset(int chip, int xoffs, int yoffs);
void K053936GP_clip_enable(int chip, int status);
void K053936GP_set_cliprect(int chip, int minx, int maxx, int miny, int maxy);
// 1st-Tier GX/MW Variables and Functions
extern UINT8 konamigx_wrport1_0, konamigx_wrport1_1;

View File

@ -794,6 +794,7 @@ polepos1 // 136014 (c) 1982 Atari
topracer // bootleg
topracera // bootleg
topracern // bootleg
ppspeed // bootleg
polepos2 // (c) 1983
polepos2a // 136014 (c) 1983 + Atari license
polepos2b // bootleg

View File

@ -7,6 +7,16 @@
#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
// Localized K053936/ROZ+
#define K053936_MAX_CHIPS 2
static rectangle K053936_cliprect[K053936_MAX_CHIPS];
static int K053936_offset[K053936_MAX_CHIPS][2] = {{0,0},{0,0}};
static int K053936_clip_enabled[K053936_MAX_CHIPS] = {0,0};
static int K053936_wraparound[K053936_MAX_CHIPS];
/***************************************************************************/
/* */
@ -65,13 +75,7 @@ additional control from extra RAM:
*/
#define K053936_MAX_CHIPS 2
static int K053936_offset[K053936_MAX_CHIPS][2];
static int K053936_wraparound[K053936_MAX_CHIPS];
// there is another implementation of this in machine/konamigx.c (!)
// why?
static void K053936_zoom_draw(int chip,UINT16 *ctrl,UINT16 *linectrl, bitmap_ind16 &bitmap,const rectangle &cliprect,tilemap_t *tmap,int flags,UINT32 priority, int glfgreat_hack)
{
@ -437,3 +441,281 @@ if (machine.input().code_pressed(KEYCODE_D))
}
void K053936GP_set_offset(int chip, int xoffs, int yoffs) { K053936_offset[chip][0] = xoffs; K053936_offset[chip][1] = yoffs; }
void K053936GP_clip_enable(int chip, int status) { K053936_clip_enabled[chip] = status; }
void K053936GP_set_cliprect(int chip, int minx, int maxx, int miny, int maxy)
{
rectangle &cliprect = K053936_cliprect[chip];
cliprect.set(minx, maxx, miny, maxy);
}
INLINE void K053936GP_copyroz32clip( running_machine &machine,
bitmap_rgb32 &dst_bitmap, bitmap_ind16 &src_bitmap,
const rectangle &dst_cliprect, const rectangle &src_cliprect,
UINT32 _startx,UINT32 _starty,int _incxx,int _incxy,int _incyx,int _incyy,
int tilebpp, int blend, int alpha, int clip, int pixeldouble_output )
{
static const int colormask[8]={1,3,7,0xf,0x1f,0x3f,0x7f,0xff};
int cy, cx;
int ecx;
int src_pitch, incxy, incxx;
int src_minx, src_maxx, src_miny, src_maxy, cmask;
UINT16 *src_base;
size_t src_size;
const pen_t *pal_base;
int dst_ptr;
int dst_size;
int dst_base2;
int tx, dst_pitch;
UINT32 *dst_base;
int starty, incyy, startx, incyx, ty, sx, sy;
incxy = _incxy; incxx = _incxx; incyy = _incyy; incyx = _incyx;
starty = _starty; startx = _startx;
if (clip) // set source clip range to some extreme values when disabled
{
src_minx = src_cliprect.min_x;
src_maxx = src_cliprect.max_x;
src_miny = src_cliprect.min_y;
src_maxy = src_cliprect.max_y;
}
// this simply isn't safe to do!
else { src_minx = src_miny = -0x10000; src_maxx = src_maxy = 0x10000; }
// set target clip range
sx = dst_cliprect.min_x;
tx = dst_cliprect.max_x - sx + 1;
sy = dst_cliprect.min_y;
ty = dst_cliprect.max_y - sy + 1;
startx += sx * incxx + sy * incyx;
starty += sx * incxy + sy * incyy;
// adjust entry points and other loop constants
dst_pitch = dst_bitmap.rowpixels();
dst_base = &dst_bitmap.pix32(0);
dst_base2 = sy * dst_pitch + sx + tx;
ecx = tx = -tx;
tilebpp = (tilebpp-1) & 7;
pal_base = machine.pens;
cmask = colormask[tilebpp];
src_pitch = src_bitmap.rowpixels();
src_base = &src_bitmap.pix16(0);
src_size = src_bitmap.width() * src_bitmap.height();
dst_size = dst_bitmap.width() * dst_bitmap.height();
dst_ptr = 0;//dst_base;
cy = starty;
cx = startx;
if (blend > 0)
{
dst_base += dst_pitch; // draw blended
starty += incyy;
startx += incyx;
do {
do {
int srcx = (cx >> 16) & 0x1fff;
int srcy = (cy >> 16) & 0x1fff;
int pixel;
UINT32 offs;
offs = srcy * src_pitch + srcx;
cx += incxx;
cy += incxy;
if (offs>=src_size)
continue;
if (srcx < src_minx || srcx > src_maxx || srcy < src_miny || srcy > src_maxy)
continue;
pixel = src_base[offs];
if (!(pixel & cmask))
continue;
if ((dst_ptr+ecx+dst_base2)<dst_size) dst_base[dst_ptr+ecx+dst_base2] = alpha_blend_r32(pal_base[pixel], dst_base[dst_ptr+ecx+dst_base2], alpha);
if (pixeldouble_output)
{
ecx++;
if ((dst_ptr+ecx+dst_base2)<dst_size) dst_base[dst_ptr+ecx+dst_base2] = alpha_blend_r32(pal_base[pixel], dst_base[dst_ptr+ecx+dst_base2], alpha);
}
}
while (++ecx < 0);
ecx = tx;
dst_ptr += dst_pitch;
cy = starty; starty += incyy;
cx = startx; startx += incyx;
} while (--ty);
}
else // draw solid
{
if (blend == 0)
{
dst_ptr += dst_pitch;
starty += incyy;
startx += incyx;
}
else
{
if ((sy & 1) ^ (blend & 1))
{
if (ty <= 1) return;
dst_ptr += dst_pitch;
cy += incyy;
cx += incyx;
}
if (ty > 1)
{
ty >>= 1;
dst_pitch <<= 1;
incyy <<= 1;
incyx <<= 1;
dst_ptr += dst_pitch;
starty = cy + incyy;
startx = cx + incyx;
}
}
do {
do {
int srcx = (cx >> 16) & 0x1fff;
int srcy = (cy >> 16) & 0x1fff;
int pixel;
UINT32 offs;
offs = srcy * src_pitch + srcx;
cx += incxx;
cy += incxy;
if (offs>=src_size)
continue;
if (srcx < src_minx || srcx > src_maxx || srcy < src_miny || srcy > src_maxy)
continue;
pixel = src_base[offs];
if (!(pixel & cmask))
continue;
if ((dst_ptr+ecx+dst_base2)<dst_size) dst_base[dst_ptr+ecx+dst_base2] = pal_base[pixel];
if (pixeldouble_output)
{
ecx++;
if ((dst_ptr+ecx+dst_base2)<dst_size) dst_base[dst_ptr+ecx+dst_base2] = pal_base[pixel];
}
}
while (++ecx < 0);
ecx = tx;
dst_ptr += dst_pitch;
cy = starty; starty += incyy;
cx = startx; startx += incyx;
} while (--ty);
}
}
// adapted from generic K053936_zoom_draw()
static void K053936GP_zoom_draw(running_machine &machine,
int chip, UINT16 *ctrl, UINT16 *linectrl,
bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tmap,
int tilebpp, int blend, int alpha, int pixeldouble_output)
{
UINT16 *lineaddr;
rectangle my_clip;
UINT32 startx, starty;
int incxx, incxy, incyx, incyy, y, maxy, clip;
bitmap_ind16 &src_bitmap = tmap->pixmap();
rectangle &src_cliprect = K053936_cliprect[chip];
clip = K053936_clip_enabled[chip];
if (ctrl[0x07] & 0x0040) /* "super" mode */
{
my_clip.min_x = cliprect.min_x;
my_clip.max_x = cliprect.max_x;
y = cliprect.min_y;
maxy = cliprect.max_y;
while (y <= maxy)
{
lineaddr = linectrl + ( ((y - K053936_offset[chip][1]) & 0x1ff) << 2);
my_clip.min_y = my_clip.max_y = y;
startx = (INT16)(lineaddr[0] + ctrl[0x00]) << 8;
starty = (INT16)(lineaddr[1] + ctrl[0x01]) << 8;
incxx = (INT16)(lineaddr[2]);
incxy = (INT16)(lineaddr[3]);
if (ctrl[0x06] & 0x8000) incxx <<= 8;
if (ctrl[0x06] & 0x0080) incxy <<= 8;
startx -= K053936_offset[chip][0] * incxx;
starty -= K053936_offset[chip][0] * incxy;
K053936GP_copyroz32clip(machine,
bitmap, src_bitmap, my_clip, src_cliprect,
startx<<5, starty<<5, incxx<<5, incxy<<5, 0, 0,
tilebpp, blend, alpha, clip, pixeldouble_output);
y++;
}
}
else /* "simple" mode */
{
startx = (INT16)(ctrl[0x00]) << 8;
starty = (INT16)(ctrl[0x01]) << 8;
incyx = (INT16)(ctrl[0x02]);
incyy = (INT16)(ctrl[0x03]);
incxx = (INT16)(ctrl[0x04]);
incxy = (INT16)(ctrl[0x05]);
if (ctrl[0x06] & 0x4000) { incyx <<= 8; incyy <<= 8; }
if (ctrl[0x06] & 0x0040) { incxx <<= 8; incxy <<= 8; }
startx -= K053936_offset[chip][1] * incyx;
starty -= K053936_offset[chip][1] * incyy;
startx -= K053936_offset[chip][0] * incxx;
starty -= K053936_offset[chip][0] * incxy;
K053936GP_copyroz32clip(machine,
bitmap, src_bitmap, cliprect, src_cliprect,
startx<<5, starty<<5, incxx<<5, incxy<<5, incyx<<5, incyy<<5,
tilebpp, blend, alpha, clip, pixeldouble_output);
}
}
void K053936GP_0_zoom_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect,
tilemap_t *tmap, int tilebpp, int blend, int alpha, int pixeldouble_output, UINT16* temp_m_k053936_0_ctrl_16, UINT16* temp_m_k053936_0_linectrl_16,UINT16* temp_m_k053936_0_ctrl, UINT16* temp_m_k053936_0_linectrl)
{
if (temp_m_k053936_0_ctrl_16)
{
K053936GP_zoom_draw(machine, 0,temp_m_k053936_0_ctrl_16,temp_m_k053936_0_linectrl_16,bitmap,cliprect,tmap,tilebpp,blend,alpha, pixeldouble_output);
}
else
{
K053936GP_zoom_draw(machine, 0,temp_m_k053936_0_ctrl,temp_m_k053936_0_linectrl,bitmap,cliprect,tmap,tilebpp,blend,alpha, pixeldouble_output);
}
}

View File

@ -12,13 +12,18 @@
extern UINT16 *K053936_0_ctrl,*K053936_0_linectrl;
//extern UINT16 *K053936_1_ctrl,*K053936_1_linectrl;
void K053936_0_zoom_draw(bitmap_ind16 &bitmap,const rectangle &cliprect,tilemap_t *tmap,int flags,UINT32 priority, int glfgreat_hack);
void K053936_wraparound_enable(int chip, int status);
void K053936_set_offset(int chip, int xoffs, int yoffs);
// GX specific implementations...
void K053936GP_set_offset(int chip, int xoffs, int yoffs);
void K053936GP_clip_enable(int chip, int status);
void K053936GP_set_cliprect(int chip, int minx, int maxx, int miny, int maxy);
void K053936GP_0_zoom_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tmap, int tilebpp, int blend, int alpha, int pixeldouble_output, UINT16* temp_m_k053936_0_ctrl_16, UINT16* temp_m_k053936_0_linectrl_16, UINT16* temp_m_k053936_0_ctrl, UINT16* temp_m_k053936_0_linectrl);
struct k053936_interface
{

View File

@ -74,299 +74,6 @@ static rectangle gxtype1_roz_dstbitmapclip;
static void (*game_tile_callback)(running_machine &machine, int layer, int *code, int *color, int *flags);
// Localized K053936/ROZ+
#define K053936_MAX_CHIPS 2
static rectangle K053936_cliprect[K053936_MAX_CHIPS];
static int K053936_offset[K053936_MAX_CHIPS][2] = {{0,0},{0,0}};
static int K053936_clip_enabled[K053936_MAX_CHIPS] = {0,0};
void K053936GP_set_offset(int chip, int xoffs, int yoffs) { K053936_offset[chip][0] = xoffs; K053936_offset[chip][1] = yoffs; }
void K053936GP_clip_enable(int chip, int status) { K053936_clip_enabled[chip] = status; }
void K053936GP_set_cliprect(int chip, int minx, int maxx, int miny, int maxy)
{
rectangle &cliprect = K053936_cliprect[chip];
cliprect.set(minx, maxx, miny, maxy);
}
INLINE void K053936GP_copyroz32clip( running_machine &machine,
bitmap_rgb32 &dst_bitmap, bitmap_ind16 &src_bitmap,
const rectangle &dst_cliprect, const rectangle &src_cliprect,
UINT32 _startx,UINT32 _starty,int _incxx,int _incxy,int _incyx,int _incyy,
int tilebpp, int blend, int alpha, int clip, int pixeldouble_output )
{
static const int colormask[8]={1,3,7,0xf,0x1f,0x3f,0x7f,0xff};
int cy, cx;
int ecx;
int src_pitch, incxy, incxx;
int src_minx, src_maxx, src_miny, src_maxy, cmask;
UINT16 *src_base;
size_t src_size;
const pen_t *pal_base;
int dst_ptr;
int dst_size;
int dst_base2;
int tx, dst_pitch;
UINT32 *dst_base;
int starty, incyy, startx, incyx, ty, sx, sy;
incxy = _incxy; incxx = _incxx; incyy = _incyy; incyx = _incyx;
starty = _starty; startx = _startx;
if (clip) // set source clip range to some extreme values when disabled
{
src_minx = src_cliprect.min_x;
src_maxx = src_cliprect.max_x;
src_miny = src_cliprect.min_y;
src_maxy = src_cliprect.max_y;
}
// this simply isn't safe to do!
else { src_minx = src_miny = -0x10000; src_maxx = src_maxy = 0x10000; }
// set target clip range
sx = dst_cliprect.min_x;
tx = dst_cliprect.max_x - sx + 1;
sy = dst_cliprect.min_y;
ty = dst_cliprect.max_y - sy + 1;
startx += sx * incxx + sy * incyx;
starty += sx * incxy + sy * incyy;
// adjust entry points and other loop constants
dst_pitch = dst_bitmap.rowpixels();
dst_base = &dst_bitmap.pix32(0);
dst_base2 = sy * dst_pitch + sx + tx;
ecx = tx = -tx;
tilebpp = (tilebpp-1) & 7;
pal_base = machine.pens;
cmask = colormask[tilebpp];
src_pitch = src_bitmap.rowpixels();
src_base = &src_bitmap.pix16(0);
src_size = src_bitmap.width() * src_bitmap.height();
dst_size = dst_bitmap.width() * dst_bitmap.height();
dst_ptr = 0;//dst_base;
cy = starty;
cx = startx;
if (blend > 0)
{
dst_base += dst_pitch; // draw blended
starty += incyy;
startx += incyx;
do {
do {
int srcx = (cx >> 16) & 0x1fff;
int srcy = (cy >> 16) & 0x1fff;
int pixel;
UINT32 offs;
offs = srcy * src_pitch + srcx;
cx += incxx;
cy += incxy;
if (offs>=src_size)
continue;
if (srcx < src_minx || srcx > src_maxx || srcy < src_miny || srcy > src_maxy)
continue;
pixel = src_base[offs];
if (!(pixel & cmask))
continue;
if ((dst_ptr+ecx+dst_base2)<dst_size) dst_base[dst_ptr+ecx+dst_base2] = alpha_blend_r32(pal_base[pixel], dst_base[dst_ptr+ecx+dst_base2], alpha);
if (pixeldouble_output)
{
ecx++;
if ((dst_ptr+ecx+dst_base2)<dst_size) dst_base[dst_ptr+ecx+dst_base2] = alpha_blend_r32(pal_base[pixel], dst_base[dst_ptr+ecx+dst_base2], alpha);
}
}
while (++ecx < 0);
ecx = tx;
dst_ptr += dst_pitch;
cy = starty; starty += incyy;
cx = startx; startx += incyx;
} while (--ty);
}
else // draw solid
{
if (blend == 0)
{
dst_ptr += dst_pitch;
starty += incyy;
startx += incyx;
}
else
{
if ((sy & 1) ^ (blend & 1))
{
if (ty <= 1) return;
dst_ptr += dst_pitch;
cy += incyy;
cx += incyx;
}
if (ty > 1)
{
ty >>= 1;
dst_pitch <<= 1;
incyy <<= 1;
incyx <<= 1;
dst_ptr += dst_pitch;
starty = cy + incyy;
startx = cx + incyx;
}
}
do {
do {
int srcx = (cx >> 16) & 0x1fff;
int srcy = (cy >> 16) & 0x1fff;
int pixel;
UINT32 offs;
offs = srcy * src_pitch + srcx;
cx += incxx;
cy += incxy;
if (offs>=src_size)
continue;
if (srcx < src_minx || srcx > src_maxx || srcy < src_miny || srcy > src_maxy)
continue;
pixel = src_base[offs];
if (!(pixel & cmask))
continue;
if ((dst_ptr+ecx+dst_base2)<dst_size) dst_base[dst_ptr+ecx+dst_base2] = pal_base[pixel];
if (pixeldouble_output)
{
ecx++;
if ((dst_ptr+ecx+dst_base2)<dst_size) dst_base[dst_ptr+ecx+dst_base2] = pal_base[pixel];
}
}
while (++ecx < 0);
ecx = tx;
dst_ptr += dst_pitch;
cy = starty; starty += incyy;
cx = startx; startx += incyx;
} while (--ty);
}
}
// adapted from generic K053936_zoom_draw()
static void K053936GP_zoom_draw(running_machine &machine,
int chip, UINT16 *ctrl, UINT16 *linectrl,
bitmap_rgb32 &bitmap, const rectangle &cliprect, tilemap_t *tmap,
int tilebpp, int blend, int alpha, int pixeldouble_output)
{
UINT16 *lineaddr;
rectangle my_clip;
UINT32 startx, starty;
int incxx, incxy, incyx, incyy, y, maxy, clip;
bitmap_ind16 &src_bitmap = tmap->pixmap();
rectangle &src_cliprect = K053936_cliprect[chip];
clip = K053936_clip_enabled[chip];
if (ctrl[0x07] & 0x0040) /* "super" mode */
{
my_clip.min_x = cliprect.min_x;
my_clip.max_x = cliprect.max_x;
y = cliprect.min_y;
maxy = cliprect.max_y;
while (y <= maxy)
{
lineaddr = linectrl + ( ((y - K053936_offset[chip][1]) & 0x1ff) << 2);
my_clip.min_y = my_clip.max_y = y;
startx = (INT16)(lineaddr[0] + ctrl[0x00]) << 8;
starty = (INT16)(lineaddr[1] + ctrl[0x01]) << 8;
incxx = (INT16)(lineaddr[2]);
incxy = (INT16)(lineaddr[3]);
if (ctrl[0x06] & 0x8000) incxx <<= 8;
if (ctrl[0x06] & 0x0080) incxy <<= 8;
startx -= K053936_offset[chip][0] * incxx;
starty -= K053936_offset[chip][0] * incxy;
K053936GP_copyroz32clip(machine,
bitmap, src_bitmap, my_clip, src_cliprect,
startx<<5, starty<<5, incxx<<5, incxy<<5, 0, 0,
tilebpp, blend, alpha, clip, pixeldouble_output);
y++;
}
}
else /* "simple" mode */
{
startx = (INT16)(ctrl[0x00]) << 8;
starty = (INT16)(ctrl[0x01]) << 8;
incyx = (INT16)(ctrl[0x02]);
incyy = (INT16)(ctrl[0x03]);
incxx = (INT16)(ctrl[0x04]);
incxy = (INT16)(ctrl[0x05]);
if (ctrl[0x06] & 0x4000) { incyx <<= 8; incyy <<= 8; }
if (ctrl[0x06] & 0x0040) { incxx <<= 8; incxy <<= 8; }
startx -= K053936_offset[chip][1] * incyx;
starty -= K053936_offset[chip][1] * incyy;
startx -= K053936_offset[chip][0] * incxx;
starty -= K053936_offset[chip][0] * incxy;
K053936GP_copyroz32clip(machine,
bitmap, src_bitmap, cliprect, src_cliprect,
startx<<5, starty<<5, incxx<<5, incxy<<5, incyx<<5, incyy<<5,
tilebpp, blend, alpha, clip, pixeldouble_output);
}
}
static void K053936GP_0_zoom_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect,
tilemap_t *tmap, int tilebpp, int blend, int alpha, int pixeldouble_output)
{
konamigx_state *state = machine.driver_data<konamigx_state>();
if (state->m_k053936_0_ctrl_16)
{
K053936GP_zoom_draw(machine, 0,state->m_k053936_0_ctrl_16,state->m_k053936_0_linectrl_16,bitmap,cliprect,tmap,tilebpp,blend,alpha, pixeldouble_output);
}
else
{
K053936GP_zoom_draw(machine, 0,state->m_k053936_0_ctrl,state->m_k053936_0_linectrl,bitmap,cliprect,tmap,tilebpp,blend,alpha, pixeldouble_output);
}
}
static void K053936GP_1_zoom_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect,
tilemap_t *tmap, int tilebpp, int blend, int alpha, int pixeldouble_output)
{
// konamigx_state *state = machine.driver_data<konamigx_state>();
// K053936GP_zoom_draw(machine, 1,K053936_1_ctrl,K053936_1_linectrl,bitmap,cliprect,tmap,tilebpp,blend,alpha, pixeldouble_output);
}
/*
Parameter Notes
@ -1588,7 +1295,7 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
if (width>512) // vsnetscr case
pixeldouble_output = 1;
K053936GP_0_zoom_draw(machine, bitmap, cliprect, sub1, l, k, alpha, pixeldouble_output);
K053936GP_0_zoom_draw(machine, bitmap, cliprect, sub1, l, k, alpha, pixeldouble_output, m_k053936_0_ctrl_16, m_k053936_0_linectrl_16, m_k053936_0_ctrl, m_k053936_0_linectrl);
}
else
{
@ -1600,7 +1307,7 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
case -5:
if (disp & K55_INP_SUB2)
{
int alpha = 255;
//int alpha = 255;
if (j == GXMIX_BLEND_NONE) { temp1 = 0xff; temp2 = temp3 = 0; } else
if (j == GXMIX_BLEND_FORCE) { temp1 = 0x00; temp2 = mixerflags>>26; temp3 = 3; }
else
@ -1649,8 +1356,8 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
}
else
{
int pixeldouble_output = 0;
K053936GP_1_zoom_draw(machine, bitmap, cliprect, sub2, l, k, alpha, pixeldouble_output);
// int pixeldouble_output = 0;
// K053936GP_1_zoom_draw(machine, bitmap, cliprect, sub2, l, k, alpha, pixeldouble_output);
}
}
else