- 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
This commit is contained in:
nakeee 2009-08-10 09:20:12 +00:00
parent 9f81006bda
commit 13a901146f
4 changed files with 41 additions and 16 deletions

View File

@ -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;
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;
u16 val = dsp_dmem_read(g_dsp.r[sreg]);
g_dsp.r[dreg] = val;
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]);
}

View File

@ -39,7 +39,9 @@ namespace DSPInterpreter
namespace Ext
{
void l(const UDSPInstruction& opc);
void l_epi(const UDSPInstruction& opc);
void ln(const UDSPInstruction& opc);
void ln_epi(const UDSPInstruction& opc);
void ls(const UDSPInstruction& opc);
void lsn(const UDSPInstruction& opc);
void lsm(const UDSPInstruction& opc);
@ -65,6 +67,7 @@ void ldn(const UDSPInstruction& opc);
void ldm(const UDSPInstruction& opc);
void ldnm(const UDSPInstruction& opc);
void mv(const UDSPInstruction& opc);
void mv_epi(const UDSPInstruction& opc);
void dr(const UDSPInstruction& opc);
void ir(const UDSPInstruction& opc);
void nr(const UDSPInstruction& opc);

View File

@ -66,8 +66,8 @@ enum partype_t
#define P_EXT 0x80
#define OPTABLE_SIZE 65536
#define EXT_OPTABLE_SIZE 0xff
#define OPTABLE_SIZE 0xffff + 1
#define EXT_OPTABLE_SIZE 0xff + 1
union UDSPInstruction
{

View File

@ -459,9 +459,9 @@ void addax(const UDSPInstruction& opc)
Update_SR_Register64(acc);
}
// ADDR $acD, $(DSP_REG_AXL0+S)
// ADDR $acD.M, $axS.L
// 0100 0ssd xxxx xxxx
// Adds register $(DSP_REG_AXL0+S) to accumulator $acD register.
// Adds register $axS.L to accumulator $acD register.
void addr(const UDSPInstruction& opc)
{
u8 areg = (opc.hex >> 8) & 0x1;
@ -477,9 +477,9 @@ void addr(const UDSPInstruction& opc)
Update_SR_Register64(acc);
}
// SUBR $acD, $(DSP_REG_AXL0+S)
// SUBR $acD.M, $axS.L
// 0101 0ssd xxxx xxxx
// Subtracts register $(DSP_REG_AXL0+S) from accumulator $acD register.
// Subtracts register $axS.L from accumulator $acD.M register.
void subr(const UDSPInstruction& opc)
{
u8 areg = (opc.hex >> 8) & 0x1;