.TITLE ISQRT ;INTEGER SQUARE ROOT FUNCTION .IDENT 'V001A' ; ; THIS ROUTINE IS RE-ENTRANT AND POSITION-INDEPENDENT. ; ; THIS ROUTINE USES THE NEWTON-RAPHSON METHOD TO CALCULATE THE SQUARE ; ROOT OF A ONE-WORD INTEGER QUANTITY. THE (I+1)-TH APPROXIMATION IS ; GIVEN BY: ; ; N(I+1) = (N(I) + ARG / N(I)) / 2 ; ; WHERE N(I) IS THE I-TH APPROXIMATION OF SQRT(ARG). THE ; STARTING VALUE USED IS N(1) = ARG / 2. ; ; CALLING SEQUENCE: ; N=ISQRT(NARG) ; WHERE NARG IS AN INTEGER*2 ARGUMENT AND THE FUNCTION RETURNS AN ; INTEGER*2 RESULT (IN REGISTER R0). OTHER REGISTER CONTENTS ARE ; SAVED. FOR NEGATIVE ARGUMENT, THE ARGUMENT ITSELF IS RETURNED IN R0. ; .PSECT ISQTRO,RO ; ISQRT:: MOV R1,-(SP) ;SAVE REGISTER CONTENTS MOV R2,-(SP) MOV R3,-(SP) MOV @2(R5),R0 ;GET ARGUMENT BLE 3$ ;IF ZERO OR NEGATIVE, RETURN ARG IN R0 MOV R0,R3 ;FIRST APPROXIMATION VALUE... ASR R3 ;...IS ARGUMENT / 2 BEQ 3$ ;ISQRT(1) = 1 MOV R0,R2 ;SAVE ARGUMENT 1$: MOV R2,R1 ;GET ARGUMENT CLR R0 ;HIGH ORDER ZERO DIV R3,R0 ;DIVIDE BY APPROXIMATION ADD R3,R0 ;ADD APPROXIMATION ASR R0 ;DIVIDED BY 2 IS NEW APPROXIMATION CMP R0,R3 ;COMPARE WITH PREVIOUS ITERATION BEQ 2$ ;CONVERGED BGT 3$ ;OVERCONVERGED MOV R0,R3 ;SAVE PRESENT ITERATION VALUE BR 1$ ;KEEP GOING 2$: ASL R2 ;ARGUMENT TIMES 2 MOV R0,R1 ;GET APPROXIMATION N(I) MUL R0,R1 ;SQUARE IT SUB R1,R2 ;2*ARG - N(I)**2 INC R3 ;ONE GREATER THAN N(I) MOV R3,R1 ;GET N(I)+1 MUL R3,R1 ;SQUARE IT SUB R1,R2 ;2*ARG - N(I)**2 - (N(I)+1)**2 BLOS 3$ ;N(I) IS CLOSER TO CORRECT VALUE MOV R3,R0 ;N(I)+1 IS CLOSER 3$: MOV (SP)+,R3 ;RESTORE CONTENTS OF REGISTERS MOV (SP)+,R2 MOV (SP)+,R1 RTS PC ; .END