]>
cloudbase.mooo.com Git - z180-stamp.git/blob - avr/cmd_boot.c
1f99f2d65c7e8dcbef0bb76ff7d65c802e88c980
7 #include <util/atomic.h>
10 #include "con-utils.h"
12 #include "z180-serv.h"
15 /* ugly hack to get Z180 loadfile into flash memory */
16 #define const const FLASH
17 #include "../z180/hdrom.h"
22 static void z80_load_mem(void)
25 uint32_t sec_base
= hdrom_start
;
27 printf_P(PSTR("Loading Z180 memory... \n"));
29 while (sec
< hdrom_sections
) {
30 printf_P(PSTR(" From: 0x%.5lX to: 0x%.5lX (%5li bytes)\n"),
32 hdrom_address
[sec
]+hdrom_length_of_sections
[sec
] - 1,
33 hdrom_length_of_sections
[sec
]);
36 z80_write_block((const FLASH
unsigned char *) &hdrom
[sec_base
], /* src */
37 hdrom_address
[sec
], /* dest */
38 hdrom_length_of_sections
[sec
]); /* len */
40 sec_base
+=hdrom_length_of_sections
[sec
];
45 command_ret_t
do_loadf(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
47 (void) cmdtp
; (void) flag
; (void) argc
; (void) argv
;
49 if (z80_bus_state() & ZST_RUNNING
) {
50 printf_P(PSTR("## Can't load while CPU is running!\n"));
51 return CMD_RET_FAILURE
;
56 return CMD_RET_SUCCESS
;
60 command_ret_t
do_busreq_pulse(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
64 (void) cmdtp
; (void) flag
;
66 if (!(z80_bus_state() & ZST_RUNNING
)) {
67 printf_P(PSTR("## CPU is not running!\n"));
68 return CMD_RET_FAILURE
;
72 count
= (uint16_t) strtoul(argv
[2], NULL
, 16);
78 return CMD_RET_SUCCESS
;
82 command_ret_t
do_go(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
86 (void) cmdtp
; (void) flag
;
90 addr
= strtoul(argv
[1], NULL
, 16);
91 if (addr
>= (1UL<<16)) {
92 printf_P(PSTR("## Startaddress 0x%05lx too high.\n"
93 " (Out of logical address space (0x00000-0x0ffff))\n"),
95 return CMD_RET_FAILURE
;
98 if (z80_bus_state() & ZST_RUNNING
) {
99 printf_P(PSTR("## CPU allready running!\n"));
100 return CMD_RET_FAILURE
;
103 printf_P(PSTR("## Starting application at 0x%04lx ...\n"), addr
);
109 z80_bus_cmd(Request
);
110 for (i
= 0; i
< 3; i
++)
111 tmp
[i
] = z80_read(i
);
114 z80_write(2, (addr
>> 8));
117 z80_bus_cmd(M_Cycle
);
118 z80_bus_cmd(M_Cycle
);
119 for (i
= 0; i
< 3; i
++)
120 z80_write(i
, tmp
[i
]);
124 z80_bus_cmd(Release
);
126 return CMD_RET_SUCCESS
;
129 command_ret_t
do_reset(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
131 (void) cmdtp
; (void) flag
; (void) argc
; (void) argv
;
133 printf_P(PSTR("## CPU now in reset state.\n"));
137 return CMD_RET_SUCCESS
;
140 command_ret_t
do_restart(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
142 (void) cmdtp
; (void) flag
; (void) argc
; (void) argv
;
145 z80_bus_cmd(Restart
);
147 return CMD_RET_SUCCESS
;
151 command_ret_t
do_console(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
154 uint8_t pending
, state
= 0;
156 (void) cmdtp
; (void) flag
; (void) argc
; (void) argv
;
161 ATOMIC_BLOCK(ATOMIC_RESTORESTATE
) {
162 pending
= (Stat
& S_CON_PENDING
) != 0;
163 Stat
&= ~S_CON_PENDING
;
166 while ((ch
= z80_memfifo_getc(fifo_conout
)) >= 0)
169 if ((ch
= my_getchar(0)) >= 0) {
172 if (ch
== CONFIG_ESC_CHAR
) {
174 /* TODO: Timer starten */
176 z80_memfifo_putc(fifo_conin
, ch
);
179 // serial_putc('\n');
186 // z80_reset_pulse();
197 printf_P(PSTR("\n"));
201 case CONFIG_ESC_CHAR
:
203 z80_memfifo_putc(fifo_conin
, ch
);
206 // serial_putc('\n');
216 return CMD_RET_SUCCESS
;