1385 lines
22 KiB
NASM
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
|