X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/16af58eaba93819b09becadf7caae0df890baed0..aea51b6c4c93c56715f50e64d424e1181c6d0242:/avr/cmd_boot.c diff --git a/avr/cmd_boot.c b/avr/cmd_boot.c index 14fbab3..fb533c7 100644 --- a/avr/cmd_boot.c +++ b/avr/cmd_boot.c @@ -10,15 +10,14 @@ /* * Misc boot support */ -#include "common.h" -#include +#include "cmd_boot.h" #include #include -#include "command.h" #include "cli_readline.h" /* console_buffer[] */ #include "cli.h" /* run_command() */ #include "env.h" +#include "eval_arg.h" #include "con-utils.h" #include "getopt-min.h" #include "z80-if.h" @@ -32,45 +31,11 @@ #undef const - -static void z80_load_mem(int_fast8_t verbosity, - const FLASH unsigned char data[], - const FLASH unsigned long *sections, - const FLASH unsigned long address[], - const FLASH unsigned long length_of_sections[]) +command_ret_t do_loadf(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc UNUSED, char * const argv[] UNUSED) { - uint32_t sec_base = 0; - - if (verbosity > 1) - printf_P(PSTR("Loading Z180 memory... \n")); - - for (unsigned sec = 0; sec < *sections; sec++) { - if (verbosity > 0) { - printf_P(PSTR(" From: 0x%.5lX to: 0x%.5lX (%5li bytes)\n"), - address[sec], - address[sec]+length_of_sections[sec] - 1, - length_of_sections[sec]); - } - - z80_write_block_P((const FLASH unsigned char *) &data[sec_base], /* src */ - address[sec], /* dest */ - length_of_sections[sec]); /* len */ - sec_base += length_of_sections[sec]; - } -} - -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) { - my_puts_P(PSTR("Can't load while CPU is running!\n")); - return CMD_RET_FAILURE; - } - if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { - my_puts_P(PSTR("Bus timeout\n")); - return CMD_RET_FAILURE; - } + if (z80_bus_state() & ZST_RUNNING) + cmd_error(CMD_RET_FAILURE, ERUNNING, NULL); + z80_bus_request_or_exit(); z80_load_mem(2, hdrom, &hdrom_sections, hdrom_address, @@ -112,7 +77,7 @@ void print_vars(char *title) * -v verbose */ -command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_bootcf(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) { struct { uint8_t jr[2]; @@ -136,15 +101,10 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ uint8_t default_stages; uint32_t val; - (void) cmdtp; (void) flag; - /* get default values */ memcpy_P(&boot_param, cfboot, sizeof boot_param); default_stages = boot_param.stages; - /* reset getopt() */ - optind = 0; - int opt; while ((opt = getopt(argc, argv, PSTR("vna:s:c:t:i:"))) != -1) { switch (opt) { @@ -156,7 +116,7 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ boot_param.stages--; break; case 'a': - val = strtoul(optarg, NULL, 16); + val = eval_arg(optarg, NULL); if (val < 0x100 || val > 0xFE00) { printf_P(PSTR("Address out of range: 0x%.4lX\n"), val); return CMD_RET_FAILURE; @@ -164,7 +124,7 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ boot_param.loadaddr = val; break; case 's': - val = strtoul(optarg, NULL, 16); + val = eval_arg(optarg, NULL); if (val > 255) { printf_P(PSTR("Start sector out of range: 0x%lX\n"), val); return CMD_RET_FAILURE; @@ -172,7 +132,7 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ boot_param.sec_start = val; break; case 'c': - val = strtoul(optarg, NULL, 16); + val = eval_arg(optarg, NULL); if (val > 127) { printf_P(PSTR("Sector count out of range: 0x%lX\n"), val); return CMD_RET_FAILURE; @@ -180,7 +140,7 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ boot_param.sec_cnt = val; break; case 't': - val = strtoul(optarg, NULL, 10); + val = eval_arg(optarg, NULL); if (val < 0x1 || val > 0xFFFF) { printf_P(PSTR("Timeout value out of range: 0x%lX\n"), val); return CMD_RET_FAILURE; @@ -188,7 +148,7 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ boot_param.timeout = val; break; case 'i': - val = strtoul(optarg, NULL, 16); + val = eval_arg(optarg, NULL); if (val < 0x01 || val > 0xFF) { printf_P(PSTR("Partition id out of range: 0x%lX\n"), val); return CMD_RET_FAILURE; @@ -212,16 +172,9 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ return CMD_RET_FAILURE; } - - - if (z80_bus_state() & ZST_RUNNING) { - my_puts_P(PSTR("CPU is allready running!\n")); - return CMD_RET_FAILURE; - } - if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { - my_puts_P(PSTR("Bus timeout\n")); - return CMD_RET_FAILURE; - } + if (z80_bus_state() & ZST_RUNNING) + cmd_error(CMD_RET_FAILURE, ERUNNING, NULL); + z80_bus_request_or_exit(); z80_load_mem(verbosity, cfboot, &cfboot_sections, cfboot_address, @@ -274,19 +227,17 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ return CMD_RET_SUCCESS; } -command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) { uint16_t count=1; - (void) cmdtp; (void) flag; - if (!(z80_bus_state() & ZST_RUNNING)) { printf_P(PSTR("## CPU is not running!\n")); return CMD_RET_FAILURE; } if (argc > 1) - count = (uint16_t) strtoul(argv[1], NULL, 16); + count = (uint16_t) eval_arg(argv[1], NULL); z80_bus_cmd(Request); while (count--) @@ -296,46 +247,59 @@ command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp, int flag, int argc, char * const } -command_ret_t do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_go(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) { uint32_t addr; + bool hold = 0; - (void) cmdtp; (void) flag; + int opt; + while ((opt = getopt(argc, argv, PSTR("h"))) != -1) { + switch (opt) { + case 'h': + hold = 1; + break; + default: /* '?' */ + return CMD_RET_USAGE; + } + } + argc -= optind; /* remaining arguments */ - if (argc < 2) + if (argc != 1) return CMD_RET_USAGE; - addr = strtoul(argv[1], NULL, 16); + addr = eval_arg(argv[optind], NULL); if (addr >= (1UL<<16)) { - printf_P(PSTR("## Startaddress 0x%05lx too high.\n" + printf_P(PSTR("Invalid startaddress: 0x%05lx\n" " (Out of logical address space (0x00000-0x0ffff))\n"), addr); return CMD_RET_FAILURE; } if (z80_bus_state() & ZST_RUNNING) { - printf_P(PSTR("## CPU allready running!\n")); - return CMD_RET_FAILURE; + cmd_error(CMD_RET_FAILURE, ERUNNING, NULL); } - printf_P(PSTR("## Starting application at 0x%04lx ...\n"), addr); + printf_P(PSTR("Starting application at 0x%04lx ...\n"), addr); if (addr != 0) { - uint8_t tmp[3]; +// uint8_t tmp[3]; - z80_bus_cmd(Request); - z80_read_block (tmp, 0, 3); + z80_bus_request_or_exit(); +// z80_read_block (tmp, 0, 3); z80_write(0, 0xc3); z80_write(1, addr); z80_write(2, (addr >> 8)); + z80_bus_cmd(Release); + _delay_ms(100); z80_bus_cmd(Run); - z80_bus_cmd(M_Cycle); - z80_bus_cmd(M_Cycle); - z80_write_block(tmp, 0, 3); - } else +// z80_write_block(tmp, 0, 3); + } else { + if (!hold) + z80_bus_cmd(Request); z80_bus_cmd(Run); - - z80_bus_cmd(Release); + } + if (!hold) + z80_bus_cmd(Release); return CMD_RET_SUCCESS; } @@ -348,20 +312,16 @@ void reset_cpu(bus_cmd_t mode) } -command_ret_t do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_reset(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc UNUSED, char * const argv[] UNUSED) { - (void) cmdtp; (void) flag; (void) argc; (void) argv; - printf_P(PSTR("CPU now in reset state.\n")); reset_cpu(Reset); return CMD_RET_SUCCESS; } -command_ret_t do_restart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_restart(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc UNUSED, char * const argv[] UNUSED) { - (void) cmdtp; (void) flag; (void) argc; (void) argv; - reset_cpu(Restart); return CMD_RET_SUCCESS; @@ -383,17 +343,14 @@ void print_con_usage(char esc) ), esc + 0x40); } -command_ret_t do_console(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_console(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc UNUSED, char * const argv[] UNUSED) { int ch; uint8_t pending; -// uint8_t help_prompt = 0; uint8_t code = 0; uint8_t state = 0; char esc_char = (char) getenv_ulong(PSTR(ENV_ESC_CHAR), 16, CONFIG_ESC_CHAR); - (void) cmdtp; (void) flag; (void) argc; (void) argv; - printf_P(PSTR("Connecting to CPU. Escape character is '^%c'.\n"), esc_char + 0x40); @@ -420,7 +377,7 @@ command_ret_t do_console(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv } break; case 2: - printf_P(PSTR("\n" + my_puts_P(PSTR("\n" "------------------------------------------------\n")); case 1: state = 0; @@ -438,7 +395,7 @@ command_ret_t do_console(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv case 'X': case 'Q': - printf_P(PSTR("\n")); + putchar('\n'); goto quit; break;