rott/audiolib/SOURCE/MV_MIX2.ASM

123 lines
4.3 KiB
NASM

.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