diff options
| author | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-04-16 04:44:02 +0000 |
|---|---|---|
| committer | SND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2010-04-16 04:44:02 +0000 |
| commit | 44be51f99365fa387b318030b7b86c0c5681a20b (patch) | |
| tree | 8dd56496c9131f0d65a9141d1d44b1acb93f883f /libpcsxcore | |
| parent | 6d5b9968e7ae3ccb2301782fa4764a950719ebae (diff) | |
| download | pcsxr-44be51f99365fa387b318030b7b86c0c5681a20b.tar.gz | |
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@45545 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore')
| -rw-r--r-- | libpcsxcore/gte.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/libpcsxcore/gte.c b/libpcsxcore/gte.c index 6a4f2029..fefe4f73 100644 --- a/libpcsxcore/gte.c +++ b/libpcsxcore/gte.c @@ -210,6 +210,13 @@ static inline u32 limE(u32 result) { #define limG2(a) LIM((a), 0x3ff, -0x400, (1 << 31) | (1 << 13)) #define limH(a) LIM((a), 0xfff, 0x000, (1 << 12)) +static inline u32 DIVIDE(s16 n, u16 d) { + if (n >= 0 && n < d * 2) { + return ((u32)n << 16) / d; + } + return 0xffffffff; +} + static inline u32 MFC2(int reg) { switch (reg) { case 1: @@ -308,9 +315,7 @@ static inline void CTC2(u32 value, int reg) { case 31: value = value & 0x7ffff000; - if ((value & 0x7f87e000) != 0) { - value |= 0x80000000; - } + if (value & 0x7f87e000) value |= 0x80000000; break; } @@ -363,7 +368,7 @@ void gteRTPS() { gteSZ1 = gteSZ2; gteSZ2 = gteSZ3; gteSZ3 = limD(gteMAC3); - h_over_sz3 = limE((gteH * 65536) / (gteSZ3 + 0.5)); + h_over_sz3 = limE(DIVIDE(gteH, gteSZ3)); gteSXY0 = gteSXY1; gteSXY1 = gteSXY2; gteSX2 = limG1(F((s64)gteOFX + ((s64)gteIR1 * h_over_sz3)) >> 16); @@ -395,7 +400,7 @@ void gteRTPT() { gteIR2 = limB2(gteMAC2, 0); gteIR3 = limB3(gteMAC3, 0); fSZ(v) = limD(gteMAC3); - h_over_sz3 = limE((gteH * 65536) / (fSZ(v) + 0.5)); + h_over_sz3 = limE(DIVIDE(gteH, fSZ(v))); fSX(v) = limG1(F((s64)gteOFX + ((s64)gteIR1 * h_over_sz3)) >> 16); fSY(v) = limG2(F((s64)gteOFY + ((s64)gteIR2 * h_over_sz3)) >> 16); } |
