;<EXEC>XMAIN.MAC;44    16-DEC-75 16:42:55    EDIT BY PLUMMER
; 1.54
; ADD DOBE IN PRINTER CHECKER TO ENSURE MSG GETS PRINTED
;<EXEC>XMAIN.MAC;41    24-SEP-75 11:59:50    EDIT BY PLUMMER
; SET DEFERRED INTERRUPTS AT CMDIN4
;<EXEC>XMAIN.MAC;40    18-SEP-75 18:31:14    EDIT BY PLUMMER
;<EXEC>XMAIN.MAC;39    18-SEP-75 14:41:07    EDIT BY PLUMMER
; CHANGE STRATEGY FOR DOWNTIME WARNING CHECKS
;<EXEC>XMAIN.MAC;37    17-SEP-75 13:52:56    EDIT BY PLUMMER
; []'S ARROUND EXCEEDED MSG
; NET ON/OFF NO LONGER REQUIRES CONFIRMATION
;<EXEC>XMAIN.MAC;34    16-SEP-75 17:05:31    EDIT BY PLUMMER
; PARC CHANGES... UUO TABLE
;<EXEC>XMAIN.MAC;32    24-JUL-75 15:42:11    EDIT BY PLUMMER
; ADD OMRON TERMINAL TYPE
;<EXEC>XMAIN.MAC;31    14-JUL-75 14:11:06    EDIT BY PLUMMER
; USE JOBNM2 TABLE FOR SYSTAT
;<EXEC>XMAIN.MAC;30    26-MAR-75 16:56:06    EDIT BY PLUMMER
;<EXEC>XMAIN.MAC;29    17-MAR-75 11:31:34    EDIT BY PLUMMER
; DIRECTORY DISPATCH BECOMES ..DIRE TO AVOID CONFILICT WITH M50 .DIREC
;<EXEC>XMAIN.MAC;28    17-MAR-75 11:06:01    EDIT BY PLUMMER
;<EXEC>XMAIN.MAC;27    17-MAR-75 10:34:18    EDIT BY PLUMMER
; RESET BECOMES $RESET FOR MACRO 50
; RFORK BECOMES LFORK FOR MACRO 50
;<EXEC>XMAIN.MAC;26     5-MAR-75 14:04:31    EDIT BY PLUMMER
; DO NOT ENABLE CHANNEL 10 WITH NO HANDLER FOR IT!!
;<EXEC>XMAIN.MAC;25     4-MAR-75 17:30:04    EDIT BY PLUMMER
;<EXEC>XMAIN.MAC;24     4-MAR-75 16:31:29    EDIT BY PLUMMER
;^ELIMIT CAPABILITIES
;<EXEC>XMAIN.MAC;23     4-MAR-75 16:16:10    EDIT BY PLUMMER
;<EXEC>XMAIN.MAC;21    14-FEB-75 15:34:14    EDIT BY PLUMMER
; ADD TERMINAL TYPE "LINEPROCESSOR" FOR SRI-ARC
;<EXEC>XMAIN.MAC;20     5-FEB-75 15:01:58    EDIT BY PLUMMER
; NEW SETNM LOGIC FOR CREATED JOBS
;<EXEC>XMAIN.MAC;19    31-JAN-75 15:30:56    EDIT BY PLUMMER
;<EXEC>XMAIN.MAC;18    30-JAN-75 18:46:00    EDIT BY PLUMMER
;<EXEC>XMAIN.MAC;17    30-JAN-75 18:19:19    EDIT BY PLUMMER
;<EXEC>XMAIN.MAC;16    30-JAN-75 17:59:12    EDIT BY PLUMMER
; REMOVE .VERSI TO X1CMD
;<EXEC>XMAIN.MAC;15    30-JAN-75 17:49:01    EDIT BY PLUMMER
; CREATED JOB ENTRY
;<EXEC>XMAIN.MAC;14    15-JAN-75 10:25:05    EDIT BY PLUMMER
; MAKE USESTAT CHECK PIE.P
;<EXEC>XMAIN.MAC;13     2-JAN-75 12:23:06    EDIT BY PLUMMER

;1.53
;<EXEC>XMAIN.MAC;12    31-DEC-74 13:55:28    EDIT BY PLUMMER
; DOWNTIME WATCHER (PARC)
; CALL CRIF IN WATCH MESSAGES (PARC)
; CATCH ERRORS IN WATCHERS (PARC)
;<EXEC>XMAIN.MAC;9    18-DEC-74 13:07:03    EDIT BY PLUMMER
; MORE PRIVILEDGED COMMANDS
;<EXEC>XMAIN.MAC;7    18-DEC-74 10:26:26    EDIT BY PLUMMER
; "USESTAT" INCLUDES ACCOUNT, SLICE
;<EXEC>XMAIN.MAC;6    16-DEC-74 17:03:48    EDIT BY PLUMMER
; DISPATCH FOR NEW PRIVILEDGED COMMANDS (OPRFNS)
;<EXEC>XMAIN.MAC;2     2-DEC-74 10:16:01    EDIT BY PLUMMER

; 1.52
;<N-EXEC>XMAIN.MAC;68    25-NOV-74 12:28:36    EDIT BY PLUMMER
; MAXJFN PARAMTER IN FILSTAT
;<N-EXEC>XMAIN.MAC;66    24-NOV-74 14:01:56    EDIT BY PLUMMER
; CHANGE MESSAGE FOR CHN 20 INTERRUPT
;<N-EXEC>XMAIN.MAC;64    22-NOV-74 22:08:26    EDIT BY PLUMMER
; "NUMBER" COMMAND (CASE)
;<N-EXEC>XMAIN.MAC;63    22-NOV-74 11:44:40    EDIT BY PLUMMER
; CONVERT TO $SYSGT
;<N-EXEC>XMAIN.MAC;60    29-OCT-74 12:32:01    EDIT BY PLUMMER
; CARRIAGE CONTROL IN CHKDAL
;<N-EXEC>XMAIN.MAC;59    18-SEP-74 15:45:15    EDIT BY PLUMMER
;<N-EXEC>XMAIN.MAC;58     9-SEP-74 10:55:20    EDIT BY PLUMMER
; FIX CHKDAL TO ALWAYS CALL RLJFNS
;<N-EXEC>XMAIN.MAC;57     6-SEP-74 10:20:53    EDIT BY PLUMMER
; CHANGE ODTIM FORMAT IN IMPSTAT, ADD EOL
;<N-EXEC>XMAIN.MAC;56    31-JUL-74 16:33:58    EDIT BY PLUMMER
;<N-EXEC>XMAIN.MAC;54    26-JUL-74 10:47:59    EDIT BY PLUMMER
; NEW "IMPSTAT"
; "WHYHLT" FOR "HALT"
;<N-EXEC>XMAIN.MAC;2    19-JUN-74 12:18:42    EDIT BY PLUMMER
; "ACCESS" COMMAND
;<N-EXEC>XMAIN.MAC;47    18-JUN-74 14:13:07    EDIT BY PLUMMER
; PERIODIC CHECK OF PRINTER DIRECTORY
;<N-EXEC>XMAIN.MAC;43    16-JUN-74 14:32:20    EDIT BY PLUMMER
; "PERPETUAL"
; ADD "CONMAN" BIT TO "MOUNT"
; PERIODIC MAIL CHECK
; "MAIL" DISPATCH
; FIX "DSKSTAT" TO RELEASE JFN
; USE %V INSTEAD OF %B IN USESTAT (PARC)
; TERMINAL TYPE VTS (PARC)
; REMOVE $IMPSTA AND CALL FROM "SYSTAT"
; ADD TEKTRONIX-4023 AND 4023 TERMINAL TYPES
;<N-EXEC>XMAIN.MAC;35     3-APR-74 20:16:15	EDIT BY PLUMMER
; REPAIR BAD AC AT CIN3C+3
;<N-EXEC>XMAIN.MAC;34    21-MAR-74 12:20:24	EDIT BY PLUMMER
; ALLOW FOR RPACS TO CLOBBER AC3 IN MEMSTAT
;<N-EXEC>XMAIN.MAC;33    19-MAR-74 16:18:24	EDIT BY PLUMMER
; ADD AUTO SEVEC AT FIRST STARTUP
;<N-EXEC>XMAIN.MAC;31    19-MAR-74 13:06:34	EDIT BY PLUMMER
; NEW "PISTAT"
;<N-EXEC>XMAIN.MAC;30    19-MAR-74 12:46:50	EDIT BY PLUMMER
; MAKE "MEMSTAT" INDICATE PAGES LOCKED BY USER
;<N-EXEC>XMAIN.MAC;29    19-MAR-74 11:55:43	EDIT BY PLUMMER
; ALL TERMINALS CHANGED TO WIDTH 72 FOR COMPATIBILITY WITH DEFAULT
;  WIDTH OF LPT:.  THIS MAKES "TYPE" SHOW THE SAME THING AS
;  "LIST" WILL PRINT.
; CHANGE CHN 20 INTERRUPT MSG TO "DISK SPACE EXCEEDED"
; NEW VERSION SCHEME.  VERSN AND PATVER GET SET FROM WHAT'S ON
;  ON <SYSTEM> AFTER FRESH ASSEMBLY.
;  "VERSION" CHANGED FOR ABOVE.
;<N-EXEC>XMAIN.MAC;28    13-MAR-74 13:43:20	EDIT BY PLUMMER
; SAVE PRIMARY JFNS AT STARTUP FOR ^C, ERRORS ETC
;<N-EXEC>XMAIN.MAC;27     4-MAR-74 17:36:33	EDIT BY PLUMMER
; "DIS" MEANS "DISABLE" INSPITE OF "DISCUSE"
;<N-EXEC>XMAIN.MAC;25    25-FEB-74 12:55:49	EDIT BY PLUMMER
; "FILSTAT" PRINTS JFNS UPTO 155
;<N-EXEC>XMAIN.MAC;24    11-FEB-74 14:52:08	EDIT BY PLUMMER
; SRI TAGS, ETC
; DISCUSE -- LAST HALF OF DSKSTAT
; IMPSTAT
;<N-EXEC>XMAIN.MAC;18    24-JAN-74 11:02:02	EDIT BY PLUMMER
; FIX LOWER CASE INPUT IS ...  TYPE OUT IN TRMSTAT
; ADD LGNCHK TO SYSTAT
;<N-EXEC>XMAIN.MAC;17    24-JAN-74 10:33:29	EDIT BY PLUMMER
; ADD LOGIN CHECK AT STARTUP
; MAKE DATA100 TERMINAL 79 WIDE
;<N-EXEC>XMAIN.MAC;16    14-NOV-73 11:39:13	EDIT BY PLUMMER
; SWITCH TO DEFERRED ^C AS SOON AS IT LOOKS LIKE A PROGRAM
;	MIGHT RUN
; "TRMSTAT" FIXED TO UPDATE PTTYMD FROM RFMOD
;<N-EXEC>XMAIN.MAC;14     9-NOV-73 15:57:33	EDIT BY PLUMMER
; "SYSTAT" PRINTS DETACHED, NON <SYSTEM>JOBS FIRST
;<N-EXEC>XMAIN.MAC;12    30-OCT-73 17:35:48	EDIT BY PLUMMER
; REMOVE ALL BELPSI AND ^G INTERRUPT STUFF
; DEFINE AND INTERN TIMPSC FOR USE BY NEW ^T ROUTINE
;<N-EXEC>XMAIN.MAC;11    29-OCT-73 21:02:12	EDIT BY PLUMMER
; IGNORE FAIL RETURN FROM GACTF IN AUTOSTART CODE
;<N-EXEC>XMAIN.MAC;10    29-OCT-73 16:45:08	EDIT BY PLUMMER
; CACCT DOESN'T HALTF IF NO SKIP (FOR SRI-ARC UNLOGGED-IN AUTO JOBS)
; AUTO JOBS DON'T START THE AUTOLOGOUT TIMER FORK (SRI-ARC)
;<N-EXEC>XMAIN.MAC;8    25-OCT-73 14:21:18	EDIT BY PLUMMER
; CHANGE INFOTRON TO 23 LINES
;<N-EXEC>XMAIN.MAC;7    18-OCT-73 11:11:24	EDIT BY PLUMMER
; FIX FILSTAT TO NOT BLOW UP ON RESTRICED JFNS
; FIX TRMSTAT DUPLEXITY TYPEOUT
;<N-EXEC>XMAIN.MAC;5    17-OCT-73 17:45:23	EDIT BY PLUMMER
; FLUSH DOUBLED WORD IN "TRMSTAT" TYPEOUT
;<N-EXEC>XMAIN.MAC;4    17-OCT-73 10:54:48	EDIT BY PLUMMER
; CHANGE STTYP AT .TTY3+1 TO USE COJFN
;<N-EXEC>XMAIN.MAC;3     9-OCT-73 11:14:40	EDIT BY PLUMMER
; LINKAGE ETC FOR BDDT
;<N-EXEC>XMAIN.MAC;38     1-OCT-73 19:51:26	EDIT BY PLUMMER

; 1.51
; "TRMSTAT" COMMAND
; TERMINAL TYPES INFOTON AND DATA100
; TERMINAL TYPE BEEHIVE
; ADD "LENGTH" COMMAND
; ADD TERMINAL TYPES SCOPE, BENDIX, AND LOGIPORT
; ADD ^G INTERRUPT STUFF
; ADD "TERMINAL TI733"
; CHANGE ' FROM PUNCTUATION TO ALPHA CHR TO ALLOW USER NAMES LIKE
;	O'SULLIVAN. (USING PUNCF IN TTYNUM WOULD PROHIBIT ? FOR HELP)
; SWITCH TO .JBXXX NOTATION FOR 10/50 JOB DATA AREA
; SAVE .JBUSY AS WELL AS .JBSYM ON STARTUP
; SYSTAT PRINTS DETACHED JOBS LAST
; MOVE "NO" ROUTINE TO X1CMD.MAC
; DELETE ^Y AS EQUIVALENT TO ^X
; ACCOUNT VALIDATION CHANGES
; "NO INDICATE (FORMFEED)" IMPLEMENTED
; SET ACCOUNT FROM FILE BEING RUN FOR AUTOSTART JOBS (NEW)
; INSTALL "ADVIZ" (NEW)
; INTERN SIXPRT FOR USE IN TTYNUM (XSUBRS)
; READY FOR NEW GTDAL
; REMOVE BKJFN FROM CIN4
; REMOVE COMOK FLAG FROM INTERROGATE
; MEMSTAT AND SYSTAT KNOW ABOUT SINGULAR FORMS OF "PAGES" AND "JOBS"
; FIX BUG IN SETNM LOGIC AT CIN42
; ERROR MESSAGE FOR CFORK FAILURE
; REQUIRE CONFIRMATION FOR PROGRAMS INVOKED USING ALTMODE
; ADD INTON & INTOFF IN EPHEMERON CONTROL
; ALLOW AUTOLOGOUT FORK TO CROSS PAGE BOUNDARY
; MAKE LOAD AV PRINTER A SUBR. CALLED FROM RUNSTAT AND ^T, NOT IN FSTAT
; ADD TERMINAL TYPE AJ, DELETE TYPES 0, 1, 2, 3
; FLUSH MLON PSEUDO OP

; 1.50
; SWITCHED TO DECIMAL VERSION NUMBERS, CONSISTENT WITH FILE SYS
; ALLOW FOR FORTH COMING FORK STATUS TYPE 6 (BPT)
; REINSTALL TYPE 5 TYPE-OUT, JUST IN CASE IT EVER GETS IMPLEMENTED
; REMOVE STPAR AT STARTUP -- NEVER SHOULD HAVE BEEN THERE!
; REPAIR CCCOCS -- LAST FEW LINES OF FILE GOT DROPPED???
; TTY MODE SETTING REDONE -- ALLOW AUTOSTARTUP TO BE DETACHED
; MAKE DISTRIBUTED STUFF CONDITIONAL
; ADD SETTING OF PRI JFN ON AUTO STARTED FORK
; "ERRSTAT" AVAILABLE TO MAINT. TYPES
; ^T AND "RUNSTAT" PRINT LOAD AV
; CHKDAL: NO MESSAGE IF OVER BY 0 PAGES
; SAVE SUBSYS NAME OF SUPERIOR
; CLEANUP XWD'S

; 1.49
; FSTAT CLEANED UP
; "IDDT" AND "NO IDDT"
; NEW "STATISTICS" COMMAND
; USE TERM TYPE 7 FOR NVT
; STARTING, REENTERING, OR CONTINUING AFTER A "QUIT" CAUSES THE EXEC
;  TO PICKUP A NEW TTY STATE.

; 1.48
; "DSKSTAT" PRINTS NUMBER OF PAGES LEFT/USED ON DSK:
; HALT CHANGED
; SYSTAT INCLUDES SHUTDOWN/UPTIME WARNING
; COMMAND LIST INCLUDES "SAVE FILE NAME"

; 1.47
; INCLUDE AUTOSTARTUP JOBS, ARCHIVE STUFF

; 1.46
; DSKSTAT PRINTS ALLOCATED, USED, AND DELETED PAGES
; FILSTAT PRINTS POINTER IN DECIMAL (MATCH QFD PRINTOUT)
; DEFAULT RUN COMMAND
; GENERAL CLEANUP
; TERMINAL TYPE COMMAND PRETTIED UP
; BREAK ALLOWED IF NOT LOGGED IN
; LINK ALLOWED IF NOT LOGGED IN
; PRINT FILE PTR IN "FILSTAT"

; PDP-10 TENEX EXECUTIVE MAIN ASSEMBLY FIRST FILE

;LOADING: /S
;	  XPRIV.REL	(PRIVATE STORAGE, MUST BE FIRST)
;	  XEC.REL	(THIS ASSEMBLY)
;	  XSUBRS.REL	(SUBROUTINES)

;THIS FILE CONTAINS: INITIALIZATION
;		     MAIN LOOP TO READ 1ST WORD OF COMMAND & DISPATCH
;		     COMMAND TABLES, OTHER TABLES
;		     ROUTINES FOR STATUS COMMANDS AND TERMINAL
;			CHARACTERISTICS COMMANDS

	TITLE EXEC
	SEARCH STENEX,XDEF
	.DIRECTIVE XSRCVN %XM
	%XM==%XM

;INTERNS -- LABELS USED IN SEPARATELY ASSEMBLED SUBROUTINES

INTERN CUUO		;WHERE UUOS DISPATCH TO: RESET BY ^C
INTERN ERRET		;WHERE ERROR UUOS RETURN TO DO INPUT NEXT CMND
INTERN FSTAT		;SUBR TO PRINT FORK STATUS FOR ^T
INTERN LAPRNT		;SUBR TO PRINT LOAD AV
INTERN SIXPRT		;SIXBIT PRINTER
INTERN TIMPMN,TIMPSC	;GTAD + MIN,  GTAD + SEC

;INTERNS -- THINGS WE WANT GLOBALLY DEFINED IN DDT
INTERN EXEC		;ENTRY POINT, ENTRY VECTOR LOCATION
INTERN REE		;RE-ENTRY POINT
INTERN PAT,PATS		;PATCH AREA
INTERN CMDIN4,.QUIT	;FOR RETURNS

