pureikyubu/SRC/DSP/DspInterpreter.h
2020-09-02 17:52:34 +03:00

116 lines
3.2 KiB
C++

// GameCube DSP interpreter
#pragma once
namespace DSP
{
class DspInterpreter
{
DspCore* core;
// Regular instructions (single-word)
void jmp(AnalyzeInfo& info);
void call(AnalyzeInfo& info);
void rets(AnalyzeInfo& info);
void reti(AnalyzeInfo& info);
void trap(AnalyzeInfo& info);
void wait(AnalyzeInfo& info);
void exec(AnalyzeInfo& info);
void loop(AnalyzeInfo& info);
void rep(AnalyzeInfo& info);
void pld(AnalyzeInfo& info);
void mr(AnalyzeInfo& info);
void adsi(AnalyzeInfo& info);
void adli(AnalyzeInfo& info);
void cmpsi(AnalyzeInfo& info);
void cmpli(AnalyzeInfo& info);
void lsfi(AnalyzeInfo& info);
void asfi(AnalyzeInfo& info);
void xorli(AnalyzeInfo& info);
void anli(AnalyzeInfo& info);
void orli(AnalyzeInfo& info);
void norm(AnalyzeInfo& info);
void div(AnalyzeInfo& info);
void addc(AnalyzeInfo& info);
void subc(AnalyzeInfo& info);
void negc(AnalyzeInfo& info);
void _max(AnalyzeInfo& info);
void lsf(AnalyzeInfo& info);
void asf(AnalyzeInfo& info);
void ld(AnalyzeInfo& info);
void st(AnalyzeInfo& info);
void ldsa(AnalyzeInfo& info);
void stsa(AnalyzeInfo& info);
void ldla(AnalyzeInfo& info);
void stla(AnalyzeInfo& info);
void mv(AnalyzeInfo& info);
void mvsi(AnalyzeInfo& info);
void mvli(AnalyzeInfo& info);
void stli(AnalyzeInfo& info);
void clr(AnalyzeInfo& info);
void set(AnalyzeInfo& info);
void btstl(AnalyzeInfo& info);
void btsth(AnalyzeInfo& info);
// Parallel instructions that occupy the upper part (in the lower part there is a parallel Load / Store / Move instruction)
void p_add(AnalyzeInfo& info);
void p_addl(AnalyzeInfo& info);
void p_sub(AnalyzeInfo& info);
void p_amv(AnalyzeInfo& info);
void p_cmp(AnalyzeInfo& info);
void p_inc(AnalyzeInfo& info);
void p_dec(AnalyzeInfo& info);
void p_abs(AnalyzeInfo& info);
void p_neg(AnalyzeInfo& info);
void p_clr(AnalyzeInfo& info);
void p_rnd(AnalyzeInfo& info);
void p_rndp(AnalyzeInfo& info);
void p_tst(AnalyzeInfo& info);
void p_lsl16(AnalyzeInfo& info);
void p_lsr16(AnalyzeInfo& info);
void p_asr16(AnalyzeInfo& info);
void p_addp(AnalyzeInfo& info);
void p_set(AnalyzeInfo& info);
void p_mpy(AnalyzeInfo& info);
void p_mac(AnalyzeInfo& info);
void p_macn(AnalyzeInfo& info);
void p_mvmpy(AnalyzeInfo& info);
void p_rnmpy(AnalyzeInfo& info);
void p_admpy(AnalyzeInfo& info);
void p_not(AnalyzeInfo& info);
void p_xor(AnalyzeInfo& info);
void p_and(AnalyzeInfo& info);
void p_or(AnalyzeInfo& info);
void p_lsf(AnalyzeInfo& info);
void p_asf(AnalyzeInfo& info);
// Parallel mem opcodes (low part)
void p_ldd(AnalyzeInfo& info);
void p_ls(AnalyzeInfo& info);
void p_ld(AnalyzeInfo& info);
void p_st(AnalyzeInfo& info);
void p_mv(AnalyzeInfo& info);
void p_mr(AnalyzeInfo& info);
// Helpers
void FetchMpyParams(DspParameter s1p, DspParameter s2p, int64_t& s1, int64_t& s2, bool checkDp);
void AdvanceAddress(int r, DspParameter param);
bool ConditionTrue(ConditionCode cc);
void Dispatch(AnalyzeInfo& info);
// TODO: Cache analyzeinfo?
bool flowControl = false;
public:
DspInterpreter(DspCore * parent);
~DspInterpreter();
void ExecuteInstr();
};
}