diff options
-rw-r--r-- | libpcsxcore/gte.c | 323 | ||||
-rw-r--r-- | libpcsxcore/gte.h | 49 | ||||
-rw-r--r-- | libpcsxcore/psxinterpreter.c | 8 |
3 files changed, 197 insertions, 183 deletions
diff --git a/libpcsxcore/gte.c b/libpcsxcore/gte.c index 16e0a89..9909e18 100644 --- a/libpcsxcore/gte.c +++ b/libpcsxcore/gte.c @@ -26,135 +26,135 @@ #include "gte.h" #include "psxmem.h" -#define VX(n) (n < 3 ? psxRegs.CP2D.p[n << 1].sw.l : psxRegs.CP2D.p[9].sw.l) -#define VY(n) (n < 3 ? psxRegs.CP2D.p[n << 1].sw.h : psxRegs.CP2D.p[10].sw.l) -#define VZ(n) (n < 3 ? psxRegs.CP2D.p[(n << 1) + 1].sw.l : psxRegs.CP2D.p[11].sw.l) -#define MX11(n) (n < 3 ? psxRegs.CP2C.p[(n << 3)].sw.l : 0) -#define MX12(n) (n < 3 ? psxRegs.CP2C.p[(n << 3)].sw.h : 0) -#define MX13(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 1].sw.l : 0) -#define MX21(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 1].sw.h : 0) -#define MX22(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 2].sw.l : 0) -#define MX23(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 2].sw.h : 0) -#define MX31(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 3].sw.l : 0) -#define MX32(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 3].sw.h : 0) -#define MX33(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 4].sw.l : 0) -#define CV1(n) (n < 3 ? (s32)psxRegs.CP2C.r[(n << 3) + 5] : 0) -#define CV2(n) (n < 3 ? (s32)psxRegs.CP2C.r[(n << 3) + 6] : 0) -#define CV3(n) (n < 3 ? (s32)psxRegs.CP2C.r[(n << 3) + 7] : 0) - -#define fSX(n) ((psxRegs.CP2D.p)[((n) + 12)].sw.l) -#define fSY(n) ((psxRegs.CP2D.p)[((n) + 12)].sw.h) -#define fSZ(n) ((psxRegs.CP2D.p)[((n) + 17)].w.l) /* (n == 0) => SZ1; */ - -#define gteVXY0 (psxRegs.CP2D.r[0]) -#define gteVX0 (psxRegs.CP2D.p[0].sw.l) -#define gteVY0 (psxRegs.CP2D.p[0].sw.h) -#define gteVZ0 (psxRegs.CP2D.p[1].sw.l) -#define gteVXY1 (psxRegs.CP2D.r[2]) -#define gteVX1 (psxRegs.CP2D.p[2].sw.l) -#define gteVY1 (psxRegs.CP2D.p[2].sw.h) -#define gteVZ1 (psxRegs.CP2D.p[3].sw.l) -#define gteVXY2 (psxRegs.CP2D.r[4]) -#define gteVX2 (psxRegs.CP2D.p[4].sw.l) -#define gteVY2 (psxRegs.CP2D.p[4].sw.h) -#define gteVZ2 (psxRegs.CP2D.p[5].sw.l) -#define gteRGB (psxRegs.CP2D.r[6]) -#define gteR (psxRegs.CP2D.p[6].b.l) -#define gteG (psxRegs.CP2D.p[6].b.h) -#define gteB (psxRegs.CP2D.p[6].b.h2) -#define gteCODE (psxRegs.CP2D.p[6].b.h3) -#define gteOTZ (psxRegs.CP2D.p[7].w.l) -#define gteIR0 (psxRegs.CP2D.p[8].sw.l) -#define gteIR1 (psxRegs.CP2D.p[9].sw.l) -#define gteIR2 (psxRegs.CP2D.p[10].sw.l) -#define gteIR3 (psxRegs.CP2D.p[11].sw.l) -#define gteSXY0 (psxRegs.CP2D.r[12]) -#define gteSX0 (psxRegs.CP2D.p[12].sw.l) -#define gteSY0 (psxRegs.CP2D.p[12].sw.h) -#define gteSXY1 (psxRegs.CP2D.r[13]) -#define gteSX1 (psxRegs.CP2D.p[13].sw.l) -#define gteSY1 (psxRegs.CP2D.p[13].sw.h) -#define gteSXY2 (psxRegs.CP2D.r[14]) -#define gteSX2 (psxRegs.CP2D.p[14].sw.l) -#define gteSY2 (psxRegs.CP2D.p[14].sw.h) -#define gteSXYP (psxRegs.CP2D.r[15]) -#define gteSXP (psxRegs.CP2D.p[15].sw.l) -#define gteSYP (psxRegs.CP2D.p[15].sw.h) -#define gteSZ0 (psxRegs.CP2D.p[16].w.l) -#define gteSZ1 (psxRegs.CP2D.p[17].w.l) -#define gteSZ2 (psxRegs.CP2D.p[18].w.l) -#define gteSZ3 (psxRegs.CP2D.p[19].w.l) -#define gteRGB0 (psxRegs.CP2D.r[20]) -#define gteR0 (psxRegs.CP2D.p[20].b.l) -#define gteG0 (psxRegs.CP2D.p[20].b.h) -#define gteB0 (psxRegs.CP2D.p[20].b.h2) -#define gteCODE0 (psxRegs.CP2D.p[20].b.h3) -#define gteRGB1 (psxRegs.CP2D.r[21]) -#define gteR1 (psxRegs.CP2D.p[21].b.l) -#define gteG1 (psxRegs.CP2D.p[21].b.h) -#define gteB1 (psxRegs.CP2D.p[21].b.h2) -#define gteCODE1 (psxRegs.CP2D.p[21].b.h3) -#define gteRGB2 (psxRegs.CP2D.r[22]) -#define gteR2 (psxRegs.CP2D.p[22].b.l) -#define gteG2 (psxRegs.CP2D.p[22].b.h) -#define gteB2 (psxRegs.CP2D.p[22].b.h2) -#define gteCODE2 (psxRegs.CP2D.p[22].b.h3) -#define gteRES1 (psxRegs.CP2D.r[23]) -#define gteMAC0 (((s32 *)psxRegs.CP2D.r)[24]) -#define gteMAC1 (((s32 *)psxRegs.CP2D.r)[25]) -#define gteMAC2 (((s32 *)psxRegs.CP2D.r)[26]) -#define gteMAC3 (((s32 *)psxRegs.CP2D.r)[27]) -#define gteIRGB (psxRegs.CP2D.r[28]) -#define gteORGB (psxRegs.CP2D.r[29]) -#define gteLZCS (psxRegs.CP2D.r[30]) -#define gteLZCR (psxRegs.CP2D.r[31]) - -#define gteR11R12 (((s32 *)psxRegs.CP2C.r)[0]) -#define gteR22R23 (((s32 *)psxRegs.CP2C.r)[2]) -#define gteR11 (psxRegs.CP2C.p[0].sw.l) -#define gteR12 (psxRegs.CP2C.p[0].sw.h) -#define gteR13 (psxRegs.CP2C.p[1].sw.l) -#define gteR21 (psxRegs.CP2C.p[1].sw.h) -#define gteR22 (psxRegs.CP2C.p[2].sw.l) -#define gteR23 (psxRegs.CP2C.p[2].sw.h) -#define gteR31 (psxRegs.CP2C.p[3].sw.l) -#define gteR32 (psxRegs.CP2C.p[3].sw.h) -#define gteR33 (psxRegs.CP2C.p[4].sw.l) -#define gteTRX (((s32 *)psxRegs.CP2C.r)[5]) -#define gteTRY (((s32 *)psxRegs.CP2C.r)[6]) -#define gteTRZ (((s32 *)psxRegs.CP2C.r)[7]) -#define gteL11 (psxRegs.CP2C.p[8].sw.l) -#define gteL12 (psxRegs.CP2C.p[8].sw.h) -#define gteL13 (psxRegs.CP2C.p[9].sw.l) -#define gteL21 (psxRegs.CP2C.p[9].sw.h) -#define gteL22 (psxRegs.CP2C.p[10].sw.l) -#define gteL23 (psxRegs.CP2C.p[10].sw.h) -#define gteL31 (psxRegs.CP2C.p[11].sw.l) -#define gteL32 (psxRegs.CP2C.p[11].sw.h) -#define gteL33 (psxRegs.CP2C.p[12].sw.l) -#define gteRBK (((s32 *)psxRegs.CP2C.r)[13]) -#define gteGBK (((s32 *)psxRegs.CP2C.r)[14]) -#define gteBBK (((s32 *)psxRegs.CP2C.r)[15]) -#define gteLR1 (psxRegs.CP2C.p[16].sw.l) -#define gteLR2 (psxRegs.CP2C.p[16].sw.h) -#define gteLR3 (psxRegs.CP2C.p[17].sw.l) -#define gteLG1 (psxRegs.CP2C.p[17].sw.h) -#define gteLG2 (psxRegs.CP2C.p[18].sw.l) -#define gteLG3 (psxRegs.CP2C.p[18].sw.h) -#define gteLB1 (psxRegs.CP2C.p[19].sw.l) -#define gteLB2 (psxRegs.CP2C.p[19].sw.h) -#define gteLB3 (psxRegs.CP2C.p[20].sw.l) -#define gteRFC (((s32 *)psxRegs.CP2C.r)[21]) -#define gteGFC (((s32 *)psxRegs.CP2C.r)[22]) -#define gteBFC (((s32 *)psxRegs.CP2C.r)[23]) -#define gteOFX (((s32 *)psxRegs.CP2C.r)[24]) -#define gteOFY (((s32 *)psxRegs.CP2C.r)[25]) -#define gteH (psxRegs.CP2C.p[26].sw.l) -#define gteDQA (psxRegs.CP2C.p[27].sw.l) -#define gteDQB (((s32 *)psxRegs.CP2C.r)[28]) -#define gteZSF3 (psxRegs.CP2C.p[29].sw.l) -#define gteZSF4 (psxRegs.CP2C.p[30].sw.l) -#define gteFLAG (psxRegs.CP2C.r[31]) +#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) +#define MX11(n) (n < 3 ? regs->CP2C.p[(n << 3)].sw.l : 0) +#define MX12(n) (n < 3 ? regs->CP2C.p[(n << 3)].sw.h : 0) +#define MX13(n) (n < 3 ? regs->CP2C.p[(n << 3) + 1].sw.l : 0) +#define MX21(n) (n < 3 ? regs->CP2C.p[(n << 3) + 1].sw.h : 0) +#define MX22(n) (n < 3 ? regs->CP2C.p[(n << 3) + 2].sw.l : 0) +#define MX23(n) (n < 3 ? regs->CP2C.p[(n << 3) + 2].sw.h : 0) +#define MX31(n) (n < 3 ? regs->CP2C.p[(n << 3) + 3].sw.l : 0) +#define MX32(n) (n < 3 ? regs->CP2C.p[(n << 3) + 3].sw.h : 0) +#define MX33(n) (n < 3 ? regs->CP2C.p[(n << 3) + 4].sw.l : 0) +#define CV1(n) (n < 3 ? (s32)regs->CP2C.r[(n << 3) + 5] : 0) +#define CV2(n) (n < 3 ? (s32)regs->CP2C.r[(n << 3) + 6] : 0) +#define CV3(n) (n < 3 ? (s32)regs->CP2C.r[(n << 3) + 7] : 0) + +#define fSX(n) ((regs->CP2D.p)[((n) + 12)].sw.l) +#define fSY(n) ((regs->CP2D.p)[((n) + 12)].sw.h) +#define fSZ(n) ((regs->CP2D.p)[((n) + 17)].w.l) /* (n == 0) => SZ1; */ + +#define gteVXY0 (regs->CP2D.r[0]) +#define gteVX0 (regs->CP2D.p[0].sw.l) +#define gteVY0 (regs->CP2D.p[0].sw.h) +#define gteVZ0 (regs->CP2D.p[1].sw.l) +#define gteVXY1 (regs->CP2D.r[2]) +#define gteVX1 (regs->CP2D.p[2].sw.l) +#define gteVY1 (regs->CP2D.p[2].sw.h) +#define gteVZ1 (regs->CP2D.p[3].sw.l) +#define gteVXY2 (regs->CP2D.r[4]) +#define gteVX2 (regs->CP2D.p[4].sw.l) +#define gteVY2 (regs->CP2D.p[4].sw.h) +#define gteVZ2 (regs->CP2D.p[5].sw.l) +#define gteRGB (regs->CP2D.r[6]) +#define gteR (regs->CP2D.p[6].b.l) +#define gteG (regs->CP2D.p[6].b.h) +#define gteB (regs->CP2D.p[6].b.h2) +#define gteCODE (regs->CP2D.p[6].b.h3) +#define gteOTZ (regs->CP2D.p[7].w.l) +#define gteIR0 (regs->CP2D.p[8].sw.l) +#define gteIR1 (regs->CP2D.p[9].sw.l) +#define gteIR2 (regs->CP2D.p[10].sw.l) +#define gteIR3 (regs->CP2D.p[11].sw.l) +#define gteSXY0 (regs->CP2D.r[12]) +#define gteSX0 (regs->CP2D.p[12].sw.l) +#define gteSY0 (regs->CP2D.p[12].sw.h) +#define gteSXY1 (regs->CP2D.r[13]) +#define gteSX1 (regs->CP2D.p[13].sw.l) +#define gteSY1 (regs->CP2D.p[13].sw.h) +#define gteSXY2 (regs->CP2D.r[14]) +#define gteSX2 (regs->CP2D.p[14].sw.l) +#define gteSY2 (regs->CP2D.p[14].sw.h) +#define gteSXYP (regs->CP2D.r[15]) +#define gteSXP (regs->CP2D.p[15].sw.l) +#define gteSYP (regs->CP2D.p[15].sw.h) +#define gteSZ0 (regs->CP2D.p[16].w.l) +#define gteSZ1 (regs->CP2D.p[17].w.l) +#define gteSZ2 (regs->CP2D.p[18].w.l) +#define gteSZ3 (regs->CP2D.p[19].w.l) +#define gteRGB0 (regs->CP2D.r[20]) +#define gteR0 (regs->CP2D.p[20].b.l) +#define gteG0 (regs->CP2D.p[20].b.h) +#define gteB0 (regs->CP2D.p[20].b.h2) +#define gteCODE0 (regs->CP2D.p[20].b.h3) +#define gteRGB1 (regs->CP2D.r[21]) +#define gteR1 (regs->CP2D.p[21].b.l) +#define gteG1 (regs->CP2D.p[21].b.h) +#define gteB1 (regs->CP2D.p[21].b.h2) +#define gteCODE1 (regs->CP2D.p[21].b.h3) +#define gteRGB2 (regs->CP2D.r[22]) +#define gteR2 (regs->CP2D.p[22].b.l) +#define gteG2 (regs->CP2D.p[22].b.h) +#define gteB2 (regs->CP2D.p[22].b.h2) +#define gteCODE2 (regs->CP2D.p[22].b.h3) +#define gteRES1 (regs->CP2D.r[23]) +#define gteMAC0 (((s32 *)regs->CP2D.r)[24]) +#define gteMAC1 (((s32 *)regs->CP2D.r)[25]) +#define gteMAC2 (((s32 *)regs->CP2D.r)[26]) +#define gteMAC3 (((s32 *)regs->CP2D.r)[27]) +#define gteIRGB (regs->CP2D.r[28]) +#define gteORGB (regs->CP2D.r[29]) +#define gteLZCS (regs->CP2D.r[30]) +#define gteLZCR (regs->CP2D.r[31]) + +#define gteR11R12 (((s32 *)regs->CP2C.r)[0]) +#define gteR22R23 (((s32 *)regs->CP2C.r)[2]) +#define gteR11 (regs->CP2C.p[0].sw.l) +#define gteR12 (regs->CP2C.p[0].sw.h) +#define gteR13 (regs->CP2C.p[1].sw.l) +#define gteR21 (regs->CP2C.p[1].sw.h) +#define gteR22 (regs->CP2C.p[2].sw.l) +#define gteR23 (regs->CP2C.p[2].sw.h) +#define gteR31 (regs->CP2C.p[3].sw.l) +#define gteR32 (regs->CP2C.p[3].sw.h) +#define gteR33 (regs->CP2C.p[4].sw.l) +#define gteTRX (((s32 *)regs->CP2C.r)[5]) +#define gteTRY (((s32 *)regs->CP2C.r)[6]) +#define gteTRZ (((s32 *)regs->CP2C.r)[7]) +#define gteL11 (regs->CP2C.p[8].sw.l) +#define gteL12 (regs->CP2C.p[8].sw.h) +#define gteL13 (regs->CP2C.p[9].sw.l) +#define gteL21 (regs->CP2C.p[9].sw.h) +#define gteL22 (regs->CP2C.p[10].sw.l) +#define gteL23 (regs->CP2C.p[10].sw.h) +#define gteL31 (regs->CP2C.p[11].sw.l) +#define gteL32 (regs->CP2C.p[11].sw.h) +#define gteL33 (regs->CP2C.p[12].sw.l) +#define gteRBK (((s32 *)regs->CP2C.r)[13]) +#define gteGBK (((s32 *)regs->CP2C.r)[14]) +#define gteBBK (((s32 *)regs->CP2C.r)[15]) +#define gteLR1 (regs->CP2C.p[16].sw.l) +#define gteLR2 (regs->CP2C.p[16].sw.h) +#define gteLR3 (regs->CP2C.p[17].sw.l) +#define gteLG1 (regs->CP2C.p[17].sw.h) +#define gteLG2 (regs->CP2C.p[18].sw.l) +#define gteLG3 (regs->CP2C.p[18].sw.h) +#define gteLB1 (regs->CP2C.p[19].sw.l) +#define gteLB2 (regs->CP2C.p[19].sw.h) +#define gteLB3 (regs->CP2C.p[20].sw.l) +#define gteRFC (((s32 *)regs->CP2C.r)[21]) +#define gteGFC (((s32 *)regs->CP2C.r)[22]) +#define gteBFC (((s32 *)regs->CP2C.r)[23]) +#define gteOFX (((s32 *)regs->CP2C.r)[24]) +#define gteOFY (((s32 *)regs->CP2C.r)[25]) +#define gteH (regs->CP2C.p[26].sw.l) +#define gteDQA (regs->CP2C.p[27].sw.l) +#define gteDQB (((s32 *)regs->CP2C.r)[28]) +#define gteZSF3 (regs->CP2C.p[29].sw.l) +#define gteZSF4 (regs->CP2C.p[30].sw.l) +#define gteFLAG (regs->CP2C.r[31]) #define GTE_OP(op) ((op >> 20) & 31) #define GTE_SF(op) ((op >> 19) & 1) @@ -170,7 +170,7 @@ #ifndef FLAGLESS -static inline s64 BOUNDS(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) { @@ -179,7 +179,7 @@ static inline s64 BOUNDS(s64 n_value, s64 n_max, int n_maxflag, s64 n_min, int n return n_value; } -static inline s32 LIM(s32 value, s32 max, s32 min, u32 flag) { +static inline s32 LIM_(psxCP2Regs *regs, s32 value, s32 max, s32 min, u32 flag) { s32 ret = value; if (value > max) { gteFLAG |= flag; @@ -191,7 +191,7 @@ static inline s32 LIM(s32 value, s32 max, s32 min, u32 flag) { return ret; } -static inline u32 limE(u32 result) { +static inline u32 limE_(psxCP2Regs *regs, u32 result) { if (result > 0x1ffff) { gteFLAG |= (1 << 31) | (1 << 17); return 0x1ffff; @@ -201,9 +201,9 @@ static inline u32 limE(u32 result) { #else -#define BOUNDS(a, ...) (a) +#define BOUNDS_(regs, a, ...) (a) -static inline s32 LIM(s32 value, s32 max, s32 min, u32 flag_unused) { +static inline s32 LIM_(psxCP2Regs *regs, s32 value, s32 max, s32 min, u32 flag_unused) { s32 ret = value; if (value > max) ret = max; @@ -212,7 +212,7 @@ static inline s32 LIM(s32 value, s32 max, s32 min, u32 flag_unused) { return ret; } -static inline u32 limE(u32 result) { +static inline u32 limE_(psxCP2Regs *regs, u32 result) { if (result > 0x1ffff) return 0x1ffff; return result; @@ -220,6 +220,13 @@ static inline u32 limE(u32 result) { #endif +#define BOUNDS(n_value,n_max,n_maxflag,n_min,n_minflag) \ + BOUNDS_(regs,n_value,n_max,n_maxflag,n_min,n_minflag) +#define LIM(value,max,min,flag) \ + LIM_(regs,value,max,min,flag) +#define limE(result) \ + limE_(regs,result) + #define A1(a) BOUNDS((a), 0x7fffffff, (1 << 30), -(s64)0x80000000, (1 << 31) | (1 << 27)) #define A2(a) BOUNDS((a), 0x7fffffff, (1 << 29), -(s64)0x80000000, (1 << 31) | (1 << 26)) #define A3(a) BOUNDS((a), 0x7fffffff, (1 << 28), -(s64)0x80000000, (1 << 31) | (1 << 25)) @@ -241,6 +248,7 @@ static inline u32 limE(u32 result) { #ifndef FLAGLESS static inline u32 MFC2(int reg) { + psxCP2Regs *regs = (psxCP2Regs *)&psxRegs.CP2D; switch (reg) { case 1: case 3: @@ -275,6 +283,7 @@ static inline u32 MFC2(int reg) { } static inline void MTC2(u32 value, int reg) { + psxCP2Regs *regs = (psxCP2Regs *)&psxRegs.CP2D; switch (reg) { case 15: gteSXY0 = gteSXY1; @@ -382,7 +391,7 @@ static u32 DIVIDE_(s16 n, u16 d) { } #endif -void gteRTPS() { +void gteRTPS(psxCP2Regs *regs) { int quotient; #ifdef GTE_LOG @@ -410,7 +419,7 @@ void gteRTPS() { gteIR0 = limH(gteMAC0 >> 12); } -void gteRTPT() { +void gteRTPT(psxCP2Regs *regs) { int quotient; int v; s32 vx, vy, vz; @@ -440,7 +449,7 @@ void gteRTPT() { gteIR0 = limH(gteMAC0 >> 12); } -void gteMVMVA() { +void gteMVMVA(psxCP2Regs *regs) { int shift = 12 * GTE_SF(gteop); int mx = GTE_MX(gteop); int v = GTE_V(gteop); @@ -464,7 +473,7 @@ void gteMVMVA() { gteIR3 = limB3(gteMAC3, lm); } -void gteNCLIP() { +void gteNCLIP(psxCP2Regs *regs) { #ifdef GTE_LOG GTE_LOG("GTE NCLIP\n"); #endif @@ -475,7 +484,7 @@ void gteNCLIP() { gteSX2 * (gteSY0 - gteSY1)); } -void gteAVSZ3() { +void gteAVSZ3(psxCP2Regs *regs) { #ifdef GTE_LOG GTE_LOG("GTE AVSZ3\n"); #endif @@ -485,7 +494,7 @@ void gteAVSZ3() { gteOTZ = limD(gteMAC0 >> 12); } -void gteAVSZ4() { +void gteAVSZ4(psxCP2Regs *regs) { #ifdef GTE_LOG GTE_LOG("GTE AVSZ4\n"); #endif @@ -495,7 +504,7 @@ void gteAVSZ4() { gteOTZ = limD(gteMAC0 >> 12); } -void gteSQR() { +void gteSQR(psxCP2Regs *regs) { int shift = 12 * GTE_SF(gteop); int lm = GTE_LM(gteop); @@ -512,7 +521,7 @@ void gteSQR() { gteIR3 = limB3(gteMAC3, lm); } -void gteNCCS() { +void gteNCCS(psxCP2Regs *regs) { #ifdef GTE_LOG GTE_LOG("GTE NCCS\n"); #endif @@ -545,7 +554,7 @@ void gteNCCS() { gteB2 = limC3(gteMAC3 >> 4); } -void gteNCCT() { +void gteNCCT(psxCP2Regs *regs) { int v; s32 vx, vy, vz; @@ -586,7 +595,7 @@ void gteNCCT() { gteIR3 = limB3(gteMAC3, 1); } -void gteNCDS() { +void gteNCDS(psxCP2Regs *regs) { #ifdef GTE_LOG GTE_LOG("GTE NCDS\n"); #endif @@ -619,7 +628,7 @@ void gteNCDS() { gteB2 = limC3(gteMAC3 >> 4); } -void gteNCDT() { +void gteNCDT(psxCP2Regs *regs) { int v; s32 vx, vy, vz; @@ -660,7 +669,7 @@ void gteNCDT() { gteIR3 = limB3(gteMAC3, 1); } -void gteOP() { +void gteOP(psxCP2Regs *regs) { int shift = 12 * GTE_SF(gteop); int lm = GTE_LM(gteop); @@ -677,7 +686,7 @@ void gteOP() { gteIR3 = limB3(gteMAC3, lm); } -void gteDCPL() { +void gteDCPL(psxCP2Regs *regs) { int lm = GTE_LM(gteop); s64 RIR1 = ((s64)gteR * gteIR1) >> 8; @@ -705,7 +714,7 @@ void gteDCPL() { gteB2 = limC3(gteMAC3 >> 4); } -void gteGPF() { +void gteGPF(psxCP2Regs *regs) { int shift = 12 * GTE_SF(gteop); #ifdef GTE_LOG @@ -728,7 +737,7 @@ void gteGPF() { gteB2 = limC3(gteMAC3 >> 4); } -void gteGPL() { +void gteGPL(psxCP2Regs *regs) { int shift = 12 * GTE_SF(gteop); #ifdef GTE_LOG @@ -751,7 +760,7 @@ void gteGPL() { gteB2 = limC3(gteMAC3 >> 4); } -void gteDPCS() { +void gteDPCS(psxCP2Regs *regs) { int shift = 12 * GTE_SF(gteop); #ifdef GTE_LOG @@ -774,7 +783,7 @@ void gteDPCS() { gteB2 = limC3(gteMAC3 >> 4); } -void gteDPCT() { +void gteDPCT(psxCP2Regs *regs) { int v; #ifdef GTE_LOG @@ -799,7 +808,7 @@ void gteDPCT() { gteIR3 = limB3(gteMAC3, 0); } -void gteNCS() { +void gteNCS(psxCP2Regs *regs) { #ifdef GTE_LOG GTE_LOG("GTE NCS\n"); #endif @@ -826,7 +835,7 @@ void gteNCS() { gteB2 = limC3(gteMAC3 >> 4); } -void gteNCT() { +void gteNCT(psxCP2Regs *regs) { int v; s32 vx, vy, vz; @@ -860,7 +869,7 @@ void gteNCT() { gteIR3 = limB3(gteMAC3, 1); } -void gteCC() { +void gteCC(psxCP2Regs *regs) { #ifdef GTE_LOG GTE_LOG("GTE CC\n"); #endif @@ -887,7 +896,7 @@ void gteCC() { gteB2 = limC3(gteMAC3 >> 4); } -void gteINTPL() { +void gteINTPL(psxCP2Regs *regs) { int shift = 12 * GTE_SF(gteop); int lm = GTE_LM(gteop); @@ -910,7 +919,7 @@ void gteINTPL() { gteB2 = limC3(gteMAC3 >> 4); } -void gteCDP() { +void gteCDP(psxCP2Regs *regs) { #ifdef GTE_LOG GTE_LOG("GTE CDP\n"); #endif diff --git a/libpcsxcore/gte.h b/libpcsxcore/gte.h index 22f98a1..96f8542 100644 --- a/libpcsxcore/gte.h +++ b/libpcsxcore/gte.h @@ -56,6 +56,11 @@ extern "C" { #include "psxcommon.h" #include "r3000a.h" +typedef struct { + psxCP2Data CP2D; /* Cop2 data registers */ + psxCP2Ctrl CP2C; /* Cop2 control registers */ +} psxCP2Regs; + void gteMFC2(); void gteCFC2(); void gteMTC2(); @@ -63,28 +68,28 @@ void gteCTC2(); void gteLWC2(); void gteSWC2(); -void gteRTPS(); -void gteOP(); -void gteNCLIP(); -void gteDPCS(); -void gteINTPL(); -void gteMVMVA(); -void gteNCDS(); -void gteNCDT(); -void gteCDP(); -void gteNCCS(); -void gteCC(); -void gteNCS(); -void gteNCT(); -void gteSQR(); -void gteDCPL(); -void gteDPCT(); -void gteAVSZ3(); -void gteAVSZ4(); -void gteRTPT(); -void gteGPF(); -void gteGPL(); -void gteNCCT(); +void gteRTPS(psxCP2Regs *regs); +void gteOP(psxCP2Regs *regs); +void gteNCLIP(psxCP2Regs *regs); +void gteDPCS(psxCP2Regs *regs); +void gteINTPL(psxCP2Regs *regs); +void gteMVMVA(psxCP2Regs *regs); +void gteNCDS(psxCP2Regs *regs); +void gteNCDT(psxCP2Regs *regs); +void gteCDP(psxCP2Regs *regs); +void gteNCCS(psxCP2Regs *regs); +void gteCC(psxCP2Regs *regs); +void gteNCS(psxCP2Regs *regs); +void gteNCT(psxCP2Regs *regs); +void gteSQR(psxCP2Regs *regs); +void gteDCPL(psxCP2Regs *regs); +void gteDPCT(psxCP2Regs *regs); +void gteAVSZ3(psxCP2Regs *regs); +void gteAVSZ4(psxCP2Regs *regs); +void gteRTPT(psxCP2Regs *regs); +void gteGPF(psxCP2Regs *regs); +void gteGPL(psxCP2Regs *regs); +void gteNCCT(psxCP2Regs *regs); #ifdef __cplusplus } diff --git a/libpcsxcore/psxinterpreter.c b/libpcsxcore/psxinterpreter.c index 84e1da5..f9833a4 100644 --- a/libpcsxcore/psxinterpreter.c +++ b/libpcsxcore/psxinterpreter.c @@ -46,7 +46,7 @@ void (*psxBSC[64])(); void (*psxSPC[64])(); void (*psxREG[32])(); void (*psxCP0[32])(); -void (*psxCP2[64])(); +void (*psxCP2[64])(psxCP2Regs *regs); void (*psxCP2BSC[32])(); static void delayRead(int reg, u32 bpc) { @@ -833,10 +833,10 @@ void psxCOP0() { } void psxCOP2() { - psxCP2[_Funct_](); + psxCP2[_Funct_]((psxCP2Regs *)&psxRegs.CP2D); } -void psxBASIC() { +void psxBASIC(psxCP2Regs *regs) { psxCP2BSC[_Rs_](); } @@ -882,7 +882,7 @@ void (*psxCP0[32])() = { psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL, psxNULL }; -void (*psxCP2[64])() = { +void (*psxCP2[64])(psxCP2Regs *regs) = { psxBASIC, gteRTPS , psxNULL , psxNULL, psxNULL, psxNULL , gteNCLIP, psxNULL, // 00 psxNULL , psxNULL , psxNULL , psxNULL, gteOP , psxNULL , psxNULL , psxNULL, // 08 gteDPCS , gteINTPL, gteMVMVA, gteNCDS, gteCDP , psxNULL , gteNCDT , psxNULL, // 10 |