Line 19: |
Line 19: |
| | style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x003 | | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #dde;" | 0x003 |
| | style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4 | | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #ddd;" | 4 |
− | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | ?? Checksum (values 0xe91db7e5 and 0x373569cd seen) | + | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #edd;" | Checksum |
| |- style="background-color: #ddd;" | | |- style="background-color: #ddd;" |
| | style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x004 | | | style="border: 1px solid #ccc; padding: 0.2em; background-color: #ded;" | 0x004 |
Line 37: |
Line 37: |
| |- style="background-color: #ddd;" | | |- style="background-color: #ddd;" |
| |} | | |} |
| + | |
| + | The checksum is calculated as follows, with buf pointing to offset 0x04 in the file, and len being the length of GameData.bin minus 0x04: |
| + | <source lang="c"> |
| + | uint32_t generate_checksum(void *buf, int len) |
| + | { |
| + | uint16_t *data = (uint16_t*)buf; |
| + | uint32_t c1 = 0, c2 = 0; |
| + | |
| + | for (int i = 0; i < len / sizeof(uint16_t); i++) |
| + | { |
| + | c1 = (c1 + data[i]) & 0xFFFF; |
| + | c2 = (c2 + ~data[i]) & 0xFFFF; |
| + | } |
| + | |
| + | return (c2 & 0xFFFF) | ((c1 & 0xFFFF) << 16); |
| + | } |
| + | </source> |
| | | |
| === Index === | | === Index === |