Google
 

Trailing-Edge - PDP-10 Archives - BB-FP64A-SB_1986 - 10,7/cictrs/cictrs.mac
There are 3 other files named cictrs.mac in the archive. Click here to see a list.
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 (<TXT>)]	;;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,<EZCORE-ZCORE-1> ;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	,<?^T/(S2)/>	;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	,<?Internal command table error>
	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	,<?^I/@TF/>	;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,<EXIT>)
	 DSPTAB	(HLPFDB,HLPCMD,<HELP>)
	 DSPTAB	(PSHFDB,PSHCMD,<PUSH>)
	 DSPTAB	(SETFDB,SETCMD,<SET>)
	 DSPTAB	(SHOFDB,SHOCMD,<SHOW>)
	$ETAB

EOLFDB:	$CRLF
SUBTTL	EXIT Command Tables


EXIFDB:	$NOISE	(EOLFDB,<from CICTRS>)
SUBTTL	HELP Command Tables


	ND	CR.ADR,4	;ADDRESS OF CURRENT ARGUMENT

HLPFDB:	$NOISE	(HLP001,<with>)

HLP001:	$CTEXT(,<command>,<$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,<to monitor level>)>
	TOPS20	<$NOISE	(PUS100,<to EXEC level>)>

PUS100:	$CRLF	(<$ACTION(PUSHRT)>)
SUBTTL	SET Command Tables


SETFDB:
TOPS10 <
	$NOISE	(SET010,<CI port counters of>,$PREFILL(PRTINI))

SET010:	$KEY	(SET020,PRTPDB)

SET020:	$NOISE	(SET030,<to monitor CI node>)
>; END TOPS10
TOPS20 <
	$NOISE	(SET030,<CI port counters to monitor CI node>)
>; END TOPS20

SET030:	$NUMBER	(SET100,^D10,<CI node number>,<$ALTER(SET040),$ACTION(CHKNOD)>)

SET040:	$KEYDSP	(SET050)

SET050:	$STAB
	DSPTAB	(SET100,.KYALL,<ALL>)
	$ETAB

SET100:	$NOISE	(SET110,<counter>)

SET110:	$KEY	(SET130,SET120,$ALTER(SET200))

SET120:	$STAB
	KEYTAB	(.KYAAK,<A-ACKS>)
	KEYTAB	(.KYANK,<A-NAKS>)
	KEYTAB	(.KYANR,<A-NRSP>)
	KEYTAB	(.KYBAK,<B-ACKS>)
	KEYTAB	(.KYBNK,<B-NAKS>)
	KEYTAB	(.KYBNR,<B-NRSP>)
	KEYTAB	(.KYDGR,<DATAGRAMS-DISCARDED>)
	KEYTAB	(.KYXMT,<TRANSMITTED-PACKETS>)
	KEYTAB	(.KYRCV,<RECEIVED-PACKETS>)
	$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,<ALL>)
	$ETAB

SET300:	$SWITCH	(EOLFDB,SET310,$ALTER(EOLFDB))

SET310:	$STAB
	KEYTAB	(.KYCLR,<CLEAR>)
	$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,<CI port counters of>,$PREFILL(PRTINI))

SHO010:	$KEY	(EOLFDB,PRTPDB)
>; END TOPS10
TOPS20 <
	$NOISE	(EOLFDB,<CI port counters>)
>; END TOPS20
SUBTTL	Dynamic Port Name Initialization


TOPS10 <
PRTINI:	$SAVE	<P1,P2>		;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>)	;CI-0
	KEYTAB	(.KYCI1,<CI-1>)	;CI-1
	KEYTAB	(.KYCI2,<CI-2>)	;CI-2
	KEYTAB	(.KYCI3,<CI-3>)	;CI-3
	KEYTAB	(.KYCI4,<CI-4>)	;CI-4
	KEYTAB	(.KYCI5,<CI-5>)	;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 <MOVSI	T1,-.KYCI0(P1)>	;GET CPU NUMBER
TOPS20 <SETZ	T1,>		;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 <SETZ	T1,>		;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	,<Selected node: ^I/0(S2)/>
	$TEXT	,<CI-20 microcode version: ^O/CTRBLK+.DGPND/>
	$TEXT	,<Path A:   ACK count: ^D/CTRBLK+.DGP0A/  NAK count: ^D/CTRBLK+.DGP0N/  No response count: ^D/CTRBLK+.DGP0R/>
	$TEXT	,<Path B:   ACK count: ^D/CTRBLK+.DGP1A/  NAK count: ^D/CTRBLK+.DGP1N/  No response count: ^D/CTRBLK+.DGP1R/>
	$TEXT	,<Datagrams discarded: ^D/CTRBLK+.DGPDD/>
	$TEXT	,<Packets transmitted: ^D/CTRBLK+.DGPXC/>
	$TEXT	,<Packets received: ^D/CTRBLK+.DGPRC/>
	$TEXT	,<Packets received with CRC errors: ^D/CTRBLK+.DGCRC/>
	$TEXT	,<Mover parity errors: ^D/CTRBLK+.DGEW1,LHMASK/>
	$TEXT	,<CBUS parity errors: ^D/CTRBLK+.DGEW1,RHMASK/>
	$TEXT	,<Register PLIPE errors: ^D/CTRBLK+.DGEW2,LHMASK/>
	$TEXT	,<Data PLIPE errors: ^D/CTRBLK+.DGEW2,RHMASK/>
	$TEXT	,<Channel errors: ^D/CTRBLK+.DGEW3,LHMASK/>
	$TEXT	,<EBUS parity errors: ^D/CTRBLK+.DGEW3,RHMASK/>
	$TEXT	,<Spurious channel errors: ^D/CTRBLK+.DGEW4,LHMASK/>
	$TEXT	,<CBUS available timeouts: ^D/CTRBLK+.DGEW4,RHMASK/>
	$TEXT	,<Spurious receive attentions: ^D/CTRBLK+.DGEW5,LHMASK/>
	$TEXT	,<Spurious transmit attentions: ^D/CTRBLK+.DGEW5,RHMASK/>
	$TEXT	,<Transmit buffer parity errors: ^D/CTRBLK+.DGEW6,LHMASK/>
	$TEXT	,<Transmit timeouts: ^D/CTRBLK+.DGEW6,RHMASK/^M^J>
	$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	(,<?Cannot save context; ^I/(S2)/>)
	$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	(<CTX. UUO not implemented>)
CTXER1:	ITEXT	(<CTX. UUO error ^O/S1,CT.ERR/>)
CTXER2:	ITEXT	(<^T/CTXDAT/>)
CTXER3:	ITEXT	(<RUN UUO error ^O/S1,CT.ERR/>)

> ;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	(<DIAG. UUO error (^O/S1/) ^T/@DIAETX(T1)/ ^T/0(S2)/ing CI port counters>)
>; END TOPS10
TOPS20 <
	MOVX	S1,.FHSLF		;FOR SELF,
	GETER%				;LOOK UP MOST RECENT ERROR
	  ERJMP	.+1			;IGNORE ANY ERRORS
	$ERR	(<DIAG% JSYS error ^E/S1,RHMASK/ ^T/0(S2)/ing CI port counters>)
>; 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	CICTRS>		;END OF CICTRS
TOPS20 <END	<3,,ENTVEC>>	;ENTRY VECTOR DEFINITION