]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/cmd_boot.c
Remove memory test and bank manager.
[z180-stamp.git] / avr / cmd_boot.c
index 1699a5c7e9c51b0b233f2277e44eec2f68e55a59..301f4f583d4e02a8015b481edbed1d02064058b6 100644 (file)
@@ -1,14 +1,25 @@
+/*
+ * (C) Copyright 2014 Leo C. <erbl259-lmu@yahoo.de>
+ *
+ * (C) Copyright 2000-2003
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
 
 /*
  * Misc boot support
  */
 #include "common.h"
 #include <stdlib.h>
-#include <util/delay.h>
-#include <avr/pgmspace.h>
+#include <ctype.h>
+#include <util/atomic.h>
 
 #include "command.h"
+#include "con-utils.h"
 #include "z80-if.h"
+#include "z180-serv.h"
+#include "debug.h"
 
 /* ugly hack to get Z180 loadfile into flash memory */
 #define const const FLASH
@@ -31,8 +42,8 @@ static void z80_load_mem(void)
                                hdrom_length_of_sections[sec]);
 
                z80_bus_cmd(Request);
-               z80_write_block((const FLASH unsigned char *) &hdrom[sec_base],  /* src */
-                               hdrom_address[sec],                  /* dest */
+               z80_write_block_P((const FLASH unsigned char *) &hdrom[sec_base],  /* src */
+                               hdrom_address[sec],                  /* dest */
                                hdrom_length_of_sections[sec]);      /* len */
                z80_bus_cmd(Release);
                sec_base+=hdrom_length_of_sections[sec];
@@ -40,30 +51,30 @@ static void z80_load_mem(void)
        }
 }
 
-int do_loadf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_loadf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        (void) cmdtp; (void) flag; (void) argc; (void) argv;
 
-       if (z80_bus_state() & ZST_RUNNING) {    
+       if (z80_bus_state() & ZST_RUNNING) {
                printf_P(PSTR("## Can't load while CPU is running!\n"));
-               return 1;       
+               return CMD_RET_FAILURE;
        }
 
        z80_load_mem();
-       
-       return 0;
+
+       return CMD_RET_SUCCESS;
 }
 
 
-int do_busreq_pulse(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        uint16_t count=1;
 
        (void) cmdtp; (void) flag;
 
-       if (!(z80_bus_state() & ZST_RUNNING)) { 
+       if (!(z80_bus_state() & ZST_RUNNING)) {
                printf_P(PSTR("## CPU is not running!\n"));
-               return 1;
+               return CMD_RET_FAILURE;
        }
 
        if (argc > 1)
@@ -73,16 +84,16 @@ int do_busreq_pulse(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        while (count--)
                z80_bus_cmd(M_Cycle);
 
-       return 0;
+       return CMD_RET_SUCCESS;
 }
 
 
-int do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t 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);
@@ -90,12 +101,12 @@ int do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                printf_P(PSTR("## Startaddress 0x%05lx too high.\n"
                        "   (Out of logical address space (0x00000-0x0ffff))\n"),
                        addr);
-               return 1;
-       } 
+               return CMD_RET_FAILURE;
+       }
 
-       if (z80_bus_state() & ZST_RUNNING) {    
+       if (z80_bus_state() & ZST_RUNNING) {
                printf_P(PSTR("## CPU allready running!\n"));
-               return 1;
+               return CMD_RET_FAILURE;
        }
 
        printf_P(PSTR("## Starting application at 0x%04lx ...\n"), addr);
@@ -103,7 +114,7 @@ int do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        if (addr != 0) {
                uint8_t tmp[3];
                uint_fast8_t i;
-               
+
                z80_bus_cmd(Request);
                for (i = 0; i < 3; i++)
                        tmp[i] = z80_read(i);
@@ -118,28 +129,154 @@ int do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        z80_write(i, tmp[i]);
        } else
                z80_bus_cmd(Run);
-               
+
        z80_bus_cmd(Release);
 
-       return 0;
+       return CMD_RET_SUCCESS;
+}
+
+static
+void reset_cpu(bus_cmd_t mode)
+{
+       restart_z180_serv();
+       z80_bus_cmd(mode);
 }
 
