home *** CD-ROM | disk | FTP | other *** search
/ PC Loisirs 18 / cd.iso / sharewar / mikm202 / source / virtch16 / resample.asm < prev    next >
Encoding:
Assembly Source File  |  1995-09-18  |  3.8 KB  |  224 lines

  1.     .model large,c
  2.     .386
  3.  
  4.     LOCALS
  5.     JUMPS
  6.  
  7.     public VC_ResampleMixMono
  8.     public VC_ResampleMixStereo
  9.     public VC_Sample16To8Copy
  10.     public VC_MemSet
  11.     extrn  ampbuf
  12.  
  13. .code
  14.  
  15.  
  16. SampleMono MACRO
  17.     mov  bl,ds:[si]                ; get byte from sample
  18.     mov  ax,fs:[ebx*2]            ; get volume-adjusted word
  19.     add  es:[di],ax                ; add word to mix-buffer
  20.     add  edi,edx                ; di+=2 iter+=fraction
  21.     adc  si,cx                    ; si+=carry+whole
  22.     ENDM
  23.  
  24.  
  25. SampleStereo MACRO
  26.     mov  bl,ds:[si]                ; sample to bl
  27.     mov  ax,fs:[ebx*2]            ; left volume-adjusted word to ax
  28.     add  es:[di],ax                ; mix it
  29.     mov  ax,gs:[ebx*2]            ; right """
  30.     add  es:2[di],ax            ; mix it
  31.     add  edi,edx                ; di+=4 iter+=fraction
  32.     adc  si,cx                    ; si+=carry+whole
  33.     ENDM
  34.  
  35.  
  36. S16To8 MACRO
  37.     mov bx,ds:[si]
  38.     mov al,fs:[bx]
  39.     mov es:[di],al
  40.     inc di
  41.     add si,2
  42.     ENDM
  43.  
  44.  
  45. VC_MemSet proc
  46.  
  47.     USES CX,ES,DI
  48.  
  49.     ARG dest : far ptr;
  50.     ARG data : word ;
  51.     ARG count: word ;
  52.  
  53.     les di,small dest
  54.     mov cx,count
  55.     mov ax,data
  56.     cld
  57.     rep stosw
  58.     ret
  59.  
  60.     endp
  61.  
  62.  
  63. ; This macro executes 'function' unfolds*counter times.. unfolds should be
  64. ; a constant number, and counter should be a variable or register
  65. ;
  66.  
  67. MyLoop MACRO function,unfolds,counter
  68.     LOCAL entr,lplb
  69.  
  70.     jmp entr
  71. lplb:
  72.     REPT unfolds
  73.     function
  74.     ENDM
  75. entr:
  76.     dec counter
  77.     jns lplb
  78.     ENDM
  79.  
  80.  
  81.  
  82. VC_ResampleMixMono proc
  83.  
  84.     USES ES,DS,FS,GS,ESI,EDI,EDX,EBX
  85.  
  86.     ARG  srce  : far ptr
  87.     ARG  dest  : far ptr
  88.     ARG  volt  : far ptr
  89.     ARG  todo  : word     ;
  90.     ARG  telo  : dword    ;
  91.     ARG  itrr  : far ptr     ;
  92.  
  93.     LOCAL cnt32: word;
  94.     LOCAL cnt01: word;
  95.  
  96.     mov  ax,todo
  97.     shr  ax,5
  98.     mov  cnt32,ax
  99.  
  100.     mov  ax,todo
  101.     and  ax,31
  102.     mov  cnt01,ax
  103.  
  104.     lds  si,small itrr
  105.     mov  di,[si]                   ; di=iter
  106.     ror  edi,16                    ; edi=iter:?
  107.  
  108.     lds  si,small srce
  109.     push si
  110.  
  111.     lfs  di,small volt            ;voltab to fs:di
  112.     les  di,small dest            ; edi=iter:dest
  113.  
  114.     mov  dx,word ptr [telo]        ; dx is fraction
  115.     ror  edx,16                    ; edx = fraction:?
  116.     mov  dx,2                    ; edx = fraction:2
  117.  
  118.     mov  cx,word ptr [telo+2]    ; cx is whole
  119.  
  120.     xor  ebx,ebx
  121.  
  122.     MyLoop SampleMono,32,cnt32
  123.     MyLoop SampleMono,1,cnt01
  124.  
  125.     mov  ax,si
  126.     pop  bx
  127.     sub  ax,bx
  128.  
  129.     ror  edi,16
  130.     lds  si,small itrr
  131.     mov  ds:[si],di
  132.  
  133.     ret
  134.     endp
  135.  
  136.  
  137.  
  138. VC_ResampleMixStereo proc
  139.  
  140.     USES ES,DS,FS,ESI,EDI,EDX,EBX
  141.  
  142.     ARG  srce  : far ptr
  143.     ARG  dest  : far ptr
  144.     ARG  voll  : far ptr
  145.     ARG  volr  : far ptr
  146.     ARG  todo  : word     ;
  147.     ARG  telo  : dword    ;
  148.     ARG  itrr  : far ptr     ;
  149.  
  150.     LOCAL cnt32: word;
  151.     LOCAL cnt01: word;
  152.  
  153.     mov  ax,todo
  154.     shr  ax,5
  155.     mov  cnt32,ax
  156.  
  157.     mov  ax,todo
  158.     and  ax,31
  159.     mov  cnt01,ax
  160.  
  161.     lds  si,small itrr
  162.     mov  di,[si]                ; di=iter
  163.     ror  edi,16                    ; edi=iter:?
  164.  
  165.     lds  si,small srce
  166.     push si
  167.  
  168.     lfs  di,small voll            ; left voltab to fs:di
  169.     lgs  di,small volr            ; right voltab to gs:di
  170.     les  di,small dest
  171.  
  172.     mov  dx,word ptr [telo]        ; dx is fraction
  173.     ror  edx,16                    ; edx = fraction:?
  174.     mov  dx,4                    ; edx = fraction:4
  175.  
  176.     mov  cx,word ptr [telo+2]    ; cx is whole
  177.  
  178.     xor  ebx,ebx                ; clear ebx
  179.  
  180.     MyLoop SampleStereo,32,cnt32
  181.     MyLoop SampleStereo,1,cnt01
  182.  
  183.     mov  ax,si
  184.     pop  bx
  185.     sub  ax,bx
  186.  
  187.     ror  edi,16
  188.     lds  si,small itrr
  189.     mov  ds:[si],di
  190.  
  191.     ret
  192.     endp
  193.  
  194.  
  195.  
  196.  
  197. VC_Sample16To8Copy proc
  198.     USES FS,ES,DS,SI,DI
  199.  
  200.     ARG srce: far ptr    ;16 bits samples source
  201.     ARG dest: far ptr    ; 8 bits samples destiny
  202.     ARG cnt : word        ;number of samples to convert
  203.                         ;
  204.     lds  si,small srce    ;ds:si source pointer (pointing to 16 bit samples)
  205.     les  di,small dest    ;es:di destiny (8 bit samplebuffer)
  206.  
  207.     mov  ax,seg ampbuf
  208.     mov  fs,ax          ;fs:0000h is address of amplify table
  209.  
  210.     mov  cx,cnt            ;cx = number of samples to convert
  211.     shr  cx,5            ;div 32
  212.  
  213.     MyLoop S16To8,32,cx    ;do large blocks of 32 samples at a time
  214.  
  215.     mov  cx,cnt         ;
  216.     and  cx,31            ;cx = number of samples left to do
  217.  
  218.     MyLoop S16To8,1,cx    ;
  219.  
  220.     ret                 ;
  221.     endp
  222.  
  223.  
  224.     END