gte: pass a pointer to registers as argument
authornotaz <notasas@gmail.com>
Thu, 20 Oct 2011 23:18:46 +0000 (02:18 +0300)
committernotaz <notasas@gmail.com>
Sun, 30 Oct 2011 21:48:08 +0000 (23:48 +0200)
no more need to load psxRegs in each function and all registers are
reachable by ldrh/strh.

libpcsxcore/gte.c
libpcsxcore/gte.h
libpcsxcore/psxinterpreter.c

index 16e0a89..9909e18 100644 (file)
 #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)
 
 #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
index 22f98a1..96f8542 100644 (file)
@@ -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
 }
index 84e1da5..f9833a4 100644 (file)
@@ -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