summaryrefslogtreecommitdiff
path: root/arm9/src/oam.c
diff options
context:
space:
mode:
authorRémi Calixte <remicalixte.rmc@gmail.com>2021-08-18 19:57:28 +0200
committerRémi Calixte <remicalixte.rmc@gmail.com>2021-08-18 19:57:28 +0200
commitbb8d0b174dfafd4d268a874ef55f2d09f510b82b (patch)
tree03de4ccb9a850663165c6f31741a1399a19810d9 /arm9/src/oam.c
parent99b7ee252db114934a7de5d71ca7a4cbf8244595 (diff)
partially document oam.c and brightness.c
Diffstat (limited to 'arm9/src/oam.c')
-rw-r--r--arm9/src/oam.c169
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;
+}