Google
 

Trailing-Edge - PDP-10 Archives - BB-M081U-SM_1989 - exec/exec0.mac
There are 47 other files named exec0.mac in the archive. Click here to see a list.
; Edit= 4427 to EXEC0.MAC on 27-Apr-89 by GSCOTT
;Add support for ENABLE/DISABLE NOT-LOGGED-IN-SYSTAT command in SETSPD. 
; Edit= 4424 to EXEC0.MAC on 9-Mar-89 by GSCOTT
;Support terminal type IDEAL. 
; Edit= 4422 to EXEC0.MAC on 3-Mar-89 by RASPUZZI
;Fix insufficient size of STKVAR in GETPOB for large usernames.
; Edit= 4420 to EXEC0.MAC on 16-Feb-89 by GSCOTT
;Make ETYPE's %W say "never" for a zero date, then clean up login message code
;in EXEC0 and EXEC1.
; Edit= 4413 to EXEC0.MAC on 19-Dec-88 by RASPUZZI
;Fix broken SYSTAT in subcommand mode when username contains a wildcard
;character.
; Edit= 4412 to EXEC0.MAC on 13-Dec-88 by RASPUZZI
;Add new commands, features and support for security enhancements.
; Edit= 4401 to EXEC0.MAC on 17-Mar-88 by RASPUZZI
;Take another whack at POBOX. Rewrite GETPOB so that it translates POBOX: and
;searches each structure for the user's POBOX directory. Also, fix ACSPOB to
;work correctly and look for STRX10 in MALCHK.
; UPD ID= 4106, RIP:<7.EXEC>EXEC0.MAC.21,   7-Mar-88 18:19:46 by GSCOTT
;TCO 7.1255 - Update copyright notice.
; UPD ID= 82, RIP:<7.EXEC>EXEC0.MAC.20,  10-Dec-87 15:14:16 by RASPUZZI
;TCO 7.1161 - Do something reasonable when user fills .CMFLD with crapola.
;             Also, ***PERFORMANCE***. Remove extraneous INFO% (doing
;             GETJI%) that is causing a slow down.
; UPD ID= 76, RIP:<7.EXEC>EXEC0.MAC.19,  24-Nov-87 15:10:09 by MCCOLLUM
;More of TCO 7.1140 - Fix SYSTAT to display class scheduling information
;                     in non-cluster mode again
; UPD ID= 75, RIP:<7.EXEC>EXEC0.MAC.18,  20-Nov-87 08:05:13 by RASPUZZI
;Fix typo in previous edit - change CLSFLG to CLSMSK like it should be.
; UPD ID= 74, RIP:<7.EXEC>EXEC0.MAC.17,  19-Nov-87 15:00:54 by RASPUZZI
;TCO 7.1140 - Do not display numbers in the class scheduling items if that
;             system is not running class scheduling. Display blanks instead.
; UPD ID= 71, RIP:<7.EXEC>EXEC0.MAC.16,  17-Nov-87 15:08:12 by RASPUZZI
;TCO 7.1139 - Display all job 0's in the cluster when SYS NOD * OPERATOR
;             is done.
;TCO 7.1137 - Make SYSTAT USER work for USER not being a local username.
;             Note that THIS engineer does NOT support the use of SSTACK.
;             It is a blatant crock but we are stuck with it for SYSTAT.
;             If you can't beat'em, join'em (ptui!).
; UPD ID= 65, RIP:<7.EXEC>EXEC0.MAC.15,  12-Nov-87 16:39:13 by RASPUZZI
;More of TCO 7.1131 - Prevent Illegal memory read traps by using the right
;                     loop counter in NODPRT.
; UPD ID= 64, RIP:<7.EXEC>EXEC0.MAC.14,  12-Nov-87 15:09:31 by RASPUZZI
;TCO 7.1131 - Fix bug where %Class scheduling is off... is displayed
;	      when user does SYS NOD * ALL USER
; UPD ID= 59, RIP:<7.EXEC>EXEC0.MAC.13,  29-Oct-87 17:36:37 by RASPUZZI
;Fix small bug with previous edit.
; UPD ID= 57, RIP:<7.EXEC>EXEC0.MAC.10,  29-Oct-87 15:53:56 by RASPUZZI
;TCO 7.1100 - Don't display class if no system running class scheduling
;             and show which nodes in the cluster are not returning
;             information
; UPD ID= 53, RIP:<7.EXEC>EXEC0.MAC.9,  28-Oct-87 15:07:30 by RASPUZZI
;More of TCO 7.1089 - Fix stupidity in NODCHK
; UPD ID= 52, RIP:<7.EXEC>EXEC0.MAC.8,  28-Oct-87 14:05:27 by RASPUZZI
;TCO 7.1093 - Make N an invisible abbreviation for NO in SYSTAT
; UPD ID= 47, RIP:<7.EXEC>EXEC0.MAC.7,  27-Oct-87 16:06:05 by RASPUZZI
;TCO 7.1089 - Make SYS NOD * User work by caching job range outside of
;             routine NODPRT. Make SPCIT space nodename and username
;             correctly. Also, change NODCHK a little for efficiency.
; UPD ID= 38, RIP:<7.EXEC>EXEC0.MAC.6,  22-Oct-87 11:03:02 by RASPUZZI
;TCO 7.1076 - Add code to SYSYAT to use the INFO% JSYS for cluster wide
;             SYSTATs. This includes a new command (NODE) to SYSTAT.
; UPD ID= 4, RIP:<7.EXEC>EXEC0.MAC.5,   4-Jun-87 14:54:15 by PRATT
;More of TCO 7.1008 - Rip out useless ";**; helper" lines
; UPD ID= 3, RIP:<7.EXEC>EXEC0.MAC.4,   3-Jun-87 09:51:35 by PRATT
;TCO 7.1008 - Fix systats origin typeout code to not type out 0 node 
;             numbers and also fix the incorrect column position of the 
;             origin field on "SYS username". 
; UPD ID= 2, RIP:<7.EXEC>EXEC0.MAC.3,   3-Jun-87 09:44:52 by PRATT
;TCO 7.1007 - Make the EXEC typeout SYSTEM:JOB-STARTUP-MESSAGE.TXT
; *** Edit 3062 to EXEC0.MAC by EVANS on 3-Apr-87
; Change [] to <> to make GTJFN happy 
; *** Edit 3059 to EXEC0.MAC by EVANS on 31-Mar-87, for SPR #21419
; Rewrite routine GETPOB; most importantly, add a test for "logged-in" and if
; not logged in exit immediately.
; *** Edit 3055 to EXEC0.MAC by EVANS on 11-Mar-87
; Add VT300 - dependent monitor edits 7423 and 7424. 
; *** Edit 3053 to EXEC0.MAC by EVANS on 19-Nov-86
; Add an ERJMP after the ACCES% of POBOX:, as the JSYS always returns +1.
; *** Edit 3050 to EXEC0.MAC by EVANS on 29-Oct-86, for SPR #00092
; Reset STATSW to zero to prevent mulitply defined symbols when linking with
; distributed PCL and MIC modules; remove the STAT code so we don't do the
; statistics.
; *** Edit 3048 to EXEC0.MAC by EVANS on 14-Oct-86
; Make mail-checking code check to see if POBXNO (user's POBOX: directory
; number) is set up; if not, don't do the mail check. Also, check POBXNO before
; calling GETPOB:, so as not to execute the code if we don't have to.
; *** Edit 3047 to EXEC0.MAC by EVANS on 24-Sep-86
; Rework error handling in GETPOB: so as not to miss calls to RLJFN%.
; *** Edit 3046 to EXEC0.MAC by EVANS on 25-Aug-86
; Get the user's POBOX: directory number and save it separately from doing the
; access of it, as the access won't be done on a /FAST login or a PUSH; the
; directory number is needed for mail-watching and typing system mail. This
; incorporates edits 3034,3039,3040,3043,and 3044 in to 3046.
; *** Edit 3044 to EXEC0.MAC by EVANS on 15-Jul-86
; Implement LOGINF to tell when we are acessing POBOX: and mail-checking during
; login; have MALCHK test it and return to log-in code on a JSYS error.
; *** Edit 3043 to EXEC0.MAC by EVANS on 30-Jun-86
; Add POBJFN to the STKVAR at ACSPOB:
; *** Edit 3040 to EXEC0.MAC by EVANS on 24-Jun-86, for SPR #21170
; Implement MAIL-WATCHing based on directory number, as users can now send mail
; to non-username directories on POBOX:
; *** Edit 3039 to EXEC0.MAC by EVANS on 6-Jun-86
; Fix edit 3034 to not end the access of POBOX: and to allow for POBOX:'s being
; a search string
; *** Edit 3034 to EXEC0.MAC by EVANS on 30-Apr-86 (TCO none)
; For MS QAR 907013 - Users who did not have mail watch set would not be
; notified of new mail at log-in. Make the login code ACCESS user's POBOX: and
; do a mail check.
; *** Edit 3030 to EXEC0.MAC by RASPUZZI on 8-Apr-86, for SPR #20778
; Display last login date & time when EXEC is started with CRJOB 
; *** Edit 3027 to EXEC0.MAC by MAYO on 14-Feb-86
; Fix a comment.
; UPD ID= 216, SNARK:<6.1.EXEC>EXEC0.MAC.20,  10-Jun-85 08:41:13 by DMCDANIEL
; UPD ID= 200, SNARK:<6.1.EXEC>EXEC0.MAC.19,  24-May-85 14:12:56 by EVANS
;TCO 6.1.1404 - Add command editor stuff.
; UPD ID= 186, SNARK:<6.1.EXEC>EXEC0.MAC.18,   3-May-85 14:43:04 by PRATT
;TCO 6.1.1357 - Don't clear name of fork when non-virgin on deposits
; UPD ID= 160, SNARK:<6.1.EXEC>EXEC0.MAC.17,   3-May-85 08:29:05 by DMCDANIEL
;Update copyrights for 6.1.
; UPD ID= 151, SNARK:<6.1.EXEC>EXEC0.MAC.16,   8-Apr-85 11:08:19 by PRATT
;TCO 6.1.1311 - Move the label FST3 up one line before the CALL ALRCHK
; UPD ID= 149, SNARK:<6.1.EXEC>EXEC0.MAC.15,  23-Mar-85 09:47:36 by MCCOLLUM
;OPERATOR and ORGIN are alphabetically inverted in the $SYSNO table
; UPD ID= 148, SNARK:<6.1.EXEC>EXEC0.MAC.14,  18-Mar-85 11:09:47 by PRATT
;TCO 6.1.1274 - Add ORIGIN/NO ORIGIN to SYSTAT
; UPD ID= 102, SNARK:<6.1.EXEC>EXEC0.MAC.13,  11-Dec-84 15:21:04 by MOSER
;TCO 6.1.1077 - ADD STAT STUFF
; UPD ID= 97, SNARK:<6.1.EXEC>EXEC0.MAC.12,  27-Nov-84 11:21:46 by EVANS
;TCO 6.1.1027 - Handle case of running program in LOGOUT.CMD
; UPD ID= 58, SNARK:<6.1.EXEC>EXEC0.MAC.7,  12-Nov-84 03:43:26 by MERRILL
;TCO 6.1.1042 - Update to work with the latest PCL we have
;  Clear CIPF later (after CIN1) so DOCOMMAND "kept-fork-name" works.
;  Fix ORIGINAL <esc> ^U to not leave the doing-an-original-command flag set.
; UPD ID= 51, SNARK:<6.1.EXEC>EXEC0.MAC.6,   5-Nov-84 12:55:23 by PRATT
;More TCO 6.1.1028 - Include network type after hostname
; UPD ID= 50, SNARK:<6.1.EXEC>EXEC0.MAC.5,   2-Nov-84 16:30:48 by PRATT
;More TCO 6.1.1028 - Handle detached lines correctly
; UPD ID= 43, SNARK:<6.1.EXEC>EXEC0.MAC.3,  28-Oct-84 10:53:18 by PRATT
;TCO 6.1.1028 - Always type out the "4n host" field
; UPD ID= 37, SNARK:<6.1.EXEC>EXEC0.MAC.2,  26-Oct-84 13:35:15 by EVANS
;TCO 6.1.1207 - Add SYSTEM: .CMD file code and label for LOGOUT.CMD
; UPD ID= 454, SNARK:<6.EXEC>EXEC0.MAC.45,   3-Oct-84 17:01:12 by PRATT
;TCO 6.2235 - Fix problem with ^T during ^C of ephemoral program
; UPD ID= 448, SNARK:<6.EXEC>EXEC0.MAC.44,  27-Sep-84 11:15:06 by MCCOLLUM
;TCO 6.2230 - Change text for shared page made private in DEPOSIT command.
; UPD ID= 445, SNARK:<6.EXEC>EXEC0.MAC.43,  26-Sep-84 16:46:07 by MCCOLLUM
;TCO 6.2229 - Clear private name in fork data block in DEPOSIT code
; UPD ID= 438, SNARK:<6.EXEC>EXEC0.MAC.42,  25-Sep-84 10:51:16 by EVANS
;TCO 6.2222 - Add support for VT200 terminals; also VT131.
; UPD ID= 425, SNARK:<6.EXEC>EXEC0.MAC.41,  19-Jul-84 16:03:26 by PRATT
;TCO 6.2136 - Allow both new and the old flavors of TERMINAL guide words
; UPD ID= 411, SNARK:<6.EXEC>EXEC0.MAC.40,  12-Jun-84 12:00:29 by MCCOLLUM
;TCO 6.2093 - Fix "TERM NO PAUSE CHAR" command to set defaults.
; UPD ID= 408, SNARK:<6.EXEC>EXEC0.MAC.39,   3-May-84 10:19:22 by SHTIL
; UPD ID= 379, SNARK:<6.EXEC>EXEC0.MAC.38,  20-Jan-84 16:00:27 by MCCOLLUM
;TCO 6.1945 - Range check ASCII code in "TERMINAL PAUSE (ON) CHARACTER"
; UPD ID= 373, SNARK:<6.EXEC>EXEC0.MAC.36,   9-Jan-84 20:30:16 by MCCOLLUM
;TCO 6.1928 - Confirm after "TERMINAL PAUSE CHARACTER n 0"
; UPD ID= 366, SNARK:<6.EXEC>EXEC0.MAC.35,  28-Dec-83 15:56:38 by PRATT
;TCO 6.1796 - Add [SET] TERMINAL [NO] INHIBIT (NON-JOB OUTPUT)
; UPD ID= 333, SNARK:<6.EXEC>EXEC0.MAC.34,  20-Nov-83 19:38:11 by PRATT
;TCO 6.1870 - Get rid of code which is under NONEWF. Remove NEWF's.
; UPD ID= 321, SNARK:<6.EXEC>EXEC0.MAC.33,   8-Nov-83 15:04:02 by PRATT
;TCO 6.1852 - Make TERMINAL HELP command typeout HLP:TERMINAL.HLP
; UPD ID= 317, SNARK:<6.EXEC>EXEC0.MAC.32,   8-Nov-83 13:47:17 by PRATT
;TCO 6.1847 - New /FAST switch to LOGIN
; UPD ID= 315, SNARK:<6.EXEC>EXEC0.MAC.31,  17-Oct-83 13:41:50 by PRATT
;TCO 6.1831 - Change the bizarre byte pointers in EXEC02
; UPD ID= 310, SNARK:<6.EXEC>EXEC0.MAC.30,  22-Sep-83 12:16:33 by MILLER
;TCO 6.1758. Make system mail work
; UPD ID= 288, SNARK:<6.EXEC>EXEC0.MAC.29,  14-Jun-83 11:57:01 by LOMARTIRE
;TCO 6.1676 - Allow range of terminal lines in ^ESET TERMINAL command
; UPD ID= 272, SNARK:<6.EXEC>EXEC0.MAC.28,  20-Apr-83 15:33:55 by PAETZOLD
;TCP 6.1619 - Add H10
; UPD ID= 234, SNARK:<6.EXEC>EXEC0.MAC.27,   4-Apr-83 10:10:30 by CHALL
;TCO 6.1456 - Set up AC C for $GET0 and $GET2
; UPD ID= 233, SNARK:<6.EXEC>EXEC0.MAC.26,  15-Jan-83 19:23:30 by CHALL
;TCO 6.1464 - UPDATE COPYRIGHT NOTICE
; UPD ID= 202, SNARK:<6.EXEC>EXEC0.MAC.25,   3-Dec-82 15:40:37 by CHALL
;TCO 6.1399 CIN9- USE A DIFFERENT KEYWORD TABLE WHEN NOT LOGGED IN
;TCO 6.1397 .TERMI- CHANGE NOISE TO "TERMINAL (FEATURE OR TYPE)"
;ALSO, SEPARATE KEYWORDS INTO TWO TABLES: TYPES AND FEATURES
; UPD ID= 160, SNARK:<6.EXEC>EXEC0.MAC.24,  21-Sep-82 15:50:43 by TSANG
;TCO 6.1248 MODIFY HELP TEXT STRING IN TERMINAL COMMAND
;TCO 6.1253 FIX THE USED CLASS (.SAUSE) PROBLEM
; UPD ID= 151, SNARK:<6.EXEC>EXEC0.MAC.23,  19-Aug-82 14:23:51 by MOSER
;MORE OF TCO 5.1306 LOAD FLAGS BEFORE TEST
; UPD ID= 132, SNARK:<6.EXEC>EXEC0.MAC.21,   4-Aug-82 17:09:50 by LEACHE
;TCO 6.1209 Fix invocations of ETYPE
; UPD ID= 122, SNARK:<6.EXEC>EXEC0.MAC.20,  24-Apr-82 12:24:51 by CHALL
;TCO 6.1101 MOVE STUFF WITH TERMINAL NAMES (.TERMI, .TTYPE) TO EXECCA
; UPD ID= 113, SNARK:<6.EXEC>EXEC0.MAC.19,  20-Apr-82 07:52:59 by CHALL
;TCO 6.1092 EXEC01- Remove MIC conditional
; UPD ID= 110, SNARK:<6.EXEC>EXEC0.MAC.18,   9-Apr-82 09:41:54 by CHALL
;TCO 6.1088 .TERMI- AND .TTYPE- ADD TERMINAL TYPE VT102
; UPD ID= 138, SNARK:<5.EXEC>EXEC0.MAC.42,   7-Feb-82 13:41:31 by CHALL
;TCO 5.1700 .TERMI- AND .TTYPE- ADD TERMINAL TYPES VT125 AND VK100
; UPD ID= 133, SNARK:<5.EXEC>EXEC0.MAC.41,  22-Jan-82 14:44:35 by CHALL
;TCO 6.1052 - UPDATE COPYRIGHT NOTICE AND DELETE PRE-V4.1 EDIT HISTORY
; UPD ID= 129, SNARK:<5.EXEC>EXEC0.MAC.40,   5-Jan-82 10:00:30 by MOSER
; UPD ID= 108, SNARK:<5.EXEC>EXEC0.MAC.27,  30-Nov-81 13:59:11 by MOSER
;TCO 5.1613 - ADD NEW BIT B4 TO CRJOB FLAGS. MEANS SIMULATE LOGIN.
; UPD ID= 97, SNARK:<5.EXEC>EXEC0.MAC.26,  21-Oct-81 13:43:45 by GROUT
;TCO 5.1578 MAKE CMDINI GLOBAL SO IT CAN BE CALLED FROM EOFJER
; UPD ID= 71, SNARK:<5.EXEC>EXEC0.MAC.23,  21-Sep-81 09:06:15 by CHALL
;TCO 5.1521 SUBSTA- OUTPUT SCOUNTS IN INFO SUBSYS (SEE TCO 5.1301)
; UPD ID= 60, SNARK:<5.EXEC>EXEC0.MAC.21,   1-Sep-81 18:01:29 by CHALL
;TCO 5.1483 SYSNX- IF USER TYPED "SYS:" GIVE FILESPEC-LIKE ERROR
; UPD ID= 43, SNARK:<5.EXEC>EXEC0.MAC.19,  17-Aug-81 22:48:14 by MURPHY
;MAKE MESS NOT FLUSH CURRENT FORK
; UPD ID= 31, SNARK:<5.EXEC>EXEC0.MAC.18,  14-Aug-81 19:11:43 by CHALL
;TCO 5.1454 CHANGE NAME FROM XDEF TO EXECDE
; UPD ID= 22, SNARK:<5.EXEC>EXEC0.MAC.17,   5-Aug-81 16:00:09 by MURPHY
;BUG IN MESS - LEAVING GARBAGE FORK HANDLE IN FORK.
; UPD ID= 18, SNARK:<5.EXEC>EXEC0.MAC.16,  21-Jul-81 11:53:08 by GROUT
;TCO 5.1426 - Make SYSTAT work with wild directory and user args
;<HELLIWELL.EXEC.5>EXEC0.MAC.2, 13-May-81 19:58:17, EDIT BY HELLIWELL
;REMOVE DOCCL AND DOCC1 (NOW UNUSED)
;<HELLIWELL.EXEC.5>EXEC0.MAC.1, 13-May-81 14:51:16, EDIT BY HELLIWELL
;REMOVE GT40 TERMINAL TYPE
; UPD ID= 2099, SNARK:<5.EXEC>EXEC0.MAC.12,  28-May-81 10:58:35 by GROUT
; TCO 5.1351 - Make TERMINAL terminal-type not change duplex mode
; UPD ID= 2063, SNARK:<5.EXEC>EXEC0.MAC.11,  22-May-81 11:51:03 by GROUT
;TCO 5.1343 - Make IPCF code flush buffers only when necessary
; UPD ID= 2035, SNARK:<5.EXEC>EXEC0.MAC.10,  19-May-81 16:55:38 by MURPHY
;Raise input on TER PAUSE CHARACTER CONTROL x
; UPD ID= 1974, SNARK:<5.EXEC>EXEC0.MAC.9,  11-May-81 11:35:56 by TILLSON
;TCO 5.1306 - Make LOGIN messages print in Batch log file
; UPD ID= 1962, SNARK:<5.EXEC>EXEC0.MAC.8,   8-May-81 10:03:01 by SCHMITT
;TCO 5.1309 - Check for DWNTIM of -1 for system shutdown at SYSDWN
; UPD ID= 1949, SNARK:<5.EXEC>EXEC0.MAC.4,   6-May-81 14:53:33 by MURPHY
; TCO 5.1315  - PAUSE (ON) CHARACTER etc.
; UPD ID= 1871, SNARK:<5.EXEC>EXEC0.MAC.3,  22-Apr-81 11:29:57 by PAETZOLD
;fix typo in previous (TCO 5.1295)
; UPD ID= 1868, SNARK:<5.EXEC>EXEC0.MAC.2,  22-Apr-81 10:49:55 by PAETZOLD
;TCO 5.1295 Add cosmetic fix for systat for foreign arpanet host
;previous edit history line missing
;ADD PCLF SWITCHES WHERE VISIBLE TO USER
;REMOVE MFRK SWITCHES EXCEPT WHERE VISIBLE TO USER
;<4.EXEC>EXEC0.MAC.1, 23-Dec-80 19:03:03, Edit by DK32
;Programmable Command Language
; UPD ID= 1434, SNARK:<5.EXEC>EXEC0.MAC.41,  13-Jan-81 09:58:33 by OSMAN
;More 5.1129 - Make EXAMINE show octal contents "...too, if different"
; UPD ID= 1397, SNARK:<5.EXEC>EXEC0.MAC.40,   6-Jan-81 10:27:42 by OSMAN
;tco 5.1225 - Implement jsys trapping and file-opening trapping!
; UPD ID= 1394, SNARK:<5.EXEC>EXEC0.MAC.39,  31-Dec-80 16:08:32 by LYONS
; UPD ID= 1392, SNARK:<5.EXEC>EXEC0.MAC.38,  31-Dec-80 15:09:40 by LYONS
;for the time being, keep both sets of system mail code.
; UPD ID= 1355, SNARK:<5.EXEC>EXEC0.MAC.37,  16-Dec-80 09:51:38 by OSMAN
;Don't get second symbol buffer upon restarting customized exec
; UPD ID= 1280, SNARK:<5.EXEC>EXEC0.MAC.36,  17-Nov-80 16:40:55 by OSMAN
;Remove ^L hack
; UPD ID= 1252, SNARK:<5.EXEC>EXEC0.MAC.35,  10-Nov-80 13:24:26 by OSMAN
;More 5.1189 - Make DDT see /USE-SECTION switch
; UPD ID= 1237, SNARK:<5.EXEC>EXEC0.MAC.34,   6-Nov-80 15:20:32 by OSMAN
;tco 5.1189 - Use $GET0 instead of $GET2
; UPD ID= 1233, SNARK:<5.EXEC>EXEC0.MAC.33,   5-Nov-80 15:31:57 by LCAMPBELL
; UPD ID= 1188, SNARK:<5.EXEC>EXEC0.MAC.31,  23-Oct-80 10:09:49 by OSMAN
; UPD ID= 1187, SNARK:<5.EXEC>EXEC0.MAC.30,  22-Oct-80 17:01:15 by OSMAN
;Fix SET PROG EPHEMERAL
; UPD ID= 1146, SNARK:<5.EXEC>EXEC0.MAC.29,  10-Oct-80 09:31:07 by OSMAN
;More 5.1151 - Unbreak "DEC SYN CD CONNECT"
; UPD ID= 1145, SNARK:<5.EXEC>EXEC0.MAC.28,  10-Oct-80 09:25:26 by OSMAN
; UPD ID= 1127, SNARK:<5.EXEC>EXEC0.MAC.27,   6-Oct-80 10:16:23 by OSMAN
;tco 5.1167 - Remove FDB autokeep feature
; UPD ID= 1114, SNARK:<5.EXEC>EXEC0.MAC.26,   3-Oct-80 11:32:25 by OSMAN
;tco 5.1162 - Parse program names as keywords.
; UPD ID= 1040, SNARK:<5.EXEC>EXEC0.MAC.25,  25-Sep-80 14:12:54 by OSMAN
;tco 5.1156 - Add SET DEFAULT PROGRAM
; UPD ID= 1034, SNARK:<5.EXEC>EXEC0.MAC.24,  23-Sep-80 14:03:54 by OSMAN
;tco 5.1151 - prevent spurious error from "INFO MON"
; UPD ID= 1025, SNARK:<5.EXEC>EXEC0.MAC.23,  22-Sep-80 10:37:46 by OSMAN
;tco 5.1150 - Add SET PROGRAM
; UPD ID= 1016, SNARK:<5.EXEC>EXEC0.MAC.22,  16-Sep-80 10:14:20 by HESS
; New version of MIC
; UPD ID= 918, SNARK:<5.EXEC>EXEC0.MAC.21,  19-Aug-80 14:28:14 by HESS
; Fix Examine/Deposit commands for multi-forking
; UPD ID= 871, SNARK:<5.EXEC>EXEC0.MAC.20,  11-Aug-80 11:21:43 by OSMAN
;5.1129 - Allow "@FOO" as contents for DEPOSIT
; UPD ID= 865, SNARK:<5.EXEC>EXEC0.MAC.19,  11-Aug-80 10:59:05 by OSMAN
;More 5.1129 - Allow symbolic deposit into empty fork
; UPD ID= 863, SNARK:<5.EXEC>EXEC0.MAC.18,  10-Aug-80 16:41:16 by OSMAN
;More 5.1129 - Fix EXAMINE and DEPOSIT
; UPD ID= 852, SNARK:<5.EXEC>EXEC0.MAC.17,  10-Aug-80 15:20:04 by OSMAN
;tco 5.1129 - Add symbolic expression and address support
; UPD ID= 837, SNARK:<5.EXEC>EXEC0.MAC.16,   5-Aug-80 10:27:28 by OSMAN
;tco 5.1124 - Do LOGIN.CMD before COMAND.CMD
; UPD ID= 836, SNARK:<5.EXEC>EXEC0.MAC.15,   5-Aug-80 10:07:21 by OSMAN
;Remove SY abbreviation
; UPD ID= 829, SNARK:<5.EXEC>EXEC0.MAC.14,   4-Aug-80 12:36:58 by LYONS
; Change ^V echo to fix listings alignment
; Fix herald suppression code
; UPD ID= 825, SNARK:<5.EXEC>EXEC0.MAC.13,   4-Aug-80 09:48:52 by OSMAN
;Move version stuff into EXECIN
; UPD ID= 805, SNARK:<5.EXEC>EXEC0.MAC.12,  28-Jul-80 14:54:35 by MURPHY
;Remove effect of .FBKEP
; UPD ID= 787, SNARK:<5.EXEC>EXEC0.MAC.11,  23-Jul-80 15:25:57 by OSMAN
;tco 5.1111 - Don't croak SYSTAT if SKED% keels over due to job logging out
; UPD ID= 770, SNARK:<5.EXEC>EXEC0.MAC.10,  21-Jul-80 13:58:49 by MURPHY
;FORCE SY AS ABBREV FOR SYSTAT
; UPD ID= 586, SNARK:<5.EXEC>EXEC0.MAC.9,   2-Jun-80 14:35:06 by MURPHY
;<5.EXEC>EXEC0.MAC.8, 30-May-80 16:42:15, EDIT BY MURPHY
;PUT ALERT AND MAIL-WATCH UNDER NEWF
; UPD ID= 565, SNARK:<5.EXEC>EXEC0.MAC.7,  28-May-80 16:54:41 by MURPHY
; UPD ID= 551, SNARK:<5.EXEC>EXEC0.MAC.6,  23-May-80 13:36:11 by MURPHY
;MAKE EDIT/CREATE USE IMPLICIT RUN COMMAND LOGIC
; UPD ID= 543, SNARK:<5.EXEC>EXEC0.MAC.5,  21-May-80 12:06:57 by MURPHY
;ADD MFRK TO CONTROL MULTI-FORK FEATURES ONLY
;ADD NEWF TO CONTROL "NEW" FEATURES PENDING REVIEW
;Change handling of fork name as command
;<5.EXEC>EXEC0.MAC.4,  8-May-80 14:01:08, EDIT BY OSMAN
;Remove R.L.5 and R.GE.5 macro calls
;<4.1.EXEC>EXEC0.MAC.27, 29-Apr-80 13:30:31, EDIT BY OSMAN
;Make "Up again at" have space before it
; UPD ID= 457, SNARK:<4.1.EXEC>EXEC0.MAC.25,  22-Apr-80 16:42:13 by OSMAN
;tco 4.1.1146 - Make CTRL/Q during advice work.
;<4.1.EXEC>EXEC0.MAC.24, 28-Mar-80 09:52:19, Edit by HESS
; New version of MIC support
;<4.1.EXEC>EXEC0.MAC.23, 17-Mar-80 14:10:16, EDIT BY OSMAN
;Get rid of ONEWRD checks
;<4.1.EXEC>EXEC0.MAC.22, 17-Mar-80 10:53:23, EDIT BY OSMAN
;PUT R.L.5 CONDITIONAL AROUND SMOUNT, SDISMOUNT, TMOUNT
;<4.1.EXEC>EXEC0.MAC.21, 13-Mar-80 10:50:22, EDIT BY OSMAN
;tco 4.1.1108 - Print n.m instead of nx in version numbers
;Put SMOUNT and SDISMOUNT back in for release 4.1
;<4.1.EXEC>EXEC0.MAC.19,  7-Mar-80 17:00:41, EDIT BY OSMAN
;tco 4.1.1101 - lowercase error message "Illegal character in program name..."
;<4.1.EXEC>EXEC0.MAC.11, 29-Feb-80 09:31:36, EDIT BY OSMAN
;tco 4.1.1095 - allow "SYS NO ."
; UPD ID= 261, SNARK:<4.1.EXEC>EXEC0.MAC.8,  14-Feb-80 08:52:57 by OSMAN
;tco 4.1.1079 - Flush SMOUNT, SDISMOUNT, TMOUNT
; UPD ID= 258, SNARK:<4.1.EXEC>EXEC0.MAC.7,  12-Feb-80 10:10:48 by OSMAN
;Remove QCM (old QUENCH startup stuff)
; UPD ID= 236, SNARK:<4.1.EXEC>EXEC0.MAC.6,   1-Feb-80 08:51:12 by OSMAN
;tco 4.1.1076 - Wait for confirmation on FOREIGN-HOST subcommand
; UPD ID= 195, SNARK:<4.1.EXEC>EXEC0.MAC.5,   8-Jan-80 14:31:09 by OSMAN
; UPD ID= 192, SNARK:<4.1.EXEC>EXEC0.MAC.4,   8-Jan-80 14:25:26 by OSMAN
;tco 4.1.1061 - Use generation 1 on system mail
;<4.1.EXEC>EXEC0.MAC.2, 20-Nov-79 10:46:37, EDIT BY OSMAN
;TCO 4.1.1023 - FIX TAKE STUFF

