.NLIST TTM .TITLE UTILS .IDENT /RICE02/ ; PACKAGE OF UTILITIES USEFUL TO FORTRAN ; PROGRAMS .GLOBL R5CHEK ; INCREMENT A 2-WORD INTEGER ; CALL INC2W(A) A=2WORD INTEGER INC2W:: MOV #1,R0 ;1 INPUT,OUTPUT PARAMETER JSR PC,R5CHEK MOV (R5)+,R0 ;GET 2 WORD INTEGER TO INCREMENT ADD #1,(R0)+ ;ADD 1 WORD TO LOW ORDER BITS ADC (R0) ;ADD ON CARRY TO HI ORDER WORD RTS PC ;************************** FORTRAN ENTRY *************************** ; ; ************* ; ; INCREMENT A 1 WORD INTEGER ; CALL INC1(ICTS) .GLOBL INC1 INC1: MOV #1,R0 ;1 PARAM JSR PC,R5CHEK ;CHECK # PARAM INCC: INC @(R5)+ RTS PC ; ; ********** ; ; ; ********** ; ;************************** FORTRAN ENTRY *************************** ; ZERO AN INTEGER BUFFER , ISIZE = # OF WORDS ; CALL ZERO(IB(1),ISIZE) .GLOBL ZERO ZERO: MOV #2,R0 ;2 PARAM JSR PC,R5CHEK ;CHECK # PARAM MOV (R5)+,R0 ;ADDRESS MOV @(R5)+,R1 ;# TO ZERO 1$: CLR (R0)+ ;CLEAR 1 ADDR SOB R1,1$ RTS PC ; ; ********** ; ;************************** FORTRAN ENTRY *************************** ; SEPARATES 1 WORD INTO 16 WORDS VIA BITS ; CALL SEP(CODE WD,ARRAY OF CODE WD) .GLOBL SEP,SWCHD SEP: MOV #2,R0 ;2 PARAM JSR PC,R5CHEK ;CHECK # PARAM MOV @(R5)+,R1 ;CODE WORD MOV (R5)+,R2 MOV #16.,R3 ;SEPARATE 16 BITS JSR PC,SLP RTS PC ; ; ***** ASSEMBLY LANG ENTRY ***** ; R1 CONTAINS BYTE TO SEPARATE ; R2 CONTAINS ADDRESS OF ARRAY (8 WDS.) CODE ; ; SWCHD MOVES FROM 1 BYTE OF SW32 TO 8 WORDS(1 BIT EACH) SWCHD: MOV #8.,R3 ;DIVIDE 8 SWITCHES INTO 8 WORDS SLP: 1$: CLR (R2) ;SET TO ZERO ROR R1 ADC (R2)+ ;IF RH BIT WAS NON ZERO SET TO 1 SOB R3,1$ RTS PC ;************************** FORTRAN ENTRY *************************** .GLOBL IZTOT,R5CHEK ; CALL IZTOT(IARRAY,ISIZE) IZTOT ; NO = IZTOT(IARRAY,ISIZE) ; NO IS THNE THE NUMBER OF NON ZERO ELEMENTS IN THE ARRAY IZTOT: MOV #2,R0 ;2 PARAM TO INPUT JSR PC,R5CHEK ;CHECK THE NUMBER OF APRAM MOV (R5)+,R1 ;ARRAY ADDRESS MOV @(R5)+,R2 ;NO OF ELEMTS CLR R0 ;NO OF ELEMENTS ZERO 1$: TST (R1)+ ;CHECK 1 ELEMNT BEQ .+4 ;ZERO EMLEMENT INC R0 ;COUNT NON ZERO ELEMENT SOB R2,1$ ;CONTINUE THRU ALL ELEMENTS RTS PC ;DONE ;************************** FORTRAN ENTRY *************************** .GLOBL MOVE,R5CHEK ; ; CALL MOVE(IA,IB,ISIZE) ; THIS SUBROUTINE MOVES ARRAY IA TO ARRAY IB OF SIZE ISIZE ; MOVE: MOV #3,R0 ;NO OF PARAM JSR PC,R5CHEK ;CHECK THEM MOV (R5)+,R1 ;SOURCE ADDRESS MOV (R5)+,R0 ;DESTINATION ADDRESS MOV @(R5)+,R2 ;COUNT 1$: MOV (R1)+,(R0)+;MOVE THE DATA SOB R2,1$ ;CONTINUE TILL THRU RTS PC ; ; ********** ; ;************************** FORTRAN ENTRY *************************** ; I = IRAM(IWORD,ICOUNT,IMASK) ; IWORD IS ROTATED ICOUNT PLACES TO RIGHT &ANDED WITH IMASK .GLOBL IRAM IRAM: MOV #3,R0 ;CHECK 3 INPUT PARAM JSR PC,R5CHEK MOV @(R5)+,R1 ;GET WORD TO DO LOGIC ON MOV @(R5)+,R0 ;GET SHIFT TO RIGHT NEG R0 ;NOW IS LEFT SHIFT BMI 1$ ;IS OK BIC #177760,R0;CLEAR EXTRA BITS SUB #32.,R0 ;NOW IS NEG! 1$: BIS #177760,R0;SET EXTRA BITS ASHC R0,R1 ;PERFORNM SHIFT COM R1 MOV @(R5)+,R0 BIC R1,R0 RTS PC ;************************** FORTRAN ENTRY *************************** ; ; CALL SWAP(IA,IB,LENGTH) ; SWAPS ARRAYS IA,IB OF LENGTH LENGTH ; .GLOBL SWAP SWAP: MOV #3,R0 JSR PC,R5CHEK MOV (R5)+,R0 ;SOURCE ARRAY MOV (R5)+,R1 ;DESTINATION MOV @(R5)+,R2 ;COUNT BLE 2$ ;BAD COUNT 1$: MOV (R0),R4 ;SAVE (R0) MOV (R1),(R0)+ MOV R4,(R1)+ ;2 WORDS SWAPPED SOB R2,1$ ;CONTINUE TIILL DONE 2$: RTS PC .END $R MACRO .END