	.TITLE	.SQRT
/
/
/ INTERNAL GLOBALS
	.GLOBL	SQRT,.SQRT
/ EXTERNAL GLOBLS
	.GLOBL	.SIGNA,.EXPA,.MOSTA,.LESTA
	.GLOBL	.GRAB,.SNGL,.ERROR
/
/
/
/   THE SQUARE ROOT ROUTINES TAKE A VALUE FROM ACC A AND
/   PLACE THE ROOT IN ACC A
SQRT	XX
	JMS*	.GRAB
	JMS	.SQRT
	JMP*	SQRT
/
.SQRT	XX
	JMS*	.SNGL	/CHECK MODE
	LAW	-1
	SAD*	.EXPA	/DOES EXPA=-0?
	DZM*	.EXPA	/YES - SET EXPA=+0
	LAC*	.SIGNA
	SMA
	JMP	.+3
ERRNS	LAW	6	/ ERROR - NEGATIVE SQUARE ROOT ARGUMENT
	JMS*	.ERROR
	LAC*	.EXPA
	SPA!RAR
	SZL!CLL
	SZL		/EXPA IS POS AND ODD
	JMP	ODD	/EXPA IS NEG AND ODD
	LAC*	.MOSTA	/EXPA IS POS OR NEG AND EVEN
	SNA
	JMP*	.SQRT
	RAL
	SMA!CLL!CMA
	JMP	ONES	/110001...>MOSTA>100100...  SIGNB=320000
	TAD	(420000
	SMA!CLL
	JMP	ONES1
	LAC	(360000	/MOSTA>110001...  SIGNB=360000
GO5	DAC	SIGNB
	LAC*	.LESTA
	LMQ
	LAC*	.MOSTA
	LRS	2	/SHIFT MOSTA.LEASTA 2 RIGHT
	DAC*	.MOSTA
	LAC*	.EXPA
	SPA!STL		/IS EXPA POSITIVE?
	JMP	SQRNEG	/NO
	RCR		/YES - DIV BY 2 AND STORE
	DAC*	.EXPA
	SNL!CLL		/WAS LINK SET?
	JMP	NOSHFT	/NO
	ADD	(1	/YES : INCREMENT EXPA
	DAC*	.EXPA
XCX	LAC*	.MOSTA	/AND ROTATE MOSTA.LEASTA ONCE MORE
	LRS	1
	DAC*	.MOSTA
NOSHFT	LACQ
	DAC*	.LESTA
	LAW	-3
	DAC	EXPB
GO	LAC*	.LESTA
	LMQ
	CLL
	LAC	SIGNB
	DAC	.+3
	LAC*	.MOSTA
	DIV		/PERFORM (MOSTA.LEASTA)/SIGNB
	0
	DAC	MOSTB	/SAVE REMAINDER
	LACQ
	TAD	SIGNB
	RAR		/DIVIDED BY 2
	DAC	SIGNB	/ = C FOR NEXT ITERATION
	ISZ	EXPB	/EXPB = 0?
	JMP	GO	/NO - GO AGAIN
	RAL
	DAC*	.MOSTA
	LAC	SIGNB
	DAC	.+3
	LAC	MOSTB
	FRDIV
	0
	LACQ
	DAC*	.LESTA
	DZM*	.SIGNA
	JMP*	.SQRT
SQRNEG	RAR		/DIVIDE BY 2
	DAC*	.EXPA
	SZL!CLL
	JMP	NOSHFT
	JMP	XCX
ODD	LAC*	.MOSTA
	RAL
	SPA!CLL!CMA
	JMP	.+3	/100100...>MOSTA>011010...  SIGNB=260000
	LAC	(220000	/011010...>MOSTA>010000...  SIGNB=220000
	JMP	GO5
	TAD	(440000
	SMA!CLL
	JMP	.-4
	LAC	(260000
	JMP	GO5
ONES	TAD	(100000
	SMA!CLL
	JMP	.-4
ONES1	LAC	(320000
	JMP	GO5
/
/ WORK AREAS
SIGNB;EXPB;MOSTB;LEASTB
/
	.END
