summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2008-12-27 11:25:58 -0800
committerKeith Packard <keithp@keithp.com>2008-12-27 11:25:58 -0800
commit1405838160b69e2cda456e21502a1d03b3aa7548 (patch)
tree390013a8b1d83bdda187a9f69845f12e92939b8f
parent1264c3676e95427bba5d01e05c303d036a7f9eca (diff)
s51: get start address from ihx file. re-enable breakpoints after reset.
Use the start of the ihx file when asked to run from 0x0, this lets sdcdb run programs from ram. The reset command clears all hw breakpoints, so reset them afterwards. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--s51/s51-command.c39
-rw-r--r--s51/s51-main.c4
2 files changed, 40 insertions, 3 deletions
diff --git a/s51/s51-command.c b/s51/s51-command.c
index 7538a94a..b4f853be 100644
--- a/s51/s51-command.c
+++ b/s51/s51-command.c
@@ -18,6 +18,8 @@
#include "s51.h"
+static uint16_t start_address;
+
static enum command_result
parse_int(char *value, int *result)
{
@@ -147,9 +149,23 @@ command_dump (int argc, char **argv)
enum command_result
command_file (int argc, char **argv)
{
+ struct hex_file *hex;
+ FILE *file;
+
if (argc != 2)
return command_error;
- s51_printf("some words read from %s\n", argv[1]);
+ file = fopen (argv[1], "r");
+ if (!file)
+ return command_error;
+ hex = ccdbg_hex_file_read(file, argv[1]);
+ fclose(file);
+ if (!hex)
+ return command_error;
+ if (hex->nrecord == 0) {
+ ccdbg_hex_file_free(hex);
+ return command_error;
+ }
+ start_address = hex->records[0]->address;
return command_success;
}
@@ -200,6 +216,15 @@ enable_breakpoint(int b)
s51_printf("enable_breakpoint status 0x%02x\n", status);
}
+static void
+enable_breakpoints(void)
+{
+ int b;
+ for (b = 0; b < CC_NUM_BREAKPOINTS; b++)
+ if (breakpoints[b].enabled)
+ enable_breakpoint(b);
+}
+
enum command_result
set_breakpoint(uint16_t address, int temporary)
{
@@ -261,8 +286,7 @@ find_breakpoint(uint16_t address)
break;
if (b == CC_NUM_BREAKPOINTS)
return -1;
- if (breakpoints[b].temporary)
- clear_breakpoint(address, 1);
+ return b;
}
enum command_result
@@ -317,6 +341,9 @@ cc_stopped(uint8_t status)
pc = pc - 1;
code = 104;
reason = "Breakpoint";
+ b = find_breakpoint(pc);
+ if (b != -1 && breakpoints[b].temporary)
+ clear_breakpoint(pc, 1);
ccdbg_set_pc(s51_dbg, pc);
} else {
code = 105;
@@ -360,6 +387,10 @@ command_run (int argc, char **argv)
if (result != command_success)
return result;
}
+ if (start_address && start == 0) {
+ start = start_address;
+ s51_printf("Starting at 0x%04x\n", start);
+ }
ccdbg_set_pc(s51_dbg, start);
}
else
@@ -422,6 +453,8 @@ enum command_result
command_reset (int argc, char **argv)
{
ccdbg_debug_mode(s51_dbg);
+ ccdbg_halt(s51_dbg);
+ enable_breakpoints();
return command_success;
}
diff --git a/s51/s51-main.c b/s51/s51-main.c
index 28a774d2..27ed571a 100644
--- a/s51/s51-main.c
+++ b/s51/s51-main.c
@@ -174,8 +174,10 @@ s51_printf(char *format, ...)
va_start(ap, format);
vfprintf(s51_output, format, ap);
+#if 1
if (s51_port)
vfprintf(stdout, format, ap);
+#endif
va_end(ap);
}
@@ -195,8 +197,10 @@ s51_read_line(char *line, int len)
s51_putc('\0');
fflush(s51_output);
ret = fgets(line, len, s51_input) != NULL;
+#if 1
if (s51_port)
printf("> %s", line);
+#endif
fflush(stdout);
return ret;
}