.TITLE VMAG MAGNITUDE OF VECTOR .IDENT /1.0/ ; 08/15/79 ;+ ++EXTSPC>> ;.NAME VMAG ;.INDEX V3MAG ;.INDEX VMAGD ;.INDEX V3MAGD ;.TITLE FUNCTION VMAG ; ; VMAG (A,N) ; ; V3MAG (A) ; ; VMAGD (A,N) ; ; V3MAGD (A) ; ; VERSION: VECTOR / MATRIX ROUTINES SAM MILLER REL 1.0 ; ; FUNCTION: ; ; MAGNITUDE OF VECTOR ; ; [ A(1)*A(1) + A(2)*A(2) + ... + A(N)*A(N) ] 1/2 ; ; ; LANGUAGE: MACRO-11 ; ; ; ARGUMENTS: ; ; A = INPUT VECTOR ; N = VECTOR DIMENSION ; ; ; COMMONS: ; ; (NONE) ; ; ; GENERAL DESCRIPTION: ; ; A IS REAL AND N IS INTEGER. ; ; ; SINGLE PRECISION - VMAG FOR N-VECTORS ; V3MAG FOR 3-VECTORS ; ; DOUBLE PRECISION - VMAGD FOR N-VECTORS ; V3MAGD FOR 3-VECTORS ; ; NOTE -- SINGLE PRECISION ROUTINE MAINTAINS ACCURACY BY ; ACCUMULATING INTERMEDIATE QUANTITIES AS DOUBLE PRECISION ; ; ; PERIPHERAL INPUT/OUTPUT: ; ; (NONE) ; ; ; LOGICAL UNIT USAGE: ; ; (NONE) ; ; ; EXTERNAL ROUTINES CALLED: ; ; $$DSQR - DOUBLE PRECISON SQUARE ROOT ; NAM$ ; $BOMB ; ;- --EXTSPC>> ; ; WRITTEN BY: ; ; DENIS MAHONY AND SAM MILLER 08/15/79 ; ; ; MODIFIED BY: ; ; ********** **DATE** ; **DETAIL** ; ;- --EXTSPC>> .PAGE .GLOBL VMAG, V3MAG, $$DSQR .ENABL LSB ; F0=R0 ;DEFINE FLOATING REGISTER 0 F1=R1 ;DEFINE FLOATING REGISTER 1 V3MAG: CMP #1,(R5)+ ;CHECK NUMBER OF ARGUMENTS BNE BOMB3 ;BOMB IF # OF ARGS. NE 1 MOVB #3,R2 ;R2=VECTOR SIZE=3 BR 10$ VMAG: CMP #2,(R5)+ ;ARE THERE 2 ARGUMENTS? BNE BOMB ;BOMB IF # OF ARGS. NE 2 MOVB @2(R5),R2 ;R2=VECTOR SIZE=N 10$: MOV (R5),R3 ;R3=ADDRESS OF A SETD ;SET FLOATING DOUBLE MODE CLRD F0 ;INITIALIZE MAGNITUDE TO 0 ; LOOP TO FORM MAGNITUDE OF VECTOR 20$: LDCFD (R3)+,F1 ;GET A(I) MULD F1,F1 ;A(I)*A(I) ADDD F1,F0 ;SUM OF A(I)*A(I) SOB R2,20$ ;DONE? JSR PC,$$DSQR ;TAKE SQUARE ROOT ; PLACE SINGLE PRECISION NUMBER ON STACK AND POP OFF INTO ; REGISTERS R0 AND R1 SINCE THAT IS CONVENTION FOR RETURN ; OF REAL*4 FUNCTIONAL VALUE STCDF F0,-(SP) MOV (SP)+,R0 MOV (SP)+,R1 RTS PC ;RETURN BOMB3: MOV #3530,-(SP) ;MOVE 2ND HALF OF NAME TO STACK MOV #107265,R4 ;MOVE 1ST HALF OF NAME TO R4 BR 30$ BOMB: MOV #25700,-(SP) ;MOVE 2ND HALF OF NAME TO STACK MOV #105611,R4 ;MOVE 1ST HALF OF NAME TO R4 30$: JSR R4,NAM$ ;SUBR TO PUT NAME IN WALKBACK JMP $BOMB ;ABORT, $BOMB DOES NOT EXIST .END