Google
 

Trailing-Edge - PDP-10 Archives - BB-LW55A-BM_1988 - galaxy-sources/please.mac
There are 31 other files named please.mac in the archive. Click here to see a list.
	TITLE	PLEASE - Galaxy CUSP for Operator/User Commumications
	SUBTTL	Preliminaries

;	COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1979, 1988.
;	ALL RIGHTS RESERVED.
;
;	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 THAT IS NOT SUPPLIED BY DIGITAL.


	SEARCH	GLXMAC			;Galaxy symbols
	SEARCH	ORNMAC			;ORION symbols

	PROLOG	(PLEASE)		;Set up

TOPS10	<IF2,<PRINTX [Assembling Galaxy-10 PLEASE]>>
TOPS20	<IF2,<PRINTX [Assembling Galaxy-20 PLEASE]>>
	SUBTTL	Edit vector and Version numbers

PLSVEC:	BLDVEC	(GLXMAC,GMC,L)
	BLDVEC	(ORNMAC,OMC,L)
	BLDVEC	(PLEASE,PLS,L)

	PLSMAN==:0			;Maintenance edit number
	PLSDEV==:6001			;Development edit number
	VERSIN (PLS)			;Generate edit number

	PLSWHO==0
	PLSVER==6
	PLSMIN==0

	PLSVRS==<VRSN.(PLS)>+GMCEDT+OMCEDT


	LOC	137
	EXP	PLSVRS
	RELOC
	Subttl	Table of Contents

;		     Table of Contents for PLEASE
;
;				  Section		      Page
;
;
;    1. Edit vector and Version numbers  . . . . . . . . . . .   2
;    2. Revision history . . . . . . . . . . . . . . . . . . .   4
;    3. Assembly parameters and local storage  . . . . . . . .   5
;    4. Galaxy interface . . . . . . . . . . . . . . . . . . .   6
;    5. Macros . . . . . . . . . . . . . . . . . . . . . . . .   7
;    6. PLEASE command parse tables  . . . . . . . . . . . . .   8
;    7. Dialogue mode parse tables . . . . . . . . . . . . . .   9
;    8. Program intialization and command parsing  . . . . . .  10
;    9. Command mode processor . . . . . . . . . . . . . . . .  11
;   10. Dialogue loop  . . . . . . . . . . . . . . . . . . . .  12
;   11. Switch processors  . . . . . . . . . . . . . . . . . .  13
;   12. Command line RESCANing . . . . . . . . . . . . . . . .  14
;   13. Command parsing  . . . . . . . . . . . . . . . . . . .  15
;   14. IPCF message processing  . . . . . . . . . . . . . . .  16
;   15. Check for operator on duty . . . . . . . . . . . . . .  17
;   16. Exit routines  . . . . . . . . . . . . . . . . . . . .  18
;   17. Message handler  . . . . . . . . . . . . . . . . . . .  19
;   18. Messages . . . . . . . . . . . . . . . . . . . . . . .  20
;   19. The end  . . . . . . . . . . . . . . . . . . . . . . .  21
SUBTTL	Revision history

COMMENT \

112	4.2.1528	9-Nov-82
	Fix copyright.

*****  Release 4.2 -- begin maintenance edits  *****

*****  Release 5.0 -- begin development edits  *****

120	5.1003		30-Dec-82
	Move to new development area.  Add version vector.  Clean up
	edit organization.  Update TOC.

121	5.1043		11-Oct-83
	Due to an overlay in PLEASE and GLXLIB at location 400000, make
	PLEASE into a single segmented program by removing the TWOSEG
	statement and four RELOC statements.  

122	5.1046		21-Oct-83
	Change version number from 104 to 5.

123	5.1191
	Increase the message size from 400. to 2000.
*****	Release 5.0 -- begin maintenance edits	*****

130	Increment maintenance edit level for version 5 of GALAXY.

*****	Release 6.0 -- begin development edits	*****

6000	6.1037		26-Oct-87
	Move sources from G5: to G6:

6001	6.1225		8-Mar-88
	Update copyright notice.

\   ;End of Revision History
SUBTTL	Assembly parameters and local storage


; Assembly parameters
;
	ND	PDLSIZ,150		;Stack size
	ND	BUFSIZ,<^D2000/5>+1	;S%CMND buffer size in characters
	ND	ATMSZ,<^D2000/5>+1	;ATOM buffer size in characters
	SYSPRM	MC.CON,JW.WCN,<1B9>	;/MESSAGE:CONTINUATION
	SYSPRM	MC.FIR,JW.WFL,<1B10>	;/MESSAGE:FIRST
	SYSPRM	MC.PFX,JW.WPR,<1B11>	;/MESSAGE:PREFIX



