123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- .386
- .MODEL flat
- .data
- .code
- SEGMENT text USE32
- ALIGN 16
- ;================
- ;
- ; MV_Mix8BitMonoFast
- ;
- ;================
- ; eax - position
- ; edx - rate
- ; ecx - Volume table
- ; ebx - Harsh clip table
- ; edi - to
- ; esi - start
- MixBufferSize equ 256
- PROC MV_Mix8BitMonoFast_
- PUBLIC MV_Mix8BitMonoFast_
- ; Two at once
- push ebp
- ; mov edi,[to]
- ; mov esi,[start]
- ; mov ebp,[position]
- ; mov edx,[Rate]
- mov ebp, eax
- ; Volume table ptr
- ; mov ecx,[VolumeTable]
- mov eax,OFFSET apatch1+3 ; convice tasm to modify code...
- mov [eax],ecx
- mov eax,OFFSET apatch2+3 ; convice tasm to modify code...
- mov [eax],ecx
- ; Harsh Clip table ptr
- ; mov ebx,HarshClipTable ; get harsh clip table address
- add ebx,128
- mov eax,OFFSET apatch3+2 ; convice tasm to modify code...
- mov [eax],ebx
- mov eax,OFFSET apatch4+2 ; convice tasm to modify code...
- mov [eax],ebx
- ; Rate scale ptr
- ; mov edx,[rate]
- mov eax,OFFSET apatch5+2 ; convice tasm to modify code...
- mov [eax],edx
- mov eax,OFFSET apatch6+2 ; convice tasm to modify code...
- mov [eax],edx
- mov ecx, MixBufferSize / 2 ; double pixel count
- ; eax - scratch
- ; ebx - scratch
- ; edx - scratch
- ; ecx - count
- ; edi - destination
- ; esi - source
- ; ebp - frac pointer
- ; apatch1 - volume table
- ; apatch2 - volume table
- ; apatch3 - harsh clip table
- ; apatch4 - harsh clip table
- ; apatch5 - sample rate
- ; apatch6 - sample rate
- mov eax,ebp ; begin calculating first sample
- add ebp,edx ; advance frac pointer
- shr eax,16 ; finish calculation for first sample
- mov ebx,ebp ; begin calculating second sample
- add ebp,edx ; advance frac pointer
- shr ebx,16 ; finish calculation for second sample
- movzx eax, byte ptr [esi+eax] ; get first sample
- movzx ebx, byte ptr [esi+ebx] ; get second sample
- ALIGN 16
- mix8Mloop:
- movzx edx, byte ptr [edi] ; get current sample from destination
- apatch1:
- movsx eax, byte ptr [eax+12345678h] ; volume translate first sample
- apatch2:
- movsx ebx, byte ptr [ebx+12345678h] ; volume translate second sample
- add eax, edx ; mix first sample
- movzx edx, byte ptr [edi + 1] ; get current sample from destination
- apatch3:
- mov eax, [eax + 12345678h] ; harsh clip new sample
- add ebx, edx ; mix second sample
- mov [edi], al ; write new sample to destination
- mov edx, ebp ; begin calculating third sample
- apatch4:
- mov ebx, [ebx + 12345678h] ; harsh clip new sample
- apatch5:
- add ebp,12345678h ; advance frac pointer
- shr edx, 16 ; finish calculation for third sample
- mov eax, ebp ; begin calculating fourth sample
- inc edi ; move destination to second sample
- shr eax, 16 ; finish calculation for fourth sample
- mov [edi], bl ; write new sample to destination
- apatch6:
- add ebp,12345678h ; advance frac pointer
- movzx ebx, byte ptr [esi+eax] ; get fourth sample
- movzx eax, byte ptr [esi+edx] ; get third sample
- inc edi ; move destination to third sample
- dec ecx ; decrement count
- jnz mix8Mloop ; loop
- pop ebp
- ret
- ENDP
- ENDS
- END
|