#include "s51.h"
+static uint16_t start_address;
+
static enum command_result
parse_int(char *value, int *result)
{
return command_success;
}
+static enum command_result
+parse_uint8(char *value, uint8_t *uint8)
+{
+ int v;
+ enum command_result result;
+
+ result = parse_int(value, &v);
+ if (result != command_success)
+ return command_error;
+ if (v < 0 || v > 0xff)
+ return command_error;
+ *uint8 = v;
+ return command_success;
+}
+
enum command_result
command_quit (int argc, char **argv)
{
enum command_result
command_ds (int argc, char **argv)
{
- uint16_t start, end;
- uint8_t memory[65536];
+ uint8_t start, end;
+ uint8_t memory[0x100];
uint8_t status;
int length;
if (argc != 3)
return command_error;
- if (parse_uint16(argv[1], &start) != command_success)
+ if (parse_uint8(argv[1], &start) != command_success)
return command_error;
- if (parse_uint16(argv[2], &end) != command_success)
+ if (parse_uint8(argv[2], &end) != command_success)
return command_error;
length = (int) end - (int) start + 1;
- status = ccdbg_read_memory(s51_dbg, start + 0xdf00, memory, length);
+ status = ccdbg_read_sfr(s51_dbg, start, memory, length);
dump_bytes(memory, length, start);
return command_success;
}
enum command_result
command_dump (int argc, char **argv)
{
+ if (argv[1]) {
+ if (strcmp(argv[1], "rom") == 0 ||
+ strcmp(argv[1], "xram") == 0)
+ return command_dx(argc-1, argv+1);
+ if (strcmp(argv[1], "iram") == 0)
+ return command_di(argc-1, argv+1);
+ if (strcmp(argv[1], "sfr") == 0)
+ return command_ds(argc-1, argv+1);
+ }
return command_error;
}
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;
}