Merge pull request #4538 from lioncash/dsptables
DSPTables: Move interpreter specifics into DSPInterpreter
This commit is contained in:
commit
1068d24c09
|
@ -3,6 +3,8 @@
|
|||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include "Core/DSP/DSPDisassembler.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstdlib>
|
||||
#include <fstream>
|
||||
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue