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
This commit is contained in:
parent
9f81006bda
commit
13a901146f
|
@ -49,6 +49,8 @@ namespace DSPInterpreter
|
||||||
namespace Ext
|
namespace Ext
|
||||||
{
|
{
|
||||||
|
|
||||||
|
u16 cache1;
|
||||||
|
|
||||||
// DR $arR
|
// DR $arR
|
||||||
// xxxx xxxx 0000 01rr
|
// xxxx xxxx 0000 01rr
|
||||||
// Decrement addressing register $arR.
|
// Decrement addressing register $arR.
|
||||||
|
@ -77,12 +79,20 @@ void nr(const UDSPInstruction& opc) {
|
||||||
// Move value of $acS.l to the $axD.l.
|
// Move value of $acS.l to the $axD.l.
|
||||||
void mv(const UDSPInstruction& opc)
|
void mv(const UDSPInstruction& opc)
|
||||||
{
|
{
|
||||||
u8 sreg = opc.hex & 0x3;
|
u8 sreg = opc.hex & 0x3;
|
||||||
u8 dreg = ((opc.hex >> 2) & 0x3);
|
|
||||||
|
cache1 = g_dsp.r[sreg + DSP_REG_ACC0];
|
||||||
g_dsp.r[dreg + DSP_REG_AXL0] = 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
|
// S @$D, $acD.l
|
||||||
// xxxx xxxx 001s s0dd
|
// xxxx xxxx 001s s0dd
|
||||||
// Store value of $(acS.l) in the memory pointed by register $D.
|
// 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;
|
u8 dreg = opc.hex & 0x3;
|
||||||
|
|
||||||
|
|
||||||
dsp_increase_addr_reg(dreg, (s16)g_dsp.r[DSP_REG_IX0 + dreg]);
|
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)
|
void l(const UDSPInstruction& opc)
|
||||||
{
|
{
|
||||||
u8 sreg = opc.hex & 0x3;
|
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;
|
u8 dreg = ((opc.hex >> 3) & 0x7) + DSP_REG_AXL0;
|
||||||
|
|
||||||
u16 val = dsp_dmem_read(g_dsp.r[sreg]);
|
g_dsp.r[dreg] = cache1;
|
||||||
g_dsp.r[dreg] = val;
|
|
||||||
|
|
||||||
dsp_increment_addr_reg(sreg);
|
dsp_increment_addr_reg(sreg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,9 +165,16 @@ void ln(const UDSPInstruction& opc)
|
||||||
u8 sreg = opc.hex & 0x3;
|
u8 sreg = opc.hex & 0x3;
|
||||||
u8 dreg = ((opc.hex >> 3) & 0x7) + DSP_REG_AXL0;
|
u8 dreg = ((opc.hex >> 3) & 0x7) + DSP_REG_AXL0;
|
||||||
|
|
||||||
u16 val = dsp_dmem_read(g_dsp.r[sreg]);
|
cache1 = dsp_dmem_read(g_dsp.r[sreg]);
|
||||||
g_dsp.r[dreg] = val;
|
|
||||||
|
|
||||||
|
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]);
|
dsp_increase_addr_reg(sreg, (s16)g_dsp.r[DSP_REG_IX0 + sreg]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,9 @@ namespace DSPInterpreter
|
||||||
namespace Ext
|
namespace Ext
|
||||||
{
|
{
|
||||||
void l(const UDSPInstruction& opc);
|
void l(const UDSPInstruction& opc);
|
||||||
|
void l_epi(const UDSPInstruction& opc);
|
||||||
void ln(const UDSPInstruction& opc);
|
void ln(const UDSPInstruction& opc);
|
||||||
|
void ln_epi(const UDSPInstruction& opc);
|
||||||
void ls(const UDSPInstruction& opc);
|
void ls(const UDSPInstruction& opc);
|
||||||
void lsn(const UDSPInstruction& opc);
|
void lsn(const UDSPInstruction& opc);
|
||||||
void lsm(const UDSPInstruction& opc);
|
void lsm(const UDSPInstruction& opc);
|
||||||
|
@ -65,6 +67,7 @@ void ldn(const UDSPInstruction& opc);
|
||||||
void ldm(const UDSPInstruction& opc);
|
void ldm(const UDSPInstruction& opc);
|
||||||
void ldnm(const UDSPInstruction& opc);
|
void ldnm(const UDSPInstruction& opc);
|
||||||
void mv(const UDSPInstruction& opc);
|
void mv(const UDSPInstruction& opc);
|
||||||
|
void mv_epi(const UDSPInstruction& opc);
|
||||||
void dr(const UDSPInstruction& opc);
|
void dr(const UDSPInstruction& opc);
|
||||||
void ir(const UDSPInstruction& opc);
|
void ir(const UDSPInstruction& opc);
|
||||||
void nr(const UDSPInstruction& opc);
|
void nr(const UDSPInstruction& opc);
|
||||||
|
|
|
@ -66,8 +66,8 @@ enum partype_t
|
||||||
|
|
||||||
#define P_EXT 0x80
|
#define P_EXT 0x80
|
||||||
|
|
||||||
#define OPTABLE_SIZE 65536
|
#define OPTABLE_SIZE 0xffff + 1
|
||||||
#define EXT_OPTABLE_SIZE 0xff
|
#define EXT_OPTABLE_SIZE 0xff + 1
|
||||||
|
|
||||||
union UDSPInstruction
|
union UDSPInstruction
|
||||||
{
|
{
|
||||||
|
|
|
@ -459,9 +459,9 @@ void addax(const UDSPInstruction& opc)
|
||||||
Update_SR_Register64(acc);
|
Update_SR_Register64(acc);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ADDR $acD, $(DSP_REG_AXL0+S)
|
// ADDR $acD.M, $axS.L
|
||||||
// 0100 0ssd xxxx xxxx
|
// 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)
|
void addr(const UDSPInstruction& opc)
|
||||||
{
|
{
|
||||||
u8 areg = (opc.hex >> 8) & 0x1;
|
u8 areg = (opc.hex >> 8) & 0x1;
|
||||||
|
@ -477,9 +477,9 @@ void addr(const UDSPInstruction& opc)
|
||||||
Update_SR_Register64(acc);
|
Update_SR_Register64(acc);
|
||||||
}
|
}
|
||||||
|
|
||||||
// SUBR $acD, $(DSP_REG_AXL0+S)
|
// SUBR $acD.M, $axS.L
|
||||||
// 0101 0ssd xxxx xxxx
|
// 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)
|
void subr(const UDSPInstruction& opc)
|
||||||
{
|
{
|
||||||
u8 areg = (opc.hex >> 8) & 0x1;
|
u8 areg = (opc.hex >> 8) & 0x1;
|
||||||
|
|
Loading…
Reference in New Issue