1 TITLE ARITHMETIC PRIMITIVES FOR MUDDLE
\r
3 .GLOBAL HI,RLOW,CPLUS,CMINUS,CTIMES,CDIVID,CFIX,CFLOAT
\r
4 .GLOBAL CLQ,CGQ,CLEQ,CGEQ,C1Q,C0Q,CMAX,CMIN,CABS,CMOD,CCOS,CSIN,CATAN,CLOG
\r
5 .GLOBAL CEXP,CSQRT,CTIME,CORB,CXORB,CANDB,CEQVB,CRAND,SAT,BFLOAT
\r
9 ;DEFINES MUDDLE PRIMITIVES: FIX,FLOAT,ATAN,IEXP,LOG,
\r
10 ; G?,L?,0?,1?,+,-,*,/,MAX,MIN,ABS,SIN,COS,SQRT,RANDOM,
\r
41 YES: MOVSI A,TATOM ;RETURN PATH FOR 'TRUE'
\r
46 NO: MOVSI A,TFALSE ;RETURN PATH FOR 'FALSE'
\r
50 \f;ERROR RETURNS AND OTHER UTILITY ROUTINES
\r
53 OVRFLD: PUSH TP,$TATOM
\r
54 PUSH TP,EQUOTE OVERFLOW
\r
57 CARGCH: GETYP 0,A ; GET TYPE
\r
63 ARGCHK: ;CHECK FOR SINGLE FIXED OR FLOATING
\r
64 ;ARGUMENT IF FIXED CONVERT TO FLOATING
\r
65 ;RETURN FLOATING ARGRUMENT IN B ALWAYS
\r
69 CAIN C,TFLOAT ;FLOATING?
\r
70 POPJ P, ;YES, RETURN
\r
72 JRST WTYP1 ;NO, ERROR
\r
73 JSP A,BFLOAT ;YES, CONVERT TO FLOATING AND RETURN
\r
76 OUTRNG: PUSH TP,$TATOM
\r
77 PUSH TP,EQUOTE ARGUMENT-OUT-OF-RANGE
\r
80 NSQRT: PUSH TP,$TATOM
\r
81 PUSH TP,EQUOTE NEGATIVE-ARGUMENT
\r
103 \f;DISPATCH TABLES USED TO CONTROL THE FLOW OF THE VARIOUS PRIMITIVES
\r
105 TABLE2: NO ;TABLE2 (0)
\r
106 TABLE3: YES ;TABLE2 (1) & TABLE3 (0)
\r
152 \f;PRIMITIVES FLOAT AND FIX
\r
165 MFUNCTION FLOAT,SUBR
\r
204 MOVIT: MOVM B,VAL1 ;GET ABSOLUTE VALUE OF ARGUMENT
\r
205 AFINIS: HRLZS A ;MOVE TYPE CODE INTO LEFT HALF
\r
213 CAIE A,TFIX ;FIRST ARG FIXED ?
\r
216 CAIE A,TFIX ;SECOND ARG FIXED ?
\r
219 IDIV A,VAL2 ;FORM QUOTIENT & REMAINDER
\r
220 JUMPGE B,.+2 ;Only return positive remainders
\r
224 \f;PRIMITIVES PLUS, DIFFERENCE, TIMES, DIVIDE, MIN, AND MAX
\r
240 MFUNCTION DIVIDE,SUBR,[/]
\r
247 MFUNCTION DIFFERENCE,SUBR,[-]
\r
254 MFUNCTION TIMES,SUBR,[*]
\r
261 MFUNCTION PLUS,SUBR,[+]
\r
267 GOPT: MOVE D,AB ;ARGUMENT POINTER
\r
274 ; BUILD COMPILER ENTRIES TO THESE ROUTINES
\r
276 IRP NAME,,[CMINUS,CDIVID,CPLUS,CTIMES,CMIN,CMAX]CODE,,[2,3,4,5,6,7]
\r
282 CARIT1: MOVEI D,(A)
\r
286 SUBM TP,D ; POINT TO ARGS
\r
294 CARITH: MOVE B,DEFVAL(E) ; GET VAL
\r
296 MOVEI 0,TFIX ; FIX UNTIL CHANGE
\r
297 JUMPN A,ARITH0 ; AT LEAST ONE ARG
\r
301 ARITH0: SOJE A,ARITH1 ; FALL IN WITH ONE ARG
\r
303 GETYP C,(D) ; TYPE OF 1ST ARG
\r
304 ADD D,[2,,2] ; GO TO NEXT
\r
311 ARITH1: GETYP C,(D) ; GET NEXT TYPE
\r
313 JRST ARITH2 ; TO FLOAT LOOP
\r
314 XCT FUNC(E) ; DO IT
\r
316 SOJG A,ARITH1 ; KEEP ADDING OR WHATEVER
\r
321 ARITH3: GETYP C,(D)
\r
322 MOVE 0,1(D) ; GET ARG
\r
326 JSP C,OFLOAT ; FLOAT IT
\r
329 ARITH4: CAIE C,TFLOAT
\r
333 ARITH2: CAIE C,TFLOAT ; FLOATER?
\r
340 ARITH5: XCT FLFUNC(E)
\r
348 SWITCH: XCT COMPAR(E) ;FOR MAX & MIN TESTING
\r
357 FLSWCH: XCT FLCMPR(E)
\r
363 \f;PRIMITIVES ONEP AND ZEROP
\r
365 MFUNCTION ONEP,SUBR,[1?]
\r
369 MFUNCTION ZEROP,SUBR,[0?]
\r
374 CAIN A,TFIX ;fixed ?
\r
376 CAIE A,TFLOAT ;floating ?
\r
379 CAMN B,NUMBR(E) ;equal to correct value ?
\r
383 TESTFX: CAMN E,VAL1 ;equal to correct value ?
\r
386 NO1: MOVSI A,TFALSE
\r
390 YES1: MOVSI A,TATOM
\r
394 NUMBR: 0 ;FLOATING PT ZERO
\r
395 201400,,0 ;FLOATING PT ONE
\r
396 \f;PRIMITIVES LESSP AND GREATERP
\r
398 MFUNCTION LEQP,SUBR,[L=?]
\r
402 MFUNCTION GEQP,SUBR,[G=?]
\r
407 MFUNCTION LESSP,SUBR,[L?]
\r
411 MFUNCTION GREATERP,SUBR,[G?]
\r
429 ; COMPILERS ENTRIES TO THESE GUYS
\r
431 IRP NAME,,[CGQ,CLQ,CGEQ,CLEQ]COD,,[0,1,2,3]
\r
440 JRST COMPD ; COMPARING FIX AND FLOAT
\r
447 CMPTYP: CAIE 0,TFIX
\r
459 MFUNCTION RANDOM,SUBR
\r
462 CAMGE A,[-4] ;At most two arguments to random to set seeds
\r
465 MOVE B,VAL2 ;Set second seed
\r
467 MOVE A,VAL1 ;Set first seed
\r
469 RANDGO: PUSHJ P,CRAND
\r
472 CRAND: MOVE B,RLOW ;FREDKIN'S RANDOM NUMBER GENERATOR.
\r
480 \fMFUNCTION SQRT,SUBR
\r
489 SQ2: MOVE C,B ;NEWTON'S METHOD, SPECINER'S HACK.
\r
500 FADR B,[1.570796326] ;COS(X)=SIN (X+PI/2)
\r
513 POPJ P, ;GOSPER'S RECURSIVE SIN.
\r
514 FDVR B,[-3.0] ;SIN(X)=4*SIN(X/-3)**3-3*SIN(X/-3)
\r
522 CSQRT: PUSHJ P,CARGCH
\r
526 CSIN: PUSHJ P,CARGCH
\r
527 CSIN1: PUSHJ P,.SIN
\r
531 CCOS: PUSHJ P,CARGCH
\r
532 FADR B,[1.570796326]
\r
534 \fMFUNCTION LOG,SUBR
\r
535 PUSHJ P,ARGCHK ;LEAVES ARGUMENT IN B
\r
539 CLOG: PUSHJ P,CARGCH
\r
541 ILOG: JUMPLE B,OUTRNG
\r
542 LDB D,[331100,,B] ;GRAB EXPONENT
\r
543 SUBI D,201 ;REMOVE BIAS
\r
544 TLZ B,777000 ;SET EXPONENT
\r
545 TLO B,201000 ; TO 1
\r
551 MOVE C,[0.434259751]
\r
553 FADR C,[0.576584342]
\r
555 FADR C,[0.961800762]
\r
557 FADR C,[2.88539007]
\r
563 FMPR B,[0.693147180] ;LOG E OF 2
\r
568 \fMFUNCTION ATAN,SUBR
\r
573 CATAN: PUSHJ P,CARGCH
\r
577 CAMG D,[0.4^-8] ;SMALL ENOUGH SO ATAN(X)=X?
\r
579 CAML D,[7.0^7] ;LARGE ENOUGH SO THAT ATAN(X)=PI/2?
\r
582 CAMLE D,[1.0] ;IS ABS(X)<1.0?
\r
583 FDVM C,D ;NO,SCALE IT DOWN
\r
586 MOVE C,[1.44863154]
\r
588 MOVE A,[-0.264768620]
\r
591 FADR C,[3.31633543]
\r
592 MOVE A,[-7.10676005]
\r
595 FADR C,[6.76213924]
\r
596 MOVE B,[3.70925626]
\r
598 FADR B,[0.174655439]
\r
600 JUMPG D,ATAN2 ;WAS ARG SCALED?
\r
601 FADR B,PI2 ;YES, ATAN(X)=PI/2-ATAN(1/X)
\r
604 ATAN2: SKIPGE (P) ;WAS INPUT NEGATIVE?
\r
605 MOVNS B ;YES,COMPLEMENT
\r
606 ATAN3: MOVSI A,TFLOAT
\r
611 \fMFUNCTION IEXP,SUBR,[EXP]
\r
612 PUSHJ P,ARGCHK ;LEAVE FLOATING POINT ARG IN B
\r
616 CEXP: PUSHJ P,CARGCH
\r
621 FMPR A,[0.434294481] ;LOG BASE 10 OF E
\r
631 EXPR1: FMPR D,FLOAP1(B)
\r
638 RATEY: FADR C,COEF2-1(B)
\r
645 SKIPL (P) ;SKIP IF INPUT NEGATIVE
\r
652 EXPR2: LDB E,[030300,,B]
\r
655 FMPR D,D ;TO THE 8TH POWER
\r
676 \f;BITWISE BOOLEAN FUNCTIONS
\r
678 MFUNCTION %ANDB,SUBR,ANDB
\r
680 HRREI B,-1 ;START ANDING WITH ALL ONES
\r
681 MOVE D,[AND B,A] ;LOGICAL INSTRUCTION
\r
682 JRST LOGFUN ;DO THE OPERATION
\r
684 MFUNCTION %ORB,SUBR,ORB
\r
690 MFUNCTION %XORB,SUBR,XORB
\r
696 MFUNCTION %EQVB,SUBR,EQVB
\r
701 LOGFUN: JUMPGE AB,ZROARG
\r
702 LOGTYP: GETYP A,(AB) ;GRAB THE TYPE
\r
703 PUSHJ P,SAT ;STORAGE ALLOCATION TYPE
\r
705 JRST WRONGT ;WRONG TYPE...LOSE
\r
706 MOVE A,1(AB) ;LOAD ARG INTO A
\r
707 XCT D ;DO THE LOGICAL OPERATION
\r
708 AOBJP AB,.+2 ;ADD ONE TO BOTH HALVES
\r
709 AOBJN AB,LOGTYP ;ADD AGAIN AND LOOP IF NEEDED
\r
711 ZROARG: MOVE A,$TWORD
\r
714 ;routine to sort lists or vectors of either fixed point or floating numbers
\r
715 ;the components are interchanged repeatedly to acheive the sort
\r
716 ;first arg: the structure to be sorted
\r
717 ;if no second arg sort in descending order
\r
718 ;second arg: if false then sort in ascending order
\r
719 ; else sort in descending order
\r
721 MFUNCTION SORT,SUBR
\r
724 CAIGE A,-4 ;Only two arguments allowed
\r
726 MOVE O,DESCEND ;Set up "O" to test for descending order as default condition
\r
727 CAIE A,-4 ;Optional second argument?
\r
729 GETYP B,TYP2 ;See if it is other than false
\r
731 MOVE O,ASCEND ;Set up "O" to test for ascending order
\r
732 GETYP A,TYP1 ;CHECK TYPE OF FIRST ARGUMENT
\r
742 GOBACK: MOVE A,TYP1 ;RETURN THE SORTED ARGUMENT AS VALUE
\r
746 DESCEND: CAMG C,(A)+1
\r
747 ASCEND: CAML C,(A)+1
\r
748 \f;ROUTINE TO SORT LISTS IN NUMERICAL ORDER
\r
751 JUMPE A,GOBACK ;EMPTY LIST?
\r
752 HLRZ B,(A) ;TYPE OF FIRST COMPONENT
\r
757 MOVEI E,0 ;FOR COUNT OF LENGTH OF LIST
\r
758 LCOUNT: JUMPE A,LLSORT ;REACHED END OF LIST?
\r
759 MOVE A,(A) ;NEXT COMPONENT
\r
760 TLZ A,(B) ;SAME TYPE AS FIRST COMPONENT?
\r
763 AOJA E,LCOUNT ;INCREMENT COUNT AND CONTINUE
\r
765 LLSORT: SOJE E,GOBACK ;FINISHED WITH SORTING?
\r
766 HRRZ A,VAL1 ;START THIS LOOP OF SORTING AT THE BEGINNING
\r
767 MOVEM E,(P)+1 ;Save the iteration depth
\r
768 CLSORT: HRRZ B,(A) ;NEXT COMPONENT
\r
769 MOVE C,(B)+1 ;ITS VALUE
\r
770 XCT O ;ARE THESE TWO COMPONENTS IN ORDER?
\r
772 MOVE D,(A)+1 ;INTERCHANGE THEM
\r
775 MOVE A,B ;MAKE THE COMPONENT IN "B" THE CURRENT ONE
\r
777 MOVE E,(P)+1 ;Restore the iteration depth
\r
779 \f;ROUTINE TO SORT VECTORS IN NUMERICAL ORDER
\r
781 VSORT: HLRE D,VAL1 ;GET COUNT FIELD OF VECTOR
\r
782 IDIV D,[-2] ;LENGTH
\r
783 JUMPE D,GOBACK ;EMPTY VECTOR?
\r
784 MOVE E,D ;SAVE LENGTH IN "E"
\r
785 HRRZ A,VAL1 ;POINTER TO VECTOR
\r
786 MOVE B,(A) ;TYPE OF FIRST COMPONENT
\r
791 SOJLE D,GOBACK ;IF ONLY ONE COMPONENT THEN FINISHED
\r
792 VCOUNT: ADDI A,2 ;CHECK NEXT COMPONENT
\r
793 CAME B,(A) ;SAME TYPE AS FIRST COMPONENT?
\r
795 SOJG D,VCOUNT ;CONTINUE WITH NEXT COMPONENT
\r
797 VVSORT: SOJE E,GOBACK ;FINISHED SORTING?
\r
798 HRRZ A,VAL1 ;START THIS LOOP OF SORTING AT THE BEGINNING
\r
799 MOVEM E,(P)+1 ;Save the iteration depth
\r
800 CVSORT: MOVE C,(A)+3 ;VALUE OF NEXT COMPONENT
\r
801 XCT O ;ARE THESE TWO COMPONENTS IN ORDER?
\r
803 MOVE D,(A)+1 ;INTERCHANGE THEM
\r
806 ADDI A,2 ;UPDATE THE CURRENT COMPONENT
\r
808 MOVE E,(P)+1 ;Restore the iteration depth
\r
812 MFUNCTION TIME,SUBR
\r