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;
|
||||
}
|
||||
|
||||
#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) {
|
||||
u32 bitIdx;
|
||||
u8* src;
|
||||
|
@ -63,46 +59,45 @@ void Yaz0_DecompressImpl(Yaz0Header* hdr, u8* dst) {
|
|||
u32 nibble;
|
||||
u8* backPtr;
|
||||
s32 chunkSize;
|
||||
u32 curDecBit;
|
||||
u32 off;
|
||||
|
||||
bitIdx = 0;
|
||||
src = hdr->data;
|
||||
src = (u8*)hdr->data;
|
||||
dstEnd = dst + hdr->decSize;
|
||||
|
||||
do {
|
||||
if (bitIdx == 0) {
|
||||
if ((sYaz0MaxPtr < (u32)src) && (sYaz0CurSize != 0))
|
||||
if ((sYaz0MaxPtr < (u32)src) && (sYaz0CurSize != 0)) {
|
||||
src = Yaz0_NextDMA(src);
|
||||
}
|
||||
|
||||
chunkHeader = *src++;
|
||||
bitIdx = 8;
|
||||
}
|
||||
|
||||
curDecBit = chunkHeader & (1 << 7);
|
||||
chunkHeader <<= 1;
|
||||
|
||||
if (curDecBit) { // uncompressed
|
||||
*dst++ = *src++;
|
||||
if (chunkHeader & (1 << 7)) { // uncompressed
|
||||
*dst = *src;
|
||||
dst++;
|
||||
src++;
|
||||
} else { // compressed
|
||||
off = ((*src & 0xF) << 8 | *(src + 1));
|
||||
nibble = *src >> 4;
|
||||
backPtr = dst - (*(src + 1) | (*src & 0xF) << 8);
|
||||
backPtr = dst - off;
|
||||
src += 2;
|
||||
|
||||
chunkSize = (nibble == 0) // N = chunkSize; B = back offset
|
||||
? *src++ + 0x12 // 3 bytes 0B BB NN
|
||||
: nibble + 2; // 2 bytes NB BB
|
||||
|
||||
for (off = chunkSize; off > 0; off--)
|
||||
do {
|
||||
*dst++ = *(backPtr++ - 1);
|
||||
chunkSize--;
|
||||
} while (chunkSize != 0);
|
||||
}
|
||||
|
||||
chunkHeader <<= 1;
|
||||
bitIdx--;
|
||||
} 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) {
|
||||
sYaz0CurRomStart = romStart;
|
||||
|
|
Loading…
Add table
Reference in a new issue