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