changeset 2174:eff7bedfc838

Restore ability to print PC in debugger. Make 68K register names case insensitive. Add usp and ssp registers
author Michael Pavone <pavone@retrodev.com>
date Sat, 06 Aug 2022 15:35:10 -0700
parents 894c7873a2b1
children 8c28c5466d70
files debug.c
diffstat 1 files changed, 15 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/debug.c	Sat Aug 06 15:22:30 2022 -0700
+++ b/debug.c	Sat Aug 06 15:35:10 2022 -0700
@@ -634,6 +634,7 @@
 	resolver resolve;
 	reader   read_mem;
 	void     *system;
+	uint32_t address;
 };
 
 uint8_t eval_expr(debug_context *context, expr *e, uint32_t *out)
@@ -808,22 +809,25 @@
 	return read_m68k(gen->m68k, out, size);
 }
 
-static uint8_t resolve_m68k(m68k_context *context, const char *name, uint32_t *out)
+static uint8_t resolve_m68k(debug_context *debug, m68k_context *context, const char *name, uint32_t *out)
 {
-	if (name[0] == 'd' && name[1] >= '0' && name[1] <= '7') {
+	if ((name[0] == 'd' || name[0] == 'D') && name[1] >= '0' && name[1] <= '7' && !name[2]) {
 		*out = context->dregs[name[1]-'0'];
-	} else if (name[0] == 'a' && name[1] >= '0' && name[1] <= '7') {
+	} else if ((name[0] == 'a' || name[0] == 'A') && name[1] >= '0' && name[1] <= '7' && !name[2]) {
 		*out = context->aregs[name[1]-'0'];
-	} else if (name[0] == 's' && name[1] == 'r') {
+	} else if (!strcasecmp(name, "sr")) {
 		*out = context->status << 8;
 		for (int flag = 0; flag < 5; flag++) {
 			*out |= context->flags[flag] << (4-flag);
 		}
-	} else if(name[0] == 'c') {
+	} else if(!strcasecmp(name, "cycle")) {
 		*out = context->current_cycle;
-	} else if (name[0] == 'p' && name[1] == 'c') {
-		//FIXME
-		//*out = address;
+	} else if (!strcasecmp(name, "pc")) {
+		*out = debug->address;
+	} else if (!strcasecmp(name, "usp")) {
+		*out = context->status & 0x20 ? context->aregs[8] : context->aregs[7];
+	} else if (!strcasecmp(name, "ssp")) {
+		*out = context->status & 0x20 ? context->aregs[7] : context->aregs[8];
 	} else {
 		return 0;
 	}
@@ -833,7 +837,7 @@
 static uint8_t resolve_genesis(debug_context *context, const char *name, uint32_t *out)
 {
 	genesis_context *gen = context->system;
-	if (resolve_m68k(gen->m68k, name, out)) {
+	if (resolve_m68k(context, gen->m68k, name, out)) {
 		return 1;
 	}
 	if (!strcmp(name, "f") || !strcmp(name, "frame")) {
@@ -865,7 +869,8 @@
 	debug_context c = {
 		.resolve = resolve_genesis,
 		.read_mem = read_genesis,
-		.system = context->system
+		.system = context->system,
+		.address = address
 	};
 	char *after;
 	uint8_t at_least_one = 0;