home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1986 / 12 / camplst.dec < prev    next >
Text File  |  1986-12-31  |  2KB  |  95 lines

  1. «TS10,18,38»
  2. ; Listing One: Computing sine, cosine, and tangent
  3. ; NS-320XX assembler
  4. ; Sine, cosine, & tangent routines
  5.  
  6. RadScl    MOVF    PIO2,R2    ;Divide by pi/2 = 1.57079635
  7.     BR.S    DoScal
  8.  
  9. DegScl    MOVBF    90,R2    ;Scale for degrees
  10.  
  11. ; Scale for sin cos, tan
  12. DoScal    DIVF    R2,R3    ;Now 90 degrees = 1.00
  13. DQuadr    MOVBF    4,R4    ;4 = 360 degrees
  14.     MOVBF    1,R1    ;1 = 90 degrees
  15.     MOVBF    2,R2    ;2 = 180
  16.     MOVBF    3,R5    ;3 = 270
  17. SnScl1    CMPF    R3,R4    ;Is angle > 360 degrees?
  18.     BLT.S    SnScl3    ;go if less than 360
  19.     SUBF    R4,R3    ;else subtract 360
  20.     BR.S    SnScl1    ;do it again
  21. SnScl3    CMPF    R3,R5    ;>270?
  22.     BLE.S    SnScl5    ;no, go
  23.     SUBF    R4,R3    ;make minus: ang=ang-360
  24. SnScl5    CMPF    R3,R1    ;>90?
  25.     BLE.S    ScnCl7
  26.     SUBF    R3,R2
  27.     MOVF    R2,R3    ;ang=180-ang
  28. ScnCl7    RET        ;scaled value in R3
  29.  
  30. ACos    MOVBF    90,R2    ;angle, degrees in R3
  31.     DIVF    R2,R3    ;divide by 90
  32.     MOVBF    1,R2
  33.     ADDF    R2,R3    ;make angle plus 90
  34.     BSR    DQuadr    ;figure quadrant
  35.     BR.S    DoSin    ;go do sine, return from it
  36.  
  37. ASin    BSR    DegScl    ;Angle in degrees
  38.             ;Fall through to...
  39.  
  40. ; Compute Sine(x)
  41. ; Sine = 0 + 1.570795*X -0.645921*X^3
  42. ;          + 0.07946765*X^5 - 0.004362469*X^7
  43.  
  44. DoSin    ADDR    SNTAB,R0    ;get address of table
  45.     MOVQ.D    4,R6    ;init R6
  46. ; Enter with table addrs in R0, # terms in R6
  47.     MOVF    R3,R1    ;save angle in R1
  48.     MOVF    R1,R5    ;and in R5
  49.     MOVBF    0,R3    ;sine starts at zero
  50. SinLp    MOV.D    0(R0)[R6:D],SNTAB    ;get multiplier
  51.     MULF    R5,SNTAB    ;mult angle
  52.     ADDF    SNTAB,R3    ;add to sine
  53.     MULF    R1,R5    ;angle ^ n+2
  54.     MULF    R1,R5
  55.     ACB.BS    -1,R6,SinLp    ;do again till done
  56.     RET
  57.  
  58. ; Compute Tan(x)
  59. ; Tan(x) = Sin(x)/Cos(x)
  60.  
  61. ATan    MOVBF    90,R2    ;scale for degrees
  62.     DIVF    R2,R3
  63.     MOVF    R3,SNTEMP    ;save scaled angle
  64.     BSR    DQuadr    ;figure quadrant
  65.     BSR    DoSin    ;compute sin
  66.     MOVF    R3,TOS    ;save sine on stack
  67.     MOVBF    1,R3
  68.     ADDFF    SNTEMP,R3    ;add for cosine
  69.     BSR    DQuadr    ;figure quadrant
  70.     BSR    DoSin    ;compute cosine
  71.     MOVF    R3,R2    ;move cosine to R2
  72.     MOVF    TOS,R3    ;recover sine
  73. ; R0 now = 0
  74.     CMPF    R0,R2    ;have zero?
  75.     BNE.S    ATanDv    ;no, divide
  76.     MOVF    FNSM,R3    ;else use big number
  77.     RET
  78.  
  79. ATanDv    DIVF    R2,R3    ;Tan = Sin/Cos
  80.     RET
  81.  
  82. FNSM    BYTE    0,0C0h,0DAh,45h    ;7000
  83.  
  84. PIO2    BYTE    0DBh,0Fh,0C9h,3Fh    ;pi/2 = 1.57079635
  85.  
  86. SNTEMP    BLK.D    1    ;temporary storage
  87.  
  88. SNTAB    BLK.D    1    ;temp
  89. ; these are in reverse order of use
  90.     BYTE    0Bh,0F3h,8Eh,0BBh    ;-0.004362469
  91.     BYTE    6Ch,0CAh,0A2h,03Dh    ;0.07948765
  92.     BYTE    14h,5Bh,25h,0BFh    ;-0.645921
  93.     BYTE    0D0h,0Fh,0C9h,3Fh    ;1.570795
  94.  
  95.