X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/1da3acc4b7215e76d459905c3e74675ffa679ce0..f338df2abc35f85961aa6266458f94ea2a102b81:/avr/cmd_boot.c?ds=sidebyside diff --git a/avr/cmd_boot.c b/avr/cmd_boot.c index 4fb9c2a..8c17799 100644 --- a/avr/cmd_boot.c +++ b/avr/cmd_boot.c @@ -4,6 +4,7 @@ */ #include "common.h" #include +#include #include #include "command.h" @@ -29,11 +30,11 @@ static void z80_load_mem(void) hdrom_address[sec]+hdrom_length_of_sections[sec] - 1, hdrom_length_of_sections[sec]); - z80_request_bus(); + zstate_t state = z80_request_bus_save(); z80_write_block((const FLASH unsigned char *) &hdrom[sec_base], /* src */ hdrom_address[sec], /* dest */ hdrom_length_of_sections[sec]); /* len */ - z80_release_bus(); + z80_release_bus_save(state); sec_base+=hdrom_length_of_sections[sec]; sec++; } @@ -43,7 +44,7 @@ int do_loadf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { (void) cmdtp; (void) flag; (void) argc; (void) argv; - if (z80_runstate() != 0) { + if (z80_runstate() & ZST_RUNNING) { printf_P(PSTR("## Can't load while CPU is running!\n")); return 1; } @@ -54,34 +55,72 @@ int do_loadf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) } -int do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +int do_busreq_pulse(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - uint32_t addr; + uint16_t count=1; - (void) cmdtp; (void) flag; (void) argc; + (void) cmdtp; (void) flag; - if (z80_runstate() != 0) { - printf_P(PSTR("## CPU allready running!\n")); + if (!(z80_runstate() & ZST_RUNNING)) { + printf_P(PSTR("## CPU is not running!\n")); return 1; } - addr = strtoul(argv[1], NULL, 16); + if (argc > 1) + count = (uint16_t) strtoul(argv[2], NULL, 16); + + z80_request_bus(); + while (count--) + z80_busreq_hpulse(); - if (addr > (1UL<<16) - 1) { + return 0; +} + + +int do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + uint32_t addr; + + (void) cmdtp; (void) flag; + + if (argc < 2) + return CMD_RET_USAGE; + addr = strtoul(argv[1], NULL, 16); + if (addr >= (1UL<<16)) { printf_P(PSTR("## Startaddress 0x%05lx too high.\n" " (Out of logical address space (0x00000-0x0ffff))\n"), addr); return 1; - } else if (addr != 0) { - printf_P(PSTR("## Starting application at " - "address != 0x0000 not implemented yet.\n")); + } + + if (z80_runstate() & ZST_RUNNING) { + printf_P(PSTR("## CPU allready running!\n")); return 1; - } else { - printf_P(PSTR("## Starting application at 0x%05lX ...\n"), addr); - z80_release_bus(); - z80_reset(HIGH); } + printf_P(PSTR("## Starting application at 0x%04lx ...\n"), addr); + + if (addr != 0) { + uint8_t tmp[3]; + uint_fast8_t i; + + z80_request_bus(); + for (i = 0; i < 3; i++) + tmp[i] = z80_read(i); + z80_write(0, 0xc3); + z80_write(1, addr); + z80_write(2, (addr >> 8)); + + z80_run(); + z80_busreq_hpulse(); + z80_busreq_hpulse(); + for (i = 0; i < 3; i++) + z80_write(i, tmp[i]); + } else + z80_run(); + + z80_release_bus(); + return 0; } @@ -90,7 +129,7 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) (void) cmdtp; (void) flag; (void) argc; (void) argv; printf_P(PSTR("## CPU now in reset state.\n")); - z80_reset(LOW); + z80_reset(); return 0; }