Google
 

Trailing-Edge - PDP-10 Archives - BB-4170G-SM - sources/mr.mac
There is 1 other file named mr.mac in the archive. Click here to see a list.
;<3-MONITOR>MR.MAC.19,  7-Nov-77 13:04:10, EDIT BY KIRSCHEN
;MORE COPYRIGHT UPDATING...
;<3-MONITOR>MR.MAC.18, 12-Oct-77 13:59:51, EDIT BY KIRSCHEN
;UPDATE COPYRIGHT FOR RELEASE 3
;<3-MONITOR>MR.MAC.17,  2-May-77 21:37:55, EDIT BY BOSACK
;<3-MONITOR>MR.MAC.16, 27-Dec-76 17:35:00, EDIT BY HURLEY
;<3-MONITOR>MR.MAC.16, 26-Nov-76 02:24:01, Edit by MCLEAN
;<2-MONITOR>MR.MAC.14, 21-Sep-76 16:02:23, Edit by MCLEAN
; FIXED MISSING SEMICOLON IN COMMENTS FOR PUSHJ P,EDFAD.
;<2MONITOR>MR.MAC.13, 19-JAN-76 12:20:52, EDIT BY MURPHY
;<2MONITOR>MR.MAC.12, 23-DEC-75 12:52:12, EDIT BY LEWINE


;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1976, 1977, 1978 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

	SEARCH PROLOG,MONSYM,MACSYM
	TTITLE RITH
	SALL
	SWAPCD

;DOUBLE PRECISION ARITHMETIC ROUTINES

	INTERN EDFAD.,EDFMP.,EDFDV.,EDFSB.,GETEXP,PUTEXP

	IFNDEF MONFLG,<MONFLG==1>
AOP1==0
AOP2==1
BKSTK=16


;AC ASSIGNMENTS

A=12				;AC FOR OPERAND AND RESULT. AND A+1.
B=14				;=A+2.
C=15
M=10				;MEMORY OPERAND POINTER AND TEMP. M+1 ALSO USED.
P=17				;CONTROL PUSHDOWN
;THE MORE GENERAL ROUTINES.
;SLOWER IN REGULAR CASE CAUSE MUST STORE AC OPERAND FOR
;RETRY ON OVERLOW.
;AC OPERAND AND ANSWER IN A&A+1, MOVE POINTS TO MEMORY OPERAND.

;EDFAD IS EXTENDED RANGE DOUBLE PRECISION ADD
;FORMAT OF NUMBER IS STANDARD FOR BINARY EXPONENT WITHIN RANGE
;MAGNITUDE LESS THAN 128 OR DECIMAL EXP<=38 (ABOUT)
;EXTENDED RANGE NUMBERS HAVE SECOND WORD WITH MINUS SIGN BIT
;8 BITS OF EXPONENT ARE HIGH ORDER EXTENSION OF EXPONENT
;ALL EXPONENTS ARE STILL EXCESS 128
;ROUTINE IS CALLED WITH ONE NUMBER IN A,A+1
;OTHER IN 0(M),1(M)   ... CALLED WITH
;       MOVEI M,LOC		; WHERE MEMORY LOC IS GIVEN

;	PUSHJ P,EDFAD.

;ANSWER LEFTIN A,A+1   OTHER AC'S GENERALLY CLOBBERED



EDFAD.:SE1CAL
	PUSH P,BKSTK
	HRRI BKSTK,1(P)
	ADD P,BHC+2
	IFG MONFLG,<
	EXTERN MSTKOV
	JUMPGE P,MSTKOV>
	MOVEM A,AOP1(BKSTK)	;SAVE AC OPS
	MOVEM A+1,AOP2(BKSTK)
	JFOV .+1		;MAY NOT REALLY BE NEEDED
	SKIPGE M+1,1(M)		;TEST FOR EITHER OPERAND EXT RANGE. FREELOAD.
	JRST .EXRNG
	JUMPL A+1,.EXRNG
DFAD:	UFA A+1,M+1		;STANDARD DP ADD SEE P 2-67 OF SYSTEM MANUAL
	FADL A,0(M)
	UFA A+1,A+2
	FADL A,A+2
	JFOV ADSAVE
	SUB P,BHC+2
	POP P,BKSTK
	POPJ P,

ADSAVE:	MOVE A,AOP1(BKSTK)
	MOVE A+1,AOP2(BKSTK)	;RESTORE AC OPS
				;JRST .EXRNG		;.EXRNG IS NEXT
;EXTENDED RANGE ADD:
;RETURN LARGER IF EXPONENTS DIFFER BY TOO MUCH,
;ELSE SHIFT EXPONENTS INTO RANGE, ADD, SHIFT BACK

