papermario/src/load_engine_data_obfuscated.c

52 lines
1.4 KiB
C

#include "common.h"
#include "ld_addrs.h"
#include "mips.h"
extern u8 obfuscated_load_engine_data[];
#ifdef SHIFT
void load_engine_data(void);
void load_engine_data_obfuscated(void) {
load_engine_data();
}
#else
void load_engine_data_obfuscated(void) {
s32 seed = 0x3C01A775;
u32 thisInsn = 0xB0018FFC;
HeapNode*(*load_engine_data)(void) = (HeapNode* (*)(void)) obfuscated_load_engine_data; // load_engine_data - ????????
s32 hash = 0;
u32 prevInsn;
u32* it;
while (IO_READ(PI_STATUS_REG) & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY));
seed -= IO_READ(thisInsn + 0xFFFE7508);
prevInsn = 0;
for (it = (u32*) create_audio_system_obfuscated_ROM_START; it < (u32*) create_audio_system_obfuscated_ROM_END; it++) {
while (IO_READ(PI_STATUS_REG) & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY));
thisInsn = IO_READ(it + 0x4000000); // ???
hash += LOWER(thisInsn) + UPPER(thisInsn);
if (OPCODE(prevInsn) == LUI &&
OPCODE(thisInsn) == ADDIU &&
GET_RS(thisInsn) == GET_RT(prevInsn) &&
GET_RS(thisInsn) == GET_RT(thisInsn))
{
hash -= LOWER(thisInsn);
hash -= LOWER(prevInsn);
}
if (OPCODE(thisInsn) == JAL) {
hash -= LOWER(thisInsn) + (UPPER(thisInsn) & 0xFC00);
}
prevInsn = thisInsn;
}
load_engine_data += seed + 0xDDD20 - hash;
load_engine_data();
}
#endif