X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/e9d96859cfcfe170c0025e427fd9934728395dc2..9403f93922ea096bfdea4a81f1c34c5c044fcbbb:/avr/cmd_boot.c diff --git a/avr/cmd_boot.c b/avr/cmd_boot.c index 600bad3..e26a8b1 100644 --- a/avr/cmd_boot.c +++ b/avr/cmd_boot.c @@ -31,33 +31,6 @@ #undef const - -static void z80_load_mem(int_fast8_t verbosity, - const FLASH unsigned char data[], - const FLASH unsigned long *sections, - const FLASH unsigned long address[], - const FLASH unsigned long length_of_sections[]) -{ - uint32_t sec_base = 0; - - if (verbosity > 1) - printf_P(PSTR("Loading Z180 memory... \n")); - - for (unsigned sec = 0; sec < *sections; sec++) { - if (verbosity > 0) { - printf_P(PSTR(" From: 0x%.5lX to: 0x%.5lX (%5li bytes)\n"), - address[sec], - address[sec]+length_of_sections[sec] - 1, - length_of_sections[sec]); - } - - z80_write_block_P((const FLASH unsigned char *) &data[sec_base], /* src */ - address[sec], /* dest */ - length_of_sections[sec]); /* len */ - sec_base += length_of_sections[sec]; - } -} - command_ret_t do_loadf(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc UNUSED, char * const argv[] UNUSED) { if (z80_bus_state() & ZST_RUNNING) @@ -281,23 +254,39 @@ command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, command_ret_t do_go(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) { uint32_t addr; + bool hold = 0; + + /* reset getopt() */ + optind = 0; + + int opt; + while ((opt = getopt(argc, argv, PSTR("h"))) != -1) { + switch (opt) { + case 'h': + hold = 1; + break; + default: /* '?' */ + return CMD_RET_USAGE; + } + } + argc -= optind; /* remaining arguments */ - if (argc < 2) + if (argc != 1) return CMD_RET_USAGE; - addr = eval_arg(argv[1], NULL); + addr = eval_arg(argv[optind], NULL); if (addr >= (1UL<<16)) { - printf_P(PSTR("## Startaddress 0x%05lx too high.\n" + printf_P(PSTR("Invalid startaddress: 0x%05lx\n" " (Out of logical address space (0x00000-0x0ffff))\n"), addr); return CMD_RET_FAILURE; } if (z80_bus_state() & ZST_RUNNING) { - printf_P(PSTR("## CPU already running!\n")); + printf_P(PSTR("CPU already running!\n")); return CMD_RET_FAILURE; } - printf_P(PSTR("## Starting application at 0x%04lx ...\n"), addr); + printf_P(PSTR("Starting application at 0x%04lx ...\n"), addr); if (addr != 0) { uint8_t tmp[3]; @@ -309,13 +298,19 @@ command_ret_t do_go(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, z80_write(2, (addr >> 8)); z80_bus_cmd(Run); + _delay_us(10); z80_bus_cmd(M_Cycle); + _delay_us(10); z80_bus_cmd(M_Cycle); + _delay_us(10); z80_write_block(tmp, 0, 3); - } else + } else { + if (!hold) + z80_bus_cmd(Request); z80_bus_cmd(Run); - - z80_bus_cmd(Release); + } + if (!hold) + z80_bus_cmd(Release); return CMD_RET_SUCCESS; }