Split up files.
[pdp10-muddle.git] / sumex / arith.mbd079
diff --git a/sumex/arith.mbd079 b/sumex/arith.mbd079
new file mode 100644 (file)
index 0000000..fc37da3
--- /dev/null
@@ -0,0 +1,825 @@
+TITLE ARITHMETIC PRIMITIVES FOR MUDDLE\r
+\r
+.GLOBAL HI,RLOW,CPLUS,CMINUS,CTIMES,CDIVID,CFIX,CFLOAT\r
+.GLOBAL CLQ,CGQ,CLEQ,CGEQ,C1Q,C0Q,CMAX,CMIN,CABS,CMOD,CCOS,CSIN,CATAN,CLOG\r
+.GLOBAL CEXP,CSQRT,CTIME,CORB,CXORB,CANDB,CEQVB,CRAND,SAT,BFLOAT\r
+\r
+;BKD\r
+\r
+;DEFINES MUDDLE PRIMITIVES:   FIX,FLOAT,ATAN,IEXP,LOG,\r
+;      G?,L?,0?,1?,+,-,*,/,MAX,MIN,ABS,SIN,COS,SQRT,RANDOM,\r
+;      TIME,SORT.\r
+\r
+RELOCATABLE\r
+\r
+.INSRT MUDDLE >\r
+\r
+O=0\r
+\r
+\r
+DEFINE TYP1\r
+       (AB) TERMIN\r
+DEFINE VAL1\r
+       (AB)+1 TERMIN\r
+\r
+DEFINE TYP2\r
+       (AB)+2 TERMIN\r
+DEFINE VAL2\r
+       (AB)+3 TERMIN\r
+\r
+DEFINE TYP3\r
+       (AB)+4 TERMIN\r
+DEFINE VAL3\r
+       (AB)+5 TERMIN\r
+\r
+DEFINE TYPN\r
+       (D) TERMIN\r
+DEFINE VALN\r
+       (D)+1 TERMIN\r
+\r
+\r
+YES:   MOVSI   A,TATOM         ;RETURN PATH FOR 'TRUE'\r
+       MOVE    B,MQUOTE T\r
+       AOS     (P)\r
+       POPJ    P,\r
+\r
+NO:    MOVSI   A,TFALSE        ;RETURN PATH FOR 'FALSE'\r
+       MOVEI   B,NIL\r
+       POPJ    P,\r
+\r
+\f;ERROR RETURNS AND OTHER UTILITY ROUTINES\r
+\r
+OVRFLW==10\r
+OVRFLD:        PUSH    TP,$TATOM\r
+       PUSH    TP,EQUOTE OVERFLOW\r
+       JRST    CALER1\r
+\r
+CARGCH:        GETYP   0,A             ; GET TYPE\r
+       CAIN    0,TFLOAT\r
+       POPJ    P,\r
+       JSP     A,BFLOAT\r
+       POPJ    P,\r
+\r
+ARGCHK:                        ;CHECK FOR SINGLE FIXED OR FLOATING\r
+                       ;ARGUMENT IF FIXED CONVERT TO FLOATING\r
+                       ;RETURN FLOATING ARGRUMENT IN B ALWAYS\r
+       ENTRY   1\r
+       GETYP   C,TYP1  \r
+       MOVE    B,VAL1\r
+       CAIN    C,TFLOAT        ;FLOATING?\r
+       POPJ    P,              ;YES, RETURN\r
+       CAIE    C,TFIX          ;FIXED?\r
+       JRST    WTYP1           ;NO, ERROR\r
+       JSP     A,BFLOAT        ;YES, CONVERT TO FLOATING AND RETURN\r
+       POPJ    P,\r
+\r
+OUTRNG:        PUSH    TP,$TATOM\r
+       PUSH    TP,EQUOTE ARGUMENT-OUT-OF-RANGE\r
+       JRST    CALER1\r
+\r
+NSQRT: PUSH    TP,$TATOM\r
+       PUSH    TP,EQUOTE NEGATIVE-ARGUMENT\r
+       JRST    CALER1\r
+\r
+DEFINE MFLOAT AC\r
+       IDIVI   AC,400000\r
+       FSC     AC+1,233\r
+       FSC     AC,254\r
+       FADR    AC,AC+1\r
+       TERMIN\r
+\r
+BFLOAT:        MFLOAT  B\r
+       JRST    (A)\r
+\r
+OFLOAT:        MFLOAT  O\r
+       JRST    (C)\r
+\r
+BFIX:  MULI    B,400\r
+       TSC     B,B\r
+       ASH     C,(B)-243\r
+       MOVE    B,C\r
+       JRST    (A)\r
+\r
+\f;DISPATCH TABLES USED TO CONTROL THE FLOW OF THE VARIOUS PRIMITIVES\r
+\r
+TABLE2:        NO      ;TABLE2 (0)\r
+TABLE3:        YES     ;TABLE2 (1)  &  TABLE3 (0)\r
+       NO      ;TABLE2 (2)\r
+       YES\r
+       NO\r
+\r
+TABLE4:        NO\r
+       NO\r
+       YES\r
+       YES\r
+\r
+\r
+\r
+FUNC:  JSP     A,BFIX\r
+       JSP     A,BFLOAT\r
+       SUB     B,VALN\r
+       IDIV    B,VALN\r
+       ADD     B,VALN\r
+       IMUL    B,VALN\r
+       JSP     C,SWITCH\r
+       JSP     C,SWITCH\r
+\r
+\r
+\r
+FLFUNC==.-2\r
+       FSBR    B,O\r
+       FDVR    B,O\r
+       FADR    B,O\r
+       FMPR    B,O\r
+       JSP     C,FLSWCH\r
+       JSP     C,FLSWCH\r
+\r
+DEFVAL==.-2\r
+       0\r
+       1\r
+       0\r
+       1\r
+       377777,,-1\r
+       400000,,1\r
+\r
+DEFTYP==.-2\r
+       TFIX,,\r
+       TFIX,,\r
+       TFIX,,\r
+       TFIX,,\r
+       TFLOAT,,\r
+       TFLOAT,,\r
+\f;PRIMITIVES FLOAT AND FIX\r
+\r
+MFUNCTION      FIX,SUBR\r
+\r
+       ENTRY   1\r
+\r
+       JSP     C,FXFL\r
+       MOVE    B,1(AB)\r
+       CAIE    A,TFIX\r
+       JSP     A,BFIX\r
+       MOVSI   A,TFIX\r
+       JRST    FINIS\r
+\r
+MFUNCTION      FLOAT,SUBR\r
+\r
+       ENTRY   1\r
+\r
+       JSP     C,FXFL\r
+       MOVE    B,1(AB)\r
+       CAIE    A,TFLOAT\r
+       JSP     A,BFLOAT\r
+       MOVSI   A,TFLOAT\r
+       JRST    FINIS\r
+\r
+CFIX:  GETYP   0,A\r
+       CAIN    0,TFIX\r
+       POPJ    P,\r
+       JSP     A,BFIX\r
+       MOVSI   A,TFIX\r
+       POPJ    P,\r
+\r
+CFLOAT:        GETYP   0,A\r
+       CAIN    0,TFLOAT\r
+       POPJ    P,\r
+       JSP     A,BFLOAT\r
+       MOVSI   A,TFLOAT\r
+       POPJ    P,\r
+\r
+FXFL:  GETYP   A,(AB)\r
+       CAIE    A,TFIX\r
+       CAIN    A,TFLOAT\r
+       JRST    (C)\r
+       JRST    WTYP1\r
+\r
+\r
+MFUNCTION      ABS,SUBR\r
+       ENTRY   1\r
+       GETYP   A,TYP1\r
+       CAIE    A,TFIX\r
+       CAIN    A,TFLOAT\r
+       JRST    MOVIT\r
+       JRST    WTYP1\r
+MOVIT: MOVM    B,VAL1          ;GET ABSOLUTE VALUE OF ARGUMENT\r
+AFINIS:        HRLZS   A               ;MOVE TYPE CODE INTO LEFT HALF\r
+       JRST    FINIS\r
+\r
+\r
+\r
+MFUNCTION      MOD,SUBR\r
+       ENTRY   2\r
+       GETYP   A,TYP1\r
+       CAIE    A,TFIX          ;FIRST ARG FIXED ?\r
+       JRST    WTYP1\r
+       GETYP   A,TYP2\r
+       CAIE    A,TFIX          ;SECOND ARG FIXED ?\r
+       JRST    WTYP2\r
+       MOVE    A,VAL1\r
+       IDIV    A,VAL2          ;FORM QUOTIENT & REMAINDER\r
+       JUMPGE  B,.+2           ;Only return positive remainders\r
+       ADD     B,VAL2\r
+       MOVSI   A,TFIX\r
+       JRST    FINIS\r
+\f;PRIMITIVES PLUS, DIFFERENCE, TIMES, DIVIDE, MIN, AND MAX\r
+\r
+MFUNCTION      MIN,SUBR\r
+       \r
+       ENTRY\r
+\r
+       MOVEI   E,6\r
+       JRST    GOPT\r
+\r
+MFUNCTION      MAX,SUBR\r
+\r
+       ENTRY\r
+\r
+       MOVEI   E,7\r
+       JRST    GOPT\r
+\r
+MFUNCTION      DIVIDE,SUBR,[/]\r
+\r
+       ENTRY\r
+\r
+       MOVEI   E,3\r
+       JRST    GOPT\r
+\r
+MFUNCTION      DIFFERENCE,SUBR,[-]\r
+\r
+       ENTRY\r
+\r
+       MOVEI   E,2\r
+       JRST    GOPT\r
+\r
+MFUNCTION      TIMES,SUBR,[*]\r
+\r
+       ENTRY\r
+\r
+       MOVEI   E,5\r
+       JRST    GOPT\r
+\r
+MFUNCTION      PLUS,SUBR,[+]\r
+\r
+       ENTRY\r
+\r
+       MOVEI   E,4\r
+\r
+GOPT:  MOVE    D,AB            ;ARGUMENT POINTER\r
+       HLRE    A,AB\r
+       MOVMS   A\r
+       ASH     A,-1\r
+       PUSHJ   P,CARITH\r
+       JRST    FINIS\r
+\r
+; BUILD COMPILER ENTRIES TO THESE ROUTINES\r
+\r
+IRP NAME,,[CMINUS,CDIVID,CPLUS,CTIMES,CMIN,CMAX]CODE,,[2,3,4,5,6,7]\r
+\r
+NAME:  MOVEI   E,CODE\r
+       JRST    CARIT1\r
+TERMIN\r
+\f\r
+CARIT1:        MOVEI   D,(A)\r
+       ASH     D,1             ; TIMES 2\r
+       SUBI    D,1\r
+       HRLI    D,(D)\r
+       SUBM    TP,D            ; POINT TO ARGS\r
+       PUSH    TP,$TTP\r
+       PUSH    TP,D\r
+       PUSHJ   P,CARITH\r
+       POP     TP,TP\r
+       SUB     TP,[1,,1]\r
+       POPJ    P,\r
+\r
+CARITH:        MOVE    B,DEFVAL(E)     ; GET VAL\r
+       JFCL    OVRFLW,.+1\r
+       MOVEI   0,TFIX          ; FIX UNTIL CHANGE\r
+       JUMPN   A,ARITH0        ; AT LEAST ONE ARG\r
+       MOVE    A,DEFTYP(E)\r
+       POPJ    P,\r
+\r
+ARITH0:        SOJE    A,ARITH1        ; FALL IN WITH ONE ARG\r
+       MOVE    B,1(D)\r
+       GETYP   C,(D)           ; TYPE OF 1ST ARG\r
+       ADD     D,[2,,2]        ; GO TO NEXT\r
+       CAIN    C,TFLOAT\r
+       JRST    ARITH3\r
+       CAIN    C,TFIX\r
+       JRST    ARITH1\r
+       JRST    WRONGT\r
+\r
+ARITH1:        GETYP   C,(D)           ; GET NEXT TYPE\r
+       CAIE    C,TFIX\r
+       JRST    ARITH2          ; TO FLOAT LOOP\r
+       XCT     FUNC(E)         ; DO IT\r
+       ADD     D,[2,,2]\r
+       SOJG    A,ARITH1        ; KEEP ADDING OR WHATEVER\r
+       JFCL    OVRFLW,OVRFLD\r
+       MOVSI   A,TFIX\r
+       POPJ    P,\r
+\r
+ARITH3:        GETYP   C,(D)\r
+       MOVE    0,1(D)          ; GET ARG\r
+       CAIE    C,TFIX\r
+       JRST    ARITH4\r
+       PUSH    P,A\r
+       JSP     C,OFLOAT        ; FLOAT IT\r
+       POP     P,A\r
+       JRST    ARITH5\r
+ARITH4:        CAIE    C,TFLOAT\r
+       JRST    WRONGT\r
+       JRST    ARITH5\r
+\r
+ARITH2:        CAIE    C,TFLOAT        ; FLOATER?\r
+       JRST    WRONGT\r
+       PUSH    P,A\r
+       JSP     A,BFLOAT\r
+       POP     P,A\r
+       MOVE    0,1(D)\r
+\r
+ARITH5:        XCT     FLFUNC(E)\r
+       ADD     D,[2,,2]\r
+       SOJG    A,ARITH3\r
+\r
+       JFCL    OVRFLW,OVRFLD\r
+       MOVSI   A,TFLOAT\r
+       POPJ    P,\r
+\r
+SWITCH:        XCT     COMPAR(E)       ;FOR MAX & MIN TESTING\r
+       MOVE    B,VALN\r
+       JRST    (C)\r
+COMPAR==.-6\r
+       CAMLE   B,VALN\r
+       CAMGE   B,VALN\r
+\r
+\r
+\r
+FLSWCH:        XCT     FLCMPR(E)\r
+       MOVE    B,O\r
+       JRST    (C)\r
+FLCMPR==.-6\r
+       CAMLE   B,O\r
+       CAMGE   B,O\r
+\f;PRIMITIVES ONEP AND ZEROP\r
+\r
+MFUNCTION      ONEP,SUBR,[1?]\r
+       MOVEI   E,1\r
+       JRST    JOIN\r
+\r
+MFUNCTION      ZEROP,SUBR,[0?]\r
+       MOVEI   E,\r
+\r
+JOIN:  ENTRY 1\r
+       GETYP   A,TYP1\r
+       CAIN    A,TFIX  ;fixed ?\r
+       JRST    TESTFX\r
+       CAIE    A,TFLOAT        ;floating ?\r
+       JRST    WTYP1\r
+       MOVE    B,VAL1\r
+       CAMN    B,NUMBR(E)      ;equal to correct value ?\r
+       JRST    YES1\r
+       JRST    NO1\r
+\r
+TESTFX:        CAMN    E,VAL1  ;equal to correct value ?\r
+       JRST    YES1\r
+\r
+NO1:   MOVSI   A,TFALSE\r
+       MOVEI   B,0\r
+       JRST    FINIS\r
+\r
+YES1:  MOVSI   A,TATOM\r
+       MOVE    B,MQUOTE T\r
+       JRST    FINIS\r
+\r
+NUMBR: 0       ;FLOATING PT  ZERO\r
+       201400,,0       ;FLOATING PT ONE\r
+\f;PRIMITIVES LESSP AND GREATERP\r
+\r
+MFUNCTION      LEQP,SUBR,[L=?]\r
+       MOVEI   E,3\r
+       JRST    ARGS\r
+\r
+MFUNCTION      GEQP,SUBR,[G=?]\r
+       MOVEI   E,2\r
+       JRST    ARGS\r
+\r
+\r
+MFUNCTION      LESSP,SUBR,[L?]\r
+       MOVEI   E,1\r
+       JRST    ARGS\r
+\r
+MFUNCTION      GREATERP,SUBR,[G?]\r
+       MOVEI   E,0\r
+\r
+ARGS:  ENTRY 2\r
+       MOVE    B,VAL1\r
+       MOVE    A,TYP1\r
+       GETYP   0,A\r
+       PUSHJ   P,CMPTYP\r
+       JRST    WTYP1\r
+       MOVE    D,VAL2\r
+       MOVE    C,TYP2\r
+       GETYP   0,C\r
+       PUSHJ   P,CMPTYP\r
+       JRST    WTYP2\r
+       PUSHJ   P,ACOMPS\r
+       JFCL\r
+       JRST    FINIS\r
+\r
+; COMPILERS ENTRIES TO THESE GUYS\r
+\r
+IRP NAME,,[CGQ,CLQ,CGEQ,CLEQ]COD,,[0,1,2,3]\r
+\r
+NAME:  MOVEI   E,COD\r
+       JRST    ACOMPS\r
+TERMIN\r
+\r
+ACOMPS:        GETYP   A,A\r
+       GETYP   0,C\r
+       CAIE    0,(A)\r
+       JRST    COMPD           ; COMPARING FIX AND FLOAT\r
+TEST:  CAMN    B,D\r
+       JRST    @TABLE4(E)\r
+       CAMG    B,D\r
+       JRST    @TABLE2(E)\r
+       JRST    @TABLE3(E)\r
+\r
+CMPTYP:        CAIE    0,TFIX\r
+       CAIN    0,TFLOAT\r
+       AOS     (P)\r
+       POPJ    P,\r
+COMPD: EXCH    B,D\r
+       CAIN    A,TFLOAT\r
+       JSP     A,BFLOAT\r
+       EXCH    B,D\r
+       CAIN    0,TFLOAT\r
+       JSP     A,BFLOAT\r
+COMPF: JRST    TEST\r
+\r
+MFUNCTION RANDOM,SUBR\r
+       ENTRY\r
+       HLRE    A,AB\r
+       CAMGE   A,[-4]          ;At most two arguments to random to set seeds\r
+       JRST    TMA\r
+       JRST    RANDGO(A)\r
+       MOVE    B,VAL2          ;Set second seed\r
+       MOVEM   B,RLOW\r
+       MOVE    A,VAL1          ;Set first seed\r
+       MOVEM   A,RHI\r
+RANDGO:        PUSHJ   P,CRAND\r
+       JRST    FINIS\r
+\r
+CRAND: MOVE B,RLOW             ;FREDKIN'S RANDOM NUMBER GENERATOR.\r
+       MOVE A,RHI\r
+       MOVEM A,RLOW\r
+       LSHC A,-43\r
+       XORB B,RHI\r
+       MOVSI A,TFIX\r
+       POPJ    P,\r
+\r
+\fMFUNCTION SQRT,SUBR\r
+       PUSHJ   P,ARGCHK\r
+       JUMPL   B,NSQRT\r
+       PUSHJ   P,ISQRT\r
+       JRST    FINIS\r
+\r
+ISQRT: MOVE    A,B\r
+       ASH     B,-1\r
+       FSC     B,100\r
+SQ2:   MOVE    C,B     ;NEWTON'S METHOD, SPECINER'S HACK.\r
+       FDVRM   A,B\r
+       FADRM   C,B\r
+       FSC     B,-1\r
+       CAME    C,B\r
+       JRST    SQ2\r
+       MOVSI   A,TFLOAT\r
+       POPJ    P,\r
+\r
+MFUNCTION COS,SUBR\r
+       PUSHJ   P,ARGCHK\r
+       FADR    B,[1.570796326]         ;COS(X)=SIN (X+PI/2)\r
+       PUSHJ   P,.SIN\r
+       MOVSI   A,TFLOAT\r
+       JRST    FINIS\r
+\r
+MFUNCTION SIN,SUBR\r
+       PUSHJ   P,ARGCHK\r
+       PUSHJ   P,.SIN\r
+       MOVSI   A,TFLOAT\r
+       JRST    FINIS\r
+\r
+.SIN:  MOVM    A,B\r
+       CAMG    A,[.0001]\r
+       POPJ    P,              ;GOSPER'S RECURSIVE SIN.\r
+       FDVR    B,[-3.0]        ;SIN(X)=4*SIN(X/-3)**3-3*SIN(X/-3)\r
+       PUSHJ   P,.SIN\r
+       FSC     A,1\r
+       FMPR    A,A\r
+       FADR    A,[-3.0]\r
+       FMPRB   A,B\r
+       POPJ    P,\r
+\r
+CSQRT: PUSHJ   P,CARGCH\r
+       JUMPL   B,NSQRT\r
+       JRST    ISQRT\r
+\r
+CSIN:  PUSHJ   P,CARGCH\r
+CSIN1: PUSHJ   P,.SIN\r
+       MOVSI   A,TFLOAT\r
+       POPJ    P,\r
+\r
+CCOS:  PUSHJ   P,CARGCH\r
+       FADR    B,[1.570796326]\r
+       JRST    CSIN1\r
+\fMFUNCTION     LOG,SUBR\r
+       PUSHJ   P,ARGCHK        ;LEAVES ARGUMENT IN B\r
+       PUSHJ   P,ILOG\r
+       JRST    FINIS\r
+\r
+CLOG:  PUSHJ   P,CARGCH\r
+\r
+ILOG:  JUMPLE  B,OUTRNG\r
+       LDB     D,[331100,,B]   ;GRAB EXPONENT\r
+       SUBI    D,201           ;REMOVE BIAS\r
+       TLZ     B,777000        ;SET EXPONENT\r
+       TLO     B,201000        ; TO 1\r
+       MOVE    A,B\r
+       FSBR    A,RT2\r
+       FADR    B,RT2\r
+       FDVB    A,B\r
+       FMPR    B,B\r
+       MOVE    C,[0.434259751]\r
+       FMPR    C,B\r
+       FADR    C,[0.576584342]\r
+       FMPR    C,B\r
+       FADR    C,[0.961800762]\r
+       FMPR    C,B\r
+       FADR    C,[2.88539007]\r
+       FMPR    C,A\r
+       FADR    C,[0.5]\r
+       MOVE    B,D\r
+       FSC     B,233\r
+       FADR    B,C\r
+       FMPR    B,[0.693147180] ;LOG E OF 2\r
+       MOVSI   A,TFLOAT\r
+       POPJ    P,\r
+\r
+RT2:   1.41421356\r
+\fMFUNCTION     ATAN,SUBR\r
+       PUSHJ   P,ARGCHK\r
+       PUSHJ   P,IATAN\r
+       JRST    FINIS\r
+\r
+CATAN: PUSHJ   P,CARGCH\r
+\r
+IATAN: PUSH    P,B\r
+       MOVM    D,B\r
+       CAMG    D,[0.4^-8]      ;SMALL ENOUGH SO ATAN(X)=X?\r
+       JRST    ATAN3           ;YES\r
+       CAML    D,[7.0^7]       ;LARGE ENOUGH SO THAT ATAN(X)=PI/2?\r
+       JRST    ATAN1           ;YES\r
+       MOVN    C,[1.0]\r
+       CAMLE   D,[1.0]         ;IS ABS(X)<1.0?\r
+       FDVM    C,D             ;NO,SCALE IT DOWN\r
+       MOVE    B,D\r
+       FMPR    B,B\r
+       MOVE    C,[1.44863154]\r
+       FADR    C,B\r
+       MOVE    A,[-0.264768620]\r
+       FDVM    A,C\r
+       FADR    C,B\r
+       FADR    C,[3.31633543]\r
+       MOVE    A,[-7.10676005]\r
+       FDVM    A,C\r
+       FADR    C,B\r
+       FADR    C,[6.76213924]\r
+       MOVE    B,[3.70925626]\r
+       FDVR    B,C\r
+       FADR    B,[0.174655439]\r
+       FMPR    B,D\r
+       JUMPG   D,ATAN2         ;WAS ARG SCALED?\r
+       FADR    B,PI2           ;YES,  ATAN(X)=PI/2-ATAN(1/X)\r
+       JRST    ATAN2\r
+ATAN1: MOVE    B,PI2\r
+ATAN2: SKIPGE  (P)             ;WAS INPUT NEGATIVE?\r
+       MOVNS   B               ;YES,COMPLEMENT\r
+ATAN3: MOVSI   A,TFLOAT        \r
+       SUB     P,[1,,1]\r
+       POPJ    P,\r
+\r
+PI2:   1.57079632\r
+\fMFUNCTION     IEXP,SUBR,[EXP] \r
+       PUSHJ   P,ARGCHK        ;LEAVE FLOATING POINT ARG IN B\r
+       PUSHJ   P,IIEXP\r
+       JRST    FINIS\r
+\r
+CEXP:  PUSHJ   P,CARGCH\r
+\r
+IIEXP: PUSH    P,B\r
+       MOVM    A,B\r
+       SETZM   B\r
+       FMPR    A,[0.434294481] ;LOG BASE 10 OF E\r
+       MOVE    D,[1.0]\r
+       CAMG    A,D\r
+       JRST    RATEX\r
+       MULI    A,400\r
+       ASHC    B,-243(A)\r
+       CAILE   B,43\r
+       JRST    OUTRNG\r
+       CAILE   B,7\r
+       JRST    EXPR2\r
+EXPR1: FMPR    D,FLOAP1(B)\r
+       LDB     A,[103300,,C]   \r
+       SKIPE   A\r
+       TLO     A,177000\r
+       FADR    A,A\r
+RATEX: MOVEI   B,7\r
+       SETZM   C\r
+RATEY: FADR    C,COEF2-1(B)\r
+       FMPR    C,A\r
+       SOJN    B,RATEY\r
+       FADR    C,[1.0] \r
+       FMPR    C,C\r
+       FMPR    D,C\r
+       MOVE    B,[1.0]\r
+       SKIPL   (P)             ;SKIP IF INPUT NEGATIVE\r
+       SKIPN   B,D\r
+       FDVR    B,D\r
+       MOVSI   A,TFLOAT\r
+       SUB     P,[1,,1]\r
+       POPJ    P,\r
+\r
+EXPR2: LDB     E,[030300,,B]   \r
+       ANDI    B,7\r
+       MOVE    D,FLOAP1(E)\r
+       FMPR    D,D             ;TO THE 8TH POWER\r
+       FMPR    D,D\r
+       FMPR    D,D\r
+       JRST    EXPR1\r
+\r
+COEF2: 1.15129278\r
+       0.662730884\r
+       0.254393575\r
+       0.0729517367\r
+       0.0174211199\r
+       2.55491796^-3\r
+       9.3264267^-4\r
+\r
+FLOAP1:        1.0\r
+       10.0\r
+       100.0\r
+       1000.0\r
+       10000.0\r
+       100000.0\r
+       1000000.0\r
+       10000000.0\r
+\f;BITWISE BOOLEAN FUNCTIONS\r
+\r
+MFUNCTION %ANDB,SUBR,ANDB\r
+       ENTRY\r
+       HRREI   B,-1            ;START ANDING WITH ALL ONES\r
+       MOVE    D,[AND B,A]     ;LOGICAL INSTRUCTION\r
+       JRST    LOGFUN          ;DO THE OPERATION\r
+\r
+MFUNCTION %ORB,SUBR,ORB\r
+       ENTRY\r
+       MOVEI   B,0\r
+       MOVE    D,[IOR B,A]\r
+       JRST    LOGFUN\r
+\r
+MFUNCTION %XORB,SUBR,XORB\r
+       ENTRY\r
+       MOVEI   B,0\r
+       MOVE    D,[XOR B,A]\r
+       JRST    LOGFUN\r
+\r
+MFUNCTION %EQVB,SUBR,EQVB\r
+       ENTRY\r
+       HRREI   B,-1\r
+       MOVE    D,[EQV B,A]\r
+\r
+LOGFUN:        JUMPGE  AB,ZROARG\r
+LOGTYP:        GETYP   A,(AB)          ;GRAB THE TYPE\r
+       PUSHJ   P,SAT           ;STORAGE ALLOCATION TYPE\r
+       CAIE    A,S1WORD\r
+       JRST    WRONGT          ;WRONG TYPE...LOSE\r
+       MOVE    A,1(AB)         ;LOAD ARG INTO A\r
+       XCT     D               ;DO THE LOGICAL OPERATION\r
+       AOBJP   AB,.+2          ;ADD ONE TO BOTH HALVES\r
+       AOBJN   AB,LOGTYP       ;ADD AGAIN AND LOOP IF NEEDED\r
+\r
+ZROARG:        MOVE    A,$TWORD\r
+       JRST    FINIS\r
+\fREPEAT 0,[\r
+;routine to sort lists or vectors of either fixed point or floating numbers\r
+;the components are interchanged repeatedly to acheive the sort\r
+;first arg:    the structure to be sorted\r
+;if no second arg sort in descending order\r
+;second arg:   if false then sort in ascending order\r
+;              else sort in descending order\r
+\r
+MFUNCTION      SORT,SUBR\r
+       ENTRY \r
+       HLRZ    A,AB\r
+       CAIGE   A,-4            ;Only two arguments allowed\r
+       JRST    TMA\r
+       MOVE    O,DESCEND       ;Set up "O" to test for descending order as default condition\r
+       CAIE    A,-4            ;Optional second argument?\r
+       JRST    .+4\r
+       GETYP   B,TYP2          ;See if it is other than false\r
+       CAIN    B,TFALSE\r
+       MOVE    O,ASCEND        ;Set up "O" to test for ascending order\r
+       GETYP   A,TYP1          ;CHECK TYPE OF FIRST ARGUMENT\r
+       CAIN    A,TLIST\r
+       JRST    LSORT\r
+       CAIN    A,TVEC\r
+       JRST    VSORT\r
+       JRST    WTYP1\r
+\r
+\r
+\r
+\r
+GOBACK:        MOVE    A,TYP1          ;RETURN THE SORTED ARGUMENT AS VALUE\r
+       MOVE    B,VAL1\r
+       JRST    FINIS\r
+\r
+DESCEND:       CAMG    C,(A)+1\r
+ASCEND:                CAML    C,(A)+1\r
+\f;ROUTINE TO SORT LISTS IN NUMERICAL ORDER\r
+\r
+LSORT: MOVE    A,VAL1\r
+       JUMPE   A,GOBACK        ;EMPTY LIST?\r
+       HLRZ    B,(A)           ;TYPE OF FIRST COMPONENT\r
+       CAIE    B,TFIX\r
+       CAIN    B,TFLOAT\r
+       SKIPA\r
+       JRST    WRONGT\r
+       MOVEI   E,0             ;FOR COUNT OF LENGTH OF LIST\r
+LCOUNT:        JUMPE   A,LLSORT        ;REACHED END OF LIST?\r
+       MOVE    A,(A)           ;NEXT COMPONENT\r
+       TLZ     A,(B)           ;SAME TYPE AS FIRST COMPONENT?\r
+       TLNE    A,-1\r
+       JRST    WRONGT\r
+       AOJA    E,LCOUNT        ;INCREMENT COUNT AND CONTINUE\r
+\r
+LLSORT:        SOJE    E,GOBACK        ;FINISHED WITH SORTING?\r
+       HRRZ    A,VAL1          ;START THIS LOOP OF SORTING AT THE BEGINNING\r
+       MOVEM   E,(P)+1         ;Save the iteration depth\r
+CLSORT:        HRRZ    B,(A)           ;NEXT COMPONENT\r
+       MOVE    C,(B)+1         ;ITS VALUE\r
+       XCT     O               ;ARE THESE TWO COMPONENTS IN ORDER?\r
+       JRST    .+4\r
+       MOVE    D,(A)+1         ;INTERCHANGE THEM\r
+       MOVEM   D,(B)+1\r
+       MOVEM   C,(A)+1\r
+       MOVE    A,B             ;MAKE THE COMPONENT IN "B" THE CURRENT ONE\r
+       SOJG    E,CLSORT\r
+       MOVE    E,(P)+1         ;Restore the iteration depth\r
+       JRST    LLSORT\r
+\f;ROUTINE TO SORT VECTORS IN NUMERICAL ORDER\r
+\r
+VSORT: HLRE    D,VAL1          ;GET COUNT FIELD OF VECTOR\r
+       IDIV    D,[-2]          ;LENGTH\r
+       JUMPE   D,GOBACK        ;EMPTY VECTOR?\r
+       MOVE    E,D             ;SAVE LENGTH IN "E"\r
+       HRRZ    A,VAL1          ;POINTER TO VECTOR\r
+       MOVE    B,(A)           ;TYPE OF FIRST COMPONENT\r
+       CAME    B,$TFIX\r
+       CAMN    B,$TFLOAT\r
+       SKIPA\r
+       JRST    WRONGT\r
+       SOJLE   D,GOBACK        ;IF ONLY ONE COMPONENT THEN FINISHED\r
+VCOUNT:        ADDI    A,2             ;CHECK NEXT COMPONENT\r
+       CAME    B,(A)           ;SAME TYPE AS FIRST COMPONENT?\r
+       JRST    WRONGT\r
+       SOJG    D,VCOUNT        ;CONTINUE WITH NEXT COMPONENT\r
+\r
+VVSORT:        SOJE    E,GOBACK        ;FINISHED SORTING?\r
+       HRRZ    A,VAL1          ;START THIS LOOP OF SORTING AT THE BEGINNING\r
+       MOVEM   E,(P)+1         ;Save the iteration depth\r
+CVSORT:        MOVE    C,(A)+3         ;VALUE OF NEXT COMPONENT\r
+       XCT     O               ;ARE THESE TWO COMPONENTS IN ORDER?\r
+       JRST    .+4\r
+       MOVE    D,(A)+1         ;INTERCHANGE THEM\r
+       MOVEM   D,(A)+3\r
+       MOVEM   C,(A)+1\r
+       ADDI    A,2             ;UPDATE THE CURRENT COMPONENT\r
+       SOJG    E,CVSORT\r
+       MOVE    E,(P)+1         ;Restore the iteration depth\r
+       JRST    VVSORT\r
+]\r
+\r
+MFUNCTION TIME,SUBR\r
+       ENTRY\r
+       PUSHJ   P,CTIME\r
+       JRST    FINIS\r
+\r
+IMPURE\r
+\r
+RHI:   267762113337\r
+RLOW:  155256071112\r
+PURE\r
+\r
+\r
+END\r
+\f\f
\ No newline at end of file