]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/cmd_mem.c
add fat commands: rm, mkdir
[z180-stamp.git] / avr / cmd_mem.c
index 315cd71e93e61dc9bf0dea6b58cc15e1baba6a9b..85b5a44b1b149beca230c674cab2d98bf2dc600d 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * (C) Copyright 2014 Leo C. <erbl259-lmu@yahoo.de>
+ * (C) Copyright 2014,2018 Leo C. <erbl259-lmu@yahoo.de>
  *
  * (C) Copyright 2000
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * (C) Copyright 2000
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  * Copied from FADS ROM, Dan Malek (dmalek@jlc.net)
  */
 
  * Copied from FADS ROM, Dan Malek (dmalek@jlc.net)
  */
 
-#include "common.h"
-#include <ctype.h>
+#include "cmd_mem.h"
 #include <avr/interrupt.h>
 
 #include <avr/interrupt.h>
 
-#include "command.h"
 #include "cli_readline.h"
 #include "print-utils.h"
 #include "con-utils.h"
 #include "cli_readline.h"
 #include "print-utils.h"
 #include "con-utils.h"
@@ -25,6 +23,7 @@
 #include "eval_arg.h"
 #include "timer.h"
 #include "z80-if.h"
 #include "eval_arg.h"
 #include "timer.h"
 #include "z80-if.h"
+#include "disas_z180.h"
 #include "debug.h"
 
 
 #include "debug.h"
 
 
@@ -35,6 +34,7 @@
 /* Display values from last command.
  * Memory modify remembered values are different from display memory.
  */
 /* Display values from last command.
  * Memory modify remembered values are different from display memory.
  */
+static uint32_t        disas_last_addr;
 static uint32_t        dp_last_addr;
 static uint32_t        dp_last_length = 0x100;
 static uint32_t        mm_last_addr;
 static uint32_t        dp_last_addr;
 static uint32_t        dp_last_length = 0x100;
 static uint32_t        mm_last_addr;
@@ -43,24 +43,83 @@ static      uint32_t        base_address = 0;
 
 /*--------------------------------------------------------------------------*/
 
 
 /*--------------------------------------------------------------------------*/
 
-int z180_read_buf(uint8_t *buf, uint32_t addr, uint8_t count)
+static ERRNUM z180_read_buf(uint8_t *buf, uint32_t addr, uint8_t count)
 {
        if (!(z80_bus_cmd(Request) & ZST_ACQUIRED))
 {
        if (!(z80_bus_cmd(Request) & ZST_ACQUIRED))
-               return -1;
+               return EBUSTO;
 
        z80_read_block (buf, addr, count);
        z80_bus_cmd(Release);
 
        z80_read_block (buf, addr, count);
        z80_bus_cmd(Release);
-       return 0;
+       return ESUCCESS;
 }
 
 /*--------------------------------------------------------------------------*/
 
 }
 
 /*--------------------------------------------------------------------------*/
 
+command_ret_t do_mem_size(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc UNUSED, char * const argv[] UNUSED)
+{
+       int32_t ramsize = z80_memsize_detect();
+
+       if (ramsize < 0)
+               cmd_error(CMD_RET_FAILURE, (ERRNUM) -ramsize, PSTR("Couldn't access RAM"));
+
+       printf_P(PSTR("Detected RAM: Start %.5lx, End: %.5lx, Size: %.5lx (%ld dec)\n"),
+               0l, ramsize ? ramsize-1 : 0l, ramsize, ramsize);
+
+       return CMD_RET_SUCCESS;
+}
+
+/*
+* Disassemble code from memory
+*
+* Usage:
+*      disassemble address [# of lines]
+*
+ */
+command_ret_t do_disas(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[])
+{
+       (void) cmdtp;
+
+       /* We use the last specified parameters, unless new ones are
+        * entered.
+        */
+       uint32_t addr = disas_last_addr;
+       int length = 16;
+       int ret = CMD_RET_SUCCESS;
+
+       if (argc < 2)
+               return CMD_RET_USAGE;
+
+       if ((flag & CMD_FLAG_REPEAT) == 0) {
+               /* Address is specified since argc > 1 */
+               addr = eval_arg(argv[1], NULL);
+               addr += base_address;
+
+               /* If another parameter, it is the length (Number of lines) to display. */
+               if (argc > 2)
+                       length = (int) eval_arg(argv[2], NULL);
+       }
+
+       z80_bus_request_or_exit();
+       clear_ctrlc();                                  /* forget any previous Control-C */
+       for (; length > 0; --length) {
+               addr = dis_decode(addr);
+               if (had_ctrlc() || ctrlc()) {
+                       ret = CMD_RET_FAILURE;
+                       break;
+               }
+       }
+       z80_bus_cmd(Release);
+       disas_last_addr = addr;
+
+       return ret;
+}
+
 /* Memory Display
  *
  * Syntax:
  *     md {addr} {len}
  */
 /* Memory Display
  *
  * 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;
 
 {
        uint32_t addr, length;
 
@@ -94,13 +153,11 @@ command_ret_t do_mem_md(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
        }
 
        /* Print the lines. */
        }
 
        /* Print the lines. */
