summaryrefslogtreecommitdiff
path: root/arm9/lib/src/OS_spinLock.c
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-05-21 20:23:26 +0100
committerred031000 <rubenru09@aol.com>2020-05-21 20:23:26 +0100
commitb4d6f1314b3b322afabe85d848e09a36d4e7a47a (patch)
tree883642f7cca4e9e83fe218fffa16e7c48d87b873 /arm9/lib/src/OS_spinLock.c
parent79a7e3dac84f719ca4d0131ac2e30e2c6a4bd73e (diff)
OS_InitLock
Diffstat (limited to 'arm9/lib/src/OS_spinLock.c')
-rw-r--r--arm9/lib/src/OS_spinLock.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/arm9/lib/src/OS_spinLock.c b/arm9/lib/src/OS_spinLock.c
new file mode 100644
index 00000000..46309c42
--- /dev/null
+++ b/arm9/lib/src/OS_spinLock.c
@@ -0,0 +1,46 @@
+//
+// Created by red031000 on 2020-05-21.
+//
+
+#include "OS_spinLock.h"
+#include "function_target.h"
+#include "consts.h"
+#include "MI_exMemory.h"
+
+extern void OS_TryLockByWord(u16 param1, OSLockWord* lockp, void* func);
+extern void OS_UnlockByWord(u16 param1, OSLockWord* lockp, void* func);
+extern void MIi_CpuClear32(u32 param1, void * addr, u32 length); //not too sure about names
+
+ARM_FUNC void OS_InitLock()
+{
+ static BOOL isInitialized = FALSE;
+
+ if (isInitialized)
+ {
+ return;
+ }
+ isInitialized = TRUE;
+
+ OSLockWord* lockp = (OSLockWord *)0x027FFFF0;
+
+ lockp->lockFlag = 0;
+
+ (void)OS_TryLockByWord(0x7e, lockp, NULL);
+
+ while (lockp->extension)
+ {
+ OSi_WaitByLoop();
+ }
+
+ ((u32 *)HW_LOCK_ID_FLAG_MAIN)[0] = 0xffffffff;
+ ((u32 *)HW_LOCK_ID_FLAG_MAIN)[1] = 0xffff0000;
+
+ MIi_CpuClear32(0x0, (void *)HW_SHARED_LOCK_BUF, 0x28);
+
+ MIi_SetCardProcessor(MI_PROCESSOR_ARM7);
+
+ MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7);
+
+ OS_UnlockByWord(0x7e, lockp, NULL);
+ OS_TryLockByWord(0x7f, lockp, NULL);
+}