diff --git a/Source/Core/Core/DSP/DSPDisassembler.cpp b/Source/Core/Core/DSP/DSPDisassembler.cpp index a58a273ec4..30f8cd96bf 100644 --- a/Source/Core/Core/DSP/DSPDisassembler.cpp +++ b/Source/Core/Core/DSP/DSPDisassembler.cpp @@ -3,6 +3,8 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. +#include "Core/DSP/DSPDisassembler.h" + #include #include #include @@ -12,7 +14,7 @@ #include "Common/FileUtil.h" #include "Common/StringUtil.h" -#include "Core/DSP/DSPDisassembler.h" +#include "Core/DSP/DSPInterpreter.h" #include "Core/DSP/DSPTables.h" DSPDisassembler::DSPDisassembler(const AssemblerSettings& settings) : settings_(settings) @@ -192,9 +194,10 @@ bool DSPDisassembler::DisassembleOpcode(const u16* binbuf, int base_addr, int pa break; } } - const DSPOPCTemplate fake_op = { - "CW", 0x0000, 0x0000, nop, nullptr, 1, 1, {{P_VAL, 2, 0, 0, 0xffff}}, - false, false, false, false, false}; + const DSPOPCTemplate fake_op = {"CW", 0x0000, 0x0000, DSPInterpreter::nop, + nullptr, 1, 1, {{P_VAL, 2, 0, 0, 0xffff}}, + false, false, false, false, + false}; if (!opc) opc = &fake_op; diff --git a/Source/Core/Core/DSP/DSPInterpreter.cpp b/Source/Core/Core/DSP/DSPInterpreter.cpp index 852007570e..1f1bb3f7b3 100644 --- a/Source/Core/Core/DSP/DSPInterpreter.cpp +++ b/Source/Core/Core/DSP/DSPInterpreter.cpp @@ -4,17 +4,41 @@ // Refer to the license.txt file included. #include "Core/DSP/DSPInterpreter.h" + +#include "Common/CommonTypes.h" +#include "Common/Logging/Log.h" + #include "Core/DSP/DSPAnalyzer.h" #include "Core/DSP/DSPCore.h" -#include "Core/DSP/DSPHWInterface.h" -#include "Core/DSP/DSPIntUtil.h" #include "Core/DSP/DSPMemoryMap.h" #include "Core/DSP/DSPTables.h" namespace DSPInterpreter { -// NOTE: These have nothing to do with g_dsp.r.cr ! +namespace +{ +void ExecuteInstruction(const UDSPInstruction inst) +{ + const DSPOPCTemplate* opcode_template = GetOpTemplate(inst); + if (opcode_template->extended) + { + if ((inst >> 12) == 0x3) + extOpTable[inst & 0x7F]->intFunc(inst); + else + extOpTable[inst & 0xFF]->intFunc(inst); + } + + opcode_template->intFunc(inst); + + if (opcode_template->extended) + { + applyWriteBackLog(); + } +} +} // Anonymous namespace + +// NOTE: These have nothing to do with g_dsp.r.cr ! void WriteCR(u16 val) { // reset @@ -205,4 +229,13 @@ int RunCycles(int cycles) } } +void nop(const UDSPInstruction opc) +{ + // The real nop is 0. Anything else is bad. + if (opc == 0) + return; + + ERROR_LOG(DSPLLE, "LLE: Unrecognized opcode 0x%04x", opc); +} + } // namespace diff --git a/Source/Core/Core/DSP/DSPInterpreter.h b/Source/Core/Core/DSP/DSPInterpreter.h index 541b07b04f..25153a449c 100644 --- a/Source/Core/Core/DSP/DSPInterpreter.h +++ b/Source/Core/Core/DSP/DSPInterpreter.h @@ -26,123 +26,124 @@ void WriteCR(u16 val); u16 ReadCR(); // All the opcode functions. -void call(const UDSPInstruction opc); -void callr(const UDSPInstruction opc); -void ifcc(const UDSPInstruction opc); -void jcc(const UDSPInstruction opc); -void jmprcc(const UDSPInstruction opc); -void ret(const UDSPInstruction opc); -void halt(const UDSPInstruction opc); -void loop(const UDSPInstruction opc); -void loopi(const UDSPInstruction opc); +void abs(const UDSPInstruction opc); +void add(const UDSPInstruction opc); +void addarn(const UDSPInstruction opc); +void addax(const UDSPInstruction opc); +void addaxl(const UDSPInstruction opc); +void addi(const UDSPInstruction opc); +void addis(const UDSPInstruction opc); +void addp(const UDSPInstruction opc); +void addpaxz(const UDSPInstruction opc); +void addr(const UDSPInstruction opc); +void andc(const UDSPInstruction opc); +void andcf(const UDSPInstruction opc); +void andf(const UDSPInstruction opc); +void andi(const UDSPInstruction opc); +void andr(const UDSPInstruction opc); +void asl(const UDSPInstruction opc); +void asr(const UDSPInstruction opc); +void asr16(const UDSPInstruction opc); +void asrn(const UDSPInstruction opc); +void asrnr(const UDSPInstruction opc); +void asrnrx(const UDSPInstruction opc); void bloop(const UDSPInstruction opc); void bloopi(const UDSPInstruction opc); -void mrr(const UDSPInstruction opc); +void call(const UDSPInstruction opc); +void callr(const UDSPInstruction opc); +void clr(const UDSPInstruction opc); +void clrl(const UDSPInstruction opc); +void clrp(const UDSPInstruction opc); +void cmp(const UDSPInstruction opc); +void cmpar(const UDSPInstruction opc); +void cmpi(const UDSPInstruction opc); +void cmpis(const UDSPInstruction opc); +void dar(const UDSPInstruction opc); +void dec(const UDSPInstruction opc); +void decm(const UDSPInstruction opc); +void halt(const UDSPInstruction opc); +void iar(const UDSPInstruction opc); +void ifcc(const UDSPInstruction opc); +void ilrr(const UDSPInstruction opc); +void ilrrd(const UDSPInstruction opc); +void ilrri(const UDSPInstruction opc); +void ilrrn(const UDSPInstruction opc); +void inc(const UDSPInstruction opc); +void incm(const UDSPInstruction opc); +void jcc(const UDSPInstruction opc); +void jmprcc(const UDSPInstruction opc); +void loop(const UDSPInstruction opc); +void loopi(const UDSPInstruction opc); +void lr(const UDSPInstruction opc); +void lri(const UDSPInstruction opc); +void lris(const UDSPInstruction opc); void lrr(const UDSPInstruction opc); void lrrd(const UDSPInstruction opc); void lrri(const UDSPInstruction opc); void lrrn(const UDSPInstruction opc); -void srr(const UDSPInstruction opc); -void srrd(const UDSPInstruction opc); -void srri(const UDSPInstruction opc); -void srrn(const UDSPInstruction opc); -void lri(const UDSPInstruction opc); -void lris(const UDSPInstruction opc); -void lr(const UDSPInstruction opc); -void sr(const UDSPInstruction opc); -void si(const UDSPInstruction opc); -void tstaxh(const UDSPInstruction opc); -void clr(const UDSPInstruction opc); -void clrl(const UDSPInstruction opc); -void clrp(const UDSPInstruction opc); -void mulc(const UDSPInstruction opc); -void cmpar(const UDSPInstruction opc); -void cmp(const UDSPInstruction opc); -void tst(const UDSPInstruction opc); -void addaxl(const UDSPInstruction opc); -void addarn(const UDSPInstruction opc); -void mulcac(const UDSPInstruction opc); -void movr(const UDSPInstruction opc); -void movax(const UDSPInstruction opc); -void xorr(const UDSPInstruction opc); -void andr(const UDSPInstruction opc); -void orr(const UDSPInstruction opc); -void andc(const UDSPInstruction opc); -void orc(const UDSPInstruction opc); -void xorc(const UDSPInstruction opc); -void notc(const UDSPInstruction opc); -void lsrnrx(const UDSPInstruction opc); -void asrnrx(const UDSPInstruction opc); -void lsrnr(const UDSPInstruction opc); -void asrnr(const UDSPInstruction opc); -void add(const UDSPInstruction opc); -void addp(const UDSPInstruction opc); -void cmpis(const UDSPInstruction opc); -void addpaxz(const UDSPInstruction opc); -void movpz(const UDSPInstruction opc); -void decm(const UDSPInstruction opc); -void dec(const UDSPInstruction opc); -void inc(const UDSPInstruction opc); -void incm(const UDSPInstruction opc); -void neg(const UDSPInstruction opc); -void addax(const UDSPInstruction opc); -void addr(const UDSPInstruction opc); -void subr(const UDSPInstruction opc); -void subp(const UDSPInstruction opc); -void subax(const UDSPInstruction opc); -void addis(const UDSPInstruction opc); -void addi(const UDSPInstruction opc); -void lsl16(const UDSPInstruction opc); -void madd(const UDSPInstruction opc); -void msub(const UDSPInstruction opc); -void lsr16(const UDSPInstruction opc); -void asr16(const UDSPInstruction opc); +void lrs(const UDSPInstruction opc); void lsl(const UDSPInstruction opc); +void lsl16(const UDSPInstruction opc); void lsr(const UDSPInstruction opc); -void asl(const UDSPInstruction opc); -void asr(const UDSPInstruction opc); +void lsr16(const UDSPInstruction opc); void lsrn(const UDSPInstruction opc); -void asrn(const UDSPInstruction opc); -void dar(const UDSPInstruction opc); -void iar(const UDSPInstruction opc); -void subarn(const UDSPInstruction opc); -void sbclr(const UDSPInstruction opc); -void sbset(const UDSPInstruction opc); +void lsrnr(const UDSPInstruction opc); +void lsrnrx(const UDSPInstruction opc); +void madd(const UDSPInstruction opc); +void maddc(const UDSPInstruction opc); +void maddx(const UDSPInstruction opc); void mov(const UDSPInstruction opc); +void movax(const UDSPInstruction opc); +void movnp(const UDSPInstruction opc); void movp(const UDSPInstruction opc); +void movpz(const UDSPInstruction opc); +void movr(const UDSPInstruction opc); +void mrr(const UDSPInstruction opc); +void msub(const UDSPInstruction opc); +void msubc(const UDSPInstruction opc); +void msubx(const UDSPInstruction opc); void mul(const UDSPInstruction opc); void mulac(const UDSPInstruction opc); +void mulaxh(const UDSPInstruction opc); +void mulc(const UDSPInstruction opc); +void mulcac(const UDSPInstruction opc); +void mulcmv(const UDSPInstruction opc); +void mulcmvz(const UDSPInstruction opc); void mulmv(const UDSPInstruction opc); void mulmvz(const UDSPInstruction opc); void mulx(const UDSPInstruction opc); void mulxac(const UDSPInstruction opc); void mulxmv(const UDSPInstruction opc); void mulxmvz(const UDSPInstruction opc); -void mulcmvz(const UDSPInstruction opc); -void mulcmv(const UDSPInstruction opc); -void movnp(const UDSPInstruction opc); -void sub(const UDSPInstruction opc); -void maddx(const UDSPInstruction opc); -void msubx(const UDSPInstruction opc); -void maddc(const UDSPInstruction opc); -void msubc(const UDSPInstruction opc); -void srs(const UDSPInstruction opc); -void lrs(const UDSPInstruction opc); +void neg(const UDSPInstruction opc); +void nop(const UDSPInstruction opc); +void notc(const UDSPInstruction opc); void nx(const UDSPInstruction opc); -void cmpi(const UDSPInstruction opc); -void rti(const UDSPInstruction opc); -void ilrr(const UDSPInstruction opc); -void ilrrd(const UDSPInstruction opc); -void ilrri(const UDSPInstruction opc); -void ilrrn(const UDSPInstruction opc); -void andcf(const UDSPInstruction opc); -void andf(const UDSPInstruction opc); -void xori(const UDSPInstruction opc); -void andi(const UDSPInstruction opc); +void orc(const UDSPInstruction opc); void ori(const UDSPInstruction opc); +void orr(const UDSPInstruction opc); +void ret(const UDSPInstruction opc); +void rti(const UDSPInstruction opc); +void sbclr(const UDSPInstruction opc); +void sbset(const UDSPInstruction opc); +void si(const UDSPInstruction opc); +void sr(const UDSPInstruction opc); void srbith(const UDSPInstruction opc); -void mulaxh(const UDSPInstruction opc); +void srr(const UDSPInstruction opc); +void srrd(const UDSPInstruction opc); +void srri(const UDSPInstruction opc); +void srrn(const UDSPInstruction opc); +void srs(const UDSPInstruction opc); +void sub(const UDSPInstruction opc); +void subarn(const UDSPInstruction opc); +void subax(const UDSPInstruction opc); +void subp(const UDSPInstruction opc); +void subr(const UDSPInstruction opc); +void tst(const UDSPInstruction opc); +void tstaxh(const UDSPInstruction opc); void tstprod(const UDSPInstruction opc); -void abs(const UDSPInstruction opc); +void xorc(const UDSPInstruction opc); +void xori(const UDSPInstruction opc); +void xorr(const UDSPInstruction opc); } // namespace diff --git a/Source/Core/Core/DSP/DSPTables.cpp b/Source/Core/Core/DSP/DSPTables.cpp index ed638f5f1a..66f277be00 100644 --- a/Source/Core/Core/DSP/DSPTables.cpp +++ b/Source/Core/Core/DSP/DSPTables.cpp @@ -11,21 +11,12 @@ #include "Core/DSP/DSPInterpreter.h" #include "Core/DSP/DSPTables.h" -void nop(const UDSPInstruction opc) -{ - // The real nop is 0. Anything else is bad. - if (opc) - { - ERROR_LOG(DSPLLE, "LLE: Unrecognized opcode 0x%04x", opc); - } -} - // clang-format off const DSPOPCTemplate opcodes[] = { // # of parameters----+ {type, size, loc, lshift, mask} branch reads PC // instruction approximation // name opcode mask interpreter function JIT function size-V V param 1 param 2 param 3 extendable uncond. updates SR - {"NOP", 0x0000, 0xfffc, nop, &DSPEmitter::nop, 1, 0, {}, false, false, false, false, false}, // no operation + {"NOP", 0x0000, 0xfffc, DSPInterpreter::nop, &DSPEmitter::nop, 1, 0, {}, false, false, false, false, false}, // no operation {"DAR", 0x0004, 0xfffc, DSPInterpreter::dar, &DSPEmitter::dar, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false, false, false, false, false}, // $arD-- {"IAR", 0x0008, 0xfffc, DSPInterpreter::iar, &DSPEmitter::iar, 1, 1, {{P_REG, 1, 0, 0, 0x0003}}, false, false, false, false, false}, // $arD++ @@ -293,7 +284,7 @@ const DSPOPCTemplate opcodes[] = }; const DSPOPCTemplate cw = - {"CW", 0x0000, 0x0000, nop, nullptr, 1, 1, {{P_VAL, 2, 0, 0, 0xffff}}, false, false, false, false, false}; + {"CW", 0x0000, 0x0000, DSPInterpreter::nop, nullptr, 1, 1, {{P_VAL, 2, 0, 0, 0xffff}}, false, false, false, false, false}; // extended opcodes diff --git a/Source/Core/Core/DSP/DSPTables.h b/Source/Core/Core/DSP/DSPTables.h index 9413a125c0..28b67d7fec 100644 --- a/Source/Core/Core/DSP/DSPTables.h +++ b/Source/Core/Core/DSP/DSPTables.h @@ -54,8 +54,6 @@ enum partype_t #define OPTABLE_SIZE 0xffff + 1 #define EXT_OPTABLE_SIZE 0xff + 1 -void nop(const UDSPInstruction opc); - typedef void (*dspIntFunc)(const UDSPInstruction); typedef void (DSPEmitter::*dspJitFunc)(const UDSPInstruction); @@ -125,23 +123,3 @@ void zeroWriteBackLog(); void zeroWriteBackLogPreserveAcc(u8 acc); const DSPOPCTemplate* GetOpTemplate(const UDSPInstruction& inst); - -inline void ExecuteInstruction(const UDSPInstruction inst) -{ - const DSPOPCTemplate* tinst = GetOpTemplate(inst); - - if (tinst->extended) - { - if ((inst >> 12) == 0x3) - extOpTable[inst & 0x7F]->intFunc(inst); - else - extOpTable[inst & 0xFF]->intFunc(inst); - } - - tinst->intFunc(inst); - - if (tinst->extended) - { - applyWriteBackLog(); - } -}