-       int ret = dump_mem(addr, addr, length, z180_read_buf, NULL);
-       if (ret == -2)  { /* TODO: Error codes */
-               my_puts_P(PSTR("Bus timeout\n"));
-               return  CMD_RET_FAILURE;
-       }
+       ERRNUM ret = dump_mem(addr, addr, length, z180_read_buf, NULL);
+       if (ret == EBUSTO)
+               cmd_error(CMD_RET_FAILURE, ret, NULL);
 
 
-       if (ret >= 0) {
+       if (ret == ESUCCESS) {
                dp_last_addr = addr + length;
                dp_last_length = length;
        }
                dp_last_addr = addr + length;
                dp_last_length = length;
        }
@@ -114,7 +171,7 @@ command_ret_t do_mem_md(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
  *     nm {addr}
  */
 static command_ret_t
  *     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;
 {
        uint32_t addr;
        uint8_t data;
@@ -144,10 +201,7 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
         * the next value.  A non-converted value exits.
         */
        do {
         * the next value.  A non-converted value exits.
         */
        do {
-               if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
-                       my_puts_P(PSTR("Bus timeout\n"));
-                       return  CMD_RET_FAILURE;
-               }
+               z80_bus_request_or_exit();
                data = z80_read(addr);
                z80_bus_cmd(Release);
                printf_P(PSTR("%05lx: %02x"), addr, data);
                data = z80_read(addr);
                z80_bus_cmd(Release);
                printf_P(PSTR("%05lx: %02x"), addr, data);
@@ -166,10 +220,7 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
                        data = eval_arg(console_buffer, &endp);
                        nbytes = endp - console_buffer;
                        if (nbytes) {
                        data = eval_arg(console_buffer, &endp);
                        nbytes = endp - console_buffer;
                        if (nbytes) {
-                               if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
-                                       my_puts_P(PSTR("Bus timeout\n"));
-                                       return  CMD_RET_FAILURE;
-                               }
+                               z80_bus_request_or_exit();
                                z80_write(addr, data);
                                z80_bus_cmd(Release);
                                if (incrflag)
                                z80_write(addr, data);
                                z80_bus_cmd(Release);
                                if (incrflag)
@@ -183,16 +234,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);
 }
 {
        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);
 }
 
 {
        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;
 {
        uint32_t writeval;
        uint32_t addr;
@@ -201,9 +252,6 @@ command_ret_t do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
 
        (void) cmdtp; (void) flag;
 
 
        (void) cmdtp; (void) flag;
 
-       /* reset getopt() */
-       optind = 0;
-
        int opt;
        while ((opt = getopt(argc, argv, PSTR("bwl"))) != -1) {
                switch (opt) {
        int opt;
        while ((opt = getopt(argc, argv, PSTR("bwl"))) != -1) {
                switch (opt) {
@@ -235,11 +283,7 @@ command_ret_t do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
        if (argc == 3)
                count = eval_arg(argv[optind], NULL);
 
        if (argc == 3)
                count = eval_arg(argv[optind], NULL);
 
-       if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
-               my_puts_P(PSTR("Bus timeout\n"));
-               return  CMD_RET_FAILURE;
-       }
-
+       z80_bus_request_or_exit();
        if (width == 1)
                z80_memset(addr, writeval, count);
        else {
        if (width == 1)
                z80_memset(addr, writeval, count);
        else {
@@ -254,7 +298,7 @@ command_ret_t do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
 }
 
 #ifdef CONFIG_MX_CYCLIC
 }
 
 #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;
 {
        uint32_t count;
        uint32_t ts;
@@ -262,7 +306,6 @@ command_ret_t do_mem_mdc ( cmd_tbl_t *cmdtp, int flag, int argc, char * const ar
        (void) cmdtp;
        (void) flag;
 
        (void) cmdtp;
        (void) flag;
 
-       optind = 0;
        if (argv[0][1] != 'd') {
                int opt;
                while ((opt = getopt(argc, argv, PSTR("bwl"))) != -1)
        if (argv[0][1] != 'd') {
                int opt;
                while ((opt = getopt(argc, argv, PSTR("bwl"))) != -1)
@@ -300,7 +343,7 @@ command_ret_t do_mem_mdc ( cmd_tbl_t *cmdtp, int flag, int argc, char * const ar
 }
 #endif /* CONFIG_MX_CYCLIC */
 
 }
 #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;
 {
        uint32_t addr1, addr2, count, ngood;
        command_ret_t rcode = CMD_RET_SUCCESS;
@@ -349,7 +392,7 @@ command_ret_t do_mem_cmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
        return rcode;
 }
 
        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;
 {
        uint32_t src, dest, count;
        int_fast8_t step;
@@ -380,10 +423,7 @@ command_ret_t do_mem_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
 
        while (count-- > 0) {
                uint8_t data;
 
        while (count-- > 0) {
                uint8_t data;
-               if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
-                       my_puts_P(PSTR("Bus timeout\n"));
-                       return  CMD_RET_FAILURE;
-               }
+               z80_bus_request_or_exit();
                data = z80_read(src);
                z80_write(dest, data);
                z80_bus_cmd(Release);
                data = z80_read(src);
                z80_write(dest, data);
                z80_bus_cmd(Release);
@@ -399,7 +439,7 @@ command_ret_t do_mem_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
        return CMD_RET_SUCCESS;
 }
 
        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;
                       char * const argv[])
 {
        (void) cmdtp;
@@ -414,7 +454,7 @@ command_ret_t do_mem_base(cmd_tbl_t *cmdtp, int flag, int argc,
        return CMD_RET_SUCCESS;
 }
 
        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;
                       char * const argv[])
 {
        uint32_t addr, length;
@@ -436,19 +476,13 @@ command_ret_t do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc,
         * If we have only one object, just run infinite loops.
         */
        if (length == 1) {
         * If we have only one object, just run infinite loops.
         */
        if (length == 1) {
-               if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
-                       my_puts_P(PSTR("Bus timeout\n"));
-                       return  CMD_RET_FAILURE;
-               }
+               z80_bus_request_or_exit();
                cli();
                for (;;)
                        z80_read(addr);
        }
 
                cli();
                for (;;)
                        z80_read(addr);
        }
 
-       if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
-               my_puts_P(PSTR("Bus timeout\n"));
-               return  CMD_RET_FAILURE;
-       }
+       z80_bus_request_or_exit();
        cli();
        for (;;) {
                uint32_t i = length;
        cli();
        for (;;) {
                uint32_t i = length;
@@ -460,7 +494,7 @@ command_ret_t do_mem_loop(cmd_tbl_t *cmdtp, int flag, int argc,
        return CMD_RET_SUCCESS;
 }
 
        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;
 {
        uint32_t addr, length;
        uint8_t data;
@@ -484,19 +518,13 @@ command_ret_t do_mem_loopw (cmd_tbl_t *cmdtp, int flag, int argc, char * const a
         * If we have only one object, just run infinite loops.
         */
        if (length == 1) {
         * If we have only one object, just run infinite loops.
         */
        if (length == 1) {
-               if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
-                       my_puts_P(PSTR("Bus timeout\n"));
-                       return  CMD_RET_FAILURE;
-               }
+               z80_bus_request_or_exit();
                cli();
                for (;;)
                        z80_write(addr, data);
        }
 
                cli();
                for (;;)
                        z80_write(addr, data);
        }
 
-       if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
-               my_puts_P(PSTR("Bus timeout\n"));
-               return  CMD_RET_FAILURE;
-       }
+       z80_bus_request_or_exit();
        cli();
        for (;;) {
                uint32_t i = length;
        cli();
        for (;;) {
                uint32_t i = length;
@@ -734,7 +762,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.
  */
  * 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;
                        char * const argv[])
 {
        uint32_t start = 0;
@@ -770,10 +798,7 @@ command_ret_t do_mem_mtest(cmd_tbl_t *cmdtp, int flag, int argc,
                printf_P(PSTR("Iteration: %6d\r"), iteration + 1);
 //             debug("\n");
 
                printf_P(PSTR("Iteration: %6d\r"), iteration + 1);
 //             debug("\n");
 
-               if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
-                       my_puts_P(PSTR("Bus timeout\n"));
-                       return  CMD_RET_FAILURE;
-               }
+               z80_bus_request_or_exit();
                errs += mem_test_alt(start, end);
                z80_bus_cmd(Release);
 
                errs += mem_test_alt(start, end);
                z80_bus_cmd(Release);