98 lines
3.3 KiB
C
98 lines
3.3 KiB
C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
* Mupen64plus - debugger.c *
|
|
* Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
|
|
* Copyright (C) 2008 DarkJeztr *
|
|
* Copyright (C) 2002 davFr *
|
|
* *
|
|
* 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., *
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
#include <SDL.h>
|
|
|
|
#include "api/debugger.h"
|
|
|
|
#include "dbg_types.h"
|
|
#include "debugger.h"
|
|
#include "dbg_breakpoints.h"
|
|
#include "dbg_memory.h"
|
|
|
|
// State of the Emulation Thread:
|
|
// 0 -> pause, 2 -> run.
|
|
|
|
int g_DebuggerActive = 0; // whether the debugger is enabled or not
|
|
int run;
|
|
|
|
// Holds the number of pending steps the debugger needs to perform.
|
|
static SDL_sem* sem_pending_steps;
|
|
|
|
uint32 previousPC;
|
|
|
|
//]=-=-=-=-=-=-=-=-=-=-=[ Initialisation du Debugger ]=-=-=-=-=-=-=-=-=-=-=-=[
|
|
|
|
void init_debugger()
|
|
{
|
|
g_DebuggerActive = 1;
|
|
run = 0;
|
|
|
|
DebuggerCallback(DEBUG_UI_INIT, 0); /* call front-end to initialize user interface */
|
|
|
|
init_host_disassembler();
|
|
|
|
sem_pending_steps = SDL_CreateSemaphore(0);
|
|
}
|
|
|
|
void destroy_debugger()
|
|
{
|
|
SDL_DestroySemaphore(sem_pending_steps);
|
|
sem_pending_steps = NULL;
|
|
g_DebuggerActive = 0;
|
|
}
|
|
|
|
//]=-=-=-=-=-=-=-=-=-=-=-=-=[ Mise-a-Jour Debugger ]=-=-=-=-=-=-=-=-=-=-=-=-=[
|
|
|
|
void update_debugger(uint32 pc, int bpt)
|
|
// Update debugger state and display.
|
|
// Should be called after each R4300 instruction
|
|
// Checks for breakpoint hits on PC
|
|
{
|
|
if(run!=0) {//check if we hit a breakpoint
|
|
bpt = check_breakpoints(pc);
|
|
if( bpt!=-1 ) {
|
|
run = 0;
|
|
|
|
if(BPT_CHECK_FLAG(g_Breakpoints[bpt], BPT_FLAG_LOG))
|
|
log_breakpoint(pc, BPT_FLAG_EXEC, 0);
|
|
}
|
|
}
|
|
|
|
if(run!=2) {
|
|
DebuggerCallback(DEBUG_UI_UPDATE, bpt); /* call front-end to notify user interface to update */
|
|
}
|
|
if(run==0) {
|
|
// Emulation thread is blocked until a button is clicked.
|
|
SDL_SemWait(sem_pending_steps);
|
|
}
|
|
|
|
previousPC = pc;
|
|
}
|
|
|
|
void debugger_step()
|
|
{
|
|
SDL_SemPost(sem_pending_steps);
|
|
}
|
|
|
|
|