summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/game_init.c5
-rw-r--r--arm9/src/heap.c (renamed from arm9/src/unk_020166C8_c.c)242
2 files changed, 205 insertions, 42 deletions
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;
+}