ASMB,L,R,C
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
*   NAME: PART OF MATH LIBRARY
*   SOURCE:  24998-18XXX  SEE NAM FOR LAST THREE DIGITS 
*   RELOC: PART OF 24998-12001
*   PGMR: BG & JTS
* 
      HED ".SNCS" - SINGLE PRECISION TRIGONOMETRIC SINE, COSINE.
      NAM .SNCS,6 24998-1X159 REV.2001 780424 
* 
      ENT SIN,COS 
      EXT .ZPRV,.CMRS,..FCM 
* 
A     EQU 0 
B     EQU 1 
* 
*     .SNCS TAKES THE SINGLE-PRECISION SINE OR COSINE OF A
*     SINGLE-PRECISION ARGUMENT.
* 
*     CALLING SEQUENCE: 
* 
*                   DLD <ARG> 
*                   JSB <ROUTINE>    "SIN" OR "COS" 
*                   <ERROR RETURN>   (A,B) = ASCII "05OR" 
*                   <NORMAL RETURN>  (A,B) = RESULT 
* 
*     THE ERROR RETURN IS TAKEN FOR ARGUMENTS OUTSIDE THE RANGE 
*     [-32768*PI/4,+32768*PI/4).
* 
*     METHOD:  THE ARGUMENT IS REDUCED TO THE RANGE [-PI/4,PI/4]
*     USING THE IDENTIES: 
*                   SIN(X)=SIN(X-2*K*PI)
*                   COS(X)=COS(X-2*K*PI)
*                   SIN(X)=-SIN(X-PI) 
*                   COS(X)=-COS(X-PI) 
*                   SIN(X)=COS(X-PI/2)
*                   COS(X)=SIN(X+PI/2)
*     THIS IS DONE BY SUBTRACTING THE MULTIPLE (N) OF PI/2 WHICH
*     MINIMIZES THE RESULT, AND OBSERVING THE FOLLOWING:
*       1) ALL BITS ABOVE BIT 1 IN N MAY BE IGNORED, SINCE THESE ARE
*          MULTIPLES OF 4, OR MULTIPLES OF 2*PI SUBTRACTED. 
*       2) IF BIT 1 IS SET, THE RESULT SHOULD BE NEGATED, SINCE PI WAS
*          SUBTRACTED.
*       3) IF BIT 0 IS SET, THE COSINE SERIES SHOULD BE USED, SINCE PI/2
*          WAS SUBTRACTED.
*     THE COSINE ENTRY POINT EFFECTIVELY ADDS PI/2 TO THE ARGUMENT BY 
*     ADDING 1 TO N JUST AFTER THE REDUCTION. 
* 
*     THE FOLLOWING APPROXIMATIONS ARE USED IN THE RANGE [-PI/4,+PI/4] .
* 
*                   SINE(X) = X*(S1+XSQ*(S2+XSQ*(S3+XSQ*S4))) 
*                   COSINE(Y) =  C1+YSQ*(C2+YSQ*(C3+YSQ*C4))
*     WHERE:
*                   XSQ = X**2          YSQ = Y**2
*                   S1 = .78539816      C1 = 1.0
*                   S2 = -.0807454325   C2 = -.30842483 
*                   S3 = .002490001     C3 = .015851077 
*                   S4 = -.000035950439 C4 = -.00031957 
      SKP 
*                   RANGE REDUCE, SET SIGN FLAG, CHOOSE WHICH SERIES. 
* 
SIN   NOP 
      JSB .ZPRV     FOR SHARING.
      DEF LIBX
      STA Y 
      CLA           J=0 
SIN1  STA J 
      LDA Y         REDUCE ARG
      JSB .CMRS 
      DEF .4PI
      DEF N 
      JMP ERROR     IF WAS TOO BIG
      ISZ SIN       GOOD RETURN 
      STA Y         SAVE Y = REDUCED X
      STB Y+1 
      FMP Y         Y**2
      STA YSQ 
      STB YSQ+1 
      LDA N         2*(NUMBER OF PI/2 SUBTRACTED) 
      ADA J         0 FOR SIN, 2 FOR COS
      ERA,ERA       E=1 IFF ODD NUMBER OF PI/2 (USE COSINE) 
      IOR =B177776  A=-1 IFF ODD NUMBER OF PI (NEGATE RESULT) 
      STA N         DONE NOW SO DON'T HAVE TO STORE RESULT
      LDA YSQ       NOW (A,B) = Y**2
      SEZ           SINE ?
      JMP SIN2      NO, USE COSINE SERIES 
* 
*                   USE SINE SERIES 
* 
      FMP S4        FORM Y*(S1+YSQ*(S2+YSQ*(S3+YSQ*S4)))
      FAD S3
      FMP YSQ 
      FAD S2
      FMP YSQ 
      FAD S1
      FMP Y         RESULT
      JMP SIN3      GO ATTACH SIGN
      SKP 
*                   USE COSINE SERIES 
* 
SIN2  FMP C4        FORM C1+YSQ*(C2+YSQ*(C3+YSQ*C4))
      FAD C3
      FMP YSQ 
      FAD C2
      FMP YSQ 
      FAD C1
* 
*                   NEGATE IF ODD NUMBER OF PI
* 
SIN3  ISZ N         NEGATE ?
      JMP LIBX      NO, EXIT
      JSB ..FCM     NEGATE
LIBX  JMP SIN,I     EXIT
      DEF SIN 
* 
*                   ERROR PROCESSING
* 
ERROR LDA =A05      RETURN (A,B) = ASCII "05OR" 
      LDB =AOR
      JMP LIBX
* 
*                   COSINE ENTRY POINT. 
* 
COS   NOP 
      JSB .ZPRV     FOR SHARING.
      DEF LIBX2     FAKE EXIT 
      STA Y 
      LDA COS       COPY ENTRY POINT
      STA SIN 
      LDA =D2       J=2 
      JMP SIN1
LIBX2 JMP SIN,I     FAKE EXIT.
      ORG *-1 
      SKP 
*                   LOCALS & CONSTANTS
* 
Y     BSS 2         REDUCED ARG 
YSQ   BSS 2         Y**2
.4PI  OCT 050574,140667,023402  4/PI
N     BSS 1         2*(NUMBER OF PI/2 SUBTRACTED) 
J     BSS 1         0 FOR SIN, 2 FOR COS
S1    DEC .78539816 
S2    DEC -.0807454325
S3    DEC .002490001
S4    DEC -.000035950439
C1    DEC 1.0 
C2    DEC -.30842483
C3    DEC .015851077
C4    DEC -.00031957
      END 
                                                                                                                                                                  