summaryrefslogtreecommitdiff
path: root/arm7
diff options
context:
space:
mode:
authorEgor Ananyin <ananinegor@gmail.com>2020-06-20 09:18:43 +0300
committerEgor Ananyin <ananinegor@gmail.com>2020-06-20 09:18:43 +0300
commitabd2d1e16494867989e710e5235c6425fa4e8c34 (patch)
tree7eff3e1db566801104a8fc2672bbe57e06f7009e /arm7
parent70556fc300ba85dad248d20b3c79c415e2ef88e5 (diff)
parent12c17948602bf14535c91c530f214b99863e038e (diff)
conflicts
Diffstat (limited to 'arm7')
-rw-r--r--arm7/Makefile1
-rw-r--r--arm7/arm7.lsf7
-rw-r--r--arm7/asm/CARD_pullOut.s1
-rw-r--r--arm7/asm/CTRDG.s248
-rw-r--r--arm7/asm/CTRDG_sp.s542
-rw-r--r--arm7/asm/OS_interrupt.s173
-rw-r--r--arm7/asm/OS_irqHandler.s38
-rw-r--r--arm7/asm/OS_irqTable.s54
-rw-r--r--arm7/asm/OS_spinLock.s278
-rw-r--r--arm7/asm/OS_terminate_proc.s15
-rw-r--r--arm7/asm/SPI_main.s481
-rw-r--r--arm7/asm/SPI_mic.s852
-rw-r--r--arm7/asm/SPI_pm.s847
-rw-r--r--arm7/asm/SPI_tp.s861
-rw-r--r--arm7/asm/wram2.s3620
-rw-r--r--arm7/asm/wram_bss.s120
-rw-r--r--arm7/asm/wram_data.s56
-rw-r--r--arm7/global.inc26
-rw-r--r--arm7/lib/include/MI_dma.h6
-rw-r--r--arm7/lib/include/MI_memory.h10
-rw-r--r--arm7/lib/include/OS_alarm.h9
-rw-r--r--arm7/lib/include/OS_context.h20
-rw-r--r--arm7/lib/include/OS_init.h4
-rw-r--r--arm7/lib/include/OS_interrupt.h17
-rw-r--r--arm7/lib/include/OS_mutex.h9
-rw-r--r--arm7/lib/include/OS_spinLock.h28
-rw-r--r--arm7/lib/include/OS_terminate_proc.h6
-rw-r--r--arm7/lib/include/OS_thread.h36
-rw-r--r--arm7/lib/include/consts.h2
-rw-r--r--arm7/lib/include/mmap.h3
-rw-r--r--arm7/lib/include/registers.h6
-rw-r--r--arm7/lib/include/syscall.h6
-rw-r--r--arm7/lib/include/systemWork.h7
-rw-r--r--arm7/lib/src/OS_init.c2
-rw-r--r--arm7/lib/src/OS_interrupt.c106
-rw-r--r--arm7/lib/src/OS_reset.c2
-rw-r--r--arm7/lib/src/OS_spinLock.c192
-rw-r--r--arm7/lib/src/OS_system.c3
-rw-r--r--arm7/lib/src/OS_terminate_proc.c17
-rw-r--r--arm7/lib/src/OS_thread.c597
40 files changed, 4993 insertions, 4315 deletions
diff --git a/arm7/Makefile b/arm7/Makefile
index 1ade0ed4..1b0cd3c3 100644
--- a/arm7/Makefile
+++ b/arm7/Makefile
@@ -196,7 +196,6 @@ DUMMY != mkdir -p $(ALL_DIRS)
%.pal: ;
# Included files
-baserom.%: ;
%.h: ;
%.inc: ;
diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf
index e5809c12..bfc823a6 100644
--- a/arm7/arm7.lsf
+++ b/arm7/arm7.lsf
@@ -64,8 +64,13 @@ Autoload WRAM
Object CARD_fifo.o
Object CARD_pullOut.o
Object libsyscall.o
+ Object SPI_main.o
+ Object SPI_tp.o
+ Object SPI_pm.o
+ Object SPI_mic.o
+ Object CTRDG.o
+ Object CTRDG_sp.o
Object wram2.o
- Object wram_data.o
Object wram_bss.o
}
diff --git a/arm7/asm/CARD_pullOut.s b/arm7/asm/CARD_pullOut.s
index ed919647..b4d52c6c 100644
--- a/arm7/asm/CARD_pullOut.s
+++ b/arm7/asm/CARD_pullOut.s
@@ -215,4 +215,3 @@ _038010C0:
bx lr
_038010CC: .word _038099A4
_038010D0: .word FUN_03801048
- .balign 2, 0 ; Don't pad with nop
diff --git a/arm7/asm/CTRDG.s b/arm7/asm/CTRDG.s
new file mode 100644
index 00000000..633cbdd3
--- /dev/null
+++ b/arm7/asm/CTRDG.s
@@ -0,0 +1,248 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .section .bss
+
+ .global CTRDGi_Work
+CTRDGi_Work: ;0x03809FB8
+ .space 0x03809FBC - 0x03809FB8
+
+ .section .text
+
+ arm_func_start CTRDGi_SendtoPxi
+CTRDGi_SendtoPxi: ;@ 0x038038C0
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ sub sp, sp, #4
+ mov r7, r0
+ mov r6, #1
+ mov r5, #13
+ mov r4, #0
+ b _038038E4
+_038038DC:
+ mov r0, r6
+ bl FUN_037F8CB4
+_038038E4:
+ mov r0, r5
+ mov r1, r7
+ mov r2, r4
+ bl PXI_SendWordByFifo
+ cmp r0, #0
+ bne _038038DC
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+
+ arm_func_start CTRDGi_UnlockByProcessor
+CTRDGi_UnlockByProcessor: ;@ 0x03803908
+ stmdb sp!, {r4, lr}
+ mov r4, r1
+ ldr r1, [r4]
+ cmp r1, #0
+ bne _03803920
+ bl OS_UnLockCartridge
+_03803920:
+ ldr r0, [r4, #4]
+ bl OS_RestoreInterrupts
+ ldmia sp!, {r4, lr}
+ bx lr
+
+ arm_func_start CTRDGi_LockByProcessor
+CTRDGi_LockByProcessor: ;@ 0x03803930
+ stmdb sp!, {r4, r5, lr}
+ sub sp, sp, #4
+ mov r5, r0
+ mov r4, r1
+ bl OS_DisableInterrupts
+ str r0, [r4, #4]
+ ldr r0, _0380398C ;@ =0x027FFFE8
+ bl OS_ReadOwnerOfLockWord
+ and r0, r0, #128 ;@ 0x80
+ str r0, [r4]
+ ldr r0, [r4]
+ cmp r0, #0
+ bne _03803974
+ mov r0, r5
+ bl OS_TryLockCartridge
+ cmp r0, #0
+ bne _0380397C
+_03803974:
+ mov r0, #1
+ b _03803980
+_0380397C:
+ mov r0, #0
+_03803980:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, lr}
+ bx lr
+_0380398C: .word 0x027FFFE8
+
+ arm_func_start CTRDGi_RestoreAccessCycle
+CTRDGi_RestoreAccessCycle: ;@ 0x03803990
+ ldr r3, [r0]
+ ldr r2, _038039C0 ;@ =0x04000204
+ ldrh r1, [r2]
+ bic r1, r1, #12
+ orr r1, r1, r3, lsl #2
+ strh r1, [r2]
+ ldr r1, [r0, #4]
+ ldrh r0, [r2]
+ bic r0, r0, #16
+ orr r0, r0, r1, lsl #4
+ strh r0, [r2]
+ bx lr
+_038039C0: .word 0x04000204
+
+ arm_func_start CTRDGi_ChangeLatestAccessCycle
+CTRDGi_ChangeLatestAccessCycle: ;@ 0x038039C4
+ ldr r2, _03803A08 ;@ =0x04000204
+ ldrh r1, [r2]
+ and r1, r1, #12
+ mov r1, r1, asr #2
+ str r1, [r0]
+ ldrh r1, [r2]
+ and r1, r1, #16
+ mov r1, r1, asr #4
+ str r1, [r0, #4]
+ ldrh r0, [r2]
+ bic r0, r0, #12
+ orr r0, r0, #12
+ strh r0, [r2]
+ ldrh r0, [r2]
+ bic r0, r0, #16
+ strh r0, [r2]
+ bx lr
+_03803A08: .word 0x04000204
+
+ arm_func_start CTRDG_IsExisting
+CTRDG_IsExisting: ;@ 0x03803A0C
+ stmdb sp!, {r4, lr}
+ sub sp, sp, #16
+ mov r4, #1
+ ldr r2, _03803B20 ;@ =0x027FFC30
+ ldrh r1, [r2]
+ ldr r0, _03803B24 ;@ =0x0000FFFF
+ cmp r1, r0
+ moveq r0, #0
+ beq _03803B14
+ ldrb r0, [r2, #5]
+ mov r0, r0, lsl #30
+ mov r0, r0, lsr #31
+ cmp r0, #1
+ moveq r0, #0
+ beq _03803B14
+ ldr r0, _03803B28 ;@ =CTRDGi_Work
+ ldrh r0, [r0, #2]
+ add r1, sp, #0
+ bl CTRDGi_LockByProcessor
+ cmp r0, #0
+ bne _03803A70
+ ldr r0, [sp, #4]
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ b _03803B14
+_03803A70:
+ add r0, sp, #8
+ bl CTRDGi_ChangeLatestAccessCycle
+ mov r2, #134217728 ;@ 0x8000000
+ ldrb r3, [r2, #178] ;@ 0xb2
+ cmp r3, #150 ;@ 0x96
+ bne _03803A9C
+ ldr r0, _03803B20 ;@ =0x027FFC30
+ ldrh r1, [r0]
+ ldrh r0, [r2, #190] ;@ 0xbe
+ cmp r1, r0
+ bne _03803AE4
+_03803A9C:
+ cmp r3, #150 ;@ 0x96
+ beq _03803ABC
+ ldr r0, _03803B20 ;@ =0x027FFC30
+ ldrh r1, [r0]
+ ldr r0, _03803B2C ;@ =0x0801FFFE
+ ldrh r0, [r0]
+ cmp r1, r0
+ bne _03803AE4
+_03803ABC:
+ ldr r2, _03803B20 ;@ =0x027FFC30
+ ldr r1, [r2, #8]
+ mov r0, #134217728 ;@ 0x8000000
+ ldr r0, [r0, #172] ;@ 0xac
+ cmp r1, r0
+ beq _03803AF8
+ ldrb r0, [r2, #5]
+ mov r0, r0, lsl #31
+ movs r0, r0, lsr #31
+ beq _03803AF8
+_03803AE4:
+ ldr r1, _03803B20 ;@ =0x027FFC30
+ ldrb r0, [r1, #5]
+ orr r0, r0, #2
+ strb r0, [r1, #5]
+ mov r4, #0
+_03803AF8:
+ add r0, sp, #8
+ bl CTRDGi_RestoreAccessCycle
+ ldr r0, _03803B28 ;@ =CTRDGi_Work
+ ldrh r0, [r0, #2]
+ add r1, sp, #0
+ bl CTRDGi_UnlockByProcessor
+ mov r0, r4
+_03803B14:
+ add sp, sp, #16
+ ldmia sp!, {r4, lr}
+ bx lr
+_03803B20: .word 0x027FFC30
+_03803B24: .word 0x0000FFFF
+_03803B28: .word CTRDGi_Work
+_03803B2C: .word 0x0801FFFE
+
+ arm_func_start CTRDG_IsPulledOut
+CTRDG_IsPulledOut: ;@ 0x03803B30
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ ldr r2, _03803B80 ;@ =0x027FFC30
+ ldrh r1, [r2]
+ ldr r0, _03803B84 ;@ =0x0000FFFF
+ cmp r1, r0
+ moveq r0, #0
+ beq _03803B74
+ ldrb r0, [r2, #5]
+ mov r0, r0, lsl #30
+ movs r0, r0, lsr #31
+ bne _03803B64
+ bl CTRDG_IsExisting
+_03803B64:
+ ldr r0, _03803B80 ;@ =0x027FFC30
+ ldrb r0, [r0, #5]
+ mov r0, r0, lsl #30
+ mov r0, r0, lsr #31
+_03803B74:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_03803B80: .word 0x027FFC30
+_03803B84: .word 0x0000FFFF
+
+ arm_func_start CTRDGi_InitCommon
+CTRDGi_InitCommon: ;@ 0x03803B88
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ mov r0, #0
+ str r0, [sp]
+ add r0, sp, #0
+ ldr r1, _03803BC0 ;@ =CTRDGi_Work
+ ldr r2, _03803BC4 ;@ =0x05000001
+ bl FUN_03803BC8
+ bl OS_GetLockID
+ ldr r1, _03803BC0 ;@ =CTRDGi_Work
+ strh r0, [r1, #2]
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_03803BC0: .word CTRDGi_Work
+_03803BC4: .word 0x05000001
+
+ arm_func_start FUN_03803BC8
+FUN_03803BC8: ;@ 0x03803BC8
+ ldr ip, _03803BD0 ;@ =SVC_CpuSet
+ bx ip
+_03803BD0: .word SVC_CpuSet
diff --git a/arm7/asm/CTRDG_sp.s b/arm7/asm/CTRDG_sp.s
new file mode 100644
index 00000000..72c502c3
--- /dev/null
+++ b/arm7/asm/CTRDG_sp.s
@@ -0,0 +1,542 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .section .data
+
+ .global _03807704
+_03807704:
+ .word 0x00000001
+
+ .global _03807708
+_03807708:
+ .word 0xFFFFFFFF
+
+ .section .bss
+
+ .global _03809FBC
+_03809FBC: ;0x03809FBC
+ .space 0x03809FC0 - 0x03809FBC
+
+ .global current_vib
+current_vib: ;0x03809FC0
+ .space 0x03809FC4 - 0x03809FC0
+
+ .global _03809FC4
+_03809FC4: ;0x03809FC4
+ .space 0x03809FC8 - 0x03809FC4
+
+ .global _03809FC8
+_03809FC8: ;0x03809FC8
+ .space 0x03809FCC - 0x03809FC8
+
+ .global _03809FCC
+_03809FCC: ;0x03809FCC
+ .space 0x03809FD0 - 0x03809FCC
+
+ .global _03809FD0
+_03809FD0: ;0x03809FD0
+ .space 0x03809FD4 - 0x03809FD0
+
+ .global _03809FD4
+_03809FD4: ;0x03809FD4
+ .space 0x03809FEC - 0x03809FD4
+
+ .global _03809FEC
+_03809FEC: ;0x03809FEC
+ .space 0x0380A018 - 0x03809FEC
+
+ .section .text
+
+ arm_func_start FUN_03803BD4
+FUN_03803BD4: ;@ 0x03803BD4
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ sub sp, sp, #4
+ and r0, r1, #63 ;@ 0x3f
+ cmp r0, #3
+ bne _03803C40
+ ldr r0, _03803C50 ;@ =0x01FFFFC0
+ and r0, r1, r0
+ mov r2, r0, lsr #6
+ ldr r1, _03803C54 ;@ =0x04000204
+ ldrh r0, [r1]
+ bic r0, r0, #96 ;@ 0x60
+ orr r0, r0, r2, lsl #5
+ strh r0, [r1]
+ mov r7, #1
+ mov r6, #17
+ mov r5, #18
+ mov r4, #0
+ b _03803C24
+_03803C1C:
+ mov r0, r7
+ bl FUN_037F8CB4
+_03803C24:
+ mov r0, r6
+ mov r1, r5
+ mov r2, r4
+ bl PXI_SendWordByFifo
+ cmp r0, #0
+ bne _03803C1C
+ b _03803C44
+_03803C40:
+ bl OS_Terminate
+_03803C44:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+_03803C50: .word 0x01FFFFC0
+_03803C54: .word 0x04000204
+
+ arm_func_start CTRDGi_TerminateARM7
+CTRDGi_TerminateARM7: ;@ 0x03803C58
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ mov r0, #0
+ bl CTRDG_VibPulseEdgeUpdate
+ bl SND_BeginSleep
+ bl WVR_Shutdown
+ bl OS_Terminate
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start CTRDG_CheckPullOut_Polling
+CTRDG_CheckPullOut_Polling: ;@ 0x03803C80
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ sub sp, sp, #4
+ ldr r1, _03803D80 ;@ =_03807708
+ ldr r3, [r1]
+ mvn r0, #0
+ cmp r3, r0
+ ldreq r0, _03803D84 ;@ =0x027FFC3C
+ ldreq r0, [r0]
+ addeq r0, r0, #10
+ streq r0, [r1]
+ beq _03803D74
+ ldr r0, _03803D88 ;@ =_03809FCC
+ ldr r0, [r0]
+ cmp r0, #0
+ bne _03803D74
+ ldr r0, _03803D8C ;@ =_03809FC8
+ ldr r0, [r0]
+ cmp r0, #0
+ bne _03803D74
+ ldr r2, _03803D84 ;@ =0x027FFC3C
+ ldr r0, [r2]
+ cmp r0, r3
+ bcc _03803D74
+ ldr r0, [r2]
+ add r0, r0, #10
+ str r0, [r1]
+ bl CTRDG_IsPulledOut
+ ldr r1, _03803D8C ;@ =_03809FC8
+ str r0, [r1]
+ bl CTRDG_IsExisting
+ cmp r0, #0
+ bne _03803D28
+ ldr r0, _03803D90 ;@ =_03807704
+ ldr r0, [r0]
+ cmp r0, #0
+ movne r1, #1
+ ldrne r0, _03803D88 ;@ =_03809FCC
+ strne r1, [r0]
+ bne _03803D74
+ mov r1, #1
+ ldr r0, _03803D8C ;@ =_03809FC8
+ str r1, [r0]
+_03803D28:
+ mov r7, #0
+ ldr r0, _03803D90 ;@ =_03807704
+ str r7, [r0]
+ ldr r0, _03803D8C ;@ =_03809FC8
+ ldr r0, [r0]
+ cmp r0, #0
+ beq _03803D74
+ mov r6, #100 ;@ 0x64
+ mov r5, #13
+ mov r4, #17
+ b _03803D5C
+_03803D54:
+ mov r0, r6
+ bl OS_Sleep
+_03803D5C:
+ mov r0, r5
+ mov r1, r4
+ mov r2, r7
+ bl PXI_SendWordByFifo
+ cmp r0, #0
+ bne _03803D54
+_03803D74:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+_03803D80: .word _03807708
+_03803D84: .word 0x027FFC3C
+_03803D88: .word _03809FCC
+_03803D8C: .word _03809FC8
+_03803D90: .word _03807704
+
+ arm_func_start CTRDGi_IsNinLogoOfAgb
+CTRDGi_IsNinLogoOfAgb: ;@ 0x03803D94
+ stmdb sp!, {r4, r5, r6, r7, r8, lr}
+ mov r7, r0
+ mov r0, #134217728 ;@ 0x8000000
+ add r6, r0, #4
+ mov r4, #1
+ bl OS_GetLockID
+ mov r0, r0, lsl #16
+ mov r5, r0, lsr #16
+ mov r0, r5
+ bl OS_LockCartridge
+ mov r1, #0
+ ldr r0, _03803E3C ;@ =0x0000FFFF
+ eor r2, r0, #3
+ mov r2, r2, lsl #16
+ mov lr, r2, lsr #16
+ eor r2, r0, #132 ;@ 0x84
+ mov r2, r2, lsl #16
+ mov r8, r2, lsr #16
+ b _03803E18
+_03803DE0:
+ mov ip, r0
+ cmp r1, #76 ;@ 0x4c
+ moveq ip, r8
+ beq _03803DF8
+ cmp r1, #77 ;@ 0x4d
+ moveq ip, lr
+_03803DF8:
+ mov r3, r1, lsl #1
+ ldrh r2, [r7, r3]
+ and ip, ip, r2
+ ldrh r2, [r6, r3]
+ cmp ip, r2
+ movne r4, #0
+ bne _03803E20
+ add r1, r1, #1
+_03803E18:
+ cmp r1, #78 ;@ 0x4e
+ blt _03803DE0
+_03803E20:
+ mov r0, r5
+ bl OS_UnLockCartridge
+ mov r0, r5
+ bl OS_ReleaseLockID
+ mov r0, r4
+ ldmia sp!, {r4, r5, r6, r7, r8, lr}
+ bx lr
+_03803E3C: .word 0x0000FFFF
+
+ arm_func_start FUN_03803E40
+FUN_03803E40: ;@ 0x03803E40
+ ldr r1, _03803E54 ;@ =current_vib
+ str r0, [r1]
+ ldr r1, _03803E58 ;@ =0x08001000
+ strh r0, [r1]
+ bx lr
+_03803E54: .word current_vib
+_03803E58: .word 0x08001000
+
+ arm_func_start CTRDG_VibPulseEdgeUpdate
+CTRDG_VibPulseEdgeUpdate: ;@ 0x03803E5C
+ stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
+ sub sp, sp, #4
+ movs r5, r0
+ beq _03803E9C
+ ldr r0, [r5]
+ cmp r0, #0
+ bne _03803E9C
+ ldr r0, [r5, #68] ;@ 0x44
+ add r0, r0, #1
+ str r0, [r5, #68] ;@ 0x44
+ ldr r1, [r5, #64] ;@ 0x40
+ cmp r1, #0
+ beq _03803E9C
+ ldr r0, [r5, #68] ;@ 0x44
+ cmp r0, r1
+ movhi r5, #0
+_03803E9C:
+ cmp r5, #0
+ beq _03803EB0
+ ldr r0, [r5, #60] ;@ 0x3c
+ cmp r0, #0
+ bne _03803F48
+_03803EB0:
+ bl OS_DisableInterrupts
+ mov r9, r0
+ ldr r0, _03804068 ;@ =current_vib
+ ldr r0, [r0]
+ cmp r0, #2
+ bne _03803F34
+ mov r8, #0
+ ldr r7, _0380406C ;@ =0x027FFFE8
+ ldr r4, _03804070 ;@ =_03809FBC
+ ldr fp, _03804074 ;@ =0x000080E8
+ mov r6, r8
+ mov r5, #1
+ b _03803F2C
+_03803EE4:
+ mov r0, r7
+ bl OS_ReadOwnerOfLockWord
+ ands sl, r0, #128 ;@ 0x80
+ bne _03803F04
+ ldrh r0, [r4]
+ bl OS_TryLockCartridge
+ cmp r0, #0
+ bne _03803F24
+_03803F04:
+ mov r0, r6
+ bl FUN_03803E40
+ mov r8, r5
+ cmp sl, #0
+ bne _03803F2C
+ ldrh r0, [r4]
+ bl OS_UnlockCartridge
+ b _03803F2C
+_03803F24:
+ mov r0, fp
+ bl OS_SpinWait
+_03803F2C:
+ cmp r8, #0
+ beq _03803EE4
+_03803F34:
+ ldr r0, _03804078 ;@ =_03809FEC
+ bl OS_CancelAlarm
+ mov r0, r9
+ bl OS_RestoreInterrupts
+ b _0380405C
+_03803F48:
+ cmp r5, #0
+ beq _0380405C
+ ldr r0, _0380406C ;@ =0x027FFFE8
+ bl OS_ReadOwnerOfLockWord
+ ands r4, r0, #128 ;@ 0x80
+ bne _03803F74
+ ldr r0, _03804070 ;@ =_03809FBC
+ ldrh r0, [r0]
+ bl OS_TryLockCartridge
+ cmp r0, #0
+ bne _03804044
+_03803F74:
+ ldr r1, [r5]
+ ldr r0, [r5, #4]
+ cmp r1, r0
+ bne _03803FB0
+ mov r0, #0
+ bl FUN_03803E40
+ str r5, [sp]
+ ldr r0, _03804078 ;@ =_03809FEC
+ ldr r1, [r5, #8]
+ mov r2, #0
+ ldr r3, _0380407C ;@ =CTRDG_VibPulseEdgeUpdate
+ bl OS_SetAlarm
+ mov r0, #0
+ str r0, [r5]
+ b _0380402C
+_03803FB0:
+ ands r0, r1, #1
+ beq _03803FF4
+ mov r0, #0
+ bl FUN_03803E40
+ str r5, [sp]
+ ldr r0, _03804078 ;@ =_03809FEC
+ ldr r1, [r5]
+ mov r1, r1, lsr #1
+ add r1, r5, r1, lsl #2
+ ldr r1, [r1, #36] ;@ 0x24
+ mov r2, #0
+ ldr r3, _0380407C ;@ =CTRDG_VibPulseEdgeUpdate
+ bl OS_SetAlarm
+ ldr r0, [r5]
+ add r0, r0, #1
+ str r0, [r5]
+ b _0380402C
+_03803FF4:
+ mov r0, #2
+ bl FUN_03803E40
+ str r5, [sp]
+ ldr r0, _03804078 ;@ =_03809FEC
+ ldr r1, [r5]
+ mov r1, r1, lsr #1
+ add r1, r5, r1, lsl #2
+ ldr r1, [r1, #12]
+ mov r2, #0
+ ldr r3, _0380407C ;@ =CTRDG_VibPulseEdgeUpdate
+ bl OS_SetAlarm
+ ldr r0, [r5]
+ add r0, r0, #1
+ str r0, [r5]
+_0380402C:
+ cmp r4, #0
+ bne _0380405C
+ ldr r0, _03804070 ;@ =_03809FBC
+ ldrh r0, [r0]
+ bl OS_UnlockCartridge
+ b _0380405C
+_03804044:
+ str r5, [sp]
+ ldr r0, _03804078 ;@ =_03809FEC
+ ldr r1, _03804080 ;@ =0x0000020B
+ mov r2, #0
+ ldr r3, _0380407C ;@ =CTRDG_VibPulseEdgeUpdate
+ bl OS_SetAlarm
+_0380405C:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
+ bx lr
+_03804068: .word current_vib
+_0380406C: .word 0x027FFFE8
+_03804070: .word _03809FBC
+_03804074: .word 0x000080E8
+_03804078: .word _03809FEC
+_0380407C: .word CTRDG_VibPulseEdgeUpdate
+_03804080: .word 0x0000020B
+_03804084:
+ mov r0, r1
+ ldr ip, _03804090 ;@ =CTRDG_VibPulseEdgeUpdate
+ bx ip
+_03804090: .word CTRDG_VibPulseEdgeUpdate
+
+ arm_func_start CTRDGi_CallbackForPulledOut
+CTRDGi_CallbackForPulledOut: ;@ 0x03804094
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ and r0, r1, #63 ;@ 0x3ff
+ cmp r0, #2
+ bne _038040B0
+ bl CTRDGi_TerminateARM7
+ b _038040B4
+_038040B0:
+ bl OS_Terminate
+_038040B4:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start CTRDGi_CallbackForInitModuleInfo
+CTRDGi_CallbackForInitModuleInfo: ;@ 0x038040C0
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ and r0, r1, #63 ;@ 0x3f
+ cmp r0, #1
+ ldreq r0, _038040F4 ;@ =_03809FD4
+ streq r1, [r0]
+ moveq r1, #1
+ streq r1, [r0, #16]
+ beq _038040E8
+ bl OS_Terminate
+_038040E8:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_038040F4: .word _03809FD4
+
+ arm_func_start CTRDGi_InitModuleInfo
+CTRDGi_InitModuleInfo: ;@ 0x038040F8
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ sub sp, sp, #4
+ ldr r0, _038041C8 ;@ =_03809FC4
+ ldr r1, [r0]
+ cmp r1, #0
+ bne _038041BC
+ mov r1, #1
+ str r1, [r0]
+ ldr r0, _038041CC ;@ =0x04000300
+ ldrh r0, [r0]
+ ands r0, r0, #1
+ beq _038041BC
+ mov r0, #262144 ;@ 0x40000
+ bl OS_SetIrqMask
+ mov r5, r0
+ ldr r1, _038041D0 ;@ =0x04000208
+ ldrh r4, [r1]
+ mov r0, #1
+ strh r0, [r1]
+ mov r7, #256 ;@ 0x100
+ ldr r6, _038041D4 ;@ =_03809FD4
+ b _03804158
+_03804150:
+ mov r0, r7
+ bl FUN_037F8CB4
+_03804158:
+ ldr r0, [r6, #16]
+ cmp r0, #1
+ bne _03804150
+ ldr r1, [r6]
+ ldr r0, _038041D8 ;@ =0x01FFFFC0
+ and r0, r1, r0
+ mov r0, r0, lsr #6
+ mov r0, r0, lsl #5
+ add r0, r0, #33554432 ;@ 0x2000000
+ add r0, r0, #4
+ bl CTRDGi_IsNinLogoOfAgb
+ ldr r2, _038041DC ;@ =0x027FFC30
+ ldrb r1, [r2, #5]
+ bic r1, r1, #1
+ and r0, r0, #255 ;@ 0xff
+ and r0, r0, #1
+ orr r0, r1, r0
+ strb r0, [r2, #5]
+ mov r0, #1
+ bl CTRDGi_SendtoPxi
+ ldr r1, _038041D0 ;@ =0x04000208
+ ldrh r0, [r1]
+ strh r4, [r1]
+ mov r0, r5
+ bl OS_SetIrqMask
+_038041BC:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+_038041C8: .word _03809FC4
+_038041CC: .word 0x04000300
+_038041D0: .word 0x04000208
+_038041D4: .word _03809FD4
+_038041D8: .word 0x01FFFFC0
+_038041DC: .word 0x027FFC30
+
+ arm_func_start CTRDG_Init
+CTRDG_Init: ;@ 0x038041E0
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ bl OS_InitTick
+ bl OS_InitAlarm
+ ldr r0, _03804270 ;@ =_03809FEC
+ bl OS_CreateAlarm
+ ldr r0, _03804274 ;@ =_03809FD0
+ ldr r1, [r0]
+ cmp r1, #0
+ bne _03804264
+ mov r1, #1
+ str r1, [r0]
+ bl CTRDGi_InitCommon
+ bl OS_GetLockID
+ mvn r1, #2
+ cmp r0, r1
+ beq _03804264
+ ldr r1, _03804278 ;@ =_03809FBC
+ strh r0, [r1]
+ bl PXI_Init
+ mov r0, #13
+ ldr r1, _0380427C ;@ =CTRDGi_CallbackForInitModuleInfo
+ bl PXI_SetFifoRecvCallback
+ bl CTRDGi_InitModuleInfo
+ mov r0, #13
+ ldr r1, _03804280 ;@ =CTRDGi_CallbackForPulledOut
+ bl PXI_SetFifoRecvCallback
+ mov r0, #16
+ ldr r1, _03804284 ;@ =_03804084
+ bl PXI_SetFifoRecvCallback
+ mov r0, #17
+ ldr r1, _03804288 ;@ =FUN_03803BD4
+ bl PXI_SetFifoRecvCallback
+_03804264:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_03804270: .word _03809FEC
+_03804274: .word _03809FD0
+_03804278: .word _03809FBC
+_0380427C: .word CTRDGi_CallbackForInitModuleInfo
+_03804280: .word CTRDGi_CallbackForPulledOut
+_03804284: .word _03804084
+_03804288: .word FUN_03803BD4
diff --git a/arm7/asm/OS_interrupt.s b/arm7/asm/OS_interrupt.s
deleted file mode 100644
index 0a999637..00000000
--- a/arm7/asm/OS_interrupt.s
+++ /dev/null
@@ -1,173 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global _03807744
-_03807744: ;0x03807744
- .space 0x03807748 - 0x03807744
-
- .global _03807748
-_03807748: ;0x03807748
- .space 0x0380774C - 0x03807748
-
- .global _0380774C
-_0380774C: ;0x0380774C
- .space 0x03807774 - 0x0380774C
-
- .global _03807774
-_03807774: ;0x03807774
- .space 0x03807780 - 0x03807774
-
- .section .text
-
- arm_func_start OS_ResetRequestIrqMask
-OS_ResetRequestIrqMask: ; 0x037F8824
- ldr ip, _037F8850 ; =0x04000208
- ldrh r3, [ip]
- mov r1, #0
- strh r1, [ip]
- ldr r2, _037F8854 ; =0x04000214
- ldr r1, [r2]
- str r0, [r2]
- ldrh r0, [ip]
- strh r3, [ip]
- mov r0, r1
- bx lr
-_037F8850: .word 0x04000208
-_037F8854: .word 0x04000214
-
- arm_func_start OS_DisableIrqMask
-OS_DisableIrqMask: ; 0x037F8858
- ldr ip, _037F888C ; =0x04000208
- ldrh r3, [ip]
- mov r1, #0
- strh r1, [ip]
- ldr r2, _037F8890 ; =0x04000210
- ldr r1, [r2]
- mvn r0, r0
- and r0, r1, r0
- str r0, [r2]
- ldrh r0, [ip]
- strh r3, [ip]
- mov r0, r1
- bx lr
-_037F888C: .word 0x04000208
-_037F8890: .word 0x04000210
-
- arm_func_start OS_EnableIrqMask
-OS_EnableIrqMask: ; 0x037F8894
- ldr ip, _037F88C4 ; =0x04000208
- ldrh r3, [ip]
- mov r1, #0
- strh r1, [ip]
- ldr r2, _037F88C8 ; =0x04000210
- ldr r1, [r2]
- orr r0, r1, r0
- str r0, [r2]
- ldrh r0, [ip]
- strh r3, [ip]
- mov r0, r1
- bx lr
-_037F88C4: .word 0x04000208
-_037F88C8: .word 0x04000210
-
- arm_func_start OS_SetIrqMask
-OS_SetIrqMask: ; 0x037F88CC
- ldr ip, _037F88F8 ; =0x04000208
- ldrh r3, [ip]
- mov r1, #0
- strh r1, [ip]
- ldr r2, _037F88FC ; =0x04000210
- ldr r1, [r2]
- str r0, [r2]
- ldrh r0, [ip]
- strh r3, [ip]
- mov r0, r1
- bx lr
-_037F88F8: .word 0x04000208
-_037F88FC: .word 0x04000210
-
- arm_func_start OSi_EnterTimerCallback
-OSi_EnterTimerCallback: ; 0x037F8900
- stmdb sp!, {r4, lr}
- mov r3, #12
- mul r4, r0, r3
- ldr r3, _037F8940 ; =_03807744
- str r1, [r3, r4]
- ldr r1, _037F8944 ; =_0380774C
- str r2, [r1, r4]
- mov r1, #1
- add r0, r0, #3
- mov r0, r1, lsl r0
- bl OS_EnableIrqMask
- mov r1, #1
- ldr r0, _037F8948 ; =_03807748
- str r1, [r0, r4]
- ldmia sp!, {r4, lr}
- bx lr
-_037F8940: .word _03807744
-_037F8944: .word _0380774C
-_037F8948: .word _03807748
-
- arm_func_start OS_SetIrqFunction
-OS_SetIrqFunction: ; 0x037F894C
- stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
- sub sp, sp, #4
- mov r9, #0
- mov r7, r9
- ldr lr, _037F89E8 ; =OS_IRQTable
- ldr r4, _037F89EC ; =_03807774
- ldr r6, _037F89F0 ; =OSi_IrqCallbackInfo
- mov ip, r9
- mov r3, #1
- mov r2, #12
-_037F8974:
- ands r5, r0, #1
- beq _037F89CC
- mov r8, r7
- cmp r9, #8
- blt _037F8998
- cmp r9, #11
- suble r5, r9, #8
- mlale r8, r5, r2, r6
- ble _037F89BC
-_037F8998:
- cmp r9, #3
- blt _037F89B0
- cmp r9, #6
- addle r5, r9, #1
- mlale r8, r5, r2, r6
- ble _037F89BC
-_037F89B0:
- cmp r9, #0
- moveq r8, r4
- strne r1, [lr, r9, lsl #2]
-_037F89BC:
- cmp r8, #0
- strne r1, [r8]
- strne ip, [r8, #8]
- strne r3, [r8, #4]
-_037F89CC:
- mov r0, r0, lsr #1
- add r9, r9, #1
- cmp r9, #25
- blt _037F8974
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
- bx lr
-_037F89E8: .word OS_IRQTable
-_037F89EC: .word _03807774
-_037F89F0: .word OSi_IrqCallbackInfo
-
- arm_func_start OS_InitIrqTable
-OS_InitIrqTable: ; 0x037F89F4
- mov r1, #0
- ldr r0, _037F8A10 ; =OSi_IrqThreadQueue
- str r1, [r0, #4]
- str r1, [r0]
- ldr r0, _037F8A14 ; =0x027FFC3C
- str r1, [r0]
- bx lr
-_037F8A10: .word OSi_IrqThreadQueue
-_037F8A14: .word 0x027FFC3C
diff --git a/arm7/asm/OS_irqHandler.s b/arm7/asm/OS_irqHandler.s
index 6c3ffc5a..b05113f1 100644
--- a/arm7/asm/OS_irqHandler.s
+++ b/arm7/asm/OS_irqHandler.s
@@ -1,44 +1,6 @@
.include "asm/macros.inc"
.include "global.inc"
- .section .data
-
- .global _038075E4
-_038075E4:
- .word 0x00090008
- .word 0x000B000A
- .word 0x00040003
- .word 0x00060005
- .word 0x00000000
-
- .global OS_IRQTable
-OS_IRQTable:
- .word OSi_IrqVBlank
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OSi_IrqTimer0
- .word OSi_IrqTimer1
- .word OSi_IrqTimer2
- .word OSi_IrqTimer3
- .word OS_IrqDummy
- .word OSi_IrqDma0
- .word OSi_IrqDma1
- .word OSi_IrqDma2
- .word OSi_IrqDma3
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
- .word OS_IrqDummy
-
.section .text
arm_func_start OS_IrqHandler
diff --git a/arm7/asm/OS_irqTable.s b/arm7/asm/OS_irqTable.s
index a61e448f..36a550fe 100644
--- a/arm7/asm/OS_irqTable.s
+++ b/arm7/asm/OS_irqTable.s
@@ -1,6 +1,44 @@
.include "asm/macros.inc"
.include "global.inc"
+ .section .data
+
+ .global _038075E4
+_038075E4:
+ .word 0x00090008
+ .word 0x000B000A
+ .word 0x00040003
+ .word 0x00060005
+ .word 0x00000000
+
+ .global OS_IRQTable
+OS_IRQTable:
+ .word OSi_IrqVBlank
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+ .word OSi_IrqTimer0
+ .word OSi_IrqTimer1
+ .word OSi_IrqTimer2
+ .word OSi_IrqTimer3
+ .word OS_IrqDummy
+ .word OSi_IrqDma0
+ .word OSi_IrqDma1
+ .word OSi_IrqDma2
+ .word OSi_IrqDma3
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+ .word OS_IrqDummy
+
.section .bss
.global OSi_IrqThreadQueue
@@ -19,6 +57,22 @@ _03807718: ;0x03807718
_0380771C: ;0x0380771C
.space 0x03807744 - 0x0380771C
+ .global _03807744
+_03807744: ;0x03807744
+ .space 0x03807748 - 0x03807744
+
+ .global _03807748
+_03807748: ;0x03807748
+ .space 0x0380774C - 0x03807748
+
+ .global _0380774C
+_0380774C: ;0x0380774C
+ .space 0x03807774 - 0x0380774C
+
+ .global _03807774
+_03807774: ;0x03807774
+ .space 0x03807780 - 0x03807774
+
.section .text
arm_func_start OSi_IrqVBlank
diff --git a/arm7/asm/OS_spinLock.s b/arm7/asm/OS_spinLock.s
deleted file mode 100644
index bb15916e..00000000
--- a/arm7/asm/OS_spinLock.s
+++ /dev/null
@@ -1,278 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global _03807780
-_03807780: ;0x03807780
- .space 0x03807784 - 0x03807780
-
- .section .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
diff --git a/arm7/asm/OS_terminate_proc.s b/arm7/asm/OS_terminate_proc.s
deleted file mode 100644
index 08b79c9a..00000000
--- a/arm7/asm/OS_terminate_proc.s
+++ /dev/null
@@ -1,15 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start OS_Terminate
-OS_Terminate: ; 0x037FB1F0
- stmfd sp!, {lr}
- sub sp, sp, #4
- mov r0, #0
- bl CTRDG_VibPulseEdgeUpdate
-_037FB200:
- bl OS_DisableInterrupts
- bl FUN_037F8530
- b _037FB200
diff --git a/arm7/asm/SPI_main.s b/arm7/asm/SPI_main.s
new file mode 100644
index 00000000..15229ce6
--- /dev/null
+++ b/arm7/asm/SPI_main.s
@@ -0,0 +1,481 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .section .bss
+
+ .global _038099AC
+_038099AC: ;0x038099AC
+ .space 0x038099B0 - 0x038099AC
+
+ .global _038099B0
+_038099B0: ;0x038099B0
+ .space 0x038099B8 - 0x038099B0
+
+ .global _038099B8
+_038099B8: ;0x038099B8
+ .space 0x03809C5C - 0x038099B8
+
+ .global _03809C5C
+_03809C5C: ;0x03809C5C
+ .space 0x03809C7C - 0x03809C5C
+
+ .global _03809C7C
+_03809C7C: ;0x03809C7C
+ .space 0x03809CBC - 0x03809C7C
+
+ .global _03809CBC
+_03809CBC: ;0x03809CBC
+ .space 0x03809CC0 - 0x03809CBC
+
+ .global _03809CC0
+_03809CC0: ;0x03809CC0
+ .space 0x03809E40 - 0x03809CC0
+
+ .global _03809E40
+_03809E40: ;0x03809E40
+ .space 0x03809E4C - 0x03809E40
+
+ .section .text
+
+ arm_func_start FUN_03801150
+FUN_03801150: ;@ 0x03801150
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ cmp r2, #0
+ bne _038011B4
+ sub r0, r0, #4
+ cmp r0, #5
+ addls pc, pc, r0, lsl #2
+ b _038011B4
+ b _038011AC
+ b _038011B4
+ b _03801188
+ b _038011B4
+ b _038011A0
+ b _03801194
+_03801188:
+ mov r0, r1
+ bl TP_AnalyzeCommand
+ b _038011B4
+_03801194:
+ mov r0, r1
+ bl MIC_AnalyzeCommand
+ b _038011B4
+_038011A0:
+ mov r0, r1
+ bl PM_AnalyzeCommand
+ b _038011B4
+_038011AC:
+ mov r0, r1
+ bl NVRAM_AnalyzeCommand
+_038011B4:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start FUN_038011C0
+FUN_038011C0: ;@ 0x038011C0
+ stmdb sp!, {r4, r5, r6, lr}
+ sub sp, sp, #8
+ ldr r6, _03801228 ;@ =_03809C5C
+ add r5, sp, #0
+ mov r4, #1
+_038011D4:
+ mov r0, r6
+ mov r1, r5
+ mov r2, r4
+ bl OS_ReceiveMessage
+ ldr r0, [sp]
+ ldr r1, [r0]
+ cmp r1, #3
+ addls pc, pc, r1, lsl #2
+ b _038011D4
+ b _03801208
+ b _03801220
+ b _03801210
+ b _03801218
+_03801208:
+ bl TP_ExecuteProcess
+ b _038011D4
+_03801210:
+ bl MIC_ExecuteProcess
+ b _038011D4
+_03801218:
+ bl PM_ExecuteProcess
+ b _038011D4
+_03801220:
+ bl NVRAM_ExecuteProcess
+ b _038011D4
+_03801228: .word _03809C5C
+
+ arm_func_start SPIi_CheckEntry
+SPIi_CheckEntry: ;@ 0x0380122C
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ ldr r0, _03801250 ;@ =_03809C5C
+ add r1, sp, #0
+ mov r2, #0
+ bl OS_ReadMessage
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_03801250: .word _03809C5C
+
+ arm_func_start SPIi_SetEntry
+SPIi_SetEntry: ;@ 0x03801254
+ stmdb sp!, {r0, r1, r2, r3}
+ stmdb sp!, {r4, r5, r6, lr}
+ mov r5, r0
+ mov r4, r1
+ ldrh r0, [sp, #24]
+ cmp r0, #4
+ movhi r0, #0
+ bhi _0380130C
+ bl OS_DisableInterrupts
+ ldr r2, _03801318 ;@ =_038099B0
+ ldr r3, [r2, #1164] ;@ 0x48c
+ mov r1, #24
+ mul ip, r3, r1
+ ldr r3, _0380131C ;@ =_03809CBC
+ str r5, [r3, ip]
+ ldr r3, [r2, #1164] ;@ 0x48c
+ mul r5, r3, r1
+ ldr r3, _03801320 ;@ =_03809CC0
+ str r4, [r3, r5]
+ add r3, sp, #24
+ bic r3, r3, #3
+ add r6, r3, #4
+ mov lr, #0
+ ldrh ip, [sp, #24]
+ b _038012D4
+_038012B8:
+ add r6, r6, #4
+ ldr r5, [r6, #-4]
+ ldr r4, [r2, #1164] ;@ 0x48c
+ mla r3, r4, r1, r2
+ add r3, r3, lr, lsl #2
+ str r5, [r3, #788] ;@ 0x314
+ add lr, lr, #1
+_038012D4:
+ cmp lr, ip
+ blt _038012B8
+ ldr r1, _03801318 ;@ =_038099B0
+ ldr r4, [r1, #1164] ;@ 0x48c
+ add r2, r4, #1
+ and r2, r2, #15
+ str r2, [r1, #1164] ;@ 0x48c
+ bl OS_RestoreInterrupts
+ ldr r0, _03801324 ;@ =_03809C5C
+ ldr r2, _0380131C ;@ =_03809CBC
+ mov r1, #24
+ mla r1, r4, r1, r2
+ mov r2, #0
+ bl OS_SendMessage
+_0380130C:
+ ldmia sp!, {r4, r5, r6, lr}
+ add sp, sp, #16
+ bx lr
+_03801318: .word _038099B0
+_0380131C: .word _03809CBC
+_03801320: .word _03809CC0
+_03801324: .word _03809C5C
+
+ arm_func_start SPIi_ReleaseException
+SPIi_ReleaseException: ;@ 0x03801328
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ ldr r1, _03801364 ;@ =_038099B0
+ ldr r2, [r1, #4]
+ cmp r2, r0
+ bne _03801358
+ mov r0, #5
+ str r0, [r1, #4]
+ mov r0, #0
+ str r0, [r1]
+ ldr r0, _03801368 ;@ =_03809E40
+ bl OS_WakeupThread
+_03801358:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_03801364: .word _038099B0
+_03801368: .word _03809E40
+
+ arm_func_start SPIi_GetException
+SPIi_GetException: ;@ 0x0380136C
+ mov r2, #1
+ ldr r1, _03801380 ;@ =_038099B0
+ str r2, [r1]
+ str r0, [r1, #4]
+ bx lr
+_03801380: .word _038099B0
+
+ arm_func_start SPIi_CheckException
+SPIi_CheckException: ;@ 0x03801384
+ ldr r0, _0380139C ;@ =_038099B0
+ ldr r0, [r0]
+ cmp r0, #0
+ moveq r0, #1
+ movne r0, #0
+ bx lr
+_0380139C: .word _038099B0
+
+ arm_func_start SPIi_ReturnResult
+SPIi_ReturnResult: ;@ 0x038013A0
+ stmdb sp!, {r4, r5, r6, lr}
+ and r2, r0, #112 ;@ 0x70
+ cmp r2, #48 ;@ 0x30
+ bgt _038013E0
+ cmp r2, #48 ;@ 0x30
+ bge _03801434
+ cmp r2, #16
+ bgt _038013D4
+ cmp r2, #16
+ bge _0380141C
+ cmp r2, #0
+ beq _0380141C
+ b _03801438
+_038013D4:
+ cmp r2, #32
+ beq _03801434
+ b _03801438
+_038013E0:
+ cmp r2, #80 ;@ 0x50
+ bgt _038013FC
+ cmp r2, #80 ;@ 0x50
+ bge _03801424
+ cmp r2, #64 ;@ 0x40
+ beq _03801424
+ b _03801438
+_038013FC:
+ cmp r2, #96 ;@ 0x60
+ bgt _03801410
+ cmp r2, #96 ;@ 0x60
+ beq _0380142C
+ b _03801438
+_03801410:
+ cmp r2, #112 ;@ 0x70
+ beq _0380142C
+ b _03801438
+_0380141C:
+ mov r4, #6
+ b _03801438
+_03801424:
+ mov r4, #9
+ b _03801438
+_0380142C:
+ mov r4, #8
+ b _03801438
+_03801434:
+ mov r4, #4
+_03801438:
+ and r0, r0, #255 ;@ 0xff
+ orr r0, r0, #128 ;@ 0x80
+ mov r0, r0, lsl #8
+ orr r2, r0, #50331648 ;@ 0x3000000
+ and r0, r1, #255 ;@ 0xff
+ orr r6, r2, r0
+ mov r5, #0
+_03801454:
+ mov r0, r4
+ mov r1, r6
+ mov r2, r5
+ bl PXI_SendWordByFifo
+ cmp r0, #0
+ blt _03801454
+ ldmia sp!, {r4, r5, r6, lr}
+ bx lr
+
+ arm_func_start SPI_Unlock
+SPI_Unlock: ;@ 0x03801474
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ ldr r1, _038014D8 ;@ =_038099B0
+ ldr r2, [r1]
+ cmp r2, #0
+ beq _038014CC
+ ldr r2, [r1, #4]
+ cmp r2, #4
+ bne _038014CC
+ ldr r1, [r1, #1176] ;@ 0x498
+ cmp r1, r0
+ bne _038014CC
+ bl OS_DisableInterrupts
+ mov r2, #5
+ ldr r1, _038014D8 ;@ =_038099B0
+ str r2, [r1, #4]
+ mov r2, #0
+ str r2, [r1]
+ str r2, [r1, #1176] ;@ 0x498
+ bl OS_RestoreInterrupts
+ ldr r0, _038014DC ;@ =_03809E40
+ bl OS_WakeupThread
+_038014CC:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_038014D8: .word _038099B0
+_038014DC: .word _03809E40
+
+ arm_func_start SPI_Lock
+SPI_Lock: ;@ 0x038014E0
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ sub sp, sp, #4
+ mov r7, r0
+ ldr r5, _0380153C ;@ =_03809E40
+ ldr r4, _03801540 ;@ =_038099B0
+_038014F4:
+ bl OS_DisableInterrupts
+ mov r6, r0
+ ldr r1, [r4]
+ cmp r1, #0
+ beq _03801518
+ bl OS_RestoreInterrupts
+ mov r0, r5
+ bl OS_SleepThread
+ b _038014F4
+_03801518:
+ mov r0, #4
+ bl SPIi_GetException
+ ldr r0, _03801540 ;@ =_038099B0
+ str r7, [r0, #1176] ;@ 0x498
+ mov r0, r6
+ bl OS_RestoreInterrupts
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+_0380153C: .word _03809E40
+_03801540: .word _038099B0
+
+ arm_func_start SPI_Init
+SPI_Init: ;@ 0x03801544
+ stmdb sp!, {r4, r5, r6, r7, r8, lr}
+ sub sp, sp, #8
+ mov r4, r0
+ ldr r0, _03801640 ;@ =_038099AC
+ ldrh r1, [r0]
+ cmp r1, #0
+ bne _03801634
+ mov r1, #1
+ strh r1, [r0]
+ mov r1, #0
+ ldr r0, _03801644 ;@ =_038099B0
+ str r1, [r0]
+ mov r1, #5
+ str r1, [r0, #4]
+ bl TP_Init
+ bl NVRAM_Init
+ bl MIC_Init
+ bl PM_Init
+ bl PXI_Init
+ mov r0, #6
+ ldr r1, _03801648 ;@ =FUN_03801150
+ bl PXI_SetFifoRecvCallback
+ mov r0, #9
+ ldr r1, _03801648 ;@ =FUN_03801150
+ bl PXI_SetFifoRecvCallback
+ mov r0, #8
+ ldr r1, _03801648 ;@ =FUN_03801150
+ bl PXI_SetFifoRecvCallback
+ mov r0, #4
+ ldr r1, _03801648 ;@ =FUN_03801150
+ bl PXI_SetFifoRecvCallback
+ ldr r0, _0380164C ;@ =_03809C5C
+ ldr r1, _03801650 ;@ =_03809C7C
+ mov r2, #16
+ bl OS_InitMessageQueue
+ mov r8, #0
+ ldr r7, _03801654 ;@ =_03809CBC
+ mov r6, r8
+ mov r5, #24
+_038015E0:
+ mla r0, r8, r5, r7
+ mov r1, r6
+ mov r2, r5
+ bl MI_CpuFill8
+ add r8, r8, #1
+ cmp r8, #16
+ blt _038015E0
+ mov r2, #0
+ ldr r0, _03801644 ;@ =_038099B0
+ str r2, [r0, #1164] ;@ 0x48c
+ str r2, [r0, #1172] ;@ 0x494
+ str r2, [r0, #1168] ;@ 0x490
+ mov r0, #512 ;@ 0x200
+ str r0, [sp]
+ str r4, [sp, #4]
+ ldr r0, _03801658 ;@ =_038099B8
+ ldr r1, _0380165C ;@ =FUN_038011C0
+ ldr r3, _0380164C ;@ =_03809C5C
+ bl OS_CreateThread
+ ldr r0, _03801658 ;@ =_038099B8
+ bl OS_WakeupThreadDirect
+_03801634:
+ add sp, sp, #8
+ ldmia sp!, {r4, r5, r6, r7, r8, lr}
+ bx lr
+_03801640: .word _038099AC
+_03801644: .word _038099B0
+_03801648: .word FUN_03801150
+_0380164C: .word _03809C5C
+_03801650: .word _03809C7C
+_03801654: .word _03809CBC
+_03801658: .word _038099B8
+_0380165C: .word FUN_038011C0
+
+ arm_func_start FUN_03801660
+FUN_03801660: ;@ 0x03801660
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ cmp r0, #0
+ bne _03801680
+ mov r0, #3
+ mov r1, #2
+ bl SPIi_ReturnResult
+ b _03801698
+_03801680:
+ ldr r1, _038016A4 ;@ =_03809E54
+ str r0, [r1, #36] ;@ 0x24
+ str r0, [r1, #40] ;@ 0x28
+ mov r0, #3
+ mov r1, #0
+ bl SPIi_ReturnResult
+_03801698:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_038016A4: .word _03809E54
+
+ arm_func_start FUN_038016A8
+FUN_038016A8: ;@ 0x038016A8
+ stmdb sp!, {r4, lr}
+ sub sp, sp, #8
+ mov r4, r0
+ mov r0, #0
+ mov r1, #16
+ mov r2, #1
+ mov r3, r4
+ bl SPIi_SetEntry
+ cmp r0, #0
+ bne _0380170C
+ ldr r0, [sp]
+ bic r0, r0, #100663296 ;@ 0x6000000
+ orr r0, r0, #100663296 ;@ 0x6000000
+ str r0, [sp]
+ ldrh r1, [sp]
+ ldr r0, _03801718 ;@ =0x027FFFAA
+ strh r1, [r0]
+ ldrh r1, [sp, #2]
+ ldr r0, _0380171C ;@ =0x027FFFAC
+ strh r1, [r0]
+ mov r0, #16
+ and r1, r4, #255 ;@ 0xff
+ mov r1, r1, lsl #16
+ mov r1, r1, lsr #16
+ bl SPIi_ReturnResult
+_0380170C:
+ add sp, sp, #8
+ ldmia sp!, {r4, lr}
+ bx lr
+_03801718: .word 0x027FFFAA
+_0380171C: .word 0x027FFFAC
diff --git a/arm7/asm/SPI_mic.s b/arm7/asm/SPI_mic.s
new file mode 100644
index 00000000..0178468f
--- /dev/null
+++ b/arm7/asm/SPI_mic.s
@@ -0,0 +1,852 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .section .bss
+
+ .global _03809F6C
+_03809F6C: ;0x03809F6C
+ .space 0x03809FA8 - 0x03809F6C
+
+ .global _03809FA8
+_03809FA8: ;0x03809FA8
+ .space 0x03809FB8 - 0x03809FA8
+
+ .section .text
+
+ arm_func_start FUN_03802D14
+FUN_03802D14: ;@ 0x03802D14
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ ldr r4, _03802E6C ;@ =_03809F6C
+ ldrh r5, [r4, #38] ;@ 0x26
+ and r0, r5, #4
+ cmp r0, #4
+ ldrh r6, [r4, #56] ;@ 0x38
+ ldrneh r7, [r4, #58] ;@ 0x3a
+ ldreq r7, _03802E70 ;@ =0x0000FFFF
+ bl SPIi_CheckEntry
+ cmp r0, #0
+ bne _03802D80
+ mov r0, #2
+ bl SPIi_CheckException
+ cmp r0, #0
+ beq _03802D80
+ and r0, r5, #1
+ cmp r0, #1
+ bne _03802D70
+ bl MIC_ExecSampling12
+ tst r5, #2
+ moveq r7, r0
+ eorne r7, r0, #32768 ;@ 0x8000
+ b _03802D80
+_03802D70:
+ bl MIC_ExecSampling8
+ tst r5, #2
+ moveq r7, r0
+ eorne r7, r0, #128 ;@ 0x80
+_03802D80:
+ and r0, r5, #1
+ ldr r3, _03802E74 ;@ =0x027FFC00
+ ldr r1, [r4, #44] ;@ 0x2c
+ cmp r0, #1
+ bne _03802DB0
+ ldr r2, [r4, #40] ;@ 0x28
+ strh r7, [r2, r1]!
+ str r2, [r3, #912] ;@ 0x390
+ add r3, r3, #916 ;@ 0x394
+ strh r7, [r3]
+ add r1, r1, #2
+ b _03802DE8
+_03802DB0:
+ and r7, r7, #255 ;@ 0xff
+ tst r1, #1
+ bne _03802DC8
+ mov r6, r7
+ add r1, r1, #1
+ b _03802DE8
+_03802DC8:
+ orr r0, r6, r7, lsl #8
+ ldr r2, [r4, #40] ;@ 0x28
+ sub r1, r1, #1
+ strh r0, [r2, r1]!
+ str r2, [r3, #912] ;@ 0x390
+ add r3, r3, #916 ;@ 0x394
+ strh r0, [r3]
+ add r1, r1, #2
+_03802DE8:
+ strh r6, [r4, #56] ;@ 0x38
+ strh r7, [r4, #58] ;@ 0x3a
+ ldr r0, [r4, #48] ;@ 0x30
+ cmp r1, r0
+ movcs r1, #0
+ str r1, [r4, #44] ;@ 0x2c
+ bcc _03802E64
+ ldrh r0, [r4, #36] ;@ 0x24
+ and r0, r0, #16
+ cmp r0, #16
+ bne _03802E24
+ mov r0, #81 ;@ 0x51
+ mov r1, #0
+ bl SPIi_ReturnResult
+ b _03802E64
+_03802E24:
+ mov r0, #2
+ mov r1, #66 ;@ 0x42
+ mov r2, #0
+ bl SPIi_SetEntry
+ cmp r0, #0
+ bne _03802E4C
+ mov r0, #81 ;@ 0x51
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _03802E64
+_03802E4C:
+ mov r0, #4
+ str r0, [r4, #32]
+ ldr r1, _03802E78 ;@ =0x0400010E
+ ldrh r0, [r1]
+ bic r0, r0, #128 ;@ 0x80
+ strh r0, [r1]
+_03802E64:
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+_03802E6C: .word _03809F6C
+_03802E70: .word 0x0000FFFF
+_03802E74: .word 0x027FFC00
+_03802E78: .word 0x0400010E
+
+ arm_func_start FUN_03802E7C
+FUN_03802E7C: ;@ 0x03802E7C
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ bl FUN_03802D14
+ ldr r1, _03802EB0 ;@ =0x0380FFF8
+ ldr r0, [r1]
+ orr r0, r0, #64 ;@ 0x40
+ str r0, [r1]
+ mov r1, #64 ;@ 0x40
+ ldr r0, _03802EB4 ;@ =0x04000214
+ str r1, [r0]
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_03802EB0: .word 0x0380FFF8
+_03802EB4: .word 0x04000214
+
+ arm_func_start MIC_ExecuteProcess
+MIC_ExecuteProcess: ;@ 0x03802EB8
+ stmdb sp!, {r4, r5, lr}
+ sub sp, sp, #4
+ mov r5, r0
+ ldr r2, [r5, #4]
+ cmp r2, #64 ;@ 0x40
+ beq _03802EE4
+ cmp r2, #65 ;@ 0x41
+ beq _03802FB0
+ cmp r2, #66 ;@ 0x42
+ beq _0380304C
+ b _038030F0
+_03802EE4:
+ bl OS_DisableInterrupts
+ mov r4, r0
+ mov r0, #2
+ bl SPIi_CheckException
+ cmp r0, #0
+ bne _03802F1C
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ ldr r0, [r5, #4]
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _038030F0
+_03802F1C:
+ mov r0, #2
+ bl SPIi_GetException
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ ldr r0, [r5, #8]
+ and r0, r0, #1
+ cmp r0, #1
+ bne _03802F68
+ bl MIC_ExecSampling12
+ ldr r1, [r5, #8]
+ ands r1, r1, #2
+ eorne r0, r0, #32768 ;@ 0x8000
+ movne r0, r0, lsl #16
+ movne r0, r0, lsr #16
+ ldr r1, _038030FC ;@ =0x027FFF94
+ strh r0, [r1]
+ ldr r0, _03803100 ;@ =0x027FFF90
+ str r1, [r0]
+ b _03802F90
+_03802F68:
+ bl MIC_ExecSampling8
+ ldr r1, [r5, #8]
+ ands r1, r1, #2
+ eorne r0, r0, #128 ;@ 0x80
+ movne r0, r0, lsl #16
+ movne r0, r0, lsr #16
+ ldr r1, _038030FC ;@ =0x027FFF94
+ strh r0, [r1]
+ ldr r0, _03803100 ;@ =0x027FFF90
+ str r1, [r0]
+_03802F90:
+ ldr r0, [r5, #4]
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ mov r1, #0
+ bl SPIi_ReturnResult
+ mov r0, #2
+ bl SPIi_ReleaseException
+ b _038030F0
+_03802FB0:
+ ldr r0, _03803104 ;@ =_03809F6C
+ ldr r1, [r0, #32]
+ cmp r1, #1
+ bne _03803038
+ mov r1, #0
+ strh r1, [r0, #58] ;@ 0x3a
+ strh r1, [r0, #56] ;@ 0x38
+ bl OS_DisableInterrupts
+ mov r4, r0
+ mov r0, #64 ;@ 0x40
+ bl OS_EnableIrqMask
+ mov r0, #64 ;@ 0x40
+ ldr r1, _03803108 ;@ =FUN_03802E7C
+ bl MIC_SetIrqFunction
+ bl MIC_EnableMultipleInterrupt
+ ldr r0, _03803104 ;@ =_03809F6C
+ ldrh r2, [r0, #52] ;@ 0x34
+ ldr r1, _0380310C ;@ =0x0400010C
+ strh r2, [r1]
+ ldrh r0, [r0, #54] ;@ 0x36
+ orr r1, r0, #192 ;@ 0xc0
+ ldr r0, _03803110 ;@ =0x0400010E
+ strh r1, [r0]
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ ldr r0, [r5, #4]
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ mov r1, #0
+ bl SPIi_ReturnResult
+ mov r1, #2
+ ldr r0, _03803104 ;@ =_03809F6C
+ str r1, [r0, #32]
+ b _038030F0
+_03803038:
+ mov r0, r2, lsl #16
+ mov r0, r0, lsr #16
+ mov r1, #3
+ bl SPIi_ReturnResult
+ b _038030F0
+_0380304C:
+ ldr r0, _03803104 ;@ =_03809F6C
+ ldr r1, [r0, #32]
+ sub r0, r1, #3
+ cmp r0, #1
+ bhi _038030CC
+ ldr r1, _03803110 ;@ =0x0400010E
+ ldrh r0, [r1]
+ bic r0, r0, #128 ;@ 0x80
+ strh r0, [r1]
+ bl OS_DisableInterrupts
+ mov r4, r0
+ mov r0, #64 ;@ 0x40
+ mov r1, #0
+ bl MIC_SetIrqFunction
+ bl MIC_DisableMultipleInterrupt
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ ldr r0, _03803104 ;@ =_03809F6C
+ ldr r0, [r0, #32]
+ cmp r0, #3
+ bne _038030B0
+ mov r0, #66 ;@ 0x42
+ mov r1, #0
+ bl SPIi_ReturnResult
+ b _038030BC
+_038030B0:
+ mov r0, #81 ;@ 0x51
+ mov r1, #0
+ bl SPIi_ReturnResult
+_038030BC:
+ mov r1, #0
+ ldr r0, _03803104 ;@ =_03809F6C
+ str r1, [r0, #32]
+ b _038030F0
+_038030CC:
+ cmp r1, #3
+ bne _038030E4
+ mov r0, #66 ;@ 0x42
+ mov r1, #3
+ bl SPIi_ReturnResult
+ b _038030F0
+_038030E4:
+ mov r0, #81 ;@ 0x51
+ mov r1, #3
+ bl SPIi_ReturnResult
+_038030F0:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, lr}
+ bx lr
+_038030FC: .word 0x027FFF94
+_03803100: .word 0x027FFF90
+_03803104: .word _03809F6C
+_03803108: .word FUN_03802E7C
+_0380310C: .word 0x0400010C
+_03803110: .word 0x0400010E
+
+ arm_func_start FUN_03803114
+FUN_03803114: ;@ 0x03803114
+ cmp r0, #65536 ;@ 0x10000
+ bcs _03803138
+ mov r2, #0
+ ldr r1, _038031B4 ;@ =_03809F6C
+ strh r2, [r1, #54] ;@ 0x36
+ rsb r0, r0, #65536 ;@ 0x10000
+ strh r0, [r1, #52] ;@ 0x34
+ mov r0, #1
+ bx lr
+_03803138:
+ cmp r0, #4194304 ;@ 0x400000
+ bcs _03803160
+ mov r2, #1
+ ldr r1, _038031B4 ;@ =_03809F6C
+ strh r2, [r1, #54] ;@ 0x36
+ mov r0, r0, lsr #6
+ rsb r0, r0, #65536 ;@ 0x10000
+ strh r0, [r1, #52] ;@ 0x34
+ mov r0, r2
+ bx lr
+_03803160:
+ cmp r0, #16777216 ;@ 0x1000000
+ bcs _03803188
+ mov r2, #2
+ ldr r1, _038031B4 ;@ =_03809F6C
+ strh r2, [r1, #54] ;@ 0x36
+ mov r0, r0, lsr #8
+ rsb r0, r0, #65536 ;@ 0x10000
+ strh r0, [r1, #52] ;@ 0x34
+ mov r0, #1
+ bx lr
+_03803188:
+ cmp r0, #67108864 ;@ 0x4000000
+ movcs r0, #0
+ bxcs lr
+ mov r2, #3
+ ldr r1, _038031B4 ;@ =_03809F6C
+ strh r2, [r1, #54] ;@ 0x36
+ mov r0, r0, lsr #10
+ rsb r0, r0, #65536 ;@ 0x10000
+ strh r0, [r1, #52] ;@ 0x34
+ mov r0, #1
+ bx lr
+_038031B4: .word _03809F6C
+
+ arm_func_start MIC_AnalyzeCommand
+MIC_AnalyzeCommand: ;@ 0x038031B8
+ stmdb sp!, {r4, lr}
+ ands r1, r0, #33554432 ;@ 0x2000000
+ beq _038031E4
+ mov r4, #0
+ mov r3, r4
+ ldr r1, _03803478 ;@ =_03809F6C
+_038031D0:
+ mov r2, r4, lsl #1
+ strh r3, [r1, r2]
+ add r4, r4, #1
+ cmp r4, #16
+ blt _038031D0
+_038031E4:
+ and r1, r0, #983040 ;@ 0xf0000
+ mov r1, r1, lsr #16
+ mov r2, r1, lsl #1
+ ldr r1, _03803478 ;@ =_03809F6C
+ strh r0, [r1, r2]
+ ands r0, r0, #16777216 ;@ 0x1000000
+ beq _03803470
+ ldrh r3, [r1]
+ and r0, r3, #65280 ;@ 0xff00
+ mov r0, r0, lsl #8
+ mov r4, r0, lsr #16
+ sub r0, r4, #64 ;@ 0x40
+ cmp r0, #3
+ addls pc, pc, r0, lsl #2
+ b _03803464
+ b _03803230
+ b _03803270
+ b _03803378
+ b _038033DC
+_03803230:
+ mov r0, #2
+ mov r1, r4
+ mov r2, #1
+ and r3, r3, #255 ;@ 0xff
+ bl SPIi_SetEntry
+ cmp r0, #0
+ bne _03803258
+ mov r0, r4
+ mov r1, #4
+ bl SPIi_ReturnResult
+_03803258:
+ mov r1, #0
+ ldr r0, _0380347C ;@ =0x027FFF94
+ strh r1, [r0]
+ ldr r0, _03803480 ;@ =0x027FFF90
+ str r1, [r0]
+ b _03803470
+_03803270:
+ ldr r0, [r1, #32]
+ cmp r0, #0
+ beq _0380328C
+ mov r0, r4
+ mov r1, #3
+ bl SPIi_ReturnResult
+ b _03803470
+_0380328C:
+ and r0, r3, #255 ;@ 0xff
+ strh r0, [r1, #36] ;@ 0x24
+ ldrh r2, [r1, #2]
+ ldrh r0, [r1, #4]
+ orr r3, r0, r2, lsl #16
+ cmp r3, #33554432 ;@ 0x2000000
+ bcc _038032B0
+ cmp r3, #37748736 ;@ 0x2400000
+ bcc _038032C0
+_038032B0:
+ mov r0, r4
+ mov r1, #2
+ bl SPIi_ReturnResult
+ b _03803470
+_038032C0:
+ str r3, [r1, #40] ;@ 0x28
+ ldrh r2, [r1, #6]
+ ldrh r0, [r1, #8]
+ orr r2, r0, r2, lsl #16
+ add r0, r3, r2
+ cmp r0, #37748736 ;@ 0x2400000
+ bls _038032EC
+ mov r0, r4
+ mov r1, #2
+ bl SPIi_ReturnResult
+ b _03803470
+_038032EC:
+ str r2, [r1, #48] ;@ 0x30
+ ldrh r2, [r1, #10]
+ ldrh r0, [r1, #12]
+ orr r0, r0, r2, lsl #16
+ bl FUN_03803114
+ cmp r0, #0
+ bne _03803318
+ mov r0, r4
+ mov r1, #2
+ bl SPIi_ReturnResult
+ b _03803470
+_03803318:
+ mov r2, #0
+ ldr r0, _03803478 ;@ =_03809F6C
+ str r2, [r0, #44] ;@ 0x2c
+ ldrh r1, [r0, #36] ;@ 0x24
+ and r1, r1, #7
+ strh r1, [r0, #38] ;@ 0x26
+ mov r0, #2
+ mov r1, r4
+ bl SPIi_SetEntry
+ cmp r0, #0
+ bne _03803354
+ mov r0, r4
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _03803470
+_03803354:
+ mov r1, #0
+ ldr r0, _0380347C ;@ =0x027FFF94
+ strh r1, [r0]
+ ldr r0, _03803480 ;@ =0x027FFF90
+ str r1, [r0]
+ mov r1, #1
+ ldr r0, _03803478 ;@ =_03809F6C
+ str r1, [r0, #32]
+ b _03803470
+_03803378:
+ ldr r0, [r1, #32]
+ cmp r0, #2
+ beq _03803394
+ mov r0, r4
+ mov r1, #3
+ bl SPIi_ReturnResult
+ b _03803470
+_03803394:
+ mov r0, #2
+ mov r1, r4
+ mov r2, #0
+ bl SPIi_SetEntry
+ cmp r0, #0
+ bne _038033BC
+ mov r0, r4
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _03803470
+_038033BC:
+ mov r1, #3
+ ldr r0, _03803478 ;@ =_03809F6C
+ str r1, [r0, #32]
+ ldr r1, _03803484 ;@ =0x0400010E
+ ldrh r0, [r1]
+ bic r0, r0, #128 ;@ 0x80
+ strh r0, [r1]
+ b _03803470
+_038033DC:
+ ldr r0, [r1, #32]
+ cmp r0, #2
+ beq _038033F8
+ mov r0, r4
+ mov r1, #3
+ bl SPIi_ReturnResult
+ b _03803470
+_038033F8:
+ ldrh r2, [r1, #2]
+ ldrh r0, [r1, #4]
+ orr r0, r0, r2, lsl #16
+ bl FUN_03803114
+ cmp r0, #0
+ bne _03803420
+ mov r0, r4
+ mov r1, #2
+ bl SPIi_ReturnResult
+ b _03803470
+_03803420:
+ bl OS_DisableInterrupts
+ ldr ip, _03803484 ;@ =0x0400010E
+ ldrh r1, [ip]
+ bic r1, r1, #128 ;@ 0x80
+ strh r1, [ip]
+ ldr r1, _03803478 ;@ =_03809F6C
+ ldrh r3, [r1, #52] ;@ 0x34
+ ldr r2, _03803488 ;@ =0x0400010C
+ strh r3, [r2]
+ ldrh r1, [r1, #54] ;@ 0x36
+ orr r1, r1, #192 ;@ 0xc0
+ strh r1, [ip]
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ mov r1, #0
+ bl SPIi_ReturnResult
+ b _03803470
+_03803464:
+ mov r0, r4
+ mov r1, #1
+ bl SPIi_ReturnResult
+_03803470:
+ ldmia sp!, {r4, lr}
+ bx lr
+_03803478: .word _03809F6C
+_0380347C: .word 0x027FFF94
+_03803480: .word 0x027FFF90
+_03803484: .word 0x0400010E
+_03803488: .word 0x0400010C
+
+ arm_func_start MIC_Init
+MIC_Init: ;@ 0x0380348C
+ mov r3, #0
+ ldr r0, _038034C4 ;@ =_03809F6C
+ str r3, [r0, #32]
+ mov r2, r3
+_0380349C:
+ mov r1, r3, lsl #1
+ strh r2, [r0, r1]
+ add r3, r3, #1
+ cmp r3, #16
+ blt _0380349C
+ ldr r1, _038034C8 ;@ =0x0400010E
+ ldrh r0, [r1]
+ bic r0, r0, #128 ;@ 0x80
+ strh r0, [r1]
+ bx lr
+_038034C4: .word _03809F6C
+_038034C8: .word 0x0400010E
+
+ arm_func_start MIC_ExecSampling12
+MIC_ExecSampling12: ;@ 0x038034CC
+ ldr r1, _03803580 ;@ =0x040001C0
+_038034D0:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _038034D0
+ ldr r0, _03803584 ;@ =0x00008A01
+ strh r0, [r1]
+ mov r1, #228 ;@ 0xe4
+ ldr r0, _03803588 ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _03803580 ;@ =0x040001C0
+_038034F4:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _038034F4
+ mov r1, #0
+ ldr r0, _03803588 ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r2, _03803580 ;@ =0x040001C0
+_03803510:
+ ldrh r0, [r2]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03803510
+ ldr r1, _03803588 ;@ =0x040001C2
+ ldrh r0, [r1]
+ and r0, r0, #255 ;@ 0xff
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ mov r0, r0, lsl #24
+ mov r3, r0, lsr #16
+ ldr r0, _0380358C ;@ =0x00008201
+ strh r0, [r2]
+ mov r0, #0
+ strh r0, [r1]
+ ldr r1, _03803580 ;@ =0x040001C0
+_0380354C:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _0380354C
+ ldr r0, _03803588 ;@ =0x040001C2
+ ldrh r0, [r0]
+ and r0, r0, #255 ;@ 0xff
+ mov r0, r0, lsl #16
+ orr r1, r3, r0, lsr #16
+ ldr r0, _03803590 ;@ =0x00007FF8
+ and r0, r1, r0
+ mov r0, r0, lsl #17
+ mov r0, r0, lsr #16
+ bx lr
+_03803580: .word 0x040001C0
+_03803584: .word 0x00008A01
+_03803588: .word 0x040001C2
+_0380358C: .word 0x00008201
+_03803590: .word 0x00007FF8
+
+ arm_func_start MIC_ExecSampling8
+MIC_ExecSampling8: ;@ 0x03803594
+ ldr r1, _03803648 ;@ =0x040001C0
+_03803598:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03803598
+ ldr r0, _0380364C ;@ =0x00008A01
+ strh r0, [r1]
+ mov r1, #236 ;@ 0xec
+ ldr r0, _03803650 ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _03803648 ;@ =0x040001C0
+_038035BC:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _038035BC
+ mov r1, #0
+ ldr r0, _03803650 ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r2, _03803648 ;@ =0x040001C0
+_038035D8:
+ ldrh r0, [r2]
+ ands r0, r0, #128 ;@ 0x80
+ bne _038035D8
+ ldr r1, _03803650 ;@ =0x040001C2
+ ldrh r0, [r1]
+ and r0, r0, #255 ;@ 0xff
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ mov r0, r0, lsl #24
+ mov r3, r0, lsr #16
+ ldr r0, _03803654 ;@ =0x00008201
+ strh r0, [r2]
+ mov r0, #0
+ strh r0, [r1]
+ ldr r1, _03803648 ;@ =0x040001C0
+_03803614:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03803614
+ ldr r0, _03803650 ;@ =0x040001C2
+ ldrh r0, [r0]
+ and r0, r0, #255 ;@ 0xff
+ mov r0, r0, lsl #16
+ orr r1, r3, r0, lsr #16
+ ldr r0, _03803658 ;@ =0x00007F80
+ and r0, r1, r0
+ mov r0, r0, lsl #9
+ mov r0, r0, lsr #16
+ bx lr
+_03803648: .word 0x040001C0
+_0380364C: .word 0x00008A01
+_03803650: .word 0x040001C2
+_03803654: .word 0x00008201
+_03803658: .word 0x00007F80
+_0380365C:
+ mov ip, #67108864 ;@ 0x4000000
+ add r1, ip, #520 ;@ 0x208
+ ldrh r0, [r1]
+ tst r0, r0
+ bxeq lr
+ ldr r3, [ip, #528] ;@ 0x210
+ ldr r1, [ip, #532] ;@ 0x214
+ ands r2, r1, r3
+ bxeq lr
+ ldr r0, _038037C8 ;@ =0x01DF3FFF
+ tst r2, r0
+ streq r2, [ip, #532] ;@ 0x214
+ bxeq lr
+ stmfd sp!, {lr}
+ mrs r0, SPSR
+ stmfd sp!, {r0}
+ stmdb sp, {sp, lr}^
+ sub sp, sp, #8
+ mov r0, #159 ;@ 0x9f
+ msr CPSR_c, r0
+ ldr r1, _038037CC ;@ =OSi_ThreadInfo
+ ldrh r0, [r1, #2]
+ add r0, r0, #1
+ strh r0, [r1, #2]
+ ldr r1, _038037D0 ;@ =_03809FA8
+ cmp r0, #1
+ moveq r0, sp
+ ldreq sp, [r1, #4]
+ streq r0, [r1, #4]
+ stmfd sp!, {r3}
+ ldr r1, _038037D4 ;@ =_038072C8
+ ldr r0, [r1]
+ tst r0, r2
+ strne r0, [ip, #532] ;@ 0x214
+ ldrne r0, [r1, #4]
+ ldrne r3, _038037D8 ;@ =OS_IRQTable
+ ldrne r0, [r3, r0, lsl #2]
+ bne _03803738
+ mov r3, #1
+_038036F8:
+ ldr r0, [r1, r3, lsl #3]
+ tst r0, r2
+ addeq r3, r3, #1
+ beq _038036F8
+ str r0, [ip, #532] ;@ 0x214
+ add r0, r1, r3, lsl #3
+ ldr r2, [r0, #4]
+ ldr r3, _038037D8 ;@ =OS_IRQTable
+ ldr r0, [r3, r2, lsl #2]
+ ldr r2, _038037CC ;@ =OSi_ThreadInfo
+ ldrh r3, [r2, #2]
+ cmp r3, #1
+ ldreq r2, [r1]
+ streq r2, [ip, #528] ;@ 0x210
+ moveq r2, #31
+ msreq CPSR_c, r2
+_03803738:
+ ldr r1, [ip, #528] ;@ 0x210
+ stmfd sp!, {r1}
+ adr lr, _03803748
+ bx r0
+_03803748:
+ mov r0, #159 ;@ 0x9f
+ msr CPSR_c, r0
+ mov ip, #67108864 ;@ 0x4000000
+ ldmia sp!, {r0}
+ ldr r1, [ip, #528] ;@ 0x210
+ eor r2, r0, r1
+ and r1, r2, r1
+ and r0, r2, r0
+ ldmia sp!, {r3}
+ orr r3, r3, r1
+ bic r3, r3, r0
+ str r3, [ip, #528] ;@ 0x210
+ ldr r2, _038037CC ;@ =OSi_ThreadInfo
+ ldr r3, _038037D0 ;@ =_03809FA8
+ ldrh r0, [r2, #2]
+ subs r1, r0, #1
+ strh r1, [r2, #2]
+ moveq r0, sp
+ ldreq sp, [r3, #4]
+ streq r0, [r3, #4]
+ mov r0, #146 ;@ 0x92
+ msr CPSR_c, r0
+ ldmia sp, {sp, lr}^
+ nop ;@ (mov r0, r0)
+ add sp, sp, #8
+ ldmia sp!, {r0}
+ msr SPSR_fc, r0
+ tst r1, r1
+ ldreq r0, _038037DC ;@ =OS_IrqHandler_ThreadSwitch
+ addeq lr, pc, #0
+ bxeq r0
+ ldmia sp!, {pc}
+_038037C8: .word 0x01DF3FFF
+_038037CC: .word OSi_ThreadInfo
+_038037D0: .word _03809FA8
+_038037D4: .word _038072C8
+_038037D8: .word OS_IRQTable
+_038037DC: .word OS_IrqHandler_ThreadSwitch
+
+ arm_func_start MIC_DisableMultipleInterrupt
+MIC_DisableMultipleInterrupt: ;@ 0x038037E0
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ ldr r0, _03803820 ;@ =0x0380FFFC
+ ldr r1, [r0]
+ ldr r0, _03803824 ;@ =_0380365C
+ cmp r1, r0
+ bne _03803814
+ bl OS_DisableInterrupts
+ ldr r1, _03803828 ;@ =_03809FA8
+ ldr r2, [r1, #12]
+ ldr r1, _03803820 ;@ =0x0380FFFC
+ str r2, [r1]
+ bl OS_RestoreInterrupts
+_03803814:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_03803820: .word 0x0380FFFC
+_03803824: .word _0380365C
+_03803828: .word _03809FA8
+
+ arm_func_start MIC_EnableMultipleInterrupt
+MIC_EnableMultipleInterrupt: ;@ 0x0380382C
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ ldr r0, _03803888 ;@ =0x0380FFFC
+ ldr r2, [r0]
+ ldr r0, _0380388C ;@ =_0380365C
+ cmp r2, r0
+ beq _0380387C
+ mov r1, #0
+ ldr r0, _03803890 ;@ =_03809FA8
+ str r1, [r0]
+ ldr r1, _03803894 ;@ =0x0380FE80
+ str r1, [r0, #4]
+ mov r1, #64 ;@ 0x40
+ str r1, [r0, #8]
+ str r2, [r0, #12]
+ bl OS_DisableInterrupts
+ ldr r2, _0380388C ;@ =_0380365C
+ ldr r1, _03803888 ;@ =0x0380FFFC
+ str r2, [r1]
+ bl OS_RestoreInterrupts
+_0380387C:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_03803888: .word 0x0380FFFC
+_0380388C: .word _0380365C
+_03803890: .word _03809FA8
+_03803894: .word 0x0380FE80
+
+ arm_func_start MIC_SetIrqFunction
+MIC_SetIrqFunction: ;@ 0x03803898
+ mov ip, #0
+ ldr r2, _038038BC ;@ =OS_IRQTable
+_038038A0:
+ ands r3, r0, #1
+ strne r1, [r2, ip, lsl #2]
+ mov r0, r0, lsr #1
+ add ip, ip, #1
+ cmp ip, #25
+ blt _038038A0
+ bx lr
+_038038BC: .word OS_IRQTable
diff --git a/arm7/asm/SPI_pm.s b/arm7/asm/SPI_pm.s
new file mode 100644
index 00000000..1960a3cd
--- /dev/null
+++ b/arm7/asm/SPI_pm.s
@@ -0,0 +1,847 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .section .data
+
+ .global PMi_LEDStatus
+PMi_LEDStatus:
+ .word 0x00000001
+
+ .global PMi_BlinkPatternData
+PMi_BlinkPatternData:
+ .word 0x00000000
+ .word 0xAA000000
+ .word 0x00010008
+ .word 0x00000000
+ .word 0xCC000000
+ .word 0x00010008
+ .word 0x00000000
+ .word 0xE3800000
+ .word 0x0001000C
+ .word 0x00000000
+ .word 0xF0F00000
+ .word 0x00010010
+ .word 0x00000000
+ .word 0xF83E0000
+ .word 0x00010014
+ .word 0x00000000
+ .word 0xFC000000
+ .word 0x0001000C
+ .word 0x00000000
+ .word 0xFF000000
+ .word 0x00010010
+ .word 0x00000000
+ .word 0xFFC00000
+ .word 0x00010014
+ .word 0x00000000
+ .word 0xFF000000
+ .word 0x00010020
+ .word 0x00000000
+ .word 0xFF00FF00
+ .word 0x00010020
+ .word 0x00000000
+ .word 0xFFFFFF00
+ .word 0x00010020
+ .word 0x00000000
+ .word 0xC3000000
+ .word 0x00020028
+
+ .section .bss
+
+ .global PMi_KeyPattern
+PMi_KeyPattern: ;0x03809F2C
+ .space 0x03809F30 - 0x03809F2C
+
+ .global PMi_TriggerBL
+PMi_TriggerBL: ;0x03809F30
+ .space 0x03809F34 - 0x03809F30
+
+ .global PMi_Initialized
+PMi_Initialized: ;0x03809F34
+ .space 0x03809F38 - 0x03809F34
+
+ .global PMi_Work
+PMi_Work: ;0x03809F38
+ .space 0x03809F64 - 0x03809F38
+
+ .global _03809F64
+_03809F64: ;0x03809F64
+ .space 0x03809F68 - 0x03809F64
+
+ .global PMi_BlinkPatternNo
+PMi_BlinkPatternNo: ;0x03809F68
+ .space 0x03809F6C - 0x03809F68
+
+ .section .text
+
+ arm_func_start PM_ExecuteProcess
+PM_ExecuteProcess: ;@ 0x038022BC
+ stmdb sp!, {r4, r5, lr}
+ sub sp, sp, #4
+ mov r4, r0
+ bl OS_DisableInterrupts
+ mov r5, r0
+ mov r0, #3
+ bl SPIi_CheckException
+ cmp r0, #0
+ bne _03802300
+ mov r0, r5
+ bl OS_RestoreInterrupts
+ ldr r0, [r4, #4]
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _0380242C
+_03802300:
+ mov r0, #3
+ bl SPIi_GetException
+ mov r0, r5
+ bl OS_RestoreInterrupts
+ ldr r1, [r4, #4]
+ sub r0, r1, #97 ;@ 0x61
+ cmp r0, #5
+ addls pc, pc, r0, lsl #2
+ b _03802414
+ b _0380233C
+ b _03802414
+ b _038023E0
+ b _03802368
+ b _038023A4
+ b _03802408
+_0380233C:
+ mov r1, #1
+ ldr r0, _03802438 ;@ =PMi_Work
+ str r1, [r0, #32]
+ ldr r1, [r4, #8]
+ ldr r0, _0380243C ;@ =PMi_TriggerBL
+ strh r1, [r0]
+ ldr r1, [r4, #12]
+ ldr r0, _03802440 ;@ =PMi_KeyPattern
+ strh r1, [r0]
+ bl PMi_DoSleep
+ b _03802424
+_03802368:
+ mov r1, #4
+ ldr r0, _03802438 ;@ =PMi_Work
+ str r1, [r0, #32]
+ ldr r2, [r4, #8]
+ str r2, [r0, #40] ;@ 0x28
+ ldr r1, [r4, #12]
+ str r1, [r0, #36] ;@ 0x24
+ mov r0, r2, lsl #16
+ mov r0, r0, lsr #16
+ and r1, r1, #255 ;@ 0xff
+ bl PMi_SetRegister
+ mov r0, #100 ;@ 0x64
+ mov r1, #0
+ bl SPIi_ReturnResult
+ b _03802424
+_038023A4:
+ mov r1, #3
+ ldr r0, _03802438 ;@ =PMi_Work
+ str r1, [r0, #32]
+ ldr r1, [r4, #8]
+ str r1, [r0, #40] ;@ 0x28
+ mov r0, r1, lsl #16
+ mov r4, r0, lsr #16
+ mov r0, r4
+ bl PMi_GetRegister
+ mov r1, r0
+ add r0, r4, #112 ;@ 0x70
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ bl SPIi_ReturnResult
+ b _03802424
+_038023E0:
+ mov r0, #2
+ ldr r1, _03802438 ;@ =PMi_Work
+ str r0, [r1, #32]
+ ldr r0, [r4, #8]
+ str r0, [r1, #36] ;@ 0x24
+ bl PMi_SwitchUtilityProc
+ mov r0, #99 ;@ 0x63
+ mov r1, #0
+ bl SPIi_ReturnResult
+ b _03802424
+_03802408:
+ ldr r0, [r4, #8]
+ bl PMi_SetLED
+ b _03802424
+_03802414:
+ mov r0, r1, lsl #16
+ mov r0, r0, lsr #16
+ mov r1, #1
+ bl SPIi_ReturnResult
+_03802424:
+ mov r0, #3
+ bl SPIi_ReleaseException
+_0380242C:
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, lr}
+ bx lr
+_03802438: .word PMi_Work
+_0380243C: .word PMi_TriggerBL
+_03802440: .word PMi_KeyPattern
+
+ arm_func_start PM_AnalyzeCommand
+PM_AnalyzeCommand: ;@ 0x03802444
+ stmdb sp!, {r4, lr}
+ sub sp, sp, #8
+ ands r1, r0, #33554432 ;@ 0x2000000
+ beq _03802474
+ mov r4, #0
+ mov r3, r4
+ ldr r1, _03802610 ;@ =PMi_Work
+_03802460:
+ mov r2, r4, lsl #1
+ strh r3, [r1, r2]
+ add r4, r4, #1
+ cmp r4, #16
+ blt _03802460
+_03802474:
+ and r1, r0, #983040 ;@ 0xf0000
+ mov r1, r1, lsr #16
+ mov r1, r1, lsl #1
+ ldr ip, _03802610 ;@ =PMi_Work
+ strh r0, [ip, r1]
+ ands r0, r0, #16777216 ;@ 0x1000000
+ beq _03802604
+ ldrh r3, [ip]
+ and r0, r3, #65280 ;@ 0xff00
+ mov r0, r0, lsl #8
+ mov r4, r0, lsr #16
+ sub r0, r4, #96 ;@ 0x60
+ cmp r0, #7
+ addls pc, pc, r0, lsl #2
+ b _038025F8
+ b _038024D0
+ b _038024E0
+ b _038025F8
+ b _03802588
+ b _0380251C
+ b _03802558
+ b _038025C4
+ b _038025DC
+_038024D0:
+ mov r0, #96 ;@ 0x60
+ mov r1, #0
+ bl SPIi_ReturnResult
+ b _03802604
+_038024E0:
+ ldrh r1, [ip, #2]
+ ldr r0, _03802614 ;@ =0x0000FFFF
+ and r0, r1, r0
+ str r0, [sp]
+ mov r0, #3
+ mov r1, r4
+ mov r2, #2
+ and r3, r3, #255 ;@ 0xff
+ bl SPIi_SetEntry
+ cmp r0, #0
+ bne _03802604
+ mov r0, r4
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _03802604
+_0380251C:
+ ldrh r1, [ip, #2]
+ ldr r0, _03802614 ;@ =0x0000FFFF
+ and r0, r1, r0
+ str r0, [sp]
+ mov r0, #3
+ mov r1, r4
+ mov r2, #2
+ and r3, r3, #255 ;@ 0xff
+ bl SPIi_SetEntry
+ cmp r0, #0
+ bne _03802604
+ mov r0, r4
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _03802604
+_03802558:
+ mov r0, #3
+ mov r1, r4
+ mov r2, #1
+ ldr ip, _03802614 ;@ =0x0000FFFF
+ and r3, r3, ip
+ bl SPIi_SetEntry
+ cmp r0, #0
+ bne _03802604
+ mov r0, r4
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _03802604
+_03802588:
+ mov r0, #3
+ mov r1, r4
+ mov r2, #1
+ and lr, r3, #255 ;@ 0xff
+ ldrh ip, [ip, #2]
+ ldr r3, _03802614 ;@ =0x0000FFFF
+ and r3, ip, r3
+ orr r3, r3, lr, lsl #16
+ bl SPIi_SetEntry
+ cmp r0, #0
+ bne _03802604
+ mov r0, r4
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _03802604
+_038025C4:
+ and r0, r3, #255 ;@ 0xff
+ bl PM_SetLEDPattern
+ mov r0, #102 ;@ 0x66
+ mov r1, #0
+ bl SPIi_ReturnResult
+ b _03802604
+_038025DC:
+ bl PM_GetLEDPattern
+ mov r1, r0
+ mov r0, #103 ;@ 0x67
+ mov r1, r1, lsl #16
+ mov r1, r1, lsr #16
+ bl SPIi_ReturnResult
+ b _03802604
+_038025F8:
+ mov r0, r4
+ mov r1, #1
+ bl SPIi_ReturnResult
+_03802604:
+ add sp, sp, #8
+ ldmia sp!, {r4, lr}
+ bx lr
+_03802610: .word PMi_Work
+_03802614: .word 0x0000FFFF
+
+ arm_func_start PM_Init
+PM_Init: ;@ 0x03802618
+ mov r1, #1
+ ldr r0, _0380264C ;@ =PMi_Initialized
+ str r1, [r0]
+ mov r3, #0
+ ldr r0, _03802650 ;@ =PMi_Work
+ str r3, [r0, #32]
+ mov r2, r3
+_03802634:
+ mov r1, r3, lsl #1
+ strh r2, [r0, r1]
+ add r3, r3, #1
+ cmp r3, #16
+ blt _03802634
+ bx lr
+_0380264C: .word PMi_Initialized
+_03802650: .word PMi_Work
+
+ arm_func_start PMi_SendPxiCommand
+PMi_SendPxiCommand: ;@ 0x03802654
+ ldr r3, _03802678 ;@ =0x0000FFFF
+ and r3, r2, r3
+ and r0, r0, #62914560 ;@ 0x3c00000
+ mov r2, r0, lsl #22
+ and r0, r1, #4128768 ;@ 0x3f0000
+ orr r0, r2, r0, lsl #16
+ orr r0, r3, r0
+ ldr ip, _0380267C ;@ =PMi_SendPxiData
+ bx ip
+_03802678: .word 0x0000FFFF
+_0380267C: .word PMi_SendPxiData
+
+ arm_func_start PMi_SendPxiData
+PMi_SendPxiData: ;@ 0x03802680
+ stmdb sp!, {r4, r5, r6, lr}
+ mov r6, r0
+ mov r5, #8
+ mov r4, #0
+_03802690:
+ mov r0, r5
+ mov r1, r6
+ mov r2, r4
+ bl PXI_SendWordByFifo
+ cmp r0, #0
+ bne _03802690
+ ldmia sp!, {r4, r5, r6, lr}
+ bx lr
+
+ arm_func_start PMi_ResetControl
+PMi_ResetControl: ;@ 0x038026B0
+ stmdb sp!, {r4, lr}
+ mov r4, r0
+ mov r0, #0
+ bl PMi_GetRegister
+ mvn r1, r4
+ and r0, r0, r1
+ and r1, r0, #255 ;@ 0xff
+ mov r0, #0
+ bl PMi_SetRegister
+ ldmia sp!, {r4, lr}
+ bx lr
+
+ arm_func_start PMi_SetControl
+PMi_SetControl: ;@ 0x038026DC
+ stmdb sp!, {r4, lr}
+ mov r4, r0
+ mov r0, #0
+ bl PMi_GetRegister
+ orr r1, r0, r4
+ mov r0, #0
+ bl PMi_SetRegister
+ ldmia sp!, {r4, lr}
+ bx lr
+
+ arm_func_start PMi_GetRegister
+PMi_GetRegister: ;@ 0x03802700
+ stmdb sp!, {r4, lr}
+ mov r4, r0
+ ldr r1, _0380278C ;@ =0x040001C0
+_0380270C:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _0380270C
+ bl FUN_03802808
+ mov r0, #1
+ bl FUN_03802820
+ orr r0, r4, #128 ;@ 0x80
+ and r0, r0, #255 ;@ 0xff
+ and r1, r0, #255 ;@ 0xff
+ ldr r0, _03802790 ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _0380278C ;@ =0x040001C0
+_0380273C:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _0380273C
+ mov r0, #0
+ bl FUN_03802820
+ mov r1, #0
+ ldr r0, _03802790 ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _0380278C ;@ =0x040001C0
+_03802760:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03802760
+ ldr r0, _03802790 ;@ =0x040001C2
+ ldrh r0, [r0]
+ and r0, r0, #255 ;@ 0xff
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ and r0, r0, #255 ;@ 0xff
+ ldmia sp!, {r4, lr}
+ bx lr
+_0380278C: .word 0x040001C0
+_03802790: .word 0x040001C2
+
+ arm_func_start PMi_SetRegister
+PMi_SetRegister: ;@ 0x03802794
+ stmdb sp!, {r4, r5, lr}
+ sub sp, sp, #4
+ mov r5, r0
+ mov r4, r1
+ ldr r1, _03802800 ;@ =0x040001C0
+_038027A8:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _038027A8
+ bl FUN_03802808
+ mov r0, #1
+ bl FUN_03802820
+ and r0, r5, #255 ;@ 0xff
+ and r1, r0, #255 ;@ 0xff
+ ldr r0, _03802804 ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _03802800 ;@ =0x040001C0
+_038027D4:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _038027D4
+ mov r0, #0
+ bl FUN_03802820
+ and r1, r4, #255 ;@ 0xff
+ ldr r0, _03802804 ;@ =0x040001C2
+ strh r1, [r0]
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, lr}
+ bx lr
+_03802800: .word 0x040001C0
+_03802804: .word 0x040001C2
+
+ arm_func_start FUN_03802808
+FUN_03802808: ;@ 0x03802808
+ ldr r1, _03802818 ;@ =0x00008202
+ ldr r0, _0380281C ;@ =0x040001C0
+ strh r1, [r0]
+ bx lr
+_03802818: .word 0x00008202
+_0380281C: .word 0x040001C0
+
+ arm_func_start FUN_03802820
+FUN_03802820: ;@ 0x03802820
+ ldr r1, _03802834 ;@ =0x00008002
+ orr r1, r1, r0, lsl #11
+ ldr r0, _03802838 ;@ =0x040001C0
+ strh r1, [r0]
+ bx lr
+_03802834: .word 0x00008002
+_03802838: .word 0x040001C0
+
+ arm_func_start PMi_SetLED
+PMi_SetLED: ;@ 0x0380283C
+ stmdb sp!, {r4, lr}
+ mov r4, r0
+ cmp r4, #1
+ beq _03802860
+ cmp r4, #2
+ beq _03802878
+ cmp r4, #3
+ beq _0380286C
+ b _0380288C
+_03802860:
+ mov r0, #16
+ bl PMi_ResetControl
+ b _03802890
+_0380286C:
+ mov r0, #48 ;@ 0x30
+ bl PMi_SetControl
+ b _03802890
+_03802878:
+ mov r0, #32
+ bl PMi_ResetControl
+ mov r0, #16
+ bl PMi_SetControl
+ b _03802890
+_0380288C:
+ bl OS_Terminate
+_03802890:
+ ldr r0, _038028A0 ;@ =PMi_LEDStatus
+ str r4, [r0]
+ ldmia sp!, {r4, lr}
+ bx lr
+_038028A0: .word PMi_LEDStatus
+
+ arm_func_start PMi_SwitchUtilityProc
+PMi_SwitchUtilityProc: ;@ 0x038028A4
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ cmp r0, #15
+ addls pc, pc, r0, lsl #2
+ b _038029C4
+ b _038029C4
+ b _038028F8
+ b _0380290C
+ b _03802920
+ b _03802934
+ b _03802940
+ b _0380294C
+ b _03802958
+ b _03802964
+ b _03802970
+ b _0380297C
+ b _03802988
+ b _03802994
+ b _038029A0
+ b _038029B8
+ b _038029AC
+_038028F8:
+ mov r0, #1
+ bl PM_SetLEDPattern
+ mov r0, #1
+ bl PMi_SetLED
+ b _038029C4
+_0380290C:
+ mov r0, #3
+ bl PM_SetLEDPattern
+ mov r0, #3
+ bl PMi_SetLED
+ b _038029C4
+_03802920:
+ mov r0, #2
+ bl PM_SetLEDPattern
+ mov r0, #2
+ bl PMi_SetLED
+ b _038029C4
+_03802934:
+ mov r0, #4
+ bl PMi_SetControl
+ b _038029C4
+_03802940:
+ mov r0, #4
+ bl PMi_ResetControl
+ b _038029C4
+_0380294C:
+ mov r0, #8
+ bl PMi_SetControl
+ b _038029C4
+_03802958:
+ mov r0, #8
+ bl PMi_ResetControl
+ b _038029C4
+_03802964:
+ mov r0, #12
+ bl PMi_SetControl
+ b _038029C4
+_03802970:
+ mov r0, #12
+ bl PMi_ResetControl
+ b _038029C4
+_0380297C:
+ mov r0, #1
+ bl PMi_SetControl
+ b _038029C4
+_03802988:
+ mov r0, #1
+ bl PMi_ResetControl
+ b _038029C4
+_03802994:
+ mov r0, #2
+ bl PMi_ResetControl
+ b _038029C4
+_038029A0:
+ mov r0, #2
+ bl PMi_SetControl
+ b _038029C4
+_038029AC:
+ mov r0, #64 ;@ 0x40
+ bl PMi_ResetControl
+ b _038029C4
+_038029B8:
+ bl SND_BeginSleep
+ mov r0, #64 ;@ 0x40
+ bl PMi_SetControl
+_038029C4:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start PMi_DoSleep
+PMi_DoSleep: ;@ 0x038029D0
+ stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
+ sub sp, sp, #4
+ mov r5, #0
+ ldr r0, _03802B94 ;@ =0x04000208
+ ldrh r4, [r0]
+ strh r5, [r0]
+ bl OS_DisableInterrupts
+ mov r9, r0
+ mvn r0, #-33554432 ;@ 0xfe000000
+ bl OS_DisableIrqMask
+ mov r8, r0
+ mov r0, r5
+ bl PMi_GetRegister
+ mov r7, r0
+ mov r0, #2
+ bl PM_SetLEDPattern
+ mov r0, #2
+ bl PMi_SetLED
+ mov r0, #2
+ bl PMi_SetLED
+ bl SND_BeginSleep
+ mov r0, #1
+ bl PMi_ResetControl
+ ldr r0, _03802B98 ;@ =PMi_TriggerBL
+ ldrh r0, [r0]
+ ands r0, r0, #1
+ beq _03802A58
+ ldr r0, _03802B9C ;@ =PMi_KeyPattern
+ ldrh r0, [r0]
+ orr r1, r0, #16384 ;@ 0x4000
+ ldr r0, _03802BA0 ;@ =0x04000132
+ strh r1, [r0]
+ mov r0, #4096 ;@ 0x1000
+ bl OS_EnableIrqMask
+_03802A58:
+ ldr r0, _03802B98 ;@ =PMi_TriggerBL
+ ldrh r0, [r0]
+ ands r0, r0, #4
+ beq _03802A70
+ mov r0, #4194304 ;@ 0x400000
+ bl OS_EnableIrqMask
+_03802A70:
+ ldr r0, _03802B98 ;@ =PMi_TriggerBL
+ ldrh r0, [r0]
+ ands r0, r0, #2
+ beq _03802AB4
+ ldr r0, _03802BA4 ;@ =0x04000134
+ ldrh r6, [r0]
+ mov r5, #1
+ mov r0, #32768 ;@ 0x8000
+ bl EXIi_SelectRcnt
+ mov r0, #64 ;@ 0x40
+ mov r1, #0
+ bl EXIi_SetBitRcnt0L
+ mov r0, #256 ;@ 0x100
+ mov r1, r0
+ bl EXIi_SetBitRcnt0L
+ mov r0, #128 ;@ 0x80
+ bl OS_EnableIrqMask
+_03802AB4:
+ ldr r0, _03802B98 ;@ =PMi_TriggerBL
+ ldrh r0, [r0]
+ ands r0, r0, #8
+ beq _03802ACC
+ mov r0, #1048576 ;@ 0x100000
+ bl OS_EnableIrqMask
+_03802ACC:
+ ldr r0, _03802B98 ;@ =PMi_TriggerBL
+ ldrh r0, [r0]
+ ands r0, r0, #16
+ beq _03802AE4
+ mov r0, #8192 ;@ 0x2000
+ bl OS_EnableIrqMask
+_03802AE4:
+ mov r0, r9
+ bl OS_RestoreInterrupts
+ ldr r1, _03802B94 ;@ =0x04000208
+ ldrh r0, [r1]
+ mov r0, #1
+ strh r0, [r1]
+ bl FUN_03802BAC
+ mov r0, #0
+ mov r1, r7
+ bl PMi_SetRegister
+ ldr r0, _03802B98 ;@ =PMi_TriggerBL
+ ldrh r1, [r0]
+ ands r0, r1, #32
+ movne r0, #6
+ moveq r0, #7
+ ands r1, r1, #64 ;@ 0x40
+ movne r7, #4
+ moveq r7, #5
+ bl PMi_SwitchUtilityProc
+ mov r0, r7
+ bl PMi_SwitchUtilityProc
+ cmp r5, #0
+ ldrne r0, _03802BA4 ;@ =0x04000134
+ strneh r6, [r0]
+ mov r0, #1
+ bl PMi_SetControl
+ bl SND_EndSleep
+ mov r1, #0
+ ldr r0, _03802BA8 ;@ =PMi_Work
+ str r1, [r0, #32]
+ mov r0, #98 ;@ 0x62
+ mov r2, r1
+ bl PMi_SendPxiCommand
+ bl OS_DisableInterrupts
+ mov r0, r8
+ bl OS_SetIrqMask
+ mov r0, r9
+ bl OS_RestoreInterrupts
+ ldr r1, _03802B94 ;@ =0x04000208
+ ldrh r0, [r1]
+ strh r4, [r1]
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
+ bx lr
+_03802B94: .word 0x04000208
+_03802B98: .word PMi_TriggerBL
+_03802B9C: .word PMi_KeyPattern
+_03802BA0: .word 0x04000132
+_03802BA4: .word 0x04000134
+_03802BA8: .word PMi_Work
+
+ arm_func_start FUN_03802BAC
+FUN_03802BAC: ;@ 0x03802BAC
+ ldr ip, _03802BB4 ;@ =SVC_Stop
+ bx ip
+_03802BB4: .word SVC_Stop
+
+ arm_func_start PM_GetLEDPattern
+PM_GetLEDPattern: ;@ 0x03802BB8
+ ldr r0, _03802BC4 ;@ =PMi_BlinkPatternNo
+ ldr r0, [r0]
+ bx lr
+_03802BC4: .word PMi_BlinkPatternNo
+
+ arm_func_start PM_SetLEDPattern
+PM_SetLEDPattern: ;@ 0x03802BC8
+ cmp r0, #15
+ ldrle r1, _03802BE4 ;@ =PMi_BlinkPatternNo
+ strle r0, [r1]
+ movle r1, #0
+ ldrle r0, _03802BE8 ;@ =_03809F64
+ strle r1, [r0]
+ bx lr
+_03802BE4: .word PMi_BlinkPatternNo
+_03802BE8: .word _03809F64
+
+ arm_func_start PM_SelfBlinkProc
+PM_SelfBlinkProc: ;@ 0x03802BEC
+ stmdb sp!, {r4, r5, r6, lr}
+ ldr r0, _03802D04 ;@ =PMi_BlinkPatternNo
+ ldr r3, [r0]
+ cmp r3, #0
+ bne _03802C28
+ mov r0, #3
+ mov r1, #102 ;@ 0x66
+ mov r2, #1
+ mov r3, r2
+ bl SPIi_SetEntry
+ cmp r0, #0
+ beq _03802CFC
+ mov r0, #1
+ bl PM_SetLEDPattern
+ b _03802CFC
+_03802C28:
+ cmp r3, #4
+ bge _03802C54
+ ldr r0, _03802D08 ;@ =PMi_LEDStatus
+ ldr r0, [r0]
+ cmp r3, r0
+ beq _03802CFC
+ mov r0, #3
+ mov r1, #102 ;@ 0x66
+ mov r2, #1
+ bl SPIi_SetEntry
+ b _03802CFC
+_03802C54:
+ ldr r6, _03802D0C ;@ =PMi_BlinkPatternData
+ sub r1, r3, #4
+ mov r0, #12
+ mul r5, r1, r0
+ add r4, r6, r5
+ ldr r0, _03802D10 ;@ =_03809F64
+ ldr r0, [r0]
+ ldrh r1, [r4, #10]
+ bl _u32_div_f
+ ldr r5, [r6, r5]
+ ldr lr, [r4, #4]
+ mov r3, #0
+ mov r2, #-2147483648 ;@ 0x80000000
+ mov ip, r3, lsr r0
+ rsb r1, r0, #32
+ orr ip, ip, r2, lsl r1
+ sub r1, r0, #32
+ orr ip, ip, r2, lsr r1
+ and r0, lr, r2, lsr r0
+ and r1, r5, ip
+ cmp r0, r3
+ cmpeq r1, r3
+ movne r3, #1
+ moveq r3, #2
+ ldr r0, _03802D10 ;@ =_03809F64
+ ldr r1, [r0]
+ add ip, r1, #1
+ str ip, [r0]
+ ldrh r2, [r4, #8]
+ ldrh r1, [r4, #10]
+ mul r1, r2, r1
+ cmp ip, r1
+ movcs r1, #0
+ strcs r1, [r0]
+ ldr r0, _03802D08 ;@ =PMi_LEDStatus
+ ldr r0, [r0]
+ cmp r3, r0
+ beq _03802CFC
+ mov r0, #3
+ mov r1, #102 ;@ 0x66
+ mov r2, #1
+ bl SPIi_SetEntry
+_03802CFC:
+ ldmia sp!, {r4, r5, r6, lr}
+ bx lr
+_03802D04: .word PMi_BlinkPatternNo
+_03802D08: .word PMi_LEDStatus
+_03802D0C: .word PMi_BlinkPatternData
+_03802D10: .word _03809F64
diff --git a/arm7/asm/SPI_tp.s b/arm7/asm/SPI_tp.s
new file mode 100644
index 00000000..2176bfce
--- /dev/null
+++ b/arm7/asm/SPI_tp.s
@@ -0,0 +1,861 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .section .bss
+
+ .global _03809E4C
+_03809E4C: ;0x03809E4C
+ .space 0x03809E50 - 0x03809E4C
+
+ .global _03809E50
+_03809E50: ;0x03809E50
+ .space 0x03809E54 - 0x03809E50
+
+ .global _03809E54
+_03809E54: ;0x03809E54
+ .space 0x03809E80 - 0x03809E54
+
+ .global _03809E80
+_03809E80: ;0x03809E80
+ .space 0x03809F28 - 0x03809E80
+
+ .global _03809F28
+_03809F28: ;0x03809F28
+ .space 0x03809F2C - 0x03809F28
+
+ .section .text
+
+ arm_func_start TP_ExecuteProcess
+TP_ExecuteProcess: ;@ 0x03801720
+ stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
+ sub sp, sp, #16
+ mov sl, r0
+ ldr r1, [sl, #4]
+ cmp r1, #2
+ bhi _03801754
+ cmp r1, #0
+ beq _0380176C
+ cmp r1, #1
+ beq _03801834
+ cmp r1, #2
+ beq _038018E0
+ b _0380192C
+_03801754:
+ cmp r1, #16
+ bne _0380192C
+ ldr r0, _03801938 ;@ =_03809E54
+ ldr r0, [r0, #32]
+ cmp r0, #2
+ bne _0380192C
+_0380176C:
+ bl OS_DisableInterrupts
+ mov r4, r0
+ mov r0, #0
+ bl SPIi_CheckException
+ cmp r0, #0
+ bne _038017A4
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ ldr r0, [sl, #4]
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _0380192C
+_038017A4:
+ mov r0, #0
+ bl SPIi_GetException
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ add r0, sp, #8
+ ldr r1, _03801938 ;@ =_03809E54
+ ldr r1, [r1, #36] ;@ 0x24
+ add r2, sp, #4
+ bl TP_ExecSampling
+ add r0, sp, #8
+ ldrh r1, [sp, #4]
+ bl FUN_03801954
+ ldrh r1, [sp, #8]
+ ldr r0, _0380193C ;@ =0x027FFFAA
+ strh r1, [r0]
+ ldrh r1, [sp, #10]
+ ldr r0, _03801940 ;@ =0x027FFFAC
+ strh r1, [r0]
+ ldr r0, [sl, #4]
+ cmp r0, #0
+ bne _0380180C
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ mov r1, #0
+ bl SPIi_ReturnResult
+ b _03801828
+_0380180C:
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ ldr r1, [sl, #8]
+ and r1, r1, #255 ;@ 0xff
+ mov r1, r1, lsl #16
+ mov r1, r1, lsr #16
+ bl SPIi_ReturnResult
+_03801828:
+ mov r0, #0
+ bl SPIi_ReleaseException
+ b _0380192C
+_03801834:
+ ldr r7, _03801938 ;@ =_03809E54
+ ldr r0, [r7, #32]
+ cmp r0, #1
+ bne _038018CC
+ mov r9, #0
+ ldr r8, _03801944 ;@ =0x00000107
+ ldr r6, _03801948 ;@ =_03809E80
+ mov r5, #10
+ ldr r4, _0380194C ;@ =FUN_038016A8
+ b _0380189C
+_0380185C:
+ mul r0, r9, r8
+ bl _u32_div_f
+ ldr r1, [sl, #12]
+ add r0, r1, r0
+ mov r1, r8
+ bl _u32_div_f
+ add r2, r7, r9, lsl #1
+ strh r1, [r2, #204] ;@ 0xcc
+ str r9, [sp]
+ mov r0, #40 ;@ 0x28
+ mla r0, r9, r0, r6
+ ldrsh r1, [r2, #204] ;@ 0xcc
+ mov r2, r5
+ mov r3, r4
+ bl OS_SetPeriodicVAlarm
+ add r9, r9, #1
+_0380189C:
+ ldr r1, [sl, #8]
+ cmp r9, r1
+ bcc _0380185C
+ ldr r0, [sl, #4]
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ mov r1, #0
+ bl SPIi_ReturnResult
+ mov r1, #2
+ ldr r0, _03801938 ;@ =_03809E54
+ str r1, [r0, #32]
+ b _0380192C
+_038018CC:
+ mov r0, r1, lsl #16
+ mov r0, r0, lsr #16
+ mov r1, #3
+ bl SPIi_ReturnResult
+ b _0380192C
+_038018E0:
+ ldr r0, _03801938 ;@ =_03809E54
+ ldr r0, [r0, #32]
+ cmp r0, #3
+ bne _0380191C
+ ldr r0, _03801950 ;@ =0x54505641
+ bl OS_CancelVAlarms
+ ldr r0, [sl, #4]
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ mov r1, #0
+ bl SPIi_ReturnResult
+ mov r1, #0
+ ldr r0, _03801938 ;@ =_03809E54
+ str r1, [r0, #32]
+ b _0380192C
+_0380191C:
+ mov r0, r1, lsl #16
+ mov r0, r0, lsr #16
+ mov r1, #3
+ bl SPIi_ReturnResult
+_0380192C:
+ add sp, sp, #16
+ ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
+ bx lr
+_03801938: .word _03809E54
+_0380193C: .word 0x027FFFAA
+_03801940: .word 0x027FFFAC
+_03801944: .word 0x00000107
+_03801948: .word _03809E80
+_0380194C: .word FUN_038016A8
+_03801950: .word 0x54505641
+
+ arm_func_start FUN_03801954
+FUN_03801954: ;@ 0x03801954
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ ldr r0, [r0]
+ mov r2, r0, lsl #7
+ movs r2, r2, lsr #31
+ bne _03801984
+ mov r1, #0
+ ldr r0, _03801A3C ;@ =_03809E50
+ strb r1, [r0]
+ ldr r0, _03801A40 ;@ =_03809E4C
+ strb r1, [r0]
+ b _03801A30
+_03801984:
+ mov r0, r0, lsl #5
+ movs r0, r0, lsr #30
+ beq _038019D4
+ mov r2, #0
+ ldr r0, _03801A40 ;@ =_03809E4C
+ strb r2, [r0]
+ ldr r0, _03801A3C ;@ =_03809E50
+ ldrb r1, [r0]
+ add r1, r1, #1
+ strb r1, [r0]
+ ldrb r1, [r0]
+ cmp r1, #4
+ bcc _03801A30
+ strb r2, [r0]
+ ldr r0, _03801A44 ;@ =_03809E54
+ ldr r1, [r0, #36] ;@ 0x24
+ cmp r1, #35 ;@ 0x23
+ addlt r1, r1, #1
+ strlt r1, [r0, #36] ;@ 0x24
+ b _03801A30
+_038019D4:
+ mov lr, #0
+ ldr r3, _03801A3C ;@ =_03809E50
+ strb lr, [r3]
+ ldr r2, _03801A44 ;@ =_03809E54
+ ldr ip, [r2, #36] ;@ 0x24
+ cmp r1, ip, asr #1
+ ldrge r0, _03801A40 ;@ =_03809E4C
+ strgeb lr, [r0]
+ bge _03801A30
+ ldr r0, _03801A40 ;@ =_03809E4C
+ ldrb r1, [r0]
+ add r1, r1, #1
+ strb r1, [r0]
+ ldrb r1, [r0]
+ cmp r1, #4
+ bcc _03801A30
+ strb lr, [r0]
+ ldr r0, [r2, #40] ;@ 0x28
+ cmp ip, r0
+ subgt r0, ip, #1
+ strgt r0, [r2, #36] ;@ 0x24
+ movgt r0, #3
+ strgtb r0, [r3]
+_03801A30:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_03801A3C: .word _03809E50
+_03801A40: .word _03809E4C
+_03801A44: .word _03809E54
+
+ arm_func_start TP_AnalyzeCommand
+TP_AnalyzeCommand: ;@ 0x03801A48
+ stmdb sp!, {r4, lr}
+ sub sp, sp, #8
+ ands r1, r0, #33554432 ;@ 0x2000000
+ beq _03801A78
+ mov r4, #0
+ mov r3, r4
+ ldr r1, _03801C00 ;@ =_03809E54
+_03801A64:
+ mov r2, r4, lsl #1
+ strh r3, [r1, r2]
+ add r4, r4, #1
+ cmp r4, #16
+ blt _03801A64
+_03801A78:
+ and r1, r0, #983040 ;@ 0xf0000
+ mov r1, r1, lsr #16
+ mov r1, r1, lsl #1
+ ldr r2, _03801C00 ;@ =_03809E54
+ strh r0, [r2, r1]
+ ands r0, r0, #16777216 ;@ 0x1000000
+ beq _03801BF4
+ ldrh r1, [r2]
+ and r0, r1, #65280 ;@ 0xff00
+ mov r0, r0, lsl #8
+ mov r4, r0, lsr #16
+ cmp r4, #3
+ addls pc, pc, r4, lsl #2
+ b _03801BE8
+ b _03801AD4
+ b _03801AFC
+ b _03801B98
+ b _03801AC0
+_03801AC0:
+ and r0, r1, #255 ;@ 0xff
+ mov r0, r0, lsl #16
+ mov r0, r0, lsr #16
+ bl FUN_03801660
+ b _03801BF4
+_03801AD4:
+ mov r0, #0
+ mov r1, r4
+ mov r2, r0
+ bl SPIi_SetEntry
+ cmp r0, #0
+ bne _03801BF4
+ mov r0, r4
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _03801BF4
+_03801AFC:
+ ldr r0, [r2, #32]
+ cmp r0, #0
+ beq _03801B18
+ mov r0, r4
+ mov r1, #3
+ bl SPIi_ReturnResult
+ b _03801BF4
+_03801B18:
+ and r0, r1, #255 ;@ 0xff
+ mov r0, r0, lsl #16
+ movs r3, r0, lsr #16
+ beq _03801B30
+ cmp r3, #4
+ bls _03801B40
+_03801B30:
+ mov r0, r4
+ mov r1, #2
+ bl SPIi_ReturnResult
+ b _03801BF4
+_03801B40:
+ ldrh r1, [r2, #2]
+ ldr r0, _03801C04 ;@ =0x00000107
+ cmp r1, r0
+ bcc _03801B60
+ mov r0, r4
+ mov r1, #2
+ bl SPIi_ReturnResult
+ b _03801BF4
+_03801B60:
+ str r1, [sp]
+ mov r0, #0
+ mov r1, r4
+ mov r2, #2
+ bl SPIi_SetEntry
+ cmp r0, #0
+ movne r1, #1
+ ldrne r0, _03801C00 ;@ =_03809E54
+ strne r1, [r0, #32]
+ bne _03801BF4
+ mov r0, r4
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _03801BF4
+_03801B98:
+ ldr r0, [r2, #32]
+ cmp r0, #2
+ beq _03801BB4
+ mov r0, r4
+ mov r1, #3
+ bl SPIi_ReturnResult
+ b _03801BF4
+_03801BB4:
+ mov r0, #0
+ mov r1, r4
+ mov r2, r0
+ bl SPIi_SetEntry
+ cmp r0, #0
+ movne r1, #3
+ ldrne r0, _03801C00 ;@ =_03809E54
+ strne r1, [r0, #32]
+ bne _03801BF4
+ mov r0, r4
+ mov r1, #4
+ bl SPIi_ReturnResult
+ b _03801BF4
+_03801BE8:
+ mov r0, r4
+ mov r1, #1
+ bl SPIi_ReturnResult
+_03801BF4:
+ add sp, sp, #8
+ ldmia sp!, {r4, lr}
+ bx lr
+_03801C00: .word _03809E54
+_03801C04: .word 0x00000107
+
+ arm_func_start TP_Init
+TP_Init: ;@ 0x03801C08
+ stmdb sp!, {r4, r5, r6, r7, r8, lr}
+ mov r3, #0
+ ldr r0, _03801CFC ;@ =_03809E54
+ str r3, [r0, #32]
+ mov r1, #20
+ str r1, [r0, #36] ;@ 0x24
+ str r1, [r0, #40] ;@ 0x28
+ mov r2, r3
+_03801C28:
+ mov r1, r3, lsl #1
+ strh r2, [r0, r1]
+ add r3, r3, #1
+ cmp r3, #16
+ blt _03801C28
+ bl OS_IsVAlarmAvailable
+ cmp r0, #0
+ bne _03801C4C
+ bl OS_InitVAlarm
+_03801C4C:
+ mov r7, #0
+ ldr r6, _03801D00 ;@ =_03809E80
+ ldr r5, _03801D04 ;@ =0x54505641
+ mov r4, #40 ;@ 0x28
+_03801C5C:
+ mla r8, r7, r4, r6
+ mov r0, r8
+ bl OS_CreateVAlarm
+ mov r0, r8
+ mov r1, r5
+ bl OS_SetVAlarmTag
+ add r7, r7, #1
+ cmp r7, #4
+ blt _03801C5C
+ ldr r1, _03801D08 ;@ =0x040001C0
+_03801C84:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03801C84
+ ldr r0, _03801D0C ;@ =0x00008A01
+ strh r0, [r1]
+ mov r1, #132 ;@ 0x84
+ ldr r0, _03801D10 ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _03801D08 ;@ =0x040001C0
+_03801CA8:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03801CA8
+ mov r1, #0
+ ldr r0, _03801D10 ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _03801D08 ;@ =0x040001C0
+_03801CC4:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03801CC4
+ ldr r0, _03801D14 ;@ =0x00008201
+ strh r0, [r1]
+ mov r1, #0
+ ldr r0, _03801D10 ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _03801D08 ;@ =0x040001C0
+_03801CE8:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03801CE8
+ ldmia sp!, {r4, r5, r6, r7, r8, lr}
+ bx lr
+_03801CFC: .word _03809E54
+_03801D00: .word _03809E80
+_03801D04: .word 0x54505641
+_03801D08: .word 0x040001C0
+_03801D0C: .word 0x00008A01
+_03801D10: .word 0x040001C2
+_03801D14: .word 0x00008201
+
+ arm_func_start TP_ExecSampling
+TP_ExecSampling: ;@ 0x03801D18
+ stmdb sp!, {r4, r5, r6, r7, lr}
+ sub sp, sp, #12
+ mov r7, r0
+ movs r6, r1
+ mov r5, r2
+ mov r0, #0
+ strh r0, [r5]
+ rsbmi r6, r6, #0
+ bl FUN_03802160
+ movs r4, r0
+ bne _03801D94
+ ldr r1, [r7]
+ mov r0, #4096 ;@ 0x1000
+ rsb r0, r0, #0
+ and r0, r1, r0
+ str r0, [r7]
+ ldr r1, [r7]
+ ldr r0, _03801F4C ;@ =0xFF000FFF
+ and r0, r1, r0
+ str r0, [r7]
+ ldr r0, [r7]
+ bic r0, r0, #16777216 ;@ 0x1000000
+ str r0, [r7]
+ ldr r0, [r7]
+ bic r0, r0, #100663296 ;@ 0x6000000
+ orr r0, r0, #100663296 ;@ 0x6000000
+ str r0, [r7]
+ mov r1, #0
+ ldr r0, _03801F50 ;@ =_03809F28
+ strh r1, [r0]
+ b _03801F40
+_03801D94:
+ add r0, sp, #0
+ mov r1, r6
+ mov r2, #0
+ add r3, sp, #2
+ bl FUN_03801F68
+ ldr r1, [r7]
+ bic r1, r1, #100663296 ;@ 0x6000000
+ and r0, r0, #3
+ orr r0, r1, r0, lsl #25
+ str r0, [r7]
+ ldr r1, [r7]
+ mov r0, #4096 ;@ 0x1000
+ rsb r0, r0, #0
+ and r2, r1, r0
+ ldrh r1, [sp]
+ ldr r0, _03801F54 ;@ =0x00000FFF
+ and r0, r1, r0
+ orr r0, r2, r0
+ str r0, [r7]
+ add r0, sp, #0
+ mov r1, r6
+ mov r2, #1
+ add r3, sp, #4
+ bl FUN_03801F68
+ cmp r0, #2
+ bne _03801E1C
+ ldr r0, [r7]
+ bic r1, r0, #100663296 ;@ 0x6000000
+ mov r0, r0, lsl #5
+ mov r0, r0, lsr #30
+ orr r0, r0, #2
+ and r0, r0, #3
+ orr r0, r1, r0, lsl #25
+ str r0, [r7]
+_03801E1C:
+ ldr r1, [r7]
+ ldr r0, _03801F4C ;@ =0xFF000FFF
+ and r2, r1, r0
+ ldrh r1, [sp]
+ ldr r0, _03801F54 ;@ =0x00000FFF
+ and r0, r1, r0
+ orr r0, r2, r0, lsl #12
+ str r0, [r7]
+ ldr r0, _03801F58 ;@ =0x00008A01
+ ldr r3, _03801F5C ;@ =0x040001C0
+ strh r0, [r3]
+ mov r6, #0
+ mov r2, r6
+ ldr r1, _03801F60 ;@ =0x040001C2
+_03801E54:
+ strh r2, [r1]
+_03801E58:
+ ldrh r0, [r3]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03801E58
+ add r6, r6, #1
+ cmp r6, #12
+ blt _03801E54
+ ldr r0, _03801F64 ;@ =0x00008201
+ strh r0, [r3]
+ mov r1, #0
+ ldr r0, _03801F60 ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _03801F5C ;@ =0x040001C0
+_03801E88:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03801E88
+ cmp r4, #2
+ ldreq r0, [r7]
+ biceq r0, r0, #100663296 ;@ 0x6000000
+ orreq r0, r0, #100663296 ;@ 0x6000000
+ streq r0, [r7]
+ bl FUN_03802160
+ cmp r0, #0
+ beq _03801F20
+ cmp r0, #1
+ beq _03801EF0
+ cmp r0, #2
+ bne _03801F3C
+ ldr r0, [r7]
+ orr r0, r0, #16777216 ;@ 0x1000000
+ str r0, [r7]
+ ldr r0, [r7]
+ bic r0, r0, #100663296 ;@ 0x6000000
+ orr r0, r0, #100663296 ;@ 0x6000000
+ str r0, [r7]
+ mov r1, #0
+ ldr r0, _03801F50 ;@ =_03809F28
+ strh r1, [r0]
+ b _03801F40
+_03801EF0:
+ ldr r0, [r7]
+ orr r0, r0, #16777216 ;@ 0x1000000
+ str r0, [r7]
+ mov r1, #1
+ ldr r0, _03801F50 ;@ =_03809F28
+ strh r1, [r0]
+ ldrh r0, [sp, #4]
+ ldrh r1, [sp, #2]
+ cmp r1, r0
+ movcc r1, r0
+ strh r1, [r5]
+ b _03801F40
+_03801F20:
+ ldr r0, [r7]
+ bic r0, r0, #16777216 ;@ 0x1000000
+ str r0, [r7]
+ mov r1, #0
+ ldr r0, _03801F50 ;@ =_03809F28
+ strh r1, [r0]
+ b _03801F40
+_03801F3C:
+ bl OS_Terminate
+_03801F40:
+ add sp, sp, #12
+ ldmia sp!, {r4, r5, r6, r7, lr}
+ bx lr
+_03801F4C: .word 0xFF000FFF
+_03801F50: .word _03809F28
+_03801F54: .word 0x00000FFF
+_03801F58: .word 0x00008A01
+_03801F5C: .word 0x040001C0
+_03801F60: .word 0x040001C2
+_03801F64: .word 0x00008201
+
+ arm_func_start FUN_03801F68
+FUN_03801F68: ;@ 0x03801F68
+ stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
+ sub sp, sp, #24
+ cmp r2, #0
+ moveq r5, #209 ;@ 0xd1
+ moveq r6, #1
+ movne r5, #145 ;@ 0x91
+ movne r6, #2
+_03801F84:
+ ldr r4, _0380214C ;@ =0x040001C0
+ ldrh r2, [r4]
+ ands r2, r2, #128 ;@ 0x80
+ bne _03801F84
+ ldr r2, _03802150 ;@ =0x00008A01
+ strh r2, [r4]
+ and r5, r5, #255 ;@ 0xff
+ ldr r2, _03802154 ;@ =0x040001C2
+ strh r5, [r2]
+_03801FA8:
+ ldrh r2, [r4]
+ ands r2, r2, #128 ;@ 0x80
+ bne _03801FA8
+ mov r7, #0
+ ldr ip, _0380214C ;@ =0x040001C0
+ ldr lr, _03802154 ;@ =0x040001C2
+ add r2, sp, #0
+ mov r4, r7
+ ldr r9, _03802158 ;@ =0x00007FF8
+_03801FCC:
+ strh r4, [lr]
+_03801FD0:
+ ldrh r8, [ip]
+ ands r8, r8, #128 ;@ 0x80
+ bne _03801FD0
+ ldrh r8, [lr]
+ and r8, r8, #255 ;@ 0xff
+ mov r8, r8, lsl #16
+ mov r8, r8, lsr #8
+ str r8, [r2, r7, lsl #2]
+ strh r5, [lr]
+_03801FF4:
+ ldrh r8, [ip]
+ ands r8, r8, #128 ;@ 0x80
+ bne _03801FF4
+ ldrh r8, [lr]
+ and r8, r8, #255 ;@ 0xff
+ mov r8, r8, lsl #16
+ ldr sl, [r2, r7, lsl #2]
+ orr r8, sl, r8, lsr #16
+ str r8, [r2, r7, lsl #2]
+ ldr r8, [r2, r7, lsl #2]
+ and r8, r8, r9
+ mov r8, r8, asr #3
+ str r8, [r2, r7, lsl #2]
+ add r7, r7, #1
+ cmp r7, #5
+ blt _03801FCC
+ ldr r2, _0380215C ;@ =0x00008201
+ strh r2, [ip]
+ mov r2, #0
+ strh r2, [lr]
+ ldr r4, _0380214C ;@ =0x040001C0
+_03802048:
+ ldrh r2, [r4]
+ ands r2, r2, #128 ;@ 0x80
+ bne _03802048
+ mov r8, #0
+ mov r7, r8
+ add r5, sp, #0
+_03802060:
+ add r9, r7, #1
+ ldr r4, [r5, r7, lsl #2]
+ b _03802084
+_0380206C:
+ ldr r2, [r5, r9, lsl #2]
+ subs r2, r4, r2
+ rsbmi r2, r2, #0
+ cmp r2, r8
+ movgt r8, r2
+ add r9, r9, #1
+_03802084:
+ cmp r9, #5
+ blt _0380206C
+ add r7, r7, #1
+ cmp r7, #4
+ blt _03802060
+ strh r8, [r3]
+ mov r4, #0
+ add r2, sp, #0
+ b _0380211C
+_038020A8:
+ add r3, r4, #1
+ ldr r7, [r2, r4, lsl #2]
+ b _03802110
+_038020B4:
+ ldr r8, [r2, r3, lsl #2]
+ subs r5, r7, r8
+ rsbmi r5, r5, #0
+ cmp r5, r1
+ bgt _0380210C
+ add r9, r3, #1
+ b _03802104
+_038020D0:
+ ldr r5, [r2, r9, lsl #2]
+ subs sl, r7, r5
+ rsbmi sl, sl, #0
+ cmp sl, r1
+ bgt _03802100
+ add r1, r8, r7, lsl #1
+ add r1, r5, r1
+ mov r1, r1, asr #2
+ bic r1, r1, #7
+ strh r1, [r0]
+ mov r0, #0
+ b _03802140
+_03802100:
+ add r9, r9, #1
+_03802104:
+ cmp r9, #5
+ blt _038020D0
+_0380210C:
+ add r3, r3, #1
+_03802110:
+ cmp r3, #4
+ blt _038020B4
+ add r4, r4, #1
+_0380211C:
+ cmp r4, #3
+ blt _038020A8
+ ldr r2, [sp]
+ ldr r1, [sp, #16]
+ add r1, r2, r1
+ mov r1, r1, asr #1
+ bic r1, r1, #7
+ strh r1, [r0]
+ mov r0, r6
+_03802140:
+ add sp, sp, #24
+ ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
+ bx lr
+_0380214C: .word 0x040001C0
+_03802150: .word 0x00008A01
+_03802154: .word 0x040001C2
+_03802158: .word 0x00007FF8
+_0380215C: .word 0x00008201
+
+ arm_func_start FUN_03802160
+FUN_03802160: ;@ 0x03802160
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ mov r0, #32768 ;@ 0x8000
+ bl EXIi_SelectRcnt
+ ldr r1, _038022A4 ;@ =0x040001C0
+_03802174:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03802174
+ ldr r0, _038022A8 ;@ =0x00008A01
+ strh r0, [r1]
+ mov r1, #132 ;@ 0x84
+ ldr r0, _038022AC ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _038022A4 ;@ =0x040001C0
+_03802198:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03802198
+ mov r1, #0
+ ldr r0, _038022AC ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _038022A4 ;@ =0x040001C0
+_038021B4:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _038021B4
+ ldr r0, _038022B0 ;@ =0x00008201
+ strh r0, [r1]
+ mov r1, #0
+ ldr r0, _038022AC ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _038022A4 ;@ =0x040001C0
+_038021D8:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _038021D8
+ ldr r0, _038022B4 ;@ =_03809F28
+ ldrh r0, [r0]
+ cmp r0, #0
+ bne _0380220C
+ ldr r0, _038022B8 ;@ =0x04000136
+ ldrh r0, [r0]
+ ands r0, r0, #64 ;@ 0x40
+ moveq r0, #1
+ movne r0, #0
+ b _03802298
+_0380220C:
+ ldr r0, _038022B8 ;@ =0x04000136
+ ldrh r0, [r0]
+ ands r0, r0, #64 ;@ 0x40
+ moveq r0, #1
+ beq _03802298
+ ldr r0, _038022A8 ;@ =0x00008A01
+ strh r0, [r1]
+ mov r1, #132 ;@ 0x84
+ ldr r0, _038022AC ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _038022A4 ;@ =0x040001C0
+_03802238:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03802238
+ mov r1, #0
+ ldr r0, _038022AC ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _038022A4 ;@ =0x040001C0
+_03802254:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03802254
+ ldr r0, _038022B0 ;@ =0x00008201
+ strh r0, [r1]
+ mov r1, #0
+ ldr r0, _038022AC ;@ =0x040001C2
+ strh r1, [r0]
+ ldr r1, _038022A4 ;@ =0x040001C0
+_03802278:
+ ldrh r0, [r1]
+ ands r0, r0, #128 ;@ 0x80
+ bne _03802278
+ ldr r0, _038022B8 ;@ =0x04000136
+ ldrh r0, [r0]
+ ands r0, r0, #64 ;@ 0x40
+ movne r0, #0
+ moveq r0, #2
+_03802298:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_038022A4: .word 0x040001C0
+_038022A8: .word 0x00008A01
+_038022AC: .word 0x040001C2
+_038022B0: .word 0x00008201
+_038022B4: .word _03809F28
+_038022B8: .word 0x04000136
diff --git a/arm7/asm/wram2.s b/arm7/asm/wram2.s
index 57fd39e1..68b31543 100644
--- a/arm7/asm/wram2.s
+++ b/arm7/asm/wram2.s
@@ -3,3626 +3,6 @@
.section .text
- arm_func_start FUN_03801150
-FUN_03801150: ;@ 0x03801150
- stmfd sp!, {lr}
- sub sp, sp, #4
- cmp r2, #0
- bne _038011B4
- sub r0, r0, #4
- cmp r0, #5
- addls pc, pc, r0, lsl #2
- b _038011B4
- b _038011AC
- b _038011B4
- b _03801188
- b _038011B4
- b _038011A0
- b _03801194
-_03801188:
- mov r0, r1
- bl TP_AnalyzeCommand
- b _038011B4
-_03801194:
- mov r0, r1
- bl MIC_AnalyzeCommand
- b _038011B4
-_038011A0:
- mov r0, r1
- bl PM_AnalyzeCommand
- b _038011B4
-_038011AC:
- mov r0, r1
- bl NVRAM_AnalyzeCommand
-_038011B4:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start FUN_038011C0
-FUN_038011C0: ;@ 0x038011C0
- stmdb sp!, {r4, r5, r6, lr}
- sub sp, sp, #8
- ldr r6, _03801228 ;@ =_03809C5C
- add r5, sp, #0
- mov r4, #1
-_038011D4:
- mov r0, r6
- mov r1, r5
- mov r2, r4
- bl OS_ReceiveMessage
- ldr r0, [sp]
- ldr r1, [r0]
- cmp r1, #3
- addls pc, pc, r1, lsl #2
- b _038011D4
- b _03801208
- b _03801220
- b _03801210
- b _03801218
-_03801208:
- bl TP_ExecuteProcess
- b _038011D4
-_03801210:
- bl MIC_ExecuteProcess
- b _038011D4
-_03801218:
- bl PM_ExecuteProcess
- b _038011D4
-_03801220:
- bl NVRAM_ExecuteProcess
- b _038011D4
-_03801228: .word _03809C5C
-
- arm_func_start SPIi_CheckEntry
-SPIi_CheckEntry: ;@ 0x0380122C
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r0, _03801250 ;@ =_03809C5C
- add r1, sp, #0
- mov r2, #0
- bl OS_ReadMessage
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_03801250: .word _03809C5C
-
- arm_func_start SPIi_SetEntry
-SPIi_SetEntry: ;@ 0x03801254
- stmdb sp!, {r0, r1, r2, r3}
- stmdb sp!, {r4, r5, r6, lr}
- mov r5, r0
- mov r4, r1
- ldrh r0, [sp, #24]
- cmp r0, #4
- movhi r0, #0
- bhi _0380130C
- bl OS_DisableInterrupts
- ldr r2, _03801318 ;@ =_038099B0
- ldr r3, [r2, #1164] ;@ 0x48c
- mov r1, #24
- mul ip, r3, r1
- ldr r3, _0380131C ;@ =_03809CBC
- str r5, [r3, ip]
- ldr r3, [r2, #1164] ;@ 0x48c
- mul r5, r3, r1
- ldr r3, _03801320 ;@ =_03809CC0
- str r4, [r3, r5]
- add r3, sp, #24
- bic r3, r3, #3
- add r6, r3, #4
- mov lr, #0
- ldrh ip, [sp, #24]
- b _038012D4
-_038012B8:
- add r6, r6, #4
- ldr r5, [r6, #-4]
- ldr r4, [r2, #1164] ;@ 0x48c
- mla r3, r4, r1, r2
- add r3, r3, lr, lsl #2
- str r5, [r3, #788] ;@ 0x314
- add lr, lr, #1
-_038012D4:
- cmp lr, ip
- blt _038012B8
- ldr r1, _03801318 ;@ =_038099B0
- ldr r4, [r1, #1164] ;@ 0x48c
- add r2, r4, #1
- and r2, r2, #15
- str r2, [r1, #1164] ;@ 0x48c
- bl OS_RestoreInterrupts
- ldr r0, _03801324 ;@ =_03809C5C
- ldr r2, _0380131C ;@ =_03809CBC
- mov r1, #24
- mla r1, r4, r1, r2
- mov r2, #0
- bl OS_SendMessage
-_0380130C:
- ldmia sp!, {r4, r5, r6, lr}
- add sp, sp, #16
- bx lr
-_03801318: .word _038099B0
-_0380131C: .word _03809CBC
-_03801320: .word _03809CC0
-_03801324: .word _03809C5C
-
- arm_func_start SPIi_ReleaseException
-SPIi_ReleaseException: ;@ 0x03801328
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r1, _03801364 ;@ =_038099B0
- ldr r2, [r1, #4]
- cmp r2, r0
- bne _03801358
- mov r0, #5
- str r0, [r1, #4]
- mov r0, #0
- str r0, [r1]
- ldr r0, _03801368 ;@ =_03809E40
- bl OS_WakeupThread
-_03801358:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_03801364: .word _038099B0
-_03801368: .word _03809E40
-
- arm_func_start SPIi_GetException
-SPIi_GetException: ;@ 0x0380136C
- mov r2, #1
- ldr r1, _03801380 ;@ =_038099B0
- str r2, [r1]
- str r0, [r1, #4]
- bx lr
-_03801380: .word _038099B0
-
- arm_func_start SPIi_CheckException
-SPIi_CheckException: ;@ 0x03801384
- ldr r0, _0380139C ;@ =_038099B0
- ldr r0, [r0]
- cmp r0, #0
- moveq r0, #1
- movne r0, #0
- bx lr
-_0380139C: .word _038099B0
-
- arm_func_start SPIi_ReturnResult
-SPIi_ReturnResult: ;@ 0x038013A0
- stmdb sp!, {r4, r5, r6, lr}
- and r2, r0, #112 ;@ 0x70
- cmp r2, #48 ;@ 0x30
- bgt _038013E0
- cmp r2, #48 ;@ 0x30
- bge _03801434
- cmp r2, #16
- bgt _038013D4
- cmp r2, #16
- bge _0380141C
- cmp r2, #0
- beq _0380141C
- b _03801438
-_038013D4:
- cmp r2, #32
- beq _03801434
- b _03801438
-_038013E0:
- cmp r2, #80 ;@ 0x50
- bgt _038013FC
- cmp r2, #80 ;@ 0x50
- bge _03801424
- cmp r2, #64 ;@ 0x40
- beq _03801424
- b _03801438
-_038013FC:
- cmp r2, #96 ;@ 0x60
- bgt _03801410
- cmp r2, #96 ;@ 0x60
- beq _0380142C
- b _03801438
-_03801410:
- cmp r2, #112 ;@ 0x70
- beq _0380142C
- b _03801438
-_0380141C:
- mov r4, #6
- b _03801438
-_03801424:
- mov r4, #9
- b _03801438
-_0380142C:
- mov r4, #8
- b _03801438
-_03801434:
- mov r4, #4
-_03801438:
- and r0, r0, #255 ;@ 0xff
- orr r0, r0, #128 ;@ 0x80
- mov r0, r0, lsl #8
- orr r2, r0, #50331648 ;@ 0x3000000
- and r0, r1, #255 ;@ 0xff
- orr r6, r2, r0
- mov r5, #0
-_03801454:
- mov r0, r4
- mov r1, r6
- mov r2, r5
- bl PXI_SendWordByFifo
- cmp r0, #0
- blt _03801454
- ldmia sp!, {r4, r5, r6, lr}
- bx lr
-
- arm_func_start SPI_Unlock
-SPI_Unlock: ;@ 0x03801474
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r1, _038014D8 ;@ =_038099B0
- ldr r2, [r1]
- cmp r2, #0
- beq _038014CC
- ldr r2, [r1, #4]
- cmp r2, #4
- bne _038014CC
- ldr r1, [r1, #1176] ;@ 0x498
- cmp r1, r0
- bne _038014CC
- bl OS_DisableInterrupts
- mov r2, #5
- ldr r1, _038014D8 ;@ =_038099B0
- str r2, [r1, #4]
- mov r2, #0
- str r2, [r1]
- str r2, [r1, #1176] ;@ 0x498
- bl OS_RestoreInterrupts
- ldr r0, _038014DC ;@ =_03809E40
- bl OS_WakeupThread
-_038014CC:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_038014D8: .word _038099B0
-_038014DC: .word _03809E40
-
- arm_func_start SPI_Lock
-SPI_Lock: ;@ 0x038014E0
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r7, r0
- ldr r5, _0380153C ;@ =_03809E40
- ldr r4, _03801540 ;@ =_038099B0
-_038014F4:
- bl OS_DisableInterrupts
- mov r6, r0
- ldr r1, [r4]
- cmp r1, #0
- beq _03801518
- bl OS_RestoreInterrupts
- mov r0, r5
- bl OS_SleepThread
- b _038014F4
-_03801518:
- mov r0, #4
- bl SPIi_GetException
- ldr r0, _03801540 ;@ =_038099B0
- str r7, [r0, #1176] ;@ 0x498
- mov r0, r6
- bl OS_RestoreInterrupts
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_0380153C: .word _03809E40
-_03801540: .word _038099B0
-
- arm_func_start SPI_Init
-SPI_Init: ;@ 0x03801544
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- sub sp, sp, #8
- mov r4, r0
- ldr r0, _03801640 ;@ =_038099AC
- ldrh r1, [r0]
- cmp r1, #0
- bne _03801634
- mov r1, #1
- strh r1, [r0]
- mov r1, #0
- ldr r0, _03801644 ;@ =_038099B0
- str r1, [r0]
- mov r1, #5
- str r1, [r0, #4]
- bl TP_Init
- bl NVRAM_Init
- bl MIC_Init
- bl PM_Init
- bl PXI_Init
- mov r0, #6
- ldr r1, _03801648 ;@ =FUN_03801150
- bl PXI_SetFifoRecvCallback
- mov r0, #9
- ldr r1, _03801648 ;@ =FUN_03801150
- bl PXI_SetFifoRecvCallback
- mov r0, #8
- ldr r1, _03801648 ;@ =FUN_03801150
- bl PXI_SetFifoRecvCallback
- mov r0, #4
- ldr r1, _03801648 ;@ =FUN_03801150
- bl PXI_SetFifoRecvCallback
- ldr r0, _0380164C ;@ =_03809C5C
- ldr r1, _03801650 ;@ =_03809C7C
- mov r2, #16
- bl OS_InitMessageQueue
- mov r8, #0
- ldr r7, _03801654 ;@ =_03809CBC
- mov r6, r8
- mov r5, #24
-_038015E0:
- mla r0, r8, r5, r7
- mov r1, r6
- mov r2, r5
- bl MI_CpuFill8
- add r8, r8, #1
- cmp r8, #16
- blt _038015E0
- mov r2, #0
- ldr r0, _03801644 ;@ =_038099B0
- str r2, [r0, #1164] ;@ 0x48c
- str r2, [r0, #1172] ;@ 0x494
- str r2, [r0, #1168] ;@ 0x490
- mov r0, #512 ;@ 0x200
- str r0, [sp]
- str r4, [sp, #4]
- ldr r0, _03801658 ;@ =_038099B8
- ldr r1, _0380165C ;@ =FUN_038011C0
- ldr r3, _0380164C ;@ =_03809C5C
- bl OS_CreateThread
- ldr r0, _03801658 ;@ =_038099B8
- bl OS_WakeupThreadDirect
-_03801634:
- add sp, sp, #8
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_03801640: .word _038099AC
-_03801644: .word _038099B0
-_03801648: .word FUN_03801150
-_0380164C: .word _03809C5C
-_03801650: .word _03809C7C
-_03801654: .word _03809CBC
-_03801658: .word _038099B8
-_0380165C: .word FUN_038011C0
-
- arm_func_start FUN_03801660
-FUN_03801660: ;@ 0x03801660
- stmfd sp!, {lr}
- sub sp, sp, #4
- cmp r0, #0
- bne _03801680
- mov r0, #3
- mov r1, #2
- bl SPIi_ReturnResult
- b _03801698
-_03801680:
- ldr r1, _038016A4 ;@ =_03809E54
- str r0, [r1, #36] ;@ 0x24
- str r0, [r1, #40] ;@ 0x28
- mov r0, #3
- mov r1, #0
- bl SPIi_ReturnResult
-_03801698:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_038016A4: .word _03809E54
-
- arm_func_start FUN_038016A8
-FUN_038016A8: ;@ 0x038016A8
- stmdb sp!, {r4, lr}
- sub sp, sp, #8
- mov r4, r0
- mov r0, #0
- mov r1, #16
- mov r2, #1
- mov r3, r4
- bl SPIi_SetEntry
- cmp r0, #0
- bne _0380170C
- ldr r0, [sp]
- bic r0, r0, #100663296 ;@ 0x6000000
- orr r0, r0, #100663296 ;@ 0x6000000
- str r0, [sp]
- ldrh r1, [sp]
- ldr r0, _03801718 ;@ =0x027FFFAA
- strh r1, [r0]
- ldrh r1, [sp, #2]
- ldr r0, _0380171C ;@ =0x027FFFAC
- strh r1, [r0]
- mov r0, #16
- and r1, r4, #255 ;@ 0xff
- mov r1, r1, lsl #16
- mov r1, r1, lsr #16
- bl SPIi_ReturnResult
-_0380170C:
- add sp, sp, #8
- ldmia sp!, {r4, lr}
- bx lr
-_03801718: .word 0x027FFFAA
-_0380171C: .word 0x027FFFAC
-
- arm_func_start TP_ExecuteProcess
-TP_ExecuteProcess: ;@ 0x03801720
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
- sub sp, sp, #16
- mov sl, r0
- ldr r1, [sl, #4]
- cmp r1, #2
- bhi _03801754
- cmp r1, #0
- beq _0380176C
- cmp r1, #1
- beq _03801834
- cmp r1, #2
- beq _038018E0
- b _0380192C
-_03801754:
- cmp r1, #16
- bne _0380192C
- ldr r0, _03801938 ;@ =_03809E54
- ldr r0, [r0, #32]
- cmp r0, #2
- bne _0380192C
-_0380176C:
- bl OS_DisableInterrupts
- mov r4, r0
- mov r0, #0
- bl SPIi_CheckException
- cmp r0, #0
- bne _038017A4
- mov r0, r4
- bl OS_RestoreInterrupts
- ldr r0, [sl, #4]
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- mov r1, #4
- bl SPIi_ReturnResult
- b _0380192C
-_038017A4:
- mov r0, #0
- bl SPIi_GetException
- mov r0, r4
- bl OS_RestoreInterrupts
- add r0, sp, #8
- ldr r1, _03801938 ;@ =_03809E54
- ldr r1, [r1, #36] ;@ 0x24
- add r2, sp, #4
- bl TP_ExecSampling
- add r0, sp, #8
- ldrh r1, [sp, #4]
- bl FUN_03801954
- ldrh r1, [sp, #8]
- ldr r0, _0380193C ;@ =0x027FFFAA
- strh r1, [r0]
- ldrh r1, [sp, #10]
- ldr r0, _03801940 ;@ =0x027FFFAC
- strh r1, [r0]
- ldr r0, [sl, #4]
- cmp r0, #0
- bne _0380180C
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- mov r1, #0
- bl SPIi_ReturnResult
- b _03801828
-_0380180C:
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- ldr r1, [sl, #8]
- and r1, r1, #255 ;@ 0xff
- mov r1, r1, lsl #16
- mov r1, r1, lsr #16
- bl SPIi_ReturnResult
-_03801828:
- mov r0, #0
- bl SPIi_ReleaseException
- b _0380192C
-_03801834:
- ldr r7, _03801938 ;@ =_03809E54
- ldr r0, [r7, #32]
- cmp r0, #1
- bne _038018CC
- mov r9, #0
- ldr r8, _03801944 ;@ =0x00000107
- ldr r6, _03801948 ;@ =_03809E80
- mov r5, #10
- ldr r4, _0380194C ;@ =FUN_038016A8
- b _0380189C
-_0380185C:
- mul r0, r9, r8
- bl _u32_div_f
- ldr r1, [sl, #12]
- add r0, r1, r0
- mov r1, r8
- bl _u32_div_f
- add r2, r7, r9, lsl #1
- strh r1, [r2, #204] ;@ 0xcc
- str r9, [sp]
- mov r0, #40 ;@ 0x28
- mla r0, r9, r0, r6
- ldrsh r1, [r2, #204] ;@ 0xcc
- mov r2, r5
- mov r3, r4
- bl OS_SetPeriodicVAlarm
- add r9, r9, #1
-_0380189C:
- ldr r1, [sl, #8]
- cmp r9, r1
- bcc _0380185C
- ldr r0, [sl, #4]
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- mov r1, #0
- bl SPIi_ReturnResult
- mov r1, #2
- ldr r0, _03801938 ;@ =_03809E54
- str r1, [r0, #32]
- b _0380192C
-_038018CC:
- mov r0, r1, lsl #16
- mov r0, r0, lsr #16
- mov r1, #3
- bl SPIi_ReturnResult
- b _0380192C
-_038018E0:
- ldr r0, _03801938 ;@ =_03809E54
- ldr r0, [r0, #32]
- cmp r0, #3
- bne _0380191C
- ldr r0, _03801950 ;@ =0x54505641
- bl OS_CancelVAlarms
- ldr r0, [sl, #4]
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- mov r1, #0
- bl SPIi_ReturnResult
- mov r1, #0
- ldr r0, _03801938 ;@ =_03809E54
- str r1, [r0, #32]
- b _0380192C
-_0380191C:
- mov r0, r1, lsl #16
- mov r0, r0, lsr #16
- mov r1, #3
- bl SPIi_ReturnResult
-_0380192C:
- add sp, sp, #16
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
- bx lr
-_03801938: .word _03809E54
-_0380193C: .word 0x027FFFAA
-_03801940: .word 0x027FFFAC
-_03801944: .word 0x00000107
-_03801948: .word _03809E80
-_0380194C: .word FUN_038016A8
-_03801950: .word 0x54505641
-
- arm_func_start FUN_03801954
-FUN_03801954: ;@ 0x03801954
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r0, [r0]
- mov r2, r0, lsl #7
- movs r2, r2, lsr #31
- bne _03801984
- mov r1, #0
- ldr r0, _03801A3C ;@ =_03809E50
- strb r1, [r0]
- ldr r0, _03801A40 ;@ =_03809E4C
- strb r1, [r0]
- b _03801A30
-_03801984:
- mov r0, r0, lsl #5
- movs r0, r0, lsr #30
- beq _038019D4
- mov r2, #0
- ldr r0, _03801A40 ;@ =_03809E4C
- strb r2, [r0]
- ldr r0, _03801A3C ;@ =_03809E50
- ldrb r1, [r0]
- add r1, r1, #1
- strb r1, [r0]
- ldrb r1, [r0]
- cmp r1, #4
- bcc _03801A30
- strb r2, [r0]
- ldr r0, _03801A44 ;@ =_03809E54
- ldr r1, [r0, #36] ;@ 0x24
- cmp r1, #35 ;@ 0x23
- addlt r1, r1, #1
- strlt r1, [r0, #36] ;@ 0x24
- b _03801A30
-_038019D4:
- mov lr, #0
- ldr r3, _03801A3C ;@ =_03809E50
- strb lr, [r3]
- ldr r2, _03801A44 ;@ =_03809E54
- ldr ip, [r2, #36] ;@ 0x24
- cmp r1, ip, asr #1
- ldrge r0, _03801A40 ;@ =_03809E4C
- strgeb lr, [r0]
- bge _03801A30
- ldr r0, _03801A40 ;@ =_03809E4C
- ldrb r1, [r0]
- add r1, r1, #1
- strb r1, [r0]
- ldrb r1, [r0]
- cmp r1, #4
- bcc _03801A30
- strb lr, [r0]
- ldr r0, [r2, #40] ;@ 0x28
- cmp ip, r0
- subgt r0, ip, #1
- strgt r0, [r2, #36] ;@ 0x24
- movgt r0, #3
- strgtb r0, [r3]
-_03801A30:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_03801A3C: .word _03809E50
-_03801A40: .word _03809E4C
-_03801A44: .word _03809E54
-
- arm_func_start TP_AnalyzeCommand
-TP_AnalyzeCommand: ;@ 0x03801A48
- stmdb sp!, {r4, lr}
- sub sp, sp, #8
- ands r1, r0, #33554432 ;@ 0x2000000
- beq _03801A78
- mov r4, #0
- mov r3, r4
- ldr r1, _03801C00 ;@ =_03809E54
-_03801A64:
- mov r2, r4, lsl #1
- strh r3, [r1, r2]
- add r4, r4, #1
- cmp r4, #16
- blt _03801A64
-_03801A78:
- and r1, r0, #983040 ;@ 0xf0000
- mov r1, r1, lsr #16
- mov r1, r1, lsl #1
- ldr r2, _03801C00 ;@ =_03809E54
- strh r0, [r2, r1]
- ands r0, r0, #16777216 ;@ 0x1000000
- beq _03801BF4
- ldrh r1, [r2]
- and r0, r1, #65280 ;@ 0xff00
- mov r0, r0, lsl #8
- mov r4, r0, lsr #16
- cmp r4, #3
- addls pc, pc, r4, lsl #2
- b _03801BE8
- b _03801AD4
- b _03801AFC
- b _03801B98
- b _03801AC0
-_03801AC0:
- and r0, r1, #255 ;@ 0xff
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- bl FUN_03801660
- b _03801BF4
-_03801AD4:
- mov r0, #0
- mov r1, r4
- mov r2, r0
- bl SPIi_SetEntry
- cmp r0, #0
- bne _03801BF4
- mov r0, r4
- mov r1, #4
- bl SPIi_ReturnResult
- b _03801BF4
-_03801AFC:
- ldr r0, [r2, #32]
- cmp r0, #0
- beq _03801B18
- mov r0, r4
- mov r1, #3
- bl SPIi_ReturnResult
- b _03801BF4
-_03801B18:
- and r0, r1, #255 ;@ 0xff
- mov r0, r0, lsl #16
- movs r3, r0, lsr #16
- beq _03801B30
- cmp r3, #4
- bls _03801B40
-_03801B30:
- mov r0, r4
- mov r1, #2
- bl SPIi_ReturnResult
- b _03801BF4
-_03801B40:
- ldrh r1, [r2, #2]
- ldr r0, _03801C04 ;@ =0x00000107
- cmp r1, r0
- bcc _03801B60
- mov r0, r4
- mov r1, #2
- bl SPIi_ReturnResult
- b _03801BF4
-_03801B60:
- str r1, [sp]
- mov r0, #0
- mov r1, r4
- mov r2, #2
- bl SPIi_SetEntry
- cmp r0, #0
- movne r1, #1
- ldrne r0, _03801C00 ;@ =_03809E54
- strne r1, [r0, #32]
- bne _03801BF4
- mov r0, r4
- mov r1, #4
- bl SPIi_ReturnResult
- b _03801BF4
-_03801B98:
- ldr r0, [r2, #32]
- cmp r0, #2
- beq _03801BB4
- mov r0, r4
- mov r1, #3
- bl SPIi_ReturnResult
- b _03801BF4
-_03801BB4:
- mov r0, #0
- mov r1, r4
- mov r2, r0
- bl SPIi_SetEntry
- cmp r0, #0
- movne r1, #3
- ldrne r0, _03801C00 ;@ =_03809E54
- strne r1, [r0, #32]
- bne _03801BF4
- mov r0, r4
- mov r1, #4
- bl SPIi_ReturnResult
- b _03801BF4
-_03801BE8:
- mov r0, r4
- mov r1, #1
- bl SPIi_ReturnResult
-_03801BF4:
- add sp, sp, #8
- ldmia sp!, {r4, lr}
- bx lr
-_03801C00: .word _03809E54
-_03801C04: .word 0x00000107
-
- arm_func_start TP_Init
-TP_Init: ;@ 0x03801C08
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- mov r3, #0
- ldr r0, _03801CFC ;@ =_03809E54
- str r3, [r0, #32]
- mov r1, #20
- str r1, [r0, #36] ;@ 0x24
- str r1, [r0, #40] ;@ 0x28
- mov r2, r3
-_03801C28:
- mov r1, r3, lsl #1
- strh r2, [r0, r1]
- add r3, r3, #1
- cmp r3, #16
- blt _03801C28
- bl OS_IsVAlarmAvailable
- cmp r0, #0
- bne _03801C4C
- bl OS_InitVAlarm
-_03801C4C:
- mov r7, #0
- ldr r6, _03801D00 ;@ =_03809E80
- ldr r5, _03801D04 ;@ =0x54505641
- mov r4, #40 ;@ 0x28
-_03801C5C:
- mla r8, r7, r4, r6
- mov r0, r8
- bl OS_CreateVAlarm
- mov r0, r8
- mov r1, r5
- bl OS_SetVAlarmTag
- add r7, r7, #1
- cmp r7, #4
- blt _03801C5C
- ldr r1, _03801D08 ;@ =0x040001C0
-_03801C84:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03801C84
- ldr r0, _03801D0C ;@ =0x00008A01
- strh r0, [r1]
- mov r1, #132 ;@ 0x84
- ldr r0, _03801D10 ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _03801D08 ;@ =0x040001C0
-_03801CA8:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03801CA8
- mov r1, #0
- ldr r0, _03801D10 ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _03801D08 ;@ =0x040001C0
-_03801CC4:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03801CC4
- ldr r0, _03801D14 ;@ =0x00008201
- strh r0, [r1]
- mov r1, #0
- ldr r0, _03801D10 ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _03801D08 ;@ =0x040001C0
-_03801CE8:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03801CE8
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_03801CFC: .word _03809E54
-_03801D00: .word _03809E80
-_03801D04: .word 0x54505641
-_03801D08: .word 0x040001C0
-_03801D0C: .word 0x00008A01
-_03801D10: .word 0x040001C2
-_03801D14: .word 0x00008201
-
- arm_func_start TP_ExecSampling
-TP_ExecSampling: ;@ 0x03801D18
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #12
- mov r7, r0
- movs r6, r1
- mov r5, r2
- mov r0, #0
- strh r0, [r5]
- rsbmi r6, r6, #0
- bl FUN_03802160
- movs r4, r0
- bne _03801D94
- ldr r1, [r7]
- mov r0, #4096 ;@ 0x1000
- rsb r0, r0, #0
- and r0, r1, r0
- str r0, [r7]
- ldr r1, [r7]
- ldr r0, _03801F4C ;@ =0xFF000FFF
- and r0, r1, r0
- str r0, [r7]
- ldr r0, [r7]
- bic r0, r0, #16777216 ;@ 0x1000000
- str r0, [r7]
- ldr r0, [r7]
- bic r0, r0, #100663296 ;@ 0x6000000
- orr r0, r0, #100663296 ;@ 0x6000000
- str r0, [r7]
- mov r1, #0
- ldr r0, _03801F50 ;@ =_03809F28
- strh r1, [r0]
- b _03801F40
-_03801D94:
- add r0, sp, #0
- mov r1, r6
- mov r2, #0
- add r3, sp, #2
- bl FUN_03801F68
- ldr r1, [r7]
- bic r1, r1, #100663296 ;@ 0x6000000
- and r0, r0, #3
- orr r0, r1, r0, lsl #25
- str r0, [r7]
- ldr r1, [r7]
- mov r0, #4096 ;@ 0x1000
- rsb r0, r0, #0
- and r2, r1, r0
- ldrh r1, [sp]
- ldr r0, _03801F54 ;@ =0x00000FFF
- and r0, r1, r0
- orr r0, r2, r0
- str r0, [r7]
- add r0, sp, #0
- mov r1, r6
- mov r2, #1
- add r3, sp, #4
- bl FUN_03801F68
- cmp r0, #2
- bne _03801E1C
- ldr r0, [r7]
- bic r1, r0, #100663296 ;@ 0x6000000
- mov r0, r0, lsl #5
- mov r0, r0, lsr #30
- orr r0, r0, #2
- and r0, r0, #3
- orr r0, r1, r0, lsl #25
- str r0, [r7]
-_03801E1C:
- ldr r1, [r7]
- ldr r0, _03801F4C ;@ =0xFF000FFF
- and r2, r1, r0
- ldrh r1, [sp]
- ldr r0, _03801F54 ;@ =0x00000FFF
- and r0, r1, r0
- orr r0, r2, r0, lsl #12
- str r0, [r7]
- ldr r0, _03801F58 ;@ =0x00008A01
- ldr r3, _03801F5C ;@ =0x040001C0
- strh r0, [r3]
- mov r6, #0
- mov r2, r6
- ldr r1, _03801F60 ;@ =0x040001C2
-_03801E54:
- strh r2, [r1]
-_03801E58:
- ldrh r0, [r3]
- ands r0, r0, #128 ;@ 0x80
- bne _03801E58
- add r6, r6, #1
- cmp r6, #12
- blt _03801E54
- ldr r0, _03801F64 ;@ =0x00008201
- strh r0, [r3]
- mov r1, #0
- ldr r0, _03801F60 ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _03801F5C ;@ =0x040001C0
-_03801E88:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03801E88
- cmp r4, #2
- ldreq r0, [r7]
- biceq r0, r0, #100663296 ;@ 0x6000000
- orreq r0, r0, #100663296 ;@ 0x6000000
- streq r0, [r7]
- bl FUN_03802160
- cmp r0, #0
- beq _03801F20
- cmp r0, #1
- beq _03801EF0
- cmp r0, #2
- bne _03801F3C
- ldr r0, [r7]
- orr r0, r0, #16777216 ;@ 0x1000000
- str r0, [r7]
- ldr r0, [r7]
- bic r0, r0, #100663296 ;@ 0x6000000
- orr r0, r0, #100663296 ;@ 0x6000000
- str r0, [r7]
- mov r1, #0
- ldr r0, _03801F50 ;@ =_03809F28
- strh r1, [r0]
- b _03801F40
-_03801EF0:
- ldr r0, [r7]
- orr r0, r0, #16777216 ;@ 0x1000000
- str r0, [r7]
- mov r1, #1
- ldr r0, _03801F50 ;@ =_03809F28
- strh r1, [r0]
- ldrh r0, [sp, #4]
- ldrh r1, [sp, #2]
- cmp r1, r0
- movcc r1, r0
- strh r1, [r5]
- b _03801F40
-_03801F20:
- ldr r0, [r7]
- bic r0, r0, #16777216 ;@ 0x1000000
- str r0, [r7]
- mov r1, #0
- ldr r0, _03801F50 ;@ =_03809F28
- strh r1, [r0]
- b _03801F40
-_03801F3C:
- bl OS_Terminate
-_03801F40:
- add sp, sp, #12
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_03801F4C: .word 0xFF000FFF
-_03801F50: .word _03809F28
-_03801F54: .word 0x00000FFF
-_03801F58: .word 0x00008A01
-_03801F5C: .word 0x040001C0
-_03801F60: .word 0x040001C2
-_03801F64: .word 0x00008201
-
- arm_func_start FUN_03801F68
-FUN_03801F68: ;@ 0x03801F68
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
- sub sp, sp, #24
- cmp r2, #0
- moveq r5, #209 ;@ 0xd1
- moveq r6, #1
- movne r5, #145 ;@ 0x91
- movne r6, #2
-_03801F84:
- ldr r4, _0380214C ;@ =0x040001C0
- ldrh r2, [r4]
- ands r2, r2, #128 ;@ 0x80
- bne _03801F84
- ldr r2, _03802150 ;@ =0x00008A01
- strh r2, [r4]
- and r5, r5, #255 ;@ 0xff
- ldr r2, _03802154 ;@ =0x040001C2
- strh r5, [r2]
-_03801FA8:
- ldrh r2, [r4]
- ands r2, r2, #128 ;@ 0x80
- bne _03801FA8
- mov r7, #0
- ldr ip, _0380214C ;@ =0x040001C0
- ldr lr, _03802154 ;@ =0x040001C2
- add r2, sp, #0
- mov r4, r7
- ldr r9, _03802158 ;@ =0x00007FF8
-_03801FCC:
- strh r4, [lr]
-_03801FD0:
- ldrh r8, [ip]
- ands r8, r8, #128 ;@ 0x80
- bne _03801FD0
- ldrh r8, [lr]
- and r8, r8, #255 ;@ 0xff
- mov r8, r8, lsl #16
- mov r8, r8, lsr #8
- str r8, [r2, r7, lsl #2]
- strh r5, [lr]
-_03801FF4:
- ldrh r8, [ip]
- ands r8, r8, #128 ;@ 0x80
- bne _03801FF4
- ldrh r8, [lr]
- and r8, r8, #255 ;@ 0xff
- mov r8, r8, lsl #16
- ldr sl, [r2, r7, lsl #2]
- orr r8, sl, r8, lsr #16
- str r8, [r2, r7, lsl #2]
- ldr r8, [r2, r7, lsl #2]
- and r8, r8, r9
- mov r8, r8, asr #3
- str r8, [r2, r7, lsl #2]
- add r7, r7, #1
- cmp r7, #5
- blt _03801FCC
- ldr r2, _0380215C ;@ =0x00008201
- strh r2, [ip]
- mov r2, #0
- strh r2, [lr]
- ldr r4, _0380214C ;@ =0x040001C0
-_03802048:
- ldrh r2, [r4]
- ands r2, r2, #128 ;@ 0x80
- bne _03802048
- mov r8, #0
- mov r7, r8
- add r5, sp, #0
-_03802060:
- add r9, r7, #1
- ldr r4, [r5, r7, lsl #2]
- b _03802084
-_0380206C:
- ldr r2, [r5, r9, lsl #2]
- subs r2, r4, r2
- rsbmi r2, r2, #0
- cmp r2, r8
- movgt r8, r2
- add r9, r9, #1
-_03802084:
- cmp r9, #5
- blt _0380206C
- add r7, r7, #1
- cmp r7, #4
- blt _03802060
- strh r8, [r3]
- mov r4, #0
- add r2, sp, #0
- b _0380211C
-_038020A8:
- add r3, r4, #1
- ldr r7, [r2, r4, lsl #2]
- b _03802110
-_038020B4:
- ldr r8, [r2, r3, lsl #2]
- subs r5, r7, r8
- rsbmi r5, r5, #0
- cmp r5, r1
- bgt _0380210C
- add r9, r3, #1
- b _03802104
-_038020D0:
- ldr r5, [r2, r9, lsl #2]
- subs sl, r7, r5
- rsbmi sl, sl, #0
- cmp sl, r1
- bgt _03802100
- add r1, r8, r7, lsl #1
- add r1, r5, r1
- mov r1, r1, asr #2
- bic r1, r1, #7
- strh r1, [r0]
- mov r0, #0
- b _03802140
-_03802100:
- add r9, r9, #1
-_03802104:
- cmp r9, #5
- blt _038020D0
-_0380210C:
- add r3, r3, #1
-_03802110:
- cmp r3, #4
- blt _038020B4
- add r4, r4, #1
-_0380211C:
- cmp r4, #3
- blt _038020A8
- ldr r2, [sp]
- ldr r1, [sp, #16]
- add r1, r2, r1
- mov r1, r1, asr #1
- bic r1, r1, #7
- strh r1, [r0]
- mov r0, r6
-_03802140:
- add sp, sp, #24
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
- bx lr
-_0380214C: .word 0x040001C0
-_03802150: .word 0x00008A01
-_03802154: .word 0x040001C2
-_03802158: .word 0x00007FF8
-_0380215C: .word 0x00008201
-
- arm_func_start FUN_03802160
-FUN_03802160: ;@ 0x03802160
- stmfd sp!, {lr}
- sub sp, sp, #4
- mov r0, #32768 ;@ 0x8000
- bl EXIi_SelectRcnt
- ldr r1, _038022A4 ;@ =0x040001C0
-_03802174:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03802174
- ldr r0, _038022A8 ;@ =0x00008A01
- strh r0, [r1]
- mov r1, #132 ;@ 0x84
- ldr r0, _038022AC ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _038022A4 ;@ =0x040001C0
-_03802198:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03802198
- mov r1, #0
- ldr r0, _038022AC ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _038022A4 ;@ =0x040001C0
-_038021B4:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _038021B4
- ldr r0, _038022B0 ;@ =0x00008201
- strh r0, [r1]
- mov r1, #0
- ldr r0, _038022AC ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _038022A4 ;@ =0x040001C0
-_038021D8:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _038021D8
- ldr r0, _038022B4 ;@ =_03809F28
- ldrh r0, [r0]
- cmp r0, #0
- bne _0380220C
- ldr r0, _038022B8 ;@ =0x04000136
- ldrh r0, [r0]
- ands r0, r0, #64 ;@ 0x40
- moveq r0, #1
- movne r0, #0
- b _03802298
-_0380220C:
- ldr r0, _038022B8 ;@ =0x04000136
- ldrh r0, [r0]
- ands r0, r0, #64 ;@ 0x40
- moveq r0, #1
- beq _03802298
- ldr r0, _038022A8 ;@ =0x00008A01
- strh r0, [r1]
- mov r1, #132 ;@ 0x84
- ldr r0, _038022AC ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _038022A4 ;@ =0x040001C0
-_03802238:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03802238
- mov r1, #0
- ldr r0, _038022AC ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _038022A4 ;@ =0x040001C0
-_03802254:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03802254
- ldr r0, _038022B0 ;@ =0x00008201
- strh r0, [r1]
- mov r1, #0
- ldr r0, _038022AC ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _038022A4 ;@ =0x040001C0
-_03802278:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03802278
- ldr r0, _038022B8 ;@ =0x04000136
- ldrh r0, [r0]
- ands r0, r0, #64 ;@ 0x40
- movne r0, #0
- moveq r0, #2
-_03802298:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_038022A4: .word 0x040001C0
-_038022A8: .word 0x00008A01
-_038022AC: .word 0x040001C2
-_038022B0: .word 0x00008201
-_038022B4: .word _03809F28
-_038022B8: .word 0x04000136
-
- arm_func_start PM_ExecuteProcess
-PM_ExecuteProcess: ;@ 0x038022BC
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r4, r0
- bl OS_DisableInterrupts
- mov r5, r0
- mov r0, #3
- bl SPIi_CheckException
- cmp r0, #0
- bne _03802300
- mov r0, r5
- bl OS_RestoreInterrupts
- ldr r0, [r4, #4]
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- mov r1, #4
- bl SPIi_ReturnResult
- b _0380242C
-_03802300:
- mov r0, #3
- bl SPIi_GetException
- mov r0, r5
- bl OS_RestoreInterrupts
- ldr r1, [r4, #4]
- sub r0, r1, #97 ;@ 0x61
- cmp r0, #5
- addls pc, pc, r0, lsl #2
- b _03802414
- b _0380233C
- b _03802414
- b _038023E0
- b _03802368
- b _038023A4
- b _03802408
-_0380233C:
- mov r1, #1
- ldr r0, _03802438 ;@ =PMi_Work
- str r1, [r0, #32]
- ldr r1, [r4, #8]
- ldr r0, _0380243C ;@ =PMi_TriggerBL
- strh r1, [r0]
- ldr r1, [r4, #12]
- ldr r0, _03802440 ;@ =PMi_KeyPattern
- strh r1, [r0]
- bl PMi_DoSleep
- b _03802424
-_03802368:
- mov r1, #4
- ldr r0, _03802438 ;@ =PMi_Work
- str r1, [r0, #32]
- ldr r2, [r4, #8]
- str r2, [r0, #40] ;@ 0x28
- ldr r1, [r4, #12]
- str r1, [r0, #36] ;@ 0x24
- mov r0, r2, lsl #16
- mov r0, r0, lsr #16
- and r1, r1, #255 ;@ 0xff
- bl PMi_SetRegister
- mov r0, #100 ;@ 0x64
- mov r1, #0
- bl SPIi_ReturnResult
- b _03802424
-_038023A4:
- mov r1, #3
- ldr r0, _03802438 ;@ =PMi_Work
- str r1, [r0, #32]
- ldr r1, [r4, #8]
- str r1, [r0, #40] ;@ 0x28
- mov r0, r1, lsl #16
- mov r4, r0, lsr #16
- mov r0, r4
- bl PMi_GetRegister
- mov r1, r0
- add r0, r4, #112 ;@ 0x70
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- bl SPIi_ReturnResult
- b _03802424
-_038023E0:
- mov r0, #2
- ldr r1, _03802438 ;@ =PMi_Work
- str r0, [r1, #32]
- ldr r0, [r4, #8]
- str r0, [r1, #36] ;@ 0x24
- bl PMi_SwitchUtilityProc
- mov r0, #99 ;@ 0x63
- mov r1, #0
- bl SPIi_ReturnResult
- b _03802424
-_03802408:
- ldr r0, [r4, #8]
- bl PMi_SetLED
- b _03802424
-_03802414:
- mov r0, r1, lsl #16
- mov r0, r0, lsr #16
- mov r1, #1
- bl SPIi_ReturnResult
-_03802424:
- mov r0, #3
- bl SPIi_ReleaseException
-_0380242C:
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_03802438: .word PMi_Work
-_0380243C: .word PMi_TriggerBL
-_03802440: .word PMi_KeyPattern
-
- arm_func_start PM_AnalyzeCommand
-PM_AnalyzeCommand: ;@ 0x03802444
- stmdb sp!, {r4, lr}
- sub sp, sp, #8
- ands r1, r0, #33554432 ;@ 0x2000000
- beq _03802474
- mov r4, #0
- mov r3, r4
- ldr r1, _03802610 ;@ =PMi_Work
-_03802460:
- mov r2, r4, lsl #1
- strh r3, [r1, r2]
- add r4, r4, #1
- cmp r4, #16
- blt _03802460
-_03802474:
- and r1, r0, #983040 ;@ 0xf0000
- mov r1, r1, lsr #16
- mov r1, r1, lsl #1
- ldr ip, _03802610 ;@ =PMi_Work
- strh r0, [ip, r1]
- ands r0, r0, #16777216 ;@ 0x1000000
- beq _03802604
- ldrh r3, [ip]
- and r0, r3, #65280 ;@ 0xff00
- mov r0, r0, lsl #8
- mov r4, r0, lsr #16
- sub r0, r4, #96 ;@ 0x60
- cmp r0, #7
- addls pc, pc, r0, lsl #2
- b _038025F8
- b _038024D0
- b _038024E0
- b _038025F8
- b _03802588
- b _0380251C
- b _03802558
- b _038025C4
- b _038025DC
-_038024D0:
- mov r0, #96 ;@ 0x60
- mov r1, #0
- bl SPIi_ReturnResult
- b _03802604
-_038024E0:
- ldrh r1, [ip, #2]
- ldr r0, _03802614 ;@ =0x0000FFFF
- and r0, r1, r0
- str r0, [sp]
- mov r0, #3
- mov r1, r4
- mov r2, #2
- and r3, r3, #255 ;@ 0xff
- bl SPIi_SetEntry
- cmp r0, #0
- bne _03802604
- mov r0, r4
- mov r1, #4
- bl SPIi_ReturnResult
- b _03802604
-_0380251C:
- ldrh r1, [ip, #2]
- ldr r0, _03802614 ;@ =0x0000FFFF
- and r0, r1, r0
- str r0, [sp]
- mov r0, #3
- mov r1, r4
- mov r2, #2
- and r3, r3, #255 ;@ 0xff
- bl SPIi_SetEntry
- cmp r0, #0
- bne _03802604
- mov r0, r4
- mov r1, #4
- bl SPIi_ReturnResult
- b _03802604
-_03802558:
- mov r0, #3
- mov r1, r4
- mov r2, #1
- ldr ip, _03802614 ;@ =0x0000FFFF
- and r3, r3, ip
- bl SPIi_SetEntry
- cmp r0, #0
- bne _03802604
- mov r0, r4
- mov r1, #4
- bl SPIi_ReturnResult
- b _03802604
-_03802588:
- mov r0, #3
- mov r1, r4
- mov r2, #1
- and lr, r3, #255 ;@ 0xff
- ldrh ip, [ip, #2]
- ldr r3, _03802614 ;@ =0x0000FFFF
- and r3, ip, r3
- orr r3, r3, lr, lsl #16
- bl SPIi_SetEntry
- cmp r0, #0
- bne _03802604
- mov r0, r4
- mov r1, #4
- bl SPIi_ReturnResult
- b _03802604
-_038025C4:
- and r0, r3, #255 ;@ 0xff
- bl PM_SetLEDPattern
- mov r0, #102 ;@ 0x66
- mov r1, #0
- bl SPIi_ReturnResult
- b _03802604
-_038025DC:
- bl PM_GetLEDPattern
- mov r1, r0
- mov r0, #103 ;@ 0x67
- mov r1, r1, lsl #16
- mov r1, r1, lsr #16
- bl SPIi_ReturnResult
- b _03802604
-_038025F8:
- mov r0, r4
- mov r1, #1
- bl SPIi_ReturnResult
-_03802604:
- add sp, sp, #8
- ldmia sp!, {r4, lr}
- bx lr
-_03802610: .word PMi_Work
-_03802614: .word 0x0000FFFF
-
- arm_func_start PM_Init
-PM_Init: ;@ 0x03802618
- mov r1, #1
- ldr r0, _0380264C ;@ =PMi_Initialized
- str r1, [r0]
- mov r3, #0
- ldr r0, _03802650 ;@ =PMi_Work
- str r3, [r0, #32]
- mov r2, r3
-_03802634:
- mov r1, r3, lsl #1
- strh r2, [r0, r1]
- add r3, r3, #1
- cmp r3, #16
- blt _03802634
- bx lr
-_0380264C: .word PMi_Initialized
-_03802650: .word PMi_Work
-
- arm_func_start PMi_SendPxiCommand
-PMi_SendPxiCommand: ;@ 0x03802654
- ldr r3, _03802678 ;@ =0x0000FFFF
- and r3, r2, r3
- and r0, r0, #62914560 ;@ 0x3c00000
- mov r2, r0, lsl #22
- and r0, r1, #4128768 ;@ 0x3f0000
- orr r0, r2, r0, lsl #16
- orr r0, r3, r0
- ldr ip, _0380267C ;@ =PMi_SendPxiData
- bx ip
-_03802678: .word 0x0000FFFF
-_0380267C: .word PMi_SendPxiData
-
- arm_func_start PMi_SendPxiData
-PMi_SendPxiData: ;@ 0x03802680
- stmdb sp!, {r4, r5, r6, lr}
- mov r6, r0
- mov r5, #8
- mov r4, #0
-_03802690:
- mov r0, r5
- mov r1, r6
- mov r2, r4
- bl PXI_SendWordByFifo
- cmp r0, #0
- bne _03802690
- ldmia sp!, {r4, r5, r6, lr}
- bx lr
-
- arm_func_start PMi_ResetControl
-PMi_ResetControl: ;@ 0x038026B0
- stmdb sp!, {r4, lr}
- mov r4, r0
- mov r0, #0
- bl PMi_GetRegister
- mvn r1, r4
- and r0, r0, r1
- and r1, r0, #255 ;@ 0xff
- mov r0, #0
- bl PMi_SetRegister
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start PMi_SetControl
-PMi_SetControl: ;@ 0x038026DC
- stmdb sp!, {r4, lr}
- mov r4, r0
- mov r0, #0
- bl PMi_GetRegister
- orr r1, r0, r4
- mov r0, #0
- bl PMi_SetRegister
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start PMi_GetRegister
-PMi_GetRegister: ;@ 0x03802700
- stmdb sp!, {r4, lr}
- mov r4, r0
- ldr r1, _0380278C ;@ =0x040001C0
-_0380270C:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _0380270C
- bl FUN_03802808
- mov r0, #1
- bl FUN_03802820
- orr r0, r4, #128 ;@ 0x80
- and r0, r0, #255 ;@ 0xff
- and r1, r0, #255 ;@ 0xff
- ldr r0, _03802790 ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _0380278C ;@ =0x040001C0
-_0380273C:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _0380273C
- mov r0, #0
- bl FUN_03802820
- mov r1, #0
- ldr r0, _03802790 ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _0380278C ;@ =0x040001C0
-_03802760:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03802760
- ldr r0, _03802790 ;@ =0x040001C2
- ldrh r0, [r0]
- and r0, r0, #255 ;@ 0xff
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- and r0, r0, #255 ;@ 0xff
- ldmia sp!, {r4, lr}
- bx lr
-_0380278C: .word 0x040001C0
-_03802790: .word 0x040001C2
-
- arm_func_start PMi_SetRegister
-PMi_SetRegister: ;@ 0x03802794
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- mov r4, r1
- ldr r1, _03802800 ;@ =0x040001C0
-_038027A8:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _038027A8
- bl FUN_03802808
- mov r0, #1
- bl FUN_03802820
- and r0, r5, #255 ;@ 0xff
- and r1, r0, #255 ;@ 0xff
- ldr r0, _03802804 ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _03802800 ;@ =0x040001C0
-_038027D4:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _038027D4
- mov r0, #0
- bl FUN_03802820
- and r1, r4, #255 ;@ 0xff
- ldr r0, _03802804 ;@ =0x040001C2
- strh r1, [r0]
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_03802800: .word 0x040001C0
-_03802804: .word 0x040001C2
-
- arm_func_start FUN_03802808
-FUN_03802808: ;@ 0x03802808
- ldr r1, _03802818 ;@ =0x00008202
- ldr r0, _0380281C ;@ =0x040001C0
- strh r1, [r0]
- bx lr
-_03802818: .word 0x00008202
-_0380281C: .word 0x040001C0
-
- arm_func_start FUN_03802820
-FUN_03802820: ;@ 0x03802820
- ldr r1, _03802834 ;@ =0x00008002
- orr r1, r1, r0, lsl #11
- ldr r0, _03802838 ;@ =0x040001C0
- strh r1, [r0]
- bx lr
-_03802834: .word 0x00008002
-_03802838: .word 0x040001C0
-
- arm_func_start PMi_SetLED
-PMi_SetLED: ;@ 0x0380283C
- stmdb sp!, {r4, lr}
- mov r4, r0
- cmp r4, #1
- beq _03802860
- cmp r4, #2
- beq _03802878
- cmp r4, #3
- beq _0380286C
- b _0380288C
-_03802860:
- mov r0, #16
- bl PMi_ResetControl
- b _03802890
-_0380286C:
- mov r0, #48 ;@ 0x30
- bl PMi_SetControl
- b _03802890
-_03802878:
- mov r0, #32
- bl PMi_ResetControl
- mov r0, #16
- bl PMi_SetControl
- b _03802890
-_0380288C:
- bl OS_Terminate
-_03802890:
- ldr r0, _038028A0 ;@ =PMi_LEDStatus
- str r4, [r0]
- ldmia sp!, {r4, lr}
- bx lr
-_038028A0: .word PMi_LEDStatus
-
- arm_func_start PMi_SwitchUtilityProc
-PMi_SwitchUtilityProc: ;@ 0x038028A4
- stmfd sp!, {lr}
- sub sp, sp, #4
- cmp r0, #15
- addls pc, pc, r0, lsl #2
- b _038029C4
- b _038029C4
- b _038028F8
- b _0380290C
- b _03802920
- b _03802934
- b _03802940
- b _0380294C
- b _03802958
- b _03802964
- b _03802970
- b _0380297C
- b _03802988
- b _03802994
- b _038029A0
- b _038029B8
- b _038029AC
-_038028F8:
- mov r0, #1
- bl PM_SetLEDPattern
- mov r0, #1
- bl PMi_SetLED
- b _038029C4
-_0380290C:
- mov r0, #3
- bl PM_SetLEDPattern
- mov r0, #3
- bl PMi_SetLED
- b _038029C4
-_03802920:
- mov r0, #2
- bl PM_SetLEDPattern
- mov r0, #2
- bl PMi_SetLED
- b _038029C4
-_03802934:
- mov r0, #4
- bl PMi_SetControl
- b _038029C4
-_03802940:
- mov r0, #4
- bl PMi_ResetControl
- b _038029C4
-_0380294C:
- mov r0, #8
- bl PMi_SetControl
- b _038029C4
-_03802958:
- mov r0, #8
- bl PMi_ResetControl
- b _038029C4
-_03802964:
- mov r0, #12
- bl PMi_SetControl
- b _038029C4
-_03802970:
- mov r0, #12
- bl PMi_ResetControl
- b _038029C4
-_0380297C:
- mov r0, #1
- bl PMi_SetControl
- b _038029C4
-_03802988:
- mov r0, #1
- bl PMi_ResetControl
- b _038029C4
-_03802994:
- mov r0, #2
- bl PMi_ResetControl
- b _038029C4
-_038029A0:
- mov r0, #2
- bl PMi_SetControl
- b _038029C4
-_038029AC:
- mov r0, #64 ;@ 0x40
- bl PMi_ResetControl
- b _038029C4
-_038029B8:
- bl SND_BeginSleep
- mov r0, #64 ;@ 0x40
- bl PMi_SetControl
-_038029C4:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start PMi_DoSleep
-PMi_DoSleep: ;@ 0x038029D0
- stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
- sub sp, sp, #4
- mov r5, #0
- ldr r0, _03802B94 ;@ =0x04000208
- ldrh r4, [r0]
- strh r5, [r0]
- bl OS_DisableInterrupts
- mov r9, r0
- mvn r0, #-33554432 ;@ 0xfe000000
- bl OS_DisableIrqMask
- mov r8, r0
- mov r0, r5
- bl PMi_GetRegister
- mov r7, r0
- mov r0, #2
- bl PM_SetLEDPattern
- mov r0, #2
- bl PMi_SetLED
- mov r0, #2
- bl PMi_SetLED
- bl SND_BeginSleep
- mov r0, #1
- bl PMi_ResetControl
- ldr r0, _03802B98 ;@ =PMi_TriggerBL
- ldrh r0, [r0]
- ands r0, r0, #1
- beq _03802A58
- ldr r0, _03802B9C ;@ =PMi_KeyPattern
- ldrh r0, [r0]
- orr r1, r0, #16384 ;@ 0x4000
- ldr r0, _03802BA0 ;@ =0x04000132
- strh r1, [r0]
- mov r0, #4096 ;@ 0x1000
- bl OS_EnableIrqMask
-_03802A58:
- ldr r0, _03802B98 ;@ =PMi_TriggerBL
- ldrh r0, [r0]
- ands r0, r0, #4
- beq _03802A70
- mov r0, #4194304 ;@ 0x400000
- bl OS_EnableIrqMask
-_03802A70:
- ldr r0, _03802B98 ;@ =PMi_TriggerBL
- ldrh r0, [r0]
- ands r0, r0, #2
- beq _03802AB4
- ldr r0, _03802BA4 ;@ =0x04000134
- ldrh r6, [r0]
- mov r5, #1
- mov r0, #32768 ;@ 0x8000
- bl EXIi_SelectRcnt
- mov r0, #64 ;@ 0x40
- mov r1, #0
- bl EXIi_SetBitRcnt0L
- mov r0, #256 ;@ 0x100
- mov r1, r0
- bl EXIi_SetBitRcnt0L
- mov r0, #128 ;@ 0x80
- bl OS_EnableIrqMask
-_03802AB4:
- ldr r0, _03802B98 ;@ =PMi_TriggerBL
- ldrh r0, [r0]
- ands r0, r0, #8
- beq _03802ACC
- mov r0, #1048576 ;@ 0x100000
- bl OS_EnableIrqMask
-_03802ACC:
- ldr r0, _03802B98 ;@ =PMi_TriggerBL
- ldrh r0, [r0]
- ands r0, r0, #16
- beq _03802AE4
- mov r0, #8192 ;@ 0x2000
- bl OS_EnableIrqMask
-_03802AE4:
- mov r0, r9
- bl OS_RestoreInterrupts
- ldr r1, _03802B94 ;@ =0x04000208
- ldrh r0, [r1]
- mov r0, #1
- strh r0, [r1]
- bl FUN_03802BAC
- mov r0, #0
- mov r1, r7
- bl PMi_SetRegister
- ldr r0, _03802B98 ;@ =PMi_TriggerBL
- ldrh r1, [r0]
- ands r0, r1, #32
- movne r0, #6
- moveq r0, #7
- ands r1, r1, #64 ;@ 0x40
- movne r7, #4
- moveq r7, #5
- bl PMi_SwitchUtilityProc
- mov r0, r7
- bl PMi_SwitchUtilityProc
- cmp r5, #0
- ldrne r0, _03802BA4 ;@ =0x04000134
- strneh r6, [r0]
- mov r0, #1
- bl PMi_SetControl
- bl SND_EndSleep
- mov r1, #0
- ldr r0, _03802BA8 ;@ =PMi_Work
- str r1, [r0, #32]
- mov r0, #98 ;@ 0x62
- mov r2, r1
- bl PMi_SendPxiCommand
- bl OS_DisableInterrupts
- mov r0, r8
- bl OS_SetIrqMask
- mov r0, r9
- bl OS_RestoreInterrupts
- ldr r1, _03802B94 ;@ =0x04000208
- ldrh r0, [r1]
- strh r4, [r1]
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
- bx lr
-_03802B94: .word 0x04000208
-_03802B98: .word PMi_TriggerBL
-_03802B9C: .word PMi_KeyPattern
-_03802BA0: .word 0x04000132
-_03802BA4: .word 0x04000134
-_03802BA8: .word PMi_Work
-
- arm_func_start FUN_03802BAC
-FUN_03802BAC: ;@ 0x03802BAC
- ldr ip, _03802BB4 ;@ =SVC_Stop
- bx ip
-_03802BB4: .word SVC_Stop
-
- arm_func_start PM_GetLEDPattern
-PM_GetLEDPattern: ;@ 0x03802BB8
- ldr r0, _03802BC4 ;@ =PMi_BlinkPatternNo
- ldr r0, [r0]
- bx lr
-_03802BC4: .word PMi_BlinkPatternNo
-
- arm_func_start PM_SetLEDPattern
-PM_SetLEDPattern: ;@ 0x03802BC8
- cmp r0, #15
- ldrle r1, _03802BE4 ;@ =PMi_BlinkPatternNo
- strle r0, [r1]
- movle r1, #0
- ldrle r0, _03802BE8 ;@ =_03809F64
- strle r1, [r0]
- bx lr
-_03802BE4: .word PMi_BlinkPatternNo
-_03802BE8: .word _03809F64
-
- arm_func_start PM_SelfBlinkProc
-PM_SelfBlinkProc: ;@ 0x03802BEC
- stmdb sp!, {r4, r5, r6, lr}
- ldr r0, _03802D04 ;@ =PMi_BlinkPatternNo
- ldr r3, [r0]
- cmp r3, #0
- bne _03802C28
- mov r0, #3
- mov r1, #102 ;@ 0x66
- mov r2, #1
- mov r3, r2
- bl SPIi_SetEntry
- cmp r0, #0
- beq _03802CFC
- mov r0, #1
- bl PM_SetLEDPattern
- b _03802CFC
-_03802C28:
- cmp r3, #4
- bge _03802C54
- ldr r0, _03802D08 ;@ =PMi_LEDStatus
- ldr r0, [r0]
- cmp r3, r0
- beq _03802CFC
- mov r0, #3
- mov r1, #102 ;@ 0x66
- mov r2, #1
- bl SPIi_SetEntry
- b _03802CFC
-_03802C54:
- ldr r6, _03802D0C ;@ =PMi_BlinkPatternData
- sub r1, r3, #4
- mov r0, #12
- mul r5, r1, r0
- add r4, r6, r5
- ldr r0, _03802D10 ;@ =_03809F64
- ldr r0, [r0]
- ldrh r1, [r4, #10]
- bl _u32_div_f
- ldr r5, [r6, r5]
- ldr lr, [r4, #4]
- mov r3, #0
- mov r2, #-2147483648 ;@ 0x80000000
- mov ip, r3, lsr r0
- rsb r1, r0, #32
- orr ip, ip, r2, lsl r1
- sub r1, r0, #32
- orr ip, ip, r2, lsr r1
- and r0, lr, r2, lsr r0
- and r1, r5, ip
- cmp r0, r3
- cmpeq r1, r3
- movne r3, #1
- moveq r3, #2
- ldr r0, _03802D10 ;@ =_03809F64
- ldr r1, [r0]
- add ip, r1, #1
- str ip, [r0]
- ldrh r2, [r4, #8]
- ldrh r1, [r4, #10]
- mul r1, r2, r1
- cmp ip, r1
- movcs r1, #0
- strcs r1, [r0]
- ldr r0, _03802D08 ;@ =PMi_LEDStatus
- ldr r0, [r0]
- cmp r3, r0
- beq _03802CFC
- mov r0, #3
- mov r1, #102 ;@ 0x66
- mov r2, #1
- bl SPIi_SetEntry
-_03802CFC:
- ldmia sp!, {r4, r5, r6, lr}
- bx lr
-_03802D04: .word PMi_BlinkPatternNo
-_03802D08: .word PMi_LEDStatus
-_03802D0C: .word PMi_BlinkPatternData
-_03802D10: .word _03809F64
-
- arm_func_start FUN_03802D14
-FUN_03802D14: ;@ 0x03802D14
- stmdb sp!, {r4, r5, r6, r7, lr}
- ldr r4, _03802E6C ;@ =_03809F6C
- ldrh r5, [r4, #38] ;@ 0x26
- and r0, r5, #4
- cmp r0, #4
- ldrh r6, [r4, #56] ;@ 0x38
- ldrneh r7, [r4, #58] ;@ 0x3a
- ldreq r7, _03802E70 ;@ =0x0000FFFF
- bl SPIi_CheckEntry
- cmp r0, #0
- bne _03802D80
- mov r0, #2
- bl SPIi_CheckException
- cmp r0, #0
- beq _03802D80
- and r0, r5, #1
- cmp r0, #1
- bne _03802D70
- bl MIC_ExecSampling12
- tst r5, #2
- moveq r7, r0
- eorne r7, r0, #32768 ;@ 0x8000
- b _03802D80
-_03802D70:
- bl MIC_ExecSampling8
- tst r5, #2
- moveq r7, r0
- eorne r7, r0, #128 ;@ 0x80
-_03802D80:
- and r0, r5, #1
- ldr r3, _03802E74 ;@ =0x027FFC00
- ldr r1, [r4, #44] ;@ 0x2c
- cmp r0, #1
- bne _03802DB0
- ldr r2, [r4, #40] ;@ 0x28
- strh r7, [r2, r1]!
- str r2, [r3, #912] ;@ 0x390
- add r3, r3, #916 ;@ 0x394
- strh r7, [r3]
- add r1, r1, #2
- b _03802DE8
-_03802DB0:
- and r7, r7, #255 ;@ 0xff
- tst r1, #1
- bne _03802DC8
- mov r6, r7
- add r1, r1, #1
- b _03802DE8
-_03802DC8:
- orr r0, r6, r7, lsl #8
- ldr r2, [r4, #40] ;@ 0x28
- sub r1, r1, #1
- strh r0, [r2, r1]!
- str r2, [r3, #912] ;@ 0x390
- add r3, r3, #916 ;@ 0x394
- strh r0, [r3]
- add r1, r1, #2
-_03802DE8:
- strh r6, [r4, #56] ;@ 0x38
- strh r7, [r4, #58] ;@ 0x3a
- ldr r0, [r4, #48] ;@ 0x30
- cmp r1, r0
- movcs r1, #0
- str r1, [r4, #44] ;@ 0x2c
- bcc _03802E64
- ldrh r0, [r4, #36] ;@ 0x24
- and r0, r0, #16
- cmp r0, #16
- bne _03802E24
- mov r0, #81 ;@ 0x51
- mov r1, #0
- bl SPIi_ReturnResult
- b _03802E64
-_03802E24:
- mov r0, #2
- mov r1, #66 ;@ 0x42
- mov r2, #0
- bl SPIi_SetEntry
- cmp r0, #0
- bne _03802E4C
- mov r0, #81 ;@ 0x51
- mov r1, #4
- bl SPIi_ReturnResult
- b _03802E64
-_03802E4C:
- mov r0, #4
- str r0, [r4, #32]
- ldr r1, _03802E78 ;@ =0x0400010E
- ldrh r0, [r1]
- bic r0, r0, #128 ;@ 0x80
- strh r0, [r1]
-_03802E64:
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_03802E6C: .word _03809F6C
-_03802E70: .word 0x0000FFFF
-_03802E74: .word 0x027FFC00
-_03802E78: .word 0x0400010E
-
- arm_func_start FUN_03802E7C
-FUN_03802E7C: ;@ 0x03802E7C
- stmfd sp!, {lr}
- sub sp, sp, #4
- bl FUN_03802D14
- ldr r1, _03802EB0 ;@ =0x0380FFF8
- ldr r0, [r1]
- orr r0, r0, #64 ;@ 0x40
- str r0, [r1]
- mov r1, #64 ;@ 0x40
- ldr r0, _03802EB4 ;@ =0x04000214
- str r1, [r0]
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_03802EB0: .word 0x0380FFF8
-_03802EB4: .word 0x04000214
-
- arm_func_start MIC_ExecuteProcess
-MIC_ExecuteProcess: ;@ 0x03802EB8
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- ldr r2, [r5, #4]
- cmp r2, #64 ;@ 0x40
- beq _03802EE4
- cmp r2, #65 ;@ 0x41
- beq _03802FB0
- cmp r2, #66 ;@ 0x42
- beq _0380304C
- b _038030F0
-_03802EE4:
- bl OS_DisableInterrupts
- mov r4, r0
- mov r0, #2
- bl SPIi_CheckException
- cmp r0, #0
- bne _03802F1C
- mov r0, r4
- bl OS_RestoreInterrupts
- ldr r0, [r5, #4]
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- mov r1, #4
- bl SPIi_ReturnResult
- b _038030F0
-_03802F1C:
- mov r0, #2
- bl SPIi_GetException
- mov r0, r4
- bl OS_RestoreInterrupts
- ldr r0, [r5, #8]
- and r0, r0, #1
- cmp r0, #1
- bne _03802F68
- bl MIC_ExecSampling12
- ldr r1, [r5, #8]
- ands r1, r1, #2
- eorne r0, r0, #32768 ;@ 0x8000
- movne r0, r0, lsl #16
- movne r0, r0, lsr #16
- ldr r1, _038030FC ;@ =0x027FFF94
- strh r0, [r1]
- ldr r0, _03803100 ;@ =0x027FFF90
- str r1, [r0]
- b _03802F90
-_03802F68:
- bl MIC_ExecSampling8
- ldr r1, [r5, #8]
- ands r1, r1, #2
- eorne r0, r0, #128 ;@ 0x80
- movne r0, r0, lsl #16
- movne r0, r0, lsr #16
- ldr r1, _038030FC ;@ =0x027FFF94
- strh r0, [r1]
- ldr r0, _03803100 ;@ =0x027FFF90
- str r1, [r0]
-_03802F90:
- ldr r0, [r5, #4]
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- mov r1, #0
- bl SPIi_ReturnResult
- mov r0, #2
- bl SPIi_ReleaseException
- b _038030F0
-_03802FB0:
- ldr r0, _03803104 ;@ =_03809F6C
- ldr r1, [r0, #32]
- cmp r1, #1
- bne _03803038
- mov r1, #0
- strh r1, [r0, #58] ;@ 0x3a
- strh r1, [r0, #56] ;@ 0x38
- bl OS_DisableInterrupts
- mov r4, r0
- mov r0, #64 ;@ 0x40
- bl OS_EnableIrqMask
- mov r0, #64 ;@ 0x40
- ldr r1, _03803108 ;@ =FUN_03802E7C
- bl MIC_SetIrqFunction
- bl MIC_EnableMultipleInterrupt
- ldr r0, _03803104 ;@ =_03809F6C
- ldrh r2, [r0, #52] ;@ 0x34
- ldr r1, _0380310C ;@ =0x0400010C
- strh r2, [r1]
- ldrh r0, [r0, #54] ;@ 0x36
- orr r1, r0, #192 ;@ 0xc0
- ldr r0, _03803110 ;@ =0x0400010E
- strh r1, [r0]
- mov r0, r4
- bl OS_RestoreInterrupts
- ldr r0, [r5, #4]
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- mov r1, #0
- bl SPIi_ReturnResult
- mov r1, #2
- ldr r0, _03803104 ;@ =_03809F6C
- str r1, [r0, #32]
- b _038030F0
-_03803038:
- mov r0, r2, lsl #16
- mov r0, r0, lsr #16
- mov r1, #3
- bl SPIi_ReturnResult
- b _038030F0
-_0380304C:
- ldr r0, _03803104 ;@ =_03809F6C
- ldr r1, [r0, #32]
- sub r0, r1, #3
- cmp r0, #1
- bhi _038030CC
- ldr r1, _03803110 ;@ =0x0400010E
- ldrh r0, [r1]
- bic r0, r0, #128 ;@ 0x80
- strh r0, [r1]
- bl OS_DisableInterrupts
- mov r4, r0
- mov r0, #64 ;@ 0x40
- mov r1, #0
- bl MIC_SetIrqFunction
- bl MIC_DisableMultipleInterrupt
- mov r0, r4
- bl OS_RestoreInterrupts
- ldr r0, _03803104 ;@ =_03809F6C
- ldr r0, [r0, #32]
- cmp r0, #3
- bne _038030B0
- mov r0, #66 ;@ 0x42
- mov r1, #0
- bl SPIi_ReturnResult
- b _038030BC
-_038030B0:
- mov r0, #81 ;@ 0x51
- mov r1, #0
- bl SPIi_ReturnResult
-_038030BC:
- mov r1, #0
- ldr r0, _03803104 ;@ =_03809F6C
- str r1, [r0, #32]
- b _038030F0
-_038030CC:
- cmp r1, #3
- bne _038030E4
- mov r0, #66 ;@ 0x42
- mov r1, #3
- bl SPIi_ReturnResult
- b _038030F0
-_038030E4:
- mov r0, #81 ;@ 0x51
- mov r1, #3
- bl SPIi_ReturnResult
-_038030F0:
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_038030FC: .word 0x027FFF94
-_03803100: .word 0x027FFF90
-_03803104: .word _03809F6C
-_03803108: .word FUN_03802E7C
-_0380310C: .word 0x0400010C
-_03803110: .word 0x0400010E
-
- arm_func_start FUN_03803114
-FUN_03803114: ;@ 0x03803114
- cmp r0, #65536 ;@ 0x10000
- bcs _03803138
- mov r2, #0
- ldr r1, _038031B4 ;@ =_03809F6C
- strh r2, [r1, #54] ;@ 0x36
- rsb r0, r0, #65536 ;@ 0x10000
- strh r0, [r1, #52] ;@ 0x34
- mov r0, #1
- bx lr
-_03803138:
- cmp r0, #4194304 ;@ 0x400000
- bcs _03803160
- mov r2, #1
- ldr r1, _038031B4 ;@ =_03809F6C
- strh r2, [r1, #54] ;@ 0x36
- mov r0, r0, lsr #6
- rsb r0, r0, #65536 ;@ 0x10000
- strh r0, [r1, #52] ;@ 0x34
- mov r0, r2
- bx lr
-_03803160:
- cmp r0, #16777216 ;@ 0x1000000
- bcs _03803188
- mov r2, #2
- ldr r1, _038031B4 ;@ =_03809F6C
- strh r2, [r1, #54] ;@ 0x36
- mov r0, r0, lsr #8
- rsb r0, r0, #65536 ;@ 0x10000
- strh r0, [r1, #52] ;@ 0x34
- mov r0, #1
- bx lr
-_03803188:
- cmp r0, #67108864 ;@ 0x4000000
- movcs r0, #0
- bxcs lr
- mov r2, #3
- ldr r1, _038031B4 ;@ =_03809F6C
- strh r2, [r1, #54] ;@ 0x36
- mov r0, r0, lsr #10
- rsb r0, r0, #65536 ;@ 0x10000
- strh r0, [r1, #52] ;@ 0x34
- mov r0, #1
- bx lr
-_038031B4: .word _03809F6C
-
- arm_func_start MIC_AnalyzeCommand
-MIC_AnalyzeCommand: ;@ 0x038031B8
- stmdb sp!, {r4, lr}
- ands r1, r0, #33554432 ;@ 0x2000000
- beq _038031E4
- mov r4, #0
- mov r3, r4
- ldr r1, _03803478 ;@ =_03809F6C
-_038031D0:
- mov r2, r4, lsl #1
- strh r3, [r1, r2]
- add r4, r4, #1
- cmp r4, #16
- blt _038031D0
-_038031E4:
- and r1, r0, #983040 ;@ 0xf0000
- mov r1, r1, lsr #16
- mov r2, r1, lsl #1
- ldr r1, _03803478 ;@ =_03809F6C
- strh r0, [r1, r2]
- ands r0, r0, #16777216 ;@ 0x1000000
- beq _03803470
- ldrh r3, [r1]
- and r0, r3, #65280 ;@ 0xff00
- mov r0, r0, lsl #8
- mov r4, r0, lsr #16
- sub r0, r4, #64 ;@ 0x40
- cmp r0, #3
- addls pc, pc, r0, lsl #2
- b _03803464
- b _03803230
- b _03803270
- b _03803378
- b _038033DC
-_03803230:
- mov r0, #2
- mov r1, r4
- mov r2, #1
- and r3, r3, #255 ;@ 0xff
- bl SPIi_SetEntry
- cmp r0, #0
- bne _03803258
- mov r0, r4
- mov r1, #4
- bl SPIi_ReturnResult
-_03803258:
- mov r1, #0
- ldr r0, _0380347C ;@ =0x027FFF94
- strh r1, [r0]
- ldr r0, _03803480 ;@ =0x027FFF90
- str r1, [r0]
- b _03803470
-_03803270:
- ldr r0, [r1, #32]
- cmp r0, #0
- beq _0380328C
- mov r0, r4
- mov r1, #3
- bl SPIi_ReturnResult
- b _03803470
-_0380328C:
- and r0, r3, #255 ;@ 0xff
- strh r0, [r1, #36] ;@ 0x24
- ldrh r2, [r1, #2]
- ldrh r0, [r1, #4]
- orr r3, r0, r2, lsl #16
- cmp r3, #33554432 ;@ 0x2000000
- bcc _038032B0
- cmp r3, #37748736 ;@ 0x2400000
- bcc _038032C0
-_038032B0:
- mov r0, r4
- mov r1, #2
- bl SPIi_ReturnResult
- b _03803470
-_038032C0:
- str r3, [r1, #40] ;@ 0x28
- ldrh r2, [r1, #6]
- ldrh r0, [r1, #8]
- orr r2, r0, r2, lsl #16
- add r0, r3, r2
- cmp r0, #37748736 ;@ 0x2400000
- bls _038032EC
- mov r0, r4
- mov r1, #2
- bl SPIi_ReturnResult
- b _03803470
-_038032EC:
- str r2, [r1, #48] ;@ 0x30
- ldrh r2, [r1, #10]
- ldrh r0, [r1, #12]
- orr r0, r0, r2, lsl #16
- bl FUN_03803114
- cmp r0, #0
- bne _03803318
- mov r0, r4
- mov r1, #2
- bl SPIi_ReturnResult
- b _03803470
-_03803318:
- mov r2, #0
- ldr r0, _03803478 ;@ =_03809F6C
- str r2, [r0, #44] ;@ 0x2c
- ldrh r1, [r0, #36] ;@ 0x24
- and r1, r1, #7
- strh r1, [r0, #38] ;@ 0x26
- mov r0, #2
- mov r1, r4
- bl SPIi_SetEntry
- cmp r0, #0
- bne _03803354
- mov r0, r4
- mov r1, #4
- bl SPIi_ReturnResult
- b _03803470
-_03803354:
- mov r1, #0
- ldr r0, _0380347C ;@ =0x027FFF94
- strh r1, [r0]
- ldr r0, _03803480 ;@ =0x027FFF90
- str r1, [r0]
- mov r1, #1
- ldr r0, _03803478 ;@ =_03809F6C
- str r1, [r0, #32]
- b _03803470
-_03803378:
- ldr r0, [r1, #32]
- cmp r0, #2
- beq _03803394
- mov r0, r4
- mov r1, #3
- bl SPIi_ReturnResult
- b _03803470
-_03803394:
- mov r0, #2
- mov r1, r4
- mov r2, #0
- bl SPIi_SetEntry
- cmp r0, #0
- bne _038033BC
- mov r0, r4
- mov r1, #4
- bl SPIi_ReturnResult
- b _03803470
-_038033BC:
- mov r1, #3
- ldr r0, _03803478 ;@ =_03809F6C
- str r1, [r0, #32]
- ldr r1, _03803484 ;@ =0x0400010E
- ldrh r0, [r1]
- bic r0, r0, #128 ;@ 0x80
- strh r0, [r1]
- b _03803470
-_038033DC:
- ldr r0, [r1, #32]
- cmp r0, #2
- beq _038033F8
- mov r0, r4
- mov r1, #3
- bl SPIi_ReturnResult
- b _03803470
-_038033F8:
- ldrh r2, [r1, #2]
- ldrh r0, [r1, #4]
- orr r0, r0, r2, lsl #16
- bl FUN_03803114
- cmp r0, #0
- bne _03803420
- mov r0, r4
- mov r1, #2
- bl SPIi_ReturnResult
- b _03803470
-_03803420:
- bl OS_DisableInterrupts
- ldr ip, _03803484 ;@ =0x0400010E
- ldrh r1, [ip]
- bic r1, r1, #128 ;@ 0x80
- strh r1, [ip]
- ldr r1, _03803478 ;@ =_03809F6C
- ldrh r3, [r1, #52] ;@ 0x34
- ldr r2, _03803488 ;@ =0x0400010C
- strh r3, [r2]
- ldrh r1, [r1, #54] ;@ 0x36
- orr r1, r1, #192 ;@ 0xc0
- strh r1, [ip]
- bl OS_RestoreInterrupts
- mov r0, r4
- mov r1, #0
- bl SPIi_ReturnResult
- b _03803470
-_03803464:
- mov r0, r4
- mov r1, #1
- bl SPIi_ReturnResult
-_03803470:
- ldmia sp!, {r4, lr}
- bx lr
-_03803478: .word _03809F6C
-_0380347C: .word 0x027FFF94
-_03803480: .word 0x027FFF90
-_03803484: .word 0x0400010E
-_03803488: .word 0x0400010C
-
- arm_func_start MIC_Init
-MIC_Init: ;@ 0x0380348C
- mov r3, #0
- ldr r0, _038034C4 ;@ =_03809F6C
- str r3, [r0, #32]
- mov r2, r3
-_0380349C:
- mov r1, r3, lsl #1
- strh r2, [r0, r1]
- add r3, r3, #1
- cmp r3, #16
- blt _0380349C
- ldr r1, _038034C8 ;@ =0x0400010E
- ldrh r0, [r1]
- bic r0, r0, #128 ;@ 0x80
- strh r0, [r1]
- bx lr
-_038034C4: .word _03809F6C
-_038034C8: .word 0x0400010E
-
- arm_func_start MIC_ExecSampling12
-MIC_ExecSampling12: ;@ 0x038034CC
- ldr r1, _03803580 ;@ =0x040001C0
-_038034D0:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _038034D0
- ldr r0, _03803584 ;@ =0x00008A01
- strh r0, [r1]
- mov r1, #228 ;@ 0xe4
- ldr r0, _03803588 ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _03803580 ;@ =0x040001C0
-_038034F4:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _038034F4
- mov r1, #0
- ldr r0, _03803588 ;@ =0x040001C2
- strh r1, [r0]
- ldr r2, _03803580 ;@ =0x040001C0
-_03803510:
- ldrh r0, [r2]
- ands r0, r0, #128 ;@ 0x80
- bne _03803510
- ldr r1, _03803588 ;@ =0x040001C2
- ldrh r0, [r1]
- and r0, r0, #255 ;@ 0xff
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- mov r0, r0, lsl #24
- mov r3, r0, lsr #16
- ldr r0, _0380358C ;@ =0x00008201
- strh r0, [r2]
- mov r0, #0
- strh r0, [r1]
- ldr r1, _03803580 ;@ =0x040001C0
-_0380354C:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _0380354C
- ldr r0, _03803588 ;@ =0x040001C2
- ldrh r0, [r0]
- and r0, r0, #255 ;@ 0xff
- mov r0, r0, lsl #16
- orr r1, r3, r0, lsr #16
- ldr r0, _03803590 ;@ =0x00007FF8
- and r0, r1, r0
- mov r0, r0, lsl #17
- mov r0, r0, lsr #16
- bx lr
-_03803580: .word 0x040001C0
-_03803584: .word 0x00008A01
-_03803588: .word 0x040001C2
-_0380358C: .word 0x00008201
-_03803590: .word 0x00007FF8
-
- arm_func_start MIC_ExecSampling8
-MIC_ExecSampling8: ;@ 0x03803594
- ldr r1, _03803648 ;@ =0x040001C0
-_03803598:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03803598
- ldr r0, _0380364C ;@ =0x00008A01
- strh r0, [r1]
- mov r1, #236 ;@ 0xec
- ldr r0, _03803650 ;@ =0x040001C2
- strh r1, [r0]
- ldr r1, _03803648 ;@ =0x040001C0
-_038035BC:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _038035BC
- mov r1, #0
- ldr r0, _03803650 ;@ =0x040001C2
- strh r1, [r0]
- ldr r2, _03803648 ;@ =0x040001C0
-_038035D8:
- ldrh r0, [r2]
- ands r0, r0, #128 ;@ 0x80
- bne _038035D8
- ldr r1, _03803650 ;@ =0x040001C2
- ldrh r0, [r1]
- and r0, r0, #255 ;@ 0xff
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- mov r0, r0, lsl #24
- mov r3, r0, lsr #16
- ldr r0, _03803654 ;@ =0x00008201
- strh r0, [r2]
- mov r0, #0
- strh r0, [r1]
- ldr r1, _03803648 ;@ =0x040001C0
-_03803614:
- ldrh r0, [r1]
- ands r0, r0, #128 ;@ 0x80
- bne _03803614
- ldr r0, _03803650 ;@ =0x040001C2
- ldrh r0, [r0]
- and r0, r0, #255 ;@ 0xff
- mov r0, r0, lsl #16
- orr r1, r3, r0, lsr #16
- ldr r0, _03803658 ;@ =0x00007F80
- and r0, r1, r0
- mov r0, r0, lsl #9
- mov r0, r0, lsr #16
- bx lr
-_03803648: .word 0x040001C0
-_0380364C: .word 0x00008A01
-_03803650: .word 0x040001C2
-_03803654: .word 0x00008201
-_03803658: .word 0x00007F80
-_0380365C:
- mov ip, #67108864 ;@ 0x4000000
- add r1, ip, #520 ;@ 0x208
- ldrh r0, [r1]
- tst r0, r0
- bxeq lr
- ldr r3, [ip, #528] ;@ 0x210
- ldr r1, [ip, #532] ;@ 0x214
- ands r2, r1, r3
- bxeq lr
- ldr r0, _038037C8 ;@ =0x01DF3FFF
- tst r2, r0
- streq r2, [ip, #532] ;@ 0x214
- bxeq lr
- stmfd sp!, {lr}
- mrs r0, SPSR
- stmfd sp!, {r0}
- stmdb sp, {sp, lr}^
- sub sp, sp, #8
- mov r0, #159 ;@ 0x9f
- msr CPSR_c, r0
- ldr r1, _038037CC ;@ =OSi_ThreadInfo
- ldrh r0, [r1, #2]
- add r0, r0, #1
- strh r0, [r1, #2]
- ldr r1, _038037D0 ;@ =_03809FA8
- cmp r0, #1
- moveq r0, sp
- ldreq sp, [r1, #4]
- streq r0, [r1, #4]
- stmfd sp!, {r3}
- ldr r1, _038037D4 ;@ =_038072C8
- ldr r0, [r1]
- tst r0, r2
- strne r0, [ip, #532] ;@ 0x214
- ldrne r0, [r1, #4]
- ldrne r3, _038037D8 ;@ =OS_IRQTable
- ldrne r0, [r3, r0, lsl #2]
- bne _03803738
- mov r3, #1
-_038036F8:
- ldr r0, [r1, r3, lsl #3]
- tst r0, r2
- addeq r3, r3, #1
- beq _038036F8
- str r0, [ip, #532] ;@ 0x214
- add r0, r1, r3, lsl #3
- ldr r2, [r0, #4]
- ldr r3, _038037D8 ;@ =OS_IRQTable
- ldr r0, [r3, r2, lsl #2]
- ldr r2, _038037CC ;@ =OSi_ThreadInfo
- ldrh r3, [r2, #2]
- cmp r3, #1
- ldreq r2, [r1]
- streq r2, [ip, #528] ;@ 0x210
- moveq r2, #31
- msreq CPSR_c, r2
-_03803738:
- ldr r1, [ip, #528] ;@ 0x210
- stmfd sp!, {r1}
- adr lr, _03803748
- bx r0
-_03803748:
- mov r0, #159 ;@ 0x9f
- msr CPSR_c, r0
- mov ip, #67108864 ;@ 0x4000000
- ldmia sp!, {r0}
- ldr r1, [ip, #528] ;@ 0x210
- eor r2, r0, r1
- and r1, r2, r1
- and r0, r2, r0
- ldmia sp!, {r3}
- orr r3, r3, r1
- bic r3, r3, r0
- str r3, [ip, #528] ;@ 0x210
- ldr r2, _038037CC ;@ =OSi_ThreadInfo
- ldr r3, _038037D0 ;@ =_03809FA8
- ldrh r0, [r2, #2]
- subs r1, r0, #1
- strh r1, [r2, #2]
- moveq r0, sp
- ldreq sp, [r3, #4]
- streq r0, [r3, #4]
- mov r0, #146 ;@ 0x92
- msr CPSR_c, r0
- ldmia sp, {sp, lr}^
- nop ;@ (mov r0, r0)
- add sp, sp, #8
- ldmia sp!, {r0}
- msr SPSR_fc, r0
- tst r1, r1
- ldreq r0, _038037DC ;@ =OS_IrqHandler_ThreadSwitch
- addeq lr, pc, #0
- bxeq r0
- ldmia sp!, {pc}
-_038037C8: .word 0x01DF3FFF
-_038037CC: .word OSi_ThreadInfo
-_038037D0: .word _03809FA8
-_038037D4: .word _038072C8
-_038037D8: .word OS_IRQTable
-_038037DC: .word OS_IrqHandler_ThreadSwitch
-
- arm_func_start MIC_DisableMultipleInterrupt
-MIC_DisableMultipleInterrupt: ;@ 0x038037E0
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r0, _03803820 ;@ =0x0380FFFC
- ldr r1, [r0]
- ldr r0, _03803824 ;@ =_0380365C
- cmp r1, r0
- bne _03803814
- bl OS_DisableInterrupts
- ldr r1, _03803828 ;@ =_03809FA8
- ldr r2, [r1, #12]
- ldr r1, _03803820 ;@ =0x0380FFFC
- str r2, [r1]
- bl OS_RestoreInterrupts
-_03803814:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_03803820: .word 0x0380FFFC
-_03803824: .word _0380365C
-_03803828: .word _03809FA8
-
- arm_func_start MIC_EnableMultipleInterrupt
-MIC_EnableMultipleInterrupt: ;@ 0x0380382C
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r0, _03803888 ;@ =0x0380FFFC
- ldr r2, [r0]
- ldr r0, _0380388C ;@ =_0380365C
- cmp r2, r0
- beq _0380387C
- mov r1, #0
- ldr r0, _03803890 ;@ =_03809FA8
- str r1, [r0]
- ldr r1, _03803894 ;@ =0x0380FE80
- str r1, [r0, #4]
- mov r1, #64 ;@ 0x40
- str r1, [r0, #8]
- str r2, [r0, #12]
- bl OS_DisableInterrupts
- ldr r2, _0380388C ;@ =_0380365C
- ldr r1, _03803888 ;@ =0x0380FFFC
- str r2, [r1]
- bl OS_RestoreInterrupts
-_0380387C:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_03803888: .word 0x0380FFFC
-_0380388C: .word _0380365C
-_03803890: .word _03809FA8
-_03803894: .word 0x0380FE80
-
- arm_func_start MIC_SetIrqFunction
-MIC_SetIrqFunction: ;@ 0x03803898
- mov ip, #0
- ldr r2, _038038BC ;@ =OS_IRQTable
-_038038A0:
- ands r3, r0, #1
- strne r1, [r2, ip, lsl #2]
- mov r0, r0, lsr #1
- add ip, ip, #1
- cmp ip, #25
- blt _038038A0
- bx lr
-_038038BC: .word OS_IRQTable
-
- arm_func_start CTRDGi_SendtoPxi
-CTRDGi_SendtoPxi: ;@ 0x038038C0
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r7, r0
- mov r6, #1
- mov r5, #13
- mov r4, #0
- b _038038E4
-_038038DC:
- mov r0, r6
- bl FUN_037F8CB4
-_038038E4:
- mov r0, r5
- mov r1, r7
- mov r2, r4
- bl PXI_SendWordByFifo
- cmp r0, #0
- bne _038038DC
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-
- arm_func_start CTRDGi_UnlockByProcessor
-CTRDGi_UnlockByProcessor: ;@ 0x03803908
- stmdb sp!, {r4, lr}
- mov r4, r1
- ldr r1, [r4]
- cmp r1, #0
- bne _03803920
- bl OS_UnLockCartridge
-_03803920:
- ldr r0, [r4, #4]
- bl OS_RestoreInterrupts
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start CTRDGi_LockByProcessor
-CTRDGi_LockByProcessor: ;@ 0x03803930
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- mov r4, r1
- bl OS_DisableInterrupts
- str r0, [r4, #4]
- ldr r0, _0380398C ;@ =0x027FFFE8
- bl OS_ReadOwnerOfLockWord
- and r0, r0, #128 ;@ 0x80
- str r0, [r4]
- ldr r0, [r4]
- cmp r0, #0
- bne _03803974
- mov r0, r5
- bl OS_TryLockCartridge
- cmp r0, #0
- bne _0380397C
-_03803974:
- mov r0, #1
- b _03803980
-_0380397C:
- mov r0, #0
-_03803980:
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_0380398C: .word 0x027FFFE8
-
- arm_func_start CTRDGi_RestoreAccessCycle
-CTRDGi_RestoreAccessCycle: ;@ 0x03803990
- ldr r3, [r0]
- ldr r2, _038039C0 ;@ =0x04000204
- ldrh r1, [r2]
- bic r1, r1, #12
- orr r1, r1, r3, lsl #2
- strh r1, [r2]
- ldr r1, [r0, #4]
- ldrh r0, [r2]
- bic r0, r0, #16
- orr r0, r0, r1, lsl #4
- strh r0, [r2]
- bx lr
-_038039C0: .word 0x04000204
-
- arm_func_start CTRDGi_ChangeLatestAccessCycle
-CTRDGi_ChangeLatestAccessCycle: ;@ 0x038039C4
- ldr r2, _03803A08 ;@ =0x04000204
- ldrh r1, [r2]
- and r1, r1, #12
- mov r1, r1, asr #2
- str r1, [r0]
- ldrh r1, [r2]
- and r1, r1, #16
- mov r1, r1, asr #4
- str r1, [r0, #4]
- ldrh r0, [r2]
- bic r0, r0, #12
- orr r0, r0, #12
- strh r0, [r2]
- ldrh r0, [r2]
- bic r0, r0, #16
- strh r0, [r2]
- bx lr
-_03803A08: .word 0x04000204
-
- arm_func_start CTRDG_IsExisting
-CTRDG_IsExisting: ;@ 0x03803A0C
- stmdb sp!, {r4, lr}
- sub sp, sp, #16
- mov r4, #1
- ldr r2, _03803B20 ;@ =0x027FFC30
- ldrh r1, [r2]
- ldr r0, _03803B24 ;@ =0x0000FFFF
- cmp r1, r0
- moveq r0, #0
- beq _03803B14
- ldrb r0, [r2, #5]
- mov r0, r0, lsl #30
- mov r0, r0, lsr #31
- cmp r0, #1
- moveq r0, #0
- beq _03803B14
- ldr r0, _03803B28 ;@ =CTRDGi_Work
- ldrh r0, [r0, #2]
- add r1, sp, #0
- bl CTRDGi_LockByProcessor
- cmp r0, #0
- bne _03803A70
- ldr r0, [sp, #4]
- bl OS_RestoreInterrupts
- mov r0, r4
- b _03803B14
-_03803A70:
- add r0, sp, #8
- bl CTRDGi_ChangeLatestAccessCycle
- mov r2, #134217728 ;@ 0x8000000
- ldrb r3, [r2, #178] ;@ 0xb2
- cmp r3, #150 ;@ 0x96
- bne _03803A9C
- ldr r0, _03803B20 ;@ =0x027FFC30
- ldrh r1, [r0]
- ldrh r0, [r2, #190] ;@ 0xbe
- cmp r1, r0
- bne _03803AE4
-_03803A9C:
- cmp r3, #150 ;@ 0x96
- beq _03803ABC
- ldr r0, _03803B20 ;@ =0x027FFC30
- ldrh r1, [r0]
- ldr r0, _03803B2C ;@ =0x0801FFFE
- ldrh r0, [r0]
- cmp r1, r0
- bne _03803AE4
-_03803ABC:
- ldr r2, _03803B20 ;@ =0x027FFC30
- ldr r1, [r2, #8]
- mov r0, #134217728 ;@ 0x8000000
- ldr r0, [r0, #172] ;@ 0xac
- cmp r1, r0
- beq _03803AF8
- ldrb r0, [r2, #5]
- mov r0, r0, lsl #31
- movs r0, r0, lsr #31
- beq _03803AF8
-_03803AE4:
- ldr r1, _03803B20 ;@ =0x027FFC30
- ldrb r0, [r1, #5]
- orr r0, r0, #2
- strb r0, [r1, #5]
- mov r4, #0
-_03803AF8:
- add r0, sp, #8
- bl CTRDGi_RestoreAccessCycle
- ldr r0, _03803B28 ;@ =CTRDGi_Work
- ldrh r0, [r0, #2]
- add r1, sp, #0
- bl CTRDGi_UnlockByProcessor
- mov r0, r4
-_03803B14:
- add sp, sp, #16
- ldmia sp!, {r4, lr}
- bx lr
-_03803B20: .word 0x027FFC30
-_03803B24: .word 0x0000FFFF
-_03803B28: .word CTRDGi_Work
-_03803B2C: .word 0x0801FFFE
-
- arm_func_start CTRDG_IsPulledOut
-CTRDG_IsPulledOut: ;@ 0x03803B30
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r2, _03803B80 ;@ =0x027FFC30
- ldrh r1, [r2]
- ldr r0, _03803B84 ;@ =0x0000FFFF
- cmp r1, r0
- moveq r0, #0
- beq _03803B74
- ldrb r0, [r2, #5]
- mov r0, r0, lsl #30
- movs r0, r0, lsr #31
- bne _03803B64
- bl CTRDG_IsExisting
-_03803B64:
- ldr r0, _03803B80 ;@ =0x027FFC30
- ldrb r0, [r0, #5]
- mov r0, r0, lsl #30
- mov r0, r0, lsr #31
-_03803B74:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_03803B80: .word 0x027FFC30
-_03803B84: .word 0x0000FFFF
-
- arm_func_start CTRDGi_InitCommon
-CTRDGi_InitCommon: ;@ 0x03803B88
- stmfd sp!, {lr}
- sub sp, sp, #4
- mov r0, #0
- str r0, [sp]
- add r0, sp, #0
- ldr r1, _03803BC0 ;@ =CTRDGi_Work
- ldr r2, _03803BC4 ;@ =0x05000001
- bl FUN_03803BC8
- bl OS_GetLockID
- ldr r1, _03803BC0 ;@ =CTRDGi_Work
- strh r0, [r1, #2]
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_03803BC0: .word CTRDGi_Work
-_03803BC4: .word 0x05000001
-
- arm_func_start FUN_03803BC8
-FUN_03803BC8: ;@ 0x03803BC8
- ldr ip, _03803BD0 ;@ =SVC_CpuSet
- bx ip
-_03803BD0: .word SVC_CpuSet
-
- arm_func_start FUN_03803BD4
-FUN_03803BD4: ;@ 0x03803BD4
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- and r0, r1, #63 ;@ 0x3f
- cmp r0, #3
- bne _03803C40
- ldr r0, _03803C50 ;@ =0x01FFFFC0
- and r0, r1, r0
- mov r2, r0, lsr #6
- ldr r1, _03803C54 ;@ =0x04000204
- ldrh r0, [r1]
- bic r0, r0, #96 ;@ 0x60
- orr r0, r0, r2, lsl #5
- strh r0, [r1]
- mov r7, #1
- mov r6, #17
- mov r5, #18
- mov r4, #0
- b _03803C24
-_03803C1C:
- mov r0, r7
- bl FUN_037F8CB4
-_03803C24:
- mov r0, r6
- mov r1, r5
- mov r2, r4
- bl PXI_SendWordByFifo
- cmp r0, #0
- bne _03803C1C
- b _03803C44
-_03803C40:
- bl OS_Terminate
-_03803C44:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_03803C50: .word 0x01FFFFC0
-_03803C54: .word 0x04000204
-
- arm_func_start FUN_03803C58
-FUN_03803C58: ;@ 0x03803C58
- stmfd sp!, {lr}
- sub sp, sp, #4
- mov r0, #0
- bl CTRDG_VibPulseEdgeUpdate
- bl SND_BeginSleep
- bl WVR_Shutdown
- bl OS_Terminate
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start CTRDG_CheckPullOut_Polling
-CTRDG_CheckPullOut_Polling: ;@ 0x03803C80
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- ldr r1, _03803D80 ;@ =_03807708
- ldr r3, [r1]
- mvn r0, #0
- cmp r3, r0
- ldreq r0, _03803D84 ;@ =0x027FFC3C
- ldreq r0, [r0]
- addeq r0, r0, #10
- streq r0, [r1]
- beq _03803D74
- ldr r0, _03803D88 ;@ =_03809FCC
- ldr r0, [r0]
- cmp r0, #0
- bne _03803D74
- ldr r0, _03803D8C ;@ =_03809FC8
- ldr r0, [r0]
- cmp r0, #0
- bne _03803D74
- ldr r2, _03803D84 ;@ =0x027FFC3C
- ldr r0, [r2]
- cmp r0, r3
- bcc _03803D74
- ldr r0, [r2]
- add r0, r0, #10
- str r0, [r1]
- bl CTRDG_IsPulledOut
- ldr r1, _03803D8C ;@ =_03809FC8
- str r0, [r1]
- bl CTRDG_IsExisting
- cmp r0, #0
- bne _03803D28
- ldr r0, _03803D90 ;@ =_03807704
- ldr r0, [r0]
- cmp r0, #0
- movne r1, #1
- ldrne r0, _03803D88 ;@ =_03809FCC
- strne r1, [r0]
- bne _03803D74
- mov r1, #1
- ldr r0, _03803D8C ;@ =_03809FC8
- str r1, [r0]
-_03803D28:
- mov r7, #0
- ldr r0, _03803D90 ;@ =_03807704
- str r7, [r0]
- ldr r0, _03803D8C ;@ =_03809FC8
- ldr r0, [r0]
- cmp r0, #0
- beq _03803D74
- mov r6, #100 ;@ 0x64
- mov r5, #13
- mov r4, #17
- b _03803D5C
-_03803D54:
- mov r0, r6
- bl OS_Sleep
-_03803D5C:
- mov r0, r5
- mov r1, r4
- mov r2, r7
- bl PXI_SendWordByFifo
- cmp r0, #0
- bne _03803D54
-_03803D74:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_03803D80: .word _03807708
-_03803D84: .word 0x027FFC3C
-_03803D88: .word _03809FCC
-_03803D8C: .word _03809FC8
-_03803D90: .word _03807704
-
- arm_func_start FUN_03803D94
-FUN_03803D94: ;@ 0x03803D94
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- mov r7, r0
- mov r0, #134217728 ;@ 0x8000000
- add r6, r0, #4
- mov r4, #1
- bl OS_GetLockID
- mov r0, r0, lsl #16
- mov r5, r0, lsr #16
- mov r0, r5
- bl OS_LockCartridge
- mov r1, #0
- ldr r0, _03803E3C ;@ =0x0000FFFF
- eor r2, r0, #3
- mov r2, r2, lsl #16
- mov lr, r2, lsr #16
- eor r2, r0, #132 ;@ 0x84
- mov r2, r2, lsl #16
- mov r8, r2, lsr #16
- b _03803E18
-_03803DE0:
- mov ip, r0
- cmp r1, #76 ;@ 0x4c
- moveq ip, r8
- beq _03803DF8
- cmp r1, #77 ;@ 0x4d
- moveq ip, lr
-_03803DF8:
- mov r3, r1, lsl #1
- ldrh r2, [r7, r3]
- and ip, ip, r2
- ldrh r2, [r6, r3]
- cmp ip, r2
- movne r4, #0
- bne _03803E20
- add r1, r1, #1
-_03803E18:
- cmp r1, #78 ;@ 0x4e
- blt _03803DE0
-_03803E20:
- mov r0, r5
- bl OS_UnLockCartridge
- mov r0, r5
- bl OS_ReleaseLockID
- mov r0, r4
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_03803E3C: .word 0x0000FFFF
-
- arm_func_start FUN_03803E40
-FUN_03803E40: ;@ 0x03803E40
- ldr r1, _03803E54 ;@ =current_vib
- str r0, [r1]
- ldr r1, _03803E58 ;@ =0x08001000
- strh r0, [r1]
- bx lr
-_03803E54: .word current_vib
-_03803E58: .word 0x08001000
-
- arm_func_start CTRDG_VibPulseEdgeUpdate
-CTRDG_VibPulseEdgeUpdate: ;@ 0x03803E5C
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- sub sp, sp, #4
- movs r5, r0
- beq _03803E9C
- ldr r0, [r5]
- cmp r0, #0
- bne _03803E9C
- ldr r0, [r5, #68] ;@ 0x44
- add r0, r0, #1
- str r0, [r5, #68] ;@ 0x44
- ldr r1, [r5, #64] ;@ 0x40
- cmp r1, #0
- beq _03803E9C
- ldr r0, [r5, #68] ;@ 0x44
- cmp r0, r1
- movhi r5, #0
-_03803E9C:
- cmp r5, #0
- beq _03803EB0
- ldr r0, [r5, #60] ;@ 0x3c
- cmp r0, #0
- bne _03803F48
-_03803EB0:
- bl OS_DisableInterrupts
- mov r9, r0
- ldr r0, _03804068 ;@ =current_vib
- ldr r0, [r0]
- cmp r0, #2
- bne _03803F34
- mov r8, #0
- ldr r7, _0380406C ;@ =0x027FFFE8
- ldr r4, _03804070 ;@ =_03809FBC
- ldr fp, _03804074 ;@ =0x000080E8
- mov r6, r8
- mov r5, #1
- b _03803F2C
-_03803EE4:
- mov r0, r7
- bl OS_ReadOwnerOfLockWord
- ands sl, r0, #128 ;@ 0x80
- bne _03803F04
- ldrh r0, [r4]
- bl OS_TryLockCartridge
- cmp r0, #0
- bne _03803F24
-_03803F04:
- mov r0, r6
- bl FUN_03803E40
- mov r8, r5
- cmp sl, #0
- bne _03803F2C
- ldrh r0, [r4]
- bl OS_UnlockCartridge
- b _03803F2C
-_03803F24:
- mov r0, fp
- bl OS_SpinWait
-_03803F2C:
- cmp r8, #0
- beq _03803EE4
-_03803F34:
- ldr r0, _03804078 ;@ =_03809FEC
- bl OS_CancelAlarm
- mov r0, r9
- bl OS_RestoreInterrupts
- b _0380405C
-_03803F48:
- cmp r5, #0
- beq _0380405C
- ldr r0, _0380406C ;@ =0x027FFFE8
- bl OS_ReadOwnerOfLockWord
- ands r4, r0, #128 ;@ 0x80
- bne _03803F74
- ldr r0, _03804070 ;@ =_03809FBC
- ldrh r0, [r0]
- bl OS_TryLockCartridge
- cmp r0, #0
- bne _03804044
-_03803F74:
- ldr r1, [r5]
- ldr r0, [r5, #4]
- cmp r1, r0
- bne _03803FB0
- mov r0, #0
- bl FUN_03803E40
- str r5, [sp]
- ldr r0, _03804078 ;@ =_03809FEC
- ldr r1, [r5, #8]
- mov r2, #0
- ldr r3, _0380407C ;@ =CTRDG_VibPulseEdgeUpdate
- bl OS_SetAlarm
- mov r0, #0
- str r0, [r5]
- b _0380402C
-_03803FB0:
- ands r0, r1, #1
- beq _03803FF4
- mov r0, #0
- bl FUN_03803E40
- str r5, [sp]
- ldr r0, _03804078 ;@ =_03809FEC
- ldr r1, [r5]
- mov r1, r1, lsr #1
- add r1, r5, r1, lsl #2
- ldr r1, [r1, #36] ;@ 0x24
- mov r2, #0
- ldr r3, _0380407C ;@ =CTRDG_VibPulseEdgeUpdate
- bl OS_SetAlarm
- ldr r0, [r5]
- add r0, r0, #1
- str r0, [r5]
- b _0380402C
-_03803FF4:
- mov r0, #2
- bl FUN_03803E40
- str r5, [sp]
- ldr r0, _03804078 ;@ =_03809FEC
- ldr r1, [r5]
- mov r1, r1, lsr #1
- add r1, r5, r1, lsl #2
- ldr r1, [r1, #12]
- mov r2, #0
- ldr r3, _0380407C ;@ =CTRDG_VibPulseEdgeUpdate
- bl OS_SetAlarm
- ldr r0, [r5]
- add r0, r0, #1
- str r0, [r5]
-_0380402C:
- cmp r4, #0
- bne _0380405C
- ldr r0, _03804070 ;@ =_03809FBC
- ldrh r0, [r0]
- bl OS_UnlockCartridge
- b _0380405C
-_03804044:
- str r5, [sp]
- ldr r0, _03804078 ;@ =_03809FEC
- ldr r1, _03804080 ;@ =0x0000020B
- mov r2, #0
- ldr r3, _0380407C ;@ =CTRDG_VibPulseEdgeUpdate
- bl OS_SetAlarm
-_0380405C:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- bx lr
-_03804068: .word current_vib
-_0380406C: .word 0x027FFFE8
-_03804070: .word _03809FBC
-_03804074: .word 0x000080E8
-_03804078: .word _03809FEC
-_0380407C: .word CTRDG_VibPulseEdgeUpdate
-_03804080: .word 0x0000020B
-_03804084:
- mov r0, r1
- ldr ip, _03804090 ;@ =CTRDG_VibPulseEdgeUpdate
- bx ip
-_03804090: .word CTRDG_VibPulseEdgeUpdate
-
- arm_func_start FUN_03804094
-FUN_03804094: ;@ 0x03804094
- stmfd sp!, {lr}
- sub sp, sp, #4
- and r0, r1, #63 ;@ 0x3f
- cmp r0, #2
- bne _038040B0
- bl FUN_03803C58
- b _038040B4
-_038040B0:
- bl OS_Terminate
-_038040B4:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start FUN_038040C0
-FUN_038040C0: ;@ 0x038040C0
- stmfd sp!, {lr}
- sub sp, sp, #4
- and r0, r1, #63 ;@ 0x3f
- cmp r0, #1
- ldreq r0, _038040F4 ;@ =_03809FD4
- streq r1, [r0]
- moveq r1, #1
- streq r1, [r0, #16]
- beq _038040E8
- bl OS_Terminate
-_038040E8:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_038040F4: .word _03809FD4
-
- arm_func_start CTRDGi_InitModuleInfo
-CTRDGi_InitModuleInfo: ;@ 0x038040F8
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- ldr r0, _038041C8 ;@ =_03809FC4
- ldr r1, [r0]
- cmp r1, #0
- bne _038041BC
- mov r1, #1
- str r1, [r0]
- ldr r0, _038041CC ;@ =0x04000300
- ldrh r0, [r0]
- ands r0, r0, #1
- beq _038041BC
- mov r0, #262144 ;@ 0x40000
- bl OS_SetIrqMask
- mov r5, r0
- ldr r1, _038041D0 ;@ =0x04000208
- ldrh r4, [r1]
- mov r0, #1
- strh r0, [r1]
- mov r7, #256 ;@ 0x100
- ldr r6, _038041D4 ;@ =_03809FD4
- b _03804158
-_03804150:
- mov r0, r7
- bl FUN_037F8CB4
-_03804158:
- ldr r0, [r6, #16]
- cmp r0, #1
- bne _03804150
- ldr r1, [r6]
- ldr r0, _038041D8 ;@ =0x01FFFFC0
- and r0, r1, r0
- mov r0, r0, lsr #6
- mov r0, r0, lsl #5
- add r0, r0, #33554432 ;@ 0x2000000
- add r0, r0, #4
- bl FUN_03803D94
- ldr r2, _038041DC ;@ =0x027FFC30
- ldrb r1, [r2, #5]
- bic r1, r1, #1
- and r0, r0, #255 ;@ 0xff
- and r0, r0, #1
- orr r0, r1, r0
- strb r0, [r2, #5]
- mov r0, #1
- bl CTRDGi_SendtoPxi
- ldr r1, _038041D0 ;@ =0x04000208
- ldrh r0, [r1]
- strh r4, [r1]
- mov r0, r5
- bl OS_SetIrqMask
-_038041BC:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_038041C8: .word _03809FC4
-_038041CC: .word 0x04000300
-_038041D0: .word 0x04000208
-_038041D4: .word _03809FD4
-_038041D8: .word 0x01FFFFC0
-_038041DC: .word 0x027FFC30
-
- arm_func_start CTRDG_Init
-CTRDG_Init: ;@ 0x038041E0
- stmfd sp!, {lr}
- sub sp, sp, #4
- bl OS_InitTick
- bl OS_InitAlarm
- ldr r0, _03804270 ;@ =_03809FEC
- bl OS_CreateAlarm
- ldr r0, _03804274 ;@ =_03809FD0
- ldr r1, [r0]
- cmp r1, #0
- bne _03804264
- mov r1, #1
- str r1, [r0]
- bl CTRDGi_InitCommon
- bl OS_GetLockID
- mvn r1, #2
- cmp r0, r1
- beq _03804264
- ldr r1, _03804278 ;@ =_03809FBC
- strh r0, [r1]
- bl PXI_Init
- mov r0, #13
- ldr r1, _0380427C ;@ =FUN_038040C0
- bl PXI_SetFifoRecvCallback
- bl CTRDGi_InitModuleInfo
- mov r0, #13
- ldr r1, _03804280 ;@ =FUN_03804094
- bl PXI_SetFifoRecvCallback
- mov r0, #16
- ldr r1, _03804284 ;@ =_03804084
- bl PXI_SetFifoRecvCallback
- mov r0, #17
- ldr r1, _03804288 ;@ =FUN_03803BD4
- bl PXI_SetFifoRecvCallback
-_03804264:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_03804270: .word _03809FEC
-_03804274: .word _03809FD0
-_03804278: .word _03809FBC
-_0380427C: .word FUN_038040C0
-_03804280: .word FUN_03804094
-_03804284: .word _03804084
-_03804288: .word FUN_03803BD4
-
arm_func_start FUN_0380428C
FUN_0380428C: ;@ 0x0380428C
stmfd sp!, {lr}
diff --git a/arm7/asm/wram_bss.s b/arm7/asm/wram_bss.s
index e342bf0c..b8123702 100644
--- a/arm7/asm/wram_bss.s
+++ b/arm7/asm/wram_bss.s
@@ -2,126 +2,6 @@
.include "global.inc"
.section .bss
- .global _038099AC
-_038099AC: ;0x038099AC
- .space 0x038099B0 - 0x038099AC
-
- .global _038099B0
-_038099B0: ;0x038099B0
- .space 0x038099B8 - 0x038099B0
-
- .global _038099B8
-_038099B8: ;0x038099B8
- .space 0x03809C5C - 0x038099B8
-
- .global _03809C5C
-_03809C5C: ;0x03809C5C
- .space 0x03809C7C - 0x03809C5C
-
- .global _03809C7C
-_03809C7C: ;0x03809C7C
- .space 0x03809CBC - 0x03809C7C
-
- .global _03809CBC
-_03809CBC: ;0x03809CBC
- .space 0x03809CC0 - 0x03809CBC
-
- .global _03809CC0
-_03809CC0: ;0x03809CC0
- .space 0x03809E40 - 0x03809CC0
-
- .global _03809E40
-_03809E40: ;0x03809E40
- .space 0x03809E4C - 0x03809E40
-
- .global _03809E4C
-_03809E4C: ;0x03809E4C
- .space 0x03809E50 - 0x03809E4C
-
- .global _03809E50
-_03809E50: ;0x03809E50
- .space 0x03809E54 - 0x03809E50
-
- .global _03809E54
-_03809E54: ;0x03809E54
- .space 0x03809E80 - 0x03809E54
-
- .global _03809E80
-_03809E80: ;0x03809E80
- .space 0x03809F28 - 0x03809E80
-
- .global _03809F28
-_03809F28: ;0x03809F28
- .space 0x03809F2C - 0x03809F28
-
- .global PMi_KeyPattern
-PMi_KeyPattern: ;0x03809F2C
- .space 0x03809F30 - 0x03809F2C
-
- .global PMi_TriggerBL
-PMi_TriggerBL: ;0x03809F30
- .space 0x03809F34 - 0x03809F30
-
- .global PMi_Initialized
-PMi_Initialized: ;0x03809F34
- .space 0x03809F38 - 0x03809F34
-
- .global PMi_Work
-PMi_Work: ;0x03809F38
- .space 0x03809F64 - 0x03809F38
-
- .global _03809F64
-_03809F64: ;0x03809F64
- .space 0x03809F68 - 0x03809F64
-
- .global PMi_BlinkPatternNo
-PMi_BlinkPatternNo: ;0x03809F68
- .space 0x03809F6C - 0x03809F68
-
- .global _03809F6C
-_03809F6C: ;0x03809F6C
- .space 0x03809FA8 - 0x03809F6C
-
- .global _03809FA8
-_03809FA8: ;0x03809FA8
- .space 0x03809FB8 - 0x03809FA8
-
- .global CTRDGi_Work
-CTRDGi_Work: ;0x03809FB8
- .space 0x03809FBC - 0x03809FB8
-
- .global _03809FBC
-_03809FBC: ;0x03809FBC
- .space 0x03809FC0 - 0x03809FBC
-
- .global current_vib
-current_vib: ;0x03809FC0
- .space 0x03809FC4 - 0x03809FC0
-
- .global _03809FC4
-_03809FC4: ;0x03809FC4
- .space 0x03809FC8 - 0x03809FC4
-
- .global _03809FC8
-_03809FC8: ;0x03809FC8
- .space 0x03809FCC - 0x03809FC8
-
- .global _03809FCC
-_03809FCC: ;0x03809FCC
- .space 0x03809FD0 - 0x03809FCC
-
- .global _03809FD0
-_03809FD0: ;0x03809FD0
- .space 0x03809FD4 - 0x03809FD0
-
- .global _03809FD4
-_03809FD4: ;0x03809FD4
- .space 0x03809FEC - 0x03809FD4
-
- .global _03809FEC
-_03809FEC: ;0x03809FEC
- .space 0x0380A018 - 0x03809FEC
-
.global _0380A018
_0380A018: ;0x0380A018
.space 0x0380A038 - 0x0380A018
diff --git a/arm7/asm/wram_data.s b/arm7/asm/wram_data.s
deleted file mode 100644
index 05fd5b66..00000000
--- a/arm7/asm/wram_data.s
+++ /dev/null
@@ -1,56 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .data
-
- .global PMi_LEDStatus
-PMi_LEDStatus:
- .word 0x00000001
-
- .global PMi_BlinkPatternData
-PMi_BlinkPatternData:
- .word 0x00000000
- .word 0xAA000000
- .word 0x00010008
- .word 0x00000000
- .word 0xCC000000
- .word 0x00010008
- .word 0x00000000
- .word 0xE3800000
- .word 0x0001000C
- .word 0x00000000
- .word 0xF0F00000
- .word 0x00010010
- .word 0x00000000
- .word 0xF83E0000
- .word 0x00010014
- .word 0x00000000
- .word 0xFC000000
- .word 0x0001000C
- .word 0x00000000
- .word 0xFF000000
- .word 0x00010010
- .word 0x00000000
- .word 0xFFC00000
- .word 0x00010014
- .word 0x00000000
- .word 0xFF000000
- .word 0x00010020
- .word 0x00000000
- .word 0xFF00FF00
- .word 0x00010020
- .word 0x00000000
- .word 0xFFFFFF00
- .word 0x00010020
- .word 0x00000000
- .word 0xC3000000
- .word 0x00020028
-
- .global _03807704
-_03807704:
- .word 0x00000001
-
- .global _03807708
-_03807708:
- .word 0xFFFFFFFF
- .balign 2, 0 ; Don't pad with nop
diff --git a/arm7/global.inc b/arm7/global.inc
index a732f7df..1b3a3fc5 100644
--- a/arm7/global.inc
+++ b/arm7/global.inc
@@ -222,13 +222,38 @@
.extern FUN_037FE918
.extern FUN_037FE968
.extern FUN_037FE9B8
+.extern SPIi_CheckEntry
+.extern SPIi_CheckException
+.extern SPIi_GetException
+.extern SPIi_ReleaseException
+.extern SPIi_ReturnResult
+.extern SPIi_SetEntry
.extern SPI_Init
+.extern FUN_03801660
+.extern FUN_038016A8
.extern PMi_ResetControl
.extern PMi_SetControl
+.extern PMi_SetLED
+.extern PM_AnalyzeCommand
+.extern PM_ExecuteProcess
+.extern PM_Init
.extern PM_SelfBlinkProc
+.extern MIC_AnalyzeCommand
+.extern MIC_ExecuteProcess
+.extern MIC_Init
+.extern TP_AnalyzeCommand
+.extern TP_ExecuteProcess
+.extern TP_Init
+.extern CTRDGi_InitCommon
+.extern CTRDGi_SendtoPxi
.extern CTRDG_CheckPullOut_Polling
.extern CTRDG_VibPulseEdgeUpdate
.extern CTRDG_Init
+.extern CTRDG_IsExisting
+.extern CTRDG_IsPulledOut
+.extern NVRAM_AnalyzeCommand
+.extern NVRAM_ExecuteProcess
+.extern NVRAM_Init
.extern NVRAM_ReadDataBytes
.extern RTC_Init
.extern WVR_Shutdown
@@ -310,6 +335,7 @@
.extern _038072BC
.extern _038072C0
.extern _038072C4
+.extern _038072C8
.extern SVC_CpuSet
.extern SVC_GetCRC16
.extern SVC_GetPitchTable
diff --git a/arm7/lib/include/MI_dma.h b/arm7/lib/include/MI_dma.h
index b728f814..e65f0b89 100644
--- a/arm7/lib/include/MI_dma.h
+++ b/arm7/lib/include/MI_dma.h
@@ -1,7 +1,7 @@
-#ifndef GUARD_MI_DMA_H
-#define GUARD_MI_DMA_H
+#ifndef POKEDIAMOND_ARM7_MI_DMA_H
+#define POKEDIAMOND_ARM7_MI_DMA_H
-#include "nitro/dma.h"
+#include "nitro/MI_dma_shared.h"
#include "nitro/types.h"
void MI_StopDma(u32 channel);
diff --git a/arm7/lib/include/MI_memory.h b/arm7/lib/include/MI_memory.h
index cb0c53fc..53398ec5 100644
--- a/arm7/lib/include/MI_memory.h
+++ b/arm7/lib/include/MI_memory.h
@@ -12,4 +12,14 @@ void MIi_CpuCopyFast(register u32 * src, register u32 * dst, register u32 size);
void MI_CpuFill8(register u8 value, register u8 * dst, register u32 size);
void MI_CpuCopy8(register u8 * src, register u8 * dst, register u32 size);
+static inline void MI_CpuFill32(void *dest, u32 data, u32 size)
+{
+ MIi_CpuClear32(data, dest, size);
+}
+
+static inline void MI_CpuClear32(void *dest, u32 size)
+{
+ MI_CpuFill32(dest, 0, size);
+}
+
#endif
diff --git a/arm7/lib/include/OS_alarm.h b/arm7/lib/include/OS_alarm.h
new file mode 100644
index 00000000..8ae89e97
--- /dev/null
+++ b/arm7/lib/include/OS_alarm.h
@@ -0,0 +1,9 @@
+#ifndef POKEDIAMOND_ARM7_OS_ALARM_H
+#define POKEDIAMOND_ARM7_OS_ALARM_H
+
+#include "nitro/OS_alarm_shared.h"
+
+void OS_CreateAlarm(OSAlarm *alarm);
+void OS_SetAlarm(OSAlarm *alarm, OSTick tick, OSAlarmHandler handler, void *arg);
+
+#endif //POKEDIAMOND_ARM7_OS_ALARM_H
diff --git a/arm7/lib/include/OS_context.h b/arm7/lib/include/OS_context.h
new file mode 100644
index 00000000..b01ccb8b
--- /dev/null
+++ b/arm7/lib/include/OS_context.h
@@ -0,0 +1,20 @@
+#ifndef POKEDIAMOND_ARM7_OS_CONTEXT_H
+#define POKEDIAMOND_ARM7_OS_CONTEXT_H
+
+#include "nitro/types.h"
+
+typedef struct OSContext
+{
+ u32 cpsr;
+ u32 r[13];
+ u32 sp;
+ u32 lr;
+ u32 pc_plus4;
+ u32 sp_svc;
+} OSContext;
+
+extern u32 OS_SaveContext(OSContext *context);
+extern void OS_LoadContext(OSContext *context);
+extern void OS_InitContext(OSContext *context, u32 func, u32 stack);
+
+#endif //POKEDIAMOND_ARM7_OS_CONTEXT_H
diff --git a/arm7/lib/include/OS_init.h b/arm7/lib/include/OS_init.h
index c90740c2..03d64ae1 100644
--- a/arm7/lib/include/OS_init.h
+++ b/arm7/lib/include/OS_init.h
@@ -6,6 +6,10 @@
#include "OS_arena.h"
#include "OS_alloc.h"
#include "OS_reset.h"
+#include "OS_terminate_proc.h"
+#include "OS_spinLock.h"
+#include "OS_context.h"
+#include "OS_interrupt.h"
void OS_Init(void);
diff --git a/arm7/lib/include/OS_interrupt.h b/arm7/lib/include/OS_interrupt.h
index afcb9b5f..fb869483 100644
--- a/arm7/lib/include/OS_interrupt.h
+++ b/arm7/lib/include/OS_interrupt.h
@@ -2,5 +2,22 @@
#define POKEDIAMOND_ARM7_OS_INTERRUPT_H
#include "nitro/OS_interrupt_shared.h"
+#include "consts.h"
+
+extern OSIrqFunction OS_IRQTable[];
+extern OSIrqCallbackInfo OSi_IrqCallbackInfo[9];
+
+static inline void OSi_SetVBlankCount(u32 count)
+{
+ *(u32 *)HW_VBLANK_COUNT_BUF = count;
+}
+
+void OS_InitIrqTable(void);
+void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function);
+void OSi_EnterTimerCallback(u32 timerNo, void (*callback) (void *), void *arg);
+OSIrqMask OS_SetIrqMask(OSIrqMask mask);
+OSIrqMask OS_EnableIrqMask(OSIrqMask mask);
+OSIrqMask OS_DisableIrqMask(OSIrqMask mask);
+OSIrqMask OS_ResetRequestIrqMask(OSIrqMask mask);
#endif //POKEDIAMOND_ARM7_OS_INTERRUPT_H
diff --git a/arm7/lib/include/OS_mutex.h b/arm7/lib/include/OS_mutex.h
index 6b8da6a8..216da68c 100644
--- a/arm7/lib/include/OS_mutex.h
+++ b/arm7/lib/include/OS_mutex.h
@@ -1,9 +1,10 @@
-#ifndef GUARD_OS_MUTEX_H
-#define GUARD_OS_MUTEX_H
+#ifndef POKEDIAMOND_ARM7_OS_MUTEX_H
+#define POKEDIAMOND_ARM7_OS_MUTEX_H
+#include "OS_context.h"
#include "nitro/OS_mutex_shared.h"
-#include "nitro/types.h"
void OS_InitMutex(OSMutex* mutex);
+void OSi_UnlockAllMutex(OSThread * thread);
-#endif
+#endif //POKEDIAMOND_ARM7_OS_MUTEX_H
diff --git a/arm7/lib/include/OS_spinLock.h b/arm7/lib/include/OS_spinLock.h
new file mode 100644
index 00000000..f7366d1f
--- /dev/null
+++ b/arm7/lib/include/OS_spinLock.h
@@ -0,0 +1,28 @@
+#ifndef POKEDIAMOND_ARM7_OS_SPINLOCK_H
+#define POKEDIAMOND_ARM7_OS_SPINLOCK_H
+
+#include "consts.h"
+#include "nitro/OS_spinLock_shared.h"
+#include "syscall.h"
+
+void OS_InitLock(void);
+void FUN_037F8CB4(s32 ct);
+s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void), BOOL disableFiq);
+s32 OSi_DoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), BOOL disableFIQ);
+s32 OSi_DoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void), BOOL disableFiq);
+s32 OS_LockCartridge(u16 lockID);
+s32 OS_UnlockCartridge(u16 lockID);
+s32 OS_TryLockCartridge(u16 lockID);
+void OSi_AllocateCartridgeBus(void);
+void OSi_FreeCartridgeBus(void);
+u16 OS_ReadOwnerOfLockWord(OSLockWord * lock);
+s32 OS_UnLockCartridge(u16 lockID);
+s32 OS_GetLockID(void);
+void OS_ReleaseLockID(register u16 lockID);
+
+static inline void OSi_WaitByLoop(void)
+{
+ FUN_037F8CB4(0x1000 / 4);
+}
+
+#endif //POKEDIAMOND_ARM7_OS_SPINLOCK_H
diff --git a/arm7/lib/include/OS_terminate_proc.h b/arm7/lib/include/OS_terminate_proc.h
new file mode 100644
index 00000000..ea2273c8
--- /dev/null
+++ b/arm7/lib/include/OS_terminate_proc.h
@@ -0,0 +1,6 @@
+#ifndef POKEDIAMOND_ARM7_OS_TERMINATE_PROC_H
+#define POKEDIAMOND_ARM7_OS_TERMINATE_PROC_H
+
+void OS_Terminate(void);
+
+#endif //POKEDIAMOND_ARM7_OS_TERMINATE_PROC_H
diff --git a/arm7/lib/include/OS_thread.h b/arm7/lib/include/OS_thread.h
new file mode 100644
index 00000000..b1d3a01b
--- /dev/null
+++ b/arm7/lib/include/OS_thread.h
@@ -0,0 +1,36 @@
+#ifndef POKEDIAMOND_ARM7_OS_THREAD_H
+#define POKEDIAMOND_ARM7_OS_THREAD_H
+
+#include "OS_context.h"
+#include "nitro/OS_thread_shared.h"
+
+static s32 OSi_GetUnusedThreadId(void);
+static void OSi_InsertLinkToQueue(OSThreadQueue *queue, OSThread *thread);
+static OSThread *OSi_RemoveLinkFromQueue(OSThreadQueue *queue);
+static OSThread *OSi_RemoveSpecifiedLinkFromQueue(OSThreadQueue *queue, OSThread *thread);
+OSMutex *OSi_RemoveMutexLinkFromQueue(OSMutexQueue *queue);
+static void OSi_InsertThreadToList(OSThread *thread);
+static void OSi_RemoveThreadFromList(OSThread *thread);
+static void OSi_RescheduleThread(void);
+void OS_InitThread(void);
+void OS_CreateThread(OSThread *thread, void (*func) (void *), void *arg, void *stack, u32 stackSize, u32 prio);
+void OS_ExitThread(void);
+static void OSi_ExitThread_ArgSpecified(OSThread *thread, void *arg);
+static void OSi_ExitThread(void *arg);
+static void OSi_ExitThread_Destroy(void);
+void OS_JoinThread(OSThread *thread);
+BOOL OS_IsThreadTerminated(const OSThread *thread);
+void OS_SleepThread(OSThreadQueue *queue);
+void OS_WakeupThread(OSThreadQueue *queue);
+void OS_WakeupThreadDirect(OSThread *thread);
+OSThread *OS_SelectThread(void);
+void OS_RescheduleThread(void);
+BOOL OS_SetThreadPriority(OSThread *thread, u32 prio);
+void OS_Sleep(u32 msec);
+static void OSi_SleepAlarmCallback(void *arg);
+OSSwitchThreadCallback OS_SetSwitchThreadCallback(OSSwitchThreadCallback callback);
+u32 OS_DisableScheduler(void);
+u32 OS_EnableScheduler(void);
+void OS_SetThreadDestructor(OSThread *thread, OSThreadDestructor dtor);
+
+#endif //POKEDIAMOND_ARM7_OS_THREAD_H
diff --git a/arm7/lib/include/consts.h b/arm7/lib/include/consts.h
index dd297402..a6c4c393 100644
--- a/arm7/lib/include/consts.h
+++ b/arm7/lib/include/consts.h
@@ -3,5 +3,7 @@
#include "nitro/consts_shared.h"
#include "mmap.h"
+#include "registers.h"
+#include "systemWork.h"
#endif //POKEDIAMOND_ARM7_CONSTS_H
diff --git a/arm7/lib/include/mmap.h b/arm7/lib/include/mmap.h
index 24d15ad7..1b403dc5 100644
--- a/arm7/lib/include/mmap.h
+++ b/arm7/lib/include/mmap.h
@@ -23,4 +23,7 @@
#define HW_PRV_WRAM_SYSRV (HW_PRV_WRAM + HW_PRV_WRAM_SIZE - HW_PRV_WRAM_SYSRV_SIZE)
+#define HW_VBLANK_COUNT_BUF (HW_MAIN_MEM + 0x007ffc3c)
+#define HW_LOCK_ID_FLAG_SUB (HW_MAIN_MEM + 0x007fffb8)
+
#endif //POKEDIAMOND_ARM7_MMAP_H
diff --git a/arm7/lib/include/registers.h b/arm7/lib/include/registers.h
new file mode 100644
index 00000000..4ef8bdfb
--- /dev/null
+++ b/arm7/lib/include/registers.h
@@ -0,0 +1,6 @@
+#ifndef POKEDIAMOND_ARM7_REGISTERS_H
+#define POKEDIAMOND_ARM7_REGISTERS_H
+
+#include "nitro/registers_shared.h"
+
+#endif //POKEDIAMOND_ARM7_REGISTERS_H
diff --git a/arm7/lib/include/syscall.h b/arm7/lib/include/syscall.h
new file mode 100644
index 00000000..55462cc7
--- /dev/null
+++ b/arm7/lib/include/syscall.h
@@ -0,0 +1,6 @@
+#ifndef POKEDIAMOND_ARM7_SYSCALL_H
+#define POKEDIAMOND_ARM7_SYSCALL_H
+
+void SVC_WaitByLoop(u32 ct);
+
+#endif //POKEDIAMOND_ARM7_SYSCALL_H
diff --git a/arm7/lib/include/systemWork.h b/arm7/lib/include/systemWork.h
new file mode 100644
index 00000000..95a17845
--- /dev/null
+++ b/arm7/lib/include/systemWork.h
@@ -0,0 +1,7 @@
+#ifndef POKEDIAMOND_ARM7_SYSTEMWORK_H
+#define POKEDIAMOND_ARM7_SYSTEMWORK_H
+
+#include "OS_context.h"
+#include "nitro/OS_systemWork_shared.h"
+
+#endif //POKEDIAMOND_ARM7_SYSTEMWORK_H
diff --git a/arm7/lib/src/OS_init.c b/arm7/lib/src/OS_init.c
index 583bb75e..271d067b 100644
--- a/arm7/lib/src/OS_init.c
+++ b/arm7/lib/src/OS_init.c
@@ -2,8 +2,6 @@
#include "OS_init.h"
extern void PXI_Init(void);
-extern void OS_InitLock(void);
-extern void OS_InitIrqTable(void);
extern void OS_InitTick(void);
extern void OS_InitAlarm(void);
extern void OS_InitThread(void);
diff --git a/arm7/lib/src/OS_interrupt.c b/arm7/lib/src/OS_interrupt.c
new file mode 100644
index 00000000..e9fc3347
--- /dev/null
+++ b/arm7/lib/src/OS_interrupt.c
@@ -0,0 +1,106 @@
+#include "function_target.h"
+#include "consts.h"
+#include "OS_interrupt.h"
+#include "OS_thread.h"
+
+extern OSThreadQueue OSi_IrqThreadQueue;
+
+ARM_FUNC void OS_InitIrqTable(void)
+{
+ OS_InitThreadQueue(&OSi_IrqThreadQueue);
+
+ OSi_SetVBlankCount(0);
+}
+
+ARM_FUNC void OS_SetIrqFunction(OSIrqMask intrBit, OSIrqFunction function)
+{
+ s32 i;
+ OSIrqCallbackInfo *info;
+
+ for (i = 0; i < 25; i++)
+ {
+ if (intrBit & 1)
+ {
+ info = NULL;
+
+ if (8 <= i && i <= 11)
+ {
+ info = &OSi_IrqCallbackInfo[i - 8];
+ }
+ else if (3 <= i && i <= 6)
+ {
+ info = &OSi_IrqCallbackInfo[i - 3 + 4];
+ }
+ else if (0 == i)
+ {
+ info = &OSi_IrqCallbackInfo[8];
+ }
+ else
+ {
+ OS_IRQTable[i] = function;
+ }
+
+ if (info)
+ {
+ info->func = (void (*)(void *))function;
+ info->arg = 0;
+ info->enable = TRUE;
+ }
+ }
+ intrBit >>= 1;
+ }
+}
+
+ARM_FUNC void OSi_EnterTimerCallback(u32 timerNo, void (*callback) (void *), void *arg)
+{
+ OSIrqMask mask = 1UL << (timerNo + 3);
+ OSi_IrqCallbackInfo[timerNo + 4].func = callback;
+ OSi_IrqCallbackInfo[timerNo + 4].arg = arg;
+
+ (void)OS_EnableIrqMask(mask);
+ OSi_IrqCallbackInfo[timerNo + 4].enable = TRUE;
+}
+
+ARM_FUNC OSIrqMask OS_SetIrqMask(OSIrqMask mask)
+{
+ u16 regIme = reg_OS_IME;
+ reg_OS_IME = 0;
+ OSIrqMask regIe = reg_OS_IE;
+ reg_OS_IE = mask;
+ u16 unused = reg_OS_IME; //needed because otherwise it doesn't match
+ reg_OS_IME = regIme;
+ return regIe;
+}
+
+ARM_FUNC OSIrqMask OS_EnableIrqMask(OSIrqMask mask)
+{
+ u16 regIme = reg_OS_IME;
+ reg_OS_IME = 0;
+ OSIrqMask regIe = reg_OS_IE;
+ reg_OS_IE = regIe | mask;
+ u16 unused = reg_OS_IME;
+ reg_OS_IME = regIme;
+ return regIe;
+}
+
+ARM_FUNC OSIrqMask OS_DisableIrqMask(OSIrqMask mask)
+{
+ u16 regIme = reg_OS_IME;
+ reg_OS_IME = 0;
+ OSIrqMask regIe = reg_OS_IE;
+ reg_OS_IE = regIe & ~mask;
+ u16 unused = reg_OS_IME;
+ reg_OS_IME = regIme;
+ return regIe;
+}
+
+ARM_FUNC OSIrqMask OS_ResetRequestIrqMask(OSIrqMask mask)
+{
+ u16 regIme = reg_OS_IME;
+ reg_OS_IME = 0;
+ OSIrqMask regIf = reg_OS_IF;
+ reg_OS_IF = mask;
+ u16 unused = reg_OS_IME;
+ reg_OS_IME = regIme;
+ return regIf;
+}
diff --git a/arm7/lib/src/OS_reset.c b/arm7/lib/src/OS_reset.c
index c40fcff3..e0f380f8 100644
--- a/arm7/lib/src/OS_reset.c
+++ b/arm7/lib/src/OS_reset.c
@@ -1,6 +1,7 @@
#include "function_target.h"
#include "OS_reset.h"
#include "OS_interrupt.h"
+#include "OS_terminate_proc.h"
static u16 OSi_IsInitReset = 0;
vu16 OSi_IsResetOccurred = 0;
@@ -10,7 +11,6 @@ extern OSIrqMask OS_SetIrqMask(OSIrqMask mask);
extern OSIrqMask OS_ResetRequestIrqMask(OSIrqMask mask);
extern void SND_Shutdown(void);
extern void PXI_SetFifoRecvCallback(u32 param1, void* callback);
-extern void OS_Terminate(void);
extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2);
extern void FUN_038073EC(void); //OSi_DoResetSystem, in wram
diff --git a/arm7/lib/src/OS_spinLock.c b/arm7/lib/src/OS_spinLock.c
new file mode 100644
index 00000000..2857de05
--- /dev/null
+++ b/arm7/lib/src/OS_spinLock.c
@@ -0,0 +1,192 @@
+#include "function_target.h"
+#include "OS_spinLock.h"
+#include "OS_system.h"
+#include "MI_swap.h"
+
+ARM_FUNC void OS_InitLock(void)
+{
+ static BOOL isInitialized = FALSE;
+
+ if (isInitialized)
+ return;
+ isInitialized = TRUE;
+
+ OSLockWord *lockp = (OSLockWord *)HW_INIT_LOCK_BUF;
+
+ lockp->extension = 0;
+ while (lockp->ownerID != 0x7f)
+ {
+ OSi_WaitByLoop();
+ }
+
+ ((u32 *)HW_LOCK_ID_FLAG_SUB)[0] = 0xffffffff;
+ ((u32 *)HW_LOCK_ID_FLAG_SUB)[1] = 0xffff0000;
+
+ lockp->extension = 0xbf;
+}
+
+ARM_FUNC void FUN_037F8CB4(s32 ct)
+{
+ SVC_WaitByLoop((u32)ct); //todo this should be linker generated, figure out why it broke
+}
+
+ARM_FUNC s32 OSi_DoLockByWord(u16 lockId, OSLockWord *lockp, void (*ctrlFuncp) (void),
+ BOOL disableFiq)
+{
+ s32 lastLockFlag;
+ while ((lastLockFlag = OSi_DoTryLockByWord(lockId, lockp, ctrlFuncp, disableFiq)) > 0) {
+ OSi_WaitByLoop();
+ }
+
+ return lastLockFlag;
+}
+
+ARM_FUNC s32 OSi_DoUnlockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void),
+ BOOL disableFIQ)
+{
+ if (lockID != lockp->ownerID)
+ {
+ return -2;
+ }
+
+ OSIntrMode lastIntrMode = (disableFIQ) ? OS_DisableInterrupts_IrqAndFiq() : OS_DisableInterrupts();
+ lockp->ownerID = 0;
+ if (ctrlFuncp)
+ {
+ ctrlFuncp();
+ }
+ lockp->lockFlag = 0;
+ if (disableFIQ)
+ {
+ (void)OS_RestoreInterrupts_IrqAndFiq(lastIntrMode);
+ }
+ else
+ {
+ (void)OS_RestoreInterrupts(lastIntrMode);
+ }
+ return 0;
+}
+
+ARM_FUNC s32 OSi_DoTryLockByWord(u16 lockID, OSLockWord *lockp, void (*ctrlFuncp) (void),
+ BOOL disableFiq)
+{
+ OSIntrMode lastIntrMode = (disableFiq) ? OS_DisableInterrupts_IrqAndFiq() : OS_DisableInterrupts();
+
+ s32 lastLockFlag = (s32)MI_SwapWord(lockID, (u32 *)&lockp->lockFlag);
+
+ if (!lastLockFlag)
+ {
+ if (ctrlFuncp)
+ {
+ ctrlFuncp();
+ }
+ lockp->ownerID = lockID;
+ }
+
+ if (disableFiq)
+ {
+ (void)OS_RestoreInterrupts_IrqAndFiq(lastIntrMode);
+ }
+ else
+ {
+ (void)OS_RestoreInterrupts(lastIntrMode);
+ }
+
+ return lastLockFlag;
+}
+
+ARM_FUNC s32 OS_LockCartridge(u16 lockID)
+{
+ return OSi_DoLockByWord(lockID, (OSLockWord *)HW_CTRDG_LOCK_BUF, OSi_AllocateCartridgeBus, TRUE);
+}
+
+ARM_FUNC s32 OS_UnlockCartridge(u16 lockID)
+{
+ return OSi_DoUnlockByWord(lockID, (OSLockWord *)HW_CTRDG_LOCK_BUF, OSi_FreeCartridgeBus, TRUE);
+}
+
+ARM_FUNC s32 OS_TryLockCartridge(u16 lockID)
+{
+ return OSi_DoTryLockByWord(lockID, (OSLockWord *)HW_CTRDG_LOCK_BUF, OSi_AllocateCartridgeBus, TRUE);
+}
+
+ARM_FUNC void OSi_AllocateCartridgeBus(void)
+{
+ //noop
+}
+
+ARM_FUNC void OSi_FreeCartridgeBus(void)
+{
+ //noop
+}
+
+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_SUB
+ ldr r1, [r3]
+ mov r2, #0
+ mov r0, #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, #0x80
+ bne _037F8A98
+ add r3, r3, #4
+ ldr r1, [r3]
+ mov r2, #0
+ mov r0, #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, =0xFFFFFFFD
+ bxeq lr
+ mov r0, #160
+_037F8A98:
+ add r0, r0, r2
+ mov r1, #0x80000000
+ mov r1, r1, lsr r2
+ ldr r2, [r3]
+ bic r2, r2, r1
+ str r2, [r3]
+ bx lr
+}
+
+ARM_FUNC asm void OS_ReleaseLockID(register u16 lockID)
+{
+ ldr r3, =HW_LOCK_ID_FLAG_SUB
+ cmp r0, #0xa0
+ addpl r3, r3, #0x4
+ subpl r0, r0, #0xa0
+ submi r0, r0, #0x80
+ mov r1, #0x80000000
+ mov r1, r1, lsr r0
+ ldr r2, [r3, #0x0]
+ orr r2, r2, r1
+ str r2, [r3, #0x0]
+ bx lr
+}
diff --git a/arm7/lib/src/OS_system.c b/arm7/lib/src/OS_system.c
index 11417e91..503bd854 100644
--- a/arm7/lib/src/OS_system.c
+++ b/arm7/lib/src/OS_system.c
@@ -1,7 +1,6 @@
#include "function_target.h"
#include "OS_system.h"
-
-extern void FUN_037F8CB4(s32 count);
+#include "OS_spinLock.h"
ARM_FUNC asm OSIntrMode OS_EnableInterrupts(void)
{
diff --git a/arm7/lib/src/OS_terminate_proc.c b/arm7/lib/src/OS_terminate_proc.c
new file mode 100644
index 00000000..23793fd4
--- /dev/null
+++ b/arm7/lib/src/OS_terminate_proc.c
@@ -0,0 +1,17 @@
+#include "function_target.h"
+#include "nitro/types.h"
+#include "OS_terminate_proc.h"
+#include "OS_system.h"
+
+extern void CTRDG_VibPulseEdgeUpdate(u32 param);
+extern void FUN_037F8530(void); //SVC_Halt
+
+ARM_FUNC void OS_Terminate(void)
+{
+ CTRDG_VibPulseEdgeUpdate(0);
+ while (TRUE)
+ {
+ (void)OS_DisableInterrupts();
+ FUN_037F8530(); //SVC_Halt
+ }
+}
diff --git a/arm7/lib/src/OS_thread.c b/arm7/lib/src/OS_thread.c
new file mode 100644
index 00000000..be3f611d
--- /dev/null
+++ b/arm7/lib/src/OS_thread.c
@@ -0,0 +1,597 @@
+#include "OS_thread.h"
+#include "function_target.h"
+#include "OS_system.h"
+#include "consts.h"
+#include "OS_terminate_proc.h"
+#include "OS_mutex.h"
+#include "OS_alarm.h"
+#include "OS_context.h"
+#include "nitro/OS_systemWork_shared.h"
+#include "MI_memory.h"
+
+extern void SDK_SYS_STACKSIZE(void);
+extern void SDK_IRQ_STACKSIZE(void);
+
+u32 OSi_RescheduleCount = 0;
+
+void *OSi_StackForDestructor = NULL;
+
+OSThreadInfo OSi_ThreadInfo;
+
+BOOL OSi_IsThreadInitialized = FALSE;
+
+OSThread **OSi_CurrentThreadPtr = NULL;
+
+void *OSi_SystemCallbackInSwitchThread = NULL;
+
+static s32 OSi_ThreadIdCount = 0;
+
+OSThread OSi_LauncherThread;
+OSThread OSi_IdleThread;
+
+ARM_FUNC static s32 OSi_GetUnusedThreadId(void)
+{
+ return ++OSi_ThreadIdCount;
+}
+
+ARM_FUNC static void OSi_InsertLinkToQueue(OSThreadQueue *queue, OSThread *thread)
+{
+ OSThread *next = queue->head;
+
+ while (next && next->priority <= thread->priority)
+ {
+ if (next == thread)
+ return;
+ next = next->link.next;
+ }
+
+ if (!next)
+ {
+ OSThread *prev = queue->tail;
+
+ if (!prev)
+ {
+ queue->head = thread;
+ }
+ else
+ {
+ prev->link.next = thread;
+ }
+
+ thread->link.prev = prev;
+ thread->link.next = NULL;
+ queue->tail = thread;
+ }
+ else
+ {
+ OSThread *prev = next->link.prev;
+
+ if (!prev)
+ {
+ queue->head = thread;
+ }
+ else
+ {
+ prev->link.next = thread;
+ }
+
+ thread->link.prev = prev;
+ thread->link.next = next;
+ next->link.prev = thread;
+ }
+}
+
+ARM_FUNC static OSThread *OSi_RemoveLinkFromQueue(OSThreadQueue *queue)
+{
+ OSThread *thread = queue->head;
+
+ if (thread)
+ {
+ OSThread *next = thread->link.next;
+
+ queue->head = next;
+
+ if (next)
+ {
+ next->link.prev = NULL;
+ }
+ else
+ {
+ queue->tail = NULL;
+ thread->queue = NULL;
+ }
+ }
+
+ return thread;
+}
+
+ARM_FUNC static OSThread *OSi_RemoveSpecifiedLinkFromQueue(OSThreadQueue *queue, OSThread *thread)
+{
+ OSThread *queueHead = queue->head;
+
+ while (queueHead)
+ {
+ OSThread *next = queueHead->link.next;
+
+ if (queueHead == thread)
+ {
+ OSThread *prev = queueHead->link.prev;
+
+ if (queue->head == queueHead)
+ {
+ queue->head = next;
+ }
+ else
+ {
+ prev->link.next = next;
+ }
+
+ if (queue->tail == queueHead)
+ {
+ queue->tail = prev;
+ }
+ else
+ {
+ next->link.prev = prev;
+ }
+
+ break;
+ }
+
+ queueHead = next;
+ }
+
+ return queueHead;
+}
+
+ARM_FUNC OSMutex *OSi_RemoveMutexLinkFromQueue(OSMutexQueue *queue)
+{
+ OSMutex *mutexHead = queue->head;
+
+ if (mutexHead)
+ {
+ OSMutex *next = mutexHead->link.next;
+
+ queue->head = next;
+
+ if (next)
+ {
+ next->link.prev = NULL;
+ }
+ else
+ {
+ queue->tail = NULL;
+ }
+ }
+
+ return mutexHead;
+}
+
+ARM_FUNC static void OSi_InsertThreadToList(OSThread *thread)
+{
+ OSThread *t = OSi_ThreadInfo.list;
+ OSThread *pre = NULL;
+
+ while(t && t->priority < thread->priority)
+ {
+ pre = t;
+ t = t->next;
+ }
+
+ if (!pre)
+ {
+ thread->next = OSi_ThreadInfo.list;
+ OSi_ThreadInfo.list = thread;
+ }
+ else
+ {
+ thread->next = pre->next;
+ pre->next = thread;
+ }
+}
+
+ARM_FUNC static void OSi_RemoveThreadFromList(OSThread *thread)
+{
+ OSThread *t = OSi_ThreadInfo.list;
+ OSThread *pre = NULL;
+
+ while (t && t != thread)
+ {
+ pre = t;
+ t = t-> next;
+ }
+
+ if (!pre)
+ {
+ OSi_ThreadInfo.list = thread->next;
+ }
+ else
+ {
+ pre->next = thread->next;
+ }
+}
+
+ARM_FUNC static void OSi_RescheduleThread(void)
+{
+ if (OSi_RescheduleCount <= 0)
+ {
+ OSThreadInfo *info = &OSi_ThreadInfo;
+ if (info->irqDepth > 0 || OS_GetProcMode() == OS_PROCMODE_IRQ)
+ {
+ info->isNeedRescheduling = TRUE;
+ }
+ else
+ {
+ OSThread *currentThread = OSi_GetCurrentThread();
+ OSThread *nextThread = OS_SelectThread();
+
+ if (currentThread == nextThread || !nextThread)
+ return;
+
+ if (currentThread->state != OS_THREAD_STATE_TERMINATED
+ && OS_SaveContext(&currentThread->context))
+ return;
+
+ if (OSi_SystemCallbackInSwitchThread)
+ {
+ ((OSSwitchThreadCallback)OSi_SystemCallbackInSwitchThread) (currentThread, nextThread);
+ }
+
+ if (info->switchCallback)
+ {
+ ((OSSwitchThreadCallback)info->switchCallback) (currentThread, nextThread);
+ }
+
+ OS_SetCurrentThread(nextThread);
+
+ OS_LoadContext(&nextThread->context);
+ }
+ }
+}
+
+ARM_FUNC void OS_InitThread(void)
+{
+ if (OSi_IsThreadInitialized)
+ return;
+ OSi_IsThreadInitialized = TRUE;
+
+ OSi_CurrentThreadPtr = &(OSi_ThreadInfo.current);
+
+ OSi_LauncherThread.priority = OS_THREAD_LAUNCHER_PRIORITY;
+ OSi_LauncherThread.id = 0;
+ OSi_LauncherThread.state = OS_THREAD_STATE_READY;
+ OSi_LauncherThread.next = NULL;
+
+ OSi_LauncherThread.profiler = NULL;
+
+ OSi_ThreadInfo.list = &OSi_LauncherThread;
+
+ OS_SetCurrentThread(&OSi_LauncherThread);
+
+ void *stackLo = (((s32)SDK_SYS_STACKSIZE) <= 0) ?
+ (void *)((u32)HW_WRAM - (s32)SDK_SYS_STACKSIZE) :
+ (void *)((u32)(HW_PRV_WRAM_IRQ_STACK_END - (s32)SDK_IRQ_STACKSIZE) - (s32)SDK_SYS_STACKSIZE);
+
+ OSi_LauncherThread.stackBottom = (u32)(HW_PRV_WRAM_IRQ_STACK_END - (s32)SDK_IRQ_STACKSIZE);
+ OSi_LauncherThread.stackTop = (u32)stackLo;
+ OSi_LauncherThread.stackWarningOffset = 0;
+
+ //checksums
+ *(u32 *)(OSi_LauncherThread.stackBottom - sizeof(u32)) = 0xd73bfdf7UL;
+ *(u32 *)OSi_LauncherThread.stackTop = 0xfbdd37bbUL;
+
+ OS_InitThreadQueue(&OSi_LauncherThread.joinQueue);
+
+ OSi_ThreadInfo.isNeedRescheduling = FALSE;
+ OSi_ThreadInfo.irqDepth = 0;
+
+ OS_GetSystemWork()->threadinfo_subp = &OSi_ThreadInfo;
+
+ (void)OS_SetSwitchThreadCallback(NULL);
+}
+
+ARM_FUNC void OS_CreateThread(OSThread *thread, void (*func) (void *), void *arg, void *stack, u32 stackSize, u32 prio)
+{
+ OSIntrMode enable = OS_DisableInterrupts();
+
+ s32 index = OSi_GetUnusedThreadId();
+
+ thread->priority = prio;
+ thread->id = (u32)index;
+ thread->state = OS_THREAD_STATE_WAITING;
+
+ thread->profiler = NULL;
+
+ OSi_InsertThreadToList(thread);
+
+ thread->stackBottom = (u32)stack;
+ thread->stackTop = (u32)stack - stackSize;
+ thread->stackWarningOffset = 0;
+
+ *(u32 *)(thread->stackBottom - sizeof(u32)) = 0xd73bfdf7UL;
+ *(u32 *)thread->stackTop = 0xfbdd37bbUL;
+
+ OS_InitThreadQueue(&thread->joinQueue);
+
+ OS_InitContext(&thread->context, (u32)func, (u32)stack - 4);
+
+ thread->context.r[0] = (u32)arg;
+ thread->context.lr = (u32)OS_ExitThread;
+
+ MI_CpuClear32((void *)((u32)stack - stackSize + 4), stackSize - 8);
+
+ thread->mutex = NULL;
+ thread->mutexQueue.head = NULL;
+ thread->mutexQueue.tail = NULL;
+
+ OS_SetThreadDestructor(thread, NULL);
+
+ thread->queue = NULL;
+ thread->link.prev = thread->link.next = NULL;
+
+ MI_CpuClear32(&thread->specific[0], sizeof(void *) * OS_THREAD_SPECIFIC_MAX);
+
+ thread->alarmForSleep = NULL;
+
+ (void)OS_RestoreInterrupts(enable);
+}
+
+ARM_FUNC void OS_ExitThread(void)
+{
+ (void)OS_DisableInterrupts();
+ OSi_ExitThread_ArgSpecified(OS_GetCurrentThread(), 0);
+}
+
+ARM_FUNC static void OSi_ExitThread_ArgSpecified(OSThread *thread, void *arg)
+{
+ if (OSi_StackForDestructor)
+ {
+ OS_InitContext(&thread->context, (u32)OSi_ExitThread, (u32)OSi_StackForDestructor);
+ thread->context.r[0] = (u32)arg;
+ thread->context.cpsr |= HW_PSR_DISABLE_IRQ;
+ thread->state = OS_THREAD_STATE_READY;
+ OS_LoadContext(&thread->context);
+ }
+ else
+ {
+ OSi_ExitThread(arg);
+ }
+}
+
+ARM_FUNC static void OSi_ExitThread(void *arg)
+{
+ OSThread *currentThread = OSi_GetCurrentThread();
+ OSThreadDestructor destructor = currentThread->destructor;
+
+ if (destructor)
+ {
+ currentThread->destructor = NULL;
+ destructor(arg);
+ (void)OS_DisableInterrupts();
+ }
+
+ OSi_ExitThread_Destroy();
+}
+
+ARM_FUNC static void OSi_ExitThread_Destroy(void)
+{
+ OSThread *currentThread = OSi_GetCurrentThread();
+ (void)OS_DisableScheduler();
+
+ OSi_UnlockAllMutex(currentThread);
+
+ if (currentThread->queue)
+ {
+ (void)OSi_RemoveSpecifiedLinkFromQueue(currentThread->queue, currentThread);
+ }
+
+ OSi_RemoveThreadFromList(currentThread);
+
+ currentThread->state = OS_THREAD_STATE_TERMINATED;
+
+ OS_WakeupThread(&currentThread->joinQueue);
+
+ (void)OS_EnableScheduler();
+
+ OS_RescheduleThread();
+
+ OS_Terminate();
+}
+
+ARM_FUNC void OS_JoinThread(OSThread *thread)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ if (thread->state != OS_THREAD_STATE_TERMINATED)
+ {
+ OS_SleepThread(&thread->joinQueue);
+ }
+
+ (void)OS_RestoreInterrupts(enabled);
+}
+
+ARM_FUNC BOOL OS_IsThreadTerminated(const OSThread *thread)
+{
+ return (thread->state == OS_THREAD_STATE_TERMINATED) ? TRUE : FALSE;
+}
+
+ARM_FUNC void OS_SleepThread(OSThreadQueue *queue)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+ OSThread *currentThread = OSi_GetCurrentThread();
+
+ if (queue)
+ {
+ currentThread->queue = queue;
+ OSi_InsertLinkToQueue(queue, currentThread);
+ }
+
+ currentThread->state = OS_THREAD_STATE_WAITING;
+ OSi_RescheduleThread();
+
+ (void)OS_RestoreInterrupts(enabled);
+}
+
+ARM_FUNC void OS_WakeupThread(OSThreadQueue *queue)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ if (queue->head)
+ {
+ while (queue->head)
+ {
+ OSThread *thread = OSi_RemoveLinkFromQueue(queue);
+
+ thread->state = OS_THREAD_STATE_READY;
+ thread->queue = NULL;
+ thread->link.prev = thread->link.next = NULL;
+ }
+
+ OS_InitThreadQueue(queue);
+ OSi_RescheduleThread();
+ }
+
+ (void)OS_RestoreInterrupts(enabled);
+}
+
+ARM_FUNC void OS_WakeupThreadDirect(OSThread *thread)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ thread->state = OS_THREAD_STATE_READY;
+ OSi_RescheduleThread();
+
+ (void)OS_RestoreInterrupts(enabled);
+}
+
+ARM_FUNC OSThread *OS_SelectThread(void)
+{
+ OSThread *thread = OSi_ThreadInfo.list;
+
+ while (thread && !OS_IsThreadRunnable(thread))
+ {
+ thread = thread->next;
+ }
+
+ return thread;
+}
+
+ARM_FUNC void OS_RescheduleThread(void)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+ OSi_RescheduleThread();
+ (void)OS_RestoreInterrupts(enabled);
+}
+
+ARM_FUNC BOOL OS_SetThreadPriority(OSThread *thread, u32 prio)
+{
+ OSThread *t = OSi_ThreadInfo.list;
+ OSThread *pre = NULL;
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ while (t && t != thread)
+ {
+ pre = t;
+ t = t->next;
+ }
+
+ if (!t || t == &OSi_IdleThread)
+ {
+ (void)OS_RestoreInterrupts(enabled);
+ return FALSE;
+ }
+
+ if (t->priority != prio)
+ {
+ if (!pre)
+ {
+ OSi_ThreadInfo.list = thread->next;
+ }
+ else
+ {
+ pre->next = thread->next;
+ }
+
+ thread->priority = prio;
+ OSi_InsertThreadToList(thread);
+
+ OSi_RescheduleThread();
+ }
+
+ (void)OS_RestoreInterrupts(enabled);
+
+ return TRUE;
+}
+
+ARM_FUNC void OS_Sleep(u32 msec)
+{
+ OSAlarm alarm;
+
+ OS_CreateAlarm(&alarm);
+ OSThread *volatile p_thread = OSi_GetCurrentThread();
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ p_thread->alarmForSleep = &alarm;
+
+ OS_SetAlarm(&alarm, OS_MilliSecondsToTicks(msec), &OSi_SleepAlarmCallback,
+ (void*)&p_thread);
+ while (p_thread != NULL)
+ {
+ OS_SleepThread(NULL);
+ }
+ (void)OS_RestoreInterrupts(enabled);
+}
+
+ARM_FUNC static void OSi_SleepAlarmCallback(void *arg)
+{
+ OSThread **pp_thread = (OSThread **)arg;
+ OSThread *p_thread = *pp_thread;
+ *pp_thread = NULL;
+
+ p_thread->alarmForSleep = NULL;
+
+ OS_WakeupThreadDirect(p_thread);
+}
+
+ARM_FUNC OSSwitchThreadCallback OS_SetSwitchThreadCallback(OSSwitchThreadCallback callback)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+ OSSwitchThreadCallback prev = OSi_ThreadInfo.switchCallback;
+ OSi_ThreadInfo.switchCallback = callback;
+
+ (void)OS_RestoreInterrupts(enabled);
+ return prev;
+}
+
+ARM_FUNC u32 OS_DisableScheduler(void)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+ u32 count;
+
+ if (OSi_RescheduleCount < (u32)-1)
+ {
+ count = OSi_RescheduleCount++;
+ }
+ (void)OS_RestoreInterrupts(enabled);
+
+ return count;
+}
+
+ARM_FUNC u32 OS_EnableScheduler(void)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+ u32 count = 0;
+
+ if (OSi_RescheduleCount > 0)
+ {
+ count = OSi_RescheduleCount--;
+ }
+ (void)OS_RestoreInterrupts(enabled);
+
+ return count;
+}
+
+ARM_FUNC void OS_SetThreadDestructor(OSThread *thread, OSThreadDestructor dtor)
+{
+ thread->destructor = dtor;
+}