]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/debug.c
switch fifos conin,conout
[z180-stamp.git] / avr / debug.c
index d4ae1f4aa7c09c68835f0a80d5597bc00c933449..f3632c288018c14ca31476ae4263f5393f5e8d75 100644 (file)
@@ -11,6 +11,7 @@
 #include <avr/eeprom.h>
 
 #include "command.h"
+#include "cli_readline.h"
 #include "print-utils.h"
 #include "debug.h"
 
@@ -39,7 +40,7 @@ void dump_heap(void)
  */
 command_ret_t do_dump_mem(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
-       void (*readhow)(uint8_t *buf, uint32_t addr, uint8_t count);
+       void (*readwhat)(uint8_t *buf, uint32_t addr, uint8_t count);
 
        (void) cmdtp; (void) flag;
 
@@ -51,13 +52,13 @@ command_ret_t do_dump_mem(cmd_tbl_t *cmdtp, int flag, int argc, char * const arg
 
        switch (argv[0][3]) {
        case 'r':
-               readhow = ram_read_buf;
+               readwhat = ram_read_buf;
                break;
        case 'e':
-               readhow = eeprom_read_buf;
+               readwhat = eeprom_read_buf;
                break;
        case 'f':
-               readhow = flash_read_buf;
+               readwhat = flash_read_buf;
                break;
        default:
                return CMD_RET_USAGE;
@@ -71,7 +72,7 @@ command_ret_t do_dump_mem(cmd_tbl_t *cmdtp, int flag, int argc, char * const arg
                length = (uint16_t) strtoul(argv[2], NULL, 16);
 
        /* Print the lines. */
-       dump_mem(addr, addr, length, readhow, NULL);
+       dump_mem(addr, addr, length, readwhat, NULL);
 
        return CMD_RET_SUCCESS;
 }
@@ -127,6 +128,83 @@ command_ret_t do_eep_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
 }
 
 
+/* Modify memory.
+ *
+ * Syntax:
+ *     !mm {addr}
+ *     !nm {addr}
+ */
+
+ static uint8_t        *mm_last_addr;
+
+static command_ret_t
+mod_mem_avr(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
+{
+       uint8_t *addr;
+       uint8_t data;
+       int nbytes;
+
+       (void) cmdtp;
+
+       if (argc != 2)
+               return CMD_RET_USAGE;
+
+       /* We use the last specified parameters, unless new ones are
+        * entered.
+        */
+       addr = mm_last_addr;
+
+       if ((flag & CMD_FLAG_REPEAT) == 0) {
+               /* New command specified.
+                */
+
+               /* Address is specified since argc > 1
+               */
+               addr = (uint8_t *) (size_t) strtoul(argv[1], NULL, 16);
+       }
+
+       /* Print the address, followed by value.  Then accept input for
+        * the next value.  A non-converted value exits.
+        */
+       do {
+               data = *addr;
+               printf_P(PSTR("%04x: %02x"), addr, data);
+
+               nbytes = cli_readline(PSTR(" ? "));
+               if (nbytes == 0 || (nbytes == 1 && console_buffer[0] == '-')) {
+                       /* <CR> pressed as only input, don't modify current
+                        * location and move to next. "-" pressed will go back.
+                        */
+                       if (incrflag)
+                               addr += nbytes ? -1 : 1;
+                       nbytes = 1;
+
+               } else {
+                       char *endp;
+                       data = strtoul(console_buffer, &endp, 16);
+                       nbytes = endp - console_buffer;
+                       if (nbytes) {
+                               *addr = data;
+                               if (incrflag)
+                                       addr++;
+                       }
+               }
+       } while (nbytes);
+
+       mm_last_addr = addr;
+       return CMD_RET_SUCCESS;
+}
+
+
+command_ret_t do_mem_mm_avr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       return mod_mem_avr (cmdtp, 1, flag, argc, argv);
+}
+command_ret_t do_mem_nm_avr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       return mod_mem_avr (cmdtp, 0, flag, argc, argv);
+}
+
 /*------------------------------------------------------------------------------*/
 
 #if 1