Google
 

Trailing-Edge - PDP-10 Archives - bb-l014r-bm_tops20_v6_1_atpch_18 - autopatch/mscnfg.x18
There are 9 other files named mscnfg.x18 in the archive. Click here to see a list.
;This software is furnished under a license and may only be used
;  or copied in accordance with the terms of such license.
;
;Copyright (C) 1979,1980,1981,1982 by Digital Equipment Corporation
;	       1983,1984,1985,1986    Maynard, Massachusetts, USA


	TITLE MSCNFG - MS initialization and feature test configuration

	SEARCH GLXMAC,MSUNV,MACSYM
TOPS10<	SEARCH ACTSYM >
	PROLOG (MSCNFG)

	CPYRYT
	MSINIT

	.DIRECTIVE FLBLST
	SALL

;Feature test flags

IFNDEF FTNAMS,<FTNAMS==0>	;FTNAMS - TOPS20 NAME SERVER


;Direct LINK to load the proper modules

	.REQUIRE MSMCMD
	.REQUIRE MSDSPL
	.REQUIRE MSTXT
	.REQUIRE MSUTL
	.REQUIRE MSHOST
	.REQUIRE MSDLVR
	.REQUIRE MSLCL
	.REQUIRE MSNET
	.REQUIRE MSSEQ
	.REQUIRE MSFIL
	.REQUIRE MSGUSR
	.REQUIRE MSUUO
	.REQUIRE MSVER
   IFN FTNAMS,<.REQUIRE MSNSRV>	;LOAD NAME SERVER INTERFACE
	.REQUIRE MS		;SHOULD BE LAST MODULE


;Define dummy symbols for unsupported code handled under conditonals

   IFE FTNAMS,<
DIRLKP::RET >

;External Globals

	EXTERNAL ALCSB,PERSON,RELSB
	EXTERNAL ALCFOB,MOVST0,MOVSTR,CRIF,SREGV1,SRGRV1,XCLENQ,.STEX0,.TAKE0
	EXTERNAL AUTEXP,CHECK0,CHECKS,CKEXIT,CKXIT0,CMDINI,CMDLUP,CRFPRT
TOPS20<	EXTERNAL EDFORK,EXECFK,CHNTAB>
	EXTERNAL FLAGS2,HDITAB,HSTINI,IB,INIP,INIPDL
TOPS20<	EXTERNAL INTP,INTPDL>
	EXTERNAL INIRET,KBFTOR,KWDTBL
	EXTERNAL LIBVER,LINEW,MINWSZ,MSGSSQ,MYDIR
	EXTERNAL MYDIRS,NAMINI,OKTINT,PDL,PIDBLK,PIDMS,RELFOB
	EXTERNAL RFIELD,SAVMOD,SBTMV1,SCRBTM,SCRLFL,SCRREG,SCRRGR
	EXTERNAL SHRAGN,TAKPDL,TAKPTR,TXTFPG
	EXTERNAL TXTTOT,UUOH,V52FLG,ZEREND,ZERMEM
TOPS20<	EXTERNAL GETTYM,MSGJFN,MYSTR,STRBUF >
TOPS10<	EXTERNAL INTBLK,INTF,MYPPN,SAVPSZ,SENBLK,TTYUDX
	EXTERNAL USRTAB,..NZHO,..NZLO,..NZT,CRFFDH,LOKAPP >

;Internal globals

	INTERNAL TTINI, CTCLOK, CTCOK, ININAM
TOPS20< INTERNAL .LOGOU, TMRINT, CTLCIN >
	INTERNAL RJ.FLG, RJ.AMA, RJ.VMA, RJ.MMA, RJ.LMA
;RJ.FLG yields bits that are ON if a certain type of mail is DISALLOWED
;These end up in NETFLG
	RJ.VMA==1B35		;NO VMAIL/DMAIL
	RJ.AMA==1B34		;NO ARPA MAIL
	RJ.MMA==1B33		;NO MX MAIL (NO SUPPORT FOR THIS, RESERVED)
	RJ.LMA==1B32		;NO LOCAL MAIL (NO SUPPORT FOR THIS, RESERVED)
;1B0-1B11 - reserved for customers, all others reserved for DEC

IFNDEF RJ.FLG,<RJ.FLG==RJ.VMA!RJ.AMA>	 ;NO V/D MAILER, NO ARPA MAIL