;EXTERNS
; SEPARATELY ASSEMBLED SUBROUTINES
EXTERN IDFORK		;IDDT FORK HANDLE
EXTERN BDFORK		;BDDT FORK HANDLE
EXTERN DBFORK		;CONTAINS EITHER BDFORK OR IDFORK
EXTERN UFORK		;FORK THAT HAS USER UNDER IDDT
EXTERN DATEIN		;DATE AND TIME INPUT ROUTINE
EXTERN READY,READY2	;PRINT 1 OR 2 READY CHARS (@ OR !)
EXTERN %KEYW		;SERVICE ROUTINE FOR KEYWORD LOOKUP UUO (KEYWD)
EXTERN PRVCK		;SUBR TO CHECK USER'S PRIVILEGES VS BITS IN B
EXTERN %NOI		;SERV ROUTINE FOR NOISE WORD UUO ("NOISE" MACRO)
EXTERN %SBCOM		;UUO TO INPUT & DISPATCH ON SUBCOMMANDS
EXTERN %INHEL		;UUO TO INPUT FIELD WITH HELP ("INHELP" MACRO)
EXTERN CSTR,MORE	;INPUT AND APPEND TO FIELD SUBROUTINES
EXTERN PASCOM		;PASS COMMENT
EXTERN %ALLOW		;CHECK FIELD TERMINATOR (ALLOW UUO)
EXTERN CONF		;TERMINATE AND CONFIRM COMMAND
EXTERN TCONF		;TRANSPARENT CONFIRM, USABLE DURING COMMANDS
EXTERN SPRTR		;ANALYZE SEPARATOR/TERMINATOR AFTER AN ARG
EXTERN CCHRI		;INPUT A CHARACTER OF COMMAND
EXTERN UBP		;REMOVE LAST CHARACTER FROM COMMAND STRING
EXTERN %TYPE,CTYPE,%$TYPE,$CTYPE,%ALTYP	;TYPE MESSAGE SUBRS & UUOS
EXTERN CINFN,COUTFN,SPECFN,CPFN	;GET IN, OUT, SPECIAL, PROG FILE NAMES
EXTERN CEDFN			;COLLECT EDIT FILE NAME
EXTERN EDFILE
EXTERN FRAME
EXTERN .INFG,INFG,$INFG,DIRARG	;INPUT FILE GROUP DESCRIPTORS
EXTERN TYPIF,GNFIL,FRSTF,NEXTF	;ROUTINES TO STEP THRU FILES IN GROUP
EXTERN INTRM		;READ TERMINATING CHARACTER AFTER IDTIM, ETC.
EXTERN DEVN		;COLLECT DEVICE NAME
EXTERN DIRNAM		;COLLECT DIRECTORY NAME
EXTERN DEFDIR		;COLLECT OR DEFAULT DIRECTORY NAME
EXTERN TTYNUM		;GET TTY NUMBER FROM USERNAME OR OCTAL NUMBER
EXTERN FPIN,DECIN,OCTAL,TOCT,OCTCOM ;NUMBER INPUT AND OUTPUT SUBRS
EXTERN BUFFF,BUFFS	;BUFFER LAST FIELD SUITABLY FOR USE AS JSYS ARG
EXTERN ALLBK,NALNBK,DOECEO,NOECHO,DOECHO,LTTYMD,RTTYMD	;TTY MODES ETC
EXTERN %PRINT		;PRINT CHARACTER FROM EFFECTIVE ADDRESS
EXTERN CRIF		;TYPE EOL IF NOT AT LEFT MARGIN
EXTERN CCHRO		;OUTPUT CHARACTER (OF COMMAND IF "STCF" ON)
EXTERN MAPPF		;MAP PAGE OF FORK SUBR
EXTERN LOADF		;LOAD WORD FROM FORK SUBR
EXTERN STOREF		;STORE SINGLE WORD INTO FORK
EXTERN %GTB		;CONVENIENT GETAB CALL UUO
EXTERN DING,CERR,NIYE,NIM,SCREWUP,JERR,JERRC  ;VARIOUS ERROR CONDITIONS
EXTERN %TRAP		;ERROR PSI MESSAGE UUO ROUTINE
EXTERN AUTOLO		;ROUTINE TO DO AUTOLOGOUT
EXTERN %ERR,%$ERR,%.$ERR ;GENERAL ERROR UUOS (MACROS "ERROR" ETC)
EXTERN RERET		;NORMAL AFTER-ERROR ROUTINE FOR CERET TO PT TO
EXTERN %ETYPE		;TYPE MESSAGE, EXPANDING %-CODES
EXTERN RLJFNS		;CLOSE AND RELEASE JFNS USED BY CURRENT COMMAND
EXTERN FLOAT		;FLOAT INTEGER IN A
EXTERN $SYSGT		;FAST SYSGT
EXTERN UNMAP		;FLUSHES BUFFER PAGES

; CELLS AND BUFFERS IN PRIVATE WRITEABLE STORAGE AREA
EXTERN DOWNTM,UPTIME,WHYHLT
EXTERN AUTFLG,APJFN
EXTERN CJFLGS,CJFKSA,CJINIT		;CREATED JOB VARIABLES
EXTERN CSZ1,CSZ2,CSZ4
EXTERN .P
EXTERN CIJFN,COJFN,JBUFP,.JBUFP,JBUF,CJFN1,CJFN2
EXTERN INIFH1,INIFH2
EXTERN EOFDSP,ILIDSP
EXTERN CRJFNI,CRJFNO,CREDIF,CREDOF,PRIMRY
EXTERN CINITF,DTSF,PRVENF,PROPSF,MESMSF,DOT,CUSRNO,MSGTIM,PRNTIM
EXTERN FORK,LFORK,SUBSYS,DDTFLG,NPAGE,EFORK
EXTERN STRTIM,TTYACF,ALOFH
EXTERN SUPSUB,INETTY,INPTTY,PTTYMD,ETTYMD
EXTERN CERET
EXTERN CTUUO
EXTERN CSTRR,CSBUFP
EXTERN FRSTFR
EXTERN ERCOD,ERPC
EXTERN DEVICE,DIRNO,OLDDIR,OUTDSG,INDSG
EXTERN LPNAME,LPEXT,LPFDB,LFPOS
EXTERN GHEAD,HEAD,HEDLNO,SPCG,WIDTH,LENGTH,L35,L50
EXTERN PAGENO,PAGEN1,BESPTR,BESCOR,BESLNO,PPRINT
EXTERN SPCBTS
EXTERN PD,CBUF,CBUFE,CWBUF,CJFNBK,CSBUF
EXTERN PPATS,PPAT,PAGEN
EXTERN DWNMSF
EXTERN LIMITC			;FLAG SAYING CAPABILITES ARE LIMITED
EXTERN MODES

; 10/50 JOB DATA AREA
INTERN .JBSA,.JBOPC,.JBREN,.JBSYM,.JBUSY
.JBSYM=116
.JBUSY=117
.JBSA=120
.JBREN=124
.JBOPC=130


;TENEX ENTRY VECTOR

;N.B.  "EXEC" MUST BE THE FIRST SYMBOL IN RELOC SECTION

EXEC:	JRST REE		;START ENTRY
	JRST REE		;REENTER ENTRY
	JRST AUTOST		;AUTO STARTUP ENTRY
	JRST CREATD		;CREATED JOB STARTUP
EVECL==.-EXEC

;POINTERS TO DEFINED AND UNDEFINED SYMBOL TABLES
;SAVED HERE FROM .JBSYM AND .JBSYM WHEN THOSE PAGES ARE
; REMOVED FOR SHARABLE SUBSYSTEM

..JBSYM: 0
..JBUSY: 0

;EXEC VERSION, PRINTED ON STARTUP AND BY "VERSION" COMMAND
; NOTE THESE GET SETUP AUTOMATICALLY FROM THE EXTENSION OF
;  <SYSTEM>EXEC.SAV;0  WHEN STARTED THE FIRST TIME AFTER A
;  REASSEMBLY.  (NOTE: THE INPUT COMMAND FILE DOES THIS TO MOVE
;   SYMBOL POINTERS ALREADY).

VERSN:	^D154			;MAJOR AND MINOR VERSIONS
PATVER:	0			;# TIMES PATCHED

;PATCH AREA

PATS: PAT: BLOCK 200

;UUO DISPATCH TABLE
;GENERATED BY EXPANDING "UUOS" LIST DEFINED IN XDEF

CUUOT:	EXPAND(UUOS,<EXP ITEM>)

;UUO DISPATCHER

CUUO:   MOVEM A,CTUUO
        HLRZ A,40
        LSH A,-^D9
        HRRZ A,CUUOT-1(A)	;FIRST UUO IN TABLE IS 1
        EXCH A,CTUUO
        JRST @CTUUO

;CREATED JOB ENTRY

CREATD:	MOVEM A,CJFLGS		;STORE FLAG WORD
	MOVEM B,CJFKSA		;EVEC,,FORK
	SETOM CJINIT		;SAY WE ARE INITIALIZING A CREATED JOB
	JRST EXEC0
;******WARNING: ONCE THIS CREATED JOB STUFF WORKS, AUTOJOB ENTRY
;****** WILL BE REMOVED ************


;AUTOSTARTUP ENTRY

AUTOST:	MOVEM A,APJFN		;PRIMARY IO FOR AUTOSTARTED FORK
	MOVEM B,AUTFLG		;USE JFN AS FLAG FOR AUTOSTARTUP JOB

AUTO0:	MOVE 1,B		;JFN OF FILE TO RUN
	MOVEI 2,CSBUF		;STRING BUFFER AREA
	GACTF
	 JRST EXEC0		;FILE BAD?
	 JFCL			;STRING ACCOUNT
	MOVE 1,2		;NUMERIC ACCOUNT
AUTO1:	CACCT
	 JFCL			;AUTO JOB MAY NOT BE LOGGED IN
	JRST EXEC0

;REENTER ENTRY

REE:	SKIPE CINITF		;IS EXEC INITIALIZED?
	JRST EXEC0B

;EXEC COMMAND INTERPRETER IS INITIALLY STARTED HERE

EXEC0:

;ZERO WRITEABLE AREA NOT INCLUDING AUTO OR CREATED JOB STARTUP VARIABLES
        SETZM CSZ1
        MOVE A,[CSZ1,,CSZ1+1]
        BLT A,CSZ4

;SET UP 41 FOR UUO'S, P=17 FOR PUSHDOWN POINTER
	MOVE A,[CALL CUUO]
        MOVEM A,41
        MOVE P,[IOWD PDL,PD]

;CLEAR FLAGS
	SETZ Z,

;POINT THE EXEC AT A FORK, IF ANY
	HLRZ A,CJFKSA		;IN CASE THIS IS A CREATED JOB
	MOVSI B,(1B1!1B2)	;"FORK EXISTS" PASSED FROM CRJOB
	SKIPE CJINIT		;IF WE ARE NOT STARTING A CREATED JOB
	TDNN B,CJFLGS		;OR NO FORK SUPPLIED
	 SETO A,		;SAY NO INFERIOR FORK
	MOVEM A,FORK

;RANDOM THINGS
	SETOM LFORK		;SAY NO FORK HAS BEEN RUN
	SETOM IDFORK		;SAY NO IDDT FORK
	SETOM BDFORK		;SAY NO BDDT FORK
	SETOM UFORK		;SAY NO FORK UNDER IDDT, BDDT
	SETOM EFORK		;SAY NO EPHEMERAL FORK
	SETOM NPAGE		;SAY NO PAGE OF INFERIOR IS MAPPED
	SETOM PRNTIM		;DO "PRINTER WATCH OFF" (DEFAULT)

;ON FIRST STARTUP, MOVE SYMBOL TABLE POINTER INTO ONE OF THE CODE PAGES,
; SO IT WILL BE KEPT THRU SHARABLE SAVES.
	MOVE C,.JBUSY		;10/50 UDEFINED POINTER
	SKIPE D,.JBSYM		;GET 10/50 STYLE PTR, SKIP IF NONE.
	SKIPE ..JBSYM		;NO SKIP IF ALREADY MOVED
	 JRST EXEC0B		;NO PTR OR ALREADY MOVED
	MOVE A,[400000,,<..JBSYM/1000>]
	RPACS			;READ PAGE ACCESSIBILITY
	TLNN B,(1B3!1B9)	;..JBSYM WRITE-PROTECTED?
	 JRST EXEC0B		;YES
	MOVEM D,..JBSYM		;NO, STORE SYMBOL TABLE POINTER.
	MOVEM C,..JBUSY		;AND UNDEFINED POINTER


;NOW SETUP THE VERSION NUMBERS

EXEC05:	MOVSI 1,(1B2!1B17)	;OLD, SHORT
	HRROI 2,[ASCIZ /<SYSTEM>EXEC.SAV/]
	GTJFN
	 JRST EXEC0B		;CANNOT DO IT, DOESN'T MATTER.
	MOVE 2,[1,,FDBVER]
	MOVEI 3,3
	GTFDB
	HLRZS 3			;GET VERSION NUMBER
	IDIVI 3,^D100		;SPLIT OFF THE PATCH NUMBER
	ADDI 4,1
	CAMN 3,VERSN		;NEW VERSION OF OLD PROGRAM?
	MOVEM 4,PATVER		;YES, SAVE INCREMENTED PATVER
	RLJFN
	 JFCL

;NOW SET THE ENTRY VECTOR

EXEC06:	MOVEI 1,400000		;THE EXEC FORK
	MOVE 2,[EVECL,,EXEC]
	SEVEC			;IN CASE NEW "LOADER" NOT USED

EXEC07:	MOVE 1,VERSN
	IMULI 1,^D100
	ADD 1,PATVER
	HRLI 1,(1B0!1B17)	;FOR OUTPUT, SHORT
	HRROI 2,[ASCIZ /EXEC.SAV/]	;IN CONNECTED DIRECTORY
	GTJFN
	 JRST EXEC0B
	HRLI 1,400000		;FORM FORK,,JFN
	MOVEI 2,EXEC		;MACRO CANT DO DIVISION WITH RELOC'S
	IDIVI 2,1000		;FIRST PAGE TO SSAVE
	MOVEI 3,520000(2)	;RCX BITS
	SUBI 2,100		;DO THROUGH PAGE 77
	HRLZS 2			;NEGATIVE PAGE COUNT
	HRR 2,3
	SETZ 3,
	SSAVE


EXEC0B:

;SET UP PRIMARY INPUT AND OUTPUT JFN'S
;THESE REMAIN CONSTANT AT LEAST AT PRESENT.

	MOVEI 1,400000
	GPJFN
	MOVEM 2,PRIMRY		;SAVE FOR ^C, ERRORS ETC
	MOVEI A,100
	MOVEM A,CIJFN
	MOVEI A,101
	MOVEM A,COJFN

;INITIALIZE PROCESS PSI SYSTEM,
; DONE EARLY SO ERRORS IN REST OF INITIALIZATION WILL BE HANDLED.
;ENABLE ALL ERROR CHANNELS BUT OVERFLOW,
; ALSO CHANNEL 1 FOR ASSIGNMENT TO ^C BELOW,
; AND 2 FOR AUTOLOGOUT.

	MOVEI A,B0		;SAY THIS FORK
	MOVE B,[LEVTAB,,CHNTAB]
	SIR		;SET UP TABLE ADDRESSES
	MOVE B,[360776500000]		;CHANNELS
	AIC		;ACTIVATE SPECIFIED CHANNELS
	EQV B,[1B0+1B19];DON'T CHANGE CHANS USED BY MINI-EXEC. 4/30/70.
		;ABOVE FOR DEBUGGING .  SETCA B, TO DEACTIVATE ALL.
	DIC		;DEACTIVATE ALL OTHERS
	EIR		;ENABLE PROCESS PSI SYSTEM

;INITIALIZE THE EXEC AND PROGRAM TTY MODE BLOCKS
; WORD-0 OF PTTYMD IS USED AS FLAG TO INDICATE WHETHER OR NOT WE
; HAVE A TTY.  CALLS TO LTTYMD OPERATE ONLY ON SUBSYS
; NAME IF WORD-0 IS ZERO.  THIS WILL BECOME NON-ZERO AS
; SOON AS WE HAVE A TTY.  NOTE: THIS CAN HAPPEN HERE, IF
; THE "GET" DURING AUTOSTARTUP IS BAD, OR IN RTTYMD
; DUE TO ^C OUT OF AUTOSTARTED JOB WHICH WAS STARTED DETACHED.

EXEC0C:	GETNM			;SUPERIOR-SET SUBSYS NAME
	MOVEM 1,SUPSUB		;SAVE FOR "QUIT"
	MOVE A,[INETTY,,ETTYMD]	;INITIAL EXEC MODES
	BLT A,ETTYMD+NTTYMD-1	;INCLUDING MODIFIED CCOC, TIW AND SUBSYS
	MOVE A,[INPTTY,,PTTYMD]	;INITIAL TTY FOR USER
	BLT A,PTTYMD+NTTYMD-1	;JUST A NORMAL TTY
	GETNM			;GET SUBSYS SETNM
	SKIPE CJINIT		;CREATED JOB INITIALIZING?
	 MOVEM A,SUBSYS		;YES, SAVE SUBSYSTEM NAME IN GOOD PLACE
	GJINF
	CAMN 4,[-1]		;ARE WE DETACHED?
	JRST CMDIN1		;YES, LEAVE 0 IN ETTYMD, PTTYMD
	MOVE 2,[1B3+^D66B10+^D72B17+17B23+2B25+1B26+1B29+1B31]
	MOVEM 2,ETTYMD+0
	MOVEM 2,PTTYMD+0

EXEC0D:	TIME
	MOVEI C,^D<15*60>	;15 MINUTES OF SECONDS
	IMULI C,0(B)		;15 MINUTES OF TICKS
	ADDM C,A		;ALLOW TIL THIS BEFORE 1ST DOWNTIME CHK
	MOVEM A,DWNMSF##	;MAY HAPPEN SOONER IF THIS EXEC IS USED
				;TO LOGIN WITH.

CMDIN1:	SKIPE CINITF		;ARE WE INITIALIZING?
	 JRST CMDIN2		;NO, NO SIGN-ON HEARLD
	SKIPN CJINIT		;INITIALIZING A CREATED JOB?
	 JRST CMDN1A		;NO
	MOVSI A,(1B0)		;"SUPPRESS HEARLD" FROM CRJOB?
	TDNE A,CJFLGS
	TLZA Z,F1		;NO HEARLD
	TLO Z,F1		;TURN ON HEARLD
	JRST CMDN2A
CMDN1A:	SKIPN AUTFLG		;NO HERALD FOR AUTOSTARTUP JOBS
	TLOA Z,F1		;SAY PRINT SIGN-ON HEARLD

;COMMANDS THAT RUN PROGRAM RETURN HERE WHEN IT STOPS.
;START, CONT, REENTER, RUN, <SUBSYSTEM NAME>, GOTO.
;RE-ENTRY JOINS MAIN FLOW HERE

CMDIN2:

;^C AND COMMAND ERRORS COME BACK HERE.
;AFTER ^C IT IS NECESSARY TO EXECUTE CODE TO FIND OUT WHETHER LOGGED IN,
; HAVE INFERIOR FORK, UPDATE CAPABILITIES, KILL AUTOLOGOUT FORK,
; ETC IN CASE INTERRUPTED COMMAND WAS LOGIN, RUN, ETC.

ERRET:	TLZ Z,F1		;SAY NO SIGN-ON MESSAGE

;MAKE SURE ^C PSI CHANNEL ACTIVATED
; (IT IS TURNED OFF DURING PART OF "LOGIN" AND "RESET")

CMDN2A:	MOVEI A,400000		;THIS FORK
	MOVSI B,(1B1)
	AIC
	MOVEI E,ETTYMD		;PUT EXEC'S TTY MODES INTO EFFECT
	CALL LTTYMD		;IF THEY EXIST.  SETNM, TOO.

	MOVEI A,RERET		;SAY WHERE TO GO ON ERROR WHILE TYPING
	MOVEM A,CERET		; ...LOGIN MESSAGE

	TLZN Z,F1		;SIGN-ON MESSAGE, FIRST TIME ONLY
	JRST CMDN2B		;NO
	PRINT EOL
	CALL .VERSI		;PRINT SYSTEM AND EXEC VERSIONS
	SKIPE CJINIT		;INITIALIZING A CREATED JOB?
	 JRST CMDN2B		;YES, SKIP LGNCHK

	HRLZI A,B0!B1		;"FACT FILE OR LOGGING TTY" ENABLED
	TMON			;SKIP IF EITHER EXISTS
	 TYPE < *****ACCOUNTING OFF*****
>
	CALL LGNCHK		;WARN IF LOGINS PROHIBITTED
	JUMPE A,CMDN2B		;LGNCHK SAID OK TO LOGIN
	CALL CRIF
	TYPE <"ATTACH" TO EXISTING JOB IS PERMITTED>
	PRINT EOL

;SAY INITIALIZATION HAS COMPLETED SUCCESSFULLY.
;UNTIL CINITF><0, ERROR ROUTINES HALT RATHER THAN TYPE MESSAGES,
; AND "REENTER" DOES A "START".

CMDN2B:	SETOM CINITF

