File: RTFPP.PA of Tape: Sources/RTS/s3
(Source file text) 

/FPP INTERPRETER TASK
/EAE FLOATING POINT INTERPRETER
/FOR PDP8/E WITH KE8-E EAE

/W.J. CLOGHER, R.LARY, MODIFIED BY W.V.D. MARK FOR RTS8
/FILENAME: RTFPP.PA

CUR=	10

AC7775=	STA CLL RTL
AC7776=	STA CLL RAL
AC4000=	CLA STL RAR
AC3777=	STA CLL RAR
AC2000=	CLA STL RTR
AC0002=	CLA STL RTL

/DEFINITIONS OF KE-8/E INSTRUCTIONS

MQL=	7421
MQA=	7501
CAM=	CLA MQL
SWP=	MQA MQL
SWAB=	7431
SCA=	7441
MUY=	7405
DVI=	7407
NMI=	7411
SHL=	7413
ASR=	7415
LSR=	7417
ACS=	7403
SAM=	7457
DAD=	7443
DLD=	7663
DST=	7445
DPIC=	7573
DCM=	7575
DPSZ=	7451
SGT=	6006

/FPP OPCODES:

FLDA=	0000
FADD=	1000
FSUB=	2000
FDIV=	3000
FMUL=	4000
FADDM=	5000
FSTA=	6000
FMULM=	7000
		LONG=	400	/TWO-WORD ADDRESSING
		BASE=	200	/BASEPAGE ADDRESSING
		IND=	600	/INDIRECT ADDRESSING

FEXIT=	0000
FNORM=	0004
STARTF=	0005
STARTD=	0006
JAC=	0007
XTA=	0030
STARTE=	0050
LDX=	0100

JA=	1030
JNE=	1040
TRAP3=	3000
	*100
T,	0	/TEMPORARY
DFLG,	0	/0 = F.P., 1 = D.P.
FPNXT,	ICYCLE		/USED AS INTERPRETER ADDRESS IF NO FPP
OPCODE,	0		/CHUNKS OF INSTRUCTION
AUTO,	0
INDX,	0
PCHI,	0		/UPPER 3 BITS OF ADRESSES
BASHI,	0
XRHI,	0
ADRHI,	0
DFCUR,	0
DFREL,	0
/FPP PARAMETER TABLE LOCATIONS:

