Google
 

Trailing-Edge - PDP-10 Archives - TOPS-20_V6.1_DECnetDistr_7-23-85 - tools/setnod.mac
There are 3 other files named setnod.mac in the archive. Click here to see a list.
; UPD ID= 14, SNARK:<6.1.TOOLS-TAPE>SETNOD.MAC.3,   4-Feb-85 11:07:42 by GLINDELL
;KL2102:<LSCSNET>SETNOD.MAC.2 18-Jan-85 11:50:17, Edit by GMAROTTA
; Add LIST command to display nodes in internal node table.
; UPD ID= 25, SNARK:<6.1.UTILITIES>SETNOD.MAC.4, 13-Aug-84 10:14:36 by GLINDELL
;Make default file spec be SYSTEM:NODE-DATA.BIN, not PS:<OPERATOR>
; UPD ID= 17, SNARK:<6.1.UTILITIES>SETNOD.MAC.3, 3-Jul-84 14:28:06 by GLINDELL
;Type out error message if INSERT fails to set all nodes
;WORK:<GLINDELL.MONITOR>SETNOD.MAC.27  7-Jun-84 13:53:27, Edit by GLINDELL
; Add GET/SAVE/INSERT commands. Change function of SET command.

	TITLE	SETNOD

	SEARCH	MACSYM,MONSYM	;GET SYMBOLS
	SALL			;NICE LOOKING MACROS

	VMAJOR==1		;MAJOR VERSION
	VMINOR==0		;MINOR VERSION
	VEDIT==101		;EDIT NUMBER
	VWHO==0			;WHO MODIFIED

;ACCUMULATORS:

	F=0			;FLAGS
	T1=1			;TEMPORARY AC'S
	T2=2
	T3=3
	T4=4
	N=7			;Safe place to save a number
	P1=10			;STRING POINTERS
	P2=11
	NP=12			;Node pointer
	TP=13			;temporary node pointer for LIST command
	P=17			;STACK

;DEFAULT PARAMETERS:

	PDLSIZ==50		;SIZE OF PUSHDOWN STACK
	TMPSIZ==100		;SIZE OF TEMPORARY BUFFER AREA
	TXTLEN==^D200		;SIZE OF COMMAND BUFFERS

	NODTAB==100000		;Start at page 100000
	NODTOP==677777		;End at page 677
	SUBTTL MACROS AND OPDEFS

	OPDEF	CALL	[PUSHJ P,]	;TO CALL A SUBROUTINE
	OPDEF	RET	[POPJ P,]	;TO RETURN
	OPDEF	PJRST	[JRST]		;PUSHJ/POPJ
	OPDEF	RETSKP	[JRST SKPRET]	;SKIP RETURN

	DEFINE	AA(NAME,DATA),<		;;MACRO FOR COMMAND TABLES
	XWD	[ASCIZ/NAME/],DATA
>

	DEFINE	TEXT(STRING),<		;;MACRO FOR ASCIZ TEXT
	XLIST
	ASCIZ	@STRING@
	LIST
>

	DEFINE	DIE(TEXT,FLAG<0>,ADDR<REEN>),<	;;MACRO FOR ERRORS

	JRST	[
IFN	<FLAG>,<
		HRROI T1,[ASCIZ/
? TEXT - /]
		HRROI	T4,ADDR
		JRST	DIEADR]
>

	IFE	<FLAG>,<
		HRROI T1,[ASCIZ/
? TEXT

/]
		MOVEI	T4,ADDR
		JRST	DIEADR]
>
>

	DEFINE	CMMD(ARG),<		;;MACRO TO DO A GENERAL COMMAND
	MOVEI T1,CMDBLK
	MOVEI	T2,ARG
	CALL	DOCMMD
>

	DEFINE	NOISE(TEXT),<		;;MACRO FOR NOISE
	MOVEI T1,CMDBLK
	MOVEI	T2,[ASCIZ/TEXT/]
	CALL	DONOIS
>

	DEFINE	CONFRM,<		;MACRO FOR CONFIRMING A LINE
	CALL	DOCNFM
