Loading [MathJax]/extensions/tex2jax.js
A reimplementation of Mario Kart Wii's physics engine in C++
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages Concepts
Decomp.cc
1#include "Decomp.hh"
2
3namespace EGG::Decomp {
4
6s32 GetExpandSize(const u8 *src) {
7 if (src[0] == 'Y' && src[1] == 'a' && src[2] == 'z') {
8 return form<s32>(&src[4]);
9 }
10
11 return -1;
12}
13
17s32 DecodeSZS(const u8 *src, u8 *dst) {
18 s32 expandSize = GetExpandSize(src);
19 s32 srcIdx = 0x10;
20 u8 code = 0;
21
22 u8 byte;
23
24 for (s32 destIdx = 0; destIdx < expandSize; code >>= 1) {
25 if (!code) {
26 code = 0x80;
27 byte = src[srcIdx++];
28 }
29
30 // Direct copy (code bit = 1)
31 if (byte & code) {
32 dst[destIdx++] = src[srcIdx++];
33 }
34 // RLE compressed data (code bit = 0)
35 else {
36 // Lower nibble of byte1 + byte2
37 s32 distToDest = (src[srcIdx] << 8) | src[srcIdx + 1];
38 srcIdx += sizeof(u8) * 2;
39 s32 runSrcIdx = destIdx - (distToDest & 0xfff);
40
41 // Upper nibble of byte 1
42 s32 runLen = ((distToDest >> 12) == 0) ? src[srcIdx++] + 0x12 : (distToDest >> 12) + 2;
43
44 for (; runLen > 0; runLen--, destIdx++, runSrcIdx++) {
45 if (destIdx >= expandSize) {
46 PANIC("Malformed compressed SZS data.");
47 }
48
49 dst[destIdx] = dst[runSrcIdx - 1];
50 }
51 }
52 }
53 return expandSize;
54}
55
56} // namespace EGG::Decomp