added apex audio system
[gbajam21] / libs / aas / AAS_Mixer.s
1 @ Copyright (c) 2003-2021 James Daniels
2 @ Distributed under the MIT License
3 @ license terms: see LICENSE file in root or http://opensource.org/licenses/MIT
4
5 .TEXT
6 .SECTION    .iwram,"ax",%progbits
7 .ALIGN
8 .ARM
9
10 .GLOBAL AAS_MixAudio
11 .GLOBAL AAS_MixAudio_NoChange
12 .EXTERN AAS_DivTable
13
14 .GLOBAL _AAS_MixAudio_mod1
15 .GLOBAL _AAS_MixAudio_mod2
16 .GLOBAL _AAS_MixAudio_mod3
17 .GLOBAL _AAS_MixAudio_mod4
18 .GLOBAL _AAS_MixAudio_mod5
19 .GLOBAL _AAS_MixAudio_mod6
20 .GLOBAL _AAS_MixAudio_mod7
21 .GLOBAL _AAS_MixAudio_mod8
22
23 .pool
24
25 _ma_mov_r3_0: mov r3,#0
26 _ma_add_r0_r0_0: add r0,r0,#0
27
28 _ma_ldr_pc_0: .word 0xe51f0000+8  @ sort of equivalent to opcode(ldr r0,[pc,#-0])
29 _ma_mov_r14_r0_lsr_6: mov r14,r0,lsr #6
30 _ma_ldrsb_r0_r14_shifted: .word 0x3e1fe00d  @ (opcode("ldrsb r0,[r14,#+0]!")>>4) + (3<<28)
31 _ma_add_r0_r0_r0_lsl_16: adds r0,r0,r0,lsl #16  @ change regs as appropriate
32 _ma_vol_lookup_addr: .word _AAS_vol_lookup-1
33 _ma_total_iterations: .word 0x0
34 _ma_total_delta: .word 0x0
35 _ma_bytes_available: .word 0x0
36 _ma_no_skip: .word 0x0
37
38
39         @ AAS_CODE_IN_IWRAM void AAS_MixAudio_NoChange( AAS_s8* mix_buffer, struct AAS_Channel chans[], int iterations );
40
41 AAS_MixAudio_NoChange:
42         stmfd sp!,{r4-r11,r14}
43         sub sp,sp,#16
44         stmfd   sp!,{r0-r2}
45         
46         mov r9,#0
47         str r9,_ma_no_skip
48         ldr r10,_ma_bytes_available
49         ldr r9,_ma_total_iterations
50         cmp r9,r2
51         movhi r9,r2
52         mov r11,r9
53         ldr r2,_ma_total_delta
54         
55         b ma_quickstart
56
57
58         @ AAS_CODE_IN_IWRAM void AAS_MixAudio( AAS_s8* mix_buffer, struct AAS_Channel chans[], int iterations );
59
60 AAS_MixAudio:
61         stmfd sp!,{r4-r11,r14}
62         sub sp,sp,#16
63         stmfd   sp!,{r0-r2}
64
65         @ [sp] = _ma_mix_buffer
66         @ [sp,#4] = _ma_chans
67         @ [sp,#8] = _ma_to_go
68         @ [sp,#12] = _ma_iterations_loop
69         @ [sp,#16] = _ma_iterations_buffer
70         @ [sp,#20] = _ma_iterations_scale_buffer
71         @ [sp,#24] = _ma_loop_counter
72
73         @ r0 = temp
74         @ r1 = chans
75         @ r2 = iterations in main loop 
76         @ r3 = _ma_add_r0_r0_r0_lsl_16
77         @ r4 = temp
78         @ r5 = temp
79         @ r6 = outer loop counter/active channels found/total delta>>2
80         @ r7 = temp
81         @ r8 = temp
82         @ r9 = temp
83         @ r10 = temp
84         @ r11 = temp
85         @ r12 = dest address
86         @ r14 = temp
87         
88 ma_do_setup:
89 _AAS_MixAudio_mod1:
90         adr r12,ma_buffer_start
91         ldr r3,_ma_add_r0_r0_r0_lsl_16
92 _AAS_MixAudio_mod5:
93         mov r6,#0x70000000  @ was #0x30000000
94         mov r2,#256
95         
96         
97 ma_setup_loop:
98         ldrb r14,[r1],#20  @ effective_volume
99
100         cmp r14,#0
101         beq ma_skip  @ skip if effective_volume == 0
102         
103         
104         @ Setup volume registers:
105         @ r11 = increment for r4
106         @ r14 = "mul r5,r0,r3"/"mov r5,r0,lsl #0"/"mlane r5,r0,r3,r5"/"add r5,r5,r0,lsl #0"
107         @adr r10,_ma_vol_lookup-1
108         ldr r10,_ma_vol_lookup_addr
109         add r4,r10,#129  @ 129 = 1+_ma_mul_r5_r0_r3-_ma_vol_lookup
110         ldrsb r10,[r10,r14]
111         ands r5,r6,#0x0f000000  @ test if this is first active channel
112         addne r4,r4,#16  @ 16 = _ma_mlane_r5_r0_r3_r5-_ma_mul_r5_r0_r3
113         @adreq r4,_ma_mul_r5_r0_r3  @ use mul/mov if this is first non-zero chan
114         @adrne r4,_ma_mlane_r5_r0_r3_r5  @ use mlane/add if this is first non-zero chan
115         cmp r10,#0
116         ldrlt r11,_ma_mov_r3_0  @ read "mov r3,#vol" if vol not power of 2
117         addlt r11,r11,r14  @ set #vol in "mov r3,#vol" if vol not power of 2
118         strlt r11,[r12],#4  @ write "mov r3,#vol" if vol not power of 2
119         addge r4,r4,#8  @ increment if vol is power of 2
120         ldmia r4,{r11,r14}  @ read mul/mlane/mov/add and increment
121         addge r14,r14,r10,lsl #7  @ set lsl #val for mov/add if vol power of 2
122         
123
124         @ r0,r4,r5,r7,r8,r9,r10 available
125         @ r3 = _ma_add_r0_r0_0
126         @ r5 = delta/increment for r14
127         @ r8 = _ma_divide_table
128         @ r11 = temp (was increment for r14)
129         @ r12 = dest address
130         @ r14 = "mul r5,r0,r3"/"mov r5,r0,lsl #0"/"mlane r5,r0,r3,r5"/"add r5,r5,r0,lsl #0"
131         
132         @ Setup delta registers, write delta increment instructions:
133         @ r5 = delta/increment for r14
134         adr r7,_ma_chan_cache  @ could remove
135         add r7,r7,r5,lsr #22  @ could remove
136         ldr r10,_ma_ldr_pc_0  @ could pre-subtract _ma_chan_cache from _ma_ldr_pc_0 (would need to set at runtime)
137         sub r10,r10,r7  @ could change to sub r10,r10,r5,lsr #22
138         add r0,r10,r12
139         eor r10,r10,#0x00100000  @ switch to str
140         ldr r7,_ma_mov_r14_r0_lsr_6
141         ldrh r5,[r1,#6-20]  @ delta
142         and r9,r5,#0xff
143         ldr r4,_ma_add_r0_r0_0
144         add r9,r4,r9
145         stmia r12!,{r0,r7,r9}
146         add r7,r4,#0xc00
147         add r7,r7,r5,lsr #8
148         tst r7,#0xff
149         strne r7,[r12],#4
150         add r6,r6,r5,lsr #2
151         add r7,r10,r12
152         str r7,[r12],#4
153         add r5,r11,r5,lsl #20
154         
155         
156         @ Final setup:
157         @ r0 = delta_pos
158         @ r8 = x
159         @ r9 = x_history
160         @ r10 = local outer loop counter/_ma_ldrsb_r0_r14_shifted
161         mov r0,#0x200  @ delta_pos = 0.5 (was 0)
162         ldr r10,_ma_ldrsb_r0_r14_shifted
163         mov r8,#0
164         mov r9,#0
165         
166         
167         @ r0 = delta_pos
168         @ r1 = chans
169         @ r2 = iterations in main loop
170         @ r3 = _ma_add_r0_r0_r0_lsl_16
171         @ r4 = temp
172         @ r5 = delta/increment for r14
173         @ r6 = outer loop counter/total delta<<1
174         @ r7 = temp
175         @ r8 = x
176         @ r9 = x_history
177         @ r10 = local outer loop counter/_ma_ldrsb_r0_r14_shifted
178         @ r11 = temp (was increment for r14)
179         @ r12 = dest address
180         @ r14 = "mul r5,r0,r3"/"mov r5,r0,lsl #0"/"mlane r5,r0,r3,r5"/"add r5,r5,r0,lsl #0"
181
182         @ Write instructions:
183         mov r7,r10,lsl #4
184         str r7,[r12],#4
185         b ma_setup_inner_loop_first
186         .word 0,0,0  @ padding
187 ma_setup_outer_loop:
188
189         @ Write delta:
190         add r0,r0,r5,lsr #20
191         movs r4,r0,lsr #10
192         beq ma_setup_inner_loop_skip1
193         sub r0,r0,r4,lsl #10
194         add r4,r4,r10,lsl #4
195         mov r8,r7
196         add r4,r4,r8,lsl #4
197         str r4,[r12],#4
198 ma_setup_inner_loop_skip1:
199         add r9,r8,r9,lsl #8
200
201 ma_setup_inner_loop_first:
202
203         @ Write delta:
204         add r0,r0,r5,lsr #20
205         movs r4,r0,lsr #10
206         beq ma_setup_inner_loop_skip2
207         sub r0,r0,r4,lsl #10
208         add r4,r4,r10,lsl #4
209         subs r8,r8,#0x100
210         movlt r8,#0x200
211         add r4,r4,r8,lsl #4
212         str r4,[r12],#4
213 ma_setup_inner_loop_skip2:
214         add r9,r8,r9,lsl #8
215         
216         @ Write delta:
217         add r0,r0,r5,lsr #20
218         movs r4,r0,lsr #10
219         beq ma_setup_inner_loop_skip3
220         sub r0,r0,r4,lsl #10
221         add r4,r4,r10,lsl #4
222         subs r8,r8,#0x100
223         movlt r8,#0x200
224         add r4,r4,r8,lsl #4
225         str r4,[r12],#4
226 ma_setup_inner_loop_skip3:
227         add r9,r8,r9,lsl #8
228         
229         @ Write merge and mul/mla/mov/add:
230         subs r11,r8,#0x100
231         movlt r11,#0x200
232         add r7,r14,r11,lsr #8
233         add r4,r3,r11,lsl #4
234         bic r11,r9,#0x00ff0000
235         add r4,r4,r11,lsr #8
236         stmia r12!,{r4,r7}
237         add r14,r14,r5,lsl #12
238         
239         @ Write delta:
240         add r0,r0,r5,lsr #20
241         movs r4,r0,lsr #10
242         beq ma_setup_inner_loop_skip4
243         sub r0,r0,r4,lsl #10
244         add r4,r4,r10,lsl #4
245         subs r8,r8,#0x100
246         movlt r8,#0x200
247         add r4,r4,r8,lsl #4
248         str r4,[r12],#4
249 ma_setup_inner_loop_skip4:
250         add r9,r8,r9,lsl #8
251         
252         @ Write merge: (skips if unnecessary)
253         subs r7,r8,#0x100
254         movlt r7,#0x200
255         bic r4,r9,#0x00ff0000
256         cmp r4,r11
257         addne r11,r3,r4,lsr #8
258         addne r11,r11,r7,lsl #4
259         strne r11,[r12],#4
260
261         @ Write mul/mla/mov/add:
262         add r4,r14,r7,lsr #8
263         str r4,[r12],#4
264         add r14,r14,r5,lsl #12
265         
266         subs r10,r10,#0x10000000
267         bge ma_setup_outer_loop
268         
269         
270         @ Calculate iterations until end of sample:
271         ldr r10,[r1,#8-20]  @ pos
272         ldr r0,[r1,#12-20]  @ end
273         sub r0,r0,r10
274         mov r5,r5,lsr #19
275         ldr r8,_ma_divide_table
276         ldrh r5,[r8,r5]
277         mul r0,r5,r0
278         cmp r2,r0,lsr #10
279         movhi r2,r0,lsr #10
280         
281         add r6,r6,#0x01000000  @ increment active channels found
282         
283 ma_skip:
284         subs r6,r6,#0x10000000
285         bge ma_setup_loop
286
287         @ Write "b ma_again"
288 _AAS_MixAudio_mod3:
289         adr r0,ma_again
290         sub r0,r0,r12
291         mov r0,r0,asr #2
292         sub r0,r0,#2
293         @bic r0,r0,#0xff000000
294         @add r0,r0,#0xea000000
295         adr r4,ma_buffer_end
296         bic r0,r0,#0x15000000  @ offset always negative, so this is equivalent to above
297         str r0,[r12],#4
298         
299         sub r10,r4,r12
300         and r4,r6,#0x0f000000
301         sub r10,r10,r4,lsr #21  @ r10 -= 8*used_channels
302         @str r10,_ma_iterations_scale_buffer
303         @str r10,[sp,#20]
304         str r10,_ma_bytes_available
305         
306         ldr r11,[sp,#8]
307         subs r9,r2,r11
308         str r9,_ma_total_iterations
309         @cmp r2,r11
310         mov r9,#1
311         movhi r9,#0
312         str r9,_ma_no_skip
313         movhi r2,r11
314         
315         mov r11,r2
316         mov r9,r2
317         bic r2,r6,#0xff000000
318         str r2,_ma_total_delta
319         
320         @ r2 = total_delta>>2
321         @ r9 = r11 = total_iterations - i.e. iterations until loop - argh! need to recalculate each call!
322         @ r10 = ((bytes_available-(8*channels_used))<<4)
323         
324         @ Could remove need to recalc total_iterations each call by not doing "total_iterations = min( iterations, total_iterations )" - do min below instead and sub "iterations" from "total_iterations" afterwards. Problem: Need to accurately calculate "total_iterations" even when it is large. (Although only need to cope with total_iterations being twice as large as it is now because only ever re-use config once.)
325         
326 ma_quickstart:
327         @ldr r4,_ma_mix_buffer
328         ldr r4,[sp]
329         
330         
331         @ r1 = &_ma_mix_buffer
332         @ r2 = total_delta>>2
333         @ r3 = refill iterations<<3
334         @ r4 = _ma_mix_buffer
335         @ r5 = temp
336         @ r6 = temp
337         @ r7 = temp
338         @ r8 = #0x04000000
339         @ r9 = total iterations
340         @ r10 = ((bytes_available-(8*channels_used))<<4)
341         @ r11 = total iterations
342         @ r12 = temp
343         @ r14 = dest
344         
345         @ Calc iterations
346         @ iterations = ((bytes_available-(8*channels_used))<<4)/(total_delta>>2)
347         ldr r3,_ma_divide_table
348 ma_begin:  @ called from process loop
349         mov r2,r2,lsl #1
350         ldrh r3,[r3,r2]
351         mul r3,r10,r3
352         @str r3,_ma_iterations_buffer
353         str r3,[sp,#16]
354 ma_begin2:
355         cmp r9,r3,lsr #12  @ was asr #3
356         movgt r9,r3,lsr #12  @ was asr #3
357
358         sub r3,r11,r9
359         @str r3,_ma_iterations_loop
360         str r3,[sp,#12]
361
362         cmp r9,#0
363         ble ma_end
364
365
366         @ r0 = temp
367         @ r1 = temp
368         @ r2 = 0xc0
369         @ r3 = chans
370         @ r4 = _ma_mix_buffer
371         @ r5 = DMA address
372         @ r6 = 2
373         @ r7 = temp
374         @ r8 = &_ma_chan_cache
375         @ r9 = iterations
376         @ r10 = loop counter
377         @ r11 = temp
378         @ r12 = buffer address
379         @ r14 = temp
380
381         @ Fill buffer
382         adr r8,_ma_chan_cache
383         mov r5,#0x04000000
384         add r5,r5,#0xd4
385         mov r6,#2
386 _AAS_MixAudio_mod6:
387         mov r10,#8  @ was #4 - could perhaps set according to max # of channels / 2?
388         mov r2,#0xc0
389         adr r12,ma_buffer_end
390         @ldr r3,_ma_chans
391         ldr r3,[sp,#4]
392         
393 ma_fill_buffer_loop:
394         ldrb r14,[r3],#20  @ effective_volume
395         cmp r14,#0
396         beq ma_fill_buffer_skip
397         ldr r7,[r3,#8-20]  @ pos
398         bic r0,r7,#0x3
399         ldrb r11,[r3,#3-20]  @ pos_fraction
400         and r1,r2,r7,lsl #6
401         add r1,r1,r11,lsr #2
402         ldrh r14,[r3,#6-20]  @ delta
403         mul r14,r9,r14
404         add r11,r11,r14,lsl #2
405         strb r11,[r3,#3-20]  @ pos_fraction
406         add r7,r7,r11,lsr #8
407         str r7,[r3,#8-20]  @ pos
408         add r7,r6,r14,lsr #8  @ words to copy
409         sub r12,r12,r7,lsl #2
410         add r1,r1,r12,lsl #6 
411         str r1,[r8],#4  @ IWRAM pos
412         add r14,r7,#0x84000000
413         stmia r5,{r0,r12,r14}
414 ma_fill_buffer_skip:
415         subs r10,r10,#1
416         bgt ma_fill_buffer_loop
417         
418         @ Setup registers for main loop
419         @ldr r3,_ma_to_go
420         ldr r3,[sp,#8]
421         sub r3,r3,r9
422         @str r3,_ma_to_go
423         str r3,[sp,#8]
424         
425         @ Setup registers for main loop
426         @mvn r14,#0xff00
427         @add r14,r14,r9,lsl #24
428         mvn r14,#0xff00
429         bic r14,r14,#0x1000000
430         add r14,r14,r9,lsl #25
431 _AAS_MixAudio_mod2:
432         b ma_start
433
434 ma_end:
435         @ldr r9,_ma_iterations_loop
436         ldr r9,[sp,#12]
437         movs r11,r9
438         @ldrne r3,_ma_iterations_buffer
439         ldrne r3,[sp,#16]
440         bne ma_begin2
441
442         @ldr r1,_ma_chans
443         ldr r1,[sp,#4]
444         @ should be after ble below?
445
446         @ldr r9,_ma_to_go
447         ldr r9,[sp,#8]
448         cmp r9,#0
449         ldrle r3,_ma_no_skip
450         cmple r3,#0
451         ble ma_chan_finished
452         
453         @ change so only branch if done all iterations and no samples have ended
454         
455         @ r0 = redo setup
456         @ r1 = chans[] (was loop)
457         @ r2 = total_delta>>2
458         @ r3 = divide_table
459         @ r4 = _ma_mix_buffer
460         @ r5 = temp
461         @ r6 = delta
462         @ r7 = end
463         @ r8 = unused
464         @ r9 = loops to go
465         @ r10 = _ma_specific_first
466         @ r11 = &ma_chan0_start
467         @ r12 = temp
468         @ r13 = unused
469         @ r14 = loop (was chans[])
470         
471         ldr r3,_ma_divide_table
472 _AAS_MixAudio_mod7:
473         mov r14,#8  @ was #4
474         mov r2,#0
475         mov r0,#0
476
477 ma_check_chan_loop:
478         ldrb r7,[r1],#20
479         cmp r7,#0
480         beq ma_chan_done
481         
482         ldrh r7,[r1,#6-20]  @ delta
483         ldr r12,[r1,#8-20]  @ pos
484         ldr r6,[r1,#12-20]  @ end
485         sub r5,r6,r7,lsr #6
486         sub r5,r5,#1
487         cmp r5,r12
488         ble ma_chan_do_loop
489         
490 ma_chan_ok:
491         add r2,r2,r7,lsr #2
492         sub r5,r6,r12
493         mov r7,r7,lsl #1
494         ldrh r7,[r3,r7]
495         mul r5,r7,r5
496         cmp r9,r5,lsr #10
497         movhi r9,r5,lsr #10
498         
499 ma_chan_done:
500         subs r14,r14,#1
501         bgt ma_check_chan_loop
502         
503         cmp r0,#0
504         bne ma_chan_has_finished
505         
506         movs r11,r9
507         @ldrgt r10,_ma_iterations_scale_buffer
508         @ldrgt r10,[sp,#20]
509         ldrgt r10,_ma_bytes_available
510         bgt ma_begin
511
512 ma_chan_finished:
513         add sp,sp,#28
514         ldmfd   sp!, {r4-r11, r14}
515         bx lr @ Thumb interwork friendly.
516
517 ma_chan_has_finished:
518         cmp r2,#0
519         beq ma_chan_all_zeroes
520         @ldr r2,_ma_to_go
521         @ldr r2,[sp,#8]
522 _AAS_MixAudio_mod8:
523         sub r1,r1,#(20*8)  @ was #(20*4)
524         @str r4,_ma_mix_buffer
525         str r4,[sp]
526         b ma_do_setup
527
528 ma_chan_all_zeroes:  @ very rare - only happens if last active channel finished during this period
529         @ldr r5,_ma_to_go
530         ldr r5,[sp,#8]  @ can be 0 sometimes
531         movs r5,r5,lsl #2
532         add r5,r5,#0x85000000
533         adr r2,_ma_empty
534         mov r6,#0x04000000
535         add r6,r6,#0xd4
536         stmneia r6,{r2,r4,r5}  @ r5(_ma_to_go) can be 0 sometimes
537         b ma_chan_finished
538         
539
540
541 ma_chan_do_loop:
542         ldr r5,[r1,#16-20]  @ loop_length
543         cmp r5,#0
544         
545         mov r0,#1  @ redo setup    !!moved!!
546         
547         @ Loop sample
548         subne r12,r12,r5
549         strne r12,[r1,#8-20] @ pos
550         bne ma_chan_ok
551
552         @ Set inactive
553         strh r5,[r1,#0-20]  @ effective_volume + active
554         @mov r0,#1  @ redo setup    !!was here!!
555         b ma_chan_done
556         
557         
558 _ma_chan_cache:
559         .word 0,0,0,0,0,0,0,0  @ IWRAM pos, chan: 0,1,2,3,4,5,6,7
560
561 _ma_divide_table: .word AAS_DivTable
562
563 _ma_empty: .word 0
564 .word 0,0  @ padding
565
566 _AAS_MixAudio_mod4:
567
568         @ r0-r2 : temp
569         @ r3 : volume
570         @ r4 : output address
571         @ r5-r12 : output buffer
572         @ r14 : sample address/loop/mask
573
574 ma_again:
575         
576         @ r0 = temp
577         @ r1 = temp2
578         @ r2 = mask_0x80808080
579         @@ r3 free
580         
581         @ Make sure algo is as efficient as possible
582
583         @ Merge
584         @ldr r14,_ma_loop_counter
585         ldr r14,[sp,#24]
586         and r5,r14,r5,lsr #8
587         and r6,r14,r6,lsr #8
588         and r7,r14,r7,lsr #8
589         and r8,r14,r8,lsr #8
590         and r9,r14,r9,lsr #8
591         and r10,r14,r10,lsr #8
592         and r11,r14,r11,lsr #8
593         and r12,r14,r12,lsr #8
594         add r5,r5,r6,lsl #8
595         add r6,r7,r8,lsl #8
596         add r7,r9,r10,lsl #8
597         add r8,r11,r12,lsl #8
598         
599         @ Store
600         stmia r4!,{r5-r8}
601         
602         @ Loop
603         subs r14,r14,#0x2000000
604         ble ma_end
605
606 ma_start:
607         @str r14,_ma_loop_counter
608         str r14,[sp,#24]
609
610 ma_buffer_start: @ 2048 bytes  (1152 bytes would be equivalent to previous cache size)
611
612         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
613         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
614         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
615         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
616         
617         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
618         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
619         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
620         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
621         
622         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
623         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
624         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
625         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
626         
627         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
628         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
629         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
630         .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0  @ 128 bytes
631         
632 ma_buffer_end: