diff options
author | red031000 <rubenru09@aol.com> | 2020-05-21 20:23:26 +0100 |
---|---|---|
committer | red031000 <rubenru09@aol.com> | 2020-05-21 20:23:26 +0100 |
commit | b4d6f1314b3b322afabe85d848e09a36d4e7a47a (patch) | |
tree | 883642f7cca4e9e83fe218fffa16e7c48d87b873 /arm9/lib/src/OS_spinLock.c | |
parent | 79a7e3dac84f719ca4d0131ac2e30e2c6a4bd73e (diff) |
OS_InitLock
Diffstat (limited to 'arm9/lib/src/OS_spinLock.c')
-rw-r--r-- | arm9/lib/src/OS_spinLock.c | 46 |
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); +} |