CSI.MAC;1 ; ; CALL CSI1 (BUFFER [,LENGTH] [,NEWLEN] [,IEFLG] [,IESIZ] ) ; INITIALIZE CSI CONTROL BLOCK AND PRE-SCAN COMMAND STRING ;WHERE: ; BUFFER - COMMAND-LINE TO BE PROCESSED (USUALLY RETURNED ; FROM GETCMD) ; LENGTH - LENGTH OF COMMAND-LINE (ALSO FROM GETCMD) ; IF NOT PRESENT, FIRST NULL CHAR TERMINATES LINE ; NEWLEN - RETURNED LENGTH OF COMPRESSED COMMAND-LINE ; IT IS LEGAL TO SPECIFY THE SAME VARIABLE FOR ; BOTH LENGTH AND NEWLEN ; *** IF ZERO, ERROR DURING COMPRESSION ; IEFLG - ERROR/EQUAL FLAG; VALUES ARE: ; 0 : NO ERROR....EQUAL SIGN PRESENT IN COMMAND ; -1 : NO ERROR....NO EQUAL SIGN IN COMMAND ; >0 : INDEX INTO BUFFER WHERE ERROR STARTS ; IESIZ - IF AN ERROR HAS BEEN DETECTED, LENGTH OF SEGMENT ; CONTAINING THE ERROR CSI.MAC;1 ; CALL CSIDEF ( IO [,DEVICE] [,UFD] [,NAME] [,EXT] [,VER] ) ; ESTABLISH DEFAULT FIELDS FOR CSI2 PARSING ;WHERE: ; IO - ASCII CHAR INDICATING INPUT/OUTPUT DEFAULT FILESPEC: ; 'I' -> THIS DEFAULT APPLIES TO INPUT FILES ; 'O' -> THIS DEFAULT APPLIES TO OUTPUT FILES ; DEVICE - ASCII DEVICE NAME OF THE FORM: ; DD##: or DD#: or DD: ; UFD - ASCII DIRECTORY SPECIFICATION OF THE FORM: ; [###,###] where ### may be 1-3 digits ; NAME - ASCII FILENAME STRING (IF NON-ZERO, THIS ARG ; MUST BE 9 CHARACTERS LONG) ; EXT - ASCII FILE EXTENSION (IF NON-ZERO, THIS ARG ; MUST BE 3 CHARACTERS LONG) ; VER - ASCII VERSION NUMBER STRING (OCTAL NUMBER) ;NOTES: ; 1) If any parameters are omitted, the corresponding field from the ; previous parsed filespec will remain as the default, with the ; exception of VER, which reverts to zero (latest version). Note that ; CSI1 clears all defaults automatically. ; 2) If any parameters are explicitly zero, the corresponding default ; field will be cleared to indicate that no default exists. ; 3) All strings must be left justified. NAME and EXT require spaces ; filling out to the end of the field. ; 4) The version number of a filespec is normally an OCTAL number from ; 1 to 77777 (32767.); the two special version numbers ( 0 and -1 ) ; have their normal meaning (i.e., zero denotes the most recent ; version of an existing file or the next incremental version of a ; file to be created; minus one denotes the oldest version of a file). ; 5) Version number strings in VER must have a non-numeric terminator. ; A space is sufficient. Note that '-1' and '7' have indeterminate ; results where '-1 ' and '7 ' are valid. ; 6) The string in EXT should not be preceeded by a period. The string ; in VER should not be preceedded by a semi-colon. However, the ; string in UFD must include both square brackets and comma; the ; string in DEVICE must include the trailing colon. CSI.MAC;1 ; CALL CSIFIL (INFIL, OUTFIL [,NEWSIZ] ) ; COMPRESS THE GARBAGE OUT OF A FILESPEC (SPACES, VERSION ZEROES) ;WHERE: ; INFIL - LOGICAL*1 (34) ARRAY RETURNED FROM CSI2 ; OUTFIL - LOGICAL*1 (34) ARRAY RETURNED FROM CSIFIL ; NEWSIZ - INTEGER NUMBER OF VALID CHARACTERS RETURNED ;NOTES: ; 1) IF YOU INSIST ON USING CALL ASSIGN RATHER THAN THE OPEN STATEMENT, ; YOU MUST SPECIFY A COMPRESSED STRING WITH THE RETURNED NEWSIZ, ; E.G.: CALL ASSIGN (LUN,OUTFIL,NEWSIZ) ; HOWEVER, THE OPEN STATEMENT ACCEPTS THE UNCOMPRESSED STRING. ; CSI.MAC;1 ; CALL CSI2 (IO, OUTFIL [,LSTAT] [,SWTAB] [,MASK1] [,MASK2] ) ; PARSE A FILESPEC WITH OPTIONAL SWITCHES AND DEFAULTS ;WHERE: ; IO - ASCII CHAR INDICATING INPUT/OUTPUT FILESPEC: ; 'I' -> PARSE THE NEXT INPUT FILESPEC ; 'O' -> PARSE THE NEXT OUTPUT FILESPEC ; OUTFIL - 34 BYTE ARRAY TO RECEIVE THE PARSED FILESPEC. ; IF CSI2 RETURNS AN ERROR, OUTFIL(1) = 0 (NULL). ; THIS ARRAY WILL CONTAIN AN ASCIZ STRING WITH ; FILESPEC INFORMATION AS FOLLOWS: ; OUTFIL ( 1 - 5 ) DEVICE NAME { DD##: } ; OUTFIL ( 6 - 14) UFD SPEC { [###,###] } ; OUTFIL (15 - 23) FILE NAME { ABCDEFGHI } ; OUTFIL (24 - 27) EXTENSION { .XYZ } ; OUTFIL (28 - 33) VERSION { ;##### } ; OUTFIL (34) NULL ASCIZ TERMINATOR ; INDIVIDUAL FIELDS WILL BE LEFT-JUSTIFIED AND ; PADDED WITH SPACES. THE SYNTACTICAL REQUIREMENTS ; (E.G., " :[,].; ") WILL ALWAYS BE AT FIXED OFFSETS. ; LSTAT - RETURNED STATUS BYTE (DECLARE AS FORTRAN INTEGER ; IF YOU WANT TO DO BITWISE LOGICAL TESTS ON IT) ; SWTAB - SWITCH DESCRIPTOR TABLE ; MASK1 - RESULTANT SWITCH MASK WORD ; MASK2 - RESULTANT POLARITY MASK WORD ; ;NOTES: ; 1) Defaults may be established in all filespec fields by calling ; CSIDEF before calling CSI2. Note that each call to CSI2 updates ; all defaults (excluding version number!) to match the current ; filespec. This means that input and output device, ufd, file ; name, and file extension specifications will propagate across ; commas. CSIDEF will alter this default propagation. If you ; want version numbers to propagate, you must call CSIDEF with ; the VER argument pointing to the preceding CSI2 version number ; string (OUTFIL(29)). CSISV.MAC;1 ; ; CALL CSISV ( VTABLE, TYPE, VDEST [,LENGTH] ) ;WHERE: ; VTABLE - Switch value table on first call or offset in ; switch value table on subsequent calls. Allow ; two words per entry (one entry per call) plus a ; one word trailer for the entire table. ; TYPE - ASCII character indicating the type of switch value: ; 'A' = ASCII ; 'N' = Numeric (same as OCTAL) ; 'O' = OCTAL ; 'D' = DECIMAL ; VDEST - Variable or array to hold value. Numeric, OCTAL, ; and DECIMAL locations must be of type INTEGER. ; Note that only one value for one switch may be ; specified in each call to CSISV. ; LENGTH - If TYPE = 'A' (ASCII), length, in bytes, of VDEST. ; Else, LENGTH is ignored and the default (2 bytes == 1 word) ; is used. ; CSISW.MAC;1 ; ; CALL CSISW ( STABLE, ISW, IBIT [,NEGFLG] [,VTABLE] ) ;WHERE: ; STABLE - Switch table on first call or offset in ; switch table on subsequent calls. Allow four ; words per entry (one entry per call) plus a ; one word trailer for the whole table. ; ISW - 2 character ASCII switch name. The switch ; table is set up to match any characters after ; the first two, e.g., /LIST will match /LI ; IBIT - Integer bit mask of bit(s) to set in MASK1 upon ; successful parsing of the switch. (see CSI.MAC) ; NEGFLG - ASCII char indicating whether switch negation is allowed: ; '+' -> (default) /-SW or /NOSW not allowed ; '-' -> switch negation allowed ; VTABLE - Switch value table filled in by CSISV (see CSISV.MAC) ; GETCMD.MAC;1 ; CALL INICMD ( [ILUN] [,IEXT] [,PROMPT] ) ; ; INITIALIZE PARAMETERS FOR GETCMD ROUTINES ;WHERE: ; ILUN - LOGICAL UNIT NUMBER FOR COMMAND I/O (DEFAULT = 4) ; ** THIS LUN MUST BE ASSIGNED TO TI: BEFORE GETCMD IS CALLED) ; IEXT - RAD-50 DEFAULT INDIRECT COMMAND FILE EXTENSION ; (DEFAULT = 'CMD') ; PROMPT - ASCII PROMPT STRING (MUST BE AT LEAST 3 CHARS) ; (DEFAULT = 3 SPACES, PRINTING AS ' >') ; ;*** NOTE THAT THE (PROMPT) PARAMETER SPECIFIES A DEFAULT PROMPT, WHICH CAN ; BE OVERRIDDEN BY A PROMPT SPECIFIED IN THE CALL TO GETCMD ; GETCMD.MAC;1 ; CALL FLGCMD ( [MODSET] [,MODCLR] [,RCTL] ) ; ; SET/CLEAR FLAG BITS -- SENSE INPUT FILE CHARACTERISTICS ;WHERE: ; MODSET - L*1 BITS TO SET IN THE BYTE AT G.MODE ; MODCLR - L*1 BITS TO CLR IN THE BYTE AT G.MODE ; RCTL - L*1 RETURNS DEVICE CHAR BYTE OF INPUT DEVICE (F.RCTL) ; GETCMD.MAC;1 ; ; GETCMD -- SUBROUTINE TO PROVIDE FORTRAN ACCESS TO THE SYSTEM ; COMMAND-LINE PROCESSING ROUTINES ; ; CALL GETCMD (IBUF,[IBSIZ][,LENGTH][,PROMPT][,PLENGTH][,IERR][,FERR][,RCTL]) ; ;WHERE: ; IBUF - INPUT BUFFER (IF IBSIZ DEFAULTED, 80. BYTES) ; IBSIZ - LENGTH OF IBUF (IN BYTES) IF NOT 80. ; *** NOTE THAT THE LARGEST RECORD THAT MAY BE READ ; IS (IBSIZ - 2) BYTES LONG ; LENGTH - LENGTH OF RETURNED COMMAND-LINE ; *** THE COMMAND LINE WILL BE PADDED WITH NULLS ; PROMPT - OPTIONAL USER PROMPT (MUST INCLUDE CARRIAGE CONTROL) ; (IF OMITTED, DEFAULT PROMPT IS USED) ; PLENGTH - LENGTH (IN BYTES) OF USER PROMPT ; (IF ZERO OR BLANK, PROMPT MUST BE TERMINATED ; WITH A NULL (ZERO)) ; IERR - LOGICAL*1 ERROR RETURN CODE (0 - NO ERRORS) ; FERR - L*1 FCS ERROR RETURN CODE (VALID IF IERR = -1 OR -2) ; RCTL - L*1 RETURNS DEVICE CHAR BYTE OF INPUT DEVICE (F.RCTL) GETCMD.MAC;1 ; CALL RESCMD ( [IERR] [,FERR] [,RCTL] ) ; ; RESETS INDIRECT COMMAND FILE SCANNING TO THE TOP LEVEL ;WHERE: ; IERR - LOGICAL*1 GCML ERROR RETURN CODE ; FERR - LOGICAL*1 FCS ERROR RETURN CODE ; RCTL - L*1 RETURNS DEVICE CHAR BYTE OF INPUT DEVICE (F.RCTL) GETCMD.MAC;1 ; CALL CLOCMD ( [IERR] [,FERR] [,RCTL] ) ; ; CLOSES THE CURRENT COMMAND FILE ;WHERE: ; IERR - LOGICAL*1 GCML ERROR RETURN CODE ; FERR - LOGICAL*1 FCS ERROR RETURN CODE ; RCTL - L*1 RETURNS DEVICE CHAR BYTE OF INPUT DEVICE (F.RCTL) MACFOR.MAC;1 ;LINK MACRO SUBROUTINE TO FORTRAN V2.2 TRACEBACK CHAIN (NOT F4P) ; ;USE: CALL MF$$LK ; .RAD50 /SUBNAM/ ; MACFOR.MAC;1 ; -- MF$$NX -- ;INCREMENT FORTRAN-IV V2.2 LINE NUMBER ;USAGE: ; CALL MF$$NX ; MACF4P.MAC;1 ; -- MF$$LK -- ;LINK MACRO SUBROUTINE TO F4P TRACEBACK CHAIN (NOT FORTRAN V2.0) ; ;USE: CALL MF$$LK ; .RAD50 /SUBNAM/ ; MACF4P.MAC;1 ; -- MF$$NX -- ;INCREMENT F4P LINE NUMBER ;USAGE: ; CALL MF$$NX ; MFARG.MAC;1 ; -- 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 ; MFPRE.MAC;1 ; Macro: PUSH arg ; Push (arg) onto stack. If (arg) not specified, push a zero. MFPRE.MAC;1 ; Macro: POP dst ; Pop a value off stack into (dst). ; If (dst) not specified, throw a stack value away. ; If used in conjuction with subroutine parameter linkage, POP will retrieve ; the address of the next argument in the calling sequence. MFPRE.MAC;1 ; Macro: POPARG dst ; Pop @(SP)+ off stack into (dst)...i.e., use value on stack as address ; If (dst) omitted, throw away value, but test for zero value ; If used in conjuction with subroutine parameter linkage, POPARG will ; retrieve the value of the next argument in the calling sequence; do ; NOT use POPARG to retrieve values of arguments that are not either ; required or defaulted in the parameter decoding macro (e.g. MFARG). MFPRE.MAC;1 ; Macro: POWER2 N,R ; Generate a power of two: R <== 2**N MFPRE.MAC;1 ; Macro: MFSUBR SUBNAM,n ; Generate a F4P/FOR-Traceable subroutine linkage to MACRO-11 code ; ; If n omitted, defines global entry point, i.e.: SUBNAM:: ; If n supplied, doesn't define a statement label at all. ; Calls MF$$LK to link SUBNAM into F4P/FOR traceback chain. MFPRE.MAC;1 ; Macro: NXTLIN ; Increment F4P/FOR traceback statement number counter MFPRE.MAC;1 ; Macro: TENARG ; Generate FORTRAN error 80: Wrong Number of Arguments ; Then exit through FORTRAN run-time (i.e.: CALL EXIT ) MFPRE.MAC;1 ; Macro: TEVARG ; Generate FORTRAN error 81: Invalid Argument ; Then exit through FORTRAN run-time (i.e.: CALL EXIT ) MFPRE.MAC;1 ; Macro: TRACE ; Invoke a non-fatal FORTRAN traceback through error 86: Invalid Error Number MFPRE.MAC;1 ; MACRO MFARG MAX,,, ; ; THIS MACRO GENERATES A CALL TO THE FORTRAN ARGUMENT DECODING ROUTINE ;WHERE: ; MAX - MAXIMUM NUMBER OF ARGUMENTS ALLOWED IN CALL ; REQ - LIST OF REQUIRED ARGUMENT NUMBERS ; DEF - LIST OF ARGUMENT NUMBERS WITH INTEGER DEFAULTS ; VALS - LIST OF DEFAULT VALUES ; ;EXAMPLE: ; MFARG 5, 1, <3, 4>, <100., -1> ;GENERATES: ; CALL MF$$AR ;CALL THE ARGUMENT DECODER ; .WORD 5 ; 5 ARGUMENTS MAXIMUM ; .WORD 20 ; 1ST ARG (LEFTMOST) IS REQUIRED ; .WORD 6 ; 3RD AND 4TH ARGS HAVE DEFAULTS ; .WORD -1 ; 4TH ARG DEFAULT ; .WORD 100. ; 3RD ARG DEFAULT ; ; THE ADDRESSES OF THE DECODED ARGUMENTS ARE ON THE STACK SO THAT THE FIRST ; POP GETS THE 1ST (LEFTMOST) ARGUMENT ADDRESS (OR POPARG GETS THE VALUE). ; IF AN ARGUMENT IS NOT SPECIFIED IN THE FORTRAN CALL, THE ADDRESS ON THE ; STACK WILL BE ZERO IF THERE WAS NO DEFAULT. IF A DEFAULT WAS SPECIFIED, ; THE ADDRESS ON THE STACK WILL BE THE ADDRESS OF THE GENERATED WORD. ; ; FOR EXAMPLE, IF THIS FORTRAN CALL IS USED: ; CALL SUB (I,,J) ; WITH THE PREVIOUS EXAMPLE, THE STACK WILL END UP LOOKING LIKE THIS: ; ........ ; (REST OF STACK) ; 0 ;5TH ARG MISSING ; -> -1 ;POINTER TO THE 4TH ARG DEFAULT WORD ; J ;ADDRESS OF FORTRAN VARIABLE J ; 0 ;2ND ARG MISSING ; SP -> I ;ADDRESS OF FORTRAN VARIABLE I ; MFPRE.MAC;1 ; Macro: CBTAR2 NCHAR,RADIX,SIGN,FILL ; Set R2 equal to mask required for system library routine $CBTA (Convert ; Binary (value in R1) To Ascii (string address in R0)) ; Where: ; NCHAR - number of characters to result from conversion ; RADIX - radix of conversion....one of: ; O -- octal ; D -- decimal ; H -- hexadecimal ; B -- binary ; n -- numeric base n ; SIGN - flag for signed or unsigned value conversion....one of: ; U -- unsigned ; S -- signed ; FILL - flag for zero-fill characteristic....one of: ; ZERO -- fill with zeroes ; SPACE -- fill with spaces ; NONE -- left-justify string with no fill characters ; ; Example: ; CBTAR2 4,D,S,NONE ;convert 4 signed decimal digits ; ;if R1 < 1000., print < 4 digits ; ; CBTAR2 3,8.,U,ZERO ;convert 3 unsigned octal digits ; ;right-justified with leading zeroes