home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wunderki.zip / DF48.ASM < prev    next >
Assembly Source File  |  1993-08-16  |  7KB  |  487 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Turbo Pascal Run-time Library                   *
  5. ; *    Real Binary/Decimal Routines            *
  6. ; *                            *
  7. ; *     Copyright (c) 1988,92 Borland International     *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    DF48
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. CODE    SEGMENT    BYTE PUBLIC
  16.  
  17.     ASSUME    CS:CODE
  18.  
  19. ; Externals
  20.  
  21.     EXTRN    RealAdd:NEAR,RealMul:NEAR,RealDiv:NEAR
  22.     EXTRN    RealFloat:NEAR,Str2Int:NEAR
  23.  
  24. ; Publics
  25.  
  26.     PUBLIC    Real2Str,Str2Real
  27.  
  28. ; Convert real to string
  29. ; In    R1    = Value
  30. ;    CX    = Digit count (Float<0, Fixed>=0)
  31. ;    ES:DI = String pointer
  32. ; Out    CX    = String length
  33. ;    ES:DI = String pointer
  34.  
  35. Real2Str:
  36.  
  37.     LOC    Digits,WORD,1
  38.     LOC    Sign,BYTE,2
  39.     LOC    Exponent,WORD,1
  40.     LOC    DigitBuf,BYTE,14
  41.  
  42.     ENTRY
  43.     PUSH    DI
  44.     CMP    CX,11
  45.     JLE    @@1
  46.     MOV    CX,11
  47. @@1:    CMP    CX,-11
  48.     JGE    @@2
  49.     MOV    CX,-11
  50. @@2:    MOV    Digits,CX
  51.     MOV    Sign,DH
  52.     PUSH    ES
  53.     PUSH    DI
  54.     LEA    DI,DigitBuf
  55.     PUSH    SS
  56.     POP    ES
  57.     CALL    Real2Dec
  58.     POP    DI
  59.     POP    ES
  60.     MOV    Exponent,CX
  61. @@10:    MOV    SI,Digits
  62.     OR    SI,SI
  63.     JS    @@11
  64.     ADD    SI,Exponent
  65.     INC    SI
  66.     JNS    @@12
  67.     MOV    DigitBuf,0
  68.     JMP    SHORT @@20
  69. @@11:    NEG    SI
  70. @@12:    CMP    SI,12
  71.     JB    @@15
  72.     MOV    SI,11
  73. @@15:    CMP    DigitBuf[SI],'5'
  74.     MOV    DigitBuf[SI],0
  75.     JB    @@20
  76. @@13:    DEC    SI
  77.     JS    @@14
  78.     INC    DigitBuf[SI]
  79.     CMP    DigitBuf[SI],'9'
  80.     JBE    @@20
  81.     MOV    DigitBuf[SI],0
  82.     JMP    @@13
  83. @@14:    MOV    DigitBuf.w0,'1'
  84.     INC    Exponent
  85. @@20:    XOR    SI,SI
  86.     CLD
  87.     MOV    DX,Digits
  88.     OR    DX,DX
  89.     JS    @@40
  90.     TEST    Sign,80H
  91.     JE    @@31
  92.     MOV    AL,'-'
  93.     STOSB
  94. @@31:    MOV    CX,Exponent
  95.     OR    CX,CX
  96.     JNS    @@32
  97.     MOV    AL,'0'
  98.     STOSB
  99.     JMP    SHORT @@33
  100. @@32:    CALL    GetDigit
  101.     STOSB
  102.     DEC    CX
  103.     JNS    @@32
  104. @@33:    OR    DX,DX
  105.     JE    @@90
  106.     MOV    AL,'.'
  107.     STOSB
  108. @@34:    INC    CX
  109.     JE    @@35
  110.     MOV    AL,'0'
  111.     STOSB
  112.     DEC    DX
  113.     JNE    @@34
  114. @@35:    DEC    DX
  115.     JS    @@90
  116.     CALL    GetDigit
  117.     STOSB
  118.     JMP    SHORT @@35
  119. @@40:    MOV    AL,' '
  120.     TEST    Sign,80H
  121.     JE    @@46
  122.     MOV    AL,'-'
  123. @@46:    STOSB
  124.     CALL    GetDigit
  125.     STOSB
  126.     INC    DX
  127.     JE    @@42
  128.     MOV    AL,'.'
  129.     STOSB
  130. @@41:    CALL    GetDigit
  131.     STOSB
  132.     INC    DX
  133.     JNE    @@41
  134. @@42:    MOV    AL,'E'
  135.     STOSB
  136.     MOV    AL,'+'
  137.     MOV    DX,Exponent
  138.     OR    DX,DX
  139.     JNS    @@43
  140.     MOV    AL,'-'
  141.     NEG    DX
  142. @@43:    STOSB
  143.     MOV    AX,DX
  144.     MOV    DL,10
  145.     IDIV    DL
  146.     ADD    AX,'00'
  147.     STOSW
  148. @@90:    MOV    CX,DI
  149.     POP    DI
  150.     SUB    CX,DI
  151.     EXIT
  152.  
  153. ; Get digit from digit buffer
  154.  
  155. GetDigit:
  156.  
  157.     MOV    AL,DigitBuf[SI]
  158.     INC    SI
  159.     OR    AL,AL
  160.     JNE    @@1
  161.     MOV    AL,'0'
  162.     DEC    SI
  163. @@1:    RET
  164.  
  165. ; Convert real to 12 decimal digits
  166. ; In    ES:DI = Digit buffer pointer
  167. ; Out    CX    = Exponent
  168.  
  169. Real2Dec:
  170.  
  171.     OR    AL,AL
  172.     JNZ    @@1
  173.     MOV    CX,6
  174.     MOV    AX,'00'
  175.     CLD
  176.     REP    STOSW
  177.     XOR    AL,AL
  178.     STOSB
  179.     RET
  180. @@1:    AND    DH,7FH
  181.     PUSH    AX
  182.     SUB    AL,80H
  183.     MOV    AH,77
  184.     IMUL    AH
  185.     ADD    AX,5
  186.     MOV    AL,AH
  187.     CBW
  188.     MOV    CX,AX
  189.     POP    AX
  190.     CMP    CX,-39
  191.     JNE    @@2
  192.     INC    CX
  193. @@2:    PUSH    CX
  194.     PUSH    DI
  195.     NEG    CX
  196.     CALL    Power10
  197.     POP    DI
  198.     POP    CX
  199.     CMP    AL,81H
  200.     JAE    @@3
  201.     CALL    Times10
  202.     DEC    CX
  203. @@3:    PUSH    CX
  204.     OR    DH,80H
  205.     MOV    CL,84H
  206.     SUB    CL,AL
  207.     MOV    AL,0
  208.     JZ    @@5
  209. @@4:    SHR    DX,1
  210.     RCR    BX,1
  211.     RCR    AX,1
  212.     DEC    CL
  213.     JNZ    @@4
  214. @@5:    MOV    SI,12
  215. @@6:    MOV    CH,DH
  216.     MOV    CL,4
  217.     SHR    CH,CL
  218.     ADD    CH,'0'
  219.     MOV    ES:[DI],CH
  220.     AND    DH,0FH
  221.     PUSH    DX
  222.     PUSH    BX
  223.     PUSH    AX
  224.     SHL    AX,1
  225.     RCL    BX,1
  226.     RCL    DX,1
  227.     SHL    AX,1
  228.     RCL    BX,1
  229.     RCL    DX,1
  230.     POP    CX
  231.     ADD    AX,CX
  232.     POP    CX
  233.     ADC    BX,CX
  234.     POP    CX
  235.     ADC    DX,CX
  236.     SHL    AX,1
  237.     RCL    BX,1
  238.     RCL    DX,1
  239.     INC    DI
  240.     DEC    SI
  241.     JNZ    @@6
  242.     MOV    BYTE PTR ES:[DI],0
  243.     POP    CX
  244.     RET
  245.  
  246. ; Convert string to real
  247. ; In    CX    = String length
  248. ;    ES:DI = String pointer
  249. ; Out    R1    = Value
  250. ;    CX    = Remaining characters
  251. ;    ES:DI = Pointer past string
  252. ;    CF    = 1 if error
  253.  
  254. Str2Real:
  255.  
  256.     LOC    SignChar,BYTE,2
  257.     LOC    Value,BYTE,6
  258.  
  259.     ENTRY
  260.     XOR    AX,AX
  261.     MOV    Value.w0,AX
  262.     MOV    Value.w2,AX
  263.     MOV    Value.w4,AX
  264.     JCXZ    @@5
  265.     MOV    AL,ES:[DI]
  266.     MOV    SignChar,AL
  267.     CMP    AL,' '
  268.     JE    @@0
  269.     CMP    AL,'+'
  270.     JE    @@0
  271.     CMP    AL,'-'
  272.     JNE    @@1
  273. @@0:    INC    DI
  274.     DEC    CX
  275. @@1:    CALL    DigitStr
  276.     JC    @@5
  277.     OR    BX,BX
  278.     JE    @@2
  279.     XOR    BX,BX
  280.     JCXZ    @@3
  281.     CMP    BYTE PTR ES:[DI],'.'
  282.     JNE    @@3
  283. @@2:    JCXZ    @@5
  284.     CMP    BYTE PTR ES:[DI],'.'
  285.     JNE    @@5
  286.     INC    DI
  287.     DEC    CX
  288.     CALL    DigitStr
  289.     JC    @@5
  290.     NEG    BX
  291. @@3:    JCXZ    @@6
  292.     MOV    AL,ES:[DI]
  293.     CMP    AL,'E'
  294.     JE    @@4
  295.     CMP    AL,'e'
  296.     JNE    @@6
  297. @@4:    INC    DI
  298.     DEC    CX
  299.     PUSH    BX
  300.     CALL    Str2Int
  301.     POP    BX
  302.     JC    @@5
  303.     ADD    BX,AX
  304.     MOV    SI,DX
  305.     CWD
  306.     CMP    SI,DX
  307.     JNE    @@5
  308.     CMP    AX,64
  309.     JGE    @@5
  310.     CMP    AX,-64
  311.     JG    @@6
  312. @@5:    STC
  313.     JMP    SHORT @@8
  314. @@6:    PUSH    CX
  315.     PUSH    DI
  316.     MOV    CL,BL
  317.     MOV    AX,Value.w0
  318.     MOV    BX,Value.w2
  319.     MOV    DX,Value.w4
  320.     CMP    CL,-36
  321.     JGE    @@7
  322.     PUSH    CX
  323.     MOV    CL,-36
  324.     CALL    Power10
  325.     POP    CX
  326.     ADD    CL,36
  327. @@7:    CALL    Power10
  328.     POP    DI
  329.     POP    CX
  330.     JC    @@8
  331.     OR    AL,AL
  332.     JE    @@8
  333.     CMP    SignChar,'-'
  334.     CLC
  335.     JNE    @@8
  336.     OR    DH,80H
  337. @@8:    EXIT
  338.  
  339. ; Process string of digits
  340. ; Out    BX = Digit count
  341. ;    CF = 1 if overflow
  342.  
  343. DigitStr:
  344.  
  345.     XOR    BX,BX
  346. @@1:    JCXZ    @@3
  347.     MOV    AL,ES:[DI]
  348.     SUB    AL,'0'+10
  349.     ADD    AL,10
  350.     JNC    @@3
  351.     INC    BX
  352.     INC    DI
  353.     DEC    CX
  354.     PUSH    BX
  355.     PUSH    CX
  356.     PUSH    DI
  357.     CBW
  358.     CWD
  359.     CALL    RealFloat
  360.     MOV    CX,AX
  361.     MOV    SI,BX
  362.     MOV    DI,DX
  363.     MOV    AX,Value.w0
  364.     MOV    BX,Value.w2
  365.     MOV    DX,Value.w4
  366.     CALL    Times10
  367.     JC    @@2
  368.     CALL    RealAdd
  369.     MOV    Value.w0,AX
  370.     MOV    Value.w2,BX
  371.     MOV    Value.w4,DX
  372. @@2:    POP    DI
  373.     POP    CX
  374.     POP    BX
  375.     JNC    @@1
  376. @@3:    RET
  377.  
  378. ; Multiply R1 by 10^CL
  379. ; Uses    CX,SI,DI
  380.  
  381. Power10:
  382.  
  383.     CMP    CL,-38
  384.     JL    @@5
  385.     CMP    CL,38
  386.     JG    @@5
  387.     PUSH    DX
  388.     PUSH    BX
  389.     PUSH    AX
  390.     OR    CL,CL
  391.     PUSHF
  392.     JNS    @@1
  393.     NEG    CL
  394. @@1:    MOV    BL,CL
  395.     AND    BL,0FCH
  396.     MOV    BH,BL
  397.     SHR    BL,1
  398.     ADD    BL,BH
  399.     XOR    BH,BH
  400.     LEA    DI,Power10Tab[BX]
  401.     MOV    AX,CS:[DI].w0
  402.     MOV    BX,CS:[DI].w2
  403.     MOV    DX,CS:[DI].w4
  404.     AND    CL,3
  405.     JZ    @@3
  406. @@2:    CALL    Times10
  407.     DEC    CL
  408.     JNZ    @@2
  409. @@3:    MOV    CX,AX
  410.     MOV    SI,BX
  411.     MOV    DI,DX
  412.     POPF
  413.     POP    AX
  414.     POP    BX
  415.     POP    DX
  416.     JS    @@4
  417.     JMP    RealMul
  418. @@4:    JMP    RealDiv
  419. @@5:    STC
  420.     RET
  421.  
  422. ; Constant powers of 10
  423.  
  424. Power10Tab:
  425.  
  426.     DB    081H,000H,000H,000H,000H,000H    ;1E00
  427.     DB    08EH,000H,000H,000H,040H,01CH    ;1E04
  428.     DB    09BH,000H,000H,020H,0BCH,03EH    ;1E08
  429.     DB    0A8H,000H,010H,0A5H,0D4H,068H    ;1E12
  430.     DB    0B6H,004H,0BFH,0C9H,01BH,00EH    ;1E16
  431.     DB    0C3H,0ACH,0C5H,0EBH,078H,02DH    ;1E20
  432.     DB    0D0H,0CDH,0CEH,01BH,0C2H,053H    ;1E24
  433.     DB    0DEH,0F9H,078H,039H,03FH,001H    ;1E28
  434.     DB    0EBH,02BH,0A8H,0ADH,0C5H,01DH    ;1E32
  435.     DB    0F8H,0C9H,07BH,0CEH,097H,040H    ;1E36
  436.  
  437. ; Fast multiply R1 by 10
  438. ; Uses    None
  439.  
  440. Times10:
  441.  
  442.     OR    AL,AL
  443.     JE    @@4
  444.     PUSH    CX
  445.     PUSH    SI
  446.     OR    DH,80H
  447.     MOV    CL,AL
  448.     XOR    AL,AL
  449.     PUSH    DX
  450.     PUSH    BX
  451.     PUSH    AX
  452.     SHR    DX,1
  453.     RCR    BX,1
  454.     RCR    AX,1
  455.     SHR    DX,1
  456.     RCR    BX,1
  457.     RCR    AX,1
  458.     POP    SI
  459.     ADD    AX,SI
  460.     POP    SI
  461.     ADC    BX,SI
  462.     POP    SI
  463.     ADC    DX,SI
  464.     JNC    @@1
  465.     RCR    DX,1
  466.     RCR    BX,1
  467.     RCR    AX,1
  468.     ADD    CL,1
  469.     JC    @@3
  470. @@1:    ADD    AX,80H
  471.     ADC    BX,0
  472.     ADC    DX,0
  473.     JNC    @@2
  474.     RCR    DX,1
  475.     ADD    CL,1
  476.     JC    @@3
  477. @@2:    AND    DH,7FH
  478.     MOV    AL,CL
  479.     ADD    AL,3
  480. @@3:    POP    SI
  481.     POP    CX
  482. @@4:    RET
  483.  
  484. CODE    ENDS
  485.  
  486.     END
  487.