TITLE DTS - DECnet Test Sender SUBTTL W. Nichols May, 1981 SEARCH JOBDAT,MACSYM,UUOSYM,DTSPRM,SWIL,MACTEN $RELOC SALL ;PRETTIER LISTING .DIRECTIVE FLBLST ;DON'T GIVE ME CODE FOR ASCIZ COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1986. ALL RIGHTS RESERVED.\ ; This program conforms to the DTS specification version 1.1 ; published on 22 April 1981. ; This program does not conform to the DTS specification any more, ; it conforms to reality. Places marked with a [3] indicate where ; reality does not match architecture. This was done since noone else ; implements field 3 in the interrupt test connect. PRGID=:'DTS ' ;NAME OF THIS PROGRAM PRGABR=:'DTS' ;3 CHR ABBREVIATION USED FOR PROG. DTSWHO==0 DTSVER==1 ;MAJOR VERSION DTSMIN==0 ;MINOR VERSION DTSEDT==4 ;EDIT NUMBER DEFINE VRSN. (PROG),< BYTE (3) PROG'WHO (9) PROG'VER (6) PROG'MIN (18) PROG'EDT > LOC .JBVER VRSN. DTS RELOC LOC .JBREN EXP REENTER RELOC ;Expand the INTERNAL/EXTERNAL macro from DTSPRM GLOBAL EXTERNAL,INTERNAL SUBTTL Revision History COMMENT & Edit Description 4 17-Jan-84 by Bill Davenport Fixed the ENTACT (enter active) routine to accept NSP. error code NSABO% (abort by object) which can occur on the disconnect test. Also fix typo in the routine to process the disconnect response. &; End Revision History SUBTTL Command Table ;This implementation of DTS has three parsing levels: ; 1) Commands ; 2) Options ; 3) Switch Lists ; ;A set of tables arranged in a tree hold the parsing directions for each of ;the levels. The root of the tree is in the COMMAND table which is made up ;of CMDENTs (command entries). DEFINE CMDMAC,< $XLIST CMDENT EXIT, .EXIT, .HEXIT CMDENT TAKE, .TAKE, .HTAKE CMDENT HELP, .HELP, .HHELP CMDENT NODENA, .NODE, .HNODENA CMDENT LOGGIN, .LOG, .HLOGGIN CMDENT NOLOGI, .NOLOG, .HNOLOGI CMDENT TEST, .TEST, .HTEST CMDENT *CONNEC,.TCONNEC, .HCONNEC CMDENT DISCON, .TDISCON, .HDISCON CMDENT DATA, .TDATA, .HDATA CMDENT INTERR, .TINTERR, .HINTERR CMDENT STATUS, .STATUS, .HSTATUS CMDENT DDT, .DDT, .HDDT IFN FTEXTRA,< CMDENT AUDIT, USAUDIT, .HAUDIT CMDENT CONGEST,USCONGEST, .HCONGEST CMDENT DELAY, USDELAY, .HDELAY CMDENT ETRACE, USETRACE, .HETRACE CMDENT INACTI, USINACT, .HINACTI CMDENT JIFFY, USJIFFY, .HJIFFY CMDENT LINK, USLINK, .HLINK CMDENT LONGINT,USLONGINT, .HLONGINT CMDENT MTROLL, USMTROLL, .HMTROLL CMDENT NOCONGEST,USRELIEVED, .HNOCONGEST CMDENT RELIEVED,USRELIEVED, .HRELIEVED CMDENT SHORTINT,USSHORTINT, .HSHORTINT CMDENT THRESH, USTHRESH, .HTHRESH CMDENT TIMENOW,USTIME, .HTIMENOW CMDENT TRACE, USTRACE, .HTRACE CMDENT TROLL, USTROLL, .HTROLL CMDENT WEIGHT, USWEIGHT, .HWEIGHT > IFN FTNCP, $LIST >;End of Command Macro Definition DEFINE TSTMAC,< $XLIST TSTENT CONNEC, CNT TSTENT DATA, DAT TSTENT DISCON, DSC TSTENT INTERR, INT $LIST > DEFINE NODMAC,< ;; Name, Argtyp, Value, Loc, Default, LocLength $XLIST ;;The first four elements have a default value of STRLNW so that ;;we will fill in the length of the string blocks defined for ;;these commands. OPTENT NAME, VALARG, STRBLD, NODNAM, STRLNW, STRLNW OPTENT UID, VALARG, STRBLD, UID, STRLNW, STRLNW OPTENT PASSWO, VALARG, STRBLD, PASSWO, STRLNW, STRLNW OPTENT ACCOUN, VALARG, STRBLD, ACCOUN, STRLNW, STRLNW OPTENT PRINT, LISARG, PRIIOW, PRINT, .VLYES, 1 OPTENT NOPRIN, IMMARG, .VLNO, PRINT, .VLYES, 1 OPTENT STATIS, IMMARG, .VLYES, STATIS, .VLYES, 1 OPTENT NOSTAT, IMMARG, .VLNO, STATIS, .VLYES, 1 OPTENT DISPLA, IMMARG, .VLYES, DISPLA, .VLYES, 1 OPTENT NODISP, IMMARG, .VLNO, DISPLA, .VLYES, 1 OPTENT BAUD, VALARG, DECNW, BAUD, 0, 1 OPTENT SPEED, VALARG, DECNW, BAUD, 0, 1 OPTENT LOG, VALARG, STRLOG, LOGFLG, 0, 1 OPTENT NOLOG, VALARG, STPLOG, LOGFLG, 0, 1 OPTENT OLD, IMMARG, 1, OLDFLG, 1, 1 OPTENT NEW, IMMARG, 0, OLDFLG, 1, 1 $LIST > DEFINE CNTMAC,< ;; Name, Argtyp, Value, Loc, Default, LocLength $XLIST OPTENT RETURN, LISARG, RETIOW, RETTYP, .VLNO, 1 OPTENT NORETU, IMMARG, .VLNO, RETTYP, .VLNO, 1 OPTENT TYPE, LISARG, CTTIOW, CNTTYP, CTT.AC, 1 OPTENT REJECT, IMMARG, CTT.RE, CNTTYP, CTT.AC, 1 OPTENT ACCEPT, IMMARG, CTT.AC, CNTTYP, CTT.AC, 1 $LIST > DEFINE DSCMAC,< ;; Name, Argtyp, Value, Loc, Default, LocLength $XLIST OPTENT RETURN, LISARG, RETIOW, RETTYP, .VLNO, 1 OPTENT NORETU, IMMARG, .VLNO, RETTYP, .VLNO, 1 OPTENT TYPE, LISARG, DSTIOW, DSCTYP, DST.SY, 1 OPTENT SYNCHR, IMMARG, DST.SY, DSCTYP, DST.SY, 1 OPTENT ABORT, IMMARG, DST.AB, DSCTYP, DST.SY, 1 $LIST > DEFINE DATMAC,< ;; Name, Argtyp, Value, Loc, Default, LocLength $XLIST OPTENT TIME, VALARG, RDX60W, TIME, ^D60, 1 OPTENT MSGSIZ, VALARG, DECNW, DMSGSIZ,^D128, 1 OPTENT *SGMSIZ,VALARG, DECNW, DSGMSIZ,^D128, 1 OPTENT SGNSIZ, VALARG, DECNW, DSGMSIZ,^D128, 1 OPTENT SEGSIZ, VALARG, DECNW, DSGMSIZ,^D128, 1 OPTENT BAUD, VALARG, DECNW, BAUD, 0, 1 OPTENT SPEED, VALARG, DECNW, BAUD, 0, 1 OPTENT SQUEUE, VALARG, DECNW, SQUEUE, 1, 1 OPTENT RQUEUE, VALARG, DECNW, RQUEUE, 1, 1 OPTENT SFLOW, LISARG, FLOIOW, SFLTYP, FLO.SEG, 1 OPTENT RFLOW, LISARG, FLOIOW, RFLTYP, FLO.SEG, 1 OPTENT TERMIN, LISARG, TERIOW, TERMIN, TER.SYN, 1 OPTENT TYPE, LISARG, DTTIOW, DATTYP, DTT.SINK, 1 OPTENT SINK, IMMARG, DTT.SI, DATTYP, DTT.SI, 1 OPTENT SEQUEN, IMMARG, DTT.SE, DATTYP, DTT.SI, 1 OPTENT PATTER, IMMARG, DTT.PA, DATTYP, DTT.SI, 1 OPTENT ECHO, IMMARG, DTT.EC, DATTYP, DTT.SI, 1 $LIST > DEFINE INTMAC,< ;; Name, Argtyp, Value, Loc, Default, LocLength $XLIST OPTENT TIME, VALARG, RDX60W, TIME, ^D60, 1 OPTENT MSGSIZ, VALARG, DECNW, IMSGSIZ,^D16, 1 OPTENT BAUD, VALARG, DECNW, BAUD, 0, 1 OPTENT SPEED, VALARG, DECNW, BAUD, 0, 1 OPTENT SQUEUE, VALARG, DECNW, SQUEUE, 1, 1 OPTENT RQUEUE, VALARG, DECNW, RQUEUE, 1, 1 OPTENT TERMIN, LISARG, TERIOW, TERMIN, TER.SYN, 1 OPTENT TYPE, LISARG, DTTIOW, INTTYP, DTT.SINK, 1 OPTENT SINK, IMMARG, DTT.SI, INTTYP, DTT.SI, 1 OPTENT SEQUEN, IMMARG, DTT.SE, INTTYP, DTT.SI, 1 OPTENT PATTER, IMMARG, DTT.PA, INTTYP, DTT.SI, 1 OPTENT ECHO, IMMARG, DTT.EC, INTTYP, DTT.SI, 1 $LIST > ;The third parser level: key values used by options. DEFINE KEYLIS(abbr,keys),< ..NUM==0 IRP keys,<..NUM==..NUM+1> abbr'.MX==..NUM ;;ESTABLISH MAX OFFSET ALLOWED abbr'IOW:IOWD ..NUM,.+1 ..NUM==0 IRP keys,< EXP SIXBIT "keys" ..NUM==..NUM+1 IFDEF abbr'.'keys,> abbr'.'keys==..NUM > > ;The first key in the list is always the "present default". KEYLIS PRI, KEYLIS CTT, KEYLIS RET, ;SEE ROUTINE DO.CONNECT KEYLIS DST, KEYLIS DTT, ;SEE DO.DATA KEYLIS FLO, KEYLIS TER, FCMTRN: .NSFCS ;(DEFAULT TO SEGMENT FLOW CONTROL) .NSFCS ;TABLE TO TRANSLATE OUR .NSFC0 ; FLOW CONTROL VALUES TO THOSE .NSFCM ; OF THE NETWORK ;THESE ARE OUT OF ORDER SO THAT ; SEGMENT FLOW CONTROL WILL BE DEFAULT .VLNO==0 ;THE "NO" VALUE FOR YES/NO SWITCHES .VLYES==1 ;THE "YES" VALUE FOR YES/NO SWITCHES SUBTTL Expand the Command Macros DEFINE CMDENT(name,proc,hproc), CMDNMT: CMDMAC ;NAMES OF THE MAJOR COMMANDS CMDLEN==.-CMDNMT DEFINE CMDENT(name,proc,hproc), CMDPRC: CMDMAC ;PROCEDURES FOR THE MAJOR COMMANDS DEFINE CMDENT(name,proc,hproc), CMDHPR: CMDMAC ;HELP PROCEDURES DEFINE TSTENT(name,abbr), TSTNMT: TSTMAC ;NAMES OF THE [TEST:] COMMANDS TSTLEN==.-TSTNMT BEGSTR TE WORD NMT WORD TAB ENDSTR DEFINE TSTENT(name,abbr),< [IOWD abbr'LEN,abbr'NMT ;;POINTER TO OPTION NAME TABLE EXP abbr'TAB] ;;POINTER TO OPTION PARSE TABLE > TSTPRC: TSTMAC ;PROCEDURES FOR THE [TEST:] CMDS SUBTTL Expand the Option Macros ;Expand the Option Macros DEFINE TABLST,< MAKTAB CNT ;;CONNECT MAKTAB DSC ;;DISCONNECT MAKTAB DAT ;;DATA MAKTAB INT ;;INTERRUPT MAKTAB NOD ;;NODE > DEFINE OPTENT(name,argtyp,value,loc,defalt<0>,loclen<1>),< EXP SIXBIT /name/ ..NUM==..NUM+1 > DEFINE MAKTAB(abbr),<..NUM==0 abbr'NMT: abbr'MAC abbr'LEN==..NUM > TABLST ;MAKE NAMES FOR ALL IN THE TABLE LIST BEGSTR OE WORD VAL ;VALUE TO BE STORED WORD TYP ;THE ARGUMENT TYPE WORD LOC ;POINTER TO LOCATION ENDSTR ;OPPLIS depends on the following ordering IMMARG==0 ;IMMEDIATE ARGUMENT TYPE VALARG==1 ;GET-A-VALUE ARGUMENT TYPE LISARG==2 ;OFFSET INTO LIST ARGUMENT TYPE DEFINE OPTENT(name,argtyp,value,loc,defalt<0>,loclen<1>),< Z [Z value Z argtyp Z loc] > DEFINE MAKTAB(abbr), TABLST ;MAKE TABLES FOR ALL IN THE TABLE LIST $LOW DEFINE OPTENT(name,argtyp,value,loc,defalt<0>,loclen<1>),< EXP defalt IFNDEF loc, IFG loclen-1,BLOCK loclen-1 > DEFINE MAKTAB(abbr), TABLST ;MAKE LOCS FOR ALL IN THE TABLE LIST $HIGH ;The Enter Active Connect Block EACONB: EXP EACONL ;LENGTH OF BLK IN WORDS EXP NODNAM ;STRING PTR TO NODE NAME (.NSCND) EXP EASPRC ;PTR TO SOURCE PRC BLK (.NSCSD) EXP EADPRC ;PTR TO DEST PRC BLK (.NSCDD) EXP UID ;PTR TO UID STRING BLK (.NSCUS) EXP PASSWORD ;PTR TO PASSWORD STR BLK (.NSCPW) EXP ACCOUNT ;PTR TO ACCOUNT STR BLK (.NSCAC) EXP USERDATA ;PTR TO USER DATA STR BLK (.NSCUD) EACONL==.-EACONB ;The Source Process Descriptor EASPRC: EXP 5 ;LENGTH OF BLK IN WORDS EXP 0 ;FORMAT ZERO EXP OBJDTR ;THE OBJECT TYPE OF A DTR EXP 0 ;PPN MUST BE ZERO FOR FORMAT ZERO EXP 0 ;DITTO PROCESS NAME STRING PTR ;The Destination Process Descriptor EADPRC: EXP 5 ;LENGTH OF BLK IN WORDS EXP 0 ;FORMAT ZERO EXP OBJDTR ;THE OBJECT TYPE OF A DTR EXP 0 ;PPN MUST BE ZERO FOR FORMAT ZERO EXP 0 ;DITTO PROCESS NAME STRING PTR SUBTTL General Impure Storage $LOW TSTTYP: BLOCK 1 ;THE TEST TYPE REQUESTED (TEST:xxx) SNDCNT: BLOCK 1 ;NUMBER OF DATA/INT MSGS SENT RCVCNT: BLOCK 1 ;NUMBER OF DATA/INT MSGS RECEIVED SERRCNT: BLOCK 1 ;NUMBER OF NETWORK SEND ERRORS RERRCNT: BLOCK 1 ;NUMBER OF NETWORK RECEIVE ERRORS STRTIM: BLOCK 1 ;TEST START TIME FINTIM: BLOCK 1 ;PREDICTED FINISH TIME ELPTIM: BLOCK 1 ;ELAPSED TIME OF LAST TEST ISGMSIZ: DEC 16 ;INTERRUPT SEGMENT SIZE FOR STATS SGMSIZ: BLOCK 1 ;SEGMENT SIZE FOR STATS MSGSIZ: BLOCK 1 ;PUT MSG SIZE HERE FOR PSTATS IDLFLG: BLOCK 1 ;NON-ZERO TO TRACE IDLE TIME IN DTS SNDMSG: STRBLK MAXMGW ;THE DATA TEST'S OUTGOING MESSAGE PSNDMSG:POINT 8,SNDMSG+1 ;BYTE POINTER TO DATA TEST'S MESSAGE $HIGH SUBTTL Start the Program Here REENTER:EXIT ;WAIT FOR RESET TO WORK PROPERLY DTS:: TDZA T1,T1 ;NON-CCL ENTRY MOVEI T1,1 ;CCL ENTRY MOVEM T1,CCLF1 ;STORE FOR LATER OUTSTR [ASCIZ "Type HELP for help "] MOVE P,PDLIOW ;SET UP STACK DTSRES::RESET ;LABEL IS FOR DDT PATCHING HRRZ T1,.JBREL ;GET FIRST-TIME CORE SIZE MOVEM T1,INICOR HRRZ T1,.JBFF ;GET INITIAL .JBFF MOVEM T1,INIFF ;SAVE FOR LATER ;Some initialization that could be done at compile time, but ;is easier at run time: MOVEI T1,SEQLEN ;LEAVE SEQLEN BYTES FOR MESSAGE NUMBER HRLM T1,SNDMSG ;STORE AS CURRENT MESSAGE LENGTH MOVEI T1,SNDMSG ;POINTER TO STRING BLOCK MOVEI T2,MAXMSG-SEQLEN;LENGTH OF THE DATA MESSAGE CALL FILSTD ;FILL THE WHOLE MESSAGE WITH STD DATA ;Fall through to next page SUBTTL Call .ISCAN ;From previous page ;.ISCAN--SUBROUTINE TO INITIALIZE COMMAND SCANNER ;CALL AC1=XWD LENGTH,BLOCK ; ; BLOCK+0=PROTOCOL VERSION WORD: ,, ; BLOCK+1=0 OR IOWD PTR TO A LIST OF LEGAL MONITOR COMMANDS ; IF 0, NO RESCAN IS DONE ; BLOCK+2=RH 0 OR SIXBIT CCL NAME ; IF 0, NO CCL MODE ; LH 0 OR ADDRESS OF STARTING OFFSET ; BLOCK+3=RH 0 OR ADDRESS OF CHARACTER TYPEOUT ROUTINE ; IF 0, OUTCHR WILL BE DONE FROM T1 ; LH 0 OR ADDRESS OF CHARACTER INPUT ROUTINE ; MUST SAVE ALL ACS, CHAR IN P4 ; BLOCK+4=0 OR POINTER (XWD LEN,BLOCK) TO INDIRECT FILE BLOCK ; .FXDEV NE 0 TO USE BLOCK ; BLOCK+5=RH 0 OR ADDRESS OF MONRET ROUTINE ; LH 0 OR ADDRESS OF PROMPT ROUTINE ; CALLED WITH CHAR IN RH(T1), LH(T1) HAS ; 0 FOR FIRST LINE, -1 FOR CONTINUATION LINES ; BLOCK+6=LH FLAGS ; RH (FUTURE) ;VALUE AC1=INDEX IN TABLE OF COMMANDS IF FOUND(0,1,...), ELSE -1 MOVE T1,[6,,[12,,%%FXVE ;MAJOR,,MINOR SCAN VERSION IOWD 1,[PRGID] ;CCL ENTRY NAME CCLF1,,PRGABR ;CCL FLAG,,PROGRAM NAME ABBREVIATION STYPIN,,STYPOU ;SPECIAL TYPEIN,,TYPEOUT ROUTINE 0,,0 ;NO USER INDIRECT 0,,.EXIT]] ;MONRET ROUTINE CALLSCAN .ISCAN## ;INITIALIZE SCAN ;Fall through to next page SUBTTL Main Loop ;Fall through from previous page REPARSE: CALL PARSE ;GET ALL REQUESTS FROM THE USER JRST REPARSE ;ERROR MESSAGE ALREADY GIVEN CALL DO.DTS ;NO MORE ERRORS FROM USER, GO DO IT JRST REPARSE ;ERROR MESSAGE ALREADY GIVEN JRST REPARSE ;GO DO IT AGAIN SUBTTL The Parser ;PARSE - Parse the User's commands into global variables ; ;Call: CALL PARSE ; Error Return, message already put out ; Normal Return, ready to call DO.DTS ;Changes T1,T2,T3,T4 PARSE: SAVEAC PUSHJ P,.CCLRB## ;CLEAR TYPEAHEAD IF WAS AN ERROR CAXN C,.CHEOF ;IF WE'VE FINISHED SOMETHING PJRST .ALDON## ; EXIT UNLESS IN INDIRECT FILE MOVEI T1,0 ;NO SPECIAL SWICHES FOR .FILIN CALLSCAN .PSCAN## ;INITIALIZE PARTIAL SCANNER OUTSTR [ASCIZ \DTS> \] ;SKIP RET IF NO PROMPT NEEDED ;Here we wait, outside the call to SCAN and its PSIOFF for the ;user to type something. This gives PSISER a chance to interrupt ;a waiting DTS. PARS.1: REPEAT 0,< SKPINC ;SEE IF WE'VE GOT A CHARACTER TRNA ;NO INPUT YET JRST PARS.2 ;GOT SOME MOVE T1,[EXP HB.RTL ! HIBTIM] ;WAKE ON CHARACTER INPUT HIBER T1, ;GIVE PSI A CHANCE TO INTERRUPT JFCL ; THE INCHRW JRST PARS.1 ;CHECK FOR FALSEHOOD AND LIES FROM PSISER > ;END REPEAT 0 PARS.2: CALLSCAN .SIXSW## ;GET A SIXBIT VALUE INTO N JUMPE N,[CAIN C,"@" ;ASKING FOR INDIRECT FILE? MOVE N,['TAKE '] ;YES, MAKE A TAKE COMMAND CAIE C,"?" ;ASKING FOR HELP? CAIN C,"/" ; (PERHAPS TRYING /HELP)? MOVE N,['HELP '] ;YES, MAKE A HELP COMMAND JUMPE N,.POPJ ;NO, NULL COMMAND JRST .+1 ] ;GO DEAL WITH THIS COMMAND MOVE T1,[IOWD CMDLEN,CMDNMT] ;LIST OF COMMAND NAMES MOVE T2,N ;THIS COMMAND NAME IN SIXBIT CALL LOOKNM ;GET INDEX INTO COMMAND TABLE JRST UNKCMD ;NOT FOUND OR AMBIGUOUS HRRZS T1 ;DON'T CARE IF EXACT MATCH OR NOT SUBI T1,CMDNMT ;MAKE IT AN OFFSET INTO CMD TABLES ;Now T1 holds offset into CMDxxx tables CALL @CMDPRC(T1) ;CALL APPROPRIATE PROCESSOR RET ;ERROR RETURN, MESSAGE ALREADY PUT OUT RETSKP ;SUCCESS RETURN, GO DO DO.DTS SUBTTL EXIT Command ;Called by the EXIT command and by SCAN's monret routine .EXIT: CALL CLSLOG ;IN CASE IT WAS OPEN PJRST .MNRET## ;SCAN'S MONRET HANDLER SUBTTL TAKE Command ;.TAKE - Read an indirect file ; ;Call: CALL .TAKE ; Error Return, always to cause a REPARSE, now from indirect file ; Normal Return, never. ;Changes T1,T2,T3,T4 .TAKE: JUMPL C,MISARG ;JUMP IF NO COMMAND FILE PJRST .GTIND## ;READ IN FILE NAME, MAKE IT ; THE INDIRECT FILE ;ERROR RETURN TO CAUSE REPARSE SUBTTL HELP Command .HELP: SETOM .FLCBF## ;CLEAR REST OF LINE WHEN NEXT AT TOP LEVEL JUMPL C,HLPALL ;IF EOL, GIVE TOP LEVEL HELP caie c,"?" ;DID WE GET HERE AS A RESULT OF CAIN C,"/" ; THE PSEUDO-HELP COMMANDS? JRST HLPALL ;YES, GIVE AN OVERVIEW OF HELP CALLSCAN .SIXSW## ;GET A COMMAND TO GIVE HELP ON JUMPE N,HLPALL MOVE T1,[IOWD CMDLEN,CMDNMT];TABLE OF COMMAND NAMES MOVE T2,N ;THIS COMMAND NAME IN SIXBIT CALL LOOKNM ;GET INDEX INTO COMMAND TABLE JRST UNKCMD ;NOT FOUND OR AMBIGUOUS HRRZS T1 ;DON'T CARE IF EXACT MATCH OR NOT SUBI T1,CMDNMT ;MAKE IT AN OFFSET INTO HLP TABLES PJRST @CMDHPR(T1) ;CALL APPROPRIATE HELP PROC ;ERROR RETURN CAUSES REPARSE HLPALL: OUTSTR HLPTXT IFN FTEXTRA,OUTSTR HLPTXE ;OUTPUT EXTRA COMMAND'S HELP TOO IFN FTNCP,OUTSTR HLPTXN ;OUTPUT NCP COMMAND IF ITS COMPILED RET ;ERROR RETURN CAUSES REPARSE HLPTXT: ASCIZ \ The commands to DTS are: HELP TAKE command-file-name LOG log-file-name (default is DTS.LOG) NODENAME nodename options CONNECT options DISCONNECT options DATA options INTERRUPT options DDT STATUS EXIT (also closes log file) Type "HELP commandname" for further help with a command's options. For example, HELP DATA will describe the options to the DATA test. A typical command might be: TEST:CONNECT TYPE:REJECT RETURN:NONE An equal sign (=) may be used instead of any colon in a command. \;end of ASCIZ IFN FTEXTRA,< HLPTXE: ASCIZ \ Additional commands for developers are: AUDIT, CONGEST, DELAY, ETRACE, INACTIVITYTIMER, JIFFY, LONGINTERVAL CONGEST, MTROLL, RELIEVED, SHORTINTERVAL, THRESHOLD, TIMENOW TRACE, TROLL, WEIGHT, LINK \>;END OF IFN FTEXTRA IFN FTNCP,< HLPTXN: ASCIZ \ The NCP command calls the NTMAN. exercizer. \ > .HEXIT: OUTSTR HLTEXIT RET ;ERROR RETURN CAUSES REPARSE HLTEXIT: ASCIZ \ The EXIT command takes no arguments. If a log file is open, this command closes it. It then exits to the monitor. The monitor CONTINUE command will cause DTS to continue. \ .HTAKE: OUTSTR HLTTAKE RET ;ERROR RETURN CAUSES REPARSE HLTTAKE: ASCIZ \ The TAKE command causes DTS to read commands from a command file. The format of the command file is exactly as if the user had typed the commands on a terminal. The default extension for the command file is .CCL. \ .HHELP: OUTSTR HLTHELP RET ;ERROR RETURN CAUSES REPARSE HLTHELP: ASCIZ \ The HELP command by itself gives an overview of the commands to DTS. For help with a specific command, type HELP and then the command name. For example, HELP HELP DATA \ .HLOGG: .HNOLO: OUTSTR HLTLOG RET ;ERROR RETURN CAUSES REPARSE HLTLOG: ASCIZ \ The LOG command causes DTS to start logging to the specified log file. The default log file name is DTS.LOG. If DTS was already logging, the old log file is closed and the log file specified is started. If a log file by the specified (or defaulted) name already exists, DTS will append to it, preceeding the new text with a form feed. The NOLOG command closes any open log file and causes DTS to stop logging. \ .HSTAT: OUTSTR HLTSTA RET ;ERROR RETURN CAUSES REPARSE HLTsta: ASCIZ \ The STATUS command causes DTS to report the DECnet status variable for its link. \ .HTEST: OUTSTR HLTTEST RET ;ERROR RETURN CAUSES REPARSE HLTTEST: ASCIZ \ The TEST command takes as argument one of the four DTS tests: CONNECT DISCONNECT DATA INTERRUPT The TEST command is meaningless, since to give the command TEST:testtype is equivalent to giving the command testtype by itself. See HELP for the four test command for more help. \ .HNODE: OUTSTR HLTNOD RET HLTNOD: ASCIZ \ The first argument to the node command is the name of the node at which the DTR is running. The noise word NAME may preceed the node name. The options follow the node name. NODE command options: UID:user-id PASSWORD:password ACCOUNT:account PRINT:ALL (initial default) ERROR NONE NOPRINT STATISTICS NOSTATISTICS DISPLAY NODISPLAY BAUD:baud-rate SPEED:baud-rate LOG (default log file name DTS.LOG) NOLOG LOG:log-file-name OLD Use old DTS/DTR protocol NEW (Default for each new NODE command) Use new protocol If a filename is given to the LOG option, then the filename must be the last text on this command line. \;END OF ASCIZ .HCONN: OUTSTR HLTCON RET HLTCON: ASCIZ \ CONNECT command options: TYPE:ACCEPT (initial default) REJECT RETURN:STANDARD (initial default) RECEIVED NONE NORETURN \;end of ASCIZ .HDISC: OUTSTR HLTDIS RET HLTDIS: ASCIZ \ DISCONNECT command options: TYPE:SYNCHRONOUS (initial default) ABORT RETURN:STANDARD (initial default) RECEIVED NONE NORETURN \;end of ASCIZ .HDATA: OUTSTR HLTDAT RET HLTDAT: ASCIZ \ DATA command options: TYPE:SINK (initial default) SEQUENCE PATTERN ECHO SFLOW:SEGMENT (initial default) MESSAGE NONE RFLOW:SEGMENT (initial default) MESSAGE NONE MSGSIZE:bytes (initial default 128) SGMSIZE:bytes (initial default 128) BAUD:number SPEED:same as baud SQUEUE:send queue (initial default 1) RQUEUE:receive queue (initial default 1) TERMINATION:SYCNHRONOUS (initial default) ABORT TIME:hh:mm:ss (initial default 60 seconds) or TIME:mm:ss (minutes:seconds) or TIME:xx HOURS or TIME:xx MINUTES or TIME:xx SECONDS \;end of ASCIZ .HINTE: OUTSTR HLTINT RET HLTINT: ASCIZ \ INTERRUPT command options: TYPE:SINK (initial default) SEQUENCE PATTERN ECHO MSGSIZE:bytes (initial default 16) BAUD:number SPEED:same as baud SQUEUE:send queue (initial default 1) RQUEUE:receive queue (initial default 1) TERMINATION:SYCNHRONOUS (initial default) ABORT TIME:hh:mm:ss (initial default 60 seconds) or TIME:mm:ss (minutes:seconds) or TIME:xx HOURS or TIME:xx MINUTES or TIME:xx SECONDS \;end of ASCIZ IFN FTEXTRA,< .HAUDIT: .HCONGEST: .HDELAY: .HETRACE: .HINACTI: .HJIFFY: .HLONGINT: .HNOCONGEST: .HMTROLL: .HRELIEVED: .HSHORTINT: .HTHRESH: .HTIME: .HTRACE: .HTROLL: .HWEIGHT: OUTSTR HLTEXTRA RET ;ERROR RETURN CAUSES REPARSE HLTEXTRA: ASCIZ \ This command is a special debugging or fault-insertion command which is not expected to be used by people other than the developers. \ .HLINK: OUTSTR HLTLINK RET ;ERROR RETURN CAUSES REPARSE HLTLINK: ASCIZ \ Type out the contents of NSP's port block for the specified link. Link number is requested in decimal to correspond with the trace. \ >;END OF IFN FTEXTRA IFN FTNCP,< .HNCP: OUTSTR HLTNCP RET HLTNCP: ASCIZ \ The NCP command invokes the interim NCP command processor which exercizes the network management (NTMAN.) UUO. \>;END OF IFN FTNCP .HDDT: OUTSTR HLTDDT RET ;ERROR RETURN CAUSES REPARSE HLTDDT: ASCIZ \ Go to DDT if it is loaded, else does nothing. This command fills in .JBOPC, so to return from DDT, type G$G which does a JRST @.JBOPC \ SUBTTL Logging and No Logging Commands .LOG: CALL STRLOG ;START LOGGING MOVEM N,LOGFLG ;STORE -1 IF SUCCESSFUL, ELSE ZERO RET ;ERROR RETURN CAUSES REPARSE .NOLOG: CALL STPLOG ;STOP LOGGING RET SUBTTL NODE Command ;.NODE - Get node specification for future action command ; ;Call: CALL .NODE ; Error Return, always, to cause reparse ; Normal Return, never, this is not an action command ;Changes T1,T2,T3,T4 .NODE: NODE.0: JUMPL C,MISARG ;COMPLAIN IF EOL ALREADY CALLSCAN .SIXSW## ;THIS SHOULD BE THE NODE NAME JUMPE C,MISARG ;COMPLAIN IF NO NAME MOVE T1,[IOWD 1,[SIXBIT /NAME/]] MOVE T2,N CALL LOOKNM ;IS IT THE NOISE WORD 'NAME'? CAIA ;NO, ITS A VALID NODE NAME JRST NODE.0 ;YES, IGNORE IT AND TRY AGAIN MOVEI T1,NODNAM ;POINTER TO TARGET STRING BLOCK MOVE T2,N ;THE SIXBIT SOURCE WORD CALL SIX2ST ;COPY AND CONVERT TO STRING BLOCK ;Turn off the OLD (old DTR protocol) flag so it does not default ;to being on once turned on for one node. This means user must ;specify OLD anew on each appropriate NODENAME command. SETOM OLDFLG ;ASSUME THIS IS OLD UNTIL TOLD IT IS NOT ;Now fish for NODE command options NODE.1: JUMPL C,.POPJ ;LEAVE IF WE HAVE EOL CALLSCAN .SIXSW## ;GET A SIXBIT LEXEME JUMPE N,.POPJ ;ERROR RETURN CAUSES REPARSE MOVE T1,[IOWD NODLEN,NODNMT];LIST OF NODE COMMAND OPTIONS MOVE T2,N ;GET COMMAND NAME IN SIXBIT CALL LOOKNM ;LOOK IT UP PJRST UNKCMD ;NOT FOUND OR AMBIGUOUS HRRZS T1 ;DON'T CARE IF EXACT MATCH OR NOT SUBI T1,NODNMT ;MAKE POINTER INTO TABLE OFFSET MOVE T1,NODTAB(T1) ;GET POINTER TO OPTION TABLE CALL OPTPRC ;CALL THE OPTION TABLE PROCESSOR RET ;ERROR RETURN, MESSAGE ALREADY PUT OUT JRST NODE.1 ;KEEP GOING TO END OF LINE SUBTTL TEST Command ;.TEST - Get TEST specification ; ;Call: CALL .TEST ; Error Return, message already put out ; Normal Return, main loop will call DO.DTS ;Changes T1,T2,T3,T4 .TEST: JUMPL C,NOTEST ;COMPLAIN IF EOL ALREADY TEST.0: CALLSCAN .SIXSW## ;THIS SHOULD BE THE TEST NAME JUMPE C,NOTEST ;COMPLAIN IF NO NAME MOVE T1,N ;SET UP FOR DFTCMD PJRST DFTCMD ;NOW WE'RE THE SAME AS THE DEFAULT CMD ;Here when the user has defaulted the TEST:xxx command by ;just giving the name of the test. Pretend the user typed TEST: ;and give the command to the DFTCMD routine. .TCONNEC: .TDISCON: .TDATA: .TINTERR: SKIPN T1,CURCMD ;GET CURRENT COMMAND AGAIN JRST NOTEST ;WEAK INTERNAL TEST PJRST DFTCMD ;AND PRETEND IT WAS ARG TO TEST:xxx ;Here on error NOTEST: ERROR No test specified,CRLF RET SUBTTL DFTCMD - The Default Command [TEST:] ;DFTCMD - The Default Command [TEST:] ; ;Call: T1/ The SIXBIT test name ; CALL DFTCMD ; Error Return ; Normal Return ;Changes T1,T2,T3,T4 DFTCMD: SAVEAC MOVE T2,T1 ;THE SIXBIT COMMAND NAME MOVE T1,[IOWD TSTLEN,TSTNMT] ;THE TEST NAME TABLE CALL LOOKNM PJRST UNKCMD ;ERROR IF NOT FOUND OR AMBIGUOUS HRRZS T1 ;GOT ONE! SUBI T1,TSTNMT-1 ;MAKE T1 INTO AN OFFSET MOVEM T1,TSTTYP ;SAVE AWAY THE TEST TYPE MOVE P1,TSTPRC-1(T1) ;GET POINTER TO OPTION TABLE INTO P1 ;Now fish for TEST command options TEST.1: JUMPL C,.POPJ1 ;SUCCESS RETURN SAYS DO DO.DTS NOW CALLSCAN .SIXSW## ;GET A SIXBIT LEXEME JUMPE N,.POPJ1 ;SUCCESS RETURN SAYS DO DO.DTS NOW LOAD T1,TENMT,(P1) ;IOWD TO LIST OF TEST COMMAND OPTIONS HRL P1,T1 ;SAVE BASE OF TABLE FOR OFFSETTING MOVE T2,N ;GET COMMAND NAME IN SIXBIT CALL LOOKNM ;LOOK IT UP PJRST UNKCMD ;NOT FOUND OR AMBIGUOUS HRRZS T1 ;DON'T CARE IF EXACT MATCH OR NOT HLRZ T2,P1 ;RECOVER THE TABLE POINTER SUB T1,T2 ;MAKE POINTER INTO A TABLE OFFSET LOAD T2,TETAB,(P1) ;GET POINTER TO POINTER TO OPTION BLOCK ADD T1,T2 ;POINT TO APPROPRIATE OPTION PARSE TBL MOVE T1,-1(T1) ;GET POINTER TO OPTION BLOCK CALL OPTPRC ;CALL THE OPTION TABLE PROCESSOR RET ;ERROR RETURN, MESSAGE ALREADY PUT OUT JRST TEST.1 ;KEEP GOING TO END OF LINE SUBTTL OPTPRC - Option Table Processor ;OPTPRC - Process an Option Switch ; ;Call: T1/ Pointer to xxxOPT entry table ; CALL OPTPRC ; Error Return, message already put out ; Normal Return ;Changes T1,T2,T3,T4 OPTPRC: SAVEAC P1 MOVE P1,T1 ;SAVE POINTER TO OPT ENTRY TABLE LOAD T1,OETYP,(P1) ;GET THE ARGUMENT TYPE PJRST @[EXP OPPIMM ;IMMEDIATE ARGUMENT TYPE EXP OPPVAL ;GET-A-VALUE ARGUMENT TYPE EXP OPPLIS](T1);OFFSET INTO LIST ARGUMENT TYPE ;Here to store an immediate value OPPIMM: LOAD T1,OEVAL,(P1) ;GET THE IMMEDIATE VALUE TO STORE LOAD T2,OELOC,(P1) ;GET THE ADDRESS OF LOCATION TO STORE MOVEM T1,(T2) ; THE IMMEDIATE VALUE IN. RETSKP ;Here to get a value from the user and store it OPPVAL: CAIE C,":" ;IS PUNCTUATION A COLON? CAIN C,"=" ; OR AN EQUAL SIGN? CAIA ;YES, USER SAYS ARG FOLLOWS JRST MISARG ;NO, COMPLAIN LOAD T2,OEVAL,(P1) ;ADDRESS OF ROUTINE TO GET USER'S VALUE LOAD T1,OELOC,(P1) ;SOME ROUTINES NEED THIS PASSED CALL (T2) ;ROUTINE LIKE .SWDEC OR .SIXIN TRNA ;WE NEED TO STORE RESULT RETSKP ;HE STORED, JUST CLEAN UP LOAD T1,OELOC,(P1) ;GET THE ADDRESS OF LOCATION TO STORE MOVEM N,(T1) ;STORE USER'S NOTION RETSKP ;Here to search a list and store an offset thereinto ;OPPLIS - Search a list for a keyword, store offset found ; ;Call: P1/ Pointer to OPT table ; CALL OPPLIS ; Error Return if keyword not found or no argument offered ; Normal Return ;Changes T1,T2,T3,T4 OPPLIS: SAVEAC CAIE C,":" ;IF PUNCTUATION WAS COLON CAIN C,"=" ; OR EQUAL SIGN, CAIA ; THEN WE HAVE AN ARGUMENT TO GET PJRST MISARG ;NO ARGUMENT ERROR CALLSCAN .SWSIX## ;GET SIXBIT WORD INTO N LOAD T1,OEVAL,(P1) ;GET PTR TO IOWD TO KEYWORD LIST MOVE T1,(T1) ;GET THE IOWD MOVE T2,N CALL LOOKNM PJRST UNKCMD ;NOT FOUND OR AMBIGUOUS HRRZS T1 ;DON'T CARE IF EXACT MATCH OR NOT LOAD T2,OEVAL,(P1) ;GET POINTER TO BEG OF LIST AGAIN HRRZS T2 SUBI T1,(T2) ;T2 IS AN IOWD POINTER, SO THIS IS ; A ONE-RELATIVE OFFSET OPPLST: LOAD T2,OELOC,(P1) ;GET POINTER TO STORAGE LOCATION MOVEM T1,(T2) RETSKP MISARG: MOVEI T1,[ASCIZ /?Missing argument for command /] PJRST ERRCMD SUBTTL Make some EXTERNals internal for MACRO's convenience DEFINE MAKINT(label),< IRP label,< label: PJRST .'label## > > MAKINT PPNSW: CALLSCAN .ASCQW## ;GET THE STRING IN QUOTED ASCII RET SUBTTL .DDT - The DDT command ;.DDT - Call DDT, leaving a trail ; ;Call: CALL .DDT ; Normal Return when user types G$G to DDT ; ;Uses T1 .DDT: HRRZ T1,.JBDDT ;GET DDT'S ADDRESS JUMPE T1,.POPJ ;LEAVE IF NOT LOADED POP P,.JBOPC ;ITS THERE, LEAVE RET ADDR FOR G$G JRST (T1) ;GO TO DDT SUBTTL DO.DTS - The Executor part of the Program ;DO.DTS - Top level of the executor part (second pass) of DTS ; ;Call: CALL DO.DTS ; Error Return, message already put out ; Normal Return ;Changes T1,T2,T3,T4 DO.DTS: HLRZ T1,NODNAM ;GET LENGTH OF NODE NAME SKIPN T1 ;IS THE NODE NAME SPEC'D YET? JRST DODTSN ;NO, ASK FOR IT SETZM IDLFLG ;DON'T TRACE IDLE TIMES MOVE T1,TSTTYP ;THE TEST TYPE COLLECTED IN PARSE PJRST @[Z DO.CONNECT Z DO.DATA Z DO.DISCONNECT Z DO.INTERRUPT]-1(T1) ;THE TEST TYPE STARTS AT 1 DODTSN: ERROR Please specify the NODE NAME first,CRLF RET SUBTTL DO.CONNECT - Do the Connect Test ;DO.CONNECT - Do the Connect Test ; ;Call: CALL DO.CONNECT ; Error Return ; Normal Return ;Changes T1,T2,T3,T4 DO.CONNECT: MOVE T2,CNTTYP ;GET THE CONNECT TYPE CODE MOVEI T1,[ASCIZ /Connect Accept/] CAIE T2,CTT.ACC ;WAS IT SUPPOSED TO REJECT? MOVEI T1,[ASCIZ /Connect Reject/] CALL STRMSG ;TYPE OUT START MESSAGE ;Build the USERDATA field for the connect message ;Note that USERDATA is expected to hold the user data we sent out. MOVX T1,.TCCON ;TESTTYPE: CONNECT MOVEI T2,USERDATA ;STRING BLK TO PUT TESTYPE IN CALL PUTSTY ;STORE TESTTYPE IN USERDATA MOVE T1,RETTYP ;GET /RETTYP:xxx VALUE CAILE T1,RET.MX ;INTERNAL CONSISTENCY CHECK HALT .+1 MOVE T1,[EXP .CCRJN ;(0)REJECT, NO RETURN EXP .CCRJN ;(1)REJECT, NO RETURN EXP .CCRJS ;(2)REJECT, STANDARD RETURN EXP .CCRJR](T1) ;(3)REJECT, RETURN RECEIVED DATA MOVE T2,CNTTYP ;GET /TYPE VALUE CAIE T2,CTT.REJECT ;/TYPE:REJECT? AOS T1 ;NO, PERMUTE .CCxxx TO ACCEPT MOVEI T2,USERDATA ;POINTER TO STRING BLOCK CALL PUT1BY ;STORE CONNECT CODE IN USERDATA ;Fill in next 8 bytes with standard data. We make the total less ;than 16 bytes to test ability to handle partial user data. MOVEI T1,USERDATA ;POINTER TO STRING BLOCK TO FILL MOVEI T2,^D8 ;FILL IN 8 BYTES AFTER CURRENT TEXT CALL FILSTD ;FILL IN WITH STANDARD DATA ;Send off the connect initiate request SETZB NSAA2,NSAA3 ;NO SEG SIZE YET, AND ; DEFAULT TO SEG FLOW CONTROL CALL ENTACT ;ENTER ACTIVE TRNA ;FAILED CALL CONRSP ;PROCESS THE CONNECT RESPONSE MOVE T2,CNTTYP ;GET THE CONNECT TYPE CODE MOVEI T1,[ASCIZ /Connect Accept/] CAIE T2,CTT.ACC ;WAS IT SUPPOSED TO REJECT? MOVEI T1,[ASCIZ /Connect Reject/] CALL STPMSG ;TYPE OUT START MESSAGE RETSKP ;CONRSP - Process the CONNECT response to the connect initiate ; ;Call: CALL CONRSP ; Normal Return CONRSP: CAIE T1,.NSSRN ;NOW IN RUN STATE? JRST CONR.1 ;NO, REJECTED ;Here when the connect succeeded CALL RDCNDT ;READ CONNECT DATA RET ;PROPOGATE ERROR RETURN CALL CHKOPT ;CHECK RETURNED OPTIONAL DATA PJRST NSPREL ;NO GOOD, RELEASE THE CHANNEL ;OK, the accept is kosher, was it what we wanted? MOVE T1,CNTTYP ;GET THE CONNECT TYPE CODE CAIE T1,CTT.ACC ;WAS IT SUPPOSED TO REJECT? ERROR ,CRLF CAIN T1,CTT.ACC ;WAS IT SUPPOSED TO ACCEPT? INFO ,CRLF PJRST CONR.X ;Here when the connect failed CONR.1: CALL RDDSDT ;READ DISCONNECT DATA RET ;PROPOGATE ERROR RETURN CAIE NSAA2,RSNRBO ;REJECTED BY OBJECT? PJRST REJINC ;NO, GO INTERPRET REJECTION CALL CHKOPT ;CHECK RETURNED OPTIONAL DATA PJRST NSPREL ;NO GOOD, RELEASE THE CHANNEL ;OK, the reject is kosher, was it what we wanted? MOVE T1,CNTTYP ;GET THE CONNECT TYPE CODE CAIE T1,CTT.REJ ;WAS IT SUPPOSED TO ACCEPT? PJRST REJINC ;YES, INTERPRET THE ERROR ; AND CLOSE THE CHANNEL INFO MOVE T1,NSAA2 ;GET REASON CODE CALLSCAN .TDECW## ;PRINT IT IN DECIMAL CALLSCAN .TRBRK## ;TYPE A RIGHT BRACKET FOR INFO CALLSCAN .TCRLF## CONR.X: IFN FTNSPDCP,< MOVEI T1,3 ;SECONDS GRACE TO GIVE SSS: SLEEP T1, ; TO DTR WHILE WE USE DCPNSP > PJRST NSPREL SUBTTL CHKOPT - Check Optional Data ;CHKOPT - Check Optional Data returned in Dis/Connect tests ; ;Call: CNTUSR/ Set up by RDCNDT ; CALL CHKOPT ; Error Return, message already put out ; Normal Return CHKOPT: MOVE T1,RETTYP ;GET /RETTYP:xxx VALUE CAILE T1,RET.MX ;INTERNAL CONSISTENCY CHECK HALT .+1 PJRST @[EXP CHKO.N ;(0)REJECT, NO RETURN EXP CHKO.N ;(1)REJECT, NO RETURN EXP CHKO.S ;(2)REJECT, STANDARD RETURN EXP CHKO.R](T1) ;(3)REJECT, RETURN RECEIVED DATA ;Here if we are expecting NO returned optional data CHKO.N: HLRZ T1,CNTUSR ;GET THE CURRENT BYTE COUNT FROM BLK SKIPN T1 ;IS IT ZERO? RETSKP ;YES, ALL IS WELL CHKO.1: WARN HLRZ T1,CNTUSR ;GET OFFENDING COUNT AGAIN CALLSCAN .TDECW## ;PRINT OFFENDING COUNT CALLSCAN .TCRLF## RET ;Here if we are expecting STANDARD returned optional data CHKO.S: HLRZ T1,CNTUSR ;GET BYTE COUNT IN USER DATA STRING BLK CAIE T1,^D16 ;IS IT MAX OPTIONAL DATA LENGTH? JRST CHKO.1 ;NO, COMPLAIN SKIPA T1,.+1 ;ILDB POINTER TO USER DATA POINT 8,CNTUSR+1 ;MACRO WON'T LET ME PUT THIS IN A LIT HLRZ T2,CNTUSR ;NUMBER OF BYTES TO COMPARE CALL CMPSTD ;COMPARE STANDARD DATA TRNA ;NO-MATCH RETURN RETSKP ;IT-ALL-MATCHED RETURN CHKO.2: WARN ,CRLF RET ;Here if we are expecting RECEIVED returned optional data CHKO.R: HLRZ T1,CNTUSR ;GET RECEIVED BYTE COUNT HLRZ T2,USERDATA ;GET LENGTH WE SENT OUT CAME T1,T2 ;COMPARE SENT BYTE COUNT JRST CHKO.1 ;COMPLAIN IF NO MATCH MOVEI T1,USERDATA ;STRING BLOCK WITH DATA WE SENT MOVEI T2,CNTUSR ;STRING BLOCK WITH DATA WE RECEIVED CALL CMPSTB ;COMPARE STRING BLOCKS JRST CHKO.2 ;NO-MATCH RETURN RETSKP ;IT-ALL-MATCHED RETURN SUBTTL DO.DISCONNECT - Do the Disconnect Test ;DO.DISCONNECT - Do the Disconnect Test ; ;Call: CALL DO.DISCONNECT ; Error Return ; Normal Return ;Changes T1,T2,T3,T4 DO.DISCONNECT: MOVE T2,DSCTYP ;GET THE DISCONNECT TYPE CODE MOVEI T1,[ASCIZ /Synchronous Disconnect/] CAIE T2,DST.SYN ;WAS IT SUPPOSED TO BE SYNCH? MOVEI T1,[ASCIZ /Abort Disconnect/] CALL STRMSG ;STANDARD TEST START MSG ;Build the USERDATA field for the disconnect message ;Note that USERDATA is expected to hold the user data we sent out. MOVX T1,.TCDSC ;TESTTYPE: DISCONNECT MOVEI T2,USERDATA ;STRING BLK TO PUT TESTYPE IN CALL PUTSTY ;STORE TESTTYPE IN USERDATA MOVE T1,RETTYP ;GET /RETTYP:xxx VALUE CAILE T1,RET.MX ;INTERNAL CONSISTENCY CHECK HALT .+1 MOVE T1,[EXP .SCSDN ;(0)SYNCH, NO RETURN EXP .SCSDN ;(1)SYNCH, NO RETURN EXP .SCSDS ;(2)SYNCH, STANDARD RETURN EXP .SCSDR](T1) ;(3)SYNCH, RETURN RECEIVED DATA MOVE T2,DSCTYP ;GET /TYPE VALUE CAIE T2,DST.SYNCH ;/TYPE:SYNCH? AOS T1 ;NO, PERMUTE .SCxxx TO ABORT MOVEI T2,USERDATA ;POINTER TO STRING BLOCK CALL PUT1BY ;STORE CONNECT CODE IN USERDATA ;Fill in next 8 bytes with standard data. We make the total less ;than 16 bytes to test ability to handle partial user data. MOVEI T1,USERDATA ;POINTER TO STRING BLOCK TO FILL MOVEI T2,^D8 ;FILL IN 8 BYTES AFTER CURRENT TEXT CALL FILSTD ;FILL IN WITH STANDARD DATA ;Send off the connect initiate request SETZB NSAA2,NSAA3 ;NO SEG SIZE YET, AND ; DEFAULT TO SEG FLOW CONTROL CALL ENTACT ;ENTER ACTIVE TRNA ;FAILED CALL DSCRSP ;PROCESS THE CONNECT RESPONSE MOVE T2,DSCTYP ;GET THE DISCONNECT TYPE CODE MOVEI T1,[ASCIZ /Synchronous Disconnect/] CAIE T2,DST.SYN ;WAS IT SUPPOSED TO BE SYNCH? MOVEI T1,[ASCIZ /Abort Disconnect/] CALL STPMSG ;STANDARD TEST STOP MSG RETSKP ;DSCRSP - Process the DISCONNECT response to the connect initiate ; ;Call: T1/ Current DECnet state ; CALL DSCRSP ; Normal Return ; ;Uses T1,T2,T3,T4 DSCRSP: MOVE T2,DSCTYP ;DTR SUPPOSED TO ABORT IMMEDIATELY? CAXN T2,DST.ABO ;ABORT TEST? JRST DSCR.1 ;YES, WE MAY HAVE THE DI ALREADY ;SYNCHRONOUS TEST CAIE T1,.NSSRN ;NOW IN RUN STATE? CAIN T1,.NSSDR ; OR IN DISCONNECT RECEIVED STATE? CAIA ;NO JRST REJINT ;NO, REJECTED ;Link is now accepted, now wait for a disconnect DSCR.1: HRRZ NSAA1,USERDATA ;MAX NUMBER OF WORDS SOJ NSAA1, ;[4] LENGTH INCLUDES COUNT WORD ASH NSAA1,2 ;MULTIPLY BY 4 TO GET BYTE COUNT SKIPA NSAA2,.+1 ;BYTE POINTER TO DATA AREA POINT 8,USERDATA+1 ;MACRO WON'T LET ME PUT THIS IN A LIT CALNSP .NSFDR,NSAA2,NS.WAIT ;DATA READ (WAIT FOR DISCONNECT) TRNA ;ERROR IS DISCONNECT JRST DSCR.1 ;IGNORE ANY DATA RECEIVED LDB T1,[POINTR(NSACH,NS.STA)] CAIN T1,.NSSRJ ;IS LINK IN REJECT STATE? JRST DSCLWNU ;YES, LINK WAS NEVER UP CAIE T1,.NSSDR ;IS IT "DISCONNECT RECEIVED"? JRST NSPERL ;NO, PRINT ERROR AND RELEASE CHNL. ;We now have the disconnect, release the channel, test is done CALL RDDSDT ;READ DISCONNECT DATA PJRST NSPREL ;FAILED, RELEASE THE CHANNEL CALL CHKOPT ;CHECK THE OPTIONAL DATA RETURNED PJRST NSPREL ;FAILED, RELEASE THE CHANNEL PJRST NSPREL ;SUCCEEDED, RELEASE THE CHANNEL ;Here when we recieved the DI message so quickly after the CC ;message that we were not able to get the CC data. DSCABO: INFO ,CRLF PJRST NSPREL ;RELEASE THE CHANNEL DSCLWNU:WARN PJRST NSPREL SUBTTL DO.DATA - Do the Data Test ;DO.DATA - Do the Data Test ; ;Call: CALL DO.DATA ; Error Return ; Normal Return ;Changes T1,T2,T3,T4 DO.DATA:CALL CHKDAT ;CHECK THE ARGS TO DATA CMD RET ;SOMETHING AMISS, MSG ALREADY OUT CALL DTYPMG ;GET THE DATA TEST TYPE MESSAGE CALL STRMSG ;STANDARD TEST START MSG ;Build the USERDATA field for the data message MOVX T1,.TCDAT ;TESTTYPE: DATA MOVEI T2,USERDATA ;STRING BLK TO PUT TESTYPE IN CALL PUTSTY ;STORE TESTTYPE IN USERDATA MOVE T1,DATTYP ;GET THE DATA TEST'S /TYPE: VALUE MOVE T1,[EXP .DCSNK ;TRANSLATE THE VALUE TO PROTOCOL VALUE EXP .DCSNK EXP .DCSEQ EXP .DCPAT EXP .DCECH](T1) CALL PUT1BY ;STORE DATTYPE FIELD MOVE T1,RFLTYP ;GET /RFLOW VALUE (DTR'S FLOW) MOVE T1,FCMTRN(T1) ;TRANSLATE TO PROTOCOL VALUE CALL PUT1BY ;STORE RFLOW FIELD MOVE T1,RQUEUE ;GET /RQUEUE FIELD CALL PUT1BY ;STORE /RQUEUE FIELD MOVEI T1,0 ;NOW A 2-BYTE CALL PUT2BY ; RESERVED FIELD MOVE T1,DMSGSIZ ;GET THE /MSGSIZ VALUE MOVEM T1,MSGSIZ ;TELL PSTATS OUR MSG SIZE CALL PUT2BY ;STORE THE MSGLEN FIELD ;Send off the connect initiate request MOVE NSAA2,DSGMSIZ ;GET SELECTED SEGMENT SIZE MOVE T1,SFLTYP ;GET /SFLOW (DTS'S) FLOW CONTROL MOVE NSAA3,FCMTRN(T1);GET THE SELECTED FLOW CONT MODE CALL ENTACT ;ENTER ACTIVE TRNA ;FAILED CALL DATRSP ;PROCESS THE CONNECT RESPONSE CALL DTYPMG ;GET THE DATA TEST TYPE MESSAGE CALL STPMSG ;STANDARD TEST STOP MSG MOVE T1,DSGMSIZ ;GET DATA SEGMENT SIZE MOVEM T1,SGMSIZ ; FOR STATS CALL STATS ;PRINT ANY STATS REQUESTED RETSKP ;CHKDAT checks the argument values. Called by DO.DATA before start. CHKDAT: MOVE T1,DMSGSIZ ;GET DECLARED MESSAGE SIZE CAXG T1,MAXMSG ;IS IT TOO BIG? JRST CHKD.1 ;NO ERROR ,CRLF RET ;ERROR RETURN CHKD.1: MOVE T2,DATTYP ;GET TYPE OF DATA TEST MOVE T2,[EXP 0 ;SINK TEST (DEFAULT) EXP 0 ;SINK TEST EXP 4 ;SEQUENCE TEST (4 BYTES OF SEQUENCE) EXP 5 ;PATTERN TEST (4 + 1 DATA BYTE) EXP 5](T2) ;ECHO TEST (SAME AS PATTERN) CAML T1,T2 ;IS IT TOO SMALL? RETSKP ;NO ERROR ,CRLF RET ;ERROR RETURN ;CHKINT - Same as CHKDAT, but for interrupt tests CHKINT: MOVE T1,IMSGSIZ ;GET DECLARED MESSAGE SIZE CAXG T1,^D16 ;INTERRUPT MESSAGES LIMITED TO 16 BYTES JRST CHKI.1 ;O.K. ERROR ,CRLF RET ;ERROR RETURN CHKI.1: MOVE T2,INTTYP ;GET TYPE OF INTERRUPT TEST MOVE T2,[EXP 0 ;SINK TEST (DEFAULT) EXP 0 ;SINK TEST EXP 4 ;SEQUENCE TEST EXP 5 ;PATTERN TEST EXP 5](T2) ;ECHO TEST CAML T1,T2 ;IS IT TOO SMALL? RETSKP ;NO ERROR ,CRLF RET ;DTYPMG returns a pointer to the title message for current data test DTYPMG: MOVE T1,DATTYP ;GET TYPE CODE FOR DATA TEST MOVE T1,[[ASCIZ /Data Sink/] [ASCIZ /Data Sink/] [ASCIZ /Data Sequence/] [ASCIZ /Data Pattern/] [ASCIZ /Data Echo/]](T1) RET ;ITYPMG returns a pointer to title message for current interrupt test ITYPMG: MOVE T1,INTTYP ;GET TYPE CODE FOR INTERRUPT TEST MOVE T1,[[ASCIZ /Interrupt Sink/] [ASCIZ /Interrupt Sink/] [ASCIZ /Interrupt Sequence/] [ASCIZ /Interrupt Pattern/] [ASCIZ /Interrupt Echo/]](T1) RET ;DATRSP - Process the DATA response to the connect initiate ; ;Call: CALL DATRSP ; Normal Return ; ;Uses T1,T2,T3,T4 DATRSP: CAIE T1,.NSSRN ;NOW IN RUN STATE? JRST REJINT ;NO, REJECTED CALL DSCLNK ;DESCRIBE THE LINK RET ;Set the SQUEUE value as the link quota MOVE T1,SQUEUE ;GET THE /SQUEUE VALUE CALL SETQTA ;SET THE LINK QUOTA RET ;ERROR MESSAGE ALREADY GIVEN ;STRTIM is already filled in by STRMSG, here we predict finish time MOVE T1,TIME ;GET SECONDS TEST IS TO RUN IMULI T1,^D1000 ;MAKE IT MILLISECONDS ADD T1,STRTIME ;ADD IN START TIME MOVEM T1,FINTIME ;THAT'S WHEN WE'RE TO FINISH CALL DATLOP ;SEND DATA UNTIL TIME EXPIRES PJRST NSPREL ;ABORT THE LINK MOVE T1,TERMIN ;GET /TERMIN:[SYNCH or ABORT] CAXE T1,TER.SYN ;/TERMIN:SYNCHRONOUS_DISCONNECT? PJRST NSPREL ;NO, ABORT AND FORGET THE LINK ;YES, SYNCH DISCONNECT CALL DATMOP ;COLLECT ANY ECHOS STILL LYING AROUND CALNSP .NSFSD,,NS.WAI ;SYNCH DISCONNECT PJRST NSPERL ;REPORT ERROR AND RELEASE PJRST NSPREL ;RELEASE THE LINK ;DATLOP - The DATA test's send data loop ; ;Call: CALL DATLOP ; Error Return if link screws up or aborts ; Normal Return DATLOP: ;See if there's anything doing on the link DATL.0:!CALNSP .NSFRS ;READ STATUS FUNCTION CODE PJRST NSPERR LDB T2,[POINTR(NSACH,NS.STA)] ;LOAD UP THE STATE FIELD CAXE T2,.NSSRN ;RUN STATE? CAXN T2,.NSSDS ;OR DISCONNECT SENT? CAIA ;YES, ALL IS OK PJRST TYPSTA ;NO, LINK IS WASHED UP, TELL USER DATL.1: TXNE NSACH,NS.NDA ;NORMAL DATA AVAILABLE? JRST [CALL RCVNML ;YES, READ AN ECHO RET ;ABORT TEST ON FORMAT ERROR JRST DATL.1] ;KEEP READING UNTIL NOTHING MORE THERE ;Have we done this long enough? CALL GETTIME ;GET UNWRAPPING TIME CAMGE T1,FINTIME ;REACHED FINISH TIME YET? JRST DATL.2 ;NO, TRY TO SEND ANOTHER MESSAGE RETSKP ;YES, DISCONNECT LINK NOW ;More sends needed DATL.2: TXNE NSACH,NS.NDR ;OK TO SEND NORMAL DATA? CALL SNDNML ;YES, SEND SOME NORMAL DATA DATL.3: CALL DBGCHK ;SEE IF USER WANTS DDT RETSKP ;"STOP THE TEST" RETURN TXNE NSACH, ;ANYTHING TO DO NOW? JRST DATL.0 ;YES, GO DO IT ;NO, SLEEP FOR A BIT SKIPE IDLFLG ;SHOULD WE TRACE IDLE TIMES? OUTCHR ["."] ;YES, TYPE A DOT TO SAY WE'RE HIBERING MOVX T1, ;WAIT FOR ASYNCH I/O OR TIME HIBER T1, JFCL ;SHOULD NOT FAIL CALL DBGCHK ;SEE IF USER WANTS DDT RETSKP ;"STOP THE TEST" RETURN JRST DATL.0 ;LOOP UNTIL TIME SAYS STOP ;DATMOP - Mop up any echos still to come, then return ; ;Call: CALL DATMOP ; Normal Return DATMOP: MOVE T1,DATTYP ;GET TYPE OF TEST CAXE T1,DTT.ECHO ;WAS IT AN ECHO TEST? RET ;NO, WE'RE ALL DONE MOVE T1,TERMIN ;GET /TERMIN:[SYNCH or ABORT] CAXE T1,TER.SYN ;/TERMIN:SYNCHRONOUS_DISCONNECT? RET ;NO, ABORT AND FORGET THE LINK ;YES, SYNCH DISCONNECT ;See if there's anything doing on the link DATM.1:!CALNSP .NSFRS ;READ STATUS FUNCTION CODE PJRST NSPERR DATM.2: TXNE NSACH,NS.NDA ;NORMAL DATA AVAILABLE? JRST [CALL RCVNML ;YES, READ AN ECHO RET ;ABORT TEST ON FORMAT ERROR JRST DATM.2] MOVE T1,SNDCNT ;HAVE WE CAMG T1,RCVCNT ; RECEIVED ALL ECHOS YET? RET ;YES, OK TO DISCONNECT LINK NOW DATM.3: CALL DBGCHK ;SEE IF USER WANTS DDT RET ;"STOP THE TEST" RETURN TXNE NSACH, ;ANYTHING TO DO NOW? JRST DATM.1 ;YES, GO DO IT ;NO, SLEEP FOR A BIT SKIPE IDLFLG ;SHOULD WE TRACE IDLE TIMES? OUTCHR ["."] ;YES, TYPE A DOT TO SAY WE'RE HIBERING MOVX T1, ;WAIT FOR ASYNCH I/O OR TIME HIBER T1, JFCL ;SHOULD NOT FAIL CALL DBGCHK ;SEE IF USER WANTS DDT RET ;"STOP THE TEST" RETURN JRST DATM.1 ;LOOP UNTIL TIME SAYS STOP ;SNDNML - Send a Normal Data Message ; ;Call: CALL SNDNML ; Normal Return (errors are counted and ignored) ; ;Uses T1,T2,T3,T4 SNDNML: AOS T1,SNDCNT ;FIRST MESSAGE IS CALLED #1 HRRZS SNDMSG ;TELL PUTNBY TO STORE AT BEG OF MSG MOVEI T2,SNDMSG ;POINTER TO STRING BLOCK MOVEI T3,SEQLEN ;NUMBER OF BYTES IN SEQUENCE NUMBER CALL PUTNBY ;STORE MSG # AS SEQLEN-BYTE FIELD MOVE NSAA1,DMSGSIZ ;ALREADY CHECKED FOR LEGAL SIZE MOVE NSAA2,PSNDMSG ;BYTE POINTER TO SEND MESSAGE CALNSP .NSFDS,NSAA2, ;NORMAL DATA SEND TRNA ;NETWORK ERROR, COUNT IT AND CONTINUE CALLRET REMIND ;SUCCESS, RETURN TO DATLOP ;Here when we have a network error CALL NSPERR ;TELL USER ABOUT IT AOS SERRCNT ;COUNT SEND ERROR FOR STATS RET ;RETURN FOR MORE PUNISHMENT ;REMIND - Remind the user that the test is still running ; ;Call: CALL REMIND ; Normal Return ; ;Uses T1,T2,T3,T4 REMIND: MOVE T1,SNDCNT ;GET CURRENT SEND COUNT IDIVI T1,DEC 100 ;ONLY TELL THEM EVERY 100 MESSAGES JUMPN T2,CPOPJ ;... INFO MOVE T1,SNDCNT ;GET CURRENT SEND COUNT CALLSCAN .TDECW## ;PRINT IT IN DECIMAL CALLSCAN .TRBRK## ;PRINT A RIGHT BRACKET FOR THE INFO MSG CALLSCAN .TCRLF## RET ;RCVNML - Receive a Normal Data Message ; ;Call: CALL RCVNML ; Error Return if data format error ; Normal Return (errors are counted and ignored) ; ;Uses T1,T2,T3,T4 RCVNML: AOS RCVCNT ;RECEIVED ONE MORE MESSAGE MOVE NSAA1,DMSGSIZ ;ALREADY CHECKED FOR LEGAL SIZE MOVE NSAA2,PRCVMSG ;BYTE POINTER TO RECEIVE MESSAGE CALNSP .NSFDR,NSAA2, ;NORMAL DATA RECEIVE JRST RCVN.1 ;NETWORK ERROR, COUNT IT AND CONTINUE ;Now we have a message, check it according to requested test JUMPN NSAA1,RCVN.4 ;IF RECVD MSG DIDN'T EXACTLY FIT, ERROR TXNN NSAFN,NS.EOM ;DID WE GET THE WHOLE MESSAGE? JRST RCVN.5 ;NO, COMPLAIN MOVE T1,DATTYP ;GET TYPE OF DATA TEST CAXE T1,DTT.ECHO ;ECHO TEST? RETSKP ;NO, IGNORE THE RECEIVED MESSAGE MOVEI T1,SEQLEN ;ADVANCE BY SEQLEN TO SKIP MSG NUMBER ADJBP T1,PRCVMSG ;BYTE PTR TO RECEIVED MSG MOVE T2,DMSGSIZ ;LENGTH OF CORRECT MESSAGE HRLM T2,RCVMSG ;TELL GETNBY THAT WE HAVE DATA IN RCVMSG SUBI T2,SEQLEN ;DECREMENT BY LENGTH OF MESSAGE NUMBER CALL CMPSTD ;COMPARE WITH STANDARD DATA JRST RCVN.2 ;COMPARE FAILED, ABORT THE TEST MOVEI T1,0 ;OFFSET TO BYTES TO GET MOVEI T2,RCVMSG ;POINTER TO STRING BLOCK MOVEI T3,SEQLEN ;NUMBER OF BYTES IN SEQUENCE NUMBER CALL GETNBY ;GET MESSAGE NUMBER SETO T1, ;ASSUME ERROR IF CAN'T GET A NUMBER MOVE T2,RCVCNT ;EXPECTED MESSAGE NUMBER (INCR'D ABOVE) ANDX T2,MASK.(SEQLEN*^D8,35) ;MAKE IT WRAP AROUND PROPERLY CAME T1,T2 ;IS IT THE RIGHT MESSAGE? JRST RCVN.3 ;NO, ABORT THE TEST ;YES, ECHO CHECKED OUT OK RETSKP ;SUCCESS, RETURN TO DATLOP ;Errors RCVN.1: CALL NSPERR ;TELL USER ABOUT NETWORK ERROR AOS RERRCNT ;COUNT RECEIVE ERROR FOR STATS RETSKP ;RETURN FOR MORE PUNISHMENT RCVN.2: WARN ,CRLF RET ;ERROR RETURN RCVN.3: WARN ,CRLF RET ;ERROR RETURN RCVN.4: WARN ,CRLF RET ;ERROR RETURN RCVN.5: WARN ,CRLF RET ;ERROR RETURN SUBTTL DO.INTERRUPT - Do the Interrupt Test ;DO.INTERRUPT - Do the Interrupt Test ; ;Call: CALL DO.INTERRUPT ; Error Return ; Normal Return ;Changes T1,T2,T3,T4 DO.INTERRUPT: CALL CHKINT ;CHECK VARIABLES RET ;SOMETHING FAILED, MESSAGE TYPED OUT. CALL ITYPMG ;GET TEST TITLE MESSAGE CALL STRMSG ;STANDARD TEST START MSG ;Build the USERDATA field for the interrupt message MOVX T1,.TCINT ;TESTTYPE: INTERRUPT MOVEI T2,USERDATA ;STRING BLK TO PUT TESTYPE IN CALL PUTSTY ;STORE TESTTYPE IN USERDATA MOVE T1,INTTYP ;GET THE INTA TEST'S /TYPE: VALUE MOVE T1,[EXP .ICSNK ;TRANSLATE THE VALUE TO PROTOCOL VALUE EXP .ICSNK EXP .ICSEQ EXP .ICPAT EXP .ICECH](T1) CALL PUT1BY ;STORE INTTYPE FIELD MOVE T1,RQUEUE ;GET /RQUEUE FIELD CALL PUT1BY ;STORE /RQUEUE FIELD MOVE T1,IMSGSIZ ;GET THE /MSGSIZ VALUE MOVEM T1,MSGSIZ ;TELL PSTATS OUR MSG SIZE ;[3] CALL PUT2BY ;STORE THE MSGLEN FIELD ;Send off the connect initiate request SETZB NSAA2,NSAA3 ;NO SEG SIZE YET, AND ; NO FLOW CONTROL OPTION HERE CALL ENTACT ;ENTER ACTIVE TRNA ;FAILED, MESSAGE ALREADY OUT CALL INTRSP ;PROCESS THE CONNECT RESPONSE CALL ITYPMG ;GET TEST TITLE MESSAGE CALL STPMSG ;STANDARD TEST STOP MSG MOVE T1,ISGMSIZ ;GET INTERRUPT SEGMENT SIZE MOVEM T1,SGMSIZ ; FOR STATS CALL STATS ;PRINT ANY STATS REQUESTED RETSKP ;INTRSP - Process the INTERRUPT response to the connect initiate ; ;Call: CALL INTRSP ; Normal Return ; ;Uses T1,T2,T3,T4 INTRSP: CAIE T1,.NSSRN ;NOW I RUN STATE? JRST REJINT ;NO, REJECTED ;STRTIM is already filled in by STRMSG, here we predict finish time MOVE T1,TIME ;GET SECONDS TEST IS TO RUN IMULI T1,^D1000 ;MAKE IT MILLISECONDS ADD T1,STRTIME ;ADD IN START TIME MOVEM T1,FINTIME ;THAT'S WHEN WE'RE TO FINISH CALL INTLOP ;SEND INTERRUPT UNTIL TIME EXPIRES PJRST NSPREL ;ABORT THE LINK MOVE T1,TERMIN ;GET /TERMIN:[SYNCH or ABORT] CAXE T1,TER.SYN ;/TERMIN:SYNCHRONOUS_DISCONNECT? PJRST NSPREL ;NO, ABORT AND FORGET THE LINK ;YES, SYNCH DISCONNECT CALNSP .NSFSD,,NS.WAI ;SYNCH DISCONNECT PJRST NSPERL ;REPORT ERROR AND RELEASE ;Link is now disconnecting, we may still have echos to listen to MOVEI T1,777777 ;GIVE SOME EXTRA TIME ADDM T1,FINTIME ; FOR THE DISCONNECT TO COMPLETE ITRS.1: CALL INTLOP ;COLLECT ANY ECHOS STILL LYING AROUND TRNA ;ERROR, HOPE IT WAS THE DISCON CONF JRST ITRS.1 ;LOOP ON ECHO CHECK UNTIL DONE CALL TYPSTA ;TELL USER ABOUT CURRENT STATE PJRST NSPREL ;RELEASE THE LINK ;INTLOP - The INTERRUPT test's send INTERRUPT loop ; ;Call: CALL INTLOP ; Error Return if link screws up or aborts ; Normal Return INTLOP: ;See if there's anything doing on the link INTL.1: CALNSP .NSFRS ;READ STATUS FUNCTION CODE PJRST NSPERR LDB T2,[POINTR(NSACH,NS.STA)] ;LOAD UP THE STATE FIELD CAXE T2,.NSSRN ;RUN STATE? CAXN T2,.NSSDS ;OR DISCONNECT SENT? CAIA ;YES, ALL IS OK RET ;NO, LINK IS WASHED UP TXNE NSACH,NS.IDA ;INTERRUPT AVAILABLE? JRST [CALL RCVINT ;YES, READ AN ECHO RET ;ABORT TEST ON FORMAT ERROR JRST .+1] ;Have we done this long enough? CALL GETTIME ;GET UNWRAPPING TIME CAMGE T1,FINTIME ;REACHED FINISH TIME YET? JRST INTL.2 ;NO, TRY TO SEND ANOTHER MESSAGE ;YES, SEND NO MORE MOVE T1,INTTYP ;GET TYPE OF TEST CAXE T1,DTT.ECHO ;WAS IT AN ECHO TEST? RETSKP ;NO, WE'RE ALL DONE MOVE T1,TERMIN ;GET /TERMIN:[SYNCH or ABORT] CAXE T1,TER.SYN ;/TERMIN:SYNCHRONOUS_DISCONNECT? RETSKP ;NO, ABORT AND FORGET THE LINK ;YES, SYNCH DISCONNECT MOVE T1,SNDCNT ;HAVE WE CAMG T1,RCVCNT ; RECEIVED ALL ECHOS YET? RETSKP ;YES, OK TO DISCONNECT LINK NOW JRST INTL.3 ;NO, WAIT FOR MORE ECHOS ;More sends needed INTL.2: TXNE NSACH,NS.IDR ;OK TO SEND AN INTERRUPT? CALL SNDINT ;YES, SEND AN INTERRUPT INTL.3: MOVX T1, ;WAIT FOR ASYNCH I/O OR TIME HIBER T1, JFCL ;SHOULD NOT FAIL CALL DBGCHK ;SEE IF USER WANTS DDT RETSKP ;"STOP THE TEST" RETURN JRST INTL.1 ;LOOP UNTIL TIME SAYS STOP ;SNDINT - Send an Interrupt Message ; ;Call: CALL SNDINT ; Normal Return (errors are counted and ignored) ; ;Uses T1,T2,T3,T4 SNDINT: SETZM SNDMSG ;TELL PUTNBY TO STORE AT BEG OF MSG AOS T1,SNDCNT ;FIRST MESSAGE IS CALLED #1 MOVEI T2,SNDMSG ;POINTER TO STRING BLOCK MOVEI T3,SEQLEN ;NUMBER OF BYTES IN SEQUENCE NUMBER CALL PUTNBY ;STORE MSG # AS SEQLEN-BYTE FIELD HRLZ T1,IMSGSIZ ;INT MSG SIZE (BYTES) USER REQUESTED HRRI T1,MAXMGW ;LENGTH OF STRING BLK IN WORDS MOVEM T1,SNDMSG ;STORE IN COUNT FIELD OF SEND BLOCK MOVEI NSAA1,SNDMSG ;POINTER TO STRING BLOCK CALNSP .NSFIS,NSAA1,NS.WAIT ;INTERRUPT SEND TRNA ;NETWORK ERROR, COUNT IT AND CONTINUE CALLRET REMIND ;SUCCESS, RETURN TO INTLOP ;Here when we have a network error CALL NSPERR ;TELL USER ABOUT IT AOS SERRCNT ;COUNT SEND ERROR FOR STATS RET ;RETURN FOR MORE PUNISHMENT ;RCVINT - Receive an Interrupt Message ; ;Call: CALL RCVINT ; Error Return if data format error ; Normal Return (errors are counted and ignored) ; ;Uses T1,T2,T3,T4 RCVINT: AOS RCVCNT ;RECEIVED ONE MORE MESSAGE HRLZ T1,IMSGSIZ ;LENGTH OF CORRECT MESSAGE HRRI T1,MAXMGW ;LENGTH OF STRING BLK IN WORDS MOVEM T1,RCVMSG ;STORE AS LENGTH OF STRING BLOCK MOVEI NSAA1,RCVMSG ;ALREADY CHECKED FOR LEGAL SIZE CALNSP .NSFIR,NSAA1,NS.WAIT ;NORMAL DATA RECEIVE JRST RCVI.1 ;NETWORK ERROR, COUNT IT AND CONTINUE ;Now we have a message, check it according to requested test MOVE T1,INTTYP ;GET TYPE OF DATA TEST CAXE T1,DTT.ECHO ;ECHO TEST? RETSKP ;NO, IGNORE THE RECEIVED MESSAGE MOVEI T1,SEQLEN ;ADVANCE BY SEQLEN TO SKIP MSG NUMBER ADJBP T1,PRCVMSG ;BYTE PTR TO RECEIVED MSG HLRZ T2,RCVMSG ;GET LENGTH OF RECEIVED MSG CAME T2,IMSGSIZ ;LENGTH OF CORRECT MESSAGE JRST RCVI.4 ;LENGTH ERROR SUBI T2,SEQLEN ;DECREMENT BY LENGTH OF MESSAGE NUMBER CALL CMPSTD ;COMPARE WITH STANDARD DATA JRST RCVI.2 ;COMPARE FAILED, ABORT THE TEST MOVEI T1,0 ;OFFSET TO BYTES TO GET MOVEI T2,RCVMSG ;POINTER TO STRING BLOCK MOVEI T3,SEQLEN ;NUMBER OF BYTES IN SEQUENCE NUMBER CALL GETNBY ;GET MESSAGE NUMBER SETO T1, ;ASSUME ERROR IF CAN'T GET A NUMBER MOVE T2,RCVCNT ;EXPECTED MESSAGE NUMBER (INCR'D ABOVE) ANDX T2,MASK.(SEQLEN*^D8,35) ;MAKE IT WRAP AROUND PROPERLY CAME T1,T2 ;IS IT THE RIGHT MESSAGE? JRST RCVI.3 ;NO, ABORT THE TEST ;YES, ECHO CHECKED OUT OK RETSKP ;SUCCESS, RETURN TO DATLOP ;Errors RCVI.1: CALL NSPERR ;TELL USER ABOUT NETWORK ERROR AOS RERRCNT ;COUNT RECEIVE ERROR FOR STATS RETSKP ;RETURN FOR MORE PUNISHMENT RCVI.2: WARN ,CRLF RET ;ERROR RETURN RCVI.3: WARN ,CRLF RET ;ERROR RETURN RCVI.4: WARN ,CRLF RET ;ERROR RETURN SUBTTL STATS - Print out the Statistics ;Called from DO.DATA and DO.INTERRUPT with no args ;Call: CALL STATS ; Normal Return ; ;Uses T1,T2,T3,T4 STATS: SKIPN STATISTICS ;STATS REQUESTED? RET ;NO SETOM ALWPRI ;IGNORE THE /PRINT:xxx SWITCH CALL PSTATS ;PRINT OUT THE STATS SETZM ALWPRI ;BACK TO NORMAL TYPE OUT MODE RET SUBTTL ENTACT - Subroutine to Enter Active ;ENTACT - Subroutine to Enter Active ; ;Call: NSAA2/ segment size (or zero) ; NSAA3/ flow control mode ; ; CALL ENTACT ; Error Return, message put out ; Normal Return with DECnet state in T1, status word in NSAA1 ; ;Uses T1,T2,T3,T4 ENTACT: MOVEI NSAA1,EACONB ;POINTER TO CONNECT BLOCK ; NSAA2 filled in by caller ; NSAA3 filled in by caller CALNSP .NSFEA,NSAA3,NS.WAIT ;WAIT FOR ENTER ACTIVE JRST [CAXE T1,NSRBO% ;REJECTED BY OBJECT? CAXN T1,NSDBO% ; OR DISCONNECTED BY OBJECT? JRST .+1 ;YES, READ THE DISCONNECT DATA CAXN T1,NSABO% ;[4] OR ABORTED BY OBJECT? JRST .+1 ;[4] YES, READ THE DISCONNECT DATA MOVEM NSACH,CHANEL ;STORE CHANNEL FOR NSPREL PJRST NSPERL] ;NO, INTERPRET ERROR & RELEASE MOVEM NSACH,CHANEL ;STORE CHANNEL NUMBER RETURNED LDB T1,[POINTR(NSACH,NS.STA)];GET THE STATE FIELD CAIE T1,.NSSRN ;NOW IN RUN STATE? CAIN T1,.NSSRJ ;OR REJECT? RETSKP ;YES, SUCCESS CAIN T1,.NSSDR ;OR DISCONNECT RECEIVED (DISCON TEST)? RETSKP ;YES, SUCCESS ;Here if Enter Active returned the link in an unexpected state WARN ,CRLF CALL TYPSTA ;TELL USER ERROR STATE INFO PJRST NSPREL ;RELEASE THE CHANNEL SUBTTL DSCLNK - Describe a Link ;DSCLNK - Describe Link Just Set Up ; ;Call: CHANEL/ Channel number of new link ; ; CALL DSCLNK ; Error Return, message put out ; Normal Return ; ;Uses T1,T2,T3,T4 DSCLNK: CALL NSPSTS ;READ LINK STATUS CALLRET NSPERL ;ERROR AND RELEASE IF CAN'T ;Here to tell user about the link we just built INFO MOVE T1,NSAA1 ;GET SEGSIZE FROM READ STATUS CALLSCAN .TDECW## MOVEI T1,[ASCIZ /, RFLOW: /] CALLSCAN .TSTRG## HLRZ T1,NSAA2 ;REMOTE FLOW CONTROL IN LH CALL TYPFLO MOVEI T1,[ASCIZ /, SFLOW: /] CALLSCAN .TSTRG## HRRZ T1,NSAA2 ;LOCAL FLOW CONTROL IN RH CALL TYPFLO MOVEI T1,[ASCIZ /, RQUEUE: /] CALLSCAN .TSTRG## MOVE T1,RQUEUE ;PICK UP SPECIFIED DTR Q LENGTH CALL .TDECW## MOVEI T1,[ASCIZ /, SQUEUE: /] CALLSCAN .TSTRG## MOVE T1,SQUEUE ;PICK UP SPECIFIED DTS Q LENGTH CALL .TDECW## MOVEI T1,[ASCIZ /]/] CALLSCAN .TSTRG## CALLSCAN .TCRLF## RETSKP SUBTTL Handle Unexpected Connect Rejection ;REJINT - Interpret Reject Info ; ;Call: CALL REJINT ; Normal Return ; ;Changes T1,T2,T3,T4 REJINT: CALL RDDSDT ;READ DISCONNECT DATA PJRST NSPREL ;PROPOGATE ERROR RETURN ;REJINC - Here when RDCNDT has already been called ; ;Call: T1/ State returned from RDCNDT ; USRDAT/ Disconnect data returned from RDCNDT ; CALL REJINT ; Normal Return ; ;Changes T1,T2,T3,T4 REJINC: ERROR MOVE T1,NSAA2 ;GET REASON CODE CALL RSNTXT ;TYPE OUT TEXT FOR REASON CODE CALLSCAN .TCRLF## ;Here to report .ECUKT (^D15) errors for the user MOVEI T1,0 ;GET FIRST BYTE MOVE T2,NSAA1 ;POINTER TO STRING BLOCK CALL GET1BY ;GET FIRST BYTE OF STR BLK JRST NSPREL ;STRING BLOCK WAS EMPTY CAIE T1,.ECUKT ;UNKNOWN TEST ERROR CODE? PJRST NSPREL ;NO, QUIT NOW ERROR MOVEI T1,1 ;GET SECOND BYTE MOVE T2,NSAA1 ;POINTER TO STRING BLOCK CALL GET1BY ;GET FIRST BYTE OF STR BLK MOVEI T1,77 ;UNKNOWN FIELD CALLSCAN .TDECW## CALLSCAN .TCRLF## PJRST NSPREL SUBTTL Utility Routines ;PUTSTY - Put TESTTYPE field in (T2) string block ;Call: T1/ .TCxxx, the test type ; T2/ Pointer to String Block ; CALL PUTSTY ; Normal Return ; ;Uses T1,T2,T3,T4 PUTSTY: HRRZS (T2) ;ZERO THE STRING BLOCK COUNT MOVE T3,PRINT ;GET VALUE OF "PRINT" SWITCH CAIN T3,PRI.ALL ;/PRINT:ALL? TXO T1,.TCPRI ! .TCERR ;YES, MARK BOTH PRINT AND ERROR CAIN T3,PRI.ERROR ;/PRINT:ERROR? TXO T1,.TCERR ;YES, SAY SO SKIPE OLDFLG ;ARE WE TALKING OLD PROTOCOL? TXZ T1,.TCERR ;YES, DOESN'T KNOW ABOUT .TCERR ;T2 ALREADY HOLDS PTR TO STR BLK PUTST1: PJRST PUT1BY ;WRITE A ONE-BYTE FIELD ;STRMSG - Type out the standard Test Starting Message ; ;Call: T1/ [ASCIZ /testname/] ; CALL STRMSG ; ;Uses: T1,T2,T3,T4 STRMSG: CALL INFMSG ;OUTPUT (T1) WITH INFO HEADER MOVEI T1,[ASCIZ / Test Started at /] CALLSCAN .TSTRG## CALLSCAN .TTIMN## ;TYPE OUT CURRENT TIME MOVEI T1,[ASCIZ /] /] CALLSCAN .TSTRG## CALL GETTIM ;GET STARTING TIME MOVEM T1,STRTIM ;Zero the statistics counters for the STATS routine SETZM SNDCNT ;START WITH ZERO MSGS SENT SETZM RCVCNT ; AND RECEIVED SETZM SERRCNT ; AND ZERO ERRORS SETZM RERRCNT ; ... RET ;STPMSG - Type out the standard Test Stopping Message ; ;Call: T1/ [ASCIZ /testname/] ; CALL STPMSG ; ;Uses: T1,T2,T3,T4 STPMSG: CALL INFMSG ;OUTPUT (T1) WITH INFO HEADER MOVEI T1,[ASCIZ / Test Stopped at /] STRP.X: CALLSCAN .TSTRG## CALLSCAN .TTIMN## ;TYPE OUT CURRENT TIME MOVEI T1,[ASCIZ /] /] CALLSCAN .TSTRG## CALL GETTIM ;GET STOPPING TIME SUB T1,STRTIM ;SUBTRACT STARTING TIME SKIPG T1 ;DID WE GO PAST MIDNIGHT? ADDX T1, MOVEM T1,ELPTIM ;STORE FOR STATS ROUTINE RET SUBTTL LOOKNM - Envelope caller for .LKNAM ;LOOKNM - Call .LKNAM ; ;Call: T1/ IOWD Length,Namelist ; T2/ SIXBIT /name-to-search-for/ ; CALL LOOKNM ; Error Return, code in T1 ; Normal Return, Ptr to matching name in T1 ; ;Uses T1,T2,T3,T4 ;.LKNAM error code: not found (T1.LT.0) or ambiguous (T1.GE.0) LOOKNM: MOVEM T2,CURCMD ;SAVE FOR ERROR ROUTINES CALLSCAN .LKNAM## ;LOOK UP THE NAME RET ;PROPOGATE ERROR RETURN MOVE T3,(T1) ;GET FULL MATCHED NAME LDB T4,[POINT 6,T3,5] ;GET FIRST CHAR CAIN T4,'*' ;IS IT A STAR FOR .LKNAM? LSH T3,6 ;YES, SHIFT IT OUT OF NAME MOVEM T3,CURCMD ;STORE FOR ERROR RTNS RETSKP SUBTTL STRBLD - Called from OPPVAL to build a string block ;Call: T1/ Pointer to string block ; CALL STRBLD ; "Caller store value" return, never ; "I stored value" return, always ; ;Uses T1,T2,T3,T4 STRBLD: PUSH P,T1 ;SAVE PTR TO TARGET STRING BLOCK CALLSCAN .ASCQW## ;GET A POSSIBLY QUOTED ASCII STRING SKIPA T2,.+1 ;THE STRING IS HERE IN .SCAN POINT 7,.NMUL## ;MACRO WON'T ALLOW EXTS IN LITS POP P,T1 ;PASS PTR TO STRING BLOCK TO ASC2ST CALL ASC2ST ;COPY AND CONVERT TO STRING BLOCK RETSKP SUBTTL RDX60W - Input a Radix 60 Number from Command String ;RDX60W -- Input a Radix 60 Number from Command String ;RDX60C -- Ditto (Character already in C) ;Formats are XX:YY:ZZ or xx followed by HOURS,MINUTES or SECONDS ;Call: PUSHJ P,RDX60C/RDX60W ; Return with seconds in N ;Uses T1, T2, T3 Updates C (separator) RDX60W::CALL RDXDCI ;GET A DECIMAL NUMBER MOVE T2,N ;PRESET FOR HH:MM:SS FORMAT CAIE C,":" ;USING HH:MM:SS FORMAT? JRST RDX6.4 ;NO RDX6.1: IMULI T2,^D100 ;ADVANCE TO NEXT RESULT PUSHJ P,RDXDCI ;GET NEXT SUPER-DIGIT JUMPL N,E.TTL ;ERROR IF NEGATIVE ADD T2,N ;ADD TO ACCUMULATOR CAIE C,":" ;SEE IF MORE TO COME JRST RDX6.2 ;NO--GO CONVERT RESULT TLNE T2,(777B8) ;DON'T ALLOW OVERFLOW JRST E.TTL ;ERROR IF TIME TOO LARGE CAILE N,^D60 ;DON'T ALLOW GARBAGE IN JRST E.TTL ;ERROR IF DIGIT TOO LARGE JRST RDX6.1 ;LOOP BACK FOR MORE RDX6.2: MOVEI N,0 ;CLEAR RESULT RDX6.3: IDIVI T2,^D100 ;SEPARATE TYPEIN HRLM T3,(P) ;STORE LEAST DIGIT AWAY SKIPE T2 ;SKIP IF ALL DONE PUSHJ P,RDX6.3 ;IF NOT, DO SOME MORE HLRZ T1,(P) ;GET BACK HIGHEST DIGIT IMULI N,^D60 ;MAKE ROOM IN RESULT ADD N,T1 ;INCLUDE RESULT CAILE T1,^D60 ;SEE IF ERROR JRST E.TTL ;COMPLAIN IF COMPONENT TOO BIG CPOPJ: RET ;RETURN E.TTL: MOVEI N,^D60 ;RETURN DEFAULT TIME WARN ,CRLF RET ;Here is using TIME:xxx SECONDS format RDX6.4: SAVEAC MOVE P1,N ;SAVE DIGITS WE HAVE SO FAR JUMPL C,.POPJ ;ASSUME SECONDS IF NO MORE ON LINE MOVEI T2,.SIXSC## ;ASSUME NEXT CHAR IS AN ALPHA ;.TIAUC HAS ALREADY UP-CASED THE CHAR CAIL C,"A" ;IS NEXT AN ALPHA? CAILE C,"Z" ;... MOVEI T2,.SIXSW## ;NO, DON'T USE IT IN SIXBIT WORD CALL (T2) ;GET A SIXBIT WORD JUMPE N,[MOVE N,P1 ;ASSUME SECONDS IF NO MORE ON LINE RET] MOVE T1,[IOWD 3,[EXP SIXBIT /HOURS/ EXP SIXBIT /MINUTES/ EXP SIXBIT /SECONDS/]] MOVE T2,N MOVE P2,T1 ;SAVE TABLE BASE ADDRESS CALL LOOKNM JRST RDX6.5 ;ERROR RETURN SUBI T1,1(P2) ;GET ZERO-BASE OFFSET INTO TABLE MOVE N,[DEC 3600 DEC 60 DEC 1 ](T1) ;GET MULTIPLIER IMUL N,P1 ;MULTIPLY NUMBER USER TYPED RET ;RETURN SECONDS IN N RDX6.5: ERROR MOVE T1,CURCMD CALLSCAN .TSIXN## CALLSCAN .TCRLF## PJRST E.TTL RDXDCI: PUSHJ P,.TIAUC## ;PRIME THE PUMP SETZM N ;COLLECT THE NUMBER HERE DECIN1: CAIL C,"0" ;SEE IF DECIMAL CAILE C,"9" ; .. RET ;NO--AT END IMULI N,^D10 ;YES--MULTIPLY NUMBER ADDI N,-"0"(C) ;INCORPORATE DIGIT CALLSCAN .TIAUC## ;GET NEXT CHARACTER JRST DECIN1 ;LOOP BACK FOR MORE ;DBGCHK - Debug Check ; ; ; Call: ; No Arguments ; ; Return: ; RET ;IF USER WANTS TEST STOPPED ; RETSKP ;CONTINUE ; ;Saves all ACs DBGCHK: SAVEAC T1 INCHRS T1 ;USER TYPE SOMETHING? RETSKP ;NO CAIL T1,"a" ;A LETTER CAILE T1,"z" ; (lower case)? CAIA ;NO TRZ T1,40 ;YES, MAKE IT UPPER CASE CAIN T1,"T" ;WANT IDLE TRACE? JRST [ SETCMM IDLFLG ;YES, COMPLEMENT THE IDLE TRACE FLAG RETSKP] CAIN T1,"D" ;WANT DDT? JRST DBGC.1 ;YES CAIN T1,14 ;IS IT A FORM-FEED RETSKP ;YES, ALLOW IT FOR FREE TO CLEAR SCREEN CAIN T1,"Q" ;USER WANT TO QUIT? RET ;YES, GIVE QUIT RETURN ;Here if we don't understand the command OUTSTR [ASCIZ /? Unknown HIBER-time command /] RETSKP ;Here if user wants to go to DDT unambiguously DBGC.1: SKIPN T1,.JBDDT ;DDT LOADED? JRST DBGC.2 ;NO POP P,.JBOPC ;YES, REMEMBER WHERE TO RETURN (SAVEAC) JRST (T1) ;CAN'T JRST @.JBDDT CAUSE OF LEFT HALF DBGC.2: OUTSTR [ASCIZ /? DDT not loaded /] RETSKP SUBTTL Extra Commands for DECnet-10 Testing IFN FTEXTRA,< USTIME: CALLRET NSPJIF## SUBTTL USTROLL - Set NSP Troll Value USTROLL: PROMPT MOVE T1,NSPTRI## CALLSCAN .TDECW## CALLSCAN .TCRLF## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER MOVEM N,NSPTRL## MOVEM N,NSPTRI## RET SUBTTL USMTROLL - Set MEMORY TROLL Value USMTROLL: PROMPT MOVE T1,MEMTRI## CALLSCAN .TDECW## CALLSCAN .TCRLF## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER MOVEM N,MEMTRL## MOVEM N,MEMTRI## RET SUBTTL USTHRESH - Set NSP Threshold Value USTHRESH: PROMPT MOVE T1,NSPRTH## CALLSCAN .TDECW## CALLSCAN .TCRLF## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER SKIPLE T1,N MOVEM T1,NSPRTH## RET SUBTTL USWEIGHT - Set NSP Weight Value USWEIGHT: PROMPT MOVE T1,NSPWGT## CALLSCAN .TDECW## CALLSCAN .TCRLF## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER SKIPLE T1,N MOVEM T1,NSPWGT## RET SUBTTL USDELAY - Set NSP Delay Value USDELAY: PROMPT MOVE T1,NSPDLY## CALLSCAN .TDECW## CALLSCAN .TCRLF## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER SKIPLE T1,N MOVEM T1,NSPDLY## RET SUBTTL USJIFFY - Set NSP JIFFY Value USJIFFY: PROMPT MOVE T1,TMRVAL## CALLSCAN .TDECW## CALLSCAN .TCRLF## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER SKIPLE T1,N MOVEM T1,TMRVAL## ;IN D36TST RET SUBTTL USLONG - Set NSP LONG Value USLONG: PROMPT MOVE T1,NSPJLI## CALLSCAN .TDECW## CALLSCAN .TCRLF## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER SKIPLE T1,N MOVEM T1,NSPJLI## RET SUBTTL USSHORT - Set NSP SHORT Value USSHORT: PROMPT MOVE T1,NSPJSI## CALLSCAN .TDECW## CALLSCAN .TCRLF## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER SKIPLE T1,N MOVEM T1,NSPJSI## RET SUBTTL USINACTIVITY - Set NSP Inactivity Value USINACTIVITY: PROMPT MOVE T1,NSPINA## CALLSCAN .TDECW## CALLSCAN .TCRLF## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER SKIPLE T1,N MOVEM T1,NSPINA## RET SUBTTL USAUDIT - Set NSP Audit Value USAUDIT: PROMPT MOVE T1,NSPJAI## CALLSCAN .TDECW## CALLSCAN .TCRLF## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER SKIPLE T1,N MOVEM T1,NSPJAI## RET SUBTTL - USTRACE - Turn Trace on and off USTRACE: PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER MOVX T1,TRCSC!TRCUSR ANDCAM T1,S.TRACE## SKIPE N IORM T1,S.TRACE## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER MOVX T1,TRCNSP ANDCAM T1,S.TRACE## SKIPE N IORM T1,S.TRACE## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER MOVX T1,TRCXPT ANDCAM T1,S.TRACE## SKIPE N IORM T1,S.TRACE## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER MOVX T1,TRCCOM ANDCAM T1,S.TRACE## SKIPE N IORM T1,S.TRACE## RET SUBTTL - USETRACE - Turn ETRACE on and off USETRACE: PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER MOVX T1,TRCSC!TRCUSR ANDCAM T1,S.ETRACE## SKIPE N IORM T1,S.ETRACE## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER MOVX T1,TRCNSP ANDCAM T1,S.ETRACE## SKIPE N IORM T1,S.ETRACE## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER MOVX T1,TRCXPT ANDCAM T1,S.ETRACE## SKIPE N IORM T1,S.ETRACE## PROMPT REDLIN .DECNW## ;GET DECIMAL NUMBER MOVX T1,TRCCOM ANDCAM T1,S.ETRACE## SKIPE N IORM T1,S.ETRACE## RET ;USCONGEST - Tell NSP that we're congested ; ;Call: T1/ The SCBid ; CALL USCONGEST ; Normal Return USCONGEST:: CALLRET NSPCGT## ;USRELIEVE - Tell NSP that congestion is relieved ; ;Call: T1/ The SCBid ; CALL USRELIEVE ; Normal Return USRELIEVE:: CALLRET NSPCGR## subttl End of the FTEXTRA Commands >;END OF IFN FTEXTRA SUBTTL The NCP Command - Invoke NTMAN. Exercizer ;The NCP command calls the NTMAN. exercizer. It leaves the rest ;of the command line for it to read as it will. IFN FTNCP,< USNCP: CALLRET NCP## > SUBTTL End of Program END DTS