diff --git a/Source/Core/DSPCore/Src/DSPCore.h b/Source/Core/DSPCore/Src/DSPCore.h index 29a0ab44c0..c88b5ebce7 100644 --- a/Source/Core/DSPCore/Src/DSPCore.h +++ b/Source/Core/DSPCore/Src/DSPCore.h @@ -150,7 +150,7 @@ #define SR_ARITH_ZERO 0x0004 #define SR_SIGN 0x0008 #define SR_10 0x0010 // seem to be set by tst -#define SR_TOP2BITS 0x0020 // this is an odd one. (set by tst) +#define SR_TOP2BITS 0x0020 // if the upper 2 bits are equal #define SR_LOGIC_ZERO 0x0040 #define SR_INT_ENABLE 0x0200 // Not 100% sure but duddie says so. This should replace the hack, if so. #define SR_EXT_INT_ENABLE 0x0800 // Appears in zelda - seems to disable external interupts diff --git a/Source/Core/DSPCore/Src/DSPIntCCUtil.cpp b/Source/Core/DSPCore/Src/DSPIntCCUtil.cpp index bdbf8c0584..9b78a11ab6 100644 --- a/Source/Core/DSPCore/Src/DSPIntCCUtil.cpp +++ b/Source/Core/DSPCore/Src/DSPIntCCUtil.cpp @@ -28,6 +28,7 @@ namespace DSPInterpreter { void Update_SR_Register64(s64 _Value) { + // TODO: Should also set 0x10 and 0x01 g_dsp.r[DSP_REG_SR] &= ~SR_CMP_MASK; if (_Value < 0) @@ -40,17 +41,20 @@ void Update_SR_Register64(s64 _Value) g_dsp.r[DSP_REG_SR] |= SR_ARITH_ZERO; } - // weird - if ((_Value >> 62) == 0) + // Checks if top bits are equal, what is it good for? + if ((_Value >> 62) == 0 || _Value >> 62 == 3) { - g_dsp.r[DSP_REG_SR] |= 0x20; + g_dsp.r[DSP_REG_SR] |= SR_TOP2BITS; } } + void Update_SR_Register16(s16 _Value) { g_dsp.r[DSP_REG_SR] &= ~SR_CMP_MASK; + // Only sets those 3 bits + if (_Value < 0) { g_dsp.r[DSP_REG_SR] |= SR_SIGN; @@ -61,10 +65,10 @@ void Update_SR_Register16(s16 _Value) g_dsp.r[DSP_REG_SR] |= SR_ARITH_ZERO; } - // weird - if ((_Value >> 14) == 0) + // Checks if top bits are equal, what is it good for? + if ((_Value >> 14) == 0 || _Value >> 14 == 3) { - g_dsp.r[DSP_REG_SR] |= 0x20; + g_dsp.r[DSP_REG_SR] |= SR_TOP2BITS; } } diff --git a/Source/Core/DSPCore/Src/DspIntArithmetic.cpp b/Source/Core/DSPCore/Src/DspIntArithmetic.cpp index 00c89bee35..ad517a28e5 100644 --- a/Source/Core/DSPCore/Src/DspIntArithmetic.cpp +++ b/Source/Core/DSPCore/Src/DspIntArithmetic.cpp @@ -461,7 +461,7 @@ void addax(const UDSPInstruction& opc) // ADDR $acD.M, $axS.L // 0100 0ssd xxxx xxxx -// Adds register $axS.L to accumulator $acD register. +// Adds register $axS.L to accumulator $acD.M register. void addr(const UDSPInstruction& opc) { u8 areg = (opc.hex >> 8) & 0x1;