; change sb bufffer 32 bit so it can hold 125/32*441 * 8 bytes = about 16k
; mix over chunk of bytes
; ESI - pointer to channel info
; ECX - number of samples to mix
; EDI - pointer where to mix
MixOverS           PROC  NEAR
                   MOVZX EAX,[ESI.CI_Panning] ; 0..f
                   MOVZX EBX,[ESI.CI_MixVolume] ; 0..40
                   MUL   EBX ;0..3C0
                   MOV   EBX,255
                   MUL   EBX
                   MOV   EBX,0FH*40H
                   DIV   EBX ; 0..255
                   SHL   EAX,8+2
                   ADD   EAX,MulTable
                   MOV   @@MulTableL,EAX

                   MOVZX EAX,[ESI.CI_Panning] ; 0..f
                   XOR   AL,0FH
                   MOVZX EBX,[ESI.CI_MixVolume] ; 0..40
                   MUL   EBX ;0..3C0
                   MOV   EBX,255
                   MUL   EBX
                   MOV   EBX,0FH*40H
                   DIV   EBX ; 0..255
                   SHL   EAX,8+2
                   ADD   EAX,MulTable
                   MOV   @@MulTableR,EAX

                   MOV   EBP,[ESI.CI_Pos]
                   CMP   EBP,[ESI.CI_End]
                   JNZ   @@NoEnd
                   CMP   [ESI.CI_RepLen],2
                   JBE   @@druut

@@NoEnd:
                   XOR   EDX,EDX
                   MOV   DH,[ESI.CI_MixVolume]
                   MOV   BL,[ESI.CI_Fraction]
                   MOV   BH,[ESI.CI_AfterDivF]

@@MixLp:
                   MOV   DL,DS:[EBP]
                   ; MOV EAX,MulTableL[EDX*4]
                   DB    08BH,004H,095H
@@MulTableL        DD    ? ; pointer to volume table
                   ADD   [EDI],EAX
                   ; MOV EAX,MulTableR[EDX*4]
                   DB    08BH,004H,095H
@@MulTableR        DD    ? ; pointer to volume table
                   ADD   BL,BH
                   ADD   [EDI+4],EAX
                   ADC   EBP,[ESI.CI_AfterDivM]
                   ADD   EDI,8
                   CMP   EBP,[ESI.CI_End]
                   JA    @@HeyLoop
@@LoopIt:          DEC   ECX
                   JNZ   @@MixLp
                   JMP   @@SavePos

@@HeyLoop:         CMP   [ESI.CI_RepLen],2
                   JBE   @@NoLoop
                   MOV   EBP,[ESI.CI_Repeat]
                   JMP   @@LoopIt

@@NoLoop:          MOV   EBP,[ESI.CI_End]
@@SavePos:         MOV   [ESI.CI_Pos],EBP
                   MOV   [ESI.CI_Fraction],BL
@@druut:           MOVZX EAX,[ESI.CI_Panning]
                   SHL   EAX,2
                   SUB   PanTable,EAX
                   RET
MixOverS           ENDP

ModifyMulTable     PROC  NEAR
                   MOV   EAX,MulTable
                   CALL  free
                   MOV   EAX,10000H*4
                   CALL  malloc
                   MOV   MulTable,EAX
                   MOV   ESI,EAX
                   MOV   ECX,10000H
@@InitLp:          MOV   EBX,10000H
                   SUB   EBX,ECX
                   MOVSX EAX,BL
                   MOVZX EBX,BH
                   IMUL  EBX         ; 16 bit
                   SHL   EAX,16      ; 32 bit
                   CDQ
                   IDIV  MixingChannels
                   MOV   [ESI],EAX
                   ADD   ESI,4
                   LOOP  @@InitLp
                   RET
ModifyMulTable     ENDP