;Initial values for KWDTBL - TBLUK-style table holding pointers to
; aliases and address lists

KWDTB0:	KWDT0N,,KWDT0N
	CMD1 S,SYSCOD,CM%NOR!CM%INV	; Force complete spelling of SYSTEM
	CMD1 SY,SYSCOD,CM%NOR!CM%INV
	CMD1 SYS,SYSCOD,CM%NOR!CM%INV
	CMD1 SYST,SYSCOD,CM%NOR!CM%INV
	CMD1 SYSTE,SYSCOD,CM%NOR!CM%INV
	CMD SYSTEM,SYSCOD
KWDT0N==.-KWDTB0-1
SUBTTL MS initialization

MSINI::	SETZM TXTTOT		; Clear the send buffer character count
	SETZM TXTFPG		; Clear pointer to list of text pages.
	SETZM FLAGS2		; Clear 2nd flags word
TOPS20<
	MOVE A,[SIXBIT /MS/]
	MOVE B,[SIXBIT /MS/]
	SETSN			; Cause monitor to keep statistics on use
	 JFCL
	SETOM EDFORK		; No editor fork yet
	SETOM EXECFK		;  or EXEC fork
	SETZM PIDMS		; [JCR] No PID yet
>;End TOPS20
;**;[3098] Add 4 lines at MSINI:+12L	MDR	18-NOV-87
TOPS10<				;[3098]
	MOVE A,[..NZHO,,..NZLO]	;[3098] Init nonzero low seg storage
	BLT A,..NZLO+..NZT-1	;[3098]  ..
