.TITLE ARGS -- FORTRAN ARGUMENT STATUS .IDENT /13APR7/ ;10:12:00 LV ; .ENTRY ARGS -- FORTRAN ARGUMENT STATUS ;+ ; A R G S ; ; PURPOSE: THIS ROUTINE WILL RETURN THE NUMBER OF ARGUMENTS ; IN THE CALL TO ITS CALLER. THE CALLER'S LIST POINTER, ; (R5) IS ASSUMED TO HAVE BEEN PUSHED ONTO THE STACK ; IMMEDIATELY BEFORE CALLING THIS ROUTINE. F4P DOES THIS ; FOR ALL CALLS ENCOUNTERED IN MY EXPERIENCE. IN ADDITION ; THE ADDRESS OF EACH ARGUMENT IS CHECKED, AND A BIT MAP OF ; SPECIFIED ARGUMENTS IS RETURNED. ; ; INTERFACE: CALLING SEQUENCE: (FORTRAN-CALLABLE SUBROUTINE) ; CALL ARGS ([N] [,MAP]) ; ; INPUT: NONE ; ; OUTPUT: ; N = (INTEGER*2): IS RETURNED AS THE NUMBER OF ARGUMENTS ; INCLUDED IN THE CURRENT CALL. ; ; MAP = (INTEGER*2 ARRAY): IS RETURNED AS ONE BIT FOR EACH ; ARGUMENT (N BITS). THE BIT AT EACH POSITION IS SET ; IF THE CORRESPONDING ARGUMENT IN THE ARG LIST WAS ; SPECIFIED IN THE CALL. NOTE THAT 16 BITS ARE USED IN ; EACH WORD, AND IF MORE THAN 16 ARGS ARE POSSIBLE, MAP ; MUST BE AN ARRAY. ; ; EXAMPLES - ; ; SUBROUTINE MUMBLE (ARG1,ARG2,ARG3) ; CALL ARGS(N,MAP) ; IF (N.LT.2) CALL SHORT ; VALUE=DEFALT ; IF ((MAP.AND."4).EQ.0) GOTO 100 ; VALUE=ARG3 ; 100 CONTINUE ; . ; . ; . ; RETURN ; END ; ; LANGUAGE: MACRO-11 ; ; RESTRICTIONS: SEPARATE VERSIONS ARE REQUIRED FOR FORTRAN-IV AND ; FORTRAN-IV PLUS. CALLING ROUTINE MUST HAVE AT ; LEAST ONE ACTUAL ARGUMENT. ; ; REFERENCES: WRITTEN BASED ON INFORMATION SUPPLIED BY A ; MEMBER OF THE DEC F4P DEVELOPMENT TEAM. ;- ; REVISIONS: ; 28-MAR-75 RK WRITTEN ; 22-DEC-75 RK MADE EITHER ARGUMENT OPTIONAL ; 28-MAR-76 MK ADDED CONDITIONAL CODE TO ALLOW FOR OR F4P ; VERSIONS ; 13-APR-77 LV UPDATED TO CONFORM TO STANDARDS ; ; 2. PROGRAM DETAIL ; ;**** DEFINE F4P FOR F4P VERSION ;**** LEAVE F4P UNDEFINED FOR FOR VERSION F4P=0 ; ; 2.4 PROGRAM FLOW-- ; ARGS:: .IF DF,F4P MOV 2(SP),R0 ;GET CALLER'S LIST POINTER (F4P) .IFF MOV 4(SP),R0 ;GET CALLER'S LIST POINTER (FOR) .ENDC MOVB @R0,R1 ;# OF ARGS CMPB @R5,#1 ;AT LEAST 1 ARG? BLT 3$ ;NO CMP 2(R5),#-1 ;WAS "N" SPECIFIED? BEQ 3$ ;NO MOV R1,@2(R5) ;RETURN # OF ARGS 3$: TST R1 ;CHECK NUMBER OF ARGS BEQ 4$ ;RETURN IF ZERO CMPB @R5,#2 ;2 ARGS? BLT 4$ ;NO CMP 4(R5),#-1 ;WAS THE MAP DESIRED? BEQ 4$ ;NO ADD #2,R0 ;POINT TO ADDR OF 1ST ARG CLR R4 ;CLEAR BIT COUNTER MOV 4(R5),R2 ;ADDR OF BIT WORD(S) CLR @R2 ;CLEAR 1ST BIT WORD BR 5$ ;SKIP TEST INITIALLY 1$: CMP R4,#16. ;READY FOR NEW BIT WORD? BLT 5$ ;NO ADD #2,R2 ;POINT TO NEW WORD CLR R4 ;RESET BIT COUNTER CLR @R2 ;CLEAR BIT WORD 5$: MOV #1,R3 ;GENERATE BIT MASK ASH R4,R3 CMP #-1,(R0)+ ;IS ARGUMENT PRESENT? BEQ 2$ ;NO BIS R3,@R2 ;SET ARGUMENT-PRESENT BIT 2$: INC R4 ;POINT TO NEXT BIT SOB R1,1$ ;CONTINUE FOR ALL ARGS 4$: RETURN ;ALL DONE .END