mirror of
https://github.com/holub/mame
synced 2025-04-29 11:30:28 +03:00
I wish I had something even remotely polite to say about this code.... (nw)
This commit is contained in:
parent
4254bc0d11
commit
873d0f9c56
@ -112,10 +112,17 @@ public:
|
|||||||
void _gxcommoninitnosprites(running_machine &machine);
|
void _gxcommoninitnosprites(running_machine &machine);
|
||||||
void _gxcommoninit(running_machine &machine);
|
void _gxcommoninit(running_machine &machine);
|
||||||
DECLARE_READ32_MEMBER( k_6bpp_rom_long_r );
|
DECLARE_READ32_MEMBER( k_6bpp_rom_long_r );
|
||||||
void konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect,
|
void konamigx_mixer (running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect,tilemap_t *sub1, int sub1flags,tilemap_t *sub2, int sub2flags,int mixerflags, bitmap_ind16 *extra_bitmap, int rushingheroes_hack);
|
||||||
tilemap_t *sub1, int sub1flags,
|
void konamigx_mixer_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect,
|
||||||
tilemap_t *sub2, int sub2flags,
|
tilemap_t *sub1, int sub1flags,
|
||||||
int mixerflags, bitmap_ind16 *extra_bitmap, int rushingheroes_hack);
|
tilemap_t *sub2, int sub2flags,
|
||||||
|
int mixerflags, bitmap_ind16 *extra_bitmap, int rushingheroes_hack,
|
||||||
|
int flipscreenx, int flipscreeny, int offx, int offy, int wrapsize, int xwraplim, int ywraplim,
|
||||||
|
struct GX_OBJ *objpool,
|
||||||
|
int *objbuf,
|
||||||
|
int nobj
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
void konamigx_esc_alert(UINT32 *srcbase, int srcoffs, int count, int mode);
|
void konamigx_esc_alert(UINT32 *srcbase, int srcoffs, int count, int mode);
|
||||||
void konamigx_precache_registers(void);
|
void konamigx_precache_registers(void);
|
||||||
|
@ -876,19 +876,13 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
tilemap_t *sub2, int sub2flags,
|
tilemap_t *sub2, int sub2flags,
|
||||||
int mixerflags, bitmap_ind16 *extra_bitmap, int rushingheroes_hack)
|
int mixerflags, bitmap_ind16 *extra_bitmap, int rushingheroes_hack)
|
||||||
{
|
{
|
||||||
static const int xoffset[8] = { 0, 1, 4, 5, 16, 17, 20, 21 };
|
|
||||||
static const int yoffset[8] = { 0, 2, 8, 10, 32, 34, 40, 42 };
|
|
||||||
static int parity = 0;
|
|
||||||
|
|
||||||
int objbuf[GX_MAX_OBJECTS];
|
int objbuf[GX_MAX_OBJECTS];
|
||||||
int shadowon[3], shdpri[3], layerid[6], layerpri[6];
|
int shadowon[3], shdpri[3], layerid[6], layerpri[6];
|
||||||
|
int flipscreenx, flipscreeny, offx, offy;
|
||||||
|
|
||||||
struct GX_OBJ *objpool, *objptr;
|
struct GX_OBJ *objpool, *objptr;
|
||||||
int wrapsize, xwraplim, ywraplim, cltc_shdpri, /*prflp,*/ disp;
|
int wrapsize, xwraplim, ywraplim, cltc_shdpri, /*prflp,*/ disp;
|
||||||
int xa,ya,ox,oy,zw,zh,flipx,flipy,mirrorx,mirrory,zoomx,zoomy,scalex,scaley,nozoom;
|
|
||||||
int screenwidth, flipscreenx, flipscreeny, offx, offy;
|
|
||||||
int nobj, i, j, k, l, temp, temp1, temp2, temp3, temp4, count;
|
|
||||||
int order, offs, code, color, zcode, pri = 0, spri, spri_min, shdprisel, shadow, alpha, drawmode;
|
|
||||||
|
|
||||||
// buffer can move when it's resized, so refresh the pointer
|
// buffer can move when it's resized, so refresh the pointer
|
||||||
gx_objzbuf = &machine.priority_bitmap.pix8(0);
|
gx_objzbuf = &machine.priority_bitmap.pix8(0);
|
||||||
@ -899,7 +893,7 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
|
|
||||||
// clear screen with backcolor and update flicker pulse
|
// clear screen with backcolor and update flicker pulse
|
||||||
K054338_fill_backcolor(machine, bitmap, konamigx_wrport1_0 & 0x20);
|
K054338_fill_backcolor(machine, bitmap, konamigx_wrport1_0 & 0x20);
|
||||||
parity ^= 1;
|
|
||||||
|
|
||||||
// abort if video has been disabled
|
// abort if video has been disabled
|
||||||
disp = m_k055555->K055555_read_register(K55_INPUT_ENABLES);
|
disp = m_k055555->K055555_read_register(K55_INPUT_ENABLES);
|
||||||
@ -958,6 +952,8 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
layerpri[4] = m_k055555->K055555_read_register(K55_PRIINP_9);
|
layerpri[4] = m_k055555->K055555_read_register(K55_PRIINP_9);
|
||||||
layerpri[5] = m_k055555->K055555_read_register(K55_PRIINP_10);
|
layerpri[5] = m_k055555->K055555_read_register(K55_PRIINP_10);
|
||||||
|
|
||||||
|
int shdprisel;
|
||||||
|
|
||||||
if (gx_primode == -1)
|
if (gx_primode == -1)
|
||||||
{
|
{
|
||||||
// Lethal Enforcer hack (requires pixel color comparison)
|
// Lethal Enforcer hack (requires pixel color comparison)
|
||||||
@ -979,11 +975,14 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
shdpri[1] = m_k055555->K055555_read_register(K55_SHAD2_PRI);
|
shdpri[1] = m_k055555->K055555_read_register(K55_SHAD2_PRI);
|
||||||
shdpri[2] = m_k055555->K055555_read_register(K55_SHAD3_PRI);
|
shdpri[2] = m_k055555->K055555_read_register(K55_SHAD3_PRI);
|
||||||
|
|
||||||
spri_min = 0;
|
int spri_min = 0;
|
||||||
|
|
||||||
shadowon[2] = shadowon[1] = shadowon[0] = 0;
|
shadowon[2] = shadowon[1] = shadowon[0] = 0;
|
||||||
|
|
||||||
|
int k = 0;
|
||||||
if (!(mixerflags & GXMIX_NOSHADOW))
|
if (!(mixerflags & GXMIX_NOSHADOW))
|
||||||
{
|
{
|
||||||
|
int i,j;
|
||||||
// only enable shadows beyond a +/-7 RGB threshold
|
// only enable shadows beyond a +/-7 RGB threshold
|
||||||
for (j=0,i=0; i<3; j+=3,i++)
|
for (j=0,i=0; i<3; j+=3,i++)
|
||||||
{
|
{
|
||||||
@ -993,7 +992,7 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SHDON specifies layers on which shadows can be projected (see detail on p.65 7.2.8)
|
// SHDON specifies layers on which shadows can be projected (see detail on p.65 7.2.8)
|
||||||
temp = m_k055555->K055555_read_register(K55_SHD_ON);
|
int temp = m_k055555->K055555_read_register(K55_SHD_ON);
|
||||||
for (i=0; i<4; i++) if (!(temp>>i & 1) && spri_min < layerpri[i]) spri_min = layerpri[i]; // HACK
|
for (i=0; i<4; i++) if (!(temp>>i & 1) && spri_min < layerpri[i]) spri_min = layerpri[i]; // HACK
|
||||||
|
|
||||||
// update shadows status
|
// update shadows status
|
||||||
@ -1001,12 +1000,12 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
}
|
}
|
||||||
|
|
||||||
// pre-sort layers
|
// pre-sort layers
|
||||||
for (j=0; j<5; j++)
|
for (int j=0; j<5; j++)
|
||||||
{
|
{
|
||||||
temp1 = layerpri[j];
|
int temp1 = layerpri[j];
|
||||||
for (i=j+1; i<6; i++)
|
for (int i=j+1; i<6; i++)
|
||||||
{
|
{
|
||||||
temp2 = layerpri[i];
|
int temp2 = layerpri[i];
|
||||||
if ((UINT32)temp1 <= (UINT32)temp2)
|
if ((UINT32)temp1 <= (UINT32)temp2)
|
||||||
{
|
{
|
||||||
layerpri[i] = temp1; layerpri[j] = temp1 = temp2;
|
layerpri[i] = temp1; layerpri[j] = temp1 = temp2;
|
||||||
@ -1017,11 +1016,13 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
|
|
||||||
// build object database and create indices
|
// build object database and create indices
|
||||||
objptr = objpool;
|
objptr = objpool;
|
||||||
nobj = 0;
|
int nobj = 0;
|
||||||
|
|
||||||
for (i=5; i>=0; i--)
|
for (int i=5; i>=0; i--)
|
||||||
{
|
{
|
||||||
code = layerid[i];
|
int offs;
|
||||||
|
|
||||||
|
int code = layerid[i];
|
||||||
switch (code)
|
switch (code)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -1058,19 +1059,22 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
i = j = 0xff;
|
// i = j = 0xff;
|
||||||
|
int l = 0;
|
||||||
|
|
||||||
for (offs=0; offs<0x800; offs+=8)
|
for (int offs=0; offs<0x800; offs+=8)
|
||||||
{
|
{
|
||||||
|
int pri = 0;
|
||||||
|
|
||||||
if (!(gx_spriteram[offs] & 0x8000)) continue;
|
if (!(gx_spriteram[offs] & 0x8000)) continue;
|
||||||
|
|
||||||
zcode = gx_spriteram[offs] & 0xff;
|
int zcode = gx_spriteram[offs] & 0xff;
|
||||||
|
|
||||||
// invert z-order when opset_pri is set (see p.51 OPSET PRI)
|
// invert z-order when opset_pri is set (see p.51 OPSET PRI)
|
||||||
if (k053247_opset & 0x10) zcode = 0xff - zcode;
|
if (k053247_opset & 0x10) zcode = 0xff - zcode;
|
||||||
|
|
||||||
code = gx_spriteram[offs+1];
|
int code = gx_spriteram[offs+1];
|
||||||
color = k = gx_spriteram[offs+6];
|
int color = k = gx_spriteram[offs+6];
|
||||||
l = gx_spriteram[offs+7];
|
l = gx_spriteram[offs+7];
|
||||||
|
|
||||||
(*k053247_callback)(machine, &code, &color, &pri);
|
(*k053247_callback)(machine, &code, &color, &pri);
|
||||||
@ -1083,7 +1087,12 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
temp3 = add shadow object
|
temp3 = add shadow object
|
||||||
temp4 = shadow pens draw mode
|
temp4 = shadow pens draw mode
|
||||||
*/
|
*/
|
||||||
temp4 = temp3 = temp2 = temp1 = spri = shadow = 0;
|
int temp4 = 0;
|
||||||
|
int temp3 = 0;
|
||||||
|
int temp2 = 0;
|
||||||
|
int temp1 = 0;
|
||||||
|
int spri = 0;
|
||||||
|
int shadow = 0;
|
||||||
|
|
||||||
if (color & K055555_FULLSHADOW)
|
if (color & K055555_FULLSHADOW)
|
||||||
{
|
{
|
||||||
@ -1165,7 +1174,7 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
if (temp1)
|
if (temp1)
|
||||||
{
|
{
|
||||||
// add objects with solid or alpha pens
|
// add objects with solid or alpha pens
|
||||||
order = pri<<24 | zcode<<16 | offs<<(8-3) | temp2<<4;
|
int order = pri<<24 | zcode<<16 | offs<<(8-3) | temp2<<4;
|
||||||
objptr->order = order;
|
objptr->order = order;
|
||||||
objptr->offs = offs;
|
objptr->offs = offs;
|
||||||
objptr->code = code;
|
objptr->code = code;
|
||||||
@ -1179,7 +1188,7 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
if (temp3 && !(color & K055555_SKIPSHADOW) && !(mixerflags & GXMIX_NOSHADOW))
|
if (temp3 && !(color & K055555_SKIPSHADOW) && !(mixerflags & GXMIX_NOSHADOW))
|
||||||
{
|
{
|
||||||
// add objects with shadows if enabled
|
// add objects with shadows if enabled
|
||||||
order = spri<<24 | zcode<<16 | offs<<(8-3) | temp4<<4 | shadow;
|
int order = spri<<24 | zcode<<16 | offs<<(8-3) | temp4<<4 | shadow;
|
||||||
objptr->order = order;
|
objptr->order = order;
|
||||||
objptr->offs = offs;
|
objptr->offs = offs;
|
||||||
objptr->code = code;
|
objptr->code = code;
|
||||||
@ -1195,24 +1204,58 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
k = nobj;
|
k = nobj;
|
||||||
l = nobj - 1;
|
l = nobj - 1;
|
||||||
|
|
||||||
for (j=0; j<l; j++)
|
for (int j=0; j<l; j++)
|
||||||
{
|
{
|
||||||
temp1 = objbuf[j];
|
int temp1 = objbuf[j];
|
||||||
temp2 = objpool[temp1].order;
|
int temp2 = objpool[temp1].order;
|
||||||
for (i=j+1; i<k; i++)
|
for (int i=j+1; i<k; i++)
|
||||||
{
|
{
|
||||||
temp3 = objbuf[i];
|
int temp3 = objbuf[i];
|
||||||
temp4 = objpool[temp3].order;
|
int temp4 = objpool[temp3].order;
|
||||||
if ((UINT32)temp2 <= (UINT32)temp4) { temp2 = temp4; objbuf[i] = temp1; objbuf[j] = temp1 = temp3; }
|
if ((UINT32)temp2 <= (UINT32)temp4) { temp2 = temp4; objbuf[i] = temp1; objbuf[j] = temp1 = temp3; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// traverse draw list
|
|
||||||
screenwidth = machine.primary_screen->width();
|
|
||||||
|
|
||||||
for (count=0; count<nobj; count++)
|
konamigx_mixer_draw(machine,bitmap,cliprect,sub1,sub1flags,sub2,sub2flags,mixerflags,extra_bitmap,rushingheroes_hack,
|
||||||
|
flipscreenx, flipscreeny, offx, offy, wrapsize, xwraplim, ywraplim,
|
||||||
|
objpool,
|
||||||
|
objbuf,
|
||||||
|
nobj
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void konamigx_state::konamigx_mixer_draw(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect,
|
||||||
|
tilemap_t *sub1, int sub1flags,
|
||||||
|
tilemap_t *sub2, int sub2flags,
|
||||||
|
int mixerflags, bitmap_ind16 *extra_bitmap, int rushingheroes_hack,
|
||||||
|
|
||||||
|
/* passed from above function */
|
||||||
|
int flipscreenx, int flipscreeny, int offx, int offy, int wrapsize, int xwraplim, int ywraplim,
|
||||||
|
struct GX_OBJ *objpool,
|
||||||
|
int *objbuf,
|
||||||
|
int nobj
|
||||||
|
)
|
||||||
|
{
|
||||||
|
static int parity = 0;
|
||||||
|
parity ^= 1;
|
||||||
|
|
||||||
|
|
||||||
|
static const int xoffset[8] = { 0, 1, 4, 5, 16, 17, 20, 21 };
|
||||||
|
static const int yoffset[8] = { 0, 2, 8, 10, 32, 34, 40, 42 };
|
||||||
|
int xa,ya,ox,oy,zw,zh,flipx,flipy,mirrorx,mirrory,zoomx,zoomy,scalex,scaley,nozoom;
|
||||||
|
int temp, temp1, temp2, temp3, temp4;
|
||||||
|
int order, offs, code, color, zcode, pri = 0, alpha, drawmode;
|
||||||
|
|
||||||
|
|
||||||
|
// traverse draw list
|
||||||
|
int screenwidth = machine.primary_screen->width();
|
||||||
|
int disp = m_k055555->K055555_read_register(K55_INPUT_ENABLES);
|
||||||
|
|
||||||
|
for (int count=0; count<nobj; count++)
|
||||||
{
|
{
|
||||||
objptr = objpool + objbuf[count];
|
struct GX_OBJ *objptr = objpool + objbuf[count];
|
||||||
order = objptr->order;
|
order = objptr->order;
|
||||||
offs = objptr->offs;
|
offs = objptr->offs;
|
||||||
code = objptr->code;
|
code = objptr->code;
|
||||||
@ -1224,9 +1267,9 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
i = code<<1;
|
int i = code<<1;
|
||||||
j = mixerflags>>i & 3;
|
int j = mixerflags>>i & 3;
|
||||||
k = 0;
|
int k = 0;
|
||||||
|
|
||||||
switch (offs)
|
switch (offs)
|
||||||
{
|
{
|
||||||
@ -1284,7 +1327,7 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
if (temp4 < 255) k = (j == GXMIX_BLEND_FAST) ? ~parity : 1;
|
if (temp4 < 255) k = (j == GXMIX_BLEND_FAST) ? ~parity : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
l = sub1flags & 0xf;
|
int l = sub1flags & 0xf;
|
||||||
|
|
||||||
if (offs == -2)
|
if (offs == -2)
|
||||||
{
|
{
|
||||||
@ -1325,7 +1368,7 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
if (temp4 < 255) k = (j == GXMIX_BLEND_FAST) ? ~parity : 1;
|
if (temp4 < 255) k = (j == GXMIX_BLEND_FAST) ? ~parity : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
l = sub2flags & 0xf;
|
int l = sub2flags & 0xf;
|
||||||
|
|
||||||
if (offs == -3)
|
if (offs == -3)
|
||||||
{
|
{
|
||||||
@ -1449,19 +1492,19 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
|
|
||||||
|
|
||||||
temp = temp4>>8 & 0x0f;
|
temp = temp4>>8 & 0x0f;
|
||||||
k = 1 << (temp & 3);
|
int k = 1 << (temp & 3);
|
||||||
l = 1 << (temp>>2 & 3);
|
int l = 1 << (temp>>2 & 3);
|
||||||
|
|
||||||
ox -= (zoomx * k) >> 13;
|
ox -= (zoomx * k) >> 13;
|
||||||
oy -= (zoomy * l) >> 13;
|
oy -= (zoomy * l) >> 13;
|
||||||
|
|
||||||
// substitutes: i=x, j=y, k=w, l=h, temp=code, temp1=fx, temp2=fy, temp3=sx, temp4=sy;
|
// substitutes: i=x, j=y, k=w, l=h, temp=code, temp1=fx, temp2=fy, temp3=sx, temp4=sy;
|
||||||
for (j=0; j<l; j++)
|
for (int j=0; j<l; j++)
|
||||||
{
|
{
|
||||||
temp4 = oy + ((zoomy * j + (1<<11)) >> 12);
|
temp4 = oy + ((zoomy * j + (1<<11)) >> 12);
|
||||||
zh = (oy + ((zoomy * (j+1) + (1<<11)) >> 12)) - temp4;
|
zh = (oy + ((zoomy * (j+1) + (1<<11)) >> 12)) - temp4;
|
||||||
|
|
||||||
for (i=0; i<k; i++)
|
for (int i=0; i<k; i++)
|
||||||
{
|
{
|
||||||
temp3 = ox + ((zoomx * i + (1<<11)) >> 12);
|
temp3 = ox + ((zoomx * i + (1<<11)) >> 12);
|
||||||
zw = (ox + ((zoomx * (i+1) + (1<<11)) >> 12)) - temp3;
|
zw = (ox + ((zoomx * (i+1) + (1<<11)) >> 12)) - temp3;
|
||||||
@ -1524,9 +1567,6 @@ void konamigx_state::konamigx_mixer(running_machine &machine, bitmap_rgb32 &bitm
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Run and Gun 2 / Rushing Heroes */
|
/* Run and Gun 2 / Rushing Heroes */
|
||||||
TILE_GET_INFO_MEMBER(konamigx_state::get_gx_psac_tile_info)
|
TILE_GET_INFO_MEMBER(konamigx_state::get_gx_psac_tile_info)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user