.TITLE ISNCS, RGC06F72 .IDENT '750214' .GLOBL ISIN,ICOS ;ENTRIES ;PURPOSE: COMPUTE 16-BIT SIN(PI/2*I/J) OR ; COS(PI/2*I/J) FOR J>0, I ANY 16-BIT INTEGER. ;SYSTEM: PDP-11/40, EIS, DOS-V9.20C, MACRO ;USAGE: THE FORTRAN-COMPATIBLE CALLS ARE IX=ISIN(I,J) ; AND IY=ICOS(I,J). I AND J ARE INTEGERS, WITH J>0 ; THE ONLY RESTRICTION. THE INTEGER VALUE RETURNED ; IN R0, AND TO IX OR IY ABOVE, IS EQUAL TO THE ; APPROPRIATE TRIGONOMETRIC FUNCTION VALUE MULTIPLIED ; BY 2**15. (THE MAGNITUDE IS NOT ALLOWED TO EXCEED ; 2**15-1.) ;METHOD: IQSIN USES A FOUR-TERM (SEVENTH-ORDER) ; CHEBYSHEV APPROXIMATION AND DOES ALL COMPUTATION ; WITH 16-BIT PRECISION. ;SIZE: 41 WORDS. ;ACCURACY: FOR J A POWER OF 2, THE MAX ABSOLUTE ERROR ; IS 1.60 LSB (LEAST SIGNIFICANT BIT). FOR J NOT ; A POWER OF 2, THE MAX ABSOLUTE ERROR COULD NOT ; EXCEED 2.4 LSB, AND IS NOT BELIEVED TO EXCEED ; 1.74 LSB. SEE IQSIN FOR MORE INFORMATION. ;TIMING: ISIN TAKES 212 US AND ICOS 220 US, AVERAGE. ;REMARKS: ISIN AND ICOS SAVE REGISTERS 1-5, DEFINE ; THE IQSIN ARGUMENTS IN R1 AND R2, AND JUMP TO ; ENTRY IQSIN.. IQSIN RETURNS DIRECTLY TO THE ; CALLING PROGRAM. ALL REGISTERS BUT R0 ARE SAVED. ; THE RESULT IS RETURNED IN R0. ;SUBPROGRAM: IQSIN (RGC06E72) ;PROGRAMMER: NELSON (MAGNET LAB, MIT) .GLOBL IQSIN. ;EXTERNAL ;COSINE ENTRY ICOS: MOV R1,-(6) ;SAVE R1 MOV @2(5),R1 ;R1=I BMI .+4 NEG R1 ;R1=-ABS(I) ADD @4(5),R1 ;R1=J-ABS(I) BR ISINE ;SKIP ISIN ENTRY ;SINE ENTRY ISIN: MOV R1,-(6) ;SAVE R1 MOV @2(5),R1 ;R1=I ;REMAINING COMPUTATION IS COMMON TO SIN AND COS. ISINE: MOV R2,-(6) ;SAVE REGS 2-5 MOV R3,-(6) MOV R4,-(6) MOV R5,-(6) MOV @4(5),R2 ;R2=J ;FIND I/J REMAINDER. MOV R1,R5 ;(R4,R5)=I SXT R4 DIV R2,R4 ;R4=I/J QUOTIENT MOV R5,R1 ;R1=I/J REMAINDER ;FIND I/J (MOD 4) AND SELECT QUADRANT. BIC #177774,R4 ;R4=I/J (MOD 4) ASL R4 ;R4*2 FOR BRANCH OFFSET ADD R4,PC ;JUMP TO PROPER QUADRANT BR QUAD1 BR QUAD2 BR QUAD3 ;THE LABEL 'QUADN' DOES NOT ACTUALLY HEAD COMPUTATION ; FOR QUADRANT N, BUT FOR X=(N-1+R1/J)*PI/2, WHERE ; R1=REMAINDER(I/J). THAT IS QUADRANT N WHEN R1 IS ; POSITIVE, OR THE NEXT QUADRANT CLOCKWISE WHEN R1 ; IS NEGATIVE. QUAD4: TST R1 ;R1=ABS(R1)-J BPL .+4 ; =FIRST ARG TO IQSIN NEG R1 ;R2=J SUB R2,R1 ; =SECOND ARG TO IQSIN BR QUAD1 QUAD2: TST R1 ;R1=J-ABS(R1) BMI .+4 NEG R1 ADD R2,R1 BR QUAD1 QUAD3: NEG R1 ;R1=-R1 QUAD1: JMP IQSIN. ;COMPUTE QUARTER-WAVE SINE .END