	.TITLE	.CSPRT
/
/  23 APR 73 (PDH) CHECK SIGN OF REAL PART
/  28 FEB 73 (MKH) ' JMS .GRAB' TO FETCH ARGUMENT
/
/ SINGLE PRECISION COMPLEX SQUARE ROOT
/
	.GLOBL	CSQRT
	.GLOBL	.SQRT,.SPRDV,.SPADD,.SPRST,.SPRLD
	.GLOBL	.SWPIT,.SWPUS,.SWPBI,.SWPIB,.SPBIA,.MVIMA
	.GLOBL	.CHKMS,.SPCAB,.MODCN,.ADDR1
	.GLOBL	.MODEA,.SIGNA,.EXPA,.MOSTA,.SGNIA,.MSTIA,.EXPB
	.GLOBL	.GRAB
/
CSQRT	XX
	JMS*	.GRAB
	JMS*	.CHKMS	/SET MODE
	LAC*	.SIGNA		/MUST ALWAYS TAKE ROOT IF REAL PART
	SNA			/ IS NEGATIVE
	LAC*	.MSTIA
	SZA
	JMP	CSQINZ	/AI.NE.0, CALCULATE COMPLEX ROOT
	SAD*	.MOSTA
	JMP	CSQEXT	/EXIT IF A=AI=0
	LAC*	.MODEA
	JMS*	.SQRT	/AI=0, TAKE REAL SQUARE ROOT
	JMP	CSQEXT
CSQINZ	LAC*	.SIGNA
	DAC	SIGN	/SAVE SIGNA
	DZM*	.SIGNA	/ABS(A)
	LAC	.ADDR1
	JMS*	.SPRST	/SAVE A
	JMS*	.SPCAB	/ABS(A,AI)
	LAC	.ADDR1
	JMS*	.SPRLD	/GET A
	JMS*	.SPADD
	LAW	-2	/-1 IN 2'S COMPLEMENT
	ADD*	.EXPA
	DAC*	.EXPA
	LAC*	.MODEA
	JMS*	.SQRT	/((ABS(X)+ABS(Z))/2)**0.5
	JMS*	.SWPBI	/A TO BI
	JMS*	.SWPIB	/BI TO B
	JMS*	.SWPIT	/AI TO A
	ISZ*	.EXPB
	SKP
	JMP	.-2	/-0 TO +0, TRY AGAIN
	JMS*	.SPRDV
	LAC	SIGN
	SZA
	JMP	CXNEG
	JMS*	.SWPUS	/X>0, A TO AI
	JMS*	.SPBIA	/BI TO A
CSQEXT	JMS*	.MODCN	/RESTORE MODE
	JMP*	CSQRT
CXNEG	JMS*	.MVIMA	/X<0, BI TO AI
	LAC*	.SIGNA	/SET UP SIGNS
	DAC*	.SGNIA
	DZM*	.SIGNA
	JMP	CSQEXT
/
SIGN
/
	.END
