diff --git a/src/boot/yaz0.c b/src/boot/yaz0.c index 5954e28aaa..379d4ca467 100644 --- a/src/boot/yaz0.c +++ b/src/boot/yaz0.c @@ -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;