TITLE CICTRS - CI Counter Manipulation Utility SUBTTL Joseph A. Dziedzic /JAD 17-Jul-85 SEARCH GLXMAC ;SEARCH GALAXY PARAMETER FILE SALL ;SUPPRESS MACRO EXPANSION PROLOG (CICTRS) ;COMPLETE SETUP SEARCH ORNMAC ;GET PARSER DEFINITIONS .TEXT "/SEGMENT:LOW REL:OPRPAR" ;GET THE PARSER EXTERN PARSER, P$HELP ;GLOBALS IN OPRPAR PARSET ;SET UP PARSER DEFINITIONS ;Version information CTRVER==1 ;MAJOR VERSION NUMBER CTRMIN==0 ;MINOR VERSION NUMBER CTREDT==1 ;EDIT LEVEL CTRWHO==0 ;WHO LAST EDITTED %%CTRS==VRSN.(CTR) ;DEFINE VERSION NUMBER LOC 137 ;STORE VERSION NUMBER IN .JBVER .JBVER::!EXP %%CTRS RELOC 0 ;BACK TO RELOCATABLE ENTVEC: JRST CICTRS ;NORMAL ENTRY JRST CICTRS ;REMOTE ENTRY EXP %%CTRS ;VERSION NUMBER SUBTTL Table of Contents SUBTTL Revision History COMMENT \ Edit Description 1 JAD, 17-Jul-85. Create first version. \; End of Revision History SUBTTL Constants and Assembly Parameters ;Indices in read counters argument block .DGFNC==0 ;FUNCTION .DGSFN==1 ;SUB-FUNCTION TOPS10 < ;IN MONSYM .DGPVL==2 ;JOB WHICH OWNS COUNTERS .DGPND==3 ;MICROCODE VERSION .DGP0A==4 ;PATH A ACKS .DGP0N==5 ;PATH A NAKS .DGP0R==6 ;PATH A NRSP .DGP1A==7 ;PATH B ACKS .DGP1N==10 ;PATH B NAKS .DGP1R==11 ;PATH B NRSP .DGPDD==12 ;DATAGRAMS DISCARDED .DGPXC==13 ;PACKETS TRANSMITTED .DGPRC==14 ;PACKETS RECEIVED .DGPTG==15 ;DESIGNATED PORT (BITS 24-31) .DGCRC==16 ;PACKETS RECEIVED WITH CRC ERRORS .DGEW1==17 ;MOVER PAR ERRS,,CBUS PAR ERRS .DGEW2==20 ;REG PLIPE ERRS,,DATA PLIPE ERRS .DGEW3==21 ;CHAN ERRS,,EBUS PAR ERRS .DGEW4==22 ;SPURIOUS CHAN ERRS,,CBUS AVAIL TIMEOUTS .DGEW5==23 ;SPURIOUS RCV ATTN,,SPURIOUS XMT ATTN .DGEW6==24 ;XMT BUFFER PAR ERRS,,XMT TIMEOUTS >; END TOPS10 CTRLEN==25 ;LENGTH OF BLOCK ;Miscellaneous ND PDLLEN,200 ;DEFAULT LENGTH OF PDL ND CMD.SZ,1000 ;SIZE OF COMMAND DATA BLOCK ND MAXNDS,20 ;MAXIMUM NUMBER OF NODES ON CI BUS SUBTTL Parser Keywords ;Keywords defining CI port number TOPS10 < .KYCI0==1000 ;CI-0 .KYCI1==1001 ;CI-1 .KYCI2==1002 ;CI-2 .KYCI3==1003 ;CI-3 .KYCI4==1004 ;CI-4 .KYCI5==1005 ;CI-5 > ;END TOPS10 ;Keywords used when parsing SET command .KYALL==2000 ;"ALL" .KYAAK==2001 ;A-ACK .KYANK==2002 ;A-NACK .KYANR==2003 ;A-NRSP .KYBAK==2004 ;B-ACK .KYBNK==2005 ;B-NAK .KYBNR==2006 ;B-NRSP .KYDGR==2007 ;DATAGRAMS-DISCARDED .KYXMT==2010 ;TRANSMITTED-PACKETS .KYRCV==2011 ;RECEIVED-PACKETS .KYCLR==2012 ;/CLEAR SUBTTL Macros ;Macro to generate an error message. TXT is any valid $TEXT string. ;Branches to ERROR which should reset and start a new command scan. DEFINE $ERR(TXT),< LSTOF. ;;TURN OFF LISTING JSP TF,ERROR ;;CALL THE ERROR ROUTINE CAI [ITEXT ()] ;;ADDRESS OF ITEXT LSTON. ;;TURN LISTING BACK ON >; END DEFINE $ERR SUBTTL Data Segment ;Initialization block IB: $BUILD (IB.SZ) ;BUILD INITIALIZATION BLOCK $SET (IB.PRG,,%%.MOD) ;PROGRAM NAME $SET (IB.FLG,IT.OCT,1) ;OPEN COMMAND TERMINAL $SET (IB.FLG,IB.NPF,1) ;NO PAGE FAULT HANDLER $EOB ;END OF INITIALIZATION BLOCK ;Impure storage $DATA PDLIST,PDLLEN ;PUSHDOWN LIST $DATA ZCORE,0 ;START OF AREA ZEROED AT INITIALIZATION $DATA PARBLK,PAR.SZ ;PARSER CONTROL BLOCK $DATA CMDBLK,CMD.SZ ;COMMAND DATA BLOCK TOPS10 <$DATA PRTPDB,<1+6>> ;DYNAMIC PORT NAME PDB $DATA CTRBLK,CTRLEN ;SPACE TO READ PORT COUNTERS TOPS10 <$DATA CTXDAT,12> ;CTX. UUO BUFFER TOPS20 < $DATA FRKRUN ;-1 IF FORK RUNNING $DATA FRKJFN ;JFN OF FORK $DATA FRKHND ;FORK HANDLE $DATA SAVTWD,2 ;SAVE TERMINAL WORDS $DATA SAVMOD ;SAVE MODE >; END TOPS20 $DATA EZCORE,0 ;END+1 OF AREA ZEROED AT INITIALIZATION SUBTTL Initialization CICTRS: JFCL ;NO CCL ENTRY RESET ;RESET ALL I/O MOVE P,[IOWD PDLLEN,PDLIST] ;SET UP PUSHDOWN LIST MOVEI S1,IB.SZ ;SIZE OF INITIALIZATION BLOCK MOVEI S2,IB ;ADDRESS OF INITIALIZATION BLOCK $CALL I%INIT ;INITIAILIZE GALAXY LIBRARY MOVEI S1, ;LENGTH OF IMPURE STORAGE MOVEI S2,ZCORE ;START OF IMPURE STORAGE $CALL .ZCHNK ;ZERO IMPURE STORAGE SETZB S1,S2 ;NO TIMEOUT $CALL P$INIT ;INITIALIZE PARSER ROUTINES JRST GETCMD ;ENTER COMMAND PARSING LOOP SUBTTL Command Parsing Loop GETCMD: MOVE P,[IOWD PDLLEN,PDLIST] ;RESET STACK POINTER EACH LOOP MOVEI S1,INIFDB ;SET UP PARSER CONTROL BLOCK MOVEM S1,PARBLK+PAR.TB MOVEI S1,[ASCIZ /CICTRS>/] ;SET UP ADDRESS OF PROMPT MOVEM S1,PARBLK+PAR.PM MOVEI S1,CMDBLK ;SET UP ADDRESS OF BLOCK TO STORE COMMAND DATA MOVEM S1,PARBLK+PAR.CM SETZM PARBLK+PAR.SR ;DON'T RESCAN LAST LINE MOVEI S1,CMD.SZ ;LENGTH OF COMMAND DATA AREA MOVEI S2,CMDBLK ;ADDRESS OF COMMAND DATA AREA $CALL .ZCHNK ;ZERO COMMAND DATA AREA MOVEI S1,COM.SZ-1 ;SET UP INITIAL SIZE OF COMMAND BLOCK STORE S1,CMDBLK+.MSTYP,MS.CNT MOVEI S1,PAR.SZ ;LENGTH OF PARSER BLOCK MOVEI S2,PARBLK ;ADDRESS OF PARSER BLOCK $CALL PARSER ;PARSE THE COMMAND JUMPT GETCM1 ;JUMP IF PARSE SUCCESSFUL CMDERR: MOVE S1,PRT.FL(S2) ;GET FLAGS MOVE S2,PRT.EM(S2) ;GET ADDRESS OF ERROR TEXT TXNE S1,P.CEOF ;END OF FILE ON RESCAN? MOVEI S2,[ASCIZ /Invalid command terminator/] $TEXT , ;TYPE ERROR MESSAGE JRST GETCMD ;AND TRY AGAIN GETCM1: MOVEI S1,CMDBLK+COM.SZ ;POINT TO FIRST ARGUMENT $CALL P$SETU ;SET UP FOR SECOND PASS $CALL P$KEYW ;GET THE KEYWORD VALUE JUMPT GETCM2 ;JUMP IF PARSE SUCCESSFUL $TEXT , JRST GETCMD ;TRY AGAIN GETCM2: $CALL (S1) ;CALL THE COMMAND PROCESSOR JRST GETCMD ;AND PROMPT FOR NEXT COMMAND ERROR: MOVE TF,@TF ;GET ADDRESS OF ERROR ITEXT $TEXT , ;PRINT ERROR MESSAGE PRECEDED BY Q-MARK JRST GETCMD ;START OVER SUBTTL Command Parse Tables INIFDB: $INIT (KEYFDB) KEYFDB: $KEYDSP (CMDTAB) CMDTAB: $STAB TOPS10 < DSPTAB (,EXICMD,\".CHCNZ,CM%INV) > DSPTAB (EXIFDB,EXICMD,) DSPTAB (HLPFDB,HLPCMD,) DSPTAB (PSHFDB,PSHCMD,) DSPTAB (SETFDB,SETCMD,) DSPTAB (SHOFDB,SHOCMD,) $ETAB EOLFDB: $CRLF SUBTTL EXIT Command Tables EXIFDB: $NOISE (EOLFDB,) SUBTTL HELP Command Tables ND CR.ADR,4 ;ADDRESS OF CURRENT ARGUMENT HLPFDB: $NOISE (HLP001,) HLP001: $CTEXT(,,<$ACTION(HLPACT),$DEFAULT(HELP)>) HLPACT: MOVE S2,CR.ADR(S2) ;GET THE DATA HRROI S2,ARG.DA(S2) ;POINT TO THE STRING MOVEI S1,HLPFD ;POINT TO HELP FILE FD $CALL P$HELP ;HELP THEM IF WE CAN $CALL P$NPRO ;MARK NO PROCESSING $RETT ;RETURN ;File descriptor for help file for CICTRS TOPS10 < HLPFD: $BUILD (FDMSIZ) ;BUILD FILE DESCRIPTOR BLOCK $SET (.FDLEN,FD.LEN,FDMSIZ) ;SIZE OF FD $SET (.FDSTR,,'HLP ') ;DEVICE $SET (.FDNAM,,'CICTRS') ;FILE NAME $SET (.FDEXT,,'HLP ') ;EXTENSION $EOB ;END OF HELP FILE DESCRIPTOR BLOCK >; END TOPS10 TOPS20 < HLPFD: XWD HSIZ,0 ;SIZE,,TYPE ASCIZ /HLP:CICTRS.HLP/ HSIZ==.-HLPFD ;SIZE >; END TOPS20 SUBTTL PUSH command tables PSHFDB: TOPS10 <$NOISE (PUS100,)> TOPS20 <$NOISE (PUS100,)> PUS100: $CRLF (<$ACTION(PUSHRT)>) SUBTTL SET Command Tables SETFDB: TOPS10 < $NOISE (SET010,,$PREFILL(PRTINI)) SET010: $KEY (SET020,PRTPDB) SET020: $NOISE (SET030,) >; END TOPS10 TOPS20 < $NOISE (SET030,) >; END TOPS20 SET030: $NUMBER (SET100,^D10,,<$ALTER(SET040),$ACTION(CHKNOD)>) SET040: $KEYDSP (SET050) SET050: $STAB DSPTAB (SET100,.KYALL,) $ETAB SET100: $NOISE (SET110,) SET110: $KEY (SET130,SET120,$ALTER(SET200)) SET120: $STAB KEYTAB (.KYAAK,) KEYTAB (.KYANK,) KEYTAB (.KYANR,) KEYTAB (.KYBAK,) KEYTAB (.KYBNK,) KEYTAB (.KYBNR,) KEYTAB (.KYDGR,) KEYTAB (.KYXMT,) KEYTAB (.KYRCV,) $ETAB SET130: $COMMA (SET140,<$ALTER(SET300),$HELP(comma to specify another counter)>) SET140: $KEY (SET130,SET120,$ALTER(SET300)) SET200: $KEYDSP (SET210,$ALTER(SET300)) SET210: $STAB DSPTAB (SET300,.KYALL,) $ETAB SET300: $SWITCH (EOLFDB,SET310,$ALTER(EOLFDB)) SET310: $STAB KEYTAB (.KYCLR,) $ETAB ;ACTION ROUTINE CALLED ON SET COMMAND TO CHECK LEGALITY OF ;CI NODE NUMBER ARGUMENT. CHKNOD: SKIPL S1,CR.RES(S2) ;CHECK THAT NUMBER CAIL S1,MAXNDS ;MUST BE .GE. 0 AND .LT. MAXNDS SKIPA ;IT'S BAD $RETT ;IT'S GOOD PUSHJ P,FIXIT MOVEI S2,[ASCIZ /Invalid CI node number/] $RETF FIXIT: HRRZ T4,CR.FLG(S2) ;GET ADR OF CMDBLK MOVE T1,.CMPTR(T4) ;GET COMMAND POINTER MOVE T2,.CMABP(T4) ;GET BP TO ATOM BUFFER FIXI.1: ILDB T3,T2 JUMPE T3,FIXI.2 ;DONE.. ALL FIXED UP MOVNI T3,1 ;DECREMENT THE BP ADJBP T3,T1 ;... MOVE T1,T3 ;... AOS .CMCNT(T4) JRST FIXI.1 ;TRY NEXT CHARACTER FIXI.2: MOVEM T1,.CMPTR(T4) ;STORE ADJUSTED BP POPJ P, SUBTTL SHOW Command Tables SHOFDB: TOPS10 < $NOISE (SHO010,,$PREFILL(PRTINI)) SHO010: $KEY (EOLFDB,PRTPDB) >; END TOPS10 TOPS20 < $NOISE (EOLFDB,) >; END TOPS20 SUBTTL Dynamic Port Name Initialization TOPS10 < PRTINI: $SAVE ;SAVE SOME AC'S MOVSI P1,-6 ;MAXIMUM NUMBER OF CPU'S WHICH MIGHT EXIST SETZ P2, ;START WITH FIRST KEYWORD SLOT PRTI.1: HRRZ S1,P1 ;GET CPU NUMBER LSH S1,1 ;TIMES TWO ADDX S1,%CCCIP ;OFFSET TO CI PORT CONTROL BLOCK GETTAB GETTAB S1, ;DO IT SETZ S1, ;ASSUME NONE JUMPE S1,PRTI.2 ;JUMP IF NO CI PORT ON THIS CPU MOVE S1,PRTKEY(P1) ;GET KEYWORD ENTRY FOR THIS PORT MOVEM S1,PRTPDB+1(P2) ;STORE IN TABLE ADDI P2,1 ;OFFSET TO NEXT SLOT PRTI.2: AOBJN P1,PRTI.1 ;LOOP FOR REMAINDER HRLS P2 ;MOVE COUNT TO LH ALSO MOVEM P2,PRTPDB ;SAVE COUNT IN HEAD OF TABLE $RETT ;RETURN ;Table of keyword entries for possible CI ports PRTKEY: KEYTAB (.KYCI0,) ;CI-0 KEYTAB (.KYCI1,) ;CI-1 KEYTAB (.KYCI2,) ;CI-2 KEYTAB (.KYCI3,) ;CI-3 KEYTAB (.KYCI4,) ;CI-4 KEYTAB (.KYCI5,) ;CI-5 >; END TOPS10 SUBTTL SET Command Processing SETCMD: TOPS10 < $CALL P$KEYW ;GET THE KEYWORD (CI PORT NUMBER) $RETIF ;IF ERROR MOVE P1,S1 ;SAVE IT HERE >; END TOPS10 $CALL P$NUM ;GET THE NODE NUMBER JUMPF SETC.1 ;POSSIBLY "ALL" MOVE P2,S1 ;SAVE NODE NUMBER JRST SETC.2 ;REJOIN COMMON CODE SETC.1: $CALL P$KEYW ;SEE IF "ALL" $RETIF ;GUESS NOT CAXE S1,.KYALL ;WAS IT "ALL"? $RETF ;NO, ERROR SETO P2, ;FLAG FOR ALL NODES SETC.2: SETZ P3, ;ASSUME THEY WILL SPECIFY SOME COUNTERS $CALL P$CFM ;SEE IF EOL JUMPT [MOVSI P3,^B101010101010101010 ;LOAD BITS FOR ALL COUNTERS JRST SETCTR] ;GO SET THE COUNTERS $CALL P$KEYW ;SHOULD BE SOME SORT OF KEYWORD $RETIF ;IF ERROR CAXE S1,.KYALL ;WAS IT ALL-COUNTERS? JRST SETC.3 ;NO MOVSI P3,^B101010101010101010 ;LOAD BITS FOR ALL COUNTERS JRST SETC.4 ;SEE IF SWITCH COMING SETC.3: CAIL S1,.KYAAK ;IS IT A KNOWN KEYWORD? CAILE S1,.KYRCV ;... $RETF ;NO, ERROR TDO P3,CTRBIT-.KYAAK(S1) ;SET THE BIT $CALL P$COMMA ;SEE IF COMMA JUMPF SETC.4 ;SEE IF SWITCH COMING $CALL P$KEYW ;GET NEXT KEYWORD $RETIF ;IF ERROR JRST SETC.3 ;TRY FOR ANOTHER COUNTER NAME SETC.4: $CALL P$SWIT ;SEE IF A SWITCH JUMPF SETCTR ;NO CAXE S1,.KYCLR ;SHOULD BE THIS ONE $RETF ;NO, ERROR MOVE S1,P3 ;GET THE BITS LSH S1,-1 ;POSITION THEM IOR P3,S1 ;SET THE CLEAR BITS AS APPROPRIATE SETCTR: TOPS10 ;GET CPU NUMBER TOPS20 ;NO CPU NUMBER HRRI T1,.DIACC ;FUNCTION TO MANIPULATE PORT COUNTERS MOVE T2,[7,,.DICGT] ;KLIPA CHANNEL,,SUB-FUNCTION TO GET COUNTERS MOVE S1,[-2,,T1] ;POINT AT ARGUMENTS $CALL DODIAG ;DO THE UUO/JSYS JUMPF GETERR ;IF ERROR HRRI T2,.DICPT ;SUB-FUNCTION TO POINT COUNTERS MOVE T3,P3 ;GET MASK FOR COUNTERS MOVE T4,P2 ;GET NODE NUMBER MOVE S1,[-4,,T1] ;POINT AT ARGUMENTS $CALL DODIAG ;DO THE UUO/JSYS JUMPF PNTERR ;IF ERROR HRRI T2,.DICRL ;SUB-FUNCTION TO RELEASE COUNTERS MOVE S1,[-2,,T1] ;POINT AT ARGUMENTS $CALL DODIAG ;DO THE UUO/JSYS JUMPF RLSERR ;IF ERROR $RETT ;ALL DONE ;Table of bits for port counters indexed by counter name keyword CTRBIT: 1B0 ;A-ACKS 1B2 ;A-NAKS 1B4 ;A-NRSP 1B6 ;B-ACKS 1B8 ;B-NAKS 1B10 ;B-NRSP 1B12 ;DATAGRAMS-DISCARDED 1B14 ;TRANSMITTED-PACKETS 1B16 ;RECEIVED-PACKETS SUBTTL SHOW Command Processing SHOCMD: TOPS10 < $CALL P$KEYW ;GET THE KEYWORD (CI PORT NUMBER) $RETIF ;IF ERROR MOVSI T1,-.KYCI0(S1) ;GET CPU NUMBER >; END TOPS10 TOPS20 ;NO CPU NUMBER HRRI T1,.DIACC ;FUNCTION TO MANIPULATE PORT COUNTERS MOVEM T1,CTRBLK+.DGFNC ;SAVE FUNCTION WORD MOVE T1,[7,,.DICRD] ;KLIPA CHANNEL,,SUB-FUNCTION TO READ COUNTERS MOVEM T1,CTRBLK+.DGSFN ;SAVE SUB-FUNCTION WORD MOVE S1,[-CTRLEN,,CTRBLK] ;POINT AT THE ARGUMENTS $CALL DODIAG ;DO THE UUO/JSYS JUMPF REDERR ;IF ERROR $TEXT ,<^M^JCounters read at ^H/[-1]/> LDB S1,[POINT 8,CTRBLK+.DGPTG,31] ;GET SELECTED NODE CAIE S1,377 ;WAS IT ALL NODES? SKIPA S2,[[ITEXT(^D/S1/)]] ;NO, GET APPROPRIATE ITEXT MOVEI S2,[ITEXT (ALL)] ;YES, GET APPROPRIATE ITEXT $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $TEXT , $RETT ;ALL DONE SUBTTL PUSHRT Process the PUSH command TOPS10 < PUSHRT::$CALL P$NPRO## ;NO PROCESSING REQUIRED MOVEI S1,CTXARG ;POINT TO ARGUMENT BLOCK CTX. S1, ;PUSH SKIPA ;FAILED $RETT ;AND RETURN MOVEI S2,CTXER1 ;DEFAULT TO GENERIC MESSAGE CAIN S1,CTXARG ;IMPLEMENTED? MOVEI S2,CTXER0 ;NO TXNE S1,CT.ETX ;ERROR TEXT RETURNED IN BUFFER? MOVEI S2,CTXER2 ;YES TXNE S1,CT.RUN ;RUN UUO ERROR? MOVEI S2,CTXER3 ;YES $TEXT (,) $RETT ;RETURN CTXARG: $BUILD (.CTMAX) ;BLOCK LENGTH $SET (.CTFNC,CT.LEN,.CTMAX) ;SET LENGTH $SET (.CTDBL,,12) ;SET DATA BLOCK LENGTH $SET (.CTDBA,,CTXDAT) ;SET DATA BLOCK ADDRESS $EOB ;END OF BLOCK CTXER0: ITEXT () CTXER1: ITEXT () CTXER2: ITEXT (<^T/CTXDAT/>) CTXER3: ITEXT () > ;END TOPS-10 CONDITIONAL TOPS20 < PUSHRT::$CALL P$NPRO## ;NO PROCESSING REQUIRED SKIPE S1,FRKHND ;ALREADY HAVE A FORK WITH EXEC JRST PUSH.1 ;GO TO PUSH RETURN MOVX S1,GJ%SHT!GJ%OLD ;SHORT FORM, OLD FILE HRROI S2,[ASCIZ/SYSTEM:EXEC.EXE/] GTJFN JRST NOEXEC ;NO EXEC MOVEM S1,FRKJFN ;SAVE FORK JFN MOVX S1,CR%CAP ;GIVE FORK CAPABILITIES CFORK ;CREATE THE FORK JRST NOFORK MOVEM S1,FRKHND ;SAVE FORK HANDLE HRLZS S1 ;PLACE IN LEFT HALF HRR S1,FRKJFN ;JFN IN THE FIGHT HALF GET ;NOW GET THE EXEC INTO THE LOWER FORK MOVEI S1,.FHSLF ;DONT ALLOW LOWER FORK TO LOG OUT RPCAP ;GET CAPABILITIES OF INFERIOR TXZ S2,SC%LOG ;DO NOT ALLOW LOGOUT SETZ T1, ;NO PRIVILEGES ENABLED MOVE S1,FRKHND ;GET THE FORK HANDLE EPCAP ;SET ITS CAPABILITIES ERJMP NOCAP ;TRAP THE ERROR MOVEI S1,.FHJOB ;GET THE JOB HANDLE TXO S1,RT%DIM ;GET DEFERRED ALSO RTIW ;READ TERMINAL INTERRUPT CHARACTERS DMOVEM S2,SAVTWD ;SAVE TERMINAL WORDS MOVEI S1,.PRIIN ;PRIMARY INPUT JFN RFMOD ;GET THE MODE MOVEM S2,SAVMOD ;SAVE THE MODE MOVE S1,FRKHND ;GET THE FORK HANDLE PUSH.1: SETZ S2, ;USE PRIMARY START ADDRESS SFRKV ;START THE EXEC SETOM FRKRUN ;SETOM FORK RUN $RETT ;RETURN NOEXEC: MOVEI S2,[ASCIZ/Unable to find SYSTEM:EXEC.EXE for PUSH command/] $RETF ;RETURN FALSE NOFORK: MOVEI S2,[ASCIZ/Unable to create fork for PUSH command/] $RETF ;RETURN FALSE NOCAP: MOVE S1,FRKHND ;GET THE FORK HANDLE KFORK ;KILL THE PROCESS ERJMP .+1 ;IGNORE THE ERROR SETZM FRKHND ;CLEAR THE FORK HANDLE MOVEI S2,[ASCIZ/Unable to enable forks capabilities for PUSH command/] $RETF ;RETURN FALSE > ;End TOPS20 SUBTTL Miscellaneous Simple Commands EXICMD: PJRST I%EXIT ;CALL IT QUITS HLPCMD: $RETT ;NOTHING TO DO, PARSER ALREADY DID IT PSHCMD: $RETT ;NOTHING TO DO, WE ALREADY DID IT SUBTTL Diagnostic UUO/JSYS ;Routine to execute a DIAG. UUO/JSYS, returning FALSE if an error ;occurred. Call with S1 containing a pointer to the argument block. DODIAG: TOPS10 < DIAG. S1, ;DO THE UUO $RETF ;ERROR $RETT ;SUCCESS >; END TOPS10 TOPS20 < DIAG% ;DO THE JSYS ERJMP .RETF ;ERROR $RETT ;SUCCESS >; END TOPS20 ;Here on errors GETERR: MOVEI S2,[ASCIZ /gett/] ;GET TEXT JRST DIAERR ;JOIN COMMON CODE PNTERR: MOVEI S2,[ASCIZ /point/] ;GET TEXT JRST DIAERR ;JOIN COMMON CODE RLSERR: MOVEI S2,[ASCIZ /releas/] ;GET TEXT JRST DIAERR ;JOIN COMMON CODE REDERR: MOVEI S2,[ASCIZ /read/] ;GET TEXT JRST DIAERR ;JOIN COMMON CODE DIAERR: TOPS10 < MOVE T1,S1 ;COPY ERROR CODE CAIL T1,DIAETL ;ERROR NUMBER IN RANGE? MOVEI T1,DIAETL ;NO, SOMETHING REALLY WRONG $ERR () >; END TOPS10 TOPS20 < MOVX S1,.FHSLF ;FOR SELF, GETER% ;LOOK UP MOST RECENT ERROR ERJMP .+1 ;IGNORE ANY ERRORS $ERR () >; END TOPS20 TOPS10 < DIAETX: [ASCIZ /no such error code/] [ASCIZ /not privileged/] [ASCIZ /illegal number of arguments/] [ASCIZ /illegal controller/] [ASCIZ /illegal unit/] [ASCIZ /some units already assigned/] [ASCIZ /unit not in diagnostic mode/] [ASCIZ /unit assigned to another job/] [ASCIZ /no free core/] [ASCIZ /no assigned units/] [ASCIZ \I/O word crosses a page boundary\] [ASCIZ /illegal function/] [ASCIZ /job can't be virtual/] [ASCIZ /no such CPU/] [ASCIZ /CPU not running/] [ASCIZ /bad argument list/] [ASCIZ /no CI port on CPU/] [ASCIZ /read CI port counters timed out/] [ASCIZ /no NI port on CPU/] [ASCIZ /microcode reload failed/] [ASCIZ /microcode not available/] [ASCIZ /CI port not running/] DIAETL==.-DIAETX [ASCIZ /unknown error code/] >; END TOPS10 SUBTTL The End TOPS10 ;END OF CICTRS TOPS20 > ;ENTRY VECTOR DEFINITION