Google
 

Trailing-Edge - PDP-10 Archives - BB-H506E-SM - cobol/source/pd.mac
There are 9 other files named pd.mac in the archive. Click here to see a list.
; UPD ID= 3273 on 12/10/80 at 4:01 PM by NIXON                          
TITLE	PD FOR LIBOL V12C
SUBTTL	CONVERT BINARY TO DISPLAY	/ACK



	SEARCH	COPYRT
	SALL

;COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1974, 1985
;ALL RIGHTS RESERVED.
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE.

;REVISION HISTORY:
;V12B ****
;	13-JAN-82	/JEH	[1012] non-BIS display of low-values,
;				[100000,,000000], is wrong
;V10 *****
;	15-DEC-74	/ACK	CREATION.
;	5/15/75		/DBT	BIS
;	8/5/77		/DAW	BIS: EXTEND DONE INLINE, ADD CBDOV.
;	4/20/78		/DAW	BIS: SETO IN GENERATED CODE NOT NECESSARY
;*****
	SEARCH	LBLPRM		;DEFINE PARAMETERS.
	%%LBLP==:%%LBLP
	EBCMP.==:EBCMP.
	BIS==:BIS

	SALL
	EXTERN	EASTB.		;FORCE EASTBL TO BE LOADED.
	HISEG
	.COPYRIGHT		;Put COPYRIGHT statement in .REL file.

COMMENT	\
	THIS ROUTINE CONVERTS A ONE OR TWO WORD BINARY NUMBER TO A 
DISPLAY ITEM.
CALL:
	MOVE	16,[Z	AC,PARAMETER ADDRESS]
	PUSHJ	17,PD6./PD7./PD9.
PARAMETERS:
	THE ACCUMULATOR FIELD OF AC 16 CONTAINS THE AC WHICH CONTAINS THE
FIRST WORD OF THE NUMBER TO BE CONVERTED.  THE SECOND WORD, IF IT EXISTS,
IS IN THE FOLLOWING AC.
	THE RIGHT HALF OF AC 16 POINTS TO A WORD IN THE FOLLOWING
FORMAT:
	BITS	0-5	BYTE RESIDUE FOR OUTPUT FIELD.
	BIT	6	1 IF THE FIELD IS SIGNED.
	BIT	7	1 IF SEPARATE SIGN [ANS-74]
	BIT	8	1 IF LEADING SIGN [ANS-74]
	BITS	9-17	SIZE OF THE OUTPUT FIELD.
	BITS	18-35	ADDRESS OF THE FIRST CHARACTER OF THE OUTPUT FIELD.
RETURNS:
	CALL+1	ALWAYS.
REGISTERS USED:
	T1, CPTR, IPTR (CALLED OPTR), SW, CNT, T2, MASK, JAC, SAV10
\
	EXTERN	SET1.		;ROUTINE TO PICK UP THE PARAMETERS.
	EXTERN	PACFL.		;POINTER TO THE NUMBER OF THE AC INTO
				; WHICH WE ARE TO PLACE THE RESULT.

	ENTRY	PD6.		;IF THE INPUT IS SIXBIT.
	ENTRY	PD7.		;IF THE INPUT IS ASCII.
	ENTRY	PD9.		;IF THE INPUT IS EBCDIC.
	INTERN	CVBD.6		;TRANSLATE ROUTINES
	INTERN	CVBD.7
	INTERN	CVBD.9

IFE	BIS,<

;LOCAL AC DEFINITIONS:

	OPTR==IPTR
	CPTR==PARM
	SAV10==TAC5
	MASK==TAC4
	T1==TAC2
	T2==TAC3


PD6.:	JSP	CH,	PD		;ENTER HERE IF THE OUTPUT IS SIXBIT,
PD7.:	JSP	CH,	PD		; HERE IF IT IN ASCII AND
IFN EBCMP.,<
PD9.:	JSP	CH,	PD		; HERE IF IT IS IN EBCDIC.
>

