impulsetracker/SoundDrivers/EQUALIZE.INC

162 lines
6.7 KiB
Plaintext
Raw Permalink Normal View History

; Do output filtering
; First copy old contents across
; Assumes destination is MixSegment:0
; data order is lastvalues, coefficients, volumes
Push CS
Pop DS
Assume DS:Driver
Xor DI, DI
Mov SI, Offset LastFilter
Mov EAX, [SI+40h]
Mov EBX, [SI+44h]
Mov ECX, [SI+48h]
Mov EDX, [SI+4Ch]
Or EAX, EBX
Or ECX, EDX
Or EAX, ECX
JZ NoEqualize
Mov CX, 80/4
Mov ES, MixSegment
Rep MovsD
; Now do filtering.
FNInit
Mov CX, BytesToMix
Push ES
Pop DS
Assume DS:Nothing
Mov SI, DMABUFFERLENGTH*2+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!
NoEqualize: