Merge ccdbg and altos sources into one giant repository
[fw/altos] / s51 / s51-command.c
index 034d5dce9f21bef1c19c23303c9a96efeeb0c175..4f803060dbc801c17e68685ed9903762daa06ac2 100644 (file)
@@ -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)
                }
        }
 }
-