1 |
/* |
2 |
* $Id: hex_to_bin.c,v 1.1 2006/02/26 11:22:23 debug Exp $ |
3 |
* |
4 |
* Quick hack to convert .hex files (such as the AVR Hello World program at |
5 |
* http://www.tfs.net/~petek/atmel/hiworld/hiworld.hex) into raw binaries. |
6 |
* |
7 |
* E.g. hex_to_bin hiworld.hex hiworld.bin |
8 |
* |
9 |
* and then: gxemul -E bareavr ..... 0:hiworld.bin |
10 |
*/ |
11 |
|
12 |
#include <stdio.h> |
13 |
|
14 |
|
15 |
int fromhex(char *p) |
16 |
{ |
17 |
char c1 = p[0], c2 = p[1]; |
18 |
if (c1 >= '0' && c1 <= '9') |
19 |
c1 -= '0'; |
20 |
else if (c1 >= 'A' && c1 <= 'F') |
21 |
c1 = c1 - 'A' + 10; |
22 |
if (c2 >= '0' && c2 <= '9') |
23 |
c2 -= '0'; |
24 |
else if (c2 >= 'A' && c2 <= 'F') |
25 |
c2 = c2 - 'A' + 10; |
26 |
return c1 * 16 + c2; |
27 |
} |
28 |
|
29 |
|
30 |
int hex_to_bin(char *fname, char *outname) |
31 |
{ |
32 |
FILE *f = fopen(fname, "r"); |
33 |
FILE *fout = fopen(outname, "w"); |
34 |
|
35 |
while (!feof(f)) { |
36 |
char s[80]; |
37 |
int nbytes, i, addr; |
38 |
|
39 |
s[0] = '\0'; |
40 |
fgets(s, sizeof(s), f); |
41 |
if (s[0] == 0) |
42 |
break; |
43 |
if (s[0] != ':') |
44 |
continue; |
45 |
nbytes = fromhex(s+1); |
46 |
addr = fromhex(s+3) * 256 + fromhex(s+5); |
47 |
fseek(fout, addr, SEEK_SET); |
48 |
for (i=0; i<nbytes; i++) { |
49 |
unsigned char b = fromhex(s+9+i*2); |
50 |
fwrite(&b, 1, 1, fout); |
51 |
} |
52 |
} |
53 |
|
54 |
fclose(fout); |
55 |
fclose(f); |
56 |
return 0; |
57 |
} |
58 |
|
59 |
|
60 |
int main(int argc, char *argv[]) |
61 |
{ |
62 |
if (argc < 3) { |
63 |
fprintf(stderr, "usage: %s file.hex output.bin\n", argv[0]); |
64 |
exit(1); |
65 |
} |
66 |
|
67 |
return hex_to_bin(argv[1], argv[2]); |
68 |
} |
69 |
|