>

	DEFINE	DECNUM,<		;MACRO FOR PARSING A DECIMAL NUMBER
	CALL	DODECN
>
	SUBTTL	COMMAND SCANNER AND INITIALIZATION

ENTRY:	JRST	START		;START ADDRESS
	JRST	REEN		;REENTER ADDRESS
	BYTE	(3)VWHO(9)VMAJOR(6)VMINOR(18)VEDIT ;VERSION

START:	RESET			;CLEAR EVERYTHING
	SETZB	F,ZERBEG	;CLEAR FLAGS AND FIRST ZERO AREA
	MOVE	T1,[XWD ZERBEG,ZERBEG+1] ;GET READY
	BLT	T1,ZEREND	;CLEAR SOME VARIABLES
	MOVEI NP,NODTAB		;Load node table address

REEN:	MOVE	P,[IOWD	PDLSIZ,PDL] ;SET UP STACK
	CALL	NEWCMD		;GO GET A SERIES OF COMMANDS
	JRST	REEN		;RESTART


NEWCMD:	MOVEM	P,SAVEP		;SAVE STACK FOR REPARSING
	MOVEI	T1,CMDBLK	;POINT TO COMMAND BLOCK
	CMMD	[FLDDB. (.CMINI)] ;INITIALIZE

NEWPAR:	MOVE	P,SAVEP		;RESTORE THE STACK
	MOVEI	T1,CMDBLK	;POINT TO THE COMMAND BLOCK
	CMMD	[FLDDB. (.CMKEY,,CMDTAB)] ;GET A COMMAND
	MOVE	T2,(T2)		;GET ADDRESS OF ROUTINE
	CALL	(T2)		;PROCESS THE COMMAND
	  JRST	NEWCMD		;AND GET A NEW COMMAND
	RET
	SUBTTL COMMAND TABLES


CMDTAB:	XWD	CMDLEN,CMDLEN		;HEADER
	AA	ENTER,[RET]	 	;ENTER NCP (A NO-OP)
	AA	EXIT,CMDXIT		;EXIT COMMAND
	AA	GET,CMDGET		;GET command
	AA	HELP,CMDHLP		;TYPE HELP MESSAGE
	AA	INSERT,CMDINS		;INSERT command
	AA	LIST,CMDLIS		;LIST command
	AA	RETURN,[RETSKP]		;EXIT PROGRAM
	AA	SAVE,CMDSAV		;SAVE command
	AA	SET,CMDSET		;SET NODE NAME COMMAND
	AA	TAKE,CMDTAK		;TAKE COMMAND

	CMDLEN==.-CMDTAB-1		;NUMBER OF COMMANDS

CMDNOD:	XWD	1,1			;SET NODE
	AA	NODE,0

CMDNAM:	XWD	1,1			;SET NODE <NNN> NAME
	AA	NAME,0

LISLST:	XWD	4,4			;LIST command table
	AA	AREA,LISARE
	AA	KNOWN,LISKNN
	AA	NODE,LISNOD
	AA	TOTAL,LISTOT

KNOLIS:	XWD	1,1			;LIST KNOWN NODES
	AA	NODES,0
	SUBTTL	THE SIMPLE COMMANDS

CMDXIT:	NOISE	(FROM PROGRAM)	;DO NOISE
	CONFRM			;CONFIRM THE LINE
	HALTF			;HALT
	RET

CMDHLP:	NOISE	(WITH PROGRAM)	;DO NOISE
	CONFRM			;CONFIRM THE LINE
	HRROI	T1,HLPTXT	;POINT TO HELP MESSAGE
	PSOUT			;TYPE IT
	RET			;DONE
	SUBTTL	TAKE command

