]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/cmd_boot.c
Command 'go <startaddr>' works now
[z180-stamp.git] / avr / cmd_boot.c
index 4fb9c2ab53affdc84e199b83e0c79708005fd0ca..8c1779940d0de84751136a3ed9ae61eed90d6606 100644 (file)
@@ -4,6 +4,7 @@
  */
 #include "common.h"
 #include <stdlib.h>
+#include <util/delay.h>
 #include <avr/pgmspace.h>
 
 #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;
 }