s51: get start address from ihx file. re-enable breakpoints after reset.
authorKeith Packard <keithp@keithp.com>
Sat, 27 Dec 2008 19:25:58 +0000 (11:25 -0800)
committerKeith Packard <keithp@keithp.com>
Sat, 27 Dec 2008 19:25:58 +0000 (11:25 -0800)
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>
s51/s51-command.c
s51/s51-main.c

index 7538a94ac3011e70fd6744a7a71dfced03d7c200..b4f853be7794b60ac244902d5eeb2e38ef39fb2a 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "s51.h"
 
 
 #include "s51.h"
 
+static uint16_t start_address;
+
 static enum command_result
 parse_int(char *value, int *result)
 {
 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)
 {
 enum command_result
 command_file (int argc, char **argv)
 {
+       struct hex_file *hex;
+       FILE *file;
+       
        if (argc != 2)
                return command_error;
        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;
 }
 
        return command_success;
 }
 
@@ -200,6 +216,15 @@ enable_breakpoint(int b)
                s51_printf("enable_breakpoint status 0x%02x\n", status);
 }
 
                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)
 {
 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;
                        break;
        if (b == CC_NUM_BREAKPOINTS)
                return -1;
-       if (breakpoints[b].temporary)
-               clear_breakpoint(address, 1);
+       return b;
 }
 
 enum command_result
 }
 
 enum command_result
@@ -317,6 +341,9 @@ cc_stopped(uint8_t status)
                        pc = pc - 1;
                        code = 104;
                        reason = "Breakpoint";
                        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;
                        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 (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
                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);
 command_reset (int argc, char **argv)
 {
        ccdbg_debug_mode(s51_dbg);
+       ccdbg_halt(s51_dbg);
+       enable_breakpoints();
        return command_success;
 }
 
        return command_success;
 }
 
index 28a774d225efb26bee11db067a719faa5d8efe93..27ed571aca68eb360f5267d8aaff33d27ee55720 100644 (file)
@@ -174,8 +174,10 @@ s51_printf(char *format, ...)
 
        va_start(ap, format);
        vfprintf(s51_output, format, ap);
 
        va_start(ap, format);
        vfprintf(s51_output, format, ap);
+#if 1
        if (s51_port)
                vfprintf(stdout, format, ap);
        if (s51_port)
                vfprintf(stdout, format, ap);
+#endif
        va_end(ap);
 }
 
        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;
                s51_putc('\0');
        fflush(s51_output);
        ret = fgets(line, len, s51_input) != NULL;
+#if 1
        if (s51_port)
                printf("> %s", line);
        if (s51_port)
                printf("> %s", line);
+#endif
        fflush(stdout);
        return ret;
 }
        fflush(stdout);
        return ret;
 }