Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/rsp/audio.s
7854 views
1
.rsp
2
3
.include "rsp/rsp_defs.inc"
4
5
// This file assumes DATA_FILE and CODE_FILE are set on the command line
6
7
.if version() < 110
8
.error "armips 0.11 or newer is required"
9
.endif
10
11
.macro jumpTableEntry, addr
12
.dh addr & 0xFFFF
13
.endmacro
14
15
// Audio flags
16
A_INIT equ 0x01
17
A_CONTINUE equ 0x00
18
A_LOOP equ 0x02
19
A_OUT equ 0x02
20
A_LEFT equ 0x02
21
A_RIGHT equ 0x00
22
A_VOL equ 0x04
23
A_RATE equ 0x00
24
A_AUX equ 0x08
25
A_NOAUX equ 0x00
26
A_MAIN equ 0x00
27
A_MIX equ 0x10
28
29
.create DATA_FILE, 0x0000
30
31
.dh 0x0000, 0x0001, 0x0002, 0xffff, 0x0020, 0x0800, 0x7fff, 0x4000 // 0x00000000
32
33
// 0x10 - 0x1F: command dispatch table
34
dispatchTable:
35
jumpTableEntry cmd_SPNOOP
36
jumpTableEntry cmd_ADPCM
37
jumpTableEntry cmd_CLEARBUFF
38
.ifdef VERSION_SH
39
jumpTableEntry cmd_SPNOOP
40
41
jumpTableEntry cmd_ADDMIXER
42
jumpTableEntry cmd_RESAMPLE
43
jumpTableEntry cmd_RESAMPLE_ZOH
44
jumpTableEntry cmd_SPNOOP
45
46
jumpTableEntry cmd_SETBUFF
47
jumpTableEntry cmd_SPNOOP
48
jumpTableEntry cmd_DMEMMOVE
49
jumpTableEntry cmd_LOADADPCM
50
51
jumpTableEntry cmd_MIXER
52
jumpTableEntry cmd_INTERLEAVE
53
jumpTableEntry cmd_SPNOOP
54
jumpTableEntry cmd_SETLOOP
55
56
jumpTableEntry cmd_DMEMMOVE2
57
jumpTableEntry cmd_DOWNSAMPLE_HALF
58
jumpTableEntry cmd_ENVSETUP1
59
jumpTableEntry cmd_ENVMIXER
60
61
jumpTableEntry cmd_LOADBUFF
62
jumpTableEntry cmd_SAVEBUFF
63
jumpTableEntry cmd_ENVSETUP2
64
jumpTableEntry cmd_S8DEC
65
66
jumpTableEntry cmd_HILOGAIN
67
jumpTableEntry cmd_1c7c
68
jumpTableEntry cmd_DUPLICATE
69
jumpTableEntry cmd_FILTER
70
71
jumpTableEntry cmd_SPNOOP
72
jumpTableEntry cmd_SPNOOP
73
jumpTableEntry cmd_SPNOOP
74
jumpTableEntry cmd_SPNOOP
75
.else
76
jumpTableEntry cmd_ENVMIXER
77
jumpTableEntry cmd_LOADBUFF
78
jumpTableEntry cmd_RESAMPLE
79
jumpTableEntry cmd_SAVEBUFF
80
jumpTableEntry cmd_SEGMENT
81
jumpTableEntry cmd_SETBUFF
82
jumpTableEntry cmd_SETVOL
83
jumpTableEntry cmd_DMEMMOVE
84
jumpTableEntry cmd_LOADADPCM
85
jumpTableEntry cmd_MIXER
86
jumpTableEntry cmd_INTERLEAVE
87
jumpTableEntry cmd_POLEF
88
jumpTableEntry cmd_SETLOOP
89
.endif
90
91
.dh 0xf000, 0x0f00, 0x00f0, 0x000f, 0x0001, 0x0010, 0x0100, 0x1000 // 0x00000030
92
data0040:
93
.dh 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e, 0x0010 // 0x00000040
94
.dh 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001 // 0x00000050
95
.dh 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0100, 0x0200 // 0x00000060
96
.dh 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000 // 0x00000070
97
.dh 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000 // 0x00000080
98
.dh 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000 // 0x00000090
99
.dh 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0001 // 0x000000a0
100
.dh 0x2000, 0x4000, 0x6000, 0x8000, 0xa000, 0xc000, 0xe000, 0xffff // 0x000000b0
101
.ifdef VERSION_SH
102
.dh 0x0000, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
103
.dh 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
104
.endif
105
.dh 0x0c39, 0x66ad, 0x0d46, 0xffdf, 0x0b39, 0x6696, 0x0e5f, 0xffd8 // 0x000000c0
106
.dh 0x0a44, 0x6669, 0x0f83, 0xffd0, 0x095a, 0x6626, 0x10b4, 0xffc8 // 0x000000d0
107
.dh 0x087d, 0x65cd, 0x11f0, 0xffbf, 0x07ab, 0x655e, 0x1338, 0xffb6 // 0x000000e0
108
.dh 0x06e4, 0x64d9, 0x148c, 0xffac, 0x0628, 0x643f, 0x15eb, 0xffa1 // 0x000000f0
109
.dh 0x0577, 0x638f, 0x1756, 0xff96, 0x04d1, 0x62cb, 0x18cb, 0xff8a // 0x00000100
110
.dh 0x0435, 0x61f3, 0x1a4c, 0xff7e, 0x03a4, 0x6106, 0x1bd7, 0xff71 // 0x00000110
111
.dh 0x031c, 0x6007, 0x1d6c, 0xff64, 0x029f, 0x5ef5, 0x1f0b, 0xff56 // 0x00000120
112
.dh 0x022a, 0x5dd0, 0x20b3, 0xff48, 0x01be, 0x5c9a, 0x2264, 0xff3a // 0x00000130
113
.dh 0x015b, 0x5b53, 0x241e, 0xff2c, 0x0101, 0x59fc, 0x25e0, 0xff1e // 0x00000140
114
.dh 0x00ae, 0x5896, 0x27a9, 0xff10, 0x0063, 0x5720, 0x297a, 0xff02 // 0x00000150
115
.dh 0x001f, 0x559d, 0x2b50, 0xfef4, 0xffe2, 0x540d, 0x2d2c, 0xfee8 // 0x00000160
116
.dh 0xffac, 0x5270, 0x2f0d, 0xfedb, 0xff7c, 0x50c7, 0x30f3, 0xfed0 // 0x00000170
117
.dh 0xff53, 0x4f14, 0x32dc, 0xfec6, 0xff2e, 0x4d57, 0x34c8, 0xfebd // 0x00000180
118
.dh 0xff0f, 0x4b91, 0x36b6, 0xfeb6, 0xfef5, 0x49c2, 0x38a5, 0xfeb0 // 0x00000190
119
.dh 0xfedf, 0x47ed, 0x3a95, 0xfeac, 0xfece, 0x4611, 0x3c85, 0xfeab // 0x000001a0
120
.dh 0xfec0, 0x4430, 0x3e74, 0xfeac, 0xfeb6, 0x424a, 0x4060, 0xfeaf // 0x000001b0
121
.dh 0xfeaf, 0x4060, 0x424a, 0xfeb6, 0xfeac, 0x3e74, 0x4430, 0xfec0 // 0x000001c0
122
.dh 0xfeab, 0x3c85, 0x4611, 0xfece, 0xfeac, 0x3a95, 0x47ed, 0xfedf // 0x000001d0
123
.dh 0xfeb0, 0x38a5, 0x49c2, 0xfef5, 0xfeb6, 0x36b6, 0x4b91, 0xff0f // 0x000001e0
124
.dh 0xfebd, 0x34c8, 0x4d57, 0xff2e, 0xfec6, 0x32dc, 0x4f14, 0xff53 // 0x000001f0
125
.dh 0xfed0, 0x30f3, 0x50c7, 0xff7c, 0xfedb, 0x2f0d, 0x5270, 0xffac // 0x00000200
126
.dh 0xfee8, 0x2d2c, 0x540d, 0xffe2, 0xfef4, 0x2b50, 0x559d, 0x001f // 0x00000210
127
.dh 0xff02, 0x297a, 0x5720, 0x0063, 0xff10, 0x27a9, 0x5896, 0x00ae // 0x00000220
128
.dh 0xff1e, 0x25e0, 0x59fc, 0x0101, 0xff2c, 0x241e, 0x5b53, 0x015b // 0x00000230
129
.dh 0xff3a, 0x2264, 0x5c9a, 0x01be, 0xff48, 0x20b3, 0x5dd0, 0x022a // 0x00000240
130
.dh 0xff56, 0x1f0b, 0x5ef5, 0x029f, 0xff64, 0x1d6c, 0x6007, 0x031c // 0x00000250
131
.dh 0xff71, 0x1bd7, 0x6106, 0x03a4, 0xff7e, 0x1a4c, 0x61f3, 0x0435 // 0x00000260
132
.dh 0xff8a, 0x18cb, 0x62cb, 0x04d1, 0xff96, 0x1756, 0x638f, 0x0577 // 0x00000270
133
.dh 0xffa1, 0x15eb, 0x643f, 0x0628, 0xffac, 0x148c, 0x64d9, 0x06e4 // 0x00000280
134
.dh 0xffb6, 0x1338, 0x655e, 0x07ab, 0xffbf, 0x11f0, 0x65cd, 0x087d // 0x00000290
135
.dh 0xffc8, 0x10b4, 0x6626, 0x095a, 0xffd0, 0x0f83, 0x6669, 0x0a44 // 0x000002a0
136
.dh 0xffd8, 0x0e5f, 0x6696, 0x0b39, 0xffdf, 0x0d46, 0x66ad, 0x0c39 // 0x000002b0
137
.ifdef VERSION_SH
138
.dh 0xFFFF, 0xDFFF, 0xBFFF, 0x9FFF, 0x7FFF, 0x5FFF, 0x3FFF, 0x1FFF
139
.dh 0x0000, 0x2000, 0x4000, 0x6000, 0x8000, 0xA000, 0xC000, 0xE000
140
.dh 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000A, 0x000C, 0x000E
141
.endif
142
143
.definelabel segmentTable, 0x320
144
145
.ifdef VERSION_SH
146
.definelabel audioStruct, 0x320
147
.else
148
.definelabel audioStruct, 0x360
149
.endif
150
audio_in_buf equ 0x00 // 0x360
151
audio_out_buf equ 0x02 // 0x362
152
audio_count equ 0x04 // 0x364
153
audio_vol_left equ 0x06 // 0x366
154
audio_vol_right equ 0x08 // 0x366
155
audio_aux_buf0 equ 0x0a // 0x36a
156
audio_aux_buf1 equ 0x0c // 0x36c
157
audio_aux_buf2 equ 0x0e // 0x36e
158
audio_loop_value equ 0x10 // 0x370 (shared)
159
audio_target_left equ 0x10 // 0x370 (shared)
160
audio_rate_hi_left equ 0x12 // 0x372 (shared)
161
audio_rate_lo_left equ 0x14 // 0x374
162
audio_target_right equ 0x16 // 0x376
163
audio_rate_hi_right equ 0x18 // 0x378
164
.ifdef VERSION_SH
165
.definelabel audio_rate_lo_right, 0x04 // 0x37a
166
.else
167
.definelabel audio_rate_lo_right, 0x1a // 0x37a
168
.endif
169
audio_dry_gain equ 0x1c // 0x37c
170
audio_wet_gain equ 0x1e // 0x37e
171
172
.ifdef VERSION_SH
173
.definelabel nextTaskEntry, 0x340
174
.definelabel adpcmTable, 0x3c0
175
.else
176
.definelabel nextTaskEntry, 0x380 // next task entries (0x140 bytes)
177
.definelabel adpcmTable, 0x4c0 // (16*8 16-bit entries)
178
.endif
179
180
.definelabel dmemBase, 0x5c0 // all samples stored that is transferred to DMEM
181
.definelabel tmpData, 0xF90 // temporary area
182
183
.close // DATA_FILE
184
185
186
.create CODE_FILE, 0x04001080
187
188
addi $24, $zero, audioStruct
189
addi $23, $zero, tmpData
190
lw $28, 0x30($1) // task_data
191
lw $27, 0x34($1) // task_data_size
192
mfc0 $5, DPC_STATUS
193
andi $4, $5, DPC_STATUS_XBUS_DMA
194
beqz $4, @@audio_040010b4
195
andi $4, $5, DPC_STATUS_DMA_BUSY
196
beqz $4, @@audio_040010b4
197
nop
198
@@dpc_dma_busy:
199
mfc0 $4, DPC_STATUS
200
andi $4, $4, DPC_STATUS_DMA_BUSY
201
bgtz $4, @@dpc_dma_busy
202
@@audio_040010b4:
203
nop
204
jal audio_04001150
205
nop
206
.ifndef VERSION_SH
207
addi $2, $zero, 0x000f
208
addi $1, $zero, segmentTable
209
@@audio_040010c8:
210
sw $zero, 0x00($1)
211
bgtz $2, @@audio_040010c8
212
addi $2, $2, -1
213
.endif
214
215
dma_busy:
216
mfc0 $2, SP_DMA_BUSY
217
bnez $2, dma_busy
218
addi $29, $zero, nextTaskEntry
219
mtc0 $zero, SP_SEMAPHORE // release semaphore
220
audio_040010e4:
221
lw $26, 0x00($29) // first word of command
222
lw $25, 0x04($29) // second word of command
223
srl $1, $26, 23 // cmd byte << 1
224
andi $1, $1, 0x00fe
225
addi $28, $28, 8
226
addi $27, $27, -8
227
addi $29, $29, 8
228
addi $30, $30, -8
229
add $2, $zero, $1
230
lh $2, (dispatchTable)($2)
231
jr $2
232
nop
233
break
234
235
cmd_SPNOOP:
236
bgtz $30, audio_040010e4
237
nop
238
blez $27, @@audio_04001138
239
nop
240
jal audio_04001150
241
nop
242
j dma_busy
243
nop
244
@@audio_04001138:
245
ori $1, $zero, 0x4000
246
mtc0 $1, SP_STATUS
247
break
248
nop
249
@@forever:
250
b @@forever
251
nop
252
253
audio_04001150:
254
addi $5, $ra, 0x0000
255
add $2, $zero, $28
256
addi $3, $27, 0x0000
257
.ifdef VERSION_SH
258
addi $4, $3, -0x80
259
.else
260
addi $4, $3, -0x0140
261
.endif
262
blez $4, @@audio_0400116c
263
addi $1, $zero, nextTaskEntry
264
.ifdef VERSION_SH
265
addi $3, $zero, 0x80
266
.else
267
addi $3, $zero, 0x0140
268
.endif
269
@@audio_0400116c:
270
addi $30, $3, 0x0000
271
jal dma_read_start
272
addi $3, $3, -1
273
addi $29, $zero, nextTaskEntry
274
jr $5
275
nop
276
277
dma_read_start:
278
mfc0 $4, SP_SEMAPHORE
279
bnez $4, dma_read_start
280
nop
281
@@dma_not_full:
282
mfc0 $4, SP_DMA_FULL
283
bnez $4, @@dma_not_full
284
nop
285
mtc0 $1, SP_MEM_ADDR
286
mtc0 $2, SP_DRAM_ADDR
287
mtc0 $3, SP_RD_LEN
288
jr $ra
289
nop
290
291
dma_write_start:
292
mfc0 $4, SP_SEMAPHORE
293
bnez $4, dma_write_start
294
nop
295
@@dma_not_full:
296
mfc0 $4, SP_DMA_FULL
297
bnez $4, @@dma_not_full
298
nop
299
mtc0 $1, SP_MEM_ADDR
300
mtc0 $2, SP_DRAM_ADDR
301
mtc0 $3, SP_WR_LEN
302
jr $ra
303
nop
304
305
cmd_CLEARBUFF:
306
andi $3, $25, 0xffff
307
beqz $3, cmd_SPNOOP
308
.ifndef VERSION_SH
309
addi $4, $zero, dmemBase
310
.endif
311
andi $2, $26, 0xffff
312
.ifndef VERSION_SH
313
add $2, $2, $4
314
.endif
315
.ifdef VERSION_SH
316
vxor $v0, $v0, $v0
317
.else
318
vxor $v1, $v1, $v1
319
.endif
320
addi $3, $3, -0x10
321
@@audio_040011f8:
322
.ifdef VERSION_SH
323
sdv $v0[0], 0x0($2)
324
sdv $v0[0], 0x8($2)
325
.else
326
sdv $v1[0], 0x0($2)
327
sdv $v1[0], 0x8($2)
328
.endif
329
addi $2, $2, 0x10
330
bgtz $3, @@audio_040011f8
331
addi $3, $3, -0x10
332
j cmd_SPNOOP
333
nop
334
335
.ifndef VERSION_SH
336
cmd_LOADBUFF:
337
lhu $3, (audio_count)($24)
338
beqz $3, cmd_SPNOOP
339
sll $2, $25, 8
340
srl $2, $2, 8
341
srl $4, $25, 24
342
sll $4, $4, 2
343
lw $5, (segmentTable)($4)
344
add $2, $2, $5
345
lhu $1, (audio_in_buf)($24)
346
jal dma_read_start
347
addi $3, $3, -1
348
@@dma_read_busy:
349
mfc0 $1, SP_DMA_BUSY
350
bnez $1, @@dma_read_busy
351
nop
352
j cmd_SPNOOP
353
mtc0 $zero, SP_SEMAPHORE
354
355
cmd_SAVEBUFF:
356
lhu $3, (audio_count)($24)
357
beqz $3, cmd_SPNOOP
358
sll $2, $25, 8
359
srl $2, $2, 8
360
srl $4, $25, 24
361
sll $4, $4, 2
362
lw $5, (segmentTable)($4)
363
add $2, $2, $5
364
lhu $1, (audio_out_buf)($24)
365
jal dma_write_start
366
addi $3, $3, -1
367
@@dma_write_busy:
368
mfc0 $1, SP_DMA_BUSY
369
bnez $1, @@dma_write_busy
370
nop
371
j cmd_SPNOOP
372
mtc0 $zero, SP_SEMAPHORE
373
374
cmd_LOADADPCM:
375
sll $2, $25, 8
376
srl $2, $2, 8
377
srl $4, $25, 24
378
sll $4, $4, 2
379
lw $5, (segmentTable)($4)
380
add $2, $2, $5
381
addi $1, $zero, adpcmTable
382
andi $3, $26, 0xffff
383
jal dma_read_start
384
addi $3, $3, -1
385
@@dma_read_busy:
386
mfc0 $1, SP_DMA_BUSY
387
bnez $1, @@dma_read_busy
388
nop
389
j cmd_SPNOOP
390
mtc0 $zero, SP_SEMAPHORE
391
.endif
392
cmd_SEGMENT:
393
.ifndef VERSION_SH
394
sll $3, $25, 8 // Least significant 24-bits offset
395
srl $3, $3, 8
396
srl $2, $25, 24 // Most significant 8-bits segment number
397
sll $2, $2, 2
398
add $4, $zero, $2
399
j cmd_SPNOOP
400
sw $3, (segmentTable)($4)
401
.endif
402
403
.ifndef VERSION_SH
404
cmd_SETBUFF:
405
addi $1, $26, dmemBase
406
srl $2, $25, 16
407
addi $2, $2, dmemBase
408
srl $4, $26, 16
409
andi $4, $4, A_AUX
410
bgtz $4, @@audio_04001318
411
addi $3, $25, dmemBase
412
sh $1, (audio_in_buf)($24)
413
sh $2, (audio_out_buf)($24)
414
j cmd_SPNOOP
415
sh $25, (audio_count)($24)
416
@@audio_04001318:
417
sh $3, (audio_aux_buf2)($24)
418
sh $1, (audio_aux_buf0)($24)
419
j cmd_SPNOOP
420
sh $2, (audio_aux_buf1)($24)
421
.endif
422
423
.ifdef VERSION_SH
424
cmd_SETBUFF:
425
srl $2, $25, 16
426
sh $26, 0($24)
427
sh $2, 2($24)
428
.else
429
cmd_SETVOL:
430
srl $2, $26, 16
431
andi $1, $2, A_AUX
432
beqz $1, @@audio_04001344
433
andi $1, $2, A_VOL
434
sh $26, (audio_dry_gain)($24)
435
j cmd_SPNOOP
436
sh $25, (audio_wet_gain)($24)
437
@@audio_04001344:
438
beqz $1, @@audio_04001364
439
andi $1, $2, A_LEFT
440
beqz $1, @@audio_0400135c
441
nop
442
j cmd_SPNOOP
443
sh $26, (audio_vol_left)($24)
444
@@audio_0400135c:
445
j cmd_SPNOOP
446
sh $26, (audio_vol_right)($24)
447
@@audio_04001364:
448
beqz $1, @@audio_0400137c
449
srl $1, $25, 16
450
sh $26, (audio_target_left)($24)
451
sh $1, (audio_rate_hi_left)($24)
452
j cmd_SPNOOP
453
sh $25, (audio_rate_lo_left)($24)
454
@@audio_0400137c:
455
sh $26, (audio_target_right)($24)
456
sh $1, (audio_rate_hi_right)($24)
457
.endif
458
j cmd_SPNOOP
459
sh $25, (audio_rate_lo_right)($24)
460
461
cmd_INTERLEAVE:
462
.ifdef VERSION_SH
463
andi $a0, $k0, 0xffff
464
srl $at, $k0, 12
465
andi $at, $at, 0xff0
466
andi $v1, $t9, 0xffff
467
srl $v0, $t9, 16
468
@@audio_040013a8:
469
ldv $v1[0], 0x0($2)
470
ldv $v2[0], 0x0($3)
471
addi $at, $at, -8
472
addi $a0, $a0, 16
473
ssv $v1[0], 0xF0($4)
474
ssv $v1[2], 0xF4($4)
475
addi $v0, $v0, 8
476
ssv $v1[4], 0xF8($4)
477
ssv $v1[6], 0xFC($4)
478
ssv $v2[0], 0xF2($4)
479
addi $v1, $v1, 8
480
ssv $v2[2], 0xF6($4)
481
ssv $v2[4], 0xFA($4)
482
.else
483
lhu $1, (audio_count)($24)
484
lhu $4, (audio_out_buf)($24)
485
beqz $1, cmd_SPNOOP
486
andi $3, $25, 0xffff
487
addi $3, $3, dmemBase
488
srl $2, $25, 16
489
addi $2, $2, dmemBase
490
@@audio_040013a8:
491
lqv $v1[0], 0x00($2)
492
lqv $v2[0], 0x00($3)
493
ssv $v1[0], 0x00($4)
494
ssv $v2[0], 0x02($4)
495
ssv $v1[2], 0x04($4)
496
ssv $v2[2], 0x06($4)
497
ssv $v1[4], 0x08($4)
498
ssv $v2[4], 0x0a($4)
499
ssv $v1[6], 0x0c($4)
500
ssv $v2[6], 0x0e($4)
501
ssv $v1[8], 0x10($4)
502
ssv $v2[8], 0x12($4)
503
ssv $v1[10], 0x14($4)
504
ssv $v2[10], 0x16($4)
505
ssv $v1[12], 0x18($4)
506
ssv $v2[12], 0x1a($4)
507
ssv $v1[14], 0x1c($4)
508
ssv $v2[14], 0x1e($4)
509
addi $1, $1, -0x10
510
addi $2, $2, 0x10
511
addi $3, $3, 0x10
512
.endif
513
bgtz $1, @@audio_040013a8
514
.ifdef VERSION_SH
515
ssv $v2[6], 0xFE($a0)
516
.else
517
addi $4, $4, 0x20
518
.endif
519
j cmd_SPNOOP
520
nop
521
522
cmd_DMEMMOVE:
523
andi $1, $25, 0xffff
524
beqz $1, cmd_SPNOOP
525
andi $2, $26, 0xffff
526
.ifndef VERSION_SH
527
addi $2, $2, dmemBase
528
.endif
529
srl $3, $25, 16
530
.ifndef VERSION_SH
531
addi $3, $3, dmemBase
532
.endif
533
@@audio_04001424:
534
ldv $v1[0], 0x0($2)
535
ldv $v2[0], 0x8($2)
536
addi $1, $1, -0x10
537
addi $2, $2, 0x10
538
sdv $v1[0], 0x0($3)
539
sdv $v2[0], 0x8($3)
540
bgtz $1, @@audio_04001424
541
addi $3, $3, 0x10
542
j cmd_SPNOOP
543
nop
544
545
cmd_SETLOOP:
546
sll $1, $25, 8
547
srl $1, $1, 8
548
.ifndef VERSION_SH
549
srl $3, $25, 24
550
sll $3, $3, 2
551
lw $2, (segmentTable)($3)
552
add $1, $1, $2
553
sw $1, (audio_loop_value)($24)
554
.endif
555
j cmd_SPNOOP
556
.ifdef VERSION_SH
557
sw $at, 0x10($t8)
558
.else
559
nop
560
.endif
561
562
cmd_ADPCM:
563
lqv $v31[0], 0x00($zero)
564
vxor $v27, $v27, $v27
565
lhu $21, (audio_in_buf)($24)
566
vxor $v25, $v25, $v25
567
vxor $v24, $v24, $v24
568
addi $20, $21, 1
569
lhu $19, (audio_out_buf)($24)
570
vxor $v13, $v13, $v13
571
vxor $v14, $v14, $v14
572
lhu $18, (audio_count)($24)
573
vxor $v15, $v15, $v15
574
.ifndef VERSION_SH
575
lui $1, 0x00ff
576
.endif
577
vxor $v16, $v16, $v16
578
.ifdef VERSION_SH
579
sll $s1, $t9, 8
580
.else
581
ori $1, $1, 0xffff
582
.endif
583
vxor $v17, $v17, $v17
584
.ifndef VERSION_SH
585
and $17, $25, $1
586
.endif
587
vxor $v18, $v18, $v18
588
.ifdef VERSION_SH
589
srl $s1, $s1, 8
590
.else
591
srl $2, $25, 24
592
.endif
593
vxor $v19, $v19, $v19
594
.ifndef VERSION_SH
595
sll $2, $2, 2
596
lw $3, (segmentTable)($2)
597
add $17, $17, $3 // last frame addr
598
.endif
599
sqv $v27[0], 0x00($19)
600
sqv $v27[0], 0x10($19)
601
srl $1, $26, 16
602
andi $1, $1, A_INIT
603
bgtz $1, @@audio_0400150c
604
srl $1, $26, 16
605
andi $1, $1, A_LOOP
606
beq $zero, $1, @@audio_040014f0
607
addi $2, $17, 0x00
608
lw $2, (audio_loop_value)($24)
609
@@audio_040014f0:
610
addi $1, $19, 0x0000
611
jal dma_read_start
612
addi $3, $zero, 0x1f
613
@@dma_read_busy:
614
mfc0 $5, SP_DMA_BUSY
615
bnez $5, @@dma_read_busy
616
nop
617
mtc0 $zero, SP_SEMAPHORE
618
@@audio_0400150c:
619
.ifdef VERSION_SH
620
addi $16, $zero, 0x0050
621
.else
622
addi $16, $zero, 0x0030
623
.endif
624
addi $15, $zero, adpcmTable
625
ldv $v25[0], 0x00($16)
626
ldv $v24[8], 0x00($16)
627
ldv $v23[0], 0x08($16)
628
ldv $v23[8], 0x08($16)
629
lqv $v27[0], 0x10($19) // last 8 frames
630
addi $19, $19, 0x20
631
beqz $18, @@audio_040016e8
632
ldv $v1[0], 0x00($20)
633
lbu $1, 0x00($21)
634
andi $11, $1, 0x000f
635
sll $11, $11, 5
636
vand $v3, $v25, $v1[0]
637
add $13, $11, $15
638
vand $v4, $v24, $v1[1]
639
srl $14, $1, 4
640
vand $v5, $v25, $v1[2]
641
addi $2, $zero, 12
642
vand $v6, $v24, $v1[3]
643
sub $14, $2, $14
644
addi $2, $14, -1
645
addi $3, $zero, 1
646
sll $3, $3, 15
647
srlv $4, $3, $2
648
mtc2 $4, $v22[0]
649
lqv $v21[0], 0x00($13)
650
lqv $v20[0], 0x10($13)
651
addi $13, $13, -2
652
lrv $v19[0], 0x20($13)
653
addi $13, $13, -2
654
lrv $v18[0], 0x20($13)
655
addi $13, $13, -2
656
lrv $v17[0], 0x20($13)
657
addi $13, $13, -2
658
lrv $v16[0], 0x20($13)
659
addi $13, $13, -2
660
lrv $v15[0], 0x20($13)
661
addi $13, $13, -2
662
lrv $v14[0], 0x20($13)
663
addi $13, $13, -2
664
lrv $v13[0], 0x20($13)
665
@@audio_040015b4:
666
addi $20, $20, 9
667
vmudn $v30, $v3, $v23
668
addi $21, $21, 9
669
vmadn $v30, $v4, $v23
670
ldv $v1[0], 0x00($20)
671
vmudn $v29, $v5, $v23
672
lbu $1, 0x00($21)
673
vmadn $v29, $v6, $v23
674
blez $14, @@audio_040015e4
675
andi $11, $1, 0x000f
676
vmudm $v30, $v30, $v22[0]
677
vmudm $v29, $v29, $v22[0]
678
@@audio_040015e4:
679
sll $11, $11, 5
680
vand $v3, $v25, $v1[0]
681
add $13, $11, $15
682
vand $v4, $v24, $v1[1]
683
vand $v5, $v25, $v1[2]
684
vand $v6, $v24, $v1[3]
685
srl $14, $1, 4
686
vmudh $v2, $v21, $v27[6]
687
addi $2, $zero, 12
688
vmadh $v2, $v20, $v27[7]
689
sub $14, $2, $14
690
vmadh $v2, $v19, $v30[0]
691
addi $2, $14, -1
692
vmadh $v2, $v18, $v30[1]
693
addi $3, $zero, 1
694
vmadh $v2, $v17, $v30[2]
695
sll $3, $3, 15
696
vmadh $v2, $v16, $v30[3]
697
srlv $4, $3, $2
698
vmadh $v28, $v15, $v30[4]
699
mtc2 $4, $v22[0]
700
vmadh $v2, $v14, $v30[5]
701
vmadh $v2, $v13, $v30[6]
702
vmadh $v2, $v30, $v31[5]
703
vsar $v26, $v7, $v28[1]
704
vsar $v28, $v7, $v28[0]
705
vmudn $v2, $v26, $v31[4]
706
vmadh $v28, $v28, $v31[4]
707
vmudh $v2, $v19, $v29[0]
708
addi $12, $13, -2
709
vmadh $v2, $v18, $v29[1]
710
lrv $v19[0], 0x20($12)
711
vmadh $v2, $v17, $v29[2]
712
addi $12, $12, -2
713
vmadh $v2, $v16, $v29[3]
714
lrv $v18[0], 0x20($12)
715
vmadh $v2, $v15, $v29[4]
716
addi $12, $12, -2
717
vmadh $v2, $v14, $v29[5]
718
lrv $v17[0], 0x20($12)
719
vmadh $v2, $v13, $v29[6]
720
addi $12, $12, -2
721
vmadh $v2, $v29, $v31[5]
722
lrv $v16[0], 0x20($12)
723
vmadh $v2, $v21, $v28[6]
724
addi $12, $12, -2
725
vmadh $v2, $v20, $v28[7]
726
lrv $v15[0], 0x20($12)
727
vsar $v26, $v7, $v27[1]
728
addi $12, $12, -2
729
vsar $v27, $v7, $v27[0]
730
lrv $v14[0], 0x20($12)
731
addi $12, $12, -2
732
lrv $v13[0], 0x20($12)
733
lqv $v21[0], 0x00($13)
734
vmudn $v2, $v26, $v31[4]
735
lqv $v20[0], 0x10($13)
736
vmadh $v27, $v27, $v31[4]
737
addi $18, $18, -0x20
738
sdv $v28[0], 0x00($19)
739
sdv $v28[8], 0x08($19)
740
sdv $v27[0], 0x10($19)
741
sdv $v27[8], 0x18($19)
742
bgtz $18, @@audio_040015b4
743
addi $19, $19, 0x20
744
@@audio_040016e8:
745
addi $1, $19, -0x20
746
addi $2, $17, 0x00
747
jal dma_write_start
748
addi $3, $zero, 0x1f
749
@@dma_write_busy:
750
mfc0 $5, SP_DMA_BUSY
751
bnez $5, @@dma_write_busy
752
nop
753
j cmd_SPNOOP
754
mtc0 $zero, SP_SEMAPHORE
755
756
cmd_POLEF: // unused by SM64
757
.ifndef VERSION_SH
758
lqv $v31[0], 0x0000($zero)
759
vxor $v28, $v28, $v28
760
lhu $21, (audio_in_buf)($24)
761
vxor $v17, $v17, $v17
762
lhu $20, (audio_out_buf)($24)
763
vxor $v18, $v18, $v18
764
lhu $19, (audio_count)($24)
765
vxor $v19, $v19, $v19
766
beqz $19, @@audio_04001874
767
andi $14, $26, 0xffff
768
mtc2 $14, $v31[10]
769
sll $14, $14, 2
770
mtc2 $14, $v16[0]
771
lui $1, 0x00ff
772
vxor $v20, $v20, $v20
773
ori $1, $1, 0xffff
774
vxor $v21, $v21, $v21
775
and $18, $25, $1
776
vxor $v22, $v22, $v22
777
srl $2, $25, 24
778
vxor $v23, $v23, $v23
779
sll $2, $2, 2
780
lw $3, (segmentTable)($2)
781
add $18, $18, $3
782
slv $v28[0], 0x00($23)
783
srl $1, $26, 16
784
andi $1, $1, 0x0001
785
bgtz $1, @@audio_040017a0
786
nop
787
addi $1, $23, 0x0000
788
addi $2, $18, 0x0000
789
jal dma_read_start
790
addi $3, $zero, 7
791
.endif
792
@@dma_read_busy:
793
.ifndef VERSION_SH
794
mfc0 $5, SP_DMA_BUSY
795
bnez $5, @@dma_read_busy
796
nop
797
mtc0 $zero, SP_SEMAPHORE
798
.endif
799
@@audio_040017a0:
800
.ifndef VERSION_SH
801
addi $13, $zero, adpcmTable
802
addi $1, $zero, 0x0004
803
mtc2 $1, $v14[0]
804
lqv $v24[0], 0x0010($13)
805
vmudm $v16, $v24, $v16[0]
806
ldv $v28[8], 0x00($23)
807
sqv $v16[0], 0x10($13)
808
lqv $v25[0], 0x00($13)
809
addi $13, $13, -2
810
lrv $v23[0], 0x20($13)
811
addi $13, $13, -2
812
lrv $v22[0], 0x20($13)
813
addi $13, $13, -2
814
lrv $v21[0], 0x20($13)
815
addi $13, $13, -2
816
lrv $v20[0], 0x20($13)
817
addi $13, $13, -2
818
lrv $v19[0], 0x20($13)
819
addi $13, $13, -2
820
lrv $v18[0], 0x20($13)
821
addi $13, $13, -2
822
lrv $v17[0], 0x20($13)
823
ldv $v30[0], 0x00($21)
824
ldv $v30[8], 0x08($21)
825
.endif
826
@@audio_04001800:
827
.ifndef VERSION_SH
828
vmudh $v16, $v25, $v28[6]
829
addi $21, $21, 0x10
830
vmadh $v16, $v24, $v28[7]
831
addi $19, $19, -0x10
832
vmadh $v16, $v23, $v30[0]
833
vmadh $v16, $v22, $v30[1]
834
vmadh $v16, $v21, $v30[2]
835
vmadh $v16, $v20, $v30[3]
836
vmadh $v28, $v19, $v30[4]
837
vmadh $v16, $v18, $v30[5]
838
vmadh $v16, $v17, $v30[6]
839
vmadh $v16, $v30, $v31[5]
840
ldv $v30[0], 0x00($21)
841
vsar $v26, $v15, $v28[1]
842
ldv $v30[8], 0x08($21)
843
vsar $v28, $v15, $v28[0]
844
vmudn $v16, $v26, $v14[0]
845
vmadh $v28, $v28, $v14[0]
846
sdv $v28[0], 0x00($20)
847
sdv $v28[8], 0x08($20)
848
bgtz $19, @@audio_04001800
849
addi $20, $20, 0x10
850
addi $1, $20, -8
851
addi $2, $18, 0x00
852
jal dma_write_start
853
addi $3, $zero, 7
854
.endif
855
@@dma_write_busy:
856
.ifndef VERSION_SH
857
mfc0 $5, SP_DMA_BUSY
858
bnez $5, @@dma_write_busy
859
nop
860
.endif
861
@@audio_04001874:
862
.ifndef VERSION_SH
863
j cmd_SPNOOP
864
mtc0 $zero, SP_SEMAPHORE
865
.endif
866
867
cmd_RESAMPLE:
868
lh $8, (audio_in_buf)($24)
869
lh $19, (audio_out_buf)($24)
870
lh $18, (audio_count)($24)
871
.ifdef VERSION_SH
872
sll $v0, $t9, 8
873
srl $v0, $v0, 8
874
.else
875
lui $4, 0x00ff
876
ori $4, $4, 0xffff
877
and $2, $25, $4
878
srl $5, $25, 24
879
sll $5, $5, 2
880
lw $6, (segmentTable)($5)
881
add $2, $2, $6 // physical address of state_addr
882
.endif
883
addi $1, $23, 0x0000
884
sw $2, 0x40($23) // overwrite TASK_UCODE ptr
885
addi $3, $zero, 0x1f
886
srl $7, $26, 16
887
andi $10, $7, A_INIT
888
bgtz $10, @@audio_040018dc
889
nop
890
jal dma_read_start
891
nop
892
@@dma_read_busy:
893
mfc0 $1, SP_DMA_BUSY
894
bnez $1, @@dma_read_busy
895
nop
896
j @@audio_040018e8
897
mtc0 $zero, SP_SEMAPHORE
898
@@audio_040018dc:
899
sh $zero, 0x08($23)
900
vxor $v16, $v16, $v16
901
sdv $v16[0], 0x00($23)
902
@@audio_040018e8:
903
andi $10, $7, 0x02 // A_LOOP? A_OUT?
904
beqz $10, @@audio_04001908
905
.ifdef VERSION_SH
906
ldv $v16[0], 0x00($23)
907
addi $t0, $t0, -4
908
ssv $v16[0], 0x00($t0)
909
ssv $v16[4], 0x02($t0)
910
j @@audio_c410c
911
nop
912
.else
913
nop
914
lh $11, 0x0a($23)
915
lqv $v3[0], 0x10($23)
916
sdv $v3[0], -0x10($8)
917
sdv $v3[8], -0x08($8)
918
sub $8, $8, $11
919
.endif
920
921
@@audio_04001908:
922
.ifdef VERSION_SH
923
andi $t2, $a3, 4
924
beqz $t2, @@audio_c4104
925
nop
926
addi $t0, $t0, -16
927
ssv $v16[0], 0x00($t0)
928
ssv $v16[0], 0x02($t0)
929
ssv $v16[2], 0x04($t0)
930
ssv $v16[2], 0x06($t0)
931
ssv $v16[4], 0x08($t0)
932
ssv $v16[4], 0x0a($t0)
933
ssv $v16[6], 0x0c($t0)
934
ssv $v16[6], 0x0e($t0)
935
j @@audio_c410c
936
nop
937
@@audio_c4104:
938
.endif
939
addi $8, $8, -8
940
.ifdef VERSION_SH
941
sdv $v16[0], 0x00($8)
942
.endif
943
@@audio_c410c:
944
lsv $v23[14], 0x08($23) // saved pitch_accumulator
945
.ifdef VERSION_SH
946
ldv $v16[0], 0x00($8)
947
.else
948
ldv $v16[0], 0x00($23) // saved next 4 unprocessed samples
949
sdv $v16[0], 0x00($8) // store them before the input samples
950
.endif
951
mtc2 $8, $v18[4]
952
.ifdef VERSION_SH
953
addi $10, $zero, 0x100
954
.else
955
addi $10, $zero, 0xc0
956
.endif
957
mtc2 $10, $v18[6]
958
mtc2 $26, $v18[8] // pitch
959
addi $10, $zero, 0x40
960
mtc2 $10, $v18[10]
961
.ifdef VERSION_SH
962
addi $9, $zero, 0x60
963
.else
964
addi $9, $zero, data0040
965
.endif
966
lqv $v31[0], 0x10($9) // 0x50
967
lqv $v25[0], 0x00($9) // 0x40
968
vsub $v25, $v25, $v31
969
lqv $v30[0], 0x20($9) // 0x60
970
lqv $v29[0], 0x30($9) // 0x70
971
lqv $v28[0], 0x40($9) // 0x80
972
lqv $v27[0], 0x50($9) // 0x90
973
lqv $v26[0], 0x60($9) // 0xA0
974
vsub $v25, $v25, $v31
975
lqv $v24[0], 0x70($9) // 0xB0
976
addi $21, $23, 0x20
977
addi $20, $23, 0x30
978
vxor $v22, $v22, $v22
979
vmudm $v23, $v31, $v23[7] // load pitch_accumulator into every vector element
980
vmadm $v22, $v25, $v18[4] // (accumulate with pitch times index) >> 16
981
vmadn $v23, $v31, $v30[0] // result & 0xffff
982
vmudn $v21, $v31, $v18[2] // load the in address into every vector element
983
vmadn $v21, $v22, $v30[2] // accumulate with 2 * $v22
984
vmudl $v17, $v23, $v18[5] // 64 * $v23 >> 16
985
vmudn $v17, $v17, $v30[4] // * 8
986
vmadn $v17, $v31, $v18[3] // += 0x00c0 (resample lookup table address)
987
lqv $v25[0], 0x00($9)
988
sqv $v21[0], 0x00($21)
989
sqv $v17[0], 0x00($20)
990
ssv $v23[7], 0x08($23)
991
lh $17, 0x00($21)
992
lh $9, 0x00($20)
993
lh $13, 0x08($21)
994
lh $5, 0x08($20)
995
lh $16, 0x02($21)
996
lh $8, 0x02($20)
997
lh $12, 0x0a($21)
998
lh $4, 0x0a($20)
999
lh $15, 0x04($21)
1000
lh $7, 0x04($20)
1001
lh $11, 0x0c($21)
1002
lh $3, 0x0c($20)
1003
lh $14, 0x06($21)
1004
lh $6, 0x06($20)
1005
lh $10, 0x0e($21)
1006
lh $2, 0x0e($20)
1007
@@audio_040019d8:
1008
ldv $v16[0], 0x00($17)
1009
vmudm $v23, $v31, $v23[7]
1010
ldv $v15[0], 0x00($9)
1011
vmadh $v23, $v31, $v22[7]
1012
ldv $v16[8], 0x00($13)
1013
vmadm $v22, $v25, $v18[4]
1014
ldv $v15[8], 0x00($5)
1015
vmadn $v23, $v31, $v30[0]
1016
ldv $v14[0], 0x00($16)
1017
vmudn $v21, $v31, $v18[2]
1018
ldv $v13[0], 0x00($8)
1019
vmadn $v21, $v22, $v30[2]
1020
ldv $v14[8], 0x00($12)
1021
vmudl $v17, $v23, $v18[5]
1022
ldv $v13[8], 0x00($4)
1023
ldv $v12[0], 0x00($15)
1024
ldv $v11[0], 0x00($7)
1025
ldv $v12[8], 0x00($11)
1026
vmudn $v17, $v17, $v30[4]
1027
ldv $v11[8], 0x00($3)
1028
ldv $v10[0], 0x00($14)
1029
ldv $v9[0], 0x00($6)
1030
vmadn $v17, $v31, $v18[3]
1031
ldv $v10[8], 0x00($10)
1032
vmulf $v8, $v16, $v15
1033
ldv $v9[8], 0x00($2)
1034
vmulf $v7, $v14, $v13
1035
sqv $v21[0], 0x00($21)
1036
vmulf $v6, $v12, $v11
1037
sqv $v17[0], 0x00($20)
1038
lh $17, 0x00($21)
1039
vmulf $v5, $v10, $v9
1040
lh $9, 0x00($20)
1041
vadd $v8, $v8, $v8[1q]
1042
lh $13, 0x08($21)
1043
vadd $v7, $v7, $v7[1q]
1044
lh $5, 0x08($20)
1045
vadd $v6, $v6, $v6[1q]
1046
lh $16, 0x02($21)
1047
vadd $v5, $v5, $v5[1q]
1048
lh $8, 0x02($20)
1049
vadd $v8, $v8, $v8[2h]
1050
lh $12, 0x0a($21)
1051
vadd $v7, $v7, $v7[2h]
1052
lh $4, 0x0a($20)
1053
vadd $v6, $v6, $v6[2h]
1054
lh $15, 0x04($21)
1055
vadd $v5, $v5, $v5[2h]
1056
lh $7, 0x04($20)
1057
vmudn $v4, $v29, $v8[0h]
1058
lh $11, 0x0c($21)
1059
vmadn $v4, $v28, $v7[0h]
1060
lh $3, 0x0c($20)
1061
vmadn $v4, $v27, $v6[0h]
1062
lh $14, 0x06($21)
1063
vmadn $v4, $v26, $v5[0h]
1064
lh $6, 0x06($20)
1065
lh $10, 0x0e($21)
1066
addi $18, $18, -0x10
1067
sqv $v4[0], 0x00($19)
1068
blez $18, @@audio_04001ad8
1069
lh $2, 0x0e($20)
1070
j @@audio_040019d8
1071
addi $19, $19, 0x0010
1072
@@audio_04001ad8:
1073
ssv $v23[0], 0x08($23)
1074
ldv $v16[0], 0x00($17)
1075
sdv $v16[0], 0x00($23)
1076
.ifndef VERSION_SH
1077
lh $6, (audio_in_buf)($24)
1078
addi $17, $17, 8
1079
sub $5, $17, $6
1080
andi $4, $5, 0x000f
1081
sub $17, $17, $4
1082
beqz $4, @@audio_04001b04
1083
addi $7, $zero, 0x10
1084
sub $4, $7, $4
1085
@@audio_04001b04:
1086
sh $4, 0x0a($23)
1087
ldv $v3[0], 0x00($17)
1088
ldv $v3[8], 0x08($17)
1089
sqv $v3[0], 0x10($23)
1090
.endif
1091
lw $2, 0x40($23)
1092
addi $1, $23, 0x00
1093
jal dma_write_start
1094
addi $3, $zero, 0x1f
1095
@@dma_write_busy:
1096
mfc0 $5, SP_DMA_BUSY
1097
bnez $5, @@dma_write_busy
1098
nop
1099
j cmd_SPNOOP
1100
mtc0 $zero, SP_SEMAPHORE
1101
1102
.ifdef VERSION_SH
1103
cmd_DMEMMOVE2:
1104
srl $t7, $k0, 16
1105
andi $t7, $t7, 0xff
1106
andi $t5, $k0, 0xffff
1107
srl $t6, $t9, 0x10
1108
@@audio_30C314:
1109
addi $t7, $t7, -1
1110
andi $t4, $t9, 0xffff
1111
@@audio_30C31C:
1112
lqv $v1[0], 0x00($t5)
1113
lqv $v2[0], 0x10($t5)
1114
addi $t4, $t4, -0x20
1115
addi $t5, $t5, 0x20
1116
sqv $v1[0], 0x00($t6)
1117
sqv $v2[0], 0x10($t6)
1118
bgtz $t4, @@audio_30C31C
1119
addi $t6, $t6, 0x20
1120
bgtz $t7, @@audio_30C314
1121
nop
1122
j cmd_SPNOOP
1123
nop
1124
1125
cmd_DUPLICATE:
1126
srl $t7, $k0, 0x10
1127
andi $t7, $t7, 0xff
1128
andi $t5, $k0, 0xffff
1129
srl $t6, $t9, 0x10
1130
lqv $v1[0], 0x00($t5)
1131
lqv $v2[0], 0x10($t5)
1132
lqv $v3[0], 0x20($t5)
1133
lqv $v4[0], 0x30($t5)
1134
lqv $v5[0], 0x40($t5)
1135
lqv $v6[0], 0x50($t5)
1136
lqv $v7[0], 0x60($t5)
1137
lqv $v8[0], 0x70($t5)
1138
@@audio_30C37C:
1139
addi $t7, $t7, -1
1140
sqv $v1[0], 0x00($t6)
1141
sqv $v2[0], 0x10($t6)
1142
sqv $v3[0], 0x20($t6)
1143
sqv $v4[0], 0x30($t6)
1144
sqv $v5[0], 0x40($t6)
1145
sqv $v6[0], 0x50($t6)
1146
sqv $v7[0], 0x60($t6)
1147
sqv $v8[0], 0x70($t6)
1148
bgtz $t7, @@audio_30C37C
1149
addi $t6, $t6, 0x80
1150
j cmd_SPNOOP
1151
nop
1152
1153
cmd_DOWNSAMPLE_HALF:
1154
andi $t4, $k0, 0xffff
1155
andi $t6, $t9, 0xffff
1156
srl $t5, $t9, 0x10
1157
@@audio_30C3BC:
1158
lsv $v1[0], 0x00($t5)
1159
lsv $v2[0], 0x08($t5)
1160
lsv $v3[0], 0x10($t5)
1161
lsv $v4[0], 0x18($t5)
1162
lsv $v1[2], 0x04($t5)
1163
lsv $v2[2], 0x0c($t5)
1164
lsv $v3[2], 0x14($t5)
1165
lsv $v4[2], 0x1c($t5)
1166
addi $t5, $t5, 0x20
1167
slv $v1[0], 0x00($t6)
1168
slv $v2[0], 0x04($t6)
1169
slv $v3[0], 0x08($t6)
1170
addi $t4, $t4, -8
1171
slv $v4[0], 0x0c($t6)
1172
bgtz $t4, @@audio_30C3BC
1173
addi $t6, $t6, 0x10
1174
j cmd_SPNOOP
1175
nop
1176
.endif
1177
1178
.ifndef VERSION_SH
1179
cmd_ENVMIXER:
1180
lui $4, 0x00ff
1181
ori $4, $4, 0xffff
1182
and $2, $25, $4
1183
srl $5, $25, 24
1184
sll $5, $5, 2
1185
lw $6, (segmentTable)($5)
1186
add $2, $2, $6
1187
addi $1, $23, 0x00
1188
addi $3, $zero, 0x4f
1189
vxor $v0, $v0, $v0
1190
addi $11, $zero, 0x40
1191
lqv $v31[0], 0x10($11) // all 0001
1192
lqv $v10[0], 0x00($zero) // element 6 is 0x7fff
1193
srl $12, $26, 16
1194
andi $10, $12, A_INIT
1195
beqz $10, @@audio_04001b84
1196
lqv $v24[0], 0x10($24)
1197
j @@audio_04001bb0
1198
nop
1199
@@audio_04001b84:
1200
jal dma_read_start
1201
nop
1202
@@dma_read_busy:
1203
mfc0 $5, SP_DMA_BUSY
1204
bnez $5, @@dma_read_busy
1205
nop
1206
mtc0 $zero, SP_SEMAPHORE
1207
lqv $v20[0], 0x00($23)
1208
lqv $v21[0], 0x10($23)
1209
lqv $v18[0], 0x20($23)
1210
lqv $v19[0], 0x30($23)
1211
lqv $v24[0], 0x40($23)
1212
@@audio_04001bb0:
1213
lh $13, (audio_in_buf)($24)
1214
lh $19, (audio_out_buf)($24)
1215
lh $18, (audio_aux_buf0)($24)
1216
lh $17, (audio_aux_buf1)($24)
1217
lh $16, (audio_aux_buf2)($24)
1218
lh $14, (audio_count)($24)
1219
addi $15, $zero, 0x10
1220
mfc2 $21, $v24[2]
1221
mfc2 $20, $v24[8]
1222
andi $9, $12, 0x0008
1223
bgtz $9, @@audio_04001bec
1224
nop
1225
addi $17, $23, 0x50
1226
add $16, $zero, $17
1227
addi $15, $zero, 0
1228
@@audio_04001bec:
1229
beqz $10, @@audio_04001cf0
1230
lqv $v30[0], 0x70($11)
1231
lqv $v17[0], 0x00($13)
1232
lqv $v29[0], 0x00($19)
1233
lqv $v27[0], 0x00($17)
1234
vxor $v21, $v21, $v21
1235
lsv $v20[14], 0x06($24)
1236
vmudm $v23, $v20, $v24[2]
1237
vmadh $v22, $v20, $v24[1]
1238
vmadn $v23, $v31, $v0[0]
1239
vsubc $v23, $v23, $v21
1240
vsub $v22, $v22, $v20
1241
vmudl $v23, $v30, $v23[7]
1242
vmadn $v23, $v30, $v22[7]
1243
vmadm $v22, $v31, $v0[0]
1244
vmadm $v21, $v31, $v21[7]
1245
vmadh $v20, $v31, $v20[7]
1246
bgtz $21, @@audio_04001c44
1247
vmadn $v21, $v31, $v0[0]
1248
vge $v20, $v20, $v24[0]
1249
j @@audio_04001c48
1250
nop
1251
@@audio_04001c44:
1252
vcl $v20, $v20, $v24[0]
1253
@@audio_04001c48:
1254
vmulf $v16, $v20, $v24[6]
1255
vmulf $v15, $v20, $v24[7]
1256
vmulf $v29, $v29, $v10[6]
1257
vmacf $v29, $v17, $v16
1258
vmulf $v27, $v27, $v10[6]
1259
vmacf $v27, $v17, $v15
1260
sqv $v29[0], 0x00($19)
1261
sqv $v27[0], 0x00($17)
1262
lqv $v28[0], 0x00($18)
1263
lqv $v26[0], 0x00($16)
1264
vxor $v19, $v19, $v19
1265
lsv $v18[14], 0x08($24)
1266
vmudm $v23, $v18, $v24[5]
1267
vmadh $v22, $v18, $v24[4]
1268
vmadn $v23, $v31, $v0[0]
1269
vsubc $v23, $v23, $v19
1270
vsub $v22, $v22, $v18
1271
vmudl $v23, $v30, $v23[7]
1272
vmadn $v23, $v30, $v22[7]
1273
vmadm $v22, $v31, $v0[0]
1274
vmadm $v19, $v31, $v19[7]
1275
vmadh $v18, $v31, $v18[7]
1276
bgtz $20, @@audio_04001cb4
1277
vmadn $v19, $v31, $v0[0]
1278
vge $v18, $v18, $v24[3]
1279
j @@audio_04001cb8
1280
nop
1281
@@audio_04001cb4:
1282
vcl $v18, $v18, $v24[3]
1283
@@audio_04001cb8:
1284
vmulf $v16, $v18, $v24[6]
1285
vmulf $v15, $v18, $v24[7]
1286
vmulf $v28, $v28, $v10[6]
1287
vmacf $v28, $v17, $v16
1288
vmulf $v26, $v26, $v10[6]
1289
vmacf $v26, $v17, $v15
1290
sqv $v28[0], 0x00($18)
1291
sqv $v26[0], 0x00($16)
1292
addi $14, $14, -0x10
1293
addi $13, $13, 0x10
1294
addi $19, $19, 0x10
1295
addi $18, $18, 0x10
1296
add $17, $17, $15
1297
add $16, $16, $15
1298
@@audio_04001cf0:
1299
vmudl $v23, $v21, $v24[2]
1300
vmadm $v23, $v20, $v24[2]
1301
vmadn $v23, $v21, $v24[1]
1302
vmadh $v20, $v20, $v24[1]
1303
vmadn $v21, $v31, $v0[0]
1304
@@audio_04001d04:
1305
bgtz $21, @@audio_04001d30
1306
lqv $v17[0], 0x00($13)
1307
vge $v20, $v20, $v24[0]
1308
vmudl $v23, $v19, $v24[5]
1309
vmadm $v23, $v18, $v24[5]
1310
vmadn $v23, $v19, $v24[4]
1311
lqv $v29[0], 0x00($19)
1312
vmadh $v18, $v18, $v24[4]
1313
lqv $v27[0], 0x00($17)
1314
j @@audio_04001d50
1315
vmadn $v19, $v31, $v0[0]
1316
@@audio_04001d30:
1317
vcl $v20, $v20, $v24[0]
1318
vmudl $v23, $v19, $v24[5]
1319
vmadm $v23, $v18, $v24[5]
1320
vmadn $v23, $v19, $v24[4]
1321
lqv $v29[0], 0x00($19)
1322
vmadh $v18, $v18, $v24[4]
1323
lqv $v27[0], 0x00($17)
1324
vmadn $v19, $v31, $v0[0]
1325
@@audio_04001d50:
1326
vmulf $v16, $v20, $v24[6]
1327
sqv $v20[0], 0x00($23)
1328
vmulf $v15, $v20, $v24[7]
1329
sqv $v21[0], 0x10($23)
1330
vmulf $v29, $v29, $v10[6]
1331
vmacf $v29, $v17, $v16
1332
lqv $v28[0], 0x00($18)
1333
vmulf $v27, $v27, $v10[6]
1334
lqv $v26[0], 0x00($16)
1335
vmacf $v27, $v17, $v15
1336
bgtz $20, @@audio_04001da0
1337
sqv $v29[0], 0x00($19)
1338
vge $v18, $v18, $v24[3]
1339
vmudl $v23, $v21, $v24[2]
1340
sqv $v27[0], 0x00($17)
1341
vmadm $v23, $v20, $v24[2]
1342
vmadn $v23, $v21, $v24[1]
1343
vmadh $v20, $v20, $v24[1]
1344
j @@audio_04001dbc
1345
vmadn $v21, $v31, $v0[0]
1346
@@audio_04001da0:
1347
vcl $v18, $v18, $v24[3]
1348
vmudl $v23, $v21, $v24[2]
1349
sqv $v27[0], 0x00($17)
1350
vmadm $v23, $v20, $v24[2]
1351
vmadn $v23, $v21, $v24[1]
1352
vmadh $v20, $v20, $v24[1]
1353
vmadn $v21, $v31, $v0[0]
1354
@@audio_04001dbc:
1355
vmulf $v16, $v18, $v24[6]
1356
addi $14, $14, -0x10
1357
vmulf $v15, $v18, $v24[7]
1358
addi $19, $19, 0x10
1359
vmulf $v28, $v28, $v10[6]
1360
add $17, $17, $15
1361
vmacf $v28, $v17, $v16
1362
addi $13, $13, 0x10
1363
vmulf $v26, $v26, $v10[6]
1364
vmacf $v26, $v17, $v15
1365
sqv $v28[0], 0x00($18)
1366
addi $18, $18, 0x10
1367
blez $14, @@audio_04001dfc
1368
sqv $v26[0], 0x00($16)
1369
j @@audio_04001d04
1370
add $16, $16, $15
1371
@@audio_04001dfc:
1372
sqv $v18[0], 0x20($23)
1373
sqv $v19[0], 0x30($23)
1374
sqv $v24[0], 0x40($23)
1375
jal dma_write_start
1376
addi $3, $zero, 0x004f
1377
@@dma_write_busy:
1378
mfc0 $5, SP_DMA_BUSY
1379
bnez $5, @@dma_write_busy
1380
nop
1381
j cmd_SPNOOP
1382
mtc0 $zero, SP_SEMAPHORE
1383
1384
cmd_MIXER:
1385
lqv $v31[0], 0x00($zero) // element 6 is 0x7fff
1386
lhu $18, (audio_count)($24)
1387
beqz $18, @@cmd_mixer_done // skip operation when count is 0
1388
nop
1389
andi $19, $25, 0xffff
1390
addi $19, $19, dmemBase // dmemout + DMEM_BASE
1391
srl $20, $25, 16
1392
addi $20, $20, dmemBase // dmemin + DMEM_BASE
1393
andi $17, $26, 0xffff
1394
mtc2 $17, $v30[0]
1395
lqv $v27[0], 0x00($19)
1396
lqv $v29[0], 0x00($20)
1397
lqv $v26[0], 0x10($19)
1398
lqv $v28[0], 0x10($20)
1399
@@audio_04001e5c:
1400
vmulf $v27, $v27, $v31[6]
1401
addi $18, $18, -0x20
1402
vmacf $v27, $v29, $v30[0]
1403
addi $20, $20, 0x20
1404
sqv $v27[0], 0x00($19)
1405
vmulf $v26, $v26, $v31[6]
1406
lqv $v29[0], 0x00($20)
1407
vmacf $v26, $v28, $v30[0]
1408
lqv $v28[0], 0x10($20)
1409
sqv $v26[0], 0x10($19)
1410
addi $19, $19, 0x20
1411
lqv $v27[0], 0x00($19)
1412
bgtz $18, @@audio_04001e5c
1413
lqv $v26[0], 0x10($19)
1414
@@cmd_mixer_done:
1415
j cmd_SPNOOP
1416
nop
1417
nop
1418
.endif
1419
1420
.ifdef VERSION_SH
1421
cmd_ENVMIXER:
1422
vxor $v4, $v4, $v4
1423
vxor $v0, $v0, $v0
1424
lqv $v3[0], 0x0(r0)
1425
add $21, $21, $21
1426
mtc2 $21, $v4[0]
1427
mtc2 $21, $v4[2]
1428
srl $12, $26, 12
1429
andi $19, $12, 0xff0
1430
add $22, $22, $22
1431
mtc2 $22, $v4[4]
1432
mtc2 $22, $v4[6]
1433
srl $12, $25, 20
1434
andi $14, $12, 0xff0
1435
add $11, $11, $11
1436
mtc2 $11, $v4[8]
1437
mtc2 $11, $v4[10]
1438
srl $12, $25, 12
1439
andi $15, $12, 0xff0
1440
srl $12, $25, 4
1441
andi $16, $12, 0xff0
1442
sll $12, $25, 4
1443
andi $17, $12, 0xff0
1444
andi $12, $26, 0x2
1445
lhu $12, 0xe0(r12)
1446
mtc2 $12, $v2[0]
1447
andi $12, $26, 0x1
1448
sll $12, $12, 1
1449
lhu $12, 0xe0(r12)
1450
mtc2 $12, $v2[2]
1451
srl $12, $26, 8
1452
andi $20, $12, 0xff
1453
vadd $v0, $v0, $v0
1454
andi $10, $26, 0x4
1455
lqv $v8[0], 0x0(r19)
1456
1457
@audio_400196c:
1458
lqv $v15[0], 0x10(r19)
1459
addi $19, $19, 0x20
1460
vmudm $v9, $v8, $v1[0]
1461
vmudm $v10, $v8, $v1[2]
1462
addi $20, $20, 0xfff0
1463
lqv $v11[0], 0x0(r14)
1464
lqv $v12[0], 0x0(r15)
1465
vmudm $v16, $v15, $v1[1]
1466
vmudm $v17, $v15, $v1[3]
1467
lqv $v18[0], 0x10(r14)
1468
lqv $v19[0], 0x10(r15)
1469
vxor $v9, $v9, $v2[0]
1470
vxor $v10, $v10, $v2[1]
1471
lqv $v13[0], 0x0(r16)
1472
lqv $v14[0], 0x0(r17)
1473
vadd $v11, $v11, $v9
1474
vadd $v12, $v12, $v10
1475
vmudm $v9, $v9, $v1[4]
1476
vmudm $v10, $v10, $v1[4]
1477
vxor $v16, $v16, $v2[0]
1478
vxor $v17, $v17, $v2[1]
1479
lqv $v20[0], 0x10(r16)
1480
lqv $v21[0], 0x10(r17)
1481
vadd $v18, $v18, $v16
1482
vadd $v19, $v19, $v17
1483
vmudm $v16, $v16, $v1[5]
1484
vmudm $v17, $v17, $v1[5]
1485
sqv $v11[0], 0x0(r14)
1486
bne $10, $0, @audio_4001a34
1487
sqv $v12[0], 0x0(r15)
1488
vadd $v13, $v13, $v9
1489
vadd $v14, $v14, $v10
1490
sqv $v18[0], 0x10(r14)
1491
sqv $v19[0], 0x10(r15)
1492
vadd $v20, $v20, $v16
1493
vadd $v21, $v21, $v17
1494
@audio_40019fc:
1495
addi $14, $14, 0x20
1496
sqv $v13[0], 0x0(r16)
1497
sqv $v14[0], 0x0(r17)
1498
addi $15, $15, 0x20
1499
lqv $v8[0], 0x0(r19)
1500
sqv $v20[0], 0x10(r16)
1501
sqv $v21[0], 0x10(r17)
1502
addi $16, $16, 0x20
1503
vaddc $v1, $v1, $v4
1504
addi $17, $17, 0x20
1505
bgtz $20, @audio_400196c
1506
vadd $v0, $v0, $v0
1507
j cmd_SPNOOP
1508
vxor $v0, $v0, $v0
1509
@audio_4001a34:
1510
vadd $v13, $v13, $v10
1511
vadd $v14, $v14, $v9
1512
sqv $v18[0], 0x10(r14)
1513
sqv $v19[0], 0x10(r15)
1514
vadd $v20, $v20, $v17
1515
j @audio_40019fc
1516
vadd $v21, $v21, $v16
1517
1518
cmd_ENVSETUP1:
1519
vxor $v1, $v1, $v1
1520
andi $11, $26, 0xffff
1521
srl $12, $26, 8
1522
andi $12, $12, 0xff00
1523
mtc2 $12, $v1[8]
1524
add $12, $12, $11
1525
mtc2 $12, $v1[10]
1526
srl $21, $25, 16
1527
j cmd_SPNOOP
1528
andi $22, $25, 0xffff
1529
1530
cmd_ENVSETUP2:
1531
srl $12, $25, 16
1532
mtc2 $12, $v1[0]
1533
add $12, $12, $21
1534
mtc2 $12, $v1[2]
1535
andi $12, $25, 0xffff
1536
mtc2 $12, $v1[4]
1537
add $12, $12, $22
1538
j cmd_SPNOOP
1539
mtc2 $12, $v1[6]
1540
1541
@audio_4001a9c:
1542
srl $3, $26, 12
1543
andi $3, $3, 0xff0
1544
andi $1, $26, 0xffff
1545
@audio_4001aa8:
1546
sll $2, $25, 8
1547
jr $31
1548
srl $2, $2, 8
1549
1550
cmd_LOADBUFF:
1551
jal @audio_4001a9c
1552
nop
1553
jal dma_read_start
1554
addi $3, $3, 0xffff
1555
@audio_4001ac4:
1556
mfc0 $1, sp_dma_busy
1557
bne $1, $0, @audio_4001ac4
1558
nop
1559
j cmd_SPNOOP
1560
mtc0 $0, sp_semaphore
1561
1562
cmd_SAVEBUFF:
1563
jal @audio_4001a9c
1564
nop
1565
jal dma_write_start
1566
addi $3, $3, 0xffff
1567
j @audio_4001ac4
1568
nop
1569
1570
cmd_LOADADPCM:
1571
jal @audio_4001aa8
1572
addi $1, $0, adpcmTable
1573
andi $3, $26, 0xffff
1574
jal dma_read_start
1575
addi $3, $3, 0xffff
1576
j @audio_4001ac4
1577
nop
1578
1579
cmd_MIXER:
1580
lqv $v31[0], 0x0(r0)
1581
srl $18, $26, 12
1582
andi $18, $18, 0xff0
1583
andi $19, $25, 0xffff
1584
srl $20, $25, 16
1585
andi $17, $26, 0xffff
1586
mtc2 $17, $v30[0]
1587
lqv $v27[0], 0x0(r19)
1588
lqv $v29[0], 0x0(r20)
1589
lqv $v26[0], 0x10(r19)
1590
lqv $v28[0], 0x10(r20)
1591
@audio_4001b38:
1592
vmulf $v27, $v27, $v31[6]
1593
addi $18, $18, 0xffe0
1594
vmacf $v27, $v29, $v30[0]
1595
addi $20, $20, 0x20
1596
vmulf $v26, $v26, $v31[6]
1597
vmacf $v26, $v28, $v30[0]
1598
lqv $v29[0], 0x0(r20)
1599
sqv $v27[0], 0x0(r19)
1600
lqv $v27[0], 0x20(r19)
1601
lqv $v28[0], 0x10(r20)
1602
sqv $v26[0], 0x10(r19)
1603
addi $19, $19, 0x20
1604
bgtz $18, @audio_4001b38
1605
lqv $v26[0], 0x10(r19)
1606
j cmd_SPNOOP
1607
nop
1608
1609
cmd_S8DEC:
1610
lhu $13, (audio_in_buf)(r24)
1611
vxor $v2, $v2, $v2
1612
lhu $14, (audio_out_buf)(r24)
1613
vxor $v3, $v3, $v3
1614
lhu $12, (audio_count)(r24)
1615
sll $17, $25, 8
1616
srl $17, $17, 8 // state addr
1617
sqv $v2[0], 0x0(r14) // store 0 to first 16 samples if A_INIT
1618
sqv $v3[0], 0x10(r14)
1619
srl $1, $26, 16
1620
andi $1, $1, 0x1
1621
bgtz $1, @audio_4001bd8 // A_INIT
1622
srl $1, $26, 16
1623
andi $1, $1, 0x2
1624
beq $0, $1, @audio_4001bbc // A_LOOP
1625
addi $2, $17, 0x0
1626
lw $2, (audio_loop_value)(r24)
1627
@audio_4001bbc:
1628
addi $1, $14, 0x0
1629
jal dma_read_start
1630
addi $3, $0, 0x1f
1631
@audio_4001bc8:
1632
mfc0 $5, sp_dma_busy
1633
bne $5, $0, @audio_4001bc8
1634
nop
1635
mtc0 $0, sp_semaphore
1636
@audio_4001bd8:
1637
addi $14, $14, 0x20
1638
beq $12, $0, @audio_4001c04 // this of very few ops allows count=0
1639
nop
1640
@audio_4001be4:
1641
lpv $v2[0], 0x0(r13) // load each byte to upper 8 bits per elem
1642
lpv $v3[0], 0x8(r13)
1643
addi $13, $13, 0x10
1644
addi $12, $12, 0xffe0
1645
sqv $v2[0], 0x0(r14)
1646
sqv $v3[0], 0x10(r14)
1647
bgtz $12, @audio_4001be4
1648
addi $14, $14, 0x20
1649
@audio_4001c04:
1650
addi $1, $14, 0xffe0 // write last 16 samples to the state
1651
addi $2, $17, 0x0
1652
jal dma_write_start
1653
addi $3, $0, 0x1f
1654
@audio_4001c14:
1655
mfc0 $5, sp_dma_busy
1656
bne $5, $0, @audio_4001c14
1657
nop
1658
j cmd_SPNOOP
1659
mtc0 $0, sp_semaphore
1660
1661
cmd_HILOGAIN:
1662
andi $12, $26, 0xffff
1663
srl $13, $25, 16
1664
srl $15, $26, 4
1665
andi $15, $15, 0xf000
1666
mtc2 $15, $v3[2]
1667
srl $15, $26, 20
1668
andi $15, $15, 0xf
1669
mtc2 $15, $v3[0]
1670
@audio_4001c48:
1671
lqv $v1[0], 0x0(r13)
1672
lqv $v2[0], 0x10(r13)
1673
vmudm $v4, $v1, $v3[1]
1674
vmadh $v4, $v1, $v3[0]
1675
vmudm $v5, $v2, $v3[1]
1676
vmadh $v5, $v2, $v3[0]
1677
sqv $v4[0], 0x0(r13)
1678
sqv $v5[0], 0x10(r13)
1679
addi $12, $12, 0xffe0
1680
bgtz $12, @audio_4001c48
1681
addi $13, $13, 0x20
1682
j cmd_SPNOOP
1683
vxor $v0, $v0, $v0
1684
1685
cmd_1c7c:
1686
andi $12, $26, 0xffff
1687
srl $13, $25, 16
1688
addi $14, $13, 0x0
1689
andi $15, $25, 0xffff
1690
srl $11, $26, 16
1691
andi $11, $11, 0xff
1692
add $15, $15, $11
1693
ldv $v11[0], 0x0(r15)
1694
ldv $v12[0], 0x10(r15)
1695
ldv $v13[0], 0x20(r15)
1696
ldv $v14[0], 0x30(r15)
1697
ldv $v11[8], 0x8(r15)
1698
ldv $v12[8], 0x18(r15)
1699
ldv $v13[8], 0x28(r15)
1700
ldv $v14[8], 0x38(r15)
1701
@audio_4001cb8:
1702
lqv $v3[0], 0x0(r13)
1703
lqv $v4[0], 0x10(r13)
1704
lqv $v5[0], 0x20(r13)
1705
lqv $v6[0], 0x30(r13)
1706
vmudh $v3, $v3, $v11
1707
vmudh $v4, $v4, $v12
1708
vmudh $v5, $v5, $v13
1709
vmudh $v6, $v6, $v14
1710
sqv $v3[0], 0x0(r13)
1711
sqv $v4[0], 0x10(r13)
1712
sqv $v5[0], 0x20(r13)
1713
sqv $v6[0], 0x30(r13)
1714
addi $12, $12, 0xffc0
1715
bgtz $12, @audio_4001cb8
1716
addi $13, $13, 0x40
1717
j cmd_SPNOOP
1718
nop
1719
1720
cmd_FILTER:
1721
addi $13, $23, 0x0
1722
vxor $v0, $v0, $v0
1723
addi $14, $23, 0x10
1724
sqv $v0[0], 0x0(r13)
1725
sll $2, $25, 8
1726
srl $2, $2, 8
1727
srl $12, $26, 16
1728
andi $12, $12, 0xff
1729
beq $12, $0, @audio_4001d68
1730
nop
1731
addi $12, $12, 0xffff
1732
beq $12, $0, @audio_4001d88
1733
nop
1734
andi $15, $26, 0xffff
1735
vxor $v0, $v0, $v0
1736
sqv $v0[0], 0x0(r14)
1737
sqv $v0[0], 0x20(r14)
1738
addi $1, $14, 0x10
1739
addi $3, $0, 0xf
1740
jal dma_read_start
1741
nop
1742
mfc0 $5, sp_dma_busy
1743
bne $5, $0, 0x4001d50
1744
nop
1745
mtc0 $0, sp_semaphore
1746
j cmd_SPNOOP
1747
nop
1748
@audio_4001d68:
1749
add $1, $13, $0
1750
addi $3, $0, 0xf
1751
jal dma_read_start
1752
nop
1753
@audio_4001d78:
1754
mfc0 $5, sp_dma_busy
1755
bne $5, $0, 0x4001d78
1756
nop
1757
mtc0 $0, sp_semaphore
1758
@audio_4001d88:
1759
add $1, $13, $0
1760
andi $11, $26, 0xffff
1761
lqv $v24[0], 0x10(r14)
1762
ldv $v28[0], 0x8(r14)
1763
ldv $v28[8], 0x10(r14)
1764
ldv $v20[0], 0x18(r14)
1765
ldv $v20[8], 0x20(r14)
1766
addi $14, $14, 0x2
1767
ldv $v31[0], 0x0(r14)
1768
ldv $v31[8], 0x8(r14)
1769
ldv $v17[0], 0x10(r14)
1770
ldv $v17[8], 0x18(r14)
1771
ldv $v27[0], 0x8(r14)
1772
ldv $v27[8], 0x10(r14)
1773
ldv $v21[0], 0x18(r14)
1774
ldv $v21[8], 0x20(r14)
1775
addi $14, $14, 0x2
1776
ldv $v30[0], 0x0(r14)
1777
ldv $v30[8], 0x8(r14)
1778
ldv $v26[0], 0x8(r14)
1779
ldv $v26[8], 0x10(r14)
1780
ldv $v18[0], 0x10(r14)
1781
ldv $v18[8], 0x18(r14)
1782
ldv $v22[0], 0x18(r14)
1783
ldv $v22[8], 0x20(r14)
1784
addi $14, $14, 0x2
1785
ldv $v29[0], 0x0(r14)
1786
ldv $v29[8], 0x8(r14)
1787
ldv $v25[0], 0x8(r14)
1788
ldv $v25[8], 0x10(r14)
1789
ldv $v19[0], 0x10(r14)
1790
ldv $v19[8], 0x18(r14)
1791
ldv $v23[0], 0x18(r14)
1792
ldv $v23[8], 0x20(r14)
1793
lqv $v15[0], 0x0(r13)
1794
@audio_4001e14:
1795
lqv $v16[0], 0x0(r11)
1796
vxor $v14, $v14, $v14
1797
vmulf $v0, $v0, $v0
1798
vmacf $v14, $v23, $v15[1]
1799
vmacf $v14, $v22, $v15[2]
1800
vmacf $v14, $v21, $v15[3]
1801
vmacf $v14, $v20, $v15[4]
1802
vmacf $v14, $v19, $v15[5]
1803
vmacf $v14, $v18, $v15[6]
1804
vmacf $v14, $v17, $v15[7]
1805
vmacf $v14, $v24, $v16[0]
1806
vmacf $v14, $v25, $v16[1]
1807
vmacf $v14, $v26, $v16[2]
1808
vmacf $v14, $v27, $v16[3]
1809
vmacf $v14, $v28, $v16[4]
1810
vmacf $v14, $v29, $v16[5]
1811
vmacf $v14, $v30, $v16[6]
1812
vmacf $v14, $v31, $v16[7]
1813
addi $15, $15, 0xfff0
1814
sqv $v14[0], 0x0(r11)
1815
addi $11, $11, 0x10
1816
bgtz $15, @audio_4001e14
1817
vaddc $v15, $v0, $v16
1818
sqv $v16[0], 0x0(r13)
1819
addi $3, $0, 0xf
1820
jal dma_write_start
1821
nop
1822
@audio_4001e80:
1823
mfc0 $5, sp_dma_busy
1824
bne $5, $0, @audio_4001e80
1825
nop
1826
mtc0 $0, sp_semaphore
1827
j cmd_SPNOOP
1828
nop
1829
1830
cmd_ADDMIXER:
1831
vaddc $v31, $v31, $v31
1832
srl $18, $26, 12
1833
andi $18, $18, 0xff0
1834
andi $19, $25, 0xffff
1835
srl $20, $25, 16
1836
lqv $v27[0], 0x0(r19)
1837
@audio_4001eb0:
1838
lqv $v29[0], 0x0(r20)
1839
lqv $v26[0], 0x10(r19)
1840
lqv $v28[0], 0x10(r20)
1841
lqv $v25[0], 0x20(r19)
1842
lqv $v23[0], 0x20(r20)
1843
lqv $v24[0], 0x30(r19)
1844
lqv $v22[0], 0x30(r20)
1845
addi $20, $20, 0x40
1846
vadd $v27, $v27, $v29
1847
vadd $v26, $v26, $v28
1848
vadd $v25, $v25, $v23
1849
vadd $v24, $v24, $v22
1850
addi $18, $18, 0xffc0
1851
sqv $v27[0], 0x0(r19)
1852
sqv $v26[0], 0x10(r19)
1853
sqv $v25[0], 0x20(r19)
1854
sqv $v24[0], 0x30(r19)
1855
addi $19, $19, 0x40
1856
bgtz $18, @audio_4001eb0
1857
lqv $v27[0], 0x0(r19)
1858
j cmd_SPNOOP
1859
nop
1860
1861
cmd_RESAMPLE_ZOH:
1862
lh $14, 0x0(r24)
1863
lh $15, 0x2(r24)
1864
lh $13, 0x4(r24)
1865
andi $12, $26, 0xffff
1866
sll $12, $12, 2
1867
andi $10, $25, 0xffff
1868
sll $14, $14, 16
1869
or $10, $10, $14
1870
@audio_4001f28:
1871
srl $11, $10, 16
1872
andi $11, $11, 0xfffe
1873
lsv $v1[0], 0x0(r11)
1874
add $10, $10, $12
1875
srl $11, $10, 16
1876
andi $11, $11, 0xfffe
1877
lsv $v1[2], 0x0(r11)
1878
add $10, $10, $12
1879
srl $11, $10, 16
1880
andi $11, $11, 0xfffe
1881
lsv $v1[4], 0x0(r11)
1882
add $10, $10, $12
1883
srl $11, $10, 16
1884
andi $11, $11, 0xfffe
1885
lsv $v1[6], 0x0(r11)
1886
add $10, $10, $12
1887
addi $13, $13, 0xfff8
1888
sdv $v1[0], 0x0(r15)
1889
addi $15, $15, 0x8
1890
bgtz $13, @audio_4001f28
1891
nop
1892
jal cmd_SPNOOP
1893
nop
1894
.endif
1895
1896
.close // CODE_FILE
1897
1898