; Different mixing routines required: ; Left } shared ; Right } ; Central ; Surround ; Panned ; Each requires 8 bit and 16 bit ; Single output - for Mono, pure left/pure right ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ GetUltra8BitWaveform Macro ; Puts waveform value in EBX, range -32k->+32k 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 EndM GetUltra16BitWaveform Macro ; Puts waveform value in EBX, range -32k->+32k 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 EndM ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ MUltraMix8ISingle Macro Index MUltraMix8ISingle&Index&: GetUltra8BitWaveForm MUltraMix8ISingleVolume&Index& EQU $+3 IMul EAX, EBX, 8000h Add ERROR, DELTAERROR ;; 1 AdC DI, DELTAOFFSET ;; 1 Sub [SI+(Index-3)*8], EAX ;; 3 EndM MUltraMix8ICentral Macro Index MUltraMix8ICentral&Index&: GetUltra8BitWaveForm MUltraMix8ICentralVolume&Index& EQU $+3 IMul EAX, EBX, 8000h Add ERROR, DELTAERROR ;; 1 AdC DI, DELTAOFFSET ;; 1 Sub [SI+(Index-3)*8], EAX ;; 4 Sub [SI+(Index-3)*8+4], EAX ;; 4 EndM MUltraMix8ISurround Macro Index MUltraMix8ISurround&Index&: GetUltra8BitWaveForm MUltraMix8ISurroundVolume&Index& EQU $+3 IMul EAX, EBX, 8000h Add ERROR, DELTAERROR ;; 1 AdC DI, DELTAOFFSET ;; 1 Sub [SI+(Index-3)*8], EAX ;; 4 Add [SI+(Index-3)*8+4], EAX ;; 4 EndM ; Panned output MUltraMix8IPanned Macro Index MUltraMix8IPanned&Index&: Get32Bit8WaveForm MUltraMix8ILeftVolume&Index& EQU $+3 IMul EAX, EBX, 8000h MUltraMix8IRightVolume&Index& EQU $+3 IMul EBX, EBX, 8000h Sub [SI+(Index-3)*8], EAX ;; 4 Sub [SI+(Index-3)*8+4], EBX ;; 4 Add ERROR, DELTAERROR ;; 1 AdC DI, DELTAOFFSET ;; 1 EndM MUltraMix16ISingle Macro Index MUltraMix16ISingle&Index&: GetUltra16BitWaveForm MUltraMix16ISingleVolume&Index& EQU $+3 IMul EAX, EBX, 8000h Add ERROR, DELTAERROR ;; 1 AdC DI, DELTAOFFSET ;; 1 Sub [SI+(Index-3)*8], EAX ;; 3 EndM MUltraMix16ICentral Macro Index MUltraMix16ICentral&Index&: GetUltra16BitWaveForm MUltraMix16ICentralVolume&Index& EQU $+3 IMul EAX, EBX, 8000h Add ERROR, DELTAERROR ;; 1 AdC DI, DELTAOFFSET ;; 1 Sub [SI+(Index-3)*8], EAX ;; 3 Sub [SI+(Index-3)*8+4], EAX ;; 3 EndM MUltraMix16ISurround Macro Index MUltraMix16ISurround&Index&: GetUltra16BitWaveForm MUltraMix16ISurroundVolume&Index& EQU $+3 IMul EAX, EBX, 8000h Add ERROR, DELTAERROR ;; 1 AdC DI, DELTAOFFSET ;; 1 Sub [SI+(Index-3)*8], EAX ;; 3 Add [SI+(Index-3)*8+4], EAX ;; 3 EndM ; Panned output MUltraMix16IPanned Macro Index MUltraMix16IPanned&Index&: GetUltra16BitWaveForm MUltraMix16ILeftVolume&Index& EQU $+3 IMul EAX, EBX, 8000h MUltraMix16IRightVolume&Index& EQU $+3 IMul EBX, EBX, 8000h Sub [SI+(Index-3)*8], EAX Sub [SI+(Index-3)*8+4], EBX Add ERROR, DELTAERROR AdC DI, DELTAOFFSET EndM ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ MixUltraSingle8BitIOffsetTable Label Word IndexCounter = 3 MUltraMix8ISingleOffset Macro Index DW Offset MUltraMix8ISingle&Index& EndM REPT 4 MUltraMix8ISingleOffset %IndexCounter IndexCounter = IndexCounter-1 EndM Proc MixUltraSingle8BitI ; AX = count... ; Number of times to loop = (Count-1) / 16 Dec AX Mov BX, AX And AX, 3 ShR BX, 2 Add AX, AX Inc BX Mov LoopCounter, BX Mov BX, AX ShL AX, RESOLUTIONSHIFT-1 Add SI, AX Jmp [CS:MixUltraSingle8BitIOffsetTable+BX] MUltraMix8ISingle 0 MUltraMix8ISingle 1 MUltraMix8ISingle 2 MUltraMix8ISingle 3 Add SI, 4*MIXRESOLUTION/4 Dec LoopCounter JNZ MUltraMix8ISingle0 Ret EndP MixUltraSingle8BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc PreMixUltraLeft8BitI Mov AX, [SI+0Eh] PreMixUltraLeft8BitI1: IndexCounter = 0 PreMixUltraSingleMacro Macro Index Mov Word Ptr [CS:MUltraMix8ISingleVolume&Index&], AX EndM REPT 4 PreMixUltraSingleMacro %IndexCounter IndexCounter = IndexCounter+1 EndM Ret EndP PreMixUltraLeft8BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc PreMixUltraRight8BitI Add MixBufferOffset, MixResolution/8 Mov AX, [SI+0Ch] Jmp PreMixUltraLeft8BitI1 EndP PreMixUltraRight8BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ MixUltraCentral8BitIOffsetTable Label Word IndexCounter = 3 MUltraMix8ICentralOffset Macro Index DW Offset MUltraMix8ICentral&Index& EndM REPT 4 MUltraMix8ICentralOffset %IndexCounter IndexCounter = IndexCounter-1 EndM Proc MixUltraCentral8BitI Dec AX Mov BX, AX And AX, 3 ShR BX, 2 Add AX, AX Inc BX Mov LoopCounter, BX Mov BX, AX ShL AX, RESOLUTIONSHIFT-1 Add SI, AX Jmp [CS:MixUltraCentral8BitIOffsetTable+BX] MUltraMix8ICentral 0 MUltraMix8ICentral 1 MUltraMix8ICentral 2 MUltraMix8ICentral 3 Add SI, 4*MIXRESOLUTION/4 Dec LoopCounter JNZ MUltraMix8ICentral0 Ret EndP MixUltraCentral8BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc PreMixUltraCentral8BitI Mov AX, [SI+0Eh] IndexCounter = 0 PreMixUltraCentralMacro Macro Index Mov Word Ptr [CS:MUltraMix8ICentralVolume&Index&], AX EndM REPT 4 PreMixUltraCentralMacro %IndexCounter IndexCounter = IndexCounter+1 EndM Ret EndP PreMixUltraCentral8BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ MixUltraSurround8BitIOffsetTable Label Word IndexCounter = 3 MUltraMix8ISurroundOffset Macro Index DW Offset MUltraMix8ISurround&Index& EndM REPT 4 MUltraMix8ISurroundOffset %IndexCounter IndexCounter = IndexCounter-1 EndM Proc MixUltraSurround8BitI Dec AX Mov BX, AX And AX, 3 ShR BX, 2 Add AX, AX Inc BX Mov LoopCounter, BX Mov BX, AX ShL AX, RESOLUTIONSHIFT-1 Add SI, AX Jmp [CS:MixUltraSurround8BitIOffsetTable+BX] MUltraMix8ISurround 0 MUltraMix8ISurround 1 MUltraMix8ISurround 2 MUltraMix8ISurround 3 Add SI, 4*MIXRESOLUTION/4 Dec LoopCounter JNZ MUltraMix8ISurround0 Ret EndP MixUltraSurround8BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc PreMixUltraSurround8BitI Mov AX, [SI+0Eh] IndexCounter = 0 PreMixUltraSurroundMacro Macro Index Mov Word Ptr [CS:MUltraMix8ISurroundVolume&Index&], AX EndM REPT 4 PreMixUltraSurroundMacro %IndexCounter IndexCounter = IndexCounter+1 EndM Ret EndP PreMixUltraSurround8BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ MixUltraPanned8BitIOffsetTable Label Word IndexCounter = 3 MUltraMix8IPannedOffset Macro Index DW Offset MUltraMix8IPanned&Index& EndM REPT 4 MUltraMix8IPannedOffset %IndexCounter IndexCounter = IndexCounter-1 EndM Proc MixUltraPanned8BitI Dec AX Mov BX, AX And AX, 3 ShR BX, 2 Add AX, AX Inc BX Mov LoopCounter, BX Mov BX, AX ShL AX, RESOLUTIONSHIFT-1 Add SI, AX Jmp [CS:MixUltraPanned8BitIOffsetTable+BX] MUltraMix8IPanned 0 MUltraMix8IPanned 1 MUltraMix8IPanned 2 MUltraMix8IPanned 3 Add SI, 4*MIXRESOLUTION/4 Dec LoopCounter JNZ MUltraMix8IPanned0 Ret EndP MixUltraPanned8BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc PreMixUltraPanned8BitI Mov AX, [SI+0Eh] ; Left Mov BX, [SI+0Ch] ; Right IndexCounter = 0 PreMixUltraPannedMacro Macro Index Mov Word Ptr [CS:MUltraMix8ILeftVolume&Index&], AX Mov Word Ptr [CS:MUltraMix8IRightVolume&Index&], BX EndM REPT 4 PreMixUltraPannedMacro %IndexCounter IndexCounter = IndexCounter+1 EndM Ret EndP PreMixUltraPanned8BitI ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ MixUltraSingle16BitIOffsetTable Label Word IndexCounter = 3 MUltraMix16ISingleOffset Macro Index DW Offset MUltraMix16ISingle&Index& EndM REPT 4 MUltraMix16ISingleOffset %IndexCounter IndexCounter = IndexCounter-1 EndM Proc MixUltraSingle16BitI ; AX = count... ; Number of times to loop = (Count-1) / 16 Dec AX Mov BX, AX And AX, 3 ShR BX, 2 Add AX, AX Inc BX Mov LoopCounter, BX Mov BX, AX ShL AX, RESOLUTIONSHIFT-1 Add SI, AX Jmp [CS:MixUltraSingle16BitIOffsetTable+BX] MUltraMix16ISingle 0 MUltraMix16ISingle 1 MUltraMix16ISingle 2 MUltraMix16ISingle 3 Add SI, 4*MIXRESOLUTION/4 Dec LoopCounter JNZ MUltraMix16ISingle0 Ret EndP MixUltraSingle16BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc PreMixUltraLeft16BitI Mov AX, [SI+0Eh] ; Left PreMixUltraLeft16BitI1: IndexCounter = 0 PreMixUltraSingleMacro Macro Index Mov Word Ptr [CS:MUltraMix16ISingleVolume&Index&], AX EndM REPT 4 PreMixUltraSingleMacro %IndexCounter IndexCounter = IndexCounter+1 EndM Ret EndP PreMixUltraLeft16BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc PreMixUltraRight16BitI Add MixBufferOffset, MixResolution/8 Mov AX, [SI+0Ch] Jmp PreMixUltraLeft16BitI1 Ret EndP PreMixUltraRight16BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ MixUltraCentral16BitIOffsetTable Label Word IndexCounter = 3 MUltraMix16ICentralOffset Macro Index DW Offset MUltraMix16ICentral&Index& EndM REPT 4 MUltraMix16ICentralOffset %IndexCounter IndexCounter = IndexCounter-1 EndM Proc MixUltraCentral16BitI Dec AX Mov BX, AX And AX, 3 ShR BX, 2 Add AX, AX Inc BX Mov LoopCounter, BX Mov BX, AX ShL AX, RESOLUTIONSHIFT-1 Add SI, AX Jmp [CS:MixUltraCentral16BitIOffsetTable+BX] MUltraMix16ICentral 0 MUltraMix16ICentral 1 MUltraMix16ICentral 2 MUltraMix16ICentral 3 Add SI, 4*MIXRESOLUTION/4 Dec LoopCounter JNZ MUltraMix16ICentral0 Ret EndP MixUltraCentral16BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc PreMixUltraCentral16BitI Mov AX, [SI+0Eh] IndexCounter = 0 PreMixUltraCentralMacro Macro Index Mov Word Ptr [CS:MUltraMix16ICentralVolume&Index&], AX EndM REPT 4 PreMixUltraCentralMacro %IndexCounter IndexCounter = IndexCounter+1 EndM Ret EndP PreMixUltraCentral16BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ MixUltraSurround16BitIOffsetTable Label Word IndexCounter = 3 MUltraMix16ISurroundOffset Macro Index DW Offset MUltraMix16ISurround&Index& EndM REPT 4 MUltraMix16ISurroundOffset %IndexCounter IndexCounter = IndexCounter-1 EndM Proc MixUltraSurround16BitI Dec AX Mov BX, AX And AX, 3 ShR BX, 2 Add AX, AX Inc BX Mov LoopCounter, BX Mov BX, AX ShL AX, RESOLUTIONSHIFT-1 Add SI, AX Jmp [CS:MixUltraSurround16BitIOffsetTable+BX] MUltraMix16ISurround 0 MUltraMix16ISurround 1 MUltraMix16ISurround 2 MUltraMix16ISurround 3 Add SI, 4*MIXRESOLUTION/4 Dec LoopCounter JNZ MUltraMix16ISurround0 Ret EndP MixUltraSurround16BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc PreMixUltraSurround16BitI Mov AX, [SI+0Eh] IndexCounter = 0 PreMixUltraSurroundMacro Macro Index Mov Word Ptr [CS:MUltraMix16ISurroundVolume&Index&], AX EndM REPT 4 PreMixUltraSurroundMacro %IndexCounter IndexCounter = IndexCounter+1 EndM Ret EndP PreMixUltraSurround16BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ MixUltraPanned16BitIOffsetTable Label Word IndexCounter = 3 MUltraMix16IPannedOffset Macro Index DW Offset MUltraMix16IPanned&Index& EndM REPT 4 MUltraMix16IPannedOffset %IndexCounter IndexCounter = IndexCounter-1 EndM Proc MixUltraPanned16BitI Dec AX Mov BX, AX And AX, 3 ShR BX, 2 Add AX, AX Inc BX Mov LoopCounter, BX Mov BX, AX ShL AX, RESOLUTIONSHIFT-1 Add SI, AX Jmp [CS:MixUltraPanned16BitIOffsetTable+BX] PanMUltraBit16ILoop: MUltraMix16IPanned 0 MUltraMix16IPanned 1 MUltraMix16IPanned 2 MUltraMix16IPanned 3 Add SI, 4*MIXRESOLUTION/4 Dec LoopCounter JNZ PanMUltraBit16ILoop Ret EndP MixUltraPanned16BitI ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Proc PreMixUltraPanned16BitI Mov AX, [SI+0Eh] ; Left Mov BX, [SI+0Ch] ; Right IndexCounter = 0 PreMixUltraPannedMacro Macro Index Mov Word Ptr [CS:MUltraMix16ILeftVolume&Index&], AX Mov Word Ptr [CS:MUltraMix16IRightVolume&Index&], BX EndM REPT 4 PreMixUltraPannedMacro %IndexCounter IndexCounter = IndexCounter+1 EndM Ret EndP PreMixUltraPanned16BitI