AC0,	0
AC1,	0		/FLOATING AC OVERFLOW WORD
AC2,	0		/OPERAND OVFLOW WORD
OPL,	0
OPH,	0		/*** FLOATING OPERAND REGISTER ***
OPX,	0
EAC3,	0
EAC2,	0		/** FOR EXTENDED PRECISION OPTION **
EAC1,	0
ACL,	0
ACH,	0		/*** FLOATING ACCUMULATOR ***
ACX,	0
ADR,	0
BASADR,	0		/FPP BASE PAGE ADDRESS
XRBASE,	0		/FPP INDEX REGISTER ARRAY ADDRESS
PC,	0		/FPP PROGRAM COUNTER
APT,	0		/VARIOUS FIELD BITS FOR FPP

	PAGE

/MAIN INTERPRETER LOOP

NEGFAC,	DLD		/DO IT THE QUICK WAY
		ACL
	DCM
	DST
		ACL
ICYCLE,	CLA CLL
	JMS I	(FETPC	/GET INST
	SWAB		/ALL IN MODE B
	MQA		/'SWAB' DID 'MQL'
	DCA	INST
	SHL		/DECODE INST IN MQ
		3
	DCA	OPCODE	/0-2 = OPCODE
	SHL
		2
	TAD	CODJMP	/3-4 = WORD MODE
	DCA	JMPCOD	/BUILD JMP
	SHL
		1
	DCA	AUTO	/5 = AUTO-INDEX
	SHL
		3
	DCA	INDX	/6-8 = USUALLY INDEX REGISTER
	SHL
		3
	DCA	ADRHI	/9-12 = USUALLY UPPER ADRESS
JMPCOD,	HLT		/JUMP TO - LNK=0,MQ=0
CODLST,	SPECAL		/SPECIAL INSTRUCTIONS
	BPAGE		/BASE PAGE ADRESSING
	LONGI		/TWO WORD ADRESSING
	BPAGEI		/INDIRECT ADRESSING
CODJMP,	JMP I	CODLST
BPAGE,	TAD	DFLG	/CHECK IF DOUBLE INTEGER MODE
	SMA SZA CLA
	STL		/YES - ADD 1 TO ADRESS
	TAD	INST
	RAL
	TAD	INST	/MULTIPLY BASE OFFSET BY 3
	TAD	(200	/ELIMINATE ANY
	AND	(777	/HIGH ORDER BITS
	TAD	BASADR	/ADD IN BASE PAGE ORIGIN
	DCA	ADR
	TAD	BASHI
OPJMPI,	JMS I	(SETDF	/CDF TO BASE PAGE FIELD
	TAD	OPCODE
	TAD	BASJMP	/BUILD JUMP
	DCA	OPJMP
OPJMP,	HLT		/JMP I EXECUTION ROUTINE
BASJMP,	JMP I	FFJMPS

BPAGEI,	TAD	ADRHI
	CLL CML RAL
	TAD	ADRHI	/FORM 3*OFFSET+1
	TAD	BASADR
	DCA	ADR
	TAD	BASHI
	JMS I	(SETDF	/FORM PROPER CDF
	TAD I	ADR	/GET FIELD BITS OF REAL ADDRESS
	AND	(7
	DCA	ADRHI	/FROM 2D WORD OF BASE PAGE LOC
	ISZ	ADR
	SKP
	JMS I	(DFBUMP	/WATCH FOR FIELD OVERFLOW
	TAD I	ADR	/GET LOW-ORDER ADDRESS FROM 3D WORD
			/NOW GO DO INDEXING (IF ANY)

INDEX,	DCA	ADR
	TAD	INDX
	SNA		/IS XR NUMBER 0?
	JMP	NOINDX	/YES - NO INDEXING
	JMS	DCDIDX	/GET XR VALUE (MAYBE INCREMENTED)
	AC7775
	TAD	DFLG	/GET -3 IF F, -2 IF D, -6 IF E MODE
	DCA	DCDIDX
XRADLP,	CLL
	TAD	ADR
	TAD I	T
	SZL
	ISZ	ADRHI
	ISZ	DCDIDX	/ADD THE XR IN THE PROPER NUMBER OF TIMES
	JMP	XRADLP
	DCA	ADR	/IF LNK SET INC FIELD
NOINDX,	CLL
	TAD	ADRHI
	JMP	OPJMPI
LONGI,	JMS I	(FETPC	/NEXT INST WORD CONTAINS LOW-ORDER ADDRESS
	JMP	INDEX

DCDIDX,	0
	JMS I	(SETXR	/ADD IN BASE ADDRESS OF XR ARRAY
	TAD I	T	/T SET BY SETXR
	TAD	AUTO	/INCREMENT BIT ON?
	DCA I	T	/YES - BUMP XR
	JMP I	DCDIDX

FFJMPS,	FFGET		/FOR F,D AND E MODE
	FFADD
	FFSUB
	FFDIV
	FFMPY
	FFADM
	FFPUT
	FFMPM

INST,	0

	PAGE
/MORE I CYCLE

SPECAL,	TAD	OPCODE
	TAD	AUTO
	SNA CLA
	JMP	XROPR	/GO TO XR OR OPERATE CLASS
	JMS I	(FETPC
	DCA	ADR	/DOUBLE WORD SPECIAL
	TAD	OPCODE
	TAD	SPCJMP
	DCA	.+1
	HLT
SPCJMP,	JMP I	SPCLST
SPCLST,	LDADX
	JUMPS
	JXN
	TRAP3I
	TRAP4I
	TRAP5I
	TRAP6I
	TRAP7I

XROPR,	TAD	INDX
	SNA
	JMP	OPRT	/GO TO OPERATES
	TAD	XRJMP
	DCA	XRGO
	TAD	ADRHI	/HERE ADRHI IS INDEX
	JMS	SETXR	/SET 'T' AND FIELD
XRGO,	HLT
XRJMP,	JMP I	XRLST-1	/NO INDEX=0 HERE
XRLST,	ALN
	ATX
	FPXTA
	ICYCLE
	STRTE
	ICYCLE
	ICYCLE
OPRT,	TAD	ADRHI	/HERE ADRHI IS SUB OPCODE
	TAD	OPRJMP
	DCA	.+1
	HLT
OPRJMP,	JMP I	OPRLST
JEXTRA,	TAD	MIN4
	TAD	INDX	/0-3 SUB CODE VALID
	SMA
	CLA		/EXIT ON ERROR
	JMP	OPRT+1
MIN4,	-4

	SETX
	SETB
	JSA
	JSR
OPRLST,	EXIT
	FPAUSE
	CLFAC
	NEGFAC
	NRMFAC
	STRTF
	STRTD
	FPJAC

/JUMP DECODER

JUMPS,	TAD	AUTO
	SZA CLA		/IF NOT COND. JUMP, DECODE FURTHER
	JMP	JEXTRA
	TAD	INDX
	TAD	SKPTBL
	DCA	T	/INDEX INTO CONDITIONAL SKIP TABLE
	TAD I	T
	DCA	CNDSKP
	TAD	ACH
	SZA
	JMP	CNDSKP
	TAD	ACL
	SZA CLA		/IF HIGH ORDER ZERO, AC MIGHT BE UNNORMALIZED.
	IAC		/USE LOW ORDER ON 0/NOT 0 BASIS
CNDSKP,	HLT		/TEST AC
	JMP I	FPNXT	/FAILED - DON'T JUMP
	JMP	DOJMP

SKPTBL,	CNDSKT
CNDSKT,	SZA CLA		/JEQ
	SPA CLA		/JGE
	SMA SZA CLA	/JLE
	SKP CLA		/JA
	SNA CLA		/JNE
	SMA CLA		/JLT
	SPA SNA CLA	/JGT
	JMP	TSTALN	/JAL

TSTALN,	CLA
	TAD	ACX
	TAD	MIN27
	SPA SNA CLA
	JMP I	FPNXT
	JMP	DOJMP
MIN27,	-27

JXN,	TAD	INDX	/GET XR FIELD
	JMS I	(DCDIDX	/GET XR VALUE WITH INCREMENTING
	TAD I	T
	SNA CLA		/ZERO?
	JMP I	FPNXT	/YES
			/JUMP ON INDEX NON-ZERO, RIGHT?
DOJMP,	TAD	ADR
	DCA	PC
	TAD	ADRHI
	DCA	PCHI
	JMP I	FPNXT

LDADX,	TAD	ADRHI
	JMS	SETXR
	TAD	INDX
	CLL RAR
	SZA CLA
	JMP I	OPRLST	/EXIT ON ERROR
	SZL
	TAD I	T
	TAD	ADR
	DCA I	T
	JMP I	FPNXT

SETXR,	0
	TAD	XRBASE
	DCA	T
	TAD	XRHI
	JMS I	(SETDF
	JMP I	SETXR

SETX,	TAD	ADRHI	/SET XR0 LOC
	DCA	XRHI
	TAD	ADR
	DCA	XRBASE
	JMP I	FPNXT

	PAGE
FETPC,	0		/LINK MUST = 0
	TAD	PCHI
	JMS	SETDF
	TAD I	PC
	CDF CUR
	ISZ	PC
	JMP I	FETPC
	ISZ	PCHI
	JMP I	FETPC

SETDF,	0
	SZL		/LNK SET MEANS NEXT FIELD
	IAC
	DCA	DFCUR	/VIRTUAL FIELD BITS IN USE
	TAD	DFCUR
	CLL RTL
	RAL
	TAD	DFREL	/CDF 0 OR A RELOCATED FIELD CDF
	DCA	.+1
	HLT
	JMP I	SETDF	/'SETDF' CLEARS LINK

DFBUMP,	0		/PRESERVES AC, CLEARS LINK
	DCA	FETPC
	TAD	DFCUR
	STL		/INC FIELD
	JMS	SETDF
	TAD	FETPC
	JMP I	DFBUMP

SETB,	TAD	ADRHI
	DCA	BASHI
	TAD	ADR
	DCA	BASADR
	JMP I	FPNXT
/MISCELLANEOUS JUMP CLASS INSTRUCTIONS

JSA,	TAD	ADR
	DCA	T
	TAD	ADRHI
	JMS	SETDF	/SET UP LOC TO SAVE PC IN
	AC0002
	TAD	ADR
	DCA	ADR	/BUMP ADDRESS BY 2
	SZL
	ISZ	ADRHI
JSAR,	TAD	PCHI	/JSA/JSR COMMON CODE
	TAD	(JA	/FORM "JA" INSTRUCTION
	DCA I	T
	ISZ	T
	SKP
	JMS	DFBUMP	/BUMP TARGET ADDRESS
	TAD	PC
	DCA I	T
	JMP I	(DOJMP	/NOW JUMP TO DESTINATION

JSR,	CLA CLL IAC
	TAD	BASADR
	DCA	T
	TAD	BASHI
	JMS	SETDF	/SET DF&T TO BASE PAGE LOC +1
	JMP	JSAR

FPJAC,	TAD	ACL
	DCA	ADR
	TAD	ACH
	AND	(7
	DCA	ADRHI
	JMP I	(DOJMP
FPXTA,	TAD	(27	/XR TO AC - NORMALIZE IF FLOATING MODE
	DCA	ACX
	TAD I	T
CLFAC,	DCA	ACL
	TAD	ACL
	SPA CLA
	CLA CMA
	DCA	ACH
NRMFAC,	TAD	DFLG
	SPA SNA CLA
	JMS I	(FFNOR
	JMP I	FPNXT

STRTE,	TAD	DFLG
	SPA CLA
	JMP	.+4	/CLEAR EXTENDED FAC
	DCA	EAC1	/IF NOT ALREADY IN E MODE
	DCA	EAC2
	DCA	EAC3
	TAD	(-4
STRTD,	IAC
STRTF,	DCA	DFLG
	JMP I	FPNXT

ATX,	TAD	ACL
	MQL
	TAD	DFLG	/ATX WORKS DIFFERENTLY IN D.P.I. MODE
	SMA SZA CLA
	JMP	SPCATX
	JMS I	(FFNOR
	STA		/ANSWER IS RETURNED IN INTEG
	TAD	ACX	/ABS(FAC) MUST BE LESS THAN 2048
	CLL		/DETERMINE IF FAC EXPONENT IS
	TAD	(-13	/BETWEEN 1 AND 13
	SZA
	JMP	FIXIT
	TAD	ACH
	SHL
		1
	JMP	FIX0
FIXIT,	CMA
	DCA	FIXSH	/SHIFT COUNT BETWEEN 0 AND 12
	SZL
	JMP	FIX0	/NOT INTEGERIZABLE
	TAD	ACH
	ASR
FIXSH,	0
FIX0,	MQL
	TAD	ADRHI
	JMS I	(SETXR
SPCATX,	MQA CLA
	DCA I	T
	JMP I	FPNXT

FTEMP,	0;0;0

	PAGE
ALN,	TAD	ACX	/ALIGN SIMULATOR
	DCA	OPX	/SAVE EXPONENT IN CASE WE'RE IN D.I. MODE
	TAD	DFLG
	SMA SZA CLA
	DCA	ACX	/ZERO EXP IF D.I. MODE
	TAD	ADRHI
	TAD	DFLG	/IF WE'RE IN FLOATING POINT MODE,
	SNA CLA		/AND DOING AN "ALN 0",
	TAD	(27	/ALIGN UNTIL EXPONENT = 23
	SNA
	TAD I	T	/OTHERWISE ALIGN UNTIL EXPONENT = XR VALUE
	CDF CUR
	CIA
	TAD	ACX
	SMA		/IF EXPONENT IS LARGER THEN DESIRED EXPONENT,
	JMP	ALNSHL	/SHIFT LEFT
	JMS	ACSR	/OTHERWISE SHIFT RIGHT
ALNXIT,	CAM
	TAD	DFLG
	SPA SNA CLA	/IF DOUBLE INTEGER MODE,
	JMP I	FPNXT
	TAD	OPX	/ALIGNMENT LEAVES THE EXPONENT UNCHANGED
	DCA	ACX
	JMP I	FPNXT
ALNSHL,	MQL		/STORE SHIFT COUNT
	MQA
	CIA
	TAD	ACX
	DCA	ACX
	JMS	SHFTES
	DCA	ALNSHF
	SWP
	SPA
	JMP	ALNOK
	SZA CLA
	JMP	ALNSHF+1
	TAD	ACL
	JMP	.+3
ALNOK,	DLD
		ACL
	SHL
ALNSHF,		0
	DST
		ACL
	JMP	ALNXIT

SHFTES,	0
	MQA
	TAD	(-14
	SPA
	JMP	SHFLOD
	MQL
	MQA
	TAD	(-14
	SPA CLA
	STA CLL
	IAC CLL
SHFLOD,	SWP		/STATUS IN MQ:
	JMP I	SHFTES	/OK= -, BAD=+, 12 BIT=0

ACSR,	0
	CIA
	MQL
	MQA
	TAD	ACX
	DCA	ACX
	JMS	SHFTES
	DCA	SRSHFT
	SWP
	SPA
	JMP	SROK
	SZA CLA
	JMP	SRSHFT+1
	TAD	ACH
	MQL
	MQA
	SPA CLA
	CMA
	JMP	.+3
SROK,	DLD
		ACL
	ASR
SRSHFT,		0
	DST
		ACL
	JMP I	ACSR

/GENERAL AC-TO-MEMORY INTERPRETER
FFMPM,	TAD	(3000	/OP4 - FFMPY
FFADM,	TAD	(3000	/OP1 - FFADD
	TAD	DFCUR	/ADD IN VIRTUAL FIELD BITS
	TAD	KLUDGM
	DCA	OPM
	TAD	ADR	
	DCA	AD1
	TAD	DFCUR
	TAD	KLUDGM
	DCA	PUTM	/FORM FSTA X INSTRUCTION
	TAD	ADR
	DCA	AD2
	JMS I	(FPGO	/MUST RESET TO DF CUR AND INHIBIT
	KLUDGM		/PRIORITY EXIT
	JMP I	FPNXT
KLUDGM,	FSTA+LONG
	FTEMP		/SAVE AC
OPM,	0
AD1,	0		/PERFORM OP
PUTM,	0
AD2,	0		/STORE RESULT
	FLDA+LONG
	FTEMP		/RESTORE AC
	FEXIT

DADDIT,	DLD
		OPL
	DAD
		ACL
	DST
		ACL
	JMP I	FPNXT

	PAGE
/FLOATING ADD AND SUBTRACT-IN ORDER NOT TO LOSE BITS,
/WE DO NOT SHIFT BOTH NUMBERS RIGHT 1 BIT BEFORE ADD-
/ONLY SHIFTS DONE ARE TO ALIGN EXPONENTS.

FFSUB,	JMS	ARGET
	DCM		/NEGATE OPERAND
	DST
	OPL
	SKP

FFADD,	JMS	ARGET	/PICK UP ARGUMENTS
	DPSZ
	SKP CLA
	JMP I	FPNXT
	TAD	DFLG
	SMA SZA CLA
	JMP I	(DADDIT	/GO DO D.P. ADDITION
	TAD	ACH
	SZA CLA
	JMP	ADOK
	TAD	OPH
	JMP	ADON
ADOK,	TAD	OPX	/PICK UP EXPONENT OF OPERAND
	MQL		/SEND IT TO MQ FOR SUBTRACT
	TAD	ACX	/GET EXPONENT OF FAC
	SAM		/SUBTRACT-RESULT IN AC
	SMA		/NEGATIVE RESULT?
	CMA	IAC	/NO-MAKE IT NEGATIVE
	DCA	AC0	/STORE IT AS A SHIFT COUNT
	TAD	ACX	/GET FAC EXP.INTO AC
	SGT		/WHICH EXPONENT WAS GREATER?
	DCA	OPX	/FAC'S-STORE FINAL EXP. IN OPX
	SGT		/WHICH EXP GREATER(GT FLG SET
			/BY SUBTR. OF EXPS.)
	SKP CLA
	JMP	NOSWAP
	TAD	ACH	/SWAP AC AND OP
	MQL
	TAD	OPH
	DCA	ACH
	MQA
	DCA	OPH
	TAD	ACL
	MQL
	TAD	OPL
	DCA	ACL
	MQA
	DCA	OPL
NOSWAP,	AC7776
	DCA	AC2	/SET SWITCH FOR SMALL AC
	TAD	AC0	/GET SHIFT COUNT
	JMS I	(ACSR	/AND SHIFT AC
	DPSZ		/SHIFTED TOO FAR?
	ISZ	AC2	/NO - SKIP NEXT ISZ
	DAD
		OPL	/ADD IN OP (OR LOAD ONLY)
	ISZ	AC2	/COULD EXPONENTS BE ALIGNED?
	JMP	ADON	/NO-JUST LEAVE LARGER IN AC,MQ
	DCA	ACH
	TAD	ACH
	SZL		/OVERFLOW?(L NOT = SIGN BIT)
	CMA		/NOTE-WE DIDN'T SHIFT BOTH RIGHT 1
	AND	EMSIGN	/SEE IF 2 #S HAD SAME SIGN
	SPA	CLA
	JMP	OVRFLO	/YES-OVERFLOW
	AC4000
	TAD	ACH	/NO-GET HIGH ORDER RESULT BACK
			/CHECK FOR 4000 0000 MANTISSA
	DPSZ		/IT WILL BE SET TO 0 BY NMI
	JMP	ADON-1	/OK-RESTORE NUMBER
	AC2000		/GOT A 4000 0000-SET TO 6000 0000
DOIT,	ISZ	OPX	/AND INCREMENT EXPONENT
	NOP
	TAD	(4000	/RESTORE NUMBER
ADON,	NMI		/NORMALIZE (LOW ORDER STILL IN MQ)
	DST		/STORE FINAL RESULT
		ACL
	CLA SCA		/GET SHIFT COUNTER(# OF NMI SHIFTS)
	CIA		/NEGATE IT
	TAD	OPX	/AND ADJUST FINAL EXPONENT
	DCA	ACX
	JMP I	FPNXT	/RETURN
OVRFLO,	TAD	ACH	/OVERFLOW-GET HIGH ORDER RESLT BACK
	ASR		/SHIFT IT RIGHT 1
		1
	JMP	DOIT
/DOUBLE PRECISION INTEGER OPCODE INTERPRETERS

EMSIGN,	0
ARGET,	0		/SUBROUTINE TO FETCH ARG FOR ADD, SUBT, ETC.
	TAD	DFLG	/CHECK D.P.
	SMA SZA CLA
	JMP	DARGET	/YES
	TAD I	ADR	/PICK UP EXPONENT
	ISZ	ADR	/MOVE POINTER TO HI MANTISSA WD
	SKP
	JMS I	(DFBUMP
	SKP
DARGET,	DCA	ACX
	DCA	OPX
	TAD I	ADR	/PICK IT UP
	MQL
	MQA		/TEMPORARY
	AND	(4000	/SIGN OF OP
	TAD	ACH	/+SIGN OF AC
	SMA CLA
	CMA
	DCA	EMSIGN	/SET SIGN RESULT
	ISZ	ADR	/MOVE PTR. TO LO MANTISSA WD.
	SKP
	JMS I	(DFBUMP	/WATCH THOSE FIELD TRANSITIONS!
	TAD I	ADR	/PICK IT UP
	CDF CUR		/SET FIELD OF FPP
	SWP
	DST		/STORE REVERSE
		OPL	/AND KEEP IN AC,MQ
	JMP I	ARGET	/RETURN
/ROUTINE TO NORMALIZE THE FAC

FFNOR,	0
	CDF CUR
	DLD		/PICK UP MANTISSA
	ACL
	NMI		/NORMALIZE IT
	SNA		/IS THE # ZERO?
	DCA	ACX	/YES-INSURE ZERO EXPONENT
	DST		/STORE BACK
		ACL
	CLA	SCA	/STEP COUNTER TO AC
	CMA	IAC	/NEGATE IT
	TAD	ACX	/AND ADJUST EXPONENT
	DCA	ACX
	JMP I	FFNOR	/RETURN

	PAGE
/FLOATING MULTIPLY--DOES 4 SINGLE MULTIPLIES WITH EAE
/THIS USES THE FACT THAT IF AC IS NON-ZERO WHEN YOU DO
/A MUY INSTR, THE AC IS ADDED TO RESULT OF THE MULTIPLY.
/(IN THE LOW ORDER, NATCHERLY)

FFMPY,	JMS I	(ARGET
	JMS	EMDSET	/SET UP FOR MULT
	CLA	MUY	/MULTIPLY-LOW ORDER FAC STILL IN MQ
	OPL		/THIS IS PRODUCT OF LOW ORDERS
	MQL		/ZAP LOW ORDER RESULT-INSIGNIFICANT
	TAD	ACL	/GET LOW ORDER OF FAC
	SWP	MUY	/TO MQ-HIGH ORD. RESLT OF LAST MPY
	OPH		/TO AC-WILL BE ADDED TO RESLT-THIS
	DST		/IS PRODUCT-LOW ORD FAC,HI ORD OP
	AC0		/STORE RESULT
	DLD		/HIGH ORDER FAC TO MQ
	ACH		/FAC EXPONENT TO AC
	TAD	OPX	/ADD OPERAND EXPONENT-GET SUM OF EXPS.
	DCA	ACX	/STORE RESULT
	MUY		/MUL. HIGH ORDER FAC BY LOW ORD OP.
	OPL		/HIGH ORDER FAC WAS IN MQ
	DAD		/ADD IN RESULT OF SECOND MULTIPLY
	AC0
	DCA	AC1	/STORE HIGH ORDER RESULT
	TAD	ACH	/GET HIGH ORDER FAC
	SWP		/SEND IT TO MQ AND LOW ORD. RESULT
	DCA	AC0	/OF ADD TO AC-STORE IT
	RAL		/ROTATE CARRY TO AC
	DCA	AC2	/STORE AWAY
	MUY		/NOW DO PRODUCT OF HIGH ORDERS
	OPH		/FAC HIGH IN MQ, OP HIGH IN OPH
	DAD		/ADD IN THE ACCUMULATED #
	AC1
/MULTIPLIES DONE - MASSAGE RESULT

	SNA		/ZERO?
	JMP	RTZRO	/YES-GO ZERO EXPONENT
	NMI		/NO-NORMALIZE (1 SHIFT AT MOST!)
	DCA	ACH	/STORE HIGH ORDER RESULT
	CLA	SCA	/GET STEP CNTR-DID WE NEED A SHIFT?
	SNA	CLA
	JMP	SNCK	/NO-JUST CHECK SIGN
	TAD	AC0	/YES - WATCH OUT FOR LOST ACCURACY!
	RAL
	DCA	AC0
	SZL		/IF HIGH ORDER BIT OF OVERFLOW WORD WAS ON,
	DPIC		/TURN MQ11 ON (IT WAS 0 FROM THE NMI)
	CLA	CMA	/MUST DECREASE EXP. BY 1
TADACX,	TAD	ACX
RTZRO,	DCA	ACX	/STORE BACK
SNCK,	TAD	AC0
	SPA	CLA	/IS HIGH ORDER OF OVERFLO WD. 1?
	DPIC		/YES-ADD 1 TO LOW ORDER-STILL IN MQ
	TAD	ACH
	SMA
	JMP	EMDONE	/WE DIDN'T OVERROUND - GOODY
	LSR
	1		/BUT OVERROUNDING IS EASILY CORRECTED!
	ISZ	ACX	/    (OVERCORRECTED??)
	NOP

/COMMON CLEANUP ROUTINE FOR MULTIPLY AND DIVIDE

EMDONE,	ISZ I	(EMSIGN	/SHOULD SIGN BE MINUS?
	DCM		/YES-DO IT
	SNA
	DCA	ACX	/FORCE EXPONENT 0 IF MANTISSA = 0
	DST		/STORE IT BACK
	ACL
	CLA
	TAD	DFLG
	SMA SZA CLA
	TAD	ACX	/IF D.P. INTEGER MODE AND ACX LESS THAN 0,
	SPA		/GO TO UNNORMALIZE RESULT
	JMS I	(ACSR
	JMP I	FPNXT	/OTHERWISE BUMP RETN. AND RETN.
/ROUTINE TO SET UP FOR MULTIPLY AND DIVIDE

EMDSET,	0
	SPA		/MANTISSA OF OP. IN AC,MQ
	DCM		/IF NEGATIVE-NEGATE IT
	SHL		/SHIFT OPRND LEFT 1 TO AVOID OVRFLO
	1
	DST		/STORE BACK
	OPL
	DLD
	ACL
	SPA		/FAC LESS THAN 0?
	DCM		/YES-NEGATE
	DST		/STORE BACK
	ACL
	JMP I	EMDSET
/COMBINED PUT AND GET FAC

FFGET,	AC2000
FFPUT,	DCA	AC0	/2000 FOR DCA
	AC7775
	TAD	DFLG
	DCA	AC1	/SET SIZE OF FAC
	TAD	DFLG	/6,3 OR 2
	SMA SZA CLA
	CMA		/ADRESS ONE LESS FOR D.P.
	TAD	AC0
	TAD	TADACX	/EITHER TAD OR DCA
	DCA	PGINST	/FOR PUT OR GET
PGLOOP,	TAD	AC0
	CLL RTL
	SZL
	TAD I	ADR	/GET
PGINST,	HLT
	SNL
	DCA I	ADR	/PUT
	ISZ	ADR
	SKP
	JMS I	(DFBUMP
	STA
	TAD	PGINST
	DCA	PGINST
	ISZ	AC1
	JMP	PGLOOP
	JMP I	FPNXT

	PAGE
/FLOATING DIVIDE

FFDIV,	JMS I	(ARGET
	JMS I	(EMDSET	/GET ARG. AND SET UP SIGNS
	DVI		/DIVIDE-ACH AND ACL IN AC,MQ
	OPH		/THIS IS HI ORDER DIVISOR
	DST		/QUOT TO AC0,REM TO AC1
	AC0
	SZL	CLA	/DIVIDE ERROR?
	JMP	DBAD	/YES - HANDLE IT
	TAD	OPX	/DO EXPONENT CALCULATION
	CMA	IAC	/EXP. OF FAC - EXP. OF OP
	TAD	ACX
	DCA	ACX
	DPSZ		/IS QUOT = 0?
	SKP		/NO-GO ON
	DCA	ACX	/YES-ZERO EXPONENT
	MUY		/NO-THIS IS Q*OPL*2**-12
	OPL
	DCM		/NEGATE IT
	TAD	AC1	/SEE IF GREATER THAN REMAINDER
	SNL
	JMP	EDVOPS	/YES-ADJUST FIRST DIVIDE
	DVI		/NO-DO Q*OPL*2**-12/OPH
	OPH
	SZL	CLA	/DIV ERROR?
	JMP	DBAD	/YES
DVLP1,	TAD	AC0	/NO-GET QUOT OF FIRST DIV.
	SMA		/NEGATIVE?
	JMP I	(EMDONE	/NO-REMEMBER-QUOT OF 2ND DIV. IN MQ
	LSR		/YES-MUST SHIFT IT RIGHT 1
	1
	ISZ	ACX	/ADJUST EXPONENT
	NOP
	SGT		/TEST SHIFTED OUT BIT
	JMP I	(EMDONE	/ZERO - NO ROUND
	DPIC		/BUMP AC FRACTION
	JMP	DVLP1+1	/MAYBE SHIFT AGAIN
/CONTINUATION OF DIVIDE ROUTINE
/WE ARE ADJUSTING THE RESULT OF THE
/FIRST DIVIDE.

EDVOPS,	CMA	IAC	/DCM?
	DCA	AC1	/ADJUST REMAINDER
	TAD	OPH	/WATCH FOR OVERFLOW
	CLL CMA IAC
	TAD	AC1
	SNL
	JMP	DVOP1	/DON'T ADJUST QUOT.
	DCA	AC1
	CMA
	TAD	AC0
	DCA	AC0	/REDUCE QUOT BY 1
DVOP1,	CLA	CLL
	TAD	AC1	/GET REMAINDER
	SNA		/ZERO?
	CAM		/YES-ZERO EVERYTHING
	DVI		/NO
	OPH
	SZL	CLA	/DIV. OVERFLOW?
	JMP	DBAD	/YES
	DCM		/NO-ADJUST HI QUOT (MAYBE)
	JMP	DVLP1	/GO BACK

DBAD,	TAD	DBAD	/ERROR ROUTINE?
	DCA	ACX	/SET AC TO LARGE POS.NUM.
	AC2000
	JMP I	(EMDONE
/FPP INTERPRETER STARTUP ROUTINE

FPGO,	0
FPGCDF,	CDF CUR		/NECESSARY?
	CLA
	TAD	PC
	DCA	SAVPC	/ALLOW ONE LEVEL OF RECURSIVENESS
	TAD	PCHI
	DCA	SVPCHI
	TAD	DFREL
	DCA	SAVREL
	TAD I	FPGO
	DCA	PC
	ISZ	FPGO
	DCA	PCHI
	TAD	FPGCDF	/FPGO STARTS UP THE FPP
	DCA	DFREL	/FROM FIELD CUR ONLY
	JMP I	FPNXT

TRAP5I,
TRAP6I,
TRAP7I,
FPAUSE,
EXIT,	TAD	SAVPC
	DCA	PC
	TAD	SVPCHI
	DCA	PCHI	/RESTOTE OLD 15-BIT PC
	TAD	SAVREL
	DCA	DFREL	/RESTORE OLD VIRTUAL FIELD
	JMP I	FPGO	/RETURN TO PDP-8 CODE
SAVPC,	0
SVPCHI,	0
SAVREL,	0
/MISCELLANEOUS OPCODE ROUTINES

TRAP3I,
TRAP4I,	AC0002
	TAD I	(DFREL
	DCA	.+1	/FORM CDF CIF N
	HLT		/EXECUTE IT
	TAD I	(INST
	SMA CLA		/TRAP4 JMS'S TO ITS TARGET ADDRESS,
	JMP I	ADR	/TRAP3 JMP'S TO IT
	JMS I	ADR
	JMP I	FPNXT

	PAGE

	$$$