CMDTAK:	NOISE	(COMMANDS FROM FILE) ;DO NOISE
	CMMD	[FLDDB. (.CMIFI)] ;TAKE INPUT FROM A FILE
	MOVEM	T2,JFNTAK	;SAVE TAKE FILE JFN
	CONFRM			;CONFIRM THE LINE
	HRRZ	T1,JFNTAK	;MOVE JFN FOR OPENF
	MOVX	T2,<7B5+OF%RD>	;OPEN THE FILE
	OPENF
	  ERJMP	ERRTAK		;JUMP ON ERROR
	HRL	T1,T1		;SET AS PRIMARY INPUT JFN
	HRRI	T1,<.NULIO>	;NULL OUTPUT
	MOVEM	T1,CMDBLK+.CMIOJ;INPUT / OUTPUT JFNS
	CALL	NEWCMD		;DO A SERIES OF COMMANDS
	MOVX	T2,<XWD .PRIIN,.PRIOU> ;SET BACK TO TTY
	MOVEM	T2,CMDBLK+.CMIOJ;INPUT / OUTPUT JFNS
	RET			;RETURN
	SUBTTL	GET command

CMDGET:	NOISE (NODE DEFINITIONS FROM FILE)
	MOVX T1,GJ%OLD		;Old file
	MOVEM T1,JFNBLK+.GJGEN	; in flags word
	HRROI T1,[ASCIZ /SYSTEM/] ;From SYSTEM:
	MOVEM T1,JFNBLK+.GJDEV	; is default device
	SETZM T1,JFNBLK+.GJDIR	; No default directory
	HRROI T1,[ASCIZ /NODE-DATA/] ;NODE-DATA
	MOVEM T1,JFNBLK+.GJNAM	; is default NAME
	HRROI T1,[ASCIZ /BIN/]	; BIN
	MOVEM T1,JFNBLK+.GJEXT	;  is default extension
	CMMD [FLDDB. (.CMFIL,,,,<SYSTEM:NODE-DATA.BIN>)]
	MOVEM T2,JFNBIN		;Save JFN
	CONFRM			;Now confirm
	MOVE T1,JFNBIN		;Get JFN of data file
	MOVX T2,FLD(^D36,OF%BSZ)!OF%RD	;36-bit bytes, read access
	OPENF%			;Open it
	 ERJMP [DIE (<Couldnt open data file>,1)]
	MOVE T2,[XWD 1,.FBSIZ]	;Read byte count
	MOVEI T3,FDBBLK		;Put into FDBBLK
	GTFDB%			;Read..
	MOVE T1,FDBBLK		;Get byte count
	ADD T1,NP		;Add node table address
	CAIL T1,NODTOP		;Do we have space to read all of the file?
	DIE (<Not enough space to read all data file>)
	MOVE T1,JFNBIN		;Get JFN
	MOVE T2,[POINT 36,(NP)]	;Where to store data
	MOVN T3,FDBBLK		;Read exactly all of file
	SIN%			;Here we go..
	ADD NP,FDBBLK		;Add # of words in table
	MOVE T1,JFNBIN		;Now
	CLOSF%			; close the file
	 TRN			;  and ignore error
	RET			;Done with this command
	SUBTTL	SAVE command

CMDSAV:	NOISE (CURRENT NODE DEFINITIONS IN FILE)
	MOVX T1,GJ%NEW!GJ%FOU	;New file + next generation
	MOVEM T1,JFNBLK+.GJGEN	; in flags word
	HRROI T1,[ASCIZ /SYSTEM/] ;From SYSTEM:
	MOVEM T1,JFNBLK+.GJDEV	; is default device
	SETZM T1,JFNBLK+.GJDIR	; No default directory
	HRROI T1,[ASCIZ /NODE-DATA/] ;NODE-DATA
	MOVEM T1,JFNBLK+.GJNAM	; is default NAME
	HRROI T1,[ASCIZ /BIN/]	; BIN
	MOVEM T1,JFNBLK+.GJEXT	;  is default extension
	CMMD [FLDDB. (.CMFIL,,,,<SYSTEM:NODE-DATA.BIN>)]
	MOVEM T2,JFNBIN		;Save JFN
	CONFRM			;Now confirm
	MOVE T1,JFNBIN		;Get JFN
	MOVX T2,FLD(^D36,OF%BSZ)!OF%RD!OF%WR ;36-bit bytes, read/write access
	OPENF%
	 ERJMP [DIE (<Couldnt open data file for write>,1)]
	MOVE T2,[POINT 36,NODTAB] ;Save from node table and forward
	MOVE T3,NP		;Get current pointer
	SUBI T3,NODTAB		; and subtract beginning to get # to transfer
	MOVNS T3		;Transfer exact # of bytes
	SOUT%			;Do it..
	MOVE T1,JFNBIN		;Get JFN
	CLOSF%			; and close the file
	 TRN			;  and ignore error
	RET			;Done with command
	SUBTTL	SET NODE NAME COMMAND

