--- np2/win9x/x86/parts.x86 2003/10/16 17:58:57 1.1 +++ np2/win9x/x86/parts.x86 2011/02/02 13:50:29 1.5 @@ -1,12 +1,26 @@ section .text + global @rand_setseed@4 + global @rand_get@0 global @AdjustAfterMultiply@4 global @AdjustBeforeDivision@4 global @sjis2jis@4 global @jis2sjis@4 global @satuation_s16@12 + global @satuation_s16x@12 + global @satuation_s16mmx@12 + align 16 +@rand_get@0: mov eax, dword [_randseed] + imul eax, 343fdh + add eax, 269ec3h + mov dword [_randseed], eax + sar eax, 16 + ret + +@rand_setseed@4:mov dword [_randseed], ecx + ret align 16 @AdjustAfterMultiply@4: @@ -70,6 +84,56 @@ ss16_set: lea edx, [edx+4] ss16_ed: pop ebx ret 4 + align 16 +@satuation_s16x@12: + push ebx + mov ebx, [esp+8] + shr ebx, 2 + je short ss16x_ed +ss16x_lp: mov eax, [edx] + cmp eax, 000008000h + jl short ss16xl_min + mov ax, 7fffh + jmp short ss16xl_set +ss16xl_min: cmp eax, 0ffff8000h + jg short ss16xl_set + mov ax, 8001h +ss16xl_set: mov [ecx+2], ax + mov eax, [edx+4] + cmp eax, 000008000h + jl short ss16xr_min + mov ax, 7fffh + jmp short ss16xr_set +ss16xr_min: cmp eax, 0ffff8000h + jg short ss16xr_set + mov ax, 8001h +ss16xr_set: mov [ecx], ax + lea edx, [edx+8] + dec ebx + lea ecx, [ecx+4] + jne short ss16x_lp +ss16x_ed: pop ebx + ret 4 + + align 16 +@satuation_s16mmx@12: + mov eax, [esp+4] + shr eax, 3 + je short ss16m_ed + pxor mm0, mm0 +ss16m_lp: movq mm1, [edx] + movq mm2, [edx+8] + packssdw mm1, mm2 + lea edx, [edx+16] + movq [ecx], mm1 + lea ecx, [ecx+8] + dec eax + jne short ss16m_lp + emms +ss16m_ed: ret 4 + + +section .data - ends +_randseed dd 1