summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordark-samus <mathmcclintic@gmail.com>2020-03-23 06:35:43 -0400
committerdark-samus <mathmcclintic@gmail.com>2020-03-23 06:37:54 -0400
commit385f77fb480f7bdebbc72e0b24e528085e0dadf2 (patch)
treeb48e5c0502a65d3664daec3562d02e23bf4bcd44 /src
parentd879f2acb02924b75552487db291fa3e0397d86c (diff)
match the final non-matching in boot!
Diffstat (limited to 'src')
-rw-r--r--src/boot/yaz0.c31
1 files changed, 13 insertions, 18 deletions
diff --git a/src/boot/yaz0.c b/src/boot/yaz0.c
index 5954e28aa..379d4ca46 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;