Google
 

Trailing-Edge - PDP-10 Archives - T10_704_DECNET_3-31-88 - 10,7/netgen/ngndia.mac
There are 7 other files named ngndia.mac in the archive. Click here to see a list.
	TITLE	NGNDIA  --  Perform configuration dialog
;		======	    ----------------------------
;

	SEARCH	NGNMAC

	INIGEN (NGNDIA)			; Initialize GLXLIB assembly options


	IFNDEF FT.NET, FT.NET==-1

TOPS10 <IFNDEF FT.X25, <FT.X25==-1>>
TOPS20 <IFNDEF FT.X25, <FT.X25== 0>>


TOPS10 <IFE <FT.NET!FT.X25>,	<FT.NET==-1
				 FT.X25==-1>>

TOPS20 <IFE <FT.NET!FT.X25>,	<FT.NET==-1
				 FT.X25== 0>>
;
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1980,1981,1982,1985,1986.  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 WHICH IS NOT SUPPLIED BY DIGITAL.
;
;  NGNDIA - Network configurator dialog module
;
;++
; FACILITY:  Dialog for network configuration
;
; FUNCTIONAL DESCRIPTION:
;
;   This   module   performs   the   NETGEN  dialog  for  network
;   configuration.  Control transfers here via the START command.
;   For  each  dialog  prompt, control transfers back to the main
;   command processing loop in NETGEN, and then  resumes  at  the
;   next dialog step in this module.
;
;   This  dialog sequence is intended to complete the minimum set
;   of NETGEN commands required to configure a runnable node.
;
;--



	SUBTTL	Parser Argument Blocks for Dialog
;		---------------------------------
;

PAB.NT::$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \Node type:  \]
	$SET	PAR.TB,,PDB.NT
	$SET	PAR.SM,,<[
		$CALL	P$KEYW##
		MOVEM	S1,NODTYP##
		$RETT]>
	$EOB
PAB.NA:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(ENTEXE##,DN500##)
	$SET	PAR.PM,,[ASCIZ \Node name:  \]
	$SET	PAR.TB,,PDB.NA
	$SET	PAR.SM,,STRPRM
	$EOB
PAB.NU:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(ENTEXE##,DN502##)
	$SET	PAR.PM,,[ASCIZ \Node address:  \]
	$SET	PAR.TB,,PDB.NU
	$SET	PAR.SM,,STRPRM
	$EOB
BP1110:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(MODXPR##,XP1110##)
	$SET	PAR.PM,,[ASCIZ \X.25 Network name:  \]
	$SET	PAR.TB,,PP1110
	$SET	PAR.SM,,STRPRM
	$EOB
PAB.TP:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(ENTEXE##,DNS1##)
	$SET	PAR.PM,,[ASCIZ \Transmit password:  \]
	$SET	PAR.TB,,PDB.TP
	$SET	PAR.SM,,STRPRM
	$EOB
PAB.DT:	$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \What DTE port number is used for this DN20:  \]
	$SET	PAR.TB,,PDB.DT
	$SET	PAR.SM,,GETDTE
	$EOB
PAB.XT:	$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \What DTE port number is used for this node:  \]
	$SET	PAR.TB,,PDB.XT
	$SET	PAR.SM,,GETDTE
	$EOB
GETDTE:	$CALL	P$NUM##
	MOVEM	S1,UNTNUM##
	$RETT
PAB.DM:	$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \How many DMC11 lines are on this DN20:  \]
	$SET	PAR.TB,,PDB.DM
	$SET	PAR.SM,,GETCTL
	$EOB
PAB.XM:	$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \How many DMC11 lines are on this node:  \]
	$SET	PAR.TB,,PDB.XM
	$SET	PAR.SM,,GETCTL
	$EOB
PAB.DR:	$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \How many DMR11 lines are on this DN20:  \]
	$SET	PAR.TB,,PDB.DR
	$SET	PAR.SM,,GETCTL
	$EOB
PAB.XR:	$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \How many DMR11 lines are on this node:  \]
	$SET	PAR.TB,,PDB.XR
	$SET	PAR.SM,,GETCTL
	$EOB
PAB.KD:	$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \How many KDPs are on this DN20:  \]
	$SET	PAR.TB,,PDB.KD
	$SET	PAR.SM,,GETCTL
	$EOB
PAB.XD:	$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \How many KDPs are on this node:  \]
	$SET	PAR.TB,,PDB.XD
	$SET	PAR.SM,,GETCTL
	$EOB
