summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-06-19 19:32:35 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-06-19 19:32:35 -0400
commit669fafdcf6929def1bdc82805f57daa0b75c245e (patch)
tree69198d5bacc534653ec5e8e2df9c3604eba31711
parent06a7bf4c8c36af699b9882623d2642baf0269bf3 (diff)
through FUN_0200A76C
-rw-r--r--arm9/asm/unk_0200A384.s539
-rw-r--r--arm9/lib/include/MI_memory.h5
-rw-r--r--arm9/src/msgdata.c193
-rw-r--r--include/string16.h2
4 files changed, 199 insertions, 540 deletions
diff --git a/arm9/asm/unk_0200A384.s b/arm9/asm/unk_0200A384.s
index 26e615af..0016d0d7 100644
--- a/arm9/asm/unk_0200A384.s
+++ b/arm9/asm/unk_0200A384.s
@@ -6,538 +6,13 @@
.extern LoadSingleElementFromNarc
.extern FreeMsgDataRawData
.extern DecryptMessageDirect
-
- thumb_func_start DecryptMessageViaNewNarcHandle
-DecryptMessageViaNewNarcHandle: ; 0x0200A418
- ; r0: narc_id
- ; r1: ???
- ; r2: ???
- ; r3: heap_id
- push {r4-r6, lr}
- sub sp, #0x10
- add r5, r1, #0x0
- add r1, r3, #0x0
- add r4, r2, #0x0
- bl NARC_ctor
- add r6, r0, #0x0
- beq _0200A4AE
- add r1, sp, #0xc
- str r1, [sp, #0x0]
- add r1, r5, #0x0
- mov r2, #0x0
- mov r3, #0x4
- bl NARC_ReadFromMember
- add r0, sp, #0x4
- lsl r2, r4, #0x3
- str r0, [sp, #0x0]
- add r0, r6, #0x0
- add r1, r5, #0x0
- add r2, r2, #0x4
- mov r3, #0x8
- bl NARC_ReadFromMember
- add r0, sp, #0x4
- ldrh r2, [r0, #0xa]
- ldr r0, _0200A4B4 ; =0x000002FD
- add r1, r4, #0x1
- mul r0, r2
- mul r0, r1
- lsl r0, r0, #0x10
- lsr r1, r0, #0x10
- lsl r0, r1, #0x10
- orr r1, r0
- ldr r0, [sp, #0x4]
- eor r0, r1
- str r0, [sp, #0x4]
- ldr r0, [sp, #0x8]
- eor r0, r1
- str r0, [sp, #0x8]
- ldr r0, [sp, #0x20]
- add r1, r5, #0x0
- str r0, [sp, #0x0]
- ldr r3, [sp, #0x8]
- ldr r2, [sp, #0x4]
- add r0, r6, #0x0
- lsl r3, r3, #0x1
- bl NARC_ReadFromMember
- ldr r2, _0200A4B8 ; =0x00091BD3
- add r3, r4, #0x1
- mul r2, r3
- lsl r2, r2, #0x10
- ldr r0, [sp, #0x8]
- lsr r3, r2, #0x10
- sub r2, r0, #0x1
- ldr r1, [sp, #0x20]
- cmp r0, #0x0
- beq _0200A4A8
- ldr r0, _0200A4BC ; =0x0000493D
-_0200A492:
- ldrh r4, [r1, #0x0]
- eor r4, r3
- strh r4, [r1, #0x0]
- add r3, r3, r0
- lsl r3, r3, #0x10
- add r4, r2, #0x0
- add r1, r1, #0x2
- lsr r3, r3, #0x10
- sub r2, r2, #0x1
- cmp r4, #0x0
- bne _0200A492
-_0200A4A8:
- add r0, r6, #0x0
- bl NARC_dtor
-_0200A4AE:
- add sp, #0x10
- pop {r4-r6, pc}
- nop
-_0200A4B4: .word 0x000002FD
-_0200A4B8: .word 0x00091BD3
-_0200A4BC: .word 0x0000493D
-
- thumb_func_start CopyEncryptedMessage16
-CopyEncryptedMessage16: ; 0x0200A4C0
- add r3, r0, #0x0
- add r0, r1, #0x0
- add r1, r3, #0x0
- ldr r2, [r2, #0x4]
- ldr r3, _0200A4D0 ; =MIi_CpuCopy16
- lsl r2, r2, #0x1
- bx r3
- nop
-_0200A4D0: .word MIi_CpuCopy16
-
- thumb_func_start FUN_0200A4D4
-FUN_0200A4D4: ; 0x0200A4D4
- push {r3-r7, lr}
- sub sp, #0x10
- add r5, r0, #0x0
- ldrh r0, [r5, #0x0]
- add r4, r1, #0x0
- str r2, [sp, #0x0]
- cmp r4, r0
- bhs _0200A56A
- lsl r0, r4, #0x3
- add r0, r5, r0
- ldr r3, [r0, #0x4]
- ldr r2, [r0, #0x8]
- ldrh r1, [r5, #0x2]
- ldr r6, _0200A578 ; =0x000002FD
- add r0, r4, #0x1
- mul r6, r1
- add r1, r0, #0x0
- mul r1, r6
- lsl r0, r1, #0x10
- lsr r1, r0, #0x10
- lsl r0, r1, #0x10
- orr r1, r0
- add r0, r3, #0x0
- add r6, r2, #0x0
- str r3, [sp, #0x8]
- eor r0, r1
- eor r6, r1
- str r0, [sp, #0x8]
- lsl r0, r6, #0x1
- str r0, [sp, #0x4]
- str r2, [sp, #0xc]
- ldr r1, [sp, #0x4]
- mov r0, #0x0
- str r6, [sp, #0xc]
- bl AllocFromHeapAtEnd
- add r7, r0, #0x0
- beq _0200A574
- ldr r0, [sp, #0x8]
- ldr r2, [sp, #0x4]
- add r0, r5, r0
- add r1, r7, #0x0
- bl MIi_CpuCopy16
- ldr r1, _0200A57C ; =0x00091BD3
- add r2, r4, #0x1
- mul r1, r2
- lsl r1, r1, #0x10
- lsr r2, r1, #0x10
- add r0, r7, #0x0
- sub r1, r6, #0x1
- cmp r6, #0x0
- beq _0200A556
- ldr r3, _0200A580 ; =0x0000493D
-_0200A540:
- ldrh r4, [r0, #0x0]
- eor r4, r2
- strh r4, [r0, #0x0]
- add r2, r2, r3
- lsl r2, r2, #0x10
- add r4, r1, #0x0
- add r0, r0, #0x2
- lsr r2, r2, #0x10
- sub r1, r1, #0x1
- cmp r4, #0x0
- bne _0200A540
-_0200A556:
- ldr r0, [sp, #0x0]
- add r1, r7, #0x0
- add r2, r6, #0x0
- bl FUN_02021E8C
- add r0, r7, #0x0
- bl FreeToHeap
- add sp, #0x10
- pop {r3-r7, pc}
-_0200A56A:
- bl ErrorHandling
- ldr r0, [sp, #0x0]
- bl FUN_02021A4C
-_0200A574:
- add sp, #0x10
- pop {r3-r7, pc}
- .balign 4
-_0200A578: .word 0x000002FD
-_0200A57C: .word 0x00091BD3
-_0200A580: .word 0x0000493D
-
- thumb_func_start FUN_0200A584
-FUN_0200A584: ; 0x0200A584
- push {r3-r7, lr}
- sub sp, #0x10
- add r5, r0, #0x0
- ldrh r0, [r5, #0x0]
- add r4, r1, #0x0
- str r2, [sp, #0x0]
- cmp r4, r0
- bhs _0200A62C
- lsl r0, r4, #0x3
- add r0, r5, r0
- ldr r3, [r0, #0x4]
- ldr r2, [r0, #0x8]
- ldrh r1, [r5, #0x2]
- ldr r6, _0200A63C ; =0x000002FD
- add r0, r4, #0x1
- mul r6, r1
- add r1, r0, #0x0
- mul r1, r6
- lsl r0, r1, #0x10
- lsr r1, r0, #0x10
- lsl r0, r1, #0x10
- orr r1, r0
- add r0, r3, #0x0
- add r6, r2, #0x0
- str r3, [sp, #0x8]
- eor r0, r1
- eor r6, r1
- str r0, [sp, #0x8]
- lsl r0, r6, #0x1
- str r0, [sp, #0x4]
- str r2, [sp, #0xc]
- ldr r0, [sp, #0x0]
- ldr r1, [sp, #0x4]
- str r6, [sp, #0xc]
- bl AllocFromHeapAtEnd
- add r7, r0, #0x0
- beq _0200A626
- ldr r0, [sp, #0x8]
- ldr r2, [sp, #0x4]
- add r0, r5, r0
- add r1, r7, #0x0
- bl MIi_CpuCopy16
- ldr r1, _0200A640 ; =0x00091BD3
- add r2, r4, #0x1
- mul r1, r2
- lsl r1, r1, #0x10
- lsr r2, r1, #0x10
- add r0, r7, #0x0
- sub r1, r6, #0x1
- cmp r6, #0x0
- beq _0200A606
- ldr r3, _0200A644 ; =0x0000493D
-_0200A5F0:
- ldrh r4, [r0, #0x0]
- eor r4, r2
- strh r4, [r0, #0x0]
- add r2, r2, r3
- lsl r2, r2, #0x10
- add r4, r1, #0x0
- add r0, r0, #0x2
- lsr r2, r2, #0x10
- sub r1, r1, #0x1
- cmp r4, #0x0
- bne _0200A5F0
-_0200A606:
- ldr r1, [sp, #0x0]
- add r0, r6, #0x0
- bl FUN_020219F4
- add r4, r0, #0x0
- beq _0200A61A
- add r1, r7, #0x0
- add r2, r6, #0x0
- bl FUN_02021E8C
-_0200A61A:
- add r0, r7, #0x0
- bl FreeToHeap
- add sp, #0x10
- add r0, r4, #0x0
- pop {r3-r7, pc}
-_0200A626:
- add sp, #0x10
- mov r0, #0x0
- pop {r3-r7, pc}
-_0200A62C:
- bl ErrorHandling
- ldr r1, [sp, #0x0]
- mov r0, #0x4
- bl FUN_020219F4
- add sp, #0x10
- pop {r3-r7, pc}
- .balign 4
-_0200A63C: .word 0x000002FD
-_0200A640: .word 0x00091BD3
-_0200A644: .word 0x0000493D
-
- thumb_func_start FUN_0200A648
-FUN_0200A648: ; 0x0200A648
- push {r3-r7, lr}
- add r7, r3, #0x0
- add r5, r1, #0x0
- add r1, r7, #0x0
- add r4, r2, #0x0
- bl NARC_ctor
- add r6, r0, #0x0
- beq _0200A66E
- ldr r1, [sp, #0x18]
- add r2, r4, #0x0
- str r1, [sp, #0x0]
- add r1, r5, #0x0
- add r3, r7, #0x0
- bl FUN_0200A670
- add r0, r6, #0x0
- bl NARC_dtor
-_0200A66E:
- pop {r3-r7, pc}
-
- thumb_func_start FUN_0200A670
-FUN_0200A670: ; 0x0200A670
- push {r4-r7, lr}
- sub sp, #0x14
- add r5, r2, #0x0
- add r2, sp, #0x10
- add r4, r3, #0x0
- str r2, [sp, #0x0]
- mov r2, #0x0
- mov r3, #0x4
- add r7, r0, #0x0
- str r1, [sp, #0x4]
- bl NARC_ReadFromMember
- add r0, sp, #0x8
- ldrh r0, [r0, #0x8]
- cmp r5, r0
- bhs _0200A71E
- add r0, sp, #0x8
- lsl r2, r5, #0x3
- str r0, [sp, #0x0]
- ldr r1, [sp, #0x4]
- add r0, r7, #0x0
- add r2, r2, #0x4
- mov r3, #0x8
- bl NARC_ReadFromMember
- add r0, sp, #0x8
- ldrh r2, [r0, #0xa]
- ldr r0, _0200A72C ; =0x000002FD
- add r1, r5, #0x1
- mul r0, r2
- mul r0, r1
- lsl r0, r0, #0x10
- lsr r1, r0, #0x10
- lsl r0, r1, #0x10
- orr r1, r0
- ldr r0, [sp, #0x8]
- eor r0, r1
- str r0, [sp, #0x8]
- ldr r0, [sp, #0xc]
- eor r0, r1
- lsl r6, r0, #0x1
- str r0, [sp, #0xc]
- add r0, r4, #0x0
- add r1, r6, #0x0
- bl AllocFromHeapAtEnd
- add r4, r0, #0x0
- beq _0200A728
- str r4, [sp, #0x0]
- ldr r1, [sp, #0x4]
- ldr r2, [sp, #0x8]
- add r0, r7, #0x0
- add r3, r6, #0x0
- bl NARC_ReadFromMember
- ldr r2, _0200A730 ; =0x00091BD3
- add r3, r5, #0x1
- mul r2, r3
- lsl r2, r2, #0x10
- ldr r0, [sp, #0xc]
- lsr r3, r2, #0x10
- add r1, r4, #0x0
- sub r2, r0, #0x1
- cmp r0, #0x0
- beq _0200A70A
- ldr r0, _0200A734 ; =0x0000493D
-_0200A6F4:
- ldrh r5, [r1, #0x0]
- eor r5, r3
- strh r5, [r1, #0x0]
- add r3, r3, r0
- lsl r3, r3, #0x10
- add r5, r2, #0x0
- add r1, r1, #0x2
- lsr r3, r3, #0x10
- sub r2, r2, #0x1
- cmp r5, #0x0
- bne _0200A6F4
-_0200A70A:
- ldr r0, [sp, #0x28]
- ldr r2, [sp, #0xc]
- add r1, r4, #0x0
- bl FUN_02021E8C
- add r0, r4, #0x0
- bl FreeToHeap
- add sp, #0x14
- pop {r4-r7, pc}
-_0200A71E:
- bl ErrorHandling
- ldr r0, [sp, #0x28]
- bl FUN_02021A4C
-_0200A728:
- add sp, #0x14
- pop {r4-r7, pc}
- .balign 4
-_0200A72C: .word 0x000002FD
-_0200A730: .word 0x00091BD3
-_0200A734: .word 0x0000493D
-
- thumb_func_start FUN_0200A738
-FUN_0200A738: ; 0x0200A738
- push {r3-r7, lr}
- add r6, r3, #0x0
- add r5, r1, #0x0
- add r1, r6, #0x0
- add r4, r2, #0x0
- bl NARC_ctor
- add r7, r0, #0x0
- beq _0200A75E
- add r1, r5, #0x0
- add r2, r4, #0x0
- add r3, r6, #0x0
- bl FUN_0200A76C
- add r4, r0, #0x0
- add r0, r7, #0x0
- bl NARC_dtor
- b _0200A768
-_0200A75E:
- mov r0, #0x4
- add r1, r6, #0x0
- bl FUN_020219F4
- add r4, r0, #0x0
-_0200A768:
- add r0, r4, #0x0
- pop {r3-r7, pc}
-
- thumb_func_start FUN_0200A76C
-FUN_0200A76C: ; 0x0200A76C
- push {r3-r7, lr}
- sub sp, #0x18
- add r4, r2, #0x0
- add r2, sp, #0x14
- add r5, r3, #0x0
- str r2, [sp, #0x0]
- mov r2, #0x0
- mov r3, #0x4
- add r7, r0, #0x0
- str r1, [sp, #0x4]
- bl NARC_ReadFromMember
- add r0, sp, #0xc
- ldrh r0, [r0, #0x8]
- cmp r4, r0
- bhs _0200A82A
- add r0, sp, #0xc
- lsl r2, r4, #0x3
- str r0, [sp, #0x0]
- ldr r1, [sp, #0x4]
- add r0, r7, #0x0
- add r2, r2, #0x4
- mov r3, #0x8
- bl NARC_ReadFromMember
- add r0, sp, #0xc
- ldrh r2, [r0, #0xa]
- ldr r0, _0200A83C ; =0x000002FD
- add r1, r4, #0x1
- mul r0, r2
- mul r0, r1
- lsl r0, r0, #0x10
- lsr r1, r0, #0x10
- lsl r0, r1, #0x10
- orr r1, r0
- ldr r0, [sp, #0xc]
- eor r0, r1
- str r0, [sp, #0xc]
- ldr r0, [sp, #0x10]
- eor r0, r1
- add r1, r5, #0x0
- str r0, [sp, #0x10]
- bl FUN_020219F4
- str r0, [sp, #0x8]
- cmp r0, #0x0
- beq _0200A824
- ldr r0, [sp, #0x10]
- lsl r6, r0, #0x1
- add r0, r5, #0x0
- add r1, r6, #0x0
- bl AllocFromHeapAtEnd
- add r5, r0, #0x0
- beq _0200A824
- str r5, [sp, #0x0]
- ldr r1, [sp, #0x4]
- ldr r2, [sp, #0xc]
- add r0, r7, #0x0
- add r3, r6, #0x0
- bl NARC_ReadFromMember
- ldr r2, _0200A840 ; =0x00091BD3
- add r3, r4, #0x1
- mul r2, r3
- lsl r2, r2, #0x10
- ldr r0, [sp, #0x10]
- lsr r3, r2, #0x10
- add r1, r5, #0x0
- sub r2, r0, #0x1
- cmp r0, #0x0
- beq _0200A814
- ldr r0, _0200A844 ; =0x0000493D
-_0200A7FE:
- ldrh r4, [r1, #0x0]
- eor r4, r3
- strh r4, [r1, #0x0]
- add r3, r3, r0
- lsl r3, r3, #0x10
- add r4, r2, #0x0
- add r1, r1, #0x2
- lsr r3, r3, #0x10
- sub r2, r2, #0x1
- cmp r4, #0x0
- bne _0200A7FE
-_0200A814:
- ldr r0, [sp, #0x8]
- ldr r2, [sp, #0x10]
- add r1, r5, #0x0
- bl FUN_02021E8C
- add r0, r5, #0x0
- bl FreeToHeap
-_0200A824:
- ldr r0, [sp, #0x8]
- add sp, #0x18
- pop {r3-r7, pc}
-_0200A82A:
- bl ErrorHandling
- mov r0, #0x4
- add r1, r5, #0x0
- bl FUN_020219F4
- add sp, #0x18
- pop {r3-r7, pc}
- nop
-_0200A83C: .word 0x000002FD
-_0200A840: .word 0x00091BD3
-_0200A844: .word 0x0000493D
+.extern DecryptMessageViaNewNarcHandle
+.extern CopyEncryptedMessage16
+.extern FUN_0200A4D4
+.extern FUN_0200A584
+.extern FUN_0200A648
+.extern FUN_0200A670
+.extern FUN_0200A76C
thumb_func_start FUN_0200A848
FUN_0200A848: ; 0x0200A848
diff --git a/arm9/lib/include/MI_memory.h b/arm9/lib/include/MI_memory.h
index e1e5fe11..c39c7895 100644
--- a/arm9/lib/include/MI_memory.h
+++ b/arm9/lib/include/MI_memory.h
@@ -22,6 +22,11 @@ static inline void MI_CpuClear32(void *dest, u32 size)
MI_CpuFill32(dest, 0, size);
}
+static inline void MI_CpuCopy16(const void *src, void *dest, u32 size)
+{
+ MIi_CpuCopy16(src, dest, size);
+}
+
void MIi_CpuClearFast(u32 data, void *destp, u32 size);
#endif //NITRO_MI_MEMORY_H_
diff --git a/arm9/src/msgdata.c b/arm9/src/msgdata.c
index b3a1c027..007cb471 100644
--- a/arm9/src/msgdata.c
+++ b/arm9/src/msgdata.c
@@ -2,6 +2,8 @@
#include "filesystem.h"
#include "msg_data.h"
#include "heap.h"
+#include "MI_memory.h"
+#include "string16.h"
#pragma thumb on
@@ -9,6 +11,13 @@ 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 DecryptMessageViaNewNarcHandle(NarcId narc_id, u32 group, u32 num, u32 heap_id, u16 * dest);
+void FUN_0200A4D4(struct UnkStruct_200A394 * r5, u32 r4, struct String * dest);
+struct String * FUN_0200A584(struct UnkStruct_200A394 * r5, u32 r4, u32 heap_id);
+void FUN_0200A648(NarcId narc_id, u32 group, u32 num, u32 heap_id, struct String * dest);
+void FUN_0200A670(NARC * narc, u32 group, u32 num, u32 heap_id, struct String * dest);
+struct String * FUN_0200A738(NarcId narc_id, u32 group, u32 num, u32 heap_id);
+struct String * FUN_0200A76C(NARC * narc, u32 group, u32 num, u32 heap_id);
void * LoadSingleElementFromNarc(NarcId narc_id, s32 file_id, u32 heap_id)
{
@@ -30,30 +39,198 @@ inline static void Decrypt1(struct UnkStruct_200A394_4 * arg0, u32 arg1, u32 see
inline static void Decrypt2(u16 * arg0, u32 count, u32 arg2)
{
- u16 seed = (arg2 + 1) * 596947;
+ u16 seed = (u16)((arg2 + 1) * 596947);
while (count-- > 0)
{
*arg0 ^= seed;
- seed += 18749;
arg0++;
+ seed += 18749;
}
}
-void DecryptMessageDirect(struct UnkStruct_200A394 * r3, u32 r5, u16 * r4)
+void DecryptMessageDirect(struct UnkStruct_200A394 * table, u32 num, u16 * dest)
{
struct UnkStruct_200A394_4 sp0;
- if (r5 < r3->unk0)
+ if (num < table->unk0)
+ {
+ sp0 = table->unk4[num];
+ Decrypt1(&sp0, num, table->unk2);
+
+ CopyEncryptedMessage16(dest, (const u16 *)((u8 *)table + sp0.unk0), &sp0);
+ Decrypt2(dest, sp0.unk4, num);
+ }
+ else
+ {
+ GF_ASSERT(0);
+ }
+}
+
+void DecryptMessageViaNewNarcHandle(NarcId narc_id, u32 group, u32 num, u32 heap_id, u16 * dest)
+{
+ NARC * narc = NARC_ctor(narc_id, heap_id);
+ u16 spC[2];
+ struct UnkStruct_200A394_4 sp4;
+ if (narc != NULL)
{
- sp0 = r3->unk4[r5];
- Decrypt1(&sp0, r5, r3->unk2);
+ NARC_ReadFromMember(narc, group, 0, 4, spC);
+ NARC_ReadFromMember(narc, group, 8 * num + 4, 8, &sp4);
+ Decrypt1(&sp4, num, spC[1]);
+ NARC_ReadFromMember(narc, group, sp4.unk0, 2 * sp4.unk4, dest);
+ Decrypt2(dest, sp4.unk4, num);
+ NARC_dtor(narc);
+ }
+}
- CopyEncryptedMessage16(r4, (const u16 *)((u8 *)r3 + sp0.unk0), &sp0);
- Decrypt2(r4, sp0.unk4, r5);
+void CopyEncryptedMessage16(u16 * dest, const u16 * src, struct UnkStruct_200A394_4 * param)
+{
+ MI_CpuCopy16(src, dest, 2 * param->unk4);
+}
+
+void FUN_0200A4D4(struct UnkStruct_200A394 * table, u32 num, struct String * dest)
+{
+ struct UnkStruct_200A394_4 sp4;
+ u16 * buf;
+ if (num < table->unk0)
+ {
+ sp4 = table->unk4[num];
+ Decrypt1(&sp4, num, table->unk2);
+ buf = AllocFromHeapAtEnd(0, 2 * sp4.unk4);
+ if (buf != NULL)
+ {
+ MI_CpuCopy16((char *)table + sp4.unk0, buf, 2 * sp4.unk4);
+ Decrypt2(buf, sp4.unk4, num);
+ FUN_02021E8C(dest, buf, sp4.unk4);
+ FreeToHeap(buf);
+ }
+ }
+ else
+ {
+ GF_ASSERT(0);
+ FUN_02021A4C(dest);
+ }
+}
+
+struct String * FUN_0200A584(struct UnkStruct_200A394 * table, u32 num, u32 heap_id)
+{
+ struct UnkStruct_200A394_4 sp4;
+ u16 * buf;
+ struct String * dest;
+ if (num < table->unk0)
+ {
+ sp4 = table->unk4[num];
+ Decrypt1(&sp4, num, table->unk2);
+ buf = AllocFromHeapAtEnd(heap_id, 2 * sp4.unk4);
+ if (buf != NULL)
+ {
+ MI_CpuCopy16((char *)table + sp4.unk0, buf, 2 * sp4.unk4);
+ Decrypt2(buf, sp4.unk4, num);
+ dest = FUN_020219F4(sp4.unk4, heap_id);
+ if (dest != NULL)
+ FUN_02021E8C(dest, buf, sp4.unk4);
+ FreeToHeap(buf);
+ return dest;
+ }
+ else
+ {
+ return NULL;
+ }
+ }
+ else
+ {
+ GF_ASSERT(0);
+ return FUN_020219F4(4, heap_id);
+ }
+}
+
+void FUN_0200A648(NarcId narc_id, u32 group, u32 num, u32 heap_id, struct String * dest)
+{
+ NARC * narc = NARC_ctor(narc_id, heap_id);
+ if (narc != NULL)
+ {
+ FUN_0200A670(narc, group, num, heap_id, dest);
+ NARC_dtor(narc);
+ }
+}
+
+void FUN_0200A670(NARC * narc, u32 group, u32 num, u32 heap_id, struct String * dest)
+{
+ u16 * buf;
+ u32 size;
+ u16 sp10[2];
+ struct UnkStruct_200A394_4 sp8;
+
+ NARC_ReadFromMember(narc, group, 0, 4, sp10);
+ if (num < sp10[0])
+ {
+ NARC_ReadFromMember(narc, group, 8 * num + 4, 8, &sp8);
+ Decrypt1(&sp8, num, sp10[1]);
+ size = sp8.unk4 * 2;
+ buf = AllocFromHeapAtEnd(heap_id, size);
+ if (buf != NULL)
+ {
+ NARC_ReadFromMember(narc, group, sp8.unk0, size, buf);
+ Decrypt2(buf, sp8.unk4, num);
+ FUN_02021E8C(dest, buf, sp8.unk4);
+ FreeToHeap(buf);
+ return;
+ }
+ }
+ else
+ {
+ GF_ASSERT(0);
+ FUN_02021A4C(dest);
+ }
+}
+
+struct String * FUN_0200A738(NarcId narc_id, u32 group, u32 num, u32 heap_id)
+{
+ NARC * narc = NARC_ctor(narc_id, heap_id);
+ struct String * string;
+ if (narc != NULL)
+ {
+ string = FUN_0200A76C(narc, group, num, heap_id);
+ NARC_dtor(narc);
+ }
+ else
+ {
+ string = FUN_020219F4(4, heap_id);
+ }
+ return string;
+}
+
+struct String * FUN_0200A76C(NARC * narc, u32 group, u32 num, u32 heap_id)
+{
+ struct String * dest;
+ u16 * buf;
+ u32 size;
+ u16 sp10[2];
+ struct UnkStruct_200A394_4 sp8;
+
+ NARC_ReadFromMember(narc, group, 0, 4, sp10);
+ if (num < sp10[0])
+ {
+ NARC_ReadFromMember(narc, group, 8 * num + 4, 8, &sp8);
+ Decrypt1(&sp8, num, sp10[1]);
+ dest = FUN_020219F4(sp8.unk4, heap_id);
+ if (dest != NULL)
+ {
+ size = sp8.unk4 * 2;
+ buf = AllocFromHeapAtEnd(heap_id, size);
+ if (buf != NULL)
+ {
+ NARC_ReadFromMember(narc, group, sp8.unk0, size, buf);
+ Decrypt2(buf, sp8.unk4, num);
+ FUN_02021E8C(dest, buf, sp8.unk4);
+ FreeToHeap(buf);
+ }
+ }
+ return dest;
}
else
{
GF_ASSERT(0);
+ return FUN_020219F4(4, heap_id);
}
}
diff --git a/include/string16.h b/include/string16.h
index 7092c641..6bbf567d 100644
--- a/include/string16.h
+++ b/include/string16.h
@@ -13,5 +13,7 @@ struct String
struct String * FUN_020219F4(u32 count, u32 heap_id);
int FUN_02021CE0(struct String *, struct String *);
int FUN_0206AE00(int x);
+void FUN_02021E8C(struct String *, u16 *, u32); // copy
+void FUN_02021A4C(struct String *); // set empty
#endif //POKEDIAMOND_STRING16_H