.TITLE INDIR INDIRECT FORTRAN CALLS ; ;+ ; INDIR IS A MACRO SUBROUTINE THAT CAN ACT AS AN INTERMEDIARY ; BETWEEN TWO FORTRAN ROUTINES. IT ALLOWS THE CALLING ; ROUTINE TO PASS ARGUMENTS IN AN INDIRECT MANNER; THAT IS, THE CALLING ; ROUTINE MAY IN ITS CALL STATEMENT GIVE, INSTEAD OF THE NAME ; OF THE VARIABLE TO BE PASSED, THE NAME OF A VARIABLE THAT ; CONTAINS THE ADDRESS OF THE VALUE TO BE PASSED. ANY NUMBER ; OF LEVELS OF INDIRECTION ARE ALLOWED. ; ; COPYRIGHT (C) 1978 BY DIGITAL EQUIPMENT CORPORATION ; ; AUTHOR: EDUCATIONAL SERVICES ; WRITTEN: 5- OCTOBER-78 ; ; ; CALL: ; CALL INDIR (PROC,MODE1,ARG1,MODE2,ARG2,...,MODEN,ARGN) ; OR X=INDIR(PROC,MODE1,ARG1,MODE2,ARG2,...,MODEN,ARGN) ; ; PROC MUST BE DECLARED AS EXTERNAL IN THE PROGRAM CALLING INDIR. ; FOR EACH ARGUMENT, THE MODE IS THE NUMBER OF LEVELS OF INDIRECTION. ; MODE=0 IS EQUIVALENT TO A DIRECT CALL. ; ;- ; ; ; The following programs are used in the RT-11 User and RT-11 ; Programmer self paced instruction courses for RT-11 V4.They are also ; similar to programs used in the Programming with RT-11 series for ; RT-11 V5.0 or later. The name of the files are as specified in the ; self paced course. ; ; The code is supplied as a service as Digital does not supply these ; on diskette. ; Any copyright is the property of Digital Equipment Corporartion ; INDIR:: MOV (R5)+,R0 ;GET NUMBER OF ARGUMENT PASSED TO INDIR MOV R0,R1 ;R1 WILL STORE # OF ARGS TO BE PASSED ;TO SUBROUTINE PROC DEC R1 ;FORGET ABOUT PROC ADDRESS ASR R1 ;DIVIDE BY 2 BECAUSE CALL TO INDIR ;HAD MODE AND ARG. PROC WILL GET ARG ONLY ASL R0 ;R0 NOW = BYTE OFFSET TO END OF LIST FROM R5 ADD R5,R0 ;R0=>BEYOND END OF ARG LIST MOV (R5)+,R4 ;;R4 = DESTINATION ADDRESS MOV SP,SAVESP ;SAVE STACK POINTER (WE'LL BUILD PROC'S ARGS ;ON THE STACK) 1$: MOV -(R0),R2 ;R2 = ARG ADDRESS AS PASSED TO INDIR MOV @-(R0),R3 ;R3 = MODE BEQ 3$ ;IF MODE=0, LOAD ARG INTO ARG LIST, ;OTHERWISE PROCESS INDIRECTION 2$: MOV (R2),R2 ;REMOVE ON LEVEL OF INDIRECTION OF ARG DEC R3 ;DECREMENT MODE BNE 2$ ;ARE WE AT MODE 0 YET? 3$: MOV R2,-(SP) ;PUSH ARG ONTO STACK (INTO ARG BLOCK) CMP R0,R5 ;HAVE WE DONE ALL OF THEM YET? ;(R5=>FIRST MODE ARG AS PASSED TO INDIR) BNE 1$ ;IF NOT DONE, DO ANOTHER MOV R1,-(SP) ;IF DONE, LOAD # OF ARGS PASSED TO PROC MOV SP,R5 ;POINT R5 TO ARG BLOCK (FORTRAN CONVENTION) CALL (R4) ;DO SUBROUTINE PROC MOV SAVESP,SP ;RESTORE STACK RETURN ;TO PROGRAM THAT CALLED INDIR ; NOTE THAT NO REGISTERS AR CHANGED BETWEEN THE CALL (R4) AND THE RETURN. ; THUS IF PROC IS A FUNCTION, ITS RETURNED VALUES WILL BE LEFT INTACT SAVESP: .WORD .END