home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / turbopas / tpmath.arc / TRIG.ASM < prev    next >
Assembly Source File  |  1989-03-08  |  4KB  |  127 lines

  1.        P8087
  2.        Ideal
  3.        Model Tpascal
  4.  
  5.        DataSeg
  6. EXTRN  minus2: word
  7.  
  8.        Codeseg
  9.  
  10.        Proc TAN FAR Theta: qword
  11.        Public Tan
  12.        Local Status_word: Word, Sign_Store: Byte
  13.  
  14. ; First Check for a negitive argument
  15. ; Note Tan(-X) = -Tan(X)
  16.  
  17.        FLD     [qword ptr Theta]
  18.        Mov     [Sign_Store],         0           ; Assume Positive
  19.        FTST
  20.        FSTSW   [Status_Word]
  21.        Fwait
  22.        mov     ah,     [byte ptr Status_word + 1]
  23.        sahf
  24.        jnc     Non_Negitive
  25.        mov     [Sign_Store],         -1          ; It's Negitive
  26.        fabs
  27.  
  28. Non_Negitive:
  29. ; Now get ST between 0 and pi/4
  30.        Fild    [Minus2]                        ; Load -2
  31.        FLDPI                                   ; Load Pi
  32.        FSCALE                                  ; Got pi/4
  33.        FSTP    ST(1)                           ; Dump -2
  34.        FXCH
  35.  
  36. ; Now X is in ST and pi/4 in ST(1)
  37. Range:
  38.        FPREM
  39.        FSTSW   [Status_Word]
  40.        Fwait
  41.        mov     ah,     [byte ptr status_word+1]
  42.        sahf
  43.        jp      Range                           ; This tests bit C2
  44.  
  45. ; At this point AH has the status bits
  46. ; Now Lets see if the remainder was exactly zero
  47.  
  48.        mov     bx,     0
  49.        and     [byte ptr status_word+1], 01000001B
  50.        cmp     [byte ptr status_word+1], 01000001B
  51.        jne     Not_zero
  52.        Mov     Bx,     -1
  53.  
  54. Not_Zero:
  55. ; There are four possibilities given ST Now has x mod Pi/4
  56.  
  57. ; Octant      C3   C1    Calculate          If Zero
  58. ; 0,4          0    0    FPTAN(ST)             0
  59. ; 1,5          0    1    1/FPTAN(PI/4-ST)      1
  60. ; 2,6          1    0    -1/FPTAN(ST)          infinity
  61. ; 3,7          1    1    -FPTAN(PI/4-ST)       -1
  62.  
  63. ; First Check C1 and Take FPTAN
  64.        Test    ah,     10B                     ; Is C1 on ?
  65.        jz      C1ISOFF                         ; Jump if off
  66.        CMP     BX,     0                       ; ST Exactly Zero?
  67.        JNE     STOANDC1                        ; Jump if Yes
  68.        Fsubp   ST(1),  ST                      ; Now PI - ST
  69.        FPTAN
  70.        JMP     TANDONE
  71.  
  72. STOANDC1:
  73.        FSTP    ST                              ; Pop ST
  74.        FSTP    ST                              ; and pi/4
  75.        FLD1                                    ; Load Ratio 1 to 1
  76.        FLD1
  77.        Jmp     TANDONE
  78.  
  79. C1ISOFF:
  80.        FSTP    ST(1)                           ; Get Rid of pi/4
  81.        cmp     bx,     0                       ; ST exactly 0?
  82.        jne     STOANDNOC1                      ; Jump if yes
  83.        FPTAN
  84.        jmp     TANDONE
  85.  
  86. STOANDNOC1:
  87.        FSTP    ST                              ; Dump ST
  88.        FLDZ                                    ; Load Ratio 0 to 1
  89.        FLD1
  90.  
  91. TANDONE:
  92. ; Put C1 xor C3 in Bx
  93.        mov     bx,     0                       ; Assume C3 off
  94. ; If C3 is on then change signs
  95.        test    ah,     01000000b
  96.        jz      NOC3                            ; Jump If Off
  97.        FCHS
  98.        Mov     bx,     1                       ; Note C3 is on
  99.  
  100. NoC3:
  101. ; Is c1 on?
  102.        Test    ah,     10b
  103.        jz      NOC1                            ; Jump if off
  104.        xor     bx,     1
  105.        jmp     recip
  106. NoC1:  xor     bx,     0
  107. Recip:
  108. ; If Bx=1 Then we want reciprocal of Ratio
  109.        cmp     Bx,     1
  110.        jne     NORECIP
  111.        FXCH
  112. NORECIP:
  113.        FDIVP   ST(1),  ST                      ; That's It
  114.  
  115. ; Did we orginally change the signs?
  116.        cmp     [Sign_Store], 0
  117.        je      Leave_Pos
  118.        FCHS
  119.  
  120. Leave_Pos:
  121.        Ret
  122.        endp
  123.        end
  124.  
  125.  
  126.  
  127.