# HG changeset patch # User Mike Pavone # Date 1392189569 28800 # Node ID 6fe73296938a3caf0ede336d81bb25994c13cb16 # Parent 62860044337d624ca918b4256804f7b5afbe81e0 Support setting registers in gdb remote debugger diff -r 62860044337d -r 6fe73296938a gdb_remote.c --- 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);