From ea6971b809eae9ca238cd859316fdcef2839b002 Mon Sep 17 00:00:00 2001 From: Leo C Date: Tue, 25 Nov 2014 10:53:39 +0100 Subject: Timeout for Z180 bus access --- avr/cmd_mem.c | 58 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 16 deletions(-) (limited to 'avr/cmd_mem.c') diff --git a/avr/cmd_mem.c b/avr/cmd_mem.c index 66ace10..0bc5742 100644 --- a/avr/cmd_mem.c +++ b/avr/cmd_mem.c @@ -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; -- cgit v1.2.3