;* POSTPROC.ASM
;*
;* Post-processing routines common for all mixing Sound Devices
;*
;* $Id: postproc.asm,v 1.3 1997/01/16 18:41:59 pekangas Exp $
;*
;* Copyright 1996,1997 Housemarque Inc.
;*
;* This file is part of the MIDAS Sound System, and may only be
;* used, modified and distributed under the terms of the MIDAS
;* Sound System license, LICENSE.TXT. By continuing to use,
;* modify or distribute this file you indicate that you have
;* read the license and understand and accept it fully.
;*
IDEAL
P386
INCLUDE "lang.inc"
MIX8BITS = 12 ; number of bits of accuracy in
; mixing for 8-bit output
;/***************************************************************************\
;*
;* Macro: NumLabel lblname, lblnum
;*
;* Description: Creates a numbered label in the source, format _namenum
;* (eg. _table1)
;*
;* Input: lblname name for the label
;* lblnum number for the label
;*
;\***************************************************************************/
MACRO NumLabel lblname, lblnum
_&lblname&lblnum:
ENDM
;/***************************************************************************\
;*
;* Macro: JmpTable lblname, lblcount
;*
;* Description: Creates a jump offset table in the source. The table consists
;* of near offsets of labels _lblname0 - _lblnameX
;*
;* Input: lblname name of labels to be used for the table
;* lblcount number of labels
;*
;\***************************************************************************/
MACRO defoffs lblname, lblnum
IFDEF __16__
DW offset _&lblname&lblnum
ELSE
DD offset _&lblname&lblnum
ENDIF
ENDM
MACRO JmpTable lblname, lblcount
numb = 0
REPT lblcount
defoffs lblname, %numb
numb = numb + 1
ENDM
ENDM
DATASEG
oldValue DD 0
CODESEG
GLOBAL LANG pp16Mono : _funct
GLOBAL LANG pp8Mono : _funct
GLOBAL LANG pp16Stereo : _funct
GLOBAL LANG pp8Stereo : _funct
;IFDEF __32__
;LABEL pp16Jump _int
;JmpTable pp16, 17
;ENDIF
;/***************************************************************************\
;*
;* Function: unsigned pp16Mono(unsigned numElements, uchar *bufStart,
;* unsigned mixPos, unsigned *mixBuffer, uchar *ppTable);
;*
;* Description: 16-bit mono post-processing routine
;*
;* Input: unsigned numElements number of elements to process
;* (guaranteed to be even)
;* uchar *bufStart pointer to start of DMA buffer
;* unsigned mixPos mixing position in DMA buffer
;* unsigned *mixBuffer pointer to source mixing buffer
;* uchar *ppTable post-processing table
;*
;* Returns: New mixing position in DMA buffer. Can not fail.
;*
;\***************************************************************************/
PROC pp16Mono _funct numElements : _int, bufStart : _ptr, \
mixPos : _int, mixBuffer : _ptr, \
ppTable : _ptr
USES _si,_di,_bx
PUSHSEGREG ds
LOADPTR es,_di,[bufStart] ; point _esdi to destinatio buffer
add _di,[mixPos]
LOADPTR ds,_si,[mixBuffer] ; point _dssi to source buffer
IF 0 ; new clipping post-processing routine below!
IFDEF __16__
mov cx,[numElements] ; cx = number of elements
test cx,cx
jz @@done
shr cx,1 ; cx = number of dwords
cld
rep movsd
ELSE
mov ecx,[numElements]
test ecx,ecx
jz @@done
shr ecx,1 ; two elements are done at a time
mov eax,ecx
and eax,15
shl eax,2
neg eax ; eax = jump table offset (64 - 4*eax)
add eax,64
sub edi,eax ; undo edi incrementing in loop
mov ebx,[pp16Jump+eax] ; ebx = jump offset
shl eax,1
sub esi,eax ; undo edi incrementing in loop
shr ecx,4 ; ecx = number of loops to mix
inc ecx
jmp ebx
@@loop:
a = 0
REPT 16
NumLabel pp16, %a
mov eax,[esi + 8*a + 4]
shl eax,16
mov ax,[word esi+8*a]
mov [edi+4*a],eax
a = a + 1
ENDM
NumLabel pp16, %a
add edi,64
add esi,128
dec ecx
jnz @@loop
ENDIF
ENDIF ; IF 0
mov ebx,[oldValue]
mov ecx,[numElements] ; ecx = number of elements, loop count
test ecx,ecx
jz @@done
@@loop:
mov eax,[esi]
add esi,4
cmp eax,32767
jg @@above
cmp eax,-32768
jl @@below
IF 0
mov edx,eax
; add eax,edx
; add eax,edx
add eax,ebx
sar eax,1
mov ebx,edx
ENDIF
mov [edi],ax
add edi,2
dec ecx
jnz @@loop
jmp @@done
@@above:
mov [word ptr edi],32767
mov ebx,32767
add edi,2
dec ecx
jnz @@loop
jmp @@done
@@below:
mov [word ptr edi],-32768
mov ebx,-32768
add edi,2
dec ecx
jnz @@loop
@@done:
mov [oldValue],ebx
sub _di,[_int bufStart] ; return new mixing position
mov _ax,_di
POPSEGREG ds
ret
ENDP
LABEL pp8Jump _int
JmpTable pp8, 17
;/***************************************************************************\
;*
;* Function: unsigned pp8Mono(unsigned numElements, uchar *bufStart,
;* unsigned mixPos, unsigned *mixBuffer, uchar *ppTable);
;*
;* Description: 8-bit mono post-processing routine
;*
;* Input: unsigned numElements number of elements to process
;* (guaranteed to be even)
;* uchar *bufStart pointer to start of DMA buffer
;* unsigned mixPos mixing position in DMA buffer
;* unsigned *mixBuffer pointer to source mixing buffer
;* uchar *ppTable post-processing table
;*
;* Returns: New mixing position in DMA buffer. Can not fail.
;*
;* (Could use some optimization)
;*
;\***************************************************************************/
PROC pp8Mono _funct numElements : _int, bufStart : _ptr, \
mixPos : _int, mixBuffer : _ptr, \
ppTable : _ptr
USES _si,_di,_bx
PUSHSEGREG ds
IFDEF __16__
lds si,[ppTable] ; point ds:si to post-proc. table
LOADPTR es,_di,[bufStart] ; point _esdi to destination buffer
add _di,[mixPos]
mov _cx,[numElements] ; number of elements to process
test _cx,_cx
jz @@done
shr _cx,1 ; number of destination words
mov bx,cx
and bx,15
shl bx,1
neg bx
add bx,32 ; undo di incrementing in loop
sub di,bx
mov ax,[pp8Jump+bx] ; ax = jump offset
push bp
LOADPTR gs,_bp,[mixBuffer] ; point gs:bp to source buffer
shl bx,1
sub bp,bx ; undo bp incrementing in loop
shr cx,4 ; cx = number of loops to do
inc cx
jmp ax
@@loop:
a = 0
REPT 16
NumLabel pp8, %a
mov bx,[gs:bp+4*a]
mov al,[si+bx+((1 SHL MIX8BITS)/2)]
mov bx,[gs:bp+4*a+2]
mov ah,[si+bx+((1 SHL MIX8BITS)/2)]
mov [es:di+2*a],ax
a = a + 1
ENDM
NumLabel pp8, %a
add bp,64
add di,32
dec cx
jnz @@loop
pop bp
ELSE
LOADPTR ds,_si,[mixBuffer] ; point _si to source buffer
LOADPTR es,_di,[bufStart] ; point _esdi to destination buffer
add _di,[mixPos]
mov _cx,[numElements] ; number of elements to process
test _cx,_cx
jz @@done
shr _cx,1 ; number of destination words
mov eax,ecx
and eax,15
shl eax,1
neg eax
add eax,32 ; undo edi incrementing in loop
sub edi,eax
shl eax,1
mov ebx,[pp8Jump+eax] ; ebx = jump offset
shl eax,1
sub esi,eax ; undo esi incrementing in loop
shr ecx,4 ; ecx = number of loops to do
inc ecx
; push ebp
; mov ebp,[ppTable] ; point ebp to post-proc. table
mov edx,[ppTable]
jmp ebx
@@loop:
a = 0
REPT 16
NumLabel pp8, %a
mov ebx,[esi+8*a]
mov al,[edx+ebx+((1 SHL MIX8BITS)/2)]
mov ebx,[esi+8*a+4]
mov ah,[edx+ebx+((1 SHL MIX8BITS)/2)]
mov [edi+2*a],ax
a = a + 1
ENDM
NumLabel pp8, %a
add esi,128
add edi,32
dec ecx
jnz @@loop
; pop ebp
ENDIF
@@done:
sub _di,[_int bufStart] ; return new mixing position
mov _ax,_di
POPSEGREG ds
ret
ENDP
;/***************************************************************************\
;*
;* Function: unsigned pp16Stereo(unsigned numElements, uchar *bufStart,
;* unsigned mixPos, unsigned *mixBuffer, uchar *ppTable);
;*
;* Description: 16-bit stereo post-processing routine
;*
;* Input: unsigned numElements number of elements to process
;* (guaranteed to be even)
;* uchar *bufStart pointer to start of DMA buffer
;* unsigned mixPos mixing position in DMA buffer
;* unsigned *mixBuffer pointer to source mixing buffer
;* uchar *ppTable post-processing table
;*
;* Returns: New mixing position in DMA buffer. Can not fail.
;*
;\***************************************************************************/
PROC pp16Stereo _funct numElements : _int, bufStart : _ptr, \
mixPos : _int, mixBuffer : _ptr, \
ppTable : _ptr
USES _si,_di,_bx
; Since the mono post-processing routine does exactly what we need
; to do here, why not as well use it?
mov _ax,[numElements]
shl _ax,1
call pp16Mono LANG, _ax, [bufStart], [mixPos], [mixBuffer], \
[ppTable]
ret
ENDP
;/***************************************************************************\
;*
;* Function: unsigned pp8Stereo(unsigned numElements, uchar *bufStart,
;* unsigned mixPos, unsigned *mixBuffer, uchar *ppTable);
;*
;* Description: 8-bit stereo post-processing routine
;*
;* Input: unsigned numElements number of elements to process
;* (guaranteed to be even)
;* uchar *bufStart pointer to start of DMA buffer
;* unsigned mixPos mixing position in DMA buffer
;* unsigned *mixBuffer pointer to source mixing buffer
;* uchar *ppTable post-processing table
;*
;* Returns: New mixing position in DMA buffer. Can not fail.
;*
;* (Could use some optimization)
;*
;\***************************************************************************/
PROC pp8Stereo _funct numElements : _int, bufStart : _ptr, \
mixPos : _int, mixBuffer : _ptr, \
ppTable : _ptr
USES _si,_di,_bx
; Since the mono post-processing routine does exactly what we need
; to do here, why not as well use it?
mov _ax,[numElements]
shl _ax,1
call pp8Mono LANG, _ax, [bufStart], [mixPos], [mixBuffer], \
[ppTable]
ret
ENDP
;* $Log: postproc.asm,v $
;* Revision 1.3 1997/01/16 18:41:59 pekangas
;* Changed copyright messages to Housemarque
;*
;* Revision 1.2 1996/07/13 17:28:28 pekangas
;* Fixed to preserve ebx
;*
;* Revision 1.1 1996/05/22 21:00:30 pekangas
;* Initial revision
;*
;* Revision 1.1 1996/05/22 20:49:33 pekangas
;* Initial revision
;*
END