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>
+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)
{
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;
}
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)
{
break;
if (b == CC_NUM_BREAKPOINTS)
return -1;
break;
if (b == CC_NUM_BREAKPOINTS)
return -1;
- if (breakpoints[b].temporary)
- clear_breakpoint(address, 1);
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;
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
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;
}
va_start(ap, format);
vfprintf(s51_output, format, ap);
va_start(ap, format);
vfprintf(s51_output, format, ap);
if (s51_port)
vfprintf(stdout, format, ap);
if (s51_port)
vfprintf(stdout, format, ap);
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 (s51_port)
printf("> %s", line);
if (s51_port)
printf("> %s", line);
fflush(stdout);
return ret;
}
fflush(stdout);
return ret;
}