#include "s51.h"
+static uint16_t start_address;
+
static enum command_result
parse_int(char *value, int *result)
{
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;
}
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)
{
break;
if (b == CC_NUM_BREAKPOINTS)
return -1;
- if (breakpoints[b].temporary)
- clear_breakpoint(address, 1);
+ return b;
}
enum command_result
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;
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
command_reset (int argc, char **argv)
{
ccdbg_debug_mode(s51_dbg);
+ ccdbg_halt(s51_dbg);
+ enable_breakpoints();
return command_success;
}
va_start(ap, format);
vfprintf(s51_output, format, ap);
+#if 1
if (s51_port)
vfprintf(stdout, format, ap);
+#endif
va_end(ap);
}
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;
}