diff options
Diffstat (limited to 'arm9/src')
-rw-r--r-- | arm9/src/game_init.c | 5 | ||||
-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; +} |