summaryrefslogtreecommitdiff
path: root/libpcsxcore/debug.c
diff options
context:
space:
mode:
authorStelios Tsampas <loathingkernel@gmail.com>2017-07-31 12:48:37 +0300
committerStelios Tsampas <loathingkernel@gmail.com>2017-07-31 12:48:37 +0300
commit01f49908879197b1715483321a9490dd71c8874b (patch)
tree7ff0e4bd0188ffa59918d8ed1d7547c28b4d5d8e /libpcsxcore/debug.c
parentdcf718bdd96c3bbe27e18200f6384cd43c95c111 (diff)
* Sync with codeplex branch (libpcsxcore, linux gui)
This commit reflects mostly changes that happened in upstream since the last sync. Commit messages in upstream are lacking information. Most important changes are commented below, the rest of them are either formating or just trivial stuff. Memory viewer, invalidate dynarec gui/DebugMemory.c libpcsxcore/cdrom.c libpcsxcore/gpu.c libpcsxcore/misc.c libpcsxcore/psxdma.c Load binary files and psx executables libpcsxcore/misc.c libpcsxcore/misc.h libpcsxcore/plugin.c libpcsxcore/plugin.h Support for psxida libpcsxcore/debug.c libpcsxcore/r3000a.c plugins/bladesio1/connection.c disable loading save states with digits gui/Plugin.c Fix psxDIV in interpreter libpcsxcore/psxinterpreter.c
Diffstat (limited to 'libpcsxcore/debug.c')
-rwxr-xr-xlibpcsxcore/debug.c61
1 files changed, 59 insertions, 2 deletions
diff --git a/libpcsxcore/debug.c b/libpcsxcore/debug.c
index b5497d11..a4e9ab35 100755
--- a/libpcsxcore/debug.c
+++ b/libpcsxcore/debug.c
@@ -230,6 +230,10 @@ Error messages (5xx):
*/
static int debugger_active = 0, paused = 0, trace = 0, printpc = 0, reset = 0, resetting = 0;
+static int run_to = 0;
+static u32 run_to_addr = 0;
+static int step_over = 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 breakmp_e = 0, breakmp_r8 = 0, breakmp_r16 = 0, breakmp_r32 = 0, breakmp_w8 = 0, breakmp_w16 = 0, breakmp_w32 = 0;
@@ -393,13 +397,34 @@ void ProcessDebug() {
}
}
if (!paused) {
- if(trace && printpc)
- {
+ if(trace && printpc) {
char reply[256];
sprintf(reply, "219 %s\r\n", disR3000AF(psxMemRead32(psxRegs.pc), psxRegs.pc));
WriteSocket(reply, strlen(reply));
}
+ if(step_over) {
+ if(psxRegs.pc == step_over_addr) {
+ char reply[256];
+ step_over = 0;
+ step_over_addr = 0;
+ sprintf(reply, "050 @%08X\r\n", psxRegs.pc);
+ WriteSocket(reply, strlen(reply));
+ paused = 1;
+ }
+ }
+
+ if(run_to) {
+ if(psxRegs.pc == run_to_addr) {
+ char reply[256];
+ run_to = 0;
+ run_to_addr = 0;
+ sprintf(reply, "040 @%08X\r\n", psxRegs.pc);
+ WriteSocket(reply, strlen(reply));
+ paused = 1;
+ }
+ }
+
DebugCheckBP(psxRegs.pc, BE);
}
if (mapping_e) {
@@ -1078,6 +1103,37 @@ static void ProcessCommands() {
reset = 1;
sprintf(reply, "499 Resetting\r\n");
break;
+ case 0x3A0:
+ // run to
+ p = arguments;
+ if (arguments) {
+ run_to = 1;
+ run_to_addr = strtol(arguments, &p, 16);
+ paused = 0;
+ }
+ if (p == arguments) {
+ sprintf(reply, "500 Malformed 3A0 command '%s'\r\n", arguments);
+ break;
+ }
+ sprintf(reply, "4A0 run to addr %08X\r\n", run_to_addr);
+ break;
+ case 0x3A1:
+ // step over (jal)
+ if(paused) {
+ u32 opcode = psxMemRead32(psxRegs.pc);
+ if((opcode >> 26) == 3) {
+ step_over = 1;
+ step_over_addr = psxRegs.pc + 8;
+ paused = 0;
+
+ sprintf(reply, "4A1 step over addr %08X\r\n", psxRegs.pc);
+ }
+ else {
+ trace = 1;
+ paused = 0;
+ }
+ }
+ break;
default:
sprintf(reply, "500 Unknown command '%s'\r\n", cmd);
break;
@@ -1100,6 +1156,7 @@ void DebugCheckBP(u32 address, enum breakpoint_types type) {
if (!debugger_active || reset)
return;
+
for (bp = first; bp; bp = next_breakpoint(bp)) {
if ((bp->type == type) && (bp->address == address)) {
sprintf(reply, "030 %X@%08X\r\n", bp->number, psxRegs.pc);