1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-20 17:58:40 +00:00
PDP-10.its/src/mudsys/arith.94
Adam Sampson a81db26a7a Rename to ITS conventions.
MIDAS and Muddle source get version numbers (as in the 1973 Muddle
source); the build files don't.
2018-04-25 09:32:25 +01:00

856 lines
13 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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