CMDSET:	SETZM	NODADR		;Start clean
	CMMD	[FLDDB. (.CMKEY,,CMDNOD)] ;GET A COMMAND
	DECNUM			;Get the area number maybe
	MOVE	N,T2		;Save it until we check for area number
	MOVEI	T2,TOKSTR	;See if there is a dot between two numbers
	HRROM	T2,TOKBLK+.CMDAT;SAVE AS DATA
	MOVEI	T2,TOKBLK	;POINT TO BLOCK
	COMND			;PARSE THE FUNCTION
	 ERJMP	BADCMD		;ERROR, GO COMPLAIN
	TXNE	T1,CM%NOP	;Did we get what we asked for?
	 JRST	NOAREA		;No, then assume no area
	DPB	N,NDAREA	;Save the area number
	DECNUM			;Get the node number
	DPB	T2,NODNUM	;Save the node number
	TRNA
NOAREA:	MOVEM	N,NODADR	 ;Save just a node number
	CMMD	[FLDDB. (.CMKEY,,CMDNAM)] ;GET A COMMAND
	CMMD	[FLDDB. (.CMTXT)] ;PARSE THE REST OF THE LINE
	CONFRM			;CONFIRM THE LINE
	MOVE	P1,[POINT 7,ATMBUF];Get node name
	CAIL NP,NODTOP		;Reached the top of data space
	DIE (Internal tables full,1)
	MOVE P2,[POINT 6,(NP)]	;Sixbit byte pointer to node space
	CALL	STORND		;go convert and store the node name
	MOVE T1,NODADR		;Get node address
	MOVEM T1,1(NP)		; and store in node table
	ADDI NP,2		;Update node pointer
	RET			;Done with command

; routine to store ASCII node name in sixbit

STORND:	MOVEI T3,6		;Max # in node name
	DO.			;LOOP over node name
	  SOJL T3,ENDLP.	; Exit if done 6 chars
	  ILDB T2,P1		; Get a byte
	  CAILE T2,"Z"		; Lower case?
	  SUBI T2," "		;  -yes, make upper case
	  CAIG T2," "		; End on space or less
	  EXIT.			;  ..
	  SUBI T2," "		; Make sixbit
	  IDPB T2,P2		; and store it
	  LOOP.
	ENDDO.
	RET			;done, return
	SUBTTL	LIST command

CMDLIS:	CMMD	[FLDDB. (.CMKEY,,LISLST)] ;get a command
	SETZM	AREFLG			;zero area command flag
	CAIE	NP,NODTAB		;is there data in the node table?
	JRST	LIS1			;yes, continue parsing LIST command
	TMSG	<
node table is empty>			;no, print error message
	RET				;and return
LIS1:	HRRZ	T1,(T2)			;get dispatch address
	CALL	(T1)			;dispatch to routine
	RET				;return after executing command

;FDBs for LIST NODE command, decimal number or text

LADDB:	FLDDB. (.CMNUM,<CM%SDH>,12,<decimal node address>,,LNDDB)
LNDDB:	FLDDB. (.CMTXT,<CM%SDH>,,<6 character node name>)

LISNOD:	CMMD	LADDB			;parse for argument to LIST NODE
	CAMN	T3,[LADDB,,LADDB]	;was argument a decimal number?
	JRST	LISADD			;yes, jump to find address routine
	CONFRM				;argument was text, confirm it
	MOVE	P1,[POINT 7,ATMBUF]	;source pointer to node name text
	MOVE	P2,[POINT 6,T4]		;destination pointer to T4
	SETZ	T4,			;start with a fresh register
	CALL	STORND			;convert and store the node name
	TMSG	<
>					;print a CRLF
	MOVEI	TP,NODTAB		;TP points to first word of table