-int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+
+command_ret_t 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_bus_cmd(Reset);
-       return 0;
+       reset_cpu(Reset);
+       return CMD_RET_SUCCESS;
 }
 
-int do_restart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+command_ret_t do_restart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        (void) cmdtp; (void) flag; (void) argc; (void) argv;
 
-       z80_bus_cmd(Restart);
+       reset_cpu(Restart);
+
+       return CMD_RET_SUCCESS;
+}
 
-       return 0;
+static
+void print_con_usage(char esc)
+{      printf_P(PSTR("\n"
+               "------------------------------------------------\n"
+               " ?,H - This Help\n"
+               " R   - Reset (Restart) CPU\n"
+               " Q,X - Return to command line\n"
+               " \\  - code input:\n"
+               "      \\nnn   3 decimal digits character code\n"
+               "      \\Xhh   2 hexadecimal digits character code\n"
+               " ^%c - (Escape char) Type again to send itself\n"
+               "key>"
+       ), esc + 0x40);
 }
 
+command_ret_t do_console(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       int ch;
+       uint8_t pending;
+//     uint8_t help_prompt = 0;
+       uint8_t code = 0;
+       uint8_t state = 0;
+
+       (void) cmdtp; (void) flag; (void) argc; (void) argv;
+
+
+       while (1) {
+
+               ATOMIC_BLOCK(ATOMIC_FORCEON) {
+                       pending = (Stat & S_CON_PENDING) != 0;
+                       Stat &= ~S_CON_PENDING;
+               }
+               if (pending)
+                       while ((ch = z80_memfifo_getc(fifo_conout)) >= 0)
+                               putchar(ch);
+
+               if ((ch = my_getchar(0)) >= 0) {
+                       switch (state) {
+                       case 0:
+                               if (ch == CONFIG_ESC_CHAR) {
+                                       state = 1;
+                                       /* TODO: Timer starten */
+                               } else {
+                                       z80_memfifo_putc(fifo_conin, ch);
+                               }
+                               break;
+                       case 2:
+                               printf_P(PSTR("\n"
+                                 "------------------------------------------------\n"));
+                       case 1:
+                               state = 0;
+                               switch (toupper(ch)) {
+
+                               case '?':
+                               case 'H':
+                                       print_con_usage(CONFIG_ESC_CHAR);
+                                       state = 2;
+                                       break;
+
+                               case 'R':
+                                       reset_cpu(Restart);
+                                       break;
+
+                               case 'X':
+                               case 'Q':
+                                       printf_P(PSTR("\n"));
+                                       goto quit;
+                                       break;
+
+                               case '\\':
+                                       code = 0;
+                                       state = 3;
+                                       break;
+
+                               case CONFIG_ESC_CHAR:
+                                       z80_memfifo_putc(fifo_conin, ch);
+                                       break;
+                               default:
+                                       break;
+                               }
+                               break;
+                       case 3:
+                               if (toupper(ch) == 'X') {
+                                       state = 6;
+                                       break;
+                               }
+                               /* fall thru */
+                       case 4:
+                       case 5:
+                               if (isdigit(ch)) {
+                                       code = code * 10 + ch - '0';
+                                       state++;
+                               }
+                               if (state > 5) {
+                                       z80_memfifo_putc(fifo_conin, code);
+                                       state = 0;
+                               }
+                               break;
+                       case 6:
+                       case 7:
+                               if (isxdigit(ch)) {
+                                       ch = toupper(ch);
+                                       if (ch >= 'A')
+                                               ch -= 'A' - 10;
+                                       code = code * 16 + ch - '0';
+                                       state++;
+                               }
+                               if (state > 7) {
+                                       z80_memfifo_putc(fifo_conin, code);
+                                       state = 0;
+                               }
+                               break;
+                       }
+               }
+       }
+quit:
+       return CMD_RET_SUCCESS;
+}