;FIND OUT IF THIS JOB IS LOGGED IN. (MIGHT BE AT STARTUP IF SUBSIDIARY,
;  OR A SUBSYSTEM COULD LOG JOB IN.)
	GJINF			;LOGIN DIR # IN A, 0 IF NOT LOGGED
	MOVEM A,CUSRNO		;SAVE LOGIN DIR # OR -1

;KILL AUTOLOGOUT FORK IF IT EXISTS BUT LOGGED IN.
	SKIPLE CUSRNO		;SKIP IF NOT LOGGED IN
	SKIPG A,ALOFH		;FORK THAT LOGS OUT ABANDONED JOBS
	JRST .+3
	SETOM ALOFH		;SAY ITS KILLED (DON'T RETRY ON FAILURE)
	KFORK			;KILL IT

;ENABLE SPECIAL CAPABILITIES

CMDN2D:	MOVEI A,B0		;SAY THIS FORK
	RPCAP			;GET SPECIAL CAPABILITIES POSSIBLE IN 2
	HLLZ C,B		;ENABLE ALL PROCESS (LH) CAPABILITIES
	SKIPE PRVENF		;IF "ENABLE" COMMAND IS IN EFFECT,
	HRR C,B			;ALSO ENABLE RH (USER) CAPABILITIES.
	EPCAP			;(MAYBE NONE AVAILABLE DUE TO LIMIT)

	MOVEI 1,400000
	CIS

	MOVE A,[CTRLC,,1]
	TLNE C,B0		;TEST SPEC CAP BIT 0
	ATI			;ASSIGN ^C TO CHAN 1

	MOVE A,[CTCODE,,3]
	ATI			;ASSIGN ^T TO CHAN 3

	MOVE A,[HUCODE,,4]
	ATI			;ASSIGN CARRIER OFF TO CHAN 4

;HERE WHEN READY TO INPUT A COMMAND.
;ALL COMMANDS RETURN HERE OR ABOVE HERE WHEN DONE.

CMDIN4:	MOVEI E,ETTYMD
	CALL LTTYMD		;IN CASE LAST COMMAND DIDN'T RESTORE IT
	MOVE A,[1B0+400000]	;GET/SET DEFERRED FOR THIS FORK
	RTIW
	MOVSI C,(1B<CTRLC>)	;OR 0 IF YOU DON'T LIKE DEFERRED ^C
	AND C,B			;OK IF NO ^C PRIV.
	STIW
	SETO A,
	CAME A,NPAGE
	CALL MAPPF		;DON'T LEAVE FORK PAGES MAPPED
	SETZM CSZ1		;ZERO STORAGE
	MOVE A,[CSZ1,,CSZ1+1]
        BLT A,CSZ2

;INITIALIZE WHAT NEEDS INITIALIZING
       MOVE BFP,[POINT 7,CBUF]	;BYTE POINTER INTO COMMAND BUFFER,
		                ;IN WHICH ENTIRE LINE IS ACCUMULATED.
				;STAYS IN BFP.
        MOVE P,[IOWD PDL,PD]	;INIT PD POINTER

	MOVE A,[IOWD JBUFL,JBUF] ;INIT PTR INTO JFN BUFFER
	MOVEM A,JBUFP
	SETOM 1(A)		;INIT JFN BUFFER TO -1'S: 0 IS A JFN.
	AOBJN A,.-1

	MOVE A,[POINT 7,CSBUF]	;INIT PTR INTO STR BUF FOR JSYS ARGS
	MOVEM A,CSBUFP

	MOVEI A,RERET		;REGULAR ERROR RETURN ADDRESS
	MOVEM A,CERET		;SAY WHERE TO GO AFTER PRINTING ERR MSG

;CLEAR SOME FLAGS
        SETZ Z,	         	;CLEARS PUNCTF, STCF, BAKFF, ETC.

	SETZB KWV1,KWV		;NO SPECIAL BITS ON IN COMMAND KEYWORD
				; TABLE VALUE. THIS IS IN CASE SOME
				; SPECIAL SYNTAX
				; NEVER SETS KWV1 BUT CALLS "CONF".
				; THE ONLY SUCH CASES ARE
				; <SUBSYSTEM NAME> AND INPUTTING
				; DATE AND TIME.  6/30/70.
;REQUEST DATE AND TIME IF SYSTEM DOESN'T HAVE THEM.
;THIS MUST BE INSIDE COMMAND LOOP SO IT WILL BE REPEATED IF ERROR
; OR ^C ABORTS FIRST ATTEMPT.

	SKIPE CJINIT		;INITIALIZING CREATED JOB?
	 JRST CMDN5B		;YES, LET IT WORRY ABOUT TAD
	SKIPN AUTFLG		;DON'T IF AUTOJOB
	SKIPE DTSF		;NON-0 IF HAVE DATE AND TIME
	JRST CMDN5B		;...AND HAVE BEEN HERE BEFORE
	GTAD			;FLAG NOT SET YET, GET DATE AND TIME
	CAME A,[-1]		;-1 SAYS SYSTEM DATE & TIME NOT SET
	JRST CMDN5B		;SYSTEM HAS DATE AND TIME.

;SYSTEM HAS NO DATE AND TIME, GET SAME. SUBR INDT (WITH ^E SET IN
;X4CMD.MAC) INPUTS, CONFIRMS, AND SETS TIME & DATE. KWV1 MUST BE 0 NOW!
	MOVE 1,CIJFN
	SIBE			;INPUT ALREADY TYPED?
	JRST [	TYPE < TAD= >	;YES, GIVE SHORT MESSAGE
		JRST .+2]
	TYPE < ENTER DATE AND TIME AS MM/DD/YY HH:MM -- >
	CALL INDT
CMDN5B:	SETOM DTSF		;SAY SYSTEM HAS DATE AND TIME.
				; THIS AVOIDS
				; DOING GTAD EVERY TIME THRU LOOP.

;NOW THAT SYSTEM DEFINITELY HAS DATE & TIME, INITIALIZE "AUTOLOGOUT"
;STUFF IF NECESSARY.
	SKIPN AUTFLG		;IF AUTO STARTUP JOB, OR ...
	SKIPLE CUSRNO		; ALREADY LOGGED IN,
	 JRST CMDN5E		; NOT RELEVANT.
	SKIPE ALOFH		;ALO FORK STARTED?
	JRST CMDN5D		;YES, ALO INITIALIZATION ALREADY DONE.
	GTAD			;SAVE STARTUP TIME FOR USE IN
	MOVEM A,STRTIM		;"ALOTST" SUBR


;START UP FORK TO WATCH FOR ABANDONED JOB (NO TTY ACTIVITY FOR
;N SECONDS) AND PSI THIS FORK IF THAT OCCURS.
	SETZ A,
	CFORK			;FORK WHICH LOOKS FOR NO TTY ACTIVITY
	 CALL [	SETOM ALOFH	;ON ERROR THIS PREVENTS INFINITE
		JRST JERR]	;...RETRY LOOP.
	MOVEM A,ALOFH		;SAVE HANDLE FOR KILLING LATER.
	HRLZI A,400000
	HRLZ B,ALOFH
	HRLZI C,B2+B3+B4
	PMAP			;MAP PAGE 0 (STORAGE) INTO FORK
	MOVEI A,ALOFRK
	LSH A,-^D9		;GET PAGE # OF ALO ROUTINE
	HRLI A,400000
	MOVEI B,ALOFRK
	LSH B,-^D9		;MUST SHIFT AT RUN TIME CAUSE RELOCATION
	HRL B,ALOFH
	PMAP			;MAP CODE PAGE INTO FORK
	AOS A
	AOS B
	PMAP			;GIVE IT THE NEXT PAGE TOO.  MAY CROSS
	MOVE A,ALOFH
	MOVEI B,ALOFRK
	SFORK			;START ALO FORK

;JOB ISN'T LOGGED IN, SEE IF ITS TIME TO AUTO-LOGOUT IT.
CMDN5D:	CALL ALOTST

CMDN5E:	SKIPE CJINIT		;CREATED JOB?
	 JRST CMDN5F		;YES
	SKIPN AUTFLG		;AUTOSTARTUP JOB ?
	 JRST CMDN6		;NO
	SETOM ALOFH		;YES, DISABLE AUTO LOGOUT FORK
	MOVE A,AUTFLG		;GET JFN OF PROG TO START
	MOVEM A,CJFN1		;AND SET FOR GET
	SETZM AUTFLG		;CLEAR AUTOSTART FLAG
	CALL $RESET
	CALL $GET2		;DO THE GET AFTER CFORK IF NEEDED
	MOVE A,FORK
	MOVE B,APJFN
	SPJFN
	JRST ..STRT


CMDN5F:	SETZM CJINIT		;CANCEL CREATED JOB INIT STATE
	MOVSI A,(1B3)		;"FAKE LOGIN TYPEOUT" FROM CRJOB
	TDNE A,CJFLGS		;SUPPOSED TO?
	SKIPG CUSRNO		;SKIP IF LOGGED IN
	 JRST CMDN5G		;CAN'T FAKE LOGING TYPEOUT IF NOT
	SETZ A,			;USE CURRENT TIME
	ETYPE < JOB %J ON LINE %L %1D %E>
	PRINT EOL
	CALL GLSTLI		;GET DATE OF LAST LOGIN TO A
	ETYPE< PREVIOUS LOGIN %1D %E>
	CALL JOBCNT		;WARN OF OTHER JOBS
	PRINT EOL
	CALL DWNTIM
	CALL CHKDAL

CMDN5G:	MOVE A,CJFLGS		;FLAGS FROM CRJOB ENTRY
	SKIPL FORK		;IF THERE IS A FORK
	TLNN A,(1B2)		;"START INFERIOR" BIT
	 JRST CMDN6		;NO FORK, OR NO START COMMAND

CMDN5H:	HRRZ B,CJFKSA		;ENTRY VECTOR OFFSET
	JRST START1		;RUN IT


;GET DATE OF LAST LOGIN

GLSTLI:	MOVE A,['LGNPAR']
	CALL $SYSGT
	SKIPN A,B
	 RET			;RETURN 0 IF NO SUCH TABLE
	HRLI A,1		;SET TABLE INDEX
	GETAB
	 MOVEI A,0
	RET

;DO PERIODIC CHECK FOR NEW MAIL ARRIVAL

CMDN6:	SKIPL MSGTIM		;IF "MAIL WATCH OFF"
	SKIPG CUSRNO		;OR NOT LOGGED IN
	 JRST CMDN6D		;FORGET THE CHECK
	TIME			;GET MILLISECOND TIME
	CAMG A,MSGTIM		;PASSED DEADLINE FOR MAIL CHECK?
	 JRST CMDN6D		;NO

CMDN6A:	MOVEI A,CMDN6C		;SET DISPATCH IN CASE CHKMSG BOMGS OUT
	MOVEM A,CERET
	MOVE A,CUSRNO		;OUR USER #
	CALL CHKMSG		;SKIP IF USER IN A HAS NEW MAIL
	 JRST CMDN6C		;HE DOES NOT. JUST MAKE NEW DEADLINE.

CMDN6B:	CALL CRIF
	TYPE <[YOU HAVE NEW MAIL]>
	PRINT EOL
	MOVE A,COJFN		;OUTPUT JFN
	DOBE			;WAIT TILL COMPLETELY TYPED

CMDN6C:	TIME			;GET "NOW" AND TICKS/SECOND
	MOVEI C,^D<10*60>	;10 MINUTES OF SECONDS
	IMULI C,0(B)		;CONVERT TO TICKS
	ADDM C,A		;NEXT DEADLINE
	MOVEM A,MSGTIM		;NOTE: NOT UPDATED IF ^C DURING DOBE
	MOVEI A,RERET		;RESTORE NORMAL ERROR DISPATCH
	MOVEM A,CERET
CMDN6D:!

;DO PERIODIC CHECK OF PRINTER DIRECTORY

CMDN6E:	SKIPL PRNTIM		;IF "PRINTER WATCH OFF"
	SKIPG CUSRNO		;OR NOT LOGGED IN
	 JRST CMDN6J		;FORGET THE PRINTER CHECK
	TIME			;GET MILLISECOND TIME
	CAMG A,PRNTIM		;PASSED DEADLINE FOR PRINTER CHECK?
	 JRST CMDN6J		;NO

CMDN6F:	CALL CRIF		;ENSURE AT LEFT MARGIN
	MOVEI A,CMDN6H		;SET SPECIAL ERROR DISPATCH
	MOVEM A,CERET
	HRRZ A,CUSRNO		;OUR USER #
	CALL CHKPRN		;CHECK THE SPOOLER
	 JRST [	UTYPE [ASCIZ /[LINE PRINTER OUTPUT DONE]/]
		PRINT EOL
		MOVE A,COJFN
		DOBE
		SETOM PRNTIM	;CANCEL SUBSEQUENT CHECKING
		JRST CMDN6I]

CMDN6G:	TYPE <[YOUR LISTING HAS NOT FINISHED]>
	PRINT EOL
	MOVE A,COJFN
	DOBE

CMDN6H:	TIME			;GET "NOW" AND TICKS/SECOND
	MOVEI C,^D<60*5>	;5 MINUTES OF SECONDS
	IMULI C,0(B)		;CONVERT TO TICKS
	ADDM C,A		;NEXT DEADLINE
	MOVEM A,PRNTIM
CMDN6I:	MOVEI A,RERET		;RESTORE NORMAL ERROR DISPATCH
	MOVEM A,CERET
CMDN6J:!

;DO PERIODIC CHECK FOR NEWLY-SCHEDULED DOWNTIME

	SKIPL DWNMSF		;IF DOWNTIME ALREADY PRINTED
	SKIPG CUSRNO		;OR NOT LOGGED IN
	 JRST CMDN6K		;FORGET THE DOWNTIME CHECK
	TIME			;GET THE MILLISECOND TIME
	CAMG A,DWNMSF		;TIME TO CHECK AGAIN YET?
	 JRST CMDN6K		;NO
	CALL DWNTIM		;YES, CHECK FOR AND PRINT OUT DOWNTIME
	TIME			;GET "NOW" AND TICKS/SECOND
	MOVEI C,^D<60*30>	;30 MINUTES OF SECONDS
	IMULI C,0(B)		;CONVERT TO TICKS
	ADDM C,A		;NEXT DEADLINE
	SKIPL DWNMSF		;UNLESS CANCELLED DUE TO PRINTOUT
	MOVEM A,DWNMSF
CMDN6K:!

;PRINT READY CHARACTER AND INPUT AND DECODE COMMAND

CMDN7:	CALL READY		;PRINTS "@" OR "!" IF PRIV CMDS ENABLED

;BEGIN INPUTTING AND DECODING A COMMAND

;FIRST, INPUT FIRST FIELD. MUST INPUT WHOLE FIELD SO EDITING WORKS!
; DISTINGUISH 3 CASES:
;	COMMAND BEGINS WITH A SPECIAL CHARACTER
;	COMMAND BEGINS WITH A WORD
;	COMMAND BEGINS WITH AN OCTAL NUMBER

	TLO Z,NEOLF	;SAY DON'T ECHO EOL'S, BECAUSE THIS INPUT
			;FIELD MAY BE A SUBSYSTEM NAME, AND GTJFN
			;PRINTS AN EOL IF THERE IS AN EOL IN STRING,
			;AND WE DON'T WANT TWO EOL'S PRINTED.
			;THE FOLLOWING INPUTS A FIELD (IE TO A
			;NON-ALPHANUMERIC CHARACTER), EDITS,
			;AND IF INPUT WAS "?",
			;TYPES GIVEN MESSAGE AND INPUTS AGAIN.
			;"%Z" IN MESSAGE EXPANDS TO ALL
			;KEYWORDS IN TABLE.

	MOVEI A,CTBL1		;COMMAND TABLE ADDRESS FOR %Z
	INHELP <
COMMANDS ARE:
%1Z
 SUBSYSTEM NAME
 SAVE FILE NAME
 NUMBER/
 NUMBER\ NUMBER
 ; COMMENT

>
	CAIG CNT,1		;IS FIELD COUNT (INCL. TERMINATOR) > 1?
	JRST CIN1A		;NO, COMMAND BEGINS WITH SPECIAL CHAR
	MOVE B,.BFP		;BYTE PTR TO BEGINNING OF FIELD
	HRREI D,-1(CNT)
CIN0A:	ILDB A,B		;GET CHARACTER OF FIELD
	MOVE C,CHRTBL(A)	;GET INFO ABOUTSAID CHARACTER
	TRNN C,OCTDIG		;TEST OCTAL DIGIT BIT
	JRST CIN1C		;COMMAND MUST BEGIN WITH A WORD
	SOJG D,CIN0A		;CHECK ALL CHARACTERS OF FIELD
	JRST CIN6		;COMMAND BEGINS WITH AN OCTAL NUMBER

;HANDLE CASES WHERE A NON-ALPHANUMERIC CHARACTER BEGINS COMMAND

CIN1A:	TLZE Z,EOLNEF
	PRINT EOL		;IF THE CHARACTER WAS EOL, NOW ECHO IT
	CALL PASCOM		;IF LINE IS JUST A COMMENT, CHEW IT UP.
	TRNE CBT,TEOL		;EOL, SEMICOLON, OR FORMFEED?
	JRST CMDIN4		;YES, NULL LINE, GO GET ANOTHER LINE.
        CAIN TRM,CTRLE		;^E PREFIXES PRIVILEGED COMMANDS
	JRST [	SKIPN PRVENF	;ARE PRIV COMMANDS ENABLED?
		 JRST CERR	;NO
                KEYWD CTBL2     ;SEARCH SPECIAL TABLE
		 0		;NO DEFAULT
		 JRST CERR	;NOT FOUND
		JRST CIN2]	;WIN
		;OTHER SPECIAL CHARACTERS TO IMPLEMENT LATER ___________
		;  \ = .\
		;  LF = .+1/
		;  ^ = .-1/
		;  . = CURRENT LOCATION (\ OR / CAN FOLLOW)
	CAIN TRM,"<"		;BEGIN DIR NAME FOR "RUN"?
	JRST CIN3C		;YES.

;HAVEN'T RECOGNIZED IT YET.
;THIS SHOULD FALL THRU TO WORD CASE RATHER THAN ERROR OUT IF
;  NULL IS TO BE DEFAULTED TO SOME COMMAND SUCH AS "HELP".
	JRST CERR		;TYPE " ?" AND INPUT NEXT COMMAND.

;COMMAND BEGINS WITH A WORD.
;SEARCH COMMAND TABLE, THEN SUBSYSTEM DIRECTORY,
;THEN GO TO USER'S ERROR ROUTINE.

CIN1C:	CAIE TRM,"."		;PERIOD TERMINATOR PRODUCES ERROR IN
	CAIN TRM,"F"-100	; "KEYWD", (CONTROL-F ALSO),
	JRST CIN3		;BUT IS MEANINGFUL IN SUBSYSTEM NAMES.
	TLO Z,BAKFF+NEOLF	;SAY RE-USE THIS FIELD, DON'T ECHO EOL
	KEYWD CTBL1		;SEARCH TABLE OF REGULAR COMMANDS
	 0			;T HELP,NOLOG+NOCONF+ONEWD
				;COULD DEFAULT TO "HELP"
	 JRST CIN3		;NOT FOUND, GO LOOK FOR SUBSYSTEM NAME.
	;FOUND, FALL INTO CIN2.

;HAVE VALID FIRST KEYWORD IN COMMAND
;OR HAVE DECODED A SPECIAL SYNTAX SUCH AS "<OCTAL #>/".
;VALUE WORD FROM TABLE IS IN AC "KWV".
;MAKE PRE-DISPATCH CHECKS

CIN2:	TLZE Z,EOLNEF
	PRINT EOL		;IF IT ENDED IN UNECHOED CR, NOW ECHO IT
				;ABOVE IS NEEDED DESPITE THE FACT
				;THAT "CONF" DOES IT FOR
				;MULTILINE COMMANDS SUCH AS "LOGIN"
	MOVE KWV1,KWV      	;1ST KW'S VALUE WD STAYS IN KWV1.
	TLNE KWV1,NOLOG
	JRST .+3
	SKIPG CUSRNO		;SKIP IF LOGGED IN
	ERROR <LOGIN PLEASE>
	TLNE KWV1,EASUB		;DOES CMND EXAMINE, ALTER, OR RUN PROG?
	JRST [	SKIPN PRVENF	;YES, PRIVILEGES ENABLED?
		SKIPN PROPSF	;NO, PROPRIETARY PROGRAM?
		JRST .+1	;OK
		JRST CERR]	;UNAUTHORIZED MEDDLING
	TLNE KWV1,ONEWD 	;IS IT A ONE-WORD COMMAND?
        CONFIRM         	;YES, HANDLE CONFIRMATION NOW.

;DISPATCH TO ROUTINE TO DECODE REST OF (NON-ONE-WORD) COMMAND THEN
;EXECUTE COMMAND.
;IF "INFILN" BIT WAS ON, JFN IS STILL IN A, AS WELL AS "CJFN1".

CIN2B:  CALL (KWV1)		;DISPATCH WITH PUSHJ,
				;CAN RETURN WITH POPJ
				;OR JRST CMDIN2,3,4.
	JRST CMDIN4		;WHERE MOST COMMANDS SHOULD RETURN.

;FIRST KEYWORD IS NOT A COMMAND NAME,
; SEE IF ITS A SUBSYSTEM NAME
;ALSO GET HERE ON OCTAL NUMBER NOT FOLLOWED BY /, \, ETC.

CIN3:	TLOA Z,BAKFF+NEOLF+F3	;SAY REUSE FIELD, DON'T ECHO EOL
				;F3 SAYS TO TRY CONN AND LOGIN
				; AFTER SUBSYS
;DIRECTORY SPECIFIED (OPEN ANGLE BRKT. SEEN).  SEARCH ONLY IT.
CIN3C:	TLO Z,BAKFF+NEOLF
	;MOVE A,[B0,,400000]
	;MOVE B,PTTYMD+6		;INTERRUPT MASK
	;MOVE C,PTTYMD+7		;DEFERRED INTERRUPTS
	;STIW			;SET THEM
	;			;ERROR WILL UNSET THEM IN UNKNOWN NAME
	MOVEI A,[ASCIZ /SUBSYS/]	;DEFAULT DIRECTORY NAME
	CALL CPFN		;COLLECT PROGRAM FILE NAME
	 JRST CIN5		;NOT A SUBSYSTEM NAME
	 JRST CIN3B
	 JRST CIN3A
CIN3B:	SKIPG CUSRNO		;SKIP IF LOGGED IN
	ERROR <LOGIN PLEASE>
CIN3A:		;NOTE: KWV1 WAS SET TO 0 ABOVE. 0 IS OK HERE.
	MOVE A,CJFN1		;FILE TO "RUN"
	MOVE B,[1,,FDBCTL]	;CONTROL WORD
	MOVEI C,C		;TO C
	CALL $GTFDB		;GTFDB OR DON'T SKIP
	 JRST CERR		;DOESN'T EXIST FOR THIS USER
	CAIE TRM,33		;MUST CONFIRM IF ALTMODE USED
	TLO KWV1,PROGX		;SAY WE'RE PASSING CONTROL TO PROGRAM
	TLNE C,(FDBEPH)		;IS THE FILE AN EPHEMERON?
	 JRST CIN4		;YES, TO HANDLE AS SUCH
	PUSH P,[..STRT]		;SET RETURN TO JOIN "START" COMMAND
	JRST GET1		;AND JOIN "GET" COMMAND

;RUN AN EPHEMERAL SUBSYSTEM
; THIS IS TO BEHAVE AS AN EXTENTION TO THE EXEC, THEREFORE:
; IT RUNS WITH THE EXEC'S TTY MODES IN EFFECT, AND
; IF THE TERMINATOR WAS SOMETHING THAT CAN BE INTERPRETED
;  AS THE BEGINNING OF A FILE NAME, THE INPUT FILE WILL BE
;  BACKED SO THAT THE EPHEMERON CAN GOBBLE IT.
; EFORK IS -1 OR FORK HANDLE IN WHICH THE EPHEMERON IS RUNNING.
;  THIS IS CHECKED IN ^C AND ERROR ROUTINES FOR APPROPRIATE ACTION.
;  NOTE THAT THESE CONDITIONS ARE HANDLED EXACTLY THE SAME AS
;  IF THEY HAD OCCURRED DURING AN EXEC COMMAND.

CIN4:	SETZ B,			;USE ENTRY VECTOR INDEX 0


;ENTER HERE FROM PLACES LIKE "ARCHIVE DELETE ..."

CIN40:	PUSH P,B		;EV INDEX IN B
	CONFIRM
	SETOM 1
	CALL MAPPF		;FLUSH ANY MAPPED PAGE

CIN41:	INTOFF
	MOVEI 1,-1		;NO CAPS., NONSENSE PC
	CFORK
	 JRST [	INTON
		UERR [ASCIZ /NO FORKS AVAILABLE -- TRY AGAIN/]]
	MOVEM 1,EFORK		;SAY WE HAVE AN EPHEMERAL FORK
	MOVSI 2,777000		;PROCESS CAPABILITIES TO TRANSMIT
	SKIPN LIMITC##		;NOT UNDER A ^ELIMIT CAP?
	 HRRI 2,777777		;TRUE. TRANSMIT USER CAPABILITIES TOO
	SKIPE 3,PRVENF		;IF ENABLED IN THIS EXEC,
	MOVE 3,2		;ENABLE THE EPHEMERON
	EPCAP

CIN42:	PUSH P,SUBSYS		;SAVE OLD SUBSYS NAME
	MOVE B,CJFN1		;FILE TO RUN
	CALL SUBNAM		;SETUP LOCATION SUBSYS
	MOVE 1,SUBSYS
	SETNM
	POP P,SUBSYS		;FOR WHEN WE RUN NORMAL FORK AGAIN

CIN43:	INTON
	MOVEI 1,GETILI		;SET SPECIAL ILLEGAL INSTR DISPATCH
	MOVEM 1,ILIDSP		;IN CASE GET ITRAPS
	HRR 1,CJFN1
	HRL 1,EFORK
	GET
	SETZM ILIDSP		;NO LONGER INTERESTED IN ILL INSTRS
	CALL RLJFNS		;FLUSH ANY JFNS THAT ARE HANGING AROUND

CIN44:	MOVE 1,EFORK
	GEVEC
	HLRE 3,2
	JUMPE 3,.+4
	CAIL 3,1000
	CAIN 3,(JRST)
	CAIA
	 ERROR <NOT RUNNABLE>
	POP P,3			;GET EV INDEX
	ADD 2,3			;COMPUTE START LOCATION
	TLZ 2,-1
	SFORK

CIN45:	WFORK			;^C AND ERRORS HAPPEN HERE
	INTOFF
	MOVE 1,EFORK
	FFORK
	MOVE 2,[CALL CUUO]
	MOVEM 2,41		;REALLY NEEDED?
	RFSTS			;FIND OUT WHY IT TERMINATED
	TLZ 1,(1B0)		;FLUSH FROZEN BIT
	CAMN 1,[2,,0]		;VOLUNTARY TERMINATION
	 JRST [	MOVE 1,EFORK
		KFORK
		SETOM EFORK
		INTON
		JRST CMDIN2]	;RETURN TO COMMAND INPUT
	TLNE 1,077700		;LOOK FOR -1 INSTEAD OF FORK HANDLE
	 JRST [	SETOM EFORK	;SAY IT HAS GONE
		INTON
		UERR [ASCIZ /EPHEMERON KILLED ITSELF/]];WIERD
	PUSH P,A
	INTON
	POP P,A
	PRINT EOL
	TYPE < DURING EPHEMERON:>
	JRST INVOLT		;AFTER "WAIT" IN X1CMD

;NOT A SUBSYSTEM NAME,
; GO TO SPECIAL ERROR PROCESSOR IF THIS USER HAS ONE
;4/30/70: AT THIS POINT WE DON'T KNOW THE WHOLE INPUT TEXT
;	BECAUSE WE HAVEN'T CAPTURED CHARACTERS READ BY GTJFN.

CIN5:	;BRANCH TO PROCESSOR IF ANY
	;(NOT IMPLEMENTED YET)
	JRST CERR		;STANDARD ERROR PROCESSING, "?" TEXT.

;COMMAND BEGINS WITH OCTAL NUMBER

CIN6:	CAIE TRM,"."		;IF IT ENDS WITH ".", OR
	TRNE CBT,TEOL+TSPC+TALT	;IF IT ENDS WITH EOL, SPACE, OR ALTMODE,
	JRST CIN3		;TAKE AS A SUBSYSTEM NAME.

;DECODE SPECIAL SYNTAXES FOR / AND \ COMMANDS.
	TLO Z,BAKFF		;UN-INPUT THIS FIELD
	CALL OCTAL		;INPUT 18-BIT OCTAL NUMBER
	 CALL SCREWUP		;NULL INPUT CAN'T OCCUR
	PUSH P,A		;SAVE VALUE OBTAINED
;THE TERMINATOR OF THE OCTAL NUMBER IDENTIFIES THE COMMAND.
;GET A DUMMY "TABLE VALUE WORD" APPROPRIATE FOR THE COMMAND AND
; GO THROUGH THE REGULAR CHECK AND DISPATCH CODE TO CHECK FOR
; NOT LOGGED IN, PROPRIETARY PROGRAM, ETC.
	MOVE KWV,[EASUB,,CSLSH]
	CAIN TRM,"/"
	JRST CIN2
	MOVE KWV,[EASUB+ALTCON,,CBKSL]
	CAIN TRM,"\"
	JRST CIN2
	JRST CERR
;NOTE: "CIN2" DISPATCHES WITH PUSHJ, SO WHEN COMMAND ROUTINE IS
;ENTERED, THE VALUE SAVED ABOVE IS AT -1(P), NOT 0(P).

;EXECUTE "/" COMMAND (EXAMINE)
;DECODING AND CHECKS ARE COMPLETE, CONFIRMATION ISN'T USED.

CSLSH:	MOVE A,-1(P)		;ADDRESS
	CALL MAPPF		;MAP THAT PAGE & GET ACCESS INFO
	TLNN A,B5
	ERROR <NO SUCH PAGE>
	TLNN A,B2
	ERROR <CAN'T READ THAT PAGE>
	MOVE A,-1(P)		;GET ADDRESS AGAIN
	MOVEM A,DOT		;UPDATE CURRENT LOCATION
	ANDI A,777		;GET REL ADDRESS IN PAGE
	PRINT TAB		;OUTPUT A TAB
	HLRZ B,PAGEN(A)		;LH OF WORD IN PAGE BUFFER
	JUMPE B,.+3		;LH NON-0?
	CALL TOCT		;YES, TYPE IT IN OCTAL
	TYPE <,,>
	HRRZ B,PAGEN(A)		;RH
	CALL TOCT		;TYPE IT
	PRINT EOL		;TYPE CARRIAGE RETURN
	JRST CMDIN4		;DONE, GET NEXT COMMAND

;FINISH DECODING AND EXECUTE "\" COMMAND (DEPOSIT)
;SYNTAX IS <ADDR>\<VALUE>
;       OR <ADDR>\<LH><SPACE, TAB, ALT MODE, COMMA, OR 2 COMMAS><RH>

CBKSL:	SKIPL FORK		;FORK EXISTS?
	JRST CBKSL1		;YES
	CALL ECFORK		;NO, CREATE ONE
CBKSL1:	MOVE A,-1(P)		;NOTE: COMMAND RETURN ADDRESS IS AT 0(P)
	CALL MAPPF		;MAP THAT PAGE AND GET ACCESS INFO
	MOVEM A,-1(P)		;SAVE ACCESS INFO WITH ADDRESS
	TLNN A,B5
	JRST [	UTYPE [ASCIZ / [NEW] /] ;ADVISORY MESSAGE
		JRST .+3]		;DON'T TEST WRITE BIT HERE!
	TLNN A,B3
	JRST [	TLNN A,B9		;COPY-ON-WRITE BIT
		UERR [ASCIZ /CAN'T WRITE THAT PAGE/]
		UTYPE [ASCIZ / [SHARED] /]
		JRST .+1]
;GET VALUE
	CALL OCTCOM		;INPUT VALUE, ACCEPTING LH,,RH ETC,
	 JRST CERR		;R1: NULL.   ...AND CHECKS TERMINATOR.
	CONFIRM
	MOVE B,-1(P)
	HRRZM B,DOT		;UPDATE CURRENT LOCATION

;STORE A AT B IN FORK. ASSUME WE STILL HAVE THE PAGE.

CBKSL5:	ANDI B,777		;MASK OFF PAGE # PART OF ADDRESS
	MOVEM A,PAGEN(B)	;STORE INTO PAGE BUFFER

;EXECUTION OF "\"...
;IF ADDRESS < 20, SET FORK AC'S. NON-AC PAGES HANDLE THEMSELVES.
	MOVE C,DOT
	CAILE C,17
	JRST CMDIN4
	MOVE A,FORK
	MOVEI B,PAGEN
	CAIGE C,20
	SFACS
	JRST CMDIN4

;SUBROUTINE TO "AUTOLOGOUT" THIS JOB IF NOT LOGGED IN AND MORE
; THAN "AUTOL1" SECONDS HAVE ELAPSED SINCE STARTUP.
;ONE CALL IN CMDIN4 AREA.

ALOTST:	PUSH P,A
	GTAD
	SUB A,STRTIM
	SUBI A,AUTOL1
	JUMPG A,AUTOLO		;DO AUTOLOGOUT (XSUBRS.MAC)
	POP P,A
	RET

;ROUTINE FOR FORK TO AUTO-LOGOUT ABANDONED JOBS.
;IF NO TTY ACTIVITY FOR N SECONDS, LOGOUT, ELSE REPEAT, UNTIL LOGGED IN.
;THIS FORK IS KILLED IN "LOGIN" CODE AND "ERRET" CODE
; IN MAIN FORK.

ALOFRK:	MOVEI A,AUTOL2*^D1000	;NUMBER OF SECONDS TO WAIT BEFORE
	DISMS			;...DOING ANYTHING HERE
;LOOP TO LOOK FOR INACTIVE TTY

ALF1:
ALF2:	MOVE C,TTYACF		;AOS'D FOR EVERY CHAR IN/OUT
	MOVEI A,AUTOL3*^D1000	;NUMBER OF SECS DURING WHICH THERE
	DISMS			;... MUST BE NO ACTIVITY
	CAME C,TTYACF		;HAVE ANY CHARS BEEN TRANSFERRED?
	JRST ALF1		;YES, WAIT AND CHECK AGAIN
ALF3:	SETZM STRTIM		;CAUSES AUTOLOGOUT AT COMMAND INPUT IF
				;AN ERROR OR ^C PREVENTS IT FROM
				;COMPLETING AFTER PSI.
	MOVEI A,-1		;MAIN EXEC FORK,
	HRLZI B,B2		;CHANNEL 2
	IIC			;GOOSE TO SAY AUTOLOGOUT NEEDED
	HALTF


;	READ ONLY STORAGE AREA

INTERN CHRTBL		;CHARACTER TABLE

;EXTERNS FOR CELLS REFERENCED IN THIS AREA ONLY
EXTERN LEV1PC,LEV2PC,LEV3PC		;IN XPRIV.MAC
; IN "SUBRS" ASSEMBLY:
EXTERN HUPSI,USEPSI,ILIPSI,EOFPSI,DATPSI,CCPSI,ALOPSI
; SPECIAL CHARACTER ROUTINES:
EXTERN $CTRLA,$CTRLR,$CTRLV,$CTRLW,$CTRLX,$FORMF,$EOL,$DASH,$CONT,$RUB

;COMMAND TABLES

;FORM:
;       LABEL:  NUMBER OF ENTRIES
;               [VALUE],,[ASCIZ @TEXT@]  FOR EACH ENTRY, ALPH ORDER
;   VALUE IS GENERALLY  BITS,,ADDRESS
;       SEE "DEFINITIONS" FILE FOR BIT SYMBOLS AND MACRO DEFINITIONS

;MACROS USED TO GENERATE TABLES (DEFINED IN "DEFINITIONS" FILE)
;
;	T TEXT[,BITS[,ADDRESS]]		;HERE []'S MEAN OPTIONAL
;		SETS UP ENTRY. DEFAULTS ADDRESS TO ".TEXT", OR IF
;		THAT IS UNDEFINED, TO "NOT IMPLEMENTED" ERROR ROUTINE
;
;	X TEXT
;		CREATES A SPECIAL FAKE ENTRY, TO MAKE AN OTHERWISE
;		UNIQUE SUBSET AMBIGUOUS (EVEN THE EXACT TEXT GIVEN TO X 
;		MACRO WILL BE TREATED AS AMBIGUOUS).  USED WHERE ACTUAL
;		AMBIGUITY IS WITH AN ENTRY IN ANOTHER TABLE SEARCHED
;		LATER.
;
;	TABLE	RESERVES WD FOR # ENTRIES AT TOP OF TABLE
;
;	TEND	FILLS IN # OF ENTRIES SINCE LAST "TABLE" MACRO
;		IN LOCATION RESERVED BY THAT "TABLE" MACRO

;COMMANDS NOT PREFIXED BY ^E.
;ALL BUT THOSE WITH "WOEPUO" BIT ARE AVAILABLE TO ANY USER.

CTBL1:  TABLE
	T ACCESS,LPROK!LANOK		;ACCESS (OF FILES)--(TO)--(IS)--
	T ACCOUNT,LPROK			;ACCOUNT (OF FILE)--(IS)--
	T ADVISE,LPROK+EOLOK+ALTCON	;ADVISE (USER)
	T APPEND,LANOK+CONMAN+LPROK	;APPEND <FILE> (TO) <FILE>
	T ARCHIVE		;ARCHIVE
	T ASSIGN,LPROK			;ASSIGN <DEVICE> (AS) <NAME>
	T ATTACH,NOLOG+LPROK+ALTCON	;ATTACH (TO JOB) <JOBNO>
	T AVAILABLE,EOLOK+NOLOG+NOCONF	;AVAILABLE LINES/DEV
	T BDDT,ONEWD+ALTCON+EASUB	;START BDDT
	T BREAK,NOLOG+EOLOK+LPROK+ALTCON	;BREAK (LINKS)
	T CHANGE,LPROK+ALTCON		;CHANGE (ACCOUNT TO) #
	T CLEAR,LPROK+CONMAN		;CLEAR DEVICE DIRECTORY
	T CLOSE,LANOK+LPROK+INVIS	;CLOSE (FILE) <NAME>
	T COMMANDS,LPROK+INVIS		;COMMANDS (FROM FILE) <FILE>
	T CON,NSPALT+EOLOK+INVIS,<[UALTYP [ASCIZ /TINUE /] ;CON=CONTINUE
			JRST .CONTI]>	;...DESPITE CONNECT
	T CONNECT,LPROK			;CONNECT (TO DIRECTORY) <NAME>
	T CONTINUE,EOLOK		;CONTINUE
	T COPY,LANOK+CONMAN+LPROK	;COPY <FILE> (TO) <FILE>
	T DAYTIME,ONEWD+NOLOG+NOCONF	;DAYTIME
	T DDT,ONEWD+ALTCON+EASUB	;START DDT
	T DEASSIGN,LPROK		;DEASSIGN <LDEV/DEVICE>
	T DEFINE,LANOK+LPROK+INVIS	;DEFINE (NEW FILE)--(AS)--
	T DELETE,LANOK			;DELETE <FILE>
	T DETACH,EOLOK+LPROK+LANOK+ALTCON	;DETACH JOB
	T DIRECTORY,COMOK+EOLOK+LANOK+ALTCON,..DIRE 	;DIRECTORY.
	T DIS,NSPALT+EOLOK+INVIS+WOEPUO,<[UALTYP [ASCIZ /ABLE /]
			JRST .DISAB]>		;DIS=DISABLE, NOT AMBIG.
	T DISABLE,WOEPUO+ONEWD+ALTCON+INVIS	;DISABLE PRIV CMNDS
	T DISCUSE,ONEWD+NOCONF+NOLOG	;AMOUNT OF DISC AVAILABLE
	T DSKSTAT,ONEWD+NOCONF		;DISK STATUS
	T DUMP,LANOK+CONMAN+LPROK+INVIS	;DUMP (ON) <FILE>

	T EDIT,LANOK+EOLOK+ALTCON		;EDIT <FILE>
	T ENABLE,WOEPUO+ERRUO+EOLOK+INVIS	;ENABLE PRIV CMDS
	T ENTRY,LPROK				;SET ENTRY VECTOR
	T EPHEMERAL,LANOK		;MARK AS AN EPHEMERON
	T ERRSTAT,ONEWD+NOCONF+INVIS	;ERROR STATUS
	T EXEC,EOLOK+ONEWD		;EXEC (RUN SEPARATELY FROM FORK)
	T EXPUNGE,LPROK+EOLOK		;EXPUNGE (DELETED FILES)
	T FILSTAT,NOCONF+ONEWD		;FILE STATUS
	T FORK;				;FORK <N>. AFFECTS /, \, ETC.
	T FORMFEED,NOLOG+ALTCON+ONEWD	;SAYS TTY HAS FORMFEED
	X FU				;REQUIRE 3 CHARS FOR FULLDUPLEX
	T FULLDUPLEX,NOLOG+ONEWD+ALTCON	;SAYS TTY IS FULL DUPLEX
	T GET,LANOK+LPROK		;GET <FILE>
	T GOTO,EASUB+LPROK		;GOTO <OCTAL>
	T HAL,NSPALT+EOLOK+INVIS,<[UALTYP [ASCIZ /FDUPLEX /]
					JRST .HALFD]>	;AVOID HALT
	T HALFDUPLEX,NOLOG+ONEWD+ALTCON
	T HALT,INVIS+EOLOK+COMOK	;HALT THE SYSTEM
	T IDDT,ONEWD+ALTCON+EASUB	;START AN IDDT
	T IMPSTAT,NOLOG+NOCONF+ONEWD	;TYPE STATUS OF IMP
	T INDICATE,NOLOG+EOLOK+LPROK	;INDICATE (FORMFEED)
	T INTERROGATE,LPROK+EOLOK+LANOK+ALTCON	;CHECK ARCHIVE
	T JFNCLOSE,LPROK		;JFNCLOSE <JFN>
	T JOBSTAT,ONEWD+NOCONF		;JOB STATUS
	T LENGTH,NOLOG+LPROK,.LLENG	;LENGTH (OF PAGE IS)
	T LIMIT,LPROK+ALTCON+INVIS	;LIMIT (ADDITIONAL)--(TO)--
	T LINK,NOLOG+LPROK		;LINK (TO)
	X LIS				;BECAUSE OF "LISP"
	T LIST,LANOK+ALTCON		;LIST <FILE>. TAKES SUBCOMMANDS.
	T LOG,NOLOG+NSPALT+EOLOK+LPROK+INVIS+ALTCON,<[UALTYP[ASCIZ/IN /]
			JRST .LOGIN]>	;FUDGE TO RECOG "LOG" AS "LOGIN"
	T LOGIN,NOLOG+EOLOK+LPROK+ALTCON ;LOGIN <USER> <PASSWD> <ACCT>
	T LOGOUT,EOLOK+NOLOG		;LOGOUT
	T LOWERCASE,NOLOG+ONEWD+ALTCON	;SAYS TTY HAS LOWER CASE
	T MAIL,NOLOG
	T MEMSTAT,ONEWD+NOCONF+EASUB	;MEMORY STATUS
	T MERGE,LANOK+EASUB		;MERGE <FILE>
	T MOUNT				;MOUNT <DEVICE>

	X N
IFN DST10X,<	T NETLOAD,ONEWD+NOCONF+NOLOG	;PRINT NETWORK LOAD AVS>
	T NO,NOLOG+ALTCON		;NO TABS/FORMFEED/LOWERCASE
	T NOT,ALTCON			;NOT EPHEMERAL
	T NUMBER,LPROK!NOCONF		;NUMBER (OF DIRECTORY) <NAME>
	T PERPETUAL,LPROK+LANOK+ALTCON	;"PERPETUAL <FILE>"
	T PISTAT,ONEWD+NOCONF		;PISTAT
	T PRINTER,,.PRNTR		;"PRINTER CHECK/WATCH"
	T PROTECTION,LPROK		;PROTECTION (OF FILE)--(IS)--
	T QFD,COMOK+EOLOK+LANOK+ALTCON	;QUICK FILE DESCRIPTION
	T QUIT,EOLOK+ONEWD		;QUIT: EXIT TO SUPERIOR EXEC
	T RAISE,NOLOG+ONEWD+ALTCON	;RAISE L.C. INPUT TO UPPER CASE
	T RECEIVE,EOLOK+LPROK+ALTCON	;RECEIVE (LINKS OR ADVICE)
	T REDIRECT,EOLOK+LPROK+LANOK+INVIS ;REDIRECT PRIMARY I/O
	T REENTER,EOLOK			;REENTER
	T REFUSE,EOLOK+LPROK+ALTCON	;REFUSE (LINKS OR ADVICE)
	T RENAME,LPROK+LANOK+CONMAN	;RENAME (...) -- (TO BE) --
	T RESET,EOLOK+ONEWD		;RELEASES MEMORY & CLOSES FILES
	T REWIND,LPROK+LANOK		;REWIND <DEVICE>
	T RUN,LANOK+LPROK		;RUN <FILE>. STARTS ENV FILE.
	T RUNSTAT,ONEWD+NOCONF		;RUN STATUS: IO WAIT, ETC.
	X SA				;"SAIL" MIGHT BE A SUBSYS
	T SAVE,CONMAN+LPROK+LANOK+EASUB ;SAVE ... (ON) <FILE>.
	T SHUT,LPROK+EOLOK		;SHUT (ALL OPEN FILES)
	T SSAVE,CONMAN+LPROK+LANOK+EASUB  ;SHARABLE SAVE
	T ST,NSPALT+EOLOK+INVIS,<[UALTYP [ASCIZ /ART /]
			JRST .START]>	;ST=START DESPITE STAT
	T STA,NSPALT+EOLOK+INVIS,<[UALTYP [ASCIZ /RT /];STA=START
			JRST .START]>
	T START,EOLOK			;START PROGRAM
	T STAT,WOEPUO+NSPALT+EOLOK+NOCONF+INVIS,<[UALTYP [ASCIZ /ISTICS /]
			JRST .STATI]>	;"STAT" = "STATISTICS"
	T STATISTICS,WOEPUO+EOLOK+NOCONF+INVIS ;SYSTEM STATISTICS
	T STATUS,ONEWD+NOCONF+INVIS	;SEE SYSTAT, JOBSTAT, ETC.
	T STOPS,ALTCON			;SET SOFTWARE TAB STOPS
	T SYSTAT,ONEWD+NOCONF+NOLOG	;SYSTEM STATUS PRINTOUT
	X TA				;REQUIRE 3 CHARACTERS FOR "TABS"
	T TABS,NOLOG+ONEWD+ALTCON	;SAYS TTY HAS HDWE TABS
	T TERMINAL,NOLOG+LPROK		;TERMINAL TYPE IS N
	T TRMSTAT,ONEWD+NOCONF		;TERMINAL STATUS TYPEOUT
	T TYPE,LPROK+LANOK+ALTCON	;LIST FILE TO TTY
	T UNDELETE,LPROK+LANOK		;UNDELETE <FILE>
	T UNLOAD,LPROK+LANOK		;UNLOAD <DEVICE>
	T UNMOUNT,LANOK			;UNMOUNT <DEVICE>
	T USESTAT,ONEWD+NOCONF		;TYPES TIME USED, ETC.
	T VERSION,ONEWD+NOCONF		;IN XMAIN.MAC
	T WHERE,LPROK+NOLOG+NOCONF	;WHERE (IS USER) <NAME>
	T WIDTH,NOLOG+LPROK,.LWIDTH	;WIDTH (OF LINE IS)
        TEND
	REPEAT 5,<0>		;ROOM TO BLT TABLE DOWN FOR PATCHING

;PRIVILEGED COMMANDS PREFIXED WITH ^E
;ONLY LEGAL FOR PRIV USERS WHO HAVE "ENABLE"D PRIV COMMANDS

CTBL2:  TABLE
	;T ACCOUNT,ONEWD+WHLUO+OPRUO,..ACCO  ;TURNS ON ACCOUNTING
	;T ASSIGN,WHLUO+OPRUO,..ASSI 	;^EASSIGN <DEVICE>
	;T BROADCAST,ONEWD+WHLUO+OPRUO	;SEND MSG TO ALL TERMINALS
	T CREATE,LPROK+OPRUO+WHLUO	;CREATE/MODIFY DIRECTORY
	T CYCLE,LPROK+OPRUO+WHLUO	;CYCLE THE NETWORK
	T DISK,LPROK+OPRUO+WHLUO,...DSK	;SET PANIC LEVELS
	T EDDT,ONEWD+WHLUO		;GO TO DDT LOOKING AT EXEC
	T INITIALIZE,WHLUO+OPRUO	;INITIALIZE SOMETHING
	T K,LPROK+WHLUO,.KFACT		;K (FACTOR) IS ...
	T LIMIT,WHLUO+OPRUO+ERRUO,..LIMI	;LIMIT SOMETHING
	T LOAD,LPROK+WHLUO+OPRUO		;LOAD (EDDT)
	T NETWORK,WHLUO+OPRUO+LPROK	;TURN OFF/ON NETWORK
	;T NOACCOUNT,ONEWD+WHLUO 	;TURNS OFF SYSTEM ACCOUNTING
	T OFFLINE,LPROK+WHLUO+OPRUO	;REMOVE CORE PAGES
	T ONLINE,LPROK+WHLUO+OPRUO	;ADD CORE PAGES
	T PAUSE,LPROK+WHLUO+OPRUO,..PAUS	;DCHKSW CONTROL
	T PERMIT,LPROK+WHLUO+OPRUO	;PERMIT LOGINS
	T PRINT,LPROK+WHLUO+OPRUO	;PRINT DIRECTORY INFORMATION
	T PROCEED,LPROK+WHLUO+OPRUO	;PROCEED AT BUGCHK
	T PROHIBIT,LPROK+WHLUO+OPRUO	;PROHIBIT LOGINS
	T SET,LPROK+WHLUO+OPRUO+CONMAN	;SET DATE AND TIME
	T SYSTEM,LPROK+WHLUO+OPRUO	;DEBUGSW CONTROL
	T TRAPS,LPROK+WHLUO+OPRUO	;JSYS TRAPS ON/OFF
	T UNLOAD,LPROK+WHLUO+OPRUO,..UNLOA	;UNLOAD (EDDT)
	;T UNHANG,WHLUO+OPRUO		;^E UNHANG <DEVICE>
	TEND

;CHARACTER TABLE

;ONE WORD PER CHARACTER:
;	DESCRIPTIVE BITS IN RIGHT HALF
;	LH: SPECIAL CASE DISPATCH FOR SUBROUTINE "CCHRI" (XSUBRS.MAC).
;WORD FROM "CHRTBL" FOR LAST CHARACTER IS GENERALLY IN THE AC "CBT".

;BITS IN RIGHT HALF (VALUES DEFINED IN FILE "D")
; ALPHAN	ALPHANUMERIC CHARACTERS, - # '
; OCTIG		0-7
; PUNBIT	MOST OTHERS EXCEPT FILE NAME FIELD TERMINATORS
; TEOL		EOL, SEMICOLON, FORMFEED
; TSPC		SPACE, TAB
; TALT		ALT MODE
; TCOM		COMMA
; TLPR		LEFT PAREN
; TRPR		RIGHT PAREN
; TCOL		COLON
; TLAN		LEFT ANGLE BRACKET
; TRAN		RIGHT ANGLE BRACKET

CHRTBL:	0		;NULL
 $CTRLA,,0		;^A  DELETE CHARACTER
	0		;^B
	0		;^C
	0		;^D
	0		;^E
	0		;^F "RECOGNIZE FIELD" FOR FILE NAMES
	0		;^G
	0		;^H - BACKSPACE -  MAKE IT DELETE A CHAR
	TSPC		;^I = TAB. TREATED LIKE SPACE.
	0		;^J = LINE FEED
	0		;^K
 $FORMF,,TEOL		;^L FORM FEED
	0		;^M = CR. CR-LF BECOMES EOL B4 CHRTBL REFERENCE
	0		;^N
	0		;^O
	0		;^P
	0		;^Q
 $CTRLR,,0		;^R RETYPE LINE
	0		;^S
	0		;^T PRINT RUNTIME PSI CHARACTER
	0		;^U
 $CTRLV,,0		;^V QUOTE NEXT CHARACTER
 $CTRLW,,0		;^W DELETE FIELD
 $CTRLX,,0		;^X DELETE WHOLE COMMAND
	0		;^Y
	0		;^Z MEANS EOF FROM TTY TO COPY CMD
	TALT		;33: ALT MODE
	0
	0
	0
 $EOL,,TEOL		;37: EOL (REPRESENTS CR-LF)

	TSPC		;40: SPACE
	PUNBIT		;!
	PUNBIT		;"
	ALPHAN		;# "ALPHANUMERIC" FOR NOISE WDS, EG "JOB #"
	PUNBIT		;$
	PUNBIT		;%
 $CONT,,PUNBIT		;&: CONTINUE ON NEXT LINE, TREATED AS SPACE
	ALPHAN		;'
	TLPR		;(
	PUNBIT+TRPR	;)
	PUNBIT		;*
	PUNBIT		;+
	TCOM		;,
 $DASH,,ALPHAN		;- "ALPHANUMERIC" BECAUSE ITS FIELD-NULLER
	0		;.
	PUNBIT		;/
REPEAT 10,<ALPHAN+OCTDIG		;0 THRU 7
>
	ALPHAN		;8
	ALPHAN		;9
	TCOL		; : ACCEPTABLE TERMINATOR FOR DEVICE NAMES
	PUNBIT+TEOL	;SEMICOLON: TREAT AS EOL WHEN USED AS TERMINATOR
	TLAN		;<
	PUNBIT		;=
	TRAN		;>
	PUNBIT		;?
	PUNBIT		;100: @
REPEAT ^D26,<ALPHAN	;A THRU Z = 101 THRU 132
>
	PUNBIT		;[
	PUNBIT		;\
	PUNBIT		;]
	PUNBIT		;^
	PUNBIT		;_
	0		;140=WHAT?
REPEAT ^D26,<ALPHAN	;LOWER CASE A-Z = 141-172
>
	0
	0
	0
	0
 $RUB,,0		;177: RUBOUT
IFN .-CHRTBL-200,<PRINTX CHARACTER TABLE SCREWED UP
>

;PSEUDO-INTERRUPT SYSTEM TABLES

;LEVEL TABLE: WHERE TO STORE PC'S FOR VARIOUS LEVELS

LEVTAB:	LEV1PC
	LEV2PC
	LEV3PC

;CHANNEL TABLE
;INDEXED BY CHANNEL NUMBER. LEVEL,,ADDRESS FOR EACH.

CHNTAB:	
 0		;0: USED BY MINI-EXEC?
 1,,CCPSI	;1: ASSIGNED BY PROGRAM TO ^C
 1,,ALOPSI	;2: ASSIGNED BY PROGRAM TO AUTO-LOGOUT
 2,,USEPSI	;3: ASS BY PROG TO CHAR TO PRINT RUNTIME (^T)
 2,,HUPSI	;4: ASS BY PROG TO DATAPHONE HANGUP
 0
 0		;6: OV, FOV, NODIV, FXU (SHOULDN'T BE ENABLED)
 0
 0
 1,,[UTRAP [ASCIZ /PUSHDOWN OVERFLOW/]] ;9: PDL OVERFLOW
 1,,EOFPSI	;10: END OF FILE
 1,,DATPSI	;11: FILE DATA ERROR
 1,,[UTRAP [ASCIZ /FILE ERR 3/]]  ;12: "FILE COND 3" (AS YET UNDEF)
 1,,[UTRAP [ASCIZ /FILE ERR 4/]]  ;13: "FILE CONDITION 4" ( " " " )
 0		;14: TIME OF DAY.
 1,,ILIPSI	;15-18: I>>, MR>>, MW>>, MX>>
 1,,[UTRAP [ASCIZ /ILLEG MEM READ/]]
 1,,[UTRAP [ASCIZ /ILLEG MEM WRITE/]]
 1,,[UTRAP [ASCIZ /ILLEG MEM EXECUTE/]]
 0		;19: SUBSIDIARY FORK TERMIATED (SHDN'T BE ON)
 1,,[UTRAP [ASCIZ /SYSTEM STORAGE CAPACITY EXCEEDED/]]  ;20:DRM,DSK
 REPEAT 3,<0>	;21-23: UNASSIGNED
 REPEAT ^D12,<0>	;24-35: GENERAL
IFN .-CHNTAB-^D36,<PRINTX CHNTAB SCREWED UP
>

;SPECIFIC EXEC COMMAND ROUTINES
;THESE ROUTINES ARE DISPATCHED TO BY THE MAIN LOOP, AS DRIVEN
;BY THE TABLES

;THE COMMAND ROUTINES ARE GROUPED AS FOLLOWS:

;  REST OF XMAIN.MAC:
;    STATUS COMMANDS GROUP -- STATUS, JOBSTAT, RUNSTAT, USESTAT,
;	FILSTAT, DSKSTAT, SYSTAT, STATISTICS, ERRSTAT, MEMSTAT.
;    TERMINAL CHARACTERISTICS COMMANDS GROUP -- HALFDUPLEX, FULLDUPLEX,
;	TABS, FORMFEED, LOWERCASE, NO ... , INDICATE.

;  X1CMD.MAC:
;    OTHER COMMANDS, IN ALPHABETICAL ORDER.
;    MOST PRIVILEGED COMMANDS.

;  X2CMD.MAC, X3CMD.MAC, X4CMD.MAC, X5CMD.MAC:
;    SOME COMMANDS WITH LONG ROUTINES, SEGREGATED TO REDUCE
;    NORMAL WORKING PAGE SET:
;	X2CMD.MAC:	COPY, LIST/TYPE, REDIRECT/DETACH
;	X3CMD.MAC:	DIRECTORY,
;	X4CMD.MAC:	CREATE, PRINT
;	X5CMD.MAC:	NETLOAD

;  ABOVE IN XMAIN.MAC:
;    /, \, VERSION


;STATUS COMMANDS GROUP

;STATUS

.STATU:	TYPE < THE STATUS COMMANDS AVAILABLE ARE:
 PISTAT, DISCUSE, IMPSTAT,
 JOBSTAT, RUNSTAT, USESTAT, MEMSTAT, FILSTAT, DSKSTAT, AND SYSTAT.
>
	RET

;JOBSTAT

.JOBST:	ETYPE < TSS JOB %J, USER %N%, %L%
>
JOBST0:	RET	;REST REMOVED TILL GFRKS DONE. 5/22/70 ______________
;TYPE FORK STRUCTURE
	MOVEI A,400000		;SAY START AT SELF
	MOVEI B,CSBUF		;USE STRING BUFFER
	TLO B,B0		;SAY ASSIGN HANDLES
	GFRKS			;GET FORK STRUCTURE
	HRRZ D,(B)		;POINTER TO FORKS INFERIOR
	SETZ E,			;INITIALIZE LEVEL COUNTER
	;FALL INTO FSTRUC
	;"FSTRUC" MUST BE NEXT

;FSTRUC
;RECURSIVE SUBR TO TYPE FORK STRUCTURE OF JOB.
;FOR EACH FORK, TYPES HANDLE AND STATUS.
;  FILE NAME OR "PROGRAM" WOULD ALSO BE DESIRABLE IF IT WERE AVAILABLE.
;STRUCTURE INDICATED BY PUTTING A FORK'S INFERIORS RIGHT AFTER IT,
;  INDENTING 3 COLUMNS PER LEVEL.
;THUS PARELLEL FORKS ARE THOSE WHICH APPEAR AT SAME INDENTATION WITH
;  NO LESS-INDENTED ENTRIES BETWEEN THEM.
;TAKES: D: POINTER TO GFRKS TABLE, SET UP BY CALLER.
;	E: LEVEL COUNTER, ZEROED BY TOP LEVEL CALLER.

;ENTRY POINT IS AT END BUT COMES RIGHT HERE.
;TYPE STUFF FOR THIS FORK.

FSTR1:	PRINT " "
	MOVE A,E
	TYPE <   >;		;INDENT 3 SPACES PER LEVEL BELOW FIRST.
	SOJGE A,.-1
	TYPE <FORK >;
	HRRZ B,1(D)		;GET THIS FORK'S HANDLE FROM TABLE
	JUMPE B,[UTYPE [ASCIZ /**/]		;NO HANDLE ASSIGNED
		JRST FSTR2]
	TRZ B,B0		;PRINT IN FORM ## NOT 4000##
	MOVE A,COJFN
	MOVEI C,10
	NOUT			;FORK HANDLE, OCTAL
	 CALL JERRC		;JSYS ERROR ROUTINE FOR ERROR NUM IN C
FSTR2:	TYPE <: >;
	HRRZ A,1(D)		;HANDLE AGAIN
	CALL FSTAT		;TYPE ITS STATUS
	PRINT EOL
;NOW DO ALL OF THE FORK'S INFERIORS, BY RECURSION.
	PUSH P,D
	HRRZ D,(D)		;INFERIOR PTR FROM GFRKS TABLE.
	AOS E			;DOWN LEVEL
	CALL FSTRUC		;RECURSIVE CALL TO DO ENTIRE SUBTREE
	SOS E			;UP LEVEL
	POP P,D
	HLRZ D,(D)		;PARALLEL PTR FROM GFRKS TABLE

;ENTRY POINT.  NOP IF 0 PTR GIVEN.
FSTRUC:	JUMPN D,FSTR1
	RET

;RUNSTAT

.RUNST:	PRINT " "
	SKIPGE FORK
	JRST [	UTYPE [ASCIZ /NO PROGRAM/]
		JRST RUNST8]
	SKIPGE A,LFORK
	JRST [	UTYPE [ASCIZ /NEVER STARTED/]
		JRST RUNST8]
	ETYPE <%F%>	;TYPE "FORK N" IF THIS EXEC HAS >1 INFERIOR
	CALL FSTAT		;TYPE STATUS OF THE FORK
RUNST8:	PRINT EOL
	CALL LAPRNT		;PRINT THE LOAD AVERAGE
	JRST EOLRET


;SUBROUTINE TO PRINT THE LOAD AVERAGE.
;USED BY ^T INTERRUPT AND BY RUNSTAT

LAPRNT:	MOVE A,['SYSTAT']
	CALL $SYSGT
	JUMPN B,.+2
	CALL SCREWUP		;NO SUCH TABLE??
	MOVSI A,14		;INDEX OF 1 MIN. AV.
	HRR A,B			;TABLE PTR
	GETAB
	 CALL SCREWUP
	ETYPE < LOAD AV. = %1Q>
	RET

;FORK STATUS TYPEOUT SUBR FOR "RUNSTAT" AND "JOBSTAT".
;TAKES HANDLE IN A, CLOBBERS A.
;USED IN FSTRUC (JOBSTAT), RUNSTAT, ^T PSI ROUTINE (XSUBRS.MAC)

FSTAT:	PUSH P,B
	PUSH P,C
	PUSH P,D
	RFSTS			;GET STATUS IN A, PC IN B
	HLRZ C,A		;B1-17 = STATUS
	CAIN C,-1		; -1 = UNASSIGNED HANDLE. (OR SUPERIOR?)
	JRST [	MOVEI D,[ASCIZ /PROGRAM DISAPPEARED/]; ..KILLED PROGRAM
		JRST FSTAT8]
	TRZ C,B0		;FLUSH FROZEN BIT
	CAIN C,6		;BREAKPOINT?
	JRST FSTAT4		;YES
	CAIE C,2		;HALT OR FORCED TERM?
	CAIN C,3
FSTAT4:	TLZ A,B0		;YES, WASN'T RESULT OF ^C
	JUMPL A,[UTYPE [ASCIZ /INTERRUPTED FROM /]	;"FROZEN" BIT ON
		JRST .+1]		;TYPE STATUS AND PC
	UTYPE @[[ASCIZ /RUNNING/]
		[ASCIZ /IO WAIT/]
		[ASCIZ /HALT/]		;INCLUDES NEVER STARTED
		[ASCIZ /HALT: /]
		[ASCIZ /FORK WAIT/]
		[ASCIZ /SLEEP/]
		[ASCIZ /BREAKPOINT/]](C)	;NOTE INDEX!
	MOVEI D,[ASCIZ / AT %2P/]	;%2P TYPES PC FROM B
	CAIE C,3
	JRST FSTAT8		;GO OUTPUT "AT <PC>"
				;AFTER ERROR STOP, TYPE REASON AS GIVEN
				;BY PSI CHAN # IN RH OF A.  USE TEXT
				;FROM "START" COMMAND'S ERROR MSG TAB.
	MOVE D,@WHY		;SEE "START". USES A.
FSTAT8:	UETYPE (D)		;TYPE MSG. INCLUDES PC FROM B.
FSTAT9:	POP P,D
	POP P,C
	POP P,B
	RET

;PISTAT
;PSI IS OFF, LEVTAB=NNNNNN, CHNTAB=NNNNNN, CHN MASK=NNNNNNNNNNNN, BIP=N

.PISTA:	CALL CRIF
	SKIPGE 1,FORK
	JRST [	UTYPE [ASCIZ /NO PROGRAM/]
		JRST EOLRET]
	UTYPE [ASCIZ /PSI IS /]
	MOVEI 5,[ASCIZ /ON/]
	SKPIR
	MOVEI 5,[ASCIZ /OFF/]
	UTYPE 0(5)
	RIR
	HLRZ 4,2		;LEVTAB
	HRRZ 5,2		;CHNTAB
	RCM
	MOVE 6,1		;CHN MASK
	MOVE 1,FORK
	RWM
	MOVE 7,1		;BREAKS WAITING
	MOVE 10,2		;BREAKS IN PROGRESS
	AND 10,[17B3]
	MOVE 1,FORK
	RTIW
	MOVE 11,2		;USER TIW
	MOVNI 1,5
	RTIW
	MOVE 12,2		;JOB TIW
	ETYPE <, LEVTAB AT %4O, CHNTAB AT %5O
 CHANNELS ACTIVE:	%6U
 BREAKS WAITING:	%7U
 LEVELS IN PROGRESS:	%10U

 FORK TIW:	%11O
 JOB TIW:	%12O>
	RET

; "IMSTAT"

.IMPST:	MOVE A,['NETRDY']
	CALL READT		;READ INTO 4, 5, ...
	SUBI C,4		;NEW SYSTEMS HAVE LENGTH .GT. 4
	PUSH P,C		;NEW SYSTEM FLAG
	PUSH P,13		;NETRDY[7]: TIME OF IMP-GOING-DOWN MSG
	PUSH P,12		;NETRDY[6]: TIME OF READY LINE ON
	PUSH P,11		;NETRDY[5]: TIME OF READY LINE OFF
	PUSH P,10		;NETRDY[4]: IMP-GOING-DOWN HEADER
	PUSH P,7		;NETRDY[3]: TIME OF LAST NCP RESET
	PUSH P,6		;NETRDY[2]: NCP FLAGS (N.A.)
	PUSH P,5		;NETRDY[1]: NETON
	PUSH P,4		;NETRDY[0]: IMPRDY
	MOVE 1,COJFN		;NEEDED FOR ODTIM'S BELOW

IMPST0:	CALL CRIF		;TYPE CARRIAGE RETURN IF NEEDED
	TYPE <HOST-IMP INTERFACE IS >
	SKIPN 0(P)
	 TYPE <OFF>
	SKIPE 0(P)
	 TYPE <ON>

IMPST1:	CALL CRIF
	TYPE <TENEX-NETWORK SERVICE IS >
	SKIPN -1(P)		;NETRDY[1] SAYS WHICH
	 TYPE <DISABLED>
	SKIPE -1(P)
	 TYPE <ENABLED>

IMPST2:	SKIPG -8(P)		;NEW SYSTEM?
	 JRST IMPSTX		;NO

IMPST3:	SKIPN -1(P)		;NCP RESET RELEVANT ONLY IF NETON
	 JRST IMPST4		;NOT AVAILABLE
	CALL CRIF
	SKIPG 2,-3(P)		;NETRDY[3] HAS LAST NCP RESET
	 TYPE <TENEX HAS NOT RESET NETWORK TABLES SINCE LAST RESTARTED>
	JUMPLE 2,IMPST4		;0 IS AMBIGUOUS
	TYPE <TENEX RESET NETWORK TABLES AT >
	SETZ 3,			;STANDARD FORMAT
	ODTIM

IMPST4:	SKIPN 2,-7(P)		;GTAD OF IMP-GOING-DOWN MSG ARRIVAL
	 JRST IMPST5		;NONE HAS ARRIVED
	CALL CRIF
	SKIPG 2
	 TYPE <WHILE TENEX WAS RESTARTING THE IMP SAID IT WOULD GO DOWN
	>
	 JUMPL 2,IMPS45		;-1 MEANS SYSTEM DIDN'T HAVE TIME
	TYPE <AT >
	SETZ 3,			;STANDARD FORMAT
	ODTIM
	TYPE < THE IMP SAID IT WOULD GO DOWN AT >
	MOVE 1,2
	LDB 2,[POINT 4,-4(P),21];HOW SOON IN 5 MIN. UNITS
	IMULI 2,5
	CALL TIMPMN		;GTAD IN 1 PLUS MINUTES IN 2
	MOVE 2,1		;SET FOR ODTIM
	MOVE 1,COJFN
	SETZ 3,			;STANDARD FORMAT
	ODTIM

IMPS45:	TYPE < FOR >
	LDB 2,[POINT 10,-4(P),31];HOW LONG IN 5 MIN. UNITS
	IMULI 2,5
	MOVEI 3,^D10
	NOUT
	 CALL JERRC
	TYPE < MINUTES DUE TO >
	LDB 2,[POINT 2,-4(P),17];REASON FIELD
	CAIN 2,0
	 TYPE <PANIC>
	CAIN 2,1
	 TYPE <SCHEDULED HARDWARE PM>
	CAIN 2,2
	 TYPE <SCHEDULED SOFTWARE RELOAD>
	CAIN 2,3
	 TYPE <EMERGENCY RESTART>

IMPST5:	CALL CRIF
	SKIPN 2,-5(P)		;NETRDY[5] IS READY LINE OFF TIME
	TYPE <THE READY LINE HAS NOT GONE OFF SINCE TENEX WAS RESTARTED>
	JUMPE 2,IMPST6
	TYPE <MOST RECENT READY LINE OFF WAS >
	SKIPG 2
	 TYPE <WHEN TENEX WAS RESTARTING>
	SETZ 3,			;STANDARD FORMAT
	SKIPL 2
	 ODTIM

IMPST6:	CALL CRIF
	SKIPN 2,-6(P)		;NETRDY[6] IS READY LINE ON TIME
	TYPE <THE READY LINE HAS NOT COME ON SINCE TENEX WAS RESTARTED>
	JUMPE 2,IMPSTX
	TYPE <MOST RECENT READY LINE  ON WAS >
	SKIPG 2
	 TYPE <WHEN TENEX WAS RESTARTING>
	SETZ 3,			;STANDARD FORMAT
	SKIPL 2
	 ODTIM


IMPSTX:	SUB P,[9,,9]		;FLUSH TEMPS
	PRINT EOL
	PRINT EOL
	RET

;USESTAT

.USEST:	ADD P,[10,,10]		;NOTE NO POV CHECK ____
	MOVEI A,-7+0(P)		;POINTER TO BLOCK FOR STRING ACCT
	SETO B,			;SAY THIS JOB
	GACTJ			;GET ACCOUNT OF JOB
	 CALL JERR
	ETYPE < USED %V% IN %C%, ACCT: %1M.>
	CALL PIE.P		;PIE SLICE SYSTEM?
	 JRST USEST1		;NO
	TYPE < (>
	MOVE A,COJFN		;JFN FOR OUTPUT
	GPSGN			;CONVERT PIE SLICE GROUP NAME, THIS JOB
	 CALL JERR
	PRINT ")"
USEST1:	SUB P,[10,,10]		;FLUSH LOCALS
	;ADD CODE TO TYPE USAGE OF RTI, E&S, ETC., IF USED
	RET

;DSKSTAT

.DSKST:	CALL DSKCNT	;COUNT PAGES
	ETYPE < %7Q TOTAL PAGES IN USE - %5Q ALLOWED, %4Q UNDELETED, %6Q DELETED
>
	TLNE Z,B3
	ETYPE < EXCLUDING FILE(S) THAT ARE LIST PROTECTED FROM YOU
>


; "DISCUSE"

.DISCU:	MOVE A,[600000,,777777]	;DSK: DESIGNATOR
	GDSKC
	ETYPE < SYSTEM TOTAL: %2Q PAGES LEFT, %1Q USED
>
	JRST RLJFNS		;RELEASE JFNS AND RETURN

DSKCNT:	SETZB D,F		;FOR SUMS OF TOTAL AND DELETED PAGES
	SETO A,
	MOVE C,JBUFP
	PUSH C,A
	HRLZI A,B2+B8+B11+B17	;OLD, *'S, SHORT CALL, INCL. DELETED
	HRROI B,[ASCIZ /*.*;*/]
	GTJFN
	CALL [	CAIE A,GJFX20
		CAIN A,GJFX32
		JRST [	SUB P,[1,,1]	;FOR NO FILES IN DIRECTORY,
			SETZ G,		;CLEAR TOTAL
			JRST DSKST5]	;TYPE "0 PAGES"
		JRST JERR]
	MOVEM A,(C)		;STACK JFN FOR RELEASING ON
	MOVEM C,JBUFP		;UPDATE JFN STACK
	MOVE E,A		; ERR OR COMPLETION

;LOOP OVER FILES WITH GNJFN
DSKST1:	TLZ Z,B1		;RESET DELETED BIT
	HRRZ A,E		;JFN ONLY
	MOVE B,[1,,FDBCTL]	;CONTROL BITS WORD OF FDB
	MOVEI C,C		;TO BE PUT IN C
	CALL $GTFDB		;GET IT
	JRST DSKST2		;COULDN'T
	TLNE C,(FDBDEL)		;DELETED?
	TLO Z,B1		;YES, SAY SO
	MOVE B,[1,,FDBBYV]	;# PAGES IN RH
	MOVEI C,C
	CALL $GTFDB		;DO GTFDB JSYS, NO SKIP IF NO ACCESS
DSKST2:	TLOA Z,F3		;SAY ACCESS ERROR AND SKIP ADD
	 JRST DSKST4		;GO ADD UP PAGES
DSKST3:	MOVE A,E		;JFN AND FLAGS
	GNJFN			;STEP TO NEXT FILE
	 JRST .+2		;NO MORE FILES
	JRST DSKST1
	MOVE G,D		;FORM SUM
	ADDI G,(F)		;OF DELETED AND UNDELETED
DSKST5:	MOVEI 1,0		;SAY CONNECTED DIRECTORY
	GTDAL			;GET ALLOCATION FOR CONN DIR
	MOVE 5,1		;SAVE FOR PRINTING
	RET			;PRINT RELEVANT NUMS, RELEASE JFN

DSKST4:	TLNE Z,B1		;SUM DELETED OR UNDELETED
	JRST .+3
	ADDI D,(C)		;UNDELETED TOTAL
	JRST DSKST3
	ADDI F,(C)		;DELETED TOTAL
	JRST DSKST3



;CHECK CONNECTED DIRECTORY FOR EXCEEDING DISK ALLOCATION
;USED BY LOGIN, LOGOUT, CONNECT

CHKDAL:	MOVEI 1,0		;SAY CONNECTED DIRECTORY
	GTDAL
	SUB 2,1			;USED MINUS ALLOCATED
	JUMPLE 2,RLJFNS		;JUMP IF NOT OVER ALLOCATION
	CALL CRIF		;BE SURE CARRIAGE IS AT LEFT MARGIN
	ETYPE <[%G OVER ALLOCATION BY %2Q PAGES]
>
	JRST RLJFNS		;GO RELEASE JFN

;MEMSTAT
;TYPES, FOR CURRENT FORK, # PAGES, ENTRY VECTOR,
;AND A TABLE GIVING IDENTITY OF EACH PAGE IN FORK.

.MEMST:	SKIPGE FORK
	JRST [	UTYPE [ASCIZ / NO PROGRAM/]
		JRST EOLRET]
;FIRST TYPE TOTAL # PAGES
	HRLZ A,FORK
	PUSH P,[1000]		;HOW MANY PAGES TO DO
	SETZ D,
MEMS1:	RPACS			;CLOBBERS C IF PAGE LOCKED
	TLNE B,B5
	AOS D
	AOS A
	SOSLE C,0(P)		;MORE PAGES TO BE DONE?
	 JRST MEMS1		;YES
	SUB P,[1,,1]		;FLUSH JUNK
	PRINT EOL
	CAIN D,1
	 JRST [	UTYPE [ASCIZ / ONE PAGE/]
		JRST MEMS2]
	ETYPE < %4Q PAGES>;

;PRINT ENTRY VECTOR

MEMS2:	MOVE A,FORK
	GEVEC
	JUMPE B,MEMS3		;NONE
	HRRZ A,B
	HLRZ B,B
	ETYPE <, ENTRY VECTOR LOC %1O LEN %2O>
MEMS3:	PRINT EOL
	JUMPE D,[RET]		;DONE IF NO PAGES
	PRINT EOL
	;NOW FALL INTO "MMAP" TO TYPE MAP

;SUBROUTINE TO TYPE MEMORY MAP FOR CURRENT FORK, FOR MEMSTAT.
;ACS:	D: PAGE #
;	E & F: IDENTITY OF CURRENT PAGE, A LA RMAP A & B.
;	KWV, KWV1: SAVED IDENTITY OF 1ST PAGE OF GROUP.
;	G: INCREMENT FOR PAGE # IN GROUP OF CONSECUTIVE PAGE IDENTITIES.

MMAP:	SETZ D,

;FIND EXISTING PAGE (TREAT INDIRECT POINTERS AS EXISTING)
MMAP1:	HRL A,FORK
MMAP2:	CAIL D,1000
	JRST EOLRET		;NO MORE PAGES, DONE
	HRR A,D
	RPACS
	TLNN B,B5+B6
	AOJA D,MMAP2		;DOESN'T EXIST, TRY NEXT

;FOUND ONE, PRINT NUMBER
	CALL PAGID		;GET FULL IDENTITY
	 JRST .+2		;3-RETURN SUBR, BUT IRRELEVANT HERE.
	 JRST .+1
	MOVE KWV,E		;SAVE IDENTITY FOR LATER COMPARISONS
	MOVE KWV1,F		;...AND PRINTING
	SETZ G,			;INIT # CONSECUTIVE IDENTITIES
	HRRZ B,D
	CALL TOCT		;PRINT PAGE NUMBER IN OCTAL

;LOOK AT IDENTITY OF NEXT PAGE
	CALL NPAGID		;STEPS D AND GETS IDENTITY
	 SOJA G,MMAP10		;DIFFERENT, GO TYPE IDENTITY
	 JRST MMAP6		;NEXT HIGHER IN SAME FILE OR FORK

;IDENTICAL, SEE HOW MANY MORE ARE
	CALL NPAGID
	 JRST .+3		;DIFFERENT
	 JRST .+2		;NEXT HIGHER
	JRST .-3		;IDENTICAL, KEEP LOOKING
	SETZ G,			;SAY IDENTICAL NOT CONSECUTIVE GROUP
	JRST MMAP7		;GO PRINT "-# <FILE OR FORK> #

;NEXT HIGHER OF SAME FILE OR FORK, SEE HOW MANY MORE ARE CONSECUTIVE
MMAP6:	CALL NPAGID
	 JRST .+2		;DIFFERENT
	 JRST .-2		;CONSECUTIVE, KEEP LOOKING

;PRINT "-#" FOR GROUP OF IDENTICAL OR CONSECUTIVE PAGES
MMAP7:	PRINT "-"
	MOVEI B,-1(D)		;LAST IN GROUP WAS THE PREVIOUS PAGE
	CALL TOCT		;TYPE IN OCTAL

;MMAP...
;PRINT IDENTITY OF PAGES WHOSE #'S WE HAVE JUST PRINTED:
;TYPICALLY FORK OR FILE NAME, # FOR A SINGLE PAGE OR IDENTICAL GROUP,
; #-# FOR CONSECUTIVE GROUP. ALL PRECEDED BY @ IF INDIRECT.

MMAP10:	PRINT TAB
	PRINT " "
	TLNE KWV1,B6
	UTYPE [ASCIZ /@ /]	;INDICATE INDIRECT POINTER
	TLNN KWV1,B5		;DOES PAGE EXIST?
	JRST [	UTYPE [ASCIZ /NO PAGE/] ;CAN HAPPEN WITH INDIRECT.
		JRST MMAP13]
	TLNE KWV1,B10
	JRST [	UTYPE [ASCIZ /PRIVATE/]
		JRST MMAP13]
	CAMN KWV,[-1]		;RMAP RETURNS -1 IF NO JFN FOR FILE
	JRST [	UTYPE [ASCIZ /FORGOTTEN FILE/]
		JRST MMAP13]
	LDB B,[POINT 9,KWV,17]	;JFN OR FORK #
	TLNE KWV,B0		;ON IF FORK
	JRST [	UETYPE [ASCIZ /FORK %2O/]
		JRST MMAP11]
	MOVE A,COJFN
	SETZ C,
	JFNS			;PRINT FILE NAME
MMAP11:	TYPE <  >;
	HRRZ B,KWV
	CALL TOCT		;PAGE # IN FILE OR FORK
	JUMPLE G,MMAP13		;0 INDICATES ONE PAGE ONLY
	PRINT "-"
	ADDI B,-1(G)		;DON'T COUNT LAST PAGE TESTED!
	CALL TOCT		;PRINT LAST PAGE OF CONSECUTIVE GROUP
MMAP13:	TYPE (  )
	TLZ Z,F1		;USED BY "BEFORE"
	TLNN KWV1,B2
	JRST .+3
	CALL BEFORE		;TYPE COMMA OR EOL BETWEEN ITEMS
	PRINT "R"
	TLNN KWV1,B3
	JRST .+3
	CALL BEFORE		;SUBR WITH "AVAIL DEVICES"
	PRINT "W"
	TLNN KWV1,B9
	JRST .+3
	CALL BEFORE
	TYPE <CW>;		;COPY-ON-WRITE
	TLNN KWV1,B4
	JRST .+3
	CALL BEFORE
	PRINT "E"
	TLNN KWV1,B7		;LOCKED BY USER BIT
	 JRST .+3
	CALL BEFORE
	PRINT "L"
	PRINT EOL
	JRST MMAP1		;GO BACK FOR ANOTHER PAGE OR GROUP

;SUBROUTINE FOR MMAP TO GET AND COMPARE IDENTITY OF PAGE
;TAKES IN D: PAGE #, IN KWV, KWV1: IDENTITY OF FIRST PAGE IN GROUP,
; IN G: PAGE # INCREMENT FOR CONSECUTIVE GROUP.
;RETURNS: E, F: IDENTITY OF PAGE, A LA RMAP.
;	+1: DIFFERENT IDENTITY FROM FIRST PAGE OF GROUP
;	+2: NEXT HIGHER PAGE # (THAN KWV1+G, G), G INDEXED
;	+3: IDENTICAL
;IF D > 777, BEHAVES AS THOUGH CURRENT PAGE IS NON-EXISTENT.
;CLOBBERS A,B.

NPAGID:	ADDI D,1		;ENTRY FOR NEXT PAGE
	ADDI G,1
PAGID:	MOVE A,D		;ENTRY TO NOT INDEX PAGE #
	SETZ E,			;FOR NON-EXISTENT OR PRIVATE PAGE
	CAIL A,1000
	JRST [	HRLZI F,B5	;PAGES OVER 777 DON'T EXIST
		JRST PAGID8]
	HRL A,FORK
	RPACS
	HLLZ F,B		;RETURN RPACS INFO IN F
	TLNE B,B5		;DOESN'T EXIST?
	TLNE B,B10		;PRIVATE?
	JRST PAGID8		;THIS IS ALL THE INFO WE NEED.
	RMAP			;GET FILE/FORK HANDLE AND PAGE # THEREIN
	MOVE E,A		;...INTO E.

;COMPARISON TO DETERMINE WHETHER SAME AS PREVIOUS PAGE
;COMPARE THAT INFO WHICH IS PRINTED:
; ALL E, F BITS 2-6, 9, 10.
PAGID8:	MOVE A,E
	XOR A,KWV
	TLNE A,-1
	JRST PAGID9		;DIFFERENT FILES OR FORKS, R1
	MOVE B,F		;RMAP'S ACCESS IS WRONG (1/22/71)
	XOR B,KWV1
	TLNE B,<37B6+1B7+3B10>B53
	JRST PAGID9		;DIFFERENT ACCESS, R1.
	TRNE A,-1
	JRST [	MOVE A,G
		ADD A,KWV
		SUB A,E
		TRNE A,-1
		JRST .+3	;REALLY DIFFERENT PAGE, R1
		JRST .+2]	;NEXT HIGHER PAGE #, R2
	AOS (P)			;SAME IDENTITY INCLUDING PAGE #, R3.
	AOS (P)
PAGID9:	RET

;FILSTAT

.FILST:	PRINT EOL
	GJINF
	CAME A,B		;COMPARE LOGIN AND CONNECTED DIRECTORIES
	ETYPE < CONNECTED TO <%G%>. >;

;JFNS
	TYPE < JFNS:
>
	MOVEI D,MAXJFN		;JFN AND COUNTER
	CALL JSTAT		;TYPE INFO IF JFN ASSIGNED
	SOJGE D,.-1
	PRINT EOL

;DEVICES ASSIGNED TO THIS JOB
	PUSH P,[[TLNE Z,F1	;SET RETURN FOR ASTTJ
		PRINT EOL
		RET]]


;"AVAILABLE DEVICES" ALSO COMES HERE TO TYPE DEVS ASS TO THIS JOB.
ASTTJ:	GJINF			;GET JOB # IN C
	MOVE E,C
	TLZ Z,F1
	CALL DEVLUP		;GET NAME & CHARACTERISTICS FOR EACH
				;DEVICE AND EXECUTES THE NEXT LOCATION.
	 CALL [	CAME C,E	;ASSIGNED TO THIS JOB?
		RET		;NO.
		TLNN Z,F1	;FIRST ONE? ("BEFORE" SETS F1)
		UTYPE [ASCIZ / DEVICES ASSIGNED TO THIS JOB:/]
		CALL BEFORE	;COMMA OR CR OR NIL. AFTER "AVAIL DEV".
		JRST SIXPRT]	;PRINT SIXBIT NAME FROM A.
	TLNE Z,F1
	PRINT EOL
	RET

;TYPE STATUS OF JFN IN RH OF D.
;NOP IF UNASSIGNED.
;IF ASSIGNED, TYPE <JFN> <NAME>
;AND WHAT OPEN FOR AND "NOT OPEN" OR "DATA ERROR" OR "EOF" IF PERTINENT.
;DESTROYS A, B, C, E.  USED IN "FILSTAT".

JSTAT:	HRRZ A,D
	GTSTS
	TLNN B,200
	RET		;UNASSIGNED, RETURN.
	MOVE E,B	;STATUS FOR USE BELOW
	PRINT " "
	MOVE A,COJFN
	HRRZ B,D
	MOVE C,[4,,10]
	NOUT		;JFN, LEFT ADJ IN 4 COLS
	 CALL JERRC
	HRRZ B,D
	SETZ C,		;DEFAULT FORMAT

	MOVEI A,ILIJFN
	MOVEM A,ILIDSP	;SET SPECIAL ILLEGAL INSTRUCTION DISPATCH
	MOVE A,COJFN	;PRIMARY OUTPUT JFN
	JFNS		;PRINT NAME OR TRAP
	SETZM ILIDSP	;CANCEL INSTRUCTION TRAP
	JRST JSTAT2



;HERE IF JFNS TRAPS

ILIJFN:	TLNN E,(1B17)	;LOOK AT STATUS WORD
	 JRST ILIPSI	;TRAPPED FOR SOME OTHER REASON
	TYPE <RESTRICTED TO SOME OTHER FORK>
	PRINT EOL
	RET		;FROM JSTAT

;JSTAT...
;TYPE "NOT OPEN" OR LIST OF "READ", "EXECUTE", ETC.
;IF B0 ON AND B1-3 & 5-6 OFF, TYPES NOTHING. CAN THIS HAPPEN? ______ 
JSTAT2:	PRINT TAB
	TLZ Z,F1		;TELL "BEFORE" NOTHING HAS BEEN PRINTED
	TLNN E,B0
	TYPE < NOT OPENED>;
	TLNN E,B1
	JRST JSTAT3
	CALL BEFORE		;TYPE SPACE OR COMMA-SPACE OR EOL-SPACE
	TYPE <READ>;
JSTAT3:	TLNN E,B2		;OK TO WRITE
	JRST JSTAT4
	CALL BEFORE
	TLNN E,B4		;ALSO OK TO CHANGE POINTER?
	TYPE <APPEND>;		;NO
	TLNE E,B4
	TYPE <WRITE>;		;YES
JSTAT4:	TLNN E,B3		;EXECUTE
	JRST JSTAT5
	CALL BEFORE
	TYPE <EXECUTE>;
JSTAT5:	TLNN E,B5		;AS SPECIFIED BY PAGE TABLE
	JRST JSTAT6
	CALL BEFORE
	TYPE <PER PAGE TABLE>;
JSTAT6:	TLNN E,B6		;CALL AS PROCEDURE
	JRST JSTAT7
	CALL BEFORE
	TYPE <PROCEDURE>;
JSTAT7:	TLNN E,B9
	JRST JSTAT8
	CALL BEFORE
	TYPE <DATA ERROR>;
JSTAT8:	TLNN E,B8
	JRST JSTAT9
	CALL BEFORE
	TYPE <EOF>;
JSTAT9:	TLNE E,B1!B2
	TLNN E,B0
	 JRST JSTA10
	TLNE E,B3!B6
	JRST JSTA10
	HRRZ A,D
	RFPTR
	 CALL JERR
	CALL BEFORE
	MOVE A,COJFN
	MOVEI C,12
	NOUT
	 CALL JERRC
	MOVEI B,"."
	BOUT			;INDICATE DECIMAL
JSTA10:	JRST EOLRET

;SYSTAT

.SYSTA:	CALL CRIF		;TYPE CRLF-SPACE IF NEEDED
	ETYPE <TENEX UP %K  %I>
	MOVE A,['SYSTAT']
	MOVEI B,14
	CALL MORET		;GET LOAD AVERAGES
	CALL CRIF
	ETYPE <LOAD AV %4Q %5Q %6Q>
	CALL LGNCHK		;TYPE MSG IF NOT PERMITTING LOGINS
	CALL DWNTIM		;PRINT SHUTDOWN WARNING, IF ANY
	PUSH P,[-1]		;FLAG TO SAY WHICH PASS

;LOOP TO TYPE TSS JOB #, TTY #, USER  FOR EACH JOB
SYST1:	SETO D,
	GTB 1			;GET # POSSIBLE JOBS
	HRLZ D,A		;AOBJN COUNT,,JOB #

;TOP OF LOOP
SYST2:	GTB 1			;TABLE 1: POSITIVE IF JOB EXISTS
	JUMPL A,SYST9

;HAVE A REAL JOB #. PRINT IT.
	GTB 0
	JUMPL A,[GTB 3		;DET, CHECK FOR SYSTEM
		HRREI B,0(A)	;LOGIN IN DIR
		JUMPL B,SYST9	;?
		CAIN B,1	;<SYSTEM> IS ALWAYS DIR # 1
		 JRST [	SKIPG 0(P)	;DET & <SYSTEM>, PASS 3?
			 JRST SYST9	;NO, IGNORE
			JRST SYST3]	;YES, PRINT
		SKIPL 0(P)	;DET & NOT <SYSTEM>, PASS 1?
		 JRST SYST9	;NO, SKIP IT
		JRST SYST3]	;PRINT
	SKIPE 0(P)		;NON DET JOB, PASS 2?
	 JRST SYST9		;NO, SKIP IT


;PRINT ONE JOB
SYST3:	TLON Z,F1		;TYPE HEADER FIRST TIME.
	TYPE <

 JOB TTY  USER      SUBSYS
>
	PRINT " "
	HRRZ B,D
	MOVE A,COJFN
	MOVE C,[4,,^D10]	;LEFT ADJ IN 4 COLS, DECIMAL
	NOUT			;CONVERT AND PRINT JOB #
	 CALL JERRC

;"DET" OR "TTY N"
	GTB 0			;TABLE 0: LH NEG OR LINE # FOR THIS JOB
	JUMPL A,[UTYPE [ASCIZ /DET  /]
		JRST SYST4]
	HLRZ B,A
	MOVE A,COJFN
	MOVE C,[5,,10]		;LEFT ADJ IN 5 COLS, OCTAL
	NOUT			;LINE #.
	 CALL JERRC

;SYSTAT...
;SUBSYSTEM NAME

;USER NAME OR "?" IF CONVERSION FAILS.
SYST4:	GTB 3			;TABLE 3: RH: USER'S DIR #
	HRREI B,(A)		;0 IF NOT LOGGED IN
	JUMPLE B,[UTYPE [ASCIZ /NOT LOGGED IN  /]
		JRST SYST5]
	MOVE A,COJFN
	DIRST			;CONVERT DIR # TO STRING AND PRINT
	 PRINT "?"		;NOT FOUND (NO SYSTEM ERROR # IN A)

SYST5:	MOVE A,['JOBNM2']
	CALL $SYSGT
	JUMPE B,SYST52		;SECOND TABLE NOT IMPLEMENTED

SYST51:	HRR A,B
	HRL A,D			;FORM JOB#,,TABLE#
	GETAB
	 CALL JERR
	JRST SYST53

SYST52:	MOVE A,['JOBNAM']
	CALL $SYSGT	;GET # OF TABLE CONTAINING SNAMES INDICES
	JUMPE B,SYST8	;NO SUCH TABLE: NOT IMPLEMENTED YET
	HRR A,B		;TABLE NUMBER
	HRL A,D		;INDEX: TSS JOB #
	GETAB		;GET SNAMES INDEX INTO A
	 CALL JERR
	MOVE C,A
	MOVE A,[SIXBIT /SNAMES/]
	CALL $SYSGT	;GET # OF SUBSYSTEM NAMES TABLE
	JUMPE B,SYST8
	HRR A,B
	HRL A,C		;INDEX FROM TABLE JOBNAM
	GETAB
	 CALL JERR
SYST53:	PUSH P,A
		;POSITION CARRIAGE, TYPING A MAXIMUM OF 10 SPACES
	MOVEI C,12
SYST5A:	PRINT " "
	MOVE A,COJFN
	RFPOS		;VALID ONLY FOR TTYS
	MOVEI B,(B)	;MASK HORIZ POSITION
	CAIGE B,24
	SOJGE C,SYST5A
	POP P,A		;NAME AGAIN
	JUMPE A,[PRINT "?"
		JRST SYST8]
	CALL SIXPRT	;PRINT IT
			;SIXPRT IS WITH "AVAIL DEV" IN X1CMD.MAC
SYST8:	PRINT EOL
SYST9:	AOBJN D,SYST2
	AOS 1,0(P)		;SWITCH PASSES
	CAIGE 1,2		;DONE ALL?
	 JRST SYST1		;NO, DO ANOTHER PASS
	SUB P,[1,,1]
	PRINT EOL
	RET

;STATISTICS

.STATI:	CONFIRM		;CAN'T USE TABLE BIT "ONEWD" BECAUSE
		;FUDGE-ENTRY FOR "STAT" TYPES OUT AFTER DISPATCH
	MOVE A,[SIXBIT /SYSTAT/]
	CALL READT	;READ SYSTEM STATISTICS TABLE INTO AC'S 4-13
	ETYPE <
 IDLE %4T  WAITING %5T  CORE MGMT %6T  PAGER TRAPS %7T
 DRM READS %10Q WRITES %11Q  DSK READS %12Q WRITES %13Q
>
	MOVE A,[SIXBIT /NCPGS/]
	CALL $SYSGT
	ETYPE < %1Q PAGES OF USER CORE
>
	MOVE A,[SIXBIT /SYSTAT/]
	MOVEI B,10
	CALL MORET		;READ MORE OF TABLE
	TIME			;TOTAL UPTIME OF SYSTEM
	CALL FLOAT
	EXCH 1,6
	CALL FLOAT		;FLOAT NBAL TOTAL
	EXCH 1,7
	CALL FLOAT		;FLOAT NRUN TOTAL
	EXCH 1,6
	FDVR 6,1		;NRUN AVERAGE
	FDVR 7,1		;NBAL AVERAGE
	ETYPE < %4Q TERM WAKEUPS  %5Q TERM INTERRUPTS
 NBAL AV %7Q  NRUN AV %6Q
>;
	MOVE A,[SIXBIT /QTIMES/]
	CALL READT
	ETYPE < RUNTIME OF JOBS ON Q'S 0-4 (MSEC)
	%4Q	%5Q	%6Q	%7Q	%10Q
>;

;STATISTICS...
;TABLE OF SUBSYSTEM USAGE

STAT3:	TYPE <
 SUBSYS       TIME   PG FLTS  TIME/FLT  AV W-SET  FLT/WAKE
>
	MOVEI 6,1(P)		;PLACE ON STACK TO STORE TABLE NUMBERS
	HRLI 6,5
	ADD P,[NSNAMS,,NSNAMS]
	MOVSI 5,-NSNAMS		;NUMBER OF TABLES TO EXAMINE
STAT51:	MOVE A,SNAMS(E)		;GET SIXBIT NAME OF TABLE
	CALL $SYSGT
	MOVEM B,@6		;SAVE TABLE NUMBER
	AOBJN 5,STAT51
	HLLZ 4,0(6)		;LENGTH OF (FIRST) TABLE
STAT5A:	MOVSI 5,-NSNAMS		;TABLE COUNTER FOR EACH SUBSYS
	HRRZ A,@6
	GTB (A)			;GET NAME OF SUBSYSTEM IN THIS SLOT
	JUMPE A,STAT5Z		;0 MEANS NONE THERE
	PRINT " "
	CALL SIXPRT		;PRINT THE NAME
	PRINT TAB
	AOBJN 5,.+1

STAT6A:	HRRZ A,@6		;GET 2ND ENTRY
	GTB (A)			;GET TIME
	PUSH P,A		;SAVE FOR LATER
	MOVE B,A
	CALL STAT5N		;PRINT IT
	AOBJN 5,.+1		;KEEP POINTER UP TO DATE

STAT6B:	HRRZ A,@6		;GET FAULTS
	GTB (A)
	MOVE B,A
	CALL STAT5N		;PRINT IT
	AOBJN 5,.+1		;UPDATE

STAT6C:	MOVE A,B
	CALL FLOAT
	EXCH A,0(P)		;FLTS TO PDL, TIME TO A
	CALL FLOAT
	FDVR A,0(P)		;TIME PER FAULT
	ETYPE <    %1Q>		;PRINT IT

STAT6E:	HRRZ A,@6
	GTB (A)
	PUSH P,A		;WAKES & AV. WORKING SET SIZE
	LDB A,[POINT 15,A,14]	;THIS WORD HAS TWO FIELDS
	CALL FLOAT		;FLOAT EACH FIELD
	EXCH A,0(P)		;WAKES TO PDL, WSET TO A
	TLZ A,(-1B14)
	CALL FLOAT
	FDVR A,0(P)		;COMPUTE AVERAGE
	ETYPE <    %1Q>
STAT6F:	MOVE A,-1(P)		;FAULTS
	FDVR A,0(P)		;FAULTS/WAKEUP
	ETYPE <    %1Q>

STAT6G:	SUB P,[2,,2]		;FLUSH JUNK
	AOBJP 5,STAT5Y		;ANYMORE TABLES TO PRINT?

STAT5C:	HRRZ A,@6		;TABLE NUMBER
	GTB (A)			;GET DATA
	MOVE B,A
	CALL STAT5N		;PRINT DECIMAL VALUE
	AOBJN 5,STAT5C
STAT5Y:	PRINT EOL

STAT5Z:	AOBJN 4,STAT5A
	SUB P,[NSNAMS,,NSNAMS] ;REMOVE TEMP STORAGE
STAT6:	JRST EOLRET

;PRINT FORMATTED NUMBER

STAT5N:	MOVE A,COJFN
	MOVE C,[1B0+1B2+1B4+12B17+^D10]
	NOUT
	JRST [	CAIE A,NOUTX2	;CHECK FOR COLUMN OVERFLOW ERROR CODE
		CAIN C,NOUTX2	;IN A OR C
		RET		;ALLOW IT
		JRST JERR]	;REPORT ANY OTHER ERROR
	RET

;TABLES TO BE PRINTED IN STATISTICS FOR SUBSYSTEMS

SNAMS:	SIXBIT /SNAMES/		;MUST BE FIRST
	SIXBIT /STIMES/		;MUST BE SECOND
	SIXBIT /SPFLTS/		;MUST BE THIRD
	SIXBIT /SWAKES/		;MUST BE FOURTH
;***  OTHERS MAY BE INSERTED HERE ***
NSNAMS==.-SNAMS

;ERRSTAT: PRINT VARIOUS ERROR INFORMATION

.ERRST:	MOVEI A,400000
	RPCAP
	TRNN B,1B18+1B19+1B20+1B21	;WHEEL, CONFI, OPER, MAINT.
	JRST CERR

;DISK ERRORS
	MOVE A,[SIXBIT /DSKERR/]
	CALL READT		;READ DISK ERRORS TABLE INTO AC'S D + .
	JUMPN D,.+2
	JUMPE 11,[UETYPE [ASCIZ /
 NO DISK ERRORS
/]
		JRST SYST11]
	ETYPE <
 DISK ERRORS: %4Q RECOVERABLE  >
	JUMPE D,.+2
	ETYPE <
 COMMAND WORDS FOR LAST RECOVERABLE ERROR:
  %5O
  %6O
  %7O
 ERROR BITS: %10O
>;
	ETYPE < %11Q IRRECOVERABLE
>;
	JUMPE 11,.+2
	ETYPE < COMMAND WORDS FOR LAST IRRECOVERABLE ERROR:
  %12O
  %13O
  %14O
 ERROR BITS: %15O
>;
;DRUM ERRORS

SYST11:	MOVE A,[SIXBIT /DRMERR/]
	CALL READT
	JUMPE D,[UETYPE [ASCIZ /
 NO DRUM ERRORS
/]
		JRST SYST12]
	ETYPE <
 %4Q DRUM ERRORS
 COMMAND WORDS FOR LAST ERROR:
  %5O
  %6O
  ERROR BITS: %7O
>;
SYST12:	JRST EOLRET

;SUBROUTINE TO READ SYSTEM TABLE WHOSE NAME IS IN A INTO AC'S 4-16.
;USED IN SYSTAT, ERRSTAT.

READT:	SETZ B,		;NORMAL ENTRY: START AT BEGINNING OF TABLE
MORET:	MOVE D,B	;ENTRY FOR TABLE INDEX IN B
	CALL $SYSGT
	JUMPN B,.+2
	CALL SCREWUP	;NO SUCH TABLE
	HLLZ C,B	;FORM AOBJN INDEX
	SOJGE D,[AOBJP C,[RET]	;PASS UNWANTED ENTRIES
		JRST .]
	PUSH P,[D]	;INIT PTR TO AC'S TO STORE VALUES IN
READT1:	HRR A,B		;TABLE #
	HRL A,C		;INDEX
	GETAB		;READ A WORD OF TABLE INTO A
	 CALL JERR
	MOVEM A,@(P)
	AOS A,(P)
	CAIGE A,P	;STOP BEFORE OVERWRITING P!
	AOBJN C,READT1	;END-OF-TABLE TEST AND LOOP
	SUB P,[1,,1]
	RET

;TERMINAL STATUS COMMAND  "TRMSTAT"


.TRMST:	SKIPN PTTYMD		;DOES PROGRAM HAVE A TERMINAL?
	 ERROR <TERMINAL STATUS NOT YET DEFINED>
TRMST0:	MOVE 1,COJFN
	RFMOD
	MOVE 3,[7B3!177B10!177B17!3B27!3B31!3B33]	;STPAR BITS
	AND 2,3			;EXTRACT THESE
	ANDCAM 3,PTTYMD+0	;FLUSH FROM PTTYMD
	IORM 2,PTTYMD+0		;UPDATE
	GTTYP
	ETYPE < TERMINAL TYPE: %2Q.>
	PRINT EOL

TRMST1:	MOVSI 1,(1B1)
	TDNN 1,PTTYMD+0
	 TYPE < LACKS>
	TDNE 1,PTTYMD+0
	 TYPE < HAS>
	TYPE < MECHANICAL FORMFEED>
	PRINT EOL

TRMST2:	MOVSI 1,(1B2)
	TDNN 1,PTTYMD+0
	 TYPE < LACKS>
	TDNE 1,PTTYMD+0
	 TYPE < HAS>
	TYPE < MECHANICAL TABS>
	PRINT EOL

TRMST3:	MOVSI 1,(1B3)
	TDNN 1,PTTYMD+0
	 TYPE < LACKS>
	TDNE 1,PTTYMD+0
	 TYPE < HAS>
	TYPE < LOWERCASE>
	PRINT EOL

TRMST4:	LDB 2,[POINT 7,PTTYMD+0,10]
	ETYPE < PAGE LENGTH IS: %2Q.>
	PRINT EOL

TRMST5:	LDB 2,[POINT 7,PTTYMD+0,17]
	ETYPE < LINE WIDTH IS: %2Q.>
	PRINT EOL

TRMST6:	TLZ Z,F1		;COMMUNICATE WITH "BEFORE"
	TYPE < WAKE-UP SET: >
	LDB 1,[POINT 2,PTTYMD+0,21]
	CAIE 1,3
	 JRST TRMS60
	CALL BEFORE
	TYPE <ALL CONTROLS>
	JRST TRMS62
TRMS60:	MOVEI 1,1B20
	TDNN 1,PTTYMD+0
	 JRST TRMS61
	CALL BEFORE
	TYPE <FORMATTING CONTROLS>
TRMS61:	MOVEI 1,1B21
	TDNN 1,PTTYMD+0
	 JRST TRMS62
	CALL BEFORE
	TYPE <NON-FORMATTING CONTROLS>
TRMS62:	MOVEI 1,1B22
	TDNN 1,PTTYMD+0
	 JRST TRMS63
	CALL BEFORE
	TYPE <PUNCTUATION>
TRMS63:	MOVEI 1,1B23
	TDNN 1,PTTYMD+0
	 JRST TRMS64
	CALL BEFORE
	TYPE <ALPHANUMERICS>
TRMS64:	PRINT EOL

TRMST7:	LDB 2,[POINT 2,PTTYMD+0,25]
	TYPE < ECHO MODE IS: >
	CAIN 2,0
	 TYPE <NONE>
	CAIN 2,1
	 TYPE <IMMEDIATE>
	CAIN 2,2
	 TYPE <IMMEDIATE OR DEFERRED>
	CAIN 2,3
	 TYPE <IMMEDIATE AND DEFERRED>
	PRINT EOL

TRMST8:	TYPE < LINKS ARE BEING >
	MOVEI 1,1B26
	TDNN 1,PTTYMD+0
	 TYPE <REFUSED>
	TDNE 1,PTTYMD+0
	 TYPE <ACCEPTED>
	PRINT EOL

TRMST9:	TYPE < TERMINAL DATA MODE IS: >
	MOVEI 1,1B29
	TDNE 1,PTTYMD+0
	 TYPE <ASCII>
	TDNN 1,PTTYMD+0
	 TYPE <BINARY>
	PRINT EOL

TRMS10:	TYPE < LOWERCASE OUTPUT IS BEING >
	MOVEI 1,1B30
	TDNN 1,PTTYMD+0
	 TYPE <SENT TO TERMINAL>
	TDNE 1,PTTYMD+0
	 TYPE <INDICATED BY %X>
	PRINT EOL

TRMS11:	TYPE < LOWERCASE INPUT IS BEING >
	MOVEI 1,1B31
	TDNN 1,PTTYMD+0
	 TYPE <SENT DIRECTLY>
	TDNE 1,PTTYMD+0
	 TYPE <CONVERTED TO UPPERCASE>
	PRINT EOL

TRMS12:	LDB 2,[POINT 2,PTTYMD+0,33]
	CAIN 2,0
	 TYPE < FULL DUPLEX>
	CAIN 2,2
	 TYPE < CHARACTER HALF DUPLEX>
	CAIN 2,3
	 TYPE < LINE HALF DUPLEX>
	CAIN 2,1
	 TYPE < UNDEFINED DUPLEXITY>
	PRINT EOL

TRMS13:	TLZ Z,F1		;INITIALIZE "BEFORE"
	TYPE < TAB STOPS:>
	MOVE 2,[POINT 1,PTTYMD+1]
	MOVEI 3,0		;COLUMN TO PRINT
	MOVEI 4,^D<3*36>	;HOW MANY TO TEST
TRM131:	ILDB 1,2
	JUMPE 1,TRM132		;NO TAB IN THIS COLUMN
	CALL BEFORE
	ETYPE <%3Q>
TRM132:	ADDI 3,1		;BUMP COLUMN NUMBER
	SOJG 4,TRM131

TRMS14:	MOVEI 3,3		;TYPE BEING SCANNED FOR, THIS PASS
TRM141:	MOVE 4,[POINT 2,PTTYMD+4]	;INITIAL POINTER TO CCOC BYTES
	MOVEI 5,100		;CHARACTER TO PRINT
	MOVEI 6,40		;HOW MANY TO CHECK
	TLZ Z,F1!F2		;FOR "BEFORE" AND HEADING PRINTER

TRM142:	ILDB 1,4		;PICK UP CCOC BYTE
	CAIE 1,0(3)		;SAME AS THAT BEING SCANNED FOR?
	 JRST TRM145		;NO
TRM143:	TLOE Z,F2		;HAS HEADING BEEN OUTPUT?
	 JRST TRM144		;YES
	CAIN 3,0
	 TYPE <
 IGNORED CONTROLS:>
	CAIN 3,1
	 TYPE <
 INDICATED CONTROLS:>
	CAIN 3,2
	 TYPE <
 SENT CONTROLS:>
	CAIN 3,3
	 TYPE <
 SIMULATED CONTROLS:>
TRM144:	CALL BEFORE		;PRINT COMMA IF NEEDED
	PRINT "^"
	PRINT 0(5)
TRM145:	ADDI 5,1		;MOVE TO NEXT CHARACTER
	SOJG 6,TRM142		;CONTINUE THIS SCAN
	SOJGE 3,TRM141		;MOVE TO NEXT TYPE
	RET

;TERMINAL CHARACTERISTICS COMMANDS GROUP
;	LOWERCASE, FORMFEED, TABS, NO LOWERCASE, NO FORMFEED, NO TABS,
;	RAISE, NO RAISE, HALFDUPLEX, FULLDUPLEX, INDICATE.

;THESE COMMANDS CHANGE THE FILE MODE WORD AND THE CONTROL CHARACTER
;OUTPUT CONTROL (CCOC) WORDS FOR THE PRIMARY OUTPUT FILE,
;AND ALSO THE THREE SETS OF THESE VALUES KEPT IN STORAGE.

;THE "NO" PREFIXED VERSIONS GO THRU THE SAME ROUTINES AS THE UNPREFIXED
;VERSIONS, BUT WITH F1 SET WHICH REVERSES THE EFFECT OF THE SUBROUTINES
;THEY CALL.  F1 IS CLEAR ON DISPATCH FROM THE MAIN LOOP.


.FULLD:	TLC Z,F1		;"FULLDUPLEX" = "NO HALFDUPLEX".
.HALFD:	MOVEI C,3B33		;"HALFDUPLEX". "HALF DUPLEX" MODE BIT.
	JRST CMOD		;CHANGE FILE MODE WORD

.FORMF:	HRLZI C,B1		;"FORMFEED". "HAS MECH. FF" MODE BIT
	MOVE D,[POINT 2,(E),25]	;POINTER TO ^L CCOC BYTE
	JRST TABS1

.TABS:	HRLZI C,B2		;"TABS". "HAS HARDWARE TABS" MODE BIT
	MOVE D,[POINT 2,(E),19]	;PTR TO ^I CCOC BYTE
TABS1:	CALL CMOD		;CHANGE FILE MODE WORD
	JRST CCCOC		;CHANGE CONT. CHAR. OUTPUT CONT. WORDS

;LOWERCASE: CONTROLS LOWER CASE OUTPUT.
;IT MAY ALSO BE NECESSARY TO CLEAR "INDICATE WITH %" BIT,
;BUT PREFERABLE NOT TO IF IT HAS NO EFFECT WHEN B3 ON.

.LOWER:	HRLZI C,B3		;"LOWERCASE".  "HAS LOWER CASE" MODE BIT.
	JRST CMOD		;CHANGE FILE MODE WORD

;RAISE: CONTROLS CONVERSION OF LOWER CASE TO UPPER ON INPUT.

.RAISE:	MOVEI C,1B31		;"CONVERT LOWER CASE TO UPPER" MODE BIT


;CHANGE TELETYPE MODE WORD SUBR
;CHANGES MODE IN EFFECT
;TAKES: C: MASK INDICATING BITS TO CHANGE.
;	AC Z LH BIT F1: ON TO CLEAR BIT(S), OFF TO SET THEM.
;PRESERVES D, DESTROYS A, B.

CMOD:	MOVE A,COJFN		;OUTFILE IS MOST LIKELY TO BE TTY
	RFMOD
	ANDCAM C,B
	TLNN Z,F1
	IORM C,B
	STPAR			;THESE ARE ALL TERMINAL PARAMETERS
	RET



;LENGTH (OF PAGE IS) <DECIMAL NUMBER>

.LLENG:	NOISE (OF PAGE IS)
	CALL DECIN
	 JRST CERR
	ALLOW TSPC+TALT+TEOL
	CONFIRM
	CAIL A,5
	CAILE A,^D127
	 JRST CERR
	MOVE C,A
	MOVE 1,COJFN
	RFMOD
	DPB C,[POINT 7,2,10]
	STPAR
	RET

;TERMINAL TYPE IS


;NOTE:	GET SOMEBODY AT BBN TO ASSIGN NEW (UNIQUE) TERMINAL NUMBERS
;	IN THE MONITOR.  THIS AVOIDS CONFUSION WITH OTHER SITES.
;	LOCAL STTYP NUMBERS SHOULD BE NEGATIVE NUMBERS.


.TERMI:	NOISE (TYPE IS)
	KEYWD $TERMI
	0
	JRST CERR
	JRST (KWV)

$TERMI:	TABLE
	TE 33,,.T33
	TE 35,,.T35
	TE 37,,.T37
	TE 4023,,.DATA1
	TE AJ,,.TI
	TE ANDERSON-JACOBSON,,.TI
	TE BEEHIVE,,.BEEHI
	TE BENDIX,,.BENDI
	TE COMPUTER-DEVICES,,.TI
	TE DATA100,,.DATA1
	TE EXECUPORT,,.TI
	TE INFOTON,,.INFOT
	TE LA30
	TE LINEPROCESSOR,,.LINEP
	TE LOGIPORT,,.BENDI
	TE NCR,,.TI
	TE NVT
	TE OMRON,,.OMRON
	TE SCOPE,,.SCOPE
	TE TEKTRONIX-4023,,.DATA1
	TE TERMINET,,.LA30
	TE TI,,.TI
	TE TI733
	TE VTS
	TEND

.OMRON:	MOVEI B,14
	JRST .TTY3
.LINEP:	SKIPA B,[13]		;SRI-ARC TERMINAL TYPE
.TI733:	MOVEI B,11
	JRST .TTY3
.T33:	TDZA B,B
.T35:	MOVEI B,1
	JRST .TTY3
.T37:	SKIPA B,[2]
.TI:	MOVEI B,3
	JRST .TTY3
.LA30:	SKIPA B,[10]
.NVT:	MOVEI B,7	;TERM TYPES 4, 5, AND 6 RESERVED
			;SO IS 13
.TTY3:	CONFIRM
	MOVE A,COJFN
	STTYP
	RET		;DUPLEXITY IS DETERMINED ONLY BY "HALF" AND
			;"FULL".  NVT'S ARE HALF ONLY AS A DEFAULT


;TERMINAL (TYPE IS) SCOPE (PAGE LENGTH) <DEC NUM> (PAGE WIDTH) <DEC NUM>

.SCOPE:	ALLOW TSPC+TALT
	NOISE (PAGE LENGTH)
	CALL DECIN
	 JRST CERR
	ALLOW TSPC+TALT
	CAIL A,5
	CAILE A,^D127
	 JRST CERR
	PUSH P,A
	NOISE (PAGE WIDTH)
	CALL DECIN
	 JRST CERR
	ALLOW TSPC+TALT+TEOL
	CAILE A,^D127
	 JRST CERR
	PUSH P,A

SCOPE1:	CONFIRM
	MOVE 1,COJFN
	RFMOD
	POP P,C
	DPB C,[POINT 7,2,17]	;SET WIDTH
	POP P,C
	DPB C,[POINT 7,2,10]	;LENGTH
	STPAR
	MOVEI 2,12		;SCOPE TERMINAL TYPE
	STTYP
	RET


;TERMINAL (TYPE IS) BENDIX

.BENDI:	PUSH P,[^D16]
	PUSH P,[^D72]
	JRST SCOPE1



;TERMINAL (TYPE IS) BEEHIVE

.BEEHI:	PUSH P,[^D20]
	PUSH P,[^D72]
	JRST SCOPE1


;TERMINAL TYPE INFOTON

.INFOT:	PUSH P,[^D23]
	PUSH P,[^D72]
	JRST SCOPE1


;TERMINAL TYPE DATA100

.DATA1:	PUSH P,[^D24]
	PUSH P,[^D72]
	JRST SCOPE1


;TERMINAL TYPE VTS

.VTS:	PUSH P,[^D43]
	PUSH P,[^D72]
	JRST SCOPE1

;WIDTH OF TERMINAL LINE

.LWIDTH: NOISE (OF LINE IS)
	CALL DECIN
	JRST CERR
	ALLOW TSPC+TALT+TEOL
	CONFIRM
	CAILE A,177	;127. IS MAX
	MOVEI A,177
	MOVE C,A
	MOVE A,COJFN
	RFMOD
	DPB C,[POINT 7,B,17]
	STPAR
	RET

;INDICATE (FORMFEED)

.INDIC:	NOISE (FORMFEED)
	CONFIRM
	TLO Z,F2
	MOVE D,[POINT 2,(E),25]

;SUBR TO CHANGE CCOC BYTE TO SIMULATE (IF F1 ON & F2 OFF)
; OR SEND (IF F1 AND F2 OFF) OR INDICATE (IF F2 ON).
;BYTE TO CHANGE IS INDICATED BY A BYTE PTR IN D, INDEXED BY E.
;DESTROYS A, B, C, E.

CCCOC:	MOVE A,COJFN
	RFCOC
	MOVEI E,B
	CALL CCCOCS		;OPERATE ON CCCOC WORDS IN B,C
	MOVE A,COJFN
	SFCOC			;PUT NEW VALUE INTO EFFECT
	MOVEI E,ETTYMD+4	;OPERATE ON STORED VALUES
	CALL CCCOCS
	MOVEI E,PTTYMD+4

;SUBSUBROUTINE TO OPERATE ON BYTE IN WORDS E POINTS TO
CCCOCS:	MOVEI A,2		;2 = SEND CODE
	TLNE Z,F1
	MOVEI A,3		;3 = SIMULATE
	TLNE Z,F2
	MOVEI A,1		;1 = INDICATE BY ^X
	DPB A,D
	RET

