/ 
/ 
/                   FIRST PRINTING, FEBRUARY 1974
/ 
/ THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO 
/ CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED
/ AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
/ DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPON-
/ SIBILITY FOR ANY ERRORS THAT MAY APPEAR IN THIS
/ DOCUMENT.
/ 
/ THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FUR-
/ NISHED TO THE PURCHASER UNDER A LICENSE FOR USE ON
/ A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH
/ INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR 
/ USE IN SUCH SYSTEM, EXCEPT AS MAY OTHERWISE BE PRO-
/ VIDED IN WRITING BY DIGITAL.
/ 
/ DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/ FOR THE USE OR RELIABILITY OF ITS SOFTWARE ON EQUIP-
/ MENT THAT IS NOT SUPPLIED BY DIGITAL.
/ 
/ COPYRIGHT (C) 1974, BY DIGITAL EQUIPMENT CORPORATION
/ 
/ 
        .EJECT
/COPYRIGHT 1971,1973, DIGITAL EQUIPMENT CORP., MAYNARD MASS.
/EDIT # 010 8 JAN 73 T.A.M
/         5-24-71  *REF*
	.TITLE	.BC	/REAL BASE(A) TO INTEGER (AND DBL INTEGER) POWERS(B)
/CALLING SEQUENCE:
/SINGLE INTEGER POWER
/	JMS* .BC	BASE IN FAC(FPP AC))
/	ADDR		/ADDR OF B(XCT ADDR IF INDIRECT
/	NEXT INSTR.	/SUBR. RETURN (RESULT IN FAC(FPP AC))
/DOUBLE(EXTENDED)INTEGER POWER
/	JMS* .BL	BASE IN FAC(FPP AC)
/	ADDR		ADDR OF B(XCT ADDR IF INDIRECT)
/	NEXT INSTR.	SUBR RETURN(RESULT IN FAC(FPP AC)
	.DEFIN	FOPDEF,NAME,SUBR,INST
	.IFDEF	%FPP
	.DEFIN	NAME
	INST
	.ENDM
	.ENDC
	.IFUND	%FPP
	.GLOBL	SUBR
	.DEFIN	NAME
	JMS*	SUBR
	.ENDM
	.ENDC
	.ENDM
	.GLOBL	.BC,.BL
	FOPDEF	FLD%,.AG,713050
	FOPDEF	FST%,.AH,713640
	FOPDEF	FMP%,.AK,711440
	FOPDEF	FDV%,.AL,712040
/
.BC	CAL	0		/R**I
	LAC	.BC
	CLL		/INDICATE EXPONENT IS INTEGER
	JMP	.+4
.BL	CAL	0		/R**J
	CLL!CML		/INDICATE EXPONENT IS D.I.
	LAC	.BL
	DAC	R	/SAVE RETURN ADDRESS
	LAC*	R
	DAC	A
	SPA
	LAC*	A
	DAC	A
	LAC*	A	/GET HIGH ORDER EXP
	ISZ	R
	DAC	E1
	ISZ	A
	SZL		/AVOID ACCESSING 2ND PART OF D.I. IF INTEGER (EDIT 010)
	LAC*	A
	LMQ		/LOW ORDER EXP INTO MQ
	LAC	E1
	SNL		/IF EXPONENT IS AN INTEGER,
	LRSS	22	/MAKE IT A DOUBLE INTEGER
	SMA!CLL
	JMP	.+3
	CMQ		/IF EXP NEGATIVE, SET IT POSITIVE
	CMA!CML
	DAC	E1	/THIS IS, WITHOUT A DOUBT
	LACQ
	DAC	E2	/THE UGLIEST ROUTINE TO DO A TWO'S COMPLEMENT
	SZL
	ISZ	E2	/THAT I HAVE EVER WRITTEN.
	SKP
	ISZ	E1
	NOP		/THE DREADFUL DEED IS DONE!
	GLK
	DAC	MDIV	/LINK BECOMES MULTIPLY/DIVIDE FLAG
	FST%
	.DSA	BASE
	FLD%
	.DSA	ONE	/INITIALIZE RESULT TO 1
.BLOOP	LAC	E1
	RCR		/HERE WE GO LOOP DE LOOP
	DAC	E1
	LAC	E2
	RAR
	DAC	E2
	SNL		/LOW ORDER BIT ZERO?
	JMP	.BTEST	/YES - DON'T CHANGE RESULT
	LAC	MDIV
	SNA
	JMP	.BMULT	/DECIDE WHETHER TO MULTIPLY OR DIVIDE
	FDV%
	.DSA	BASE
	JMP	.BTEST
.BMULT	FMP%
	.DSA	BASE
.BTEST	LAC	E1
	SNA
	LAC	E2
	SNA!CLA		/IF BOTH HALVES OF THE EXPONENT ARE 0,..
	JMP*	R	/CALL IT A DAY
	FST%
	.DSA	TEMP	/SAVE THE RESULT TEMPORARILY
	FLD%
	.DSA	BASE	/SO WE CAN SQUARE THE BASE
	FMP%
	.DSA	BASE
	FST%
	.DSA	BASE
	FLD%
	.DSA	TEMP	/NOW RELOAD THE RESULT
	JMP	.BLOOP	/LOOP TILL EXPONENT ZERO
BASE	.BLOCK	3
TEMP	.BLOCK	3
ONE	1
	200000
	0
R	0
A	0
E1	0
E2	0
MDIV	0
	.END
