]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/cmd_mem.c
Timeout for Z180 bus access
[z180-stamp.git] / avr / cmd_mem.c
index 66ace105d1514288d2272f31432d088bddfaba05..0bc57421bdfc95282e9d38df262f3b8d54afad4a 100644 (file)
@@ -41,10 +41,10 @@ static      uint32_t        base_address = 0;
 
 void z180_read_buf(uint8_t *buf, uint32_t addr, uint8_t count)
 {
-               z80_bus_cmd(Request);
-               while (count--)
-                       *buf++ = z80_read(addr++);
-               z80_bus_cmd(Release);
+               if (z80_bus_cmd(Request) & ZST_ACQUIRED) {
+                       z80_read_block (buf, addr, count);
+                       z80_bus_cmd(Release);
+               }
 }
 
 /*--------------------------------------------------------------------------*/
@@ -132,10 +132,13 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
         * the next value.  A non-converted value exits.
         */
        do {
-               z80_bus_cmd(Request);
+               if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
+                       my_puts_P(PSTR("Bus timeout\n"));
+                       return  CMD_RET_FAILURE;
+               }
                data = z80_read(addr);
-               printf_P(PSTR("%05lx: %02x"), addr, data);
                z80_bus_cmd(Release);
+               printf_P(PSTR("%05lx: %02x"), addr, data);
 
                nbytes = cli_readline(PSTR(" ? "));
                if (nbytes == 0 || (nbytes == 1 && console_buffer[0] == '-')) {
@@ -151,7 +154,10 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
                        data = strtoul(console_buffer, &endp, 16);
                        nbytes = endp - console_buffer;
                        if (nbytes) {
-                               z80_bus_cmd(Request);
+                               if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
+                                       my_puts_P(PSTR("Bus timeout\n"));
+                                       return  CMD_RET_FAILURE;
+                               }
                                z80_write(addr, data);
                                z80_bus_cmd(Release);
                                if (incrflag)
@@ -201,11 +207,11 @@ command_ret_t do_mem_mw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
                count = 1;
        }
 
-       z80_bus_cmd(Request);
-       while (count-- > 0) {
-               z80_write(addr, writeval);
-               ++addr;
+       if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
+               my_puts_P(PSTR("Bus timeout\n"));
+               return  CMD_RET_FAILURE;
        }
+       z80_memset(addr, writeval, count);
        z80_bus_cmd(Release);
 
        return CMD_RET_SUCCESS;
@@ -289,7 +295,11 @@ command_ret_t do_mem_cmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
        count = strtoul(argv[3], NULL, 16);
 
        for (ngood = 0; ngood < count; ++ngood) {
-               z80_bus_cmd(Request);
+               if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
+                       my_puts_P(PSTR("Bus timeout\n"));
+                       rcode =  CMD_RET_FAILURE;
+                       break;
+               }
                byte1 = z80_read(addr1);
                byte2 = z80_read(addr2);
                z80_bus_cmd(Release);
@@ -345,7 +355,10 @@ command_ret_t do_mem_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[
 
        while (count-- > 0) {
                uint8_t data;
-               z80_bus_cmd(Request);
+               if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
+                       my_puts_P(PSTR("Bus timeout\n"));
+                       return  CMD_RET_FAILURE;
+               }
                data = z80_read(src);
                z80_write(dest, data);
                z80_bus_cmd(Release);
@@ -398,13 +411,19 @@ 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) {
-               z80_bus_cmd(Request);
+               if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
+                       my_puts_P(PSTR("Bus timeout\n"));
+                       return  CMD_RET_FAILURE;
+               }
                for (;;)
                        z80_read(addr);
                z80_bus_cmd(Release);
        }
 
-       z80_bus_cmd(Request);
+       if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
+               my_puts_P(PSTR("Bus timeout\n"));
+               return  CMD_RET_FAILURE;
+       }
        for (;;) {
                uint32_t i = length;
                uint32_t p = addr;
@@ -440,11 +459,18 @@ 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) {
-               z80_bus_cmd(Request);
+               if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
+                       my_puts_P(PSTR("Bus timeout\n"));
+                       return  CMD_RET_FAILURE;
+               }
                for (;;)
                        z80_write(addr, data);
        }
 
+       if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) {
+               my_puts_P(PSTR("Bus timeout\n"));
+               return  CMD_RET_FAILURE;
+       }
        for (;;) {
                uint32_t i = length;
                uint32_t p = addr;