; Local storage
;
ZBEG:!					;Start of block to clear on start up

PDL:	BLOCK	PDLSIZ			;Stack
PIBBLK:	BLOCK	PB.MNS			;PIB
MSGBLK:	BLOCK	5			;Message block
USRJOB:	BLOCK	1			;User job number
OPRNOD:	BLOCK	1			;Operator node number/name
BUFFER:	BLOCK	BUFSIZ			;S%CMND buffer
ATMBUF:	BLOCK	ATMSZ			;ATOM buffer
CMDMOD:	BLOCK	1			;Command mode flag
PARBLK:	BLOCK	PAR.SZ			;Parser block
PARFLG:	BLOCK	1			;Parse flags
CMDBLK:	BLOCK	PAGSIZ			;Command block
CSB:	BLOCK	1			;Command state block address (S%CMND)
TCSB:	BLOCK	1			;Command state block address (K%TXTI)
GTJBLK:	BLOCK	16			;GTJFN block for S%CMND
SWTWRD:	BLOCK	1			;Set if switches have been specified
SCNFLG:	BLOCK	1			;Light on a RESCAN 
ZEND:!					;End of block to clear on start up
	SUBTTL	Galaxy interface

; GLXLIB initialization block
;
IB:	$BUILD	(IB.SZ)			;Size of block
	  $SET	(IB.PRG,,%%.MOD)	;Program name
	  $SET	(IB.OUT,,T%TTY)		;TTY output
	  $SET	(IB.FLG,IT.OCT,1)	;Require command terminal
	  $SET	(IB.FLG,IB.DPM,1)	;Use job number for a PID
	  $SET	(IB.PIB,,PIBBLK)	;PID block pointer
	$EOB				;End of block


; Template for Command State Block for S%CMND
;
CSBTMP:	$BUILD	.CMGJB+1
	$SET	.CMIOJ,LHMASK,.PRIIN	;Primary input
	$SET	.CMIOJ,RHMASK,.PRIOU	;Primary output
	$SET	.CMBFP,,<POINT 7,BUFFER> ;Pointer to input buffer
	$SET	.CMPTR,,<POINT 7,BUFFER> ;Start the parse at the beginning
	$SET	.CMCNT,,BUFSIZ*5-1	;Size of buffer
	$SET	.CMABP,,<POINT 7,ATMBUF> ;Pointer to start of atom buffer
	$SET	.CMABC,,ATMSZ*5-1	;Size of atom buffer
	$SET	.CMGJB,,GTJBLK		;GTJFN block
	$EOB

; Template for Command State Block for S%TXTI
;
TXTTMP:	$BUILD	.RDBKL+1
	$SET	.RDCWB,,.RDBKL		;Primary input
	$SET	.RDFLG,,<RD%BRK!RD%JFN>	;Primary output
	$SET	.RDIOJ,LHMASK,.PRIIN	;Input device is TTY
	$SET	.RDIOJ,RHMASK,.PRIOU	;Output device is TTY
	$SET	.RDDBP,,<POINT 7,ATMBUF> ;Pointer to input buffer
	$SET	.RDDBC,,ATMSZ*5-1	;Size of buffer
	$SET	.RDBFP,,<POINT 7,ATMBUF> ;Pointer to start of atom buffer
	$SET	.RDRTY,,0		; Place to store our prompts
	$SET	.RDBRK,,0		; No break set
	$SET	.RDBKL,,<POINT 7,ATMBUF> ; Backup limit
	$EOB



; File open block (FOB) for help file
;
HLPFOB:	EXP	HELPFD			;File Descriptor
	EXP	7			;Bytesize

; File descriptor (FD) for help file
;
TOPS10	<				;TOPS-10 spec
HELPFD:	$BUILD	(FDMSIZ)		;Size of block
	  $SET	(.FDLEN,FD.LEN,FDMSIZ)	;Length of FD
	  $SET	(.FDLEN,FD.TYP,.FDNAT)	;File spec type (native)
	  $SET	(.FDSTR,,<'HLP   '>)	;Ersatz device HLP:
	  $SET	(.FDNAM,,<'PLEASE'>)	;File name
	  $SET	(.FDEXT,,<'HLP   '>)	;Extension
	$EOB				;End of block
>					;End of TOPS-10 conditional

TOPS20	<				;TOPS-20 spec
HELPFD:	XWD	FDSIZ,.FDNAT		;Native FD with size FDSIZ
	ASCIZ |HLP:PLEASE.HLP|		;Write the file name
