summaryrefslogtreecommitdiff
path: root/arm9
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-06-12 09:00:45 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-06-12 09:00:45 -0400
commit1dd706599353a285534398ccdc34a9ef8bc6e549 (patch)
tree59fe6b627e49677f55343fe2de86e3147e953296 /arm9
parente052aae076e955cd58592b8c1c57e3f008c73040 (diff)
pokemon.c through TryDecryptMon
Diffstat (limited to 'arm9')
-rw-r--r--arm9/arm9.lcf4
-rw-r--r--arm9/asm/pokemon_s.s (renamed from arm9/asm/pokemon.s)93
-rw-r--r--arm9/asm/unk_02023C40.s6
-rw-r--r--arm9/asm/unk_0206B16C.s4
-rw-r--r--arm9/global.inc2
-rw-r--r--arm9/lib/include/MI_memory.h2
-rw-r--r--arm9/modules/05/asm/module_05.s2
-rw-r--r--arm9/modules/14/asm/module_14.s2
-rw-r--r--arm9/modules/83/asm/module_83.s2
-rw-r--r--arm9/src/pokemon.c59
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;
+}