diff options
-rw-r--r-- | s51/s51-command.c | 39 | ||||
-rw-r--r-- | s51/s51-main.c | 4 |
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; } |