X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/8ed660166ce9cdeb63b4cf710c663407b7ec9128..04b3ea0e67e1f1fe8e9af71f6d532af5471da0e3:/avr/cmd_mem.c 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;