Google
 

Trailing-Edge - PDP-10 Archives - BB-H138C-BM - galaxy-sources/opr.mac
There are 37 other files named opr.mac in the archive. Click here to see a list.
TITLE	OPR -- Parser Routines for ORION
SUBTTL B. Hardy, C. Romash & M. Berkowitz 5-Nov-79/PJT


;
;
;                COPYRIGHT (c) 1975,1976,1977,1978,1979
;                    DIGITAL EQUIPMENT CORPORATION
;
;     THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY  BE  USED
;     AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE
;     AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE.   THIS
;     SOFTWARE  OR ANY OTHER COPIES THEREOF MAY NOT BE PROVIDED OR
;     OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON.  NO  TITLE  TO
;     AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.
;
;     THE INFORMATION  IN  THIS  SOFTWARE  IS  SUBJECT  TO  CHANGE
;     WITHOUT  NOTICE  AND SHOULD NOT BE CONSTRUED AS A COMMITMENT
;     BY DIGITAL EQUIPMENT CORPORATION.
;
;     DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
;     OF  ITS  SOFTWARE  ON  EQUIPMENT  WHICH  IS  NOT SUPPLIED BY
;     DIGITAL.

	SEARCH	GLXMAC

	.directive flblst
	PROLOG	(OPR)
	SEARCH	ORNMAC

	EXTERNAL PAREDT,CMDEDT



	OPRWHO==0
	OPRVER==4
	OPRMIN==0
	OPREDT==122

	%%.OPV==<VRSN.(OPR)>+CMDEDT+PAREDT

	.JBVER==137

	LOC	.JBVER
	EXP	%%.OPV
	RELOC
SUBTTL	Table of Contents

;               TABLE OF CONTENTS FOR OPR
;
;
;                        SECTION                                   PAGE
;    1. B. Hardy, C. Romash & M. Berkowitz 30-Aug-79..............   1
;    2. Table of Contents.........................................   2
;    3. Revision History..........................................   3
;    4. SPECIAL ACCUMULATOR ASSIGNMENTS...........................   4
;    5. OPR IMPURE DATA...........................................   5
;    6. CONSTANT AND STORAGE DEFINITIONS..........................   6
;    7. TABLE BUILDING DATA BASE..................................   7
;    8. Main Entry  --  Initialization............................   8
;    9. MAIN    MAIN LOOP IN OPR..................................   9
;   10. TAKEND  END OF TAKE COMMAND...............................  10
;   11. DSPCMD  DISPLAY TAKE FILE COMMANDS IF DESIRED.............  11
;   12. PRCMSG  PROCESS IPCF MESSAGE ROUTINE......................  12
;   13. VALMSG  VALIDATE THE MESSAGE FROM ORION...................  12
;   14. ACKOPR  OUTPUT GALAXY TEXT MESSAGE........................  13
;   15. DSPOPD  PROCESS DISPLAY MESSAGE FROM ORION................  14
;   16. SHWDSP  PROCESS DISPLAY MESSAGE FROM ORION................  15
;   17. TABSET  SETUP TABLES FOR PARSER CALL......................  16
;   18. Software Interrupt System Routines........................  17
;   19. COMMAND AND APPLICATION ACTION ROUTINES...................  18
;   20. ENTER AND RETURN COMMANDS.................................  19
;   21. EXIT COMMAND TABLES.......................................  20
;   22. TAKOPR ROUTINE............................................  21
;   23. WAIOPR ROUTINE............................................  22
;   24. SETRTN AND SETTRM TERMINAL SET ROUTINES...................  23
;   25. ESCAPE Sequence Table for Operator Terminals..............  24
;   26. SHWDAY  SHOW DAYTIME ACTION ROUTINE.......................  26
;   27. OPRRMT  REMOTE OPR ENTRY POINT............................  27
;   28. WAITCN  WAIT FOR OUTPUT LINK CONNECT......................  28
;   29. REMSET  SETUP OPR LINKS...................................  29
;   30. SETOUT  SETUP OUTPUT OF DATA..............................  30
;   31. SNDOUT  SEND OUTPUT OVER THE LINK.........................  30
;   32. OUTRTN  OUTPUT ROUTINE FOR LINKS..........................  30
;   33. SETPTR  SETUP POINTERS FOR OUTPUT.........................  30
;   34. INPINT  INPUT OVER LINK INTERRUPT.........................  31
;   35. OUTINT  OUTPUT LINK CONNECTED.............................  31
;   36. IPCRMT  IPCF INTERRUPT ROUTINE FOR REMOTE OPR.............  31
;   37. INPDAT  INPUT THE DATA FROM LINK..........................  32
;   38. CONNEC  PROCESS CONNECT MESSAGE...........................  33
;   39. TXTLIN  CHECK IF MULTIPLE LINE INPUT ALLOWED..............  34
;   40. SETFAL  SEND A SETUP FAILURE FOR OPR ERRORS...............  35
;   41. PUSHRT  ROUTINE TO PUSH FOR THE -20.......................  36
;   42. TERMFK  FORK TERMINATION INTERRUPT CODE...................  37
;   43. OPRSON  OPR SIGNON TO ORION...............................  38
;   44. OPRRST  OPR REPLY TO SETUP................................  39
;   45. SETREP  SETUP REPLY MESSAGE...............................  40
;   46. SETMES  SETUP MESSAGE REPLY...............................  41
;   47. TABCHK  ROUTINE TO CHECK OUT TABLES.......................  42
;   48. GETLOC  GET OPRS LOCATION.................................  43
SUBTTL	Revision History

COMMENT \

Edit	Module	When		Change

1	OPR	31-May-77	First Development version on SYS (TOPS20)

2	OPR	1-Jun-77	Add code to handle WRITE-TO-OPR messages.

3	OPR	5-Jun-77	Add code to handle JFN's properly and
				to fill in defaults.

4	OPR	7-Jun-77	Convert to new initialization to use
				new GLXLIB.
5	OPR	14-Jun-77	Change .CMNUM and .CMNUX to save full words
				rather than half words
6	OPR	17-Jun-77	Implement TAKE Command.

7	OPR	24-Jun-77	Change to use GALAXY TEXT message for acknowledgement

10	OPR	27-Jun-77	Fix SAVFIL to correctly save an FD.

11	OPR	30-Jun-77	Add PR.INF to save radix on number type fields

12	OPR	12-July-77	Clean up error handling

13	OPR	12-July-77	Make WTO with no object type work

14	OPR	26-Aug-77	Don't include generation number in filespec
				for output

15	OPR	20-Sept-77	Make this be version 2

16	OPR	22-July-77	Add interrupt system for TOPS10

17	OPR	8-August-77	Convert to use GLXSCN on both TOPS10 and
				TOPS20

20	OPR	19-August-77	Make SAVTOK work correctly

21	OPR	19-August-77	Make all negative numbers illegal

22	OPR	19-August-77	Remove Edit 15 which was a Release 3 only hack
23	OPR	19-August-77	Fix ill mem ref as a result of undefined
				results in S2 from COMND

24	OPR	21-September-77	Complete changes to usd GLXSCN

25	OPR	22-September-77	Make TAKE command work on TOPS10

26	OPR	26-Sep-77	Don't reset INCMIN until entire command has
				been processed.

27	OPR	11-Oct-77	Add SET TERMINAL command. Also add global
				flag NOSND to indicate no message should be
				sent to ORION for this command

30	OPR	19-Oct-77	Add SET TERMINAL MESSAGES and 
				SET TERMINAL NODE commands.

31	OPR	21-Oct-77	Fix race in message processing- don't
				change pc if we are already processing messages
32	OPR	10-Nov-77	Add file spec defaults for TOPS-10

33	OPR	11-Nov-77	Add neww terminal types Keypad VT52 and VT50

34	OPR	11-Nov-77	Add new Operator Display Message to allow
				multiple WTO's in one display message

35	OPR	13-Nov-77	Make DSPOPR routine process
				multiple WTO's in one display message
36	OPR	18-Nov-77	Add code for multiple line RESPOND

37	OPR	18-Nov-77	Add code for SHOW DAYTIME

40	OPR	23-Nov-77	Change BLDCOM to use symbols for COMMAND message

41	OPR	2-Dec-77	Add code for multiple line SEND and multiple
				line explanation for CANCEL

42	OPR	6-Dec-77	Add code to include text of command in COMMAND
				message.

43	OPR	4-Jan-78	Support switch delete code in OPRTAB

44	OPR	17-Jan-78	Make sure all text is passed in message

45	OPR	2-Feb-78	Add new Display,WTO,WTOR,Ack message 
				processing

46	OPR	10-Feb-78	Add FLAG AC and fix up WTO,WTOR,ACK

47	OPR	18-April-78	Remove the Parser from OPR and make OPRPAR

50	OPR	12-June-78	Remove the display routines and use K%SOUT

51	OPR	20-June-78	Fix OPR Interrupt code with K%TPOS and 
				S%EXIT

52	OPR	28-Jun-78	Move DSPTAK, OPRTAK, and PRMTSZ to 
				OPRPAR

53	OPR	15-Jul-78	Remove all .REQUIRE Statements so they
				may be moved to OPR.CMD
54	OPR	20-July-78	Fix OPRSON to display errors and exit

55	OPR	1-Aug-78	Add Counter to cleanup Core in OPR since
				Page Fault Handler might take to long
56	OPR	2-Aug-78	Remove the "CURRENT DATE AND TIME"
				text from SHWDAY.
57	OPR	3-Aug-78	Eliminate the text "ERROR:" from all
				error messages and replace it with
				"<CRLF>?". The effected label is MAIN.6.
60	OPR	16-Aug-78	Add support for NCP and correct ADJBP 
61	OPR	31-Aug-78	Add SHOW Message display for QUASAR
62	OPR	5-Sept-78	Add EXIT command
63	OPR	8-Sept-78	Add P.ENDT for end of Take File
				Also have PARSER CLOSE UNUSED JFNS ON -20
64	OPR	12-Sept-78	Move TXTINP and GETTXT to OPRPAR
65	OPR	29-Sept-78	Remove MSGCNT for releasing up Memory since
				Library will take care of it.
66	OPR	23-Oct-78	Add TABAPL macro to get Application names
				and symbols
67	OPR	9-Nov-78	Have EXIT use I%EXIT to terminate
70	OPR	30-Nov-78	Add new  form of OPR hello message to ORION
71	OPR	4-Dec-78	Have EXIT use $HALT to enable Continue to work
72	OPR	19-Dec-78	Add DN200 code and OPRRMT as reenter address
73	OPR	21-Dec-78	Change to let superior IIC on Data Interrupts 
				for DN200
74	OPR	2-Jan-79	Add Link Status Checks for DN200 Input 
				to check for more data