.EXRNG:	MOVE M,(M)		;M!
EXRNG:	PUSH P,C
	PUSHJ P,GETEXP		;GETS EXP OF A INTO B
	MOVE C,B
	EXCH A,M		;PUT MEMORY NUM IN A
	EXCH A+1,M+1
	PUSHJ P,GETEXP		;OTHER EXPONENT
	CAML B,C		;COMPARE WITH FIRST EXP
	JRST RTORD		;RIGHT ORDER IF LARGER IS IN A
	EXCH A,M
	EXCH A+1,M+1		;EXCHANGE BRINGING LARGER NUM TO A
	EXCH B,C		;EXCHANGE EXPONENTS TOO

RTORD:	SUB B,C			;DIFF OF EXPS
	CAILE B,^D54		;A>>M
	JRST REXRNG		;ANSWER IS IN A
	PUSH P,C		;SAVE ORIGINAL LOWEST EXP
	MOVEI C,^D128		;HIGH ORDER EXP FOR M
	SKIPGE M		;IS MOVE NEGATIVE
	SETCA C,		;YES, SO COMPLEMENT EXP
	DPB C,[POINT 8,M,8]	;INSERT EXP
	MOVEI C,^D101		;LOW ORDER EXP
	DPB C,[POINT 9,M+1,8]
	ADD C, B
	DPB C,[POINT 9,A+1,8]
	ADDI C,^D27		;HIGH ORDER EXP FOR A
	SKIPGE A
	SETCA C,		;IF A NEG COMPLEMENT EXP
	DPB C,[POINT 8,A,8]
	UFA A+1,M+1		;STD DP ADD
	FADL A,M		;..
	UFA A+1,A+2		;..
	FADL A,A+2		;..
	POP P,C			;ORIGINAL EXP
	JUMPE A,REXRNG		;IF ANSWER IS ZERO
	PUSHJ P, GETEXP		;GET EXP IN B
	ADD B,C			;ADD EXPONENT TO GET RESULT
	SUBI B,^D128		;SUBTRACT EXCESS EXCESS 200
	PUSHJ P,PUTEXP		;PUT IT IN NUMBER
REXRNG:	POP P,C
	SUB P,BHC+2
	POP P,BKSTK
	POPJ P,
;GETEXP  EXPECTS NUMBER IN A,A+1  AND RETURNS EXPONENT IN B

GETEXP:	JUMPE A,EXP0		;TEST FOR ZERO NUMBER
	SE1CAL
	LDB B,[POINT 8,A,8]
	JUMPGE A,.+2
	XORI B,377		;IF  LOW ORDER EXP FROM A  SHOULD BE NEGATED DO SO
	JUMPGE A+1,GEND		;IF NOT IN EXTENDED RANGE THEN DONE
	LSH B,^D20		;PUT NEXT TO POSITION FOR HIGH ORDER BITS
	ROT A+1,^D9		;PUT EXP IN RIGHT HAND PART OF AC
	DPB A+1,[POINT 8,B,7]
	ROT A+1,-^D9
	ASH B,-^D20
GEND:	POPJ P,

EXP0:	MOVNI B,77777		;FOR ZERO RETURN SMALLEST POSSIBLE EXPONENT
	RET



;PUTEXP EXPECTS NUMBER IN A,A+1 AND EXP IN B RETURN RESULT IN A,A+1
;PUTS EXPONENT INTO NUMBER , KNOWING ABOUT EXTENDED RANGE

PUTEXP:	JUMPE A,PXEND		;ZERO HAS ITS OWN EXP
	SE1CAL
	DPB B,[POINT 8,A,8]
	CAIGE B,400		;IS NUMBER INSIDE RANGE
	CAIGE B,33
	JRST PEXT		;NO
	MOVEI B,-33(B)		;LO EXPONENT = HI-^D27. LO SIGN BIT=0
PXDPB:	DPB B,[POINT 9,A+1,8]	;DEPOSIT LOW ORDER EXP AND SIGN BIT
	JUMPGE A,.+2
	TLC A,377000		;ONES COMPL EXPON IF NEG
PXEND:	POPJ P,

PEXT:	CAILE B,715		;UPPER LIMIT SHD BE TWICE OFFICIAL FOR COMPARISONS
	JFCL			;NUMBER >10^99 CANT HAPPEN, CHECK JRB
	CAMGE B,[-310]
	JFCL			;NUMBER <10^-99 CANT HAPPEN, CHECK JRB
	ASH B,-10
	TRO B,400		;LOW SIGN BIT = 1 TO FLAG EXTENDED RANGE NUMBER
	JRST PXDPB		;NOW DEPOSIT  EXP EXTENSION
;SB IS SAME AS EDFSB  JUST COMPLEMENTS TWICE AND ADDS

EDFSB.:	DFN A,A+1		;NEGATE FIRST OPERAND
	SE1CAL
	PUSHJ P,EDFAD.
	DFN A,A+1
	POPJ P,			;-(M-A)=A-M




;EDFDV IS ALMOST IDENTICAL TO EDFMP AND IS GIVEN FIRST

;THE TWO SETS OF INSTRUCTIONS AT MDINS AND ASINS MAKE THE DIFFERENCE

MDINS:	PUSHJ P,DFMPX		;ORDINARY DP MULT
	PUSHJ P,DFDVX		;ORDINARY DP QUOTIENT