PD:	SUBI	CH,	PD6.-5		;FIND OUT WHAT THE INPUT LOOKS LIKE.
	JSP	JAC,	SET1.		;GO SET UP THE PARAMETERS.
	LDB	T2,	PACFL.		;FIND OUT WHERE THE INPUT
					; OPERAND IS.
	HRRZ	MASK,	NCVTMS-6(SW)	;SELECT THE APPROPRIATE MASK.
	MOVE	CPTR,	SDDPTR-6(SW)	;SELECT THE APPROPRIATE POINTER
					; FOR THE SIGN CHAR.
IFN ANS74,<
	TRZE	CNT,(1B7)		;SEPARATE SIGN?
	TLO	SW,SSF			;YES
	TRZE	CNT,(1B8)		;LEADING SIGN?
	TLO	SW,LSF			;YES
>
	SKIPGE	T1,	(T2)		;PICK UP THE FIRST WORD OF THE OPERAND.
	ADDI	CPTR,	^D10		;USE NEGATIVE SIGNS
	CAILE	CNT,	^D10		;ONE OR TWO WORDS?
	JRST		PD4		;TWO WORD OPERAND.
;HERE WE CONVERT A SINGLE PRECISION BINARY NUMBER TO DISPLAY.

	JUMPGE	T1,	PD1		;IS IT NEGATIVE?
	MOVM	T1,	T1		;YES, MAKE IT POSITIVE.
PD1:
IFN ANS68,<
	JUMPL	SW,	PD6		;IF WE HAVE TO WORRY ABOUT SIGNS,
					; GO DO SO.
>
IFN ANS74,<
	JUMPGE	SW,PD2			;UNSIGNED
	TLNE	SW,SSF			;SEPARATE SIGN?
	JRST	PD1A			;YES
	TLNN	SW,LSF			;LEADING NON-SEPARATE SIGN?
	JRST	PD6			;NO, MUST BE TRAILING
	PUSH	PP,OPTR			;SAVE OUTPUT PTR
	PUSHJ	PP,PD2			;CONVERT
	POP	PP,OPTR
	ILDB	T1,OPTR			;GET LEADING DIGIT
	JRST	PD6A			;OVERPUNCH IT

PD1A:	PUSHJ	PP,PD7			;RESET CPTR
	TLNN	SW,LSF			;LEADING SIGN?
	JRST	PD1B			;NO
	LDB	T2,CPTR			;GET SIGN
	IDPB	T2,OPTR			;STORE IT
	JRST	PD2			;NOW DO REST

PD1B:	PUSHJ	PP,PD2			;CONVERT
	IBP	OPTR			;ADVANCE TO NEXT BYTE
	JRST	PD6B			;STORE SIGN
>

;CONVERSION ROUTINE:

PD2:	IDIV	T1,	DECTAB(CNT)	;LEFT TRUNCATE IF THE OPERAND
					; IS TOO BIG.
PD3:	MOVE	T1,	T1+1		;GET THE REMAINING DIGITS.
PD3A:	IDIV	T1,	DECTAB-1(CNT)	;GET THE NEXT DIGIT.
	SKIPGE	T1			;[1012] IF RESULT IS NEGATIVE,
	MOVM	T1,	T1		;[1012]  TAKE THE MAGNITUDE
	IORI	T1,	(MASK)		;CONVERT IT.
	IDPB	T1,	OPTR		;STASH IT.
	SOJG	CNT,	PD3		;LOOP IF THERE ARE MORE DIGITS.
	POPJ	PP,			;OTHERWISE RETURN.

;COME HERE TO CONVERT A DOUBLE PRECISION BINARY NUMBER TO DISPLAY.

PD4:
IFN ANS74,<
	TLNE	SW,SSF			;SEPARATE SIGN?
	JRST	PD4A			;YES
	TLNN	SW,LSF			;LEADING NOT SEPARATE?
	JRST	PD4C			;NO, TRAILING SIGN
	TLZ	SW,(1B0)		;TURN OFF SIGN
	PUSH	PP,OPTR			;SAVE 1ST CHAR
	PUSHJ	PP,PD4C			;CONVERT
	POP	PP,OPTR
	ILDB	T1,OPTR			;GET IT BACK
	JRST	PD6A			;OVERPUNCH LEADING DIGIT

