mupen64plus-oldsvn/debugger/debugger.c

93 lines
3.1 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 <glib.h>
#include "debugger.h"
// State of the Emulation Thread:
// 0 -> pause, 2 -> run.
int g_DebuggerEnabled = 0; // wether the debugger is enabled or not
int debugger_mode;
int run;
SDL_cond *debugger_done_cond;
SDL_mutex *mutex;
uint32 previousPC;
//]=-=-=-=-=-=-=-=-=-=-=[ Initialisation du Debugger ]=-=-=-=-=-=-=-=-=-=-=-=[
void init_debugger()
{
debugger_mode = 1;
run = 0;
init_debugger_frontend();
init_host_disassembler();
mutex = SDL_CreateMutex();
debugger_done_cond = SDL_CreateCond();
}
void uninit_debugger()
{
SDL_DestroyMutex(mutex);
mutex = NULL;
SDL_DestroyCond(debugger_done_cond);
debugger_done_cond = NULL;
}
//]=-=-=-=-=-=-=-=-=-=-=-=-=[ Mise-a-Jour Debugger ]=-=-=-=-=-=-=-=-=-=-=-=-=[
void update_debugger()
// Update debugger state and display.
// Should be called after each R4300 instruction.
{
int bpt;
if(run==2) {
bpt = check_breakpoints(PC->addr);
if( bpt==-1 ) {
previousPC = PC->addr;
return;
}
else {
run = 0;
switch_button_to_run();
if(BPT_CHECK_FLAG(g_Breakpoints[bpt], BPT_FLAG_LOG))
log_breakpoint(PC->addr, BPT_FLAG_EXEC, 0);
}
}
else if ( previousPC == PC->addr )
{
return;
}
update_debugger_frontend();
previousPC = PC->addr;
// Emulation thread is blocked until a button is clicked.
SDL_CondWait(debugger_done_cond, mutex);
}