minor adjustments
[megadrive.git] / mx / linux / sms2mx.c
1 #include <stdio.h>
2 #include <string.h>
3
4 #define IN_SIZE         0x8000
5 #define OUT_SIZE        0x400000
6 static unsigned char buff[OUT_SIZE], buff_in[IN_SIZE];
7
8 int main(int argc, char *argv[])
9 {
10         FILE *fi, *fo;
11         int size, bsize;
12         int i, o;
13
14         if (argc != 3) {
15                 fprintf(stderr, "usage:\n%s <sms ROM> <mx img>\n", argv[0]);
16                 return 1;
17         }
18
19         fi = fopen(argv[1], "rb");
20         if (fi == NULL) {
21                 fprintf(stderr, "can't open: %s\n", argv[1]);
22                 return 1;
23         }
24
25         fo = fopen(argv[2], "wb");
26         if (fo == NULL) {
27                 fprintf(stderr, "can't open: %s\n", argv[2]);
28                 return 1;
29         }
30
31         fseek(fi, 0, SEEK_END);
32         size = ftell(fi);
33         fseek(fi, 0, SEEK_SET);
34
35         if (size > IN_SIZE) {
36                 fprintf(stderr, "ROMs > 32k won't work\n");
37                 size = IN_SIZE;
38         }
39
40         if (fread(buff_in, 1, size, fi) != size)
41                 fprintf(stderr, "failed to read %s\n", argv[1]);
42
43         memset(buff, 0, sizeof(buff));
44
45         for (bsize = 1; bsize < size; bsize <<= 1)
46                 ;
47
48         for (i = o = 0; o < sizeof(buff); i = (i + 1) & (bsize - 1), o += 2)
49                 buff[o+1] = buff_in[i];
50
51         if (fwrite(buff, 1, OUT_SIZE, fo) != OUT_SIZE)
52                 fprintf(stderr, "failed to write to %s\n", argv[2]);
53         fclose(fi);
54         fclose(fo);
55
56         return 0;
57 }
58