PD4A:	PUSHJ	PP,PD7			;RESET CPTR
	TLNN	SW,LSF			;LEADING SIGN?
	JRST	PD4B			;NO
	LDB	T1,CPTR			;GET SIGN
	IDPB	T1,OPTR			;STORE IT
	MOVE	T1,(T2)			;GET HIGH ORDER WORD AGAIN
	JRST	PD4C			;CONVERT REST

PD4B:	PUSHJ	PP,PD4C			;CONVERT FIRST
	IBP	OPTR
	JRST	PD6B			;STORE SIGN IN LASR BYTE

PD4C:>
	MOVE	T2,	1(T2)		;PICK UP THE SECOND WORD OF THE
					; OPERAND.
	JUMPGE	T1,	PD5		;IS IT NEGATIVE?
	SETCA	T1,	T1		;NEGATE THE HIGH ORDER WORD.
	MOVNS		T2		;NEGATE THE LOW ORDER WORD.
	TLZ	T2,	(1B0)		;CLEAR THE SIGN BIT OF THE LOW ORDER WORD.
	SKIPN		T2		;IF THE LOW ORDER WORD IS ZERO.
	ADDI	T1,	1		;BUMP THE HIGH ORDER WORD.

PD5:	DIV	T1,	DEC10		;BREAK OFF THE LAST TEN DIGITS.
	MOVE	SAV10,	T2		;SAVE THEM.
	MOVEI	CNT,	-^D10(CNT)	;REDUCE THE COUNT BY 10.
	PUSHJ	PP,	PD2		;CONVERT THE FIRST N DIGITS.
	MOVE	T1,	SAV10		;GET BACK THE LAST TEN DIGITS.
	MOVEI	CNT,	^D10		;SET UP CNT.
	JUMPGE	SW,	PD3A		;IF WE DON'T HAVE TO WORRY ABOUT
					; SIGNS, GO CONVERT THE DIGITS
					; AND RETURN TO CALLER.

;COME HERE IF WE HAVE TO WORRY ABOUT SIGNS.

PD6:	PUSHJ	PP,	PD2		;CONVERT THE REMAINING N DIGITS.
PD6A:	ANDI	T1,	17		;RESTORE THE NUMBER.
PD6B:	LDB	T1,	CPTR		;PICK UP THE APPROPRIATE SIGNED DIGIT.
	DPB	T1,	IPTR		;STASH IT.
	POPJ	PP,			;AND RETURN.

IFN ANS74,<
PD7:	TLZ	SW,(1B0)		;TURN OFF SIGN REQUIRED
	SUBI	CPTR,SDDTBL
	TRZN	CPTR,-1			;NEGATIVE?
	TROA	CPTR,SDDTBL-1		;+
	HRRI	CPTR,SDDTBL-2		;-
	TLZ	CPTR,17			;TURN OFF INDEX
	POPJ	PP,
>
	SUBTTL	TABLES.

;MASKS TO MAKE A BINARY DIGIT INTO A DISPLAY DIGIT.

NCVTMS:	EXP	20		;SIXBIT.
	EXP	60		;ASCII.
IFN EBCMP.,<
	EXP	360		;EBCDIC.
>

>	;END OF NON-BIS

DC.TB1::
DECTAB::
	DEC	1
	DEC	10
	DEC	100
	DEC	1000
	DEC	10000
	DEC	100000
	DEC	1000000
	DEC	10000000
	DEC	100000000
	DEC	1000000000
DEC10:	DEC	10000000000

DC.TB2::
	OCT	2			;11
	OCT	351035564000
	OCT	35			;12
	OCT	032451210000
	OCT	443			;13
	OCT	011634520000
	OCT	5536			;14
	OCT	142036440000
	OCT	70657			;15
	OCT	324461500000
	OCT	1070336			;16
	OCT	115760200000
	OCT	13064257		;17
	OCT	013542400000
	OCT	157013326		;18
	OCT	164731000000
;TABLE OF SIGNED DISPLAY DIGITS:

IFE	BIS,<

	DEFINE	SDD(A, B, C, D)<	BYTE	(6)B(7)C(8)D>
>

IFN	BIS,<

; PRODUCE TRANSLATION TABLES FOR BIS WITH NEGATIVE OVERPUNCH IN LEFT
;	AND POSITIVE IN RIGHT
	DEFINE	IMAGE(A,B)<A'B>