NODLP:	CAMN	T4,(TP)			;does argument match table entry?
	JRST	FOUNOD			;yes, found a match, go display it
	ADDI	TP,2			;no, increment node table index
	CAME	TP,NP			;have we checked the whole talbe?
	JRST	NODLP			;no, check next node name entry
	TMSG	<requested node not defined> ;yes, inform user of no match
	RET				;and return

LISADD:	MOVE	N,T2			;save decimal argument
	MOVEI	T2,TOKSTR		;see if arg has a dot
	HRROM	T2,TOKBLK+.CMDAT	;save token in token block
	MOVEI	T2,TOKBLK		;point to block
	COMND				;parse the function
	ERJMP	BADCMD			;error, go complain
	TXNE	T1,CM%NOP		;did we get what we asked for?
	JRST	ADD1			;no, then assume no area
	DPB	N,[POINT 6,T4,25]	;yes, store area number in T4
	DECNUM				;parse remainder of argument
	DPB	T2,[POINT 10,T4,35]	;store it in T4 as the node number
	SKIPA				;skip the next instruction
ADD1:	MOVE	T4,N			;if no dot, store arg as node number
	CONFRM				;confirm it
	TMSG	<
>					;print a CRLF
	MOVEI	TP,NODTAB+1		;initialize TP with 2nd table entry
					;so we are looking at node addresses
ADDLP:	CAMN	T4,(TP)			;does argument match table entry?
	SOJA	TP,FOUNOD		;yes, point to node name and display
	ADDI	TP,2			;no, increment index by 2
	CAMG	TP,NP			;have we checked all addresses?
	JRST	ADDLP			;no, go check the next one
	TMSG	<requested address not defined> ;yes, inform user of no match
	RET				;and return

FOUNOD:	MOVE	T2,[POINT 6,(TP)]	;source pointer to matched node name
	MOVE	T3,[POINT 7,NODSTR]	;destination pointer to temp string
	CALL	TYPNOD			;print the node name
	MOVEI	T2,11			;get a TAB
	BOUT				;print it
	MOVE	T4,1(TP)		;get the corresponding node address
	MOVEM	T4,NODADR		;save it in temp address storage
	LDB	T2,NDAREA		;extract the area number
	MOVEI	T1,.PRIOU		;to tty
	MOVEI	T3,12			;in decimal
	NOUT%				;print it
	JFCL				;ignore error
	MOVEI	T2,"."			;get a dot
	BOUT%				;print it
	LDB	T2,NODNUM		;extract the node number
	NOUT%				;and print it
	JFCL				;ignore error
	TMSG	<

>					;print 2 CRLFs
	RET				;and return

LISARE:	SETOM	AREFLG			;set AREA flag
	MOVEI	T1,CMDBLK		;set up for parsing
	DECNUM				;a decimal number
	MOVE	N,T2			;save it
	CONFRM				;and confirm it
	CAIGE	N,2			;is the argument less than 2 ?
	JRST	TOOBG
	CAIG	N,^D63			;or greater than 63 ?
	JRST	LIS2			;no, continue with routine
TOOBG:	TMSG	<
area number not in range 2 to 63>	;yes, print error message
	RET				;and return
LIS2:	SETZ	P2,			;argument is good, zero node counter
	MOVEI	TP,NODTAB		;initialize table index
ARELP:	MOVE	T4,1(TP)		;get node address from table
	MOVEM	T4,NODADR		;move it to a storage word
	LDB	T2,NDAREA		;extract the area number from there
	CAMN	T2,N			;does it match the given argument?
	JRST	NXTARE			;yes, go display the area
	ADDI	TP,2			;no, increment index by 2
	CAME	TP,NP			;have we checked the entire table?
	JRST	ARELP			;no, check the next entry
	TMSG	<
no nodes defined in requested area>	;yes, inform user of no match
	RET				;and return

LISKNN:	CMMD	[FLDDB. (.CMKEY,,KNOLIS)] ;get NODES keyword
	CONFRM				;confirm it
	SETOM	ANUM			;initialize area num storage to -1
	SETZ	P2,			;zero node counter
	MOVEI	TP,NODTAB		;initialize index to first entry
