.text .global TitleScreenFucker .extern RESTART_CRSIN_LevelStartStruct .extern SaveFileBuffer TitleScreenFucker: lis r3, RESTART_CRSIN_LevelStartStruct@h ori r3, r3, RESTART_CRSIN_LevelStartStruct@l li r4, 0 stb r4, 7(r3) # now get the FUCKING WORLD and FUCKING LEVEL lis r4, SaveFileBuffer@h ori r4, r4, SaveFileBuffer@l #lwz r4, 0(r4) lbz r5, 6(r4) extsb r5, r5 mulli r5, r5, 0x980 addi r4, r4, 0x6A0 add r4, r4, r5 # do we need to use Quick Save? get the QS block addi r4, r4, 0x1C80 lbz r6, 2(r4) clrlwi. r6, r6, 31 beq quickSaveExists subi r4, r4, 0x1C80 quickSaveExists: # now we have the save block in r4 lbz r6, 2(r4) clrlwi. r6, r6, 31 beq saveIsNotNew li r5, 0 li r6, 9 b chosenTitle saveIsNotNew: lbz r5, 0x73A(r4) lbz r6, 0x73B(r4) chosenTitle: cmpwi r5, 0 bne isntWorld1_1 cmpwi r6, 0 bne isntWorld1_1 li r5, 0 li r6, 9 isntWorld1_1: stb r5, 0xC(r3) stb r6, 0xD(r3) blr .global mpPauseFix1 .global mpPauseFix2 .global mpPauseFix3 .extern continueFromMpPauseFix1 .extern continueFromMpPauseFix2 .extern continueFromMpPauseFix3 mpPauseFix3: bl CheckIfSinglePlayer cmpwi r3, 1 li r0, 30 beq isSingle li r0, 1 isSingle: stb r0, 0x153E(r29) mr r3, r29 b continueFromMpPauseFix3 mpPauseFix1: lis r5, continueFromMpPauseFix1@h ori r5, r5, continueFromMpPauseFix1@l b mpPauseFix mpPauseFix2: lis r5, continueFromMpPauseFix2@h ori r5, r5, continueFromMpPauseFix2@l b mpPauseFix .global mpPauseFix4 mpPauseFix4: b CheckIfSinglePlayer .extern CheckIfSinglePlayer mpPauseFix: stwu r1, -0x20(r1) mflr r0 stw r0, 0x24(r1) stw r31, 0x1C(r1) stw r30, 0x18(r1) mr r31, r3 mr r30, r4 bl CheckIfSinglePlayer cmpwi r3, 1 bne DontDoThis mr r3, r31 mr r4, r30 mtctr r5 bctrl DontDoThis: lwz r30, 0x18(r1) lwz r31, 0x1C(r1) lwz r0, 0x24(r1) mtlr r0 addi r1, r1, 0x20 blr .global newClimbSounds newClimbSounds: li r7, 0x134 b effectNewClimbSounds .global newClimbSoundsJump newClimbSoundsJump: li r7, 0x136 b effectNewClimbSounds .global newClimbSoundsJumpS newClimbSoundsJumpS: li r7, 0x137 b effectNewClimbSounds .global newClimbSoundsJumpSS newClimbSoundsJumpSS: li r7, 0x138 b effectNewClimbSounds .global newClimbSoundsLand newClimbSoundsLand: li r7, 0x139 b effectNewClimbSounds .global newClimbSoundsAttack newClimbSoundsAttack: li r7, 0x13A b effectNewClimbSounds .extern StagePtr effectNewClimbSounds: lis r6, StagePtr@h ori r6, r6, StagePtr@l lwz r6, 0(r6) lhz r6, 0x120C(r6) cmpwi r6, 14 beq pngn cmpwi r6, 0x903 beq pngn cmpwi r6, 0x40E beq climb mr r4, r7 blr pngn: li r4, 0xE1 blr climb: li r4, 0xC9 blr .global TextWriterCrap .extern TextWriterCrapContinue TextWriterCrap: lis r6, 0xFFFF ori r6, r6, 0xFF00 lwz r0, 8(r5) or r0, r0, r6 stw r0, 0x18(r1) lwz r0, 0xC(r5) or r0, r0, r6 stw r0, 0x1C(r1) lwz r0, 0x10(r5) or r0, r0, r6 stw r0, 0x20(r1) lwz r0, 0x14(r5) or r0, r0, r6 stw r0, 0x24(r1) b TextWriterCrapContinue .global HeapChangeAttempt HeapChangeAttempt: lis 4, 0x8037 ori 4, 4, 0x7F50 lwz 4, 0(4) blr .extern OSReport .global UniversalFunctionLog UniversalFunctionLog: stwu r1, -0x10(r1) stw r0, 0x14(r1) stw r31, 0xC(r1) stw r30, 0x8(r1) mr r31, r3 mr r30, r4 crclr 4*cr1+eq mr r4, r31 #Loop through callstack, kind of lwz r3, 0(r1) lwz r5, 4(r3) lwz r3, 0(r3) lwz r6, 4(r3) lwz r3, 0(r3) lwz r7, 4(r3) lwz r3, 0(r3) lwz r8, 4(r3) lwz r3, 0(r3) lwz r9, 4(r3) lwz r3, 0(r3) lwz r10, 4(r3) #lwz r10, 0x14(r29) lis r3, UniLogStr@h ori r3, r3, UniLogStr@l bl OSReport mr r3, r31 mr r4, r30 lwz r30, 0x8(r1) lwz r31, 0xC(r1) lwz r0, 0x14(r1) mtlr r0 addi r1, r1, 0x10 blr #AllocLog: # stwu r1, -0x20(r1) # mflr r0 # stw r0, 0x24(r1) # stw r31, 0x1C(r1) # stw r30, 0x18(r1) # stw r29, 0x14(r1) # stw r28, 0x10(r1) # mr r31, r5 # mr r30, r4 # mr r29, r3 # #.extern ArchiveHeap # lis r3, ArchiveHeap@h # ori r3, r3, ArchiveHeap@l # lwz r3, 0(r3) # lwz r3, 0x10(r3) # cmpw r3, r29 # bne dontLogMe # # lis r3, WillAlloc@h # ori r3, r3, WillAlloc@l # crclr 4*cr1+eq # bl OSReport # # mr r3, r29 # mr r4, r30 # mr r5, r31 # bl RealAlloc # mr r28, r3 # # lis r3, Alloced@h # ori r3, r3, Alloced@l # mr r4, r28 # crclr 4*cr1+eq # bl OSReport # # mr r3, r28 # # b doneHere #dontLogMe: # mr r3, r29 # mr r4, r30 # mr r5, r31 # bl RealAlloc #doneHere: # lwz r28, 0x10(r1) # lwz r29, 0x14(r1) # lwz r30, 0x18(r1) # lwz r31, 0x1C(r1) # lwz r0, 0x24(r1) # mtlr r0 # addi r1, r1, 0x20 # blr # #FreeLog: # stwu r1, -0x20(r1) # mflr r0 # stw r0, 0x24(r1) # stw r30, 0x18(r1) # stw r29, 0x14(r1) # mr r30, r4 # mr r29, r3 # # lis r3, ArchiveHeap@h # ori r3, r3, ArchiveHeap@l # lwz r3, 0(r3) # lwz r3, 0x10(r3) # lwz r5, -0xC(r4) # cmpw r3, r29 # bne dontLogMe2 # lis r3, WillFree@h # ori r3, r3, WillFree@l # crclr 4*cr1+eq # bl OSReport #dontLogMe2: # # mr r3, r29 # mr r4, r30 # bl RealFree # # lwz r29, 0x14(r1) # lwz r30, 0x18(r1) # lwz r0, 0x24(r1) # mtlr r0 # addi r1, r1, 0x20 # blr # #RealAlloc: # stwu r1, -0x20(r1) # lis r12, 0x801D # ori r12, r12, 0x45A4 # mtctr r12 # bctr # #RealFree: # stwu r1, -0x20(r1) # lis r12, 0x801D # ori r12, r12, 0x4854 # mtctr r12 # bctr # #CRAPPYALLOC: # lis r3, 0x801D # ori r3, r3, 0x45A0 # lis r4, AllocLog@h # ori r4, r4, AllocLog@l # lis r5, 0x4800 # sub r6, r4, r3 # clrlwi r6, r6, 6 # or r5, r5, r6 # stw r5, 0(r3) # dcbst r0, r3 # sync # icbi r0, r3 # lis r3, 0x801D # ori r3, r3, 0x4850 # lis r4, FreeLog@h # ori r4, r4, FreeLog@l # lis r5, 0x4800 # sub r6, r4, r3 # clrlwi r6, r6, 6 # or r5, r5, r6 # stw r5, 0(r3) # dcbst r0, r3 # sync # icbi r0, r3 # blr #.section .ctors,4 #.long CRAPPYALLOC .data UniLogStr: .string "[ULog] returning %8x to: %x > %x > %x > %x > %x > %x\n" #WillAlloc: .string "[AH] Will allocate %x bytes aligned by %x\n" #Alloced: .string "[AH] Allocated %p\n" #WillFree: .string "[AH] Freeing %p which is %x bytes\n"