summaryrefslogtreecommitdiff
path: root/libpcsxcore/gte.c
diff options
context:
space:
mode:
authorSND\edgbla_cp <SND\edgbla_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2013-10-06 16:51:35 +0000
committerSND\edgbla_cp <SND\edgbla_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2013-10-06 16:51:35 +0000
commit0d1bc99a99024e561d48d9acf73a96503e3c91c5 (patch)
tree8bef6d1a72904a422fb5f589c78bca76099f1ed5 /libpcsxcore/gte.c
parent609b09af544e8adf4f1a841f77cfe3c1203173f4 (diff)
downloadpcsxr-0d1bc99a99024e561d48d9acf73a96503e3c91c5.tar.gz
* GTE;
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@87357 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore/gte.c')
-rwxr-xr-xlibpcsxcore/gte.c1626
1 files changed, 858 insertions, 768 deletions
diff --git a/libpcsxcore/gte.c b/libpcsxcore/gte.c
index 620df8ab..599672c9 100755
--- a/libpcsxcore/gte.c
+++ b/libpcsxcore/gte.c
@@ -1,235 +1,175 @@
-/***************************************************************************
- * PCSX-Revolution - PlayStation Emulator for Nintendo Wii *
- * Copyright (C) 2009-2010 PCSX-Revolution Dev Team *
- * <http://code.google.com/p/pcsx-revolution/> *
- * *
- * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA. *
- ***************************************************************************/
-
/*
-* GTE functions.
-*/
+ * PlayStation Geometry Transformation Engine emulator
+ *
+ * Copyright 2003-2013 smf
+ *
+ */
#include "gte.h"
#include "psxmem.h"
-#define VX(n) (n < 3 ? psxRegs.CP2D.p[n << 1].sw.l : psxRegs.CP2D.p[9].sw.l)
-#define VY(n) (n < 3 ? psxRegs.CP2D.p[n << 1].sw.h : psxRegs.CP2D.p[10].sw.l)
-#define VZ(n) (n < 3 ? psxRegs.CP2D.p[(n << 1) + 1].sw.l : psxRegs.CP2D.p[11].sw.l)
-#define MX11(n) (n < 3 ? psxRegs.CP2C.p[(n << 3)].sw.l : 0)
-#define MX12(n) (n < 3 ? psxRegs.CP2C.p[(n << 3)].sw.h : 0)
-#define MX13(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 1].sw.l : 0)
-#define MX21(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 1].sw.h : 0)
-#define MX22(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 2].sw.l : 0)
-#define MX23(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 2].sw.h : 0)
-#define MX31(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 3].sw.l : 0)
-#define MX32(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 3].sw.h : 0)
-#define MX33(n) (n < 3 ? psxRegs.CP2C.p[(n << 3) + 4].sw.l : 0)
-#define CV1(n) (n < 3 ? (s32)psxRegs.CP2C.r[(n << 3) + 5] : 0)
-#define CV2(n) (n < 3 ? (s32)psxRegs.CP2C.r[(n << 3) + 6] : 0)
-#define CV3(n) (n < 3 ? (s32)psxRegs.CP2C.r[(n << 3) + 7] : 0)
-
-#define fSX(n) ((psxRegs.CP2D.p)[((n) + 12)].sw.l)
-#define fSY(n) ((psxRegs.CP2D.p)[((n) + 12)].sw.h)
-#define fSZ(n) ((psxRegs.CP2D.p)[((n) + 17)].w.l) /* (n == 0) => SZ1; */
-
-#define gteVXY0 (psxRegs.CP2D.r[0])
-#define gteVX0 (psxRegs.CP2D.p[0].sw.l)
-#define gteVY0 (psxRegs.CP2D.p[0].sw.h)
-#define gteVZ0 (psxRegs.CP2D.p[1].sw.l)
-#define gteVXY1 (psxRegs.CP2D.r[2])
-#define gteVX1 (psxRegs.CP2D.p[2].sw.l)
-#define gteVY1 (psxRegs.CP2D.p[2].sw.h)
-#define gteVZ1 (psxRegs.CP2D.p[3].sw.l)
-#define gteVXY2 (psxRegs.CP2D.r[4])
-#define gteVX2 (psxRegs.CP2D.p[4].sw.l)
-#define gteVY2 (psxRegs.CP2D.p[4].sw.h)
-#define gteVZ2 (psxRegs.CP2D.p[5].sw.l)
-#define gteRGB (psxRegs.CP2D.r[6])
-#define gteR (psxRegs.CP2D.p[6].b.l)
-#define gteG (psxRegs.CP2D.p[6].b.h)
-#define gteB (psxRegs.CP2D.p[6].b.h2)
-#define gteCODE (psxRegs.CP2D.p[6].b.h3)
-#define gteOTZ (psxRegs.CP2D.p[7].w.l)
-#define gteIR0 (psxRegs.CP2D.p[8].sw.l)
-#define gteIR1 (psxRegs.CP2D.p[9].sw.l)
-#define gteIR2 (psxRegs.CP2D.p[10].sw.l)
-#define gteIR3 (psxRegs.CP2D.p[11].sw.l)
-#define gteSXY0 (psxRegs.CP2D.r[12])
-#define gteSX0 (psxRegs.CP2D.p[12].sw.l)
-#define gteSY0 (psxRegs.CP2D.p[12].sw.h)
-#define gteSXY1 (psxRegs.CP2D.r[13])
-#define gteSX1 (psxRegs.CP2D.p[13].sw.l)
-#define gteSY1 (psxRegs.CP2D.p[13].sw.h)
-#define gteSXY2 (psxRegs.CP2D.r[14])
-#define gteSX2 (psxRegs.CP2D.p[14].sw.l)
-#define gteSY2 (psxRegs.CP2D.p[14].sw.h)
-#define gteSXYP (psxRegs.CP2D.r[15])
-#define gteSXP (psxRegs.CP2D.p[15].sw.l)
-#define gteSYP (psxRegs.CP2D.p[15].sw.h)
-#define gteSZ0 (psxRegs.CP2D.p[16].w.l)
-#define gteSZ1 (psxRegs.CP2D.p[17].w.l)
-#define gteSZ2 (psxRegs.CP2D.p[18].w.l)
-#define gteSZ3 (psxRegs.CP2D.p[19].w.l)
-#define gteRGB0 (psxRegs.CP2D.r[20])
-#define gteR0 (psxRegs.CP2D.p[20].b.l)
-#define gteG0 (psxRegs.CP2D.p[20].b.h)
-#define gteB0 (psxRegs.CP2D.p[20].b.h2)
-#define gteCODE0 (psxRegs.CP2D.p[20].b.h3)
-#define gteRGB1 (psxRegs.CP2D.r[21])
-#define gteR1 (psxRegs.CP2D.p[21].b.l)
-#define gteG1 (psxRegs.CP2D.p[21].b.h)
-#define gteB1 (psxRegs.CP2D.p[21].b.h2)
-#define gteCODE1 (psxRegs.CP2D.p[21].b.h3)
-#define gteRGB2 (psxRegs.CP2D.r[22])
-#define gteR2 (psxRegs.CP2D.p[22].b.l)
-#define gteG2 (psxRegs.CP2D.p[22].b.h)
-#define gteB2 (psxRegs.CP2D.p[22].b.h2)
-#define gteCODE2 (psxRegs.CP2D.p[22].b.h3)
-#define gteRES1 (psxRegs.CP2D.r[23])
-#define gteMAC0 (((s32 *)psxRegs.CP2D.r)[24])
-#define gteMAC1 (((s32 *)psxRegs.CP2D.r)[25])
-#define gteMAC2 (((s32 *)psxRegs.CP2D.r)[26])
-#define gteMAC3 (((s32 *)psxRegs.CP2D.r)[27])
-#define gteIRGB (psxRegs.CP2D.r[28])
-#define gteORGB (psxRegs.CP2D.r[29])
-#define gteLZCS (psxRegs.CP2D.r[30])
-#define gteLZCR (psxRegs.CP2D.r[31])
-
-#define gteR11R12 (((s32 *)psxRegs.CP2C.r)[0])
-#define gteR22R23 (((s32 *)psxRegs.CP2C.r)[2])
-#define gteR11 (psxRegs.CP2C.p[0].sw.l)
-#define gteR12 (psxRegs.CP2C.p[0].sw.h)
-#define gteR13 (psxRegs.CP2C.p[1].sw.l)
-#define gteR21 (psxRegs.CP2C.p[1].sw.h)
-#define gteR22 (psxRegs.CP2C.p[2].sw.l)
-#define gteR23 (psxRegs.CP2C.p[2].sw.h)
-#define gteR31 (psxRegs.CP2C.p[3].sw.l)
-#define gteR32 (psxRegs.CP2C.p[3].sw.h)
-#define gteR33 (psxRegs.CP2C.p[4].sw.l)
-#define gteTRX (((s32 *)psxRegs.CP2C.r)[5])
-#define gteTRY (((s32 *)psxRegs.CP2C.r)[6])
-#define gteTRZ (((s32 *)psxRegs.CP2C.r)[7])
-#define gteL11 (psxRegs.CP2C.p[8].sw.l)
-#define gteL12 (psxRegs.CP2C.p[8].sw.h)
-#define gteL13 (psxRegs.CP2C.p[9].sw.l)
-#define gteL21 (psxRegs.CP2C.p[9].sw.h)
-#define gteL22 (psxRegs.CP2C.p[10].sw.l)
-#define gteL23 (psxRegs.CP2C.p[10].sw.h)
-#define gteL31 (psxRegs.CP2C.p[11].sw.l)
-#define gteL32 (psxRegs.CP2C.p[11].sw.h)
-#define gteL33 (psxRegs.CP2C.p[12].sw.l)
-#define gteRBK (((s32 *)psxRegs.CP2C.r)[13])
-#define gteGBK (((s32 *)psxRegs.CP2C.r)[14])
-#define gteBBK (((s32 *)psxRegs.CP2C.r)[15])
-#define gteLR1 (psxRegs.CP2C.p[16].sw.l)
-#define gteLR2 (psxRegs.CP2C.p[16].sw.h)
-#define gteLR3 (psxRegs.CP2C.p[17].sw.l)
-#define gteLG1 (psxRegs.CP2C.p[17].sw.h)
-#define gteLG2 (psxRegs.CP2C.p[18].sw.l)
-#define gteLG3 (psxRegs.CP2C.p[18].sw.h)
-#define gteLB1 (psxRegs.CP2C.p[19].sw.l)
-#define gteLB2 (psxRegs.CP2C.p[19].sw.h)
-#define gteLB3 (psxRegs.CP2C.p[20].sw.l)
-#define gteRFC (((s32 *)psxRegs.CP2C.r)[21])
-#define gteGFC (((s32 *)psxRegs.CP2C.r)[22])
-#define gteBFC (((s32 *)psxRegs.CP2C.r)[23])
-#define gteOFX (((s32 *)psxRegs.CP2C.r)[24])
-#define gteOFY (((s32 *)psxRegs.CP2C.r)[25])
-#define gteH (psxRegs.CP2C.p[26].sw.l)
-#define gteDQA (psxRegs.CP2C.p[27].sw.l)
-#define gteDQB (((s32 *)psxRegs.CP2C.r)[28])
-#define gteZSF3 (psxRegs.CP2C.p[29].sw.l)
-#define gteZSF4 (psxRegs.CP2C.p[30].sw.l)
-#define gteFLAG (psxRegs.CP2C.r[31])
-
-#define SUM_FLAG { if( gteFLAG & 0x7f87e000 ) gteFLAG |= 0x80000000; }
-
-#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 gteop (psxRegs.code & 0x1ffffff)
-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;
+#define VX0 (psxRegs.CP2D.p[ 0 ].sw.l)
+#define VY0 (psxRegs.CP2D.p[ 0 ].sw.h)
+#define VZ0 (psxRegs.CP2D.p[ 1 ].sw.l)
+#define VX1 (psxRegs.CP2D.p[ 2 ].w.l)
+#define VY1 (psxRegs.CP2D.p[ 2 ].w.h)
+#define VZ1 (psxRegs.CP2D.p[ 3 ].w.l)
+#define VX2 (psxRegs.CP2D.p[ 4 ].w.l)
+#define VY2 (psxRegs.CP2D.p[ 4 ].w.h)
+#define VZ2 (psxRegs.CP2D.p[ 5 ].w.l)
+#define R (psxRegs.CP2D.p[ 6 ].b.l)
+#define G (psxRegs.CP2D.p[ 6 ].b.h)
+#define B (psxRegs.CP2D.p[ 6 ].b.h2)
+#define CODE (psxRegs.CP2D.p[ 6 ].b.h3)
+#define OTZ (psxRegs.CP2D.p[ 7 ].w.l)
+#define IR0 (psxRegs.CP2D.p[ 8 ].sw.l)
+#define IR1 (psxRegs.CP2D.p[ 9 ].sw.l)
+#define IR2 (psxRegs.CP2D.p[ 10 ].sw.l)
+#define IR3 (psxRegs.CP2D.p[ 11 ].sw.l)
+#define SXY0 (psxRegs.CP2D.p[ 12 ].d)
+#define SX0 (psxRegs.CP2D.p[ 12 ].sw.l)
+#define SY0 (psxRegs.CP2D.p[ 12 ].sw.h)
+#define SXY1 (psxRegs.CP2D.p[ 13 ].d)
+#define SX1 (psxRegs.CP2D.p[ 13 ].sw.l)
+#define SY1 (psxRegs.CP2D.p[ 13 ].sw.h)
+#define SXY2 (psxRegs.CP2D.p[ 14 ].d)
+#define SX2 (psxRegs.CP2D.p[ 14 ].sw.l)
+#define SY2 (psxRegs.CP2D.p[ 14 ].sw.h)
+#define SXYP (psxRegs.CP2D.p[ 15 ].d)
+#define SXP (psxRegs.CP2D.p[ 15 ].sw.l)
+#define SYP (psxRegs.CP2D.p[ 15 ].sw.h)
+#define SZ0 (psxRegs.CP2D.p[ 16 ].w.l)
+#define SZ1 (psxRegs.CP2D.p[ 17 ].w.l)
+#define SZ2 (psxRegs.CP2D.p[ 18 ].w.l)
+#define SZ3 (psxRegs.CP2D.p[ 19 ].w.l)
+#define RGB0 (psxRegs.CP2D.p[ 20 ].d)
+#define R0 (psxRegs.CP2D.p[ 20 ].b.l)
+#define G0 (psxRegs.CP2D.p[ 20 ].b.h)
+#define B0 (psxRegs.CP2D.p[ 20 ].b.h2)
+#define CD0 (psxRegs.CP2D.p[ 20 ].b.h3)
+#define RGB1 (psxRegs.CP2D.p[ 21 ].d)
+#define R1 (psxRegs.CP2D.p[ 21 ].b.l)
+#define G1 (psxRegs.CP2D.p[ 21 ].b.h)
+#define B1 (psxRegs.CP2D.p[ 21 ].b.h2)
+#define CD1 (psxRegs.CP2D.p[ 21 ].b.h3)
+#define RGB2 (psxRegs.CP2D.p[ 22 ].d)
+#define R2 (psxRegs.CP2D.p[ 22 ].b.l)
+#define G2 (psxRegs.CP2D.p[ 22 ].b.h)
+#define B2 (psxRegs.CP2D.p[ 22 ].b.h2)
+#define CD2 (psxRegs.CP2D.p[ 22 ].b.h3)
+#define RES1 (psxRegs.CP2D.p[ 23 ].d)
+#define MAC0 (psxRegs.CP2D.p[ 24 ].sd)
+#define MAC1 (psxRegs.CP2D.p[ 25 ].sd)
+#define MAC2 (psxRegs.CP2D.p[ 26 ].sd)
+#define MAC3 (psxRegs.CP2D.p[ 27 ].sd)
+#define IRGB (psxRegs.CP2D.p[ 28 ].d)
+#define ORGB (psxRegs.CP2D.p[ 29 ].d)
+#define LZCS (psxRegs.CP2D.p[ 30 ].d)
+#define LZCR (psxRegs.CP2D.p[ 31 ].d)
+
+#define R11 (psxRegs.CP2C.p[ 0 ].sw.l)
+#define R12 (psxRegs.CP2C.p[ 0 ].sw.h)
+#define R13 (psxRegs.CP2C.p[ 1 ].sw.l)
+#define R21 (psxRegs.CP2C.p[ 1 ].sw.h)
+#define R22 (psxRegs.CP2C.p[ 2 ].sw.l)
+#define R23 (psxRegs.CP2C.p[ 2 ].sw.h)
+#define R31 (psxRegs.CP2C.p[ 3 ].sw.l)
+#define R32 (psxRegs.CP2C.p[ 3 ].sw.h)
+#define R33 (psxRegs.CP2C.p[ 4 ].sw.l)
+#define TRX (psxRegs.CP2C.p[ 5 ].sd)
+#define TRY (psxRegs.CP2C.p[ 6 ].sd)
+#define TRZ (psxRegs.CP2C.p[ 7 ].sd)
+#define L11 (psxRegs.CP2C.p[ 8 ].sw.l)
+#define L12 (psxRegs.CP2C.p[ 8 ].sw.h)
+#define L13 (psxRegs.CP2C.p[ 9 ].sw.l)
+#define L21 (psxRegs.CP2C.p[ 9 ].sw.h)
+#define L22 (psxRegs.CP2C.p[ 10 ].sw.l)
+#define L23 (psxRegs.CP2C.p[ 10 ].sw.h)
+#define L31 (psxRegs.CP2C.p[ 11 ].sw.l)
+#define L32 (psxRegs.CP2C.p[ 11 ].sw.h)
+#define L33 (psxRegs.CP2C.p[ 12 ].sw.l)
+#define RBK (psxRegs.CP2C.p[ 13 ].sd)
+#define GBK (psxRegs.CP2C.p[ 14 ].sd)
+#define BBK (psxRegs.CP2C.p[ 15 ].sd)
+#define LR1 (psxRegs.CP2C.p[ 16 ].sw.l)
+#define LR2 (psxRegs.CP2C.p[ 16 ].sw.h)
+#define LR3 (psxRegs.CP2C.p[ 17 ].sw.l)
+#define LG1 (psxRegs.CP2C.p[ 17 ].sw.h)
+#define LG2 (psxRegs.CP2C.p[ 18 ].sw.l)
+#define LG3 (psxRegs.CP2C.p[ 18 ].sw.h)
+#define LB1 (psxRegs.CP2C.p[ 19 ].sw.l)
+#define LB2 (psxRegs.CP2C.p[ 19 ].sw.h)
+#define LB3 (psxRegs.CP2C.p[ 20 ].sw.l)
+#define RFC (psxRegs.CP2C.p[ 21 ].sd)
+#define GFC (psxRegs.CP2C.p[ 22 ].sd)
+#define BFC (psxRegs.CP2C.p[ 23 ].sd)
+#define OFX (psxRegs.CP2C.p[ 24 ].sd)
+#define OFY (psxRegs.CP2C.p[ 25 ].sd)
+#define H (psxRegs.CP2C.p[ 26 ].sw.l)
+#define DQA (psxRegs.CP2C.p[ 27 ].sw.l)
+#define DQB (psxRegs.CP2C.p[ 28 ].sd)
+#define ZSF3 (psxRegs.CP2C.p[ 29 ].sw.l)
+#define ZSF4 (psxRegs.CP2C.p[ 30 ].sw.l)
+#define FLAG (psxRegs.CP2C.p[ 31 ].d)
+
+#define VX(n) (n < 3 ? psxRegs.CP2D.p[ n << 1 ].sw.l : IR1)
+#define VY(n) (n < 3 ? psxRegs.CP2D.p[ n << 1 ].sw.h : IR2)
+#define VZ(n) (n < 3 ? psxRegs.CP2D.p[ (n << 1) + 1 ].sw.l : IR3)
+#define MX11(n) (n < 3 ? psxRegs.CP2C.p[ (n << 3) ].sw.l : -R << 4)
+#define MX12(n) (n < 3 ? psxRegs.CP2C.p[ (n << 3) ].sw.h : R << 4)
+#define MX13(n) (n < 3 ? psxRegs.CP2C.p[ (n << 3) + 1 ].sw.l : IR0)
+#define MX21(n) (n < 3 ? psxRegs.CP2C.p[ (n << 3) + 1 ].sw.h : R13)
+#define MX22(n) (n < 3 ? psxRegs.CP2C.p[ (n << 3) + 2 ].sw.l : R13)
+#define MX23(n) (n < 3 ? psxRegs.CP2C.p[ (n << 3) + 2 ].sw.h : R13)
+#define MX31(n) (n < 3 ? psxRegs.CP2C.p[ (n << 3) + 3 ].sw.l : R22)
+#define MX32(n) (n < 3 ? psxRegs.CP2C.p[ (n << 3) + 3 ].sw.h : R22)
+#define MX33(n) (n < 3 ? psxRegs.CP2C.p[ (n << 3) + 4 ].sw.l : R22)
+#define CV1(n) (n < 3 ? psxRegs.CP2C.p[ (n << 3) + 5 ].sd : 0)
+#define CV2(n) (n < 3 ? psxRegs.CP2C.p[ (n << 3) + 6 ].sd : 0)
+#define CV3(n) (n < 3 ? psxRegs.CP2C.p[ (n << 3) + 7 ].sd : 0)
+
+static int m_sf;
+static s64 m_mac0;
+static s64 m_mac3;
+
+static u32 gte_leadingzerocount(u32 lzcs) {
+ u32 lzcr = 0;
+
+ if((lzcs & 0x80000000) == 0)
+ lzcs = ~lzcs;
+
+ while((lzcs & 0x80000000) != 0) {
+ lzcr++;
+ lzcs <<= 1;
}
- return n_value;
-}
-static inline s64 LIM(s64 value, s64 max, s64 min, u32 flag) {
- s64 ret = value;
- if (value > max) {
- gteFLAG |= flag;
- ret = max;
- } else if (value < min) {
- gteFLAG |= flag;
- ret = min;
- }
- return ret;
-}
-
-#define A1(a) BOUNDS((a), 0x7fffffff, (1 << 30), -(s64)0x80000000, (1 << 27))
-#define A2(a) BOUNDS((a), 0x7fffffff, (1 << 29), -(s64)0x80000000, (1 << 26))
-#define A3(a) BOUNDS((a), 0x7fffffff, (1 << 28), -(s64)0x80000000, (1 << 25))
-#define limB1(a, l) LIM((a), 0x7fff, -0x8000 * !l, (1 << 24))
-#define limB2(a, l) LIM((a), 0x7fff, -0x8000 * !l, (1 << 23))
-#define limB3(a, l) LIM((a), 0x7fff, -0x8000 * !l, (1 << 22))
-#define limC1(a) LIM((a), 0x00ff, 0x0000, (1 << 21))
-#define limC2(a) LIM((a), 0x00ff, 0x0000, (1 << 20))
-#define limC3(a) LIM((a), 0x00ff, 0x0000, (1 << 19))
-#define limD(a) LIM((a), 0xffff, 0x0000, (1 << 18))
-
-static inline u32 limE(u32 result) {
- if (result > 0x1ffff) {
- gteFLAG |= (1 << 17);
- return 0x1ffff;
- }
- return result;
+ return lzcr;
}
-static inline float flimE(float result) {
- if (result > 0x1ffff) {
- gteFLAG |= (1 << 17);
- return 0x1ffff;
+s32 LIM(s32 value, s32 max, s32 min, u32 flag) {
+ if(value > max) {
+ FLAG |= flag;
+ return max;
}
- return result;
+ else if(value < min) {
+ FLAG |= flag;
+ return min;
+ }
+
+ return value;
}
-#define F(a) BOUNDS((a), 0x7fffffff, (1 << 16), -(s64)0x80000000, (1 << 15))
-#define limG1(a) LIM((a), 0x3ff, -0x400,(1 << 14))
-#define limG2(a) LIM((a), 0x3ff, -0x400, (1 << 13))
-#define limH(a) LIM((a), 0x1000, 0x0000, (1 << 12))
-
-#define limG1_ia(a) LIM((a), 0x3ffffff, -0x4000000, (1 << 14))
-#define limG2_ia(a) LIM((a), 0x3ffffff, -0x4000000, (1 << 13))
-
-#include "gte_divider.h"
-
-static inline u32 MFC2(int reg) {
- switch (reg) {
+static u32 MFC2(int reg) {
+ switch(reg) {
case 1:
case 3:
case 5:
@@ -237,7 +177,7 @@ static inline u32 MFC2(int reg) {
case 9:
case 10:
case 11:
- psxRegs.CP2D.r[reg] = (s32)psxRegs.CP2D.p[reg].sw.l;
+ psxRegs.CP2D.p[reg].d = (s32)psxRegs.CP2D.p[reg].sw.l;
break;
case 7:
@@ -245,96 +185,49 @@ static inline u32 MFC2(int reg) {
case 17:
case 18:
case 19:
- psxRegs.CP2D.r[reg] = (u32)psxRegs.CP2D.p[reg].w.l;
+ psxRegs.CP2D.p[reg].d = (u32)psxRegs.CP2D.p[reg].w.l;
break;
case 15:
- psxRegs.CP2D.r[reg] = gteSXY2;
+ psxRegs.CP2D.p[reg].d = SXY2;
break;
case 28:
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);
+ psxRegs.CP2D.p[reg].d = LIM(IR1 >> 7, 0x1f, 0, 0) | (LIM(IR2 >> 7, 0x1f, 0, 0) << 5) | (LIM(IR3 >> 7, 0x1f, 0, 0) << 10);
break;
}
- return psxRegs.CP2D.r[reg];
+
+ return psxRegs.CP2D.p[reg].d;
}
-static inline void MTC2(u32 value, int reg) {
- switch (reg) {
+static void MTC2(u32 value, int reg) {
+ switch(reg) {
case 15:
- gteSXY0 = gteSXY1;
- gteSXY1 = gteSXY2;
- gteSXY2 = value;
- gteSXYP = value;
+ SXY0 = SXY1;
+ SXY1 = SXY2;
+ SXY2 = value;
break;
case 28:
- gteIRGB = value;
- gteIR1 = (value & 0x1f) << 7;
- gteIR2 = (value & 0x3e0) << 2;
- gteIR3 = (value & 0x7c00) >> 3;
+ IR1 = (value & 0x1f) << 7;
+ IR2 = (value & 0x3e0) << 2;
+ IR3 = (value & 0x7c00) >> 3;
break;
case 30:
- {
-#if 1
- int a;
- gteLZCS = value;
-
- // non-MAME code
- 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;
- }
-#else
- // MAME
- u32 lzcs = value;
- u32 lzcr = 0;
-
- gteLZCS = value;
-
- if( ( lzcs & 0x80000000 ) == 0 )
- {
- lzcs = ~lzcs;
- }
- while( ( lzcs & 0x80000000 ) != 0 )
- {
- lzcr++;
- lzcs <<= 1;
- }
- gteLZCR = lzcr;
-#endif
- }
+ LZCR = gte_leadingzerocount(value);
break;
-#if 1
case 31:
return;
-#else
- case 31:
- value = psxRegs.CP2D.r[reg];
- break;
-#endif
-
- default:
- psxRegs.CP2D.r[reg] = value;
}
+
+ psxRegs.CP2D.p[reg].d = value;
}
-static inline void CTC2(u32 value, int reg) {
- switch (reg) {
+static void CTC2(u32 value, int reg) {
+ switch(reg) {
case 4:
case 12:
case 20:
@@ -347,10 +240,12 @@ static inline void CTC2(u32 value, int reg) {
case 31:
value = value & 0x7ffff000;
+ if((value & 0x7f87e000) != 0)
+ value |= 0x80000000;
break;
}
- psxRegs.CP2C.r[reg] = value;
+ psxRegs.CP2C.p[reg].d = value;
}
void gteMFC2() {
@@ -360,8 +255,7 @@ void gteMFC2() {
void gteCFC2() {
if (!_Rt_) return;
- if (_Rd_ == 31) SUM_FLAG;
- psxRegs.GPR.r[_Rt_] = psxRegs.CP2C.r[_Rd_];
+ psxRegs.GPR.r[_Rt_] = psxRegs.CP2C.p[_Rd_].d;
}
void gteMTC2() {
@@ -382,582 +276,778 @@ void gteSWC2() {
psxMemWrite32(_oB_, MFC2(_Rt_));
}
-void gteRTPS() {
- int quotient;
- float fquotient;
+inline s64 gte_shift(s64 a, int sf) {
+ if(sf > 0)
+ return a >> 12;
+ else if(sf < 0)
+ return a << 12;
-#ifdef GTE_LOG
- GTE_LOG("GTE RTPS\n");
-#endif
- gteFLAG = 0;
-
- 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 = limB1(gteMAC1, 0);
- gteIR2 = limB2(gteMAC2, 0);
- gteIR3 = limB3(gteMAC3, 0);
- gteSZ0 = gteSZ1;
- gteSZ1 = gteSZ2;
- gteSZ2 = gteSZ3;
- gteSZ3 = limD(gteMAC3);
- quotient = limE(DIVIDE(gteH, gteSZ3));
- gteSXY0 = gteSXY1;
- gteSXY1 = gteSXY2;
- gteSX2 = limG1(F((s64)gteOFX + ((s64)gteIR1 * quotient) * (Config.Widescreen ? 0.75 : 1)) >> 16);
- gteSY2 = limG2(F((s64)gteOFY + ((s64)gteIR2 * quotient)) >> 16);
-
- fquotient = flimE((float)(gteH << 16) / (float)gteSZ3);
- GPU_addVertex(gteSX2,
- gteSY2,
- limG1_ia((s64)gteOFX + (s64)(gteIR1 * fquotient) * (Config.Widescreen ? 0.75 : 1)), // TODO: MAC1 calc instead of IR1.
- limG2_ia((s64)gteOFY + (s64)(gteIR2 * fquotient)), // TODO: MAC2 calc instead of IR2.
- ((s64)gteSZ3)); // TODO: MAC3 calc instead of SZ3.
+ return a;
+}
+
+s32 BOUNDS(/*int44*/s64 value, int max_flag, int min_flag) {
+ if(value/*.positive_overflow()*/ > S64(0x7ffffffffff))
+ FLAG |= max_flag;
+
+ if(value/*.negative_overflow()*/ < S64(-0x80000000000))
+ FLAG |= min_flag;
- gteMAC0 = F((s64)(gteDQB + ((s64)gteDQA * quotient)) >> 12);
- gteIR0 = limH(gteMAC0);
+ return gte_shift(value/*.value()*/, m_sf);
}
-void gteRTPT() {
- int quotient;
- float fquotient;
- int v;
- s32 vx, vy, vz;
+u32 gte_divide( u16 numerator, u16 denominator )
+{
+ if( numerator < ( denominator * 2 ) )
+ {
+ static u8 table[] =
+ {
+ 0xff, 0xfd, 0xfb, 0xf9, 0xf7, 0xf5, 0xf3, 0xf1, 0xef, 0xee, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe3,
+ 0xe1, 0xdf, 0xdd, 0xdc, 0xda, 0xd8, 0xd6, 0xd5, 0xd3, 0xd1, 0xd0, 0xce, 0xcd, 0xcb, 0xc9, 0xc8,
+ 0xc6, 0xc5, 0xc3, 0xc1, 0xc0, 0xbe, 0xbd, 0xbb, 0xba, 0xb8, 0xb7, 0xb5, 0xb4, 0xb2, 0xb1, 0xb0,
+ 0xae, 0xad, 0xab, 0xaa, 0xa9, 0xa7, 0xa6, 0xa4, 0xa3, 0xa2, 0xa0, 0x9f, 0x9e, 0x9c, 0x9b, 0x9a,
+ 0x99, 0x97, 0x96, 0x95, 0x94, 0x92, 0x91, 0x90, 0x8f, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x87, 0x86,
+ 0x85, 0x84, 0x83, 0x82, 0x81, 0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78, 0x77, 0x75, 0x74,
+ 0x73, 0x72, 0x71, 0x70, 0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68, 0x67, 0x66, 0x65, 0x64,
+ 0x63, 0x62, 0x61, 0x60, 0x5f, 0x5e, 0x5d, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x58, 0x57, 0x56, 0x55,
+ 0x54, 0x53, 0x53, 0x52, 0x51, 0x50, 0x4f, 0x4e, 0x4d, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x48,
+ 0x47, 0x46, 0x45, 0x44, 0x43, 0x43, 0x42, 0x41, 0x40, 0x3f, 0x3f, 0x3e, 0x3d, 0x3c, 0x3c, 0x3b,
+ 0x3a, 0x39, 0x39, 0x38, 0x37, 0x36, 0x36, 0x35, 0x34, 0x33, 0x33, 0x32, 0x31, 0x31, 0x30, 0x2f,
+ 0x2e, 0x2e, 0x2d, 0x2c, 0x2c, 0x2b, 0x2a, 0x2a, 0x29, 0x28, 0x28, 0x27, 0x26, 0x26, 0x25, 0x24,
+ 0x24, 0x23, 0x22, 0x22, 0x21, 0x20, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1d, 0x1c, 0x1b, 0x1b, 0x1a,
+ 0x19, 0x19, 0x18, 0x18, 0x17, 0x16, 0x16, 0x15, 0x15, 0x14, 0x14, 0x13, 0x12, 0x12, 0x11, 0x11,
+ 0x10, 0x0f, 0x0f, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0b, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08,
+ 0x07, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00,
+ 0x00
+ };
+
+ int shift = gte_leadingzerocount( denominator ) - 16;
+
+ int r1 = ( denominator << shift ) & 0x7fff;
+ int r2 = table[ ( ( r1 + 0x40 ) >> 7 ) ] + 0x101;
+ int r3 = ( ( 0x80 - ( r2 * ( r1 + 0x8000 ) ) ) >> 8 ) & 0x1ffff;
+ u32 reciprocal = ( ( r2 * r3 ) + 0x80 ) >> 8;
+
+ return (u32)( ( ( (u64) reciprocal * ( numerator << shift ) ) + 0x8000 ) >> 16 );
+ }
-#ifdef GTE_LOG
- GTE_LOG("GTE RTPT\n");
-#endif
- gteFLAG = 0;
-
- 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 = limB1(gteMAC1, 0);
- gteIR2 = limB2(gteMAC2, 0);
- gteIR3 = limB3(gteMAC3, 0);
- fSZ(v) = limD(gteMAC3);
- quotient = limE(DIVIDE(gteH, fSZ(v)));
- fSX(v) = limG1(F((s64)gteOFX + ((s64)gteIR1 * quotient) * (Config.Widescreen ? 0.75 : 1)) >> 16);
- fSY(v) = limG2(F((s64)gteOFY + ((s64)gteIR2 * quotient)) >> 16);
-
- fquotient = flimE((float)(gteH << 16) / (float)fSZ(v));
- GPU_addVertex(fSX(v),
- fSY(v),
- limG1_ia((s64)gteOFX + (s64)(gteIR1 * fquotient) * (Config.Widescreen ? 0.75 : 1)), // TODO: MAC1 calc instead of IR1.
- limG2_ia((s64)gteOFY + (s64)(gteIR2 * fquotient)), // TODO: MAC2 calc instead of IR2.
- ((s64)fSZ(v))); // TODO: MAC3 calc instead of fSZ(v).
+ return 0xffffffff;
+}
+
+/* Setting bits 12 & 19-22 in FLAG does not set bit 31 */
+
+s32 A1(/*int44*/s64 a) { return BOUNDS(a, (1 << 31) | (1 << 30), (1 << 31) | (1 << 27)); }
+s32 A2(/*int44*/s64 a) { return BOUNDS(a, (1 << 31) | (1 << 29), (1 << 31) | (1 << 26)); }
+s32 A3(/*int44*/s64 a) { m_mac3 = a; return BOUNDS(a, (1 << 31) | (1 << 28), (1 << 31) | (1 << 25)); }
+s32 Lm_B1(s32 a, int lm) { return LIM(a, 0x7fff, -0x8000 * !lm, (1 << 31) | (1 << 24)); }
+s32 Lm_B2(s32 a, int lm) { return LIM(a, 0x7fff, -0x8000 * !lm, (1 << 31) | (1 << 23)); }
+s32 Lm_B3(s32 a, int lm) { return LIM(a, 0x7fff, -0x8000 * !lm, (1 << 22)); }
+
+s32 Lm_B3_sf(s64 value, int sf, int lm) {
+ s32 value_sf = gte_shift(value, sf);
+ s32 value_12 = gte_shift(value, 1);
+ int max = 0x7fff;
+ int min = 0;
+ if(lm == 0)
+ min = -0x8000;
+
+ if(value_12 < -0x8000 || value_12 > 0x7fff)
+ FLAG |= (1 << 22);
+
+ if(value_sf > max)
+ return max;
+ else if(value_sf < min)
+ return min;
+
+ return value_sf;
+}
+
+s32 Lm_C1(s32 a) { return LIM(a, 0x00ff, 0x0000, (1 << 21)); }
+s32 Lm_C2(s32 a) { return LIM(a, 0x00ff, 0x0000, (1 << 20)); }
+s32 Lm_C3(s32 a) { return LIM(a, 0x00ff, 0x0000, (1 << 19)); }
+s32 Lm_D(s64 a, int sf) { return LIM(gte_shift(a, sf), 0xffff, 0x0000, (1 << 31) | (1 << 18)); }
+
+u32 Lm_E(u32 result) {
+ if(result == 0xffffffff) {
+ FLAG |= (1 << 31) | (1 << 17);
+ return 0x1ffff;
}
-
- gteMAC0 = F((s64)(gteDQB + ((s64)gteDQA * quotient)) >> 12);
- gteIR0 = limH(gteMAC0);
+
+ if(result > 0x1ffff)
+ return 0x1ffff;
+
+ return result;
}
-void gteMVMVA() {
- 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);
+s64 F(s64 a) {
+ m_mac0 = a;
-#ifdef GTE_LOG
- GTE_LOG("GTE MVMVA\n");
-#endif
- gteFLAG = 0;
+ if(a > S64(0x7fffffff))
+ FLAG |= (1 << 31) | (1 << 16);
- 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);
+ if(a < S64(-0x80000000))
+ FLAG |= (1 << 31) | (1 << 15);
- gteIR1 = limB1(gteMAC1, lm);
- gteIR2 = limB2(gteMAC2, lm);
- gteIR3 = limB3(gteMAC3, lm);
+ return a;
}
-void gteNCLIP() {
-#ifdef GTE_LOG
- GTE_LOG("GTE NCLIP\n");
-#endif
- gteFLAG = 0;
+s32 Lm_G1(s64 a) {
+ if(a > 0x3ff) {
+ FLAG |= (1 << 31) | (1 << 14);
+ return 0x3ff;
+ }
+ if(a < -0x400) {
+ FLAG |= (1 << 31) | (1 << 14);
+ return -0x400;
+ }
- gteMAC0 = F((s64)gteSX0 * (gteSY1 - gteSY2) +
- gteSX1 * (gteSY2 - gteSY0) +
- gteSX2 * (gteSY0 - gteSY1));
+ return a;
}
-void gteAVSZ3() {
- s64 t;
-
-#ifdef GTE_LOG
- GTE_LOG("GTE AVSZ3\n");
-#endif
- gteFLAG = 0;
+s32 Lm_G2(s64 a) {
+ if(a > 0x3ff) {
+ FLAG |= (1 << 31) | (1 << 13);
+ return 0x3ff;
+ }
+
+ if(a < -0x400) {
+ FLAG |= (1 << 31) | (1 << 13);
+ return -0x400;
+ }
- t = (s64)(gteZSF3 * (s64)(gteSZ1 + gteSZ2 + gteSZ3));
- gteMAC0 = F(t);
- gteOTZ = limD(t >> 12);
+ return a;
}
-void gteAVSZ4() {
- s64 t;
+s32 Lm_G1_ia(s64 a) {
+ if(a > 0x3ffffff)
+ return 0x3ffffff;
-#ifdef GTE_LOG
- GTE_LOG("GTE AVSZ4\n");
-#endif
- gteFLAG = 0;
+ if(a < -0x4000000)
+ return -0x4000000;
- t = (s64)(gteZSF4 * (s64)(gteSZ0 + gteSZ1 + gteSZ2 + gteSZ3));
- gteMAC0 = F(t);
- gteOTZ = limD(t >> 12);
+ return a;
}
-void gteSQR() {
- int shift = 12 * GTE_SF(gteop);
- int lm = GTE_LM(gteop);
+s32 Lm_G2_ia(s64 a) {
+ if(a > 0x3ffffff)
+ return 0x3ffffff;
-#ifdef GTE_LOG
- GTE_LOG("GTE SQR\n");
-#endif
- gteFLAG = 0;
+ if(a < -0x4000000)
+ return -0x4000000;
- gteMAC1 = A1((gteIR1 * gteIR1) >> shift);
- gteMAC2 = A2((gteIR2 * gteIR2) >> shift);
- gteMAC3 = A3((gteIR3 * gteIR3) >> shift);
- gteIR1 = limB1(gteMAC1, lm);
- gteIR2 = limB2(gteMAC2, lm);
- gteIR3 = limB3(gteMAC3, lm);
+ return a;
}
-void gteNCCS() {
-#ifdef GTE_LOG
- GTE_LOG("GTE NCCS\n");
-#endif
- gteFLAG = 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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
- gteMAC1 = A1(((s64)gteR * gteIR1) >> 8);
- gteMAC2 = A2(((s64)gteG * gteIR2) >> 8);
- gteMAC3 = A3(((s64)gteB * gteIR3) >> 8);
- gteIR1 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteCODE2 = gteCODE;
- gteR2 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
+s32 Lm_H(s64 value, int sf) {
+ s64 value_sf = gte_shift(value, sf);
+ s32 value_12 = gte_shift(value, 1);
+ int max = 0x1000;
+ int min = 0x0000;
+
+ if(value_sf < min || value_sf > max)
+ FLAG |= (1 << 12);
+
+ if(value_12 > max)
+ return max;
+
+ if(value_12 < min)
+ return min;
+
+ return value_12;
}
-void gteNCCT() {
+int docop2(int op) {
int v;
- s32 vx, vy, vz;
+ int lm;
+ int cv;
+ int mx;
+ s32 h_over_sz3 = 0;
+
+ lm = GTE_LM(gteop);
+ m_sf = GTE_SF(gteop);
+
+ FLAG = 0;
+ switch(GTE_FUNCT(gteop)) {
+ case 0x00:
+ case 0x01:
#ifdef GTE_LOG
- GTE_LOG("GTE NCCT\n");
+ GTELOG("%08x RTPS", op);
+#endif
+
+ MAC1 = A1(/*int44*/(s64)((s64) TRX << 12) + (R11 * VX0) + (R12 * VY0) + (R13 * VZ0));
+ MAC2 = A2(/*int44*/(s64)((s64) TRY << 12) + (R21 * VX0) + (R22 * VY0) + (R23 * VZ0));
+ MAC3 = A3(/*int44*/(s64)((s64) TRZ << 12) + (R31 * VX0) + (R32 * VY0) + (R33 * VZ0));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3_sf(m_mac3, m_sf, lm);
+ SZ0 = SZ1;
+ SZ1 = SZ2;
+ SZ2 = SZ3;
+ SZ3 = Lm_D(m_mac3, 1);
+ h_over_sz3 = Lm_E(gte_divide(H, SZ3));
+ SXY0 = SXY1;
+ SXY1 = SXY2;
+ SX2 = Lm_G1(F((s64) OFX + ((s64) IR1 * h_over_sz3) * (Config.Widescreen ? 0.75 : 1)) >> 16);
+ SY2 = Lm_G2(F((s64) OFY + ((s64) IR2 * h_over_sz3)) >> 16);
+
+ GPU_addVertex(SX2, SY2,
+ Lm_G1_ia((s64) OFX + (s64)(IR1 * h_over_sz3) * (Config.Widescreen ? 0.75 : 1)),
+ Lm_G2_ia((s64) OFY + (s64)(IR2 * h_over_sz3)),
+ ((s64)SZ3));
+
+ MAC0 = F((s64) DQB + ((s64) DQA * h_over_sz3));
+ IR0 = Lm_H(m_mac0, 1);
+ return 1;
+
+ case 0x06:
+#ifdef GTE_LOG
+ GTELOG("%08x NCLIP", op);
#endif
- gteFLAG = 0;
-
- 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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(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 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
- }
- gteIR1 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
-}
-void gteNCDS() {
+ MAC0 = F((s64) (SX0 * SY1) + (SX1 * SY2) + (SX2 * SY0) - (SX0 * SY2) - (SX1 * SY0) - (SX2 * SY1));
+ return 1;
+
+ case 0x0c:
#ifdef GTE_LOG
- GTE_LOG("GTE NCDS\n");
+ GTELOG("%08x OP", op);
#endif
- gteFLAG = 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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
- gteMAC1 = A1(((((s64)gteR << 4) * gteIR1) + (gteIR0 * limB1(gteRFC - ((gteR * gteIR1) >> 8), 0))) >> 12);
- gteMAC2 = A2(((((s64)gteG << 4) * gteIR2) + (gteIR0 * limB2(gteGFC - ((gteG * gteIR2) >> 8), 0))) >> 12);
- gteMAC3 = A3(((((s64)gteB << 4) * gteIR3) + (gteIR0 * limB3(gteBFC - ((gteB * gteIR3) >> 8), 0))) >> 12);
- gteIR1 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteCODE2 = gteCODE;
- gteR2 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
-}
-void gteNCDT() {
- int v;
- s32 vx, vy, vz;
+ MAC1 = A1((s64) (R22 * IR3) - (R33 * IR2));
+ MAC2 = A2((s64) (R33 * IR1) - (R11 * IR3));
+ MAC3 = A3((s64) (R11 * IR2) - (R22 * IR1));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ return 1;
+ case 0x10:
#ifdef GTE_LOG
- GTE_LOG("GTE NCDT\n");
+ GTELOG("%08x DPCS", op);
#endif
- gteFLAG = 0;
-
- 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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
- gteMAC1 = A1(((((s64)gteR << 4) * gteIR1) + (gteIR0 * limB1(gteRFC - ((gteR * gteIR1) >> 8), 0))) >> 12);
- gteMAC2 = A2(((((s64)gteG << 4) * gteIR2) + (gteIR0 * limB2(gteGFC - ((gteG * gteIR2) >> 8), 0))) >> 12);
- gteMAC3 = A3(((((s64)gteB << 4) * gteIR3) + (gteIR0 * limB3(gteBFC - ((gteB * gteIR3) >> 8), 0))) >> 12);
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteCODE2 = gteCODE;
- gteR2 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
- }
- gteIR1 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
-}
-void gteOP() {
- int shift = 12 * GTE_SF(gteop);
- int lm = GTE_LM(gteop);
+ MAC1 = A1((R << 16) + (IR0 * Lm_B1(A1(((s64) RFC << 12) - (R << 16)), 0)));
+ MAC2 = A2((G << 16) + (IR0 * Lm_B2(A2(((s64) GFC << 12) - (G << 16)), 0)));
+ MAC3 = A3((B << 16) + (IR0 * Lm_B3(A3(((s64) BFC << 12) - (B << 16)), 0)));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ return 1;
+
+ case 0x11:
+#ifdef GTE_LOG
+ GTELOG("%08x INTPL", op);
+#endif
+ MAC1 = A1((IR1 << 12) + (IR0 * Lm_B1(A1(((s64) RFC << 12) - (IR1 << 12)), 0)));
+ MAC2 = A2((IR2 << 12) + (IR0 * Lm_B2(A2(((s64) GFC << 12) - (IR2 << 12)), 0)));
+ MAC3 = A3((IR3 << 12) + (IR0 * Lm_B3(A3(((s64) BFC << 12) - (IR3 << 12)), 0)));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ return 1;
+
+ case 0x12:
#ifdef GTE_LOG
- GTE_LOG("GTE OP\n");
+ GTELOG("%08x MVMVA", op);
#endif
- gteFLAG = 0;
- 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 = limB1(gteMAC1, lm);
- gteIR2 = limB2(gteMAC2, lm);
- gteIR3 = limB3(gteMAC3, lm);
-}
+ mx = GTE_MX(gteop);
+ v = GTE_V(gteop);
+ cv = GTE_CV(gteop);
+
+ switch(cv) {
+ case 2:
+ MAC1 = A1((s64) (MX12(mx) * VY(v)) + (MX13(mx) * VZ(v)));
+ MAC2 = A2((s64) (MX22(mx) * VY(v)) + (MX23(mx) * VZ(v)));
+ MAC3 = A3((s64) (MX32(mx) * VY(v)) + (MX33(mx) * VZ(v)));
+ Lm_B1(A1(((s64) CV1(cv) << 12) + (MX11(mx) * VX(v))), 0);
+ Lm_B2(A2(((s64) CV2(cv) << 12) + (MX21(mx) * VX(v))), 0);
+ Lm_B3(A3(((s64) CV3(cv) << 12) + (MX31(mx) * VX(v))), 0);
+ break;
-void gteDCPL() {
- int lm = GTE_LM(gteop);
+ default:
+ MAC1 = A1(/*int44*/(s64)((s64) CV1(cv) << 12) + (MX11(mx) * VX(v)) + (MX12(mx) * VY(v)) + (MX13(mx) * VZ(v)));
+ MAC2 = A2(/*int44*/(s64)((s64) CV2(cv) << 12) + (MX21(mx) * VX(v)) + (MX22(mx) * VY(v)) + (MX23(mx) * VZ(v)));
+ MAC3 = A3(/*int44*/(s64)((s64) CV3(cv) << 12) + (MX31(mx) * VX(v)) + (MX32(mx) * VY(v)) + (MX33(mx) * VZ(v)));
+ break;
+ }
- s64 RIR1 = ((s64)gteR * gteIR1) >> 8;
- s64 GIR2 = ((s64)gteG * gteIR2) >> 8;
- s64 BIR3 = ((s64)gteB * gteIR3) >> 8;
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ return 1;
+ case 0x13:
#ifdef GTE_LOG
- GTE_LOG("GTE DCPL\n");
+ GTELOG("%08x NCDS", op);
#endif
- gteFLAG = 0;
-
- gteMAC1 = A1(RIR1 + ((gteIR0 * limB1(gteRFC - RIR1, 0)) >> 12));
- gteMAC2 = A2(GIR2 + ((gteIR0 * limB1(gteGFC - GIR2, 0)) >> 12));
- gteMAC3 = A3(BIR3 + ((gteIR0 * limB1(gteBFC - BIR3, 0)) >> 12));
-
- gteIR1 = limB1(gteMAC1, lm);
- gteIR2 = limB2(gteMAC2, lm);
- gteIR3 = limB3(gteMAC3, lm);
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteCODE2 = gteCODE;
- gteR2 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
-}
+ MAC1 = A1((s64) (L11 * VX0) + (L12 * VY0) + (L13 * VZ0));
+ MAC2 = A2((s64) (L21 * VX0) + (L22 * VY0) + (L23 * VZ0));
+ MAC3 = A3((s64) (L31 * VX0) + (L32 * VY0) + (L33 * VZ0));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ MAC1 = A1(/*int44*/(s64)((s64) RBK << 12) + (LR1 * IR1) + (LR2 * IR2) + (LR3 * IR3));
+ MAC2 = A2(/*int44*/(s64)((s64) GBK << 12) + (LG1 * IR1) + (LG2 * IR2) + (LG3 * IR3));
+ MAC3 = A3(/*int44*/(s64)((s64) BBK << 12) + (LB1 * IR1) + (LB2 * IR2) + (LB3 * IR3));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ MAC1 = A1(((R << 4) * IR1) + (IR0 * Lm_B1(A1(((s64) RFC << 12) - ((R << 4) * IR1)), 0)));
+ MAC2 = A2(((G << 4) * IR2) + (IR0 * Lm_B2(A2(((s64) GFC << 12) - ((G << 4) * IR2)), 0)));
+ MAC3 = A3(((B << 4) * IR3) + (IR0 * Lm_B3(A3(((s64) BFC << 12) - ((B << 4) * IR3)), 0)));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ return 1;
+
+ case 0x14:
+#ifdef GTE_LOG
+ GTELOG("%08x CDP", op);
+#endif
-void gteGPF() {
- int shift = 12 * GTE_SF(gteop);
- int lm = GTE_LM(gteop);
+ MAC1 = A1(/*int44*/(s64)((s64) RBK << 12) + (LR1 * IR1) + (LR2 * IR2) + (LR3 * IR3));
+ MAC2 = A2(/*int44*/(s64)((s64) GBK << 12) + (LG1 * IR1) + (LG2 * IR2) + (LG3 * IR3));
+ MAC3 = A3(/*int44*/(s64)((s64) BBK << 12) + (LB1 * IR1) + (LB2 * IR2) + (LB3 * IR3));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ MAC1 = A1(((R << 4) * IR1) + (IR0 * Lm_B1(A1(((s64) RFC << 12) - ((R << 4) * IR1)), 0)));
+ MAC2 = A2(((G << 4) * IR2) + (IR0 * Lm_B2(A2(((s64) GFC << 12) - ((G << 4) * IR2)), 0)));
+ MAC3 = A3(((B << 4) * IR3) + (IR0 * Lm_B3(A3(((s64) BFC << 12) - ((B << 4) * IR3)), 0)));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ return 1;
+
+ case 0x16:
+#ifdef GTE_LOG
+ GTELOG("%08x NCDT", op);
+#endif
+ for(v = 0; v < 3; v++) {
+ MAC1 = A1((s64) (L11 * VX(v)) + (L12 * VY(v)) + (L13 * VZ(v)));
+ MAC2 = A2((s64) (L21 * VX(v)) + (L22 * VY(v)) + (L23 * VZ(v)));
+ MAC3 = A3((s64) (L31 * VX(v)) + (L32 * VY(v)) + (L33 * VZ(v)));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ MAC1 = A1(/*int44*/(s64)((s64) RBK << 12) + (LR1 * IR1) + (LR2 * IR2) + (LR3 * IR3));
+ MAC2 = A2(/*int44*/(s64)((s64) GBK << 12) + (LG1 * IR1) + (LG2 * IR2) + (LG3 * IR3));
+ MAC3 = A3(/*int44*/(s64)((s64) BBK << 12) + (LB1 * IR1) + (LB2 * IR2) + (LB3 * IR3));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ MAC1 = A1(((R << 4) * IR1) + (IR0 * Lm_B1(A1(((s64) RFC << 12) - ((R << 4) * IR1)), 0)));
+ MAC2 = A2(((G << 4) * IR2) + (IR0 * Lm_B2(A2(((s64) GFC << 12) - ((G << 4) * IR2)), 0)));
+ MAC3 = A3(((B << 4) * IR3) + (IR0 * Lm_B3(A3(((s64) BFC << 12) - ((B << 4) * IR3)), 0)));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ }
+ return 1;
+
+ case 0x1b:
#ifdef GTE_LOG
- GTE_LOG("GTE GPF\n");
+ GTELOG("%08x NCCS", op);
#endif
- gteFLAG = 0;
- gteMAC1 = A1((s64)(gteIR0 * gteIR1)) >> shift;
- gteMAC2 = A2((s64)(gteIR0 * gteIR2)) >> shift;
- gteMAC3 = A3((s64)(gteIR0 * gteIR3)) >> shift;
- gteIR1 = limB1(gteMAC1, lm);
- gteIR2 = limB2(gteMAC2, lm);
- gteIR3 = limB3(gteMAC3, lm);
+ MAC1 = A1((s64) (L11 * VX0) + (L12 * VY0) + (L13 * VZ0));
+ MAC2 = A2((s64) (L21 * VX0) + (L22 * VY0) + (L23 * VZ0));
+ MAC3 = A3((s64) (L31 * VX0) + (L32 * VY0) + (L33 * VZ0));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ MAC1 = A1(/*int44*/(s64)((s64) RBK << 12) + (LR1 * IR1) + (LR2 * IR2) + (LR3 * IR3));
+ MAC2 = A2(/*int44*/(s64)((s64) GBK << 12) + (LG1 * IR1) + (LG2 * IR2) + (LG3 * IR3));
+ MAC3 = A3(/*int44*/(s64)((s64) BBK << 12) + (LB1 * IR1) + (LB2 * IR2) + (LB3 * IR3));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ MAC1 = A1((R << 4) * IR1);
+ MAC2 = A2((G << 4) * IR2);
+ MAC3 = A3((B << 4) * IR3);
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ return 1;
+
+ case 0x1c:
+#ifdef GTE_LOG
+ GTELOG("%08x CC", op);
+#endif
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteCODE2 = gteCODE;
- gteR2 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
-}
+ MAC1 = A1(/*int44*/(s64)(((s64) RBK) << 12) + (LR1 * IR1) + (LR2 * IR2) + (LR3 * IR3));
+ MAC2 = A2(/*int44*/(s64)(((s64) GBK) << 12) + (LG1 * IR1) + (LG2 * IR2) + (LG3 * IR3));
+ MAC3 = A3(/*int44*/(s64)(((s64) BBK) << 12) + (LB1 * IR1) + (LB2 * IR2) + (LB3 * IR3));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ MAC1 = A1((R << 4) * IR1);
+ MAC2 = A2((G << 4) * IR2);
+ MAC3 = A3((B << 4) * IR3);
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ return 1;
+
+ case 0x1e:
+#ifdef GTE_LOG
+ GTELOG("%08x NCS", op);
+#endif
-void gteGPL() {
- int shift = 12 * GTE_SF(gteop);
+ MAC1 = A1((s64) (L11 * VX0) + (L12 * VY0) + (L13 * VZ0));
+ MAC2 = A2((s64) (L21 * VX0) + (L22 * VY0) + (L23 * VZ0));
+ MAC3 = A3((s64) (L31 * VX0) + (L32 * VY0) + (L33 * VZ0));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ MAC1 = A1(/*int44*/(s64)((s64) RBK << 12) + (LR1 * IR1) + (LR2 * IR2) + (LR3 * IR3));
+ MAC2 = A2(/*int44*/(s64)((s64) GBK << 12) + (LG1 * IR1) + (LG2 * IR2) + (LG3 * IR3));
+ MAC3 = A3(/*int44*/(s64)((s64) BBK << 12) + (LB1 * IR1) + (LB2 * IR2) + (LB3 * IR3));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ return 1;
+
+ case 0x20:
+#ifdef GTE_LOG
+ GTELOG("%08x NCT", op);
+#endif
+ for(v = 0; v < 3; v++) {
+ MAC1 = A1((s64) (L11 * VX(v)) + (L12 * VY(v)) + (L13 * VZ(v)));
+ MAC2 = A2((s64) (L21 * VX(v)) + (L22 * VY(v)) + (L23 * VZ(v)));
+ MAC3 = A3((s64) (L31 * VX(v)) + (L32 * VY(v)) + (L33 * VZ(v)));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ MAC1 = A1(/*int44*/(s64)((s64) RBK << 12) + (LR1 * IR1) + (LR2 * IR2) + (LR3 * IR3));
+ MAC2 = A2(/*int44*/(s64)((s64) GBK << 12) + (LG1 * IR1) + (LG2 * IR2) + (LG3 * IR3));
+ MAC3 = A3(/*int44*/(s64)((s64) BBK << 12) + (LB1 * IR1) + (LB2 * IR2) + (LB3 * IR3));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ }
+ return 1;
+
+ case 0x28:
#ifdef GTE_LOG
- GTE_LOG("GTE GPL\n");
+ GTELOG("%08x SQR", op);
#endif
- gteFLAG = 0;
- 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 = limB1(gteMAC1, 0);
- gteIR2 = limB2(gteMAC2, 0);
- gteIR3 = limB3(gteMAC3, 0);
+ MAC1 = A1(IR1 * IR1);
+ MAC2 = A2(IR2 * IR2);
+ MAC3 = A3(IR3 * IR3);
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ return 1;
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteCODE2 = gteCODE;
- gteR2 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
-}
+ case 0x29:
+#ifdef GTE_LOG
+ GTELOG("%08x DPCL", op);
+#endif
-void gteDPCS() {
- int shift = 12 * GTE_SF(gteop);
+ MAC1 = A1(((R << 4) * IR1) + (IR0 * Lm_B1(A1(((s64) RFC << 12) - ((R << 4) * IR1)), 0)));
+ MAC2 = A2(((G << 4) * IR2) + (IR0 * Lm_B2(A2(((s64) GFC << 12) - ((G << 4) * IR2)), 0)));
+ MAC3 = A3(((B << 4) * IR3) + (IR0 * Lm_B3(A3(((s64) BFC << 12) - ((B << 4) * IR3)), 0)));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ return 1;
+
+ case 0x2a:
+#ifdef GTE_LOG
+ GTELOG("%08x DPCT", op);
+#endif
+ for(v = 0; v < 3; v++) {
+ MAC1 = A1((R0 << 16) + (IR0 * Lm_B1(A1(((s64) RFC << 12) - (R0 << 16)), 0)));
+ MAC2 = A2((G0 << 16) + (IR0 * Lm_B2(A2(((s64) GFC << 12) - (G0 << 16)), 0)));
+ MAC3 = A3((B0 << 16) + (IR0 * Lm_B3(A3(((s64) BFC << 12) - (B0 << 16)), 0)));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ }
+ return 1;
+
+ case 0x2d:
#ifdef GTE_LOG
- GTE_LOG("GTE DPCS\n");
+ GTELOG("%08x AVSZ3", op);
#endif
- gteFLAG = 0;
- gteMAC1 = A1(((gteR << 16) + (gteIR0 * limB1(A1((s64)gteRFC - (gteR << 4)) << (12 - shift), 0))) >> 12);
- gteMAC2 = A2(((gteG << 16) + (gteIR0 * limB2(A2((s64)gteGFC - (gteG << 4)) << (12 - shift), 0))) >> 12);
- gteMAC3 = A3(((gteB << 16) + (gteIR0 * limB3(A3((s64)gteBFC - (gteB << 4)) << (12 - shift), 0))) >> 12);
+ MAC0 = F((s64) (ZSF3 * SZ1) + (ZSF3 * SZ2) + (ZSF3 * SZ3));
+ OTZ = Lm_D(m_mac0, 1);
+ return 1;
- gteIR1 = limB1(gteMAC1, 0);
- gteIR2 = limB2(gteMAC2, 0);
- gteIR3 = limB3(gteMAC3, 0);
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteCODE2 = gteCODE;
- gteR2 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
-}
+ case 0x2e:
+#ifdef GTE_LOG
+ GTELOG("%08x AVSZ4", op);
+#endif
-void gteDPCT() {
- int v;
+ MAC0 = F((s64) (ZSF4 * SZ0) + (ZSF4 * SZ1) + (ZSF4 * SZ2) + (ZSF4 * SZ3));
+ OTZ = Lm_D(m_mac0, 1);
+ return 1;
+ case 0x30:
#ifdef GTE_LOG
- GTE_LOG("GTE DPCT\n");
+ GTELOG("%08x RTPT", op);
#endif
- gteFLAG = 0;
-
- for (v = 0; v < 3; v++) {
- gteMAC1 = A1((((s64)gteR0 << 16) + ((s64)gteIR0 * (limB1(gteRFC - (gteR0 << 4), 0)))) >> 12);
- gteMAC2 = A2((((s64)gteG0 << 16) + ((s64)gteIR0 * (limB1(gteGFC - (gteG0 << 4), 0)))) >> 12);
- gteMAC3 = A3((((s64)gteB0 << 16) + ((s64)gteIR0 * (limB1(gteBFC - (gteB0 << 4), 0)))) >> 12);
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteCODE2 = gteCODE;
- gteR2 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
- }
- gteIR1 = limB1(gteMAC1, 0);
- gteIR2 = limB2(gteMAC2, 0);
- gteIR3 = limB3(gteMAC3, 0);
-}
-void gteNCS() {
+ for(v = 0; v < 3; v++) {
+ MAC1 = A1(/*int44*/(s64)((s64) TRX << 12) + (R11 * VX(v)) + (R12 * VY(v)) + (R13 * VZ(v)));
+ MAC2 = A2(/*int44*/(s64)((s64) TRY << 12) + (R21 * VX(v)) + (R22 * VY(v)) + (R23 * VZ(v)));
+ MAC3 = A3(/*int44*/(s64)((s64) TRZ << 12) + (R31 * VX(v)) + (R32 * VY(v)) + (R33 * VZ(v)));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3_sf(m_mac3, m_sf, lm);
+ SZ0 = SZ1;
+ SZ1 = SZ2;
+ SZ2 = SZ3;
+ SZ3 = Lm_D(m_mac3, 1);
+ h_over_sz3 = Lm_E(gte_divide(H, SZ3));
+ SXY0 = SXY1;
+ SXY1 = SXY2;
+ SX2 = Lm_G1(F((s64) OFX + ((s64) IR1 * h_over_sz3) * (Config.Widescreen ? 0.75 : 1)) >> 16);
+ SY2 = Lm_G2(F((s64) OFY + ((s64) IR2 * h_over_sz3)) >> 16);
+
+ GPU_addVertex(SX2, SY2,
+ Lm_G1_ia((s64) OFX + (s64)(IR1 * h_over_sz3) * (Config.Widescreen ? 0.75 : 1)),
+ Lm_G2_ia((s64) OFY + (s64)(IR2 * h_over_sz3)),
+ ((s64)SZ3));
+ }
+
+ MAC0 = F((s64) DQB + ((s64) DQA * h_over_sz3));
+ IR0 = Lm_H(m_mac0, 1);
+ return 1;
+
+ case 0x3d:
#ifdef GTE_LOG
- GTE_LOG("GTE NCS\n");
+ GTELOG("%08x GPF", op);
#endif
- gteFLAG = 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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteCODE2 = gteCODE;
- gteR2 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
-}
-void gteNCT() {
- int v;
- s32 vx, vy, vz;
+ MAC1 = A1(IR0 * IR1);
+ MAC2 = A2(IR0 * IR2);
+ MAC3 = A3(IR0 * IR3);
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ return 1;
+
+ case 0x3e:
+#ifdef GTE_LOG
+ GTELOG("%08x GPL", op);
+#endif
+ MAC1 = A1(gte_shift(MAC1, -m_sf) + (IR0 * IR1));
+ MAC2 = A2(gte_shift(MAC2, -m_sf) + (IR0 * IR2));
+ MAC3 = A3(gte_shift(MAC3, -m_sf) + (IR0 * IR3));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ return 1;
+
+ case 0x3f:
#ifdef GTE_LOG
- GTE_LOG("GTE NCT\n");
+ GTELOG("%08x NCCT", op);
#endif
- gteFLAG = 0;
-
- 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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(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 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
+
+ for(v = 0; v < 3; v++) {
+ MAC1 = A1((s64) (L11 * VX(v)) + (L12 * VY(v)) + (L13 * VZ(v)));
+ MAC2 = A2((s64) (L21 * VX(v)) + (L22 * VY(v)) + (L23 * VZ(v)));
+ MAC3 = A3((s64) (L31 * VX(v)) + (L32 * VY(v)) + (L33 * VZ(v)));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ MAC1 = A1(/*int44*/(s64)((s64) RBK << 12) + (LR1 * IR1) + (LR2 * IR2) + (LR3 * IR3));
+ MAC2 = A2(/*int44*/(s64)((s64) GBK << 12) + (LG1 * IR1) + (LG2 * IR2) + (LG3 * IR3));
+ MAC3 = A3(/*int44*/(s64)((s64) BBK << 12) + (LB1 * IR1) + (LB2 * IR2) + (LB3 * IR3));
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ MAC1 = A1((R << 4) * IR1);
+ MAC2 = A2((G << 4) * IR2);
+ MAC3 = A3((B << 4) * IR3);
+ IR1 = Lm_B1(MAC1, lm);
+ IR2 = Lm_B2(MAC2, lm);
+ IR3 = Lm_B3(MAC3, lm);
+ RGB0 = RGB1;
+ RGB1 = RGB2;
+ CD2 = CODE;
+ R2 = Lm_C1(MAC1 >> 4);
+ G2 = Lm_C2(MAC2 >> 4);
+ B2 = Lm_C3(MAC3 >> 4);
+ }
+ return 1;
}
- gteIR1 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
+
+ return 0;
}
-void gteCC() {
-#ifdef GTE_LOG
- GTE_LOG("GTE CC\n");
-#endif
- gteFLAG = 0;
-
- 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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
- gteMAC1 = A1(((s64)gteR * gteIR1) >> 8);
- gteMAC2 = A2(((s64)gteG * gteIR2) >> 8);
- gteMAC3 = A3(((s64)gteB * gteIR3) >> 8);
- gteIR1 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteCODE2 = gteCODE;
- gteR2 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
+void gteRTPS() {
+ docop2(gteop);
+}
+
+void gteNCLIP() {
+ docop2(gteop);
+}
+
+void gteOP() {
+ docop2(gteop);
+}
+
+void gteDPCS() {
+ docop2(gteop);
}
void gteINTPL() {
- int shift = 12 * GTE_SF(gteop);
- int lm = GTE_LM(gteop);
+ docop2(gteop);
+}
-#ifdef GTE_LOG
- GTE_LOG("GTE INTPL\n");
-#endif
- gteFLAG = 0;
-
- gteMAC1 = A1(((gteIR1 << 12) + (gteIR0 * limB1(((s64)gteRFC - gteIR1), 0))) >> shift);
- gteMAC2 = A2(((gteIR2 << 12) + (gteIR0 * limB2(((s64)gteGFC - gteIR2), 0))) >> shift);
- gteMAC3 = A3(((gteIR3 << 12) + (gteIR0 * limB3(((s64)gteBFC - gteIR3), 0))) >> shift);
- gteIR1 = limB1(gteMAC1, lm);
- gteIR2 = limB2(gteMAC2, lm);
- gteIR3 = limB3(gteMAC3, lm);
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteCODE2 = gteCODE;
- gteR2 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
+void gteMVMVA() {
+ docop2(gteop);
+}
+
+void gteNCDS() {
+ docop2(gteop);
}
void gteCDP() {
-#ifdef GTE_LOG
- GTE_LOG("GTE CDP\n");
-#endif
- gteFLAG = 0;
-
- 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 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
- gteMAC1 = A1(((((s64)gteR << 4) * gteIR1) + (gteIR0 * limB1(gteRFC - ((gteR * gteIR1) >> 8), 0))) >> 12);
- gteMAC2 = A2(((((s64)gteG << 4) * gteIR2) + (gteIR0 * limB2(gteGFC - ((gteG * gteIR2) >> 8), 0))) >> 12);
- gteMAC3 = A3(((((s64)gteB << 4) * gteIR3) + (gteIR0 * limB3(gteBFC - ((gteB * gteIR3) >> 8), 0))) >> 12);
- gteIR1 = limB1(gteMAC1, 1);
- gteIR2 = limB2(gteMAC2, 1);
- gteIR3 = limB3(gteMAC3, 1);
-
- gteRGB0 = gteRGB1;
- gteRGB1 = gteRGB2;
- gteCODE2 = gteCODE;
- gteR2 = limC1(gteMAC1 >> 4);
- gteG2 = limC2(gteMAC2 >> 4);
- gteB2 = limC3(gteMAC3 >> 4);
+ docop2(gteop);
+}
+
+void gteNCDT() {
+ docop2(gteop);
+}
+
+void gteNCCS() {
+ docop2(gteop);
+}
+
+void gteCC() {
+ docop2(gteop);
+}
+
+void gteNCS() {
+ docop2(gteop);
+}
+
+void gteNCT() {
+ docop2(gteop);
+}
+
+void gteSQR() {
+ docop2(gteop);
+}
+
+void gteDCPL() {
+ docop2(gteop);
+}
+
+void gteDPCT() {
+ docop2(gteop);
+}
+
+void gteAVSZ3() {
+ docop2(gteop);
+}
+
+void gteAVSZ4() {
+ docop2(gteop);
+}
+
+void gteRTPT() {
+ docop2(gteop);
+}
+
+void gteGPF() {
+ docop2(gteop);
+}
+
+void gteGPL() {
+ docop2(gteop);
+}
+
+void gteNCCT() {
+ docop2(gteop);
}