ASMB,R,L,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 "DSIN" EXTENDED PRECISION SINE
      NAM DSIN,6 24998-1X144 REV.2001 750701
      ENT DSIN
      EXT .ZRNT,.ENTP,..DCM 
      EXT .DFER,ENTIX,XPOLY,.XADD,.XSUB,.XMPY,.XDIV 
      SPC 1 
* 
*     EVALUATE SIN(X) = Y IN EXTENDED PRECISION.
*     CALLING SEQUENCE: 
*     JSB DSIN
*         DEF *+3 
*         DEF Y 
*         DEF X 
      SPC 1 
TDB   NOP 
      DEC 14
      NOP 
SUB2  NOP 
      JMP XUB2
SIGN  NOP 
X1    REP 3 
      NOP 
TEMP  REP 3 
      NOP 
Y     NOP 
X     NOP 
      SPC 1 
DSIN  NOP 
      JSB .ZRNT 
      DEF LIBX
      JSB .ENTP 
      DEF Y 
      STA TDB+2 
      CLA 
      STA SIGN      SET SIGN FLAG = POSITIVE
      JSB .DFER     PUT X INTO X1 
      DEF X1
      DEF X,I 
      LDA X1
      SSA,RSS       IF X < 0 THEN 
      JMP NOCNG 
      ISZ SIGN      CHANGE SIGN 
      JSB ..DCM     X = -X  SIGN = -SIGN
      DEF X1
NOCNG JSB .XSUB 
      DEF TEMP      TEMP = X - PI 
      DEF X1
      DEF PI
      LDA TEMP
      SSA,RSS       IF X >= PI THEN 
      JSB SUB2      ADJUST X AND SIGN FOR 0<= X <PI 
      JSB .XSUB 
      DEF TEMP      TEMP = X - PI/2 
      DEF X1
      DEF PI2 
      LDA TEMP
      SSA           IF X >= PI/2 THEN 
      JMP NOADJ 
      JSB .XSUB      ADJUST X TO -PI/2 <= X < PI/2
      DEF X1
      DEF X1
      DEF PI
      ISZ SIGN                      AND SET SIGN = -SIGN
      SPC 1 
NOADJ LDA X1        IF ABS(X) < 10^-6 THEN
      SSA            SIN(X) = X * SIGN
      JMP MINX
      JSB .XSUB 
      DEF TEMP
      DEF X1
      DEF .10M6 
      LDA TEMP
SMALL SSA,RSS 
      JMP POLY      ELSE USE POLY. APPROX.
OUT   LDA SIGN
      SLA,RSS       IF SIGN = NEG.
      JMP EXIT
      JSB ..DCM     X1 = -X1
      DEF X1
EXIT  JSB .DFER     Y = X1
      DEF Y,I 
      DEF X1
LIBX  JMP TDB+2,I 
      DEF TDB 
      DEC 0 
      SPC 1 
MINX  JSB .XADD 
      DEF TEMP
      DEF X1
      DEF .10M6 
      LDA TEMP
      CMA 
      JMP SMALL 
      SPC 1 
XUB2  JSB .XDIV 
      DEF TEMP      TEMP = X / PI 
      DEF X1
      DEF PI
      JSB ENTIX 
      DEF *+3 
      DEF TEMP      TEMP = ENTIER(X/PI) 
      DEF TEMP
      SLA           IF TEMP IS ODD THEN 
      ISZ SIGN       SIGN = -SIGN 
      JSB .XMPY 
      DEF TEMP      TEMP = PI*ENTIER(X/PI)
      DEF TEMP
      DEF PI
      JSB .XSUB 
      DEF X1
      DEF X1
      DEF TEMP
      JMP SUB2,I
      SPC 1 
      SPC 1 
POLY  JSB .XMPY 
      DEF TEMP      TEMP = X * X
      DEF X1
      DEF X1
      JSB XPOLY 
      DEF *+5 
      DEF TEMP      TEMP = POLY(TEMP) 
      DEF N7
      DEF TEMP
      DEF K1
      JSB .XMPY 
      DEF X1        X = TEMP * X
      DEF TEMP
      DEF X1
      JMP OUT 
      SPC 1 
PI    OCT 62207,166521,10404
.10M6 OCT 41433,15702,153333
PI2   OCT 62207,166521,10402
N7    OCT 7 
K1    OCT 52251,144311,26301
      OCT 112177,152274,154317
      OCT 56167,34402,77735 
      OCT 113771,100307,114351
      OCT 42104,42102,41365 
      OCT 125252,125252,125775
      OCT 40000,0,2 
      END 
* 
                                                                                                                                    