%IDXX==0

DEFINE	SDD(A,B,C,D)<
IFN ANS74,<
	BYTE	(6)B(7)C(8)D
>
	.XCREF
	IFL	%IDXX-^D10,<	IMAGE(SP,\%IDXX)==B	;;SIXBIT POS
				IMAGE(AP,\%IDXX)==C	;;ASCII POS
				IMAGE(EP,\%IDXX)==D+60	;;EBCDIC POS
			   >
	IFGE	%IDXX-^D10,<	%IDXXX==%IDXX-^D10
				IMAGE(SM,\%IDXXX)==B	;;NEG SIXBIT
				IMAGE(AM,\%IDXXX)==C	;;NEG ASCII
				IMAGE(EM,\%IDXXX)==D	;;NEG EBCDIC
			 >
	IFGE	%IDXX-^D20,<%IDXX==-1>		;;REINITIALIZE
	%IDXX==%IDXX+1				;;INCREMENT
	.CREF
>

; TABLE BUILDING MACRO

DEFINE	CVBDTB(SRC)
<	.XCREF
	%IDX==0
	REPEAT	^D10,<
	XWD	IMAGE(SRC'M,\%IDX),	IMAGE(SRC'P,\%IDX)	
	%IDX==%IDX+1
	>
	.CREF
>


>	;END BIS TABLES


	BYTE	(6)'-'(7)"-"(8)140	;NEGATIVE SIGN
	BYTE	(6)'+'(7)"+"(8)116	;POSITIVE SIGN

SDDTBL:	SDD	+0,20,60,300
	SDD	+1,21,61,301
	SDD	+2,22,62,302
	SDD	+3,23,63,303
	SDD	+4,24,64,304
	SDD	+5,25,65,305
	SDD	+6,26,66,306
	SDD	+7,27,67,307
	SDD	+8,30,70,310
	SDD	+9,31,71,311
	SDD	-0,75,135,320
	SDD	-1,52,112,321
	SDD	-2,53,113,322
	SDD	-3,54,114,323
	SDD	-4,55,115,324
	SDD	-5,56,116,325
	SDD	-6,57,117,326
	SDD	-7,60,120,327
	SDD	-8,61,121,330
	SDD	-9,62,122,331

IFN	BIS,<

;NOW DEFINE THE TABLES

CVBD.6:	CVBDTB(S)		;SIXBIT
CVBD.7:	CVBDTB(A)		;ASCII
CVBD.9:	CVBDTB(E)		;EBCDIC
>

IFE	BIS,<
CVBD.6: CVBD.7: CVBD.9: HALT		;DUMMY ENTRIES FOR NON-BIS

;POINTERS TO THE SIGNED DISPLAY DIGITS:
SDDPTR:	POINT	6,SDDTBL(T1),5
	POINT	7,SDDTBL(T1),12
IFN EBCMP.,<
	POINT	8,SDDTBL(T1),20
>
>

IFN ANS74&BIS,<
SDDPTR:	POINT	6,SDDTBL(SRCHI),5
	POINT	7,SDDTBL(SRCHI),12
	0
	POINT	8,SDDTBL(SRCHI),20

	POINT	6,SDDTBL+^D10(SRCHI),5
	POINT	7,SDDTBL+^D10(SRCHI),12
	0
	POINT	8,SDDTBL+^D10(SRCHI),20
>
IFN	BIS,<

PD6.:	JSP	BISCH,	PD	;SIXBIT
PD7.:	JSP	BISCH,	PD	;ASCII
	BLOCK	1
PD9.:	JSP	BISCH,	PD	;EBCDIC

PD:	SUBI	BISCH,	PD6.-5		;CONVERT TO BYTE SIZE
	LDB	BIST0,	PACFL.##		;GET SOURCE AC FOR LATER
	MOVE	DSTPT,	(PARM)		;GET DESTINATION POINTER
	LDB	DSTCNT,	BSLPT2##	;GET COUNT
	TLZN	DSTPT,3777		;CLEAR BYTE POINTER
	POPJ	PP,			;RETURN IF ZERO
