merge gfx-opt branch
[drnoksnes] / spc_decode.S
1
2         .align 4
3         .globl  DecodeBlockAsm
4         .globl  DecodeBlockAsm2
5         
6 /*
7 ;Bit-Rate Expand Waveform
8 ;
9 ;Desc:
10 ;   Decompresses a 9-byte bit-rate reduced block into 16 16-bit samples.
11 ;   This procedure is designed to be recursively called to decompress a series of blocks.
12 ;In:
13 ;   R0=ESI-> Sample Block
14 ;   R1=EDI   -> Output buffer
15 ;   R2=EDX   =3D Last sample of previous block (32-bit)
16 ;   R3=EBX   =3D Next to last sample (sign extended from 16-bits)
17 ;Out:
18 ;   R0=ESI -> Next Block
19 ;   R1=EDI -> After last sample
20 ;   R2=EDX =3D Last sample (32-bit)
21 ;   R3=EBX =3D Next to last sample (16-bit)
22 ;Destroys:
23 ;   R4=EAX      
24 */
25
26 .macro  SMP12CLIP16     
27         CMP     R4, R12
28         BGT     1111f   
29         MOVNE   R4, R12
30         B       1112f
31 1111:
32         CMP     R4, R11
33         MOVGT   R4, R11
34 1112:
35         CMP     R2, R12
36         BGT     1121f   
37         MOVNE   R2, R12
38         B       1122f
39 1121:
40         CMP     R2, R11
41         MOVGT   R2, R11
42 1122:
43 .endm
44
45 @ void DecodeBlockAsm2 (int8 *, int16 *, int32 *, int32 *);
46 @ DecodeBlockAsm2 (compressed, raw, &ch->previous [0], &ch->previous [1]);
47         .align 4
48 DecodeBlockAsm:
49
50         STMFD           SP!,{R4,LR}
51                         
52         STMFD           SP!,{R2,R3}
53         LDR             R2,[R2]
54         LDR             R3,[R3]
55         BL              BREWave
56         LDMFD           SP!,{R0,R1}
57         STR             R2,[R0]
58         STR             R3,[R1]
59                 
60         LDMFD           SP!,{R4,LR}
61         MOV             PC,LR   
62
63 BREWave:        
64         STMFD   SP!,{R5,R6,R7}
65         @ Mov   AL,[ESI]                           ;Get header byte
66         @ Inc   ESI
67         
68         LDRB    R4,[R0],#1
69         @ Mov   CL,0CFh
70         @ Sub   CL,AL   
71         @ SetC  AH
72         @ Dec   AH
73         @ And   CL,AH
74         @ ShR   CL,4                               ;Isolate range
75         CMP     R4,#0xD0
76         MOVHS   R5,#0
77         MOVLO   R5,#0xCF
78         SUBLO   R5,R5,R4
79         MOVLO   R5,R5,LSR #4
80                                                 
81         @ Mov   CH,8                               ;Decompress 8 bytes (16 nybbles)
82         MOV     R6,#8   
83         @ Test  AL,0Ch                             ;Does block use ADPCM compression?
84         @ JZ    @@Method0                    ;  No
85         TST     R4,#0xC
86         BEQ     Method0
87         @ Test  AL,8                               ;Does block use method 1?
88         @ JZ    @@Method1                    ;  Yes
89         TST     R4,#0x8
90         BEQ     Method1
91         @ Test  AL,4                               ;Does block use method 2?
92         @ jnz   @@Method3                          ;  Yes
93         @ jmp   @@Method2
94         TST     R4,#0x4
95         BEQ     Method2
96         B       Method3                 @ ;Must use method 3
97 /*
98 ALIGN   16
99         ;[Smp] ----------------------------------*/
100 Method0:
101         ADD     R5,R5,#16
102 Method0loop:
103         @ XOr   EAX,EAX
104         @ XOr   EDX,EDX
105         @ Mov   AH,byte[ESI]                        ;Get byte
106         @ Mov   DH,AH
107         @ And   AH,0F0h                         ;AH = High nybble << 12
108         @ ShL   DH,4                            ;DH = Low nybble << 12
109         LDRB    R4,[R0],#1
110          @ R4 = 0x000000hl
111         MOV     R2,R4,LSL #(28)
112          @ R2 = 0xl0000000
113         MOV     R4,R4,LSL #(24)
114          @ R4 = 0xhl000000
115         BIC     R4,R4,#0x0F000000
116          @ R4 = 0xh0000000
117                 
118         @ SAR   AX,CL                           ;Reduce samples according to range
119         @ SAR   DX,CL
120         MOV     R4,R4,ASR R5    
121         MOV     R2,R2,ASR R5
122                 
123         @ Mov   word[EDI],AX
124         @ Mov   word[2+EDI],DX
125         STRH    R4,[R1],#2
126         STRH    R2,[R1],#2
127         
128         @ Add   EDI,4
129         @ Inc   ESI
130         @ Dec   CH
131         @ JNZ   Short @@Method0
132         @ MovSX EDX,DX
133         @ MovSX EBX,AX
134         @ Ret   
135         SUBS    R6,R6,#1
136         BNE     Method0loop     
137         MOV     R2,R2,LSL #16
138         MOV     R2,R2,ASR #16
139         MOV     R3,R4,LSL #16
140         MOV     R3,R3,ASR #16           
141         LDMFD   SP!,{R5,R6,R7}
142         MOV     PC,LR
143
144 @ ALIGN 16
145 @       ;[Delta]+[Smp-1](15/16) -----------------
146 Method1:
147         ADD     R7,R5,#16
148 Method1loop:    
149                 @ MovSX EBX,byte[ESI]              ;Sign extend upper nybble into EBX
150                 @ And   BL,0F0h
151                 @ ShL   EBX,8
152                 @ SAR   EBX,CL
153                 LDRSB   R3,[R0]
154                 BIC     R3,R3,#0xF
155                 MOV     R3,R3,LSL #8
156                 MOV     R3,R3,ASR R5
157
158                 @ MovSX EAX,DX
159                 @ Add   EBX,EAX
160                 @ SAR   EAX,4
161                 @ Sub   EBX,EAX
162                 MOV     R4,R2,LSL #16           
163                 ADD     R3,R3,R4,ASR #16
164                 SUB     R3,R3,R4,ASR #20
165
166                 @ Mov   word[EDI],BX
167                 STRH    R3,[R1],#2
168
169                 @ Mov   DL,byte[ESI]
170                 @ ShL   EDX,12
171                 @ MovSX EDX,DX
172                 @ SAR   EDX,CL
173                 LDRSB   R2,[R0],#1              
174                 MOV     R2,R2,LSL #(12+16)              
175                 MOV     R2,R2,ASR R7
176
177                 @ MovSX EAX,BX
178                 @ Add   EDX,EAX
179                 @ SAR   EAX,4
180                 @ Sub   EDX,EAX
181                 MOV     R4,R3,LSL #16           
182                 ADD     R2,R2,R4,ASR #16
183                 SUB     R2,R2,R4,ASR #20
184
185                 @ Mov   word[2+EDI],DX
186                 STRH    R2,[R1],#2
187                 @ Add   EDI,4
188
189                 @ Inc   ESI
190
191         @ Dec   CH
192         @ JNZ   Short @@Method1
193         @ MovSX EBX,BX
194         @ Ret
195         SUBS    R6,R6,#1
196         BNE     Method1loop
197         
198         MOV     R3,R3,LSL #16
199         MOV     R3,R3,ASR #16
200         
201         LDMFD   SP!,{R5,R6,R7}
202         MOV     PC,LR
203
204 @ ALIGN 16
205         @ ;[Delta]+[Smp-1](61/32)-[Smp-2](30/32) --
206 Method2:
207         ADD     R7,R5,#16
208 Method2loop:
209                 @ MovSX EAX,Byte[ESI]              ;EAX = Delta
210                 LDRSB   R4,[R0]
211                 @ And   AL,0F0h
212                 @ ShL   EAX,8
213                 @ SAR   EAX,CL
214                 BIC     R4,R4,#0xF
215                 MOV     R4,R4,LSL #8
216                 MOV     R4,R4,ASR R5
217
218                 @ ;Subtract 15/16 of second sample -----
219                 @ Sub   EAX,EBX
220                 @ SAR   EBX,4
221                 @ Add   EAX,EBX
222                 @ MovSX EBX,DX
223                 SUB     R4,R4,R3
224                 ADD     R4,R4,R3,ASR #4
225                 MOV     R3,R2
226                 
227                 @ ;Add 61/32 of last sample ------------
228                 @ And   DL,~3
229                 @ Add   EAX,EDX
230                 @ Add   EAX,EDX
231                 @ SAR   EDX,4
232                 @ Sub   EAX,EDX
233                 @ SAR   EDX,1           
234                 BIC     R2,R2,#3
235                 ADD     R4,R4,R2,LSL #1         
236                 SUB     R4,R4,R2,ASR #4                                         
237                 @ MovSX EDX,DX
238                 @ Sub   EAX,EDX         
239                 SUB     R4,R4,R2,ASR #5
240                 @ Mov   word[EDI],AX
241                 STRH    R4,[R1],#2
242
243                 @ Mov   DL,byte[ESI]
244                 LDRB    R2,[R0],#1
245                 @ ShL   EDX,12
246                 @ MovSX EDX,DX
247                 @ SAR   EDX,CL
248                 MOV     R2,R2,LSL #(12+16)              
249                 MOV     R2,R2,ASR R7
250
251                 @ Sub   EDX,EBX
252                 @ SAR   EBX,4
253                 @ Add   EDX,EBX
254                 @ MovSX EBX,AX
255                 SUB     R2,R2,R3
256                 ADD     R2,R2,R3,ASR #4
257                 MOV     R3,R4
258                 
259                 @ And   AL,~3
260                 @ Add   EDX,EAX
261                 @ Add   EDX,EAX
262                 @ SAR   EAX,4
263                 @ Sub   EDX,EAX
264                 @ SAR   EAX,1
265                 BIC     R4,R4,#3
266                 ADD     R2,R2,R4,LSL #1         
267                 SUB     R2,R2,R4,ASR #4                                         
268                 @ MovSX EAX,AX
269                 @ Sub   EDX,EAX         
270                 SUB     R2,R2,R4,ASR #5         
271
272                 @ Mov   word[2+EDI],DX
273                 STRH    R2,[R1],#2
274                 @ Add   EDI,4
275
276                 @ Inc   ESI
277
278         @ Dec   CH
279         @ JNZ   @@Method2
280         @ Ret
281         SUBS    R6,R6,#1
282         BNE     Method2loop
283         LDMFD   SP!,{R5,R6,R7}
284         MOV     PC,LR
285
286 @ ALIGN 16
287         @ ;[Delta]+[Smp-1](115/64)-[Smp-2](52/64) -
288 Method3:
289         ADD     R7,R5,#16
290 Method3loop:
291         @ MovSX EAX,Byte[ESI]
292         LDRSB   R4,[R0]
293                 @ And   AL,0F0h
294                 @ ShL   EAX,8
295                 @ SAR   EAX,CL
296         BIC     R4,R4,#0xF
297         MOV     R4,R4,LSL #8
298         MOV     R4,R4,ASR R5
299
300                 @ ;Subtract 13/16 of second sample -----
301                 @ Sub   EAX,EBX
302                 @ SAR   EBX,3
303                 @ Add   EAX,EBX
304                 @ SAR   EBX,1
305                 @ Add   EAX,EBX
306                 @ MovSX EBX,DX
307         SUB     R4,R4,R3
308         ADD     R4,R4,R3,ASR #3
309         ADD     R4,R4,R3,ASR #4
310         MOV     R3,R2
311
312                 @ ;Add 115/64 of last sample -----------
313                 @ And   DL, ~3
314                 @ Add   EAX,EDX
315                 @ Add   EAX,EDX
316                 @ SAR   EDX,3
317                 @ Sub   EAX,EDX
318                 @ SAR   EDX,1
319                 @ Sub   EAX,EDX
320                 @ SAR   EDX,2
321                 @ Sub   EAX,EDX
322         BIC     R2,R2,#3
323         ADD     R4,R4,R2,LSL #1
324         SUB     R4,R4,R2,ASR #3
325         SUB     R4,R4,R2,ASR #4
326         SUB     R4,R4,R2,ASR #6
327
328                 @ Mov   word[EDI],AX
329         STRH    R4,[R1],#2
330
331                 @ Mov   DL,byte[ESI]
332         LDRB    R2,[R0],#1
333
334                 @ ShL   EDX,12
335                 @ MovSX EDX,DX
336                 @ SAR   EDX,CL
337         MOV     R2,R2,LSL #(12+16)
338         MOV     R2,R2,ASR R7
339
340                 @ Sub   EDX,EBX
341                 @ SAR   EBX,3
342                 @ Add   EDX,EBX
343                 @ SAR   EBX,1
344                 @ Add   EDX,EBX
345                 @ MovSX EBX,AX
346         SUB     R2,R2,R3
347         ADD     R2,R2,R3,ASR #3
348         ADD     R2,R2,R3,ASR #4
349         MOV     R3,R4
350
351                 @ And   AL, ~3
352                 @ Add   EDX,EAX
353                 @ Add   EDX,EAX
354                 @ SAR   EAX,3
355                 @ Sub   EDX,EAX
356                 @ SAR   EAX,1
357                 @ Sub   EDX,EAX
358                 @ SAR   EAX,2
359                 @ Sub   EDX,EAX
360         BIC     R4,R4,#3
361         ADD     R2,R2,R4,LSL #1
362         SUB     R2,R2,R4,ASR #3
363         SUB     R2,R2,R4,ASR #4
364         SUB     R2,R2,R4,ASR #6
365
366                 @ Mov   word[2+EDI],DX
367         STRH    R4,[R1],#2
368                 @ Add   EDI,4
369
370                 @ Inc   ESI
371
372         @ Dec   CH
373         @ JNZ   @@Method3
374         @ Ret
375         SUBS    R6,R6,#1
376         BNE     Method3loop
377         
378         LDMFD   SP!,{R5,R6,R7}
379         MOV     PC,LR   
380
381
382 DecodeBlockAsm2:
383         STMFD           SP!,{R4,R11,LR}
384         
385         @ R12 = -32768
386         LDR             R12, = (-32768)
387         @ R11 = 32767
388         LDR             R11, = 32767
389         
390         
391         @ R0 = source (compressed)
392         @ R1 = destination (uncompressed)
393         @ 
394         
395         /*mov esi,dword[esp+20]
396         mov edi,dword[esp+24]
397         mov edx,dword[esp+28]
398         mov edx,dword[edx]
399         mov ebx,dword[esp+32]
400         mov ebx,dword[ebx]*/
401
402         @ call BREWave2
403         @ sauvgarde les valeurs de R2 et R3 (&ch->prev[0] et &...[1])
404         STMFD           SP!,{R2,R3}     
405         LDR             R2,[R2]
406         LDR             R3,[R3] 
407         BL              BREWave2
408                 @ renvoie dans R2 et R3 les valeurs a mettre dans &ch->prev[0] et &ch...[1]
409         /*mov eax,dword[esp+28]
410         mov dword[eax],edx
411         mov eax,dword[esp+32]
412         mov dword[eax],ebx*/
413         LDMFD           SP!,{R0,R1}
414         STR             R2,[R0]
415         STR             R3,[R1]
416                 
417         LDMFD           SP!,{R4,R11,LR}
418         MOV             PC,LR   
419         @ ret
420
421 @ ALIGN 16
422 BREWave2:
423         @ Push  CX      
424         STMFD   SP!,{R5,R6}     
425         @ Mov   AL,byte [esi]                         ;Get header byte
426         @ Inc   esi
427         LDRB    R4,[R0],#1      
428         @ Mov   CL,0CFh
429         @ Sub   CL,AL                              ;Invert range
430         @ ShR   CL,4                               ;Isolate range
431         MOV     R5,#0xCF
432         SUB     R5,R5,R4
433         MOV     R5,R5,LSR #4    
434         @ Mov   CH,8                               ;Decompress 8 bytes (16 nybbles)
435         MOV     R6,#8   
436         @ Test  AL,0Ch                             ;Does block use ADPCM compression?
437         @ JZ    @@Method02                    ;  No
438         TST     R4,#0xC
439         BEQ     Method02
440         @ Test  AL,8                               ;Does block use method 1?
441         @ JZ    @@Method12                    ;  Yes
442         TST     R4,#0x8
443         BEQ     Method12
444         @ Test  AL,4                               ;Does block use method 2?
445         @ jnz   @@Method332                          ;  Yes
446         @ jmp   @@Method22
447         TST     R4,#0x4
448         BEQ     Method22
449         B       Method32
450 @ @@Method332:
451         @ Jmp   @@Method32                          ;Must use method 3  
452
453 @ ALIGN 16
454 @       ;[Smp] ----------------------------------
455 @ @@Method02:
456 Method02:
457         @ shr   al, 4
458         MOV     R4,R4,LSR #4
459         @ mov   cl, al
460         MOV     R5,R4
461         @ cmp   cl, 12
462         CMP     R4,#12  
463         @ jbe   @@Method022     
464         SUBLS   R5,R5,#4
465         @ sub cl, 4
466 Method022:
467         @ XOr   AX,AX   
468         @ XOr   DX,DX   
469         @ Mov   al,byte [esi]                      ;Get byte
470         LDRSB   R4,[R0],#1
471         @ mov   dl, al  
472         @ sar   al, 4
473         @ sal   dl, 4
474         @ sar   dl, 4
475         @ movsx eax, al
476         @ movsx edx, dl
477         MOV     R2,R4,LSL #28
478         MOV     R4,R4,ASR #4    @ top nib
479         MOV     R2,R2,ASR #28  @ bottom nib                     
480         @ sal   eax,cl                           ;Reduce samples according to range
481         @ sal   edx,cl
482         MOV     R4,R4,ASL R5   @ <<shift
483         MOV     R2,R2,ASL R5    @ <<shift
484
485         @ call SMP12CLIP16
486         SMP12CLIP16             @ clip
487
488         @ Mov   [edi],AX
489         STRH    R4,[R1],#2      @ store
490         @ Mov   [2+edi],DX
491         STRH    R2,[R1],#2
492         @ Add   edi,4
493         @ Inc   esi     @ deja fait plus haut   
494         @ Dec   CH
495         SUBS    R6,R6,#1
496         @ JNZ   @@Method022
497         BNE     Method022
498         @ Pop   CX
499         LDMFD   SP!,{R5,R6}
500         @ MovSX EDX,DX
501                 @ deja bon
502         @ MovSX EBX,AX  
503         MOV     R3,R4
504         
505         @ Ret
506         MOV     PC,LR
507
508 @ ALIGN 16
509 @       ;[Delta]+[Smp-1](15/16) -----------------
510 @ @@Method12:
511 Method12:
512         ADD     R5,R5,#16
513 Method12loop:   
514 @       MovSX   EBX,byte [esi]            ;Sign extend upper nybble into EBX
515 @       And     BL,0F0h
516         LDRB    R3,[R0]
517         BIC     R3,R3,#0xF
518         
519         @ ShL   BX,8
520         @ SAR   BX,CL   
521         MOV     R3,R3, LSL #(8+16)
522         MOV     R3,R3,ASR R5
523         
524         @ MovSX EAX,DX          
525         @ Add   EBX,EAX 
526         @ SAR   EAX,4
527         @ Sub   EBX,EAX 
528         MOV     R4,R2,LSL #16
529         ADD     R3,R3,R4,ASR #16                @ + 15/16*(smp-1)
530         SUB     R3,R3,R4,ASR #20
531         
532         @ Mov   [edi],BX
533         STRH    R3,[R1],#2
534
535         @ Mov   DL,byte [esi]
536         LDRB    R2,[R0],#1      
537         @ ShL   DX,12   
538         @ SAR   DX,CL
539         @ MovSX EDX,DX
540         MOV     R2,R2,LSL #(12+16)
541         MOV     R2,R2,ASR R5
542         
543         
544         @ MovSX EAX,BX  
545         @ Add   EDX,EAX         
546         @ SAR   EAX,4
547         @ Sub   EDX,EAX 
548         MOV     R4,R3,LSL #16
549         ADD     R2,R2,R4,ASR #16
550         SUB     R2,R2,R4,ASR #20        @ + 15/16*(smp-1)
551                 
552         @ Mov   [2+edi],DX
553         STRH    R2,[R1],#2
554         @ Add   edi,4  @ deja fait
555         @ Inc   esi     @ deja fait
556         @ Dec   CH      
557         @ JNZ   @@Method12
558         SUBS    R6,R6,#1
559         BNE     Method12loop
560         @ Pop   CX
561         @ MovSX EBX,BX
562         @ Ret   
563         MOV     R3,R3,LSL #16           
564         LDMFD   SP!,{R5,R6}
565         MOV     R3,R3,ASR #16
566         MOV     PC,LR
567
568 @ ALIGN 16
569 @       ;[Delta]+[Smp-1](61/32)-[Smp-2](30/32) --
570 @ @@Method22:
571 Method22:       
572         /*MOV   R2,#0
573         MOV     R3,#0
574         LDMFD   SP!,{R5,R6}
575         MOV     PC,LR*/ 
576         ADD     R5,R5,#16
577 Method22loop:   
578
579 @       MovSX   EAX,byte [esi]            ;EAX =3D Delta
580         LDRB    R4,[R0]
581 @       And     AL,0F0h
582         BIC     R4,R4,#0xF
583 @       ShL     AX,8
584 @       SAR     AX,CL
585         MOV     R4,R4,LSL #(8+16)
586         MOV     R4,R4,ASR R5
587         
588 @       ;Subtract 15/16 of second sample -----
589 @       Sub     EAX,EBX
590         SUB     R4,R4,R3
591 @       SAR     EBX,4   
592 @       Add     EAX,EBX
593         ADD     R4,R4,R3,ASR #4
594 @       MovSX   EBX,DX                          ;Truncate lower 16-bits 
595         MOV     R3,R2, LSL #16
596         MOV     R3,R3, ASR #16
597         
598 @       ;Add 61/32 of last sample ------------
599 @       And     DL,~3                        ;(Lose lower 2-bits of precision)
600         BIC     R2,R2,#3
601 @       Add     EAX,EDX
602 @       Add     EAX,EDX
603         ADD     R4,R4,R2
604         ADD     R4,R4,R2
605 @       SAR     EDX,5
606         MOV     R2,R2,ASR #5
607 @       Sub     EAX,EDX 
608         SUB     R4,R4,R2
609 @       ShL     EDX,1   
610 @       MovSX   EDX,DX  
611         MOV     R2,R2,LSL #(1+16)
612 @       Sub     EAX,EDX
613         SUB     R4,R4,R2,ASR #(16)
614         
615 @       Mov     [edi],AX
616         STRH    R4,[R1],#2
617
618 @       Mov     DL,byte [esi]
619         LDRB    R2,[R0],#1
620 @       ShL     DX,12
621 @       SAR     DX,CL
622 @       MovSX   EDX,DX
623         MOV     R2,R2,LSL #(12+16)
624         MOV     R2,R2,ASR R5
625                         
626 @       Sub     EDX,EBX
627         SUB     R2,R2,R3
628 @       SAR     EBX,4
629 @       Add     EDX,EBX
630         ADD     R2,R2,R3,ASR #4
631 @       MovSX   EBX,AX
632         MOV     R3,R4,LSL #16
633         MOV     R3,R3,ASR #16
634                 
635 @       And     AL,~3
636         BIC     R4,R4,#3
637 @       Add     EDX,EAX
638 @       Add     EDX,EAX
639         ADD     R2,R2,R4
640         ADD     R2,R2,R4
641 @       SAR     EAX,5
642         MOV     R4,R4,ASR #5
643 @       Sub     EDX,EAX
644         SUB     R2,R2,R4        
645 @       ShL     EAX,1   
646 @       MovSX   EAX,AX  
647         MOV     R4,R4,LSL #(1+16)
648 @       Sub     EDX,EAX         
649         SUB     R2,R2,R4,ASR #(16)
650         
651
652 @       Mov     [2+edi],DX
653         STRH    R2,[R1],#2
654 @       Add     edi,4
655
656 @       Inc     esi
657
658 @       Dec     CH
659 @       JNZ     @@Method22
660         SUBS    R6,R6,#1
661         BNE     Method22loop
662 @       Pop     CX
663 @       Ret     
664         LDMFD   SP!,{R5,R6}
665         MOV     PC,LR
666
667 @ ALIGN 16
668 @       ;[Delta]+[Smp-1](115/64)-[Smp-2](52/64) -
669 @ @@Method32:
670 Method32:       
671         /*MOV   R2,#0
672         MOV     R3,#0
673         LDMFD   SP!,{R5,R6}
674         MOV     PC,LR*/ 
675         ADD     R5,R5,#16
676 Method32loop:
677 @       MovSX   EAX,byte [esi]
678         LDRB    R4,[R0]
679 @       And     AL,0F0h
680         BIC     R4,R4,#0xF
681 @       ShL     AX,8
682 @       SAR     AX,CL
683         MOV     R4,R4,LSL #(8+16)
684         MOV     R4,R4,ASR R5
685
686 @       ;Subtract 13/16 of second sample -----
687 @       Sub     EAX,EBX
688         SUB     R4,R4,R3
689 @       SAR     EBX,3
690 @       Add     EAX,EBX
691         ADD     R4,R4,R3,ASR #3
692 @       SAR     EBX,1
693 @       Add     EAX,EBX
694         ADD     R4,R4,R3,ASR #4
695 @       MovSX   EBX,DX
696         MOV     R3,R2,LSL #16
697         MOV     R3,R3,ASR #16
698
699 @       ;Add 115/64 of last sample -----------
700 @ ;     And     DL,~3
701 @       Add     EAX,EDX
702 @       Add     EAX,EDX
703         ADD     R4,R4,R2
704         ADD     R4,R4,R2
705 @       SAR     EDX,3
706 @       Sub     EAX,EDX
707         SUB     R4,R4,R2,ASR #3
708 @       SAR     EDX,1
709 @       Sub     EAX,EDX
710         SUB     R4,R4,R2,ASR #4
711 @       SAR     EDX,2
712 @       Sub     EAX,EDX
713         SUB     R4,R4,R2,ASR #6
714
715 @       Mov     [edi],AX
716         STRH    R4,[R1],#2
717
718 @       Mov     DL, [esi]
719         LDRB    R2,[R0],#1
720 @       ShL     DX,12
721 @       SAR     DX,CL
722 @       MovSX   EDX,DX
723         MOV     R2,R2,LSL #(12+16)
724         MOV     R2,R2,ASR R5
725
726 @       Sub     EDX,EBX
727         SUB     R2,R2,R3
728 @       SAR     EBX,3
729 @       Add     EDX,EBX
730         ADD     R2,R2,R3,ASR #3
731 @       SAR     EBX,1
732 @       Add     EDX,EBX
733         ADD     R2,R2,R3,ASR #4
734 @       MovSX   EBX,AX
735         MOV     R3,R4,LSL #16
736         MOV     R4,R4,ASR #16
737
738 @ ;     And     AL,~3
739 @       Add     EDX,EAX
740 @       Add     EDX,EAX
741         ADD     R2,R2,R4
742         ADD     R2,R2,R4
743 @       SAR     EAX,3
744 @       Sub     EDX,EAX
745         SUB     R2,R2,R4,ASR #3
746 @       SAR     EAX,1
747 @       Sub     EDX,EAX
748         SUB     R2,R2,R4,ASR #4
749 @       SAR     EAX,2
750 @       Sub     EDX,EAX
751         SUB     R2,R2,R4,ASR #6
752
753 @       Mov     [2+edi],DX
754         STRH    R2,[R1],#2
755 @       Add     edi,4
756
757 @       Inc     esi
758
759 @       Dec     CH
760 @       JNZ     @@Method32
761         SUBS    R6,R6,#1
762         BNE     Method32loop
763 @       Pop     CX
764 @       Ret             
765         LDMFD   SP!,{R5,R6}
766         MOV     PC,LR
767
768 /*SMP12CLIP16:
769         cmp eax, -32768
770         jg CLIP16SMP1SKIP0
771         je CLIP16SMP1SKIP1
772         mov eax, -32768
773         jmp CLIP16SMP1SKIP1
774 CLIP16SMP1SKIP0:
775         cmp eax, 32767
776         jle CLIP16SMP1SKIP1
777         mov eax, 32767
778 CLIP16SMP1SKIP1:
779         cmp edx, -32768
780         jg CLIP16SMP2SKIP0
781         je CLIP16SMP2SKIP1
782         mov edx, -32768
783         jmp CLIP16SMP2SKIP1
784 CLIP16SMP2SKIP0:
785         cmp edx, 32767
786         jle CLIP16SMP2SKIP1
787         mov edx, 32767
788 CLIP16SMP2SKIP1:*/
789
790
791 .pool