X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=s51%2Fs51-command.c;h=b4f853be7794b60ac244902d5eeb2e38ef39fb2a;hp=7538a94ac3011e70fd6744a7a71dfced03d7c200;hb=1405838160b69e2cda456e21502a1d03b3aa7548;hpb=1264c3676e95427bba5d01e05c303d036a7f9eca 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; }