File: NNORFP.PA of Tape: Sources/Focal/s9
(Source file text) 

/23-BIT EXTENDED FUNCTIONS

/1-31-72       R BEAN

/COPYRIGHT     1972 DIGITAL EQUIPMENT CORPORATION,MAYNARD, MASS. 01754

/DEC-08-NFPPA-A	VERSION 1

	FIXMRI FADD=1000
	FIXMRI FSUB=2000
	FIXMRI FMPY=3000
	FIXMRI FDIV=4000
	FIXMRI FGET=5000
	FIXMRI FPUT=6000

	FEXT=0000
	FNOR=7000
	EXP=44
	HORD=45
	LORD=46

FIXFLT=5500
	*FIXFLT

	/******FIX******
/ROUTINE TO FIX ANY FLOATING NUMBER IN FAC BETWEEN -2047 AND +2047 TO
/A TWELVE BIT INTEGER AND LEAVE RESULT IN EXP (LOC 44)

FFIX,	0
	CLA
	TAD EXP		/FETCH EXPONENT
	SZA SMA		/IS NUMBER <1?
	 JMP .+3	/NO-CONTINUE ON
FTRPRT,	CLA
	JMP FIXDNE+1	/YES-FIX IT TO ZERO
	TAD M13		/SET BINARY POINT AT 11
	SNA		/PLACES TO RIGHT OF CURRENT POINT?
	 JMP FIXDNE	/NO-NUMBER IS ALREADY FIXED THEN.
	SMA		/YES-IS NUMBER TOO LARGE TO FIX?
	 JMP I OTRAPA	/YES-TAKE OVERFLOW TRAP
	DCA EXP		/NO-SET SCALE COUNT
FIXLP,	CLL		/0 IN LINK
	TAD HORD	/GET HIGH MANTISSA
	SPA		/IS IT <0?
	 CML		/YES-PUT A 1 IN LINK
	RAR		/SCALE RIGHT
	DCA HORD	/SAVE
	ISZ EXP		/DONE YET?
	 JMP FIXLP	/NO
FIXDNE,	TAD HORD	/YES-ANSWER IN AC
	DCA EXP		/RETURN WITH ANSWER IN 44
	JMP I FFIX	/RETURN

M13,	-13		/-11 DECIMAL
C13,	13		/11 DECIMAL
OTRAPA,	FTRP1		/ADDRESS OF VECTOR FOR OVERFLOW TRAP

/******FLOAT******
/ROUTINE TO FLOAT ANY INTEGER IN EXP (LOC 44) INTO FAC

FFLOAT,	0
	TAD EXP
	DCA HORD	/PUT NUMBER IN HI MANTISSA
	DCA LORD	/CLEAR LOW MANTISSA
	TAD C13		/11(10) INTO EXPONENT
	DCA EXP
	JMS I FNORL	/NORMALIZE
	JMP I FFLOAT	/RETURN
FNORL,	FFNOR		/LINK TO NORMALIZE ROUTINE
*5000

/******SINE******

SIN,	0
	JMS NHNDLE	/IF X<0,NEGATE X AND SET NFLAG
	JMS I FMPYL	/X*2/PI
	  TOVPI
	JMS FRACT	/SAVE X IN TEMP1,THE INTEGER PART OF X IN NUM,AND GET FRACTIONAL PART IN FAC
	TAD NUM		/GET INTEGER PART OF (2/PI)*X
	AND C3		/ISOLATE BITS 10,11
	TAD JMPI
	DCA .+1		/MAKE JUMP TO ARGUMENT REDUCING ROUTINE
	JMP .		/AND ADJUST ARG ACCORDING TO QUADRANT OF X
JMPI,	JMP I .+1
	POLYSN		/X IN QUAD1,SIN(X)=SIN(X)
	QUAD2		/X IN QUAD2,SIN(X)=SIN(1-X)
	QUAD3		/X IN QUAD3,SIN(X)=SIN(-X)
	QUAD4		/X IN QUAD4,SIN(X)=SIN(X-1)

QUAD2,	JMS I FSUB1L	/1-X
	  ONE
	JMP POLYSN	/CALCULATE SIN(1-X)
QUAD3,	JMS I FNEGL	/-X
	JMP POLYSN	/CALCULATE SIN(-X)
QUAD4,	JMS I FSUBL	/X-1
	  ONE
POLYSN,	JMS I FPUTL	/SAVE X
	  TEMP1
	JMS I FSQRL	/U=X**2
	JMS I FPUTL	/SAVE U
	  TEMP2
	JMS I FMPYL	/A7*U
	  SINA7
	JMS I FADDL	/A5+A7*U
	  SINA5
	JMS I FMPYL	/A5*U+A7*U**2
	  TEMP2
	JMS I FADDL	/A3+A5(U)+A7(U**2)
	  SINA3
	JMS I FMPYL	/A3(U)+A5(U**2)+A7(U**3)
	  TEMP2
	JMS I FADDL	/A1+A3(U)+A5(U**2)+A7(U**3)
	  SINA1
	JMS I FMPYL	/A1(X)+A3(X**3)+A5(X**5)+A7(X**)
	  TEMP1
	JMS NCHK	/IF NFLAG IS SET,SET SIN(X)=-SIN(X)
	JMP I SIN	/FAC=SIN(X)


/******COSINE******
/USES SIN ROUTINE TO CALCULATE COS(X)

COS,	0
	JMS I FADDL	/COS(X)=SIN(PI/2+X)
	  PIOV2
	JMS SIN
	JMP I COS	/RETURN

FGETL,	FFGET
FADDL,	FFADD
FMPYL,	FFMPY
FPUTL,	FFPUT
FDIVL,	FFDIV
FSUB1L,	FFSUB1
FNEGL,	FFNEG
FSUBL,	FFSUB
FSQRL,	FFSQ
FIXL,	FFIX
FLOATL,	FFLOAT
FDIV1L,	FFDIV1
C3,	3
TEMP1,	0
	0
	0
TEMP2,	0		/TWO TEMP STORAGE BLOCKS FOR FUNCTIONS
	0
	0
ONE,	1		/1
	2000
	0

/ROUTINE TO SEPERATE THE INTEGER AND FRACTIONAL PARTS OF FAC
/ORIGINAL FAC IS SAVED IN TEMP1,THE INTEGER PORTION OF FAC IS
/SAVED AT NUM,AND THE FRACTIONAL FORTION OF THE FAC IS LEFT IN THE FAC

FRACT,	0
	JMS I FPUTL	/SAVE X
	  TEMP1
	JMS I FIXL	/INTEGER PORTION OF X
	TAD EXP
	DCA NUM		/SAVE FIXED FORTION OF X
	JMS I FLOATL	/FAC=FLOAT(FIX(X))
	JMS I FSUB1L	/FAC=X-INT(X)=FRACTION (X)
	  TEMP1
	JMP I FRACT	/RETURN

/ROUTINE TO CHECK IF FAC<0; IF IT IS,FAC IS NEGATED AND NFLAG IS
/SET TO 1

NHNDLE,	0
	TAD HORD	/FETCH HIGH ORDER MANTISSA
	SMA CLA		/IS IT <0?
	 JMP NFLGST	/NO-CLEAR NFLAG
	JMS I FNEGL	/YES-NEGATE FAC
	IAC		/AND SET NFLAG
NFLGST,	DCA NFLAG
	JMP I NHNDLE

/ROUTINE TO NEGATE FAC IF NFLAG IS NOT =0

NCHK,	0		/LOC ALSO USED FOR TEMP STORAGE
	TAD NFLAG
	SZA CLA		/IS NFLAG=0?
	 JMS I FNEGL	/NO-NEGATE FAC
	JMP I NCHK	/YES-RETURN

	NUM=NCHK

/******EXPONENTIAL******

EXPON,	0		/LOC USED FOR TEMP STORAGE BY SIN,ARCTAN
	JMS I FMPYL	/Y=XLOG2(E)
	  LOG2E
	JMS FRACT	/GET FRACTIONAL PART OF Y
	JMS I FMPYL	/(FRACTION(Y))*(LN2/2)
	  LN2OV2
	JMS I FPUTL	/SAVE Y
	  TEMP1
	JMS I FSQRL	/Y**2
	JMS I FADDL	/B1+Y**2
	  EXPB1
	JMS I FDIV1L	/A1/(B1+Y**2)
	  EXPA1
	JMS I FADDL	/A0+A1/(B1+Y**2)
	  EXPA0
	JMS I FSUBL	/A0-Y+A1/(B1+Y**2)
	  TEMP1
	JMS I FPUTL	/SAVE
	  TEMP2
	JMS I FGETL	/GET Y
	  TEMP1
	ISZ EXP		/MULT. BY 2=2Y
	 NOP
	JMS I FDIVL	/2Y/(A0-Y+A1/(B1+Y**2))
	  TEMP2
	JMS I FADDL	/1+2Y/(AO-Y+A1/(B1+Y**2))
	  ONE
	JMS I FSQRL	/[1+2Y/(A0-Y+A1/(B1+Y**2))]**2=EXP(Y)
	TAD NUM
	TAD EXP		/EXP(X)=(2**N)(EXPY)
	DCA EXP
	JMP I EXPON	/FAC=EXPON(X)

	NFLAG=EXPON

/CONSTANT THAT WOULDN'T FIT ELSEWHERE
TOVPI,	0		/.6366198
	2427
	6302
	*SIN+200

/******ARC TANGENT******

ATAN,	0
	JMS I NHNDLL	/IF X<0,SET NFLAG AND NEGATE
	JMS I FPUTM	/SAVE X
	  TEMP1
	JMS I FSUBM	/X-1
	  ONE
	TAD HORD	/GET HI MANTISSA
	SPA CLA		/WAS X>1?
	 JMP ARGPOL	/NO-CLEAR GT1FLG
	JMS I FGETM	/YES-ATAN(X)=PI/2-ATAN1/X)
	  ONE
	JMS I FDIVM	/1/X
	  TEMP1
	JMS I FPUTM
	  TEMP1
	IAC		/SET GT1FLG
ARGPOL,	DCA GT1FLG
	JMS I FGETM	/GET X OR 1/X
	  TEMP1
	JMS I FSQRM	/Y**2
	JMS I FPUTM	/SAVE
	  TEMP2
	JMS I FADDM	/Y**2+B3
	  ATANB3
	JMS I FDIV1M	/A3/(Y**2+B3)
	  ATANA3
	JMS I FADDM	/B2+A3/(Y**2+B3)
	  ATANB2
	JMS I FADDM	/Y**2+B2+A3/(Y**2+B3)
	  TEMP2
	JMS I FDIV1M	/A2/(Y**2+B2+A3/(Y**2+B3))
	  ATANA2
	JMS I FADDM	/B1+A2/(Y**2+B2+A3/(Y**2+B3))
	  ATANB1
	JMS I FADDM	/Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3))
	  TEMP2
	JMS I FDIV1M	/A1/(Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3)))
	  ATANA1
	JMS I FADDM	/B0+A1/(Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3)))
	  ATANB0
	JMS I FMPYM	/ATAN(Y)=X*(B0+A1/(Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3))))
	  TEMP1
	TAD GT1FLG	/WAS X>1?
	SNA CLA
	 JMP NGT	/NO-TEST IF X<0?
	JMS I FSUB1M	/ATAN(X)=PI/2-ATAN(1/X)
	  PIOV2
NGT,	JMS I NCHKL	/IF NFLAG SET,NEGATE FAC
	JMP I ATAN	/FAC=ATAN(X)
NHNDLL,	NHNDLE
NCHKL,	NCHK

/******NAPERIAN LOGARITHM******

	GTFLG=ATAN

LOG,	0
	TAD HORD
	SPA SNA		/X<0 OR X=0?
	 JMP I ARTRAP	/YES-TAKE ILLEGAL ARGUMENT TRAP
	CLL RTL
	SNA		/NO-HORD=2000?
	 TAD EXP	/YES-EXP=1?
	CMA IAC
	IAC
	SNA
	TAD LORD	/YES-LORD=0?
	SZA CLA
	 JMP POLYNL	/NO-ARG IS LEGAL AND NOT 1
	DCA EXP
	DCA LORD
LTRPRT,	DCA HORD
	JMP I LOG	/YES-LOG(1)=0
POLYNL,	TAD EXP
	DCA GTFLG	/SAVE EXPONENT FOR LATER
	DCA EXP		/ISOLATE MANTISSA IN FAC
	JMS I FPUTM	/SAVE F
	  TEMP1
	JMS I FADDM	/F+SQR(.5)
	  SQRP5
	JMS I FPUTM	/SAVE
	  TEMP2
	JMS I FGETM
	  TEMP1
	JMS I FSUBM	/F-SQR(.5)
	  SQRP5
	JMS I FDIVM	/Z=F+SQR(.5)/F-SQR(.5)
	  TEMP2
	JMS I FPUTM
	  TEMP1
	JMS I FSQRM	/Z**2
	JMS I FPUTM
	  TEMP2
	JMS I FMPYM	/C5(Z**2)
	  LOGC5
	JMS I FADDM	/C3+C5(Z**2)
	  LOGC3
	JMS I FMPYM	/C3(Z**2)+C5(Z**4)
	  TEMP2
	JMS I FADDM	/C1+C3(Z**2)+C5(Z**4)
	  LOGC1
	JMS I FMPYM	/C1(Z)+C3(Z**3)+C5(Z**5)
	  TEMP1
	JMS I FSUBM	/C1(Z)+C3(Z**3)+C5(Z**5)-1/2=LOG2(F)
	  ONEHAF
	JMS I FPUTM	/SAVE LOG2(F)
	  TEMP2
	TAD GTFLG	/I
	DCA EXP		/SET UP FLOAT
	JMS I FLOATM
	JMS I FADDM	/I+LOG2(F)
	  TEMP2
	JMS I FMPYM	/[I+LOG2(F)]*LOGE(2)=LOGE(X)
	  LN2
	JMP I LOG	/FAC=LN(X)

	GT1FLG=LOG
FPUTM,	FFPUT
FMPYM,	FFMPY
FADDM,	FFADD
FDIVM,	FFDIV
FDIV1M,	FFDIV1
FSUBM,	FFSUB
FSUB1M,	FFSUB1
FSQRM,	FFSQ
FLOATM,	FFLOAT
FGETM,	FFGET
ARTRAP,	FTRP3

/CONSTANTS USED BY VARIOUS FUNCTIONS

SINA1,	1		/1.5707949
	3110
	3747
SINA3,	0		/-.64592098
	5325
	1167
SINA5,	7775		/.07948766
	2426
	2466
SINA7,	7771		/-.00362476
	5610
	3164
PIOV2,	1		/1.5707963
	3110
	3756
LOG2E,	1		/1.442695
	2705
	2434
LN2OV2,	7777		/.34657359
	2613
	4415
EXPB1,	6		/60.090191
	3602
	7054
EXPA1,	12		/-601.80427
	5514
	3104
EXPA0,	4		/12.015017
	3001
	7301
ATANB0,	7776		/.17465544
	2626
	6157
ATANA1,	2		/3.7092563
	3553
	1071
ATANB1,	3		/6.762139
	3303
	670
ATANA2,	3		/-7.10676
	4344
	5267
ATANB2,	2		/3.3163354
	3241
	7554
ATANA3,	7777		/-.26476862
	5703
	4040
ATANB3,	1		/1.44863154
	2713
	3140
SQRP5,	0		/.7071068
	2650
	1170
LOGC1,	2		/2.8853913
	2705
	2440
LOGC3,	0		/.9614706
	3661
	566
LOGC5,	0		/.59897865
	2312
	5525
ONEHAF,	0		/.5
	2000
	0
LN2,	0		/.6931472
	2613
	4415

	FFSIN=SIN
	FFCOS=COS
	FFATN=ATAN
	FFLOG=LOG
	FFEXP=EXPON
/23-BIT FLOATING PT INTERPRETER
/DEC-08-NFPPA-A	VERSION 1
/COPYRIGHT	 1972 BY DIGITAL EQUIPMENT CORPORATION
/MAYNARD, MASSACHUSETTS. 01754
/
/W.J. CLOGHER
/
/
/DEFINITION FOR ORIGIN OF PACKAGE
/
FLPT=7400

/
/PAGE ZERO LOCATIONS USED 
/
*7
FPP,	FPT	/IF THIS IS MOVED, FIX LOC. K7
*40
AC0,	0
AC1,	0
AC2,	0
TM,	CDF 0	/ONLY NEEDED ONCE (FIRST CALL TO CDFCUR)
ACX,	0	/FLOATING ACCUMULATOR-EXPONENT
ACH,	0	/   "          "     -HIGH ORDER MANTISSA
ACLO,	0	/   "          "     -LOW ORDER MANTISSA
OPX,	0	/STORAGE FOR OPERAND
OPH,	0
OPL,	0
DSWIT,	0	/SWITCH SHOWING IF ANY INPUT CONV. WAS DONE
CHAR,	0	/LOCATION HOLDING TERMINATOR OF LAST INPUT.
SWIT1,	7777	/=0 IF NO LINE FEED AFTER CAR.RET. ON INPUT
SWIT2,	7777	/=0 IF NO CR/LF AFTER OUTPUT
/
/IF EFLG = 0, 6 IS DEPOSITED INTO DADP, AND 16 (8) INTO FLDW
/
EFLG,	0	/=0 IF E FORMAT OUT
FLDW,	0	/FIELD WIDTH ON OUTPUT
DADP,	0	/=# OF PLACES AFTER DEC. PT.
FPNXT,	FPNEXT	/(DON'T USE FPNEXT AS A TEM!! E.G. IN I/O
		/SINCE OS/8 BASIC MAY BE THERE INSTEAD!!!)

*FLPT-2600
/
/PARTS OF INTERPRETER DISPATCH ROUTINES
/
/TABLE FOR JUMPS-OP CODE 7
/
JMPI3,	JMP I	TABLE3
TABLE3,	FFSKP		/SKIP ON CONDITION OF FAC
	FFCDF		/CHANGE FLTG. DATA FIELD
	FFSW0		/FLOATING SWITCH 0
	FFSW1		/FLOATING SWITCH 1
	FFHLT		/FLOATING HALT-DISPLAY PC
	FPNEXT		/NOP-FOR FUTURE EXPANSION
	FPNEXT		/ "
	FPNEXT		/ "
/
/ROUTINE FOR DECODING SPECIAL FJMS'S-OP CODE 7
/
JSKP,	TAD	OPH	/GET EFF. ADDR.
	AND	P7	/MASK OFF BITS 9-11
	TAD	JMPI3	/MAKE A JUMP THROUGH TABLE
	DCA	.+1	/STORE IT
	0		/EXECUTE IT
P7,	7
/
/FLOATING SWITCH 1
/
FFSW1,	JMS I	CDFCRK	/MUST BE CURRENT DATA FIELD
	TAD	FFSB1	/CHANGE INTERPRETATION OF SUB, DIV
	DCA I	TSUBP	/SO THAT FAC IS SUBTRACTED
	TAD	FFDV1	/FROM OR DIVIDED INTO OPERAND
	DCA I	TDIVP
	JMP I	FPNXT	/DONE
FFSB1,	FFSUB1
FFDV1,	FFDIV1
TSUBP,	TSUB
TDIVP,	TDIV

*FLPT-2500
/
/THIS STUFF MUST BE HERE CAUSE OS/8 BASIC EXPECTS IT  
/TO BE HERE
/
/MDSET-SETS UP SIGNS FOR MULTIPLY AND DIVIDE
/ALSO SHIFTS OPERAND ONE BIT TO THE LEFT.
/EXIT WITH EXPONENT OF OPERAND IN AC FOR EXPONENT
/CALCULATION-CALLED WITH ADDRESS OF OPERAND IN AC AND
/DATA FIELD SET PROPERLY FOR OPERAND.
/
MDSET,	0
	JMS I	ARGETK	/GET ARGUMENT
MD1,	JMS I	CDFCRK	/CHANGE TO DF OF PACKAGE
	CLA CLL CMA RAL	/SET SIGN CHECK TO -2
	DCA	TM
	TAD	OPH	/IS OPERAND NEGATIVE?
	SMA	CLA
	JMP	.+3	/NO
	JMS I	OPNEGP	/YES-NEGATE IT
	ISZ	TM	/BUMP SIGN CHECK
	TAD	OPL	/AND SHIFT OPERAND LEFT ONE BIT
	CLL	RAL
	DCA	OPL
	TAD OPH
	RAL
	DCA	OPH
	DCA	AC1	/CLR. OVERFLOW WORF OF FAC
	TAD	ACH	/IS FAC NEGATIVE
	SMA	CLA
	JMP	LEV	/NO-GO ON
	JMS I	FFNEGK	/YES-NEGATE IT
	ISZ	TM	/BUMP SIGN CHECK
	NOP		/MAY SKIP
LEV,	TAD	OPX	/EXIT WITH OPERAND EXPONENT IN AC
	JMP I	MDSET

FFNEGK,	FFNEG
OPNEGP,	OPNEG
CDFCRK,	CDFCUR
ARGETK,	ARGET
/
/CONTINUATION OF FLOATING DIVIDE ROUTINE
/
FD1,	TAD	AC2	/NEGATE HI ORDER PRODUCT
	CLL CMA IAC
	TAD	ACH	/COMPARE WITH REMAINDER OF FIRST DIV.
	SNL		/WELL?
	JMP I	DVOPSP	/GREATER THAN REM.-ADJUST QUOT OF 1ST DIV.
	CLL		/OK-DO  (REM-(Q*OPL))/OPH
	DCA	ACH	/FIRST STORE ADJUSTED PRODUCT
	JMS I	DV24P	/DIVIDE BY OPH (HI ORDER OPERAND)
DVL1,	TAD	AC1	/GET QUOT. OF FIRST DIV.
	SMA		/IF HI ORDER BIT SET-MUST SHIFT 1 RIGHT
	JMP	FD	/NO-ITS NORMALIZED-DONE
	CLL	RAR	/MUST SHIFT RIGHT 1
	DCA	ACH	/STORE IN FAC
	TAD	ACLO	/SHIFT LOW ORDER RIGHT
	RAR
	DCA	ACLO	/STORE BACK
	ISZ	ACX	/BUMP EXPONENT
	NOP
	TAD	ACH
FD,	DCA	ACH	/STORE HIGH ORDER RESULT
	JMP I	FDDONP	/GO LEAVE DIVIDE

FDDONP,	FDDON		/END OF FLTG. DIV. ROUTINE
DV24P,	DV24		/ROUTINE TO DO A 24X12BIT DIVIDE
DVOPSP,	DVOPS		/ROUTINE TO ADJUST QUOT OF FIRST DIV.
/
/CONTINUATION OF ROUTINE TO ADJUST QUOT. OF FIRST DIV.
/DBAD1 IS ONLY EXECUTED ON DIVIDE OVERFLOW-OTHERWISE THE
/ROUTINE STARTS AT DVOP2
/
DBAD1,	DCA	ACX	/DIVIDE OVERFLO-ZERO ALL
DVOP2,	SNA		/IS IT ZERO?
	DCA	ACLO	/YES-MAKE WHOLE THING ZERO
	DCA	ACH
	JMS I	DV24P	/DIVIDE EXTENDED REM. BY HI DIVISOR
	TAD	ACLO	/NEGATE THE RESULT
	CLL CMA IAC
	DCA	ACLO
	SNL		/IF QUOT. IS NON-ZERO, SUBTRACT
	CMA		/ONE FROM HIGH ORDER QUOT.
	JMP	DVL1	/GO TO IT
*FLPT-1600

/
/FLOATING OUTPUT ROUTINE
/
FFOUT,	0
	CLA CLL CMA RAL	/MAKE A MINUS TWO
	DCA I	FFNGP	/AND STORE IN SIGN WORD
	DCA	KNT	/CLEAR COUNT WORD
	TAD	EFLG	/IS THIS E FORMAT?
	SZA	CLA	
	JMP	FFMT	/NO-F FORMAT
	TAD	K6	/YES-GET A 6
	DCA	DADP	/STORE AS # OF DIGITS AFT DEC PT
	TAD	K16	/SET FIELD WIDTH TO 14 ( DECIMAL)
	DCA	FLDW
FFMT,	JMS I	CDFCRB	/CHANGE TO FIELD OF PACKAGE
	TAD	KM7	/SET # OF SIGNF. DIGITS
	DCA I	DCNTP	/TO 6 (DON'T PRINT 7TH)
	TAD	ACH	/DETERMINE IF #=0
	SNA
	JMP	FOUT3	/YES-SKIP DOWN
	SMA	CLA	/NO-IS IT NEGATIVE?
	JMP	.+3	/POSITIVE
	JMS I	FFNGP	/NEGATE #
	DCA I	FFNGP	/NEGATIVE-SET FLAG
FOUT1,	TAD	ACX	/GET # INTO RANGE .1<=N<1
	SMA SZA CLA	/IS EXP. NEG.?
	JMP	FOUT2	/NO-GO ON
	JMS I	FFMPP	/YES-MAKE # GREATER THAN 1
	TEN		/BY MULTIPLYING BY TEN (DEC.)
	ISZ	KNT	/COUNT THE MULTIPLIES
	JMP	FOUT1	/SEE IF > YET
FOUT2,	JMS	SE	/# IS >1-MAKE IT LESS THAN 1
	JMS I	FFPUTP	/STORE IN A TEMPORARY
	TM3
	DCA	ACX	/SET FAC TO .5
	CLL CML RTR
	DCA	ACH
	DCA	ACLO
	TAD	EFLG	/IS THIS E FORMAT?
	SZA	CLA
	TAD	KNT	/NO-GET COUNT OF MULTIPLIES
	CMA	IAC	/NEGATE IT
	TAD	DADP	/AND ADD # OF DIGITS AFT. DC. PT.
	SMA		/MUST BE NEGATIVE
	CMA
	TAD	KK7	/LIMIT # OF DIVS TO 7
	SPA
	CLA
	TAD	KM7	/RESTORE
	DCA	SE	/STORE AS COUNTER
	JMP	.+3
	JMS I	FFDVP	/DIVIDE .5 BY TEN THAT # OF TIMES
	TEN
	ISZ	SE	/DONE?
	JMP	.-3	/NO-GO ON
	JMS I	FFADP	/YES-ADD IN ORIG.#-THIS IS ROUNDING
	TM3
	JMS	SE	/INSURE THAT IT IS IN RANGE
FOUT4,	TAD	ACX	/SHIFT MANTISSA ACCORDING TO EXP
	CMA	IAC	/0=1 LEFT; 1=NO SHIFT;2=1 RIGHT,...
	JMS I	ACSRPT	/SHIFT RIGHT (ACX+1) PLACES
	JMS I	AL1PT	/SHIFT LEFT 2 TO CORRECT
	JMS I	AL1PT	/(WE ARE LOSING BITS!!)
FOUT3,	TAD	KNT	/DONE-GET COUNT OF MULS.
	DCA	OPX	/PRESERVE IT
	TAD	EFLG	/IS THIS E FORMAT OUT?
	SZA	CLA
	JMP	NOTE	/NO
	DCA	KNT	/YES-ZERO COUNT
	TAD	KM7	/GET MINUS 7-FOR 2 SIGNS,PT,+EXP
	JMP	ADFW	/GO ADD FIELD WIDTH
ACSRPT,	ACSR
AL1PT,	AL1
/
/ROUTINE TO GET FAC<1
/
SE,	0
SE1,	TAD	ACX
	SPA SNA CLA	/#>1?
	JMP I	SE	/NO-RETN.
	JMS I	FFDVP	/YES-DIV. BY TEN
	TEN
	CMA
	TAD	KNT	/REDUCE KNT BY 1
	DCA	KNT
	JMP	SE1
/CONSTANTS AND POINTERS
OUTDGP,	OUTDG
K16,	16
CDFCRB,	CDFCUR
FLINK,	JMP I	FFOUT
PRNTXP,	PRNTX
PRZROP,	PRZRO
DGTYPP,	DGTYP
DCNTP,	DCNT
M1,	7777
KK7,	7
KM20,	-20
KM7,	-7
FFADP,	FFADD
FFDVP,	FFDIV
FFPUTP,	FFPUT
FFMPP,	FFMPY
FFNGP,	FFNEG
KNT,	0
K6,	6
/CONTINUATION OF OUTPUT MAINLINE
NOTE,	TAD	KNT	/GET COUNT OF MULTIPLIES
	SMA		/IF NOT NEG-MAKE = -2
	CLA	CMA
	TAD	M1	/MINUS 1 FOR DEC.PT
ADFW,	TAD	FLDW	/GET THE FIELD WIDTH
	CMA	IAC	/NEGATE IT
	DCA I	FFDVP	/STORE WHILE WE CHECK DADP
	TAD	DADP	/GET DIGITS AFTER DEC. PT
	SNA		/DID HE SAY NO DEC. PLACES?
	CMA		/YES-TAKE AWAY 1 SINCE NO DEC. PT.
	TAD I	FFDVP	/ADD IN REST
	SMA		/NEG?
	JMP I	PRNTXP	/NO-PRINT XS-NOT ENUFF ROOM
	DCA	SE	/STORE AS CNT OF SPACES
	JMP	.+3
	TAD	KM20
	JMS I	OUTDGP	/PRINT A SPACE
	ISZ	SE	/DONE?
	JMP	.-3	/NO-GO ON
	CLA CLL CMA RTL	/MAKE A MINUS 3
	TAD I	FFNGP	/YES-GET SIGN(=-2 OR 0)
	JMS I	OUTDGP	/FOR PLUS OR MINUS-PRINT SIGN
	TAD	KNT	/GET MUL COUNT
	SMA
	JMP I	PRZROP	/PRINT LEADING ZERO
	CMA	IAC	
	JMS I	DGTYPP	/OUTPUT 'KNT' DIGITS
PRDCP,	TAD	DADP	/CHECK DADP FOR 0
	SNA	CLA	/DON'T PRINT '.' IF DADP=0
/*************************************
/FALL THROUGH PAGE BONDARY!!!
/'SNA CLA' MUST BE LAST LOC. ON PAGE!!!
/(CURSE YOU B.C.)
/*************************************
*FLPT-1400
/*******FALL THROUGH PAGE BOUNDARY TO HERE*******
	JMP	GKNT	/MUST BE FIRST LOC. OF PAGE!!*******
PDP,	CLA CLL CMA RAL
	JMS	OUTDG	/PRINT DEC. PT.
GKNT,	TAD I	KNTP	/GET COUNT AGAIN
	SPA SNA CLA
	JMP	GD
	TAD I	KNTP	/GET COUNT
	CMA		/NEGATE
	DCA	DGTYP	/STORE AS COUNTER
	TAD	DADP
	CMA		/SAME FOR DADP
	DCA	SEP
	JMP	PR	/GO ON
PZR,	JMS	OUTDG	/PRINT A ZERO
PR,	ISZ	DGTYP
	SKP
	JMP	PS
	ISZ	SEP
	JMP	PZR
PS,	TAD I	KNTP
	CMA	IAC
GD,	TAD	DADP
	SMA	SZA
	JMS	DGTYP
	CLA
	TAD	EFLG
	SZA	CLA
	JMP	DONEF	/DONE
	JMS	OUT
	305		/PRINT 'E'
	TAD	OPX	/GET PRESERVED COUNT OF MULS
	SMA SZA CLA	/DETERMINE SIGN
	CLA CLL CML RTL	/MAKE A 2
	JMS	OUT
	253		/PRINT MINUS OR PLUS SIGN
	TAD	KM144	/SET TO DIV BY 100
	DCA	OPH
	CLA CLL CMA RAL	/SET LOOP COUNTER
	DCA	DGTYP
	TAD	OPX	/GET THE COUNT
	SPA
	CMA	IAC	/NEGATE IF NEGATIVE
LOOP,	DCA	ACLO	/STORE FOR DIV. ROUTINE
	DCA	ACH	/HI ORD. MUST BE ZERO
	CLL		/PREVENT DIVIDE OVERFLOW!!
	JMS I	DV24PT	/DIVIDE BY 100
	TAD	ACLO	/GET THE QUOTIENT
	JMS	OUTDG	/OUTPUT HUNDREDS PLACE
	TAD	KM12	/NOW DIV. BY 10
	DCA	OPH
	TAD	ACH	/DIV. REM. BY 10
	ISZ	DGTYP	/DONE?
	JMP	LOOP	/NO-GO DO CALCULATE , PRINT TENS PLACE
	JMS	OUTDG	/YES-REM(ONES PLACE)IS IN AC-PRINTIT
DONEF,	TAD	SWIT2	/SHOULD WE PRINT CR/LF?
	SNA	CLA
	JMP I	FLING	/NO
	JMS	OUT
	215
	JMS	OUT
	212
	JMP I	FLING
/
/OUTPUT DIGITS OF FAC BY MULTIPLYING BY TEN
/THE HIGH ORDER OVERFLOW IS THE DIGIT
DGTYP,	0
	CMA	IAC
	DCA	SEP	/STORE COUNT PASSED
DT1,	TAD	ACH	/GET FAC AND STORE FOR LATER
	DCA	OPH
	TAD	ACLO
	DCA	OPL
	JMS I	AL1PP	/SHIFT FAC LEFT 1 = FAC*2
	RAL		/OVERFLOW TO TM3
	DCA	TM3
	JMS I	AL1PP	/SHIFT LEFT AGAIN = FAC*4
	TAD	TM3	/SHIFT OUT OVERFLOW
	RAL
	DCA	TM3
	DCA	AC2	/MUST BE 0 FOR OADD
	JMS I	OADDP	/ADD ORIG FAC = FAC*5
	RAL		/ADD OVERFLOW TO TM3
	TAD	TM3
	DCA	TM3
	JMS I	AL1PP	/SHIFT FAC 1 LEFT = FAC*10!!
	TAD	TM3	/OVERFLOW IN TM3 IS FIRST DIGIT
	RAL
	ISZ	DCNT	/DONE ALL SIGNIF. DIGS.?
	JMP	.+3	/NO-GO ON
	CLA	CMA	/YES-PRINT ZEROS
	DCA	DCNT	/FROM NOW ON
	JMS	OUTDG	/PRINT DIGIT (HI ORD. OVRFLOW)
	ISZ	SEP	/DONE REQUIRED?
	JMP	DT1	/NOPE
	JMP I	DGTYP	/YUP
KM144,	-144
KM12,	-12
DV24PT,	DV24
DCNT,	0	/COUNT OF SIGNF. DIGITS
AL1PP,	AL1
OADDP,	OADD
FLING,	FLINK
PRDCPP,	PRDCP
/NEEDED FOR OS/8 BASIC
*FLPT-1234
/
/OUTPUT ROUTINE
/
OUT,	0
	TAD I	OUT	/GET THE CHAR.
	TSF
	JMP	.-1
	TLS
	CLA	CLL	/USE AN 'AND..' INSTEAD???
	JMP I	OUT

/
/OUTPUT DIGIT
/
OUTDG,	0
	JMS	OUT
	260
	JMP I	OUTDG	/RETN

KNTP,	KNT
TM3,	0
	0
SEP,	0
PRNTX,	CLA
	TAD	FLDW	/GET FIELD WIDTH
	CMA		/MUST BE NEGATIVE
	DCA	SEP	/USE AS COUNTER
PRNTX1,	ISZ	SEP	/DONE ALL?
	SKP		/NO-GO ON
	JMP	DONEF	/YES-RETN.
	JMS	OUT	/PRINT ASTERISK
	252		/ASTERISK
	JMP	PRNTX1
/
/PRINT A LEADING ZERO
/
PRZRO,	CLA
	JMS	OUTDG
	JMP I	PRDCPP

/
/FLOATING POINT INPUT ROUTINE
/
*FLPT-1200
FFIN,	0
	CLA	CMA
	DCA I	FDVPT	/INITIALIZE PERIOD SWITCH TO -1
	CMA		/SET SIGN SWITCH TO -1
	DCA	SIGNF
	JMS I	CDFCRA	/CHANGE TO DF OF PACKAGE
	DCA	DSWIT	/ZERO CONVERSION SWITCH
DECONV,	DCA	ACX	/ZERO OUT THE FAC!
	DCA	ACLO
P200,	200
	DCA	ACH
DECNV,	DCA	DNUMBR	/ZERO # OF DIGITS SINCE DEC. PT.
DECON,	JMS	GCHR	/GET A CHAR.FROM TTY.
	JMP	FFIN1	/TERMINATOR-
	ISZ	DSWIT	/DIGIT-BUMP CONVERSION SWITCH
	ISZ	DNUMBR	/BUMP # OF DIGITS-# IS STORED IN
	JMS I	FPP	/FORM EASILY FLOATIBLE-ENTER INTERP.
	FMPY	TEN	/MULTIPLY # BY TEN
	FPUT I	TM3PT	/STORE IT AWAY
	FGET	TP	/GET NEW DIGIT
	FNOR		/FLOAT IT
	FADD I	TM3PT	/ADD IT TO ACCUMULATED #
	FEXT		/DONE
	JMP	DECON	/GO ON
FFIN1,	ISZ I	FDVPT	/HAVE WE HAD A PERIOD YET?
	JMP	FIGO2	/YES-GO ON
	ISZ	TP1	/NO-IS THIS A PERIOD?
	ISZ	TP1
	SKP	CLA
	JMP	DECNV	/YES-ZERO DIG. COUNT AFTER DEC. PT.
			/AND GO CONVERT REST
	DCA	DNUMBR	/NO-TERMINATOR-ZERO COUNT OF
			/DIGITS AFTER DECIMAL POINT.
FIGO2,	ISZ	SIGNF	/IS # NEGATIVE?(DID WE GET - SIGN?)
	JMS I	FFNEGP	/YES-NEGATE IT
	CLA	CMA	/RESET SIGN SWITCH FOR EXP.
	DCA	SIGNF
	TAD	CHAR	/NO-WAS THE TERMINATOR AN 'E'?
	TAD	KME	
	SNA	CLA
GETE,	JMS	GCHR	/YES-GET A CHAR. OF EXPONENT
	JMP	EDON	/END OF EXPONENT
	TAD	TM	/GOT DIG. OF EXP-STORED IN TP1
	CLL	RTL	/MULT. ACCUMULATED EXP BY 10
	TAD	TM
	CLL	RAL
	TAD	TP1	/ADD DIGIT
	JMP	GETE	/CONTINUE
EDON,	TAD	TM	/GET EXPONENT
	ISZ	SIGNF	/WAS EXPONENT NEGATIVE?
	CMA	IAC	/YES-NEGATE IT
	CMA	IAC	/AND CALC. DNUMBR - EXPON.
	TAD	DNUMBR	/GET # TIMES TO DIV MANTISSA BY TEN
	CLL CMA IAC
	SPA		/RESULT POSITIVE?
	CLL CMA CML IAC	/NO-MAKE POS. AND SET LINK
	CMA		/NEGATE FOR COUNTER
	DCA	DNUMBR	/AND STORE
	RAL		/LINK=1-DIV;=0-MUL. # BY TEN
	TAD	MDV	/FORM CORRECT INSTRUCTION
	DCA	SIGNF	/AND STORE FOR EXECUTION
FCNT,	ISZ	DNUMBR	/DONE ALL OPERATIONS?
	JMP	SIGNF	/NO
	JMP I	FFIN	/YES-RETURN
SIGNF,	0		/NO- MUL OR DIV. MATISSA
	TEN		/BY TEN
	JMP	FCNT	/GO ON
FFNEGP,	FFNEG
TM3PT,	TM3
DNUMBR,	0
KME,	-305
MDV,	JMS I	.+1	/THESE 3 WDS. MUST BE IN THIS ORDER
	FFMPY
FDVPT,	FFDIV		/!!!!!!!!!!!!!!!!!

CDFCRA,	CDFCUR
KK12,	12
TP,	13
TP1,	0
	0
TEN,	4
	2400
	0
/ROUTINE TO GET A CHAR FROM THE TTY AND SEE IF IT IS DIGIT
/OR A TERMINATOR.
/RETURN TO CALL + 1 IF TERMINATOR, TO CALL + 2 IF DIGIT
/THIS ROUTINE MUST NOT MODIFY THE MQ!!
GCHR,	0
	DCA	TM	/STORE ACCUMULATED EXPONENT (MAYBE)
	JMS	INPUT	/GET A CHAR FROM TTY.
	TAD	CHAR	/PICK IT UP
	TAD	PLUS	/WAS IT PLUS SIGN?
	SNA
	JMP	DECON1	/YES-GET ANOTHER CHAR.
	TAD	MINUS	/NO WAS IT MINUS SIGN?
	SZA	CLA
	JMP	.+3
	DCA	SIGNF	/YES-FLIP SWITCH
DECON1,	JMS	INPUT	/GET A CHAR.
	TAD	CHAR
	TAD	K7506	/SEE IF ITS A DIGIT
	CLL
	TAD	KK12
	DCA	TP1	/STORE FOR LATER
	SZL		/DIGIT?
	ISZ	GCHR	/YES-RETN. TO CALL+2
	JMP I	GCHR	/NO-RETN. TO CALL+1
K7506,	7506
/
/INPUT ROUTINE-CHECKS FOR RUBOUT AND CARRIAGE RETURN
/
INPUT,	0
	KSF
	JMP	.-1
	KCC
	TAD	P200	/FORCE CHANNEL 8
	KRS		/READ CHAR.
	DCA	CHAR	/STORE CHAR.
LP,	TAD	CHAR
	DCA	TMIN	/STORE IT AGAIN
	JMS I	OUTPP	/PRINT IT
TMIN,	0
	TAD	CHAR
	TAD	MRUBOT	/IS IT RUBOUT?
	SNA
	JMP	FFIN+1	/YES-RESTART INPUT
	TAD	MCR	/NO-IS IT CARRIAGE RETN.?
	SNA	CLA
	TAD	SWIT1	/YES-SHOULD WE ECHO LINE FEED?
	SZA	CLA
	JMS I	OUTPP	/YES-DO IT
	212		/LINE FEED
	JMP I	INPUT	/RETURN
OUTPP,	OUT
MCR,	377-215
MRUBOT,	-377
PLUS,	-253
MINUS,	253-255

*FLPT-1000
/
/INVERSE FLOATING SUBTRACT-USES FLOATING ADD
/!!FSW1!!-THIS IS OP-FAC
/
FFSUB1,	0
	SNA		/WHICH MODE?
	TAD I	FFSUB1	/CALLED BY USER-GET ADDR. OF OP.
	JMS I	ARGETL	/GO PICK UP OPERAND
	JMS I	FFNEGA	/NEGATE FAC
	TAD	FFSUB1	/AND GO ADD
	JMP I	SUB0P
FFNEGA,	FFNEG
SUB0P,	SUB0
KM22,	-26
/
/INVERSE FLOATING DIVIDE
/FSWITCH=1
/THIS IS OP/FAC
/
FFDIV1,	0
	SNA		/WHICH MODE OF CALL?
	TAD I	FFDIV1	/CALLED BY USER-GET ADDR.
	JMS I	ARGETL	/PICK UP OPERAND
	TAD	ACLO	/SWAP THE FAC AND OPERAND
	DCA	OPL	/THERE IS A POINTER TO OPL
	TAD I	AC2	/IN AC2 LEFT FROM ARGET SUBR.
	DCA	ACLO
	TAD	ACX	/MIGHT AS WELL SUBTRACT THE
	CLL CMA IAC	/EXPONENTS HERE (SAVES A WORD)
	TAD	OPX	/THEN ZERO OPX SO WILL NOT
	DCA	ACX	/MESS UP WHEN ITS DONE AGAIN
	DCA	OPX	/LATER (SEE DIV. ROUTINE)
	TAD	ACH
	DCA	AC2	/NOW SWAP HIGH ORDER MANTISSAS
	TAD	OPH
	DCA	ACH
	TAD	AC2
	DCA	OPH
	JMS I	CDFCRL	/CHANGE DF TO CURRENT
	TAD	FFDIV1	/NOW KLUDGE UP SUBROUTINE LINKAGE
	DCA I	FFDP
	TAD	KFD1
	DCA I	MDSETP
	JMP I	MD1P	/GO SET UP AND DIVIDE

MD1P,	MD1
ARGETL,	ARGET
CDFCRL,	CDFCUR
MDSETP,	MDSET
FFDP,	FFDIV
KFD1,	FFD1
AN1=FFSUB1
AN2=FFDIV1
/FLOATING SQUARE ROOT
/USES A HARDWARE TYPE ALGORITHM FOR BINARY SQUARE ROOTS
/REF: THE LOGIC OF COMPUTER ARITHMETIC-IVAN FLORES-P 409
/
FROOT,	0
	CLA CLL CML RTR	/SET RESULT TO 2000;0000
	DCA	AN1
	DCA	AN2
	JMS I	CDFCRL	/CHANGE TO DATA FIELD OF PACKAGE
	TAD	KM22	/SET COUNTER FOR DEVELOPING 22 BITS OF ERESULT
	DCA	AC2	/ALREADY HAVE 1
	TAD	ACH
	SNA
	JMP I	FROOT	/ZERO FAC-NORMALIZED!-RETN. SAME
	SPA	CLA
	JMS I	FFNEGA	/TAKE ROOT OF ABSOL VALUE
	TAD	ACX	/GET EXPONENT OF FAC
	SPA		/IF NEGATIVE-MUST PROPAGATE SIGN
	CML
	RAR		/DIVIDE EXP. BY 2
	DCA	ACX	/STORE IT BACK
	SZL		/INCREMENT EXP. IF ORIGINAL EXP 
	ISZ	ACX	/WAS ODD
	NOP
	SNL		/DO A PRE-SHIFT FOR EVEN EXPONENTS
	JMS I	AL1K	/SO FIRST BIT PAIR IS 10 NOT 01
	CLA CLL CMA RAL	/SET COUNTER FOR DETECTING A
	DCA	ZCNT	/ZERO REMAINDER
	CLA CLL CML RTR	/SET UP POSITION OF TRIAL BIT
	RTR		/FOR FIRST PASS THRU LOOP
	DCA	OPH
	DCA	OPL
	TAD	K6000	/GET A FAST FIRST BIT-WE KNOW 
	TAD	ACH	/THIS WILL WORK SINCE # IS NORMALIZED
	DCA	ACH	/IF # IS A POWER OF TWO, AND A PERFECT
	TAD	ACH	/SQUARE-WE ARE DONE HERE!
	SNA		/WELL IS IT?
	TAD	ACLO	/COULD BE-CHECK LOW ORDER
	SNA	CLA
	JMP	DONE	/WHOOPPEE-WE WIN BIG.
	JMP	LOP01	/NOPE-LOOP DON'T SHIFT FIRST TIME
SLOOP,	TAD	OPH	/SHIFT TRIAL BIT 1 PLACE
	CLL	RAR	/TO THE RIGHT
	DCA	OPH	/AND STORE BACK
	TAD	OPL
	RAR
	DCA	OPL
	JMS I	AL1K	/SHIFT FAC LEFT 1 PLACE
LOP01,	TAD	OPL	/ADD TRIAL BIT TO`ANSWER
	TAD	AN2	/SO FAR
	CLL CMA IAC	/NEGATE IT
	TAD	ACLO	/AND ADD TO FAC (REMAINDER SO FAR)
	SNA		/IS RESULT ZERO?
	ISZ	ZCNT	/YES-INCREMENT COUNTER
	DCA	TM	/STORE RESULT IN TEMPORARY

	CML	RAL	/ADD CARRY TO HIGH ORDER FOR SUBTRACT
	TAD	OPH	/ADD TRIAL BIT
	TAD	AN1	/ADD RESULT SO FAR (HI ORDER)
	CLL CMA IAC	/AND SUBTRACT FROM HI ORDER FAC
	TAD	ACH
	SNL		/RESULT NEGATIVE?
	JMP	GON	/YES-NEXT RESULT BIT IS 0
	SZA		/NO-IS HI ORDER RESULT=0?
	JMP	LOP02	/NO-GO ON
	ISZ	ZCNT	/YES-WAS LOW ORDER =0?
	JMP	.+3	/NO-GO ON
	CMA		/YES-REM.=0-SET COUNTER SO
	DCA	AC2	/LOOKS LIKE WE'RE DONE
LOP02,	DCA	ACH	/STORE HIGH ORDER REM. IN FAC
	TAD	TM	/STORE LO ORDER REM. IN FAC
	DCA	ACLO
	TAD	OPL	/TRIAL BIT SHIFTED LEFT 1 IS
	CLL	RAL	/RESULT BIT-ADD IT TO ROOT DEVELOPED
	TAD	AN2	/SO FAR
	DCA	AN2
	TAD	OPH
	RAL
	TAD	AN1
	DCA	AN1
GON,	CLA CLL CMA RAL	/RESET COUNTER FOR ERO REM.
	DCA	ZCNT	
	ISZ	AC2	/DONE ALL 23 RESULT BITS?
	JMP	SLOOP	/NO-GO ON
DONE,	TAD	AN1	/YES-STORE ANSWER IN FAC
	DCA	ACH	/ITS NORMALIZED ALREADY
	TAD	AN2
	DCA	ACLO
	JMP I	FROOT	/AND RETURN

K6000,	6000
ZCNT,	0
AL1K,	AL1
/23-BIT FLOATING PT INTERPRETER
*FLPT-600
/FLOATING MULTIPLY-DOES 2 24X12 BIT MULTIPLIES
FFMPY,	0
	SNA		/WHICH MODE OF CALL?
	TAD I	FFMPY	/CALLED BY USER-GET OPERAND ADDR.
	JMS I	MDSETK	/SET UP FOR MPY-OPX IN AC ON RETN.
	TAD	ACX	/DO EXPONENT ADDITION
	DCA	ACX	/STORE FINAL EXPONENT
	DCA	DV24	/ZERO TEM STORAGE FOR MPY ROUTINE
	DCA	AC2
	TAD	ACH	/IS FAC=0?
	SNA	CLA
	DCA	ACX	/YES-ZERO EXPONENT
	JMS	MP24	/NO-MULTIPLY FAC BY LOW ORDER OPR.
	TAD	OPH	/NOW MULTIPLY FAC BY HI ORDER MULTIPLIER
	DCA	OPL
	JMS	MP24
	TAD	AC2	/STORE RESULT BACK IN FAC
RTZRO,	DCA	ACLO	/LOW ORDER
	TAD	DV24	/HIGH ORDER
	DCA	ACH
	TAD	ACH	/DO WE NEED TO NORMALIZE?
	RAL
	SMA	CLA
	JMP	SHLFT	/YES-DO IT FAST
MDONE,	DCA	AC1	/NO-ZERO OVERFLOW WD(DO I NEED THIS???)
	ISZ	FFMPY	/BUMP RETURN POINTER
	ISZ	TM	/SHOULD RESULT BE NEGATIVE?
	JMP I	FFMPY	/NOPE-RETN.
	JMS I	FFNEGR	/YES-NEGATE IT
	JMP I	FFMPY	/RETURN
SHLFT,	CMA		/SUBTRACT 1 FROM EXP.
	TAD	ACX
	DCA	ACX
	JMS I	AL1PTR	/SHIFT FAC LEFT 1 BIT
	JMP	MDONE+1	/DONE.
AL1PTR,	AL1
/
/24 BIT BY 12 BIT MULTIPLY.  MULTIPLIER IS IN OPL
/MULTIPLICAND IS IN ACH AND ACLO
/RESULT LEFT IN DV24,AC2, AND AC1
MP24,	0
	TAD	KKM12	/SET UP 12 BIT COUNTER
	DCA	OPX
	TAD	OPL	/IS MULTIPLIER=0?
	SZA
	JMP	MPLP1	/NO-GO ON
	DCA	AC1	/YES-INSURE RESULT=0
	JMP I	MP24	/RETURN
MPLP,	TAD	OPL	/SHIFT A BIT OUT OF LOW ORDER
MPLP1,	RAR		/OF MULTIPLIER AND INTO LINK
	DCA	OPL
	SNL		/WAS IT A 1?
	JMP	MPLP2	/NO-0-JUST SHIFT PARTIAL PRODUCT
	CLL		/YES-ADD MULTIPLICAND TO PARTIAL PRODUCT
	TAD	AC2
	TAD	ACLO	/LOW ORDER
	DCA	AC2
	RAL		/PROPAGATE CARRY
	TAD	ACH	/HI ORDER
MPLP2,	TAD	DV24
	RAR		/NOW SHIFT PARTIAL PROD. RIGHT 1 BIT
	DCA	DV24
	TAD	AC2
	RAR
	DCA	AC2
	RAR		/1 BIT OF OVERFLOW TO AC1
	DCA	AC1
	ISZ	OPX	/DONE ALL 12 MULTIPLIER BITS?
	JMP	MPLP	/NO-GO ON
	JMP I	MP24	/YES-RETURN
/
/PART OF DIVIDE ROUTINE-FFDIV MUST BE AT LOC. 6722
MP12L,	DCA	OPL	/STORE BACK MULTIPLIET
	TAD	AC2	/GET PRODUCT SO FAR
	SNL		/WAS MULTIPLIER BIT A 1?
	JMP	.+3	/NO-JUST SHIFT THE PARTIAL PRODUCT
	CLL		/YES-CLEAR LINK AND ADD MULTIPLICAND
	TAD	ACLO	/TO PARTIAL PRODUCT
	RAR		/SHIFT PARTIAL PRODUCT-THIS IS HI ORDER
	DCA	AC2	/RESULT-STORE BACK
DVLP1,	TAD	OPL	/SHIFT A BIT OUT OF MULTIPLIER
	RAR		/AND A BIT OR RESLT. INTO IT (LO ORD. PROD.)
	ISZ	FFMPY	/DONE ALL BITS?
	JMP	MP12L	/NO-LOOP BACK
	CLL CMA IAC	/YES-LOW ORDER PROD. OF QUOT. X OPL IN AC
	DCA	ACLO	/NEGATE AND STORE
	CML	RAL	/PROPAGATE CARRY
	JMP I	FD1P	/GO ON
FD1P,	FD1	/POINTER TO REST OF DIVIDE ROUTINE
/
/FLOATING DIVIDE ROUTINE
/USES THE METHOD OF TRIAL DIVISION BY HI ORDER
FFDIV,	0		/(USED AS A TEM. BY I/O ROUTINES)
	SNA		/WHICH MODE OF CALL?
	TAD I	FFDIV	/CALLED BY USER-GET ARG. ADDR.
	JMS I	MDSETK	/GO SET UP FOR DIVIDE-OPX IN AC ON RETN.
FFD1,	CMA	IAC	/NEGATE EXP. OF OPERAND
	TAD	ACX	/ADD EXP OF FAC
	DCA	ACX	/STORE AS FINAL EXPONENT
	TAD	OPH	/NEGATE HI ORDER OP. FOR USE
	CLL CMA IAC	/AS DIVISOR
	DCA	OPH
	JMS	DV24	/CALL DIV.--(ACH+ACLO)/OPH
	TAD	ACLO	/SAVE QUOT. FOR LATER
	DCA	AC1
	TAD	KM13	/SET COUNTER FOR 12 BIT MULTIPLY
	DCA	FFMPY	/TO MULTIPLY QUOT. OF DIV. BY 
	JMP	DVLP1	/LOW ORDER OF OPERAND (OPL)
/
/END OF FLOATING DIVIDE-FUDGE SOME
/STUFF THEN JUMP INTO MULTIPLY
/
FDDON,	TAD	FFDIV	/STORE RETN. ADDR. IN MULT ROUTINE
	DCA	FFMPY
	JMP	MDONE	/GO CLEAN UP
/
/DIVIDE ROUTINE--24 BITS IN ACH,ACLO ARE DIVIDED BY 12 BITS
/IN OPH.  OPH IS ASSUMEN NEGATIVE AND .GT. ACH IN ABSOLUTE VALUE
/ELSE-DIVIDE OVERFLOW--WE RETURN NORMALLY WITH QUOTIENT
/IN ACLO AND REM. IN ACH.  (AC2=0 ON RETN.)
/
DV24,	0
	TAD	ACH	/CHECK THAT DIVISOR IS .GT. DIVIDEND
	TAD	OPH	/DIVISOR IN OPH (NEGATIVE)
	SZL	CLA	/IS IT?
	JMP I	DVOVR	/NO-DIVIDE OVERFLOW
	TAD	KM13	/YES-SET UP 12 BIT LOOP
	DCA	AC2
	JMP	DV1	/GO BEGIN DIVIDE
DV2,	TAD	ACH	/CONTINUE SHIFT OF FAC LEFT
	RAL
	DCA	ACH	/RESTORE HI ORDER
	TAD	ACH	/NOW SUBTRACT DIVISOR FROM HI ORDER
	TAD	OPH	/DIVIDEND
	SZL		/GOOD SUBTRACT?
	DCA	ACH	/YES-RESTORE HI DIVIDEND
	CLA		/NO-DON'T RESTORE--OPH.GT.ACH
DV1,	TAD	ACLO	/SHIFT FAC LEFT 1 BIT-ALSO SHIFT
	RAL		/1 BIT OF QUOT. INTO LOW ORD OF ACLO
	DCA	ACLO
	ISZ	AC2	/DONE 12 BITS OF QUOT?
	JMP	DV2	/NO-GO ON
	JMP I	DV24	/YES-RETN W/AC2=0
FFNEGR,	FFNEG
MDSETK,	MDSET
KKM12,	-14
KM13,	-15
DVOVR,	FTRP2

*FLPT-400
/
/FLOATING ADD
/
FFADD,	0
	SNA		/WHICH MODE FO CALL?
	TAD I	FFADD	/CALLED BY USER-GET ADDR. OF OPR.
	JMS I	ARGETP	/PICK UP OPERAND
FAD1,	JMS I	CDFCRP	/CHANGE TO FIELD OF PACKAGE
	TAD	OPH	/IS OPERAND = 0
	SNA	CLA
	JMP	DONA	/YES-DONE
	TAD	ACH	/NO-IS FAC=0?
	SNA	CLA
	JMP	DOADD	/YES-DO ADD
	TAD	ACX	/NO-DO EXPONENT CALCULATION
	CLL CMA IAC
	TAD	OPX
	SMA	SZA	/WHICH EXP. GREATER?
	JMP	FACR	/OPERANDS-SHIFT FAC
	CMA	IAC	/FAC'S-SHIFT OPERAND=DIFFRNCE+1
	JMS	OPSR
	JMS	ACSR	/SHIFT FAC ONE PLACE RIGHT
DOADD,	TAD	OPX	/SET EXPONENT OF RESULT
	DCA	ACX
	JMS	OADD	/DO THE ADDITION
	JMS I	FNORP	/NORMALIE RESULT
DONA,	ISZ	FFADD	/BUMP RETURN
	JMP I	FFADD	/RETURN
FACR,	JMS 	ACSR	/SHIFT FAC = DIFF.+1
	JMS	OPSR	/SHIFT OPR. 1 PLACE
	JMP	DOADD	/DO ADDITION
/
/OPERAND SHIFT RIGHT-ENTER WITH POSITIVE COUNT-1
/IN AC
OPSR,	0
	CMA		/- (COUNT+1) TO SHIFT COUNTER
	DCA	AC0
LOP2,	TAD	OPH	/GET SIGN BIT
	RAL		/TO LINK
	CLA
	TAD	OPH	/GET HI MANTISSA
	RAR		/SHIFT IT RIGHT, PROPAGATING SIGN
	DCA	OPH	/STORE BACK
	TAD	OPL
	RAR
	DCA	OPL	/STORE LO ORDER BACK
	RAR		/SAVE 1 BIT OF OVERFLOW
	DCA	AC2	/IN AC2
	ISZ	OPX	/INCREMENT EXPONENT
NOP2,	NOP	
	ISZ	AC0	/DONE ALL SHIFTS?
	JMP	LOP2	/NO-LOOP
	JMP I	OPSR	/YES-RETN.
/
/SHIFT FAC LEFT 1 BIT
/
AL1,	0
	TAD	AC1	/GET OVERFLOW BIT
	CLL	RAL	/SHIFT LEFT
	DCA	AC1	/STORE BACK
	TAD	ACLO	/GET LOW ORDER MANTISSA
	RAL		/SHIFT LEFT
	DCA	ACLO	/STORE BACK
	TAD	ACH	/GET HI ORDER
	RAL
	DCA	ACH	/STORE BACK
	JMP I	AL1	/RETN.
/
/SHIFT FAC RIGHT-ENTER WITH COUNT-1 IN AC (POSITIVE)
/
ACSR,	0
	CMA	/AC CONTAINS COUNT-1
	DCA	AC0	/STORE COUNT
LOP1,	TAD	ACH	/GET SIGN BIT OF MANTISSA
	RAL		/SET UP SIGN PROPAGATION
	CLA
	TAD	ACH	/GET HIGH ORDER MANTISSA
	RAR		/SHIFT RIGHT`1, PROPAGATING SIGN
	DCA	ACH	/STORE BACK
	TAD	ACLO	/GET LOW ORDER
	RAR		/SHIFT IT
	DCA	ACLO	/STORE BACK
	RAR
	DCA	AC1	/SAVE 1 BIT OF OVERFLOW
	ISZ	ACX	/INCREMENT EXPONENT
NOP1,	NOP
	ISZ	AC0	/DONE?
	JMP	LOP1	/NO-LOOP
	JMP I	ACSR	/YES-RETN-AC=L=0
/
/DIVIDE OVERFLOW-ZERO ACX,ACH,ACLO
/
DBAD,	CLA	CLL	/NECESSARY SO WE DON'T GET OVRFLO AGAIN
	JMP I	DBAD1P	/GO ZERO ALL
/
/FLOATING SUBTRACT
/
FFSUB,	0
	SNA		/WHICH MODE OF CALL?
	TAD I	FFSUB	/CALLED BY USER-GET ADDR. OF OP
	JMS I	ARGETP	/PICK UO THE OP.
	JMS	OPNEG	/NEGATE OPERAND
	TAD	FFSUB	/JMP INTO FLTG. ADD
SUB0,	DCA	FFADD	/AFTER SETTING UP RETURN
	JMP	FAD1
ARGETP,	ARGET

/
/FLOATING HALT-DISPLAY FLOATING P.C.
/
FFHLT,	JMS I	CDFCRP	/MUST BE DATA FIELD OF PACKAGE
	TAD I	FPP	/GET THE P.C.
	HLT
	CLA		/CLR IT OUT
	JMP I	FPNXT	/DONE-GET NEXT INSTR.
/
/FLOATING NEGATE
/
FFNEG,	0		/(USED AS A TEM. BY OUTPUT ROUTINE)
	TAD	ACLO	/GET LOW ORDER FAC
	CLL CMA IAC	/NEGATE IT
	DCA	ACLO	/STORE BACK
	CML	RAL	/ADJUST OVERFLOW BIT AND
	TAD	ACH	/PROPAGATE CARRY-GET HI ORD
	CLL CMA IAC	/NEGATE IT
	DCA	ACH	/STORE BACK
	JMP I	FFNEG
/
/NEGATE OPERAND
/
OPNEG,	0
	TAD	OPL	/GET LOW ORDER
	CLL CMA IAC	/NEGATE AND STORE BACK
	DCA	OPL
	CML	RAL	/PROPAGATE CARRY
	TAD	OPH	/GET HI ORDER
	CLL CMA IAC	/NEGATE AND STORE BACK
	DCA	OPH
	JMP I	OPNEG
/
/ADD OPERAND TO FAC
/
OADD,	0
	CLL
	TAD	AC2	/ADD OVERFLOW WORDS
	TAD	AC1
	DCA	AC1
	RAL		/ROTATE CARRY
	TAD	OPL	/ADD LOW ORDER MANTISSAS
	TAD	ACLO
	DCA	ACLO
	RAL
	TAD	OPH	/ADD HI ORDER MANTISSAS
	TAD	ACH
	DCA	ACH
	JMP I	OADD	/RETN.
DBAD1P,	DBAD1
CDFCRP,	CDFCUR
FNORP,	FFNOR
*FLPT-200
/
/ROUTINE TO CALL EXTENDED FUNCTIONS
/THIS IS AN EXTENSION OF OP CODE 0
/
FCALL,	TAD	OPH	/FCALL-GET FUNCTION # (=ADDR SINCE
	TAD	JMSI2	/PAGE ZERO)-MAKE A JMS THRU TABLE
	DCA	DCOD1	/STORE IT
	JMS	CDFCUR	/D.F. MUST BE FIELD OF PACKAGE
	TAD I	FPP	/GET AND SAVE FLTG. P.C.
	DCA	FT1
	TAD I	DFCDFP	/GET AND SAVE FLTG. D.F. AND I.F.
	DCA	FT2
	TAD I	FPNXT
	DCA	FT3
DCOD1,	0		/CALL THE SUBROUTINE
	CLA
	JMS	CDFCUR	/CHANGE TO D.F. OF PACKAGE
	TAD	FT3	/RESTORE FLTG. PC,IF,DF
	DCA I	FPNXT
	TAD	FT2
	DCA I	DFCDFP
	TAD	FT1
FJUMP1,	DCA I	FPP
	JMP I	FPNXT	/GET NEXT INSTR.
/
/CONTINUATION OF NORMALIZE ROUTINE
/
FFNORR,	DCA	AC1	/DONE W/NORMALIZE-CLEAR AC1
	JMP I	FFNOR	/RETURN
AL1P,	AL1
JMPIC,	JMP I	CDFCUR
DFCDFP,	DFCDF
JMSI2,	JMS I	TABLE2-1
TABLE2,	FFSQ		/SQUARE=1
	FROOT		/SQUARE ROOT=2
	FFSIN		/SIN=3
	FFCOS		/COS=4
	FFATN		/ARCTANGENT=5
	FFEXP		/EXPONENTIAL=6
	FFLOG		/LOGARITHM=7
	FFNEG		/NEGATE=10
	FFIN		/INPUT=11
	FFOUT		/OUTPUT=12
	FFIX		/FIX=13
	FFLOAT		/FLOAT=14
	DCOD1		/NOP=15
	DCOD1		/NOP=16
	DCOD1		/NOP=17

/
/ARGUMENT PICK UP ROUTINE-ENTER WITH DATA FIELD SET TO EITHER
/FLTG. DATA FIELD OR FLTG. INSTR. FIELD.
/ADDRESS OF OPERAND IS IN THE AC ON ENTRY.
/ON RETURN, THE`AC IS CLEAR
/
ARGET,	0
	DCA	AC2	/STORE ADDRESS OF OPERAND
	TAD I	AC2	/PICK UP EXPONENT
	DCA	OPX
	ISZ	AC2	/MOVE POINTER TO HI MANTISSA WD
	TAD I	AC2	/PICK IT UP
	DCA	OPH	/STORE
	ISZ	AC2	/MOVE PTR. TO LO MANTISSA WD.
	TAD I	AC2	/PICK IT UP
	DCA	OPL	/STORE IT
	JMP I	ARGET	/RETURN
DVOP2P,	DVOP2
/
/ROUTINE TO NORMALIZE THE FAC
/
FFNOR,	0
	TAD	ACH	/GET THE HI ORDER MANTISSA
	SNA		/ZERO?
	TAD	ACLO	/YES-HOW ABOUT LOW?
	SNA
	TAD	AC1	/LOW=0, IS OVRFLO BIT ON?
	SNA	CLA
	JMP	ZEXP	/#=0-ZERO EXPONENT
NORMLP,	CLA CLL CML RTR	/NOT 0-MAKE A 2000 IN AC
	TAD	ACH	/ADD HI ORDER MANTISSA
	SZA		/HI ORDER = 6000
	JMP	.+3	/NO-CHECK LEFT MOST DIGIT
	TAD	ACLO	/YES-6000 OK IF LOW=0
	SZA	CLA	
	SPA	CLA	/2,3,4,5,ARE LEGAL LEFT MOST DIGS.
	JMP	FFNORR	/FOR NORMALIZED #-(+2000=4,5,6,7)
	JMP	FNLP	/JUMP SO FFGET AND PUT ARE ORGED RIGHT
/
/FLOATING GET
/
FFGET,	0
	SNA		/WHICH MODE OF CALL
	TAD I	FFGET	/CALLED BY USER-GET ADDR. OF OP
	JMS	ARGET	/PICK UP OPERAND
	TAD	OPX
	DCA	ACX	/LOAD THE OPERAND INTO FAC
	TAD	OPL
	DCA	ACLO
	TAD	OPH
	DCA	ACH
	ISZ	FFGET
	JMP I	FFGET	/RETN. TO CALL +2
/
/FLOATING PUT
/
FFPUT,	0
	SNA		/WHICH MODE OF CALL?
	TAD I	FFPUT	/CALLED BY USER-GET OPR. ADDR
	DCA	FFGET	/STORE IN A TEMP
	TAD	ACX	/GET FAC AND STORE IT
	DCA I	FFGET	/AT SPECIFIED ADDRESS
	ISZ	FFGET
	TAD	ACH
	DCA I	FFGET
	ISZ	FFGET
	TAD	ACLO
	DCA I	FFGET
	ISZ	FFPUT	/BUMP RETN.
	JMP I	FFPUT	/RETN. TO CALL+2
/
/ROUTINE TO ADJUST QUOTINET OF FIRST DIVIDE (MAYBE) WHEN THE
/REMAINDER OF THE FIRST`DIVIDE IS LESS THAN QUOT*OPL
/USED BY FLTG. DIVIDE ROUTINE
/
DVOPS,	CMA	IAC	/NEGATE AND STORE REVISED REMAINDER
	DCA	ACH	
	CLL
	TAD	OPH
	TAD	ACH	/WATCH FOR OVERFLOW
	SNL
	JMP	DVOP1	/OVERFLOW-DON'T ADJUST QUOT. OF 1ST DIV.
	DCA	ACH	/NO OVERFLOW-STORE NEW REM.
	CMA		/SUBTRACT 1 FROM QUOT OF
	TAD	AC1	/FIRST DIVIDE
	DCA	AC1
DVOP1,	CLA 	CLL
	TAD	ACH	/GET HI ORD OF REMAINDER
	JMP I	DVOP2P	/GO ON

/
/CHANGE TO DATA FIELD OF FLTG. PT. PKG.
/AFTER FIRST TIME THRU, ROUTINE LOOKS LIKE
/
/	CDFCUR,	0
/		CDF	N	/N IS FLD OF PKG.
/		JMP I	CDFCUR
/		(NEXT 8 LOCS. FREE FOR TEMPS)
/
CDFCUR,	0
CCUR1,	RIF		/READ INST. FIELD
CCUR2,	TAD	TM	/ADD A CDF 0 INST
	DCA	CCUR1	/STORE IT, MODIFYING SUBR.
	TAD	JMPIC	/STORE A SUBR. RETN
	DCA	CCUR2	/ALL DONE
/
/NECESSARY CONSTANTS
/
	7100
FT2,	7076
FT3,	7650
FT1,	2262
	5357

FNLP,	CLL CML CMA	/-1
	TAD	ACX	/SUBTR. 1 FROM EXPONENT
	DCA	ACX
	JMS I	AL1P	/SHIFT FAC LEFT 1
	JMP	NORMLP	/GO BACK AND SEE IF NORMALIZED
ZEXP,	DCA	ACX
	JMP	FFNORR
/
/BEGINNING OF INTERPRETER
/
*FLPT
FPT,	0
L7600,	7600		/CLA
	RDF		/READ DATA FIELD-THIS WILL BE
	TAD	KCDF0	/INITIAL FLTG. DATA AND INSTR. FLD
	DCA	FPNEXT	/STORE CDF TO FLTG. INST. FLD
FFSW0,	TAD	FFSB0	/INLINE IN INTERPRETER--SET FLOATING SWITCH
	DCA	TSUB	/TO 0
	TAD	FFDV0
	DCA	TDIV
	TAD	FPNEXT
SFDF,	DCA	DFCDF
FPNEXT,	0		/BECOMES CDF TO FLTG. INST FLD.
	TAD I	FPT	/GET NEXT FLTG. PT. INSTR.
	DCA	OPX	/STORE IN A TEMPORARY
	TAD	OPX	/GET IT BACK AND PICK OFF
	AND	K177	/THE ADDRESS
	DCA	OPH	/STORE THAT AWAY
	TAD	OPX	/PICK OFF THE PAGE BIT
	AND	K200	/AND MAKE A 7600 IF CURRENT PAGE
	CMA	IAC	/OR 0 IF PAGE ZERO
K200,	AND	FPT	/THIS SETS UP HI ORDER 5 BITS OF ADDR.
	ISZ	FPT	/INCREMENT FLTG. P.C.
	TAD	OPH	/ADD IN LOW ORDER 7 BITS OF ADDR
	DCA	OPH	/THIS IS FINAL ADDR UNLESS IDIRECT.
	TAD	OPX	/NOW DECODE THE OP CODE
	CLL	RTL
	RTL
	AND	K7	/PICK OFF OP CODE BITS
	TAD	JMSI	/AND MAKE A JMS THRU TABLE
	DCA	DCOD	/STORE IT FOR LATET
	TAD	OPH	/GET ADDRESS INTO AC
	SNL		/INDIRECT BIT IN LINK-IS IT ON?
	JMP	DCOD	/NO-CALL THE PROPER ROUTINE
	AND	K7770	/YES-IS ADDR AN AUTO INDEX REG.?
	TAD	K7770
	SNA	CLA	
	TAD	K3	/YES-ADD 3 TO XREG. BEFORE USING
	TAD I	OPH	/THE ADDR.
	DCA I	OPH
	TAD I	OPH	/GET EFF. ADDR.INTO AC FOR CALL
DFCDF,	0		/CHANGE TO FLTG. D.F.-INDIREDT ADDRESSING
DCOD,	0		/CALL SUBRS. WITH ADDR IN AC-D.F.IS
			/SET TO FLTG. D.F. OR I.F.-RETN. IS 
			/TO CALL+2
FNRM,	JMS I	FFNORP	/NORMALIZE ROUTINE-CALL NORM SUBR.
	JMP	FPNEXT	/GO GET NEXT INSTR.
/
/TABLE FOR JUMPS
/
JMSI,	JMS I	TABLE
TABLE,	FFJMP		/FLOATING JMP OP CODE 0
	FFADD		/    "    ADD   "  1
TSUB,	FFSUB		/    "    SUBTRACT 2
TMPY,	FFMPY		/    "    MULTIPLY 3
TDIV,	FFDIV		/    "    DIVIDE   4
	FFGET		/    "    GET   "  5
	FFPUT		/    "    PUT   "  6
	FFJMS		/    "    JMS   "  7
/
/CONSTANTS AND POINTERS
/
K177,	177
FCALLP,	FCALL
KCDF0,	CDF	0
K7770,	7770
FFNORP,	FFNOR
/
/FLOATING JUMP-CHECK FOR FCALL OR FISZ
/
FFJMP,	0
	SNA		/IS IT FEXT?
	JMP	EXIT	/YES-LEAVE INTERPRETER
	DCA	OPH	/NO-STORE ADDR.
	TAD	OPX	/ARE INDIRECT AND PAGE BITS=0
	AND	L7600	/(WORKS SINCE OP`CODE=0)
	SZA	CLA
	JMP	FJUMP	/NO-IT IS FJUMP-EFF. ADR. IN OPH
	TAD	OPX	/YES-ARE BITS 5-7=0?
	AND	K160	/(ANY ON=FISZ)
	SNA	CLA
	JMP I	FCALLP	/FLOATING CALL-DO IT
FFISZ,	ISZ I	OPX	/FISZ-ISZ THAT ADDR (DF=FLTG. IF)
	JMP	FPNEXT	/NO-SKIP-GO GET NEXT INST.
FISZ1,	ISZ	FPT	/SKIP-INCREMENT FLTG. P.C.
	JMP	FPNEXT	/GO ON
K160,	160
/
/FEXT-LEAVE INTERPRETER
/
EXIT,	CLA CLL CML RTL	/MAKE A CDF CIF TO FLTG. INST FLD.
	TAD	FPNEXT
	DCA	.+1	/STORE IT
	0
	JMP I	FPT	/GO BACK TO USER,AC=L=0
/
/FLOATING JMS-IF BITS    3-11=0 = NORMALIZE FAC (FNOR)
/		  "      3-4 =0 = DECODE FURTHER BY BITS 9-11
/		  "	 9-11=0 = SKIP ON CONDITION OF FAC
/		  "  	     =1 = FCDF (BITS 6-8=NEW FLTG. D.F.)
/		  "          =2 = FSW0
/		  "          =3 = FSW1
/		  "          =4 = FHLT-DISPLAY FLTG. PC
/		  "          =5-7 NOP
/
FFJMS,	0
	SNA		/IS IT NORMALIZE?
	JMP	FNRM	/YEAH-DO IT
	DCA	OPH	/NO-STORE EFF ADDR.
	TAD	OPX	/GET THE INSTR.
	AND	K600	/INDIRECT AND PAGE BITS=0?
	SNA	CLA
	JMP I	JSKPP	/YES-GO DECODE FURTHER
	TAD	FPNEXT	/NO-ITS JMS-GET CDF TO FLTG. I.F.
	DCA	.+1	/STORE IT
IFCDF,	0		/EXECUTE IT
	TAD	FPT	/GET THE FLTG. P.C.
	DCA I	OPH	/TORE IT AT THE EFF.ADDR.
	TAD	OPH	/GET THE EFF. ADDR.
	DCA	FPT	/STORE IN`FLTG. PC.
	JMP	FISZ1	/GO INCREMENT FLTG. PC
JSKPP,	JSKP
FFDV0,	FFDIV
FFSB0,	FFSUB
K3,	3
K7,	7
K600,	600
/
/FLOATING SKIP-ADD 600 TO THE INSTRUCTION TO MAKE IT
/A SKIP WITH CLA--THE SKIP PRODUCED IS THE REVERSE OF
/WHAT IS EXPECTED  (SNA NOT SZA) TO FACILITATE THE
/DECODING
/
FFSKP,	TAD	K600	/ADD 600 TO MAKE A SKP WITH CLA
	TAD	OPX	/ADD IN ORIG INSTR
	DCA	.+2
	TAD	ACH	/GET HI ORDER MANTISSA IN FAC FOR SENSING
	0		/EXECUTE THE SKIP WE MADE
	ISZ	FPT	/NO SKIP=SKIP-BUMP FLTG.PC
	JMP	FPNEXT	/SKIP=NO SKIP-LEAVE PC ALONE-GO ON

/
/FLOATING JUMP-STORE EFF. ADDR IN FLTG.PC
/
FJUMP,	TAD	OPH	/GET EFF ADDR OF JUMP
	DCA	FPT	/STORE IN FLTG. PC
	JMP	FPNEXT	/GO ON
/
/FCDF-BITS 6-8 ARE NEW FLTG. DATA FIELD
/
FFCDF,	CLA	CMA	/SUBTRACT 1 FROM EFF. ADDR.
	TAD	OPH	/ADD IN FIELD BITS
	TAD	KCDF0	/ADD IN CDF INSTR.
	JMP	SFDF	/GO SOTER CDF TO FLTG DF.

*FPT+164
/
/FSQUARE-SQUARE FAC-CALLS MULTIPLY TO MUL. FAC BY ITSELF
/
FFSQ,	0
	JMS I	TMPY	/CALL MULTIPLY TO MULTIPLY
	ACX		/FAC BY ITSELF
	JMP I	FFSQ	/DONE
/
/FLOATING TRAPS TO USER-INITIALLY SET TO NOPS
/
FTRP1,	JMP I	FTRAP1	/OVERFLOW
FTRP2,	JMP I	FTRAP2	/DIV. ERR.
FTRP3,	JMP I	FTRAP3	/ILL. FUNCT. ARG.
FTRP4,	JMP I	FTRAP4	/UNDERFLOW
FTRAP1,	FTRPRT
FTRAP2,	DBAD
FTRAP3,	LTRPRT
FTRAP4,	DCOD1+1
$