summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libpcsxcore/gte.c69
1 files changed, 49 insertions, 20 deletions
diff --git a/libpcsxcore/gte.c b/libpcsxcore/gte.c
index b5acadab..3959294b 100644
--- a/libpcsxcore/gte.c
+++ b/libpcsxcore/gte.c
@@ -267,29 +267,58 @@ static inline void MTC2(u32 value, int reg) {
case 30:
{
- int a;
- gteLZCS = value;
-
- 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;
- }
+#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
}
break;
- case 7:
- case 29:
- case 31:
- return;
+#if 1
+ // non-MAME
+ case 7:
+ case 29:
+ return;
+
+ case 31:
+ return;
+#else
+ case 31:
+ value = psxRegs.CP2D.r[reg];
+ break;
+#endif
default:
psxRegs.CP2D.r[reg] = value;