]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/cmd_boot.c
command go: new option -h
[z180-stamp.git] / avr / cmd_boot.c
index 600bad3fffcf20fa144c80ca61e7624ea2c3617a..e26a8b1b3340226aa0730bd871a9a653a49b575a 100644 (file)
 #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;
 }