summaryrefslogtreecommitdiff
path: root/Source/Core/DSPCore/Src/DspIntArithmetic.cpp
diff options
context:
space:
mode:
authorMarko Pusljar <LM1234@gmail.com>2010-03-19 21:53:41 +0000
committerMarko Pusljar <LM1234@gmail.com>2010-03-19 21:53:41 +0000
commit503bf545a3e21815d2312f8f5dd0bcde7f286b24 (patch)
tree469305dc92291c957414ecfba6ad1329f6010e94 /Source/Core/DSPCore/Src/DspIntArithmetic.cpp
parent4f56d8144b0e5c4de1ab45eafe67997c8ab9fd6f (diff)
DSPLLE - 0xa100 figured out = abs(), small mul fix, cleaning, some extra comments
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5216 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/DSPCore/Src/DspIntArithmetic.cpp')
-rw-r--r--Source/Core/DSPCore/Src/DspIntArithmetic.cpp48
1 files changed, 25 insertions, 23 deletions
diff --git a/Source/Core/DSPCore/Src/DspIntArithmetic.cpp b/Source/Core/DSPCore/Src/DspIntArithmetic.cpp
index 7c24dea14e..9bdaa4cefb 100644
--- a/Source/Core/DSPCore/Src/DspIntArithmetic.cpp
+++ b/Source/Core/DSPCore/Src/DspIntArithmetic.cpp
@@ -48,10 +48,9 @@ void clrl(const UDSPInstruction& opc)
{
u8 reg = (opc.hex >> 8) & 0x1;
- s64 acc = dsp_get_long_acc(reg);
- acc = (acc & ~0xffff) + (((acc & 0xffff) >= 0x8000) ? 0x10000 : 0);
+ s64 acc = (dsp_get_long_acc(reg) + 0x8000) & ~0xffff;
- zeroWriteBackLogPreserveAcc(reg);
+ zeroWriteBackLog();
dsp_set_long_acc(reg, acc);
Update_SR_Register64(acc);
@@ -98,7 +97,7 @@ void andf(const UDSPInstruction& opc)
// 1011 r001 xxxx xxxx
// Test accumulator %acR.
//
-// flags out: xx xx00
+// flags out: --xx xx00
void tst(const UDSPInstruction& opc)
{
u8 reg = (opc.hex >> 11) & 0x1;
@@ -135,8 +134,7 @@ void cmp(const UDSPInstruction& opc)
s64 acc1 = dsp_get_long_acc(1);
s64 res = dsp_convert_long_acc(acc0 - acc1);
- //Update_SR_Register64(res, isCarry2(acc0, res), isOverflow(acc0, -acc1, res)); // CF -> problems in ikaruga/nsmb -> 0xa100 ??
- Update_SR_Register64(res, false, isOverflow(acc0, -acc1, res));
+ Update_SR_Register64(res, isCarry2(acc0, res), isOverflow(acc0, -acc1, res)); // CF -> influence on ABS/0xa100
zeroWriteBackLog();
}
@@ -441,7 +439,7 @@ void add(const UDSPInstruction& opc)
// 0100 111d xxxx xxxx
// Adds product register to accumulator register.
//
-// flags out: x-xx xxxx - CF??
+// flags out: x-xx xxxx
void addp(const UDSPInstruction& opc)
{
u8 dreg = (opc.hex >> 8) & 0x1;
@@ -564,7 +562,7 @@ void inc(const UDSPInstruction& opc)
// 0101 0ssd xxxx xxxx
// Subtracts register $axS.L from accumulator $acD.M register.
//
-// flags out: xx xx00
+// flags out: x-xx xxxx
void subr(const UDSPInstruction& opc)
{
u8 dreg = (opc.hex >> 8) & 0x1;
@@ -702,6 +700,25 @@ void neg(const UDSPInstruction& opc)
Update_SR_Register64(dsp_get_long_acc(dreg));
}
+// ABS $acD
+// 1010 d001 xxxx xxxx
+// absolute value of $acD
+//
+// flags out: --xx xx00
+void abs(const UDSPInstruction& opc)
+{
+ u8 dreg = (opc.hex >> 11) & 0x1;
+
+ s64 acc = dsp_get_long_acc(dreg);
+
+ if (acc < 0)
+ acc = 0 - acc;
+
+ zeroWriteBackLog();
+
+ dsp_set_long_acc(dreg, acc);
+ Update_SR_Register64(dsp_get_long_acc(dreg));
+}
//----
// MOVR $acD, $axS.R
@@ -1092,21 +1109,6 @@ void asrnr(const UDSPInstruction& opc)
Update_SR_Register64(dsp_get_long_acc(dreg));
}
-//----
-
-// A100 $acD
-// 1010 d001 xxxx xxxx
-//
-// MIA!! - needed for AX/AXWII
-//
-void a100(const UDSPInstruction& opc)
-{
- u8 dreg = (opc.hex >> 11) & 0x1;
- //it changes target ACC sometimes!
-
- zeroWriteBackLog();
- Update_SR_Register64(dsp_get_long_acc(dreg));
-}
} // namespace