Introduced dynstr, other breaking changes
This commit is contained in:
parent
aecaf18a95
commit
486666e717
|
@ -51,6 +51,4 @@ add_subdirectory(libpcsxcore)
|
||||||
add_subdirectory(gui)
|
add_subdirectory(gui)
|
||||||
add_subdirectory(plugins)
|
add_subdirectory(plugins)
|
||||||
add_subdirectory(doc)
|
add_subdirectory(doc)
|
||||||
|
add_subdirectory(dynstr)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
message(STATUS "* Configuring dynstr")
|
||||||
|
|
||||||
|
set(SRCS dynstr/dynstr.c)
|
||||||
|
include_directories(dynstr/include)
|
||||||
|
add_library(dynstr STATIC ${SRCS})
|
|
@ -6,6 +6,8 @@ set_property(CACHE DYNAREC PROPERTY STRINGS auto x86_64 x86 ppc no)
|
||||||
option(ENABLE_CCDDA "Enables compressed CDDA support." OFF)
|
option(ENABLE_CCDDA "Enables compressed CDDA support." OFF)
|
||||||
option(USE_LIBARCHIVE "Enables compressed data-tracks support." OFF)
|
option(USE_LIBARCHIVE "Enables compressed data-tracks support." OFF)
|
||||||
|
|
||||||
|
include_directories(../dynstr/dynstr/include)
|
||||||
|
|
||||||
if (ENABLE_CCDDA)
|
if (ENABLE_CCDDA)
|
||||||
find_package(FFMPEG REQUIRED)
|
find_package(FFMPEG REQUIRED)
|
||||||
include_directories(${FFMPEG_INCLUDE_DIRS})
|
include_directories(${FFMPEG_INCLUDE_DIRS})
|
||||||
|
@ -114,4 +116,4 @@ endif()
|
||||||
set(SRCS ${SRCS} ${DYNAREC_SRC})
|
set(SRCS ${SRCS} ${DYNAREC_SRC})
|
||||||
|
|
||||||
add_library(pcsxcore STATIC ${SRCS})
|
add_library(pcsxcore STATIC ${SRCS})
|
||||||
target_link_libraries(pcsxcore ${FFMPEG_LIBRARIES} ${LibArchive_LIBRARIES} ${LIBS})
|
target_link_libraries(pcsxcore dynstr ${FFMPEG_LIBRARIES} ${LibArchive_LIBRARIES} ${LIBS})
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
#include "r3000a.h"
|
#include "r3000a.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "socket.h"
|
#include "socket.h"
|
||||||
|
#include <dynstr.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
PCSXR Debug console protocol description, version 1.0
|
PCSXR Debug console protocol description, version 1.0
|
||||||
|
@ -134,7 +136,7 @@ Execution flow control commands (3xx):
|
||||||
Soft (quick) resets.
|
Soft (quick) resets.
|
||||||
399
|
399
|
||||||
Resets.
|
Resets.
|
||||||
|
|
||||||
|
|
||||||
Server outputs:
|
Server outputs:
|
||||||
~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
|
@ -236,6 +238,9 @@ static int step_over = 0;
|
||||||
static u32 step_over_addr = 0;
|
static u32 step_over_addr = 0;
|
||||||
static int mapping_e = 0, mapping_r8 = 0, mapping_r16 = 0, mapping_r32 = 0, mapping_w8 = 0, mapping_w16 = 0, mapping_w32 = 0;
|
static int mapping_e = 0, mapping_r8 = 0, mapping_r16 = 0, mapping_r32 = 0, mapping_w8 = 0, mapping_w16 = 0, mapping_w32 = 0;
|
||||||
static int breakmp_e = 0, breakmp_r8 = 0, breakmp_r16 = 0, breakmp_r32 = 0, breakmp_w8 = 0, breakmp_w16 = 0, breakmp_w32 = 0;
|
static int breakmp_e = 0, breakmp_r8 = 0, breakmp_r16 = 0, breakmp_r32 = 0, breakmp_w8 = 0, breakmp_w16 = 0, breakmp_w32 = 0;
|
||||||
|
static int server_socket, client_socket;
|
||||||
|
static char tbuf[513];
|
||||||
|
static size_t ptr;
|
||||||
|
|
||||||
static void ProcessCommands();
|
static void ProcessCommands();
|
||||||
|
|
||||||
|
@ -317,6 +322,11 @@ breakpoint_t *find_breakpoint(int number) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartDebugger() {
|
void StartDebugger() {
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
PORT_NUMBER = 12345
|
||||||
|
};
|
||||||
|
|
||||||
if (debugger_active)
|
if (debugger_active)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -326,7 +336,9 @@ void StartDebugger() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StartServer() == -1) {
|
server_socket = StartServer(PORT_NUMBER);
|
||||||
|
|
||||||
|
if (server_socket == -1) {
|
||||||
SysPrintf("%s", _("Unable to start debug server.\n"));
|
SysPrintf("%s", _("Unable to start debug server.\n"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -337,7 +349,7 @@ void StartDebugger() {
|
||||||
|
|
||||||
void StopDebugger() {
|
void StopDebugger() {
|
||||||
if (debugger_active) {
|
if (debugger_active) {
|
||||||
StopServer();
|
StopServer(server_socket);
|
||||||
SysPrintf("%s", _("Debugger stopped.\n"));
|
SysPrintf("%s", _("Debugger stopped.\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -361,6 +373,14 @@ void ResumeDebugger() {
|
||||||
paused = 0;
|
paused = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void DebugHello(void)
|
||||||
|
{
|
||||||
|
static const char hello[] = "000 PCSXR Version " PACKAGE_VERSION " - Debug console\r\n";
|
||||||
|
|
||||||
|
WriteSocket(client_socket, hello, sizeof hello);
|
||||||
|
ptr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void DebugVSync() {
|
void DebugVSync() {
|
||||||
if (!debugger_active || resetting)
|
if (!debugger_active || resetting)
|
||||||
return;
|
return;
|
||||||
|
@ -375,7 +395,7 @@ void DebugVSync() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
GetClient();
|
client_socket = GetClient(server_socket);
|
||||||
ProcessCommands();
|
ProcessCommands();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,33 +418,42 @@ void ProcessDebug() {
|
||||||
}
|
}
|
||||||
if (!paused) {
|
if (!paused) {
|
||||||
if(trace && printpc) {
|
if(trace && printpc) {
|
||||||
char reply[256];
|
struct dynstr reply;
|
||||||
sprintf(reply, "219 %s\r\n", disR3000AF(psxMemRead32(psxRegs.pc), psxRegs.pc));
|
|
||||||
WriteSocket(reply, strlen(reply));
|
dynstr_init(&reply);
|
||||||
|
dynstr_append(&reply, "219 %s\r\n", disR3000AF(psxMemRead32(psxRegs.pc), psxRegs.pc));
|
||||||
|
WriteSocket(client_socket, reply.str, reply.len);
|
||||||
|
dynstr_free(&reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(step_over) {
|
if(step_over) {
|
||||||
if(psxRegs.pc == step_over_addr) {
|
if(psxRegs.pc == step_over_addr) {
|
||||||
char reply[256];
|
struct dynstr reply;
|
||||||
|
|
||||||
|
dynstr_init(&reply);
|
||||||
step_over = 0;
|
step_over = 0;
|
||||||
step_over_addr = 0;
|
step_over_addr = 0;
|
||||||
sprintf(reply, "050 @%08X\r\n", psxRegs.pc);
|
dynstr_append(&reply, "050 @%08X\r\n", psxRegs.pc);
|
||||||
WriteSocket(reply, strlen(reply));
|
WriteSocket(client_socket, reply.str, reply.len);
|
||||||
|
dynstr_free(&reply);
|
||||||
paused = 1;
|
paused = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(run_to) {
|
if(run_to) {
|
||||||
if(psxRegs.pc == run_to_addr) {
|
if(psxRegs.pc == run_to_addr) {
|
||||||
char reply[256];
|
struct dynstr reply;
|
||||||
|
|
||||||
run_to = 0;
|
run_to = 0;
|
||||||
run_to_addr = 0;
|
run_to_addr = 0;
|
||||||
sprintf(reply, "040 @%08X\r\n", psxRegs.pc);
|
dynstr_init(&reply);
|
||||||
WriteSocket(reply, strlen(reply));
|
dynstr_append(&reply, "040 @%08X\r\n", psxRegs.pc);
|
||||||
|
WriteSocket(client_socket, reply.str, reply.len);
|
||||||
|
dynstr_free(&reply);
|
||||||
paused = 1;
|
paused = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugCheckBP(psxRegs.pc, BE);
|
DebugCheckBP(psxRegs.pc, BE);
|
||||||
}
|
}
|
||||||
if (mapping_e) {
|
if (mapping_e) {
|
||||||
|
@ -437,7 +466,7 @@ void ProcessDebug() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (paused) {
|
while (paused) {
|
||||||
GetClient();
|
client_socket = GetClient(server_socket);
|
||||||
ProcessCommands();
|
ProcessCommands();
|
||||||
GPU_updateLace();
|
GPU_updateLace();
|
||||||
SysUpdate();
|
SysUpdate();
|
||||||
|
@ -446,14 +475,32 @@ void ProcessDebug() {
|
||||||
|
|
||||||
static void ProcessCommands() {
|
static void ProcessCommands() {
|
||||||
int code, i, dumping;
|
int code, i, dumping;
|
||||||
FILE *sfile;
|
char cmd[348], *arguments, *p, *save, *dump = NULL;
|
||||||
char cmd[257], *arguments, *p, reply[10240], *save, *dump = NULL;
|
|
||||||
u32 reg, value, size = 0, address;
|
u32 reg, value, size = 0, address;
|
||||||
breakpoint_t *bp;
|
breakpoint_t *bp;
|
||||||
|
size_t len = sizeof cmd;
|
||||||
|
struct dynstr reply;
|
||||||
|
|
||||||
|
if (HasClient(client_socket))
|
||||||
|
{
|
||||||
|
const enum read_socket_err err = ReadSocket(client_socket, cmd, &len);
|
||||||
|
|
||||||
|
switch (err)
|
||||||
|
{
|
||||||
|
case READ_SOCKET_OK:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case READ_SOCKET_ERR_INVALID_ARG:
|
||||||
|
/* Fall through. */
|
||||||
|
case READ_SOCKET_ERR_RECV:
|
||||||
|
/* Fall through. */
|
||||||
|
case READ_SOCKET_SHUTDOWN:
|
||||||
|
/* Fall through. */
|
||||||
|
default:
|
||||||
|
perror("recv() error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!HasClient())
|
|
||||||
return;
|
|
||||||
if (ReadSocket(cmd, 256) > 0) {
|
|
||||||
arguments = NULL;
|
arguments = NULL;
|
||||||
if (strlen(cmd) <= 2) {
|
if (strlen(cmd) <= 2) {
|
||||||
code = 0;
|
code = 0;
|
||||||
|
@ -475,129 +522,126 @@ static void ProcessCommands() {
|
||||||
|
|
||||||
dumping = 0;
|
dumping = 0;
|
||||||
save = NULL;
|
save = NULL;
|
||||||
|
dynstr_init(&reply);
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case 0x100:
|
case 0x100:
|
||||||
sprintf(reply, "200 %s\r\n", arguments == NULL ? "OK" : arguments);
|
dynstr_append(&reply, "200 %s\r\n", arguments == NULL ? "OK" : arguments);
|
||||||
break;
|
break;
|
||||||
case 0x101:
|
case 0x101:
|
||||||
sprintf(reply, "201 %s\r\n", PACKAGE_VERSION);
|
dynstr_append(&reply, "201 %s\r\n", PACKAGE_VERSION);
|
||||||
break;
|
break;
|
||||||
case 0x102:
|
case 0x102:
|
||||||
sprintf(reply, "202 1.0\r\n");
|
dynstr_append(&reply, "202 1.0\r\n");
|
||||||
break;
|
break;
|
||||||
case 0x103:
|
case 0x103:
|
||||||
sprintf(reply, "203 %i\r\n", paused ? 1 : trace ? 2 : 0);
|
dynstr_append(&reply, "203 %i\r\n", paused ? 1 : trace ? 2 : 0);
|
||||||
break;
|
break;
|
||||||
case 0x110:
|
case 0x110:
|
||||||
sprintf(reply, "210 PC=%08X\r\n", psxRegs.pc);
|
dynstr_append(&reply, "210 PC=%08X\r\n", psxRegs.pc);
|
||||||
break;
|
break;
|
||||||
case 0x111:
|
case 0x111:
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "511 Malformed 111 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "511 Malformed 111 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!arguments) {
|
if (!arguments) {
|
||||||
reply[0] = 0;
|
|
||||||
for (i = 0; i < 32; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
sprintf(reply, "%s211 %02X(%2.2s)=%08X\r\n", reply, i, disRNameGPR[i], psxRegs.GPR.r[i]);
|
dynstr_append(&reply, "211 %02X(%2.2s)=%08X\r\n", reply, i, disRNameGPR[i], psxRegs.GPR.r[i]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((code >= 0) && (code < 32)) {
|
if ((code >= 0) && (code < 32)) {
|
||||||
sprintf(reply, "211 %02X(%2.2s)=%08X\r\n", code, disRNameGPR[code], psxRegs.GPR.r[code]);
|
dynstr_append(&reply, "211 %02X(%2.2s)=%08X\r\n", code, disRNameGPR[code], psxRegs.GPR.r[code]);
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "511 Invalid GPR register: %X\r\n", code);
|
dynstr_append(&reply, "511 Invalid GPR register: %X\r\n", code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x112:
|
case 0x112:
|
||||||
sprintf(reply, "212 LO=%08X HI=%08X\r\n", psxRegs.GPR.n.lo, psxRegs.GPR.n.hi);
|
dynstr_append(&reply, "212 LO=%08X HI=%08X\r\n", psxRegs.GPR.n.lo, psxRegs.GPR.n.hi);
|
||||||
break;
|
break;
|
||||||
case 0x113:
|
case 0x113:
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "511 Malformed 113 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "511 Malformed 113 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!arguments) {
|
if (!arguments) {
|
||||||
reply[0] = 0;
|
|
||||||
for (i = 0; i < 32; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
sprintf(reply, "%s213 %02X(%8.8s)=%08X\r\n", reply, i, disRNameCP0[i], psxRegs.CP0.r[i]);
|
dynstr_append(&reply, "213 %02X(%8.8s)=%08X\r\n", i, disRNameCP0[i], psxRegs.CP0.r[i]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((code >= 0) && (code < 32)) {
|
if ((code >= 0) && (code < 32)) {
|
||||||
sprintf(reply, "213 %02X(%8.8s)=%08X\r\n", code, disRNameCP0[code], psxRegs.CP0.r[code]);
|
dynstr_append(&reply, "213 %02X(%8.8s)=%08X\r\n", code, disRNameCP0[code], psxRegs.CP0.r[code]);
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "511 Invalid COP0 register: %X\r\n", code);
|
dynstr_append(&reply, "511 Invalid COP0 register: %X\r\n", code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x114:
|
case 0x114:
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "511 Malformed 114 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "511 Malformed 114 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!arguments) {
|
if (!arguments) {
|
||||||
reply[0] = 0;
|
|
||||||
for (i = 0; i < 32; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
sprintf(reply, "%s214 %02X(%6.6s)=%08X\r\n", reply, i, disRNameCP2C[i], psxRegs.CP2C.r[i]);
|
dynstr_append(&reply, "214 %02X(%6.6s)=%08X\r\n", i, disRNameCP2C[i], psxRegs.CP2C.r[i]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((code >= 0) && (code < 32)) {
|
if ((code >= 0) && (code < 32)) {
|
||||||
sprintf(reply, "214 %02X(%6.6s)=%08X\r\n", code, disRNameCP2C[code], psxRegs.CP2C.r[code]);
|
dynstr_append(&reply, "214 %02X(%6.6s)=%08X\r\n", code, disRNameCP2C[code], psxRegs.CP2C.r[code]);
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "511 Invalid COP2C register: %X\r\n", code);
|
dynstr_append(&reply, "511 Invalid COP2C register: %X\r\n", code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x115:
|
case 0x115:
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "511 Malformed 111 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "511 Malformed 111 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!arguments) {
|
if (!arguments) {
|
||||||
reply[0] = 0;
|
|
||||||
for (i = 0; i < 32; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
sprintf(reply, "%s215 %02X(%4.4s)=%08X\r\n", reply, i, disRNameCP2D[i], psxRegs.CP2D.r[i]);
|
dynstr_append(&reply, "215 %02X(%4.4s)=%08X\r\n", i, disRNameCP2D[i], psxRegs.CP2D.r[i]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((code >= 0) && (code < 32)) {
|
if ((code >= 0) && (code < 32)) {
|
||||||
sprintf(reply, "215 %02X(%4.4s)=%08X\r\n", code, disRNameCP2D[code], psxRegs.CP2D.r[code]);
|
dynstr_append(&reply, "215 %02X(%4.4s)=%08X\r\n", code, disRNameCP2D[code], psxRegs.CP2D.r[code]);
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "511 Invalid COP2D register: %X\r\n", code);
|
dynstr_append(&reply, "511 Invalid COP2D register: %X\r\n", code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x119:
|
case 0x119:
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%08X", &code) != 1) {
|
if (sscanf(arguments, "%08X", &code) != 1) {
|
||||||
sprintf(reply, "511 Malformed 119 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "511 Malformed 119 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!arguments)
|
if (!arguments)
|
||||||
code = psxRegs.pc;
|
code = psxRegs.pc;
|
||||||
|
|
||||||
sprintf(reply, "219 %s\r\n", disR3000AF(psxMemRead32(code), code));
|
dynstr_append(&reply, "219 %s\r\n", disR3000AF(psxMemRead32(code), code));
|
||||||
break;
|
break;
|
||||||
case 0x121:
|
case 0x121:
|
||||||
if (!arguments || sscanf(arguments, "%02X=%08X", ®, &value) != 2) {
|
if (!arguments || sscanf(arguments, "%02X=%08X", ®, &value) != 2) {
|
||||||
sprintf(reply, "500 Malformed 121 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 121 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reg < 32) {
|
if (reg < 32) {
|
||||||
psxRegs.GPR.r[reg] = value;
|
psxRegs.GPR.r[reg] = value;
|
||||||
sprintf(reply, "221 %02X=%08X\r\n", reg, value);
|
dynstr_append(&reply, "221 %02X=%08X\r\n", reg, value);
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "512 Invalid GPR register: %02X\r\n", reg);
|
dynstr_append(&reply, "512 Invalid GPR register: %02X\r\n", reg);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x122:
|
case 0x122:
|
||||||
|
@ -607,88 +651,88 @@ static void ProcessCommands() {
|
||||||
reg = 32;
|
reg = 32;
|
||||||
} else {
|
} else {
|
||||||
arguments[2] = 0;
|
arguments[2] = 0;
|
||||||
sprintf(reply, "512 Invalid LO/HI register: '%s'\r\n", arguments);
|
dynstr_append(&reply, "512 Invalid LO/HI register: '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sscanf(arguments + 3, "%08X", &value) != 1) {
|
if (sscanf(arguments + 3, "%08X", &value) != 1) {
|
||||||
sprintf(reply, "500 Malformed 122 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 122 command '%s'\r\n", arguments);
|
||||||
} else {
|
} else {
|
||||||
psxRegs.GPR.r[reg] = value;
|
psxRegs.GPR.r[reg] = value;
|
||||||
sprintf(reply, "222 LO=%08X HI=%08X\r\n", psxRegs.GPR.n.lo, psxRegs.GPR.n.hi);
|
dynstr_append(&reply, "222 LO=%08X HI=%08X\r\n", psxRegs.GPR.n.lo, psxRegs.GPR.n.hi);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x123:
|
case 0x123:
|
||||||
if (!arguments || sscanf(arguments, "%02X=%08X", ®, &value) != 2) {
|
if (!arguments || sscanf(arguments, "%02X=%08X", ®, &value) != 2) {
|
||||||
sprintf(reply, "500 Malformed 123 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 123 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reg < 32) {
|
if (reg < 32) {
|
||||||
psxRegs.CP0.r[reg] = value;
|
psxRegs.CP0.r[reg] = value;
|
||||||
sprintf(reply, "223 %02X=%08X\r\n", reg, value);
|
dynstr_append(&reply, "223 %02X=%08X\r\n", reg, value);
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "512 Invalid COP0 register: %02X\r\n", reg);
|
dynstr_append(&reply, "512 Invalid COP0 register: %02X\r\n", reg);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x124:
|
case 0x124:
|
||||||
if (!arguments || sscanf(arguments, "%02X=%08X", ®, &value) != 2) {
|
if (!arguments || sscanf(arguments, "%02X=%08X", ®, &value) != 2) {
|
||||||
sprintf(reply, "500 Malformed 124 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 124 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reg < 32) {
|
if (reg < 32) {
|
||||||
psxRegs.CP2C.r[reg] = value;
|
psxRegs.CP2C.r[reg] = value;
|
||||||
sprintf(reply, "224 %02X=%08X\r\n", reg, value);
|
dynstr_append(&reply, "224 %02X=%08X\r\n", reg, value);
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "512 Invalid COP2C register: %02X\r\n", reg);
|
dynstr_append(&reply, "512 Invalid COP2C register: %02X\r\n", reg);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x125:
|
case 0x125:
|
||||||
if (!arguments || sscanf(arguments, "%02X=%08X", ®, &value) != 2) {
|
if (!arguments || sscanf(arguments, "%02X=%08X", ®, &value) != 2) {
|
||||||
sprintf(reply, "500 Malformed 121 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 121 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (reg < 32) {
|
if (reg < 32) {
|
||||||
psxRegs.CP2D.r[reg] = value;
|
psxRegs.CP2D.r[reg] = value;
|
||||||
sprintf(reply, "225 %02X=%08X\r\n", reg, value);
|
dynstr_append(&reply, "225 %02X=%08X\r\n", reg, value);
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "512 Invalid COP2D register: %02X\r\n", reg);
|
dynstr_append(&reply, "512 Invalid COP2D register: %02X\r\n", reg);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x130:
|
case 0x130:
|
||||||
if (!arguments || sscanf(arguments, "%08X@%08X", &size, &address) != 2) {
|
if (!arguments || sscanf(arguments, "%08X@%08X", &size, &address) != 2) {
|
||||||
sprintf(reply, "500 Malformed 130 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 130 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((address >= 0x80000000) && ((address + size) <= 0x80200000)) {
|
if ((address >= 0x80000000) && ((address + size) <= 0x80200000)) {
|
||||||
sprintf(reply, "230 %08X@%08X\r\n", size, address);
|
dynstr_append(&reply, "230 %08X@%08X\r\n", size, address);
|
||||||
dump = (char *) PSXM(address);
|
dump = (char *) PSXM(address);
|
||||||
dumping = 1;
|
dumping = 1;
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "513 Invalid address or range: '%s'\r\n", arguments);
|
dynstr_append(&reply, "513 Invalid address or range: '%s'\r\n", arguments);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x140:
|
case 0x140:
|
||||||
if (!arguments || sscanf(arguments, "%08X@%08X", &size, &address) != 2) {
|
if (!arguments || sscanf(arguments, "%08X@%08X", &size, &address) != 2) {
|
||||||
sprintf(reply, "500 Malformed 140 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 140 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((address >= 0x80000000) && ((address + size) <= 0x80200000)) {
|
if ((address >= 0x80000000) && ((address + size) <= 0x80200000)) {
|
||||||
sprintf(reply, "240 %08X@%08X\r\n", size, address);
|
dynstr_append(&reply, "240 %08X@%08X\r\n", size, address);
|
||||||
RawReadSocket((char *)PSXM(address), size);
|
RawReadSocket(client_socket, (char *)PSXM(address), size);
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "514 Invalid address or range: '%s'\r\n", arguments);
|
dynstr_append(&reply, "514 Invalid address or range: '%s'\r\n", arguments);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x150:
|
case 0x150:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 150 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 150 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -701,13 +745,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
mapping_e = 0;
|
mapping_e = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "250 Mapping of exec flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "250 Mapping of exec flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x151:
|
case 0x151:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 151 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 151 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -719,13 +763,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
mapping_r8 = 0;
|
mapping_r8 = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "251 Mapping of read8 flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "251 Mapping of read8 flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x152:
|
case 0x152:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 152 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 152 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -737,13 +781,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
mapping_r16 = 0;
|
mapping_r16 = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "252 Mapping of read16 flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "252 Mapping of read16 flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x153:
|
case 0x153:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 153 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 153 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -755,13 +799,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
mapping_r32 = 0;
|
mapping_r32 = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "253 Mapping of read32 flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "253 Mapping of read32 flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x154:
|
case 0x154:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 154 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 154 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -773,13 +817,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
mapping_w8 = 0;
|
mapping_w8 = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "254 Mapping of write8 flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "254 Mapping of write8 flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x155:
|
case 0x155:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 155 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 155 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -791,13 +835,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
mapping_w16 = 0;
|
mapping_w16 = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "255 Mapping of write16 flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "255 Mapping of write16 flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x156:
|
case 0x156:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 156 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 156 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -809,13 +853,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
mapping_w32 = 0;
|
mapping_w32 = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "256 Mapping of write32 flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "256 Mapping of write32 flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x160:
|
case 0x160:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 160 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 160 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -824,13 +868,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
breakmp_e = 0;
|
breakmp_e = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "260 Break on map of exec flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "260 Break on map of exec flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x161:
|
case 0x161:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 161 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 161 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -839,13 +883,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
breakmp_r8 = 0;
|
breakmp_r8 = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "261 Break on map of read8 flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "261 Break on map of read8 flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x162:
|
case 0x162:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 162 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 162 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -854,13 +898,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
breakmp_r16 = 0;
|
breakmp_r16 = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "262 Break on map of read16 flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "262 Break on map of read16 flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x163:
|
case 0x163:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 163 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 163 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -869,13 +913,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
breakmp_r32 = 0;
|
breakmp_r32 = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "263 Break on map of read32 flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "263 Break on map of read32 flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x164:
|
case 0x164:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 164 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 164 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -884,13 +928,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
breakmp_w8 = 0;
|
breakmp_w8 = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "264 Break on map of write8 flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "264 Break on map of write8 flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x165:
|
case 0x165:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 165 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 165 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -899,13 +943,13 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
breakmp_w16 = 0;
|
breakmp_w16 = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "265 Break on map of write16 flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "265 Break on map of write16 flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x166:
|
case 0x166:
|
||||||
code = 1;
|
code = 1;
|
||||||
if (arguments) {
|
if (arguments) {
|
||||||
if (sscanf(arguments, "%02X", &code) != 1) {
|
if (sscanf(arguments, "%02X", &code) != 1) {
|
||||||
sprintf(reply, "500 Malformed 166 command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Malformed 166 command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -914,30 +958,37 @@ static void ProcessCommands() {
|
||||||
} else {
|
} else {
|
||||||
breakmp_w32 = 0;
|
breakmp_w32 = 0;
|
||||||
}
|
}
|
||||||
sprintf(reply, "266 Break on map of write32 flow %s\r\n", code ? "started" : "stopped");
|
dynstr_append(&reply, "266 Break on map of write32 flow %s\r\n", code ? "started" : "stopped");
|
||||||
break;
|
break;
|
||||||
case 0x170:
|
case 0x170:
|
||||||
sfile = fopen("flow.idc", "wb");
|
{
|
||||||
fprintf(sfile, "#include <idc.idc>\r\n\r\n");
|
{
|
||||||
fprintf(sfile, "static main(void) {\r\n");
|
FILE *const sfile = fopen("flow.idc", "wb");
|
||||||
for (i = 0; i < 0x00200000; i++) {
|
fprintf(sfile, "#include <idc.idc>\r\n\r\n");
|
||||||
if (IsMapMarked(i, MAP_EXEC_JAL)) {
|
fprintf(sfile, "static main(void) {\r\n");
|
||||||
fprintf(sfile, "\tMakeFunction(0X8%07X,BADADDR);\r\n", i);
|
for (i = 0; i < 0x00200000; i++) {
|
||||||
|
if (IsMapMarked(i, MAP_EXEC_JAL)) {
|
||||||
|
fprintf(sfile, "\tMakeFunction(0X8%07X,BADADDR);\r\n", i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
fprintf(sfile, "}\r\n");
|
||||||
|
fclose(sfile);
|
||||||
}
|
}
|
||||||
fprintf(sfile, "}\r\n");
|
|
||||||
fclose(sfile);
|
{
|
||||||
sfile = fopen("markcode.idc", "wb");
|
FILE *const sfile = fopen("markcode.idc", "wb");
|
||||||
fprintf(sfile, "#include <idc.idc>\r\n\r\n");
|
fprintf(sfile, "#include <idc.idc>\r\n\r\n");
|
||||||
fprintf(sfile, "static main(void) {\r\n");
|
fprintf(sfile, "static main(void) {\r\n");
|
||||||
for (i = 0; i < 0x00200000; i++) {
|
for (i = 0; i < 0x00200000; i++) {
|
||||||
if (IsMapMarked(i, MAP_EXEC)) {
|
if (IsMapMarked(i, MAP_EXEC)) {
|
||||||
fprintf(sfile, "\tMakeCode(0X8%07X);\r\n", i);
|
fprintf(sfile, "\tMakeCode(0X8%07X);\r\n", i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
fprintf(sfile, "}\r\n");
|
||||||
|
fclose(sfile);
|
||||||
|
dynstr_append(&reply, "270 flow.idc and markcode.idc dumped\r\n");
|
||||||
}
|
}
|
||||||
fprintf(sfile, "}\r\n");
|
}
|
||||||
fclose(sfile);
|
|
||||||
sprintf(reply, "270 flow.idc and markcode.idc dumped\r\n");
|
|
||||||
break;
|
break;
|
||||||
case 0x300:
|
case 0x300:
|
||||||
p = arguments;
|
p = arguments;
|
||||||
|
@ -946,18 +997,17 @@ static void ProcessCommands() {
|
||||||
}
|
}
|
||||||
if (p == arguments) {
|
if (p == arguments) {
|
||||||
if (first) {
|
if (first) {
|
||||||
reply[0] = 0;
|
|
||||||
for (bp = first; bp; bp = next_breakpoint(bp)) {
|
for (bp = first; bp; bp = next_breakpoint(bp)) {
|
||||||
sprintf(reply, "%s400 %X@%08X-%s\r\n", reply, bp->number, bp->address, breakpoint_type_names[bp->type]);
|
dynstr_append(&reply, "%s400 %X@%08X-%s\r\n", bp->number, bp->address, breakpoint_type_names[bp->type]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "530 No breakpoint\r\n");
|
dynstr_append(&reply, "530 No breakpoint\r\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((bp = find_breakpoint(code))) {
|
if ((bp = find_breakpoint(code))) {
|
||||||
sprintf(reply, "400 %X@%08X-%s\r\n", bp->number, bp->address, breakpoint_type_names[bp->type]);
|
dynstr_append(&reply, "400 %X@%08X-%s\r\n", bp->number, bp->address, breakpoint_type_names[bp->type]);
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "530 Invalid breakpoint number: %X\r\n", code);
|
dynstr_append(&reply, "530 Invalid breakpoint number: %X\r\n", code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -968,107 +1018,107 @@ static void ProcessCommands() {
|
||||||
}
|
}
|
||||||
if (p == arguments) {
|
if (p == arguments) {
|
||||||
while (first != NULL) delete_breakpoint(first);
|
while (first != NULL) delete_breakpoint(first);
|
||||||
sprintf(reply, "401 All breakpoints deleted.\r\n");
|
dynstr_append(&reply, "401 All breakpoints deleted.\r\n");
|
||||||
} else {
|
} else {
|
||||||
if ((bp = find_breakpoint(code))) {
|
if ((bp = find_breakpoint(code))) {
|
||||||
delete_breakpoint(bp);
|
delete_breakpoint(bp);
|
||||||
sprintf(reply, "401 Breakpoint %X deleted.\r\n", code);
|
dynstr_append(&reply, "401 Breakpoint %X deleted.\r\n", code);
|
||||||
} else {
|
} else {
|
||||||
sprintf(reply, "530 Invalid breakpoint number: %X\r\n", code);
|
dynstr_append(&reply, "530 Invalid breakpoint number: %X\r\n", code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x310:
|
case 0x310:
|
||||||
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
||||||
sprintf(reply, "500 Malformed 310 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 310 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) {
|
// if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) {
|
||||||
// sprintf(reply, "531 Invalid address %08X\r\n", address);
|
// dynstr_append(&reply, "531 Invalid address %08X\r\n", address);
|
||||||
// break;
|
// break;
|
||||||
// }
|
// }
|
||||||
code = add_breakpoint(BE, address);
|
code = add_breakpoint(BE, address);
|
||||||
sprintf(reply, "410 %X\r\n", code);
|
dynstr_append(&reply, "410 %X\r\n", code);
|
||||||
break;
|
break;
|
||||||
case 0x320:
|
case 0x320:
|
||||||
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
||||||
sprintf(reply, "500 Malformed 320 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 320 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((address < 0x80000000) || (address >= 0x80200000)) {
|
if ((address < 0x80000000) || (address >= 0x80200000)) {
|
||||||
sprintf(reply, "532 Invalid address %08X\r\n", address);
|
dynstr_append(&reply, "532 Invalid address %08X\r\n", address);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
code = add_breakpoint(BR1, address);
|
code = add_breakpoint(BR1, address);
|
||||||
sprintf(reply, "420 %X\r\n", code);
|
dynstr_append(&reply, "420 %X\r\n", code);
|
||||||
break;
|
break;
|
||||||
case 0x321:
|
case 0x321:
|
||||||
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
||||||
sprintf(reply, "500 Malformed 321 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 321 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((address & 1) || (address < 0x80000000) || (address >= 0x80200000)) {
|
if ((address & 1) || (address < 0x80000000) || (address >= 0x80200000)) {
|
||||||
sprintf(reply, "532 Invalid address %08X\r\n", address);
|
dynstr_append(&reply, "532 Invalid address %08X\r\n", address);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
code = add_breakpoint(BR2, address);
|
code = add_breakpoint(BR2, address);
|
||||||
sprintf(reply, "421 %X\r\n", code);
|
dynstr_append(&reply, "421 %X\r\n", code);
|
||||||
break;
|
break;
|
||||||
case 0x322:
|
case 0x322:
|
||||||
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
||||||
sprintf(reply, "500 Malformed 322 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 322 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) {
|
if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) {
|
||||||
sprintf(reply, "532 Invalid address %08X\r\n", address);
|
dynstr_append(&reply, "532 Invalid address %08X\r\n", address);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
code = add_breakpoint(BR4, address);
|
code = add_breakpoint(BR4, address);
|
||||||
sprintf(reply, "422 %X\r\n", code);
|
dynstr_append(&reply, "422 %X\r\n", code);
|
||||||
break;
|
break;
|
||||||
case 0x330:
|
case 0x330:
|
||||||
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
||||||
sprintf(reply, "500 Malformed 330 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 330 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((address < 0x80000000) || (address >= 0x80200000)) {
|
if ((address < 0x80000000) || (address >= 0x80200000)) {
|
||||||
sprintf(reply, "533 Invalid address %08X\r\n", address);
|
dynstr_append(&reply, "533 Invalid address %08X\r\n", address);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
code = add_breakpoint(BW1, address);
|
code = add_breakpoint(BW1, address);
|
||||||
sprintf(reply, "430 %X\r\n", code);
|
dynstr_append(&reply, "430 %X\r\n", code);
|
||||||
break;
|
break;
|
||||||
case 0x331:
|
case 0x331:
|
||||||
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
||||||
sprintf(reply, "500 Malformed 331 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 331 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((address & 1) || (address < 0x80000000) || (address >= 0x80200000)) {
|
if ((address & 1) || (address < 0x80000000) || (address >= 0x80200000)) {
|
||||||
sprintf(reply, "533 Invalid address %08X\r\n", address);
|
dynstr_append(&reply, "533 Invalid address %08X\r\n", address);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
code = add_breakpoint(BW2, address);
|
code = add_breakpoint(BW2, address);
|
||||||
sprintf(reply, "431 %X\r\n", code);
|
dynstr_append(&reply, "431 %X\r\n", code);
|
||||||
break;
|
break;
|
||||||
case 0x332:
|
case 0x332:
|
||||||
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
if (!arguments || sscanf(arguments, "%08X", &address) != 1) {
|
||||||
sprintf(reply, "500 Malformed 332 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 332 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) {
|
if ((address & 3) || (address < 0x80000000) || (address >= 0x80200000)) {
|
||||||
sprintf(reply, "533 Invalid address %08X\r\n", address);
|
dynstr_append(&reply, "533 Invalid address %08X\r\n", address);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
code = add_breakpoint(BW4, address);
|
code = add_breakpoint(BW4, address);
|
||||||
sprintf(reply, "432 %X\r\n", code);
|
dynstr_append(&reply, "432 %X\r\n", code);
|
||||||
break;
|
break;
|
||||||
case 0x390:
|
case 0x390:
|
||||||
paused = 1;
|
paused = 1;
|
||||||
sprintf(reply, "490 Paused\r\n");
|
dynstr_append(&reply, "490 Paused\r\n");
|
||||||
break;
|
break;
|
||||||
case 0x391:
|
case 0x391:
|
||||||
paused = 0;
|
paused = 0;
|
||||||
sprintf(reply, "491 Resumed\r\n");
|
dynstr_append(&reply, "491 Resumed\r\n");
|
||||||
break;
|
break;
|
||||||
case 0x395:
|
case 0x395:
|
||||||
p = arguments;
|
p = arguments;
|
||||||
|
@ -1079,7 +1129,7 @@ static void ProcessCommands() {
|
||||||
trace = 1;
|
trace = 1;
|
||||||
}
|
}
|
||||||
paused = 0;
|
paused = 0;
|
||||||
sprintf(reply, "495 Tracing\r\n");
|
dynstr_append(&reply, "495 Tracing\r\n");
|
||||||
break;
|
break;
|
||||||
case 0x396:
|
case 0x396:
|
||||||
p = arguments;
|
p = arguments;
|
||||||
|
@ -1089,19 +1139,19 @@ static void ProcessCommands() {
|
||||||
if (p == arguments) {
|
if (p == arguments) {
|
||||||
printpc = !printpc;
|
printpc = !printpc;
|
||||||
}
|
}
|
||||||
sprintf(reply, "496 Printing %s\r\n", printpc ? "enabled" : "disabled");
|
dynstr_append(&reply, "496 Printing %s\r\n", printpc ? "enabled" : "disabled");
|
||||||
break;
|
break;
|
||||||
case 0x398:
|
case 0x398:
|
||||||
paused = 0;
|
paused = 0;
|
||||||
trace = 0;
|
trace = 0;
|
||||||
reset = 2;
|
reset = 2;
|
||||||
sprintf(reply, "498 Soft resetting\r\n");
|
dynstr_append(&reply, "498 Soft resetting\r\n");
|
||||||
break;
|
break;
|
||||||
case 0x399:
|
case 0x399:
|
||||||
paused = 0;
|
paused = 0;
|
||||||
trace = 0;
|
trace = 0;
|
||||||
reset = 1;
|
reset = 1;
|
||||||
sprintf(reply, "499 Resetting\r\n");
|
dynstr_append(&reply, "499 Resetting\r\n");
|
||||||
break;
|
break;
|
||||||
case 0x3A0:
|
case 0x3A0:
|
||||||
// run to
|
// run to
|
||||||
|
@ -1112,10 +1162,10 @@ static void ProcessCommands() {
|
||||||
paused = 0;
|
paused = 0;
|
||||||
}
|
}
|
||||||
if (p == arguments) {
|
if (p == arguments) {
|
||||||
sprintf(reply, "500 Malformed 3A0 command '%s'\r\n", arguments);
|
dynstr_append(&reply, "500 Malformed 3A0 command '%s'\r\n", arguments);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sprintf(reply, "4A0 run to addr %08X\r\n", run_to_addr);
|
dynstr_append(&reply, "4A0 run to addr %08X\r\n", run_to_addr);
|
||||||
break;
|
break;
|
||||||
case 0x3A1:
|
case 0x3A1:
|
||||||
// step over (jal)
|
// step over (jal)
|
||||||
|
@ -1125,8 +1175,8 @@ static void ProcessCommands() {
|
||||||
step_over = 1;
|
step_over = 1;
|
||||||
step_over_addr = psxRegs.pc + 8;
|
step_over_addr = psxRegs.pc + 8;
|
||||||
paused = 0;
|
paused = 0;
|
||||||
|
|
||||||
sprintf(reply, "4A1 step over addr %08X\r\n", psxRegs.pc);
|
dynstr_append(&reply, "4A1 step over addr %08X\r\n", psxRegs.pc);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
trace = 1;
|
trace = 1;
|
||||||
|
@ -1135,13 +1185,14 @@ static void ProcessCommands() {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
sprintf(reply, "500 Unknown command '%s'\r\n", cmd);
|
dynstr_append(&reply, "500 Unknown command '%s'\r\n", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
WriteSocket(reply, strlen(reply));
|
WriteSocket(client_socket, reply.str, reply.len);
|
||||||
|
dynstr_free(&reply);
|
||||||
|
|
||||||
if (dumping) {
|
if (dumping) {
|
||||||
WriteSocket(dump, size);
|
WriteSocket(client_socket, dump, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (save) {
|
if (save) {
|
||||||
|
@ -1156,11 +1207,11 @@ void DebugCheckBP(u32 address, enum breakpoint_types type) {
|
||||||
|
|
||||||
if (!debugger_active || reset)
|
if (!debugger_active || reset)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (bp = first; bp; bp = next_breakpoint(bp)) {
|
for (bp = first; bp; bp = next_breakpoint(bp)) {
|
||||||
if ((bp->type == type) && (bp->address == address)) {
|
if ((bp->type == type) && (bp->address == address)) {
|
||||||
sprintf(reply, "030 %X@%08X\r\n", bp->number, psxRegs.pc);
|
sprintf(reply, "030 %X@%08X\r\n", bp->number, psxRegs.pc);
|
||||||
WriteSocket(reply, strlen(reply));
|
WriteSocket(client_socket, reply, strlen(reply));
|
||||||
paused = 1;
|
paused = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1168,49 +1219,49 @@ void DebugCheckBP(u32 address, enum breakpoint_types type) {
|
||||||
if (breakmp_e && type == BE) {
|
if (breakmp_e && type == BE) {
|
||||||
if (!IsMapMarked(address, MAP_EXEC)) {
|
if (!IsMapMarked(address, MAP_EXEC)) {
|
||||||
sprintf(reply, "010 %08X@%08X\r\n", address, psxRegs.pc);
|
sprintf(reply, "010 %08X@%08X\r\n", address, psxRegs.pc);
|
||||||
WriteSocket(reply, strlen(reply));
|
WriteSocket(client_socket, reply, strlen(reply));
|
||||||
paused = 1;
|
paused = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (breakmp_r8 && type == BR1) {
|
if (breakmp_r8 && type == BR1) {
|
||||||
if (!IsMapMarked(address, MAP_R8)) {
|
if (!IsMapMarked(address, MAP_R8)) {
|
||||||
sprintf(reply, "011 %08X@%08X\r\n", address, psxRegs.pc);
|
sprintf(reply, "011 %08X@%08X\r\n", address, psxRegs.pc);
|
||||||
WriteSocket(reply, strlen(reply));
|
WriteSocket(client_socket, reply, strlen(reply));
|
||||||
paused = 1;
|
paused = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (breakmp_r16 && type == BR2) {
|
if (breakmp_r16 && type == BR2) {
|
||||||
if (!IsMapMarked(address, MAP_R16)) {
|
if (!IsMapMarked(address, MAP_R16)) {
|
||||||
sprintf(reply, "012 %08X@%08X\r\n", address, psxRegs.pc);
|
sprintf(reply, "012 %08X@%08X\r\n", address, psxRegs.pc);
|
||||||
WriteSocket(reply, strlen(reply));
|
WriteSocket(client_socket, reply, strlen(reply));
|
||||||
paused = 1;
|
paused = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (breakmp_r32 && type == BR4) {
|
if (breakmp_r32 && type == BR4) {
|
||||||
if (!IsMapMarked(address, MAP_R32)) {
|
if (!IsMapMarked(address, MAP_R32)) {
|
||||||
sprintf(reply, "013 %08X@%08X\r\n", address, psxRegs.pc);
|
sprintf(reply, "013 %08X@%08X\r\n", address, psxRegs.pc);
|
||||||
WriteSocket(reply, strlen(reply));
|
WriteSocket(client_socket, reply, strlen(reply));
|
||||||
paused = 1;
|
paused = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (breakmp_w8 && type == BW1) {
|
if (breakmp_w8 && type == BW1) {
|
||||||
if (!IsMapMarked(address, MAP_W8)) {
|
if (!IsMapMarked(address, MAP_W8)) {
|
||||||
sprintf(reply, "014 %08X@%08X\r\n", address, psxRegs.pc);
|
sprintf(reply, "014 %08X@%08X\r\n", address, psxRegs.pc);
|
||||||
WriteSocket(reply, strlen(reply));
|
WriteSocket(client_socket, reply, strlen(reply));
|
||||||
paused = 1;
|
paused = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (breakmp_w16 && type == BW2) {
|
if (breakmp_w16 && type == BW2) {
|
||||||
if (!IsMapMarked(address, MAP_W16)) {
|
if (!IsMapMarked(address, MAP_W16)) {
|
||||||
sprintf(reply, "015 %08X@%08X\r\n", address, psxRegs.pc);
|
sprintf(reply, "015 %08X@%08X\r\n", address, psxRegs.pc);
|
||||||
WriteSocket(reply, strlen(reply));
|
WriteSocket(client_socket, reply, strlen(reply));
|
||||||
paused = 1;
|
paused = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (breakmp_w32 && type == BW4) {
|
if (breakmp_w32 && type == BW4) {
|
||||||
if (!IsMapMarked(address, MAP_W32)) {
|
if (!IsMapMarked(address, MAP_W32)) {
|
||||||
sprintf(reply, "016 %08X@%08X\r\n", address, psxRegs.pc);
|
sprintf(reply, "016 %08X@%08X\r\n", address, psxRegs.pc);
|
||||||
WriteSocket(reply, strlen(reply));
|
WriteSocket(client_socket, reply, strlen(reply));
|
||||||
paused = 1;
|
paused = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "psxcommon.h"
|
#include "psxcommon.h"
|
||||||
#include "ppf.h"
|
#include "ppf.h"
|
||||||
#include "cdrom.h"
|
#include "cdrom.h"
|
||||||
|
#include <dynstr.h>
|
||||||
|
|
||||||
typedef struct tagPPF_DATA {
|
typedef struct tagPPF_DATA {
|
||||||
s32 addr;
|
s32 addr;
|
||||||
|
@ -184,7 +185,7 @@ void BuildPPFCache() {
|
||||||
char method, undo = 0, blockcheck = 0;
|
char method, undo = 0, blockcheck = 0;
|
||||||
int dizlen = 0, dizyn;
|
int dizlen = 0, dizyn;
|
||||||
unsigned char ppfmem[512];
|
unsigned char ppfmem[512];
|
||||||
char szPPF[MAXPATHLEN];
|
struct dynstr szPPF;
|
||||||
int count, seekpos, pos;
|
int count, seekpos, pos;
|
||||||
u32 anz; // use 32-bit to avoid stupid overflows
|
u32 anz; // use 32-bit to avoid stupid overflows
|
||||||
s32 ladr, off, anx;
|
s32 ladr, off, anx;
|
||||||
|
@ -207,9 +208,10 @@ void BuildPPFCache() {
|
||||||
buffer[10] = CdromId[8];
|
buffer[10] = CdromId[8];
|
||||||
buffer[11] = '\0';
|
buffer[11] = '\0';
|
||||||
|
|
||||||
sprintf(szPPF, "%s/%s", Config.PatchesDir, buffer);
|
dynstr_init(&szPPF);
|
||||||
|
dynstr_append(&szPPF, "%s/%s", Config.PatchesDir, buffer);
|
||||||
ppffile = fopen(szPPF, "rb");
|
ppffile = fopen(szPPF.str, "rb");
|
||||||
|
dynstr_free(&szPPF);
|
||||||
if (ppffile == NULL) return;
|
if (ppffile == NULL) return;
|
||||||
|
|
||||||
memset(buffer, 0, 5);
|
memset(buffer, 0, 5);
|
||||||
|
@ -297,7 +299,7 @@ void BuildPPFCache() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// now do the data reading
|
// now do the data reading
|
||||||
do {
|
do {
|
||||||
fseek(ppffile, seekpos, SEEK_SET);
|
fseek(ppffile, seekpos, SEEK_SET);
|
||||||
fread(&pos, 4, 1, ppffile);
|
fread(&pos, 4, 1, ppffile);
|
||||||
pos = SWAP32(pos);
|
pos = SWAP32(pos);
|
||||||
|
@ -305,7 +307,7 @@ void BuildPPFCache() {
|
||||||
if (method == 2) fread(buffer, 4, 1, ppffile); // skip 4 bytes on ppf3 (no int64 support here)
|
if (method == 2) fread(buffer, 4, 1, ppffile); // skip 4 bytes on ppf3 (no int64 support here)
|
||||||
|
|
||||||
anz = fgetc(ppffile);
|
anz = fgetc(ppffile);
|
||||||
fread(ppfmem, anz, 1, ppffile);
|
fread(ppfmem, anz, 1, ppffile);
|
||||||
|
|
||||||
ladr = pos / CD_FRAMESIZE_RAW;
|
ladr = pos / CD_FRAMESIZE_RAW;
|
||||||
off = pos % CD_FRAMESIZE_RAW;
|
off = pos % CD_FRAMESIZE_RAW;
|
||||||
|
@ -391,8 +393,8 @@ boolean CheckSBI(const u8 *time) {
|
||||||
|
|
||||||
// both BCD format
|
// both BCD format
|
||||||
for (lcv = 0; lcv < sbicount; lcv++) {
|
for (lcv = 0; lcv < sbicount; lcv++) {
|
||||||
if (time[0] == sbitime[lcv][0] &&
|
if (time[0] == sbitime[lcv][0] &&
|
||||||
time[1] == sbitime[lcv][1] &&
|
time[1] == sbitime[lcv][1] &&
|
||||||
time[2] == sbitime[lcv][2])
|
time[2] == sbitime[lcv][2])
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,9 +32,6 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static char tbuf[513];
|
|
||||||
static int ptr = 0;
|
|
||||||
|
|
||||||
int StartServer(unsigned short port) {
|
int StartServer(unsigned short port) {
|
||||||
struct in_addr localhostaddr;
|
struct in_addr localhostaddr;
|
||||||
struct sockaddr_in localsocketaddr;
|
struct sockaddr_in localsocketaddr;
|
||||||
|
@ -77,7 +74,7 @@ int StartServer(unsigned short port) {
|
||||||
if (listen(ret, 1) != 0)
|
if (listen(ret, 1) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopServer(int s_socket) {
|
void StopServer(int s_socket) {
|
||||||
|
@ -91,68 +88,102 @@ void StopServer(int s_socket) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetClient(int s_socket, int *client_socket) {
|
int GetClient(int s_socket) {
|
||||||
int new_socket;
|
int new_socket = accept(s_socket, NULL, NULL);
|
||||||
char hello[256];
|
|
||||||
|
|
||||||
new_socket = accept(s_socket, 0, 0);
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (new_socket == INVALID_SOCKET)
|
if (new_socket == INVALID_SOCKET)
|
||||||
return;
|
return -1;
|
||||||
#else
|
#else
|
||||||
if (new_socket == -1)
|
if (new_socket == -1)
|
||||||
return;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
if (*client_socket)
|
|
||||||
CloseClient(*client_socket);
|
|
||||||
*client_socket = new_socket;
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
{
|
{
|
||||||
int flags;
|
int flags;
|
||||||
flags = fcntl(*client_socket, F_GETFL, 0);
|
flags = fcntl(new_socket, F_GETFL, 0);
|
||||||
fcntl(*client_socket, F_SETFL, flags | O_NONBLOCK);
|
fcntl(new_socket, F_SETFL, flags | O_NONBLOCK);
|
||||||
|
return new_socket;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* TODO: Move to debug.c */
|
|
||||||
sprintf(hello, "000 PCSXR Version %s - Debug console\r\n", PACKAGE_VERSION);
|
|
||||||
WriteSocket(client_socket, hello, strlen(hello));
|
|
||||||
ptr = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CloseClient(int *client_socket) {
|
void CloseClient(int client_socket) {
|
||||||
if (*client_socket) {
|
if (client_socket) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
shutdown(client_socket, SD_BOTH);
|
shutdown(client_socket, SD_BOTH);
|
||||||
closesocket(client_socket);
|
closesocket(client_socket);
|
||||||
#else
|
#else
|
||||||
shutdown(*client_socket, SHUT_RDWR);
|
shutdown(client_socket, SHUT_RDWR);
|
||||||
close(*client_socket);
|
close(client_socket);
|
||||||
#endif
|
#endif
|
||||||
*client_socket = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int HasClient(int client_socket) {
|
int HasClient(int client_socket) {
|
||||||
return client_socket ? 1 : 0;
|
return client_socket > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ReadSocket(int *client_socket, char * buffer, int len) {
|
#ifdef _WIN32
|
||||||
int r;
|
|
||||||
|
static enum read_socket_err ReadSocketOS(SOCKET client_socket, char *buf, size_t *const len)
|
||||||
|
{
|
||||||
|
const int res = recv(client_socket, buf, len, 0);
|
||||||
|
|
||||||
|
switch (res)
|
||||||
|
{
|
||||||
|
case SOCKET_ERROR:
|
||||||
|
return READ_SOCKET_ERR_RECV;
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
return READ_SOCKET_SHUTDOWN;
|
||||||
|
|
||||||
|
default:
|
||||||
|
*len = res;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return READ_SOCKET_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(_POSIX_VERSION)
|
||||||
|
|
||||||
|
static enum read_socket_err ReadSocketOS(int client_socket, char *buf, size_t *const len)
|
||||||
|
{
|
||||||
|
const ssize_t res = recv(client_socket, buf, *len, 0);
|
||||||
|
|
||||||
|
switch (res)
|
||||||
|
{
|
||||||
|
case -1:
|
||||||
|
fprintf(stderr, "READ_SOCKET_ERR_RECV, recv(%d, %p, %zu, %d)\n", client_socket, buf, *len, 0);
|
||||||
|
return READ_SOCKET_ERR_RECV;
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
fprintf(stderr, "READ_SOCKET_SHUTDOWN\n");
|
||||||
|
return READ_SOCKET_SHUTDOWN;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("received %zu/%zu bytes\n", res, *len);
|
||||||
|
*len = res;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return READ_SOCKET_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
|
enum read_socket_err ReadSocket(int client_socket, char *buf, size_t *const len) {
|
||||||
char * endl;
|
char * endl;
|
||||||
|
|
||||||
if (!*client_socket)
|
if (!client_socket || !buf || !len || !*len)
|
||||||
return -1;
|
return READ_SOCKET_ERR_INVALID_ARG;
|
||||||
|
|
||||||
r = recv(*client_socket, tbuf + ptr, 512 - ptr, 0);
|
return ReadSocketOS(client_socket, buf, len);
|
||||||
|
|
||||||
if (r == 0) {
|
#if 0
|
||||||
*client_socket = 0;
|
|
||||||
if (!ptr)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (r == SOCKET_ERROR)
|
if (r == SOCKET_ERROR)
|
||||||
#else
|
#else
|
||||||
|
@ -183,15 +214,15 @@ int ReadSocket(int *client_socket, char * buffer, int len) {
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer[r] = 0;
|
buffer[r] = 0;
|
||||||
|
#endif
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int RawReadSocket(int *client_socket, char * buffer, int len) {
|
int RawReadSocket(int client_socket, char *buffer, size_t len) {
|
||||||
|
#if 0
|
||||||
int r = 0;
|
int r = 0;
|
||||||
int mlen = len < ptr ? len : ptr;
|
int mlen = len < ptr ? len : ptr;
|
||||||
|
|
||||||
if (!*client_socket)
|
if (!client_socket)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
|
@ -201,10 +232,9 @@ int RawReadSocket(int *client_socket, char * buffer, int len) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len - mlen)
|
if (len - mlen)
|
||||||
r = recv(*client_socket, buffer + mlen, len - mlen, 0);
|
r = recv(client_socket, buffer + mlen, len - mlen, 0);
|
||||||
|
|
||||||
if (r == 0) {
|
if (r == 0) {
|
||||||
*client_socket = 0;
|
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -222,13 +252,14 @@ int RawReadSocket(int *client_socket, char * buffer, int len) {
|
||||||
r += mlen;
|
r += mlen;
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteSocket(int *client_socket, char * buffer, int len) {
|
void WriteSocket(int client_socket, const char *buffer, size_t len) {
|
||||||
if (!*client_socket)
|
if (!client_socket)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
send(*client_socket, buffer, len, 0);
|
send(client_socket, buffer, len, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetsBlock(int s_socket) {
|
void SetsBlock(int s_socket) {
|
||||||
|
|
|
@ -22,17 +22,27 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
enum read_socket_err
|
||||||
|
{
|
||||||
|
READ_SOCKET_OK,
|
||||||
|
READ_SOCKET_ERR_INVALID_ARG,
|
||||||
|
READ_SOCKET_ERR_RECV,
|
||||||
|
READ_SOCKET_SHUTDOWN
|
||||||
|
};
|
||||||
|
|
||||||
int StartServer(unsigned short port);
|
int StartServer(unsigned short port);
|
||||||
void StopServer(int s_socket);
|
void StopServer(int s_socket);
|
||||||
|
|
||||||
void GetClient(int s_socket, int *client_socket);
|
int GetClient(int s_socket);
|
||||||
void CloseClient(int *client_socket);
|
void CloseClient(int client_socket);
|
||||||
|
|
||||||
int HasClient(int client_socket);
|
int HasClient(int client_socket);
|
||||||
|
|
||||||
int ReadSocket(int *client_socket, char * buffer, int len);
|
enum read_socket_err ReadSocket(int client_socket, char *buffer, size_t *len);
|
||||||
int RawReadSocket(int *client_socket, char * buffer, int len);
|
int RawReadSocket(int client_socket, char *buffer, size_t len);
|
||||||
void WriteSocket(int *client_socket, char * buffer, int len);
|
void WriteSocket(int client_socket, const char *buffer, size_t len);
|
||||||
|
|
||||||
void SetsBlock(int s_socket);
|
void SetsBlock(int s_socket);
|
||||||
void SetsNonblock(int s_socket);
|
void SetsNonblock(int s_socket);
|
||||||
|
|
Loading…
Reference in New Issue