mirror of
https://github.com/zeldaret/oot.git
synced 2025-02-02 17:44:25 +00:00
match the final non-matching in boot!
This commit is contained in:
parent
d879f2acb0
commit
385f77fb48
1 changed files with 13 additions and 18 deletions
|
@ -51,10 +51,6 @@ void* Yaz0_NextDMA(void* curSrcPos) {
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NON_MATCHING
|
|
||||||
// has an extra check at the start of the small compressed loop
|
|
||||||
// along with an extra move instruction
|
|
||||||
// maybe some regalloc differences besides these issues
|
|
||||||
void Yaz0_DecompressImpl(Yaz0Header* hdr, u8* dst) {
|
void Yaz0_DecompressImpl(Yaz0Header* hdr, u8* dst) {
|
||||||
u32 bitIdx;
|
u32 bitIdx;
|
||||||
u8* src;
|
u8* src;
|
||||||
|
@ -63,46 +59,45 @@ void Yaz0_DecompressImpl(Yaz0Header* hdr, u8* dst) {
|
||||||
u32 nibble;
|
u32 nibble;
|
||||||
u8* backPtr;
|
u8* backPtr;
|
||||||
s32 chunkSize;
|
s32 chunkSize;
|
||||||
u32 curDecBit;
|
|
||||||
u32 off;
|
u32 off;
|
||||||
|
|
||||||
bitIdx = 0;
|
bitIdx = 0;
|
||||||
src = hdr->data;
|
src = (u8*)hdr->data;
|
||||||
dstEnd = dst + hdr->decSize;
|
dstEnd = dst + hdr->decSize;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (bitIdx == 0) {
|
if (bitIdx == 0) {
|
||||||
if ((sYaz0MaxPtr < (u32)src) && (sYaz0CurSize != 0))
|
if ((sYaz0MaxPtr < (u32)src) && (sYaz0CurSize != 0)) {
|
||||||
src = Yaz0_NextDMA(src);
|
src = Yaz0_NextDMA(src);
|
||||||
|
}
|
||||||
|
|
||||||
chunkHeader = *src++;
|
chunkHeader = *src++;
|
||||||
bitIdx = 8;
|
bitIdx = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
curDecBit = chunkHeader & (1 << 7);
|
if (chunkHeader & (1 << 7)) { // uncompressed
|
||||||
chunkHeader <<= 1;
|
*dst = *src;
|
||||||
|
dst++;
|
||||||
if (curDecBit) { // uncompressed
|
src++;
|
||||||
*dst++ = *src++;
|
|
||||||
} else { // compressed
|
} else { // compressed
|
||||||
|
off = ((*src & 0xF) << 8 | *(src + 1));
|
||||||
nibble = *src >> 4;
|
nibble = *src >> 4;
|
||||||
backPtr = dst - (*(src + 1) | (*src & 0xF) << 8);
|
backPtr = dst - off;
|
||||||
src += 2;
|
src += 2;
|
||||||
|
|
||||||
chunkSize = (nibble == 0) // N = chunkSize; B = back offset
|
chunkSize = (nibble == 0) // N = chunkSize; B = back offset
|
||||||
? *src++ + 0x12 // 3 bytes 0B BB NN
|
? *src++ + 0x12 // 3 bytes 0B BB NN
|
||||||
: nibble + 2; // 2 bytes NB BB
|
: nibble + 2; // 2 bytes NB BB
|
||||||
|
|
||||||
for (off = chunkSize; off > 0; off--)
|
do {
|
||||||
*dst++ = *(backPtr++ - 1);
|
*dst++ = *(backPtr++ - 1);
|
||||||
|
chunkSize--;
|
||||||
|
} while (chunkSize != 0);
|
||||||
}
|
}
|
||||||
|
chunkHeader <<= 1;
|
||||||
bitIdx--;
|
bitIdx--;
|
||||||
} while (dst != dstEnd);
|
} while (dst != dstEnd);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#pragma GLOBAL_ASM("asm/non_matchings/boot/yaz0/Yaz0_DecompressImpl.s")
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void Yaz0_Decompress(u32 romStart, void* dst, u32 size) {
|
void Yaz0_Decompress(u32 romStart, void* dst, u32 size) {
|
||||||
sYaz0CurRomStart = romStart;
|
sYaz0CurRomStart = romStart;
|
||||||
|
|
Loading…
Add table
Reference in a new issue