;	COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1976, 1988.
;	ALL RIGHTS RESERVED.
;
;	THIS SOFTWARE IS FURNISHED UNDER A  LICENSE AND MAY BE USED AND  COPIED
;	ONLY IN  ACCORDANCE  WITH  THE  TERMS OF  SUCH  LICENSE  AND  WITH  THE
;	INCLUSION OF THE ABOVE  COPYRIGHT NOTICE.  THIS  SOFTWARE OR ANY  OTHER
;	COPIES THEREOF MAY NOT BE PROVIDED  OR OTHERWISE MADE AVAILABLE TO  ANY
;	OTHER PERSON.  NO  TITLE TO  AND OWNERSHIP  OF THE  SOFTWARE IS  HEREBY
;	TRANSFERRED.
;
;	THE INFORMATION IN THIS  SOFTWARE IS SUBJECT  TO CHANGE WITHOUT  NOTICE
;	AND SHOULD  NOT  BE CONSTRUED  AS  A COMMITMENT  BY  DIGITAL  EQUIPMENT
;	CORPORATION.
;
;	DIGITAL ASSUMES NO  RESPONSIBILITY FOR  THE USE OR  RELIABILITY OF  ITS
;	SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.
;TOPS20 'EXECUTIVE' COMMAND LANGUAGE

	SEARCH EXECDE
	UTITLE EXEC0
	EXTERN INFLEN		;[7.1076]

;THIS FILE CONTAINS
; START AND REENTER INITIALIZATION
; MAIN LOOP TO READ FIRST WORD OF COMMAND AND DISPATCH
; COMMAND TABLES AND OTHER MISC TABLES
; STATUS AND TERMINAL CHARACTERISTICS COMMANDS

;TOPS10 JOB DATA AREA

JOBSA==:120
JOBSYM==:116
JOBDDT==:74

;TOPS20 ENTRY VECTOR
; NOTE: "EXEC" IS ASSUMED TO BE FIRST SYMBOL IN EXEC.REL, AND AT A
; PAGE BOUNDARY, BY PAGE BOUNDARY CHECK IN "ALOFRK" AT END OF THIS FILE.

EXEC::	JRST REENTE		;START ENTRY
	JRST REENTE		;REENTER ENTRY
	%%LVER,,%%RVER		;VERSION NUMBER

;PUT THE COPYRIGHT STATEMENT HERE IN THE REL FILE

CPYRYT

;POINTER TO SYMBOL TABLE
;SAVED HERE FROM JOBSYM WHEN THAT PAGE REMOVED FOR SHARABLE SUBSYSTEM

.JOBSYM::0
.NPAGS::0			;SIZE OF EXEC IN PAGES

 EVLEN==:3			;ENTRY VECTOR LENGTH (STARTING AT "EXEC")

;PATCH AREA
;ALSO THERE'S A WRITEABLE PATCH AREA (PPAT) IN EXECPR.MAC.

PATS::
PAT:: BLOCK 200
;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
	SUB A,[AUTOL1]
	JUMPG A,AUTOLO		;DO AUTOLOGOUT (EXECSU.MAC)
	POP P,A
	RET


CHNMSK:	CHNS			;MASK FOR ACTIVE CHANNELS

;ROUTINE TO CLEAR CRJOB/PRARG START UP BLOCK

CLPRA:	SETZM CRPRA
	MOVE A,[XWD CRPRA,CRPRA+1]
	BLT A,CRPRA+17
	RET

;"EXEC" AND ITS VERSION

EXECV::	TYPE < TOPS-20 Command processor >
	MOVE Q1,EXEC+2		;GET VERSION #
	CALLRET VERPNT		;PRINT IT
;ROUTINE TO INITIALIZE COMND JSYS.  ITEMS INITIALIZED IN THIS ROUTINE
;ARE ONES NOT NECESSARY TO REINITIALIZE FOR EACH COMMAND.

CMDINI::MOVEI A,REPARS		;SET UP REPARSE HANDLER ADDRESS
	MOVEM A,CMFLG
	HRROI A,CBUF		;POINTER TO COMMAND BUFFER
	MOVEM A,CMBFP
	MOVEM A,CMPTR		;NO "NEXT FIELD" YET
	MOVEI B,CBUFL*5		;ANNOUNCE HOW MUCH ROOM FOR TYPEIN THERE IS
	MOVEM B,CMCNT
	SETZM CMINC		;NO UNPARSED CHARACTERS YET
	HRROI A,ATMBUF		;POINTER TO ATOM BUFFER
	MOVEM A,CMABP
	MOVEI A,ATMLEN*5	;LENGTH OF ATOM BUFFER
	MOVEM A,CMABC
	MOVEI A,CJFNBK		;ADDRESS OF GTJFN BLOCK
	MOVEM A,CMGJB
	RET
;REENTER ENTRY

REENTE::
REE::	SKIPN CINITF		;IS EXEC INITIALIZED?
	JRST EXEC0		;NO, "REENTER" GIVEN BEFORE "START",
				;FULL INITIALIZATION REQUIRED.
	SKIPE CUSTMF		;PCL Is this just a customized Exec?
	JRST EXEC0		;PCL It is, do full initialization

;THE FOLLOWING CODE IS EXECUTED ON "REENTER" ONLY.

;RE-INITIALIZE PSI SYSTEM
; (^C OUT OF EXEC DDT TO SUPERIOR EXEC LEAVES IT WRONG).

	CALL ICLEAR		;CLEAR INTERRUPT WE MAY HAVE RESTARTED OUT OF, DONE HERE TO AVOID TWO FOR EVERY ^C!
	MOVEI A,.FHSLF
	MOVE B,CHNMSK		;GET ACTIVE CHANNEL MASK
	AIC			;ACTIVATE CHANNELS SPECIFIED BY MASK
	EIR			;ENABLE PROCESS PSEUDOINTERRUPT SYSTEM
	CALL CPULIM		;GET AND SET CPU TIME LIMIT
	TXO Z,NECHOF		;PRETEND ECHOING OFF
	CALL DOECHO		;FORCE ECHOING (IN CASE WARM START AFTER INTERRUPT OUT OF A NOECHO PLACE!)
	CALL DOATI		;TERMINAL INTERRUPTS (ON ^EQ, MINI-EXEC CLEARS THEM)
	MOVEI Q1,ETTYMD
	CALL LTTYMD		;INIT TTY STATE IN CASE INTERRUPTED OUT OF COMND
	JRST CMDIN2		;JOIN STARTUP CASE

;INSTRUCTION TO INITIALIZE STACK

INISTK::MOVE P,[IOWD PDL,PD]
;FIRST STARTUP INITIALIZATION

EXEC0::	XCT INISTK		;INITIALIZE THE STACK
	MOVEI A,.FHSLF
	RPCAP			;GET CURRENT CAPABILITIES
	HLLZ C,C		;PREVENT "ATTACH" WITHOUT PASSWORD
	EPCAP			;(MONITOR MAKES VIRGIN JOB BE WHEEL!)
	SETZM CSZ1
        MOVE A,[XWD CSZ1,CSZ1+1]
        BLT A,CSZ4
	GETNM			;GET PROGRAM NAME
	MOVEM A,SAVNAM		;REMEMBER NAME
	CALL GETMOD		;SEE WHETHER WE'RE COMING FROM EXEC OR USER MODE
	MOVEM A,SAVT20		;REMEMBER FOR WHEN WE POP

;SET UP 41 FOR UUO'S, P=17 FOR PUSHDOWN POINTER

        MOVE A,[CALL CUUO]
        MOVEM A,41
	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		;..
	SKIPN XDICT		;PCL Does permanent pool need initialized?
	CALL XFRINI		;INITIALIZE PERMANENT FREE SPACE
	SETOM CEPSIC		;NO DEFAULT INTERRUPT CHAR FOR COMMAND EDITOR
	MOVEI A,NFRKS		;INITIALIZE FORK NAME TABLE
	MOVEM A,FRKNMS		;SAY MAXIMUM NAMES ALLOWED IN TABLE
	MOVEM A,KEPNMS		;INITIALIZE KEPT FORKS TABLE TOO
	CALL GETFB1		;GET FORK BLOCK FOR DEFAULTS
	MOVEM A,FRKDEF		;REMEMBER ADDRESS OF DEFAULT BLOCK
	SKIPE SYMBF		;DO WE ALREADY HAVE SYMBOL BUFFER (IS THIS A CUSTOMIZED EXEC)
	JRST SYMDON		;YES
	MOVEI A,777+NSMPGS_9	;GET WINDOW FOR SYMBOL TABLE MAPPING
	CALL GTBUFX
	TRZE A,777		;WE NEED PAGE-ALIGNED ADDRESS FOR PMAP
	ADDI A,1000		;IF BLOCK STARTED ON PARTIAL PAGE, GET TO FULL ONE
	MOVEM A,SYMBF		;REMEMBER WHERE BUFFER STARTS
SYMDON:	SETZ Z,			;CLEAR FLAGS
	CALL CLPRA		;CLEAR CRJOB/PRARG AREA
	MOVE A,[.PRARD,,.FHSLF]	;READ OUR BLK IF THERE
	MOVEI B,CRPRA
	MOVEI C,20		;LENGTH OF OUR BLK
	PRARG
	JUMPE C,EXEC01		;NOTHING WAITING FOR US
	MOVE A,CRPRA+.CJPHD	;PICK UP ID THAT IDENTIFIES CRJOB-PRARG
	CAME A,[1B0+3B6+2B12+CR%PRA] ;PRARG FROM CRJOB?
	 JRST [ CALL CLPRA	;NO, WHO KNOWS WHAT, DITCH IT
		JRST EXEC01]
	SETO A,			;THIS JOB
	HRROI B,CJPTIM		;1 WORD INTO OUR FLAG WORD
	MOVEI C,.JIRTL		;GET JOB RUNTIME LIMIT (IF SET)
	GETJI
	 SETZM CJPTIM		;FAILED, FLAG AS NONE PRESENT
	HRRZ A,CRPRA+.CJPLP	;GET PTR TO FLAGS
	MOVE B,CRPRA(A)		;PICK UP FLAGS
	TLNN B,(1B1+1B2)	;A FORK HANDLE GIVEN TO US?
	 JRST EXEC01		;NO, CONTINUE
	HRRZ A,CRPRA+.CJPKP	;GET PTR TO FORK,,SFRKV OFFSET
	MOVE B,CRPRA(A)
	HLRZM B,FORK		;SET IT AS CURRENT LOWER FORK
	JRST EXEC02
EXEC01:	SETOM FORK		;SAY NO INFERIOR FORK
	SETOM RUNFK		;NO RUNNING FORK
	SETOM EDFORK		;NO EDITOR FORK
	SETOM IDFORK		;NO IDDT FORK
	SETOM EFORK		;NO EPHERMERAL FORK
	SETOM MICFRK		;NO MIC FORK

	MOVEI A, CESAVE+2	;INITIALIZE THE COMMAND EDITOR
	MOVEM A, CESAVE		;
	MOVEM A, CEFFL		;INITIALIZE FREE SPACE POINTER
	MOVEI A, CESAVE		;INITIALIZE POINTER INTO TABLE
	MOVEM A, CE1ST		;
	MOVEM A, CELAST		;
	MOVEI A, 1		;INITIALIZE THE COMMAND COUNT
	MOVEM A, CECNT		;

EXEC02:	SETOM NPAGE		;SAY NO PAGE OF INFERIOR IS MAPPED
	SETOM OLDIDX		;SAY NO IPCF MESSAGE WAITING YET
	MOVEI A,NEXTS		;INITIALIZE EXTENSION TABLE
	MOVEM A,DEXTBL
;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,.FHSLF		;SAY THIS FORK
	MOVE B,[XWD LEVTAB,CHNTAB]
	SIR			;SET UP TABLE ADDRESSES
	MOVE B,CHNMSK		;GET ACTIVE CHANNEL MASK
	AIC			;ACTIVATE SPECIFIED CHANNELS
	EIR			;ENABLE PROCESS PSI SYSTEM
	CALL CPULIM		;GET AND SET CPU TIME LIMIT
	CALL CMDINI		;INITALIZE ALL COMND PARAMETERS
	SETZM TAKLEN		;NO JFNS ON STACK YET
	DMOVE A,[XWD .PRIIN,.PRIOU ;USE PRIMARY IO
		 TKALEF]	;ALLOW ERRORS AT THIS LEVEL, NO ECHOING OF COMMAND
	CALL PUSHIO		;START INITIAL STREAM
	CALL STSYST		;INIT GETAB NUMBERS

;INITIALIZE TELETYPE MODE, TABS, CONTROL CHARACTER OUTPUT (CCOC).
;INITIALIZE MODES FOR USE IN RUNNING PROGRAM FROM PRESENT MODES.

	MOVEI Q1,ITTYMD		;INITIAL MODES FOR "START"
	CALL RTTYMD		;THIS SUBR SAVES MODE WORD, TABS, CCOC.
	MOVE A,[SIXBIT /(PRIV)/]
	MOVEM A,ITTYMD+TTWSNM	;SUBSYSTEM NAME UNLESS OTHERWISE SPEC

;INITIALIZE MODES FOR USE WHEN EXEC IS RUNNING:
;ASSUME IT'S ALREADY CORRECT WITH REGARD TO HARDWARE FEATURES;

	MOVEI Q1,ETTYMD		;KEEP EXEC MODES UP TO DATE IN STORAGE
	CALL RTTYMD		;...FOR ^C.
	MOVEI A,0		;DON'T TYPE ^V IN ANY FORM
	DPB A,[POINT 2,ETTYMD+TTWCOC+1,9]
				;MAKE CONTROL-V ECHO LITERALLY AS IN FILENAMES
	MOVEI A,3		;FORMAT LINEFEED (MAKE IT ECHO AS CRLF)
	DPB A,[POINT 2,ETTYMD+TTWCOC,21]

;DISABLE COMPAT FOR EXEC

	MOVEI	A,.FHSLF	;FOR SELF
	MOVNI	B,1		;SET TO -1
	MOVEI	C,0		;...
	SCVEC			;BYE
;DETERMINE HERE IF BATCH MODE

	SETZM BATCHF		;ASSUME NOT BATCH JOB
	MOVNI A,1
	MOVE B,[-1,,A]
	MOVEI C,.JIBAT		;GET BATCH FLAG
	GETJI
	 CALL JERR
	JUMPE A,NOBTCH		;0 := NOT BATCH
	SETOM	BATCHF		;SET BATCH FLAG
	SETOM	CCFLAG		;NO CTRL-C CAPABILITY
NOBTCH:

;FIND OUT IF THIS JOB IS LOGGED IN. (MIGHT BE AT STARTUP IF SUBSIDIARY.
;  OR A SUBSYSTEM COULD LOG JOB IN.)

	GJINF			;USER # IN A, 0 IF NOT LOGGED
	MOVEM A,CUSRNO		;SAVE USER # OR 0
	MOVEM A,LIDNO		;SAVE AS LOGGED-IN DIR NUMBER IN CASE OLD MONITOR AND GETJI FAILS
	MOVEM C,JOBNO		;REMEMBER JOB NUMBER
	MOVE A,C		;GET THE JOB NUMBER
	HRROI B,LIDNO		;READ LOGGED-IN DIRECTORY NUMBER INTO LIDNO
	MOVEI C,.JILNO		;ASK FOR ONLY THIS ONE.
	GETJI			;DO IT.
	 JFCL			;IGNORE FAILURE, SEE LIDNO REF. ABOVE.
	MOVEI A,.FHJOB
	RTIW			;UPDATED JOB TIW FOR EXEC
	MOVEM B,ETTYMD+TTWJTI
	MOVEM B,ITTYMD+TTWJTI	;INITIALLY, SAME FOR PGM
	MOVEI Q1,ETTYMD		;INITIALIZE TTY, SO ^V DOESN'T APPEAR IN FILENAMES
	CALL LTTYMD
