From 32154e5a9e9bf0a52269b3715711b76dc8fcac0f Mon Sep 17 00:00:00 2001 From: Leo C Date: Mon, 23 May 2016 11:23:12 +0200 Subject: mw command: add word and longword options --- avr/cmd_mem.c | 61 +++++++++++++++++++++++++++++++++++++++---------------- avr/command_tbl.c | 11 ++++++---- 2 files changed, 50 insertions(+), 22 deletions(-) (limited to 'avr') diff --git a/avr/cmd_mem.c b/avr/cmd_mem.c index a725c61..9adee72 100644 --- a/avr/cmd_mem.c +++ b/avr/cmd_mem.c @@ -22,6 +22,7 @@ #include "cli_readline.h" #include "print-utils.h" #include "con-utils.h" +#include "getopt-min.h" #include "timer.h" #include "z80-if.h" #include "debug.h" @@ -193,36 +194,60 @@ command_ret_t do_mem_nm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ command_ret_t do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - uint8_t writeval; - uint32_t addr, count; + uint32_t writeval; + uint32_t addr; + uint32_t count = 1; + uint_fast8_t width = 1; - (void) cmdtp; - (void) flag; + (void) cmdtp; (void) flag; - if ((argc < 3) || (argc > 4)) + /* reset getopt() */ + optind = 1; + + int opt; + while ((opt = getopt(argc, argv, PSTR("bwl"))) != -1) { + switch (opt) { + case 'b': + width = 1; + break; + case 'w': + width = 2; + break; + case 'l': + width = 4; + break; + default: /* '?' */ + return CMD_RET_USAGE; + } + } + + /* remaining arguments */ + argc -= optind; + if ((argc < 2) || (argc > 3)) return CMD_RET_USAGE; - /* Address is specified since argc > 1 - */ - addr = strtoul(argv[1], NULL, 16); + /* Address and value are specified since (adjusted) argc >= 2 */ + addr = strtoul(argv[optind++], NULL, 16); addr += base_address; - - /* Get the value to write. - */ - writeval = (uint8_t) strtoul(argv[2], NULL, 16); + writeval = strtoul(argv[optind++], NULL, 16); /* Count ? */ - if (argc == 4) { - count = strtoul(argv[3], NULL, 16); - } else { - count = 1; - } + if (argc == 3) + count = strtoul(argv[optind], NULL, 16); if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { my_puts_P(PSTR("Bus timeout\n")); return CMD_RET_FAILURE; } - z80_memset(addr, writeval, count); + + if (width == 1) + z80_memset(addr, writeval, count); + else { + while (count--) { + z80_write_block((const uint8_t *) &writeval, addr, width); + addr += width; + } + } z80_bus_cmd(Release); return CMD_RET_SUCCESS; diff --git a/avr/command_tbl.c b/avr/command_tbl.c index 1731b83..2c91355 100644 --- a/avr/command_tbl.c +++ b/avr/command_tbl.c @@ -98,8 +98,8 @@ CMD_TBL_ITEM( echo, CONFIG_SYS_MAXARGS, 1, do_echo, "display a line of text", "[-n] [argument ...]\n" - " - echo the argument(s) to console.\n" - " -n do not output the trailing newline" + "- echo the argument(s) to console.\n" + " -n do not output the trailing newline" ), CMD_TBL_ITEM( sleep , 2, 1, do_sleep, @@ -249,9 +249,12 @@ CMD_TBL_ITEM( "address" ), CMD_TBL_ITEM( - mw, 4, 1, do_mem_mw, + mw, CONFIG_SYS_MAXARGS, 1, do_mem_mw, "memory write (fill)", - "address value [count]" + "[-bwl] address value [count]\n" + " -b write value as byte (8 bit, default)\n" + " -w write value as word (16 bit)\n" + " -l write value as long (32 bit)\n" ), CMD_TBL_ITEM( cp, 4, 1, do_mem_cp, -- cgit v1.2.3