usb patches (tueidj)
[libogc.git] / libaesnd / dspcode / dspmixer.s
blobde94f6f99c99025ddeb26b2c3c5346ae55a6984f
1 DMACR: equ 0xffc9
2 DMABLEN: equ 0xffcb
3 DMADSPM: equ 0xffcd
4 DMAMMEMH: equ 0xffce
5 DMAMMEML: equ 0xffcf
7 ACCOEF: equ 0xffa0
9 ACFMT: equ 0xffd1
10 ACSAH: equ 0xffd4
11 ACSAL: equ 0xffd5
12 ACEAH: equ 0xffd6
13 ACEAL: equ 0xffd7
14 ACCAH: equ 0xffd8
15 ACCAL: equ 0xffd9
16 ACPDS: equ 0xffda
17 ACYN1: equ 0xffdb
18 ACYN2: equ 0xffdc
19 ACDAT: equ 0xffdd
20 ACGAN: equ 0xffde
22 DIRQ: equ 0xfffb
23 DMBH: equ 0xfffc
24 DMBL: equ 0xfffd
25 CMBH: equ 0xfffe
26 CMBL: equ 0xffff
28 DMADMEM: equ 0x0
29 DMAIMEM: equ 0x2
30 DMA_TO_DSP: equ 0x0
31 DMA_TO_CPU: equ 0x1
33 /* internal work memory layout */
34 MEM_REG: equ 0x0
35 PB_MADDRH: equ MEM_REG
36 PB_MADDRL: equ MEM_REG+0x01
38 PB_ADDR: equ MEM_REG+0x200
40 /* parameter block layout */
41 OUTBUF_ADDRH: equ PB_ADDR
42 OUTBUF_ADDRL: equ PB_ADDR+0x01
44 SNDBUF_SADDRH: equ PB_ADDR+0x02
45 SNDBUF_SADDRL: equ PB_ADDR+0x03
46 SNDBUF_EADDRH: equ PB_ADDR+0x04
47 SNDBUF_EADDRL: equ PB_ADDR+0x05
48 SNDBUF_CADDRH: equ PB_ADDR+0x06
49 SNDBUF_CADDRL: equ PB_ADDR+0x07
51 YN1: equ PB_ADDR+0x08
52 YN2: equ PB_ADDR+0x09
53 PDS: equ PB_ADDR+0x0a
55 FREQ_SMPH: equ PB_ADDR+0x0b
56 FREQ_SMPL: equ PB_ADDR+0x0c
58 SMP_CNT: equ PB_ADDR+0x0d
60 SMP_L: equ PB_ADDR+0x0e
61 SMP_R: equ PB_ADDR+0x0f
63 VOLUME_L: equ PB_ADDR+0x10
64 VOLUME_R: equ PB_ADDR+0x11
66 DELAY_SMPH: equ PB_ADDR+0x12
67 DELAY_SMPL: equ PB_ADDR+0x13
69 FLAGS_SMPH: equ PB_ADDR+0x14
70 FLAGS_SMPL: equ PB_ADDR+0x15
72 LOOP_PDS: equ PB_ADDR+0x16
73 LOOP_YN1: equ PB_ADDR+0x17
74 LOOP_YN2: equ PB_ADDR+0x18
76 /* flags and buffers used */
77 MEM_SMP_BUF: equ 0x0800
78 MEM_TMP_BUF: equ 0x0a00
79 MEM_SND_BUF: equ 0x0c00 //buffer for output sound data, will be DMA'd out to OUTBUF_SND
81 PB_STURCT_SIZE: equ 64
82 NUM_SAMPLES: equ 96 //process 2ms of sample data
83 DEF_FREQ_INT: equ 0x0001
85 VOICE_FLAGL_PAUSE: equ 0x0004
86 VOICE_FLAGL_LOOP: equ 0x0008
87 VOICE_FLAGL_ONCE: equ 0x0010
89 VOICE_FLAGH_END: equ 0x0010
90 VOICE_FLAGH_STOP: equ 0x0020
91 VOICE_FLAGH_RUN: equ 0x4000
93 ACCL_FMT_8BIT: equ 0x0019
94 ACCL_FMT_16BIT: equ 0x000a
96 ACCL_GAIN_8BIT: equ 0x0100
97 ACCL_GAIN_16BIT: equ 0x0800
99 _start:
102 jmp exception1
103 jmp exception2
104 jmp exception3
105 jmp exception4
106 jmp exception5
107 jmp exception6
108 jmp exception7
110 sbset #0x02
111 sbset #0x03
112 sbclr #0x04
113 sbset #0x05
114 sbset #0x06
117 clr15
119 lri $config,#0xff
121 lri $wr0,#0xffff
122 lri $wr1,#0xffff
123 lri $wr2,#0xffff
124 lri $wr3,#0xffff
126 main:
127 si @DMBH,#0xdcd1
128 si @DMBL,#0x0000
129 si @DIRQ,#0x01
131 recv_cmd:
132 clr $acc0
133 clr $acc1
135 call wait_mail_sent
136 call wait_mail_recv
138 lri $acc0.m,#0xcdd1
140 jeq sys_commands
142 lri $acc0.m,#0xface
144 jne wait_commands
146 lrs $acc1.m,@CMBL
148 cmpi $acc1.m,#0x0010
149 jeq process_first_voice
151 cmpi $acc1.m,#0x0020
152 jeq process_next_voice
154 cmpi $acc1.m,#0x0080
155 jeq get_pb_address
157 cmpi $acc1.m,#0x0100
158 jeq send_samples
160 cmpi $acc1.m,#0xdead
161 jeq task_terminate
163 wait_commands:
164 jmp recv_cmd
166 sys_commands:
167 lrs $acc1.m,@CMBL
169 cmpi $acc1.m,#0x0001
170 jeq run_nexttask
172 cmpi $acc1.m,#0x0002
173 jeq 0x8000
174 halt
176 run_nexttask:
178 clr $acc0
179 clr $acc1
180 call wait_mail_acc0
181 lrs $acc0.l,@CMBL
182 call wait_mail_acc1
183 lrs $acc1.l,@CMBL
184 call wait_mail_acc1
185 lrs $acc1.m,@CMBL
186 srs @DMAMMEMH,$acc0.m
187 srs @DMAMMEML,$acc0.l
188 si @DMACR,#DMA_TO_CPU
189 srs @DMADSPM,$acc1.m
190 srs @DMABLEN,$acc1.l
191 clr $acc0
192 clr $acc1
193 call wait_mail_acc0
194 lrs $acc0.l,@CMBL
195 mrr $ix0,$acc0.m
196 mrr $ix1,$acc0.l
197 call wait_mail_acc1
198 lrs $acc1.l,@CMBL
199 call wait_mail_acc1
200 lrs $acc1.m,@CMBL
201 mrr $ix2,$acc1.m
202 mrr $ix3,$acc1.l
203 clr $acc0
204 call wait_mail_acc0
205 lrs $acc0.m,@CMBL
206 mrr $ar0,$acc0.m
207 clr $acc1
208 call wait_mail_acc1
209 lrs $acx0.l,@CMBL
210 mrr $acx0.h,$acc1.m
211 call wait_mail_acc0
212 lrs $acx1.l,@CMBL
213 call wait_mail_acc0
214 lrs $acx1.h,@CMBL
215 wait_dmem_dma:
216 lrs $acc0.m,@DMACR
217 andf $acc0.m,#0x0004
218 jlnz wait_dmem_dma
219 jmp 0x80b5
220 halt
222 task_terminate:
223 si @DMBH,#0xdcd1
224 si @DMBL,#0x0003
225 si @DIRQ,#0x01
226 jmp recv_cmd
228 send_samples:
229 lri $ar0,#MEM_SND_BUF
230 lris $acx1.l,#DMA_TO_CPU
231 lri $acx0.l,#NUM_SAMPLES*4
232 lr $acc0.m,@OUTBUF_ADDRH
233 lr $acc0.l,@OUTBUF_ADDRL
234 call dma_data
236 si @DMBH,#0xdcd1
237 si @DMBL,#0x0004
238 si @DIRQ,#0x01
240 jmp recv_cmd
242 get_pb_address:
243 call wait_mail_recv
245 lri $ar2,#PB_MADDRH
247 lrs $acc0.m,@CMBH
248 srri @$ar2,$acc0.m
250 lrs $acc0.m,@CMBL
251 srr @$ar2,$acc0.m
253 jmp recv_cmd
255 process_next_voice:
256 si @DMACR,#DMA_TO_DSP
257 call dma_pb_block
259 jmp dsp_mixer
261 process_first_voice:
262 si @DMACR,#DMA_TO_DSP
263 call dma_pb_block
265 lri $ar0,#MEM_SND_BUF
266 lri $acc1.l,#0
268 lri $acx0.l,#NUM_SAMPLES*2
269 loop $acx0.l
270 srri @$ar0,$acc1.l
272 dsp_mixer:
273 clr $acc0
275 lr $acc1.m,@FLAGS_SMPL
276 andcf $acc1.m,#VOICE_FLAGL_PAUSE
277 jlz finish_voice
279 lr $acc1.m,@FLAGS_SMPH
280 andcf $acc1.m,#VOICE_FLAGH_RUN
281 jlnz finish_voice
283 lri $ar1,#SNDBUF_SADDRH
284 lrri $acc0.m,@$ar1
285 lrrd $acc0.l,@$ar1
287 tst $acc0
288 jeq finish_voice
290 no_change_buffer:
291 lr $acc1.l,@FLAGS_SMPL
293 mrr $acc1.m,$acc1.l
294 andi $acc1.m,#0x02
295 addi $acc1.m,#select_format
296 mrr $ar3,$acc1.m
297 ilrri $acc0.m,@$ar3
298 ilrri $acc1.m,@$ar3
299 call setup_accl
301 mrr $acc1.m,$acc1.l
302 andi $acc1.m,#0x03
303 addi $acc1.m,#select_mixer
304 mrr $ar3,$acc1.m
305 ilrr $acc1.m,@$ar3
306 mrr $ar3,$acc1.m
308 lri $ar1,#SMP_L
309 clr'l $acc0 : $acx0.h,@$ar1 //left last sample
310 lrri $acx1.h,@$ar1 //right last sample
311 lrri $ix2,@$ar1
312 lrri $ix3,@$ar1
313 lrri $acc0.h,@$ar1
314 lrri $acc0.m,@$ar1
316 lri $ar0,#MEM_SND_BUF
317 lri $acx0.l,#NUM_SAMPLES
319 lri $ar1,#FREQ_SMPH
320 lri $wr1,#0x0004
322 tst $acc0
323 jeq no_delay
325 lri $ix0,#2
327 bloop $acx0.l,delay_loop
328 decm $acc0.m
329 jeq exit_delay
330 delay_loop:
331 addarn $ar0,$ix0
333 exit_delay:
334 mrr $acx0.l,$st3
335 sr @DELAY_SMPH,$acc0.h
336 sr @DELAY_SMPL,$acc0.m
338 no_delay:
340 bloop $acx0.l,dspmixer_loop_end
342 // right/left channel sample mix
343 lrri $acc1.m,@$ar0 // right channel
344 lrr $acc0.m,@$ar0 // left channel
345 addr'dr $acc1.m,$acx1.h : $ar0
346 addr's $acc0.m,$acx0.h : @$ar0,$acc1.m
347 srri @$ar0,$acc0.m
349 clr'l $acc0 : $acx1.h,@$ar1
350 lrri $acx1.l,@$ar1
351 lrr $acc0.l,@$ar1
354 addax $acc0,$acx1
355 mrr $acx0.l,$acc0.m
356 srri @$ar1,$acc0.l
357 cmpis $acc0.m,#DEF_FREQ_INT
358 jrge $ar3
360 jmp no_mix
362 mono_8bits:
363 bloop $acx0.l,mono_8bits_end
364 lrs $acc1.m,@ACDAT //right channel
365 mono_8bits_end:
366 mrr $acc0.m,$acc1.m //left channel
368 jmp mix_samples
370 stereo_8bits:
371 bloop $acx0.l,stereo_8bits_end
372 lrs $acc1.m,@ACDAT //right channel
373 stereo_8bits_end:
374 lrs $acc0.m,@ACDAT //left channel
376 jmp mix_samples
378 mono_16bits:
379 bloop $acx0.l,mono_16bits_end
380 lrs $acc1.m,@ACDAT //right channel
381 mono_16bits_end:
382 mrr $acc0.m,$acc1.m //left channel
384 jmp mix_samples
386 stereo_16bits:
387 bloop $acx0.l,stereo_16bits_end
388 lrs $acc1.m,@ACDAT //right channel
389 stereo_16bits_end:
390 lrs $acc0.m,@ACDAT //left channel
392 mix_samples:
393 // multiply samples*volume
394 mrr $acx0.h,$ix2
395 mulc $acc0.m,$acx0.h //left channel
396 mrr $acx1.h,$ix3
397 mulcmv $acc1.m,$acx1.h,$acc0 //right channel
398 asl $acc0,#8
399 movp's $acc1 : @$ar1,$acc0.m
400 asl $acc1,#8
401 srrd @$ar1,$acc1.m
402 no_mix:
403 lrri $acx0.h,@$ar1
404 dspmixer_loop_end:
405 lrri $acx1.h,@$ar1
407 mixer_end:
410 lri $wr1,#0xffff
412 lri $ar1,#PDS
413 lrs $acc0.m,@ACPDS
414 srrd @$ar1,$acc0.m
415 lrs $acc0.m,@ACYN2
416 srrd @$ar1,$acc0.m
417 lrs $acc0.m,@ACYN1
418 srrd @$ar1,$acc0.m
419 lrs $acc0.m,@ACCAL
420 srrd @$ar1,$acc0.m
421 lrs $acc0.m,@ACCAH
422 srrd @$ar1,$acc0.m
424 finish_voice:
425 lr $acc0.m,@FLAGS_SMPH
426 ori $acc0.m,#VOICE_FLAGH_END
427 sr @FLAGS_SMPH,$acc0.m
429 si @DMACR,#DMA_TO_CPU
430 call dma_pb_block
432 si @DMBH,#0xdcd1
433 si @DMBL,#0x0004
434 si @DIRQ,#0x01
436 jmp recv_cmd
438 dma_pb_block:
439 lr $acc0.m,@PB_MADDRH
440 lr $acc0.l,@PB_MADDRL
441 srs @DMAMMEMH,$acc0.m
442 srs @DMAMMEML,$acc0.l
443 si @DMADSPM,#PB_ADDR
444 si @DMABLEN,#PB_STURCT_SIZE
446 wait_dma_pb:
447 lrs $acc0.m,@DMACR
448 andf $acc0.m,#0x04
449 jlnz wait_dma_pb
452 dma_data:
453 srs @DMAMMEMH,$acc0.m
454 srs @DMAMMEML,$acc0.l
455 sr @DMADSPM,$ar0
456 sr @DMACR,$acx1.l
457 sr @DMABLEN,$acx0.l
459 wait_dma:
460 lrs $acc0.m,@DMACR
461 andf $acc0.m,#0x04
462 jlnz wait_dma
465 //setup_accl: acc0.m = format, acc1.m = gain, ar1 = sndbuf_start
466 setup_accl:
467 srs @ACFMT,$acc0.m
468 srs @ACGAN,$acc1.m
470 lrri $acc0.m,@$ar1
471 srs @ACSAH,$acc0.m
472 lrri $acc0.m,@$ar1
473 srs @ACSAL,$acc0.m
474 lrri $acc0.m,@$ar1
475 srs @ACEAH,$acc0.m
476 lrri $acc0.m,@$ar1
477 srs @ACEAL,$acc0.m
478 lrri $acc0.m,@$ar1
479 srs @ACCAH,$acc0.m
480 lrri $acc0.m,@$ar1
481 srs @ACCAL,$acc0.m
482 lrri $acc0.m,@$ar1
483 srs @ACYN1,$acc0.m
484 lrri $acc0.m,@$ar1
485 srs @ACYN2,$acc0.m
486 lrri $acc0.m,@$ar1
487 srs @ACPDS,$acc0.m
489 si @ACCOEF+0,#0
490 si @ACCOEF+1,#0
491 si @ACCOEF+2,#0
492 si @ACCOEF+3,#0
493 si @ACCOEF+4,#0
494 si @ACCOEF+5,#0
495 si @ACCOEF+6,#0
496 si @ACCOEF+7,#0
497 si @ACCOEF+8,#0
498 si @ACCOEF+9,#0
499 si @ACCOEF+10,#0
500 si @ACCOEF+11,#0
501 si @ACCOEF+12,#0
502 si @ACCOEF+13,#0
503 si @ACCOEF+14,#0
504 si @ACCOEF+15,#0
508 wait_mail_sent:
509 lrs $acc0.m,@DMBH
510 andf $acc0.m,#0x8000
511 jlnz wait_mail_sent
514 wait_mail_recv:
515 lrs $acc1.m,@CMBH
516 andcf $acc1.m,#0x8000
517 jlnz wait_mail_recv
520 wait_mail_acc0:
521 lrs $acc0.m,@CMBH
522 andcf $acc0.m,#0x8000
523 jlnz wait_mail_acc0
526 wait_mail_acc1:
527 lrs $acc1.m,@CMBH
528 andcf $acc1.m,#0x8000
529 jlnz wait_mail_recv
532 /* exceptions */
533 exception1: // Stack overflow
536 exception2:
539 exception3:
542 exception4:
545 exception5: // Accelerator address overflow
547 mrr $st1,$acc0.m
549 lrs $acc0.m,@ACYN1
550 srs @ACYN1,$acc0.m
551 lrs $acc0.m,@ACYN2
552 srs @ACYN2,$acc0.m
553 lrs $acc0.m,@ACPDS
554 srs @ACPDS,$acc0.m
556 mrr $acc0.m,$st1
559 exception6:
562 exception7: // External interrupt (message from CPU)
565 select_mixer:
566 cw mono_8bits
567 cw stereo_8bits
568 cw mono_16bits
569 cw stereo_16bits
571 select_format:
572 cw ACCL_FMT_8BIT
573 cw ACCL_GAIN_8BIT
574 cw ACCL_FMT_16BIT
575 cw ACCL_GAIN_16BIT