Fix NCLIP related crash

- provide wider window where NCLIP can return 0 as this was causing a crash in RR:Revolution
This commit is contained in:
iCatButler 2016-08-01 13:10:53 +01:00
parent 69f33a4782
commit aafb74a6af
3 changed files with 30 additions and 26 deletions

View File

@ -481,7 +481,7 @@ int docop2(int op) {
case 0x00:
case 0x01:
#ifdef GTE_LOG
GTE_LOG("%08x RTPS", op);
GTE_LOG("%08x GTE: RTPS|", op);
#endif
MAC1 = A1(/*int44*/(s64)((s64) TRX << 12) + (R11 * VX0) + (R12 * VY0) + (R13 * VZ0));
@ -512,9 +512,9 @@ int docop2(int op) {
case 0x06:
#ifdef GTE_LOG
GTE_LOG("%08x NCLIP", op);
GTE_LOG("%08x GTE: NCLIP|", op);
#endif
if (PGXP_NLCIP_valid())
if (PGXP_NLCIP_valid(SXY0, SXY1, SXY2))
MAC0 = F(PGXP_NCLIP());
else
MAC0 = F((s64) (SX0 * SY1) + (SX1 * SY2) + (SX2 * SY0) - (SX0 * SY2) - (SX1 * SY0) - (SX2 * SY1));
@ -522,7 +522,7 @@ int docop2(int op) {
case 0x0c:
#ifdef GTE_LOG
GTE_LOG("%08x OP", op);
GTE_LOG("%08x GTE: OP|", op);
#endif
MAC1 = A1((s64) (R22 * IR3) - (R33 * IR2));
@ -535,7 +535,7 @@ int docop2(int op) {
case 0x10:
#ifdef GTE_LOG
GTE_LOG("%08x DPCS", op);
GTE_LOG("%08x GTE: DPCS|", op);
#endif
MAC1 = A1((R << 16) + (IR0 * Lm_B1(A1(((s64) RFC << 12) - (R << 16)), 0)));
@ -554,7 +554,7 @@ int docop2(int op) {
case 0x11:
#ifdef GTE_LOG
GTE_LOG("%08x INTPL", op);
GTE_LOG("%08x GTE: INTPL|", op);
#endif
MAC1 = A1((IR1 << 12) + (IR0 * Lm_B1(A1(((s64) RFC << 12) - (IR1 << 12)), 0)));
@ -573,7 +573,7 @@ int docop2(int op) {
case 0x12:
#ifdef GTE_LOG
GTE_LOG("%08x MVMVA", op);
GTE_LOG("%08x GTE: MVMVA|", op);
#endif
mx = GTE_MX(gteop);
@ -604,7 +604,7 @@ int docop2(int op) {
case 0x13:
#ifdef GTE_LOG
GTE_LOG("%08x NCDS", op);
GTE_LOG("%08x GTE: NCDS|", op);
#endif
MAC1 = A1((s64) (L11 * VX0) + (L12 * VY0) + (L13 * VZ0));
@ -635,7 +635,7 @@ int docop2(int op) {
case 0x14:
#ifdef GTE_LOG
GTE_LOG("%08x CDP", op);
GTE_LOG("%08x GTE: CDP|", op);
#endif
MAC1 = A1(/*int44*/(s64)((s64) RBK << 12) + (LR1 * IR1) + (LR2 * IR2) + (LR3 * IR3));
@ -660,7 +660,7 @@ int docop2(int op) {
case 0x16:
#ifdef GTE_LOG
GTE_LOG("%08x NCDT", op);
GTE_LOG("%08x GTE: NCDT|", op);
#endif
for(v = 0; v < 3; v++) {
@ -693,7 +693,7 @@ int docop2(int op) {
case 0x1b:
#ifdef GTE_LOG
GTE_LOG("%08x NCCS", op);
GTE_LOG("%08x GTE: NCCS|", op);
#endif
MAC1 = A1((s64) (L11 * VX0) + (L12 * VY0) + (L13 * VZ0));
@ -724,7 +724,7 @@ int docop2(int op) {
case 0x1c:
#ifdef GTE_LOG
GTE_LOG("%08x CC", op);
GTE_LOG("%08x GTE: CC|", op);
#endif
MAC1 = A1(/*int44*/(s64)(((s64) RBK) << 12) + (LR1 * IR1) + (LR2 * IR2) + (LR3 * IR3));
@ -749,7 +749,7 @@ int docop2(int op) {
case 0x1e:
#ifdef GTE_LOG
GTE_LOG("%08x NCS", op);
GTE_LOG("%08x GTE: NCS|", op);
#endif
MAC1 = A1((s64) (L11 * VX0) + (L12 * VY0) + (L13 * VZ0));
@ -774,7 +774,7 @@ int docop2(int op) {
case 0x20:
#ifdef GTE_LOG
GTE_LOG("%08x NCT", op);
GTE_LOG("%08x GTE: NCT|", op);
#endif
for(v = 0; v < 3; v++) {
@ -801,7 +801,7 @@ int docop2(int op) {
case 0x28:
#ifdef GTE_LOG
GTE_LOG("%08x SQR", op);
GTE_LOG("%08x GTE: SQR|", op);
#endif
MAC1 = A1(IR1 * IR1);
@ -814,7 +814,7 @@ int docop2(int op) {
case 0x29:
#ifdef GTE_LOG
GTE_LOG("%08x DPCL", op);
GTE_LOG("%08x GTE: DPCL|", op);
#endif
MAC1 = A1(((R << 4) * IR1) + (IR0 * Lm_B1(A1(((s64) RFC << 12) - ((R << 4) * IR1)), 0)));
@ -833,7 +833,7 @@ int docop2(int op) {
case 0x2a:
#ifdef GTE_LOG
GTE_LOG("%08x DPCT", op);
GTE_LOG("%08x GTE: DPCT|", op);
#endif
for(v = 0; v < 3; v++) {
@ -854,7 +854,7 @@ int docop2(int op) {
case 0x2d:
#ifdef GTE_LOG
GTE_LOG("%08x AVSZ3", op);
GTE_LOG("%08x GTE: AVSZ3|", op);
#endif
MAC0 = F((s64) (ZSF3 * SZ1) + (ZSF3 * SZ2) + (ZSF3 * SZ3));
@ -863,7 +863,7 @@ int docop2(int op) {
case 0x2e:
#ifdef GTE_LOG
GTE_LOG("%08x AVSZ4", op);
GTE_LOG("%08x GTE: AVSZ4|", op);
#endif
MAC0 = F((s64) (ZSF4 * SZ0) + (ZSF4 * SZ1) + (ZSF4 * SZ2) + (ZSF4 * SZ3));
@ -872,7 +872,7 @@ int docop2(int op) {
case 0x30:
#ifdef GTE_LOG
GTE_LOG("%08x RTPT", op);
GTE_LOG("%08x GTE: RTPT|", op);
#endif
for(v = 0; v < 3; v++) {
@ -912,7 +912,7 @@ int docop2(int op) {
case 0x3d:
#ifdef GTE_LOG
GTE_LOG("%08x GPF", op);
GTE_LOG("%08x GTE: GPF|", op);
#endif
MAC1 = A1(IR0 * IR1);
@ -931,7 +931,7 @@ int docop2(int op) {
case 0x3e:
#ifdef GTE_LOG
GTE_LOG("%08x GPL", op);
GTE_LOG("%08x GTE: GPL|", op);
#endif
MAC1 = A1(gte_shift(MAC1, -m_sf) + (IR0 * IR1));
@ -950,7 +950,7 @@ int docop2(int op) {
case 0x3f:
#ifdef GTE_LOG
GTE_LOG("%08x NCCT", op);
GTE_LOG("%08x GTE: NCCT|", op);
#endif
for(v = 0; v < 3; v++) {

View File

@ -177,8 +177,11 @@ void PGXP_RTPS(u32 _n, u32 _v)
return;
}
int PGXP_NLCIP_valid()
int PGXP_NLCIP_valid(u32 sxy0, u32 sxy1, u32 sxy2)
{
Validate(&SXY0, sxy0);
Validate(&SXY1, sxy1);
Validate(&SXY2, sxy2);
if (((SXY0.flags & SXY1.flags & SXY2.flags & VALID_01) == VALID_01) && Config.PGXP_GTE && (Config.PGXP_Mode > 0))
return 1;
return 0;
@ -189,7 +192,8 @@ float PGXP_NCLIP()
float nclip = ((SX0 * SY1) + (SX1 * SY2) + (SX2 * SY0) - (SX0 * SY2) - (SX1 * SY0) - (SX2 * SY1));
// ensure fractional values are not incorrectly rounded to 0
if ((fabs(nclip) < 1.0f) && (nclip != 0))
float nclipAbs = fabs(nclip);
if (( 0.1f < nclipAbs) && (nclipAbs < 1.f))
nclip += (nclip < 0.f ? -1 : 1);
//float AX = SX1 - SX0;

View File

@ -45,7 +45,7 @@ void PGXP_pushSXYZ2s(s64 _x, s64 _y, s64 _z, u32 v);
void PGXP_RTPS(u32 _n, u32 _v);
int PGXP_NLCIP_valid();
int PGXP_NLCIP_valid(u32 sxy0, u32 sxy1, u32 sxy2);
float PGXP_NCLIP();
// Data transfer tracking