;MACROS FOR STACK PUSH/POP ;+ ; Macro: PUSH arg ; Push (arg) onto stack. If (arg) not specified, push a zero. ;- .MACRO PUSH ARG .IF B,ARG CLR -(SP) ;PUSH A ZERO .IFF MOV ARG,-(SP) .ENDC .ENDM ;+ ; 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. ;- .MACRO POP DST .IF B,DST TST (SP)+ ;POP AWAY .IFF MOV (SP)+,DST .ENDC .ENDM ;+ ; 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). ;- .MACRO POPARG DST .IF B,DST TST @(SP)+ ;DROP ARG...WAS IT ZERO? .IFF MOV @(SP)+,DST ;GET ARGUMENT VALUE .ENDC .ENDM ;+ ; Macro: POWER2 N,R ; Generate a power of two: R <== 2**N ;- .MACRO POWER2 N,R .NLIST .IIF LT,N .ERROR ;*** NEGATIVE POWER: 2**'N R = 1 .REPT N R = R * 2 .ENDR .LIST .ENDM ;+ ; 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. ;- .MACRO MFSUBR NAME,DEF .IF B,DEF ;DON'T DEFINE SYMBOL IF DEF DEFINED 'NAME':: .ENDC CALL MF$$LK ;LINK TO F4P/FOR TRACEBACK CHAIN .RAD50 /'NAME'/ ;SUBROUTINE NAME FOR TRACEBACK .NCHR NC,NAME .IIF LE,NC-3 .WORD 0 .ENDM ;+ ; Macro: NXTLIN ; Increment F4P/FOR traceback statement number counter ;- .MACRO NXTLIN CALL MF$$NX ;NEXT LINE NUMBER, PLEASE .ENDM ;ERROR CALLS ;+ ; Macro: TENARG ; Generate FORTRAN error 80: Wrong Number of Arguments ; Then exit through FORTRAN run-time (i.e.: CALL EXIT ) ;- .MACRO TENARG ;BAD NUMBER OF ARGUMENTS TRAP 320 CALL EXIT ;Exit through FORTRAN run-time .ENDM ;+ ; Macro: TEVARG ; Generate FORTRAN error 81: Invalid Argument ; Then exit through FORTRAN run-time (i.e.: CALL EXIT ) ;- .MACRO TEVARG ;BAD ARG VALUE TRAP 321 CALL EXIT .ENDM ;+ ; Macro: TRACE ; Invoke a non-fatal FORTRAN traceback through error 86: Invalid Error Number ;- .MACRO TRACE ;GET A FORTRAN TRACEBACK TRAP 326 ;LOOKS LIKE INVALID ERROR .ENDM ; SOME STANDARD DEFINITIONS ESC=33 SPACE=40 CR=15 LF=12 ;+ ; 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 ; ;- .MACRO MFARG MAX,REQ,DEF,VAL CALL MF$$AR ;CALL FORTRAN ARG DECODING ROUTINE .NLIST .IF B,MAX .LIST .WORD 0 ; NO ARGUMENTS .NLIST .IFF ;B,MAX .LIST .WORD MAX ; MAXIMUM NUMBER OF ARGUMENTS ALLOWED .NLIST MF$$MX = MAX .IIF B,REQ REQ = 0 MF$$BM REQ .LIST .WORD MF$$.. ; BIT-MASK OF REQUIRED ARGS .NLIST .IIF B,DEF DEF = 0 MF$$BM DEF .LIST .WORD MF$$.. ; BIT-MASK OF DEFAULTED ARGS .NLIST MF$$VL VAL .ENDC ;B,MAX .LIST .ENDM .MACRO MF$$BM A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0 .NLIST MF$$.. = 0 .IRP X, .IIF NE,X MF$$BT \ .ENDR .LIST .ENDM .MACRO MF$$BT X .NLIST POWER2 X,MF$$.$ MF$$.. = MF$$.. ! MF$$.$ .LIST .ENDM .MACRO MF$$VL P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A .NLIST .IRP X, .IF NB,X .LIST .LIST .WORD X .NLIST .NLIST .ENDC ;NB,X .ENDR .LIST .ENDM ;+ ; 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 ;- .MACRO CBTAR2 NCHAR,RADIX,SIGN,FILL .NLIST $$$NCH = NCHAR * 4000 $$$RDX = -1 $$$SGN = -1 $$$FIL = -1 .IIF IDN,RADIX,O $$$RDX=8. .IIF IDN,RADIX,D $$$RDX=10. .IIF IDN,RADIX,H $$$RDX=16. .IIF IDN,RADIX,B $$$RDX=2 .IIF LT,$$$RDX $$$RDX=RADIX .IIF IDN,SIGN,U $$$SGN=0 .IIF IDN,SIGN,S $$$SGN=400 .IIF LT,$$$SGN .ERROR ;BAD SIGN ARG IN CBTAR2 .IIF IDN,FILL,ZERO $$$FIL=1000 .IIF IDN,FILL,SPACE $$$FIL=3000 .IIF IDN,FILL,NONE $$$FIL=0 .IIF LT,$$$FIL .ERROR ;BAD FILL ARG IN CBTAR2 $$$$R2=$$$NCH!$$$RDX!$$$SGN!$$$FIL .LIST MOV #$$$$R2,R2 ;SET CBTA CONVERSION CHARACTERISTICS .ENDM