cdrom: change pause timing again
[pcsx_rearmed.git] / libpcsxcore / gte.c
index d342822..991a445 100644 (file)
 //  sign-extended by bug in original hardware, according to Nocash docs
 //  GTE section 'Screen Offset and Distance'. The emulator does this
 //  sign extension when it is loaded to GTE by CTC2.
-//#define gteH   (psxRegs.CP2C.p[26].sw.l)
-#define gteH   (psxRegs.CP2C.p[26].w.l)
+//#define gteH   (regs->CP2C.p[26].sw.l)
+#define gteH   (regs->CP2C.p[26].w.l)
 #define gteDQA (regs->CP2C.p[27].sw.l)
 #define gteDQB (((s32 *)regs->CP2C.r)[28])
 #define gteZSF3 (regs->CP2C.p[29].sw.l)
@@ -275,7 +275,7 @@ INLINE u32 DIVIDE(u16 n, u16 d) {
 
 #ifndef FLAGLESS
 
-const char gte_cycletab[64] = {
+const unsigned char gte_cycletab[64] = {
        /*   1   2   3   4   5   6   7   8   9   a   b   c   d   e   f */
         0, 15,  0,  0,  0,  0,  8,  0,  0,  0,  0,  0,  6,  0,  0,  0,
         8,  8,  8, 19, 13,  0, 44,  0,  0,  0,  0, 17, 11,  0, 14,  0,
@@ -301,8 +301,7 @@ void gteCheckStall(u32 op) {
        gteCheckStallRaw(gte_cycletab[op], &psxRegs);
 }
 
-static inline u32 MFC2(int reg) {
-       psxCP2Regs *regs = &psxRegs.CP2;
+u32 MFC2(struct psxCP2Regs *regs, int reg) {
        switch (reg) {
                case 1:
                case 3:
@@ -311,7 +310,7 @@ static inline u32 MFC2(int reg) {
                case 9:
                case 10:
                case 11:
-                       psxRegs.CP2D.r[reg] = (s32)psxRegs.CP2D.p[reg].sw.l;
+                       regs->CP2D.r[reg] = (s32)regs->CP2D.p[reg].sw.l;
                        break;
 
                case 7:
@@ -319,25 +318,24 @@ static inline u32 MFC2(int reg) {
                case 17:
                case 18:
                case 19:
-                       psxRegs.CP2D.r[reg] = (u32)psxRegs.CP2D.p[reg].w.l;
+                       regs->CP2D.r[reg] = (u32)regs->CP2D.p[reg].w.l;
                        break;
 
                case 15:
-                       psxRegs.CP2D.r[reg] = gteSXY2;
+                       regs->CP2D.r[reg] = gteSXY2;
                        break;
 
                case 28:
                case 29:
-                       psxRegs.CP2D.r[reg] = LIM(gteIR1 >> 7, 0x1f, 0, 0) |
+                       regs->CP2D.r[reg] = LIM(gteIR1 >> 7, 0x1f, 0, 0) |
                                                                        (LIM(gteIR2 >> 7, 0x1f, 0, 0) << 5) |
                                                                        (LIM(gteIR3 >> 7, 0x1f, 0, 0) << 10);
                        break;
        }
-       return psxRegs.CP2D.r[reg];
+       return regs->CP2D.r[reg];
 }
 
-static inline void MTC2(u32 value, int reg) {
-       psxCP2Regs *regs = &psxRegs.CP2;
+void MTC2(struct psxCP2Regs *regs, u32 value, int reg) {
        switch (reg) {
                case 15:
                        gteSXY0 = gteSXY1;
@@ -379,11 +377,11 @@ static inline void MTC2(u32 value, int reg) {
                        return;
 
                default:
-                       psxRegs.CP2D.r[reg] = value;
+                       regs->CP2D.r[reg] = value;
        }
 }
 
-static inline void CTC2(u32 value, int reg) {
+void CTC2(struct psxCP2Regs *regs, u32 value, int reg) {
        switch (reg) {
                case 4:
                case 12:
@@ -401,36 +399,7 @@ static inline void CTC2(u32 value, int reg) {
                        break;
        }
 
-       psxRegs.CP2C.r[reg] = value;
-}
-
-void gteMFC2() {
-       if (!_Rt_) return;
-       psxRegs.GPR.r[_Rt_] = MFC2(_Rd_);
-}
-
-void gteCFC2() {
-       if (!_Rt_) return;
-       psxRegs.GPR.r[_Rt_] = psxRegs.CP2C.r[_Rd_];
-}
-
-void gteMTC2() {
-       MTC2(psxRegs.GPR.r[_Rt_], _Rd_);
-}
-
-void gteCTC2() {
-       CTC2(psxRegs.GPR.r[_Rt_], _Rd_);
-}
-
-#define _oB_ (psxRegs.GPR.r[_Rs_] + _Imm_)
-
-void gteLWC2() {
-       MTC2(psxMemRead32(_oB_), _Rt_);
-}
-
-void gteSWC2() {
-       gteCheckStall(0);
-       psxMemWrite32(_oB_, MFC2(_Rt_));
+       regs->CP2C.r[reg] = value;
 }
 
 #endif // FLAGLESS