aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ARMInterpreter_ALU.cpp6
-rw-r--r--GPU2D.cpp5
-rw-r--r--GPU3D.cpp11
3 files changed, 13 insertions, 9 deletions
diff --git a/ARMInterpreter_ALU.cpp b/ARMInterpreter_ALU.cpp
index 88b69e7..d6c5abd 100644
--- a/ARMInterpreter_ALU.cpp
+++ b/ARMInterpreter_ALU.cpp
@@ -1301,8 +1301,10 @@ void T_NEG_REG(ARM* cpu)
u32 b = cpu->R[(cpu->CurInstr >> 3) & 0x7];
u32 res = -b;
cpu->R[cpu->CurInstr & 0x7] = res;
- cpu->SetNZ(res & 0x80000000,
- !res);
+ cpu->SetNZCV(res & 0x80000000,
+ !res,
+ CARRY_SUB(0, b),
+ OVERFLOW_SUB(0, b, res));
}
void T_CMP_REG(ARM* cpu)
diff --git a/GPU2D.cpp b/GPU2D.cpp
index 14ea86e..ca27289 100644
--- a/GPU2D.cpp
+++ b/GPU2D.cpp
@@ -54,7 +54,8 @@
//
// 3D/2D blending rules
// * if destination selected as 2nd target:
-// blending is applied instead of the selected color effect, using full 31bit alpha from 3D layer
+// blending is applied instead of the selected color effect, using full 5bit alpha from 3D layer
+// (or 6bit alpha? TODO: check it)
// this even if the selected color effect is 'none'.
// apparently this works even if BG0 isn't selected as 1st target
// * if BG0 is selected as 1st target, destination not selected as 2nd target:
@@ -231,7 +232,7 @@ void GPU2D::Write16(u32 addr, u16 val)
EVB = (val >> 8) & 0x1F;
if (EVB > 16) EVB = 16;
return;
- case 0x54:
+ case 0x054:
EVY = val & 0x1F;
if (EVY > 16) EVY = 16;
return;
diff --git a/GPU3D.cpp b/GPU3D.cpp
index 7c1faae..b45b835 100644
--- a/GPU3D.cpp
+++ b/GPU3D.cpp
@@ -44,11 +44,12 @@
// the added bias affects interpolation.
//
// depth buffer:
-// Z-buffering mode: val = ((Z * 0x800 * 0x1000) / W) + 0x7FFCFF
-// W-buffering mode: val = W - 0x1FF
-// TODO: confirm W, because it's weird
-// ... nope, that shit above isn't right
-// also, the formula for the clear depth on GBAtek appears to be wrong
+// Z-buffering mode: val = ((Z * 0x800 * 0x1000) / W) + 0x7FFEFF
+// W-buffering mode: val = W
+//
+// formula for clear depth: (GBAtek is wrong there)
+// clearZ = (val * 0x200) + 0x1FF;
+// if (clearZ >= 0x010000 && clearZ < 0xFFFFFF) clearZ++;
namespace GPU3D