IFN ANS74,<
	TRNN	DSTCNT,(1B7!1B8)	;SPECIAL SIGN?
	JRST	PD1WD			;NO, NORMAL TRAILING OVERPUNCH
	TLZ	DSTPT,4000		;CLEAR SIGN
	DPB	BISCH,BPTOBS		;BUILD BYTE PTR
	PUSH	PP,SRCHI		;GET A FREE ACC
	TRZE	DSTCNT,(1B7)		;SEPARATE SIGN?
	JRST	PD1			;YES
	TRZ	DSTCNT,(1B8)		;NO, LEADING OVERPUNCH
	SKIPGE	(BIST0)
	SKIPA	SRCHI,SDDPTR-2(BISCH)	;NEGATIVE 
	MOVE	SRCHI,SDDPTR-6(BISCH)	;POSITIVE
	EXCH	SRCHI,0(PP)		;SAVE SIGN PTR
	PUSH	PP,[EXP 20,60,0,360]-6(BISCH)	;SAVE MASK
	PUSH	PP,DSTPT		;SAVE INITIAL PTR
	PUSHJ	PP,PD1WD		;CONVERT
	POP	PP,DSTPT		;GET BYTE PTR
	POP	PP,BIST0		;GET MASK
	ILDB	SRCHI,DSTPT		;GET 1ST BYTE
	SUBI	SRCHI,(BIST0)		;GET DIGIT
	POP	PP,BIST0		;GET SIGN PTR
	LDB	SRCHI,BIST0		;CONVERT
	DPB	SRCHI,DSTPT		;STORE BACK
	POPJ	PP,

PD1:	SKIPGE	(BIST0)			;POSITIVE?
	SKIPA	SRCHI,[EXP '-',"-",0,140]-6(BISCH)	;NEGATIVE
	MOVE	SRCHI,[EXP '+',"+",0,116]-6(BISCH)	;POSITIVE
	TRZN	DSTCNT,(1B8)		;LEADING SIGN?
	JRST	PD2			;NO
	IDPB	SRCHI,DSTPT		;YES, STORE SIGN
	POP	PP,SRCHI		;RESTORE
	JRST	PD1WD			;CONTINUE

PD2:	EXCH	SRCHI,0(PP)		;SAVE SIGN
	PUSHJ	PP,PD1WD		;CONVERT
	POP	PP,SRCHI
	IDPB	SRCHI,DSTPT		;STORE IT
	POPJ	PP,

PD1WD:>
	;ONE OR TWO WORDS??
	CAILE	DSTCNT,	^D10
	JRST	PD2WD			;TWO

	;ONE WORD
	TLZE	DSTPT,4000		;SIGNED??
	SKIPA	SRCHI,(BIST0)		;YES - TAKE IT AS IS
	MOVM	SRCHI,(BIST0)		;NO - GET MAGNITUDE
	ASHC	SRCHI,-^D35		;EXTEND SIGN
	JRST	PDGO			;GO

PD2WD:	;TWO WORDS
	TLZN	DSTPT,4000		;SIGNED FIELD??
	JRST	PD2NS			;NO
	DMOVE	SRCHI,(BIST0)		;YES
	JRST	PDGO		;GO

PD2NS:	;UNSIGNED FIELD - TAKE MAGNITUDE
	SKIPL	SRCHI,(BIST0)		;NEGATIVE
	SKIPA	SRCLO,1(BIST0)	;NO
	DMOVN	SRCHI,(BIST0)		;YES - NEGATE AGAIN

PDGO:	;NOW WE ARE READY
	DPB	BISCH,BPTOBS##		;STORE BYTE SIZE IN OUTPUT POINTER

	LSH	BISCH,1			;MULTIPLY INDEX BY 2
PDGOO:	HRLI	BD.FLG,BFLG.S		;TURN ON FOR RIGHT JUSTIFY.
	EXTEND	B.FLAG,	CVBD.T-14(BISCH)	;CONVERT
	JRST	OVFLO			;OVERFLOW
	TLNE	BISCH,-1
	CAIE	BISCH,22		;IF IT ISN'T EBCDIC,
	POPJ	PP,			; RETURN.
	MOVE	BISCH,(PARM)		;GET THE PARAMETER.
	TLNN	BISCH,4000		;IF THE RESULT IS UNSIGNED,
	POPJ	PP,			; RETURN.
	LDB	BISCH,DSTPT		;REGET THE LAST CHAR.
	TRNE	BISCH,40		;IF THE NUMBER IS POSITVE,
	TRZ	BISCH,60		; OVERPUNCH A "+".
	DPB	BISCH,DSTPT		;STASH THE CHAR.
	POPJ	PP,			;RETURN.

