.TITLE P$SINCOS - SIN AND COS .IDENT /780701/ ; USAGE: ; Y := COS(X); Y := SIN(X) ; LONGREAL PARAMETER X ON TOP OF STACK ; LONGREAL RESULT RETURNED ON TOP OF STACK ; REGISTER USAGE: ; R0,R1 - SCRATCH ; R4 - SCRATCH (SAVED/RESTORED) ; F0,F1,F2 - SCRATCH (SAVED/RESTORED) ; ASSUMES: ; SETD EXECUTED BY CALLING PROGRAM ; F0=%0 F1=%1 F2=%2 F3=%3 F4=%4 $$$105:: P$COS:: STD F0,-(SP) ;SAVE F0 LDD 10.(SP),F0 ;LOAD ARG ADDD PIOV2,F0 ;X + PI/2 BR SCOS ;SIN ; $$$104:: P$SIN:: STD F0,-(SP) ;SAVE F0 LDD 10.(SP),F0 ;LOAD ARG SCOS: STD F1,-(SP) ;SAVE F1 STD F2,-(SP) ;SAVE F2 MOV R4,-(SP) ;SAVE R4 SETI ;SHORT INTEGERS MOV #FCONST,R0 ;TABLE POINTER CLR R4 ;SIGN FLAG CFCC ;SIGN OF ARGUMENT BGE 2$ INC R4 ;SET SIGN FLAG ABSD F0 ;MAKE X PLUS 2$: DIVD (R0)+,F0 ;X/2PI MODD #^O040200,F0 ;F0= FRACT(X/2PI) CFCC BEQ ENDSCOS ;EXIT ON 0 FRACTION MODD #^O040600,F0 ;F0= FRACTION(4.0 * FRACTION(X/2PI)) STCDI F1,R1 ;QUAD= INT(4.0 * FRACTION(X/2PI)) ROR R1 ;EVEN? BCC 3$ ;JUMP IF 1ST OR 3RD QUAD NEGD F0 ADDD #^O040200,F0 ;Y := 1 - X 3$: ROR R1 BCC 4$ ;JUMP IF 1ST OR 2ND QUAD NEGD F0 ;Y := -Y 4$: LDD F0,F2 MULD F2,F2 ;Z=Y**2 MOV #8.,R1 ;COUNT OF CONSTANTS FOR POLYNOMIAL LDD (R0)+,F1 ;INITIALIZE ACCUMULATOR 5$: MULD F2,F1 DEC R1 ;COUNT ADDD (R0)+,F1 ;F1:= Z:F1 + C(I) BGT 5$ ;LOOP MULD F1,F0 ;F0:= Y*F1 TST R4 ;TEST SIGN BEQ ENDSCOS NEGD F0 ;SIN(-X) = -SIN(X) ENDSCOS:STD F0,28.(SP) ;PUT RESULT ON STACK MOV (SP)+,R4 LDD (SP)+,F2 LDD (SP)+,F1 LDD (SP)+,F0 RTS PC ; PIOV2: .WORD 040311,007732 ;PI/2 .WORD 121041,064302 ; TABLE OF COEFFICIENTS FCONST: .WORD 040711,007732 ;2*PI .WORD 121041,064302 .WORD 026716,106703 ;.587061098171E-11 .WORD 045277,146362 .WORD 130467,136273 ;-.66843217206396E-9 .WORD 103054,123153 .WORD 032164,074657 ;.5692134872719023E-7 .WORD 047254,154742 .WORD 133561,101646 ;-.3598843007208693E-5 .WORD 167216,134016 .WORD 035050,036032 ;.1604411847068221E-3 .WORD 041214,103131 .WORD 136231,064546 ;-.4681754135302643E-2 .WORD 071423,125024 .WORD 037243,032743 ;.7969262624616544E-1 .WORD 035655,051557 .WORD 140045,056747 ;-.6459640975062462 .WORD 030455,171222 CONSTS: .WORD 040311,007732 ;1.570796326794897 .WORD 121041,064302 .END