]> cloudbase.mooo.com Git - z180-stamp.git/blame - avr/cmd_boot.c
Code reorg and 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>
7#include <avr/pgmspace.h>
8
9#include "command.h"
10#include "z80-if.h"
8f23e84c 11//#include "debug.h"
534e1dfc
L
12
13/* ugly hack to get Z180 loadfile into flash memory */
14#define const const FLASH
15#include "../z180/hdrom.h"
16#undef const
17
18
19
20static void z80_load_mem(void)
21{
22 unsigned sec = 0;
23 uint32_t sec_base = hdrom_start;
24
25 printf_P(PSTR("Loading Z180 memory... \n"));
26
27 while (sec < hdrom_sections) {
28 printf_P(PSTR(" From: 0x%.5lX to: 0x%.5lX (%5li bytes)\n"),
29 hdrom_address[sec],
30 hdrom_address[sec]+hdrom_length_of_sections[sec] - 1,
31 hdrom_length_of_sections[sec]);
32
62f624d3 33 z80_bus_cmd(Request);
534e1dfc 34 z80_write_block((const FLASH unsigned char *) &hdrom[sec_base], /* src */
41d36f28 35 hdrom_address[sec], /* dest */
534e1dfc 36 hdrom_length_of_sections[sec]); /* len */
62f624d3 37 z80_bus_cmd(Release);
534e1dfc
L
38 sec_base+=hdrom_length_of_sections[sec];
39 sec++;
40 }
41}
42
d0581f88 43command_ret_t do_loadf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
534e1dfc
L
44{
45 (void) cmdtp; (void) flag; (void) argc; (void) argv;
46
6035a17b 47 if (z80_bus_state() & ZST_RUNNING) {
534e1dfc 48 printf_P(PSTR("## Can't load while CPU is running!\n"));
6035a17b 49 return CMD_RET_FAILURE;
534e1dfc
L
50 }
51
52 z80_load_mem();
6035a17b 53
d0581f88 54 return CMD_RET_SUCCESS;
534e1dfc
L
55}
56
57
d0581f88 58command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
534e1dfc 59{
f338df2a 60 uint16_t count=1;
534e1dfc 61
f338df2a 62 (void) cmdtp; (void) flag;
534e1dfc 63
6035a17b 64 if (!(z80_bus_state() & ZST_RUNNING)) {
f338df2a 65 printf_P(PSTR("## CPU is not running!\n"));
d0581f88 66 return CMD_RET_FAILURE;
534e1dfc
L
67 }
68
f338df2a
L
69 if (argc > 1)
70 count = (uint16_t) strtoul(argv[2], NULL, 16);
71
62f624d3 72 z80_bus_cmd(Request);
f338df2a 73 while (count--)
62f624d3 74 z80_bus_cmd(M_Cycle);
534e1dfc 75
d0581f88 76 return CMD_RET_SUCCESS;
f338df2a
L
77}
78
79
d0581f88 80command_ret_t do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
f338df2a
L
81{
82 uint32_t addr;
83
84 (void) cmdtp; (void) flag;
6035a17b 85
f338df2a
L
86 if (argc < 2)
87 return CMD_RET_USAGE;
88 addr = strtoul(argv[1], NULL, 16);
89 if (addr >= (1UL<<16)) {
534e1dfc
L
90 printf_P(PSTR("## Startaddress 0x%05lx too high.\n"
91 " (Out of logical address space (0x00000-0x0ffff))\n"),
92 addr);
d0581f88 93 return CMD_RET_FAILURE;
6035a17b 94 }
f338df2a 95
6035a17b 96 if (z80_bus_state() & ZST_RUNNING) {
f338df2a 97 printf_P(PSTR("## CPU allready running!\n"));
d0581f88 98 return CMD_RET_FAILURE;
534e1dfc
L
99 }
100
f338df2a
L
101 printf_P(PSTR("## Starting application at 0x%04lx ...\n"), addr);
102
103 if (addr != 0) {
104 uint8_t tmp[3];
105 uint_fast8_t i;
6035a17b 106
62f624d3 107 z80_bus_cmd(Request);
f338df2a
L
108 for (i = 0; i < 3; i++)
109 tmp[i] = z80_read(i);
110 z80_write(0, 0xc3);
111 z80_write(1, addr);
112 z80_write(2, (addr >> 8));
113
62f624d3
L
114 z80_bus_cmd(Run);
115 z80_bus_cmd(M_Cycle);
116 z80_bus_cmd(M_Cycle);
f338df2a
L
117 for (i = 0; i < 3; i++)
118 z80_write(i, tmp[i]);
119 } else
62f624d3 120 z80_bus_cmd(Run);
6035a17b 121
62f624d3 122 z80_bus_cmd(Release);
f338df2a 123
d0581f88 124 return CMD_RET_SUCCESS;
534e1dfc
L
125}
126
d0581f88 127command_ret_t do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
534e1dfc
L
128{
129 (void) cmdtp; (void) flag; (void) argc; (void) argv;
130
131 printf_P(PSTR("## CPU now in reset state.\n"));
534e1dfc 132
62f624d3 133 z80_bus_cmd(Reset);
d0581f88 134 return CMD_RET_SUCCESS;
534e1dfc
L
135}
136
d0581f88 137command_ret_t do_restart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
534e1dfc
L
138{
139 (void) cmdtp; (void) flag; (void) argc; (void) argv;
140
62f624d3 141 z80_bus_cmd(Restart);
534e1dfc 142
d0581f88 143 return CMD_RET_SUCCESS;
534e1dfc
L
144}
145