CVBD.T:	CVTBDT		CVBD.6		;SIXBIT
	XWD	Z,	SP0
	CVTBDT		CVBD.7		;ASCII
	XWD	Z,	AP0
	XWD	0,	0
	XWD	0,	0
	CVTBDT		CVBD.9		;EBCDIC
	XWD	Z,	EP0
	;THERE WAS AN OVERFLO SO WE MUST GO THROUGH A VARIETY
	; OF MASCENATIONS TO GET COBOLS VERSION OF OVERFLOW WHICH
	; THROWS AWAY THE EXCESS HIGH ORDER DIGITS AND KEEPS THE REST

	T1==SRCCNT-2
	T2==SRCCNT-1
OVFLO:

	JUMPE	PARM,ERROR		;ERROR IF WE HAVE BEEN HERE BEFORE

	SETZ	PARM,

	PUSH	PP,T1			;SAVE REGS
	PUSH	PP,T2

	LSH	DSTCNT,1		;MULTIPLY COUNT BY 2
					;SO IT WILL INDEX INTO THE
					;DOUBLE WORD CONSTANT TABLE
	SKIPL	SRCHI			;NEGATIVE??
	TDZA	T1,T1			;NO ZERO SIGN EXTEND
	SETOI	T1,			;YES
	MOVE	T2,T1
	DDIV	T1,DTAB(DSTCNT)		;DIVIDE BY LARGEST NUMBER THAT
					;WILL FIT AND KEEP THE REMAINDER
	LSH	DSTCNT,-1		;RESTORE COUNTER
	POP	PP,T2
	POP	PP,T1
	JRST	PDGOO			;TRY AGAIN


