.TITLE MFARG .IDENT /V1.1/ ; ; MACRO-FORTRAN INTERFACE SUBROUTINES ; ;+ ; -- MF$$AR -- ; SUBROUTINE TO PUSH FORTRAN ARGUMENT LIST ONTO STACK ; ; ; CALLING SEQUENCE: ; IF MAXARG = 0 : ; CALL MF$$AR ; .WORD MAXARG ; ; IF MAXARG > 0 : ; CALL MF$$AR ; .WORD MAXARG ; .WORD REQMSK (BIT0 FOR LAST ARG, BIT1 FOR NEXT TO LAST...) ; .WORD DEFMSK (SAME AS ABOVE) ; .REPT [NUMBER OF DEFAULTS SUPPLIED (# OF BITS SET IN DEFMSK)] ; .WORD DEFAULT VALUE ; .ENDR ; ; IN OTHER WORDS, IF MAXARG=0, IT IS THE ONLY WORD FOLLOWING THE CALL. ; IF MAXARG > 0, REQMSK HAS A BIT SET FOR EVERY REQUIRED ARGUMENT, ; DEFMSK HAS A BIT SET FOR EVERY DEFAULTED ARGUMENT, AND THERE MUST BE ; AS MANY WORDS AFTER DEFMSK AS THERE ARE DEFAULTED ARGUMENTS. ; ; INPUTS: ; R5 ADDRESS OF ARGUMENT ADDRESS TABLE ; MAXARG MAXIMUM NUMBER OF ARGUMENTS ; REQMSK BIT MAP WITH ONES FOR REQUIRED ARGUMENTS ; DEFMSK BIT MAP WITH ONES FOR DEFAULTED ARGUMENTS ; (DEFAULT VALUES....PTRS TO THESE WORDS WILL BE PUSHED ON THE STACK) ; ; OUTPUTS: ; C-CLEAR ARGUMENTS SET UP ON STACK ; STACK SETUP WITH ADDRESSES OR 0 FOR NON-DEFAULTED ARGUMENTS ; (TOP OF STACK IS FIRST ARG) ; ; *** IF ERROR, FORTRAN TRAP FOR MSG AND TRACEBACK, THEN EXIT *** ; ; REGISTERS ALTERED: ; R0,R1,R2,R3,R4 ; ;- MF$$AR:: MOV (SP)+,R4 ;GET ADDRESS OF RETURN MOV SP,SAVESP ;SAVE SP FOR ARG INSERTION MOV (R4)+,R3 ;R3=MAX # OF ARGUMENTS BEQ 130$ ; NONE MOV (R4)+,R2 ;R1=BIT MAP OF MANDATORY ARGUMENTS MOV (R4)+,R1 ;R1=BIT MAP OF DEFAULTED ARGUMENTS MOV R3,R0 ;R0<-COPY OF MAXARG ;** FILL STACK WITH DEFAULT ARGUMENTS 10$: CLR -(SP) ;PUSH A NON-DEFAULTED, NON-SUPPLIED ARG ASR R1 ;IS THERE A DEFAULT? BCC 15$ ; NO MOV R4,(SP) ; YES...SET THE ADDRESS TST (R4)+ ;AND SKIP IT (UPDATE RETURN PTR) 15$: SOB R0,10$ ;LOOP FOR ALL POSSIBLE ARGS MOV SAVESP,R1 ;R1=PTR TO LAST ARG ON STACK MOVB (R5),R0 ;GET ACTUAL NUMBER OF ARGUMENTS SUB R0,R3 ;CALCULATE NUMBER OF ARGS NOT SUPPLIED BMI 160$ ;IF MI THEN TOO MANY ARGUMENTS BEQ 40$ ;IF EQ ALL ARGUMENTS SUPPLIED ;** SEE IF UNSUPPLIED ARGS ARE MANDATORY 20$: ASR R2 ;SHIFT BIT MAP BIT INTO C-BIT BCS 160$ ;IF CS YES--ERROR TST -(R1) ;NO--SKIP DEFAULT ON STACK SOB R3,20$ ;DO ALL UNSPECIFIED ARGUMENTS 40$: MOV R0,R3 ;PICK UP COUNT OF ARGS LEFT TO DO BEQ 200$ ;IF EQ ALL DONE INC R3 ;ELSE SET R3 TO ADR OF WORD FOLLOWING ASL R3 ; ADDRESS LIST ADD R5,R3 ;NOW R3 POINTS JUST PAST LAST ARG ;** REPLACE DEFAULT ARGS WITH SUPPLIED ARGS 60$: CMP -(R3),#-1 ;DEFAULTED ARG IN LIST? BEQ 80$ ; YES MOV (R3),-(R1) ; NO...REPLACE DEFAULT WITH ARG ADDRESS ASR R2 ; AND ROTATE BITMAP BR 100$ 80$: ASR R2 ;DEFAULTED ARG--WAS IT REQUIRED? BCS 160$ ;IF CS YES--ERROR TST -(R1) ;SKIP DEFAULT ON STACK 100$: SOB R0,60$ ;LOOP BR 200$ ;GO EXIT 130$: TSTB (R5) ;NO ARGS WANTED...ANY SUPPLIED? BEQ 200$ ; NO...OK 160$: TENARG ;**ERROR TRAP** 200$: JMP (R4) ;ROUTINE EXIT SAVESP: .WORD ;SAVED SP FOR ARGUMENT INSERTION .END