* support/makebin/makebin.c (usage): Removed getopt as mingw32 doesn't have it....
[fw/sdcc] / support / makebin / makebin.c
1 /** @name makebin - turn a .ihx file into a binary image.
2  */
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <stdlib.h>
6
7 typedef unsigned char BYTE;
8
9 #define FILL_BYTE 0xFF
10
11 int getnibble(char **p)
12 {
13   int ret = *((*p)++) - '0';
14   if (ret > 9) {
15     ret -= 'A' - '9' - 1;
16   }
17   return ret;
18 }
19
20 int getbyte(char **p)
21 {
22   return (getnibble(p) << 4) | getnibble(p);
23 }
24
25 void usage(void)
26 {
27   fprintf(stderr, 
28           "makebin: convert a Intel IHX file to binary.\n"
29           "Usage: makebin [-p] [-s romsize] [-h]\n");
30 }
31
32 int main(int argc, char **argv)
33 {
34     int size = 32768, pack = 0, real_size = 0;
35     BYTE *rom;
36     char line[256];
37     char *p;
38
39     argc--;
40     argv++;
41
42     while (argc--) {
43         if (**argv != '-') {
44             usage();
45             return -1;
46         }
47         switch (argv[0][1]) {
48         case 's':
49             if (argc < 1) {
50                 usage();
51                 return -1;
52             }
53             argc--;
54             argv++;
55             size = atoi(*argv);
56             break;
57         case 'h':
58             usage();
59             return 0;
60         case 'p':
61             pack = 1;
62             break;
63         default:
64             usage();
65             return -1;
66         }
67         argv++;
68     }
69
70     rom = malloc(size);
71     if (rom == NULL) {
72         fprintf(stderr, "error: couldn't allocate room for the image.\n");
73         return -1;
74     }
75     memset(rom, FILL_BYTE, size);
76     while (fgets(line, 256, stdin) != NULL) {
77         int nbytes;
78         int addr;
79
80         if (*line != ':') {
81             fprintf(stderr, "error: invalid IHX line.\n");
82             return -2;
83         }
84         p = line+1;
85         nbytes = getbyte(&p);
86         addr = getbyte(&p)<<8 | getbyte(&p);
87         getbyte(&p);
88
89         while (nbytes--) {
90             if (addr < size)
91                 rom[addr++] = getbyte(&p);
92         }
93
94         if (addr > real_size)
95             real_size = addr;
96     }
97
98     if (pack)
99         fwrite(rom, 1, real_size, stdout);
100     else
101         fwrite(rom, 1, size, stdout);
102     
103     return 0;
104 }