>				;[3098] End TOPS10
	MOVEI A,IB.SZ		; Size of init block
	MOVEI B,IB		; Addr of same
	$CALL I%INIT
	JUMPF [FATAL (Can't initialize GLXLIB)]
TOPS10<	MOVE S1,[GLXVRS] >	; Get GLXLIB version number
	MOVEM S1,LIBVER		; Save GLXLIB Version number
	MOVE A,PIDBLK+PB.PID	; [JCR]Get our PID
	MOVEM A,PIDMS		; [JCR]SAVE FOR MSLCL
	MOVE A,[ZERMEM,,ZERMEM+1]
	SETZM ZERMEM
	BLT A,ZEREND		; Clear out data-base
TOPS10<
	MOVEI A,FDXSIZ		;Set up dummy FD
	HRLZM A,CRFFDH		; for default directory typeout
;**;[3098] Remove 2 lines at MSINI:+26L		MDR	18-NOV-87
	SETOM LOKAPP		;Nobody has the append interlock yet.
>;End TOPS10
	MOVE A,[CALL UUOH]	; Setup uuo handler call
	MOVEM A,.JB41##
	CALL HSTINI		; Clear the HOST table
	SETZM HDITAB		; Empty header-item table
	MOVEI A,KWDT0N+1+IFE KWDT0N,<1> ; Allocate a block for KWDTBL
	$CALL M%GMEM		;  ..
	MOVEM B,KWDTBL		;  ..
	MOVEI A,KWDT0N(B)	; Compute last address to fill
	HRLI B,KWDTB0		; Address of initial entries list
	BLT B,(A)		; Init the table
IFE KWDT0N,<
	AOS @KWDTBL		; Correct for zero-length table
>
	MOVEI A,[RET]		; Dummy routine
	MOVEM A,SCRREG		;  for non-video terminals
	MOVEM A,SCRRGR		;  ..
	MOVEM A,SCRBTM		;  ..
	SETZM MINWSZ		; Default to no fancy scrolling stuff
	SETZ A,			; Assume expert mode for default
	CALL .STEX0		; Set up COMND table pointers (default expert)
	MOVE T,[IOWD TAKPTN,TAKPDL]
	MOVEM T,TAKPTR		; Init take IFN stack pointer
	MOVEI A,.PRIIN		; Start getting cmds from primary input
	PUSH T,A		; Shove it on the stack
	MOVEM T,TAKPTR		;  ..
	CALL INIT		; Init interrupts and O.S.-specific stuff
	CALL TTINI		; Init terminal parameters
	SETOM	MSGSSQ		; Make sure "verb SAME" is OK
	CALL CMDINI		; Init command parser
	MOVEI A,2		; Default for auto-expunge is exit-command-only
	MOVEM A,AUTEXP		; Setup magic number
	TXNE F,F%AMOD		; Auto MOD hack?
	CITYPE <[Checking for new system messages...]
>
	CALL NAMINI		; Get info about possible networks
	CALL INITF		; Parse init file
	RET
SUBTTL INIT - init operating-system-dependent stuff

   TOPS20<
INIT:	MOVEI A,.FHSLF		; Setup interrupt stuff
	RPCAP
	TRZ B,-1		; Only enable LH caps
	IOR C,B
	EPCAP			; ...
	TXNE F,F%AMOD		; Unless doing auto MOD hack,
	JRST INIT0		;  in which case skip it for speed,
	CALL INTINI		;  init interrupt system
	MOVEI A,.FHSLF		; [ESM] Get capabilities
	RPCAP%
	TXNN B,SC%CTC		; Can we trap ^C?
	 JRST INIT0		; no, forget it then
	TXON C,SC%CTC
	EPCAP%			; let's do it
	MOVE A,[1,,CTLCIN]
	MOVEM A,CHNTAB+CTCCHN	; Set up processing address
	MOVEI A,.FHSLF
	MOVX B,1B<CTCCHN>
	AIC%			; Enable channel 0
	MOVSI A,.TICCC
	ATI%			; Assign ^C
INIT0:	GJINF
	DMOVEM A,MYDIR		; Save directory
	MOVE B,A
	HRROI A,MYDIRS		; Temp name for speed
	DIRST
	 JFCL
	SKIPE MYSTR		; Have a str: name yet?
	 JRST HAVSTR		; Yes, no need to run through here.
	MOVE A,[POINT 7,STRBUF]	; Temp string buffer
	MOVEI B,[ASCIZ /POBOX:</]
	CALL MOVSTR
	MOVEI B,MYDIRS		; Login directory string
	CALL MOVSTR
	MOVEI B,[ASCIZ />MAIL.TXT.1/]
	CALL MOVST0
;**;[3073] Change 1 line at INIT0:+14L	MDR	12-AUG-86
	MOVX A,<GJ%OLD!GJ%SHT!GJ%DEL!GJ%PHY> ;[3073]
	HRROI B,STRBUF
	GTJFN
	 ERJMP HAVSTR		; Should not happen
	MOVEM A,MSGJFN		; Save the jfn away
	HRROI A,MYSTR		; We need to save the structure
	MOVE B,MSGJFN		; Get JFN back for MAIL.TXT
	MOVX C,<FLD(.JSAOF,JS%DEV)+JS%PAF> ; We just want STR:
	JFNS%			; Put STR: in appropriate place
	 ERJMP .+1		; Don't care about errors
	SETZM MSGJFN		; We don't want this right now
	SETO A,			; Get rid of JFN
	RLJFN%
	 ERJMP .+1
HAVSTR:	MOVX A,.PRIOU		; Get line width of terminal
	MOVX B,.MORLW
	MTOPR
	MOVEM C,LINEW
	RET


INTINI:	MOVX A,.FHSLF
	EIR
	MOVX B,1B<TMRCHN>!1B<.ICILI> ; Timer and ill inst channels
	AIC
	CALLRET SETTIM		; Set up timer interrupt

   >;End TOPS20
TOPS10<
INIT:  	STKVAR <TEMP,<ARGBLK,10>,<QUERSP,.AEMAX>> ; Consume most of the stack
	SETZM USRTAB		; Zero the user cache table
	MOVE A,[-1,,.GTPPN]	; Get PPN
	GETTAB A,		;  ..
	 FATAL (Can't discover my PPN)
	MOVEM A,MYPPN		; Save it

	MOVE A,[3,,XPNCTC]	; Point to ctrl-C routine
	MOVX B,ER.ICC		; Bit to specify ctrl-C
	DMOVEM A,INTBLK		; Set it up
	SETZM INTBLK+2		; Clear new PC
	SETOM INTF		; Flag that interrupts are OK
	MOVEI A,INTBLK		; Turn on the interrupt
	MOVEM A,.JBINT		;  ..

	$CALL F%FCHN		; Eat channel zero so MSGJFN nonzero
	JUMPF R			;  means that a message file exists
	JUMPN A,R		; Nonzero channel returened?  All done then...
	OPEN [	EXP .IODMP		; Eat a disk DDB
		SIXBIT /DSK/
		EXP 0]
	 JFCL			; Who cares?
;
;	Here a QUEUE. finds out, via ACCTDAE, who we are
;
	MOVEI	C,<-1>+ARGBLK	; Point at the argument block storage
	PUSH	C,[QF.RSP!.QUMAE] ; Say we want to talk to actdae
	PUSH	C,[-1]		; Set the node to central
	MOVEI	B,QUERSP	; Point at the response storage
	HRLI	B,.AEMAX	; Get the number of words we can play with here
	PUSH	C,B		; Put len,,loc in the arg block
	PUSH	C,[QA.IMM!<1,,.QBAFN>] ; Get the subfunction argument type
	PUSH	C,[EXP UGOUP$]	; Say we want the user profile
	PUSH	C,[1,,.UGPPN]	; Store the ppn descriptor
	MOVEI	B,MYPPN		; Point to the ppn
	MOVEM	B,MYDIR		; Save for later use by GETUSR while we're at it
	PUSH	C,B		; And store that
	ANDI	C,-1		; Get rid of junk in the left half
	SUBI	C,ARGBLK	; Compute the number of words we filled in
	MOVEI	A,ARGBLK	; Point at the argument block
	HRL	A,C		; Copy the block length
	QUEUE.	A,		; Ask for the users profile
	  JRST [MOVE 	A,[ASCIZ/Anon/] ; We have to call him something
		MOVEM	A,MYDIRS ; We'll make him anonymous
		POPJ	P,]	; With that done skip the 8-7bit translation
	MOVEI	A,.AENAM+QUERSP ; Get the returned username
	HRLI	A,(POINT 8)	; Make it a byte pointer
	MOVEI	B,^D40		; MYDIRS (destination) byte count
	MOVE	C,[POINT 7,MYDIRS] ; Point to where the user name goes
	CALL	TRANS		; Translate 8-bit to 7-bit
	HRRZ 	B,.AEPNM+QUERSP	; Get the pointer to the personal name
	JUMPE	B,NOPNAM	; Zero indicates no personal name
	MOVEI	D,QUERSP	; We have a personal name, get its address
	ADD	D,B		; ..
	MOVEI	A,^D39
	CALL	ALCSB		; Get a chunk
	 JRST	NOPNAM		; Propagate failure
	MOVEM	B,TEMP		; Save string address
	MOVE	C,B		; Copy address of string space
	HRLI	C,(POINT 7,)	; Form byte pointer
	MOVE	A,[POINT 8,(D)]	; Make a byte pointer to ther personal name
	MOVEI	B,^D40		; ASCIZ # of chars in final personal name
	CALL	TRANS		; With the null
	MOVE	A,TEMP		; Return string address to caller
	EXCH	A,PERSON	; Stuff address of new string
	CAIE	A,0		; Was anything there before?
	CALL	RELSB		; Yes, return through deallocation routine

NOPNAM:	MOVE	B,MYPPN		; See if [1,2]
	CAMN	B,[1,,2]	; which is possible source of confusion
	WARN	(Your messages will be considered to be from Operator)
	POPJ	P,

;
;	Setup for translation from 8-bit to 7-bit.  CHTRN. block look like:
;
;	CH.FBR,,source count
;	source byte pointer
;	0
;	destination count
;	destination byte pointer
;	0
;
TRANS:	MOVEM	A,1+ARGBLK	; Source byte pointer
	SETZM	2+ARGBLK	; 0
	MOVEM	B,3+ARGBLK	; Destination count
	MOVEM	C,4+ARGBLK	; Destination byte pointer
	SETZM	5+ARGBLK	; 0
	MOVEI	B,1		; Count the nul
GETLEN:	ILDB	C,A		; Get the next character
	CAIE	C,0		; Is it a nul?
	 AOJA	B,GETLEN	; Nope count it and loop
	TXO	B,CH.FBR	; Declare 8-bit to 7-bit translation
	MOVEM	B,0+ARGBLK	; CH.FBR,,source count in first word
	MOVEI	A,ARGBLK	; Point to the argument block
	CHTRN.	A,		; Translate the username into ASCIZ
	  JFCL			; Don't panic
	RET

>;End TOPS10
;TTINI - Init terminal parameters, called at startup and by
; SET VIDEO-MODE command

   TOPS20<
TTINI:	MOVEI A,.CTTRM
	GTTYP
	SETZ C,
	CAIN B,.TTV52		; VT52?
	 HRROI C,[BYTE (7)33,"H",33,"J",0]
	CAIE B,.TT125		; VT125?
	CAIN B,.TT102		; or VT102?
	 MOVEI B,.TT100		; is the same as a generic 100
	CAIE B,.TT131		; VT131?
	CAIN B,.TT200		; VT200-style?
	 MOVEI B,.TT100		; these too are just like a vt100 to us
	CAIN B,.TT100
	 JRST [	HRROI C,[BYTE (7)33,"[","H",33,"[","J",0]
		MOVEI A,SREGV1		; Init ptrs to terminal-dependent rtns
		MOVEM A,SCRREG
		MOVEI A,SRGRV1
		MOVEM A,SCRRGR
		MOVEI A,SBTMV1
		MOVEM A,SCRBTM
		JRST .+1]
	CAIN B,.TTV05		; VT05
	 HRROI C,[BYTE (7)35,177,177,177,177,37,177,177,177,177,0]
	MOVEM C,V52FLG		; Remember string
	MOVEI D,SAVMOD
	CALL GETTYM		; Get current tty modes
	TDZ C,[3B9!3B19]	; Dont echo esc or ctrl-V
	SFCOC
	MOVEM C,2(D)
	RET
   >;End TOPS20
;TTINI - TOPS10 version

   TOPS10<
TTINI:	MOVNI C,1		; Get UDX of controlling TTY
	TRMNO. C,		;  ..
	 FATAL (Can't get UDX for controlling TTY)
	MOVEM C,TTYUDX		; Save for later
	MOVE A,[2,,B]		; Get page size
	MOVX B,.TOSSZ		; (actually the page stop length)  ..
	TRMOP. A,
	 FATAL <Can't get terminal's page size>
	MOVEM A,SAVPSZ		; Save for later
	MOVE A,[2,,B]		; Arg block for TRMOP. in B and C
	MOVX B,.TOWID		; Get line width of terminal
	TRMOP. A,		;  ..
	 FATAL (Can't get terminal's line width)
	MOVEM A,LINEW		; Save it
	MOVE A,[2,,B]		; Arg block again
	MOVX B,.TOTRM		; Get TTY type
	TRMOP. A,		; Get type
	 JFCL
	SETZ B,			; Assume not fancy terminal
	CAME A,[SIXBIT /VT61/]
	CAMN A,[SIXBIT /VT52/]
	 MOVE B,[POINT 7,[BYTE (7)33,"H",33,"J",0]]
	CAMN A,[SIXBIT /VT05/]
	 MOVE B,[POINT 7,[BYTE (7)35,177,177,177,177,37,177,177,177,177,0]]
	HLLZ A,A		; Assume VTnxx means VT100-compatible
	CAME A,[SIXBIT /VT2/]	; VT100 or VT200 series?
	 CAMN A,[SIXBIT /VT1/]	; Get appropriate clear-screen sequence
          JRST [MOVE B,[POINT 7,[BYTE (7)33,"[","H",33,"[","J",0]]
		MOVEI C,SREGV1		; Init ptrs to terminal-dependent rtns
		MOVEM C,SCRREG
		MOVEI C,SRGRV1
		MOVEM C,SCRRGR
		MOVEI C,SBTMV1
		MOVEM C,SCRBTM
		JRST .+1]
	MOVEM B,V52FLG		; Save for BLANK command
	RET
   >;End TOPS10
SUBTTL Interrupt routines

;Illegal instruction trap

   TOPS20<

ILITRP:	CIS
	JCERR <Illegal instruction trap>

;^C interrupt

TRPCTC:	$BGINT (1)
	CALL K%FLSH		; Let's not have ^C followed by garbage!
	TMSG <^C
>
	CALL @SCRRGR		; Remove scroll region, if any,
	CALL @SCRBTM		;  and go to bottom of screen
	SETZM SCRLFL
	HALTF%			; Let user out
	CALL TTINI		; See if the wise guy changed termtypes on us
	$DEBRK			; Dismiss

;Here on any and every ^C. It will then pass control over to whoever
;should handle the interrupt.
CTLCIN:	TXNE F,F%XPIP		; Are we doing an expunge?
	 JRST XPNCTC		;  Yes, handle interrupt there
	TXNN F,F%LOGO		; Is Logout-on-exit set?
	 JRST TRPCTC		;  No, handle ^C appropriately
	$BGINT (1)		; Logout-on-exit set, don't let user out.
	WARN <Control-C intercepted, type "EXIT" to logout>
	$DEBRK

; Timer interrupt


TMRINT:	$BGINT (3)		; Level 2
	MOVEM P,INTP		; Save pointer to excessively tiny stack
	MOVE P,[IOWD NPDL,INTPDL] ; Get pointer to more reasonable stack
	SKIPE OKTINT		; OK for timer at this time?
	 CALL TMRIN1		; Yes, check for new messages
TMRIN2:	CALL SETTIM		; Set next timer up
	MOVE P,INTP		; Restore stunted GLXLIB stack
	$DEBRK			; Dismiss the interrupt

TMRIN1:	CALL CHECK0		; Check for new guys
	 RET			; None, return now
	CALLRET CHECKS		; Print message on new guys and return

SETTIM:	MOVE A,[.FHSLF,,.TIMEL]	; Elapsed time
	MOVX B,^D5*^D60*^D1000	; 5 mins
	MOVEI C,5		; Chan 5
	TIMER
	 JFCL
	RET

   >;End TOPS20
SUBTTL Logout-on-exit and control-C routines

   TOPS20<
.LOGOU:	CONFRM
	TXOE F,F%LOGO		; Remember logout on exit
	JRST [	WARN <Logout-on-exit already enabled>
		RET]
	TXZ F,F%RSCN		; Don't exit if exec command
	WARN <Will logout on exit>
	RET
   >;End TOPS20

;Prevent control-C while expunging deleted messages

CTCLOK:	CALL XCLENQ		; Make ENQ exclusive
	 RET			; Can't, must be other readers
	TXO F,F%XPIP		; Flag expunge in progress
   TOPS20<
	MOVX A,.FHSLF
	MOVX B,1B<TMRCHN>	; Deactivate timer interrupts
	DIC
   >;End TOPS20
	RETSKP			; Done
;Here if ^C while expunge in progress

XPNCTC:
   TOPS20<
	$BGINT (1)
	TXON F,F%CTLC		; Remember ^C typed
	WARN <File update in progress - please wait>
	$DEBRK
   >;End TOPS20
   TOPS10<
	PUSH P,INTBLK+2		; Save return address
	AOSE INTF		; Interrupt already in progress?
	RET			; Yes, dismiss without reenabling
	SETOM INTF		; Flag that interrupts are OK now
	SETZM INTBLK+2		;  ..
	TXNN F,F%XPIP		; Expunge in progress?
	JRST [	$TEXT (KBFTOR,<^^C>)
		$CALL K%FLSH	; Make sure the ^C is seen
		PJRST CKXIT0 ]	; and exit gracefully (cleaning screen)
	TXON F,F%CTLC		; ctrl-C already typed?
	WARN <File update in progress - please wait>
	RET
   >;End TOPS10

;Here when expunge done

CTCOK:	TXZ F,F%XPIP		; Clear expunge in progress flag
	CALL SHRAGN		; Make ENQ shared again
	TXZE F,F%CTLC		; ^C typed while locked?
	CALLRET CKEXIT		; Yes, logout or exit as appropriate
   TOPS20<
	MOVX A,.FHSLF		; Reactivate timer interrupts
	MOVX B,1B<TMRCHN>
	AIC
   >;End TOPS20
	RET			; and return
;ININAM - Build FD for private MS.INIT (MS.INI on TOPS10)
;SYSNAM - Build FD for system MS.INIT
;Returns +1: Insufficient memory
;	 +2: OK, A/ size of FOB, B/ address of FOB

SYSNAM:	TXZA F,F%F1		; Remember SYSNAM entry
ININAM:	TXO F,F%F1		; Remember ININAM entry
	MOVEI A,FDXSIZ		; Allocate max FD size
	$CALL M%GMEM		;  ..
	JUMPF [	WARN (Can't process init file -- no memory)
		RET]
	MOVE D,B		; Place chunk addr in safe reg
	MOVEI A,FDXSIZ		; Put length into FD
	HRLZM A,.FDLEN(D)	;  ..
   TOPS20<
	MOVEI A,.FDSTG(B)	; Where to build string
	HRLI A,(POINT 7,)
;**;[2699] Change 1 line at ININAM:+11	MDR	20-MAY-86
	TXNN F,F%F1		;[2699] Private or system? (don't clear the bit)
	JRST [	MOVEI B,[ASCIZ /SYSTEM:/]
		CALL MOVSTR		; System
		JRST ININM0]
	MOVEI B,[ASCIZ /POBOX:</]
	CALL MOVSTR
	MOVEI B,MYDIRS		; My login directory
	CALL MOVSTR
	MOVEI B,">"
	IDPB B,A
ININM0:	MOVEI B,[ASCIZ /MS.INIT/]
	CALL MOVST0
   >
   TOPS10<
	DMOVE A,[SIXBIT /DSK/	; Device
		 SIXBIT /MS/]	; Name
	TXZN F,F%F1		; Private or system?
	MOVE A,[SIXBIT /STD/]	; System
	DMOVEM A,.FDSTR(D)
	MOVE A,[SIXBIT /INI/]	; Extension
	MOVEM A,.FDEXT(D)
	MOVE A,MYPPN		; Get logged-in PPN
	MOVEM A,.FDPPN(D)	; Stuff it
   >
	MOVEI A,FDXSIZ		; Size of FD
	HRLZM A,.FDLEN(D)
	MOVE A,D		; Allocate and link FOB
	CALL ALCFOB		;  ..
	 JRST [	WARN (Can't process init file -- insufficient memory)
		RET]
	RETSKP			; Win -- skip return
SUBTTL INITF - Parse init files (SYSTEM: and private)

; Process the SYSTEM:MS.INIT file first before processing
; POBOX:MS.INIT by reinstalling edit 2609 as edit 2697 - MDR

INITF:	CALL SYSNAM		; Build FD for system init file
	 JRST INITF1		; Error message already printed
	CALL INITX		; Go process init file
	 JFCL			; Don't care if it isn't there
INITF1:	CALL ININAM		; Build filespec for private init file
	 RET			; Error msg already printed
	CALL INITX		; Go process the file
	 JFCL			; Don't care if not there
	RET

;INITX - Attempt to open, and process an init file.
;Call:
;	A/ FOB size
;	B/ FOB address
;
;Return	+1: failure (file not found)
;	+2: success

INITX:	MOVE T,TAKPTR		; Init IFN stack pointer
	HLRE C,T		; First check room on the stack
	MOVN C,C		; Get size of area left
	CAIGE C,3		; Need three words
	JRST [MOVE C,FOB.FD(B)	; No room, point to FD for error msg
	      CALL CRIF		; Get to left margin
	      $TEXT (KBFTOR,<?Command files nested too deeply, detected in opening ^F/(C)/>)
	      CALLRET RELFOB]	; Release FOB and give failure return
	PUSH T,A		; Push FOB pointer and size onto IFN stack
	PUSH T,B		;  ..
	$CALL F%IOPN		; Open for read
	JUMPF [	POP T,B			; Recover FOB info
		POP T,A			;  ..
		CALL RELFOB		; Release chunks
		RET]			; Return
	CALL .TAKE0		; Set up COMND to take from file
	MOVEM P,INIP		; Save state of the world
	MOVEI A,PDL		; Compute how many words on PDL currently used
	HRRZ B,P		;  so we know how much to save
	SUBI B,(A)		;  ..
	MOVE A,[PDL,,INIPDL]	; Save entire stack context
	BLT A,INIPDL(B)
	MOVEI A,INITX0		; Where to go on EOF of init file
	MOVEM A,INIRET		;  ..
	JRST CMDLUP		; Go parse init file
INITX0:	MOVE P,INIP		; Restore state of world
	MOVE A,[INIPDL,,PDL]
	BLT A,(P)
	SETZM INIP		; Flag init file no longer in progress
	SETZM INIRET		;  ..
	$CALL K%FLSH		; Flush TTY buffers
	RETSKP			; Return
	END

; *** Edit 2471 to MSCNFG.MAC by PRATT on 14-Nov-85
; Changes to break up MS into a smaller module.
; *** Edit 2474 to MSCNFG.MAC by PRATT on 18-Nov-85
; Changes for TOPS10 to make MS.MAC smaller
; *** Edit 2484 to MSCNFG.MAC by SANTEE on 21-Nov-85
; Clean up the various edit histories.
; *** Edit 2485 to MSCNFG.MAC by MAYO on 21-Nov-85
;
; *** Edit 2486 to MSCNFG.MAC by PRATT on 22-Nov-85
; Copyright statements
; *** Edit 2489 to MSCNFG.MAC by PRATT on 26-Nov-85
; Take SYSTEM:MS.INIT before private MS.INIT (or .INI files on the -10)
; *** Edit 2607 to MSCNFG.MAC by SANTEE on 10-Dec-85
; Make MS/MX get along well together. Have MS write dashes at the end of
; messages. While we're there remove some of the NETMAI code.
; *** Edit 2609 to MSCNFG.MAC by PRATT on 11-Dec-85
; Put .INIT file stuff back the way it was. Don't need it anymore and TOPS-10
; people don't want it.
; *** Edit 2622 to MSCNFG.MAC by PRATT on 23-Dec-85
; Fix "MOVE or DELETE" length invalid error, SET DEF DIR, SET DEF PROT (-10)
; *** Edit 2650 to MSCNFG.MAC by SANTEE on 1-Feb-86
; Eliminate calls to set up the username data base from USERS.TXT. This is has
; been replaced by SM's calls to the accounting system. -10 only.
; *** Edit 2651 to MSCNFG.MAC by SANTEE on 2-Feb-86
; Eliminate the need for MSUTAB at all. Move the few useful lines elsewhere.
; *** Edit 2652 to MSCNFG.MAC by SANTEE on 2-Feb-86
; The last edit hit one too many words. Fix it.
; *** Edit 2664 to MSCNFG.MAC by APPELLOF on 3-Mar-86
; Get GLXLIB version number properly for TOPS-10
; *** Edit 2668 to MSCNFG.MAC by SANTEE on 3-Mar-86
; When we decided to get the users name from the accounting system we broke our
; warning message to the operator. Fix it up.
; *** Edit 2677 to MSCNFG.MAC by SANTEE on 7-Mar-86
; Take GLXVER out of the EXTERNAL statement.
; *** Edit 2689 to MSCNFG.MAC by APPELLOF on 26-Mar-86
; Prevent ERF (Error Reading File) on TOPS-10 if MX is appending when we check
; the size of the mail file. Also cut down on the number of LOOKUPs we do.
; *** Edit 2690 to MSCNFG.MAC by APPELLOF on 31-Mar-86
; Make TOPS-10 preserve TTY STOP, etc. when exiting text-scroll mode.
; *** Edit 2697 to MSCNFG.MAC by RASPUZZI on 30-Apr-86
; Reinstate edit 2609 - Take SYSTEM:MS.INIT before private MS.INIT
; *** Edit 2699 to MSCNFG.MAC by RASPUZZI on 20-May-86
; More of edit 2697 - make MS smart enough to search system wide logical name
; of SYSTEM: when taking SYSTEM:MS.INIT
; *** Edit 2717 to MSCNFG.MAC by PRATT on 6-Jun-86
; Make sure Arpa mail delivery is off by default

; *** Edit 2718 to MSCNFG.MAC by SANTEE on 10-Jun-86
; Get the personal name from the accounting system on TOPS-10. Also, while I
; was there clean up ^C (print it out at the right time and clear the scrolling
; region if set up) and make the listing just a little bit prettier. 
; *** Edit 2719 to MSCNFG.MAC by RASPUZZI on 13-Jun-86
; If we don't have a STR: in MYSTR at init time, get one so we won't fail if
; someone is lazy and does a MS SEND to EXEC. 
; *** Edit 2721 to MSCNFG.MAC by RASPUZZI on 16-Jun-86
; Fix minor problem with edit 2719 (change SETZ A, to SETO A,)
; *** Edit 2729 to MSCNFG.MAC by RASPUZZI on 1-Jul-86
; Consider deleted files when getting a handle on MAIL.TXT for MS SEND problem 
; *** Edit 3073 to MSCNFG.MAC by RASPUZZI on 12-Aug-86
; Prevent MS from fouling up the MS####.MAI file spec for MX by using the
; GJ%PHY bit in the GTJFN% for MAIL.TXT.1.
; *** Edit 3098 to MSCNFG.MAC by RASPUZZI on 18-Nov-87
; Redo part of edit 3096 so that some initialization is done a few instructions
; earlier. Done for Ned.