Files
lba1-classic/LIB386/LIB_MIX/MIXER_A.ASM
Gwen Gourevich c5f4f6ba25 Initial commit
2021-10-27 10:34:18 +02:00

1385 lines
22 KiB
NASM

;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*
; MIXER_A.ASM 386
; (c) Adeline 1993
;*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*
.386
jumps
.model FLAT, SYSCALL
.CODE
;*--------------------------------------------------------------------------*
IFDEF SB16
SBLASTER equ 1
ENDIF
IFDEF SBPRO
SBLASTER equ 1
ENDIF
IFDEF SB2CD
SBLASTER equ 1
ENDIF
;*--------------------------------------------------------------------------*
PUBLIC driver_start
driver_start dd OFFSET ListFuncs
IFDEF SB16
db 'Sound Blaster 16 Mixer (CT1745) Driver'
ENDIF
IFDEF SBPRO
db 'Sound Blaster Pro Mixer (CT1345) Driver'
ENDIF
IFDEF SB2CD
db 'Sound Blaster 2 CD Interface Mixer (CT1335) Driver'
ENDIF
IFDEF MWSS
db 'Microsoft Windows Sound System Mixer (AD1848 SoundPort) Driver'
ENDIF
IFDEF GOLD
db 'Adlib Gold Mixer (Yamaha GOLD) Driver'
ENDIF
IFDEF PAS
db 'Media Vision Pro Audio Spectrum/Spectrum Plus/Spectrum 16 Mixer Driver'
ENDIF
db ', Version 1.00,', 13, 10
db 'Copyright (c) Adeline Software International 1994, All Rights Reserved.', 13, 10, 10, 0
ListFuncs dd offset AskVars
dd offset SetMixerVolume
dd offset GetMixerVolume
dd offset GetMixerInfo
;*--------------------------------------------------------------------------*
MixerBase db 'MixerBase'
Empty db 0
IFDEF PAS
ListNames dd offset Empty
MV_filter dd ?
MV_xchannel dd ?
MVP_name db 'MVPROAS',0
MV_vl_txt db 'SET OUTPUT MIXER LEFT '
MV_dl db 'PCM '
db 'TO '
MV_vl db '0'
db '0'
db '0'
db '%',13
MV_vl_len equ ($-MV_vl_txt)
MV_vr_txt db 'SET OUTPUT MIXER RIGHT '
MV_dr db 'PCM '
db 'TO '
MV_vr db '0'
db '0'
db '0'
db '%',13
MV_vr_len equ ($-MV_vr_txt)
MV_ml_txt db 'SET VOLUME LEFT LEVEL TO '
MV_ml db '0'
db '0'
db '0'
db '%',13
MV_ml_len equ ($-MV_ml_txt)
MV_mr_txt db 'SET VOLUME RIGHT LEVEL TO '
MV_mr db '0'
db '0'
db '0'
db '%',13
MV_mr_len equ ($-MV_mr_txt)
ELSE
ListNames dd offset MixerBase
dd offset Empty
ENDIF
;*--------------------------------------------------------------------------*
;*--------------------------------------------------------------------------*
AskVars PROC ,\
pListNames:DWORD, pListVars:DWORD
mov eax, pListNames
mov dword ptr[eax], offset ListNames
mov eax, pListVars
mov dword ptr[eax], offset ListVars
ret
AskVars ENDP
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
IFDEF PAS
ListVars equ $
;----------------------------------------------------------------------------
SVolVoice dd 255
SVolMidi dd 255
SVolCD dd 255
SVolLine dd 255
SVolMaster dd 255
;----------------------------------------------------------------------------
decstr PROC USES ebx esi edi es,\ ;Decimal ASCII to string buffer
Buf,Num ;(no lz suppression)
LOCAL accum
cld
push ds
pop es
mov edi,[Buf]
mov eax,[Num]
mov accum,eax
mov ecx,100
__div_loop: mov eax,accum
mov edx,0
div ecx
mov accum,edx
add eax,'0'
stosb
mov eax,ecx
mov edx,0
mov ebx,10
div ebx
mov ecx,eax
cmp eax,0
jne __div_loop
ret
decstr ENDP
;----------------------------------------------------------------------------
send_MV_cmd PROC USES ebx esi edi,\ ;Send command string to MVPROAS
String,Len ;(device alias for MVSOUND.SYS)
LOCAL handle
mov eax,3d02h ;open MVPROAS for writing
mov edx,OFFSET MVP_name
int 21h
jc __exit
mov handle,eax
mov ebx,eax ;write the command string
mov ah,40h
mov ecx,[Len]
mov edx,[String]
int 21h
mov ah,3eh ;close MVPROAS
mov ebx,handle
int 21h
__exit:
ret
send_MV_cmd ENDP
;----------------------------------------------------------------------------
SetMixerVolume PROC USES EDI\
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov dword ptr[MV_dr], 2043494Dh ; 'MIC '
mov edi,OFFSET MV_vr
invoke decstr,edi,0
mov edi,OFFSET MV_vr_txt
mov ecx,MV_vr_len
invoke send_MV_cmd,edi,ecx
mov dword ptr[MV_dl], 2043494Dh
mov edi,OFFSET MV_vl
invoke decstr,edi,0
mov edi,OFFSET MV_vl_txt
mov ecx,MV_vl_len
invoke send_MV_cmd,edi,ecx
mov eax, VolVoice
cmp eax, -1
je novoice
mov SVolVoice, eax
imul ax, 100
xor dx, dx
mov cx, 255
div cx
push eax
mov dword ptr[MV_dr], 204D4350h ; 'PCM '
mov edi,OFFSET MV_vr
invoke decstr,edi,eax
mov edi,OFFSET MV_vr_txt
mov ecx,MV_vr_len
invoke send_MV_cmd,edi,ecx
pop eax
mov dword ptr[MV_dl], 204D4350h
mov edi,OFFSET MV_vl
invoke decstr,edi,eax
mov edi,OFFSET MV_vl_txt
mov ecx,MV_vl_len
invoke send_MV_cmd,edi,ecx
novoice:
mov eax, VolMidi
cmp eax, -1
je nomidi
mov SVolMidi, eax
imul ax, 100
xor dx, dx
mov cx, 255
div cx
push eax
mov dword ptr[MV_dr], 20204D46h ; 'FM '
mov edi,OFFSET MV_vr
invoke decstr,edi,eax
mov edi,OFFSET MV_vr_txt
mov ecx,MV_vr_len
invoke send_MV_cmd,edi,ecx
pop eax
mov dword ptr[MV_dl], 20204D46h
mov edi,OFFSET MV_vl
invoke decstr,edi,eax
mov edi,OFFSET MV_vl_txt
mov ecx,MV_vl_len
invoke send_MV_cmd,edi,ecx
nomidi:
mov eax, VolCD
cmp eax, -1
je nocd
mov SVolCD, eax
imul ax, 100
xor dx, dx
mov cx, 255
div cx
push eax
mov dword ptr[MV_dr], 20204443h ; 'CD '
mov edi,OFFSET MV_vr
invoke decstr,edi,eax
mov edi,OFFSET MV_vr_txt
mov ecx,MV_vr_len
invoke send_MV_cmd,edi,ecx
pop eax
mov dword ptr[MV_dl], 20204443h
mov edi,OFFSET MV_vl
invoke decstr,edi,eax
mov edi,OFFSET MV_vl_txt
mov ecx,MV_vl_len
invoke send_MV_cmd,edi,ecx
nocd:
mov eax, VolLine
cmp eax, -1
je noline
mov SVolLine, eax
imul ax, 100
xor dx, dx
mov cx, 255
div cx
push eax
mov dword ptr[MV_dr], 20545845h ; 'EXT '
mov edi,OFFSET MV_vr
invoke decstr,edi,eax
mov edi,OFFSET MV_vr_txt
mov ecx,MV_vr_len
invoke send_MV_cmd,edi,ecx
pop eax
mov dword ptr[MV_dl], 20545845h
mov edi,OFFSET MV_vl
invoke decstr,edi,eax
mov edi,OFFSET MV_vl_txt
mov ecx,MV_vl_len
invoke send_MV_cmd,edi,ecx
noline:
mov eax, VolMaster
cmp eax, -1
je nomaster
mov SVolMaster, eax
imul ax, 100
xor dx, dx
mov cx, 255
div cx
push eax
mov edi,OFFSET MV_mr
invoke decstr,edi,eax
mov edi,OFFSET MV_mr_txt
mov ecx,MV_mr_len
invoke send_MV_cmd,edi,ecx
pop eax
mov edi,OFFSET MV_ml
invoke decstr,edi,eax
mov edi,OFFSET MV_ml_txt
mov ecx,MV_ml_len
invoke send_MV_cmd,edi,ecx
nomaster:
ret
SetMixerVolume ENDP
;----------------------------------------------------------------------------
GetMixerVolume PROC uses EBX,\
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov edx, VolMaster
or edx, edx
jz nomaster
mov eax, SVolMaster
mov [edx], eax
nomaster:
mov edx, VolLine
or edx, edx
jz noline
mov eax, SVolLine
mov [edx], eax
noline:
mov edx, VolCD
or edx, edx
jz nocd
mov eax, SVolCD
mov [edx], ebx
nocd:
mov edx, VolMidi
or edx, edx
jz nomidi
mov eax, SVolMidi
mov [edx], eax
nomidi:
mov edx, VolVoice
or edx, edx
jz novoice
mov eax, SVolVoice
mov [edx], ecx
novoice:
ret
GetMixerVolume ENDP
;----------------------------------------------------------------------------
GetMixerInfo PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov ecx, VolVoice
or ecx, ecx
jz novoice
mov dword ptr[ecx], 1
novoice:
mov ecx, VolLine
or ecx, ecx
jz noline
mov dword ptr[ecx], 1
noline:
mov ecx, VolMidi
or ecx, ecx
jz nomidi
mov dword ptr[ecx], 1
nomidi:
mov ecx, VolCD
or ecx, ecx
jz nocd
mov dword ptr[ecx], 1
nocd:
mov ecx, VolMaster
or ecx, ecx
jz nomaster
mov dword ptr[ecx], 1
nomaster:
ret
GetMixerInfo ENDP
ENDIF
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
IFDEF MWSS
ListVars equ $
BASE_ADDR dd 530h ; By default 530h
;----------------------------------------------------------------------------
WRITE_MIXER MACRO REG, VAL ; write to MIXER chip
mov al, REG
out dx, al
inc dx
mov al, VAL
out dx, al
dec dx
ENDM
READ_MIXER MACRO REG ; read from MIXER chip
mov al, REG
out dx, al
inc dx
in al, dx
dec dx
ENDM
;----------------------------------------------------------------------------
SetMixerVolume PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov dx, word ptr[BASE_ADDR]
add dx, 4
mov eax, VolVoice
cmp eax, -1
je novoice
not al
shr al, 2
mov ah, al
WRITE_MIXER 06h, ah
WRITE_MIXER 07h, ah
novoice:
mov eax, VolLine
cmp eax, -1
je noline
not al
shr al, 4
mov ah, al
WRITE_MIXER 02h, ah
WRITE_MIXER 03h, ah
noline:
mov ah, 000000b
ret
SetMixerVolume ENDP
;----------------------------------------------------------------------------
GetMixerVolume PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov ecx, VolVoice
or ecx, ecx
jz novoice
mov dx, word ptr[BASE_ADDR]
add dx, 4
READ_MIXER 06h
not al
shl al, 2
and eax, 255
mov dword ptr[ecx], eax
novoice:
mov ecx, VolLine
or ecx, ecx
jz noline
READ_MIXER 02h
not al
shl al, 4
and eax, 255
mov dword ptr[ecx], eax
noline:
mov ecx, VolMidi
or ecx, ecx
jz nomidi
mov dword ptr[ecx], 255
nomidi:
mov ecx, VolCD
or ecx, ecx
jz nocd
mov dword ptr[ecx], 0
nocd:
mov ecx, VolMaster
or ecx, ecx
jz nomaster
mov dword ptr[ecx], 255
nomaster:
ret
GetMixerVolume ENDP
;----------------------------------------------------------------------------
GetMixerInfo PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov ecx, VolVoice
or ecx, ecx
jz novoice
mov dword ptr[ecx], 1
novoice:
mov ecx, VolLine
or ecx, ecx
jz noline
mov dword ptr[ecx], 1
noline:
mov ecx, VolMidi
or ecx, ecx
jz nomidi
mov dword ptr[ecx], 0
nomidi:
mov ecx, VolCD
or ecx, ecx
jz nocd
mov dword ptr[ecx], 0
nocd:
mov ecx, VolMaster
or ecx, ecx
jz nomaster
mov dword ptr[ecx], 0
nomaster:
ret
GetMixerInfo ENDP
ENDIF
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
IFDEF SBLASTER
WRITE_MIXER MACRO REG, VAL ; write to MIXER chip
mov al, REG
out dx, al
inc dx
mov al, VAL
out dx, al
dec dx
ENDM
READ_MIXER MACRO REG ; read from MIXER chip
mov al, REG
out dx, al
inc dx
in al, dx
dec dx
ENDM
ENDIF
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
IFDEF SB16
ListVars equ $
BASE_ADDR dd 220h ; By default 220h
;----------------------------------------------------------------------------
SetMixerVolume PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov dx, word ptr[BASE_ADDR] ; MIXER
add dl, 4 ; offset 4
WRITE_MIXER 3Ch, 00011110b ; disable MIC
WRITE_MIXER 3Bh, 0 ; disable PC Speaker
mov ecx, VolVoice
cmp ecx, -1
je novoice
WRITE_MIXER 32h, cl
WRITE_MIXER 33h, cl
novoice:
mov ecx, VolMidi
cmp ecx, -1
je nomidi
WRITE_MIXER 34h, cl
WRITE_MIXER 35h, cl
nomidi:
mov ecx, VolCD
cmp ecx, -1
je nocd
WRITE_MIXER 36h, cl
WRITE_MIXER 37h, cl
nocd:
mov ecx, VolLine
cmp ecx, -1
je noline
WRITE_MIXER 38h, cl
WRITE_MIXER 39h, cl
noline:
mov ecx, VolMaster
cmp ecx, -1
je nomaster
WRITE_MIXER 30h, cl
WRITE_MIXER 31h, cl
nomaster:
ret
SetMixerVolume ENDP
;----------------------------------------------------------------------------
GetMixerVolume PROC uses EBX,\
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov dx, word ptr[BASE_ADDR] ; MIXER
add dl, 4 ; offset 4
READ_MIXER 32h
mov cl, al
READ_MIXER 34h
mov ch, cl
READ_MIXER 36h
mov bl, al
READ_MIXER 38h
mov bh, al
READ_MIXER 30h
mov edx, VolMaster
or edx, edx
jz nomaster
and eax, 11111000b
mov [edx], eax
nomaster:
mov edx, VolLine
or edx, edx
jz noline
mov al, bh
and eax, 11111000b
mov [edx], eax
noline:
mov edx, VolCD
or edx, edx
jz nocd
and ebx, 11111000b
mov [edx], ebx
nocd:
mov edx, VolMidi
or edx, edx
jz nomidi
mov al, ch
and eax, 11111000b
mov [edx], eax
nomidi:
mov edx, VolVoice
or edx, edx
jz novoice
and ecx, 11111000b
mov [edx], ecx
novoice:
ret
GetMixerVolume ENDP
;----------------------------------------------------------------------------
GetMixerInfo PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov ecx, VolVoice
or ecx, ecx
jz novoice
mov dword ptr[ecx], 1
novoice:
mov ecx, VolLine
or ecx, ecx
jz noline
mov dword ptr[ecx], 1
noline:
mov ecx, VolMidi
or ecx, ecx
jz nomidi
mov dword ptr[ecx], 1
nomidi:
mov ecx, VolCD
or ecx, ecx
jz nocd
mov dword ptr[ecx], 1
nocd:
mov ecx, VolMaster
or ecx, ecx
jz nomaster
mov dword ptr[ecx], 1
nomaster:
ret
GetMixerInfo ENDP
ENDIF
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
IFDEF SBPRO
ListVars equ $
BASE_ADDR dd 220h ; By default 220h
;----------------------------------------------------------------------------
SetMixerVolume PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov dx, word ptr[BASE_ADDR] ; MIXER
add dl, 4 ; offset 4
WRITE_MIXER 0Ah , 0 ; MIC off
mov eax, VolVoice
cmp eax, -1
je novoice
mov ah, al
shr ah, 4
and al, 11110000b
or ah, al
and ah, 11101110b
WRITE_MIXER 04h, ah
novoice:
mov eax, VolMidi
cmp eax, -1
je nomidi
mov ah, al
shr ah, 4
and al, 11110000b
or ah, al
and ah, 11101110b
WRITE_MIXER 26h, ah
nomidi:
mov eax, VolCD
cmp eax, -1
je nocd
mov ah, al
shr ah, 4
and al, 11110000b
or ah, al
and ah, 11101110b
WRITE_MIXER 28h, ah
nocd:
mov eax, VolLine
cmp eax, -1
je noline
mov ah, al
shr ah, 4
and al, 11110000b
or ah, al
and ah, 11101110b
WRITE_MIXER 2Eh, ah
noline:
mov eax, VolMaster
cmp eax, -1
je nomaster
mov ah, al
shr ah, 4
and al, 11110000b
or ah, al
and ah, 11101110b
WRITE_MIXER 22h, ah
nomaster:
ret
SetMixerVolume ENDP
;----------------------------------------------------------------------------
GetMixerVolume PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine, VolMaster:DWORD
mov dx, word ptr[BASE_ADDR] ; MIXER
add dl, 4 ; offset 4
mov ecx, VolVoice
or ecx, ecx
jz novoice
READ_MIXER 04h
and eax, 11100000b
mov [ecx], eax
novoice:
mov ecx, VolMidi
or ecx, ecx
jz nomidi
READ_MIXER 26h
and eax, 11100000b
mov [ecx], eax
nomidi:
mov ecx, VolCD
or ecx, ecx
jz nocd
READ_MIXER 28h
and eax, 11100000b
mov [ecx], eax
nocd:
mov ecx, VolLine
or ecx, ecx
jz noline
READ_MIXER 2Eh
and eax, 11100000b
mov [ecx], eax
noline:
mov ecx, VolMaster
or ecx, ecx
jz nomaster
READ_MIXER 22h
and eax, 11100000b
mov [ecx], eax
nomaster:
ret
GetMixerVolume ENDP
;----------------------------------------------------------------------------
GetMixerInfo PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov ecx, VolVoice
or ecx, ecx
jz novoice
mov dword ptr[ecx], 1
novoice:
mov ecx, VolLine
or ecx, ecx
jz noline
mov dword ptr[ecx], 1
noline:
mov ecx, VolMidi
or ecx, ecx
jz nomidi
mov dword ptr[ecx], 1
nomidi:
mov ecx, VolCD
or ecx, ecx
jz nocd
mov dword ptr[ecx], 1
nocd:
mov ecx, VolMaster
or ecx, ecx
jz nomaster
mov dword ptr[ecx], 1
nomaster:
ret
GetMixerInfo ENDP
ENDIF
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
IFDEF SB2CD
ListVars equ $
BASE_ADDR dd 220h ; By default 220h
;----------------------------------------------------------------------------
SetMixerVolume PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov dx, word ptr[BASE_ADDR] ; MIXER
add dl, 4 ; offset 4
mov eax, VolVoice
cmp eax, -1
je novoice
shl ax, 3
and ah, 00000110b
WRITE_MIXER 0Ah, ah
novoice:
mov eax, VolMidi
cmp eax, -1
je nomidi
shl ax, 4
and ah, 00001110b
WRITE_MIXER 06h, ah
nomidi:
mov eax, VolCD
cmp eax, -1
je nocd
shl ax, 4
and ah, 00001110b
WRITE_MIXER 08h, ah
nocd:
mov eax, VolMaster
cmp eax, -1
je nomaster
shl ax, 4
and ah, 00001110b
WRITE_MIXER 02h, ah
nomaster:
ret
SetMixerVolume ENDP
;----------------------------------------------------------------------------
GetMixerVolume PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov dx, word ptr[BASE_ADDR] ; MIXER
add dl, 4 ; offset 4
mov ecx, VolVoice
or ecx, ecx
jz novoice
READ_MIXER 0Ah
and eax, 00000110b
shl eax, 5
mov [ecx], eax
novoice:
mov ecx, VolMidi
or ecx, ecx
jz nomidi
READ_MIXER 06h
and eax, 00001110b
shl eax, 4
mov [ecx], eax
nomidi:
mov ecx, VolCD
or ecx, ecx
jz nocd
READ_MIXER 08h
and eax, 00001110b
shl eax, 4
mov [ecx], eax
nocd:
mov ecx, VolLine
or ecx, ecx
jz noline
mov dword ptr[ecx], 0
noline:
mov ecx, VolMaster
or ecx, ecx
jz nomaster
READ_MIXER 02h
and eax, 00001110b
shl eax, 4
mov [ecx], eax
nomaster:
ret
GetMixerVolume ENDP
;----------------------------------------------------------------------------
GetMixerInfo PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov ecx, VolVoice
or ecx, ecx
jz novoice
mov dword ptr[ecx], 1
novoice:
mov ecx, VolLine
or ecx, ecx
jz noline
mov dword ptr[ecx], 0
noline:
mov ecx, VolMidi
or ecx, ecx
jz nomidi
mov dword ptr[ecx], 1
nomidi:
mov ecx, VolCD
or ecx, ecx
jz nocd
mov dword ptr[ecx], 1
nocd:
mov ecx, VolMaster
or ecx, ecx
jz nomaster
mov dword ptr[ecx], 1
nomaster:
ret
GetMixerInfo ENDP
ENDIF
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
IFDEF GOLD
ListVars equ $
BASE_ADDR dd 388h ; By default 388h
;----------------------------------------------------------------------------
SELECT_MIXER MACRO
local wait
cli
mov al, 0FFh
out dx, al
out dx, al
wait: in al, dx
and al, 11000000b
jnz wait
ENDM
LEAVE_MIXER MACRO
local wait
wait: in al, dx
and al, 11000000b
jnz wait
mov al, 0FEh
out dx, al
out dx, al
sti
ENDM
WRITE_MIXER MACRO PORT, VAL
local wait1, wait2
mov al, PORT
out dx, al
wait1: in al, dx
and al, 11000000b
jnz wait1
inc dx
mov al, VAL
out dx, al
dec dx
wait2: in al, dx
and al, 11000000b
jnz wait2
ENDM
READ_MIXER MACRO PORT
local wait1, wait2
mov al, PORT
out dx, al
wait1: in al, dx
and al, 11000000b
jnz wait1
inc dx
in al, dx
dec dx
mov ah, al
wait2: in al, dx
and al, 11000000b
jnz wait2
mov al, ah
ENDM
;----------------------------------------------------------------------------
SetMixerVolume PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov dx, word ptr[BASE_ADDR]
add dx, 2 ; MIXER
SELECT_MIXER
WRITE_MIXER 0Fh, 10000000b ; MIC off
WRITE_MIXER 10h, 10000000b ; TEL off
mov ecx, VolVoice
cmp ecx, -1
je novoice
shr cl, 1
or cl, 10000000b
WRITE_MIXER 0Bh, cl
WRITE_MIXER 0Ch, cl
novoice:
mov ecx, VolMidi
cmp ecx, -1
je nomidi
shr cl, 1
or cl, 10000000b
WRITE_MIXER 09h, cl
WRITE_MIXER 0Ah, cl
nomidi:
mov ecx, VolCD
cmp ecx, -1
je noCD
shr cl, 1
or cl, 10000000b
WRITE_MIXER 0Dh, cl
WRITE_MIXER 0Eh, cl
noCD:
mov ecx, VolMaster
cmp ecx, -1
je nomaster
shr cl, 2
or cl, 11000000b
WRITE_MIXER 04h, cl
WRITE_MIXER 05h, cl
nomaster:
LEAVE_MIXER
ret
SetMixerVolume ENDP
;----------------------------------------------------------------------------
GetMixerVolume PROC uses EBX, \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov dx, word ptr[BASE_ADDR]
add dx, 2 ; MIXER
SELECT_MIXER
READ_MIXER 0Bh
mov cl, al
READ_MIXER 09h
mov ch, al
READ_MIXER 0Dh
mov bl, al
READ_MIXER 04h
mov bh, al
LEAVE_MIXER
xor eax, eax
mov edx, VolVoice
or edx, edx
jz novoice
shl cl, 1
mov al, cl
mov [edx], eax
novoice:
mov edx, VolMidi
or edx, edx
jz nomidi
shl ch, 1
mov al, ch
mov [edx], eax
nomidi:
mov edx, VolCD
or edx, edx
jz nocd
shl bl, 1
mov al, bl
mov [edx], eax
nocd:
mov edx, VolLine
or edx, edx
jz noline
mov dword ptr[edx], 0
noline:
mov edx, VolMaster
or edx, edx
jz nomaster
shl bh, 2
mov al, bh
mov [edx], eax
nomaster:
ret
GetMixerVolume ENDP
;----------------------------------------------------------------------------
GetMixerInfo PROC \
VolVoice:DWORD, VolMidi:DWORD, VolCD:DWORD, \
VolLine:DWORD, VolMaster:DWORD
mov ecx, VolVoice
or ecx, ecx
jz novoice
mov dword ptr[ecx], 1
novoice:
mov ecx, VolLine
or ecx, ecx
jz noline
mov dword ptr[ecx], 0
noline:
mov ecx, VolMidi
or ecx, ecx
jz nomidi
mov dword ptr[ecx], 1
nomidi:
mov ecx, VolCD
or ecx, ecx
jz nocd
mov dword ptr[ecx], 1
nocd:
mov ecx, VolMaster
or ecx, ecx
jz nomaster
mov dword ptr[ecx], 1
nomaster:
ret
GetMixerInfo ENDP
ENDIF
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
END