A large commit.
[pdp8.git] / sw / os8 / v3d / sources / fortran / all / sin.ra
diff --git a/sw/os8/v3d/sources/fortran/all/sin.ra b/sw/os8/v3d/sources/fortran/all/sin.ra
new file mode 100644 (file)
index 0000000..bf938a1
--- /dev/null
@@ -0,0 +1,124 @@
+/
+/
+/      S  I  N
+/      -  -  -
+/
+/SUBROUTINE    SIN(X)
+/
+/ VERSION 5A 4-27-77  PT
+/
+       SECT    SIN
+       JA      #SIN
+       EXTERN  #ARGER
+SINER, TRAP4   #ARGER
+       TEXT    +SIN   +
+SINXR, SETX    XRSIN
+       SETB    BPSIN
+BPSIN, F 0.0
+XRSIN, F 0.0
+SIN1,  F 0.0
+SIN2,  F 0.0
+F1SIN, F 1.
+FPI2SN,        1               /PI DIVIDED BY 2
+       3110
+       3755
+FPISIN,        2               /PI
+       3110
+       3755
+F2PISN,        3               /TWO PI
+       3110
+       3755
+       ORG     10*3+BPSIN
+       FNOP
+       JA      SINXR
+       0
+SINRTN,        JA      .
+/
+SINC9, 7764
+       2501
+       7015
+/
+SINC7, 7771
+       5464
+       5515
+/
+SINC5, 7775
+       2431
+       5362
+/
+SINC3, 0000
+       5325
+       0414
+/
+SINTST,        7770
+       2000
+       0000
+       BASE    0
+#SIN,  STARTD
+       FLDA    10*3
+       FSTA    SINRTN
+       FLDA    0
+       SETX    XRSIN
+       SETB    BPSIN
+       BASE    BPSIN
+       LDX     1,1     
+       FSTA    BPSIN
+       FLDA%   BPSIN,1  /ADDR OF X
+       FSTA    BPSIN
+       STARTF
+       FLDA%   BPSIN   /GET X
+       LDX     -1,0            /SET SIGN TO POSITIVE.
+       JGT     SINMOD          /IF POSITIVE BYPASS FUDGE.
+       JEQ     SINRTN          /IF ZERO EXIT.
+       FNEG                    /NEGATIVE. NEGATE AC. SIN(-X)=-SIN(X)
+       LDX     0,0             /SET SIGN TO MINUS.
+SINMOD,        JAL     SINER           /IF SIGN CAN T INT, THEN ERROR.
+       FDIV    F2PISN          /REDUCE TO BELOW TWO PI.
+       FSTA    SIN1            /SAVE IN A TEMP.
+       ALN     0
+       FNORM                   /INTERGIZE IT.
+       FNEG
+       FADD    SIN1            /RECALL NUMBER. AC NOW <0
+       FMUL    F2PISN          /NOW MULTIPLY BACK.
+       FSTA    SIN2            /AND SAVE AWAY.
+       FSUB    FPISIN          /SUBTRACT OFF PI.
+       JLT     SINP            /LESS THEN PI.
+       FSTA    SIN2            /RESTORE AS 2.
+       XTA     0               /INVERT THE SIGN.
+       FNEG
+       FSUB    F1SIN           /SIN(X-PI)=-SIN(X)
+       ATX     0               /AND PUT BACK.
+/
+SINP,  FLDA    SIN2            /RECALL MAGIC GOODY.
+       FSUB    FPI2SN          /TEST TO SEE IF X<PI/2
+       JLT     SINPP           /YEP.
+/
+       FLDA    FPISIN          /SIN(X)=SIN(PI-X)
+       FSUB    SIN2
+       FSTA    SIN2            /AND STORE IT BACK.
+/
+SINPP, FLDA    SIN2            /GET THE MAGIC NUMBER.
+       FSUB    SINTST          /SEE IF ITS CLOSE TO AN EDGE
+       JGT     SINPPP          /IT IS NOT
+       FLDA    SIN2            /RECALL NUMBER IF TOO SMALE
+       JXN     SINRTN,0                /EXIT IF SAME SIGN.
+       FNEG                    /ELSE NEGATE IT.
+       JA      SINRTN
+SINPPP,        FLDA    SIN2            /RECALL NUMBER TO BE WORKED ON.
+       FDIV    FPI2SN          /DIVIDE BY PI OVER TWO.
+       FSTA    SIN2            /AND STORE BACK.
+       FMUL    SIN2            /MULTIPLY OUT.
+       FSTA    SIN1
+       FMUL    SINC9           /NOW DO THE STANDARD ITERATION.
+       FADD    SINC7
+       FMUL    SIN1
+       FADD    SINC5
+       FMUL    SIN1
+       FADD    SINC3
+       FMUL    SIN1
+       FADD    FPI2SN          /ADD IN PI OVER 2
+       FMUL    SIN2            /DO THE FINAL MULTIPLY.
+       JXN     SINRTN,0                /SHALL WE NEGATE
+       FNEG                    /YEP
+       JA      SINRTN          /AND RETURN.
+\f