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

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Turbo Pascal Run-time Library                   *
  5. ; *    Real Standard Functions                *
  6. ; *                            *
  7. ; *     Copyright (c) 1988,92 Borland International     *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    F48F
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. CODE    SEGMENT    BYTE PUBLIC
  16.  
  17.     ASSUME    CS:CODE
  18.  
  19. ; Externals
  20.  
  21.     EXTRN    RealAdd:NEAR,RealSub:NEAR,RealMul:NEAR,RealDiv:NEAR
  22.     EXTRN    RealCmp:NEAR,RealFloat:NEAR,RealTrunc:NEAR
  23.     EXTRN    HaltError:NEAR
  24.  
  25. ; Publics
  26.  
  27.     PUBLIC    RInt,RFrac,RSqrt,RSin,RCos,RLn,RExp,RArcTan
  28.  
  29. ; All standard functions operate on floating-point register R1
  30. ; (DX:BX:AX) and modify floating-point register R2 (DI:SI:CX).
  31.  
  32. ; Save R2 and add
  33.  
  34. RealAddP:
  35.  
  36.     PUSH    DI
  37.     PUSH    SI
  38.     PUSH    CX
  39.     CALL    RealAdd
  40.     POP    CX
  41.     POP    SI
  42.     POP    DI
  43.     RET
  44.  
  45. ; Save R2 and subtract
  46.  
  47. RealSubP:
  48.  
  49.     PUSH    DI
  50.     PUSH    SI
  51.     PUSH    CX
  52.     CALL    RealSub
  53.     POP    CX
  54.     POP    SI
  55.     POP    DI
  56.     RET
  57.  
  58. ; Save R2 and multiply
  59.  
  60. RealMulP:
  61.  
  62.     PUSH    DI
  63.     PUSH    SI
  64.     PUSH    CX
  65.     CALL    RealMul
  66.     POP    CX
  67.     POP    SI
  68.     POP    DI
  69.     RET
  70.  
  71. ; Save R2 and divide
  72.  
  73. RealDivP:
  74.  
  75.     PUSH    DI
  76.     PUSH    SI
  77.     PUSH    CX
  78.     CALL    RealDiv
  79.     POP    CX
  80.     POP    SI
  81.     POP    DI
  82.     RET
  83.  
  84. ; Int standard function
  85.  
  86. RInt:
  87.  
  88.     CMP    AL,80H+40
  89.     JAE    @@7
  90.     MOV    CX,AX
  91.     MOV    SI,BX
  92.     MOV    DI,DX
  93.     XOR    AH,AH
  94.     XOR    BX,BX
  95.     XOR    DX,DX
  96.     SUB    CL,80H
  97.     JBE    @@8
  98. @@2:    CMP    CL,16
  99.     JB    @@3
  100.     MOV    AH,BH
  101.     MOV    BX,DX
  102.     MOV    DX,0FFFFH
  103.     SUB    CL,16
  104.     JMP    @@2
  105. @@3:    CMP    CL,8
  106.     JB    @@4
  107.     MOV    AH,BL
  108.     MOV    BL,BH
  109.     MOV    BH,DL
  110.     MOV    DL,DH
  111.     MOV    DH,0FFH
  112.     SUB    CL,8
  113. @@4:    OR    CL,CL
  114.     JZ    @@6
  115. @@5:    STC
  116.     RCR    DX,1
  117.     RCR    BX,1
  118.     RCR    AH,1
  119.     DEC    CL
  120.     JNZ    @@5
  121. @@6:    AND    DX,DI
  122.     AND    BX,SI
  123.     AND    AH,CH
  124. @@7:    RETF
  125. @@8:    XOR    AL,AL
  126.     RETF
  127.  
  128. ; Frac standard function
  129.  
  130. RFrac:
  131.  
  132.     PUSH    DX
  133.     PUSH    BX
  134.     PUSH    AX
  135.     PUSH    CS
  136.     CALL    RInt
  137.     MOV    CX,AX
  138.     MOV    SI,BX
  139.     MOV    DI,DX
  140.     POP    AX
  141.     POP    BX
  142.     POP    DX
  143.     CALL    RealSub
  144.     RETF
  145.  
  146. ; Sqrt standard function
  147.  
  148. RSqrt:
  149.  
  150.     LOC    Expo,BYTE,2
  151.     LOC    Temp,BYTE,6
  152.  
  153.     ENTRY    FAR
  154.     MOV    CX,AX
  155.     MOV    SI,BX
  156.     MOV    DI,DX
  157.     OR    AL,AL
  158.     JZ    @@2
  159.     TEST    DH,80H
  160.     JNZ    @@3
  161.     MOV    Temp.w0,AX
  162.     MOV    Temp.w2,BX
  163.     MOV    Temp.w4,DX
  164.     ADD    CL,80H
  165.     SAR    CL,1
  166.     ADD    CL,80H
  167.     MOV    AL,CL
  168.     SUB    AL,20
  169.     MOV    Expo,AL
  170. @@1:    MOV    AX,Temp.w0
  171.     MOV    BX,Temp.w2
  172.     MOV    DX,Temp.w4
  173.     CALL    RealDivP
  174.     CALL    RealAddP
  175.     DEC    AL
  176.     PUSH    DX
  177.     PUSH    BX
  178.     PUSH    AX
  179.     CALL    RealSub
  180.     CMP    AL,Expo
  181.     POP    CX
  182.     POP    SI
  183.     POP    DI
  184.     JAE    @@1
  185. @@2:    MOV    AX,CX
  186.     MOV    BX,SI
  187.     MOV    DX,DI
  188.     EXIT
  189. @@3:    MOV    SP,BP
  190.     POP    BP
  191.     MOV    AX,207
  192.     JMP    HaltError
  193.  
  194. ; Cos standard function
  195.  
  196. RCos:
  197.  
  198.     MOV    CX,02181H    ;-PI/2
  199.     MOV    SI,0DAA2H
  200.     MOV    DI,0C90FH
  201.     CALL    RealAdd
  202.     OR    AL,AL
  203.     JE    RSin
  204.     XOR    DH,80H
  205.  
  206. ; Sin standard function
  207.  
  208. RSin:
  209.  
  210.     CMP    AL,80H-20
  211.     JB    @@6
  212.     MOV    CX,02183H    ;PI*2
  213.     MOV    SI,0DAA2H
  214.     MOV    DI,0490FH
  215.     PUSH    DX
  216.     AND    DH,7FH
  217.     CALL    RealCmp
  218.     POP    DX
  219.     JB    @@1
  220.     CALL    RealDivP
  221.     PUSH    DI
  222.     PUSH    SI
  223.     PUSH    CX
  224.     PUSH    CS
  225.     CALL    RFrac
  226.     POP    CX
  227.     POP    SI
  228.     POP    DI
  229.     CALL    RealMulP
  230. @@1:    TEST    DH,80H
  231.     JZ    @@2
  232.     CALL    RealAddP
  233. @@2:    DEC    CL
  234.     CALL    RealCmp
  235.     PUSHF
  236.     JB    @@3
  237.     CALL    RealSubP
  238. @@3:    DEC    CL
  239.     CALL    RealCmp
  240.     JB    @@4
  241.     INC    CL
  242.     OR    DH,80H
  243.     CALL    RealAdd
  244. @@4:    CMP    AL,80H-20
  245.     JB    @@5
  246.     MOV    DI,OFFSET CS:SinConst
  247.     MOV    CX,7
  248.     CALL    CalcSer2
  249. @@5:    POPF
  250.     JB    @@6
  251.     OR    AL,AL
  252.     JZ    @@6
  253.     XOR    DH,80H
  254. @@6:    RETF
  255.  
  256. ; Sin series constants
  257.  
  258. SinConst:
  259.  
  260.     DB    058H,09DH,039H,09FH,03FH,0D7H
  261.     DB    060H,043H,09DH,030H,092H,030H
  262.     DB    067H,0AAH,03FH,028H,032H,0D7H
  263.     DB    06EH,0B6H,02AH,01DH,0EFH,038H
  264.     DB    074H,00DH,0D0H,000H,00DH,0D0H
  265.     DB    07AH,088H,088H,088H,088H,008H
  266.     DB    07EH,0ABH,0AAH,0AAH,0AAH,0AAH
  267.  
  268. ; Ln standard function
  269.  
  270. RLn:
  271.  
  272.     OR    AL,AL
  273.     JE    @@1
  274.     TEST    DH,80H
  275.     JE    @@2
  276. @@1:    MOV    AX,207
  277.     JMP    HaltError
  278. @@2:    MOV    CL,80H+1
  279.     SUB    AL,CL
  280.     PUSH    AX
  281.     MOV    AL,CL
  282.     MOV    CX,0FB80H    ;1/SQRT(2)
  283.     MOV    SI,0F333H
  284.     MOV    DI,03504H
  285.     CALL    RealMul
  286.     MOV    CX,AX
  287.     MOV    SI,BX
  288.     MOV    DI,DX
  289.     MOV    AX,81H        ;1.0
  290.     XOR    BX,BX
  291.     XOR    DX,DX
  292.     CALL    RealAddP
  293.     PUSH    DX
  294.     PUSH    BX
  295.     PUSH    AX
  296.     MOV    AX,81H        ;-1.0
  297.     XOR    BX,BX
  298.     MOV    DX,8000H
  299.     CALL    RealAdd
  300.     POP    CX
  301.     POP    SI
  302.     POP    DI
  303.     CALL    RealDiv
  304.     MOV    DI,OFFSET CS:LnConst
  305.     MOV    CX,6
  306.     CALL    CalcSer2
  307.     INC    AL
  308.     MOV    CX,0D27FH    ;LN(2)/2
  309.     MOV    SI,017F7H
  310.     MOV    DI,03172H
  311.     CALL    RealAdd
  312.     POP    CX
  313.     PUSH    DX
  314.     PUSH    BX
  315.     PUSH    AX
  316.     MOV    AL,CL
  317.     CBW
  318.     CWD
  319.     CALL    RealFloat
  320.     MOV    CX,0D280H    ;LN(2)
  321.     MOV    SI,017F7H
  322.     MOV    DI,03172H
  323.     CALL    RealMul
  324.     POP    CX
  325.     POP    SI
  326.     POP    DI
  327.     CALL    RealAdd
  328.     CMP    AL,80H-25
  329.     JAE    @@3
  330.     XOR    AX,AX
  331.     XOR    BX,BX
  332.     XOR    DX,DX
  333. @@3:    RETF
  334.  
  335. ; Ln series constants
  336.  
  337. LnConst:
  338.  
  339.     DB    07DH,08AH,09DH,0D8H,089H,01DH
  340.     DB    07DH,0E9H,0A2H,08BH,02EH,03AH
  341.     DB    07DH,08EH,0E3H,038H,08EH,063H
  342.     DB    07EH,049H,092H,024H,049H,012H
  343.     DB    07EH,0CDH,0CCH,0CCH,0CCH,04CH
  344.     DB    07FH,0ABH,0AAH,0AAH,0AAH,02AH
  345.  
  346. ; Exp standard function
  347.  
  348. RExp:
  349.  
  350.     TEST    DH,80H
  351.     PUSHF
  352.     AND    DH,7FH
  353.     MOV    CX,0D280H    ;LN(2)
  354.     MOV    SI,017F7H
  355.     MOV    DI,03172H
  356.     CALL    RealDiv
  357.     CMP    AL,80H+8
  358.     JAE    @@4
  359.     PUSH    DX
  360.     PUSH    BX
  361.     PUSH    AX
  362.     INC    AL
  363.     MOV    CH,-1
  364.     CALL    RealTrunc
  365.     POP    CX
  366.     POP    SI
  367.     POP    DI
  368.     PUSH    AX
  369.     PUSH    CX
  370.     CALL    RealFloat
  371.     POP    CX
  372.     OR    AL,AL
  373.     JZ    @@1
  374.     DEC    AL
  375. @@1:    XCHG    AX,CX
  376.     XCHG    BX,SI
  377.     XCHG    DX,DI
  378.     CALL    RealSub
  379.     MOV    DI,OFFSET CS:ExpConst
  380.     MOV    CX,8
  381.     CALL    CalcSer1
  382.     POP    CX
  383.     SHR    CX,1
  384.     JNC    @@2
  385.     PUSH    CX
  386.     MOV    CX,0FB81H    ;SQRT(2)
  387.     MOV    SI,0F333H
  388.     MOV    DI,03504H
  389.     CALL    RealMul
  390.     POP    CX
  391. @@2:    ADD    AL,CL
  392.     JC    @@4
  393.     POPF
  394.     JZ    @@3
  395.     MOV    CX,AX
  396.     MOV    SI,BX
  397.     MOV    DI,DX
  398.     MOV    AX,81H
  399.     XOR    BX,BX
  400.     XOR    DX,DX
  401.     CALL    RealDiv
  402. @@3:    RETF
  403. @@4:    POP    AX
  404.     MOV    AX,205
  405.     JMP    HaltError
  406.  
  407. ; Exp series constants
  408.  
  409. ExpConst:
  410.  
  411.     DB    06DH,02EH,01DH,011H,060H,031H
  412.     DB    070H,046H,02CH,0FEH,0E5H,07FH
  413.     DB    074H,036H,07CH,089H,084H,021H
  414.     DB    077H,053H,03CH,0FFH,0C3H,02EH
  415.     DB    07AH,0D2H,07DH,05BH,095H,01DH
  416.     DB    07CH,025H,0B8H,046H,058H,063H
  417.     DB    07EH,016H,0FCH,0EFH,0FDH,075H
  418.     DB    080H,0D2H,0F7H,017H,072H,031H
  419.  
  420. ; ArcTan standard function
  421.  
  422. RArcTan:
  423.  
  424.     LOC    Temp,BYTE,6
  425.  
  426.     ENTRY    FAR
  427.     OR    AL,AL
  428.     JNZ    @@0
  429.     JMP    @@8
  430. @@0:    XOR    CX,CX
  431.     TEST    DH,80H
  432.     JZ    @@1
  433.     INC    CX
  434.     AND    DH,7FH
  435. @@1:    PUSH    CX
  436.     MOV    CX,81H
  437.     XOR    SI,SI
  438.     XOR    DI,DI
  439.     CALL    RealCmp
  440.     JB    @@2
  441.     XCHG    AX,CX
  442.     XCHG    BX,SI
  443.     XCHG    DX,DI
  444.     CALL    RealDiv
  445.     POP    CX
  446.     INC    CX
  447.     INC    CX
  448.     PUSH    CX
  449. @@2:    MOV    CX,04A7EH    ;PI/24
  450.     MOV    SI,0E98EH
  451.     MOV    DI,00C6FH
  452.     CALL    RealCmp
  453.     JAE    @@3
  454.     CALL    ArcTan
  455.     JMP    SHORT @@6
  456. @@3:    MOV    DI,OFFSET CS:ArcTanScale
  457.     MOV    CX,2
  458. @@4:    PUSH    CX
  459.     PUSH    DI
  460.     MOV    CX,CS:[DI].w0
  461.     MOV    SI,CS:[DI].w2
  462.     MOV    DI,CS:[DI].w4
  463.     CALL    RealCmp
  464.     POP    DI
  465.     POP    CX
  466.     JB    @@5
  467.     ADD    DI,18
  468.     LOOP    @@4
  469.     SUB    DI,6
  470. @@5:    ADD    DI,6
  471.     MOV    Temp.w0,AX
  472.     MOV    Temp.w2,BX
  473.     MOV    Temp.w4,DX
  474.     PUSH    DI
  475.     MOV    CX,CS:[DI].w0
  476.     MOV    SI,CS:[DI].w2
  477.     MOV    DI,CS:[DI].w4
  478.     CALL    RealSubP
  479.     PUSH    DX
  480.     PUSH    BX
  481.     PUSH    AX
  482.     MOV    AX,Temp.w0
  483.     MOV    BX,Temp.w2
  484.     MOV    DX,Temp.w4
  485.     CALL    RealMul
  486.     MOV    CX,81H
  487.     XOR    SI,SI
  488.     XOR    DI,DI
  489.     CALL    RealAdd
  490.     MOV    CX,AX
  491.     MOV    SI,BX
  492.     MOV    DI,DX
  493.     POP    AX
  494.     POP    BX
  495.     POP    DX
  496.     CALL    RealDiv
  497.     CALL    ArcTan
  498.     POP    DI
  499.     ADD    DI,6
  500.     MOV    CX,CS:[DI].w0
  501.     MOV    SI,CS:[DI].w2
  502.     MOV    DI,CS:[DI].w4
  503.     CALL    RealAdd
  504. @@6:    POP    CX
  505.     TEST    CL,2
  506.     JZ    @@7
  507.     PUSH    CX
  508.     MOV    CX,AX
  509.     MOV    SI,BX
  510.     MOV    DI,DX
  511.     MOV    AX,02181H    ;PI/2
  512.     MOV    BX,0DAA2H
  513.     MOV    DX,0490FH
  514.     CALL    RealSub
  515.     POP    CX
  516. @@7:    TEST    CL,1
  517.     JZ    @@8
  518.     OR    DH,80H
  519. @@8:    EXIT
  520.  
  521. ; ArcTan scaling constants
  522.  
  523. ArcTanScale:
  524.  
  525.     DB    07FH,0E7H,0CFH,0CCH,013H,054H
  526.     DB    07FH,0F6H,0F4H,0A2H,030H,009H
  527.     DB    07FH,06AH,0C1H,091H,00AH,006H
  528.     DB    080H,0B5H,09EH,08AH,06FH,044H
  529.     DB    080H,082H,02CH,03AH,0CDH,013H
  530.     DB    080H,06AH,0C1H,091H,00AH,006H
  531.     DB    081H,000H,000H,000H,000H,000H
  532.     DB    080H,021H,0A2H,0DAH,00FH,049H
  533.  
  534. ; ArcTan series constants
  535.  
  536. ArcTanConst:
  537.  
  538.     DB    07DH,0E8H,0A2H,08BH,02EH,0BAH
  539.     DB    07DH,08EH,0E3H,038H,08EH,063H
  540.     DB    07EH,049H,092H,024H,049H,092H
  541.     DB    07EH,0CDH,0CCH,0CCH,0CCH,04CH
  542.     DB    07FH,0ABH,0AAH,0AAH,0AAH,0AAH
  543.  
  544. ; Compute fractional ArcTan
  545.  
  546. ArcTan:
  547.  
  548.     MOV    DI,OFFSET CS:ArcTanConst
  549.     MOV    CX,5
  550.  
  551. ; Evaluate 2nd power series
  552.  
  553. CalcSer2:
  554.  
  555.     PUSH    DX
  556.     PUSH    BX
  557.     PUSH    AX
  558.     PUSH    CX
  559.     PUSH    DI
  560.     MOV    CX,AX
  561.     MOV    SI,BX
  562.     MOV    DI,DX
  563.     CALL    RealMul
  564.     POP    DI
  565.     POP    CX
  566.     CALL    CalcSer1
  567.     POP    CX
  568.     POP    SI
  569.     POP    DI
  570.     JMP    RealMul
  571.  
  572. ; Evaluate 1st power series
  573. ; In    CX    = Number of constants
  574. ;    CS:DI = Pointer to first constant
  575. ; Out    R1    = (((C1*R1+C2)*R1+C3)*R1...+Cn)*R1+1
  576.  
  577. CalcSer1:
  578.  
  579.     LOC    Temp,BYTE,6
  580.  
  581.     ENTRY
  582.     MOV    Temp.w0,AX
  583.     MOV    Temp.w2,BX
  584.     MOV    Temp.w4,DX
  585.     MOV    AX,CS:[DI].w0
  586.     MOV    BX,CS:[DI].w2
  587.     MOV    DX,CS:[DI].w4
  588.     PUSH    CX
  589.     PUSH    DI
  590.     JMP    SHORT @@2
  591. @@1:    PUSH    CX
  592.     PUSH    DI
  593.     MOV    CX,CS:[DI].w0
  594.     MOV    SI,CS:[DI].w2
  595.     MOV    DI,CS:[DI].w4
  596.     CALL    RealAdd
  597. @@2:    MOV    CX,Temp.w0
  598.     MOV    SI,Temp.w2
  599.     MOV    DI,Temp.w4
  600.     CALL    RealMul
  601.     POP    DI
  602.     POP    CX
  603.     ADD    DI,6
  604.     LOOP    @@1
  605.     MOV    CX,81H
  606.     XOR    SI,SI
  607.     XOR    DI,DI
  608.     CALL    RealAdd
  609.     EXIT
  610.  
  611. CODE    ENDS
  612.  
  613.     END
  614.