Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ; ä㭪樨 ¤«ï à ¡®âë á ç¨á« ¬¨ float
  3. ;
  4.  
  5. ; Š®«¨ç¥á⢮ §­ ª®¢ ç¨á«  ¯®á«¥ § ¯ï⮩ (1-17)
  6. NumberSymbolsAD DW 5
  7. ; Š®­áâ ­âë (10 ¢ á⥯¥­¨ N)
  8. MConst DQ 1.0E1,1.0E2,1.0E3,1.0E4,1.0E5
  9.        DQ 1.0E6,1.0E7,1.0E8,1.0E9,1.0E10
  10.        DQ 1.0E11,1.0E12,1.0E13,1.0E14,1.0E15
  11.        DQ 1.0E16,1.0E17,1.0E18,1.0E19,1.0E20
  12.        DQ 1.0E21,1.0E22,1.0E23,1.0E24,1.0E25
  13.        DQ 1.0E26,1.0E27,1.0E28,1.0E29,1.0E30
  14.        DQ 1.0E31,1.0E32,1.0E33,1.0E34,1.0E35
  15.        DQ 1.0E36,1.0E37,1.0E38,1.0E39,1.0E40
  16.        DQ 1.0E41,1.0E42,1.0E43,1.0E44,1.0E45
  17.        DQ 1.0E46,1.0E47,1.0E48,1.0E49,1.0E50
  18.        DQ 1.0E51,1.0E52,1.0E53,1.0E54,1.0E55
  19.        DQ 1.0E56,1.0E57,1.0E58,1.0E59,1.0E60
  20.        DQ 1.0E61,1.0E62,1.0E63,1.0E64,1.0E65
  21.        DQ 1.0E66,1.0E67,1.0E68,1.0E69,1.0E70
  22.        DQ 1.0E71,1.0E72,1.0E73,1.0E74,1.0E75
  23.        DQ 1.0E76,1.0E77,1.0E78,1.0E79,1.0E80
  24.        DQ 1.0E81,1.0E82,1.0E83,1.0E84,1.0E85
  25.        DQ 1.0E86,1.0E87,1.0E88,1.0E89,1.0E90
  26.        DQ 1.0E91,1.0E92,1.0E93,1.0E94,1.0E95
  27.        DQ 1.0E96,1.0E97,1.0E98,1.0E99,1.0E100
  28.        DQ 1.0E101,1.0E102,1.0E103,1.0E104,1.0E105
  29.        DQ 1.0E106,1.0E107,1.0E108,1.0E109,1.0E110
  30.        DQ 1.0E111,1.0E112,1.0E113,1.0E114,1.0E115
  31.        DQ 1.0E116,1.0E117,1.0E118,1.0E119,1.0E120
  32.        DQ 1.0E121,1.0E122,1.0E123,1.0E124,1.0E125
  33.        DQ 1.0E126,1.0E127,1.0E128
  34. ; —¨á«® á ¯« ¢ î饩 § ¯ï⮩ ¤¢®©­®© â®ç­®áâ¨
  35. Data_Double   DQ ?
  36. ; —¨á«® ¢ BCD-ä®à¬ â¥
  37. Data_BCD      DT ?
  38. ; ‚ᯮ¬®£ â¥«ì­ë© ä« £
  39. Data_Flag     DB ?
  40. ; ‡­ ª १ã«ìâ â  (¥á«¨ ­¥ 0 - ®âà¨æ â¥«ì­®¥ ç¨á«®)
  41. Data_Sign     DB ?
  42. ; ‡­ ª १ã«ìâ â  - 0 ¤«ï ..e+.. ¨ 1 ¤«ï ..e-..
  43. Data_Sign_Exp DB ?
  44.  
  45. align 4
  46. ; ‘âப  ¤«ï åà ­¥­¨ï ç¨á«  ¢ ª®¤¥ ASCII
  47. Data_String   DB 32 DUP (?)
  48.  
  49.  
  50.  
  51. ;*******************************************************
  52. ;*  …Ž€‡Ž‚€ˆ… —ˆ‘‹€ ‘ ‹€‚€ž™…‰ ‡€Ÿ’Ž‰ ‚ ‘’ŽŠ“  *
  53. ;* —¨á«® ¨¬¥¥â ä®à¬ â á 㤢®¥­­®© â®ç­®áâìî, १ã«ìâ â *
  54. ;* ¢ë¤ ¥âáï ¢ ¤¥áïâ¨ç­®¬ ª®¤¥, ¢ "¡ë⮢®¬" ä®à¬ â¥ á   *
  55. ;* 䨪á¨à®¢ ­­ë¬ ª®«¨ç¥á⢮¬ §­ ª®¢ ¯®á«¥ § ¯ï⮩.     *
  56. ;* ‚室­ë¥ ¯ à ¬¥âàë:                                  *
  57. ;* Data_Double - ¯à¥®¡à §ã¥¬®¥ ç¨á«®;                  *
  58. ;* NumberSymbolsAD - ª®«¨ç¥á⢮ §­ ª®¢ ¯®á«¥           *
  59. ;*                   § ¯ï⮩ (0-17).                   *
  60. ;* ‚ë室­ë¥ ¯ à ¬¥âàë:                                 *
  61. ;* Data_String - áâப -१ã«ìâ â.                     *
  62. ;*******************************************************
  63. align 4
  64. DoubleFloat_to_String:
  65.         pushad
  66.         ; ¥§ã«ìâ â § ¯¨á뢠âì ¢ áâபã Data_String
  67.         mov     EDI, Data_String
  68.  
  69.         ; ‘¤¢¨£ ¥¬ ç¨á«® ¢«¥¢® ­  NumberSymbolsAD
  70.         ; ¤¥áïâ¨ç­ëå à §à冷¢
  71.         fninit                 ;á¡à®á ᮯà®æ¥áá®à 
  72.         fld     [Data_Double]  ;§ £à㧨âì ç¨á«®
  73.         xor ebx,ebx
  74.         mov     BX,[NumberSymbolsAD]
  75.         cmp     BX, 0
  76.         je      .NoShifts     ;­¥â æ¨äà ¯®á«¥ § ¯ï⮩
  77.         jl      .Error        ;®è¨¡ª 
  78.         dec     BX
  79.         lea ebx,[MConst+8*ebx]
  80.         fmul    qword [EBX] ;㬭®¦¨âì ­  ª®­áâ ­âã
  81. .NoShifts:
  82.         ; ˆ§¢«¥çì ç¨á«® ¢ ª®¤¥ BCD
  83.         fbstp   [Data_BCD]
  84. ; à®¢¥à¨âì १ã«ìâ â ­  ¯¥à¥¯®«­¥­¨¥
  85.         mov     AX,word [Data_BCD + 8]
  86.         cmp     AX,0FFFFh  ;"¤¥áïâ¨ç­®¥" ¯¥à¥¯®«­¥­¨¥?
  87.         je      .Overflow
  88. ; ‚뤥«¨âì §­ ª ç¨á«  ¨ § ¯¨á âì ¥£® ¢ ASCII-ª®¤¥
  89.         mov     AL, byte [Data_BCD + 9]
  90.         and     AL,AL
  91.         jz      .NoSign
  92.         mov     AL,'-'
  93.         stosb
  94. .NoSign:
  95. ;  á¯ ª®¢ âì ç¨á«® ¢ ª®¤ ASCII
  96.         mov     ebx,8    ;ᬥ饭¨¥ ¯®á«¥¤­¥© ¯ àë æ¨äà
  97.         mov     ecx,9    ;áç¥â稪 ¯ à æ¨äà
  98.         ; Ž¯à¥¤¥«¨âì ¯®§¨æ¨î ¤¥áïâ¨ç­®© â®çª¨ ¢ ç¨á«¥
  99.         mov     DX,18
  100.         sub     DX,[NumberSymbolsAD]
  101.         js      .Error  ;®è¨¡ª , ¥á«¨ ®âà¨æ â¥«ì­ ï
  102.         jz      .Error  ;¨«¨ ­ã«¥¢ ï ¯®§¨æ¨ï
  103. .NextPair:
  104.         ; ‡ £à㧨âì ®ç¥à¥¤­ãî ¯ àã à §à冷¢
  105.         mov     AL, byte [ebx + Data_BCD]
  106.         mov     AH,AL
  107.         ; ‚뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨
  108.         ; á®åà ­¨âì áâ àèãî â¥âà ¤ã
  109.         shr     AL,4
  110.         add     AL,'0'
  111.         stosb
  112.         dec     DX
  113.         jnz     .N0
  114.         mov     AL,'.'
  115.         stosb
  116. .N0:   ; ‚뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨
  117.         ; á®åà ­¨âì ¬« ¤èãî â¥âà ¤ã
  118.         mov     AL,AH
  119.         and     AL,0Fh
  120.         add     AL,'0'
  121.         stosb
  122.         dec     DX
  123.         jnz     .N1
  124.         mov     AL,'.'
  125.         stosb
  126. .N1:
  127.         dec  BX
  128.         loop .NextPair
  129.         mov  AL,0
  130.         stosb
  131.  
  132. ; “¡à âì ­¥§­ ç é¨¥ ­ã«¨ á«¥¢ 
  133.         mov     EDI, Data_String
  134.         mov     ESI, Data_String
  135.         ; à®¯ãáâ¨âì §­ ª ç¨á« , ¥á«¨ ®­ ¥áâì
  136.         cmp     byte [ESI],'-'
  137.         jne     .N2
  138.         inc     ESI
  139.         inc     EDI
  140. .N2:   ; ‡ £à㧨âì ¢ áç¥â稪 横«  ª®«¨ç¥á⢮ à §à冷¢
  141.         ; ç¨á«  ¯«îá 1 (¡ ©â ¤¥áïâ¨ç­®© â®çª¨)
  142.         mov     ecx,18+1+1
  143.         ; à®¯ãáâ¨âì ­¥§­ ç é¨¥ ­ã«¨
  144. .N3:
  145.         cmp byte [ESI],'0'
  146.         jne .N4
  147.         cmp byte [ESI+1],'.'
  148.         je .N4
  149.         inc ESI
  150.         loop .N3
  151.         ; Žè¨¡ª  - ­¥â §­ ç é¨å æ¨äà
  152.         jmp     .Error
  153. ; ‘ª®¯¨à®¢ âì §­ ç éãî ç áâì ç¨á«  ¢ ­ ç «® áâப¨
  154. align 4
  155. .N4:    rep movsb
  156.         jmp    .End
  157. ; Žè¨¡ª 
  158. align 4
  159. .Error:
  160.         mov     AL,'E'
  161.         stosb
  162.         mov     AL,'R'
  163.         stosb
  164.         mov     AL,'R'
  165.         stosb
  166.         xor     AL,AL
  167.         stosb
  168.         jmp     .End
  169. ; ¥à¥¯®«­¥­¨¥ à §à來®© á¥âª¨
  170. align 4
  171. .Overflow:
  172.         mov     AL,'#'
  173.         stosb
  174.         xor     AL,AL
  175.         stosb
  176. ; Š®­¥æ ¯à®æ¥¤ãàë
  177. align 4
  178. .End:
  179.         popad
  180.         ret
  181.  
  182. ;****************************************************
  183. ;* …Ž€‡Ž‚€’œ ‘’ŽŠ“ ‚ —ˆ‘‹Ž ‘ ‹€‚€ž™…‰ ‡€Ÿ’Ž‰ *
  184. ;*      (ç¨á«® ¨¬¥¥â ®¡ëç­ë©, "¡ë⮢®©" ä®à¬ â)     *
  185. ;* ‚室­ë¥ ¯ à ¬¥âàë:                               *
  186. ;* Data_String - ç¨á«® ¢ ª®¤¥ ASCII.                *
  187. ;* ‚ë室­ë¥ ¯ à ¬¥âàë:                              *
  188. ;* Data_Double - ç¨á«® ¢ ¤¢®¨ç­®¬ ª®¤¥.             *
  189. ;****************************************************
  190. align 4
  191. String_to_DoubleFloat:
  192.         pushad
  193.         cld
  194.         ; Žç¨é ¥¬ Data_BCD
  195.         mov dword [Data_BCD],0
  196.         mov dword [Data_BCD+4],0
  197.         mov  word [Data_BCD+8],0
  198.         ; Žç¨é ¥¬ ¡ ©â §­ ª 
  199.         mov     [Data_Sign],0
  200.         ; ‡ ­®á¨¬ ¢ esi 㪠§ â¥«ì ­  áâபã
  201.         mov     esi, Data_String
  202.         ; à®¯ã᪠¥¬ ¯à®¡¥«ë ¯¥à¥¤ ç¨á«®¬
  203.         mov     ecx,64 ;§ é¨â  ®â § æ¨ª«¨¢ ­¨ï
  204. .ShiftIgnore:
  205.         lodsb
  206.         cmp     al,' '
  207.         jne .ShiftIgnoreEnd
  208.         loop .ShiftIgnore
  209.         jmp .Error
  210. align 4
  211. .ShiftIgnoreEnd:
  212.         ; à®¢¥à塞 §­ ª ç¨á« 
  213.         cmp     al,'-'
  214.         jne     .Positive
  215.         mov     [Data_Sign],80h
  216.         lodsb
  217. .Positive:
  218.         mov     [Data_Flag],0 ;¯à¨§­ ª ­ «¨ç¨ï â®çª¨
  219.         xor     edx,edx       ;¯®§¨æ¨ï â®çª¨
  220.         mov     ecx,18        ;¬ ªá. ç¨á«® à §à冷¢
  221. align 4
  222. .ASCIItoBCDConversion:
  223.         cmp     al,'.'        ;â®çª ?
  224.         jne     .NotDot
  225.         cmp     [Data_Flag],0 ;â®çª  ­¥ ¢áâà¥ç « áì?
  226.         jne     .Error        ;¥á«¨ â®çª  㦥 ¡ë« 
  227.         mov     [Data_Flag],1
  228.         lodsb
  229.         or al,al              ;ª®­¥æ áâப¨?
  230.         jnz     .NotDot
  231.         jmp     .ASCIItoBCDConversionEnd
  232. align 4
  233. .NotDot:
  234.         ; “¢¥«¨ç¨âì ­  1 §­ ç¥­¨¥ ¯®§¨æ¨¨ â®çª¨,
  235.         ; ¥á«¨ ®­  ¥é¥ ­¥ ¢áâà¥ç « áì
  236.         cmp     [Data_Flag],0
  237.         jnz     .Figures
  238.         inc     edx
  239. .Figures:
  240.         cmp al,'e'
  241.         je .exp_form
  242.         cmp al,'E'
  243.         jne @f
  244.         .exp_form:
  245.                 call string_ExpForm ;¥á«¨ ç¨á«® ¢ ä®à¬ â¥ ..e..
  246.                 or al,al
  247.                 jnz .Error
  248.                 jmp     .ASCIItoBCDConversionEnd
  249.         @@:
  250.         ; ‘¨¬¢®«ë ç¨á«  ¤®«¦­ë ¡ëâì æ¨äà ¬¨
  251.         cmp     al,'0'
  252.         jb      .Error
  253.         cmp     al,'9'
  254.         ja      .Error
  255.         ; ¨è¥¬ ®ç¥à¥¤­ãî æ¨äàã ¢ ¬« ¤èãî â¥âà ¤ã BCD
  256.         and     al,15 ;ᨬ¢®«ë 0-9 ¯¥à¥¢®¤¨¬ ¢ ç¨á«®
  257.         or      byte [Data_BCD],al
  258.         ; à®¢¥àª  ­  ª®­¥æ áâப¨
  259.         cmp     byte [esi],0
  260.         je      .ASCIItoBCDConversionEnd
  261.         ; ‘¤¢¨£ ¥¬ BCD ­  4 à §à鸞 ¢«¥¢®
  262.         ; (ᤢ¨£ ¥¬ áâ à訥 2 ¡ ©â )
  263.         mov     ax,word [Data_BCD+6]
  264.         shld    word [Data_BCD+8],ax,4
  265.         ; (ᤢ¨£ ¥¬ á।­¨¥ 4 ¡ ©â )
  266.         mov     eax,dword [Data_BCD]
  267.         shld    dword [Data_BCD+4],eax,4
  268.         ; (ᤢ¨£ ¥¬ ¬« ¤è¨¥ 4 ¡ ©â )
  269.         shl     dword [Data_BCD],4
  270.         ; ‡ £à㦠¥¬ á«¥¤ãî騩 ᨬ¢®« ¢ AL
  271.         lodsb
  272.         loop .ASCIItoBCDConversion ;¥á«¨ ­¥ ª®¬¯¨«. â® ¯®áâ ¢¨âì dec ecx, jnz ...
  273.         ; …᫨ 19-© ᨬ¢®« ­¥ 0 ¨ ­¥ â®çª ,
  274.         ; â® ®è¨¡ª  ¯¥à¥¯®«­¥­¨ï
  275.         cmp     al,'.'
  276.         jne     .NotDot2
  277.         inc     ecx ;¯à®¯ã᪠â®çª¨ ¢ ª®­æ¥ ®ç¥­ì ¡®«ì讣® ç¨á« 
  278.         lodsb
  279. .NotDot2:
  280.         or al,al        ;¯¥à¥¯®«­¥­¨¥ à §à來®© á¥âª¨?
  281.         jz      .ASCIItoBCDConversionEnd
  282. align 4
  283. .Error: ; à¨ «î¡®© ®è¨¡ª¥ ®¡­ã«¨âì १ã«ìâ â
  284.         fldz    ;§ ­¥á⨠­®«ì á á⥪ ᮯà®æ¥áá®à 
  285.         fstp    [Data_Double]
  286.         jmp     .End
  287.  
  288. ; …Ž€‡Ž‚€’œ —ˆ‘‹Ž ˆ‡ ŠŽ„€ BCD ‚ ‚…™…‘’‚…Ž… —ˆ‘‹Ž
  289. .ASCIItoBCDConversionEnd:
  290.         ; ‚¯¨á âì §­ ª ¢ áâ à訩 ¡ ©â
  291.         mov     al,[Data_Sign]
  292.         mov     byte [Data_BCD+9],al
  293.         ; ‘¡à®á¨âì ॣ¨áâàë ᮯà®æ¥áá®à 
  294.         fninit
  295.         ; ‡ £à㧨âì ¢ ᮯà®æ¥áá®à ç¨á«® ¢ BCD-ä®à¬ â¥
  296.         fbld    [Data_BCD]
  297.         ; ‚ëç¨á«¨âì ­®¬¥à ¤¥«¨â¥«ï ¨«¨ ¬­®¦¨â¥«ï
  298.         lea ebx,[ecx+edx-18]
  299.         cmp ebx,0
  300.         jle .NoMul ;¥á«¨ ç¨á«® e-..
  301.         dec ebx
  302.         jz .NoDiv ;¥á«¨ ç¨á«® e+0
  303.         dec ebx
  304.         lea ebx,[MConst+8*ebx]
  305.         fmul qword [ebx] ;㬭®¦¨âì ­  ª®­áâ ­âã (¤«ï ç¨á¥« á ¯à¨áâ ¢ª®© e+..)
  306.         jmp .NoDiv
  307. .NoMul:
  308.         neg ebx
  309.         lea ebx,[MConst+8*ebx]
  310.         fdiv qword [ebx] ;à §¤¥«¨âì ­  ª®­áâ ­âã
  311. .NoDiv: ;‚ë£à㧨âì ç¨á«® ¢ ¤¢®¨ç­®¬ ä®à¬ â¥
  312.         fstp [Data_Double]
  313. .End:
  314.         popad
  315.         ret
  316.  
  317. ;output:
  318. ; eax - 1 if error
  319. ; edx += size
  320. align 4
  321. proc string_ExpForm uses ebx
  322.         mov [Data_Sign_Exp],0
  323.         xor eax,eax
  324.         lodsb
  325.         cmp al,'+'
  326.         jne @f
  327.                 lodsb
  328.         @@:
  329.         cmp al,'-'
  330.         jne @f
  331.                 inc [Data_Sign_Exp]
  332.                 lodsb
  333.         @@:
  334.        
  335.         xor ebx,ebx
  336.         .cycle0:
  337.                 cmp al,0
  338.                 je .cycle0end
  339.                 cmp al,9
  340.                 je .cycle0end
  341.                 cmp al,10
  342.                 je .cycle0end
  343.                 cmp al,13
  344.                 je .cycle0end
  345.                 cmp al,' '
  346.                 je .cycle0end
  347.                 cmp     al,'0'
  348.                 jb .Error
  349.                 cmp     al,'9'
  350.                 ja .Error
  351.        
  352.                 imul ebx,10
  353.                 and     eax,15 ;ᨬ¢®«ë 0-9 ¯¥à¥¢®¤¨¬ ¢ ç¨á«®
  354.                 add ebx,eax
  355.                 lodsb
  356.                 jmp .cycle0
  357.         .cycle0end:
  358.        
  359.         cmp [Data_Sign_Exp],0
  360.         je @f
  361.                 neg ebx
  362.         @@:
  363.         cmp     [Data_Flag],0 ;â®çª  ­¥ ¢áâà¥ç « áì?
  364.         jne @f
  365.                 dec edx
  366.         @@:
  367.         add edx,ebx
  368.  
  369.         xor eax,eax
  370.         jmp @f
  371.         .Error:
  372.                 xor eax,eax
  373.                 inc eax
  374.         @@:
  375.         ret
  376. endp
  377.  
  378. align 4
  379. proc str_cat uses eax ecx edi esi, str1:dword, str2:dword
  380.         mov esi,dword[str2]
  381.         stdcall str_len,esi
  382.         mov ecx,eax
  383.         inc ecx
  384.         mov edi,dword[str1]
  385.         stdcall str_len,edi
  386.         add edi,eax
  387.         cld
  388.         repne movsb
  389.         ret
  390. endp
  391.  
  392. ;output:
  393. ; eax = strlen
  394. align 4
  395. proc str_len, str1:dword
  396.         mov eax,[str1]
  397.         @@:
  398.                 cmp byte[eax],0
  399.                 je @f
  400.                 inc eax
  401.                 jmp @b
  402.         @@:
  403.         sub eax,[str1]
  404.         ret
  405. endp
  406.  
  407. align 4
  408. proc String_crop_0 uses eax ebx ecx edi
  409.         mov edi,Data_String
  410.         mov al,'.'
  411.         mov ecx,32
  412.         repne scasb
  413.         mov ebx,edi
  414.         mov edi,Data_String
  415.         xor al,al
  416.         mov ecx,32
  417.         repne scasb
  418.         cmp ebx,edi
  419.         jg .end_f
  420.         dec edi
  421.         .cycle0:
  422.                 dec edi
  423.                 cmp edi,Data_String
  424.                 jle .end_f
  425.                 cmp byte[edi],'0'
  426.                 jne .cycle0end
  427.                 mov byte[edi],0
  428.                 jmp .cycle0
  429.         .cycle0end:
  430.         cmp byte[edi],'.'
  431.         jne .end_f
  432.                 mov byte[edi],0
  433.         .end_f:
  434.         ret
  435. endp