.TITLE P$SINCOS - SIN AND COS .IDENT /790821/ ; USAGE: ; Y := COS(X); Y := SIN(X) ; REAL PARAMETER X ON TOP OF STACK ; REAL RESULT RETURNED ON TOP OF STACK ; REGISTER USAGE: ; R0,R1 - SCRATCH ; R2,R3 - SCRATCH (SAVED/RESTORED) ; ; CALLS ; $$$219 GET INTEGER PART OF REAL ; $$$220 GET FRACTIONAL PART OF REAL .GLOBL $$$220,$$$219 ; .PSECT $$$105::;COS(X) MOV (SP)+,R0 ;SAVE RETURN MOV #7733,-(SP) ;PUSH PI/2 MOV #40311,-(SP) ;; FADD SP ;SHIFT AXIS TO MAKE IT =SIN(X) MOV R0,-(SP) ;RESTORE RETURN ; $$$104::;SIN(X) MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 CLR -(SP) ;MAKE ROOM FOR QUADRANT FLAG MOV 12(SP),-(SP) ;PUSH ARG MOV 12(SP),-(SP) ;; ASL (SP) ;REMOVE AND SAVE SIGN ROR 4(SP) ;IN QUADRANT FLAG ROR (SP) ;; MOV #7733,-(SP) ;PUSH 2*PI MOV #40711,-(SP) ;; FDIV SP ;X/2*PI JSR PC,$$$220 ;FRACT(X/2PI) TST (SP) ;CHECK FOR ZERO FRACTION BEQ RTN ;QUIT NOW INCB 1(SP) ;4*FRACT(X/2PI) MOV 2(SP),-(SP) ;COPY ARG MOV 2(SP),-(SP) JSR PC,$$$219 ;FLOAT(INTR(4*FRACT(X/2PI))) BIS (SP),8.(SP) ;SAVE QUADRANT NO. FSUB SP ;Y=FRACT(4*FRACT(X/2PI)) TSTB 4(SP) ;TEST QUADRANT BEQ 1$ ;FIRST OR THIRD QUAD ADD #100000,(SP) ;NEGATE STACK ITEM CLR -(SP) ;PUSH 1. MOV #40200,-(SP) ;; FADD SP ;X=1.-X BR 2$ 1$: ASRB 5(SP) ;TEST QUADRANT BCC 2$ ;FIRST OR SECOND QUAD ADD #100000,(SP) ;NEGATE STACK ITEM 2$: MOV 2(SP),-(SP) ;COPY ARG MOV 2(SP),-(SP) ;; MOV 2(SP),-(SP) ;COPY ARG MOV 2(SP),-(SP) ;; FMUL SP ;SQUARE IT MOV (SP)+,R0 ;SAVE Y*Y MOV (SP)+,R1 ;; MOV #CONSTS+4,R2 ;POINT TO LIST OF COEFFICIENTS MOV #5,R3 ;LOOP 5 BR 4$ 3$: MOV R1,-(SP) ;PUSH Y*Y MOV R0,-(SP) ;; 4$: MOV -(R2),-(SP) ;PUSH COEFFICIENT MOV -(R2),-(SP) ;; SOB R3,3$ ;LOOP MOV #4,R3 ;LOOP 4 5$: FMUL SP ;COMPUTE POLYNOMIAL FADD SP ;; SOB R3,5$ ;;LOOP FMUL SP ;; RTN: MOV (SP)+,12(SP) ;POP RESULT MOV (SP)+,12(SP) ;; TST (SP)+ ;POP QUADRANT FLAG BGE 6$ ADD #100000,6(SP) ;NEGATE RESULT 6$: MOV (SP)+,R3 ;RESTORE R3 MOV (SP)+,R2 ;RESTORE R2 RTS PC .WORD 035036,153672 ;.00015148419 .WORD 136231,023143 ;-.00467376557 .WORD 037243,032130 ;.0796896793 .WORD 140045,056741 ;-.645963711 CONSTS: .WORD 040311,007733 ;1.570796318 .END