75	OPR	5-Jan-79	Convert KEYTAB to ORNDSP Macro to be compatible
				with standard PARUNV
76	OPR	5-Jan-79	Add TXTLIN to OPR to check if Multiple Line
				Input allowed before calling TXTINP
77	OPR	8-Jan-79	Convert to new GLXLIB and $STOP taking ITEXT
100	OPR	10-Jan-79	Add OP.RMT to flags word for Remote Operator
				on the -20.
				AND GET CURRENT LOCATION ON THE -20 BEFORE HELLO
101	OPR	18-Jan-79	Add OPR HELP Command Action Support and create
				NOPROC to mark no processing in the message
102	OPR	24-Jan-79	Add null to text from Network after SINR
103	OPR	26-JAN-79	CONVERT TO .REQUIRE FOR APPLICATION TABLES
104	OPR	23-Feb-79	Add Timer Trap for OPR wakeup as well as
				P$INIT support. Use P$INTR at INT:
105	OPR	27-Feb-79	Support to output Prompt if displayed something
				on interrupt breakout
				Also Send Message to ORION on Take End
106	OPR	5-Mar-79	Add P$NPRO to set no Processing in Parser Return
				Flags
				Add PUSH Command Support
107	OPR	15-Mar-79	Clear Interrupt System on -20 to Remove IPCF
				Interrupt from SIGNON Dialog
110	OPR	6-Apr-79	Add TAKOPR routine to check if TAKE commands
				are allowed, also clear OPRs Data base on start
111	OPR	8-Apr-79	Check ENTER Command for Remote Operators
				Pitch Short NSP Messages (less than or equal to
				2)
				These were just cr,lf
112	OPR	19-Apr-79	Remove terminal type keys.  Parse directly into
				ORNMAC .TTxxx codes suitable for K%STYP.
				OPRCMD
113	OPR	15-May-79	Add MSGCNT to keep track if there were any 
				messages received
114	OPR	30-May-79	Add WAIT command to Application alternate Tables
115	OPR	4-Jun-79	Change SETFAL to add a null to the end of the
				message instead of ^A.
116	OPR	21-Jun-79	Remove the CMDBLK as External reference and use
				PRT.CF for the field.
117	OPR	6-Jul-79	Make the WAIT command invisible
120	OPR	11-Jul-79	Trap Error on EPCAP for the PUSH command incase
				ACJ won't allow it.
121	OPR	25-Jul-79	Fix the -20 DN200 OPR to check for MO%CON to
				insure that the link is still around
122	OPR	30-Aug-79	Add new KEYTAB entries for the -10
\
SUBTTL	SPECIAL ACCUMULATOR ASSIGNMENTS

MD==15			;MESSAGE FOR DISPLAY ADDRESS
M==16
FLAG==14			;FLAG AC FOR OPR

	;FLAG DEFINITIONS FOR OPR

O.ACKP==1B0			;ACK MESSAGE BEING PROCESSED
O.LAST==1B1			;LAST LINE OF MESSAGE
O.ERRP==1B2			;ERROR PROCESSING OF MESSAGE
O.DSPM==1B3			;DISPLAY MESSAGE SENT
SUBTTL	OPR IMPURE DATA
OPRDAT:
DEFTAB:	BLOCK	1			;ADDRESS OF TABLES BEING USED
HDRTAB:	BLOCK	1			;MAIN TABLE SETTING
HDRPMT:	BLOCK	10			;PROMPT FOR APPLICATION 

CMDDAT:	BLOCK	1			;COMND DATA COLLECTED IN PARSE
ENTCOD:	BLOCK	1			;CODE OF THE TABLE TYPE
TABCOD:	BLOCK	1			;CODE FOR APPLICATION TYPE
MYNODE:	BLOCK	1			;NODE OF THIS OPR

;STORAGE FOR PARSER TO EVENT PROCESSOR COMMUNICATION

PARBLK:	BLOCK	PAR.SZ			;SPACE FOR PARSER CALL ARGUMENTS
	;STORAGE FOR DISPLAY PROCESSING

DSPPTR:	BLOCK	1			;DESTINATION DISPLAY POINTER
SRCPTR:	BLOCK	1			;SOURCE POINTER
DSPFLG: BLOCK	1			;DISPLAY BLOCK FLAGS
TEMOUT:	BLOCK	^D20			;LEAVE ROOM FOR A LINE
REMOPR:	BLOCK	1			;REMOTE OPERATOR IN USE FLAG
REMACC:	BLOCK	1			;REMOTE ACCESS (NSP ON -20)
TEMPTR:	BLOCK	1			;TEMPORARY POINTER FOR TEXT
HOSTNM:	BLOCK	1			;HOST NAME FOR OPR
ERRCOD:	BLOCK	1			;ERROR CODE FOR OPR ERRORS
INTDSP:	BLOCK	1			;INTERRUPT DISPLAY FLAG
MSGCNT:	BLOCK	1			;COUNT OF IPCF MESSAGES ON WAKEUP
TAKFLG:	BLOCK	1			;TAKE COMMAND FLAG
ARG1:	BLOCK	1			;ARGUMENT FOR ERROR PROCESSING

TOPS20 <
DCNDAT:	BLOCK	5			;BLOCK FOR TASK CONNECT NAME
INPJFN:	BLOCK	1			;LINK INPUT JFN
OUTJFN:	BLOCK	1			;LINK OUTPUT JFN
BUFADR:	BLOCK	1			;BUFFER ADDRESS FOR OUTPUT
OUTPTR:	BLOCK	1			;POINTER FOR OUTPUT TO LINK
OUTCNT:	BLOCK	1			;COUNT FOR OUTPUT TO LINK
INPDON:	BLOCK	1			;INPUT DONE ON LINK
OUTCON:	BLOCK	1			;OUTPUT CONNECT LINK
OUTACT:	BLOCK	1			;OUTPUT LINK ACTIVE
NETBUF:	BLOCK	1			;ADDRESS OF NETWORK BUFFER
FRKRUN:	BLOCK	1			;FORK RUNNING (-1 IF RUNNING)
FRKJFN:	BLOCK	1			;JFN FOR EXEC
FRKHND:	BLOCK	1			;HANDLE FOR FORK
TRPCHN:	BLOCK	1			;TRAP CHANNELS FOR CONTL-C
SAVTWD:	BLOCK	2			;SAVE TERMINAL WORD
SAVMOD:	BLOCK	1			;SAVE MODE WORD
> ;END TOPS20

DATASZ==.-OPRDAT
PDLEN==^D400			;PUSH-DOWN STACK LENGTH
PDL:	BLOCK PDLEN			;PUSH DOWN POINTER
SUBTTL	CONSTANT AND STORAGE DEFINITIONS



;STORAGE FOR SOFTWARE INTERRUPT SYSTEM
TIMCHN==2		;CHANNEL FOR TIMER INTERRUPTS
TOPS20 <
IPCLEV==1		;LEVEL TO USE FOR IPCF INTERRUPTS (MUST BE 1)

LEVTAB:	EXP	LEV1PC
	EXP	LEV1PC
	EXP	LEV1PC

LEV1PC:	BLOCK	1


CHNTAB:	$BUILD	^D36
	$SET(1,,<IPCLEV,,INT>)
	$SET(.ICIFT,,<IPCLEV,,TERMFK>)
	$EOB
> ;END TOPS20

TOPS10 <
INTVEC:
IPCINT:	$BUILD	.PSVIS+1
	$SET(.PSVNP,,INT)
	$EOB
> ;END TOPS10

IPBBLK:	$BUILD	IB.SZ
	$SET(IB.PRG,,%%.MOD)		;PROGRAM NAME
	$SET(IB.OUT,,T%TTY)		;TERMINAL AS DEFAULT TEXT OUTPUT
	$SET(IB.FLG,IT.OCT,1)		;OPEN COMMAND TERMINAL
	$SET(IB.FLG,IP.STP,1)		;STOPCODES TO ORION
TOPS20 <
	$SET(IB.INT,,<LEVTAB,,CHNTAB>)
> ;END TOPS20
TOPS10 <
	$SET(IB.INT,,INTVEC)
> ;END TOPS10
	$SET(IB.PIB,,PIBBLK)		;ADDRESS OF PID BLOCK
	$EOB

PIBBLK:	$BUILD	PB.MNS			;SIZE OF PID BLOCK
	$SET(PB.HDR,PB.LEN,PB.MNS)	;BLOCK LENGTH
	$SET(PB.FLG,IP.PSI,1)		;CONNECT PID TO PSI
TOPS20 <
	$SET(PB.INT,IP.CHN,1)		;CHANNEL FOR IPCF
> ;END TOPS20
TOPS10 <
	$SET(PB.INT,IP.CHN,<IPCINT-INTVEC>) ;OFFSET FOR IPCF BLOCK
> ;END TOPS10
	$EOB


	;IB FOR REMOTE OPR INITIALIZATION

TOPS20 <
IPBRMT:	$BUILD	IB.SZ
	$SET(IB.PRG,,%%.MOD)		;PROGRAM NAME
	$SET(IB.OUT,,OUTRTN)		;DEFAULT $TEXT OUTPUT ROUTINE
	$SET(IB.FLG,IP.STP,1)		;STOPCODES TO ORION
	$SET(IB.INT,,<LEVTAB,,CHNTAB>)	;INTERRUPT SYSTEM ADDRESS
	$SET(IB.PIB,,PIBBLK)		;ADDRESS OF PID BLOCK
	$EOB
> ;END TOPS20
SUBTTL	TABLE BUILDING DATA BASE

TABNUM:	EXP	NUMAPL+1		;NUMBER OF TABLES INCLUDED

	DEFINE	X(A,B,C),<EXP	C	;SET UP ADDRESS OF EACH ENTRY
	EXTERNAL C	;SET UP AS EXTERNAL
	.REQUIRE C>

SYNTAB:	EXP	OPRCMD##		;MAIN OPR TABLES
	TABAPL				;ADDRESS OF APPLICATION TABLES

TABINI:	$INIT(MANTAB)			;INIT FUNCTION FOR TABLES

MANTAB:	$KEYDSP(APLALT,<$ACTION(CMDACT)>) ;KEYWORD TABLE BLOCK

APLALT:	$STAB
	ORNDSP(ENTFDB,ENTER,ENT)	;ENTER COMMAND FDB
	ORNDSP(EXTFDB,EXIT,EXT)		;EXIT COMMAND
