summaryrefslogtreecommitdiff
path: root/arm9/lib
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/lib')
-rw-r--r--arm9/lib/include/OS_spinLock.h15
-rw-r--r--arm9/lib/include/mmap.h1
-rw-r--r--arm9/lib/src/OS_spinLock.c77
3 files changed, 86 insertions, 7 deletions
diff --git a/arm9/lib/include/OS_spinLock.h b/arm9/lib/include/OS_spinLock.h
index eb94a010..eccc502b 100644
--- a/arm9/lib/include/OS_spinLock.h
+++ b/arm9/lib/include/OS_spinLock.h
@@ -14,12 +14,12 @@ typedef volatile struct OSLockWord {
u16 extension;
} OSLockWord;
-static inline void OSi_WaitByLoop()
+static inline void OSi_WaitByLoop(void)
{
SVC_WaitByLoop(0x1000 / 4);
}
-void OS_InitLock();
+void OS_InitLock(void);
s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void),
BOOL disableFiq);
s32 OS_TryLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void));
@@ -31,8 +31,15 @@ s32 OSi_DoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void),
s32 OS_LockCartridge(u16 lockID);
s32 OS_UnlockCartridge(u16 lockID);
s32 OS_TryLockCartridge(u16 lockID);
-void OSi_AllocateCartridgeBus();
-void OSi_FreeCartridgeBus();
+void OSi_AllocateCartridgeBus(void);
+void OSi_FreeCartridgeBus(void);
+s32 OS_TryLockCard(u16 lockID);
+s32 OS_UnlockCard(u16 lockID);
+void OSi_AllocateCardBus(void);
+void OSi_FreeCardBus(void);
+u16 OS_ReadOwnerOfLockWord(OSLockWord * lock);
+s32 OS_UnLockCartridge(u16 lockID);
s32 OS_GetLockID(void);
+void OS_ReleaseLockID(register u16 lockID);
#endif //POKEDIAMOND_OS_SPINLOCK_H
diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h
index b47d88b4..207e0509 100644
--- a/arm9/lib/include/mmap.h
+++ b/arm9/lib/include/mmap.h
@@ -41,6 +41,7 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_LOCK_ID_FLAG_MAIN (HW_MAIN_MEM + 0x007fffb0)
#define HW_SHARED_LOCK_BUF (HW_MAIN_MEM + 0x007fffc0)
+#define HW_CARD_LOCK_BUF (HW_MAIN_MEM + 0x007fffe0)
#define HW_CTRDG_LOCK_BUF (HW_MAIN_MEM + 0x007fffe8)
#define HW_BUTTON_XY_BUF (HW_MAIN_MEM + 0x007fffa8)
diff --git a/arm9/lib/src/OS_spinLock.c b/arm9/lib/src/OS_spinLock.c
index 9cda667f..5050a7bd 100644
--- a/arm9/lib/src/OS_spinLock.c
+++ b/arm9/lib/src/OS_spinLock.c
@@ -11,7 +11,7 @@
extern void MIi_CpuClear32(u32 param1, void * addr, u32 length); //not too sure about names
extern u32 MI_SwapWord(u32 data, volatile u32* destp);
-ARM_FUNC void OS_InitLock()
+ARM_FUNC void OS_InitLock(void)
{
static BOOL isInitialized = FALSE;
@@ -135,12 +135,83 @@ ARM_FUNC s32 OS_TryLockCartridge(u16 lockID)
return OSi_DoTryLockByWord(lockID, (OSLockWord *)HW_CTRDG_LOCK_BUF, OSi_AllocateCartridgeBus, TRUE);
}
-ARM_FUNC void OSi_AllocateCartridgeBus()
+ARM_FUNC void OSi_AllocateCartridgeBus(void)
{
MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM9);
}
-ARM_FUNC void OSi_FreeCartridgeBus()
+ARM_FUNC void OSi_FreeCartridgeBus(void)
{
MIi_SetCartridgeProcessor(MI_PROCESSOR_ARM7);
}
+
+ARM_FUNC s32 OS_TryLockCard(u16 lockID)
+{
+ return OS_TryLockByWord(lockID, (OSLockWord *)HW_CARD_LOCK_BUF, OSi_AllocateCardBus);
+}
+
+ARM_FUNC s32 OS_UnlockCard(u16 lockID)
+{
+ return OS_UnlockByWord(lockID, (OSLockWord *)HW_CARD_LOCK_BUF, OSi_FreeCardBus);
+}
+
+ARM_FUNC void OSi_AllocateCardBus(void)
+{
+ MIi_SetCardProcessor(MI_PROCESSOR_ARM9);
+}
+
+ARM_FUNC void OSi_FreeCardBus(void)
+{
+ MIi_SetCardProcessor(MI_PROCESSOR_ARM7);
+}
+
+ARM_FUNC u16 OS_ReadOwnerOfLockWord(OSLockWord * lock)
+{
+ return lock->ownerID;
+}
+
+ARM_FUNC asm s32 OS_UnLockCartridge(u16 lockID)
+{
+ ldr r1, =OS_UnlockCartridge
+ bx r1
+}
+
+ARM_FUNC asm s32 OS_GetLockID(void)
+{
+ ldr r3, =HW_LOCK_ID_FLAG_MAIN
+ ldr r1, [r3, #0x0]
+ clz r2, r1
+ cmp r2, #0x20
+ movne r0, #0x40
+ bne _020CA0D4
+ add r3, r3, #0x4
+ ldr r1, [r3, #0x0]
+ clz r2, r1
+ cmp r2, #0x20
+ ldr r0, =0xFFFFFFFD
+ bxeq lr
+ mov r0, #0x60
+_020CA0D4:
+ add r0, r0, r2
+ mov r1, #0x80000000
+ mov r1, r1, lsr r2
+ ldr r2, [r3, #0x0]
+ bic r2, r2, r1
+ str r2, [r3, #0x0]
+ bx lr
+}
+
+ARM_FUNC asm void OS_ReleaseLockID(register u16 lockID)
+{
+ ldr r3, =HW_LOCK_ID_FLAG_MAIN
+ cmp r0, #0x60
+ addpl r3, r3, #0x4
+ subpl r0, r0, #0x60
+ submi r0, r0, #0x40
+ mov r1, #0x80000000
+ mov r1, r1, lsr r0
+ ldr r2, [r3, #0x0]
+ orr r2, r2, r1
+ str r2, [r3, #0x0]
+ bx lr
+}