mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-22 22:00:39 -06:00
DSP LLE: MAJOR LLE revamp. Interpreter/JIT infrastructure done. Still left to mix and match the correct functions to the correct instruction hexcodes. More changes:
-Tagged unimplemented instructions and FIXME instructions in the DSP interpreter header -Expanded the DSP instruction union to be viewable as helpful instruction structures git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2817 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -588,18 +588,34 @@
|
|||||||
RelativePath=".\Src\disassemble.h"
|
RelativePath=".\Src\disassemble.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\Src\opcodes.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\Src\opcodes.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="DSP"
|
Name="DSP"
|
||||||
>
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\DSPInterpreter.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\DSPInterpreter.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\DSPJit.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\DSPJit.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\DSPTables.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Src\DSPTables.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Src\gdsp_aram.cpp"
|
RelativePath=".\Src\gdsp_aram.cpp"
|
||||||
>
|
>
|
||||||
@ -644,14 +660,6 @@
|
|||||||
RelativePath=".\Src\gdsp_memory.h"
|
RelativePath=".\Src\gdsp_memory.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\Src\gdsp_opcodes.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\Src\gdsp_opcodes.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\Src\gdsp_opcodes_helper.h"
|
RelativePath=".\Src\gdsp_opcodes_helper.h"
|
||||||
>
|
>
|
||||||
|
1376
Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.cpp
Normal file
1376
Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.cpp
Normal file
File diff suppressed because it is too large
Load Diff
133
Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.h
Normal file
133
Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPInterpreter.h
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
// Copyright (C) 2003-2009 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
#ifndef _DSPINTERPRETER_H
|
||||||
|
#define _DSPINTERPRETER_H
|
||||||
|
|
||||||
|
#include "DSPTables.h"
|
||||||
|
|
||||||
|
#define SR_CMP_MASK 0x3f
|
||||||
|
#define DSP_REG_MASK 0x1f
|
||||||
|
|
||||||
|
#define R_SR 0x13
|
||||||
|
#define FLAG_ENABLE_INTERUPT 11
|
||||||
|
|
||||||
|
namespace DSPInterpreter {
|
||||||
|
|
||||||
|
// GLOBAL HELPER FUNCTIONS
|
||||||
|
void Update_SR_Register(s64 _Value);
|
||||||
|
s8 GetMultiplyModifier();
|
||||||
|
// END OF HELPER FUNCTIONS
|
||||||
|
|
||||||
|
void unknown(UDSPInstruction& opc);
|
||||||
|
void call(UDSPInstruction& opc);
|
||||||
|
void ifcc(UDSPInstruction& opc);
|
||||||
|
void jcc(UDSPInstruction& opc);
|
||||||
|
void ret(UDSPInstruction& opc);
|
||||||
|
void halt(UDSPInstruction& opc);
|
||||||
|
void loop(UDSPInstruction& opc);
|
||||||
|
void loopi(UDSPInstruction& opc);
|
||||||
|
void bloop(UDSPInstruction& opc);
|
||||||
|
void bloopi(UDSPInstruction& opc);
|
||||||
|
void mrr(UDSPInstruction& opc);
|
||||||
|
void lrr(UDSPInstruction& opc);
|
||||||
|
void srr(UDSPInstruction& opc);
|
||||||
|
void lri(UDSPInstruction& opc);
|
||||||
|
void lris(UDSPInstruction& opc);
|
||||||
|
void lr(UDSPInstruction& opc);
|
||||||
|
void sr(UDSPInstruction& opc);
|
||||||
|
void si(UDSPInstruction& opc);
|
||||||
|
void tstaxh(UDSPInstruction& opc);
|
||||||
|
void clr(UDSPInstruction& opc);
|
||||||
|
void clrp(UDSPInstruction& opc);
|
||||||
|
void mulc(UDSPInstruction& opc);
|
||||||
|
void cmpar(UDSPInstruction& opc);
|
||||||
|
void cmp(UDSPInstruction& opc);
|
||||||
|
void tsta(UDSPInstruction& opc);
|
||||||
|
void addaxl(UDSPInstruction& opc);
|
||||||
|
void addarn(UDSPInstruction& opc);
|
||||||
|
void mulcac(UDSPInstruction& opc);
|
||||||
|
void movr(UDSPInstruction& opc);
|
||||||
|
void movax(UDSPInstruction& opc);
|
||||||
|
void xorr(UDSPInstruction& opc);
|
||||||
|
void andr(UDSPInstruction& opc);
|
||||||
|
void orr(UDSPInstruction& opc);
|
||||||
|
void andc(UDSPInstruction& opc);
|
||||||
|
void add(UDSPInstruction& opc);
|
||||||
|
void addp(UDSPInstruction& opc);
|
||||||
|
void cmpis(UDSPInstruction& opc);
|
||||||
|
void addpaxz(UDSPInstruction& opc);
|
||||||
|
void movpz(UDSPInstruction& opc);
|
||||||
|
void decm(UDSPInstruction& opc);
|
||||||
|
void dec(UDSPInstruction& opc);
|
||||||
|
void inc(UDSPInstruction& opc);
|
||||||
|
void incm(UDSPInstruction& opc);
|
||||||
|
void neg(UDSPInstruction& opc);
|
||||||
|
void addax(UDSPInstruction& opc);
|
||||||
|
void addr(UDSPInstruction& opc);
|
||||||
|
void subr(UDSPInstruction& opc);
|
||||||
|
void subax(UDSPInstruction& opc);
|
||||||
|
void addis(UDSPInstruction& opc);
|
||||||
|
void addi(UDSPInstruction& opc);
|
||||||
|
void lsl16(UDSPInstruction& opc);
|
||||||
|
void madd(UDSPInstruction& opc);
|
||||||
|
void lsr16(UDSPInstruction& opc);
|
||||||
|
void asr16(UDSPInstruction& opc);
|
||||||
|
void shifti(UDSPInstruction& opc);
|
||||||
|
void dar(UDSPInstruction& opc);
|
||||||
|
void iar(UDSPInstruction& opc);
|
||||||
|
void sbclr(UDSPInstruction& opc);
|
||||||
|
void sbset(UDSPInstruction& opc);
|
||||||
|
void movp(UDSPInstruction& opc);
|
||||||
|
void mul(UDSPInstruction& opc);
|
||||||
|
void mulac(UDSPInstruction& opc);
|
||||||
|
void mulmv(UDSPInstruction& opc);
|
||||||
|
void mulmvz(UDSPInstruction& opc);
|
||||||
|
void mulx(UDSPInstruction& opc);
|
||||||
|
void mulxac(UDSPInstruction& opc);
|
||||||
|
void mulxmv(UDSPInstruction& opc);
|
||||||
|
void mulxmvz(UDSPInstruction& opc);
|
||||||
|
void sub(UDSPInstruction& opc);
|
||||||
|
void maddx(UDSPInstruction& opc);
|
||||||
|
void msubx(UDSPInstruction& opc);
|
||||||
|
void maddc(UDSPInstruction& opc);
|
||||||
|
void msubc(UDSPInstruction& opc);
|
||||||
|
|
||||||
|
|
||||||
|
// FIXME inside
|
||||||
|
void jmpa(UDSPInstruction& opc);
|
||||||
|
void rti(UDSPInstruction& opc);
|
||||||
|
void ilrr(UDSPInstruction& opc);
|
||||||
|
void srbith(UDSPInstruction& opc);
|
||||||
|
|
||||||
|
void andfc(UDSPInstruction& opc);
|
||||||
|
void andf(UDSPInstruction& opc);
|
||||||
|
void subf(UDSPInstruction& opc);
|
||||||
|
void xori(UDSPInstruction& opc);
|
||||||
|
void andi(UDSPInstruction& opc);
|
||||||
|
void ori(UDSPInstruction& opc);
|
||||||
|
// END OF FIXMEs
|
||||||
|
|
||||||
|
// TODO: PENDING IMPLEMENTATION / UNIMPLEMENTED
|
||||||
|
void mulcmvz(UDSPInstruction& opc);
|
||||||
|
void mulcmv(UDSPInstruction& opc);
|
||||||
|
void nx(UDSPInstruction& opc);
|
||||||
|
void movnp(UDSPInstruction& opc);
|
||||||
|
// END OF UNIMPLEMENTED
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _DSPINTERPRETER_H
|
22
Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPJit.cpp
Normal file
22
Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPJit.cpp
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// Copyright (C) 2003-2009 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
#include "DSPJit.h"
|
||||||
|
|
||||||
|
namespace DSPJit {
|
||||||
|
|
||||||
|
};
|
27
Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPJit.h
Normal file
27
Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPJit.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// Copyright (C) 2003-2009 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
#ifndef _DSPJIT_H
|
||||||
|
#define _DSPJIT_H
|
||||||
|
|
||||||
|
namespace DSPJit {
|
||||||
|
// TODO(XK): Fill
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _DSPJIT_H
|
@ -1,46 +1,44 @@
|
|||||||
/*====================================================================
|
// Copyright (C) 2003-2009 Dolphin Project.
|
||||||
|
|
||||||
filename: opcodes.cpp
|
// This program is free software: you can redistribute it and/or modify
|
||||||
project: GameCube DSP Tool (gcdsp)
|
// it under the terms of the GNU General Public License as published by
|
||||||
created: 2005.03.04
|
// the Free Software Foundation, version 2.0.
|
||||||
mail: duddie@walla.com
|
|
||||||
|
|
||||||
Copyright (c) 2005 Duddie
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
modify it under the terms of the GNU General Public License
|
// If not, see http://www.gnu.org/licenses/
|
||||||
as published by the Free Software Foundation; either version 2
|
|
||||||
of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
// Official SVN repository and contact information can be found at
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
// http://code.google.com/p/dolphin-emu/
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
// Additional copyrights go to Duddie (c) 2005 (duddie@walla.com)
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
====================================================================*/
|
|
||||||
|
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
#include "opcodes.h"
|
#include "DSPTables.h"
|
||||||
|
|
||||||
|
#include "DSPInterpreter.h"
|
||||||
|
#include "DSPJit.h"
|
||||||
|
|
||||||
void unimplementedInst(UDSPInstruction& inst) {
|
void unimplementedInst(UDSPInstruction& inst) {
|
||||||
PanicAlert("Unimplemented instruction %d", inst.hex);
|
PanicAlert("Unimplemented instruction %d", inst.hex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void nop(UDSPInstruction&) {}
|
void nop(UDSPInstruction&) {}
|
||||||
|
|
||||||
|
// TODO(XK): Fill up the tables with the corresponding instructions
|
||||||
DSPOPCTemplate opcodes[] =
|
DSPOPCTemplate opcodes[] =
|
||||||
{
|
{
|
||||||
{"NOP", 0x0000, 0xffff, nop, nop, 1, 0, {},},
|
{"NOP", 0x0000, 0xffff, nop, nop, 1, 0, {},},
|
||||||
{"HALT", 0x0021, 0xffff, nop, nop, 1, 0, {},},
|
{"HALT", 0x0021, 0xffff, DSPInterpreter::halt, nop, 1, 0, {},},
|
||||||
{"RET", 0x02df, 0xffff, nop, nop, 1, 0, {},},
|
{"RET", 0x02df, 0xffff, DSPInterpreter::ret, nop, 1, 0, {},},
|
||||||
{"RETEQ", 0x02d5, 0xffff, nop, nop, 1, 0, {},},
|
{"RETEQ", 0x02d5, 0xffff, nop, nop, 1, 0, {},},
|
||||||
{"RETNZ", 0x02dd, 0xffff, nop, nop, 1, 0, {},},
|
{"RETNZ", 0x02dd, 0xffff, nop, nop, 1, 0, {},},
|
||||||
{"RTI", 0x02ff, 0xffff, nop, nop, 1, 0, {},},
|
{"RTI", 0x02ff, 0xffff, DSPInterpreter::rti, nop, 1, 0, {},},
|
||||||
{"CALL", 0x02bf, 0xffff, nop, nop, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},},
|
{"CALL", 0x02bf, 0xffff, DSPInterpreter::call, nop, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},},
|
||||||
|
|
||||||
{"CALLNE", 0x02b4, 0xffff, nop, nop, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},},
|
{"CALLNE", 0x02b4, 0xffff, nop, nop, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},},
|
||||||
|
|
||||||
@ -241,3 +239,15 @@ DSPOPCTemplate opcodes_ext[] =
|
|||||||
const u32 opcodes_size = sizeof(opcodes) / sizeof(opc_t);
|
const u32 opcodes_size = sizeof(opcodes) / sizeof(opc_t);
|
||||||
const u32 opcodes_ext_size = sizeof(opcodes_ext) / sizeof(opc_t);
|
const u32 opcodes_ext_size = sizeof(opcodes_ext) / sizeof(opc_t);
|
||||||
|
|
||||||
|
void InitInstructionTable() {
|
||||||
|
// TODO(XK): Fill
|
||||||
|
}
|
||||||
|
|
||||||
|
void DestroyInstructionTable() {
|
||||||
|
// TODO(XK): Fill
|
||||||
|
}
|
||||||
|
|
||||||
|
void ComputeInstruction(UDSPInstruction& inst) {
|
||||||
|
// TODO(XK): Fill
|
||||||
|
DSPInterpreter::unknown(inst);
|
||||||
|
}
|
108
Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPTables.h
Normal file
108
Source/Plugins/Plugin_DSP_LLE-testing/Src/DSPTables.h
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
// Copyright (C) 2003-2009 Dolphin Project.
|
||||||
|
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, version 2.0.
|
||||||
|
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License 2.0 for more details.
|
||||||
|
|
||||||
|
// A copy of the GPL 2.0 should have been included with the program.
|
||||||
|
// If not, see http://www.gnu.org/licenses/
|
||||||
|
|
||||||
|
// Official SVN repository and contact information can be found at
|
||||||
|
// http://code.google.com/p/dolphin-emu/
|
||||||
|
|
||||||
|
// Additional copyrights go to Duddie (c) 2005 (duddie@walla.com)
|
||||||
|
|
||||||
|
#ifndef _DSPTABLES_H
|
||||||
|
#define _DSPTABLES_H
|
||||||
|
|
||||||
|
enum parameterType
|
||||||
|
{
|
||||||
|
P_NONE = 0x0000,
|
||||||
|
P_VAL = 0x0001,
|
||||||
|
P_IMM = 0x0002,
|
||||||
|
P_MEM = 0x0003,
|
||||||
|
P_STR = 0x0004,
|
||||||
|
P_REG = 0x8000,
|
||||||
|
P_REG08 = P_REG | 0x0800,
|
||||||
|
P_REG10 = P_REG | 0x1000,
|
||||||
|
P_REG18 = P_REG | 0x1800,
|
||||||
|
P_REG19 = P_REG | 0x1900,
|
||||||
|
P_REG1A = P_REG | 0x1a00,
|
||||||
|
P_REG1C = P_REG | 0x1c00,
|
||||||
|
P_ACCM = P_REG | 0x1e00,
|
||||||
|
P_ACCM_D = P_REG | 0x1e80,
|
||||||
|
P_ACC = P_REG | 0x2000,
|
||||||
|
P_ACC_D = P_REG | 0x2080,
|
||||||
|
P_AX = P_REG | 0x2200,
|
||||||
|
P_AX_D = P_REG | 0x2280,
|
||||||
|
P_REGS_MASK = 0x03f80,
|
||||||
|
P_REF = P_REG | 0x4000,
|
||||||
|
P_PRG = P_REF | P_REG,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define P_EXT 0x80
|
||||||
|
|
||||||
|
union UDSPInstruction
|
||||||
|
{
|
||||||
|
u16 hex;
|
||||||
|
|
||||||
|
UDSPInstruction(u16 _hex) { hex = _hex; }
|
||||||
|
UDSPInstruction() { hex = 0; }
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
signed shift : 6;
|
||||||
|
unsigned negating : 1;
|
||||||
|
unsigned arithmetic : 1;
|
||||||
|
unsigned areg : 1;
|
||||||
|
unsigned op : 7;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned ushift : 6;
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO(XK): Figure out more instruction structures (add structs here)
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*dspInstFunc)(UDSPInstruction&);
|
||||||
|
|
||||||
|
typedef struct DSPOParams
|
||||||
|
{
|
||||||
|
parameterType type;
|
||||||
|
u8 size;
|
||||||
|
u8 loc;
|
||||||
|
s8 lshift;
|
||||||
|
u16 mask;
|
||||||
|
} opcpar_t;
|
||||||
|
|
||||||
|
typedef struct DSPOPCTemplate
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
u16 opcode;
|
||||||
|
u16 opcode_mask;
|
||||||
|
|
||||||
|
dspInstFunc interpFunc;
|
||||||
|
dspInstFunc jitFunc;
|
||||||
|
|
||||||
|
u8 size;
|
||||||
|
u8 param_count;
|
||||||
|
DSPOParams params[8];
|
||||||
|
} opc_t;
|
||||||
|
|
||||||
|
extern DSPOPCTemplate opcodes[];
|
||||||
|
extern const u32 opcodes_size;
|
||||||
|
extern opc_t opcodes_ext[];
|
||||||
|
extern const u32 opcodes_ext_size;
|
||||||
|
|
||||||
|
void InitInstructionTable();
|
||||||
|
void DestroyInstructionTable();
|
||||||
|
|
||||||
|
void ComputeInstruction(UDSPInstruction& inst);
|
||||||
|
|
||||||
|
#endif // _DSPTABLES_H
|
@ -20,6 +20,10 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
#include "HLE_Helper.h"
|
#include "HLE_Helper.h"
|
||||||
|
#include "DSPInterpreter.h"
|
||||||
|
|
||||||
|
// Avoid adding "DSPInterpreter::" to every instruction
|
||||||
|
using namespace DSPInterpreter;
|
||||||
|
|
||||||
|
|
||||||
u16& R00 = g_dsp.r[0x00];
|
u16& R00 = g_dsp.r[0x00];
|
||||||
|
@ -22,8 +22,6 @@
|
|||||||
|
|
||||||
bool WriteDMEM(u16 addr, u16 val);
|
bool WriteDMEM(u16 addr, u16 val);
|
||||||
u16 ReadDMEM(u16 addr);
|
u16 ReadDMEM(u16 addr);
|
||||||
void Update_SR_Register(s64 _Value);
|
|
||||||
s8 GetMultiplyModifier();
|
|
||||||
|
|
||||||
template<unsigned N>
|
template<unsigned N>
|
||||||
class TAccumulator
|
class TAccumulator
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
|
|
||||||
#include "disassemble.h"
|
#include "disassemble.h"
|
||||||
#include "opcodes.h"
|
#include "DSPTables.h"
|
||||||
// #include "gdsp_tool.h"
|
// #include "gdsp_tool.h"
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
@ -39,8 +39,6 @@
|
|||||||
|
|
||||||
u32 unk_opcodes[0x10000];
|
u32 unk_opcodes[0x10000];
|
||||||
|
|
||||||
u16 swap16(u16 x);
|
|
||||||
|
|
||||||
|
|
||||||
// predefined labels
|
// predefined labels
|
||||||
typedef struct pdlabel_t
|
typedef struct pdlabel_t
|
||||||
@ -289,7 +287,7 @@ u16 gd_dis_get_opcode_size(gd_globals_t* gdg)
|
|||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 op1 = swap16(gdg->binbuf[gdg->pc & 0x0fff]);
|
u32 op1 = Common::swap16(gdg->binbuf[gdg->pc & 0x0fff]);
|
||||||
|
|
||||||
for (u32 j = 0; j < opcodes_size; j++)
|
for (u32 j = 0; j < opcodes_size; j++)
|
||||||
{
|
{
|
||||||
@ -371,7 +369,7 @@ char* gd_dis_opcode(gd_globals_t* gdg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pc &= 0x0fff;
|
pc &= 0x0fff;
|
||||||
op1 = swap16(gdg->binbuf[pc]);
|
op1 = Common::swap16(gdg->binbuf[pc]);
|
||||||
|
|
||||||
// find opcode
|
// find opcode
|
||||||
for (j = 0; j < opcodes_size; j++)
|
for (j = 0; j < opcodes_size; j++)
|
||||||
@ -425,7 +423,7 @@ char* gd_dis_opcode(gd_globals_t* gdg)
|
|||||||
|
|
||||||
if ((opc->size & ~P_EXT) == 2)
|
if ((opc->size & ~P_EXT) == 2)
|
||||||
{
|
{
|
||||||
op2 = swap16(gdg->binbuf[pc + 1]);
|
op2 = Common::swap16(gdg->binbuf[pc + 1]);
|
||||||
|
|
||||||
if (gdg->show_hex){sprintf(buf, "%04x %04x ", op1, op2);}
|
if (gdg->show_hex){sprintf(buf, "%04x %04x ", op1, op2);}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
// April Fools!
|
|
||||||
/*====================================================================
|
/*====================================================================
|
||||||
|
|
||||||
filename: gdsp_interpreter.cpp
|
filename: gdsp_interpreter.cpp
|
||||||
@ -27,6 +26,8 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "DSPTables.h"
|
||||||
|
|
||||||
#include "gdsp_interface.h"
|
#include "gdsp_interface.h"
|
||||||
#include "gdsp_opcodes_helper.h"
|
#include "gdsp_opcodes_helper.h"
|
||||||
#include "Tools.h"
|
#include "Tools.h"
|
||||||
@ -67,23 +68,13 @@ void UpdateCachedCR()
|
|||||||
CR_EXTERNAL_INT = (g_dsp.cr & 0x02) != 0;
|
CR_EXTERNAL_INT = (g_dsp.cr & 0x02) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------
|
||||||
void (*dsp_op[])(u16 opc) =
|
|
||||||
{
|
|
||||||
dsp_op0, dsp_op1, dsp_op2, dsp_op3,
|
|
||||||
dsp_op4, dsp_op5, dsp_op6, dsp_op7,
|
|
||||||
dsp_op8, dsp_op9, dsp_opab, dsp_opab,
|
|
||||||
dsp_opcd, dsp_opcd, dsp_ope, dsp_opf,
|
|
||||||
};
|
|
||||||
|
|
||||||
void dbg_error(char* err_msg)
|
void dbg_error(char* err_msg)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void gdsp_init()
|
void gdsp_init()
|
||||||
{
|
{
|
||||||
g_dsp.irom = (u16*)malloc(DSP_IROM_SIZE * sizeof(u16));
|
g_dsp.irom = (u16*)malloc(DSP_IROM_SIZE * sizeof(u16));
|
||||||
@ -218,7 +209,7 @@ void gdsp_loop_step()
|
|||||||
{
|
{
|
||||||
g_dsp.err_pc = g_dsp.pc;
|
g_dsp.err_pc = g_dsp.pc;
|
||||||
u16 opc = dsp_fetch_code();
|
u16 opc = dsp_fetch_code();
|
||||||
dsp_op[opc >> 12](opc);
|
ComputeInstruction(UDSPInstruction(opc));
|
||||||
}
|
}
|
||||||
|
|
||||||
u16 HLE_ROM_80E7_81F8();
|
u16 HLE_ROM_80E7_81F8();
|
||||||
@ -249,7 +240,7 @@ void gdsp_step()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
u16 opc = dsp_fetch_code();
|
u16 opc = dsp_fetch_code();
|
||||||
dsp_op[opc >> 12](opc);
|
ComputeInstruction(UDSPInstruction(opc));
|
||||||
|
|
||||||
u16& rLoopCounter = g_dsp.r[DSP_REG_ST0 + 3];
|
u16& rLoopCounter = g_dsp.r[DSP_REG_ST0 + 3];
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,67 +0,0 @@
|
|||||||
// Copyright (C) 2003-2009 Dolphin Project.
|
|
||||||
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, version 2.0.
|
|
||||||
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License 2.0 for more details.
|
|
||||||
|
|
||||||
// A copy of the GPL 2.0 should have been included with the program.
|
|
||||||
// If not, see http://www.gnu.org/licenses/
|
|
||||||
|
|
||||||
// Official SVN repository and contact information can be found at
|
|
||||||
// http://code.google.com/p/dolphin-emu/
|
|
||||||
|
|
||||||
/*====================================================================
|
|
||||||
|
|
||||||
filename: gdsp_opcodes.h
|
|
||||||
project: GCemu
|
|
||||||
created: 2004-6-18
|
|
||||||
mail: duddie@walla.com
|
|
||||||
|
|
||||||
Copyright (c) 2005 Duddie & Tratax
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License
|
|
||||||
as published by the Free Software Foundation; either version 2
|
|
||||||
of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
====================================================================*/
|
|
||||||
#ifndef _GDSP_OPCODES_H
|
|
||||||
#define _GDSP_OPCODES_H
|
|
||||||
|
|
||||||
#include "Globals.h"
|
|
||||||
|
|
||||||
void dsp_op0(u16 opc);
|
|
||||||
void dsp_op1(u16 opc);
|
|
||||||
void dsp_op2(u16 opc);
|
|
||||||
void dsp_op3(u16 opc);
|
|
||||||
void dsp_op4(u16 opc);
|
|
||||||
void dsp_op5(u16 opc);
|
|
||||||
void dsp_op6(u16 opc);
|
|
||||||
void dsp_op7(u16 opc);
|
|
||||||
void dsp_op8(u16 opc);
|
|
||||||
void dsp_op9(u16 opc);
|
|
||||||
void dsp_opab(u16 opc);
|
|
||||||
void dsp_opcd(u16 opc);
|
|
||||||
void dsp_ope(u16 opc);
|
|
||||||
void dsp_opf(u16 opc);
|
|
||||||
|
|
||||||
|
|
||||||
#define R_SR 0x13
|
|
||||||
|
|
||||||
#define FLAG_ENABLE_INTERUPT 11
|
|
||||||
|
|
||||||
#endif
|
|
@ -28,7 +28,8 @@
|
|||||||
|
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
|
|
||||||
#include "gdsp_opcodes.h"
|
#include "DSPInterpreter.h"
|
||||||
|
|
||||||
#include "gdsp_memory.h"
|
#include "gdsp_memory.h"
|
||||||
#include "gdsp_interpreter.h"
|
#include "gdsp_interpreter.h"
|
||||||
#include "gdsp_registers.h"
|
#include "gdsp_registers.h"
|
||||||
|
@ -32,6 +32,8 @@
|
|||||||
#include "Thread.h"
|
#include "Thread.h"
|
||||||
#include "ChunkFile.h"
|
#include "ChunkFile.h"
|
||||||
|
|
||||||
|
#include "DSPTables.h"
|
||||||
|
|
||||||
#if defined(HAVE_WX) && HAVE_WX
|
#if defined(HAVE_WX) && HAVE_WX
|
||||||
#include "DSPConfigDlgLLE.h"
|
#include "DSPConfigDlgLLE.h"
|
||||||
#include "Debugger/Debugger.h" // For the CDebugger class
|
#include "Debugger/Debugger.h" // For the CDebugger class
|
||||||
@ -243,6 +245,8 @@ void Initialize(void *init)
|
|||||||
g_hDSPThread = new Common::Thread(dsp_thread, NULL);
|
g_hDSPThread = new Common::Thread(dsp_thread, NULL);
|
||||||
|
|
||||||
soundStream = AudioCommon::InitSoundStream();
|
soundStream = AudioCommon::InitSoundStream();
|
||||||
|
|
||||||
|
InitInstructionTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DSP_StopSoundStream()
|
void DSP_StopSoundStream()
|
||||||
@ -255,6 +259,7 @@ void Shutdown(void)
|
|||||||
{
|
{
|
||||||
bIsRunning = false;
|
bIsRunning = false;
|
||||||
gdsp_stop();
|
gdsp_stop();
|
||||||
|
DestroyInstructionTable();
|
||||||
AudioCommon::ShutdownSoundStream();
|
AudioCommon::ShutdownSoundStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,102 +0,0 @@
|
|||||||
/*====================================================================
|
|
||||||
|
|
||||||
filename: opcodes.h
|
|
||||||
project: GameCube DSP Tool (gcdsp)
|
|
||||||
created: 2005.03.04
|
|
||||||
mail: duddie@walla.com
|
|
||||||
|
|
||||||
Copyright (c) 2005 Duddie
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License
|
|
||||||
as published by the Free Software Foundation; either version 2
|
|
||||||
of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
|
|
||||||
====================================================================*/
|
|
||||||
#ifndef _OPCODES_H
|
|
||||||
#define _OPCODES_H
|
|
||||||
|
|
||||||
enum parameterType
|
|
||||||
{
|
|
||||||
P_NONE = 0x0000,
|
|
||||||
P_VAL = 0x0001,
|
|
||||||
P_IMM = 0x0002,
|
|
||||||
P_MEM = 0x0003,
|
|
||||||
P_STR = 0x0004,
|
|
||||||
P_REG = 0x8000,
|
|
||||||
P_REG08 = P_REG | 0x0800,
|
|
||||||
P_REG10 = P_REG | 0x1000,
|
|
||||||
P_REG18 = P_REG | 0x1800,
|
|
||||||
P_REG19 = P_REG | 0x1900,
|
|
||||||
P_REG1A = P_REG | 0x1a00,
|
|
||||||
P_REG1C = P_REG | 0x1c00,
|
|
||||||
P_ACCM = P_REG | 0x1e00,
|
|
||||||
P_ACCM_D = P_REG | 0x1e80,
|
|
||||||
P_ACC = P_REG | 0x2000,
|
|
||||||
P_ACC_D = P_REG | 0x2080,
|
|
||||||
P_AX = P_REG | 0x2200,
|
|
||||||
P_AX_D = P_REG | 0x2280,
|
|
||||||
P_REGS_MASK = 0x03f80,
|
|
||||||
P_REF = P_REG | 0x4000,
|
|
||||||
P_PRG = P_REF | P_REG,
|
|
||||||
};
|
|
||||||
|
|
||||||
#define P_EXT 0x80
|
|
||||||
|
|
||||||
union UDSPInstruction
|
|
||||||
{
|
|
||||||
u16 hex;
|
|
||||||
|
|
||||||
UDSPInstruction(u16 _hex) { hex = _hex; }
|
|
||||||
UDSPInstruction() { hex = 0; }
|
|
||||||
|
|
||||||
// TODO(XK): Figure out the instruction structure better (add structs here)
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef void (*dspInstFunc)(UDSPInstruction&);
|
|
||||||
|
|
||||||
typedef struct DSPOParams
|
|
||||||
{
|
|
||||||
parameterType type;
|
|
||||||
u8 size;
|
|
||||||
u8 loc;
|
|
||||||
s8 lshift;
|
|
||||||
u16 mask;
|
|
||||||
} opcpar_t;
|
|
||||||
|
|
||||||
typedef struct DSPOPCTemplate
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
u16 opcode;
|
|
||||||
u16 opcode_mask;
|
|
||||||
|
|
||||||
dspInstFunc interpFunc;
|
|
||||||
dspInstFunc jitFunc;
|
|
||||||
|
|
||||||
u8 size;
|
|
||||||
u8 param_count;
|
|
||||||
DSPOParams params[8];
|
|
||||||
} opc_t;
|
|
||||||
|
|
||||||
extern DSPOPCTemplate opcodes[];
|
|
||||||
extern const u32 opcodes_size;
|
|
||||||
extern opc_t opcodes_ext[];
|
|
||||||
extern const u32 opcodes_ext_size;
|
|
||||||
|
|
||||||
inline u16 swap16(u16 x)
|
|
||||||
{
|
|
||||||
return((x >> 8) | (x << 8));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
Reference in New Issue
Block a user