ALLLP:	MOVE	T4,1(TP)		;get address from table
	MOVEM	T4,NODADR		;store it
	LDB	T2,NDAREA		;extract area number
	CAMN	T2,ANUM			;has the area number changed?
	JRST	NXTNOD			;no, display the next node
	SKIPE	AREFLG			;yes, is this AREA command?
	JRST	ALLDON			;yes, done, print total and return
NXTARE:	MOVEM	T2,ANUM			;save new area number
	CAIL	P1,5			;if at end of a row of nodes
	JRST	NOCR			;skip the extra CRLF
	TMSG	<
>					;else print the extra CRLF
NOCR:	TMSG	<
[AREA >					;print text for area number
	MOVEI	T1,.PRIOU		;to tty
	MOVE	T2,ANUM			;the current area number
	MOVEI	T3,12			;in decimal
	NOUT%				;print it
	JFCL				;ignore error
	TMSG	<]
>					;complete text string
	MOVEI	P1,5			;initialize the column counter
NXTNOD:	MOVE	T2,[POINT 6,(TP)]	;source pointer to node name
	MOVE	T3,[POINT 7,NODSTR]	;destination pointer to temp string
	CALL	TYPNOD			;print the node name
	MOVEI	T2,11			;get a TAB
	BOUT				;print it
	MOVEI	T1,.PRIOU		;to tty
	LDB	T2,NODNUM		;extract the node number
	MOVE	T3,[1B2+3B17+12B35]	;in decimal, 3 places, leading filler
	NOUT%				;print it
	JFCL				;ignore error
	AOS	P2			;increment node counter
	ADDI	TP,2			;increment table index
	CAML	TP,NP			;have we checked the entire table?
	JRST	ALLDON			;yes, print total and return
	SOJE	P1,ROWDON		;no, decrement column counter
	MOVEI	T2,11			;get a TAB if not at end of column
	BOUT				;and print it
	JRST	ALLLP			;then go back for more
ROWDON:	TMSG	<
>					;if column count is zero, print CRLF
	MOVEI	P1,5			;reset column count
	JRST	ALLLP			;and go back for more
ALLDON:	TMSG	<

TOTAL NODES FOUND: >			;print text at end of display
	MOVEI	T1,.PRIOU		;to tty
	MOVE	T2,P2			;get the node count
	MOVEI	T3,12			;in decimal
	NOUT				;print it
	JFCL				;ignore error
	TMSG	<

>					;print 2 CRLFs
	RET				;and return

LISTOT:	NOISE	(nodes defined in node table) ;some noise
	CONFRM				;confirm the LIST TOTAL command
	MOVE	P2,NP			;get the current end of table pointer
	SUBI	P2,NODTAB		;subtract beginning to get table size
	ASH	P2,-1			;divide by 2 for number of nodes
	JRST	ALLDON			;display it and return
	SUBTTL	INSERT command

CMDINS:	NOISE (CURRENT NODE DEFINITIONS)
	CONFRM			;Now confirm
	MOVE T1,NP		;Get NP
	SUBI T1,NODTAB		;Calculate # of words written to node table
	ASH T1,-1		; and make into # of nodes
	MOVEM T1,NODBLK+.NDNNN	;Store that in node block
	MOVEM T1,P1		; and save it in P1
	MOVEI T1,NODTAB		;Get address of node table
	MOVEM T1,NODBLK+.NDNTA	; and node table address too
	MOVEI T1,.NDINT		;Insert table function
	MOVEI T2,NODBLK		; and address of node block
	NODE%			;Do NODE% jsys
	 ERJMP [DIE(<NODE% jsys failed>,1)]
;The # of successfully processed nodes is returned in .NDNNN. Check if
;all nodes succeeded, and if not, type out an indication of what node failed
	MOVE T1,NODBLK+.NDNNN	;Get # of nodes done
	CAMG P1,T1		;Done all nodes?
	RET			; -yes, just return
	MOVE P1,T1		;Get index of failing node
	ASH P1,1		;Each entry is 2 words
	ADDI P1,NODTAB		; and add table address
	TMSG <
