diff options
author | Rémi Calixte <remicalixte.rmc@gmail.com> | 2021-08-18 19:57:28 +0200 |
---|---|---|
committer | Rémi Calixte <remicalixte.rmc@gmail.com> | 2021-08-18 19:57:28 +0200 |
commit | bb8d0b174dfafd4d268a874ef55f2d09f510b82b (patch) | |
tree | 03de4ccb9a850663165c6f31741a1399a19810d9 /arm9/src/oam.c | |
parent | 99b7ee252db114934a7de5d71ca7a4cbf8244595 (diff) |
partially document oam.c and brightness.c
Diffstat (limited to 'arm9/src/oam.c')
-rw-r--r-- | arm9/src/oam.c | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/arm9/src/oam.c b/arm9/src/oam.c new file mode 100644 index 00000000..ff3405d4 --- /dev/null +++ b/arm9/src/oam.c @@ -0,0 +1,169 @@ +#include "global.h" +#include "oam.h" +#include "GX_g2.h" +#include "MI_memory.h" +#include "heap.h" + +extern void FUN_020213A0(void); +extern void FUN_0202135C(void *param0, + u32 *param1, + u32 (*param2)(u32, u32), + u32 (*param3)(u32), + void (*param4)(void), + u32 param5, + u32 param6); +extern void FUN_020203CC(u32 heap_id); +extern void FUN_02020404(u32 heap_id); + +struct OamData *oamData; + +THUMB_FUNC void FUN_02009EAC(s32 param0, + s32 param1, + s32 param2, + s32 param3, + u32 param4, + u32 param5, + u32 param6, + u32 param7, + u32 param8) +{ + s32 r0; + if (param0 < 4) + { + r0 = 4; + if (param1 > 0x7c) + { + param1 = param1 - (4 - param0); + } + } + else + { + r0 = param0; + } + + s32 r2; + if (param2 < 1) + { + r2 = 1; + if (param3 > 0x1e) + { + param3 = param3 - (1 - param2); + } + } + else + { + r2 = param2; + } + + InitOamData(r0, param1, r2, param3, param4, param5, param6, param7, param8); +} + +THUMB_FUNC void InitOamData(s32 param0, + s32 param1, + s32 param2, + s32 param3, + u32 param4, + u32 param5, + u32 param6, + u32 param7, + u32 heap_id) +{ + GF_ASSERT(oamData == NULL); + oamData = AllocFromHeap(heap_id, sizeof(struct OamData)); + GF_ASSERT(oamData); + + oamData->heap_id = heap_id; + + GF_ASSERT(NNS_G2dGetNewOamManagerInstance( + &oamData->oamManagers[0], (u16)param0, (u16)param1, (u16)param2, (u16)param3, 0)); + GF_ASSERT(NNS_G2dGetNewOamManagerInstance( + &oamData->oamManagers[1], (u16)param4, (u16)param5, (u16)param6, (u16)param7, 1)); +} + +THUMB_FUNC void ApplyAndResetOamManagerBuffer(void) +{ + if (oamData != NULL) + { + NNS_G2dApplyAndResetOamManagerBuffer(&oamData->oamManagers[0]); + NNS_G2dApplyAndResetOamManagerBuffer(&oamData->oamManagers[1]); + } +} + +THUMB_FUNC void DeinitOamData(void) +{ + GF_ASSERT(oamData); + + FUN_0200A064(oamData->heap_id); + FUN_0200A06C(oamData->heap_id); + + FreeToHeap(oamData); + oamData = NULL; +} + +THUMB_FUNC void FUN_02009FD8(void *param0, u32 *param1, u32 param2, u32 param3) +{ + GF_ASSERT(oamData); + + if (param2 == 1) + { + FUN_0202135C(param0, param1, EntryOamManagerOamWithAffineIdxMainScreen, EntryOamManagerAffineMainScreen, FUN_020213A0, param2, param3); + return; + } + + FUN_0202135C(param0, param1, EntryOamManagerOamWithAffineIdxSubScreen, EntryOamManagerAffineSubScreen, FUN_020213A0, param2, param3); +} + +THUMB_FUNC NNSG2dOamManager *GetOamManager(u32 screen) +{ + GF_ASSERT(oamData); + if (screen == 0) + { + return &oamData->oamManagers[0]; + } + else + { + return &oamData->oamManagers[1]; + } +} + +THUMB_FUNC void FUN_0200A064(u32 heap_id) +{ + FUN_020203CC(heap_id); +} + +THUMB_FUNC void FUN_0200A06C(u32 heap_id) +{ + FUN_02020404(heap_id); +} + +THUMB_FUNC u32 EntryOamManagerOamWithAffineIdxMainScreen(u32 param0, u32 param1) +{ + u32 res = NNS_G2dEntryOamManagerOamWithAffineIdx(&oamData->oamManagers[0], param0, param1); + GF_ASSERT(res); + + return res; +} + +THUMB_FUNC u32 EntryOamManagerOamWithAffineIdxSubScreen(u32 param0, u32 param1) +{ + u32 res = NNS_G2dEntryOamManagerOamWithAffineIdx(&oamData->oamManagers[1], param0, param1); + GF_ASSERT(res); + + return res; +} + +THUMB_FUNC u32 EntryOamManagerAffineMainScreen(u32 param0) +{ + u32 res = NNS_G2dEntryOamManagerAffine(&oamData->oamManagers[0], param0); + GF_ASSERT(res != 0xFFFE); + + return res; +} + +THUMB_FUNC u32 EntryOamManagerAffineSubScreen(u32 param0) +{ + u32 res = NNS_G2dEntryOamManagerAffine(&oamData->oamManagers[1], param0); + GF_ASSERT(res != 0xFFFE); + + return res; +} |