.TITLE P$SQRT - SQUARE ROOT .IDENT /831004/ .MCALL .PRINT ; USAGE: ; Y := SQRT(X) ; LONGREAL PARAMETER X ON TOP OF STACK ; LONGREAL RESULT RETURNED ON TOP OF STACK ; REGISTER USAGE: ; R0,R1 - SCRATCH ; R2 - SCRATCH (SAVED/RESTORED) ; F0,F1,F2 - SCRATCH (SAVED/RESTORED) ; CALLS: ; P$HERR ; F0=%0 F1=%1 F2=%2 $$$101:: P$SQRT:: MOV R2,-(SP) ;SAVE R2 STD F0,-(SP) STD F1,-(SP) ;SAVE F0-F2 STD F2,-(SP) MOV 28.(SP),R1 ;HIGH ORDER ARG BMI 3$ ;ARGUMENT MUST BE >= 0 BEQ 4$ ;ZERO RESULT MOV 30.(SP),R2 ;2ND WORD OF ARG ASR R1 ROR R2 ADD #020100,R1 ;INITIAL ESTIMATE E CLR -(SP) CLR -(SP) ;USE HIGH ORDER PART FIRST MOV R2,-(SP) MOV R1,-(SP) MOV #4,R0 ;SET ITERATION COUNT LDD (SP)+,F0 ;LOAD COPY OF E LDD 28.(SP),F2 ;LOAD COPY OF X 2$: LDD F0,F1 ;E=E' LDD F2,F0 ;X DIVD F1,F0 ;X/E ADDD F1,F0 ;X/E + E DEC R0 ;DECREMENT COUNT DIVD #^O040400,F0 ;E'=(X/E + E)/2 BGT 2$ BR ENDSQT 3$: .PRINT #NSQRER ;ERROR, SQRT OF A NEGATIVE 4$: CLRD F0 ;RESULT=0 ENDSQT: STD F0,28.(SP) ;PUT RESULT ON STACK LDD (SP)+,F2 LDD (SP)+,F1 LDD (SP)+,F0 MOV (SP)+,R2 RTS PC NSQRER: .ASCIZ /? SQRT(-N)/ .EVEN .END