git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@31468 e17a0e51-4ae3-4d35-97c3-1a29b211df97

This commit is contained in:
SND\weimingzhi_cp 2009-10-09 10:00:15 +00:00
parent 9c12bf58c8
commit c053578923
20 changed files with 1558 additions and 513 deletions

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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);
}

View File

@ -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

View File

@ -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 $@ $<

View File

@ -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();
}

View File

@ -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__ */

View File

@ -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 += \

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -107,7 +107,7 @@ typedef struct {
long Cdda;
long HLE;
long Cpu;
long Dbg;
long Debug;
long PsxOut;
long SpuIrq;
long RCntFix;

View File

@ -159,6 +159,7 @@ void psxRcntUpdate() {
}
psxRcntSet();
DebugVSync();
}
void psxRcntWcount(u32 index, u32 value) {

View File

@ -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
};

View File

@ -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);

View File

@ -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;

View File

@ -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
View 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
View 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