diff --git a/programs/develop/info3ds/info_fun_float.inc b/programs/develop/info3ds/info_fun_float.inc index befacdaee0..5881749f66 100644 --- a/programs/develop/info3ds/info_fun_float.inc +++ b/programs/develop/info3ds/info_fun_float.inc @@ -39,9 +39,10 @@ Data_BCD DT ? Data_Flag DB ? ; ���� १���� (� �� 0 - ����⥫쭮� �) Data_Sign DB ? +; ���� १���� - 0 ��� ..e+.. � 1 ��� ..e-.. +Data_Sign_Exp DB ? - -db 0 ;㪠��⥫� �� ᤢ�� � ����� +align 4 ; ��ப� ��� �࠭���� � � ���� ASCII Data_String DB 32 DUP (?) @@ -75,8 +76,7 @@ DoubleFloat_to_String: je .NoShifts ;��� ��� �� ����⮩ jl .Error ;�訡�� dec BX - shl BX, 3 ;㬭����� �� 8 - add EBX, MConst + lea ebx,[MConst+8*ebx] fmul qword [EBX] ;㬭����� �� ����⠭�� .NoShifts: ; ������� � � ���� BCD @@ -197,36 +197,37 @@ String_to_DoubleFloat: mov word [Data_BCD+8],0 ; ��頥� ���� ����� mov [Data_Sign],0 - ; ����ᨬ � SI 㪠��⥫� �� ��ப� - mov ESI, Data_String + ; ����ᨬ � esi 㪠��⥫� �� ��ப� + mov esi, Data_String ; �ய�᪠�� ���� ��। �� mov ecx,64 ;���� �� ��横������� .ShiftIgnore: lodsb - cmp AL,' ' - jne .ShiftIgnoreEnd - loop .ShiftIgnore - jmp .Error + cmp al,' ' + jne .ShiftIgnoreEnd + loop .ShiftIgnore + jmp .Error align 4 .ShiftIgnoreEnd: ; ���塞 ���� � - cmp AL,'-' + cmp al,'-' jne .Positive mov [Data_Sign],80h lodsb .Positive: mov [Data_Flag],0 ;�ਧ��� ������ �窨 - mov DX,0 ;������ �窨 + xor edx,edx ;������ �窨 mov ecx,18 ;����. � ࠧ�冷� +align 4 .ASCIItoBCDConversion: - cmp AL,'.' ;�窠? + cmp al,'.' ;�窠? jne .NotDot cmp [Data_Flag],0 ;�窠 �� ����砫���? - jne .Error + jne .Error ;� �窠 㦥 �뫠 mov [Data_Flag],1 lodsb - cmp AL,0 ;����� ��ப�? - jne .NotDot + or al,al ;����� ��ப�? + jnz .NotDot jmp .ASCIItoBCDConversionEnd align 4 .NotDot: @@ -234,71 +235,146 @@ align 4 ; � ��� �� �� ����砫��� cmp [Data_Flag],0 jnz .Figures - inc DX + inc edx .Figures: + cmp al,'e' + je .exp_form + cmp al,'E' + jne @f + .exp_form: + call string_ExpForm ;� � � �ଠ� ..e.. + or al,al + jnz .Error + jmp .ASCIItoBCDConversionEnd + @@: ; ������� � ������ ���� ��ࠬ� - cmp AL,'0' + cmp al,'0' jb .Error - cmp AL,'9' + cmp al,'9' ja .Error ; ��襬 ��।��� ���� � ������� ��ࠤ� BCD - and AL,0Fh - or byte [Data_BCD],AL + and al,15 ;ᨬ���� 0-9 ��ॢ���� � � + or byte [Data_BCD],al ; ��ઠ �� ����� ��ப� - cmp byte [ESI],0 + cmp byte [esi],0 je .ASCIItoBCDConversionEnd ; �������� BCD �� 4 ࠧ�鸞 ����� ; (ᤢ����� ���訥 2 ����) - mov AX,word [Data_BCD+6] - shld word [Data_BCD+8],AX,4 + mov ax,word [Data_BCD+6] + shld word [Data_BCD+8],ax,4 ; (ᤢ����� �।��� 4 ����) - mov EAX, dword [Data_BCD] - shld dword [Data_BCD+4],EAX,4 + mov eax,dword [Data_BCD] + shld dword [Data_BCD+4],eax,4 ; (ᤢ����� ����訥 4 ����) shl dword [Data_BCD],4 ; ����㦠�� ���騩 ᨬ��� � AL lodsb - loop .ASCIItoBCDConversion + loop .ASCIItoBCDConversion ;� �� ������. � ���⠢��� dec ecx, jnz ... ; � 19-� ᨬ��� �� 0 � �� �窠, ; � �訡�� ��९������� - cmp AL,'.' + cmp al,'.' jne .NotDot2 - inc ecx + inc ecx ;�ய�� �窨 � ���� �祭� ����讣� � lodsb .NotDot2: - cmp AL,0 - jne .Error ;��९������� ࠧ�來�� �⪨ + or al,al ;��९������� ࠧ�來�� �⪨? + jz .ASCIItoBCDConversionEnd +align 4 +.Error: ; �� �� �訡�� ���㫨�� १���� + fldz ;������ ���� � �⥪ ᮯ����� + fstp [Data_Double] + jmp .End ; ������������� ����� �� ���� BCD � ������������ ����� .ASCIItoBCDConversionEnd: ; ������ ���� � ���訩 ���� - mov AL,[Data_Sign] - mov byte [Data_BCD+9],AL + mov al,[Data_Sign] + mov byte [Data_BCD+9],al ; ������ ॣ����� ᮯ����� fninit ; ����㧨�� � ᮯ����� � � BCD-�ଠ� fbld [Data_BCD] - ; ����� ����� ����⥫� - mov EBX,18+1 - sub BX,CX - sub BX,DX - cmp EBX,0 - je .NoDiv - dec EBX - shl EBX,3 ;㬭����� �� 8 - add EBX, MConst - fdiv qword [EBX] ;ࠧ������ �� ����⠭�� -.NoDiv:; ���㧨�� � � ����筮� �ଠ� - fstp [Data_Double] - jmp .End -align 4 -.Error:; �� �� �訡�� ���㫨�� १���� - fldz ;������ ���� � �⥪ ᮯ����� - fstp [Data_Double] + ; ����� ����� ����⥫� ��� �����⥫� + lea ebx,[ecx+edx-18] + cmp ebx,0 + jle .NoMul ;� � e-.. + dec ebx + jz .NoDiv ;� � e+0 + dec ebx + lea ebx,[MConst+8*ebx] + fmul qword [ebx] ;㬭����� �� ����⠭�� (��� �ᥫ � ���⠢��� e+..) + jmp .NoDiv +.NoMul: + neg ebx + lea ebx,[MConst+8*ebx] + fdiv qword [ebx] ;ࠧ������ �� ����⠭�� +.NoDiv: ;���㧨�� � � ����筮� �ଠ� + fstp [Data_Double] .End: popad ret +;output: +; eax - 1 if error +; edx += size +align 4 +proc string_ExpForm uses ebx + mov [Data_Sign_Exp],0 + xor eax,eax + lodsb + cmp al,'+' + jne @f + lodsb + @@: + cmp al,'-' + jne @f + inc [Data_Sign_Exp] + lodsb + @@: + + xor ebx,ebx + .cycle0: + cmp al,0 + je .cycle0end + cmp al,9 + je .cycle0end + cmp al,10 + je .cycle0end + cmp al,13 + je .cycle0end + cmp al,' ' + je .cycle0end + cmp al,'0' + jb .Error + cmp al,'9' + ja .Error + + imul ebx,10 + and eax,15 ;ᨬ���� 0-9 ��ॢ���� � � + add ebx,eax + lodsb + jmp .cycle0 + .cycle0end: + + cmp [Data_Sign_Exp],0 + je @f + neg ebx + @@: + cmp [Data_Flag],0 ;�窠 �� ����砫���? + jne @f + dec edx + @@: + add edx,ebx + + xor eax,eax + jmp @f + .Error: + xor eax,eax + inc eax + @@: + ret +endp + align 4 proc str_cat uses eax ecx edi esi, str1:dword, str2:dword mov esi,dword[str2]