TOPS20<	ORNDSP(PUSFDB##,<PUSH>,PUS)>	;PUSH COMMAND
	ORNDSP(RETFDB,RETURN,RTN)	;RETURN FDB
	ORNDSP(TAKOPR,TAKE,TAK)		;TAKE FDB
	ORNDSP(WAIFDB##,WAIT,WAI,CM%INV);WAIT COMMAND
	$ETAB

OPRPMT: [ASCIZ /OPR>/]			;DEFAULT STARTING PROMPT

APLTAB:	$KEYDSP(KEYAP1,<$ACTION(APLACT)>) ;MAIN APPL. TABLE

	DEFINE	X(A,B,C),<ORNDSP(,<A>,<B>)>

KEYAP1:	$STAB				;START TABLE OF NAMES
	TABAPL			;EXPAND APPLICATION ENTRIES
	$ETAB
SUBTTL	Main Entry  --  Initialization

OPR:	RESET				;RESET THE UNIVERSE
	MOVE	P,[IOWD PDLEN,PDL]	;SET UP STACK
	MOVX	S1,IB.SZ		;GET THE LENGTH
	MOVEI	S2,IPBBLK		;AND THE ADDRESS OF THE ARGS
	PUSHJ	P,I%INIT		;INITIALIZE THE WORLD
	MOVEI	S1,DATASZ		;GET THE SIZE OF THE DATA
	MOVEI	S2,OPRDAT		;START OF THE IMPURE DATA
	PUSHJ	P,.ZCHNK		;CLEAR THE DATA AREA
	PUSHJ	P,GETLOC		;GET OPRS LOCATION
	SETOM	HDRTAB			;INIT TO USE MAIN TABLES AND PROMPT
	MOVE	S1,[IPCLEV,,TIMCHN]	;GET LEVEL NUMBER AND TIMER CHANNEL
	MOVE	S2,IPBBLK+IB.INT	;GET INTERRUPT DATA BASE INFO
	PUSHJ	P,P$INIT##		;INIT THE PARSER
	PUSHJ	P,I%HOST		;GET HOST NAME
	MOVEM	S1,HOSTNM		;SAVE HOST NAME
	PUSHJ	P,TABCHK		;CHECK THE TABLES
	PUSHJ	P,OPRSON		;OPR SIGNON TO ORION
	SETOM	INTDSP			;INIT INTERRUPT DISPLAY FLAG
TOPS20 <
	HRRZI	S1,.MSIIC		;BYPASS MOUNT COUNTS
	MSTR				;DO THE FUNCTION
	ERJMP	.+1			;IGNORE THE ERROR
	MOVEI	S1,.FHSLF		;GET MY HANDLE
	MOVX	S2,1B<.ICIFT>		;INFERIOR TERMINATIONS
	AIC				;ACTIVATE THE CHANNEL
;	CIS				;CLEAR INTERRUPT SYSTEM
> ;END TOPS20
	PUSHJ	P,I%ION			;TURN ON INTERRUPTS
	JRST	MAIN			;GO TO MAIN LOOP
SUBTTL	MAIN	MAIN LOOP IN OPR
MAIN:	PUSHJ	P,PRCMSG		;PROCESS ANY MESSAGES
TOPS20 <
	SKIPE	FRKRUN			;FORK RUNNING WITH EXEC
	JRST	MAIN.7			;YES GO TO SLEEP
	SKIPN	REMACC			;REMOTE OPR?
	JRST	MAIN.1			;NO..IGNORE REMOTE CHECKS
	SKIPE	OUTCON			;OUTPUT CONNECTED?
	PUSHJ	P,CONNEC		;CHECK OUT CONNECT
	SKIPN	INPDON			;INPUT DONE...READ THE DATA
	JRST	MAIN.7			;GO TO SLEEP
	PUSHJ	P,INPDAT		;INPUT THE DATA
	JUMPF	MAIN.7			;FAIL..GO TO SLEEP
> ;END TOPS20
MAIN.1:	PUSHJ	P,TABSET		;SETUP THE PARSER BLOCK
MAIN.2:	DMOVE	S1,P1			;GET THE PARSER ARGUMENTS
	PUSHJ	P,PARSER##		;CALL THE PARSER
	MOVE	P3,S2			;SAVE THE ADDRESS OF BLOCK
	JUMPF	MAIN.5			;COMMAND ERROR ON PARSER
	PUSHJ	P,DSPCMD		;DISPLAY COMMAND IF NEEDED
	MOVE	T1,PRT.CM(P3)		;ADDRESS OF COMMAND MESSAGE
	MOVE	T2,MYNODE		;GET MYNODE FOR MESSAGE
	MOVEM	T2,COM.SN(T1)		;SAVE IN THE MESSAGE
	SKIPE	T2,TABCOD		;WAS THERE A TABLE CODE
	MOVEM	T2,COM.TY(T1)		;SAVE AS TYPE FOR APPLICATION
MAIN.3:	MOVE	S1,T1			;MESSAGE TO SEND
MAIN.S:	PUSHJ	P,I%SOPR		;SEND TO ORION
	JUMPT	MAIN			;O.K. JUST  RESTART
	$TEXT	(,<SEND TO ORION FAILED>)
	PUSHJ	P,I%EXIT		;HALT THE PROGRAM
MAIN.4:	MOVE	S1,T1			;PUT PAGE ADDRESS IN S1
	PUSHJ	P,M%RPAG		;RETURN THE PAGE
	JRST	MAIN			;CHECK MESSAGES AND COMND
MAIN.5:	MOVE	T1,PRT.FL(P3)		;GET RETURNED FLAGS
	TXNE	T1,P.INTE		;INTERRUPT BREAK OUT
	   JRST	[AOS	INTDSP		;SET FLAG FOR DISPLAY
		JRST	MAIN]		;AND CHECK FOR MESSAGES
	TXNE	T1,P.ENDT		;END OF TAKE FILE
	   JRST	[PUSHJ	P,TAKEND	;END THE TAKE COMMAND
		 JRST	MAIN.S]		;SEND THE MESSAGE AND CONTINUE
	PUSHJ	P,CHKDSP		;CHECK TO DISPLAY
	JUMPF	MAIN.6			;NO..DON'T
	PUSHJ	P,SETOUT		;SETUP FOR OUTPUT
	$TEXT	(,<^I/CMDPMT/^T/@PRT.MS(P3)/^A>)
	SKIPA				;ALREADY SETUP
MAIN.6:	PUSHJ	P,SETOUT		;SETUP THE OUTPUT
	MOVX	S1,CM%ESC		;GET THE ESCAPE FLAG
	SKIPN	REMACC			;REMOTE OPR?? ALWAYS CR,LF
	TDNE	S1,PRT.CF(P3)		;WAS LAST CHARACTER AN ESCAPE?
	$TEXT	(,<>)			;CR,LF OUTPUT
	$TEXT	(,<? ^T/@PRT.EM(P3)/>) ;OUTPUT THE ERROR MESSAGE..NOT TAKE
	PUSHJ	P,SNDOUT		;SEND THE OUTPUT
	JRST	MAIN			;TRY AGAIN
MAIN.7:	SETZ	S1,			;CLEAR S1 FOR SLEEP
	PUSHJ	P,I%SLP			;GO TO SLEEP
	SETOM	INTDSP			;SET DISPLAY FLAG FORCE .CMINI
	JRST	MAIN			;GET DATA




CMDPMT:	ITEXT	(<^M^J^T/@PARBLK+PAR.PM/>)
SUBTTL	TAKEND	END OF TAKE COMMAND

	;THIS ROUTINE WILL TELL ORION THAT THE TAKE FILE IS FINISHED SO
	;THAT INCASE THERE IS A SEND ERROR TO COMPONENT THE FILE CAN
	;BE ABORTED


	;RETURN	S1/ MESSAGE ADDRESS FOR ORION


TAKEND:	SETZM	TAKFLG			;CLEAR TAKE FLAG
	PUSHJ	P,M%GPAG		;GET A PAGE OF MEMORY
	MOVX	S2,.OMTKE		;GET TAKE END CODE
	STORE	S2,.MSTYP(S1),MS.TYP	;SAVE THE TYPE
	MOVEI	S2,.OHDRS		;MINIMUM SIZE BLOCK
	STORE	S2,.MSTYP(S1),MS.CNT	;SAVE THE LENGTH
	$RETT				;RETURN
SUBTTL	DSPCMD	DISPLAY TAKE FILE COMMANDS IF DESIRED

	;THIS ROUTINE WILL CHECK THE DISPLAY SETTINGS FROM THE TAKE AND
	;FROM THE TAKE DEFAULT DISPLAY AND DISPLAY COMMANDS IF SET
DSPCMD:	PUSHJ	P,CHKDSP		;CHECK IF NEED TO DISPLAY
	JUMPF	.RETT			;RETURN O.K.
	MOVE	T1,PRT.CM(P3)		;ADDRESS OF MESSAGE
	PUSHJ	P,SETOUT		;SETUP FOR OUTPUT
	MOVE	T2,COM.CM(T1)		;GET TEXT OFFSET
	ADDI	T2,1(T1)		;POINT TO START OF STRING
	$TEXT	(,<^I/CMDPMT/^T/(T2)/^A>) ;OUTPUT THE COMMAND
	PUSHJ	P,SNDOUT		;SEND THE OUTPUT
	POPJ	P,			;RETURN


CHKDSP:	MOVE	T1,PRT.FL(P3)		;GET FLAG WORD
	TXNE	T1,P.TAKE		;TAKE COMMAND ITSELF
	JRST	CHKD.1			;YES..SET FLAG AND RETURN FALSE
	TXC	T1,P.CTAK!P.ERRO	;FROM TAKE AND AN ERROR
	TXCN	T1,P.CTAK!P.ERRO	;BOTH WERE SET
	$RETT				;YES..DISPLAY THE TEXT
	TXNN	T1,P.DSPT		;DISPLAY TAKE COMMAND
	$RETF				;RETURN FALSE
	$RETT				;O.K. RETURN TRUE
CHKD.1:	SETOM	TAKFLG			;IN TAKE COMMAND
	$RETF				;RETURN FALSE
SUBTTL	PRCMSG	PROCESS IPCF MESSAGE ROUTINE

PRCMSG:	SETZM	MSGCNT			;CLEAR THE COUNT
PRCM.0:	PUSHJ	P,C%RECV		;GO RECEIVE A MESSAGE
	JUMPF	.POPJ			;NO MORE MESSAGES, RETURN
	PUSHJ	P,VALMSG		;VALIDATE THE MESSAGE
	JUMPF	PRCM.1			;NO GOOD..PITCH THE MESSAGE
	LOAD	M,MDB.MS(S1),MD.ADR	;GET MESSAGE ADR.
	PUSHJ	P,DSPRTN		;FIND PROCESSING ROUTINE
					;RETURN S1 WITH ADDRESS
	SKIPF				;FALSE RETURN..IGNORE PROCESSING
	PUSHJ	P,(S1)			;OTHERWISE, CALL THE ROUTINE
PRCM.1:	PUSHJ	P,C%REL			;FOR NOW IF WE FAIL TO FIND
	AOS	MSGCNT			;BUMP THE MESSAGE COUNT
	JRST	PRCM.0			;LOOP BACK FOR MORE MESSAGES

DSPTAB:	.OMDSP,,DSPOPD
	.OMWTR,,WTRDSP
	.OMACS,,SHWDSP
	MT.TXT,,ACKOPR
	DSPLEN==.-DSPTAB



DSPRTN:	LOAD	S2,.MSTYP(M),MS.TYP	;GET MESSAGE TYPE
	MOVSI	T1,-DSPLEN		;LENGTH OF DISPATCH TABLE
DSPR.1:	HLRZ	S1,DSPTAB(T1)		;GET TYPE FROM TABLE
	CAIN	S2,(S1)			;MATCH??
	JRST	DSPR.2			;YES..SETUP S1 AND EXIT
	AOBJN	T1,DSPR.1		;TRY NEXT ONE
	$RETF				;FALSE RETURN
DSPR.2:	HRRZ	S1,DSPTAB(T1)		;GET PROCESSING ADDRESS
	$RETT				;RETURN TRUE


SUBTTL	VALMSG	VALIDATE THE MESSAGE FROM ORION

	;THIS ROUTINE WILL MAKE SURE THE MESSAGE RECEIVED IS FROM ORION.
	;IF NOT, THE ROUTINE WILL RETURN FALSE

VALMSG:	LOAD	T1,MDB.SI(S1)		;SYSTEM PID INDEX WORD
	TXZN	T1,SI.FLG		;FROM A SYSTEM PID
	$RETF				;NO..RETURN FALSE
	CAIE	T1,SP.OPR		;FROM ORION
	$RETF				;NO..RETURN FALSE
	$RETT				;YES..O.K. SO FAR
SUBTTL	ACKOPR	OUTPUT GALAXY TEXT MESSAGE
ACKOPR:	LOAD	S1,.MSFLG(M)		;GET THE FLAGS
	TXNE	S1,MF.NOM		;IS THIS A NULL ACK?
	POPJ	P,			;YES, JUST RETURN NOW
	SKIPG	T1,.OARGC(M)		;VALID ARGUMENT COUNT
	$RETF				;NO JUST RETURN
	LOAD	T1,ARG.HD+.OHDRS(M),AR.TYP	;GET ARGUMENT TYPE
	CAIE	T1,.CMTXT		;IS IT TEXT
	$RETF				;NO...RETURN
	LOAD	T1,ARG.HD+.OHDRS(M),AR.LEN	;GET THE LENGTH CODE
	ADDI	T1,.OHDRS		;LENGTH OF MESSAGE
	LOAD	T2,.MSTYP(M),MS.CNT	;GET MESSAGE LENGTH
	CAMLE	T1,T2			;MESSAGE IN BOUNDS
	$RETF				;NO..IGNORE MESSAGE
	MOVEI	T1,ARG.DA+.OHDRS(M)	;ADDRESS OF DATA
	PUSHJ	P,SETOUT		;SETUP FOR OUTPUT
	$TEXT	(,<
^C/[-1]/	--^T/(T1)/-->)		;OUTPUT TEXT
	HRRZ	S1,.MSFLG(M)		;GET ERROR CODE
	CAIE	S1,'ONS'		;OPR NOT SETUP
	PJRST	SNDOUT			;SEND OUTPUT AND RETURN
TOPS20 <
	SKIPE	REMOPR			;REMOTE OPERATOR?
	PUSHJ	P,I%EXIT		;TERMINATE
> ;END TOPS20
	$TEXT	(,<	..OPR Restarting..>)	;INFORM THE OPERATOR
	JRST	OPR			;RESTART THE WORLD
SUBTTL	DSPOPD	PROCESS DISPLAY MESSAGE FROM ORION

WTRDSP:	SETOM	T3			;SET WTOR FLAG
	SKIPA				;SKIP OVER DISPLAY ENTRY
DSPOPD:	SETZM	T3			;NO WTOR FLAG
	SKIPN	T1,.OARGC(M)		;GET ARGUMENT COUNT
	$STOP(IAC,Argument Count ^O/T1/ Not Valid in Display Message)
	MOVEI	T2,.OHDRS+ARG.HD(M)	;ADDRESS OF FIRST ARGUMENT
	PUSHJ	P,SETOUT		;SETUP FOR OUTPUT
DSPO.1:	LOAD	S1,ARG.HD(T2),AR.TYP	;GET THE TYPE FIELD
	CAIE	S1,.ORDSP		;IS IT DISPLAY
	JRST	DSPO.3			;NO CHECK FOR TEXT
	$TEXT	(,<^M^J^C/ARG.DA(T2)/ ^A>)
	MOVEI	S1,ARG.DA+1(T2)		;ADDRESS OF THE TEXT
DSPO.2:	PUSHJ	P,DSPMSG		;OUTPUT THE TEXT
	LOAD	S2,ARG.HD(T2),AR.LEN	;GET LENGTH OF BLOCK
	ADD	T2,S2			;BUMP TO NEXT BLOCK
	SOJG	T1,DSPO.1		;GET NEXT BLOCK
	SKIPE	T3			;WAS IT A WTOR?
	$TEXT(,<^A>)		;RING THE BELLS
	PJRST	SNDOUT			;SEND THE OUTPUT AND RETURN
DSPO.3:	CAIE	S1,.CMTXT		;WAS IT JUST TEXT
	$STOP(IDM,Message Argument Type ^O/S1/ not Valid for Display Messages)
	MOVEI	S1,ARG.DA(T2)		;ADDRESS OF TEXT
	JRST	DSPO.2			;OUTPUT THE TEXT
DSPMSG:	
TOPS20 <
	SKIPE	REMACC			;REMOTE OPR
	PJRST	DSPM.1			;OUTPUT THE DATA
> ;END TOPS20
	PJRST	K%SOUT			;NO..SOUT IT

TOPS20 <
DSPM.1:	$TEXT	(,<^T/(S1)/^A>)		;DUMP THE DATA
	$RETT				;RETURN
> ;END TOPS20
SUBTTL	SHWDSP	PROCESS DISPLAY MESSAGE FROM ORION

SHWDSP:	SKIPN	T1,.OARGC(M)		;GET ARGUMENT COUNT
	JRST	S..IAC			;INVALID COUNT
	MOVEI	T2,.OHDRS+ARG.HD(M)	;ADDRESS OF FIRST ARGUMENT
SHWD.1:	LOAD	S1,ARG.HD(T2),AR.TYP	;GET THE TYPE FIELD
	CAIE	S1,.ORDSP		;IS IT DISPLAY
	JRST	SHWD.3			;NO CHECK FOR TEXT
	PUSHJ	P,SETOUT		;SETUP FOR OUTPUT
	$TEXT	(,<^M^J^C/ARG.DA(T2)/		--^T/ARG.DA+1(T2)/-->)
	SKIPA				;GET NEXT ARGUMENT
SHWD.2:	PUSHJ	P,DSPMSG		;OUTPUT THE TEXT
	LOAD	S2,ARG.HD(T2),AR.LEN	;GET LENGTH OF BLOCK
	ADD	T2,S2			;BUMP TO NEXT BLOCK
	SOJG	T1,SHWD.1		;GET NEXT BLOCK
	PJRST	SNDOUT			;SEND THE OUTPUT
SHWD.3:	CAIE	S1,.CMTXT		;WAS IT JUST TEXT
	JRST	S..IDM			;INVALID DISPLAY MESSAGE TYPE
	MOVEI	S1,ARG.DA(T2)		;ADDRESS OF TEXT
	JRST	SHWD.2			;OUTPUT THE TEXT
SUBTTL	TABSET	SETUP TABLES FOR PARSER CALL

	;THIS ROUTINE WILL SET UP THE DEFAULT TABLES AND THE DEFAULT
	;PROMPT
	;AND RETURN ARGUMENTS IN P1 AND P2

TABSET:
TOPS20 <
	SKIPE	REMOPR			;REMOTE OPERATOR
	PJRST	TABS.3			;YES..SETUP FOR REMOTE OPERATOR
> ;END TOPS20
	SKIPE	HDRTAB			;USING THE HEAD TABLES(OPR TABLES)
	JRST	TABS.1			;YES..SET UP PARSER ARGUMENTS
	MOVE	S1,ENTCOD		;APPLICATION TYPE
	MOVEM	S1,TABCOD		;SAVE THE VALUE FOR MESSAGES
	MOVE	S1,DEFTAB		;GET THE DEFAULT TABLES FOR CALL
	AOS	S1			;POSITION OVER THE HEADER
	STORE	S1,.CMFNP+MANTAB+1,CM%LST	;SAVE AS ALTERNATE TO MAIN TABLE
	MOVEI	S1,TABINI		;ADDRESS OF MAIN TABLE INIT
	MOVEM	S1,PARBLK+PAR.TB	;SAVE IN PARSER CALL BLOCK
	MOVEI	S1,HDRPMT		;GET DEFAULT PROMPT
TABS.0:	MOVEM	S1,PARBLK+PAR.PM	;SAVE THE PROMPT IN BLOCK
	MOVEI	P1,PAR.PM+1		;SIZE OF THE BLOCK
	MOVEI	P2,PARBLK		;PARSER BLOCK
	SKIPN	TAKFLG			;IN A TAKE FILE
	SKIPG	INTDSP			;ANY MESSAGES DISPLAYED
	$RETT				;RETURN
	SKIPG	MSGCNT			;ANY MESSGES PROCESSED
	$RETT				;NO.. FORCE OUT THE PROMPT
	MOVE	S1,PARBLK+PAR.TB	;GET TABLE ADDRESS
	PUSHJ	P,P$PNXT##		;GET THE NEXT PDB
	MOVEM	S1,PARBLK+PAR.TB	;SAVE TABLE ADDRESS
	SETZM	INTDSP			;CLEAR THE FLAG
	$RETT				;RETURN
TABS.1:	SETZM	TABCOD			;CLEAR FIELD FOR MAIN TABLES
	MOVE	S1,SYNTAB		;ADDRESS OF MAIN TABLES
	MOVE	T1,TAB.IN(S1)		;ADDRESS OF .CMINI FOR TABLES
	STORE	T1,PARBLK+PAR.TB	;SAVE THE TABLE ADDRESS
	HLRZ	T2,KEYAP1		;APPLICATION KEYWORD TABLE
	SKIPN	T2			;ANY ENTRIES IN TABLE
	JRST	TABS.2			;NO..DON'T SET UP ALTERNATE
	MOVE	T3,TAB.KY(S1)		;GET MAIN KEYWORD TABLE
	MOVEI	T2,APLTAB		;ADDRESS OF THE TABLE PDB
	AOS	T2			;POSITION TO THE DATA
	STORE	T2,.CMFNP+1(T3),CM%LST	;SAVE AS ALTERNATE TABLE
TABS.2:	MOVE	S1,OPRPMT		;ADDRESS OF THE PROMPT
	JRST	TABS.0			;FINISH AND RETURN
TOPS20 <
TABS.3:	MOVE	S1,SYNTAB		;ADDRESS OF MAIN TABLES
	MOVE	T1,TAB.IN(S1)		;ADDRESS OF .CMINI FOR TABLES
	STORE	T1,PARBLK+PAR.TB	;SAVE THE TABLE ADDRESS
	MOVE	S1,OPRPMT		;GET THE OPR PROMPT
	MOVEM	S1,PARBLK+PAR.PM	;SAVE THE PROMPT
	MOVSI	S1,(POINT NETBSZ,)		;NETBSZ BIT BYTES
	HRR	S1,NETBUF		;GET DATA ADDRESS
	MOVEM	S1,PARBLK+PAR.SR	;SAVE SOURCE POINTER
	MOVEI	P1,PAR.SZ		;SIZE OF THE BLOCK
	SKIPN	REMACC			;REMOTE ACCESS LINK?
	MOVEI	P1,PAR.PM+1		;NO..USE MINIMUM SIZE BLOCK
	MOVEI	P2,PARBLK		;ADDRESS OF PARSER BLOCK
	$RETT				;RETURN
> ;END TOPS20
SUBTTL	Software Interrupt System Routines

;ROUTINE CALLED ON AN INTERRUPT

INT:	$BGINT	IPCLEV			;BEGIN AN INTERRUPT
	PUSHJ	P,P$INTR##		;PARSER INTERRUPT SUPPORT
	PUSHJ	P,C%INTR		; FLAG RECEIPT OF IPCF INTERRUPT
	$DEBRK				; EITHER RETURN TO SEQUENCE
					; OR CHANGE PC AND HANDLE THE INTERRUPT
SUBTTL	COMMAND AND APPLICATION ACTION ROUTINES

	;THESE ROUTINES WILL BE GIVEN CONTROL ON A KEYWORD
	;FROM THE MAIN COMMAND TABLES (CMDACT) AS WELL AS  FROM AN
	;APPLICATION KEYWORD TYPED WHILE USING THE MAIN TABLES.

CMDACT:: SETZM	TABCOD			;CLEAR THE CODE TYPE FOR THESE
					;ENTRIES
	MOVE	T1,CR.SAV(S2)		;GET THE ADDRESS OF SAVED ELEMENT
	MOVE	T1,ARG.DA(T1)		;GET THE VALUE
	MOVEM	T1,CMDCOD##		;SAVE THE COMMAND CODE
	$RETT				;RETURN TRUE



APLACT:	MOVE	T1,CR.SAV(S2)		;GET THE ADDRESS OF SAVED ELEMENT
	MOVE	T1,ARG.DA(T1)		;GET THE VALUE
	MOVEM	T1,TABCOD		;SAVE THE CODE
	MOVE	T2,ARGFRE##		;GET LAST ARGUMENT POINTER ADDRESS
	SUBI	T2,2			;BACK OVER APPLICATION NAME..REMOVE
	MOVEM	T2,ARGFRE##		;RESTORE POINTER 
	$RETT				;RETURN
SUBTTL	ENTER AND RETURN COMMANDS

	INTERNAL	ENTFDB
ENTFDB:	$NOISE(ENT010,<Command Subset>,<$PREFILL(ENTCHK)>)

ENT010:	$KEYDSP(ENTTAB,<$ACTION(ENTRTN)>)

	DEFINE	X(A,B,C),<ORNDSP(ENT020,<A>,<B>)>
	;TABLE MUST BE IN DSPTAB FORMAT ****


ENTTAB:	$STAB
	TABAPL				;EXPAND APPLICATION TABLES
	$ETAB

ENT020:	$CRLF(<$ACTION(ENTER)>)


ENTCHK:	SKIPN	REMOPR			;IS IT A REMOTE OPERATOR
	$RETT				;NO..ASSUME O.K.
	MOVEI	S2,[ASCIZ/ENTER Command not allowed for Remote Operators/]
	$RETF				;RETURN FALSE
ENTRTN:	MOVE	T1,CR.RES(S2)		;GET THE RESULT
	MOVEM	T1,CMDDAT		;SAVE THE DATA
	$RETT				;RETURN TRUE

ENTER:	MOVE	T1,CMDDAT		;GET THE DATA WORD
	HLRZ	T2,(T1)			;GET POINTER TO THE STRING
	$TEXT	(<-1,,HDRPMT>,<^T/(T2)/^7/[76]/^0>)
	SETZM	HDRTAB			;IN APPLICATION MODE
	HRRZ	T2,(T1)			;GET ADDRESS OF CODE WORD
	HLRZ	T2,(T2)			;GET THE SYMBOL VALUE
	MOVEM	T2,ENTCOD		;SAVE THE CODE
	MOVE	T3,T2			;PLACE IN T3
	ANDI	T3,77			;GET THE TABLE INDEX FROM CODE
	MOVE	T3,SYNTAB(T3)		;ADDRESS OF THE TABLES
	MOVE	T4,TAB.KY(T3)		;GET MAIN KEYWORD TABLE
	MOVEM	T4,DEFTAB		;SAVE AS DEFAULT TABLES
	PJRST	P$NPRO##			;NO PROCESSING REQUIRED


RETFDB:	$NOISE(RET010,<to Operator Command Level>)

RET010:	$CRLF(<$ACTION(RETURN)>)

RETURN:	SKIPE	HDRTAB			;SHOULD BE IN APPLICATION TABLES
	$RETF				;ERROR..RETURN FALSE TO ABORT
	SETOM	HDRTAB			;SET FOR MAIN TABLES
	SETZM	TABCOD			;CLEAR CODE FOR APPLICATION
	PJRST	P$NPRO##		;NO PROCESSING REQUIRED
SUBTTL	EXIT COMMAND TABLES

EXTFDB:: $NOISE(EXT010,<to Monitor Level>)

EXT010:	$CRLF(<$ACTION(EXTACT)>)

EXTACT:	MOVX	S1,E.EXIT		;EXIT COMMAND ISSUED
	MOVEM	S1,ERRCOD		;SAVE THE CODE
	PUSHJ	P,SETFAL		;SEND THE SHUTDOWN MESSAGE AND HALT
	JRST	OPR			;RESTART THE JOB
SUBTTL	TAKOPR ROUTINE

	;THIS ROUTINE WILL CHECK TAKE AUTHORIZATION BEFORE
	;PROCEEDING WITH THE PARSE

TAKOPR:: $CRLF(<$PREFILL(TAKO.1),$ALTERNATE(TAKFDB##)>)

TAKO.1:	SKIPN	REMOPR			;REMOTE OPR?
	JRST	TAKO.2			;NO..MODIFY THE PDB
	MOVEI	S2,[ASCIZ/TAKE Command Not allowed for Remote Operators/]
	$RETF				;RETURN FALSE
TAKO.2:	MOVEI	S1,TAKFDB##		;GET THE TAKE ADDRESS
	AOS	S1			;BUMP OVER THE HEADER
	STORE	S1,CR.PDB(S2),RHMASK	;SAVE  NEW PDB TO USE
	$RETT				;RETURN
SUBTTL	WAIOPR ROUTINE

	;THIS ROUTINE WILL CHECK WAIT AUTHORIZATION BEFORE
	;PROCEEDING WITH THE PARSE

WAIOPR:: $CRLF(<$PREFILL(WAIO.1),$ALTERNATE(WAIFDB##)>)

WAIO.1:	SKIPN	REMOPR			;REMOTE OPR?
	JRST	WAIO.2			;NO..MODIFY THE PDB
	MOVEI	S2,[ASCIZ/WAIT Command Not allowed for Remote Operators/]
	$RETF				;RETURN FALSE
WAIO.2:	MOVEI	S1,WAIFDB##		;GET THE WAIT ADDRESS
	AOS	S1			;BUMP TO PDB
	STORE	S1,CR.PDB(S2),RHMASK	;SAVE  NEW PDB TO USE
	$RETT				;RETURN
SUBTTL	SETRTN AND SETTRM TERMINAL SET ROUTINES
	;THESE ROUTINES WILL SETUP THE TERMINAL DATA AND
	;ON THE CONFIRM  SETTRM WILL PROCESS THE DATA

SETRTN:: MOVE	T1,CR.SAV(S2)		;GET THE ADDRESS OF SAVED ELEMENT
	MOVE	T1,ARG.DA(T1)		;GET THE VALUE
	MOVEM	T1,CMDDAT		;SAVE THE COMMAND DATA
	$RETT				;RETURN TRUE

SETTRM:: MOVE	S1,CMDDAT		;GET THE DATA WORD
	CAIN	S1,.KYKPD		;WAS IT TO SET KEYPAD
	PJRST	SETKPD			;YES..SETUP KEYPAD MODE
	CAIN	S1,.KYNKP		;WAS IT NOKEYPAD
	PJRST	SETNKP			;YES..SETUP NOKEYPAD MODE
	$CALL	K%STYP			;SET THE TERMINAL TYPE
	JUMPF	SETT.3			;GIVE ERROR IF BAD TTY TYPE

SETRET:	PJRST	P$NPRO##		;NO PROCESSING REQUIRED
SETT.3:	MOVEI	S2,[ASCIZ/Terminal Type Setup Failed/]
	$RETF				;RETURN FALSE TO ABORT
SETT.4:	MOVEI	S2,[ASCIZ/Terminal Keypad Function Setup Failure/]
	$RETF				;RETURN FALSE TO ABORT

;HERE ON SET TERMINAL KEYPAD
SETKPD: MOVEI	S1,ESCTAB		;GET ADDRESS OF ESCAPE TABLE
	PUSHJ	P,K%SUET		;SET TABLE ADDRESS
	JUMPF	SETT.4			;COULD NOT DO..ERROR
	PJRST	SETRET			;SET RETURN

;HERE ON SET TERMINAL NOKEYPAD
SETNKP:: MOVEI	S1,0			;CLEAR TABLE ADDRESS
	PUSHJ	P,K%SUET		;DO IT
	JUMPF	SETT.4			;COULD NOT DO..ERROR
	PJRST	SETRET			;SET RETURN
SUBTTL	ESCAPE Sequence Table for Operator Terminals

TOPS10 <
ESCTAB:
REPEAT 33,<				;CODES 0 THRU 32
	XLIST
	EXP	0
	LIST
>  ;END REPEAT 33

	POINT 7,[BYTE (7) .CHESC,0]	;MAKE ESC, ESC = ESC

REPEAT 43,<				;CODES 34 THRU 76
	XLIST
	EXP	0
	LIST
>  ;END REPEAT 43

	EXP	ESCTAB			;? TAKES US TO NEXT TABLE (THIS ONE)
	EXP	0			;CODE 100
	EXP	0			;A
	EXP	0			;B
	POINT 7,[BYTE (7) .CHCNU,0]	;C IS CONTROL U
	POINT 7,[BYTE (7) "P","R","I","N","T","E","R",.CHESC]

REPEAT 10,<				;E THRU L
	XLIST
	EXP	0
	LIST
>  ;END REPEAT 10

	POINT 7,[ASCIZ /?/]		;M
	EXP	0			;N
	EXP	ESCTAB			;O

REPEAT 13,<				;P THRU Z
	XLIST
	EXP	0
	LIST
>  ;END REPEAT 13
REPEAT 6,<				;CODES 133 THRU 140
	XLIST
	EXP	0
	LIST
>  ;END REPEAT 6

REPEAT 15,<				;LCA THRU LCM
	XLIST
	EXP 	0
	LIST
>  ;END REPEAT 15

	EXP	0			;LCN
	EXP	0			;LCO
	POINT 7,[BYTE (7) .CHESC,0]	;LCP IS RECOGNIZE CHARACTER
	POINT 7,[ASCIZ /SHOW STATUS
/]					;LCQ
	POINT 7,[ASCIZ/SHOW QUEUES
/]					;
	POINT 7,[ASCIZ/SHOW PARAMETERS
/]					;
	POINT 7,[ASCIZ/SHOW MESSAGES
/]					;
	POINT 7,[ASCIZ/SHOW ROUTE-TABLE
/]					;LCU
	POINT 7,[BYTE (7) .CHCNW,0]	;LCV IS DELETE FIELD
	POINT 8,[BYTE (8) 233,310,233,312,.CHCNR,0] ;HOME ERASE EOS CONTL-R
	POINT 7,[ASCIZ/SHOW OPERATORS
/]					;LCX
	POINT 7,[ASCIZ/SHOW QUEUE MOUNT-REQUESTS
/];					;LCY
	EXP	0			;LCZ

REPEAT 5,<				;CODES 173 THRU 177
	XLIST
	EXP	0
	LIST
>  ;END REPEAT 5
> ;END TOPS10
TOPS20 <
ESCTAB:	BLOCK	1			;NULL ESCAPE TABLE
> ;END TOPS20
SUBTTL	SHWDAY	SHOW DAYTIME ACTION ROUTINE

SHWDAY:: PUSHJ	P,SETOUT		;SETUP THE OUTPUT
	$TEXT	(,<^H/[-1]/>)
	PUSHJ	P,SNDOUT		;SEND THE OUTPUT
	PJRST	P$NPRO##		;NO PROCESSING REQUIRED
SUBTTL	OPRRMT	REMOTE OPR ENTRY POINT

TOPS10 <
OPRRMT:	JRST	OPR			;ASSUME START 
> ;END TOPS10

TOPS20 <
OPRRMT:	RESET				;RESET THE UNIVERSE
	MOVEM	T1,INPJFN		;INPUT JFN FOR LINK
	MOVEM	T2,MYNODE		;MY NODE
	MOVE	P,[IOWD PDLEN,PDL]	;SET UP STACK
	MOVX	S1,IB.SZ		;GET THE LENGTH
	MOVEI	S2,IPBRMT		;AND THE ADDRESS OF THE ARGS
	PUSHJ	P,I%INIT		;INITIALIZE THE WORLD
	SETOM	HDRTAB			;INIT TO USE MAIN TABLES AND PROMPT
	SETZB	S1,S2			;CLEAR S1 AND S2.. NO ARGUMENTS
	PUSHJ	P,P$INIT##		;CALL THE PARSER
	PUSHJ	P,I%HOST		;GET HOST NAME
	MOVEM	S1,HOSTNM		;SAVE HOST NAME
	PUSHJ	P,TABCHK		;CHECK THE TABLES
	SETOM	REMOPR			;REMOTE OPERATOR FLAG
	PUSHJ	P,OPRSON		;OPR SIGNON TO ORION
	MOVE	S1,[IPCLEV,,IPCRMT]	;REMOTE IPCF INTERRUPT ROUTINE
	MOVEM	S1,CHNTAB+1		;SAVE IN CHANNEL TABLE
	PUSHJ	P,I%ION			;TURN ON INTERRUPTS
	PUSHJ	P,REMSET		;SETUP OPR LINKS
	PUSHJ	P,WAITCN		;WAIT FOR THE CONNECT
	PJRST	MAIN			;PROCESS NORMALLY
					;DELETE ENTRY IN TABLES ***
> ;END TOPS20
SUBTTL	WAITCN	WAIT FOR OUTPUT LINK CONNECT

	;THIS ROUTINE WILL WAIT FOR THE CONNECT ON THE OUTPUT LINK 
	;BEFORE INITIALIZING THE PROCESS

TOPS20 <

WAITCN:	SKIPE	OUTCON			;OUTPUT CONNECTED
	JRST	WAIT.1			;PROCESS CONNECT AND RETURN
	MOVEI	S1,5			;WAIT FOR 5 SECONDS
	PUSHJ	 P,I%SLP		;SLEEP FOR A BIT
	JRST	WAITCN			;WAIT FOR THE CONNECTION
WAIT.1:	PJRST 	CONNEC			;DO CONNECT AND RETURN

> ;END TOPS20
SUBTTL	REMSET	SETUP OPR LINKS

	;THIS ROUTINE WILL SETUP ALL LINKS AND INTERRUPTS FOR THE REMOTE
	;OPERATOR

TOPS20 <
REMSET:	SETOM	REMACC			;SET AS REMOTE ACCESS
	$TEXT	(<-1,,DCNDAT>,<DCN:^N/MYNODE/-^D/[DCNTSK]/^0>)
	MOVX	S1,GJ%SHT		;SHOT JFN
	HRROI	S2,DCNDAT		;GET DATA
	GTJFN				;OPEN THE FILE
	  PJRST	REMS.1			;OPEN FAILED
	MOVEM	S1,OUTJFN		;SAVE OUTPUT JFN
	MOVE	S2,[FLD(NETBSZ,OF%BSZ)+OF%RD+OF%WR]
	OPENF				;OPEN THE LINK
	  PJRST	REMS.1			;OPEN FAILED
	MOVE	S1,OUTJFN		;GET THE JFN
	MOVEI	S2,.MOACN		;ACTIVATE CHANNEL
	MOVX	T2,OUTCHN		;OUTPUT CHANNEL
	SETZM	T1			;CLEAR T1
	STORE	T2,T1,MO%CDN		;CONNECT INTERRUPTS
	MTOPR				;DO THE FUNCTION
	ERJMP	REMS.2			;HALT IF FAILS
	MOVE	S1,[IPCLEV,,OUTINT]	;INTERRUPT ENTRY IN CHNTAB
	MOVEM	S1,CHNTAB+OUTCHN	;SAVE IN CHANNEL TABLE
	;edit 73
;	MOVE	S1,INPJFN		;GET THE INPUT CHANNEL JFN
;	MOVEI	S2,.MOACN		;ACTIVATE CHANNEL
;	MOVX	T2,INPCHN		;OUTPUT CHANNEL NUMBER
;	SETZM	T1			;CLEAR T1
;	STORE	T2,T1,MO%DAV		;SAVE FOR DATA INTERRUPTS
;	MTOPR				;ACTIVATE THE CHANNEL
;	ERJMP	[HALTF]			;FAIL ..ABORT
	MOVE	S1,[IPCLEV,,INPINT]	;INPUT DATA INTERRUPT
	MOVEM	S1,CHNTAB+INPCHN	;SAVE IN CHANNEL TABLE
	MOVE	S1,INPJFN		;GET THE INPUT JFN
	MOVX	S2,.MOCC		;ACCEPT THE CONNECT
	SETZM	T1			;CLEAR OTHER FLAGS
	MTOPR				;CONFIRM THE CONNECT
	ERJMP	REMS.3			;ERROR..ABORT
	MOVX	S1,.FHSLF		;GET MY HANDLE
	MOVX	S2,<1B<OUTCHN>!1B<INPCHN>>;ACTIVATE THE CHANNELS
	AIC				;TURN ON CHANNELS
	MOVEI	S1,<<OUTSIZ/<^D36/NETBSZ>>+1>;NUMBER OF WORDS NEEDED
	MOVE	T1,S1			;SAVE THE VALUE
	PUSHJ	P,M%GMEM		;GET THE MEMORY
	MOVEM	S2,BUFADR		;SAVE THE BUFFER ADDRESS
	MOVE	S1,T1			;GET SIZE OF BUFFER
	PUSHJ	P,M%GMEM		;GET INPUT BUFFER
	MOVEM	S2,NETBUF		;NETWORK BUFFER
	;***WAIT FOR CONNECT ON OUTPUT LINK
	POPJ	P,			;RETURN
REMS.1:	MOVX	S1,E.OPNF		;OPEN FAILURE
	MOVEM	S1,ERRCOD		;SAVE THE CODE
	PJRST	SETFAL			;SETUP FAILURE RETURN WITH ERROR
REMS.2:	MOVX	S1,E.CONF		;CONNECT FAILURE
	MOVEM	S1,ERRCOD		;SAVE THE CODE
	PJRST	SETFAL			;SETUP FAILURE ABORT 
REMS.3:	MOVX	S1,E.ACFL			;ACCEPT CONNECT FAILED
	MOVEM	S1,ERRCOD		;SAVE THE CODE
	PJRST	SETFAL			;ABORT AND SEND FAILURE
> ;END TOPS20
SUBTTL	SETOUT	SETUP OUTPUT OF DATA

	;THIS ROUTINE WILL CHECK FOR A REMOTE NODE AND IF SO SET UP THE
	;APPROPRIATE HEADERS
TOPS20 <

SETOUT:: SKIPN	REMACC			;REMOTE OPERATOR?
	$RETT				;NO..IGNORE IT
	PUSHJ	P,SETPTR		;SETUP THE POINTER
	MOVX	S2,1			;COMPLETE RESPONSE CODE
	IDPB	S2,S1			;SAVE THE BYTE
	MOVEM	S1,OUTPTR		;SAVE THE POINTER
	$TEXT	(,<^M^J^N/HOSTNM/::^A>)	;OPR HEADER LINE
	POPJ	P,			;RETURN
> ;END TOPS20
TOPS10 <
SETOUT:: $RETT				;RETURN
> ;END TOPS10

SUBTTL	SNDOUT	SEND OUTPUT OVER THE LINK

	;THIS ROUTINE WILL OUTPUT THE DATA IN THE BUFFER

TOPS20 <
SNDOUT:: SETZM	INTDSP			;CLEAR  OUTPUT DISPLAY FLAG
	SKIPN	REMACC			;REMOTE OPR?
	$RETT				;NO..RETURN
	MOVX	S1,0			;GET A NULL
	IDPB	S1,OUTPTR		;END WITH A NULL
	MOVE	S1,OUTJFN		;OUTPUT JFN
	MOVSI	S2,(POINT NETBSZ,)		;NETBSZ BIT BYTES
	HRR	S2,BUFADR		;BUFFER ADDRESS
	SETZ	T1,			;OUTPUT TILL A NULL
	SOUTR				;SEND THE DATA
	ERJMP	SNDO.1			;ERROR...
	POPJ	P,			;RETURN
SNDO.1:	MOVX	S1,E.OUTF		;OUTPUT FAILED
	MOVEM	S1,ERRCOD		;SAVE THE CODE
	PJRST	SETFAL			;SETUP FAILURE..ABORT WITH ERROR
				;STOP THE PROCESS
> ;END TOPS20

TOPS10 <
SNDOUT:: SETZM	INTDSP			;CLEAR  OUTPUT DISPLAY FLAG
	$RETT				;RETURN
> ;END TOPS10
SUBTTL	OUTRTN	OUTPUT ROUTINE FOR LINKS

	;THIS IS THE TEXT DEFAULT OUTPUT ROUTINE AND WILL SETUP DATA FOR THE 
	;LINKS

TOPS20 <
OUTRTN:	SOSG	OUTCNT			;ROOM LEFT
	JRST	OUTR.1			;NO..SEND AND MAKE ROOM
	IDPB	S1,OUTPTR		;SAVE THE BYTE
	$RETT				;RETURN TRUE
OUTR.1:	PUSH	P,S1			;SAVE THE BYTE
	PUSHJ	P,SETPTR		;SETUP THE POINTER
	MOVX	S2,2			;RESERVE THE CTY..LONG MESSAGE
	IDPB	S2,S1			;SAVE BYTE AS FIRST ONE
	PUSHJ	P,SNDOUT		;SEND THE OUTPUT
	PUSHJ	P,SETPTR		;RESET THE POINTERS
	MOVX	S2,3			;RELEASE AFTER THIS MESSAGE
	IDPB	S2,S1			;SAVE THE BYTE
	MOVEM	S1,OUTPTR		;SAVE THE POINTER
	POP	P,S1			;RESTORE THE VALUE
	JRST	OUTRTN			;SAVE THE CHARACTER NOW
SUBTTL	SETPTR	SETUP POINTERS FOR OUTPUT

	;THIS ROUTINE WILL SETUP THE POINTERS AND RETURN WITH S1 CONTAINING
	;THE NEW BYTE POINTER

SETPTR:	MOVEI	S1,OUTSIZ-1		;GET OUTPUT SIZE AND LEAVE ROOM FOR NULL
	MOVEM	S1,OUTCNT		;SAVE THE COUNT
	MOVSI	S1,(POINT NETBSZ,)		;SETUP FOR NETBSZ BIT BYTES
	HRR	S1,BUFADR		;GET BUFFER ADDRESS
	POPJ	P,			;RETURN S1 BYTE POINTER
> ;END TOPS20
SUBTTL	INPINT	INPUT OVER LINK INTERRUPT

	;THIS ROUTINE WILL FLAG THAT INPUT IS READY OVER THE LINK
TOPS20 <

INPINT:	$BGINT	IPCLEV			;SETUP AT SAME LEVEL
	SETOM	INPDON			;SET INPUT DONE
	$DEBRK				;RETURN


SUBTTL	OUTINT	OUTPUT LINK CONNECTED

	;THIS ROUTINE WILL FLAG A CONNECT INTERRUPT ON OUTPUT LINK

OUTINT:	$BGINT	IPCLEV			;SETUP THE LEVEL
	SETOM	OUTCON			;OUTPUT CONNECTED
	$DEBRK				;RETURN

SUBTTL	IPCRMT	IPCF INTERRUPT ROUTINE FOR REMOTE OPR

	;THIS ROUTINE WILL FLAG IPCF INTERRUPTS ON THE -20 WHEN RUNNING
	;AS A REMOTE OPR

IPCRMT:	$BGINT	IPCLEV			;SETUP THE LEVEL
	PUSHJ	P,C%INTR		;FLAG THE INTERRUPT
	$DEBRK				;RETURN
SUBTTL	INPDAT	INPUT THE DATA FROM LINK

	;THIS ROUTINE WILL READ DATA FROM THE LINK

INPDAT:	SKIPN	INPDON			;GET DATA
	$RETF				;RETURN FALSE
	SETZ	S1,			;CLEAR VALUE
	EXCH	S1,INPDON		;RESET THE FLAG
	MOVE	S1,INPJFN		;GET THE INPUT JFN
	MOVSI	S2,(POINT NETBSZ,)		;NETBSZ BIT BYTES
	HRR	S2,NETBUF		;NETWORK DATA
	MOVNI	T1,OUTSIZ		;GET THE OUTPUT SIZE
	SINR				;READ THE DATA
	  ERJMP	INPD.1			;ERROR..EXIT
	HRRZ	T3,T1			;SAVE THE NEW COUNT
	SETZ	S1,			;CLEAR S1 
	IDPB	S1,S2			;SAVE A NULL ON THE END
	MOVE	S1,INPJFN		;GET THE JFN
	MOVEI	S2,.MORLS		;READ THE LINK STATUS
	SETZ	T1,			;CLEAR FOR STATUS
	MTOPR				;GET THE STATUS
	ERJMP	INPD.1			;ERROR..ABORT
	TXNN	T1,MO%CON		;CHECK IF STILL CONNECTED?
	PJRST	INPD.1			;NO.. ABORT THE PROCESS
	TXNE	T1,MO%EOM		;DATA AVAILABLE
	SETOM	INPDON			;SET THE FLAG
	SUBI	T3,-OUTSIZ		;GET NUMBER OF CHARACTERS READ
	CAIG	T3,2			;GREATER THAN MINIMUM MESSAGE
	$RETF				;NO..RETURN FALSE
	$RETT				;RETURN TRUE
INPD.1:	MOVX	S1,E.INPF		;INPUT FAILED
	MOVEM	S1,ERRCOD		;SAVE THE CODE
	PJRST	SETFAL			;SEND SETUP FAILURE
SUBTTL	CONNEC	PROCESS CONNECT MESSAGE

	;THIS ROUTINE WILL PROCESS THE CONNECT MESSAGE FOR THE OUTPUT
	;LINK

CONNEC:	SKIPN	OUTCON			;OUTPUT CONNECT
	$RETT				;NO..RETURN
	SETZ	S1,			;CLEAR FLAG
	EXCH	S1,OUTCON		;CLEAR FLAG
	MOVE	S1,OUTJFN		;GET OUTPUT JFN
	MOVEI	S2,.MORLS		;READ LINK STATUS
	MTOPR				;GET THE STATUS
	  ERJMP CONN.1			;ERROR..HALT
	TXNN	T1,MO%WCC!MO%CON	;CONNECT MADE
	  JRST CONN.2			;BAD CONNECT DATA
	SETOM	OUTACT			;SET FLAG
	$RETT				;RETURN
CONN.1:	MOVX	S1,E.STSF			;STATUS OF SERVER FAILED
	MOVEM	S1,ERRCOD		;SAVE THE CODE
	PJRST	SETFAL			;SETUP FAILURE..ABORT WITH ERROR
CONN.2:	MOVEM	T1,ARG1			;SAVE THE ARGUMENT
	MOVX	S1,E.INVC		;INVALID CONNECT DATA
	MOVEM	S1,ERRCOD		;SAVE THE CODE
	PJRST	SETFAL			;SETUP FAILURE..ABORT WITH ERROR
> ;END TOPS20
SUBTTL	TXTLIN	CHECK IF MULTIPLE LINE INPUT ALLOWED

	;THIS ROUTINE WILL CHECK IF USER IS REMOTE OPERATOR ON THE -20
	;AND IF SO NOT ALLOW MULTIPLE LINE INPUT

TXTLIN:: SKIPN	REMOPR			;ARE WE A REMOTE OPERATOR
	PJRST	TXTINP##		;NO..GO GET THE TEXT
TOPS20 <
	MOVEI	S2,[ASCIZ/Multiple Line Text Not Allowed for Remote Operators/]
	$RETF
> ;END TOPS20
TOPS10 <
	$RETT				;RETURN O.K.
> ;END TOPS10
SUBTTL	SETFAL	SEND A SETUP FAILURE FOR OPR ERRORS

	;THIS ROUTINE WILL SEND A SETUP FAILURE TO SHUTDOWN AN OPR
	;ON AN ERROR

SETFAL:	PUSHJ	P,SETMES		;SETUP MESSAGE
	MOVX	S1,.ORFAL		;SETUP FAILURE
	STORE	S1,ARG.HD+.OHDRS(M),AR.TYP	;SAVE IN MESSAGE
	MOVEI	T1,.OHDRS+ARG.DA(M)	;POINT TO NEXT ARGUMENT
	MOVX	S1,.CMTXT		;TEXT ARGUMENT
	STORE	S1,ARG.HD(T1),AR.TYP	;SAVE THE TYPE
	MOVEI	S1,ARG.DA(T1)		;ADDRESS TO STORE DATA
	HRLI	S1,(POINT 7,0)		;MAKE BYTE POINTER
	MOVEM	S1,TEMPTR		;SAVE THE POINTER
	MOVE	S1,ERRCOD		;GET ERROR CODE
	CAILE	S1,E.MAXE		;WITHIN BOUNDS
	$STOP(IEC,INVALID ERROR CODE FOR FAILURE)
	$TEXT	(SETTXT,<^I/@OPRTXT(S1)/>^0);SAVE THE TEXT
	HRRZ	S1,TEMPTR		;GET THE POINTER
	AOS	S1,1			;BUMP THE LENGTH
	ANDI	S1,777			;GET LENGTH OF BLOCK
	STORE	S1,.MSTYP(M),MS.CNT	;SAVE MESSAGE SIZE
	SUBI	S1,.OHDRS+1		;GET LENGTH OF TEXT
	STORE	S1,ARG.HD(T1),AR.LEN	;SAVE THE LENGTH
	AOS	.OARGC(M)		;BUMP ARGUMENT COUNT
	MOVE	S1,M			;ADDRESS OF MESSAGE
	PUSHJ	P,I%SOPR		;SEND THE MESSAGE
	$HALT				;HALT THE OPR
	$RETT				;RETURN
SETTXT:	IDPB	S1,TEMPTR		;SAVE THE DATA
	$RETT				;RETURN


	DEFINE	X(A,B),<
	EXP	[ITEXT B]
>;END X
OPRTXT:	ERROPR				;ERROR CODES FOR OPR
SUBTTL	PUSHRT	ROUTINE TO PUSH FOR THE -20

TOPS20	<

PUSHRT:: SKIPE	REMOPR			;REMOTE OPERATOR?
	  JRST	NOREMT			;NO REMOTE PUSHS ALLOWED
	PUSHJ	P,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
NOREMT:	MOVEI	S2,[ASCIZ/PUSH Command not allowed for Remote Operators/]
	$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	TERMFK	FORK TERMINATION INTERRUPT CODE

TOPS20	<

TERMFK:	$BGINT	1			;INIT INTERRUPT LEVEL
	SKIPN	FRKRUN			;WERE WE RUNNING
	$DEBRK				;IGNORE IT
;	$STOP(FTE,Fork Termination Error  Fork was not Running)
	SETZM	FRKRUN			;CLEAR THE RUNNING FORK FLAG
	MOVX	S1,.PRIIN		;GET PRIMARY INPUT
	MOVE	S2,SAVMOD		;GET THE MODE
	SFMOD				;SET OLD MODE BACK
	MOVX	S1,ST%DIM		;SET ALL WORDS
	HRRI	S1,.FHJOB		;FOR THE JOB
	DMOVE	S2,SAVTWD		;GET TERMINAL WORDS
	STIW				;SET THE WORDS
	ERJMP	.+1			;IGNORE THE ERROR..
	$DEBRK				;DEBRK THE INTERRUPT

> ;END TOPS20
SUBTTL	OPRSON	OPR SIGNON TO ORION

	;THIS ROUTINE WILL SEND THE OPR HELLO MESSAGE TO ORION AND
	;THEN WAIT FOR THE ORION SETUP. THE ORION SETUP WILL BE FOLLOWED
	;BY A SETUP REPLY AND THE OPR WILL BE READY FOR COMMANDS.

OPRSON:	PUSHJ	P,M%GPAG		;GET A PAGE FOR THE HELLO
	MOVE	M,S1			;SAVE ADDRESS IN M
	MOVX	S1,.OMOHL		;OPR HELLO MESSAGE
	STORE	S1,.MSTYP(M),MS.TYP	;SAVE THE TYPE
	MOVX	S1,OPH.SZ+.OHDRS	;SIZE OF THE MESSAGE
	STORE	S1,.MSTYP(M),MS.CNT	;SAVE THE SIZE
	AOS	.OARGC(M)		;BUMP COUNT TO 1
	MOVX	S1,.OPHEL		;OPR HELLO BLOCK
	STORE	S1,ARG.HD+.OHDRS(M),AR.TYP ;SAVE THE TYPE
	MOVX	S1,OPH.SZ		;SIZE OF ARGUMENT BLOCK
	STORE	S1,ARG.HD+.OHDRS(M),AR.LEN ;SAVE THE LENGTH
	MOVE	S1,MYNODE		;GET CURRENT LOCATION
	STORE	S1,OPH.ND+.OHDRS(M)	;SAVE THE NODE
	MOVX	S1,%%.OPR		;ORNMAC VERSION NUMBER
	STORE	S1,OPH.OV+.OHDRS(M)	;SAVE IN BLOCK
	MOVX	S1,%%.OPV		;OPRS VERSION NUMBER
	STORE	S1,OPH.VN+.OHDRS(M)	;SAVE IN BLOCK
TOPS20 <
	MOVX	S1,OP.RMT		;GET REMOTE OPERATOR FLAG
	SKIPE	REMOPR			;ARE WE A REMOTE OPERATOR
	IORM	S1,.OFLAG(M)		;YES..TURN ON THE FLAG
> ;END TOPS20
	MOVE	S1,M			;PLACE MESSAGE ADDRESS IN S1
	PUSHJ	P,I%SOPR		;SEND THE MESSAGE TO ORION
	SKIPT				;CONTINUE IF SEND O.K.
	$STOP(OSF,ORION SEND FAILED)	;CAN'T INITIATE DIALOG
OPRS.1:	PUSHJ	P,C%BRCV		;BLOCKING RECEIVE THE MESSAGE
	PUSHJ	P,VALMSG		;VALIDATE THE MESSAGE
	JUMPT	OPRS.3			;O.K. CONTINUE ON
OPRS.2:	PUSHJ	P,C%REL			;NO GOOD..TRY AGAIN
	JRST 	OPRS.1			;WAIT FOR ANOTHER MESSAGE
OPRS.3:	LOAD	M,MDB.MS(S1),MD.ADR	;ADDRESS OF RECEIVED MESSAGE
	LOAD	T1,.MSTYP(M),MS.TYP	;GET THE MESSAGE TYPE
	CAIE	T1,.OMOST		;OPERATOR SETUP MESSAGE
	JRST	OPRS.4			;NO..TRY TEXT COULD BE ERROR
	PUSHJ	P,OPRRST		;OPR REPLY TO SETUP
	SKIPT				;O.K...PROCEED
	$STOP(SFO,SETUP FAILURE BY OPR)
	PJRST	C%REL			;RELEASE THE PAGE AND RETURN
OPRS.4:	CAIE	T1,MT.TXT		;ERROR TEXT MESSAGE
	JRST	OPRS.2			;NO..TRY AGAIN
	PUSHJ	P,ACKOPR		;PROCESS AS ACK OPR
	PUSHJ	P,I%EXIT		;EXIT TO COMMAND LEVEL
SUBTTL	OPRRST	OPR REPLY TO SETUP 

	;THIS ROUTINE WILL PROCESS THE SETUP AND SEND THE
	;APPROPRIATE REPLY TO ORION.

OPRRST:	SKIPE	.OARGC(M)		;ANY ARGUMENTS SPECIFIED
	JRST	OPRR.1			;YES PROCESS THE MESSAGE
	PJRST	SETREP			;SEND SETUP REPLY AND RETURN
OPRR.1:	$RETF				;****NOT SUPPORTED YET
SUBTTL	SETREP	SETUP REPLY MESSAGE

	;THIS ROUTINE WILL SEND A SETUP REPLY TO ORION SAYING THAT ALL
	;IS O.K.

SETREP:	PUSHJ	P,SETMES		;SETUP THE MESSAGE
	MOVE	S1,M			;ADDRESS OF THE MESSAGE
	PUSHJ	P,I%SOPR		;SEND TO ORION
	JUMPT	.POPJ			;ALL O.K.
	$STOP(SDF,SETUP DIALOG FAILED)
SUBTTL	SETMES	SETUP MESSAGE REPLY

SETMES:	PUSHJ	P,M%GPAG		;GET A PAGE OF MEMORY
	MOVE	M,S1			;SAVE THE ADDRESS IN M
	MOVX	S1,.OMOSR		;SETUP REPLY CODE
	STORE	S1,.MSTYP(M),MS.TYP	;SAVE THE TYPE
	MOVX	S1,1			;LENGTH OF THE ARGUMENT
	STORE	S1,ARG.HD+.OHDRS(M),AR.LEN	;SAVE LENGTH
	MOVX	S1,.ORSUC		;GET SUCCESS CODE
	STORE	S1,ARG.HD+.OHDRS(M),AR.TYP	;SAVE THE TYPE
	MOVX	S1,.OHDRS+1		;SIZE OF THE MESSAGE
	STORE	S1,.MSTYP(M),MS.CNT	;SAVE THE COUNT
	MOVE	S1,M			;PUT ADDRESS IN S1
	AOS	.OARGC(M)		;BUMP ARGUMENT COUNT
	POPJ	P,			;RETURN
SUBTTL	TABCHK	ROUTINE TO CHECK OUT TABLES

	;THIS ROUTINE WILL CHECK OUT THE ENTRY BLOCK SETUP BY 
	;EACH TABLE FOR THE PROPER LENGTH AND NON-ZERO ENTRIES

TABCHK:	MOVEI	T3,SYNTAB		;ADDRESS OF TABLE OF TABLES
	MOVE	T1,(T3)			;GET THE FIRST TABLE
	SKIPN	T2,TABNUM		;NON-ZERO NUMBER OF ENTRIES
	$STOP(ZTS,ZERO TABLES SETUP FOR OPR)
	JRST	TABC.1			;SKIP BUMPING TO NEXT TABLE
TABC.0:	ADDI	T3,1			;BUMP TO NEXT ENTRY
	SKIPN	T1,(T3)			;BUMP TO NEXT TABLE ADDRESS
	$STOP(MST,MISSING SYNTAX TABLE)
TABC.1:	LOAD	S1,TAB.HD(T1),TB.LEN	;LENGTH OF BLOCK
	CAIGE	S1,TAB.SZ-1		;GREATER OR EQUAL TO LENGTH
	$STOP(WLT,WRONG LENGTH TABLE ENTRY BLOCK)
	SKIPE	TAB.IN(T1)		;ZERO INIT TABLE
	SKIPN	TAB.KY(T1)		;OR ZERO KEYWORD TABLE
	$STOP(ZTE,ZERO ENTRY IN SYNTAX TABLE ENTRY BLOCK)
	SOJG	T2,TABC.0		;CHECK OUT ALL TABLES
	MOVE	S1,SYNTAB		;ADDRESS OF MAIN OPR TABLES
	MOVE	S2,TAB.KY(S1)		;ADDRESS OF MAIN KEYWORD TABLE
	MOVEM	S2,DEFTAB		;SAVE AS DEFAULT TABLES

TABC.2:	MOVSI	S2,-<NUMAPL>		;GET NUMBER OF ENTRIES
TABC.3:	SKIPN	T1,SYNTAB+1(S2)		;GET THE TABLE ENTRY
	JRST	TABC.4			;SKIP IT TRY NEXT
	MOVE	T2,TAB.KY(T1)		;GET THE KEYWORD TABLE
	HRRZ	T3,KEYAP1+1(S2)		;ADDRESS OF SYMBOL AND NEXT
	HRRM	T2,(T3)			;SETUP TABLE POINTER
TABC.4:	AOBJN	S2,TABC.3		;CHECK FOR MORE
	POPJ	P,			;RETURN
SUBTTL	GETLOC	GET OPRS LOCATION

	;THIS ROUTINE WILL DETERMINE THE JOBS LOCATION AND STORE THE
	;VALUE IN MYNODE.

GETLOC:	SETOM	S1			;GET MY LOCATION
	MOVX	S2,JI.LOC		;GET THE JOBS LOCATION
	PUSHJ	P,I%JINF		;GET THE LOCATION
	SKIPT				;SKIP IF O.K.
	SETZ	S2,			;MAKE 0 FOR NOW
	MOVEM	S2,MYNODE		;SAVE AS MYNODE
	$RETT				;RETURN

ENTVEC:	JRST OPR		;MAIN ENTRY POINT
	JRST OPRRMT			;REMOTE OPR ENTRY
	EXP	%%.OPV			;VERSION
	END	<3,,ENTVEC>