home *** CD-ROM | disk | FTP | other *** search
/ Audio 4.94 - Over 11,000 Files / audio-11000.iso / msdos / sndbords / proaudio / pcmtlsrc / pcmtlsrc.arj / TPCM.ARJ / TPCMF.ASM < prev    next >
Assembly Source File  |  1992-08-31  |  11KB  |  572 lines

  1. ;$Author:   BCRANE  $
  2. ;$Date:   31 Aug 1992 19:09:28  $
  3. ;$Header:   X:/sccs/sdkapp/tpcmf.asv   1.2   31 Aug 1992 19:09:28   BCRANE  $
  4. ;$Log:   X:/sccs/sdkapp/tpcmf.asv  $
  5. ;  
  6. ;     Rev 1.2   31 Aug 1992 19:09:28   BCRANE
  7. ;  added proper support  for 16 bit
  8. ;  
  9. ;     Rev 1.1   31 Aug 1992 09:34:58   BCRANE
  10. ;  added support for 16-bit 
  11. ;  
  12. ;     Rev 1.0   29 Jul 1992 16:58:18   BCRANE
  13. ;  Initial revision.
  14. ;$Logfile:   X:/sccs/sdkapp/tpcmf.asv  $
  15. ;$Modtimes$
  16. ;$Revision:   1.2  $
  17. ;$Workfile:   tpcmf.asm  $ 
  18.  
  19.     .model compact, c
  20.  
  21. PCMBUFLEN equ 1024
  22. HORZDIMS equ 320
  23. VERTDIMS equ 200
  24. DSPWIDTH equ 256
  25. HORZMARG equ (HORZDIMS - DSPWIDTH) / 2 
  26. SKIPFACTOR equ PCMBUFLEN / DSPWIDTH
  27.  
  28. public dspmonowav
  29. public dspstereowav
  30. public dsp16monowav
  31. public dsp16stereowav
  32.  
  33. extrn OURSTATFLAG:far
  34. extrn OURDMABUF:far
  35. extrn SBSIZE:far
  36. extrn PCMBUFDIVS:far
  37.  
  38. pushall macro
  39.     push ax
  40.     push bx
  41.     push cx
  42.     push dx
  43.     push si
  44.     push di
  45.     push es
  46.     push ds
  47.     endm
  48.  
  49. popall macro
  50.     pop ds
  51.     pop es
  52.     pop di
  53.     pop si
  54.     pop dx
  55.     pop cx
  56.     pop bx
  57.     pop ax
  58.     endm
  59.  
  60.     .code
  61. output    dw 0
  62.  
  63. xpos    dw     0
  64. timesin dw    0
  65. ovb     dd DSPWIDTH * 2 * 2 dup (0)        ; *2 for stereo *2 for 16bit
  66. ovbpel    db DSPWIDTH * 2 * 2 dup (0)        ; *2 for stereo *2 for 16bit
  67.  
  68. dspmonowav proc far
  69.     pushall
  70.  
  71.     mov bx, seg OURSTATFLAG
  72.     mov es, bx
  73.     mov bx, offset OURSTATFLAG
  74.     dec word ptr es:[bx]
  75.     jns @F
  76.  
  77.     mov word ptr es:[bx], 0
  78.  
  79. @@:
  80.     mov cs:[xpos], 0
  81.  
  82.     mov bx, seg OURDMABUF
  83.     mov es, bx
  84.     mov bx, offset OURDMABUF
  85.     mov si, es:[bx][2]
  86.     mov ds, si
  87.     mov si, es:[bx][0]
  88.  
  89.     mov bx, offset SBSIZE
  90.     mov ax, es:[bx]
  91.  
  92.     mov bx, offset PCMBUFDIVS
  93.     mov dx, es:[bx]
  94.     dec dx
  95.  
  96.     mov cx, cs:[timesin]
  97.     inc cs:[timesin]
  98.  
  99.     and cx, dx
  100.     
  101.     jcxz timesout
  102. @@:    add si, ax
  103.     loop @B
  104. timesout:
  105.  
  106.     cmp ax, DSPWIDTH
  107.     jb @F
  108.  
  109.     mov ax, DSPWIDTH
  110.     xor bx, bx        ; offset into dd table
  111.  
  112. @@:    mov cx, ax        ; count of pels to process
  113.  
  114. nextpel:
  115.     push cx            ; save count of pixels
  116.     push bx            ; save pointer to table
  117.  
  118.     mov cx, cs:[xpos]    ; cx= current xpos
  119.     inc cs:[xpos]        ; next x position
  120.  
  121.     mov ax, word ptr cs:[ovb][bx][2]    ; last es for restoring pel
  122.     or ax, ax        ; valid seg?
  123.     jz @F            ; no, skip
  124.  
  125.     mov es, ax
  126.     mov di, word ptr cs:[ovb][bx][0]    ; es:di points to pel
  127.     push bx            ; save ovb pointer
  128.     shr bx, 1        ; convert to byte index
  129.     shr bx, 1
  130.     mov al, byte ptr cs:ovbpel[bx]        ; get last color
  131.     pop bx            ; restore ovb pointer
  132.  
  133.     mov byte ptr es:[di][HORZMARG], al    ; restore color to pel
  134. @@:
  135.     lodsb            ; PCM data byte
  136.     add si, SKIPFACTOR - 1    ; 
  137.     mov byte ptr output, 0FFh
  138.  
  139.     xor al, 080h        ; normalized
  140.     cbw
  141.     sar ax, 1        ; make within display range
  142.     ;sar ax, 1        ; make within display range
  143.     add ax, VERTDIMS / 2    ; middle of screen
  144.  
  145.     mov bx, HORZDIMS        ; width of screen
  146.     imul bx            ; dx:ax points to video buffer (not seg:off)
  147.     mov bx, ax
  148.  
  149.     shl dx, 1        ; adjust segment
  150.     shl dx, 1
  151.     shl dx, 1 
  152.     shl dx, 1
  153.     add dx, 0A000h        ; video buffer
  154.     mov es, dx        ; segment in video buffer
  155.  
  156.     add bx, cx        ; es:bx is video buffer + xpos
  157.  
  158.     mov dl, byte ptr es:[bx][HORZMARG]
  159.     mov al, byte ptr output
  160.     mov byte ptr es:[bx][HORZMARG], al
  161.  
  162.     mov ax, bx        ; save current bx
  163.     pop bx            ; restore pointer to last pel table
  164.  
  165.     mov word ptr cs:ovb[bx][0], ax    ; store current es:bx
  166.     mov ax, es
  167.     mov word ptr cs:ovb[bx][2], ax
  168.  
  169.     push bx
  170.     shr bx, 1
  171.     shr bx, 1
  172.     mov byte ptr cs:ovbpel[bx], dl
  173.     pop bx
  174.  
  175.     add bx, 4        ; point to next ovb entry
  176.  
  177.     pop cx
  178.     dec cx
  179.     jcxz @F
  180.     jmp nextpel
  181. @@:
  182.  
  183.     
  184.     popall
  185.     retf
  186. dspmonowav endp
  187.  
  188. dspstereowav proc far
  189.     pushall
  190.  
  191.     mov bx, seg OURSTATFLAG
  192.     mov es, bx
  193.     mov bx, offset OURSTATFLAG
  194.     dec word ptr es:[bx]
  195.     jns @F
  196.  
  197.     mov word ptr es:[bx], 0
  198.  
  199. @@:
  200.     mov cs:[xpos], 0
  201.  
  202.     mov bx, seg OURDMABUF
  203.     mov es, bx
  204.     mov bx, offset OURDMABUF
  205.     mov si, es:[bx][2]
  206.     mov ds, si
  207.     mov si, es:[bx][0]
  208.  
  209.     mov bx, seg SBSIZE
  210.        mov es, bx
  211.     mov bx, offset SBSIZE
  212.     mov cx, es:[bx]
  213.     mov ax, cx
  214.  
  215.     mov cx, cs:[timesin]
  216.     inc cs:[timesin]
  217.  
  218.     mov bx, seg PCMBUFDIVS
  219.     mov es, bx
  220.     mov bx, offset PCMBUFDIVS
  221.     mov dx, es:[bx]
  222.  
  223.     dec dx
  224.     and cx, dx
  225.     
  226.     jcxz times2out
  227. @@:    add si, ax
  228.     loop @B
  229. times2out:
  230.     mov cx, ax
  231.  
  232.     cmp cx, DSPWIDTH * 2
  233.     jb next2pel
  234.  
  235.     mov cx, DSPWIDTH * 2
  236.     mov bx, 0        ; offset into dd table
  237.  
  238. next2pel:
  239.     push cx            ; save count of pixels
  240.     push bx            ; save pointer to table
  241.  
  242.     mov cx, cs:[xpos]    ; cx= current xpos
  243.  
  244.     mov ax, word ptr cs:[ovb][bx][2]    ; last es
  245.  
  246.     or ax, ax        ; valid seg?
  247.     jz @F            ; no, skip
  248.  
  249.     mov es, ax
  250.     mov di, word ptr cs:[ovb][bx][0]
  251.     push bx
  252.     shr bx, 1
  253.     shr bx, 1
  254.     mov al, byte ptr cs:ovbpel[bx]
  255.     pop bx
  256.  
  257.     mov byte ptr es:[di][HORZMARG], al
  258. @@:
  259.     inc cs:[xpos]
  260.  
  261.     lodsb            ; PCM data byte
  262.     test cl, 1        ; odd byte (right channel?)
  263.     jnz @F
  264.     add si, SKIPFACTOR - 1- 1    ; 
  265. @@:
  266.  
  267.     xor al, 080h        ; normalized
  268.     cbw
  269.     sar ax, 1        ; make within display range
  270.     ;sar ax, 1        ; make within display range
  271.     add ax, VERTDIMS / 4    ; upper half of screen for left channel
  272.     test cl, 1
  273.     jz @F
  274.     add ax, VERTDIMS / 2    ; lower half for right
  275. @@:
  276.  
  277.     mov bx, HORZDIMS        ; width of screen
  278.     imul bx            ; dx:ax points to video buffer (not seg:off)
  279.     mov bx, ax
  280.  
  281.     shl dx, 1        ; adjust segment
  282.     shl dx, 1
  283.     shl dx, 1 
  284.     shl dx, 1
  285.     add dx, 0A000h        ; video buffer
  286.     mov es, dx        ; segment in video buffer
  287.  
  288.     shr cx, 1        ; cut in half for two channels
  289.     add bx, cx        ; es:bx is video buffer + xpos
  290.  
  291.     mov dl, byte ptr es:[bx][HORZMARG]
  292.     mov byte ptr es:[bx][HORZMARG], 0FFh
  293.  
  294.     mov ax, bx        ; save current bx
  295.     pop bx            ; restore pointer to last pel table
  296.  
  297.     mov word ptr cs:ovb[bx][0], ax    ; store current es:bx
  298.     mov ax, es
  299.     mov word ptr cs:ovb[bx][2], ax
  300.  
  301.     push bx
  302.     shr bx, 1
  303.     shr bx, 1
  304.     mov byte ptr cs:ovbpel[bx], dl
  305.     pop bx
  306.  
  307.     add bx, 4        ; point to next ovb entry
  308.  
  309.     pop cx
  310.     dec cx
  311.     jz @F
  312.     jmp next2pel
  313. @@:
  314.     
  315.     popall
  316.     retf
  317. dspstereowav endp
  318.  
  319. dsp16monowav proc far
  320.     pushall
  321.  
  322.     mov bx, seg OURSTATFLAG
  323.     mov es, bx
  324.     mov bx, offset OURSTATFLAG
  325.     dec word ptr es:[bx]
  326.     jns @F
  327.  
  328.     mov word ptr es:[bx], 0
  329.  
  330. @@:
  331.     mov cs:[xpos], 0
  332.  
  333.     mov bx, seg OURDMABUF
  334.     mov es, bx
  335.     mov bx, offset OURDMABUF
  336.     mov si, es:[bx][2]
  337.     mov ds, si
  338.     mov si, es:[bx][0]
  339.  
  340.     mov bx, offset SBSIZE
  341.     mov ax, es:[bx]
  342.  
  343.     mov bx, offset PCMBUFDIVS
  344.     mov dx, es:[bx]
  345.     dec dx
  346.  
  347.     mov cx, cs:[timesin]
  348.     inc cs:[timesin]
  349.  
  350.     and cx, dx
  351.     
  352.     jcxz times16out
  353. @@:    add si, ax
  354.     loop @B
  355. times16out:
  356.     inc si            ; skip to hibyte
  357.  
  358.     cmp ax, DSPWIDTH
  359.     jb @F
  360.  
  361.     mov ax, DSPWIDTH
  362.     xor bx, bx        ; offset into dd table
  363.  
  364. @@:    mov cx, ax        ; count of pels to process
  365.  
  366. next16pel:
  367.     push cx            ; save count of pixels
  368.     push bx            ; save pointer to table
  369.  
  370.     mov cx, cs:[xpos]    ; cx= current xpos
  371.     inc cs:[xpos]        ; next x position
  372.  
  373.     mov ax, word ptr cs:[ovb][bx][2]    ; last es for restoring pel
  374.     or ax, ax        ; valid seg?
  375.     jz @F            ; no, skip
  376.  
  377.     mov es, ax
  378.     mov di, word ptr cs:[ovb][bx][0]    ; es:di points to pel
  379.     push bx            ; save ovb pointer
  380.     shr bx, 1        ; convert to byte index
  381.     shr bx, 1
  382.     mov al, byte ptr cs:ovbpel[bx]        ; get last color
  383.     pop bx            ; restore ovb pointer
  384.  
  385.     mov byte ptr es:[di][HORZMARG], al    ; restore color to pel
  386. @@:
  387.     lodsb            ; PCM data byte
  388.     add si, (SKIPFACTOR * 2) - 1    ; * 2 for 16 bit
  389.     mov byte ptr output, 0FFh
  390.  
  391.     cbw
  392.     sar ax, 1        ; make within display range
  393.     ;sar ax, 1        ; make within display range
  394.     add ax, VERTDIMS / 2    ; middle of screen
  395.  
  396.     mov bx, HORZDIMS        ; width of screen
  397.     imul bx            ; dx:ax points to video buffer (not seg:off)
  398.     mov bx, ax
  399.  
  400.     shl dx, 1        ; adjust segment
  401.     shl dx, 1
  402.     shl dx, 1 
  403.     shl dx, 1
  404.     add dx, 0A000h        ; video buffer
  405.     mov es, dx        ; segment in video buffer
  406.  
  407.     add bx, cx        ; es:bx is video buffer + xpos
  408.  
  409.     mov dl, byte ptr es:[bx][HORZMARG]
  410.     mov al, byte ptr output
  411.     mov byte ptr es:[bx][HORZMARG], al
  412.  
  413.     mov ax, bx        ; save current bx
  414.     pop bx            ; restore pointer to last pel table
  415.  
  416.     mov word ptr cs:ovb[bx][0], ax    ; store current es:bx
  417.     mov ax, es
  418.     mov word ptr cs:ovb[bx][2], ax
  419.  
  420.     push bx
  421.     shr bx, 1
  422.     shr bx, 1
  423.     mov byte ptr cs:ovbpel[bx], dl
  424.     pop bx
  425.  
  426.     add bx, 4        ; point to next ovb entry
  427.  
  428.     pop cx
  429.     dec cx
  430.     jcxz @F
  431.     jmp next16pel
  432. @@:
  433.  
  434.     
  435.     popall
  436.     retf
  437. dsp16monowav endp
  438.  
  439. dsp16stereowav proc far
  440.     pushall
  441.  
  442.     mov bx, seg OURSTATFLAG
  443.     mov es, bx
  444.     mov bx, offset OURSTATFLAG
  445.     dec word ptr es:[bx]
  446.     jns @F
  447.  
  448.     mov word ptr es:[bx], 0
  449.  
  450. @@:
  451.     mov cs:[xpos], 0
  452.  
  453.     mov bx, seg OURDMABUF
  454.     mov es, bx
  455.     mov bx, offset OURDMABUF
  456.     mov si, es:[bx][2]
  457.     mov ds, si
  458.     mov si, es:[bx][0]
  459.  
  460.     mov bx, seg SBSIZE
  461.        mov es, bx
  462.     mov bx, offset SBSIZE
  463.     mov cx, es:[bx]
  464.     mov ax, cx
  465.  
  466.     mov cx, cs:[timesin]
  467.     inc cs:[timesin]
  468.  
  469.     mov bx, seg PCMBUFDIVS
  470.     mov es, bx
  471.     mov bx, offset PCMBUFDIVS
  472.     mov dx, es:[bx]
  473.  
  474.     dec dx
  475.     and cx, dx
  476.     
  477.     jcxz times162out
  478. @@:    add si, ax
  479.     loop @B
  480. times162out:
  481.     inc si            ; point to hibyte of first PCM word
  482.     mov cx, ax
  483.  
  484.     cmp cx, DSPWIDTH * 2
  485.     jb next162pel
  486.  
  487.     mov cx, DSPWIDTH * 2
  488.     mov bx, 0        ; offset into dd table
  489.  
  490. next162pel:
  491.     push cx            ; save count of pixels
  492.     push bx            ; save pointer to table
  493.  
  494.     mov cx, cs:[xpos]    ; cx= current xpos
  495.  
  496.     mov ax, word ptr cs:[ovb][bx][2]    ; last es
  497.  
  498.     or ax, ax        ; valid seg?
  499.     jz @F            ; no, skip
  500.  
  501.     mov es, ax
  502.     mov di, word ptr cs:[ovb][bx][0]
  503.     push bx
  504.     shr bx, 1
  505.     shr bx, 1
  506.     mov al, byte ptr cs:ovbpel[bx]
  507.     pop bx
  508.  
  509.     mov byte ptr es:[di][HORZMARG], al
  510. @@:
  511.     inc cs:[xpos]
  512.  
  513.     lodsb            ; PCM data byte, now at lo-byte of next word
  514.     inc si            ; now at hi-byte of next word
  515.     test cl, 1        ; odd byte (right channel?)
  516.     jnz @F
  517.        add si, ((SKIPFACTOR  * 2))
  518. @@:
  519.  
  520.     cbw
  521.     sar ax, 1        ; make within display range
  522.     ;sar ax, 1        ; make within display range
  523.     add ax, VERTDIMS / 4    ; upper half of screen for left channel
  524.     test cl, 1
  525.     jz @F
  526.     add ax, VERTDIMS / 2    ; lower half for right
  527. @@:
  528.  
  529.     mov bx, HORZDIMS        ; width of screen
  530.     imul bx            ; dx:ax points to video buffer (not seg:off)
  531.     mov bx, ax
  532.  
  533.     shl dx, 1        ; adjust segment
  534.     shl dx, 1
  535.     shl dx, 1 
  536.     shl dx, 1
  537.     add dx, 0A000h        ; video buffer
  538.     mov es, dx        ; segment in video buffer
  539.  
  540.     shr cx, 1        ; cut in half for two channels
  541.     add bx, cx        ; es:bx is video buffer + xpos
  542.  
  543.     mov dl, byte ptr es:[bx][HORZMARG]
  544.     mov byte ptr es:[bx][HORZMARG], 0FFh
  545.  
  546.     mov ax, bx        ; save current bx
  547.     pop bx            ; restore pointer to last pel table
  548.  
  549.     mov word ptr cs:ovb[bx][0], ax    ; store current es:bx
  550.     mov ax, es
  551.     mov word ptr cs:ovb[bx][2], ax
  552.  
  553.     push bx
  554.     shr bx, 1
  555.     shr bx, 1
  556.     mov byte ptr cs:ovbpel[bx], dl
  557.     pop bx
  558.  
  559.     add bx, 4        ; point to next ovb entry
  560.  
  561.     pop cx
  562.     dec cx
  563.     jz @F
  564.     jmp next162pel
  565. @@:
  566.     
  567.     popall
  568.     retf
  569. dsp16stereowav endp
  570.  
  571. end
  572.