summaryrefslogtreecommitdiff
path: root/arm9/asm/WCM_util.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/asm/WCM_util.s')
-rw-r--r--arm9/asm/WCM_util.s156
1 files changed, 156 insertions, 0 deletions
diff --git a/arm9/asm/WCM_util.s b/arm9/asm/WCM_util.s
new file mode 100644
index 00000000..e5ba5702
--- /dev/null
+++ b/arm9/asm/WCM_util.s
@@ -0,0 +1,156 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .bss
+
+ .global wcmRssiIndex
+wcmRssiIndex: ; 0x021CA89C
+ .space 0x4
+
+ .global wcmRssi
+wcmRssi: ; 0x021CA8A0
+ .space 0x10
+
+ .text
+
+ arm_func_start WCMi_ShelterRssi
+WCMi_ShelterRssi: ; 0x020A89D0
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r2, _020A8A48 ; =wcmRssiIndex
+ ands r1, r0, #0x2
+ ldrb r12, [r2, #0x0]
+ movne r0, r0, asr #0x2
+ andne lr, r0, #0xff
+ moveq r0, r0, asr #0x2
+ addeq r0, r0, #0x19
+ andeq lr, r0, #0xff
+ mov r1, r12, lsr #0x1f
+ rsb r0, r1, r12, lsl #0x1c
+ cmp r12, #0x10
+ ldr r3, _020A8A4C ; =wcmRssi
+ add r0, r1, r0, ror #0x1c
+ strb lr, [r3, r0]
+ addcc r0, r12, #0x1
+ strccb r0, [r2, #0x0]
+ addcc sp, sp, #0x4
+ ldmccia sp!, {lr}
+ bxcc lr
+ add r0, r12, #0x1
+ mov r1, r0, lsr #0x1f
+ rsb r0, r1, r0, lsl #0x1c
+ add r0, r1, r0, ror #0x1c
+ add r0, r0, #0x10
+ strb r0, [r2, #0x0]
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020A8A48: .word wcmRssiIndex
+_020A8A4C: .word wcmRssi
+
+ arm_func_start WcmGetLinkLevel
+WcmGetLinkLevel: ; 0x020A8A50
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ bl WCMi_GetRssiAverage
+ mov r1, #0x0
+ cmp r0, #0x1c
+ movcs r1, #0x3
+ bhs _020A8A80
+ cmp r0, #0x16
+ movcs r1, #0x2
+ bhs _020A8A80
+ cmp r0, #0x10
+ movcs r1, #0x1
+_020A8A80:
+ mov r0, r1
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start WCMi_GetRssiAverage
+WCMi_GetRssiAverage: ; 0x020A8A90
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r1, _020A8B20 ; =wcmRssiIndex
+ mov r0, #0x0
+ ldrb r1, [r1, #0x0]
+ cmp r1, #0x10
+ bls _020A8ADC
+ ldr r2, _020A8B24 ; =wcmRssi
+ mov r3, r0
+_020A8AB4:
+ ldrb r1, [r2, #0x0]
+ add r3, r3, #0x1
+ cmp r3, #0x10
+ add r0, r0, r1
+ add r2, r2, #0x1
+ blt _020A8AB4
+ mov r1, r0, asr #0x3
+ add r0, r0, r1, lsr #0x1c
+ mov r0, r0, asr #0x4
+ b _020A8B10
+_020A8ADC:
+ cmp r1, #0x0
+ beq _020A8B10
+ mov r3, r0
+ cmp r1, #0x0
+ ble _020A8B0C
+ ldr ip, _020A8B24 ; =wcmRssi
+_020A8AF4:
+ ldrb r2, [r12, #0x0]
+ add r3, r3, #0x1
+ cmp r3, r1
+ add r0, r0, r2
+ add r12, r12, #0x1
+ blt _020A8AF4
+_020A8B0C:
+ bl _s32_div_f
+_020A8B10:
+ and r0, r0, #0xff
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020A8B20: .word wcmRssiIndex
+_020A8B24: .word wcmRssi
+
+ arm_func_start WCM_GetLinkLevel
+WCM_GetLinkLevel: ; 0x020A8B28
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ bl OS_DisableInterrupts
+ mov r5, r0
+ bl WCMi_GetSystemWork
+ cmp r0, #0x0
+ mov r4, #0x0
+ beq _020A8B60
+ add r0, r0, #0x2000
+ ldr r0, [r0, #0x260]
+ cmp r0, #0x9
+ bne _020A8B60
+ bl WcmGetLinkLevel
+ mov r4, r0
+_020A8B60:
+ mov r0, r5
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+
+ arm_func_start WCM_CompareBssID
+WCM_CompareBssID:
+ mov r12, #0x0
+_020A8B7C:
+ ldrb r3, [r0, r12]
+ ldrb r2, [r1, r12]
+ cmp r3, r2
+ movne r0, #0x0
+ bxne lr
+ add r12, r12, #0x1
+ cmp r12, #0x6
+ blt _020A8B7C
+ mov r0, #0x1
+ bx lr