summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémi Calixte <remicalixte.rmc@gmail.com>2021-03-18 20:03:46 +0100
committerRémi Calixte <remicalixte.rmc@gmail.com>2021-03-18 20:03:46 +0100
commit6f8f78f701185bf65d962e46ab62d4a0457c53d9 (patch)
tree2b72d712fc508a8bb22d5bd879b403f4147e06e4
parentdc241048eeac3cb560f621658dafc107226722fd (diff)
finish heap.c
-rw-r--r--arm9/arm9.lsf3
-rw-r--r--arm9/asm/unk_020166C8.s283
-rw-r--r--arm9/modules/05/src/mod05_021E72FC.c2
-rw-r--r--arm9/modules/52/src/module_52.c4
-rw-r--r--arm9/modules/59/src/mod59_021D74E0_src.c3
-rw-r--r--arm9/src/game_init.c5
-rw-r--r--arm9/src/heap.c (renamed from arm9/src/unk_020166C8_c.c)242
-rw-r--r--include/heap.h34
8 files changed, 242 insertions, 334 deletions
diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf
index 7b581663..df095b52 100644
--- a/arm9/arm9.lsf
+++ b/arm9/arm9.lsf
@@ -48,8 +48,7 @@ Static arm9
Object unk_02015D14.o
Object unk_02015E30.o
Object game_init.o
- Object unk_020166C8_c.o
- Object unk_020166C8.o
+ Object heap.o
Object unk_02016B94.o
Object unk_0201B1A8.o
Object unk_0201B4E8.o
diff --git a/arm9/asm/unk_020166C8.s b/arm9/asm/unk_020166C8.s
deleted file mode 100644
index d28d1166..00000000
--- a/arm9/asm/unk_020166C8.s
+++ /dev/null
@@ -1,283 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
- .text
-
-
- thumb_func_start FUN_02016988
-FUN_02016988: ; 0x02016988
- push {r3, lr}
- bl FUN_02031810
- cmp r0, #0x0
- beq _02016996
- bl PrintErrorMessageAndReset
-_02016996:
- pop {r3, pc}
-
- thumb_func_start AllocFromHeap
-AllocFromHeap: ; 0x02016998
- push {r3-r5, lr}
- add r5, r0, #0x0
- ldr r0, _020169D4 ; =UNK_021C4D28
- mov r4, #0x0
- ldrh r2, [r0, #0x14]
- cmp r5, r2
- bhs _020169BA
- ldr r2, [r0, #0x0]
- ldr r0, [r0, #0x10]
- add r3, r5, #0x0
- ldrb r0, [r0, r5]
- lsl r0, r0, #0x2
- ldr r0, [r2, r0]
- mov r2, #0x4
- bl FUN_02016944
- add r4, r0, #0x0
-_020169BA:
- cmp r4, #0x0
- beq _020169CC
- ldr r0, _020169D4 ; =UNK_021C4D28
- lsl r1, r5, #0x1
- ldr r2, [r0, #0xc]
- ldrh r0, [r2, r1]
- add r0, r0, #0x1
- strh r0, [r2, r1]
- b _020169D0
-_020169CC:
- bl FUN_02016988
-_020169D0:
- add r0, r4, #0x0
- pop {r3-r5, pc}
- .balign 4
-_020169D4: .word UNK_021C4D28
-
- thumb_func_start AllocFromHeapAtEnd
-AllocFromHeapAtEnd: ; 0x020169D8
- push {r3-r5, lr}
- ldr r2, _02016A14 ; =UNK_021C4D28
- add r5, r0, #0x0
- ldrh r0, [r2, #0x14]
- mov r4, #0x0
- cmp r5, r0
- bhs _020169FA
- ldr r0, [r2, #0x0]
- ldr r2, [r2, #0x10]
- add r3, r5, #0x0
- ldrb r2, [r2, r5]
- lsl r2, r2, #0x2
- ldr r0, [r0, r2]
- sub r2, r4, #0x4
- bl FUN_02016944
- add r4, r0, #0x0
-_020169FA:
- cmp r4, #0x0
- beq _02016A0C
- ldr r0, _02016A14 ; =UNK_021C4D28
- lsl r1, r5, #0x1
- ldr r2, [r0, #0xc]
- ldrh r0, [r2, r1]
- add r0, r0, #0x1
- strh r0, [r2, r1]
- b _02016A10
-_02016A0C:
- bl FUN_02016988
-_02016A10:
- add r0, r4, #0x0
- pop {r3-r5, pc}
- .balign 4
-_02016A14: .word UNK_021C4D28
-
- thumb_func_start FreeToHeap
-FreeToHeap: ; 0x02016A18
- push {r3-r7, lr}
- add r6, r0, #0x0
- sub r0, r6, #0x4
- ldr r0, [r0, #0x0]
- lsl r0, r0, #0x18
- lsr r4, r0, #0x18
- ldr r0, _02016A88 ; =UNK_021C4D28
- ldrh r1, [r0, #0x14]
- cmp r4, r1
- bhs _02016A80
- ldr r1, [r0, #0x0]
- ldr r0, [r0, #0x10]
- ldrb r0, [r0, r4]
- lsl r0, r0, #0x2
- ldr r7, [r1, r0]
- cmp r7, #0x0
- bne _02016A3E
- bl ErrorHandling
-_02016A3E:
- ldr r0, _02016A88 ; =UNK_021C4D28
- lsl r5, r4, #0x1
- ldr r0, [r0, #0xc]
- ldrh r0, [r0, r5]
- cmp r0, #0x0
- bne _02016A50
- add r0, r4, #0x0
- bl FUN_02016B90
-_02016A50:
- ldr r0, _02016A88 ; =UNK_021C4D28
- ldr r0, [r0, #0xc]
- ldrh r0, [r0, r5]
- cmp r0, #0x0
- bne _02016A5E
- bl ErrorHandling
-_02016A5E:
- ldr r0, _02016A88 ; =UNK_021C4D28
- ldr r1, [r0, #0xc]
- ldrh r0, [r1, r5]
- sub r0, r0, #0x1
- strh r0, [r1, r5]
- bl OS_DisableInterrupts
- sub r6, #0x10
- add r4, r0, #0x0
- add r0, r7, #0x0
- add r1, r6, #0x0
- bl FUN_020ADDF0
- add r0, r4, #0x0
- bl OS_RestoreInterrupts
- pop {r3-r7, pc}
-_02016A80:
- bl ErrorHandling
- pop {r3-r7, pc}
- nop
-_02016A88: .word UNK_021C4D28
-
- thumb_func_start FUN_02016A8C
-FUN_02016A8C: ; 0x02016A8C
- push {r4-r6, lr}
- add r5, r0, #0x0
- add r4, r1, #0x0
- bl OS_GetProcMode
- cmp r0, #0x12
- bne _02016A9E
- bl ErrorHandling
-_02016A9E:
- ldr r0, _02016AF4 ; =UNK_021C4D28
- ldrh r1, [r0, #0x14]
- cmp r5, r1
- bhs _02016AEE
- ldr r1, [r0, #0x0]
- ldr r0, [r0, #0x10]
- ldrb r0, [r0, r5]
- lsl r0, r0, #0x2
- ldr r6, [r1, r0]
- cmp r6, #0x0
- bne _02016AB8
- bl ErrorHandling
-_02016AB8:
- sub r0, r4, #0x4
- ldr r0, [r0, #0x0]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- cmp r0, r5
- beq _02016AC8
- bl ErrorHandling
-_02016AC8:
- sub r4, #0x10
- add r0, r6, #0x0
- add r1, r4, #0x0
- bl FUN_020ADDF0
- ldr r0, _02016AF4 ; =UNK_021C4D28
- lsl r4, r5, #0x1
- ldr r0, [r0, #0xc]
- ldrh r0, [r0, r4]
- cmp r0, #0x0
- bne _02016AE2
- bl ErrorHandling
-_02016AE2:
- ldr r0, _02016AF4 ; =UNK_021C4D28
- ldr r1, [r0, #0xc]
- ldrh r0, [r1, r4]
- sub r0, r0, #0x1
- strh r0, [r1, r4]
- pop {r4-r6, pc}
-_02016AEE:
- bl ErrorHandling
- pop {r4-r6, pc}
- .balign 4
-_02016AF4: .word UNK_021C4D28
-
- thumb_func_start FUN_02016AF8
-FUN_02016AF8: ; 0x02016AF8
- push {r3, lr}
- ldr r1, _02016B1C ; =UNK_021C4D28
- ldrh r2, [r1, #0x14]
- cmp r0, r2
- bhs _02016B12
- ldr r2, [r1, #0x0]
- ldr r1, [r1, #0x10]
- ldrb r0, [r1, r0]
- lsl r0, r0, #0x2
- ldr r0, [r2, r0]
- bl FUN_020ADDC8
- pop {r3, pc}
-_02016B12:
- bl ErrorHandling
- mov r0, #0x0
- pop {r3, pc}
- nop
-_02016B1C: .word UNK_021C4D28
-
- thumb_func_start FUN_02016B20
-FUN_02016B20: ; 0x02016B20
- push {r4, lr}
- ldr r4, _02016B40 ; =UNK_021C4D28
- ldrh r3, [r4, #0x14]
- cmp r1, r3
- bhs _02016B3A
- ldr r3, [r4, #0x0]
- ldr r4, [r4, #0x10]
- ldrb r1, [r4, r1]
- lsl r1, r1, #0x2
- ldr r1, [r3, r1]
- bl FUN_020AE82C
- pop {r4, pc}
-_02016B3A:
- bl ErrorHandling
- pop {r4, pc}
- .balign 4
-_02016B40: .word UNK_021C4D28
-
- thumb_func_start FUN_02016B44
-FUN_02016B44: ; 0x02016B44
- push {r3-r5, lr}
- add r5, r0, #0x0
- add r4, r1, #0x0
- bl OS_GetProcMode
- cmp r0, #0x12
- bne _02016B56
- bl ErrorHandling
-_02016B56:
- add r0, r5, #0x0
- sub r0, #0x10
- bl FUN_020ADDC0
- add r4, #0x10
- cmp r0, r4
- blo _02016B84
- sub r2, r5, #0x4
- ldr r0, _02016B8C ; =UNK_021C4D28
- ldr r2, [r2, #0x0]
- ldr r1, [r0, #0x0]
- lsl r2, r2, #0x18
- ldr r0, [r0, #0x10]
- lsr r2, r2, #0x18
- ldrb r0, [r0, r2]
- sub r5, #0x10
- add r2, r4, #0x0
- lsl r0, r0, #0x2
- ldr r0, [r1, r0]
- add r1, r5, #0x0
- bl FUN_020ADE2C
- pop {r3-r5, pc}
-_02016B84:
- bl ErrorHandling
- pop {r3-r5, pc}
- nop
-_02016B8C: .word UNK_021C4D28
-
- thumb_func_start FUN_02016B90
-FUN_02016B90: ; 0x02016B90
- mov r0, #0x1
- bx lr
diff --git a/arm9/modules/05/src/mod05_021E72FC.c b/arm9/modules/05/src/mod05_021E72FC.c
index 8a31d032..c24a7bd3 100644
--- a/arm9/modules/05/src/mod05_021E72FC.c
+++ b/arm9/modules/05/src/mod05_021E72FC.c
@@ -2,6 +2,7 @@
#include "mod05_021E72FC.h"
#include "heap.h"
+
extern void FUN_020054C8(u32 param0);
extern void FUN_020463CC(u32 param0, void *func, UnkStruct021E7358 *param2);
extern u32 FUN_020553A0(u32 param0);
@@ -19,7 +20,6 @@ extern void FUN_02055304(u32 param0, u32 param1);
extern BOOL FUN_02056B74(u32 param0, u32 param1, u32 param2);
extern void FUN_02058418(u32 param0, u32 param1);
extern void FUN_020054F0(u32 param0, u32 param1);
-extern void FUN_02016A8C(u32 param0, void *param1);
THUMB_FUNC BOOL MOD05_021E72FC(u32 param0, u32 param1)
{
diff --git a/arm9/modules/52/src/module_52.c b/arm9/modules/52/src/module_52.c
index 8b00f613..a5b53e6c 100644
--- a/arm9/modules/52/src/module_52.c
+++ b/arm9/modules/52/src/module_52.c
@@ -1,11 +1,11 @@
#include "module_52.h"
+#include "heap.h"
+
extern struct Unk21DBE18 UNK_020FD144;
extern struct Unk21DBE18 UNK_020F2B7C;
extern struct Unk21DBE18 UNK_020F2B8C;
-extern void FUN_0201681C(u32 param0, u32 heap_id, u32 param2);
-extern int FUN_020168D0(u32 heap_id);
extern void FUN_02015E3C(struct IGT *igt);
extern void FUN_0206007C(struct SaveBlock2 *sav2);
extern int FUN_02053678(u32 random, u32 gender, u32 param2);
diff --git a/arm9/modules/59/src/mod59_021D74E0_src.c b/arm9/modules/59/src/mod59_021D74E0_src.c
index 9fccfd95..4d7a4a98 100644
--- a/arm9/modules/59/src/mod59_021D74E0_src.c
+++ b/arm9/modules/59/src/mod59_021D74E0_src.c
@@ -2,8 +2,9 @@
#include "player_data.h"
#include "overlay_manager.h"
#include "mod59_021D74E0.h"
+#include "heap.h"
+
-extern void FUN_0201681C(u32 param0, u32 heap_id, u32 param2);
extern u32 FUN_02077A84(u32 heap_id, u32 param1, u32 param2, u32 param3, struct Options *options);
THUMB_FUNC BOOL MOD59_Init(struct UnkStruct_02006234 *param0)
diff --git a/arm9/src/game_init.c b/arm9/src/game_init.c
index 327c66c6..a7508fab 100644
--- a/arm9/src/game_init.c
+++ b/arm9/src/game_init.c
@@ -4,16 +4,15 @@
#include "main.h"
#include "FS_rom.h"
#include "PAD_pad.h"
-#include "heap.h"
#include "MWC_string.h"
#include "tp.h"
#include "unk_0201B4E8.h"
#include "game_init.h"
#include "registers.h"
+#include "heap.h"
#pragma thumb on
-extern void FUN_020166C8(const u32 (*)[2], int, int, int);
extern void FUN_02022450(void);
typedef volatile struct
@@ -142,7 +141,7 @@ void FUN_02015FC8(void)
{
csum++;
}
- FUN_020166C8(UNK_020EDB10, 4, 92, (int)csum);
+ FUN_020166C8((u32 *)UNK_020EDB10, 4, 92, (int)csum);
}
void InitSystemForTheGame(void)
diff --git a/arm9/src/unk_020166C8_c.c b/arm9/src/heap.c
index 36428a59..a23937b0 100644
--- a/arm9/src/unk_020166C8_c.c
+++ b/arm9/src/heap.c
@@ -1,25 +1,20 @@
-#include "global.h"
-
-struct UnkStruct_020166C8
-{
- u32 *unk_ptr1;
- u32 *unk_ptr2;
- void **unk_ptr3;
- u16 *unk_ptr4;
- u8 *unk_ptr5;
- u16 unk_half1;
- u16 unk_half2;
- u16 unk_half3;
- u16 unk_half4;
-};
-
-struct UnkStruct_020166C8 UNK_021C4D28;
+#include "heap.h"
extern void *tempName_NNS_FndCreateExpHeapEx(void *param0, u32 param1, u32 param2);
extern void *tempName_NNS_FndAllocFromExpHeapEx(void *param0, u32 param1, s32 param2);
u32 FUN_02016834(u32 param0, u32 param1, u32 param2, s32 param3);
extern void thunk_FUN_020adc8c();
extern void FUN_020ADDF0(u32 param0, void *param1);
+extern u32 FUN_02031810(void);
+extern void PrintErrorMessageAndReset(void);
+extern u32 FUN_020ADDC8(u32 param0);
+extern void FUN_020AE82C(u32 param0, u32 param1, u32 param2);
+extern u32 FUN_020ADDC0(u32 param0);
+extern void FUN_020ADE2C(u32 param0, void *ptr, u32 param2);
+
+
+struct UnkStruct_020166C8 UNK_021C4D28;
+
THUMB_FUNC void FUN_020166C8(u32 *param0, u32 param1, u32 param2, u32 pre_size)
{
@@ -138,7 +133,6 @@ THUMB_FUNC u32 FUN_02016828(u32 param0, u32 param1, u32 param2)
return FUN_02016834(param0, param1, param2, -4);
}
-
THUMB_FUNC u32 FUN_02016834(u32 param0, u32 param1, u32 param2, s32 param3)
{
if (OS_GetProcMode() == OS_PROCMODE_IRQ)
@@ -195,49 +189,219 @@ THUMB_FUNC u32 FUN_02016834(u32 param0, u32 param1, u32 param2, s32 param3)
return 0;
}
-
-THUMB_FUNC void FUN_020168D0(u32 param0) {
- if (OS_GetProcMode() == OS_PROCMODE_IRQ) {
+THUMB_FUNC void FUN_020168D0(u32 heap_id)
+{
+ if (OS_GetProcMode() == OS_PROCMODE_IRQ)
+ {
ErrorHandling();
}
- if (UNK_021C4D28.unk_ptr1[UNK_021C4D28.unk_ptr5[param0]] != 0) {
+ if (UNK_021C4D28.unk_ptr1[UNK_021C4D28.unk_ptr5[heap_id]] != 0)
+ {
thunk_FUN_020adc8c();
- u8 index = UNK_021C4D28.unk_ptr5[param0];
+ u8 index = UNK_021C4D28.unk_ptr5[heap_id];
u32 arg1 = UNK_021C4D28.unk_ptr2[index];
void *arg2 = UNK_021C4D28.unk_ptr3[index];
- if (arg1 != 0 && arg2 != 0) {
+ if (arg1 != 0 && arg2 != 0)
+ {
FUN_020ADDF0(arg1, arg2);
- } else {
+ }
+ else
+ {
ErrorHandling();
}
+ UNK_021C4D28.unk_ptr1[UNK_021C4D28.unk_ptr5[heap_id]] = 0;
+ UNK_021C4D28.unk_ptr2[UNK_021C4D28.unk_ptr5[heap_id]] = 0;
+ UNK_021C4D28.unk_ptr3[UNK_021C4D28.unk_ptr5[heap_id]] = 0;
+ UNK_021C4D28.unk_ptr5[heap_id] = UNK_021C4D28.unk_half4;
+ }
+}
- UNK_021C4D28.unk_ptr1[UNK_021C4D28.unk_ptr5[param0]] = 0;
- UNK_021C4D28.unk_ptr2[UNK_021C4D28.unk_ptr5[param0]] = 0;
- UNK_021C4D28.unk_ptr3[UNK_021C4D28.unk_ptr5[param0]] = 0;
+THUMB_FUNC u32 FUN_02016944(void *param0, u32 param1, u32 param2, u32 param3)
+{
+ if (param0 == 0)
+ {
+ ErrorHandling();
+ }
+ OSIntrMode intr_mode = OS_DisableInterrupts();
+ param1 += 16;
+ u32 *ptr = (u32 *)tempName_NNS_FndAllocFromExpHeapEx(param0, param1, param2);
+
+ OS_RestoreInterrupts(intr_mode);
+ if (ptr != 0)
+ {
+ ptr[3] = (ptr[3] & ~0xff) | (param3 & 0xff);
- UNK_021C4D28.unk_ptr5[param0] = UNK_021C4D28.unk_half4;
+ ptr += 4;
}
+
+ return ptr;
}
+THUMB_FUNC void FUN_02016988()
+{
+ if (FUN_02031810() != 0)
+ {
+ PrintErrorMessageAndReset();
+ }
+}
-THUMB_FUNC u32 FUN_02016944(void *param0, u32 param1, u32 param2, u8 param3) {
- if (param0 == 0) {
- ErrorHandling();
+void *AllocFromHeap(u32 heap_id, u32 size)
+{
+ void *ptr = 0;
+ if (heap_id < UNK_021C4D28.unk_half1)
+ {
+ u8 index = UNK_021C4D28.unk_ptr5[heap_id];
+ ptr = FUN_02016944(UNK_021C4D28.unk_ptr1[index], size, 4, heap_id);
+ }
+ if (ptr != 0)
+ {
+ UNK_021C4D28.unk_ptr4[heap_id]++;
+ }
+ else
+ {
+ FUN_02016988();
}
- OSIntrMode os_mode = OS_DisableInterrupts();
- param1+=16;
- u32 *ptr = (u32 *) tempName_NNS_FndAllocFromExpHeapEx(param0, param1, param2);
- OS_RestoreInterrupts(os_mode);
- if (ptr != 0) {
- ptr[3] = (ptr[3] & ~0xff) | (param3 & 0xff);
+ return ptr;
+}
- ptr+=4;
+void *AllocFromHeapAtEnd(u32 heap_id, u32 size)
+{
+ void *ptr = 0;
+ if (heap_id < UNK_021C4D28.unk_half1)
+ {
+ u8 index = UNK_021C4D28.unk_ptr5[heap_id];
+ ptr = FUN_02016944(UNK_021C4D28.unk_ptr1[index], size, -4, heap_id);
+ }
+
+ if (ptr != 0)
+ {
+ UNK_021C4D28.unk_ptr4[heap_id]++;
+ }
+ else
+ {
+ FUN_02016988();
}
return ptr;
-} \ No newline at end of file
+}
+
+void FreeToHeap(void *ptr)
+{
+ u8 heap_id = ((u32 *)ptr)[-1];
+
+ if ((u16)heap_id < UNK_021C4D28.unk_half1)
+ {
+ u8 index = UNK_021C4D28.unk_ptr5[heap_id];
+ void *ptr2 = UNK_021C4D28.unk_ptr1[index];
+ if (ptr2 == 0)
+ {
+ ErrorHandling();
+ }
+ if (UNK_021C4D28.unk_ptr4[heap_id] == 0)
+ {
+ FUN_02016B90(heap_id);
+ }
+ if (UNK_021C4D28.unk_ptr4[heap_id] == 0)
+ {
+ ErrorHandling();
+ }
+
+ UNK_021C4D28.unk_ptr4[heap_id]--;
+ OSIntrMode intr_mode = OS_DisableInterrupts();
+ FUN_020ADDF0(ptr2, ptr - 16);
+ OS_RestoreInterrupts(intr_mode);
+ return;
+ }
+
+ ErrorHandling();
+}
+
+void FUN_02016A8C(u32 param0, void *param1)
+{
+ if (OS_GetProcMode() == OS_PROCMODE_IRQ)
+ {
+ ErrorHandling();
+ }
+
+ if (param0 < UNK_021C4D28.unk_half1)
+ {
+ u8 index = UNK_021C4D28.unk_ptr5[param0];
+ void *ptr = UNK_021C4D28.unk_ptr1[index];
+ if (ptr == 0)
+ {
+ ErrorHandling();
+ }
+
+ u8 heap_id = ((u32 *)param1)[-1];
+ if (heap_id != param0)
+ {
+ ErrorHandling();
+ }
+
+ FUN_020ADDF0(ptr, param1 - 16);
+ if (UNK_021C4D28.unk_ptr4[param0] == 0)
+ {
+ ErrorHandling();
+ }
+
+ UNK_021C4D28.unk_ptr4[param0]--;
+ return;
+ }
+
+ ErrorHandling();
+}
+
+THUMB_FUNC u32 FUN_02016AF8(u32 param0)
+{
+ if (param0 < UNK_021C4D28.unk_half1)
+ {
+ u8 index = UNK_021C4D28.unk_ptr5[param0];
+ return FUN_020ADDC8(UNK_021C4D28.unk_ptr1[index]);
+ }
+
+ ErrorHandling();
+ return 0;
+}
+
+THUMB_FUNC void FUN_02016B20(u32 param0, u32 param1, u32 param2)
+{
+ if (param1 < UNK_021C4D28.unk_half1)
+ {
+
+ u8 index = UNK_021C4D28.unk_ptr5[param1];
+ FUN_020AE82C(param0, UNK_021C4D28.unk_ptr1[index], param2);
+ return;
+ }
+
+ ErrorHandling();
+}
+
+THUMB_FUNC void FUN_02016B44(void *ptr, u32 param1)
+{
+ if (OS_GetProcMode() == OS_PROCMODE_IRQ)
+ {
+ ErrorHandling();
+ }
+
+ param1 += 16;
+ if (FUN_020ADDC0(ptr - 16) >= param1)
+ {
+ u8 heap_id = ((u32 *)ptr)[-1];
+
+ u8 index = UNK_021C4D28.unk_ptr5[heap_id];
+
+ FUN_020ADE2C(UNK_021C4D28.unk_ptr1[index], ptr - 16, param1);
+ return;
+ }
+ ErrorHandling();
+}
+
+THUMB_FUNC u32 FUN_02016B90(u32 param0)
+{
+ return 1;
+}
diff --git a/include/heap.h b/include/heap.h
index 6f04c5bc..abea9216 100644
--- a/include/heap.h
+++ b/include/heap.h
@@ -1,9 +1,37 @@
#ifndef POKEDIAMOND_HEAP_H
#define POKEDIAMOND_HEAP_H
-void * AllocFromHeap(u32 heap_id, u32 size);
-void * AllocFromHeapAtEnd(u32 heap_id, u32 size);
-void FreeToHeap(void * ptr);
+#include "global.h"
+
+struct UnkStruct_020166C8
+{
+ u32 *unk_ptr1;
+ u32 *unk_ptr2;
+ void **unk_ptr3;
+ u16 *unk_ptr4;
+ u8 *unk_ptr5;
+ u16 unk_half1;
+ u16 unk_half2;
+ u16 unk_half3;
+ u16 unk_half4;
+};
+
+
+THUMB_FUNC void FUN_020166C8(u32 *param0, u32 param1, u32 param2, u32 pre_size);
+THUMB_FUNC s32 FUN_020167F4();
+THUMB_FUNC u32 FUN_0201681C(u32 param0, u32 heap_id, u32 param2);
+THUMB_FUNC u32 FUN_02016828(u32 param0, u32 param1, u32 param2);
+THUMB_FUNC u32 FUN_02016834(u32 param0, u32 param1, u32 param2, s32 param3);
+THUMB_FUNC void FUN_020168D0(u32 heap_id);
+THUMB_FUNC u32 FUN_02016944(void *param0, u32 param1, u32 param2, u32 param3);
+THUMB_FUNC void FUN_02016988();
+void *AllocFromHeap(u32 heap_id, u32 size);
+void *AllocFromHeapAtEnd(u32 heap_id, u32 size);
+void FreeToHeap(void *ptr);
void FUN_02016A8C(u32 heap_id, void * ptr);
+THUMB_FUNC u32 FUN_02016AF8(u32 param0);
+THUMB_FUNC void FUN_02016B20(u32 param0, u32 param1, u32 param2);
+THUMB_FUNC void FUN_02016B44(void *ptr, u32 param1);
+THUMB_FUNC u32 FUN_02016B90(u32 param0);
#endif //POKEDIAMOND_HEAP_H