pureikyubu/SRC/DSP/DspInterpreter.h
ogamespec 6ea48c15ab DSP WIP
- Verified ADPCM decoder output in emulator
- AX mixer volume envelope fixed (saturation)
- Still buzzing sounds instead clear samples
2020-05-18 00:36:37 +03:00

211 lines
5.4 KiB
C++

// GameCube DSP interpreter
#pragma once
namespace DSP
{
class DspInterpreter
{
DspCore* core;
// Instructions
void ABS(AnalyzeInfo& info);
void ADD(AnalyzeInfo& info);
void ADDARN(AnalyzeInfo& info);
void ADDAX(AnalyzeInfo& info);
void ADDAXL(AnalyzeInfo& info);
void ADDI(AnalyzeInfo& info);
void ADDIS(AnalyzeInfo& info);
void ADDP(AnalyzeInfo& info);
void ADDPAXZ(AnalyzeInfo& info);
void ADDR(AnalyzeInfo& info);
void ANDC(AnalyzeInfo& info);
void TCLR(AnalyzeInfo& info);
void TSET(AnalyzeInfo& info);
void ANDI(AnalyzeInfo& info);
void ANDR(AnalyzeInfo& info);
void ASL(AnalyzeInfo& info);
void ASR(AnalyzeInfo& info);
void ASR16(AnalyzeInfo& info);
void BLOOP(AnalyzeInfo& info);
void BLOOPI(AnalyzeInfo& info);
void CALLcc(AnalyzeInfo& info);
void CALLR(AnalyzeInfo& info);
void CLR(AnalyzeInfo& info);
void CLRL(AnalyzeInfo& info);
void CLRP(AnalyzeInfo& info);
void CMP(AnalyzeInfo& info);
void CMPI(AnalyzeInfo& info);
void CMPIS(AnalyzeInfo& info);
void CMPAR(AnalyzeInfo& info);
void DAR(AnalyzeInfo& info);
void DEC(AnalyzeInfo& info);
void DECM(AnalyzeInfo& info);
void HALT(AnalyzeInfo& info);
void IAR(AnalyzeInfo& info);
void INC(AnalyzeInfo& info);
void INCM(AnalyzeInfo& info);
void IFcc(AnalyzeInfo& info);
void ILRR(AnalyzeInfo& info);
void ILRRD(AnalyzeInfo& info);
void ILRRI(AnalyzeInfo& info);
void ILRRN(AnalyzeInfo& info);
void Jcc(AnalyzeInfo& info);
void JMPR(AnalyzeInfo& info);
void LOOP(AnalyzeInfo& info);
void LOOPI(AnalyzeInfo& info);
void LR(AnalyzeInfo& info);
void LRI(AnalyzeInfo& info);
void LRIS(AnalyzeInfo& info);
void LRR(AnalyzeInfo& info);
void LRRD(AnalyzeInfo& info);
void LRRI(AnalyzeInfo& info);
void LRRN(AnalyzeInfo& info);
void LRS(AnalyzeInfo& info);
void LSL(AnalyzeInfo& info);
void LSL16(AnalyzeInfo& info);
void LSR(AnalyzeInfo& info);
void LSR16(AnalyzeInfo& info);
void M2(AnalyzeInfo& info);
void M0(AnalyzeInfo& info);
void CLR15(AnalyzeInfo& info);
void SET15(AnalyzeInfo& info);
void CLR40(AnalyzeInfo& info);
void SET40(AnalyzeInfo& info);
void MOV(AnalyzeInfo& info);
void MOVAX(AnalyzeInfo& info);
void MOVNP(AnalyzeInfo& info);
void MOVP(AnalyzeInfo& info);
void MOVPZ(AnalyzeInfo& info);
void MOVR(AnalyzeInfo& info);
void MRR(AnalyzeInfo& info);
void MADD(AnalyzeInfo& info);
void MADDC(AnalyzeInfo& info);
void MADDX(AnalyzeInfo& info);
void MSUB(AnalyzeInfo& info);
void MSUBC(AnalyzeInfo& info);
void MSUBX(AnalyzeInfo& info);
void MUL(AnalyzeInfo& info);
void MULAC(AnalyzeInfo& info);
void MULC(AnalyzeInfo& info);
void MULCAC(AnalyzeInfo& info);
void MULCMV(AnalyzeInfo& info);
void MULCMVZ(AnalyzeInfo& info);
void MULMV(AnalyzeInfo& info);
void MULMVZ(AnalyzeInfo& info);
void MULX(AnalyzeInfo& info);
void MULXAC(AnalyzeInfo& info);
void MULXMV(AnalyzeInfo& info);
void MULXMVZ(AnalyzeInfo& info);
void NEG(AnalyzeInfo& info);
void ORC(AnalyzeInfo& info);
void ORI(AnalyzeInfo& info);
void ORR(AnalyzeInfo& info);
void RETcc(AnalyzeInfo& info);
void RTI(AnalyzeInfo& info);
void SBSET(AnalyzeInfo& info);
void SBCLR(AnalyzeInfo& info);
void SI(AnalyzeInfo& info);
void SR(AnalyzeInfo& info);
void SRR(AnalyzeInfo& info);
void SRRD(AnalyzeInfo& info);
void SRRI(AnalyzeInfo& info);
void SRRN(AnalyzeInfo& info);
void SRS(AnalyzeInfo& info);
void SUB(AnalyzeInfo& info);
void SUBAX(AnalyzeInfo& info);
void SUBP(AnalyzeInfo& info);
void SUBR(AnalyzeInfo& info);
void TST(AnalyzeInfo& info);
void TSTAXH(AnalyzeInfo& info);
void XORI(AnalyzeInfo& info);
void XORR(AnalyzeInfo& info);
// Packed instructions
void DR(AnalyzeInfo& info);
void IR(AnalyzeInfo& info);
void NR(AnalyzeInfo& info);
void MV(AnalyzeInfo& info);
void S(AnalyzeInfo& info);
void SN(AnalyzeInfo& info);
void L(AnalyzeInfo& info);
void LN(AnalyzeInfo& info);
void LS(AnalyzeInfo& info);
void SL(AnalyzeInfo& info);
void LSN(AnalyzeInfo& info);
void SLN(AnalyzeInfo& info);
void LSM(AnalyzeInfo& info);
void SLM(AnalyzeInfo& info);
void LSNM(AnalyzeInfo& info);
void SLNM(AnalyzeInfo& info);
void LD(AnalyzeInfo& info);
void LDN(AnalyzeInfo& info);
void LDM(AnalyzeInfo& info);
void LDNM(AnalyzeInfo& info);
void LDAX(AnalyzeInfo& info);
void LDAXN(AnalyzeInfo& info);
void LDAXM(AnalyzeInfo& info);
void LDAXNM(AnalyzeInfo& info);
// Helpers
bool Condition(ConditionCode cc);
void Flags40(int64_t a, int64_t b, int64_t res);
void Flags(DspLongAccumulator a, DspLongAccumulator b, DspLongAccumulator res);
void FlagsLogic(DspLongAccumulator a);
void Dispatch(AnalyzeInfo& info);
void SetLoop(DspAddress startAddr, DspAddress endAddr, uint16_t count);
bool CheckLoop();
void LDCommon(AnalyzeInfo& info);
void LDAXCommon(AnalyzeInfo& info);
void Mul(int16_t a, int16_t b);
void Mulx(int16_t a, int16_t b, int an, int bn);
void Madd(int16_t a, int16_t b);
void Msub(int16_t a, int16_t b);
void Mulac(int16_t a, int16_t b, int r);
void Mulxac(int16_t a, int16_t b, int r, int an, int bn);
void Mulmv(int16_t a, int16_t b, int r);
void Mulxmv(int16_t a, int16_t b, int r, int an, int bn);
void Mulmvz(int16_t a, int16_t b, int r);
void Mulxmvz(int16_t a, int16_t b, int r, int an, int bn);
// TODO: Cache analyzeinfo?
public:
DspInterpreter(DspCore * parent);
~DspInterpreter();
void ExecuteInstr();
};
}