FDSIZ==.-HELPFD				;Define the size
>					;End of TOPS-20 conditional
SUBTTL	Macros


;; Macros for building FDB's

; Macro to generate function data block -- caller supplies help text

    DEFINE FLDDB. (TYP,FLGS,DATA,HLPM,DEFM,LST) <
	XLIST
	..XX==<FLD(TYP,CM%FNC)>+FLGS+<Z LST>
	IFNB <HLPM>,<..XX==CM%HPP!..XX>
	IFNB <DEFM>,<..XX==CM%DPP!..XX>
	    ..XX
	IFNB <DATA>,<DATA>
	IFB <DATA>,<0>
	IFNB <HLPM>,<POINT 7,[ASCIZ \HLPM\]>
	IFB <HLPM>,<IFNB <DEFM>,<0>>
	IFNB <DEFM>,<POINT 7,[ASCIZ \DEFM\]>
	LIST
    >


;Macro to generate function descriptor block with break mask supplied

DEFINE FLDBK. (TYP,FLGS,DATA,HLPM,DEFM,BRKADR,LST)<
	..XX==<FLD(TYP,CM%FNC)>+FLGS+<Z LST>
   IFNB <HLPM>,<..XX=CM%HPP!..XX>
   IFNB <DEFM>,<..XX=CM%DPP!..XX>
   IFNB <BRKADR>,<..XX=CM%BRK!..XX>
	..XX
   IFNB <DATA>,<DATA>
   IFB <DATA>,<0>
   IFNB <HLPM>,<POINT 7,[ASCIZ HLPM]>
   IFB <HLPM>,<IFNB <DEFM'BRKADR>,<0>>
   IFB <DEFM>,<IFNB <BRKADR>,<0>>
   IFNB <DEFM>,<POINT 7,[ASCIZ \DEFM\]>
   IFNB <BRKADR>,<BRKADR>
   >

; Macro to generate a message
;
DEFINE	$MSG	(PFX,ADDR),<
	PUSHJ	P,MSG			;;Call the message processor
	CAI	[EXP	M..'PFX		;;Text block address
		 EXP	ADDR]		;;Return address
>					;;End of $MSG macro


