summaryrefslogtreecommitdiff
path: root/avr/cmd_boot.c
diff options
context:
space:
mode:
authorLeo C2014-10-26 12:43:57 +0100
committerLeo C2014-10-26 12:43:57 +0100
commit8a7deceacd30529e5c32082b2c719eb055841d0d (patch)
tree19b22d5a0363847ad5e29dd2d8c726191b1b5c82 /avr/cmd_boot.c
parent889202c46ced1be4fc0db3faf63564722eba2865 (diff)
downloadz180-stamp-8a7deceacd30529e5c32082b2c719eb055841d0d.zip
working connect command, new sleep command
Diffstat (limited to 'avr/cmd_boot.c')
-rw-r--r--avr/cmd_boot.c108
1 files changed, 82 insertions, 26 deletions
diff --git a/avr/cmd_boot.c b/avr/cmd_boot.c
index 1f99f2d..2c3a533 100644
--- a/avr/cmd_boot.c
+++ b/avr/cmd_boot.c
@@ -4,13 +4,14 @@
*/
#include "common.h"
#include <stdlib.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
@@ -126,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;
}
@@ -141,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;
}
@@ -174,46 +198,78 @@ 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;
}
-