.TITLE MTRN TRANSPOSE A MATRIX .IDENT /1.0/ ; 08/15/79 ;+ ++EXTSPC>> ;.NAME MTRN ;INDEX M3TRN ;INDEX MPTRN ;INDEX MTRND ;INDEX M3TRND ;INDEX MPTRND ;.TITLE SUBROUTINE MTRN ; ; CALL MTRN (C,A,M,N) ; ; CALL M3TRN (C,A) ; ; CALL MPTRN (C,A,M,N,NRA,NRC) ; ; CALL MTRN (C,A,M,N) ; ; CALL M3TRND (C,A) ; ; CALL MPTRND (C,A,M,N,NRA,NRC) ; ; VERSION: VECTOR / MATRIX ROUTINES SAM MILLER REL 1.0 ; ; FUNCTION: ; ; MATRIX TRANSPOSE ; ; C = A(TRANSPOSE) ; ; ; LANGUAGE: MACRO-11 ; ; ; ARGUMENTS: ; ; C = OUTPUT MATRIX (RESULT IS STORED IN UPPER N X M SUBMATRIX) ; A = INPUT MATRIX ; M,N = UPPER M X N SUBMATRX OF A IS USED ; NRA = NUMBER OF ROWS IN A ; NRC = NUMBER OF ROWS IN C ; ; ; COMMONS: ; ; (NONE) ; ; ; GENERAL DESCRIPTION: ; ; REAL ARGUMENTS: C,A ; INTEGER ARGUMENTS: M,N,NRA,NRC ; ; ; SINGLE PRECISION - MTRN FOR MXN MATRICES ; M3TRN FOR 3X3 MATRICES ; MPTRN FOR UPPER MXN SUBMATRICES ; ; DOUBLE PRECISION - MTRND FOR MXN MATRICES ; M3TRND FOR 3X3 MATRICES ; MPTRND FOR UPPER MXN SUBMATRICES ; ; ; ; PERIPHERAL INPUT/OUTPUT: ; ; (NONE) ; ; ; LOGICAL UNIT USAGE: ; ; (NONE) ; ; ; EXTERNAL ROUTINES CALLED: ; ; NAM$ ; $BOMB ; ;- --EXTSPC>> ; ; WRITTEN BY: ; ; DENIS MAHONY AND SAM MILLER 08/15/79 ; ; ; MODIFIED BY: ; ; ********** **DATE** ; **DETAIL** ; ;- --EXTSPC>> .PAGE .GLOBL MTRN, M3TRN, MPTRN .ENABL LSB F0=R0 ;DEFINE FLOATING REGISTER 0 ; M3TRN: CMP #2,(R5)+ ;CHECK FOR 2 ARGUMENTS BNE BOMB3 ;BOMB IF # OF ARGS. NE 2 MOV #3,R0 ;R0=M=3 MOV #3,R1 ;R1=N=3 MOV #3,-(SP) ;MOVE M ON STACK BR 20$ MTRN: CMP #4,(R5)+ ;CHECK FOR 4 ARGUMENTS BNE BOMB ;BOMB IF # OF ARGS. NE 4 MOV @4(R5),R0 ;R0=M MOV @6(R5),R1 ;R1=N MOV R0,-(SP) ;MOVE M ON STACK 20$: MOV #0,-(SP) ;MOVE NRA-M=0 ON STACK MOV R1,R2 ;GET NRC=N ASH #2,R2 ;R2=4*NRC BR 40$ MPTRN: CMP #6,(R5)+ ;CHECK NUMBER OF ARGUMENTS BNE BOMBP ;BOMB IF # OF ARGS. NE 6 MOV @4(R5),R0 ;R0=M MOV @6(R5),R1 ;R1=N MOV R0,-(SP) ;MOVE M ON STACK MOV @10(R5),R2 ;GET NRA SUB R0,R2 ;NRA-M ASH #2,R2 ;4*(NRA-M) - 4 BYTES FOR SINGLE MOV R2,-(SP) ;MOVE 4*(NRA-M) ON STACK MOV @12(R5),R2 ;GET NRC ASH #2,R2 ;R2=4*NRC 40$: MOV (R5)+,R3 ;R3=ADDRESS OF C MOV (R5),R4 ;R4=ADDRESS OF A MOV R3,R5 ;R5=ADDRESS OF C SETF ;SET FLOATING MODE BR 60$ ;LOOP TO TRANSPOSE MATRIX 50$: ADD #4,R5 ;GO TO START OF NEXT ROW OF C MOV R5,R3 ;AND RESET ADDRESS OF C ADD (SP),R4 ;GO TO START OF NEXT COLUMN OF A MOV 2(SP),R0 ;RESET M 60$: LDF (R4)+,F0 ;F0=TRANSPOSED ELEMENT STF F0,(R3) ;STORE TRANSPOSED ELEMENT ADD R2,R3 ;GO TO NEXT COLUMN OF C SOB R0,60$ ;DONE WITH THIS COLUMN? SOB R1,50$ ;DONE WITH ALL COLUMNS? ADD #4,SP ;RESTORE STACK RTS PC ;RETURN BOMBP: MOV #71260,-(SP) ; MOVE 2ND HALF OF NAME TO STACK MOV #51724,R4 ; MOVE 1ST HALF OF NAME TO R4 BR 70$ BOMB3: MOV #71260,-(SP) ; MOVE 2ND HALF OF NAME TO STACK MOV #53174,R4 ; MOVE 1ST HALF OF NAME TO R4 BR 70$ BOMB: MOV #53600,-(SP) ; MOVE 2ND HALF OF NAME TO STACK MOV #52162,R4 ; MOVE 1ST HALF OF NAME TO R4 70$: JSR R4,NAM$ ; SUBR TO PUT NAME IN WALKBACK JMP $BOMB ; ABORT, $BOMB DOES NOT EXIST .END