GETCTL:	$CALL	P$NUM##			; Get number
	MOVEM	S1,CTLCNT#		; Save it
	$RETT

BCNAM:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(ENTCIR##)
	$SET	PAR.PM,,[ASCIZ \X.25 Circuit name:  \]
	$SET	PAR.TB,,PCNAM
	$SET	PAR.SM,,<[
		$CALL	GETCFM
		$RETIT
		$CALL	GETENT##
		$CALL	FNDENT##
		JUMPT	[$DEFFAIL(Circuit is already defined)]
		PJRST	ADDENT##]>
	$EOB

BC1120:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(ENTCIR##,XC1120##)
	$SET	PAR.PM,,[ASCIZ \DTE address:  \]
	$SET	PAR.TB,,PC1120
	$SET	PAR.SM,,STRPRM
	$EOB
BC1121:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(ENTCIR##,XC1121##)
	$SET	PAR.PM,,[ASCIZ \Channel for this DTE:  \]
	$SET	PAR.TB,,PC1121
	$SET	PAR.SM,,STRPRM
	$EOB

BS300:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(MODXSR##,XS300##,QUADST##)
	$SET	PAR.PM,,[ASCIZ \X.25 Destination name:  \]
	$SET	PAR.TB,,PS300
	$SET	PAR.SM,,<[
		$CALL	GETCFM
		$RETIT
		$CALL	GETQUA##
		$CALL	FNDQUA##
		JUMPT	[$DEFFAIL(Destination is already defined)]
		PJRST	ADDQUA##]>
	$EOB

BS320:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(MODXSR##,XS320##,QUADST##)
	$SET	PAR.PM,,[ASCIZ \Destination node:  \]
	$SET	PAR.TB,,PS320
	$SET	PAR.SM,,<[
		MOVEI	S1,XS320##	; Get destination node
	GETDN1:	MOVEM	S1,PRMBLK##
		$CALL	STRPRM
		$CALL	P$CFM##		; If line not terminated
		$RETIT			; then
		$CALL	P$KEYW##	; get parameter name keyword
		JRST	GETDN1]>	; and collect parameter data.
	$EOB

BS340:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(MODXSR##,XS340##,QUADST##)
	$SET	PAR.PM,,[ASCIZ \Destination object:  \]
	$SET	PAR.TB,,PS340
	$SET	PAR.SM,,STRPRM
	$EOB
BS350:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(MODXSR##,XS350##,QUADST##)
	$SET	PAR.PM,,[ASCIZ \Priority:  \]
	$SET	PAR.TB,,PS350
	$SET	PAR.SM,,STRPRM
	$EOB
BS351:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(MODXSR##,XS351##,QUADST##)
	$SET	PAR.PM,,[ASCIZ \Call mask:  \]
	$SET	PAR.TB,,PS351
	$SET	PAR.SM,,STRPRM
	$EOB
BS352:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(MODXSR##,XS352##,QUADST##)
	$SET	PAR.PM,,[ASCIZ \Call value:  \]
	$SET	PAR.TB,,PS352
	$SET	PAR.SM,,STRPRM
	$EOB
BS355:	$BUILD	PARSIZ
	$SET	PAR.PV,,PVLIST(MODXSR##,XS355##,QUADST##)
	$SET	PAR.PM,,[ASCIZ \Subaddresses:  \]
	$SET	PAR.TB,,PS355
	$SET	PAR.SM,,STRPRM
	$EOB

STRPRM:	$CALL	GETCFM			; Get parameter
	$RETIT
	MOVE	T1,PRMBLK##
	XCT	PRMDEF(T1)
	$RETIF
	PJRST	PRMSTR(T1)

GETCFM:	$CALL	P$CFM##			; Look for CR/LF
	MOVEM	TF,SAVCFM#		; and save result.
	$RET
CHKCFM:	MOVE	TF,SAVCFM#		; Get result of CR/LF check
	$RET

PAB.CI:	$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \Specify either DMC11 or DMR11:  \]
	$SET	PAR.TB,,PDB.CI
	$EOB
PAB.NN:	$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \Do you want to specify another node address?  \]
	$SET	PAR.TB,,PDB.YN
	$EOB
PAB.CR:	$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \Do you have a card reader on this DN200?  \]
	$SET	PAR.TB,,PDB.YN
	$EOB
PAB.LP:	$BUILD	PARSIZ
	$SET	PAR.PM,,[ASCIZ \Do you have a line printer on this DN200?  \]
	$SET	PAR.TB,,PDB.YN
	$EOB
PAB.SV:	$BUILD	PARSIZ
	$SET	PAR.SR,,<[ASCIZ \
\]>					; CR/LF sequence
	$SET	PAR.TB,,PDB.SV
	$EOB

	SUBTTL	PDBs - Parser Database Elements
;		-------------------------------
;

PDB.NT:	$INIT	(NTYPDB##)		; Node type

PDB.NA:	$INIT	(NNAPDB)		; Node name
NNAPDB:	$NOISE	(NNA.1,is)
NNA.1:	$FIELD	(NNA.2,<<Node Name, 1 to 6 alphanumeric characters>>,<$PREFILL(NNA.3),$ACTION(CHKNAM##)>)
NNA.2:	$CRLF	($ERRTXT (Specify 1 to 6 alphanumerics for the node name) )
NNA.3:	LOAD	T1,DN500##,PRSMIN	;Set minimum
	MOVEM	T1,NUMMIN##
	LOAD	T1,DN500##,PRSMAX	;and maximum.
	MOVEM	T1,NUMMAX##
	$RETT

PDB.NU:	$INIT	(NNUPDB)		; Node number
NNUPDB:	$NOISE	(NNU.1,is)
NNU.1:	$NUMBER	(CRLF,^D10,<<Node Address, XXXXX to YYYYY>>,<$PREFILL(NNU.2),$ACTION(CHKNUM##),$ERROR(NUMERR##)>)
NNU.2:	LOAD	T1,DN502##,PRSMIN	;Set minimum
	MOVEM	T1,NUMMIN##
	LOAD	T1,DN502##,PRSMAX	;and maximum.
	MOVEM	T1,NUMMAX##
	$CALL	NUMLIM##
	$RETT

PDB.TP:	$INIT	(NTPPDB)
NTPPDB:	$CTEXT	(CRLF,<<Transmit password - 1 to 8 alphanumeric characters>>,<$DEFAULT(DECNET20)>)

PDB.DT:	$INIT	(IDTE.1##)		; DTE number
PDB.XT:	$INIT	(IDTE.1##)		; DTE number

PDB.DM:	$INIT	(PD.DMC)		; Number of DMC11 lines
PDB.XM:	$INIT	(PD.DMC)		; Number of DMC11 lines
PD.DMC:	$NUMBER	(PD.DCR,^D10,<<Number of DMC11s, X to X>>,<$PREFILL(PDDMC1),$DEFAULT(0),$ACTION(CHKNUM##),$ERROR(NUMERR##)>)

PDB.DR:	$INIT	(PD.DMR)		; Number of DMR11 lines
PDB.XR:	$INIT	(PD.DMR)		; Number of DMR11 lines
PD.DMR:	$NUMBER	(PD.DCR,^D10,<<Number of DMR11s, X to X>>,<$PREFILL(PDDMR1),$DEFAULT(0),$ACTION(CHKNUM##),$ERROR(NUMERR##)>)

PDB.KD:	$INIT	(PD.KDP)		; Number of KDPs
PDB.XD:	$INIT	(PD.KDP)		; Number of KDPs
PD.KDP:	$NUMBER	(PD.DCR,^D10,<<Number of KDP11s, X to X>>,<$PREFILL(PDKDP1),$DEFAULT(0),$ACTION(CHKNUM##),$ERROR(NUMERR##)>)
PD.DCR:	$CRLF	($ERRTXT(Specify a decimal number))

PDDMC1:	MOVEI	T1,NUMDMC##
	PJRST	PDDV1
PDDMR1:	MOVEI	T1,NUMDMX##
	SUB	T1,DMXNUM##
	SKIPN	PRVLDG##
	 CAILE	T1,NUMDMR##
	  MOVEI	T1,NUMDMR##
	PJRST	PDDV1
PDKDP1:	MOVEI	T1,NUMKDP##
PDDV1:	SETZM	NUMMIN##		;Set minimum
	MOVEM	T1,NUMMAX##		;and maximum.
	$CALL	NUMLIM##
	$RETT

PCNAM:	$INIT	(PCNAM1,$ACTION(ENTLIM))

TOPS20 <PCNAM1:	$FIELD	(CRLF##,<<Circuit Id>>,<$DEFAULT(),$FLAGS(CM%BRK),$BREAK(LITBRK##),$ALTERNATE(SKPENT),$ACTION(CHKFLD##)>)
>
TOPS10 <PCNAM1:	$FIELD	(CRLF##,<<Circuit Id>>,<$FLAGS(CM%BRK),$BREAK(LITBRK##),$ALTERNATE(SKPENT),$ACTION(CHKFLD##)>)
>
PC1120:	$INIT	(PC120A,$ACTION(PRMLIM))
PC120A:	$FIELD	(CRLF##,<<Decimal DTE Address>>,<$FLAGS(CM%BRK),$BREAK(DECBRK##),$ACTION(CHKFLD##)>)
PC1121:	$INIT	(NUMPDB##,$ACTION(PRMLIM))

PP1110:	$INIT	(PP110A,$ACTION(PRMLIM))
PP110A:	$FIELD	(CRLF##,<<Text, Network name>>,<$ACTION(CHKNAM##)>)
PS300:	$INIT	(PS300A,$ACTION(QUALIM))
TOPS20 <PS300A:	$FIELD	(CRLF##,<<Destination Name String>>,<$DEFAULT(),$ALTERNATE(SKPQUA),$ACTION(CHKNAM##)>)
>
TOPS10 <PS300A:	$FIELD	(CRLF##,<<Destination Name String>>,<$ALTERNATE(SKPQUA),$ACTION(CHKNAM##)>)
>
PS320:	$INIT	(PS320A,$ACTION(PRMLIM))
PS320A:	$NUMBER	(PS320C,^D10,<<Node number, XXXXX to YYYYY>>,<$PREFILL(NODLIM##),$ACTION(CHKNUM##),$ERROR(NUMERR##)>)
PS320B:	$FIELD	(PS320C,<<Node name, 1 to 6 alphanumeric characters>>,<$ACTION(CHKNAM##)>)
PS320C:	$KEYDSP	(PS320D,<$ALTERNATE(SKPPRM),$ACTION(PS320G)>)
PS320D:	$STAB
	DSPTAB	(PS320E,XS332##,<Account>)
	DSPTAB	(PS320F,XS331##,<Password>)
	DSPTAB	(PS320E,XS330##,<User>)
	$ETAB
PS320E:	$CTEXT	(PS320C,<<Text, 1 to 16 characters>>,<$FLAGS(CM%BRK),$BREAK(LITBRK##),$ACTION(CHKTXT##)>)
PS320F:	$CTEXT	(PS320C,<<Text, 1 to 8 characters>>,<$FLAGS(CM%BRK),$BREAK(LITBRK##),$ACTION(CHKTXT##)>)
PS320G:	$CALL	A$KEYW##
	MOVEM	S1,PRMBLK##
	PJRST	PRMLIM
PS340:	$INIT	(PS340A,$ACTION(PRMLIM))
PS340A:	$NUMBER	(CRLF##,^D10,<<Object number, XXXXX to YYYYY>>,<$PREFILL(OBJLIM##),$ALTERNATE(PS340B),$ACTION(CHKNUM##)>)
PS340B:	$FIELD	(CRLF##,<<Object name >>,<$PREFILL(OBJLIM##),$ACTION(CHKNAM##)>)
PS350:	$INIT	(PS350A,$ACTION(PRMLIM))
;******************************************************************************
;*****         Note: default should not be hard-coded like this           *****
;******************************************************************************
PS350A:	$NUMBER	(CRLF##,^D10,<<Number, XXXXX to YYYYY>>,<$PREFILL(NUMLIM),$DEFAULT(2),$ACTION(CHKNUM),$ERROR(NUMERR)>)
PS351:	$INIT	(PS351A,$ACTION(PRMLIM))
TOPS20 <PS351A: $FIELD	(CRLF##,<Hexadecimal Mask>,<$FLAGS(CM%BRK),$BREAK(HEXBRK##),$DEFAULT(),$ALTERNATE(SKPPRM),$ACTION(CHKHEX##)>)
>
TOPS10 <PS351A: $FIELD	(CRLF##,<Hexadecimal Mask>,<$FLAGS(CM%BRK),$BREAK(HEXBRK##),$ALTERNATE(SKPPRM),$ACTION(CHKHEX##)>)
>
PS352:	$INIT	(PS352A,$ACTION(PRMLIM))
PS352A: $FIELD	(CRLF##,<Hexadecimal Data>,<$FLAGS(CM%BRK),$BREAK(HEXBRK##),$ACTION(CHKHEX##)>)
PS355:	$INIT	(PS355A,$ACTION(PRMLIM))
TOPS20  <PS355A:	$DIGIT	(PS355B,^D10,<<Number, XXXXX to YYYYY>>,<$PREFILL(NUMLIM##),$DEFAULT(),$ALTERNATE(SKPPRM),$ACTION(CHKNUM##),$ERROR(NUMERR##)>)
>
TOPS10 <PS355A:	$DIGIT	(PS355B,^D10,<<Number, XXXXX to YYYYY>>,<$PREFILL(NUMLIM##),$ALTERNATE(SKPPRM),$ACTION(CHKNUM##),$ERROR(NUMERR##)>)
>
PS355B:	$TOKEN	(PS355C,<->,<$ALTERNATE(CRLF##)>)
PS355C:	$DIGIT	(CRLF##,^D10,<<Number, XXXXX to YYYYY>>,<$PREFILL(NUMLIM##),$ACTION(CHKNUM##),$ERROR(NUMERR##)>)
SKPENT:
SKPQUA:	$CRLF	;continue dialog with carriage return
SKPPRM:	$CRLF	;leave undefined with carriage return

ENTLIM:	MOVE	S2,ENTBLK##
	JRST	PRMLIM+1
QUALIM:	SKIPA	S2,QUABLK##
PRMLIM:	MOVE	S2,PRMBLK##
	LOAD	S1,(S2),PRSMIN
	MOVEM	S1,NUMMIN
	LOAD	S1,(S2),PRSMAX
	MOVEM	S1,NUMMAX
	$RETT

PDB.CI:	$INIT	(PD.CLI)		; DN200 comm line interface
PD.CLI:	$KEYDSP	(CIDSP,$ERRTXT(Specify either DMR11 or DMC11 -- not))
CIDSP:	$STAB				; DN200 Comm Interface
	 DSPTAB	(PD.CIS,1,<DMC11>)
	 DSPTAB	(PD.CIR,0,<DMR11>)	;  dispatch table
	$ETAB
PD.CIS:	$CRLF	($ACTION ( [SETOM FLG.RS#
			    $RETT] ))
PD.CIR:	$CRLF	($ACTION ( [SETZM FLG.RS#
			    $RETT] ))

PDB.SV:	$INIT	(SAVPDB##)		; SAVE configuration

PDB.XX:	$INIT	(CRLF##)		; CRLF

PDB.YN:	$INIT	(PD.YNN)		; YES or NO   (NO default)

PDB.YS:	$INIT	(PD.YNY)		; YES or NO  (YES default)

;
;   Additional PDBs for YES / NO commands
;

PD.YNN:	$KEYDSP	(YNDSP,<$DEFAULT(No),$ERRTXT(Specify either YES or NO -- not)>)
PD.YNY:	$KEYDSP	(YNDSP,<$DEFAULT(Yes),$ERRTXT(Specify either YES or NO -- not)>)
YNDSP:	$STAB				; YES / NO dispatch table
	 DSPTAB	(PD.NO,0,<No>)
	 DSPTAB	(PD.YES,1,<Yes>)
	$ETAB
PD.NO:	$CRLF	($ACTION ( [SETZM FLG.YN#
			    $RETT] ))
PD.YES:	$CRLF	($ACTION ( [SETOM FLG.YN#
			    $RETT] ))
	SUBTTL	DIALOG --  NETGEN dialog procedure
;		======	   -----------------------
;
;   Here to perform the NETGEN dialog sequence.
;
;   Control transfers here via the entry for the START  command
;   in the command dispatch table (CMDVEC in NETGEN.MAC).

DIALOG::
IFN <FT.NET&FT.X25>,<
	PUSH	P,NODTYP##		; Save previous node type over init
>;end IFN FT.NET&FT.X25
	$CALL	NGINIT##		; Default initialization
	$CALL	NGIN2##			; And yet more initialization!
IFN <FT.NET&FT.X25>,<
	POP	P,NODTYP##		; Restore original node type
	SETZM	NOTSTA##		; Flag node type "typed in"
	JRST	D.NNAM			; Skip node type in START dialog
>;end IFN FT.NET&FT.X25

D.TYPE:					; Node type
	SETZB	S1,NODTYP##		; Check if there is a choice:
	MOVEI	S2,^D3			;  Three possibilities.
D.TYP1:	SKIPE	PRVLDG##(S2)		;  If enabled
	 AOJA	S1,[MOVEM S2,NODTYP##	;  then count and store.
		JRST .+1]
	SOJG	S2,D.TYP1		;  Do for 3, 2, and 1.
	SOJE	S1,D.NNAM		; If only one choice, it is found!
	MOVEI	S1,PAB.NT
	$CALL	NPARSE##

D.NNAM:	MOVEI	S1,PAB.NA		; Node name
	$CALL	NPARSE##

D.NNUM:	MOVEI	S1,PAB.NU		; Node number
	$CALL	NPARSE##
	LOAD	S1,@DN502##+PRMPTR
	CAMG	S1,NTPNN##		; Less than maximum address?
	  JRST	D.PSWD			;  If not,
	 EXT	<NTPNN>
	$TEXT  ,<
?This node address is greater than ^D/NTPNN/, the maximum
 number of nodes for a supported network configuration.
>
	MOVEI	S1,PAB.NN
	$CALL	NPARSE##
	MOVE	T1,FLG.YN#		; Pick up YES/NO flag
	JUMPN	T1,D.NNUM		;  Yes, try again

	MOVE	S1,NTPSLF##		; Set new
	MOVEI	T2,DN920##
	MOVEM	T2,PRMBLK##
	$CALL	PRMSTR(T2)		; MAXIMUM ADDRESS
	CALL	BLKCLC##		; Calculate new min block size
	CAIGE	S1,^D576
	 MOVEI	S1,^D576
	MOVEI	T2,DN931##
	MOVEM	T2,PRMBLK##
	$CALL	PRMSTR(T2)		; and set BUFFER SIZE
	 EXT	<NTPNN,NTPBLK>
	$TEXT  ,<
%In order to support this node, the following parameters have been set:
    MAXIMUM ADDRESS = ^D/NTPNN/
    BUFFER SIZE = ^D/NTPBLK/>
	LOAD	S1,DN931##+PRMPTR
	CAIG	S1,^D576
	CAIGE	S1,^D290
	$TEXT	,<%This system is not supported by DEC>
D.PSWD:	$TEXT	(,<>)			; Give CR LF
	MOVE	T1,NODTYP##
	CAIN	T1,NDN200##		; Is this a DN200?
	  PJRST	D.200			;  Yes,  Branch for DN200
	PJRST	D.20			;  No,  Branch for DN20 or x25

	SUBTTL	DN20 specific dialog
;		--------------------
;

D.20:					; Here to begin DN20 only stuff

D.XMTP:	MOVEI	S1,PAB.TP		; Transmit password
	$CALL	NPARSE##		;

	SETZM	FLG.CL#			; Indicate no comm lines yet

D.DTE:					; Here to specify DTE
	$CALL	DEVDTE##
	MOVEI	S1,PAB.DT
	MOVE	T1,NODTYP##
	CAIN	T1,NX25##		; Is this X25 ?
	 MOVEI	S1,PAB.XT		; YES, X25
	$CALL	NPARSE##
	SKIPN	PRVLDG##		; If privledged,
	 JRST	D.DTE2			; then
	MOVEI	S1,IDTES1##		; ask for COST.
	$CALL	DPARSE
D.DTE2:	$CALL	ADDDTE##

D.DMC:					; Here to specify number of DMCs
	$TEXT	(,<>)			; Give CR LF
	MOVEI	S1,NUMDMX##		; Max number of DMx11 devices
	$TEXT	(,<The total number of DMC11s and DMR11s must not exceed ^D/S1/>)
	MOVEI	S1,PAB.DM
	MOVE	T1,NODTYP##
	CAIN	T1,NX25##		; Is this X25 ?
	 MOVEI	S1,PAB.XM		; YES, X25
	$CALL	NPARSE##
	SKIPN	CTLCNT#			; Save it
	 JRST	D.DMR
	$CALL	DEVDMC##

D.DMC1:	SKIPN	PRVLDG##		; If privledged,
	 JRST	D.DMC2			; then
	MOVEI	S1,IDMCS2##		; ask for duplex.
	$CALL	DPARSE##
D.DMC2:	MOVEI	S1,IDMCS1##		; Ask for cost.
	$CALL	DPARSE##
	$CALL	ADDDMC##		; Include next DMC
	SETOM	FLG.CL#			; Indicate comm line specified
	AOS	CTLNUM##
	SOSE	CTLCNT#			; Loop for all DMCs
	 JRST	D.DMC1

D.DMR:					; Here to specify number of DMRs
	MOVE	S1,DMXNUM##		; Number of DMx11s specified
	SKIPN	PRVLDG##
	 CAIGE	S1,NUMDMX##		; Max number of DMx11 devices
	  SKIPA
	   JRST	D.KDP			;  No more allowed
	$TEXT	(,<>)			; Give CR LF
	MOVEI	S1,PAB.DR
	MOVE	T1,NODTYP##		; Get node type
	CAIN	T1,NX25##		; Is this X25 ?
	 MOVEI	S1,PAB.XR		; YES
	$CALL	NPARSE##
	SKIPN	CTLCNT#			; Save it
	 JRST	D.KDP
	$CALL	DEVDMR##

D.DMR1:	MOVEI	S1,IDMRS2##
	$CALL	DPARSE##
	MOVEI	S1,IDMRS1##
	$CALL	DPARSE##
	$CALL	ADDDMR##		; Include next DMR
	SETOM	FLG.CL#			; Indicate comm line specified
	AOS	CTLNUM
	SOSE	CTLCNT#			; Loop for all DMRs
	 JRST	D.DMR1

D.KDP:					; Here to specify number of KDPs
	$TEXT	(,<>)			; Give CR LF
	MOVEI	S1,PAB.KD
	MOVE	NODTYP##
	CAIN	NX25##			; X.25 node?
	 MOVEI	S1,PAB.XD		; YES
	$CALL	NPARSE##
	SKIPN	CTLCNT#			; and skip KDPs
	 JRST	D.KDP9			; if none requested.
	$CALL	DEVKDP##

D.KDP1:	MOVEI	S1,IKDPS1##		; Number of DUP lines on KDP
	$CALL	NPARSE##
	SETZM	UNTNUM##		; Start on unit 0.
D.KDP2:	$CALL	DEVUNT##
	LOAD	S1,DL1111##,PRMINI	; Default duplex to FULL
	MOVEM	S1,DUPDUP##(I1)
	LOAD	S1,DL1112##,PRMINI	; Default line protocol to DDCMP-DMC
	MOVEM	S1,LNTYP##(I1)
	MOVE	NODTYP##
	CAIE	NX25##
	 JRST	D.KDP3
	MOVEI	S1,IKDPXX##		; Prompt for line type
	$CALL	DPARSE
D.KDP3:	MOVEI	S1,IKDPS2##		; Maximum baud rate
	$CALL	DPARSE##
	$CALL	DEVUNT##
	MOVE	LNTYP##(I1)
	CAIE	^D4
	 JRST	D.KDP6
	SKIPN	PRVLDG##
	 JRST	D.KDP4
	MOVEI	S1,IKDPSD##		; Duplex
	$CALL	DPARSE##
D.KDP4:	MOVEI	S1,IKDPS7##		; Cost
	$CALL	DPARSE##
	JRST	D.KDP8
D.KDP6:	MOVEI	MODXPR##		; Now to MODULE X25-PROTOCOL
	MOVEM	ENTBLK##
	MOVEI	QUADTE##		; for DTE qualifier.
	MOVEM	QUABLK##
	MOVEI	XP1100##		; DTE parameter.
	MOVEM	PRMBLK##
	MOVEI	S1,IKDPX2##		; KDP DTE Address prompt
	$CALL	DPARSE
	MOVEI	XP1130##		; CHANNELS parameter.
	MOVEM	PRMBLK##
	MOVEI	S1,IKDPX4##		; KDP DTE Channel range prompt
	$CALL	DPARSE
	SETZM	QUABLK##		; Back to
	SETZM	ENTBLK##		; devices.
D.KDP8:	$CALL	ADDKDP##
	AOS	S1,UNTNUM##
	SETOM	FLG.CL#			; Indicate comm line specified
	$CALL	DEVCTL##
	CAMGE	S1,KDPLNM##(I1)		; All DUP lines done?
	  JRST	D.KDP2			; No, loop for more DUP lines
	AOS	KDPNUM##
	AOS	CTLNUM##
	SOSE	CTLCNT#			; Loop for all KDPs
	 JRST	D.KDP1

D.KDP9:	SKIPN	FLG.CL#			; If no comm line specified
	  JRST	[$TEXT	,<?You have not specified any communications lines.>
		 JRST	D.DMC]
	SUBTTL	X25 Circuit dialog
;		------------------
;
D.CKT:	MOVE	NODTYP##
	CAIN	NX25##
	 SKIPN	PRVLDG##
	  JRST	D.NET
	$TEXT  ,<>
D.CKT1:	MOVE	@ENTCIR##+ECUR
	CAMN	ENTCIR##+EMAX
	 JRST [	$TEXT	,<%No room for more circuits>
		JRST	D.NET]
	MOVEI	S1,BCNAM		; CIRCUIT
	$CALL	NPARSE##
	$CALL	CHKCFM			; If CR/LF given
	JUMPT	D.NET			;  then quit.
	MOVEI	S1,BC1120		; DTE
	$CALL	NPARSE##
	MOVEI	S1,BC1121		; CHANNEL
	$CALL	NPARSE##
	JRST	D.CKT1
;
;   X.25 Network name
;
D.NET:	MOVE	NODTYP##
	CAIE	NX25##
	 JRST	D.DST
	$TEXT  ,<>
	MOVEI	S1,BP1110
	$CALL	NPARSE##
	SUBTTL	X25 Destination dialog
;		----------------------
;
D.DST:	MOVE	NODTYP##
	CAIE	NX25##
	 JRST	D.FIN
	$TEXT  ,<>
D.DST1:	MOVE	@QUADST##+ECUR
	CAMN	QUADST##+EMAX
	 JRST [	$TEXT	,<%No room for more destinations>
		JRST	D.FIN]
        CAMN    XTPDST##                  ; Compare with current MAX DESTINATIONS
	 JRST [ $TEXT   ,<%Exceeded maximum destinations so incrementing>
                AOS     XTPDST##
                JRST D.DST1]
	MOVEI	S1,BS300		; DESTINATION
	$CALL	NPARSE##
	$CALL	CHKCFM			; If CR/LF given
	JUMPT	D.FIN			;  then quit.
	MOVEI	S1,BS320		; NODE
	$CALL	NPARSE##
	MOVEI	S1,BS340		; OBJECT
	$CALL	NPARSE##
	MOVEI	S1,BS350		; PRIORITY
	$CALL	NPARSE##
	MOVEI	S1,BS351		; CALL MASK
	$CALL	NPARSE##
	$CALL	CHKCFM			; If none given
	JUMPT	D.DST2			;  then skip
	MOVEI	S1,BS352		; CALL VALUE
	$CALL	NPARSE##
D.DST2:	MOVEI	S1,BS355		; SUBADDRESSES
	$CALL	NPARSE##
	JRST	D.DST1
	SUBTTL	DN200 specific dialog
;		---------------------
;

D.200:					; Here to begin DN200 only stuff

D.CDR:	MOVEI	S1,PAB.CR		; Here to specify CR on DN200
	$CALL	NPARSE##
	MOVE	T1,FLG.YN#		; Pick up YES/NO flag
	JUMPE	T1,D.LPT		;  No, no card reader
	$CALL	CDRINC##		;  Yes, include a line printer
D.LPT:	$TEXT	(,<>)			; Give CR LF
	MOVEI	S1,PAB.LP		; Here to specify LP on DN200
	$CALL	NPARSE##
	MOVE	T1,FLG.YN#		; Pick up YES/NO flag
	JUMPE	T1,D.CLI		;  No, no line printer
	$CALL	INLINE##		;  Yes, include a line printer

D.CLI:					; Here to specify communication
					;  line interface
	$TEXT	(,<
What is the communications line interface on the DN200?>)

	MOVEI	S1,PAB.CI
	$CALL	NPARSE##
	MOVE	T1,FLG.RS#		; Pick up DMR/DMC flag
	JUMPN	T1,D.FIN		; Branch for DMC (default)
					; If DMR,
	$CALL	DEVDMC##		; Exclude DMC11 number 0
	$CALL	DELDMC##
	$CALL	DEVDMR##		; Include DMR11 number 0
	LOAD	S1,DC900##,PRMINI
	MOVEM	S1,DMRCST##+0
	LOAD	S1,DL1111##,PRMINI
	MOVEM	S1,DMRDUP##+0
	$CALL	ADDDMR##
	
	SUBTTL	Dialog termination
;		------------------
;

D.FIN:					; Here to terminate dialog
	$TEXT	(,<>)			; Give CR LF

	MOVEI	S1,PAB.SV		; Simulate a "SAVE" command
	$CALL	NPARSE##
	$CALL	SAVER##			; Save configuration
	$CALL	FINISH##		; FINISH configuration

IFE FT.NET, <$TEXT (,<
[Configuration complete]
 Type SAVE and FINISH after any additional changes
 Type EXIT to terminate X25GEN
>)>;end IFE FT.NET

IFN FT.NET, <$TEXT (,<
[Configuration complete]
 Type SAVE and FINISH after any additional changes
 Type EXIT to terminate NETGEN
>)>;end IFN FT.NET

	$RETT				; Return to topmost command loop

	END