summaryrefslogtreecommitdiff
path: root/arm9
diff options
context:
space:
mode:
Diffstat (limited to 'arm9')
-rw-r--r--arm9/Makefile2
-rw-r--r--arm9/arm9.lcf1
-rw-r--r--arm9/asm/unk_0200A384.s84
-rw-r--r--arm9/src/msgdata.c59
4 files changed, 64 insertions, 82 deletions
diff --git a/arm9/Makefile b/arm9/Makefile
index cb8eba06..17033200 100644
--- a/arm9/Makefile
+++ b/arm9/Makefile
@@ -158,7 +158,7 @@ OVERLAYS := \
##################### Compiler Options #######################
-MWCCVERSION = 2.0/base
+MWCCVERSION = 2.0/sp1
TOOLS_DIR = ../tools
CROSS := arm-none-eabi-
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf
index 8150b54e..594783bf 100644
--- a/arm9/arm9.lcf
+++ b/arm9/arm9.lcf
@@ -144,6 +144,7 @@ SECTIONS {
unk_02008AA4.o (.text)
unk_02008DEC.o (.text)
unk_02009EAC.o (.text)
+ msgdata.o (.text)
unk_0200A384.o (.text)
unk_0200AA80.o (.text)
unk_0200BA78.o (.text)
diff --git a/arm9/asm/unk_0200A384.s b/arm9/asm/unk_0200A384.s
index 0584dfbf..26e615af 100644
--- a/arm9/asm/unk_0200A384.s
+++ b/arm9/asm/unk_0200A384.s
@@ -3,87 +3,9 @@
.text
- thumb_func_start LoadSingleElementFromNarc
-LoadSingleElementFromNarc: ; 0x0200A384
- ldr r3, _0200A388 ; =AllocAndReadWholeNarcMemberByIdPair
- bx r3
- .balign 4
-_0200A388: .word AllocAndReadWholeNarcMemberByIdPair
-
- thumb_func_start FreeMsgDataRawData
-FreeMsgDataRawData: ; 0x0200A38C
- ldr r3, _0200A390 ; =FreeToHeap
- bx r3
- .balign 4
-_0200A390: .word FreeToHeap
-
- thumb_func_start DecryptMessageDirect
-DecryptMessageDirect: ; 0x0200A394
- push {r3-r7, lr}
- sub sp, #0x8
- add r3, r0, #0x0
- ldrh r0, [r3, #0x0]
- add r5, r1, #0x0
- add r4, r2, #0x0
- cmp r5, r0
- bhs _0200A404
- lsl r0, r5, #0x3
- add r0, r3, r0
- ldr r2, [r0, #0x4]
- ldr r1, [r0, #0x8]
- ldr r6, _0200A40C ; =0x000002FD
- str r2, [sp, #0x0]
- str r1, [sp, #0x4]
- ldrh r0, [r3, #0x2]
- add r7, r5, #0x1
- mul r6, r0
- add r0, r7, #0x0
- mul r0, r6
- lsl r0, r0, #0x10
- lsr r6, r0, #0x10
- lsl r0, r6, #0x10
- orr r0, r6
- eor r2, r0
- eor r0, r1
- str r0, [sp, #0x4]
- str r2, [sp, #0x0]
- add r1, r3, r2
- add r0, r4, #0x0
- add r2, sp, #0x0
- bl CopyEncryptedMessage16
- ldr r2, [sp, #0x4]
- ldr r0, _0200A410 ; =0x00091BD3
- add r1, r7, #0x0
- mul r0, r1
- lsl r0, r0, #0x10
- lsr r5, r0, #0x10
- sub r3, r2, #0x1
- cmp r2, #0x0
- beq _0200A408
- ldr r0, _0200A414 ; =0x0000493D
-_0200A3EA:
- ldrh r1, [r4, #0x0]
- eor r1, r5
- strh r1, [r4, #0x0]
- add r1, r5, r0
- lsl r1, r1, #0x10
- lsr r5, r1, #0x10
- add r1, r3, #0x0
- add r4, r4, #0x2
- sub r3, r3, #0x1
- cmp r1, #0x0
- bne _0200A3EA
- add sp, #0x8
- pop {r3-r7, pc}
-_0200A404:
- bl ErrorHandling
-_0200A408:
- add sp, #0x8
- pop {r3-r7, pc}
- .balign 4
-_0200A40C: .word 0x000002FD
-_0200A410: .word 0x00091BD3
-_0200A414: .word 0x0000493D
+.extern LoadSingleElementFromNarc
+.extern FreeMsgDataRawData
+.extern DecryptMessageDirect
thumb_func_start DecryptMessageViaNewNarcHandle
DecryptMessageViaNewNarcHandle: ; 0x0200A418
diff --git a/arm9/src/msgdata.c b/arm9/src/msgdata.c
new file mode 100644
index 00000000..b3a1c027
--- /dev/null
+++ b/arm9/src/msgdata.c
@@ -0,0 +1,59 @@
+#include "global.h"
+#include "filesystem.h"
+#include "msg_data.h"
+#include "heap.h"
+
+#pragma thumb on
+
+void * LoadSingleElementFromNarc(NarcId narc_id, s32 file_id, u32 heap_id);
+void FreeMsgDataRawData(void * data);
+void CopyEncryptedMessage16(u16 * dest, const u16 * src, struct UnkStruct_200A394_4 * param);
+void DecryptMessageDirect(struct UnkStruct_200A394 * r3, u32 r5, u16 * r4);
+
+void * LoadSingleElementFromNarc(NarcId narc_id, s32 file_id, u32 heap_id)
+{
+ return AllocAndReadWholeNarcMemberByIdPair(narc_id, file_id, heap_id);
+}
+
+void FreeMsgDataRawData(void * data)
+{
+ FreeToHeap(data);
+}
+
+inline static void Decrypt1(struct UnkStruct_200A394_4 * arg0, u32 arg1, u32 seed)
+{
+ seed = seed * 765 * (arg1 + 1) & 0xffff;
+ seed |= seed << 16;
+ arg0->unk0 ^= seed;
+ arg0->unk4 ^= seed;
+}
+
+inline static void Decrypt2(u16 * arg0, u32 count, u32 arg2)
+{
+ u16 seed = (arg2 + 1) * 596947;
+
+ while (count-- > 0)
+ {
+ *arg0 ^= seed;
+ seed += 18749;
+ arg0++;
+ }
+}
+
+void DecryptMessageDirect(struct UnkStruct_200A394 * r3, u32 r5, u16 * r4)
+{
+ struct UnkStruct_200A394_4 sp0;
+
+ if (r5 < r3->unk0)
+ {
+ sp0 = r3->unk4[r5];
+ Decrypt1(&sp0, r5, r3->unk2);
+
+ CopyEncryptedMessage16(r4, (const u16 *)((u8 *)r3 + sp0.unk0), &sp0);
+ Decrypt2(r4, sp0.unk4, r5);
+ }
+ else
+ {
+ GF_ASSERT(0);
+ }
+}