diff options
Diffstat (limited to 'arm9')
-rw-r--r-- | arm9/Makefile | 2 | ||||
-rw-r--r-- | arm9/arm9.lcf | 1 | ||||
-rw-r--r-- | arm9/asm/unk_0200A384.s | 84 | ||||
-rw-r--r-- | arm9/src/msgdata.c | 59 |
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); + } +} |