]>
cloudbase.mooo.com Git - z180-stamp.git/blob - avr/cmd_boot.c
c2f03519d846baa869600c3cbb09885c954c0844
7 #include <avr/pgmspace.h>
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
;
130 command_ret_t
do_reset(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
132 (void) cmdtp
; (void) flag
; (void) argc
; (void) argv
;
134 printf_P(PSTR("## CPU now in reset state.\n"));
138 return CMD_RET_SUCCESS
;
141 command_ret_t
do_restart(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
143 (void) cmdtp
; (void) flag
; (void) argc
; (void) argv
;
146 z80_bus_cmd(Restart
);
148 return CMD_RET_SUCCESS
;
152 command_ret_t
do_console(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
155 uint8_t pending
, state
= 0;
157 (void) cmdtp
; (void) flag
; (void) argc
; (void) argv
;
162 ATOMIC_BLOCK(ATOMIC_RESTORESTATE
) {
163 pending
= (Stat
& S_CON_PENDING
) != 0;
164 Stat
&= ~S_CON_PENDING
;
167 while ((ch
= z80_memfifo_getc(fifo_conout
)) >= 0)
170 if ((ch
= my_getchar(0)) >= 0) {
173 if (ch
== CONFIG_ESC_CHAR
) {
175 /* TODO: Timer starten */
177 z80_memfifo_putc(fifo_conin
, ch
);
180 // serial_putc('\n');
187 // z80_reset_pulse();
201 case CONFIG_ESC_CHAR
:
203 z80_memfifo_putc(fifo_conin
, ch
);
206 // serial_putc('\n');
216 return CMD_RET_SUCCESS
;