diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Plugin_DSP_LLE_Test.vcproj b/Source/Plugins/Plugin_DSP_LLE-testing/Plugin_DSP_LLE_Test.vcproj index f4a29ab62a..2336fd2740 100644 --- a/Source/Plugins/Plugin_DSP_LLE-testing/Plugin_DSP_LLE_Test.vcproj +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Plugin_DSP_LLE_Test.vcproj @@ -630,6 +630,14 @@ RelativePath=".\Src\gdsp_aram.h" > + + + + diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.cpp b/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.cpp index 68638d0187..94600fd50b 100644 --- a/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.cpp +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.cpp @@ -22,144 +22,13 @@ #include "Globals.h" #include "gdsp_memory.h" #include "gdsp_interpreter.h" +#include "gdsp_condition_codes.h" #include "gdsp_registers.h" #include "gdsp_opcodes_helper.h" #include "gdsp_ext_op.h" namespace DSPInterpreter { -// HELPER FUNCTIONS - -void Update_SR_Register(s64 _Value) -{ - g_dsp.r[R_SR] &= ~SR_CMP_MASK; - - if (_Value < 0) - { - g_dsp.r[R_SR] |= 0x8; - } - - if (_Value == 0) - { - g_dsp.r[R_SR] |= 0x4; - } - - // logic - if ((_Value >> 62) == 0) - { - g_dsp.r[R_SR] |= 0x20; - } -} - -void Update_SR_Register(s16 _Value) -{ - g_dsp.r[R_SR] &= ~SR_CMP_MASK; - - if (_Value < 0) - { - g_dsp.r[R_SR] |= 0x8; - } - - if (_Value == 0) - { - g_dsp.r[R_SR] |= 0x4; - } - - // logic - if ((_Value >> 14) == 0) - { - g_dsp.r[R_SR] |= 0x20; - } -} - -s8 GetMultiplyModifier() -{ - if (g_dsp.r[R_SR] & (1 << 13)) - { - return(1); - } - return 2; -} - - -// 0x02 - overflow???? -// 0x04 - Zero bit -// 0x08 - Sign bit -// 0x40 - Logical Zero bit -bool CheckCondition(u8 _Condition) -{ - bool taken = false; - switch (_Condition & 0xf) - { - case 0x0: //NS - NOT SIGN - - if (!(g_dsp.r[R_SR] & 0x08)) - taken = true; - break; - - case 0x1: // S - SIGN - - if (g_dsp.r[R_SR] & 0x08) - taken = true; - break; - - case 0x2: // G - GREATER - - if ( (!(g_dsp.r[R_SR] & 0x02) || !(g_dsp.r[R_SR] & 0x04)) && !(g_dsp.r[R_SR] & 0x08)) - taken = true; - break; - - case 0x3: // LE - LESS EQUAL - if ((g_dsp.r[R_SR] & 0x02) || (g_dsp.r[R_SR] & 0x04) || (g_dsp.r[R_SR] & 0x08)) - taken = true; - break; - - case 0x4: // NZ - NOT ZERO - - if (!(g_dsp.r[R_SR] & 0x04)) - taken = true; - break; - - case 0x5: // Z - ZERO - - if (g_dsp.r[R_SR] & 0x04) - taken = true; - break; - - case 0x6: // L - LESS - if ((g_dsp.r[R_SR] & 0x02) || (g_dsp.r[R_SR] & 0x08)) - taken = true; - break; - - case 0x7: // GE - GREATER EQUAL - if ( (!(g_dsp.r[R_SR] & 0x02) || (g_dsp.r[R_SR] & 0x04)) && !(g_dsp.r[R_SR] & 0x08)) - break; - - case 0xc: // LNZ - LOGIC NOT ZERO - - if (!(g_dsp.r[R_SR] & 0x40)) - taken = true; - - break; - - case 0xd: // LZ - LOGIC ZERO - - if (g_dsp.r[R_SR] & 0x40) - taken = true; - - break; - - case 0xf: // Empty - taken = true; - break; - - default: - ERROR_LOG(DSPHLE, "Unknown condition check: 0x%04x\n", _Condition & 0xf); - break; - } - - return(taken); -} // END OF HELPER FUNCTIONS diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Src/SConscript b/Source/Plugins/Plugin_DSP_LLE-testing/Src/SConscript index 10f52bf861..d295351c0d 100644 --- a/Source/Plugins/Plugin_DSP_LLE-testing/Src/SConscript +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Src/SConscript @@ -15,6 +15,7 @@ files = [ "DSPConfigDlgLLE.cpp", "disassemble.cpp", "gdsp_aram.cpp", + "gdsp_condition_codes.cpp", "gdsp_ext_op.cpp", "gdsp_interface.cpp", "gdsp_interpreter.cpp", diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Src/gdsp_condition_codes.cpp b/Source/Plugins/Plugin_DSP_LLE-testing/Src/gdsp_condition_codes.cpp new file mode 100644 index 0000000000..123e763a99 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Src/gdsp_condition_codes.cpp @@ -0,0 +1,160 @@ +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +// Additional copyrights go to Duddie and Tratax (c) 2004 + + +// HELPER FUNCTIONS + +#include "gdsp_condition_codes.h" +#include "gdsp_interpreter.h" +#include "DSPInterpreter.h" + +namespace DSPInterpreter { + +void Update_SR_Register(s64 _Value) +{ + g_dsp.r[R_SR] &= ~SR_CMP_MASK; + + if (_Value < 0) + { + g_dsp.r[R_SR] |= 0x8; + } + + if (_Value == 0) + { + g_dsp.r[R_SR] |= 0x4; + } + + // logic + if ((_Value >> 62) == 0) + { + g_dsp.r[R_SR] |= 0x20; + } +} + +void Update_SR_Register(s16 _Value) +{ + g_dsp.r[R_SR] &= ~SR_CMP_MASK; + + if (_Value < 0) + { + g_dsp.r[R_SR] |= 0x8; + } + + if (_Value == 0) + { + g_dsp.r[R_SR] |= 0x4; + } + + // logic + if ((_Value >> 14) == 0) + { + g_dsp.r[R_SR] |= 0x20; + } +} + +s8 GetMultiplyModifier() +{ + if (g_dsp.r[R_SR] & (1 << 13)) + { + return(1); + } + return 2; +} + + +// 0x02 - overflow???? +// 0x04 - Zero bit +// 0x08 - Sign bit +// 0x40 - Logical Zero bit +bool CheckCondition(u8 _Condition) +{ + bool taken = false; + switch (_Condition & 0xf) + { + case 0x0: //NS - NOT SIGN + + if (!(g_dsp.r[R_SR] & 0x08)) + taken = true; + break; + + case 0x1: // S - SIGN + + if (g_dsp.r[R_SR] & 0x08) + taken = true; + break; + + case 0x2: // G - GREATER + + if ( (!(g_dsp.r[R_SR] & 0x02) || !(g_dsp.r[R_SR] & 0x04)) && !(g_dsp.r[R_SR] & 0x08)) + taken = true; + break; + + case 0x3: // LE - LESS EQUAL + if ((g_dsp.r[R_SR] & 0x02) || (g_dsp.r[R_SR] & 0x04) || (g_dsp.r[R_SR] & 0x08)) + taken = true; + break; + + case 0x4: // NZ - NOT ZERO + + if (!(g_dsp.r[R_SR] & 0x04)) + taken = true; + break; + + case 0x5: // Z - ZERO + + if (g_dsp.r[R_SR] & 0x04) + taken = true; + break; + + case 0x6: // L - LESS + if ((g_dsp.r[R_SR] & 0x02) || (g_dsp.r[R_SR] & 0x08)) + taken = true; + break; + + case 0x7: // GE - GREATER EQUAL + if ( (!(g_dsp.r[R_SR] & 0x02) || (g_dsp.r[R_SR] & 0x04)) && !(g_dsp.r[R_SR] & 0x08)) + break; + + case 0xc: // LNZ - LOGIC NOT ZERO + + if (!(g_dsp.r[R_SR] & 0x40)) + taken = true; + + break; + + case 0xd: // LZ - LOGIC ZERO + + if (g_dsp.r[R_SR] & 0x40) + taken = true; + + break; + + case 0xf: // Empty + taken = true; + break; + + default: + ERROR_LOG(DSPHLE, "Unknown condition check: 0x%04x\n", _Condition & 0xf); + break; + } + + return taken; +} + +} // namespace \ No newline at end of file diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Src/gdsp_condition_codes.h b/Source/Plugins/Plugin_DSP_LLE-testing/Src/gdsp_condition_codes.h new file mode 100644 index 0000000000..5877b2d409 --- /dev/null +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Src/gdsp_condition_codes.h @@ -0,0 +1,39 @@ +// Copyright (C) 2003-2009 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +// Additional copyrights go to Duddie and Tratax (c) 2004 + +#ifndef _GDSP_CONDITION_CODES_H +#define _GDSP_CONDITION_CODES_H + +// Anything to do with SR and conditions goes here. + +#include "Globals.h" + +#include "gdsp_registers.h" + +namespace DSPInterpreter { + +bool CheckCondition(u8 _Condition); +s8 GetMultiplyModifier(); + +void Update_SR_Register(s16 _Value); +void Update_SR_Register(s64 _Value); + +} // namespace + +#endif // _GDSP_CONDITION_CODES_H diff --git a/Source/Plugins/Plugin_DSP_LLE-testing/Src/gdsp_interpreter.cpp b/Source/Plugins/Plugin_DSP_LLE-testing/Src/gdsp_interpreter.cpp index ee1b3b97a7..f962b6ce1b 100644 --- a/Source/Plugins/Plugin_DSP_LLE-testing/Src/gdsp_interpreter.cpp +++ b/Source/Plugins/Plugin_DSP_LLE-testing/Src/gdsp_interpreter.cpp @@ -107,6 +107,9 @@ void gdsp_init() } // Fill roms with zeros. + memset(g_dsp.irom, 0, DSP_IROM_SIZE * sizeof(u16)); + memset(g_dsp.drom, 0, DSP_DROM_SIZE * sizeof(u16)); + memset(g_dsp.coef, 0, DSP_COEF_SIZE * sizeof(u16)); for (int i = 0; i < 32; i++) {