Google
 

Trailing-Edge - PDP-10 Archives - bb-jr93k-bb - 10,7/mon/mongen.mac
There are 17 other files named mongen.mac in the archive. Click here to see a list.
TITLE	MONGEN - PROGRAM TO DEFINE MONITOR AND NETWORK CONFIGURATIONS - V103
SUBTTL	T. HASTINGS/TH/EP/DAL/JBS	5-DEC-89

EDITNO==330		;EDIT NUMBER (**MUST MATCH "M.GEN" IN COMMON.MAC**)
VERSION==103		;MAJOR VERSION NUMBER
VMINOR==0		;MINOR VERSION NUMBER
VWHO==0			;WHO LAST EDITED

	SALL
	.DIRECT	FLBLST

;NOTE:	THE COPYRIGHT THAT FOLLOWS IS USED BY FGEN.  KEEP IT CLEAN AND
;	PRETTY SO OUTPUT FILES DON'T LOOK MESSY AND UNPROFESSIONAL.


;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
;  OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
CPYTXT:	ASCIZ	&
      COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION, MAYNARD MASS.
	1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978
	      1979, 1980, 1982, 1984, 1986, 1987, 1988.
			ALL RIGHTS RESERVED.
&


	LOC	<JOBVER==137>		;VERSION NUMBER
	BYTE	(3)VWHO(9)VERSION(6)VMINOR(18)EDITNO
	RELOC

;SYMBOLS WHICH ARE PARAMETERS OF MONGEN ITSELF(PREFIX MP)
IFNDEF MP.MVN,<MP.MVN==^D704>	;MONITOR VERSION NUMBER
IFNDEF MP.PDL,<MP.PDL==40>	;PD LIST LENGTH
IFNDEF MP.AMX,<MP.AMX==^D10>	;MAX NO. OF ANSWERS INSIDE PARENS
IFNDEF MP.SMX,<MP.SMX==^D1>	;MAX SYSTEM (KL10 = 0, KS10 = 1)
IFNDEF MP.AQB,<MP.AQB==^D200>	;LENGTH OF AUTOCONFIGURE QUESTION BUFFER
IFNDEF MP.LMX,<MP.LMX==^D80>	;MAX. NO. OF CHAR ALLOWED IN INPUT LINE
				; NOT COUNTING EOL OR NULL
IFNDEF MP.FTA,<MP.FTA==^D50>	;NUMBER OF FEATURE TESTS THAT MAY BE ADDED
IFNDEF MP.FTL,<MP.FTL==^D80>	;LENGTH OF CUSTOMER DEFINE FEATURE DESCRIPTION

COMMENT	"

ASSEMBLY INSTRUCTIONS:
.COMPIL MONGEN

LOADING INSTRUCTIONS:
.LOAD MONGEN

DEBUGGING INSTRUCTION:
.DEBUG MONGEN
  BY DEPOSITING NON-ZERO IN LOCATION DEBUG WITH DDT, MONGEN WILL
  OUTPUT ALL FILE STUFF TO TTY TOO INSIDE <>.
"
;MONGEN IS A DIALOG PROGRAM(ACTUALLY 2 PROGRAMS IN ONE) WHICH
;ASKS THE CUSTOMER QUESTIONS ABOUT HIS CONFIGURATION.
;THE RESULTS OF THIS DIALOG ARE OUTPUT AS A FILE OF PARAMETER ASSIGNMENTS
;WHICH CAUSE CONDITIONAL ASSEMBLY IN THE DATA BASE MODULES OF THE MONITOR.
;THUS EACH CUSTOMER IS ABLE TO CUSTOM-MAKE HIS MONITOR FOR THE FEATURES
;HE WISHES DEPENDING ON HARDWARE AND SOFTWARE REQUIREMENTS.
;THESE PARAMETER ASSIGNMENTS TAKE THE FORM OF MACRO CALLS USING
; THE XP MACRO OF TWO ARGUMENTS AS DEFINED IN FILE S.MAC.  THE XP
; MACRO DEFINES THE FIRST SYMBOL TO BE EQUAL TO THE SECOND EXPRESSION
; AND DECLARES THE SYMBOL TO BE INTERNAL AND DDT OUTPUT SUPPRESSED.

;USER INSTRUCTIONS FOR RUNNING MONGEN:
;MONGEN WILL ASK YOU QUESTIONS ABOUT YOUR CONFIGURATION AND
; OUTPUT THEM IN A FILE.  TO HELP YOU ANSWER THESE QUESTIONS,
; MONGEN GIVES THREE LEVELS OF
; GUIDANCE.  SHORT MODE FOR THE VERY EXPERIENCED, PROMPT MODE
; WHERE YOU ARE GIVEN CHOICES, AND LONG MODE WHERE YOU
; ARE GIVEN THE CHOICES ALONG WITH AN EXPLANATION.  YOU MAY CHANGE
; THE MODE FOR A SINGLE QUESTION IF YOU DO NOT UNDERSTAND IT BY SIMPLY TYPING /H
; TO CHANGE THE MODE FOR THE REST OF THE QUESTIONS, TYPE /HELP:X
; WHERE X IS SHORT, PROMPT, OR LONG.  ACTUALLY MONGEN ALWAYS
; ALLOWS ABBREVIATIONS EVERYWHERE, SO S, P, AND L SUFFICE
; ALONG WITH H FOR HELP.
; QUESTIONS ASKING FOR A NUMBER(DECIMAL UNLESS SPECIFICALLY NOTED
; AS OCTAL) ALWAYS INDICATE THE RANGE INSIDE PARENS, IE (MIN-MAX).
; OTHER QUESTIONS ARE ASKING FOR ONE
; OF A LIST OF CHOICES.  THE CHOICES ARE LISTED INSIDE PARENS.
; STILL OTHER QUESTIONS ASK
; FOR Y OR N AND STILL OTHERS ASK FOR JUST A STRING.
; IN ALL QUESTIONS WHICH HAVE PROMPTING INSIDE PARENS, THE FIRST
; ITEM IN THE LIST IS CALLED THE DEFAULT AND IS ASSUMED IF YOU
; ANSWER JUST WITH CARRIAGE RETURN.
; (,ANS0,ANS1,...) MEANS NO DEFAULT ASSUMED ON JUST CR
; CALLER OF ASK ROUTINE MUST CHECK FOR N=0 IN THIS CASE AND TAKE
; APPROPRIATE ACTION.  (THIS FEATURE IS USED BY HELP ITSELF TO ALLOW
; JUST CR TO MEAN NEXT LONGER HELP MODE).


;RULE: ALL SYMBOLS ARE GENERATED ALL OF THE TIME,
; NO MATTER HOW DIALOG BRANCHES.  WHY?  SO USERS READING THE
; DATA BASE MODULES NEVER NEED TO LOOK AT MONGEN TO UNDERSTAND
; THE MONITOR.
;THE ONLY LOCAL STORAGE IN MONGEN IS USED TO STORE ANSWERS IF THE
; VALUES ARE NEEDED LATER FOR ERROR CHECKING.  MOST ANSWERS ARE OUTPUT
; IMMEDIATELY AND SO ARE NEVER STORED IN MEMORY.  BY CONVENTION THE NAMES
; OF VARIABLES WARE THE SAME AS THE ASSOCIATED SYMBOLS OUTPUT IN
; THE FILE.  OUTPUT SYMBOLS ALL START WITH THE TWO LETTERS "M."  OR "FT" THIS MAKES
; IT EASY TO RECOGNIZE SYMBOLS DEFINED BY MONGEN WHEN READING THE REST
; OF THE MONITOR.
;MONGEN IS STUPID AND SIMPLE MINDED.  IS KNOWS AS LITTLE ABOUT
; THE MONITOR AS POSSIBLE.  IT NEVER ADDS TWO ANSWERS TOGETHER, FOR EXAMPLE.
; IT ALWAYS GENERATES ALL SYMBOLS ALL THE TIME, NO MATTER
; HOW THE QUESTIONS ARE ANSWERED.  IT IS UP TO COMMON TO TAKE THE RAW DATA
; AND PERFORM COMPUTATION AND DEFINE NEW AND CONVENIENT SYMBOLS.
;THE FOLLOWING MACROS(AND SUBROUTINES BY THE SAME NAME) ARE USED TO ASK
; CUSTOMER QUESTIONS AND GET HIS ANSWERS:
;SOME ANSWERS ARE NUMERIC, WHILE OTHERS ARE CHOICES LIKE Y OR N
; OR AN ITEM OUT OF A LIST.  ALL ANSWERS ARE CHECKED FOR REASONABLENESS.
; THE GOAL IS TO PREVENT AS MANY ERRORS AS POSSIBLE, SINCE ERRORS
; ARE NOT USUALLY DISCOVERED UNTIL THE MONITOR IS LOADED AND SOMETIMES
; EVEN THEN IT IS HARD TO FIND THE PROBLEM.  ALL NUMERIC ANSWERS ARE
; CHECKED FOR MIN AND MAX AS INDICATED INSIDE PARENS WITH A -
; SEPARATING THE MIN AND MAX.  IF A NUMERIC QUESTION
; DOES NOT HAVE A RANGE SPECIFIED, MONGEN WILL PRINT
; ? INTERNAL MONGEN ERROR - ABOVE QUESTION MUST HAVE (...,MIN-MAX) -
; EDIT MONGEN.
; AND EXIT.  NOTE: (MIN-?) IS OK TO MEAN NO UPPER BOUND
;  THE PROGRAMMER MUST EDIT MONGEN TO FIX HIS BUG.
;  THE CUSTOMER SHOULD NEVER SEE THIS MESSAGE, SINCE IT IS A DEBUGGING
;  AID AND SHOULD BE CAUGHT DURING TESTING.
;EACH MACRO HAS A TEXT QUESTION AS AN ARGUMENT.  THE ANSWER IS RETURNED
; IN AC N.  IF AN ERROR IS DETECTED, THE QUESTION IS
; REASKED AT NEXT HIGHER LEVEL OF VERBOSITY.  RETURN IS ALWAYS WITH
; A SUCCESSFUL VALUE.  THE CUSTOMER MAY HAVE CHANGED LEVELS OF VERBOSITY
; USING THE /HELP: FEATURE.  LOCATION SAVLV HAS CURRENT PERMANENT LEVEL,
; WHILE LEVEL FOR CURRENT QUESTION IS KEPT IN AC LV.

;ASKYN  - ANSWER Y OR N, (Y=1, N=0) NOTE: OPPOSITE FROM ASKLST
;	  HOWEVER MORE USEFUL, SINCE CAN OUTPUT DIRECTLY IN XP MACRO
;	  WHERE XP SYMBOL,1 MEANS Y AND XP SYMBOL,0 MEANS N.
;	(Y,N) MUST APPEAR IN QUESTION AS A PROMPT.  FOR CONSISTENCY
;	THE Y MUST BE BEFORE THE N SO CR ALWAYS MEANS Y.
;ASKDEC - ANSWER DECIMAL NUMBER.  QUESTION SHOULD HAVE (DEFAULT,MIN-MAX).
;	IF NO DEFAULT IS REASONABLE(SUCH AS NUMBER OF JOBS), ONLY
;	(MIN-MAX) IS REQUIRED.
;ASKOCT - ANSWER OCTAL NUMBER.  QUESTION SHOULD HAVE (DEFAULT,MIN-MAX)
;	IF NO DEFAULT IS REASONABLE, ONLY (MIN-MAX) IS REQUIRED.
;ASKLIN - ANSWER OCTAL LINE NUMBER OR CTY
;ASKSTR - ANSWER ARBITRARY STRING.  STORED IN ASCSTR AS ASCIZ.
;	N=NO. OF CHARS IN STRING NOT COUNTING NULL OR CRLF.
;ASKLST - ANSWER ONE OF THE ITEMS IN THE PROMPTING LIST IN PARENS.
;	N=0,1,2,... IE POSITION OF ANSWER IN LIST.  IF ANSWER IS NOT
;	IN LIST OR ABBREVIATION IS NOT UNIQUE, THE QUESTION IS REASKED
;	AT HIGHER LEVEL OF VERBOSITY.  ERROR MESSAGES ARE:
;	? TYPE ENOUGH TO UNIQUELY DISTINGUISH ANSWER
;	? ANSWER WITH ONE OF THE CHOICES INSIDE ( )
;	? INTERNAL MONGEN ERROR - NO "(" IN ABOVE MESSAGE -
;	EDIT MONGEN AND ADD (ANS0,ANS1,...)
;	? INTERNAL MONGEN ERROR - TOO MANY POSSIBLE ANSWERS ABOVE -
;	EDIT MONGEN AND INCREASE MP.AMX
;ASKAUT - ANSWER "NO", "YES", OR "PROMPT" TO AUTOCONFIGURED DEVICE
;	QUESTIONS.
;TO ASK A MULTIPLE LINE QUESTION, THE FOLLOWING SPECIAL MACROS:
;ASKMN  - ANSWER M OR M,N WHERE M AND N ARE OCTAL LINE
;	NUMBERS OR JUST CTY
;ASKMNP - ANSWER M,P OR M-N,P WHERE M,N, AND P ARE OCTAL LINE NUMBERS
;
;ASKTMN - ANSWER M OR M,N OR ALL FOR 7 TRACK TAPE UNITS

;TO OUTPUT TO TTY, FILE OR BOTH, USE THE FOLLOWING:
; USUAL FILE OUTPUT RADIX IS OCTAL, WHILE TTY OUTPUT RADIX IS DECIMAL,
; UNLESS NAME HAS OCT OR DEC IN IT, IN WHICH THE RADICES ARE THE SAME.

;BTHOUT - OUTPUT DECIMAL TO BOTH TTY AND FILE, FILE AS A COMMENT(IE ; INSERTED)
;BTHOCT - OUTPUT OCTAL TO BOTH TTY AND FILE, FILE AS A COMMENT
;FILEOUT - OUTPUT TO FIL ONLY
;FILCOM - OUTPUT TO FILE ONLY AS A MULTI-LINE COMMENT(IE ; INSERTED)
;TTYOUT - OUTPUT TO TTY ONLY(DECIMAL)(USUAL)
;TTYOCT - OUTPUT TO TTY ONLY(OCTAL)(UNUSUAL)
;FILSTR - OUTPUT STRING IN ASCSTR TO FILE
;FILDEC - OUTPUT TO FILE WITH RADIX DECIMAL INSTEAD OF OCTAL
;FILDC2 - OUTPUT TO FILE WITH RADIX DECIMAL, AT LEAST 2 CHARS
;ALL OF THE ABOVE MACROS(AND SUBROUTINES) CAN HAVE A SECOND
; ARGUMENT WHICH IS THE LOCATION OF A VALUE TO BE SUBSTITUTED FOR * IN
; THE FIRST ARGUMENT.  THE VALUE CAN BE LEFT JUSTIFIED SIXBIT OR A NUMBER.
; IF THE LOCATION OF THE VALUE IS AC N, NO EXTRA INSTRUCTION IS GENERATED
; SINCE THE MACRO USUALLY PICKS UP THE LOCATION AND PUTS IT IN N.
; HOWEVER IT IS RECOMENDED THAT N BE INCLUDED AS THE SECOND ARGUMENT
; TO INDICATE TO THE READER THAT A SUBSTITION IS GOING TO TAKE PLACE USING N.
; ELSE NEW CODE MAY BE INTRODUCED WHICH USES N BEFORE THE MACRO CALL.
; WHENEVER THE CHARACTER @ IS SEEN IT IS CONVERTED TO CRLF.  THIS
; MAKES IT NICER FOR FORMATTING THE MESSAGES INSIDE <>, SINCE
; THE <CLOSE ANGLE> CAN ALWAYS BE ON THE SAME LINE, EVEN WHEN CRLF IS WANTED.

;EXAMPLE:
;	ASKYN	<LPT(Y,N)[LINE PRINTER AT STATION *]>,OSN
;	FILOUT	<MACRLP	*@>,N

;ALL SUBROUTINES WHICH IMPLEMENT THE MACROS HAVE THE SAME CALLING
; SEQUENCE:
;CALL:	MOVE	LV,QUESTION LEVEL -1 FOR SHORT, 0 FOR PROMPT, 1 FOR LONG
;	MOVE	N,+NUMBER OR LEFT JUSTFIED SIXBIT TO BE
;				; SUBSTITUTED FOR *
;	MOVEI	T1,ADR OF ASCIZ MESSAGE
;	PUSHJ	P,ASKXXX OR FILXXX OR TTYXXX OR BTHXXX
;	ALWAYS RETURN WITH ANSWER IN N( AND STRING IN ASCSTR) OR
;	ORIGINAL CONTENTS OF N IF JUST OUTPUT ROUTINE.
;ALL SINGLE LINE ANSWERS ARE ANSWERED ON THE SAME LINE AS QUESTIONS.
; THIS SAVES PAPER. THE FORMAT IS QUESTION(WITHOUT QUESTION MARK)
; FOLLOWED BY COLON AND ONE SPACE.

;ONLY THE ASK MACROS ADD ANY CHARACTERS TO THE TEXT IN THE FIRST
; ARGUMENT.  THE BEGINNING OF THE MESSAGE IS INSERTED AN ";	" AS
; A COMMENT FOR THE FIL, AND ": " IS APPENDED TO THE END
; OF THE QUESTION SO THAT ALL QUESTIONS LOOK ALIKE.  NONE OF THE
; OUTPUT ONLY MACROS ADD ANY SPECIAL CHARACTERS.

;BY CONVENTION PROMPTING IN () APPEARS BEFORE LONG DIALOG IN [].
; THUS A USER CAN TYPE ^O IF THE USER GETS BORED, AND GET THE MOST USEFUL
; OUTPUT FIRST.

;IF JUST A CR IS GIVEN TO A QUESTION WHICH HAS A LIST, THE FIRST
; ITEM IS ASSUMED.  THIS IS TRUE FOR DECIMAL AND OCTAL QUESTIONS TOO.

;ALL NUMERIC QUESTIONS MUST HAVE A RANGE SUPPLIED.
; IF ONE IS NOT, THE USER GETS:
; ? INTERNAL MONGEN ERROR - NO (...,MIN-MAX) IN ABOVE QUESTION -
; EDIT MONGEN AND INCLUDE IN QUESTION.

;ALL ERRORS WHICH ARE MONGEN'S RATHER THAN THE CUSTOMER'S, ARE PRECEDED
; WITH ? INTERNAL MONGEN ERROR - FOLLOWED BY THE PROBLEM AND WHAT
; THE PROGRAMMER SHOULD DO TO FIX MONGEN.  NOTE THAT
; THE CUSTOMER SHOULD NEVER SEE THESE, SINCE THEY ARE DEBUGGING AIDS.

;ALL ERROR MESSAGES START WITH "? ". THE SPACE FOLLOWING ? MAKES THEM
; DISTINGUISHABLE FROM MONITOR ERRORS WHICH HAVE NO SPACE.

;ALL STRINGS ARE ASCIZ INCLUDING AS INPUT FROM TTY.
; ALL EOL CHARS(CR,LF,FF,VT,ESC,ALT1,ALT2,^Z,^C) ARE STRIPPED OUT
; AND ARE REPLACED BY A NULL.  THIS MAKES IT EASY TO SCAN STRINGS
; SINCE END IS ALWAYS DETECTED BY JUMPE CH,
; OUTPUT TO FILE MUST PUT CRLF BACK IN EXPLICITLY BY USING
; @ OR FCRLF ROUTINE.  THIS MAKES OUTPUT FILE MORE INDEPENDENT FROM
; USER INPUT.

;TO HELP THE READER OF MONGEN:
; ALL JUMPS ARE DOWN THE PAGE, EXCEPT LOOPS
; MOST PUSHJ ARE TO ROUTINES DOWN THE PAGE

;DEFINE THE MACROS:
; THE FOLLOWING MACROS SUFFIX ": " TO ASK QUESTION
; AND GET ANSWER ON SAME LINE
DEFINE	CAL	(XXX,A,B,%C)<
	XLIST			;;ALWAYS TURN OFF LISTING
IFNB <B>,<IFDIF <B> <N>,<MOVE	N,B>>	;;PICK UP VALUE TO BE SUBSTITUTED FOR *
	JSP	T1,%C		;;SETUP T1 WITH MESSAGE ADR AND JUMP AROUND
				;; MESSAGE WHICH MAY BE TOO BIG TO FIT
				;; IN REMOTE LITERAL.
	ASCIZ	\A: \		;;THE QUESTION WITH ": "
	INTERN	XXX		;;DECLARE INTERN SO MACRO WILL NOT THINK XXX A MACRO
%C:!	PUSHJ	P,XXX		;;CALL THE SUBROUTINE XXX
IFE RJRSTF,<LIST>		;;TURN LISTING BACK ON UNLESS INSIDE RJRST MACRO
>

DEFINE	ASKYN	(A,B)<
	CAL	ASKYN,<A>,B>

DEFINE	ASKDEC	(A,B)<
	CAL	ASKDEC,<A>,B>

DEFINE	ASKOCT	(A,B)<
	CAL	ASKOCT,<A>,B>

DEFINE	ASKLIN	(A,B)<
	CAL	ASKLIN,<A>,B>

DEFINE	ASKSTR	(A,B)<
	CAL	ASKSTR,<A>,B>

DEFINE	ASKLST	(A,B)<
	CAL	ASKLST,<A>,B>

DEFINE	ASKAUT	(A,C,D,E,F),<CALAUT (ASKAUT,A,C,D,<E>,<F>)>


;THE FOLLOWING MACROS DO NOT HAVE ANY CHARACTERS ADDED TO QUESTION

DEFINE	CALAUT	(XXX,A,C,D,E,F),<
	INTERN	XXX		;;AVOID MACRO CONFUSION
	PUSHJ	P,XXX		;;CALL PROCESSOR
	JRST	L.'A		;;ALLOW SKIPS OVER MACRO TO WORK
	EXP	M.'A		;;M.XXXX ADDRESS
	EXP	<SIXBIT	/A/>	;;SIXBIT /M.XXXX/
	EXP	<SIXBIT	/C/>	;;SIXBIT DRIVER NAME
	EXP	D		;;FLAGS
	EXP	[ASCIZ \E\]	;;INTRODUCTORY TEXT
	ASCIZ	\F\		;;LONG TEXT
L.'A:
>

DEFINE	CAL2	(XXX,A,B,%C)<
	XLIST			;;ALWAYS TURN OFF LISTING
IFNB <B>,<IFDIF <B> <N>,<MOVE	N,B>>	;;PICKUP VALUE TO BE SUBSTITUTED FOR *
	JSP	T1,%C		;;SETUP T1 WITH MESSAGE ADR AND JUMP AROUND
				;; MESSAGE WHICH MAY BE TOO LONG FOR MACRO
				;; REMOTE LITERAL TABLE(14 WORDS)
	ASCIZ	\A\		;;THE QUESTION WITH NO ADDED CHARACTERS
	INTERN	XXX		;;DECLARE INTERN SO MACRO WILL NOT THINK XXX A MACRO
%C:!	PUSHJ	P,XXX		;;CALL THE SUBROUTINE TO JUST OUTPUT
IFE RJRSTF,<LIST>		;;TURN LISTING BACK ON UNLESS INSIDE RJRST MACRO
>
;OUTPUT IMMEDIATE VALUE

DEFINE	CAL3	(XXX,A,B,%C)<
	XLIST			;;ALWAYS TURN OFF LISTING
IFNB <B>,<IFDIF <B> <N>,<MOVEI	N,B>>	;;PICKUP VALUE TO BE SUBSTITUTED FOR *
	JSP	T1,%C		;;SETUP T1 WITH MESSAGE ADR AND JUMP AROUND
				;; MESSAGE WHICH MAY BE TOO LONG FOR MACRO
				;; REMOTE LITERAL TABLE(14 WORDS)
	ASCIZ	\A\		;;THE QUESTION WITH NO ADDED CHARACTERS
	INTERN	XXX		;;DECLARE INTERN SO MACRO WILL NOT THINK XXX A MACRO
%C:!	PUSHJ	P,XXX		;;CALL THE SUBROUTINE TO JUST OUTPUT
IFE RJRSTF,<LIST>		;;TURN LISTING BACK ON UNLESS INSIDE RJRST MACRO
>
DEFINE	ASKMN	(A,B)<
	CAL2	ASKMN,<A>,B>

DEFINE	ASKMNP	(A,B)<
	CAL2	ASKMNP,<A>,B>

DEFINE	ASKTMN	(A,B)<
	CAL2	ASKTMN,<A>,B>

DEFINE	BTHOUT	(A,B)<
	CAL2	BTHOUT,<A>,B>

DEFINE	BTHOCT	(A,B)<
	CAL2	BTHOCT,<A>,B>

DEFINE	FILOUT	(A,B)<
	CAL2	FILOUT,<A>,B>

DEFINE	FILCPU	(A,B)<
	CAL2	FILCPU,<A>,B>

DEFINE	FILCOM	(A,B)<
	CAL2	FILCOM,<A>,B>

DEFINE	FILOUD	(A,B)<
	CAL3	FILOUT,<A>,B>

DEFINE	TTYOUT	(A,B)<
	CAL2	TTYOUT,<A>,B
>
DEFINE	TTYOCT	(A,B)<
	CAL2	TTYOCT,<A>,B>

DEFINE	FILSTR	(A,B)<
	CAL2	FILSTR,<A>,B>

DEFINE	FILDEC	(A,B)<
	CAL2	FILDEC,<A>,B>

DEFINE	FILDC2	(A,B)<
	CAL2	FILDC2,<A>,B>

DEFINE	EREXIT	(A,B)<
	CAL2	EREXIT,<A>,B>
;DEFINE REMOTE MACROS WHICH ARE JUMPED TO ON UNUSUAL CASES
; INCLUDE CODE IN-LINE SO READABLE, BUT INDENT 2 TABS, JUST AS
; IF MULTI-LINE LITERAL.
;USED INSTEAD OF MULTI-LINE LITERAL BECAUSE MACRO LISTS
; SOURCE INSIDE OF MACROS INSIDE OF LITERALS

DEFINE	RJRST	(A,%B)<
	XLIST		;;TURN OFF LISTING SOURCE IN EXPANSION
RJRSTF==1		;;FLAG INSIDE OF RJRST, SO CAL MACRO
			;; WILL NOT TURN LIST BACK ON
	SKIPA		;;ALLOW MACRO IN ERROR RETURN OR AFTER TEST INSTR.
	JRST	%B	;;BY PASS UNUSUAL CODE
	A		;;THE UNUSAL CODE
RJRSTF==0		;;FLAG NO LONGER INSIDE RJRST MACRO
			;; SO FUTURE CAL MACROS WILL TURN LIST ON
%B:!	LIST		;;TURN LISTING BACK ON
>

DEFINE	RJUMPE	(AC,A,%B)<
	XLIST
RJRSTF==1		;;FLAG INSIDE OF RJRST, SO CAL MACRO
			;; WILL NOT TURN LIST BACK ON
	SKIPE	AC	;;CONDITION OF UNUSUAL CODE?
	JRST	%B	;;NO, BY PASS UNUSUAL CODE
	A		;;THE UNUSUAL CODE
RJRSTF==0		;;FLAG NO LONGER INSIDE RJRST MACRO
			;; SO FUTURE CAL MACROS WILL TURN LIST ON
%B:!	LIST		;;TURN LISTING BACK ON
>

DEFINE	RJUMPL	(AC,A,%B)<
	XLIST
RJRSTF==1		;;FLAG INSIDE OF RJRST, SO CAL MACRO
			;; WILL NOT TURN LIST BACK ON
	SKIPL	AC	;;CONDITION OF UNUSUAL CODE?
	JRST	%B	;;NO, BY PASS UNUSUAL CODE
	A		;;THE UNUSUAL CODE
RJRSTF==0		;;FLAG NO LONGER INSIDE RJRST MACRO
			;; SO FUTURE CAL MACROS WILL TURN LIST ON
%B:!	LIST
>

DEFINE	RJUMPN	(AC,A,%B)<
	XLIST
RJRSTF==1		;;FLAG INSIDE OF RJRST, SO CAL MACRO
			;; WILL NOT TURN LIST BACK ON
	SKIPN	AC	;;CONDITION OF UNUSUAL CODE?
	JRST	%B	;;NO, BY PASS UNUSUAL CODE
	A		;;THE UNUSUAL CODE
RJRSTF==0		;;FLAG NO LONGER INSIDE RJRST MACRO
			;; SO FUTURE CAL MACROS WILL TURN LIST ON
%B:!	LIST
>
DEFINE	RJUMPGE	(AC,A,%B)<
	XLIST
RJRSTF==1		;;FLAG INSIDE OF RJRST, SO CAL MACRO
			;; WILL NOT TURN LIST BACK ON
	SKIPGE	AC	;;CONDITION OF UNUSUAL CODE?
	JRST	%B	;;NO, BY PASS UNUSUAL CODE
	A		;;THE UNUSUAL CODE
RJRSTF==0		;;FLAG NO LONGER INSIDE RJRST MACRO
			;; SO FUTURE CAL MACROS WILL TURN LIST ON
%B:!	LIST
>

RJRSTF==0		;START FLAG AT 0 MEANING NOT INSIDE RJRST
;PARAMETERS:
;ACS
F=0		;FLAGS
  ;LH(DEFINED AS 36 BIT QUANTITIES):
  F.MTCH==1B0	;MATCH FOUND IN FNDASK ROUTINE
  F.OFO==1B1	;OUTPUT FILE OPEN.  FILE CALLS IGNORED IF 0
		; NEEDED SO ASK ROUTINES CAN BE USED TO ASK ABOUT FILE NAME
  F.TF==1B2	;TTY/FIL FLAG, 1 ON FIRST CHAR TO FILE
		; USED FOR DEBUG FEATURE TO PRINT <> ON TTY
		; SET BY TTYPUT ROUTINE, CLEARED BY FILPUT ROUTINE
  F.CTY==1B3	;CTY IS AN ACCEPTABLE OCTAL NUUMBER IF 1
		; SET BY ASKLIN, CLEARED BY ASKDEC,ASKOCT,ASKNUM ROUTINES
  F.FLF==1B4	;LAST CHAR ON FILE WAS LINE FEED
		; USED TO PRECEDE NEXT CHAR WITH ; TO MAKE A COMMENT IN FILE
		; IF F.COM IS ALSO ON.  SET, CLEARED AND LOOKED AT BY FILPUT ONLY
  F.COM==1B5	;MAKE ALL LINES TO FILE BE COMMENT IF THIS FLAG IS ON
		; USES F.FLF TO KNOW WHEN TO PUT ; OUT
		; SET AND CLEARED BY FILCOM AND TTYIN ROUTINES ONLY
		; LOKED AB BY FILPUT ROUTINE
  F.LPAR==1B6	;LEFT PAREN SEEN BY TTYOUT IN TTY OUTPUT STREAM.
		; USED TO SUPPRESS PROMPTING IF IN SHORT HELP MODE
		; CLEARED WHEN RIGHT PAREN SEEN.  SET, CLEARED,
		; AND USED BY TTYOUT ROUTINE ONLY.
  F.LBRK==1B7	;LEFT BRACKET SEEN BY TTYOUT IN TTY OUTPUT STREAM
		; YSED TO SUPPRESS EXPLANATION UNLESS IN LONG MODE
		; SET, CLEARED AND TESTED BY TTYOUT ROUTINE ONLY
  F.CONZ==1B8	;CONTROL Z TYPED IN ON TTY, SET BY TTYGET
;FREE B9
;FREE B10
;FREE B11
  F.2DEC==1B12	;SET IF WANT AT LEAST TWO CHARS IN DECIMAL OUTPUT
  F.NEG==1B13	;ALLOW NEGATIVE VALUE IN GETOCT/GETDEC/GETNUM
  F.PER==1B14	;SET IF A PERIOD, DOLLAR SIGN  OR PERCENT CAN BE PART OF SYMBOL
		; USED TO DISTINGUISH BETWEEN FILE NAMES AND SYMBOLS
  F.INFO==1B15	;SET BY ASKMNP TO INDICATE MORE INFO WILL FOLLOW M-N OR CTY
		; RESET BY ASKMN TO INDICATE END OF STRING EXPECTED AFTER M,M-N, OR CTY
  F.BANG==1B16	;ALLOW THE INPUT LINE TO CONTAIN A "!" WITHOUT TAKING
		;  IT AS A COMMENT
  F.SUPP==1B17	;SUPPRESS FILE OUTPUT (ONE SHOT)
;RH(F) BITS
	F.DVCP==1B21	;AUTOCONFIGURE - RESERVE DEVICE SLOT PER CPU
	F.MBUS==1B22	;AUTOCONFIGURE - MASSBUS DEVICE
	F.KS10==1B23	;AUTOCONFIGURE - KS10
	F.KL10==1B24	;AUTOCONFIGURE - KL10
	F.NEVR==1B25	;AUTOCONFIGURE - NEVER LOAD DRIVER
	F.LOAD==1B26	;AUTOCONFIGURE - ALWAYS LOAD DRIVER

N=1		;NUMERIC VALUE OF ASKED QUESTION.
		; ALSO USED TO SUBSTITUTE FOR * IN ALL STRINGS.
		; CAN BE LEFT JUSTIFIED SIXBIT.
		; YES ANSWERS ARE 1, NO ANSWERS ARE 0.
T1=2		;TEMPORARY AC. USUALLY ADR OF ASCIZ MESSAGE ON SUB CALL.
T2=T1+1		;FOR REMAINDER IN DIVISION
WD=4		;WORD AC ON CALLS TO GETWRD(LEFT JUSTIFIED SIXBIT)
B=5		;BYTE POINTER TO TEXT STRING
R=6		;INPUT AND OUTPUT RADIX
LV=7		;MODE OF ASKING QUESTIONS(-1=SHORT,0=PROMPT,1=LONG)
I=10		;INDEX FOR LOOP COUNTS
CH=11		;CHARACTER AC
I2=12		;SECOND INDEX FOR LOOP COUNTS
I3=13		;3RD INDEX FOR LOOP COUNTS
;RH12=14	;=0 FOR RH10, =1 FOR RH20	;FREE AC
P1=15		;"PERMANENT" ACS. THE SAVE ROUTINES DON'T EXIST,
P2=16		; USE AT GEN LEVEL FOR LOOP VARIABLES, ETC.
P=17		;PD POINTER

;SPECIAL ASCII CHARACTERS(NEVER CODE IN OCTAL SO CAN USE CREF):
C.RUB==177	;RUBOUT
C.ALT1==175	;OLD ALT MODES
C.ALT2==176	;OLD ALT MODE ON SOME TTYS
C.ESC==33	;MAP ALTS INTO ESCAPE
C.CONZ==32	;CONTROL Z
C.FF==14	;FORM FEED
C.CR==15	;CARIAGE RETURN
C.LF==12	;LINE FEED
C.CONC==3	;CONTROL C
;STANDARD MAXIMUMS FOR QUESTIONS

SM.CPU==6	;MAXIMUM NUMBER OF CPUS
SM.JOB==777	;MAXIMUM NUMBER OF JOBS SYSTEM MAY INCLUDE
SM.PI==7	;MAXIMUM PI CHANNEL NUMBER
SM.AC==17	;HIGHEST AC NUMBER FOR HIGHEST-AC-TO-SAVE
SM.RTD==^D77	;MAXIMUM NUMBER OF REAL TIME DEVICES
SM.HPQ==^D15	;MAXIMUM NUMBER OF HIGH PRIORITY QUEUES
SM.DTA==2	;MAXIMUM NUMBER OF DTA CONTROLLERS
SM.CONN==^D512	;MAXIMUM NUMBER OF CONNECTS
SM.RTY==^D511	;MAXIMUM NUMBER OF REMOTE TTYS
SM.KDUP==^D2	;MAXIMUM NUMBER OF DUP-11S ON A KMC-11
SM.DMRN==^D8	;Maximum number of DMR11s on a 2020
SM.RXK==^D2	;Maximum number of RX211 controllers on a 2020
SM.RXD==^D2	;Maximum number of RX02 drives on an RX02
SM.TTG==^D8	;MAXIMUM NUMBER OF TTY 8-LINE GROUPS
SM.68L==^D100	;MAXIMUM NUMBER OF LINES ON DC68
SM.MPI==^D16384	;MAXIMUM NUMBER OF PAGES SUPPORTED ON KL10
SM.XTC==4	;MAXIMUM NUMBER OF DA28C CHANNELS
SM.D78==^D8	;MAXIMUM NUMBER OF DAS78S (IBM 360,370,2780 SUPPORT)
SM.D60==^D7	;MAXIMUM NUMBER OF DN60S (IBM BSC INTERFACES)
SM.LMC==^D100	;MAXIMUM NUMBER OF SIMULTANEOUS LAT CIRCUITS
;DEFAULT VALUES OUTPUT BY MONGEN, MOSTLY FOR OLD SYMBOLS

IFNDEF MD.SEG,<MD.SEG==0>	;ALWAYS NO EXTRA SEGMENTS
;IO CHANNELS:
TTYCHN==0	;TTY INPUT AND OUTPUT CHANNEL
FILCHN==1	;FILE OUTPUT CHANNEL
MICCHN==2	;CHANNEL TO WRITE .MIC FILE ON

;IO STATUS BITS:
IO.EOF==20000	;END OF FILE

;NUMBER OF I/O BUFFERS
NFILBF==2	;NUMBER OF BUFFERS FOR FILE OUTPUT
NMICBF==2	;NUMBER OF BUFFERS FOR MIC FILE

;OPDEFS:
OPDEF	PJRST	[JRST]		;EQUIVALENT TO PUSHJ POPJ PAIR
OPDEF	PJUMPE	[JUMPE]		;EQUIVALENT TO JUMPE [PJRST]
OPDEF	GETTAB	[CALLI 41]	;READ MONITOR TABLE
OPDEF	SAVE.	[CALLI 210]	;SAVE. UUO

;UUOSYM SYMBOLS

.GTPRG==3			;PROGRAM NAME
.GTRDV==135			;DEVICE PROGRAM IS RUN FROM
.GTRDI==136			;DIRECTORY PROGRAM IS RUN FROM
.GTRFN==137			;FILE PROGRAM IS RUN FROM
.GTRS0==145			;SFD PROGRAM IS RUN FROM
.PTPPN==2			;PPN OF THE PATH
.PTSFD==3			;BEGIN SFDS IN PATH BLOCK
.PTMAX==11			;LENGTH OF PATH BLOCK
SUBTTL	INITIALIZATION, AND DISPATCH TO PROPER GEN, CLOSE FILES

BEGINA:	JFCL			;NOT CCL
	;THERE ONCE WAS MISGUIDED CODE TO TRY AND DO THIS BUT ONCE.
	;SAID CODE FORGOT THAT RESET CHANGED .JBFF TO LH(.JBSA).
	;SAID CODE ISN'T NEEDED, AS WE USE GETTAB, NOT SAVGET ACS NOW.
	HRROI	T1,.GTRDV	;GET DEVICE WE RAN FROM
	GETTAB	T1,
	  SETZ	T1,		;ERROR, ZERO THE AC
	MOVEM	T1,RUNDEV	;STORE
	HRROI	T1,.GTRDI	;GET THE PPN WE RAN FROM
	GETTAB	T1,
	  SETZ	T1,		;ERROR. ZERO THE AC
	MOVEM	T1,RUNPPN	;STORE
	MOVEM	T1,RUNPTH+.PTPPN;STORE PPN IN PATH BLOCK TOO
	MOVSI	T2,-5		;SET UP AOBJN FOR SFD GETTABS

BEGINB:	HRROI	T1,.GTRS0(T2)	;GET AN SFD NAME
	GETTAB	T1,
	  JRST	BEGINC		;NO MORE SFDS
	JUMPE	T1,BEGINC	;END OF SFDS
	MOVEM	T1,RUNPTH+.PTSFD(T2)	;STORE THE SFD NAME IN THE PATH BLOCK
	AOBJN	T2,BEGINB	;GET NEXT SFD

BEGINC:	SETZM	RUNPTH+.PTSFD(T2);ZERO NEEDS TO TERMINATE THE PATH BLOCK
	MOVEI	T1,RUNPTH	;GET ADDRESS OF PATH BLOCK
	SKIPE	RUNPTH+.PTSFD	;ANY SFDS?
	MOVEM	T1,RUNPPN	;YES. POINT TO PATH BLOCK FOR LOOKUP

BEGIN0:	RESET			;RESET IO DEVICES
	SETOM	INIFLG		;IN INITIALIZATION
	MOVE	P,[IOWD MP.PDL,PDLIST]	;INITIALIZE PD PTR
	SETZM	MICFLG		;NO MIC YET
	MOVE	LV,SAVLV	;PROMPT VALUE
	SETZ	F,		;INIT FLAGS
	ASKYN	<Write MONGEN.MIC (YES,NO) [
YES causes MONGEN to write a .MIC/.CTL file which may be used to automate 
future runs of MONGEN.]>
	SETOM	MICFLG		;ASSUME OK
	SKIPN	N		;SKIP IF NO (WHO WOULD SAY NO?)
	 SETZM	MICFLG		;SPIDER WAS RIGHT, SOMEONE DID.  SIGH.
	JUMPE	N,BEGIN		;DON'T WANT TO WRITE FILE, SKIP THE ENTER
	INIT	MICCHN,1	;MIC FILE
	 SIXBIT	/DSK/
	 XWD	MOBUF,0
	  SETZM	MICFLG		;ERROR
	MOVEI	T1,3+1B18	;NON-SUPER ENTER
	SETZ	T2,		;PPN
	DMOVE	T2+1,[SIXBIT /MONGENMIC/]
	ENTER	MICCHN,T1	;OPEN FILE
	 HRRZM	T1+3,MICFLG	;ERROR
	SKIPL	MICFLG		;STILL OK?
	JRST	BEGIN		;NOPE
	PUSH	P,.JBFF##	;SAVE JOBFF
	MOVEI	T1,MICBUF	;ADDR OF MIC BUFFERS
	MOVEM	T1,.JBFF	;SET UP JOBFF TO ALLOCATE OUR BUFFERS
	OUTBUF	MICCHN,NMICBF	;ALLOCATE BUFFERS
	POP	P,.JBFF##	;RESTORE JOBFF
	MOVEI	T1,[ASCIZ	/.RUN /]
	PUSHJ	P,MICSTR
	SKIPN	T1,RUNDEV	;DEVICE
	 MOVSI	T1,(SIXBIT/DSK/)
	PUSHJ	P,MICSIX	;SORTA-LIKE DEEP-SIX
	MOVEI	CH,":"
	PUSHJ	P,MICPUT
	HRROI	T1,.GTPRG	;FILE
	GETTAB	T1,
	 SETZ	T1,
	SKIPN	T1
	 MOVE	T1,[SIXBIT /MONGEN/]
	PUSHJ	P,MICSIX
	SKIPN	T1,RUNPTH+.PTPPN
	 JRST	BG0.ND		;DONE
	MOVEI	R,10		;OCTAL OUTPUT
	HLRZ	T1,T1		;PROJ
	MOVEI	CH,"["
	PUSHJ	P,MICPUT
	PUSHJ	P,MICNUM
	MOVEI	CH,","
	PUSHJ	P,MICPUT
	HRRZ	T1,RUNPTH+.PTPPN;PROG
	PUSHJ	P,MICNUM
	MOVSI	N,-5
BG0.SF:	SKIPN	T1,RUNPTH+.PTSFD(N);ANY SFDS?
	 JRST	BG0.ED		;NO, END DIRECTORY
	MOVEI	CH,","
	PUSHJ	P,MICPUT
	PUSHJ	P,MICSIX	;PRINT SFD NAME
	AOBJN	N,BG0.SF	;LOOP FOR ALL

BG0.ED:	MOVEI	CH,"]"
	PUSHJ	P,MICPUT

	;NO DIRECTORY
BG0.ND:	MOVEI	T1,[ASCIZ /
;Write MONGEN.MIC (YES,NO)
*Y
/]
	PUSHJ	P,MICSTR
BEGIN:	MOVE	P,[IOWD MP.PDL,PDLIST]	;RESET PD PTR, SINCE HERE ON IO ERRORS
				; FROM ROUTINE DEEP IN STACK
	SETZB	F,VARBEG	;CLEAR ALL FLAGS AND VARIABLE AREA
				; EXCEPT SAVLV WHERE VERBOSITY
				; LEVEL IS SAVED AND DEBUG AND HELPF
	MOVE	LV,SAVLV	;SETUP HELP LEVEL FOR NEXT QUESTION
				; FROM LONG TERM VALUE(INITIALLY PROMPT)
				; ^C START REMEMBERS LAST PERMANENT LEVEL
				; SINCE SAVLV IS NOT CLEARED
	MOVE	T1,[XWD VARBEG,VARBEG+1]
	BLT	T1,VAREND	;CLEAR VARIABLE AREA
	INIT	TTYCHN,1	;TTY IN LINE MODE
	SIXBIT	/TTY/
	XWD	TOBUF,TIBUF	;OUTPUT,INPUT BUFFER HEADERS
	  RJRST	<EREXIT	<Cannot INIT TTY>,,>	;TYPE ? INTERNAL ERR AND EXIT
	SKIPLE	MICFLG		;MIC FILE OK?
	 PUSHJ	P,[SKIPN INIFLG	;HAVE WE HAD A CHANCE TO COMPLAIN BEFORE?
		    POPJ P,	;YES, LET US NOT REPEAT OURSELF
		   SETZM INIFLG	;TTY IS OK BY NOW
		   TTYOUT <@% DSK:MONGEN.MIC will not be written@>
		   SKIPG N,MICFLG;SKIP IF ERROR CODE AVAIL
		    POPJ P,	;NOPE
		   SETZM MICFLG	;WE SAW IT, FLAG MEANS SOMETHING DIFFERENT NOW
		   CAIN	N,4	;IS THIS ERAEF%?
		    JRST [TTYOUT <% File DSK:MONGEN.MIC already exists@>
			 POPJ	P,]
		   TTYOCT <% ENTER error * >
		   POPJ	P,]
	SETZM	INIFLG		;TTY IS OK NOW
	AOSG	HELPF		;ALREADY TOLD USER ABOUT HELP?
	PUSHJ	P,TTYHLP	;NO, ASK USER FOR LEVEL OF VERBOSITY WITH /HELP
	TLZ	F,(F.CONZ)	;CLEAR CONTROL Z TYPED FLAG

ASKGEN:	ASKLST	<Which GEN (SYS,F) [
Type SYS to define hardware and software configuration, or type F to define 
software features.  To EXIT, type CTRL/Z.]>
	TLNE	F,(F.CONZ)	;DID USER TYPE CONTROL Z?
	  RJRST	<SKIPN	MICFLG	;MIC FILE OPEN?
		  EXIT		;NO
		 CLOSE	MICCHN,	;SAVE MIC FILE
		 TTYOUT	<@DSK:MONGEN.MIC written@>
		 EXIT>		;YES, EXIT TO MONITOR
	MOVEM	N,WCHGEN	;STORE WHICH GEN(0=SYS, 1=F)

;LOOP TO ASK FOR FILE UNTIL SUCCESSFUL ENTER CAN BE DONE.  SO INIT VARIABLES.
ASKFIL:	MOVSI	T1,(SIXBIT /DSK/) ;ASSUME DSK
	MOVEM	T1,OUTDEV	;IF USER DOES NOT SPECIFY DEVICE
	MOVE	N,WCHGEN	;THE GEN NUMBER(0-1)
	MOVE	N,FILTAB(N)	;DEFAULT FILE NAME FOR THIS GEN
				; SYSCNF,F
	HLLZM	N,WCHNAM	;STORE NAME OF THIS GEN(SYS,F)
	MOVEM	N,OUTNAM	;ALSO SETUP DEFAULT FILE NAME FOR THIS GEN
	MOVSI	T1,(SIXBIT /MAC/) ;ASSUME EXTENSION OF MAC
	MOVEM	T1,OUTEXT	;FOR FILE EXTENSION
	SETZM	OUTDAT		;CLEAR DATE ARG
	SETZM	OUTPPN		;AND PROJECT,PROGRAMMER ARG
	ASKSTR	<Output(DSK:*.MAC)>,OUTNAM ;ASK FOR FILE SPEC
	MOVEI	WD,0		;SET WORD VALUE TO 0 AS FLAG THAT NO SPEC
	JUMPE	CH,OPNDEV	;IF CHARACTER IS 0, JUST CR TYPED
	PUSHJ	P,GETWRD	;GO GET WHAT MAY BE DEV: OR FILENAME
	CAIE	CH,":"		;IS BREAK DEVICE SEPARATOR?
	JRST	OPNDEV		;NO, SAVE FILE NAME AND GO INIT DEVICE
	MOVEM	WD,OUTDEV	;YES, STORE USER SUPPLIED DEVICE NAME
	PUSHJ	P,GETWRD	;GET NEXT WORD USER TYPED(FILE NAME)
OPNDEV:	INIT	FILCHN,1	;INIT FILE CHANNEL IN ASCII LINE MODE
OUTDEV:	SIXBIT	/DSK/		;DEVICE NAME
	XWD	FOBUF,0		;OUTPUT BUFER HEADER
	  RJRST	<TTYOUT <? Device * not available@>,OUTDEV ;TYPE ERROR
		 JRST	ASKFIL>	;GO ASK FOR FILE SPEC AGAIN
	PUSH	P,.JBFF##	;SAVE JOBFF
	MOVEI	T1,FILBUF	;ADDR OF FILE BUFFERS
	MOVEM	T1,.JBFF	;SET UP JOBFF TO ALLOCATE OUR BUFFERS
	OUTBUF	FILCHN,NFILBF	;ALLOCATE BUFFERS
	POP	P,.JBFF		;RESTORE JOBFF
	JUMPE	WD,OUTDV0	;WAS NO FILE NAME TYPED?
	MOVEM	WD,OUTNAM	;STORE CUSTOMER SUPPLIED FILE NAME

OUTDV0:	CAIE	CH,"."		;NO, WELL BETTER BE EXTENSION NEXT
	JRST	OUTDV3		;NO, GO CHECK FOR BRACKET FOR PPN
	PUSHJ	P,GETWRD	;GO GET EXTENSION
	HLLM	WD,OUTEXT	;AND STORE FOR ENTER
OUTDV3:	JUMPE	CH,OUTDV4	;END OF LINE(CR=0)?
	CAIE	CH,"["		;NO, BETTER BE LEFT BRACKET FOR PPN
OUTDV1:	JRST	FMTERR		;NO, INCREASE VERBOSITY LEVEL AND ASK AGAIN
	PUSHJ	P,GETOCT	;GET PROJ NUMBER
	CAIE	CH,","		;IS BREAK COMMA?
	JRST	FMTERR		;NO, INCREASE VERBOSITY AND ASK AGAIN
	HRLZM	N,OUTPPN	;YES, STORE PROJECT NO.
	PUSHJ	P,GETOCT	;GET PROG NUMBER
	JUMPE	CH,OUTDV2	;JUMP IF END OF LINE, END OF PPN
	CAIE	CH,"]"		;IS BREAK RIGHT BRACKET?
FMTERR:	RJRST	<TTYOUT	<? Not DEV:FILE.EXT[P,PN]@>
		AOJA	LV,ASKFIL>	;INCREASE LEV AND ASK AGAIN
OUTDV2:	HRRM	N,OUTPPN	;STORE PROG NUMBER
	JUMPE	CH,OUTDV4	;JUMP IF END OF LINE
	PUSHJ	P,GETWRD	;GET NEXT WORD
	JUMPN	WD,FMTERR	;BETTER NOT BE ANYTHING AFTER RIGHT BRACKET
	JUMPN	CH,FMTERR	;IS BREAK CR?
OUTDV4:	MOVE	N,OUTPPN	;GET PPN TYPED
	MOVEM	N,SAVPPN	;SAVE FOR LATER
	ENTER	FILCHN,OUTNAM	;TRY TO ENTER FILE ON DEVICE
	  RJRST	<HRRZ N,OUTEXT	;ENTER ERROR CODE FOR *
		 TTYOCT <? Enter error *@>,N
		 JRST ASKFIL>	;ASK FOR FILE NAME AGAIN
	MOVE	LV,SAVLV	;RESTORE PERMANENT HELP LEVEL
	TLO	F,(F.OFO!F.PER)	;FLAG THAT OUTPUT FILE IS NOW OPEN
				; SO FILPUT WONT BE A NO-OP
				; AND ALLOW PERIODS IN SYMBOLS
	MOVE	T1,WCHGEN	;ENTER OK, GET WHICH GEN THIS IS
	PUSHJ	P,@GENTAB(T1)	;DISPATCH TO PROPER GEN
	MOVE	LV,SAVLV	;RESTORE PERMANENT HELP LEVEL
				; IN CASE USER TYPED /H<CR>
	CLOSE	FILCHN,		;CLOSE OUTPUT FILE
	TLZ	F,(F.OFO)	;FLAG THAT OUTPUT FILE IS NOT OPEN
				; SO FILPUT WILL BE A NO-OP
	STATZ	FILCHN,740000	;ANY ERRORS ON LAST BUFFER

;HERE ON ANY FILE ERRORS DURING EXECUTION
FILERR:	  RJRST	<TTYOUT <? File * error>,OUTNAM
		 GETSTS	FILCHN,N ;GET FILE STATUS FROM MONITOR
		 TLZ	N,-1	;MAKE SURE NO STUFF IN LH
		 TTYOCT	<*@>;OUTPUT STATUS NUMBER AND CR
		 JRST .+1>	;CONTINUE
	RELEASE	FILCHN,		;RELEASE FILE CHANNEL
	TTYOUT	<File >
	SKIPN	N,OUTDEV	;SKIP IF DEVICE SPECIFIED
	JRST	CLTY1		;NO, DONT TYPE DEVICE
	TTYOUT	<*:>,N
CLTY1:	TTYOUT	<*>,OUTNAM
	HLLZ	N,OUTEXT	;INCLUDE EXTENSION
	TTYOUT	<.*>,N
	SKIPN	N,SAVPPN	;SKIP IF PPN SPECIFIED
	JRST	CLTY2		;NO, DONT TYPE PPN
	PUSH	P,LV		;SAVE CURRENT HELP LEVEL
	MOVEI	LV,1		;ASSUME LONG SO PPN WILL PRINT
	HLRZS	N		;N=PROJECT
	TTYOCT	<[*,>,N
	HRRZ	N,SAVPPN	;N=PROGRAMMER
	TTYOCT	<*]>,N
	POP	P,LV		;RESTORE CURRENT HELP LEVEL
CLTY2:	TTYOUT	< Closed [
The *GEN portion of the dialogue is finished.
Type CTRL/Z to exit from MONGEN, or select another dialogue option.]@@>,WCHNAM ;ALSO WHICH GEN
	JRST	BEGIN		;GO BACK AND ASK FOR NEXT GEN
				; KEEP SAME HELP LEVEL AND DO NOT ASK /HELP
SUBTTL	FGEN -- PREFACE

;THIS IS A COMPLETE REWRITE OF THE OLD FGEN DIALOGUE.  THE AUXILLIARY
;FILE (FGEN.HLP) NO LONGER EXISTS.  IT WAS REMOVED BECAUSE OF NUMEROUS
;PROBLEMS ENCOUNTERED OVER THE YEARS, WHERE THE WRONG VERSION OF FGEN.HLP
;WAS USED.  THE ESSENCE OF FGEN.HLP IS NOW CONTAINED IN THE MACRO "FET".
;
;FOR REASONS I HAVE NEVER BE ABLE TO FATHOM, SOME CUSTOMER HAVE HAD AN
;UNCONTROLLABLE URGE TO EDIT FGEN.HLP RATHER THAN USE THE MONGEN FACILITIES
;TO MODIFY OR ADD NEW FEATURE TESTS.  I HAVE DECIDED TO BREAK THEM OF THIS
;NASTY HABIT AND FORCE THEM TO USE THE FGEN DIALOGUE TO ALTER FEATURE TEST
;DEFINITIONS.
;
;THE CASUAL OBSERVER WILL NOTICE THAT THE ENTRIES WITHIN THE "FET" MACRO ARE
;IN MIXED CASE, QUITE CONTRARY TO TOPS-10 CODING STANDARDS.  HAVE NO FEAR,
;I HAVEN'T LOST ALL OF MY MARBLES (YET).  THE MIXED CASE ONLY EXISTS FOR
;TTY OUTPUT.  THE RESULTING OUTPUT FILE IS UP CASED IN ACCORDANCE WITH THE
;TOPS-10 CODING STANDARDS.  I'M SURE SOME UNIX FANATICS WILL WANT TO DEBATE
;THIS ISSUE, BUT IT'S NOT OPEN FOR DISCUSSION.
;
;IT WILL BECOME READILY APPARENT THAT THE OUTPUT FILE IS QUITE READABLE,
;UNLIKE ANYTHING YOU THOUGHT MONGEN WAS CAPABLE OF PRODUCING.  THIS WAS
;ACCOMPLISHED PROVIDING OUTPUT ROUTINES TO BE USED ONLY WITH FGEN, THAT
;PRODUCE PRETTY OUTPUT INSTEAD OF WHAT YOU'RE USED TO.  USE OF THE NORMAL
;CRUFTY MACROS WAS AVOIDED WHEREVER POSSIBLE FOR THE SAKE OF READABILITY
;AND MAINTAINABILITY.
;
;					/DPM, 3:39AM, NOV 16,'87
;					MARLBOROUGH, MASSACHUSETTS
SUBTTL	FGEN -- FEATURE TEST DEFINITIONS


DEFINE  FET,<

MT      (<Hardware options>)
  FT	(EMRT  ,<F.KL10>,<EBOX/MBOX user runtime accounting>)
  FT	(KL10  ,<F.KL10>,<KL10 support>)
  FT	(KS10  ,<F.KS10>,<KS10 support>)
  FT	(MP    ,<F.KL10>,<Symmetric Multiprocessing support>)
  FT	(XMON  ,<F.KL10>,<Extended addressing support>)

MT      (<Communications and networks features>)
  FT	(CIDNET,<0>,<DECnet on the CI bus (requires FTSCA)>)
  FT	(DECNET,<F.KL10!F.KS10>,<DECnet software>)
  FT	(ENET  ,<F.KL10>,<Ethernet service>)
  FT	(MIC   ,<F.KL10!F.KS10>,<Macro command processor support)>)
  FT	(MLOG  ,<F.KL10!F.KS10>,<MIC log file support (requires FTMIC)>)
  FT	(NET   ,<F.KL10!F.KS10>,<ANF-10 network software>)

MT      (<I/O features>)
  FT	(CIDSK ,<F.KL10>,<Disks on CI bus (requires FTSCA)>)
  FT	(CITAP ,<0>,<Magtapes on CI bus (requires FTSCA)>)
  FT	(DUAL  ,<F.KL10>,<Dual-ported disks>)
  FT	(FDAEM ,<F.KL10!F.KS10>,<File daemon support>)
  FT	(MPXSER,<F.KL10!F.KS10>,<Multiplex devices on I/O channels>)
  FT	(SCA   ,<F.KL10>,<Systems Communication Architecture support>)

MT      (<Scheduler features>)
  FT	(NSCHED,<F.KL10!F.KS10>,<CPU resource allocation code>)
  FT	(PSCD  ,<F.KL10!F.KS10>,<Scheduler performance gathering>)
  FT	(RSP   ,<F.KL10!F.KS10>,<Measure TTY response and other metrics>)

MT      (<UUO features>)
  FT	(HPQ   ,<F.KL10!F.KS10>,<High Priority Queue>)
  FT	(LOCK  ,<F.KL10!F.KS10>,<Allow jobs to lock in core>)
  FT	(PEEKSP,<F.KL10!F.KS10>,<PEEK and SPY UUOs>)
  FT	(POKE  ,<F.KL10!F.KS10>,<POKE UUO>)
  FT	(RTTRP ,<F.KL10>,<Real-time trapping>)

MT      (<Miscellaneous features>)
  FT	(MDA   ,<F.KL10!F.KS10>,<Mountable Device Allocator>)
  FT	(PATT  ,<F.KL10!F.KS10>,<Allocate space to patch tables>)
  FT	(TLAB  ,<F.KL10!F.KS10>,<Tape labeling facility>)

MT      (<Customer defined features>)

> ;END DEFINE FET
SUBTTL	 FGEN -- BUILD THE FEATURE TEST TABLES


DEFINE  MT      (TXT),<EXP -1>
DEFINE  FT      (NAM,CFG,TXT,HLP),<EXP <SIXBIT \'NAM\>>
FTPNAM:  FET
	BLOCK	MP.FTA
FTLEN==.-FTPNAM

DEFINE  MT      (TXT),<EXP -1>
DEFINE  FT      (NAM,CFG,TXT,HLP),<EXP CFG>
FTPCFG:  FET
	BLOCK	MP.FTA

DEFINE  MT      (TXT),<EXP [ASCIZ \'TXT'\]>
DEFINE  FT      (NAM,CFG,TXT,HLP),<EXP	[ASCIZ \'TXT\]>
	ZZ==-1
FTPTXT:  FET
	REPEAT MP.FTA,<EXP FTCTXT+<MP.FTL/5>*<ZZ==ZZ+1>>
SUBTTL	FGEN -- DIALOG INITIALIZATION

FGEN:	SKIPE	FTINI		;ALREADY INITIALIZED?
	JRST	FGEN0		;YES
	MOVE	T1,[FTPNAM,,FTINAM] ;INIT FEATURE TEST NAMES
	BLT	T1,FTINAM+FTLEN-1
	MOVE	T1,[FTPCFG,,FTICFG] ;INIT FEATURE TEST CONFIG BITS
	BLT	T1,FTICFG+FTLEN-1
	SETOM	FTINI		;REMEMBER INITIALIZED

FGEN0:	TLO	F,(F.SUPP)	;SUPPRESS FILE OUTPUT
	ASKLST  <Feature set (KL10,KS10) [
KL10 includes all supported TOPS-10 features for KL10 systems.  KS10 
includes all supported TOPS-10 features for KS10 systems.]>
	HRR	F,[EXP F.KL10,F.KS10](N) ;LOAD UP PROCESSOR TYPE
	TLO	F,(F.SUPP)	;SUPPRESS FILE OUTPUT
	ASKLST	<Standard settings (YES,NO) [
Type YES to use the standard DEC-supported feature test settings.  Type NO 
to change or define the feature test settings to non-standard values.]>
	JUMPE	N,FGEN10	;GO WRITE THE FILE IF ANSWER WAS "YES"

FGEN1:	TLO	F,(F.SUPP)	;SUPPRESS FILE OUTPUT
	ASKSTR	<
@Feature [Respond with one of the following:
	
   1. RETURN               to terminate dialogue
   2. feature name         to list its current setting
   3. ALL                  to list ALL current settings
   4. name,value,comment   to change or define a feature
	
Where   "name"     is a feature test name without the "FT" prefix
        "value"    is either "OFF" or "ON"
        "comment"  is a one-line description]>
	JUMPE	CH,FGEN10	;ALL DONE?
	PUSHJ	P,GETWRD	;GET FEATURE NAME
	SKIPN	WD		;MAKE SURE WE GOT ONE
	AOJA	LV,FGEN1	;CONFUSED USER
	JUMPN	CH,FGEN4	;WANT TO CHANGE OR DEFINE?
;HERE TO LIST THE CURRENT SETTING
FGEN2:	SETOM	FTMOD		;SET OUTPUT MODE TO TERMINAL
	MOVE	T1,WD		;COPY FEATURE TEST NAME
	CAMN	T1,['ALL   ']	;SPECIAL CASE HACK
	JRST	FGEN3		;DO LIST OUT ALL THE FEATURE TESTS
	PUSHJ	P,FFND		;BETTER BE IN THE TABLE
	  JRST	[MOVE	N,WD	;COPY BOGUS NAME
		 TTYOUT	<% No such feature test "FT*"@>,N
		 JRST	FGEN1]	;TRY AGAIN
	PUSH	P,I		;SAVE FEATURE INDEX
	MOVEI	I,(I2)		;GET HEADER INDEX
	PUSHJ	P,FWRT		;WRITE IT OUT
	POP	P,I		;GET FEATURE INDEX
	PUSHJ	P,FWRT		;WRITE IT OUT
	JRST	FGEN1		;ALL DONE

FGEN3:	MOVSI	I,-FTLEN	;AOBJN POINTER TO FEATURE TABLES
	PUSHJ	P,FWRT		;WRITE IT OUT
	AOBJN	I,.-1		;LOOP THROUGH THE TABLE
	JRST	FGEN1		;ALL DONE

;HERE TO CHANGE OR DEFINE A FEATURE TEST
FGEN4:	CAIE	CH,","		;NEED AT LEAST ONE MORE ARGUMENT
	JRST	[TTYOUT <% Syntax error>
		 JRST	FGEN1]	;TRY AGAIN
	CAMN	WD,['ALL   ']	;STUPID ASS CHECK, BUT SOMEONE WILL TRY IT
	JRST	[TTYOUT <% Cannot modify all feature tests at one>
		 JRST	FGEN1]	;GIVE THE FOOL ANOTHER CHANCE
	MOVEM	WD,FTNAM	;SAVE NAME TO ADD OR CHANGE
	PUSHJ	P,GETWRD	;READ NEXT WORD
	MOVNI	T1,1		;ASSUME JUNK ANSWER
	CAMN	WD,['OFF   ']	;OFF?
	MOVEI	T1,0		;YES
	CAMN	WD,['ON    ']	;ON?
	MOVEI	T1,F.KL10!F.KS10 ;YES
	JUMPL	T1,[TTYOUT <% Value must be "OFF" or "ON">
		    JRST FGEN1]	;TRY AGAIN
	MOVEM	T1,FTCFG	;SAVE CONFIG BITS
	MOVE	T1,[FTTXT,,FTTXT+1] ;SET UP BLT
	SETZM	FTTXT		;CLEAR FIRST WORD
	BLT	T1,FTTXT+MP.FTL-1 ;CLEAR BUFFER
	CAIE	CH,","		;DESCRIPTIVE TEXT?
	JRST	FGEN6		;NO
	MOVE	T1,[POINT 7,FTTXT] ;BYTE POINTER TO TEMP STORAGE
	MOVEI	T2,MP.FTL	;BYTE COUNT

FGEN5:	ILDB	CH,B		;READ A CHARACTER
	IDPB	CH,T1		;STORE IT
	SKIPE	CH		;DONE?
	SOJG	T2,FGEN5	;LOOP

FGEN6:	MOVE	T1,FTNAM	;GET NAME TO ADD OR CHANGE
	PUSHJ	P,FFND		;SEE IF ALREADY KNOWN
	  SKIPA	I2,[-<FTLEN-MP.FTA-1>,,<FTLEN-MP.FTA-1>] ;UNKNOWN
	JRST	FGEN7		;ONWARD
	MOVE	I,I2		;COPY HEADER POINTER
	SKIPE	FTINAM(I)	;FREE SLOT?
	AOBJN	I,.-1		;KEEP SEARCHING
	JUMPL	I,FGEN7		;CONTINUE IF FOUND ONE
	TTYOUT <% No storage available for additional feature tests>
	JRST	FGEN1		;GIVE UP

FGEN7:	MOVE	T1,FTNAM	;GET FEATURE TEST NAME
	MOVEM	T1,FTINAM(I)	;CREATE NEW OR UPDATE OLD
	MOVE	T1,FTCFG	;GET FEATURE TEST CONFIG BITS
	MOVEM	T1,FTICFG(I)	;STORE THEM
	SKIPN	FTTXT		;HAVE TEXT?
	JRST	FGEN8		;NO--ALMOST DONE
	MOVE	T1,FTPTXT(I)	;WHERE TEXT WILL GO
	MOVSI	T2,FTTXT	;NEW DESCRIPTIVE TEXT
	HRRI	T2,(T1)		;MAKE A BLT POINTER
	BLT	T2,MP.FTL-1(T1)	;COPY TEXT

FGEN8:	MOVE	WD,FTNAM	;LOAD UP THE NAME
	JRST	FGEN2		;AND GO REPORT CHANGES
FGEN10:	SETZM	FTMOD		;SET OUTPUT MODE TO FILE
	MOVEI	T1,FHEAD	;POINT TO FILE HEADER
	PUSHJ	P,FTXT		;WRITE IT OUT
	PUSHJ	P,FVER		;WRITE OUT THE VERSION NUMBER
	MOVEI	T1,[BYTE(7)15,12,12,0] ;CRLFS
	PUSHJ	P,FTXT		;WRITE THEM OUT
	MOVEI	T1,FCOMB	;BEGIN COMMENT
	PUSHJ	P,FTXT		;WRITE TEXT
	MOVEI	T1,CPYTXT	;POINT TO COPYRIGHT
	PUSHJ	P,FTXT		;WRITE IT OUT
	MOVEI	T1,FCOME	;END COMMENT
	PUSHJ	P,FTXT		;WRITE TEXT
	MOVEI	T1,[ASCIZ /	M.F==:/]
	PUSHJ	P,FTXT		;WRITE START OF SYMBOL DEFINITION
	LDB	T1,[POINT 9,JOBVER,11] ;MAJOR VERSION NUMBER
	PUSHJ	P,FOCT		;WRITE IT OUT
	MOVEI	T1,[ASCIZ /	;MONGEN VERSION/]
	PUSHJ	P,FTXT		;WRITE IT OUT
	MOVEI	T1,[BYTE(7)15,12,12,0] ;CRLFS
	PUSHJ	P,FTXT		;WRITE THEM OUT
	MOVSI	I,-FTLEN	;AOBJN POINTER TO FEATURE TABLES
	PUSHJ	P,FWRT		;WRITE A FEATURE TEST OUT TO THE FILE
	AOBJN	I,.-1		;LOOP THROUGH THE TABLE
	MOVEI	T1,FTRAIL	;POINT TO FILE TRAILER
	PJRST	FTXT		;WRITE IT OUT AND RETURN


FHEAD:	ASCIZ	\UNIVERSAL F - TOPS-10 SOFTWARE FEATURE TESTS
SUBTTL	WRITTEN BY MONGEN %\


FTRAIL:	ASCIZ	\


	END
\

FCOMB:	ASCIZ	\
COMMENT	&

\

FCOME:	ASCIZ	\
&
\
SUBTTL	FGEN -- FFND - FIND A SPECIFIED FEATURE TEST ENTRY


FFND:	MOVSI	I,-FTLEN	;AOBJN POINTER

FFND1:	MOVE	T2,FTINAM(I)	;GET A NAME
	CAME	T2,[EXP -1]	;HEADER?
	JRST	FFND2		;NO
	MOVEI	I2,(I)		;SAVE INDEX
	JRST	FFND3		;ON TO THE NEXT ONE
FFND2:	CAMN	T1,FTINAM(I)	;A MATCH?
	JRST	CPOPJ1		;RETURN GOODNESS

FFND3:	AOBJN	I,FFND1		;LOOP THROUGH TABLE
	POPJ	P,		;GIVE UP
SUBTTL	FGEN -- FWRT - ROUTINE TO WRITE A FEATURE TEST TO FILE


FWRT:	SKIPN	FTINAM(I)	;ENTRY IN USE?
	POPJ	P,		;THEN DO NOTHING
        MOVE    T1,FTINAM(I)	;GET FEATURE NAME
        CAME    T1,[EXP -1]     ;HEADER?
        JRST    FWRT2           ;NO
	MOVEI	T1,[BYTE(7) 15,12,0] ;CRLF
	PUSHJ	P,FTXT		;START WITH A CRLF
	SKIPE	FTMOD		;FILE OUTPUT?
	JRST	FWRT1		;NO
	MOVEI	T1,[BYTE(7) 15,12,0] ;CRLF
	PUSHJ	P,FTXT		;ONE MODE CRLF
	MOVEI	T1,FWRTT	;POINT TO SEPARATOR LINE
	PUSHJ	P,FTXT		;WRITE IT TO THE FILE
	MOVEI	T1,[ASCIZ /;		/]
	PUSHJ	P,FTXT		;START OF EXPLANATION
FWRT1:	MOVE	T1,FTPTXT(I)	;GET TEXT STRING ADDRESS
	PUSHJ	P,FTXT		;WRITE IT OUT
	MOVEI	T1,FWRTT	;ONE MORE SEPARATOR LINE
	SKIPE	FTMOD		;FILE OUTPUT?
	MOVEI	T1,[BYTE(7) 15,12,0] ;NO
	PJRST	FTXT		;WRITE IT OUT AND RETURN

FWRT2:	MOVEI	T1,[ASCIZ /	FT/]
	PUSHJ	P,FTXT		;WRITE START OF FEATURE TEST SWITCH OUT
	MOVE	T1,FTINAM(I)	;GET FEATURE NAME
	PUSHJ	P,FSIX		;WRITE IT OUT
	MOVEI	T1,[ASCIZ/==:0	;/] ; ASSUME FEATURE TURNED OFF
	MOVE	T2,F		;GET CONFIGURATION BITS
	ANDI	T2,F.KL10!F.KS10 ;JUST THE MEANINGFUL BITS PLEASE
	TDNE	T2,FTICFG(I)	;WANT THIS FEATURE TURNED ON?
	MOVEI	T1,[ASCIZ /==:-1	;/] ;YES
	PUSHJ	P,FTXT		;WRITE TEXT
	MOVE	T1,FTPTXT(I)	;GET TEXT ASSOCIATED WITH FEATURE TEST
	PUSHJ	P,FTXT		;WRITE AS A COMMENT
	MOVEI	T1,[BYTE(7) 15,12,0]
	PJRST	FTXT		;END LINE AND RETURN


FWRTT:	ASCIZ	/
;----------------------------------------------------------------------
/
SUBTTL	FGEN -- MISCELLANEOUS OUTPUT ROUTINES


;OCTAL OUTPUT
;CALL:	MOVE	T1, WORD
;	PUSHJ	P,FOCT

FOCT:	IDIVI	T1,10		;DIVIDE BY RADIX
	PUSH	P,T2		;SAVE REMAINDER
	SKIPE	T1		;DONE?
	PUSHJ	P,FOCT		;RECURSE
	POP	P,CH		;GET DIGIT BACK
	ADDI	CH,"0"		;MAKE ASCII
	PJRST	FCHR		;WRITE IT AND RETURN


;SIXBIT OUTPUT
;CALL:	MOVE	T1, WORD
;	PUSHJ	P,FSIX

FSIX:	SKIPN	T2,T1		;COPY WORD
	POPJ	P,		;NOT THERE?

FSIX1:	LSHC	T1,6		;SHIFT IN A CHARACTER
	ANDI	T1,77		;STRIP OFF JUNK
	MOVEI	CH," "(T1)	;CONVERT TO ASCII
	PUSHJ	P,FCHR		;WRITE IT OUT
	JUMPN	T2,FSIX1	;LOOP FOR ALL CHARACTERS
	POPJ	P,		;RETURN


;ASCII STRING OUTPUT
;CALL:	MOVE	T1, STRING ADDRESS
;	PUSHJ	P,FTXT

FTXT:	HRLI	T1,(POINT 7,)	;MAKE A BYTE POINTER

FTXT1:	ILDB	CH,T1		;GET A CHARACTER
	JUMPE	CH,CPOPJ	;RETURN IF END OF TEXT
	SKIPE	FTMOD		;WRITING TO A FILE?
	JRST	FTXT2		;NO
	CAIL	CH,"A"+40	;LOWER
	CAILE	CH,"Z"+40	; CASE?
	SKIPA			;NO
	SUBI	CH,40		;CONVERT TO UPPER CASE

FTXT2:	PUSHJ	P,FCHR		;WRITE CHARACTER OUT
	JRST	FTXT1		;LOOP


;CHARACTER OUTPUT
;CALL:	MOVE	CH, CHARACTER
;	PUSHJ	P,FCHR

FCHR:	SKIPE	FTMOD		;OUTPUT TO FILE?
	PJRST	TTYPU1		;NO--TERMINAL
	PJRST	FILPUT		;WRITE TO FILE
;VERSION OUTPUT
;CALL:	PUSHJ	P,FVER

FVER:	LDB	T1,[POINT 9,JOBVER,11] ;GET MAJOR VERSION
	PUSHJ	P,FOCT		; PRINT IN OCTAL
	LDB	T1,[POINT 6,JOBVER,17] ;GET MINOR VERSION
	JUMPE	T1,FVER2	;IF NON-ZERO,
	SOS	T1		;  PRINT IN MODIFIED
	IDIVI	T1,^D26		;  RADIX 26 ALPHA
	JUMPE	T1,FVER1	;  JUMP IF ONE CHAR
	MOVEI	CH,"A"-1(T1)	;  ISSUE FIRST OF TWO
	PUSHJ	P,FCHR		;  CHARACTERS
FVER1:	MOVEI	CH,"A"(T2)	;  ISSUE "UNITS"
	PUSHJ	P,FCHR		;  CHARACTER
FVER2:	HRRZ	T1,JOBVER	;GET EDIT NUMBER
	JUMPE	T1,FVER3	;IF NON-ZERO,
	MOVEI	CH,"("		;  ISSUE
	PUSHJ	P,FCHR		;  AS OCTAL
	PUSHJ	P,FOCT		;  WITHIN
	MOVEI	CH,")"		;  PARENTHESES
	PUSHJ	P,FCHR		;  ..
FVER3:	LDB	T1,[POINT 3,JOBVER,2] ;GET "WHO" FIELD
	JUMPE	T1,CPOPJ	;IF NON-ZERO,
	MOVEI	CH,"-"		;  PRINT -
	PUSHJ	P,FCHR		;  AND FIELD
	PJRST	FOCT		;  AS OCTAL
SUBTTL	SYSGEN - DIALOG TO DEFINE HARDWARE AND SOFTWARE CONFIGURATION

SYSGEN:	FILOUT	<SUBTTL SYSCNF - SYSTEM CONFIGURATION DEFINITION FILE OUTPUT BY MONGEN@@@>
	FILOUT	<DEFINE XP(A,B),<A==:B>@@@>
	MOVEI	N,EDITNO	;MONGEN<=>COMMON "VERSION" NUMBER
	FILOUT	<M.GEN==:*@>,N	;OUTPUT TO FILE


	PUSHJ	P,ASKSYS	;FIND OUT WHAT TYPE OF SYSTEM
	FILOUT	<M.KL10==:*@>,M.KL10
	FILOUT	<M.KS10==:*@>,M.KS10
	SKIPE	M.KS10
	JRST	HDWGN1
	MOVEI	N,SM.CPU
	ASKDEC	<CPUs (1,1-*) [
Respond with the total number of CPUs in the system you are configuring.
The maximum number of CPUs supported in an SMP configuration is defined in
the SPD.]>
HDWGN1:	MOVEM	N,M.CPU
	MOVEM	N,SMP		;FLAG FOR MULTI-CPU
	SOS	SMP		;NON-ZERO IF SO
	FILOUT	<M.CPU==:*@>,N


ASKNAM:	ASKSTR	<System name [
Type a system name of 24 characters or less.  The system name is displayed 
in the banner line that is printed when the INITIA monitor command is 
issued.]>
	CAILE	N,^D24		;24 OR LESS?
	RJRST	<TTYOUT <% More than 24 characters@>
		 JRST	ASKNMA>
ASKNMA:	MOVEI	N,0		;STORE 0 TO MAKE SURE ONLY 24 CHARS OUTPUT
	DPB	N,[POINT 7,ASCSTR+4,34]
	MOVSI	N,'*  '		;IN CASE "*" IS IN SYSNAM
	FILSTR	<DEFINE	SYSNAM
<	ASCIZ	&*&>@>
ASKDAT:	DATE	T1,		;GET TODAYS DATE
	IDIVI	T1,^D12*^D31	;YEAR + DAYS IN THIS YEAR
	PUSH	P,T2		;SAVE REMAINDER FOR A BIT
	ADDI	T1,^D64		;1964 IS YEAR 0
	MOVEM	T1,M.YEAR	;SAVE FOR SYMBOL OUTPUT NOW, BEFORE TRUNCATION
	IDIVI	T1,^D100	;MAKE SURE WE STAY IN CENTURY
	EXCH	T2,(P)		;SAVE YEARS (00-99), RETRIEVE REMAINDER OF DATE
	MOVE	T1,T2		;NO. DAYS IN CURRENT YEAR
	IDIVI	T1,^D31		;T1=MONTH-1, T2=DAY OF MONTH-1
	PUSH	P,T1		;SAVE MONTH-1 (0-11)
	MOVEI	N,1(T2)		;DAY (1-31)
	FILOUT	<DEFINE	SYSDAT> ;START MACRO DEFINITION IN FILE
	PUSHJ	P,FILLAB	;OUTPUT LEFT ANGLE BRACKET TO FILE, CRLF
	FILDC2	<ASCIZ &*>,N	;OUTPUT DAY
	MOVEM	N,M.DAY		;SAVE FOR SYMBOL OUTPUT TOO
	POP	P,T1		;MONTH-1
	MOVEI	N,1(T1)		;MONTH (1-12)
	MOVEM	N,M.MON		;SAVE FOR SYMBOL OUTPUT
	MOVE	T1,MONNAM(T1)	;GET MONTH NAME (MIXED CASE)
	MOVEM	T1,ASCSTR	;PUT WHERE FILSTR WILL FIND IT
	FILSTR	<-*->		;OUTPUT MONTH NAME
	POP	P,N		;YEAR (00-99)
	FILDC2	<*&>,N		;OUTPUT TO FILE
	PUSHJ	P,FILRAB	;OUTPUT RIGHT ANGLE BRACKET,CRLF
	FILOUT	<M.MON==:*@>,M.MON
	FILOUT	<M.DAY==:*@>,M.DAY
	FILOUT	<M.YEAR==:*@>,M.YEAR
	JRST	ASKSER		;JUMP AROUND MONTH NAME TABLE

MONNAM:				;TABLE OF SHORT MONTH NAMES
DEFINE	YY(SYL),<IRP SYL,<EXP ASCII |SYL|>>
	YY<Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec>
ASKSER:	SETZB	I,CPU		;SET LOOP COUNTER TO 0

;LOOP TO ASK FOR SERIAL NUMBERS FOR ALL CPUS IN SYSTEM
ASKSLP:	ASKDEC	<CPU* serial number (1-10000) [
Respond with the serial number of the CPU, in the range 1 to 10000.  If your 
installation has more than one processor, this question is asked for each 
CPU.  Each serial number must be unique.]>,I ;ASK FOR CPUN
	MOVEM	N,M.C0SN(I)	;SAVE FOR CPU1 CHECK
	SOJL	I,ASKSN1	;ANY PREVIOUS CPUS ALREADY ANSWERED?

;LOOP TO SCAN ALL PREVIOUS CPU SERIAL NUMBERS TO SEE IF THE SAME
ASKSN0:	CAMN	N,M.C0SN(I)	;SAME AS PREVIOUS SERIAL NUMBER?
	RJRST	<TTYOUT	<? Cannot be same as CPU*@>,I
		 JRST	ASKSER>	;ASK ALL CPUS OVER AGAIN
	SOJGE	I,ASKSN0	;ANY MORE PREVIOUS CPUS?
ASKSN1:	MOVE	I,CPU		;CPU NUMBER
	SETZ	N,		;IN CASE THIS IS A KL10 OR KS10
	AOS	I,CPU		;INCREMENT CPU ITERATION COUNTER
	CAMGE	I,M.CPU		;DONE FOR ALL CPUS IN THIS SYSTEM?
	JRST	ASKSLP		;NO, GO BACK AND ASK FOR ANOTHER
	FILOUT	<M.C0SN==:*@>,M.C0SN
	FILOUT	<M.C1SN==:*@>,M.C1SN
	FILOUT	<M.C2SN==:*@>,M.C2SN
	FILOUT	<M.C3SN==:*@>,M.C3SN
	FILOUT	<M.C4SN==:*@>,M.C4SN
	FILOUT	<M.C5SN==:*@>,M.C5SN
	SETZM	M.DN60		;CLEAR COUNT OF DN60 DEVICES IN SYSTEM
	ASKYN	<Exclude monitor overhead from user run time (YES,NO) [
Overhead is CPU time spent clock queue processing, command decoding, 
swapping, and scheduling.  User run time always includes UUO execution and, 
unless EBOX/MBOX runtime accounting is selected (KL10 systems only), 
includes IO interrupt service time.
    If you exclude monitor overhead from user runtime, users recieve a more 
accurate accounting of their processor usage because user runtime is 
calculated independently of any monitor overhead.  However, installations
that charge their customers for processor usage should be aware that the 
exclusion of monitor overhead decreases the user runtime totals by 10 to 
20 percent.
    If you include monitor overhead with user runtime, apportioned monitor
overhead is included in each user's runtime.  Regardless of how you 
respond to this question, monitor overhead is calculated as a separate 
statistic that can be used in determining the amount of CPU time spent for 
overhead.]>
	FILOUT	<M.RTCO==:*@>,N

ASKEMT:	SKIPN	M.KL10		;KL10 SYSTEM?
	JRST	NOEMRT		;NO, NO EBOX/MBOX TIME ACCOUNTING
	ASKYN	<EBOX/MBOX runtime accounting (YES,NO) [
If EBOX/MBOX runtime accounting is selected, user runtime is computed using 
the KL10 internal accounting clocks.
    With EBOX/MBOX accounting, meters are turned off at the beginning of 
the overhead period and turned on again at the end.  For the most accurate 
user runtime calculation, answer YES to this question and exclude priority 
interrupt (PI) time  from the runtime calculation  by answering YES to the
next question.]>
	MOVEM	N,M.EMRT	;SAVE FOR LATER
	FILOUT	<M.EMRT==:*@>,M.EMRT
	SKIPN	M.EMRT
	JRST	NOEMR1		;NO PI EXCLUSION EITHER
	ASKYN	<Exclude PI time from user runtime (YES,NO) [
If you exclude PI time from user runtime, the EBOX and MBOX accounting 
clocks are stopped whenever a priority interrupt is in progress, and users 
will not be charged for CPU time used during interrupts.]>
	MOVEM	N,M.XPI		;SAVE
	FILOUT	<M.XPI==:*@>,M.XPI
	JRST	ASKACV		;NOW GO ASK ABOUT ACCOUNT VALIDATION
NOEMRT:	FILOUT	<M.EMRT==:0@>
NOEMR1:	FILOUT	<M.XPI==:0@>
ASKACV:	ASKYN	<Account verification (YES,NO) [
LOGIN and the batch system will verify that the user has specified a valid 
account.
    If you answer YES, when accounts are associated with their PPNs and 
when ACTDAE is running, users can log in only if they specify a valid 
account string.  If you answer NO, no verification test is made.]>
	FILOUT	<M.ACV==:*@>,N
	MOVEI	N,0		;ASSUME NO MOS MEMORY SUPPORT
	SKIPN	M.KL10		;A KL10?
	JRST	MOSEND		;NO, CAN'T HAVE RECONFIGURABLE MOS
	ASKYN	<MOS memory (YES,NO) [
Include support for the user-mode MOS memory diagnostic TGHA.  TGHA 
collects statistics on single bit memory errors and substitutes the spare 
bit when a single bit error is determined to be hard.
    If you answer YES, the module MOSSER will be loaded with the monitor.  
If you answer NO, MOSSER will not be loaded.]>
MOSEND:	FILOUT	<M.MOS==:*@>,N	;OUTPUT THE ANSWER
	SETOM	CPUN
DOAUT:	MOVE	T1,[Z.ATOB,,Z.ATOB+1] ;SET UP BLT
	SETZM	Z.ATOB		;CLEAR FIRST WORD
	BLT	T1,Z.ATOE	;ZERO OUT AUTOCONFIGURED DEVICE STORAGE
	TRZ	F,F.KL10!F.KS10	;CLEAR ALL CPU BITS
	SKIPE	M.KL10		;KL10?
	TRO	F,F.KL10	;YES
	SKIPE	M.KS10		;KS10?
	TRO	F,F.KS10	;YES
	BTHOUT	<@Autoconfigured device options:@>

	ASKAUT	(SCA,SCASER,F.KL10,<SCA>,<
SCA (Systems Communications Architecture) provides the ability to
communicate with devices on a CI bus.  SCASER and KLPSER are the driver 
modules.
>)

	ASKAUT	(ENET,ETHSER,F.KL10!F.KS10,<Ethernet service>,<
Load monitor modules needed to communicate using Ethernet.  These modules 
include ETHSER and ETHUUO, plus the hardware driver specific to the type of 
DECsystem-10 being built.
>)

	ASKAUT	(SA10,SAXSER,F.KL10,<SA10 device support>,<
SA10 support provides the ability to communicate with IBM channel devices 
using a Systems Concept SA10 channel interface.  SAXSER is the driver 
module.
>)

	ASKAUT	(DPX,DPXKON,F.KL10,<RP01/2/3 disks>,<
RP01, RP02, and RP03 disks are available through the use of an RP10 
interface.  DPXKON is the driver module for these disks.
>)
	MOVE	T1,M.DPX	;ANSWER
	IORM	T1,M.DISK	;ACCUMULATE

	TRO	F,F.NEVR	;NEVER ASK THE QUESTION
	ASKAUT	(DRX,DRXKON,F.KL10,<Future drum>,<
This generates a dummy symbol reserved for a future drum.
>)
	MOVE	T1,M.DRX	;ANSWER
	IORM	T1,M.DISK	;ACCUMULATE

	ASKAUT	(FHX,FHXKON,F.KL10,<Swapping drums>,<
Burroughs disks and Bryant drums are available through the use of an RC10 
interface.  FHXKON is the driver module for these disks.
>)
	MOVE	T1,M.FHX	;ANSWER
	IORM	T1,M.DISK	;ACCUMULATE

	TRO	F,F.MBUS	;MASSBUS DEVICE
	ASKAUT	(FSX,FSXKON,F.KL10,<RS04/5 Massbus disks>,<
RS04 and RS05 disks are available through the use of an RH10/DF10C 
interface.  FSXKON is the driver module for these disks.
>)
	MOVE	T1,M.FSX	;ANSWER
	IORM	T1,M.DISK	;ACCUMULATE

	TRO	F,F.NEVR	;NEVER ASK THE QUESTION
	ASKAUT	(MDX,MDXKON,F.KL10,<Mass disk>,<
This generates a dummy symbol reserved for the Bryant Mass disk.  
Historical note: Code was written, and tested along with the proposed 
hardware but the product was never released.  The device was called the MD 
disk, sometimes incorrectly refered to as the MF disk.  MD stood for Moby 
Disk.  It was a rather large piece of hardware.
>)
	MOVE	T1,M.MDX	;ANSWER
	IORM	T1,M.DISK	;ACCUMULATE

	TRO	F,F.MBUS	;MASSBUS DEVICE
	TRO	F,F.LOAD	;ALWAYS LOAD DRIVER
	ASKAUT	(RPX,RPXKON,F.KL10!F.KS10,<RP0x/RM0x Massbus disks>,<
RP0x and RM0x disks are available through the use of Massbus hardware. 
RPXKON is the driver module for these disks.
>)
	MOVE	T1,M.RPX	;ANSWER
	IORM	T1,M.DISK	;ACCUMULATE

	TRO	F,F.MBUS	;MASSBUS DEVICE
	ASKAUT	(RNX,RNXKON,F.KL10,<DX20/RP20 disks>,<
RP20 IBM channel disks are available through the use of a DX20 channel 
interface with an RP20CT controller.  RNXKON is the driver module for these 
disks.
>)
	MOVE	T1,M.RNX	;ANSWER
	IORM	T1,M.DISK	;ACCUMULATE

	SKIPN	M.SCA		;SCA?
	TRO	F,F.NEVR	;NO, SO DON'T LOAD
	ASKAUT	(RAX,RAXKON,F.KL10,<CI20/HSC disks>,<
RA series disks are available through the use of CI20 interconnect port 
adapter and an HSC series controller.  RAXKON is the driver module for 
these disks.
>)
	MOVE	T1,M.RAX	;ANSWER
	IORM	T1,M.DISK	;ACCUMULATE

	SKIPN	M.SA10		;SA10?
	TRO	F,F.NEVR	;NO, SO DON'T LOAD
	ASKAUT	(DSX,DSXKON,F.KL10,<SA10/IBM disks>,<
3330/3331 IBM channel disks are available through the use of an SA10 
channel interface with a DC830 controller.  DSXKON is the driver module for
these disks.
>)
	MOVE	T1,M.DSX	;ANSWER
	IORM	T1,M.DISK	;ACCUMULATE

	TRO	F,F.MBUS	;MASSBUS DEVICE
	ASKAUT	(TM02,TM2KON,F.KL10!F.KS10,<TM02/TM03 magtapes>,<
TU45 and TU77 magtape units are available through the use of TM02 or TM03 
controllers.  TM2KON is the driver module for these magtapes.
>)
	MOVE	T1,M.TM02	;ANSWER
	IORM	T1,M.TAPE	;ACCUMULATE

	ASKAUT	(TX01,TX1KON,F.KL10,<DX10/TX01/TX02 tapes>,<
TU70, TU71, TU72, and TU73 IBM channel magtapes are available through the 
use of a DX10 channel interface and a TX01 or a TX02 controller.  TX1KON is 
the driver module for these magtapes.
>)
	MOVE	T1,M.TX01	;ANSWER
	IORM	T1,M.TAPE	;ACCUMULATE

	TRO	F,F.MBUS	;MASSBUS DEVICE
	ASKAUT	(DX20,TD2KON,F.KL10,<DX20/TX02 tapes>,<
TU70, TU71, TU72, and TU73 IBM channel magtapes are available through the 
use of a DX20 channel interface and a TX02 controller.  TD2KON is the 
driver module for these magtapes.
>)
	MOVE	T1,M.DX20	;ANSWER
	IORM	T1,M.TAPE	;ACCUMULATE

	TRO	F,F.MBUS	;MASSBUS DEVICE
	ASKAUT	(TM78,T78KON,F.KL10,<TM78/TU78/TU79 magtapes>,<
TU78 and TU79 magtapes are available through the use of a TM78 controller.  
T78KON is the driver module for these magtapes.
>)
	MOVE	T1,M.TM78	;ANSWER
	IORM	T1,M.TAPE	;ACCUMULATE

	TRO	F,F.MBUS	;MASSBUS DEVICE
	ASKAUT	(TM10,TMXKON,F.KL10,<TM10B magtapes>,<
TU40 and TU41 magtapes are available through the use of a TM10B controller.  
TMXKON is the driver module for these magtapes.
>)
	MOVE	T1,M.TM10	;ANSWER
	IORM	T1,M.TAPE	;ACCUMULATE

	TRO	F,F.MBUS	;MASSBUS DEVICE
	ASKAUT	(TC10,TCXKON,F.KL10,<TC10C magtapes>,<
TU43 magtapes are available through the use of a TC10C controller.  TCXKON 
is the driver module for these magtapes.
>)
	MOVE	T1,M.TC10	;ANSWER
	IORM	T1,M.TAPE	;ACCUMULATE

	SKIPN	M.SA10		;SA10?
	TRO	F,F.NEVR	;NO, SO DON'T LOAD
	ASKAUT	(TS10,TS1KON,F.KL10,<SA10/IBM tapes>,<
STC IBM channel magtapes are available through the use of an SA10 channel 
interface and an 8300 controller.  TS1KON is the driver module for these 
magtapes.
>)
	MOVE	T1,M.TS10	;ANSWER
	IORM	T1,M.TAPE	;ACCUMULATE

	ASKAUT	(LP10,LPTSER,F.KL10,<BA10/LP100 printers>,<
This option provides support for I/O bus line printers.
>)
	MOVE	T1,M.LP10	;ANSWER
	ADDM	T1,M.LPT	;ACCUMULATE

	TRO	F,F.DVCP	;RESERVE SLOT PER CPU
	ASKAUT	(DLP,DLPSER,F.KL10,<CFE/LP20 printers>,<
This option provides support for line printers on the RSX-20F front-end.
>)
	MOVE	T1,M.DLP	;ANSWER
	IORM	T1,M.LPT	;ACCUMULATE

	ASKAUT	(LP20,LP2SER,F.KS10,<UNIBUS/LP20 printers>,<
This option provides support for LP20 UNIBUS line printers.
>)
	MOVE	T1,M.LP20	;ANSWER
	IORM	T1,M.LPT	;ACCUMULATE

	ASKAUT	(XY10,PLTSER,F.KL10,<XY10 plotters>,<
This option provides support for I/O bus plotters.
>)
	MOVE	T1,M.XY10	;ANSWER
	IORM	T1,M.PLT	;ACCUMULATE

	ASKAUT	(CR10,CDRSER,F.KL10,<CR10 card readers>,<
This option provides support for I/O bus card readers.
>)
	MOVE	T1,M.CR10	;ANSWER
	IORM	T1,M.CDR	;ACCUMULATE

	TRO	F,F.DVCP	;RESERVE SLOT PER CPU
	ASKAUT	(DCR,DCRSER,F.KL10,<CFE/CD20 card readers>,<
This option provides support for card readers on the RSX-20F front-end.
>)
	MOVE	T1,M.DCR	;ANSWER
	IORM	T1,M.CDR	;ACCUMULATE

	ASKAUT	(CR20,CD2SER,F.KS10,<UNIBUS/CD20 card readers>,<
This option provides support for CD20 UNIBUS card readers.
>)
	MOVE	T1,M.CR20	;ANSWER
	IORM	T1,M.CDR	;ACCUMULATE

	ASKAUT	(CP10,CDPSER,F.KL10,<CP10/CP10D card punches>,<
This option provides support for card punches.
>)
	MOVE	T1,M.CP10	;ANSWER
	IORM	T1,M.CDP	;ACCUMULATE

	ASKAUT	(PTP,PTPSER,F.KL10,<PC04 paper tape punches>,<
This option provides support for paper tape punches.
>)
;	MOVE	T1,M.PTP	;ANSWER
;	IORM	T1,M.PTP	;ACCUMULATE

	ASKAUT	(PTR,PTRSER,F.KL10,<PC04 paper tape readers>,<
This option provides support for paper tape readers.
>)
;	MOVE	T1,M.PTR	;ANSWER
;	IORM	T1,M.PTR	;ACCUMULATE

	TRZ	F,F.KL10!F.KS10	;CLEAR CPU BITS
	FILOUT	<@;ACCUMULATED SYMBOLS@>
	FILOUT	<M.DISK==:*		;DISK SERVICE@>,M.DISK
	FILOUT	<M.TAPE==:*		;TAPE SERVICE@>,M.TAPE
	FILOUT	<M.CDP==:*		;CARD PUNCH SERVICE@>,M.CDP
	FILOUT	<M.CDR==:*		;CARD READER SERVICE@>,M.CDR
	FILOUT	<M.LPT==:*		;LINE PRINTER SERVICE@>,M.LPT
	FILOUT	<M.PLT==:*		;PLOTTER SERVICE@>,M.PLT
	FILOUT	<M.PTP==:*		;PAPER TAPE PUNCH SERVICE@>,M.PTP
	FILOUT	<M.PTR==:*		;PAPER TAPE READER SERVICE@>,M.PTP
;CODE TO ASK ABOUT DTE-20S ON KL10S

ASKDTE:	SKIPN	N,M.KL10		;IF THIS ISN'T A KL10,
	JRST	ASKDT3			; THEN DON'T GENERATE ANY SYMBOLS
	BTHOUT	<@Types of DTE service to load:@>
	ASKYN	<  Load ANF-10 DTE service (YES,NO) [
Do you want to load the driver to support DTE based ANF-10 front ends?]>
	MOVEM	N,M.DN8S		;REMEMBER ABOUT DN87S'S
	FILOUT	<M.DN8S==:*@>,N		;DEFINE THE SYMBOL
	ASKYN	<  Load IBMCOMM DTE service (YES,NO) [
Do you want to load the driver to support DTE based IBM communications 
front ends?]>
	MOVEM	N,M.DN6S		;REMEMBER ABOUT DN60S'S
	FILOUT	<M.DN6S==:*@>,N		;DEFINE THE SYMBOL
	SKIPE	N			;IF WANT D6SINT,
	AOS	M.DN60			;WE WANT D60SER AS WELL
	ASKYN	<  Load DECnet DTE service (YES,NO) [
Do you want to load the driver to support DTE based DECnet-36 front 
ends?]>
	MOVEM	N,M.DDCN		;REMEMBER ABOUT MCB'S
	FILOUT	<M.DDCN==:*@>,N		;DEFINE THE SYMBOL
	SETOM	CPUN			;START OF LOOP
ASKDT1:	AOS	I,CPUN			;GET NEXT CPU
	CAML	I,M.CPU			;STILL IN RANGE?
	JRST	ASKDT2			;NO, FINISH DTES
	FILCPU	<M.DTEN==:4@>		;YES, SAY HOW MANY DTES TO HANDLE
	JRST	ASKDT1			;LOOP OVER ALL CPUS
ASKDT2:	MOVE	N,M.CPU			;NUMBER OF CPUS
	IMULI	N,4			;FOUR DTES PER CPU
ASKDT3:	FILOUT	<M.DTEN==:*@>,N		;DUMP SYSTEM-WIDE VALUE
	;FALL INTO ASKTTY
ASKTTY:	SETOM	CPUN			;START AT CPU0
	TTYOUT	<@Local terminal configuration:@>
	SKIPN	M.KL10
	JRST	TKSGEN
	ASKLST	<  Configure old terminal scanners (NO,YES) [
If you answer YES, you will be prompted to provide information about DC10s, 
DC68s, and DC76s.]>
	MOVEM	N,DLSCAN		;REMEMBER FOR THE LOOP
ASKTT1:	AOS	T1,CPUN			;STANDARD CPU LOOP
	CAML	T1,M.CPU		;IF DONE,
	JRST	ASKTT2			;FINISH HERE
	MOVE	N,CPUN
	ASKDEC	<  How many RSX-20F TTYs on CPU* (0,0-128) [
Respond with the number of terminals on the RSX-20F console front-end for 
this CPU.  Include only timesharing (DH11) lines, not CTY or KLINIK.]>
	ADDI	N,4			;ADD ONE FOR EACH CONTROL LINE
	ADDM	N,M.TTDN		;UPDATE SYSTEM-WIDE TOTAL
	FILCPU	<M.TTDN==:*@>,N		;DEFINE HOW MANY THIS CPU
TTYCPX:	MOVEI	N,0			;NO DC10
	SKIPN	CPUN			;ONLY ON CPU0
	SKIPN	DLSCAN
	 JRST	NODC10
	MOVE	N,CPUN
	ASKDEC	<  How many DC10s on CPU* (1,0-2) [
The DC10 is a data line scanner.]>
NODC10:	SKIPN	CPUN
	MOVEM	N,M.DC10
	MOVEI	N,0			;NO DC68
	SKIPN	CPUN
	SKIPN	DLSCAN
	 JRST	NODC68
	MOVE	N,CPUN
	ASKDEC	<  How many DC68s on CPU* (1,0-2) [
The DC68 is a PDP-8 680 or 680I communications system.]>

NODC68:	SKIPN	CPUN
	MOVEM	N,M.DC68
	MOVEI	N,0		;NO DC76S
	SKIPN	CPUN
	SKIPN	DLSCAN		;DO WE WANT TO ASK?
	 JRST	NODC76		;NO
	MOVE	N,CPUN
	ASKDEC	<  How many DC76s on CPU* (1,0-8) [
The DC76 is a PDP-11 communications system.]>

NODC76:	SKIPE	CPUN
	JRST	ASKTT1
	MOVEM	N,M.DC76
	FILOUT	<M.DC10==:*@>,M.DC10
	FILOUT	<M.DC68==:*@>,M.DC68
	FILOUT	<M.DC76==:*@>,M.DC76
	SKIPN	M.DC10		;HAVE A DC10?
	JRST	ASK68		;NO--DO NOT ASK ABOUT IT
	PUSH	P,[0]		;ASK ABOUT DC10 #0
	PUSHJ	P,ASKDCX	; ..
	AOS	(P)		;ASK ABOUT DC10 #1
	MOVE	N,M.DC10	;GET # OF DC10S
	CAME	N,(P)		;ALL DONE
	PUSHJ	P,ASKDCX	; ..
	POP	P,(P)		;CLEAN UP THE STACK

ASK68:	SKIPN	M.DC68		;ANY DC68 HARDWARE
	JRST	ASK76		;NO--ASK ABOUT DC76
	PUSH	P,[0]		;ASK ABOUT DC68 #0
	PUSHJ	P,ASKD68	; ..
	AOS	(P)		;ASK ABOUT DC68 #1
	SOSE	M.DC68		; IF THERE ARE 2 DC10S
	PUSHJ	P,ASKD68	; ..
	POP	P,(P)		;CLEAN UP THE STACK
ASK76:	SKIPN	M.DC76		;HAVE A DC76?
	JRST	ASKTT1		;NO--DO NOT ASK DC76 QUESTIONS
	PUSH	P,[0]
	PUSHJ	P,ASKD76
	AOS	(P)
	SOSE	M.DC76
	JRST	.-3
	POP	P,(P)
	JRST	ASKTT1
TKSGEN:	FILOUT	<M.DC10==:0@>
	FILOUT	<M.DC68==:0@>
	FILOUT	<M.DC76==:0@>
	ASKDEC	<  DZ-11 TTY lines (0-32) [
Respond with the total number of TTY lines.]>
	MOVEM	N,M.DZNL
	SETZM	CPUN		;FIRST CPU
	FILCPU	<M.DZNL==:*@>,N
ASKTT2:	FILOUT	<M.D70N==:*@>,M.D70N
	FILOUT	<M.D71N==:*@>,M.D71N
	FILOUT	<M.D72N==:*@>,M.D72N
	FILOUT	<M.D73N==:*@>,M.D73N
	FILOUT	<M.D74N==:*@>,M.D74N
	FILOUT	<M.D75N==:*@>,M.D75N
	FILOUT	<M.D76N==:*@>,M.D76N
	FILOUT	<M.D77N==:*@>,M.D77N
	FILOUT	<M.D78N==:0@>	;DUMMY SYMBOLS SINCE DC76 ONLY ON DL10
	FILOUT	<M.D79N==:0@>
	FILOUT	<M.D7AN==:0@>
	FILOUT	<M.D7BN==:0@>
	FILOUT	<M.TTG0==:*@>,M.TTG0
	FILOUT	<M.TTG1==:*@>,M.TTG1
	FILOUT	<M.DSG0==:*@>,M.DSG0
	FILOUT	<M.DSG1==:*@>,M.DSG1
	FILOUT	<M.68L0==:*@>,M.68L0
	FILOUT	<M.68L1==:*@>,M.68L1
	FILOUT	<M.DZNL==:*@>,M.DZNL
	FILOUT	<M.TTDN==:*@>,M.TTDN

	MOVE	N,M.TTG0	;NUMBER OF 8-LINE GROUPS
	ADD	N,M.TTG1	; PLUS NUMBER OF LINES ON DC10 #1
	LSH	N,3		;TIMES 8=NUMBER OF LINES
	ADD	N,M.D70N	;PLUS LINES ON DC76
	ADD	N,M.D71N
	ADD	N,M.D72N
	ADD	N,M.D73N
	ADD	N,M.D74N
	ADD	N,M.D75N
	ADD	N,M.D76N
	ADD	N,M.D77N
	ADD	N,M.DZNL	;PLUS DZ-11 LINES (KS-10)
	ADD	N,M.TTDN	;PLUS RSX-20F LINES (KL-10)
	ADD	N,M.68L0	;PLUS LINES ON DC68
	ADD	N,M.68L1	; = TOTAL NUMBER OF LINES
	MOVEM	N,M.TLTL	;SAVE FOR M.PTY & M.RTTY
	FILOUT	<M.TLTL==:*	;TOTAL LOCAL TTY LINES@@>
;FALL INTO ASKOPR ON NEXT PAGE
ASKOPR:	SOJ	N,		;ADJUST TO GET HIGHEST LINE
	BTHOUT	<@>		;SOME SEPARATION
	ASKLIN	<  OPR octal line number (CTY,0-*) [
Respond with the octal number of the terminal you want to designate as 
device OPR, the operator-privileged terminal.  This is normally the 
terminal that will be running OPR, the operator service program, to control 
the system utility programs such as the device spoolers and the mount 
request processor.  The default is the console terminal (CTY).]>

	FILOUT	<DEFINE	OPRLIN>
	PUSHJ	P,FILLAB
	FILOUT	<@	OPRL	*@>,N
	PUSHJ	P,FILRAB
	FILOUT	<@>

ASKDSD:	FILOUT	<DEFINE	MACDSD>	;START MACRO DEFINITION
	ASKMN	<  Data set lines [
Class of terminal for LOGIN, LOGIN resets line to computer echoing and no 
hardware tabs.
    This question accepts a list of octal terminal line numbers.  The 
terminal line can be indicated by its number (n), a range of terminal lines 
can be indicated by the lowest and highest numbers in the range separated 
by a hyphen (m-n), and the CTY is always indicated by CTY.  Type each 
designator on a separate line and end the list with an extra carriage 
return.]@>

TTYEND:	JRST	ASKJOB			;DONE HERE, ON TO NEXT QUESTION
;SUBROUTINE TO ASK ABOUT DC10 HARDWARE
;CALL WITH:
;	PUSHJ	P,[DC10 NUMBER]
;	PUSHJ	P,ASKDCX

ASKDCX:	MOVE	N,-1(P)		;PICK UP DC10 NUMBER
	TTYOCT	<@  For DC10 *:@>
	MOVEI	N,SM.TTG	;MAX TTY GROUPS
	ASKDEC	<    Number of DC10B [or 632] 8 line data groups (1-*) [
1 is TTY0 through 7, 2 is TTY0 through 17,...8 is TTY0 through 77.]>
	MOVE	T1,-1(P)	;STORE FOR CORRECT DC10
	MOVEM	N,M.TTG0(T1)	; ..
	ASKDEC	<    Number of DC10E data set control groups (0-*)>
	MOVE	T1,-1(P)
	MOVEM	N,M.DSG0(T1)	;STORE FOR CORRECT DC10


ASKCRR:	MOVE	N,-1(P)		;WHICH DC10
	FILOUT	<DEFINE	MACCR*>
	MOVE	T1,-1(P)
	SKIPN	M.DSG0(T1)	;DATA SETS?
	JRST	ASKCR1		;NO, SKIP THIS QUESTION
	ASKMNP	<  Correspondence of DC10E lines to the DC10B lines (M-N,P) [
Type M,P for one pair and M-N,P for a range of pairs, where M is an octal 
DC10E line number, M-N is an octal range of DC10E line numbers, and P is an 
octal DC10B line number.]@>
	POPJ	P,0		;RETURN
ASKCR1:	PUSHJ	P,FILLAB	;OUTPUT NULL MACRO IF DIDNT ASK
	PJRST	FILRAB		;FINISH MACRO IF DIDNT ASK
;SUBROUTINE TO ASK ABOUT DC68 LINES
;CALL WITH:
;	PUSH	P,[DC68 NUMBER]
;	PUSHJ	P,ASKD68

ASKD68:	MOVE	N,-1(P)
	TTYOCT	<@  FOR DC68 *:@>
	MOVEI	N,SM.68L
	ASKOCT	<    Number of DC68 lines, including its console TTY (1-*)>
	MOVE	T1,-1(P)
	MOVEM	N,M.68L0(T1)
	POPJ	P,
;SUBROUTINE TO ASK ABOUT A DC76
;CALL WITH
;	PUSH	P,[DC76 NUMBER]
;	PUSHJ	P,ASKD76

ASKD76:	MOVE	N,-1(P)
	TTYOCT	<@  For DC76 *:@>
	ASKDEC	<    To which DL10 port is the DC76 connected (0,1-7) [
Each PDP-11 is connected to a DL10 port.  If there is only one PDP-11, it 
is always connected to port 0.  If there are two PDP-11s, one is connected 
to port 0 and the other is connected to port 1.]>
	PUSH	P,N
	ASKDEC	<    Decimal lines on DC76 (1-129) [
Each DC76F has 16 lines, plus one line for the console teletype.  A DC76 
with two DC76Fs has 33 lines.]>
	MOVE	T1,(P)
	MOVEM	N,M.D70N(T1)
	POP	P,(P)
	POPJ	P,0
ASKJOB:	BTHOUT	<@>		;SEPARATION
	MOVEI	N,SM.JOB	;MAXIMUM NUMBER OF JOBS
	ASKDEC	<Number of Jobs (1-*) [
Respond with the maximum number of jobs, attached and detached, not 
counting the null job.  Specify only the maximum number of jobs needed.
Monitor size increases proportionally to the maximum number of jobs.]>
	FILOUT	<M.JOB==:*@>,N
	FILOUD	<MD.SEG==:*@>,MD.SEG

ASKCOR:	MOVEI	N,SM.MPI	;MAXMUM NUMBER OF PAGES
	ASKDEC	<Maximum pages of core for each job (0,0-*) [
Answer this question with the maximum amount of physical memory that any 
one job may use.  This value is specified in number of 512-word pages.  A 
response of 0 indicates all of core, or the maximum number of pages 
possible.  The value you specify here can be overridden by the SET CORMAX 
monitor command.]>,N
	FILOUT	<M.CORE==:*@>,N
	MOVEI	N,^D4096	;UP TO 4 MILLION WORDS ALLOWED

ASKNKC:	ASKDEC	<Total amount of system core in K (512-*) [
ONCE-only reports if there is less core at startup.  Answer this question 
with the total amount of physical memory that the system has.  At monitor 
startup time, ONCE prints a message if the actual amount of memory on line 
is less than your response to this question.]>
	FILOUT	<M.NKC==:*@>,N
ASKTPS:	SKIPN	M.KS10		;KS10?
	JRST	ASKRTD		;NO
	ASKLST	<Clock ticks per second (60,50) [
Clock ticks per second corresponds to power line frequency.  In North 
America, the correct response is 60; in most other countries, the correct 
response is 50.]>
	SKIPN	N		;SKIP IF 50
	TROA	N,^D60		;NO, 60
	MOVEI	N,^D50		;50
	FILOUT	<M.TPS==:*@>,N
ASKRTD:	SKIPN	M.KS10		;KS10?
	JRST	ASKRT0		;NO--GO ON
	FILOUT	<M.RTD==:0@>	;YES--NO REAL TIME
	JRST	ASKLOK		;GO ON
ASKRT0:	MOVEI	N,SM.RTD	;MAXIMUM NUMBER OF REAL TIME DEVICES
	ASKDEC	<Number of real-time devices (0,0-*) [
Answer this question with the maximum number of real-time devices that can 
be put on PI channels simultaneously.]>
	FILOUT	<M.RTD==:*@>,N
	JUMPN	N,ASKLK1	;DO NOT ASK ABOUT LOCKING IF REAL TIME
				; SINCE MUST HAVE LOCKING FOR REAL TIME

ASKLOK:	ASKYN	<Allow jobs to be locked in core (YES,NO) [
If you answer NO, no users will be allowed to lock their jobs in core 
memory.
    The ANF-10 network programs DTELDR and NETLDR require the ability to 
lock a job in memory.  Therefore, if you intend to use these programs, you 
must answer this question YES.  This question is always asked for KS 
systems, and is asked for KL systems only if no real-time devices are 
employed.]>
ASKLK1:	FILOUT	<M.LOK==:*@>,N
	MOVEM	N,M.LOK		;SAVE IT FOR LATER TESTS
	JUMPE	N,ASKMG1

ASKMGC:	MOVEI	N,SM.MPI	;MAXIMUM NUMBER OF PAGES ON KI10
	ASKDEC	<Guaranteed number of pages for unlocked jobs (0,0-*) [
Answer this question with the number of pages of memory guaranteed to all 
jobs that are not locked in core.  The default, 0, indicates that all of 
memory is available to unlocked jobs.
    If your answer is 0, no jobs are allowed to be locked, as a safeguard 
against locked jobs usurping all of the system's memory.  The value 
specified in your answer to this question can be overridden by the SET 
CORMIN monitor command.]>
ASKMG1:	FILOUT	<M.MGC==:*@>,N

ASKEVM:	SKIPN	N,M.LOK		;LOCK UUO INCLUDED?
	JRST	ASKEV1		;NO, NO LOCKING IN EVM EITHER
				;DEFAULT (FOR DTELDR) IS 10. PAGES
	ASKDEC	<Number of pages reserved for locking jobs in Exec Virtual Memory (10,0-?) [
The default, 10, is needed for DTELDR.  Extra pages are required for 
running performance analysis tools such as SNOOPY and DNSNUP or for any 
real-time applications using indirect CONSO masks or fast mode.  Reserving
pages for EVM reduces the amount of available system free core by an 
equivalent amount.]>
ASKEV1:	FILOUT	<M.EVM==:*@>,N


ASKHPQ:	MOVEI	N,SM.HPQ	;MAXIMUM NUMBER OF HIGH PRIORITY QUEUES
	ASKDEC	<Number of high priority interrupt queues (0,0-*)>
	FILOUT	<M.HPQ==:*@>,N

ASKMET:	ASKLST	<Meter (NO,YES) [
Do you want to include performance analysis metering with the METER UUO? 
This option has officially been superseded by the PERF. UUO.]>
	FILOUT	<M.METR==:*@>,N

ASKKAS:	ASKLST	<KASER (NO,YES) [
Do you want to include support for simulation of KA10 long floating point 
instructions?]>
	FILOUT	<M.FPS==:*@>,N

ASKMSG:	ASKYN	<MPXSER (YES,NO) [
Do you want to include support for device MPX?  MPX allows more than one 
device to be associated with a given I/O channel.  This feature is required 
for DTELDR.  If you answer YES, the multiplexed-channel software MPX will 
be loaded.]>
	FILOUT	<M.MPX==:*@>,N
ASKPSI:	ASKYN	<PSISER (YES,NO) [
Do you want to load the Programmed Software Interrupt SERvice software? 
PSISER supports the PISYS. UUO, which allows users to specify the 
conditions for which an interrupt is to occur.  PSISER is required for the 
operation of GALAXY-10.]>
	FILOUT	<M.PSI==:*@>,N

ASKIPC:	ASKYN	<IPCF (YES,NO) [
Do you want to load the Inter-Process Communication Facility software?  
IPCF allows jobs and/or system processes to communicate with each other. 
IPCF is required for the operation of MCS-10 and GALAXY-10.]>
	FILOUT	<M.IPCF==:*@>,N

ASKENQ:	ASKYN	<ENQ/DEQ (YES,NO) [
Do you want to load the ENQ/DEQ software?  ENQ/DEQ provides sychronization 
functions which allow simultaneous file updates by multiple co-operating 
processes.]>
	FILOUT	<M.EQDQ==:*@>,N

DSKSET:	ASKSTR	<Disk sets (ALL) [
Answer this question with the list of disk sets to be mounted by this 
system.  If the list is empty, ALL disk sets will be mountable.  Disk set 
numbers range from 1 through 36.  List entries in the form:
	
	3,9-12,14,...
	
]>
	SETZM	M.SETS		;CLEAR OUT OUR VARIABLE
	JUMPE	CH,DSKSE4	;DEFINE EMPTY SYMBOL IF NO SETS TO BE ENABLED
	CAIE	CH,"A"		;DOES IT LOOK LIKE HE TYPED "ALL"
	CAIN	CH,"a"		;IN EITHER CASE?
	TRNA			;YES--LOOK FURTHER
	JRST	DSKSE1		;NO--COLLECT A LIST OF NUMBERS
	MOVEI	T1,[ASCIZ/(ALL)/] ;LIST STRING
	PUSHJ	P,SETASK	;SETUP FOR EXAMINING THE RESPONSE
	PUSHJ	P,FNDAS1	;GET THE RESPONSE
	  JRST	DSKER1		;FORMAT ERROR
	JUMPN	CH,DSKER1	;MUST BE AT EOL
	JRST	DSKSE4		;OK--PRETEND IT WAS A BARE <CR>
DSKSE1:	PUSHJ	P,GETDEC	;READ A DECIMAL SET NUMBER
	JUMPLE	N,DSKERR	;MUST BE POSITIVE
	CAILE	N,^D36		;AND .LE. 36
	JRST	DSKERR		;RANGE ERROR
	MOVE	T1,N		;COPY VALUE IN CASE NOT A RANGE
	CAIE	CH,"-"		;IS THIS FOR A RANGE?
	JRST	DSKSE2		;NO
	PUSH	P,N		;YES, SAVE CURRENT VALUE
	PUSHJ	P,GETDEC	;GET NEXT VALUE
	POP	P,T1		;RESTORE PREVIOUS
	CAILE	N,0		;MUST BE IN RANGE
	CAILE	N,^D36		;OF 1-36
	JRST	DSKERR		;RANGE ERROR IF NOT
	CAML	T1,N		;MAKE SURE OF ASCENDING ORDER
	JRST	DSKER1		;COMPLAIN IF NOT
DSKSE2:	SUB	N,T1		;GET OFF-BY-ONE COUNT OF BITS
	SETCA	N,		;MAKE -VE ACTUAL COUNT
	MOVSS	N		;PUT IN LH
	HRRI	N,-1(T1)	;GET PROPER STARTING BIT NUMBER
DSKSE3:	MOVE	T1,BITTBL(N)	;GET NEXT BIT TO USE
	IORM	T1,M.SETS	;INCLUDE IN OUR MASK
	AOBJN	N,DSKSE3	;LOOP OVER THE ENTIRE RANGE
	JUMPE	CH,DSKSE4	;ALL OK AT EOL
	CAIN	CH,","		;WAS BREAK A COMMA?
	JRST	DSKSE1		;YES, LOOP FOR NEXT
	JRST	DSKER1		;NO, COMPLAIN AND RE-ASK

DSKERR:	TTYOUT	<? Disk set numbers range only from 1 through 36.@>
	AOJA	LV,DSKSET
DSKER1:	TTYOUT	<? Invalid list format@>
	AOJA	LV,DSKSET

DSKSE4:	HLRZ	N,M.SETS	;GET LH OF VALUE
	FILOUT	<M.SETS==:*,,>	;START WITH LH
	HRRZ	N,M.SETS	;GET RH
	FILOUT	<*@>		;FINISH M.SETS DEFINITION
	MOVE	LV,SAVLV	;BACK TO DESIRED HELP LEVEL


;START OF PER-CPU DEVICE QUESTIONS
	SETOM	CPUN
	ASKLST	<Configure non-autoconfigured hardware (NO,YES) [
Do you want to include unsupported hardware in your configuration?]>
	MOVEM	N,UNAUTC	;REMEMBER THE FLAG
ASKDEV:	AOS	N,CPUN
	CAML	N,M.CPU
	JRST	DEVEND
	SKIPE	UNAUTC		;ONLY IF WANT TO PROMPT
	SKIPN	SMP
	JRST	ASKDIS		;SKIP "ON CPU*" IF ONLY ONE
	BTHOUT	<@On CPU*:@>,N
ASKDIS:	MOVEI	N,0		;NO DISPLAYS
	SKIPE	M.KL10
	SKIPN	UNAUTC
	JRST	NODIS		;NO
	SKIPE	CPUN		;CPU0?
	JRST	NODIS		;NO, CAN'T HAVE DISPLAYS ON NON-ZERO CPUS

	ASKLST	<DIS (NO,YES) [
Do you want to include display devices VP10, 340, 30, or VB10C (as 
distinguished from display terminals) in your configuration?]>

NODIS:	JUMPE	N,ASKDS1	;ANY DISPLAYS?
	ASKLST	<Type (VP10,340,VB10C) [
Respond with the specific type of display device you want to include in 
your configuration.  Answer VP10 for Type 30.]>
	AOS	M.VP10(N)	;SET M.VP10, M.340 OR M.VBXC TO 1
ASKDS1:	SKIPE	CPUN		;CPU0?
	JRST	ASKDS2		;NO, JUST DUMP CPU VARIABLES (ZEROS)
	FILOUT	<M.VP10==:*@>,M.VP10
	FILCPU	<M.VP10==:*@>,M.VP10
	FILOUT	<M.340==:*@>,M.340
	FILCPU	<M.340==:*@>,M.340
	FILOUT	<M.VBXC==:*@>,M.VBXC
	FILCPU	<M.VBXC==:*@>,M.VBXC
	SETZ	N,		; FOR FILOUT OF M.DIS
	SKIPN	M.VP10		;SKIP IF VP10 DISPLAY
	SKIPE	M.340		;SKIP IF NOT 340 DISPLAY
	MOVEI	N,1		;FILOUT M.DIS=1 IF EITHER 340 OR VP10
	FILOUT	<M.DIS==:*@>,N	;
	FILCPU	<M.DIS==:*@>,N	;
	JRST	ASKDS3		;SKIP AROUND CPU1-N CASE
ASKDS2:	FILCPU	<M.VP10==:0@>
	FILCPU	<M.340==:0@>
	FILCPU	<M.VBXC==:0@>
	FILCPU	<M.DIS==:0@>
ASKDS3:
ASKDTA:	MOVEI	N,0		;NO DECTAPES
	SKIPE	M.KL10
	SKIPN	UNAUTC		;WANT TO ASK?
	JRST	NODTAS		;NO

	MOVEI	N,SM.DTA	;MAXIMUM NUMBER OF DTA CONTROLLERS
	ASKDEC	<Number of TD10s (0,0-*) [
The TD10 is a DECtape controller.]>

NODTAS:	FILCPU	<M.TD10==:*@>,N
	MOVE	I,N		;SETUP DTA UNIT ITERATION COUNTER
	JUMPE	I,DTEND		;ANY DTA UNIT AT ALL?
DTLOOP:	AOS	N,DTA		;YES, INCREMENT COUNT OF DT CONTROLLERS IN SYSTEM
	ADDI	N,'A'-1		;FORM SIXBIT CONTROLLER LETTER
	ROT	N,-6		;LEFT JUSTIFY
	ASKDEC	<  Number of units on DT* (1-8)>,N
	PUSH	P,N		;SAVE ANSWER(NO OF UNITS ON THIS CONTROLER
	MOVE	N,DTA		;CONTROLLER NUMBER
	ADDI	N,'A'-1		;FORM SIXBIT CONTROLLER LETTER
	ROT	N,-6		;LEFT JUSTIFY
	FILOUT	<M.DT*==:>,N	;FIRST HALF
	EXCH	N,(P)
	FILOUT	<*@>,N		;OUTPUT
	EXCH	N,(P)
	FILCPU	<M.DT*==:>,N	;FIRST HALF
	POP	P,N		;RESTORE NO. OF UNITS ON THIS CONTROLER
	FILCPU	<*@>,N		;OUTPUT
	SOJG	I,DTLOOP	;ANY MORE CONTROLLERS?
DTEND:
ASKRX2:	SETZ	N,		;DEFAULT TO NO RX20S
	SKIPN	M.KL10		;KL10?
	SKIPN	UNAUTC		;WANT TO ASK?
	JRST	RXEND		;NO
	MOVEI	N,SM.RXK	;MAXIMUM NUMBER OF RX02 CONTROLLERS
	ASKDEC	<Number of RX211s (0,0-*) [
The RX211 is a double density "floppy disk" controller.]>
	FILCPU	<M.RX20==:*@>,N
	MOVE	I,N		;SETUP RX02 UNIT ITERATION COUNTER
	JUMPE	I,RXEND		;ANY RX02 UNITS AT ALL?
RXLOOP:	AOS	N,RX20		;YES, BUMP COUNT OF RX CONTROLLERS IN SYSTEM
	ADDI	N,'A'-1		;FORM SIXBIT CONTROLLER LETTER
	ROT	N,-6		;LEFT JUSTIFY
	ASKDEC	<  Number of units on RX* (1-2)>,N
	PUSH	P,N		;SAVE ANSWER(NO OF UNITS ON THIS CONTROLER
	MOVE	N,RX20		;CONTROLLER NUMBER
	ADDI	N,'A'-1		;FORM SIXBIT CONTROLLER LETTER
	ROT	N,-6		;LEFT JUSTIFY
	FILOUT	<M.RX*==:>,N	;FIRST HALF
	EXCH	N,(P)
	FILOUT	<*@>,N		;OUTPUT
	EXCH	N,(P)
	FILCPU	<M.RX*==:>,N	;FIRST HALF
	POP	P,N		;RESTORE NO. OF UNITS ON THIS CONTROLER
	FILCPU	<*@>,N		;OUTPUT
	SOJG	I,RXLOOP	;ANY MORE CONTROLLERS?
RXEND:	SKIPN	M.KL10
	SKIPE	UNAUTC		;DID WE ASK?
	JRST	ASKXTC		;YES
	FILCPU	<M.RX20==:0@>
ASKXTC:	MOVEI	N,0		;NO DA28S
	SKIPE	M.KL10
	SKIPN	UNAUTC
	JRST	NODA28		;NO
	SKIPE	CPUN		;IF NOT CPU0,
	JRST	NODA28		;DON'T ASK

	MOVEI	N,SM.XTC	;MAX # OF DA28S
	ASKDEC	<Number of DA28s (0,0-*) [
The DA28 provides interprocessor channels for PDP8/11/15.]>

NODA28:	FILCPU	<M.XTC==:*@>,N
	SKIPE	CPUN
	JRST	NDA28B
	FILOUT	<M.XTC==:*@>,N
NDA28B:	JUMPE	N,XTCEND
	ASKDEC	<Number of lines for TTY pool (8,0-512) [
The answer you provide specifies the number of lines (up to a maximum of 
512) reserved for use on DA28 channels.]>
	FILOUT	<M.XTL==:*@>,N
	MOVEM	N,M.XTL

XTCEND:	FILCPU	<M.XTL==:*@>,N
ASKD78:	MOVEI	N,0
	SKIPE	M.KL10
	SKIPN	UNAUTC
	JRST	NODS78
	SKIPE	CPUN		;CPU0?
	JRST	NODS78		;NO, CAN'T HAVE ANY HERE
	MOVEI	N,SM.D78	;MAXIMUM NUMBER OF DAS78S
	ASKDEC	<Number of DAS78s (0,0-*) [
The DAS78 provides IBM 360, 370, and/or 2780 support.]>
	ADDM	N,M.DAS78	;ACCUMULATE TOTAL NUMBER IN SYSTEM
NODS78:	MOVEM	N,M.D78N	;SAVE NUMBER ON THIS CPU FOR COUNT DOWN
	JUMPE	N,ASK78B	;SEE IF ANY DAS78S
	PUSH	P,[0]		;PUT A 0 ON THE STACK TO COUNT UP
ASK78A:	PUSHJ	P,ASK78S	;ASK ABOUT THE DAS78S
	AOS	(P)		;SET UP TO ASK ABOUT NEXT ONE
	SOSE	M.D78N		;ASKED ABOUT ALL DAS78S?
	JRST	ASK78A		;NO, ASK ABOUT ANOTHER ONE
	POP	P,(P)		;CLEAN THE STACK
ASK78B:	FILCPU	<M.0D78==:*@>,M.0D78
	FILCPU	<M.1D78==:*@>,M.1D78
	FILCPU	<M.2D78==:*@>,M.2D78
	FILCPU	<M.3D78==:*@>,M.3D78
	FILCPU	<M.4D78==:*@>,M.4D78
	FILCPU	<M.5D78==:*@>,M.5D78
	FILCPU	<M.6D78==:*@>,M.6D78
	FILCPU	<M.7D78==:*@>,M.7D78
	FILCPU	<M.D78L==:*@>,M.D78L
	FILCPU	<M.XXI==:*@>,M.D78L
	FILCPU	<M.XXO==:*@>,M.D78L
	JRST	ASK78C		;DONE DAS78S.

ASK78S:	MOVE	N,-1(P)		;GET A NUMBER FOR DAS78
	TTYOCT	<@For DAS78 *:@@>
	ASKDEC	<To which DL10 port is the DAS78 connected (0,0-7) [
Each DAS78 PDP11 is connected to a DL10 port.]>
	PUSH	P,N		;SAVE PORT NUMBER ON STACK
	ASKDEC	<Decimal lines on the DAS78 (1-16) [
Each DAS78 can support up to 16 IBM 360s, 370s, and/or 2780s.]>
	ADDM	N,M.D78L	;KEEP A SUM OF THE DAS78 LINES
	MOVE	T1,(P)		;GET DAS78 NUMBER
	MOVEM	N,M.0D78(T1)	;SAVE LINES IN PROPER PORT LOC
	POP	P,(P)		;CLEAN STACK
	POPJ	P,		;EXIT
ASK78C:
ASKD60:	MOVE	T1,[M.DN6D,,M.DN6D+1]
	SETZM	M.DN6D
	BLT	T1,M.BD60
	SETZ	N,
	SKIPN	M.KL10
	JRST	ASK60A
	SKIPE	UNAUTC		;SKIP IF WANT NO DN60S
	SKIPE	CPUN
	JRST	ASK60A

	MOVEI	N,SM.D60	;MAXIMUM NUMBER OF DN60S
	ASKDEC	<Number of DN60s (0,0-*) [
The DN60 is an IBM BSC interface.]>
ASK60A:	MOVEM	N,M.DN6D	;SAVE NUMBER FOR COUNT DOWN
	ADDM	N,M.DN60	;ADD TO GENERIC DN60 DEVICE COUNTER TOO
	SKIPE	CPUN
	JRST	ASK60C
	FILOUT	<M.DN6D==:*@>,M.DN6D
	SKIPN	M.DN6D		;SEE IF ANY DN60S
	JRST	ASK60C		;NO DN60S
	PUSH	P,[0]		;PUT A 0 ON THE STACK TO COUNT UP
ASK60B:	PUSHJ	P,ASK60S	;ASK ABOUT THE DN60S
	AOS	(P)		;SET UP TO ASK ABOUT NEXT ONE
	SOSE	M.DN6D		;ASKED ABOUT ALL DN60S?
	JRST	ASK60B		;NO, ASK ABOUT ANOTHER ONE
	POP	P,(P)		;CLEAN THE STACK
ASK60C:	FILCPU	<M.0D60==:*@>,M.0D60
	FILCPU	<M.1D60==:*@>,M.1D60
	FILCPU	<M.2D60==:*@>,M.2D60
	FILCPU	<M.3D60==:*@>,M.3D60
	FILCPU	<M.4D60==:*@>,M.4D60
	FILCPU	<M.5D60==:*@>,M.5D60
	FILCPU	<M.6D60==:*@>,M.6D60
	FILCPU	<M.7D60==:*@>,M.7D60
	FILCPU	<M.D60L==:*@>,M.D60L
	SKIPE	CPUN
	JRST	ASK60D
	FILOUT	<M.0D60==:*@>,M.0D60
	FILOUT	<M.1D60==:*@>,M.1D60
	FILOUT	<M.2D60==:*@>,M.2D60
	FILOUT	<M.3D60==:*@>,M.3D60
	FILOUT	<M.4D60==:*@>,M.4D60
	FILOUT	<M.5D60==:*@>,M.5D60
	FILOUT	<M.6D60==:*@>,M.6D60
	FILOUT	<M.7D60==:*@>,M.7D60
	FILOUT	<M.D60L==:*@>,M.D60L
	JRST	ASK60D		;DONE DN60S.
ASK60S:	MOVE	N,-1(P)		;GET A NUMBER FOR DN60
	TTYOCT	<@For DN60 *:@@>
	ASKOCT	<To which port is the DN60 connected (0,0-7) [
Each DN60 is connected to a DL10 port.  DL10 number 1 connects to ports 0 
through 3, DL10 number 2 connects to ports 4 through 7.]>
	PUSH	P,N		;SAVE PORT NUMBER ON STACK
	ASKDEC	<Decimal lines on the DN60 (1-12) [
Each DN60 can support up to 12 IBM BSC interfaces.]>
	ADDM	N,M.D60L	;KEEP A SUM OF THE DN60 LINES
	MOVE	T1,(P)		;GET DN60 NUMBER
	MOVEM	N,M.0D60(T1)	;SAVE LINES IN PROPER PORT LOC
	POP	P,(P)		;CLEAN STACK
	POPJ	P,		;EXIT

ASK60D:	FILOUT	<M.DN6K==:0@>	;NO DN60 DEVICES ON KMC/DUP-11S
	FILOUT	<M.DN6R==:0@>	;NO DN60 DEVICES ON DMRS
	FILOUT	<M.DN60==:*@>,M.DN60 ;DUMP COUNT OF GENERIC DN60 DEVICES
ASKDUP:	SETZ	P1,			;ASSUME NO DUP-11S
	SKIPN	M.KS10
	JRST	DUPEND
	MOVEI	N,SM.KDUP		;MAXIMUM NUMBER OF DUP-11S
	ASKDEC	<Number of KMC/DUP Lines (0,0-*) [
Respond with the number of DUP11 synchronous line units attached to a KMC11 
controller.]>,N
	FILOUT	<M.KDUP==:*@>,N
	SETZB	I,M.DN6K		;START AT DUP NUMBER 0
	JUMPE	N,ASKDMR		;IF NO KMCS, JUST SEE ABOUT DMRS
	MOVE	P1,N			;COPY NUMBER OF DUP-11S
KSDUP0:	CAML	I,P1			;ARE WE STILL IN RANGE?
	JRST	DUPEND			;NO, WRITE OUT ACCUMULATED STUFF
	MOVE	N,I			;Copy to where it will find it
	ASKLST	<Type of line for KDP* (ANF10,DECNET,USER,IBM) [
This question is asked for each KDP (KMC/DUP line) indicated in the 
previous question.  Type the name of the network product that the line 
will support.]>

D60SZ:	CAIN	N,4-1			;IS THIS AN IBM LINE?
	AOS	M.DN6K			;NOTE THAT WE HAVE A DN60 LINE
	AOS	P2,N			;BUMP TO MAKE DD.XXX SYMBOL
	FILOUT	<M.*KDP==:>,I		;OUTPUT SYMBOL
	FILOUT	<*@>,P2			;OUTPUT VALUE FOR THE SYMBOL
	AOJA	I,KSDUP0		;GO TRY FOR THE NEXT LINE

DUPEND:	MOVEM	P1,M.KDPN		;SAVE NUMBER OF KDPS
ASKDMR:	SETZM	M.DN6R			;NO DMR IBMCOMM...YET
	SETZ	N,			;ASSUME NONE
	SKIPN	M.KS10
	JRST	ASKIBM
	SKIPN	UNAUTC
	JRST	NODMRS			;NO
	MOVEI	N,SM.DMRN		;MAXIMUM NUMBER OF DMR11S
	ASKDEC	<Number of DMR11 Lines (0,0-*) [
Respond with the number of DMR11 synchronous line controllers.]>,N

NODMRS:	FILOUT	<M.DMRN==:*@>,N
	ADD	P1,N			;GET TOTAL COMM LINES
	JUMPE	P1,KSGEN2		;IF NONE, TURN OF DN60, DECNET
	MOVE	P1,N			;SAVE NUMBER OF DMRs
	MOVEM	P1,M.DMRN		;SAVE NUMBER OF DMRS
	SETZ	I,			;START WITH DMR0
KSGENR:	CAML	I,P1			;DONE WITH ALL DMRs?
	 JRST	ASKIBM			;YES
	MOVE	N,I			;GET CURRENT DMR NUMBER
	ASKLST	< DMR* line type (ANF10,DECNET,USER,IBM) [
Type the name of the network product that the line will support.]>
	CAIN	N,4-1			;IS THIS AN IBM LINE?
	AOS	M.DN6R			;NOTE THAT WE HAVE A DN60 LINE
	AOS	P2,N			;BUMP TO MAKE DD.XXX SYMBOL
	FILOUT	<M.*DMR==:>,I		;OUTPUT SYMBOL
	FILOUT	<*@>,P2			;OUTPUT VALUE FOR THE SYMBOL
	MOVE	N,I			;GET CURRENT DMR NUMBER
	ASKYN	< DMR* switched line (YES,NO) [
Does DMR* control a switched (dial-up) line?]>,N
	EXCH	I,N			;NEED TO OUTPUT DMR #
	FILOUT	<DMR*SW==:>,N
	EXCH	I,N			;RESTORE RESPONSE
	FILOUT	<*@>,N
	JUMPE	N,KSGENX		;IF NOT, SKIP REST
	MOVE	N,I
	ASKYN	< DMR* half duplex (YES,NO) [
Does DMR* control a half duplex line?]>,N
	EXCH	I,N
	FILOUT	<DMR*HD==:>,N
	EXCH	I,N
	FILOUT	<*@>,N
	JUMPE	N,KSGENX		;IF NOT, LONG START IS MEANINGLESS
	MOVE	N,I
	ASKYN	< Is DMR* secondary (YES,NO) [
Exactly one end of this link should be a secondary station.  Secondary 
status controls link startup only.]>,N
	EXCH	I,N
	FILOUT	<DMR*LS==:>,N
	EXCH	I,N
	FILOUT	<*@>,N
KSGENX:	TTYOUT	<@>			;SEPERATE DMRS
	AOJA	I,KSGENR		;LOOP FOR NEXT
ASKIBM:	SKIPN	M.KS10
	JRST	IBMEND
	MOVE	T1,M.DN6K		;GET COUNT OF IBMCOM DEVICES
	ADD	T1,M.DN6R		;ADD IN DMR STYLE DN22S
	ADDM	T1,M.DN60		;ACCUMULATE
	SKIPN	M.DN60			;IF SOME LINE WANTED IBMCOMM
	JRST	ASKIB1			;NO
	ASKYN	<Load IBM communications software (YES,NO) [
Do you want to load the IBM communications software?  IBMCOM allows a KDP 
or DMR to talk to a DN22 IBM communications front-end.]>,N
	SKIPE	M.KDPN			;IF KDPS, CONSIDER
	ADDM	N,M.DN6K		; THAT D6KINT WANTED
	SKIPE	M.DMRN			;IF DMRS, CONSIDER
	ADDM	N,M.DN6R		; THAT D6RINT IS WANTED
	MOVE	T1,M.DN6K		;NUMBER OF KDP IBM LINES
	ADD	T1,M.DN6R		;GET TOTAL NUMBER OF COMM LINES
	MOVEM	T1,M.DN60		;THIS IS HOW MANY IBM LINES WE WANT

ASKIB1:	FILOUT	<M.DN60==:*@>,M.DN60	;TELL COMNET ABOUT IBMCOM
	FILOUT	<M.DN6K==:*@>,M.DN6K	;LOAD D6KINT??
	FILOUT	<M.DN6R==:*@>,M.DN6R	;LOAD D6RINT??
	JRST	IBMEND

KSGEN2:	FILOUT	<M.DECN==:0@>		;SAY NO DECNET CODE
	FILOUT	<M.DN60==:0@>		;NO IBM CODE
	FILOUT	<M.DN6K==:0@>
	FILOUT	<M.DN6R==:0@>
IBMEND:
ASK87:	SETZM	M.0D85		;CLEAR OUT FIRST WORD
	MOVE	T1,[M.0D85,,M.0D85+1] ;XFER VECTOR
	BLT	T1,M.7D85	;CLEAR DL10 PORT INFO FOR NON-ZERO CPU
	SKIPN	M.KL10		;KL10?
	JRST	ASK85B		;NO
	SKIPE	UNAUTC
	SKIPE	CPUN
	JRST	ASK85B		;NONE
	ASKDEC	<Number of DC75NPs or DN87s on CPU* (0,0-8) [
The DC75NP and DN87S are network front-ends connected to DL10s.]>
	MOVEM	N,M.DC75	;store number of 75/87s
	FILOUT	<M.DC75==:*@>,M.DC75
	SKIPN	M.DC75		;ask which ports if non-zero
	JRST	ASK85B		;if none, write out symbols as zeros
	MOVEI	P1,1		;Start numbering FEs with 1
;	SETZ	P2,		;P2=0 SAYS DL10 INTERFACE
ASK85A:	PUSHJ	P,ASK85S	;ask which port
	ADDI	P1,1		;increment counter
	SOSE	M.DC75		;are we done?
	JRST	ASK85A		;no, continue
	JRST	ASK85B		;yes, write out symbols
ASK85S:	MOVE	N,P1		;GET FRONT END #
	TTYOCT	<For front end number *:@>;identify which PDP11
;	JUMPN	P2,ASK851	;DO RIGHT MESSAGE FOR DL10/DTE-20
	ASKDEC	<To which DL10 port is the DC75NP or DN87 connected (0,0-7) [
Each DC75NP or DN87S is connected to a DL10 port.  DL10 number 1 connects 
ports 0 through 3, DL10 number 2 connects ports 4 through 7.]>;ask port
;	JRST	ASK852		;SKIP DTE-20 QUESTION

;ASK851: ASKDEC	<To which DTE20 is the DN87S connected (1,1-3)>
ASK852:	MOVE	T1,N		;use answer as index
	MOVEI	N,1		;value to set word M.nD85 to
	MOVEM	N,M.0D85(T1)	;set word to 1 indicating port in use as 85
	POPJ	P,		;return
ASK85B:	FILCPU	<M.0D85==:*@>,M.0D85 ;OUTPUT ALL SYMBOLS
	FILCPU	<M.1D85==:*@>,M.1D85
	FILCPU	<M.2D85==:*@>,M.2D85
	FILCPU	<M.3D85==:*@>,M.3D85
	FILCPU	<M.4D85==:*@>,M.4D85
	FILCPU	<M.5D85==:*@>,M.5D85
	FILCPU	<M.6D85==:*@>,M.6D85
	FILCPU	<M.7D85==:*@>,M.7D85
	JRST	ASKDEV
DEVEND:	FILOUT	<M.TD10==:*@>,DTA
	FILOUT	<M.DAS78==:*@>,M.DAS78
	FILOUT	<M.XXI==:*@>,M.D78L
	FILOUT	<M.XXO==:*@>,M.D78L
	FILOUT	<M.RX20==:*@>,RX20

ASKPTY:	MOVEI	N,SM.RTY	;MAXIMUM NUMBER OF ALLOCATABLE TTYS
	SUB	N,M.TLTL	;KNOCK OFF LOCAL LINES
	SUB	N,M.CPU		;ONE PER CTY
	SOJ	N,		;FRCLIN
	SKIPE	M.KS10		;IF A KS,
	SUB	N,M.CPU		;ACCOUNT FOR KLINIK LINE(S)
	SUB	N,M.XTL		;DISCOUNT DA28 TERMINALS
	MOVEM	N,MAXRTY	;SAVE FOR NETGEN
	ASKDEC	<Number of PTYs (20,1-*) [
A PTY is a pseudo-terminal.  OPSER subjobs and batch jobs use PTYs for I/O.  
Each operator service program and batch stream needs at least one PTY.  You 
must include at least one PTY for your monitor.  Respond with the number of 
pseudo-terminals that your monitor must support.]>
	FILOUT	<M.PTY==:*@>,N
	MOVNS	N		;NEGATE
	ADDM	N,MAXRTY	;KEEP THIS COUNTER UP-TO-DATE
ASKNET:	SETZM	STANAM		;CLEAR OUT STATION NAME
	ASKYN	<@Network software (YES,NO) [
Do you want to include support for communications with other Digital 
operating systems?]>
	FILOUT	<M.NET==:*@>
	JUMPE	N,NETEND
	PUSHJ	P,ASKNOD	;GET THE NODE NAME
	MOVEM	N,STANAM	;SAVE
	FILOUT	<M.SNAM==:<SIXBIT &*&>@>,N

	MOVE	N,MAXRTY	;MAX REMOTE TTYS AVAILABLE
	ASKDEC	<Number of remote TTYs (*,0-*) [
Respond with the maximum number of terminals from remote nodes to be 
handled at any one time.]>,N
	MOVEM	N,M.RTTY	;REMEMBER FOR LATER TESTING
	FILOUT	<M.RTTY==:*@>,N
	JRST	ASKANF		;ONWARD


;ROUTINES TO ASK FOR A NODE NAME
ASKNOD:	ASKSTR	<Node name [
The name may one to six characters in length.]>
	PUSHJ	P,ASKNO1	;GET A NODE NAME
	  AOJA	LV,ASKNOD	;TRY AGAIN WITH MORE HELP
	JUMPN	N,CPOPJ		;ALL IS OK IF NON-NULL
	TTYOUT	<? Must not be null.@>
	AOJA	LV,ASKNOD	;TRY AGAIN TO GET A GOOD NAME

ASKNOX:	MOVE	N,STANAM	;LOAD UP THE DEFAULT
	ASKSTR	<  Node name (*) [
Provide a node name, independent of that used as the system-wide node name.  
The name can be one to six characters in length.  DECnet-10, Version 4 
requires that the first character of the node name be an alphabetic 
character.  The same node name will be used for both ANF-10 and DECnet-10 
communications.]>
	PUSHJ	P,ASKNO1	;GET A NODE NAME
	  AOJA	LV,ASKNOX	;TRY AGAIN WITH MORE HELP
	POPJ	P,		;WON'T BE NULL BY NOW

ASKNO1:	CAILE	N,^D6		;CORRECT NUMBER?
	RJRST	<TTYOUT		<? More than 6 characters.@>
		POPJ	P,>
	PUSHJ	P,GETWRD	;GET SIXBIT QUANTITY
	SKIPN	N,WD		;COPY TO A BETTER PLACE
	MOVE	N,STANAM	;DEFAULT PROPERLY
	JRST	CPOPJ1		;SKIP RETURN ON SUCCESS
ASKANF:	ASKYN	<@ANF-10 software (YES,NO) [
Answer YES if you want to load the monitor modules needed to communicate 
with ANF-10 hosts and remote stations.]>
	FILOUT	<M.ANF==:*@>,N
	JUMPE	N,ASKDCN

	PUSHJ	P,ASKNOX	;ASK FOR ANF-10 STATION NAME
	FILOUT	<M.ANAM==:<SIXBIT &*&>@>,N

	ASKOCT	<  Node number of central site (1,1-77) [
Provide a unique octal number to identify the system to the ANF network.]>
	FILOUT	<M.ANUM==:*@>,N

	SKIPN	N,M.RTTY	;ALLOWING ANY TTY CONNECTS?
	JRST	ANFMC0		;NO, CAN'T ALLOW ANF TTY CONNECTS
	ASKYN	<  Remote terminals (YES,NO) [
Answer YES if you want to include code to allow remote terminals to "SET 
HOST" to this system.]>
ANFMC0:	FILOUT	<M.RMCR==:*@>,N
	JUMPE	N,ANFVT0

	ASKYN	<  Virtual terminals (YES,NO) [
Answer YES if you want to include code to allow local terminals to "SET 
HOST" to other systems.]>,N
ANFVT0:	FILOUT	<M.RVTM==:*@>,N

	ASKYN	<  Remote card readers (YES,NO) [
Answer YES if you want to include code to allow access to card readers on 
ANF remote stations.]>,N
	FILOUT	<M.RCDR==:*@>,N

	ASKYN	<  Remote line printers (YES,NO) [
Answer YES  if you want to include code to allow access to line printers on 
ANF remote stations.]>,N
	FILOUT	<M.RLPT==:*@>,N

ANFPTP:	ASKLST	<  Remote paper tape punches (NO,YES) [
Answer NO to exclude code to allow access to paper tape punches on ANF 
remote stations.]>,N
	FILOUT	<M.RPTP==:*@>,N

ANFPTR:	ASKLST	<  Remote paper tape readers (NO,YES) [
Answer NO to exclude code to allow access to paper tape readers on ANF
remote stations.]>,N
	FILOUT	<M.RPTR==:*@>,N

ANFPLT:	ASKLST	<  Remote plotters (NO,YES) [
Answer NO to exclude code to allow access to plotters on ANF remote 
stations.]>,N
	FILOUT	<M.RPLT==:*@>,N

ANFDDP:	ASKYN	<  Remote DN8x DDCMP devices (YES,NO) [
Answer NO to exclude code to allow access to DN8x LBLK-to-DDCMP devices on 
ANF remote stations.]>,N
	FILOUT	<M.RDDP==:*@>,N
	ASKYN	<  Remote data entry terminals (YES,NO) [
Answer YES to include code to allow access to remote data entry terminals 
(RDX devices).]>,N
	FILOUT	<M.RDX==:*@>,N

	ASKYN	<  Remote task-to-task (YES,NO) [
Answer YES to include code to allow access to remote jobs.  The TSKSER 
module enables ANF-10 intertask communication.]>,N
	FILOUT	<M.RJOB==:*@>,N

	MOVEI	N,SM.CONN/2	;DEFAULT TO HALF THE MAX.
	ASKDEC	<  Number of connects (*,1-512) [
Respond with the maximum number of simultaneous connections allowed.]>,N
	FILOUT	<M.CONN==:*@>
ASKDCN:	ASKYN	<@DECnet software (YES,NO) [
Answer YES if you want to load the monitor modules needed to communicate 
with other DECnet nodes.]>
	FILOUT	<M.DECN==:*@>,N
	JUMPE	N,ASKLAT	;NO, SKIP OVER ALL THIS STUFF

	PUSHJ	P,ASKNOX	;ASK FOR DECNET NODE NAME
	FILOUT	<M.DNAM==:<SIXBIT &*&>@>,N

	ASKDEC	<  Area number of central site (1,1-63) [
Provide a decimal area number for multi-area DECnet network configurations.]>
	FILOUT	<M.DHOM==:*@>,N

	ASKDEC	<  Node number of central site (1,1-1023) [
Provide a unique decimal number to identify this system to other nodes in 
the DECnet network.]>
	FILOUT	<M.DNUM==:*@>,N

	ASKLST	<  Router type (ROUTING,NONROUTING) [
Specify router type.  ROUTING nodes can have multiple circuits and perform 
DECnet routing.  NONROUTING nodes have only an ethernet circuit and perform 
no DECnet routing.
    If you have a KL and want to communicate with a Multifunctions 
Communications Base (MCB), or if you have a KS, answer this question with 
ROUTING.]>
	ADDI	N,4		;CONVERT TO VALUES 4(ROUTING) AND 5(NONROUTING)
	FILOUT	<M.DRTY==:*@>,N

ASKXPW:	ASKSTR	<  Transmit password (DECNET20) [
The transmit password is used when initializing a point-to-point KDP, DTE, 
or DMR link.  You may provide a password of 64 characters or less, or press 
RETURN to accept the default password.]>
	JUMPE	CH,ASKNRT	;SKIP THE MACRO IF DEFAULTING
	CAILE	N,^D64		;64 OR LESS?
	RJRST	<TTYOUT <? More than 64 characters@>
		 JRST	ASKXPW>
	MOVSI	N,'*  '		;IN CASE "*" IS IN PASSWORD
	FILSTR	<DEFINE	%RTXPW<RTRPW <*>>@>

ASKNRT:	SKIPN	N,M.RTTY	;ALLOWING REMOTE TTYS?
	JRST	NRTNON		;NO, CAN'T LOAD NRTSER
	ASKYN	<  Remote terminals (YES,NO) [
Answer YES to include code that allows incoming jobs using DECnet 
connections. The module loaded will be NRTSER.]>
NRTNON:	FILOUT	<M.DNVT==:*@>,N
ASKLAT:	SKIPE	N,M.ENET	;HAVE ETHERNET?
	SKIPN	N,M.RTTY	;ALLOWING REMOTE TTYS?
	JRST	LATNT0		;NO, CAN'T HAVE LATSER
	ASKYN	<@LAT software (YES,NO) [
Answer YES if you want to communicate with Local Area Terminal 
concentrators using Ethernet.  The module loaded will be LATSER.]>
LATNT0:	FILOUT	<M.LAT==:*@>,N
	JUMPE	N,NETEND	;JUMP IF NO LAT WANTED

	PUSHJ	P,ASKNOX	;YES, GET A 'NODE' (SERVICE) NAME
	FILOUT	<M.LNAM==:<SIXBIT &*&>@>,N	;PUT IT IN THE FILE

	MOVEI	N,SM.LMC	;MAXIMUM NUMBER OF SIMULTANEOUS CIRCUITS
	ASKDEC	<  Number of circuits (20,1-*) [
Provide the maximum number of simultaneous LAT circuits required by your 
system.  One is required for each active LAT server.]>,N
	FILOUT	<M.LAMC==:*@>

ASKGRP:	ASKSTR	<  Service groups [
Provide the list of LAT service groups to be enabled by default at system 
start-up time.  If the list is empty, no service groups will be enabled.  
List entries in the form:
	
	3,4-7,9,12-14,...
	
LAT group numbers must be listed in ascending order, may include a range of
numbers, and each entry must be separated from the next with a comma.  The 
range of valid service group numbers is 0 through 255.]>
	JUMPE	CH,ASKGR3	;DEFINE EMPTY MACRO IF NO GROUPS TO BE ENABLED
ASKGR1:	PUSHJ	P,GETDEC	;READ A DECIMAL SERVICE GROUP
	JUMPL	N,GRPERR	;MUST BE POSITIVE
	CAILE	N,^D255		;AND .LE. 255
	JRST	GRPERR		;RANGE ERROR
	CAIE	CH,"-"		;IS THIS FOR A RANGE?
	JRST	ASKGR2		;NO
	PUSH	P,N		;YES, SAVE CURRENT VALUE
	PUSHJ	P,GETDEC	;GET NEXT VALUE
	POP	P,T1		;RESTORE PREVIOUS
	CAIL	N,0		;MUST BE IN RANGE
	CAILE	N,^D255		;OF 0-255
	JRST	GRPERR		;RANGE ERROR IF NOT
	CAML	T1,N		;MAKE SURE OF ASCENDING ORDER
	JRST	GRPER1		;COMPLAIN IF NOT
ASKGR2:	JUMPE	CH,ASKGR3	;ALL OK AT EOL
	CAIN	CH,","		;WAS BREAK A COMMA?
	JRST	ASKGR1		;YES, LOOP FOR NEXT
	JRST	GRPER1		;NO, COMPLAIN AND RE-ASK

GRPERR:	TTYOUT	<? LAT service groups range only from 0 through 255.@>
	AOJA	LV,ASKGRP
GRPER1:	TTYOUT	<? Invalid list format@>
	AOJA	LV,ASKGRP

ASKGR3:	FILOUT	<DEFINE	SPCGRP>	;START MACRO DEFINITION
	PUSHJ	P,FILLAB	;OPEN MACRO BODY
	MOVE	B,[POINT 7,ASCSTR]	;RESET BYTE POINTER
	PUSHJ	P,SKBLNK	;SKIP OVER BLANKS
	JUMPE	CH,GRPEND	;FINISH OFF AT EOL
	FILOUT	<LATGRP	>	;SUB-MACRO
	MOVEI	CH,"<"		;BRACKET CALL FOR IRP
	PUSHJ	P,FILPUT	; ...
	MOVE	B,[POINT 7,ASCSTR]	;RESET BYTE POINTER FOR GETDEC
ASKGR4:	PUSHJ	P,GETDEC	;READ IN A GROUP NUMBER
	CAIN	CH,"-"		;IS THIS A RANGE?
	JRST	ASKGR6		;YES, HANDLE DIFFERENTLY
	PUSH	P,CH		;NO, SAVE BREAK
	FILDEC	<*>,N		;DUMP ANOTHER GROUP
ASKGR5:	POP	P,CH		;RESTORE BREAK
	JUMPE	CH,ASKGR7	;EOL MEANS END CALL
	PUSHJ	P,FILPUT	;STUFF THE COMMA
	JRST	ASKGR4		;LOOP OVER ALL GROUPS
ASKGR6:	MOVEI	CH,"<"		;GROUP THE RANGE ARG
	PUSHJ	P,FILPUT	;FOR COMDEV
	FILDEC	<*,>,N		;FIRST NUMBER AND COMMA FOR SECOND
	PUSHJ	P,GETDEC	;GET SECOND NUMBER IN RANGE
	PUSH	P,CH		;SAVE THE BREAK
	FILDEC	<*>,N		;PUT OUT THE NUMBER
	MOVEI	CH,">"		;END BROCKET
	PUSHJ	P,FILPUT	;TO END THE RANGE ARGUMENT
	JRST	ASKGR5		;COMMON CODE TO TEST FOR END
ASKGR7:	PUSHJ	P,FILRAB	;DUMP THE ">" TO END THE CALL TO LATGRP

GRPEND:	PUSHJ	P,FILRAB	;END THE DEFINE OF SPCGRP
	MOVE	LV,SAVLV	;RESTORE PERMANENT HELP LEVEL
;	JRST	NETEND

NETEND:
ASKDSY:	FILOUT	<@RADIX	10@>;	;SET RADIX TO DECIMAL IN FILE
	BTHOUT	<@Decimal "symbol,value" [
For any decimal symbols to be defined, type one "symbol,value" pair per 
line and terminate the list with an extra carriage return.  The symbols and 
values that you enter here are those that deviate from the defaults defined 
in the distributed common modules (COMMON, COMDEV, and COMMOD).  The radix 
is set automatically for each symbol, in accordance with the radix 
specified in the question.  (In this case, decimal.  You will be given the 
opportunity to change the values for symbols with octal and SIXBIT values 
in the questions that follow.)  For example, to increase the length of a 
memory cycle from 1,000 nanoseconds to 1,760 nanoseconds, 
type:
	
     NSPMEM,1760
	
followed by a carriage return.  Unless you specify otherwise, the symbols 
will be defined with the default values.  If the default values are 
acceptable, press RETURN in response to this question.]@>
DSYLOP:	TLO	F,(F.BANG!F.NEG) ;ALLOW "!" IN EXPRESSIONS AND NEGATIVE VALUES
	PUSHJ	P,TTYIN		;GET NEXT LINE
	  JRST	ASKDSY		;/HELP TYPED, ASK AT PROPER HELP MODE
	JUMPE	CH,DSYEND	;JUST A CR?
	PUSHJ	P,GETWRD	;GET FIRST WORD
	CAIE	CH,","		;IS IT FOLLOWED BY ,
	JRST	DSYERR		;NO, ERROR
	MOVE	CH,B		;COPY PLACE IN LINE
	ILDB	CH,CH		;GET NEXT CHAR
	CAIE	CH,"<"		;AN EXPRESSION? (>)
	 JRST	DSYDEC		;NO, CONTINUE NORMALLY
	PUSHJ	P,WIGEXP	;YES, GET A WIDGETED EXPRESSION
	 JRST	DSYERR		;OOPS.
	JRST	DSYLOP		;OK, STORE THE MESS
DSYDEC:	PUSHJ	P,GETDEC	;GET SECOND WORD AS DECIMAL
	JUMPN	CH,DSYERR	;IS IT LAST WORD ON LINE?
DSYPUT:	FILSTR	<XP *@>;	;YES, WRITE IT OUT
	JRST	DSYLOP		;LOOP BACK FOR NEXT LINE

DSYERR:	TTYOUT	<? Not symbol,value@>
	AOJA	LV,ASKDSY	;TRY AGAIN

DSYEND:	FILOUT	<RADIX	8@>;	;SET RADIX BACK TO NORMAL IN FILE
	MOVE	LV,SAVLV	;RESTORE PERMANENT HELP LEVEL
				; IN CASE HE TYPED /H<CR>


ASKOSY:	BTHOUT	<@Octal "symbol,value" [
For any octal symbols to be defined, type one "symbol,value" pair per line 
and terminate the list with an extra carriage return.  For example, to 
change the standard magtape density from 6250 bits per inch (BPI) to 1600, 
type:
	
     STDENS,4
	
followed by a carriage return.  In this example, 1 = 200 BPI, 2 = 556 BPI, 
3 = 800 BPI, and 5 = 6250  BPI.  If the default values are acceptable, 
press RETURN in response to this question.]@>
OSYLOP:	TLO	F,(F.BANG!F.NEG) ;ALLOW "!" IN EXPRESSIONS AND NEGATIVE VALUES
	PUSHJ	P,TTYIN		;GET NEXT LINE FOR USER
	  JRST	ASKOSY		;/HELP TYPED, ASK IN DESIRED HELP MODE
	JUMPE	CH,OSYEND	;JUST A BLANK LINE?
	PUSHJ	P,GETWRD	;NO, GET FIRST WORD
	CAIE	CH,","		;IS BREAK A COMMA?
	JRST	OSYERR		;NO, ERROR
	MOVE	CH,B		;COPY PLACE IN LINE
	ILDB	CH,CH		;GET NEXT CHAR
	CAIE	CH,"<"		;AN EXPRESSION? (>)
	 JRST	OSYOCT		;NO, CONTINUE NORMALLY
	PUSHJ	P,WIGEXP	;YES, GET A WIDGETED EXPRESSION
	 JRST	OSYERR		;OOPS.
	JRST	OSYLOP		;OK, STORE THE MESS
OSYOCT:	PUSHJ	P,GETOCT	;YES, GET VALUE IN OCTAL
	JUMPN	CH,OSYERR	;IS THIS END OF LINE?
OSYPUT:	FILSTR	<XP *@>		;YES, WRITE IT OUT
	JRST	OSYLOP		;LOOP BACK FOR MORE

OSYERR:	TTYOUT	<? Not symbol,value@>
	AOJA	LV,ASKOSY	;GO TRY AGAIN
;HELPER ROUTINE FOR DECIMAL AND OCTAL INPUT TO PROCESS EXPRESSIONS
;
;CALL KNOWING THAT THE NEXT CHAR IS A LEFT WIDGET
;
;RETURN: CPOPJ IF ERROR, CPOPJ1 IF OK

WIGEXP:	SETZ	I,		;AT LEVEL ZERO
WIGEX0:	ILDB	CH,B		;GET NEXT WIDGET
	JUMPE	CH,CPOPJ	;END OF LINE, ERROR
	CAIN	CH,"<"		;OPEN WIDGET
	 AOJA	I,WIGEX0	;YES, COUNT DEEPER (ALWAYS FIRST CHAR)
	CAIE	CH,">"		;CLOSE WIDGET?
	 JRST	WIGEX0		;NO, JUST WALK ALONG
	SOJG	I,WIGEX0	;YES, LESS DEEP.  CONTINUE IF NOT LAST ONE
	PUSHJ	P,SKBLNK	;SKIP TRAILING BLANKS
	JUMPN	CH,CPOPJ	;RETURN IF NOT AT EOL
	MOVSI	N,'*  '		;IF EXPRESSION MULTIPLIES, INCLUDE IT
	FILSTR	<XP *@>		;WRITE OUT THE ANSWER
	JRST	CPOPJ1		;SUCCESS

OSYEND:	MOVE	LV,SAVLV	;RESTORE PERMANENT HELP LEVEL
				; IN CASE HE TYPED /H<CR>

ASKSSY:	BTHOUT	<@SIXBIT "symbol,value" [
For any SIXBIT symbol to be defined, type one "symbol,value" pair per line 
and terminate the list with an extra carriage return.  For example, to 
change the name of the mail program from MS to PO, type:
	
     M.MAIL,PO
	
followed by a carriage return.   If the default values are acceptable, 
press RETURN in response to this question.]@>
SSYLOP:	PUSHJ	P,TTYIN		;GET NEXT LINE
	  JRST	ASKSSY		;/HELP TYPED, ASK IN PROPER MODE
	JUMPE	CH,SSYEND	;CARRIAGE RETURN?
	PUSH	P,B		;SAVE BYTE POINTER TO STRING
	PUSHJ	P,GETWRD	;GET FIRST WORD
	CAIE	CH,","		;IS BREAK A COMMA?
	JRST	SSYERR		;NO, ERROR
	PUSHJ	P,GETWRD	;GET SECOND WORD
	JUMPN	CH,SSYERR	;ERROR IF MORE TYPE-IN
	POP	P,B		;RESTORE BYTE POINTER
	PUSHJ	P,GETWRD	;GET FIRST WORD AGAIN
	FILOUT	<*==:>,WD	;OUTPUT FIRST WORD
	PUSHJ	P,GETWRD	;GET SECOND WORD
	FILOUT	<<SIXBIT/*/>@>,WD	;OUTPUT SIXBIT VALUE
	JRST	SSYLOP		;AND LOOK FOR MORE

SSYERR:	POP	P,B		;RESTORE PDL
	TTYOUT	<? Not symbol,value@>
	AOJA	LV,ASKSSY	;GO TRY AGAIN

SSYEND:	MOVE	LV,SAVLV	;RESTORE PERMANENT HELP LEVEL
				; IN CASE USER TYPED /H<CR>
ASKSP1:	FILOUT	<@DEFINE	SPCINT>
	PUSHJ	P,FILLAB	;LEFT ANGLE BRACKET,CRLF TO FILE
ASKS1A:	BTHOUT	<@Type "device-mnemonic,PI-channel" for special devices [
This question allows you to build the monitor to support a device driver 
that is not part of the standard monitor.  Type the device name and the 
priority-interrupt channel for a device driver that does not save the ACs 
on a priority interrupt, and that does not require Device Data Blocks 
(DDBs) in the monitor.  A driver of this type can support only one device.
The device mnemonic must be 3 characters or less in length.  Type an extra 
carriage return when through.]@>
SP1LOP:	PUSHJ	P,GETDPI	;GET NEXT LINE AND SCAN FOR DEV:PI
	  AOJA	LV,ASKS1A	;ERROR OR /HELP
	JUMPE	WD,SP1END	;JUST CR TYPED?
	RJUMPN	CH,<TTYOUT <? Not device-mnemonic,PI-channel@>
		AOJA	LV,ASKS1A>  ;GO ASK FOR MORE
	FILSTR	<SPASGINT *@>;	;OUTPUT ANSWER TO FILE
	JRST SP1LOP		;GO GET ANOTHER LINE

SP1END:	PUSHJ	P,FILRAB	;RIGHT ANGLE BRACKET,CRLF TO FILE
	MOVE	LV,SAVLV	;RESTORE PERMANENT HELP LEVEL
				; IN CASE HE TYPED /H<CR>


ASKSP2:	FILOUT	<@DEFINE	SPCDDB>	;START MACRO DEFINITION
	PUSHJ	P,FILLAB	;LEFT ANGLE BRACKET,CRLF TO FILE
ASKS2A:	BTHOUT	<@Type "device-mnemonic,PI-channel,no.-of-devices" [
This question allows you to define a device driver that requires Device 
Data Blocks (DDBs) and will support multiple devices.  Specify the device 
name,  priority-interrupt channel, and number of devices to be supported.
The device-mnemonic must be 3 characters or less in length.  Type an extra 
carriage return when through.]@>
SP2LOP:	PUSHJ	P,GETDPI	;GET NEXT LINE, AND SCAN FOR DEV:PI
	  AOJA	LV,ASKS2A	;/HELP OR ERROR, REASK QUESTION
	JUMPE	WD,SP2END	;JUST CR TYPED?
	CAIE	CH,","		;IS BREAK A COMMA?
	JRST	SP2ERR		;END OF LINE TOO SOON?
	PUSHJ	P,GETDEC	;GET NO. OF DEVICES
	JUMPN	CH,SP2ERR	;IS THIS LAST WORD ON LINE?
	FILSTR	<SPASGDDB *@>;	;YES, OUTPUT TRIPLE
	JRST	SP2LOP		;GO GET ANOTHER LINE

SP2ERR:	TTYOUT	<? Not device-mnemonic,PI-channel, no.-of-devices@>
	AOJA	LV,ASKS2A	;GO GET MORE

SP2END:	PUSHJ	P,FILRAB	;RIGHT ANGLE BRACKET,CRLF TO FILE
	MOVE	LV,SAVLV	;RESTORE PERMANENT HELP LEVEL
				; IN CASE HE TYPED /H<CR>
ASKSP3:	FILOUT	<@DEFINE	SPCSAV>	;START MACRO DEFINITION
	PUSHJ	P,FILLAB	;LEFT ANGLE BRACKET,CRLF
ASKS3A:	BTHOUT	<@Type "device-mnemonic,PI-channel,highest-ac-to-save" [
This question allows you to define device drivers that include a channel 
save routine to save ACs up to the "highest AC to save".  Specify the 
device name, priority-interrupt channel, and the number of the highest AC 
to save on an interrupt.  The device-mnemonic must be 3 characters or less 
in length.  Type extra carriage return when through.]@>
SP3LOP:	PUSHJ	P,GETDPI	;GET NEXT LINE AND SCAN FOR DSK:PI
	  AOJA	LV,ASKS3A	;/HELP OR ERROR, REASK QUESTION
	JUMPE	WD,SP3END	;JUST CR TYPED?
	CAIE	CH,","		;IS BREAK AFTER PI A COMMA?
	JRST	SP3ERR		;NO, ERROR
	PUSHJ	P,GETOCT	;GET HIGHEST AC TO SAVE
	JUMPN	CH,SP3ERR	;IS THIS LAST ITEM ON LINE?
	CAILE	N,SM.AC		;SKIP IF LEGAL AC
	RJRST	<MOVEI	N,SM.AC
		TTYOCT	<? Highest-ac-to-save must be * or less@>
		AOJA	LV,ASKS3A>
	FILSTR	<SPASGSAV *@>;	;OUTPUT TRIPLE TO FILE
	JRST	SP3LOP		;GO GET NEXT LINE

SP3ERR:	TTYOUT	<? Not device-mnemonic,PI-channel,highest-ac-to-save@>
	AOJA	LV,ASKS3A	;GO ASK  FOR MORE
SP3END:	PUSHJ	P,FILRAB	;FILL IN A RIGHT ANGLE BRACKET
	MOVE	LV,SAVLV	;RESTORE PERMANENT PROMP LEVEL IN CASE /HELP


ASKEDN:	FILOUT	<@DEFINE	SPCEDN>	;START MACRO DEFINITION
	PUSHJ	P,FILLAB	;ADD LEFT ANGLE BRACKET
ASKEDA:	BTHOUT	<@Type "ersatz-device,P,Pn,search-list-type" [
This question allows you to define your own ersatz device names.  
Monitor-standard ersatz device names must not be redefined.  To create 
additional site-specific ersatz device names, type a device name in exactly 
3 characters, the Project,Programmer Number (P,PN) associated with the 
device, and which search list to use (either ALL, SYS, or JOB) and press 
RETURN.  You may define another ersatz device, or press RETURN again to 
finish.]@>
EDNLOP:	PUSHJ	P,TTYIN		;GET NEXT INPUT LINE
	  AOJA	LV,ASKEDA	;/HELP OR ERROR
	JUMPE	CH,EDNEND	;ALL DONE
	PUSHJ	P,GETWRD	;GET ERSATZ DEVICE NAME
	CAIE	CH,","		;BREAK ON COMMA
	JRST	EDNER1		;NO, COMMAND ERROR
	TRNN	WD,770000	;MUST BE EXACTLY 3 CHARACTERS
	TLNN	WD,77		;...
	JRST	EDNER1		;ISN'T, GIVE ERROR
	PUSHJ	P,GETOCT	;GET PROJECT NUMBER
	CAIE	CH,","		;BREAKON COMMA
	JRST	EDNER1		;NO, COMMAND ERROR
	PUSHJ	P,GETOCT	;GET PROGRAMMER NUMBER
	CAIE	CH,","		;BREAKON COMMA
	JRST	EDNER1		;NO, COMMAND ERROR
	PUSHJ	P,GETWRD	;GET SEARCH LIST TYPE
	JUMPN	CH,EDNER1	;NOW THAT MUST BE THE LAST
	CAME	WD,[SIXBIT/ALL/] ;CHECK CHOICES
	CAMN	WD,[SIXBIT/SYS/] ;...
	JRST	EDNLO1		;OK, GO WRITE FILE
	CAME	WD,[SIXBIT/JOB/] ;LAST CHANCE
	JRST	EDNER1		;BAD ARGUMENT
EDNLO1:	FILSTR	<UERSTZ	*@>	;OUTPUT TO FILE
	JRST	EDNLOP

EDNER1:	TTYOUT	<?Not ersatz-device,P,Pn,search-list-type@>
	AOJA	LV,ASKEDA	;ASK AGAIN

EDNEND:	PUSHJ	P,FILRAB	;OUTPUT RIGHT ANGLE BRACKET
	MOVE	LV,SAVLV	;RESTORE PROMPT LEVEL AFTER POSSIBLE /HELP
ASKCMD:	FILOUT	<@DEFINE	SPCCMD> ;DEFINE THE MACRO
	PUSHJ	P,FILLAB	;PUT OUT THE LEFT ANGLE BRACKET
ASKCM1:	TLO	F,(F.OFO)	;OUTPUT FILES ARE OPEN
	BTHOUT	<@Type "command-name,dispatch,flags,unique-bits,PRVTAB-name" [
This question allows you to create new monitor commands or to redefine 
existing monitor commands.  The command name that you specify here will run 
the program that you specify, using the characteristics that you specify. 
Type each new command name followed by the information that the monitor 
needs to process the command.  This information is specified by each of the 
following components.  All components must be separated by commas, as shown 
above.  To omit a component, include only the comma in its place.  The 
components are:
	
   1. Command-name.  The command-name is the name of the monitor command to
      be added.  Type the command name as a single SIXBIT alphanumeric word
      or a single SIXBIT character enclosed in angle-brackets, or omit the
      name if you only want to extend PRVTAB.
	
   2. Dispatch address.  The dispatch address identifies the program or 
      routine to run when the command is processed.  This may be the name 
      of the program to run from SYS (file name only), or it may  be 
      omitted if the program name and command name are equivalent.  The 
      dispatch address may also be a location (label) of a routine in the 
      monitor.  For example, #RUNQUE.
	
   3. Flags.  Flags are defined in COMMON to specify the type of command 
      processing for the monitor to use.  Separate the flags with an 
      exclamation point (!).  Some of the possible flags are:
	
         Flag         Meaning
	
         APPFLG       saves your current context
         CMWRQ        requeues the job after command processing
         CUSTMR       reserved for customer implementation
         INCORE       requires that the job be in memory
         NBATCH       not allowed from a batch job
         NOACT        delayed if any devices are active
         NOCORE       core is not required
         NOINCK       can be processed if issued without a job
         NOJOBN       does not require a job number
         NOLOGIN      does not require that a job be logged in
         NOMESS       suppresses output of SET WATCH statistics
         NOPER        monitor must not prompt after command completion
         NORUN        requires that the job be halted
         NXONLY       is not legal if the job is execute-only
         TTYRNC       monitor should put job in monitor mode
         TTYRNU       monitor should put job in user mode       
         TTYRNW       continue I/O wait after command processing
	
   4. Unique bits.  Unique bits are bit numbers you can define to specify 
      the number of characters that make this command unique.  This is 
      specified in the form INIQ.n, where 'n' is the number of characters 
      from 1 to 4.
	
   5. PRVTAB-name.  The PRVTAB-name is the name of the program to place in 
      the monitor table PRVTAB.  This should be equivalent to the dispatch 
      program name and may be omitted if the command should not be included
      in PRVTAB.  PRVTAB is the monitor's list of priviledged CUSPs.
	
Type extra carriage return when through.]@>
ASKCM2:	SETZM	UCMBGN		;ZERO FIRST WORD OF DATA
	MOVE	CH,[UCMBGN,,UCMBGN+1] ;SETUP BLT POINTER
	BLT	CH,UCMEND	;ZERO IT ALL
	TLO	F,(F.BANG)	;ALLOW "!" IN INPUT LINE
	TLZ	F,(F.OFO)	;DON'T LOG THE LINE IN THE .MAC FILE
	PUSHJ	P,TTYIN		;GET THE LINE
	  JRST	ASKCM1		;/HELP TYPED
	TLO	F,(F.OFO)	;ALLOW WRITING TO THE .MAC FILE AGAIN
	JUMPE	CH,ASKC10	;GO IF NO COMMANDS SPECIFIED
	PUSHJ	P,GETWRD	;GET THE COMMAND NAME
	JUMPN	WD,ASKC12	;CHECK TERMINATOR IF GOT A WORD
	CAIN	CH,","		;IF A PRVTAB-ONLY ENTRY,
	JRST	ASKC12		;CHECK OTHER THINGS
	MOVE	WD,CH		;NO, COPY FOR LATER
	CAIE	CH,"<"		;ANGLE-BRACKETED?
	JRST	ASKCME		;NO, REQUIRE ANGLIES FOR 1-CHAR COMMANDS
	ILDB	WD,B		;YES, GET NEXT CHARACTER
	JUMPE	WD,ASKCME	;EOL IS ILLEGAL HERE
	ILDB	CH,B		;GET CLOSE-ANGLE
	CAIE	CH,">"		;IS IT WHAT WE EXPECTED?
	JRST	ASKCME		;NO
ASKC13:	CAILE	WD,40		;MAKE SURE IT'S IN SIXBIT RANGE
	CAILE	WD,137
	JRST	ASKCME		;NO
	TRZ	WD,40		;YES, CONVERT TO SIXBIT
	CAIE	WD,'<'		;IF EITHER FLAVOR
	CAIN	WD,'>'		;OF BROCKET,
	CAIA			;YES, FLAG BY LEAVING RIGHT-ADJUSTED
	LSH	WD,^D30		;ELSE, LEFT-JUSTIFY IN WORD
	ILDB	CH,B		;PICK UP TERMINATOR
ASKC12:	CAIE	CH,","		;TERMINATOR A COMMA?
	JRST	ASKCME		;NO
	MOVEM	WD,UCMCMD	;STORE FOR LATER
	PUSHJ	P,GETWRD	;GET THE DISPATCH
	CAIE	CH,"#"		;WAS IT AN ADDRESS?
	JRST	ASKCM3		;NO, MUST BE A PROGRAM NAME OR NULL
	JUMPN	WD,ASKCME	;CAN'T HAVE XXX#
	SKIPE	WD,UCMCMD	;IF PRVTAB-ONLY, THIS IS ILLEGAL
	PUSHJ	P,GETWRD	;GET THE ADDRESS
	JUMPE	WD,ASKCME	;MUST NOT BE NULL
	CAIE	CH,","		;TERMINATOR A COMMA?
	JRST	ASKCME		;NO
	MOVEM	WD,UCMADR	;STORE FOR LATER
	JRST	ASKCM4		;SKIP PROGRAM NAME STUFF
ASKCM3:	SKIPN	UCMCMD		;IF PRVTAB-ONLY,
	JUMPN	WD,ASKC15	;THE PRVTAB NAME MUST BE LAST
	CAIE	CH,","		;TERMINATOR A COMMA?
	JRST	ASKCME		;NO
	MOVEM	WD,UCMPRG	;SAVE PROGRAM NAME OR NULL
ASKCM4:	MOVEM	B,UCMBP1	;SAVE BYTE POINTER POSITION
ASKCM5:	ILDB	CH,B		;GET NEXT CHARACTER
	JUMPE	CH,ASKCME	;CAN'T HAVE EOL HERE
	CAIE	CH,","		;SKIP THE FLAGS
	JRST	ASKCM5		;CONTINUE
ASKCM6:	ILDB	CH,B		;GET NEXT CHARACTER OF UNIQUE BITS
	JUMPE	CH,ASKCME	;CAN'T HAVE EOL HERE
	CAIE	CH,","		;FIND THE END?
	JRST	ASKCM6		;NO, CONTINUE
	MOVEM	B,UCMBP2	;STORE ENDING BYTE POINTER
	PUSHJ	P,GETWRD	;GET THE PRVTAB NAME
ASKC15:	JUMPN	CH,ASKCME	;MUST HAVE EOL HERE
	SKIPN	UCMCMD		;IF PRVTAB-ONLY ENTRY,
	JUMPE	WD,ASKCME	;REQUIRE A PRVTAB NAME
	PUSH	P,WD		;SAVE FOR LATER
	FILOUT	<UCMDNM >	;START THE LINE
	MOVEI	CH,"<"		;WANT TO BRACKET THE COMMAND
	PUSHJ	P,FILPUT	;BEGIN NAME
	SKIPN	CH,UCMCMD	;GET SIXBIT OR ASCII
	JRST	ASKC14		;NEITHER--LEAVE IT BLANK
	TLNN	CH,(77B5)	;IS IT SIXBIT?
	JRST	[PUSHJ	P,FILPUT	;NO, DUMP AS ASCII FOR BROCKETS
		 JRST	ASKC14]	;MERGE IN AFTER FILOUT
	FILOUT	<*>,UCMCMD	;TYPE COMMAND NAME
ASKC14:	MOVEI	CH,">"		;END BROCKET
	PUSHJ	P,FILPUT	;FINISH COMMAND NAME VALUE
	FILOUT	<,>		;SEPARATE FIELDS WITH A COMMA
	SKIPN	N,UCMPRG	;GET THE PROGRAM NAME
	JRST	ASKCM7		;NULL
	FILOUT	<*>		;PUT IT OUT
ASKCM7:	FILOUT	<,>
	SKIPN	N,UCMADR	;GET THE ADDRESS
	JRST	ASKCM8		;NULL
	FILOUT	<*>		;PUT IT OUT
ASKCM8:	FILOUT	<,>
	SKIPE	T1,UCMBP1	;GET THE INITIAL BYTE POINTER
	JRST	ASKCM9		;GO USE IT
	FILOUT	<,,>		;FILL IN THE MISSING DELIMITERS
	JRST	ASKC16		;AND GO FINISH UP
ASKCM9:	ILDB	CH,T1		;GET NEXT CHARACTER
	CAIE	CH," "		;SKIP SPACES AND
	CAIN	CH,"	"	;  TABS
	JRST	ASKCM9
	PUSHJ	P,FILPUT	;PUT IT OUT
	CAME	T1,UCMBP2	;END OF STRING?
	JRST	ASKCM9		;NO, GET NEXT
ASKC16:	POP	P,N		;GET BACK PRVTAB NAME
	JUMPE	N,ASKC11	;GO IF NO PRVTAB NAME
	FILOUT	<*>		;PUT IT OUT
ASKC11:	FILOUT	<@>		;END THE LINE
	JRST	ASKCM2		;GET NEXT LINE
ASKCME:	TTYOUT	<?Incorrect syntax for user defined command@>
	AOJA	LV,ASKCM1
ASKC10:	PUSHJ	P,FILRAB	;END THE MACRO
	MOVE	LV,SAVLV	;RESTORE PROMPT AFTER /HELP
ASKTRM:	FILOUT	<DEFINE SPCCLS>	;MACRO NAME
	PUSHJ	P,FILLAB	;START DEFINING NEW CLASSES

CLASLP:	MOVE	LV,SAVLV	;RESTORE AT START OF LOOP

CLASL1:	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKSTR	<@Terminal class [
A terminal class is defined by the set of attributes and characteristics 
exhibited by the class as a whole.  If you want to define a terminal class, 
type a 1 to 5 character class name and press RETURN.  To end this section, 
just press RETURN.]>
	JUMPE	CH,CLASND
	PUSHJ	P,TRMCLS	;GET CLASS NAME
	   AOJA	LV,CLASL1	;TRY AGAIN ON ERROR
	MOVEM	WD,TCLASS	;SAVE FOR MEMBER-TYPE LOOP

	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKDEC	<Width (80,17-255) [
Type the number that corresponds to the terminal carriage width 
characteristic of the member terminals in the terminal class you are 
defining.   Terminal carriage width is the number of characters printed 
horizontally on the page.]>
	MOVEM	N,TWIDTH	;SAVE WIDTH

	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKDEC	<Length (0,0-255) [
Type the number that corresponds to the page length characteristic of the 
member terminals in the terminal class you are defining.  Page length is 
the number of lines printed vertically on the page.]>
	MOVEM	N,TLENG		;SAVE LENGTH

	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKDEC	<Fill (0,0-3) [
Type the number that corresponds to the filler class characteristic of the 
member terminals in the terminal class you are defining.  Fill characters 
are stored in the remaining data positions of a line if that line is not 
completly occupied.  The filler class you select determines how many null 
characters are necessary to fill a line, with 0 representing no fill 
characters and 3 representing the highest number of fill characters.]>
	MOVEM	N,TFILL		;SAVE FILLER CLASS

CLSCHL:	MOVEI	T1,CLSCHB	;POINT TO CHARACTERISTICS PARSE BLOCK
	PUSHJ	P,TYPCHR	;ASK FOR AND PARSE CHARACTERISTICS

CLSEPT:	MOVE	I,['V100EP']	;LOAD UP DEFAULT
	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKSTR	<Address of erase table (*) [
Type the address of the table of sequences to cursor-right and erase to 
EOL, or press RETURN to accept the default.]>,I
	PUSHJ	P,TRMTAB	;GET VALID SIXBIT TOKEN
	   AOJA	LV,CLSEPT	;TRY AGAIN ON ERROR
	MOVEM	WD,TERASE	;SAVE THE TABLE NAME

CLSBPT:	MOVE	I,['VTXXBP']	;LOAD UP DEFAULT
	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKSTR	<Address of rubout table (*) [
Type the address of the table of sequences to backspace, space, backspace, 
or press RETURN to accept the default.]>,I
	PUSHJ	P,TRMTAB	;GET VALID SIXBIT TOKEN
	  AOJA	LV,CLSBPT	;TRY AGAIN ON ERROR
	MOVEM	WD,TBACKP	;SAVE THE TABLE NAME

	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKDEC	<ANSI conformance level (1,0-15) [
Type the number that indicates the level of conformance to ANS X3.64 of the 
member terminals in the terminal class you are defining.]>
	MOVEM	N,TANSLV

	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKDEC	<DEC conformance level (0,0-15) [
Type the number that indicates the level of conformance to DEC STD 070 for 
the member terminals in the terminal class you are defining.]>
	MOVEM	N,TDECLV

CLSATR:	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKSTR	<Characteristic attributes [
From the list below, type one or more of the mnemonics that correspond to 
the attributes supported by member terminals in the terminal class you are 
defining.
	
   Mnemonic   Attribute 
	
   8BA        Capable of 8-bit operation
   8BT        Usually operates in 8-bit mode
   AVO        Advanced Video Option present or emulated
   BMT        Block-mode transfers
   BTA        Block transfers are per ANSI rather than DEC VT131
   CID        Character insertion and deletion
   CLR        Screen color can be manipulated by software
   DIS        Display terminal
   ESL        Extra status line exists
   GAT        Guarded Area Transfer
   GPO        ReGIS
   HSR        Horizontal scrolling
   ISO        ISO/Latin-1 rather than DEC/MCS
   JTK        Katakana character set
   LID        Line insertion and deletion
   NKB        No keyboard (asynchronous printer)
   NRC        National Replacement Characters
   OVR        Performs overstriking
   PPO        Printer port
   RCS        Redefinable Character Sets
   SEM        Selective Erase
   SRM        Scrolling regions
   SSU        Multiple sessions
   SXL        SIXEL graphics processing
   TCS        DEC/Technical Character Set
   TEK        4010/4014 emulation
   TSI        Terminal State Interrogation
   UDK        User-definable keys
   UWN        User windows 
   V52        VT52 emulation 
   VFL        Variable forms length
   VFW        Variable forms width
	
Separate the mnemonics in your list with commas.]>
	MOVEI	T1,TCATTR	;POINT TO PARSE BLOCK
	PUSHJ	P,TTYATR	;PARSE THE LIST INTO THE BLOCK
	  AOJA	LV,CLSATR

	TLZ	F,(F.SUPP)	;MAKE SURE WE CAN WRITE OUR DATA
	FILOUT	<TERMCR	(*,*>,TCLASS	;START CLASS DEFINITION
	MOVEI	T1,TCATTR	;POINT TO ATTRIBUTES PARSE BLOCK
	PUSHJ	P,FILATR	;LIST TO FILE
	FILDEC	<,,*>,TWIDTH	;CARRIAGE WIDTH
	FILDEC	<,*>,TLENG	;FORMS LENGTH
	FILDEC	<,*>,TFILL	;FILLER CLASS
	FILDEC	<,*>,TANSLV	;ANSI PORTION OF DECSTD070 SUPPORTED
	FILDEC	<,*>,TDECLV	;FULL SUPPORT LEVEL OF DECSTD070
	FILOUT	<,*>,TERASE	;ERASE TABLE ADDRESS
	FILOUT	<,*>,TBACKP	;BACKSPACE TABLE ADDRESS
	MOVEI	T1,CLSCHB	;CHARACTERISTICS BLOCK
	PUSHJ	P,FILCHR	;TYPE INTO THE FILE
	FILOUT	<)@>		;FINISH THE MACRO INVOCATION

	TTYOUT	<@Now enter member terminal types@>
TYPELP:	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKSTR	<@  Terminal type [
Type the name of a terminal type belonging to the terminal class you have 
just defined.  Terminal type names must be 1 to 6 characters in length.  To 
define another class, just press RETURN.]>
	JUMPE	CH,CLASLP	;NEXT CLASS IF NO TYPE NAME
	PUSHJ	P,ASKTYP	;GET TTY TYPE NAME
	   AOJA	LV,TYPELP	;RETRY ON ERROR
	JRST	TYPELP		;GET NEXT MEMBER TYPE

CLASND:	PUSHJ	P,FILRAB	;END SPCCLS MACRO
	BTHOUT	<@Additional terminals for classes:@>
	FILOUT	<DEFINE SPCCLX>
	PUSHJ	P,FILLAB	;OPEN MACRO DEFINITION

CLSEXL:	MOVE	LV,SAVLV	;RESTORE EACH TIME THROUGH LOOP
CLSEX1:	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKSTR	<@Class to extend [
Type the name of the terminal class you wish to extend, or press RETURN to 
end this section.]>
	JUMPE	CH,CLSEXN	;DONE EXTENDING IF BLANK LINE
	PUSHJ	P,TRMCLS	;GET CLASS NAME
	   AOJA	LV,CLSEX1	;RETRY ON ERROR
	MOVEM	WD,TCLASS	;REMEMBER IT

TYPEXL:	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKSTR	<@  Terminal type [
Type the name of a terminal type belonging to the terminal class you wish 
to extend.  Terminal type names must be 1 to 6 characters in length.  To 
define another class, just press RETURN.]>
	JUMPE	CH,CLSEXL	;NEXT CLASS AT END
	PUSHJ	P,ASKTYP	;GET TYPE NAME
	  AOJA	LV,TYPEXL	;RETRY ON ERROR
	JRST	TYPEXL		;GET NEXT EXTENSION TYPE

CLSEXN:	PUSHJ	P,FILRAB	;END OF MACRO DEFINITION
TTTDEF:	ASKSTR	<@System default terminal type (TTY) [
Type the name of the default termainl type for your system.  The terminal 
type name must be 1 to 6 characters in length.  The monitor will assign 
this type to all lines at system start-up, before INITIA runs.]>
	MOVSI	WD,'TTY'	;LOAD UP THE DEFAULT
	JUMPE	CH,TTDEF1	;USE IT IF SO REQUESTED
	PUSHJ	P,TRMTYP	;GET A TYPE NAME
	   AOJA	LV,TTTDEF	;RETRY ON ERROR
TTDEF1:	FILOUT	<M.DTTT==:<SIXBIT &*&>@>,WD ;DEFINE DEFAULT TTY TYPE
	JRST	TRMEND		;SKIP AROUND THE SUBROUTINES
;HERE TO GET A TABLE ADDRESS (NAME)
TRMTAB:	SKIPN	CH		;IF NO CHARACTERS,
	SKIPA	WD,I		;USE THE DEFAULT,
	PUSHJ	P,GETWRD	;ELSE, GET THE VALUE
	SKIPE	WD		;IF DIDN'T
	SKIPE	CH		;OR JUNK AT EOL
	CAIA			;COMPLAIN
	JRST	CPOPJ1		;WIN IF VALID
	TTYOUT	<? Invalid table address@>
	POPJ	P,		;RETURN FAILURE

;HERE TO GET A TTY CLASS NAME
TRMCLS:	CAILE	N,5		;IN RANGE?
	RJRST	<TTYOUT	<? Must be 1-5 characters@>
		POPJ	P,>
	PUSHJ	P,GETWRD	;GET THE NAME OF THE CLASS
	SKIPE	WD		;MAKE SURE WE GOT ONE
	SKIPE	CH		;AT EOL
	CAIA			;WRONG, GIVE ERROR
	JRST	CPOPJ1		;RETURN WINNITUDE
	TTYOUT	<? Invalid class name@>
	POPJ	P,		;RETURN FAILURE

;HERE TO GET A TTY TYPE NAME
TRMTYP:	CAILE	N,6		;MAKE SURE IN RANGE
	RJRST	<TTYOUT	<? Must be 1-6 characters@>
		POPJ	P,>
	PUSHJ	P,GETWRD	;GET SIXBIT TOKEN
	SKIPE	WD		;MAKE SURE WE GOT ONE
	SKIPE	CH		;AT EOL
	CAIA			;WRONG, GIVE ERROR
	JRST	CPOPJ1		;RETURN SUCCESS
	TTYOUT	<? Invalid terminal type name@>
	POPJ	P,		;RETURN FAILURE
;HERE TO DEFINE THE ATTRIBUTES OF A TERMINAL TYPE
ASKTYP:	PUSHJ	P,TRMTYP	;GET THE TYPE NAME
	  POPJ	P,		;LET CALLER HANDLE THIS ERROR
	MOVEM	WD,TTYPE	;SAVE TYPE NAME

TYPATR:	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKSTR	<  Additional attributes to set [
From the list above, type one or more of the mnemonics that correspond to
the additional attributes supported by member terminals in the terminal 
class you are defining.  Separate the mnemonics in your list with commas.]>
	MOVEI	T1,TONATR	;PARSE BLOCK
	PUSHJ	P,TTYATR	;PARSE INTO THE BLOCK
	  AOJA	LV,TYPATR

TYPATF:	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKSTR	<  Attributes to clear [
From the list above, type one or more of the mnemonics that correspond to
the attributes defined for the class but are inappropriate to this terminal 
type.]>
	MOVEI	T1,TOFATR	;PARSE BLOCK
	PUSHJ	P,TTYATR	;PARSE INTO THE BLOCK
	  AOJA	LV,TYPATF

	TLZ	F,(F.SUPP)	;SHOULD BE CLEAR, BUT I'M PARANOID
	FILOUT	<TERMCR	(*,>,TTYPE ;START WITH THE TYPE NAME
	FILOUT	<*>,TCLASS	;ADD THE CLASS NAME
	MOVEI	T1,TONATR	;POINT TO ATTRIBUTES TO SET
	PUSHJ	P,FILATR	;ENTER INTO THE FILE
	MOVEI	T1,TOFATR	;POINT TO ATTRIBUTES TO CLEAR
	PUSHJ	P,FILATR	;ENTER THAT INTO FILE
	FILOUT	<)@>		;END THE LINE
	JRST	CPOPJ1		;RETURN SUCCESS
;HERE TO PARSE A LIST OF ATTRIBUTES
TTYATR:	MOVEM	T1,CURATR	;SAVE POINTER TO ATR BLOCK
	MOVSI	I,(T1)		;GET SOURCE ADDRESS
	HRRI	I,1(T1)		;DESTINATION
	SETZM	(T1)		;CLEAR FIRST WORD
	BLT	I,ATRLEN-1(T1)	;THEN THE WHOLE BLOCK
	JUMPE	CH,CPOPJ1	;THAT'S ALL WE NEED FOR A BLANK LINE
	MOVE	I,[-ATRLEN,,ATRTAB]	;AOBJN POINTER TO ATTRIBUTE NAMES
	MOVE	I2,CURATR	;MEMORY BLOCK ADDRESS
	PJRST	TRMPRS		;PARSE USER'S INPUT (PROPAGATING SKIP/ERROR)

DEFINE	YY(SYL),<IRP SYL,<EXP SIXBIT \SYL\>>

ATRTAB:	YY	<8BT,DIS,OVR,8BA,ISO,NRC,LID,CID,SRM,GAT,SEM>
	YY	<AVO,PPO,GPO,SXL,TEK,RCS,UDK,VFW,VFL,V52,ESL>
	YY	<JTK,TCS,TSI,BMT,BTA,HSR,UWN,SSU,CLR>
ATRLEN==.-ATRTAB	;NUMBER OF ATTRIBUTES
;HERE TO PARSE A LIST OF CHARACTERISTICS
TYPCH1:	SKIPA	T1,CURCHR	;START OVER AGAIN ON ERROR
TYPCHR:	MOVEM	T1,CURCHR	;SAVE POINTER TO CHR BLOCK
	MOVSI	I,(T1)		;GET SOURCE ADDRESS
	HRRI	I,1(T1)		;DESTINATION
	SETZM	(T1)		;CLEAR FIRST WORD
	BLT	I,TCRLEN-1(T1)	;THEN THE WHOLE BLOCK
	TLO	F,(F.SUPP)	;DON'T CLUTTER THE MACRO
	ASKSTR	<Characteristics [
From the list below, type one or more of the mnemonics that correspond to 
the characteristics exhibited by member terminals in the terminal class you
are defining.
	
   FF    hardware forms
   TAB   hardware tab support
   LC    transmit and receive lowercase characters
   ALT   need old-style altmode conversion
   XON   XON/XOFF flow control is desired
   CRLF  monitor performs free-CRLF logic
	
Separate the mnemonics in your list with commas.]>
	JUMPE	CH,CPOPJ1	;THAT'S ALL WE NEED FOR A BLANK LINE
	MOVE	I,[-TCRLEN,,TCRTAB]	;AOBJN POINTER TO CHR TABLE
	MOVE	I2,CURCHR	;POINT TO CHR BLOCK
	PUSHJ	P,TRMPRS	;PARSE LIST FROM TABLE INTO BLOCK
	  AOJA	LV,TYPCH1	;ASK OVER AGAIN ON ERROR
	POPJ	P,		;THAT'S ALL WE NEED

TCRTAB:	YY	<FF,TAB,LC,ALT,XON,CRLF>
TCRLEN==.-TCRTAB		;NUMBER OF ENTRIES
;HERE TO LIST OUT CHARACTERISTICS OR ATTRIBUTES TO THE FILE
FILCHR:	SKIPA	I2,[-TCRLEN,,TCRTAB]	;AOBJN POINTER TO CHR TABLE
FILATR:	MOVE	I2,[-ATRLEN,,ATRTAB]	;AOBJN POINTER TO ATR TABLE
	MOVE	I3,T1		;COPY ARG BLOCK POINTER
	MOVEI	CH,","		;SEPARATE FROM WHAT PRECEDES IT
	PUSHJ	P,FILPUT	;WITH A COMMA
	SETO	I,		;FLAG WHETHER LEADING COMMA NEEDED IN LIST
FILAT1:	SKIPN	(I3)		;ANYTHING ON IN THE ARGUMENT BLOCK?
	JRST	FILAT2		;NO, DON'T TYPE IT
	MOVEI	CH,","		;PREPARE TO SEPARATE WITH COMMA
	AOSN	I		;IF NOT THE FIRST,
	MOVEI	CH,"<"		;ELSE START THE LIST
	PUSHJ	P,FILPUT	;DO IT
	MOVE	N,(I2)		;GET THE SIXBIT NAME TO USE
	FILOUT	<*>		;TYPE IT
FILAT2:	AOJ	I3,		;ADVANCE PARSE BLOCK POINTER
	AOBJN	I2,FILAT1	;LOOP OVER ALL VALUES
	MOVEI	CH,">"		;END OF LIST
	AOSE	I		;UNLESS TYPED NO VALUES,
	PUSHJ	P,FILPUT	;CLOSE THE LIST
	POPJ	P,		;RETURN
;HERE TO PARSE A LIST INTO A BLOCK

TRMPRS:	PUSHJ	P,GETWRD	;READ THE NEXT SIXBIT TOKEN
	JUMPE	WD,CPOPJ	;ERROR IF NOT THERE
	CAIE	CH,","		;IF TERMINATER IS NOT COMMA,
	JUMPN	CH,CPOPJ	;MUST BE EOL
	MOVE	T1,I		;COPY SIXBIT LIST
TRMPR1:	CAME	WD,(T1)		;IF NO MATCH,
	AOBJN	T1,TRMPR1	;LOOP OVER LIST
	JUMPGE	T1,CPOPJ	;ERROR IF NO MATCH
	SUBI	T1,(I)		;FIND OFFSET INTO TABLE
	ADDI	T1,(I2)		;FORM OFFSET INTO PARSE BLOCK
	MOVEM	WD,(T1)		;SAVE (JUST FOR GRINS)
	JUMPN	CH,TRMPRS	;LOOP AS LONG AS THERE'S DATA
	JRST	CPOPJ1		;SUCCESS AT LAST!
TRMEND:	MOVE	LV,SAVLV	;RESTORE PERMANENT HELP LEVEL
SYSEND:	FILCOM	<@END OF *>,OUTNAM
	HLLZ	N,OUTEXT	;EXTENSION OF FILE WRITTEN
	FILCOM	<.*@>,N
	POPJ	P,		;END OF SYSGEN, RETURN AND CLOSE FILE
SUBTTL	ASK ROUTINES - ASK QUESTION ON TTY, FILE AND GET ANSWER

;ASKSYS - ROUTINE TO FIND OUT WHAT TYPE OF SYSTEM
;CALL:	PUSHJ	P,ASKSYS
;	RETURN	N=INDEX OF TYPE OF SYSTEM

ASKSYS:	ASKLST	<DECsystem10 (KL,KS) [
The KL is a system with KL10 CPUs.  The KS is a system with a KS10 CPU.]>
	AOS	M.KL10(N)	;SET APPROPRIATE PROCESSOR TYPE
	MOVEM	N,CNFIND	;SAVE INDEX OF SYSTEM TYPE
	POPJ	P,		;DONE
;ASKAUT - ROUTINE TO ASK MONGEN'ED DEVICE TABLE QUESTIONS
; USED ONLY FOR AUTCONFIGURED DEVICE DRIVER QUESTIONS

ASKAUT:	MOVEI	T1,@(P)		;GET ADDRESS OF CALL
	ADDI	T1,1		;POINT TO START OF ARGUMENTS
	PUSHJ	P,MDTSAV	;SAVE ARGUMENTS, BUILD TEXT
	MOVE	T2,MDTBIT	;BITS TO TEST
	TRNN	F,F.NEVR	;NEVER LOAD?
	TDNN	T2,F		;QUESTION VALID FOR THIS CPU TYPE?
	JRST	ASKAU2		;NO
	MOVEI	T1,MDTBUF	;POINT TO QUESTION
	PUSHJ	P,ASKMIC	;PASS TEXT OFF TO MIC
	PUSHJ	P,FCRLF		;OUTPUT CRLF TO FILE
	MOVEI	T1,MDTBUF	;POINT TO QUESTION
	PUSHJ	P,FILCOM	;STUFF IN FILE
	MOVEI	R,^D10		;SET RADIX TO 10
ASKAU1:	MOVEI	T1,MDTBUF	;POINT TO QUESTION
	PUSHJ	P,TTROUT	;OUTPUT TO TTY
	MOVEI	T1,MDTBUF	;POINT TO QUESTION
	PUSHJ	P,SETASK	;SET UP LIST OF CHOICES IN ASKTAB
	PUSHJ	P,TTYIN		;ASK FOR INPUT LINE, OUTPUT TO FILE AS COMMENT
	  JRST	ASKAU1		;/HELP TYPED, ASK AGAIN IN DESIRED HELP MODE
	PUSHJ	P,FNDASK	;VALID ANSWER
	  AOJA	LV,ASKAU1	;STUPID USER, ASK AGAIN WITH MORE HELP
	MOVE	LV,SAVLV	;RESTORE VERBOSITY LEVEL
	TRNE	F,F.LOAD	;ALWAYS LOAD DRIVER?
	AOS	N		;YES--FORCE TO A POSITIVE ANSWER
	TLZA	F,(F.COM!F.2DEC) ;CLEAR FLAG FOR NEXT CALLER

ASKAU2:	SETZ	N,		;FORCE A "NO" ANSWER
	PUSH	P,N		;PRESERVE ANSWER
	SETZM	@MDTSYM		;ASSUME THE ANSWER WAS "NO"
	SKIPE	N		;CHECK IT
	AOS	@MDTSYM		;EITHER "YES" OR "PROMPT"
	MOVE	N,MDTSIX	;SIXBIT SYMBOL NAME
	FILOUT	<@M.*==:>,N	;PUT IN FILE
	MOVE	N,@MDTSYM	;GET VALUE
	FILOUT	<*@>,N		;PUT IN FILE
	MOVE	N,MDTSIX	;SIXBIT NAME
	FILOUT	<DEFINE	MD*,>,N
	PUSHJ	P,FILLAB	;PUT OUT A LEFT WIDGET AND A CRLF
	SKIPN	@MDTSYM		;WANT THIS OPTION?
	JRST	[POP	P,(P)	;PHASE STACK
		 JRST	ASKAU5]	;AND FINISH UP
	MOVE	N,MDTKON	;GET DRIVER NAME
	FILOUT	<	EXTERN	*@>,N ;FORCE IT TO BE LOADED

ASKAU3:	MOVE	N,(P)		;GET RESPONSE BACK
	PUSHJ	P,ASKRES	;ASK FOR RESERVED DEVICES PER CPU
	POP	P,N		;GET RESPONSE BACK
	CAIN	N,2		;NEED TO PROMPT FOR ADDITIONAL DATA?
	PUSHJ	P,ASKMDT	;YES--ASK FOR MONGEN'ED DEVICE TABLE
	TRNN	F,F.DVCP	;RESERVE SPACE ON A PER-CPU BASIS?
	JRST	ASKAU4		;NO
	MOVE	N,M.CPU		;GET NUMBER OF CPUS IN CONFIGURATION
	FILOUT	<	MDPATD	(*)@>,N ;RESERVE "M.CPU" DEVICE SLOTS

ASKAU4:	FILOUT	<	MDTERM@> ;TERMINATE TABLE

ASKAU5:	MOVEI	CH,">"		;RIGHT ANGLE BRACKET
	PUSHJ	P,FILPUT	;PUT IN OUTPUT FILE
	MOVE	N,MDTSIX	;SIXBIT NAME
	FILOUT	< ;;END DEFINE MD*@>,N
	TLZ	F,(F.SUPP)	;SHOULD BE CLEAR BUT PARANOIA PREVAILS
	TRZ	F,F.LOAD!F.NEVR!F.MBUS!F.DVCP ;CLEAR ONE-SHOT BITS
	POPJ	P,		;RETURN
ASKRES:	MOVE	I,[MDTRES,,MDTRES+1] ;SET UP BLT
	SETZM	MDTRES		;CLEAR FIRST WORD
	BLT	I,MDTRES+SM.CPU-1 ;CLEAR STORAGE
	SKIPE	SMP		;ONLY DO THIS IF SMP
	CAIE	N,2		;PROMPTING FOR DATA?
	JRST	ASKRE4		;NO
	TLO	F,(F.SUPP)	;SUPPRESS FILE OUTPUT
	TTYOUT	<    Reserve devices per CPU: [
In multi-CPU configurations, it is often desirable to reserve a number of 
controller or device slots for each CPU which normally has this type of 
device connected to it.  For example, in a dual CPU system, if each CPU has 
two channels for RP06s, one would like the controllers to have the names 
RPA, RPB, RPC, and RPD.
    For devices such as disks, where the controller name varies with each 
driver loaded, this question should be answered for each driver.
    For devices such as magtapes, where the controller designation (MT) is 
the same regardless of the driver being used, this question need only be 
answered for the first driver.
    Typing CR will default the number of controllers or devices to an
appropriate value depending upon the driver.]>
	PUSHJ	P,TTYIN		;GET THE LINE
	  AOJA	LV,ASKRES	;/HELP TYPED--START ALL OVER
	TLZ	F,(F.SUPP)	;CLEAR FILE OUTPUT SUPPRESSION
	MOVN	I,M.CPU		;CPUS IN CONFIGURATION
	HRLZS	I		;MAKE AN AOBJN POINTER
ASKRE1:	PUSHJ	P,GETDEC	;GET A COUNT
	CAILE	N,^D26		;RANGE CHECK
ASKRE2:	AOJA	LV,MDT1		;ERROR
	MOVEM	N,MDTRES(I)	;STORE RESULT
	CAIE	CH,","		;MORE ON THE WAY?
	JRST	ASKRE3		;NO
	AOBJN	I,ASKRE1	;LOOP FOR MORE
ASKRE3:	JUMPN	CH,ASKRE2	;CHECK FOR JUNK AT EOL
ASKRE4:	FILOUT	<	MDCPUN	(>	;START OF MACRO
	MOVSI	I,-SM.CPU	;AOBJN POINTER
ASKRE5:	MOVEI	CH,","		;COMMA
	TRNE	I,-1		;FIRST TIME THROUGH?
	PUSHJ	P,FILPUT	;SEPARATE ARGUMENTS
	MOVE	T1,MDTRES(I)	;GET A COUNT
	PUSHJ	P,MDTOCT	;CONVERT TO SIXBIT
	LSH	N,30		;TWO DIGITS
	FILOUT	<*>,N		;PUT IT OUT
	AOBJN	I,ASKRE5	;LOOP FOR ALL
	FILOUT	<)@>		;END MACRO AND LINE
	POPJ	P,		;RETURN
;MONGEN'ED DEVICE TABLE BITS
	MD.VAL==1B33		;DEVICE SPECIFIER WORD IS VALID
	MD.KON==1B34		;KONTROLLER DEFINITION
	MD.ALL==1B35		;ALL UNITS ON KONTROLLER

ASKMDT:	SKIPN	SMP		;SEE IF SMP
	JRST	ASKMD2		;JUMPE IF NOT PROMPTED FOR PER-CPU STUFF
ASKMD1:	TLO	F,(F.SUPP)	;SUPPRESS FILE OUTPUT
	ASKLST	<    Do you want to specify more data (NO,YES)>
	JUMPE	N,CPOPJ		;PROCEED IF "YES"
ASKMD2:	MOVE	T1,[Z.MDTB,,Z.MDTB+1] ;SET UP BLT
	SETZM	Z.MDTB		;CLEAR FIRST WORD
	BLT	T1,Z.MDTE	;CLEAR STORAGE
;CPU
MDT1:	MOVE	N,M.CPU		;GET NUMBER OF CPUS
	SOJLE	N,MDT2		;MORE THAN ONE?
	TLO	F,(F.SUPP)	;SUPPRESS FILE OUTPUT
	ASKDEC	<    CPU (CR,0-*) [
Type a CPU number or press RETURN for all CPUs.]>
	CAMN	N,['CR    ']	;DEFAULT?
	MOVEI	N,7		;YES
	MOVEM	N,MDTCPU	;SAVE RESULTS
;DEVICE CODE
MDT2:	SKIPN	M.KL10		;KL10?
	JRST	MDT2B		;NO
MDT2A:	TLO	F,(F.SUPP)	;SUPPRESS FILE OUTPUT
	ASKOCT	<    Device code (CR,0-774) [
Press RETURN to accept the standard device code definitions.]>
	TRNE	N,3		;JUNK IN THE LOW ORDER BITS?
	JRST	MDT2A		;TRY AGAIN
	JRST	MDT2C		;CONTINUE
MDT2B:	TLO	F,(F.SUPP)	;SUPPRESS FILE OUTPUT
	ASKOCT	<    Interrupt vector index (CR,0-774) [
Press RETURN to accept the standard interrupt vector index definition.]>
	TRNE	N,3		;JUNK IN THE LOW ORDER BITS?
	JRST	MDT2B		;TRY AGAIN
MDT2C:	CAMN	N,['CR    ']	;DEFAULT?
	SETZ	N,		;YES
	MOVEM	N,MDTDVC	;SAVE DEVICE CODE
	SKIPN	M.KS10		;KS10?
	JRST	MDT3		;NO
MDT2D:	TLO	F,(F.SUPP)	;SUPPRESS FILE OUTPUT
	ASKOCT	<    UNIBUS address (CR,760000-777774) [
Press RETURN to accept the standard UNIBUS address definitions.]>
	CAMN	N,['CR    ']	;DEFAULT?
	SETZ	N,		;YES
	TRNE	N,3		;JUNK IN THE LOW ORDER BITS?
	JRST	MDT2D		;TRY AGAIN
	MOVEM	N,MDTUAD	;SAVE UNIBUS ADDRESS
;MASSBUS UNIT
MDT3:	MOVE	T1,F		;COPY INTERESTING BITS
	ANDI	T1,F.MBUS	;PRESERVE CHANNEL BITS
	PUSH	P,F		;SAVE FOR LATER
	MOVE	N,MDTSIX	;KONTROLLER NAME
	SKIPN	M.KL10		;KL10?
	JRST	MDT3A		;NO
	TLO	F,(F.SUPP)	;SUPPRESS FILE OUTPUT
	TRNN	F,F.MBUS	;MASSBUS DEVICE?
	JRST	MDT3A		;NO
	ASKOCT	<    Massbus device (0,0-7) [
Type the Massbus device number for the * controller.]>,N
	MOVEM	N,MDTUNI	;SAVE
MDT3A:	POP	P,T1		;GET CHANNEL BITS BACK
	TRZ	F,F.MBUS	;CLEAR THEM
	IORM	T1,F		;AND RESTORE WHAT WAS PREVIOUSLY SET
;DRIVE
MDT4:	TTYOUT	<    Drive, slave, or unit: [
Type a decimal drive, slave, or unit number, "ALL" for all units, or "NONE" 
if defining a controller parameter.  An answer to this question must be 
supplied.]>
	TLO	F,(F.SUPP)	;SUPPRESS FILE OUTPUT
	PUSHJ	P,TTYIN		;GET THE LINE
	  AOJA	LV,MDT4		;/HELP TYPED--START ALL OVER
	JUMPE	CH,.-1		;CAN'T BE BLANK
	CAIL	CH,"0"		;RANGE
	CAILE	CH,"9"		; CHECK
	JRST	[PUSHJ	P,GETWRD	;FETCH A KEYWORD
		 CAMN	WD,['ALL   ']	;ALL DRIVES ON KONTROLLER?
		 MOVEI	N,MD.ALL	;THAT'S RIGHT
		 CAMN	WD,['NONE  ']	;PERHAPS KONTROLLER DEFINITION?
		 MOVEI	N,MD.KON	;YES
		 SKIPN	WD,N		;PRESERVE
		 AOJA	LV,MDT4		;NO--TRY AGAIN
		 SETZ	N,		;CLEAR DRIVE NUMBER
		 JRST	.+2]		;AND CONTINUE
	JRST	[SETZ	WD,		;NO FLAGS
		 MOVE	T1,B		;SAVE BYTE POINTER
		 PUSHJ	P,GETDEC	;FETCH A NUMBER
		 CAMN	T1,B		;READ ANY CHARACTERS?
		 AOJA	LV,MDT4		;NO
		 JRST	.+1]		;CONTINUE
	MOVEM	WD,MDTFLG	;SAVE POSSIBLE FLAG
	MOVEM	N,MDTDRV	;SAVE DRIVE NUMBER
;DATA
MDT5:	TTYOUT	<    Data: [
You may provide device-specific information.  The response to this may 
contain a symbolic expression.  If you press RETURN, this indicates that 
there is no device-specific data other than the previously specified device 
code information.]>
	TLO	F,(F.BANG!F.SUPP) ;ALLOW "!" AND SUPPRESS FILE OUTPUT
	PUSHJ	P,TTYIN		;GET THE LINE
	  AOJA	LV,MDT5		;/HELP TYPED--START ALL OVER
	TLZ	F,(F.SUPP)	;CLEAR FILE OUTPUT SUPPRESSION
;WRITE THE DATA OUT
MDT6:	MOVEI	N,MD.VAL	;GET VALID BIT
	IORM	N,MDTFLG	;DIFFERENTIATE FROM ZERO TERMINATOR
	MOVE	N,['KL10  ']	;ASSUME A KL10
	SKIPN	M.KL10		;CHECK IT
	MOVE	N,['KS10  ']	;NO
	FILOUT	<	MD*	(>,N
	MOVE	N,MDTCPU	;GET CPU NUMBER
	FILDEC	<*,>,N
	MOVE	T1,MDTDVC	;DEVICE CODE/IVI
	PUSHJ	P,MDTOCT	;CONVERT TO OCTAL
	HRLZS	N		;ONLY THREE DIGITS
	FILOUT	<*,>,N
	SKIPN	M.KS10		;KS10?
	JRST	MDT6A		;NO
	MOVE	T1,MDTUAD	;GET UNIBUS ADDRESS
	PUSHJ	P,MDTOCT	;CONVERT TO OCTAL
	FILOUT	<*,>,N
MDT6A:	MOVE	N,MDTUNI	;MASSBUS UNIT NUMBER
	FILOUT	<*,>,N
	MOVE	T1,MDTDRV	;DRIVE NUMBER
	PUSHJ	P,MDTDEC	;CONVERT TO DECIMAL
	HRLZS	N		;PUT IN LH
	FILOUT	<*,>,N
	MOVEI	CH,"<"		;LEFT
	PUSHJ	P,FILPUT	; WIDGET
	MOVSI	I,-MDTLEN	;AOBJN POINTER
	MOVNI	I2,1		;INIT COUNTER
MDT6B:	HRRZ	T1,MDTTAB(I)	;GET A BIT
	TDNN	T1,MDTFLG	;WANT TO OUTPUT?
	JRST	MDT6C		;NO
	MOVEI	CH,"!"		;SEPARATOR
	AOSE	I2		;FIRST TIME THROUGH?
	PUSHJ	P,FILPUT	;NO
	HLLZ	N,MDTTAB(I)	;GET NAME
	FILOUT	<MD.*>		;PUT INTO FILE
MDT6C:	AOBJN	I,MDT6B		;LOOP THROUGH TABLE
	MOVEI	CH,">"		;RIGHT
	PUSHJ	P,FILPUT	; WIDGET
	MOVEI	CH,","		;ARGUMENT
	PUSHJ	P,FILPUT	; SEPARATOR
	MOVEI	CH,"<"		;LEFT
	PUSHJ	P,FILPUT	; WIDGET
	HRRZ	T1,B		;START OF PARSED DATA
	FILSTR	<*>		;PUT IT OUT
	MOVEI	CH,">"		;RIGHT
	PUSHJ	P,FILPUT	; WIDGET
	FILSTR	<)@>		;FINISH LINE OFF
	JRST	ASKMD1		;LOOP BACK FOR MORE

MDTTAB:	'VAL',,MD.VAL		;WORD IS VALID
	'KON',,MD.KON		;ALL DRIVES ON KONTROLLER
	'ALL',,MD.ALL		;ALL KONTROLLERS
MDTLEN==.-MDTTAB		;LENGTH OF TABLE
MDTOCT:	SKIPA	I3,[10]		;RADIX 8
MDTDEC:	MOVEI	I3,12		;RADIX 10
	SETZ	N,		;CLEAR RESULT
	PUSHJ	P,MDTNUM	;CONVERT TO PSEUDO-SIXBIT
	TDO	N,['000000']	;MAKE REAL SIXBIT
	POPJ	P,		;AND RETURN
MDTNUM:	IDIVI	T1,(I3)		;DIVIDE
	HRLM	T2,(P)		;STORE RESULT
	SKIPE	T1		;DONE?
	PUSHJ	P,MDTNUM	;RECURSE
	HLRZ	T1,(P)		;GET A DIGIT
	LSH	N,6		;MAKE ROOM
	IOR	N,T1		;INCLUDE DIGIT
	POPJ	P,		;RETURN
MDTSAV:	MOVE	T2,0(T1)	;M.XXXX ADDRESS
	MOVEM	T2,MDTSYM
	MOVE	T2,1(T1)	;SIXBIT /M.XXXX/
	MOVEM	T2,MDTSIX
	MOVE	T2,2(T1)	;SIXBIT DRIVER NAME
	MOVEM	T2,MDTKON
	MOVE	T2,3(T1)	;FLAGS
	MOVEM	T2,MDTBIT
	MOVE	T2,4(T1)	;INTRODUCTORY TEXT
	HRLI	T2,5(T1)	;LONG TEXT
	MOVEM	T2,MDTTXT

;INIT BUFFER
	MOVE	T1,[MDTBUF,,MDTBUF+1] ;SET UP BLT
	SETZM	MDTBUF		;CLEAR FIRST WORD
	BLT	T1,MDTBUF+MP.AQB-1 ;CLEAR TEXT STORAGE
	MOVE	I,[POINT 7,MDTBUF] ;BYTE POINTER
	MOVEI	I2,<MP.AQB*5>-1	;BYTE COUNT

;LEAD IN MESSAGE
	MOVEI	T1,[ASCIZ /  Include /]
	TRNE	F,F.LOAD	;ALWAYS LOAD DRIVER?
	MOVEI	T1,[ASCIZ /  Prompt for /]
	PUSHJ	P,MDTSTO	;STORE STRING

;DRIVER TEXT
	HRRZ	T1,MDTTXT	;INTRODUCTORY TEXT
	PUSHJ	P,MDTSTO	;STORE STRING

;OPTION TEXT
	MOVEI	T1,[ASCIZ / (NO,YES,PROMPT)/]
	TRNE	F,F.LOAD	;ALWAYS LOAD DRIVER?
	MOVEI	T1,[ASCIZ / (NO,YES)/]
	PUSHJ	P,MDTSTO	;STORE STRING

;LONG HELP TEXT
	MOVEI	T1,[ASCIZ /[/]	;START OF LENGTHY TEXT
	PUSHJ	P,MDTSTO	;NEXT LINE
	HLRZ	T1,MDTTXT	;LONG TEXT
	PUSHJ	P,MDTSTO	;STORE STRING
	MOVEI	T1,MDTNYP	;(NO,YES,PROMPT) TEXT
	TRNE	F,F.LOAD	;ALWAYS LOAD DRIVER?
	MOVEI	T1,MDTNY	;(NO,YES) TEXT
	PUSHJ	P,MDTSTO	;STORE STRING
	POPJ	P,		;RETURN

MDTSTO:	HRLI	T1,(POINT 7,)	;MAKE A BYTE POINTER
MDTST1:	ILDB	CH,T1		;GET A CHARACTER
	JUMPE	CH,CPOPJ	;RETURN IF DONE
	IDPB	CH,I		;PUT A CHARACTER
	SOJG	I2,MDTST1	;LOOP FOR MORE
	RJRST	<EREXIT	<MDTBUF full>,>


MDTNY:	ASCIZ	\Respond with one of the following:
	NO      Do not prompt
	YES     Prompt for parameters]: \

MDTNYP:	ASCIZ	\Respond with one of the following:
	NO      Exclude driver
	YES     Include driver
	PROMPT  Include driver and prompt for parameters]: \
;ASKYN - ROUTINE TO ASK AND ACCEPT A Y OR N ANSWER
; USED WHEN ONLY CHOICE OF PRESENCE OR ABSENCE IS POSSIBLE
;CALL:	ASKYN	<...(Y,N)[...]>
;	RETURN	N=1 IF Y, N=0 IF N
; NOTE: (Y,N) MUST BE IN THIS ORDER, SO USER KNOWS DEFAULT ALWAYS IS Y

ASKZYN:
ASKYN:	PUSHJ	P,ASKLS1	;ASK QUESTION, GET ANSWER POSITION IN N
	SKIPE	ASKTAB+2	;MORE THAN TWO CHOICES?
	JRST	ASKYNE		;THAT'S AN ERROR
	MOVS	T1,ASKTAB+0	;IS FIRST PROMPT
	CAIN	T1,'YE '	;FINGER SLIP OFF THE KEYS?
	MOVEI	T1,'YES'	;FIX IT UP
	CAIE	T1,'YES'	;YES?
	CAIN	T1,'Y  '	;ABBREVIATED?
	SKIPA	T1,ASKTAB+1	;OK, GET SECOND POSSIBLE RESPONSE
	JRST	ASKYNE		;ERROR
	MOVSS	T1		;PUT IN RH
	CAIE	T1,'NO '	;NO?
	CAIN	T1,'N  '	;ABBREVIATED?
	SKIPA			;OK
ASKYNE:	RJRST	<EREXIT	<ASKYN called without (Y,N) in above message>,>
	JUMPE	N,ASKY		;FIRST ITEM IN LIST(Y)?

;HERE ON N ANSWER
	TDZA	N,N		;RETURN 0

;HERE ON Y ANSWER
ASKY:	MOVEI	N,1		;RETURN 1
	POPJ	P,
;ROUTINE TO ASK QUESTON WITH PROMPTING ANSWERS IN A LIST IN PARENS
;CALL:	ASKLST	<...(ANS0,ASN1,ANS2,...)[...]>
;	RETURN HERE WITH N=0,1,2,...
;	IF JUST CR TYPED, N=0 TO MEAN FIRST ITEM BY DEFAULT
;ABBREVIATIONS ARE ALLOWED LIKE MONITOR COMMANDS
; IF WRONG ANSWER IS GIVEN, THE FOLLOWING ERROR MESSAGE IS TYPED:
; ? ANSWER MUST BE ONE OF (ANS0,ANS1,ANS2,...)
; FOLLOWED BY A REPEAT OF QUESTION IN NEXT LONGEST MODE
;IF A LIST OF PROMPTINGS IS NOT INCLUDED IN PARENS,
; ? INTERNAL MONGEN ERROR  - NO CHOICES IN PARENS - EDIT MONGEN


ASKLST:	PUSHJ	P,ASKLS1	;ASK AND GET ANSWER
	MOVS	T1,ASKTAB+0	;IS FIRST PROMPT
	CAIE	T1,'Y  '	;Y
	CAIN	T1,'N  '	; OR N?
	JRST	ASKLSE		;YES, ERROR SHOULD USE ASKYL INSTEAD
	MOVS	T1,ASKTAB+1	;IS SECOND PROMPT
	CAIE	T1,'Y  '	;Y
	CAIN	T1,'N  '	;OR N?
ASKLSE:	RJRST	<EREXIT	<ASKLST called with (Y,N) in above question
- Edit MONGEN to call ASKYN instead of ASKLST@>,>
	POPJ	P,		;RETURN WITH N SET TO POSITION OF ANSWER

;SUBROUTINE TO DO THE WORK OF ASKING AND GETTING ANSWER.
;CALLED BY ASKLST AND ASKYN

ASKLS1:	MOVEI	R,^D10		;SET RADIX TO 10(IN CASE * SUBS.)
	PUSHJ	P,ASKBG		;STANDARD ASK ROUTINE BEGINNING
				; SAVE ADR OF QUESTION AND N ON STACK, OUTPUT CRLF
				; TO FILE, OUTPUT QUESTION AS COMMENT TO FILE

;LOOP TO ASK QUESTION OVER AGAIN AFTER ERROR OR /HELP
ASKOVR:	MOVE	N,(P)		;REESTORE ORIGINAL N INCASE THIS IS LOOP
				; SO * SUBSTITUTION WILL BE THE SAME
	HRRZ	T1,-1(P)	;ADR OF MESSAGE
	PUSHJ	P,TTROUT	;OUTPUT TO TTY
	HRRZ	T1,-1(P)	;ADR OF ASK MESSAGE
	PUSHJ	P,SETASK	;SET UP LIST OF CHOICES IN ASKTAB
				; FROM SCANNING LIST OF PROMPTINGS
	PUSHJ	P,TTYIN		;ASK FOR INPUT LINE, OUTPUT TO FILE AS COMMENT
	  JRST	ASKOVR		;/HELP TYPED, REASK IN DESIRED HELP MODE
	PUSHJ	P,FNDASK	;NO, LOOK FOR HIS ANSWER IN ASKTAB
	  AOJA	LV,ASKOVR	;NOT THERE, ASK QUESTION AGAIN WITH MORE HELP
				; BY MAKIN LEVEL ONE HIGHER
	JRST	ASKXIT		;FOUND, RESTORE LEVEL
				; TO THAT BEFORE QUESTION AND RETURN
;ROUTINE TO SCAN MESSAGE FOR PROMPTING ANSWERS
;CALL:	MOVEI	T1,ADR OF ASCIZ STRING
;	PUSHJ	P,SETLST
;	  RETURN ONLY IF ANSWERS IN PARENS FOUND
;	ELSE PRINT ? INTERNAL MONGEN ERROR - NO ( IN ABOVE MESSAGE,
; ADD (ANS0,ASN1,ASN2...) TO MONGEN BY EDITING
; B IS PRESERVED

SETASK:	HRLI	T1,440700	;FORM LH OF BYTE POINTER
	PUSH	P,B		;SAVE BYTE POINTER(NOT AN ARGUMENT)
				; CALLER MAY HAVE SOMETHING IN IT
	PUSH	P,N		;SAVE POSSIBLE SUBSTITUTION

;LOOP TO FIND LEFT PAREN
ASK0:	ILDB	CH,T1		;GET NEXT CHAR IN ASK MESSAGE
	RJUMPE	CH,<EREXIT <? No (ANS0,ASN1,...) in above question - Edit MONGEN>,>
	CAIE	CH,"("		;LEFT PAREN?
	JRST	ASK0		;NO, KEEP LOOKING
	MOVEI	N,0		;SET ANSWER INDEX TO 0
	MOVE	B,T1		;SETYUP BYTE POINTER TO PROMPTING LIST FOR GETWRD

;LOOP TO BREAK PROMPTING ANSWERS - N=0,1,... FOR EACH ANSWER
ASK2:	PUSHJ	P,GETWRD	;GET NEXT WORD INSIDE PARENS
	CAIE	CH,"*"		;SKIP IF WANT SUBSTITUTION
	JRST	ASK2A		;NO, KEEP CHECKING
	JUMPN	WD,ASK2E	;JUMP IF SOMETHING PRECEEDED *, ERROR
	MOVE	WD,(P)		;RESTORE SUBSTITUTION
ASK2A:	MOVEM	WD,ASKTAB(N)	;ANS STORE ANSWER AWAY
	CAILE	N,MP.AMX	;MORE THAN MAX. NO. OF ANSWERS FOR MONGEN?
	RJRST	<EREXIT <Too many prompts in above question - Edit MONGEN@>,>
	CAIN	CH,","		;WAS BREAK CHAR A COMMA?
	AOJA	N,ASK2		;YES, GO BACK AND GET NEXT PROMPTING WORD
	SETZM	ASKTAB+1(N)	;CLEAR LAST ARG PLUS 1 AS END FLAG
	POP	P,N		;RESTORE N
	POP	P,B		;RESTORE CALLERS BYTE POINTER
	CAIN	CH,")"		;NO, WAS BREAK RIGHT PAREN?
	POPJ	P,		;YES, RETURN
ASK3E:	EREXIT	<Special character inside () above
Edit MONGEN and remove it.>,

ASK2E:	EREXIT	<Error in above question - Edit MONGEN@>,
;ROUTINE TO FIND ONE OF A LIST OF ANSWERS IN ASKTAB USING ASCIZ STRING
;CALL:	MOVE	POSSIBLE ANSWERS TO ASKTAB+0,+1,... STORE 0 IN LAST+1
;				(SEE SETASK ROUTINE)
;	MOVE	B,BYTE POINTER TO ASCIZ STRING
;	PUSHJ	P,FNDASK(BREAK = CR) OR FNDAS1(BREAK = ANY)
;	  NOT FOUND RETURN, ERROR MESSAGE PRINTED
;	OK RETURN, N = POSITION OF ANSWER IN LIST = 0,1,2
;	N=0 IF JUST A CR TYPED
; ALLOW 0 IN ASKTAB+0 AS LEGAL ANSWER TO MEAN NO DEFAULT

FNDAS1:	PUSHJ	P,GETWRD	;GET USER SUPPLIED ANSWER
	JRST	FNDAS2		;SKIP CHECK FOR BREAK MUST BE EOL

FNDASK:	PUSHJ	P,GETWRD	;GET USER SUPPLIED ANSWER
	RJUMPN	CH,<TTYOUT <? Type one answer followed by carriage return@>
		popj p,>	;error return, so ask question again
FNDAS2:	TLZ	F,(F.MTCH)	;CLEAR MATCH FOUND FLAG
	SETZB	N,SAVN		;SET ANSWER INDEX TO 0
	JUMPE	WD,ASK8		;JUST A CR TYPED?
	MOVEI	T1,0		;NO, FORM MASK FOR ABBREVIATION
ASK5:	ROT	T1,6		;MOVE MASK LEFT 1 CHAR POSITION
	IORI	T1,77		;SET LOW ORDER CHAR MASK
	TDNN	WD,T1		;ANY CHARS IN THESE LOW ORDER POSITIONS?
	JRST	ASK5		;NO, LOOK AT NEXT CHAR TO LEFT
	LSH	T1,-6		;YES, MOVE MASK SO ONLY COVERS CHARS NOT TYPED
	MOVE	T2,ASKTAB(N)	;GET FIRST POSSIBLE ANSWER. MAYBE 0 IF
				; NO DEFAULT ALLOWED, IE (,ANS0,ANS1,...)

;LOOP TO SCAN FOR MATCH WITH PROMPTING ANSWERS STORED IN ASKTAB
ASK6:	CAMN	T2,WD		;SKIP IF NOT EXACT MATCH
	JRST	ASK9		;YES, TAKE THIS IMMEDIATELY
	TDZ	T2,T1		;CLEAR OUT CHARS USER DID NOT TYPE
	CAME	T2,WD		;MATCH THE CHARS HE DID TYPE?
	JRST	ASK7		;NO, GO GET NEXT ANSWER
	MOVEM	N,SAVN		;YES, SAVE ANSWER INDEX
	TLOE	F,(F.MTCH)	;ALREADY FOUND A MATCH?
	RJRST	<TTYOUT	<? Type enough to uniquely distinguish answer@>
		 POPJ	P,>	;ERROR RETURN
ASK7:	SKIPE	T2,ASKTAB+1(N)	;GET NEXT PROMPT, IS THERE ONE?
	AOJA	N,ASK6		;YES, BUMP ANSWER INDEX
	TLNN	F,(F.MTCH)	;NO, WAS A MATCH FOUND?
	RJRST	<TTYOUT	<? Answer with one of the choices inside parens@>
		 POPJ	P,>	;ERROR RETURN
ASK8:	MOVE	N,SAVN		;YES, RETURN THE MATCH INDEX
ASK9:	SKIPN	ASKTAB(N)	;SKIP IF DEFAULT ALLOWED
	RJRST	<TTYOUT <? No default allowed@>
		POPJ P,>
	JRST	CPOPJ1		;GIVE OK RETURN
;ROUTINE TO ASK QUESTION AND GET DECIMAL ANSWER AND CHECK FOR LIMITS
;CALL:	ASKDEC	<QUESTION(DEFAULT,MIN-MAX)[...]>
;	RETURN HERE WITH N AS VALUE OF ANSWER, CR ASSUMES DEFAULT

ASKDEC:	MOVEI	R,12		;SET RADIX TO DECIMAL
	JRST	ASKNUM		;GO ASK QUESTION AND CHECK ANSWER

;ROUTINE TO ASK QUESTION AND GET OCTAL LINE NUMBER OR CTY
;CALL:	ASKLIN	<QUESTION(DEFAULT,MIN-MAX)[...]>
;	RETURN HERE WITH N AS VALUE OR 'CTY', CR ASSUMES DEFAULT

ASKLIN:	MOVEI	R,10		;SET RADIX TO OCTAL
	TLO	F,(F.CTY)	;FLAG THAT CTY IS OK OCTAL NUMBER
	JRST	ASKNM1		;ASK QUESTION, ETC

;ROUTINE TO ASK QUESTION AND GET OCTAL ANSWER AND CHECK FOR LIMITS
;CALL:	SAME AS ASKDEC, EXCEPT ANSWER CONVERTED AS OCTAL

ASKOCT:	MOVEI	R,10		;SET RADIX TO OCTAL
ASKNUM:	TLZ	F,(F.CTY)	;FLAG THAT CTY IS NOT ACCEPTABLE NUMBER
ASKNM1:	PUSHJ	P,ASKBG		;STANDARD ASK ROUTINE BEGINNING
				; SAVE ADR OF QUESTION AND N ON STACK, OUTPUT CRLF
				; TO FILE, OUTPUT QUESTION AS COMMENT TO FILE

;LOOP TO ASK QUESTON AGAIN IF SYNTAX ERROR OR OUT OF RANGE OR /HELP
ASKAGN:	MOVE	N,(P)		;REESTORE ORIGINAL N IN CASE THIS IS LOOP
				; SO * SUBSTITUTION WILL BE THE SAME
	HRRZ	T1,-1(P)	;ADR OF MESSAGE
	PUSHJ	P,TTROUT	;ASK USER ON TTY
	SETOM	DFAULT		;SET DEFAULT TO NONE FOUND YET
				; USER CANNOT TYPE IN -1
	SETZM	MINLIM		;SET MIN LIMIT TO 0
	MOVSI	T1,'?  '	;SET MAX LIMIT TO BIG POS. NO.
				; WHICH WILL ALSO PRINT IF BELOW MIN
	MOVEM	T1,MAXLIM	;TO VERY BIG NUMBER
	HRRZ	B,-1(P)		;ADR OF QUESTION
	HRLI	B,440700	;FORM BYTE POINTER TO IT

;LOOP TO FIND FIRST PAREN
ASKN0:	ILDB	CH,B		;GET NEXT CHAR
	JUMPE	CH,ASKN2	;ERROR IF END OF STRING FOUND
	CAIE	CH,"("		;LEFT PAREN?
	JRST	ASKN0		;NO, KEEP LOOKING
;LOOP TO LOOK FOR DEFAULT, MIN AND MAX INSIDE PARENS
ASKN1:	PUSHJ	P,GETNUM	;GET NUMERIC FIELD
ASKN1B:	CAIE	CH,"*"		;SKIP IF * FOUND
	JRST	ASKN1C		;NO, PROCEED
	JUMPN	N,ASKN2		;JUMP IF SOMETHING BEFORE THE *
	MOVE	N,(P)		;PICK UP VALUE FOR SUBSTITUTION
	PUSHJ	P,SKBLNK	;SKIP TO NEXT TERMINATOR
	JRST	ASKN1B		;AND LOOP
ASKN1C:	CAIN	CH,"-"		;DASH TO SEPARATE MIN-MAX
	JRST	ASKN3		;YES, FOUND MIN
	CAIN	CH,"C"+40	;IS IT LOWER CASE C?
	TRC	CH,40		;YES, CONVERT IT
	CAIE	CH,"C"		;YES, AND IS BREAK A C?
	JRST	ASKN1A		;NO, GO CHECK OTHER BREAK CHARS
	JUMPN	N,ASKN2		;JUMP IF SOMETHING BEFORE THE *
	PUSHJ	P,GETWRD	;YES, GET REST OF WORD
	MOVEI	N,'CR '		;GET READY IF CR TO STORE CR AS DEFAULT
	CAME	WD,[SIXBIT /R/]	;IS IT R AFTER C?
				;YES,  STORE DEFAULT CR
	TLNN	F,(F.CTY)	;NOT CR, IS CTY A LEGAL ANSWER?
	JRST	ASKN1A		;NO, GO CHECK OTHER BREAKS
	CAME	WD,[SIXBIT /TY/] ;IS REST OF WORD "TY"?
	JRST	ASKN2		;NO, PRINT ERROR
	MOVEI	N,'CTY'		;STORE ARG AS TYPED
ASKN1A:	SKIPGE	DFAULT		;ALREADY STORED DEFAULT?
	MOVEM	N,DFAULT	;NO, STORE DEFAULT, IN CASE JUST TYPES CR
	CAIN	CH,")"		;IS THIS THE ONLY NUMBER
	JRST	ASKN4		;YES, GO GET USER ANSWER
	CAIN	CH,","		;IS BREAK A COMMA?
	JRST	ASKN1		;YES, GO GET NEXT NUMBER IN LIST
ASKN2:	EREXIT	<Above question must have(...,min-max) - Edit MONGEN>,
;HERE WHEN MIN FOUND
ASKN3:	MOVEM	N,MINLIM	;STORE MINIMUM LIMIT
	PUSHJ	P,GETNUM	;GET NEXT NUMBER
	CAIN	CH,"?"		;NO MAX SPECIFIED?
	JRST	ASKN3A		;YES, SET TO INFINITY
	CAIE	CH,"*"		;NO, IS MAX. SUBSTITUTABLE ARG?
	JRST	ASKN3B		;NO, GO CHECK FOR RIGHT PAREN
	SKIPA	N,(P)		;YES, USE VALUE WHICH WAS SUBSTITUTED
ASKN3A:	MOVSI	N,'?  '		;SET MAX TO PLUS INFINITY
	PUSHJ	P,SKBLNK	;SKIP TO NEXT NON-BLANK
ASKN3B:	CAIE	CH,")"		;BETTER BE RIGHT PAREN
	JRST	ASKN2		;NO, ERROR
	MOVEM	N,MAXLIM	;STORE MAX LIMIT

;HERE WHEN FIRST () ALL SCANNED FOR DEFAULT, MIN AND MAX
ASKN4:	PUSHJ	P,TTYIN		;GET USER ANSWER FROM TTY, OUTPUT TO FILE
				; AS COMMENT
	  JRST	ASKAGN		;/HELP TYPED, ASK AGAIN
	JUMPE	CH,ASKN5	;JRST CR TYPED?(GO USE DEFAULT IF YES)
	PUSHJ	P,GETNUM	;NO, GET NUMBER USER TYPED
	JUMPE	CH,ASKN5A	;END OF STRING?
	TLNN	F,(F.CTY)	;NO, IS CTY A POSSIBLE OCTAL NUMBER?
	RJRST	<TTYOUT	<? Type single number followed by carriage return@>
		 AOJA	LV,ASKAGN>  ;ASK AGAIN AT HIGHER LEVEL
	CAIN	CH,"C"+40	;IS IT LOWER CASE C?
	TRC	CH,40		;YES, CONVERT IT
	CAIE	CH,"C"		;YES, WAS BREAK C?
	JRST	ASKN4A		;NO, PRINT ERROR
	JUMPN	N,ASKN4A	;ERROR IF SOMETHING PRECEDED C
	PUSHJ	P,GETWRD	;YES, GET REST OF WORD
	CAMN	WD,[SIXBIT /TY/] ;IS WORD REST OF CTY?
	JRST	ASKN4B		;YES, ALLOW IT
ASKN4A:	RJRST	<TTYOCT	<? Type octal line number or CTY followed by carriage return@>
		 AOJA	LV,ASKAGN> ;ASK AGAIN AT HIGHER LEVEL
ASKN4B:	MOVSI	N,'CTY'		;RETURN LEFT JUSTFIED CTY AS OCTAL NO.
	JRST	ASKN6		;SKIP RANGE CHECK
;HERE IF JUST CR TYPED AS ANSWER, USE DEFAULT IF THERE IS ONE
ASKN5:	MOVS	N,DFAULT	;GET DEFAULT IF ONE SPECIFIED
	CAME	N,[SIXBIT /CR/]	;WAS DEFAULT CR?
	CAMN	N,[SIXBIT /CTY/] ;WAS DEFAULT CTY?
	JRST	ASKN6		;YES, BY PASS RANGE CHECK
	MOVSS	N		;RESTORE TO UNSWAPPED STATE
	RJUMPL	N,<TTYOUT <? No default allowed, type a number@>
		 AOJA	LV,ASKAGN> ;ASK AGAIN AT HIGHER LEVEL
;HERE TO CHECK RANGE OF ANSWER
ASKN5A:	CAMN	N,DFAULT	;SKIP IF NOT DEFAULT VALUE
	JRST	ASKN6		;IF DEFAULT NOT IN RANGE, MUST BE SPECIAL TERMINATOR
	CAML	N,MINLIM	;LESS THAN MIN?
	CAMLE	N,MAXLIM	;NO, EXCEED MAX?
	RJRST	<TTYOUT	<? Must be in range *>,MINLIM
	 	TTYOUT	<-*@>,MAXLIM
	 	AOJA	LV,ASKAGN>  ;ASK AGAIN AT NEXT LONGER MODE
ASKN6:	JRST	ASKXIT		;STANDARD ASK EXIT - RESTORE ORIGINAL
				; HELP LEVEL, POP QUESTION ADR, AND RETURN
;ROUTINE TO ASK QUESTION AND GET STRING FOR ANSWER
;CALL:	ASKSTR	<QUESTION*>,X

ASKSTR:	PUSHJ	P,ASKBG		;STANDARD ASK ROUTINE BEGINNING
				; SAVE ADR OF QUESTION AND N ON STACK, OUTPUT CRLF
				; TO FILE, OUTPUT QUESTION AS COMMENT TO FILE

;LOOP TO ASK QUESTION OVER AGAIN AFTER REQUEST FOR HELP
ASKST1:	MOVE	N,(P)		;RESTORE ORIGINAL N IN CASE THIS IS LOOP
				; SO * SUBSTITUTION WILL BE THE SAME
	HRRZ	T1,-1(P)	;ADDRESS OF MESSAGE
	PUSHJ	P,TTROUT	;TYPE IT ON TTY
	PUSHJ	P,TTYIN		;WAIT FOR INPUT, OUTPUT TO FILE
				; AS COMMENT
	  JRST	ASKST1		;/HELP TYPED, REASK AT DESIRED HELP MODE
	JRST	ASKXIT		;COMMON EXIT FROM ASK ROUTINES
				; POP OLD N AND QUESTION ADR, RESTORE HELP LEVEL
;ROUTINE TO ASK FOR M-N<EOL> OR M<EOL> ON REPEATED LINES UNTIL BLANK LINE
; SYNTAX AND OUTPUT TO FILE
;CALL:	FILOUT	<DEFINE	MAC???>	;START MACRO DEFINITION IN FILE
;	ASKMN	<ASK MESSAGE@>
;	RETURN WHEN ALL ANSWERS HAVE BEEN CHECKED AND OUTPUT

ASKMN:	MOVEI	R,^D8		;ASSUME OCTAL RADIX FOR IO
	PUSHJ	P,FILLAB	;OUTPUT LEFT ANGLE BRACKET, CRLF TO FILE
				; AS BEG OF MACRO DEFINITION
	PUSHJ	P,ASKBG		;STANDARD ASK ROUTINE BEGINNING
				; SAVE ADR OF QUESTION AND N ON STACK, OUTPUT CRLF
				; TO FILE, OUTPUT QUESTION AS COMMENT TO FILE

;LOOP TO ASK QUESTION IN CASE OF ERROR OR /HELP
ASKM0:	MOVE	N,(P)		;RESTORE ORIGINAL N IN CASE THIS IS LOOP
				; SO * SUBSTITUTION WILL BE THE SAME
	HRRZ	T1,-1(P)	;ADR OF MESSAGE
	PUSHJ	P,TTROUT	;OUTPUT TO TTY

;LOOP TO GET NEXT LINE OF INPUT
ASKMLP:	PUSHJ	P,TTYIN		;GET TTY LINE
	  JRST	ASKM0		;/HELP TYPED, ASK AGAIN
	JUMPE	CH,ASKPXT	;NO, DID HE TYPE A BLANK LINE MEANING ALL DONE?
	TLZ	F,(F.INFO);
	PUSHJ	P,GETMN		;NO, SCAN FOR M OR M-N AND STOP ON NON-BREAK
	RJUMPN	CH,<TTYOCT <? Type octal M-N or M@>
		AOJA	LV,ASKM0>  ;RAISE LEVEL OF VERBOSITY AND ASK AGAIN
	FILSTR	<L *@>;	;OUTPUT SAME STRING HE TYPED IN WITH MACRO
				; NAME PRECEDING IT SO COMMON CAN
				; REDEFINE AS IT PLEASES.
	JRST	ASKMLP		;AND GO GET NEXT LINE OF INPUT


;ROUTINE TO ASK FOR M-N,P<EOL>, GET REPEATED LINES OF INPUT
; UNTIL BLANK LINE, ANS OUTPUT TO FILE
;CALL:	FILOUT	<DEFINE	MAC???>	;START MACRO DEFINITON IN FILE
;	ASKMNP	<ASK MESSAGE@>
;	RETURN WHEN ALL ANSWERS HAVE BEEN CHECKED AND OUTPUT

ASKMNP:	MOVEI	R,^D8		;ASSUME OCTAL RADIX FOR IO
	PUSHJ	P,FILLAB	;OUTPUT LEFT ANGLE BRACKET, CRLF TO FILE
				; AS BEG OF MACRO DEFINITION
	PUSHJ	P,ASKBG		;STANDARD ASK ROUTINE BEGINNING
				; SAVE ADR OF QUESTION AND N ON STACK, OUTPUT CRLF
				; TO FILE, OUTPUT QUESTION AS COMMENT TO FILE

;LOOP TO ASK FOR MULTI LINE INPUT AGAIN IN CASE OF ERROR
ASKP0:	MOVE	N,(P)		;RESTORE ORIGINAL N IN CASE THIS IS LOOP
				; SO * SUBSTITUTION WILL BE THE SAME
	HRRZ	T1,-1(P)	;ADR OF MESSAGE
	PUSHJ	P,TTROUT	;OUTPUT TO  TTY
;LOOP TO GET NEXT LINE OF INPUT
ASKPLP:	PUSHJ	P,TTYIN		;GET NEXT LINE FROM TTY
	  JRST	ASKP0		;/HELP TYPED, ASK AGAIN
	JUMPE	CH,ASKPXT	;NO, BLANK LINE MEANING END
	TLO	F,(F.INFO)
	PUSHJ	P,GETMN		;NO, GET M OR M-N
	CAIE	CH,","		;IS BREAK A COMMA?
	JRST	ASKPE		;NO, ERROR, PRINT MESAGE AND ASK AGAIN
	PUSHJ	P,GETOCT	;GET OCTAL P
	JUMPE	CH,ASKP1	;IS THIS END OF STRING?
ASKPE:	TTYOUT	<? Type octal M-N,P or M,P@>
	AOJA	LV,ASKP0	;RAISE LEVEL AND ASK AGAIN

ASKP1:	FILSTR	<L *@>;	;OUTPUT TO FILE ENTIRE ANSWER WITH MACRO
				; NAME PRECEDING IT WHICH COMMON WILL DEFINE
				; AS IT PLEASES.
	JRST	ASKPLP		;AND GO GET ANOTHER LINE OF INTPUT
;ROUTINE TO ASK FOR M-N OR ALL, GET REPEATED LINES OF INPUT
;UNTIL BLANK LINE, AND OUTPUT TO FILE
;CALL: - SEE ASKMN

ASKTMN:	MOVEI	R,^D8		;RADIX 8
	PUSHJ	P,FILLAB	;PUT OUT RIGHT BRACKET
	PUSHJ	P,ASKBG		;STD BEGINNING

ASKTM0:	MOVE	N,(P)		;RESTORE N
	HRRZ	T1,-1(P)	;ADDR OF MSG
	PUSHJ	P,TTROUT	;OUTPUT TO TTY

ASKTLP:	PUSHJ	P,TTYIN		;GET LINE OF INPUT
	  JRST	ASKTM0		;/HELP WAS TYPED
	JUMPE	CH,ASKPXT	;EXIT IF NULL LINE
	PUSHJ	P,GETTMN	;GET ANSWERS
	RJUMPN	CH,<TTYOCT <? Type octal M-N or M@>
		     AOJA LV,ASKTM0>	;GIVE HIM HELP
	FILSTR	<KN X,*@>
	JRST	ASKTLP		;ASK AGAIN

;ROUTINE TO GET M-N OR "ALL"

GETTMN:	PUSHJ	P,GETOCT	;GET OCTAL NUMBER
	CAIN	CH,"A"		;SEE IF START OF ALL
	JRST	GETTM1
	CAIE	CH,"-"		;CHECK DASH
	POPJ	P,		;NO - ERROR RETURN
	MOVEI	CH,","		;CONVERT TO MAKE MACRO HAPPY
	DPB	CH,B		;PUT IN STRING
	PJRST	GETOCT		;GET 2ND AND RETURN

GETTM1:	PUSHJ	P,GETWRD	;GET REST OF WORD
	MOVSI	N,'ALL'		;CORRECT ANSWER
	CAME	WD,[SIXBIT "LL"] ;REMAINDER CORRECT?
	MOVEI	CH,"A"		;NO - GIVER ERROR
	POPJ	P,		;RETURN
;ROUTINE TO SETUP ALL ASK ROUTINES
; OUTPUTS CRLF TO FILE, OUTPUT QUESTION AS COMMENT, PUT ADR OF QUESTION ON STACK
; PUT ARG FOR * SUBSTITUTION (N) ON STACK SO QUESTION CAN BE REASKED.
;CALL:	MOVEI	T1,ADR OF QUESTION
;	PUSHJ	P,ASKBG
;	RETURN HERE WITH T1 ON END OF LIST

ASKBG:	EXCH	T1,(P)		;SAVE ADR OF MESSAGE ON STACK
	PUSH	P,N		;SAVE ARG FOR * SUBSTITUTION IN CASE
				; OF ERROR AND QUESTION MUST BE REASKED
				; COMMON ASK EXIT(ASKXIT) WILL POP THESE OFF
	PUSH	P,T1		;SAVE RETURN ON END
	HRRZ	T1,-2(P)	;ADR OF QUESTION
	PUSHJ	P,ASKMIC	;PASS STRING ON TO MIC
	PUSHJ	P,FCRLF		;OUTPUT CRLF TO FILE
	HRRZ	T1,-2(P)	;ADR OF QUESTION
	PJRST	FILCOM		;OUTPUT AS A COMMENT, PUTTING ; IN FRONT
				; OF EVERY LINE IN QUESTION

;HERE TO EXIT ASKMN AND ASKMNP
ASKPXT:	PUSHJ	P,FILRAB	;OUTPUT RIGHT ANGLE BRACKET,CRLF TO FILE

;HERE TO EXIT FROM ALL ASK ROUTINES
ASKXIT:	TLZ	F,(F.SUPP)	;CLEAR FILE OUTPUT SUPPRESSION
	MOVE	LV,SAVLV	;RESTORE VERBOSITY LEVEL BEFORE QUESTION ASKED
				; OR AS SET BY /HELP:XXX
	POP	P,T1		;THROW AWAY * SUBSTITUTION ARG( AC N)
				; N HAS ANSWER IN IT NOW
	POP	P,T1		;POP OFF T1
	JRST	FILOT2		;CLEAR LF FLAG SO FOLLOWING OUTPUT WONT
				; ACCIDENTALLY GET ; IN FRONT. THEN RETURN.
;THIS PAGE OUTPUTS A PROMPT STRING TO THE MIC FILE AS A COMMENT
;CALLED WITH PROMPT STRING IN T1, PRESERVES T1

ASKMIC:	SKIPN	MICFLG		;MIC FILE?
	 POPJ	P,		;NOPE
	PUSH	P,T1		;SAVE QUESTION
	PUSHJ	P,MICNL		;DELIMIT COMMENT IN .MIC FILE
	MOVEI	CH,";"
	PUSHJ	P,MICPUT
	HRRZ	T1,(P)		;GET ADDRESS OF QUESTION
	HRLI	T1,(POINT 7,,)	;FOR MIC
ASKMC1:	ILDB	CH,T1		;GET A CHAR
	JUMPE	CH,ASKMC2	;STOP HERE
	CAIN	CH,"["		;REALLY STOP HERE
	 JRST	ASKMC2		;NEXT
	CAIN	CH,"*"		;SUBSTITUTE?
	 JRST	ASKMCS		;YES
	 CAIE	CH,"@"		;IGNORE <CR><LF> FLAGS
	CAIN	CH,15		;CR?
	 JRST	ASKMC1		;IGNORE
	CAIN	CH,12		;LF?
	 RJRST	<PUSHJ	P,MICNL	;YES, NEW LINE
		 MOVEI	CH,";"
		 PUSHJ	P,MICPUT
		 JRST	ASKMC1>
	PUSHJ	P,MICPUT	;LOG AS A COMMENT
	CAIE	CH,")"		;REALLY STOP HERE
	 JRST	ASKMC1		;LOOP FOR PROMPT
	JRST	ASKMC2		;STOP

ASKMCS:	TLNN	N,770000	;NUMBER?
	 JRST	ASKMCN		;YES
	PUSH	P,T1
	MOVE	T1,[POINT 6,N]
ASKMS1:	ILDB	CH,T1		;GET NEXT LETTER
	JUMPE	CH,ASKMSE	;EXIT IF DONE
	ADDI	CH," "-' '	;MAKE ASCII
	PUSHJ	P,MICPUT	;OUTPUT
	TLNE	T1,770000	;DONE?
	 JRST	ASKMS1		;NO
ASKMSE:	POP	P,T1		;RESTORE STRING POINTER
	JRST	ASKMC1		;NEXT CHAR OF STRING

ASKMCN:	PUSH	P,T1
	MOVE	T1,N
	PUSHJ	P,MICNUM	;OUTPUT
	POP	P,T1
	JRST	ASKMC1		;CONTINUE

MICNUM:	IDIVI	T1,(R)		;RADIX DIVIDE
	HRLM	T2,(P)
	SKIPE	T1
	 PUSHJ	P,MICNUM
	HLRZ	CH,(P)
	ADDI	CH,"0"
	PJRST	MICPUT

ASKMC2:	PUSHJ	P,MICNL		;CRLF
	POP	P,T1		;RESTORE QUESTION
	POPJ	P,
SUBTTL	GET ROUTINES - SCAN AND CHECK IN CORE STRINGS

;ROUTINE TO GET OCTAL LINE NUMBER OR "CTY"
;CALL:	MOVE	B,BYTE POINTER
;	PUSHJ	P,GETLIN
;	ALWAYS RETURN, N=VALUE OR SIXBIT CTY
;	STOP IN FIRST NON-OCTAL CHAR OR NON-CTY
;	CALLER MUST CHECK FOR LEGAL BREAK CHARACTER

GETLIN:	PUSHJ	P,GETOCT	;GET OCTAL NUMBER
	JUMPN	N,CPOPJ		;RETURN IF GOT SOME VALUE
	CAIN	CH,"C"+40	;IS IT LOWER CASE C?
	TRC	CH,40		;YES, CONVERT IT
	CAIE	CH,"C"		;IS BREAK "C"?
	POPJ	P,		;NO, MAYBE 0 OR CR, LET CALLER CHECK
	PJRST	GETMN1		;SEE IF REST IS CTY

;ROUTINE TO SYNTAX CHECK M-N OR M FOLLOWED BY ANY BREAK
;CALL:	MOVE	B,BYTE POINTER
;	PUSHJ	P,GETMN
;	ALWAYS RETURN HERE, BREAK IN CH

GETMN:	PUSHJ	P,GETOCT	;GET OCTAL LINE NUMBER
	CAIN	CH,"C"+40	;IS IT LOWER CASE C?
	TRC	CH,40		;YES, CONVERT IT
	CAIN	CH,"C"		;SKIP IF NOT START OF CTY
	JRST	GETMN1		;YES, SEE IF IS CTY
	CAIE	CH,"-"		;IS BREAK -?
	POPJ	P,		;NO, LET CALLER CHECK FURTHER
	MOVEI	CH,","		;YES, CHANGE TO , SO MACRO WILL ACCEPT
	DPB	CH,B		;IN OUTPUT FILE
	PJRST	GETOCT		;GET SECOND OCTAL DIGIT

GETMN1:	PUSHJ	P,GETWRD	;YES, GET REST OF WORD
	MOVSI	N,'CTY'		;ASSUME CTY
	CAMN	WD,[SIXBIT /TY/]  ;IS IT REST OF CTY?
	JRST	NULL		;INSERT A NULL
	MOVEI	CH,"C"		;NO, RETURN ORIGINAL BREAK FOR CALLER
				; TO GET ERROR WHEN CHECKS IT
	POPJ	P,		;RETURN, CALLER CHECK FOR BREAK
NULL:	TLNN	F,(F.INFO)	;ARE WE EXPECTING MORE INFO TO FOLLOW "CTY"?
	MOVEI	CH,0		;PUT A NULL IN THE BUFFER
	DPB	CH,B		; TO BE AN EOL
	POPJ	P,		;RETURN

;ROUTINE TO GET DECIMAL FROM STRING
;CALL:	MOVE	B,BYTE POINTER
;	PUSHJ	P,GETDEC
;	ALWAYS RETURN HERE, BREAK IN CR, VALUE IN N
;CALLER MUST CHECK FOR PROPER BREAK

GETDEC:	MOVEI	R,12		;SET RADIX TO DECIMAL
	PJRST	GETNUM		;GET NUMBER


;ROUTINE TO GET OCTAL NUMBER FROM STRING
;SAME CALL AS GETDEC

GETOCT:	MOVEI	R,10		;SET RADIX TO OCTAL
				; FALL INTO GETNUM

;ROUTINE TO GET NUMBER FROM STRING
;CALL:	MOVE	R,RADIX
;	MOVE	B,BYTE POINTER
;	PUSHJ	P,GETNUM
;	ALWAYS RETURN HERE, BREAK IN CH, VALUE IN N
;CALLER MUST CHECK FOR PROPER BREAK, GETNUM STOPS ON FIRST NON-NUMERIC

GETNUM:	MOVEI	N,0		;SET VALUE TO 0
	PUSHJ	P,SKBLNK	;SKIP LEADING BLANKS(SPACES AND TABS)
	TLNE	F,(F.NEG)	;CAN CALLER HACK A NEGATIVE NUMBER?
	CAIE	CH,"-"		;NEGATIVE VALUE?
	JRST	GETN0		;NOPE, DON'T GET INTO TROUBLE
	HRLI	R,-1		;YES, REMEMBER
	ILDB	CH,B		;GET NEXT CHAR IN STRING
GETN0:	JUMPE	CH,GETN1	;IS THIS END OF STRING
	CAIL	CH,"0"		;LESS THAN 0?
	CAIL	CH,"0"(R)	;LESS THAN RADIX
	JRST	GETN1		;YES, DONE (SKIP TO FIRST NON-BLANK)
	IMULI	N,(R)		;MULTIPLY OLD NUMBER BY RADIX
	ADDI	N,-"0"(CH)	;ADD IN VALUE OF THIS CHAR
	ILDB	CH,B		;GET NEXT CHAR IN STRING
	JRST	GETN0		;GET ANOTHER CHAR
GETN1:	SKIPGE	R		;NEGATIVE VALUE ENTERED?
	MOVNS	N		;YES, NEGATE RESULT
	TLZ	F,(F.NEG)	;FORGET YOU TOLD ME I CAN DO THIS
	JUMPE	CH,CPOPJ	;DONE IF END OF LINE
	PJRST	SKBLK1		;SKIP TO FIRST NON-BLANK AND RETURN
;ROUTINE TO GET A WORD FROM AN ASCIZ STRING.  FILTERS OUT TAB, SPACE
; STOPS ON ANY NON-ALPHA NUMERIC, EXCEPT DOT, CALLER MUST CHECK FOR LEGAL BREAK
;CALL:	MOVE	B,BYTE POINTER
;	PUSHJ	P,GETWRD
;	RETURN WITH SIXBIT WD LEFT JUSTIFIED, BREAK IN CH

GETWRD:	PUSH	P,[ILDB CH,B]	;INSTRUCTION TO GET NEXT CHAR
	PUSHJ	P,GETSKB	;SKIP LEADING BLANKS(SPACES, TABS)
	MOVEI	WD,0		;SET WORD TO 0 FOR RETURN
	MOVE	T1,[XWD	440600,WD] ;SET SIX BIT BYTE POINTER TO WD

;LOOP TO ACCUMULATE AFTER LEADING SPACES AND TABS
GETWLP:	JUMPE	CH,GETWX1	;END OF STRING?
	TLNN	F,(F.PER)	;ARE SYMBOL CHARACTERS ALLOWED IN NAMES?
	JRST	GETWD1		;NO, (MUST BE SCANNING FILE NAMES)
	CAIN	CH,"."		;PERIOD(CAN BE PART OF SYMBOL)
	JRST	GETWD3		;YES, ACCEPT AS PART OF SYMBOL
	CAIE	CH,"%"		;CHECK FOR PERCENT SIGN
	CAIN	CH,"$"		;CHECK FOR DOLLAR SIGN
	JRST	GETWD3		;YES, ACCEPT AS PART OF SYMBOL
GETWD1:	CAIL	CH,"0"		;LESS THAN 0?
	CAILE	CH,"9"		;LESS THAN OR EQUAL TO 9?
	JRST	GETWD2		;YES, SEE IF LETTER?
	JRST	GETWD3		;NO, NUMBER, STORE

;HERE IF NOT NUMBER
GETWD2:	CAIL	CH,"A"+40	;LOWER CASE?
	TRC	CH,40		;YES, CONVERT TO UPPER CASE
	CAIL	CH,"A"		;LESS THAN A
	CAILE	CH,"Z"		;LESS THAN OR EQUAL TO Z?
	PJRST	GETWRX		;SKIP TRAILING BLANKS TO FIRST NON-BLANK
				; AND RETURN TO CALLER
;HERE IF A LETTER OR NUMBER - CONVERT TO SIXBIT AND STORE
GETWD3:	SUBI	CH,40		;CONVERT TO SIXBIT
	TLNE	T1,770000	;OVERFLOWED WD YET?
	IDPB	CH,T1		;NO, STORE NEXT SIXBIT CHAR
	XCT	(P)		;GET NEXT CHAR
	JRST	GETWLP		;AND CHECK IT

GETWRX:	PUSHJ	P,SKBLK1	;RETURN FIRST NON-BLANK AFTER TRAILING SPACES
GETWX1:	POP	P,(P)
	POPJ	P,
GETSKB:	XCT	-1(P)		;GET NEXT CHAR
GETSK1:	CAIE	CH," "		;SPACE?
	CAIN	CH,"	"	;TAB?
	JRST	GETSKB		;YES, GET NEXT CHAR
	POPJ	P,		;NO, FOUND NON-BLANK
;ROUTINE TO GET TTY LINE, AND SCAN FOR DEV:PI
; WHERE DEV IS 3 CHAR OR LESS AND PI IS # FOR 0-7
;CALL:	PUSHJ	P,GETDPI
;	  ERROR RETURN, /HELP , DEV TOO LONG, OR PI TOO BIG
;	OK RETURN, BREAK IN CH, WD=0 IF JUST CR TYPED

GETDPI:	PUSHJ	P,TTYIN		;GET NEXT LINE
	  POPJ	P,		;/HELP TYPED, REASK IN DESIRED HELP MODE
	MOVEI	WD,0		;SET JUST CR TYPED INDICATION
	JUMPE	CH,CPOPJ1	;JUST A BLANK LINE?
	PUSHJ	P,GETWRD	;NO, GET FIRST WORD
	JUMPE	WD,ASKDPE	;ARE THERE ANY CHAR IN DEVICE NAME?
	CAIE	CH,","		;IS BREAK CHAR COMMA?
	POPJ	P,		;NO, ERROR
	TRNE	WD,777777	;IS DEVICE 3 CHAR OR LESS?
ASKDPE:	RJRST	<TTYOUT	<? Device-mnemonic must be 3 char or less@>
		 POPJ	P,>	;GO TRY AGAIN
	PUSHJ	P,GETOCT		;GET PI NO.
	MOVE	T1,M.CPU		;MAX NUMBER OF CPUS
	IMULI	T1,SM.PI		;NUMBER OF PI CHANNELS PER CPU
	MOVE	T2,M.CPU		;NUMBER OF CPUS
	ADDI	T1,-1(T2)	;ACCOUNT FOR CHANNEL 0
	CAILE	N,(T1)		;LEGAL PI?
	RJRST	<MOVE N,T1	;GET MAXIMUM LEGAL PI
		 TTYOCT	<? PI-channel must be * or less@>
		 POPJ	P,>	;GO TRY AGAIN
	JRST	CPOPJ1		;YES, GIVE LEGAL RETURN


;ROUTINE TO SKIP LEADING BLANKS(SPACES AND TABS)
;CALL:	MOVE	B,BYTE POINTER
;	PUSHJ	P,SKBLNK	OR SKBLK1 IF FIRST CHAR ALREADY IN CH
;	FIRST NON-BLANK RETURNED IN CH

SKBLNK:	ILDB	CH,B		;GET NEXT CHAR
SKBLK1:	CAIE	CH," "		;SPACE?
	CAIN	CH,"	"	;TAB?
	JRST	SKBLNK		;YES, GET NEXT CHAR
	POPJ	P,		;NO, RETURN WITH FIRST NON-BLANK IN CH
SUBTTL	TTY INPUT ROUTINES

;ROUTINE TO ACCEPT 1 LINE FROM TTY, MOVE IT TO ASCSTR
;REMOVE EOLS, AND COMMENTS, AND ADD A NULL TO MAKE IT ASCIZ
; LOOK FOR /H AND HANDLE IT
;OUTPUT LINE WITH PRECEDING ; TO FILE
;CALL:	PUSHJ	P,TTYIN
;	  NON SKIP RETURN IF USER TYPES /HELP, CALLER MUST REASK QUESTION
;	    LEVEL SET AS USER WISHES IN LV FOR THIS QUESTION,
;	    AND IN SAVLV FOR FUTURE
;	SKIP RETURN WITH B SETUP AS BYTE POINTER TO BEG OF STRING
;	CH = 0 IF JUST A BLANK LINE TYPED
;	N = NUMBER OF CHARACTERS NOT COUNTING EOLS OR NULLS
;	B = BYTE POINTER TO STRING JUST READ IN


TTYIN:	TLO	F,(F.COM)	;FLAG OUTPUT TO FILE AS COMMENTS SO ALL
				; CALLS TO FILOUT WILL PUT PRECEDING ;
	PUSHJ	P,TTYGET	;GET NEXT CHAR, OUTPUT TO FILE, SKIP COMMENTS, EOL=0
	MOVEI	N,0		;SETUP LENGTH OF STRING TO 0
	MOVE	B,[XWD 440700,ASCSTR] ;BYTE POINTER
	PUSH	P,T1		;PRESERVE REGISTER
	MOVE	T1,B		;KEEP TRACK OF NON-BLANKS

;LOOP TO COPY CHARS FROM TTY TO CORE BUFFER(ASCSTR)
TTYINB:	IDPB	CH,B		;STORE AWAY
	JUMPE	CH,TTYINC	;IF EOL CHAR, RETURN
	CAIE	CH," "		;IF THIS IS A SPACE,
	CAIN	CH,011		;OR A TAB,
	CAIA			;(YES)
	MOVE	T1,B		;NO, REMEMBER LAST NON-BLANK SEEN
	PUSHJ	P,TTYGET	;GET NEXT CHAR
	CAIGE	N,MP.LMX	;LESS THAN MAX LINE LENGTH?
				; ASCSTR ALWAYS HAS ROOM FOR NULL
	AOJA	N,TTYINB	;YES, OK TO STORE NEXT CHAR
	POP	P,T1		;RESTORE REGISTER WE USE
	TLZ	F,(F.COM!F.BANG) ;CLEAR FLAG FOR FILE COMMENTS
	TTYOUT	<? Line too long@>
	AOJA	LV,FILOT2	;INCREASE LEVEL BY 1 FOR THIS QUESTION
				; AND PRETEND /HELP TYPED BY GIVING NO-SKIP
				; RETURN SO CALLER WILL REASK QUESTION

;HERE WHEN STRING ALL STORED IN CORE BUFFFER
TTYINC:	CAMN	T1,B		;HAVE WE CAUGHT UP YET?
	JRST	TTYIND		;YES, EXAMINE RESULTS
	IDPB	CH,T1		;NO, ADVANCE THE POINTER (STORE A NULL)
	SOJA	N,TTYINC	;DECREMENT COUNTER & TRY AGAIN

;HERE WHEN ACCOUNTED FOR TRAILING BLANKS
TTYIND:	POP	P,T1		;RESTORE OUR REGISTER
	TLZ	F,(F.COM!F.BANG) ;CLEAR FLAG FOR FILE COMMENTS
	MOVE	B,[XWD 440700,ASCSTR] ;BYTE POINTER TO CORE BUFFER
	PUSHJ	P,SKBLNK	;SKIP BLANKS(SPACE, TAB)
	CAIN	CH,"/"		;IS FIRST NON-BLANK A SLASH?
	JRST	TTYINH		;YES, GO DO /HELP
	MOVE	B,[XWD 440700,ASCSTR] ;SETUP BYTE POINTER TO
				; BEG OF CORE BUFFER FOR CALLER
	TLZ	F,(F.COM)	;CLEAR COMMENT FLAG
	JRST	CPOPJ1		;GIVE NON-HELP RETURN
;HERE ON LEADING / FROM TTYIN ROUTINE - SEE IF /HELP
; REST OF INPUT LINE ALEADY COPIED TO FILE AND CORE BUFFER(ASCSTR)
; OK TO DESTROY ASKTAB+0,... SINCE GOING TO GIVE NON-SKIP RETURN
TTYINH:	PUSH	P,N		;SAVE CCALLERS N IN CASE * SUBSTITUTION
				; WHEN QUESTION REASKED
	MOVEI	T1,[ASCIZ /(HELP)/] ;SETUP ONLY CHOICE AS IF PROMPT
	PUSHJ	P,SETASK	;IN CHOICES TABLE(ASKTAB)
	PUSHJ	P,FNDAS1	;SCAN CHARS AFTER / TO SEE IF HELP
				; OR ABBREV(ALLOW ANY BREAK)
	AOJA	LV,TTYIH1	;NO, GIVE HIM HELP WITH HELP
				; AT NEXT LONGER HELP LEVEL
	PJUMPE	CH,RAISE1	;IS BREAK EOL?(IF YES, JUST INCREASE
				; LEVEL OF VERBOSITY BY 1 FOR THIS QUESTION
				; BY ADDING TO LV BUT NOT TO SAVLV
	CAIE	CH,":"		;IS BREAK COLON?
	AOJA	LV,TTYIH1	;NO, ASK HELP QUESTION
				; AT NEXT LONGER MODE
	MOVEI	T1,[ASCIZ /(,SHORT,PROMPT,LONG)/] ;SETUP UP CHOICES TO /HELP:
				; N=0 MEANS JUST CR TYPED
	PUSHJ	P,SETASK	;IN ASKTAB+0,1,...
	PUSHJ	P,FNDASK	;FIND THE ONE HE TYPED
	  AOJA	LV,TTYIH1	;NOT FOUND, INCREASE HELP LEVEL
	JUMPE	N,RAISE1	;DID HE TYPE JUST CR?
				; IF YES, JUST INCREASE LEVEL FOR THIS QUESTION
	SUBI	N,2		;NO, FORM -1,0,1 FOR SHORT,PROMPT,LONG
	TLZ	F,(F.COM)	;CLEAR COMMENT FLAG
	JRST	HELP0		;GO STORE NEW PERMANENT HELP LEVEL

;HERE TO RAISE LEVEL 1 FOR THIS QUESTION ONLY
RAISE1:	TLZ	F,(F.COM)	;CLEAR COMMENT FLAG
	AOJA	LV,HELP1	;INCREMENT LEVEL BY ONE, BUT DO NOT
				; REMEMBER IN MEMORY(SAVLV)
				; AND RETURN
TTYIH1:	TLZA	F,(F.COM)	;CLEAR COMMENT FLAG AND GO TO TTYHP1

;ROUTINE TO TYPE HELP QUESTION
; CALLED AT BEGINNING ONCE ONLY AND WHENEVER /HELP:XXX MISTYPED
;CALL:	PUSHJ	P,TTYHLP

TTYHLP:	PUSH	P,N		;SAVE CALLER N INCASE * SUBSTITUTION
				; WHEN QUESTION REASKED
TTYHP1:	MOVEI	N,MP.MVN	;MONITOR VERSION NUMBER FOR THIS MONGEN
				; TELL USER SO HE GETS PROPER MONGEN
	ASKLST	<MONGEN for * monitors
	
MONGEN  will  generate  any  known TOPS-10 configuration.  For information 
about which configurations are supported, please refer to the SPD.
	
/HELP (PROMPT,SHORT,LONG) [In the following dialogue:
	
All numbers are decimal unless stated otherwise
Unique abbreviations are allowed everywhere to all questions
/HELP or reasks a question in the next longer mode
/HELP:xxx sets the mode permanently.
Modes are:
SHORT is short
PROMPT has choices in ()
LONG has choices in () and an explanation in []]>
	CAIN	N,1		;ANSWER 1(SHORT)
	SETOM	N		;YES, SET LEVEL TO SHORT
	CAIN	N,2		;ANSWER 2(LONG)?
	MOVEI	N,1		;YES, SET LEVEL TO LONG

;HERE TO STORE NEW PERMANENT HELP LEVEL
HELP0:	MOVEM	N,SAVLV		;SET PERMANENT LEVEL OF HELP
	MOVE	LV,N		;SET CURRENT LEVEL TO THE SAME
HELP1:	POP	P,N		;RESTORE ORIGINAL N(IN CASE THIS
				; IS HELP IN MIDDLE OF A QUESTION)
	POPJ	P,		;GIVE NON-SKIP RETURN SO QUESTION
				; WILL BE REASKED

;ROUTINE TO GET ONE CHAR FROM TTY, CHECK FOR EOLS, PUT CHAR IN  FILE
; AND SKIP OVER COMMENTS. ALSO CHECK FOR /HELP

TTYGET:	PUSHJ	P,TTYGT1	;GET NEXT CHAR FROM TTY AND PUT IN FILE
	  JRST	MICEOL		;IT WAS EOL, TELL MIC
	TLNN	F,(F.BANG)	;"!" LEGAL IN THIS INPUT LINE?
	CAIE	CH,"!"		;NO, DO WE HAVE ONE TO START A COMMENT?
	CAIN	CH,";"		;CHECK FOR SEMI-COLON ALSO
	JRST	TTYGT0		;READ COMMENT
	PUSHJ	P,MICPTD	;A GOOD CHARACTER, LOG IT AND RETURN
	POPJ	P,		;NO, RETURN

;LOOP TO THROW AWAY COMMENTS USER TYPED IN AFTER ANSWER
TTYGT0:	PUSHJ	P,TTYGT1	;YES, GET NEXT CHAR
	  JRST	MICEOL		;IT WAS AN EOL, RETURN WITH F.COM CLEARED
	JRST	TTYGT0		;NOT AN EOL, THROW IT AWAY AND GET NEXT CHAR

;ROUTINE TO GET ONE CHAR FROM TTY, CHECK FOR EOL, PUT CHAR IN FILE
;CALL:	PUSHJ	P,TTYGT1
;	  EOL RETURN CH=0, F.COM CLEARED(MAKE FILE OUTPUT NO LONGER BE COMMENTS)
;	NOT AN EOL RETURN, CH IS CHAR

TTYGT1:	SKIPE	INIFLG		;IF TTY NOT INITED
	 JRST	[INCHWL	CH	;FETCH WITH PAIN
		 JRST	TTGT2A]
	SOSG	TIBUF+2		;DECREMENT INPUT TTY BUFFER COUNT
	RJRST	<IN	TTYCHN,	;GET NEXT BUFFER FROM MONITOR
		 JRST	TTYGT2	;NO ERRORS
		 STATO	TTYCHN,IO.EOF ;END OF FILE ON TTY?
		 JRST	TTYGT2	;NO, IGNORE ERROR
		 JRST	TTYZ>	;YES, SET CONTROL Z FLAG
TTYGT2:	ILDB	CH,TIBUF+1	;GET NEXT CHAR FROM BUFFER
TTGT2A:	JUMPE	CH,TTYGT1	;IS IT NULL?
	CAIE	CH,C.RUB	;IGNORE RUBOUTS
	CAIN	CH,C.CR		;IS IT CR?
	JRST	TTYGT1		;YES, SKIP
	CAIL	CH,C.LF		;LESS THAN LINE FEED?
	CAILE	CH,C.CR		;NO, LESS THAN CARRIAGE RETURN?
	SKIPA			;NO, NOT AN EOL
	JRST	TTYEOL		;YES, CONSIDER AS EOL
	CAIE	CH,C.ESC	;ESCAPE?
	CAIL	CH,C.ALT1	;OLD ALTMODE?
	JRST	TTYEOL		;YES, TREAT AS EOL
	CAIE	CH,C.CONC	;CONTROL C?
	CAIN	CH,C.CONZ	;CONTROL Z?
	JRST	TTYZ		;YES, SET FLAG(OLDER MONITORS STORE ^Z IN BUFFER)
	PUSHJ	P,FILPUT	;STORE CHAR IN FILE
	JRST	CPOPJ1		;AND SKIP RETURN

;HERE WHEN CONTROL Z SEEN OF END OF FILE SET ON TTY
TTYZ:	CLOSE	TTYCHN,		;TURN OFF EOF FOR TTY
				; CLEAR EOF SO CAN DO MORE INPUTS
	TLO	F,(F.CONZ)	;FLAG CONTROL Z SEEN
TTYEOL:	PUSHJ	P,FCRLF		;OUTPUT CRLF TO FILE
	MOVEI	CH,0		;RETURN 0 AS EOL CHAR
	POPJ	P,		;GIVE EOL RETURN
SUBTTL	OUTPUT ROUTINES - TTY AND FILE

;ROUTINE TO TYPE INTERNAL MONGEN ERROR ON TTY AND FILE, THEN EXIT TO MONITOR
;USE TTCALL IN CASE TTY COULD NOT BE INITED
;CALL:	EREXIT	<MESSAGE>,

EREXIT:	PUSH	P,T1		;SAVE ADR OF MESSAGE
	OUTSTR	[ASCIZ /
? Internal MONGEN error - /]
	OUTSTR	(T1)		;THE CALLERS MESSAGE
	FILOUT	<@? Internal MONGEN error - >
	POP	P,T1		;RESTORE MESSAGE ADR
	PUSHJ	P,FILOUT	;OUTPUT TO FILE
	EXIT			;EXIT TO MONITOR


;ROUTINE TO OUTPUT TO FILE IN DECIMAL AND SUBSTITUTE FOR *
;CALL:	MOVEI	T1,ADR OF MESSAGE
;	PUSHJ	P,FILDEC
;	ALWAYS RETURN HERE, N PRESERVED

FILDC2:	TLO	F,(F.2DEC)	;ASK FOR AT LEAST TWO CHARS OUTPUT
FILDEC:	MOVEI	R,12		;SET RADIX TO DECIMAL
	PJRST	FILOT1		;DO OUTPUT AND SUBSTITUTION

;ROUTINE TO OUTPUT TO FILE AND SUBSTITUTE FOR *
; VALUE OR SIXBIT IN N
;CALL:	MOVEI	T1,ADR OF ASCIZ STRING TO OUTPUT
;	MOVE	N,NUMBER OR LEFT JUSTIFIED SIXBIT
;	PUSHJ	P,FILOUT
;	ALWAYS	RETURN HERE, N PRESERVED

FILCOM:	TLOA	F,(F.COM)	;SET FLAG TO PRECEDE ALL LINE WITH ;
				; AS A COMMENT IN FILE
FILOUT:	MOVEI	R,10		;SET OUTPUT RADIX TO OCTAL FOR MACRO
FILOT1:	HRLI	T1,440700	;FORM LH OF BYTE POINTER
	PUSH	P,[ILDB CH,T1]	;INSTRUCTION TO GET NEXT CHAR
FILOLP:	XCT	(P)		;GET NEXT CHAR IN OUTPUT MESSAGE
	PJUMPE	CH,FILT2A	;RETURN IF END OF STRING
	CAIN	CH,"*"		;NOT EOS, IS IT ASTERISK?
	PUSHJ	P,EITAST	;YES, SUBSTITUTE N FOR IT
	  PUSHJ	P,FILPUT	;ARG TO EITAST OR OUTPUT CHAR
	JRST	FILOLP		;LOOP AND GET NEXT CHAR


;ROUTINE TO REPLACE A "DOT" IN A SYMBOL WITH THE VALUE OF CPUN

FILCPU:	MOVEI	R,10		;OUTPUT RADIX
FILCP0:	HRLI	T1,440700	;FORM A BYTE POINTER
	PUSH	P,T1		;SAVE IT
FILCP1:	ILDB	CH,(P)		;GET NEXT CHARACTER IN OUTPUT
	PJUMPE	CH,FILT2A	;JUMP IF LAST
	PUSH	P,N		;SAVE ARGUMENT
	CAIN	CH,"*"		;SUBSTITUTE N?
	JRST	FILCP2		;YES
	MOVE	N,CPUN		;CURRENT CPU NUMBER
	CAIN	CH,"."		;A DOT?
FILCP2:	PUSHJ	P,EITAST	;YES, CONVERT CPU NUMBER
	  PUSHJ	P,FILPUT	;OUTPUT CHARACTER OR CPU NUMBER
	POP	P,N		;RESTORE ARGUMENT
	JRST	FILCP1		;LOOP OVER ENTIRE STRING

;HERE ON END OF STRING
FILT2A:	POP	P,(P)		;REMOVE INSTRUCTION FROM STACK
FILOT2:	TLZ	F,(F.COM!F.2DEC) ;NOW CLEAR FLAG SO NEXT CALLER CAN USE
				; FILOUT OR FILCOM WITHOUT HAVING TO SET OR CLEAR
				; TO INDICATE COMMENT OR NOT
	POPJ	P,		;RETURN


;ROUTINE TO OUTPUT TO BOTH FILE AND TTY
; SUBSTITUTE FOR * VALUE OR SIXBIT IN N, PRECEDE EACH
; LINE IN FILE WITH ; SO A COMMENT
;CALL:	MOVEI	T1,ADR OF ASCIZ STRING
;	PUSHJ	P,BTHOUT	FOR DECIMAL OR BTHOCT FOR OCTAL
;	ALWAYS RETURN HERE, N PRESERVED

BTHOCT:	SKIPA	R,[EXP 10]	;OCTAL RADIX
BTHOUT:	MOVEI	R,12		;OCTAL OUTPUT FOR FILE
	PUSH	P,T1		;SAVE ADR OF ASCIZ MESSAGE
	PUSHJ	P,ASKMIC	;STORE IN MIC FILE
	PUSHJ	P,FILCOM	;OUTPUT TO FILE AS A COMMENT
	POP	P,T1		;RESTORE ADR OF MESSAGE AND
	JRST	TTROUT		;REPEAT OUTPUT, BUT TO TTY: THIS TIME


;ROUTINE TO OUTPUT TO TTY IN DECIMAL
; SUBSTITUTE FOR * VALUE OR SIXBIT IN N
; OUTPUT INSIDE PARENS AND BRACKETS DEPENDING ON HELP LEVEL
;CALL:	MOVEI	T1,ADR OF ASCIZ STRING
;	PUSHJ	P,TTYOUT
;	ALWAYS RETURN HERE, N PRESERVED

TTYOCT:	MOVEI	R,10		;OCTAL RADIX(RARE) FOR TTY
	JRST	TTROUT		;GO DO REST OF TTYOUT

TTYOUT:	MOVEI	R,12		;SET RADIX TO DECIMAL FOR PEOPLE
TTROUT:	HRLI	T1,440700	;FORM LH OF BYTE POINTER
	PUSH	P,[ILDB CH,T1]	;INSTRUCTION TO GET NEXT CHAR
TTYOLP:	XCT	(P)		;GET NEXT CHAR INTO CH
	PJUMPE	CH,TTYNOW	;IF EOL, FORCE OUT TTY NOW
	CAIN	CH,"["		;LEFT BRACKET?
	TLO	F,(F.LBRK)	;YES, FLAG INSIDE EXPLANATION
	TLNE	F,(F.LBRK)	;ARE WE INSIDE AN EXPLANATION?
	JUMPLE	LV,TTYSBK	;YES, IS HELP LEVEL SHOR OR PROMPT?
	CAIN	CH,"("		;NO, LONG MODE, IS THIS CHAR LEFT PAREN?
	TLO	F,(F.LPAR)	;YES, FLAG INSIDE PROMPTING
	TLNE	F,(F.LPAR)	;ARE WE INSIDE PROMPTING?
	JUMPL	LV,TTYSPR	;YES, IS HELP LEVEL SHORT?

;HERE IF HELP LEVEL PERMITS THESE CHARS TO BE OUTPUT
	CAIN	CH,"*"		;NO, IS IT ASTRISCK?
	PUSHJ	P,EITAST	;YES, SUBSTITUTE N FOR IT
	  PUSHJ	P,TTYPUT	;ARG TO EITAST OR OUTPUT CHAR ROUTINE

;HERE TO SUPPRESS PROMPTING INSIDE PARENS(SHORT MODE ONLY)
TTYSPR:	CAIN	CH,")"		;WAS CHAR JUST OUTPUT RIGHT PAREN?
	TLZ	F,(F.LPAR)	;YES, CLEAR INSIDE PROMPTING FLAG

;HERE TO SUPPRESS EXPLANATION INSIDE BRACKETS(SHORT AND PROMPT MODES)
TTYSBK:	CAIN	CH,"]"		;WAS CHAR JUST OUTPUT RIGHT BRACKET?
	TLZ	F,(F.LBRK)	;YES, CLEAR INSIDE EXPLANATION
	JRST	TTYOLP		;LOOP AND GET NEXT CHAR
;ROUTINE TO SUBSTITUTE FOR * IN OUTPUT TO FIL OR TTY USING N
;CALL:	MOVE	N,[SIXBIT / /] OR DECIMAL NUMBER
;	MOVEI	R,RADIX
;	MOVE	T1,BYTE POINTER
;	CAIN	CH,"*"
;	PUSHJ	P,EITAST
;	  PUSHJ	P,FILPUT OR TTYPUT
;	RETURN	HERE WITH T1 AND N PRESERVED

EITAST:	PUSH	P,T1		;SAVE BYTE POINTER TO STRING
	TLNN	N,770000	;DOES N HAVE A SIXBIT ARG?
	JRST	EITAS2		;NO, OUTPUT AS A NUMBER

;HERE TO OUTPUT N AS SIXBIT FOR *
	MOVE	WD,[XWD 440600,N] ;SETUP BYTE POINTER TO SIXBIT ARG
EITAS1:	ILDB	CH,WD		;GET NEXT SIXBIT CHAR
	JUMPE	CH,TPOPJ1	;IS IT END OF SIXBIT?
	ADDI	CH,40		;CONVERT TO ASCII
	XCT	@-1(P)		;OUTPUT CHAR TO TTY OR FIL ACCORDING
				; TO ARG IN CALLING SEQUENCE
	TLNE	WD,770000	;BYTE POINTER EXHAUSTED WD?
	JRST	EITAS1		;NO, KEEP GETTING SIXBIT CHARS
	JRST	TPOPJ1		;YES, RETURN

;HERE TO CONVERT N AND OUTPUT ACCORDING TO CURRENT RADIX
EITAS2:	MOVE	WD,@-1(P)	;GET ADR OF CHAR PUT ROUTINE FOR TTY OR FILE
				; (TTYPUT OR FILPUT)
	MOVE	T1,N		;MOVE NO. TO DOUBLE AC
	CAIG	N,^D9		;SKIP IF GREATER THAN TWO CHARS
	TLNN	F,(F.2DEC)	;ONE CHAR, SKIP IF WANT AT LEAST TWO
	JRST	EITAS3		;GO AHEAD AS PLANNED
	MOVEI	CH,"0"		;OUTPUT LEADING ZERO
	PUSHJ	P,(WD)		;OUTPUT IT
EITAS3:	PUSHJ	P,EITSUB	;CALL RECURSIVE OUTPUT ROUTINE
TPOPJ1:	POP	P,T1		;RSTORE BYTE POINTER
CPOPJ1:	AOS	(P)		;SET FOR SKIP RETURN
CPOPJ:	POPJ	P,		;RETURN

EITSUB:	IDIVI	T1,(R)		;DIVIDE REMAINING NUMBER BY RADIX
	HRLM	T2,(P)		;SAVE REMAINDER ON STACK
	JUMPE	T1,EITSB1	;REMAINING NUMBER ALL GONE?
	PUSHJ	P,EITSUB	;NO, DIVIDE REMAINING NUMBER BY RADIX AGAIN
EITSB1:	HLRZ	CH,(P)		;GET MOST RECENT CHAR CONVERTED
	ADDI	CH,"0"		;CONVERT TO ASCII
	PJRST	(WD)		;OUTPUT CHAR TO TTY OR FIL AS SPECIFIED
				; IN CALLING SEQUENCE
				; RETURN TO EITSB1 UNTIL ALL CHAR OUTPUT
;ROUTINE TO OUTPUT JUST A STRING AND SUBSTITUTE ASCSTR FOR *
;CALL:	FILSTR	<MESSAGE*MESSAGE@>

FILSTR:	HRLI	T1,440700	;FORM LH OF BYTE POINTER
STRLOP:	ILDB	CH,T1		;GET NEXT CHAR
	JUMPE	CH,CPOPJ	;END OF STRING?
	CAIN	CH,"*"		;IS THIS ASTERISK?
	JRST	STRSUB		;YES, SUBSTITUTE STRING IN ASCSTR
	PUSHJ	P,FILPUT	;NO, STORE THIS CHAR IN FILE OUTPUT BUFFER
	JRST	STRLOP		;GO GET NEXT CHAR

STRSUB:	PUSH	P,T1		;SAVE BYTE POINTER SO FAR
	MOVEI	T1,ASCSTR	;SETUP TO OUTPUT FROM WHERE USER TYPED IN
	PUSHJ	P,FILOUT	;OUTPUT STRING TO FILE
	POP	P,T1		;RESTORE BYTE POINTER TO WHERE LEFT OFF
	JRST	STRLOP		;GO GET NEXT CHAR(SKIP OVER * ITSELF)

;ROUTINE TO OUTPUT LEFT ANGLE BRACKET CRLF TO FILE
;CALL:	PUSHJ	P,FILLAB

FILLAB:	MOVEI	CH,"<"		;LEFT ANGLE BRACKET
	PUSHJ	P,FILPUT	;PUT IN OUTPUT FILE
	PJRST	FCRLF		;OUTPUT CRLF TO FILE

;ROUTINE TO OUTPUT RIGHT ANGLE BRACKET CRLF TO FILE
;CALL:	PUSHJ	P,FILRAB

FILRAB:	MOVEI	CH,">"		;RIGHT ANGLE BRACKET
	PUSHJ	P,FILPUT	;PUT IN OUTPUT FILE
				; FALL INTO FCRLF
;ROUTINE TO OUTPUT CRLF TO FILE
;CALL:	PUSHJ	P,FCRLF

FCRLF:	MOVEI	CH,C.CR		;OUTPUT CR
	PUSHJ	P,FILPUT	;TO FILE
	MOVEI	CH,C.LF		;THEN LINE FEED
				; FALL INTO FILPUT
;ROUTINE TO OUTPUT 1 CHAR TO OUTPUT FILE, IF @ SUBSTITUTE CRLF
; OUTPUT TO TTY TOO IF DEBUGGING FLAG IS SET(DEBUG)
;INSERT PRECEDING ; IF FIRST CHAR ON A LINE AND F.COM SET
;CALL:	MOVEI	CH,CHAR
;	PUSHJ	P,FILPUT
;	RETURN CH PRESERVED

FILPUT:	TLNN	F,(F.SUPP)	;FILE OUTPUT SUPPRESSED?
	TLNN	F,(F.OFO)	;OUTPUT FILE OUTPUT YET?
	POPJ	P,		;NO, MUST BE ASKING QUESTION ABOUT OUTPUT FILE
	CAIN	CH,"@"		;YES, IS THIS CHAR THE CRLF CHAR?
	PJRST	FCRLF		;YES, OUTPUT CRLF TO FILE AND RETURN
	SKIPE	DEBUG		;NO, ARE WE DEBUGGING?
	TLOE	F,(F.TF)	;YES, IS THIS THE FIRST CHAR TO FIL
				; AFTER TTY OUTPUT?
	JRST	FILPU1		;NO, LEFT ANGLE ALREADY OUTPUT
	PUSH	P,CH		;YES, SAVE CHAR
	MOVEI	CH,"<"		;FLAG START OF OUTPUT WITH LEFT ANGLE
	PUSHJ	P,TTYPU1	;ON TTY
	POP	P,CH		;RESTORE REAL FIRST CHAR TO FILE
FILPU1:	TLZE	F,(F.FLF)	;WAS LAST CHAR OUTPUT TO FILE A LF?
	TLNN	F,(F.COM)	;YES, SHOULD THIS LINEN BE A COMMENT IN FILE?
	JRST	FILPU2		;NO, SO OUTPUT IT
	PUSH	P,CH		;YES, SAVE FIRST CHAR OF LINE
	MOVEI	CH,";"		;INSTEAD PUT OUT SEMI-COLON AS COMMENT CHAR
	PUSHJ	P,FILPU3	; AS FIRST CHAR ON LINE
	MOVEI	CH,";"		;OUTPUT 2 ; IN CASE COMMENT IS IN MACRO
	PUSHJ	P,FILPU3	;SO WONT SAVE COMMENT IN MACRO EXPANSION
	MOVEI	CH,"	"	;TAB
	PUSHJ	P,FILPU3	;OUTPUT TAB
	POP	P,CH		;RESTORE FIRST CHAR OF COMMENT
FILPU2:	CAIN	CH,C.LF		;IS THIS CHAR A LINE FEED?
	TLO	F,(F.FLF)	;YES, FLAG LAST CHAR OUTPUT WAS A LINE FEED
				; FOR NEXT CALL TO FILPUT
FILPU3:	SKIPE	DEBUG		;DEBUGGING SO WANT TO SEE FILE OUTPUT
	PUSHJ	P,TTYPU1	;YES, OUTPUT TO TTY TOO
	SOSG	FOBUF+2		;DECREMENT BUFFER COUNTER
	PUSHJ	P,[OUT	FILCHN,	;BUFFER FULL, GIVE TO MONITOR
		   POPJ	P,	;NO ERRORS
		   JRST FILERR]	;FILE ERROR, COMPLAIN AND START OVER
	IDPB	CH,FOBUF+1	;STORE CHAR IN BUFFER
	POPJ	P,		;RETURN
;ROUTINE TO OUTPUT CRLF TO TTY
;CALL:	PUSHJ	P,TCRLF

TCRLF:	MOVEI	CH,C.CR		;CR CHAR
	PUSHJ	P,TTYPUT	;OUTPUT TO TTY
	MOVEI	CH,C.LF		;LINE FEED CHAR
				; FALL INTO TTYPUT ROUTINE

;ROUTINE TO OUTPUT 1 CHAR TO TTY, IF @ SUBSTITUTE CRLF
;CALL:	MOVEI	CH,CHAR
;	PUSHJ	P,TTYPUT
;	RETURN CH PRESERVED

TTYPUT:	CAIN	CH,"@"		;IS THIS THE CRLF CHAR?
	PJRST	TCRLF		;YES, OUTPUT CRLF ON TTY AND RETURN
	SKIPE	DEBUG		;NO, ARE WE DEBUGGING?
	TLZN	F,(F.TF)	;YES, IS THIS FIRST CHAR ON TTY AFTER FIL?
	JRST	TTYPU1		;NO, OK TO OUTPUT
	PUSH	P,CH		;YES, SAVE REAL FIRST CHAR
	MOVEI	CH,">"		;AND INDICATE TERMINATION OF FILE OUTPUT
	PUSHJ	P,TTYPU1	;OUTPUT TO TTY
	POP	P,CH		;RESTORE REAL FIRST TTY CHAR

;SUBROUTINE TO REALLY OUTPUT 1 CHAR TO TTY
TTYPU1:	SKIPE	INIFLG		;IF TTY NOT INITED
	 JRST	TTYPU0		;DO IT SLOW WAY
	SOSG	TOBUF+2		;ROOM IN THIS OUTPUT BUFFER?
	OUTPUT	TTYCHN,		;NO, SO OUTPUT 
	IDPB	CH,TOBUF+1	;THEN STORE THIS CHAR IN BUFFER
	POPJ	P,		;RETURN

TTYPU0:	OUTCHR	CH		;YUCK
	POPJ	P,

;SUBROUTINE TO FORCE OUT CURRENT BUFFER NOW
;CALL:	PUSHJ	P,TTYNOW

TTYNOW:	SKIPN	INIFLG
	OUTPUT	TTYCHN,		;GIVE BUFFER TO MONITOR
	POP	P,(P)		;REMOVE INSTRUCTION FROM STACK
	POPJ	P,		;RETURN
;SUBROUTINE TO HANDLE EOL ON TTY INPUT FOR MIC
MICEOL:	SKIPN	MICFLG		;MIC FILE?
	 POPJ	P,		;NOPE
	PUSH	P,CH
	TLNE	F,(F.CONZ)
	 PUSHJ	P,[MOVEI CH,"^"
		   PUSHJ P,MICPTD
		   MOVEI CH,"Z"
		   PJRST MICPTD]
	MOVEI	CH,15		;CR
	PUSHJ	P,MICPTD
	MOVEI	CH,12		;LF
	PUSHJ	P,MICPTD
	POP	P,CH
	POPJ	P,

;SUBROUTINE TO PUT THE MIC FILE ON A NEW LINE
MICNL:	SKIPGE	MICFLG		;CRLF NEEDED?
	 POPJ	P,		;NOPE
	PUSH	P,T1
	PUSH	P,CH
	MOVEI	T1,[BYTE (7)15,12,0]
	PUSHJ	P,MICSTR
	POP	P,CH
	POP	P,T1
	POPJ	P,

;SUBROUTINE TO OUTPUT A STRING TO MIC
MICSTR:	HRLI	T1,(POINT 7,,)
MICST1:	ILDB	CH,T1
	JUMPE	CH,CPOPJ
	PUSHJ	P,MICPUT
	JRST	MICST1
;SUBROUTINE TO OUTPUT A SIXBIT WORD TO MIC
MICSIX:	MOVE	T2,T1		;COPY
MICSX1:	JUMPE	T2,CPOPJ	;EXIT IF DONE
	SETZ	T1,		;REMOVE JUNK
	LSHC	T1,6		;NEXT CHAR
	MOVEI	CH," "-' '(T1)	;MAKE ASCII
	PUSHJ	P,MICPUT	;TYPE
	JRST	MICSX1		;CONTINUE

;SUBROUTINE TO OUTPUT "*" IF IN COL 0, THEN 1 CHAR TO MIC
MICPTD:	SKIPL	MICFLG		;IN COL 0?
	 JRST	MICPUT		;NO
	HRLI	CH,"*"
	TLNE	F,(F.CONZ)
	 TLC	CH,"*"^!"="
	MOVSS	CH
	PUSHJ	P,MICPUT
	HLRZS	CH
;	JRST	MICPUT

;SUBROUTINE TO OUTPUT 1 CHAR TO MIC
MICPUT:	SKIPN	MICFLG		;FILE OK?
	 POPJ	P,		;NOPE
	SOSG	MOBUF+2		;ROOM IN THIS OUTPUT BUFFER?
	OUTPUT	MICCHN,		;NO, SO OUTPUT 
	IDPB	CH,MOBUF+1	;THEN STORE THIS CHAR IN BUFFER
	MOVMS	MICFLG		;NOT IN COL 0
	CAIN	CH,12		;UNLESS LF
	 SETOM	MICFLG		;IN WHICH CASE, WE ARE
	POPJ	P,		;RETURN
SUBTTL	DATA STORAGE

;CONSTANTS:

;DEFAULT FILE NAMES:
FILTAB:	SIXBIT	/SYSCNF/	;SYSGEN
	SIXBIT	/F/		;FGEN

;DISPATCH TABLE:
GENTAB:	EXP	SYSGEN		;SYSGEN
	EXP	FGEN		;FGEN


LSTD44:	I,,PAR			;INDEX BY DC44 NUMBER
	I,,PAP			;PA611R AND PA611P
	I,,LPC			;END LPC11
	I,,PCR			;END PC11 READERS
	I,,PCP			;AND PC11 PUNCHES
TYPDEV=.-LSTD44-1
;VARIABLES:
; THESE ARE STRICTLY INTERNAL TO MONGEN AND ARE NEVER OUTPUT IN FILE
;ONES NOT CLEARED IN MAIN LOOP, INSTEAD SET TO INITIAL VALUES ONLY ON GET.
; THUS ^C START DOES NOT INITIALIZE:


HELPF:	-1		;FLAG TO TYPE /HELP ONLY ONCE THRU LOOP OR START
DEBUG:	0		;PATCH NON-ZERO TO DEBUG BY HAVING FIL OUTPUT TO TTY TOO
			; COME OUT ON TTY INSIDE <>
SAVLV:	0		;CURRENT PERMANENT VERBOSITY LEVEL FOR ASKING QUESTIONS
			; AC LV MAY BE DIFFERENT IF USER HAS CHANGED
			; LEVEL FOR THIS QUESTION ONLY
			; LEVELS ARE -1 FOR SHORT, 0 FOR PROMPT,
			; AND 1 OR GREATER FOR LONG
			; INITIALLY SET TO PROMPT ON A GET

BITTBL:
ZZ==-1			;START BIT NUMBERING
REPEAT ^D36,<EXP 1B<<ZZ==ZZ+1>>> ;BUILD INDEXABLE LIST OF BITS
IF2,PURGE ZZ
SUBTTL	IMPURE STORAGE FOR FGEN


FTINI:	BLOCK	1	;INITIALIZATION FLAG
FTMOD:	BLOCK	1	;OUTPUT MODE FLAG
FTNAM:	BLOCK	1	;FEATURE TEST TO ADD OR CHANGE
FTCFG:	BLOCK	1	;FEATURE TEST CONFIG BITS
FTTXT:	BLOCK	MP.FTL	;FEATURE TEST DESCRIPTIVE TEXT

FTINAM:	BLOCK	FTLEN	;FEATURE TEST NAMES
FTICFG:	BLOCK	FTLEN	;FEATURE TEST CONFIG BITS
FTCTXT:	BLOCK	MP.FTA*<<MP.FTL/5>+1> ;CUSTOMER DESCRIPTIVE TEXT STORAGE
RUNDEV:	BLOCK	1	;DEVICE FROM RUN OR GET
RUNPPN:	BLOCK	1	;DIRECTORY FROM RUN OR GET
RUNPTH:	BLOCK	.PTMAX	;PATH BLOCK POINTED TO BY RUNPPN IF SFD
MOBUF:	BLOCK	3	;MIC OUTPUT BUFFER
MICFLG:	BLOCK	1	;0 IF MIC FILE NOT OPEN
MICBUF:	BLOCK	NMICBF*203	;BUFFERS FOR MIC FILE
INIFLG:	BLOCK	1		;FLAG FOR TTY NOT INIT'D YET

;VARIABLES CLEARED EACH TIME THROUGH MAIN LOOP FOR A NEW GEN:

VARBEG:			;FIRST LOC CLEARED ON MAIN LOOP
PDLIST:	BLOCK	MP.PDL+1	;PD LIST
ASKTAB:	BLOCK	MP.AMX+1	;TABLE TO STOR POSSIBLE ANSWERS
				; SETUP BY ASKLST WITH PROMPTING INSIDE ()
				; LAST ENTRY MUST BE ZERO AS FLAG OF END
				; FIRST ENTRY MAYBE 0 TO MEAN NO DEFAULT
				; IE (,ANS0,ANS1,...)
ASCSTR:	BLOCK	<MP.LMX+4+1>/5	;STRING FOR TTY INPUT LINE(SEE TTYIN)
			; ENOUGH ROOM FOR MP.LMX CHAR, PLUS NULL
SAVN:	BLOCK	1	;PLACE TO SAVE MATCH INDEX IN ASKLST SUB
CNFIND:	BLOCK	1	;INDEX OF SYSTEM TYPE
MINLIM:	BLOCK	1	;MIN VALUE FOR ASK QUESTION.  SET BY NOS. INSIDE ()
			; WHICH PRECED A DASH.
MAXLIM:	BLOCK	1	;MAX VALUE FOR ASK QUESTION.  SET BY NOS. INSIDE
			; WHICH FOLLOW A DASH.
DFAULT:	BLOCK	1	;DEFAULT FOUND FIRST INSIDE () IN ASK QUESTION
			; BY SETLST ROUTINE
WCHGEN:	BLOCK	1	;WHICH GEN, 0=SYS, 1=F
WCHNAM:	BLOCK	1	;WHICH GEN NAME, LH=SIXBIT SYS, F
CPU:	BLOCK	1	;LOOP COUNTER FOR CPU LOOP
CPUN:	BLOCK	1	;LOOP COUNTER FOR DEVICES ON CPUS OTHER THAN 0
SMP:	BLOCK	1	;FLAG FOR MULTI-CPU MONITOR GENERATION
UNAUTC:	BLOCK	1	;FLAG WHETHER TO ASK ABOUT OBSOLETE HARDWARE
DLSCAN:	BLOCK	1	;FLAG WHETHER TO ASK ABOUT DATA-LINE SCANNERS
DTA:	BLOCK	1	;LOOP COUNTER FOR DTA LOOP
RX20:	BLOCK	1	;LOOP COUNTER FOR RX20 LOOP
STANAM:	BLOCK	1	;SYSTEM-WIDE STATION NAME
MAXRTY:	BLOCK	1	;MAXIMUM POSSIBLE M.RTTY
M.TLTL:	BLOCK	1	;LOCAL LINES TALLY FOR MAXRTY
M.XTL:	BLOCK	1	;DA28 LINES TALLY FOR MAXRTY
M.RTTY:	BLOCK	1	;ANSWER TO NUMBER OF REMOTE TTYS IN SYSTEM

MDTBUF:	BLOCK	MP.AQB	;QUESTION TEXT BUFFER
MDTSYM:	BLOCK	1	;M.XXXX SYMBOL ADDRESS
MDTSIX:	BLOCK	1	;SIXBIT REPRESENTATION OF M.XXXX
MDTKON:	BLOCK	1	;SIXBIT DRIVER NAME
MDTBIT:	BLOCK	1	;FLAGS
MDTTXT:	BLOCK	1	;ADDRESS OF INTRODUCTORY TEXT
MDTRES:	BLOCK	SM.CPU	;STORAGE FOR PER-CPU COUNTERS
Z.MDTB==.		;START OF MONGEN'ED DEVICE DATA TO ZERO
MDTCPU:	BLOCK	1	;CPU
MDTDVC:	BLOCK	1	;DEVICE CODE/IVI
MDTUNI:	BLOCK	1	;MASSBUS UNIT NUMBER
MDTDRV:	BLOCK	1	;DRIVE NUMBER
MDTFLG:	BLOCK	1	;-1 IF ALL DRIVES ON KONTROLLER
			; 0 IF NOT SPECIFIED
			; 1 IF NO DRIVES ON KONTROLLER
MDTUAD:	BLOCK	1	;UNIBUS ADDRESS OF KONTROLLER
Z.MDTE==.-1		;END OF MONGEN'ED DEVICE DATA TO ZERO
UCMBGN:			;FIRST WORD OF USER DEFINED COMMAND BLOCK
UCMCMD:	BLOCK	1	;COMMAND NAME
UCMPRG:	BLOCK	1	;PROGRAM NAME
UCMADR:	BLOCK	1	;DISPATCH ADDRESS
UCMBP1:	BLOCK	1	;INITIAL BYTE POINTER TO FLAGS/UNIQUE BITS
UCMBP2:	BLOCK	1	;FINAL BYTE POINTER TO FLAGS/UNIQUE BITS
UCMEND==.-1		;END OF BLOCK

TCLASS:	BLOCK	1	;TTY CLASS BEING DEFINED
TLENG:	BLOCK	1	;FORMS LENGTH
TWIDTH:	BLOCK	1	;CARRIAGE WIDTH
TFILL:	BLOCK	1	;FILLER CLASS
TANSLV:	BLOCK	1	;PURE ANSI PART OF DECLVL
TDECLV:	BLOCK	1	;FULL CONFORMANCE LEVEL TO DEC STD 070
TBACKP:	BLOCK	1	;BACKSPACE-SPACE-BACKSPACE RUBOUT TABLE
TERASE:	BLOCK	1	;ERASURE TABLE POINTER
CLSCHB:	BLOCK	TCRLEN	;CLASS CHARACTERISTICS

TTYPE:	BLOCK	1	;TTY TYPE BEING DEFINED
TCATTR:!		;CLASS ATTRIBUTES
TONATR:	BLOCK	ATRLEN	;ATTRIBUTES TO IOR
TOFATR:	BLOCK	ATRLEN	;ATTRIBUTES TO ANDCAM
CURCHR:!		;CURRENT CHARACTERISTICS BLOCK IN PARSE
CURATR:	BLOCK	1	;CURRENT ATTRIBUTES BLOCK IN PARSE

;FILE 4 WORD ENTER BLOCK:
OUTNAM:	BLOCK	1	;FILE NAME
OUTEXT:	BLOCK	1	;FILE EXTENSION
OUTDAT:	BLOCK	1	;FILE DATE
OUTPPN:	BLOCK	1	;FILE PROJECT, PROGRAMMER NUMBER
SAVPPN:	BLOCK	1	;SAVE PPN FOR MESSAGE AFTER ENTER
;BUFFER HEADERS:
TIBUF:	BLOCK	3	;TTY INPUT BUFFER HEADER
TOBUF:	BLOCK	3	;TTY OUTPUT BUFFER HEADER
FOBUF:	BLOCK	3	;FILE OUTPUT BUFFER HEADER
FHIBUF:	BLOCK	3	;FGEN AUXILIARY HELP FILE INPUT BUFFER HEADER

;BUFFERS
FILBUF:	BLOCK	NFILBF*203	;BUFFERS FOR OUTPUT FILE
;VARIABLES WHICH ARE ALSO OUTPUT IN FILE AS SYMBOLS

;***************************************************************
;NOTE:	MACRO REQUIRES A ; AFTER ANGLE BRACKET IN CALL, ELSE TAB
; SNEAKS IN BETWEEN SYMBOL AND ;
;***************************************************************

;MACRO TO DEFINE CONSECUTIVE VARIABLES USED BY AOS(N) TRICK
;ORDER MUST BE THE SAME AS IN PROMPTING ANSWERS INSIDE PARENS

DEFINE	V (A)<
IRP (A) <M.'A:	BLOCK	1
>>

V <RTCO>;			;INCLUDE MONITOR OVERHEAD IN RUNTIME
V <EMRT>;			;EBOX/MBOX RUNTIME ACCOUNTING
V <XPI>;			;EXCLUDE PI TIME FROM USER RUNTIME
V <CPU>;			;NO. OF CPUS
V <KL10>;			;KL10 CPU
V <KS10>;			;KS10 CPU
V <C0SN,C1SN,C2SN,C3SN,C4SN,C5SN>;  ;CPU SERIAL NOS.
V <MON,DAY,YEAR>;		;MONTH, DAY, YEAR SYMBOLS
V <LOK>;			;INCLUDE LOCK UUO

;AUTOCONFIGURED DEVICES
Z.ATOB:!			;START OF AUTOCONFIGURED DEVICE STORAGE
V <CDP,CP10>;					;CARD PUNCH
V <CDR,CR10,CR20,DCR>;				;CARD READER
V <DISK,DPX,DRX,DSX,FHX,FSX,MDX,RAX,RNX,RPX>;	;DISKS
V <ENET>;					;ETHERNET
V <LPT,LP10,LP20,DLP>;				;LINE PRINTERS
V <PTP,PTR>;					;PAPER TAPE PUNCH/READER
V <PLT,XY10>;					;PLOTTERS
V <SA10>;					;SA10 SERVICE
V <SCA>;					;SCA SERVICE
V <TAPE,TS10,TX01,TM10,TC10,TM02,DX20,TM78>;	;TAPES
Z.ATOE==.-1			;END OF AUTOCONFIGURED DEVICE STORAGE

V <SETS>;			;DISK SET MASK
V <DTEN>;			;TOTAL NUMBER OF DTE20S
;HDWGEN:
V <VP10,340,VBXC>;		;TYPE OF DISPLAY
V <DAS78,D78L,0D78,1D78,2D78,3D78,4D78,5D78,6D78,7D78>;	;DAS78
V <DN6D,D60L,0D60,1D60,2D60,3D60,4D60,5D60,6D60,7D60,8D60,9D60,AD60,BD60>;	;DN60

;TTYGEN:
V <DC10,DC68,DC76>;		;TYPE OF TERMINAL COMMUNICATIONS EQUIPMENT
V <TTG0,TTG1,DSG0,DSG1,68L0,68L1,D70N,D71N,D72N,D73N,D74N,D75N,D76N,D77N>
V <DZNL>;
V <TTDN>;			;TOTAL NUMBER OF RSX20-F TERMINALS
	DEFINE	BLOK4(PREFIX,POSTFX)
<	IRP	PREFIX
<
PREFIX:
ZZZ=0
	REPEAT	8,<
	WORD	(PREFIX,\ZZZ,POSTFX)
ZZZ=ZZZ+1
>	;;END OF REPEAT 4
	WORD	(PREFIX,8,POSTFX)
	WORD	(PREFIX,9,POSTFX)
	WORD	(PREFIX,A,POSTFX)
	WORD	(PREFIX,B,POSTFX)
>	;;END OF IRP PREFIX
>	;;END OF DEFINE BLOK4

	DEFINE	WORD(A,B,C)
<A'B'C:	EXP	0
>

;NOTE THE POSTFIX IS A NOOP FOR PREFIXES OF 5 CHARACTERS E.G. TYPNU
M.DC44:	EXP	0	;NUMBER OF DC44S
TYPNUM:	EXP	0	;TOTAL NUMBER OF DC44 FRONT END DEVICES
	BLOK4	<TYPNU,PAR,PAP,LPC,PCR,PCP>,N

M.DC75:	EXP	0	;NUMBER OF DC75S OF DAS85S
M.0D85:	EXP	0	;SYMBOL INDICATING PORT PRESENT
M.1D85:	EXP	0
M.2D85:	EXP	0
M.3D85:	EXP	0
M.4D85:	EXP	0
M.5D85:	EXP	0
M.6D85:	EXP	0
M.7D85:	EXP	0
M.D78N:	EXP	0	;COUNT OF NUMBER OF DAS78S IN THE SYSTEM
M.DN60:	EXP	0	;COUNT OF GENERIC DN60 DEVICES
M.DN6K:	EXP	0	;COUNT OF KS10/DUP DN60 DEVICES
M.DN6R:	EXP	0	;COUNT OF KS10 DMR DN60 DEVICES
M.DN6S:	EXP	0	;COUNT OF KL10/DTE BASED DN60 DEVICES
M.KDPN:	EXP	0
M.DMRN:	EXP	0
M.DN8S:	EXP	0
M.DDCN:	EXP	0
M.CONN:	EXP	0	;ACCUMULATES DEFAULT # OF CONNECTS
VAREND==.-1		;LAST LOC TO CLEAR IN MAIN LOOP FOR NEW GEN
	END	BEGINA