.MACRO CALL SUBR,ARGLST .MCALL CALL0,CALLN .NARG NPXL1 .LIST ;WANT TO SEE THIS ; ;*************************** ; ;** CALL SUBR ; ;*************************** .NLIST ;BACK TO MEB OR WHATEVER .IIF LE,,CALL0 SUBR ;IF 1 PARM -SPECIAL CALL .IIF LE,,.MEXIT ;DONE CALLN ARGLST ;PUSH ARGS ONTO STACK MOV SP,R5 ;SET PARM ADDR JSR PC,SUBR ;CALL SUBR ADD #*2,SP ;CLEAR STACK .ENDM CALL .MACRO CALLN A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15 .MCALL PUSHX .NARG NSARGS .IIF GE,, PUSHX A15 .IIF GE,, PUSHX A14 .IIF GE,, PUSHX A13 .IIF GE,, PUSHX A12 .IIF GE,, PUSHX A11 .IIF GE,, PUSHX A10 .IIF GE,, PUSHX A9 .IIF GE,, PUSHX A8 .IIF GE,, PUSHX A7 .IIF GE,, PUSHX A6 .IIF GE,, PUSHX A5 .IIF GE,, PUSHX A4 .IIF GE,, PUSHX A3 .IIF GE,, PUSHX A2 .IIF GE,, PUSHX A1 PUSH #NSARGS ;PUT ARG COUNT ON STACK .ENDM CALLN .MACRO CALL0 SUBR ;GENERATE 0 PARM CALL PUSH #0 ;0 PARMS MOV SP,R5 ;SET UP PARM ADDR JSR PC,SUBR ;CALL SUBR POP ;RESTORE STACK .ENDM CALL0 .MACRO CPARGS NARGS ;COPY ARG ADDRS ONTO STK .MCALL PUSH .REPT NARGS PUSH (R5)+ ;COPY ARG ADDR ONTO STK .ENDR .ENDM CPARGS .MACRO FRTN .GLOBL MONTRF JSR PC,MONTRF ;RTN RSLT IN R0 .ENDM FRTN .MACRO INIWS ARG ;RESERVE & INIT WS ON STK .MCALL PUSH PUSH ARG ;RESERVE & INIT WS ON STK .ENDM INIWS .MACRO MINIT PSNAM .LIST MEB ;WANT TO SEE BIN FROM MACROS .DSABL GBL ;WANT UNDEFS FLAGGED F4P = 4 ;SET F4P FLAG FOR FOR+ COMPILIER SUF = 0 ;SUSPEND NOT PERMITTED FLAG REQF = 1 ;REQUEST PERMITTED SALF = 0 ;DRS VERSION (NOT STAND ALONE) RSX11M =1 RSX11D =2 IASF =3 OPSYF =IASF ;IAS (NOTE:D IS 2 AND M IS 1) .IF B,PSNAM ;IF NO PSECT NAME GIVEN .PSECT ICOM,I,LCL,CON ;INSTR PSECT FOR MACRO RTNS .ENDC .ENDM MINIT .MACRO NMWS NAMS ;ESTAB WS ADDR OFFSETS BY NAME NOFF = 0 .IRP NM, ;RUN OFFSET UP NOFF = NOFF+2 .ENDR TOTWS = NOFF ;BYTES OF WS ON STK .IRP NM, NOFF = NOFF-2 ;STEP DN TO NEXT WS ADDR .IF NB, ;DON'T NAME NULL ARGS NM = NOFF ;NAME THIS WS OFFSET .ENDC .ENDR ;;; .MACRO NMWS ;RECLAIM MACRO SPACE ;;; .ENDM NMWS .ENDM NMWS .MACRO POP ARGS .IF B, TST (SP)+ ;DEL FROM STK .IFF .IRP ARG, .IF B, TST (SP)+ ;DEL FROM STK .IFF .NCHR SNCH, ;NO. OF CHARS IN "ARG" .IF EQ,SNCH-1 ;IF NO. OF CHARS = 1 MOV (SP)+,ARG ;POP ARG FROM STK .IFF ;IF NO. OF CHARS > 1 .IF LE,SNCH-9. ;IF NO. OF CHARS <= 9 MOV (SP)+,ARG ;POP ARG FROM STK .IFF ;IF NO. OF CHARS > 9 MOV (SP)+,ARG ;POP ARG FROM STK .ENDC .ENDC .ENDC .ENDR .ENDC .ENDM POP .MACRO PTWS ;SET R5 TO PT TO STK WS MOV SP,R5 ;SET R5 AS WS BASE .ENDM PTWS .MACRO PUSH ARGS .IF B, TST -(SP) ;RSV 1 WD ON STK .IFF .IRP ARG, .IF B, TST -(SP) ;RSV 1 WD ON STK .IFF .IF IDN,<#0>, ;IF ZERO ARG. CLR -(SP) ;PUSH #0 ONTO STK .IFF ;IF ARG. NOT ZERO .NCHR SNCH, ;NO. OF CHARS IN "ARG" .IF EQ,SNCH-1 ;IF NO. OF CHARS = 1 MOV ARG,-(SP) ;PUSH ARG ONTO STK .IFF ;IF NO. OF CHARS > 1 .IF LE,SNCH-9. ;IF NO. OF CHARS <= 9 MOV ARG,-(SP) ;PUSH ARG ONTO STK .IFF ;IF NO. OF CHARS > 9 MOV ARG,-(SP) ;PUSH ARG ONTO STK .ENDC .ENDC .ENDC .ENDC .ENDR .ENDC .ENDM PUSH .MACRO PUSHX ARG .IIF NB, PUSH ARG ;PUT ARG ON STACK .IIF B, PUSH #-1 ;NULL ARGUMENT .ENDM PUSHX .MACRO RESWS NWS ;RESERVE WS ON STK .IF GT,NWS .IF EQ, ;SPCL CASE FOR 1 WD TST -(SP) ;RSV 1 WD ON STK .IFF ;> 1 WD WANTED SUB #NWS*2,SP ;RSV NWS WDS ON STK .ENDC .ENDC .ENDM RESWS .MACRO RTN .GLOBL MONTRO JSR PC,MONTRO ;RTN TO CALLER .ENDM RTN .MACRO SUBR SNAM,NARGS,FLGS .GLOBL MONTRI .LIST ;WANT TO SEE THIS... ;*********************** ;*** SUBROUTINE SNAM ;*********************** .NLIST ;BACK TO MEB OR WHATEVER... SNAM':: JSR R1,MONTRI ;SAVE REGS, TRACE .IF NB, .BYTE NARGS ;NO. OF ARGS EXPECTED .IFF .BYTE -1 ;VAR NO. OF ARGS .ENDC .IF B,FLGS ;IF NO FLAGS GIVEN .BYTE 0 ;NO MONTRX FLAGS .IFF ;IF FLAGS GIVEN .BYTE FLGS ;MONTRX FLAG(S) .ENDC .NCHR SNCH, ;NO. OF CHARS .IF EQ,SNCH-6 .RAD50 /SNAM/ .ENDC .IF EQ,SNCH-5 .RAD50 /SNAM' / .ENDC .IF EQ,SNCH-4 .RAD50 /SNAM' / .ENDC .IF EQ,SNCH-3 .RAD50 /SNAM' / .ENDC .IF EQ,SNCH-2 .RAD50 /SNAM' / .ENDC .IF EQ,SNCH-1 .RAD50 /SNAM' / .ENDC .IF EQ,SNCH .ERROR SNCH ;SUBR NAME NOT GIVEN .RAD50 /UNKNWN/ .ENDC .ENDM SUBR