Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;-----------------------------------------------------------------------------+
  2. ; ”ã­ªæ¨ï ¯¥à¥¢®¤  ¢¥é¥á⢥­­®£® ç¨á«  ¢ áâà®ªã      [ by ManHunter / PCL ]   |
  3. ;-----------------------------------------------------------------------------|
  4. ;  à ¬¥âàë:                                                                  |
  5. ;   lpFloat - 㪠§ â¥«ì ­  ¢¥é¥á⢥­­®¥ ç¨á«® TBYTE                           |
  6. ;   lpResult - 㪠§ â¥«ì ­  áâபã-¯à¨¥¬­¨ª १ã«ìâ â                         |
  7. ;-----------------------------------------------------------------------------+
  8.  
  9. proc    FloatToString lpFloat:DWORD, lpResult:DWORD
  10.     ; ‹®ª «ì­ë¥ ¯¥à¥¬¥­­ë¥
  11.     local   digits_count:DWORD
  12.     local   old_cw:WORD
  13.     local   new_cw:WORD
  14.     local   saved_float:TBYTE
  15.     local   tmp1 rb 11h
  16.     local   tmp2 rb 11h
  17.  
  18.     ; ‘®åà ­¨âì ¢á¥ à¥£¨áâàë
  19.     pusha
  20.  
  21.     ; “ª § â¥«ì ­  áâபã-¯à¨¥¬­¨ª
  22.     mov     edi,[lpResult]
  23.  
  24.     ; â® ­®«ì?
  25.     lea     esi,[lpFloat]
  26.     cmp     dword [esi],0
  27.     jne     loc_not_zero
  28.     cmp     dword [esi+4],0
  29.     jne     loc_not_zero
  30.     cmp     word [esi+8],0
  31.     jne     loc_not_zero
  32.     ; ‡ ¯¨á âì ¢ áâப㠭®«ì
  33.     mov     al,'0'
  34.     stosb
  35.     jmp     loc_ret
  36.  
  37. loc_not_zero:
  38.     ; ‘ª®¯¨à®¢ âì ç¨á«® ¢ «®ª «ì­ãî ¯¥à¥¬¥­­ãî
  39.     push    edi
  40.     mov     esi,[lpFloat]
  41.     lea     edi,[saved_float]
  42.     movsd
  43.     movsd
  44.     movsw
  45.     pop     edi
  46.     ; —¨á«® ®âà¨æ â¥«ì­®¥?
  47.     cmp     dword [saved_float+6],0
  48.     jge     loc_not_signed
  49.     ; à¨¢¥á⨠ç¨á«® ª  ¡á®«îâ­®¬ã §­ ç¥­¨î
  50.     and     byte [saved_float+9],7Fh
  51.     ; ‡ ¯¨á âì ¢ áâப㠬¨­ãá
  52.     mov     al,'-'
  53.     stosb
  54.  
  55. loc_not_signed:
  56.     ; à®¢¥à¨âì ç¨á«® ­  ­ «¨ç¨¥ ¤à®¡­®© ç á⨠¨
  57.     ; ¯®¤áç¨â âì ª®«¨ç¥á⢮ æ¨äà ¢ ­¥¬
  58.     fclex
  59.     ; ‘®åà ­¨âì ã¯à ¢«ïî饥 á«®¢®
  60.     fstcw   [old_cw]
  61.     ; “áâ ­®¢¨âì ã¯à ¢«ïî饥 á«®¢®
  62.     mov     [new_cw],0000001001111111b
  63.     fldcw   [new_cw]
  64.     lea     esi,[saved_float]
  65.     fld     tbyte [esi]
  66.     fld     st
  67.     ; ‚뤥«¨âì ¬ ­â¨ááã ¨ ¯®à冷ª
  68.     fxtract
  69.     fstp    st
  70.     fldlg2
  71.     ; ®«ãç¨âì ª®«¨ç¥á⢮ æ¨äà ¢ ç¨á«¥
  72.     fmulp   st1,st
  73.     fistp   [digits_count]
  74.     ; …᫨ æ¨äà ¡®«ìè¥ 16, â® ç¨á«® ®â®¡à ¦ ¥âáï ¢
  75.     ; ­®à¬ «¨§®¢ ­­®¬ ¢¨¤¥ á ¬ ­â¨áᮩ ¨ íªá¯®­¥­â®©
  76.     cmp     [digits_count],10h
  77.     jnb     loc_not_integer
  78.     ; “ ç¨á«  ¥áâì ¤à®¡­ ï ç áâì?
  79.     fld     st
  80.     frndint
  81.     fcomp   st1
  82.     fstsw   ax
  83.     test    ah,01000000b
  84.     ; „ , ®â®¡à ¦ âì ç¨á«® á ¤à®¡­®© ç áâìî
  85.     jz      loc_not_integer
  86.  
  87.     ; –¥«®¥ ç¨á«® ¡¥§ ¤à®¡­®© ç á⨠¨ íªá¯®­¥­âë
  88.     lea     eax,[tmp1]
  89.     fbstp   [eax]
  90.  
  91.     ; ¥à¥¢¥á⨠BCD-ç¨á«® ¢ áâபã
  92.     push    edi
  93.     lea     esi,[tmp1+8]
  94.     lea     edi,[tmp2]
  95.     mov     ecx, 9
  96. @@:
  97.     std
  98.     xor     eax,eax
  99.     lodsb
  100.     cld
  101.     rol     ax,12
  102.     rol     ah,4
  103.     add     ax,'00'
  104.     stosw
  105.     loop    @b
  106.     pop     edi
  107.  
  108.     ; à®¯ãáâ¨âì «¨¤¨àãî騩 ­®«ì
  109.     mov     eax,11h
  110.     mov     ecx,[digits_count]
  111.     sub     eax,ecx
  112.     inc     ecx
  113.     lea     esi,[tmp2+eax]
  114.     cmp     byte [esi],'0'
  115.     jne     @f
  116.     inc     esi
  117.     dec     ecx
  118. @@:
  119.     ; ¥à¥­¥á⨠¯®«ã祭­®¥ ç¨á«® ¨§ ¢à¥¬¥­­®£® ¡ãä¥à 
  120.     rep     movsb
  121.     jmp     loc_clear_stack
  122.  
  123. loc_not_integer:
  124.     mov     eax,10h
  125.     sub     eax,[digits_count]
  126.  
  127.     ; à¥®¡à §®¢ âì ç¨á«® ¢ 楫®¥ ¤® 16 à §à冷¢
  128.     mov     ecx,eax
  129.     cmp     eax,0
  130.     jge     @f
  131.     neg     eax
  132. @@:
  133.     ; „«ï ç¨á¥« ¡®«ìè¥ 0 ª®à४â¨à®¢ª  ®ªà㣫¥­¨ï ¢ áâ®à®­ã 0
  134.     mov     [new_cw],0000101001111111b
  135.     cmp     ecx,0
  136.     jge     @f
  137.     mov     [new_cw],0000011001111111b
  138. @@:
  139.     ; “áâ ­®¢¨âì ã¯à ¢«ïî饥 á«®¢®
  140.     fldcw   [new_cw]
  141.  
  142.     ; ‚®§¢¥á⨠10 ¢ á⥯¥­ì ª®«¨ç¥á⢠ æ¨äà
  143.     fld     [float2]
  144.     fld     [float2]
  145. @@:
  146.     fmul    st,st1
  147.     dec     eax
  148.     cmp     eax,1
  149.     ja      @b
  150.  
  151.     ; ®ç¨áâ¨âì á⥪
  152.     fxch    st1
  153.     fstp    st
  154.  
  155.     ; …᫨ ç¨á«® ¬¥­ìè¥ 0, ⮠㬭®¦¨âì, ¨­ ç¥ à §¤¥«¨âì
  156.     cmp     ecx,0
  157.     jge     @f
  158.     fdivp   st1,st
  159.     jmp     loc_rounded
  160. @@:
  161.     fmulp   st1,st
  162.  
  163. loc_rounded:
  164.     ; ®«ã祭­®¥ §­ ç¥­¨¥ ¬¥­ìè¥ 1.0e16 ?
  165.     fcom    [float1]
  166.     fstsw   ax
  167.     test    ah,1
  168.     jz      @f
  169.     fmul    [float2]
  170.     dec     [digits_count]
  171. @@:
  172.     ; –¥«®¥ ç¨á«® ¡¥§ ¤à®¡­®© ç á⨠¨ íªá¯®­¥­âë
  173.     lea     eax,[tmp1]
  174.     fbstp   [eax]
  175.  
  176.     ; ¥à¥¢¥á⨠BCD-ç¨á«® ¢ áâபã
  177.     push    edi
  178.     lea     esi,[tmp1+8]
  179.     lea     edi,[tmp2]
  180.     mov     ecx, 9
  181. @@:
  182.     std
  183.     xor     eax,eax
  184.     lodsb
  185.     cld
  186.     rol     ax,12
  187.     rol     ah,4
  188.     add     ax,'00'
  189.     stosw
  190.     loop    @b
  191.     pop     edi
  192.  
  193.     ; —¨á«ã âॡã¥âáï ¬ ­â¨áá  ¨ íªá¯®­¥­â ?
  194.     lea     esi,[tmp2+1]
  195.     mov     ecx,[digits_count]
  196.     cmp     ecx,-0Fh
  197.     jl      loc_mantiss_and_exponent
  198.     cmp     ecx,10h
  199.     jg      loc_mantiss_and_exponent
  200.  
  201.     ; ‡ ¯®«­¨âì ¤à®¡­ãî ç áâì ç¨á« 
  202.     inc     ecx
  203.     cmp     ecx,0
  204.     jg      @f
  205.     mov     ax,'0.'
  206.     stosw
  207.     neg     ecx
  208.     mov     al,'0'
  209.     rep     stosb
  210.     mov     ecx,10h
  211.     jmp     loc_fraction_filled
  212. @@:
  213.     rep     movsb
  214.     mov     al,'.'
  215.     stosb
  216.     mov     ecx,10h
  217.     sub     ecx,[digits_count]
  218.  
  219. loc_fraction_filled:
  220.     rep     movsb
  221.     jmp     @f
  222.  
  223. loc_clear_fraction:
  224.     ; “¤ «¨âì § ¢¥àè î騥 ­ã«¨ ¤à®¡­®© ç áâ¨
  225.     dec     edi
  226. @@:
  227.     cmp     byte [edi-1],'0'
  228.     jz      loc_clear_fraction
  229.     cmp     byte [edi-1],'.'
  230.     jnz     @f
  231.     dec     edi
  232. @@:
  233.     jmp     loc_clear_stack
  234.  
  235. loc_mantiss_and_exponent:
  236.     ; „஡­ ï ç áâì ¬ ­â¨ááë
  237.     movsb
  238.     mov     al,'.'
  239.     stosb
  240.     movsd
  241.     movsd
  242.     movsw
  243.     ; “¤ «¨âì § ¢¥àè î騥 ­ã«¨ ¤à®¡­®© ç áâ¨
  244. @@:
  245.     cmp     byte [edi-1],'0'
  246.     jne     @f
  247.     cmp     byte [edi-2],'.'
  248.     je      @f
  249.     dec     edi
  250.     jmp     @b
  251. @@:
  252.     ; ‘¨¬¢®« ¨ §­ ª íªá¯®­¥­âë
  253.     mov     al,'e'
  254.     stosb
  255.     mov     al,'+'
  256.     mov     ebx,[digits_count]
  257.     cmp     ebx, 0
  258.     jge     @f
  259.     mov     al,'-'
  260.     neg     ebx
  261. @@:
  262.     stosb
  263.  
  264.     ; ‡­ ç¥­¨¥ íªá¯®­¥­âë
  265.     mov     eax,ebx
  266.     mov     ecx,10
  267.     mov     ebx,4
  268. @@:
  269.     dec     ebx
  270.     xor     edx,edx
  271.     div     ecx
  272.     add     dl,'0'
  273.     mov     [tmp1+ebx],dl
  274.     or      ebx,ebx
  275.     jnz     @b
  276.  
  277.     ; à®¯ãáâ¨âì «¨¤¨àãî騥 ­ã«¨ íªá¯®­¥­âë
  278.     mov     ecx,4
  279.     lea     esi,[tmp1]
  280. @@:
  281.     lodsb
  282.     cmp     al,'0'
  283.     jne     @f
  284.     dec     ecx
  285.     jmp     @b
  286. @@:
  287.     dec     esi
  288.     rep     movsb
  289.  
  290. loc_clear_stack:
  291.     ; ‚®ááâ ­®¢¨âì ã¯à ¢«ïî饥 á«®¢®
  292.     fldcw   [old_cw]
  293. loc_ret:
  294.     ; Žª®­ç ­¨¥ áâப¨
  295.     mov     al,0
  296.     stosb
  297.  
  298.     ; ‚®ááâ ­®¢¨âì ¢á¥ à¥£¨áâàë
  299.     popa
  300.     ret
  301.  
  302. float1  dq      1.0e16
  303. float2  dq      10.0
  304.  
  305. endp