/*
* Misc boot support
*/
-#include "common.h"
+#include "cmd_boot.h"
#include <ctype.h>
#include <util/atomic.h>
-#include "command.h"
#include "cli_readline.h" /* console_buffer[] */
#include "cli.h" /* run_command() */
#include "env.h"
#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[])
-{
- 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, uint_fast8_t flag, int argc, char * const argv[])
+command_ret_t do_loadf(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;
-
- 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,
* -v verbose
*/
-command_ret_t do_bootcf(cmd_tbl_t *cmdtp, uint_fast8_t 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];
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) {
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,
return CMD_RET_SUCCESS;
}
-command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp, uint_fast8_t 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;
}
-command_ret_t do_go(cmd_tbl_t *cmdtp, uint_fast8_t 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 = eval_arg(argv[1], NULL);
+ 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"));
+ printf_P(PSTR("CPU already running!\n"));
return CMD_RET_FAILURE;
}
- 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];
z80_write(2, (addr >> 8));
z80_bus_cmd(Run);
+ _delay_us(10);
z80_bus_cmd(M_Cycle);
+ _delay_us(10);
z80_bus_cmd(M_Cycle);
+ _delay_us(10);
z80_write_block(tmp, 0, 3);
- } else
+ } 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;
}
}
-command_ret_t do_reset(cmd_tbl_t *cmdtp, uint_fast8_t 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, uint_fast8_t 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;
), esc + 0x40);
}
-command_ret_t do_console(cmd_tbl_t *cmdtp, uint_fast8_t 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);
}
break;
case 2:
- printf_P(PSTR("\n"
+ my_puts_P(PSTR("\n"
"------------------------------------------------\n"));
case 1:
state = 0;
case 'X':
case 'Q':
- printf_P(PSTR("\n"));
+ putchar('\n');
goto quit;
break;