From: Keith Packard Date: Sat, 27 Dec 2008 19:25:58 +0000 (-0800) Subject: s51: get start address from ihx file. re-enable breakpoints after reset. X-Git-Tag: 0.5~58^2~78 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=1405838160b69e2cda456e21502a1d03b3aa7548 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 --- 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; }