TITLE MONGEN - PROGRAM TO DEFINE MONITOR AND NETWORK CONFIGURATIONS - V103 SUBTTL T. HASTINGS/TH/EP/DAL/JBS 21-JUNE-88 EDITNO==327 ;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 ;VERSION NUMBER BYTE (3)VWHO(9)VERSION(6)VMINOR(18)EDITNO RELOC ;SYMBOLS WHICH ARE PARAMETERS OF MONGEN ITSELF(PREFIX MP) IFNDEF MP.MVN, ;MONITOR VERSION NUMBER IFNDEF MP.PDL, ;PD LIST LENGTH IFNDEF MP.AMX, ;MAX NO. OF ANSWERS INSIDE PARENS IFNDEF MP.SMX, ;MAX SYSTEM (KL10 = 0, KS10 = 1) IFNDEF MP.AQB, ;LENGTH OF AUTOCONFIGURE QUESTION BUFFER IFNDEF MP.LMX, ;MAX. NO. OF CHAR ALLOWED IN INPUT LINE ; NOT COUNTING EOL OR NULL IFNDEF MP.FTA, ;NUMBER OF FEATURE TESTS THAT MAY BE ADDED IFNDEF MP.FTL, ;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 CAN ALWAYS BE ON THE SAME LINE, EVEN WHEN CRLF IS WANTED. ;EXAMPLE: ; ASKYN ,OSN ; FILOUT ,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 , ,> ;;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, ;;TURN LISTING BACK ON UNLESS INSIDE RJRST MACRO > DEFINE ASKYN (A,B)< CAL ASKYN,,B> DEFINE ASKDEC (A,B)< CAL ASKDEC,,B> DEFINE ASKOCT (A,B)< CAL ASKOCT,,B> DEFINE ASKLIN (A,B)< CAL ASKLIN,,B> DEFINE ASKSTR (A,B)< CAL ASKSTR,,B> DEFINE ASKLST (A,B)< CAL ASKLST,,B> DEFINE 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 /M.XXXX/ EXP ;;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 , ,> ;;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, ;;TURN LISTING BACK ON UNLESS INSIDE RJRST MACRO > ;OUTPUT IMMEDIATE VALUE DEFINE CAL3 (XXX,A,B,%C)< XLIST ;;ALWAYS TURN OFF LISTING IFNB , ,> ;;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, ;;TURN LISTING BACK ON UNLESS INSIDE RJRST MACRO > DEFINE ASKMN (A,B)< CAL2 ASKMN,,B> DEFINE ASKMNP (A,B)< CAL2 ASKMNP,,B> DEFINE ASKTMN (A,B)< CAL2 ASKTMN,,B> DEFINE BTHOUT (A,B)< CAL2 BTHOUT,,B> DEFINE BTHOCT (A,B)< CAL2 BTHOCT,,B> DEFINE FILOUT (A,B)< CAL2 FILOUT,,B> DEFINE FILCPU (A,B)< CAL2 FILCPU,,B> DEFINE FILCOM (A,B)< CAL2 FILCOM,,B> DEFINE FILOUD (A,B)< CAL3 FILOUT,,B> DEFINE TTYOUT (A,B)< CAL2 TTYOUT,,B > DEFINE TTYOCT (A,B)< CAL2 TTYOCT,,B> DEFINE FILSTR (A,B)< CAL2 FILSTR,,B> DEFINE FILDEC (A,B)< CAL2 FILDEC,,B> DEFINE FILDC2 (A,B)< CAL2 FILDC2,,B> DEFINE EREXIT (A,B)< CAL2 EREXIT,,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, ;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 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 ,,> ;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 TLNE F,(F.CONZ) ;DID USER TYPE CONTROL Z? RJRST 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 ,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 ,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 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 ,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 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 ,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 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 () FT (EMRT ,,) FT (KL10 ,,) FT (KS10 ,,) FT (MP ,,) FT (XMON ,,) MT () FT (CIDNET,<0>,) FT (DECNET,,) FT (ENET ,,) FT (MIC ,,) FT (MLOG ,,) FT (NET ,,) MT () FT (CIDSK ,,) FT (CITAP ,<0>,) FT (DUAL ,,) FT (FDAEM ,,) FT (MPXSER,,) FT (SCA ,,) MT () FT (NSCHED,,) FT (PSCD ,,) FT (RSP ,,) MT () FT (HPQ ,,) FT (LOCK ,,) FT (PEEKSP,,) FT (POKE ,,) FT (RTTRP ,,) MT () FT (MDA ,,) FT (PATT ,,) FT (TLAB ,,) MT () FT (IP4 ,,) FT (SLIP ,,) FT (DUNA ,,) > ;END DEFINE FET SUBTTL FGEN -- BUILD THE FEATURE TEST TABLES DEFINE MT (TXT), DEFINE FT (NAM,CFG,TXT,HLP),> FTPNAM: FET BLOCK MP.FTA FTLEN==.-FTPNAM DEFINE MT (TXT), DEFINE FT (NAM,CFG,TXT,HLP), FTPCFG: FET BLOCK MP.FTA DEFINE MT (TXT), DEFINE FT (NAM,CFG,TXT,HLP), ZZ==-1 FTPTXT: FET REPEAT MP.FTA,*> 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 HRR F,[EXP F.KL10,F.KS10](N) ;LOAD UP PROCESSOR TYPE TLO F,(F.SUPP) ;SUPPRESS FILE OUTPUT ASKLST 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,[-,,] ;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 FILOUT @@@> MOVEI N,EDITNO ;MONGEN<=>COMMON "VERSION" NUMBER FILOUT ,N ;OUTPUT TO FILE PUSHJ P,ASKSYS ;FIND OUT WHAT TYPE OF SYSTEM FILOUT ,M.KL10 FILOUT ,M.KS10 SKIPE M.KS10 JRST HDWGN1 MOVEI N,SM.CPU ASKDEC HDWGN1: MOVEM N,M.CPU MOVEM N,SMP ;FLAG FOR MULTI-CPU SOS SMP ;NON-ZERO IF SO FILOUT ,N ASKNAM: ASKSTR CAILE N,^D24 ;24 OR LESS? RJRST 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 @> 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 ;START MACRO DEFINITION IN FILE PUSHJ P,FILLAB ;OUTPUT LEFT ANGLE BRACKET TO FILE, CRLF FILDC2 ,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 FILOUT ,M.DAY FILOUT ,M.YEAR JRST ASKSER ;JUMP AROUND MONTH NAME TABLE MONNAM: ;TABLE OF SHORT MONTH NAMES DEFINE YY(SYL),> YY ASKSER: SETZB I,CPU ;SET LOOP COUNTER TO 0 ;LOOP TO ASK FOR SERIAL NUMBERS FOR ALL CPUS IN SYSTEM ASKSLP: ASKDEC ,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 ,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 FILOUT ,M.C1SN FILOUT ,M.C2SN FILOUT ,M.C3SN FILOUT ,M.C4SN FILOUT ,M.C5SN SETZM M.DN60 ;CLEAR COUNT OF DN60 DEVICES IN SYSTEM ASKYN FILOUT ,N ASKEMT: SKIPN M.KL10 ;KL10 SYSTEM? JRST NOEMRT ;NO, NO EBOX/MBOX TIME ACCOUNTING ASKYN MOVEM N,M.EMRT ;SAVE FOR LATER FILOUT ,M.EMRT SKIPN M.EMRT JRST NOEMR1 ;NO PI EXCLUSION EITHER ASKYN MOVEM N,M.XPI ;SAVE FILOUT ,M.XPI JRST ASKACV ;NOW GO ASK ABOUT ACCOUNT VALIDATION NOEMRT: FILOUT NOEMR1: FILOUT ASKACV: ASKYN FILOUT ,N MOVEI N,0 ;ASSUME NO MOS MEMORY SUPPORT SKIPN M.KL10 ;A KL10? JRST MOSEND ;NO, CAN'T HAVE RECONFIGURABLE MOS ASKYN MOSEND: FILOUT ,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 (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,,< 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 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, 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,,< 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,,< 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 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,,< 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 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,,< 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,,< 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,,< 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,,< 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,,< 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,,< 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,,< 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,,< 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,,< 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,,< 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,,< 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,,< 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,,< This option provides support for LP20 UNIBUS line printers. >) MOVE T1,M.LP20 ;ANSWER IORM T1,M.LPT ;ACCUMULATE ASKAUT (XY10,PLTSER,F.KL10,,< This option provides support for I/O bus plotters. >) MOVE T1,M.XY10 ;ANSWER IORM T1,M.PLT ;ACCUMULATE ASKAUT (CR10,CDRSER,F.KL10,,< 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,,< 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,,< This option provides support for CD20 UNIBUS card readers. >) MOVE T1,M.CR20 ;ANSWER IORM T1,M.CDR ;ACCUMULATE ASKAUT (CP10,CDPSER,F.KL10,,< This option provides support for card punches. >) MOVE T1,M.CP10 ;ANSWER IORM T1,M.CDP ;ACCUMULATE ASKAUT (PTP,PTPSER,F.KL10,,< This option provides support for paper tape punches. >) ; MOVE T1,M.PTP ;ANSWER ; IORM T1,M.PTP ;ACCUMULATE ASKAUT (PTR,PTRSER,F.KL10,,< 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 FILOUT ,M.TAPE FILOUT ,M.CDP FILOUT ,M.CDR FILOUT ,M.LPT FILOUT ,M.PLT FILOUT ,M.PTP FILOUT ,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 ,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 ,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 ,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 ;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 ,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 ,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 FILOUT ,M.DC68 FILOUT ,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 FILOUT FILOUT ASKDEC < DZ-11 TTY lines (0-32) [ Respond with the total number of TTY lines.]> MOVEM N,M.DZNL SETZM CPUN ;FIRST CPU FILCPU ,N ASKTT2: FILOUT ,M.D70N FILOUT ,M.D71N FILOUT ,M.D72N FILOUT ,M.D73N FILOUT ,M.D74N FILOUT ,M.D75N FILOUT ,M.D76N FILOUT ,M.D77N FILOUT ;DUMMY SYMBOLS SINCE DC76 ONLY ON DL10 FILOUT FILOUT FILOUT FILOUT ,M.TTG0 FILOUT ,M.TTG1 FILOUT ,M.DSG0 FILOUT ,M.DSG1 FILOUT ,M.68L0 FILOUT ,M.68L1 FILOUT ,M.DZNL FILOUT ,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 ;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 PUSHJ P,FILLAB FILOUT <@ OPRL *@>,N PUSHJ P,FILRAB FILOUT <@> ASKDSD: FILOUT ;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 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 FILOUT ,N FILOUD ,MD.SEG ASKCOR: MOVEI N,SM.MPI ;MAXMUM NUMBER OF PAGES ASKDEC ,N FILOUT ,N MOVEI N,^D4096 ;UP TO 4 MILLION WORDS ALLOWED ASKNKC: ASKDEC FILOUT ,N ASKTPS: SKIPN M.KS10 ;KS10? JRST ASKRTD ;NO ASKLST SKIPN N ;SKIP IF 50 TROA N,^D60 ;NO, 60 MOVEI N,^D50 ;50 FILOUT ,N ASKRTD: SKIPN M.KS10 ;KS10? JRST ASKRT0 ;NO--GO ON FILOUT ;YES--NO REAL TIME JRST ASKLOK ;GO ON ASKRT0: MOVEI N,SM.RTD ;MAXIMUM NUMBER OF REAL TIME DEVICES ASKDEC FILOUT ,N JUMPN N,ASKLK1 ;DO NOT ASK ABOUT LOCKING IF REAL TIME ; SINCE MUST HAVE LOCKING FOR REAL TIME ASKLOK: ASKYN ASKLK1: FILOUT ,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 ASKMG1: FILOUT ,N ASKEVM: SKIPN N,M.LOK ;LOCK UUO INCLUDED? JRST ASKEV1 ;NO, NO LOCKING IN EVM EITHER ;DEFAULT (FOR DTELDR) IS 10. PAGES ASKDEC ASKEV1: FILOUT ,N ASKHPQ: MOVEI N,SM.HPQ ;MAXIMUM NUMBER OF HIGH PRIORITY QUEUES ASKDEC FILOUT ,N ASKMET: ASKLST FILOUT ,N ASKKAS: ASKLST FILOUT ,N ASKMSG: ASKYN FILOUT ,N ASKPSI: ASKYN FILOUT ,N ASKIPC: ASKYN FILOUT ,N ASKENQ: ASKYN FILOUT ,N DSKSET: ASKSTR 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 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 AOJA LV,DSKSET DSKER1: TTYOUT AOJA LV,DSKSET DSKSE4: HLRZ N,M.SETS ;GET LH OF VALUE FILOUT ;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 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 NODIS: JUMPE N,ASKDS1 ;ANY DISPLAYS? ASKLST 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 FILCPU ,M.VP10 FILOUT ,M.340 FILCPU ,M.340 FILOUT ,M.VBXC FILCPU ,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 ,N ; FILCPU ,N ; JRST ASKDS3 ;SKIP AROUND CPU1-N CASE ASKDS2: FILCPU FILCPU FILCPU FILCPU 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 NODTAS: FILCPU ,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 ,N ;FIRST HALF EXCH N,(P) FILOUT <*@>,N ;OUTPUT EXCH N,(P) FILCPU ,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 FILCPU ,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 ,N ;FIRST HALF EXCH N,(P) FILOUT <*@>,N ;OUTPUT EXCH N,(P) FILCPU ,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 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 NODA28: FILCPU ,N SKIPE CPUN JRST NDA28B FILOUT ,N NDA28B: JUMPE N,XTCEND ASKDEC FILOUT ,N MOVEM N,M.XTL XTCEND: FILCPU ,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 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 FILCPU ,M.1D78 FILCPU ,M.2D78 FILCPU ,M.3D78 FILCPU ,M.4D78 FILCPU ,M.5D78 FILCPU ,M.6D78 FILCPU ,M.7D78 FILCPU ,M.D78L FILCPU ,M.D78L FILCPU ,M.D78L JRST ASK78C ;DONE DAS78S. ASK78S: MOVE N,-1(P) ;GET A NUMBER FOR DAS78 TTYOCT <@For DAS78 *:@@> ASKDEC PUSH P,N ;SAVE PORT NUMBER ON STACK ASKDEC 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 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 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 FILCPU ,M.1D60 FILCPU ,M.2D60 FILCPU ,M.3D60 FILCPU ,M.4D60 FILCPU ,M.5D60 FILCPU ,M.6D60 FILCPU ,M.7D60 FILCPU ,M.D60L SKIPE CPUN JRST ASK60D FILOUT ,M.0D60 FILOUT ,M.1D60 FILOUT ,M.2D60 FILOUT ,M.3D60 FILOUT ,M.4D60 FILOUT ,M.5D60 FILOUT ,M.6D60 FILOUT ,M.7D60 FILOUT ,M.D60L JRST ASK60D ;DONE DN60S. ASK60S: MOVE N,-1(P) ;GET A NUMBER FOR DN60 TTYOCT <@For DN60 *:@@> ASKOCT PUSH P,N ;SAVE PORT NUMBER ON STACK ASKDEC 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 ;NO DN60 DEVICES ON KMC/DUP-11S FILOUT ;NO DN60 DEVICES ON DMRS FILOUT ,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 ,N FILOUT ,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 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 ,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 ,N NODMRS: FILOUT ,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 ,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 ,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 ,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 ,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 ,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 ;TELL COMNET ABOUT IBMCOM FILOUT ,M.DN6K ;LOAD D6KINT?? FILOUT ,M.DN6R ;LOAD D6RINT?? JRST IBMEND KSGEN2: FILOUT ;SAY NO DECNET CODE FILOUT ;NO IBM CODE FILOUT FILOUT 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 MOVEM N,M.DC75 ;store number of 75/87s FILOUT ,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 ;identify which PDP11 ; JUMPN P2,ASK851 ;DO RIGHT MESSAGE FOR DL10/DTE-20 ASKDEC ;ask port ; JRST ASK852 ;SKIP DTE-20 QUESTION ;ASK851: ASKDEC 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 ;OUTPUT ALL SYMBOLS FILCPU ,M.1D85 FILCPU ,M.2D85 FILCPU ,M.3D85 FILCPU ,M.4D85 FILCPU ,M.5D85 FILCPU ,M.6D85 FILCPU ,M.7D85 JRST ASKDEV DEVEND: FILOUT ,DTA FILOUT ,M.DAS78 FILOUT ,M.D78L FILOUT ,M.D78L FILOUT ,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 FILOUT ,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 JUMPE N,NETEND PUSHJ P,ASKNOD ;GET THE NODE NAME MOVEM N,STANAM ;SAVE FILOUT @>,N MOVE N,MAXRTY ;MAX REMOTE TTYS AVAILABLE ASKDEC ,N MOVEM N,M.RTTY ;REMEMBER FOR LATER TESTING FILOUT ,N JRST ASKANF ;ONWARD ;ROUTINES TO ASK FOR A NODE NAME ASKNOD: ASKSTR 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 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 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 ,N JUMPE N,ASKDCN PUSHJ P,ASKNOX ;ASK FOR ANF-10 STATION NAME FILOUT @>,N ASKOCT < Node number of central site (1,1-77) [ Provide a unique octal number to identify the system to the ANF network.]> FILOUT ,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 ,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 ,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 ,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 ,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 ,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 ,N ANFPLT: ASKLST < Remote plotters (NO,YES) [ Answer NO to exclude code to allow access to plotters on ANF remote stations.]>,N FILOUT ,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 ,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 ,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 ,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 ASKDCN: ASKYN <@DECnet software (YES,NO) [ Answer YES if you want to load the monitor modules needed to communicate with other DECnet nodes.]> FILOUT ,N JUMPE N,ASKLAT ;NO, SKIP OVER ALL THIS STUFF PUSHJ P,ASKNOX ;ASK FOR DECNET NODE NAME FILOUT @>,N ASKDEC < Area number of central site (1,1-63) [ Provide a decimal area number for multi-area DECnet network configurations.]> FILOUT ,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 ,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 ,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 JRST ASKXPW> MOVSI N,'* ' ;IN CASE "*" IS IN PASSWORD FILSTR >@> 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 ,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 ,N ; JUMPE N,NETEND ;JUMP IF NO LAT WANTED jumpe n,askip4 ;Skip on if no LAT wanted. PUSHJ P,ASKNOX ;YES, GET A 'NODE' (SERVICE) NAME FILOUT @>,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 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 AOJA LV,ASKGRP GRPER1: TTYOUT AOJA LV,ASKGRP ASKGR3: FILOUT ;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 ;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 askip4: ; Ask for IP stack. ASKYN <@IP software (YES,NO) [ Answer YES if you want an IP stack.]> FILOUT ,N JUMPE N,NOIP4 ;No, so don't ask about interfaces. ASKYN < DEUNA interface for IP (YES,NO) [ Include IP over ethernet via a DEUNA or DELUA card.]> FILOUT ,N ASKDEC < Number of SLIP interfaces (0,0-32)> FILOUT ,N ASKDEC < Number of UDP: devices (10,0-*)> FILOUT ,N ASKDEC < Number of TCP: devices (20,0-*)> FILOUT ,N NOIP4: 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 ; ;YES, WRITE IT OUT JRST DSYLOP ;LOOP BACK FOR NEXT LINE DSYERR: TTYOUT AOJA LV,ASKDSY ;TRY AGAIN DSYEND: FILOUT ; ;SET RADIX BACK TO NORMAL IN FILE MOVE LV,SAVLV ;RESTORE PERMANENT HELP LEVEL ; IN CASE HE TYPED /H 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 ;YES, WRITE IT OUT JRST OSYLOP ;LOOP BACK FOR MORE OSYERR: TTYOUT 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 ;WRITE OUT THE ANSWER JRST CPOPJ1 ;SUCCESS OSYEND: MOVE LV,SAVLV ;RESTORE PERMANENT HELP LEVEL ; IN CASE HE TYPED /H 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 <@>,WD ;OUTPUT SIXBIT VALUE JRST SSYLOP ;AND LOOK FOR MORE SSYERR: POP P,B ;RESTORE PDL TTYOUT AOJA LV,ASKSSY ;GO TRY AGAIN SSYEND: MOVE LV,SAVLV ;RESTORE PERMANENT HELP LEVEL ; IN CASE USER TYPED /H 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, AOJA LV,ASKS1A> ;GO ASK FOR MORE FILSTR ; ;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 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 ; ;YES, OUTPUT TRIPLE JRST SP2LOP ;GO GET ANOTHER LINE SP2ERR: TTYOUT 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 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 AOJA LV,ASKS3A> FILSTR ; ;OUTPUT TRIPLE TO FILE JRST SP3LOP ;GO GET NEXT LINE SP3ERR: TTYOUT 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 ;OUTPUT TO FILE JRST EDNLOP EDNER1: TTYOUT 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 ;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 AOJA LV,ASKCM1 ASKC10: PUSHJ P,FILRAB ;END THE MACRO MOVE LV,SAVLV ;RESTORE PROMPT AFTER /HELP ASKTRM: FILOUT ;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 MOVEM N,TWIDTH ;SAVE WIDTH TLO F,(F.SUPP) ;DON'T CLUTTER THE MACRO ASKDEC MOVEM N,TLENG ;SAVE LENGTH TLO F,(F.SUPP) ;DON'T CLUTTER THE MACRO ASKDEC 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
,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
,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 MOVEM N,TANSLV TLO F,(F.SUPP) ;DON'T CLUTTER THE MACRO ASKDEC MOVEM N,TDECLV CLSATR: TLO F,(F.SUPP) ;DON'T CLUTTER THE MACRO ASKSTR 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 ,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 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 @>,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 POPJ P, ;RETURN FAILURE ;HERE TO GET A TTY CLASS NAME TRMCLS: CAILE N,5 ;IN RANGE? RJRST 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 POPJ P, ;RETURN FAILURE ;HERE TO GET A TTY TYPE NAME TRMTYP: CAILE N,6 ;MAKE SURE IN RANGE RJRST 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 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 ,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),> ATRTAB: YY <8BT,DIS,OVR,8BA,ISO,NRC,LID,CID,SRM,GAT,SEM> YY YY 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 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 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 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 ,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.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 MDT3B ;NO ASKOCT < Massbus device (0,0-7) [ Type the Massbus device number for the * controller.]>,N MDT3A: MOVEM N,MDTUNI ;SAVE MDT3B: 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: 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 ;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: '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,-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 ,> 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 ,> 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 ,> 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,,> 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 ,> 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 , ASK2E: EREXIT , ;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, 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 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 POPJ P,> ;ERROR RETURN ASK8: MOVE N,SAVN ;YES, RETURN THE MATCH INDEX ASK9: SKIPN ASKTAB(N) ;SKIP IF DEFAULT ALLOWED RJRST POPJ P,> JRST CPOPJ1 ;GIVE OK RETURN ;ROUTINE TO ASK QUESTION AND GET DECIMAL ANSWER AND CHECK FOR LIMITS ;CALL: ASKDEC ; 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 ; 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 , ;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 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 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, 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 ,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 ,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 OR M ON REPEATED LINES UNTIL BLANK LINE ; SYNTAX AND OUTPUT TO FILE ;CALL: FILOUT ;START MACRO DEFINITION IN FILE ; ASKMN ; 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, AOJA LV,ASKM0> ;RAISE LEVEL OF VERBOSITY AND ASK AGAIN FILSTR ; ;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, GET REPEATED LINES OF INPUT ; UNTIL BLANK LINE, ANS OUTPUT TO FILE ;CALL: FILOUT ;START MACRO DEFINITON IN FILE ; ASKMNP ; 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 AOJA LV,ASKP0 ;RAISE LEVEL AND ASK AGAIN ASKP1: FILSTR ; ;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, AOJA LV,ASKTM0> ;GIVE HIM HELP FILSTR 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 FLAGS CAIN CH,15 ;CR? JRST ASKMC1 ;IGNORE CAIN CH,12 ;LF? RJRST 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 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 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 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 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 ;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 , 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 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,>> ;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*<+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 /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) > V ; ;INCLUDE MONITOR OVERHEAD IN RUNTIME V ; ;EBOX/MBOX RUNTIME ACCOUNTING V ; ;EXCLUDE PI TIME FROM USER RUNTIME V ; ;NO. OF CPUS V ; ;KL10 CPU V ; ;KS10 CPU V ; ;CPU SERIAL NOS. V ; ;MONTH, DAY, YEAR SYMBOLS V ; ;INCLUDE LOCK UUO ;AUTOCONFIGURED DEVICES Z.ATOB:! ;START OF AUTOCONFIGURED DEVICE STORAGE V ; ;CARD PUNCH V ; ;CARD READER V ; ;DISKS V ; ;ETHERNET V ; ;LINE PRINTERS V ; ;PAPER TAPE PUNCH/READER V ; ;PLOTTERS V ; ;SA10 SERVICE V ; ;SCA SERVICE V ; ;TAPES Z.ATOE==.-1 ;END OF AUTOCONFIGURED DEVICE STORAGE V ; ;DISK SET MASK V ; ;TOTAL NUMBER OF DTE20S ;HDWGEN: V ; ;TYPE OF DISPLAY V ; ;DAS78 V ; ;DN60 ;TTYGEN: V ; ;TYPE OF TERMINAL COMMUNICATIONS EQUIPMENT V V ; V ; ;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) ;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 ,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