diff --git a/Source/Core/DSPCore/DSPCore.vcproj b/Source/Core/DSPCore/DSPCore.vcproj index fffc872438..34f8e428f4 100644 --- a/Source/Core/DSPCore/DSPCore.vcproj +++ b/Source/Core/DSPCore/DSPCore.vcproj @@ -482,6 +482,14 @@ RelativePath=".\Src\DSPAnalyzer.h" > + + + + diff --git a/Source/Core/DSPCore/Src/DSPAnalyzer.h b/Source/Core/DSPCore/Src/DSPAnalyzer.h index 89e1e6c980..1b29ede4af 100644 --- a/Source/Core/DSPCore/Src/DSPAnalyzer.h +++ b/Source/Core/DSPCore/Src/DSPAnalyzer.h @@ -23,8 +23,6 @@ namespace DSPAnalyzer { #define ISPACE 65536 - - // Useful things to detect: // * Loop endpoints - so that we can avoid checking for loops every cycle. diff --git a/Source/Core/DSPCore/Src/DSPBreakpoints.cpp b/Source/Core/DSPCore/Src/DSPBreakpoints.cpp new file mode 100644 index 0000000000..ec48a249fc --- /dev/null +++ b/Source/Core/DSPCore/Src/DSPBreakpoints.cpp @@ -0,0 +1,19 @@ +// 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 "DSPBreakpoints.h" + diff --git a/Source/Core/DSPCore/Src/DSPBreakpoints.h b/Source/Core/DSPCore/Src/DSPBreakpoints.h new file mode 100644 index 0000000000..98ff5f609d --- /dev/null +++ b/Source/Core/DSPCore/Src/DSPBreakpoints.h @@ -0,0 +1,63 @@ +// 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 _DSP_BREAKPOINTS +#define _DSP_BREAKPOINTS + +#include "Common.h" + +// super fast breakpoints for a limited range. +// To be used interchangably with the BreakPoints class. +class DSPBreakpoints +{ +public: + DSPBreakpoints() {Clear();} + // is address breakpoint + bool IsAddressBreakPoint(u32 addr) { + return b[addr] != 0; + } + + // AddBreakPoint + bool Add(u32 addr, bool temp=false) { + bool was_one = b[addr] != 0; + if (!was_one) { + b[addr] = temp ? 2 : 1; + return true; + } else { + return false; + } + } + // Remove Breakpoint + bool Remove(u32 addr) { + bool was_one = b[addr] != 0; + b[addr] = 0; + return was_one; + } + void Clear() { + for (int i = 0; i < 65536; i++) + b[i] = 0; + } + + void DeleteByAddress(u32 addr) { + b[addr] = 0; + } + +private: + u8 b[65536]; +}; + +#endif diff --git a/Source/Core/DSPCore/Src/DSPCore.cpp b/Source/Core/DSPCore/Src/DSPCore.cpp index 8824916db9..565e2e6b1a 100644 --- a/Source/Core/DSPCore/Src/DSPCore.cpp +++ b/Source/Core/DSPCore/Src/DSPCore.cpp @@ -34,7 +34,7 @@ #include "DSPIntUtil.h" SDSP g_dsp; -BreakPoints dsp_breakpoints; +DSPBreakpoints dsp_breakpoints; DSPCoreState core_state = DSPCORE_RUNNING; Common::Event step_event; @@ -200,11 +200,9 @@ int DSPCore_RunCycles(int cycles) switch (core_state) { case DSPCORE_RUNNING: -#if 0 // Set to 1 to enable stepping - // Enable breakpoints +#if 1 // Set to 0 to disable breakpoints, for a speed boost. cycles = DSPInterpreter::RunCyclesDebug(cycles); #else - //1: enter a fast runloop cycles = DSPInterpreter::RunCycles(cycles); #endif break; diff --git a/Source/Core/DSPCore/Src/DSPCore.h b/Source/Core/DSPCore/Src/DSPCore.h index a0c574ca1a..eab5773c03 100644 --- a/Source/Core/DSPCore/Src/DSPCore.h +++ b/Source/Core/DSPCore/Src/DSPCore.h @@ -26,7 +26,7 @@ #ifndef _DSPCORE_H #define _DSPCORE_H -#include "BreakPoints.h" +#include "DSPBreakpoints.h" #define DSP_IRAM_BYTE_SIZE 0x2000 #define DSP_IRAM_SIZE 0x1000 @@ -201,7 +201,7 @@ struct SDSP }; extern SDSP g_dsp; -extern BreakPoints dsp_breakpoints; +extern DSPBreakpoints dsp_breakpoints; bool DSPCore_Init(const char *irom_filename, const char *coef_filename); void DSPCore_Reset(); diff --git a/Source/Core/DSPCore/Src/DSPInterpreter.cpp b/Source/Core/DSPCore/Src/DSPInterpreter.cpp index d1f98995e9..e054c61237 100644 --- a/Source/Core/DSPCore/Src/DSPInterpreter.cpp +++ b/Source/Core/DSPCore/Src/DSPInterpreter.cpp @@ -157,33 +157,59 @@ int RunCyclesDebug(int cycles) { if (g_dsp.cr & CR_HALT) return 0; - Step(); - cycles--; - } - - while (cycles > 0) - { - if (g_dsp.cr & CR_HALT) { - return 0; - } if (dsp_breakpoints.IsAddressBreakPoint(g_dsp.pc)) { DSPCore_SetState(DSPCORE_STEPPING); return cycles; } - DSPCore_CheckExternalInterrupt(); Step(); cycles--; + if (cycles < 0) + return 0; + } + DSPCore_CheckExternalInterrupt(); + + // Now, let's run a few cycles with idle skipping. + for (int i = 0; i < 8; i++) + { + if (g_dsp.cr & CR_HALT) + return 0; + if (dsp_breakpoints.IsAddressBreakPoint(g_dsp.pc)) + { + DSPCore_SetState(DSPCORE_STEPPING); + return cycles; + } // Idle skipping. if (DSPAnalyzer::code_flags[g_dsp.pc] & DSPAnalyzer::CODE_IDLE_SKIP) return 0; + + Step(); + cycles--; + if (cycles < 0) + return 0; } + + // Finally, run the rest of the block without. + while (cycles > 0) + { + if (dsp_breakpoints.IsAddressBreakPoint(g_dsp.pc)) + { + DSPCore_SetState(DSPCORE_STEPPING); + return cycles; + } + Step(); + cycles--; + } + + return cycles; } // Used by non-thread mode. Meant to be efficient. int RunCycles(int cycles) { + DSPCore_CheckExternalInterrupt(); + if (cycles < 18) { for (int i = 0; i < cycles; i++) diff --git a/Source/Core/DSPCore/Src/SConscript b/Source/Core/DSPCore/Src/SConscript index 3fcf93f3c2..f79d9e06f1 100644 --- a/Source/Core/DSPCore/Src/SConscript +++ b/Source/Core/DSPCore/Src/SConscript @@ -6,6 +6,7 @@ files = [ "assemble.cpp", "disassemble.cpp", "DSPAccelerator.cpp", + "DSPBreakpoints.cpp", "DSPIntCCUtil.cpp", "DSPIntExtOps.cpp", "DSPHWInterface.cpp", diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Debugger/DSPRegisterView.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/Debugger/DSPRegisterView.cpp index 3f455e287d..3d3c26d557 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/Debugger/DSPRegisterView.cpp +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Debugger/DSPRegisterView.cpp @@ -21,7 +21,7 @@ wxString CRegTable::GetValue(int row, int col) { - if (row < 36) // 32 "normal" regs + if (row < 32) // 32 "normal" regs { switch (col) { @@ -46,7 +46,7 @@ void CRegTable::UpdateCachedRegs() m_CachedCounter = g_dsp.step_counter; - for (int i = 0; i < 36; ++i) + for (int i = 0; i < 32; ++i) { m_CachedRegHasChanged[i] = (m_CachedRegs[i] != g_dsp.r[i]); m_CachedRegs[i] = g_dsp.r[i]; diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Debugger/DSPRegisterView.h b/Source/Plugins/Plugin_DSP_LLE/Src/Debugger/DSPRegisterView.h index f369302035..27e5d2f7bf 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/Debugger/DSPRegisterView.h +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Debugger/DSPRegisterView.h @@ -38,7 +38,7 @@ public: } int GetNumberCols(void) {return 2;} - int GetNumberRows(void) {return 36;} + int GetNumberRows(void) {return 32;} bool IsEmptyCell(int row, int col) {return false;} wxString GetValue(int row, int col); void SetValue(int row, int col, const wxString &); diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Debugger/Debugger.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/Debugger/Debugger.cpp index 9646997ac9..d0c3c6ca18 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/Debugger/Debugger.cpp +++ b/Source/Plugins/Plugin_DSP_LLE/Src/Debugger/Debugger.cpp @@ -50,8 +50,8 @@ DSPDebuggerLLE::~DSPDebuggerLLE() void DSPDebuggerLLE::CreateGUIControls() { // Basic settings - SetSize(700, 500); - this->SetSizeHints(700, 500); + SetSize(700, 800); + this->SetSizeHints(700, 800); this->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); m_Toolbar = CreateToolBar(wxTB_NODIVIDER|wxTB_NOICONS|wxTB_HORZ_TEXT|wxTB_DOCKABLE, ID_TOOLBAR); diff --git a/docs/DSP/DSP_UC_Zelda.txt b/docs/DSP/DSP_UC_Zelda.txt index cc03d26483..8ae5d94b09 100644 --- a/docs/DSP/DSP_UC_Zelda.txt +++ b/docs/DSP/DSP_UC_Zelda.txt @@ -865,7 +865,7 @@ void 0233_Increase_32BitAddress_InMem(_MemAddr(AR0), _Bytes(AX0.L)) void 0239_WaitUntilLastFrameGotSynced() { // 0239 8100 clr $ACC0 - // 23a 8900 clr $ACC1 + // 023a 8900 clr $ACC1 // 023b 00df 0354 lr $AC1.M, @0x0354 // 023d 00de 034e lr $AC0.M, @0x034e // 023f 8200 cmp