0,0 → 1,1290 |
; |
; This file is part of the Infinity sound library. |
; (C) copyright Serge 2006 |
; email: infinity_sound@mail.ru |
; |
; This program is free software; you can redistribute it and/or modify |
; it under the terms of the GNU General Public License as published by |
; the Free Software Foundation; either version 2 of the License, or |
; (at your option) any later version. |
; |
; This program is distributed in the hope that it will be useful, |
; but WITHOUT ANY WARRANTY; without even the implied warranty of |
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
; GNU General Public License for more details. |
|
align 4 |
proc new_mix stdcall, output:dword |
locals |
mixCounter dd ? |
mixIndex dd ? |
streamIndex dd ? |
inputCount dd ? |
main_count dd ? |
blockCount dd ? |
mix_out dd ? |
endl |
|
call prepare_playlist |
|
cmp [play_count], 0 |
je .exit |
; mov eax, fpu_state |
; fnsave [eax] |
call [FpuSave] |
emms |
mov [main_count], 32; |
|
.l00: |
mov [mix_buff_map], 0x0000FFFF; |
xor eax, eax |
mov [mixCounter], eax |
mov [mixIndex],eax |
mov [streamIndex], eax; |
mov ebx, [play_count] |
mov [inputCount], ebx |
.l0: |
mov ecx, 4 |
.l1: |
mov ebx, [streamIndex] |
mov esi, [play_list+ebx*4] |
mov eax, [esi+STREAM.work_read] |
add [esi+STREAM.work_read], 512 |
|
mov ebx, [mixIndex] |
mov [mix_input+ebx*4], eax |
inc [mixCounter] |
inc [mixIndex] |
inc [streamIndex] |
dec [inputCount] |
jz .m2 |
|
dec ecx |
jnz .l1 |
|
cmp [mixCounter], 4 |
jnz .m2 |
|
stdcall mix_4_1, [mix_input],[mix_input+4],[mix_input+8],[mix_input+12] |
sub [mixIndex],4 |
mov ebx, [mixIndex] |
mov [mix_input+ebx*4], eax |
inc [mixIndex] |
mov [mixCounter], 0 |
|
cmp [inputCount], 0 |
jnz .l0 |
.m2: |
cmp [mixIndex], 1 |
jne @f |
stdcall copy_mem, [output], [mix_input] |
jmp .m3 |
@@: |
cmp [mixIndex], 2 |
jne @f |
stdcall mix_2_1, [output], [mix_input], [mix_input+4] |
jmp .m3 |
@@: |
cmp [mixIndex], 3 |
jne @f |
stdcall mix_3_1, [output],[mix_input],[mix_input+4],[mix_input+8] |
jmp .m3 |
@@: |
stdcall final_mix, [output],[mix_input],[mix_input+4],[mix_input+8], [mix_input+12] |
.m3: |
add [output],512 |
|
sub [main_count], 1 |
jnz .l00 |
|
call update_stream |
call [FpuRestore] |
ret |
.exit: |
mov edi, [output] |
mov ecx, 0x1000 |
xor eax, eax |
cld |
rep stosd |
ret |
endp |
|
|
align 4 |
proc update_stream |
locals |
stream_index dd 0 |
endl |
|
mov [stream_index], 0 |
.l1: |
mov edx, [stream_index] |
mov esi, [play_list+edx*4] |
|
mov eax, [esi+STREAM.work_read] |
cmp eax, [esi+STREAM.work_top] |
jb @f |
mov eax, [esi+STREAM.work_buff] |
@@: |
mov [esi+STREAM.work_read], eax |
|
cmp [esi+STREAM.format], PCM_2_16_48 |
je .copy |
|
sub [esi+STREAM.work_count], 16384 |
|
cmp [esi+STREAM.work_count], 32768 |
ja @f |
|
stdcall refill, esi |
@@: |
inc [stream_index] |
dec [play_count] |
jnz .l1 |
|
ret |
.copy: |
mov ebx, esi |
mov edi, [ebx+STREAM.work_write] |
cmp edi, [ebx+STREAM.work_top] |
jb @f |
mov edi, [ebx+STREAM.work_buff] |
mov [ebx+STREAM.work_write], edi |
@@: |
mov esi, [ebx+STREAM.curr_seg] |
mov ecx, 16384/4 |
cld |
rep movsd |
|
mov [ebx+STREAM.work_write], edi |
|
cmp esi, [ebx+STREAM.limit] |
jb @f |
|
mov esi, [ebx+STREAM.base] |
@@: |
mov [ebx+STREAM.curr_seg], esi |
|
xor ecx, ecx |
cmp esi, [ebx+STREAM.notify_off2] |
je @f |
|
mov ecx,0x8000 |
cmp esi, [ebx+STREAM.notify_off1] |
je @f |
|
inc [stream_index] |
dec [play_count] |
jnz .l1 |
|
ret |
@@: |
mov eax, [ebx+STREAM.notify_task] |
call pid_to_slot |
test eax, eax |
jnz @f |
not eax |
mov [ebx+STREAM.notify_task], eax ;-1 |
jmp .l_end |
@@: |
shl eax, 8 |
mov [eax+PROC_BASE+32],ecx |
or dword [eax+PROC_BASE+0xA8],EVENT_NOTIFY |
.l_end: |
inc [stream_index] |
dec [play_count] |
jnz .l1 |
ret |
endp |
|
align 4 |
proc refill stdcall, str:dword |
|
; if DEBUG |
; mov esi, msgUser |
; call [SysMsgBoardStr] |
; end if |
|
mov ebx, [str] |
|
mov ecx, [ebx+STREAM.work_write] |
cmp ecx, [ebx+STREAM.work_top] |
jbe .m2 |
mov esi, [ebx+STREAM.work_top] |
sub ecx, esi |
mov edi, [ebx+STREAM.work_buff] |
shr ecx, 2 |
rep movsd ;call memcpy |
|
mov [ebx+STREAM.work_write], edi |
.m2: |
mov esi, [ebx+STREAM.curr_seg] |
mov edi, [ebx+STREAM.work_write] |
mov edx, [ebx+STREAM.r_buff] |
|
stdcall [ebx+STREAM.resample], edi, esi, edx,\ |
[ebx+STREAM.r_dt],[ebx+STREAM.r_size],[ebx+STREAM.r_end] |
|
mov ebx, [str] |
|
add [ebx+STREAM.work_count], eax; |
add [ebx+STREAM.work_write], eax; |
|
mov eax, [ebx+STREAM.curr_seg] |
add eax, [ebx+STREAM.r_size] |
cmp eax, [ebx+STREAM.limit] |
jb @f |
mov eax, [ebx+STREAM.base] |
@@: |
mov [ebx+STREAM.curr_seg], eax |
|
xor ecx, ecx |
cmp eax, [ebx+STREAM.notify_off2] |
je @f |
|
mov ecx,0x8000 |
cmp eax, [ebx+STREAM.notify_off1] |
je @f |
|
ret |
@@: |
mov eax, [ebx+STREAM.notify_task] |
call pid_to_slot |
test eax, eax |
jnz @f |
not eax |
mov [ebx+STREAM.notify_task], eax ;-1 |
ret |
@@: |
shl eax, 8 |
mov [eax+PROC_BASE+32],ecx |
or dword [eax+PROC_BASE+0xA8],EVENT_NOTIFY |
ret |
endp |
|
align 4 |
proc resample_1 stdcall, dest:dword,src:dword,r_buff:dword,\ |
r_dt:dword, r_size:dword,r_end:dword |
|
mov edi, [r_buff] |
add edi, 32*2 |
mov esi, [src] |
mov ecx, [r_size] |
shr ecx, 2 |
rep movsd |
|
mov edi, [dest] |
mov edx, [r_buff] |
mov eax, 16 |
|
align 16 |
.l1: |
mov ecx, eax |
mov esi, eax |
and ecx, 0x7FFF |
shr esi, 15 |
lea esi, [edx+esi*2] |
|
movsx ebp, word [esi] |
movsx esi, word [esi+2] |
mov ebx, 32768 |
imul esi, ecx |
sub ebx, ecx |
imul ebx, ebp |
lea ecx, [ebx+esi+16384] |
sar ecx, 15 |
cmp ecx, 32767 ; 00007fffH |
jle @f |
mov ecx, 32767 ; 00007fffH |
jmp .write |
@@: |
cmp ecx, -32768 ; ffff8000H |
jge .write |
mov ecx, -32768 ; ffff8000H |
.write: |
mov ebx, ecx |
shl ebx, 16 |
mov bx, cx |
mov [edi], ebx |
add edi, 4 |
|
add eax, [esp+20] ;rdt |
cmp eax, [esp+28] ;r_end |
jb .l1 |
|
mov ebp, esp |
|
mov esi, [src] |
add esi, [r_size] |
sub esi, 32*2 |
mov edx, [r_buff] |
mov ecx, 16 |
@@: |
mov ebx, [esi] |
mov [edx], ebx |
add esi, 4 |
add edx, 4 |
dec ecx |
jnz @B |
|
sub edi, [dest] |
mov eax, edi |
ret |
endp |
|
align 4 |
proc resample_18 stdcall, dest:dword,src:dword,r_buff:dword,\ |
r_dt:dword, r_size:dword,r_end:dword |
|
mov edi, [r_buff] |
add edi, 32 |
mov esi, [src] |
mov ecx, [r_size] |
shr ecx, 2 |
rep movsd |
|
mov edi, [dest] |
mov edx, [r_buff] |
mov esi, 16 |
|
align 16 |
.l1: |
mov ecx, esi |
mov eax, esi |
and ecx, 0x7FFF |
shr eax, 15 |
lea eax, [edx+eax] |
|
mov bx, word [eax] |
sub bh, 0x80 |
sub bl, 0x80 |
movsx eax, bh |
shl eax,8 |
movsx ebp, bl |
shl ebp,8 |
mov ebx, 32768 |
imul eax, ecx |
sub ebx, ecx |
imul ebx, ebp |
lea ecx, [ebx+eax+16384] |
sar ecx, 15 |
cmp ecx, 32767 ; 00007fffH |
jle @f |
mov ecx, 32767 ; 00007fffH |
jmp .write |
@@: |
cmp ecx, -32768 ; ffff8000H |
jge .write |
mov ecx, -32768 ; ffff8000H |
.write: |
mov ebx, ecx |
shl ebx, 16 |
mov bx, cx |
mov [edi], ebx |
add edi, 4 |
|
add esi, [esp+20] ;rdt |
cmp esi, [esp+28] ;r_end |
jb .l1 |
|
mov ebp, esp |
|
mov esi, [src] |
add esi, [r_size] |
sub esi, 32 |
mov edx, [r_buff] |
mov ecx, 8 |
@@: |
mov ebx, [esi] |
mov [edx], ebx |
add esi, 4 |
add edx, 4 |
dec ecx |
jnz @B |
|
sub edi, [dest] |
mov eax, edi |
ret |
endp |
|
align 4 |
proc copy_stream stdcall, dest:dword,src:dword,r_buff:dword,\ |
r_dt:dword, r_size:dword,r_end:dword |
|
mov ecx, [r_size] |
mov eax, ecx |
shr ecx, 2 |
mov esi, [src] |
mov edi, [dest] |
rep movsd |
mov eax, 16384 |
ret |
endp |
|
align 4 |
proc resample_2 stdcall, dest:dword,src:dword,r_buff:dword,\ |
r_dt:dword, r_size:dword,r_end:dword |
|
mov edi, [r_buff] |
add edi, 32*4 |
mov esi, [src] |
mov ecx, [r_size] |
shr ecx, 2 |
rep movsd ;call memcpy |
|
mov edx, [r_buff] |
mov edi, [dest] |
mov ebx, [r_dt] |
mov eax, 16 |
emms |
|
align 16 |
.l1: |
mov ecx, eax |
mov esi, eax |
and ecx, 0x7FFF |
shr esi, 15 |
lea esi, [edx+esi*4] |
|
movq mm0, [esi] |
movq mm1, mm0 |
|
movd mm2, ecx |
punpcklwd mm2, mm2 |
movq mm3, qword [m7] ; // 0x8000 |
|
psubw mm3, mm2 ; // 0x8000 - iconst |
punpckldq mm3, mm2 |
|
pmulhw mm0, mm3 |
pmullw mm1, mm3 |
|
movq mm4, mm1 |
punpcklwd mm1, mm0 |
punpckhwd mm4, mm0 |
paddd mm1, mm4 |
psrad mm1, 15 |
packssdw mm1, mm1 |
movd [edi], mm1 |
add edi, 4 |
|
add eax, ebx |
cmp eax, [r_end] |
jb .l1 |
emms |
|
mov esi, [src] |
add esi, [r_size] |
sub esi, 32*4 |
mov edx, [r_buff] |
mov ecx, 32 |
@@: |
mov ebx, [esi] |
mov [edx], ebx |
add esi, 4 |
add edx, 4 |
dec ecx |
jnz @B |
|
sub edi, [dest] |
mov eax, edi |
ret |
endp |
|
align 4 |
proc resample_28 stdcall, dest:dword,src:dword,r_buff:dword,\ |
r_dt:dword, r_size:dword,r_end:dword |
|
mov edi, [r_buff] |
add edi, 32*2 |
mov esi, [src] |
mov ecx, [r_size] |
shr ecx, 2 |
rep movsd ;call memcpy |
|
mov edx, [r_buff] |
mov edi, [dest] |
mov ebx, [r_dt] |
mov eax, 16 |
emms |
movq mm7,[mm80] |
movq mm6,[mm_mask] |
|
align 16 |
.l1: |
mov ecx, eax |
mov esi, eax |
and ecx, 0x7FFF |
shr esi, 15 |
lea esi, [edx+esi*2] |
|
movq mm0, [esi] |
psubb mm0,mm7 |
punpcklbw mm0,mm0 |
pand mm0,mm6 |
|
movq mm1, mm0 |
|
movd mm2, ecx |
punpcklwd mm2, mm2 |
movq mm3, qword [m7] ; // 0x8000 |
|
psubw mm3, mm2 ; // 0x8000 - iconst |
punpckldq mm3, mm2 |
|
pmulhw mm0, mm3 |
pmullw mm1, mm3 |
|
movq mm4, mm1 |
punpcklwd mm1, mm0 |
punpckhwd mm4, mm0 |
paddd mm1, mm4 |
psrad mm1, 15 |
packssdw mm1, mm1 |
movd [edi], mm1 |
add edi, 4 |
|
add eax, ebx |
cmp eax, [r_end] |
jb .l1 |
emms |
|
mov esi, [src] |
add esi, [r_size] |
sub esi, 32*2 |
mov edx, [r_buff] |
mov ecx, 16 |
@@: |
mov ebx, [esi] |
mov [edx], ebx |
add esi, 4 |
add edx, 4 |
dec ecx |
jnz @B |
|
sub edi, [dest] |
mov eax, edi |
ret |
endp |
|
|
proc m16_stereo stdcall, dest:dword,src:dword,r_buff:dword,\ |
r_dt:dword, r_size:dword,r_end:dword |
|
mov esi, [src] |
mov edi, [dest] |
mov ecx, [r_size] |
shr ecx,8 |
@@: |
call m16_s_mmx |
add edi, 128 |
add esi, 64 |
call m16_s_mmx |
add edi, 128 |
add esi, 64 |
call m16_s_mmx |
add edi, 128 |
add esi, 64 |
call m16_s_mmx |
add edi, 128 |
add esi, 64 |
dec ecx |
jnz @b |
|
mov eax, [r_size] |
add eax, eax |
ret |
endp |
|
align 4 |
proc s8_stereo stdcall, dest:dword,src:dword,r_buff:dword,\ |
r_dt:dword, r_size:dword,r_end:dword |
|
|
mov esi, [src] |
mov edi, [dest] |
mov ecx, [r_size] |
shr ecx, 7 |
|
movq mm7, [mm80] |
movq mm6, [mm_mask] |
@@: |
call s8_s_mmx |
add edi, 64 |
add esi, 32 |
call s8_s_mmx |
add edi, 64 |
add esi, 32 |
call s8_s_mmx |
add edi, 64 |
add esi, 32 |
call s8_s_mmx |
add edi, 64 |
add esi, 32 |
dec ecx |
jnz @b |
|
mov eax, [r_size] |
add eax, eax |
ret |
endp |
|
proc m8_stereo stdcall, dest:dword,src:dword,r_buff:dword,\ |
r_dt:dword, r_size:dword,r_end:dword |
|
mov esi, [src] |
mov edi, [dest] |
mov ecx, [r_size] |
shr ecx, 6 |
|
movq mm7, [mm80] |
movq mm6, [mm_mask] |
@@: |
call m8_s_mmx |
add edi, 64 |
add esi, 16 |
call m8_s_mmx |
add edi, 64 |
add esi, 16 |
call m8_s_mmx |
add edi, 64 |
add esi, 16 |
call m8_s_mmx |
add edi, 64 |
add esi, 16 |
dec ecx |
jnz @b |
|
mov eax, [r_size] |
add eax, eax |
add eax, eax |
ret |
endp |
|
align 4 |
proc alloc_mix_buff |
|
bsf eax, [mix_buff_map] |
jnz .find |
xor eax, eax |
ret |
.find: |
btr [mix_buff_map], eax |
shl eax, 9 |
add eax, [mix_buff] |
ret |
endp |
|
proc m16_s_mmx |
|
movq mm0, [esi] |
movq mm1, mm0 |
punpcklwd mm0, mm0 |
punpckhwd mm1, mm1 |
movq [edi], mm0 |
movq [edi+8], mm1 |
|
movq mm0, [esi+8] |
movq mm1, mm0 |
punpcklwd mm0, mm0 |
punpckhwd mm1, mm1 |
movq [edi+16], mm0 |
movq [edi+24], mm1 |
|
movq mm0, [esi+16] |
movq mm1, mm0 |
punpcklwd mm0, mm0 |
punpckhwd mm1, mm1 |
movq [edi+32], mm0 |
movq [edi+40], mm1 |
|
movq mm0, [esi+24] |
movq mm1, mm0 |
punpcklwd mm0, mm0 |
punpckhwd mm1, mm1 |
movq [edi+48], mm0 |
movq [edi+56], mm1 |
|
movq mm0, [esi+32] |
movq mm1, mm0 |
punpcklwd mm0, mm0 |
punpckhwd mm1, mm1 |
movq [edi+64], mm0 |
movq [edi+72], mm1 |
|
movq mm0, [esi+40] |
movq mm1, mm0 |
punpcklwd mm0, mm0 |
punpckhwd mm1, mm1 |
movq [edi+80], mm0 |
movq [edi+88], mm1 |
|
|
movq mm0, [esi+48] |
movq mm1, mm0 |
punpcklwd mm0, mm0 |
punpckhwd mm1, mm1 |
movq [edi+96], mm0 |
movq [edi+104], mm1 |
|
movq mm0, [esi+56] |
movq mm1, mm0 |
punpcklwd mm0, mm0 |
punpckhwd mm1, mm1 |
movq [edi+112], mm0 |
movq [edi+120], mm1 |
|
ret |
endp |
|
align 4 |
proc s8_s_mmx |
|
movq mm0, [esi] |
psubb mm0, mm7 |
movq mm1, mm0 |
punpcklbw mm0, mm0 |
pand mm0, mm6 |
punpckhbw mm1, mm1 |
pand mm1, mm6 |
movq [edi], mm0 |
movq [edi+8], mm1 |
|
movq mm0, [esi+8] |
psubb mm0, mm7 |
movq mm1, mm0 |
punpcklbw mm0, mm0 |
pand mm0, mm6 |
punpckhbw mm1, mm1 |
pand mm1, mm6 |
movq [edi+16], mm0 |
movq [edi+24], mm1 |
|
movq mm0, [esi+16] |
psubb mm0, mm7 |
movq mm1, mm0 |
punpcklbw mm0, mm0 |
pand mm0, mm6 |
punpckhbw mm1, mm1 |
pand mm1, mm6 |
movq [edi+32], mm0 |
movq [edi+40], mm1 |
|
movq mm0, [esi+24] |
psubb mm0, mm7 |
movq mm1, mm0 |
punpcklbw mm0, mm0 |
pand mm0, mm6 |
punpckhbw mm1, mm1 |
pand mm1, mm6 |
movq [edi+48], mm0 |
movq [edi+56], mm1 |
|
ret |
|
endp |
|
align 4 |
proc m8_s_mmx |
|
movq mm0, [esi] |
psubb mm0, mm7 |
movq mm1, mm0 |
punpcklbw mm0, mm0 |
pand mm0, mm6 |
punpckhbw mm1, mm1 |
pand mm1, mm6 |
movq mm2, mm0 |
punpcklwd mm0, mm0 |
punpckhwd mm2, mm2 |
|
movq mm3, mm1 |
punpcklwd mm1, mm1 |
punpckhwd mm3, mm3 |
|
movq [edi], mm0 |
movq [edi+8], mm2 |
movq [edi+16], mm1 |
movq [edi+24], mm3 |
|
movq mm0, [esi+8] |
psubb mm0, mm7 |
movq mm1, mm0 |
punpcklbw mm0, mm0 |
pand mm0, mm6 |
punpckhbw mm1, mm1 |
pand mm1, mm6 |
movq mm2, mm0 |
punpcklwd mm0, mm0 |
punpckhwd mm2, mm2 |
|
movq mm3, mm1 |
punpcklwd mm1, mm1 |
punpckhwd mm3, mm3 |
|
movq [edi+32], mm0 |
movq [edi+40], mm2 |
movq [edi+48], mm1 |
movq [edi+56], mm3 |
|
ret |
endp |
|
|
align 4 |
proc mix_2_1 stdcall, output:dword, str0:dword, str1:dword |
|
mov edi, [output] |
|
stdcall mix_2_1_mmx, edi, [str0],[str1] |
add edi, 128 |
add [str0], 128 |
add [str1], 128 |
stdcall mix_2_1_mmx, edi, [str0],[str1] |
add edi, 128 |
add [str0], 128 |
add [str1], 128 |
stdcall mix_2_1_mmx, edi, [str0],[str1] |
add edi, 128 |
add [str0], 128 |
add [str1], 128 |
stdcall mix_2_1_mmx, edi, [str0],[str1] |
|
ret |
endp |
|
|
align 4 |
proc mix_3_1 stdcall, output:dword, str0:dword, str1:dword, str2:dword |
|
mov edi, [output] |
|
stdcall mix_3_1_mmx, edi, [str0],[str1],[str2] |
add edi, 128 |
add [str0], 128 |
add [str1], 128 |
add [str2], 128 |
stdcall mix_3_1_mmx, edi, [str0],[str1],[str2] |
add edi, 128 |
add [str0], 128 |
add [str1], 128 |
add [str2], 128 |
stdcall mix_3_1_mmx, edi, [str0],[str1],[str2] |
add edi, 128 |
add [str0], 128 |
add [str1], 128 |
add [str2], 128 |
stdcall mix_3_1_mmx, edi, [str0],[str1],[str2] |
|
ret |
endp |
|
align 4 |
proc mix_4_1 stdcall, str0:dword, str1:dword,\ |
str2:dword, str3:dword |
|
local output:DWORD |
|
call alloc_mix_buff |
and eax, eax |
jz .err |
mov [output], eax |
|
mov edi, eax |
|
stdcall mix_4_1_mmx, edi, [str0],[str1],[str2],[str3] |
add edi, 128 |
add [str0], 128 |
add [str1], 128 |
add [str2], 128 |
add [str3], 128 |
stdcall mix_4_1_mmx, edi, [str0],[str1],[str2],[str3] |
add edi, 128 |
add [str0], 128 |
add [str1], 128 |
add [str2], 128 |
add [str3], 128 |
stdcall mix_4_1_mmx, edi, [str0],[str1],[str2],[str3] |
add edi, 128 |
add [str0], 128 |
add [str1], 128 |
add [str2], 128 |
add [str3], 128 |
stdcall mix_4_1_mmx, edi, [str0],[str1],[str2],[str3] |
mov eax, [output] |
ret |
.err: |
xor eax, eax |
ret |
endp |
|
|
align 4 |
proc final_mix stdcall, output:dword, str0:dword, str1:dword,\ |
str2:dword, str3:dword |
|
mov edi, [output] |
|
stdcall mix_4_1_mmx, edi, [str0],[str1],[str2],[str3] |
add edi, 128 |
add [str0], 128 |
add [str1], 128 |
add [str2], 128 |
add [str3], 128 |
stdcall mix_4_1_mmx, edi, [str0],[str1],[str2],[str3] |
add edi, 128 |
add [str0], 128 |
add [str1], 128 |
add [str2], 128 |
add [str3], 128 |
stdcall mix_4_1_mmx, edi, [str0],[str1],[str2],[str3] |
add edi, 128 |
add [str0], 128 |
add [str1], 128 |
add [str2], 128 |
add [str3], 128 |
stdcall mix_4_1_mmx, edi, [str0],[str1],[str2],[str3] |
|
ret |
endp |
|
align 4 |
proc mix_2_1_mmx stdcall, output:dword, str0:dword, str1:dword |
|
mov edx, [output] |
mov eax, [str0] |
mov ecx, [str1] |
|
movq mm0, [eax] |
paddsw mm0, [ecx] |
; psraw mm0, 1 |
movq [edx], mm0 |
|
movq mm1, [eax+8] |
paddsw mm1,[ecx+8] |
; psraw mm1, 1 |
movq [edx+8], mm1 |
|
movq mm2, [eax+16] |
paddsw mm2, [ecx+16] |
; psraw mm2, 1 |
movq [edx+16], mm2 |
|
movq mm3, [eax+24] |
paddsw mm3, [ecx+24] |
; psraw mm3, 1 |
movq [edx+24], mm3 |
|
movq mm0, [eax+32] |
paddsw mm0, [ecx+32] |
; psraw mm0, 1 |
movq [edx+32], mm0 |
|
movq mm1, [eax+40] |
paddsw mm1, [ecx+40] |
; psraw mm1, 1 |
movq [edx+40], mm1 |
|
movq mm2, [eax+48] |
paddsw mm2, [ecx+48] |
; psraw mm2, 1 |
movq [edx+48], mm2 |
|
movq mm3, [eax+56] |
paddsw mm3, [ecx+56] |
; psraw mm3, 1 |
movq [edx+56], mm3 |
|
movq mm0, [eax+64] |
paddsw mm0, [ecx+64] |
; psraw mm0, 1 |
movq [edx+64], mm0 |
|
movq mm1, [eax+72] |
paddsw mm1, [ecx+72] |
; psraw mm1, 1 |
movq [edx+72], mm1 |
|
movq mm2, [eax+80] |
paddsw mm2, [ecx+80] |
; psraw mm2, 1 |
movq [edx+80], mm2 |
|
movq mm3, [eax+88] |
paddsw mm3, [ecx+88] |
; psraw mm3, 1 |
|
movq [edx+88], mm3 |
|
movq mm0, [eax+96] |
paddsw mm0, [ecx+96] |
; psraw mm0, 1 |
|
movq [edx+96], mm0 |
|
movq mm1, [eax+104] |
paddsw mm1, [ecx+104] |
; psraw mm1, 1 |
|
movq [edx+104], mm1 |
|
movq mm2, [eax+112] |
paddsw mm2, [ecx+112] |
; psraw mm2, 1 |
|
movq [edx+112], mm2 |
|
movq mm3, [eax+120] |
paddsw mm3, [ecx+120] |
; psraw mm3, 1 |
|
movq [edx+120], mm3 |
|
ret |
endp |
|
align 4 |
proc mix_3_1_mmx stdcall, output:dword, str0:dword, str1:dword, str2:dword |
|
mov edx, [output] |
mov eax, [str0] |
mov ebx, [str1] |
mov ecx, [str2] |
|
movq mm0, [eax] |
paddsw mm0, [ebx] |
paddsw mm0, [ecx] |
movq [edx], mm0 |
|
movq mm1, [eax+8] |
paddsw mm1,[ebx+8] |
paddsw mm1,[ecx+8] |
movq [edx+8], mm1 |
|
movq mm2, [eax+16] |
paddsw mm2, [ebx+16] |
paddsw mm2, [ecx+16] |
movq [edx+16], mm2 |
|
movq mm3, [eax+24] |
paddsw mm3, [ebx+24] |
paddsw mm3, [ecx+24] |
movq [edx+24], mm3 |
|
movq mm0, [eax+32] |
paddsw mm0, [ebx+32] |
paddsw mm0, [ecx+32] |
movq [edx+32], mm0 |
|
movq mm1, [eax+40] |
paddsw mm1, [ebx+40] |
paddsw mm1, [ecx+40] |
movq [edx+40], mm1 |
|
movq mm2, [eax+48] |
paddsw mm2, [ebx+48] |
paddsw mm2, [ecx+48] |
movq [edx+48], mm2 |
|
movq mm3, [eax+56] |
paddsw mm3, [ebx+56] |
paddsw mm3, [ecx+56] |
movq [edx+56], mm3 |
|
movq mm0, [eax+64] |
paddsw mm0, [ebx+64] |
paddsw mm0, [ecx+64] |
movq [edx+64], mm0 |
|
movq mm1, [eax+72] |
paddsw mm1, [ebx+72] |
paddsw mm1, [ecx+72] |
movq [edx+72], mm1 |
|
movq mm2, [eax+80] |
paddsw mm2, [ebx+80] |
paddsw mm2, [ecx+80] |
movq [edx+80], mm2 |
|
movq mm3, [eax+88] |
paddsw mm3, [ebx+88] |
paddsw mm3, [ecx+88] |
movq [edx+88], mm3 |
|
movq mm0, [eax+96] |
paddsw mm0, [ebx+96] |
paddsw mm0, [ecx+96] |
movq [edx+96], mm0 |
|
movq mm1, [eax+104] |
paddsw mm1, [ebx+104] |
paddsw mm1, [ecx+104] |
movq [edx+104], mm1 |
|
movq mm2, [eax+112] |
paddsw mm2, [ebx+112] |
paddsw mm2, [ecx+112] |
movq [edx+112], mm2 |
|
movq mm3, [eax+120] |
paddsw mm3, [ebx+120] |
paddsw mm3, [ecx+120] |
movq [edx+120], mm3 |
|
ret |
endp |
|
align 4 |
proc mix_4_1_mmx stdcall, output:dword, str0:dword, str1:dword,\ |
str2:dword, str3:dword |
|
mov edx, [output] |
mov esi, [str0] |
mov eax, [str1] |
mov ebx, [str2] |
mov ecx, [str3] |
|
movq mm0, [esi] |
movq mm1, [eax] |
paddsw mm0, [ebx] |
paddsw mm1, [ecx] |
paddsw mm0, mm1 |
movq [edx], mm0 |
|
movq mm2, [esi+8] |
movq mm3, [eax+8] |
paddsw mm2, [ebx+8] |
paddsw mm3, [ecx+8] |
paddsw mm2, mm3 |
movq [edx+8], mm2 |
|
movq mm0, [esi+16] |
movq mm1, [eax+16] |
paddsw mm0, [ebx+16] |
paddsw mm1, [ecx+16] |
paddsw mm0, mm1 |
movq [edx+16], mm0 |
|
movq mm2, [esi+24] |
movq mm3, [eax+24] |
paddsw mm2, [ebx+24] |
paddsw mm3, [ecx+24] |
paddsw mm2, mm3 |
movq [edx+24], mm2 |
|
movq mm0, [esi+32] |
movq mm1, [eax+32] |
paddsw mm0, [ebx+32] |
paddsw mm1, [ecx+32] |
paddsw mm0, mm1 |
movq [edx+32], mm0 |
|
movq mm2, [esi+40] |
movq mm3, [eax+40] |
paddsw mm2, [ebx+40] |
paddsw mm3, [ecx+40] |
paddsw mm2, mm3 |
movq [edx+40], mm2 |
|
movq mm0, [esi+48] |
movq mm1, [eax+48] |
paddsw mm0, [ebx+48] |
paddsw mm1, [ecx+48] |
paddsw mm0, mm1 |
movq [edx+48], mm0 |
|
movq mm2, [esi+56] |
movq mm3, [eax+56] |
paddsw mm2, [ebx+56] |
paddsw mm3, [ecx+56] |
paddsw mm2, mm3 |
movq [edx+56], mm2 |
|
movq mm0, [esi+64] |
movq mm1, [eax+64] |
paddsw mm0, [ebx+64] |
paddsw mm1, [ecx+64] |
paddsw mm0, mm1 |
movq [edx+64], mm0 |
|
movq mm2, [esi+72] |
movq mm3, [eax+72] |
paddsw mm2, [ebx+72] |
paddsw mm3, [ecx+72] |
paddsw mm2, mm3 |
movq [edx+72], mm2 |
|
movq mm2, [esi+80] |
movq mm3, [eax+80] |
paddsw mm2, [ebx+80] |
paddsw mm3, [ecx+80] |
paddsw mm2, mm3 |
movq [edx+80], mm2 |
|
movq mm2, [esi+88] |
movq mm3, [eax+88] |
paddsw mm2, [ebx+88] |
paddsw mm3, [ecx+88] |
paddsw mm2, mm3 |
movq [edx+88], mm2 |
|
movq mm2, [esi+96] |
movq mm3, [eax+96] |
paddsw mm2, [ebx+96] |
paddsw mm3, [ecx+96] |
paddsw mm2, mm3 |
movq [edx+96], mm2 |
|
movq mm2, [esi+104] |
movq mm3, [eax+104] |
paddsw mm2, [ebx+104] |
paddsw mm3, [ecx+104] |
paddsw mm2, mm3 |
movq [edx+104], mm2 |
|
movq mm2, [esi+112] |
movq mm3, [eax+112] |
paddsw mm2, [ebx+112] |
paddsw mm3, [ecx+112] |
paddsw mm2, mm3 |
movq [edx+112], mm2 |
|
movq mm2, [esi+120] |
movq mm3, [eax+120] |
paddsw mm2, [ebx+120] |
paddsw mm3, [ecx+120] |
paddsw mm2, mm3 |
movq [edx+120], mm2 |
|
ret |
endp |
|
align 4 |
proc copy_mem stdcall, output:dword, input:dword |
|
mov edi, [output] |
mov esi, [input] |
mov ecx, 0x80 |
.l1: |
mov eax, [esi] |
mov [edi], eax |
add esi, 4 |
add edi, 4 |
loop .l1 |
|
ret |
endp |
|
proc memcpy |
@@: |
mov eax, [esi] |
mov [edi], eax |
add esi, 4 |
add edi, 4 |
dec ecx |
jnz @B |
ret |
endp |
|
|
|