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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
|
.include "asm/macros.inc"
.include "global.inc"
.section .bss
.global _03807A30
_03807A30: ;0x03807A30
.space 0x03807A34 - 0x03807A30
.global _03807A34
_03807A34: ;0x03807A34
.space 0x03807A54 - 0x03807A34
.global _03807A54
_03807A54: ;0x03807A54
.space 0x03807A74 - 0x03807A54
.global _03807A74
_03807A74: ;0x03807A74
.space 0x03807AA0 - 0x03807A74
.global _03807AA0
_03807AA0: ;0x03807AA0
.space 0x03807F44 - 0x03807AA0
.global _03807F44
_03807F44: ;0x03807F44
.space 0x03807F48 - 0x03807F44
.section .text
arm_func_start SndThread
SndThread: ; 0x037FC2B0
stmdb sp!, {r4, r5, r6, lr}
bl SND_InitIntervalTimer
bl SND_ExChannelInit
bl SND_SeqInit
bl SND_AlarmInit
bl SND_Enable
mov r0, #0
mov r1, r0
mov r2, r0
mov r3, r0
bl SND_SetOutputSelector
mov r0, #127 ; 0x7f
bl SND_SetMasterVolume
bl SND_StartIntervalTimer
mov r4, #1
mov r5, #0
_037FC2F0:
mov r6, r5
bl SND_WaitForIntervalTimer
cmp r0, #1
beq _037FC308
cmp r0, #2
b _037FC30C
_037FC308:
mov r6, r4
_037FC30C:
bl SND_UpdateExChannel
bl SND_CommandProc
mov r0, r6
bl SND_SeqMain
mov r0, r6
bl SND_ExChannelMain
bl SND_UpdateSharedWork
bl SND_CalcRandom
b _037FC2F0
_037FC330:
ldr r0, _037FC344 ; =_03807A54
mov r1, #1
mov r2, #0
ldr ip, _037FC348 ; =OS_SendMessage
bx ip
_037FC344: .word _03807A54
_037FC348: .word OS_SendMessage
arm_func_start SNDi_UnlockMutex
SNDi_UnlockMutex: ; 0x037FC34C
bx lr
arm_func_start SNDi_LockMutex
SNDi_LockMutex: ; 0x037FC350
bx lr
arm_func_start SND_SendWakeupMessage
SND_SendWakeupMessage: ; 0x037FC354
ldr r0, _037FC368 ; =_03807A54
mov r1, #2
mov r2, #0
ldr ip, _037FC36C ; =OS_SendMessage
bx ip
_037FC368: .word _03807A54
_037FC36C: .word OS_SendMessage
arm_func_start SND_WaitForIntervalTimer
SND_WaitForIntervalTimer: ; 0x037FC370
stmfd sp!, {lr}
sub sp, sp, #4
ldr r0, _037FC398 ; =_03807A54
add r1, sp, #0
mov r2, #1
bl OS_ReceiveMessage
ldr r0, [sp]
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_037FC398: .word _03807A54
arm_func_start SND_StopIntervalTimer
SND_StopIntervalTimer: ; 0x037FC39C
ldr r0, _037FC3A8 ; =_03807A74
ldr ip, _037FC3AC ; =OS_CancelAlarm
bx ip
_037FC3A8: .word _03807A74
_037FC3AC: .word OS_CancelAlarm
arm_func_start SND_StartIntervalTimer
SND_StartIntervalTimer: ; 0x037FC3B0
stmfd sp!, {lr}
sub sp, sp, #12
bl OS_GetTick
mov ip, r0
ldr r0, _037FC3FC ; =_037FC330
str r0, [sp, #4]
mov r0, #0
str r0, [sp, #8]
ldr r3, _037FC400 ; =0x00000AA8
str r0, [sp]
ldr r0, _037FC404 ; =_03807A74
mov r2, #65536 ; 0x10000
adds ip, ip, r2
adc r2, r1, #0
mov r1, ip
bl OS_SetPeriodicAlarm
add sp, sp, #12
ldmia sp!, {lr}
bx lr
_037FC3FC: .word _037FC330
_037FC400: .word 0x00000AA8
_037FC404: .word _03807A74
arm_func_start SND_InitIntervalTimer
SND_InitIntervalTimer: ; 0x037FC408
stmfd sp!, {lr}
sub sp, sp, #4
ldr r0, _037FC434 ; =_03807A54
ldr r1, _037FC438 ; =_03807A34
mov r2, #8
bl OS_InitMessageQueue
ldr r0, _037FC43C ; =_03807A74
bl OS_CreateAlarm
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_037FC434: .word _03807A54
_037FC438: .word _03807A34
_037FC43C: .word _03807A74
arm_func_start SND_CreateThread
SND_CreateThread: ; 0x037FC440
stmfd sp!, {lr}
sub sp, sp, #12
mov r1, #1024 ; 0x400
str r1, [sp]
str r0, [sp, #4]
ldr r0, _037FC47C ; =_03807AA0
ldr r1, _037FC480 ; =SndThread
mov r2, #0
ldr r3, _037FC484 ; =_03807F44
bl OS_CreateThread
ldr r0, _037FC47C ; =_03807AA0
bl OS_WakeupThreadDirect
add sp, sp, #12
ldmia sp!, {lr}
bx lr
_037FC47C: .word _03807AA0
_037FC480: .word SndThread
_037FC484: .word _03807F44
arm_func_start SND_Init
SND_Init: ; 0x037FC488
stmdb sp!, {r4, lr}
mov r4, r0
ldr r0, _037FC4BC ; =_03807A30
ldr r1, [r0]
cmp r1, #0
bne _037FC4B4
mov r1, #1
str r1, [r0]
bl SND_CommandInit
mov r0, r4
bl SND_CreateThread
_037FC4B4:
ldmia sp!, {r4, lr}
bx lr
_037FC4BC: .word _03807A30
|