forked from KolibriOS/kolibrios
Add COFF libraries "utils.obj" atof,ftoa,random
support for exponent, high accuracy, not normalized form of writing git-svn-id: svn://kolibrios.org@4721 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
300
programs/develop/libraries/utils/trunk/_atof.inc
Normal file
300
programs/develop/libraries/utils/trunk/_atof.inc
Normal file
@@ -0,0 +1,300 @@
|
|||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
; <EFBFBD>㭪<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>८<EFBFBD>ࠧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢥<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> [ by ManHunter / PCL ] |
|
||||||
|
;-----------------------------------------------------------------------------|
|
||||||
|
; <EFBFBD><EFBFBD>ࠬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: |
|
||||||
|
; lpStr - 㪠<EFBFBD><EFBFBD>⥫<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>室<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>ଠ<EFBFBD><EFBFBD> ASCIIZ |
|
||||||
|
; lpResult - 㪠<EFBFBD><EFBFBD>⥫<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>६<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<EFBFBD>ਥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><EFBFBD> |
|
||||||
|
; <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>室<EFBFBD>: |
|
||||||
|
; EAX = 1 - <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD>ᯥ譮 <EFBFBD>८<EFBFBD>ࠧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> |
|
||||||
|
; EAX = 0 - <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>८<EFBFBD>ࠧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD> |
|
||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
proc string2float lpStr:DWORD, lpResult:DWORD
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>६<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
locals
|
||||||
|
dot dd ? ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⥫<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
exp dd ? ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⥫<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
digit dd ? ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
endl
|
||||||
|
|
||||||
|
pusha
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD>ઠ <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov [digit],1
|
||||||
|
|
||||||
|
mov [exp],0
|
||||||
|
mov [dot],0
|
||||||
|
mov esi,[lpStr]
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ⮫쪮 <EFBFBD> <EFBFBD><EFBFBD>砫<EFBFBD>
|
||||||
|
cmp byte [esi],'-'
|
||||||
|
je @f
|
||||||
|
cmp byte [esi],'+'
|
||||||
|
jne .loc_chk_loop
|
||||||
|
@@:
|
||||||
|
inc esi
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
cmp byte [esi],0
|
||||||
|
je .loc_chk_error
|
||||||
|
.loc_chk_loop:
|
||||||
|
; <EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>窨
|
||||||
|
lodsb
|
||||||
|
or al,al
|
||||||
|
jz .loc_chk_complete
|
||||||
|
cmp al,'e'
|
||||||
|
je .loc_chk_exp
|
||||||
|
cmp al,'E'
|
||||||
|
je .loc_chk_exp
|
||||||
|
cmp al,'.'
|
||||||
|
je .loc_chk_dot
|
||||||
|
cmp al,'0'
|
||||||
|
jb .loc_chk_error
|
||||||
|
cmp al,'9'
|
||||||
|
ja .loc_chk_error
|
||||||
|
jmp .loc_chk_loop
|
||||||
|
|
||||||
|
.loc_chk_dot:
|
||||||
|
; <EFBFBD><EFBFBD>窠 <EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD> 㦥 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
cmp [dot],0
|
||||||
|
; <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>४<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ଠ<EFBFBD>
|
||||||
|
jne .loc_chk_error
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 㦥 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
cmp [exp],0
|
||||||
|
; <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>४<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ଠ<EFBFBD>
|
||||||
|
jne .loc_chk_error
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⥫<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov [dot],esi
|
||||||
|
|
||||||
|
jmp .loc_chk_loop
|
||||||
|
|
||||||
|
.loc_chk_exp:
|
||||||
|
; <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 㦥 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
cmp [exp],0
|
||||||
|
; <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>४<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ଠ<EFBFBD>
|
||||||
|
jne .loc_chk_error
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⥫<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>砫<EFBFBD> <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov [exp],esi
|
||||||
|
|
||||||
|
; <EFBFBD>ࠧ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
cmp byte [esi],0
|
||||||
|
je .loc_chk_error
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
cmp byte [esi],'-'
|
||||||
|
je @f
|
||||||
|
cmp byte [esi],'+'
|
||||||
|
jne .loc_chk_loop
|
||||||
|
@@:
|
||||||
|
inc esi
|
||||||
|
|
||||||
|
; <EFBFBD>ࠧ<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
cmp byte [esi],0
|
||||||
|
je .loc_chk_error
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>騩 ᨬ<EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
jmp .loc_chk_loop
|
||||||
|
|
||||||
|
.loc_chk_error:
|
||||||
|
; <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov [digit],0
|
||||||
|
jmp .loc_ret
|
||||||
|
|
||||||
|
.loc_chk_complete:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD>樠<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ᮯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
finit
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD>砫쭮<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
||||||
|
fldz
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⥫<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>⥫<EFBFBD>
|
||||||
|
mov [digit],10
|
||||||
|
fild dword [digit]
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>⮩
|
||||||
|
mov esi,[lpStr]
|
||||||
|
|
||||||
|
; <EFBFBD> <EFBFBD><EFBFBD>砫<EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
cmp byte [esi],'-'
|
||||||
|
je @f
|
||||||
|
cmp byte [esi],'+'
|
||||||
|
jne .loc_before_dot
|
||||||
|
@@:
|
||||||
|
inc esi
|
||||||
|
; <EFBFBD>८<EFBFBD>ࠧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>⮩
|
||||||
|
.loc_before_dot:
|
||||||
|
lodsb
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD>?
|
||||||
|
or al,al
|
||||||
|
jz .loc_complete
|
||||||
|
|
||||||
|
cmp al,'.'
|
||||||
|
je .loc_complete_before_dot
|
||||||
|
cmp al,'e'
|
||||||
|
je .loc_exp
|
||||||
|
cmp al,'E'
|
||||||
|
je .loc_exp
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD>।<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
sub al,'0'
|
||||||
|
movzx eax,al
|
||||||
|
mov [digit],eax
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
fild dword [digit]
|
||||||
|
fxch st2
|
||||||
|
fmul st0,st1
|
||||||
|
fxch st2
|
||||||
|
fadd st2,st0
|
||||||
|
|
||||||
|
ffree st0 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>⥪
|
||||||
|
fincstp
|
||||||
|
|
||||||
|
jmp .loc_before_dot
|
||||||
|
|
||||||
|
; <EFBFBD>८<EFBFBD>ࠧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
||||||
|
.loc_complete_before_dot:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
cmp [dot],0
|
||||||
|
je .loc_complete_after_dot
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
cmp [exp],0
|
||||||
|
je @f
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⥫<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>砫<EFBFBD> <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov esi,[exp]
|
||||||
|
jmp .loc_start_after_dot
|
||||||
|
@@:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>७<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 㪠<EFBFBD><EFBFBD>⥫<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD>
|
||||||
|
xor ecx,ecx
|
||||||
|
dec ecx
|
||||||
|
xor eax,eax
|
||||||
|
mov edi,esi
|
||||||
|
repne scasb
|
||||||
|
|
||||||
|
mov esi,edi
|
||||||
|
|
||||||
|
.loc_start_after_dot:
|
||||||
|
std
|
||||||
|
dec esi
|
||||||
|
dec esi
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
fldz
|
||||||
|
fxch st1
|
||||||
|
.loc_after_dot:
|
||||||
|
lodsb
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
cmp al,'.'
|
||||||
|
je .loc_complete_after_dot
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD>।<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
sub al,'0'
|
||||||
|
movzx eax,al
|
||||||
|
mov [digit],eax
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
fild dword [digit]
|
||||||
|
fadd st2,st0
|
||||||
|
fxch st2
|
||||||
|
fdiv st0,st1
|
||||||
|
fxch st2
|
||||||
|
|
||||||
|
ffree st0 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>⥪
|
||||||
|
fincstp
|
||||||
|
|
||||||
|
jmp .loc_after_dot
|
||||||
|
|
||||||
|
.loc_complete_after_dot:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 䫠<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ࠢ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
cld
|
||||||
|
|
||||||
|
ffree st0 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>⥪
|
||||||
|
fincstp
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> 楫<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
fadd st1,st0
|
||||||
|
|
||||||
|
.loc_exp:
|
||||||
|
; <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
cmp [exp],0
|
||||||
|
je .loc_complete
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
xor ecx,ecx
|
||||||
|
|
||||||
|
mov esi,[exp]
|
||||||
|
; <EFBFBD> <EFBFBD><EFBFBD>砫<EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
cmp byte [esi],'-'
|
||||||
|
je @f
|
||||||
|
cmp byte [esi],'+'
|
||||||
|
jne .loc_start_exp
|
||||||
|
@@:
|
||||||
|
inc esi
|
||||||
|
.loc_start_exp:
|
||||||
|
lodsb
|
||||||
|
or al,al
|
||||||
|
jz .loc_end_exp
|
||||||
|
|
||||||
|
sub al,'0'
|
||||||
|
movzx eax,al
|
||||||
|
imul ecx,10
|
||||||
|
add ecx,eax
|
||||||
|
|
||||||
|
jmp .loc_start_exp
|
||||||
|
.loc_end_exp:
|
||||||
|
|
||||||
|
or ecx,ecx
|
||||||
|
jz .loc_complete
|
||||||
|
|
||||||
|
ffree st0 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>⥪
|
||||||
|
fincstp
|
||||||
|
|
||||||
|
mov [digit],10
|
||||||
|
fild dword [digit]
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> 㬭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
mov esi,[exp]
|
||||||
|
cmp byte [esi],'-'
|
||||||
|
je .loc_exp_divide
|
||||||
|
|
||||||
|
.loc_exp_multiple:
|
||||||
|
fmul st1,st0
|
||||||
|
loop .loc_exp_multiple
|
||||||
|
jmp .loc_complete
|
||||||
|
|
||||||
|
.loc_exp_divide:
|
||||||
|
fdiv st1,st0
|
||||||
|
loop .loc_exp_divide
|
||||||
|
|
||||||
|
.loc_complete:
|
||||||
|
ffree st0 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>⥪
|
||||||
|
fincstp
|
||||||
|
|
||||||
|
; <EFBFBD> <EFBFBD><EFBFBD>砫<EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
mov esi,[lpStr]
|
||||||
|
cmp byte [esi],'-'
|
||||||
|
jne @f
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
||||||
|
fchs
|
||||||
|
@@:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD>祩<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov eax,[lpResult]
|
||||||
|
; <EFBFBD> <EFBFBD>ॡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>襭<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>筮<EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD> <EFBFBD>ਥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ࠧ<EFBFBD><EFBFBD><EFBFBD> QWORD, <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> fstp qword [eax]
|
||||||
|
fstp tword [eax]
|
||||||
|
|
||||||
|
; <EFBFBD>ᯥ譮<EFBFBD> <EFBFBD>८<EFBFBD>ࠧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov [digit],1
|
||||||
|
.loc_ret:
|
||||||
|
popa
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>८<EFBFBD>ࠧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov eax,[digit]
|
||||||
|
|
||||||
|
ret
|
||||||
|
endp
|
305
programs/develop/libraries/utils/trunk/_ftoa.inc
Normal file
305
programs/develop/libraries/utils/trunk/_ftoa.inc
Normal file
@@ -0,0 +1,305 @@
|
|||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
; <EFBFBD>㭪<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ॢ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢥<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD> [ by ManHunter / PCL ] |
|
||||||
|
;-----------------------------------------------------------------------------|
|
||||||
|
; <EFBFBD><EFBFBD>ࠬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: |
|
||||||
|
; lpFloat - 㪠<EFBFBD><EFBFBD>⥫<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢥<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> TBYTE |
|
||||||
|
; lpResult - 㪠<EFBFBD><EFBFBD>⥫<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD>-<EFBFBD>ਥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> १<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> |
|
||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
|
||||||
|
proc FloatToString lpFloat:DWORD, lpResult:DWORD
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>६<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
local digits_count:DWORD
|
||||||
|
local old_cw:WORD
|
||||||
|
local new_cw:WORD
|
||||||
|
local saved_float:TBYTE
|
||||||
|
local tmp1 rb 11h
|
||||||
|
local tmp2 rb 11h
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD>࠭<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> ॣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
pusha
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⥫<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD>-<EFBFBD>ਥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov edi,[lpResult]
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
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
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov al,'0'
|
||||||
|
stosb
|
||||||
|
jmp loc_ret
|
||||||
|
|
||||||
|
loc_not_zero:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>६<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
push edi
|
||||||
|
mov esi,[lpFloat]
|
||||||
|
lea edi,[saved_float]
|
||||||
|
movsd
|
||||||
|
movsd
|
||||||
|
movsw
|
||||||
|
pop edi
|
||||||
|
; <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⥫쭮<EFBFBD>?
|
||||||
|
cmp dword [saved_float+6],0
|
||||||
|
jge loc_not_signed
|
||||||
|
; <EFBFBD>ਢ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>᮫<EFBFBD>⭮<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><EFBFBD>
|
||||||
|
and byte [saved_float+9],7Fh
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov al,'-'
|
||||||
|
stosb
|
||||||
|
|
||||||
|
loc_not_signed:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>稥 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢮ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
fclex
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD>࠭<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ࠢ<EFBFBD><EFBFBD><EFBFBD>饥 <EFBFBD><EFBFBD>
|
||||||
|
fstcw [old_cw]
|
||||||
|
; <EFBFBD><EFBFBD>⠭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ࠢ<EFBFBD><EFBFBD><EFBFBD>饥 <EFBFBD><EFBFBD>
|
||||||
|
mov [new_cw],0000001001111111b
|
||||||
|
fldcw [new_cw]
|
||||||
|
lea esi,[saved_float]
|
||||||
|
fld tbyte [esi]
|
||||||
|
fld st
|
||||||
|
; <EFBFBD>뤥<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD>冷<EFBFBD>
|
||||||
|
fxtract
|
||||||
|
fstp st
|
||||||
|
fldlg2
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢮ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>
|
||||||
|
fmulp st1,st
|
||||||
|
fistp [digits_count]
|
||||||
|
; <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 16, <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>⮡ࠦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>
|
||||||
|
; <EFBFBD><EFBFBD>ଠ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ᮩ <EFBFBD> <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD>⮩
|
||||||
|
cmp [digits_count],10h
|
||||||
|
jnb loc_not_integer
|
||||||
|
; <EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
fld st
|
||||||
|
frndint
|
||||||
|
fcomp st1
|
||||||
|
fstsw ax
|
||||||
|
test ah,01000000b
|
||||||
|
; <EFBFBD><EFBFBD>, <EFBFBD>⮡ࠦ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
jz loc_not_integer
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
lea eax,[tmp1]
|
||||||
|
fbstp [eax]
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD>ॢ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> BCD-<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD>
|
||||||
|
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
|
||||||
|
|
||||||
|
; <EFBFBD>ய<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>騩 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
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
|
||||||
|
@@:
|
||||||
|
; <EFBFBD><EFBFBD>७<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>६<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
rep movsb
|
||||||
|
jmp loc_clear_stack
|
||||||
|
|
||||||
|
loc_not_integer:
|
||||||
|
mov eax,10h
|
||||||
|
sub eax,[digits_count]
|
||||||
|
|
||||||
|
; <EFBFBD>८<EFBFBD>ࠧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD> 楫<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 16 ࠧ<EFBFBD>冷<EFBFBD>
|
||||||
|
mov ecx,eax
|
||||||
|
cmp eax,0
|
||||||
|
jge @f
|
||||||
|
neg eax
|
||||||
|
@@:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ᥫ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <EFBFBD><EFBFBD><EFBFBD>४<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>㣫<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0
|
||||||
|
mov [new_cw],0000101001111111b
|
||||||
|
cmp ecx,0
|
||||||
|
jge @f
|
||||||
|
mov [new_cw],0000011001111111b
|
||||||
|
@@:
|
||||||
|
; <EFBFBD><EFBFBD>⠭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ࠢ<EFBFBD><EFBFBD><EFBFBD>饥 <EFBFBD><EFBFBD>
|
||||||
|
fldcw [new_cw]
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10 <EFBFBD> <EFBFBD>⥯<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⢠ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
fld [float2]
|
||||||
|
fld [float2]
|
||||||
|
@@:
|
||||||
|
fmul st,st1
|
||||||
|
dec eax
|
||||||
|
cmp eax,1
|
||||||
|
ja @b
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>⥪
|
||||||
|
fxch st1
|
||||||
|
fstp st
|
||||||
|
|
||||||
|
; <EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0, <EFBFBD><EFBFBD> 㬭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ࠧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
cmp ecx,0
|
||||||
|
jge @f
|
||||||
|
fdivp st1,st
|
||||||
|
jmp loc_rounded
|
||||||
|
@@:
|
||||||
|
fmulp st1,st
|
||||||
|
|
||||||
|
loc_rounded:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1.0e16 ?
|
||||||
|
fcom [float1]
|
||||||
|
fstsw ax
|
||||||
|
test ah,1
|
||||||
|
jz @f
|
||||||
|
fmul [float2]
|
||||||
|
dec [digits_count]
|
||||||
|
@@:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
lea eax,[tmp1]
|
||||||
|
fbstp [eax]
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD>ॢ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> BCD-<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD>
|
||||||
|
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
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ॡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||||
|
lea esi,[tmp2+1]
|
||||||
|
mov ecx,[digits_count]
|
||||||
|
cmp ecx,-0Fh
|
||||||
|
jl loc_mantiss_and_exponent
|
||||||
|
cmp ecx,10h
|
||||||
|
jg loc_mantiss_and_exponent
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
|
||||||
|
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]
|
||||||
|
|
||||||
|
loc_fraction_filled:
|
||||||
|
rep movsb
|
||||||
|
jmp @f
|
||||||
|
|
||||||
|
loc_clear_fraction:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>騥 <EFBFBD>㫨 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
dec edi
|
||||||
|
@@:
|
||||||
|
cmp byte [edi-1],'0'
|
||||||
|
jz loc_clear_fraction
|
||||||
|
cmp byte [edi-1],'.'
|
||||||
|
jnz @f
|
||||||
|
dec edi
|
||||||
|
@@:
|
||||||
|
jmp loc_clear_stack
|
||||||
|
|
||||||
|
loc_mantiss_and_exponent:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
movsb
|
||||||
|
mov al,'.'
|
||||||
|
stosb
|
||||||
|
movsd
|
||||||
|
movsd
|
||||||
|
movsw
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>騥 <EFBFBD>㫨 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
@@:
|
||||||
|
cmp byte [edi-1],'0'
|
||||||
|
jne @f
|
||||||
|
cmp byte [edi-2],'.'
|
||||||
|
je @f
|
||||||
|
dec edi
|
||||||
|
jmp @b
|
||||||
|
@@:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov al,'e'
|
||||||
|
stosb
|
||||||
|
mov al,'+'
|
||||||
|
mov ebx,[digits_count]
|
||||||
|
cmp ebx, 0
|
||||||
|
jge @f
|
||||||
|
mov al,'-'
|
||||||
|
neg ebx
|
||||||
|
@@:
|
||||||
|
stosb
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD>祭<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
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
|
||||||
|
|
||||||
|
; <EFBFBD>ய<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>騥 <EFBFBD>㫨 <EFBFBD><EFBFBD>ᯮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
mov ecx,4
|
||||||
|
lea esi,[tmp1]
|
||||||
|
@@:
|
||||||
|
lodsb
|
||||||
|
cmp al,'0'
|
||||||
|
jne @f
|
||||||
|
dec ecx
|
||||||
|
jmp @b
|
||||||
|
@@:
|
||||||
|
dec esi
|
||||||
|
rep movsb
|
||||||
|
|
||||||
|
loc_clear_stack:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD>⠭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ࠢ<EFBFBD><EFBFBD><EFBFBD>饥 <EFBFBD><EFBFBD>
|
||||||
|
fldcw [old_cw]
|
||||||
|
loc_ret:
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD>砭<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ப<EFBFBD>
|
||||||
|
mov al,0
|
||||||
|
stosb
|
||||||
|
|
||||||
|
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD>⠭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> ॣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
float1 dq 1.0e16
|
||||||
|
float2 dq 10.0
|
||||||
|
|
||||||
|
endp
|
34
programs/develop/libraries/utils/trunk/_rand.inc
Normal file
34
programs/develop/libraries/utils/trunk/_rand.inc
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
; <EFBFBD>㭪<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>樨 <EFBFBD><EFBFBD><EFBFBD>砩<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0..99999 |
|
||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
; <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>室<EFBFBD> : eax - <EFBFBD><EFBFBD><EFBFBD>砩<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> |
|
||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
_random:
|
||||||
|
push edx ecx ebx
|
||||||
|
mov eax,ebx
|
||||||
|
or eax,eax
|
||||||
|
jnz @f
|
||||||
|
rdtsc
|
||||||
|
xor eax,edx
|
||||||
|
mov ebx,eax
|
||||||
|
@@:
|
||||||
|
xor edx,edx
|
||||||
|
mov ecx,127773
|
||||||
|
div ecx
|
||||||
|
mov ecx,eax
|
||||||
|
mov eax,16807
|
||||||
|
mul edx
|
||||||
|
mov edx,ecx
|
||||||
|
mov ecx,eax
|
||||||
|
mov eax,2836
|
||||||
|
mul edx
|
||||||
|
sub ecx,eax
|
||||||
|
xor edx,edx
|
||||||
|
mov eax,ecx
|
||||||
|
mov ebx,ecx
|
||||||
|
mov ecx,100000
|
||||||
|
div ecx
|
||||||
|
mov eax,edx
|
||||||
|
pop ebx ecx edx
|
||||||
|
ret
|
||||||
|
;->
|
2
programs/develop/libraries/utils/trunk/build.bat
Normal file
2
programs/develop/libraries/utils/trunk/build.bat
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
@fasm -m 65536 utils.asm utils.obj
|
||||||
|
@kpack utils.obj
|
88
programs/develop/libraries/utils/trunk/example/demo.asm
Normal file
88
programs/develop/libraries/utils/trunk/example/demo.asm
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
;-----------------------------------------------------------------------------;
|
||||||
|
; =[ INIT ]= ;
|
||||||
|
;-----------------------------------------------------------------------------;
|
||||||
|
;; START:
|
||||||
|
call utils_init
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------;
|
||||||
|
; =[ USE ]= ;
|
||||||
|
;-----------------------------------------------------------------------------;
|
||||||
|
push fvalue ; value dt (XXXXX.XXXXX)
|
||||||
|
push fstring ; ASCIIZ string (rb 64)
|
||||||
|
call [_ftoa] ; convert
|
||||||
|
|
||||||
|
push fstring ; ASCIIZ string ('XXXX.XXXXXX',0)
|
||||||
|
push fvalue ; value dt (?)
|
||||||
|
call [_atof] ; EAX: 0 - error, 1 - convert
|
||||||
|
|
||||||
|
call [_random] ; EAX: random digit [0...99999]
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------;
|
||||||
|
; =[ LOAD ]= ;
|
||||||
|
;-----------------------------------------------------------------------------;
|
||||||
|
utils_init:
|
||||||
|
mov eax, 68 ; load DLL
|
||||||
|
mov ebx, 19 ;
|
||||||
|
mov ecx, utils_lib
|
||||||
|
int 0x40
|
||||||
|
test eax, eax
|
||||||
|
jz utils_exit
|
||||||
|
|
||||||
|
mov edx, eax ; initialize import
|
||||||
|
mov esi, utils_import ; import list
|
||||||
|
utils_loop:
|
||||||
|
lodsd
|
||||||
|
test eax, eax
|
||||||
|
jz utils_done
|
||||||
|
push edx
|
||||||
|
utils_find:
|
||||||
|
mov ebx, [edx]
|
||||||
|
test ebx, ebx
|
||||||
|
jz utils_exit ;import_not_found
|
||||||
|
push eax
|
||||||
|
@@:
|
||||||
|
mov cl, [eax]
|
||||||
|
cmp cl, [ebx]
|
||||||
|
jnz utils_next
|
||||||
|
test cl, cl
|
||||||
|
jz utils_found
|
||||||
|
inc eax
|
||||||
|
inc ebx
|
||||||
|
jmp @b
|
||||||
|
utils_next:
|
||||||
|
pop eax
|
||||||
|
add edx, 8
|
||||||
|
jmp utils_find
|
||||||
|
utils_found:
|
||||||
|
pop eax
|
||||||
|
mov eax, [edx+4]
|
||||||
|
mov [esi-4], eax
|
||||||
|
pop edx
|
||||||
|
jmp utils_loop
|
||||||
|
utils_done:
|
||||||
|
ret
|
||||||
|
utils_exit:
|
||||||
|
mov eax, -1
|
||||||
|
int 0x40
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------;
|
||||||
|
; =[ DATA ]= ;
|
||||||
|
;-----------------------------------------------------------------------------;
|
||||||
|
fvalue dt -502556.267e600 ; dt ?
|
||||||
|
fstring db rb 100 ; '-15.246789',0
|
||||||
|
|
||||||
|
utils_lib db '/sys/lib/utils.obj',0 ; path
|
||||||
|
|
||||||
|
align 4
|
||||||
|
utils_import:
|
||||||
|
_ftoa dd ftoa
|
||||||
|
_atof dd atof
|
||||||
|
_random dd random
|
||||||
|
dd 0
|
||||||
|
|
||||||
|
ftoa db 'ftoa',0
|
||||||
|
atof db 'atof',0
|
||||||
|
random db 'random',0
|
||||||
|
;-----------------------------------------------------------------------------;
|
||||||
|
|
||||||
|
|
64
programs/develop/libraries/utils/trunk/utils.asm
Normal file
64
programs/develop/libraries/utils/trunk/utils.asm
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
; Library "utils" (c) Sergei Steshin (Akyltist) |
|
||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
; Charset:DOS-866 Font:Courier New Size:9pt |
|
||||||
|
; compiler: FASM 1.69.31 |
|
||||||
|
; version: 0.1.0 |
|
||||||
|
; last update: 31/03/2014 |
|
||||||
|
; e-mail: dr.steshin@gmail.com |
|
||||||
|
; license: BSD |
|
||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
|
||||||
|
format MS COFF
|
||||||
|
|
||||||
|
public EXPORTS
|
||||||
|
|
||||||
|
section '.flat' code readable writable align 16
|
||||||
|
|
||||||
|
include '../../../../proc32.inc'
|
||||||
|
include '_ftoa.inc'
|
||||||
|
include '_atof.inc'
|
||||||
|
include '_rand.inc'
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
; float to ascii string |
|
||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
ftoa: ;
|
||||||
|
mov ebx, dword [esp+4] ; out string
|
||||||
|
mov eax, dword [esp+8] ; in value
|
||||||
|
stdcall FloatToString,eax,ebx ;
|
||||||
|
ret 8 ;
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
; ascii string to float |
|
||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
atof: ;
|
||||||
|
mov ebx, dword [esp+4] ; out <- value
|
||||||
|
mov eax, dword [esp+8] ; in -> string
|
||||||
|
stdcall string2float,eax,ebx ;
|
||||||
|
ret 8 ;
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
; returns a random integer in the range [ 0...99999 ] |
|
||||||
|
;-----------------------------------------------------------------------------+
|
||||||
|
random: ;
|
||||||
|
call _random ; out <- eax random
|
||||||
|
ret ;
|
||||||
|
|
||||||
|
;=============================================================================;
|
||||||
|
align 16
|
||||||
|
EXPORTS:
|
||||||
|
dd szFtoa , ftoa
|
||||||
|
dd szAtof , atof
|
||||||
|
dd szRandom , random
|
||||||
|
dd 0 , 0
|
||||||
|
|
||||||
|
szFtoa db 'ftoa' ,0
|
||||||
|
szAtof db 'atof' ,0
|
||||||
|
szRandom db 'random' ,0
|
||||||
|
|
||||||
|
section '.data' data readable writable align 16
|
||||||
|
|
Reference in New Issue
Block a user