1609 lines
55 KiB
Plaintext
1609 lines
55 KiB
Plaintext
|
;
|
|||
|
; WAV output mix functions....
|
|||
|
; Uses Cubic Spline Interpolation
|
|||
|
;
|
|||
|
|
|||
|
ALIGN 4
|
|||
|
|
|||
|
WAVMixingTable Label
|
|||
|
; 8 bit, 16 bit
|
|||
|
; No sound, stereo, surround
|
|||
|
; No loop, forwards loop, ping pong loop
|
|||
|
|
|||
|
DW Offset UpdateNoLoop, 0, 0, 0, 0
|
|||
|
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
|
|||
|
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
|
|||
|
|
|||
|
DW Offset MixNoLoop, PreM32SMix8Bit, MFS8Bit, MBS8Bit, Mix32Stereo8Bit
|
|||
|
DW Offset MixForwardsLoop, PreM32SMix8Bit, MFS8Bit, MBS8Bit, Mix32Stereo8Bit
|
|||
|
DW Offset MixPingPongLoop, PreM32SMix8Bit, MFS8Bit, MBS8Bit, Mix32Stereo8Bit
|
|||
|
|
|||
|
DW Offset MixNoLoop, PreM32UMix8Bit, MFS8Bit, MBS8Bit, Mix32Surround8Bit
|
|||
|
DW Offset MixForwardsLoop, PreM32UMix8Bit, MFS8Bit, MBS8Bit, Mix32Surround8Bit
|
|||
|
DW Offset MixPingPongLoop, PreM32UMix8Bit, MFS8Bit, MBS8Bit, Mix32Surround8Bit
|
|||
|
|
|||
|
DW Offset UpdateNoLoop, 0, 0, 0, 0
|
|||
|
DW Offset UpdateForwardsLoop, 0, 0, 0, 0
|
|||
|
DW Offset UpdatePingPongLoop, 0, 0, 0, 0
|
|||
|
|
|||
|
DW Offset MixNoLoop, PreM32SMix16Bit, MFS16Bit, MBS16Bit, Mix32Stereo16Bit
|
|||
|
DW Offset MixForwardsLoop, PreM32SMix16Bit, MFS16Bit, MBS16Bit, Mix32Stereo16Bit
|
|||
|
DW Offset MixPingPongLoop, PreM32SMix16Bit, MFS16Bit, MBS16Bit, Mix32Stereo16Bit
|
|||
|
|
|||
|
DW Offset MixNoLoop, PreM32UMix16Bit, MFS16Bit, MBS16Bit, Mix32Surround16Bit
|
|||
|
DW Offset MixForwardsLoop, PreM32UMix16Bit, MFS16Bit, MBS16Bit, Mix32Surround16Bit
|
|||
|
DW Offset MixPingPongLoop, PreM32UMix16Bit, MFS16Bit, MBS16Bit, Mix32Surround16Bit
|
|||
|
|
|||
|
LastLeftValue DD 0
|
|||
|
LastRightValue DD 0
|
|||
|
|
|||
|
Sample1 DD 0
|
|||
|
Sample2 DD 0
|
|||
|
Sample3 DD 0
|
|||
|
Sample4 DD 0
|
|||
|
SampleValue DD 0
|
|||
|
InterpolationOffset DD 0
|
|||
|
Const3 DD 3.0
|
|||
|
Const1On65536 DD 37800000h
|
|||
|
Const256On6 DD 422AAAAAh
|
|||
|
Const1On6 DD 3E2AAAAAh
|
|||
|
;Const65536 DD 65536.0
|
|||
|
Const32768 DD 32768.0
|
|||
|
Const1On32768 DD 38000000h
|
|||
|
;ConstLimiter DD 3F000000h
|
|||
|
Const22713_0 DD 22713.0
|
|||
|
|
|||
|
MAXFILTERVALUE EQU 47000000h
|
|||
|
|
|||
|
FILTERCLIPPINGTYPENONE EQU 0
|
|||
|
FILTERCLIPPINGTYPECOMPRESSOR EQU 1
|
|||
|
FILTERCLIPPINGTYPELIMIT EQU 0
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Get8BitWaveform Macro ; Puts waveform value in EBX, range -32k->+32k
|
|||
|
Local X
|
|||
|
|
|||
|
|
|||
|
IF CUBICINTERPOLATION
|
|||
|
|
|||
|
Mov BX, DI
|
|||
|
|
|||
|
Push EDX
|
|||
|
Push DS
|
|||
|
|
|||
|
Push CS
|
|||
|
Pop DS
|
|||
|
Assume DS:Driver
|
|||
|
|
|||
|
Sub BX, 1
|
|||
|
Mov InterpolationOffset, ECX
|
|||
|
AdC BX, 0
|
|||
|
|
|||
|
FILD InterpolationOffset
|
|||
|
FMul Const1On65536
|
|||
|
|
|||
|
MovSX EAX, Byte Ptr [ES:BX]
|
|||
|
MovSX EBX, Byte Ptr [ES:DI]
|
|||
|
Mov Sample1, EAX
|
|||
|
Mov Sample2, EBX
|
|||
|
FILD Sample1
|
|||
|
FILD Sample2
|
|||
|
FMul Const3
|
|||
|
|
|||
|
MovSX EAX, Byte Ptr [ES:DI+1]
|
|||
|
MovSX EBX, Byte Ptr [ES:DI+2]
|
|||
|
Mov Sample3, EAX
|
|||
|
Mov Sample4, EBX
|
|||
|
FILD Sample3
|
|||
|
FMul Const3
|
|||
|
FILD Sample4 ; x, 3w, 3v, u, Interp
|
|||
|
|
|||
|
; a = x+3v-3w-u
|
|||
|
; b = 3w+3u-6v
|
|||
|
; c = 6w-2u-x-3v
|
|||
|
; d = 6v
|
|||
|
|
|||
|
; Assignments:
|
|||
|
; F = x+3v
|
|||
|
; -> a = F-3w-u
|
|||
|
; -> b = 3w+3u-6v
|
|||
|
; -> c = 6w-2u-F
|
|||
|
; -> d = 6v
|
|||
|
|
|||
|
IF INTELOPTIMISED
|
|||
|
FAdd ST, ST(2) ; x+3v[3], 3w, 3v, u, Interp
|
|||
|
FLd ST(1) ; 3w, x+3v[3], 3w, 3v, u, Interp
|
|||
|
FAdd ST, ST(4) ; 3w+u[3], x+3v[2], 3w, 3v, u, Interp
|
|||
|
FXCh ST(4) ; u, x+3v[2], 3w, 3v, 3w+u[3], Interp
|
|||
|
FAdd ST, ST ; 2u[3], x+3v[1], 3w, 3v, 3w+u[2], Interp
|
|||
|
FXCh ST(3) ; 3v, x+3v[1], 3w, 2u[3], 3w+u[2], Interp
|
|||
|
FLd ST(1) ; x+3v, 3v, x+3v, 3w, 2u[3], 3w+u[1], Interp
|
|||
|
FSub ST, ST(5) ; a[3], 3v, x+3v, 3w, 2u[2], 3w+u, Interp
|
|||
|
FXCh ; 3v, a[3], x+3v, 3w, 2u[2], 3w+u, Interp
|
|||
|
FAdd ST, ST ; 6v[3], a[2], x+3v, 3w, 2u[1], 3w+u, Interp
|
|||
|
FXCh ST(5) ; 3w+u, a[2], x+3v, 3w, 2u[1], 6v[3], Interp
|
|||
|
FAdd ST, ST(4) ; 3w+3u[3], a[1], x+3v, 3w, 2u, 6v[2], Interp
|
|||
|
FXCh ; a[1], 3w+3u[3], x+3v, 3w, 2u, 6v[2], Interp
|
|||
|
FMul ST, ST(6) ; ax[3], 3w+3u[2], x+3v, 3w, 2u, 6v[1], Interp
|
|||
|
FXCh ST(2) ; x+3v, 3w+3u[2], ax[3], 3w, 2u, 6v[1], Interp
|
|||
|
FAddP ST(4), ST ; 3w+3u[1], ax[2], 3w, 2u+F[3], 6v, Interp
|
|||
|
FSub ST, ST(4) ; 3w+3u-6v[3], ax[1], 3w, 2u+F[2], 6v, Interp
|
|||
|
FXCh ST(2) ; 3w, ax[1], b[3], 2u+F[1], 6v, Interp
|
|||
|
FAdd ST, ST ; 6w[3], ax, b[2], 2u+F, 6v, Interp
|
|||
|
FXCh ; ax, 6w[3], b[2], 2u+F, 6v, Interp
|
|||
|
FAddP ST(2), ST ; 6w[1], ax+b[3], 2u+f, d, Interp
|
|||
|
FSubRP ST(2), ST ; ax+b, c[3], d, Interp
|
|||
|
FMul ST, ST(3) ; ax^2+bx[3], c[2], d, Interp
|
|||
|
FXCh ST(3) ; Interp, c[2], d, ax^2+bx[3]
|
|||
|
FMul Const256On6 ; sInterp[3], c, d, ax^2+bx[1]
|
|||
|
FXCh ; c, sInterp[3], d, ax^2+bx[1]
|
|||
|
FAddP ST(3), ST ; sInterp[2], d, ax^2+bx+c[3]
|
|||
|
FXCh ; d, sInterp[2], ax^2+bx+c[3]
|
|||
|
FMul Const256On6 ; sd[3], sInterp[1], ax^2+bx+c[2]
|
|||
|
FXCh ; sInterp[1], sd[3], ax^2+bx+c[2]
|
|||
|
FMulP ST(2), ST
|
|||
|
|
|||
|
Pop DS
|
|||
|
Assume DS:Nothing
|
|||
|
Mov EDX, [DS:0]
|
|||
|
|
|||
|
FAdd ; SampleValue (16 bit value)
|
|||
|
|
|||
|
FLd DWord Ptr [DS:0] ; x(k-1), x(k)
|
|||
|
FMul DWord Ptr [DS:14h] ; b.x(k-1), x(k)
|
|||
|
FLd DWord Ptr [DS:4] ; x(k-2), b.x(k-1), x(k)
|
|||
|
FMul DWord Ptr [DS:18h] ; c.x(k-2), b.x(k-1), x(k)
|
|||
|
FXCh ST(2) ; x(k), b.x(k-1), c.x(k-2)
|
|||
|
FMul DWord Ptr [DS:10h] ; a.x(k), b.x(k-1), c.x(k-2)
|
|||
|
FXCh ST(2) ; c.x(k-2), b.x(k-1), a.x(k)
|
|||
|
FAdd
|
|||
|
Mov EDX, [DS:0]
|
|||
|
FAdd
|
|||
|
|
|||
|
Mov [DS:4], EDX
|
|||
|
|
|||
|
FSt DWord Ptr [DS:0]
|
|||
|
FIStP CS:SampleValue
|
|||
|
|
|||
|
ELSE
|
|||
|
FAdd ST, ST(2) ; x+3v, 3w, 3v, u, Interp
|
|||
|
FLd ST(1) ; 3w, x+3v, 3w, 3v, u, Interp
|
|||
|
FSub ST, ST(4) ; 3w-u, x+3v, 3w, 3v, u, Interp
|
|||
|
FAdd ST, ST ; 6w-2u, x+3v, 3w, 3v, u, Interp
|
|||
|
FSub ST, ST(1) ; "c", x+3v, 3w, 3v, u, Interp
|
|||
|
FXCh ; x+3v, "c", 3w, 3v, u, Interp
|
|||
|
FSub ST, ST(2) ; x+3v-3w, "c", 3w, 3v, u, Interp
|
|||
|
FSub ST, ST(4) ; "a", "c", 3w, 3v, u, Interp
|
|||
|
FMul ST, ST(5) ; "ax", "c", 3w, 3v, u, Interp
|
|||
|
FXCh ST(3) ; 3v, "c", 3w, "ax", u, Interp
|
|||
|
FAdd ST, ST ; 6v, "c", 3w, "ax", u, Interp
|
|||
|
FXCh ST(4) ; u, "c", 3w, "ax", 6v, Interp
|
|||
|
FMul Const3 ; 3u, "c", 3w, "ax", 6v, Interp
|
|||
|
FSub ST, ST(4) ; 3u-6v, "c", 3w, "ax", 6v, Interp
|
|||
|
FAdd ST, ST(2) ; "b", "c", 3w, "ax", 6v, Interp
|
|||
|
FAdd ST, ST(3) ; "ax+b", "c", 3w, "ax", 6v, Interp
|
|||
|
FMul ST, ST(5) ; "ax^2+bx", "c", 3w, "ax", 6v, Interp
|
|||
|
FAdd ; ax^2+bx+c, 3w, "ax", 6v, Interp
|
|||
|
FMulP ST(4), ST ; 3w, "ax", 6v, ax^3+bx^2+cx
|
|||
|
FComPP ; 6v, ax^3+bx^2+cx
|
|||
|
FAdd ; SampleValue
|
|||
|
FMul Const256On6 ; x(k)
|
|||
|
|
|||
|
Pop DS
|
|||
|
Assume DS:Nothing
|
|||
|
|
|||
|
FMul DWord Ptr [DS:10h]
|
|||
|
|
|||
|
FLd DWord Ptr [DS:0] ; x(k-1), x(k)
|
|||
|
FMul DWord Ptr [DS:14h] ; b.x(k-1), x(k)
|
|||
|
FLd DWord Ptr [DS:4] ; x(k-2), b.x(k-1), x(k)
|
|||
|
FMul DWord Ptr [DS:18h] ; c.x(k-2), b.x(k-1), x(k)
|
|||
|
FAdd
|
|||
|
Mov EDX, [DS:0]
|
|||
|
FAdd
|
|||
|
|
|||
|
Mov [DS:4], EDX
|
|||
|
|
|||
|
FSt DWord Ptr [DS:0]
|
|||
|
FIStP SampleValue
|
|||
|
|
|||
|
ENDIF
|
|||
|
Pop EDX
|
|||
|
|
|||
|
IF FILTERCLIPPINGTYPENONE
|
|||
|
ELSE
|
|||
|
Mov EAX, [DS:0]
|
|||
|
And EAX, 7FFFFFFFh
|
|||
|
Cmp EAX, MAXFILTERVALUE
|
|||
|
JBE X
|
|||
|
|
|||
|
IF FILTERCLIPPINGTYPECOMPRESSOR
|
|||
|
|
|||
|
Mov EBX, [DS:0]
|
|||
|
FLd CS:Const22713_0
|
|||
|
FLd DWord Ptr [DS:0]
|
|||
|
FAbs
|
|||
|
FMul CS:Const1On32768
|
|||
|
FYL2X ; ST = ln(x/65536) / ln(2) * 65536 * ln(2)
|
|||
|
FAdd CS:Const32768
|
|||
|
SAR EBX, 31
|
|||
|
FIStP SampleValue
|
|||
|
Xor SampleValue, EBX
|
|||
|
Sub SampleValue, EBX
|
|||
|
|
|||
|
Comment ~
|
|||
|
Mov EBX, [DS:0]
|
|||
|
FLd DWord Ptr [DS:0]
|
|||
|
FAbs
|
|||
|
FSub [CS:Const65536]
|
|||
|
FMul [CS:ConstLimiter]
|
|||
|
FAdd [CS:Const65536]
|
|||
|
SAR EBX, 31
|
|||
|
FIStP SampleValue
|
|||
|
Xor SampleValue, EBX
|
|||
|
Sub SampleValue, EBX
|
|||
|
; FILD SampleValue
|
|||
|
; FStP DWord Ptr [DS:0]
|
|||
|
~
|
|||
|
ENDIF
|
|||
|
IF FILTERCLIPPINGTYPELIMIT
|
|||
|
|
|||
|
Mov EBX, [DS:0]
|
|||
|
Mov EAX, MAXFILTERVALUE
|
|||
|
And EBX, 80000000h
|
|||
|
Or EAX, EBX
|
|||
|
Mov [DS:0], EAX
|
|||
|
ENDIF
|
|||
|
X:
|
|||
|
ENDIF
|
|||
|
Mov EBX, SampleValue
|
|||
|
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF QUADRATICINTERPOLATION
|
|||
|
|
|||
|
Push EDX
|
|||
|
Push EBP
|
|||
|
|
|||
|
MovSX EDX, Byte Ptr [ES:DI+2] ; v
|
|||
|
MovSX EBX, Byte Ptr [ES:DI] ; t
|
|||
|
MovSX EAX, Byte Ptr [ES:DI+1] ; u
|
|||
|
|
|||
|
LEA EBP, [EBX+EDX] ; v+t
|
|||
|
SAR EBP, 1
|
|||
|
Sub EBP, EAX ; (v+t)/2 - u
|
|||
|
IMul EBP, ECX ; ax in 8.16 format
|
|||
|
SAR EBP, 10 ; ax in 8.6 format
|
|||
|
|
|||
|
ShL EAX, 7 ; EBX = 2u<<6
|
|||
|
Add EDX, EBX ; EDX = v+t
|
|||
|
Add EBX, EBX ; EAX = 2t
|
|||
|
Add EBP, EAX ; EBP = ax+2u
|
|||
|
Add EDX, EBX ; 3t+v
|
|||
|
ShL EDX, 5 ; (3t+v)/2 << 6
|
|||
|
Sub EBP, EDX ; ax+b
|
|||
|
|
|||
|
ShL EBX, 7
|
|||
|
|
|||
|
IMul EBP, ECX ; ax^2+bx in 8.22 form
|
|||
|
SAR EBP, 14 ; ax^2+bx in 8.8 form
|
|||
|
|
|||
|
Add EBX, EBP ; ax^2+bx+c
|
|||
|
|
|||
|
Pop EBP
|
|||
|
Pop EDX
|
|||
|
ENDIF
|
|||
|
|
|||
|
|
|||
|
IF LINEARINTERPOLATION
|
|||
|
MovSX EBX, Byte Ptr [ES:DI+1]
|
|||
|
MovSX EAX, Byte Ptr [ES:DI]
|
|||
|
Sub EBX, EAX
|
|||
|
IMul EBX, ECX
|
|||
|
SAR EBX, 8
|
|||
|
ShL EAX, 8
|
|||
|
Add EBX, EAX
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF POINTSAMPLED
|
|||
|
MovSX EBX, Byte Ptr [ES:DI]
|
|||
|
ShL EBX, 8
|
|||
|
ENDIF
|
|||
|
|
|||
|
EndM
|
|||
|
|
|||
|
Get16BitWaveform Macro ; Puts waveform value in EBX, range -32k->+32k
|
|||
|
Local X
|
|||
|
|
|||
|
IF CUBICINTERPOLATION
|
|||
|
Mov EBX, EDI
|
|||
|
|
|||
|
Push EDX
|
|||
|
Push DS
|
|||
|
|
|||
|
Push CS
|
|||
|
Pop DS
|
|||
|
Assume DS:Driver
|
|||
|
|
|||
|
Sub BX, 1
|
|||
|
Mov InterpolationOffset, ECX
|
|||
|
AdC BX, 0
|
|||
|
|
|||
|
FILD InterpolationOffset
|
|||
|
FMul Const1On65536
|
|||
|
|
|||
|
MovSX EAX, Word Ptr [ES:EBX+EBX]
|
|||
|
MovSX EBX, Word Ptr [ES:EDI+EDI]
|
|||
|
Mov Sample1, EAX
|
|||
|
Mov Sample2, EBX
|
|||
|
FILD Sample1
|
|||
|
FILD Sample2
|
|||
|
FMul Const3
|
|||
|
|
|||
|
MovSX EAX, Word Ptr [ES:EDI+EDI+2]
|
|||
|
MovSX EBX, Word Ptr [ES:EDI+EDI+4]
|
|||
|
Mov Sample3, EAX
|
|||
|
Mov Sample4, EBX
|
|||
|
FILD Sample3
|
|||
|
FMul Const3
|
|||
|
FILD Sample4 ; x, 3w, 3v, u, Interp
|
|||
|
|
|||
|
|
|||
|
; a = x+3v-3w-u
|
|||
|
; b = 3w+3u-6v
|
|||
|
; c = 6w-2u-x-3v
|
|||
|
; d = 6v
|
|||
|
|
|||
|
; Assignments:
|
|||
|
; F = x+3v
|
|||
|
; -> a = F-3w-u
|
|||
|
; -> b = 3w+3u-6v
|
|||
|
; -> c = 6w-2u-F
|
|||
|
; -> d = 6v
|
|||
|
|
|||
|
IF INTELOPTIMISED
|
|||
|
FAdd ST, ST(2) ; x+3v[3], 3w, 3v, u, Interp
|
|||
|
FLd ST(1) ; 3w, x+3v[3], 3w, 3v, u, Interp
|
|||
|
FAdd ST, ST(4) ; 3w+u[3], x+3v[2], 3w, 3v, u, Interp
|
|||
|
FXCh ST(4) ; u, x+3v[2], 3w, 3v, 3w+u[3], Interp
|
|||
|
FAdd ST, ST ; 2u[3], x+3v[1], 3w, 3v, 3w+u[2], Interp
|
|||
|
FXCh ST(3) ; 3v, x+3v[1], 3w, 2u[3], 3w+u[2], Interp
|
|||
|
FLd ST(1) ; x+3v, 3v, x+3v, 3w, 2u[3], 3w+u[1], Interp
|
|||
|
FSub ST, ST(5) ; a[3], 3v, x+3v, 3w, 2u[2], 3w+u, Interp
|
|||
|
FXCh ; 3v, a[3], x+3v, 3w, 2u[2], 3w+u, Interp
|
|||
|
FAdd ST, ST ; 6v[3], a[2], x+3v, 3w, 2u[1], 3w+u, Interp
|
|||
|
FXCh ST(5) ; 3w+u, a[2], x+3v, 3w, 2u[1], 6v[3], Interp
|
|||
|
FAdd ST, ST(4) ; 3w+3u[3], a[1], x+3v, 3w, 2u, 6v[2], Interp
|
|||
|
FXCh ; a[1], 3w+3u[3], x+3v, 3w, 2u, 6v[2], Interp
|
|||
|
FMul ST, ST(6) ; ax[3], 3w+3u[2], x+3v, 3w, 2u, 6v[1], Interp
|
|||
|
FXCh ST(2) ; x+3v, 3w+3u[2], ax[3], 3w, 2u, 6v[1], Interp
|
|||
|
FAddP ST(4), ST ; 3w+3u[1], ax[2], 3w, 2u+F[3], 6v, Interp
|
|||
|
FSub ST, ST(4) ; 3w+3u-6v[3], ax[1], 3w, 2u+F[2], 6v, Interp
|
|||
|
FXCh ST(2) ; 3w, ax[1], b[3], 2u+F[1], 6v, Interp
|
|||
|
FAdd ST, ST ; 6w[3], ax, b[2], 2u+F, 6v, Interp
|
|||
|
FXCh ; ax, 6w[3], b[2], 2u+F, 6v, Interp
|
|||
|
FAddP ST(2), ST ; 6w[1], ax+b[3], 2u+f, d, Interp
|
|||
|
FSubRP ST(2), ST ; ax+b, c[3], d, Interp
|
|||
|
FMul ST, ST(3)
|
|||
|
FXCh ST(3) ; Interp, c[2], d, ax^2+bx[3]
|
|||
|
FMul Const1On6 ; sInterp[3], c, d, ax^2+bx[1]
|
|||
|
FXCh ; c, sInterp[3], d, ax^2+bx[1]
|
|||
|
FAddP ST(3), ST ; sInterp[2], d, ax^2+bx+c[3]
|
|||
|
FXCh ; d, sInterp[2], ax^2+bx+c[3]
|
|||
|
FMul Const1On6 ; sd[3], sInterp[1], ax^2+bx+c[2]
|
|||
|
FXCh ; sInterp[1], sd[3], ax^2+bx+c[2]
|
|||
|
FMulP ST(2), ST
|
|||
|
|
|||
|
Pop DS
|
|||
|
Assume DS:Nothing
|
|||
|
Mov EDX, [DS:0]
|
|||
|
|
|||
|
FAdd ; SampleValue (16 bit value)
|
|||
|
|
|||
|
FLd DWord Ptr [DS:0] ; x(k-1), x(k)
|
|||
|
FMul DWord Ptr [DS:14h] ; b.x(k-1), x(k)
|
|||
|
FLd DWord Ptr [DS:4] ; x(k-2), b.x(k-1), x(k)
|
|||
|
FMul DWord Ptr [DS:18h] ; c.x(k-2), b.x(k-1), x(k)
|
|||
|
FXCh ST(2) ; x(k), b.x(k-1), c.x(k-2)
|
|||
|
FMul DWord Ptr [DS:10h] ; a.x(k), b.x(k-1), c.x(k-2)
|
|||
|
FXCh ST(2) ; c.x(k-2), b.x(k-1), a.x(k)
|
|||
|
FAdd
|
|||
|
Mov EDX, [DS:0]
|
|||
|
FAdd
|
|||
|
|
|||
|
Mov [DS:4], EDX
|
|||
|
|
|||
|
FSt DWord Ptr [DS:0]
|
|||
|
FIStP CS:SampleValue
|
|||
|
|
|||
|
ELSE
|
|||
|
FAdd ST, ST(2) ; x+3v, 3w, 3v, u, Interp
|
|||
|
FLd ST(1) ; 3w, x+3v, 3w, 3v, u, Interp
|
|||
|
FSub ST, ST(4) ; 3w-u, x+3v, 3w, 3v, u, Interp
|
|||
|
FAdd ST, ST ; 6w-2u, x+3v, 3w, 3v, u, Interp
|
|||
|
FSub ST, ST(1) ; "c", x+3v, 3w, 3v, u, Interp
|
|||
|
FXCh ; x+3v, "c", 3w, 3v, u, Interp
|
|||
|
FSub ST, ST(2) ; x+3v-3w, "c", 3w, 3v, u, Interp
|
|||
|
FSub ST, ST(4) ; "a", "c", 3w, 3v, u, Interp
|
|||
|
FMul ST, ST(5) ; "ax", "c", 3w, 3v, u, Interp
|
|||
|
FXCh ST(3) ; 3v, "c", 3w, "ax", u, Interp
|
|||
|
FAdd ST, ST ; 6v, "c", 3w, "ax", u, Interp
|
|||
|
FXCh ST(4) ; u, "c", 3w, "ax", 6v, Interp
|
|||
|
FMul Const3 ; 3u, "c", 3w, "ax", 6v, Interp
|
|||
|
FSub ST, ST(4) ; 3u-6v, "c", 3w, "ax", 6v, Interp
|
|||
|
FAdd ST, ST(2) ; "b", "c", 3w, "ax", 6v, Interp
|
|||
|
FAdd ST, ST(3) ; "ax+b", "c", 3w, "ax", 6v, Interp
|
|||
|
FMul ST, ST(5) ; "ax^2+bx", "c", 3w, "ax", 6v, Interp
|
|||
|
FAdd ; ax^2+bx+c, 3w, "ax", 6v, Interp
|
|||
|
FMulP ST(4), ST ; 3w, "ax", 6v, ax^3+bx^2+cx
|
|||
|
FComPP ; 6v, ax^3+bx^2+cx
|
|||
|
FAdd ; SampleValue
|
|||
|
FMul Const1On6
|
|||
|
|
|||
|
Pop DS
|
|||
|
Assume DS:Nothing
|
|||
|
|
|||
|
FMul DWord Ptr [DS:10h]
|
|||
|
|
|||
|
FLd DWord Ptr [DS:0] ; x(k-1), x(k)
|
|||
|
FMul DWord Ptr [DS:14h] ; b.x(k-1), x(k)
|
|||
|
FLd DWord Ptr [DS:4] ; x(k-2), b.x(k-1), x(k)
|
|||
|
FMul DWord Ptr [DS:18h] ; c.x(k-2), b.x(k-1), x(k)
|
|||
|
FAdd
|
|||
|
Mov EDX, [DS:0]
|
|||
|
FAdd
|
|||
|
|
|||
|
Mov [DS:4], EDX
|
|||
|
|
|||
|
FSt DWord Ptr [DS:0]
|
|||
|
FIStP SampleValue
|
|||
|
ENDIF
|
|||
|
Pop EDX
|
|||
|
|
|||
|
IF FILTERCLIPPINGTYPENONE
|
|||
|
ELSE
|
|||
|
Mov EAX, [DS:0]
|
|||
|
And EAX, 7FFFFFFFh
|
|||
|
Cmp EAX, MAXFILTERVALUE
|
|||
|
JBE X
|
|||
|
|
|||
|
IF FILTERCLIPPINGTYPECOMPRESSOR
|
|||
|
|
|||
|
Mov EBX, [DS:0]
|
|||
|
FLd CS:Const22713_0
|
|||
|
FLd DWord Ptr [DS:0]
|
|||
|
FAbs
|
|||
|
FMul CS:Const1On32768
|
|||
|
FYL2X ; ST = ln(x/65536) / ln(2) * 65536 * ln(2)
|
|||
|
FAdd CS:Const32768
|
|||
|
SAR EBX, 31
|
|||
|
FIStP SampleValue
|
|||
|
Xor SampleValue, EBX
|
|||
|
Sub SampleValue, EBX
|
|||
|
|
|||
|
Comment ~
|
|||
|
Mov EBX, [DS:0]
|
|||
|
FLd DWord Ptr [DS:0]
|
|||
|
FAbs
|
|||
|
FSub [CS:Const65536]
|
|||
|
FMul [CS:ConstLimiter]
|
|||
|
FAdd [CS:Const65536]
|
|||
|
SAR EBX, 31
|
|||
|
FIStP SampleValue
|
|||
|
XOr SampleValue, EBX
|
|||
|
Sub SampleValue, EBX
|
|||
|
; FILD SampleValue
|
|||
|
; FStP DWord Ptr [DS:0]
|
|||
|
~
|
|||
|
|
|||
|
ENDIF
|
|||
|
IF FILTERCLIPPINGTYPELIMIT
|
|||
|
|
|||
|
Mov EBX, [DS:0]
|
|||
|
Mov EAX, MAXFILTERVALUE
|
|||
|
And EBX, 80000000h
|
|||
|
Or EAX, EBX
|
|||
|
Mov [DS:0], EAX
|
|||
|
ENDIF
|
|||
|
X:
|
|||
|
ENDIF
|
|||
|
Mov EBX, SampleValue
|
|||
|
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF QUADRATICINTERPOLATION
|
|||
|
|
|||
|
Push ECX
|
|||
|
Push EDX
|
|||
|
Push EBP
|
|||
|
|
|||
|
MovSX EDX, Word Ptr [ES:EDI+EDI+4] ; v
|
|||
|
MovSX EBX, Word Ptr [ES:EDI+EDI] ; t
|
|||
|
MovSX EAX, Word Ptr [ES:EDI+EDI+2] ; u
|
|||
|
|
|||
|
ShR ECX, 3 ; 0.13
|
|||
|
LEA EBP, [EBX+EDX]
|
|||
|
SAR EBP, 1
|
|||
|
Sub EBP, EAX ; (v+t)/2 - u
|
|||
|
IMul EBP, ECX ; 16.13
|
|||
|
SAR EBP, 14 ; 15.0
|
|||
|
|
|||
|
Add EDX, EBX ; EDX = v+t
|
|||
|
Add EBP, EAX ; EBP = ax+2u
|
|||
|
LEA EDX, [EDX+EBX*2]
|
|||
|
SAR EDX, 2 ; EDX = (3t+v)/2
|
|||
|
Sub EBP, EDX ; ax + b, 15 form
|
|||
|
|
|||
|
IMul EBP, ECX ; ax^2+bx in 15.13 form
|
|||
|
SAR EBP, 12 ; ax^2+bx in 16.0 form
|
|||
|
|
|||
|
Add EBX, EBP
|
|||
|
|
|||
|
Pop EBP
|
|||
|
Pop EDX
|
|||
|
Pop ECX
|
|||
|
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF LINEARINTERPOLATION
|
|||
|
MovSX EBX, Word Ptr [ES:EDI+EDI+2]
|
|||
|
MovSX EAX, Word Ptr [ES:EDI+EDI]
|
|||
|
Sub EBX, EAX
|
|||
|
SAR EBX, 1
|
|||
|
IMul EBX, ECX
|
|||
|
SAR EBX, 15
|
|||
|
Add EBX, EAX
|
|||
|
ENDIF
|
|||
|
|
|||
|
IF POINTSAMPLED
|
|||
|
MovSX EBX, Word Ptr [ES:EDI+EDI]
|
|||
|
ENDIF
|
|||
|
|
|||
|
EndM
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc Mix32Stereo8Bit ; Given DS:SI = buffer
|
|||
|
; Given ES:DI = sample
|
|||
|
; AX = bytes to mix
|
|||
|
; CX = error
|
|||
|
; DX = delta offset
|
|||
|
; BP = delta error
|
|||
|
|
|||
|
ShL AX, 3
|
|||
|
Add AX, SI
|
|||
|
Mov Word Ptr [CS:M32S8BEND], AX
|
|||
|
|
|||
|
Mix32Stereo8Bit1:
|
|||
|
Get8BitWaveForm
|
|||
|
|
|||
|
M32S8BLVC EQU $+3
|
|||
|
IMul EAX, EBX, 12345678h
|
|||
|
Sub [SI], EAX
|
|||
|
|
|||
|
Mov CS:LastLeftValue, EAX
|
|||
|
|
|||
|
M32S8BRVC EQU $+3
|
|||
|
IMul EAX, EBX, 12345678h
|
|||
|
Sub [SI+4], EAX
|
|||
|
|
|||
|
Mov CS:LastRightValue, EAX
|
|||
|
|
|||
|
Add CX, BP
|
|||
|
AdC DI, DX
|
|||
|
Add SI, 8
|
|||
|
|
|||
|
M32S8BLVSet EQU $+2
|
|||
|
Mov EAX, 12345678h ; Destination volume left
|
|||
|
M32S8BRVSet EQU $+2
|
|||
|
Mov EBX, 12345678h ; Destination volume right
|
|||
|
|
|||
|
Sub EAX, DWord Ptr [CS:M32S8BLVC] ; Delta
|
|||
|
Sub EBX, DWord Ptr [CS:M32S8BRVC]
|
|||
|
|
|||
|
SAR EAX, RAMPSPEED
|
|||
|
SAR EBX, RAMPSPEED
|
|||
|
|
|||
|
Add DWord Ptr [CS:M32S8BLVC], EAX
|
|||
|
Add DWord Ptr [CS:M32S8BRVC], EBX
|
|||
|
|
|||
|
M32S8BNoRightRamp:
|
|||
|
|
|||
|
M32S8BEND EQU $+2
|
|||
|
Cmp SI, 1234h
|
|||
|
JNE Mix32Stereo8Bit1
|
|||
|
|
|||
|
Ret
|
|||
|
|
|||
|
EndP Mix32Stereo8Bit
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc PreM32SMix8Bit
|
|||
|
|
|||
|
IF VOLUMERAMP
|
|||
|
PushAD
|
|||
|
|
|||
|
Xor EAX, EAX
|
|||
|
Xor EBX, EBX
|
|||
|
Xor EDX, EDX
|
|||
|
Xor EBP, EBP
|
|||
|
Xor EDI, EDI
|
|||
|
|
|||
|
Mov AX, Word Ptr [SI+0Ch] ; New right volume
|
|||
|
Mov BX, Word Ptr [SI+0Eh] ; New left volume
|
|||
|
|
|||
|
Mov DX, Word Ptr [SI+1Ch] ; Old right volume
|
|||
|
Mov BP, Word Ptr [SI+1Eh] ; Old left volume
|
|||
|
|
|||
|
Mov DWord Ptr [CS:M32S8BRVC], EDX
|
|||
|
Mov DWord Ptr [CS:M32S8BLVC], EBP
|
|||
|
|
|||
|
; Compensate for upwards ramp.
|
|||
|
|
|||
|
Cmp AX, DX
|
|||
|
JB PreM32Mix8BitNoRightCompensate
|
|||
|
|
|||
|
Add AX, RAMPCOMPENSATE
|
|||
|
|
|||
|
PreM32Mix8BitNoRightCompensate:
|
|||
|
|
|||
|
Cmp BX, BP
|
|||
|
JB PreM32Mix8BitNoLeftCompensate
|
|||
|
|
|||
|
Add BX, RAMPCOMPENSATE
|
|||
|
|
|||
|
PreM32Mix8BitNoLeftCompensate:
|
|||
|
Mov DWord Ptr [CS:M32S8BRVSet], EAX
|
|||
|
Mov DWord Ptr [CS:M32S8BLVSet], EBX
|
|||
|
|
|||
|
; Now to figure out exact final volumes
|
|||
|
|
|||
|
Push SI
|
|||
|
Mov CX, CS:RealBytesToMix
|
|||
|
|
|||
|
PreM32Mix8Bit1:
|
|||
|
Mov ESI, EAX ; Set values
|
|||
|
Mov EDI, EBX
|
|||
|
Sub ESI, EDX ; Current values
|
|||
|
Sub EDI, EBP
|
|||
|
SAR ESI, RAMPSPEED
|
|||
|
SAR EDI, RAMPSPEED
|
|||
|
Add EDX, ESI
|
|||
|
Add EBP, EDI
|
|||
|
|
|||
|
Loop PreM32Mix8Bit1
|
|||
|
|
|||
|
Pop SI
|
|||
|
|
|||
|
Mov Word Ptr [SI+1Ch], DX
|
|||
|
Mov Word Ptr [SI+1Eh], BP
|
|||
|
|
|||
|
PopAD
|
|||
|
Ret
|
|||
|
ELSE
|
|||
|
|
|||
|
Xor EAX, EAX
|
|||
|
Xor EBX, EBX
|
|||
|
|
|||
|
Mov AX, Word Ptr [SI+0Ch]
|
|||
|
Mov BX, Word Ptr [SI+0Eh]
|
|||
|
|
|||
|
Mov DWord Ptr [CS:M32S8BRVC], EAX
|
|||
|
Mov DWord Ptr [CS:M32S8BLVC], EBX
|
|||
|
|
|||
|
Mov DWord Ptr [CS:M32S8BRVSet], EAX
|
|||
|
Mov DWord Ptr [CS:M32S8BLVSet], EBX
|
|||
|
|
|||
|
Mov [SI+1Ch], AX
|
|||
|
Mov [SI+1Eh], BX
|
|||
|
|
|||
|
Ret
|
|||
|
ENDIF
|
|||
|
|
|||
|
EndP PreM32SMix8Bit
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc Mix32Surround8Bit ; Given DS:SI = buffer
|
|||
|
; Given ES:DI = sample
|
|||
|
; AX = bytes to mix
|
|||
|
; CX = error
|
|||
|
; DX = delta offset
|
|||
|
; BP = delta error
|
|||
|
|
|||
|
ShL AX, 3
|
|||
|
Add AX, SI
|
|||
|
Mov Word Ptr [CS:M32U8BEND], AX
|
|||
|
|
|||
|
Mix32Surround8Bit1:
|
|||
|
Get8BitWaveForm
|
|||
|
|
|||
|
M32U8BLVC EQU $+3
|
|||
|
IMul EAX, EBX, 12345678h
|
|||
|
Sub [SI], EAX
|
|||
|
Mov CS:LastLeftValue, EAX
|
|||
|
|
|||
|
Neg EAX
|
|||
|
M32U8BLVSet EQU $+2
|
|||
|
Mov EBX, 12345678h
|
|||
|
|
|||
|
Sub [SI+4], EAX
|
|||
|
Sub EBX, DWord Ptr [CS:M32U8BLVC]
|
|||
|
|
|||
|
|
|||
|
SAR EBX, RAMPSPEED
|
|||
|
Add SI, 8
|
|||
|
|
|||
|
Add CX, BP
|
|||
|
AdC DI, DX
|
|||
|
|
|||
|
Add DWord Ptr [CS:M32U8BLVC], EBX
|
|||
|
|
|||
|
M32U8BEND EQU $+2
|
|||
|
Cmp SI, 1234h
|
|||
|
JNE Mix32Surround8Bit1
|
|||
|
|
|||
|
Mov EAX, CS:LastLeftValue
|
|||
|
Neg EAX
|
|||
|
Mov CS:LastRightValue, EAX
|
|||
|
Ret
|
|||
|
|
|||
|
EndP Mix32Surround8Bit
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc PreM32UMix8Bit
|
|||
|
|
|||
|
IF VOLUMERAMP
|
|||
|
Xor EAX, EAX
|
|||
|
Xor EBX, EBX
|
|||
|
Mov AX, Word Ptr [SI+1Eh] ; Old
|
|||
|
Mov BX, Word Ptr [SI+0Eh] ; New
|
|||
|
Mov DWord Ptr [CS:M32U8BLVC], EAX
|
|||
|
|
|||
|
; Compensate for upwards ramp.
|
|||
|
|
|||
|
Cmp BX, AX
|
|||
|
JB PreM32MixU8Bit2
|
|||
|
|
|||
|
Add BX, RAMPCOMPENSATE
|
|||
|
|
|||
|
PreM32MixU8Bit2:
|
|||
|
Mov DWord Ptr [CS:M32U8BLVSet], EBX
|
|||
|
|
|||
|
Mov CX, CS:RealBytesToMix
|
|||
|
|
|||
|
PreM32UMix8Bit1:
|
|||
|
Mov EDX, EBX
|
|||
|
Sub EDX, EAX
|
|||
|
SAR EDX, RAMPSPEED
|
|||
|
Add EAX, EDX
|
|||
|
|
|||
|
Loop PreM32UMix8Bit1
|
|||
|
|
|||
|
Mov [SI+1Eh], AX
|
|||
|
Ret
|
|||
|
|
|||
|
ELSE
|
|||
|
Xor EAX, EAX
|
|||
|
Mov AX, Word Ptr [SI+0Eh]
|
|||
|
Mov DWord Ptr [CS:M32U8BLVC], EAX
|
|||
|
Mov DWord Ptr [CS:M32U8BLVSet], EAX
|
|||
|
Mov [SI+1Eh], AX
|
|||
|
|
|||
|
Ret
|
|||
|
ENDIF
|
|||
|
|
|||
|
EndP PreM32UMix8Bit
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc Mix32Stereo16Bit
|
|||
|
|
|||
|
ShL AX, 3
|
|||
|
Add AX, SI
|
|||
|
Mov Word Ptr [CS:M32S16BEND], AX
|
|||
|
|
|||
|
Mix32Stereo16Bit1:
|
|||
|
Get16BitWaveform
|
|||
|
|
|||
|
M32S16BLVC EQU $+3
|
|||
|
IMul EAX, EBX, 12345678h
|
|||
|
Sub [SI], EAX
|
|||
|
|
|||
|
Mov CS:LastLeftValue, EAX
|
|||
|
|
|||
|
M32S16BRVC EQU $+3
|
|||
|
IMul EAX, EBX, 12345678h
|
|||
|
Sub [SI+4], EAX
|
|||
|
|
|||
|
Mov CS:LastRightValue, EAX
|
|||
|
|
|||
|
Add CX, BP
|
|||
|
AdC DI, DX
|
|||
|
|
|||
|
M32S16BLVSet EQU $+2
|
|||
|
Mov EAX, 12345678h ; Destination volume left
|
|||
|
M32S16BRVSet EQU $+2
|
|||
|
Mov EBX, 12345678h ; Destination volume right
|
|||
|
|
|||
|
Sub EAX, DWord Ptr [CS:M32S16BLVC] ; Delta
|
|||
|
Sub EBX, DWord Ptr [CS:M32S16BRVC]
|
|||
|
|
|||
|
SAR EAX, RAMPSPEED
|
|||
|
SAR EBX, RAMPSPEED
|
|||
|
|
|||
|
Add DWord Ptr [CS:M32S16BLVC], EAX
|
|||
|
Add DWord Ptr [CS:M32S16BRVC], EBX
|
|||
|
|
|||
|
Add SI, 8
|
|||
|
|
|||
|
M32S16BEND EQU $+2
|
|||
|
Cmp SI, 1234h
|
|||
|
JNE Mix32Stereo16Bit1
|
|||
|
|
|||
|
Ret
|
|||
|
|
|||
|
EndP Mix32Stereo16Bit
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc PreM32SMix16Bit
|
|||
|
|
|||
|
IF VOLUMERAMP
|
|||
|
PushAD
|
|||
|
|
|||
|
Xor EAX, EAX
|
|||
|
Xor EBX, EBX
|
|||
|
Xor EDX, EDX
|
|||
|
Xor EBP, EBP
|
|||
|
Xor EDI, EDI
|
|||
|
|
|||
|
Mov AX, Word Ptr [SI+0Ch] ; New right volume
|
|||
|
Mov BX, Word Ptr [SI+0Eh] ; New left volume
|
|||
|
|
|||
|
Mov DX, Word Ptr [SI+1Ch] ; Old right volume
|
|||
|
Mov BP, Word Ptr [SI+1Eh] ; Old left volume
|
|||
|
|
|||
|
Mov DWord Ptr [CS:M32S16BRVC], EDX
|
|||
|
Mov DWord Ptr [CS:M32S16BLVC], EBP
|
|||
|
|
|||
|
; Compensate for upwards ramp.
|
|||
|
|
|||
|
Cmp AX, DX
|
|||
|
JB PreM32Mix16BitNoRightCompensate
|
|||
|
|
|||
|
Add AX, RAMPCOMPENSATE
|
|||
|
|
|||
|
PreM32Mix16BitNoRightCompensate:
|
|||
|
|
|||
|
Cmp BX, BP
|
|||
|
JB PreM32Mix16BitNoLeftCompensate
|
|||
|
|
|||
|
Add BX, RAMPCOMPENSATE
|
|||
|
|
|||
|
PreM32Mix16BitNoLeftCompensate:
|
|||
|
Mov DWord Ptr [CS:M32S16BRVSet], EAX
|
|||
|
Mov DWord Ptr [CS:M32S16BLVSet], EBX
|
|||
|
|
|||
|
; Now to figure out exact final volumes
|
|||
|
|
|||
|
Push SI
|
|||
|
Mov CX, CS:RealBytesToMix
|
|||
|
|
|||
|
PreM32Mix16Bit1:
|
|||
|
Mov ESI, EAX ; Set values
|
|||
|
Mov EDI, EBX
|
|||
|
|
|||
|
Sub ESI, EDX ; Current values
|
|||
|
Sub EDI, EBP
|
|||
|
|
|||
|
SAR ESI, RAMPSPEED
|
|||
|
SAR EDI, RAMPSPEED
|
|||
|
|
|||
|
Add EDX, ESI
|
|||
|
Add EBP, EDI
|
|||
|
|
|||
|
Loop PreM32Mix16Bit1
|
|||
|
Pop SI
|
|||
|
|
|||
|
Mov Word Ptr [SI+1Ch], DX
|
|||
|
Mov Word Ptr [SI+1Eh], BP
|
|||
|
|
|||
|
PopAD
|
|||
|
Ret
|
|||
|
ELSE
|
|||
|
|
|||
|
Xor EAX, EAX
|
|||
|
Xor EBX, EBX
|
|||
|
|
|||
|
Mov AX, Word Ptr [SI+0Ch]
|
|||
|
Mov BX, Word Ptr [SI+0Eh]
|
|||
|
|
|||
|
Mov DWord Ptr [CS:M32S16BRVC], EAX
|
|||
|
Mov DWord Ptr [CS:M32S16BLVC], EBX
|
|||
|
|
|||
|
Mov DWord Ptr [CS:M32S16BRVSet], EAX
|
|||
|
Mov DWord Ptr [CS:M32S16BLVSet], EBX
|
|||
|
|
|||
|
Mov [SI+1Ch], AX
|
|||
|
Mov [SI+1Eh], BX
|
|||
|
|
|||
|
Ret
|
|||
|
ENDIF
|
|||
|
|
|||
|
EndP PreM32SMix16Bit
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc Mix32Surround16Bit ; Given DS:SI = buffer
|
|||
|
; Given ES:DI = sample
|
|||
|
; AX = bytes to mix
|
|||
|
; CX = error
|
|||
|
; DX = delta offset
|
|||
|
; BP = delta error
|
|||
|
|
|||
|
ShL AX, 3
|
|||
|
Add AX, SI
|
|||
|
Mov Word Ptr [CS:M32U16BEND], AX
|
|||
|
|
|||
|
Mix32Surround16Bit1:
|
|||
|
Get16BitWaveForm
|
|||
|
|
|||
|
M32U16BLVC EQU $+3
|
|||
|
IMul EAX, EBX, 12345678h
|
|||
|
Sub [SI], EAX
|
|||
|
|
|||
|
M32U16BLVSet EQU $+2
|
|||
|
Mov EBX, 12345678h
|
|||
|
|
|||
|
Neg EAX
|
|||
|
Sub EBX, DWord Ptr [CS:M32U16BLVC]
|
|||
|
|
|||
|
Sub [SI+4], EAX
|
|||
|
|
|||
|
SAR EBX, RAMPSPEED
|
|||
|
Add SI, 8
|
|||
|
|
|||
|
Add CX, BP
|
|||
|
AdC DI, DX
|
|||
|
|
|||
|
Add DWord Ptr [CS:M32U16BLVC], EBX
|
|||
|
|
|||
|
M32U16BEND EQU $+2
|
|||
|
Cmp SI, 1234h
|
|||
|
JNE Mix32Surround16Bit1
|
|||
|
|
|||
|
Mov CS:LastRightValue, EAX
|
|||
|
Neg EAX
|
|||
|
Mov CS:LastLeftValue, EAX
|
|||
|
Ret
|
|||
|
|
|||
|
EndP Mix32Surround16Bit
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc PreM32UMix16Bit
|
|||
|
|
|||
|
IF VOLUMERAMP
|
|||
|
Xor EAX, EAX
|
|||
|
Xor EBX, EBX
|
|||
|
Mov AX, Word Ptr [SI+1Eh]
|
|||
|
Mov BX, Word Ptr [SI+0Eh]
|
|||
|
Mov DWord Ptr [CS:M32U16BLVC], EAX
|
|||
|
|
|||
|
; Compensate for upwards ramp.
|
|||
|
|
|||
|
Cmp BX, AX
|
|||
|
JB PreM32MixU16Bit2
|
|||
|
|
|||
|
Add BX, RAMPCOMPENSATE
|
|||
|
|
|||
|
PreM32MixU16Bit2:
|
|||
|
|
|||
|
Mov DWord Ptr [CS:M32U16BLVSet], EBX
|
|||
|
|
|||
|
Mov CX, CS:RealBytesToMix
|
|||
|
|
|||
|
PreM32UMix16Bit1:
|
|||
|
Mov EDX, EBX
|
|||
|
Sub EDX, EAX
|
|||
|
SAR EDX, RAMPSPEED
|
|||
|
Add EAX, EDX
|
|||
|
|
|||
|
Loop PreM32UMix16Bit1
|
|||
|
|
|||
|
Mov [SI+1Eh], AX
|
|||
|
Ret
|
|||
|
|
|||
|
ELSE
|
|||
|
Xor EAX, EAX
|
|||
|
Mov AX, Word Ptr [SI+0Eh]
|
|||
|
Mov DWord Ptr [CS:M32U16BLVC], EAX
|
|||
|
Mov DWord Ptr [CS:M32U16BLVSet], EAX
|
|||
|
Mov [SI+1Eh], AX
|
|||
|
Ret
|
|||
|
ENDIF
|
|||
|
|
|||
|
EndP PreM32UMix16Bit
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
NUMBEROFFILTERBANDS EQU 4
|
|||
|
|
|||
|
ALIGN 4
|
|||
|
LastClickRemovalLeft DD 0
|
|||
|
LastClickRemovalRight DD 0
|
|||
|
StartingChannelOffset DW 0
|
|||
|
FilterParameters DB 64 Dup (7Fh), 64 Dup (0)
|
|||
|
FilterValues DD 4*256 Dup (0)
|
|||
|
SampleFilterCopyOffset DW 16*64
|
|||
|
FreqMultiplier DD 3A9F7867h ; = 1/(2*PI*110.0*2^0.25)
|
|||
|
FreqParameterMultiplier DD 0B92AAAAAh ; = -1/(24*256)
|
|||
|
FilterFreqValue DW 0
|
|||
|
NewControlWord DW 7Fh
|
|||
|
include q.inc
|
|||
|
|
|||
|
LastFilter DD NUMBEROFFILTERBANDS*2 Dup (0) ; 4 stereo values
|
|||
|
FilterCoefficients DD NUMBEROFFILTERBANDS*2 Dup (0)
|
|||
|
FilterVolumes DD NUMBEROFFILTERBANDS Dup (0)
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc IsSampleMode ; returns zero flag if sample mode.
|
|||
|
|
|||
|
Push DS
|
|||
|
|
|||
|
Mov DS, CS:SongDataArea
|
|||
|
Test Byte Ptr [DS:2Ch], 4
|
|||
|
|
|||
|
Pop DS
|
|||
|
Ret
|
|||
|
|
|||
|
EndP IsSampleMode
|
|||
|
Assume DS:Nothing
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
Proc M32MixHandler
|
|||
|
; Clear output buffer first...
|
|||
|
|
|||
|
Mov CS:StartingChannelOffset, SI
|
|||
|
|
|||
|
Push CX
|
|||
|
|
|||
|
Mov ES, CS:MixSegment
|
|||
|
Mov EAX, CS:BytesToMixFractional
|
|||
|
Mov CX, CS:BytesToMix
|
|||
|
Add CurrentFractional, EAX
|
|||
|
AdC CX, 0
|
|||
|
Mov CS:RealBytestoMix, CX
|
|||
|
; Add CX, CX ; Stereo = 2 * BytesToMix
|
|||
|
; Mov DI, 32
|
|||
|
; Xor EAX, EAX
|
|||
|
; Rep StosD
|
|||
|
|
|||
|
Pop CX
|
|||
|
|
|||
|
PushAD
|
|||
|
|
|||
|
Mov EDX, CS:LastClickRemovalLeft
|
|||
|
Mov EBP, CS:LastClickRemovalRight
|
|||
|
|
|||
|
; Do left first.
|
|||
|
Mov SI, 80
|
|||
|
Mov CX, CS:RealBytesToMix
|
|||
|
|
|||
|
ClickRemoval3:
|
|||
|
|
|||
|
Comment ~
|
|||
|
|
|||
|
Mov [ES:SI], EDX
|
|||
|
Mov [ES:SI+4], EBP
|
|||
|
|
|||
|
Inc EDX
|
|||
|
JS ClickRemoval4
|
|||
|
|
|||
|
Sub EDX, 2
|
|||
|
JGE ClickRemoval4
|
|||
|
|
|||
|
Inc EDX
|
|||
|
|
|||
|
ClickRemoval4:
|
|||
|
Inc EBP
|
|||
|
JS ClickRemoval5
|
|||
|
|
|||
|
Sub EBP, 2
|
|||
|
JGE ClickRemoval5
|
|||
|
|
|||
|
Inc EBP
|
|||
|
|
|||
|
ClickRemoval5:
|
|||
|
~
|
|||
|
|
|||
|
Mov EAX, EDX
|
|||
|
Mov EBX, EBP
|
|||
|
SAR EAX, 12
|
|||
|
SAR EBX, 12
|
|||
|
Mov [ES:SI], EDX
|
|||
|
Mov [ES:SI+4], EBP
|
|||
|
|
|||
|
Sub EAX, 1
|
|||
|
AdC EAX, 1
|
|||
|
Sub EBX, 1
|
|||
|
AdC EBX, 1
|
|||
|
|
|||
|
Sub EDX, EAX
|
|||
|
Sub EBP, EBX
|
|||
|
|
|||
|
Add SI, 8
|
|||
|
Loop ClickRemoval3
|
|||
|
|
|||
|
Mov CS:LastClickRemovalLeft, EDX
|
|||
|
Mov CS:LastClickRemovalRight, EBP
|
|||
|
|
|||
|
PopAD
|
|||
|
|
|||
|
; Check each channel...
|
|||
|
; Prepare mixing stuff
|
|||
|
|
|||
|
; Work backwards
|
|||
|
Mov AX, CX
|
|||
|
Dec AX
|
|||
|
ShL AX, 7
|
|||
|
Add SI, AX
|
|||
|
|
|||
|
M32MixHandler1:
|
|||
|
Test Byte Ptr [SI], 1
|
|||
|
JZ M32MixHandlerEnd2
|
|||
|
Cmp Byte Ptr [SI+36h], 100
|
|||
|
JE M32MixHandlerEnd2
|
|||
|
|
|||
|
Push CX
|
|||
|
Mov BP, SI
|
|||
|
Sub BP, [CS:StartingChannelOffset] ; BP = SlaveChannel*128
|
|||
|
SHR BP, 3 ; BP = SlaveChannel*16
|
|||
|
Mov DI, BP
|
|||
|
Add BP, Offset FilterValues
|
|||
|
|
|||
|
Mov CX, [SI]
|
|||
|
Test CH, 2
|
|||
|
JZ M32MixHandler13
|
|||
|
|
|||
|
; Note cut.
|
|||
|
And Byte Ptr [SI], Not 1 ; Turn off channel
|
|||
|
Mov Word Ptr [SI+4Ah], 0
|
|||
|
Or CL, 40h
|
|||
|
|
|||
|
M32MixHandler13:
|
|||
|
Test CL, 20h ; New freq?
|
|||
|
JZ M32MixHandler3
|
|||
|
|
|||
|
Mov AX, [SI+10h]
|
|||
|
Mov DX, [SI+12h]
|
|||
|
Mov BX, MixSpeed
|
|||
|
Cmp DX, BX
|
|||
|
JAE M32MixHandlerError
|
|||
|
|
|||
|
Div BX
|
|||
|
ShL EAX, 16
|
|||
|
Xor AX, AX
|
|||
|
Div BX
|
|||
|
Mov STEPVALUE, EAX
|
|||
|
|
|||
|
M32MixHandler3:
|
|||
|
Test CH, 1 ; New note?
|
|||
|
JZ M32MixHandler12
|
|||
|
|
|||
|
Xor EAX, EAX
|
|||
|
Mov DWord Ptr [SI+1Ch], EAX
|
|||
|
Mov DWord Ptr [CS:BP], EAX
|
|||
|
Mov DWord Ptr [CS:BP+4], EAX
|
|||
|
Mov DWord Ptr [CS:BP+8], 3F800000h
|
|||
|
Mov DWord Ptr [CS:BP+0Ch], EAX
|
|||
|
|
|||
|
M32MixHandler12:
|
|||
|
Test CX, 8440h ; New volume, loop or pan?
|
|||
|
JZ M32MixHandler4
|
|||
|
|
|||
|
Mov AL, [SI+3Ah]
|
|||
|
Test AL, AL
|
|||
|
JNS M32MixHandlerFilter1
|
|||
|
|
|||
|
Mov BL, [SI+3Fh]
|
|||
|
Jmp M32MixHandlerFilter2
|
|||
|
|
|||
|
M32MixHandlerFilter1:
|
|||
|
Mov DI, AX
|
|||
|
And DI, 63
|
|||
|
Add DI, Offset FilterParameters
|
|||
|
|
|||
|
Mov AL, [CS:DI]
|
|||
|
Mov BL, [CS:DI+64]
|
|||
|
Mov [SI+5Bh], AL
|
|||
|
Mov [SI+3Fh], BL
|
|||
|
|
|||
|
M32MixHandlerFilter2:
|
|||
|
Mov AL, [SI+3Eh]
|
|||
|
Mul Byte Ptr [SI+5Bh]
|
|||
|
Mov CS:FilterFreqValue, AX
|
|||
|
ShR AX, 8
|
|||
|
Mov AH, BL
|
|||
|
AdC AX, 0
|
|||
|
|
|||
|
Cmp AX, 7Fh
|
|||
|
JE M32MixHandlerNoFilter
|
|||
|
|
|||
|
And BX, 0FFh
|
|||
|
ShL BX, 2
|
|||
|
|
|||
|
FNInit
|
|||
|
FLdCW [CS:NewControlWord]
|
|||
|
|
|||
|
FILD [CS:FilterFreqValue] ; 0->127*256
|
|||
|
FMul [CS:FreqParameterMultiplier] ; -i/(24*256)
|
|||
|
FLd ST
|
|||
|
FRndInt
|
|||
|
FSub ST(1), ST
|
|||
|
FXCh
|
|||
|
F2XM1
|
|||
|
FLd1
|
|||
|
FAdd
|
|||
|
FScale ; = 2^(i/24*256)
|
|||
|
FMul [CS:FreqMultiplier] ; = r
|
|||
|
FLd ST ; r, r
|
|||
|
FMul ST(1), ST ; r, r^2
|
|||
|
|
|||
|
FLd [CS:QualityFactorTable+BX] ; 2d, r, r^2
|
|||
|
FMul ST(1), ST ; 2d, 2dr, r^2
|
|||
|
FLd1 ; 1, 2d, 2dr, r^2
|
|||
|
FSubP ST(1), ST ; 2d-1, 2dr, r^2
|
|||
|
FAdd
|
|||
|
|
|||
|
FLd1 ; 1, d, e
|
|||
|
FAdd ST, ST(1)
|
|||
|
FAdd ST, ST(2) ; 1+d+e, d, e
|
|||
|
FLd1 ; 1, 1+d+e, d, e
|
|||
|
FDivRP ST(1), ST ; 1/(1+d+e), d, e
|
|||
|
FSt DWord Ptr [CS:BP+8]
|
|||
|
FXCh ; d, 1/(1+d+e), e
|
|||
|
FAdd ST, ST(2)
|
|||
|
FAddP ST(2), ST ; 1/(1+d+e), d+2e
|
|||
|
FMul
|
|||
|
FStP DWord Ptr [CS:BP+0Ch]
|
|||
|
FStP ST
|
|||
|
|
|||
|
M32MixHandlerNoFilter:
|
|||
|
|
|||
|
IF REGISTERED
|
|||
|
Test CH, 8
|
|||
|
JNZ M32MixHandler7
|
|||
|
|
|||
|
Cmp CS:Stereo, 0
|
|||
|
JE M32MixHandler6
|
|||
|
|
|||
|
Mov AL, [SI+37h] ; Final pan
|
|||
|
Cmp AL, 100
|
|||
|
JE M32MixHandler6
|
|||
|
|
|||
|
Mul Byte Ptr MixVolume
|
|||
|
Mul Word Ptr [SI+4Ah]
|
|||
|
SHRD AX, DX, 14
|
|||
|
|
|||
|
Mov [SI+0Ch], AX ; Store into right volume
|
|||
|
|
|||
|
Mov AL, 64 ; Do left volume
|
|||
|
Sub AL, [SI+37h] ; AL = 64-FinalPan
|
|||
|
Mul Byte Ptr MixVolume
|
|||
|
Mul Word Ptr [SI+4Ah] ; Final volume
|
|||
|
SHRD AX, DX, 14
|
|||
|
Mov [SI+0Eh], AX
|
|||
|
|
|||
|
; Now to decide on mixing method
|
|||
|
Cmp DWord Ptr [SI+0Ch], 0
|
|||
|
JNE M32MixHandler5
|
|||
|
ELSE
|
|||
|
Test CH, 8
|
|||
|
JZ M32MixHandler6
|
|||
|
|
|||
|
ENDIF
|
|||
|
|
|||
|
M32MixHandler7:
|
|||
|
; Zero volume
|
|||
|
Xor EAX, EAX
|
|||
|
Mov [SI+0Ch], EAX
|
|||
|
Cmp [SI+1Ch], EAX ; Last volumes = 0?
|
|||
|
JE M32MixHandler8
|
|||
|
|
|||
|
M32MixHandler5: ; Other.. (ie. panned)
|
|||
|
Mov AX, 30
|
|||
|
Jmp M32MixHandler8
|
|||
|
|
|||
|
M32MixHandler6: ; Surround sound
|
|||
|
Mov AX, [SI+4Ah]
|
|||
|
Mul MixVolume
|
|||
|
|
|||
|
IF REGISTERED
|
|||
|
ShRD AX, DX, 8
|
|||
|
Cmp CS:Stereo, 0
|
|||
|
JE M32MixHandlerHalfStereoVolume
|
|||
|
|
|||
|
ShR AX, 1
|
|||
|
|
|||
|
M32MixHandlerHalfStereoVolume:
|
|||
|
|
|||
|
ELSE
|
|||
|
|
|||
|
ShRD AX, DX, 9
|
|||
|
ENDIF
|
|||
|
|
|||
|
Mov [SI+0Ch], AX
|
|||
|
Mov [SI+0Eh], AX
|
|||
|
|
|||
|
Test AX, AX
|
|||
|
JNZ M32MixHandlerSurround1
|
|||
|
|
|||
|
Cmp DWord Ptr [SI+1Ch], 0
|
|||
|
JE M32MixHandler7
|
|||
|
|
|||
|
M32MixHandlerSurround1:
|
|||
|
Mov AX, 60
|
|||
|
|
|||
|
M32MixHandler8:
|
|||
|
Mov BL, [SI+0Ah]
|
|||
|
Test Byte Ptr [SI+18h], 2
|
|||
|
JZ M32MixHandler9
|
|||
|
|
|||
|
Add AX, 90
|
|||
|
|
|||
|
M32MixHandler9:
|
|||
|
Cmp BL, 8
|
|||
|
JB M32MixHandler11 ; No loop
|
|||
|
JE M32MixHandler10
|
|||
|
|
|||
|
Add AX, 10
|
|||
|
|
|||
|
M32MixHandler10:
|
|||
|
Add AX, 10
|
|||
|
|
|||
|
M32MixHandler11:
|
|||
|
Add AX, Offset WAVMixingTable
|
|||
|
Mov [SI+8], AX ; Offset...
|
|||
|
|
|||
|
M32MixHandler4:
|
|||
|
; Mixing routine call...
|
|||
|
Mov BX, [SI+8] ; BX = offset into
|
|||
|
Mov EAX, [CS:BX+2]
|
|||
|
Mov DWord Ptr PreMixFunction, EAX
|
|||
|
Mov EAX, [CS:BX+6]
|
|||
|
Mov DWord Ptr MixFunctionSeparateBackwards, EAX
|
|||
|
|
|||
|
Mov AX, RealBytesToMix
|
|||
|
Mov MixBlockSize, AX
|
|||
|
Mov MixBufferOffset, 80
|
|||
|
|
|||
|
Mov EAX, CURRENTPOSITION
|
|||
|
Mov OLDPOSITION, EAX
|
|||
|
|
|||
|
Cmp CS:StartNoRamp, 0
|
|||
|
JE NoStartRamp
|
|||
|
|
|||
|
Test CH, 1
|
|||
|
JZ NoStartRamp
|
|||
|
Cmp DWord Ptr [SI+4Ch], 0
|
|||
|
JNE NoStartRamp
|
|||
|
|
|||
|
Mov EAX, [SI+0Ch]
|
|||
|
Mov [SI+1Ch], EAX
|
|||
|
|
|||
|
NoStartRamp:
|
|||
|
|
|||
|
Mov ES, CS:MixSegment ; Get filter data
|
|||
|
Mov EAX, [CS:BP] ; Last sample 1
|
|||
|
Mov EDX, [CS:BP+4] ; Last sample 2
|
|||
|
Mov [ES:0], EAX
|
|||
|
Mov [ES:4], EDX
|
|||
|
Mov EAX, [CS:BP+8] ; Filtera
|
|||
|
Mov EDX, [CS:BP+0Ch] ; Filterb
|
|||
|
Mov [ES:10h], EAX
|
|||
|
Mov [ES:14h], EDX
|
|||
|
FLd1
|
|||
|
FSub DWord Ptr [ES:10h]
|
|||
|
FSub DWord Ptr [ES:14h]
|
|||
|
FStP DWord Ptr [ES:18h] ; Filterc
|
|||
|
|
|||
|
Push BP
|
|||
|
Call Word Ptr [CS:BX]
|
|||
|
Pop BP
|
|||
|
|
|||
|
Mov ES, CS:MixSegment ; Store filter data
|
|||
|
Mov EAX, [ES:0]
|
|||
|
Mov EDX, [ES:4]
|
|||
|
Mov [CS:BP], EAX
|
|||
|
Mov [CS:BP+4], EDX
|
|||
|
|
|||
|
And Word Ptr [SI], 0111100010001101b
|
|||
|
|
|||
|
Call IsSampleMode
|
|||
|
JNE M32MixHandlerEnd
|
|||
|
|
|||
|
Mov [CS:BP+16*64], EAX
|
|||
|
Mov [CS:BP+16*64+4], EDX
|
|||
|
Mov EAX, [CS:BP+8]
|
|||
|
Mov EDX, [CS:BP+0Ch]
|
|||
|
Mov [CS:BP+16*64+8], EAX
|
|||
|
Mov [CS:BP+16*64+0Ch], EDX
|
|||
|
|
|||
|
Jmp M32MixHandlerEnd
|
|||
|
|
|||
|
M32MixHandlerError:
|
|||
|
Mov Word Ptr [SI], 200h
|
|||
|
|
|||
|
Test Byte Ptr [SI+3Ah], 80h
|
|||
|
JNZ M32MixHandlerEnd
|
|||
|
|
|||
|
Mov BX, [SI+38h]
|
|||
|
And Byte Ptr [BX], Not 4 ; Turn off channel
|
|||
|
|
|||
|
M32MixHandlerEnd:
|
|||
|
Pop CX
|
|||
|
|
|||
|
M32MixHandlerEnd2:
|
|||
|
Sub SI, 128
|
|||
|
Dec CX
|
|||
|
JNZ M32MixHandler1
|
|||
|
|
|||
|
Push CS
|
|||
|
Pop DS
|
|||
|
Assume DS:Driver
|
|||
|
|
|||
|
Xor DI, DI
|
|||
|
Mov SI, Offset LastFilter
|
|||
|
Mov CX, 80/4
|
|||
|
Mov ES, MixSegment
|
|||
|
|
|||
|
Rep MovsD
|
|||
|
|
|||
|
; Now do filtering.
|
|||
|
FNInit
|
|||
|
Mov CX, RealBytesToMix
|
|||
|
|
|||
|
Push ES
|
|||
|
Pop DS
|
|||
|
Assume DS:Nothing
|
|||
|
|
|||
|
Mov SI, 80
|
|||
|
|
|||
|
OutputFilter1:
|
|||
|
FILD DWord Ptr [SI] ; Left sample
|
|||
|
FILD DWord Ptr [SI+4] ; R, L
|
|||
|
|
|||
|
FLd DWord Ptr [DS:20h] ; LB, R, L
|
|||
|
FMul ST, ST(2) ; L.LB, R, L
|
|||
|
FLd DWord Ptr [DS:20h] ; LB, L.LB, R, L
|
|||
|
FMul ST, ST(2) ; R.LB, L.LB, R, L
|
|||
|
FLd DWord Ptr [DS:0] ; OL, R.LB, L.LB, R, L
|
|||
|
FMul DWord Ptr [DS:24h] ; OL.LB, R.LB, L.LB, R, L
|
|||
|
FLd DWord Ptr [DS:4] ; OR, OL.LB, R.LB, L.LB, R, L
|
|||
|
FMul DWord Ptr [DS:24h] ; OR.LB, OL.LB, R.LB, L.LB, R, L
|
|||
|
|
|||
|
FXCh ; OL.LB, OR.LB, R.LB, L.LB, R, L
|
|||
|
FAddP ST(3), ST
|
|||
|
FAdd ; RLB, LLB, R, L
|
|||
|
|
|||
|
FLd DWord Ptr [DS:28h] ; MB, RLB, LLB, R, L
|
|||
|
FMul ST, ST(4) ; L.MB, RLB, LLB, R, L
|
|||
|
FLd DWord Ptr [DS:28h] ; MB, L.MB, RLB, LLB, R, L
|
|||
|
FMul ST, ST(4) ; R.MB, L.MB, RLB, LLB, R, L
|
|||
|
FLd DWord Ptr [DS:8] ; OL, R.MB, L.MB, RLB, LLB, R, L
|
|||
|
FMul DWord Ptr [DS:2Ch] ; OL.MB, R.MB, L.MB, RLB, LLB, R, L
|
|||
|
FLd DWord Ptr [DS:0Ch] ; OR, OL.MB, R.MB, L.MB, RLB, LLB, R, L
|
|||
|
FMul DWord Ptr [DS:2Ch] ; OR.MB, OL.MB, R.MB, L.MB, RLB, LLB, R, L
|
|||
|
|
|||
|
FXCh ; OL.MB, OR.MB, R.MB, L.MB, RLB, LLB, R, L
|
|||
|
FAddP ST(3), ST
|
|||
|
FAdd ; RMB, LMB, RLB, LLB, R, L
|
|||
|
FXCh ST(3) ; LLB, LMB, RLB, RMB, R, L
|
|||
|
FStP DWord Ptr [DS:0]
|
|||
|
FStP DWord Ptr [DS:8]
|
|||
|
FStP DWord Ptr [DS:4]
|
|||
|
FStP DWord Ptr [DS:0Ch]
|
|||
|
|
|||
|
FLd DWord Ptr [DS:30h]
|
|||
|
FMul ST, ST(2)
|
|||
|
FLd DWord Ptr [DS:30h]
|
|||
|
FMul ST, ST(2)
|
|||
|
FLd DWord Ptr [DS:10h]
|
|||
|
FMul DWord Ptr [DS:34h]
|
|||
|
FLd DWord Ptr [DS:14h]
|
|||
|
FMul DWord Ptr [DS:34h]
|
|||
|
|
|||
|
FXCh
|
|||
|
FAddP ST(3), ST
|
|||
|
FAdd
|
|||
|
|
|||
|
FLd DWord Ptr [DS:38h]
|
|||
|
FMul ST, ST(4)
|
|||
|
FLd DWord Ptr [DS:38h]
|
|||
|
FMul ST, ST(4)
|
|||
|
FLd DWord Ptr [DS:18h]
|
|||
|
FMul DWord Ptr [DS:3Ch]
|
|||
|
FLd DWord Ptr [DS:1Ch]
|
|||
|
FMul DWord Ptr [DS:3Ch]
|
|||
|
|
|||
|
FXCh
|
|||
|
FAddP ST(3), ST
|
|||
|
FAdd
|
|||
|
FXCh ST(3)
|
|||
|
FStP DWord Ptr [DS:10h]
|
|||
|
FStP DWord Ptr [DS:18h]
|
|||
|
FStP DWord Ptr [DS:14h]
|
|||
|
FStP DWord Ptr [DS:1Ch] ; R, L
|
|||
|
|
|||
|
; For each one, output value += ((band value) - (previous band value)) * Volume
|
|||
|
|
|||
|
FLd DWord Ptr [DS:18h]
|
|||
|
FSub DWord Ptr [DS:10h] ; L4, R, L
|
|||
|
FLd DWord Ptr [DS:1Ch]
|
|||
|
FSub DWord Ptr [DS:14h] ; R4, L4, R, L
|
|||
|
FLd DWord Ptr [DS:10h]
|
|||
|
FSub DWord Ptr [DS:8]
|
|||
|
FLd DWord Ptr [DS:14h]
|
|||
|
FSub DWord Ptr [DS:0Ch] ; R3, L3, R4, L4, R, L
|
|||
|
FLd DWord Ptr [DS:8]
|
|||
|
FSub DWord Ptr [DS:0]
|
|||
|
FLd DWord Ptr [DS:0Ch]
|
|||
|
FSub DWord Ptr [DS:4] ; R2, L2, R3, L3, R4, L4, R, L
|
|||
|
FXCh ST(5) ; L4, L2, R3, L3, R4, R2, R, L
|
|||
|
FMul DWord Ptr [DS:4Ch] ; L4V, L2, R3, L3, R4, R2, R, L
|
|||
|
FXCh ST(4) ; R4, L2, R3, L3, L4V, R2, R, L
|
|||
|
FMul DWord Ptr [DS:4Ch] ; R4V, L2, R3, L3, L4V, R2, R, L
|
|||
|
FXCh ST(3) ; L3, L2, R3, R4V, L4V, R2, R, L
|
|||
|
FMul DWord Ptr [DS:48h] ; L3V, L2, R3, R4V, L4V, R2, R, L
|
|||
|
FXCh ST(2) ; R3, L2, L3V, R4V, L4V, R2, R, L
|
|||
|
FMul DWord Ptr [DS:48h] ; R3V, L2, L3V, R4V, L4V, R2, R, L
|
|||
|
FXCh ; L2, R3V, L3V, R4V, L4V, R2, R, L
|
|||
|
FMul DWord Ptr [DS:44h] ; L2V, R3V, L3V, R4V, L4V, R2, R, L
|
|||
|
FXCh ST(5) ; R2, R3V, L3V, R4V, L4V, L2V, R, L
|
|||
|
FMul DWord Ptr [DS:44h] ; R2V, R3V, L3V, R4V, L4V, L2V, R, L
|
|||
|
FXCh ST(4) ; L4V, R3V, L3V, R4V, R2V, L2V, R, L
|
|||
|
FAddP ST(7), ST ; R3V, L3V, R4V, R2V, L2V, R, L
|
|||
|
FAddP ST(5), ST ; L3V, R4V, R2V, L2V, R, L
|
|||
|
FAddP ST(3), ST
|
|||
|
FAdd
|
|||
|
FLd DWord Ptr [DS:0]
|
|||
|
FMul DWord Ptr [DS:40h] ; L1V, RV, LV, R, L
|
|||
|
FLd DWord Ptr [DS:4] ;
|
|||
|
FMul DWord Ptr [DS:40h] ; R1V, L1V, RV, LV, R, L
|
|||
|
FXCh ST(2) ; RV, L1V, R1V, LV, R, L
|
|||
|
FAddP ST(4), ST ; L1V, R1V, LV, R, L
|
|||
|
FAddP ST(4), ST ; R1V, LV, R, L
|
|||
|
FAddP ST(2), ST
|
|||
|
FAddP ST(2), ST
|
|||
|
|
|||
|
FIStP DWord Ptr [SI+4]
|
|||
|
FIStP DWord Ptr [SI]
|
|||
|
|
|||
|
Add SI, 8
|
|||
|
Dec CX
|
|||
|
JNZ OutputFilter1
|
|||
|
|
|||
|
; Transfer contents out
|
|||
|
Push CS
|
|||
|
Pop ES
|
|||
|
|
|||
|
Mov DI, Offset LastFilter
|
|||
|
Xor SI, SI
|
|||
|
Mov CX, 32/4
|
|||
|
|
|||
|
Rep MovsD
|
|||
|
; Finished output filtering!
|
|||
|
|
|||
|
Ret
|
|||
|
|
|||
|
EndP M32MixHandler
|
|||
|
|
|||
|
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|