!***COPYRIGHT (C) 1974, 1975, 1976, 1977 DIGITAL EQUIPMENT CORP., MAYNARD, MASS.*** ! MGNMAC.BLI ! ====== === ! MACROS AND OTHER GOOD THINGS REQUIRED BY ALL MCSGEN MODULES ! *** LAST MODIFIED ON 27-MAY-76 ILG ! DONT BOTHER TO LIST THIS FILE SWITCHES NOLIST; STRUCTURE FORMAT[WD,I,J] = (..FORMAT + .WD)<.I,.J>; STRUCTURE ROOTFORMAT[WD,I,J] = (.ROOTFORMAT + .WD)<.I,.J>; BIND TRUE = 1, ! BLISS' VALUE OF TRUE FALSE = 0, ! BLISS' VALUE OF FALSE GOOD = TRUE, BAD = FALSE, ENABLED = TRUE, DISABLED = FALSE, CHKPNT = TRUE, MAXLEVEL = 4, ARGLISTSIZE = 19, YES = TRUE, NO =FALSE, NONEOK = TRUE, JUSTTELL = TRUE, BEFORE = 0, AFTER = 1, ICHAN = 1, OCHAN = 2, NC=CMDCOUNT, VIRGINBUFFER = #400000000000, BASE10 = 10, BASE8 = 8, DEFAULTOK = TRUE, CRONLY = TRUE, BIGNUMBER = #777777, KFLAG = #400000, PTLSIZE = 32, CMDTMPFILENAME = SIXBIT "MGC", IMAGETMPFILENAME = SIXBIT "MGI", BINFILEID = SIXBIT 'MCSGEN', MODTYPE = 1, NEWTYPE = 0; MACRO FAILED = EQL BAD$, BIT(Z) = 35-(Z), 1$, ! USED TO DEFINE ONE BIT AS NUMBERED ON THE TEN ! GIVES THE NUMBER OF BITS TO THE RIGHT OF IT BITS(A,B) = 35-(B),(B)-(A)+1$, ! LIKE BIT EXCEPT DEFINES BITS A THRU B INCLUSIVE COMMENT = SWITCHES NOINSPECT$, ! CAUSES BLISS TO GENERATE THE CODE FOR THE ! PRECEEDING ROUTINES ( FOR PRETTY LISTINGS) REQ(A) = REQUIRE A .BLI$, ! DOES REQUIRES, SAVES TYPING NOTE = !$, ! USED TO PUT A CREFED NOTE IN A MODULE PAZ = PLIT ASCIZ$, ! OBVIOUS REPEAT = WHILE TRUE DO$, ! INFINITE LOOP WORD = 0,36$, LH = 18,18$, RH = 0,18$, AFT = 18,18$, FORE = 0,18$, POS = 30,6$, SIZ = 24,6$, ASCIIPTR = 36,7$; BIND NONE = ( PAZ '' )<36,7>; !********************************************************************* BIND DEBUG = TRUE; !********************************************************************* BIND HYPEN = "-", TABCHAR = "?I", CRCHAR = "?M", LFCHAR = "?J", SPACE = " ", QMARK = "??", UPARROW = "^", DELLINE = "?U", RUBOUT = #177, CNTRLR="?R", LBRACKET="[", RBRACKET="]", LPAREN="(", RPAREN=")", NONETOKEN=-1, NULLCHAR=0; BIND TTYCHANNEL = 0, LPTCHANNEL = 2, DSKCHANNEL = 3; ! CMDLINE IS WHERE COMMANDS ARE READ INTO ! ALINE IS WHERE SUPLEMENTARY INFO IS READ INTO BIND CMDLINELENGTH = 80, ALINELENGTH = 80; BIND CONV = 1, MBM = 0; MACRO CMDLINE = CMDBUFF,CMDBPTR,CMDCOUNT$, ALINE = ABUFF,ABPTR,ACOUNT$; EXTERNAL ?.JBVER, ?.JBFF; MACRO VGROUP = BITS(0,2)$, VMAJOR = BITS(3,11)$, VMINOR = BITS(12,17)$, VEDIT = BITS(18,35)$; BIND VER=?.JBVER; ! SOME NICE MACROS: MACRO EOL(CHAR)=(.CHAR EQL #15 %CR% OR .CHAR EQL #12 %LF% OR .CHAR EQL #14 %FF% OR .CHAR EQL "!" %COMMENT%)$, BLANK(CHAR)=(.CHAR EQL " " %SPACE% OR .CHAR EQL #11 %TAB%)$, SKIPBLANKS(BUFF,BPTR,BCOUNT,CHAR)=WHILE BLANK(CHAR) DO ADV(BUFF,BPTR,BCOUNT,CHAR)$, NUMERIC(CHAR)=(.CHAR GEQ "0" AND .CHAR LEQ "9")$, ALPHABETIC(CHAR)=(.CHAR GEQ "A" AND .CHAR LEQ "Z")$, ALPHANUMERIC(CHAR)=(NUMERIC(CHAR) OR ALPHABETIC(CHAR))$, NEWCMD(CHAR)=(.CHAR EQL ";")$, COMMNT(CHAR)=(.CHAR EQL "!")$, ADV(BUFF,PBUFF,NC,CHAR)=(NC_.NC+1; CHAR_SCANI(PBUFF))$; ! CLASSES OF OUTPUT COMMANDS: ! OUTS, OUTSA, OUTC, CRLF, TAB, CR, LF GO TO THE CONTROLLING TTY ! TYPE, XTYPE, TYPECRLF, TYPETAB, TYPEBELL CALL OUTC DEPENDING ON THE MSGLEVEL ! PUT, XPUT, PUTCOMMA, PUTWORD GO TO A DEVICE ! OUTPUT, OUTPUTC, OUTPUTCRLF DOES A PUT OR OUTC DEPENDING ON DCHANNEL MACRO TYPE(A) = XTYPE(PLIT ASCIZ A)$, TYPECRLF = XTYPE(PLIT ASCIZ '?M?J')$, TYPETAB = XTYPE(PLIT ASCIZ '?I')$, TYPEBELL = XTYPE(PLIT ASCIZ '?G')$, OUTPUT(Z) = XOUTPUT(PLIT ASCIZ Z)$, OUTPUTCRLF = OUTCRLF()$, OUTPUTTAB = OUTTAB()$, OUTPUTCOMMA = OUTCOM()$, PUT(Z) = XPUT(PLIT ASCIZ Z)$, PUTCOMMA = XPUT(PLIT ASCIZ ',')$, ASKSTR(A,B,C) = ASKS(PLIT ASCII A,B,C)$, ASKDNUM( Q, DFLAG, DVAL, MINVAL, MAXVAL ) = ASKNUM( BASE10, PAZ Q, DFLAG, DVAL, MINVAL, MAXVAL )$, ASKONUM( Q, DFLAG, DVAL, MINVAL, MAXVAL ) = ASKNUM( BASE8, PAZ Q, DFLAG, DVAL, MINVAL, MAXVAL )$, ASKSIZE( Q ) = ASKSZ( PAZ Q )$, NEWASKDNUM( Q, DFLAG, DVAL, SR, MINVAL, MAXVAL ) = NASKNUM( BASE10, PAZ Q, DFLAG, DVAL, SR, MINVAL, MAXVAL )$, NEWASKONUM( Q, DFLAG, DVAL, SR, MINVAL, MAXVAL ) = NASKNUM( BASE8, PAZ Q, DFLAG, DVAL, SR, MINVAL, MAXVAL )$, NEWASKSIZE( Q, S, D ) = NASKSZ( PAZ Q, S, D )$, ASKBITS( Q, A, L) = ASKBS( PAZ Q, A, L)$, ASKFSPEC( Q, SB) = ASKFD( PAZ Q, SB )$, NEWASKFSPEC( Q, SB, SR, OLD) = NASKFD( PAZ Q, SB, SR, OLD )$, ASKCHARS( Q, A, L) = ASKCS( PAZ Q, A, L)$, ASKNAME( Q, L ) = ASKNM( PAZ Q, L )$, ASKYESORNO( Q, DEF ) = ASKYN( PAZ Q, DEF )$, ASK2FSPEC( Q, SB1, SB2 ) = ASK2FD( PAZ Q, SB1, SB2 )$, NEWASK2FSPEC( Q, SB1, SB2 ) = NASK2FD( PAZ Q, SB1, SB2 )$, ASKSWITCH( Q, SW ) = ASKSW( PAZ Q, SW )$, ASKLINE( Q ) = ASKL( PAZ Q )$, DETACHNODE( NODE ) = DTCHND( NODE )$, ATTACHNODE( NODE, PARENTPTR, BEFOREFLG, SIBPTR ) = ATCHND( NODE, PARENTPTR, BEFOREFLG, SIBPTR )$, OUTPUTB( BOOL ) = OUTBOO( BOOL )$, OUTPUTO( NUM ) = OUTPUTN( NUM, BASE8, 1 )$, OUTPUTD( NUM ) = OUTPUTN( NUM, BASE10, 1 )$, OUTPUTC( CHAR ) = OUTTC( CHAR )$, OUTPUTN( BASE, NUM, SIZE ) = OUTTN( BASE, NUM ,SIZE )$, OUTPUTSWORD( WRD ) = OUTTSWORD( WRD )$, OUTPUTSHALF( WRD ) = OUTTSHALFW( WRD )$, OUTPUTM( C, N ) = OUTTM( C, N )$, OUTPUTFSPEC( SB ) = OUTTFSPEC( SB )$, OUTPUTFB( SB ) = OUTTFB( SB )$, OUTPUTBITS( WHERE, LEN ) = OUTTBS( WHERE, LEN )$, OUTPUTSTR( WHERE, LEN ) = OUTTST( WHERE, LEN )$, MAKEBUFFERRING( HDR, PTR, B1, B2, B3 ) = HDR[0] _ VIRGINBUFFERRING + B1<0,0> + 1; HDR[1] _ PTR; B1[1] _ BUFFSIZE - 2; B1[1] _ B2<0,0> + 1; B2[1] _ BUFFSIZE - 2; B2[1] _ B3<0,0> + 1; B3[1] _ BUFFSIZE - 2; B3[1] _ B1<0,0> + 1$; !********************************************************************* ! DEFINE A PORT TABLE ENTRY FORMAT !********************************************************************* BIND PT0NAMESIZE=6, PT0NAMELEN=PT0NAMESIZE/5+1, PT0SIZE = PT0NAMELEN + 3; MACRO ! DEFINATION OF THE FIELDS OF A PORT TABLE ENTRY PT0LINKS = 0,WORD$, ! LINK POINTER FIELD PT0FORE = 0,FORE$, ! FORWARD POINTER PT0AFT = 0,AFT$, ! BACKWARD POINTER PT0NAME = 1,WORD$, ! PORT NAME FIELD PT0FLAGS = PT0NAMELEN+1,LH$, ! FLAGS FIELD PT0SRCPTR = PT0NAMELEN+1,RH$, ! POINTER TO ASSOCIATED TERMINAL PT0PORTNO = PT0NAMELEN+2,RH$; ! NUMBER OF PORT FOR OUTPUT ! UNUSED = PT0NAMELEN+2,LH$; ! UNUSED !********************************************************************* ! DEFINE AN MPP TABLE ENTRY FORMAT !********************************************************************* BIND M0NAMESIZE=12, M0NAMELEN=M0NAMESIZE/5+1, M0SIZE=M0NAMELEN + 6; MACRO ! DEFINATION OF THE FIELDS OF AN MPP TABLE ENTRY M0LINKS = 0,WORD$, ! LINK POINTER FIELD M0FORE = 0,FORE$, ! FORWARD POINTER M0AFT = 0,AFT$, ! BACKWARD POINTER M0NAME = 1,WORD$, ! MPP NAME FIELD M0LISTPTRS = M0NAMELEN + 1, WORD$, ! MPP USERS POINTERS M0FLIST = M0NAMELEN + 1, FORE$, ! FORWARD POINTER M0LLIST = M0NAMELEN + 1, AFT$, ! BACKWARD POINTER M0EGOS = M0NAMELEN + 2, WORD$, ! MPP ALTEREGO POINTERS M0FEGO = M0NAMELEN + 2, FORE$, ! FORWARD POINTER M0LEGO = M0NAMELEN + 2, AFT$, ! BACKWARD POINTER M0MAX = M0NAMELEN + 3,LH$, ! MAXIMUM COPIES THAT MAY RUN M0MIN = M0NAMELEN + 3,RH$, ! MINIMUM COPIES THAT MUST RUN M0FLAGS = M0NAMELEN + 4,LH$, ! FLAGS FIELD M0TOBEDEFINED = M0NAMELEN + 4,BIT(0)$, ! TO BE DEFINED FLAG, 1 IF ONLY NAME KNOWN M0HPQ = M0NAMELEN + 4,BITS(1,4)$, ! HPQ THAT THE MPP IS TO BE RUN IN M0LOCK = M0NAMELEN + 4,BIT(5)$, ! MPP TO BE LOCKED FLAG M0IMMORTAL = M0NAMELEN + 4,BIT(6)$, ! MPP IS NOT TO BE KILLED FLAG M0INITIAL = M0NAMELEN + 4,RH$, ! INITIAL COPIES TO START M0MPPNO = M0NAMELEN + 5,RH$; ! MPP NUMBER ! UNUSED = M0NAMELEN + 5,LH$; ! UNUSED BIND E0SIZE = 5; ! THE ALTEREGO'S LENGTH IS MACRO ! ALTEREGO FIELD DEFINATIONS E0EGOS = 0, WORD$, ! MPP ALTEREGO POINTERS E0FORE = 0, FORE$, ! FORWARD POINTER E0AFT = 0, AFT$, ! BACKWARD POINTER E0SPECBLK = 1, WORD$, ! FILE SPEC BLK (MUST BE IN SAME ORDER AS SPECBLK) E0DEVICE = 1, WORD$, ! DEVICE NAME E0FILENAME = 2, WORD$, ! MPP EGO FILE NAME E0EXT = 3, WORD$, ! MPP EGO EXTENSION E0CORE = 3, RH$, ! MPP INITIAL CORE IN K E0KFLAG = 3, BIT(18)$, ! FLAG TO INDICATE WEITHER KCORE IS IN K OR P E0KCORE = 3, BITS(19,35)$, ! AMOUNT OF CORE E0PPN = 4, WORD$, ! MPP FILE PROJ/PROG NUMBER E0PROJ = 4, LH$, ! PROJECT NUMBER PART OF PPN E0PROG = 4, RH$; ! PROGRAMMER NUMBER PART OF PPN !********************************************************************* ! DEFINE A SPECBLK FORMAT !********************************************************************* BIND SPECBLKLEN = 4; MACRO SB0DEVICE = 0, WORD$, ! DEVICE NAME SB0NAME = 1, WORD$, ! SPECBLK FILE NAME SB0EXT = 2, LH$, ! SPECBLK EXTENSION SB0CORE = 2, RH$, ! SPECBLK INITIAL CORE IN K SB0KFLAG = 2, BIT(18)$, ! FLAG TO INDICATE WEITHER KCORE IS IN K OR P SB0KCORE = 2, BITS(19,35)$, ! AMOUNT OF CORE SB0PPN = 3, WORD$, ! SPECBLK FILE PROJ/PROG NUMBER SB0PROJ = 3, LH$, ! PROJECT NUMBER PART OF PPN SB0PROG = 3, RH$; ! PROGRAMMER NUMBER PART OF PPN !********************************************************************* ! DEFINE A TREE ENTRY FORMAT !********************************************************************* BIND N0NAMESIZE = 12 %CHARACTERS%, N0NAMELEN = N0NAMESIZE/5 + 1 %WORDS%, N0TRCODESIZE = 12 %CHARACTERS%, N0TRCODELEN = N0TRCODESIZE/5 + 1 %WORDS%, N0OPNAMESIZE = 12 %CHARACTERS%, N0OPNAMELEN = N0OPNAMESIZE/5 + 1 %WORDS%, N0SIZE = N0NAMELEN + N0TRCODELEN + N0OPNAMELEN + 8, LEVELMAX = 4; MACRO N0SIBS = 0, WORD$, N0LSIB = 0,LH$, N0RSIB = 0,RH$, N0NAMEW = 1,WORD$, N0NAME = 1, 36, 7$, N0CHILDREN = N0NAMELEN+1, WORD$, N0FIRSTCHILD = N0NAMELEN+1,FORE$, N0LASTCHILD = N0NAMELEN+1,AFT$, N0MPPOFFSETT = N0NAMELEN + 2$, N0MPPLINKS = N0MPPOFFSETT, WORD$, N0MPPFORE = N0MPPOFFSETT,FORE$, N0MPPAFT = N0MPPOFFSETT,AFT$, N0THRESH = N0NAMELEN+3,LH$, N0LEVEL = N0NAMELEN+3,RH$, N0FLAGS = N0NAMELEN+4,LH$, N0TOBEDEFINED = N0NAMELEN+4,BIT(0)$, N0STATUS = N0NAMELEN+4,BIT(1)$, N0OPSTATUS = N0NAMELEN+4,BIT(2)$, N0OPFLAG = N0NAMELEN+4,BIT(3)$, N0CHKPNT = N0NAMELEN+4,BIT(4)$, N0PARENT = N0NAMELEN+4,RH$, N0QUOTA = N0NAMELEN+5,LH$, N0MPPPTR = N0NAMELEN+5,RH$, N0TRCODE = N0NAMELEN+6,WORD$, N0OPNAME = N0NAMELEN+N0TRCODELEN+6,WORD$, N0NO = N0NAMELEN+N0TRCODELEN+N0OPNAMELEN+6,LH$, N0LEAFNO = N0NAMELEN+N0TRCODELEN+N0OPNAMELEN+7,LH$; ! UNUSED = N0NAMELEN+N0TRCODELEN+N0OPNAMELEN+7,RH$; !********************************************************************* ! DEFINE A TERMINAL TABLE ENTRY FORMAT !********************************************************************* BIND T0CNAMESIZE = 12 %CHARACTERS%, T0CNAMELEN = T0CNAMESIZE/5 + 1 %WORDS%, T0TNAMESIZE = 5 %CHARACTERS%, T0TNAMELEN = T0TNAMESIZE/5 + 1 %WORDS%, T0SIZE = T0CNAMELEN + T0TNAMELEN +6; MACRO T0LINKS = 0, WORD$, T0FORE = 0, FORE$, T0AFT = 0, AFT$, T0CNAME = 1,WORD$, T0TNAME = T0CNAMELEN+1, WORD$, T0TNAMEASCII = T0CNAMELEN+1, ASCIIPTR$, ! ANOTHER WAY OF LOOKING AT T0TNAME T0PORTPTR = T0CNAMELEN + T0TNAMELEN+1, LH$, ! UNUSED = T0CNAMELEN + T0TNAMELEN+1,RH$, T0FLAGS = T0CNAMELEN + T0TNAMELEN+2,LH$, T0TOBEDEFINED = T0CNAMELEN + T0TNAMELEN+2,BIT(1)$, T0STATUS = T0CNAMELEN + T0TNAMELEN+2,BITS(2,3)$, T0TNAMEGIVEN = T0CNAMELEN + T0TNAMELEN+2,BIT(4)$, T0OSTAT = T0CNAMELEN + T0TNAMELEN+2,BIT(5)$, T0TTYNO = T0CNAMELEN + T0TNAMELEN+2,RH$, T0PHONE = T0CNAMELEN + T0TNAMELEN+3,WORD$, T0LEAFSTATTAB = T0CNAMELEN + T0TNAMELEN+4,WORD$, T0FIRSTLEAF = T0CNAMELEN + T0TNAMELEN + 4, FORE$, T0LASTLEAF = T0CNAMELEN + T0TNAMELEN + 4, AFT$, T0ALTERPTR = T0CNAMELEN + T0TNAMELEN+5,WORD$, T0FIRSTALTERNATE = T0CNAMELEN + T0TNAMELEN+5,FORE$, T0LASTALTERNATE = T0CNAMELEN + T0TNAMELEN+5,AFT$; !********************************************************************* ! DEFINE A ALTERNATE TERMINAL ENTRY FORMAT !********************************************************************* BIND A0SIZE = T0CNAMELEN + 1; MACRO A0LINKS = 0, WORD$, A0FORE = 0, FORE$, A0AFT = 0, AFT$, A0CNAME = 1, WORD$; !********************************************************************* ! DEFINE A LEAFSTATUS INDICATOR ENTRY FORMAT !********************************************************************* BIND L0SIZE = N0NAMELEN * 4 + 2; MACRO L0LINKS = 0, WORD$, L0FORE = 0, FORE$, L0AFT = 0, AFT$, L0STATUS = 1, LH$, L0TYPE = 1, RH$, L0NODENAME = 2, WORD$, L0PRIM = 2, WORD$, L0SUB1 = N0NAMELEN + 2, WORD$, L0SUB2 = N0NAMELEN * 2 + 2, WORD$, L0SUB3 = N0NAMELEN * 3 + 2, WORD$; !********************************************************************* ! DEFINE A PASSWORD ENTRY FORMAT !********************************************************************* BIND PW0LEN = 10, PW0WORDSIZE = PW0LEN / 5 + 1, PW0SIZE = PW0WORDSIZE + 1; MACRO PW0LINKS = 0, WORD$, PW0FORE = 0, FORE$, PW0AFT = 0, AFT$, PW0WORD = 1, WORD$; !********************************************************************* ! DEFINE A LOCAL MPP ENTRY FORMAT !********************************************************************* BIND LMPP0LEN = 6, LMPP0NAMESIZE = LMPP0LEN / 5 + 1, LMPP0SIZE = LMPP0NAMESIZE + 1; MACRO LMPP0LINKS = 0, WORD$, LMPP0FORE = 0, FORE$, LMPP0AFT = 0, AFT$, LMPP0NAME = 1, WORD$; !********************************************************************* ! DEFINE A TRCODE ENTRY FORMAT !********************************************************************* MACRO TR0SIZE = 0, RH$, ! LENGTH OF TRCODE IN WORDS TR0CHAR = 0, LH$, ! LENGTH OF TRCODE IN CHARACTERS TR0CODE = 1, WORD$, ! TRCODE TR0CODEASCII = 1, ASCIIPTR$; ! SAME AS TRCODE BUT IN INCREMENT TYPE BYTE POINTER !********************************************************************* ! SPECIAL RESPONSE PLIT FORMAT !********************************************************************* MACRO SRES0VAL = 0, WORD$, ! THE VALUE OF A SPECIAL RESPONSE SRES0LIT = 1, 36, 7$; ! THE LITERAL OF A SPECIAL RESPONSE !********************************************************************* ! PHONE NUMBER SIZES !********************************************************************* BIND PN0LEN = 40, PN0SIZE = PN0LEN / 5 + 1; !********************************************************************* ! TTCALLS !********************************************************************* MACHOP TTCALL=#51, CALLI=#47, OPEN = #50, CLOSE = #70, IN = #56, OUT = #57, LOOKUP = #76, ENTER = #77, RENAME = #55; MACRO INC=(TTCALL(4,VREG);.VREG)$, OUTC(Z)=(VREG_Z; TTCALL(1,VREG))$, OUTSA(Z)=TTCALL(3,Z)$, OUTS(Z)=TTCALL(3,PLIT ASCIZ Z)$, OUTSN(AP,N)=BEGIN REGISTER BP; BP_AP; DECR I FROM (N)-1 TO 0 DO OUTC(SCANI(BP)); END$, OUTM(C,N)=DECR I FROM (N)-1 TO 0 DO OUTC(C)$, CR=OUTC(#15)$, LF=OUTC(#12)$, CRLF=OUTS('?M?J')$, TAB=OUTC(#11)$, PROMPT=OUTC("*")$, CORE(Z)=CALLI(Z,#11)$, PJOB( A ) = CALLI( A, #30 )$, RUNUUO( A ) = CALLI( A, #35 )$, TMPCOR( A ) = CALLI( A, #44 )$, XIT=CALLI(0,#12)$; MACRO OUTD(Z)=OUTN(Z,10,1)$, OUTO(Z)=OUTN(Z,8,1)$, OUTDR(Z,N)=OUTN(Z,10,N)$, OUTOR(Z,N)=OUTN(Z,8,N)$; SWITCHES LIST; ! END OF MGNMAC.BLI