diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-06-12 09:00:45 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-06-12 09:00:45 -0400 |
commit | 1dd706599353a285534398ccdc34a9ef8bc6e549 (patch) | |
tree | 59fe6b627e49677f55343fe2de86e3147e953296 /arm9 | |
parent | e052aae076e955cd58592b8c1c57e3f008c73040 (diff) |
pokemon.c through TryDecryptMon
Diffstat (limited to 'arm9')
-rw-r--r-- | arm9/arm9.lcf | 4 | ||||
-rw-r--r-- | arm9/asm/pokemon_s.s (renamed from arm9/asm/pokemon.s) | 93 | ||||
-rw-r--r-- | arm9/asm/unk_02023C40.s | 6 | ||||
-rw-r--r-- | arm9/asm/unk_0206B16C.s | 4 | ||||
-rw-r--r-- | arm9/global.inc | 2 | ||||
-rw-r--r-- | arm9/lib/include/MI_memory.h | 2 | ||||
-rw-r--r-- | arm9/modules/05/asm/module_05.s | 2 | ||||
-rw-r--r-- | arm9/modules/14/asm/module_14.s | 2 | ||||
-rw-r--r-- | arm9/modules/83/asm/module_83.s | 2 | ||||
-rw-r--r-- | arm9/src/pokemon.c | 59 |
10 files changed, 75 insertions, 101 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf index 9fb4de49..d4544ed6 100644 --- a/arm9/arm9.lcf +++ b/arm9/arm9.lcf @@ -362,6 +362,7 @@ SECTIONS { unk_020653EC.o (.text) unk_02066840.o (.text) pokemon.o (.text) + pokemon_s.o (.text) unk_0206AB04.o (.text) unk_0206ABC4.o (.text) unk_0206B16C.o (.text) @@ -690,6 +691,7 @@ SECTIONS { unk_02064CA8.o (.rodata) unk_020653EC.o (.rodata) pokemon.o (.rodata) + pokemon_s.o (.rodata) unk_0206ABC4.o (.rodata) unk_0206B688.o (.rodata) unk_0206BF90.o (.rodata) @@ -796,6 +798,7 @@ SECTIONS { unk_0205F7A0.o (.data) unk_02060CCC.o (.data) pokemon.o (.data) + pokemon_s.o (.data) unk_02073710.o (.data) unk_020772F0.o (.data) unk_0207C328.o (.data) @@ -888,6 +891,7 @@ SECTIONS { unk_020520AC.o (.bss) unk_02052EE8.o (.bss) pokemon.o (.bss) + pokemon_s.o (.bss) unk_020772F0.o (.bss) unk_020893E0.o (.bss) unk_0208A998.o (.bss) diff --git a/arm9/asm/pokemon.s b/arm9/asm/pokemon_s.s index ec6ac699..2395e7f1 100644 --- a/arm9/asm/pokemon.s +++ b/arm9/asm/pokemon_s.s @@ -116,97 +116,6 @@ UNK_021C5AC0: ; 0x021C5AC0 .text - thumb_func_start ZeroMonData -ZeroMonData: ; 0x02066978 - push {r4, lr} - add r4, r0, #0x0 - mov r0, #0x0 - add r1, r4, #0x0 - mov r2, #0xec - bl MIi_CpuClearFast - add r0, r4, #0x0 - ldrh r2, [r4, #0x6] - add r0, #0x8 - mov r1, #0x80 - bl MonEncryptSegment - add r0, r4, #0x0 - ldr r2, [r4, #0x0] - add r0, #0x88 - mov r1, #0x64 - bl MonEncryptSegment - pop {r4, pc} - - thumb_func_start WipeBoxMonDataAndEncrypt -WipeBoxMonDataAndEncrypt: ; 0x020669A0 - push {r4, lr} - add r4, r0, #0x0 - mov r0, #0x0 - add r1, r4, #0x0 - mov r2, #0x88 - bl MIi_CpuClearFast - add r0, r4, #0x0 - ldrh r2, [r4, #0x6] - add r0, #0x8 - mov r1, #0x80 - bl MonEncryptSegment - pop {r4, pc} - - thumb_func_start SizeOfStructPokemon -SizeOfStructPokemon: ; 0x020669BC - mov r0, #0xec - bx lr - - thumb_func_start AllocMonZeroed -AllocMonZeroed: ; 0x020669C0 - push {r4, lr} - mov r1, #0xec - bl AllocFromHeap - add r4, r0, #0x0 - bl ZeroMonData - add r0, r4, #0x0 - pop {r4, pc} - .balign 4 - - thumb_func_start TryDecryptMon -TryDecryptMon: ; 0x020669D4 - push {r3-r5, lr} - add r5, r0, #0x0 - ldrh r0, [r5, #0x4] - mov r4, #0x0 - lsl r1, r0, #0x1f - lsr r1, r1, #0x1f - bne _02066A1A - lsl r0, r0, #0x1e - mov r4, #0x1 - lsr r0, r0, #0x1f - beq _020669EE - bl ErrorHandling -_020669EE: - ldrh r1, [r5, #0x4] - mov r0, #0x1 - bic r1, r0 - mov r0, #0x1 - orr r0, r1 - strh r0, [r5, #0x4] - ldrh r1, [r5, #0x4] - mov r0, #0x2 - orr r0, r1 - strh r0, [r5, #0x4] - add r0, r5, #0x0 - ldr r2, [r5, #0x0] - add r0, #0x88 - mov r1, #0x64 - bl MonDecryptSegment - add r0, r5, #0x0 - ldrh r2, [r5, #0x6] - add r0, #0x8 - mov r1, #0x80 - bl MonDecryptSegment -_02066A1A: - add r0, r4, #0x0 - pop {r3-r5, pc} - .balign 4 - thumb_func_start TryEncryptMon TryEncryptMon: ; 0x02066A20 push {r3-r5, lr} @@ -372,7 +281,7 @@ CreateBoxMon: ; 0x02066B64 push {r4-r7, lr} sub sp, #0xc add r5, r0, #0x0 - bl WipeBoxMonDataAndEncrypt + bl ZeroBoxMonData add r0, r5, #0x0 bl TryDecryptBoxMon str r0, [sp, #0x0] diff --git a/arm9/asm/unk_02023C40.s b/arm9/asm/unk_02023C40.s index 30aa59a0..9b5622d0 100644 --- a/arm9/asm/unk_02023C40.s +++ b/arm9/asm/unk_02023C40.s @@ -26,10 +26,10 @@ FUN_02023C48: ; 0x02023C48 lsl r2, r2, #0x4 bl memset add r0, r4, #0x0 - bl WipeBoxMonDataAndEncrypt + bl ZeroBoxMonData add r0, r4, #0x0 add r0, #0xec - bl WipeBoxMonDataAndEncrypt + bl ZeroBoxMonData mov r0, #0x76 mov r1, #0x0 lsl r0, r0, #0x2 @@ -187,7 +187,7 @@ _02023D38: .word 0x0000FFFF FUN_02023D3C: ; 0x02023D3C push {r4, lr} add r4, r0, #0x0 - bl WipeBoxMonDataAndEncrypt + bl ZeroBoxMonData add r0, r4, #0x0 mov r1, #0x0 add r0, #0xe8 diff --git a/arm9/asm/unk_0206B16C.s b/arm9/asm/unk_0206B16C.s index b6ec1416..465dbabb 100644 --- a/arm9/asm/unk_0206B16C.s +++ b/arm9/asm/unk_0206B16C.s @@ -28,7 +28,7 @@ _0206B188: add r5, r6, #0x0 _0206B18C: add r0, r5, #0x0 - bl WipeBoxMonDataAndEncrypt + bl ZeroBoxMonData add r4, r4, #0x1 add r5, #0x88 cmp r4, #0x1e @@ -241,7 +241,7 @@ _0206B308: mov r0, #0x88 mul r0, r2 add r0, r1, r0 - bl WipeBoxMonDataAndEncrypt + bl ZeroBoxMonData bl FUN_02022830 pop {r3, pc} _0206B32A: diff --git a/arm9/global.inc b/arm9/global.inc index ce1debbd..28f325a6 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -4705,7 +4705,7 @@ .extern FUN_02066818
.extern FUN_02066840
.extern ZeroMonData
-.extern WipeBoxMonDataAndEncrypt
+.extern ZeroBoxMonData
.extern SizeOfStructPokemon
.extern AllocMonZeroed
.extern TryDecryptMon
diff --git a/arm9/lib/include/MI_memory.h b/arm9/lib/include/MI_memory.h index bf6c0ca5..e1e5fe11 100644 --- a/arm9/lib/include/MI_memory.h +++ b/arm9/lib/include/MI_memory.h @@ -22,4 +22,6 @@ static inline void MI_CpuClear32(void *dest, u32 size) MI_CpuFill32(dest, 0, size); } +void MIi_CpuClearFast(u32 data, void *destp, u32 size); + #endif //NITRO_MI_MEMORY_H_ diff --git a/arm9/modules/05/asm/module_05.s b/arm9/modules/05/asm/module_05.s index f351ccb6..0dba71bb 100644 --- a/arm9/modules/05/asm/module_05.s +++ b/arm9/modules/05/asm/module_05.s @@ -43348,7 +43348,7 @@ _021EC6FA: add r1, r4, #0 bl FUN_0206B900 add r0, r5, #0 - bl WipeBoxMonDataAndEncrypt + bl ZeroBoxMonData add r0, r6, #0 mov r1, #0 bl FUN_02023CA0 diff --git a/arm9/modules/14/asm/module_14.s b/arm9/modules/14/asm/module_14.s index 00b933b8..8fe02035 100644 --- a/arm9/modules/14/asm/module_14.s +++ b/arm9/modules/14/asm/module_14.s @@ -9122,7 +9122,7 @@ MOD14_021DBE34: ; 0x021DBE34 push {r4, lr} add r4, r0, #0 ldr r0, [r4, #0x14] - bl WipeBoxMonDataAndEncrypt + bl ZeroBoxMonData mov r0, #1 strb r0, [r4, #0x13] add r0, r4, #0 diff --git a/arm9/modules/83/asm/module_83.s b/arm9/modules/83/asm/module_83.s index e1d37212..922e6bb5 100644 --- a/arm9/modules/83/asm/module_83.s +++ b/arm9/modules/83/asm/module_83.s @@ -21864,7 +21864,7 @@ MOD83_02237F6C: ; 0x02237F6C add r4, r1, #0 add r6, r0, #0 add r0, r4, #0 - bl WipeBoxMonDataAndEncrypt + bl ZeroBoxMonData add r0, r4, #0 bl TryDecryptBoxMon mov r1, #0 diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c new file mode 100644 index 00000000..60381e75 --- /dev/null +++ b/arm9/src/pokemon.c @@ -0,0 +1,59 @@ +#include "global.h" +#define IN_POKEMON_C +#include "pokemon.h" +#include "heap.h" +#include "MI_memory.h" + +#pragma thumb on + +void MonEncryptSegment(void * datap, u32 size, u32 key, ...); +void MonDecryptSegment(void * datap, u32 size, u32 key, ...); +u16 MonEncryptionLCRNG(u32 * seed); + +#define ENCRY_ARGS_PTY(mon) &(mon)->party, sizeof((mon)->party), (mon)->box.pid +#define ENCRY_ARGS_BOX(boxmon) &(boxmon)->substructs, sizeof((boxmon)->substructs), (boxmon)->checksum +#define ENCRYPT_PTY(mon) MonEncryptSegment(ENCRY_ARGS_PTY(mon)) +#define ENCRYPT_BOX(boxmon) MonEncryptSegment(ENCRY_ARGS_BOX(boxmon)) +#define DECRYPT_PTY(mon) MonDecryptSegment(ENCRY_ARGS_PTY(mon)) +#define DECRYPT_BOX(boxmon) MonDecryptSegment(ENCRY_ARGS_BOX(boxmon)) + +void ZeroMonData(struct Pokemon * pokemon) +{ + MIi_CpuClearFast(0, pokemon, sizeof(struct Pokemon)); + ENCRYPT_BOX(&pokemon->box); + ENCRYPT_PTY(pokemon); +} + +void ZeroBoxMonData(struct BoxPokemon * boxmon) +{ + MIi_CpuClearFast(0, boxmon, sizeof(struct BoxPokemon)); + ENCRYPT_BOX(boxmon); +} + +u32 SizeOfStructPokemon(void) +{ + return sizeof(struct Pokemon); +} + +struct Pokemon * AllocMonZeroed(u32 heap_id) +{ + struct Pokemon * pokemon = (struct Pokemon *)AllocFromHeap(heap_id, sizeof(struct Pokemon)); + ZeroMonData(pokemon); + return pokemon; +} + +BOOL TryDecryptMon(struct Pokemon * mon) +{ + BOOL ret = FALSE; + + if (!mon->box.no_encrypt) + { + ret = TRUE; + GF_ASSERT(!mon->box.control_4_1); + mon->box.no_encrypt = TRUE; + mon->box.control_4_1 = TRUE; + DECRYPT_PTY(mon); + DECRYPT_BOX(&mon->box); + } + return ret; +} |