.TITLE MADD ADDITION OF TWO MATRICES .IDENT /1.0/ ; 08/15/79 ;+ ++EXTSPC>> ;.NAME MADD ;.INDEX M3ADD ;.INDEX MPADD ;.INDEX MADDD ;.INDEX M3ADDD ;.INDEX MPADDD ;.TITLE SUBROUTINE MADD ; ; CALL MADD (C,A,B,M,N) ; ; CALL M3ADD (C,A,B) ; ; CALL MPADD (C,A,B,M,N,NRA,NRB,NRC) ; ; CALL MADDD (C,A,B,M,N) ; ; CALL M3ADDD (C,A,B) ; ; CALL MPADDD (C,A,B,M,N,NRA,NRB,NRC) ; ; ; VERSION: VECTOR / MATRIX ROUTINES SAM MILLER REL 1.0 ; ; FUNCTION: ; ; MATRIX ADDITION ; ; C = A + B ; ; ; LANGUAGE: MACRO-11 ; ; ; ARGUMENTS: ; ; C = OUTPUT MATRIX (RESULT IS STORED IN UPPER M X N SUBMATRIX) ; A,B = INPUT MATRICES ; M,N = UPPER M X N SUBMATRICES ARE SUMMED ; NRA = NUMBER OF ROWS IN A ; NRB = NUMBER OF ROWS IN B ; NRC = NUMBER OF ROWS IN C ; ; ; COMMONS: ; ; (NONE) ; ; ; GENERAL DESCRIPTION: ; ; REAL ARGUMENTS: C,A,B ; INTEGER ARGUMENTS: M,N,NRA,NRB,NRC ; ; ; SINGLE PRECISION - MADD FOR MXN MATRICES ; M3ADD FOR 3X3 MATRICES ; MPADD FOR UPPER MXN SUB MATRICES ; ; DOUBLE PRECISION - MADDD FOR MXN MATRICES ; M3ADDD FOR 3X3 MATRICES ; MPADDD FOR UPPER MXN SUB MATRICES ; ; ; ; ; 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 MADD, M3ADD, MPADD .ENABL LSB ; F0=R0 ;DEFINE FLOATING REGISTER 0 F1=R1 ;DEFINE FLOATING REGISTER 1 M3ADD: CMP #3,(R5)+ ;CHECK FOR 3 ARGUMENTS BNE BOMB3 ;BOMB IF # OF ARGS. NE 3 MOV #3,R0 ;R0=M=3 MOV #3,R1 ;R1=N=3 MOV #3,-(SP) ;MOVE M ON STACK BR 20$ MADD: CMP #5,(R5)+ ;CHECK FOR 5 ARGUMENTS BNE BOMB ;BOMB IF # OF ARGS. NE 5 MOV @6(R5),R0 ;R0=M MOV @10(R5),R1 ;R1=N MOV R0,-(SP) ;MOVE M ON STACK 20$: MOV #0,-(SP) ;MOVE 4*(NRB-M)=0 ON STACK MOV #0,-(SP) ;MOVE 4*(NRC-M)=0 ON STACK MOV #0,R2 ;R2=4*(NRA-M)=0 BR 40$ MPADD: CMP #10,(R5)+ ;ARE THERE 8 ARGUMENTS? BNE BOMBP ;BOMB IF # OF ARGS. NE 8 MOV @6(R5),R0 ;R0=M MOV @10(R5),R1 ;R1=N MOV R0,-(SP) ;MOVE M ON STACK MOV @12(R5),R2 ;GET NRA SUB R0,R2 ;NRA-M ASH #2,R2 ;R2=4*(NRA-M) MOV @14(R5),R3 ;GET NRB SUB R0,R3 ;NRB-M ASH #2,R3 ;4*(NRB-M) MOV R3,-(SP) ;MOVE 4*(NRB-M) ON STACK MOV @16(R5),R3 ;GET NRC SUB R0,R3 ;NRC-M ASH #2,R3 ;R3=4*(NRC-M) MOV R3,-(SP) ;MOVE 4*(NRC-M) ON STACK 40$: MOV (R5)+,R3 ;R3=ADDRESS OF C MOV (R5)+,R4 ;R4=ADDRESS OF A MOV (R5),R5 ;R5=ADDRESS OF B SETF ;SET FLOATING MODE BR 60$ ;LOOP TO ADD 2 MATRICES 50$: ADD (SP),R3 ;GO TO START OF NEXT COLUMN OF C ADD R2,R4 ;GO TO START OF NEXT COLUMN OF A ADD 2(SP),R5 ;GO TO START OF NEXT COLUMN OF B MOV 4(SP),R0 ;RESET M 60$: LDF (R4)+,F0 ;A(I) LDF (R5)+,F1 ;B(I) ADDF F0,F1 ;A(I)+B(I) STF F1,(R3)+ ;C(I)=A(I)+B(I) SOB R0,60$ ;DONE WITH THIS COLUMN? SOB R1,50$ ;DONE WITH ALL COLUMNS? ADD #6,SP ;RESTORE STACK RTS PC ;RETURN BOMB3: MOV #14640,-(SP) ;MOVE 2ND HALF OF NAME TO STACK MOV #53151,R4 ;MOVE 1ST HALF OF NAME TO R4 BR 70$ BOMBP: MOV #14640,-(SP) ;MOVE 2ND HALF OF NAME TO STACK MOV #51701,R4 ;MOVE 1ST HALF OF NAME TO R4 BR 70$ BOMB: MOV #14400,-(SP) ;MOVE 2ND HALF OF NAME TO STACK MOV #50554,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