ERROR:	OUTSTR	[ASCIZ	'?LIBOL PD.N error
']
	POPJ	PP,
; HERE IS ROUTINE TO HANDLE OVERFLOW IF EXTEND DONE INLINE
	ENTRY	CBDOV.		;FOR BIS OVERFLOW
;CALL:
;	MOVEI	AC7,DEST.SIZE
;	MOVEI	AC10,DEST.BYTE.PTR
;	EXTEND	AC4,[CVTBDT @ CVBD.6
;			XWD 0, FILL.CHR]
;	 PUSHJ	PP,CBDOV.##
;	<END CODE>
;

CBDOV.:	PUSH	PP,T1
	PUSH	PP,T2

	LSH	DSTCNT,1
	SKIPL	SRCHI
	TDZA	T1,T1
	SETOI	T1,

	MOVE	T2,T1
	DDIV	T1,DTAB(DSTCNT)
	LSH	DSTCNT,-1

	POP	PP,T2
	HRRZ	T1,-1(PP)	;POINT TO RETURN ADDRESS
	MOVE	T1,-2(T1)	;FETCH EXTEND INSTRUCTION
	EXCH	T1,(PP)		;RESTORE OLD T1, "PUSH" INSTRUCTION
	POP	PP,(PP)		;FIX STACK
	HRLI	BD.FLG,BFLG.S

	XCT	1(PP)		;TRY THE EXTEND AGAIN
	 JRST	ERROR		;? NO GOOD
	POPJ	PP,		;OK THIS TIME, RETURN
SUBTTL	double	macro to generate double-word integers

define shift(a,b)<
;macro to simulate ashc a,1.   treats b as low part.
%s==a_-43			;;%s contains sign of number
a==a_1				;;shift high part
b==b_1				;;shift low part
ifl b,<a==a!1			;;high order bit of low part goes into
>
			;;low order bit of high part
ifn %s-<a_-43>,< printx shift overflowed !!	;;sign change means overflow
>
b==b&<1b0-1>			;;clear low order sign bit
>

define dmul10(a,b)<
;;macro to multiply double word integer in a and b by ten.

%a==a
%b==b			;;make copy of number
shift(%a,%b)		;;multiply number by 2
%%a==%a
%%b==%b			;;make copy of 2*n
shift(%a,%b)
shift(%a,%b)		;;produce 8*n in %a and %b
b==%b+%%b		;;add low order parts
a==%a+%%a		;;add high order parts
ifl b,<a==a+1		;;carry...  we just added 2n + 8n to get 10n.
b==b&<1b0-1>		;;turn off high order bit
>
>



define .dbl(number)		;;generates double word decimal number
<
%high==<%low==0>
irpc number<
dmul10 (%high,%low)		;;multiply by ten
%low==%low+number		;;add in next digit
ifl %low,<%high==%high+1		;;maybe carry
>
ifl %high,<	printx decimal quantity too large. !!
		stopi
	  >
%low==%low&<1b0-1>		;;clear carry bit
>				;;end of irpc
%high
%low				;;store number in core
>				;;end of definition
DTAB:	.dbl	1
	.dbl	10
	.dbl	100
	.dbl	1000
	.dbl	10000
	.dbl	100000
	.dbl	1000000
	.dbl	10000000
	.dbl	100000000
	.dbl	1000000000
	.dbl	10000000000
	.dbl	100000000000
	.dbl	1000000000000
	.dbl	10000000000000
	.dbl	100000000000000
	.dbl	1000000000000000
	.dbl	10000000000000000
	.dbl	100000000000000000
	.dbl	1000000000000000000
	.dbl	10000000000000000000
	.dbl	100000000000000000000
	.dbl	1000000000000000000000


>;END IFN BIS
SUBTTL	D.P. INTEGER POWER OF TEN TABLE		T.W.EGGERS/DMN	6-APR-77

INTERN	HITEN$,	LOTEN$,	EXP10$,	PTLEN$

	;POWER OF TEN TABLE IN DOUBLE PRECISION
	;INTEGER FORMAT. EACH ENTRY CONSISTS OF TWO WORDS,
	;EACH WITH 35 BITS OF FRACTION (SIGNS ARE EXCLUDED).
	;THE BINARY POINT IS BETWEEN BITS 0 AND 1 OF THE
	;HI ORDER WORD. THE EXPONENT (EXCESS 200) FOR THE 70 BIT
	;FRACTION IS STORED IN THE SHORT TABLE CALLED "EXPTEN".
DEFINE .TAB. (A)<
	REPEAT 0,<
	NUMBER 732,357347511265,056017357445	;D-50
	NUMBER 736,225520615661,074611525567
	NUMBER 741,273044761235,213754053125
	NUMBER 744,351656155504,356747065752
	NUMBER 750,222114704413,025260341562
	NUMBER 753,266540065515,332534432117
	NUMBER 756,344270103041,121263540543
	NUMBER 762,216563051724,322660234335
	NUMBER 765,262317664312,007434303425
	NUMBER 770,337003641374,211343364332
	NUMBER 774,213302304735,325716130610	;D-40
	NUMBER 777,256162766125,113301556752
	NUMBER 002,331617563552,236162112545	;D-38
	NUMBER 006,210071650242,242707256537
	NUMBER 011,252110222313,113471132267
	NUMBER 014,324532266776,036407360745
	NUMBER 020,204730362276,323044526457
	NUMBER 023,246116456756,207655654173
	NUMBER 026,317542172552,051631227231
	NUMBER 032,201635314542,132077636440
	NUMBER 035,242204577672,360517606150	;D-30
	NUMBER 040,312645737651,254643547602
	NUMBER 043,375417327624,030014501542
	NUMBER 047,236351506674,217007711035
	NUMBER 052,306044030453,262611673245
	NUMBER 055,367455036566,237354252116
	NUMBER 061,232574123152,043523552261
	NUMBER 064,301333150004,254450504735
	NUMBER 067,361622002005,327562626124
	NUMBER 073,227073201203,246647575664
	>
	NUMBER 076,274712041444,220421535242	;D-20
	NUMBER 101,354074451755,264526064512
	NUMBER 105,223445672164,220725640716
	NUMBER 110,270357250621,265113211102
	NUMBER 113,346453122766,042336053323
	NUMBER 117,220072763671,325412633103
	NUMBER 122,264111560650,112715401724
	NUMBER 125,341134115022,135500702312
	NUMBER 131,214571460113,172410431376
	NUMBER 134,257727774136,131112537675
	NUMBER 137,333715773165,357335267655	;D-10
	NUMBER 143,211340575011,265512262714
	NUMBER 146,253630734214,043034737477
	NUMBER 151,326577123257,053644127417
	NUMBER 155,206157364055,173306466551
	NUMBER 160,247613261070,332170204303
	NUMBER 163,321556135307,020626245364
	NUMBER 167,203044672274,152375747331
	NUMBER 172,243656050753,205075341217
	NUMBER 175,314631463146,146314631463	;D-01
A:	NUMBER 201,200000000000,0	;D00
	NUMBER 204,240000000000,0
	NUMBER 207,310000000000,0
	NUMBER 212,372000000000,0
	NUMBER 216,234200000000,0
	NUMBER 221,303240000000,0
	NUMBER 224,364110000000,0
	NUMBER 230,230455000000,0
	NUMBER 233,276570200000,0
	NUMBER 236,356326240000,0
	NUMBER 242,225005744000,0	;D+10
	NUMBER 245,272207335000,0
	NUMBER 250,350651224200,0
	NUMBER 254,221411634520,0
	NUMBER 257,265714203644,0
	NUMBER 262,343277244615,0
	NUMBER 266,216067446770,040000000000
	NUMBER 271,261505360566,050000000000
	NUMBER 274,336026654723,262000000000
	NUMBER 300,212616214044,117200000000
	NUMBER 303,255361657055,143040000000	;D+20
	REPEAT 0,<
	NUMBER 306,330656232670,273650000000
	NUMBER 312,207414740623,165311000000
	NUMBER 315,251320130770,122573200000
	NUMBER 320,323604157166,147332040000
	NUMBER 324,204262505412,000510224000
	NUMBER 327,245337226714,200632271000
	NUMBER 332,316627074477,241000747200
	NUMBER 336,201176345707,304500460420
	NUMBER 341,241436037271,265620574524
	NUMBER 344,311745447150,043164733651	;D+30
	NUMBER 347,374336761002,054022122623
	NUMBER 353,235613266501,133413263573
	NUMBER 356,305156144221,262316140531
	NUMBER 361,366411575266,037001570657
	NUMBER 365,232046056261,323301053415
	NUMBER 370,300457471736,110161266320
	NUMBER 373,360573410325,332215544004
	NUMBER 377,226355145205,250330436402	;D+38
	NUMBER 402,274050376447,022416546102
	NUMBER 405,353062476160,327122277522	;D+40
	NUMBER 411,222737506706,206363367623
	NUMBER 414,267527430470,050060265567
	NUMBER 417,345455336606,062074343124
	NUMBER 423,217374313163,337245615764
	NUMBER 426,263273376020,327117161361
	NUMBER 431,340152275425,014743015655
	NUMBER 435,214102366355,050055710514
	NUMBER 440,257123064050,162071272637
	NUMBER 443,332747701062,216507551406
	NUMBER 447,210660730537,231114641743	;D+50
	NUMBER 452,253035116667,177340012333
	>
>
DEFINE NUMBER (A,B,C)<	B>

TENTAB:	.TAB. HITEN$

DEFINE NUMBER (A,B,C)<	C>

	.TAB. LOTEN$
PTLEN$==HITEN$-TENTAB	;CALCULATE NUMBER OF TABLE ENTRIES BEFORE "TENS"
XX=PTLEN$
XX=XX-XX/4*4		;CALC XX=XX MOD 4

BINR1=<BINR2=<BINR3=0>>	;INIT THE BINARY

DEFINE NUMBER (A,B,C)<
IFE XX-1,<	BYTE (9) BINR1,BINR2,BINR3,<A>
	BINR1=<BINR2=<BINR3=0>> >
IFE XX-2,<BINR3=A>
IFE XX-3,<BINR2=A>
IFE XX,<BINR1=A
	XX=4>
XX=XX-1>

	.TAB. EXP10$
	IFN BINR1!BINR2!BINR3,<	BYTE (9) BINR1,BINR2,BINR3,0>

	END