ASINS:	ADDM B,0(P)		;ADD EXPS FOR MULT
	SUBM B,0(P)		;SUBTRACT EXPS FOR DIVIDE


EDFDV.:	SE1CAL
	PUSH P,BKSTK
	HRRI BKSTK,1(P)
	ADD P,BHC+2
	IFG MONFLG,<
	JUMPGE P,MSTKOV>
	MOVEM A,AOP1(BKSTK)	;SAVE AC OPS
	MOVEM A+1,AOP2(BKSTK)
	JFCL 17,.+1		;CLEAR FOV FLAG
	MOVE M+1,1(M)		;MUST LOAD MEM OPERAND NOW SO CAN SHARE
	MOVE M,(M)		;..."DFDV" CODE W X RNG CASE
	JUMPL A+1,QEXT		;USUAL CHECK FOR OUT OF RANGE
	JUMPL M+1,QEXT		;..

DFDV:	FDVL A,M		;STANDARD ROUTINE P2-68
	MOVN B,A
	FMPR B,M+1
	UFA A+1,B
	FDVR B,M
	FADL A,B
	JFOV DVSAVE
	SUB P,BHC+2
	POP P,BKSTK
	POPJ P,
DVSAVE:	JFCL 17,.+1
	MOVE A,AOP1(BKSTK)	;RESTORE AC OPERANDS
	MOVE A+1,AOP2(BKSTK)
QEXT:	PUSH P,C		;SAVE C
	MOVEI C,1		;USED TO INDEX MDINS,ASINS
	JRST MQEXT		;COMMON ROUTINE FOR MULT AND DIV
DFMPX:	PUSH P,BKSTK
	ADD P,BHC+2
	IFG MONFLG,<
	JUMPGE P,MSTKOV>
	JRST DFMP
DFDVX:	PUSH P,BKSTK
	ADD P,BHC+2
	IFG MONFLG,<
	JUMPGE P,MSTKOV>
	JRST DFDV
;EDFMP DOES DP MULTIPLICATION,USES MQEXT TO DO WORK

EDFMP.:	SE1CAL
	PUSH P,BKSTK
	HRRI BKSTK,1(P)
	ADD P,BHC+2
	IFG MONFLG,<
	JUMPGE P,MSTKOV>
	MOVEM A,AOP1(BKSTK)	;SAVE AC OPS
	MOVEM A+1,AOP2(BKSTK)
	MOVE M+1,1(M)		;LOAD MEMORY OPERAND (SO DFMP CODE CAN BE
	MOVE M,(M)		;...SHARED WITH X RANGE CASE)
	JFOV .+1
	JUMPL A+1,MEXT		;CHECK FOR EXTENDED RANGE OPERANDS
	JUMPL M+1,MEXT		;...

DFMP:	MOVEM A,B		;ORDINARY DP MUL SEE P2-67
	FMPR B,M+1
	FMPR A+1,M
	UFA A+1,B
	FMPL A,M
	UFA A+1,B
	FADL A,B
	JFOV MPSAVE
	SUB P,BHC+2
	POP P,BKSTK
	POPJ P,


MPSAVE:	MOVE A,AOP1(BKSTK)
	MOVE A+1,AOP2(BKSTK)	;RESTORE AC ARGS

;USE EXTENDED MULTIPLY

MEXT:	PUSH P,C		;SAVE C
	MOVEI C,0		;USED TO INDEX ASINS MDINS 0 FOR MUL 1 FOR DIV
				;JRST MQEXT		;MQEXT IS NEXT
;MQEXT DOES HEART OF WORK FOR EXTENDED RANGE MUL AND DIV
;IS JUMPED TO BY BOTH  0 IN CALL FOR MUL, 1 IN CALL FOR DIV


MQEXT:	PUSHJ P,GETEXP		;EXPONENT OF A
	PUSH P,B		;SAVE IT
	MOVEI B,^D128		;STANDARD EXP FOR MUL AND IDV
	PUSHJ P,PUTEXP		;PUT EXP IN A
	EXCH A,M
	EXCH A+1,M+1
	PUSHJ P,GETEXP		;GET OTHER EXPONENT

	EXCH B,0(P)
	XCT ASINS(C)		;ADD OR SUBTRACT TO MEMORY

	MOVEI B,^D128
	PUSHJ P,PUTEXP
	EXCH A,M		;PUT FIRST ARG IN A
	EXCH A+1,M+1
	XCT MDINS(C)		;EITHER MULTIPLY OR DIVIDE
	PUSHJ P,GETEXP		;GET RESULTING EXP
	ADD B,0(P)
	SKIPN C			;SKIP IF DIVIDE
	SUB B,[^D256]		;SUBTRACT TWO EXCESS 128S
	PUSHJ P,PUTEXP		;STORE RESULTING EXPONENT
	POP P,B
	POP P,C			;FIRST POP WAS ONLY TO GET RID OF JUNK
	SUB P,BHC+2
	POP P,BKSTK
	POPJ P,



	END