summaryrefslogtreecommitdiff
path: root/arm9/asm/FS_command.s
blob: 0c2ec755c16bd12eec5615a87b4cb136b4755aba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
	.include "asm/macros.inc"
	.include "global.inc"
	.section .text

	arm_func_start FSi_TranslateCommand
FSi_TranslateCommand:
	stmdb sp!, {r4-r8,lr}
	mov r8, r0
	ldr r0, [r8, #0xc]
	mov r7, r1
	mov r1, #0x1
	ldr r5, [r8, #0x8]
	mov r4, r1, lsl r7
	ands r0, r0, #0x4
	moveq r1, #0x0
	cmp r1, #0x0
	ldrne r0, [r5, #0x1c]
	orrne r0, r0, #0x200
	strne r0, [r5, #0x1c]
	ldreq r0, [r5, #0x1c]
	orreq r0, r0, #0x100
	streq r0, [r5, #0x1c]
	ldr r0, [r5, #0x58]
	ands r0, r0, r4
	beq _020CFFE4
	ldr r2, [r5, #0x54]
	mov r0, r8
	mov r1, r7
	blx r2
	mov r6, r0
	cmp r6, #0x8
	addls pc, pc, r6, lsl #0x2
	b _020CFFE8
_020CFFA0:
	b _020CFFC4
	b _020CFFC4
	b _020CFFE8
	b _020CFFE8
	b _020CFFC4
	b _020CFFE8
	b _020CFFE8
	b _020CFFE8
	b _020CFFCC
_020CFFC4:
	str r6, [r8, #0x14]
	b _020CFFE8
_020CFFCC:
	ldr r1, [r5, #0x58]
	mvn r0, r4
	and r0, r1, r0
	str r0, [r5, #0x58]
	mov r6, #0x7
	b _020CFFE8
_020CFFE4:
	mov r6, #0x7
_020CFFE8:
	cmp r6, #0x7
	bne _020D0004
	ldr r1, _020D00AC ; =0x02103F80
	mov r0, r8
	ldr r1, [r1, r7, lsl #0x2]
	blx r1
	mov r6, r0
_020D0004:
	cmp r6, #0x6
	bne _020D0060
	ldr r0, [r8, #0xc]
	ands r0, r0, #0x4
	movne r0, #0x1
	moveq r0, #0x0
	cmp r0, #0x0
	beq _020D00A0
	bl OS_DisableInterrupts
	ldr r1, [r5, #0x1c]
	mov r4, r0
	ands r0, r1, #0x200
	beq _020D0050
	add r6, r5, #0xc
_020D003C:
	mov r0, r6
	bl OS_SleepThread
	ldr r0, [r5, #0x1c]
	ands r0, r0, #0x200
	bne _020D003C
_020D0050:
	mov r0, r4
	ldr r6, [r8, #0x14]
	bl OS_RestoreInterrupts
	b _020D00A0
_020D0060:
	ldr r0, [r8, #0xc]
	ands r0, r0, #0x4
	movne r0, #0x1
	moveq r0, #0x0
	cmp r0, #0x0
	ldrne r0, [r5, #0x1c]
	bicne r0, r0, #0x200
	strne r0, [r5, #0x1c]
	strne r6, [r8, #0x14]
	bne _020D00A0
	ldr r1, [r5, #0x1c]
	mov r0, r8
	bic r2, r1, #0x100
	mov r1, r6
	str r2, [r5, #0x1c]
	bl FSi_ReleaseCommand
_020D00A0:
	mov r0, r6
	ldmia sp!, {r4-r8,lr}
	bx lr
	.balign 4
_020D00AC: .word 0x02103F80

	arm_func_start FSi_ReleaseCommand
FSi_ReleaseCommand:
	stmdb sp!, {r4-r6,lr}
	mov r6, r0
	mov r5, r1
	bl OS_DisableInterrupts
	ldr r1, [r6, #0x0]
	mov r4, r0
	ldr r0, [r6, #0x4]
	cmp r1, #0x0
	strne r0, [r1, #0x4]
	cmp r0, #0x0
	strne r1, [r0, #0x0]
	mov r0, #0x0
	str r0, [r6, #0x0]
	ldr r1, [r6, #0x0]
	add r0, r6, #0x18
	str r1, [r6, #0x4]
	ldr r1, [r6, #0xc]
	bic r1, r1, #0x4f
	str r1, [r6, #0xc]
	str r5, [r6, #0x14]
	bl OS_WakeupThread
	mov r0, r4
	bl OS_RestoreInterrupts
	ldmia sp!, {r4-r6,lr}
	bx lr