Google
 

Trailing-Edge - PDP-10 Archives - BB-BT99V-BB_1990 - 10,7/anf10/dncnfg.p11
There are 5 other files named dncnfg.p11 in the archive. Click here to see a list.
.SBTTL	DNCNFG - CONFIGURATION   02 AUG 89

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
;  OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
; 1974,1975,1977,1978,1979,1980,1981,1982,1983,1984,1987,1988,1990.
;ALL RIGHTS RESERVED.

VRCNFG=077			;FILE EDIT NUMBER
EDIT=244			;DAS85 EDIT NUMBER (INCREMENT ONCE PER LOAD.
				; IF THIS AND THE DATE ARE THE ONLY CHANGES,
				; DON'T INCREMENT VRCNFG.)

;DAS85 VERSION NUMBER
		VDAS85=25
		VMIN=0		;MINOR VERSION
		VWHO=0		;WHO EDITED

;DAS85 SOFTWARE DATE (MUST REMAIN IN MIXED CASE!)
	DATE	02 Aug 89

; MARCH 12,1985 - DMCC/LAD/EJW/DRL/KR/DRL/DSW

;
;
	ZZ=-1

;THERE ARE SEVERAL STANDARD CONFIGURATION FEATURE TEST SWITCHES:
;	FT.D20, FT.D75, FT.D80, FT.D81, FT.D82, FT.D85, FT.D87, FT.87S, FT.200

; Arguments are:
;
; Option name, type of 11, DL10?, DTE?, type of synch, default no. sync,
;	CTY?, DH11?, DZ11?, no. CDR, no. LP11, no. LP20,
;	no. PTR, no. PTP, no. LT, not(KG11?), title

confg	D75,15,1,0,DS,4,0,0,0,0,0,0,0,0,0,0,<DC75NP - DECsystem-10 Synchronous front end>
confg	D80,40,0,0,DQ,4,1,0,0,1,1,0,0,0,0,0,<DN80 - DECsystem-10 Remote station>
confg	D81,40,0,0,DQ,4,1,1,0,0,0,0,0,0,0,0,<DN81 - DECsystem-10 Remote station>
confg	D82,40,0,0,DQ,4,1,1,0,1,1,0,0,0,0,0,<DN82 - DECsystem-10 Remote station>
confg	D85,40,1,0,DQ,4,0,0,0,0,0,0,0,0,0,0,<DN85 - DECsystem-10 Synchronous front end>
confg	D87,40,1,0,DQ,4,0,1,0,0,0,0,0,0,0,0,<DN87 - DECsystem-10 Synchronous front end>
confg	87S,40,0,1,DQ,4,0,1,0,0,0,0,0,0,0,0,<DN87S - DECsystem-10 Communications front end>
confg	D20,34,0,1,DUP,4,0,0,1,0,0,0,0,0,0,1,<DN20 - DECsystem-10 Communications Front End>
confg	D22,4,0,0,DMC,1,0,0,1,0,0,0,0,0,0,1,<DN22 - DECsystem-10 Remote Station>
confg	200,34,0,0,DMC,4,0,0,1,1,1,0,0,0,0,1,<DN200 - DECsystem-10 Remote Station>
.IIF NE ZZ,.ERROR	;FT.D## NOT DEFINED OR DOUBLY DEFINED
	SETUP		;SETUP PROCESSOR-DEPENDENT STUFF, ETC.


.IF NDF OURNNM
	OURNNM=77	;OUR NODE NUMBER
.PRINT	OURNNM	;OURNNM NOT DEFINED, DEFAULTS TO
.ENDC

	ND	SERIAL,OURNNM		; OUR SERIAL NUMBER


.IF NE FT.D75
	ND	FT.ANF,0		; BINARY TRANSFER NOT SUPPORTED
	ND	FT.BIG,0
	ND	SIDSIZ,6		;SIZE OF SOFTWARE ID
	ND	DATESZ,0		;SIZE OF DATE
.IFF
	ND	FT.ANF,1		;BINARY TRANSFER SUPPORTED
	ND	FT.BIG,1		;EXTRA CODE OK
	ND	SIDSIZ,24
	ND	DATESZ,24
.ENDC;.IF NE FT.D75
;SYNC LINE CONFIGURATION

NLIN=0

	SYNDEV	<DQ,DUP,DMC,DS,DU,DP,DV>

	SPCVFY=0		;DON'T EVER CHECK DQ11 SPECIAL CHAR STUFF
;ASYNC LINE CONFIGURATION

	ND	AL$SPD,<^D1200>		;DEFAULT SPEED FOR ASYNC DDCMP
		SPD	AL$SPD,AL$SPD
		AL.SPD=QQ

	ND	MP$SPD,<^D1200>		;DEFAULT MULTIPOINT SPEED
		SPD	MP$SPD,MP$SPD
		MP.SPD=QQ

	ND	RA$SPD,<^D300>		;DEFAULT ASCII SPEED
		SPD	RA$SPD,RA$SPD
		RA.SPD=QQ

	ND	RP$SPD,<^D1200>		;DEFAULT P-P RDE ("RDP") SPEED
		SPD	RP$SPD,RP$SPD
		RP.SPD=QQ

	M$MAX=0		;MAX LINES ON ANY MULTIDROP (INC'ED AS NEEDED)
;DEFINE DH11 LINE USAGE

.IF NE FTDH11
	DHCNFG				;SET DH11 LINE PARAMETERS
.IFF
	TTYDHN=0			;NO DH11 TTYS
	NADHLN=0			;NO DH11 ASYNC PTP DDCMP
	NDHMPT=0			;NO DH11 MULTIPOINT DDCMP
	NDHTRB=0			;NO DH11 MULTIPOINT TRIBUTARIES
	RDPDHN=0			;NO DH11 DDCMP RDX
	RDADHN=0			;NO DH11 ASCII RDX
	DHLINE=0			;NO DH11 LINES AT ALL
	NDH11=0				;NO DH11S AT ALL
	DH.MAX=0			;NO DH11S AT ALL
.ENDC; .IF NE FTDH11


;DEFINE DZ11 LINE USAGE

.IF NE FTDZ11
	DZCNFG				;SET DZ11 LINE PARAMETERS
.IFF
	TTYDZN=0			;NO DZ11 TTYS
	NADZLN=0			;NO DZ11 ASYNC PTP DDCMP
	NDZMPT=0			;NO DZ11 MULTIPOINT DDCMP
	NDZTRB=0			;NO DZ11 MULTIPOINT TRIBUTARIES
	RDPDZN=0			;NO DZ11 DDCMP RDX
	RDADZN=0			;NO DZ11 ASCII RDX
	DZLINE=0			;NO DZ11 LINES AT ALL
	NDZ11=0				;NO DZ11S AT ALL
	DZ.MAX=0			;NO DZ11S AT ALL
.ENDC; .IF NE FTDZ11


	ND	TTYN,<TTYDHN+TTYDZN>	;TOTAL ASCII COMMAND TERMINALS
	ND	NALINE,<NADHLN+NADZLN>	;TOTAL ASYNC P-P DDCMP LINES
	ND	NMPTL,<NDHMPT+NDZMPT>	;TOTAL MULTIPOINT DDCMP LINES
	ND	NTRIB,<NDHTRB+NDZTRB>	;TOTAL MULTIPOINT TRIBUTARIES
	ND	RDPN,<RDPDHN+RDPDZN>	;TOTAL P-P DDCMP RDX LINES
	ND	RDAN,<RDADHN+RDADZN>	;TOTAL ASCII RDX LINES

.IIF NE NMPTL!NTRIB,FT.MPT=1
.IIF NE NTRIB,FTTRIB=1
NTLINE=NLINES+NALINE+NTRIB+RDPN		;TOTAL LINE BLOCKS
;DDCMP-RELATED

	ND	FT3.02,1	;VERSION OF DDCMP SUPPORTED (3.02 IS DEFAULT)
	ND	FT.QSB,FT3.02	;IMPLEMENT THE QSYNC BIT
	ND	FTNSYN,14	;SET TO THE NUMBER OF SYNCH CHARS
				;IN A NORMAL SYNC SEQ (MIN=2)
	ND	FTQSYN,6	;SET TO THE NUMBER OF SYNCH CHARS IN A
				;SHORT SYNC SEQ (NORMALLY =2 (MIN=2))
	ND	FTASYN,2	;LENGTH OF SYNC SEQ FOR ASYNC LINES
				;THIS IS USED TO TIME RESPONSE OF MODEM
				;TO REQUEST TO SEND LEAD STATE
				;THE PROPER VALUE IS EQUAL TO
				; 1+(REQUIRED_DELAY*BAUD_RATE/10.)
	ND	FTSLCT,0	;SET =0 FOR ROUND ROBIN SELECTION (MULTIPOINT DDCMP)
				;SET =1 FOR WEIGHTED ROUND ROBIN SELECTION
				;SET =2 FOR DYNAMICALLY WEIGHTED ROUND ROBIN SELECTION
				;SET =3 FOR POLLING LIST SELECTION
	ND	FT.MPT,0	;SET TO NON ZERO IF DDCMP MULTIPOINT IS INCLUDED
	ND	FTTRIB,0	;SET TO NON ZERO IF DDCMP MULTIPOINT TRIBUTARY IS INCLUDED
	ND	FTRDED,0	;DON'T SAY WHEN MPT LINES GO OFFLINE
	ND	FTWHYD,0	;DON'T RECORD REASONS FOR DDCMP GOING OFFLINE

	ND	FT.RDM,0	;SET NONZERO FOR MULTIPOINT RDE ("RDM") DEVICE
	ND	FT.RDP,RDPN	;SET NONZERO FOR P-P RDE ("RDP")  DEVICE
	ND	FT.RDA,RDAN	;SET NONZERO FOR ASCII RDE ("RDA") DEVICE
	ND	FT.DDP,0	;SET NONZERO FOR DDP "DDCMP DEVICE"
	ND	FT.SLB,0	;IF NON ZERO, OMIT STATS FROM LINE BLOCKS
	ND	FTSILO,0	;DH11 SILO ALARM LEVEL
				;MUST BE POWER OF TWO AND .LE. 64.
				;FOR VT100 SUPPORT (FAST XON-XOFF,
				;FTSILO MUST BE ZERO.
.IIF GE FTSILO-20,FTSILO=20
	ND	OPN.TM,7	;DEFAULT TIME TO CLOSE DOWN ON FRAMING ERROR
				;(8 BITS)POS=# OF JIFFIES, NEG=# OF SECONDS
				;ASSUME ABOUT 100+ MS
	ND	FT.HLD,0	;DEFAULT THE INPUT HOLDING CODE OFF
;MISC

	ND	FTECHO,0		;ECHO IS THE OLD WAY TO GET TSK DEVICES
	ND	ECHON,FTECHO		;THE FEATURE TEST DEFINES HOW MANY
.IF NE FTECHO
	ND	FT.TDV,ECHON		;HERE FOR THE GOOD OLD DAYS
	ND	TDVN,ECHON		;MAKE WHAT IS EXPECTED
.IFF
	ND	FT.TDV,0		;NORMALLY LEAVE OUT TSK DEVICES
	ND	TDVN,0			;NONE OF THEM
.ENDC

.IF NE FT.DDP
	ND	DDPN,NTLINE		;DEFAULT ONE DDP DEVICE PER LBLK
.ENDC ;.IF NE FT.DDP

.IIF NE FT.CTY,FT.CTY=1
DEVN=LPTN+CDRN+PTRN+PTPN+PLTN+TTYN+FT.CTY+ECHON	;NUMBER OF CONNECTS = NUMBER OF DEVICES
.IIF NE FT.RDA,DEVN=DEVN+RDAN		;ADD IN RDA DEVICES
.IIF NE FT.RDP,DEVN=DEVN+RDPN		;ADD IN RDP DEVICES
.IIF NE FT.RDM,DEVN=DEVN+NMPTL		;ADD IN RDM DEVICES
.IIF NE FT.DDP,DEVN=DEVN+DDPN		;ADD IN DDP DEVICES
;VARIOUS TTY PARAMETERS MAY BE SET BY DEFINING SYMBOLS AS FOLLOWS:
;	FIRST THREE CHARACTERS ARE T## OR T# WHERE # IS THE OCTAL TTY LINE
;	LAST 2 OR  3 CHARS ARE:
;		WID FOR WIDTH
;		DSL FOR DATASET LINE
;		XS FOR TRANSMIT SPEED
;		RS FOR RECEIVE SPEED
;			IF NEITHER XS OR RS IS DEFINED, THEY WILL DEFAULT TO
;			  TTYRS AND TTYXS RESPECTIVELY, IF THESE ARE DEFINED.
;			IF BOTH XS AND RS ARE STILL UNDEFINED,
;			  LINE IS AUTOBAUD
;			IF ONE OF RS OR XS IS DEFINED, BUT THE OTHER ISN'T
;			  THEY WILL BOTH BE DEFINED TO HAVE THE SAME VALUE.
;		ABD TO SET AUTOBAUD FOR THE LINE INDEPENDENT OF XS/RS
;		801 TO TELL WHICH DN11 IS ATTACHED TO THIS TTY LINE
;			REQUIRES DN11N TO BE NON-ZERO (AND LINE TO
;			BE SET AS A DATASET LINE)
;		RNN TO RESTRICT CONNECTS TO A PARTICULAR NODE
;			REQUIRES FT.RNN NONZERO
;		INI TO CAUSE "INITIA" TO BE RUN BY THE -10 SYSTEM WHEN
;			THE TERMINAL IS CONNECTED.  (IGNORED)
;		PFH TO CAUSE THE TERMINAL TO ATTEMPT TO CONNECT TO
;			A "PREFERRED HOST" IF THAT HOST IS UP.
;		8BT TO CAUSE THE TERMINAL TO BE SET TO 8-BIT MODE.
;
; e.g.
;	T12DSL=1	;LINE 12 IS A DATASET LINE
;	T2WID=^D72	;WIDTH FOR LINE 2 IS 72 COLUMNS (MAY BE RESET WITH TTY WIDTH COMMAND)

	.IF NDF TTYXS
		.IIF DF TTYRS,TTYXS=TTYRS
	.ENDC;.IF NDF TTYXS
	.IF NDF TTYRS
		.IIF DF TTYXS,TTYRS=TTYXS
	.ENDC;.IF NDF TTYRS
	ND	TTY8BT,0		;DEFAULT IS 7-BIT
;DEFAULTS

	ND	FTKG11,0		; = 0 FOR KG11 CODE
	ND	FTCLEAR,0		; =1 TO CLEAR CORE OR RESTART
.IIF EQ FT.CTY,FT.HLP=0		;IF NO CTY, NO SENSE WRITING ON IT
	ND	FT.TSK,0		; NONZERO FOR TASKS
;DEFAULTS FOR MACRO-CALL SUPPORT
	ND	TKSQSZ,10		; SIZE OF SEND QUEUE
	ND	TKPMAX,4		; MAX PRIORITY LEVEL
	ND	TKQTIM,12		; QUANTUM RUN TIME FOR TASK
	ND	NINBUF,4		; NUMBER OF INPUT BUFFERS
	ND	FTRACE,0		; TRACE STUFF
	ND	FTDUP.,0		;TRACE DUP11 HDW IF NONZERO
	ND	FTDMC.,0		;TRACE DMC11 HDW IF NONZERO
	ND	FTDP.T,0		;TRACE DP11 HDW IF NONZERO
	ND	FTDQ.T,0		;TRACE DQ11 HDW IF NONZERO
	ND	FTDS.T,0		;TRACE DS11 HDW IF NONZERO
	ND	FTDT.T,0		;TRACE DATA
	ND	FTDD.T,0		;TRACE DDCMP PROTOCOL
	ND	FTDV.T,0		;TRACE DEVICE CONTROL
	ND	FTNC.T,0		;TRACE NCL
	ND	FTCN.T,0		;TRACE CHUNKS
	FT27.T=0			;TRACE 2741S (NEVER)
.IIF NE FTWDDL,FTWDDL=1
	ND	CNKSIZ,100		;NUMBER OF CHARACTERS IN A CHUNK
					; MINIMUM LEGAL SIZE IS 40 = 16 WORDS
					;ALSO MUST BE A POWER OF 2
					;AND NOT UNREASONABLY LARGE
.IIF LT CNKSIZ-40, CNKSIZ=40
.IIF NE	CNKSIZ&160000,CNKSIZ=10000
	Z=2
	.REPT	4
		CNKSIZ=CNKSIZ!<CNKSIZ/Z>
		Z=Z*Z
	.ENDR
	CNKSIZ=CNKSIZ&<^C<CNKSIZ/2>>
	ERSCNT=20	;CRITICAL LEVEL FOR CHUNKS

	ND	JIFSEC,<^D60>		;NUMBER OF CLOCK TICKS IN A SECOND

	ND	NGHMAX,<NLINES+1>	;MAXIMUM NUMBER OF NEIGHBOR NODES

	ND	DSCSPD,12		;NUMBER OF CLOCK TICKS BETWEEN
					;  MODEM CHECKS
	ND	MDMHDT,12.		;MODEM HOLD DOWN TIME (RTS WILL BE
					;  FORCED OFF THIS MANY SECONDS
					;  WHEN THE PHONE IS HUNG UP.)

	ND	SDELAY,0		;TICKS TO WAIT WHEN TURNING AROUND LINE
	ND	REPDWN,<^D10>		;NUMBER OF UNANSWERED REPS TILL DEAD
	ND	NRPSEC,3		;NUMBER OF SECONDS BETWEEN REPS
	ND	REPSPD,6		;THE GRANULARITY OF REP CHECKING
					;THE LINE BLOCKS ARE ONLY CHECKED FOR
					;REP TIME OUTS EVERY "REPSPD" TICK'S

	SDLAY=<SDELAY+REPSPD-1>/REPSPD	;NORMALIZE SDELAY
	REPSEC=NRPSEC*JIFSEC/REPSPD	;NORMALIZE REPSEC

	ND	FTDM11,DHLINE		;IF NONZERO INCLUDE DM11BB CODE

	ND	DN11N,0			;ASSUME NO DN11'S
	ND	FTDN11,DN11N		;ASSUME SUPPORT DN11'S IF ANY EXIST

	FT2741=0			;CODE FOR 2741'S IF NONZERO
.REPT 0	;NO LONGER SUPPORT 2741 AT ALL
	ND	DEFBCD,<^D988>		;DEFAULT 2741 CODE IS BCD APL
	ND	FTE029,1		;IF NONZERO SUPPORT ELEMENT 029
	ND	FTE087,1		;IF NONZERO SUPPORT ELEMENT 087
	ND	FTE938,1		;IF NONZERO SUPPORT ELEMENT 938
	ND	FTE963,1		;IF NONZERO SUPPORT ELEMENT 963
	ND	FTE987,1		;IF NONZERO SUPPORT ELEMENT 987
	ND	FTE988,1		;IF NONZERO SUPPORT ELEMENT 988
.ENDR	;END OF 2741 VALUES

	ND	FT2BIT,0		;IF NON ZERO, USE TWO STOP BITS ON ALL DH11 LINES
;TTY DEVICE DEFAULT PARAMETERS

	ND	TTYMML,80		;MAXIMUM TTY MESSAGE SIZE
	ND	TTYDRQ,2		;DATA REQUESTS FOR TTY DEVICES
	ND	TTYWID,<^D72>
	ND	CTYWID,TTYWID
	ND	TTYDSL,0		;NON-DATASET
	ND	TTYABD,1		;AUTOBAUD ENABLED
	ND	TTYINI,0		;DEFAULT IS TO NOT RUN INITIA.
	ND	TTYMIC,<^D60>		;MAXIMUM NUMBER OF TTY INPUT CHARS
		.IIF LE TTYMIC-^D10,TTYMIC=^D12	;SET MINIMUM

;CDR DEVICE DEFAULT PARAMETERS

	ND	CDRMML,333		;MAXIMUM CARD MESSAGE SIZE
	ND	CDRWID,<^D80>		;DEFAULT CARD SIZE

;LPT DEVICE DEFAULT PARAMETERS

	ND	LPTMML,333		;MAXIMUM LPT MESSAGE SIZE
	ND	LPTVFL,<^D66>		;MAX LENGTH FOR A VFU
	ND	LPTWID,<^D132>		;DEFAULT LPT WIDTH
	ND	LPT.LC,0		;=1 IF LINE PRINTER HAS LOWER CASE
	ND	LPTDAV,0		;DEFAULT NO DAVFU
	ND	LPTFCS,0		;DEFAULT NO FULL-CHAR-SET
	ND	LPT8BT,0		;=1 IF LINE PRINTER IS EIGHT-BIT DATA
	ND	RPLPOL,LPTN		;REPORT LPT OFFLINE AT CTY BY DEFAULT

;PLT DEVICE DEFAULT PARAMETERS

	ND	PLTMML,333		;MAXIMUM PLT MESSAGE SIZE

;PTP DEVICE DEFAULT PARAMETERS

	ND	PTPMML,333		;MAXIMUM PTP MESSAGE SIZE

;PTR DEVICE DEFAULT PARAMETERS

	ND	PTRMML,<^D120>		;MAXIMUM PTR MESSAGE SIZE

;RDX DEVICE DEFAULT PARAMETERS

	ND	RDAMML,TTYMML		; MAX RDA MESSAGE SIZE
	ND	RDADRQ,4		;RDA DATA REQUESTS

;DDP DEVICE DEFAULT PARAMETERS

	ND	DDPMML,MSGMAX-20	;MAXIMUM DDP MESSAGE SIZE
	ND	DDPCHK,DDPMML/CNKSIZ	;CHUNK-PER-DATAREQUEST WEIGHT
	ND	DDPDRQ,4		;DATA REQUESTS OUTSTANDING
	ND	DDPRNN,0		;NO RESTRICTED HOST
	ND	DDPPFH,0		;NO PREFERRED HOST (PREFER TENSCB)
	ND	LNKMAX,20		;MAXIMUM NUMBER OF LINKS IN NETWORK

.IF NDF SEQNGH
.IF NE FT.RDM!FT.RDP
	Z=NLINES+NALINE+NTRIB+RDPN	;MAX NUMBER OF NODES
	ND	SCBMAX,<Z*2-Z*FT.D75>
	SEQNGH=Z			; MAX NUMBER OF SEQUENTIAL NEIGHBORS
	ND	FTRDCM,0		; =0 IF TEN CANT HANDLE RDE CONTROL MSGS
					;FTRDCM=1 IF TEN KNOWS POLLING LIST CONTROL MSG ONLY
					;FTRDCM=3 IF TEN KNOWS ALL CONTROL MSGS
.IFF
	ND	SCBMAX,<NTLINE*2-NTLINE*FT.D75>
	SEQNGH=NTLINE			;MAXIMUM NUMBER OF SEQUENTIAL NEIGHBOURS
.ENDC
.ENDC
.IIF EQ SCBMAX,SCBMAX=2			;DON'T EVER LET THIS GO TO ZERO
					;WE DON'T WANT TROUBLE IF SOMEONE FINDS A PATH HERE
	SEQLIM=SEQNGH+1			;WE ARE SEQUENTIAL ALSO

	ND	SNMSIZ,6		;NUMBER OF CHARACTERS IN STATION NAME
	ND	MSGMAX,<^D512>		;MAXIMUM DDCMP MSG SIZE
					; NOT INCLUDING BCC AND HEADER
	ND	RDABRK,<15>		; BREAK IS A CR
.IF NE FT.RDM!FT.RDP
	ND	RDEDLL,0		;SET NON ZERO IF RDE DEVICES
					;KNOW MAINTAINANCE MODE.
	ND	RDEMML,MSGMAX-24	;MAX MSG FOR RDE DEV IS MAX
					;DDCMP MSG - NCL HDR
	RDEWID=RDEMML
	ND	RDEDRQ,<<NTLINE-SEQNGH+1>/<<3*NMPTL>+1>>  ;DATA REQUESTS
					;  MUST BE SIGNIFICANT FRACTION OF THE
					;  NUMBER OF STATIONS ON A LINE
	.IIF EQ RDEDRQ,RDEDRQ=1		;AND IT MUST BE AT LEAST ONE
	ND	POLLSZ,20		;SET THE MAX LENGTH FOR POLLING LIST
					;IF USED
.ENDC

	ND	DDHTIM,<^D13>		;LENGTH OF TIME TILL DDCMP DROPS MESSAGE
	ND	MPHTIM,<^D100>		;LENGTH OF TIME TILL DDCMP DROPS MESSAGE
					;ON MULTIPOINT LINE
	ND	MP.STV,<^D15>		;LENGTH OF TIME TO SELECT FAILURE IN SEC
	ND	MP.TTV,MP.STV/2		;LENGTH OF TIME TO TRIBUTARY RESELECT
	ND	MP.SFC,4		;# SUCCESSIVE SELECT FAILURES BEFORE STATION
					;IS PUT OFFLINE (MAX=^D15)

	ND	FTOLDC,0		;1 MEANS OLD CONFIGURATION MSGS
	ND	NETLEN,0	;MAXIMUM NUMBER OF CHARS IN NETLDR COMMAND
	ND	TNCREP,<^D15>	;LENGTH OF NCL REP TIMER
	ND	FT.STC,1	;IF NONZERO INCLUDE STATION CONTROL
				; I.E. EXAMINE & DEPOSIT MESSAGES
	ND	STCRNN,0	;IF NON-ZERO, ONLY THAT NODE MAY USE STC
				; EXAMINE/DEPOSIT/GOTO COMMANDS
	ND	BSTRNN,0	;IF NON-ZERO, ONLY THAT NODE MAY USE
				; BOOT-STRAP STC COMMANDS
	ND	FTKLKR,0	;IF NON-ZERO THEN BREAK DTE-PROTOCOL (TENDWN)
				; IF KL HALTS (DTE STILL 'ENABLED')
	ND	FTHOST,1	;IF NONZERO INCLUDE SET HOST CODE
				;  (USED BY TTYS, DDPS)
	ND	FT.RNN,0	;IF NONZERO DEVICES MAY BE RESTRICTED
				;  TO PARTICULAR NODES.
				;  (SET TnRNN= HOST NUMBER)
	ND	FT.PFH,0	;IF NONZERO CONNECT TO "PREFERRED" HOST IF
				;  AVAILABLE, ELSE ROUND ROBIN
				;  (SET TnPFH= HOST NUMBER)

	.IIF EQ DEVN,FTHOST=0	;IF NO DEVICES, THEN NO DLATAB, ETC.
	.IIF EQ FTHOST,FT.RNN=0	;IF NO HOST, HE CAN'T RESTRICT HOST SELECTION
	.IIF EQ FTHOST,FT.PFH=0	;IF NO HOST, HE CAN'T PREFER HOST SELECTION

.IF NE FT.D22			;IF A DN22
	ND	FT.ROM,0	;NO "ANF" ROMS ON A DN22
	ND	FT.MOP,1	;BUT A "MOP" ROM
.ENDC
	ND	FT.MOP,0	;NO ONE BUT A DN22 HAS MOP ROMS

.IF NDF FT.ROM			;IF NONZERO KEEP BOOTCODE RESIDENT
.IIF NE FTDL10!FT.DTE,FT.ROM=0	;DON'T NEED IF CAN LOAD OVER DL10
.IIF EQ FTDL10!FT.DTE,FT.ROM=1	;NEED FOR 82'S AND SUCH
.ENDC;.IF NDF FT.ROM

	ND	FTNTLD,0	;USER MUST SET FTNTLD IF HE WANTS THE
				; LDCNFG MACRO EXPANDED
	ND	ROMADR,173000	;ROM STARTING LOC
	ND	ROMLOW,ROMADR		;LOWEST ADDRESS IN ROM
	ND	ROMHGH,ROMLOW+2000	;HIGHEST ADDRESS IN ROM
;TO PRESET LINK LEVELS DEFINE SYMBOLS OF THE FORM:
;	L#LVL=<DESIRED VALUE>
; e.g.	L0LVL=123
;	L12LVL=040
	ND	ALNLVL,<^D25>	;DEFAULT LEVEL FOR ASYNCHRONOUS LINES
	ND	SLNLVL,<^D10>	;DEFAULT LEVEL FOR SYNCHRONOUS LINES
	.IF NDF TENLVL
	  .IF NE FTDL10
		TENLVL=5
	  .IFF
		TENLVL=7	;MATCH DL10/DTE20 VALUES IN THE -10
	  .ENDC
	.ENDC
	ND	CST.DQ,SLNLVL	;DEFAULT COST FOR DQ11
	ND	CST.DM,<^D8>	;DEFAULT COST FOR DMC11 (PRESUMED DMR11)
	ND	CST.UP,SLNLVL	;DEFAULT COST FOR DUP11
	ND	CST.DS,SLNLVL	;DEFAULT COST FOR DS11
	ND	CST.DU,SLNLVL	;DEFAULT COST FOR DU11
	ND	CST.DP,SLNLVL	;DEFAULT COST FOR DP11
	ND	CST.DV,SLNLVL	;DEFAULT COST FOR DV11
	ND	CST.DH,ALNLVL	;DEFAULT COST FOR DH11 PTP (ASYNCH)
	ND	CST.DZ,ALNLVL	;DEFAULT COST FOR DZ11 PTP (ASYNCH)

	ND	FTROLL,0	;IF NONZERO, THE TROLL WILL EAT
				; EVERY FTROLL'TH MESSAGE
	ND	FT3.02,1	;VERSION OF DDCMP FOR START AND STACK

	ND	FT873,1		;IF NON ZERO, SUPPORT BM873 BOOTSTRAP
				;THIS ROM HAS BUG WHICH REQUIRES SELECT AND
				;QSYNC BITS TO BE ZERO
	.IIF EQ	NLINES,FT873=0	;CAN'T IF NO SYNCHRONOUS LINES
	.IIF EQ	FT3.02,FT873=0	;NO NEED FOR THE CODE IF NOT SUPPORTING
				;DDCMP 3.02
;FEATURE TESTS FOR DECNET-COMPATIBLE PORT (DCP)

	ND	FT.DCP,0	;DEFAULT IS OFF
FTDCP1=0			;ZERO VERSION SWITCHES
FTDCP2=0			;ZERO VERSION SWITCHES
FTDCP3=0			;ZERO VERSION SWITCHES
FTDCP4=0			;ZERO VERSION SWITCHES
.IF NE,FT.DCP			;IF THE DCP FEATURE TEST IS NON-ZERO
	ND	FTDCPT,0	;DEFAULT TO NO MESSAGE TRACE CODE
	ZZ=1			;FLAG TO INDICATE INCORRECT VERSION
	.IF EQ,<FT.DCP-1>	;IF FT.DCP IS 1, GENERATE 1.2 NSP SOFTWARE
		FTDCP1=1	;FEATURE TEST FOR NSP 1.2
		ZZ=0		;INDICATE GOOD VERSION
	.ENDC; EQ,<FT.DCP-1>
	.IF EQ,<FT.DCP-2>	;IF FT.DCP IS 2, GENERATE 2.3 NSP SOFTWARE
		FTDCP2=1	;FEATURE TEST FOR NSP 2.0
		ZZ=0		;INDICATE GOOD VERSION
	.ENDC; EQ,<FT.DCP-2>
	.IF EQ,<FT.DCP-3>	;IF FT.DCP IS 3, GENERATE 3.0 NSP SOFTWARE
		FTDCP3=1	;FEATURE TEST FOR NSP 3.0
		ZZ=0		;INDICATE GOOD VERSION
	.ENDC; EQ,<FT.DCP-3>
	.IF EQ,<FT.DCP-4>	;IF FT.DCP IS 4, GENERATE 3.2 NSP SOFTWARE
		FTDCP4=1	;FEATURE TEST FOR NSP 3.2 (PHASE 3)
		ZZ=0		;IDNICATE GOOD VERSION
	.ENDC; EQ,<FT.DCP-4>
	.IF NE,ZZ		;TRUE IF FT.DCP OTHER THAN 1 OR 2 OR 3
		FTDCP3=1	;USE VERSION 3 CODE AS DEFAULT
		.PRINT 1;INCORRECT NSP VERSION SPECIFIED; DEFAULTS TO 3.0
	.ENDC; NE,ZZ
	.IF NE,FT.MPT		;TRUE IF MULTIPOINT FEATURE ALSO REQUESTED
		.PRINT 7;ILLEGAL CONFIGURATION -- BOTH MPT AND DCP NOT ALLOWED.
		.PRINT 7;THE CODE PRODUCED WILL NOT RUN
	.ENDC; NE,FT.MPT

	NSPCFS=0		;SIZE OF CONFIG INITIALLY ZERO
	NSP$MX=0
	NSPTCF=0
	NSPN=0			;NUMBER OF NSP NODES IS INITIALLY 0
;STILL IN .IF NE FT.DCP

	ZZ=1

	.IF NE FTDCP1!FTDCP2
		.MACRO	NSP,A,B,C,D,E,F,G,H
			ZZ=0
			YY=0
			NSPN=NSPN+1			;COUNT NSP LINES
			.IRP	Q,<H>
				YY=YY+2		;COUNT THIS ENTRY
			.ENDM	;.IRP	Q,H
			.IIF GE YY-NSPCFS,NSPCFS=YY
		.ENDM	NSP
	.ENDC ; NE,FTDCP1!FTDCP2

	.IF NE FTDCP3
		.MACRO	NSP3,QAZ,QBZ,NOD
			.IF B <NOD>
				.IF EQ <PASS-1>
					.PRINT 7'QAZ;NODE NUMBER FOR DCP MISSING, 7'QAZ ASSUMED
				.ENDC
			.ENDC
			ZZ=0
			NSPN=NSPN+1
			NSPTCF=0
			.IRP	Q,<QBZ>
				NSPTCF=NSPTCF+2
				.IIF GE NSPTCF-NSP$MX,NSP$MX=NSPTCF
			.ENDM	;.IRP
		.ENDM	NSP3
	.ENDC ; NE,FTDCP3

	.IF NE FTDCP4
		.MACRO	DCP4LN,QLN,QOB,QVN,QVS,QHN,QHS,QCN
			.IF B <QVN>
				.IF EQ <PASS-1>
					.PRINT 7'QLN;NODE NUMBER FOR DCP MISSING, 7'QLN ASSUMED
				.ENDC
			.ENDC
			ZZ=0
			NSPN=NSPN+1
			NSPTCF=0
			.IRP	Q,<QOB>
				NSPTCF=NSPTCF+2
				.IIF GE NSPTCF-NSP$MX,NSP$MX=NSPTCF
			.ENDM	;.IRP
		.ENDM	DCP4LN
	.ENDC ; NE,FTDCP3

	NSPLST

	.IF NE,ZZ			;TRUE IF NSPLST MACRO NOT PROVIDED
		.PRINT -1;NO NSPLST MACRO PROVIDED; ABORTING.
		$ABORT=1			;SET FLAG TO ABORT ASSEMBLY
	.ENDC; NE,ZZ
.ENDC; NE,FT.DCP
	ND	$ABORT,0	;UNLESS ABORT SYMBOL GIVEN VALUE ABOVE, SET TO 0
.IIF NE,$ABORT,	.END
.SBTTL	SYMBOL DEFINITIONS
;
;
;
; REGISTER DEFINITIONS
;
DQ=R3		;ADR OF DQ11 HDW
SB=R4		;POINTS TO STATION CONTROL BLOCK
J=R5		;POINTS TO LINE BLOCK


;MACRO TO INTERRUPT THE 10
.MACRO	WAKE10
	BIS	#DL.10I,DL.STS	;INTERRUPT THE TEN
.ENDM	WAKE10

;MACRO TO ASSEMBLE EXTENSIBLE ASCII
.MACRO	EASCII	LEN,TEXT,FILL
.IIF EQ,LEN,.MEXIT
	EAZ=0
.IRPC	CHR,<TEXT>
.IF LT EAZ-LEN
.IF NE EAZ
	.BYTE	200+EAZEAZ
.ENDC;.IF NE EAZ
	EAZ=EAZ+1
	EAZEAZ=''CHR
.ENDC;.IF LT EAZ-LEN
.ENDM;.IRPC	CHR,<TEXT>
	.BYTE	EAZEAZ
.IF NB,<FILL>
	.REPT	LEN-EAZ
	.BYTE	0
	.ENDR; LEN-EAZ
.ENDC; NB,<FILL>
.ENDM	EASCII
.SBTTL		CHUNK WORDS
	BLOCK	CN		;DEFINE X AND XX MACROS
;FOLLOWING DESCRIBES USE OF CHUNKS FOR MESSAGES
	X	,1		;LINK TO NEXT CHUNK IN CURRENT MESSAGE
	X	MLK,1		;LINK TO NEXT MESSAGE
	X	LEN,1		;LENGTH OF MESSAGE(INCLUDES NCL HEADER BUT NOT BCC)
	X	TIM,1		;TIMER USED BY DDCMP
	.IF NE DEVN+FT.DTE
	X	DDB,1		;ADR OF DDB WHICH SENT MSG
	.ENDC;.IF NE DEVN
	X	SCB,1		;POINTER TO SCB WINDOW FOR MSG
	X	DDC,0		;DDCMP HEADER STARTS HERE
	X	ADR,1		;ADR OF NEXT BYTE TO USE
	X	CNT,1		;COUNT OF BYTES LEFT IN MESSAGE
	X	NCN,1		;SAVE NCN HERE
	X	,1		;DDCMP HEADER BCC
	X	NCT,1		;RELATIVE ADR OF NCT BYTE

;DATA POINTER DEFINITIONS:
CNKLN1	=CNKSIZ-CN.NCT		;AMOUNT OF DATA IN FIRST CHUNK OF LIST
CN.DT2	=2			;STARTING ADDRESS OF DATA IN OTHER CHUNKS
CNKLN2	=CNKSIZ-CN.DT2		;DATA LENGTH IN THOSE CHUNKS
.SBTTL		LINE CONTROL BLOCK DEFS
;
;
; DEFINE A DEVICE TYPE FOR ASYNC IO DEVICES
;
;THIS IS USED AS INDEX INTO DISPATCH TABLES


ASY.DH=	0		; DH11 IS TYPE 0
ASY.DZ=	ASY.DH+2	; DZ11 IS NEXT



.IF NE NDH11!NDZ11!FT.CTY	; ONLY NEEDED IF A DH11 OR DZ11  IS USED

	BLOCK	LC	;DEFINE LC.??? OFFSETS

	X	CAR,1	; DM11 CONTROL FOR THE LINE


		; FORMAT FOR BYTE IS (6)BITS(10)TIMER
		LCB.BK=100000	; LAST CHARACTER WAS A BREAK (FRAMING ERROR)
		LCB.IG=40000 	; IGNORE THE NEXT CHARACTER ON THIS LINE
		LCB.AB=20000	; LINE IS AUTOBAUD
		LCB.DS=10000	; LINE IS DATA-SET
		LCB.LS=04000	; USING LOW SPEED AUTO BAUD DETECT
		LCB.TM=01777	; TIMER

	XX	STA,1		; STATE OF MODEM CONTROL
		LCS.VG=0.	; VIRGIN STATE
		LCS.RG=2.	; RINGING
		LCS.CD=4.	; CARRIED DETECT
		LCS.CS=6.	; CARRIER DETECT SATISFIED (2 SEC WAIT STATE)
		LCS.AB=8.	; AUTO BAUDING
		LCS.RU=10.	; RUNNING UNCONNECTED (NO -10 CONNECTION)
		LCS.RW=12.	; RUNNING WAITING FOR -10 CONNECTION TO FINISH
		LCS.RC=14.	; RUNNING AND CONNECTED TO THE -10
		LCS.LC=16.	; CARRIER LOST
		LCS.HA=18.	; WANT TO HANG UP
		LCS.HG=20.	; HANG UP (DTR OFF FOR 18 SEC)
.IIF EQ FTDN11,LCS.MX=20.	; MAX STATE (NO DIALOUT CAPABILITY)
.IF NE FTDN11
		LCS.DL=22.	; DIALER IS RUNNING
		LCS.DS=24.	; DIALOUT SUCCEEDED
		LCS.DF=26.	; DIALOUT FAILED
		LCS.MX=26.	; MAX STATE (DIALOUT CAPABILITY)
.ENDC;.IF NE FTDN11

	XX	MOD,1	; NUMBER OF TIMES LPR IS MODIFIED

	X	SPD,0	; SPEED FOR DH11 LINE (ENCODED)
		XX	XSP,1	; XMIT SPEED
		XX	RSP,1	; RECEIVE SPEED
	X	PSP,0	; SAVED SPEED (FOR NON AUTO BAUD DATA SET LINES)
		XX	PXS,1	; XMIT SPEED
		XX	PRS,1	; RECEIVE SPEED
	X	BLK,1	; LINK TO DEVICE OR LINE BLOCK FOR THIS LINE
	X	INS,1	; ADDRESS OF THE INPUT SERVICE PROC
	X	OUS,1	; ADDRESS OF THE OUTPUT SEVRICE PROC
.IF NE NDZ11
	X	CNT,1	; COUNT OF BYTES (DZ ONLY)
	X	BUF,1	; BUFFER POINTER FOR BYTES
.ENDC
	X	.SZ,0	; SIZE OF A LINE CONTROL BLOCK
.ENDC
.SBTTL		NCL DEFINITIONS

;NCT FLAGS
	NCFSNA=10	;FLAG SNA & DNA ARE PRESENT
	NCFINT=040	;INTERRUPT MESSAGE - DOESN'T AFFECT DATA REQUESTS
	NCFSEQ=100	;FLAG SOURCE NODE IS SEQUENTIAL

;MESSAGE TYPES FOR NUMBERED CONTROL
	NCLCON=1	;CODE FOR CONNECTS
	NCLDIS=2	;CODE FOR DISCONNECTS
	NCLNGH=3	;CODE FOR NEIGHBOURS MESSAGE
	NCLRCN=4	;CODE FOR REQUEST CONFIGURATION
	NCLCNF=5	;CODE FOR CONFIGURATION MESSAGE
	NCLDRQ=6	;CODE FOR DATA REQUEST MESSAGES
	NCLSTC=7	;CODE FOR STATION CTRL MESSAGES

;OBJECT TYPES FOR CONNECTS
	OBJMCR=0
	OBJTTY=1
	OBJCTY=OBJTTY
	OBJCDR=2
	OBJLPT=3
	OBJLP2=	OBJLPT
	OBJPTR=4
	OBJPTP=5
	OBJPLT=6
	OBJMTA=7
	OBJDTA=10
	OBJTSK=11
	OBJRDE=12
	  OBJRDA=OBJRDE		;ASCII RDE
	  OBJRDP=OBJRDE		;POINT-TO-POINT RDE
	  OBJRDM=OBJRDE		;MULTI-POINT RDE
	OBJCDP=13
	OBJDDP=14
.SBTTL		STATION CONTROL BLOCKS

	BLOCK	SB	;DEFINE SB.??? OFFSETS

;LOCATIONS IN A STATION CONTROL BLOCK (SCB)
X	FLG,1	;FLAGS FOR STATION CONTROL BLOCK
	SBF.IU=000001	;SCB IS IN USE
			;FOR TENSCB MEANS PORT IS ENABLED
	SBF.IC=000002	;IN CONTACT(I.E. HAVE EXCHANGED NCL START/STACK)
	SF.HID=000004	;HAVE NODE ID FOR STATION
	SBF.NB=000010	;NEED TO SEND NEIGHBORS TO NODE
			; SET WHEN MAKE CONTACT AND WHEN OUR NGH CHANGE
	SBF.RP=000020	;REP IS OUTSTANDING
	SBF.RR=000040	;OWE RESPONSE TO REP
	SF.XAK=000100	;NEED TO SEND NCL-ACK TO THIS STATION
	SBF.NK=000200	;NEED TO SEND NCL-NAK
	SBF.SK=000400	;NEED TO SEND NCL-STACK TO THIS STATION
	SBF.SQ=001000	;NODE IS SEQUENTIAL
	SBF.NQ=002000	;HAS REQUEST IN NCL QUEUE
	SF.XCN=004000	;NEED TO SEND CONFIGURATION
	SF.XRC=010000	;NEED TO SEND REQUEST CONFIGURATION
	SF.MCR=020000	;NODE HAS A COMMAND DECODER
.IF NE,FT.DCP
	SF.NSP=100000	;NSP LINE
.ENDC; NE,FT.DCP
XX	HXN,1	;HIGHEST NCL-MESSAGE NUMBER TRANSMITTED
XX	LAP,1	;LAST ACK PROCESSED.
XX	HAR,1	;HIGHEST ACK RECEIVED.
XX	RMN,1	;RECEIVE MESSAGE NUMBER
XX	TIM,1	;TIMER, USED FOR REP AND START
X	IMQ,1	;INPUT MESSAGE QUEUE
		; FOR INPUT MESSAGE WHICH AREN'T IN ORDER YET
X	OMQ,1	;OUTPUT MESSAGE QUEUE
		; MESSAGE WHICH HAVE BEEN DDCMP ACKED BUT NOT NCL ACKED
X	SQS,0	;LENGTH OF SEQUENTIAL NODE CONTROL INFO
	SQNSIZ=SB.SQS
XX	,SQNSIZ*<SEQLIM-1>	;SPACE FOR SEQUENTIAL NODE CONTROL

X	LBA,1	;ADDRESS OF LINE DATA BLOCK FOR STATION
X	LVL,1	;COST OF THE BEST PATH TO THIS NODE
X	RTN,1	;RETURN ADDRESS OVER A CALL TO "MARK"
X	RR0,1	;PLACE TO SAVE "R0" OVER A CALL TO "MARK"
X	RSB,1	;PLACE TO SAVE "SB" OVER A CALL TO "MARK"
X	WOQ,1	;QUEUE OF MSGS WAITING TO BE ASSIGNED MSG NUMBERS. A LA JCH.
X	NGH,<<NGHMAX*2>+1>	;PAIRS OF SCB ADR, LINK LVL

;FOLLOWING ARE NOT CLEARED BY CLRSCB
XX	SNM,SNMSIZ	;STATION NAME
XX	SID,SIDSIZ	;SOFTWARE ID
XX	DAT,DATESZ	;SOFTWARE DATE
X	NNM,1		;NODE NAME (BINARY NUMBER)
X	RVR,1		;REMOTE NCL VERSION (BINARY NUMBER)
X	SIZ,0

.MACRO	SB.ADV	X
	ADD	#SB.SIZ,SB		;MAKE ADDRESS OF NEXT SCB
	CMP	#SB.LIM,SB		;IS THAT TOO FAR ?
	BNE	X			;IF SO SPECIAL ACTION
.ENDM	SB.ADV
.SBTTL		DDCMP DEFINITIONS

	SYN=226
	IDLE=SYN	;NO SPECIAL IDLE CHARACTER
	ENQ=005		;1ST CHAR IN UNNUMBERED MESSAGES
	DLE=220		;1ST CHAR IN BOOTSTRAP MESSAGES
	SOH=201		;1ST CHAR IN NUMBERED MESSAGES

;NUMBERED MESSAGES
;	SOH CC1 CC2 QSYNC SELECT R N A0 BCC1 DATA BCC2
;	CC1&CC2 ARE TOTAL LENGTH OF DATA(BCC1 THRU BCC2 EXCLUSIVE)
;	CC1 IS LOW ORDER 8 BITS OF VALUE
;	CC2 IS HIGH ORDER 6 BITS
;	QSYNC IS THE FLAG WHICH IF ON SIGNALS A SHORT SYNC SEQ
;	SELECT IS THE FLAG WHICH SIGNALS DESTINATION TO TURN XMITTER ON
;	R IS # OF LAST GOOD MESSAGE RECEIVED
;	N IS THIS MESSAGE NUMBER
;	A0 IS THE DESTINATION STATION ADR
;	BCC1 IS THE CRC ON SOH THROUGH A0 INCLUSIVE
;	DATA IS STUFF PASSED ON TO HIGHER LEVEL PROTOCOL
;	BCC2 ARE THE CRC OF BCC1 THRU BCC2 EXCLUSIVE
;
;UNNUMBERED MESSAGES
	SELBIT=200		;DDCMP SELECT FLAG IN MSG
	QSYNC=100		;DDCMP QSYNC FLAG IN MSG
	FILL=000		;FILL CHARACTER
	A0=1			;DEFAULT DESTINATION STATION ADR

;ACK:	ENQ	ACK	FILL	MSG#	FILL	A0	BCC1
	ACK=001
;	MSG# IS LAST GOOD MSG RECEIVED

;NAK:	ENQ	NAK	RNAK	MSG#	FILL	A0	BCC1
	NAK=002		;NEGATIVE ACKNOWLEDGE
	NCDBCC=1	;BCC ERROR
	NCDDBC=2	;DATA BCC ERROR
	NCDREP=3	;REP RESPONSE
	NCDNRM=10	;NO ROOM
	NCDROV=11	;RECEIVER OVERRUN
	NCDTLM=20	;LOOOONG MSG
;	MSG# IS LAST GOOD MSG RECEIVED

;REP:	ENQ	REP	FILL	FILL	N	A0	BCC1
	REP=003		;REPLY TYPE
;	N IS THE LAST MESSAGE# SENT

;RESET:	ENQ	RESET	FILL	FILL	N	A0	BCC1
;	RESET=4
;	******!!!!!!! THIS MESSAGE IS NOW ILLEGAL !!!!!!!******

;RESAK:	ENQ	RESAK	FILL	R	FILL	A0	BCC1
	RESAK=5
;	******!!!!!!! THIS MESSAGE IS NOW ILLEGAL !!!!!!!******

;START:	ENQ	STRT	FILL	FILL	N	A0	BCC1
	STRT=6			;START TYPE
;	N IS NEXT NUMBERED MESSAGE TO BE SENT
;	N MUST BE ZERO FOR DDCMP VERSION 3.02

;STACK:	ENQ	STACK	FILL	R	N	A0	BCC1
	STACK=7			;START ACKNOWLEDGE
;	R IS NEXT EXPECTED MESSAGE # FOR RECPTION
;	R MUST BE ZERO FOR DDCMP VERSION 3.02
;	N IS NEXT MESSAGE # FOR TRANSMISSION
;	N MUST BE ZERO FOR DDCMP VERSION 3.02


MSNMAX=377		;MAXIMUM MESSAGE NUMBER

;WHEN A MSG IS RECEIVED CORRECTLY AN ACK IS SENT BACK;
; AN ACK IMPLIES ACK OF ALL LOWER NUMBERED MESSAGES
;WHEN A MSG IS RECEIVED INCORRECTLY A NAK MSG IS SENT BACK;
; A NAK IMPLIES ACK OF ALL LOWER NUMBERED MSGS.
.SBTTL		LINE BLOCKS

.IF NE NTLINE

	BLOCK	LB	;DEFINE LB.??? OFFSETS

;LOCATIONS IN A LINE BLOCK (LB)
X	STS,1	;STATUS - MUST BE FIRST WORD
	LS..ST=000001	;NEED TO SEND A START
	LS.STK=000002	;NEED TO SEND A STACK
	LS.XNK=000004	;NEED TO SEND A NAK
	LS.XAK=000010	;NEED TO SEND AN ACK
	LS.XRP=000020	;NEED TO SEND A REP MESSAGE
	LS.NRP=000040	;NEED RESPONSE TO REP
	LS..RQ=000100	;RECEIVER INTERRUPT QUEUED
	LS..XQ=000200	;XMT DONE INTERRUPT QUEUED
	LS..RG=000400	;SYNCHRONOUS LINE RECEIVER IS ACTIVE
	LS..XG=001000	;SYNCHRONOUS XMTER ACTIVE - MAY BE IDLING
	LS..RN=002000	;RECEIVED NAK
	LS.XCT=004000	;LINE IS TRANSMITTING A CONTROL MESSAGE
	LS.XDT=010000	;TRANSMITTING DATA
	LS.SSY=020000	;MUST STRIP SYNC BEFORE NEXT MESSAGE
	LS.MPT=040000	; LINE IS A MULTIPOINT LINE
	  .IIF NE FTDCP1!FTDCP3!FTDCP4,LS.NSP=040000  ; LINE IS AN NSP LINE
	LS..SS=100000	;STRIPPING SYNC NOW
X	ST2,1	;SECOND STATUS WORD
	L2.DDP=100000	;LBLK IS IN USE AS A DDP DEVICE (MUST BE SIGN BIT)
X	LNK,1	;ADR OF NEXT LINE BLOCK
.IF NE FT.DDP
X	DDB,1	;ADDRESS OF ASSOCIATED DDP DEVICE DDB
.ENDC ;.IF NE FT.DDP
X	BIT,1	;BIT CORRESPONDING TO LINE NUMBER
XX	LNU,1	;LINE NUMBER
XX	DVS,1	; THIS BYTE IS USED TO SELECT THE APPROPRIATE DEVICE SERVICE ROUTINES
	LS..DP=0	;DP11 DEVICE LINE
	LS..DS=2	;DS11 DEVICE LINE
	LS..DU=4	;DU11 DEVICE LINE
	LS..DV=6	;DV11 DEVICE LINE
	LS..DQ=10	;DQ11 DEVICE LINE
	LS..UP=12	;DUP11 DEVICE LINE
	LS..DM=14	;DMC11 DEVICE LINE
	LS..AL=16	;LOWEST ASYNC DEV TYPE CODE
			;IE, LB.DVS>=LS..AL IMPLIES ASYNC DEV
			;LB.DVS<LS..AL IMPLIES SYNC DEV
	LS..DH=16	;DH11 DEVICE LINE
	LS..DZ=20	;DZ11 DEVICE LINE
X	LVL,1	;LVL FOR LINK
X	DHB,0	;DH & DZ DEVICE CONTROL BLOCK
X	SLA,1	;SYNCHRONOUS LINE HDW ADR
X	.LN,0	; 4 BIT LINE # (DH11 & DZ11 LINES ONLY)
X	SLV,1	;SYNCHRONOUS LINE VECTOR
.IF NE NALINE!NMPTL!NTRIB!RDPN
X	LCB,1	;LINE CONTROL BLOCK ADDRESS (DH11)
.ENDC
.IF NE FT.MPT
X	MPL,1	;LINK TO NEXT LINE DROP FOR MULTIPOINT
X	MPN,1	; MULTIPOINT NEXT STATION SELECTION CONTROL
XX	MPA,1	;MULTIPOINT STATION ADDRESS
XX	MPT,1	;MULTIPOINT SETECT TIMMER
X	,0	;.EVEN
XX	MPS,2	; MULTIPOINT NODE STATUS
		; UPPER BYTE RESERVED FOR ADDITIONAL CONTROL STATUS
MP.SEL=0200	;STATION SELECTED
MP.SFF=0017	;SELECTED FAILURE COUNT FIELD
;MP.STV=17	;SELECTED TIMEOUT VALUE
;MP.TTV=7	;TRIBUTARY SELECTED TIMEOUT VALUE
;MP.SFC=4	;SELECT FAILURE COUNT
MP.OFF=0100	;STATION OFFLINE FLAG
MP.SOL=0040	;SET OFFLINE WHEN DESELECTED
MP.SNM=0020	;SET SELECT BIT IN NEXT MESSAGE XMITTED
MP.RTS=0004	;SET TO INHIBIT SETTING OF THE RTS MODEM LEAD
MP.CMS=0001	;SET FOR HALF/DUPLEX OR TRIBUTARY TO ENABLE 'MP.RTS' TRANSITION
.ENDC; FT.MPT

.IF NE,FTDCP1
X	NSS		;NSP STATUS
	NS.STR=B14	;STRIP ALWAYS
	NS.EDS=B13	;ENABLE DYNAMIC STRIPPING
	NS.CNF=B12	;SEND CONFIGURATION MESSAGE
	NS.NSQ=B13	;SOMETHING IS IN QUEUE FOR THIS LINE
XX	NNM		;NODE NUMBER FOR NSP NODE
XX	DNA		;NODE NUMBER HE TALKS TO
			;THE CONSECUTIVE ORDER OF THESE TWO BYTES
			;MUST BE RETAINED; NSPBNC MAKES USE
			;OF THAT INFORMATION
X	MML		;MAXIMUM MESSAGE LENGTH
XX	SNM,SNMSIZ	;STATION NAME
XX	SID,SIDSIZ	;SOFTWARE ID
XX	DAT,DATESZ	;DATE
XX	CNF,NSPCFS	;CONFIG
X	DSZ,0		;DCP ENTRY END
.ENDC; NE,FTDCP1

.IF NE,FTDCP3!FTDCP4
XX	VNN		;ANF NODE NUMBER FOR DECNOT NODE
.IF NE,FTDCP4
XX	VNM,6		;ANF NODE NAME FOR DECNOT NODE
XX	HNN		;DECNET NODE NUMBER FOR ANF NETWORK
XX	HNM,6		;DECNET NODE NAME FOR ANF NETWORK
XX	CNN		;ANF NODE TO RECEIVE DECNET CONNECTS
.ENDC; FTDCP4
XX	CNF,NSP$MX+1	; OPTIONS LIST (ONE BYTE TO FORCE STOP)
.ENDC; FTDCP3

X	OCN,5	;COUNT OF MESSAGES SENT (AND ACKED BY OTHER END)
		; COUNT OF ALL NAKS (INCLUDING THE FOLLOWING)
		; COUNT OF NAKS FOR REP RESPONSE
		; COUNT OF NAKS FOR BCC
		; COUNT OF NAKS FOR NO ROOM
X	ICN,3	;COUNT OF MESSAGES RECEIVED OK
		; COUNT OF BAD MSGS
		; COUNT OF REP'S WHICH WON NAKS
		;*** LB.ICN MUST FOLLOW LB.OCN DIRECTLY ***
XX	BNN,2	;BOOTSTRAPING NODE NUMBER
		; 2ND BYTE IS TIMER
.IF NE,DMCN
X	FB,1		;FIRST DMC11 BUFFER
X	BAS,1		;ADDRESS OF DMC11 BASE
.ENDC;.IF NE,DMCN
.IF NE FTWHYD	;IF WE ARE RECORDING WHY THE LINE WENT DOWN
X	WHA	;ADDRESS OF ROUTINE THAT CALLED L.DOWN
XX	WHS	;NUMBER OF LAST ACKED MESSAGE
XX	WHN	;COPY OF LB.OBF+4
.ENDC; FTWHYD
X	ZER,0	;FIRST WORD TO ZERO ON A RESET
.IF NE FTDUP11!DMCN	;AN EXTRA STATUS WORD FOR THE DUP-11 AND DMC11
X	STX,1		;THIS WORD IS THE DISPATCH ADDRESS IN THE DEVICE
			; DRIVER (USED FOR MAXIMUM SPEED) FOR DUP11, AND
			; A STATUS WORD FOR DMC11
.ENDC;.IF NE,FTDUP11!DMCN
.IF NE,FTDUP11
X	STY,1		;A STATUS WORD
;BITS IN LB.STY (ONLY ONE SO FAR... SIGH)
	UP$RCC=1	;WHEN THE SERVICE ROUTINE IS CALLED (VIA LB.RDN)
			; THIS BIT WILL BE SET IF THE BCC IS GOOD
.ENDC; NE FTDUP11

.IF NE,FTDCP1
X	LCT	;ACTIVE LINK COUNT
X	LKT	;POINTER TO LINK TABLE
X	LLE	;LAST LINK ENTRY
.ENDC; NE,FTDCP1

.IF NE,FTDCP3!FTDCP4
X	NSS		;STATUS WORD
	LBS.IC=1	;IN CONTACT WITH NSP
	LBS.L1=2	;NSP NODE IS ONLY LEVEL 1 (I.E. INTERCEPTED)
	LBS.NQ=4	;NODE IS IN NSP QUEUE
X	LEB		;POINTER TO LEB CHAIN
.ENDC ;.IF NE FTDCP3!FTDCP4

X	SCB,1	;POINTER TO STATION CONTROL BLOCK
X	2ND,1	;POINTER TO NEXT LINE BLOCK IN CASE OF PARALLEL LINES
X	REP	;REP TIMER COUNTED DOWN 1/SEC
XX	ROK,1	;LAST MESSAGE NUMBER RECEIVED OK
XX	LAR,1	;LAST MESSAGE NUMBER ACK RECEIVED
XX	LAP,1	;LAST MESSAGE NUMBER ACK PROCESSED
XX	HSN,1	;HIGHEST MESSAGE NUMBER SENT
XX	RDC	;FIRST BYTE IS REP TIMER(TICKED ONCE/SECOND)
XX	NCD,1	;LAST NAK CODE WE SENT
.IF NE FT.BIG
XX	TRY,1	;COUNT OF BCC NAKS RECEIVED FOR 1ST MSG IN OUTPUT QUEUE
.ENDC
X	XDN,1	;WHEN SYNCHRONOUS LINE INTERFACE ROUTINE GETS XMT DONE
		; INTERRUPT IT WILL JSR PC,@LB.XDN(J) AND EXPECTS
		; (R0) = ADR, (R1) = COUNT ON RETURN
XX	CTL,10	;NEXT CONTROL MESSAGE TO TRANSMIT
X	COB,3	;CURRENT OUTPUT BUFFER
		; 1ST WORD IS POINTER TO 1ST CHUNK OF CURRENT MSG
		; 2ND WORD IS POINTER TO CURRENT CHUNK
		; 3RD WORD IS NUMBER OF BYTES LEFT
X	BOO,1	;POINTER TO BOOTSTRAP MSG TO SEND
X	OBF,3	;OUTPUT BUFFERS
		; 1ST WORD POINTER TO 1ST BUFFER
		; 2ND WORD IS POINTER TO LAST BUFFER (OR ZERO)
		; 3RD WORD IS NUMBER OF MSGS IN QUEUE
X	RDN,1	;DISPATCH ON RECEIVE DONE
X	CIB,2	;CURRENT INPUT BUFFER (USED BY INTERRUPT LEVEL)
		; 1ST WORD IS CURRENT CHUNK ADR
		; 2ND WORD IS CHARS LEFT IN MESSAGE
.IF NE <NTLINE-NLINES!FTDP11!FTDS11!FTDU11!FTDUP11>
			;NON ZERO IF ASYNC DDCMP USED OR IF NO DQ11S
X	SXR,4	;PAIR OF DUMMY ADR,WC REGS FOR XMT
X	SRR,4	;PAIR OF DUMMY ADR,WC FOR RECEIVER
.ENDC;.IF NE <NTLINE-NLINES!FTDP11!FTDS11!FTDU11!FTDUP11>
.IF EQ FT.SLB
X	SLE,3	; 1ST WORD IS COUNT OF SYNCHRONOUS LINE ERROR INTERRUPTS
		; 2ND WORD IS LAST ERROR INTERRUPT HDW STATUS
		; 3RD COUNT OF SYNCHRONOUS LINE XMT TIMEOUT'S
.IF NE FT.HLP
X	CTY,1	;ADR OF STRING FOR LINE
.ENDC
.IF NE DEBUG
X	CRS,4	;SYNCHRONOUS INTERFACE STATUS AT CRASH
.IIF NE FTDQ11,	X	,4
.ENDC	;.IF NE DEBUG
.ENDC	;.IF EQ FT.SLB
X	IPT,1	;INPUT PUTTER (RELATIVE TO LNE BLOCK)
X	ITK,1	;INPUT TAKER (RELATIVE TO LINE BLOCK)
X	IBF,<<5*NINBUF>>	;INPUT BUFFERS
		; 1ST 8 CHARS ARE CONTROL MESSAGE OR DATA MESSAGE HEADER
		; FOR DATA MESSAGES 5TH WORD IS LINK TO CHUNKS
X	SIZ,0
.ENDC;.IF NE NTLINE
.SBTTL	MACRO TO LOG ERRORS

	ND	GIVMSG,-1	;SET TO 0 TO DISABLE MSGS, -1 TO ENABLE THEM

.IIF NE RPLPOL,GIVMSG=-1	;FORCE THE ISSUE IF HE REQUESTED LPT MSG
.IIF NE DGUTS,GIVMSG=-1		;OR "DON'T GIVE UP THE SHIP"

.IIF EQ FT.CTY,GIVMSG=0		;TOO BAD HE DIDN'T CONFIGURE IN A CTY
.IF NE GIVMSG

.MACRO	CTYMSG	NAME,TEXT
.IF NB <NAME>
.IF NB <TEXT>
NAME'MSG:	.BYTE	0,NAME'END-1-.
	.BYTE	007,012,015
	.ASCII	\'TEXT'\
	.BYTE	007,012,015,0
NAME'END:
MSGEND=.
.IFF
	INCB	NAME'MSG
	INC	MSGBGN
.ENDC
.IFF
CTYM0:	MOV	#CTYDDB,J
	BIT	#DS.ACT,(J)	;WAIT TILL THE CTY IS FREE
	BNE	CTYM3
	MOV	#MSGBGN,R0
	TST	(R0)
	BEQ	CTYM3		;IF NOTHING TO REPORT, CONTINUE
	DEC	(R0)+
CTYM1:	TSTB	(R0)+		;TEST IF THIS IS THE MESSAGE
	BNE	CTYM2		;IT IS, PRINT IT
	CLR	R1		;GET ALL 8 BITS OF MSG LENGTH
	BISB	(R0)+,R1
	ADD	R1,R0
	CMP	R0,#MSGEND	;EXIT IF COUNTS GOT SCREWED UP
	BHIS	CTYM3
	BR	CTYM1
CTYM2:	INC	R0
	DECB	-2(R0)
	MOV	R0,DB.STR(J)	;SET MSG AS HIGH PRIORITY OUTPUT
	JSR	PC,BEGXMT	;SET THE CTY TYPING
CTYM3:
.ENDC
.ENDM	CTYMSG

.IFF

.MACRO	CTYMSG	NAME,TEXT
.ENDM	CTYMSG

.ENDC ; .IF NE GIVMSG
.SBTTL	MACROS TO INSERT NODE NAME WHERE REQUIRED



;
; CONFIGURATION FILE C.P11 MUST HAVE THE DEFINITION OF THE NODE MACRO
;
;	.MACRO	NODE	ARG
;		ARG	NAME
;	.ENDM	NODE
;
; WHERE "NAME" IS THE NODE'S IDENTIFIER
;
;
;	THE MACRO NAMEIS IS CALLED AS FOLLOWS
;
;	NAMEIS	OURNNM
;
;


.MACRO	X	ARG
	DFNAME=0
.ENDM	X
.=40
	NODE	X	;TEST WHETHER NODE MACRO IS DEFINED

.IF NDF DFNAME
.ERROR	-1; !!!! CAUTION: NODE NAME UNDEFINED
.ERROR	-1; !!!! HOWEVER, CODE WILL STILL WORK
.ENDC


.MACRO	NAMEIS	NNUMB
	.MACRO	NAME..	NUMB,NNAME
		.ASCII	\'NNAME ('NUMB')\
	.ENDM	NAME..
.IF DF DFNAME
	NODE	<NAME..	NNUMB>
.IFF
	NAME.. 	\NNUMB,<...>
.ENDC	;.IF DF DFNAME
.ENDM	NAMEIS
.SBTTL	DATA STORAGE

	.=1000+STKLEN		;ALLOW ROOM FOR STACK ABOVE DEVICES
.IIF NE FT.DDT,.=15000		;SET ONLY FOR DEC INHOUSE DEBUGGING TO SAVE SPACE FOR DDT

PDL:			;END OF STACK
JOBVER:	.WORD	VDAS85	;VERSION NUMBER
PRGEND:	FIRZER		;FIRST FREE LOCATION AFTER PROGRAM
PHYLIM:	.BLKW	1	;1ST NON-CORE UNIBUS ADR
LSTFRE: .BLKW	1	;ADDR OF LAST FREE CHUNK
FIRFRE:	.BLKW	1	;ADR OF FIRST FREE CHUNK
FRECNT:	.BLKW	1	;COUNT OF FREE CHUNKS
FREMAX:	.WORD	040000	;MAX NUMBER OF CHUNKS
BITS:	Z=1		;INDEX OF USEFUL BITS
BITSP2=BITS+20

	.REPT	16.
	.WORD	Z
	Z=Z+Z
	.ENDR
BITS2:Z=400+1
	.REPT 10
	.WORD Z
	Z=Z+Z
	.ENDR


TRPSP:	.WORD	0	;SAVED P ON A TRAP INTERCEPT
TRPPC:	.WORD	0	;INTERCEPT PC FOR NXM'S
TRPPS:	.WORD	0	;SAVED PS ON A TRAP INTERCEPT

TRPDPC:	.WORD	0	;TRAP PC OF LAST TRAP WHICH WAS INTERCEPTED
TRPDPS:	.WORD	0	;TRAP PS OF SAME

JIFFLG:	.WORD	0	;INC'ED BY CLOCK INTERRUPT, CLR'ED BY SERVICE
SECTIC:	.WORD	JIFSEC	;INITTED TO JIFSEC, COUNTED DOWN EACH SECOND
SECFLG:	.WORD	0	;INC'ED ONCE/SEC, CLR'ED BY SECOND SERVICE ROUTINE
MINTIC:	.WORD	60.	;INITTED TO 60 DEC'ED ONCE/SEC
MINFLG:	.WORD	0	;INC'ED ONCE/MIN, CLR'ED BY MINUTE SERVICE ROUTINE
LOWUP:	.WORD	0	;INC'ED ONCE/JIFFY
HIGHUP:	.WORD	0	;INC'ED ONCE/64536 JIFFYS

RPCLCK:	.WORD	REPSPD	;DEC'ED ONCE/JIFFY, 0 => TIME TO DO REP CHECKING
DSCLCK:	.WORD	DSCSPD	;DEC'ED ONCE/JIFFY, 0 => TIME TO DO MODEM CHECKS

NEGNGH:	.WORD	0	;.NE. 0 IF "NEGATIVE" NEIGHBORS MSGS MIGHT BE PENDING
;QUEUE OF LINES WHICH HAVE INPUT READY TO BE CHECKED
	QUEUE	QI,NTLINE

;QUEUE OF LINES WHICH ARE READY FOR MORE OUTPUT
	QUEUE	QO,NTLINE

;QUEUE OF STATIONS WHICH NEED NCL ATTENTION
	QUEUE	NC,<SCBMAX+2>

.IF NE,FT.DCP
;QUEUE OF NSP LINES WHICH NEED ATTENTION
	QUEUE	NS,NSPN

.ENDC; NE,FT.DCP

;QUEUE OF DEVICES WHICH DESIRE ATTENTION
	QUEUE	DV,DEVN

;QUEUE OF TTY INPUT
	Z=TTYN+RDAN+1
	QUEUE	TI,Z,4

;SEQUENTIAL NODE TABLE - ADDRESSES OF SEQUENTIAL NODE SCB'S
SQNTAB:	.BLKW	SEQLIM
	.WORD	0		;ENDS SQNTAB
SQNODE:	.BLKW	1		;POINTER TO SQNTAB

	.BYTE	0
NCT:	.BYTE	0		;NCT FROM CURRENT MESSAGE
DNA:	.BLKW	1		;DESTINATION NODE SCB ADR
DNAOFF:	.BLKW	1		;OFFSET ON DNA
SNA:	.BLKW	1		;SOURCE NODE SCB ADR
SNAOFF:	.BLKW	1		;OFFSET ON SNA
DLA:	.BLKW	1		;DESTINATION LINK ADDRESS
SLA:	.BLKW	1		;SOURCE LINK ADDRESS


;LIST OF MESSAGES THAT HAVE TO BE RESENT.  ANY INTERFACE THAT FINDS
;  THAT FOR SOME REASON IT CANNOT DELIVER A MESSAGE (LINK DOWN, DL-11 NXM)
;  SHOULD QUEUE ALL UNSENT MESSAGES HERE.  THIS IS LOOKED AT BY CLOCK
;  LEVEL, AND THE MESSAGES RE-SENT OR DELETED.
MSGRSQ:	.WORD	0		;MESSAGE RESEND QUEUE
.IF NE DEVN
.MACRO	X	QQ
	.WORD	DDB'QQ
	Z=Z+1
.ENDM	X
Z=0
DLATAB:	.REPT	DEVN		;TABLE OF LINK ADDRESSES
		X	\Z
	.ENDR
FIRDDB:	.WORD	DDBLINK
	DDBLINK=0
.ENDC;.IF NE DEVN
.IF NE  NTLINE
FRSTLB=.-LB.LNK
	.WORD	LBLK0		;FIRST LOGICAL LINE
.ENDC ; .IF NE  NTLINE

.IF NE FT.CTY!TTYN
CRLMSG:	.BYTE	015,012,0	;CARRIAGE RETURN / LINE FEED MESSAGE
XOFMSG:	.BYTE	023,0	;XOF TO TELL USER TO STOP TYPING
TABMSG:	.BYTE	040,040,040,040,040,040,040,040,0	;TO SIMULATE HT
BELMSG:	.BYTE	007,0		;BELL
NHAMSG:	.BYTE	015,012
	.ASCIZ	/No host is available./
WCCMSG:	.BYTE	015,012
	.ASCIZ	/Connecting to host system./
HSDMSG:	.BYTE	015,012
	.ASCIZ	/Host sent disconnect./
HWAMSG:	.BYTE	015,012,007
	.ASCIZ	/Path to host system was lost./
IBFMSG:	.BYTE	015,012,007
	.ASCIZ	/Local input buffer full.  Character not stored./

	HIAHPL=TTYWID/NGHMAX		;HOSTS PER LINE
	HIAHFL=<TTYWID-21.>/NGHMAX	;HOSTS ON FIRST LINE
HIAMSG:	.BYTE	015,012			;MESSAGE STARTS WITH A CRLF
HIABUF:	.BLKB	21.			;ROOM FOR "HOSTS ARE AVAILABLE: "
	.BLKB	12.*NGHMAX		;ROOM FOR "KL1026(26), " * NGHMAX
	.BLKB	<2*HIAHPL>+2		;ROOM FOR EXTRA CRLFS
	.EVEN				;EVEN UP
	.BYTE	0,0			;TERMINATOR
HIACNT:	.WORD	0			;COUNT OF NODES IN MESSAGE
HIAWCT:	.WORD	0			;COUNT OF NODES PER LINE

;Subroutine to build host availability message

BLDHIA:	MOV	#FIRSCB,SB		;FIRST STATION CONTROL BLOCK
	CLR	R0			;INIT COUNT
10$:	BIT	#SBF.IC,@SB		;STATION IN CONTACT?
	BEQ	20$			;NO
	BIT	#SF.MCR,@SB		;IS IT A HOST?
	BEQ	20$			;NO
	TST	SB.SNM(SB)		;HAVE A NAME YET?
	BEQ	20$			;NO
	INC	R0			;COUNT IT
20$:	SB.ADV	10$			;LOOP BACK
	TST	R0			;ANY HOSTS?
	BNE	30$			;YES
	JSR	R1,100$			;COPY STRING
	ASCIZ	<No host is available>
	RTS	PC			;RETURN

;CHECK FOR ONLY ONE HOST
30$:	DEC	R0			;COUNT DOWN
	BNE	40$			;JUMP IF MORE THAN ONE HOST
	JSR	R1,100$			;COPY STRING
	ASCIZ	<Host is available:   >
	BR	50$			;ONWARD

;HERE IF MORE THAN ONE HOST
40$:	JSR	R1,100$			;COPY STRING
	ASCIZ	<Hosts are available: >

;LOOP THROUGH THE STATION CONTROL BLOCKS FILLING HIABUF
50$:	MOV	#HIAHFL-1,HIAWCT	;COUNT OF NODES ON FIRST LINE
	MOV	#FIRSCB,SB		;FIRST STATION CONTROL BLOCK
	MOV	#-1,HIACNT		;INIT COUNT OF HOSTS ADDED
60$:	BIT	#SBF.IC,@SB		;STATION IN CONTACT?
	BEQ	70$			;NO
	BIT	#SF.MCR,@SB		;IS IT A HOST?
	BEQ	70$			;NO
	TST	SB.SNM(SB)		;HAVE A NAME YET?
	BEQ	70$			;NO
	JSR	PC,200$			;ADD NODE TO MESSAGE
	  BR	80$			;ALL DONE IF BUFFER FULL
70$:	SB.ADV	60$			;LOOP BACK
80$:	RTS	PC			;RETURN

;SETUP R2 POINTING TO HIABUF AND COPY INITIAL TEXT STRING INTO BUFFER
100$:	MOV	#HIABUF,R2		;POINT TO DESTINATION
110$:	MOVB	(R1)+,(R2)+		;STUFF CHARACTER AWAY
	BNE	110$			;LOOP THROUGH STRING
	DEC	R2			;BACKUP OVER THE NUL
	INC	R1			;ADVANCE IN CASE ODD BYTE
	BIC	#1,R1			;AVOID ODD ADDRESS TRAP
120$:	RTS	R1			;RETURN


;COPY NODE SPEC INTO BUFFER
200$:	INC	HIACNT			;FIRST TIME THROUGH?
	BEQ	210$			;YES
	JSR	PC,300$			;SEE IF A NEW LINE IS NEEDED
	  RTS	PC			;RETURN ON FULL BUFFER
210$:	MOV	#SNMSIZ,R3		;LENGTH OF NAME
	MOV	#SB.SNM,J		;DISPLACEMENT OF NAME
	ADD	SB,J			;ADDRESS OF NAME
230$:	TSTB	(J)			;END OF TEXT?
	BEQ	240$			;YES
	MOVB	(J)+,(R2)+		;COPY BYTE OF NAME
	SOB	R3,230$			;AND LOOP THROUGH NAME
240$:	MOVB	#'(,(R2)+		;START OF NUMBER
	CLR	J			;GET A ZERO
	BISB	SB.NNM(SB),J		;GET ZERO-EXTENDED NODE NUMBER
	JSR	PC,400$			;CONVERT TO ASCII
	MOVB	#'),(R2)+		;CLOSE PARENTHESIS
	CLRB	@R2			;ZERO BYTE IN CASE LAST NODE
	ADD	#2,(SP)			;SKIP
	RTS	PC			;RETURN


;SEE IF A CRLF IS NEEDED
300$:	MOVB	#',,(R2)+		;SEPARATE WITH A COMMA
	MOVB	#' ,(R2)+		;AND A SPACE
	DEC	HIAWCT			;COUNT DOWN NODES PER LINE
	BGT	310$			;HAVE ROOM?
	MOVB	#015,(R2)+		;CR
	MOVB	#012,(R2)+		;LF
	MOV	#HIAHPL-1,HIAWCT	;RESET COUNTER
310$:	ADD	#2,(SP)			;SKIP
	RTS	PC			;RETURN


;CONVERT OCTAL TO ASCII
400$:	SAVE	J			;SAVE CURRENT VALUE
	ROR	J			;SHIFT OUT
	ROR	J			; LOWEST
	ROR	J			; DIGIT
	BIC	#160000,J		;CLEAR EXTRA BITS
	BEQ	410$			;IF ZERO, START POPPING DIGITS
	JSR	PC,400$			;ELSE RECURSE
410$:	RESTOR	J			;GET LAST DIGIT PLACED ON STACK
	BIC	#^C7,J			;CLEAR TO ONLY ONE DIGIT
	ADD	#60,J			;CONVERT TO CHARACTER
	MOVB	J,(R2)+			; AND STORE IN BUFFER
	RTS	PC			;RETURN
.IF NE GIVMSG

	.EVEN
MSGBGN:	.WORD	0
;	MSGS IN ORDER OF PRIORITY

.IF NE DGUTS
	ND	ABRGM,0		;SET TO NON ZERO TO ABRIDGE ERROR MSGS
	CTYMSG	LSW,<? STORAGE ALLOCATION FAILURE>
	CTYMSG	SBA,<? OUT OF SCB STORAGE>
IMTMSG:	;ILL MSG TYPE
	.IIF EQ ABRGM, CTYMSG IMT,<? MSG WITH ILL TYPE LOST>
NDVMSG:	;NCL CAN'T BE FOR THE DEV/LINE CLAIMED
	.IIF EQ ABRGM, CTYMSG NDV,<? NCL CAN'T BE FORWARDED>
BMEMSG:	;NCL MSG CONSTRUCTION FAILED
	.IIF EQ ABRGM, CTYMSG BME,<? NCL MSG GEN FAILED>
IMLMSG:	;INCONSISTENT MSG LENGTHS
	.IIF EQ ABRGM, CTYMSG IML,<? LOST MSG, INCONSISTENT LENGTHS>
NTLMSG:	;NCL SUBMSG TOO LONG, ZERO LENGTH ETC.
	.IIF EQ ABRGM, CTYMSG NTL,<? INVALID NCL SUBMSG LENGTH>
	CTYMSG	NCL,<? NCL FORMAT BAD, MSG LOST>
	CTYMSG	ODR,<? MSG NOT REQUESTED LOST>
	CTYMSG	DOQ,<? MSG LOST, DDCMP OVERLOAD>
	CTYMSG	LLS,<? NODE TRAFFIC OVERLOAD>
	CTYMSG	NIL,<? Neighbors have been lost.>
.ENDC ; .IF NE DGUTS
.IF NE RPLPOL
	CTYMSG	LPT,<% LINE PRINTER OFFLINE>
.ENDC ; RPLPOL

	.EVEN

	ND	MSGEND,.
.ENDC	;.IF NE GIVMSG
RSTMSG:	.BYTE	377,15,12,7
	.ASCII	\Restarting \
.ENDC;.IF NE FT.CTY!TTYN

MYNAME:
.IIF NE FT.D75,	.ASCII	\DC75NP\
.IIF NE FT.D80,	.ASCII	\DN80\
.IIF NE FT.D81,	.ASCII	\DN81\
.IIF NE FT.D82,	.ASCII	\DN82\
.IIF NE FT.D85,	.ASCII	\DN85\
.IIF NE FT.D87,	.ASCII	\DN87\
.IIF NE FT.87S,	.ASCII	\DN87S\
.IIF NE FT.D20, .ASCII	\DN20\
.IIF NE FT.D22,	.ASCII	\DN22\
.IIF NE FT.200, .ASCII	\DN200\
	ISVER	\VDAS85,\EDIT,\VMIN,\VWHO
	DATEIS
	.ASCII	\ -- \
NODMSG:
	NAMEIS	\OURNNM
NODCRL:	.BYTE	015,012,021,0
	.EVEN

PATRON:	.WORD	0			;SCB ADDRESS FOR UNSOLICITED BOOTSTRAP MSGS
.IIF NE FTHOST,HOSTES:	.WORD	0	;LAST SCB WE SENT RANDOM TTY CONNECT TO
TEMP0:	.BLKW	1			;TEMPORARY LOCATION
TEMP1:	.BLKW	1			; DITTO
TEMP2:	.BLKW	1			; DITTO

.IIF NE FTROLL,TROLL:	.WORD	FTROLL	;THE TROLL'S APPETITE CONTROLL


.IF NE FT.TSK
ZERO:	.WORD	0	;DEFAULT ARG (=0)
RUNQUE:			;RUN QUEUES FOR TASKS
.REPT	TKPMAX
	.WORD	0
.ENDR
TASK:	.WORD	0	;TASK BLOCK FOR CURRENT JOB
L.TASK:	.WORD	0	;LAST TASK SCHEDULED
.ENDC;.IF NE FT.TSK

.IF NE NDH11!NDZ11
; BUILD TABLE FOR INDEXING INTO LCB'S
	.EVEN
LCBIDX:	Z=0
	.REPT	16.
	.WORD	Z*LC..SZ
	Z=Z+1
	.ENDR

.ENDC