]> cloudbase.mooo.com Git - z180-stamp.git/blame - avr/cmd_boot.c
include cleanup
[z180-stamp.git] / avr / cmd_boot.c
CommitLineData
534e1dfc
L
1
2/*
3 * Misc boot support
4 */
5#include "common.h"
6#include <stdlib.h>
89adce76 7#include <util/atomic.h>
534e1dfc
L
8
9#include "command.h"
89adce76 10#include "con-utils.h"
534e1dfc 11#include "z80-if.h"
89adce76 12#include "z180-serv.h"
8f23e84c 13//#include "debug.h"
534e1dfc
L
14
15/* ugly hack to get Z180 loadfile into flash memory */
16#define const const FLASH
17#include "../z180/hdrom.h"
18#undef const
19
20
21
22static void z80_load_mem(void)
23{
24 unsigned sec = 0;
25 uint32_t sec_base = hdrom_start;
26
27 printf_P(PSTR("Loading Z180 memory... \n"));
28
29 while (sec < hdrom_sections) {
30 printf_P(PSTR(" From: 0x%.5lX to: 0x%.5lX (%5li bytes)\n"),
31 hdrom_address[sec],
32 hdrom_address[sec]+hdrom_length_of_sections[sec] - 1,
33 hdrom_length_of_sections[sec]);
34
62f624d3 35 z80_bus_cmd(Request);
534e1dfc 36 z80_write_block((const FLASH unsigned char *) &hdrom[sec_base], /* src */
41d36f28 37 hdrom_address[sec], /* dest */
534e1dfc 38 hdrom_length_of_sections[sec]); /* len */
62f624d3 39 z80_bus_cmd(Release);
534e1dfc
L
40 sec_base+=hdrom_length_of_sections[sec];
41 sec++;
42 }
43}
44
d0581f88 45command_ret_t do_loadf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
534e1dfc
L
46{
47 (void) cmdtp; (void) flag; (void) argc; (void) argv;
48
6035a17b 49 if (z80_bus_state() & ZST_RUNNING) {
534e1dfc 50 printf_P(PSTR("## Can't load while CPU is running!\n"));
6035a17b 51 return CMD_RET_FAILURE;
534e1dfc
L
52 }
53
54 z80_load_mem();
6035a17b 55
d0581f88 56 return CMD_RET_SUCCESS;
534e1dfc
L
57}
58
59
d0581f88 60command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
534e1dfc 61{
f338df2a 62 uint16_t count=1;
534e1dfc 63
f338df2a 64 (void) cmdtp; (void) flag;
534e1dfc 65
6035a17b 66 if (!(z80_bus_state() & ZST_RUNNING)) {
f338df2a 67 printf_P(PSTR("## CPU is not running!\n"));
d0581f88 68 return CMD_RET_FAILURE;
534e1dfc
L
69 }
70
f338df2a
L
71 if (argc > 1)
72 count = (uint16_t) strtoul(argv[2], NULL, 16);
73
62f624d3 74 z80_bus_cmd(Request);
f338df2a 75 while (count--)
62f624d3 76 z80_bus_cmd(M_Cycle);
534e1dfc 77
d0581f88 78 return CMD_RET_SUCCESS;
f338df2a
L
79}
80
81
d0581f88 82command_ret_t do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
f338df2a
L
83{
84 uint32_t addr;
85
86 (void) cmdtp; (void) flag;
6035a17b 87
f338df2a
L
88 if (argc < 2)
89 return CMD_RET_USAGE;
90 addr = strtoul(argv[1], NULL, 16);
91 if (addr >= (1UL<<16)) {
534e1dfc
L
92 printf_P(PSTR("## Startaddress 0x%05lx too high.\n"
93 " (Out of logical address space (0x00000-0x0ffff))\n"),
94 addr);
d0581f88 95 return CMD_RET_FAILURE;
6035a17b 96 }
f338df2a 97
6035a17b 98 if (z80_bus_state() & ZST_RUNNING) {
f338df2a 99 printf_P(PSTR("## CPU allready running!\n"));
d0581f88 100 return CMD_RET_FAILURE;
534e1dfc
L
101 }
102
f338df2a
L
103 printf_P(PSTR("## Starting application at 0x%04lx ...\n"), addr);
104
105 if (addr != 0) {
106 uint8_t tmp[3];
107 uint_fast8_t i;
6035a17b 108
62f624d3 109 z80_bus_cmd(Request);
f338df2a
L
110 for (i = 0; i < 3; i++)
111 tmp[i] = z80_read(i);
112 z80_write(0, 0xc3);
113 z80_write(1, addr);
114 z80_write(2, (addr >> 8));
115
62f624d3
L
116 z80_bus_cmd(Run);
117 z80_bus_cmd(M_Cycle);
118 z80_bus_cmd(M_Cycle);
f338df2a
L
119 for (i = 0; i < 3; i++)
120 z80_write(i, tmp[i]);
121 } else
62f624d3 122 z80_bus_cmd(Run);
6035a17b 123
62f624d3 124 z80_bus_cmd(Release);
f338df2a 125
d0581f88 126 return CMD_RET_SUCCESS;
534e1dfc
L
127}
128
d0581f88 129command_ret_t do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
534e1dfc
L
130{
131 (void) cmdtp; (void) flag; (void) argc; (void) argv;
132
133 printf_P(PSTR("## CPU now in reset state.\n"));
534e1dfc 134
89adce76 135 restart_z180_serv();
62f624d3 136 z80_bus_cmd(Reset);
d0581f88 137 return CMD_RET_SUCCESS;
534e1dfc
L
138}
139
d0581f88 140command_ret_t do_restart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
534e1dfc
L
141{
142 (void) cmdtp; (void) flag; (void) argc; (void) argv;
143
89adce76 144 restart_z180_serv();
62f624d3 145 z80_bus_cmd(Restart);
534e1dfc 146
d0581f88 147 return CMD_RET_SUCCESS;
534e1dfc
L
148}
149
89adce76
L
150
151command_ret_t do_console(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
152{
153 int ch;
154 uint8_t pending, state = 0;
155
156 (void) cmdtp; (void) flag; (void) argc; (void) argv;
157
158
159 while (1) {
160
161 ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
162 pending = (Stat & S_CON_PENDING) != 0;
163 Stat &= ~S_CON_PENDING;
164 }
165 if (pending)
166 while ((ch = z80_memfifo_getc(fifo_conout)) >= 0)
167 putchar(ch);
168
169 if ((ch = my_getchar(0)) >= 0) {
170 switch (state) {
171 case 0:
172 if (ch == CONFIG_ESC_CHAR) {
173 state = 1;
174 /* TODO: Timer starten */
175 } else {
176 z80_memfifo_putc(fifo_conin, ch);
177// serial_putc(ch);
178// if (ch == '\r')
179// serial_putc('\n');
180 }
181 break;
182 case 1:
183 switch (ch) {
184
185 case 'r':
186// z80_reset_pulse();
187 break;
188
189 case 'b':
190 break;
191
192 case 'e':
193 break;
194
195 case 'q':
196 case 'Q':
889202c4 197 printf_P(PSTR("\n"));
89adce76
L
198 goto quit;
199 break;
200
201 case CONFIG_ESC_CHAR:
202 default:
203 z80_memfifo_putc(fifo_conin, ch);
204// serial_putc(ch);
205// if (ch == '\r')
206// serial_putc('\n');
207 }
208 state = 0;
209 break;
210 }
211 }
212
213 }
214quit:
215
216 return CMD_RET_SUCCESS;
217}
218
219