Shrink USB output buffers, work around USB packet errors
[fw/altos] / s51 / s51-command.c
index 034d5dce9f21bef1c19c23303c9a96efeeb0c175..02ecdddd3dd714935eebd2c18aa1481147559f90 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;
 }
@@ -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