]>
cloudbase.mooo.com Git - z180-stamp.git/blob - avr/ihex.c
2 * (C) Copyright 2015 Leo C. <erbl259-lmu@yahoo.de>
4 * SPDX-License-Identifier: GPL-2.0+
13 #include "con-utils.h"
34 int get_hexdigit(void) {
37 c
= toupper(my_getchar(1));
41 c
-= ('A' - '0' - 10);
48 int get_hexbyte(void) {
52 if ((i
= (uint8_t) get_hexdigit()) < 0x10)
53 if ((j
= (uint8_t) get_hexdigit()) < 0x10) {
61 ihex_t
ihex_get_record() {
65 ihex_t rec
= { IHX_BROKEN
, 0, 0, 0, 0 };
68 while ((c
= my_getchar(0)) != ':')
72 if ((i
= get_hexbyte()) < 0) /* Start code */
76 if ((i
= get_hexbyte()) < 0) /* Byte Count */
79 rec
.address
= i
* 256;
80 if ((i
= get_hexbyte()) < 0) /* Address */
84 if ((i
= get_hexbyte()) < 0) /* Record type */
89 if (rec
.len
) { /* Record Data */
91 if ((rec
.data
= malloc(rec
.len
)) == 0)
93 for (p
=rec
.data
, k
=rec
.len
; k
; k
--) {
94 if ((i
= get_hexbyte()) < 0)
100 free(rec
.data
); rec
.data
= 0;
104 if ((i
= get_hexbyte()) < 0) /* Check sum */
108 free(rec
.data
); rec
.data
= 0;
109 rec
.status
= IHX_CHKSUMERR
;
117 command_ret_t
do_loadihex(cmd_tbl_t
*cmdtp
, int flag
, int argc
, char * const argv
[])
120 uint32_t base_address
= 0;
121 uint32_t address_low
= 0xffffffff;
122 uint32_t address_high
= 0;
124 command_ret_t rcode
= CMD_RET_FAILURE
;
131 offset
= strtol(argv
[1], NULL
, 16);
134 rec
= ihex_get_record();
136 if (rec
.status
== IHX_OK
) {
138 case 0: /* Data record */
140 uint32_t addr
= base_address
+ rec
.address
+ offset
;
141 if (addr
< address_low
)
143 if (addr
+rec
.len
> address_high
)
144 address_high
= addr
+ rec
.len
;
146 z80_bus_cmd(Request
);
147 z80_write_block(rec
.data
, /* src */
150 z80_bus_cmd(Release
);
155 case 1: /* EOF record */
160 case 2: /* Extended Segment Address Record */
161 base_address
= ((rec
.data
[0] << 8) + rec
.data
[1]) << 4;
165 case 4: /* Extended Linear Address Record */
166 base_address
= (uint32_t)((rec
.data
[0] << 8) + rec
.data
[1]) << 16;
170 case 3: /* Start Segment Address Record (ignored)*/
171 case 5: /* Start Linear Address Record (ignored)*/
181 switch (rec
.status
) {
183 rcode
= CMD_RET_SUCCESS
;
188 printf_P(PSTR("Broken Hex Record or loading interrupted!\n"));
192 printf_P(PSTR("Data loaded - "));
193 if (address_low
>= address_high
)
194 printf_P(PSTR("None.\n"));
196 printf_P(PSTR("low: 0x%.5lX high: 0x%.5lX\n"), address_low
, address_high
);