home *** CD-ROM | disk | FTP | other *** search
- .model large,c
- .386
-
- LOCALS
- JUMPS
-
- public VC_ResampleMixMono
- public VC_ResampleMixStereo
- public VC_Sample16To8Copy
- public VC_MemSet
- extrn ampbuf
-
- .code
-
-
- SampleMono MACRO
- mov bl,ds:[si] ; get byte from sample
- mov ax,fs:[ebx*2] ; get volume-adjusted word
- add es:[di],ax ; add word to mix-buffer
- add edi,edx ; di+=2 iter+=fraction
- adc si,cx ; si+=carry+whole
- ENDM
-
-
- SampleStereo MACRO
- mov bl,ds:[si] ; sample to bl
- mov ax,fs:[ebx*2] ; left volume-adjusted word to ax
- add es:[di],ax ; mix it
- mov ax,gs:[ebx*2] ; right """
- add es:2[di],ax ; mix it
- add edi,edx ; di+=4 iter+=fraction
- adc si,cx ; si+=carry+whole
- ENDM
-
-
- S16To8 MACRO
- mov bx,ds:[si]
- mov al,fs:[bx]
- mov es:[di],al
- inc di
- add si,2
- ENDM
-
-
- VC_MemSet proc
-
- USES CX,ES,DI
-
- ARG dest : far ptr;
- ARG data : word ;
- ARG count: word ;
-
- les di,small dest
- mov cx,count
- mov ax,data
- cld
- rep stosw
- ret
-
- endp
-
-
- ; This macro executes 'function' unfolds*counter times.. unfolds should be
- ; a constant number, and counter should be a variable or register
- ;
-
- MyLoop MACRO function,unfolds,counter
- LOCAL entr,lplb
-
- jmp entr
- lplb:
- REPT unfolds
- function
- ENDM
- entr:
- dec counter
- jns lplb
- ENDM
-
-
-
- VC_ResampleMixMono proc
-
- USES ES,DS,FS,GS,ESI,EDI,EDX,EBX
-
- ARG srce : far ptr
- ARG dest : far ptr
- ARG volt : far ptr
- ARG todo : word ;
- ARG telo : dword ;
- ARG itrr : far ptr ;
-
- LOCAL cnt32: word;
- LOCAL cnt01: word;
-
- mov ax,todo
- shr ax,5
- mov cnt32,ax
-
- mov ax,todo
- and ax,31
- mov cnt01,ax
-
- lds si,small itrr
- mov di,[si] ; di=iter
- ror edi,16 ; edi=iter:?
-
- lds si,small srce
- push si
-
- lfs di,small volt ;voltab to fs:di
- les di,small dest ; edi=iter:dest
-
- mov dx,word ptr [telo] ; dx is fraction
- ror edx,16 ; edx = fraction:?
- mov dx,2 ; edx = fraction:2
-
- mov cx,word ptr [telo+2] ; cx is whole
-
- xor ebx,ebx
-
- MyLoop SampleMono,32,cnt32
- MyLoop SampleMono,1,cnt01
-
- mov ax,si
- pop bx
- sub ax,bx
-
- ror edi,16
- lds si,small itrr
- mov ds:[si],di
-
- ret
- endp
-
-
-
- VC_ResampleMixStereo proc
-
- USES ES,DS,FS,ESI,EDI,EDX,EBX
-
- ARG srce : far ptr
- ARG dest : far ptr
- ARG voll : far ptr
- ARG volr : far ptr
- ARG todo : word ;
- ARG telo : dword ;
- ARG itrr : far ptr ;
-
- LOCAL cnt32: word;
- LOCAL cnt01: word;
-
- mov ax,todo
- shr ax,5
- mov cnt32,ax
-
- mov ax,todo
- and ax,31
- mov cnt01,ax
-
- lds si,small itrr
- mov di,[si] ; di=iter
- ror edi,16 ; edi=iter:?
-
- lds si,small srce
- push si
-
- lfs di,small voll ; left voltab to fs:di
- lgs di,small volr ; right voltab to gs:di
- les di,small dest
-
- mov dx,word ptr [telo] ; dx is fraction
- ror edx,16 ; edx = fraction:?
- mov dx,4 ; edx = fraction:4
-
- mov cx,word ptr [telo+2] ; cx is whole
-
- xor ebx,ebx ; clear ebx
-
- MyLoop SampleStereo,32,cnt32
- MyLoop SampleStereo,1,cnt01
-
- mov ax,si
- pop bx
- sub ax,bx
-
- ror edi,16
- lds si,small itrr
- mov ds:[si],di
-
- ret
- endp
-
-
-
-
- VC_Sample16To8Copy proc
- USES FS,ES,DS,SI,DI
-
- ARG srce: far ptr ;16 bits samples source
- ARG dest: far ptr ; 8 bits samples destiny
- ARG cnt : word ;number of samples to convert
- ;
- lds si,small srce ;ds:si source pointer (pointing to 16 bit samples)
- les di,small dest ;es:di destiny (8 bit samplebuffer)
-
- mov ax,seg ampbuf
- mov fs,ax ;fs:0000h is address of amplify table
-
- mov cx,cnt ;cx = number of samples to convert
- shr cx,5 ;div 32
-
- MyLoop S16To8,32,cx ;do large blocks of 32 samples at a time
-
- mov cx,cnt ;
- and cx,31 ;cx = number of samples left to do
-
- MyLoop S16To8,1,cx ;
-
- ret ;
- endp
-
-
- END