changeset 526:6fe73296938a

Support setting registers in gdb remote debugger
author Mike Pavone <pavone@retrodev.com>
date Tue, 11 Feb 2014 23:19:29 -0800
parents 62860044337d
children 7df7f493b3b6
files gdb_remote.c
diffstat 1 files changed, 29 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/gdb_remote.c	Tue Feb 11 22:38:47 2014 -0800
+++ b/gdb_remote.c	Tue Feb 11 23:19:29 2014 -0800
@@ -103,6 +103,16 @@
 	return status;
 }
 
+void update_status(m68k_context * context, uint16_t value)
+{
+	context->status = value >> 8;
+	for (int i = 4; i >= 0; i--)
+	{
+		context->flags[i] = value & 1;
+		value >>= 1;
+	}
+}
+
 uint8_t read_byte(m68k_context * context, uint32_t address)
 {
 	uint16_t * word;
@@ -277,6 +287,25 @@
 		gdb_send_command(send_buf);
 		break;
 	}
+	case 'P': {
+		char *after = NULL;
+		unsigned long reg = strtoul(command+1, &after, 16);
+		uint32_t value = strtoul(after+1, NULL, 16);
+
+		if (reg < 8) {
+			context->dregs[reg] = value;
+		} else if (reg < 16) {
+			context->aregs[reg-8] = value;
+		} else if (reg == 16) {
+			update_status(context, value);
+		} else {
+			//supporting updates to PC is going to be a pain
+			gdb_send_command("E01");
+			break;
+		}
+		gdb_send_command("OK");
+		break;
+	}
 	case 'q':
 		if (!memcmp("Supported", command+1, strlen("Supported"))) {
 			sprintf(send_buf, "PacketSize=%X", (int)bufsize);