impulsetracker/SoundDrivers/GUSRAMP.INC

115 lines
3.0 KiB
Plaintext
Raw Permalink Normal View History

Proc SetGUSVolume ; BX = new volume
; To do:
; 1) Set ramp start
; 2) Set ramp end
; 3) Set current volume
; 4) Start ramp
; 5) Save new volume.
Push BX
Push CX
Mov AL, 0Dh
Out DX, AL
Mov AL, 3 ; Stop Ramp!
Add DL, 2
Out DX, AL
Call GUSDelay
Out DX, AL
Sub DL, 2
Add BX, BX
Mov CX, [CS:GUSVolumeTable+BX] ; CX = new volume
Mov BX, [SI+2]
Add BX, BX
Mov BX, [CS:GUSVolumeTable+BX] ; BX = old volume
Cmp BX, CX
JNE SetGUSVolume2
Mov AL, 89h
Out DX, AL
Inc DX
In AX, DX
Dec DX
Mov BX, AX ; BX = old volume
SetGUSVolume2:
Push BX ; Old volume on stack
Xor AH, AH ; Ramp up
Cmp CX, BX
JAE SetGUSVolume1
XChg BX, CX
Mov AH, 40h ; Ramp down
SetGUSVolume1:
Mov AL, 6 ; Ramp rate
Out DX, AL
Mov AL, Byte Ptr CS:UsedChannels
ShR AL, 1
Add AL, 16
Add DL, 2
Out DX, AL
Sub DL, 2
Mov AL, 7 ; Ramp start
Out DX, AL
Mov AL, BH
Add DL, 2
Out DX, AL
Call GUSDelay
Out DX, AL
Sub DL, 2
Mov AL, 8 ; Ramp end
Out DX, AL
Mov AL, CH
Add DL, 2
Out DX, AL
Call GUSDelay
Out DX, AL
Sub DL, 2
Mov AL, 9
Out DX, AL
Pop BX ; BX = old volume
XChg BX, AX
Inc DX
Out DX, AX
Call GUSDelay
Out DX, AX
Dec DX
Mov AL, 0Dh ; Ramp control
Out DX, AL
Mov AL, BH
Add DL, 2
Out DX, AL
Call GUSDelay
Out DX, AL
Sub DL, 2
Pop CX
Pop BX
Mov [SI+2], BX
Ret
EndP SetGUSVolume