/* * Misc boot support */ #include "common.h" #include #include #include #include "command.h" #include "z80-if.h" /* ugly hack to get Z180 loadfile into flash memory */ #define const const FLASH #include "../z180/hdrom.h" #undef const static void z80_load_mem(void) { unsigned sec = 0; uint32_t sec_base = hdrom_start; printf_P(PSTR("Loading Z180 memory... \n")); while (sec < hdrom_sections) { printf_P(PSTR(" From: 0x%.5lX to: 0x%.5lX (%5li bytes)\n"), hdrom_address[sec], hdrom_address[sec]+hdrom_length_of_sections[sec] - 1, hdrom_length_of_sections[sec]); z80_bus_cmd(Request); z80_write_block((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]; 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) { printf_P(PSTR("## Can't load while CPU is running!\n")); return CMD_RET_FAILURE; } z80_load_mem(); return CMD_RET_SUCCESS; } 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)) { printf_P(PSTR("## CPU is not running!\n")); return CMD_RET_FAILURE; } if (argc > 1) count = (uint16_t) strtoul(argv[2], NULL, 16); z80_bus_cmd(Request); while (count--) z80_bus_cmd(M_Cycle); return CMD_RET_SUCCESS; } 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); if (addr >= (1UL<<16)) { printf_P(PSTR("## Startaddress 0x%05lx too high.\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; } printf_P(PSTR("## Starting application at 0x%04lx ...\n"), addr); 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); z80_write(0, 0xc3); z80_write(1, addr); z80_write(2, (addr >> 8)); z80_bus_cmd(Run); z80_bus_cmd(M_Cycle); z80_bus_cmd(M_Cycle); for (i = 0; i < 3; i++) z80_write(i, tmp[i]); } else z80_bus_cmd(Run); z80_bus_cmd(Release); return CMD_RET_SUCCESS; } 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 CMD_RET_SUCCESS; } 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); return CMD_RET_SUCCESS; }