]>
cloudbase.mooo.com Git - z180-stamp.git/blob - avr/cmd_boot.c
8 #include <util/atomic.h>
11 #include "con-utils.h"
13 #include "z180-serv.h"
16 /* ugly hack to get Z180 loadfile into flash memory */
17 #define const const FLASH
18 #include "../z180/hdrom.h"
23 static void z80_load_mem(void)
26 uint32_t sec_base
= hdrom_start
;
28 printf_P(PSTR("Loading Z180 memory... \n"));
30 while (sec
< hdrom_sections
) {
31 printf_P(PSTR(" From: 0x%.5lX to: 0x%.5lX (%5li bytes)\n"),
33 hdrom_address
[sec
]+hdrom_length_of_sections
[sec
] - 1,
34 hdrom_length_of_sections
[sec
]);
37 z80_write_block((const FLASH
unsigned char *) &hdrom
[sec_base
], /* src */
38 hdrom_address
[sec
], /* dest */
39 hdrom_length_of_sections
[sec
]); /* len */
41 sec_base
+=hdrom_length_of_sections
[sec
];
46 command_ret_t
do_loadf(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
48 (void) cmdtp
; (void) flag
; (void) argc
; (void) argv
;
50 if (z80_bus_state() & ZST_RUNNING
) {
51 printf_P(PSTR("## Can't load while CPU is running!\n"));
52 return CMD_RET_FAILURE
;
57 return CMD_RET_SUCCESS
;
61 command_ret_t
do_busreq_pulse(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
65 (void) cmdtp
; (void) flag
;
67 if (!(z80_bus_state() & ZST_RUNNING
)) {
68 printf_P(PSTR("## CPU is not running!\n"));
69 return CMD_RET_FAILURE
;
73 count
= (uint16_t) strtoul(argv
[2], NULL
, 16);
79 return CMD_RET_SUCCESS
;
83 command_ret_t
do_go(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
87 (void) cmdtp
; (void) flag
;
91 addr
= strtoul(argv
[1], NULL
, 16);
92 if (addr
>= (1UL<<16)) {
93 printf_P(PSTR("## Startaddress 0x%05lx too high.\n"
94 " (Out of logical address space (0x00000-0x0ffff))\n"),
96 return CMD_RET_FAILURE
;
99 if (z80_bus_state() & ZST_RUNNING
) {
100 printf_P(PSTR("## CPU allready running!\n"));
101 return CMD_RET_FAILURE
;
104 printf_P(PSTR("## Starting application at 0x%04lx ...\n"), addr
);
110 z80_bus_cmd(Request
);
111 for (i
= 0; i
< 3; i
++)
112 tmp
[i
] = z80_read(i
);
115 z80_write(2, (addr
>> 8));
118 z80_bus_cmd(M_Cycle
);
119 z80_bus_cmd(M_Cycle
);
120 for (i
= 0; i
< 3; i
++)
121 z80_write(i
, tmp
[i
]);
125 z80_bus_cmd(Release
);
127 return CMD_RET_SUCCESS
;
131 void reset_cpu(bus_cmd_t mode
)
138 command_ret_t
do_reset(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
140 (void) cmdtp
; (void) flag
; (void) argc
; (void) argv
;
142 printf_P(PSTR("## CPU now in reset state.\n"));
145 return CMD_RET_SUCCESS
;
148 command_ret_t
do_restart(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
150 (void) cmdtp
; (void) flag
; (void) argc
; (void) argv
;
154 return CMD_RET_SUCCESS
;
158 void print_con_usage(char esc
)
160 "------------------------------------------------\n"
162 " R - Reset (Restart) CPU\n"
163 " Q,X - Return to command line\n"
164 " \\ - code input:\n"
165 " \\nnn 3 decimal digits character code\n"
166 " \\Xhh 2 hexadecimal digits character code\n"
167 " ^%c - (Escape char) Type again to send itself\n"
172 command_ret_t
do_console(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
176 // uint8_t help_prompt = 0;
180 (void) cmdtp
; (void) flag
; (void) argc
; (void) argv
;
185 ATOMIC_BLOCK(ATOMIC_FORCEON
) {
186 pending
= (Stat
& S_CON_PENDING
) != 0;
187 Stat
&= ~S_CON_PENDING
;
190 while ((ch
= z80_memfifo_getc(fifo_conout
)) >= 0)
193 if ((ch
= my_getchar(0)) >= 0) {
196 if (ch
== CONFIG_ESC_CHAR
) {
198 /* TODO: Timer starten */
200 z80_memfifo_putc(fifo_conin
, ch
);
205 "------------------------------------------------\n"));
208 switch (toupper(ch
)) {
212 print_con_usage(CONFIG_ESC_CHAR
);
222 printf_P(PSTR("\n"));
231 case CONFIG_ESC_CHAR
:
232 z80_memfifo_putc(fifo_conin
, ch
);
239 if (toupper(ch
) == 'X') {
247 code
= code
* 10 + ch
- '0';
251 z80_memfifo_putc(fifo_conin
, code
);
261 code
= code
* 16 + ch
- '0';
265 z80_memfifo_putc(fifo_conin
, code
);
273 return CMD_RET_SUCCESS
;