diff options
| author | nakeee <nakeee@gmail.com> | 2009-08-10 09:20:12 +0000 |
|---|---|---|
| committer | nakeee <nakeee@gmail.com> | 2009-08-10 09:20:12 +0000 |
| commit | 13a901146f3939d53ecc18791bd2174d60d8384f (patch) | |
| tree | 18c45151fea2ed6fb95b3eccc8628d9f1b33d485 /Source/Core/DSPCore/Src/DSPIntExtOps.cpp | |
| parent | 9f81006bda07b6268c84ff04b34b3347a58d2856 (diff) | |
DSPLLE:
- Extension fixes (Joined work with LM)
- Shuffle fix for my off by one error
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3958 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/DSPCore/Src/DSPIntExtOps.cpp')
| -rw-r--r-- | Source/Core/DSPCore/Src/DSPIntExtOps.cpp | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/Source/Core/DSPCore/Src/DSPIntExtOps.cpp b/Source/Core/DSPCore/Src/DSPIntExtOps.cpp index 12432dc1ce..fcc50a6a61 100644 --- a/Source/Core/DSPCore/Src/DSPIntExtOps.cpp +++ b/Source/Core/DSPCore/Src/DSPIntExtOps.cpp @@ -49,6 +49,8 @@ namespace DSPInterpreter namespace Ext { +u16 cache1; + // DR $arR // xxxx xxxx 0000 01rr // Decrement addressing register $arR. @@ -77,12 +79,20 @@ void nr(const UDSPInstruction& opc) { // Move value of $acS.l to the $axD.l. void mv(const UDSPInstruction& opc) { - u8 sreg = opc.hex & 0x3; - u8 dreg = ((opc.hex >> 2) & 0x3); - - g_dsp.r[dreg + DSP_REG_AXL0] = g_dsp.r[sreg + DSP_REG_ACC0]; + u8 sreg = opc.hex & 0x3; + + cache1 = g_dsp.r[sreg + DSP_REG_ACC0]; + + currentEpilogeFunc = mv_epi; } +void mv_epi(const UDSPInstruction& opc) +{ + u8 dreg = ((opc.hex >> 2) & 0x3); + + g_dsp.r[dreg + DSP_REG_AXL0] = cache1; +} + // S @$D, $acD.l // xxxx xxxx 001s s0dd // Store value of $(acS.l) in the memory pointed by register $D. @@ -122,7 +132,6 @@ void sn_epi(const UDSPInstruction& opc) { u8 dreg = opc.hex & 0x3; - dsp_increase_addr_reg(dreg, (s16)g_dsp.r[DSP_REG_IX0 + dreg]); } @@ -133,11 +142,17 @@ void sn_epi(const UDSPInstruction& opc) void l(const UDSPInstruction& opc) { u8 sreg = opc.hex & 0x3; - u8 dreg = ((opc.hex >> 3) & 0x7) + DSP_REG_AXL0; - u16 val = dsp_dmem_read(g_dsp.r[sreg]); - g_dsp.r[dreg] = val; + cache1 = dsp_dmem_read(g_dsp.r[sreg]); + currentEpilogeFunc = l_epi; +} + +void l_epi(const UDSPInstruction& opc) { + u8 sreg = opc.hex & 0x3; + u8 dreg = ((opc.hex >> 3) & 0x7) + DSP_REG_AXL0; + + g_dsp.r[dreg] = cache1; dsp_increment_addr_reg(sreg); } @@ -150,9 +165,16 @@ void ln(const UDSPInstruction& opc) u8 sreg = opc.hex & 0x3; u8 dreg = ((opc.hex >> 3) & 0x7) + DSP_REG_AXL0; - u16 val = dsp_dmem_read(g_dsp.r[sreg]); - g_dsp.r[dreg] = val; + cache1 = dsp_dmem_read(g_dsp.r[sreg]); + + currentEpilogeFunc = ln_epi; +} +void ln_epi(const UDSPInstruction& opc) +{ + u8 sreg = opc.hex & 0x3; + u8 dreg = ((opc.hex >> 3) & 0x7) + DSP_REG_AXL0; + g_dsp.r[dreg] = cache1; dsp_increase_addr_reg(sreg, (s16)g_dsp.r[DSP_REG_IX0 + sreg]); } |
