X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=s51%2Fs51-command.c;h=4f803060dbc801c17e68685ed9903762daa06ac2;hp=034d5dce9f21bef1c19c23303c9a96efeeb0c175;hb=17d2432a8b9c15963cd3b821f025ad33972ef477;hpb=3cc8d11eb8d5d0b42141dd84a58d461287f59e3a diff --git a/s51/s51-command.c b/s51/s51-command.c index 034d5dce..4f803060 100644 --- a/s51/s51-command.c +++ b/s51/s51-command.c @@ -64,6 +64,7 @@ parse_uint8(char *value, uint8_t *uint8) enum command_result command_quit (int argc, char **argv) { + ccdbg_reset(s51_dbg); exit(0); return command_error; } @@ -72,7 +73,7 @@ static void dump_bytes(uint8_t *memory, int length, uint16_t start, char *format) { int group, i; - + for (group = 0; group < length; group += 8) { s51_printf(format, start + group); for (i = group; i < length && i < group + 8; i++) @@ -96,7 +97,7 @@ command_di (int argc, char **argv) uint8_t memory[65536]; uint8_t status; int length; - + if (argc != 3) return command_error; if (parse_uint16(argv[1], &start) != command_success) @@ -116,7 +117,7 @@ command_ds (int argc, char **argv) uint8_t memory[0x100]; uint8_t status; int length; - + if (argc != 3) return command_error; if (parse_uint8(argv[1], &start) != command_success) @@ -136,7 +137,7 @@ command_dx (int argc, char **argv) uint8_t memory[65536]; uint8_t status; int length; - + if (argc != 3) return command_error; if (parse_uint16(argv[1], &start) != command_success) @@ -170,7 +171,7 @@ command_set (int argc, char **argv) for (i = 0; i < len; i++) if (parse_uint8(argv[i+3], &data[i]) != command_success) return command_error; - + if (strcmp(argv[1], "xram") == 0) { ccdbg_write_memory(s51_dbg, address, data, len); } else if (strcmp(argv[1], "iram") == 0) { @@ -204,7 +205,7 @@ command_file (int argc, char **argv) struct hex_file *hex; struct hex_image *image; FILE *file; - + if (argc != 2) return command_error; file = fopen (argv[1], "r"); @@ -256,7 +257,7 @@ static void disable_breakpoint(int b) { uint8_t status; - + status = ccdbg_set_hw_brkpnt(s51_dbg, b, 0, breakpoints[b].address); if (status != 0x00 && status != 0xff) s51_printf("disable_breakpoint status 0x%02x\n", status); @@ -266,7 +267,7 @@ static void enable_breakpoint(int b) { uint8_t status; - + status = ccdbg_set_hw_brkpnt(s51_dbg, b, 1, breakpoints[b].address); if (status != 0xff) s51_printf("enable_breakpoint status 0x%02x\n", status); @@ -433,7 +434,7 @@ command_run (int argc, char **argv) uint16_t pc; uint8_t status; int b; - + if (argv[1]) { result = parse_uint16(argv[1], &start); if (result != command_success) @@ -492,7 +493,38 @@ command_step (int argc, char **argv) enum command_result command_load (int argc, char **argv) { - return command_error; + char *filename = argv[1]; + FILE *file; + struct hex_file *hex; + struct hex_image *image; + + if (!filename) + return command_error; + file = fopen(filename, "r"); + if (!file) { + perror(filename); + return command_error; + } + hex = ccdbg_hex_file_read(file, filename); + fclose(file); + if (!hex) { + return command_error; + } + image = ccdbg_hex_image_create(hex); + ccdbg_hex_file_free(hex); + if (!image) { + fprintf(stderr, "image create failed\n"); + return command_error; + } + if (image->address >= 0xf000) { + printf("Loading %d bytes to RAM at 0x%04x\n", + image->length, image->address); + ccdbg_write_hex_image(s51_dbg, image, 0); + } else { + fprintf(stderr, "Can only load to RAM\n"); + } + ccdbg_hex_image_free(image); + return command_success; } enum command_result @@ -567,7 +599,7 @@ info_breakpoints(int argc, char **argv) } return command_success; } - + } static enum command_result @@ -578,7 +610,7 @@ static struct command_function infos[] = { "List current breakpoints\n" }, { "help", "?", info_help, "help", "Print this list\n" }, - + { NULL, NULL, NULL, NULL, NULL }, }; @@ -592,7 +624,7 @@ enum command_result command_info(int argc, char **argv) { struct command_function *func; - + if (argc < 2) return command_error; func = command_string_to_function(infos, argv[1]); @@ -612,7 +644,7 @@ cc_wait(void) return command_success; } if (s51_interrupted || s51_check_input()) { - + ccdbg_halt(s51_dbg); status = ccdbg_read_status(s51_dbg); cc_stopped(status); @@ -620,4 +652,3 @@ cc_wait(void) } } } -