#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
+#include <string.h>
+
+#if defined(__BORLANDC__) || defined(__MINGW32__) || defined(__CYGWIN__)
+ #include <fcntl.h>
+ #include <io.h>
+#endif
+
typedef unsigned char BYTE;
return (getnibble(p) << 4) | getnibble(p);
}
+void usage(void)
+{
+ fprintf(stderr,
+ "makebin: convert a Intel IHX file to binary.\n"
+ "Usage: makebin [-p] [-s romsize] [-h]\n");
+}
+
+void fixStdout(void)
+{
+ #if defined(__BORLANDC__) || defined(__MINGW32__) || defined(__CYGWIN__)
+ setmode(fileno(stdout), O_BINARY);
+ #endif
+}
+
+
int main(int argc, char **argv)
{
- int opt;
- int size = 32768;
+ int size = 32768, pack = 0, real_size = 0;
BYTE *rom;
char line[256];
char *p;
- while ((opt = getopt(argc, argv, "s:h"))!=-1) {
- switch (opt) {
+ argc--;
+ argv++;
+
+ fixStdout();
+
+ while (argc--) {
+ if (**argv != '-') {
+ usage();
+ return -1;
+ }
+ switch (argv[0][1]) {
case 's':
- size = atoi(optarg);
+ if (argc < 1) {
+ usage();
+ return -1;
+ }
+ argc--;
+ argv++;
+ size = atoi(*argv);
break;
case 'h':
- printf("makebin: convert a Intel IHX file to binary.\n"
- "Usage: %s [-s romsize] [-h]\n", argv[0]);
+ usage();
return 0;
+ case 'p':
+ pack = 1;
+ break;
+ default:
+ usage();
+ return -1;
}
+ argv++;
}
+
rom = malloc(size);
if (rom == NULL) {
fprintf(stderr, "error: couldn't allocate room for the image.\n");
if (addr < size)
rom[addr++] = getbyte(&p);
}
+
+ if (addr > real_size)
+ real_size = addr;
}
- fwrite(rom, 1, size, stdout);
+
+ if (pack)
+ fwrite(rom, 1, real_size, stdout);
+ else
+ fwrite(rom, 1, size, stdout);
+
return 0;
}