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:
parent
f34155ca98
commit
e099934a85
|
@ -588,18 +588,34 @@
|
|||
RelativePath=".\Src\disassemble.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\opcodes.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\opcodes.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
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
|
||||
RelativePath=".\Src\gdsp_aram.cpp"
|
||||
>
|
||||
|
@ -644,14 +660,6 @@
|
|||
RelativePath=".\Src\gdsp_memory.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\gdsp_opcodes.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\gdsp_opcodes.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\gdsp_opcodes_helper.h"
|
||||
>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
|
@ -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 {
|
||||
|
||||
};
|
|
@ -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,30 +1,27 @@
|
|||
/*====================================================================
|
||||
// Copyright (C) 2003-2009 Dolphin Project.
|
||||
|
||||
filename: opcodes.cpp
|
||||
project: GameCube DSP Tool (gcdsp)
|
||||
created: 2005.03.04
|
||||
mail: duddie@walla.com
|
||||
// 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.
|
||||
|
||||
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
|
||||
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.
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
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.
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
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.
|
||||
|
||||
====================================================================*/
|
||||
// Additional copyrights go to Duddie (c) 2005 (duddie@walla.com)
|
||||
|
||||
#include "Globals.h"
|
||||
#include "opcodes.h"
|
||||
#include "DSPTables.h"
|
||||
|
||||
#include "DSPInterpreter.h"
|
||||
#include "DSPJit.h"
|
||||
|
||||
void unimplementedInst(UDSPInstruction& inst) {
|
||||
PanicAlert("Unimplemented instruction %d", inst.hex);
|
||||
|
@ -32,15 +29,16 @@ void unimplementedInst(UDSPInstruction& inst) {
|
|||
|
||||
void nop(UDSPInstruction&) {}
|
||||
|
||||
// TODO(XK): Fill up the tables with the corresponding instructions
|
||||
DSPOPCTemplate opcodes[] =
|
||||
{
|
||||
{"NOP", 0x0000, 0xffff, nop, nop, 1, 0, {},},
|
||||
{"HALT", 0x0021, 0xffff, nop, nop, 1, 0, {},},
|
||||
{"RET", 0x02df, 0xffff, nop, nop, 1, 0, {},},
|
||||
{"HALT", 0x0021, 0xffff, DSPInterpreter::halt, nop, 1, 0, {},},
|
||||
{"RET", 0x02df, 0xffff, DSPInterpreter::ret, nop, 1, 0, {},},
|
||||
{"RETEQ", 0x02d5, 0xffff, nop, nop, 1, 0, {},},
|
||||
{"RETNZ", 0x02dd, 0xffff, nop, nop, 1, 0, {},},
|
||||
{"RTI", 0x02ff, 0xffff, nop, nop, 1, 0, {},},
|
||||
{"CALL", 0x02bf, 0xffff, nop, nop, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},},
|
||||
{"RTI", 0x02ff, 0xffff, DSPInterpreter::rti, nop, 1, 0, {},},
|
||||
{"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}},},
|
||||
|
||||
|
@ -241,3 +239,15 @@ DSPOPCTemplate opcodes_ext[] =
|
|||
const u32 opcodes_size = sizeof(opcodes) / 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);
|
||||
}
|
|
@ -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
|
||||
#include "Globals.h"
|
||||
#include "HLE_Helper.h"
|
||||
#include "DSPInterpreter.h"
|
||||
|
||||
// Avoid adding "DSPInterpreter::" to every instruction
|
||||
using namespace DSPInterpreter;
|
||||
|
||||
|
||||
u16& R00 = g_dsp.r[0x00];
|
||||
|
|
|
@ -22,8 +22,6 @@
|
|||
|
||||
bool WriteDMEM(u16 addr, u16 val);
|
||||
u16 ReadDMEM(u16 addr);
|
||||
void Update_SR_Register(s64 _Value);
|
||||
s8 GetMultiplyModifier();
|
||||
|
||||
template<unsigned N>
|
||||
class TAccumulator
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
#include "Globals.h"
|
||||
|
||||
#include "disassemble.h"
|
||||
#include "opcodes.h"
|
||||
#include "DSPTables.h"
|
||||
// #include "gdsp_tool.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
@ -39,8 +39,6 @@
|
|||
|
||||
u32 unk_opcodes[0x10000];
|
||||
|
||||
u16 swap16(u16 x);
|
||||
|
||||
|
||||
// predefined labels
|
||||
typedef struct pdlabel_t
|
||||
|
@ -289,7 +287,7 @@ u16 gd_dis_get_opcode_size(gd_globals_t* gdg)
|
|||
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++)
|
||||
{
|
||||
|
@ -371,7 +369,7 @@ char* gd_dis_opcode(gd_globals_t* gdg)
|
|||
}
|
||||
|
||||
pc &= 0x0fff;
|
||||
op1 = swap16(gdg->binbuf[pc]);
|
||||
op1 = Common::swap16(gdg->binbuf[pc]);
|
||||
|
||||
// find opcode
|
||||
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)
|
||||
{
|
||||
op2 = swap16(gdg->binbuf[pc + 1]);
|
||||
op2 = Common::swap16(gdg->binbuf[pc + 1]);
|
||||
|
||||
if (gdg->show_hex){sprintf(buf, "%04x %04x ", op1, op2);}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
// April Fools!
|
||||
/*====================================================================
|
||||
|
||||
filename: gdsp_interpreter.cpp
|
||||
|
@ -27,6 +26,8 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "DSPTables.h"
|
||||
|
||||
#include "gdsp_interface.h"
|
||||
#include "gdsp_opcodes_helper.h"
|
||||
#include "Tools.h"
|
||||
|
@ -67,23 +68,13 @@ void UpdateCachedCR()
|
|||
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)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void gdsp_init()
|
||||
{
|
||||
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;
|
||||
u16 opc = dsp_fetch_code();
|
||||
dsp_op[opc >> 12](opc);
|
||||
ComputeInstruction(UDSPInstruction(opc));
|
||||
}
|
||||
|
||||
u16 HLE_ROM_80E7_81F8();
|
||||
|
@ -249,7 +240,7 @@ void gdsp_step()
|
|||
#endif
|
||||
|
||||
u16 opc = dsp_fetch_code();
|
||||
dsp_op[opc >> 12](opc);
|
||||
ComputeInstruction(UDSPInstruction(opc));
|
||||
|
||||
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 "gdsp_opcodes.h"
|
||||
#include "DSPInterpreter.h"
|
||||
|
||||
#include "gdsp_memory.h"
|
||||
#include "gdsp_interpreter.h"
|
||||
#include "gdsp_registers.h"
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
#include "Thread.h"
|
||||
#include "ChunkFile.h"
|
||||
|
||||
#include "DSPTables.h"
|
||||
|
||||
#if defined(HAVE_WX) && HAVE_WX
|
||||
#include "DSPConfigDlgLLE.h"
|
||||
#include "Debugger/Debugger.h" // For the CDebugger class
|
||||
|
@ -243,6 +245,8 @@ void Initialize(void *init)
|
|||
g_hDSPThread = new Common::Thread(dsp_thread, NULL);
|
||||
|
||||
soundStream = AudioCommon::InitSoundStream();
|
||||
|
||||
InitInstructionTable();
|
||||
}
|
||||
|
||||
void DSP_StopSoundStream()
|
||||
|
@ -255,6 +259,7 @@ void Shutdown(void)
|
|||
{
|
||||
bIsRunning = false;
|
||||
gdsp_stop();
|
||||
DestroyInstructionTable();
|
||||
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
|
||||
|
Loading…
Reference in New Issue