; Macro to generate the message text
;
DEFINE	$MSGT	(CHR,PFX,FIRST,CONT),<
M..'PFX:EXP	"CHR"			;;Character
	SIXBIT	|PLS'PFX|		;;Prefix
	[ITEXT	(< 'FIRST>)]		;;First line
	[ITEXT	(<CONT>)]		;;Continuation line
>					;;End of $MSGT macro
SUBTTL	PLEASE command parse tables


PLS010:	FLDDB.(.CMINI)			;INIT FDB 

PLS020:	FLDDB.(.CMKEY,,PLS030)		;KEYWORD FDB

PLS030:	$STAB				;Keyword table for PLS020
	KEYTAB	(DIALOG,<Continue>,CM%INV)
	KEYTAB	(PLSCMD,<Please>)
	KEYTAB	(DIALOG,<Run>,CM%INV)
	KEYTAB	(DIALOG,<Start>,CM%INV)
	$ETAB

PLS040:	FLDDB.	(.CMSWI,,PLS050,Single line message
or Confirm for Multiple-line message
or)					;SWITCH FDB

PLS050:	$STAB				;Switch table for PLS040
	KEYTAB	(.SWHLP,<Help>)
	KEYTAB	(.SWNNM,<Node:>)
	$ETAB

PLS060:	FLDDB.	(.CMNOD,CM%SDH,,Operator node to send to)

PLS080:	FLDDB.	(.CMCFM,CM%SDH,,Confirm for multi-line message,,PLS090)

PLS090:	FLDBK.	(.CMFLD,CM%SDH,,Single line message,,CMDBRK)

PLS100:	FLDDB.	(.CMCFM)

; Break character mask for command mode input
;
TOPS10<
CMDBRK:	000340,,001400			;Break on <LF><VT><FF><CTRLZ><ESCAPE>
	000000,,000000			;Allow
	000000,,000000			; all other
	000000,,000000			;  characters
	> ;End TOPS-10 Conditional

TOPS20<
CMDBRK:	000240,,000000			;Break on <LF><FF>
	000000,,000000			;Allow
	000000,,000000			; all other
	000000,,000000			;  characters
	> ;End TOPS-20 Conditional

; Please command mode prompt
;
PLSPMT:	ASCIZ	|PLEASE>|
SUBTTL	Dialogue mode parse tables


DIA020:	FLDDB.	(.CMKEY,,DIA030,,,DIA040)

DIA030:	$STAB
	KEYTAB	(,\"32)
	$ETAB

DIA040:	FLDBK.	(.CMFLD,,,,,DIABRK)

; Break character mask for dialogue mode input
;
DIABRK:	000000,,001400			;Break on <CTRLZ> or <ESCAPE>
	000000,,000000			;Allow
	000000,,000000			; all other
	000000,,000000			;  characters


; Dialog mode prompt
;
BDIAPT:	ASCIZ	|Enter text, terminate with CTRL/Z to wait for response,
or ESCape to send message and exit
|

DIAPMT:	ASCIZ	|Enter new text (Same terminators)
|
SUBTTL	Program intialization and command parsing


PLEASE:	JFCL				;No CCL
	RESET				;Stop I/O
	MOVE	P,[IOWD	PDLSIZ,PDL]	;Set up stack
	MOVE	S1,[ZBEG,,ZBEG+1]	;Set up BLT
	SETZM	ZBEG			;Clear the first word
	BLT	S1,ZEND-1		;Clear low segment
	MOVX	S1,PB.MNS		;Minimum size block
	STORE	S1,PIBBLK+PB.HDR,PB.LEN	;Store it
	MOVX	S1,IB.SZ		;Size of block
	MOVEI	S2,IB			;Address of block
	PUSHJ	P,I%INIT##		;Initialize GLXLIB
	SETO	S1,			;-1 means us
	MOVX	S2,JI.JNO		;Function code
	$CALL	I%JINF			;Get our job number
	MOVEM	S2,USRJOB		;Store it
	SETO	S1,			;-1 our job
	MOVX	S2,JI.LOC		;Function code
	$CALL	I%JINF			;Get our node number
	MOVEM	S2,OPRNOD		;Incase /NODE omitted
	PUSHJ	P,SCAN			;Rescan the command line
					;Fall into command mode processor
SUBTTL	Command mode processor


COMMAND:MOVE	P,[IOWD	PDLSIZ,PDL]	;Reset the PDL
	SETOM	CMDMOD			;Indicate in command mode
	SKIPN	S1,CSB			;Get address of CSB
	PUSHJ	P,GETCSB		;Get storage for CSB
	HRLI	S1,CSBTMP		;Make a BLT pointer
	MOVEI	S2,(S1)			;Get dest address in S2
	BLT	S1,.CMGJB(S2)		;Fill in the block
COMM.1:	MOVE	S1,CSB			;Get address of CSB
	MOVE	S2,[POINT 7,PLSPMT]	;Get the PLEASE> prompt
	MOVEM	S2,.CMRTY(S1)		;Put in CSB
TOPS10<
	MOVE	S2,[XWD .PRIIN,.PRIOU]	;Get the JFN's incase we had a RESCAN
	MOVEM	S2,.CMIOJ(S1)		;And stick them in the CSB
	> ;End TOPS-10 Conditional
	MOVEI	S2,REPARS		;Get reparse address
	HRRM	S2,.CMFLG(S1)		;Put in CSB
	SKIPN	SCNFLG			;Have we found anything when scanning
	JRST	COMM.3			;No, go on
	SETZM	SCNFLG			;Yes, turn off the flag
	MOVE	S2,[POINT 7,[0]]	;Yes, get a dummy prompt
	MOVEM	S2,.CMRTY(S1)		;And make it current
TOPS10<
	MOVEI	S2,.NULIO		;Get null output
	STORE	S2,.CMIOJ(S1),RHMASK	;We don't want to echo
	> ;End TOPS-10 Conditional

COMM.3:	MOVEI	S2,PLS010		;Key address of INIT FDB
	PUSHJ	P,S%CMND		;Init the PARSER
COMM.2:	SETZM	SWTWRD			;No switches used yet
	MOVE	S1,CSB			;Get CSB
	MOVEI	S2,PLS020		;Get FDB
	PUSHJ	P,CMDPRS		;Parse a command
	  JUMPF	CMDERR			;Can't, issue error
	MOVE	S1,CR.RES(S2)		;Get the keyword address
	HRRZ	S1,(S1)			;Get the code for the keyword
	PJRST	(S1)			;Dispatch and never return

GETCSB:	MOVEI	S1,.CMGJB+1		;Get a CSB of length .CMGJB+1
	$CALL	M%GMEM			;Get the memory
	MOVEM	S2,CSB			;Store it away
	MOVE	S1,S2			;Get the address in S1
	POPJ	P,			;And return

; Here on a PLEASE command
;
PLSCMD:	PUSHJ	P,CHKOPR		;Check for an operator on duty
	MOVE	S1,CSB			;Get CSB
	MOVEI	S2,PLS040		;Get SWITCH FDB
	PUSHJ	P,CMDPRS		;Parse the command
	 JUMPF	PLSC.1			;If it wasn't a switch, go on
	MOVE	S1,CR.RES(S2)		;Get the keyword address
	HRRZ	S1,(S1)			;Get the code
	JRST	(S1)			;And go process the switch
PLSC.1:	MOVE	S1,CSB			;Get the CSB
	MOVEI	S2,1			;Get a lit bit
	STORE	S2,.CMFLG(S1),CM%WKF	;Light the wakeup on end-of-field bit
	MOVEI	S2,PLS080		;Get CONFIRM/FIELD switch
	PUSHJ	P,CMDPRS		;Parse it
	 JUMPF	[$STOP(IPE,Internal parser error)]
	HRRZ	S1,CR.PDB(S2)		;Find out which FDB was used
	CAIN	S1,PLS080		;Was it the CONFIRM
	JRST	DIALOG			;Yes, do dialog stuff
	LDB	S1,[POINT 7,ATMBUF,6]	;Look at first byte of field
	CAIN	S1,"/"			;Was he trying to do a switch
	 $MSG	(SSE,CHKXIT)		;? Switch syntax error
	HRRZ	S1,CR.PDB(S2)		;Get address of used FDB
	LOAD	S1,.CMFNP(S1),CM%FNC	;Get function code
	CAIN	S1,.CMKEY		;Was it keyword?
	 JRST	MONRET			;Must have a control-Z
	CAIE	S1,.CMFLD		;Then it better have been field
	 JRST	[$MSG (EPM,CHKXIT)]	;? Error parsing message
	JRST	DIAL.1			; Go process the message
SUBTTL	Dialogue loop

DIALOG:	MOVE	P,[IOWD	PDLSIZ,PDL]	;Reset the PDL
	SETZM	CMDMOD			;Indicate dialogue mode
	SKIPE	TCSB			;Get address of CSB
	 JRST	D.1			; Don't get any memory now
	MOVEI	S1,.RDRTY		; Get the lenght of the block
	$CALL	M%GMEM			; Get a chunk of memory
	MOVEM	S2,TCSB			; Store the address away
	SKIPA	T1,[POINT 7,BDIAPT]	;Get the pre-dialog prompt

D.1:	MOVE	T1,[POINT 7,DIAPMT]	; Get the regular dialog prompt
	MOVE	S2,TCSB			; Get the address of the arg block
	HRLI	S1,TXTTMP		;Make a BLT pointer
	HRR	S1,S2			; Put destination in S1
	MOVEI	S2,(S1)			; S2 also
	BLT	S1,.RDRTY-1(S2)		;Fill in the block
	MOVE	S1,TCSB			;Get address of CSB
	MOVEM	T1,.RDRTY(S1)		; Store the prompt
	$TEXT	(,<^T/(T1)/^A>)		; Prompt him
	$CALL	K%TXTI			;Parse the command
	 JUMPF	[$STOP	(TBI,<S%TXTI block incorrect>)] ; Shouldn't happen

DIAL.1:	MOVE	T2,[POINT 7,ATMBUF]	; Point to the message
DIAL.2:	ILDB	T3,T2			;GET A CHARACTER
	JUMPE	T3,DIA.4A		;DONE ?
	MOVEI	T1,(T3)			; Save the character
	CAIE	T3,.CHCNZ		; Message terminator?
	 CAIN	T3,.CHESC		;  .  .  .
	  JRST	DIAL.4			; Yes, go finish up	
	CAIL	T3," "			;A CONTROL CHARACTER ?
	JRST	DIAL.2			;NO - IGNORE IT
	CAXN	T3,.CHBEL		;ALLOW <BELL>
	JRST	DIAL.3			;STORE IT
	CAIE	T3,.CHLFD		;ALLOW <LF>
	CAXN	T3,.CHCRT		;ALLOW <CR>
	SKIPA				;DON'T CHANGE IT
	MOVEI	T3," "			;CONVERT TO A SPACE

DIAL.3:	DPB	T3,T2			;STORE CHARACTER
	JRST	DIAL.2			;LOOP BACK FOR MORE

DIAL.4:	SETZ	S1,			; Make a null
	DPB	S1,T2			; Overwrite the terminator
DIA.4A:	SKIPE	CMDMOD			; Are we in dialog mode?
	 JRST	DIAL.5			; No, handle the command
	MOVE	S1,TCSB			; Get the address of arguement block	
	MOVE	S1,.RDFLG(S1)		; Get the flags from there
	TXNN	S1,RD%BTM		; Did he type a break character
	 $MSG	(MTL,.+1)		; Message too long
	LDB	S1,[POINT 7,ATMBUF,6]	; Get the first character
	CAIN	S1,.CHESC		; Is it an ESCAPE?
	 JRST	MONRET			; Yes, just go out
	CAIN	S1,.CHCNZ		; Is it a ^Z
	 JRST	D.1			; Yes, don't send null message
	SETZ	S1,			; Make a null character
	DPB	S1,T2			; Store it into the break character
	CAIN	T1,.CHCNZ		; Was the break character a ^Z?
	 JRST	WTOR			; Yes, wait for response
	JRST	WTO			; No, must have been ESCape

DIAL.5:	MOVE	S1,CR.FLG(S2)		;Get command flags
	TXNE	S1,CM%ESC		;Was escape typed ?
	JRST	WTO			;Yes - don't wait

; Here to Write To OPR (and wait for a response)
;
WTOR:	$WTOR	(,<^T/ATMBUF/>,,USRJOB,<$WTNOD(OPRNOD),$WTFLG(WT.NFY)>)
	$MSG	(OPN,.+1)		;[Operator has been notified]
	PUSHJ	P,IPCSER		;Process IPCF messages
	SKIPE	CMDMOD			; Are we in command mode?
	 JRST	DIALOG			; Yes, Go start up a dialog now
	JRST	D.1			; Otherwise go for more dialogue

; Here to Write To OPR (don't wait for a response)
;
WTO:	$WTO	(,<^T/ATMBUF/>,,<$WTNOD(OPRNOD)>)
	$MSG	(OPN,MONRET)		;[Operator has been notified]
SUBTTL	Switch processors


; /Help
;
.SWHLP:	SKIPE	S1,SWTWRD		;Have any switches been specified	
	JRST	[$MSG(BHR,CHKXIT)]	;Yes, bad help request
	MOVE	S1,CSB			;Get CSB address
	MOVEI	S2,PLS100		;Get confirm FDB
	PUSHJ	P,CMDPRS
	JUMPF	[$MSG(BHR,CHKXIT)]	;Bad help request, no confirmed
	MOVEI	S1,2			;Length of help FOB
	MOVEI	S2,HLPFOB		;Address of help FOB
	$CALL	F%IOPN			;Open the file
	JUMPF	[$MSG(NHA,CHKXIT)]	;No help, sorry Charlie
	MOVEI	T1,(S1)			;Get the IFN for calls
RDHLP:	MOVEI	S1,(T1)			;Get the IFN for call
	$CALL	F%IBUF			;Get a buffer
	JUMPF	CLSHLP			;Assume EOF
	EXCH	S1,S2			;Switch count and BP
	$CALL	K%BUFF			;Put it out to TTY
	JRST	RDHLP			;Get the next buffer
CLSHLP:	$CALL	K%FLSH			;If not assume EOF and flush buffer.
	MOVEI	S1,(T1)			;Get the IFN
	$CALL	F%REL			;And close the file
	JRST	CHKXIT			;We're done





; /Node: xxx
;
.SWNNM:	SKIPE	SWTWRD			;Is this the first switch
	JRST	[$MSG(SUT,CHKXIT)]	;No, switch used twice, no no
	SETOM	SWTWRD			;Say that we have a switch
	MOVE	S1,CSB			;Get the CSB
	MOVEI	S2,PLS060		;Get the NODE FDB
	PUSHJ	P,CMDPRS		;Parse it
	 JUMPF	[$MSG(NIN,CHKXIT)]	;Die on error

TOPS10<
	MOVE	S1,CR.RES(S2)		;Get name or number
	> ;End TOPS-10 Conditional

TOPS20<
	HRROI	S1,ATMBUF		;Pointer to node name
	$CALL	S%SIXB			;Convert to sixbit
	MOVE	S1,S2			;Get in S1
	> ;End TOPS-20 Conditional

	MOVEM	S1,OPRNOD		;Store it
	JRST	PLSCMD			;Get rest of command

; Here on a Reparse

REPARS:	MOVE	P,[IOWD PDLSIZ,PDL]	;Reset the stack
	JRST	COMM.2			;Go to retry the parse

REPAR1:	MOVE	P,[IOWD PDLSIZ,PDL]	;Reset the stack
	JRST	D.1			;Go to retry the parse
SUBTTL	Command line RESCANing


; Macro to build a break character mask
;
DEFINE	$BRK	(CHR),<
	...BRK==0
	IRP	CHR,<...BRK==...BRK!1B35_CHR>
	EXP	...BRK
	PURGE	...BRK
>


SCAN:
TOPS20<
	MOVEI	S1,.RSINI		;Make data available 
	RSCAN				;Check for command
	 JRST GO2			;None
	JUMPE	S1,GO2			;If char count zero, no cmd
	> ;End TOPS-20 Conditional
TOPS10<
	RESCAN	1			;See if anything there
	 SKIPA				;Could be...
	  JRST	GO2			;Nothing, skip all this
	> ;End TOPS-10 Conditional

	SETOM	SCNFLG			;Light the flag
	POPJ	P,			;Return

GO2:
TOPS20<
	HRROI	S1,[0]			;Clear rescan
	RSCAN
	 JFCL
	> ;End TOPS-20 Conditional
	POPJ	P,
SUBTTL	Command parsing


; Parse a command
; Call:		S1/	Address of CSB
;		S2/	Address of FDB
;
; Returns TRUE	if no parsing error with CMDBLK ready to digest
; Returns FALSE parsing error
;
CMDPRS:	$CALL	S%CMND			; Do the Call
	$RETIF				; Pass along a false return
	MOVE	S1,CR.FLG(S2)		; Get flag word of reply block
	TXNE	S1,CM%NOP		; Was no-parse set
	$RETF				; Yes, return false
	$RETT				; No, return true



; Here on command errors
;
CMDERR:	HRROI	T1,[ASCIZ |Illegal Keyword|] ;Get pointer to error text
	$MSG	(CME,CHKXIT)		;? Command syntax error
SUBTTL	IPCF message processing


IPCSER:	$CALL	C%BRCV			;Wait for an IPCF message
	LOAD	P1,MDB.MS(S1),MD.ADR	;Get message address
	MOVEI	P3,.OHDRS(P1)		;Point to the blocks
	LOAD	S1,PFD.HD(P3),PF.TYP	;Get the type field
	CAIE	S1,.CMTXT		;Is it text?
	JUMPF	IPCERR			;It's an error, otherwise
	MOVEI	T1,ARG.DA(P3)		;Address of the text
	LOAD	S2,PFD.HD(P3),PF.LEN	;Get the length in S2
	ADD	P3,S2			;Add to the current location
	LOAD	S2,.MSTYP(P1),MS.TYP	;Get the message type
	CAXE	S2,MT.TXT		;Is it a text message
	JRST	IPCS.1			;No -  process as a response
	MOVEI	P2,.OHDRS+ARG.DA(P1)	;Get the address
	$MSG	(EFO,.+1)		;? Error from ORION
	$CALL	C%REL			;Release the IPCF page
	PJRST	CHKXIT			;Done


; Here with a normal response from the operator
;
IPCS.1:	MOVE	S2,P3			;Get the current address
	LOAD	S1,PFD.HD(S2),PF.TYP	;And the type field
	LOAD	TF,PFD.HD(S2),PF.LEN	;Get the length
	ADD	P3,TF			;So we can bump the pointer
	CAXE	S1,.ACKID		;Check for ACK ID block
	  JRST	IPCERR			;Generate an error
	MOVE	T2,ARG.DA+1(S2)		;Get the value
	MOVEI	T3,[ITEXT(<^N/T2/>)]	;Node name
	TLNN	T2,770000		;Sixbit node name ?
	MOVEI	T3,[ITEXT(<Terminal ^O/T2/>)] ;No - must be terminal number
	$TEXT	(,<
^C/[-1]/ From Operator ^I/(T3)/:
	=^7/[76]/^T/(T1)/>)		;Dump the response
	$CALL	C%REL			;Release IPCF page
	$RETT				;Return


; Here when we detect a bad message type
;
IPCERR:	$MSG	(UMO,.+1)		;? Unrecognized message from ORION
	$CALL	C%REL			;Release the IPCF page
	JRST	CHKXIT			;Done
SUBTTL	Check for operator on duty


; Check for operator on duty
; Outputs a warning message if monitor beleives there is no
; operator in attendance
;
CHKOPR:
TOPS10	<				;TOPS-10 only
	MOVX	S1,%CNSTS		;Get the STATES word
	GETTAB	S1,
	  SETZ	S1,			;Can't
	TXNE	S1,ST%NOP		;Check for no operator
>					;End of TOPS-10 conditional

TOPS20	<				;TOPS-20 only
	MOVX	S1,.SFOPR		;Get operator in attendance function
	SETZ	S2,			;Clear result
	TMON				;Check
	SKIPN	S2			;No operator check
>					;End of TOPS-20 conditional

	$MSG	(NOP,.+1)		;% No operator in attendance
	$RETT				;Operator on duty
SUBTTL	Exit routines



; Check if PLEASE should exit after an error
;
CHKXIT:
TOPS10<
	CLRBFI				;Clear input buffer of type ahead
	> ;End TOPS-10 Conditional
TOPS20<
	MOVEI	S1,.PRIIN
	CFIBF
	> ;End TOPS-20 Conditional
	SKIPN	CMDMOD			;Called from command mode ?
	JRST	DIALOG			;No - return to dialogue mode
	SKIPN	DEBUGW			;Are we debugging
	JRST	MONRET			;No - then stop the job
	JRST	COMM.1			;Yes - go prompt user


; Return to the monitor
;
MONRET:	$HALT				;Stop the job
	JRST	PLEASE			;Do it again
SUBTTL	Message handler


MSG:	MOVE	S1,@(P)			;Get pointer to argument block
	MOVE	S2,1(S1)		;Get return address
	HRRM	S2,(P)			;Store it
	MOVE	S1,(S1)			;Get address of block
	MOVSI	S2,(S1)			;Get message block address
	HRRI	S2,MSGBLK		;Point to storage address
	BLT	S2,MSGBLK+3		;Copy data
	MOVE	S1,MSGBLK+0		;Get first character
	CAIE	S1,"["			;A comment ?
	TDZA	S1,S1			;No - load a <NUL>
	MOVEI	S1,"]"			;Yes - finish it
	MOVEM	S1,MSGBLK+4		;Store it

TOPS10	<				;TOPS-10 only
	HRROI	S1,.GTWCH		;Get the job's watch bits
	GETTAB	S1,			;From the monitor
	  SETZ	S1,			;Can't
	TXNN	S1,MC.PFX!MC.FIR	;Prefix or first line set ?
>					;End of TOPS-10 conditional
	MOVX	S1,MC.PFX!MC.FIR	;No - load defaults
	MOVX	S2,[ITEXT (<>)]		;Null text
	TXNN	S1,MC.PFX		;Wants a prefix ?
	SETZM	MSGBLK+1		;No
	TXNN	S1,MC.FIR		;Wants a first line ?
	MOVEM	S2,MSGBLK+2		;No
	TXNN	S1,MC.CON		;Wants a continuation message ?
	MOVEM	S2,MSGBLK+3		;No
	$TEXT	(,<^M^J^7/MSGBLK+0/^W/MSGBLK+1/^I/@MSGBLK+2/^I/@MSGBLK+3/^7/MSGBLK+4/>)
	$RET				;Return
SUBTTL	Messages


$MSGT	?,CME,<Command error - ^T/(T1)/>,<
	An incorrect command has been entered.>

$MSGT	?,EFO,<Error from ORION - ^T/(P2)/>,<
	ORION has detected an error.>

$MSGT	?,EPM,<Error while parsing message>,<
	The only legal terminators are ESCape and
	carriage return.>

$MSGT	%,NHA,<No help available>,<
	HLP:PLEASE.HLP cannot be found.>

$MSGT	%,NOP,<No operator in attendance>,<
	The system is unattended. You message will be
	sent however.>

$MSGT	<[>,OPN,<Operator at ^N/OPRNOD/ has been notified at ^C/[-1]/>,<
	Your message has been sent the the operator.>

$MSGT	?,SSE,<Switch syntax error>,<
	The command contained either an illegal switch,
	or a switch delimiter (a slash) with no switch
	name following it.>

$MSGT	?,UMO,<Unrecognized message from ORION>,<
	An unknown message type was received from
	ORION instead of the expected operator
	response message. There could be a version
	skew between PLEASE and ORION.>

$MSGT	?,NIN,<Node ^T/ATMBUF/ is not in the network or was specified
	without trailing double colon>,<The value of the /NODE: switch does
	not correspond to a network node.>

$MSGT	?,SUT,<Switch used twice - ^T/ATMBUF/>,<A switch can
	only be used once in a given command.>

$MSGT	?,BHR,<Bad help request, use PLEASE /HELP>,<An attempt
	was made to use the /HELP switch with other text.>

$MSGT	%,MTL,<Message too long - Will be truncated and sent>,<Your
	message exceeded the maximum numbers of characters allowed.
	It will be sent incomplete.>
	SUBTTL	The end

	END	PLEASE