mirror of
https://github.com/pmret/papermario.git
synced 2024-09-18 23:42:35 +02:00
0d70e3ecac
* Remove JP dump * Add new JP dump * Fix sort_symbol_addrs to only look at one version * Deduplicate and sort symbol_addrs * Clean up JP rom if conditions * Use /current dir for diffing * Fix state_step_logos * Add todo comments for unsplitted segments * Fix draw_merlee_message * rename background_gfx * Fix background_gfx * Fix JP build * Set unused data offsets to auto
90 lines
2.6 KiB
C
90 lines
2.6 KiB
C
#include "common.h"
|
|
#include "nu/nusys.h"
|
|
#include "ld_addrs.h"
|
|
#include "mips.h"
|
|
|
|
extern s8 obfuscated_obfuscation_shims_ROM_START[];
|
|
extern s8 obfuscated_obfuscation_shims_VRAM[];
|
|
|
|
#if VERSION_JP
|
|
// TODO: split these segments
|
|
extern Addr battle_heap_create_obfuscated_ROM_START;
|
|
extern Addr battle_heap_create_obfuscated_ROM_END;
|
|
extern Addr obfuscation_shims_ROM_START;
|
|
extern Addr obfuscation_shims_ROM_END;
|
|
#endif
|
|
|
|
#ifdef SHIFT
|
|
void load_obfuscation_shims(void) {
|
|
// no-op since in shiftable builds, we bypass the obfuscation
|
|
}
|
|
#else
|
|
void load_obfuscation_shims(void) {
|
|
s32 (*readFunc)(OSPiHandle*, u32, u32*);
|
|
s32 (*readFunc2)(OSPiHandle*, u32, u32*);
|
|
s8* vramDest = obfuscated_obfuscation_shims_VRAM;
|
|
s8* romStart = obfuscated_obfuscation_shims_ROM_START;
|
|
s32 seed;
|
|
u32 hash;
|
|
u32 thisInsn;
|
|
u32 thisInsn2;
|
|
u32 prevInsn;
|
|
u8* it;
|
|
|
|
// vramDest
|
|
readFunc = osEPiReadIo;
|
|
seed = 0x0B112D28;
|
|
hash = 0;
|
|
readFunc(nuPiCartHandle, 0xB0000D10, &thisInsn);
|
|
seed -= thisInsn;
|
|
prevInsn = 0;
|
|
|
|
for (it = battle_heap_create_obfuscated_ROM_START; it < battle_heap_create_obfuscated_ROM_END; it += 4) {
|
|
readFunc(nuPiCartHandle, (u32)it, &thisInsn);
|
|
hash += LOWER(thisInsn) + UPPER(thisInsn);
|
|
|
|
if (OPCODE(prevInsn) == LUI && (OPCODE(thisInsn) == ADDIU || OPCODE(thisInsn) == LW)) {
|
|
if (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;
|
|
}
|
|
vramDest += seed + 0x2A4EB6 - hash;
|
|
|
|
// romStart
|
|
readFunc2 = osEPiReadIo;
|
|
seed = 0x18F414AB;
|
|
hash = 0;
|
|
readFunc2(nuPiCartHandle, 0xB0000E38, &thisInsn2);
|
|
seed -= thisInsn2;
|
|
prevInsn = 0;
|
|
|
|
for (it = obfuscation_shims_ROM_START; it < obfuscation_shims_ROM_END; it += 4) {
|
|
readFunc2(nuPiCartHandle, (u32)it, &thisInsn2);
|
|
hash += LOWER(thisInsn2) + UPPER(thisInsn2);
|
|
|
|
if (OPCODE(prevInsn) == LUI && (OPCODE(thisInsn2) == ADDIU || OPCODE(thisInsn2) == LW)) {
|
|
if (GET_RS(thisInsn2) == GET_RT(prevInsn) && GET_RS(thisInsn2) == GET_RT(thisInsn2)) {
|
|
hash -= LOWER(thisInsn2);
|
|
hash -= LOWER(prevInsn);
|
|
}
|
|
}
|
|
|
|
if (OPCODE(thisInsn2) == JAL) {
|
|
hash -= LOWER(thisInsn2) + (UPPER(thisInsn2) & 0xFC00);
|
|
}
|
|
prevInsn = thisInsn2;
|
|
}
|
|
romStart += seed + 0xED41C - hash;
|
|
|
|
dma_copy(romStart, obfuscation_shims_ROM_END, vramDest);
|
|
}
|
|
#endif
|