diff --git a/programs/develop/libraries/utils/trunk/_ftoa.inc b/programs/develop/libraries/utils/trunk/_ftoa.inc index b4d1fb620d..a4b80be9e4 100644 --- a/programs/develop/libraries/utils/trunk/_ftoa.inc +++ b/programs/develop/libraries/utils/trunk/_ftoa.inc @@ -7,299 +7,299 @@ ;-----------------------------------------------------------------------------+ proc FloatToString lpFloat:DWORD, lpResult:DWORD - ; ������� ��६���� - local digits_count:DWORD - local old_cw:WORD - local new_cw:WORD - local saved_float:TBYTE - local tmp1 rb 11h - local tmp2 rb 11h - - ; ���࠭��� �� ॣ����� - pusha - - ; �����⥫� �� ��ப�-�ਥ���� - mov edi,[lpResult] - - ; �� ����? - lea esi,[lpFloat] - cmp dword [esi],0 - jne loc_not_zero - cmp dword [esi+4],0 - jne loc_not_zero - cmp word [esi+8],0 - jne loc_not_zero - ; ������� � ��ப� ���� - mov al,'0' - stosb - jmp loc_ret - + ; ������� ��६���� + local digits_count:DWORD + local old_cw:WORD + local new_cw:WORD + local saved_float:TBYTE + local tmp1 rb 11h + local tmp2 rb 11h + + ; ���࠭��� �� ॣ����� + pusha + + ; �����⥫� �� ��ப�-�ਥ���� + mov edi,[lpResult] + + ; �� ����? + mov esi,[lpFloat] + cmp dword [esi],0 + jne loc_not_zero + cmp dword [esi+4],0 + jne loc_not_zero + cmp word [esi+8],0 + jne loc_not_zero + ; ������� � ��ப� ���� + mov al,'0' + stosb + jmp loc_ret + loc_not_zero: - ; �������� � � �������� ��६����� - push edi - mov esi,[lpFloat] - lea edi,[saved_float] - movsd - movsd - movsw - pop edi - ; �� ����⥫쭮�? - cmp dword [saved_float+6],0 - jge loc_not_signed - ; �ਢ��� � � ��᮫�⭮�� ���祭�� - and byte [saved_float+9],7Fh - ; ������� � ��ப� ����� - mov al,'-' - stosb - + ; �������� � � �������� ��६����� + push edi + mov esi,[lpFloat] + lea edi,[saved_float] + movsd + movsd + movsw + pop edi + ; �� ����⥫쭮�? + cmp dword [saved_float+6],0 + jge loc_not_signed + ; �ਢ��� � � ��᮫�⭮�� ���祭�� + and byte [saved_float+9],7Fh + ; ������� � ��ப� ����� + mov al,'-' + stosb + loc_not_signed: - ; ����� � �� ����稥 ���� ��� � - ; �������� ������⢮ ��� � ��� - fclex - ; ���࠭��� �ࠢ���饥 �� - fstcw [old_cw] - ; ��⠭����� �ࠢ���饥 �� - mov [new_cw],0000001001111111b - fldcw [new_cw] - lea esi,[saved_float] - fld tbyte [esi] - fld st - ; �뤥���� ������� � ���冷� - fxtract - fstp st - fldlg2 - ; ������� ������⢮ ��� � � - fmulp st1,st - fistp [digits_count] - ; � ��� ����� 16, � � �⮡ࠦ����� � - ; ��ଠ���������� ���� � �����ᮩ � ��ᯮ���⮩ - cmp [digits_count],10h - jnb loc_not_integer - ; � � ���� ���� ����? - fld st - frndint - fcomp st1 - fstsw ax - test ah,01000000b - ; ��, �⮡ࠦ��� � � ���� ����� - jz loc_not_integer - - ; ����� � ��� ���� ��� � ��ᯮ����� - lea eax,[tmp1] - fbstp [eax] - - ; ��ॢ��� BCD-� � ��ப� - push edi - lea esi,[tmp1+8] - lea edi,[tmp2] - mov ecx, 9 + ; ����� � �� ����稥 ���� ��� � + ; �������� ������⢮ ��� � ��� + fclex + ; ���࠭��� �ࠢ���饥 �� + fstcw [old_cw] + ; ��⠭����� �ࠢ���饥 �� + mov [new_cw],0000001001111111b + fldcw [new_cw] + lea esi,[saved_float] + fld tbyte [esi] + fld st + ; �뤥���� ������� � ���冷� + fxtract + fstp st + fldlg2 + ; ������� ������⢮ ��� � � + fmulp st1,st + fistp [digits_count] + ; � ��� ����� 16, � � �⮡ࠦ����� � + ; ��ଠ���������� ���� � �����ᮩ � ��ᯮ���⮩ + cmp [digits_count],10h + jnb loc_not_integer + ; � � ���� ���� ����? + fld st + frndint + fcomp st1 + fstsw ax + test ah,01000000b + ; ��, �⮡ࠦ��� � � ���� ����� + jz loc_not_integer + + ; ����� � ��� ���� ��� � ��ᯮ����� + lea eax,[tmp1] + fbstp [eax] + + ; ��ॢ��� BCD-� � ��ப� + push edi + lea esi,[tmp1+8] + lea edi,[tmp2] + mov ecx, 9 @@: - std - xor eax,eax - lodsb - cld - rol ax,12 - rol ah,4 - add ax,'00' - stosw - loop @b - pop edi - - ; �ய����� �������騩 ���� - mov eax,11h - mov ecx,[digits_count] - sub eax,ecx - inc ecx - lea esi,[tmp2+eax] - cmp byte [esi],'0' - jne @f - inc esi - dec ecx + std + xor eax,eax + lodsb + cld + rol ax,12 + rol ah,4 + add ax,'00' + stosw + loop @b + pop edi + + ; �ய����� �������騩 ���� + mov eax,11h + mov ecx,[digits_count] + sub eax,ecx + inc ecx + lea esi,[tmp2+eax] + cmp byte [esi],'0' + jne @f + inc esi + dec ecx @@: - ; ��७��� ����祭��� � �� �६������ ���� - rep movsb - jmp loc_clear_stack - + ; ��७��� ����祭��� � �� �६������ ���� + rep movsb + jmp loc_clear_stack + loc_not_integer: - mov eax,10h - sub eax,[digits_count] - - ; �८�ࠧ����� � � 楫�� �� 16 ࠧ�冷� - mov ecx,eax - cmp eax,0 - jge @f - neg eax + mov eax,10h + sub eax,[digits_count] + + ; �८�ࠧ����� � � 楫�� �� 16 ࠧ�冷� + mov ecx,eax + cmp eax,0 + jge @f + neg eax @@: - ; ��� �ᥫ ����� 0 ���४��� ���㣫���� � ��� 0 - mov [new_cw],0000101001111111b - cmp ecx,0 - jge @f - mov [new_cw],0000011001111111b + ; ��� �ᥫ ����� 0 ���४��� ���㣫���� � ��� 0 + mov [new_cw],0000101001111111b + cmp ecx,0 + jge @f + mov [new_cw],0000011001111111b @@: - ; ��⠭����� �ࠢ���饥 �� - fldcw [new_cw] - - ; ������� 10 � �⥯��� ������⢠ ��� - fld [float2] - fld [float2] + ; ��⠭����� �ࠢ���饥 �� + fldcw [new_cw] + + ; ������� 10 � �⥯��� ������⢠ ��� + fld [float2] + fld [float2] @@: - fmul st,st1 - dec eax - cmp eax,1 - ja @b - - ; ������� �⥪ - fxch st1 - fstp st - - ; � � ����� 0, � 㬭�����, ���� ࠧ������ - cmp ecx,0 - jge @f - fdivp st1,st - jmp loc_rounded + fmul st,st1 + dec eax + cmp eax,1 + ja @b + + ; ������� �⥪ + fxch st1 + fstp st + + ; � � ����� 0, � 㬭�����, ���� ࠧ������ + cmp ecx,0 + jge @f + fdivp st1,st + jmp loc_rounded @@: - fmulp st1,st - + fmulp st1,st + loc_rounded: - ; ����祭��� ���祭�� ����� 1.0e16 ? - fcom [float1] - fstsw ax - test ah,1 - jz @f - fmul [float2] - dec [digits_count] + ; ����祭��� ���祭�� ����� 1.0e16 ? + fcom [float1] + fstsw ax + test ah,1 + jz @f + fmul [float2] + dec [digits_count] @@: - ; ����� � ��� ���� ��� � ��ᯮ����� - lea eax,[tmp1] - fbstp [eax] - - ; ��ॢ��� BCD-� � ��ப� - push edi - lea esi,[tmp1+8] - lea edi,[tmp2] - mov ecx, 9 + ; ����� � ��� ���� ��� � ��ᯮ����� + lea eax,[tmp1] + fbstp [eax] + + ; ��ॢ��� BCD-� � ��ப� + push edi + lea esi,[tmp1+8] + lea edi,[tmp2] + mov ecx, 9 @@: - std - xor eax,eax - lodsb - cld - rol ax,12 - rol ah,4 - add ax,'00' - stosw - loop @b - pop edi - - ; ���� �ॡ���� ������ � ��ᯮ����? - lea esi,[tmp2+1] - mov ecx,[digits_count] - cmp ecx,-0Fh - jl loc_mantiss_and_exponent - cmp ecx,10h - jg loc_mantiss_and_exponent - - ; ��������� ���� ���� � - inc ecx - cmp ecx,0 - jg @f - mov ax,'0.' - stosw - neg ecx - mov al,'0' - rep stosb - mov ecx,10h - jmp loc_fraction_filled + std + xor eax,eax + lodsb + cld + rol ax,12 + rol ah,4 + add ax,'00' + stosw + loop @b + pop edi + + ; ���� �ॡ���� ������ � ��ᯮ����? + lea esi,[tmp2+1] + mov ecx,[digits_count] + cmp ecx,-0Fh + jl loc_mantiss_and_exponent + cmp ecx,10h + jg loc_mantiss_and_exponent + + ; ��������� ���� ���� � + inc ecx + cmp ecx,0 + jg @f + mov ax,'0.' + stosw + neg ecx + mov al,'0' + rep stosb + mov ecx,10h + jmp loc_fraction_filled @@: - rep movsb - mov al,'.' - stosb - mov ecx,10h - sub ecx,[digits_count] - + rep movsb + mov al,'.' + stosb + mov ecx,10h + sub ecx,[digits_count] + loc_fraction_filled: - rep movsb - jmp @f - + rep movsb + jmp @f + loc_clear_fraction: - ; ������� �������騥 �㫨 ���� ��� - dec edi + ; ������� �������騥 �㫨 ���� ��� + dec edi @@: - cmp byte [edi-1],'0' - jz loc_clear_fraction - cmp byte [edi-1],'.' - jnz @f - dec edi + cmp byte [edi-1],'0' + jz loc_clear_fraction + cmp byte [edi-1],'.' + jnz @f + dec edi @@: - jmp loc_clear_stack - + jmp loc_clear_stack + loc_mantiss_and_exponent: - ; ���� ���� ������� - movsb - mov al,'.' - stosb - movsd - movsd - movsw - ; ������� �������騥 �㫨 ���� ��� + ; ���� ���� ������� + movsb + mov al,'.' + stosb + movsd + movsd + movsw + ; ������� �������騥 �㫨 ���� ��� @@: - cmp byte [edi-1],'0' - jne @f - cmp byte [edi-2],'.' - je @f - dec edi - jmp @b + cmp byte [edi-1],'0' + jne @f + cmp byte [edi-2],'.' + je @f + dec edi + jmp @b @@: - ; ������ � ���� ��ᯮ����� - mov al,'e' - stosb - mov al,'+' - mov ebx,[digits_count] - cmp ebx, 0 - jge @f - mov al,'-' - neg ebx + ; ������ � ���� ��ᯮ����� + mov al,'e' + stosb + mov al,'+' + mov ebx,[digits_count] + cmp ebx, 0 + jge @f + mov al,'-' + neg ebx @@: - stosb - - ; ���祭�� ��ᯮ����� - mov eax,ebx - mov ecx,10 - mov ebx,4 + stosb + + ; ���祭�� ��ᯮ����� + mov eax,ebx + mov ecx,10 + mov ebx,4 @@: - dec ebx - xor edx,edx - div ecx - add dl,'0' - mov [tmp1+ebx],dl - or ebx,ebx - jnz @b - - ; �ய����� �������騥 �㫨 ��ᯮ����� - mov ecx,4 - lea esi,[tmp1] + dec ebx + xor edx,edx + div ecx + add dl,'0' + mov [tmp1+ebx],dl + or ebx,ebx + jnz @b + + ; �ய����� �������騥 �㫨 ��ᯮ����� + mov ecx,4 + lea esi,[tmp1] @@: - lodsb - cmp al,'0' - jne @f - dec ecx - jmp @b + lodsb + cmp al,'0' + jne @f + dec ecx + jmp @b @@: - dec esi - rep movsb - + dec esi + rep movsb + loc_clear_stack: - ; ����⠭����� �ࠢ���饥 �� - fldcw [old_cw] + ; ����⠭����� �ࠢ���饥 �� + fldcw [old_cw] loc_ret: - ; ����砭�� ��ப� - mov al,0 - stosb - - ; ����⠭����� �� ॣ����� - popa - ret - + ; ����砭�� ��ப� + mov al,0 + stosb + + ; ����⠭����� �� ॣ����� + popa + ret + float1 dq 1.0e16 float2 dq 10.0 - + endp \ No newline at end of file