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 >
Wrap
Assembly Source File
|
1992-08-31
|
11KB
|
572 lines
;$Author: BCRANE $
;$Date: 31 Aug 1992 19:09:28 $
;$Header: X:/sccs/sdkapp/tpcmf.asv 1.2 31 Aug 1992 19:09:28 BCRANE $
;$Log: X:/sccs/sdkapp/tpcmf.asv $
;
; Rev 1.2 31 Aug 1992 19:09:28 BCRANE
; added proper support for 16 bit
;
; Rev 1.1 31 Aug 1992 09:34:58 BCRANE
; added support for 16-bit
;
; Rev 1.0 29 Jul 1992 16:58:18 BCRANE
; Initial revision.
;$Logfile: X:/sccs/sdkapp/tpcmf.asv $
;$Modtimes$
;$Revision: 1.2 $
;$Workfile: tpcmf.asm $
.model compact, c
PCMBUFLEN equ 1024
HORZDIMS equ 320
VERTDIMS equ 200
DSPWIDTH equ 256
HORZMARG equ (HORZDIMS - DSPWIDTH) / 2
SKIPFACTOR equ PCMBUFLEN / DSPWIDTH
public dspmonowav
public dspstereowav
public dsp16monowav
public dsp16stereowav
extrn OURSTATFLAG:far
extrn OURDMABUF:far
extrn SBSIZE:far
extrn PCMBUFDIVS:far
pushall macro
push ax
push bx
push cx
push dx
push si
push di
push es
push ds
endm
popall macro
pop ds
pop es
pop di
pop si
pop dx
pop cx
pop bx
pop ax
endm
.code
output dw 0
xpos dw 0
timesin dw 0
ovb dd DSPWIDTH * 2 * 2 dup (0) ; *2 for stereo *2 for 16bit
ovbpel db DSPWIDTH * 2 * 2 dup (0) ; *2 for stereo *2 for 16bit
dspmonowav proc far
pushall
mov bx, seg OURSTATFLAG
mov es, bx
mov bx, offset OURSTATFLAG
dec word ptr es:[bx]
jns @F
mov word ptr es:[bx], 0
@@:
mov cs:[xpos], 0
mov bx, seg OURDMABUF
mov es, bx
mov bx, offset OURDMABUF
mov si, es:[bx][2]
mov ds, si
mov si, es:[bx][0]
mov bx, offset SBSIZE
mov ax, es:[bx]
mov bx, offset PCMBUFDIVS
mov dx, es:[bx]
dec dx
mov cx, cs:[timesin]
inc cs:[timesin]
and cx, dx
jcxz timesout
@@: add si, ax
loop @B
timesout:
cmp ax, DSPWIDTH
jb @F
mov ax, DSPWIDTH
xor bx, bx ; offset into dd table
@@: mov cx, ax ; count of pels to process
nextpel:
push cx ; save count of pixels
push bx ; save pointer to table
mov cx, cs:[xpos] ; cx= current xpos
inc cs:[xpos] ; next x position
mov ax, word ptr cs:[ovb][bx][2] ; last es for restoring pel
or ax, ax ; valid seg?
jz @F ; no, skip
mov es, ax
mov di, word ptr cs:[ovb][bx][0] ; es:di points to pel
push bx ; save ovb pointer
shr bx, 1 ; convert to byte index
shr bx, 1
mov al, byte ptr cs:ovbpel[bx] ; get last color
pop bx ; restore ovb pointer
mov byte ptr es:[di][HORZMARG], al ; restore color to pel
@@:
lodsb ; PCM data byte
add si, SKIPFACTOR - 1 ;
mov byte ptr output, 0FFh
xor al, 080h ; normalized
cbw
sar ax, 1 ; make within display range
;sar ax, 1 ; make within display range
add ax, VERTDIMS / 2 ; middle of screen
mov bx, HORZDIMS ; width of screen
imul bx ; dx:ax points to video buffer (not seg:off)
mov bx, ax
shl dx, 1 ; adjust segment
shl dx, 1
shl dx, 1
shl dx, 1
add dx, 0A000h ; video buffer
mov es, dx ; segment in video buffer
add bx, cx ; es:bx is video buffer + xpos
mov dl, byte ptr es:[bx][HORZMARG]
mov al, byte ptr output
mov byte ptr es:[bx][HORZMARG], al
mov ax, bx ; save current bx
pop bx ; restore pointer to last pel table
mov word ptr cs:ovb[bx][0], ax ; store current es:bx
mov ax, es
mov word ptr cs:ovb[bx][2], ax
push bx
shr bx, 1
shr bx, 1
mov byte ptr cs:ovbpel[bx], dl
pop bx
add bx, 4 ; point to next ovb entry
pop cx
dec cx
jcxz @F
jmp nextpel
@@:
popall
retf
dspmonowav endp
dspstereowav proc far
pushall
mov bx, seg OURSTATFLAG
mov es, bx
mov bx, offset OURSTATFLAG
dec word ptr es:[bx]
jns @F
mov word ptr es:[bx], 0
@@:
mov cs:[xpos], 0
mov bx, seg OURDMABUF
mov es, bx
mov bx, offset OURDMABUF
mov si, es:[bx][2]
mov ds, si
mov si, es:[bx][0]
mov bx, seg SBSIZE
mov es, bx
mov bx, offset SBSIZE
mov cx, es:[bx]
mov ax, cx
mov cx, cs:[timesin]
inc cs:[timesin]
mov bx, seg PCMBUFDIVS
mov es, bx
mov bx, offset PCMBUFDIVS
mov dx, es:[bx]
dec dx
and cx, dx
jcxz times2out
@@: add si, ax
loop @B
times2out:
mov cx, ax
cmp cx, DSPWIDTH * 2
jb next2pel
mov cx, DSPWIDTH * 2
mov bx, 0 ; offset into dd table
next2pel:
push cx ; save count of pixels
push bx ; save pointer to table
mov cx, cs:[xpos] ; cx= current xpos
mov ax, word ptr cs:[ovb][bx][2] ; last es
or ax, ax ; valid seg?
jz @F ; no, skip
mov es, ax
mov di, word ptr cs:[ovb][bx][0]
push bx
shr bx, 1
shr bx, 1
mov al, byte ptr cs:ovbpel[bx]
pop bx
mov byte ptr es:[di][HORZMARG], al
@@:
inc cs:[xpos]
lodsb ; PCM data byte
test cl, 1 ; odd byte (right channel?)
jnz @F
add si, SKIPFACTOR - 1- 1 ;
@@:
xor al, 080h ; normalized
cbw
sar ax, 1 ; make within display range
;sar ax, 1 ; make within display range
add ax, VERTDIMS / 4 ; upper half of screen for left channel
test cl, 1
jz @F
add ax, VERTDIMS / 2 ; lower half for right
@@:
mov bx, HORZDIMS ; width of screen
imul bx ; dx:ax points to video buffer (not seg:off)
mov bx, ax
shl dx, 1 ; adjust segment
shl dx, 1
shl dx, 1
shl dx, 1
add dx, 0A000h ; video buffer
mov es, dx ; segment in video buffer
shr cx, 1 ; cut in half for two channels
add bx, cx ; es:bx is video buffer + xpos
mov dl, byte ptr es:[bx][HORZMARG]
mov byte ptr es:[bx][HORZMARG], 0FFh
mov ax, bx ; save current bx
pop bx ; restore pointer to last pel table
mov word ptr cs:ovb[bx][0], ax ; store current es:bx
mov ax, es
mov word ptr cs:ovb[bx][2], ax
push bx
shr bx, 1
shr bx, 1
mov byte ptr cs:ovbpel[bx], dl
pop bx
add bx, 4 ; point to next ovb entry
pop cx
dec cx
jz @F
jmp next2pel
@@:
popall
retf
dspstereowav endp
dsp16monowav proc far
pushall
mov bx, seg OURSTATFLAG
mov es, bx
mov bx, offset OURSTATFLAG
dec word ptr es:[bx]
jns @F
mov word ptr es:[bx], 0
@@:
mov cs:[xpos], 0
mov bx, seg OURDMABUF
mov es, bx
mov bx, offset OURDMABUF
mov si, es:[bx][2]
mov ds, si
mov si, es:[bx][0]
mov bx, offset SBSIZE
mov ax, es:[bx]
mov bx, offset PCMBUFDIVS
mov dx, es:[bx]
dec dx
mov cx, cs:[timesin]
inc cs:[timesin]
and cx, dx
jcxz times16out
@@: add si, ax
loop @B
times16out:
inc si ; skip to hibyte
cmp ax, DSPWIDTH
jb @F
mov ax, DSPWIDTH
xor bx, bx ; offset into dd table
@@: mov cx, ax ; count of pels to process
next16pel:
push cx ; save count of pixels
push bx ; save pointer to table
mov cx, cs:[xpos] ; cx= current xpos
inc cs:[xpos] ; next x position
mov ax, word ptr cs:[ovb][bx][2] ; last es for restoring pel
or ax, ax ; valid seg?
jz @F ; no, skip
mov es, ax
mov di, word ptr cs:[ovb][bx][0] ; es:di points to pel
push bx ; save ovb pointer
shr bx, 1 ; convert to byte index
shr bx, 1
mov al, byte ptr cs:ovbpel[bx] ; get last color
pop bx ; restore ovb pointer
mov byte ptr es:[di][HORZMARG], al ; restore color to pel
@@:
lodsb ; PCM data byte
add si, (SKIPFACTOR * 2) - 1 ; * 2 for 16 bit
mov byte ptr output, 0FFh
cbw
sar ax, 1 ; make within display range
;sar ax, 1 ; make within display range
add ax, VERTDIMS / 2 ; middle of screen
mov bx, HORZDIMS ; width of screen
imul bx ; dx:ax points to video buffer (not seg:off)
mov bx, ax
shl dx, 1 ; adjust segment
shl dx, 1
shl dx, 1
shl dx, 1
add dx, 0A000h ; video buffer
mov es, dx ; segment in video buffer
add bx, cx ; es:bx is video buffer + xpos
mov dl, byte ptr es:[bx][HORZMARG]
mov al, byte ptr output
mov byte ptr es:[bx][HORZMARG], al
mov ax, bx ; save current bx
pop bx ; restore pointer to last pel table
mov word ptr cs:ovb[bx][0], ax ; store current es:bx
mov ax, es
mov word ptr cs:ovb[bx][2], ax
push bx
shr bx, 1
shr bx, 1
mov byte ptr cs:ovbpel[bx], dl
pop bx
add bx, 4 ; point to next ovb entry
pop cx
dec cx
jcxz @F
jmp next16pel
@@:
popall
retf
dsp16monowav endp
dsp16stereowav proc far
pushall
mov bx, seg OURSTATFLAG
mov es, bx
mov bx, offset OURSTATFLAG
dec word ptr es:[bx]
jns @F
mov word ptr es:[bx], 0
@@:
mov cs:[xpos], 0
mov bx, seg OURDMABUF
mov es, bx
mov bx, offset OURDMABUF
mov si, es:[bx][2]
mov ds, si
mov si, es:[bx][0]
mov bx, seg SBSIZE
mov es, bx
mov bx, offset SBSIZE
mov cx, es:[bx]
mov ax, cx
mov cx, cs:[timesin]
inc cs:[timesin]
mov bx, seg PCMBUFDIVS
mov es, bx
mov bx, offset PCMBUFDIVS
mov dx, es:[bx]
dec dx
and cx, dx
jcxz times162out
@@: add si, ax
loop @B
times162out:
inc si ; point to hibyte of first PCM word
mov cx, ax
cmp cx, DSPWIDTH * 2
jb next162pel
mov cx, DSPWIDTH * 2
mov bx, 0 ; offset into dd table
next162pel:
push cx ; save count of pixels
push bx ; save pointer to table
mov cx, cs:[xpos] ; cx= current xpos
mov ax, word ptr cs:[ovb][bx][2] ; last es
or ax, ax ; valid seg?
jz @F ; no, skip
mov es, ax
mov di, word ptr cs:[ovb][bx][0]
push bx
shr bx, 1
shr bx, 1
mov al, byte ptr cs:ovbpel[bx]
pop bx
mov byte ptr es:[di][HORZMARG], al
@@:
inc cs:[xpos]
lodsb ; PCM data byte, now at lo-byte of next word
inc si ; now at hi-byte of next word
test cl, 1 ; odd byte (right channel?)
jnz @F
add si, ((SKIPFACTOR * 2))
@@:
cbw
sar ax, 1 ; make within display range
;sar ax, 1 ; make within display range
add ax, VERTDIMS / 4 ; upper half of screen for left channel
test cl, 1
jz @F
add ax, VERTDIMS / 2 ; lower half for right
@@:
mov bx, HORZDIMS ; width of screen
imul bx ; dx:ax points to video buffer (not seg:off)
mov bx, ax
shl dx, 1 ; adjust segment
shl dx, 1
shl dx, 1
shl dx, 1
add dx, 0A000h ; video buffer
mov es, dx ; segment in video buffer
shr cx, 1 ; cut in half for two channels
add bx, cx ; es:bx is video buffer + xpos
mov dl, byte ptr es:[bx][HORZMARG]
mov byte ptr es:[bx][HORZMARG], 0FFh
mov ax, bx ; save current bx
pop bx ; restore pointer to last pel table
mov word ptr cs:ovb[bx][0], ax ; store current es:bx
mov ax, es
mov word ptr cs:ovb[bx][2], ax
push bx
shr bx, 1
shr bx, 1
mov byte ptr cs:ovbpel[bx], dl
pop bx
add bx, 4 ; point to next ovb entry
pop cx
dec cx
jz @F
jmp next162pel
@@:
popall
retf
dsp16stereowav endp
end