*/
#include "common.h"
#include <stdlib.h>
-#include <avr/pgmspace.h>
+#include <util/atomic.h>
#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
hdrom_address[sec]+hdrom_length_of_sections[sec] - 1,
hdrom_length_of_sections[sec]);
- z80_request_bus();
+ z80_bus_cmd(Request);
z80_write_block((const FLASH unsigned char *) &hdrom[sec_base], /* src */
- hdrom_address[sec], /* dest */
+ hdrom_address[sec], /* dest */
hdrom_length_of_sections[sec]); /* len */
- z80_release_bus();
+ z80_bus_cmd(Release);
sec_base+=hdrom_length_of_sections[sec];
sec++;
}
}
-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_runstate() != 0) {
+ 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_go(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[])
{
- uint32_t addr;
+ uint16_t count=1;
- (void) cmdtp; (void) flag; (void) argc;
+ (void) cmdtp; (void) flag;
- if (z80_runstate() != 0) {
- printf_P(PSTR("## CPU allready running!\n"));
- return 1;
+ if (!(z80_bus_state() & ZST_RUNNING)) {
+ printf_P(PSTR("## CPU is not running!\n"));
+ return CMD_RET_FAILURE;
}
- addr = strtoul(argv[1], NULL, 16);
+ 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;
+}
+
- if (addr > (1UL<<16) - 1) {
+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 1;
- } else if (addr != 0) {
- printf_P(PSTR("## Starting application at "
- "address != 0x0000 not implemented yet.\n"));
- return 1;
- } else {
- printf_P(PSTR("## Starting application at 0x%05lX ...\n"), addr);
- z80_release_bus();
- z80_reset(HIGH);
+ return CMD_RET_FAILURE;
+ }
+
+ if (z80_bus_state() & ZST_RUNNING) {
+ printf_P(PSTR("## CPU allready running!\n"));
+ return CMD_RET_FAILURE;
}
- return 0;
+ 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;
}
-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_reset(LOW);
- return 0;
+ restart_z180_serv();
+ z80_bus_cmd(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_reset_pulse();
+ restart_z180_serv();
+ z80_bus_cmd(Restart);
- return 0;
+ return CMD_RET_SUCCESS;
}
+
+command_ret_t do_console(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+ int ch;
+ uint8_t pending, state = 0;
+
+ (void) cmdtp; (void) flag; (void) argc; (void) argv;
+
+
+ while (1) {
+
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+ 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);
+// serial_putc(ch);
+// if (ch == '\r')
+// serial_putc('\n');
+ }
+ break;
+ case 1:
+ switch (ch) {
+
+ case 'r':
+// z80_reset_pulse();
+ break;
+
+ case 'b':
+ break;
+
+ case 'e':
+ break;
+
+ case 'q':
+ case 'Q':
+ printf_P(PSTR("\n"));
+ goto quit;
+ break;
+
+ case CONFIG_ESC_CHAR:
+ default:
+ z80_memfifo_putc(fifo_conin, ch);
+// serial_putc(ch);
+// if (ch == '\r')
+// serial_putc('\n');
+ }
+ state = 0;
+ break;
+ }
+ }
+
+ }
+quit:
+
+ return CMD_RET_SUCCESS;
+}
+
+