X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fgte.c;h=77dff1b114c275828102ba32be0b7f252b117e74;hp=dc56b7f2e7bba88a5744eb1047962fd969696e50;hb=9d3801c90db3dee73a7a30d898857ad1a5821e59;hpb=6c0eefafd3a531d6bc6d26736926a1514c0c9e6f diff --git a/libpcsxcore/gte.c b/libpcsxcore/gte.c index dc56b7f2..77dff1b1 100644 --- a/libpcsxcore/gte.c +++ b/libpcsxcore/gte.c @@ -26,11 +26,6 @@ #include "gte.h" #include "psxmem.h" -typedef struct psxCP2Regs { - psxCP2Data CP2D; /* Cop2 data registers */ - psxCP2Ctrl CP2C; /* Cop2 control registers */ -} psxCP2Regs; - #define VX(n) (n < 3 ? regs->CP2D.p[n << 1].sw.l : regs->CP2D.p[9].sw.l) #define VY(n) (n < 3 ? regs->CP2D.p[n << 1].sw.h : regs->CP2D.p[10].sw.l) #define VZ(n) (n < 3 ? regs->CP2D.p[(n << 1) + 1].sw.l : regs->CP2D.p[11].sw.l) @@ -175,7 +170,7 @@ typedef struct psxCP2Regs { #ifndef FLAGLESS -static inline s32 BOUNDS_(psxCP2Regs *regs, s64 n_value, s64 n_max, int n_maxflag, s64 n_min, int n_minflag) { +static inline s64 BOUNDS_(psxCP2Regs *regs, s64 n_value, s64 n_max, int n_maxflag, s64 n_min, int n_minflag) { if (n_value > n_max) { gteFLAG |= n_maxflag; } else if (n_value < n_min) { @@ -264,7 +259,7 @@ static inline u32 limE_(psxCP2Regs *regs, u32 result) { #ifndef FLAGLESS static inline u32 MFC2(int reg) { - psxCP2Regs *regs = (psxCP2Regs *)&psxRegs.CP2D; + psxCP2Regs *regs = &psxRegs.CP2; switch (reg) { case 1: case 3: @@ -299,7 +294,7 @@ static inline u32 MFC2(int reg) { } static inline void MTC2(u32 value, int reg) { - psxCP2Regs *regs = (psxCP2Regs *)&psxRegs.CP2D; + psxCP2Regs *regs = &psxRegs.CP2; switch (reg) { case 15: gteSXY0 = gteSXY1; @@ -409,6 +404,7 @@ static u32 DIVIDE_(s16 n, u16 d) { void gteRTPS(psxCP2Regs *regs) { int quotient; + s64 tmp; #ifdef GTE_LOG GTE_LOG("GTE RTPS\n"); @@ -431,14 +427,16 @@ void gteRTPS(psxCP2Regs *regs) { gteSX2 = limG1(F((s64)gteOFX + ((s64)gteIR1 * quotient)) >> 16); gteSY2 = limG2(F((s64)gteOFY + ((s64)gteIR2 * quotient)) >> 16); - gteMAC0 = F((s64)gteDQB + ((s64)gteDQA * quotient)); - gteIR0 = limH(gteMAC0 >> 12); + tmp = (s64)gteDQB + ((s64)gteDQA * quotient); + gteMAC0 = F(tmp); + gteIR0 = limH(tmp >> 12); } void gteRTPT(psxCP2Regs *regs) { int quotient; int v; s32 vx, vy, vz; + s64 tmp; #ifdef GTE_LOG GTE_LOG("GTE RTPT\n"); @@ -461,8 +459,10 @@ void gteRTPT(psxCP2Regs *regs) { fSX(v) = limG1(F((s64)gteOFX + ((s64)gteIR1 * quotient)) >> 16); fSY(v) = limG2(F((s64)gteOFY + ((s64)gteIR2 * quotient)) >> 16); } - gteMAC0 = F((s64)gteDQB + ((s64)gteDQA * quotient)); - gteIR0 = limH(gteMAC0 >> 12); + + tmp = (s64)gteDQB + ((s64)gteDQA * quotient); + gteMAC0 = F(tmp); + gteIR0 = limH(tmp >> 12); } void gteMVMVA(psxCP2Regs *regs) {