home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 April / Chip_1997-04_cd.bin / prezent / cb / data.z / VALEXT.ASM < prev    next >
Assembly Source File  |  1997-01-16  |  3KB  |  204 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Delphi Runtime Library                          *
  5. ; *                            *
  6. ; *    Copyright (c) 1996 Borland International    *
  7. ; *                            *
  8. ; *******************************************************
  9.  
  10.     INCLUDE    SE.ASM
  11.  
  12.  
  13.     .386
  14.     .MODEL    FLAT
  15.  
  16.     EXTRN    _Pow10:NEAR
  17.  
  18.     PUBLIC    _ValExt, @_ValExt
  19.  
  20.     .CODE
  21.  
  22. ;    FUNCTION _ValExt( s: AnsiString; VAR code: Integer ) : Extended;
  23.  
  24. _ValExt PROC
  25. @_ValExt:
  26.  
  27. ; ->    EAX    Pointer to string
  28. ;    EDX    Pointer to code result
  29. ; <-    FST(0)    Result
  30.  
  31.     PUSH    EBX
  32.     PUSH    ESI
  33.     PUSH    EDI
  34.  
  35.  
  36.     MOV    ESI,EAX
  37.     PUSH    EAX            ; save for the error case
  38.  
  39.     FLDZ
  40.     XOR    EAX,EAX
  41.     XOR    EBX,EBX
  42.     XOR    EDI,EDI
  43.  
  44.     PUSH    EBX            ; temp to get digs to fpu
  45.  
  46.     TEST    ESI,ESI
  47.     JE    @@empty
  48.  
  49. @@blankLoop:
  50.     MOV    BL,[ESI]
  51.     INC    ESI
  52.     CMP    BL,' '
  53.     JE    @@blankLoop
  54.  
  55. @@endBlanks:
  56.     MOV    CH,0
  57.     CMP    BL,'-'
  58.     JE    @@minus
  59.     CMP    BL,'+'
  60.     JE    @@plus
  61.     JMP    @@firstDigit
  62.  
  63. @@minus:
  64.     INC    CH
  65. @@plus:
  66.     MOV    BL,[ESI]
  67.     INC    ESI
  68.  
  69. @@firstDigit:
  70.     TEST    BL,BL
  71.     JE    @@error
  72.  
  73. @@digLoop:
  74.     SUB    BL,'0'
  75.     CMP    BL,9
  76.     JA    @@dotExp
  77.     FMUL    ten
  78.     MOV    dword ptr [ESP],EBX
  79.     FIADD    dword ptr [ESP]
  80.  
  81.     MOV    BL,[ESI]
  82.     INC    ESI
  83.  
  84.     TEST    BL,BL
  85.     JNE    @@digLoop
  86.  
  87.     JMP    @@finish
  88.  
  89. @@dotExp:
  90.     CMP    BL,'.' - '0'
  91.     JNE    @@exp
  92.  
  93.     MOV    BL,[ESI]
  94.     INC    ESI
  95.  
  96.     TEST    BL,BL
  97.     JE    @@error
  98.  
  99. @@fracDigLoop:
  100.     SUB    BL,'0'
  101.     CMP    BL,9
  102.     JA    @@exp
  103.     FMUL    ten
  104.     MOV    dword ptr [ESP],EBX
  105.     FIADD    dword ptr [ESP]
  106.     DEC    EAX
  107.  
  108.     MOV    BL,[ESI]
  109.     INC    ESI
  110.  
  111.     TEST    BL,BL
  112.     JNE    @@fracDigLoop
  113.     JMP    @@finish
  114.  
  115. @@exp:
  116.     CMP    BL,'E' - '0'
  117.     JE    @@foundExp
  118.     CMP    BL,'e' - '0'
  119.     JNE    @@error
  120. @@foundExp:
  121.     MOV    BL,[ESI]
  122.     INC    ESI
  123.     MOV    AH,0
  124.     CMP    BL,'-'
  125.     JE    @@minusExp
  126.     CMP    BL,'+'
  127.     JE    @@plusExp
  128.     JMP    @@firstExpDigit
  129. @@minusExp:
  130.     INC    AH
  131. @@plusExp:
  132.     MOV    BL,[ESI]
  133.     INC    ESI
  134. @@firstExpDigit:
  135.     SUB    BL,'0'
  136.     CMP    BL,9
  137.     JA    @@error
  138.     MOV    EDI,EBX
  139.     MOV    BL,[ESI]
  140.     INC    ESI
  141.     TEST    BL,BL
  142.     JZ    @@endExp
  143. @@expDigLoop:
  144.     SUB    BL,'0'
  145.     CMP    BL,9
  146.     JA    @@error
  147.     LEA    EDI,[EDI+EDI*4]
  148.     ADD    EDI,EDI
  149.     ADD    EDI,EBX
  150.     MOV    BL,[ESI]
  151.     INC    ESI
  152.     TEST    BL,BL
  153.     JNZ    @@expDigLoop
  154. @@endExp:
  155.     DEC    AH
  156.     JNZ    @@expPositive
  157.     NEG    EDI
  158. @@expPositive:
  159.     MOVSX    EAX,AL
  160.  
  161. @@finish:
  162.     ADD    EAX,EDI
  163.     PUSH    EDX
  164.     PUSH    ECX
  165.     CALL    _Pow10
  166.     POP    ECX
  167.     POP    EDX
  168.  
  169.     DEC    CH
  170.     JE    @@negate
  171.  
  172. @@successExit:
  173.  
  174.     ADD    ESP,8        ; pop temp and saved copy of string pointer
  175.  
  176.     XOR    ESI,ESI        ; signal no error to caller
  177.  
  178. @@exit:
  179.     MOV    [EDX],ESI
  180.  
  181.     POP    EDI
  182.     POP    ESI
  183.     POP    EBX
  184.     RET
  185.  
  186. @@negate:
  187.     FCHS
  188.     JMP    @@successExit
  189.  
  190. @@empty:
  191.     INC    ESI
  192.  
  193. @@error:
  194.     POP    EAX
  195.     POP    EBX
  196.     SUB    ESI,EBX
  197.     JMP    @@exit
  198.  
  199. ten    DQ    10.0
  200.  
  201. _ValExt ENDP
  202.  
  203.     END
  204.