?SETNOD: Failed at node >
	MOVE T2,[POINT 6,(P1)]	;Point to sixbit node name
	MOVE T3,[POINT 7,NODSTR] ;Point to ASCIZ representation of node name
	CALL TYPNOD		;go convert and display node name
	TMSG <
>
	RET

; routine to display a sixbit node name

TYPNOD:	MOVEI T1,6		;Max chars in node name
	DO.			;LOOP over chars in node name
	  ILDB T4,T2		;  Get a byte
	  SKIPN T4		;  Exit on zero byte
	  EXIT.			;   ..
	  ADDI T4," "		;  Make ASCII
	  IDPB T4,T3		;  Store the ASCII byte
	  SOJG T1,TOP.		;  Loop back and do next char
	ENDDO.
	SETZ T4,		;Make ASCIZ string
	IDPB T4,T3		; and deposit zero byte
	MOVEI T1,.PRIOU		;To primary output
	HRROI T2,NODSTR		;Type node name
	SETZ T3,		;ASCIZ
	SOUT%
	RET
	SUBTTL HELP text


HLPTXT:	TEXT	<
Commands are the following:

	ENTER		Enter NCP.

	EXIT		Leave the program.

	GET		Get node definitions from file

	HELP		Type this text.

	INSERT		Insert current node definitions in monitor

	LIST		Display node definitions

	RETURN		Return from NCP.

	SAVE		Save node definitions in file

	SET		Set node name.

	TAKE		Take commands from file.

>
	SUBTTL	COMMAND JSYS SUBROUTINES


;SUBROUTINES TO DO THE COMND JSYS.  THESE ROUTINES RETURN TO THE COMMAND
;SCANNER FOR A NEW COMMAND IF AN ERROR OCCURS, UNLESS THE CALL TO THEM
;WAS FOLLOWED BY AN ERJMP, IN WHICH CASE IT IS TAKEN.


DODECN:	MOVEI	T2,[FLDDB. (.CMNUX,,^D10)] ;PARSE A DECIMAL NUMBER
	JRST	DOCMMD		;AND GO DO THE COMMD JSYS

DONOIS:	HRROM	T2,NOIBLK+.CMDAT;SAVE AS DATA
	MOVEI	T2,NOIBLK	;POINT TO BLOCK
	JRST	DOCMMD		;AND GO DO COMND JSYS

DOCNFM:	MOVEI	T2,[FLDDB. (.CMCFM)] ;GET CONFIRM FUNCTION
DOCMMD:	COMND			;PARSE THE FUNCTION
	  ERJMP	BADCMD		;ERROR, GO COMPLAIN
	TXNN	T1,CM%NOP	;PARSED CORRECTLY?
	  RET			;YES, DONE

BADCMD:	HLLZ	T2,(P)		;GET THE FOLLOWING INSTRUCTION
	TLZ	T2,(<@(17)>)	;REMOVE INDIRECT AND INDEX FIELDS
	CAMN	T2,[ERCAL]	;IS THIS AN ERCAL?
	JRST	@(P)		;YES, GO WHERE HE WANTS
	POP	P,T3		;NO, RESTORE ADDRESS
	CAMN	T2,[ERJMP]	;IS THIS AN ERJMP?
	JRST	@T3		;YES, GO TO IT
	JRST	ERROR		;NO, GO COMPLAIN
	SUBTTL	ERROR HANDLING

;HERE ON SOME ERRORS.  LOCATION DIEADR TYPES OUT A SPECIFIED TEXT AND
;A POSSIBLE ERROR MESSAGE, LOCATION ERROR JUST TYPES THE ERROR TEXT.
;MOST ERRORS GO TO THE REENTER ADDRESS OF THE PROGRAM.  LOCATION QUIT
;EXITS AND STAYS THAT WAY.

DIEADR:	MOVX	T2,<XWD .PRIIN,.PRIOU> ;SET BACK TO TTY
	MOVEM	T2,CMDBLK+.CMIOJ;INPUT / OUTPUT JFNS
	PSOUT			;TYPE THE STRING
	JUMPL	T4,ERRTYP	;GO TYPE ERROR STRING IF DESIRED
	JRST	(T4)		;OTHERWISE GO WHERE WE SHOULD


