mirror of https://github.com/pmret/papermario.git
52 lines
1.4 KiB
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
|