summaryrefslogtreecommitdiff
path: root/arm7/asm/OS_spinLock.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm7/asm/OS_spinLock.s')
-rw-r--r--arm7/asm/OS_spinLock.s272
1 files changed, 272 insertions, 0 deletions
diff --git a/arm7/asm/OS_spinLock.s b/arm7/asm/OS_spinLock.s
new file mode 100644
index 00000000..04f4683b
--- /dev/null
+++ b/arm7/asm/OS_spinLock.s
@@ -0,0 +1,272 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start OS_UnLockCartridge
+OS_UnLockCartridge: ; 0x037F8A18
+ ldr r1, _037F8A20 ; =OS_UnlockCartridge
+ bx r1
+_037F8A20: .word OS_UnlockCartridge
+
+ arm_func_start OS_GetLockID
+OS_GetLockID: ; 0x037F8A24
+ ldr r3, _037F8AB4 ; =0x027FFFB8
+ ldr r1, [r3]
+ mov r2, #0
+ mov r0, #-2147483648 ; 0x80000000
+_037F8A34:
+ tst r1, r0
+ bne _037F8A50
+ add r2, r2, #1
+ cmp r2, #32
+ beq _037F8A50
+ mov r0, r0, lsr #1
+ b _037F8A34
+_037F8A50:
+ cmp r2, #32
+ movne r0, #128 ; 0x80
+ bne _037F8A98
+ add r3, r3, #4
+ ldr r1, [r3]
+ mov r2, #0
+ mov r0, #-2147483648 ; 0x80000000
+_037F8A6C:
+ tst r1, r0
+ bne _037F8A88
+ add r2, r2, #1
+ cmp r2, #32
+ beq _037F8A88
+ mov r0, r0, lsr #1
+ b _037F8A6C
+_037F8A88:
+ cmp r2, #32
+ ldr r0, _037F8AB8 ; =0xFFFFFFFD
+ bxeq lr
+ mov r0, #160 ; 0xa0
+_037F8A98:
+ add r0, r0, r2
+ mov r1, #-2147483648 ; 0x80000000
+ mov r1, r1, lsr r2
+ ldr r2, [r3]
+ bic r2, r2, r1
+ str r2, [r3]
+ bx lr
+_037F8AB4: .word 0x027FFFB8
+_037F8AB8: .word 0xFFFFFFFD
+
+ arm_func_start OS_ReleaseLockID
+OS_ReleaseLockID: ; 0x037F8ABC
+ ldr r3, _037F8AE8 ; =0x027FFFB8
+ cmp r0, #160 ; 0xa0
+ addpl r3, r3, #4
+ subpl r0, r0, #160 ; 0xa0
+ submi r0, r0, #128 ; 0x80
+ mov r1, #-2147483648 ; 0x80000000
+ mov r1, r1, lsr r0
+ ldr r2, [r3]
+ orr r2, r2, r1
+ str r2, [r3]
+ bx lr
+_037F8AE8: .word 0x027FFFB8
+
+ arm_func_start OS_ReadOwnerOfLockWord
+OS_ReadOwnerOfLockWord: ; 0x037F8AEC
+ ldrh r0, [r0, #4]
+ bx lr
+
+ arm_func_start OSi_FreeCartridgeBus
+OSi_FreeCartridgeBus: ;0x037F8AF4
+ bx lr
+
+ arm_func_start OSi_AllocateCartridgeBus
+OSi_AllocateCartridgeBus: ;0x037F8AF8
+ bx lr
+
+ arm_func_start OS_TryLockCartridge
+OS_TryLockCartridge: ; 0x037F8AFC
+ ldr r1, _037F8B10 ; =0x027FFFE8
+ ldr r2, _037F8B14 ; =OSi_AllocateCartridgeBus
+ mov r3, #1
+ ldr ip, _037F8B18 ; =OSi_DoTryLockByWord
+ bx ip
+_037F8B10: .word 0x027FFFE8
+_037F8B14: .word OSi_AllocateCartridgeBus
+_037F8B18: .word OSi_DoTryLockByWord
+
+ arm_func_start OS_UnlockCartridge
+OS_UnlockCartridge: ; 0x037F8B1C
+ ldr r1, _037F8B30 ; =0x027FFFE8
+ ldr r2, _037F8B34 ; =OSi_FreeCartridgeBus
+ mov r3, #1
+ ldr ip, _037F8B38 ; =OSi_DoUnlockByWord
+ bx ip
+_037F8B30: .word 0x027FFFE8
+_037F8B34: .word OSi_FreeCartridgeBus
+_037F8B38: .word OSi_DoUnlockByWord
+
+ arm_func_start OS_LockCartridge
+OS_LockCartridge: ; 0x037F8B3C
+ ldr r1, _037F8B50 ; =0x027FFFE8
+ ldr r2, _037F8B54 ; =OSi_AllocateCartridgeBus
+ mov r3, #1
+ ldr ip, _037F8B58 ; =OSi_DoLockByWord
+ bx ip
+_037F8B50: .word 0x027FFFE8
+_037F8B54: .word OSi_AllocateCartridgeBus
+_037F8B58: .word OSi_DoLockByWord
+
+ arm_func_start OSi_DoTryLockByWord
+OSi_DoTryLockByWord: ; 0x037F8B5C
+ stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
+ sub sp, sp, #4
+ mov r9, r0
+ mov r8, r1
+ mov r7, r2
+ movs r6, r3
+ beq _037F8B84
+ bl OS_DisableInterrupts_IrqAndFiq
+ mov r5, r0
+ b _037F8B8C
+_037F8B84:
+ bl OS_DisableInterrupts
+ mov r5, r0
+_037F8B8C:
+ mov r0, r9
+ mov r1, r8
+ bl MI_SwapWord
+ movs r4, r0
+ bne _037F8BB4
+ cmp r7, #0
+ beq _037F8BB0
+ mov lr, pc
+ bx r7
+_037F8BB0:
+ strh r9, [r8, #4]
+_037F8BB4:
+ cmp r6, #0
+ beq _037F8BC8
+ mov r0, r5
+ bl OS_RestoreInterrupts_IrqAndFiq
+ b _037F8BD0
+_037F8BC8:
+ mov r0, r5
+ bl OS_RestoreInterrupts
+_037F8BD0:
+ mov r0, r4
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
+ bx lr
+
+ arm_func_start OSi_DoUnlockByWord
+OSi_DoUnlockByWord: ; 0x037F8BE0
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ sub sp, sp, #4
+ mov r7, r1
+ mov r6, r2
+ mov r5, r3
+ ldrh r1, [r7, #4]
+ cmp r0, r1
+ mvnne r0, #1
+ bne _037F8C60
+ cmp r5, #0
+ beq _037F8C18
+ bl OS_DisableInterrupts_IrqAndFiq
+ mov r4, r0
+ b _037F8C20
+_037F8C18:
+ bl OS_DisableInterrupts
+ mov r4, r0
+_037F8C20:
+ mov r0, #0
+ strh r0, [r7, #4]
+ cmp r6, #0
+ beq _037F8C38
+ mov lr, pc
+ bx r6
+_037F8C38:
+ mov r0, #0
+ str r0, [r7]
+ cmp r5, #0
+ beq _037F8C54
+ mov r0, r4
+ bl OS_RestoreInterrupts_IrqAndFiq
+ b _037F8C5C
+_037F8C54:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+_037F8C5C:
+ mov r0, #0
+_037F8C60:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+
+ arm_func_start OSi_DoLockByWord
+OSi_DoLockByWord: ; 0x037F8C6C
+ stmdb sp!, {r4, r5, r6, r7, r8, lr}
+ mov r8, r0
+ mov r7, r1
+ mov r6, r2
+ mov r5, r3
+ mov r4, #1024 ; 0x400
+ b _037F8C90
+_037F8C88:
+ mov r0, r4
+ bl FUN_037F8CB4
+_037F8C90:
+ mov r0, r8
+ mov r1, r7
+ mov r2, r6
+ mov r3, r5
+ bl OSi_DoTryLockByWord
+ cmp r0, #0
+ bgt _037F8C88
+ ldmia sp!, {r4, r5, r6, r7, r8, lr}
+ bx lr
+
+ arm_func_start FUN_037F8CB4
+FUN_037F8CB4: ; 0x037F8CB4 ;part of the above func?
+ ldr ip, _037F8CBC ; =SVC_WaitByLoop
+ bx ip
+_037F8CBC: .word SVC_WaitByLoop
+
+ arm_func_start OS_InitLock
+OS_InitLock: ; 0x037F8CC0
+ stmdb sp!, {r4, r5, lr}
+ sub sp, sp, #4
+ ldr r0, _037F8D38 ; =_03807780
+ ldr r1, [r0]
+ cmp r1, #0
+ bne _037F8D2C
+ mov r1, #1
+ str r1, [r0]
+ mov r0, #0
+ ldr r4, _037F8D3C ; =0x027FFFF0
+ strh r0, [r4, #6]
+ mov r5, #1024 ; 0x400
+ b _037F8CFC
+_037F8CF4:
+ mov r0, r5
+ bl FUN_037F8CB4
+_037F8CFC:
+ ldrh r0, [r4, #4]
+ cmp r0, #127 ; 0x7f
+ bne _037F8CF4
+ mvn r1, #0
+ ldr r0, _037F8D40 ; =0x027FFFB8
+ str r1, [r0]
+ mov r0, #65536 ; 0x10000
+ rsb r1, r0, #0
+ ldr r0, _037F8D44 ; =0x027FFFBC
+ str r1, [r0]
+ mov r0, #191 ; 0xbf
+ strh r0, [r4, #6]
+_037F8D2C:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, lr}
+ bx lr
+_037F8D38: .word _03807780
+_037F8D3C: .word 0x027FFFF0
+_037F8D40: .word 0x027FFFB8
+_037F8D44: .word 0x027FFFBC