]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/cmd_mem.c
New debug command: dump heap
[z180-stamp.git] / avr / cmd_mem.c
index 4fe941556205d05121fd0a6ba4e1b01abe0c58a2..763b857b860bf20de2ca586f833f58f716d1766f 100644 (file)
@@ -14,7 +14,6 @@
  */
 
 #include "common.h"
-#include <stdlib.h>
 #include <ctype.h>
 #include <avr/interrupt.h>
 
@@ -23,6 +22,7 @@
 #include "print-utils.h"
 #include "con-utils.h"
 #include "getopt-min.h"
+#include "eval_arg.h"
 #include "timer.h"
 #include "z80-if.h"
 #include "debug.h"
@@ -60,7 +60,7 @@ int z180_read_buf(uint8_t *buf, uint32_t addr, uint8_t count)
  * Syntax:
  *     md {addr} {len}
  */
-command_ret_t do_mem_md(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_mem_md(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
 {
        uint32_t addr, length;
 
@@ -85,12 +85,12 @@ command_ret_t do_mem_md(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
 
        if ((flag & CMD_FLAG_REPEAT) == 0) {
                /* Address is specified since argc > 1 */
-               addr = strtoul(argv[1], NULL, 16);
+               addr = eval_arg(argv[1], NULL);
                addr += base_address;
 
                /* If another parameter, it is the length to display. */
                if (argc > 2)
-                       length = strtoul(argv[2], NULL, 16);
+                       length = eval_arg(argv[2], NULL);
        }
 
        /* Print the lines. */
@@ -114,7 +114,7 @@ command_ret_t do_mem_md(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
  *     nm {addr}
  */
 static command_ret_t
-mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
+mod_mem(cmd_tbl_t *cmdtp, int incrflag, uint_fast8_t flag, int argc, char * const argv[])
 {
        uint32_t addr;
        uint8_t data;
@@ -136,7 +136,7 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
 
                /* Address is specified since argc > 1
                */
-               addr = strtoul(argv[1], NULL, 16);
+               addr = eval_arg(argv[1], NULL);
                addr += base_address;
        }
 
@@ -163,7 +163,7 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
 
                } else {
                        char *endp;
-                       data = strtoul(console_buffer, &endp, 16);
+                       data = eval_arg(console_buffer, &endp);
                        nbytes = endp - console_buffer;
                        if (nbytes) {
                                if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
@@ -183,16 +183,16 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
 }
 
 
-command_ret_t do_mem_mm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_mem_mm(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
 {
        return mod_mem (cmdtp, 1, flag, argc, argv);
 }
-command_ret_t do_mem_nm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_mem_nm(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
 {
        return mod_mem (cmdtp, 0, flag, argc, argv);
 }
 
-command_ret_t do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_mem_mw(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
 {
        uint32_t writeval;
        uint32_t addr;
@@ -227,13 +227,13 @@ command_ret_t do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
                return CMD_RET_USAGE;
 
        /* Address and value are specified since (adjusted) argc >= 2 */
-       addr = strtoul(argv[optind++], NULL, 16);
+       addr = eval_arg(argv[optind++], NULL);
        addr += base_address;
-       writeval = strtoul(argv[optind++], NULL, 16);
+       writeval = eval_arg(argv[optind++], NULL);
 
        /* Count ? */
        if (argc == 3)
-               count = strtoul(argv[optind], NULL, 16);
+               count = eval_arg(argv[optind], NULL);
 
        if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
                my_puts_P(PSTR("Bus timeout\n"));
@@ -254,7 +254,7 @@ command_ret_t do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
 }
 
 #ifdef CONFIG_MX_CYCLIC
-command_ret_t do_mem_mdc ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_mem_mdc ( cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
 {
        uint32_t count;
        uint32_t ts;
@@ -262,18 +262,27 @@ command_ret_t do_mem_mdc ( cmd_tbl_t *cmdtp, int flag, int argc, char * const ar
        (void) cmdtp;
        (void) flag;
 
-       if (argc < 4)
+       optind = 0;
+       if (argv[0][1] != 'd') {
+               int opt;
+               while ((opt = getopt(argc, argv, PSTR("bwl"))) != -1)
+                       if (opt == '?')
+                               return CMD_RET_USAGE;
+               --optind;
+       }
+
+       if (argc-optind != 4)
                return CMD_RET_USAGE;
 
-       count = strtoul(argv[3], NULL, 10);
+       count = eval_arg(argv[optind + 3], NULL);
 
        clear_ctrlc();          /* forget any previous Control C */
        for (;;) {
 
                if (argv[0][1] == 'd')
-                       do_mem_md (NULL, 0, 3, argv);
+                       do_mem_md (NULL, 0, argc-1, argv);              /* memory display */
                else
-                       do_mem_mw (NULL, 0, 3, argv);
+                       do_mem_mw (NULL, 0, argc-1, argv);              /* memory write */
 
 
                /* delay for <count> ms... */
@@ -291,7 +300,7 @@ command_ret_t do_mem_mdc ( cmd_tbl_t *cmdtp, int flag, int argc, char * const ar
 }
 #endif /* CONFIG_MX_CYCLIC */
 
-command_ret_t do_mem_cmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_mem_cmp(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
 {
        uint32_t addr1, addr2, count, ngood;
        command_ret_t rcode = CMD_RET_SUCCESS;
@@ -304,11 +313,11 @@ command_ret_t do_mem_cmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
                return CMD_RET_USAGE;
 
 
-       addr1 = strtoul(argv[1], NULL, 16);
+       addr1 = eval_arg(argv[1], NULL);
        addr1 += base_address;
-       addr2 = strtoul(argv[2], NULL, 16);
+       addr2 = eval_arg(argv[2], NULL);
        addr2 += base_address;
-       count = strtoul(argv[3], NULL, 16);
+       count = eval_arg(argv[3], NULL);
 
        for (ngood = 0; ngood < count; ++ngood) {
                if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
@@ -340,7 +349,7 @@ command_ret_t do_mem_cmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
        return rcode;
 }
 
-command_ret_t do_mem_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_mem_cp(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
 {
        uint32_t src, dest, count;
        int_fast8_t step;
@@ -351,11 +360,11 @@ command_ret_t do_mem_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
        if (argc != 4)
                return CMD_RET_USAGE;
 
-       src = strtoul(argv[1], NULL, 16);
+       src = eval_arg(argv[1], NULL);
        src += base_address;
-       dest = strtoul(argv[2], NULL, 16);
+       dest = eval_arg(argv[2], NULL);
        dest += base_address;
-       count = strtoul(argv[3], NULL, 16);
+       count = eval_arg(argv[3], NULL);
 
        if (count == 0) {
                my_puts_P(PSTR("Zero length?\n"));
@@ -390,7 +399,7 @@ command_ret_t do_mem_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
        return CMD_RET_SUCCESS;
 }
 
-command_ret_t do_mem_base(cmd_tbl_t *cmdtp, int flag, int argc,
+command_ret_t do_mem_base(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc,
                       char * const argv[])
 {
        (void) cmdtp;
@@ -398,14 +407,14 @@ command_ret_t do_mem_base(cmd_tbl_t *cmdtp, int flag, int argc,
 
        if (argc > 1) {
                /* Set new base address. */
-               base_address = strtoul(argv[1], NULL, 16);
+               base_address = eval_arg(argv[1], NULL);
        }
        /* Print the current base address. */
        printf_P(PSTR("Base Address: 0x%05lx\n"), base_address);
        return CMD_RET_SUCCESS;
 }
 
-command_ret_t do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc,
+command_ret_t do_mem_loop(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc,
                       char * const argv[])
 {
        uint32_t addr, length;
@@ -417,10 +426,10 @@ command_ret_t do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc,
                return CMD_RET_USAGE;
 
        /* Address is always specified. */
-       addr = strtoul(argv[1], NULL, 16);
+       addr = eval_arg(argv[1], NULL);
 
        /* Length is the number of bytes. */
-       length = strtoul(argv[2], NULL, 16);
+       length = eval_arg(argv[2], NULL);
 
 
        /* We want to optimize the loops to run as fast as possible.
@@ -451,7 +460,7 @@ command_ret_t do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc,
        return CMD_RET_SUCCESS;
 }
 
-command_ret_t do_mem_loopw (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_mem_loopw (cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
 {
        uint32_t addr, length;
        uint8_t data;
@@ -463,12 +472,12 @@ command_ret_t do_mem_loopw (cmd_tbl_t *cmdtp, int flag, int argc, char * const a
                return CMD_RET_USAGE;
 
        /* Address is always specified. */
-       addr = strtoul(argv[1], NULL, 16);
+       addr = eval_arg(argv[1], NULL);
 
        /* Length is the number of bytes. */
-       length = strtoul(argv[2], NULL, 16);
+       length = eval_arg(argv[2], NULL);
 
-       data = strtoul(argv[3], NULL, 16);
+       data = eval_arg(argv[3], NULL);
 
        /*
         * We want to optimize the loops to run as fast as possible.
@@ -725,7 +734,7 @@ static uint32_t mem_test_alt(uint32_t start_addr, uint32_t end_addr)
  * configured using CONFIG_SYS_ALT_MEMTEST. The complete test loops until
  * interrupted by ctrl-c or by a failure of one of the sub-tests.
  */
-command_ret_t do_mem_mtest(cmd_tbl_t *cmdtp, int flag, int argc,
+command_ret_t do_mem_mtest(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc,
                        char * const argv[])
 {
        uint32_t start = 0;
@@ -739,15 +748,15 @@ command_ret_t do_mem_mtest(cmd_tbl_t *cmdtp, int flag, int argc,
        (void) flag;
 
        if (argc > 1)
-               start = strtoul(argv[1], NULL, 16);
+               start = eval_arg(argv[1], NULL);
 
        if (argc > 2)
-               end = strtoul(argv[2], NULL, 16);
+               end = eval_arg(argv[2], NULL);
        else
                end = CONFIG_SYS_RAMSIZE_MAX - 1;
 
        if (argc > 3)
-               iteration_limit = (unsigned int) strtoul(argv[3], NULL, 16);
+               iteration_limit = (unsigned int) eval_arg(argv[3], NULL);
 
        printf_P(PSTR("Testing %05lx ... %05lx:\n"), start, end);
 //     debug("## %s:%d: start %#05lx end %#05lx\n", __func__, __LINE__, start, end);