]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/cmd_boot.c
VT100/ANSI parser
[z180-stamp.git] / avr / cmd_boot.c
index c2f03519d846baa869600c3cbb09885c954c0844..4775b6ea04d376aeaaeb8bc04e0edbd19799eea5 100644 (file)
@@ -4,14 +4,14 @@
  */
 #include "common.h"
 #include <stdlib.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"
+#include "debug.h"
 
 /* ugly hack to get Z180 loadfile into flash memory */
 #define const const FLASH
@@ -34,7 +34,7 @@ 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 */
+               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);
@@ -127,14 +127,21 @@ command_ret_t do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        return CMD_RET_SUCCESS;
 }
 
+static
+void reset_cpu(bus_cmd_t mode)
+{
+       restart_z180_serv();
+       z80_bus_cmd(mode);
+}
+
+
 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"));
 
-       restart_z180_serv();
-       z80_bus_cmd(Reset);
+       reset_cpu(Reset);
        return CMD_RET_SUCCESS;
 }
 
@@ -142,24 +149,40 @@ command_ret_t do_restart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
 {
        (void) cmdtp; (void) flag; (void) argc; (void) argv;
 
-       restart_z180_serv();
-       z80_bus_cmd(Restart);
+       reset_cpu(Restart);
 
        return CMD_RET_SUCCESS;
 }
 
+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, state = 0;
-       
+       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_RESTORESTATE) {
+               ATOMIC_BLOCK(ATOMIC_FORCEON) {
                        pending = (Stat & S_CON_PENDING) != 0;
                        Stat &= ~S_CON_PENDING;
                }
@@ -175,45 +198,77 @@ command_ret_t do_console(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
                                        /* TODO: Timer starten */
                                } else {
                                        z80_memfifo_putc(fifo_conin, ch);
-//                                     serial_putc(ch);
-//                                     if (ch == '\r')
-//                                             serial_putc('\n');
-                               }       
+                               }
                                break;
+                       case 2:
+                               printf_P(PSTR("\n"
+                                 "------------------------------------------------\n"));
                        case 1:
-                               switch (ch) {
-
-                               case 'r':
-//                                     z80_reset_pulse();
-                                       break;
+                               state = 0;
+                               switch (toupper(ch)) {
 
-                               case 'b':
+                               case '?':
+                               case 'H':
+                                       print_con_usage(CONFIG_ESC_CHAR);
+                                       state = 2;
                                        break;
 
-                               case 'e':
+                               case 'R':
+                                       reset_cpu(Restart);
                                        break;
 
-                               case 'q':
+                               case 'X':
                                case 'Q':
+                                       printf_P(PSTR("\n"));
                                        goto quit;
                                        break;
 
+                               case '\\':
+                                       code = 0;
+                                       state = 3;
+                                       break;
+
                                case CONFIG_ESC_CHAR:
-                               default:
                                        z80_memfifo_putc(fifo_conin, ch);
-//                                     serial_putc(ch);
-//                                     if (ch == '\r')
-//                                             serial_putc('\n');
+                                       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;
                                }
-                               state = 0;
                                break;
                        }
                }
-
        }
 quit:
-
        return CMD_RET_SUCCESS;
 }
-       
-