
 1000  *SAVE S.DP18 TRIG
 1010  *--------------------------------
 1020  AS.CHRGET  .EQ $B1
 1030  AS.CHRGOT  .EQ $B7
 1040  AS.CHKCLS  .EQ $DEBB
 1050  AS.CHKOPN  .EQ $DEB8
 1060  *--------------------------------
 1070  POLY.1     .EQ $FFFF
 1080  POLY.N     .EQ $FFFF
 1090  DADD       .EQ $FFFF
 1100  DSUB       .EQ $FFFF
 1110  DMULT      .EQ $FFFF
 1120  DDIV       .EQ $FFFF
 1130  DP.INT     .EQ $FFFF
 1140  DP.EXP     .EQ $FFFF
 1150  DP.TRUE    .EQ $FFFF
 1160  DP.FALSE   .EQ $FFFF
 1170  MOVE.DAC.ARG   .EQ $FFFF
 1180  MOVE.YA.ARG.1  .EQ $FFFF
 1190  MOVE.YA.DAC.1  .EQ $FFFF
 1200  SWAP.ARG.DAC   .EQ $FFFF
 1210  MOVE.DAC.TEMP1 .EQ $FFFF
 1220  MOVE.DAC.TEMP2 .EQ $FFFF
 1230  MOVE.DAC.TEMP3 .EQ $FFFF
 1240  MOVE.TEMP1.DAC .EQ $FFFF
 1250  MOVE.TEMP1.ARG .EQ $FFFF
 1260  MOVE.TEMP2.ARG .EQ $FFFF
 1270  MOVE.TEMP3.ARG .EQ $FFFF
 1280  PUSH.DAC.STACK .EQ $FFFF
 1290  POP.STACK.ARG  .EQ $FFFF
 1300  *--------------------------------
 1310  DAC.EXPONENT   .BS 1
 1320  DAC.HI         .BS 10
 1330  DAC.SIGN       .BS 1
 1340  *--------------------------------
 1350  ARG.EXPONENT   .BS 1
 1360  ARG.HI         .BS 10
 1370  ARG.SIGN       .BS 1
 1380  *--------------------------------
 1390  N          .BS 1
 1400  UV.SIGN    .BS 1
 1410  *--------------------------------
 1420  P.SIN      .EQ *
 1430  P.SIN.N    .EQ 6    P6*X^6 + P5*X^5 + ... + P1*X + P0
 1440             .HS 3C.50312.63884.64664.12845   P6
 1450             .HS BE.82818.08039.29577.39110   P5
 1460             .HS 40.62919.63490.93113.55230   P4
 1470             .HS C2.25642.44036.60338.57070   P3
 1480             .HS 43.53892.64053.57788.76289   P2
 1490             .HS C4.49326.67470.47152.36677   P1
 1500             .HS 45.12596.16380.91365.41816   P0
 1510  *--------------------------------
 1520  Q.SIN      .EQ *
 1530  Q.SIN.N    .EQ 2    X^2 + Q1*X + Q0
 1540             .HS 43.15743.43316.33194.13935   Q1
 1550             .HS 44.80189.66936.87727.15787   Q0
 1560  *--------------------------------
 1570  CON.ONE    .HS 41.10000.00000.00000.00000
 1580  CON.TWO    .HS 41.20000.00000.00000.00000
 1590  CON.2PI    .HS 41.62831.85307.17958.64769
 1600  CON.PI.2   .HS 41.15707.96326.79489.66192
 1610  CON.PI     .HS 41.31415.92653.58979.32385
 1620  CON.1..2PI .HS 40.15915.49430.91895.33577   1/2PI
 1630  *--------------------------------
 1640  *      COS (DAC)
 1650  *--------------------------------
 1660  DP.COS LDA #CON.PI.2     PI/2
 1670         LDY /CON.PI.2
 1680         JSR MOVE.YA.ARG.1 COS(X) = SIN(X+PI/2)
 1690         LDA #0            GET ABS(DAC) TO FORCE
 1700         STA DAC.SIGN      ...COS(-X)=COS(X)
 1710         JSR DADD
 1720  *--------------------------------
 1730  *      SIN (DAC)
 1740  *      #3371
 1750  *--------------------------------
 1760  DP.SIN
 1770  *---IF X VERY SMALL...-----------
 1780         LDA DAC.EXPONENT
 1790         CMP #$40-10
 1800         BCS .1            NOT VERY SMALL
 1810         RTS               VERY SMALL, SIN(X)=X
 1820  *---ADJUST FOR SIGN OF X---------
 1830  .1     LDA DAC.SIGN      SIN(-X) = - SIN(X)
 1840         PHA               ...SO SAVE SIGN OF X
 1850         LDA #0            ...AND MAKE X POSITIVE
 1860         STA DAC.SIGN
 1870  *---X*(1/2PI)--------------------
 1880         LDA #CON.1..2PI
 1890         LDY /CON.1..2PI
 1900         JSR MOVE.YA.ARG.1
 1910         JSR DMULT
 1920  *---GET FRACTIONAL PART----------
 1930         JSR MOVE.DAC.ARG
 1940         JSR DP.INT
 1950         JSR DSUB
 1960  *---FOLD QUADRANTS INTO ONE------
 1970         JSR MOVE.DAC.ARG  MULTIPLY BY FOUR
 1980         JSR DADD          BY DOUBLING TWICE
 1990         JSR MOVE.DAC.ARG
 2000         JSR DADD          0 <= DAC < 4
 2010         LDA DAC.EXPONENT  IS DAC < 1?
 2020         CMP #$41
 2030         BCC .4            ...YES, IT IS IN 1ST QUADRANT
 2040  *---2ND, 3RD, OR 4TH-------------
 2050         LDA DAC.HI
 2060         CMP #$20          IS DAC < 2.0?
 2070         BCC .3            ...YES, 1ST OR 2ND QUADRANT
 2080  *---FOLD 3RD-4TH OVER 1ST-2ND----
 2090         PLA               ...NO, FLIP SIGN FOR
 2100         EOR #$80                 3RD OR 4TH QUADRANTS
 2110         PHA
 2120         LDA #CON.TWO      FOLD 3RD & 4TH OVER 1ST & 2ND
 2130         LDY /CON.TWO
 2140         JSR MOVE.YA.ARG.1
 2150         JSR SWAP.ARG.DAC
 2160         JSR DSUB
 2170         LDA DAC.EXPONENT
 2180         CMP #$41
 2190         BCC .4            ...ALREADY IN 1ST
 2200  *---FOLD 2ND OVER 1ST------------
 2210  .3     LDA #CON.TWO      LET X=2-X
 2220         LDY /CON.TWO
 2230         JSR MOVE.YA.ARG.1
 2240         JSR DSUB
 2250  *---ANGLE NOW IN 1ST QUADRANT----
 2260  .4     PLA               PUT FINAL SIGN ON X
 2270         STA DAC.SIGN
 2280         LDA DAC.EXPONENT  CHECK FOR VERY SMALL
 2290         CMP #$40-9
 2300         BCC .5            ...YES, SIN(X)=X*PI/2
 2310         JSR MOVE.DAC.ARG  PREPARE FOR POLYNOMIALS
 2320         JSR MOVE.DAC.TEMP1      X IN TEMP1
 2330         JSR DMULT               X*X IN TEMP2
 2340         JSR MOVE.DAC.TEMP2
 2350         LDA #P.SIN
 2360         LDY /P.SIN
 2370         LDX #P.SIN.N
 2380         JSR POLY.N
 2390         JSR MOVE.DAC.TEMP3
 2400         LDA #Q.SIN
 2410         LDY /Q.SIN
 2420         LDX #Q.SIN.N
 2430         JSR POLY.1
 2440         JSR MOVE.TEMP3.ARG
 2450         JSR DDIV               P/Q
 2460         JSR MOVE.TEMP1.ARG     XP/Q
 2470         JMP DMULT
 2480  *--------------------------------
 2490  .5     LDA #CON.PI.2     FOR VERY SMALL X
 2500         LDY /CON.PI.2     SIN(2X/PI) = X*PI/2
 2510         JSR MOVE.YA.ARG.1
 2520         JMP DMULT
 2530  *--------------------------------
 2540  *      TAN (DAC) = SIN(DAC) / COS(DAC)
 2550  *--------------------------------
 2560  DP.TAN JSR PUSH.DAC.STACK  SAVE ANGLE
 2570         JSR DP.SIN          TAN=SIN/COS
 2580         JSR POP.STACK.ARG   GET ANGLE
 2590         JSR PUSH.DAC.STACK  SAVE SIN
 2600         JSR SWAP.ARG.DAC
 2610         JSR DP.COS          GET COSINE
 2620         JSR POP.STACK.ARG   GET SIN
 2630         JMP DDIV            SIN/COS
 2640  *--------------------------------
 2650  P.ATN      .EQ *    HART # 5505
 2660  P.ATN.N    .EQ 3    P3*X^3 + P2*X^2 + P1*X + P0
 2670             .HS 42.12595.80226.30295.47240   P3
 2680             .HS 43.12557.91664.37980.65520   P2
 2690             .HS 43.29892.80380.69396.22448   P1
 2700             .HS 43.19720.30956.84935.02854   P0
 2710  *--------------------------------
 2720  Q.ATN      .EQ *
 2730  Q.ATN.N    .EQ 4    X^4 + Q3X^3 + Q2X^2 + Q1X + Q0
 2740             .HS 42.37066.08632.20190.23801   Q3
 2750             .HS 43.20769.26817.33604.63361   Q2
 2760             .HS 43.36466.24032.97707.76242   Q1
 2770             .HS 43.19720.30956.84935.02861   Q0
 2780  *--------------------------------
 2790  ATN.TBL.H
 2800         .DA /CON.PI.6
 2810         .DA /CON.PI.2
 2820         .DA /CON.PI.3
 2830  ATN.TBL.L
 2840         .DA #CON.PI.6
 2850         .DA #CON.PI.2
 2860         .DA #CON.PI.3
 2870  *--------------------------------
 2880  CON.TAN.PI.12 .HS 40.26794.91924.31122.70647
 2890  CON.PI.6   .HS 40.52359.87755.98298.87308
 2900  CON.PI.3   .HS 41.10471.97551.19659.77462
 2910  CON.SQR.3  .HS 41.17320.50807.56887.72935
 2920  *--------------------------------
 2930  *      ATN FUNCTION
 2940  *      1 OR 2 ARGUMENTS
 2950  *--------------------------------
 2960  DP.ATN JSR AS.CHRGET
 2970         JSR AS.CHKOPN CHECK FOR (
 2980         JSR DP.EXP   GET EXPRESSION
 2990         JSR PUSH.DAC.STACK
 3000         JSR DP.TRUE  IN CASE 1 ARGUMENT
 3010         JSR AS.CHRGOT
 3020         CMP #',      TWO-ARG?
 3030         BNE .1       NO
 3040         JSR AS.CHRGET GOBBLE ,
 3050         JSR DP.EXP   YES,GET OTHER ONE
 3060  .1     JSR POP.STACK.ARG GET 1ST ARG BACK
 3070         JSR AS.CHKCLS     REQUIRE ")"
 3080  *--------------------------------
 3090  *      ATN (ARG,DAC)  ARG/DAC
 3100  *--------------------------------
 3110  DP.ATAN
 3120         LDA DAC.SIGN      SAVE BOTH SIGNS
 3130         ASL               SIGN OF DENOMINATOR
 3140         LDA ARG.SIGN      SIGN OF NUMERATOR
 3150         ROR               BIT 7 = DENOM SIGN
 3160         STA UV.SIGN       BIT 6 = NUMER SIGN
 3170  *---CHECK FOR BOUNDARIES---------
 3180         LDA DAC.EXPONENT  CHECK DENOMINATOR
 3190         BEQ .1            ...V/0, SO RETURN PI/2
 3200         SEC
 3210         LDA ARG.EXPONENT
 3220         BEQ .12           ...0/U, SO RETURN 0
 3230         SBC DAC.EXPONENT
 3240         BMI .13
 3250         CMP #20           IF >10^20, RETURN PI/2
 3260         BCC .11           ...NOT >10^20
 3270  .1     LDA #CON.PI.2     V/0 OR OVERFLOW
 3280         LDY /CON.PI.2     SO RETURN PI/2
 3290         JSR MOVE.YA.DAC.1
 3300         JMP DP.ATN.C
 3310  .13    CMP #-63          IF <10^-63, RETURN 0
 3320         BCS .11
 3330  .12    JSR DP.FALSE      RETURN 0
 3340  .14    JMP DP.ATN.B
 3350  .11    JSR DDIV          CALCULATE V/U
 3360         LDA DAC.EXPONENT
 3370         CMP #$40-10       IF X VERY SMALL, ATAN(X)=X
 3380         BCC .14           ...VERY SMALL INDEED!
 3390  *---FOLD AT PI/4-----------------
 3400         LDA #0            GET ABS(X), BECAUSE
 3410         STA DAC.SIGN        SIGNS ALREADY REMEMBERED
 3420         STA N
 3430         LDA DAC.EXPONENT  IS X<1?
 3440         CMP #$41
 3450         BCC .3            ...YES, X<1
 3460         LDA #CON.ONE      FORM RECIPROCAL
 3470         LDY /CON.ONE
 3480         JSR MOVE.YA.ARG.1
 3490         JSR DDIV          1/X
 3500         LDA #2            AND REMEMBER WE DID IT
 3510         STA N
 3520  *---FOLD AT PI/12----------------
 3530  .3     JSR MOVE.DAC.TEMP1 SAVE X
 3540         LDA #CON.TAN.PI.12 TAN(PI/12)
 3550         LDY /CON.TAN.PI.12
 3560         JSR MOVE.YA.ARG.1
 3570         JSR DSUB           IS X>TAN(PI/12)?
 3580         LDA DAC.SIGN
 3590         PHA
 3600         JSR MOVE.TEMP1.DAC  RESTORE X
 3610         PLA
 3620         BPL .4             ...NO, WE DON'T HAVE TO FOLD
 3630         INC N              ...YES, SO FORM
 3640         LDA #CON.SQR.3     (X*SQR(3)-1) / (SQR(3)+X)
 3650         LDY /CON.SQR.3
 3660         JSR MOVE.YA.ARG.1
 3670         JSR DMULT          X*SQR(3)
 3680         JSR MOVE.DAC.ARG
 3690         JSR DP.TRUE
 3700         JSR DSUB           X*SQR(3)-1
 3710         JSR MOVE.DAC.TEMP2 SAVE IT
 3720         JSR MOVE.TEMP1.ARG GET X
 3730         LDA #CON.SQR.3
 3740         LDY /CON.SQR.3
 3750         JSR MOVE.YA.DAC.1
 3760         JSR DADD           SQR(3)+X
 3770         JSR MOVE.TEMP2.ARG
 3780         JSR DDIV           THE ANSWER
 3790         JSR MOVE.DAC.TEMP1 SAVE FOLDED-UP X
 3800  *---ATAN(0...PI/12)--------------
 3810  .4     JSR MOVE.DAC.ARG
 3820         JSR DMULT          X^2
 3830         JSR MOVE.DAC.TEMP2 SAVE X^2
 3840         LDA #P.ATN
 3850         LDY /P.ATN
 3860         LDX #P.ATN.N
 3870         JSR POLY.N
 3880         JSR MOVE.DAC.TEMP3
 3890         LDA #Q.ATN
 3900         LDY /Q.ATN
 3910         LDX #Q.ATN.N
 3920         JSR POLY.1
 3930         JSR MOVE.TEMP3.ARG GET P
 3940         JSR DDIV           P/Q
 3950         JSR MOVE.TEMP1.ARG GET X
 3960         JSR DMULT          P(X^2)/Q(X^2)*X
 3970  *---UNFOLD FROM PI/12, PI/4------
 3980         LDX N             0, 1, 2, OR 3
 3990         BEQ DP.ATN.B      ...NO ADDEND
 4000         DEX               0, 1, OR 2
 4010         BEQ .5            ...NO COMPLEMENT
 4020         LDA DAC.SIGN      ATAN(1/X)=ATAN(PI/2 - X)
 4030         EOR #$80
 4040         STA DAC.SIGN
 4050  .5     LDA ATN.TBL.L,X   GET A(N)
 4060         LDY ATN.TBL.H,X
 4070         JSR MOVE.YA.ARG.1
 4080         JSR DADD          X + A(N)
 4090  *---UNFOLD INTO QUADRANTS--------
 4100  DP.ATN.B
 4110         BIT UV.SIGN       TEST SIGN OF DENOMINATOR
 4120         BPL DP.ATN.C      ...POSITIVE, 1ST OR 4TH
 4130         LDA #CON.PI       ...NEGATIVE, 2ND OR 3RD
 4140         LDY /CON.PI           SO DO PI-X
 4150         JSR MOVE.YA.ARG.1
 4160         JSR DSUB
 4170  *--------------------------------
 4180  DP.ATN.C
 4190         BIT UV.SIGN       TEST SIGN OF NUMERATOR
 4200         BVC .6            ...POSITIVE, 1ST OR 2ND
 4210         LDA DAC.SIGN      ...NEGATIVE, 3RD OR 4TH
 4220         EOR #$80          -X
 4230         STA DAC.SIGN
 4240  .6     RTS
 4250  *--------------------------------

