changeset 1630:5aa0c3c43b97

Added a 68K debugger command for setting a register
author Michael Pavone <pavone@retrodev.com>
date Sun, 04 Nov 2018 11:45:41 -0800
parents 079e5b9d59ce
children c4ba3177b72d
files debug.c
diffstat 1 files changed, 70 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/debug.c	Thu Nov 01 20:14:56 2018 -0700
+++ b/debug.c	Sun Nov 04 11:45:41 2018 -0800
@@ -787,31 +787,81 @@
 			insert_breakpoint(context, after, debugger);
 			return 0;
 		case 's':
-			if (inst.op == M68K_RTS) {
-				after = m68k_read_long(context->aregs[7], context);
-			} else if (inst.op == M68K_RTE || inst.op == M68K_RTR) {
-				after = m68k_read_long(context->aregs[7] + 2, context);
-			} else if(m68k_is_branch(&inst)) {
-				if (inst.op == M68K_BCC && inst.extra.cond != COND_TRUE) {
-					branch_f = after;
-					branch_t = m68k_branch_target(&inst, context->dregs, context->aregs) & 0xFFFFFF;
-					insert_breakpoint(context, branch_t, debugger);
-				} else if(inst.op == M68K_DBCC) {
-					if (inst.extra.cond == COND_FALSE) {
-						if (context->dregs[inst.dst.params.regs.pri] & 0xFFFF) {
-							after = m68k_branch_target(&inst, context->dregs, context->aregs);
+			if (input_buf[1] == 'e') {
+				param = find_param(input_buf);
+				if (!param) {
+					fputs("Missing destination parameter for set\n", stderr);
+				}
+				char *val = find_param(param);
+				if (!val) {
+					fputs("Missing value parameter for set\n", stderr);
+				}
+				long int_val;
+				int reg_num;
+				switch (val[0])
+				{
+				case 'd':
+				case 'a':
+					reg_num = val[1] - '0';
+					if (reg_num < 0 || reg_num > 8) {
+						fprintf(stderr, "Invalid register %s\n", val);
+						return 1;
+					}
+					int_val = (val[0] == 'd' ? context->dregs : context->aregs)[reg_num];
+					break;
+				case '$':
+					int_val = strtol(val+1, NULL, 16);
+					break;
+				case '0':
+					if (val[1] == 'x') {
+						int_val = strtol(val+2, NULL, 16);
+						break;
+					}
+				default:
+					int_val = strtol(val, NULL, 10);
+				}
+				switch(param[0])
+				{
+				case 'd':
+				case 'a':
+					reg_num = param[1] - '0';
+					if (reg_num < 0 || reg_num > 8) {
+						fprintf(stderr, "Invalid register %s\n", param);
+						return 1;
+					}
+					(param[0] == 'd' ? context->dregs : context->aregs)[reg_num] = int_val;
+					break;
+				default:
+					fprintf(stderr, "Invalid destinatino %s\n", param);
+				}
+				break;
+			} else {
+				if (inst.op == M68K_RTS) {
+					after = m68k_read_long(context->aregs[7], context);
+				} else if (inst.op == M68K_RTE || inst.op == M68K_RTR) {
+					after = m68k_read_long(context->aregs[7] + 2, context);
+				} else if(m68k_is_branch(&inst)) {
+					if (inst.op == M68K_BCC && inst.extra.cond != COND_TRUE) {
+						branch_f = after;
+						branch_t = m68k_branch_target(&inst, context->dregs, context->aregs) & 0xFFFFFF;
+						insert_breakpoint(context, branch_t, debugger);
+					} else if(inst.op == M68K_DBCC) {
+						if (inst.extra.cond == COND_FALSE) {
+							if (context->dregs[inst.dst.params.regs.pri] & 0xFFFF) {
+								after = m68k_branch_target(&inst, context->dregs, context->aregs);
+							}
+						} else {
+							branch_t = after;
+							branch_f = m68k_branch_target(&inst, context->dregs, context->aregs);
+							insert_breakpoint(context, branch_f, debugger);
 						}
 					} else {
-						branch_t = after;
-						branch_f = m68k_branch_target(&inst, context->dregs, context->aregs);
-						insert_breakpoint(context, branch_f, debugger);
+						after = m68k_branch_target(&inst, context->dregs, context->aregs) & 0xFFFFFF;
 					}
-				} else {
-					after = m68k_branch_target(&inst, context->dregs, context->aregs) & 0xFFFFFF;
 				}
+				insert_breakpoint(context, after, debugger);
+				return 0;
 			}
-			insert_breakpoint(context, after, debugger);
-			return 0;
 		case 'v': {
 			genesis_context * gen = context->system;
 			//VDP debug commands