diff options
author | Treeki <treeki@gmail.com> | 2011-06-24 03:05:53 +0200 |
---|---|---|
committer | Treeki <treeki@gmail.com> | 2011-06-24 03:05:53 +0200 |
commit | 7f8da8ec6001ca72ceb0f0a22e8c58ee74184231 (patch) | |
tree | 4e2ad43aaf50868487808b955dc7b38e09748da7 | |
parent | 6ba9c03047a4101c65a4225da7d72b428876421f (diff) | |
download | kamek-7f8da8ec6001ca72ceb0f0a22e8c58ee74184231.tar.gz kamek-7f8da8ec6001ca72ceb0f0a22e8c58ee74184231.zip |
compression.yaml added: .LH support, compressed files now take priority
-rw-r--r-- | NewerProject.yaml | 1 | ||||
-rw-r--r-- | compression.yaml | 18 | ||||
-rw-r--r-- | kamek_ntsc.x | 14 | ||||
-rw-r--r-- | kamek_ntsc2.x | 14 | ||||
-rw-r--r-- | kamek_pal.x | 14 | ||||
-rw-r--r-- | kamek_pal2.x | 14 | ||||
-rw-r--r-- | src/compression.S | 127 |
7 files changed, 202 insertions, 0 deletions
diff --git a/NewerProject.yaml b/NewerProject.yaml index 4d33bbe..b3248b1 100644 --- a/NewerProject.yaml +++ b/NewerProject.yaml @@ -19,3 +19,4 @@ modules: - processed/growup.yaml
- processed/levelspecial.yaml
- processed/eventlooper.yaml
+ - processed/compression.yaml
diff --git a/compression.yaml b/compression.yaml new file mode 100644 index 0000000..9d3a058 --- /dev/null +++ b/compression.yaml @@ -0,0 +1,18 @@ +--- +source_files: [../src/compression.S] +hooks: + - name: InitialiseEverything + type: branch_insn + branch_type: b + src_addr_pal: 0x8015BC70 + target_func: 'InitCompression' + + - name: GetFileEntrynumNew + type: branch_insn + branch_type: b + src_addr_pal: 0x8016BD70 + target_func: 'GetFileEntrynumNew' + + - name: FixStreamingLHDecompression + type: nop_insn + area_pal: 0x801D7884 diff --git a/kamek_ntsc.x b/kamek_ntsc.x index 6e28956..f9a3800 100644 --- a/kamek_ntsc.x +++ b/kamek_ntsc.x @@ -343,6 +343,16 @@ SECTIONS { load__12dDvdLoader_cFPCcUcPv = 0x8008F1B0; unload__12dDvdLoader_cFv = 0x8008F310; + SZSDecompClass = 0x80377AE4; + LZDecompClass = 0x80377AF0; + LHDecompClass = 0x80377AFC; + LRCDecompClass = 0x80377B08; + RLDecompClass = 0x80377B14; + StoreCompressionClassList = 0x8016B090; + DecompBufferPointer = 0x80429460; + + TryAndFindCompressedFile = 0x8016BAA0; + _Z22BgTexMng__LoadAnimTilePvisPcS0_c = 0x80087B60; /* same for ntsc */ BgTexMng__LoadAnimTile__FPvisPcPcc = 0x80087B60; /* same for ntsc */ @@ -416,6 +426,8 @@ SECTIONS { AllocFromGameHeap1__FUi = 0x801628C0; FreeFromGameHeap1__FPv = 0x80162920; + AllocFromGameHeap1 = 0x801628C0; + _Z19lyt__Layout__LayoutPv = 0x802ACB40; _Z15lyt__Layout__dtPvi = 0x802ACB80; _Z18lyt__Layout__BuildPvPKvS_ = 0x802ACCB0; @@ -446,6 +458,8 @@ SECTIONS { DVDReadPrio__FP9DVDHandlePviii = 0x801CAB20; DVDClose__FP9DVDHandle = 0x801CAA00; + DVDConvertPathToEntrynum = 0x801CA680; + _ZN8SaveFile8GetBlockEi = 0x800E0380; _ZN8SaveFile10GetQSBlockEi = 0x800E03B0; diff --git a/kamek_ntsc2.x b/kamek_ntsc2.x index 075d868..8af9cc3 100644 --- a/kamek_ntsc2.x +++ b/kamek_ntsc2.x @@ -343,6 +343,16 @@ SECTIONS { load__12dDvdLoader_cFPCcUcPv = 0x8008F1B0; unload__12dDvdLoader_cFv = 0x8008F310; + SZSDecompClass = 0x80377AE4; + LZDecompClass = 0x80377AF0; + LHDecompClass = 0x80377AFC; + LRCDecompClass = 0x80377B08; + RLDecompClass = 0x80377B14; + StoreCompressionClassList = 0x8016B090; + DecompBufferPointer = 0x80429460; + + TryAndFindCompressedFile = 0x8016BAA0; + _Z22BgTexMng__LoadAnimTilePvisPcS0_c = 0x80087B60; /* same for ntsc */ BgTexMng__LoadAnimTile__FPvisPcPcc = 0x80087B60; /* same for ntsc */ @@ -416,6 +426,8 @@ SECTIONS { AllocFromGameHeap1__FUi = 0x801628C0; FreeFromGameHeap1__FPv = 0x80162920; + AllocFromGameHeap1 = 0x801628C0; + _Z19lyt__Layout__LayoutPv = 0x802ACB40; _Z15lyt__Layout__dtPvi = 0x802ACB80; _Z18lyt__Layout__BuildPvPKvS_ = 0x802ACCB0; @@ -446,6 +458,8 @@ SECTIONS { DVDReadPrio__FP9DVDHandlePviii = 0x801CAB20; DVDClose__FP9DVDHandle = 0x801CAA00; + DVDConvertPathToEntrynum = 0x801CA680; + _ZN8SaveFile8GetBlockEi = 0x800E0380; _ZN8SaveFile10GetQSBlockEi = 0x800E03B0; diff --git a/kamek_pal.x b/kamek_pal.x index 72cce55..720c71b 100644 --- a/kamek_pal.x +++ b/kamek_pal.x @@ -343,6 +343,16 @@ SECTIONS { load__12dDvdLoader_cFPCcUcPv = 0x8008F1B0;
unload__12dDvdLoader_cFv = 0x8008F310;
+ SZSDecompClass = 0x80377DE4;
+ LZDecompClass = 0x80377DF0;
+ LHDecompClass = 0x80377DFC;
+ LRCDecompClass = 0x80377E08;
+ RLDecompClass = 0x80377E14;
+ StoreCompressionClassList = 0x8016B1D0;
+ DecompBufferPointer = 0x80429758;
+
+ TryAndFindCompressedFile = 0x8016BBE0;
+
_Z22BgTexMng__LoadAnimTilePvisPcS0_c = 0x80087B60; /* same for ntsc */
BgTexMng__LoadAnimTile__FPvisPcPcc = 0x80087B60; /* same for ntsc */
@@ -416,6 +426,8 @@ SECTIONS { AllocFromGameHeap1__FUi = 0x80162A00;
FreeFromGameHeap1__FPv = 0x80162A60;
+ AllocFromGameHeap1 = 0x80162A00;
+
_Z19lyt__Layout__LayoutPv = 0x802ACC80;
_Z15lyt__Layout__dtPvi = 0x802ACCC0;
_Z18lyt__Layout__BuildPvPKvS_ = 0x802ACDF0;
@@ -446,6 +458,8 @@ SECTIONS { DVDReadPrio__FP9DVDHandlePviii = 0x801CAC60;
DVDClose__FP9DVDHandle = 0x801CAB40;
+ DVDConvertPathToEntrynum = 0x801CA7C0;
+
_ZN8SaveFile8GetBlockEi = 0x800E0470;
_ZN8SaveFile10GetQSBlockEi = 0x800E04A0;
diff --git a/kamek_pal2.x b/kamek_pal2.x index 3136527..8f6ff14 100644 --- a/kamek_pal2.x +++ b/kamek_pal2.x @@ -343,6 +343,16 @@ SECTIONS { load__12dDvdLoader_cFPCcUcPv = 0xDEADBEEF; unload__12dDvdLoader_cFv = 0xDEADBEEF; + SZSDecompClass = 0xDEADBEEF; + LZDecompClass = 0xDEADBEEF; + LHDecompClass = 0xDEADBEEF; + LRCDecompClass = 0xDEADBEEF; + RLDecompClass = 0xDEADBEEF; + StoreCompressionClassList = 0xDEADBEEF; + DecompBufferPointer = 0xDEADBEEF; + + TryAndFindCompressedFile = 0xDEADBEEF; + _Z22BgTexMng__LoadAnimTilePvisPcS0_c = 0xDEADBEEF; /* same for ntsc */ BgTexMng__LoadAnimTile__FPvisPcPcc = 0xDEADBEEF; /* same for ntsc */ @@ -416,6 +426,8 @@ SECTIONS { AllocFromGameHeap1__FUi = 0xDEADBEEF; FreeFromGameHeap1__FPv = 0xDEADBEEF; + AllocFromGameHeap1 = 0xDEADBEEF; + _Z19lyt__Layout__LayoutPv = 0xDEADBEEF; _Z15lyt__Layout__dtPvi = 0xDEADBEEF; _Z18lyt__Layout__BuildPvPKvS_ = 0xDEADBEEF; @@ -446,6 +458,8 @@ SECTIONS { DVDReadPrio__FP9DVDHandlePviii = 0xDEADBEEF; DVDClose__FP9DVDHandle = 0xDEADBEEF; + DVDConvertPathToEntrynum = 0xDEADBEEF; + _ZN8SaveFile8GetBlockEi = 0xDEADBEEF; _ZN8SaveFile10GetQSBlockEi = 0xDEADBEEF; diff --git a/src/compression.S b/src/compression.S new file mode 100644 index 0000000..dfa2894 --- /dev/null +++ b/src/compression.S @@ -0,0 +1,127 @@ +.text +.align 4 +.set sp, 1 + +#ifndef __MWERKS__ +.set r0,0; .set r1,1; .set r2,2; .set r3,3; .set r4,4 +.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9 +.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14 +.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19 +.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24 +.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29 +.set r30,30; .set r31,31; .set f0,0; .set f2,2; .set f3,3 +.set f1,1; .set f30,30; .set f31,31 +#endif + +.extern StoreCompressionClassList + +.extern SZSDecompClass +.extern LZDecompClass +.extern LHDecompClass +.extern LRCDecompClass +.extern RLDecompClass + +.extern DecompBufferPointer + +.extern AllocFromGameHeap1 +.extern OSReport + +.extern TryAndFindCompressedFile +.extern DVDConvertPathToEntrynum + +.global InitCompression +InitCompression: + stwu sp, -0x10(sp) + mflr r0 + stw r0, 0x14(sp) + # -- Prolog + + lis r3, CMsg@h + ori r3, r3, CMsg@l + crclr 4*cr1+eq + bl OSReport + + lis r3, CCCL@h + ori r3, r3, CCCL@l + lis r4, CCCL_End@h + ori r4, r4, CCCL_End@l + bl StoreCompressionClassList + + # Allocate a buffer for decompression stuff + li r3, 0x8B4 + bl AllocFromGameHeap1 + lis r4, DecompBufferPointer@h + ori r4, r4, DecompBufferPointer@l + stw r3, 0(r4) + + mr r4, r3 + lis r3, CMsg2@h + ori r3, r3, CMsg2@l + crclr 4*cr1+eq + bl OSReport + + # -- Epilog + li r3, 1 + lwz r0, 0x14(sp) + mtlr r0 + addi sp, sp, 0x10 + blr + + +.global GetFileEntrynumNew +GetFileEntrynumNew: + stwu sp, -0x20(sp) + mflr r0 + stw r0, 0x24(sp) + stw r31, 0x1C(sp) + stw r30, 0x18(sp) + stw r29, 0x14(sp) + # Compression Type pointer (byte*) + mr r30, r4 + # Filename + mr r29, r3 + + # first, try compression + # don't bother checking 5278, it's always on in NSMBW anyway + bl TryAndFindCompressedFile + cmpwi r3, -1 + bne returnEntrynum + + # didn't find it, so try the normal version + mr r3, r29 + bl DVDConvertPathToEntrynum + # return value gets passed through + + cmpwi r30, 0 + beq returnEntrynum + li r0, 0 + stb r0, 0(r30) + +returnEntrynum: + lwz r31, 0x1C(sp) + lwz r30, 0x18(sp) + lwz r29, 0x14(sp) + lwz r0, 0x24(sp) + mtlr r0 + addi sp, sp, 0x20 + blr + + +.data +CCCL: + .long LHDecompClass + .long LZDecompClass +CCCL_End: + .long 0 + +CMsg: + .string "Setting up fancy decompression!\n" + +CMsg2: + .string "Buffer: %p\n" + +.align 4 + + + + |