summaryrefslogtreecommitdiff
path: root/arm7/asm/SND_lockChannel.s
blob: b525e0d1249cbd4c495eaf979263d7dce44353f3 (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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
	.include "asm/macros.inc"
	.include "global.inc"

    .section .bss

	.global _03807F48
_03807F48: ;0x03807F48
	.space 0x03807F4C - 0x03807F48

    .section .text

	arm_func_start SND_GetLockedChannel
SND_GetLockedChannel: ; 0x037FC964
	ands	r0, r0, #1
	ldrne	r0, _037FC97C	; =_03807F44
	ldrne	r0, [r0]
	ldreq	r0, _037FC980	; =_03807F48
	ldreq	r0, [r0]
	bx	lr
_037FC97C:	.word	_03807F44
_037FC980:	.word	_03807F48

	arm_func_start SND_UnlockChannel
SND_UnlockChannel: ; 0x037FC984
	ands	r1, r1, #1
	ldreq	r1, _037FC9B8	; =_03807F48
	ldreq	r2, [r1]
	mvneq	r0, r0
	andeq	r0, r2, r0
	streq	r0, [r1]
	bxeq	lr
	ldr	r1, _037FC9BC	; =_03807F44
	ldr	r2, [r1]
	mvn	r0, r0
	and	r0, r2, r0
	str	r0, [r1]
	bx	lr
_037FC9B8:	.word	_03807F48
_037FC9BC:	.word	_03807F44

	arm_func_start SND_LockChannel
SND_LockChannel: ; 0x037FC9C0
	stmdb	sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
	sub	sp, sp, #4
	mov	sl, r0
	mov	r9, r1
	mov	r7, sl
	mov	r6, #0
	mov	fp, r6
	str	r6, [sp]
	mov	r4, r6
	mov	r5, #1
	b	_037FCA6C
_037FC9EC:
	ands	r0, r7, #1
	beq	_037FCA64
	mov	r1, #84	; 0x54
	ldr	r0, _037FCAAC	; =SNDi_Work
	mla	r8, r6, r1, r0
	ldr	r0, _037FCAB0	; =_03807F48
	ldr	r1, [r0]
	mov	r0, r5, lsl r6
	ands	r0, r1, r0
	bne	_037FCA64
	ldr	r3, [r8, #72]	; 0x48
	cmp	r3, #0
	beq	_037FCA34
	mov	r0, r8
	mov	r1, fp
	ldr	r2, [r8, #76]	; 0x4c
	mov	lr, pc
	bx	r3
_037FCA34:
	mov	r0, r6
	ldr	r1, [sp]
	bl	SND_StopChannel
	strb	r4, [r8, #34]	; 0x22
	mov	r0, r8
	bl	SND_FreeExChannel
	ldrb	r0, [r8, #3]
	bic	r0, r0, #248	; 0xf8
	strb	r0, [r8, #3]
	ldrb	r0, [r8, #3]
	bic	r0, r0, #1
	strb	r0, [r8, #3]
_037FCA64:
	add	r6, r6, #1
	mov	r7, r7, lsr #1
_037FCA6C:
	cmp	r6, #16
	bge	_037FCA7C
	cmp	r7, #0
	bne	_037FC9EC
_037FCA7C:
	ands	r0, r9, #1
	ldrne	r0, _037FCAB4	; =_03807F44
	ldrne	r1, [r0]
	orrne	r1, r1, sl
	strne	r1, [r0]
	ldreq	r0, _037FCAB0	; =_03807F48
	ldreq	r1, [r0]
	orreq	r1, r1, sl
	streq	r1, [r0]
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
	bx	lr
_037FCAAC:	.word	SNDi_Work
_037FCAB0:	.word	_03807F48
_037FCAB4:	.word	_03807F44

	arm_func_start SND_StopUnlockedChannel
SND_StopUnlockedChannel: ; 0x037FCAB8
	stmdb	sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
	sub	sp, sp, #4
	mov	sl, r0
	mov	r8, #0
	mov	r6, r8
	mov	r5, r8
	mov	r4, r8
	ldr	fp, _037FCB78	; =SNDi_Work
	mov	r7, #1
	b	_037FCB5C
_037FCAE0:
	ands	r0, sl, #1
	beq	_037FCB54
	mov	r0, #84	; 0x54
	mla	r9, r8, r0, fp
	ldr	r0, _037FCB7C	; =_03807F48
	ldr	r1, [r0]
	mov	r0, r7, lsl r8
	ands	r0, r1, r0
	bne	_037FCB54
	ldr	r3, [r9, #72]	; 0x48
	cmp	r3, #0
	beq	_037FCB24
	mov	r0, r9
	mov	r1, r6
	ldr	r2, [r9, #76]	; 0x4c
	mov	lr, pc
	bx	r3
_037FCB24:
	mov	r0, r8
	mov	r1, r5
	bl	SND_StopChannel
	strb	r4, [r9, #34]	; 0x22
	mov	r0, r9
	bl	SND_FreeExChannel
	ldrb	r0, [r9, #3]
	bic	r0, r0, #248	; 0xf8
	strb	r0, [r9, #3]
	ldrb	r0, [r9, #3]
	bic	r0, r0, #1
	strb	r0, [r9, #3]
_037FCB54:
	add	r8, r8, #1
	mov	sl, sl, lsr #1
_037FCB5C:
	cmp	r8, #16
	bge	_037FCB6C
	cmp	sl, #0
	bne	_037FCAE0
_037FCB6C:
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
	bx	lr
_037FCB78:	.word	SNDi_Work
_037FCB7C:	.word	_03807F48