summaryrefslogtreecommitdiff
path: root/libpcsxcore
diff options
context:
space:
mode:
authorSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-04-12 16:34:44 +0000
committerSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-04-12 16:34:44 +0000
commited0bed6286a59464d38b06483b11f8c577ce2e28 (patch)
tree53a2a378a548526d6b741da91068f0875ccc0d0e /libpcsxcore
parentbee55e515c9b62a8c369dea9b8566aaaf1a6c70d (diff)
downloadpcsxr-ed0bed6286a59464d38b06483b11f8c577ce2e28.tar.gz
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@44905 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore')
-rw-r--r--libpcsxcore/debug.h6
-rw-r--r--libpcsxcore/gte.c3388
-rw-r--r--libpcsxcore/gte.h180
-rw-r--r--libpcsxcore/ix86/iGte.h594
-rw-r--r--libpcsxcore/ix86_64/iGte.h599
-rw-r--r--libpcsxcore/ppc/pGte.h591
-rw-r--r--libpcsxcore/r3000a.h18
7 files changed, 691 insertions, 4685 deletions
diff --git a/libpcsxcore/debug.h b/libpcsxcore/debug.h
index 84aa8492..7d282a58 100644
--- a/libpcsxcore/debug.h
+++ b/libpcsxcore/debug.h
@@ -47,12 +47,6 @@ FILE *emuLog;
* Ryan TODO: These should ALL be definable with configure flags.
*/
-//#define GTE_DUMP
-
-#ifdef GTE_DUMP
-FILE *gteLog;
-#endif
-
//#define LOG_STDOUT
//#define PAD_LOG __Log
diff --git a/libpcsxcore/gte.c b/libpcsxcore/gte.c
index 6e42c5cb..2ec99c0d 100644
--- a/libpcsxcore/gte.c
+++ b/libpcsxcore/gte.c
@@ -1,200 +1,110 @@
-/***************************************************************************
- * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team *
- * schultz.ryan@gmail.com, http://rschultz.ath.cx/code.php *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA. *
- ***************************************************************************/
+/* PCSX-Revolution - PS Emulator for Nintendo Wii
+ * Copyright (C) 2009-2010 PCSX-Revolution Dev Team
+ *
+ * PCSX-Revolution is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * PCSX-Revolution is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with PCSX-Revolution. If not, see <http://www.gnu.org/licenses/>.
+ */
/*
* GTE functions.
*/
#include "gte.h"
+#include "psxmem.h"
-#ifdef GTE_DUMP
-#define G_OP(name,delay) fprintf(gteLog, "* : %08X : %02d : %s\n", psxRegs.code, delay, name);
-#define G_SD(reg) fprintf(gteLog, "+D%02d : %08X\n", reg, psxRegs.CP2D.r[reg]);
-#define G_SC(reg) fprintf(gteLog, "+C%02d : %08X\n", reg, psxRegs.CP2C.r[reg]);
-#define G_GD(reg) fprintf(gteLog, "-D%02d : %08X\n", reg, psxRegs.CP2D.r[reg]);
-#define G_GC(reg) fprintf(gteLog, "-C%02d : %08X\n", reg, psxRegs.CP2C.r[reg]);
-#else
-#define G_OP(name,delay)
-#define G_SD(reg)
-#define G_SC(reg)
-#define G_GD(reg)
-#define G_GC(reg)
+#ifdef _MSC_VER_
+#pragma warning(disable : 4244)
+#pragma warning(disable : 4761)
#endif
-#define SUM_FLAG if (gteFLAG & 0x7F87E000) gteFLAG |= 0x80000000;
+static inline s64 BOUNDS(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) {
+ gteFLAG |= n_minflag;
+ }
+ return n_value;
+}
-#ifndef _MSC_VER
-#define UNDERFLOW_BOUND ((s64)0xffffffff80000000LL)
-#else
-#define UNDERFLOW_BOUND ((s64)0xffffffff80000000)
-#endif
+static inline s32 LIM(s32 value, s32 max, s32 min, u32 flag) {
+ s32 ret = value;
+ if (value > max) {
+ gteFLAG |= flag;
+ ret = max;
+ } else if (value < min) {
+ gteFLAG |= flag;
+ ret = min;
+ }
+ return ret;
+}
-#if defined(__BIGENDIAN__)
-#define SEL16(n) ((n)^1)
-#define SEL8(n) ((n)^3)
-#else
-#define SEL16(n) (n)
-#define SEL8(n) (n)
-#endif
+#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))
+#define Lm_B1(a, l) LIM((a), 0x7fff, -0x8000 * !l, (1 << 31) | (1 << 24))
+#define Lm_B2(a, l) LIM((a), 0x7fff, -0x8000 * !l, (1 << 31) | (1 << 23))
+#define Lm_B3(a, l) LIM((a), 0x7fff, -0x8000 * !l, (1 << 22) )
+#define Lm_C1(a) LIM((a), 0x00ff, 0x0000, (1 << 21) )
+#define Lm_C2(a) LIM((a), 0x00ff, 0x0000, (1 << 20) )
+#define Lm_C3(a) LIM((a), 0x00ff, 0x0000, (1 << 19) )
+#define Lm_D(a) LIM((a), 0xffff, 0x0000, (1 << 31) | (1 << 18))
-#define gteVX0 ((s16*)psxRegs.CP2D.r)[SEL16(0)]
-#define gteVY0 ((s16*)psxRegs.CP2D.r)[SEL16(1)]
-#define gteVZ0 ((s16*)psxRegs.CP2D.r)[SEL16(2)]
-#define gteVX1 ((s16*)psxRegs.CP2D.r)[SEL16(4)]
-#define gteVY1 ((s16*)psxRegs.CP2D.r)[SEL16(5)]
-#define gteVZ1 ((s16*)psxRegs.CP2D.r)[SEL16(6)]
-#define gteVX2 ((s16*)psxRegs.CP2D.r)[SEL16(8)]
-#define gteVY2 ((s16*)psxRegs.CP2D.r)[SEL16(9)]
-#define gteVZ2 ((s16*)psxRegs.CP2D.r)[SEL16(10)]
-#define gteRGB psxRegs.CP2D.r[6]
-#define gteOTZ ((s16*)psxRegs.CP2D.r)[SEL16(7*2)]
-#define gteIR0 ((s32*)psxRegs.CP2D.r)[8]
-#define gteIR1 ((s32*)psxRegs.CP2D.r)[9]
-#define gteIR2 ((s32*)psxRegs.CP2D.r)[10]
-#define gteIR3 ((s32*)psxRegs.CP2D.r)[11]
-#define gteSXY0 ((s32*)psxRegs.CP2D.r)[12]
-#define gteSXY1 ((s32*)psxRegs.CP2D.r)[13]
-#define gteSXY2 ((s32*)psxRegs.CP2D.r)[14]
-#define gteSXYP ((s32*)psxRegs.CP2D.r)[15]
-#define gteSX0 ((s16*)psxRegs.CP2D.r)[SEL16(12*2)]
-#define gteSY0 ((s16*)psxRegs.CP2D.r)[SEL16(12*2+1)]
-#define gteSX1 ((s16*)psxRegs.CP2D.r)[SEL16(13*2)]
-#define gteSY1 ((s16*)psxRegs.CP2D.r)[SEL16(13*2+1)]
-#define gteSX2 ((s16*)psxRegs.CP2D.r)[SEL16(14*2)]
-#define gteSY2 ((s16*)psxRegs.CP2D.r)[SEL16(14*2+1)]
-#define gteSXP ((s16*)psxRegs.CP2D.r)[SEL16(15*2)]
-#define gteSYP ((s16*)psxRegs.CP2D.r)[SEL16(15*2+1)]
-#define gteSZx ((u16*)psxRegs.CP2D.r)[SEL16(16*2)]
-#define gteSZ0 ((u16*)psxRegs.CP2D.r)[SEL16(17*2)]
-#define gteSZ1 ((u16*)psxRegs.CP2D.r)[SEL16(18*2)]
-#define gteSZ2 ((u16*)psxRegs.CP2D.r)[SEL16(19*2)]
-#define gteRGB0 psxRegs.CP2D.r[20]
-#define gteRGB1 psxRegs.CP2D.r[21]
-#define gteRGB2 psxRegs.CP2D.r[22]
-#define gteMAC0 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 gteR ((u8 *)psxRegs.CP2D.r)[SEL8(6*4)]
-#define gteG ((u8 *)psxRegs.CP2D.r)[SEL8(6*4+1)]
-#define gteB ((u8 *)psxRegs.CP2D.r)[SEL8(6*4+2)]
-#define gteCODE ((u8 *)psxRegs.CP2D.r)[SEL8(6*4+3)]
-#define gteC gteCODE
-
-#define gteR0 ((u8 *)psxRegs.CP2D.r)[SEL8(20*4)]
-#define gteG0 ((u8 *)psxRegs.CP2D.r)[SEL8(20*4+1)]
-#define gteB0 ((u8 *)psxRegs.CP2D.r)[SEL8(20*4+2)]
-#define gteCODE0 ((u8 *)psxRegs.CP2D.r)[SEL8(20*4+3)]
-#define gteC0 gteCODE0
-
-#define gteR1 ((u8 *)psxRegs.CP2D.r)[SEL8(21*4)]
-#define gteG1 ((u8 *)psxRegs.CP2D.r)[SEL8(21*4+1)]
-#define gteB1 ((u8 *)psxRegs.CP2D.r)[SEL8(21*4+2)]
-#define gteCODE1 ((u8 *)psxRegs.CP2D.r)[SEL8(21*4+3)]
-#define gteC1 gteCODE1
-
-#define gteR2 ((u8 *)psxRegs.CP2D.r)[SEL8(22*4)]
-#define gteG2 ((u8 *)psxRegs.CP2D.r)[SEL8(22*4+1)]
-#define gteB2 ((u8 *)psxRegs.CP2D.r)[SEL8(22*4+2)]
-#define gteCODE2 ((u8 *)psxRegs.CP2D.r)[SEL8(22*4+3)]
-#define gteC2 gteCODE2
-
-
-
-#define gteR11 ((s16*)psxRegs.CP2C.r)[SEL16(0)]
-#define gteR12 ((s16*)psxRegs.CP2C.r)[SEL16(1)]
-#define gteR13 ((s16*)psxRegs.CP2C.r)[SEL16(2)]
-#define gteR21 ((s16*)psxRegs.CP2C.r)[SEL16(3)]
-#define gteR22 ((s16*)psxRegs.CP2C.r)[SEL16(4)]
-#define gteR23 ((s16*)psxRegs.CP2C.r)[SEL16(5)]
-#define gteR31 ((s16*)psxRegs.CP2C.r)[SEL16(6)]
-#define gteR32 ((s16*)psxRegs.CP2C.r)[SEL16(7)]
-#define gteR33 ((s16*)psxRegs.CP2C.r)[SEL16(8)]
-#define gteTRX ((s32*)psxRegs.CP2C.r)[5]
-#define gteTRY ((s32*)psxRegs.CP2C.r)[6]
-#define gteTRZ ((s32*)psxRegs.CP2C.r)[7]
-#define gteL11 ((s16*)psxRegs.CP2C.r)[SEL16(16)]
-#define gteL12 ((s16*)psxRegs.CP2C.r)[SEL16(17)]
-#define gteL13 ((s16*)psxRegs.CP2C.r)[SEL16(18)]
-#define gteL21 ((s16*)psxRegs.CP2C.r)[SEL16(19)]
-#define gteL22 ((s16*)psxRegs.CP2C.r)[SEL16(20)]
-#define gteL23 ((s16*)psxRegs.CP2C.r)[SEL16(21)]
-#define gteL31 ((s16*)psxRegs.CP2C.r)[SEL16(22)]
-#define gteL32 ((s16*)psxRegs.CP2C.r)[SEL16(23)]
-#define gteL33 ((s16*)psxRegs.CP2C.r)[SEL16(24)]
-#define gteRBK ((s32*)psxRegs.CP2C.r)[13]
-#define gteGBK ((s32*)psxRegs.CP2C.r)[14]
-#define gteBBK ((s32*)psxRegs.CP2C.r)[15]
-#define gteLR1 ((s16*)psxRegs.CP2C.r)[SEL16(32)]
-#define gteLR2 ((s16*)psxRegs.CP2C.r)[SEL16(33)]
-#define gteLR3 ((s16*)psxRegs.CP2C.r)[SEL16(34)]
-#define gteLG1 ((s16*)psxRegs.CP2C.r)[SEL16(35)]
-#define gteLG2 ((s16*)psxRegs.CP2C.r)[SEL16(36)]
-#define gteLG3 ((s16*)psxRegs.CP2C.r)[SEL16(37)]
-#define gteLB1 ((s16*)psxRegs.CP2C.r)[SEL16(38)]
-#define gteLB2 ((s16*)psxRegs.CP2C.r)[SEL16(39)]
-#define gteLB3 ((s16*)psxRegs.CP2C.r)[SEL16(40)]
-#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 ((u16*)psxRegs.CP2C.r)[SEL16(52)]
-#define gteDQA ((s16*)psxRegs.CP2C.r)[SEL16(54)]
-#define gteDQB ((s32*)psxRegs.CP2C.r)[28]
-#define gteZSF3 ((s16*)psxRegs.CP2C.r)[SEL16(58)]
-#define gteZSF4 ((s16*)psxRegs.CP2C.r)[SEL16(60)]
-#define gteFLAG psxRegs.CP2C.r[31]
+static inline u32 Lm_E(u32 result) {
+ if (result > 0x1ffff) {
+ gteFLAG |= (1 << 31) | (1 << 17);
+ return 0x1ffff;
+ }
+
+ return result;
+}
+
+#define F(a) BOUNDS((a), 0x7fffffff, (1 << 31) | (1 << 16), -(s64)0x80000000, (1 << 31) | (1 << 15))
+#define Lm_G1(a) LIM((a), 0x3ff, -0x400, (1 << 31) | (1 << 14))
+#define Lm_G2(a) LIM((a), 0x3ff, -0x400, (1 << 31) | (1 << 13))
+#define Lm_H(a) LIM((a), 0xfff, 0x000, (1 << 12))
__inline u32 MFC2(int reg) {
switch(reg) {
- case 29:
- gteORGB = (((gteIR1 >> 7) & 0x1f)) |
- (((gteIR2 >> 7) & 0x1f)<<5) |
- (((gteIR3 >> 7) & 0x1f)<<10);
-// gteORGB = (gteIR1 ) |
-// (gteIR2 << 5) |
-// (gteIR3 << 10);
-// gteORGB = ((gteIR1 & 0xf80)>>7) |
-// ((gteIR2 & 0xf80)>>2) |
-// ((gteIR3 & 0xf80)<<3);
- return gteORGB;
+ case 1: case 3: case 5:
+ case 8: case 9: case 10:
+ case 11:
+ psxRegs.CP2D.r[reg] = (s32)psxRegs.CP2D.p[reg].sw.l;
+ break;
- default:
- return psxRegs.CP2D.r[reg];
- }
-}
+ case 7: case 16: case 17:
+ case 18: case 19:
+ psxRegs.CP2D.r[reg] = (u32)psxRegs.CP2D.p[reg].w.l;
+ break;
-__inline void MTC2(u32 value, int reg) {
- int a;
+ case 15:
+ psxRegs.CP2D.r[reg] = gteSXY2;
+ break;
- switch(reg) {
- case 8: case 9: case 10: case 11:
- psxRegs.CP2D.r[reg] = (short)value;
+ case 28: case 30:
+// SysPrintf("MFC2: psxRegs.CP2D.r[%d] cannot be read\n");
+ return 0;
+
+ case 29:
+ psxRegs.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];
+}
+__inline void MTC2(unsigned long value, int reg) {
+ switch (reg) {
case 15:
gteSXY0 = gteSXY1;
gteSXY1 = gteSXY2;
@@ -202,46 +112,68 @@ __inline void MTC2(u32 value, int reg) {
gteSXYP = value;
break;
- case 16: case 17: case 18: case 19:
- psxRegs.CP2D.r[reg] = (value & 0xffff);
- break;
+// case 23: SysPrintf("RES1\n"); break;
case 28:
- psxRegs.CP2D.r[28] = value;
- gteIR1 = ((value ) & 0x1f) << 7;
- gteIR2 = ((value >> 5) & 0x1f) << 7;
- gteIR3 = ((value >> 10) & 0x1f) << 7;
-// gteIR1 = (value ) & 0x1f;
-// gteIR2 = (value >> 5) & 0x1f;
-// gteIR3 = (value >> 10) & 0x1f;
-// gteIR1 = ((value ) & 0x1f) << 4;
-// gteIR2 = ((value >> 5) & 0x1f) << 4;
-// gteIR3 = ((value >> 10) & 0x1f) << 4;
+ gteIRGB = value;
+ gteIR1 = (value & 0x1f) << 7;
+ gteIR2 = (value & 0x3e0) << 2;
+ gteIR3 = (value & 0x7c00) >> 3;
break;
case 30:
- psxRegs.CP2D.r[30] = value;
-
- a = psxRegs.CP2D.r[30];
- if (a > 0) {
- int i;
- for (i=31; (a & (1 << i)) == 0 && i >= 0; i--);
- psxRegs.CP2D.r[31] = 31 - i;
- } else if (a < 0) {
- int i;
- a^= 0xffffffff;
- for (i=31; (a & (1 << i)) == 0 && i >= 0; i--);
- psxRegs.CP2D.r[31] = 31 - i;
- } else {
- psxRegs.CP2D.r[31] = 32;
+ {
+ gteLZCS = value;
+
+ int a = gteLZCS;
+ if (a > 0) {
+ int i;
+ for (i = 31; (a & (1 << i)) == 0 && i >= 0; i--);
+ gteLZCR = 31 - i;
+ } else if (a < 0) {
+ int i;
+ a ^= 0xffffffff;
+ for (i=31; (a & (1 << i)) == 0 && i >= 0; i--);
+ gteLZCR = 31 - i;
+ } else {
+ gteLZCR = 32;
+ }
}
break;
-
+
+ case 7: case 29: case 31:
+// SysPrintf("MTC2: psxRegs.CP2D.r[%d] cannot be write\n", reg);
+ return;
+
default:
psxRegs.CP2D.r[reg] = value;
}
}
+static void setcp2cr(int reg, u32 value) {
+ switch (reg) {
+ case 4:
+ case 12:
+ case 20:
+ case 26:
+ case 27:
+ case 29:
+ case 30:
+ value = (s32)(s16) value;
+ break;
+
+ case 31:
+// SysPrintf("setcp2cr: reg=%d\n", reg);
+ value = value & 0x7ffff000;
+ if ((value & 0x7f87e000) != 0) {
+ value |= 0x80000000;
+ }
+ break;
+ }
+
+ psxRegs.CP2C.r[reg] = value;
+}
+
void gteMFC2() {
if (!_Rt_) return;
psxRegs.GPR.r[_Rt_] = MFC2(_Rd_);
@@ -257,7 +189,7 @@ void gteMTC2() {
}
void gteCTC2() {
- psxRegs.CP2C.r[_Rd_] = psxRegs.GPR.r[_Rt_];
+ setcp2cr(_Rd_, psxRegs.GPR.r[_Rt_]);
}
#define _oB_ (psxRegs.GPR.r[_Rs_] + _Imm_)
@@ -270,2855 +202,557 @@ void gteSWC2() {
psxMemWrite32(_oB_, MFC2(_Rt_));
}
-/////LIMITATIONS AND OTHER STUFF************************************
-
-
-/*
-#define MAGIC (((65536. * 65536. * 16) + (65536.*.5)) * 65536.)
-
-static __inline long float2int(double d)
-{
- double dtemp = MAGIC + d;
- return (*(long *)&dtemp)-0x80000000;
-}*/
-/*
-__inline double EDETEC1(double data)
-{
- if (data<(double)-2147483647) {gteFLAG|=1<<30; return (double)-2147483647;}
- else
- if (data>(double) 2147483647) {gteFLAG|=1<<27; return (double) 2147483647;}
-
- else return data;
-}
-
-__inline double EDETEC2(double data)
-{
- if (data<(double)-2147483647) {gteFLAG|=1<<29; return (double)-2147483647;}
- else
- if (data>(double) 2147483647) {gteFLAG|=1<<26; return (double) 2147483647;}
-
- else return data;
-}
-
-__inline double EDETEC3(double data)
-{
- if (data<(double)-2147483647) {gteFLAG|=1<<28; return (double)-2147483647;}
- else
- if (data>(double) 2147483647) {gteFLAG|=1<<25; return (double) 2147483647;}
-
- else return data;
-}
-
-__inline double EDETEC4(double data)
-{
- if (data<(double)-2147483647) {gteFLAG|=1<<16; return (double)-2147483647;}
- else
- if (data>(double) 2147483647) {gteFLAG|=1<<15; return (double) 2147483647;}
-
- else return data;
-}*/
-/*
-double LimitAU(double fraction,unsigned long bitIndex) {
- if (fraction < 0.0) { fraction = 0.0; gteFLAG |= (1<<bitIndex); }
- else
- if (fraction > 32767.0) { fraction = 32767.0; gteFLAG |= (1<<bitIndex); }
-
- return (fraction);
-}
-
-double LimitAS(double fraction,unsigned long bitIndex) {
- if (fraction <-32768.0) { fraction =-32768.0; gteFLAG |= (1<<bitIndex); }
- else
- if (fraction > 32767.0) { fraction = 32767.0; gteFLAG |= (1<<bitIndex); }
-
- return (fraction);
-}
-
-double LimitB (double fraction,unsigned long bitIndex) {
- if (fraction < 0.0) { fraction = 0.0; gteFLAG |= (1<<bitIndex); }
- else
- if (fraction > 255.0) { fraction = 255.0; gteFLAG |= (1<<bitIndex); }
-
- return (fraction);
-}
-
-double LimitC (double fraction,unsigned long bitIndex) {
- if (fraction < 0.0) { fraction = 0.0; gteFLAG |= (1<<bitIndex); }
- else
- if (fraction > 65535.0) { fraction = 65535.0; gteFLAG |= (1<<bitIndex); }
-
- return (fraction);
-}
-
-double LimitD (double fraction,unsigned long bitIndex) {
- if (fraction < -1024.0) { fraction = -1024.0; gteFLAG |= (1<<bitIndex); }
- else
- if (fraction > 1023.0) { fraction = 1023.0; gteFLAG |= (1<<bitIndex); }
-
- return (fraction);
-}
-
-double LimitE (double fraction,unsigned long bitIndex) {
- if (fraction < 0.0) { fraction = 0.0; gteFLAG |= (1<<bitIndex); }
- else
- if (fraction > 1023.0) { fraction = 1023.0; gteFLAG |= (1<<bitIndex); }
-
- return (fraction);
-}
-
-double LIMIT(double data,double MIN,double MAX,int FLAG)
-{
- if (data<MIN) {gteFLAG|=1<<FLAG; return MIN;}
- else
- if (data>MAX) {gteFLAG|=1<<FLAG; return MAX;}
-
- else return data;
-}
-
-double ALIMIT(double data,double MIN,double MAX)
-{
- if (data<MIN) return MIN;
- else
- if (data>MAX) return MAX;
-
- else return data;
-}
-
-double OLIMIT(double data)
-{
- data=(data);
-
- if (data<(double)-2147483647) {return (double)-2147483647;}
- else
- if (data>(double) 2147483647) {return (double) 2147483647;}
-
- else return data;
-}*/
-
-__inline double NC_OVERFLOW1(double x) {
- if (x<-2147483648.0) {gteFLAG |= 1<<29;}
- else if (x> 2147483647.0) {gteFLAG |= 1<<26;}
-
- return x;
-}
-
-__inline double NC_OVERFLOW2(double x) {
- if (x<-2147483648.0) {gteFLAG |= 1<<28;}
- else if (x> 2147483647.0) {gteFLAG |= 1<<25;}
-
- return x;
-}
-
-__inline double NC_OVERFLOW3(double x) {
- if (x<-2147483648.0) {gteFLAG |= 1<<27;}
- else if (x> 2147483647.0) {gteFLAG |= 1<<24;}
-
- return x;
-}
-
-__inline double NC_OVERFLOW4(double x) {
- if (x<-2147483648.0) {gteFLAG |= 1<<16;}
- else if (x> 2147483647.0) {gteFLAG |= 1<<15;}
-
- return x;
-}
-
-__inline s32 FNC_OVERFLOW1(s64 x) {
- if (x < UNDERFLOW_BOUND) { gteFLAG |= (1 << 29); }
- else if (x > 2147483647) { gteFLAG |= (1 << 26); }
-
- return (s32)x;
-}
-
-__inline s32 FNC_OVERFLOW2(s64 x) {
- if (x < UNDERFLOW_BOUND) { gteFLAG |= (1 << 28); }
- else if (x > 2147483647) { gteFLAG |= (1 << 25); }
-
- return (s32)x;
-}
-
-__inline s32 FNC_OVERFLOW3(s64 x) {
- if (x < UNDERFLOW_BOUND) { gteFLAG |= (1 << 27); }
- else if (x > 2147483647) { gteFLAG |= (1 << 24); }
-
- return (s32)x;
-}
-
-__inline s32 FNC_OVERFLOW4(s64 x) {
- if (x < UNDERFLOW_BOUND) { gteFLAG |= (1 << 16); }
- else if (x > 2147483647) { gteFLAG |= (1 << 15); }
-
- return (s32)x;
-}
-
-#define _LIMX(negv, posv, flagb) { \
- if (x < (negv)) { x = (negv); gteFLAG |= (1<<flagb); } else \
- if (x > (posv)) { x = (posv); gteFLAG |= (1<<flagb); } return (x); \
-}
-
-__inline double limA1S(double x) { _LIMX(-32768.0, 32767.0, 24); }
-__inline double limA2S(double x) { _LIMX(-32768.0, 32767.0, 23); }
-__inline double limA3S(double x) { _LIMX(-32768.0, 32767.0, 22); }
-__inline double limA1U(double x) { _LIMX(0.0, 32767.0, 24); }
-__inline double limA2U(double x) { _LIMX(0.0, 32767.0, 23); }
-__inline double limA3U(double x) { _LIMX(0.0, 32767.0, 22); }
-__inline double limB1 (double x) { _LIMX(0.0, 255.0, 21); }
-__inline double limB2 (double x) { _LIMX(0.0, 255.0, 20); }
-__inline double limB3 (double x) { _LIMX(0.0, 255.0, 19); }
-__inline double limC (double x) { _LIMX(0.0, 65535.0, 18); }
-__inline double limD1 (double x) { _LIMX(-1024.0, 1023.0, 14); }
-__inline double limD2 (double x) { _LIMX(-1024.0, 1023.0, 13); }
-__inline double limE (double x) { _LIMX(0.0, 4095.0, 12); }
-
-__inline double limG1(double x) {
- if (x > 2147483647.0) { gteFLAG |= (1<<16); } else
- if (x <-2147483648.0) { gteFLAG |= (1<<15); }
-
- if (x > 1023.0) { x = 1023.0; gteFLAG |= (1<<14); } else
- if (x < -1024.0) { x = -1024.0; gteFLAG |= (1<<14); } return (x);
-}
-
-__inline double limG2(double x) {
- if (x > 2147483647.0) { gteFLAG |= (1<<16); } else
- if (x <-2147483648.0) { gteFLAG |= (1<<15); }
-
- if (x > 1023.0) { x = 1023.0; gteFLAG |= (1<<13); } else
- if (x < -1024.0) { x = -1024.0; gteFLAG |= (1<<13); } return (x);
-}
-
-__inline s32 F12limA1S(s64 x) { _LIMX(-32768<<12, 32767<<12, 24); }
-__inline s32 F12limA2S(s64 x) { _LIMX(-32768<<12, 32767<<12, 23); }
-__inline s32 F12limA3S(s64 x) { _LIMX(-32768<<12, 32767<<12, 22); }
-__inline s32 F12limA1U(s64 x) { _LIMX(0, 32767<<12, 24); }
-__inline s32 F12limA2U(s64 x) { _LIMX(0, 32767<<12, 23); }
-__inline s32 F12limA3U(s64 x) { _LIMX(0, 32767<<12, 22); }
-
-__inline s16 FlimA1S(s32 x) { _LIMX(-32768, 32767, 24); }
-__inline s16 FlimA2S(s32 x) { _LIMX(-32768, 32767, 23); }
-__inline s16 FlimA3S(s32 x) { _LIMX(-32768, 32767, 22); }
-__inline s16 FlimA1U(s32 x) { _LIMX(0, 32767, 24); }
-__inline s16 FlimA2U(s32 x) { _LIMX(0, 32767, 23); }
-__inline s16 FlimA3U(s32 x) { _LIMX(0, 32767, 22); }
-__inline u8 FlimB1 (s32 x) { _LIMX(0, 255, 21); }
-__inline u8 FlimB2 (s32 x) { _LIMX(0, 255, 20); }
-__inline u8 FlimB3 (s32 x) { _LIMX(0, 255, 19); }
-__inline u16 FlimC (s32 x) { _LIMX(0, 65535, 18); }
-__inline s32 FlimD1 (s32 x) { _LIMX(-1024, 1023, 14); }
-__inline s32 FlimD2 (s32 x) { _LIMX(-1024, 1023, 13); }
-__inline s32 FlimE (s32 x) { _LIMX(0, 65535, 12); }
-//__inline s32 FlimE (s32 x) { _LIMX(0, 4095, 12); }
-
-__inline s32 FlimG1(s64 x) {
- if (x > 2147483647) { gteFLAG |= (1 << 16); }
- else if (x < UNDERFLOW_BOUND) { gteFLAG |= (1 << 15); }
-
- if (x > 1023) { x = 1023; gteFLAG |= (1 << 14); }
- else if (x < -1024) { x = -1024; gteFLAG |= (1 << 14); } return (x);
-}
-
-__inline s32 FlimG2(s64 x) {
- if (x > 2147483647) { gteFLAG |= (1 << 16); }
- else if (x < UNDERFLOW_BOUND) { gteFLAG |= (1 << 15); }
-
- if (x > 1023) { x = 1023; gteFLAG |= (1 << 13); }
- else if (x < -1024) { x = -1024; gteFLAG |= (1 << 13); } return (x);
-}
-
-#define MAC2IR() { \
- if (gteMAC1 < (long)(-32768)) { gteIR1=(long)(-32768); gteFLAG |= (1 << 24);} \
- else \
- if (gteMAC1 > (long)( 32767)) { gteIR1=(long)( 32767); gteFLAG |= (1 << 24);} \
- else gteIR1=(long)gteMAC1; \
- if (gteMAC2 < (long)(-32768)) { gteIR2=(long)(-32768); gteFLAG|=1<<23;} \
- else \
- if (gteMAC2 > (long)( 32767)) { gteIR2=(long)( 32767); gteFLAG|=1<<23;} \
- else gteIR2=(long)gteMAC2; \
- if (gteMAC3 < (long)(-32768)) { gteIR3=(long)(-32768); gteFLAG|=1<<22;} \
- else \
- if (gteMAC3 > (long)( 32767)) { gteIR3=(long)( 32767); gteFLAG|=1<<22;} \
- else gteIR3=(long)gteMAC3; \
-}
-
-
-#define MAC2IR1() { \
- if (gteMAC1 < (long)0) { gteIR1=(long)0; gteFLAG|=1<<24;} \
- else if (gteMAC1 > (long)(32767)) { gteIR1=(long)(32767); gteFLAG|=1<<24;} \
- else gteIR1=(long)gteMAC1; \
- if (gteMAC2 < (long)0) { gteIR2=(long)0; gteFLAG|=1<<23;} \
- else if (gteMAC2 > (long)(32767)) { gteIR2=(long)(32767); gteFLAG|=1<<23;} \
- else gteIR2=(long)gteMAC2; \
- if (gteMAC3 < (long)0) { gteIR3=(long)0; gteFLAG|=1<<22;} \
- else if (gteMAC3 > (long)(32767)) { gteIR3=(long)(32767); gteFLAG|=1<<22;} \
- else gteIR3=(long)gteMAC3; \
-}
-
-//********END OF LIMITATIONS**********************************/
-
-#define GTE_RTPS1(vn) { \
- gteMAC1 = FNC_OVERFLOW1(((signed long)(gteR11*gteVX##vn + gteR12*gteVY##vn + gteR13*gteVZ##vn)>>12) + gteTRX); \
- gteMAC2 = FNC_OVERFLOW2(((signed long)(gteR21*gteVX##vn + gteR22*gteVY##vn + gteR23*gteVZ##vn)>>12) + gteTRY); \
- gteMAC3 = FNC_OVERFLOW3(((signed long)(gteR31*gteVX##vn + gteR32*gteVY##vn + gteR33*gteVZ##vn)>>12) + gteTRZ); \
-}
-
-/* gteMAC1 = NC_OVERFLOW1(((signed long)(gteR11*gteVX0 + gteR12*gteVY0 + gteR13*gteVZ0)>>12) + gteTRX);
- gteMAC2 = NC_OVERFLOW2(((signed long)(gteR21*gteVX0 + gteR22*gteVY0 + gteR23*gteVZ0)>>12) + gteTRY);
- gteMAC3 = NC_OVERFLOW3(((signed long)(gteR31*gteVX0 + gteR32*gteVY0 + gteR33*gteVZ0)>>12) + gteTRZ);*/
-
-#if 0
-
-#define GTE_RTPS2(vn) { \
- if (gteSZ##vn == 0) { \
- DSZ = 2.0f; gteFLAG |= 1<<17; \
- } else { \
- DSZ = (double)gteH / gteSZ##vn; \
- if (DSZ > 2.0) { DSZ = 2.0f; gteFLAG |= 1<<17; } \
-/* if (DSZ > 2147483647.0) { DSZ = 2.0f; gteFLAG |= 1<<17; }*/ \
- } \
- \
-/* gteSX##vn = limG1(gteOFX/65536.0 + (limA1S(gteMAC1) * DSZ));*/ \
-/* gteSY##vn = limG2(gteOFY/65536.0 + (limA2S(gteMAC2) * DSZ));*/ \
- gteSX##vn = FlimG1(gteOFX/65536.0 + (gteIR1 * DSZ)); \
- gteSY##vn = FlimG2(gteOFY/65536.0 + (gteIR2 * DSZ)); \
-}
-
-#define GTE_RTPS3() { \
- DSZ = gteDQB/16777216.0 + (gteDQA/256.0) * DSZ; \
- gteMAC0 = DSZ * 16777216.0; \
- gteIR0 = limE(DSZ * 4096.0f); \
-printf("zero %x, %x\n", gteMAC0, gteIR0); \
-}
-#endif
-//#if 0
-#define GTE_RTPS2(vn) { \
- if (gteSZ##vn == 0) { \
- FDSZ = 2 << 16; gteFLAG |= 1<<17; \
- } else { \
- FDSZ = ((u64)gteH << 32) / ((u64)gteSZ##vn << 16); \
- if ((u64)FDSZ > (2 << 16)) { FDSZ = 2 << 16; gteFLAG |= 1<<17; } \
- } \
- \
- gteSX##vn = FlimG1((gteOFX + (((s64)((s64)gteIR1 << 16) * FDSZ) >> 16)) >> 16); \
- gteSY##vn = FlimG2((gteOFY + (((s64)((s64)gteIR2 << 16) * FDSZ) >> 16)) >> 16); \
-}
-
-#define GTE_RTPS3() { \
- FDSZ = (s64)((s64)gteDQB + (((s64)((s64)gteDQA << 8) * FDSZ) >> 8)); \
- gteMAC0 = FDSZ; \
- gteIR0 = FlimE(FDSZ >> 12); \
-}
-//#endif
-// gteMAC0 = (gteDQB/16777216.0 + (gteDQA/256.0) * DSZ) * 16777216.0;
-// gteIR0 = limE((gteDQB/16777216.0 + (gteDQA/256.0) * DSZ) * 4096.0);
-// gteMAC0 = ((gteDQB >> 24) + (gteDQA >> 8) * DSZ) * 16777216.0;
-// gteIR0 = FlimE(((gteDQB >> 24) + (gteDQA >> 8) * DSZ) * 4096.0);
-
-
void gteRTPS() {
-// double SSX0,SSY0,SSZ0;
-// double SZ;
-// double DSZ;
- s64 FDSZ;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
+ int h_over_sz3;
#ifdef GTE_LOG
- GTE_LOG("GTE_RTPS\n");
-#endif
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("RTPS", 14);
- G_SD(0);
- G_SD(1);
-
- G_SD(16); // Store original fifo
- G_SD(17);
- G_SD(18);
- G_SD(19);
-
- G_SC(0);
- G_SC(1);
- G_SC(2);
- G_SC(3);
- G_SC(4);
- G_SC(5);
- G_SC(6);
- G_SC(7);
-
- G_SC(24);
- G_SC(25);
- G_SC(26);
- G_SC(27);
- G_SC(28);
- }
+ GTE_LOG("RTPS\n");
#endif
-/* gteFLAG = 0;
-
- SSX0 = NC_OVERFLOW1((double)gteTRX + ((double)(gteVX0*gteR11) + (double)(gteVY0*gteR12) + (double)(gteVZ0*gteR13))/4096.0);
- SSY0 = NC_OVERFLOW2((double)gteTRY + ((double)(gteVX0*gteR21) + (double)(gteVY0*gteR22) + (double)(gteVZ0*gteR23))/4096.0);
- SSZ0 = NC_OVERFLOW3((double)gteTRZ + ((double)(gteVX0*gteR31) + (double)(gteVY0*gteR32) + (double)(gteVZ0*gteR33))/4096.0);
-
- SZ = LIMIT(SSZ0,(double)0,(double)65535,18);
- DSZ = ((double)gteH/SZ);
-
- if ((DSZ>(double)2147483647)) {DSZ=(double)2; gteFLAG|=1<<17;}
-
- gteSZ0 = gteSZ1;
- gteSZ1 = gteSZ2;
- gteSZ2 = gteSZx;
- gteSZx = (unsigned short)float2int(SZ);
-
- psxRegs.CP2D.r[12]= psxRegs.CP2D.r[13];
- psxRegs.CP2D.r[13]= psxRegs.CP2D.r[14];
-
- gteSX2 = (signed short)float2int(LIMIT((double)(gteOFX)/65536.0f + (LimitAS(SSX0,24)*DSZ),(double)-1024,(double)1024,14));
- gteSY2 = (signed short)float2int(LIMIT((double)(gteOFY)/65536.0f + (LimitAS(SSY0,23)*DSZ),(double)-1024,(double)1024,13));
-
- gteMAC1 = (signed long)(SSX0);
- gteMAC2 = (signed long)(SSY0);
- gteMAC3 = (signed long)(SSZ0);
-
- MAC2IR();
-
- gteMAC0 = (signed long)float2int(OLIMIT((((double)gteDQB/(double)16777216) + (((double)gteDQA/(double)256)*DSZ))*16777216));
- gteIR0 = (signed long)float2int(LIMIT(((((double)gteDQB/(double)16777216) + (((double)gteDQA/(double)256)*DSZ))*4096),(double)0,(double)4095,12));
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
-
gteFLAG = 0;
- GTE_RTPS1(0);
-
- MAC2IR();
-
- gteSZx = gteSZ0;
+ gteMAC1 = A1((((s64)gteTRX << 12) + (gteR11 * gteVX0) + (gteR12 * gteVY0) + (gteR13 * gteVZ0)) >> 12);
+ gteMAC2 = A2((((s64)gteTRY << 12) + (gteR21 * gteVX0) + (gteR22 * gteVY0) + (gteR23 * gteVZ0)) >> 12);
+ gteMAC3 = A3((((s64)gteTRZ << 12) + (gteR31 * gteVX0) + (gteR32 * gteVY0) + (gteR33 * gteVZ0)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 0);
+ gteIR2 = Lm_B2(gteMAC2, 0);
+ gteIR3 = Lm_B3(gteMAC3, 0);
gteSZ0 = gteSZ1;
gteSZ1 = gteSZ2;
-// gteSZ2 = limC(gteMAC3);
- gteSZ2 = FlimC(gteMAC3);
-
- gteSXY0 = gteSXY1;
+ gteSZ2 = gteSZ3;
+ gteSZ3 = Lm_D(gteMAC3);
+ h_over_sz3 = Lm_E((gteH * 65536) / (gteSZ3 + 0.5));
+ gteSXY0 = gteSXY1;
gteSXY1 = gteSXY2;
+ gteSX2 = Lm_G1(F((s64)gteOFX + ((s64)gteIR1 * h_over_sz3)) >> 16);
+ gteSY2 = Lm_G2(F((s64)gteOFY + ((s64)gteIR2 * h_over_sz3)) >> 16);
- GTE_RTPS2(2);
- gteSXYP = gteSXY2;
-
- GTE_RTPS3();
-
- SUM_FLAG;
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(8);
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- //G_GD(12);
- //G_GD(13);
- G_GD(14);
-
- G_GD(16);
- G_GD(17);
- G_GD(18);
- G_GD(19);
-
- G_GD(24);
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteMAC0 = F((s64)(gteDQB + ((s64)gteDQA * h_over_sz3)) >> 12);
+ gteIR0 = Lm_H(gteMAC0);
}
void gteRTPT() {
-// double SSX0,SSY0,SSZ0;
-// double SZ;
-// double DSZ;
- s64 FDSZ;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
+ int h_over_sz3;
+ int v;
+ s32 vx, vy, vz;
#ifdef GTE_LOG
- GTE_LOG("GTE_RTPT\n");
-#endif
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("RTPT", 22);
- G_SD(0);
- G_SD(1);
- G_SD(2);
- G_SD(3);
- G_SD(4);
- G_SD(5);
-
- G_SD(16); // Store original fifo
- G_SD(17);
- G_SD(18);
- G_SD(19);
-
- G_SC(0);
- G_SC(1);
- G_SC(2);
- G_SC(3);
- G_SC(4);
- G_SC(5);
- G_SC(6);
- G_SC(7);
-
- G_SC(24);
- G_SC(25);
- G_SC(26);
- G_SC(27);
- G_SC(28);
- }
+ GTE_LOG("RTPT\n");
#endif
-/* gteFLAG = 0;
-
- gteSZ0 = gteSZx;
-
- SSX0 = NC_OVERFLOW1((double)gteTRX + ((double)(gteVX0 * gteR11) + (double)(gteVY0 * gteR12) + (double)(gteVZ0 * gteR13)) / 4096.0);
- SSY0 = NC_OVERFLOW2((double)gteTRY + ((double)(gteVX0 * gteR21) + (double)(gteVY0 * gteR22) + (double)(gteVZ0 * gteR23)) / 4096.0);
- SSZ0 = NC_OVERFLOW3((double)gteTRZ + ((double)(gteVX0 * gteR31) + (double)(gteVY0 * gteR32) + (double)(gteVZ0 * gteR33)) / 4096.0);
-
- SZ = LIMIT(SSZ0, (double)0, (double)65535, 18);
- DSZ = ((double)gteH / SZ);
-
- if ((DSZ>(double)2147483647)) {DSZ=(double)2; gteFLAG|=1<<17;}
-
- gteSZ1 = (unsigned short)float2int(SZ);
- gteSX0 = (signed short)float2int(LIMIT((double)(gteOFX)/65536.0f + (LimitAS(SSX0,24)*DSZ),(double)-1024,(double)1023,14));
- gteSY0 = (signed short)float2int(LIMIT((double)(gteOFY)/65536.0f + (LimitAS(SSY0,23)*DSZ),(double)-1024,(double)1023,13));
-
- SSX0 = NC_OVERFLOW1((double)gteTRX + ((double)(gteVX1*gteR11) + (double)(gteVY1*gteR12) + (double)(gteVZ1*gteR13))/4096.0);
- SSY0 = NC_OVERFLOW2((double)gteTRY + ((double)(gteVX1*gteR21) + (double)(gteVY1*gteR22) + (double)(gteVZ1*gteR23))/4096.0);
- SSZ0 = NC_OVERFLOW3((double)gteTRZ + ((double)(gteVX1*gteR31) + (double)(gteVY1*gteR32) + (double)(gteVZ1*gteR33))/4096.0);
-
- SZ = LIMIT(SSZ0,(double)0,(double)65535,18);
- DSZ = ((double)gteH/SZ);
-
- if ((DSZ>(double)2147483647)) {DSZ=(double)2; gteFLAG|=1<<17;}
-
- gteSZ2 = (unsigned short)float2int(SZ);
- gteSX1 = (signed short)float2int(LIMIT((double)(gteOFX)/65536.0f + (LimitAS(SSX0,24)*DSZ),(double)-1024,(double)1023,14));
- gteSY1 = (signed short)float2int(LIMIT((double)(gteOFY)/65536.0f + (LimitAS(SSY0,23)*DSZ),(double)-1024,(double)1023,13));
-
- SSX0 = NC_OVERFLOW1((double)gteTRX + ((double)(gteVX2*gteR11) + (double)(gteVY2*gteR12) + (double)(gteVZ2*gteR13))/4096.0);
- SSY0 = NC_OVERFLOW2((double)gteTRY + ((double)(gteVX2*gteR21) + (double)(gteVY2*gteR22) + (double)(gteVZ2*gteR23))/4096.0);
- SSZ0 = NC_OVERFLOW3((double)gteTRZ + ((double)(gteVX2*gteR31) + (double)(gteVY2*gteR32) + (double)(gteVZ2*gteR33))/4096.0);
-
- SZ = LIMIT(SSZ0,(double)0,(double)65535,18);
- DSZ = ((double)gteH/SZ);
-
- if ((DSZ>(double)2147483647)) {DSZ=(double)2; gteFLAG|=1<<17;}
-
- gteSZx = (unsigned short)float2int(SZ);
- gteSX2 = (signed short)float2int(LIMIT((double)(gteOFX)/65536.0f + (LimitAS(SSX0,24)*DSZ),(double)-1024,(double)1023,14));
- gteSY2 = (signed short)float2int(LIMIT((double)(gteOFY)/65536.0f + (LimitAS(SSY0,23)*DSZ),(double)-1024,(double)1023,13));
-
- gteMAC1 = (signed long)float2int(SSX0);
- gteMAC2 = (signed long)float2int(SSY0);
- gteMAC3 = (signed long)float2int(SSZ0);
-
- MAC2IR();
-
- gteMAC0 = (signed long)float2int(OLIMIT((((double)gteDQB/(double)16777216) + (((double)gteDQA/(double)256)*DSZ))*16777216));
- gteIR0 = (signed long)float2int(LIMIT(((((double)gteDQB/(double)16777216) + (((double)gteDQA/(double)256)*DSZ))*4096),(double)0,(double)4095,12));
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
-
- /* NC: old
- gteFLAG = 0;
-
- gteSZ0 = gteSZx;
-
- gteMAC1 = NC_OVERFLOW1(((signed long)(gteR11*gteVX0 + gteR12*gteVY0 + gteR13*gteVZ0)>>12) + gteTRX);
- gteMAC2 = NC_OVERFLOW2(((signed long)(gteR21*gteVX0 + gteR22*gteVY0 + gteR23*gteVZ0)>>12) + gteTRY);
- gteMAC3 = NC_OVERFLOW3(((signed long)(gteR31*gteVX0 + gteR32*gteVY0 + gteR33*gteVZ0)>>12) + gteTRZ);
-
- DSZ = gteH / limC(gteMAC3);
- if (DSZ > 2147483647.0) { DSZ = 2.0f; gteFLAG |= 1<<17; }
-
- gteSZ1 = limC(gteMAC3);
-
- gteSX0 = limG1(gteOFX/65536.0 + (limA1S(gteMAC1) * DSZ));
- gteSY0 = limG2(gteOFY/65536.0 + (limA2S(gteMAC2) * DSZ));
-
- gteMAC1 = NC_OVERFLOW1(((signed long)(gteR11*gteVX1 + gteR12*gteVY1 + gteR13*gteVZ1)>>12) + gteTRX);
- gteMAC2 = NC_OVERFLOW2(((signed long)(gteR21*gteVX1 + gteR22*gteVY1 + gteR23*gteVZ1)>>12) + gteTRY);
- gteMAC3 = NC_OVERFLOW3(((signed long)(gteR31*gteVX1 + gteR32*gteVY1 + gteR33*gteVZ1)>>12) + gteTRZ);
-
- DSZ = gteH / limC(gteMAC3);
- if (DSZ > 2147483647.0) { DSZ = 2.0f; gteFLAG |= 1<<17; }
-
- gteSZ2 = limC(gteMAC3);
-
- gteSX1 = limG1(gteOFX/65536.0 + (limA1S(gteMAC1) * DSZ ));
- gteSY1 = limG2(gteOFY/65536.0 + (limA2S(gteMAC2) * DSZ ));
-
- gteMAC1 = NC_OVERFLOW1(((signed long)(gteR11*gteVX2 + gteR12*gteVY2 + gteR13*gteVZ2)>>12) + gteTRX);
- gteMAC2 = NC_OVERFLOW2(((signed long)(gteR21*gteVX2 + gteR22*gteVY2 + gteR23*gteVZ2)>>12) + gteTRY);
- gteMAC3 = NC_OVERFLOW3(((signed long)(gteR31*gteVX2 + gteR32*gteVY2 + gteR33*gteVZ2)>>12) + gteTRZ);
-
- DSZ = gteH / limC(gteMAC3); if (DSZ > 2147483647.0f) { DSZ = 2.0f; gteFLAG |= 1<<17; }
-
- gteSZx = gteSZ2;
-
- gteSX2 = limG1(gteOFX/65536.0 + (limA1S(gteMAC1) * DSZ ));
- gteSY2 = limG2(gteOFY/65536.0 + (limA2S(gteMAC2) * DSZ ));
-
- MAC2IR();
-
- gteMAC0 = (gteDQB/16777216.0 + (gteDQA/256.0) * DSZ ) * 16777216.0;
- gteIR0 = limE((gteDQB/16777216.0 + (gteDQA/256.0) * DSZ ) * 4096.0f);
- */
-
gteFLAG = 0;
- gteSZx = gteSZ2;
-
- GTE_RTPS1(0);
-
-// gteSZ0 = limC(gteMAC3);
- gteSZ0 = FlimC(gteMAC3);
-
- gteIR1 = FlimA1S(gteMAC1);
- gteIR2 = FlimA2S(gteMAC2);
- GTE_RTPS2(0);
-
- GTE_RTPS1(1);
-
-// gteSZ1 = limC(gteMAC3);
- gteSZ1 = FlimC(gteMAC3);
-
- gteIR1 = FlimA1S(gteMAC1);
- gteIR2 = FlimA2S(gteMAC2);
- GTE_RTPS2(1);
-
- GTE_RTPS1(2);
-
- MAC2IR();
-
-// gteSZ2 = limC(gteMAC3);
- gteSZ2 = FlimC(gteMAC3);
-
- GTE_RTPS2(2);
- gteSXYP = gteSXY2;
-
- GTE_RTPS3();
-
- SUM_FLAG;
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(8);
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- G_GD(12);
- G_GD(13);
- G_GD(14);
-
- G_GD(16);
- G_GD(17);
- G_GD(18);
- G_GD(19);
-
- G_GD(24);
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
-}
-
-#define gte_C11 gteLR1
-#define gte_C12 gteLR2
-#define gte_C13 gteLR3
-#define gte_C21 gteLG1
-#define gte_C22 gteLG2
-#define gte_C23 gteLG3
-#define gte_C31 gteLB1
-#define gte_C32 gteLB2
-#define gte_C33 gteLB3
-
-#define _MVMVA_FUNC(_v0, _v1, _v2, mx) { \
- SSX = (_v0) * mx##11 + (_v1) * mx##12 + (_v2) * mx##13; \
- SSY = (_v0) * mx##21 + (_v1) * mx##22 + (_v2) * mx##23; \
- SSZ = (_v0) * mx##31 + (_v1) * mx##32 + (_v2) * mx##33; \
+ gteSZ0 = gteSZ3;
+ for (v = 0; v < 3; v++) {
+ vx = VX(v);
+ vy = VY(v);
+ vz = VZ(v);
+ gteMAC1 = A1((((s64)gteTRX << 12) + (gteR11 * vx) + (gteR12 * vy) + (gteR13 * vz)) >> 12);
+ gteMAC2 = A2((((s64)gteTRY << 12) + (gteR21 * vx) + (gteR22 * vy) + (gteR23 * vz)) >> 12);
+ gteMAC3 = A3((((s64)gteTRZ << 12) + (gteR31 * vx) + (gteR32 * vy) + (gteR33 * vz)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 0);
+ gteIR2 = Lm_B2(gteMAC2, 0);
+ gteIR3 = Lm_B3(gteMAC3, 0);
+ fSZ(v) = Lm_D(gteMAC3);
+ h_over_sz3 = Lm_E((gteH * 65536) / (fSZ(v) + 0.5));
+ fSX(v) = Lm_G1(F((s64)gteOFX + ((s64)gteIR1 * h_over_sz3)) >> 16);
+ fSY(v) = Lm_G2(F((s64)gteOFY + ((s64)gteIR2 * h_over_sz3)) >> 16);
+ }
+ gteMAC0 = F((s64)(gteDQB + ((s64)gteDQA * h_over_sz3)) >> 12);
+ gteIR0 = Lm_H(gteMAC0);
}
void gteMVMVA() {
-// double SSX, SSY, SSZ;
- s64 SSX, SSY, SSZ;
+ int shift = 12 * GTE_SF(gteop);
+ int mx = GTE_MX(gteop);
+ int v = GTE_V(gteop);
+ int cv = GTE_CV(gteop);
+ int lm = GTE_LM(gteop);
+ s32 vx = VX(v);
+ s32 vy = VY(v);
+ s32 vz = VZ(v);
#ifdef GTE_LOG
- GTE_LOG("GTE_MVMVA %lx\n", psxRegs.code & 0x1ffffff);
+ GTE_LOG("MVMVA\n");
#endif
+ gteFLAG = 0;
- switch (psxRegs.code & 0x78000) {
- case 0x00000: // V0 * R
- _MVMVA_FUNC(gteVX0, gteVY0, gteVZ0, gteR); break;
- case 0x08000: // V1 * R
- _MVMVA_FUNC(gteVX1, gteVY1, gteVZ1, gteR); break;
- case 0x10000: // V2 * R
- _MVMVA_FUNC(gteVX2, gteVY2, gteVZ2, gteR); break;
- case 0x18000: // IR * R
- _MVMVA_FUNC((short)gteIR1, (short)gteIR2, (short)gteIR3, gteR);
- break;
- case 0x20000: // V0 * L
- _MVMVA_FUNC(gteVX0, gteVY0, gteVZ0, gteL); break;
- case 0x28000: // V1 * L
- _MVMVA_FUNC(gteVX1, gteVY1, gteVZ1, gteL); break;
- case 0x30000: // V2 * L
- _MVMVA_FUNC(gteVX2, gteVY2, gteVZ2, gteL); break;
- case 0x38000: // IR * L
- _MVMVA_FUNC((short)gteIR1, (short)gteIR2, (short)gteIR3, gteL); break;
- case 0x40000: // V0 * C
- _MVMVA_FUNC(gteVX0, gteVY0, gteVZ0, gte_C); break;
- case 0x48000: // V1 * C
- _MVMVA_FUNC(gteVX1, gteVY1, gteVZ1, gte_C); break;
- case 0x50000: // V2 * C
- _MVMVA_FUNC(gteVX2, gteVY2, gteVZ2, gte_C); break;
- case 0x58000: // IR * C
- _MVMVA_FUNC((short)gteIR1, (short)gteIR2, (short)gteIR3, gte_C); break;
- default:
- SSX = SSY = SSZ = 0;
- }
-
- if (psxRegs.code & 0x80000) {
-// SSX /= 4096.0; SSY /= 4096.0; SSZ /= 4096.0;
- SSX>>= 12; SSY>>= 12; SSZ>>= 12;
- }
-
- switch (psxRegs.code & 0x6000) {
- case 0x0000: // Add TR
- SSX+= gteTRX;
- SSY+= gteTRY;
- SSZ+= gteTRZ;
- break;
- case 0x2000: // Add BK
- SSX+= gteRBK;
- SSY+= gteGBK;
- SSZ+= gteBBK;
- break;
- case 0x4000: // Add FC
- SSX+= gteRFC;
- SSY+= gteGFC;
- SSZ+= gteBFC;
- break;
- }
+ gteMAC1 = A1((((s64)CV1(cv) << 12) + (MX11(mx) * vx) + (MX12(mx) * vy) + (MX13(mx) * vz)) >> shift);
+ gteMAC2 = A2((((s64)CV2(cv) << 12) + (MX21(mx) * vx) + (MX22(mx) * vy) + (MX23(mx) * vz)) >> shift);
+ gteMAC3 = A3((((s64)CV3(cv) << 12) + (MX31(mx) * vx) + (MX32(mx) * vy) + (MX33(mx) * vz)) >> shift);
- gteFLAG = 0;
- //gteMAC1 = (long)SSX;
- //gteMAC2 = (long)SSY;
- //gteMAC3 = (long)SSZ;//okay the follow lines are correct??
-/* gteMAC1 = NC_OVERFLOW1(SSX);
- gteMAC2 = NC_OVERFLOW2(SSY);
- gteMAC3 = NC_OVERFLOW3(SSZ);*/
- gteMAC1 = FNC_OVERFLOW1(SSX);
- gteMAC2 = FNC_OVERFLOW2(SSY);
- gteMAC3 = FNC_OVERFLOW3(SSZ);
- if (psxRegs.code & 0x400)
- MAC2IR1()
- else MAC2IR()
-
- SUM_FLAG;
+ gteIR1 = Lm_B1(gteMAC1, lm);
+ gteIR2 = Lm_B2(gteMAC2, lm);
+ gteIR3 = Lm_B3(gteMAC3, lm);
}
void gteNCLIP() {
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
-
#ifdef GTE_LOG
- GTE_LOG("GTE_NCLIP\n");
+ GTE_LOG("NCLIP\n");
#endif
-
- //gteLog
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("NCLIP", 8);
- G_SD(12);
- G_SD(13);
- G_SD(14);
- }
-#endif
-
-/* gteFLAG = 0;
-
- gteMAC0 = (signed long)float2int(EDETEC4(
- ((double)gteSX0*((double)gteSY1-(double)gteSY2))+
- ((double)gteSX1*((double)gteSY2-(double)gteSY0))+
- ((double)gteSX2*((double)gteSY0-(double)gteSY1))));
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
gteFLAG = 0;
-
-
- gteMAC0 = gteSX0 * (gteSY1 - gteSY2) +
- gteSX1 * (gteSY2 - gteSY0) +
- gteSX2 * (gteSY0 - gteSY1);
-
- //gteMAC0 = (gteSX0 - gteSX1) * (gteSY0 - gteSY2) - (gteSX0 - gteSX2) * (gteSY0 - gteSY1);
-
- SUM_FLAG;
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(24);
- G_GC(31);
- }
-#endif
+ gteMAC0 = F((s64)gteSX0 * (gteSY1 - gteSY2) +
+ gteSX1 * (gteSY2 - gteSY0) +
+ gteSX2 * (gteSY0 - gteSY1));
}
void gteAVSZ3() {
-// unsigned long SS;
-// double SZ1,SZ2,SZ3;
-// double ZSF3;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
-
#ifdef GTE_LOG
- GTE_LOG("GTE_AVSZ3\n");
+ GTE_LOG("AVSZ3\n");
#endif
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("AVSZ3", 5);
- G_SD(16);
- G_SD(17);
- G_SD(18);
- G_SD(19);
- G_SC(29);
- G_SC(30);
- }
-#endif
-
-/* gteFLAG = 0;
-
- SS = psxRegs.CP2D.r[17] & 0xffff; SZ1 = (double)SS;
- SS = psxRegs.CP2D.r[18] & 0xffff; SZ2 = (double)SS;
- SS = psxRegs.CP2D.r[19] & 0xffff; SZ3 = (double)SS;
- SS = psxRegs.CP2C.r[29] & 0xffff; ZSF3 = (double)SS/(double)4096;
-
- psxRegs.CP2D.r[24] = (signed long)float2int(EDETEC4(((SZ1+SZ2+SZ3)*ZSF3)));
- psxRegs.CP2D.r[7] = (unsigned short)float2int(LimitC(((SZ1+SZ2+SZ3)*ZSF3),18));
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
-
-
gteFLAG = 0;
- /* NC: OLD
- gteMAC0 = ((gteSZ1 + gteSZ2 + gteSZx) * (gteZSF3/4096.0f));
-
- gteOTZ = limC((double)gteMAC0);
- */
-/* gteMAC0 = ((gteSZ1 + gteSZ2 + gteSZx) * (gteZSF3));
-
- gteOTZ = limC((double)(gteMAC0 >> 12));*/
- gteMAC0 = ((gteSZ0 + gteSZ1 + gteSZ2) * (gteZSF3)) >> 12;
-
- gteOTZ = FlimC(gteMAC0);
-// gteOTZ = limC((double)gteMAC0);
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(7);
- G_GD(24);
- G_GC(31);
- }
-#endif
+ gteMAC0 = F((s64)(gteZSF3 * gteSZ1) + (gteZSF3 * gteSZ2) + (gteZSF3 * gteSZ3));
+ gteOTZ = Lm_D(gteMAC0 >> 12);
}
void gteAVSZ4() {
-// unsigned long SS;
-// double SZ0,SZ1,SZ2,SZ3;
-// double ZSF4;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
-
#ifdef GTE_LOG
- GTE_LOG("GTE_AVSZ4\n");
-#endif
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("AVSZ4", 6);
- G_SD(16);
- G_SD(17);
- G_SD(18);
- G_SD(19);
- G_SC(29);
- G_SC(30);
- }
+ GTE_LOG("AVSZ4\n");
#endif
-
-/* gteFLAG = 0;
-
- SS = psxRegs.CP2D.r[16] & 0xffff; SZ0 = (double)SS;
- SS = psxRegs.CP2D.r[17] & 0xffff; SZ1 = (double)SS;
- SS = psxRegs.CP2D.r[18] & 0xffff; SZ2 = (double)SS;
- SS = psxRegs.CP2D.r[19] & 0xffff; SZ3 = (double)SS;
- SS = psxRegs.CP2C.r[30] & 0xffff; ZSF4 = (double)SS/(double)4096;
-
- psxRegs.CP2D.r[24] = (signed long)float2int(EDETEC4(((SZ0+SZ1+SZ2+SZ3)*ZSF4)));
- psxRegs.CP2D.r[7] = (unsigned short)float2int(LimitC(((SZ0+SZ1+SZ2+SZ3)*ZSF4),18));
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
gteFLAG = 0;
-
- /* NC: OLD
- gteMAC0 = ((gteSZ0 + gteSZ1 + gteSZ2 + gteSZx) * (gteZSF4/4096.0f));
-
- gteOTZ = limC((double)gteMAC0);
- */
-/* gteMAC0 = ((gteSZ0 + gteSZ1 + gteSZ2 + gteSZx) * (gteZSF4));
-
- gteOTZ = limC((double)(gteMAC0 >> 12));
-*/
- gteMAC0 = ((gteSZx + gteSZ0 + gteSZ1 + gteSZ2) * (gteZSF4))>> 12;
- gteOTZ = FlimC(gteMAC0);
-// gteOTZ = limC((double)gteMAC0);
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(7);
- G_GD(24);
- G_GC(31);
- }
-#endif
+ gteMAC0 = F((s64)(gteZSF4 * (gteSZ0 + gteSZ1 + gteSZ2 + gteSZ3)));
+ gteOTZ = Lm_D(gteMAC0 >> 12);
}
void gteSQR() {
- //double SSX0,SSY0,SSZ0;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
+ int shift = 12 * GTE_SF(gteop);
+ int lm = GTE_LM(gteop);
#ifdef GTE_LOG
- GTE_LOG("GTE_SQR %lx\n", psxRegs.code & 0x1ffffff);
+ GTE_LOG("SQR\n");
#endif
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("SQR", 5);
- G_SD(9);
- G_SD(10);
- G_SD(11);
- }
-#endif
-
-/* gteFLAG = 0;
-
- SSX0 = (double)gteIR1 * gteIR1;
- SSY0 = (double)gteIR2 * gteIR2;
- SSZ0 = (double)gteIR3 * gteIR3;
-
- if (psxRegs.code & 0x80000) {
- SSX0 /= 4096.0; SSY0 /= 4096.0; SSZ0 /= 4096.0;
- }
-
- gteMAC1 = (long)SSX0;
- gteMAC2 = (long)SSY0;
- gteMAC3 = (long)SSZ0;
-
- MAC2IR1();
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
gteFLAG = 0;
-
-/* if (psxRegs.code & 0x80000) {
- gteMAC1 = NC_OVERFLOW1((gteIR1 * gteIR1) / 4096.0f);
- gteMAC2 = NC_OVERFLOW2((gteIR2 * gteIR2) / 4096.0f);
- gteMAC3 = NC_OVERFLOW3((gteIR3 * gteIR3) / 4096.0f);
- } else {
- gteMAC1 = NC_OVERFLOW1(gteIR1 * gteIR1);
- gteMAC2 = NC_OVERFLOW2(gteIR2 * gteIR2);
- gteMAC3 = NC_OVERFLOW3(gteIR3 * gteIR3);
- }*/
- if (psxRegs.code & 0x80000) {
- gteMAC1 = FNC_OVERFLOW1((gteIR1 * gteIR1) >> 12);
- gteMAC2 = FNC_OVERFLOW2((gteIR2 * gteIR2) >> 12);
- gteMAC3 = FNC_OVERFLOW3((gteIR3 * gteIR3) >> 12);
- } else {
- gteMAC1 = FNC_OVERFLOW1(gteIR1 * gteIR1);
- gteMAC2 = FNC_OVERFLOW2(gteIR2 * gteIR2);
- gteMAC3 = FNC_OVERFLOW3(gteIR3 * gteIR3);
- }
- MAC2IR1();
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
- G_GD(25);
- G_GD(26);
- G_GD(27);
- G_GC(31);
- }
-#endif
-}
-/*
-#define GTE_NCCS(vn) { \
- RR0 = ((double)gteL11 * gteVX##vn + (double)gteL12 * gteVY##vn + (double)gteL13 * gteVZ##vn)/4096.0; \
- GG0 = ((double)gteL21 * gteVX##vn + (double)gteL22 * gteVY##vn + (double)gteL23 * gteVZ##vn)/4096.0; \
- BB0 = ((double)gteL31 * gteVX##vn + (double)gteL32 * gteVY##vn + (double)gteL33 * gteVZ##vn)/4096.0; \
- t1 = LimitAU(RR0,24); \
- t2 = LimitAU(GG0,23); \
- t3 = LimitAU(BB0,22); \
- \
- RR0 = (double)gteRBK + ((double)gteLR1 * t1 + (double)gteLR2 * t2 + (double)gteLR3 * t3)/4096.0; \
- GG0 = (double)gteGBK + ((double)gteLG1 * t1 + (double)gteLG2 * t2 + (double)gteLG3 * t3)/4096.0; \
- BB0 = (double)gteBBK + ((double)gteLB1 * t1 + (double)gteLB2 * t2 + (double)gteLB3 * t3)/4096.0; \
- t1 = LimitAU(RR0,24); \
- t2 = LimitAU(GG0,23); \
- t3 = LimitAU(BB0,22); \
- \
- RR0 = ((double)gteR * t1)/256.0; \
- GG0 = ((double)gteG * t2)/256.0; \
- BB0 = ((double)gteB * t3)/256.0; \
- \
- gteIR1 = (long)LimitAU(RR0,24); \
- gteIR2 = (long)LimitAU(GG0,23); \
- gteIR3 = (long)LimitAU(BB0,22); \
- \
- gteCODE0 = gteCODE1; gteCODE1 = gteCODE2; gteCODE2 = gteCODE; \
- gteR0 = gteR1; gteR1 = gteR2; gteR2 = (unsigned char)LimitB(RR0/16.0,21); \
- gteG0 = gteG1; gteG1 = gteG2; gteG2 = (unsigned char)LimitB(GG0/16.0,20); \
- gteB0 = gteB1; gteB1 = gteB2; gteB2 = (unsigned char)LimitB(BB0/16.0,19); \
- \
- gteMAC1 = (long)RR0; \
- gteMAC2 = (long)GG0; \
- gteMAC3 = (long)BB0; \
-}
-*/
-/*
-__forceinline double ncLIM1(double x)
-{
- if(x > 8796093022207.0)
- {
- return 8796093022207.0;
- }
-}
-*/
-
-
-
-/* NC: OLD
-#define GTE_NCCS(vn)\
-gte_LL1 = limA1U((gteL11*gteVX##vn + gteL12*gteVY##vn + gteL13*gteVZ##vn)/16777216.0f);\
-gte_LL2 = limA2U((gteL21*gteVX##vn + gteL22*gteVY##vn + gteL23*gteVZ##vn)/16777216.0f);\
-gte_LL3 = limA3U((gteL31*gteVX##vn + gteL32*gteVY##vn + gteL33*gteVZ##vn)/16777216.0f);\
-gte_RRLT= limA1U(gteRBK/4096.0f + (gteLR1/4096.0f*gte_LL1 + gteLR2/4096.0f*gte_LL2 + gteLR3/4096.0f*gte_LL3));\
-gte_GGLT= limA2U(gteGBK/4096.0f + (gteLG1/4096.0f*gte_LL1 + gteLG2/4096.0f*gte_LL2 + gteLG3/4096.0f*gte_LL3));\
-gte_BBLT= limA3U(gteBBK/4096.0f + (gteLB1/4096.0f*gte_LL1 + gteLB2/4096.0f*gte_LL2 + gteLB3/4096.0f*gte_LL3));\
-gte_RR0 = gteR*gte_RRLT;\
-gte_GG0 = gteG*gte_GGLT;\
-gte_BB0 = gteB*gte_BBLT;\
-gteIR1 = (long)limA1U(gte_RR0);\
-gteIR2 = (long)limA2U(gte_GG0);\
-gteIR3 = (long)limA3U(gte_BB0);\
-gteCODE0 = gteCODE1; gteCODE1 = gteCODE2; gteCODE2 = gteCODE;\
-gteR0 = gteR1; gteR1 = gteR2; gteR2 = (unsigned char)limB1(gte_RR0);\
-gteG0 = gteG1; gteG1 = gteG2; gteG2 = (unsigned char)limB2(gte_GG0);\
-gteB0 = gteB1; gteB1 = gteB2; gteB2 = (unsigned char)limB3(gte_BB0);\
-gteMAC1 = (long)gte_RR0;\
-gteMAC2 = (long)gte_GG0;\
-gteMAC3 = (long)gte_BB0;\
-*/
-/*
-#define GTE_NCCS(vn)\
-gte_LL1 = limA1U((gteL11*gteVX##vn + gteL12*gteVY##vn + gteL13*gteVZ##vn)/16777216.0f);\
-gte_LL2 = limA2U((gteL21*gteVX##vn + gteL22*gteVY##vn + gteL23*gteVZ##vn)/16777216.0f);\
-gte_LL3 = limA3U((gteL31*gteVX##vn + gteL32*gteVY##vn + gteL33*gteVZ##vn)/16777216.0f);\
-gte_RRLT= limA1U(gteRBK/4096.0f + (gteLR1/4096.0f*gte_LL1 + gteLR2/4096.0f*gte_LL2 + gteLR3/4096.0f*gte_LL3));\
-gte_GGLT= limA2U(gteGBK/4096.0f + (gteLG1/4096.0f*gte_LL1 + gteLG2/4096.0f*gte_LL2 + gteLG3/4096.0f*gte_LL3));\
-gte_BBLT= limA3U(gteBBK/4096.0f + (gteLB1/4096.0f*gte_LL1 + gteLB2/4096.0f*gte_LL2 + gteLB3/4096.0f*gte_LL3));\
-gteMAC1 = (long)(gteR*gte_RRLT*16);\
-gteMAC2 = (long)(gteG*gte_GGLT*16);\
-gteMAC3 = (long)(gteB*gte_BBLT*16);\
-gteIR1 = (long)limA1U(gteMAC1);\
-gteIR2 = (long)limA2U(gteMAC2);\
-gteIR3 = (long)limA3U(gteMAC3);\
-gte_RR0 = gteMAC1>>4;\
-gte_GG0 = gteMAC2>>4;\
-gte_BB0 = gteMAC3>>4;\
-gteCODE0 = gteCODE1; gteCODE1 = gteCODE2; gteCODE2 = gteCODE;\
-gteR0 = gteR1; gteR1 = gteR2; gteR2 = (unsigned char)limB1(gte_RR0);\
-gteG0 = gteG1; gteG1 = gteG2; gteG2 = (unsigned char)limB2(gte_GG0);\
-gteB0 = gteB1; gteB1 = gteB2; gteB2 = (unsigned char)limB3(gte_BB0);*/
-
-/*
- gte_LL1 = limA1U((gteL11*gteVX##vn + gteL12*gteVY##vn + gteL13*gteVZ##vn)/16777216.0f); \
- gte_LL2 = limA2U((gteL21*gteVX##vn + gteL22*gteVY##vn + gteL23*gteVZ##vn)/16777216.0f); \
- gte_LL3 = limA3U((gteL31*gteVX##vn + gteL32*gteVY##vn + gteL33*gteVZ##vn)/16777216.0f); \
- gte_RRLT= limA1U(gteRBK/4096.0f + (gteLR1/4096.0f*gte_LL1 + gteLR2/4096.0f*gte_LL2 + gteLR3/4096.0f*gte_LL3)); \
- gte_GGLT= limA2U(gteGBK/4096.0f + (gteLG1/4096.0f*gte_LL1 + gteLG2/4096.0f*gte_LL2 + gteLG3/4096.0f*gte_LL3)); \
- gte_BBLT= limA3U(gteBBK/4096.0f + (gteLB1/4096.0f*gte_LL1 + gteLB2/4096.0f*gte_LL2 + gteLB3/4096.0f*gte_LL3)); \
- \
- gteMAC1 = (long)(gteR*gte_RRLT*16); \
- gteMAC2 = (long)(gteG*gte_GGLT*16); \
- gteMAC3 = (long)(gteB*gte_BBLT*16); \
-*/
-#define GTE_NCCS(vn) \
- gte_LL1 = F12limA1U((gteL11*gteVX##vn + gteL12*gteVY##vn + gteL13*gteVZ##vn) >> 12); \
- gte_LL2 = F12limA2U((gteL21*gteVX##vn + gteL22*gteVY##vn + gteL23*gteVZ##vn) >> 12); \
- gte_LL3 = F12limA3U((gteL31*gteVX##vn + gteL32*gteVY##vn + gteL33*gteVZ##vn) >> 12); \
- gte_RRLT= F12limA1U(gteRBK + ((gteLR1*gte_LL1 + gteLR2*gte_LL2 + gteLR3*gte_LL3) >> 12)); \
- gte_GGLT= F12limA2U(gteGBK + ((gteLG1*gte_LL1 + gteLG2*gte_LL2 + gteLG3*gte_LL3) >> 12)); \
- gte_BBLT= F12limA3U(gteBBK + ((gteLB1*gte_LL1 + gteLB2*gte_LL2 + gteLB3*gte_LL3) >> 12)); \
- \
- gteMAC1 = (long)(((s64)((u32)gteR<<12)*gte_RRLT) >> 20);\
- gteMAC2 = (long)(((s64)((u32)gteG<<12)*gte_GGLT) >> 20);\
- gteMAC3 = (long)(((s64)((u32)gteB<<12)*gte_BBLT) >> 20);
-
-
-void gteNCCS() {
-// double RR0,GG0,BB0;
-// double t1, t2, t3;
-// double gte_LL1, gte_LL2, gte_LL3;
-// double gte_RRLT, gte_GGLT, gte_BBLT;
- s32 gte_LL1, gte_LL2, gte_LL3;
- s32 gte_RRLT, gte_GGLT, gte_BBLT;
-
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
+ gteMAC1 = A1((gteIR1 * gteIR1) >> shift);
+ gteMAC2 = A2((gteIR2 * gteIR2) >> shift);
+ gteMAC3 = A3((gteIR3 * gteIR3) >> shift);
+ gteIR1 = Lm_B1(gteMAC1 >> shift, lm);
+ gteIR2 = Lm_B2(gteMAC2 >> shift, lm);
+ gteIR3 = Lm_B3(gteMAC3 >> shift, lm);
+}
+void gteNCCS() {
#ifdef GTE_LOG
- GTE_LOG("GTE_NCCS\n");
-#endif
-
-/*
- gteFLAG = 0;
-
- GTE_NCCS(0);
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("NCCS", 17);
- G_SD(0);
- G_SD(1);
- G_SD(6);
- G_SC(8);
- G_SC(9);
- G_SC(10);
- G_SC(11);
- G_SC(12);
- G_SC(13);
- G_SC(14);
- G_SC(15);
- G_SC(16);
- G_SC(17);
- G_SC(18);
- G_SC(19);
- G_SC(20);
- }
+ GTE_LOG("NCCS\n");
#endif
-
gteFLAG = 0;
- GTE_NCCS(0);
+ gteMAC1 = A1((((s64)gteL11 * gteVX0) + (gteL12 * gteVY0) + (gteL13 * gteVZ0)) >> 12);
+ gteMAC2 = A2((((s64)gteL21 * gteVX0) + (gteL22 * gteVY0) + (gteL23 * gteVZ0)) >> 12);
+ gteMAC3 = A3((((s64)gteL31 * gteVX0) + (gteL32 * gteVY0) + (gteL33 * gteVZ0)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
+ gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12);
+ gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12);
+ gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
+ gteMAC1 = A1(((s64)gteR * gteIR1) >> 8);
+ gteMAC2 = A2(((s64)gteG * gteIR2) >> 8);
+ gteMAC3 = A3(((s64)gteB * gteIR3) >> 8);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
gteRGB0 = gteRGB1;
gteRGB1 = gteRGB2;
- gteR2 = FlimB1(gteMAC1>>4);
- gteG2 = FlimB2(gteMAC2>>4);
- gteB2 = FlimB3(gteMAC3>>4); gteCODE2 = gteCODE;
-
- MAC2IR1();
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- //G_GD(20);
- //G_GD(21);
- G_GD(22);
-
- //G_GD(24); Doc must be wrong. PSX does not touch it.
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1(gteMAC1 >> 4);
+ gteG2 = Lm_C2(gteMAC2 >> 4);
+ gteB2 = Lm_C3(gteMAC3 >> 4);
}
void gteNCCT() {
-// double RR0,GG0,BB0;
-// double t1, t2, t3;
-// double gte_LL1, gte_LL2, gte_LL3;
-// double gte_RRLT, gte_GGLT, gte_BBLT;
- s32 gte_LL1, gte_LL2, gte_LL3;
- s32 gte_RRLT, gte_GGLT, gte_BBLT;
-
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
+ int v;
+ s32 vx, vy, vz;
#ifdef GTE_LOG
- GTE_LOG("GTE_NCCT\n");
+ GTE_LOG("NCCT\n");
#endif
+ gteFLAG = 0;
-
- /*gteFLAG = 0;
-
- GTE_NCCS(0);
- GTE_NCCS(1);
- GTE_NCCS(2);
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("NCCT", 39);
- G_SD(0);
- G_SD(1);
- G_SD(2);
- G_SD(3);
- G_SD(4);
- G_SD(5);
- G_SD(6);
-
- G_SC(8);
- G_SC(9);
- G_SC(10);
- G_SC(11);
- G_SC(12);
- G_SC(13);
- G_SC(14);
- G_SC(15);
- G_SC(16);
- G_SC(17);
- G_SC(18);
- G_SC(19);
- G_SC(20);
- }
-#endif
-
- gteFLAG = 0;
-
- GTE_NCCS(0);
-
- gteR0 = FlimB1(gteMAC1>>4);
- gteG0 = FlimB2(gteMAC2>>4);
- gteB0 = FlimB3(gteMAC3>>4); gteCODE0 = gteCODE;
-
- GTE_NCCS(1);
-
- gteR1 = FlimB1(gteMAC1>>4);
- gteG1 = FlimB2(gteMAC2>>4);
- gteB1 = FlimB3(gteMAC3>>4); gteCODE1 = gteCODE;
-
- GTE_NCCS(2);
-
- gteR2 = FlimB1(gteMAC1>>4);
- gteG2 = FlimB2(gteMAC2>>4);
- gteB2 = FlimB3(gteMAC3>>4); gteCODE2 = gteCODE;
-
- MAC2IR1();
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- G_GD(20);
- G_GD(21);
- G_GD(22);
-
- //G_GD(24); Doc must be wrong. PSX does not touch it.
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ for (v = 0; v < 3; v++) {
+ vx = VX(v);
+ vy = VY(v);
+ vz = VZ(v);
+ gteMAC1 = A1((((s64)gteL11 * vx) + (gteL12 * vy) + (gteL13 * vz)) >> 12);
+ gteMAC2 = A2((((s64)gteL21 * vx) + (gteL22 * vy) + (gteL23 * vz)) >> 12);
+ gteMAC3 = A3((((s64)gteL31 * vx) + (gteL32 * vy) + (gteL33 * vz)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
+ gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12);
+ gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12);
+ gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
+ gteMAC1 = A1(((s64)gteR * gteIR1) >> 8);
+ gteMAC2 = A2(((s64)gteG * gteIR2) >> 8);
+ gteMAC3 = A3(((s64)gteB * gteIR3) >> 8);
+
+ gteRGB0 = gteRGB1;
+ gteRGB1 = gteRGB2;
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1(gteMAC1 >> 4);
+ gteG2 = Lm_C2(gteMAC2 >> 4);
+ gteB2 = Lm_C3(gteMAC3 >> 4);
+ }
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
}
-/*
-#define GTE_NCDS(vn) \
-gte_LL1 = limA1U((gteL11*gteVX##vn + gteL12*gteVY##vn + gteL13*gteVZ##vn)/16777216.0f);\
-gte_LL2 = limA2U((gteL21*gteVX##vn + gteL22*gteVY##vn + gteL23*gteVZ##vn)/16777216.0f);\
-gte_LL3 = limA3U((gteL31*gteVX##vn + gteL32*gteVY##vn + gteL33*gteVZ##vn)/16777216.0f);\
-gte_RRLT= limA1U(gteRBK/4096.0f + (gteLR1/4096.0f*gte_LL1 + gteLR2/4096.0f*gte_LL2 + gteLR3/4096.0f*gte_LL3));\
-gte_GGLT= limA2U(gteGBK/4096.0f + (gteLG1/4096.0f*gte_LL1 + gteLG2/4096.0f*gte_LL2 + gteLG3/4096.0f*gte_LL3));\
-gte_BBLT= limA3U(gteBBK/4096.0f + (gteLB1/4096.0f*gte_LL1 + gteLB2/4096.0f*gte_LL2 + gteLB3/4096.0f*gte_LL3));\
-gte_RR0 = (gteR*gte_RRLT) + (gteIR0/4096.0f * limA1S(gteRFC/16.0f - (gteR*gte_RRLT)));\
-gte_GG0 = (gteG*gte_GGLT) + (gteIR0/4096.0f * limA2S(gteGFC/16.0f - (gteG*gte_GGLT)));\
-gte_BB0 = (gteB*gte_BBLT) + (gteIR0/4096.0f * limA3S(gteBFC/16.0f - (gteB*gte_BBLT)));\
-gteMAC1= (long)(gte_RR0 * 16.0f); gteIR1 = (long)limA1U(gte_RR0*16.0f);\
-gteMAC2= (long)(gte_GG0 * 16.0f); gteIR2 = (long)limA2U(gte_GG0*16.0f);\
-gteMAC3= (long)(gte_BB0 * 16.0f); gteIR3 = (long)limA3U(gte_BB0*16.0f);\
-gteRGB0 = gteRGB1; \
-gteRGB1 = gteRGB2; \
-gteR2 = limB1(gte_RR0); \
-gteG2 = limB2(gte_GG0); \
-gteB2 = limB3(gte_BB0); gteCODE2 = gteCODE;
-*/
-/*
-#define GTE_NCDS(vn) \
-gte_LL1 = limA1U((gteL11*gteVX##vn + gteL12*gteVY##vn + gteL13*gteVZ##vn)/16777216.0f);\
-gte_LL2 = limA2U((gteL21*gteVX##vn + gteL22*gteVY##vn + gteL23*gteVZ##vn)/16777216.0f);\
-gte_LL3 = limA3U((gteL31*gteVX##vn + gteL32*gteVY##vn + gteL33*gteVZ##vn)/16777216.0f);\
-gte_RRLT= limA1U(gteRBK/4096.0f + (gteLR1/4096.0f*gte_LL1 + gteLR2/4096.0f*gte_LL2 + gteLR3/4096.0f*gte_LL3));\
-gte_GGLT= limA2U(gteGBK/4096.0f + (gteLG1/4096.0f*gte_LL1 + gteLG2/4096.0f*gte_LL2 + gteLG3/4096.0f*gte_LL3));\
-gte_BBLT= limA3U(gteBBK/4096.0f + (gteLB1/4096.0f*gte_LL1 + gteLB2/4096.0f*gte_LL2 + gteLB3/4096.0f*gte_LL3));\
- \
- gte_RR0 = (gteR*gte_RRLT) + (gteIR0/4096.0f * limA1S(gteRFC/16.0f - (gteR*gte_RRLT)));\
- gte_GG0 = (gteG*gte_GGLT) + (gteIR0/4096.0f * limA2S(gteGFC/16.0f - (gteG*gte_GGLT)));\
- gte_BB0 = (gteB*gte_BBLT) + (gteIR0/4096.0f * limA3S(gteBFC/16.0f - (gteB*gte_BBLT)));\
- gteMAC1 = (long)(gte_RR0 << 4); \
- gteMAC2 = (long)(gte_GG0 << 4); \
- gteMAC3 = (long)(gte_BB0 << 4);
-*/
-#define GTE_NCDS(vn) \
- gte_LL1 = F12limA1U((gteL11*gteVX##vn + gteL12*gteVY##vn + gteL13*gteVZ##vn) >> 12); \
- gte_LL2 = F12limA2U((gteL21*gteVX##vn + gteL22*gteVY##vn + gteL23*gteVZ##vn) >> 12); \
- gte_LL3 = F12limA3U((gteL31*gteVX##vn + gteL32*gteVY##vn + gteL33*gteVZ##vn) >> 12); \
- gte_RRLT= F12limA1U(gteRBK + ((gteLR1*gte_LL1 + gteLR2*gte_LL2 + gteLR3*gte_LL3) >> 12)); \
- gte_GGLT= F12limA2U(gteGBK + ((gteLG1*gte_LL1 + gteLG2*gte_LL2 + gteLG3*gte_LL3) >> 12)); \
- gte_BBLT= F12limA3U(gteBBK + ((gteLB1*gte_LL1 + gteLB2*gte_LL2 + gteLB3*gte_LL3) >> 12)); \
- \
- gte_RR0 = (long)(((s64)((u32)gteR<<12)*gte_RRLT) >> 12);\
- gte_GG0 = (long)(((s64)((u32)gteG<<12)*gte_GGLT) >> 12);\
- gte_BB0 = (long)(((s64)((u32)gteB<<12)*gte_BBLT) >> 12);\
- gteMAC1 = (long)((gte_RR0 + (((s64)gteIR0 * F12limA1S((s64)(gteRFC << 8) - gte_RR0)) >> 12)) >> 8);\
- gteMAC2 = (long)((gte_GG0 + (((s64)gteIR0 * F12limA2S((s64)(gteGFC << 8) - gte_GG0)) >> 12)) >> 8);\
- gteMAC3 = (long)((gte_BB0 + (((s64)gteIR0 * F12limA3S((s64)(gteBFC << 8) - gte_BB0)) >> 12)) >> 8);
void gteNCDS() {
-/* double tRLT,tRRLT;
- double tGLT,tGGLT;
- double tBLT,tBBLT;
- double tRR0,tL1,tLL1;
- double tGG0,tL2,tLL2;
- double tBB0,tL3,tLL3;
- unsigned long C,R,G,B; */
-// double gte_LL1, gte_LL2, gte_LL3;
-// double gte_RRLT, gte_GGLT, gte_BBLT;
- s32 gte_LL1, gte_LL2, gte_LL3;
- s32 gte_RRLT, gte_GGLT, gte_BBLT;
- s32 gte_RR0, gte_GG0, gte_BB0;
-
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
-
#ifdef GTE_LOG
- GTE_LOG("GTE_NCDS\n");
-#endif
-
-/* gteFLAG = 0;
-
- R = ((gteRGB)&0xff);
- G = ((gteRGB>> 8)&0xff);
- B = ((gteRGB>>16)&0xff);
- C = ((gteRGB>>24)&0xff);
-
- tLL1 = (gteL11/4096.0 * gteVX0/4096.0) + (gteL12/4096.0 * gteVY0/4096.0) + (gteL13/4096.0 * gteVZ0/4096.0);
- tLL2 = (gteL21/4096.0 * gteVX0/4096.0) + (gteL22/4096.0 * gteVY0/4096.0) + (gteL23/4096.0 * gteVZ0/4096.0);
- tLL3 = (gteL31/4096.0 * gteVX0/4096.0) + (gteL32/4096.0 * gteVY0/4096.0) + (gteL33/4096.0 * gteVZ0/4096.0);
-
- tL1 = LimitAU(tLL1,24);
- tL2 = LimitAU(tLL2,23);
- tL3 = LimitAU(tLL3,22);
-
- tRRLT = gteRBK/4096.0 + (gteLR1/4096.0 * tL1) + (gteLR2/4096.0 * tL2) + (gteLR3/4096.0 * tL3);
- tGGLT = gteGBK/4096.0 + (gteLG1/4096.0 * tL1) + (gteLG2/4096.0 * tL2) + (gteLG3/4096.0 * tL3);
- tBBLT = gteBBK/4096.0 + (gteLB1/4096.0 * tL1) + (gteLB2/4096.0 * tL2) + (gteLB3/4096.0 * tL3);
-
- tRLT = LimitAU(tRRLT,24);
- tGLT = LimitAU(tGGLT,23);
- tBLT = LimitAU(tBBLT,22);
-
- tRR0 = (R * tRLT) + (gteIR0/4096.0 * LimitAS(gteRFC/16.0 - (R * tRLT),24));
- tGG0 = (G * tGLT) + (gteIR0/4096.0 * LimitAS(gteGFC/16.0 - (G * tGLT),23));
- tBB0 = (B * tBLT) + (gteIR0/4096.0 * LimitAS(gteBFC/16.0 - (B * tBLT),22));
-
- gteMAC1 = (long)(tRR0 * 16.0); gteIR1 = (long)LimitAU((tRR0*16.0),24);
- gteMAC2 = (long)(tGG0 * 16.0); gteIR2 = (long)LimitAU((tGG0*16.0),23);
- gteMAC3 = (long)(tBB0 * 16.0); gteIR3 = (long)LimitAU((tBB0*16.0),22);
-
- R = (unsigned long)LimitB(tRR0,21); if (R>255) R=255; else if (R<0) R=0;
- G = (unsigned long)LimitB(tGG0,20); if (G>255) G=255; else if (G<0) G=0;
- B = (unsigned long)LimitB(tBB0,19); if (B>255) B=255; else if (B<0) B=0;
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteRGB2 = R|(G<<8)|(B<<16)|(C<<24);
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("NCDS", 19);
- G_SD(0);
- G_SD(1);
- G_SD(6);
- G_SD(8);
-
- G_SC(8);
- G_SC(9);
- G_SC(10);
- G_SC(11);
- G_SC(12);
- G_SC(13);
- G_SC(14);
- G_SC(15);
- G_SC(16);
- G_SC(17);
- G_SC(18);
- G_SC(19);
- G_SC(20);
- G_SC(21);
- G_SC(22);
- G_SC(23);
- }
+ GTE_LOG("NCDS\n");
#endif
+ gteFLAG = 0;
- gteFLAG = 0;
- GTE_NCDS(0);
+ gteMAC1 = A1((((s64)gteL11 * gteVX0) + (gteL12 * gteVY0) + (gteL13 * gteVZ0)) >> 12);
+ gteMAC2 = A2((((s64)gteL21 * gteVX0) + (gteL22 * gteVY0) + (gteL23 * gteVZ0)) >> 12);
+ gteMAC3 = A3((((s64)gteL31 * gteVX0) + (gteL32 * gteVY0) + (gteL33 * gteVZ0)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
+ gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12);
+ gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12);
+ gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
+ gteMAC1 = A1(((((s64)gteR << 4) * gteIR1) + (gteIR0 * Lm_B1(gteRFC - ((gteR * gteIR1) >> 8), 0))) >> 12);
+ gteMAC2 = A2(((((s64)gteG << 4) * gteIR2) + (gteIR0 * Lm_B2(gteGFC - ((gteG * gteIR2) >> 8), 0))) >> 12);
+ gteMAC3 = A3(((((s64)gteB << 4) * gteIR3) + (gteIR0 * Lm_B3(gteBFC - ((gteB * gteIR3) >> 8), 0))) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
gteRGB0 = gteRGB1;
gteRGB1 = gteRGB2;
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
- MAC2IR1();
-
- SUM_FLAG;
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- //G_GD(20);
- //G_GD(21);
- G_GD(22);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1(gteMAC1 >> 4);
+ gteG2 = Lm_C2(gteMAC2 >> 4);
+ gteB2 = Lm_C3(gteMAC3 >> 4);
}
void gteNCDT() {
- /*double tRLT,tRRLT;
- double tGLT,tGGLT;
- double tBLT,tBBLT;
- double tRR0,tL1,tLL1;
- double tGG0,tL2,tLL2;
- double tBB0,tL3,tLL3;
- unsigned long C,R,G,B;*/
-// double gte_LL1, gte_LL2, gte_LL3;
-// double gte_RRLT, gte_GGLT, gte_BBLT;
- s32 gte_LL1, gte_LL2, gte_LL3;
- s32 gte_RRLT, gte_GGLT, gte_BBLT;
- s32 gte_RR0, gte_GG0, gte_BB0;
-
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
-
-#ifdef GTE_LOG
- GTE_LOG("GTE_NCDT\n");
-#endif
-
-/* gteFLAG = 0;
-
- R = ((gteRGB)&0xff);
- G = ((gteRGB>> 8)&0xff);
- B = ((gteRGB>>16)&0xff);
- C = ((gteRGB>>24)&0xff);
-
- tLL1 = (gteL11/4096.0 * gteVX0/4096.0) + (gteL12/4096.0 * gteVY0/4096.0) + (gteL13/4096.0 * gteVZ0/4096.0);
- tLL2 = (gteL21/4096.0 * gteVX0/4096.0) + (gteL22/4096.0 * gteVY0/4096.0) + (gteL23/4096.0 * gteVZ0/4096.0);
- tLL3 = (gteL31/4096.0 * gteVX0/4096.0) + (gteL32/4096.0 * gteVY0/4096.0) + (gteL33/4096.0 * gteVZ0/4096.0);
-
- tL1 = LimitAU(tLL1,24);
- tL2 = LimitAU(tLL2,23);
- tL3 = LimitAU(tLL3,22);
-
- tRRLT = gteRBK/4096.0 + (gteLR1/4096.0 * tL1) + (gteLR2/4096.0 * tL2) + (gteLR3/4096.0 * tL3);
- tGGLT = gteGBK/4096.0 + (gteLG1/4096.0 * tL1) + (gteLG2/4096.0 * tL2) + (gteLG3/4096.0 * tL3);
- tBBLT = gteBBK/4096.0 + (gteLB1/4096.0 * tL1) + (gteLB2/4096.0 * tL2) + (gteLB3/4096.0 * tL3);
-
- tRLT = LimitAU(tRRLT,24);
- tGLT = LimitAU(tGGLT,23);
- tBLT = LimitAU(tBBLT,22);
-
- tRR0 = (R * tRLT) + (gteIR0/4096.0 * LimitAS(gteRFC/16.0 - (R * tRLT),24));
- tGG0 = (G * tGLT) + (gteIR0/4096.0 * LimitAS(gteGFC/16.0 - (G * tGLT),23));
- tBB0 = (B * tBLT) + (gteIR0/4096.0 * LimitAS(gteBFC/16.0 - (B * tBLT),22));
-
- gteMAC1 = (long)(tRR0 * 16.0); gteIR1 = (long)LimitAU((tRR0*16.0),24);
- gteMAC2 = (long)(tGG0 * 16.0); gteIR2 = (long)LimitAU((tGG0*16.0),23);
- gteMAC3 = (long)(tBB0 * 16.0); gteIR3 = (long)LimitAU((tBB0*16.0),22);
-
- R = (unsigned long)LimitB(tRR0,21); if (R>255) R=255; else if (R<0) R=0;
- G = (unsigned long)LimitB(tGG0,20); if (G>255) G=255; else if (G<0) G=0;
- B = (unsigned long)LimitB(tBB0,19); if (B>255) B=255; else if (B<0) B=0;
+ int v;
+ s32 vx, vy, vz;
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteRGB2 = R|(G<<8)|(B<<16)|(C<<24);
-
- R = ((gteRGB)&0xff);
- G = ((gteRGB>> 8)&0xff);
- B = ((gteRGB>>16)&0xff);
- C = ((gteRGB>>24)&0xff);
-
- tLL1 = (gteL11/4096.0 * gteVX1/4096.0) + (gteL12/4096.0 * gteVY1/4096.0) + (gteL13/4096.0 * gteVZ1/4096.0);
- tLL2 = (gteL21/4096.0 * gteVX1/4096.0) + (gteL22/4096.0 * gteVY1/4096.0) + (gteL23/4096.0 * gteVZ1/4096.0);
- tLL3 = (gteL31/4096.0 * gteVX1/4096.0) + (gteL32/4096.0 * gteVY1/4096.0) + (gteL33/4096.0 * gteVZ1/4096.0);
-
- tL1 = LimitAU(tLL1,24);
- tL2 = LimitAU(tLL2,23);
- tL3 = LimitAU(tLL3,22);
-
- tRRLT = gteRBK/4096.0 + (gteLR1/4096.0 * tL1) + (gteLR2/4096.0 * tL2) + (gteLR3/4096.0 * tL3);
- tGGLT = gteGBK/4096.0 + (gteLG1/4096.0 * tL1) + (gteLG2/4096.0 * tL2) + (gteLG3/4096.0 * tL3);
- tBBLT = gteBBK/4096.0 + (gteLB1/4096.0 * tL1) + (gteLB2/4096.0 * tL2) + (gteLB3/4096.0 * tL3);
-
- tRLT = LimitAU(tRRLT,24);
- tGLT = LimitAU(tGGLT,23);
- tBLT = LimitAU(tBBLT,22);
-
- tRR0 = (R * tRLT) + (gteIR0/4096.0 * LimitAS(gteRFC/16.0 - (R * tRLT),24));
- tGG0 = (G * tGLT) + (gteIR0/4096.0 * LimitAS(gteGFC/16.0 - (G * tGLT),23));
- tBB0 = (B * tBLT) + (gteIR0/4096.0 * LimitAS(gteBFC/16.0 - (B * tBLT),22));
-
- gteMAC1 = (long)(tRR0 * 16.0); gteIR1 = (long)LimitAU((tRR0*16.0),24);
- gteMAC2 = (long)(tGG0 * 16.0); gteIR2 = (long)LimitAU((tGG0*16.0),23);
- gteMAC3 = (long)(tBB0 * 16.0); gteIR3 = (long)LimitAU((tBB0*16.0),22);
-
- R = (unsigned long)LimitB(tRR0,21); if (R>255) R=255; else if (R<0) R=0;
- G = (unsigned long)LimitB(tGG0,20); if (G>255) G=255; else if (G<0) G=0;
- B = (unsigned long)LimitB(tBB0,19); if (B>255) B=255; else if (B<0) B=0;
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteRGB2 = R|(G<<8)|(B<<16)|(C<<24);
-
- R = ((gteRGB)&0xff);
- G = ((gteRGB>> 8)&0xff);
- B = ((gteRGB>>16)&0xff);
- C = ((gteRGB>>24)&0xff);
-
- tLL1 = (gteL11/4096.0 * gteVX2/4096.0) + (gteL12/4096.0 * gteVY2/4096.0) + (gteL13/4096.0 * gteVZ2/4096.0);
- tLL2 = (gteL21/4096.0 * gteVX2/4096.0) + (gteL22/4096.0 * gteVY2/4096.0) + (gteL23/4096.0 * gteVZ2/4096.0);
- tLL3 = (gteL31/4096.0 * gteVX2/4096.0) + (gteL32/4096.0 * gteVY2/4096.0) + (gteL33/4096.0 * gteVZ2/4096.0);
-
- tL1 = LimitAU(tLL1,24);
- tL2 = LimitAU(tLL2,23);
- tL3 = LimitAU(tLL3,22);
-
- tRRLT = gteRBK/4096.0 + (gteLR1/4096.0 * tL1) + (gteLR2/4096.0 * tL2) + (gteLR3/4096.0 * tL3);
- tGGLT = gteGBK/4096.0 + (gteLG1/4096.0 * tL1) + (gteLG2/4096.0 * tL2) + (gteLG3/4096.0 * tL3);
- tBBLT = gteBBK/4096.0 + (gteLB1/4096.0 * tL1) + (gteLB2/4096.0 * tL2) + (gteLB3/4096.0 * tL3);
-
- tRLT = LimitAU(tRRLT,24);
- tGLT = LimitAU(tGGLT,23);
- tBLT = LimitAU(tBBLT,22);
-
- tRR0 = (R * tRLT) + (gteIR0/4096.0 * LimitAS(gteRFC/16.0 - (R * tRLT),24));
- tGG0 = (G * tGLT) + (gteIR0/4096.0 * LimitAS(gteGFC/16.0 - (G * tGLT),23));
- tBB0 = (B * tBLT) + (gteIR0/4096.0 * LimitAS(gteBFC/16.0 - (B * tBLT),22));
-
- gteMAC1 = (long)(tRR0 * 16.0); gteIR1 = (long)LimitAU((tRR0*16.0),24);
- gteMAC2 = (long)(tGG0 * 16.0); gteIR2 = (long)LimitAU((tGG0*16.0),23);
- gteMAC3 = (long)(tBB0 * 16.0); gteIR3 = (long)LimitAU((tBB0*16.0),22);
-
- R = (unsigned long)LimitB(tRR0,21); if (R>255) R=255; else if (R<0) R=0;
- G = (unsigned long)LimitB(tGG0,20); if (G>255) G=255; else if (G<0) G=0;
- B = (unsigned long)LimitB(tBB0,19); if (B>255) B=255; else if (B<0) B=0;
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteRGB2 = R|(G<<8)|(B<<16)|(C<<24);
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("NCDT", 44);
- G_SD(0);
- G_SD(1);
- G_SD(2);
- G_SD(3);
- G_SD(4);
- G_SD(5);
- G_SD(6);
- G_SD(8);
-
- G_SC(8);
- G_SC(9);
- G_SC(10);
- G_SC(11);
- G_SC(12);
- G_SC(13);
- G_SC(14);
- G_SC(15);
- G_SC(16);
- G_SC(17);
- G_SC(18);
- G_SC(19);
- G_SC(20);
- G_SC(21);
- G_SC(22);
- G_SC(23);
- }
-#endif
-
- gteFLAG = 0;
- GTE_NCDS(0);
-
- gteR0 = FlimB1(gteMAC1 >> 4);
- gteG0 = FlimB2(gteMAC2 >> 4);
- gteB0 = FlimB3(gteMAC3 >> 4); gteCODE0 = gteCODE;
-
- GTE_NCDS(1);
-
- gteR1 = FlimB1(gteMAC1 >> 4);
- gteG1 = FlimB2(gteMAC2 >> 4);
- gteB1 = FlimB3(gteMAC3 >> 4); gteCODE1 = gteCODE;
-
- GTE_NCDS(2);
-
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
- MAC2IR1();
-
- SUM_FLAG;
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- G_GD(20);
- G_GD(21);
- G_GD(22);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
+#ifdef GTE_LOG
+ GTE_LOG("NCDT\n");
#endif
-}
+ gteFLAG = 0;
-#define gteD1 (*(short *)&gteR11)
-#define gteD2 (*(short *)&gteR22)
-#define gteD3 (*(short *)&gteR33)
+ for (v = 0; v < 3; v++) {
+ vx = VX( v );
+ vy = VY( v );
+ vz = VZ( v );
+ gteMAC1 = A1( ( ( (s64) gteL11 * vx ) + ( gteL12 * vy ) + ( gteL13 * vz ) ) >> 12 );
+ gteMAC2 = A2( ( ( (s64) gteL21 * vx ) + ( gteL22 * vy ) + ( gteL23 * vz ) ) >> 12 );
+ gteMAC3 = A3( ( ( (s64) gteL31 * vx ) + ( gteL32 * vy ) + ( gteL33 * vz ) ) >> 12 );
+ gteIR1 = Lm_B1( gteMAC1, 1 );
+ gteIR2 = Lm_B2( gteMAC2, 1 );
+ gteIR3 = Lm_B3( gteMAC3, 1 );
+ gteMAC1 = A1( ( ( (s64) gteRBK << 12 ) + ( gteLR1 * gteIR1 ) + ( gteLR2 * gteIR2 ) + ( gteLR3 * gteIR3 ) ) >> 12 );
+ gteMAC2 = A2( ( ( (s64) gteGBK << 12 ) + ( gteLG1 * gteIR1 ) + ( gteLG2 * gteIR2 ) + ( gteLG3 * gteIR3 ) ) >> 12 );
+ gteMAC3 = A3( ( ( (s64) gteBBK << 12 ) + ( gteLB1 * gteIR1 ) + ( gteLB2 * gteIR2 ) + ( gteLB3 * gteIR3 ) ) >> 12 );
+ gteIR1 = Lm_B1( gteMAC1, 1 );
+ gteIR2 = Lm_B2( gteMAC2, 1 );
+ gteIR3 = Lm_B3( gteMAC3, 1 );
+ gteMAC1 = A1( ( ( ( (s64) gteR << 4 ) * gteIR1 ) + ( gteIR0 * Lm_B1( gteRFC - ( ( gteR * gteIR1 ) >> 8 ), 0 ) ) ) >> 12 );
+ gteMAC2 = A2( ( ( ( (s64) gteG << 4 ) * gteIR2 ) + ( gteIR0 * Lm_B2( gteGFC - ( ( gteG * gteIR2 ) >> 8 ), 0 ) ) ) >> 12 );
+ gteMAC3 = A3( ( ( ( (s64) gteB << 4 ) * gteIR3 ) + ( gteIR0 * Lm_B3( gteBFC - ( ( gteB * gteIR3 ) >> 8 ), 0 ) ) ) >> 12 );
+
+ gteRGB0 = gteRGB1;
+ gteRGB1 = gteRGB2;
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1( gteMAC1 >> 4 );
+ gteG2 = Lm_C2( gteMAC2 >> 4 );
+ gteB2 = Lm_C3( gteMAC3 >> 4 );
+ }
+ gteIR1 = Lm_B1( gteMAC1, 1 );
+ gteIR2 = Lm_B2( gteMAC2, 1 );
+ gteIR3 = Lm_B3( gteMAC3, 1 );
+}
void gteOP() {
-// double SSX0=0,SSY0=0,SSZ0=0;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
+ int shift = 12 * GTE_SF( gteop );
+ int lm = GTE_LM( gteop );
#ifdef GTE_LOG
- GTE_LOG("GTE_OP %lx\n", psxRegs.code & 0x1ffffff);
-#endif
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("OP", 6);
- G_SD(9);
- G_SD(10);
- G_SD(11);
-
- G_SC(0);
- G_SC(2);
- G_SC(4);
- }
+ GTE_LOG("OP\n");
#endif
-/* gteFLAG=0;
-
- switch (psxRegs.code & 0x1ffffff) {
- case 0x178000C://op12
- SSX0 = EDETEC1((gteR22*(short)gteIR3 - gteR33*(short)gteIR2)/(double)4096);
- SSY0 = EDETEC2((gteR33*(short)gteIR1 - gteR11*(short)gteIR3)/(double)4096);
- SSZ0 = EDETEC3((gteR11*(short)gteIR2 - gteR22*(short)gteIR1)/(double)4096);
- break;
- case 0x170000C:
- SSX0 = EDETEC1((gteR22*(short)gteIR3 - gteR33*(short)gteIR2));
- SSY0 = EDETEC2((gteR33*(short)gteIR1 - gteR11*(short)gteIR3));
- SSZ0 = EDETEC3((gteR11*(short)gteIR2 - gteR22*(short)gteIR1));
- break;
- }
-
- gteMAC1 = (long)float2int(SSX0);
- gteMAC2 = (long)float2int(SSY0);
- gteMAC3 = (long)float2int(SSZ0);
-
- MAC2IR();
-
- if (gteIR1<0) gteIR1=0;
- if (gteIR2<0) gteIR2=0;
- if (gteIR3<0) gteIR3=0;
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
gteFLAG = 0;
-
-/* if (psxRegs.code & 0x80000) {
-
- gteMAC1 = NC_OVERFLOW1((gteD2 * gteIR3 - gteD3 * gteIR2) / 4096.0f);
- gteMAC2 = NC_OVERFLOW2((gteD3 * gteIR1 - gteD1 * gteIR3) / 4096.0f);
- gteMAC3 = NC_OVERFLOW3((gteD1 * gteIR2 - gteD2 * gteIR1) / 4096.0f);
- } else {
-
- gteMAC1 = NC_OVERFLOW1(gteD2 * gteIR3 - gteD3 * gteIR2);
- gteMAC2 = NC_OVERFLOW2(gteD3 * gteIR1 - gteD1 * gteIR3);
- gteMAC3 = NC_OVERFLOW3(gteD1 * gteIR2 - gteD2 * gteIR1);
- }*/
- if (psxRegs.code & 0x80000) {
- gteMAC1 = FNC_OVERFLOW1((gteD2 * gteIR3 - gteD3 * gteIR2) >> 12);
- gteMAC2 = FNC_OVERFLOW2((gteD3 * gteIR1 - gteD1 * gteIR3) >> 12);
- gteMAC3 = FNC_OVERFLOW3((gteD1 * gteIR2 - gteD2 * gteIR1) >> 12);
- } else {
- gteMAC1 = FNC_OVERFLOW1(gteD2 * gteIR3 - gteD3 * gteIR2);
- gteMAC2 = FNC_OVERFLOW2(gteD3 * gteIR1 - gteD1 * gteIR3);
- gteMAC3 = FNC_OVERFLOW3(gteD1 * gteIR2 - gteD2 * gteIR1);
- }
-
- /* NC: old
- MAC2IR1();
- */
- MAC2IR();
-
- SUM_FLAG
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteMAC1 = A1( ( (s64) ( gteR22 * gteIR3 ) - ( gteR33 * gteIR2 ) ) >> shift );
+ gteMAC2 = A2( ( (s64) ( gteR33 * gteIR1 ) - ( gteR11 * gteIR3 ) ) >> shift );
+ gteMAC3 = A3( ( (s64) ( gteR11 * gteIR2 ) - ( gteR22 * gteIR1 ) ) >> shift );
+ gteIR1 = Lm_B1( gteMAC1, lm );
+ gteIR2 = Lm_B2( gteMAC2, lm );
+ gteIR3 = Lm_B3( gteMAC3, lm );
}
void gteDCPL() {
-// unsigned long C,R,G,B;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
-#ifdef GTE_LOG
- GTE_LOG("GTE_DCPL\n");
-#endif
+ int shift = 12 * GTE_SF( gteop );
+ int lm = GTE_LM( gteop );
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("DCPL", 8);
- G_SD(6);
- G_SD(8);
- G_SD(9);
- G_SD(10);
- G_SD(11);
-
- G_SC(21);
- G_SC(22);
- G_SC(23);
- }
+#ifdef GTE_LOG
+ GTE_LOG("DCPL\n");
#endif
-/* R = ((gteRGB)&0xff);
- G = ((gteRGB>> 8)&0xff);
- B = ((gteRGB>>16)&0xff);
- C = ((gteRGB>>24)&0xff);
+ gteFLAG = 0;
- gteMAC1 = (signed long)((double)(R*gteIR1) + (double)(gteIR0*LimitAS(gteRFC-(double)(R*gteIR1),24))/4096.0);
- gteMAC2 = (signed long)((double)(G*gteIR2) + (double)(gteIR0*LimitAS(gteGFC-(double)(G*gteIR2),23))/4096.0);
- gteMAC3 = (signed long)((double)(B*gteIR3) + (double)(gteIR0*LimitAS(gteBFC-(double)(B*gteIR3),22))/4096.0);
+ s64 iR = (gteR << 4) * gteIR1;
+ s64 iG = (gteG << 4) * gteIR2;
+ s64 iB = (gteB << 4) * gteIR3;
- MAC2IR()
-
- R = (unsigned long)LimitB(gteMAC1,21); if (R>255) R=255; else if (R<0) R=0;
- G = (unsigned long)LimitB(gteMAC2,20); if (G>255) G=255; else if (G<0) G=0;
- B = (unsigned long)LimitB(gteMAC3,19); if (B>255) B=255; else if (B<0) B=0;
+ gteMAC1 = A1( iR + gteIR0 * Lm_B1( gteRFC - iR, 0 ) ) >> shift;
+ gteMAC2 = A2( iG + gteIR0 * Lm_B1( gteGFC - iG, 0 ) ) >> shift;
+ gteMAC3 = A3( iB + gteIR0 * Lm_B1( gteBFC - iB, 0 ) ) >> shift;
+ gteIR1 = Lm_B1( gteMAC1 >> 4, lm );
+ gteIR2 = Lm_B2( gteMAC2 >> 4, lm );
+ gteIR3 = Lm_B3( gteMAC3 >> 4, lm );
gteRGB0 = gteRGB1;
gteRGB1 = gteRGB2;
- gteRGB2 = R|(G<<8)|(B<<16)|(C<<24);
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
-
-/* gteFLAG = 0;
-
- gteMAC1 = NC_OVERFLOW1((gteR * gteIR1) / 256.0f + (gteIR0 * limA1S(gteRFC - ((gteR * gteIR1) / 256.0f))) / 4096.0f);
- gteMAC2 = NC_OVERFLOW2((gteG * gteIR1) / 256.0f + (gteIR0 * limA2S(gteGFC - ((gteG * gteIR1) / 256.0f))) / 4096.0f);
- gteMAC3 = NC_OVERFLOW3((gteB * gteIR1) / 256.0f + (gteIR0 * limA3S(gteBFC - ((gteB * gteIR1) / 256.0f))) / 4096.0f);
- */
-/* gteMAC1 = ( (signed long)(gteR)*gteIR1 + (gteIR0*(signed short)limA1S(gteRFC - ((gteR*gteIR1)>>12) )) ) >>6;
- gteMAC2 = ( (signed long)(gteG)*gteIR2 + (gteIR0*(signed short)limA2S(gteGFC - ((gteG*gteIR2)>>12) )) ) >>6;
- gteMAC3 = ( (signed long)(gteB)*gteIR3 + (gteIR0*(signed short)limA3S(gteBFC - ((gteB*gteIR3)>>12) )) ) >>6;*/
-
-/* gteMAC1 = ( (signed long)(gteR)*gteIR1 + (gteIR0*(signed short)limA1S(gteRFC - ((gteR*gteIR1)>>12) )) ) >>8;
- gteMAC2 = ( (signed long)(gteG)*gteIR2 + (gteIR0*(signed short)limA2S(gteGFC - ((gteG*gteIR2)>>12) )) ) >>8;
- gteMAC3 = ( (signed long)(gteB)*gteIR3 + (gteIR0*(signed short)limA3S(gteBFC - ((gteB*gteIR3)>>12) )) ) >>8;*/
- gteMAC1 = ( (signed long)(gteR)*gteIR1 + (gteIR0*(signed short)FlimA1S(gteRFC - ((gteR*gteIR1)>>12) )) ) >>8;
- gteMAC2 = ( (signed long)(gteG)*gteIR2 + (gteIR0*(signed short)FlimA2S(gteGFC - ((gteG*gteIR2)>>12) )) ) >>8;
- gteMAC3 = ( (signed long)(gteB)*gteIR3 + (gteIR0*(signed short)FlimA3S(gteBFC - ((gteB*gteIR3)>>12) )) ) >>8;
-
- gteFLAG=0;
- MAC2IR();
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- //G_GD(20);
- //G_GD(21);
- G_GD(22);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1( gteMAC1 >> 4 );
+ gteG2 = Lm_C2( gteMAC2 >> 4 );
+ gteB2 = Lm_C3( gteMAC3 >> 4 );
}
void gteGPF() {
-// double ipx, ipy, ipz;
-// s32 ipx, ipy, ipz;
+ int shift = 12 * GTE_SF( gteop );
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
#ifdef GTE_LOG
- GTE_LOG("GTE_GPF %lx\n", psxRegs.code & 0x1ffffff);
-#endif
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("GPF", 5);
- G_SD(6);
- G_SD(8);
- G_SD(9);
- G_SD(10);
- G_SD(11);
- }
+ GTE_LOG("GPF\n");
#endif
-/* gteFLAG = 0;
-
- ipx = (double)((short)gteIR0) * ((short)gteIR1);
- ipy = (double)((short)gteIR0) * ((short)gteIR2);
- ipz = (double)((short)gteIR0) * ((short)gteIR3);
-
- // same as mvmva
- if (psxRegs.code & 0x80000) {
- ipx /= 4096.0; ipy /= 4096.0; ipz /= 4096.0;
- }
-
- gteMAC1 = (long)ipx;
- gteMAC2 = (long)ipy;
- gteMAC3 = (long)ipz;
-
- gteIR1 = (long)LimitAS(ipx,24);
- gteIR2 = (long)LimitAS(ipy,23);
- gteIR3 = (long)LimitAS(ipz,22);
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteC2 = gteCODE;
- gteR2 = (unsigned char)LimitB(ipx,21);
- gteG2 = (unsigned char)LimitB(ipy,20);
- gteB2 = (unsigned char)LimitB(ipz,19);*/
-
gteFLAG = 0;
-/* if (psxRegs.code & 0x80000) {
- gteMAC1 = NC_OVERFLOW1((gteIR0 * gteIR1) / 4096.0f);
- gteMAC2 = NC_OVERFLOW2((gteIR0 * gteIR2) / 4096.0f);
- gteMAC3 = NC_OVERFLOW3((gteIR0 * gteIR3) / 4096.0f);
- } else {
- gteMAC1 = NC_OVERFLOW1(gteIR0 * gteIR1);
- gteMAC2 = NC_OVERFLOW2(gteIR0 * gteIR2);
- gteMAC3 = NC_OVERFLOW3(gteIR0 * gteIR3);
- }*/
- if (psxRegs.code & 0x80000) {
- gteMAC1 = FNC_OVERFLOW1((gteIR0 * gteIR1) >> 12);
- gteMAC2 = FNC_OVERFLOW2((gteIR0 * gteIR2) >> 12);
- gteMAC3 = FNC_OVERFLOW3((gteIR0 * gteIR3) >> 12);
- } else {
- gteMAC1 = FNC_OVERFLOW1(gteIR0 * gteIR1);
- gteMAC2 = FNC_OVERFLOW2(gteIR0 * gteIR2);
- gteMAC3 = FNC_OVERFLOW3(gteIR0 * gteIR3);
- }
- MAC2IR();
-
+ gteMAC1 = A1( ( (s64) gteIR0 * gteIR1 ) >> shift );
+ gteMAC2 = A2( ( (s64) gteIR0 * gteIR2 ) >> shift );
+ gteMAC3 = A3( ( (s64) gteIR0 * gteIR3 ) >> shift );
+ gteIR1 = Lm_B1( gteMAC1, 0 );
+ gteIR2 = Lm_B2( gteMAC2, 0 );
+ gteIR3 = Lm_B3( gteMAC3, 0 );
+
gteRGB0 = gteRGB1;
gteRGB1 = gteRGB2;
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- //G_GD(20);
- //G_GD(21);
- G_GD(22);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1( gteMAC1 >> 4 );
+ gteG2 = Lm_C2( gteMAC2 >> 4 );
+ gteB2 = Lm_C3( gteMAC3 >> 4 );
}
void gteGPL() {
- // double IPX=0,IPY=0,IPZ=0;
-// unsigned long C,R,G,B;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
-#ifdef GTE_LOG
- GTE_LOG("GTE_GPL %lx\n", psxRegs.code & 0x1ffffff);
-#endif
+ int shift = 12 * GTE_SF( gteop );
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("GPL", 5);
- G_SD(6);
- G_SD(8);
- G_SD(9);
- G_SD(10);
- G_SD(11);
-
- G_SD(25);
- G_SD(26);
- G_SD(27);
- }
+#ifdef GTE_LOG
+ GTE_LOG("GPL\n");
#endif
+ gteFLAG = 0;
-/* gteFLAG=0;
- switch(psxRegs.code & 0x1ffffff) {
- case 0x1A8003E:
- IPX = EDETEC1((double)gteMAC1 + ((double)gteIR0*(double)gteIR1)/4096.0f);
- IPY = EDETEC2((double)gteMAC2 + ((double)gteIR0*(double)gteIR2)/4096.0f);
- IPZ = EDETEC3((double)gteMAC3 + ((double)gteIR0*(double)gteIR3)/4096.0f);
- break;
-
- case 0x1A0003E:
- IPX = EDETEC1((double)gteMAC1 + ((double)gteIR0*(double)gteIR1));
- IPY = EDETEC2((double)gteMAC2 + ((double)gteIR0*(double)gteIR2));
- IPZ = EDETEC3((double)gteMAC3 + ((double)gteIR0*(double)gteIR3));
- break;
- }
- gteIR1 = (short)float2int(LimitAS(IPX,24));
- gteIR2 = (short)float2int(LimitAS(IPY,23));
- gteIR3 = (short)float2int(LimitAS(IPZ,22));
-
- gteMAC1 = (int)float2int(IPX);
- gteMAC2 = (int)float2int(IPY);
- gteMAC3 = (int)float2int(IPZ);
-
- C = gteRGB & 0xff000000;
- R = float2int(ALIMIT(IPX,0,255));
- G = float2int(ALIMIT(IPY,0,255));
- B = float2int(ALIMIT(IPZ,0,255));
+ gteMAC1 = A1( ( ( (s64) gteMAC1 << shift ) + ( gteIR0 * gteIR1 ) ) >> shift );
+ gteMAC2 = A2( ( ( (s64) gteMAC2 << shift ) + ( gteIR0 * gteIR2 ) ) >> shift );
+ gteMAC3 = A3( ( ( (s64) gteMAC3 << shift ) + ( gteIR0 * gteIR3 ) ) >> shift );
+ gteIR1 = Lm_B1( gteMAC1, 0 );
+ gteIR2 = Lm_B2( gteMAC2, 0 );
+ gteIR3 = Lm_B3( gteMAC3, 0 );
gteRGB0 = gteRGB1;
gteRGB1 = gteRGB2;
- gteRGB2 = C|R|(G<<8)|(B<<16);*/
- gteFLAG = 0;
-
-/* if (psxRegs.code & 0x80000) {
- gteMAC1 = NC_OVERFLOW1(gteMAC1 + (gteIR0 * gteIR1) / 4096.0f);
- gteMAC2 = NC_OVERFLOW2(gteMAC2 + (gteIR0 * gteIR2) / 4096.0f);
- gteMAC3 = NC_OVERFLOW3(gteMAC3 + (gteIR0 * gteIR3) / 4096.0f);
- } else {
- gteMAC1 = NC_OVERFLOW1(gteMAC1 + (gteIR0 * gteIR1));
- gteMAC2 = NC_OVERFLOW2(gteMAC2 + (gteIR0 * gteIR2));
- gteMAC3 = NC_OVERFLOW3(gteMAC3 + (gteIR0 * gteIR3));
- }*/
- if (psxRegs.code & 0x80000) {
- gteMAC1 = FNC_OVERFLOW1(gteMAC1 + ((gteIR0 * gteIR1) >> 12));
- gteMAC2 = FNC_OVERFLOW2(gteMAC2 + ((gteIR0 * gteIR2) >> 12));
- gteMAC3 = FNC_OVERFLOW3(gteMAC3 + ((gteIR0 * gteIR3) >> 12));
- } else {
- gteMAC1 = FNC_OVERFLOW1(gteMAC1 + (gteIR0 * gteIR1));
- gteMAC2 = FNC_OVERFLOW2(gteMAC2 + (gteIR0 * gteIR2));
- gteMAC3 = FNC_OVERFLOW3(gteMAC3 + (gteIR0 * gteIR3));
- }
- MAC2IR();
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- //G_GD(20);
- //G_GD(21);
- G_GD(22);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1( gteMAC1 >> 4 );
+ gteG2 = Lm_C2( gteMAC2 >> 4 );
+ gteB2 = Lm_C3( gteMAC3 >> 4 );
}
-/*
-#define GTE_DPCS() { \
- RR0 = (double)R + (gteIR0*LimitAS((double)(gteRFC - R),24))/4096.0; \
- GG0 = (double)G + (gteIR0*LimitAS((double)(gteGFC - G),23))/4096.0; \
- BB0 = (double)B + (gteIR0*LimitAS((double)(gteBFC - B),22))/4096.0; \
- \
- gteIR1 = (long)LimitAS(RR0,24); \
- gteIR2 = (long)LimitAS(GG0,23); \
- gteIR3 = (long)LimitAS(BB0,22); \
- \
- gteRGB0 = gteRGB1; \
- gteRGB1 = gteRGB2; \
- gteC2 = C; \
- gteR2 = (unsigned char)LimitB(RR0/16.0,21); \
- gteG2 = (unsigned char)LimitB(GG0/16.0,20); \
- gteB2 = (unsigned char)LimitB(BB0/16.0,19); \
- \
- gteMAC1 = (long)RR0; \
- gteMAC2 = (long)GG0; \
- gteMAC3 = (long)BB0; \
-}
-*/
void gteDPCS() {
-// unsigned long C,R,G,B;
-// double RR0,GG0,BB0;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
-#ifdef GTE_LOG
- GTE_LOG("GTE_DPCS\n");
-#endif
+ int shift = 12 * GTE_SF( gteop );
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("DPCS", 8);
- G_SD(6);
- G_SD(8);
-
- G_SC(21);
- G_SC(22);
- G_SC(23);
- }
+#ifdef GTE_LOG
+ GTE_LOG("DPCS\n");
#endif
+ gteFLAG = 0;
-/* gteFLAG = 0;
-
- C = gteCODE;
- R = gteR * 16.0;
- G = gteG * 16.0;
- B = gteB * 16.0;
-
- GTE_DPCS();
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
-/* gteFLAG = 0;
-
- gteMAC1 = NC_OVERFLOW1((gteR * 16.0f) + (gteIR0 * limA1S(gteRFC - (gteR * 16.0f))) / 4096.0f);
- gteMAC2 = NC_OVERFLOW2((gteG * 16.0f) + (gteIR0 * limA2S(gteGFC - (gteG * 16.0f))) / 4096.0f);
- gteMAC3 = NC_OVERFLOW3((gteB * 16.0f) + (gteIR0 * limA3S(gteBFC - (gteB * 16.0f))) / 4096.0f);
- */
-/* gteMAC1 = (gteR<<4) + ( (gteIR0*(signed short)limA1S(gteRFC-(gteR<<4)) ) >>12);
- gteMAC2 = (gteG<<4) + ( (gteIR0*(signed short)limA2S(gteGFC-(gteG<<4)) ) >>12);
- gteMAC3 = (gteB<<4) + ( (gteIR0*(signed short)limA3S(gteBFC-(gteB<<4)) ) >>12);*/
- gteMAC1 = (gteR<<4) + ( (gteIR0*(signed short)FlimA1S(gteRFC-(gteR<<4)) ) >>12);
- gteMAC2 = (gteG<<4) + ( (gteIR0*(signed short)FlimA2S(gteGFC-(gteG<<4)) ) >>12);
- gteMAC3 = (gteB<<4) + ( (gteIR0*(signed short)FlimA3S(gteBFC-(gteB<<4)) ) >>12);
+ gteMAC1 = A1(((gteR << 16) + (gteIR0 * Lm_B1(A1((s64)gteRFC - (gteR << 4)) << (12 - shift), 0))) >> 12);
+ gteMAC2 = A2(((gteG << 16) + (gteIR0 * Lm_B2(A2((s64)gteGFC - (gteG << 4)) << (12 - shift), 0))) >> 12);
+ gteMAC3 = A3(((gteB << 16) + (gteIR0 * Lm_B3(A3((s64)gteBFC - (gteB << 4)) << (12 - shift), 0))) >> 12);
- gteFLAG = 0;
- MAC2IR();
-
+ gteIR1 = Lm_B1(gteMAC1, 0);
+ gteIR2 = Lm_B2(gteMAC2, 0);
+ gteIR3 = Lm_B3(gteMAC3, 0);
gteRGB0 = gteRGB1;
gteRGB1 = gteRGB2;
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- //G_GD(20);
- //G_GD(21);
- G_GD(22);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1(gteMAC1 >> 4);
+ gteG2 = Lm_C2(gteMAC2 >> 4);
+ gteB2 = Lm_C3(gteMAC3 >> 4);
}
void gteDPCT() {
-// unsigned long C,R,G,B;
-// double RR0,GG0,BB0;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
+ int v;
+
#ifdef GTE_LOG
- GTE_LOG("GTE_DPCT\n");
+ GTE_LOG("DPCT\n");
#endif
+ gteFLAG = 0;
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("DPCT", 17);
- G_SD(8);
-
- G_SD(20);
- G_SD(21);
- G_SD(22);
+ for (v = 0; v < 3; v++) {
+ gteMAC1 = A1((((s64)gteR0 << 16) + ((s64)gteIR0 * (Lm_B1(gteRFC - (gteR0 << 4), 0)))) >> 12);
+ gteMAC2 = A2((((s64)gteG0 << 16) + ((s64)gteIR0 * (Lm_B1(gteGFC - (gteG0 << 4), 0)))) >> 12);
+ gteMAC3 = A3((((s64)gteB0 << 16) + ((s64)gteIR0 * (Lm_B1(gteBFC - (gteB0 << 4), 0)))) >> 12);
- G_SC(21);
- G_SC(22);
- G_SC(23);
+ gteRGB0 = gteRGB1;
+ gteRGB1 = gteRGB2;
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1(gteMAC1 >> 4);
+ gteG2 = Lm_C2(gteMAC2 >> 4);
+ gteB2 = Lm_C3(gteMAC3 >> 4);
}
-#endif
-/* gteFLAG = 0;
-
- C = gteCODE0;
- R = gteR0 * 16.0;
- G = gteG0 * 16.0;
- B = gteB0 * 16.0;
-
- GTE_DPCS();
-
- C = gteCODE0;
- R = gteR0 * 16.0;
- G = gteG0 * 16.0;
- B = gteB0 * 16.0;
-
- GTE_DPCS();
-
- C = gteCODE0;
- R = gteR0 * 16.0;
- G = gteG0 * 16.0;
- B = gteB0 * 16.0;
-
- GTE_DPCS();
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
-/* gteFLAG = 0;
-
- gteMAC1 = NC_OVERFLOW1((gteR0 * 16.0f) + gteIR0 * limA1S(gteRFC - (gteR0 * 16.0f)));
- gteMAC2 = NC_OVERFLOW2((gteG0 * 16.0f) + gteIR0 * limA2S(gteGFC - (gteG0 * 16.0f)));
- gteMAC3 = NC_OVERFLOW3((gteB0 * 16.0f) + gteIR0 * limA3S(gteBFC - (gteB0 * 16.0f)));
- */
-/* gteMAC1 = (gteR0<<4) + ( (gteIR0*(signed short)limA1S(gteRFC-(gteR0<<4)) ) >>12);
- gteMAC2 = (gteG0<<4) + ( (gteIR0*(signed short)limA2S(gteGFC-(gteG0<<4)) ) >>12);
- gteMAC3 = (gteB0<<4) + ( (gteIR0*(signed short)limA3S(gteBFC-(gteB0<<4)) ) >>12);*/
- gteMAC1 = (gteR0<<4) + ( (gteIR0*(signed short)FlimA1S(gteRFC-(gteR0<<4)) ) >>12);
- gteMAC2 = (gteG0<<4) + ( (gteIR0*(signed short)FlimA2S(gteGFC-(gteG0<<4)) ) >>12);
- gteMAC3 = (gteB0<<4) + ( (gteIR0*(signed short)FlimA3S(gteBFC-(gteB0<<4)) ) >>12);
-// MAC2IR();
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
-/* gteMAC1 = (gteR0<<4) + ( (gteIR0*(signed short)limA1S(gteRFC-(gteR0<<4)) ) >>12);
- gteMAC2 = (gteG0<<4) + ( (gteIR0*(signed short)limA2S(gteGFC-(gteG0<<4)) ) >>12);
- gteMAC3 = (gteB0<<4) + ( (gteIR0*(signed short)limA3S(gteBFC-(gteB0<<4)) ) >>12);*/
- gteMAC1 = (gteR0<<4) + ( (gteIR0*(signed short)FlimA1S(gteRFC-(gteR0<<4)) ) >>12);
- gteMAC2 = (gteG0<<4) + ( (gteIR0*(signed short)FlimA2S(gteGFC-(gteG0<<4)) ) >>12);
- gteMAC3 = (gteB0<<4) + ( (gteIR0*(signed short)FlimA3S(gteBFC-(gteB0<<4)) ) >>12);
-// MAC2IR();
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
-/* gteMAC1 = (gteR0<<4) + ( (gteIR0*(signed short)limA1S(gteRFC-(gteR0<<4)) ) >>12);
- gteMAC2 = (gteG0<<4) + ( (gteIR0*(signed short)limA2S(gteGFC-(gteG0<<4)) ) >>12);
- gteMAC3 = (gteB0<<4) + ( (gteIR0*(signed short)limA3S(gteBFC-(gteB0<<4)) ) >>12);*/
- gteMAC1 = (gteR0<<4) + ( (gteIR0*(signed short)FlimA1S(gteRFC-(gteR0<<4)) ) >>12);
- gteMAC2 = (gteG0<<4) + ( (gteIR0*(signed short)FlimA2S(gteGFC-(gteG0<<4)) ) >>12);
- gteMAC3 = (gteB0<<4) + ( (gteIR0*(signed short)FlimA3S(gteBFC-(gteB0<<4)) ) >>12);
- gteFLAG = 0;
- MAC2IR();
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- G_GD(20);
- G_GD(21);
- G_GD(22);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteIR1 = Lm_B1(gteMAC1, 0);
+ gteIR2 = Lm_B2(gteMAC2, 0);
+ gteIR3 = Lm_B3(gteMAC3, 0);
}
-/*
-#define GTE_NCS(vn) { \
- RR0 = ((double)gteVX##vn * gteL11 + (double)gteVY##vn * (double)gteL12 + (double)gteVZ##vn * gteL13) / 4096.0; \
- GG0 = ((double)gteVX##vn * gteL21 + (double)gteVY##vn * (double)gteL22 + (double)gteVZ##vn * gteL23) / 4096.0; \
- BB0 = ((double)gteVX##vn * gteL31 + (double)gteVY##vn * (double)gteL32 + (double)gteVZ##vn * gteL33) / 4096.0; \
- t1 = LimitAU(RR0, 24); \
- t2 = LimitAU(GG0, 23); \
- t3 = LimitAU(BB0, 22); \
- \
- RR0 = (double)gteRBK + ((double)gteLR1 * t1 + (double)gteLR2 * t2 + (double)gteLR3 * t3) / 4096.0; \
- GG0 = (double)gteGBK + ((double)gteLG1 * t1 + (double)gteLG2 * t2 + (double)gteLG3 * t3) / 4096.0; \
- BB0 = (double)gteBBK + ((double)gteLB1 * t1 + (double)gteLB2 * t2 + (double)gteLB3 * t3) / 4096.0; \
- t1 = LimitAU(RR0, 24); \
- t2 = LimitAU(GG0, 23); \
- t3 = LimitAU(BB0, 22); \
- \
- gteRGB0 = gteRGB1; gteRGB1 = gteRGB2; \
- gteR2 = (unsigned char)LimitB(RR0/16.0, 21); \
- gteG2 = (unsigned char)LimitB(GG0/16.0, 20); \
- gteB2 = (unsigned char)LimitB(BB0/16.0, 19); \
- gteCODE2=gteCODE0; \
-}*/
-
-#define LOW(a) (((a) < 0) ? 0 : (a))
-/*
-#define GTE_NCS(vn) \
-RR0 = LOW((gteL11*gteVX##vn + gteL12*gteVY##vn + gteL13*gteVZ##vn)/4096.0f); \
-GG0 = LOW((gteL21*gteVX##vn + gteL22*gteVY##vn + gteL23*gteVZ##vn)/4096.0f); \
-BB0 = LOW((gteL31*gteVX##vn + gteL32*gteVY##vn + gteL33*gteVZ##vn)/4096.0f); \
-gteMAC1 = gteRBK + (gteLR1*RR0 + gteLR2*GG0 + gteLR3*BB0)/4096.0f; \
-gteMAC2 = gteGBK + (gteLG1*RR0 + gteLG2*GG0 + gteLG3*BB0)/4096.0f; \
-gteMAC3 = gteBBK + (gteLB1*RR0 + gteLB2*GG0 + gteLB3*BB0)/4096.0f; \
-gteRGB0 = gteRGB1; \
-gteRGB1 = gteRGB2; \
-gteR2 = FlimB1(gteMAC1 >> 4); \
-gteG2 = FlimB2(gteMAC2 >> 4); \
-gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;*/
-/*gteR2 = limB1(gteMAC1 / 16.0f); \
-gteG2 = limB2(gteMAC2 / 16.0f); \
-gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
-
-#define GTE_NCS(vn) \
- gte_LL1 = F12limA1U((gteL11*gteVX##vn + gteL12*gteVY##vn + gteL13*gteVZ##vn) >> 12); \
- gte_LL2 = F12limA2U((gteL21*gteVX##vn + gteL22*gteVY##vn + gteL23*gteVZ##vn) >> 12); \
- gte_LL3 = F12limA3U((gteL31*gteVX##vn + gteL32*gteVY##vn + gteL33*gteVZ##vn) >> 12); \
- gteMAC1 = F12limA1U(gteRBK + ((gteLR1*gte_LL1 + gteLR2*gte_LL2 + gteLR3*gte_LL3) >> 12)); \
- gteMAC2 = F12limA2U(gteGBK + ((gteLG1*gte_LL1 + gteLG2*gte_LL2 + gteLG3*gte_LL3) >> 12)); \
- gteMAC3 = F12limA3U(gteBBK + ((gteLB1*gte_LL1 + gteLB2*gte_LL2 + gteLB3*gte_LL3) >> 12));
-
void gteNCS() {
-// double RR0,GG0,BB0;
- s32 gte_LL1,gte_LL2,gte_LL3;
-// s32 RR0,GG0,BB0;
-// double t1, t2, t3;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
-
#ifdef GTE_LOG
- GTE_LOG("GTE_NCS\n");
-#endif
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("NCS", 14);
- G_SD(0);
- G_SD(1);
- G_SD(6);
-
- G_SC(8);
- G_SC(9);
- G_SC(10);
- G_SC(11);
- G_SC(12);
- G_SC(13);
- G_SC(14);
- G_SC(15);
- G_SC(16);
- G_SC(17);
- G_SC(18);
- G_SC(19);
- G_SC(20);
- }
+ GTE_LOG("NCS\n");
#endif
-/* gteFLAG = 0;
-
- GTE_NCS(0);
-
- gteMAC1=(long)RR0;
- gteMAC2=(long)GG0;
- gteMAC3=(long)BB0;
-
- gteIR1=(long)t1;
- gteIR2=(long)t2;
- gteIR3=(long)t3;
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
gteFLAG = 0;
- GTE_NCS(0);
+ gteMAC1 = A1((((s64)gteL11 * gteVX0) + (gteL12 * gteVY0) + (gteL13 * gteVZ0)) >> 12);
+ gteMAC2 = A2((((s64)gteL21 * gteVX0) + (gteL22 * gteVY0) + (gteL23 * gteVZ0)) >> 12);
+ gteMAC3 = A3((((s64)gteL31 * gteVX0) + (gteL32 * gteVY0) + (gteL33 * gteVZ0)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
+ gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12);
+ gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12);
+ gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
gteRGB0 = gteRGB1;
gteRGB1 = gteRGB2;
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
- MAC2IR1();
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- //G_GD(20);
- //G_GD(21);
- G_GD(22);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1(gteMAC1 >> 4);
+ gteG2 = Lm_C2(gteMAC2 >> 4);
+ gteB2 = Lm_C3(gteMAC3 >> 4);
}
void gteNCT() {
-// double RR0,GG0,BB0;
- s32 gte_LL1,gte_LL2,gte_LL3;
-// s32 RR0,GG0,BB0;
-// double t1, t2, t3;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
+ int v;
+ s32 vx, vy, vz;
#ifdef GTE_LOG
- GTE_LOG("GTE_NCT\n");
-#endif
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("NCT", 30);
- G_SD(0);
- G_SD(1);
- G_SD(2);
- G_SD(3);
- G_SD(4);
- G_SD(5);
- G_SD(6);
-
- G_SC(8);
- G_SC(9);
- G_SC(10);
- G_SC(11);
- G_SC(12);
- G_SC(13);
- G_SC(14);
- G_SC(15);
- G_SC(16);
- G_SC(17);
- G_SC(18);
- G_SC(19);
- G_SC(20);
- }
+ GTE_LOG("NCT\n");
#endif
-/*
- gteFLAG = 0;
-
-//V0
- GTE_NCS(0);
-//V1
- GTE_NCS(1);
-//V2
- GTE_NCS(2);
-
- gteMAC1=(long)RR0;
- gteMAC2=(long)GG0;
- gteMAC3=(long)BB0;
-
- gteIR1=(long)t1;
- gteIR2=(long)t2;
- gteIR3=(long)t3;
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
gteFLAG = 0;
-
- GTE_NCS(0);
-
- gteR0 = FlimB1(gteMAC1 >> 4);
- gteG0 = FlimB2(gteMAC2 >> 4);
- gteB0 = FlimB3(gteMAC3 >> 4); gteCODE0 = gteCODE;
-
- GTE_NCS(1);
- gteR1 = FlimB1(gteMAC1 >> 4);
- gteG1 = FlimB2(gteMAC2 >> 4);
- gteB1 = FlimB3(gteMAC3 >> 4); gteCODE1 = gteCODE;
-
- GTE_NCS(2);
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
- MAC2IR1();
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- G_GD(20);
- G_GD(21);
- G_GD(22);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
- G_GC(31);
- }
-#endif
+ for (v = 0; v < 3; v++) {
+ vx = VX(v);
+ vy = VY(v);
+ vz = VZ(v);
+ gteMAC1 = A1((((s64)gteL11 * vx) + (gteL12 * vy) + (gteL13 * vz)) >> 12);
+ gteMAC2 = A2((((s64)gteL21 * vx) + (gteL22 * vy) + (gteL23 * vz)) >> 12);
+ gteMAC3 = A3((((s64)gteL31 * vx) + (gteL32 * vy) + (gteL33 * vz)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
+ gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12);
+ gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12);
+ gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12);
+ gteRGB0 = gteRGB1;
+ gteRGB1 = gteRGB2;
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1(gteMAC1 >> 4);
+ gteG2 = Lm_C2(gteMAC2 >> 4);
+ gteB2 = Lm_C3(gteMAC3 >> 4);
+ }
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
}
void gteCC() {
-// double RR0,GG0,BB0;
- s32 RR0,GG0,BB0;
-// double t1,t2,t3;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
#ifdef GTE_LOG
- GTE_LOG("GTE_CC\n");
-#endif
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("CC", 11);
- G_SD(6);
- G_SD(9);
- G_SD(10);
- G_SD(11);
-
- G_SC(13);
- G_SC(14);
- G_SC(15);
- G_SC(16);
- G_SC(17);
- G_SC(18);
- G_SC(19);
- }
+ GTE_LOG("CC\n");
#endif
-/* gteFLAG = 0;
-
- RR0 = (double)gteRBK + ((double)gteLR1 * gteIR1 + (double)gteLR2 * gteIR2 + (double)gteLR3 * gteIR3) / 4096.0;
- GG0 = (double)gteGBK + ((double)gteLG1 * gteIR1 + (double)gteLG2 * gteIR2 + (double)gteLG3 * gteIR3) / 4096.0;
- BB0 = (double)gteBBK + ((double)gteLB1 * gteIR1 + (double)gteLB2 * gteIR2 + (double)gteLB3 * gteIR3) / 4096.0;
- t1 = LimitAU(RR0, 24);
- t2 = LimitAU(GG0, 23);
- t3 = LimitAU(BB0, 22);
-
- RR0=((double)gteR * t1)/256.0;
- GG0=((double)gteG * t2)/256.0;
- BB0=((double)gteB * t3)/256.0;
- gteIR1 = (long)LimitAU(RR0,24);
- gteIR2 = (long)LimitAU(GG0,23);
- gteIR3 = (long)LimitAU(BB0,22);
-
- gteCODE0=gteCODE1; gteCODE1=gteCODE2;
- gteC2 = gteCODE0;
- gteR2 = (unsigned char)LimitB(RR0/16.0, 21);
- gteG2 = (unsigned char)LimitB(GG0/16.0, 20);
- gteB2 = (unsigned char)LimitB(BB0/16.0, 19);
-
- if (gteFLAG & 0x7f87e000) gteFLAG|=0x80000000;*/
gteFLAG = 0;
-
-/* RR0 = NC_OVERFLOW1(gteRBK + (gteLR1*gteIR1 + gteLR2*gteIR2 + gteLR3*gteIR3) / 4096.0f);
- GG0 = NC_OVERFLOW2(gteGBK + (gteLG1*gteIR1 + gteLG2*gteIR2 + gteLG3*gteIR3) / 4096.0f);
- BB0 = NC_OVERFLOW3(gteBBK + (gteLB1*gteIR1 + gteLB2*gteIR2 + gteLB3*gteIR3) / 4096.0f);
-
- gteMAC1 = gteR * RR0 / 256.0f;
- gteMAC2 = gteG * GG0 / 256.0f;
- gteMAC3 = gteB * BB0 / 256.0f;*/
- RR0 = FNC_OVERFLOW1(gteRBK + ((gteLR1*gteIR1 + gteLR2*gteIR2 + gteLR3*gteIR3) >> 12));
- GG0 = FNC_OVERFLOW2(gteGBK + ((gteLG1*gteIR1 + gteLG2*gteIR2 + gteLG3*gteIR3) >> 12));
- BB0 = FNC_OVERFLOW3(gteBBK + ((gteLB1*gteIR1 + gteLB2*gteIR2 + gteLB3*gteIR3) >> 12));
-
- gteMAC1 = (gteR * RR0) >> 8;
- gteMAC2 = (gteG * GG0) >> 8;
- gteMAC3 = (gteB * BB0) >> 8;
-
- MAC2IR1();
-
+
+ gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12);
+ gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12);
+ gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
+ gteMAC1 = A1(((s64)gteR * gteIR1) >> 8);
+ gteMAC2 = A2(((s64)gteG * gteIR2) >> 8);
+ gteMAC3 = A3(((s64)gteB * gteIR3) >> 8);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
+
gteRGB0 = gteRGB1;
gteRGB1 = gteRGB2;
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- //G_GD(20);
- //G_GD(21);
- G_GD(22);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1(gteMAC1 >> 4);
+ gteG2 = Lm_C2(gteMAC2 >> 4);
+ gteB2 = Lm_C3(gteMAC3 >> 4);
}
-void gteINTPL() { //test opcode
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
-#ifdef GTE_LOG
- GTE_LOG("GTE_INTP\n");
-#endif
+void gteINTPL() {
+ int shift = 12 * GTE_SF(gteop);
+ int lm = GTE_LM(gteop);
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("INTPL", 8);
- G_SD(6);
- G_SD(8);
- G_SD(9);
- G_SD(10);
- G_SD(11);
-
- G_SC(21);
- G_SC(22);
- G_SC(23);
- }
+#ifdef GTE_LOG
+ GTE_LOG("INTPL\n");
#endif
- /* NC: old
- gteFLAG=0;
- gteMAC1 = gteIR1 + gteIR0*limA1S(gteRFC-gteIR1);
- gteMAC2 = gteIR2 + gteIR0*limA2S(gteGFC-gteIR2);
- gteMAC3 = gteIR3 + gteIR0*limA3S(gteBFC-gteIR3);
- //gteFLAG = 0;
- MAC2IR();
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
-
- gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;
- */
-
-/* gteFLAG=0;
- gteMAC1 = gteIR1 + gteIR0*(gteRFC-gteIR1)/4096.0;
- gteMAC2 = gteIR2 + gteIR0*(gteGFC-gteIR2)/4096.0;
- gteMAC3 = gteIR3 + gteIR0*(gteBFC-gteIR3)/4096.0;
-
- //gteMAC3 = (int)((((psxRegs).CP2D).n).ir3+(((psxRegs).CP2D).n).ir0 * ((((psxRegs).CP2C).n).bfc-(((psxRegs).CP2D).n).ir3)/4096.0);
-
- if(gteMAC3 > gteIR1 && gteMAC3 > gteBFC)
- {
- gteMAC3 = gteMAC3;
- }
- //gteFLAG = 0;*/
- //NEW CODE
-/* gteMAC1 = gteIR1 + ((gteIR0*(signed short)limA1S(gteRFC-gteIR1))>>12);
- gteMAC2 = gteIR2 + ((gteIR0*(signed short)limA2S(gteGFC-gteIR2))>>12);
- gteMAC3 = gteIR3 + ((gteIR0*(signed short)limA3S(gteBFC-gteIR3))>>12);*/
- gteMAC1 = gteIR1 + ((gteIR0*(signed short)FlimA1S(gteRFC-gteIR1))>>12);
- gteMAC2 = gteIR2 + ((gteIR0*(signed short)FlimA2S(gteGFC-gteIR2))>>12);
- gteMAC3 = gteIR3 + ((gteIR0*(signed short)FlimA3S(gteBFC-gteIR3))>>12);
gteFLAG = 0;
- MAC2IR();
+ gteMAC1 = A1(((gteIR1 << 12) + (gteIR0 * Lm_B1(((s64)gteRFC - gteIR1), 0))) >> shift);
+ gteMAC2 = A2(((gteIR2 << 12) + (gteIR0 * Lm_B2(((s64)gteGFC - gteIR2), 0))) >> shift);
+ gteMAC3 = A3(((gteIR3 << 12) + (gteIR0 * Lm_B3(((s64)gteBFC - gteIR3), 0))) >> shift);
+ gteIR1 = Lm_B1(gteMAC1, lm);
+ gteIR2 = Lm_B2(gteMAC2, lm);
+ gteIR3 = Lm_B3(gteMAC3, lm);
gteRGB0 = gteRGB1;
gteRGB1 = gteRGB2;
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- //G_GD(20);
- //G_GD(21);
- G_GD(22);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1(gteMAC1 >> 4);
+ gteG2 = Lm_C2(gteMAC2 >> 4);
+ gteB2 = Lm_C3(gteMAC3 >> 4);
}
-void gteCDP() { //test opcode
- double RR0,GG0,BB0;
-// s32 RR0,GG0,BB0;
-#ifdef GTE_DUMP
- static int sample = 0; sample++;
-#endif
-
+void gteCDP() {
#ifdef GTE_LOG
- GTE_LOG("GTE_CDP\n");
+ GTE_LOG("CDP\n");
#endif
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_OP("CDP", 13);
- G_SD(6);
- G_SD(8);
- G_SD(9);
- G_SD(10);
- G_SD(11);
-
- G_SC(13);
- G_SC(14);
- G_SC(15);
- G_SC(16);
- G_SC(17);
- G_SC(18);
- G_SC(19);
- G_SC(20);
- G_SC(21);
- G_SC(22);
- G_SC(23);
- }
-#endif
-
gteFLAG = 0;
- RR0 = NC_OVERFLOW1(gteRBK + (gteLR1*gteIR1 +gteLR2*gteIR2 + gteLR3*gteIR3));
- GG0 = NC_OVERFLOW2(gteGBK + (gteLG1*gteIR1 +gteLG2*gteIR2 + gteLG3*gteIR3));
- BB0 = NC_OVERFLOW3(gteBBK + (gteLB1*gteIR1 +gteLB2*gteIR2 + gteLB3*gteIR3));
- gteMAC1 = gteR*RR0 + gteIR0*limA1S(gteRFC-gteR*RR0);
- gteMAC2 = gteG*GG0 + gteIR0*limA2S(gteGFC-gteG*GG0);
- gteMAC3 = gteB*BB0 + gteIR0*limA3S(gteBFC-gteB*BB0);
-
-/* RR0 = FNC_OVERFLOW1(gteRBK + (gteLR1*gteIR1 +gteLR2*gteIR2 + gteLR3*gteIR3));
- GG0 = FNC_OVERFLOW2(gteGBK + (gteLG1*gteIR1 +gteLG2*gteIR2 + gteLG3*gteIR3));
- BB0 = FNC_OVERFLOW3(gteBBK + (gteLB1*gteIR1 +gteLB2*gteIR2 + gteLB3*gteIR3));
- gteMAC1 = gteR*RR0 + gteIR0*FlimA1S(gteRFC-gteR*RR0);
- gteMAC2 = gteG*GG0 + gteIR0*FlimA2S(gteGFC-gteG*GG0);
- gteMAC3 = gteB*BB0 + gteIR0*FlimA3S(gteBFC-gteB*BB0);*/
-
- MAC2IR1();
+ gteMAC1 = A1((((s64)gteRBK << 12) + (gteLR1 * gteIR1) + (gteLR2 * gteIR2) + (gteLR3 * gteIR3)) >> 12);
+ gteMAC2 = A2((((s64)gteGBK << 12) + (gteLG1 * gteIR1) + (gteLG2 * gteIR2) + (gteLG3 * gteIR3)) >> 12);
+ gteMAC3 = A3((((s64)gteBBK << 12) + (gteLB1 * gteIR1) + (gteLB2 * gteIR2) + (gteLB3 * gteIR3)) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
+ gteMAC1 = A1(((((s64)gteR << 4) * gteIR1) + (gteIR0 * Lm_B1(gteRFC - ((gteR * gteIR1) >> 8), 0))) >> 12);
+ gteMAC2 = A2(((((s64)gteG << 4) * gteIR2) + (gteIR0 * Lm_B2(gteGFC - ((gteG * gteIR2) >> 8), 0))) >> 12);
+ gteMAC3 = A3(((((s64)gteB << 4) * gteIR3) + (gteIR0 * Lm_B3(gteBFC - ((gteB * gteIR3) >> 8), 0))) >> 12);
+ gteIR1 = Lm_B1(gteMAC1, 1);
+ gteIR2 = Lm_B2(gteMAC2, 1);
+ gteIR3 = Lm_B3(gteMAC3, 1);
+
gteRGB0 = gteRGB1;
gteRGB1 = gteRGB2;
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
- gteR2 = FlimB1(gteMAC1 >> 4);
- gteG2 = FlimB2(gteMAC2 >> 4);
- gteB2 = FlimB3(gteMAC3 >> 4); gteCODE2 = gteCODE;
-
- SUM_FLAG
-
-#ifdef GTE_DUMP
- if(sample < 100)
- {
- G_GD(9);
- G_GD(10);
- G_GD(11);
-
- //G_GD(20);
- //G_GD(21);
- G_GD(22);
-
- G_GD(25);
- G_GD(26);
- G_GD(27);
-
- G_GC(31);
- }
-#endif
+ gteCODE2 = gteCODE;
+ gteR2 = Lm_C1(gteMAC1 >> 4);
+ gteG2 = Lm_C2(gteMAC2 >> 4);
+ gteB2 = Lm_C3(gteMAC3 >> 4);
}
diff --git a/libpcsxcore/gte.h b/libpcsxcore/gte.h
index b369eaae..cfc63101 100644
--- a/libpcsxcore/gte.h
+++ b/libpcsxcore/gte.h
@@ -1,22 +1,19 @@
-/***************************************************************************
- * Copyright (C) 2007 Ryan Schultz, PCSX-df Team, PCSX team *
- * schultz.ryan@gmail.com, http://rschultz.ath.cx/code.php *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA. *
- ***************************************************************************/
+/* PCSX-Revolution - PS Emulator for Nintendo Wii
+ * Copyright (C) 2009-2010 PCSX-Revolution Dev Team
+ *
+ * PCSX-Revolution is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * PCSX-Revolution is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with PCSX-Revolution. If not, see <http://www.gnu.org/licenses/>.
+ */
#ifndef __GTE_H__
#define __GTE_H__
@@ -24,6 +21,149 @@
#include "psxcommon.h"
#include "r3000a.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 GTE_OP(op) ((op >> 20) & 31)
+#define GTE_SF(op) ((op >> 19) & 1)
+#define GTE_MX(op) ((op >> 17) & 3)
+#define GTE_V(op) ((op >> 15) & 3)
+#define GTE_CV(op) ((op >> 13) & 3)
+#define GTE_CD(op) ((op >> 11 ) & 3) /* not used */
+#define GTE_LM(op) ((op >> 10 ) & 1)
+#define GTE_CT(op) ((op >> 6) & 15) /* not used */
+#define GTE_FUNCT(op) (op & 63)
+#define INS_COFUN(op) (op & 0x1ffffff)
+
+#define gteop (INS_COFUN(psxRegs.code))
+
void gteMFC2();
void gteCFC2();
void gteMTC2();
@@ -54,4 +194,4 @@ void gteGPF();
void gteGPL();
void gteNCCT();
-#endif /* __GTE_H__ */
+#endif
diff --git a/libpcsxcore/ix86/iGte.h b/libpcsxcore/ix86/iGte.h
index f9b42879..46265814 100644
--- a/libpcsxcore/ix86/iGte.h
+++ b/libpcsxcore/ix86/iGte.h
@@ -41,172 +41,12 @@ static void rec##f() { \
/* branch = 2; */\
}
-/*CP2_FUNC(MFC2);
+CP2_FUNC(MFC2);
CP2_FUNC(MTC2);
CP2_FUNC(CFC2);
CP2_FUNC(CTC2);
CP2_FUNC(LWC2);
-CP2_FUNC(SWC2);*/
-
-void gteMFC2();
-static void recMFC2() {
-// Rt = Cop2D->Rd
- if (!_Rt_) return;
-
- iRegs[_Rt_].state = ST_UNK;
-
- switch (_Rd_) {
- case 29:
- MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code);
- CALLFunc ((u32)gteMFC2);
- break;
-
- default:
- MOV32MtoR(EAX, (u32)&psxRegs.CP2D.r[_Rd_]);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- break;
- }
-}
-
-void gteMTC2();
-static void recMTC2() {
-// Cop2D->Rd = Rt
- int fixt = 0;
-
-// iFlushRegs();
-
- switch (_Rd_) {
- case 8: case 9: case 10: case 11:
- fixt = 1; break;
-
- case 16: case 17: case 18: case 19:
- fixt = 2; break;
-
- case 15:
- case 28:
- case 30:
- MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code);
- CALLFunc ((u32)gteMTC2);
- break;
- }
-
- if (IsConst(_Rt_)) {
- if (fixt == 1) MOV32ItoM((u32)&psxRegs.CP2D.r[_Rd_], (s16)iRegs[_Rt_].k);
- else if (fixt == 2) MOV32ItoM((u32)&psxRegs.CP2D.r[_Rd_], iRegs[_Rt_].k & 0xffff);
- else MOV32ItoM((u32)&psxRegs.CP2D.r[_Rd_], iRegs[_Rt_].k);
- } else {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- if (fixt == 1) MOVSX32R16toR(EAX, EAX);
- else if (fixt == 2) AND32ItoR(EAX, 0xffff);
- MOV32RtoM((u32)&psxRegs.CP2D.r[_Rd_], EAX);
- }
-}
-
-void gteLWC2();
-static void recLWC2() {
-// Cop2D->Rt = mem[Rs + Im] (unsigned)
- int fixt = 0;
-
- switch (_Rt_) {
- case 8: case 9: case 10: case 11:
- fixt = 1; break;
-
- case 16: case 17: case 18: case 19:
- fixt = 2; break;
-
- case 15:
- case 28:
- case 30:
- iFlushRegs();
- MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code);
- CALLFunc ((u32)gteLWC2);
- return;
- }
-
- if (IsConst(_Rs_)) {
- u32 addr = iRegs[_Rs_].k + _Imm_;
- int t = addr >> 16;
-
- if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) {
- MOV32MtoR(EAX, (u32)&psxM[addr & 0x1fffff]);
- if (fixt == 1) MOVSX32R16toR(EAX, EAX);
- else if (fixt == 2) AND32ItoR(EAX, 0xffff);
- MOV32RtoM((u32)&psxRegs.CP2D.r[_Rt_], EAX);
- return;
- }
- if (t == 0x1f80 && addr < 0x1f801000) {
- MOV32MtoR(EAX, (u32)&psxH[addr & 0xfff]);
- if (fixt == 1) MOVSX32R16toR(EAX, EAX);
- else if (fixt == 2) AND32ItoR(EAX, 0xffff);
- MOV32RtoM((u32)&psxRegs.CP2D.r[_Rt_], EAX);
- return;
- }
- }
-
- iPushOfB();
- CALLFunc((u32)psxMemRead32);
- if (fixt == 1) MOVSX32R16toR(EAX, EAX);
- else if (fixt == 2) AND32ItoR(EAX, 0xffff);
- MOV32RtoM((u32)&psxRegs.CP2D.r[_Rt_], EAX);
-// ADD32ItoR(ESP, 4);
- resp+= 4;
-}
-
-void gteSWC2();
-static void recSWC2() {
-// mem[Rs + Im] = Rt
-
- switch (_Rt_) {
- case 29:
- iFlushRegs();
- MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code);
- CALLFunc ((u32)gteSWC2);
- return;
- }
-
- if (IsConst(_Rs_)) {
- u32 addr = iRegs[_Rs_].k + _Imm_;
- int t = addr >> 16;
-
- if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) {
- MOV32MtoR(EAX, (u32)&psxRegs.CP2D.r[_Rt_]);
- MOV32RtoM((u32)&psxM[addr & 0x1fffff], EAX);
- return;
- }
- if (t == 0x1f80 && addr < 0x1f801000) {
- MOV32MtoR(EAX, (u32)&psxRegs.CP2D.r[_Rt_]);
- MOV32RtoM((u32)&psxH[addr & 0xfff], EAX);
- return;
- }
- }
-
- PUSH32M ((u32)&psxRegs.CP2D.r[_Rt_]);
- iPushOfB();
- CALLFunc((u32)psxMemWrite32);
-// ADD32ItoR(ESP, 8);
- resp+= 8;
-}
-
-static void recCFC2() {
-// Rt = Cop2C->Rd
- if (!_Rt_) return;
-
- iRegs[_Rt_].state = ST_UNK;
- MOV32MtoR(EAX, (u32)&psxRegs.CP2C.r[_Rd_]);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
-}
-
-static void recCTC2() {
-// Cop2C->Rd = Rt
-
- if (IsConst(_Rt_)) {
- MOV32ItoM((u32)&psxRegs.CP2C.r[_Rd_], iRegs[_Rt_].k);
- } else {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- MOV32RtoM((u32)&psxRegs.CP2C.r[_Rd_], EAX);
- }
-}
-
+CP2_FUNC(SWC2);
CP2_FUNCNC(RTPS);
CP2_FUNC(OP);
CP2_FUNCNC(NCLIP);
@@ -230,434 +70,4 @@ CP2_FUNC(GPF);
CP2_FUNC(GPL);
CP2_FUNCNC(NCCT);
-#if 0
-
-#define gteVX0 ((s16*)psxRegs.CP2D.r)[0]
-#define gteVY0 ((s16*)psxRegs.CP2D.r)[1]
-#define gteVZ0 ((s16*)psxRegs.CP2D.r)[2]
-#define gteVX1 ((s16*)psxRegs.CP2D.r)[4]
-#define gteVY1 ((s16*)psxRegs.CP2D.r)[5]
-#define gteVZ1 ((s16*)psxRegs.CP2D.r)[6]
-#define gteVX2 ((s16*)psxRegs.CP2D.r)[8]
-#define gteVY2 ((s16*)psxRegs.CP2D.r)[9]
-#define gteVZ2 ((s16*)psxRegs.CP2D.r)[10]
-#define gteRGB psxRegs.CP2D.r[6]
-#define gteOTZ ((s16*)psxRegs.CP2D.r)[7*2]
-#define gteIR0 ((s32*)psxRegs.CP2D.r)[8]
-#define gteIR1 ((s32*)psxRegs.CP2D.r)[9]
-#define gteIR2 ((s32*)psxRegs.CP2D.r)[10]
-#define gteIR3 ((s32*)psxRegs.CP2D.r)[11]
-#define gteSX0 ((s16*)psxRegs.CP2D.r)[12*2]
-#define gteSY0 ((s16*)psxRegs.CP2D.r)[12*2+1]
-#define gteSX1 ((s16*)psxRegs.CP2D.r)[13*2]
-#define gteSY1 ((s16*)psxRegs.CP2D.r)[13*2+1]
-#define gteSX2 ((s16*)psxRegs.CP2D.r)[14*2]
-#define gteSY2 ((s16*)psxRegs.CP2D.r)[14*2+1]
-#define gteSXP ((s16*)psxRegs.CP2D.r)[15*2]
-#define gteSYP ((s16*)psxRegs.CP2D.r)[15*2+1]
-#define gteSZx ((u16*)psxRegs.CP2D.r)[16*2]
-#define gteSZ0 ((u16*)psxRegs.CP2D.r)[17*2]
-#define gteSZ1 ((u16*)psxRegs.CP2D.r)[18*2]
-#define gteSZ2 ((u16*)psxRegs.CP2D.r)[19*2]
-#define gteRGB0 psxRegs.CP2D.r[20]
-#define gteRGB1 psxRegs.CP2D.r[21]
-#define gteRGB2 psxRegs.CP2D.r[22]
-#define gteMAC0 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 gteR ((u8 *)psxRegs.CP2D.r)[6*4]
-#define gteG ((u8 *)psxRegs.CP2D.r)[6*4+1]
-#define gteB ((u8 *)psxRegs.CP2D.r)[6*4+2]
-#define gteCODE ((u8 *)psxRegs.CP2D.r)[6*4+3]
-#define gteC gteCODE
-
-#define gteR0 ((u8 *)psxRegs.CP2D.r)[20*4]
-#define gteG0 ((u8 *)psxRegs.CP2D.r)[20*4+1]
-#define gteB0 ((u8 *)psxRegs.CP2D.r)[20*4+2]
-#define gteCODE0 ((u8 *)psxRegs.CP2D.r)[20*4+3]
-#define gteC0 gteCODE0
-
-#define gteR1 ((u8 *)psxRegs.CP2D.r)[21*4]
-#define gteG1 ((u8 *)psxRegs.CP2D.r)[21*4+1]
-#define gteB1 ((u8 *)psxRegs.CP2D.r)[21*4+2]
-#define gteCODE1 ((u8 *)psxRegs.CP2D.r)[21*4+3]
-#define gteC1 gteCODE1
-
-#define gteR2 ((u8 *)psxRegs.CP2D.r)[22*4]
-#define gteG2 ((u8 *)psxRegs.CP2D.r)[22*4+1]
-#define gteB2 ((u8 *)psxRegs.CP2D.r)[22*4+2]
-#define gteCODE2 ((u8 *)psxRegs.CP2D.r)[22*4+3]
-#define gteC2 gteCODE2
-
-
-
-#define gteR11 ((s16*)psxRegs.CP2C.r)[0]
-#define gteR12 ((s16*)psxRegs.CP2C.r)[1]
-#define gteR13 ((s16*)psxRegs.CP2C.r)[2]
-#define gteR21 ((s16*)psxRegs.CP2C.r)[3]
-#define gteR22 ((s16*)psxRegs.CP2C.r)[4]
-#define gteR23 ((s16*)psxRegs.CP2C.r)[5]
-#define gteR31 ((s16*)psxRegs.CP2C.r)[6]
-#define gteR32 ((s16*)psxRegs.CP2C.r)[7]
-#define gteR33 ((s16*)psxRegs.CP2C.r)[8]
-#define gteTRX ((s32*)psxRegs.CP2C.r)[5]
-#define gteTRY ((s32*)psxRegs.CP2C.r)[6]
-#define gteTRZ ((s32*)psxRegs.CP2C.r)[7]
-#define gteL11 ((s16*)psxRegs.CP2C.r)[16]
-#define gteL12 ((s16*)psxRegs.CP2C.r)[17]
-#define gteL13 ((s16*)psxRegs.CP2C.r)[18]
-#define gteL21 ((s16*)psxRegs.CP2C.r)[19]
-#define gteL22 ((s16*)psxRegs.CP2C.r)[20]
-#define gteL23 ((s16*)psxRegs.CP2C.r)[21]
-#define gteL31 ((s16*)psxRegs.CP2C.r)[22]
-#define gteL32 ((s16*)psxRegs.CP2C.r)[23]
-#define gteL33 ((s16*)psxRegs.CP2C.r)[24]
-#define gteRBK ((s32*)psxRegs.CP2C.r)[13]
-#define gteGBK ((s32*)psxRegs.CP2C.r)[14]
-#define gteBBK ((s32*)psxRegs.CP2C.r)[15]
-#define gteLR1 ((s16*)psxRegs.CP2C.r)[32]
-#define gteLR2 ((s16*)psxRegs.CP2C.r)[33]
-#define gteLR3 ((s16*)psxRegs.CP2C.r)[34]
-#define gteLG1 ((s16*)psxRegs.CP2C.r)[35]
-#define gteLG2 ((s16*)psxRegs.CP2C.r)[36]
-#define gteLG3 ((s16*)psxRegs.CP2C.r)[37]
-#define gteLB1 ((s16*)psxRegs.CP2C.r)[38]
-#define gteLB2 ((s16*)psxRegs.CP2C.r)[39]
-#define gteLB3 ((s16*)psxRegs.CP2C.r)[40]
-#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 ((u16*)psxRegs.CP2C.r)[52]
-#define gteDQA ((s16*)psxRegs.CP2C.r)[54]
-#define gteDQB ((s32*)psxRegs.CP2C.r)[28]
-#define gteZSF3 ((s16*)psxRegs.CP2C.r)[58]
-#define gteZSF4 ((s16*)psxRegs.CP2C.r)[60]
-#define gteFLAG psxRegs.CP2C.r[31]
-
-//#define SUM_FLAG if(gteFLAG & 0x7F87E000) gteFLAG |= 0x80000000;
-
-#define SUM_FLAG() { \
- TEST32ItoM((u32)&gteFLAG, 0x7F87E000); \
- j8Ptr[0] = JZ8(0); \
- OR32ItoM((u32)&gteFLAG, 0x80000000); \
- \
- x86SetJ8(j8Ptr[0]); \
-}
-
-#define LIM32X8(reg, gteout, negv, posv, flagb) { \
- CMP32ItoR(reg, negv); \
- j8Ptr[0] = JL8(0); \
- CMP32ItoR(reg, posv); \
- j8Ptr[1] = JG8(0); \
- \
- MOV8RtoM((u32)&gteout, reg); \
- j8Ptr[2] = JMP8(0); \
- \
- x86SetJ8(j8Ptr[0]); \
- MOV8ItoM((u32)&gteout, negv); \
- j8Ptr[3] = JMP8(0); \
- \
- x86SetJ8(j8Ptr[1]); \
- MOV8ItoM((u32)&gteout, posv); \
- \
- x86SetJ8(j8Ptr[3]); \
- OR32ItoM((u32)&gteFLAG, 1<<flagb); \
- \
- x86SetJ8(j8Ptr[2]); \
-}
-
-#define _LIM_B1(reg, gteout) LIM32X8(reg, gteout, 0, 255, 21);
-#define _LIM_B2(reg, gteout) LIM32X8(reg, gteout, 0, 255, 20);
-#define _LIM_B3(reg, gteout) LIM32X8(reg, gteout, 0, 255, 19);
-
-#define MAC2IRn(reg, ir, flagb, negv, posv) { \
-/* CMP32ItoR(reg, negv);*/ \
-/* j8Ptr[0] = JL8(0); */\
-/* CMP32ItoR(reg, posv);*/ \
-/* j8Ptr[1] = JG8(0);*/ \
- \
- MOV32RtoM((u32)&ir, reg); \
-/* j8Ptr[2] = JMP8(0);*/ \
- \
-/* x86SetJ8(j8Ptr[0]);*/ \
-/* MOV32ItoM((u32)&ir, negv);*/ \
-/* j8Ptr[3] = JMP8(0);*/ \
- \
-/* x86SetJ8(j8Ptr[1]);*/ \
-/* MOV32ItoM((u32)&ir, posv);*/ \
- \
-/* x86SetJ8(j8Ptr[3]);*/ \
-/* OR32ItoR((u32)&gteFLAG, 1<<flagb);*/ \
- \
-/* x86SetJ8(j8Ptr[2]);*/ \
-}
-
-
-
-#define gte_C11 gteLR1
-#define gte_C12 gteLR2
-#define gte_C13 gteLR3
-#define gte_C21 gteLG1
-#define gte_C22 gteLG2
-#define gte_C23 gteLG3
-#define gte_C31 gteLB1
-#define gte_C32 gteLB2
-#define gte_C33 gteLB3
-
-
-#define _MVMVA_FUNC(vn, mx) { \
- MOVSX32M16toR(EAX, (u32)&mx##vn##1); \
- IMUL32R(EBX); \
-/* j8Ptr[0] = JO8(0);*/ \
- MOV32RtoR(ECX, EAX); \
- \
- MOVSX32M16toR(EAX, (u32)&mx##vn##2); \
- IMUL32R(EDI); \
-/* j8Ptr[1] = JO8(0);*/ \
- ADD32RtoR(ECX, EAX); \
-/* j8Ptr[2] = JO8(0);*/ \
- \
- MOVSX32M16toR(EAX, (u32)&mx##vn##3); \
- IMUL32R(ESI); \
-/* j8Ptr[3] = JO8(0);*/ \
- ADD32RtoR(ECX, EAX); \
-/* j8Ptr[4] = JO8(0);*/ \
-}
-
-/* SSX = (_v0) * mx##11 + (_v1) * mx##12 + (_v2) * mx##13;
- SSY = (_v0) * mx##21 + (_v1) * mx##22 + (_v2) * mx##23;
- SSZ = (_v0) * mx##31 + (_v1) * mx##32 + (_v2) * mx##33; */
-
-#define _MVMVA_ADD(_vx, jn) { \
- ADD32MtoR(ECX, (u32)&_vx); \
-/* j8Ptr[jn] = JO8(0);*/ \
-}
-/* SSX+= gteRFC;
- SSY+= gteGFC;
- SSZ+= gteBFC;*/
-
-#define _MVMVA1(vn) { \
- switch (psxRegs.code & 0x60000) { \
- case 0x00000: /* R */ \
- _MVMVA_FUNC(vn, gteR); break; \
- case 0x20000: /* L */ \
- _MVMVA_FUNC(vn, gteL); break; \
- case 0x40000: /* C */ \
- _MVMVA_FUNC(vn, gte_C); break; \
- default: \
- return; \
- } \
-}
-
-#define _MVMVA_LOAD(_v0, _v1, _v2) { \
- MOVSX32M16toR(EBX, (u32)&_v0); \
- MOVSX32M16toR(EDI, (u32)&_v1); \
- MOVSX32M16toR(ESI, (u32)&_v2); \
-}
-
-static void recMVMVA() {
- int i;
-
-// SysPrintf("GTE_MVMVA %lx\n", psxRegs.code & 0x1ffffff);
-
-/* PUSH32R(ESI);
- PUSH32R(EDI);
- PUSH32R(EBX);
-*/
- XOR32RtoR(EAX, EAX); /* gteFLAG = 0 */
- MOV32RtoM((u32)&gteFLAG, EAX);
-
- switch (psxRegs.code & 0x18000) {
- case 0x00000: /* V0 */
- _MVMVA_LOAD(gteVX0, gteVY0, gteVZ0); break;
- case 0x08000: /* V1 */
- _MVMVA_LOAD(gteVX1, gteVY1, gteVZ1); break;
- case 0x10000: /* V2 */
- _MVMVA_LOAD(gteVX2, gteVY2, gteVZ2); break;
- case 0x18000: /* IR */
- _MVMVA_LOAD(gteIR1, gteIR2, gteIR3); break;
- }
-
-// MAC1
- for (i=5; i<8; i++) j8Ptr[i] = 0;
- _MVMVA1(1);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(ECX, 12);
-// SSX /= 4096.0; SSY /= 4096.0; SSZ /= 4096.0;
- }
-
- switch (psxRegs.code & 0x6000) {
- case 0x0000: // Add TR
- _MVMVA_ADD(gteTRX, 5); break;
- case 0x2000: // Add BK
- _MVMVA_ADD(gteRBK, 6); break;
- case 0x4000: // Add FC
- _MVMVA_ADD(gteRFC, 7); break;
- }
-/*
- j8Ptr[9] = JMP8(0);
- for (i=0; i<5; i++) x86SetJ8(j8Ptr[i]);
- for (i=5; i<8; i++) if (j8Ptr[i]) x86SetJ8(j8Ptr[i]);
-
-// TEST32ItoR(EDX, 0x80000000);
- OR32ItoM((u32)&gteFLAG, 1<<29);
- x86SetJ8(j8Ptr[9]);*/
- MOV32RtoM((u32)&gteMAC1, ECX);
-
- if (psxRegs.code & 0x400) {
- MAC2IRn(ECX, gteIR1, 24, 0, 32767);
- } else {
- MAC2IRn(ECX, gteIR1, 24, -32768, 32767);
- }
-
-// MAC2
- _MVMVA1(2);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(ECX, 12);
-// SSX /= 4096.0; SSY /= 4096.0; SSZ /= 4096.0;
- }
-
- switch (psxRegs.code & 0x6000) {
- case 0x0000: // Add TR
- _MVMVA_ADD(gteTRY, 5); break;
- case 0x2000: // Add BK
- _MVMVA_ADD(gteGBK, 6); break;
- case 0x4000: // Add FC
- _MVMVA_ADD(gteGFC, 7); break;
- }
-
-/* for (i=0; i<5; i++) x86SetJ8(j8Ptr[i]);
- for (i=5; i<8; i++) if (j8Ptr[i]) x86SetJ8(j8Ptr[i]);*/
- MOV32RtoM((u32)&gteMAC2, ECX);
-
- if (psxRegs.code & 0x400) {
- MAC2IRn(ECX, gteIR2, 23, 0, 32767);
- } else {
- MAC2IRn(ECX, gteIR2, 23, -32768, 32767);
- }
-
-// MAC3
- _MVMVA1(3);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(ECX, 12);
-// SSX /= 4096.0; SSY /= 4096.0; SSZ /= 4096.0;
- }
-
- switch (psxRegs.code & 0x6000) {
- case 0x0000: // Add TR
- _MVMVA_ADD(gteTRZ, 5); break;
- case 0x2000: // Add BK
- _MVMVA_ADD(gteBBK, 6); break;
- case 0x4000: // Add FC
- _MVMVA_ADD(gteBFC, 7); break;
- }
-
-/* for (i=0; i<5; i++) x86SetJ8(j8Ptr[i]);
- for (i=5; i<8; i++) if (j8Ptr[i]) x86SetJ8(j8Ptr[i]);*/
- MOV32RtoM((u32)&gteMAC3, ECX);
-
- if (psxRegs.code & 0x400) {
- MAC2IRn(ECX, gteIR3, 22, 0, 32767);
- } else {
- MAC2IRn(ECX, gteIR3, 22, -32768, 32767);
- }
-/* MAC2IR1()
- else MAC2IR()*/
-
-// SUM_FLAG();
-
-/* POP32R(EBX);
- POP32R(EDI);
- POP32R(ESI);*/
-}
-
-#if 0
-
-#define _GPF1(vn) { \
- MOV32MtoR(EAX, (u32)&gteIR##vn); \
- IMUL32R(ECX); \
-/* MOV32RtoR(ECX, EAX); */\
-}
-
-static void recGPF() {
-// SysPrintf("GTE_GPF %lx\n", psxRegs.code & 0x1ffffff);
-
- PUSH32R(EBX);
-
- XOR32RtoR(EBX, EBX); /* gteFLAG = 0 */
-
-/* gteMAC1 = NC_OVERFLOW1(gteIR0 * gteIR1);
- gteMAC2 = NC_OVERFLOW2(gteIR0 * gteIR2);
- gteMAC3 = NC_OVERFLOW3(gteIR0 * gteIR3);*/
- MOV32MtoR(ECX, (u32)&gteIR0);
-// MAC1
- _GPF1(1);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(EAX, 12);
- }
- MAC2IRn(EAX, gteIR1, 24, -32768, 32767);
- PUSH32R(EAX);
-
-// MAC2
- _GPF1(2);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(EAX, 12);
- }
- MAC2IRn(EAX, gteIR2, 23, -32768, 32767);
- PUSH32R(EAX);
-
-// MAC3
- _GPF1(3);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(EAX, 12);
- }
- MAC2IRn(EAX, gteIR3, 22, -32768, 32767);
-// MAC2IR();
-
-// gteRGB0 = gteRGB1;
-// gteRGB1 = gteRGB2;
- MOV32MtoR(EDX, (u32)&gteRGB1);
- MOV32MtoR(ECX, (u32)&gteRGB2);
- MOV32RtoM((u32)&gteRGB0, EDX);
- MOV32RtoM((u32)&gteRGB1, ECX);
-
- POP32R(EDX);
- POP32R(ECX);
- SAR32ItoR(ECX, 4);
- SAR32ItoR(EDX, 4);
- SAR32ItoR(EAX, 4);
-
- _LIM_B1(ECX, gteR2);
- _LIM_B2(EDX, gteG2);
- _LIM_B3(EAX, gteB2);
- MOV8MtoR(EAX, (u32)&gteCODE);
- MOV8RtoM((u32)&gteCODE2, EAX);
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
-
- SUM_FLAG();
- MOV32RtoM((u32)&gteFLAG, EBX);
-
-// POP32R(EBX);
-}
#endif
-#endif
-
-
-#endif /* __IGTE_H__ */
diff --git a/libpcsxcore/ix86_64/iGte.h b/libpcsxcore/ix86_64/iGte.h
index 07f55542..e4c04c83 100644
--- a/libpcsxcore/ix86_64/iGte.h
+++ b/libpcsxcore/ix86_64/iGte.h
@@ -41,181 +41,12 @@ static void rec##f() { \
/* branch = 2; */\
}
-
-#if 0
CP2_FUNC(MFC2);
CP2_FUNC(MTC2);
CP2_FUNC(CFC2);
CP2_FUNC(CTC2);
CP2_FUNC(LWC2);
CP2_FUNC(SWC2);
-#endif
-
-#if 1
-void gteMFC2();
-static void recMFC2() {
-// Rt = Cop2D->Rd
- if (!_Rt_) return;
-
- iRegs[_Rt_].state = ST_UNK;
-
- switch (_Rd_) {
- case 29:
- MOV32ItoM((uptr)&psxRegs.code, (u32)psxRegs.code);
- CALLFunc((uptr)gteMFC2);
- break;
-
- default:
- MOV32MtoR(EAX, (uptr)&psxRegs.CP2D.r[_Rd_]);
- MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX);
- break;
- }
-}
-
-void gteMTC2();
-static void recMTC2() {
-// Cop2D->Rd = Rt
- int fixt = 0;
-
-// iFlushRegs();
-
- switch (_Rd_) {
- case 8: case 9: case 10: case 11:
- fixt = 1; break;
-
- case 16: case 17: case 18: case 19:
- fixt = 2; break;
-
- case 15:
- case 28:
- case 30:
- MOV32ItoM((uptr)&psxRegs.code, (u32)psxRegs.code);
- CALLFunc((uptr)gteMTC2);
- break;
- }
-
- if (IsConst(_Rt_)) {
- if (fixt == 1) MOV32ItoM((uptr)&psxRegs.CP2D.r[_Rd_], (s16)iRegs[_Rt_].k);
- else if (fixt == 2) MOV32ItoM((uptr)&psxRegs.CP2D.r[_Rd_], iRegs[_Rt_].k & 0xffff);
- else MOV32ItoM((uptr)&psxRegs.CP2D.r[_Rd_], iRegs[_Rt_].k);
- } else {
- MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]);
- if (fixt == 1) MOVSX32R16toR(EAX, EAX);
- else if (fixt == 2) AND32ItoR(EAX, 0xffff);
- MOV32RtoM((uptr)&psxRegs.CP2D.r[_Rd_], EAX);
- }
-}
-
-void gteLWC2();
-static void recLWC2() {
-// Cop2D->Rt = mem[Rs + Im] (unsigned)
- int fixt = 0;
-
- switch (_Rt_) {
- case 8: case 9: case 10: case 11:
- fixt = 1; break;
-
- case 16: case 17: case 18: case 19:
- fixt = 2; break;
-
- case 15:
- case 28:
- case 30:
- iFlushRegs();
- MOV32ItoM((uptr)&psxRegs.code, (u32)psxRegs.code);
- CALLFunc((uptr)gteLWC2);
- return;
- }
-
- if (IsConst(_Rs_)) {
- u32 addr = iRegs[_Rs_].k + _Imm_;
- int t = addr >> 16;
-
- if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) {
- MOV32MtoR(EAX, (uptr)&psxM[addr & 0x1fffff]);
- if (fixt == 1) MOVSX32R16toR(EAX, EAX);
- else if (fixt == 2) AND32ItoR(EAX, 0xffff);
- MOV32RtoM((uptr)&psxRegs.CP2D.r[_Rt_], EAX);
- return;
- }
- if (t == 0x1f80 && addr < 0x1f801000) {
- MOV32MtoR(EAX, (uptr)&psxH[addr & 0xfff]);
- if (fixt == 1) MOVSX32R16toR(EAX, EAX);
- else if (fixt == 2) AND32ItoR(EAX, 0xffff);
- MOV32RtoM((uptr)&psxRegs.CP2D.r[_Rt_], EAX);
- return;
- }
- }
-
- //iPushOfB();
- SetArg_OfB(X86ARG1);
- CALLFunc((uptr)psxMemRead32);
- if (fixt == 1) MOVSX32R16toR(EAX, EAX);
- else if (fixt == 2) AND32ItoR(EAX, 0xffff);
- MOV32RtoM((uptr)&psxRegs.CP2D.r[_Rt_], EAX);
-// ADD32ItoR(ESP, 4);
- //resp+= 4;
-}
-
-void gteSWC2();
-static void recSWC2() {
-// mem[Rs + Im] = Rt
-
- switch (_Rt_) {
- case 29:
- iFlushRegs();
- MOV32ItoM((uptr)&psxRegs.code, (u32)psxRegs.code);
- CALLFunc((uptr)gteSWC2);
- return;
- }
-
- if (IsConst(_Rs_)) {
- u32 addr = iRegs[_Rs_].k + _Imm_;
- int t = addr >> 16;
-
- if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) {
- MOV32MtoR(EAX, (uptr)&psxRegs.CP2D.r[_Rt_]);
- MOV32RtoM((uptr)&psxM[addr & 0x1fffff], EAX);
- return;
- }
- if (t == 0x1f80 && addr < 0x1f801000) {
- MOV32MtoR(EAX, (uptr)&psxRegs.CP2D.r[_Rt_]);
- MOV32RtoM((uptr)&psxH[addr & 0xfff], EAX);
- return;
- }
- }
-
- //PUSH64M ((uptr)&psxRegs.CP2D.r[_Rt_]);
- MOV32MtoR(X86ARG2, (uptr)&psxRegs.CP2D.r[_Rt_]);
- //iPushOfB();
- SetArg_OfB(X86ARG1);
- CALLFunc((uptr)psxMemWrite32);
-// ADD32ItoR(ESP, 8);
- //resp+= 8;
-}
-
-static void recCFC2() {
-// Rt = Cop2C->Rd
- if (!_Rt_) return;
-
- iRegs[_Rt_].state = ST_UNK;
- MOV32MtoR(EAX, (uptr)&psxRegs.CP2C.r[_Rd_]);
- MOV32RtoM((uptr)&psxRegs.GPR.r[_Rt_], EAX);
-}
-
-static void recCTC2() {
-// Cop2C->Rd = Rt
-
- if (IsConst(_Rt_)) {
- MOV32ItoM((uptr)&psxRegs.CP2C.r[_Rd_], iRegs[_Rt_].k);
- } else {
- MOV32MtoR(EAX, (uptr)&psxRegs.GPR.r[_Rt_]);
- MOV32RtoM((uptr)&psxRegs.CP2C.r[_Rd_], EAX);
- }
-}
-
-#endif
-
CP2_FUNCNC(RTPS);
CP2_FUNC(OP);
CP2_FUNCNC(NCLIP);
@@ -239,434 +70,4 @@ CP2_FUNC(GPF);
CP2_FUNC(GPL);
CP2_FUNCNC(NCCT);
-#if 0
-
-#define gteVX0 ((s16*)psxRegs.CP2D.r)[0]
-#define gteVY0 ((s16*)psxRegs.CP2D.r)[1]
-#define gteVZ0 ((s16*)psxRegs.CP2D.r)[2]
-#define gteVX1 ((s16*)psxRegs.CP2D.r)[4]
-#define gteVY1 ((s16*)psxRegs.CP2D.r)[5]
-#define gteVZ1 ((s16*)psxRegs.CP2D.r)[6]
-#define gteVX2 ((s16*)psxRegs.CP2D.r)[8]
-#define gteVY2 ((s16*)psxRegs.CP2D.r)[9]
-#define gteVZ2 ((s16*)psxRegs.CP2D.r)[10]
-#define gteRGB psxRegs.CP2D.r[6]
-#define gteOTZ ((s16*)psxRegs.CP2D.r)[7*2]
-#define gteIR0 ((s32*)psxRegs.CP2D.r)[8]
-#define gteIR1 ((s32*)psxRegs.CP2D.r)[9]
-#define gteIR2 ((s32*)psxRegs.CP2D.r)[10]
-#define gteIR3 ((s32*)psxRegs.CP2D.r)[11]
-#define gteSX0 ((s16*)psxRegs.CP2D.r)[12*2]
-#define gteSY0 ((s16*)psxRegs.CP2D.r)[12*2+1]
-#define gteSX1 ((s16*)psxRegs.CP2D.r)[13*2]
-#define gteSY1 ((s16*)psxRegs.CP2D.r)[13*2+1]
-#define gteSX2 ((s16*)psxRegs.CP2D.r)[14*2]
-#define gteSY2 ((s16*)psxRegs.CP2D.r)[14*2+1]
-#define gteSXP ((s16*)psxRegs.CP2D.r)[15*2]
-#define gteSYP ((s16*)psxRegs.CP2D.r)[15*2+1]
-#define gteSZx ((u16*)psxRegs.CP2D.r)[16*2]
-#define gteSZ0 ((u16*)psxRegs.CP2D.r)[17*2]
-#define gteSZ1 ((u16*)psxRegs.CP2D.r)[18*2]
-#define gteSZ2 ((u16*)psxRegs.CP2D.r)[19*2]
-#define gteRGB0 psxRegs.CP2D.r[20]
-#define gteRGB1 psxRegs.CP2D.r[21]
-#define gteRGB2 psxRegs.CP2D.r[22]
-#define gteMAC0 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 gteR ((u8 *)psxRegs.CP2D.r)[6*4]
-#define gteG ((u8 *)psxRegs.CP2D.r)[6*4+1]
-#define gteB ((u8 *)psxRegs.CP2D.r)[6*4+2]
-#define gteCODE ((u8 *)psxRegs.CP2D.r)[6*4+3]
-#define gteC gteCODE
-
-#define gteR0 ((u8 *)psxRegs.CP2D.r)[20*4]
-#define gteG0 ((u8 *)psxRegs.CP2D.r)[20*4+1]
-#define gteB0 ((u8 *)psxRegs.CP2D.r)[20*4+2]
-#define gteCODE0 ((u8 *)psxRegs.CP2D.r)[20*4+3]
-#define gteC0 gteCODE0
-
-#define gteR1 ((u8 *)psxRegs.CP2D.r)[21*4]
-#define gteG1 ((u8 *)psxRegs.CP2D.r)[21*4+1]
-#define gteB1 ((u8 *)psxRegs.CP2D.r)[21*4+2]
-#define gteCODE1 ((u8 *)psxRegs.CP2D.r)[21*4+3]
-#define gteC1 gteCODE1
-
-#define gteR2 ((u8 *)psxRegs.CP2D.r)[22*4]
-#define gteG2 ((u8 *)psxRegs.CP2D.r)[22*4+1]
-#define gteB2 ((u8 *)psxRegs.CP2D.r)[22*4+2]
-#define gteCODE2 ((u8 *)psxRegs.CP2D.r)[22*4+3]
-#define gteC2 gteCODE2
-
-
-
-#define gteR11 ((s16*)psxRegs.CP2C.r)[0]
-#define gteR12 ((s16*)psxRegs.CP2C.r)[1]
-#define gteR13 ((s16*)psxRegs.CP2C.r)[2]
-#define gteR21 ((s16*)psxRegs.CP2C.r)[3]
-#define gteR22 ((s16*)psxRegs.CP2C.r)[4]
-#define gteR23 ((s16*)psxRegs.CP2C.r)[5]
-#define gteR31 ((s16*)psxRegs.CP2C.r)[6]
-#define gteR32 ((s16*)psxRegs.CP2C.r)[7]
-#define gteR33 ((s16*)psxRegs.CP2C.r)[8]
-#define gteTRX ((s32*)psxRegs.CP2C.r)[5]
-#define gteTRY ((s32*)psxRegs.CP2C.r)[6]
-#define gteTRZ ((s32*)psxRegs.CP2C.r)[7]
-#define gteL11 ((s16*)psxRegs.CP2C.r)[16]
-#define gteL12 ((s16*)psxRegs.CP2C.r)[17]
-#define gteL13 ((s16*)psxRegs.CP2C.r)[18]
-#define gteL21 ((s16*)psxRegs.CP2C.r)[19]
-#define gteL22 ((s16*)psxRegs.CP2C.r)[20]
-#define gteL23 ((s16*)psxRegs.CP2C.r)[21]
-#define gteL31 ((s16*)psxRegs.CP2C.r)[22]
-#define gteL32 ((s16*)psxRegs.CP2C.r)[23]
-#define gteL33 ((s16*)psxRegs.CP2C.r)[24]
-#define gteRBK ((s32*)psxRegs.CP2C.r)[13]
-#define gteGBK ((s32*)psxRegs.CP2C.r)[14]
-#define gteBBK ((s32*)psxRegs.CP2C.r)[15]
-#define gteLR1 ((s16*)psxRegs.CP2C.r)[32]
-#define gteLR2 ((s16*)psxRegs.CP2C.r)[33]
-#define gteLR3 ((s16*)psxRegs.CP2C.r)[34]
-#define gteLG1 ((s16*)psxRegs.CP2C.r)[35]
-#define gteLG2 ((s16*)psxRegs.CP2C.r)[36]
-#define gteLG3 ((s16*)psxRegs.CP2C.r)[37]
-#define gteLB1 ((s16*)psxRegs.CP2C.r)[38]
-#define gteLB2 ((s16*)psxRegs.CP2C.r)[39]
-#define gteLB3 ((s16*)psxRegs.CP2C.r)[40]
-#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 ((u16*)psxRegs.CP2C.r)[52]
-#define gteDQA ((s16*)psxRegs.CP2C.r)[54]
-#define gteDQB ((s32*)psxRegs.CP2C.r)[28]
-#define gteZSF3 ((s16*)psxRegs.CP2C.r)[58]
-#define gteZSF4 ((s16*)psxRegs.CP2C.r)[60]
-#define gteFLAG psxRegs.CP2C.r[31]
-
-//#define SUM_FLAG if(gteFLAG & 0x7F87E000) gteFLAG |= 0x80000000;
-
-#define SUM_FLAG() { \
- TEST32ItoM((uptr)&gteFLAG, 0x7F87E000); \
- j8Ptr[0] = JZ8(0); \
- OR32ItoM((uptr)&gteFLAG, 0x80000000); \
- \
- x86SetJ8(j8Ptr[0]); \
-}
-
-#define LIM32X8(reg, gteout, negv, posv, flagb) { \
- CMP32ItoR(reg, negv); \
- j8Ptr[0] = JL8(0); \
- CMP32ItoR(reg, posv); \
- j8Ptr[1] = JG8(0); \
- \
- MOV8RtoM((uptr)&gteout, reg); \
- j8Ptr[2] = JMP8(0); \
- \
- x86SetJ8(j8Ptr[0]); \
- MOV8ItoM((uptr)&gteout, negv); \
- j8Ptr[3] = JMP8(0); \
- \
- x86SetJ8(j8Ptr[1]); \
- MOV8ItoM((uptr)&gteout, posv); \
- \
- x86SetJ8(j8Ptr[3]); \
- OR32ItoM((uptr)&gteFLAG, 1<<flagb); \
- \
- x86SetJ8(j8Ptr[2]); \
-}
-
-#define _LIM_B1(reg, gteout) LIM32X8(reg, gteout, 0, 255, 21);
-#define _LIM_B2(reg, gteout) LIM32X8(reg, gteout, 0, 255, 20);
-#define _LIM_B3(reg, gteout) LIM32X8(reg, gteout, 0, 255, 19);
-
-#define MAC2IRn(reg, ir, flagb, negv, posv) { \
-/* CMP32ItoR(reg, negv);*/ \
-/* j8Ptr[0] = JL8(0); */\
-/* CMP32ItoR(reg, posv);*/ \
-/* j8Ptr[1] = JG8(0);*/ \
- \
- MOV32RtoM((uptr)&ir, reg); \
-/* j8Ptr[2] = JMP8(0);*/ \
- \
-/* x86SetJ8(j8Ptr[0]);*/ \
-/* MOV32ItoM((uptr)&ir, negv);*/ \
-/* j8Ptr[3] = JMP8(0);*/ \
- \
-/* x86SetJ8(j8Ptr[1]);*/ \
-/* MOV32ItoM((uptr)&ir, posv);*/ \
- \
-/* x86SetJ8(j8Ptr[3]);*/ \
-/* OR32ItoR((uptr)&gteFLAG, 1<<flagb);*/ \
- \
-/* x86SetJ8(j8Ptr[2]);*/ \
-}
-
-
-
-#define gte_C11 gteLR1
-#define gte_C12 gteLR2
-#define gte_C13 gteLR3
-#define gte_C21 gteLG1
-#define gte_C22 gteLG2
-#define gte_C23 gteLG3
-#define gte_C31 gteLB1
-#define gte_C32 gteLB2
-#define gte_C33 gteLB3
-
-
-#define _MVMVA_FUNC(vn, mx) { \
- MOVSX32M16toR(EAX, (uptr)&mx##vn##1); \
- IMUL32R(EBX); \
-/* j8Ptr[0] = JO8(0);*/ \
- MOV32RtoR(ECX, EAX); \
- \
- MOVSX32M16toR(EAX, (uptr)&mx##vn##2); \
- IMUL32R(EDI); \
-/* j8Ptr[1] = JO8(0);*/ \
- ADD32RtoR(ECX, EAX); \
-/* j8Ptr[2] = JO8(0);*/ \
- \
- MOVSX32M16toR(EAX, (uptr)&mx##vn##3); \
- IMUL32R(ESI); \
-/* j8Ptr[3] = JO8(0);*/ \
- ADD32RtoR(ECX, EAX); \
-/* j8Ptr[4] = JO8(0);*/ \
-}
-
-/* SSX = (_v0) * mx##11 + (_v1) * mx##12 + (_v2) * mx##13;
- SSY = (_v0) * mx##21 + (_v1) * mx##22 + (_v2) * mx##23;
- SSZ = (_v0) * mx##31 + (_v1) * mx##32 + (_v2) * mx##33; */
-
-#define _MVMVA_ADD(_vx, jn) { \
- ADD32MtoR(ECX, (uptr)&_vx); \
-/* j8Ptr[jn] = JO8(0);*/ \
-}
-/* SSX+= gteRFC;
- SSY+= gteGFC;
- SSZ+= gteBFC;*/
-
-#define _MVMVA1(vn) { \
- switch (psxRegs.code & 0x60000) { \
- case 0x00000: /* R */ \
- _MVMVA_FUNC(vn, gteR); break; \
- case 0x20000: /* L */ \
- _MVMVA_FUNC(vn, gteL); break; \
- case 0x40000: /* C */ \
- _MVMVA_FUNC(vn, gte_C); break; \
- default: \
- return; \
- } \
-}
-
-#define _MVMVA_LOAD(_v0, _v1, _v2) { \
- MOVSX32M16toR(EBX, (uptr)&_v0); \
- MOVSX32M16toR(EDI, (uptr)&_v1); \
- MOVSX32M16toR(ESI, (uptr)&_v2); \
-}
-
-static void recMVMVA() {
- int i;
-
-// SysPrintf("GTE_MVMVA %lx\n", psxRegs.code & 0x1ffffff);
-
-/* PUSH32R(ESI);
- PUSH32R(EDI);
- PUSH32R(EBX);
-*/
- XOR32RtoR(EAX, EAX); /* gteFLAG = 0 */
- MOV32RtoM((uptr)&gteFLAG, EAX);
-
- switch (psxRegs.code & 0x18000) {
- case 0x00000: /* V0 */
- _MVMVA_LOAD(gteVX0, gteVY0, gteVZ0); break;
- case 0x08000: /* V1 */
- _MVMVA_LOAD(gteVX1, gteVY1, gteVZ1); break;
- case 0x10000: /* V2 */
- _MVMVA_LOAD(gteVX2, gteVY2, gteVZ2); break;
- case 0x18000: /* IR */
- _MVMVA_LOAD(gteIR1, gteIR2, gteIR3); break;
- }
-
-// MAC1
- for (i=5; i<8; i++) j8Ptr[i] = 0;
- _MVMVA1(1);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(ECX, 12);
-// SSX /= 4096.0; SSY /= 4096.0; SSZ /= 4096.0;
- }
-
- switch (psxRegs.code & 0x6000) {
- case 0x0000: // Add TR
- _MVMVA_ADD(gteTRX, 5); break;
- case 0x2000: // Add BK
- _MVMVA_ADD(gteRBK, 6); break;
- case 0x4000: // Add FC
- _MVMVA_ADD(gteRFC, 7); break;
- }
-/*
- j8Ptr[9] = JMP8(0);
- for (i=0; i<5; i++) x86SetJ8(j8Ptr[i]);
- for (i=5; i<8; i++) if (j8Ptr[i]) x86SetJ8(j8Ptr[i]);
-
-// TEST32ItoR(EDX, 0x80000000);
- OR32ItoM((uptr)&gteFLAG, 1<<29);
- x86SetJ8(j8Ptr[9]);*/
- MOV32RtoM((uptr)&gteMAC1, ECX);
-
- if (psxRegs.code & 0x400) {
- MAC2IRn(ECX, gteIR1, 24, 0, 32767);
- } else {
- MAC2IRn(ECX, gteIR1, 24, -32768, 32767);
- }
-
-// MAC2
- _MVMVA1(2);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(ECX, 12);
-// SSX /= 4096.0; SSY /= 4096.0; SSZ /= 4096.0;
- }
-
- switch (psxRegs.code & 0x6000) {
- case 0x0000: // Add TR
- _MVMVA_ADD(gteTRY, 5); break;
- case 0x2000: // Add BK
- _MVMVA_ADD(gteGBK, 6); break;
- case 0x4000: // Add FC
- _MVMVA_ADD(gteGFC, 7); break;
- }
-
-/* for (i=0; i<5; i++) x86SetJ8(j8Ptr[i]);
- for (i=5; i<8; i++) if (j8Ptr[i]) x86SetJ8(j8Ptr[i]);*/
- MOV32RtoM((uptr)&gteMAC2, ECX);
-
- if (psxRegs.code & 0x400) {
- MAC2IRn(ECX, gteIR2, 23, 0, 32767);
- } else {
- MAC2IRn(ECX, gteIR2, 23, -32768, 32767);
- }
-
-// MAC3
- _MVMVA1(3);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(ECX, 12);
-// SSX /= 4096.0; SSY /= 4096.0; SSZ /= 4096.0;
- }
-
- switch (psxRegs.code & 0x6000) {
- case 0x0000: // Add TR
- _MVMVA_ADD(gteTRZ, 5); break;
- case 0x2000: // Add BK
- _MVMVA_ADD(gteBBK, 6); break;
- case 0x4000: // Add FC
- _MVMVA_ADD(gteBFC, 7); break;
- }
-
-/* for (i=0; i<5; i++) x86SetJ8(j8Ptr[i]);
- for (i=5; i<8; i++) if (j8Ptr[i]) x86SetJ8(j8Ptr[i]);*/
- MOV32RtoM((uptr)&gteMAC3, ECX);
-
- if (psxRegs.code & 0x400) {
- MAC2IRn(ECX, gteIR3, 22, 0, 32767);
- } else {
- MAC2IRn(ECX, gteIR3, 22, -32768, 32767);
- }
-/* MAC2IR1()
- else MAC2IR()*/
-
-// SUM_FLAG();
-
-/* POP32R(EBX);
- POP32R(EDI);
- POP32R(ESI);*/
-}
-
-#if 0
-
-#define _GPF1(vn) { \
- MOV32MtoR(EAX, (uptr)&gteIR##vn); \
- IMUL32R(ECX); \
-/* MOV32RtoR(ECX, EAX); */\
-}
-
-static void recGPF() {
-// SysPrintf("GTE_GPF %lx\n", psxRegs.code & 0x1ffffff);
-
- PUSH32R(EBX);
-
- XOR32RtoR(EBX, EBX); /* gteFLAG = 0 */
-
-/* gteMAC1 = NC_OVERFLOW1(gteIR0 * gteIR1);
- gteMAC2 = NC_OVERFLOW2(gteIR0 * gteIR2);
- gteMAC3 = NC_OVERFLOW3(gteIR0 * gteIR3);*/
- MOV32MtoR(ECX, (uptr)&gteIR0);
-// MAC1
- _GPF1(1);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(EAX, 12);
- }
- MAC2IRn(EAX, gteIR1, 24, -32768, 32767);
- PUSH32R(EAX);
-
-// MAC2
- _GPF1(2);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(EAX, 12);
- }
- MAC2IRn(EAX, gteIR2, 23, -32768, 32767);
- PUSH32R(EAX);
-
-// MAC3
- _GPF1(3);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(EAX, 12);
- }
- MAC2IRn(EAX, gteIR3, 22, -32768, 32767);
-// MAC2IR();
-
-// gteRGB0 = gteRGB1;
-// gteRGB1 = gteRGB2;
- MOV32MtoR(EDX, (uptr)&gteRGB1);
- MOV32MtoR(ECX, (uptr)&gteRGB2);
- MOV32RtoM((uptr)&gteRGB0, EDX);
- MOV32RtoM((uptr)&gteRGB1, ECX);
-
- POP32R(EDX);
- POP32R(ECX);
- SAR32ItoR(ECX, 4);
- SAR32ItoR(EDX, 4);
- SAR32ItoR(EAX, 4);
-
- _LIM_B1(ECX, gteR2);
- _LIM_B2(EDX, gteG2);
- _LIM_B3(EAX, gteB2);
- MOV8MtoR(EAX, (uptr)&gteCODE);
- MOV8RtoM((uptr)&gteCODE2, EAX);
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
-
- SUM_FLAG();
- MOV32RtoM((uptr)&gteFLAG, EBX);
-
-// POP32R(EBX);
-}
#endif
-#endif
-
-
-#endif /* __IGTE_H__ */
diff --git a/libpcsxcore/ppc/pGte.h b/libpcsxcore/ppc/pGte.h
index 27894374..4294c066 100644
--- a/libpcsxcore/ppc/pGte.h
+++ b/libpcsxcore/ppc/pGte.h
@@ -55,168 +55,6 @@ CP2_FUNC(CFC2);
CP2_FUNC(CTC2);
CP2_FUNC(LWC2);
CP2_FUNC(SWC2);
-
-#if 0
-void gteMFC2();
-static void recMFC2() {
-// Rt = Cop2D->Rd
- if (!_Rt_) return;
-
- iRegs[_Rt_].state = ST_UNK;
-
- switch (_Rd_) {
- case 29:
- MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code);
- CALLFunc ((u32)gteMFC2);
- break;
-
- default:
- MOV32MtoR(EAX, (u32)&psxRegs.CP2D.r[_Rd_]);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- break;
- }
-}
-
-void gteMTC2();
-static void recMTC2() {
-// Cop2D->Rd = Rt
- int fixt = 0;
-
-// iFlushRegs();
-
- switch (_Rd_) {
- case 8: case 9: case 10: case 11:
- fixt = 1; break;
-
- case 16: case 17: case 18: case 19:
- fixt = 2; break;
-
- case 15:
- case 28:
- case 30:
- MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code);
- CALLFunc ((u32)gteMTC2);
- break;
- }
-
- if (IsConst(_Rt_)) {
- if (fixt == 1) MOV32ItoM((u32)&psxRegs.CP2D.r[_Rd_], (s16)iRegs[_Rt_].k);
- else if (fixt == 2) MOV32ItoM((u32)&psxRegs.CP2D.r[_Rd_], iRegs[_Rt_].k & 0xffff);
- else MOV32ItoM((u32)&psxRegs.CP2D.r[_Rd_], iRegs[_Rt_].k);
- } else {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- if (fixt == 1) MOVSX32R16toR(EAX, EAX);
- else if (fixt == 2) AND32ItoR(EAX, 0xffff);
- MOV32RtoM((u32)&psxRegs.CP2D.r[_Rd_], EAX);
- }
-}
-
-void gteLWC2();
-static void recLWC2() {
-// Cop2D->Rt = mem[Rs + Im] (unsigned)
- int fixt = 0;
-
- switch (_Rt_) {
- case 8: case 9: case 10: case 11:
- fixt = 1; break;
-
- case 16: case 17: case 18: case 19:
- fixt = 2; break;
-
- case 15:
- case 28:
- case 30:
- iFlushRegs();
- MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code);
- CALLFunc ((u32)gteLWC2);
- return;
- }
-
- if (IsConst(_Rs_)) {
- u32 addr = iRegs[_Rs_].k + _Imm_;
- int t = addr >> 16;
-
- if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) {
- MOV32MtoR(EAX, (u32)&psxM[addr & 0x1fffff]);
- if (fixt == 1) MOVSX32R16toR(EAX, EAX);
- else if (fixt == 2) AND32ItoR(EAX, 0xffff);
- MOV32RtoM((u32)&psxRegs.CP2D.r[_Rt_], EAX);
- return;
- }
- if (t == 0x1f80 && addr < 0x1f801000) {
- MOV32MtoR(EAX, (u32)&psxH[addr & 0xfff]);
- if (fixt == 1) MOVSX32R16toR(EAX, EAX);
- else if (fixt == 2) AND32ItoR(EAX, 0xffff);
- MOV32RtoM((u32)&psxRegs.CP2D.r[_Rt_], EAX);
- return;
- }
- }
-
- iPushOfB();
- CALLFunc((u32)psxMemRead32);
- if (fixt == 1) MOVSX32R16toR(EAX, EAX);
- else if (fixt == 2) AND32ItoR(EAX, 0xffff);
- MOV32RtoM((u32)&psxRegs.CP2D.r[_Rt_], EAX);
-// ADD32ItoR(ESP, 4);
- resp+= 4;
-}
-
-void gteSWC2();
-static void recSWC2() {
-// mem[Rs + Im] = Rt
-
- switch (_Rt_) {
- case 29:
- iFlushRegs();
- MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code);
- CALLFunc ((u32)gteSWC2);
- return;
- }
-
- if (IsConst(_Rs_)) {
- u32 addr = iRegs[_Rs_].k + _Imm_;
- int t = addr >> 16;
-
- if ((t & 0x1fe0) == 0 && (t & 0x1fff) != 0) {
- MOV32MtoR(EAX, (u32)&psxRegs.CP2D.r[_Rt_]);
- MOV32RtoM((u32)&psxM[addr & 0x1fffff], EAX);
- return;
- }
- if (t == 0x1f80 && addr < 0x1f801000) {
- MOV32MtoR(EAX, (u32)&psxRegs.CP2D.r[_Rt_]);
- MOV32RtoM((u32)&psxH[addr & 0xfff], EAX);
- return;
- }
- }
-
- PUSH32M ((u32)&psxRegs.CP2D.r[_Rt_]);
- iPushOfB();
- CALLFunc((u32)psxMemWrite32);
-// ADD32ItoR(ESP, 8);
- resp+= 8;
-}
-
-static void recCFC2() {
-// Rt = Cop2C->Rd
- if (!_Rt_) return;
-
- iRegs[_Rt_].state = ST_UNK;
- MOV32MtoR(EAX, (u32)&psxRegs.CP2C.r[_Rd_]);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
-}
-
-static void recCTC2() {
-// Cop2C->Rd = Rt
-
- if (IsConst(_Rt_)) {
- MOV32ItoM((u32)&psxRegs.CP2C.r[_Rd_], iRegs[_Rt_].k);
- } else {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- MOV32RtoM((u32)&psxRegs.CP2C.r[_Rd_], EAX);
- }
-}
-#endif
-
CP2_FUNCNC(RTPS);
CP2_FUNC(OP);
CP2_FUNCNC(NCLIP);
@@ -239,432 +77,3 @@ CP2_FUNCNC(RTPT);
CP2_FUNC(GPF);
CP2_FUNC(GPL);
CP2_FUNCNC(NCCT);
-
-#if 0
-
-#define gteVX0 ((s16*)psxRegs.CP2D.r)[0]
-#define gteVY0 ((s16*)psxRegs.CP2D.r)[1]
-#define gteVZ0 ((s16*)psxRegs.CP2D.r)[2]
-#define gteVX1 ((s16*)psxRegs.CP2D.r)[4]
-#define gteVY1 ((s16*)psxRegs.CP2D.r)[5]
-#define gteVZ1 ((s16*)psxRegs.CP2D.r)[6]
-#define gteVX2 ((s16*)psxRegs.CP2D.r)[8]
-#define gteVY2 ((s16*)psxRegs.CP2D.r)[9]
-#define gteVZ2 ((s16*)psxRegs.CP2D.r)[10]
-#define gteRGB psxRegs.CP2D.r[6]
-#define gteOTZ ((s16*)psxRegs.CP2D.r)[7*2]
-#define gteIR0 ((s32*)psxRegs.CP2D.r)[8]
-#define gteIR1 ((s32*)psxRegs.CP2D.r)[9]
-#define gteIR2 ((s32*)psxRegs.CP2D.r)[10]
-#define gteIR3 ((s32*)psxRegs.CP2D.r)[11]
-#define gteSX0 ((s16*)psxRegs.CP2D.r)[12*2]
-#define gteSY0 ((s16*)psxRegs.CP2D.r)[12*2+1]
-#define gteSX1 ((s16*)psxRegs.CP2D.r)[13*2]
-#define gteSY1 ((s16*)psxRegs.CP2D.r)[13*2+1]
-#define gteSX2 ((s16*)psxRegs.CP2D.r)[14*2]
-#define gteSY2 ((s16*)psxRegs.CP2D.r)[14*2+1]
-#define gteSXP ((s16*)psxRegs.CP2D.r)[15*2]
-#define gteSYP ((s16*)psxRegs.CP2D.r)[15*2+1]
-#define gteSZx ((u16*)psxRegs.CP2D.r)[16*2]
-#define gteSZ0 ((u16*)psxRegs.CP2D.r)[17*2]
-#define gteSZ1 ((u16*)psxRegs.CP2D.r)[18*2]
-#define gteSZ2 ((u16*)psxRegs.CP2D.r)[19*2]
-#define gteRGB0 psxRegs.CP2D.r[20]
-#define gteRGB1 psxRegs.CP2D.r[21]
-#define gteRGB2 psxRegs.CP2D.r[22]
-#define gteMAC0 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 gteR ((u8 *)psxRegs.CP2D.r)[6*4]
-#define gteG ((u8 *)psxRegs.CP2D.r)[6*4+1]
-#define gteB ((u8 *)psxRegs.CP2D.r)[6*4+2]
-#define gteCODE ((u8 *)psxRegs.CP2D.r)[6*4+3]
-#define gteC gteCODE
-
-#define gteR0 ((u8 *)psxRegs.CP2D.r)[20*4]
-#define gteG0 ((u8 *)psxRegs.CP2D.r)[20*4+1]
-#define gteB0 ((u8 *)psxRegs.CP2D.r)[20*4+2]
-#define gteCODE0 ((u8 *)psxRegs.CP2D.r)[20*4+3]
-#define gteC0 gteCODE0
-
-#define gteR1 ((u8 *)psxRegs.CP2D.r)[21*4]
-#define gteG1 ((u8 *)psxRegs.CP2D.r)[21*4+1]
-#define gteB1 ((u8 *)psxRegs.CP2D.r)[21*4+2]
-#define gteCODE1 ((u8 *)psxRegs.CP2D.r)[21*4+3]
-#define gteC1 gteCODE1
-
-#define gteR2 ((u8 *)psxRegs.CP2D.r)[22*4]
-#define gteG2 ((u8 *)psxRegs.CP2D.r)[22*4+1]
-#define gteB2 ((u8 *)psxRegs.CP2D.r)[22*4+2]
-#define gteCODE2 ((u8 *)psxRegs.CP2D.r)[22*4+3]
-#define gteC2 gteCODE2
-
-
-
-#define gteR11 ((s16*)psxRegs.CP2C.r)[0]
-#define gteR12 ((s16*)psxRegs.CP2C.r)[1]
-#define gteR13 ((s16*)psxRegs.CP2C.r)[2]
-#define gteR21 ((s16*)psxRegs.CP2C.r)[3]
-#define gteR22 ((s16*)psxRegs.CP2C.r)[4]
-#define gteR23 ((s16*)psxRegs.CP2C.r)[5]
-#define gteR31 ((s16*)psxRegs.CP2C.r)[6]
-#define gteR32 ((s16*)psxRegs.CP2C.r)[7]
-#define gteR33 ((s16*)psxRegs.CP2C.r)[8]
-#define gteTRX ((s32*)psxRegs.CP2C.r)[5]
-#define gteTRY ((s32*)psxRegs.CP2C.r)[6]
-#define gteTRZ ((s32*)psxRegs.CP2C.r)[7]
-#define gteL11 ((s16*)psxRegs.CP2C.r)[16]
-#define gteL12 ((s16*)psxRegs.CP2C.r)[17]
-#define gteL13 ((s16*)psxRegs.CP2C.r)[18]
-#define gteL21 ((s16*)psxRegs.CP2C.r)[19]
-#define gteL22 ((s16*)psxRegs.CP2C.r)[20]
-#define gteL23 ((s16*)psxRegs.CP2C.r)[21]
-#define gteL31 ((s16*)psxRegs.CP2C.r)[22]
-#define gteL32 ((s16*)psxRegs.CP2C.r)[23]
-#define gteL33 ((s16*)psxRegs.CP2C.r)[24]
-#define gteRBK ((s32*)psxRegs.CP2C.r)[13]
-#define gteGBK ((s32*)psxRegs.CP2C.r)[14]
-#define gteBBK ((s32*)psxRegs.CP2C.r)[15]
-#define gteLR1 ((s16*)psxRegs.CP2C.r)[32]
-#define gteLR2 ((s16*)psxRegs.CP2C.r)[33]
-#define gteLR3 ((s16*)psxRegs.CP2C.r)[34]
-#define gteLG1 ((s16*)psxRegs.CP2C.r)[35]
-#define gteLG2 ((s16*)psxRegs.CP2C.r)[36]
-#define gteLG3 ((s16*)psxRegs.CP2C.r)[37]
-#define gteLB1 ((s16*)psxRegs.CP2C.r)[38]
-#define gteLB2 ((s16*)psxRegs.CP2C.r)[39]
-#define gteLB3 ((s16*)psxRegs.CP2C.r)[40]
-#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 ((u16*)psxRegs.CP2C.r)[52]
-#define gteDQA ((s16*)psxRegs.CP2C.r)[54]
-#define gteDQB ((s32*)psxRegs.CP2C.r)[28]
-#define gteZSF3 ((s16*)psxRegs.CP2C.r)[58]
-#define gteZSF4 ((s16*)psxRegs.CP2C.r)[60]
-#define gteFLAG psxRegs.CP2C.r[31]
-
-//#define SUM_FLAG if(gteFLAG & 0x7F87E000) gteFLAG |= 0x80000000;
-
-#define SUM_FLAG() { \
- TEST32ItoM((u32)&gteFLAG, 0x7F87E000); \
- j8Ptr[0] = JZ8(0); \
- OR32ItoM((u32)&gteFLAG, 0x80000000); \
- \
- x86SetJ8(j8Ptr[0]); \
-}
-
-#define LIM32X8(reg, gteout, negv, posv, flagb) { \
- CMP32ItoR(reg, negv); \
- j8Ptr[0] = JL8(0); \
- CMP32ItoR(reg, posv); \
- j8Ptr[1] = JG8(0); \
- \
- MOV8RtoM((u32)&gteout, reg); \
- j8Ptr[2] = JMP8(0); \
- \
- x86SetJ8(j8Ptr[0]); \
- MOV8ItoM((u32)&gteout, negv); \
- j8Ptr[3] = JMP8(0); \
- \
- x86SetJ8(j8Ptr[1]); \
- MOV8ItoM((u32)&gteout, posv); \
- \
- x86SetJ8(j8Ptr[3]); \
- OR32ItoM((u32)&gteFLAG, 1<<flagb); \
- \
- x86SetJ8(j8Ptr[2]); \
-}
-
-#define _LIM_B1(reg, gteout) LIM32X8(reg, gteout, 0, 255, 21);
-#define _LIM_B2(reg, gteout) LIM32X8(reg, gteout, 0, 255, 20);
-#define _LIM_B3(reg, gteout) LIM32X8(reg, gteout, 0, 255, 19);
-
-#define MAC2IRn(reg, ir, flagb, negv, posv) { \
-/* CMP32ItoR(reg, negv);*/ \
-/* j8Ptr[0] = JL8(0); */\
-/* CMP32ItoR(reg, posv);*/ \
-/* j8Ptr[1] = JG8(0);*/ \
- \
- MOV32RtoM((u32)&ir, reg); \
-/* j8Ptr[2] = JMP8(0);*/ \
- \
-/* x86SetJ8(j8Ptr[0]);*/ \
-/* MOV32ItoM((u32)&ir, negv);*/ \
-/* j8Ptr[3] = JMP8(0);*/ \
- \
-/* x86SetJ8(j8Ptr[1]);*/ \
-/* MOV32ItoM((u32)&ir, posv);*/ \
- \
-/* x86SetJ8(j8Ptr[3]);*/ \
-/* OR32ItoR((u32)&gteFLAG, 1<<flagb);*/ \
- \
-/* x86SetJ8(j8Ptr[2]);*/ \
-}
-
-
-
-#define gte_C11 gteLR1
-#define gte_C12 gteLR2
-#define gte_C13 gteLR3
-#define gte_C21 gteLG1
-#define gte_C22 gteLG2
-#define gte_C23 gteLG3
-#define gte_C31 gteLB1
-#define gte_C32 gteLB2
-#define gte_C33 gteLB3
-
-
-#define _MVMVA_FUNC(vn, mx) { \
- MOVSX32M16toR(EAX, (u32)&mx##vn##1); \
- IMUL32R(EBX); \
-/* j8Ptr[0] = JO8(0);*/ \
- MOV32RtoR(ECX, EAX); \
- \
- MOVSX32M16toR(EAX, (u32)&mx##vn##2); \
- IMUL32R(EDI); \
-/* j8Ptr[1] = JO8(0);*/ \
- ADD32RtoR(ECX, EAX); \
-/* j8Ptr[2] = JO8(0);*/ \
- \
- MOVSX32M16toR(EAX, (u32)&mx##vn##3); \
- IMUL32R(ESI); \
-/* j8Ptr[3] = JO8(0);*/ \
- ADD32RtoR(ECX, EAX); \
-/* j8Ptr[4] = JO8(0);*/ \
-}
-
-/* SSX = (_v0) * mx##11 + (_v1) * mx##12 + (_v2) * mx##13;
- SSY = (_v0) * mx##21 + (_v1) * mx##22 + (_v2) * mx##23;
- SSZ = (_v0) * mx##31 + (_v1) * mx##32 + (_v2) * mx##33; */
-
-#define _MVMVA_ADD(_vx, jn) { \
- ADD32MtoR(ECX, (u32)&_vx); \
-/* j8Ptr[jn] = JO8(0);*/ \
-}
-/* SSX+= gteRFC;
- SSY+= gteGFC;
- SSZ+= gteBFC;*/
-
-#define _MVMVA1(vn) { \
- switch (psxRegs.code & 0x60000) { \
- case 0x00000: /* R */ \
- _MVMVA_FUNC(vn, gteR); break; \
- case 0x20000: /* L */ \
- _MVMVA_FUNC(vn, gteL); break; \
- case 0x40000: /* C */ \
- _MVMVA_FUNC(vn, gte_C); break; \
- default: \
- return; \
- } \
-}
-
-#define _MVMVA_LOAD(_v0, _v1, _v2) { \
- MOVSX32M16toR(EBX, (u32)&_v0); \
- MOVSX32M16toR(EDI, (u32)&_v1); \
- MOVSX32M16toR(ESI, (u32)&_v2); \
-}
-
-static void recMVMVA() {
- int i;
-
-// SysPrintf("GTE_MVMVA %lx\n", psxRegs.code & 0x1ffffff);
-
-/* PUSH32R(ESI);
- PUSH32R(EDI);
- PUSH32R(EBX);
-*/
- XOR32RtoR(EAX, EAX); /* gteFLAG = 0 */
- MOV32RtoM((u32)&gteFLAG, EAX);
-
- switch (psxRegs.code & 0x18000) {
- case 0x00000: /* V0 */
- _MVMVA_LOAD(gteVX0, gteVY0, gteVZ0); break;
- case 0x08000: /* V1 */
- _MVMVA_LOAD(gteVX1, gteVY1, gteVZ1); break;
- case 0x10000: /* V2 */
- _MVMVA_LOAD(gteVX2, gteVY2, gteVZ2); break;
- case 0x18000: /* IR */
- _MVMVA_LOAD(gteIR1, gteIR2, gteIR3); break;
- }
-
-// MAC1
- for (i=5; i<8; i++) j8Ptr[i] = 0;
- _MVMVA1(1);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(ECX, 12);
-// SSX /= 4096.0; SSY /= 4096.0; SSZ /= 4096.0;
- }
-
- switch (psxRegs.code & 0x6000) {
- case 0x0000: // Add TR
- _MVMVA_ADD(gteTRX, 5); break;
- case 0x2000: // Add BK
- _MVMVA_ADD(gteRBK, 6); break;
- case 0x4000: // Add FC
- _MVMVA_ADD(gteRFC, 7); break;
- }
-/*
- j8Ptr[9] = JMP8(0);
- for (i=0; i<5; i++) x86SetJ8(j8Ptr[i]);
- for (i=5; i<8; i++) if (j8Ptr[i]) x86SetJ8(j8Ptr[i]);
-
-// TEST32ItoR(EDX, 0x80000000);
- OR32ItoM((u32)&gteFLAG, 1<<29);
- x86SetJ8(j8Ptr[9]);*/
- MOV32RtoM((u32)&gteMAC1, ECX);
-
- if (psxRegs.code & 0x400) {
- MAC2IRn(ECX, gteIR1, 24, 0, 32767);
- } else {
- MAC2IRn(ECX, gteIR1, 24, -32768, 32767);
- }
-
-// MAC2
- _MVMVA1(2);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(ECX, 12);
-// SSX /= 4096.0; SSY /= 4096.0; SSZ /= 4096.0;
- }
-
- switch (psxRegs.code & 0x6000) {
- case 0x0000: // Add TR
- _MVMVA_ADD(gteTRY, 5); break;
- case 0x2000: // Add BK
- _MVMVA_ADD(gteGBK, 6); break;
- case 0x4000: // Add FC
- _MVMVA_ADD(gteGFC, 7); break;
- }
-
-/* for (i=0; i<5; i++) x86SetJ8(j8Ptr[i]);
- for (i=5; i<8; i++) if (j8Ptr[i]) x86SetJ8(j8Ptr[i]);*/
- MOV32RtoM((u32)&gteMAC2, ECX);
-
- if (psxRegs.code & 0x400) {
- MAC2IRn(ECX, gteIR2, 23, 0, 32767);
- } else {
- MAC2IRn(ECX, gteIR2, 23, -32768, 32767);
- }
-
-// MAC3
- _MVMVA1(3);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(ECX, 12);
-// SSX /= 4096.0; SSY /= 4096.0; SSZ /= 4096.0;
- }
-
- switch (psxRegs.code & 0x6000) {
- case 0x0000: // Add TR
- _MVMVA_ADD(gteTRZ, 5); break;
- case 0x2000: // Add BK
- _MVMVA_ADD(gteBBK, 6); break;
- case 0x4000: // Add FC
- _MVMVA_ADD(gteBFC, 7); break;
- }
-
-/* for (i=0; i<5; i++) x86SetJ8(j8Ptr[i]);
- for (i=5; i<8; i++) if (j8Ptr[i]) x86SetJ8(j8Ptr[i]);*/
- MOV32RtoM((u32)&gteMAC3, ECX);
-
- if (psxRegs.code & 0x400) {
- MAC2IRn(ECX, gteIR3, 22, 0, 32767);
- } else {
- MAC2IRn(ECX, gteIR3, 22, -32768, 32767);
- }
-/* MAC2IR1()
- else MAC2IR()*/
-
-// SUM_FLAG();
-
-/* POP32R(EBX);
- POP32R(EDI);
- POP32R(ESI);*/
-}
-
-#if 0
-
-#define _GPF1(vn) { \
- MOV32MtoR(EAX, (u32)&gteIR##vn); \
- IMUL32R(ECX); \
-/* MOV32RtoR(ECX, EAX); */\
-}
-
-static void recGPF() {
-// SysPrintf("GTE_GPF %lx\n", psxRegs.code & 0x1ffffff);
-
- PUSH32R(EBX);
-
- XOR32RtoR(EBX, EBX); /* gteFLAG = 0 */
-
-/* gteMAC1 = NC_OVERFLOW1(gteIR0 * gteIR1);
- gteMAC2 = NC_OVERFLOW2(gteIR0 * gteIR2);
- gteMAC3 = NC_OVERFLOW3(gteIR0 * gteIR3);*/
- MOV32MtoR(ECX, (u32)&gteIR0);
-// MAC1
- _GPF1(1);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(EAX, 12);
- }
- MAC2IRn(EAX, gteIR1, 24, -32768, 32767);
- PUSH32R(EAX);
-
-// MAC2
- _GPF1(2);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(EAX, 12);
- }
- MAC2IRn(EAX, gteIR2, 23, -32768, 32767);
- PUSH32R(EAX);
-
-// MAC3
- _GPF1(3);
-
- if (psxRegs.code & 0x80000) {
- SAR32ItoR(EAX, 12);
- }
- MAC2IRn(EAX, gteIR3, 22, -32768, 32767);
-// MAC2IR();
-
-// gteRGB0 = gteRGB1;
-// gteRGB1 = gteRGB2;
- MOV32MtoR(EDX, (u32)&gteRGB1);
- MOV32MtoR(ECX, (u32)&gteRGB2);
- MOV32RtoM((u32)&gteRGB0, EDX);
- MOV32RtoM((u32)&gteRGB1, ECX);
-
- POP32R(EDX);
- POP32R(ECX);
- SAR32ItoR(ECX, 4);
- SAR32ItoR(EDX, 4);
- SAR32ItoR(EAX, 4);
-
- _LIM_B1(ECX, gteR2);
- _LIM_B2(EDX, gteG2);
- _LIM_B3(EAX, gteB2);
- MOV8MtoR(EAX, (u32)&gteCODE);
- MOV8RtoM((u32)&gteCODE2, EAX);
-
-/* gteR2 = limB1(gteMAC1 / 16.0f);
- gteG2 = limB2(gteMAC2 / 16.0f);
- gteB2 = limB3(gteMAC3 / 16.0f); gteCODE2 = gteCODE;*/
-
- SUM_FLAG();
- MOV32RtoM((u32)&gteFLAG, EBX);
-
-// POP32R(EBX);
-}
-#endif
-#endif
diff --git a/libpcsxcore/r3000a.h b/libpcsxcore/r3000a.h
index fa1be142..4d62fd40 100644
--- a/libpcsxcore/r3000a.h
+++ b/libpcsxcore/r3000a.h
@@ -43,6 +43,20 @@ extern R3000Acpu psxRec;
#endif
typedef union {
+#if defined(__BIGENDIAN__)
+ struct { u8 h3, h2, h, l; } b;
+ struct { s8 h3, h2, h, l; } sb;
+ struct { u16 h, l; } w;
+ struct { s16 h, l; } sw;
+#else
+ struct { u8 l, h, h2, h3; } b;
+ struct { u16 l, h; } w;
+ struct { s8 l, h, h2, h3; } sb;
+ struct { s16 l, h; } sw;
+#endif
+} PAIR;
+
+typedef union {
struct {
u32 r0, at, v0, v1, a0, a1, a2, a3,
t0, t1, t2, t3, t4, t5, t6, t7,
@@ -50,6 +64,7 @@ typedef union {
t8, t9, k0, k1, gp, sp, s8, ra, lo, hi;
} n;
u32 r[34]; /* Lo, Hi in r[32] and r[33] */
+ PAIR p[34];
} psxGPRRegs;
typedef union {
@@ -64,6 +79,7 @@ typedef union {
TagLo, TagHi, ErrorEPC, Reserved6;
} n;
u32 r[32];
+ PAIR p[32];
} psxCP0Regs;
typedef struct {
@@ -105,6 +121,7 @@ typedef union {
s32 lzcs, lzcr;
} n;
u32 r[32];
+ PAIR p[32];
} psxCP2Data;
typedef union {
@@ -122,6 +139,7 @@ typedef union {
s32 flag;
} n;
u32 r[32];
+ PAIR p[32];
} psxCP2Ctrl;
typedef struct {