From 12c38d3afae66ad2f434e075098739478bb6a4b4 Mon Sep 17 00:00:00 2001 From: Marko Pusljar Date: Fri, 15 Apr 2011 13:04:20 +0000 Subject: [PATCH] llejit - fix for flag generation code + dspspy jit workaround git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7459 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Core/Src/DSP/DSPCore.cpp | 6 +- Source/Core/Core/Src/DSP/DSPEmitter.cpp | 13 ++- Source/Core/Core/Src/DSP/DSPEmitter.h | 3 +- Source/Core/Core/Src/DSP/DSPHWInterface.cpp | 8 +- Source/Core/Core/Src/DSP/DSPTables.cpp | 8 +- .../Core/Src/DSP/Jit/DSPJitArithmetic.cpp | 106 +++++++++--------- .../Core/Src/DSP/Jit/DSPJitMultiplier.cpp | 28 ++--- Source/DSPSpy/Makefile | 4 +- Source/DSPSpy/tests/dsp_base.inc | 1 + 9 files changed, 90 insertions(+), 87 deletions(-) diff --git a/Source/Core/Core/Src/DSP/DSPCore.cpp b/Source/Core/Core/Src/DSP/DSPCore.cpp index 674913d5c3..81632e9126 100644 --- a/Source/Core/Core/Src/DSP/DSPCore.cpp +++ b/Source/Core/Core/Src/DSP/DSPCore.cpp @@ -172,10 +172,7 @@ bool DSPCore_Init(const char *irom_filename, const char *coef_filename, if(bUsingJIT) dspjit = new DSPEmitter(); - DSPAnalyzer::Analyze(); - core_state = DSPCORE_RUNNING; - return true; } @@ -201,7 +198,8 @@ void DSPCore_Reset() g_dsp.r.wr[1] = 0xffff; g_dsp.r.wr[2] = 0xffff; g_dsp.r.wr[3] = 0xffff; - + + DSPAnalyzer::Analyze(); } void DSPCore_SetException(u8 level) diff --git a/Source/Core/Core/Src/DSP/DSPEmitter.cpp b/Source/Core/Core/Src/DSP/DSPEmitter.cpp index 20f0079c66..43d905a29a 100644 --- a/Source/Core/Core/Src/DSP/DSPEmitter.cpp +++ b/Source/Core/Core/Src/DSP/DSPEmitter.cpp @@ -96,6 +96,14 @@ void DSPEmitter::checkExceptions(u32 retval) SetJumpTarget(skipCheck); } +bool DSPEmitter::FlagsNeeded() +{ + if (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR) + return true; + else + return false; +} + void DSPEmitter::Default(UDSPInstruction inst) { if (opTable[inst]->reads_pc) @@ -171,11 +179,6 @@ void DSPEmitter::EmitInstruction(UDSPInstruction inst) } } -void DSPEmitter::unknown_instruction(UDSPInstruction inst) -{ - PanicAlert("unknown_instruction %04x - Fix me ;)", inst); -} - void DSPEmitter::Compile(u16 start_addr) { // Remember the current block address for later diff --git a/Source/Core/Core/Src/DSP/DSPEmitter.h b/Source/Core/Core/Src/DSP/DSPEmitter.h index 19b90ff089..5a1ebd4b72 100644 --- a/Source/Core/Core/Src/DSP/DSPEmitter.h +++ b/Source/Core/Core/Src/DSP/DSPEmitter.h @@ -40,7 +40,6 @@ public: Block m_compiledCode; void EmitInstruction(UDSPInstruction inst); - void unknown_instruction(UDSPInstruction inst); void ClearIRAM(); void CompileDispatcher(); @@ -48,6 +47,8 @@ public: void Compile(u16 start_addr); void ClearCallFlag(); + bool FlagsNeeded(); + void Default(UDSPInstruction inst); // CC Util diff --git a/Source/Core/Core/Src/DSP/DSPHWInterface.cpp b/Source/Core/Core/Src/DSP/DSPHWInterface.cpp index 14269090db..63cff1651f 100644 --- a/Source/Core/Core/Src/DSP/DSPHWInterface.cpp +++ b/Source/Core/Core/Src/DSP/DSPHWInterface.cpp @@ -72,9 +72,9 @@ void gdsp_mbox_write_l(u8 mbx, u16 val) #if defined(_DEBUG) || defined(DEBUGFAST) if (mbx == GDSP_MBOX_DSP) { - NOTICE_LOG(DSP_MAIL, "DSP(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc); + INFO_LOG(DSP_MAIL, "DSP(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc); } else { - NOTICE_LOG(DSP_MAIL, "CPU(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_CPU), g_dsp.pc); + INFO_LOG(DSP_MAIL, "CPU(WM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_CPU), g_dsp.pc); } #endif } @@ -104,9 +104,9 @@ u16 gdsp_mbox_read_l(u8 mbx) #if defined(_DEBUG) || defined(DEBUGFAST) if (mbx == GDSP_MBOX_DSP) { - NOTICE_LOG(DSP_MAIL, "DSP(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc); + INFO_LOG(DSP_MAIL, "DSP(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_DSP), g_dsp.pc); } else { - NOTICE_LOG(DSP_MAIL, "CPU(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_CPU), g_dsp.pc); + INFO_LOG(DSP_MAIL, "CPU(RM) B:%i M:0x%08x (pc=0x%04x)", mbx, gdsp_mbox_peek(GDSP_MBOX_CPU), g_dsp.pc); } #endif diff --git a/Source/Core/Core/Src/DSP/DSPTables.cpp b/Source/Core/Core/Src/DSP/DSPTables.cpp index 995b21e536..6e4bc55443 100644 --- a/Source/Core/Core/Src/DSP/DSPTables.cpp +++ b/Source/Core/Core/Src/DSP/DSPTables.cpp @@ -185,10 +185,10 @@ const DSPOPCTemplate opcodes[] = {"ILRRN", 0x021c, 0xfefc, DSPInterpreter::ilrrn, &DSPEmitter::ilrrn, 1, 2, {{P_ACCM, 1, 0, 8, 0x0100}, {P_PRG, 1, 0, 0, 0x0003}}, false, false, false, false, false}, // LOOPS - {"LOOP", 0x0040, 0xffe0, DSPInterpreter::loop, &DSPEmitter::loop, 1, 1, {{P_REG, 1, 0, 0, 0x001f}}, false, true, false, true, false}, - {"BLOOP", 0x0060, 0xffe0, DSPInterpreter::bloop, &DSPEmitter::bloop, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true, false}, - {"LOOPI", 0x1000, 0xff00, DSPInterpreter::loopi, &DSPEmitter::loopi, 1, 1, {{P_IMM, 1, 0, 0, 0x00ff}}, false, true, false, true, false}, - {"BLOOPI", 0x1100, 0xff00, DSPInterpreter::bloopi, &DSPEmitter::bloopi, 2, 2, {{P_IMM, 1, 0, 0, 0x00ff}, {P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, false, true, false}, + {"LOOP", 0x0040, 0xffe0, DSPInterpreter::loop, &DSPEmitter::loop, 1, 1, {{P_REG, 1, 0, 0, 0x001f}}, false, true, true, true, false}, + {"BLOOP", 0x0060, 0xffe0, DSPInterpreter::bloop, &DSPEmitter::bloop, 2, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, true, true, false}, + {"LOOPI", 0x1000, 0xff00, DSPInterpreter::loopi, &DSPEmitter::loopi, 1, 1, {{P_IMM, 1, 0, 0, 0x00ff}}, false, true, true, true, false}, + {"BLOOPI", 0x1100, 0xff00, DSPInterpreter::bloopi, &DSPEmitter::bloopi, 2, 2, {{P_IMM, 1, 0, 0, 0x00ff}, {P_ADDR_I, 2, 1, 0, 0xffff}}, false, true, true, true, false}, // load and store value pointed by indexing reg and increment; LRR/SRR variants {"LRR", 0x1800, 0xff80, DSPInterpreter::lrr, &DSPEmitter::lrr, 1, 2, {{P_REG, 1, 0, 0, 0x001f}, {P_PRG, 1, 0, 5, 0x0060}}, false, false, false, false, false}, diff --git a/Source/Core/Core/Src/DSP/Jit/DSPJitArithmetic.cpp b/Source/Core/Core/Src/DSP/Jit/DSPJitArithmetic.cpp index 579b9c17e3..7d5c15d60d 100644 --- a/Source/Core/Core/Src/DSP/Jit/DSPJitArithmetic.cpp +++ b/Source/Core/Core/Src/DSP/Jit/DSPJitArithmetic.cpp @@ -41,7 +41,7 @@ void DSPEmitter::clr(const UDSPInstruction opc) MOV(64, R(RAX), Imm64(0)); set_long_acc(reg); // Update_SR_Register64(0); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -65,7 +65,7 @@ void DSPEmitter::clrl(const UDSPInstruction opc) // dsp_set_long_acc(reg, acc); set_long_acc(reg); // Update_SR_Register64(acc); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -86,7 +86,7 @@ void DSPEmitter::clrl(const UDSPInstruction opc) void DSPEmitter::andcf(const UDSPInstruction opc) { #ifdef _M_X64 - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { u8 reg = (opc >> 8) & 0x1; // u16 imm = dsp_fetch_code(); @@ -126,7 +126,7 @@ void DSPEmitter::andcf(const UDSPInstruction opc) void DSPEmitter::andf(const UDSPInstruction opc) { #ifdef _M_X64 - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { u8 reg = (opc >> 8) & 0x1; // u16 imm = dsp_fetch_code(); @@ -164,7 +164,7 @@ void DSPEmitter::andf(const UDSPInstruction opc) void DSPEmitter::tst(const UDSPInstruction opc) { #ifdef _M_X64 - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { u8 reg = (opc >> 11) & 0x1; // s64 acc = dsp_get_long_acc(reg); @@ -185,7 +185,7 @@ void DSPEmitter::tst(const UDSPInstruction opc) void DSPEmitter::tstaxh(const UDSPInstruction opc) { #ifdef _M_X64 - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { u8 reg = (opc >> 8) & 0x1; // s16 val = dsp_get_ax_h(reg); @@ -208,7 +208,7 @@ void DSPEmitter::tstaxh(const UDSPInstruction opc) void DSPEmitter::cmp(const UDSPInstruction opc) { #ifdef _M_X64 - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { X64Reg tmp1; gpr.getFreeXReg(tmp1); @@ -238,7 +238,7 @@ void DSPEmitter::cmp(const UDSPInstruction opc) void DSPEmitter::cmpar(const UDSPInstruction opc) { #ifdef _M_X64 - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { u8 rreg = ((opc >> 12) & 0x1); u8 sreg = (opc >> 11) & 0x1; @@ -274,7 +274,7 @@ void DSPEmitter::cmpar(const UDSPInstruction opc) void DSPEmitter::cmpi(const UDSPInstruction opc) { #ifdef _M_X64 - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { u8 reg = (opc >> 8) & 0x1; X64Reg tmp1; @@ -307,7 +307,7 @@ void DSPEmitter::cmpi(const UDSPInstruction opc) void DSPEmitter::cmpis(const UDSPInstruction opc) { #ifdef _M_X64 - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { u8 areg = (opc >> 8) & 0x1; // s64 acc = dsp_get_long_acc(areg); @@ -351,7 +351,7 @@ void DSPEmitter::xorr(const UDSPInstruction opc) // g_dsp.r.acm[dreg] = accm; set_acc_m(dreg); // Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg))); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { get_long_acc(dreg, RCX); Update_SR_Register16_OverS32(); @@ -380,7 +380,7 @@ void DSPEmitter::andr(const UDSPInstruction opc) // g_dsp.r.acm[dreg] = accm; set_acc_m(dreg); // Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg))); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { get_long_acc(dreg, RCX); Update_SR_Register16_OverS32(); @@ -409,7 +409,7 @@ void DSPEmitter::orr(const UDSPInstruction opc) // g_dsp.r.acm[dreg] = accm; set_acc_m(dreg); // Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg))); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { get_long_acc(dreg, RCX); Update_SR_Register16_OverS32(); @@ -437,7 +437,7 @@ void DSPEmitter::andc(const UDSPInstruction opc) // g_dsp.r.acm[dreg] = accm; set_acc_m(dreg); // Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg))); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { get_long_acc(dreg, RCX); Update_SR_Register16_OverS32(); @@ -465,7 +465,7 @@ void DSPEmitter::orc(const UDSPInstruction opc) // g_dsp.r.acm[dreg] = accm; set_acc_m(dreg); // Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg))); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { get_long_acc(dreg, RCX); Update_SR_Register16_OverS32(); @@ -492,7 +492,7 @@ void DSPEmitter::xorc(const UDSPInstruction opc) // g_dsp.r.acm[dreg] = accm; set_acc_m(dreg); // Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg))); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { get_long_acc(dreg, RCX); Update_SR_Register16_OverS32(); @@ -518,7 +518,7 @@ void DSPEmitter::notc(const UDSPInstruction opc) // g_dsp.r.acm[dreg] = accm; set_acc_m(dreg); // Update_SR_Register16((s16)accm, false, false, isOverS32(dsp_get_long_acc(dreg))); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { get_long_acc(dreg, RCX); Update_SR_Register16_OverS32(); @@ -546,7 +546,7 @@ void DSPEmitter::xori(const UDSPInstruction opc) XOR(16, R(RAX), Imm16(imm)); set_acc_m(reg); // Update_SR_Register16((s16)g_dsp.r.acm[reg], false, false, isOverS32(dsp_get_long_acc(reg))); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { get_long_acc(reg, RCX); Update_SR_Register16_OverS32(); @@ -573,7 +573,7 @@ void DSPEmitter::andi(const UDSPInstruction opc) AND(16, R(RAX), Imm16(imm)); set_acc_m(reg); // Update_SR_Register16((s16)g_dsp.r.acm[reg], false, false, isOverS32(dsp_get_long_acc(reg))); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { get_long_acc(reg, RCX); Update_SR_Register16_OverS32(); @@ -600,7 +600,7 @@ void DSPEmitter::ori(const UDSPInstruction opc) OR(16, R(RAX), Imm16(imm)); set_acc_m(reg); // Update_SR_Register16((s16)g_dsp.r.acm[reg], false, false, isOverS32(dsp_get_long_acc(reg))); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { get_long_acc(reg, RCX); Update_SR_Register16_OverS32(); @@ -636,7 +636,7 @@ void DSPEmitter::addr(const UDSPInstruction opc) ADD(64, R(RAX), R(RDX)); // dsp_set_long_acc(dreg, res); // Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, ax, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { MOV(64, R(RCX), R(RAX)); set_long_acc(dreg, RCX); @@ -675,7 +675,7 @@ void DSPEmitter::addax(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, ax, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { MOV(64, R(RCX), R(RAX)); set_long_acc(dreg, RCX); @@ -713,7 +713,7 @@ void DSPEmitter::add(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry(acc0, res), isOverflow(acc0, acc1, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { MOV(64, R(RCX), R(RAX)); set_long_acc(dreg, RCX); @@ -751,7 +751,7 @@ void DSPEmitter::addp(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, prod, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { MOV(64, R(RCX), R(RAX)); set_long_acc(dreg, RCX); @@ -792,7 +792,7 @@ void DSPEmitter::addaxl(const UDSPInstruction opc) // dsp_set_long_acc(dreg, (s64)res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64((s64)res, isCarry(acc, res), isOverflow((s64)acc, (s64)acx, (s64)res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { MOV(64, R(RCX), R(RAX)); set_long_acc(dreg, RCX); @@ -834,7 +834,7 @@ void DSPEmitter::addi(const UDSPInstruction opc) // dsp_set_long_acc(areg, res); // res = dsp_get_long_acc(areg); // Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, imm, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { MOV(64, R(RCX), R(RAX)); set_long_acc(areg, RCX); @@ -875,7 +875,7 @@ void DSPEmitter::addis(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, imm, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { MOV(64, R(RCX), R(RAX)); set_long_acc(dreg, RCX); @@ -911,7 +911,7 @@ void DSPEmitter::incm(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, subtract, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { MOV(64, R(RDX), Imm32((u32)subtract)); MOV(64, R(RCX), R(RAX)); @@ -947,7 +947,7 @@ void DSPEmitter::inc(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry(acc, res), isOverflow(acc, 1, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { MOV(64, R(RDX), Imm64(1)); MOV(64, R(RCX), R(RAX)); @@ -992,7 +992,7 @@ void DSPEmitter::subr(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -ax, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { NEG(64, R(RDX)); MOV(64, R(RCX), R(RAX)); @@ -1032,7 +1032,7 @@ void DSPEmitter::subax(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -acx, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { NEG(64, R(RDX)); MOV(64, R(RCX), R(RAX)); @@ -1070,7 +1070,7 @@ void DSPEmitter::sub(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry2(acc1, res), isOverflow(acc1, -acc2, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { NEG(64, R(RDX)); MOV(64, R(RCX), R(RAX)); @@ -1108,7 +1108,7 @@ void DSPEmitter::subp(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -prod, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { NEG(64, R(RDX)); MOV(64, R(RCX), R(RAX)); @@ -1145,7 +1145,7 @@ void DSPEmitter::decm(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -subtract, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { MOV(64, R(RDX), Imm64(-subtract)); MOV(64, R(RCX), R(RAX)); @@ -1181,7 +1181,7 @@ void DSPEmitter::dec(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry2(acc, res), isOverflow(acc, -1, res)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { MOV(64, R(RDX), Imm64(-1)); MOV(64, R(RCX), R(RAX)); @@ -1216,7 +1216,7 @@ void DSPEmitter::neg(const UDSPInstruction opc) // dsp_set_long_acc(dreg, acc); set_long_acc(dreg); // Update_SR_Register64(dsp_get_long_acc(dreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -1246,7 +1246,7 @@ void DSPEmitter::abs(const UDSPInstruction opc) // dsp_set_long_acc(dreg, acc); set_long_acc(dreg); // Update_SR_Register64(dsp_get_long_acc(dreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -1276,7 +1276,7 @@ void DSPEmitter::movr(const UDSPInstruction opc) // acc &= ~0xffff; // dsp_set_long_acc(areg, acc); set_long_acc(areg); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -1301,7 +1301,7 @@ void DSPEmitter::movax(const UDSPInstruction opc) // dsp_set_long_acc(dreg, acx); set_long_acc(dreg); // Update_SR_Register64(acx); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -1324,7 +1324,7 @@ void DSPEmitter::mov(const UDSPInstruction opc) // dsp_set_long_acc(dreg, acc); set_long_acc(dreg); // Update_SR_Register64(acc); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -1351,7 +1351,7 @@ void DSPEmitter::lsl16(const UDSPInstruction opc) // dsp_set_long_acc(areg, acc); set_long_acc(areg); // Update_SR_Register64(dsp_get_long_acc(areg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -1379,7 +1379,7 @@ void DSPEmitter::lsr16(const UDSPInstruction opc) // dsp_set_long_acc(areg, (s64)acc); set_long_acc(areg); // Update_SR_Register64(dsp_get_long_acc(areg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -1405,7 +1405,7 @@ void DSPEmitter::asr16(const UDSPInstruction opc) // dsp_set_long_acc(areg, acc); set_long_acc(areg); // Update_SR_Register64(dsp_get_long_acc(areg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -1433,7 +1433,7 @@ void DSPEmitter::lsl(const UDSPInstruction opc) // dsp_set_long_acc(rreg, acc); set_long_acc(rreg); // Update_SR_Register64(dsp_get_long_acc(rreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -1472,7 +1472,7 @@ void DSPEmitter::lsr(const UDSPInstruction opc) // dsp_set_long_acc(rreg, (s64)acc); set_long_acc(rreg); // Update_SR_Register64(dsp_get_long_acc(rreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -1498,7 +1498,7 @@ void DSPEmitter::asl(const UDSPInstruction opc) // dsp_set_long_acc(rreg, acc); set_long_acc(rreg); // Update_SR_Register64(dsp_get_long_acc(rreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -1533,7 +1533,7 @@ void DSPEmitter::asr(const UDSPInstruction opc) // dsp_set_long_acc(dreg, acc); set_long_acc(dreg); // Update_SR_Register64(dsp_get_long_acc(dreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -1594,7 +1594,7 @@ void DSPEmitter::lsrn(const UDSPInstruction opc) set_long_acc(0, RDX); SetJumpTarget(zero); // Update_SR_Register64(dsp_get_long_acc(0)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(RDX); } @@ -1652,7 +1652,7 @@ void DSPEmitter::asrn(const UDSPInstruction opc) // Update_SR_Register64(dsp_get_long_acc(0)); set_long_acc(0, RDX); SetJumpTarget(zero); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(RDX); } @@ -1716,7 +1716,7 @@ void DSPEmitter::lsrnrx(const UDSPInstruction opc) // Update_SR_Register64(dsp_get_long_acc(dreg)); set_long_acc(dreg, RDX); SetJumpTarget(zero); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(RDX); } @@ -1777,7 +1777,7 @@ void DSPEmitter::asrnrx(const UDSPInstruction opc) set_long_acc(dreg, RDX); SetJumpTarget(zero); // Update_SR_Register64(dsp_get_long_acc(dreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(RDX); } @@ -1839,7 +1839,7 @@ void DSPEmitter::lsrnr(const UDSPInstruction opc) set_long_acc(dreg, RDX); SetJumpTarget(zero); // Update_SR_Register64(dsp_get_long_acc(dreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(RDX); } @@ -1898,7 +1898,7 @@ void DSPEmitter::asrnr(const UDSPInstruction opc) set_long_acc(dreg, RDX); SetJumpTarget(zero); // Update_SR_Register64(dsp_get_long_acc(dreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(RDX); } diff --git a/Source/Core/Core/Src/DSP/Jit/DSPJitMultiplier.cpp b/Source/Core/Core/Src/DSP/Jit/DSPJitMultiplier.cpp index c37449c0c7..e7a5efaa1e 100644 --- a/Source/Core/Core/Src/DSP/Jit/DSPJitMultiplier.cpp +++ b/Source/Core/Core/Src/DSP/Jit/DSPJitMultiplier.cpp @@ -194,7 +194,7 @@ void DSPEmitter::clrp(const UDSPInstruction opc) void DSPEmitter::tstprod(const UDSPInstruction opc) { #ifdef _M_X64 - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { // s64 prod = dsp_get_long_prod(); get_long_prod(); @@ -223,7 +223,7 @@ void DSPEmitter::movp(const UDSPInstruction opc) // dsp_set_long_acc(dreg, acc); set_long_acc(dreg); // Update_SR_Register64(acc); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -249,7 +249,7 @@ void DSPEmitter::movnp(const UDSPInstruction opc) // dsp_set_long_acc(dreg, acc); set_long_acc(dreg); // Update_SR_Register64(acc); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -274,7 +274,7 @@ void DSPEmitter::movpz(const UDSPInstruction opc) // dsp_set_long_acc(dreg, acc); set_long_acc(dreg); // Update_SR_Register64(acc); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -311,7 +311,7 @@ void DSPEmitter::addpaxz(const UDSPInstruction opc) // dsp_set_long_acc(dreg, res); // res = dsp_get_long_acc(dreg); // Update_SR_Register64(res, isCarry(oldprod, res), false); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { get_long_prod(RDX); MOV(64, R(RCX), R(RAX)); @@ -402,7 +402,7 @@ void DSPEmitter::mulac(const UDSPInstruction opc) POP(64, R(RAX)); set_long_acc(rreg); // Update_SR_Register64(dsp_get_long_acc(rreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -431,7 +431,7 @@ void DSPEmitter::mulmv(const UDSPInstruction opc) POP(64, R(RAX)); set_long_acc(rreg); // Update_SR_Register64(dsp_get_long_acc(rreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -459,7 +459,7 @@ void DSPEmitter::mulmvz(const UDSPInstruction opc) set_long_acc(rreg, RDX); mul(opc); // Update_SR_Register64(dsp_get_long_acc(rreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(RDX); } @@ -525,7 +525,7 @@ void DSPEmitter::mulxac(const UDSPInstruction opc) // dsp_set_long_acc(rreg, acc); set_long_acc(rreg, tmp1); // Update_SR_Register64(dsp_get_long_acc(rreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(tmp1); } @@ -565,7 +565,7 @@ void DSPEmitter::mulxmv(const UDSPInstruction opc) // dsp_set_long_acc(rreg, acc); set_long_acc(rreg, tmp1); // Update_SR_Register64(dsp_get_long_acc(rreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(tmp1); } @@ -606,7 +606,7 @@ void DSPEmitter::mulxmvz(const UDSPInstruction opc) // dsp_set_long_acc(rreg, acc); set_long_acc(rreg, tmp1); // Update_SR_Register64(dsp_get_long_acc(rreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(tmp1); } @@ -673,7 +673,7 @@ void DSPEmitter::mulcac(const UDSPInstruction opc) POP(64, R(RAX)); set_long_acc(rreg); // Update_SR_Register64(dsp_get_long_acc(rreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -712,7 +712,7 @@ void DSPEmitter::mulcmv(const UDSPInstruction opc) POP(64, R(RAX)); set_long_acc(rreg); // Update_SR_Register64(dsp_get_long_acc(rreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } @@ -752,7 +752,7 @@ void DSPEmitter::mulcmvz(const UDSPInstruction opc) POP(64, R(RAX)); set_long_acc(rreg); // Update_SR_Register64(dsp_get_long_acc(rreg)); - if (!(DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_START_OF_INST) || (DSPAnalyzer::code_flags[compilePC] & DSPAnalyzer::CODE_UPDATE_SR)) + if (FlagsNeeded()) { Update_SR_Register64(); } diff --git a/Source/DSPSpy/Makefile b/Source/DSPSpy/Makefile index ec0fcc297e..b17b77f97f 100644 --- a/Source/DSPSpy/Makefile +++ b/Source/DSPSpy/Makefile @@ -41,9 +41,9 @@ LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- ifeq ($(HW_TYPE), gamecube) -LIBS := -lfat -lasnd -lmodplay -lz -ldb -logc -lm +LIBS := -lfat -lasnd -lmodplay -ldb -logc -lm else -LIBS := -lfat -lasnd -lmodplay -lwiiuse -lbte -lz -logc -lm +LIBS := -lfat -lasnd -lmodplay -lwiiuse -lbte -logc -lm endif #--------------------------------------------------------------------------------- diff --git a/Source/DSPSpy/tests/dsp_base.inc b/Source/DSPSpy/tests/dsp_base.inc index e875a9b5b9..29c992b1c3 100644 --- a/Source/DSPSpy/tests/dsp_base.inc +++ b/Source/DSPSpy/tests/dsp_base.inc @@ -108,6 +108,7 @@ MEM_LO: equ 0x0f7F ; This is where we jump when we're done testing, see above. ; We just fall into a loop, playing dead until someone resets the DSP. end_of_test: + nop jmp end_of_test ; Utility function to do DMA.