git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@31468 e17a0e51-4ae3-4d35-97c3-1a29b211df97
This commit is contained in:
parent
9c12bf58c8
commit
c053578923
21
ChangeLog
21
ChangeLog
|
@ -1,3 +1,24 @@
|
|||
October 9, 2009 Wei Mingzhi <weimingzhi@gmail.com>
|
||||
|
||||
* gui/hdebug.c: Removed PCSX-df debugger, which is incompleted and buggy.
|
||||
* gui/hdebug.h: Likewise.
|
||||
* gui/Makefile.am: Likewise.
|
||||
* libpcsxcore/debug.c: Added telnet-based debugger from PCSX CVS. GUI-based
|
||||
debugger should be worked on for better usability.
|
||||
* libpcsxcore/debug.h: Likewise.
|
||||
* libpcsxcore/socket.c: Likewise.
|
||||
* libpcsxcore/socket.h: Likewise.
|
||||
* libpcsxcore/psxinterpreter.c: Likewise.
|
||||
* libpcsxcore/psxmem.c: Likewise.
|
||||
* libpcsxcore/r3000a.c: Likewise.
|
||||
* libpcsxcore/r3000a.h: Likewise.
|
||||
* libpcsxcore/psxcommon.h: Likewise.
|
||||
* libpcsxcore/psxcounters.c: Likewise.
|
||||
* libpcsxcore/Makefile.am: Likewise.
|
||||
* gui/Config.c: Likewise.
|
||||
* gui/LnxMain.c: Likewise.
|
||||
* gui/Gtk2Gui.c: Likewise.
|
||||
|
||||
October 4, 2009 Wei Mingzhi <weimingzhi@gmail.com>
|
||||
|
||||
* plugins/dfxvideo/gpucfg-0.1df/main.c: Fixed: when trying to choose
|
||||
|
|
|
@ -116,7 +116,7 @@ int LoadConfig(PcsxConfig *Conf) {
|
|||
GetValuel(data, "PsxType", &Config.PsxType);
|
||||
GetValuel(data, "Cdda", &Config.Cdda);
|
||||
GetValuel(data, "Cpu", &Config.Cpu);
|
||||
GetValuel(data, "Dbg", &Config.Dbg);
|
||||
GetValuel(data, "Dbg", &Config.Debug);
|
||||
GetValuel(data, "PsxOut", &Config.PsxOut);
|
||||
GetValuel(data, "SpuIrq", &Config.SpuIrq);
|
||||
GetValuel(data, "RCntFix", &Config.RCntFix);
|
||||
|
@ -154,7 +154,7 @@ void SaveConfig() {
|
|||
SetValuel("PsxType", Config.PsxType);
|
||||
SetValuel("Cdda", Config.Cdda);
|
||||
SetValuel("Cpu", Config.Cpu);
|
||||
SetValuel("Dbg", Config.Dbg);
|
||||
SetValuel("Dbg", Config.Debug);
|
||||
SetValuel("PsxOut", Config.PsxOut);
|
||||
SetValuel("SpuIrq", Config.SpuIrq);
|
||||
SetValuel("RCntFix", Config.RCntFix);
|
||||
|
|
|
@ -32,8 +32,6 @@
|
|||
|
||||
#include "Linux.h"
|
||||
|
||||
#include "hdebug.h"
|
||||
|
||||
#include "../libpcsxcore/plugins.h"
|
||||
#include "../libpcsxcore/sio.h"
|
||||
#include "../libpcsxcore/cheat.h"
|
||||
|
@ -539,7 +537,6 @@ void OnFile_RunExe() {
|
|||
|
||||
if (Load(file) == 0) {
|
||||
g_free(file);
|
||||
if (Config.Dbg) hdb_start();
|
||||
psxCpu->Execute();
|
||||
} else {
|
||||
g_free(file);
|
||||
|
@ -587,7 +584,6 @@ void OnFile_RunCd() {
|
|||
SysRunGui();
|
||||
}
|
||||
|
||||
if (Config.Dbg) hdb_start();
|
||||
psxCpu->Execute();
|
||||
}
|
||||
|
||||
|
@ -618,7 +614,6 @@ void OnFile_RunBios() {
|
|||
CdromId[0] = '\0';
|
||||
CdromLabel[0] = '\0';
|
||||
|
||||
if (Config.Dbg) hdb_start();
|
||||
psxCpu->Execute();
|
||||
}
|
||||
|
||||
|
@ -714,7 +709,6 @@ void OnFile_RunImage() {
|
|||
SysRunGui();
|
||||
}
|
||||
|
||||
if (Config.Dbg) hdb_start();
|
||||
psxCpu->Execute();
|
||||
}
|
||||
|
||||
|
@ -731,7 +725,6 @@ void OnEmu_Run() {
|
|||
return;
|
||||
}
|
||||
|
||||
if (Config.Dbg) hdb_start();
|
||||
CheatSearchBackupMemory();
|
||||
psxCpu->Execute();
|
||||
}
|
||||
|
@ -755,7 +748,6 @@ void OnEmu_Reset() {
|
|||
LoadCdrom();
|
||||
}
|
||||
|
||||
if (Config.Dbg) hdb_start();
|
||||
psxCpu->Execute();
|
||||
}
|
||||
|
||||
|
@ -784,7 +776,6 @@ void OnEmu_SwitchImage() {
|
|||
|
||||
cdOpenCase = time(NULL) + 2;
|
||||
|
||||
if (Config.Dbg) hdb_start();
|
||||
CheatSearchBackupMemory();
|
||||
psxCpu->Execute();
|
||||
}
|
||||
|
@ -888,7 +879,6 @@ void state_load (gchar *state_filename) {
|
|||
#endif
|
||||
sprintf(Text, _("Loaded state %s."), state_filename);
|
||||
GPU_displayText(Text);
|
||||
if (Config.Dbg) hdb_start();
|
||||
psxCpu->Execute();
|
||||
} else {
|
||||
sprintf(Text, _("Error loading state %s!"), state_filename);
|
||||
|
@ -1769,7 +1759,12 @@ void OnCpu_Clicked (GtkDialog *dialog, gint arg1, gpointer user_data) {
|
|||
|
||||
Config.PsxAuto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(xml, "GtkCheckButton_PsxAuto")));
|
||||
|
||||
Config.Dbg = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(xml, "GtkCheckButton_Dbg")));
|
||||
t = Config.Debug;
|
||||
Config.Debug = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(xml, "GtkCheckButton_Dbg")));
|
||||
if (t != Config.Debug) {
|
||||
if (Config.Debug) StartDebugger();
|
||||
else StopDebugger();
|
||||
}
|
||||
|
||||
t = Config.Cpu;
|
||||
Config.Cpu = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(xml, "GtkCheckButton_Cpu")));
|
||||
|
@ -1777,13 +1772,11 @@ void OnCpu_Clicked (GtkDialog *dialog, gint arg1, gpointer user_data) {
|
|||
psxCpu->Shutdown();
|
||||
#ifdef PSXREC
|
||||
if (Config.Cpu) {
|
||||
if (Config.Dbg) psxCpu = &psxIntDbg;
|
||||
else psxCpu = &psxInt;
|
||||
psxCpu = &psxInt;
|
||||
}
|
||||
else psxCpu = &psxRec;
|
||||
#else
|
||||
if (Config.Dbg) psxCpu = &psxIntDbg;
|
||||
else psxCpu = &psxInt;
|
||||
psxCpu = &psxInt;
|
||||
#endif
|
||||
if (psxCpu->Init() == -1) {
|
||||
SysClose();
|
||||
|
@ -1848,7 +1841,7 @@ void OnConf_Cpu() {
|
|||
gtk_widget_set_sensitive (GTK_WIDGET (glade_xml_get_widget(xml, "GtkCheckButton_Cpu")), FALSE);
|
||||
#endif
|
||||
|
||||
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (glade_xml_get_widget(xml, "GtkCheckButton_Dbg")), Config.Cpu && Config.Dbg);
|
||||
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (glade_xml_get_widget(xml, "GtkCheckButton_Dbg")), Config.Cpu && Config.Debug);
|
||||
gtk_widget_set_sensitive (GTK_WIDGET (glade_xml_get_widget(xml, "GtkCheckButton_Dbg")), Config.Cpu);
|
||||
|
||||
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (glade_xml_get_widget(xml, "GtkCheckButton_PsxOut")), Config.PsxOut);
|
||||
|
|
|
@ -464,6 +464,10 @@ int SysInit() {
|
|||
|
||||
LoadMcds(Config.Mcd1, Config.Mcd2); /* TODO Do we need to have this here, or in the calling main() function?? */
|
||||
|
||||
if (Config.Debug) {
|
||||
StartDebugger();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -475,6 +479,8 @@ void SysClose() {
|
|||
psxShutdown();
|
||||
ReleasePlugins();
|
||||
|
||||
StopDebugger();
|
||||
|
||||
if (emuLog != NULL) fclose(emuLog);
|
||||
}
|
||||
|
||||
|
|
|
@ -13,8 +13,7 @@ pcsx_SOURCES = \
|
|||
Plugin.c \
|
||||
Config.c \
|
||||
Gtk2Gui.c \
|
||||
Cheat.c \
|
||||
hdebug.c
|
||||
Cheat.c
|
||||
|
||||
pcsx_LDADD = \
|
||||
$(GTK2_LIBS) $(GLADE2_LIBS) -lpthread -lz -lm ../libpcsxcore/libpcsxcore.a
|
||||
|
|
|
@ -47,7 +47,7 @@ am__installdirs = "$(DESTDIR)$(bindir)"
|
|||
binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
|
||||
PROGRAMS = $(bin_PROGRAMS)
|
||||
am_pcsx_OBJECTS = LnxMain.$(OBJEXT) Plugin.$(OBJEXT) Config.$(OBJEXT) \
|
||||
Gtk2Gui.$(OBJEXT) Cheat.$(OBJEXT) hdebug.$(OBJEXT)
|
||||
Gtk2Gui.$(OBJEXT) Cheat.$(OBJEXT)
|
||||
pcsx_OBJECTS = $(am_pcsx_OBJECTS)
|
||||
am__DEPENDENCIES_1 =
|
||||
pcsx_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
|
||||
|
@ -228,8 +228,7 @@ pcsx_SOURCES = \
|
|||
Plugin.c \
|
||||
Config.c \
|
||||
Gtk2Gui.c \
|
||||
Cheat.c \
|
||||
hdebug.c
|
||||
Cheat.c
|
||||
|
||||
pcsx_LDADD = \
|
||||
$(GTK2_LIBS) $(GLADE2_LIBS) -lpthread -lz -lm ../libpcsxcore/libpcsxcore.a
|
||||
|
@ -310,7 +309,6 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Gtk2Gui.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LnxMain.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Plugin.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdebug.Po@am__quote@
|
||||
|
||||
.c.o:
|
||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
||||
|
|
386
gui/hdebug.c
386
gui/hdebug.c
|
@ -1,386 +0,0 @@
|
|||
/***************************************************************************
|
||||
* Debugger-Interface for PCSX-DF *
|
||||
* *
|
||||
* Copyright (C) 2008 Stefan Sikora *
|
||||
* hoshy['at']schrauberstube['dot']de *
|
||||
* *
|
||||
* 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 Steet, Fifth Floor, Boston, MA 02111-1307 USA. *
|
||||
***************************************************************************/
|
||||
|
||||
// TODO:
|
||||
// - setting register values
|
||||
// - step over instruction
|
||||
// - Dumping/Loading of memory
|
||||
// - Better gui-integration
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
#include "r3000a.h"
|
||||
#include "hdebug.h"
|
||||
|
||||
// Global variables
|
||||
char buffer[1024*2];
|
||||
GtkTextBuffer *hdb_listing = 0;
|
||||
GtkTextBuffer *hdb_memdump = 0;
|
||||
GtkTextBuffer *hdb_logging = 0;
|
||||
GtkTextBuffer *hdb_registers = 0;
|
||||
GtkWidget *hdb_command = 0;
|
||||
GtkWidget *hdb_pausebutton = 0;
|
||||
|
||||
u32 hdb_memptr = 0x80000000;
|
||||
|
||||
int ready = 0;
|
||||
|
||||
// little helper for syncing with emulator
|
||||
void waitforpause() {
|
||||
int actualPC;
|
||||
|
||||
actualPC = psxRegs.pc;
|
||||
while(actualPC != psxRegs.pc) actualPC = psxRegs.pc;
|
||||
|
||||
gtk_button_set_label(GTK_BUTTON(hdb_pausebutton), "RESUME");
|
||||
}
|
||||
|
||||
|
||||
// core-debugger-functions
|
||||
void hdb_update_registers() {
|
||||
snprintf(buffer, 1024,
|
||||
"v0 0x%08x s0 0x%08x t0 0x%08x\n" \
|
||||
"v1 0x%08x s1 0x%08x t1 0x%08x\n" \
|
||||
" s2 0x%08x t2 0x%08x\n" \
|
||||
"a0 0x%08x s3 0x%08x t3 0x%08x\n" \
|
||||
"a1 0x%08x s4 0x%08x t4 0x%08x\n" \
|
||||
"a2 0x%08x s5 0x%08x t5 0x%08x\n" \
|
||||
"a3 0x%08x s6 0x%08x t6 0x%08x\n" \
|
||||
" s7 0x%08x t7 0x%08x\n" \
|
||||
"k0 0x%08x s8 0x%08x t8 0x%08x\n" \
|
||||
"k1 0x%08x t9 0x%08x\n\n" \
|
||||
"gp 0x%08x at 0x%08x ra 0x%08x\n" \
|
||||
"sp 0x%08x pc 0x%08x\n",
|
||||
psxRegs.GPR.r[2], psxRegs.GPR.r[16], psxRegs.GPR.r[8],
|
||||
psxRegs.GPR.r[3], psxRegs.GPR.r[17], psxRegs.GPR.r[9],
|
||||
psxRegs.GPR.r[18], psxRegs.GPR.r[10],
|
||||
psxRegs.GPR.r[4], psxRegs.GPR.r[19], psxRegs.GPR.r[11],
|
||||
psxRegs.GPR.r[5], psxRegs.GPR.r[20], psxRegs.GPR.r[12],
|
||||
psxRegs.GPR.r[6], psxRegs.GPR.r[21], psxRegs.GPR.r[13],
|
||||
psxRegs.GPR.r[7], psxRegs.GPR.r[22], psxRegs.GPR.r[14],
|
||||
psxRegs.GPR.r[23], psxRegs.GPR.r[15],
|
||||
psxRegs.GPR.r[26], psxRegs.GPR.r[30], psxRegs.GPR.r[24],
|
||||
psxRegs.GPR.r[27], psxRegs.GPR.r[25],
|
||||
psxRegs.GPR.r[28], psxRegs.GPR.r[1], psxRegs.GPR.r[31],
|
||||
psxRegs.GPR.r[29], psxRegs.pc);
|
||||
|
||||
gtk_text_buffer_set_text(hdb_registers, buffer, strlen(buffer));
|
||||
}
|
||||
|
||||
|
||||
void hdb_update_listing(u32 opc) {
|
||||
int t;
|
||||
u32 *cptr;
|
||||
u32 ocod;
|
||||
char tbuf[100];
|
||||
char *bptr;
|
||||
|
||||
buffer[0] = '\0';
|
||||
bptr = (char *)&buffer;
|
||||
opc -= 15*4;
|
||||
|
||||
for(t=0; t<=30; t++) {
|
||||
cptr = (u32 *)PSXM(opc);
|
||||
if (t == 15) strcat(bptr, ">"); else strcat(bptr, " ");
|
||||
ocod = cptr == NULL ? 0 : SWAP32(*cptr);
|
||||
sprintf(tbuf, "%s\n", disR3000AF(ocod, opc));
|
||||
strcat(bptr, tbuf);
|
||||
opc+=4;
|
||||
}
|
||||
strcat(bptr,"\0");
|
||||
gtk_text_buffer_set_text(hdb_listing, buffer, strlen(buffer));
|
||||
}
|
||||
|
||||
|
||||
void hdb_update_memdump() {
|
||||
int r, c;
|
||||
char tbuf[100];
|
||||
char *bptr;
|
||||
|
||||
buffer[0] = '\0';
|
||||
bptr = (char*)&buffer;
|
||||
|
||||
for(r=0; r<8; r++) {
|
||||
sprintf(tbuf, "0x%08x", hdb_memptr+r*16);
|
||||
strcat(bptr, tbuf);
|
||||
for(c=0; c<16; c++) {
|
||||
if(c==8) sprintf(tbuf, "-%02x", PSXMu8(hdb_memptr+r*16+c));
|
||||
else sprintf(tbuf, " %02x", PSXMu8(hdb_memptr+r*16+c));
|
||||
strcat(bptr, tbuf);
|
||||
}
|
||||
strcat(bptr, "\n");
|
||||
}
|
||||
strcat(bptr, "\0");
|
||||
gtk_text_buffer_set_text(hdb_memdump, buffer, strlen(buffer));
|
||||
}
|
||||
|
||||
|
||||
// Callback-functions
|
||||
void on_hdb_mainwindow_destroy(GtkWidget *widget, gpointer data) {
|
||||
hdb_pause = 0; // Run CPU
|
||||
gtk_widget_destroy((GtkWidget*)widget);
|
||||
gtk_main_quit();
|
||||
while (gtk_events_pending()) gtk_main_iteration();
|
||||
pthread_exit(NULL);
|
||||
ready = 0;
|
||||
}
|
||||
|
||||
|
||||
void on_hdb_pausebutton_clicked(GtkWidget *widget, gpointer data) {
|
||||
if(hdb_pause == 0) {
|
||||
hdb_pause = 1;
|
||||
waitforpause();
|
||||
|
||||
hdb_update_registers();
|
||||
hdb_update_listing(psxRegs.pc);
|
||||
hdb_update_memdump();
|
||||
}
|
||||
else {
|
||||
hdb_pause = 0;
|
||||
gtk_button_set_label(GTK_BUTTON(widget), "PAUSE");
|
||||
}
|
||||
}
|
||||
|
||||
void hdb_auto_pause () {
|
||||
if(hdb_pause == 0) {
|
||||
hdb_pause = 1;
|
||||
//waitforpause();
|
||||
|
||||
hdb_update_registers();
|
||||
hdb_update_listing(psxRegs.pc);
|
||||
hdb_update_memdump();
|
||||
}
|
||||
else {
|
||||
hdb_pause = 0;
|
||||
//gtk_button_set_label(GTK_BUTTON(widget), "PAUSE");
|
||||
}
|
||||
}
|
||||
|
||||
void on_hdb_tracebutton_clicked(GtkWidget *widget, gpointer data) {
|
||||
// Let emulator do one step and refresh debugger when in pause-mode!
|
||||
if(hdb_pause == 1) {
|
||||
hdb_pause = 2;
|
||||
|
||||
waitforpause();
|
||||
hdb_update_registers();
|
||||
hdb_update_listing(psxRegs.pc);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void on_hdb_dumpbutton_clicked(GtkWidget *widget, gpointer data) {
|
||||
// Save psx-memory for external analysis/modification
|
||||
// TODO
|
||||
}
|
||||
|
||||
|
||||
void on_hdb_loadbutton_clicked(GtkWidget *widget, gpointer data) {
|
||||
// Load psx-memory
|
||||
// TODO
|
||||
}
|
||||
|
||||
|
||||
void on_hdb_cmdbutton_clicked(GtkWidget *widget, gpointer data) {
|
||||
const gchar *cmdentry;
|
||||
char *actcmd;
|
||||
char *cmdsub;
|
||||
u32 tval;
|
||||
u8 tval8;
|
||||
int t;
|
||||
|
||||
if ((cmdentry = gtk_entry_get_text(GTK_ENTRY(hdb_command))) != NULL) {
|
||||
actcmd = strdup(cmdentry);
|
||||
/* split and interpret debugger's commandline
|
||||
t - trace one instruction
|
||||
c - continue execution
|
||||
d addr - disassemble at addr
|
||||
m addr - show memory at addr (hex)
|
||||
s addr op1 op2 op3 ... - set memory
|
||||
b addr - break on addr
|
||||
bc - clear breakpoint
|
||||
r reg val - set register to a specific value (TODO)
|
||||
*/
|
||||
|
||||
// get the command
|
||||
if ((cmdsub = strtok(actcmd, " ")) != NULL) {
|
||||
if(!strcmp(cmdsub, "t")) {
|
||||
hdb_pause = 2;
|
||||
usleep(100); // wait 1/10th of a second
|
||||
hdb_update_registers();
|
||||
hdb_update_listing(psxRegs.pc);
|
||||
}
|
||||
|
||||
if(!strcmp(cmdsub, "c")) hdb_pause = 0;
|
||||
|
||||
if(!strcmp(cmdsub, "bc")) {
|
||||
hdb_break = 0;
|
||||
}
|
||||
|
||||
if(!strcmp(cmdsub, "b")) {
|
||||
cmdsub = strtok(NULL, " ");
|
||||
sscanf(cmdsub, "%x", (u32*)&tval);
|
||||
hdb_break = tval;
|
||||
hdb_pause = 3;
|
||||
|
||||
waitforpause();
|
||||
hdb_update_memdump();
|
||||
hdb_update_registers();
|
||||
hdb_update_listing(psxRegs.pc);
|
||||
}
|
||||
|
||||
if(!strcmp(cmdsub, "d")) {
|
||||
cmdsub = strtok(NULL, " ");
|
||||
sscanf(cmdsub, "%x", (u32*)&tval);
|
||||
hdb_update_listing(tval);
|
||||
}
|
||||
|
||||
if(!strcmp(cmdsub, "m")) {
|
||||
cmdsub = strtok(NULL, " ");
|
||||
sscanf(cmdsub, "%x", (u32*)&tval);
|
||||
hdb_memptr = tval;
|
||||
hdb_update_memdump();
|
||||
}
|
||||
|
||||
if(!strcmp(cmdsub, "s")) {
|
||||
cmdsub = strtok(NULL, " ");
|
||||
sscanf(cmdsub, "%x", (u32 *)&tval);
|
||||
t = 0;
|
||||
while((cmdsub = strtok(NULL, " "))) {
|
||||
u8 v;
|
||||
sscanf(cmdsub, "%x", (u8 *)&tval8);
|
||||
PSXMu8(tval+t) = tval8;
|
||||
t++;
|
||||
}
|
||||
hdb_update_memdump();
|
||||
hdb_update_listing(psxRegs.pc);
|
||||
}
|
||||
|
||||
free(actcmd);
|
||||
}
|
||||
else {
|
||||
hdb_update_memdump();
|
||||
hdb_update_registers();
|
||||
hdb_update_listing(psxRegs.pc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// init debugger and gui
|
||||
void hdb_init() {
|
||||
if (ready) return;
|
||||
GtkWidget *hdb_mainwindow;
|
||||
GtkWidget *hdb_tracebutton;
|
||||
GtkWidget *hdb_dumpbutton;
|
||||
GtkWidget *hdb_loadbutton;
|
||||
GtkWidget *hdb_cmdbutton;
|
||||
GtkWidget *hdb_listbox, *hdb_membox, *hdb_logbox, *hdb_regbox;
|
||||
GtkWidget *hbox, *vbox, *hbox2, *hbox3;
|
||||
PangoFontDescription *font_desc;
|
||||
|
||||
hdb_pause = 0; // Run CPU
|
||||
|
||||
gtk_init(NULL, NULL);
|
||||
font_desc = pango_font_description_from_string ("Fixed 8");
|
||||
|
||||
// create and show the widgets
|
||||
hdb_mainwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_title((GtkWindow*)hdb_mainwindow, "PCSX-DF Debugger");
|
||||
gtk_window_set_position((GtkWindow*)hdb_mainwindow, GTK_WIN_POS_CENTER);
|
||||
|
||||
hbox = gtk_hbox_new(FALSE, 2);
|
||||
vbox = gtk_vbox_new(FALSE, 2);
|
||||
hbox2 = gtk_hbox_new(FALSE, 2);
|
||||
hbox3 = gtk_hbox_new(FALSE, 2);
|
||||
|
||||
hdb_registers = gtk_text_buffer_new(NULL);
|
||||
hdb_regbox = gtk_text_view_new_with_buffer(hdb_registers);
|
||||
gtk_widget_modify_font(hdb_regbox, font_desc);
|
||||
|
||||
hdb_listing = gtk_text_buffer_new(NULL);
|
||||
hdb_listbox = gtk_text_view_new_with_buffer(hdb_listing);
|
||||
gtk_widget_modify_font(hdb_listbox, font_desc);
|
||||
|
||||
hdb_memdump = gtk_text_buffer_new(NULL);
|
||||
hdb_membox = gtk_text_view_new_with_buffer(hdb_memdump);
|
||||
gtk_widget_modify_font(hdb_membox, font_desc);
|
||||
|
||||
hdb_logging = gtk_text_buffer_new(NULL);
|
||||
hdb_logbox = gtk_text_view_new_with_buffer(hdb_logging);
|
||||
gtk_widget_modify_font(hdb_logbox, font_desc);
|
||||
|
||||
hdb_command = gtk_entry_new();
|
||||
hdb_cmdbutton = gtk_button_new_with_label(">");
|
||||
|
||||
hdb_pausebutton = gtk_button_new_with_label("PAUSE");
|
||||
hdb_tracebutton = gtk_button_new_with_label("TRACE");
|
||||
hdb_dumpbutton = gtk_button_new_with_label("DUMP");
|
||||
hdb_loadbutton = gtk_button_new_with_label("LOAD");
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(hdb_mainwindow), hbox);
|
||||
gtk_container_add(GTK_CONTAINER(hbox), vbox);
|
||||
gtk_container_add(GTK_CONTAINER(hbox), hdb_listbox);
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(vbox), hdb_regbox);
|
||||
gtk_container_add(GTK_CONTAINER(vbox), hdb_membox);
|
||||
gtk_container_add(GTK_CONTAINER(vbox), hdb_logbox);
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(hbox3), hdb_command);
|
||||
gtk_container_add(GTK_CONTAINER(hbox3), hdb_cmdbutton);
|
||||
|
||||
gtk_container_add(GTK_CONTAINER(vbox), hbox3);
|
||||
gtk_container_add(GTK_CONTAINER(vbox), hbox2);
|
||||
gtk_container_add(GTK_CONTAINER(hbox2), hdb_pausebutton);
|
||||
gtk_container_add(GTK_CONTAINER(hbox2), hdb_tracebutton);
|
||||
gtk_container_add(GTK_CONTAINER(hbox2), hdb_dumpbutton);
|
||||
gtk_container_add(GTK_CONTAINER(hbox2), hdb_loadbutton);
|
||||
|
||||
pango_font_description_free (font_desc);
|
||||
|
||||
gtk_widget_show_all(hdb_mainwindow);
|
||||
|
||||
// connect signals to callback functions
|
||||
g_signal_connect(G_OBJECT(hdb_mainwindow), "destroy", G_CALLBACK(on_hdb_mainwindow_destroy), NULL);
|
||||
g_signal_connect(G_OBJECT(hdb_pausebutton), "clicked", G_CALLBACK(on_hdb_pausebutton_clicked), NULL);
|
||||
g_signal_connect(G_OBJECT(hdb_tracebutton), "clicked", G_CALLBACK(on_hdb_tracebutton_clicked), NULL);
|
||||
g_signal_connect(G_OBJECT(hdb_dumpbutton), "clicked", G_CALLBACK(on_hdb_dumpbutton_clicked), NULL);
|
||||
g_signal_connect(G_OBJECT(hdb_loadbutton), "clicked", G_CALLBACK(on_hdb_loadbutton_clicked), NULL);
|
||||
g_signal_connect(G_OBJECT(hdb_cmdbutton), "clicked", G_CALLBACK(on_hdb_cmdbutton_clicked), NULL);
|
||||
|
||||
hdb_update_registers();
|
||||
hdb_update_listing(psxRegs.pc);
|
||||
hdb_update_memdump();
|
||||
|
||||
ready = 1;
|
||||
gtk_main();
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
|
||||
// Start debugger in own thread
|
||||
void hdb_start() {
|
||||
pthread_t tid;
|
||||
|
||||
pthread_create(&tid, NULL, (void *)hdb_init, NULL);
|
||||
// hdb_init();
|
||||
}
|
33
gui/hdebug.h
33
gui/hdebug.h
|
@ -1,33 +0,0 @@
|
|||
/***************************************************************************
|
||||
* Debugger-Interface for PCSX-DF *
|
||||
* *
|
||||
* Copyright (C) 2008 Stefan Sikora *
|
||||
* hoshy['at']schrauberstube['dot']de *
|
||||
* *
|
||||
* 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 Steet, Fifth Floor, Boston, MA 02111-1307 USA. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __HDBUG_H__
|
||||
#define __HDBUG_H__
|
||||
|
||||
// 0 = run cpu, 1 = pause cpu, 2 = trace cpu
|
||||
int hdb_pause;
|
||||
unsigned long hdb_break;
|
||||
|
||||
void hdb_start();
|
||||
void hdb_auto_pause ();
|
||||
|
||||
#endif /* __HDBUG_H__ */
|
|
@ -23,6 +23,7 @@ libpcsxcore_a_SOURCES = \
|
|||
$(top_builddir)/libpcsxcore/psxhle.c \
|
||||
$(top_builddir)/libpcsxcore/cdrom.h \
|
||||
$(top_builddir)/libpcsxcore/coff.h \
|
||||
$(top_builddir)/libpcsxcore/debug.c \
|
||||
$(top_builddir)/libpcsxcore/debug.h \
|
||||
$(top_builddir)/libpcsxcore/decode_xa.h \
|
||||
$(top_builddir)/libpcsxcore/gte.h \
|
||||
|
@ -44,7 +45,9 @@ libpcsxcore_a_SOURCES = \
|
|||
$(top_builddir)/libpcsxcore/cdriso.c \
|
||||
$(top_builddir)/libpcsxcore/cdriso.h \
|
||||
$(top_builddir)/libpcsxcore/cheat.c \
|
||||
$(top_builddir)/libpcsxcore/cheat.h
|
||||
$(top_builddir)/libpcsxcore/cheat.h \
|
||||
$(top_builddir)/libpcsxcore/socket.c \
|
||||
$(top_builddir)/libpcsxcore/socket.h
|
||||
|
||||
if ARCH_X86_64
|
||||
libpcsxcore_a_SOURCES += \
|
||||
|
|
|
@ -88,6 +88,7 @@ am__libpcsxcore_a_SOURCES_DIST = \
|
|||
$(top_builddir)/libpcsxcore/psxhle.c \
|
||||
$(top_builddir)/libpcsxcore/cdrom.h \
|
||||
$(top_builddir)/libpcsxcore/coff.h \
|
||||
$(top_builddir)/libpcsxcore/debug.c \
|
||||
$(top_builddir)/libpcsxcore/debug.h \
|
||||
$(top_builddir)/libpcsxcore/decode_xa.h \
|
||||
$(top_builddir)/libpcsxcore/gte.h \
|
||||
|
@ -110,6 +111,8 @@ am__libpcsxcore_a_SOURCES_DIST = \
|
|||
$(top_builddir)/libpcsxcore/cdriso.h \
|
||||
$(top_builddir)/libpcsxcore/cheat.c \
|
||||
$(top_builddir)/libpcsxcore/cheat.h \
|
||||
$(top_builddir)/libpcsxcore/socket.c \
|
||||
$(top_builddir)/libpcsxcore/socket.h \
|
||||
$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c \
|
||||
$(top_builddir)/libpcsxcore/ix86_64/ix86-64.c \
|
||||
$(top_builddir)/libpcsxcore/ix86_64/ix86_cpudetect.c \
|
||||
|
@ -137,9 +140,9 @@ am_libpcsxcore_a_OBJECTS = psxbios.$(OBJEXT) cdrom.$(OBJEXT) \
|
|||
spu.$(OBJEXT) sio.$(OBJEXT) psxhw.$(OBJEXT) mdec.$(OBJEXT) \
|
||||
psxmem.$(OBJEXT) misc.$(OBJEXT) plugins.$(OBJEXT) \
|
||||
decode_xa.$(OBJEXT) r3000a.$(OBJEXT) psxinterpreter.$(OBJEXT) \
|
||||
gte.$(OBJEXT) psxhle.$(OBJEXT) cdriso.$(OBJEXT) \
|
||||
cheat.$(OBJEXT) $(am__objects_1) $(am__objects_2) \
|
||||
$(am__objects_3)
|
||||
gte.$(OBJEXT) psxhle.$(OBJEXT) debug.$(OBJEXT) \
|
||||
cdriso.$(OBJEXT) cheat.$(OBJEXT) socket.$(OBJEXT) \
|
||||
$(am__objects_1) $(am__objects_2) $(am__objects_3)
|
||||
libpcsxcore_a_OBJECTS = $(am_libpcsxcore_a_OBJECTS)
|
||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include
|
||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
||||
|
@ -330,6 +333,7 @@ libpcsxcore_a_SOURCES = $(top_builddir)/libpcsxcore/psxbios.c \
|
|||
$(top_builddir)/libpcsxcore/psxhle.c \
|
||||
$(top_builddir)/libpcsxcore/cdrom.h \
|
||||
$(top_builddir)/libpcsxcore/coff.h \
|
||||
$(top_builddir)/libpcsxcore/debug.c \
|
||||
$(top_builddir)/libpcsxcore/debug.h \
|
||||
$(top_builddir)/libpcsxcore/decode_xa.h \
|
||||
$(top_builddir)/libpcsxcore/gte.h \
|
||||
|
@ -351,7 +355,9 @@ libpcsxcore_a_SOURCES = $(top_builddir)/libpcsxcore/psxbios.c \
|
|||
$(top_builddir)/libpcsxcore/cdriso.c \
|
||||
$(top_builddir)/libpcsxcore/cdriso.h \
|
||||
$(top_builddir)/libpcsxcore/cheat.c \
|
||||
$(top_builddir)/libpcsxcore/cheat.h $(am__append_1) \
|
||||
$(top_builddir)/libpcsxcore/cheat.h \
|
||||
$(top_builddir)/libpcsxcore/socket.c \
|
||||
$(top_builddir)/libpcsxcore/socket.h $(am__append_1) \
|
||||
$(am__append_2) $(am__append_3)
|
||||
@ARCH_PPC_TRUE@libpcsxcore_a_CCASFLAGS = -x assembler-with-cpp -mregnames
|
||||
all: all-am
|
||||
|
@ -404,6 +410,7 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdriso.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdrom.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cheat.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decode_xa.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disr3000a.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gte.Po@am__quote@
|
||||
|
@ -431,6 +438,7 @@ distclean-compile:
|
|||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/r3000a.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reguse.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sio.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socket.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spu.Po@am__quote@
|
||||
|
||||
.c.o:
|
||||
|
@ -692,6 +700,20 @@ psxhle.obj: $(top_builddir)/libpcsxcore/psxhle.c
|
|||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o psxhle.obj `if test -f '$(top_builddir)/libpcsxcore/psxhle.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/psxhle.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/psxhle.c'; fi`
|
||||
|
||||
debug.o: $(top_builddir)/libpcsxcore/debug.c
|
||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT debug.o -MD -MP -MF $(DEPDIR)/debug.Tpo -c -o debug.o `test -f '$(top_builddir)/libpcsxcore/debug.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/debug.c
|
||||
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/debug.Tpo $(DEPDIR)/debug.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/debug.c' object='debug.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o debug.o `test -f '$(top_builddir)/libpcsxcore/debug.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/debug.c
|
||||
|
||||
debug.obj: $(top_builddir)/libpcsxcore/debug.c
|
||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT debug.obj -MD -MP -MF $(DEPDIR)/debug.Tpo -c -o debug.obj `if test -f '$(top_builddir)/libpcsxcore/debug.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/debug.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/debug.c'; fi`
|
||||
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/debug.Tpo $(DEPDIR)/debug.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/debug.c' object='debug.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o debug.obj `if test -f '$(top_builddir)/libpcsxcore/debug.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/debug.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/debug.c'; fi`
|
||||
|
||||
cdriso.o: $(top_builddir)/libpcsxcore/cdriso.c
|
||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cdriso.o -MD -MP -MF $(DEPDIR)/cdriso.Tpo -c -o cdriso.o `test -f '$(top_builddir)/libpcsxcore/cdriso.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/cdriso.c
|
||||
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/cdriso.Tpo $(DEPDIR)/cdriso.Po
|
||||
|
@ -720,6 +742,20 @@ cheat.obj: $(top_builddir)/libpcsxcore/cheat.c
|
|||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cheat.obj `if test -f '$(top_builddir)/libpcsxcore/cheat.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/cheat.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/cheat.c'; fi`
|
||||
|
||||
socket.o: $(top_builddir)/libpcsxcore/socket.c
|
||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT socket.o -MD -MP -MF $(DEPDIR)/socket.Tpo -c -o socket.o `test -f '$(top_builddir)/libpcsxcore/socket.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/socket.c
|
||||
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/socket.Tpo $(DEPDIR)/socket.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/socket.c' object='socket.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o socket.o `test -f '$(top_builddir)/libpcsxcore/socket.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/socket.c
|
||||
|
||||
socket.obj: $(top_builddir)/libpcsxcore/socket.c
|
||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT socket.obj -MD -MP -MF $(DEPDIR)/socket.Tpo -c -o socket.obj `if test -f '$(top_builddir)/libpcsxcore/socket.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/socket.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/socket.c'; fi`
|
||||
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/socket.Tpo $(DEPDIR)/socket.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$(top_builddir)/libpcsxcore/socket.c' object='socket.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o socket.obj `if test -f '$(top_builddir)/libpcsxcore/socket.c'; then $(CYGPATH_W) '$(top_builddir)/libpcsxcore/socket.c'; else $(CYGPATH_W) '$(srcdir)/$(top_builddir)/libpcsxcore/socket.c'; fi`
|
||||
|
||||
iR3000A-64.o: $(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c
|
||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iR3000A-64.o -MD -MP -MF $(DEPDIR)/iR3000A-64.Tpo -c -o iR3000A-64.o `test -f '$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c' || echo '$(srcdir)/'`$(top_builddir)/libpcsxcore/ix86_64/iR3000A-64.c
|
||||
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/iR3000A-64.Tpo $(DEPDIR)/iR3000A-64.Po
|
||||
|
|
1144
libpcsxcore/debug.c
Normal file
1144
libpcsxcore/debug.c
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -18,20 +18,35 @@
|
|||
* 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA. *
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
* Specficies which logs should be activated.
|
||||
* Ryan TODO: These should ALL be definable with configure flags.
|
||||
*/
|
||||
|
||||
#ifndef __DEBUG_H__
|
||||
#define __DEBUG_H__
|
||||
|
||||
enum breakpoint_types {
|
||||
E, R1, R2, R4, W1, W2, W4
|
||||
};
|
||||
|
||||
void StartDebugger();
|
||||
void StopDebugger();
|
||||
|
||||
void DebugVSync();
|
||||
void ProcessDebug();
|
||||
|
||||
void DebugCheckBP(u32 address, enum breakpoint_types type);
|
||||
|
||||
void PauseDebugger();
|
||||
void ResumeDebugger();
|
||||
|
||||
extern char *disRNameCP0[];
|
||||
|
||||
char* disR3000AF(u32 code, u32 pc);
|
||||
|
||||
FILE *emuLog;
|
||||
|
||||
/*
|
||||
* Specficies which logs should be activated.
|
||||
* Ryan TODO: These should ALL be definable with configure flags.
|
||||
*/
|
||||
|
||||
//#define GTE_DUMP
|
||||
|
||||
#ifdef GTE_DUMP
|
||||
|
|
|
@ -107,7 +107,7 @@ typedef struct {
|
|||
long Cdda;
|
||||
long HLE;
|
||||
long Cpu;
|
||||
long Dbg;
|
||||
long Debug;
|
||||
long PsxOut;
|
||||
long SpuIrq;
|
||||
long RCntFix;
|
||||
|
|
|
@ -159,6 +159,7 @@ void psxRcntUpdate() {
|
|||
}
|
||||
|
||||
psxRcntSet();
|
||||
DebugVSync();
|
||||
}
|
||||
|
||||
void psxRcntWcount(u32 index, u32 value) {
|
||||
|
|
|
@ -26,8 +26,6 @@
|
|||
#include "r3000a.h"
|
||||
#include "gte.h"
|
||||
#include "psxhle.h"
|
||||
/*FIXME*/
|
||||
#include "../gui/hdebug.h"
|
||||
|
||||
static int branch = 0;
|
||||
static int branch2 = 0;
|
||||
|
@ -42,7 +40,6 @@ static u32 branchPC;
|
|||
#endif
|
||||
|
||||
inline void execI();
|
||||
inline void execIDbg();
|
||||
|
||||
// Subsets
|
||||
void (*psxBSC[64])();
|
||||
|
@ -773,21 +770,11 @@ static void intExecute() {
|
|||
execI();
|
||||
}
|
||||
|
||||
static void intExecuteDbg() {
|
||||
for (;;)
|
||||
execIDbg();
|
||||
}
|
||||
|
||||
static void intExecuteBlock() {
|
||||
branch2 = 0;
|
||||
while (!branch2) execI();
|
||||
}
|
||||
|
||||
static void intExecuteBlockDbg() {
|
||||
branch2 = 0;
|
||||
while (!branch2) execIDbg();
|
||||
}
|
||||
|
||||
static void intClear(u32 Addr, u32 Size) {
|
||||
}
|
||||
|
||||
|
@ -801,43 +788,14 @@ inline void execI() {
|
|||
|
||||
debugI();
|
||||
|
||||
if (Config.Debug) ProcessDebug();
|
||||
|
||||
psxRegs.pc += 4;
|
||||
psxRegs.cycle++;
|
||||
|
||||
psxBSC[psxRegs.code >> 26]();
|
||||
}
|
||||
|
||||
/* debugger version */
|
||||
inline void execIDbg() {
|
||||
u32 *code = (u32 *)PSXM(psxRegs.pc);
|
||||
psxRegs.code = ((code == NULL) ? 0 : SWAP32(*code));
|
||||
|
||||
// dump opcode when LOG_CPU is enabled
|
||||
debugI();
|
||||
|
||||
// normal execution
|
||||
if (!hdb_pause) {
|
||||
psxRegs.pc += 4;
|
||||
psxRegs.cycle++;
|
||||
psxBSC[psxRegs.code >> 26]();
|
||||
}
|
||||
|
||||
// trace one instruction
|
||||
if(hdb_pause == 2) {
|
||||
psxRegs.pc += 4;
|
||||
psxRegs.cycle++;
|
||||
psxBSC[psxRegs.code >> 26]();
|
||||
hdb_pause = 1;
|
||||
}
|
||||
|
||||
// wait for breakpoint
|
||||
if(hdb_pause == 3) {
|
||||
psxRegs.pc+= 4; psxRegs.cycle++;
|
||||
psxBSC[psxRegs.code >> 26]();
|
||||
if(psxRegs.pc == hdb_break) hdb_pause = 1;
|
||||
}
|
||||
}
|
||||
|
||||
R3000Acpu psxInt = {
|
||||
intInit,
|
||||
intReset,
|
||||
|
@ -846,12 +804,3 @@ R3000Acpu psxInt = {
|
|||
intClear,
|
||||
intShutdown
|
||||
};
|
||||
|
||||
R3000Acpu psxIntDbg = {
|
||||
intInit,
|
||||
intReset,
|
||||
intExecuteDbg,
|
||||
intExecuteBlockDbg,
|
||||
intClear,
|
||||
intShutdown
|
||||
};
|
||||
|
|
|
@ -141,6 +141,8 @@ u8 psxMemRead8(u32 mem) {
|
|||
} else {
|
||||
p = (char *)(psxMemRLUT[t]);
|
||||
if (p != NULL) {
|
||||
if (Config.Debug)
|
||||
DebugCheckBP((mem & 0xffffff) | 0x80000000, R1);
|
||||
return *(u8 *)(p + (mem & 0xffff));
|
||||
} else {
|
||||
#ifdef PSXMEM_LOG
|
||||
|
@ -164,6 +166,8 @@ u16 psxMemRead16(u32 mem) {
|
|||
} else {
|
||||
p = (char *)(psxMemRLUT[t]);
|
||||
if (p != NULL) {
|
||||
if (Config.Debug)
|
||||
DebugCheckBP((mem & 0xffffff) | 0x80000000, R2);
|
||||
return SWAPu16(*(u16 *)(p + (mem & 0xffff)));
|
||||
} else {
|
||||
#ifdef PSXMEM_LOG
|
||||
|
@ -187,6 +191,8 @@ u32 psxMemRead32(u32 mem) {
|
|||
} else {
|
||||
p = (char *)(psxMemRLUT[t]);
|
||||
if (p != NULL) {
|
||||
if (Config.Debug)
|
||||
DebugCheckBP((mem & 0xffffff) | 0x80000000, R4);
|
||||
return SWAPu32(*(u32 *)(p + (mem & 0xffff)));
|
||||
} else {
|
||||
#ifdef PSXMEM_LOG
|
||||
|
@ -210,7 +216,9 @@ void psxMemWrite8(u32 mem, u8 value) {
|
|||
} else {
|
||||
p = (char *)(psxMemWLUT[t]);
|
||||
if (p != NULL) {
|
||||
*(u8 *)(p + (mem & 0xffff)) = value;
|
||||
if (Config.Debug)
|
||||
DebugCheckBP((mem & 0xffffff) | 0x80000000, W1);
|
||||
*(u8 *)(p + (mem & 0xffff)) = value;
|
||||
#ifdef PSXREC
|
||||
psxCpu->Clear((mem & (~3)), 1);
|
||||
#endif
|
||||
|
@ -235,6 +243,8 @@ void psxMemWrite16(u32 mem, u16 value) {
|
|||
} else {
|
||||
p = (char *)(psxMemWLUT[t]);
|
||||
if (p != NULL) {
|
||||
if (Config.Debug)
|
||||
DebugCheckBP((mem & 0xffffff) | 0x80000000, W2);
|
||||
*(u16 *)(p + (mem & 0xffff)) = SWAPu16(value);
|
||||
#ifdef PSXREC
|
||||
psxCpu->Clear((mem & (~1)), 1);
|
||||
|
@ -261,6 +271,8 @@ void psxMemWrite32(u32 mem, u32 value) {
|
|||
} else {
|
||||
p = (char *)(psxMemWLUT[t]);
|
||||
if (p != NULL) {
|
||||
if (Config.Debug)
|
||||
DebugCheckBP((mem & 0xffffff) | 0x80000000, W4);
|
||||
*(u32 *)(p + (mem & 0xffff)) = SWAPu32(value);
|
||||
#ifdef PSXREC
|
||||
psxCpu->Clear(mem, 1);
|
||||
|
|
|
@ -35,12 +35,10 @@ int psxInit() {
|
|||
|
||||
#ifdef PSXREC
|
||||
if (Config.Cpu) {
|
||||
if (Config.Dbg) psxCpu = &psxIntDbg;
|
||||
else psxCpu = &psxInt;
|
||||
psxCpu = &psxInt;
|
||||
} else psxCpu = &psxRec;
|
||||
#else
|
||||
if (Config.Dbg) psxCpu = &psxIntDbg;
|
||||
else psxCpu = &psxInt;
|
||||
psxCpu = &psxInt;
|
||||
#endif
|
||||
|
||||
Log = 0;
|
||||
|
|
|
@ -37,7 +37,6 @@ typedef struct {
|
|||
|
||||
R3000Acpu *psxCpu;
|
||||
extern R3000Acpu psxInt;
|
||||
extern R3000Acpu psxIntDbg;
|
||||
#if (defined(__x86_64__) || defined(__i386__) || defined(__sh__) || defined(__ppc__)) && !defined(NOPSXREC)
|
||||
extern R3000Acpu psxRec;
|
||||
#define PSXREC
|
||||
|
|
254
libpcsxcore/socket.c
Normal file
254
libpcsxcore/socket.c
Normal file
|
@ -0,0 +1,254 @@
|
|||
/* Pcsx - Pc Psx Emulator
|
||||
* Copyright (C) 1999-2003 Pcsx Team
|
||||
*
|
||||
* 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, see <http://www.gnu.org/licenses>.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#ifdef _WIN32
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "psxcommon.h"
|
||||
#include "socket.h"
|
||||
|
||||
static int server_socket = 0;
|
||||
static int client_socket = 0;
|
||||
|
||||
static char tbuf[513];
|
||||
static int ptr = 0;
|
||||
|
||||
#define PORT_NUMBER 12345
|
||||
|
||||
int StartServer() {
|
||||
struct hostent * localhostent;
|
||||
struct in_addr localhostaddr;
|
||||
struct sockaddr_in localsocketaddr;
|
||||
|
||||
#ifdef _WIN32
|
||||
WSADATA wsaData;
|
||||
|
||||
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
|
||||
return -1;
|
||||
#endif
|
||||
|
||||
server_socket = socket(AF_INET, SOCK_STREAM, 0);
|
||||
|
||||
#ifdef _WIN32
|
||||
if (server_socket == INVALID_SOCKET)
|
||||
return -1;
|
||||
#else
|
||||
if (server_socket == -1)
|
||||
return -1;
|
||||
#endif
|
||||
|
||||
SetsNonblock();
|
||||
|
||||
memset((void *)&localhostaddr, 0, sizeof(localhostaddr));
|
||||
memset(&localsocketaddr, 0, sizeof(struct sockaddr_in));
|
||||
|
||||
#ifdef _WIN32
|
||||
localhostaddr.S_un.S_addr = htonl(INADDR_ANY);
|
||||
#else
|
||||
localhostaddr.s_addr = htonl(INADDR_ANY);
|
||||
#endif
|
||||
localsocketaddr.sin_family = AF_INET;
|
||||
localsocketaddr.sin_addr = localhostaddr;
|
||||
localsocketaddr.sin_port = htons(PORT_NUMBER);
|
||||
|
||||
if (bind(server_socket, (struct sockaddr *) &localsocketaddr, sizeof(localsocketaddr)) < 0)
|
||||
return -1;
|
||||
|
||||
if (listen(server_socket, 1) != 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void StopServer() {
|
||||
#ifdef _WIN32
|
||||
shutdown(server_socket, SD_BOTH);
|
||||
closesocket(server_socket);
|
||||
WSACleanup();
|
||||
#else
|
||||
shutdown(server_socket, SHUT_RDWR);
|
||||
close(server_socket);
|
||||
#endif
|
||||
}
|
||||
|
||||
void GetClient() {
|
||||
int new_socket;
|
||||
char hello[256];
|
||||
|
||||
new_socket = accept(server_socket, 0, 0);
|
||||
|
||||
#ifdef _WIN32
|
||||
if (new_socket == INVALID_SOCKET)
|
||||
return;
|
||||
#else
|
||||
if (new_socket == -1)
|
||||
return;
|
||||
#endif
|
||||
if (client_socket)
|
||||
CloseClient();
|
||||
client_socket = new_socket;
|
||||
|
||||
#ifndef _WIN32
|
||||
{
|
||||
int flags;
|
||||
flags = fcntl(client_socket, F_GETFL, 0);
|
||||
fcntl(client_socket, F_SETFL, flags | O_NONBLOCK);
|
||||
}
|
||||
#endif
|
||||
|
||||
sprintf(hello, "000 PCSX Version %s - Debug console\r\n", PACKAGE_VERSION);
|
||||
WriteSocket(hello, strlen(hello));
|
||||
ptr = 0;
|
||||
}
|
||||
|
||||
void CloseClient() {
|
||||
if (client_socket) {
|
||||
#ifdef _WIN32
|
||||
shutdown(client_socket, SD_BOTH);
|
||||
closesocket(client_socket);
|
||||
#else
|
||||
shutdown(client_socket, SHUT_RDWR);
|
||||
close(client_socket);
|
||||
#endif
|
||||
client_socket = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int HasClient() {
|
||||
return client_socket ? 1 : 0;
|
||||
}
|
||||
|
||||
int ReadSocket(char * buffer, int len) {
|
||||
int r;
|
||||
char * endl;
|
||||
|
||||
if (!client_socket)
|
||||
return -1;
|
||||
|
||||
r = recv(client_socket, tbuf + ptr, 512 - ptr, 0);
|
||||
|
||||
if (r == 0) {
|
||||
client_socket = 0;
|
||||
if (!ptr)
|
||||
return 0;
|
||||
}
|
||||
#ifdef _WIN32
|
||||
if (r == SOCKET_ERROR)
|
||||
#else
|
||||
if (r == -1)
|
||||
#endif
|
||||
{
|
||||
if (ptr == 0)
|
||||
return -1;
|
||||
r = 0;
|
||||
}
|
||||
ptr += r;
|
||||
tbuf[ptr] = 0;
|
||||
|
||||
endl = strstr(tbuf, "\r\n");
|
||||
|
||||
if (endl) {
|
||||
r = endl - tbuf;
|
||||
strncpy(buffer, tbuf, r);
|
||||
|
||||
r += 2;
|
||||
memmove(tbuf, tbuf + r, 512 - r);
|
||||
ptr -= r;
|
||||
memset(tbuf + r, 0, 512 - r);
|
||||
r -= 2;
|
||||
|
||||
} else {
|
||||
r = 0;
|
||||
}
|
||||
|
||||
buffer[r] = 0;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
int RawReadSocket(char * buffer, int len) {
|
||||
int r;
|
||||
int mlen = len < ptr ? len : ptr;
|
||||
|
||||
if (!client_socket)
|
||||
return -1;
|
||||
|
||||
if (ptr) {
|
||||
memcpy(buffer, tbuf, mlen);
|
||||
ptr -= mlen;
|
||||
memmove(tbuf, tbuf + mlen, 512 - mlen);
|
||||
}
|
||||
|
||||
if (len - mlen)
|
||||
r = recv(client_socket, buffer + mlen, len - mlen, 0);
|
||||
|
||||
if (r == 0) {
|
||||
client_socket = 0;
|
||||
if (!ptr)
|
||||
return 0;
|
||||
}
|
||||
#ifdef _WIN32
|
||||
if (r == SOCKET_ERROR)
|
||||
#else
|
||||
if (r == -1)
|
||||
#endif
|
||||
{
|
||||
if (ptr == 0)
|
||||
return -1;
|
||||
r = 0;
|
||||
}
|
||||
|
||||
r += mlen;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
void WriteSocket(char * buffer, int len) {
|
||||
if (!client_socket)
|
||||
return;
|
||||
|
||||
send(client_socket, buffer, len, 0);
|
||||
}
|
||||
|
||||
void SetsBlock() {
|
||||
#ifdef _WIN32
|
||||
u_long b = 0;
|
||||
ioctlsocket(server_socket, FIONBIO, &b);
|
||||
#else
|
||||
int flags = fcntl(server_socket, F_GETFL, 0);
|
||||
fcntl(server_socket, F_SETFL, flags & ~O_NONBLOCK);
|
||||
#endif
|
||||
}
|
||||
|
||||
void SetsNonblock() {
|
||||
#ifdef _WIN32
|
||||
u_long b = 1;
|
||||
ioctlsocket(server_socket, FIONBIO, &b);
|
||||
#else
|
||||
int flags = fcntl(server_socket, F_GETFL, 0);
|
||||
fcntl(server_socket, F_SETFL, flags | O_NONBLOCK);
|
||||
#endif
|
||||
}
|
36
libpcsxcore/socket.h
Normal file
36
libpcsxcore/socket.h
Normal file
|
@ -0,0 +1,36 @@
|
|||
/* Pcsx - Pc Psx Emulator
|
||||
* Copyright (C) 1999-2003 Pcsx Team
|
||||
*
|
||||
* 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, see <http://www.gnu.org/licenses>.
|
||||
*/
|
||||
|
||||
#ifndef __SOCKET_H__
|
||||
#define __SOCKET_H__
|
||||
|
||||
int StartServer();
|
||||
void StopServer();
|
||||
|
||||
void GetClient();
|
||||
void CloseClient();
|
||||
|
||||
int HasClient();
|
||||
|
||||
int ReadSocket(char * buffer, int len);
|
||||
int RawReadSocket(char * buffer, int len);
|
||||
void WriteSocket(char * buffer, int len);
|
||||
|
||||
void SetsBlock();
|
||||
void SetsNonblock();
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user