Shrink USB output buffers, work around USB packet errors
[fw/altos] / s51 / s51-command.c
index 63d142f45c3fd51b8e80e7961ac9ffce543f3fcd..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;
 }
@@ -152,7 +153,35 @@ command_dx (int argc, char **argv)
 enum command_result
 command_set (int argc, char **argv)
 {
-       return command_error;
+       uint16_t address;
+       uint8_t *data;
+       int len = argc - 3;
+       int i;
+       enum command_result ret = command_success;
+
+       if (len < 0)
+               return command_error;
+       if (parse_uint16(argv[2], &address) != command_success)
+               return command_error;
+       if (len == 0)
+               return command_success;
+       data = malloc(len);
+       if (!data)
+               return command_error;
+       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) {
+               ccdbg_write_memory(s51_dbg, address + 0xff00, data, len);
+       } else if (strcmp(argv[1], "sfr") == 0) {
+               ccdbg_write_sfr(s51_dbg, (uint8_t) address, data, len);
+       } else
+               ret = command_error;
+       free(data);
+       return ret;
 }
 
 enum command_result
@@ -464,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