;SAY INITIALIZATION HAS COMPLETED SUCCESSFULLY.
;UNTIL CINITF<>0, ERROR ROUTINES HALT RATHER THAN TYPE MESSAGES.
; AND "REENTER" DOES A "START".

	SETOM CINITF
	CALL DOATI		;ASSIGN TERMINAL INTERRUPTS (DON'T ALLOW ^C EARLIER !)
	SKIPN CRPRA		;CRJOB SET UP?
	JRST CMDIN0		;NO
	HRRZ A,CRPRA+.CJPLP	;FETCH FLAG POINTER
	SKIPGE B,CRPRA(A)	;HERALD SUPPRESS?
	JRST CMDIN2		;YES
	TLNN B,(1B4)		;SIMULATE LOGIN?
	JRST CMDIN0		;NO SO GO ON.
	ETYPE <%_>		;PRINT A LINE.
	CALL %VERSI		;VERSION AND STUFF
	CALL DWNPNT		;DOWN TIME
	JRST CMDIN2		;AND CONTINUE
CMDIN0:	SKIPE BATCHF		;BATCH JOB?
	JRST CMDIN1		;GO PRINT HERALD
	SETO A,			;SUPPRESS HERALD FOR SYSJOB
	HRROI B,C
	MOVEI C,.JICPJ
	GETJI			;FETCH CONTROLLING JOB NUMBER
	 CALL JERR
	JUMPE C,CMDIN2		;SYSJOB, SO SKIP IT
CMDIN1:	ETYPE <%_>		;HERALD
	CALL $VERSI		;VERSIONS
	CALL DWNTYP		;IF THERE IS A DOWN TIME
;COMMANDS THAT RUN PROGRAM RETURN HERE WHEN IT STOPS.
;START, CONT, REENTER, RUN, <SUBSYSTEM NAME>, GOTO.
;RE-ENTRY JOINS MAIN FLOW HERE

CMDIN2::CALL SETT20		;SAY TOPS20 COMMAND LEVEL (PLACED HERE TO MINIMIZE JSYS'S PER COMMAND)
	JRST CMDIN3

$VERSI:	GJINF
	JUMPN A,EXECV		;EXEC VERSION ONLY IF LOGGED IN
	HRROI B,[ASCIZ/SYSTEM:JOB-STARTUP-MESSAGE.TXT/] ;[7.1007]
	MOVX A,GJ%OLD+GJ%SHT	;[7.1007] OLD FILE ONLY, SHORT FORM
	CALL GTJFS		;[7.1007] (A,B/) GET HANDLE ON HELP FILE
	 JRST %VERSI		;[7.1007] IGNORE THE ERROR
	MOVEI Q1,CP%HEL		;[7.1007] ACT LIKE THE HELP COMMAND
	MOVE A,JBUFP		;[7.1007] GET POINTER TO JFN CELL
	HRRZM A,INIFH1		;[7.1007] 
	HRRZM A,INIFH2		;[7.1007] COPY CODE NEEDS THIS
	SETOM HELPSN		;[7.1007] FLAG TO "TYPE CODE" SAYING NO MORE TO DO
	CALL TYPE1		;[7.1007] (/) COPY THE FILE TO TTY
%VERSI::PRINT " "
	HLLZ D,SYSVER		;XWD LENGTH, INDEX
%VERS1:	GTB .SYSVE		;GET A DATA WORD FROM TABLE (USES D)
	MOVE B,A
	MOVEI C,5		;PRINT 5 CHARS FROM EACH WORD
%VERS2:	SETZ A,
	LSHC A,7
	JUMPE A,%VERS3		;END ON NULL
	PRINT (A)
	SOJG C,%VERS2
	AOBJN D,%VERS1		;ALSO END ON END OF TABLE
%VERS3:	ETYPE<%_>
	RET

;FIXON IS CALLED AFTER ADVISE IS ENDED TO RESTORE TERMINAL PAGING.

FIXON::	MOVEI A,.CTTRM		;REFERENCE CONTROLLING TERMINAL
	RFMOD			;GET CURRENT SETTINGS
	TXZ B,TT%PGM		;START WITH CLEAN PAGE MODE BIT
	IOR B,SAVPGM		;GET SAVED VALUE OF PAGE MODE BIT
	STPAR			;RESTORE VALUE OF PAGING BIT
	RET
;ROUTINE TO ENABLE TERMINAL INTERRUPTS

DOATI::	MOVEI A,.FHSLF
	RPCAP			;SEE IF WE'RE ALLOWED TO ENABLE ^C
	TXNN B,SC%CTC		;TEST SPEC CAP BIT 0
	JRST DOAT0		;NOT ALLOWED TO ENABLE ^C
	TXO C,SC%CTC
	EPCAP			;ENABLE FOR ^C CAPABILITY
	MOVE A,[XWD CTRLC,1]
	ATI
	MOVEI A,.FHJOB		;SET TERMINAL MASK FOR JOB
	MOVE B,ETTYMD+TTWJTI	;GET CORRECT MASK
	STIW			;SET UP CORRECT MASK
	MOVX A,ST%DIM!.FHSLF	;OURSELF, GET DEFERREDS IN AC3
	RTIW			;GET DEFERRED MASK
	TXO C,1B<CTRLC>
	STIW			;MAKE SO PROGRAM BUFFERED INPUT GETS READ BEFORE ^C

;ASSIGN CHAR TO PRINT TIME USED (^T) TO PSI CHANNEL 3

DOAT0:	MOVEI A,ADVESC		;MAKE SURE ADVICE CHARACTER NO LONGER SPECIAL
	DTI
	MOVE A,[XWD CTCODE,3]
	ATI

;ASSIGN CHARACTER TO ACTIVATE COMMAND EDITOR

	SKIPG CEPSIC		;INTERRUPT CHARACTER SET?
	IFSKP.			;YES
	  HRLZ A, CEPSIC	;GET IT
	  HRRI A, CEDCHN	;AND USE CHANNEL FOR COMMAND EDITOR
	  ATI%			;ENABLE THE INTERRUPT
	ENDIF.

;ASSIGN CHARACTER TO CLEAR OUTPUT BUFFER

	MOVE A,[CTRLO,,5]	;CONTROL-O IS USED
	ATI
	RET
;THIS ROUTINE GET TIME LIMIT WHICH WAS POSSIBLY SET BY ANOTHER
;PROCESS AND SETS IT ON THE CORRECT CHANNEL

CPULIM:	MOVNI A,1
	MOVE B,[-1,,D]		;GET CURRENT LIMIT INTO D
	MOVEI C,.JIRTL
	GETJI
	 CALL JERR
	MOVE A,[.FHJOB,,.TIMRT]	;SET TIME LIMIT CODE
	SETZB B,C		;CLEAR LIMIT
	TIMER
	 CALL [	CAIE A,TIMX4	;NOT SET BY THIS FORK?
		JRST JERR	;NOPE, PRINT IT
		POP P,(P)
		RET]		;RETURN HAVING DONE NOTHING
	MOVE A,[.FHJOB,,.TIMRT]	;SET TIME LIMIT CODE
	MOVE B,D		;GET TIME TO SET
	MOVEI C,4		;CHANNEL
	TIMER
TIMERR:	 ERROR <Couldn't set time limit - %?>
	RET
;SUBROUTINE TO INIT GTTAB NUMBERS - USED AT STARTUP ONLY
;NOTE:  THE ONLY ONES THAT SHOULD BE INITED HERE ARE ONES TO BE
;USED FOR *OTHER* THAN GETAB JSYS.  FOR GETAB JSYS, USE MONITOR
;SYMBOLS.

STSYST:	MOVSI D,-NGTTBS		;NUMBER OF TABLES
STSYS1:	MOVE A,GTTBS(D)		;GET THE SIXBIT NAME OF THE TABLE
	SYSGT			;GET ITS NUMBER
	JUMPN B,STSYS2		;JUMP UNLESS NO SUCH TABLE
	TYPE <%No system table named: >
	MOVE A,GTTBS(D)
	CALL SIXPRT
	SETZ B,
STSYS2:	MOVEM B,@GTTBS+1(D)	;PUT NUMBER IN VARIABLE
	AOBJN D,.+1
	AOBJN D,STSYS1		;DO ALL TABLES
	RET

DEFINE PRGSTG			;STORAGE NEEDED FOR PROGRAM COMMANDS
<	TRVAR <PNAMP,NAMFLG,PJFN,PTBLP>
>
;LIST OF GTTAB TABLES KNOWN TO EXEC

DEFINE XX (NAMS)<
	IRP NAMS,<
	SIXBIT /NAMS/
	Z NAMS>>

GTTBS:	XX <QTIMES,SNAMES,SYSVER,JOBRT,TTYJOB>
NGTTBS==.-GTTBS
;^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::	SETZM ERRMF		;CLEAR ERROR WITHIN ERROR FLAG
	SKIPN ADVFLG
	JRST CMDIN3		;NO CLEANUP NECESSARY
	CALL DOATI		;MAKE SO ^E AND ^C WORK AS NORMAL AGAIN
	CALL FIXON		;FIX PAGE MODE SETTING
	MOVE B,ADVTNM		;GET TERMINAL FOR BREAKING LINKS WITH
	CALL BREAK1		;BREAK LINKS TO REALLY END THE ADVICE
	XCT ADVMES		;GIVE STANDARD END MESSAGE (AFTER BREAK SO WE DON'T HANG UP AGAIN)
	SETZM ADVFLG		;INDICATE NOT IN ADVISE CODE

CMDIN3:	MOVEI A,1
	MOVEM A,INTDF
	MOVEM A,IINTDF		;MAKE SURE IPCF INTERRUPTS ALLOWED
	CALL PION		;MAKE SURE ^C ALLOWED
	CALL IPCON		;MAKE SURE IPCF INTERRUPTS ALLOWED

;MISCELLANEOUS INITIALIZATION

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

;[4420] Process CRJOB startup flags to simulate login, or look like an EXEC1
;LOGIN command.

	SKIPN CRPRA		;[4420] Is crjob start up?
	JRST CMDIN4		;[4420] Nope, normal start

	HRRZ A,CRPRA+.CJPLP	;[4420] Get flags ptr
	MOVE B,CRPRA(A)		;[4420] Get the flags themselvex
	TLNE B,(1B4)		;[4420] Simulate login?
	SETOM LOGINI		;[4420] Yes.
	TLNE B,(1B3!1B4)	;[4420] Creator want system messages etc?
	IFSKP.			;[4420] Nope
	  SETZM MESMSF		;[4420] No login check
	  SETZM MWATCF		;[4420] No mail watch
	  JRST CMDIN4		;[4420] Get quickly to normal commands
	ENDIF.			;[4420] So, we aren't being quiet, eh?

;[4420] Look like a job logged into from a terminal.  It's probably BATCON
;logging in a batch job for some user.

	CALL FREINI		;[4420] (/) Initialize free space
	CALL DOMESS		;[4420] (/) Display login messages
	CALL DOFAIL		;[4412] (/) Display login failures
	SETOM SYSMF		;[4420] We want system messages
	CALL PNTMES		;[4420] (/) Print system message if needed
	JRST CMDIN4		;[4420] Restart command
;[4420] DOMESS - Routing to output the LOGIN command messages.  Since
;GETJI will get this information from this job's JSB, and not from the
;directory on disk, it will contain the proper date time.
;Returns +1 always with current and last login date and time messages sent.

DOMESS:	SETO A,			;[4420] This job
	HRROI B,LOGDAT		;[4420] Point to the place to store last login
	MOVEI C,.JILLN		;[4420] Get the last login date-time from JSB
	GETJI%			;[4420] Get from JSB, directory was updated
	 ERJMP .+1		;[4420] No error
	MOVE A,LOGDAT		;[4420] Get the date time returned
	ETYPE < Job %J on %L %D %E
  Last interactive login %1W
>				;[4420] Output whole message at once 
	SETO A,			;[4420] Done this way to insure compatibility
	HRROI B,LOGDAT		;[4420] Point back to place to store last login
	MOVEI C,.JINLD		;[4420] Now try to get last non-int login
	GETJI%			;[4420] Can we get it today?
	 ERJMP R		;[4420] Nope, return now
	MOVE A,LOGDAT		;[4420] Use last non-int login as login time
	ETYPE <  Last non-interactive login %1W
>				;[4420] Output that information
	RET			;[4420] Return
;[4412]
;DOFAIL - Routine called by EXEC when started goofy (PRARG%) to display various
;login failures.  [4420] Note the directory's login failures are not updated on
;a non-interactive login, the counts will be correct in the directory.
;
; Called with:
;	no arguments
;	CALL DOFAIL
;
; Returns:
;	+1 - Always, with login failures displayed

DOFAIL:	STKVAR <<CDBLK,.CDFPA+1>> ;Temp storage
	SETZM .CDFPA+CDBLK	;Clear this word in case monitor don't have it
	MOVE A,LIDNO		;Get logged in directory number
	MOVEI B,CDBLK		;Here's the place to write the information
	MOVEI C,.CDFPA+1	;Want this many words
	MOVEM C,.CDLEN(B)	;Save it in argument block
	SETZ C,			;Don't use password string
	GTDIR%			;Get the password failure count
	 ERJMP .+1		;If failure, continue

	HLRZ B,.CDFPA+CDBLK	;[4420] Get interactive login failures
	IFN. B			;Is it non-0?
	  ETYPE <%% %2Q interactive login failure>
	  CAIE B,1		;Singular?
	  ETYPE <s>		;Nope
	  ETYPE < since last successful login
>
	ENDIF.

	HRRZ B,.CDFPA+CDBLK	;[4420] Non-interactive failures are unusual
	IFN. B			;Non-0?
	  ETYPE <%% %2Q non-interactive login failure>
	  CAIE B,1		;More than one?
	  ETYPE <s>		;Yes, say so
	  ETYPE < since last successful login
>
	ENDIF.			;[4420] End of non-interactive login failures
	RET			;[4420] Return with all information displayed
	ENDSV.			;End GTDIR% block
;CMDOUT - FROM LOGOUT CODE TO PROCESS LOGOUT.CMD AND SAVE OUR RETURN
;CMDIN4 - WHEN READY TO INPUT A COMMAND.
;ALL COMMANDS RETURN TO CMDIN4 OR ABOVE WHEN DONE.

CMDOUT::SKIPN LGORET		;DOING LOGOUT.CMD? IF NOT, NO NEED TO SAVE OUR RETURN
	JRST CMDIN4
	POP P,LGORET		;YES, SAVE THE RETURN
	HRRZS LGORET
CMDIN4::SETZM .JBUFP		;ALLOW ALL JFNS TO BE RELEASED
	CALL FIXIO		;MAKE SURE REAL STREAM USED FOR COMMAND

;SET SUBSYSTEM NAME TO "EXEC".
;THIS UPDATES MONITOR TABLES USED BY "SYSTAT".

	MOVX A,OURNAM
	MOVEM A,ETTYMD+TTWSNM
	MOVEM A,ETTYMD+TTWPNM	;PROGRAM NAME TOO
	MOVX B,OURNAM		;SET UP PRIVATE NAME AS SAME
	SKIPN PCCURC		;PCL If no stored command in progress
	SETSN			;SET UP SYSTEM NAME AS EXEC
	 JFCL
	SETO A,
	CAME A,NPAGE
	CALL MAPPF		;DON'T LEAVE FORK PAGES MAPPED
	 JFCL			;UNMAP SHOULDN'T FAIL
	SETZM CSZ1		;ZERO STORAGE
	MOVE A,[XWD CSZ1,CSZ1+1]
        BLT A,CSZ2

;INITIALIZE WHAT NEEDS INITIALIZING

        MOVE A,[POINT 7,CBUF,-1] ;BYTE POINTER INTO COMMAND BUFFER,
				;IN WHICH ENTIRE LINE IS ACCUMULATED.
	MOVEM A,BEGINP		;REMEMBER WHERE INPUT LINE BEGINS (FOR REPARSES)
	XCT INISTK		;INITIALIZE STACK
	PRGSTG			;GET LOCAL STORAGE FOR PROGRAM NAME STUFF
	CALL FREINI		;INITIALIZE FREE SPACE
;INITIALIZE AUTOLOGOUT STUFF IF NECESSARY

	SKIPE CUSRNO
	JRST CMDN5E		;LOGGED IN, NOT RELEVANT.
	IFNBATCH (CMDN5E)	;NO ALO STUFF IF IN BATCH
	SKIPE ALOST		;HAVE WE STARTED THE AUTOLOGOUT STUFF UP?
	 JRST CMDN5D		;YES, THE FOLLOWING ALREADY DONE
	GTAD			;SAVE STARTUP TIME FOR USE IN
	MOVEM A,STRTIM		;"ALOTST" SUBR

;SET UP A PENDING TIMER INTERRUPT FOR AUTO-LOGOUT IF JOB IS INACTIVE

	MOVE A,[.FHSLF,,.TIMEL]	;SET AN ELAPSED TIMER FOR SELF
	MOVE B,[AUTOL2*^D1000]	;FOR THAT FAR IN FUTURE
	MOVEI C,2		;ON CHANNEL 2
	CALL PIOFF		;DISABLE CONTROL-C'S
	SETOM ALOST		;SAY AUTOLOGOUT STUFF STARTED
	TIMER
	 ERROR <Couldn't initialize auto-logout timer - %?>
	CALL PION		;ENABLE CONTROL-C'S

;JOB ISN'T LOGGED IN, SEE IF IT'S TIME TO AUTO-LOGOUT IT.

CMDN5D:	CALL ALOTST
;PRINT READY CHARACTER


CMDN5E:
;CHECK TO SEE IF CRJOB/PRARG START UP & IF SO, A PROGRAM TO RUN
	SKIPE CRPRA		;CRJOB START UP?
	 JRST [ HRRZ A,CRPRA+.CJPLP ;YES, GET FLAGS PTR
		MOVE B,CRPRA(A)	;THEN FLAGS
		TLNN B,(1B2)	;WANT FORK STARTED?
		 JRST .+1	;NO
		HRRZ A,CRPRA+.CJPKP ;GET PTR TO FORK & SFRKV OFFSET
		HRRZ B,CRPRA(A)
		CALL CLPRA	;CLEAR CRJOB/PRARG AREA
		PUSH P,[CMDIN4] ;WHERE TO RETURN WHEN DONE
		JRST ..STCR]	;RUN IT
	CALL CLPRA

; GET THE NUMBER OF THE USER'S POBOX: DIRECTORY, AND STORE IT IN POBXNO

	SKIPE POBXNO		;[3048]POBXNO=0?
	JRST CMDN5X		;[3048]NOT ZERO, SO DON'T GET IT AGAIN
	CALL GETPOB		;[3046] ( /C) GET THE DIRECTORY NUMBER
         SKIPA			;[3059] Not logged in - leave POBXNO alone
	MOVEM C, POBXNO		;[3046] AND SAVE IT

;CHECK FOR DEFAULT "TAKE" COMMANDS

CMDN5X:	MOVE A,CIJFN		;[3048]
	CAIN A,.PRIIN		;IF INPUT NOT FROM PRIMARY,
	SKIPE FSTLGN		;  OR FAST LOGIN WANTED,
	JRST NLGINI		;THEN NO CHANGE OF INPUT NOW
	SKIPN LOGINI		;LOGIN JUST DONE?
	JRST NL1		;NO, SKIP THIS - IF LOGINI=0, WE ALREADY DID .CMD FILES
	SKIPL LOGINI		;HAVE WE TAKEN ANY LOGIN.CMD FILES YET?
	JRST TKULOG		;YES, TAKEN SYSTEM: .CMD FILE (LOGINI>0)-TRY USER's .CMD FILE
;
;
;[3046] NO COMMAND FILES HAVE YET BEEN TAKEN - WE CAN DO AN ACCES% OF POBOX: HERE AND
;[3046] A CHECK TO TELL THE USER IF NEW MAIL EXISTS
;[3046] DO THIS HERE SO WE DON'T MESS UP ANYBODY WHO HAS THEIR .CMD FILES ACCESS
;[3046] DIRECTORIES FOR THEM
;
	SETOM LOGINF		;[3046] SET FLAG TO SAY WE ARE ACCESSING POBOX:
				;[3046] DURING THE LOG-IN PROCESS
	CALL ACSPOB		;[3046] ACCESS THIS USER'S POBOX: IF IT ISN'T PS:
         JRST CMDFLS		;[3046] FAILED
	MOVE B, POBXNO		;[3046] USER'S POBOX: DIRECTORY NUMBER
	CALL MALCHK		;[3046] (B/ )DO THE MAIL CHECK
	 JFCL			;[3046] FAILED - PROBABLY NO MAIL
CMDFLS:	SETZM LOGINF		;[3046] RESET FLAG
	MOVEI B,1		;LOGINI <0; WE HAVEN'T TAKEN ANY .CMD FILES YET
	MOVEM B, LOGINI		;WE DO SYSTEM: .CMD FILES NOW - SET FLAG TO 1
	HRROI B, [ASCIZ /SYSTEM:LOGIN.CMD/]
	SKIPE BATCHF		;UNDER BATCH?
	HRROI B,[ASCIZ /SYSTEM:BATCH.CMD/]
	CALL TAKSYS		;SET UP FOR APPROPRIATE SYSTEM: FILE
	CAIA			;PROBABLY NO SUCH FILE
	JRST CMDIN4
TKULOG:	SETZM LOGINI		;CLEAR FLAG
	HRROI B,[ASCIZ "LOGIN.CMD"]
	SKIPE BATCHF		;UNDER BATCH?
	HRROI B,[ASCIZ "BATCH.CMD"] ;YES - USER OTHER FILE
	CALL TAKEIN		;NO, SET UP EXEC INPUT
	CAIA			;DON'T RESET ANYTHING IF NOTHING GOT TAKEN
	JRST CMDIN4		;RESET ALL COMMAND INFO AFTER TAKEIN ATTEMPT
NL1:	SKIPE CUSRNO		;IF NOT LOGGED IN,
	SKIPGE FILINI		;OR INITIALIZATION DONE,
	JRST NLGINI		;THEN SKIP FOR NOW - FILINI <0 MEANS INIT DONE
	SKIPE FILINI		;FILINI=0 MEANS WE HAVEN'T TAKEN ANY .CMD FILES
	JRST TKUCMD		;WE'VE TAKEN SYSTEM: .CMD FILES - LOOK FOR USER'S
	MOVEI B,1		;HERE WE DO SYSTEM: .CMD FILES,
	MOVEM B, FILINI		;  SO SET FLAG TO 1
	HRROI B, [ASCIZ/SYSTEM:COMAND.CMD/]
	CALL TAKSYS		;SEE IF SYSTEM:COMAND.CMD EXISTS
	CAIA			;PROBABLY NOT
	JRST CMDIN4
TKUCMD: SETOM FILINI		;HERE WE TAKE USER'S CMD FILE, SO SET FLAG TO "INIT DONE"
	HRROI B,[ASCIZ "COMAND.CMD"]
	CALL TAKEIN		;NO, TAKE FILE
	CAIA			;DON'T RESET ANYTHING UNLESS WE'RE REALLY DOING "TAKE" NOW
	JRST CMDIN4		;RESET ALL COMMAND INFO AFTER TAKEIN ATTEMPT
NLGINI:	MOVE A,CIJFN		;SEE WHERE INPUT IS COMING FROM
	SKIPE FSTLGN		;FAST LOGIN
	JRST FST2		;YES - NO SYSTEM MAIL CHECK
	CAIN A,.PRIIN		;INPUTTING FROM TERMINAL?
	CALL PNTMES		;YES, SO DONE WITH INITIALIZATION, TYPE SYSTEM MESSAGES
FST2:	;..
;PERFORM MAIL WATCH FUNCTION, IF REQUESTED BY SET MAIL-WATCH

	CALL IPCOFF		;DON'T ALLOW IPCF INTERRUPTS
	SKIPE IPCRCF		;WERE THERE SOME?
	CALL IPCHEK		;YES, CHECK FOR MESSAGES RECEIVED
	SETZM IPCRCF		;THIS FLAG WILL BE SET NEXT TIME AN INTERRUPT HAPPENS
	CALL IPCON		;...WHICH COULD BE RIGHT NOW OR LATER
	SKIPE FSTLGN		;FAST LOGIN
	JRST FST3		;YES - NO MAIL CHECK
	SETZM TYPING		;NO TYPEOUT IN PROGRESS
	SETZM AUTOF		;NO INTERRUPT IN PROGRESS
	CALL MWATCH		;DO MAIL WATCH
FST3:	;..
	CALL ALRCHK		; AND ALERT CHECK
	CALL RLJFNS		;RELEASE ANY JFNS USED IN PREVIOUS COMMAND
				;NOTE:  RLJFNS CALLED HERE RATHER THAN EARLIER
				;TO FLUSH JFN USED BY MWATCH.  THIS IS NECESSARY
				;SO THAT "COPY TTY:$" DOESN'T TYPE "MAIL"!
	SETOM CLF		;SAY WE'RE AT COMMAND LEVEL
	CALL READY		;INITIALIZE FOR COMND JSYS
CIN42::	MOVEI A,RERET		;REGULAR ERROR RETURN ADDRESS
	MOVEM A,CERET		;SAY WHERE TO GO AFTER PRINTING ERR MSG

;CLEAR SOME FLAGS

	MOVEI Z,0		;CLEAR FLAGS


	JRST CIN0		;[3039] START INPUTTING AND DECODING A COMMAND

; [3059]
; ROUTINE TO OBTAIN THE POBOX: DIRECTORY NUMBER OF THIS USER. SINCE POBOX: MAY NOW BE    
; ANY STRUCTURE ON A CLUSTER, AND INDEED MAY EVEN BE DEFINED AS A SEARCH LIST, E
; NEED TO GET THIS NUMBER AND SAVE IT . IT WILL BE USED TO PERFORM AN ACCES% OF
; THE USER'S POBOX: AND ALSO IN MAIL-WATCHING .
; 
; 	CALL GETPOB
; 
;
;      	RETURN +1      THE USER IS NOT LOGGED IN
;
; 	RETURN +2      A FAILURE IN THIS ROUTINE WILL RETURN A ZERO IN 
;                        POBXNO
; 	      
; 		       SUCCESS MEANS THE USER'S POBOX: DIRECTORY NUMBER 
;                        WILL BE IN POBXNO
 

GETPOB: SKIPN  CUSRNO		; Logged in?
	RET			; No, don't bother with this
	STKVAR <<TMPSTR,15>,SAVPTR> ;[4422] Temp storage
	MOVEI A,.LNSSY		;[4401] Do system wide translation
	HRROI B,[ASCIZ /POBOX/] ;[4401] of this logical name
	MOVE C,CSBUFP		;[4401] Get temp byte pointer
	MOVEM C,SAVPTR		;[4401] Hold onto this
	LNMST%			;[4401] Translate
	IFJER.			;[4401] If no such logical,
	  TYPE <?Failed to translate POBOX: logical name.
>
	  JRST GETPBE		;[4401] Error - pass directory number of zero
	ENDIF.			;[4401]
GETPB1:	SKIPN C,SAVPTR		;[4401] Still a pointer there?
	JRST GETPBE		;[4401] No, out of structures and couldn't find directory
	MOVEI A,TMPSTR		;[4401] STR:<DIRECTORY> goes here
	HRLI A,(POINT 7,)	;[4401] Make real byte pointer
	DO.			;[4401] Now make STR:<DIRECTORY>
	  ILDB B,C		;[4401] Get a character from POBOX:
	  CAIE B,.CHNUL		;[4401] End of logical name list?
	  IFSKP.		;[4401] If so,
	    SETZ C,		;[4401] No more byte pointer
	    EXIT.		;[4401] And now check this final structure
	  ENDIF.		;[4401]
	  CAIN B,","		;[4401] Have we obtained a full STR:?
	  EXIT.			;[4401] Yes, now put in directory
	  IDPB B,A		;[4401] Stick byte in here
	  JRST TOP.		;[4401] And continue with STR:
	OD.			;[4401]
	MOVEM C,SAVPTR		;[4401] Remember where we were in str list
	MOVEI B,"<"		;[4401] Get directory delimiter
	IDPB B,A		;[4401] Drop it in
	MOVE B,CUSRNO		;[4401] Get user number
	DIRST%			;[4401] Translate directory (should work)
	 ERJMP GETPBE		;[4401] If not, that's life
	MOVEI B,">"		;[4401] Delimit STR:<DIRECTORY>
	IDPB B,A		;[4401] Stick it in
	MOVEI B,.CHNUL		;[4401] End string
	IDPB B,A		;[4401] By adding NULL
	MOVX A,<RC%EMO>		;[4401] Want exact match
	HRROI B,TMPSTR		;[4401] Get string we just made
	RCDIR%			;[4401] Find it
	 ERJMP GETPB1		;[4401] If it is not there, try next STR:
	TXNE A,RC%DIR		;[4401] Files only?
	JRST GETPB1		;[4401] Yes, try again
	TXNE A,RC%NOM		;[4401] Not even there?
	JRST GETPB1		;[4401] Not there, try another STR:
	RETSKP			;OK - got dir number in AC3
GETPBE: MOVEI C,0		;Problem getting dir number - set POBXNO=0
	RETSKP			;And return
;[3046]  ROUTINE TO ACCESS POBOX: ON BEHALF OF THIS USER. SINCE POBOX: MAY NOT BE    
;[3046]  PS:, IT IS NECESSARY TO FIND OUT WHAT STRUCTURE IS POBOX: AND GET ACCESS TO IT 
;[3046]  SO WE CAN DO A MAIL CHECK AND THE USER WILL BE NOTIFIED OF NEW MAIL ON LOG-IN.
;[3046]  IF POBOX: IS INDEED PS:, THE ACCES% DOES NOT NEED TO BE PERFORMED SINCE WE ARE 
;[3046]  ACCESSING THE USER'S LOG-IN DIRECTORY AT THIS POINT ANYWAY.
;[3046] 
;[3046] 	CALL ACSPOB
;[3046] 
;[3046]  	RETURN +1 ON FAILURE 
;[3046] 	       +2 ON SUCCESS - IF POBOX: IS PS:, NO ACCESS HAS BEEN DONE; IF IT
;[3046] 			       IS NOT PS:, THE ACCESS HAS BEEN PERFORMED
;
ACSPOB: STKVAR <ACSJOB,ACSPSW,ACSDIR> ;[3046] KEEP THESE IN ORDER FOR ACCES%!!!
	MOVE A,LIDNO		;[3046] GET LOGGED-IN DIRECTORY NUMBER
	CAMN A,POBXNO		;[3046] SAME AS POBOX:?
	RETSKP			;[3046] YES, NO NEED TO DO THE ACCES%
	MOVE A,CSBUFP		;[3046] GET POBOX: NAME STRING FOR ACCES%
	MOVE B,POBXNO		;[3046] USE THIS NUMBER TO GET THE STRING
	DIRST%			;[4401] Get POBOX: directory string
	 ERJMP R		;[4401] Should never happen
	SETZM ACSPSW		;[3046] NO PASSWORD
	MOVE C,CSBUFP		;[3046] WHERE NAME STRING IS
	MOVEM C,ACSDIR		;[3046] .ACDIR FOR ACCES%
	SETOM  ACSJOB           ;[3046] -1 MEANS THIS JOB - .ACJOB FOR ACCES%
	MOVX A,AC%OWN!.ACJOB+1	;[3046] OWNER ACCESS,,BLK LEGTH=3
	MOVEI B,ACSDIR		;[3046] ADDRESS OF BLOCK
	ACCES%			;[3046]
	 ERJMP R		;[3053] IN CASE ACCESS FAILS
	RETSKP			;[3046] POBOX: HAS BEEN SUCCESSFULLY ACCESSED
;BEGIN INPUTTING AND DECODING A COMMAND

CIN0::	CALL COMSET		;SET UP THINGS FOR COMMAND INPUT
	MOVE B,PCLDCO		;[PCL] Get default value for Original flag
				; (0 unless from DOCOMMAND ORIGINAL "...")
	MOVEM B,ORIFLG		;[PCL] Set Original flag (here because after
				; reparse address but before entry from
				; the "Original" command.
CIN1:	SETZM CIPF		;[PCL] No command in progress yet
	SETZM CEBPTR		;SAY COMMAND CAN BE SAVED (COMMAND EDITOR)
	SETOM CLF		;AND SAY AT COMMAND LEVEL (COMMAND EDITOR)
	MOVX B,WHLU+OPRU+ERRU	;PCL
	SKIPE PRVENF		;USER "ENABLE"D?
	CALL PRVCK		;CHECK FOR PRIVILEGED USER
	 JRST CIN9		;NOT PRIVILEGED, SO ^E NO POSSIBILITY
	MOVEI B,CM1DBE		;GET THE PRIVILEGED DESCRIPTOR BLOCKS
	JRST CIN7		;AND GO CHECK FOR PCL COMMANDS

CIN9:	MOVEI B,CM1DB		;GET THE UNPRIVILEGED DESCRIPTOR BLOCKS
	SKIPE CUSRNO		;LOGGED IN?
	JRST CIN7		;YES - GO CHECK PCL
	MOVX A,.SFXEC		;[4427] Function to get EXEC flags word
	TMON			;[4427] Get EXEC flags word from monitor
	 ERJMP CIN9OM		;[4427] If failed, its an old monitor
	TXNE B,XC%NLS		;[4427] Disallow not logged in SYSTAT?
	SKIPA B,[CM1YL]		;[4427] Yes, omit SYSTAT command
CIN9OM:	MOVEI B,CM1XL		;[4427] Use not-logged-in descriptor blocks
	JRST CIN10		;NO PCL UNTIL LOGGED IN (USES THE WRONG TABLE)
CIN7:	SKIPN PCFLDB		;IS PCL A FACTOR?
	SKIPE PCFLDP
	TRNA			;YES
	JRST CIN10		;NO
	MOVEI C,PCFLDB		;ASSUME USER TABLE
	SKIPN ORIFLG		;[PCL] DOES HE WANT THE ORIGINAL SET?
	SKIPN PCFLDB		;DOES HE HAVE HIS OWN?
	TRNA			;YES, OR NO
	JRST CIN8		;NO AND YES, USE HIS
	SKIPN PCFLDP		;IS THERE A PRESERVED TABLE?
	JRST CIN10		;NO, USE ORIGINAL ONE
	SKIPLE ORIFLG		;[PCL] USE PRESERVED COMMANDS?
	JRST CIN10		;NO, USE ORIGINAL ONE
	MOVEI C,PCFLDP		;USE PRESERVED COMMANDS
CIN8:	HRRZ B,(B)		;STEP PAST THE ORIGINAL TABLE
	HRRM B,(C)		;LINK AFTER PCL TABLE
	MOVEI B,(C)		;USE IT
CIN10:	CALL FLDSKP		;TRY TO READ COMMAND NAME
	 CMERRX <Unrecognized command>
	MOVEM B,COMAND		;SAVE COMMAND INFO
	LOAD D,FKFLAG,+@FRKDEF	;GET DEFAULT FLAGS
	MOVEM D,NAMFLG
	LDB D,[331100,,(C)]	;GOOD PARSE,  SEE WHAT GOT TYPED
	CAIN D,.CMFIL		;FILESPEC?
        JRST CIN3P              ;YES, GO RUN PROGRAM
	CAIN D,.CMTOK		;^E?
	JRST CINE		;YES
	JRST CIN2		;MUST BE COMMAND
;ROUTINE TO SET UP DEFAULTS FOR COMMAND INPUT
;PLEASE BE CAREFUL ABOUT CAUSING JSYS'S TO BE EXECUTED IN THIS ROUTINE,
;SINCE THIS ROUTINE GETS CALLED FOR EVERY COMMAND, AND WE WANT TO
;MINIMIZE NUMBER OF SYSTEM CALLS.  THANKS.

COMSET:	DEXTX <EXE>		;DEFAULT PROGRAM EXTENSION IS "EXE"
	HRROI A,[ASCIZ /SYS/]	;DEFAULT DEVICE FOR PROGRAMS IS SYS:
	MOVEM A,CJFNBK+.GJDEV
	MOVX A,GJ%OLD		;PROGRAM MUST EXIST
	MOVEM A,CJFNBK+.GJGEN
	RET

;PRIVILEGED, AND ^E TYPED

CINE:  	MOVEI B,[FLDDB. .CMKEY,,CTBL2]
	CALL FLDSKP
	 CMERRX			;NO SUCH ^E COMMAND
	MOVEM B,COMAND
;HAVE VALID FIRST KEYWORD IN COMMAND
;MAKE PRE-DISPATCH CHECKS


CIN2::	MOVE B,COMAND		;PCL GET WHICH COMMAND WE'RE DOING
	CALL GETKEY
	HLRO A,@COMAND		;GET NAME OF COMMAND IN CASE IT'S A FORK
	MOVEM A,PNAMP		;SAVE IT FOR ROUTINE THAT BUILD RESCAN STRING
	MOVE A,COMAND		;GET WHICH COMMAND WE'RE DOING
	HLRZ B,KEPNMS		;SEE HOW MANY FORKS IN FORK TABLE
	ADDI B,KEPNMS		;GET HIGHEST TABLE ADDRESS POSSIBLE
	CAIL A,KEPNMS+1		;IS OUR COMMAND IN RANGE OF FORK TABLE?
	CAMLE A,B		;LARGE ENOUGH.  IS IT SMALL ENOUGH?
	CAIA			;TOO SMALL OR TOO LARGE.
	JRST [	CALL CIN3D	;GET RESCAN LINE AND CONFIRMATION
		MOVEI A,FRKNMS	;SAVED FORK, FIND WHERE IT IS IN FORK TABLE
		MOVE B,COMAND	;GET POINTER TO NAME ("FIELD" PUT PTR IN COMAND)
		TBLUK		;GET TABLE ADDRESS
		MOVEM A,PTBLP	;SAVE TABLE ADDRESS
		JRST CINFRK]	;JOIN OTHER CODE
	MOVE P4,P3		;1ST KW'S VALUE WD STAYS IN P4.
	SKIPE CUSRNO		;LOGGED IN?
	JRST CIN2A		;YES - SKIP THIS
	TXNN P4,NOLG		;NO - IS THIS COMMAND ALLOWED?
	ERROR <LOGIN please>	;NO - IT'S AN ERROR
CIN2A:	MOVE B,P3		;FOUND PRIVILEGED COMMAND, MAKE SURE PRIVILEGES
	CALL PRVCK
	 ERROR <Insufficient privileges>
	CALL (P4)		;DISPATCH WITH PUSHJ,
				;CAN RETURN WITH POPJ
				;OR JRST CMDIN2,3,4.
	JRST CMDIN4		;WHERE MOST COMMANDS SHOULD RETURN.

;RUN PROGRAM ENTRY FOR PRARG.

DOCC2::	PRGSTG			;ALLOCATE STORAGE
	CALL TRYGTJ		;GET JFN ON FILESPEC
	 CMERRX <Can't run program>
	MOVEM A,PJFN		;REMEMBER JFN OF PROGRAM
	JRST RSUBS4		;GO RUN PROGRAM
;FIRST KEYWORD IS NOT A COMMAND NAME,
; SEE IF IT'S A SUBSYSTEM NAME

CIN3P:	CALL SPNAME		;SET UP PROGRAM NAME
	CALL CIN3D		;GET REST OF LINE
	MOVEI A,FRKNMS		;POINT TO TABLE OF KNOWN FORK NAMES
	MOVE B,PNAMP		;GET POINTER TO CURRENT PROGRAM NAME
	TBLUK			;SEE IF NAME IS IN TABLE
	TXNE B,TL%EXM		;EXACT MATCH?
	JRST [	HRRZ A,(A)	;YES, GET ADDRESS OF FORK BLOCK
		LOAD A,FKFLAG,(A) ;GET FLAGS FOR THIS FORK
		MOVEM A,NAMFLG	;REMEMBER THEM
		JRST .+1]
	MOVE A,NAMFLG		;GET FLAGS FOR THIS PROGRAM
	TXNE A,FN%EPH		;RUN THIS AS AN EPHEMERON?
	JRST EPH		;YES
	TXNE A,FN%NEF		;NEVER RUN THIS AS AN EPHEMERON?
	JRST RSUBS4		;YES
	MOVE A,PJFN
	DVCHR			;GET DEVICE CHARACTERISTICS
	TLNE A,177777		;IS IT A DISK?
	 JRST RSUBS4		;NO - GO ON
	MOVE A,PJFN
	MOVE B,[1,,.FBCTL]	;GET FILE FLAGS
	MOVEI C,C		;INTO C
	CALL $GTFDB
	 JRST CERR
	LDB C,[POINTR C,FB%FCF]
	CAIE C,.FBEPH		;EPHEMERAL?
	 JRST RSUBS4		;NO - GO ON
EPH:	MOVEI Q1,ETTYMD		;SET TTY MODES
	CALL LTTYMD
	MOVE A,PJFN		;PASS ON JFN
	JRST REPH		;GO RUN EPHEMERAL
;SPNAME is used to set up the program name cell.
;
;Accepts:	B/	jfn

SPNAME:	MOVEM B,PJFN		;REMEMBER JFN
	MOVEI A,EXTSIZ		;GET ROOM FOR FILENAME
	CALL GETBUF		;GET BUFFER FOR IT
	HRRO A,A		;MAKE POINTER TO THE SPACE
	MOVEM A,PNAMP		;REMEMBER POINTER TO PROGRAM NAME
	HRLM A,PRGCEL		;SET UP POINTER TO PROG NAME FOR ^T
	MOVE B,PJFN		;GET PROGRAM NAME
	MOVX C,1B8		;WE WANT JUST THE NAME FIELD
	JFNS			;GET FILE NAME
	MOVEI B,PRGCEL
	MOVEM B,COMAND
	RET
;ENTER HERE FROM EDIT/CREATE COMMAND

CIN3::	CALL SPNAME		;SET UP PROGRAM NAME
	MOVEI A,FRKNMS		;POINT TO LIST OF KNOWN FORKS
	MOVE B,PNAMP		;POINT TO NAME OF EDITOR
	TBLUK			;LOOK UP EDITOR IN KNOWN NAMES
	TXNN B,TL%EXM		;IS EDITOR IN LIST OF KNOWN FORKS?
	JRST CINXED		;NO, SO IT WILL BE LOADED AND STARTED FOR SURE
	HRRZ C,(A)		;YES, GET ADDRESS OF FORK BLOCK
	LOAD D,FKHAN,(C)	;GET FORK HANDLE OF EDITOR
	JUMPE D,CINXED		;IF NONE, GO START EDITOR
	MOVX C,FK%RUN		;FORCE EDITOR TO ALWAYS BE "START"ED ON "EDIT"
	ANDCAM C,SLFTAB(D)	;COMMAND, SO FRESH COPY OF EDITED FILE IS GUARANTEED.
CINXED:	MOVEM A,PTBLP		;SAVE TABLE POINTER
	TXNN B,TL%EXM		;EXACT MATCH OF NAME?
	JRST RSUBS4		;NO, GO RUN PROGRAM
CINFRK:	HRRZ B,(A)		;GET ADDRESS OF FORK BLOCK
	LOAD A,FKHAN,(B)	;GET FORK HANDLE
	CAIN A,0		;DOES THIS FORK EXIST?
	JRST RSUBS4		;NO
	MOVE B,PTBLP		;GET TABLE ADDRESS IN CASE FORK IS KEPT
	MOVE A,SLFTAB(A)	;GET FLAGS FOR THIS FORK
	TXNE A,FK%KPT		;IS FORK KEPT ALREADY?
	JRST RSTFK		;YES, SO GO RESTART IT
	JRST RSUBS4
CIN3D:	LINEX <Data line to be sent to program>
	 CMERRX
	MOVE B,CMABP		;GET POINTER TO BEGINNING OF END OF LINE
	ILDB D,B		;GET FIRST CHARACTER OF REST OF LINE
	MOVE A,CSBUFP		;POINTER TO COMMAND LINE
	MOVE B,PNAMP		;GET POINTER TO PROGRAM NAME
	MOVEI C,0		;END ON NULL
	SOUT			;START COMMAND LINE WITH PROGRAM NAME
	MOVEI B,40		;SPACE TO SEPARATE FILENAME FROM REST OF LINE
	CAIE D,0		;IS THERE ANY MORE TO THE LINE?
	 TLOA Z,F3		;YES - LIGHT FLAG
	  TLZA Z,F3		;NO - CLEAR FLAG
	   BOUT			; AND PUT THE SPACE IN
	MOVE B,CMABP		;GET POINTER TO ATOM BUFFER (REST OF LINE)
	SOUT			;COPY REST OF LINE FOR RSCAN
	HRROI B,[BYTE (7)12,0]	;LINEFEED TO END RSCAN BUFFER
	SOUT			;FINISH LINE WITH LF
	CONFIRM			;GET CONFIRMATION AFTER DATA LINE
	MOVE A,CSBUFP		;GET RESCAN POINTER
	CALL BUFFS		;SAVE THE STRING
	MOVEM A,RSPTR		;SET UP FINAL ONE, NOW THAT COMMAND IS CONFIRMED
	RET			;RETURN

RSUBS4:	MOVEI Q1,ETTYMD		;MAKE SURE NORMAL TTY MODE RESTORED
	CALL LTTYMD
	CALL ERESET		;PREPARE TO LOAD AND RUN PGM
	MOVE A,PJFN		;SAY WHICH PROGRAM TO GET
	SETO C,			;FORCE OVERLAY
	CALL $GET0		;GET PROGRAM
	JRST ..STRT		;START PROGRAM
;EXAMINE (MEMORY LOCATION) N

BLEN==20			;ENOUGH FOR ASCIZ STRINGS

.EXAMI::STKVAR <<FANCBF,BLEN>,<OCTBF,BLEN>>
	NOISE <MEMORY LOCATION>
	SETZ A,			;SAY EXAMINE
	CALL EXDPDF		;SET DEFAULT ADDRESS, IF ANY
	ADDRX <Address to examine>
	 ERROR <Couldn't parse address>
	CONFIRM
	MOVE A,B
	TLNE A,777740		;THIS COMMAND ONLY ALLOWS 32 SECTIONS
	ERROR <Memory address not between 0 and 37,,777777>
	CALL MAPPF		;MAP THAT PAGE & GET ACCESS INFO
	 JRST CJERRE		;FAILED-- TYPE JSYS ERROR
	TXNN B,PA%PEX
	ERROR <No such page>
	TXNN B,PA%RD
	ERROR <Can't read that page>
	MOVE B,FORK		;CURRENT FORK
	SKIPE C,SLFTAB(B)	;EXISTS?
	 JRST [	MOVX D,FK%EDF
		ANDCAM D,SLFTAB(B) ;INDICATE LAST WAS EXAMINE
		MOVEM A,.FKEDL(C) ;SAVE THIS LOC
		JRST .+1]
	MOVE C,A		;FETCH CONTENTS
	ANDI C,777
	MOVE C,PAGEN(C)		;RH
	HRROI D,FANCBF		;FIRST POINT AT FANCY BUFFER
	MOVEM D,COJFN
	ETYPE<%1Y/ %3/>		;CREATE FANCY VERSION
	MOVEI D,.CHNUL		;MAKE SURE NULL AFTER STRING
	IDPB D,COJFN
	HRROI D,OCTBF		;NOW CREATE OCTAL VERSION
	MOVEM D,COJFN
	ETYPE <%1O/ %3#>
	MOVEI D,.CHNUL
	IDPB D,COJFN		;FINISH WITH NULL
	CALL FIXIO		;REVERT TO STANDARD IO
	UTYPE FANCBF		;FIRST, DISPLAY THE FANCY VERSION
	HRROI B,OCTBF		;COMPARE IT WITH OCTAL VERSION
	HRROI A,FANCBF
	STCMP
	JUMPN A,[HRROI A,OCTBF ;SHOW OCTAL VERSION IF DIFFERENT
		 ETYPE <   (%1M)>
		 JRST .+1]
	ETYPE <%_>		;FINISH LINE
	RET
;DEPOSIT (MEMORY LOCATION) N (CONTENTS) M

.DEPOS::STKVAR <DEADD,DECON>
	NOISE <MEMORY LOCATION>
	SETO A,			;INDICATE DEPOSIT
	CALL EXDPDF		;SET DEFAULT ADDRESS
	ADDRX <Address in which to deposit>
	 ERROR <Couldn't parse address>
	TLNE B,777740		;THIS COMMAND ONLY ALLOWS 32 SECTIONS
	ERROR <Memory address not between 0 and 37,,777777>
	MOVEM B,DEADD		;SAVE ADDRESS
	HRROI A,[ASCIZ /contents/] ;GUIDE WORD
	CALL RINST		;GET INSTRUCTION TO BE DEPOSITED
	MOVEM A,DECON		;SAVE UNEVALUATED DATA FOR DEPOSITING
	CONFIRM
	SKIPG FORK		;FORK EXISTS?
	CALL ECFORK		;NO, CREATE ONE
	MOVE A,FORK		;GET FORK INDEX
	MOVE Q1,SLFTAB(A)	;GET ADDRESS OF FORK DATA
	SKIPG FORK		;FORK EXISTS?
	SETZM .FKPTM+TTWPNM(Q1) ;CLEAR FORK PROGRAM NAME
	MOVE A,DECON		;GET UNEVALUATED CONTENTS
	CALL PINST		;EVALUATE IT, NOW THAT WE HAVE A FORK
	 ERROR <Can't evaluate contents>
	MOVEM A,DECON		;REMEMBER EVALUATED CONTENTS
	MOVE A,DEADD		;GET LOCATION BEING WRITTEN INTO
	CALL MAPPF		;MAP THAT PAGE AND GET ACCESS INFO
	 JRST CJERRE		;FAILED-- TYPE JSYS ERROR
	TXNN B,PA%WT
	JRST [	TXNN B,PA%CPY	;COPY-ON-WRITE BIT
		ERROR <Can't write that page>
		TYPE < [Shared page made private]>
		JRST .+1]
	TXNN B,PA%PEX
	JRST [	TYPE < [New]>	;ADVISORY MESSAGE
		JRST .+1]
	MOVE B,DEADD		;GET LOCATION
	MOVE A,FORK
	SKIPE C,SLFTAB(A)	;FORK EXISTS?
	 JRST [	MOVX D,FK%EDF
		IORM D,SLFTAB(A) ;INDICATE LAST WAS DEPOSIT
		MOVEM B,.FKEDL(C) ;SAVE THIS LOC
		JRST .+1]
	MOVE A,DECON		;GET DATA
;STORE A AT B IN FORK. ASSUME WE STILL HAVE THE PAGE.

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

;EXECUTION OF DEPOSIT COMMAND...
;IF ADDRESS < 20, SET FORK AC'S. NON-AC PAGES HANDLE THEMSELVES.

	TDNE C,[777776,,777760]	;ACS ARE ALSO IN SECTION 1
	JRST CMDIN4
	MOVE A,FORK
	MOVEI B,PAGEN
	SFACS
	 ERJMP CJERRE		;FAILED-- TYPE JSYS ERROR
	JRST CMDIN4
;EXDPDF - SET DEFAULT ADDRESS FOR EXAMINE OR DEPOSIT
;	A/	0 FOR EXAMINE, -1 FOR DEPOSIT

EXDPDF:	STKVAR <EAM>
	SKIPE C,FORK		;FORK HANDLE
	 SKIPN C,SLFTAB(C)	;KNOWN?
	  RET			;NO FORK - DO NOT SET DEFAULT
	SKIPGE B,.FKEDL(C)	;ANY PREVIOUS E/D?
	 RET			;NO - DON'T SET DEFAULT
	XOR C,A			;MASK FLAG
	TXNN C,FK%EDF		;SAME AS LAST?
	 ADDI B,1		;YES - INCR LOC
	MOVEM B,EAM
	MOVEI A,3		;ENOUGH ROOM FOR NUMBER
	CALL GETBUF		;GET BUFFER ON WORD BOUNDARY
	MOVE D,A		;REMEMBER WHERE BUFFER STARTS
	HRLI A,440700		;MAKE BYTE POINTER
	MOVX C,^D8		;GET OLD VALUE
	MOVE B,EAM

;WOULD LIKE TO SET DEFAULT STRING TO M,,N INSTEAD OF LARGE OCTAL NUMBER
;THIS REQUIRES M,,N TO BE AN ATOM FOR SOME TYPE OF COMND JSYS FIELD

REPEAT 0,<
	TLNN B,-1		;ANY SIGNIFICANCE IN LEFT HALF?
	JRST EXDPRH		;NO--JUST DO RIGHT HALF
	PUSH P,B		;SAVE NUMBER FOR RIGHT HALF LATER
	HLRZS B			;SET TO PRINT LEFT HALF NOW
	NOUT			;IN OCTAL
	 JRST [	POP P,(P)	;CAN'T--DON'T DEFAULT
		RET]
	MOVEI B,","		;SEPARATE HALVES WITH ",,"
	IDPB B,A
	IDPB B,A
	POP P,B			;GET BACK NUMBER
EXDPRH:	HRRZS B			;PRINT JUST RIGHT HALF NOW
>				;END OF REPEAT 0

	NOUT			;IN OCTAL
	 RET			;CAN'T-- DON'T DEFAULT
	UDEF @D			;SET DEFAULT TO TEXT NUMBER
	RET			;RETURN FROM EXDPDF
;PCL Original Exec command

.ORIGI::NOISE (EXEC COMMAND)
	SETOM ORIFLG		;[PCL] NEXT COMMAND USES ORIGINAL TABLE
	JRST CIN1		;PARSE AS IF REGULAR COMMAND
;SYSTAT

;BITS IN Q1 USED FOR SYSTAT OUTPUT CONTROL

SYSIND==1

DEFINE SYSBIT(A)
<	IRP A,<
IFE SYSIND,<PRINTX SYSTAT CONTROL BITS EXHAUSTED
>
SY%'A==SYSIND
SYSIND==SYSIND+SYSIND
>>

SYSBIT <IME,ALL,CLS,HED,NHD,TTY,USR,SUB,TIM,CON,LIM,CJB,JOB,NJB,STA,NOP,4NH,NOD,CT> ;[4412]

SYSDEF==SY%IME!SY%TTY!SY%USR!SY%SUB!SY%4NH	;DEFAULT LISTING

;[7.1076] Note that the SY%NOD bit is not included in this mask. It is only
;turned on when the user explicitly wants a node included in the SYSTAT
SYSALL==SY%ALL!SY%CLS!SY%TTY!SY%USR!SY%SUB!SY%TIM!SY%CON!SY%LIM!SY%CJB!SY%STA!SY%4NH!SY%CT ;[4412] All (everything)

;INDICES FOR STACK ARGS

SY$JOB==0	;JOB NUMBER
SY$TTY==1	;LINE NUMBER
SY$DIR==2	;DIRNUM
SY$USR==3	;USER NUMBER
SY$PRG==4	;PROGRAM NAME
SY$FLD==5	;[7.1137] Field was typed or WILD username + SY%NOD

JIBLN==.JICT+1			;[4412] Size of job info block
SYCLN==10			;SKED% BLOCK SIZE
.SISTA::SAVEAC <Q1,Q2,Q3,P1,P2,P3,P4,P5> ;[7.1076] Used and saved
	TRVAR <SYSJFN,JNX,<SYCLB,SYCLN>,<.JIBAS,JIBLN>,<.NTBAS,.NWNU1+1>,SFRAME,<SYSTAK,SYSTAL>,SYSDIR,SYSTNM,SISTAS,SISLDS,SISCDS,SISTAN,<HSTNAM,10>,HSTDEL,HDRPOS,NODMSK,CURNOD,CURNDN,STKPTR,FLDPTR,SYJOBM,CLSMSK,SUBMSK> ;[4413]
	SETZM SUBMSK		;[4413] Say not in subcommand mode yet
	SETZM CLSMSK		;[7.1140] Clear class mask to start with
	SETZM SYJOBM		;[7.1139] SYSJOB mask
	SETZM WLDPAG		;[7.1137] Clear this to start
	MOVE A,[WLDPAG,,WLDPAG+1] ;[7.1137] Prepare to clear page
	BLT A,WLDPAG+777	;[7.1137] No zero out page
	SETZM FLDPTR		;[7.1137] Say we have bananas at the moment
				;[7.1137] FLDPTR is used to index into WLDPAG.
				;[7.1137] WLDPAG has the strings for non-local users
	SETZM CURNOD		;[7.1076] Clear this (byte pointer to node name)
	SETZM CURNDN		;[7.1076] Reset current node number
	SETZM NODMSK		;[7.1076] Init CI node mask
	SETZM SYSJFN		;NO SPECIAL OUTPUT JFN YET
	SETOM TYPING		;SAY TYPEOUT IN PROGRESS
	SETZM HDRPOS		;[7.1008] CLEAR ORIGIN HEADER COLUMN WORD 
	MOVE Q1,[SYSDEF]
	HRLI A,-SYSTAL
	HRRI A,SYSTAK		;MAKE STACK POINTER
	MOVEM A,SFRAME		;SAVE ARG START
	TLZ Z,F3

SYSTK1:	MOVEI B,[
		FLDBK. .CMKEY,,$SESTA,,,DOTBRK,[
		FLDDB. .CMUSR,,CM%DWC,,,[
		FLDDB. .CMDIR,,CM%DWC,,,[	;KEEP AFTER USER NAME TO ALLOW RECOGNITION ON USER NAME
		FLDDB. .CMNUM,CM%SDH,5+5,<Decimal job number>,,[
		FLDDB. .CMCMA,,,,,[
		FLDDB. .CMCFM,,,,,[
		FLDBK. .CMFLD,CM%SDH,,,,[
		BRMSK. (FLDB0.,FLDB1.,FLDB2.,FLDB3.,<*%-_$.>,)]]]]]]]] ;[7.1137]
	CALL FLDSKP		;GET SOME INPUT
	 JRST SYSNX		;NO
	LDB D,[331100,,(C)]	;GET FUNCTION CODE
	CAIN D,.CMKEY		;KEYWORD?
	JRST SYSKEY		;YES
	CAIN D,.CMUSR		;USER NAME?
	JRST SYSTU		;YES
	CAIN D,.CMDIR		;DIRECTORY NAME?
	JRST SYSTD		;YES
	CAIN D,.CMNUM		;DECIMAL JOB NUMBER?
	JRST SYSTJ		;YES
	CAIN D,.CMCMA		;COMMA?
	JRST SYSSUB		;YES, MAYBE SUBCOMMANDS COMING
	CAIN D,.CMCFM		;END OF LINE?
	JRST SYSTS0		;YES GO EXECUTE COMMAND
	CAIN D,.CMFLD		;[7.1137] Field (ala cluster SYSTAT username)?
	JRST SYSFLD		;[7.1137] Yes, parse field
	CALL SCREWUP		;SHOULD NEVER GET HERE
;HERE FOR "SYS ."

SYSTK.:	MOVEI A,SY$JOB
	CALL SSTACK		;PUT FLAVOR ON STACK
	MOVE A,JOBNO
	CALL SSTACK		;PUT ITEM ON STACK
	TXO Q1,SY%IME		;"SYS NO . ." = "SYS ."
	CALLRET .SYSEL		;EXIT THROUGH CODE THAT SAYS NOT TO PRINT HEADER

;KEYWORD TYPED AFTER SYSTAT

SYSKEY:	CALL GETKEY		;CHANGE TABLE ADDRESS TO DISPATCH DATA
	CALL (P3)
	JRST SYSTK1

;COMMA TYPED..

SYSSUB:	CRRX <Carriage return to enter subcommands, or another SYSTAT argument>
	 JRST SYSTK1		;NO CR AFTER COMMA, NOT TIME FOR SUBCOMMANDS
	JRST SYSUB1		;COMMA CR, SO GO GET SUBCOMMANDS
;HERE ON AN ERROR. "SYS:" IS A SPECIAL CASE BECAUSE IT LOOKS LIKE THE START
;OF A FILESPEC. IF THE SPEC IS ILLEGAL CONTROL GETS TO SYSTAT. BUT THE
;"INVALID SYSTAT ARGUMENT" MESSAGE IS PRETTY HOSTILE, SO THE KLUGE BELOW
;TELLS THE USER IT'S A FILESPEC ERROR, WHICH IT PROBABLY IS.

SYSNX:	MOVE A,CBUF		;GET WHAT WAS TYPED
	TRZ A,377		;KEEP ONLY THE FIRST FOUR CHARACTERS
	CAMN A,[ASCIZ /SYS:/]	;SPECIAL MESSAGE IF IT'S A BOGUS DEVICE NAME
	ERROR <Unrecognized command - Bad filespecs - "SYS:">
	CMERRX <Invalid SYSTAT argument>

SYSUB1:	SUBCOM $SYSTB
SYSTS0:	TXNN Q1,SY%CLS		;[7.1076] User asking for class stuff?
	IFSKP.			;[7.1076] If so,
	  TXNE Q1,SY%NOD	;[7.1076] Nodes specified?
	  IFSKP.		;[7.1076] If not,
	    CALL CLSON		;YES, MAKE SURE CLASS SCHEDULING IS ON
	     CAIA		;NO!
	    JRST SYSSS		;[7.1076] Yes
	    TXNN Q1,SY%ALL	;DON'T COMPLAIN IF HE SAID "ALL"
	    ETYPE <%%Class scheduling is off%_>
	    TXZ Q1,SY%CLS	;PRETEND HE NEVER ASKED FOR CLASS STUFF
	  ELSE.			;[7.1100] If considering remote jobs,
	    CALL CHCLAS		;[7.1100] (/) See if class scheduling is on anywhere
	    ANNSK.		;[7.1100] If no one is running class scheduling,
	      TXNN Q1,SY%ALL	;[7.1131] Don't complain if he said "ALL"
	      ETYPE <%%Class scheduling is off on specified systems%_>
	      TXZ Q1,SY%CLS	;[7.1100] We won't display class scheduling items
	      TXO Q1,SY%NOD	;[7.1100] Turn node back on
	  ENDIF.
	ENDIF.
SYSSS:	SKIPN A,SYSJFN		;SPECIAL OUTPUT JFN?
	JRST SYSNFL		;NO!
	LDF B,OF%WR		;WRITE
	CALL $OPEN7		;OPEN, 7 BIT BYTES, MODE 0.
	MOVE A,SYSJFN		;NOW REDIRECT COJFN
	MOVEM A,COJFN		;(MUST WAIT UNTIL AFTER $OPEN7 SINCE $IOCHK WOULD CIRCUMVENT THE OPENF!)
SYSNFL:	TXNN	Q1,SY%JOB!SY%NJB ;IF NEITHER JOB NOR NON-JOB NOR DEBUG
	TXO	Q1,SY%JOB!SY%NJB ;THEN DEFAULT TO JOB AND NON-JOB
	TXNN	Q1,SY%HED!SY%NHD ;IF HEADER NOT DECIDED,
	TXO	Q1,SY%HED	;DEFAULT TO HEADER
	TXNE Q1,SY%NOD		;[7.1089] No reason for this unless node stuff
	CALL CSHJOB		;[7.1089] (/) Now get job cache setup and
				;[7.1089] Setup INFCIN table for NODPRT
	TXNE	Q1,SY%NJB
	CALL SYPART		;TYPE SYSTEM PART
	TXNE	Q1,SY%JOB
	CALL JBPART		;TYPE JOB LINES
	RET
SYPART:	SAVEAC <Q1>		;DON'T CLOBBER Q1 (READT DOES SO)
	PRINT " "
	GTAD
	MOVE B,A
	CAMN B,[-1]
	MOVSI B,1		;DO SAME AS %A IF NO DATE
	MOVE A,COJFN
	MOVX C,OT%DAY!OT%SCL
	ODTIM			;CAN'T USE %D BECAUSE WE WANT DAY OF WEEK
	TXNE Q1,SY%NOD		;[7.1076] Node stuff?
	CALLRET NODPRT		;[7.1076] If so, all bets are off
	ETYPE <  Up %K%%_ %I Jobs   Load av >
	HRROI A,-1		;WE WANT LOADS FOR CURRENT JOB'S CLASS
	CALL GLOADS		;GET LOAD AVERAGES
	CAIL A,0		;CLASS SCHEDULING ON?
	ETYPE <(class %1Q) >
	ETYPE <%2Q %3Q %4Q%%_%%_>
	MOVEI A,.SFOPR		;READ OPR STATUS
	TMON
	CAIN B,0
	ETYPE < No operator in attendance%_%%_>
	SETZ D,
	GTB .DBUGS		;READ DBUGSW
	JUMPE A,SYDBG1		;0=NORMAL, DON'T PRINT
	HRROI B,[ASCIZ/ System is stand-alone/]	;ASSUME THIS
	CAIN A,1		;1=REMEDIAL
	HRROI B,[ASCIZ / System is remedial/]
	ETYPE <%2M%%_%%_>
SYDBG1:	CALL SYSDWN		;PRINT DOWN-TIME INFO
	RET

SYSDWN::MOVEI D,0		;GET ITEM 0 FROM DWNTIM TABLE
	GTB .DWNTI
	JUMPE A,R		;DO NOTHING IF NOT SET
	CAMN A,[-1]		;IS SYSTEM SHUTDOWN
	JRST [	ETYPE < System is shut down>
		JRST SYSDW1]	;YES, TYPE MESSAGE
	ETYPE < System shutdown scheduled for %1D %E>
SYSDW1:	MOVEI D,1		;GET ITEM 1
	GTB .DWNTI
	CAIE A,0
	ETYPE <,%_ Up again at %1D %E>
	ETYPE <%_%%_>
	RET
;[7.1076]
;Routine to handle the header when SYS NODE was given. Loop over
;each node in NODMSK and do header for them.
;
; Called with:
;	no specific arguments
;	CALL NODPRT
;
; Returns:
;	+1 - Always, with stuff output

NODPRT:	SAVEAC <P1,P2>		;We are going to use these at our leisure
	STKVAR <WRKNOD,TMPNOD>	;[7.1100] Temp storage
	ETYPE <%_>		;Start a new line
	SETZ P1,		;Our loop counter
	HLRZ P2,CFGBLK		;[7.1131] Our loop fence
	DO.
	  AOS P1		;Do the first CI node
	  HLRZ A,CFGNOD(P1)	;Get me a CI node number
	  MOVE C,BITS(A)	;Get its bit setting
	  TDNN C,NODMSK		;Is this node in our mask?
	  JRST NODPR1		;No, next node
	  MOVEM C,TMPNOD	;[7.1100] Save bit setting
	  MOVE B,INFCIN		;Get count
	  DO.			;See if this node is doing INFO%
	    SOSG B		;Done checking?
	    IFSKP.		;Nope,
	      CAMN A,INFCIN(B)	;Is this the node we want?
	      EXIT.		;If so, good, he is doing INFO%
	      JRST TOP.		;Not done checking yet
	    ENDIF.
	    CALL NOINF		;[7.1100] (A/) Say not available for this node
	    MOVE C,TMPNOD	;[7.1100] Get node bit back
	    ANDCAM C,NODMSK	;Node is not supplying information for us
	    JRST NODPR1		;So ignore it and try others
	  ENDDO.
	  MOVEM A,WRKNOD	;Here's the node we are working on
	  MOVE A,CFGBLK(P1)	;Get the node name
	  PRINT " "		;Make first column a space
	  MOVEI B,6		;Make sure we do 6 characters
	  DO.			;Do the characters
	    ILDB C,A		;Get a character
	    ETYPE <%3\>		;Do a character
	    JUMPE C,ENDLP.	;Null? Yes, fill in remaining spaces
	    SOJG B,TOP.		;Keep doing characters
	  ENDDO.
	  SKIPG B		;More characters to do?
	  IFSKP.		;If so,
	    DO.			;Print them out
	      PRINT " "		;Here's a space
	      SOJG B,TOP.	;Do more
	    ENDDO.
	  ENDIF.
	  ETYPE < Up >		;Prepare user for uptime
	  MOVEI A,INFBLK	;Return uptime here
	  MOVE B,[.INTIM,,.INMIN] ;Here's function and length
	  MOVEM B,.INFUN(A)	;Save it
	  MOVE B,WRKNOD		;This is the CI node we are working on
	  MOVEM B,.INCID(A)	;Save in block
	  INFO%			;Get uptime
	   ERJMP CJERR		;Meaningful error just happened
	  MOVE B,.INAC2(A)	;Get our divisor
	  MOVE A,.INAC1(A)	;Now get up time
	  IDIV A,B		;Get HH:MM:SS
	  CALL TOUT		;(A/) Display it
	  MOVEI A,INFBLK	;Now find out X+Y jobs
	  MOVE B,[.INGTB,,INFLEN] ;Here's the function
	  MOVEM B,.INFUN(A)	;Stash it
	  MOVE B,[57,,.SYSTA]	;Now get the GETAB% word
	  MOVEM B,.INAC1(A)	;Here ya go
	  INFO%			;Get me the jobs
	   ERJMP CJERR		;Ungowa
	  HRRZ B,.INAC1(A)	;Get count of user jobs
	  HLRZ C,.INAC1(A)	;Get count of operator jobs
	  ETYPE < %2Q+%3Q Jobs    Load av > ;Do job count
	  MOVEI A,INFBLK	;Now get load averages
	  MOVE B,[.INGTB,,INFLEN] ;GETAB% is our JSYS
	  MOVEM B,.INFUN(A)	;Make sure the JSYS knows
	  MOVE B,[14,,.SYSTA]	;1 minute load average
	  MOVEM B,.INAC1(A)	;Save in argument block
	  INFO%			;Get that load av
	   ERJMP CJERR		;See you in your dreams
	  MOVE B,.INAC1(A)	;Get the load average
	  ETYPE <%2= >		;Show it
	  MOVE B,[15,,.SYSTA]	;5 minute load average
	  MOVEM B,.INAC1(A)	;Put in argument block
	  INFO%			;Get the load av
	   ERJMP CJERR		;Hrumph
	  MOVE B,.INAC1(A)	;Get the 5 min load av
	  ETYPE <%2= >		;Show it
	  MOVE B,[16,,.SYSTA]	;Get 15 minute load ave
	  MOVEM B,.INAC1(A)	;Tell JSYS
	  INFO%			;Do it
	   ERJMP CJERR		;Flunked
	  MOVE B,.INAC1(A)	;Get it for display
	  ETYPE <%2=%%_>	;Show it and do CRLF
	  MOVE B,[.INTMN,,INFLEN] ;Get operator attendance status
	  MOVEM B,.INFUN(A)	;Do remote TMON%
	  MOVEI B,.SFOPR	;Here's our TMON% function
	  MOVEM B,.INAC1(A)	;Give it to remote
	  INFO%			;Read opr status
	   ERJMP CJERR		;Take a trip to Garkland
	  SKIPN .INAC2(A)	;Operator there?
	  ETYPE <        No operator in attendance%_> ;Nope
	  MOVE B,[.INGTB,,INFLEN] ;Now we want the debug sw setting
	  MOVEM B,.INFUN(A)	;Save our new function
	  MOVEI B,.DBUGS	;Get DBUGSW
	  MOVEM B,.INAC1(A)	;For remote system to do for us
	  INFO%			;Get the setting
	   ERJMP CJERR
	  MOVE C,.INAC1(A)	;Get remote DBUGSW setting
	  JUMPE C,SYNODB	;0=Normal, don't print
	  HRROI B,[ASCIZ /        System is stand-alone/] ;Assume this
	  CAIN C,1		;1=Remedial
	  HRROI B,[ASCIZ /        System is remedial/]
	  ETYPE <%2M%%_>	;Display it
SYNODB:	  MOVEI B,.DWNTI	;Get downtime if there is downtime
	  MOVEM B,.INAC1(A)	;Make it remote
	  INFO%			;Get it
	   ERJMP CJERR		;Poof
	  SKIPN C,.INAC1(A)	;Get returned downtime
	  IFSKP.		;If downtime,
	    CAME C,[-1]		;See if really down
	    IFSKP.		;If so,
	      ETYPE <        System is shut down%_>
	      JRST NODPR1	;Go on
	    ENDIF.
	    ETYPE <        System shutdown scheduled for %3D %E>
	    MOVE B,[1,,.DWNTI]	;Find out when it is up again
	    MOVEM B,.INAC1(A)	;Here for JSYS
	    INFO%		;Get next up
	     ERJMP CJERR	;Wham
	    SKIPE C,.INAC1(A)	;Get next uptime
	    ETYPE <,%_        Up again at %3D %E>
	    ETYPE <%_>		;Neaten things up
	  ENDIF.
NODPR1:	  CAME P1,P2		;Have we done enough?
	  JRST TOP.		;No
	ENDDO.
	ETYPE <%_>		;Put in blank line
	RET			;And back to caller

	ENDSV.
;LOOP TO TYPE TSS JOB #, TTY #, USER  FOR EACH JOB

JBPART:	TLZ Z,F1+F2		;CLEAR LOCAL FLAGS
	MOVSI A,(RC%EMO)	;EXACT MATCH ONLY
	HRROI B,[ASCIZ /OPERATOR/]
	RCUSR			;GET OPERATOR'S USER NUMBER
	TLNE A,(RC%NOM+RC%AMB)	;GOT IT?
	 MOVEI C,-1		;IF NO SUCH, USE -1
	MOVEM C,SYSDIR
	TLZ Z,F3		;NO JOBS PRINTED YET
SYST9A:	SETO D,
	GTB .JOBRT		;GET # POSSIBLE JOBS
	HRLZ D,A		;XWD AOBJN COUNT, JOB #
	MOVE A,NODMSK		;[7.1139] Get node mask
	MOVEM A,SYJOBM		;[7.1139] And init the SYSJOB node mask

;TOP OF LOOP

SYST2:	MOVEM D,JNX		;REMEMBER JOB NUMBER COUNTER
	SETZM SISTAS		;CLEAR USER NAME STRING POINTER
	SETZM SISLDS
	SETZM SISCDS
	HRRZ A,JNX
	CALL NODCHK		;[7.1076] (A/) Check out job, see if remote
	 JRST SYST9		;[7.1076] Job not logged in as far as we can tell
	SETZM .JIBAS		;[4412] Prepare to clean house
	HRLI B,.JIBAS		;[4412] Prepare this for BLT
	HRRI B,1+.JIBAS		;[4412] Start with first word
	BLT B,JIBLN+.JIBAS	;[4412] Get out the vacuum cleaner
	HRRZI B,.JIBAS		;[4412] Store into correct block
	HRLI B,-JIBLN		;LENGTH OF JOB INFO BLOCK
	MOVEI C,0		;START WITH FIRST ENTRY
	TLNE Z,F4		;[7.1076] Is job remote?
	IFSKP.			;[7.1076] If not,
	  GETJI%		;[7.1076] Local stuff
	  IFJER.		;[7.1076] When it no worky
	    CAIE A,GTJIX4	;[7.1076] No such job?
	    JRST JERR		;[7.1076] No, complain
	    JRST SYST9		;[7.1076] Yes, skip it
	  ENDIF.		;[7.1076]
	ELSE.			;[7.1076] We want remote GETJI%
	  MOVEI C,INFBLK	;[7.1076] INFO% block
	  MOVE D,[.INGJI,,INFLEN] ;[7.1076] Function and length
	  MOVEM D,.INFUN(C)	;[7.1076] Save it
	  MOVE D,CURNDN		;[7.1076] Get CI node to work on
	  MOVEM D,.INCID(C)	;[7.1076] Here's the node
	  MOVEM A,.INAC1(C)	;[7.1076] Save job number
	  MOVEM B,.INAC2(C)	;[7.1076] And argument block
	  SETZM .INAC3(C)	;[7.1076] From the top
	  MOVEI A,INFBLK	;[7.1076] Put arg block in correct AC
	  INFO%			;[7.1076] Go get my some information
	   ERJMP CJERR		;[7.1076] We tried
	  TXZN A,IN%RER		;[7.1076] Remote error?
	  IFSKP.		;[7.1076] If so,
	    CAIE A,GTJIX4	;[7.1076] No such job?
	    JRST JERR		;[7.1076] No something real
	    JRST SYST9		;[7.1076] Yes, ignore skip it
	  ENDIF.		;[7.1076]
	ENDIF.			;[7.1076]
	SKIPGE .JIRT+.JIBAS	;NEG RUN TIME MEANS NO JOB
	JRST SYST9		;SO SKIP IT
	TXNN Q1,SY%IME		;DID USER SAY "NO ."?
	JRST [	HRRZ B,JNX	;YES, SEE WHICH JOB WE'RE ON
		CAME B,JOBNO	;IS IT OURSELF?
		JRST .+1	;NO, SO DISPLAY IT
		JRST SYST9]	;YES, SO SKIP IT
	MOVE A,.JIJNO+.JIBAS	;GET JOB NUMBER
	MOVEM A,.SAJOB+SYCLB	;TELL MONITOR WHICH JOB TO INVESTIGATE
	MOVEI A,SYCLN		;SET UP BLOCK SIZE FOR SKED%
	MOVEM A,.SACNT+SYCLB
	MOVEI A,.SKRJP		;SAY READ JOB PARAMETERS
	MOVEI B,SYCLB		;POINT TO BLOCK
	TXNN Q1,SY%CLS		;[7.1076] Don't bother doing SKED% if class not wanted
	IFSKP.			;[7.1076] If class wanted,
	  TLNE Z,F4		;[7.1076] And local job,
	  IFSKP.		;[7.1076] Then
	    SKED%		;[7.1076] Read the info
	    IFJER.		;[7.1076] If JSYS failed us,
	      CALL DGETER	;[7.1076] (/A) See why
	      CAIE A,ARGX15	;[7.1076] "Job is not logged in"?
	      CALL JERR		;[7.1076] No, unexpected error
	      JRST SYST9	;[7.1076] Yes, job logged out, skip it
	    ENDIF.		;[7.1076]
	  ENDIF.		;[7.1076]
	ENDIF.			;[7.1076]

;CHECK FOR PASS 1 OR 2

	SETO B,			;ASSUME NOT OPR
	MOVE A,SYSDIR
	CAMN A,.JIUNO+.JIBAS
	SETZ B,			;FLAG OPR
	TLNE Z,F2
	SETCA B,		;REVERSE TEST FOR PASS 2
	JUMPE B,SYST9		;PASS 1, SKIP OPR. PASS 2, DO OPR
;CHECK IF REQUESTED JOB

	HRLI A,-SYSTAL
	HRRI A,SYSTAK
	CAMN A,SFRAME		;ANY ARGS?
	JRST SYST2Y
SYST2A:	MOVE B,(A)		;GET INDEX INTO FUNCTION TABLE
	MOVE C,1(A)		;GET ARG
	XCT [	JRST SYST2D	;[7.1137] Job number was SSTACKed
		CAMN C,.JITNO+.JIBAS ;[7.1137] Line number was SSTACKed
		JRST SYST2C	;[7.1137] Directory name was SSTACKed
		JRST SYS2U	;[7.1137] User name was SSTACKed
		JRST SYSPRG	;[7.1137] Program name SSTACKed
		JRST SYSWLD](B)	;[7.1137] Handle non-ex user
	JRST SYST2Z		;MATCH
SYST2B:	ADD A,[2,,2]
	CAME A,SFRAME
	JRST SYST2A
	JRST SYST9		;NO MATCH

SYSPRG:	CAMN C,.JIPNM+.JIBAS	;CORRECT PROGRAM NAME?
	JRST SYST2Z		;YES
	JRST SYST2B

SYS2U:	TLNN Z,F4		;[7.1076] Is job of remote flavor?
	IFSKP.			;[7.1076] If so,
	  MOVEM A,STKPTR	;[7.1076] Save this
	  HRROI A,ATMBUF	;[7.1076] Put username in ATMBUF
	  MOVE B,C		;[7.1076] Here's the user number
	  DIRST%		;[7.1076] Get username
	  IFJER.		;[7.1076] If error,
	    MOVE A,STKPTR	;[7.1076] Restore this
	    JRST SYST2B		;[7.1076] If failure, then assume no match
	  ENDIF.
	  HRROI A,ATMBUF	;[7.1076] Check to see if the one we are looking for
	  HRROI B,UNAME		;[7.1076] Matches the current job
	  STCMP%		;[7.1076] Is this the user we want?
	   ERJMP SYST2B		;[7.1076] Must not be
	  EXCH A,STKPTR		;[7.1076] Swap these
	  SKIPE STKPTR		;[7.1076] Is this the user we are looking for?
	  JRST SYST2B		;[7.1076] No, bypass then
	  JRST SYST2Z		;[7.1076] Yes, display this job then
	ENDIF.			;[7.1076]
	MOVEI B,SISTAS		;CHECK AGAINST CURRENT USER NUMBER/STRING
	MOVE D,.JIUNO+.JIBAS
	CALL SYSDUC
	 JRST SYST2Z		;SUCCESS, TYPE OUT JOB
	 JRST SYST2B		;FAILURE, NO MATCH
SYST2C:	TLNN Z,F4		;[7.1076] Is job of remote flavor?
	IFSKP.			;[7.1076] If so,
	  MOVEM A,STKPTR	;[7.1076] Save this for now
	  HRROI A,ATMBUF	;[7.1076] Put username in ATMBUF
	  MOVE B,C		;[7.1076] Here's the user number
	  DIRST%		;[7.1076] Get username
	  IFJER.		;[7.1076] Assume no match
	    MOVE A,STKPTR	;[7.1076] Get this back
	    JRST SYST2B		;[7.1076] If failure, then assume no match
	  ENDIF.		;[7.1076]
	  HRROI A,ATMBUF	;[7.1076] Check to see if the one we are looking for
	  HRROI B,UNAME		;[7.1076] Matches the current job
	  STCMP%		;[7.1076] Is this the user we want?
	   ERJMP SYST2B		;[7.1076] Must not be
	  EXCH A,STKPTR		;[7.1076] Pointer restoration
	  SKIPE STKPTR		;[7.1076] Is this the user we are looking for?
	  JRST SYST2B		;[7.1076] No, bypass then
	  JRST SYST2Z		;[7.1076] Yes, display this job then
	ENDIF.			;[7.1076]
	MOVEI B,SISLDS		;CHECK AGAINST LOGGED-IN DIR
	MOVE D,.JILNO+.JIBAS
	CALL SYSDUC
	 JRST SYST2Z		;SUCCESS, GO TYPE JOB
	TXNN	Q1,SY%CON	;SHOWING CONNECTED DIR'S?
	JRST SYST2B
	TLNN Z,F4		;[7.1076] Is job of remote flavor?
	IFSKP.			;[7.1076] If so,
	  MOVEM A,STKPTR	;[7.1076] Save for later
	  HRROI A,ATMBUF	;[7.1076] Put dir name in ATMBUF
	  MOVE B,C		;[7.1076] Here's the user number
	  DIRST%		;[7.1076] Get username
	  IFJER.		;[7.1076] If goofed,
	    MOVE A,STKPTR	;[7.1076] Get this back
	    JRST SYST2B		;[7.1076] If failure, then assume no match
	  ENDIF.
	  HRROI A,ATMBUF	;[7.1076] Check to see if the one we are looking for
	  HRROI B,DIRN		;[7.1076] Matches the current job
	  STCMP%		;[7.1076] Is this the directory we want?
	   ERJMP SYST2B		;[7.1076] Must not be
	  EXCH A,STKPTR		;[7.1076] Restore this
	  SKIPE STKPTR		;[7.1076] Is this the user we are looking for?
	  JRST SYST2B		;[7.1076] No, bypass then
	  JRST SYST2Z		;[7.1076] Yes, display this job then
	ENDIF.			;[7.1076]
	MOVEI B,SISCDS		;CHECK AGAINST CONNECTED DIR
	MOVE D,.JIDNO+.JIBAS
	CALL SYSDUC
	 JRST SYST2Z		;SUCCESS
	 JRST SYST2B		;FAILURE
SYSWLD:	SKIPN .JIUNO+.JIBAS	;[7.1137] Job logged in?
	JRST SYST9		;[7.1137] No, so skip this job
	MOVEM A,STKPTR		;[7.1137] Boy does this get bashed
	TLNE Z,F4		;[7.1137] Is job remote or local?
	IFSKP.			;[7.1137] If local,
	  HRROI A,ATMBUF	;[7.1137] Use this for work area
	  MOVE B,.JIUNO+.JIBAS	;[7.1137] Get user number
	  DIRST%		;[7.1137] Get user name string
	   ERJMP SYSWD1		;[7.1137] We won't get a match this way
	  MOVE B,C		;[7.1137] Wild string was in C
	  HRROI C,ATMBUF	;[7.1137] This is what to compare it too
	ELSE.			;[7.1137] If job remote,
	  MOVE B,C		;[7.1137] Wild string was in C, must be in B
	  HRROI C,UNAME		;[7.1137] Here's remote user name
	ENDIF.			;[7.1137]
	MOVEI A,.WLSTR		;[7.1137] Compare 2 strings (1 may be wild)
	WILD%			;[7.1137] See if strings are near match
	 ERJMP CJERR		;[7.1137] We have problems...
	SKIPN A			;[7.1137] Do we have a sucker to display?
	JRST SYST2Z		;[7.1137] Yes we do. Show it
SYSWD1:	MOVE A,STKPTR		;[7.1137] Must restore this for that wonderful routine SSTACK
	JRST SYST2B		;[7.1137] On to next SSTACKed item (ARGH!)
;ROUTINE TO CHECK CURRENT DIRECTORY/USER AGAINST DIRECTORY/USER ARGUMENT
;ACCEPTS:	B/	ADDRESS OF POINTER TO CURRENT DIRECTORY/USER STRING
;		C/	DIRECTORY/USER ARGUMENT (NUMBER OR 'WILD' BYTE POINTER)
;		D/	CURRENT DIRECTORY/USER NUMBER
;RETURNS:	+1 SUCCESS, CURRENT NUMBER/STRING MATCHES ARG
;		+2 FAILURE, CURRENT NUMBER/STRING DOES NOT MATCH ARG

SYSDUC:	STKVAR <ASAV,DUSTRP,DUCARG>
	CAMN C,D		;DOES IT MATCH ARG?
	 RET			;YES, GIVE SUCCESS RETURN
	HRRZM B,DUSTRP		;SAVE AC B
	LOAD B,NMFLG,C		;CHECK TO SEE IF ARG IS DIR/USER NUMBER
	CAIN B,NUMVAL		;IS IT?
	 RETSKP			;YES, GIVE FAILURE RETURN
	MOVEM A,ASAV		;SAVE AC'S A AND C
	MOVEM C,DUCARG
	SKIPE A,@DUSTRP		;HAVE WE GOTTEN DIR/USER STRING BEFORE?
	JRST SYSDU1		;YES, SKIP GETTING IT
	HRROI A,ATMBUF		;PUT IT IN ATOM BUFFER TEMPORARILY
	MOVE B,D
	TLNE Z,F4		;[7.1076] Job remote?
	IFSKP.			;[7.1076] If so,
	  DIRST%		;[7.1076] Get locally
	  IFJER.		;[7.1076] If failure,
	    MOVE A,ASAV		;[7.1076] Restore these ACs
	    MOVE C,DUCARG	;[7.1076]
	    RETSKP		;[7.1076] If error, it's no match
	  ENDIF.		;[7.1076]
	ELSE.			;[7.1076] Job is remote, get information
	  MOVEI A,INFBLK	;[7.1076] Here's where the stuff goes
	  MOVEM B,.INAC2(A)	;[7.1076] Save dir number
	  MOVE B,[.INDST,,INFLEN] ;[7.1076] This function
	  MOVEM B,.INFUN(A)	;[7.1076] Save for JSYS
	  HRROI B,ATMBUF	;[7.1076] String goes here
	  MOVEM B,.INAC1(A)	;[7.1076] Tell JSYS
	  INFO%			;[7.1076] Get it
	   ERJMP CJERR		;[7.1076] Node vamoosed
	  TXZN A,IN%RER		;[7.1076] Remote error?
	  IFSKP.		;[7.1076] If so,
	    MOVE A,ASAV		;[7.1076] Restore these ACs
	    MOVE C,DUCARG	;[7.1076]
	    RETSKP		;[7.1076] If error, it's no match
	  ENDIF.		;[7.1076]
	ENDIF.			;[7.1076]
	HRROI A,ATMBUF		;[7.1076] Copy string to free area
	CALL BUFFS
	MOVEM A,@DUSTRP		;SAVE THE DIR/USER STRING POINTER
SYSDU1:	MOVE C,A		;PUT CUR DIR/USER STRING PTR IN N-W AC
	SETZ A,			;NO FLAGS TO WILD%
	MOVE B,DUCARG		;PUT DIR/USER ARG STRING PTR IN WILD AC
	WILD%			;CHECK CURRENT DIR/USER STRING
	 ERJMP JERR		;THIS IS A WILD ERORR!?
	TXNN A,WL%NOM		;WAS THERE A MATCH?
	TDZA B,B		;YES
	SETO B,			;NO
	MOVE A,ASAV		;RESTORE REGISTERS A AND C
	MOVE C,DUCARG
	JUMPN B,RSKP		;IF NO MATCH, SKIP RETURN
	RET			;IF MATCH, REGULAR RETURN

SYST2D:	HRRZ D,JNX
	CAMN C,D		;CURRENT JOB?
	JRST SYST2Z
	TXNN	Q1,SY%CJB
	JRST SYST2B
	CAMN C,.JICPJ+.JIBAS
	JRST SYST2Z
	JRST SYST2B

SYST2Y:	MOVE D,JNX
	TRNE D,-1
	JRST SYST2Z
	SKIPGE .JITNO+.JIBAS
	JRST SYST9		;SKIP JOB 0 FOR NORMAL PRINT IF DETACHED
;HAVE A REAL JOB #. PRINT IT.

SYST2Z:	TLOE Z,F1		;TYPE HEADER FIRST TIME.
	JRST SYSTS2
	TXNN	Q1,SY%HED
	JRST SYSTS2
	ETYPE < Job >
	TXNE	Q1,SY%CJB
	ETYPE < CJB>
	TXNE	Q1,SY%TTY
	ETYPE < Line>
	TXNE	Q1,SY%SUB
	ETYPE < Program>
	TXNE Q1,SY%NOD		;[7.1076] Want node name?
	ETYPE <  Node  >	;[7.1076] Yes, put it in header
	TXNE	Q1,SY%STA
	ETYPE < State>
	TXNE Q1,SY%CT		;[4412] How about connect time?
	ETYPE < Connected>	;[4412] Yes, prefix the header
	TXNE	Q1,SY%TIM
	ETYPE <  Time   >
	TXNE Q1,SY%CLS		;CLASS INFO REQUESTED?
	ETYPE < Cls   Shr   Use>
	TXNE	Q1,SY%LIM
	ETYPE <  Limit  >
	TXNN	Q1,SY%USR
	JRST SYST2U
	ETYPE <  User>
	TXNE	Q1,SY%CON
	UETYPE [ASCIZ /, <Directory>/]
	TXNN Q1,SY%4NH		;DOING FOREIGN HOST?
	JRST SYST2U		;NO, SKIP THIS THEN
	TXNN Q1,SY%CON		;IF PREVIOUS HEADING NOT TYPED,
	ETYPE <            >	;COLUMNIZE THIS BETTER
	MOVE A,COJFN		;GET CURRENT COLUMN POSITION
	RFPOS			; ..
	 ERJMP [SETZ B,		;IF NOT TERMINAL, ASSUME 0
		JRST .+2]	; *** NOTE .+2, NOT .+1 ***
	ADDI B,2		;ACCOUNT FOR LEADING SPACES IN NEXT ETYPE
	HRRZM B,HDRPOS		;SAVE FOR LATER
	ETYPE <  Origin>
SYST2U:	ETYPE <%_>
	TLZ Z,F3		;NO NEW LINE AFTER TITLE
SYSTS2:	TLZE Z,F3		;SEPARATE USER FROM OPR?
	ETYPE <%_>
	HRRZ A,JNX
	CALL NUM4		;PRINT 4-COLUMN NUMBER
	GJINF
	MOVEI B," "		;ASSUME NOT CURRENT JOB
	HRRZ D,JNX
	CAMN C,D		;OUR JOB?
	MOVEI B,"*"		;YES, INDICATE
	PRINT @B		;SPACE OR STAR

;CONTROLLING JOB OF PTY

	TXNN	Q1,SY%CJB
	JRST SYST4A
	SKIPGE A,.JICPJ+.JIBAS
	JRST [	TYPE <    >
		JRST SYST4A]
	MOVX B,NO%LFL!FLD(4,NO%COL)!<5+5> ;LEADING FILLER, 4 COLUMNS, DECIMAL
	CALL SYNUM
SYST4A:

;"DET" OR "TTY N"

	TXNN	Q1,SY%TTY
	JRST SYST4
	SKIPGE A,.JITNO+.JIBAS
	JRST [	TYPE <  DET>
		JRST SYST4]
	MOVX B,NO%LFL!FLD(5,NO%COL)!8	;LEADING FILLER, 5 COLUMNS, OCTAL
	CALL SYNUM

SYST4:
;SYSTAT...
;SUBSYSTEM NAME

	TXNN	Q1,SY%SUB
	JRST SYST8
	SKIPN A,.JIPNM+.JIBAS
	MOVE A,.JISNM+.JIBAS	;IF NO PROGRAM NAME, USE SUBSYSTEM NAME
	ETYPE <  %1'>
	MOVEI B,0
	JUMPE A,[TYPE <      >	;SIX SPACES IF 0 NAME
		 JRST SYST8]
SYSSU:	LSHC A,-6		;PAD TO EXACTLY SIX CHARACTERS
	JUMPN B,SYST8		;LEAVE LOOP IF ENOUGH SPACES
	PRINT " "		;PRINT A SPACE
	JRST SYSSU
SYST8:	TXNN Q1,SY%NOD		;[7.1076] Want node name column?
	JRST SYST81		;[7.1076] No
	PRINT " "		;[7.1076] Leading space
	SKIPN D,CURNOD		;[7.1076] Do we have a current node?
	IFSKP.			;[7.1076] If so,
	  PRINT " "		;[7.1076] Must make columns line up
	  MOVEI B,6		;[7.1076] Make sure we do 6 characters
	  DO.			;[7.1076] Do node name
	    ILDB A,D		;[7.1076] Get a node character
	    ETYPE <%1\>		;[7.1076] Show character
	    JUMPE A,SPCIT	;[7.1076] All node characters done?
	    SOJG B,TOP.		;[7.1076] Done all characters?
	  ENDDO.		;[7.1076]
SPCIT:	  SOJL B,SYST81		;[7.1089] Need some spaces?
	  PRINT " "		;[7.1076] Do one
	  JRST SPCIT		;[7.1076] Keep spacing until all done
	ELSE.			;[7.1076] Else,
	  TYPE <       >	;[7.1076] Leave blank if no node
	ENDIF.			;[7.1076]
SYST81:	TXNN	Q1,SY%STA	;[7.1076]
	JRST SYST8A
	TLNE Z,F4		;[7.1076] Remote job?
	IFSKP.			;[7.1076] If not,
	  SKIPGE D,.JITNO+.JIBAS ;[7.1076]
	  JRST SYST8B		;[7.1076] If no terminal, say running
	  GTB .TTYJO		;[7.1076] Get terminal word
	  HRRZ A,A		;[7.1076]
	ELSE.			;[7.1076] Run state is in SYSTAT block
	  MOVEI A,INFSYS	;[7.1076] Argument block is here
	  HRRZ A,.SYSTT(A)	;[7.1076] Get state
	ENDIF.			;[7.1076]
	CAIE A,-1		;OTHER THAN -1 MEANS FORK WAITING
	SKIPA B,[-1,,[ASCIZ/  TI  /]]
SYST8B:	HRROI B,[ASCIZ/  RUN /]
	ETYPE <%2M>
SYST8A:	TXNN Q1,SY%CT		;[4412] Want to see connect time?
	IFSKP.			;[4412] If so,
	  TLNE Z,F4		;[4412] Remote job?
	  IFSKP.		;[4412] If not,
	    MOVE B,.JICT+.JIBAS	;[4412] Retrieve connect time from block
	  ELSE.			;[4412] Else, get connect time from INFO% block
	    MOVE B,.SYJCT+INFSYS ;[4412] Here's the connect time
	  ENDIF.		;[4412]
	  IDIVI B,^D1000	;[4412] Make sure we have seconds
	  MOVE A,COJFN		;[4412] Output goes here
	  IDIVI B,^D3600	;[4412] Get hours
	  PUSH P,C		;[4412] Save remainder for later (minutes and seconds)
	  MOVX C,NO%LFL!FLD(4,NO%COL)!FLD(^D10,NO%RDX) ;[4412] Want base 10 output
	  NOUT%			;[4412] Show us hours
	   ERCAL JERRC		;[4412] If error
	  MOVEI B,":"		;[4412] No slam seperator
	  BOUT%			;[4412]
	   ERCAL JERRC		;[4412] Report problems
	  POP P,B		;[4412] Get remainder back
 	  IDIVI B,^D60		;[4412] And find out minutes
	  PUSH P,C		;[4412] Save seconds
	  MOVX C,NO%LFL!NO%ZRO!FLD(2,NO%COL)!FLD(^D10,NO%RDX) ;[4412] 2 columns
	  NOUT%			;[4412] And leading zeros for minutes
	   ERCAL JERRC		;[4412] Ooops
	  MOVEI B,":"		;[4412] Another seperator
	  BOUT%			;[4412]
	   ERCAL JERRC		;[4412]
	  POP P,B		;[4412] Retrieve seconds
	  NOUT%			;[4412] Display seconds
	   ERCAL JERRC		;[4412]
	ENDIF.			;[4412]
	TXNN	Q1,SY%TIM
	JRST SYSTS3
	MOVE A,.JIRT+.JIBAS
	ETYPE <  %1B>
SYSTS3:	TXNN Q1,SY%CLS		;PRINT CLASS STUFF?
	JRST SYSECL		;NO

;CLASS SCHEDULER INFO

	MOVE A,CURNDN		;[7.1140] Get current node we are working on
	MOVE A,BITS(A)		;[7.1140] See if it is doing class scheduling
	TXNE Q1,SY%NOD		;[7.1140] If NODE was typed
	TDNE A,CLSMSK		;[7.1140]  and class scheduling is off
	IFSKP.			;[7.1140]  at this node, then...
	  ETYPE <                > ;[7.1140]  leave fields blank
	  JRST SYSECL		;[7.1140]  and go on
	ENDIF.			;[7.1140]
	TLNE Z,F4		;[7.1076] Local job?
	IFSKP.			;[7.1076] If so,
	  MOVE A,.SAJCL+SYCLB	;[7.1076] Get class
	  CALL NUM4		;[7.1076] (A/) Print as four columns
	  DMOVE A,.SAJSH+SYCLB	;[7.1076] Get share and utilization
	ELSE.			;[7.1076] Job was remote
	  MOVEI A,INFSYS	;[7.1076] Time to get class
	  MOVE A,.SYCLS(A)	;[7.1076] Here's the class
	  CALL NUM4		;[7.1076] (A/) Print 4 cloumns
	  MOVEI A,INFSYS	;[7.1076] Now get share and utilization
	  DMOVE A,.SYSHR(A)	;[7.1076] Here ya go
	ENDIF.			;[7.1076]
	ETYPE <%1=%%2=>		;[7.1076] Display share and utilization
SYSECL:	TXNN	Q1,SY%LIM
	JRST SYSTS4
;LIMIT

	ETYPE <  >
	SKIPG A,.JIRTL+.JIBAS
	JRST [	ETYPE <       >
		JRST SYSTS4]
	ETYPE <%1B>

;USER NAME OR "?" IF CONVERSION FAILS.

SYSTS4:	TXNN	Q1,SY%USR
	JRST SYSTS5
	ETYPE <  >
	SKIPE B,SISTAS		;HAVE WE GOT USER STRING ALREADY?
	 JRST	[MOVE A,COJFN
		 SETZ C,
		 SOUT
		 JRST SYSTS7]	;YES, TYPE IT OUT
	SKIPN B,.JIUNO+.JIBAS
	JRST [	ETYPE <Not logged in>
		JRST SYSTS5]
	TLNE Z,F4		;[7.1076] Remote job?
	IFSKP.			;[7.1076] If so,
	  ETYPE <%2R>		;[7.1076] Then here's the user name
	ELSE.			;[7.1076] Otherwise,
	  HRROI B,UNAME		;[7.1076] Here's the user name
	  ETYPE <%2M>		;[7.1076] Show it
	ENDIF.			;[7.1076]
SYSTS7:	TXNN Q1,SY%CON
	JRST SYSTS5
	MOVE B,.JIDNO+.JIBAS
	CAMN B,.JILNO+.JIBAS
	JRST SYSTS5
	ETYPE <, >
	SKIPE B,SISCDS		;DO WE HAVE STRING ALREADY?
	 JRST	[MOVE A,COJFN
		 SETZ C,
		 SOUT
		 JRST SYSTS5]	;YES, TYPE IT OUT
	TLNE Z,F4		;[7.1076] Job like remote?
	IFSKP.			;[7.1076] If local,
	  MOVE B,.JIDNO+.JIBAS	;[7.1076] Here's the directory number
	  ETYPE <%2R>		;[7.1076] Show name
	ELSE.			;[7.1076] Else, we get directory name from
	  HRROI B,DIRN		;[7.1076] Here!
	  ETYPE <%2M>		;[7.1076] Show us the name
	ENDIF.			;[7.1076]
SYSTS5:	TXNN Q1,SY%4NH		;DOING FOREIGN HOST NAME?
	JRST SYSTS6		;NO, SKIP THIS STUFF THEN
	TLNN Z,F4		;[7.1100] Remote job?
	IFSKP.			;[7.1100] Job is remote,
	  SKIPE ORGN		;[7.1100] Does job have an origin
	  JRST SYST5A		;[7.1100] Yes, ignore useless code and display it
	  JRST SYSTS6		;[7.1100] No origin, don't tab out to origin field
	ENDIF.			;[7.1100]
	MOVEI A,.NTBAS		;GET ADR OF NTINF ARG BLOCK
	MOVEI B,.NWNU1+1	;LENGTH OF ARG BLOCK
	MOVEM B,.NWABC(A)
	MOVEI B,.NWRRH		;RETURN REMOTE HOST NAME FUNCTION CODE
	MOVEM B,.NWFNC(A)
	MOVE B,.JITNO+.JIBAS	;CONTROLLING TTY NUMBER OF JOB
	JUMPL B,SYSTS6		;HANDLE DETACHED LINES
	TRO B,.TTDES		;MAKE THE LINE NUMBER A LINE DESIGNATOR
	MOVEM B,.NWLIN(A)	;SAVE IT
	SETZM HSTNAM		;[4412] Zero this out to start with
	HRROI B,HSTNAM		;POINTER TO SAVE HOST NAME
	MOVEM B,.NWNNP(A)
	NTINF%			;GET NETWORK INFO ON THIS TERMINAL
	 ERJMP SYSTS6		;IGNORE THE ERROR
	MOVEI A,.NTBAS		;GET POINTER TO ARG BLOCK AGAIN
	MOVE B,.NWTTF(A)	;GET FLAGS WORD
	LDB C,[POINT 9,B,17]    ;GET NETWORK TYPE
	CAIN C,NW%NNT		;NON-NETWORK TERMINAL ?
	JRST SYSTS6		;YES
	CAIE C,NW%TCP		;TCP ?
	IFSKP.
	 MOVE D,TCPDEL		;SET UP HOST PREFIX AND SUFFIX
	 MOVEM D,HSTDEL
	 MOVEI C,.NWNNU(A)	;YES - GET ADDRESS OF NODE NUMBER
	 CALL TCPHST		;GO TYPE IT
	  JRST SYSTS6		;PROBLEM
	 JRST SYST5A		;FINISH UP
	ENDIF.
	CAIE C,NW%DNA		;DECNET ?
	IFSKP.
	 HRRZ C,B		;GET LINE TYPE
	 MOVE D,NRTDEL          ;SET UP HOST PREFIX AND SUFFIX
	 CAIN C,NW%CH		;CTERM ?
	 MOVE D,CTMDEL          ;SET UP HOST PREFIX AND SUFFIX
	 MOVEM D,HSTDEL
	 MOVEI C,.NWNNU(A)	;YES - GET ADDRESS OF NODE NUMBER
	 CALL DNAHST		;GO TYPE IT
	  JRST SYSTS6		;PROBLEM
	 JRST SYST5A		;FINISH UP
	ENDIF.
	CAIE C,NW%LAT		;LAT ?
	IFSKP.
	 MOVE D,LATDEL          ;SET UP HOST PREFIX AND SUFFIX
	 MOVEM D,HSTDEL
	 MOVEI C,.NWNNU(A)	;GET ADDRESS OF NODE NUMBER WORDS
	 CALL LATHST		;GO TYPE THEM
	  JRST SYSTS6		;PROBLEM
	 JRST SYST5A
	ENDIF.
	JRST SYSTS6		;UNKNOWN NETWORK TYPE
SYST5A:	MOVE A,COJFN		;GET CURRENT HORIZONTAL POSITION
	RFPOS			; ..
	 ERJMP [MOVEI B,7777	;NOT TERMINAL, ASSUME COLUMN OVERFLOW
		JRST .+1]
	HRRZS B			;DROP LINE NUMBER
	MOVE A,HDRPOS		;GET DESIRED COLUMN NUMBER OF HOST COLUMN
	SUB A,B			;COMPUTE DISTANCE THERE
	SKIPG A			;RANGE CHECK...IS IT POSITIVE?
	 MOVEI A,2		;NO SO DEFAULT IT TO TWO SPACES
	CAIGE A,2		;FORCE AT LEAST TWO SPACES
	MOVEI A,2		; ..
	CAIL A,^D100		;UNREASONABLY LARGE NUMBER?
	MOVEI A,2		;YES, USE 2 INSTEAD
	PRINT " "		;TYPE ENOUGH SPACES TO LINE UP
	SOJG A,.-1		; ..
	TLNN Z,F4		;[7.1076] Remote job?
	IFSKP.			;[7.1076] If so,
	  SKIPN ORGN		;[7.1076] Anything to speak of?
	  JRST SYSTS6		;[7.1076] No, don't bother
	  HRROI B,ORGN		;[7.1076] Origin is here
	  ETYPE <%2M>		;[7.1076] Show it to us
	  JRST SYSTS6		;[7.1076] And that's it
	ENDIF.			;[7.1076]
	HLRO A,HSTDEL		;GET HOST NAME PREFIX
	ETYPE <%1\>
	UETYPE HSTNAM		;TYPE THE NAME
	HRRO A,HSTDEL		;GET HOST NAME PREFIX
	ETYPE <%1\>
	JRST SYSTS6

TCPDEL:	 [ASCIZ//],,[ASCIZ/(TCP)/]	;SET UP HOST PREFIX AND SUFFIX
NRTDEL:	 [ASCIZ//],,[ASCIZ/(NRT)/]	;SET UP HOST PREFIX AND SUFFIX
CTMDEL:	 [ASCIZ//],,[ASCIZ/(CTM)/]	;SET UP HOST PREFIX AND SUFFIX
LATDEL:	 [ASCIZ//],,[ASCIZ/(LAT)/]	;SET UP HOST PREFIX AND SUFFIX

DNAHST:	SKIPE D,(C)		;[7.1008] GET DECNET NODE NUMBER
	TXNN B,NW%NNN		;HAVE A NODE NAME ?
	RETSKP			;YES
	SKIPE HSTNAM		;[4412] No node name, but did NTINF% fill in anything?
	RETSKP			;[4412] NTINF% did it for us
	HRROI A,HSTNAM		;OUTPUT TO HSTNAM STRING
	MOVEI C,^D10		;OUTPUT RADIX IS DECIMAL
	LDB B,[POINT 6,D,25]	;GET AREA OF DECNET NODE NUMBER
	JUMPE B,DNAHS1		;ZERO ? DON'T TYPE AREA
	NOUT			;NO - THEN OUTPUT IT
	 ERJMP R
	MOVEI B,"."		;PRINT A DOT
	BOUT
DNAHS1:	LDB B,[POINT 10,D,35]	;GET HOST NUMBER PART
	NOUT
	 ERJMP R
	RETSKP


LATHST:	SAVEAC <Z>
	TXNN B,NW%NNN		;HAVE A NODE NAME ?
	RETSKP			;YES
	SKIPN (C)		;[7.1008] HAVE ANY ETHERNET ADDRESS ?
	SKIPE 1(C)		;[7.1008] NOT SO FAR, CHECK NEXT WORD
	SKIPA			;[7.1008] GOT NON-ZERO ADDRESS
	RETSKP			;[7.1008] NO ETHERNET ADDRESS, DO NOTHING
	MOVEI Z,6		;ETHERNET ADDRESSES ARE 6 BYTES LONG
	MOVE D,C		;GET ADDRESS OF ETHERNET ADDRESS
	TXO D,<POINT 8,0>	;FORM BYTE POINTER TO IT
	HRROI A,HSTNAM		;OUTPUT TO HSTNAM STRING
	MOVX C,<NO%LFL!NO%ZRO!<2B17>!^D16> ;HEX OUTPUT, 2 DIGITS, ZERO FILL
	JRST LATHS2		;DON'T PRINT A SEPERATOR
LATHS1:	MOVEI B,"-"		;PRINT A SEPERATOR
	BOUT
LATHS2:	ILDB B,D		;GET A BYTE
	NOUT			;OUTPUT IT
	 ERJMP R
	SOJG Z,LATHS1		;LOOP TILL DONE
	RETSKP

TCPHST:	SKIPE D,(C)		;[7.1008] GET HOST NUMBER, RETURN IF NOT
	TXNN B,NW%NNN		;HAVE A NODE NAME ?
	RETSKP			;YES
	HRROI A,HSTNAM		;TYPE HOST NUMBER LIKE #.#.#.#
	MOVEI C,^D10
	LDB B,[POINT 8,D,11]	;GET A BYTE
	NOUT			;OUTPUT IT
	  ERJMP R
	MOVEI B,"."
	BOUT			;TYPE A DOT
	LDB B,[POINT 8,D,19]	;GET A BYTE
	NOUT			;OUTPUT IT IN DECIMAL
	  ERJMP R
	MOVEI B,"."
	BOUT			;TYPE A DOT
	LDB B,[POINT 8,D,27]	;GET A BYTE
	NOUT			;OUTPUT IT IN DECIMAL
	  ERJMP R
	MOVEI B,"."
	BOUT			;TYPE A DOT
	LDB B,[POINT 8,D,35]	;GET A BYTE
	NOUT			;OUTPUT IT IN DECIMAL
	  ERJMP R
	RETSKP

SYSTS6:	ETYPE <%_>
SYST9:	SKIPE A,SISTAS		;RETURN USER STRING IF USED
	CALL STREM
	SKIPE A,SISLDS		;RETURN LOGGED-IN DIR STRING IF USED
	CALL STREM
	SKIPE A,SISCDS		;RETURN CONNECTED DIR STRING IF USED
	CALL STREM
	MOVE D,JNX
	SKIPE SYJOBM		;[7.1139] Still doing SYSJOBs?
	JRST SYST2		;[7.1139] If so, don't bump job counter
	AOBJN D,SYST2
	TXNE Q1,SY%NOP
	JRST RLJFNS		;QUIT NOW IF NO OPERATOR JOBS
	TLO Z,F3		;FLAG CRLF SECOND TIME THROUGH
	TLON Z,F2		;SECOND PASS DONE?
	IFSKP.			;[7.1139] If so,
	  JRST RLJFNS		;[7.1139] Do cleanup and go back to command level
	ELSE.			;[7.1139]
	  MOVE A,NODMSK		;[7.1139] Get node mask back
	  MOVEM A,SYJOBM	;[7.1139] And make SYSJOB mask setup again
	  JRST SYST9A		;[7.1139] Now print out OPR jobs only
	ENDIF.			;[7.1139]
SYSTD:	MOVEM B,SISTAN		;SAVE DIR NUMBER
	CALL BUFFF		;GET THE DIR NAME STRING
	MOVEM A,SISTAS		;SAVE STRING POINTER
	MOVEI A,SY$DIR
	CALL SSTACK		;ANNOUNCE DIR NUMBER OR STRING COMING UP
	MOVE A,SISTAN		;STEP THE NUMBER
	MOVE B,SISTAS
	CALL STPDIR
	 JRST	[MOVE A,SISTAN
		 JRST SYSTD1]	;NO MORE, SAVE DIR NUMBER
	MOVEI A,[GJ%IFG+GJ%OFG
		.NULIO,,.NULIO
		0
		0
		POINT 7,[ASCIZ/*/]
		POINT 7,[ASCIZ/*/]
		0
		0]		;GET JFN ON WILD DIRECTORY STRING
	HRROI B,ATMBUF
	GTJFN
	 ERJMP JERR		;WILD ERROR!?
	MOVE B,A		;SET UP FOR JFNS
	HRROI A,ATMBUF
	MOVX C,1B2+1B5+JS%PAF
	JFNS
	MOVE A,B		;RELEASE THE JFN
	RLJFN
	 ERJMP JERR		;DITTO
	CALL BUFFF		;STORE STRING IN TEMPORARY FREE AREA
SYSTD1:	CALL SSTACK
	JRST SYST1J
SYSTU:	CALL CHKWLD		;[7.1137] (/) Check for wildcard
	 SKIPA			;[7.1137] Wild card not given
	JRST SYSFLD		;[7.1137] Wild name seen. Handle on its own
	MOVEM B,SISTAN		;SAVE THE USER NUMBER
	CALL BUFFF		;GET THE ATOM BUFFER
	MOVEM A,SISTAS		;SAVE STRING POINTER TO USER NAME
	MOVEI A,SY$USR		;ANNOUNCE THAT USER NAME OR STR COMING UP
	CALL SSTACK
	MOVE A,SISTAN		;NOW STEP THE USER
	MOVE B,SISTAS		;IF NEEDED
	CALL STPUSR
	 SKIPA A,SISTAN		;NO MORE, SAVE USER NUMBER
	MOVE A,SISTAS		;IT'S WILD, SAVE STRING POINTER
	CALL SSTACK

SYST1J:	CALL .SYSEL
	JRST SYSTK1

SYSTJ:	PUSH P,B		;SAVE THE JOB NUMBER
	MOVEI A,SY$JOB		;FLAVOR IS "JOB NUMBER"
	CALL SSTACK
	POP P,A			;GET THE JOB NUMBER
	CALL SSTACK
	JRST SYST1J
DEFINE TB(TEXT,FLAGS,BIT)<
	T <TEXT>,FLAGS+,<[TXO Q1,SY%'BIT
			  RET]>
>
;THIS IS THE KEYWORD TABLE.  SEE $SYSTB FOR THE SUBCOMMAND TABLE.

$SESTA:	TABLE
	T .,,SYSTK.
	T ALL,,.SYSAL
	TB CLASS,,CLS
	TB CONNECT-TIME,,CT	;[4412] Connect time
	TB CONTROLLING,,CJB
	TB DIRECTORY,,CON
	IT FOREIGN-HOST,,F4NH
	TB HEADER,,HED
	TB LIMIT,,LIM
	T LINE,,SYSTT
	T LPT,,.$LPT
	TA N,.NOPE		;[7.1093]
.NOPE:	T NO,,.SYSNO		;[7.1093]
	T NODE,,SYSNOD		;[7.1076]
	T ORIGIN,,F4NH
	T PROGRAM
	TB STATE,,STA
	TB SYSTEM,,NJB
	TB TIME,,TIM
	TB WHAT,,SUB
	TB WHERE,,TTY
	TB WHO,,USR
	TEND

DEFINE TB(TEXT,FLAGS,BIT)<
	T <TEXT>,FLAGS+,<[CONFIRM
			  TXO Q1,SY%'BIT
			  RET]>
>
;This is the subcommand table.  See $SESTA for the keyword table.

$SYSTB:	TABLE
	T ALL,,..SYSA
	TB CLASS,,CLS
	TB CONNECT-TIME,,CT	;[4412] Connect time
	TB CONTROLLING,,CJB
	TB DIRECTORY,,CON
	IT FOREIGN-HOST,,CF4NH
	TB HEADER,,HED
	T JOB,,SYJOB
	TB LIMIT,,LIM
	T LINE,,..SYST
	T LPT,,..LPT
	TA N,SUBNO		;[7.1093]
SUBNO:	T NO,,..SYSN		;[7.1093]
	T NODE,,SYNODS		;[7.1076]
	T ORIGIN,,CF4NH
	T OUTPUT,,.SYOUT
	T PROGRAM,,.PRCNF
	TB STATE,,STA
	TB SYSTEM,,NJB
	TB TIME,,TIM
	T USER,,SYUSR		;[7.1076]
	TB WHAT,,SUB
	TB WHERE,,TTY
	TB WHO,,USR
	TEND
.SYOUT:	SKIPN CUSRNO
	ERROR <LOGIN please>
	NOISE <TO FILE>
	MOVE A,[XWD [ASCIZ /SYSTAT/],[ASCIZ /LST/]] ;DEFAULT NAME & EXT
	CALL COUTFN
	 JRST CERR
	CONFIRM
	MOVEM A,SYSJFN		;CAN'T SET UP COJFN UNTIL SUBCOMMANDS ARE OVER!
	RET

.$LPT:	SKIPN CUSRNO
	ERROR <LOGIN please>
	CALL GETLPT		;GET JFN ON LPT
	MOVEM A,SYSJFN		;REMEMBER TO USE IT FOR OUTPUT
	RET

..LPT:	SKIPN CUSRNO
	ERROR <LOGIN please>
	CALL FINLPT		;FINISH LPT SUBCOMMAND
	MOVEM A,SYSJFN		;REMEMBER LPT
	RET

SYJOB:	DECX <Decimal job number> ;[7.1076]
	 CMERRX
	PUSH P,B		;SAVE THE NUMBER
	CONFIRM			;WAIT FOR CONFIRMATION
	MOVEI A,SY$JOB		;FLAVOR
	CALL SSTACK
	POP P,A			;RESTORE THE NUMBER
				;DON'T TRY TO BUM CODE BY STACKING THE
				;FLAVOR BEFORE READING VALUE.  THE
				;TYPIST MIGHT TYPE CONTROL-U, LEAVING
				;THE ARG STACK AMUCK
	CALL SSTACK
	JRST .SYSEL
SYUSR:	SETOM SUBMSK		;[4413] Say in subcommand
	TLZ Z,F1		;[7.1076] ALLOW DEFAULT
	SKIPN CUSRNO		;LOGGED IN?
	TLO Z,F1		;NO, SO DON'T ALLOW DEFAULTING
	CALL USRNMS
	 JRST SYSFLD		;[7.1137] Must have typed a non-local user
	MOVEM B,SISTAS		;SAVE POINTER TO WILD STRING
	MOVEM C,SISTAN		;SAVE USER NUMBER
	CONFIRM
	CALL CHKWLD		;[7.1137] (/) User want wildcarded username?
	 SKIPA			;[7.1137] No, go on
	JRST SYSFLD		;[7.1137] Yes, handle differently
	MOVEI A,SY$USR		;ANNOUNCE FLAVOR IS USER
	CALL SSTACK
	MOVE A,SISTAN		;GET DIRECTORY NUMBER
	MOVE B,SISTAS		;AND POINTER TO STRING
	CALL STPUSR		;STEP TO NEXT USER NUMBER
	 SKIPA A,SISTAN		;NO MORE, SAVE USER NUMBER
	MOVE A,SISTAS		;IT'S WILD, SAVE USER STR POINTER
	CALL SSTACK
	CALLRE .SYSEL		;RETURN VIA .SYSEL

;[7.1137]
;"SYSTAT USER" when user is not local or "SYSTAT US*" comes through here
;Done for people who don't have homogeneous clusters. Grumble. Grumble.

SYSFLD:	MOVE A,FLDPTR		;Get current pointer into WLDPAG
	HRROI A,WLDPAG(A)	;Put wild (or non-local user) string here
	HRROI B,ATMBUF		;Get it from here
	MOVEI C,^D39		;Only this many characters
	SETZ D,			;Stop on null
	SOUT%			;Transfer string
	 ERJMP .+1		;Naaaa...
	MOVE A,FLDPTR		;Get our current pointer
	SKIPN WLDPAG(A)		;[7.1161] Did we get something for real from the user?
	ERROR <Does not match keyword, directory or username> ;[7.1161] No, let them know
	HRROI C,WLDPAG(A)	;And get another argument for SSTACK
	ADDI A,10		;Account for the maximum string
	CAIL A,<WLDPAG+777>	;Did user give us too much?
	ERROR <Too many arguments> ;Yes, let him know
	MOVEM A,FLDPTR		;Update pointer
	MOVEI A,SY$FLD		;Say this is special
	CALL SSTACK		;(A/B) Boy, do I hate this hack
	MOVE A,C		;Now stack up the wild byte pointer
	CALL SSTACK		;(A/B) More hack
	CALL .SYSEL		;(/) Set some bits
	SKIPN SUBMSK		;[4413] In subcommand mode?
	JRST SYSTK1		;[4413] No, continue parsing the command
	RET			;[4413] Yes, all done
;"SYSTAT PROGRAM FOO" ONLY LISTS JOBS RUNNING PROGRAM FOO

.PROGR:	CALL PROG1		;GET THE ARGS
	CALLRET .SYSEL		;SAY NO HEADING

PROG1:	STKVAR <PRGNAM>
	WORDX <Program name whose users should be displayed>
	 CMERRX <Invalid program name>
	HRROI A,ATMBUF		;POINT AT PROGRAM NAME
	CALL GETSIX		;CHANGE TO SIXBIT
	 ERROR <Illegal character in program name, or name too long>
	MOVEM A,PRGNAM		;REMEMBER WHICH PROGRAM WE'RE LOOKING FOR
	MOVEI A,SY$PRG		;SAY PROGRAM NAME
	CALL SSTACK
	MOVE A,PRGNAM
	CALL SSTACK		;REMEMBER THE PROGRAM NAME
	RET

.PRCNF:	CALL PROG1		;GET PROGRAM NAME
	CONFIRM			;WAIT FOR CONFIRMATION
	CALLRET .SYSEL		;SET FLAGS SO HEADING DOESN'T APPEAR

..SYST:	CALL SYSTT
	CALLRET CONF

SYSTT:	HELPX <octal line number or> ;[7.1076]
	KEYWD $SYTTY
	 0
	 JRST .SYST1
	HRROI B,-1		;FLAG FOR DETACHED LINES
	JRST .SYST2

$SYTTY:	TABLE
	T DETACHED,,0
	TEND

.SYST1:	OCTX			;IF NOT A KEYWORD, HAS TO BE OCTAL NUMBER
	 CMERRX			;NOT EITHER
.SYST2:	PUSH P,B		;SAVE NUMBER
	MOVEI A,SY$TTY
	CALL SSTACK
	POP P,A			;GET NUMBER
	CALL SSTACK		;PUT IT ON STACK
.SYSEL:	TXO	Q1,SY%JOB!SY%NHD
	RET
SSTACK::SKIPL SFRAME
	 ERROR <Too many arguments>
	EXCH B,SFRAME
	MOVEM A,(B)
	ADD B,[1,,1]
	EXCH B,SFRAME
	RET

..SYSA:	CONFIRM
.SYSAL:	TXO	Q1,SYSALL
	RET
..SYSN:	CALL .SYSNO
	CALLRET CONF

.SYSNO:	MOVEI B,[FLDBK. .CMKEY,,$SYSNO,,,DOTBRK] ;ALLOW DOT
	CALL FLDSKP
	 CMERRX
	CALL GETKEY
	JRST (P3)

DOTBRK:	BRMSK. KEYB0.,KEYB1.,KEYB2.,KEYB3.,<.>	;BREAK SET FOR KEYWORDS THAT MAY HAVE DOT IN THEM

DEFINE TB(TEXT,FLAGS,BIT)<
	T <TEXT>,FLAGS+,<[TXZ Q1,SY%'BIT
			  RET]>
>
;$SYSNO IS USED FOR THE SYSTAT NO FEATURE, BOTH FOR SUBCOMMANDS AND FOR
;KEYWORDS.

$SYSNO:	TABLE
	TB .,,IME
	TB CLASS,,CLS
	TB CONNECT-TIME,,CT	;[4412]
	TB CONTROLLING,,CJB
	TB DIRECTORY,,CON
	IT FOREIGN-HOST,,F4NHN
	T HEADER,,.SYSNH
	TB LIMIT,,LIM
	T NODE,,NONODE		;[7.1076]
	T OPERATOR,,.NOOPR
	T ORIGIN,,F4NHN
	TB STATE,,STA
	T SYSTEM,,.SYSNS
	TB TIME,,TIM
	TB WHAT,,SUB
	TB WHERE,,TTY
	TB WHO,,USR
	TEND
.SYSNH:	TXZ	Q1,SY%HED
	TXO	Q1,SY%NHD
	RET

.NOOPR:	TXO	Q1,SY%NOP
	RET

.SYSNS:	TXO	Q1,SY%JOB
	RET

CF4NH:	CONFIRM			;MAKE SURE HE MEANS IT
F4NH:	TXO	Q1,SY%4NH
	RET

CN4NH:	CONFIRM			;MAKE SURE HE MEANS IT
F4NHN:	TXZ	Q1,SY%4NH
	RET

NONODE:	CALL VALNDN		;[7.1076] (A/A,B,C) Get a valid node name
	ANDCAM C,NODMSK		;[7.1076] Scratch this node from the node mask
	SKIPN NODMSK		;[7.1076] Has this been nixed?
	TXZ Q1,SY%NOD		;[7.1076] Yes, then don't do nodes
	RET			;[7.1076] And done

SYSNOD:	CALL VALNDN		;[7.1076] (A/A,B,C) Get a valid CI node
SYSND1:	IORM C,NODMSK		;[7.1076] Say we can do these nodes
	TXO Q1,SY%NOD		;[7.1076] Say we are doing nodes
	RET			;[7.1076] And done

;When node is used as a subcommand
SYNODS:	CALL VALNDN		;[7.1076] (A/A,B,C) Parse valid CI node
	CONFIRM			;[7.1076] No for a <CRLF>
	JRST SYSND1		;[7.1076] And join common code
;STATISTICS

CLBLN==7			;ROOM FOR COUNT, CLASS, SHAR, USE, 1 MIN LOAD, 5 MIN, 15 MIN

MONSTA::STKVAR <CURCLS,<CLBLK,CLBLN>>
	MOVE A,[SIXBIT /SYSTAT/]
	CALL READT		;READ SYSTEM STATISTICS TABLE INTO AC'S 4-13
	ETYPE < Up %K
 Idle %4T  Waiting %5T  Sched ovh %6T  Pager traps %7T
 Swap reads %10Q Writes %11Q  File reads %12Q Writes %13Q
>
	MOVE A,[SIXBIT /NCPGS/]
	SYSGT
	ETYPE < %1Q Pages of user memory
>
	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
>
	HLRE A,QTIMES		;GET NUMBER OF SHCED QUEUES
	MOVM A,A		;MAKE POSITIVE
	SUBI A,1		;MAKE LIMIT INCLUSIVE
	ETYPE < Runtime of jobs on sched queues 0-%1Q (sec)
>
	HLLZ D,QTIMES		;SET UP TO LOOP OVER QTIMES
STAT5C:	GTB .QTIME
	IDIVI A,^D1000		;CONVERT TO SECONDS
	ETYPE <	%1Q>
	AOBJN D,STAT5C
	MOVEI A,CLBLN		;BLOCK LENGTH
	MOVEM A,.SACNT+CLBLK
	CALL CLSON		;SEE IF CLASS SCHEDULER IS ON
	 JRST CLDON		;NO, SO DON'T TRY TO PRINT TABLE!
	ETYPE <%_ Class Share   Use   Loads%_>
	SETZB A,CURCLS		;START CURRENT CLASS AT 0
CLLUP:	MOVEM A,.SACLS+CLBLK	;SAY WHICH CLASS TO LOOK AT
	MOVEI A,SYCLN		;SET UP BLOCK SIZE FOR SKED%
	MOVEM A,.SACNT+CLBLK
	MOVEI A,.SKRCS		;READ CLASS PARAMETERS
	MOVEI B,CLBLK		;SAY WHERE ARG BLOCK IS
	SKED%			;GET THE INFO
	 ERJMP [CALL DGETER	;FAILED, SEE WHY
		CAIE A,ARGX25	;SCAN ALL LEGAL CLASSES?
		CALL JERR	;NO, UNEXPECTED ERROR
		JRST CLDON]	;YES, JUST LEAVE LOOP
	SKIPN .SASHR+CLBLK	;DOES THIS CLASS HAVE A SHARE OF MACHINE?
	SKIPE .SAUSE+CLBLK	;IS THIS CLASS BEEN USED?
	CAIA
	JRST CLNXT		;NO, SKIP IT
	MOVE A,CURCLS		;GET CURRENT CLASS
	ETYPE <  >
	CALL NUM4		;PRINT 4-COLUMN CLASS NUMBER
	DMOVE A,.SASHR+CLBLK	;GET SHARE AND UTILIZATION
	ETYPE <%1=%%2=>		;SHARE, USE
	MOVSI Q1,-3		;SET UP TO PRINT 3 LOAD AVERAGES
	HRRI Q1,.SA1ML+CLBLK	;POINT TO FIRST LOAD AVERAGE
CLOD:	MOVE A,(Q1)		;GET NEXT LOAD
	MOVEI B,7		;PRINT IN 7 COLUMNS
	PRINT " "		;SEPARATE WITH SPACE IN CASE OVERFLOW
	CALL FLTTAB
	AOBJN Q1,CLOD		;LOOP FOR REST OF LOADS
	ETYPE <%_>
CLNXT:	AOS A,CURCLS		;STEP TO NEXT CLASS
	JRST CLLUP
CLDON:	RET
;STATISTICS
;INFO SUBSYSTEM-STATUS - TABLE OF SUBSYSTEM USAGE

SUBSTA::ETYPE<%_>
	TYPE < Subsys  Time(sec)   PGF/SEC   Nblocks   WS-size   Scounts
>
	HLLZ D,SNAMES		;SET UP TO LOOP OVER ALL NAMES
STAT5A:	GTB .SNAME		;GET SIXBIT NAME
	JUMPE A,STAT5Z		;0 MEANS NONE
	PUSH P,A		;SAVE NAME FOR LATER
	PRINT " "
	CALL SIXPRT		;PRINT IT
	PRINT TAB
	GTB .STIME		;GET RUNTIME
	PUSH P,A		;SAVE IT FOR LATER
	IDIVI A,^D1000		;CONVERT TO SECONDS
	CALL STAT5N		;PRINT SECONDS
	POP P,A			;GET TIME AGAIN
	JUMPE A,[CALL STAT5N	;IF 0, PRINT 0 FOR PGF/SEC ALSO
		 JRST STAT5B]
	CALL FLOAT
	FDVRI A,(1000.0)	;CONVERT TO SECONDS
	MOVEM A,C
	GTB .SPFLT		;GET PAGE FAULTS
	CALL FLOAT		;FLOAT IT
	FDVR A,C		;COMPUTE PAGE FAULTS PER SECOND
	JUMPE A,[CALL STAT5N	;IF 0, PRINT SPECIALLY SO IT'LL ALIGN PROPERLY
		 JRST STAT5B]
	ETYPE <    %1Q>		;PRINT IT IN 10-SPACE FIELD
STAT5B:	GTB .SNBLK		;GET NUMBER OF BLOCKS
	PUSH P,A
	CALL STAT5N		;PRINT IT
	POP P,A
	JUMPE A,[CALL STAT5N	;IF 0, PRINT 0 FOR WSSIZE ALSO
		 JRST STAT5Y]
	CALL FLOAT		;FLOAT IT
	PUSH P,A
	GTB .SSIZE		;GET SIZE INTEGRAL
	CALL FLOAT		;FLOAT IT
	POP P,B
	FDVR A,B		;COMPUTE WSSIZE
	JUMPE A,[CALL STAT5N	;IF 0, PRINT SPECIALLY SO IT'LL ALIGN PROPERLY
		 JRST STAT5Y]
	ETYPE <    %1Q>		;PRINT IT IN 10-SPACE FIELD

STAT5Y:	GTB .SCOUNT		;GET COUNT OF SETSN'S DONE
	POP P,B			;GET STORED PROGRAM NAME
	CAME B,[OURNAM]		;IF IT'S THE EXEC, SCOUNT IS MEANINGLESS (& BIG)
	CALL STAT5N		;ELSE OUTPUT IT IN 12 COLUMNS
	ETYPE <%_>		;END THE LINE
STAT5Z:	AOBJN D,STAT5A		;DO ALL NAMES
	JRST EOLRET
;PRINT FLOATING POINT NUMBER.  NUMBER IN A, COLUMNS IN B

DADP==2			;NUMBER OF DIGITS AFTER DECIMAL POINT

FLTTAB:	MOVX C,FL%ONE!FL%PNT!FL%OVL!FLD(DADP,FL%SND)	;AT LEAST ONE DIGIT, DECIMAL POINT, OUTPUT ON COLUMN OVERFLOW, 2 DIGITS AFTER POINT
	SUBI B,DADP+1		;SUBTRACT DIGITS AFTER POINT PLUS ONE FOR POINT
	STOR B,FL%FST,C		;TELL SYSTEM HOW MANY PLACES BEFORE POINT
	MOVE B,A		;NUMBER IN B
	MOVE A,COJFN		;OUTPUT CHANNEL IN A
	FLOUT			;TYPE THE FLOATING POINT NUMBER
	 JRST [	CAIN C,FLOTX1	;OVERFLOW OF COLUMN 1?
		JRST .+1	;YES, O.K.  JUST MEANS NUMBER REAL LARGE.
		CALL CJERRE]	;NO, PROBABLY OVER QUOTA ON "TAKE" OUTPUT.
	RET

;4-COLUMN NUMBER

NUM4:	MOVX B,NO%LFL!FLD(4,NO%COL)!<5+5> ;LEADING FILLER, 4 COLUMNS, DECIMAL
	CALLRET SYNUM

;PRINT FORMATTED NUMBER
;MAGNITUDE, LEADING FILLER, ERROR IF COLUMN OVERFLOW, 12 COLUMNS, DECIMAL

STAT5N:	MOVX B,NO%MAG!NO%LFL!NO%OOV!FLD(12,NO%COL)!FLD(5+5,NO%RDX)
;	CALLRET SYNUM		;PRINT NUMBER

;ROUTINE TO PRINT NUMBER FOR SYSTAT (COULD BE MADE MORE GENERAL!)
;ACCEPTS:	A/	NUMBER
;		B/	FORMAT, RADIX BITS PER NOUT SPECIFICATION
;RETURNS:	+1 ALWAYS, NUMBER OUTPUTTED TO COJFN

SYNUM:	MOVE C,B		;PUT FORMAT IN B
	MOVE B,A		;NUMBER IN B
	MOVE A,COJFN
	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
;SUBROUTINE TO READ SYSTEM TABLE WHOSE NAME IS IN A INTO AC'S 4-14.
;USED IN SYSTAT, ERRSTAT.

READT:	SETZ B,			;NORMAL ENTRY: START AT BEGINNING OF TABLE
MORET:	MOVE D,B		;ENTRY FOR TABLE INDEX IN B
	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,15		;STOP BEFORE OVERWRITING 15!
	AOBJN C,READT1		;END-OF-TABLE TEST AND LOOP
	SUB P,[XWD 1,1]
	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.

.TERNO::KEYWD $TERNO		;"NO". LOOK UP NEXT WORD.
	 0			;NO DEFAULT
	JRST CERR		;NULL ILLEGAL
	TLO Z,F1		;SAY NO
	JRST (P3)		;GO TO .FORMF, .TABS, OR .LOWER.

;LOW ORDER BIT POSITION OF TT%DUM

LB.DUM==<TT%DUM&-TT%DUM>

.LINE::	LDF C,<.TTLDX>*<LB.DUM>	;SET LINE HALF DUPLEX
	JRST SETDU		;DO SET DUPLEX

.FULLD::LDF C,<.TTFDX>*<LB.DUM>	;SET FULL DUPLEX
	JRST SETDU

.HALFD::LDF C,<.TTHDX>*<LB.DUM>
SETDU:	NOISE (MODE FOR TERMINAL)
	CONFIRM
SETDU1:	MOVEI A,.CTTRM
	RFMOD
	TXZ B,TT%DUM		;CLEAR ALL DUPLEX BITS
	IOR B,C			;SET THE DESIRED ONES
	STPAR			;SET NEW DUPLICITY
	RET

.FORMF::NOISE (EXISTS ON TERMINAL)
	LDF C,TT%MFF		;SET MECH FORMFEED BIT
	CALLRET CMOD		;CHANGE MODE WORD AND RETURN

.TABS::	NOISE (EXIST ON TERMINAL)
	LDF C,TT%TAB		;SET HARDWARE TABS BIT
	MOVE D,[POINT 2,(Q1),19] ;PTR TO ^I CCOC BYTE
	CALL CMOD		;CHANGE FILE MODE WORD
	JRST CCCOC		;CHANGE CONT. CHAR. OUTPUT CONT. WORDS
;PAGE MODE

.PAGE::	NOISE <MODE>
	DECX <Carriage return or page length>
	 JRST PAGE1		;NO NUMBER TYPED
	PUSH P,B		;A NUMBER SUPPLIED
	CALL PAGE1
	POP P,B
	JRST PLENT1

PAGE1:	CONFIRM
	CALL ..END		;DO BOTH "PAUSE (ON) END-OF-PAGE"
	CALLRET ..COMM		;AND "PAUSE (ON) COMMAND"

;TERMINAL PAUSE (ON)

.PAUSE::NOISE <ON>
	KEYWD $PAUSE
	 0
	 JRST CERR
	JRST (P3)		;DISPATCH

$PAUSE:	TABLE
	T CHARACTER,,..PPCH
	T COMMAND,ONEWRD,..COMM
	T END-OF-PAGE,ONEWRD,..END
	TEND
;SPECIFY PAGE PAUSE AND UNPAUSE CHARACTER

..PPCH:	TLNE Z,F1		;DID USER SAY "NO"?
	JRST [MOVEI Q1,23	;GET DEFAULTS. ^S
	      MOVEI A,21	;AND ^Q
	      JRST ..PPC1 ]	;AND FINISH UP
	MOVEI B,[FLDDB. .CMNUM,CM%SDH,^D8,<octal ASCII code for character>,,[
		 FLDDB. .CMKEY,,$PCHAR,,,[
		 FLDDB. .CMQST,CM%SDH,,<any printing character in double quotes>,,]]]
	CALL PPGETC		;GET THE CHARACTER TO PAUSE ON
	MOVEM A,Q1		;SAVE IT FOR LATER
	NOISE <AND UNPAUSE ON>
	MOVEI B,[FLDDB. .CMCFM,,,,,[
		 FLDDB. .CMNUM,CM%SDH,^D8,<octal ASCII code for character>,,[
		 FLDDB. .CMKEY,,$PCHAR,,,[
		 FLDDB. .CMQST,CM%SDH,,<any printing character in double quotes>,,]]]]
	CALL PPGETC		;GET SECOND CHAR
	SKIPGE A		;DEFAULTED?
	SKIPA A,Q1		;YES - MAKE IT THE SAME AS THE PAUSE CHARACTER
..PPC1:	CONFIRM			;ELSE CONFIRM
	MOVE C,A
	HRL C,Q1
	MOVEI A,.CTTRM
	MOVEI B,.MOPCS		;SET PAUSE AND UNPAUSE CHARACTERS
	MTOPR
	 ERCAL CJERRE
	RET

PPGETC:	CALL FLDSKP
	 ERROR <Invalid, %?>
	LOAD C,CM%FNC,.CMFNP(C) ;GET FUNCTION USED
	CAIN C,.CMQST		;ARBITRARY CHAR?
	JRST PPGTCC		;YES - RETURN IT
	CAIN C,.CMCFM		;CR?
	JRST PPGTCR		;YES - RETURN 0
	CAIN C,.CMNUM		;NUMBER?
	JRST PPGTCN		;YES - RETURN IT
	HRRZ B,0(B)		;MUST BE KEYWORD, GET DISPATCH ADDRESS
	HRRZ B,0(B)
	CALLRET 0(B)

PPGTCC:	LDB A,[POINT 7,ATMBUF,6] ;GOT AN ARBITRARY CHARACTER - RETURN IT
	RET
PPGTCR:	SETO A,			;GOT A CR - RETURN -1
	RET
PPGTCN:	SKIPLE A,B		;GOT A NUMBER, CHECK RANGE
	CAILE A,177
	ERROR <Invalid, not a legal ASCII code>
	RET
PCHCON:	MOVEI B,[FLDDB. .CMQST,CM%SDH,,<any printing character in doublequotes>,,]
	CALL FLDSKP
	 ERROR <Invalid, not a quoted string>
	LDB A,[POINT 7,ATMBUF,6] ;GET FIRST CHAR
	CAIL A,"a"		;RAISE LOWERCASE
	CAILE A,"z"
	TRNA
	SUBI A,40
	CAILE A,100		;CHECK RANGE
	CAILE A,137
	ERROR <Invalid, not a control character>
	SUBI A,100
	RET

PCHSPA:	MOVEI A," "		;USE 'SPACE' CHARACTER
	RET

$PCHAR:	TABLE
	T CONTROL,,PCHCON
	T SPACE,,PCHSPA
	TEND

..END:	MOVEI A,.CTTRM
	MOVEI B,.MOXOF
	MOVEI C,.MOONX		;ASSUME ON
	TLNE Z,F1		;"NO" ?
	MOVEI C,.MOOFF		;YUP, OFF
	MTOPR
	 ERCAL CJERRE		;GO SAY WHY IT FAILED
	RET

..COMM:	LDF C,TT%PGM
	JRST CMOD1		;GO CHANGE MODE
;IMMEDIATE ECHO MODE

.IMMED::NOISE <ECHO MODE>
	MOVEI C,TT%ECM
	JRST CMOD

;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::NOISE (EXISTS ON TERMINAL)
	LDF C,TT%LCA		;SET LOWER CASE AVAILABLE BIT
	JRST CMOD		;CHANGE FILE MODE WORD

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

.RAISE::NOISE (TERMINAL INPUT)
	LDF C,TT%LIC		;SET LOWERCASE INPUT CONTROL
	JRST CMOD

;FLAG UPPERCASE OUTPUT

.FLAG::	NOISE <UPPER CASE OUTPUT>
	LDF C,TT%UOC		;SET UPPERCASE OUTPUT CONTROL
	JRST CMOD

;[SET] TERMINAL [NO] INHIBIT (NON-JOB OUTPUT)
.INHIB::NOISE (NON-JOB OUTPUT)
	CONFIRM
	CALL RTTFLG		;RETURN EXISTING TERMINAL FLAGS
	 ERROR <The [NO] INHIBIT function is not implemented>
	TXO C,MO%NTM		;SET INHIBIT
	TLNE Z,F1		;GOT A "NO"
	 TXZ C,MO%NTM		;YES. TURN BIT OFF.
	MOVEI A,.CTTRM		;CONTROLLING TERMINAL
	MOVEI B,.MOSTF		;FUNCTION CODE FOR SETTING TERMINAL FLAGS
	MTOPR			;DO IT
	 ERCAL CJERRE
	RET
;TWO SUBROUTINES FOR TERMINAL CHARACTERISTICS COMMANDS

;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:	CONFIRM			;NO TTY COMMANDS CONFIRMED BEFORE HERE
CMOD1:	MOVEI A,.CTTRM
	RFMOD
	ANDCAM C,B		;IF NO, TURN OFF THE BITS
	TLNN Z,F1
	IORM C,B		;OTHERWISE, TURN THEM ON
	STPAR			;THESE ARE ALL TERMINAL PARAMETERS
	RET

;TERMINAL (TYPE OR FEATURE) IS
;NOTE: IF ADDING A NEW TERMINAL, SEE ALSO TTYPTB IN EXECIN

.TERMI::MOVEI B,[FLDDB. .CMNOI,,<-1,,[ASCIZ/FEATURE OR TYPE/]>,,,[
		 FLDDB. .CMNOI,,<-1,,[ASCIZ/MODE IS/]>]]
	CALL FLDSKP		;READ THE GUIDE WORDS
	 CMERRX
	MOVEI B,[FLDDB. .CMKEY,,$TERMI,,,[
		 FLDDB. .CMKEY,,$TTYP]]
	CALL FLDSKP
	 JRST CERR		;ERROR - NEITHER TYPE OF KEYWORD WAS TYPED
	CALL GETKEY		;CHANGE TABLE ADDRESS TO DISPATCH DATA
	JRST (P3)

;HELP FOR TERMINAL COMMANDS.

TTYHLP::CONFIRM
	MOVX A,GJ%OLD+GJ%SHT+GJ%IFG ;OLD FILE ONLY, SHORT FORM
	HRROI B,[ASCIZ/HLP:TERMINAL.HLP/]
	CALL GTJFS		;GET HANDLE ON HELP FILE
	 ERROR <No help available. The file HLP:TERMINAL.HLP was not found.>
	MOVEI Q1,CP%HEL		;SO "TYPE" LOGIC WILL KNOW IT'S US
	MOVE A,JBUFP		;GET POINTER TO JFN CELL
	HRRZM A,INIFH1
	HRRZM A,INIFH2		;COPY CODE NEEDS THIS
	JRST TYPE1		;FINISH COMMAND BY COPYING HELP FILE TO TERMINAL
;TERMINAL TYPE N OR <TYPE>
;Note: If adding a new terminal, see also TTYPTB in EXECCA

.TTYPE::MOVEI B,[FLDDB. .CMNUM,CM%SDH,5+5,<Terminal type>,<SYSTEM-DEFAULT>,[
		 FLDDB. .CMKEY,,$TTYP]]
	CALL FLDSKP
	 CMERRX			;NEITHER NUMBER OF KEYWORD TYPED
	LOAD D,CM%FNC,.CMFNP(C)	;GET DATUM TYPE
	CAIN D,.CMNUM		;NUMBER?
	JRST .TTYP1		;YES
	CALL GETKEY		;NO, KEYWORD, GET INFO
	JRST 0(P3)		;OK - DISPATCH
.TTYP1:	PUSH P,B
	JRST .TTY3

.T33::	PUSH P,[0]
	JRST .TTY3

.T35::	PUSH P,[1]
	JRST .TTY3

.T37::	PUSH P,[2]
	JRST .TTY3

.TI::	PUSH P,[3]
	JRST .TTY3

.DFLT::				;SYSTEM-DEFAULT TERMINAL TYPE
.TRMNT::PUSH P,[^D8]
	JRST .TTY3

.IDEAL::PUSH P,[.TTIDL]		;[4424] Here for TERMINAL IDEAL
	JRST .TTY3		;[4424] 

.VT05::	PUSH P,[^D10]
	JRST .TTY3

.VT50::	PUSH P,[^D11]
	JRST .TTY3

.VT52::	PUSH P,[^D15]
	JRST .TTY3

.LA36::	PUSH P,[^D14]
	JRST .TTY3

.LA38::	PUSH P,[.TTL38]
	JRST .TTY3
.LA120::PUSH P,[.TT120]
	JRST .TTY3

.VT125::PUSH P,[.TT125]
	JRST .TTY3

.VK100::PUSH P,[.TTK10]
	JRST .TTY3

.VT100::PUSH P,[.TT100]
	JRST .TTY3

.VT102::PUSH P,[.TT102]
	JRST .TTY3

.VT200::PUSH P,[.TT200]
	JRST .TTY3

.VT300::PUSH P,[.TT300] 	;[3055]
	JRST .TTY3		;[3055]

.VT131::PUSH P,[.TT131]
	JRST .TTY3

.VTH19::PUSH P,[.TTH19]
	JRST .TTY3

.LA30::	PUSH P,[^D12]
.TTY3::	CONFIRM
	POP P,B
	MOVEI A,.CTTRM
	STTYP
	 ERJMP [ERROR <Invalid terminal type>]
	RET
;WIDTH OF TERMINAL LINE

.LWIDT::NOISE (OF LINE IS)
	DECX <Terminal line width in decimal>
	 CMERRX
	CONFIRM
	MOVE C,B
	MOVEI A,.CTTRM
	MOVEI B,.MOSLW		;SPECIFY SETTING LINE WIDTH
	MTOPR			;DO IT
	 ERCAL CJERRE		;GO SAY WHY IT FAILED
	RET

;LENGTH OF TERMINAL PAGE

PLENTH::NOISE <OF PAGE IS>
	DECX <Length of page in decimal>
	 CMERRX
	CONFIRM
PLENT1:	MOVE C,B
	MOVEI A,.CTTRM
	MOVEI B,.MOSLL		;SPECIFY SETTING LENGTH
	MTOPR			;DO IT
	 ERCAL CJERRE		;FAILED, SAY WHY AND DIE
	RET
;INDICATE (FORMFEED)

.INDIC::NOISE (FORMFEED)
	CONFIRM
	TLZN Z,F1		;'NO'?
	TLO Z,F2
	MOVE D,[POINT 2,(Q1),25]
				;JRST CCCOC

;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 Q1,B
	CALL CCCOCS		;OPERATE ON CCCOC WORDS IN B,C
	MOVE A,COJFN
	SFCOC			;PUT NEW VALUE INTO EFFECT
	MOVEI Q1,ETTYMD+TTWCOC	;OPERATE ON STORED VALUES
	CALL CCCOCS
	MOVEI Q1,ITTYMD+TTWCOC

;SUBSUBROUTINE TO OPERATE ON BYTE IN WORDS Q1 POINTS TO

CCCOCS:	TLNE Z,F1
	SKIPA A,[3]		;3 = SIMULATE
	MOVEI A,2		;2 = SEND CODE
	TLNE Z,F2
	MOVEI A,1		;1 = INDICATE BY ^X
	DPB A,D
	RET
;SET TERMINAL SPEED

.SPEED::MOVEI	A,.CTTRM	;TO CURRENT TERMINAL
	MOVEI B,.CTTRM		;HIGHEST TERMINAL IN RANGE
SPEEDA::STKVAR <STERM,RTERM,<SPNBUF,3>>
	MOVEM A,STERM		;REMEMBER TERMINAL NUMBER
	MOVEM B,RTERM		;REMEMBER HIGHEST TERMINAL IN RANGE
	NOISE	<OF INPUT>
	KEYWD	$BAUDR		;BAUD RATE TABLE
	  0			;NO DEFAULT
	  JRST	CERR		;ERROR IF NONE GIVEN
	NOISE <AND OUTPUT>
	HRLZ	Q1,P3		;SAVE VALUE
	HRRZ B,P3		;USE INPUT FOR OUTPUT DEFAULT
	HRROI A,SPNBUF
	MOVEM A,CMDEF
	MOVEI C,5+5		;SPEEDS ARE DECIMAL
	NOUT			;SET UP DEFAULT STRING
	 CALL JERR		;SHOULD NEVER FAIL
	KEYWD $BAUDR		;READ OUTPUT SPEED
	 0			;DEFAULT ALREADY SET UP
	 CMERRX			;BAD OUTPUT SPEED SPECIFIED
	HRR Q1,P3		;FILL IN SELECTED OUTPUT SPEED
	CONFIRM
	MOVE A,STERM		;TERMINAL NUMBER TO START WITH
SPEEDB:	MOVEI B,.MOSPD		;FCN CODE
	MOVE C,Q1		;PICK UP SELECTED SPEEDS
	MTOPR			;C := INPUT,,OUTPUT
	 ERCAL CJERRE		;FAILED, TELL USER WHY
	AOS A,STERM		;INCREMENT TERMINAL NUMBER
	CAMG A,RTERM		;STILL IN RANGE?
	JRST SPEEDB		;YES, SET NEXT TERMINAL
	RET			;NO, RETURN

$BAUDR:	TABLE
	T 0,,0
	T 110,,^D110
	T 1200,,^D1200
	T 134,,^D134
	T 150,,^D150
	T 1800,,^D1800
	T 200,,^D200
	T 2400,,^D2400
	T 300,,^D300
	T 4800,,^D4800
	T 50,,^D50
	T 600,,^D600
	T 75,,^D75
	T 9600,,^D9600
	TEND
;ROUTINE TO PRINT SYSTEM-MESSAGES THAT HAVEN'T BEEN PRINTED

PNTMES::
	SKIPE MESMSF		;MAIL CHECK YET?
	 CALL MESMES		;PUT OUT "YOU HAVE A MESSAGE" IS NECESSARY
	AOSE SYSMF		;YES, SO MAYBE TIME TO PRINT SYSTEM MESSAGES
	RET			;THEY'VE ALREADY BEEN PRINTED
	MOVE A,LOGDAT		;THEY HAVEN'T, GET LOGIN DATE.
	CALL MESS		;TYPE APPLICABLE LOGIN MESSAGES
	RET

;CODE TO USE RDMAIL TO TYPE <SYSTEM>MAIL.TXT
MESS:	STKVAR <MALJFN,SJFNP,MSFK>	;CELLS TO HOLD JFNS WE'LL USE
	MOVE A,.JBUFP		;GET CURRENT JFN STACK POINTER
	MOVEM A,SJFNP		;SAVE IT FOR RESTORATION LATER
	MOVE A,FORK		;SAVE CURRENT FORK
	MOVEM A,MSFK
	SETOM FORK		;FORCE NEW FORK BELOW
	MOVE A,JBUFP
	MOVEM A,.JBUFP		;MARK STACK SO RLJFNS DOESN'T CLOSE THINGS OUR CALLER OPENED
	HRROI B,[ASCIZ /POBOX:<SYSTEM>MAIL.TXT/]
	CALL TRGTV1		;TRY TO ASSIGN JFN TO FILE
	 JRST SYSLEV		;NO SUCH FILE
	MOVE B,[XWD 1,.FBSIZ]
	MOVEI C,C
	CALL $GTFDB		;GET # BYTES IN FILE
	 JRST SYSMDO		;LET RDMAIL FIGURE IT OUT
	JUMPLE C,SYSLEV		;THERE'S NO MESSAGE IF FILE IS NULL
	MOVE B,[XWD 1,.FBWRT]
	MOVEI C,C
	CALL $GTFDB
	 JRST SYSMDO
	CAMGE C,LOGDAT		;HAS FILE BEEN WRITTEN SINCE LAST LOGIN?
	JRST SYSLEV		;NO
SYSMDO:	HRROI B,[GETSAVE(SYS:RDMAIL.)]
	CALL TRYGTJ
	 JRST SYSLEV		;LEAVE IF NO SUCH PROGRAM
	MOVEM A,MALJFN
	SETO C,			;FORCE OVERLAY
	CALL $GET2		;GET RDMAIL INTO IT
	MOVE A,FORK		;GET FORK HANDLE
	CALL JFNSTK		;STACK IT SO IT GOES AWAY LATER
	GEVEC			;GET ENTRY VECTOR POINTER
	HLRZ A,B
	CAIGE A,3		;MUST BE AT LEAST 3
	JRST SYSLOS		;LOSE
	ADDI A,-1(B)		;USE ENTRY -1 FROM LAST
	CALL LOADF		;READ IT
	 JRST SYSLOS		;CAN'T READ IT
	HRRZ C,A		;SAVE STARTING ADDR
	HLRZ A,A		;GET POINTER TO WHERE TO STORE DATE AND TIME
	MOVE B,LOGDAT		;GET DATE AND TIME
	CALL STOREF		;STORE IT
	 JRST SYSLOS 		;CAN'T SET IT
	SETO A,
	CALL MAPPF		;FREE MAPPED PAGE
	 JFCL			;UNMAP SHOULD NEVER FAIL
	MOVEI Q1,ETTYMD		;SAVE EXEC TTY MODES
	CALL RTTYMD
	TLO Z,RUNF
	MOVE B,C		;START ADDR IN B
	MOVE A,FORK		;SET UP AS RUNNING FORK
	SFORK			;START FORK HERE FOR SYSTEM MESSAGE
	RFORK			;RESUME IT
	WFORK			;WAIT FOR IT
SYSLEV:	SKIPL A,FORK		;GET RID OF TEMP FORK
	CALL KEFORK
	CALL RLJFNS		;CLOSE FILES WE USED
	MOVE A,SJFNP		;GET JFN STACK MARKER AS BEFORE WE TOUCHED IT
	MOVEM A,.JBUFP		;RESTORE IT
	MOVE A,MSFK		;RESTORE CURRENT FORK
	MOVEM A,FORK
	TLZ Z,RUNF		;SAY PROG'S TTY MODES NOT IN EFFECT
	MOVEI Q1,ETTYMD		;RESTORE EXEC'S TTY MODES
	CALL LTTYMD		; ..
	RET
SYSLOS:	ETYPE <%_%%%Error while reading system message -  %?%%_>
	JRST SYSLEV
;[7.1076]
;NODCHK - Called when SYSTAT is getting ready to do a job. First we
;must check to see if the job is local or if we must force SYSTAT
;to obtain the information from another system in the cluster.
;
; Called wtih:
;	A/ Job number
;	CALL NODCHK
;
; Returns:
;	+1 - Job not logged into any node
;	+2 - Job logged in with CURNOD, CURNDN, INFSYS and F4 setup
;
;Must clobber no ACs except Z!!!

NODCHK:	SAVEAC <A,B,C,D,Q2,Q3,P1,P2> ;Preservation here
	STKVAR <JOB>		;Temp storage
	TLZ Z,F4		;Say job is local until otherwise discovered
	TXNN Q1,SY%NOD		;User say node?
	RETSKP			;No, so everything is local
	MOVEM A,JOB		;Save job number for later useage
	MOVEI A,CFGBLK		;[7.1089] Node names are in here
	MOVE A,1(A)		;[7.1089] Here's the local node name
	MOVEM A,CURNOD		;[7.1089] This is the name by default
	SKIPE JOB		;[7.1089] Do we have a non-zero job?
	IFSKP.			;[7.1089] If job 0,
	  SKIPE P1,SYJOBM	;[7.1139] Get SYSJOB mask
	  IFSKP.		;[7.1139] If there isn't one, do what we always did
	    MOVEI A,CFGNOD	;[7.1089] This is where the node numbers are
	    HLRZ A,1(A)		;[7.1089] Get our node number
	    MOVE A,BITS(A)	;[7.1089] This is the bit setting for our node
	    TDNN A,NODMSK	;[7.1089] Is our node in this mask
	    RET			;[7.1089] No, then say job not found
	    RETSKP		;[7.1089] Job 0 is always local
	  ENDIF.		;[7.1139]
	  JFFO P1,.+1		;[7.1139] Get bit setting
	  MOVE A,BITS(P2)	;[7.1139] Get bit for this node
	  ANDCAM A,SYJOBM	;[7.1139] Clear it. We only want this SYSJOB once
	  JRST NODC15		;[7.1139] We know it exists, get information
	ENDIF.			;[7.1089]
	MOVE P1,NODMSK		;Here's the node mask
	DO.			;Loop over CI nodes
	  JFFO P1,NODCH1	;Get a bit
	  EXIT.			;If no more, then we are done
NODCH1:	  MOVE A,BITS(P2)	;Get the bit setting we jumped on
	  TDZ P1,A		;Clear this one
	  SKIPN A,JRCASH(P2)	;Get job range for this node
	  JRST TOP.		;[7.1089] We have no range, do next node
	  HLRZ Q2,A		;Get min job
	  HRRZ Q3,A		;Get max job
	  CAMLE Q2,JOB		;Too small?
	  JRST TOP.		;Yes, too small
	  CAMGE Q3,JOB		;Or in range?
	  JRST TOP.		;If not, then try another node
NODC15:	  SETZ Q2,		;[7.1139] Here's our counter through the CNFIG% tables
	  DO.			;Now set up CURNOD and CURNDN
	    AOS Q2		;Bump this up
	    HLRZ A,CFGNOD(Q2)	;Get node number
	    CAME A,P2		;Is this the one we are looking for?
	    JRST TOP.		;If not, try the next one
	  ENDDO.
	  MOVEM P2,CURNDN	;Save CI node number
	  MOVE A,CFGBLK(Q2)	;Get byte pointer to node name
	  MOVEM A,CURNOD	;And save for other routines
	  CAIN Q2,1		;Is it the local node?
	  RETSKP		;Yes, let everyone else do the work
	  TLO Z,F4		;No, tell everyone else to use INFO%
	  CALL ZERSYS		;(/) Zero out SYSTAT data area
	  MOVEI A,INFBLK	;And get the job information now
	  MOVEM P2,.INCID(A)	;[7.1089] This is the CI node
	  MOVEI B,INFSYS	;Here's the SYSTAT block
	  SETZM .SYJCT(B)	;[4412] Clear this in case we don't get something
	  HRROI C,UNAME		;User name goes here
	  MOVEM C,.SYUSR(B)	;Make sure JSYS knows
	  HRROI C,DIRN		;Connected directory name here
	  MOVEM C,.SYDIR(B)	;Tell JSYS
	  HRROI C,ORGN		;Job origin here
	  MOVEM C,.SYORG(B)	;Save
	  MOVEM B,.INAC1(A)	;Here's the SYSTAT block
	  MOVE B,[.INSYS,,INFLEN] ;Do this function
	  MOVEM B,.INFUN(A)	;Save function
	  MOVE B,JOB		;Here's the job number
	  MOVEM B,.INAC2(A)	;Save job number
	  INFO%			;Get job information
	   ERJMP CJERR		;Darn crashing nodes
	  TXZN A,IN%RER		;[7.1089] Did job go away?
	  RETSKP		;[7.1089] No, we are done
	  TLZ Z,F4		;[7.1089] Yes, show no remote job found yet
	  JRST TOP.		;Continue
	ENDDO.
	RET			;Could not find a remote node to use

	ENDSV.
;[7.1076]
;ZERSYS - This routine is called to zero out the words used by the
;INFO% JSYS' SYSTAT function. This will ensure no left over stuff
;
; Call with:
;	No arguments
;	CALL ZERSYS
;
; Returns:
;	+1 - Always, with UNAME, DIRN, ORGN all zeroed out
;
;Clobbers nothing

ZERSYS:	SAVEAC <A,B>		;Be neat
	SETZM UNAME		;Smash user name area
	MOVE A,[UNAME,,UNAME+1]	;Now do whole block
	BLT A,UNAME+7		;Zero it out
	SETZM DIRN		;Now blow out connected directory name
	MOVE A,[DIRN,,DIRN+1]	;Prepare for whole block
	BLT A,DIRN+20		;Do it
	SETZM ORGN		;Last is origin name
	MOVE A,[ORGN,,ORGN+1]	;Get ready
	BLT A,ORGN+20		;Get set, and go
	RET
;[7.1089]
;CSHJOB - Routine to put job range of each system in the cache table
;
; Call with:
;	NODMSK setup
;	CALL CSHJOB
;
; Returns:
;	+1 - Always with JRCASH setup

CSHJOB:	SAVEAC <P1,P2>		;Save these
	STKVAR <NODBIT>		;[7.1100] Save node bit we are working on
	SETZM JRCASH		;Init this to all zeroes
	MOVE A,[JRCASH,,JRCASH+1] ;Start with this
	BLT A,JRCASH+17		;Now zero out the table
	MOVEI A,INFBLK		;INFO% block is here
	MOVE B,[.INCIN,,INFLEN]	;This is the function
	MOVEM B,.INFUN(A)	;Save function
	MOVEI B,INFCIN		;Put CI nodes here
	MOVEM B,.INAC1(A)	;Tell JSYS
	INFO%			;Get CI nodes
	 ERJMP CJERR		;Failure
	SETZ P1,		;Our loop counter
	HLRZ P2,CFGNOD		;Our loop fence
	DO.
	  AOS P1		;Do the first CI node
	  HLRZ A,CFGNOD(P1)	;Get me a CI node number
	  MOVE C,BITS(A)	;Get its bit setting
	  TDNN C,NODMSK		;Is this node in our mask?
	  JRST CSHJB1		;No, next node
	  MOVEM C,NODBIT	;[7.1100] Hold the bit for now
	  MOVE B,INFCIN		;Get count
	  DO.			;See if this node is doing INFO%
	    SOSG B		;Done checking?
	    IFSKP.		;Nope,
	      CAMN A,INFCIN(B)	;Is this the node we want?
	      EXIT.		;If so, good, he is doing INFO%
	      JRST TOP.		;Not done checking yet
	    ENDIF.
	    TXNE Q1,SY%NJB	;[7.1100] NODPRT going print name?
	    IFSKP.		;[7.1100] If not,
	      CALL NOINF	;[7.1100] (A/) Then do it now
	      MOVE C,NODBIT	;[7.1100] And clear node setting
	      ANDCAM C,NODMSK	;[7.1100] Don't try things on this node
	    ENDIF.		;[7.1100]
	    JRST CSHJB1		;So ignore it and try others
	  ENDDO.
	  MOVEI B,INFBLK	;Get JSYS block
	  MOVEM A,.INCID(B)	;Save the node number
	  MOVEI A,INFBLK	;Block goes here for JSYS call
	  MOVE B,[.INGTB,,INFLEN] ;Get active job range
	  MOVEM B,.INFUN(A)	;Do this function
	  MOVE B,[56,,.SYSTA]	;Get active job range
	  MOVEM B,.INAC1(A)	;Put in JSYS block
	  INFO%			;Get active job range
	   ERJMP CJERR		;Report failure
	  MOVE B,.INAC1(A)	;Here's the active job range
	  MOVE A,.INCID(A)	;Get node number back
	  MOVEM B,JRCASH(A)	;Save in cache table
CSHJB1:	  CAME P1,P2		;Have we done enough?
	  JRST TOP.		;No
	ENDDO.
	RET			;Done
;[7.1100]
;CHCLAS - Routine to see if any machine in the node mask is running
;class scheduling. If no machines are running class scheduling, then
;it is relatively useless to display the class scheduling stuff.
;
; Call with:
;	NODMSK setup in the SYSTAT TRVAR
;	CALL CHCLAS
;
; Returns:
;	+1 - No machines in the node mask have class scheduling turned on
;	+2 - At least one machine is running class scheduling
;
;Clobbers nada

CHCLAS:	SAVEAC <A,B,C,D>	;Save bashed things
	STKVAR <<SKDBLK,3>>	;SKED% JSYS block and return flag
	MOVE C,NODMSK		;Get node mask
	DO.			;Loop over each node
	  JFFO C,CHCLS1		;Get a bit setting
	  EXIT.			;No more nodes, done
CHCLS1:	  MOVE A,BITS(D)	;Get bit setting for node we are checking
	  TDZ C,A		;Zero it in our loop indicator
	  MOVEI A,INFBLK	;Here's our INFO% block
	  MOVEM D,.INCID(A)	;Save node number we are checking
	  MOVE B,[.INSKD,,INFLEN] ;Want to do SKED% function
	  MOVEM B,.INFUN(A)	;Save in argument block
	  MOVEI B,.SKRCV	;Read class scheduling stuff
	  MOVEM B,.INAC1(A)	;Save in arg block
	  MOVEI B,3		;SKED% block is 3 words long
	  MOVEM B,SKDBLK	;Stash length in SKED% block
	  MOVEI B,SKDBLK	;Here is the SKED% block
	  MOVEM B,.INAC2(A)	;Show JSYS where
	  INFO%			;Get remote class scheduling setting
	   ERJMP TOP.		;Ignore error
	  TXNE A,IN%RER		;Remote error?
	  JRST TOP.		;Yes, assume no class scheduling
	  MOVE A,.SACTL(B)	;Get setting as returned by remote
	  TXNE A,SK%STP		;Class scheduling on?
	  IFSKP.		;[7.1140] If so,
	    MOVE A,BITS(D)	;[7.1140] Get bit setting
	    IORM A,CLSMSK	;[7.1140] And note this system is doing class scheduling
	  ENDIF.		;[7.1140]
	  JRST TOP.		;No, check another node
	ENDDO.
	SKIPE CLSMSK		;[7.1140] Anyone doing class scheduling?
	RETSKP			;[7.1140] Someone was...
	RET			;No one is running class scheduling
;[7.1100]
;NOINF - This routine is called when we have determined that a node
;is not supplying information for SYSTAT. It may be called from NODPRT
;or from CSHJOB depending on whether or not the system header appears
;in the SYSTAT.
;
; Call with:
;	A/ Node not doing information
;	CALL NOINF
;
; Returns:
;	+1 - Always, with " NODE %Information unavailable" displayed
;
;Clobbers lots

NOINF:	HLRZ B,CFGNOD		;Get our loop counter
	DO.
	  SOSG B		;Done checking for node name?
	  IFSKP.		;If not,
	    HLRZ C,CFGNOD(B)	;Get the node number of this system
	    CAME A,C		;Is this the one?
	    JRST TOP.		;No, do next node
	    MOVE A,CFGBLK(B)	;This is the node we want
	    PRINT " "		;Make first column a space
	    MOVEI B,6		;Make sure we do 6 characters
	    DO.			;Do the characters
	      ILDB C,A		;Get a character
	      ETYPE <%3\>	;Do a character
	      JUMPE C,ENDLP.	;Null? Yes, fill in remaining spaces
	      SOJG B,TOP.	;Keep doing characters
	    ENDDO.
	    IFG. B		;More characters to do?
	      DO.		;Print them out
	        PRINT " "	;Here's a space
	        SOJG B,TOP.	;Do more
	      ENDDO.
	    ENDIF.
	    ETYPE < %%Information unavailable%_>
	  ENDIF.
	ENDDO.
	RET
;[7.1137]
;CHKWLD - This routine is called after SYSTAT has parsed some flavor
;of username. The username is left in ATMBUF by that marvelous JSYS
;called COMND%. This routine checks to see if the string returned in
;the atom buffer is wildcarded.
;
; Call with:
;	ATMBUF setup via COMND%
;	CALL CHKWLD
;
; Returns:
;	+1 - Failure, string does not contain wild card character
;	+2 - Success, string in ATMBUF is wild
;
; Bashes no ACs and let's keep it that way!

CHKWLD:	SAVEAC <A,B,C>		;We are keeping it that way
	MOVX A,RC%AWL		;Allow wild card characters
	HRROI B,ATMBUF		;Check out that atom buffer
	RCUSR%			;Valid user?
	 ERJMP CJERR		;Shouldna happen, captain
	TXNN A,RC%WLD		;Verdict: was there a wild card character?
	RET			;No ther wasn't
	RETSKP			;Yes there was
	END