twintig: Be less verbose by default
[svpe-tools.git] / zelda-cksum.c
blobc215a0ee5981ca26a5fb2a1debc87ab74d663be7
1 // Copyright 2007,2008 Segher Boessenkool <segher@kernel.crashing.org>
2 // Licensed under the terms of the GNU GPL, version 2
3 // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
5 #include <stdio.h>
7 #include "tools.h"
9 static u8 buf[0x4000];
11 static void slot_checksum(u8 *x)
13 u32 i;
14 u32 sum, nsum;
16 sum = 0;
17 for (i = 0; i < 0x0a8c; i++)
18 sum += x[i];
19 nsum = -(sum + 0x0a8c);
21 wbe32(x + 0x0a8c, sum);
22 wbe32(x + 0x0a90, nsum);
25 static void save_checksum(u8 *x)
27 u32 i;
28 u16 sum, nsum;
30 slot_checksum(x + 8);
31 slot_checksum(x + 8 + 0x0a94);
32 slot_checksum(x + 8 + 2*0x0a94);
34 sum = 0;
35 for (i = 0; i < 0x0ffe; i++)
36 sum += be16(x + 2*i);
37 nsum = -(sum + 0x0ffe);
39 wbe16(x + 0x1ffc, sum);
40 wbe16(x + 0x1ffe, nsum);
43 int main(int argc, char **argv)
45 FILE *fp;
47 if (argc != 2) {
48 fprintf(stderr, "Usage: %s <zeldaTp.dat>\n", argv[0]);
49 return 1;
52 fp = fopen(argv[1], "rb+");
53 if (!fp)
54 fatal("open %s", argv[1]);
55 if (fread(buf, 0x4000, 1, fp) != 1)
56 fatal("read %s", argv[1]);
58 save_checksum(buf);
59 save_checksum(buf + 0x2000);
61 if (fseek(fp, 0, SEEK_SET))
62 fatal("seek");
63 if (fwrite(buf, 0x4000, 1, fp) != 1)
64 fatal("write %s", argv[1]);
65 fclose(fp);
67 return 0;