X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/62f624d3e4c6333563d6bf3019bcdcb3dc2836ac..fecee2418b6aea15008ed6d3a856d202d59a5cdb:/avr/cmd_boot.c diff --git a/avr/cmd_boot.c b/avr/cmd_boot.c index 1699a5c..301f4f5 100644 --- a/avr/cmd_boot.c +++ b/avr/cmd_boot.c @@ -1,14 +1,25 @@ +/* + * (C) Copyright 2014 Leo C. + * + * (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 -#include -#include +#include +#include #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; +}