Subversion Repositories Kolibri OS

Rev

Rev 7615 | 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. .end:
  35. ; —¨á«® á ¯« ¢ î饩 § ¯ï⮩ ¤¢®©­®© â®ç­®áâ¨
  36. Data_Double   DQ ?
  37. ; —¨á«® ¢ BCD-ä®à¬ â¥
  38. Data_BCD      DT ?
  39. ; ‚ᯮ¬®£ â¥«ì­ë© ä« £
  40. Data_Flag     DB ?
  41. ; ‡­ ª १ã«ìâ â  (¥á«¨ ­¥ 0 - ®âà¨æ â¥«ì­®¥ ç¨á«®)
  42. Data_Sign     DB ?
  43. ; ‡­ ª १ã«ìâ â  - 0 ¤«ï ..e+.. ¨ 1 ¤«ï ..e-..
  44. Data_Sign_Exp DB ?
  45.  
  46. align 4
  47. ; ‘âப  ¤«ï åà ­¥­¨ï ç¨á«  ¢ ª®¤¥ ASCII
  48. Data_String   DB 32 DUP (?)
  49.  
  50.  
  51.  
  52. ;*******************************************************
  53. ;*  …Ž€‡Ž‚€ˆ… —ˆ‘‹€ ‘ ‹€‚€ž™…‰ ‡€Ÿ’Ž‰ ‚ ‘’ŽŠ“  *
  54. ;* —¨á«® ¨¬¥¥â ä®à¬ â á 㤢®¥­­®© â®ç­®áâìî, १ã«ìâ â *
  55. ;* ¢ë¤ ¥âáï ¢ ¤¥áïâ¨ç­®¬ ª®¤¥, ¢ "¡ë⮢®¬" ä®à¬ â¥ á   *
  56. ;* 䨪á¨à®¢ ­­ë¬ ª®«¨ç¥á⢮¬ §­ ª®¢ ¯®á«¥ § ¯ï⮩.     *
  57. ;* ‚室­ë¥ ¯ à ¬¥âàë:                                  *
  58. ;* Data_Double - ¯à¥®¡à §ã¥¬®¥ ç¨á«®;                  *
  59. ;* NumberSymbolsAD - ª®«¨ç¥á⢮ §­ ª®¢ ¯®á«¥           *
  60. ;*                   § ¯ï⮩ (0-17).                   *
  61. ;* ‚ë室­ë¥ ¯ à ¬¥âàë:                                 *
  62. ;* Data_String - áâப -१ã«ìâ â.                     *
  63. ;*******************************************************
  64. align 4
  65. DoubleFloat_to_String:
  66.         pushad
  67.         ; ¥§ã«ìâ â § ¯¨á뢠âì ¢ áâபã Data_String
  68.         mov     EDI, Data_String
  69.  
  70.         ; ‘¤¢¨£ ¥¬ ç¨á«® ¢«¥¢® ­  NumberSymbolsAD
  71.         ; ¤¥áïâ¨ç­ëå à §à冷¢
  72.         fninit                 ;á¡à®á ᮯà®æ¥áá®à 
  73.         fld     [Data_Double]  ;§ £à㧨âì ç¨á«®
  74.         xor ebx,ebx
  75.         mov     BX,[NumberSymbolsAD]
  76.         cmp     BX, 0
  77.         je      .NoShifts     ;­¥â æ¨äà ¯®á«¥ § ¯ï⮩
  78.         jl      .Error        ;®è¨¡ª 
  79.         dec     BX
  80.         lea ebx,[MConst+8*ebx]
  81.         fmul    qword [EBX] ;㬭®¦¨âì ­  ª®­áâ ­âã
  82. .NoShifts:
  83.         ; ˆ§¢«¥çì ç¨á«® ¢ ª®¤¥ BCD
  84.         fbstp   [Data_BCD]
  85. ; à®¢¥à¨âì १ã«ìâ â ­  ¯¥à¥¯®«­¥­¨¥
  86.         mov     AX,word [Data_BCD + 8]
  87.         cmp     AX,0FFFFh  ;"¤¥áïâ¨ç­®¥" ¯¥à¥¯®«­¥­¨¥?
  88.         je      .Overflow
  89. ; ‚뤥«¨âì §­ ª ç¨á«  ¨ § ¯¨á âì ¥£® ¢ ASCII-ª®¤¥
  90.         mov     AL, byte [Data_BCD + 9]
  91.         and     AL,AL
  92.         jz      .NoSign
  93.         mov     AL,'-'
  94.         stosb
  95. .NoSign:
  96. ;  á¯ ª®¢ âì ç¨á«® ¢ ª®¤ ASCII
  97.         mov     ebx,8    ;ᬥ饭¨¥ ¯®á«¥¤­¥© ¯ àë æ¨äà
  98.         mov     ecx,9    ;áç¥â稪 ¯ à æ¨äà
  99.         ; Ž¯à¥¤¥«¨âì ¯®§¨æ¨î ¤¥áïâ¨ç­®© â®çª¨ ¢ ç¨á«¥
  100.         mov     DX,18
  101.         sub     DX,[NumberSymbolsAD]
  102.         js      .Error  ;®è¨¡ª , ¥á«¨ ®âà¨æ â¥«ì­ ï
  103.         jz      .Error  ;¨«¨ ­ã«¥¢ ï ¯®§¨æ¨ï
  104. .NextPair:
  105.         ; ‡ £à㧨âì ®ç¥à¥¤­ãî ¯ àã à §à冷¢
  106.         mov     AL, byte [ebx + Data_BCD]
  107.         mov     AH,AL
  108.         ; ‚뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨
  109.         ; á®åà ­¨âì áâ àèãî â¥âà ¤ã
  110.         shr     AL,4
  111.         add     AL,'0'
  112.         stosb
  113.         dec     DX
  114.         jnz     .N0
  115.         mov     AL,'.'
  116.         stosb
  117. .N0:   ; ‚뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨
  118.         ; á®åà ­¨âì ¬« ¤èãî â¥âà ¤ã
  119.         mov     AL,AH
  120.         and     AL,0Fh
  121.         add     AL,'0'
  122.         stosb
  123.         dec     DX
  124.         jnz     .N1
  125.         mov     AL,'.'
  126.         stosb
  127. .N1:
  128.         dec  BX
  129.         loop .NextPair
  130.         mov  AL,0
  131.         stosb
  132.  
  133. ; “¡à âì ­¥§­ ç é¨¥ ­ã«¨ á«¥¢ 
  134.         mov     EDI, Data_String
  135.         mov     ESI, Data_String
  136.         ; à®¯ãáâ¨âì §­ ª ç¨á« , ¥á«¨ ®­ ¥áâì
  137.         cmp     byte [ESI],'-'
  138.         jne     .N2
  139.         inc     ESI
  140.         inc     EDI
  141. .N2:   ; ‡ £à㧨âì ¢ áç¥â稪 横«  ª®«¨ç¥á⢮ à §à冷¢
  142.         ; ç¨á«  ¯«îá 1 (¡ ©â ¤¥áïâ¨ç­®© â®çª¨)
  143.         mov     ecx,18+1+1
  144.         ; à®¯ãáâ¨âì ­¥§­ ç é¨¥ ­ã«¨
  145. .N3:
  146.         cmp byte [ESI],'0'
  147.         jne .N4
  148.         cmp byte [ESI+1],'.'
  149.         je .N4
  150.         inc ESI
  151.         loop .N3
  152.         ; Žè¨¡ª  - ­¥â §­ ç é¨å æ¨äà
  153.         jmp     .Error
  154. ; ‘ª®¯¨à®¢ âì §­ ç éãî ç áâì ç¨á«  ¢ ­ ç «® áâப¨
  155. align 4
  156. .N4:    rep movsb
  157.         jmp    .End
  158. ; Žè¨¡ª 
  159. align 4
  160. .Error:
  161.         mov     AL,'E'
  162.         stosb
  163.         mov     AL,'R'
  164.         stosb
  165.         mov     AL,'R'
  166.         stosb
  167.         xor     AL,AL
  168.         stosb
  169.         jmp     .End
  170. ; ¥à¥¯®«­¥­¨¥ à §à來®© á¥âª¨
  171. align 4
  172. .Overflow:
  173.         mov     AL,'#'
  174.         stosb
  175.         xor     AL,AL
  176.         stosb
  177. ; Š®­¥æ ¯à®æ¥¤ãàë
  178. align 4
  179. .End:
  180.         popad
  181.         ret
  182.  
  183. ;****************************************************
  184. ;* …Ž€‡Ž‚€’œ ‘’ŽŠ“ ‚ —ˆ‘‹Ž ‘ ‹€‚€ž™…‰ ‡€Ÿ’Ž‰ *
  185. ;*      (ç¨á«® ¨¬¥¥â ®¡ëç­ë©, "¡ë⮢®©" ä®à¬ â)     *
  186. ;* ‚室­ë¥ ¯ à ¬¥âàë:                               *
  187. ;* Data_String - ç¨á«® ¢ ª®¤¥ ASCII.                *
  188. ;* ‚ë室­ë¥ ¯ à ¬¥âàë:                              *
  189. ;* Data_Double - ç¨á«® ¢ ¤¢®¨ç­®¬ ª®¤¥.             *
  190. ;****************************************************
  191. align 4
  192. String_to_DoubleFloat:
  193.         pushad
  194.         cld
  195.         ; Žç¨é ¥¬ Data_BCD
  196.         mov dword [Data_BCD],0
  197.         mov dword [Data_BCD+4],0
  198.         mov  word [Data_BCD+8],0
  199.         ; Žç¨é ¥¬ ¡ ©â §­ ª 
  200.         mov     [Data_Sign],0
  201.         ; ‡ ­®á¨¬ ¢ esi 㪠§ â¥«ì ­  áâபã
  202.         mov     esi, Data_String
  203.         ; à®¯ã᪠¥¬ ¯à®¡¥«ë ¯¥à¥¤ ç¨á«®¬
  204.         mov     ecx,64 ;§ é¨â  ®â § æ¨ª«¨¢ ­¨ï
  205. .ShiftIgnore:
  206.         lodsb
  207.         cmp     al,' '
  208.         jne .ShiftIgnoreEnd
  209.         loop .ShiftIgnore
  210.         jmp .Error
  211. align 4
  212. .ShiftIgnoreEnd:
  213.         ; à®¢¥à塞 §­ ª ç¨á« 
  214.         cmp     al,'-'
  215.         jne     .Positive
  216.         mov     [Data_Sign],80h
  217.         lodsb
  218. .Positive:
  219.         mov     [Data_Flag],0 ;¯à¨§­ ª ­ «¨ç¨ï â®çª¨
  220.         xor     edx,edx       ;¯®§¨æ¨ï â®çª¨
  221.         mov     ecx,18        ;¬ ªá. ç¨á«® à §à冷¢
  222. align 4
  223. .ASCIItoBCDConversion:
  224.         cmp     al,'.'        ;â®çª ?
  225.         jne     .NotDot
  226.         cmp     [Data_Flag],0 ;â®çª  ­¥ ¢áâà¥ç « áì?
  227.         jne     .Error        ;¥á«¨ â®çª  㦥 ¡ë« 
  228.         mov     [Data_Flag],1
  229.         lodsb
  230.         or al,al              ;ª®­¥æ áâப¨?
  231.         jnz     .NotDot
  232.         jmp     .ASCIItoBCDConversionEnd
  233. align 4
  234. .NotDot:
  235.         ; “¢¥«¨ç¨âì ­  1 §­ ç¥­¨¥ ¯®§¨æ¨¨ â®çª¨,
  236.         ; ¥á«¨ ®­  ¥é¥ ­¥ ¢áâà¥ç « áì
  237.         cmp     [Data_Flag],0
  238.         jnz     .Figures
  239.         inc     edx
  240. .Figures:
  241.         cmp al,'e'
  242.         je .exp_form
  243.         cmp al,'E'
  244.         jne @f
  245.         .exp_form:
  246.                 call string_ExpForm ;¥á«¨ ç¨á«® ¢ ä®à¬ â¥ ..e..
  247.                 or al,al
  248.                 jnz .Error
  249.                 jmp     .ASCIItoBCDConversionEnd
  250.         @@:
  251.         ; ‘¨¬¢®«ë ç¨á«  ¤®«¦­ë ¡ëâì æ¨äà ¬¨
  252.         cmp     al,'0'
  253.         jb      .Error
  254.         cmp     al,'9'
  255.         ja      .Error
  256.         ; ¨è¥¬ ®ç¥à¥¤­ãî æ¨äàã ¢ ¬« ¤èãî â¥âà ¤ã BCD
  257.         and     al,15 ;ᨬ¢®«ë 0-9 ¯¥à¥¢®¤¨¬ ¢ ç¨á«®
  258.         or      byte [Data_BCD],al
  259.         ; à®¢¥àª  ­  ª®­¥æ áâப¨
  260.         cmp     byte [esi],0
  261.         je      .ASCIItoBCDConversionEnd
  262.         ; ‘¤¢¨£ ¥¬ BCD ­  4 à §à鸞 ¢«¥¢®
  263.         ; (ᤢ¨£ ¥¬ áâ à訥 2 ¡ ©â )
  264.         mov     ax,word [Data_BCD+6]
  265.         shld    word [Data_BCD+8],ax,4
  266.         ; (ᤢ¨£ ¥¬ á।­¨¥ 4 ¡ ©â )
  267.         mov     eax,dword [Data_BCD]
  268.         shld    dword [Data_BCD+4],eax,4
  269.         ; (ᤢ¨£ ¥¬ ¬« ¤è¨¥ 4 ¡ ©â )
  270.         shl     dword [Data_BCD],4
  271.         ; ‡ £à㦠¥¬ á«¥¤ãî騩 ᨬ¢®« ¢ AL
  272.         lodsb
  273.         loop .ASCIItoBCDConversion ;¥á«¨ ­¥ ª®¬¯¨«. â® ¯®áâ ¢¨âì dec ecx, jnz ...
  274.         ; …᫨ 19-© ᨬ¢®« ­¥ 0 ¨ ­¥ â®çª ,
  275.         ; â® ®è¨¡ª  ¯¥à¥¯®«­¥­¨ï
  276.         cmp     al,'.'
  277.         jne     .NotDot2
  278.         inc     ecx ;¯à®¯ã᪠â®çª¨ ¢ ª®­æ¥ ®ç¥­ì ¡®«ì讣® ç¨á« 
  279.         lodsb
  280. .NotDot2:
  281.         or al,al        ;¯¥à¥¯®«­¥­¨¥ à §à來®© á¥âª¨?
  282.         jz      .ASCIItoBCDConversionEnd
  283. align 4
  284. .Error: ; à¨ «î¡®© ®è¨¡ª¥ ®¡­ã«¨âì १ã«ìâ â
  285.         fldz    ;§ ­¥á⨠­®«ì á á⥪ ᮯà®æ¥áá®à 
  286.         fstp    [Data_Double]
  287.         jmp     .End
  288.  
  289. ; …Ž€‡Ž‚€’œ —ˆ‘‹Ž ˆ‡ ŠŽ„€ BCD ‚ ‚…™…‘’‚…Ž… —ˆ‘‹Ž
  290. .ASCIItoBCDConversionEnd:
  291.         ; ‚¯¨á âì §­ ª ¢ áâ à訩 ¡ ©â
  292.         mov     al,[Data_Sign]
  293.         mov     byte [Data_BCD+9],al
  294.         ; ‘¡à®á¨âì ॣ¨áâàë ᮯà®æ¥áá®à 
  295.         fninit
  296.         ; ‡ £à㧨âì ¢ ᮯà®æ¥áá®à ç¨á«® ¢ BCD-ä®à¬ â¥
  297.         fbld    [Data_BCD]
  298.         ; ‚ëç¨á«¨âì ­®¬¥à ¤¥«¨â¥«ï ¨«¨ ¬­®¦¨â¥«ï
  299.         lea ebx,[ecx+edx-18]
  300.         cmp ebx,0
  301.         jle .NoMul ;¥á«¨ ç¨á«® e-..
  302.         dec ebx
  303.         jz .NoDiv ;¥á«¨ ç¨á«® e+0
  304.         dec ebx
  305.         lea ebx,[MConst+8*ebx]
  306.         cmp ebx,MConst.end
  307.         jl @f
  308.                 ffree st0
  309.                 fincstp
  310.                 jmp .Error ;¥á«¨ ®ç¥­ì ¡®«ì讥 ç¨á«® e+**
  311.         @@:
  312.         fmul qword [ebx] ;㬭®¦¨âì ­  ª®­áâ ­âã (¤«ï ç¨á¥« á ¯à¨áâ ¢ª®© e+..)
  313.         jmp .NoDiv
  314. .NoMul:
  315.         neg ebx
  316.         lea ebx,[MConst+8*ebx]
  317.         cmp ebx,MConst.end
  318.         jl @f
  319.                 ffree st0
  320.                 fincstp
  321.                 jmp .Error ;¥á«¨ ®ç¥­ì ¬ «¥­ìª®¥ ç¨á«® e-**
  322.         @@:
  323.         fdiv qword [ebx] ;à §¤¥«¨âì ­  ª®­áâ ­âã
  324. .NoDiv: ;‚ë£à㧨âì ç¨á«® ¢ ¤¢®¨ç­®¬ ä®à¬ â¥
  325.         fstp [Data_Double]
  326. .End:
  327.         popad
  328.         ret
  329.  
  330. ;output:
  331. ; eax - 1 if error
  332. ; edx += size
  333. align 4
  334. proc string_ExpForm uses ebx
  335.         mov [Data_Sign_Exp],0
  336.         xor eax,eax
  337.         lodsb
  338.         cmp al,'+'
  339.         jne @f
  340.                 lodsb
  341.         @@:
  342.         cmp al,'-'
  343.         jne @f
  344.                 inc [Data_Sign_Exp]
  345.                 lodsb
  346.         @@:
  347.        
  348.         xor ebx,ebx
  349.         .cycle0:
  350.                 cmp al,0
  351.                 je .cycle0end
  352.                 cmp al,9
  353.                 je .cycle0end
  354.                 cmp al,10
  355.                 je .cycle0end
  356.                 cmp al,13
  357.                 je .cycle0end
  358.                 cmp al,' '
  359.                 je .cycle0end
  360.                 cmp     al,'0'
  361.                 jb .Error
  362.                 cmp     al,'9'
  363.                 ja .Error
  364.        
  365.                 imul ebx,10
  366.                 and     eax,15 ;ᨬ¢®«ë 0-9 ¯¥à¥¢®¤¨¬ ¢ ç¨á«®
  367.                 add ebx,eax
  368.                 lodsb
  369.                 jmp .cycle0
  370.         .cycle0end:
  371.        
  372.         cmp ebx,328 ;308 - ¬ ªá. à §¬¥à á⥯¥­¨ ¤«ï double + 20 - ç¨á«® à §à冷¢ ¢ BCD
  373.         ja .Error
  374.         cmp [Data_Sign_Exp],0
  375.         je @f
  376.                 neg ebx
  377.         @@:
  378.         cmp     [Data_Flag],0 ;â®çª  ­¥ ¢áâà¥ç « áì?
  379.         jne @f
  380.                 dec edx
  381.         @@:
  382.         add edx,ebx
  383.  
  384.         xor eax,eax
  385.         jmp @f
  386.         .Error:
  387.                 xor eax,eax
  388.                 inc eax
  389.         @@:
  390.         ret
  391. endp
  392.  
  393. align 4
  394. proc str_cat uses eax ecx edi esi, str1:dword, str2:dword
  395.         mov esi,dword[str2]
  396.         stdcall str_len,esi
  397.         mov ecx,eax
  398.         inc ecx
  399.         mov edi,dword[str1]
  400.         stdcall str_len,edi
  401.         add edi,eax
  402.         cld
  403.         repne movsb
  404.         ret
  405. endp
  406.  
  407. ;output:
  408. ; eax = strlen
  409. align 4
  410. proc str_len, str1:dword
  411.         mov eax,[str1]
  412.         @@:
  413.                 cmp byte[eax],0
  414.                 je @f
  415.                 inc eax
  416.                 jmp @b
  417.         @@:
  418.         sub eax,[str1]
  419.         ret
  420. endp
  421.  
  422. align 4
  423. proc String_crop_0 uses eax ebx ecx edi
  424.         mov edi,Data_String
  425.         mov al,'.'
  426.         mov ecx,32
  427.         repne scasb
  428.         mov ebx,edi
  429.         mov edi,Data_String
  430.         xor al,al
  431.         mov ecx,32
  432.         repne scasb
  433.         cmp ebx,edi
  434.         jg .end_f
  435.         dec edi
  436.         .cycle0:
  437.                 dec edi
  438.                 cmp edi,Data_String
  439.                 jle .end_f
  440.                 cmp byte[edi],'0'
  441.                 jne .cycle0end
  442.                 mov byte[edi],0
  443.                 jmp .cycle0
  444.         .cycle0end:
  445.         cmp byte[edi],'.'
  446.         jne .end_f
  447.                 mov byte[edi],0
  448.         .end_f:
  449.         ret
  450. endp