Trailing-Edge
-
PDP-10 Archives
-
BB-H506D-SM_1983
-
cobol/source/dspfp.mac
There are 7 other files named dspfp.mac in the archive. Click here to see a list.
TITLE DSPFP FOR LIBOL
SUBTTL DISPLAY A FLOATING-POINT NUMBER AL BLACKINGTON/CAM
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1974, 1981 BY DIGITAL EQUIPMENT CORPORATION
HISEG
ENTRY DSP.FP
;ENTER WITH FLOATING-POINT NUMBER IN "NM".
DSP.FP: MOVEI TX,7 ;SET TEN'S EXPONENT TO 7
TDNN NM,[XWD 777,-1] ;IS IT ZERO?
JRST DSP.Z ;YES--SPECIAL PROCESSING
JUMPGE NM,DSP.1
MOVMS NM
OUTSTR [ASCIZ "-"]
DSP.1: FAD NM,[0] ;NORMALIZE
DSP.A: CAMG NM,FPP20 ;IS NUMBER > 10**20?
JRST DSP.B ;NO
FDVR NM,FPP20 ;YES--BRING IT DOWN
ADDI TX,^D20 ;ADD TO EXPONENT
JRST DSP.A ;LOOP UNTIL IN RANGE
DSP.B: CAML NM,FPM12 ;IS NUMBER < 10**-12?
JRST DSP.C ;NO
FMPR NM,FPP12 ;YES--BRING IT UP
SUBI TX,^D12 ;DECREMENT TEN'S EXPONENT
JRST DSP.B ;LOOP UNTIL WITHIN RANGE
DSP.C: MOVE TA,NM ;SPLIT THE NUMBER INTO EXPONENT AND MANTISSA
MULI TA,400
CAMLE NM,FPP10 ;IS NUMBER GREATER THAN 10**10?
JRST DSP.H ;YES
CAILE TA,200 ;NO--IS IT LESS THAN 1?
JRST DSP.L ;NO
;NUMBER IS LESS THAN 1, BUT GREATER THAN 10**-12
MOVE AC0,TA+1 ;GET DECIMAL POINT TO LEFT OF AC0
MOVEI AC1,0
SUBI TA,200
ASHC AC0,(TA)
DSP.E: CAML AC0,DP9 ;AT LEAST 8 PLACES IN AC0?
JRST DSP.F ;YES
MOVEI PA,DP1 ;NO--MULTIPLY BY 10
PUSHJ PP,MUL.21
SOJA TX,DSP.E ;DECREMENT TEN'S EXPONENT AND LOOP
DSP.F: ADDI AC0,5 ;ROUND
MOVE AC1,AC0 ;NOW PUT DECIMAL POINT BETWEEN AC0&AC1
MOVEI AC0,0
JRST DSP.N
;THE NUMBER IS GREATER THAN 10**10, BUT LESS THAN 10**20
DSP.H: MOVE AC0,TA+1
MOVEI AC1,0
ASHC AC0,-306(TA) ;DECIMAL POINT IS NOW TO RIGHT OF AC1
JUMPE AC0,DSP.J ;IS IT < 2**35?
DSP.I: MOVEI PA,DP3 ;NO--DIVIDE BY 1000
PUSHJ PP,DIV.21
ADDI TX,3 ;KICK UP TEN'S EXPONENT
JUMPN AC0,DSP.I ;LOOP
DSP.J: MOVE AC0,AC1
MOVEI AC1,0
JRST DSP.N
;THE NUMBER IS GREATER THAN 1 BUT LESS THAN 10**10
DSP.L: MOVE AC0,TA+1
MOVEI AC1,0
ASHC AC0,-243(TA)
;THE NUMBER NOW IS FIXED, AND HAS DECIMAL POINT BETWEEN AC0&AC1
DSP.N: CAMGE AC0,DP8 ;IS IT GREATER THAN 10**8?
JRST DSP.O ;NO
IDIVI AC0,^D10 ;REDUCE IT
CAIGE AC1,5 ;IS REMAINDER < 5?
TDCA AC1,AC1 ;YES
MOVSI AC1,200000 ;NO
AOJA TX,DSP.N ;BUMP TEN'S EXPONENT AND LOOP
DSP.O: CAML AC0,DP7 ;IS NUMBER LESS THAN 10**7?
JRST DSP.P ;NO
MOVEI PA,DP1 ;YES--INCREASE IT
PUSHJ PP,MUL.21
SOJA TX,DSP.O
DSP.P: TLZE AC1,200000 ;ANY NEED TO ROUND?
AOJA AC0,DSP.N ;YES--BUMP IT AND LOOP
IDIV AC0,DP7
ADDI AC0,"0"
ROT AC0,-7
TLO AC0,1340
OUTSTR AC0
MOVEI TA,DP6
DSP.Q: MOVE AC0,AC1
IDIV AC0,(TA)
ADDI AC0,"0"
OUTCHR AC0
SKIPE AC1
AOJA TA,DSP.Q
OUTSTR [ASCIZ "E"]
JUMPGE TX,DSP.R
OUTSTR [ASCIZ "-"]
MOVMS TX
DSP.R: IDIVI TX,^D10
HRLM TX+1,0(PP)
SKIPE TX
PUSHJ PP,DSP.R
HLRZ TA,(PP)
ADDI TA,"0"
OUTCHR TA
POPJ PP,
;THE NUMBER WAS ZERO
DSP.Z: OUTSTR [ASCIZ "0.0E0"]
POPJ PP,
AC0=0
AC1=AC0+1
TA=2
NM=5
TX=12 ;(2 AC'S)
PA=16
PP=17
FPP20: 1.0E20
FPP12: 1.0E12
FPM12: 1.0E-12
FPP10: 1.0E10
DP9: DEC 1000000000
DP8: DEC 100000000
DP7: DEC 10000000
DP6: DEC 1000000
DEC 100000
DEC 10000
DP3: DEC 1000
DEC 100
DP1: DEC 10
DEC 1
EXTERNAL MUL.21,DIV.21
END