
FourierBufferStart              DW      0

FourierBufferInputStart         DW      0
FourierBufferInputFractional    DW      0
FourierBufferStepOffset         DW      1
FourierBufferStepFractional     DW      0

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc    UpdateFourierBuffer

        PushAD
        Push    DS
        Push    ES

        Push    CS
        Pop     DS
                Assume DS:Driver

        Xor     EBX, EBX
        Xor     ESI, ESI

        Mov     BX, MixTransferOffset
        Mov     DI, FourierBufferStart
        ShR     BX, 3
        Mov     CX, BytesToMix
        Mov     SI, FourierBufferInputStart
        Add     SI, BX
        Add     CX, BX

        Mov     BP, FourierBufferInputFractional
        Mov     DX, FourierBufferStepOffset
        Mov     BX, FourierBufferStepFractional

        Mov     ES, FourierSegment
        Mov     DS, MixSegment

                Assume DS:Nothing

UpdateFourierBuffer1:
        Mov     EAX, [ESI*8]
        Add     EAX, [ESI*8+4]
        SAR     EAX, 13
        Cmp     EAX, 7FFFh
        JG      UpdateFourierBuffer3
        Cmp     EAX, -8000h
        JL      UpdateFourierBuffer4

UpdateFourierBuffer2:
        StosW

        Add     BP, BX
        AdC     SI, DX
        And     DI, (FOURIERBUFFERLENGTH*2)-1

; Cmp past end of buffer?
        Cmp     SI, CX
        JB      UpdateFourierBuffer1

        Sub     SI, CX
        Mov     FourierBufferStart, DI
        Mov     FourierBufferInputFractional, BP
        Mov     FourierBufferInputStart, SI

        Pop     ES
        Pop     DS
        PopAD

        Ret

UpdateFourierBuffer3:
        Mov     AX, 7FFFh
        Jmp     UpdateFourierBuffer2

UpdateFourierBuffer4:
        Mov     AX, 8000h
        Jmp     UpdateFourierBuffer2

EndP    UpdateFourierBuffer

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