ERRTAK:	MOVX	T2,<XWD .PRIIN,.PRIOU> ;SET BACK TO TTY
	MOVEM	T2,CMDBLK+.CMIOJ;INPUT / OUTPUT JFNS
ERROR:	HRROI	T1,[ASCIZ/
? /]				;GET READY
	PSOUT			;TYPE BEGINNING OF STRING
	MOVEI	T4,[RET]	;SET UP ROUTINE TO GO TO

ERRTYP:	MOVEI	T1,.PRIOU	;PRIMARY OUTPUT
	HRLOI	T2,.FHSLF	;MY FORK, LAST ERROR
	SETZ	T3,		;INFINITE OUTPUT
	ERSTR			;TYPE THE STRING
	JFCL
	JFCL
	HRROI	T1,[ASCIZ/

/]				;GET ENDING TEXT
	PSOUT			;OUTPUT IT
	JRST	(T4)		;GO TO PROPER PLACE

QUIT:	RESET			;CLEAR ALL I/O
	HALTF			;STOP
	JRST	.-1		;STAY THERE

SKPRET:	AOS	(P)		;SKIP RETURN
	RET
	SUBTTL	INITIALIZED DATA

CMDBLK:	EXP	NEWPAR		;FLAGS AND REPARSE ADDRESS
	XWD	.PRIIN,.PRIOU	;INPUT AND OUTPUT JFNS <
	XWD	-1,[ASCIZ/SETNOD>/]	;CONTROL-R POINTER
	XWD	-1,TXTBUF	;POINTER TO TEXT BUFFER
	XWD	-1,TXTBUF	;POINTER TO CURRENT POSITION
	EXP	TXTLEN		;NUMBER OF CHARS IN BUFFER
	EXP	0		;COUNT
	XWD	-1,ATMBUF	;POINTER TO ATOM BUFFER
	EXP	TXTLEN		;NUMBER OF CHARACTERS IN BUFFER
	EXP	JFNBLK		;POINTER TO GTJFN BLOCK

JFNBLK:	EXP	0		;FLAGS AND GENERATION NUMBER
	XWD	.PRIIN,.PRIOU	;INPUT AND OUTPUT JFNS
	BLOCK	20		;NO DEFAULTS

NOIBLK:	FLDDB.	(.CMNOI)	;BLOCK FOR NOISE FUNCTION

TOKBLK:	FLDDB.	(.CMTOK)	;BLOCK FOR TOKEN FUNCTION
	BLOCK	1

TOKSTR:	ASCIZ/./

NODNUM:	POINT	10,NODADR,35	;Node number pointer
NDAREA: POINT	6,NODADR,25	;Area number pointer

	XLIST			;DUMP THE LITERALS
	LIT
	LIST
	SUBTTL	ZEROED DATA

	ZERBEG==.		;FIRST LOCATION TO ZERO ON STARTUP

PDL:	BLOCK	PDLSIZ		;STACK ROOM
SAVEP:	BLOCK	1		;STORAGE OF STACK POINTER
TXTBUF:	BLOCK	TXTLEN/5+1	;BUFFER FOR COMMAND JSYS
ATMBUF:	BLOCK	TXTLEN/5+1	;BUFFER FOR ATOM BUFFER
TEMP:	BLOCK	TMPSIZ		;TEMPORARY STORAGE

JFN:	BLOCK	1		;INPUT JFN
JFNOUT:	BLOCK	1		;OUTPUT JFN
JFNTAK:	BLOCK	1		;TAKE FILE JFN
JFNBIN:	BLOCK	1		;Binary file JFN

NODADR:	BLOCK	1		;NODE address
NODBLK:	BLOCK	2		;NODE% jsys block
NODSTR:	BLOCK	2		;Node name

FDBBLK:	BLOCK	1		;Read FDB information space
ANUM:	BLOCK	1		;temporay area number storage
AREFLG:	BLOCK	1		;flag denoting LIST AREA command
	ZEREND==.-1		;LAST LOCATION TO CLEAR

	END	<XWD 3,ENTRY>