7 ;Bit-Rate Expand Waveform
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.
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)
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)
45 @ void DecodeBlockAsm2 (int8 *, int16 *, int32 *, int32 *);
46 @ DecodeBlockAsm2 (compressed, raw, &ch->previous [0], &ch->previous [1]);
65 @ Mov AL,[ESI] ;Get header byte
74 @ ShR CL,4 ;Isolate range
81 @ Mov CH,8 ;Decompress 8 bytes (16 nybbles)
83 @ Test AL,0Ch ;Does block use ADPCM compression?
87 @ Test AL,8 ;Does block use method 1?
91 @ Test AL,4 ;Does block use method 2?
96 B Method3 @ ;Must use method 3
99 ;[Smp] ----------------------------------*/
105 @ Mov AH,byte[ESI] ;Get byte
107 @ And AH,0F0h ;AH = High nybble << 12
108 @ ShL DH,4 ;DH = Low nybble << 12
115 BIC R4,R4,#0x0F000000
118 @ SAR AX,CL ;Reduce samples according to range
131 @ JNZ Short @@Method0
145 @ ;[Delta]+[Smp-1](15/16) -----------------
149 @ MovSX EBX,byte[ESI] ;Sign extend upper nybble into EBX
174 MOV R2,R2,LSL #(12+16)
192 @ JNZ Short @@Method1
205 @ ;[Delta]+[Smp-1](61/32)-[Smp-2](30/32) --
209 @ MovSX EAX,Byte[ESI] ;EAX = Delta
218 @ ;Subtract 15/16 of second sample -----
227 @ ;Add 61/32 of last sample ------------
248 MOV R2,R2,LSL #(12+16)
287 @ ;[Delta]+[Smp-1](115/64)-[Smp-2](52/64) -
291 @ MovSX EAX,Byte[ESI]
300 @ ;Subtract 13/16 of second sample -----
312 @ ;Add 115/64 of last sample -----------
337 MOV R2,R2,LSL #(12+16)
383 STMFD SP!,{R4,R11,LR}
391 @ R0 = source (compressed)
392 @ R1 = destination (uncompressed)
395 /*mov esi,dword[esp+20]
396 mov edi,dword[esp+24]
397 mov edx,dword[esp+28]
399 mov ebx,dword[esp+32]
403 @ sauvgarde les valeurs de R2 et R3 (&ch->prev[0] et &...[1])
408 @ renvoie dans R2 et R3 les valeurs a mettre dans &ch->prev[0] et &ch...[1]
409 /*mov eax,dword[esp+28]
411 mov eax,dword[esp+32]
417 LDMFD SP!,{R4,R11,LR}
425 @ Mov AL,byte [esi] ;Get header byte
429 @ Sub CL,AL ;Invert range
430 @ ShR CL,4 ;Isolate range
434 @ Mov CH,8 ;Decompress 8 bytes (16 nybbles)
436 @ Test AL,0Ch ;Does block use ADPCM compression?
440 @ Test AL,8 ;Does block use method 1?
441 @ JZ @@Method12 ; Yes
444 @ Test AL,4 ;Does block use method 2?
445 @ jnz @@Method332 ; Yes
451 @ Jmp @@Method32 ;Must use method 3
454 @ ;[Smp] ----------------------------------
469 @ Mov al,byte [esi] ;Get byte
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
482 MOV R4,R4,ASL R5 @ <<shift
483 MOV R2,R2,ASL R5 @ <<shift
489 STRH R4,[R1],#2 @ store
493 @ Inc esi @ deja fait plus haut
509 @ ;[Delta]+[Smp-1](15/16) -----------------
514 @ MovSX EBX,byte [esi] ;Sign extend upper nybble into EBX
521 MOV R3,R3, LSL #(8+16)
529 ADD R3,R3,R4,ASR #16 @ + 15/16*(smp-1)
540 MOV R2,R2,LSL #(12+16)
550 SUB R2,R2,R4,ASR #20 @ + 15/16*(smp-1)
554 @ Add edi,4 @ deja fait
555 @ Inc esi @ deja fait
569 @ ;[Delta]+[Smp-1](61/32)-[Smp-2](30/32) --
579 @ MovSX EAX,byte [esi] ;EAX =3D Delta
585 MOV R4,R4,LSL #(8+16)
588 @ ;Subtract 15/16 of second sample -----
594 @ MovSX EBX,DX ;Truncate lower 16-bits
598 @ ;Add 61/32 of last sample ------------
599 @ And DL,~3 ;(Lose lower 2-bits of precision)
611 MOV R2,R2,LSL #(1+16)
613 SUB R4,R4,R2,ASR #(16)
623 MOV R2,R2,LSL #(12+16)
647 MOV R4,R4,LSL #(1+16)
649 SUB R2,R2,R4,ASR #(16)
668 @ ;[Delta]+[Smp-1](115/64)-[Smp-2](52/64) -
677 @ MovSX EAX,byte [esi]
683 MOV R4,R4,LSL #(8+16)
686 @ ;Subtract 13/16 of second sample -----
699 @ ;Add 115/64 of last sample -----------
723 MOV R2,R2,LSL #(12+16)