Google
 

Trailing-Edge - PDP-10 Archives - bb-d549g-sb - systat.mac
There are 8 other files named systat.mac in the archive. Click here to see a list.
SUBTTL R CLEMENTS /CHW/TNH/PFC/RCC/CMF/SML/JMF/TCK/JNG/JMT/PMW/MTH/KPY/ISM/BBE/WCL 9-MAY-80
VSYSTAT==475
VEDIT==261
VMINOR==0
VWHO==0


;COPYRIGHT (C) 1968,1979,1980 BY
;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;
;
;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 WHICH IS NOT SUPPLIED BY DIGITAL.



DEFINE	.TITL(VMAG,VMIN)<
TITLE	SYSTAT -- PRINT SYSTEM STASTICS -- V VMAG(VMIN)
>
	.TITL	(\VSYSTAT,\VEDIT)
;EDIT HISTORY

;EDIT LEVEL 27  TO LEVEL 30

;EDIT #1
;SY P PRINTED WRONG NUMBER OF FREE BLOCKS 

;EDIT LEVEL 30 TO LEVEL 31

;EDIT #2

;THE NUMBER OF EXTENDED READ AND WRITES IS WRONG FOR A MONITOR
;WITH FTVM OFF

;EDIT #3

;ONLY PRINT FANCY RESPONSE DATA WHEN FTRSP IS ON

;EDIT #4

;NO NEW ACCESSSES ALLOWED IS PRINTED ON VM MONITORS
;FOR RANDOM FILE STRUCTURES WHENEVER SYS IS TYPED,SYS F IS OAKY

;EDIT #5

;SPOOLED DEVICES SHOULD BE LISTED ON THE OPERATOR SYSTAT LIST
;FLAGGED WITH A ' SIGN .THIS DID NOT HAPPEN AS SPOOLED DEVICES
;DO NOT HAVE DVDSK ON IN DEVMOD DDB ENTRY.SO USE THE PROPER FLAG
;IN DEVSPL DDB ENTRY

;EDIT #6

;REPORT OF SWAPPING SPACE LOST IS TOO HIGH 3 MORE BITS HAVE TO BE
;ZEROED IN DATA PRINTED

;EDIT #7

;ONE MORE OCCURRENCE OF A WRONG UDB INDEX FOR VM SYSTEMS

;EDIT #8

;WARN USERS THAT NO OPERATOR IS ON DUTY (SPR 10,12,962)

;EDIT #9

;ADD P OR K TO AVERAGE SIZE PRINT OUT

;EDIT 10

;IF CONTROL C INTERRUPT THEN DO NOT TYPE HACK TABLE ENTRY BUT EXIT

;EDIT 11

;LOGICAL NAMES OF JOB ONER ARE NOT DISPLAYED

;EDIT 12

;SYS LEF PRODUCES AN EMPTY FILE

;EDIT 13

;SYS ...... MAKES SYSTAT GROW

;EDIT 14

;THE RIGHT TO WRITE SYSTAT.TXT IS NOT CHECKED

;EDIT 15

;/X BROKE DUE TO EDIT 13 RESET UUO!

;EDIT 16

;SPOOLING A CONTINUOUS SYSTAT TEXT RESULTS IN I/O TO AN UNASSIGNED CHANNEL
;DUE TO EDIT 12

;EDIT 17

;REENTER OPTION WAS BROKEN

;EDIT 18

;SYS XL FILE SPEC CAUSED THE MESSAGE CAN'T GET AT THAT FILE
;MAKE SYSTAT MORE CLEVER.

;EDIT 19

;SYSTAT CAN EAT TYPE AHAED 

;EDIT 20

;LOW SEGMENT SIZE OF PROGRAMS WITH SHARABLE
;HISEG IS WRONG

;EDIT 143

;MAKE EDIT NUMBER EQUAL REVISION HISTORY.
;USE C AS A UNIVERSAL.

;EDIT 144

;RESTRICT SYSTAT L WHEN NOT-LOGGED-IN TO LOCAL TTYS OR SUBJOBS OF
;PROJECT 1. [10-13028]

;EDIT 145

;MAKE SYSTAT EASIER TO ^C, AND ALLOW CONTINUES IF LOGGED IN.

;EDIT 146

;CLEAR .UXTRM OFFSET FROM A GETLCH TO AVOID "SY ." PROBS. [14434]

;EDIT 147

;SHOW BUSY DEVICES WHEN WILD PPN REQUESTED [10-14317]

;EDIT 150

;ALLOW COMMENTS ON THE SYSTAT COMMAND LINE [10-14543]

;EDIT 151

;FIX "SYSTAT OCL", BROKEN BY EDIT 145

;EDIT 152

;STARTING WITH LOAD 722 KNOW OF NEW NUMTAB FORMAT

;EDIT 153

;BELIEVE IN NEW DDB ENTRY DEVJOB FOR 722

;EDIT 154

;UPDATE DEVFIL PART OF DDB'S TO USE LENGTH OF SHORT DDB'S

;EDIT 155

;USE TRMNO. UUO FOR NON TOPS10 MONITORS,WHICH KNOW THE TRMNO.

;EDIT 156

;THE SEQUENCE : .ASS DSK LPT   SYS /L/X
;GIVES AN ILLEGAL UUO

;EDIT 157

;REPLACE ALL DDB OFFSETS BY A SYMBOL DV.XXX TO PREVENT DUPLICATING
;OF UUO NAMES

;EDIT 160

;NEVER USE A ZERO UPTIME TO COMPUTE PERCENTAGES

;EDIT 161

;DISK ERRORS ARE REPOTED WRONG FOR A CRASH FILE

;EDIT 162

;PRINT SYSTEM HEADER ASAP ON A /X AS THIS SAVES CONSIDERABLE
;TIME IF ONE LOOKS AT THE WRONG CRASH

;EDIT 163

;SUBTRACT THE MONITOR HIGH SEGSIZE FROM THE CORE SIZE

;EDIT 164

;ADD SUPPORT FOR READING EXE CRASHES

;;EDIT 166	(16236)

;;ADD SWAPPING SPACE LOST MESSAGE
;;AREAS AFFECTED: MUS3

;EDIT 167  (16461)

;INCREASE REMOTE STATION LOOP RESTRICTION

;edit 170  (15261)

;typing continue after running systat gives a logged in user the
;message "kjob"

;edit 171

;thisis uses the variable date to print the date this varible is 
;not initialized on a sys x command

;edit 172

;the vlalue of unixra was changed in 602 causing extended writes
;and reads column to be wrong

;edit 173

;ignore all structures and packs with zero mount count pack not mounted
;pack off line and zero reads and writes

;EDIT 174

;MAKE SYSTAT X GIVE ERROR MESSAGE FOR NON-DISK DEVICES

;EDIT 175

;USE UNIVERSAL JOBDAT FILE

;EDIT 176

;REMOVE SYSTEM 124 FROM IN-HOUSE LIST; IT'S BEEN SOLD.

;EDIT 177

;MAKE /X GIVE PROPER TIME FOR 50HZ COUNTRIES

;EDIT 200

;MAKE CONTINUOUS SYSTATING REMEMBER THE ARGUMENTS GIVEN IN
;THE COMMAND. THE COMMAND LINE IS NOW READ INTO A BUFFER SO
;THE COMMAND CAN BE REREAD ON EACH PASS THROUGH.

;EDIT 201

;TIME CALCULATION @ERRLY1 USES DECIMAL 60 EXPLICITLY RATHER
;THAN TCKSEC, THUS 50 HZ. COUNTRIES GET BAD TIMES !

;EDIT 202

;SYSTAT E TRIES TO DETERMINE STOPCD TYPE BY FOLLOWING ADDRESS
;IN %SYSPC. UNFORTUNATELY THIS PRODUCES AN ?ILL MEM REF IF
;SPYING SINCE %SYSPC POINTS INTO HIGH SEGMENT OF MONITOR.
;MAKE IT DO A PEEK INSTEAD FOR THE RUNNING MONITOR AND ONLY
;PRINT STOPCD NAME FOR A CRASHED MONITOR.

;EDIT 203

;THIS EDIT CHANGES THE ROUTINE GETFIL TO USE FILOP. TO OPEN
;THE CRASH FILE ON A .SYS X SO THAT PRIVILEGE CHECKING FOR
;FILE ACCESS IS DONE CORRECTLY. PREVIOUSLY A CHKACC WAS PERFORMED
;WHICH CORRECTLY CHECKED THE FILES PROTECTION, HOWEVER IT DOESN'T
;CHECK THE UFD PROTECTION. IN FACT, THERE IS NO CHKACC FUNCTION TO
;SEE IF ACCESS TO FILES IN A UFD IS ALLOWED. IF THE FILOP. IS NOT
;IMPLEMENTED, THE FORMER METHOD WILL BE USED, AND ONLY THE FILE
;PROTECTION WILL BE CHECKED BEFORE ALLOWING ACCESS.

;EDIT 204

;MAKE SYSTAT REPORT "TIMESHARING IS OVER" WHEN IT CHECKS
;KSYS AS IT DOES WHEN IT REPORTS "TIMESHARING WILL END IN ...".

;EDIT 205

;WHEN DOING .SYS F  DON'T PRINT BLANK STRUCTURES.

;EDIT 206

;BUSY DEVICE INFORMATION ON SYSTATS OF CRASHED MONITORS IS
;INCORRECT IF THE DDB FORMAT OF THE CRASHED MONITOR IS DIFFERENT
;THAN THAT OF THE RUNNING MONITOR.
;ON SYSTATS OF CRASHED MONITORS, THE MONITOR VERSION SHOULD BE GOTTEN
;FROM THE CRASH FILE. ITS NOW GOTTEN FROM THE RUNNING MONITOR BECAUSE
;IT IS DETERMINED AT INITIALIZATION TIME BEFORE WE KNOW WHETHER
;THIS IS A .SYS X OR A SYSTAT OF THE RUNNING MONITOR.  ALSO,
;FOR THE SAME REASON WHEN DETERMINING THE DISK DDB SIZE AND
;BUILDING THE DDB POINTERS, THE VALUE IS GOTTEN FROM THE RUNNING
;MONITOR RATHER THAN FROM THE CRASH FILE.
;AREA AFFECTED: DSKJN1

;EDIT 207

;EDIT #200 BROKE THE REENTER FEATURE OF SYSTAT SUCH THAT IF
;YOU TYPED REENTER, SYSTAT WOULD CONTINUALLY LOOP. THIS IS
;BECAUSE THE INPUT BUFFER IS NEVER CLEARED AFTER READING
;COMMAND INTO BUFFER.
;AREA AFFECTED: RDCMND

;EDIT 210
;IF PAGED OUTPUT IS REQUESTED, YOU TYPE ^C AS RESPONSE TO THE
;PROMPT, AND YOU'RE NOT LOGGED IN, THE "KJOB" MESSAGE IS NOT TYPED.
;AREA AFFECTED: HICCUP

;EDIT 211
;ADD STATISTICS REPORT FOR DUAL PORTED RPO4'S

;EDIT 212
;FIX SHORT DDB PROBLEM  [.DVDAT, DEVLP]



;EDIT 213
;FIX TYPE-AHEAD PROBLEM CAUSED BY EDIT 207'S FIX TO EDIT 200


;EDIT 214  /PMW  10 MAR 77
;IN RDCMND
;TEST FOR FULL INPUT BUFFER

;EDIT 215  /PMW  10 MAR 77
;AT GETFIL+1
;MODIFY EDIT 203 <USE FILOP. FOR CRASH.EXE> TO USE PRIVILEGED FILOP.
;SO [1,2] AND JACCT JOBS  GET FULL ACCESS.

;EDIT 216
;SYS C G <JOB NUMBER> ZEROED OUT CPU TIME FOR THE JOB GIVING
;THE WRONG CPU TIME FOR THE JOB AND INCREASING THE IDLE TIME
;REPORTED BY THE SYSTEM.
;AREA AFFECTED: TSTATE
;EDIT 217	/PMW  5 APR 77
;MODIFY EDIT 215 SUCH THAT ONLY 1,2 JOBS GET ACCESS TO CRASH.EXE

;EDIT 220	/PMW  5 APR 77
;MODIFY EDIT 144 SUCH THAT NOT-LOGGED-IN JOBS CAN'T GET LPT
;	(UNLESS 1,2 SUBJOBS)

;EDIT 221	MTH  21-JUN-77
;SYS C <ARGS> WAS DOING INCREMENTAL SYSTATS ON THE REPETITIONS
;OF THE COMMAND LINE. FIX IT TO ACT LIKE ORIGINAL START UP, EXCEPT
;THAT COMMAND LINE HAS ALREADY BEEN SAVED AWAY.
;AREAS AFFECTED: SNOOZ1, CMDBUF

;EDIT 222	MTH 21-JUN-77
;REPLACE EDIT 217 FIX BECAUSE "SYSTAT O" SETS FL.GOD AND ANY
;RANDOM USER WHO USED THIS WOULD GET THE FILOP. PRIV BIT.
;AREA AFFECTED: GETFIL

;EDIT 223	MTH 27-JUN-77
;CONTINUOUS STUFF IS DONE INCORRECTLY FOR PARTICULAR ARGUMENTS
;COMPUTE UPTIME IMMEDIATELY AFTER COMMAND DECODING
;FLAG ONCE THROUGH IN HACKQ. DON'T ALWAYS DO CLRBFI'S.
;UNDO EDIT 216, IT CAUSED OUTRAGEOUS %CPU TIMES WITH "REENTER"
;AREAS AFFECTED:.DVDAT,GENSTS,DUNJOB,FINIS,HACKQ,RDCMND,OLDTIM,
;	SYSINI,GENST1,GENST5,GENST7,TSTATE

;EDIT 224	KPY 20-FEB-78
;FIX 5.03 OR LATER UNIT ERROR INFO ROUTINE
;UNI2ND SHOULD BE INDEXED BY D.
;AREAS AFFECTED: DP AT FLUNN0+4
;C FILE SYMBOLS WHICH ARE OVERRIDDEN


;EDIT 225	PG 30-MAR-78
;PPN'S MUST HAVE NON-ZERO PROJECT NUMBERS
;AREAS AFFECTED: GETPPN


;EDIT 226	ISM 19-APR-78
;FIX "SY P" TO REPORT ON ALL THE STRUCTURES MOUNTED ON THE SYSTEM, 
;ESPECIALLY THOSE BEYOND A STRUCTURE DATA BLOCK WITH A NULL NAME.
;
;EDIT 227	ISM	6-9-78	IF "SYSTAT C" IS GOING TO DISK,
;MAKE IT UPDATE THE FILE IN APPEND MODE.
;
;EDIT 230	ISM	6-26-78		CREATE A SUBROUTINE TO SIMULATE
;THE CTLJOB UUO WHEN SYSTATING A CRASH FILE.
;
;EDIT 231	ISM	7-12-78		NOT ENOUGH BITS USED TO DETERMINE
;ACTIVE SWAPPING STATISTICS IN "SYSTAT P". USED TO BE 2**12, CURRENTLY 2**13.
;
;EDIT 232	KPY 31-JUL-78
;	1)  AT GETFIL + 2 USE [1,,2] NOT FSFPPN SINCE THE LATTER IS NOT SETUP
;	AT THIS POINT.
;	2)  AT GETFIL + 3 REPLACE 400000 WITH FO.PRV.
;BEGIN VERSION 474 HERE WITH 7.00 UPDATE
;EDIT 233
;	REMOVE THE /R SWITCH SINCE IT HAS NEVER WORKED WITH
;	NETWORKS.
;EDIT 234
;	UNI2ND HAS A NEW FORMAT TO INDICATE A DRIVE IS DUAL
;	PORTED ACROSS CPU'S.  MAKE THE SYS P CODE KNOW ABOUT IT.
;EDIT 235
;	PRINT DISK DDB'S IN THE BUSY DEVICE CODE IFF WE ARE READING
;	A CRASH FILE OR FOR A USER'S OWN JOB.  SINCE THE DDB'S ARE
;	NOW IN FUNNY SPACE THEY CANNOT BE RELIABLY READ FOR ANY JOB
;	BUT OUR OWN.
;EDIT 236
;	HIGH AND DORMANT HIGH SEGS CAN NOW HAVE POINTERS TO PATH
;	BLOCKS.  FOLLOW THE POINTER AND PRINT THE OWNER PPN.
;EDIT 237
;	PRINT THE MONITOR NAME ON THE USER'S TERMINAL ON SYS X
;	COMMANDS TO GIVE HIM A CHANCE TO ABORT WITHOUT WAITING
;	FOR 3 MINUTES WHILE SYSTAT CRAWLS THROUGH THE DISK FILE.
;EDIT 240
;	PRINT "PRIVATE STRUCTURE" IN SYS F FOR PRIVATE STRUCTURES.
;EDIT 241
;	PRINT %OVERHEAD TIME IN THE HEADER
;EDIT 242
;	ACCEPT CONSTRUCTS OF THE FORM [,] AND ALLOW SFD'S IN
;	THE FILE SPEC FOR SYS X.
;
;EDIT 243  SPR 10-27276
;	INVALIDATE SY X IF JOB NOT LOGGED IN EXCEPT
;	IF CONTROLLED BY [1,*].
;
;
;EDIT 244 SPR 10-27189
;	ELIMINATE CPU1 DATA FROM SY E WHEN NCPUS=1
;
;
;EDIT 245 	SPR 10-27179
;	REMOVE REFERENCES TO OBSOLETE FLAG
;	TTYFLG
;
; 246	WCL	15-MAY-79	SPR 10-27980
;	6-DIGIT PROJECT NUMBER RUNS INTO JOB NUMBER; INSERT SPACING
;	AREAS AFFECTED: TTYOK, NOTSLF
;
;EDIT 247	SPR 10-28133
;	REMOVE THE ^D SENT WHEN SYSTAT IS RUN NOT-LOGGED-IN
;EDIT 250	SPR 10-27724
;	EDIT PUBLISHED AS 246 LOST
;	CHANGE PUSHJ P,FGETTB TO GETTAB IN EDIT 243 SO WE GET
;	CURRENT INFO ON PPN OF CONTROLLING JOB WHEN PROCESSING SY X.
;EDIT 251
;	ENHANCE THE MESSAGE PRINTED BY EDIT 237 TO INCLUDE THE DATE
;	AND TIME OF THE CRASH AND THE STOPCD NAME.
;
;BEGIN VERSION 475 HERE WITH 7.01 UPDATE
;EDIT 252
;	ADD THE /U SWITCH TO PRINT A LIST OF USERS.  THIS SWITCH MAY
;	BE COMBINED WITH ANY OTHER SWITCH OR COMMAND.
;EDIT 253
;	ADD CPU STOPCD TYPE TO SYS E CODE.
;EDIT 254
;	MAINTAIN AN INCORE CACHE OF PAGES FROM THE EXE FILE FOR "SYS X"
;	THIS WILL MAKE IT QUITE A BIT FASTER
;EDIT 255
;	NEW MONBTS DUMPS HAVE HOLES FOR NXMTAB, CHANGE "SYS X" TO REALLY
;	UNDERSTAND .EXE DIRECTORY FORMAT
;	HAD TO INCREASE DEFAULT PDL SIZE FOR THIS EDIT
;EDIT 256
;	DEFAULT NCPUS TO 4, REFORMAT CPU SPECIFIC OUTPUT
;EDIT 257
;	USE THE EPT OF THE BOOT PROCESSOR (BOOTCP) FOR "SYS X"
;	USE GETTAB TO FIND THE CTY CAUSE IT CAN MOVE IN 7.00/7.01
;EDIT 260
;	REMOVE EDIT 202, PEEKA IS SMART ENOUGH NOW FOR BOTH RUNNING
;	AND CRASHED MONITORS
;EDIT 261
;	EDIT 256 BROKE OUTPUT FOR PRE-7.00 MONITORS
;END OF EDIT HISTORY
;
F%RSP=1B28		;RESPONSE TIME FEATURE

;PRINTS ON SYSTAT:SYSTAT.TXT  OR  TTY:SYSTAT.TXT

SALL

	SEARCH	JOBDAT,MACTEN,UUOSYM ;[143] GET STANDARD SYMBOLS
	LOC	.JBVER
	BYTE	(3)VWHO(9)VSYSTAT(6)VMINOR(18)VEDIT
RELOC


;AC ASSIGNMENTS

F=0
A=1
B=2
C=3
D=4
J=5
JS=6
R=7
N=10
N1=11
M=12
CH=13
BP=14
WD=15
P=17

;I/O CHANNEL

HLP==0	;CHANNEL 0 IS RESERVED FOR HELPER
TTY==1	;FOR OUTPUT
DSK==2	;FOR READING DSK:CRASH.XPN

;ASSEMBLY OPTIONS

IFNDEF PURESW,<PURESW==0>	;SHARABLE
IFNDEF LN.PDL,<LN.PDL==30>	;LENGTH OF PUSH-DOWN LIST
IFNDEF LN.BUF,<LN.BUF==200>	;LENGTH OF DISK BUFFER
IFNDEF STANSW,<STANSW==0>	;PPN IS ALWAYS SIXBIT
IFNDEF HACKSW,<HACKSW==-1>	;INCLUDE HACKS (IF -1, JUST FOR LISTED SYSTEMS)
IFNDEF JIFSEC,<JIFSEC==^D60>	;JIFFIES/SEC (IN CASE MONITOR REFUSES TO TELL US)
IFNDEF NSPMEM,<NSPMEM==^D1000>	;N-SEC/MEMORY CYCLE(IN CASE MONITOR REFUSED TO TELL US)
IFNDEF HIDPPN,<HIDPPN==0>	;HIDE DETACHED JOBS PPN
IFNDEF NCPUS,<NCPUS==^D4>	;NUMBER OF CPUS IN THE SYSTEM
IFNDEF NBCSHE,<NBCSHE==^D25>	;NUMBER OF PAGES TO KEEP IN CORE
	IFLE NBCSHE,<NBCSHE==1>	;IN CASE WE DON'T LIKE THE VALUE
IFNDEF FTAMPM,<FTAMPM==-1>	;-1=FORCE 24 HR. CLOCK, +1=FORCE AM/PM,
				; 0=MAKE FOLLOWING DUBIOUS ASSUMPTION:
;50 HZ POWER LINE MEANS USE 24 HR TYPEOUT, 60 HZ MEANS USE AM/PM

IFNDEF	FTEXE,<FTEXE==1>	;SUPPORT FOR EXE FILES
IFNDEF FTDEBUG,<FTDEBUG==0>	;-1 TO ENABLE SYSTAT TO BE DEBUGGED
;FTDEBUG ALLOWS COMMANDS OF THE FORM "START ;ARG" TO PASS
; "ARG" TO SYSTAT.  ALSO INCLUDES PATCH AREA.
;
;NOTE:  TO DEBUG WITH BREAKPOINTS VIA DDT, TYPE 
;  "HALT$X".  THIS WILL SET THE BREAKPOINTS AND TRAP
; TO THE MONITOR.  THEN TYPE "START ;ARGS"
;COMMANDS

L.BDO=="B"	;B WAS TYPED  BUSY DEVICES
L.DSO=="D"	;D  "    "    DORMANT SEGMENTS
L.FSO=="F"	;F  "    "    FILE STRUCTURES
L.GSS=="G"	;G  "    "    GENERAL SYSTEM STATISTICS
L.DPO=="P"	;P  "    "    PERFORMANCE OF DISKS
L.SSO=="S"	;S  "    "    SHORT JOB STATUS
L.JSO=="J"	;J  "    "    JOB STATUS
L.EJS=="N"	;N  "    "    ALL BUT JOB STATUS
L.LPT=="L"	;L  "    "    LIST ON LPT
L.HSO=="H"	;H  "    "    HELP
L.DSC=="T"	;T  "    "    DATA SET STATUS (TTY)
L.ERR=="E"	;E  "    "    ERROR REPORTS (NON-DISK)
L.USR=="U"	;U  "    "    LIST USER NAMES
L.DSK=="X"	;X  "    "    READ FROM DSK:CRASH.XPN
L.MYJ=="."	;.  "    "    MY JOB ONLY
L.DPY=="V"	;V  "    "    VT05 OR VT06 USER...TYPE 20 LINES AT A TIME & WAIT 
L.CNT=="C"	;C  "    "    CONTINUOUS TO SAME FILE
L.GOD=="O"	;O  "    "    GODLY POSSESSOR OF SECRET CHARACTER
L.WLD=="*"	;*  "    "    PPN WILD CARD

;FLAGS (LH OF F)

FL.DSK==1	;DISK MODE
FL.HGH==2	;HIGH SEG PARAGRAPH NEEDED
FL.GOD==4	;I AM [1,N]
FL.LGI==10	;I AM LOGGED IN
FL.DTJ==20	;THIS JOB DETACHED
FL.DOR==40	;DORMANT SEG TABLE BEING PRINTED
FL.SCN==100	;NEW SCANNER SERVICE (FOR TTYTAB LAYOUT)
FL.DEV==200	;HEADER OUTPUT SYNC
FL.NUM==400	;IF # PRINTED
FL.NST==1000	;IF @ PRINTED
FL.SZR==2000	;SUPPRESS ZEROES
FL.BZR==4000	;BLANK OUT ZEROES
FL.HSG==10000	;WORKING ON HIGH SEGMENT
FL.LPT==20000	;LIST ON LPT
FL.RPT==40000	;REPEATING, WAITING FOR LPT
FL.EXM==40000	;IF ! PRINTED (DURING RUN)
FL.AMP==100000	;IF & PRINTED
FL.NBK==200000	;NON-BLANK LINE
FL.BRK==SIGN	;NO MORE CHS. TO I/P OR BREAK CH. SEEN

;FLAGS (RH OF F)

FR.OVR==1B35	;COLUMN OVERFLOW
IFGE  FTAMPM,<
FR.DAY==1B34	;DO TIME AS TIME OF DAY (AM/PM)
>
FR.XOM==1B33	;IF $ PRINTED
FR.HPQ==1B32	;IF HPQ # PRINTED
FR.NFS==1B31	;IF UNIT NOT IN A F/S
FR.NFP==1B30	;IF "UNIT-NOT-IN-AN-F/S" MESS NOT PRINTED
FR.CNT==1B29	;WE ARE DOING A CONTINUOUS SYSTAT
FR.DPY==1B28	;PAGE HIS OUTPUT....HE HAS A DISPLAY
FR.END==1B27	;WE HAVE BEEN THOUGH THE CONT. THING BEFORE
FR.CHG==1B26	;THIS IS NEW OR RE-LOGIN FOR JOB
FR.LGN==1B25	;SOME NEW LOGIN THIS PASS
FR.VMF==1B24	;THE VM FEATURE IS SUPPORTED
FR.INI==1B23	;THE TTY CHANNEL IS OPEN
FR.DSK==1B22	;OUTPUT IS TO A DISK FILE
FR.CMT==1B21	;[150] A COMMENT HAS BEEN SEEN
FR.EXE==1B20	;EXE MODE
FR.INC==1B19	;[223] DOING INCREMENTAL SYSTATS
FR.USR==1B18	;PRINT USER NAME
;STUFF WHICH HAS TO AGREE WITH MONITOR, ASIDE FROM GETTAB DEFNS

ABSTB1==151	;OLD VALUE OF ABSTAB, POINTER TO NUMTAB
ABSTB2==410	;NEW VALUE OF ABSTAB AFTER 503+ MONITOR
JBTLOC==26	;TABLE FOR JOB LOCATIONS
CMWB==200000	;COMMAND WAIT IN JOB STATUS TABLE
JNA==40000
JLOG==4
JDCON==20000	;JOB WAITING FOR DEVICE TO BE READIED
JDC==100000	;JOB WAITING FOR DCORE OR DUMP COMMAND
ASSCON==400000
ASSPRG==200000
SNA==400000
NSWP==10000		;NON-SWAPPABLE IN LH JBTSTS
JSWP==2000
NSHF==1000		;NON-SHUFFLABLE IN LH JBTSTS
CLKR==1B18		;JOB HAS A CLOCK REQUEST IN
JS.XO==1B25		;EXECUTE ONLY BIT IN RH OF JOB STATUS
SHRSEG==200000
CLKCYC==1B6		;CLOCK CYCLES (1=50 HERTZ)
CANXRC==1B13		;EXTENDED RIBS (1=MONITOR CAN READ/WRITE THEM)
GT.PRC==1B9		;BIT IN NUMTAB ENTRY MEANING DATA IN PDB
GT.PDB==4		;PDB ENTRY IN NUMTAB

IOIMPM==400000
IODERR==200000
IODTER==100000

DV.NAM==0
DV.CHR==1
DV.IOS==2	;DEVICE STATUS
DV.SER==3
DV.MOD==4
DV.LOG==5	;LOGICAL DEVICE NAME
DV.SPL==12	;SPOOL DATA
DV.JOB==16	;SINCE LOAD 722
;THE NEXT 3 SYMBOLS WERE INCREASED STARTING WITH MONITOR
;VERSION 50634
;THE SYMBOLS WERE CHANGED SINCE LOAD 722 TOO
DV.FIL==15	;FILE NAME IF DISK
DV.EXT==16	;FILE EXTENSION IF DISK
DV.PPN==17	;P,PN IF DISK
DV.UNI==23	;UDB POINTER IF DISK
;STARTING WITH VERSION 507 DDBLDB CAN BE OBTAINED WITH GETTAB 
DDBLDB==11	;LINK TO LDB IF NEW SCNSER
;SEE ALSO PJOBN AND TPCJOB
;PARAMETERS

SIGN=400000
DVDSK==200000
DVTTY==10
DVTTYC==20000	;TTY IN USE AS CONSOLE
OUTMSK==377000
UU.PHS==1B19		;PHYSICAL ONLY  BIT
FSP==370		;PAGE INTO WHICH TO MAP FUNNY SPACE PAGE
FSPADR==FSP_^D9		;ABOVE AS AN ADDRESS

MLON

OPDEF	PJRST [JRST]
OPDEF	DEVNAM	[CALLI	64]
OPDEF	CHKACC [CALLI 100]

DEFINE	BOMB(A),<JRST	[JSP	M,BOMB.
			ASCIZ	\A\]>
DEFINE	ALLCPUS,<
	ZZ==0
	REPEAT	NCPUS,<
		EACHCPU(\ZZ)
		ZZ==ZZ+1
	>
>
DEFINE	CALL(R)
<	PUSHJ	P,R
>
DEFINE	RETURN
<	POPJ	P,
>
;STR DATA BLOCK

STRNAM==0
STRSYS==1
STRUNI==2
STRTAL==11
STRMNT==13
STRUN1==15
  STPPVS==1B35		;STRUCTURE IS PRIVATE
STRJOB==20

;UNIT DATA BLOCK

UNINAM==0
UNILOG==1
UNIHID==2
UNISYS==3
UNISTR==4
UNISWP==7
UNIK4S==7	;[231]RIGHT 13 BITS = K FOR SWAPPING
  MSKK4S==17777	;[231]CHNAGED FROM 12 BITS TO 13
UNIHCT==10
UNISCT==11
UNIMCT==12
UNIERR==13
UNISOF==14
UNIHBN==15
UNIBRC==16
UNIBWC==17
UNIDRC==20
UNIDWC==21
UNIMRC==22
UNIMWC==23
UNIICT==24
UNIOCT==25
UNIMSC==26
UNIUSC==27
UNIPCT==30
IFNDEF UNIFKS,<UNIFKS==31>
UNISDI==32
UNIHDI==33
UNIECT==34
UNIHNG==35
;UNITA UNIDES AND UNIXRA ARE SINCE 50634 5 LARGER
UNITAL==47	;IN 503, 504
UNITL1==41	;UNITAL PRE 503
UNIDES==50	;IN 503,504 - BUT NOT IN 501
UNIDE1==42	;UNIDES PRE-503
  UNPZMT==10000
  UNPSAF==20000
UNIXRA==54
UNI2ND==72
;FIELDS IN DATA SET CONTROL TABLE

DSCSTS==7B2	;STATE OF DATA SET
DSCTIM==77B17	;TIMER FOR DATA SET

IFN	PURESW,<TWOSEG
		RELOC	400000>
	SUBTTL	INITIALIZATION
;START HERE

SYSTAT:	RESET			;CLEAR ALL I/O AND RESTORE CORE
	SETZM	GOTCMD		;[221]WE DONT YET HAVE A COMMAND
	MOVE	A,[GOTCMD,,CMDBUF]	;[221]CLEAR ANY JUNK
	BLT	A,CDENDP	;[221] THAT MIGHT BE LYING AROUND
CNTLP:				;[221]HERE'S WHERE WE GO TO DO
				;[221] THE SAME OLD COMMAND AGAIN
	IFN	PURESW,<
	MOVE	A,[XWD HIGH,LOW]
	BLT	A,LOWEND-1
>
	MOVE	A,[XWD LOWEND,LOWEND+1]
	SETZM	LOWEND
	BLT	A,TEMEND
	SETZB	F,WD		;CLEAR WD FOR NORMAL SYSTAT O/P
	JRST	.+3		;[223] DOUBLE SKIP
REENTR:	RESET			;REENTRY POINT
	TRO	F,FR.INC	;[223] SET INCREMENTAL MODE BIT
	TDZ	F,[FL.BRK,,FR.INI!FR.DSK!FR.CMT] ;[151] MARK RESET DONE
	SETZM	JOBINT+2	;[145] NO ^C TYPED YET
	MOVEI	A,SYSTAT	;SET REENTER POINT (RESET LATER)
	MOVEM	A,.JBREN	;SAVE IT
	SETOM	ONCE		;CLEAR ONCE THRU FLAG
	MOVEI	M,^D19		;PAGE SIZE LESS ONE FOR DISPLAYS
	MOVEM	M,LINECT	;RESET THE COUNTER
	MOVE	P,PDP		;SETUP STACK PNTR.

REPEAT 0,<
	OUTSTR	[ASCIZ /Systat V/]
	MOVE	N,.JBVER	;GET VERSION NUMBER
	PUSHJ	P,VERPRT	;TYPE IT TO USER
	PUSHJ	P,CRLF		;AND END LINE
>

	MOVE	A,XMNVER	;GET MONITOR VERSION
	CALL	GETZ		;GET VALUE IN A
	HRRZS	A		;ZAP NOISE BITS
	MOVEM	A,MONVER	;AND REMEMBER IT
	CAIGE	A,60122		;OLD STYLE IF LESS
	CAIGE	A,60000		;AN OLD MONITOR
	CAIGE	A,50722		;IF NOT VERSION 6 OR LATER
	JRST	SYSTA1		;OLD STYLE
SYSTA0:	SETOM	NEWSPY		;NEW SPY LOGIC
	MOVE	A,[POINT 9,C,35]	;NEW POINTER TO JOB NUMBER
	MOVEM	A,NPJOBN	;NEW JOB NUMBER POINTER
SYSTA1:	IFE	PURESW,<
	MOVE	A,XSYSSZ	;GET SIZE OF SYSTEM
	PUSHJ	P,GETA		;FROM THE MONITOR
	MOVEI	A,-1(A)		;(BACK UP ONE)
	SPY	A,		;AND TRY TO SPY
	  JRST	NOSPY		;CAN'T--USE GETTABS, ETC.
;NOTE THAT ALL SPY DATA WILL BE CHANGED BY SETDSK WHEN A SYSTAT
;OF A CRASHED MONITOR ISMADE
	SETOM	SPYFLG		;CAN--SET FLAG FOR PEEKS
	MOVE	A,XGTTBI	;SEE IF WE HAVE GETTAB IMMEDIATE
	PUSHJ	P,GETZ		; IN THIS MONITOR
	JUMPE	A,NOSPY		;IF NOT--STILL DO GETTABS
	HRRZM	A,OFSGTB	;YES--STORE OFFSET FOR PEEK VIA SPY
	LSH	A,-^D9		;POSITION LENGTH OF TABLE
	HLRZM	A,MAXGTB	;AND STORE FOR SIMULATOR
	MOVE	A,XPDBPT	;POINTER TO JBTPDB
	PUSHJ	P,GETZ		;GET IT IF IT EXISTS
	SKIPE	A		;IF IT DOES,
	TDO	A,[XWD A,400000]	;MAKE POINTER FOR INDIRECTING AND INDEXING
	MOVEM	A,PDBPTR	;STORE FOR LATER
>
NOSPY:	MOVE	A,[XWD 4,FINIS]	;SETUP TO INTERCEPT CONTROL C
	MOVEM	A,JOBINT
	MOVE	A,[EXP ER.MSG+ER.ICC]
	MOVEM	A,JOBINT+1
	MOVEI	A,JOBINT
	HRRM	A,.JBINT
	PJOB	A,		;GET MY JOB NUMBER
	MOVEM	A,MYJOB
	HRROI	A,0		;MY STATUS
	PUSHJ	P,GETA
	HRROI	B,2		;MY PPN
	PUSHJ	P,GETTB
	  JRST	GODLY		;NON DISK SYSTEM-FLAG AS GODLY
	TLNE	A,JLOG		;LOGGED IN?
	TLO	F,FL.LGI	;YES-REMEMBER IT
	TLNN	B,-2		;PROJECT 1?
	TLNN	A,JLOG		;YES-LOGGED IN?
	SKIPA			;NO
GODLY:	TLO	F,FL.GOD	;WE'RE GOD
	TLNN	F,FL.LGI	;ARE WE LOGGED IN?
	SETZ	B,		;NO--CLEAR OUR NUMBER
	MOVEM	B,ME		;SAVE FOR FUTURE TESTS
	PUSHJ	P,RDCMND	;[200] YES--READ COMMAND INTO BUFFER
	SUBTTL COMMAND DECODING
COMND:	PUSHJ	P,GETCHR	;INPUT A CH.
	  JRST	NOGO		;NO CHS. LEFT OR A BREAK CH.
	CAIG	WD,"Z"
	CAIGE	WD,"A"		;IGNORE ALL NON-ALPHABETIC CHS.
	JRST 	COMND
IFE FTDEBUG,<
	CAIE	WD,"S"		;IGNORE FIRST WORD UNLESS IT BEGINS WITH S
	JRST	NOGO
>
COMND1:	PUSHJ	P,GETCHR	;GET CHARACTERS OF WORD
	  JRST	NOGO		;JUMP IF END OF LINE
	CAIG	WD,"Z"		;SKIP UNTIL NO ALPHAS
	CAIGE	WD,"A"		; ..
	JRST	AGAIN1		;DONE--CHECK SEPARATOR
	JRST	COMND1		;NO--LOOP
AGAIN:	PUSHJ	P,GETCHR	; 2ND. TIME AROUND LOOK FOR 1ST. CH. NOT A SPACE
	  JRST	NOGO		;NO CHS. LEFT OR A BREAK CH.
AGAIN1:	TLNE	F,FL.DSK
	CAIE	WD," "
	SKIPA
	JRST	NOGO
	CAIE	WD," "		;SKIP SPACES
	CAIN	WD,","		;AND COMMAS
	JRST	AGAIN		; ..
IFN FTDEBUG,<
	CAIE	WD,";"		;SKIP SEMICOLON
>
	CAIN	WD,"/"		;SKIP SLASH
	JRST	AGAIN		; ..
	JRST	.+2
NOGO:	MOVEI	WD,0		;CLEAR WORD IF NOT "SYSTAT" COMMAND
	CAIN	WD,L.DSK	;SEE IF CRASH FILE REQUESTED
	JRST	[TLO F,FL.DSK
		 JRST AGAIN]

;HERE TO INIT THE DEVICE AND ENTER THE FILE

	CAIN	WD,L.DPY	;IS THIS A DISPLAY?
	JRST	[TRO	F,FR.DPY	;REMEMBER IT
		JRST	AGAIN]
	CAIN	WD,L.CNT	;DO IT OVER AND OVER AND OVER?
	JRST	[TRO	F,FR.CNT	;REMEMBER IT
		JRST	AGAIN]
	CAIN	WD,L.USR	;WANT USER NAMES?
	JRST	[TRO	F,FR.USR
		 JRST	AGAIN]
	CAIE	WD,L.GOD	;IS HE GODLY ANYWAY?
	JRST	SYSINI		;NO GET DEVICE
	TLO	F,FL.GOD	;HE KNEW THE SECRET THING
	JRST	AGAIN
	SUBTTL	COMMAND DISPATCH AND SET UP
SYSINI:	PUSH	P,F		;SAVE CURRENT F
	TLZ	F,FL.DSK	;TURN DISK USAGE OFF
	CALL	GETTTY		;MAKE OUTPUT AVALABLE
	POP	P,A		;GET OLD F BACK
	TLNE	A,FL.DSK	;WAS DISK FEATURE ON
	TLO	F,FL.DSK	;THEN MAKE IT VISIBLE AGAIN
	TLZ	F,FL.RPT	;CLEAR OUT FLAG FOR MESSAGE (LPT)
	CAIN	WD,L.LPT	;GETTING LPT??
	JRST	AGAIN		;NEXT CHARACTER
	TRNE	F,FR.DSK	;IF OUTPUT GOES TO A DISK
	TRZ	F,FR.DPY	;THEN DO NOT PAGE
	HRRZ	A,.JBFF		;PRIME THE FREE CORE SPACE
	MOVEM	A,FREE		;FOR SUBSEQUENT CALLS
	TLNE	F,FL.DSK	;WAS DISK FEATURE ALREADY THERE
	PUSHJ	P,SETDSK
.DVDAT:	MOVE	A,[%CNLSD]	;[223] GET LENGH OF SHORT DDB
	CALL	GETZ		;[223] GET A ZERO OR VALUE
	JUMPE	A,GETUPT	;[223] UNKNOWN - GET UPTIME, ETC.
	HRRM	A,.DVFIL	;[223] UPDATE POINTER
	SUBI	A,1		;[223] BACK UP 1
	HRRM	A,.DVJOB	;[223] AND GET THIS FOR LATER
	ADDI	A,2		;[223] ADD 2 NOT 1 EXTENSION POINTER
	HRRM	A,.DVEXT	;[223] UPDATE 
	ADDI	A,1		;[223] PPN POINTER
	HRRM	A,.DVPPN	;[223] UPDATE THAT TOO
	ADDI	A,DV.UNI-DV.PPN	;[223] POINT TO UNIT ENTRY INDISK DDB
	MOVE	B,MONVER	;GET MONITOR VERSION
	CAIL	B,67700		;LATER THAN 7.00 FIELD TEST?
	ADDI	A,2		;YES, DEVUNI IS 2 FARTHER ON
	HRRM	A,.DVUNI	;[223] UPDATE UNIT POINTER
	MOVE	A,[%VMUPM]	;GET POINTER TO VIRTUAL ADDR OF UPMP
	PUSHJ	P,GETZ		;GET VALUE
	JUMPE	A,GETUPT	;IF NOT DEFINED
	MOVE	B,A		;SAVE IT
	MOVE	A,[%VMLST]	;GET UPMP OFFSET OF DISK DDB PTRS
	PUSHJ	P,GETZ		;GET IT
	JUMPE	A,GETUPT	;IF NOT DEFINED
	ADD	A,B		;ADD TOGETHER
	MOVEM	A,.UPLST	;SAVE FOR SPYPAG
	MOVE	A,[%CNBCP]	;GET CPU NUMBER OF BOOT PROCESSOR
	PUSHJ	P,FGETTB	;SO WE CAN RESOLVE HIGH SEG ADDRESS IN "SYS X"
	  SETZ	A,		;PRE-701, USE CPU0
	LSH	A,1		;*2 FOR GETTAB
	ADD	A,[%CCTOS]	;ADDRESS OF EPT FOR CPUN
	PUSHJ	P,FGETTB	;GET IT
	  SKIPA			;CAN'T, FORGET IT
	SUBI	A,220		;MAKE CALCULATION IN DSKA WORK FOR EPT
	MOVEM	A,.CPTOS	;SAVE FOR LATER
GETUPT:	MOVSI	A,-NCPUS	;[223] ONCE FOR EVERY CPU
	SETZ	D,		;[223] PREPARE COUNTER
UPTIME:	MOVEI	B,(D)		;[223] GET CPU*2
	ADD	B,[%CVUPT]	;[223] GET UPTIME FOR THAT CPU
	CALL	GETTB		;[223] GET IT
	  JRST	SYSIN3		;[223] NO CPU
	MOVE	C,B		;[223] SAVE UPTIME
	EXCH	C,CPNUPT(A)	;[223] SAVE THE TIME AWAY
				;[223]  RECOVER OLD TIME
	SUB	B,C		;[223] COMPUTE HOW MUCH TIME
				;[223]  HAS PASSED
	MOVEM	B,DIFTIM(A)	;[223] SAVE ELAPSED TIME
	MOVEI	B,(D)		;[223] GET CPU*2
	ADD	B,[%CVNUL]	;[223] NULL TIME
	CALL	GETTB		;[223] GET IT
	  SETZ	B,		;[223] NONE
	MOVEM	B,CPNNUL(A)	;[223] SAVE AWAY
	MOVEI	B,(D)		;[223] GET CPU*2
	ADD	B,[%CVLST]	;[223] LOST TIME
	CALL	GETTB		;[223] GET IT
	  SETZ	B,		;[223] NONE
	MOVEM	B,CPNLST(A)	;[223] SAVE
	MOVEI	B,(D)		;GET CPU*2
	ADD	B,[%CVOHT]	;OVERHEAD TIME
	CALL	GETTB		;GET IT
	  SETZ	B,
	MOVEM	B,CPNOHT(A)	;SAVE IT
	ADDI	D,2		;[223] INCREMENT D BY 2 FOR
				;[223]  GETTAB TABLE
	AOBJN	A,UPTIME	;[223] LOOP
SYSIN3:	TXZ	F,FR.VMF	;TEST HERE FOR VM  SUPPORT
	MOVE	A,[%CNST2]	;AS DSKSET COULD BE CALLED
	CALL	GETZ		;GET A ZERO OR THE FEATURE
	TXNE	A,ST%VMS	;VM SUPPORT
	TXO	F,FR.VMF	;YES FLAG IT
	SETZM	ONEJOB		;CLEAR SINGLE JOB FLAG
	SETZM	ONEPPN		;CLEAR SINGLE PPN FLAG
	SETOM	ONETTY		;CLEAR SINGLE TTY MODE
	SKIPE	DSKFLG		;SEE IF DISK MODE
	TLO	F,FL.GOD!FL.DSK	;YES--THEREFORE NO SECRETS

	MOVE	A,XFSFPP	;GET SOME SYSTEM STUFF
	PUSHJ	P,GETZ		;LIKE FAILSAFE PPN
	SKIPN	A
	MOVE	A,[1,,2]
	MOVEM	A,FSFPPN
	MOVE	A,XPTYCN	;ALSO PTY POINTER
	PUSHJ	P,GETZ
	HLRZM	A,PTYOFS
	ADD	A,PTYOFS
	HRRZM	A,PTYMAX
	HRRZ	A,PTYOFS	;COMPUTE LINE NUMBER OF THE CTY
	SOS	A		;IT IS USUALLY LAST REAL TTY BEFORE PTYS
	MOVEM	A,CTYLIN	;SO SAVE THAT
	MOVE	A,[%CNBCL]	;ASK FOR CURRENT CTY
	PUSHJ	P,GETZ		;GET IT
	SKIPE	A		;IGNORE IF OLD MONITOR (CAN'T BE LINE 0)
	MOVEM	A,CTYLIN	;SAVE THAT INSTEAD

	MOVE	A,XOPR		;GET NAME OF "OPR"
	PUSHJ	P,GETA
	MOVEM	A,OPR
	MOVE	A,XDATE		;GET DATE NOW
	PUSHJ	P,GETA
	MOVEM	A,DATE		;SAVE TODAY'S DATE
	MOVE	A,XSPPN		;GET SYS: PPN PAIR
	PUSHJ	P,GETZ
	SKIPE	A
	MOVEM	A,SYSPPN
	SETZM	CPKI10		;ZERO KI10 FLAG
	HRLOI	B,-2		;AND TEST WHETHER WE RUN ON A KI10
	AOBJN	B,KI10		;IT IS AKI10
	JRST	NOKI		;IT IS A KA10
KI10:	CAILE	A,50510		;BUT FORGET IF AN EARLY VERSION
	SETOM	CPKI10		;ELSE SET THE KI10 FLAG
NOKI:	HRLZI	B,LQTAB		;GET Q TABLE NAMES IF WE CAN
	SETZB	C,TISL
QTLP:	HRRZI	A,25
	HRL	A,B
	PUSHJ	P,GETZ
	JUMPE	A,QTLP1
	MOVEM	A,QTAB(B)
	MOVE	D,[POINT 12,QTAB(B)] ;BYTE PTR TO CODES
	HRLI	C,-3		;3 CODES PER WORD
QTLP2:	ILDB	A,D		;NEXT CODE
	CAIN	A,'SL'		;SKIP IF NOT SLEEP
	HRRM	C,TISL		;REMEMBER WAIT STATE CODE FOR SLEEP
	CAIN	A,'TI'		;SKIP IF NOT TI
	HRLM	C,TISL		;REMEMBER CODE FOR TI
	AOBJN	C,QTLP2		;LOOP FOR ALL CODES IN THIS WORD
	AOBJN	B,QTLP
QTLP1:	MOVE	A,XSTATS
	PUSHJ	P,GETZ
	MOVEM	A,STATES
	JUMPE	A,DNTSTO	;DONT OVERRIDE TCKSEC IF GETTAB UUO UNDEFINED
	MOVEI	B,^D60
	TLNE	A,(CLKCYC)
	MOVEI	B,^D50
	MOVEM	B,TCKSEC
	TLNE	A,100		;NEW SCANNER SERVICE?
	TLO	F,FL.SCN	;YES. REMEMBER IT.
	SETZM	TNFRTY		;CLEAR 10/40N FLAG
	TLNN	A,(1B2)		;CHECK FOR LOGIN FEATURE
	SETOM	TNFRTY		;NONE--SET 10/40N FLAG
	MOVE	A,XSYSTP	;FIND OUT THE NAME OF "SYS:"
	PUSHJ	P,GETZ		;FROM THE MONITOR
	CAMN	A,[SIXBIT /DSK/]  ;IF "DSK:",
	MOVEI	A,0		;  CLEAR FOR EASY TESTS LATER
	MOVEM	A,SYSTAP	;STORE AWAY
DNTSTO:	MOVE	A,XMEMNS	;GET CORE SPEED
	PUSHJ	P,GETZ
	SKIPE	A
	MOVEM	A,MEMNSP	;DON'T OVERRIDE IF UNDEFINED
	CAIN	WD,L.BDO	;LIST BUSY DEVICES ONLY?
	JRST	DEVQ		;YES
	CAIN	WD,L.HSO	;HELP?
	JRST	HELP		;YES
	CAIE	WD,L.DSO	;LIST DORMANT SEGS ONLY?
	CAIN	WD,L.SSO	;NO - LIST SHORT JOB STATUS ONLY?
	JRST	GA		;YES
	CAIE	WD,L.JSO	;LIST JOB STATUS INFO. ONLY?
	CAIN	WD,L.EJS	;NO-LIST ALL BUT JOB STATUS?
	JRST	GA		;YES
	CAIN	WD,L.FSO	;LIST FILESTRUCTURES ONLY?
	JRST	FS		;YES
	CAIN	WD,L.DPO	;LIST DISK PERFORMANCE ONLY?
	JRST	DP		;YES
	CAIN	WD,L.DSC	;DATA SET CONTROL ONLY?
	JRST	DSCDO		;YES
	CAIN	WD,L.ERR	;NON-DISK ERRORS ONLY?
	JRST	ERRPT		;YES
	CAIN	WD,L.GSS	;GENERAL SYSTEM STATISTICS ONLY?
	JRST	GA		;YES
	CAIN	WD,L.MYJ	;LIST JUST MY JOB?
	JRST	[MOVE	N,MYJOB
		 JRST	GOTJOB]
	CAIL	WD,"0"		;SEE IF SPECIFIC JOB
	CAILE	WD,"9"		; ..
	JRST	CHKPPN		;NO--GO SEE IF PPN
	MOVEI	R,^D10		;SET FOR DECIMAL INPUT
	PUSHJ	P,GETRDX	;GET DECIMAL
GOTJOB:	JUMPE	N,HELPM		;ERROR IF JOB 0
	MOVEM	N,ONEJOB	;STORE REQUEST
	JRST	GOTJNK		;GO DO IT
CHKPPN:	SKIPN	TNFRTY		;NO PPNS IF 10/40
	CAIE	WD,"["		;SEE IF PPN
	JRST	CHKTTY		;NO--GO PROCESS
	MOVEI	R,10		;SET FOR OCTAL INPUT
	PUSHJ	P,GETRDC	;GET PROJECT
	PUSHJ	P,GETCHR	;GET BREAK CHAR IN WD
	  JRST	HELPM
	PUSHJ	P,CHKWLD	;SEE IF WILD CARD PPN
	SKIPGE	N		;USER TYPE [,...?
	HLRZ	N,ME		;YES, SUBSTITUTE OUR PROJECT
	HRLZ	A,N		;SAVE FOR LATER
	CAIE	WD,","		;MUST HAVE COMMA HERE
	JRST	HELPM
	PUSHJ	P,GETRDC	;GET PROGRAMMER
	PUSHJ	P,GETCHR	;GET BREAK CHARACTER
	  JFCL
	PUSHJ	P,CHKWLD	;SEE IF WILD CARD PPN
	SKIPGE	N		;USER TYPE [...,]?
	HRRZ	N,ME		;YES, USE OUR PROGRAMMER NUMBER
	HRR	A,N		;ADD TO RESULT
	SKIPN	A		;*,*?
	SETO	A,		;YES, REMEMBER THAT
	MOVEM	A,ONEPPN	;STORE FOR TESTS
	JRST	GOTCT2		;AND SKIP BREAK CHARACTER

CHKWLD:	CAIN	WD,L.WLD	;* TYPED?
	  JRST	[JUMPN N,HELPM	;IF *, CANNOT HAVE A NUMBER
		 PUSHJ P,GETCHR	;FLUSH THE *
		  JFCL
		 POPJ P,]	;ELSE RETURN
	SKIPE	N		;NUMBER SEEN?
	POPJ	P,		;YES, RETURN IT
	TLNN	F,FL.LGI	;USER LOGGED IN?
	JRST	HELPM		;NO, [,] IS ILLEGAL
	SETOM	N		;SET FLAG FOR CALLER
	POPJ	P,		;EVERYTHING OK, RETURN
CHKTTY:	TLNE	F,FL.SCN	;SEE IF NEW SCANNER SERVICE
	CAIE	WD,"#"		;YES--SEE IF TTY NUMBER
	JRST	CHKONC		;NO--GO PROCESS
	PUSHJ	P,GETCHR	;YES--GET WHICH TYPE
	  JRST	.+2		;END--DO SELF
	CAIN	WD,"."		;SEE IF SELF
	JRST	[SETOM	A
		 GETLCH	A
		 TRZ	A,.UXTRM	;[146] CLEAR .UXTRM OFFSET
		 JRST	GOTCT1]
	CAIN	WD,"C"		;SEE IF CTY
	JRST	GOTCTY		;YES--GO SET IT UP
	MOVEI	R,^D8
	CAIN	WD,"P"		;SEE IF PSEUDO LINE
	JRST	[PUSHJ	P,GETRDC
		 ADD	N,PTYOFS
		 JRST	GOTTTY]
	CAIN	WD,"T"		;SEE IF TTY
	JRST	[PUSHJ	P,GETRDC
		 JRST	GOTTTY]
	PUSHJ	P,GETRDX	;MUST BE JUST TTY NUMBER
GOTTTY:	HRRZM	N,ONETTY	;STORE RESULT
	JRST	GOTJNK		;GO DO THE WORK
GOTCTY:	MOVE	A,CTYLIN	;GET LINE NUMBER OF THE CTY
GOTCT1:	HRRZM	A,ONETTY	;STORE AWAY
GOTCT2:	PUSHJ	P,GETCHR	;GET BREAK CHARACTER
	  JFCL			;IGNORE EOL
GOTJNK:	MOVEI	WD,"["		;SETUP JUNK
	JRST	GA		;GO DO IT

CHKSW:	TDNE	F,[XWD FL.GOD,FR.DPY!FR.CNT]	;DID HE TYPE ONLY ONE OF THE NEW COMMANDS?
	JRST	CLRGA		;YES, GIVE HIM THE DEFAULT
CHKONC:	SKIPN	ONCE		;NO VALID ARGS. SUPPLIED-HAVE WE BEEN THRU BEFORE?
	JRST	HACKQ		;YES-EXIT.
	CAIL	WD,40		;IS IT JUNK GRAPHIC?
	JRST	HELPM		;NO--TELL USER HOW TO GET HELP
CLRGA:	MOVEI	WD,0		;CLEAR WD FOR NORMAL O/P
	SUBTTL	READ TTY STATUS DATA
GA:	MOVE	A,XSEGPT
	PUSHJ	P,GETA
	MOVEM	A,SEGPTR
	HLRE	B,A
	MOVNM	B,SEGN
	HRRZM	A,JOBN
	ADD	A,SEGN
	HRRZM	A,BOTH
	HRRZ	B,FREE
	MOVEM	B,ZERLOW
	MOVE	A,JOBN		;GET NUMBER OF JOBS
	IMULI	A,3		;NEED THAT MANY WORDS ON NEXT PAGE
	ADDI	B,(A)		;COMPUTE HIGHEST ADDRESS NEEDED
	HRRZ	A,.JBREL
	CAIL	A,(B)		;SEE IF .DVIOS, .TTY, AND .TTYN TABLES WILL EXCEED CORE
	JRST	SYS0A
	CORE	B,
	  JRST	NOCOR		;TROUBLE-PRINT MESSAGE & QUIT
	HRRZ	A,.JBREL
SYS0A:	MOVEM	A,ZERHGH
	SETZM	@ZERLOW
	MOVE	A,ZERLOW
	HRLS	A
	ADDI	A,1
	BLT	A,@ZERHGH
	MOVE	A,FREE
	HRRM	A,.DVIOS
	MOVE	A,JOBN
	ADDB	A,FREE
	HRRM	A,.TTY
	MOVE	A,JOBN		;GET NUMBER OF JOBS
	ADDB	A,FREE		;ADVANCE POINTER
	HRRM	A,.TTYN		;SETUP TABLE OF LINE NUMBERS
	MOVE	A,JOBN		;GET NUMBER OF JOBS
	ADDB	A,FREE		;AND UPDATE THE FREE BARRIER
	SETOM	(A)		;JOB 0 IS ON NO LINE
	MOVSI	D,10		;TABLE INDEX FOR TTYTAB, ENTRY #0
SYS0L:	MOVS	B,D
	TLNN	F,FL.DSK	;[245] READING FROM DISK?
	SKIPE	SPYFLG		;[245] OR PRIVILEGED?
	JRST	SYST03		;[245] YES, USE TTYTAB LOGIC
	HRRZ	J,D		;GET JOB NUMBER
	CAML	J,JOBN		;CHECK FOR THE END
	JRST	SYS0X		;END OF TY DATA
	JUMPE	A,SYST02	;0 IS DETACHED!!
	MOVE	A,J		;GET JOB NUMBER
	TRMNO.	A,		;GET I/O INDEX
	  JRST	[SETZ A,	;MAKE IT DETACHED
		JRST SYST02]	;AND FILL IN NAME
	TRZ	A,.UXTRM	;CLEAR TTY UDX BIT
	CAMN	A,CTYLIN	;IS IT CTY?
	JRST	SYST01		;YES THEN NAME IS KNOWN
	TRO	A,.UXTRM	;PUT THE BIT BACK
	DEVNAM	A,		;GET NAME
	  SETZM	A		;DETACHED IF AN ERROR
	SKIPA			;SKIP CTY NAME
SYST01:	MOVSI	A,(SIXBIT /CTY/);GET REAL NAME
SYST02:	MOVEM	A,@.TTY		;REMEBER NAME
	JRST	TTYCN1		;SKIP TTYTAB LOGIC
SYST03:	PUSHJ	P,GETTB		;GET NEXT ENTRY
	  JRST	SYS0X		;END OF TTYTAB
	LDB	J,TPCJOB		;IF OLD SCNSRF, GET JOB NO
	TLNE	F,FL.SCN	;NEW SCNSER?
	MOVEI	J,0(D)		;YES. DIFFERENT LAYOUT. GET JOB NO.
	SETZM	@.TTY		;CLEAR NAME
	TLZ	B,-1
	JUMPE	B,SYS0Z
	MOVEI	C,DV.NAM(B)	;GET TTY NAME
	PUSHJ	P,PEEKC		; ..
	MOVEM	C,@.TTY		;STORE IN TABLE
	MOVEI	C,DV.IOS(B)	;GET IOS
	PUSHJ	P,PEEKC
	MOVEM	C,@.DVIOS
	TLNN	F,FL.SCN	;WHICH SCANNER LAYOUT?
	JRST	SYS0Z		;OLD FORGET IT
	MOVE	A,XDDBLD	;GET CODE FOR LDB LINK
	PUSHJ	P,GETZ		;RETURN ZERO IF NOT IMPLEMENTED
	JUMPE	A,SYS0L0	;IN THAT CASE TAKE OLD NUMERIC LOGIC
	MOVE	C,B		;GET DDB ADDRESS
	ADDI	C,(A)		;AND ADD IN  LDB LINK OFFSET
	JRST	SYS0L1		;AND SKIP NUMERIC LOGIC
SYS0L0:	MOVEI	C,DDBLDB(B)	;NEW. SEE IF DETACHED.
	SKIPE	A,MONVER	;SEE IF OLD MONITOR
	ADDI	C,3		;NO, 5.03 OR LATER
	TLZ	A,-1		;CLEAR JUNK
	CAILE	A,50430		;5.05 OR LATER?
	ADDI	C,1		;ONE MORE WORD IN LDB
SYS0L1:	PUSHJ	P,PEEKC		; ..
	TRNN	C,-1		;ANY LDB LINK?
	HRLM	C,@.TTY		;CLEAR LEFT HALF
TTYCN1:	MOVE	A,[POINT 6,@.TTY,17]
	MOVEI	B,0		;GET TTY NUMBER
TTYCN2:	ILDB	C,A		;GET NEXT DIGIT
	SUBI	C,'0'		;CONVERT TO BINARY
	JUMPL	C,TTYCN3	;EXIT. WHEN DONE
	LSH	B,3		;ADVANCE RESULT
	IOR	B,C		;INCLUDE THIS DIGIT
	TLNE	A,(77B5)	;SEE IF AT END OF WORD
	JRST	TTYCN2		;NO--LOOP FOR MORE
TTYCN3:	MOVEI	A,-1		;SET RIGHT HALF MASK
	TDNN	A,@.TTY		;SEE IF RH=0 (IE, CTY)
	MOVE	B,CTYLIN	;YES--CHANGE TO CTY LINE NUMBER
	MOVEM	B,@.TTYN	;STORE LINE NUMBER AWAY
	TSNN	A,@.TTY		;SEE IF DETACHED
	JRST	SYS0Z		;YES--SKIP PTY TEST
	CAML	B,PTYOFS	;SEE IF WITHIN THE PTY RANGE
	CAML	B,PTYMAX	; ..
	JRST	SYS0Z		;NO--LEAVE ALONE
	SUB	B,PTYOFS	;YES--REMOVE THE OFFSET
	HRLI	B,'PTY'		;SET FLAG FOR LATER
	MOVEM	B,@.TTY		;AND STORE

SYS0Z:	AOJA	D,SYS0L
SYS0X:	MOVE	J,MYJOB		;SEE IF WE ARE AT AN OPERATOR TTY
	MOVE	A,@.TTY
	CAME	A,[SIXBIT /CTY/]	;CHECK CTY
	CAMN	A,OPR		;CHECK OPR
	TLO	F,FL.GOD	;YES--SET GOD FLAG


	SUBTTL	READ JOB AND SEGMENT STATUS
	MOVE	B,[XWD -NTAB,TABPTR]
INIT1:	MOVE	C,(B)
	HRRZ	J,BOTH
	TLZN	C,SIGN
	HRRZ	J,JOBN
	MOVE	A,FREE
	HRRM	A,(C)		;GENERATE ADDRESS IN TABLE POINTER
	ADDI	A,(J)		;PROTECT TABLE 
	HRRZM	A,FREE		;UPDATE FREE FENCE FOR NEXT ROUND
	CAMG	A,.JBREL	;DO WE NEED MORE CORE?
	JRST	INIT0		;NO THERE IS STILL ENOUGH
	CORE	A,		;GET CORE
	JRST	NOCOR		;IF IT IS NOT THERE THEN TOO BAD
INIT0:	MOVNS	J
	HRLZS	J
INIT2:	MOVS	A,C
	HRLI	A,(J)
	PUSHJ	P,GETZ
	MOVEM	A,@0(C)
	AOBJN	J,INIT2
	AOBJN	B,INIT1
	MOVE	A,FREE
	HRRM	A,.SEGCT	;
	ADD	A,SEGN
	HRRZM	A,FREE
	CAMG	A,.JBREL	;IS THERE SILL ENOUGH CORE
	JRST	INIT3		;YES
	CORE	A,		;GET IT OR
	JRST	NOCOR		;JUST DIE
INIT3:	MOVE	A,.SEGCT
	HRLS	A
	SETZM	(A)
	ADDI	A,1
	BLT	A,@FREE
	MOVE	A,XMEMSZ		;GET SIZE OF USER CORE
	PUSHJ	P,GETZ
	JUMPE	A,INIT5		;IF LEVEL-C, USE CORMAX
	MOVE	B,A
	MOVE	A,XSYSSZ
	PUSHJ	P,GETA
	PUSH	P,A		;SAVE LOW SIZE
	MOVE	A,[ 122,,11]	;GET SYS LEN IF THERE
	CALL	GETZ		;ZERO OR THE VALUE
	ADD	A,(P)		;GET THE TOTAL
	POP	P,N		;JUNK IT
	SKIPE	CPKI10		;RUNNING ON A KI10.GT.50510
	JRST	INIT4		;YES GO AWAY
	ADDI	A,1777		;ROUND UP
	TRZ	A,1777
INIT4:	MOVN	A,A
	ADD	A,B		;MEMSIZ-SYSSIZ
	JRST	INIT6
INIT5:	MOVE	A,XCORMX
	PUSHJ	P,GETA
INIT6:	MOVEM	A,CORMAX
	CAIN	WD,L.DSO	;LIST DORMANT SEGS. ONLY?
	JRST	DODORM		;YES - GO DO IT
	CAIN	WD,L.SSO	;SHORT STATUS ONLY?
	JRST	SYS4A		;YES
	SKIPN	ONEJOB		;SEE IF CROSS SECTION
	SKIPE	ONEPPN		; ..
	JRST	SYS4A		;YES--SKIP HEADERS, ETC.
	SKIPL	ONETTY		;..
	JRST	SYS4A		;..
	SUBTTL	PRINT GENERAL SYSTEM STATUS
	PUSHJ	P,THISIS	;OUTPUT NAME OF SYSTEM, DATE AND TIME
	MOVE	A,STATES	;REPORT LOGIN AVAILABILITY
	MOVEI	M,[ASCIZ /No LOGINs allowed
/]
	TRNN	A,1
	MOVEI	M,[ASCIZ /No remote LOGINs allowed
/]
	TRNE	A,3
	PUSHJ	P,MSG
	MOVEI	M,[ASCIZ /Batch only
/]
	TRNE	A,4		;CHECK BATCH BIT
	PUSHJ	P,MSG
	MOVEI	M,[ASCIZ /Unspooling allowed
/]
	TRNE	A,200		;CHECK SPOOL CONTROL
	PUSHJ	P,MSG
	MOVEI	M,[ASCIZ /No operator on duty
/]
	TRNE	A,400		;**[8] IS OPERATOR THERE
	CALL	MSG		;**[8] (NO) TELL IT
	MOVE	A,XSYKTM	;GET MINUTES TO SYSTEM KILL
	PUSHJ	P,GETZ		;FROM THE MONITOR
	MOVEI	M,[ASCIZ/Timesharing is over
/]				;[204]
	SKIPGE	A		;[204] IS TIMESHARING OVER ?
	PUSHJ	P,MSG		;[204] YES--TELL USER ABOUT IT
	SKIPLE	N,A		;SEE IF SET
	CAILE	A,^D24*^D60	;YES--SEE IF WITHIN 24 HRS.
	JRST	GENSTS		;NO--SKIP MESSAGE
	MOVEI	M,[ASCIZ /Timesharing ends in /]
	IDIVI	N,^D60		;YES--GET HOURS
	PUSH	P,N1		;SAVE MINUTES
	JUMPE	N,KSYNHR	;JUMP IF NO HOURS LEFT
	PUSHJ	P,MSGDEC	;TELL USER HOW LONG
	MOVEI	M,[ASCIZ / hrs. /]
KSYNHR:	POP	P,N		;RECOVER MINUTES
	PUSHJ	P,MSGDEC	;OUTPUT IT
	MOVEI	M,[ASCIZ / mins.  (at /]
	PUSHJ	P,MSG		;AND WHEN THAT IS
	IMULI	A,^D60		;CONVERT TO SECS.
	IMUL	A,TCKSEC	;AND THEN JIFFIES
	ADD	A,NOW		;ADD CURRENT TIME
	MOVEI	B,^D24*^D3600	;GET NUMBER OF SECS. IN A DAY
	IMUL	B,TCKSEC	;CONVERT TO JIFFIES
	CAML	A,B		;SEE IF TOMORROW
	SUB	A,B		;YES--BACK OFF CLOCK
	IFGE  FTAMPM,<
	TRO	F,FR.DAY	;REQUEST AM/PM HACK
>
	PUSHJ	P,TCKTIS	;OUTPUT TIME OF DAY
	MOVEI	M,[ASCIZ /)
/]
	PUSHJ	P,MSG		;FINISH MESSAGE
GENSTS:	PUSHJ	P,CRLF		;ISOLATE CPU TIMES FROM HEADER,KSYS, ETC.
	MOVE	A,[%CNCPU]	;NUMBER OF CPUS FROM MONGEN
	PUSHJ	P,FGETTB	;GET IT FOR LOOP
	  JRST	[MOVE A,[%CNSTS] ;OLD MONITOR, GET CONFIG STATUS
		 PUSHJ P,FGETTB	;GET IT
		   SETZ A,	;REAL OLD MONITOR
		 TLNN A,(ST%DUL) ;DUAL PROCESSOR MONITOR
		 TDZA A,A	;NO, GET A ZERO
		 MOVEI A,1	;YES
		 AOJA A,.+1]	;RESUME INLINE, A=NUMBER OF CPUS
	CAILE	A,NCPUS		;MORE THAT THIS VERSION WAS ASSEMBLED FOR
	MOVEI	A,NCPUS		;YES, RESET TO ASSEMBLY PARAMETER
	MOVEM	A,NCPCNF	;SAVE NUMBER OF CPUS AWAY
	MOVN	D,A		;FORM AOBJN
	HRLZS	D
	TLC	D,-1		;FIND OUT IF ONLY 1 IN CONFIGURATION
	TLCN	D,-1
	JRST	GENST2		;SKIP OUTPUT OF "CPUn"
GENST1:	MOVEI	M,[ASCIZ/CPU/]	;HEADER
	PUSHJ	P,MSG
	HRRZ	N,D		;GET CPU NUMBER
	PUSHJ	P,DECPRT	;OUTPUT IT
	PUSHJ	P,SPACE		;ALIGN OUTPUT
GENST2:	MOVEI	M,[ASCIZ/Incremental /] ;IN CASE THIS IS "C"
	TRNE	F,FR.END	;NOT FIRST TIME?
	PUSHJ	P,MSG		;NOT FIRST, TYPE IT
	MOVEI	M,[ASCIZ /Uptime /]
	PUSHJ	P,MSG
	TRNE	F,FR.END	;[223] FIRST TIME?
	  SKIPA	A,DIFTIM(D)	;[223] NO, GET DIFF UPTIME
	MOVE	A,CPNUPT(D)	;[223] PICK UP UPTIME
	PUSH	P,A		;SAVE WHAT WE TYPE
	CALL	TCKTIS		;[223] TYPE IT
	POP	P,A		;GET VALUE OF UPTIME
	JUMPE	A,GENST3	;SKIP REST IF UPTIME OR INCREMENTAL IS ZERO
	MOVEI	M,[ASCIZ /, /]
	PUSHJ	P,MSG
	MOVE	N,CPNNUL(D)
	MOVN	B,OLDNUL(D)	;PICK UP OLD NULL TIME
	MOVEM	N,OLDNUL(D)	;SAVE THIS ONE FOR NEXT ITERATION
	ADD	N,B		;USE DIFFERENTIAL NULL TIME
	IMULI	N,^D100
	MOVEM	N,TEMP(D)	;SAVE FOR COMPUTING IDLE & LOST TIME
	TRNE	F,FR.END	;[223] FIRST TIME?
	  SKIPA	B,DIFTIM(D)	;[223] NO, GET DIF UPTIME.
	MOVE	B,CPNUPT(D)	;[223] YES, GET CPU UPTIME
	IDIV	N,B		;[223] COMPUTE % NULL TIME
	MOVEM	N,CPNNUL(D)
	PUSHJ	P,DECPRT		;TYPE NULL TIME FOR EACH CPU
	MOVEI	M,[ASCIZ /% Null time = /]
	PUSHJ	P,MSG
	MOVE	N,CPNLST(D)
	MOVN	B,OLDLOS(D)	;SAME FOR LOST TIME
	MOVEM	N,OLDLOS(D)
	ADD	N,B
	IMUL	N,[EXP -^D100]
	ADD	N,TEMP(D)
	TRNE	F,FR.END	;[223] FIRST TIME?
	  SKIPA	B,DIFTIM(D)	;[223] NO, GET DIF UPTIME.
	MOVE	B,CPNUPT(D)	;[223] YES, GET CPU UPTIME
	IDIV	N,B		;[223] COMPUTE % LOST TIME
	MOVEM	N,CPNLST(D)
	PUSHJ	P,DECPRT	;TYPE IDLE TIME FOR EACH CPU
	MOVEI	M,[ASCIZ /% Idle + /]
	PUSHJ	P,MSG
	MOVE	N,CPNLST(D)
	SUB	N,CPNNUL(D)
	MOVNS	N
	PUSHJ	P,DECPRT	;TYPE LOST TIME FOR EACH CPU
	MOVEI	M,[ASCIZ /% Lost, /]
	PUSHJ	P,MSG
	MOVE	N,CPNOHT(D)	;GET CURRENT OHT
	MOVN	B,OLDOHT(D)	;GET OLD OHT
	MOVEM	N,OLDOHT(D)	;SAVE FOR NEXT ITERATION
	ADD	N,B		;COMPUTE INCREMENTAL OVERHEAD
	IMULI	N,^D100
	TRNE	F,FR.END	;FIRST TIME?
	  SKIPA	B,DIFTIM(D)	;NO, GET INCREMENTAL UPTIME
	MOVE	B,CPNUPT(D)	;YES, GET CPU UPTIME
	IDIV	N,B		;COMPUTE %OVERHEAD
	MOVEM	N,CPNOHT(D)	;SAVE FOR NEXT TIME
	PUSHJ	P,DECPRT	;PRINT IT
	MOVEI	M,[ASCIZ/% Overhead/]
	PUSHJ	P,MSG
GENST3:	PUSHJ	P,CRLF
	AOBJN	D,GENST1	;TYPEOUT FOR ALL CPUS
	MOVE	D,NCPCNF	;GET NUMBER OF CPUS (LINES) JUST OUTPUT
	CAILE	D,1		;ONLY 1 LINE
	PUSHJ	P,CRLF		;NO, SEPARATE OUTPUT A LITTLE BETTER

PRSHUF:	TLNN	F,FL.DSK!FL.LPT	;SEE IF OPERATOR WORK
	JRST	PRSHF1		;NO--CUT OUT JUNK TO SAVE TIME
	MOVEI	M,[ASCIZ/Incremental /]	;IN CASE THIS IS "C"
	TRNE	F,FR.END	;NOT FIRST TIME?
	PUSHJ	P,MSG		;NOT FIRST, TYPE IT
	MOVEI	M,[ASCIZ /Shuffle time = /]
	MOVE	A,XSHF		;GET WORDS SHUFFLED
	PUSHJ	P,GETA
	MOVN	B,OLDSFL	;GET THE LAST SHUFFLE
	MOVEM	A,OLDSFL	;SAVE THIS SHUFFLE THERE
	ADD	A,B		;USE DIFFERENTIAL SHUFFLE
	PUSHJ	P,MEMPR		;PRINT AS TIME
	MOVEI	M,[ASCIZ /,  Core Zeroing time = /]
	MOVE	A,XZCOR		;GET WORDS ZEROED
	PUSHJ	P,GETA
	MOVN	B,OLDZRO	;GET THE LAST ZEROED
	MOVEM	A,OLDZRO	;SAVE THIS ZEROED THERE
	ADD	A,B		;USE DIFFERENTIAL ZEROED
	PUSHJ	P,MEMPR		;PRINT AS TIME
	PUSHJ 	P,CRLF
	MOVEI	M,[ASCIZ/Incr avg response time:/]
	TRNN	F,FR.END	;PRINT ON 2ND,3RD,... PASS
	MOVEI	M,[ASCIZ /Average response time: /]
	PUSHJ	P,MSG		;ANNOUNCE RESPONSE TIME
	MOVE	A,[%FTDEB]	;[EDIT 2] GET OPTIONS
	CALL	GETZ		;[EDIT 2] ZERO IF NOT THERE
	TXNN	A,F%RSP		;[EDIT 2] THE FANCY STUFF?
	JRST	PRSHU0		;[EDIT 2] DEFINITELY NOT
	MOVE	A,MONVER	;IS MONITOR .GT 50500?
	CAIL	A,50500
	JRST	GENRSP		;YES, HANDLE FANCY RESPONSE TABLES
PRSHU0:	TRNE	F,FR.END	;FIRST PASS?
	PUSHJ	P,SPACE		;NO, PRINT EXTRA SPACE
	MOVE	A,XRNUM
	PUSHJ	P,GETA
	EXCH	A,OLDNUM	;SWAP OLD AND NEW TOTAL RESPONSES
	SUB	A,OLDNUM	;-(NUMBER OF RESPONSES)
	MOVMM	A,TEMP		;+NUMBER OF RESPONSES THIS INTERVAL
	MOVE	A,XSRSP
	PUSHJ	P,GETA
	EXCH	A,OLDRSP	;SWAP NEW AND OLD JIFFIES RESPONDING
	SUB	A,OLDRSP	;-(JIFFIES SPENT RESPNDING)
	MOVMS	A
	MOVEM	A,TEMP1
	IDIV	A,TEMP		;JIFFIES PER RESPONSE THIS INTERVAL
	PUSHJ	P,TIMPR		;PRINT TIME IN SECONDS
	MOVEI	M,[ASCIZ / sec (/]
	PUSHJ	P,MSG
	MOVE	A,TEMP1
	PUSHJ	P,TIMPR
	MOVEI	M,[ASCIZ^ sec/^]
	MOVE	N,TEMP
	PUSHJ	P,MSGDEC
	MOVEI	M,[ASCIZ/ resp.)/]
	PUSHJ	P,MSG
	PUSHJ	P,CRLF
	JRST	PRSHF1		;GO DO JOB STUFF
;HERE TO PRINT RESPONSE MEASURES

GENRSP:	SETZM	CPU		;TO ALIGN HEADERS
	MOVEI	M,[ASCIZ@	Mean//St.Dev.@]
	PUSHJ	P,MSG
	PUSHJ	P,STAB		;ALIGN NEXT HEADER
	MOVEI	M,[ASCIZ@Resp/Min	@]
	PUSHJ	P,MSG
	MOVE	A,NCPCNF	;NUMBER OF CPUS TO REPORT
	CAILE	A,2		;IF 1 OR 2, HEADERS WILL LINE UP
	PUSHJ	P,TAB		;FOR 3 OR 4, ADD ANOTHER TAB
	MOVEI	M,[ASCIZ/# of RESP
/]
	PUSHJ	P,MSG
	HRREI	A,-4		;4 TYPES OF RESPONSE
	SETZM	D		;RELATIVE SUBTABLE POINTER
RSP:	MOVEM	A,RSPCNT	;SAVE RESPONSE TYPE COUNTER
	MOVE	M,RSPMSG+4(A)	;GET MSG FOR THIS RESPONSE TYPE
	SETZM	CPU		;SET FOR CPU0

;LOOP TO PRINT RESPONSE FOR EACH CPU

RSPLP1:	MOVE	A,D		;GET TYPE INDEX
	ADDI	A,%CVRNO	;NO. OF RESPONSES SINCE STARTUP
	PUSHJ	P,GETRS0	;GET FROM MONITOR REL TABLE
	  JRST RSP1C		;NOT PRESENT FOR THIS CPU
	PUSHJ	P,GETDIF	;GET INCREMENTAL VALUE
	PUSH	P,A		;SAVE TOTAL NO. OF RESPONSES

	MOVE	A,D		;GET TYPE INDEX
	ADDI	A,%CVRSO	;SUM OF RESPONSE TIMES IN JIFFIES
	PUSHJ	P,GETRSP	;GET FROM MONITOR REL TABLE
	  JRST	RSP1B		;NOT PRESENT FOR THIS CPU
	PUSHJ	P,GETDIF	;GET INCREMENTAL VALUE
	MOVE	N,A		;MOVE TO N FOR PNTSEC ROUTINE
	MUL	A,A		;GET SQUARE OF SUM OF RESPONSES
	PUSH	P,A		;SAVE FOR STANDARD DEV
	PUSH	P,B		; ..
	IDIV	N,-2(P)		;AVERAGE RSP=SUM/NUMBER(IN JIFFIES)
	PUSHJ	P,PNTSEC	;PRINT IN SECONDS + TENTHS
	POP	P,N1		;RESTORE SQUARE OF SUM
	POP	P,N		; ..
	MOVEI	M,[ASCIZ @//@]	;SEPARATE MEAN FROM STANDARD DEVIATION
	PUSHJ	P,MSG

	MOVE	A,D		;GET TYPE INDEX
	ADDI	A,%CVRLO	;GET LOW SUM OF SQUARES OF RESPONSES
	PUSHJ	P,GETRSP	;GET FROM MONITOR REL TABLE
	  JRST	RSP1B		;NOT THERE
	PUSHJ	P,GETDIF	;GET INCREMENTAL VALUE
	MOVE	B,A		;POSITION FOR MULT.
	MOVE	A,RSPIDX	;GET INDEX TO DIFRSP TABLE
	MOVEM	A,RSPIX1	;SAVE IT (NEED TO DO DOUBLE
				; PRECISION SUBTRACT)

	MOVE	A,D		;GET TYPE INDEX
	ADDI	A,%CVRHO	;ASK FOR HIGH SUM OF SQUARES
	PUSHJ	P,GETRSP	;FROM MONITOR
	  JRST	RSP1B		;(STRANGE!)
	PUSHJ	P,GETDIF	;GET INCREMENTAL VALUE
	SKIPL	B		;IS DIFFERENTIAL LOW ORDER PART NEGATIVE?
	JRST	RSPL1A		;NO, OK
				; YES, FUDGE DOUBLE PRECISION
	PUSH	P,N		;SAVE N
	MOVE	N,RSPIX1	;GET INDEX TO DIFRSP TABLE
	SETCAB	B,DIFRSP(N)	;COMPLEMENT LOW ORDER HALF
	MOVE	N,RSPIDX	;GET INDEX TO HIGH ORDER HALF
	SOS	A,DIFRSP(N)	;BORROW 1
	POP	P,N		;RESTORE N
RSPL1A:	MUL	B,(P)		;MULT BY NUMBER
	IMUL	A,(P)		; BOTH HALVES
	ADD	A,B		;INCLUDE CROSS CARRY
	MOVE	B,C		;POSITION LOW HALF
	SETCMM	N		;COMPLEMENT SQUARE OF SUM
	MOVNS	N1		; ..
	SKIPN	N1		;HANDLE CARRY
	ADDI	N,1		; YES
	TLZ	N1,(1B0)	;GOT (N,N1)=-SQ.SUM
	ADD	B,N1		;ADD TO N*SUM SQ.
	ADD	A,N		; ..
	TLZE	B,(1B0)		;SEE IF CARRY
	ADDI	A,1		;YES. GOT (A,B)=N*SUM SQ.-SQ.SUM
	PUSHJ	P,ISQRT		;COMPUTE N=SQRT((A,B))
	IDIV	N,(P)		;DIVIDE BY NUMBER; N=STD.DEV
	PUSHJ	P,PNTSEC	;PRINT AS SECONDS PLUS TENTHS
	POP	P,A		;REMOVE NO.
	AOS	CPU		;STEP TO NEXT CPU
	JRST	RSPLP1		;GO SEE IF EXISTS	
;HERE WHEN PRINTED MEAN AND STANDARD DEV FOR ALL CPUS
RSP1B:	POP	P,A		;REMOVE NUMBER
RSP1C:	PUSHJ	P,TAB		;AND A SECOND ONE
	MOVE	A,DIFTIM	;UP TIME IN JIFFIES
	IDIV	A,TCKSEC	;NO. OF SECONDS UP
	IDIVI	A,^D60		;NO. OF MINUTES UP
	MOVEM	A,TEMP		;STORE FOR CMPCNA
	SETZM	CPU		;START WITH CPU0
RSPLP2:	MOVE	A,D		;GET TYPE INDEX
	ADDI	A,%CVRNO	;NO. OF RESPONSES FOR THIS CPU
	PUSHJ	P,GETRS0	;CALL GETRSP TO SET UP INDEX
	  JRST	RSP2		;NOT THERE
	MOVE	A,RSPIDX	;DIDN'T REALLY WANT NEW VALUE
	MOVE	A,DIFRSP(A)	; GET INCREMENTAL VALUE
	PUSHJ	P,CMPDFA	;PRINT NO. RESPONSES PER MIN
	AOS	CPU		;STEP TO NEXT CPU
	JRST	RSPLP2		;TRY NEXT CPU

;HERE TO PRINT NUMBER OF RESPONSES FOR THIS TYPE

RSP2:	PUSHJ	P,TAB		;ALIGN OUTPUT
	PUSHJ	P,TAB		;...
	SETZM	CPU		;START WITH CPU0
RSPLP3:	MOVE	A,D		;GET TYPE INDEX
	ADDI	A,%CVRNO	;NO. OF RESPONSES FOR THIS CPU
	PUSHJ	P,GETRS0	;CALL GETRSP TO SET UP INDEX
	  JRST RSP3		;NOT THERE
	MOVE	A,RSPIDX	;DIDN'T REALLY WANT NEW VALUE
	MOVE	N,DIFRSP(A)	; GET INCREMENTAL VALUE
	PUSHJ	P,DECPRT	;PRINT # OF RESPONSES
	AOS	CPU		;FIND OUT IF ANY MORE CPU'S
	JRST	RSPLP3		;TRY NEXT CPU

;HERE WHEN PRINTED FOR ALL CPUS

RSP3:	PUSHJ	P,CRLF
	ADDI	D,4		;STEP TO NEXT RESPONSE TYPE
	MOVE	A,RSPCNT
	AOJL	A,RSP		;PROCESS NEXT TYPE (IF ANY)
PRSHF1:	SETZB	N,B		;COUNT JOBS AND LOGGED IN JOBS
	SETZB	C,D		;AND DETACHED JOBS
	MOVE	J,JOBN
CTJOB:	SOJLE	J,CTJOB1	;COUNT, PRINT IF DONE
	MOVE	A,@.STS
	TLNN	A,JNA		;SEE IF JOB NUMBER ASSIGNED
	JRST	CTJOB		;NO--DON'T COUNT
	AOS	N		;YES
	TLNE	A,JLOG		;SEE IF LOGGED IN
	AOS	B		;YES
	MOVE	A,@.TTY
	TLNN	A,-1		;SEE IF DETACHED
	AOS	C		;YES
	JRST	CTJOB		;LOOP

CTJOB1:	MOVEM	N,NUMJOB	;SAVE NUMBER OF ACTIVE JOBS
	PUSHJ	P,DECPRT	;PRINT NUMBER OF JOBS IN USE
	MOVEI	M,[ASCIZ / Jobs in use out of /]
	MOVE	N,JOBN		;PRINT NO. IN SYSTEM
	SUBI	N,1		;ALLOW FOR NULL JOB
	PUSHJ	P,MSGDEC
	MOVEI	M,[ASCIZ /.  /]
	SKIPE	TNFRTY		;SEE IF 10/40N
	JRST	PRDET		;YES--DON'T COUNT LOGINS
	MOVE	N,B		;PRINT NO. LOGGED IN
	MOVEM	B,LOGDIN	;SAVE FOR  KSEC COMPUTATION
	PUSHJ	P,MSGDEC
	MOVEI	M,[ASCIZ / logged in/]
	PUSHJ	P,MSG
	MOVE	A,XLGMAX	;GET LOGMAX
	PUSHJ	P,GETZ
	JUMPE	A,CTJOB2	;NO LOGMAX
	MOVE	N,A		;COPY LOGMAX
	AOS	A		;SEE IF LOGMAX = ALL JOBS
	CAMN	A,JOBN		;IF SO, DON'T BOTHER PRINTING
	JRST	CTJOB2
	MOVEI	M,[ASCIZ/ (LOGMAX of /]
	PUSHJ	P,MSGDEC	;OUTPUT LOGMAX
	MOVEI	CH,")"		;CLOSE MESSAGE
	PUSHJ	P,TYO		;OUTPUT THAT
CTJOB2:	MOVEI	M,[ASCIZ/, /]	;PRETTY UP THE OUTPUT
PRDET:	MOVE	N,C		;PRINT NO. DETACHED
	PUSHJ	P,MSGDEC
	MOVEI	M,[ASCIZ / detached./]
	PUSHJ	P,MSG
	SUBTTL	PRINT JOB STATUS
PRJBST:	PUSHJ	P,CRLF
	CAIE	WD,L.EJS	;LIST ALL BUT JOB STATUS?
	CAIN	WD,L.GSS	;ONLY GENERAL SYSTEM STATISTICS?
	TLOA	WD,SIGN		;YES
	JRST	SSTATS		;NO
	JRST	SYS4A
SSTATS:	MOVEI	M,[ASCIZ /
Job    Who     Line#	What   Size(K)	State	/]
	SKIPE	CPKI10		;IS IT A KA10?
	MOVEI	M,[ASCIZ /
Job    Who     Line#	What   Size(P)	State	/]
	SKIPE	TNFRTY		;SEE IF 10/40N
	MOVEI	M,[ASCIZ /
Job	Line#	What   Size(K)	State	/]
	TRNE	F,FR.USR	;LIST USER NAMES?
	MOVEI	M,[ASCIZ /
Job    Who       User          Line#	What   Size(P)	State	/]
	PUSHJ	P,MSG
	MOVEI	M,[ASCIZ/% of CPU KCsecs

/]
	TRNN	F,FR.END	;FIRST PASS?
	MOVEI	M,[ASCIZ/Run Time

/]
	PUSHJ	P,MSG		;FINISH THE HEADING EITHER WAY
SYS4A:	MOVN	J,JOBN
	HRLZS	J
	SETZM	TOTKCT		;CLEAR TOTAL KILO=CORE SECS
	SETZM	CORUSE		;CLEAR TOTAL VIRT. CORE USED
	SETZM	DSKUSE		;CLEAR TOTAL SWAPPING SPACE USED
	SETZM	ACTUSE		;CLEAR COUNT OF ACTIVE SWAPPING SPACE USED
	SETZM	LOWUSE		;CLEAR COUNT OF LOW SEGMENT SIZES
	SETZM	PTYS		;CLEAR COUNT OF PTY JOBS
	SETZM	SEGFLG		;CLEAR SEGMENT FLAG
	TLZ	F,FL.NUM!FL.NST!FL.EXM!FL.AMP
SYSL1:	SKIPE	N,ONEJOB	;SEE IF ONE JOB REQUESTED
	CAIN	N,(J)		;YES--SEE IF THIS IS IT
	SKIPA	JS,@.STS	;A WINNER
	JRST	DUNJOB		;A LOSER
	TLNN	JS,JNA
	JRST	[SETZM	JOBTIM(J)	;FOR NEXT TIME
		SETZM	OLDPPN(J)	;FOR NEXT TIME AROUND
		SETZM	JOBKCT(J)	;START FRESH
		JRST	DUNJOB]
	TLO	F,FL.DTJ
	MOVE	A,@.TTY		;GET TTY NAME
	TLNN	A,-1		;TEST FOR DETACHED
	TLOA	A,(SIXBIT /DET/) ;YES
	TLZA	F,FL.DTJ	;YES. NOT DETACHED.
	TLNE	F,FL.GOD	;SEE IF GOD
	SKIPA			;YES (OR NOT DETACHED)
	TRZ	A,-1		;NOT GOD AND DETACHED--CLEAR TTY NUMBER
	MOVEM	A,JOBTTY
	SKIPE	TNFRTY		;SEE IF 10/40N
	JRST	SYSL1D		;YES--SKIP PRJ-PRG
	MOVE	A,@.PPN		;FETCH PPN OF JOB
	TLNN	F,FL.DTJ
	TLNN	JS,JLOG
	PUSHJ	P,NOWHO		;PRINT *'S OR PRJPRG DEPENDING UPON GODLINESS
	SKIPLE	N,ONEPPN	;SEE IF PPN CROSS SECTION
	CAMN	A,N		;YES--SEE IF MATCHES
	JRST	SYSL1D		;A WINNER
	TLNE	N,-1		;WILD CARD PROJECT NUMBER?
	JRST	SYSL0D		;NO
	CAIN	N,(A)		;PROGRAMMER NUMBERS MATCH?
	JRST	SYSL1D		;A WINNER
SYSL0D:	TRNE	N,-1		;WILD CARD PROGRAMMER NUMBER?
	JRST	DUNJOB		;A LOSER
	TRZ	A,-1		;ANY PROGRAMMER NUMBER WINS
	CAME	A,N		;SEE IF IT MATCHES
	JRST	DUNJOB		;A LOSER
	MOVE	A,@.PPN		;RESTORE PPN
SYSL1D:	SKIPGE	N,ONETTY	;SEE IF TTY CROSS SECTION
	JRST	TTYOK		;NO--MUST BE OK
	CAMN	N,@.TTYN	;YES--SEE IF CORRECT LINE NUMBER
	CAMN	A,[-1]		;SEE IF HIDDEN
	JRST	DUNJOB		;A LOSER
TTYOK:	HRRZ	N,J
	TRO	F,FR.OVR	;TENTATIVELY SET COLUMN OVERFLOW
	CAME	A,[-1]		;CLEAR IF HIDDEN
;[246] DELETE 2 LINES
	TLNE	A,7B20		;SEE IF WIDE PROJECT
	JRST	TTYOK1		;[246] YES--DON'T CLEAR
	TRNN	A,7B20		;AND WIDE PROGRAMMER
	TRZ	F,FR.OVR	;NO--CLEAR
TTYOK1:	PUSHJ	P,DECP2X	;[246] PRINT AS TWO DIGITS OR SPACE AND ONE
	SKIPE	TNFRTY		;SEE IF 10/40
	JRST	NOPPN		;10/40 NO PPN'S
	SKIPN	N,ONEPPN	;SINGLE USER?
	JRST	PPNOK		;NO, DISPLAY PPN
	JUMPL	N,PPNOK
	TRNE	N,-1		;WILD CARD PROGRAMMER NUMBER?
	TLNN	N,-1		;OR WILD CARD PROJECT NUMBER?
	JRST	PPNOK		;YES, PRINT PPN SINCE MAYBE MORE THAN ONE
NOPPN:	TRZA	F,FR.OVR	;YES--SKIP PPN
PPNOK:	PUSHJ	P,PNTPPN	;PRINT PRJ-PRG #
	TRNE	F,FR.OVR	;SEE IF OVERFLOW
	PUSHJ	P,SPACE		;YES--JUST SPACE TO CATCH UP
	TRZN	F,FR.OVR	;NO--CLEAR AND
	PUSHJ	P,TAB		; TAB OVER
	TRNE	F,FR.USR	;WANT USER NAMES?
	PUSHJ	P,USRNAM	;YES, PRINT THEM
	SKIPN	A,JOBTTY
	MOVE	A,@.TTY
	HLRZ	CH,A		;GET PREFIX OF DEVICE
	CAIN	CH,'TTY'	;SEE IF TTY
	SKIPE	ONEJOB		;YES--SEE IF ALL JOBS
	JRST	.+2		;NO--GIVE FULL NAME
	HRLZ	A,A		;YES--JUST OUTPUT NUMBER
	CAIE	CH,'PTY'	;SEE IF PTY
	JRST	SYSLTT		;NO--OUTPUT IN SIXBIT
	AOS	PTYS		;COUNT THE PTY JOB
	MOVEI	CH,"P"		;YES--OUTPUT A P
	PUSHJ	P,TYO		; ..
	HRRZ	N,A		;FOLLOWED BY
	PUSHJ	P,OPRNT		; THE PTY DRIVING THIS PTY
	HRRZ	N,J		;GET JOB #
;**;	[230]	@ SYSLTY-6 1/2 INSERT
	SKIPE	DSKFLG		;[230]DISK MODE?
	PUSHJ	P,CTLJB		;[230]YES,SIMULATE CTLJOB UUO
	CTLJOB	N,		;FIND CONTROLLING JOB
	  JRST	SYSLTY		;N.G.
	JUMPLE	N,SYSLTY	;N.G.
	MOVEI	CH,"J"		;PRINT A J
	PUSHJ	P,TYO
	PUSHJ	P,DECPRT	;PRINT CONTROLLING JOB #
SYSLTY:	PUSHJ	P,TAB
	JRST	SYSLTU		;DON'T DO THE SIXBIT THING
SYSLTT:	TDNN	A,[-77B5-1]	;SEE IF JUST ONE CHARACTER
	PUSHJ	P,SPACE		;YES--SPACE IN ONE
	PUSHJ	P,SIXTAB	;PRINT SIXBIT MSG FOLLOWED BY TAB

SYSLTU:	MOVE	A,@.PRG
	PUSHJ	P,SIXTAB	;PRINT SIXBIT MSG FOLLOWED BY TAB
	TLZ	F,FL.HSG	;FLAG LOW SEGMENT
	PUSHJ	P,SEGSZ		;COMPUTE SEGMENT SIZE
	PUSH	P,J		;SAVE JOB NO
	PUSH	P,N		;SAVE LOW SEG VALUE
	SKIPG	J,@.SGN		;GET SEGMENT # OF HISEG
	JRST	SYSLT0		;SPY OR NO HIGH SEGMENT
	TLO	F,FL.HSG	;FLAG THAT HISEG IS DESIRED
	PUSHJ	P,SEGSZ		;GET HISEG SIZE
	TRNE	F,FR.VMF	;IS THIS A VM SYSTEM?
	TLNE	J,SHRSEG	;AND IS SEGMENT SHARABLE?
	JRST	SYSLT1		;NO CLASSIC
	SUBM	N,(P)		;UPDATE LOW SEGSIZE
	MOVNS	(P)		;MAKE IT POSITIVE
SYSLT1:	HRLM	N,(P)		;STORE HISEG VALUE ON STACK
SYSLT0:	HRRZ	N,(P)		;GET LOW SEGMENT SIZE
	MOVE	A,N		;SAVE FOR LATER TEST
	ADDM	N,CORUSE
	EXCH	J,-1(P)		;GET OLD J VALUE
	PUSHJ	P,INACTC	;SKIP IF JOB IS INACTIVE
	  ADDM	N,ACTUSE	;NO, ACTIVE, COUNT ACTIVE VIRTUAL CORE
	ADDM	N,LOWUSE	;COUNT TOTAL LOW SEG SIZE
	PUSHJ	P,DECPRT
	EXCH	J,-1(P)		;GET JBTSGN ENTRY
	JUMPLE	J,SYS9		;IN CASE SPYING
	MOVEI	CH,"+"		;OUTPUT A PLUS
	PUSHJ	P,TYO
	HLRZ	N,(P)		;GET HISEG VALUE
	PUSHJ	P,DECPRT	;PRINT HI-SEG SIZE
SYS9:	JUMPGE	J,SYS8	;GET VALUABLES BACK
	MOVE	A,[SIXBIT /+spy/] ;SPYING--PRINT INDICATION
	PUSHJ	P,SIXBP
SYS8:	POP	P,J		;GET TEMPORARY OF STACK
	POP	P,J		;RESTORE JOB NUMBER

	CAIN	WD,L.SSO	;SHORT STATUS ONLY?
	JRST	RET2		;YES-DON'T PRINT STATE OR RUN TIME
	PUSHJ	P,TAB
	MOVSI	A,'^W '		;PREPARE FOR COMMAND WAIT
	TLNE	JS,400000	;SEE IF COMMAND TYPED
	MOVSI	A,'CW '		; .
	TLNE	JS,CMWB		; ..
	JRST	TSTATE		;YES
	MOVSI	A,'OW '		;SET IN CASE OPER WAIT
	TRNE	JS,JDCON	;SEE IF DEVICE HOLDING IT UP
	JRST	TSTATE		;YES--SEND IT
	MOVSI	A,'^D '		;SET IN CASE DAEMON WAIT
	TRNE	JS,JDC		;SEE IF DAEMON CALL FROM COMMAND
	JRST	TSTATE		;YES--SEND IT
	MOVSI	A,(SIXBIT /^C/)
	JUMPGE	JS,TSTATE
	LDB	B,[POINT 5,JS,14]
	IDIVI	B,3
	IMULI	C,^D12
	MOVE	A,QTAB(B)
	LSH	A,(C)
	AND	A,[7777B11]
	MOVSI	B,(SIXBIT /SL/)	;SEE IF SLEEP WAIT STATE CODE
	CAME	B,A		;IS IT?
	JRST	SYS10		;NO
	TRNN	JS,CLKR		;DOES THE JOB HAVE A CLOCK REQUEST IN?
	MOVSI	A,(SIXBIT /HB/)	;NO, THE JOB IS HIBERNATING
SYS10:	MOVSI	B,(SIXBIT /TI/)	;SEE IF TTY I/O WAIT STATE CODE
	CAMN	B,A		;IS IT?
	SKIPN	B,@.DVIOS	;AND IS IOS NON-ZERO
	JRST	TSTATE		;NO, TI WAIT
	TLNN	F,FL.SCN	;NEW SCANNER SERVICE?
	MOVNS	B		;NO, REVERSE THE SENSE OF THE BIT
	JUMPGE	B,TSTATE	;JUMP IF NOT OUTPUT
	MOVSI	A,(SIXBIT /TO/)	;TTY OUTPUT WAIT
TSTATE:	PUSHJ	P,LOPSWP	;PRINT STATE AND "SW"/"SWF" IF SWAPPED/& FRAGMENTED
	MOVE	C,@.KCT
	TRNN	F,FR.END
	MOVEM	C,JOBKCT(J)	;STORE ON FIRST PASS ONLY
	MOVE	A,@.TIM
	MOVE	B,JOBTIM(J)	;PICK UP OLD RUN TIME TICKS
	MOVEM	A,JOBTIM(J)	;SAVE THIS PASS
	TRNN	F,FR.END	;FIRST PASS?
	JRST	PRUNT		;YES
	MOVE	M,@.PPN		;PICK UP PPN
	CAMN	M,OLDPPN(J)	;NEW PPN?
	CAMGE	A,B		;NEW RUN TIME .LT. LAST?
	TROA	F,FR.CHG!FR.LGN	;YES. MUST HAVE LOGGED IN
	SUB	A,B		;USE DIFFERENTIAL
	JUMPE	A,[MOVEI	M,[ASCIZ/	/]
		PUSHJ	P,MSG	;FAKE IT
		JRST	CHKKCT]
	MOVE	CH,DIFTIM	;PICK UP ?incremental UPTIME
	MOVE	N,A		;SET UP CALLING SEQUENCE FOR
	PUSHJ	P,PCNT2		;PRINT PERCENTAGE OF CPU
CHKKCT:	MOVE	A,@.KCT		;PICK UP NEW KC TICKS
	MOVE	B,JOBKCT(J)	;OLD KC TICKS
	MOVEM	A,JOBKCT(J)	;SAVE NEW VALUE
	TRNN	F,FR.CHG	;USE NEW AMOUNT IF CHANGE
	SUB	A,B
	ADDM	A,TOTKCT	;FORM TOTAL THIS PASS
	JUMPE	A,[MOVEI	M,[ASCIZ /  /]
		   PUSHJ P,MSG
		   JRST DOFLGS]
	MOVEI	M,[ASCIZ/	/]
	PUSHJ	P,MSG
	MOVE	N,A
	IDIV	N,TCKSEC
	PUSHJ	P,DECP3X	;PRINT KILO-CORE-SECS
	JRST	DOFLGS
PRUNT:	PUSHJ	P,TCKTIB	;PRINT RUN TIME IS SECS
DOFLGS:	MOVE	C,[POINT 6,A]	;SET-UP POINTER FOR FLAGS
	MOVE	A,@.RTD		;SEE IF IN A HIGH PRIORITY QUEUE
	LDB	N,HPQPNT	;GET HPQ NUMBER
	JUMPE	N,SYSLK0	;ZERO MEANS  TS Q'S
	PUSHJ	P,SPACE
	PUSHJ	P,DECPR2	;PRINT Q NUMBER
	TRO	F,FR.HPQ	;REMEMBER IT FOR THE FOOTNOTE
SYSLK0:	MOVEI	A,0		;CLEAR FLAGS
	MOVE	B,@.STS		;GET JOB STATUS
	TLNN	B,NSWP!NSHF	;SEE IF LOCKED IN CORE
	JRST	SYSLKX		;NO
	TLNE	B,NSHF		;YES--SEE IF CAN BE SHUFFLED
	JRST	SYSLK1		;NO
	MOVEI	B,(SIXBIT /  !/)  ;YES
	TLO	F,FL.EXM	;FLAG FOR FOOTNOTE
	JRST	SYSLK2
SYSLK1:	MOVEI	B,(SIXBIT /  &/)  ;NOTE LOCKED
	TLO	F,FL.AMP	;FLAG FOR FOOTNOTE
SYSLK2:	IDPB	B,C		;PUT FLAG AWAY
SYSLKX:	MOVS	B,@.STS		;GET STATUS WORD, SWAPPED
	HRRI	B,'$'		;AND FLAG FOR EXECUTE ONLY
	TLNE	B,JS.XO		;IS THIS JOB EXECUTE ONLY?
	IDPB	B,C		;YES. ADD $ TO FLAGS
	TLNE	B,JS.XO	
	TRO	F,FR.XOM	;AND FLAG WANT EXECUTE ONLY MESSAGE
	SKIPG	B,@.SGN		;DOES JOB HAVE A HISEG?
	JRST	SYSL1E		;NO
	TLO	F,FL.HGH	;SET HISEGS IN USE FLAG
	PUSH	P,J		;SAVE J
	MOVE	J,B
	PUSH	P,A		;SAVE A
	HRRZ	A,B
	SUB	A,JOBN
	SKIPL	A		;RANGE CHECK
	CAML	A,SEGN		; ..
	MOVEI	A,0		;BAD. PROTECT ONESSELF
	AOS	@.SEGCT		;INCREMENT HI SEG USE COUNT
	POP	P,A		;RESTORE A
	SKIPE	B,@.PRG		;AN OBSOLETED SEGMENT?
	JRST	SYSL1A		;NO-CHECK IF IT'S A NON CUSP HISEG
	MOVE	B,@.STS
	TLNN	B,SHRSEG	;IS IT SHARABLE?
	JRST	SYSL1B		;NO-MUST BE PRIVATE
	MOVEI	B,(SIXBIT /  @/)
	IDPB	B,C		;PUT FLAG AWAY
	TLO	F,FL.NST	;YES-SET @ FLAG
	JRST	SYSL1B		;PRINT @
SYSL1A:	SKIPN	B,SYSTAP	;SEE IF SYSTEM TAPE IS NOT DISK
	JRST	SYSL1M		;IS DISK--CHECK PPN
	CAME	B,@.PPN		;CHECK LEV.C DEVICE NAME
	CAMN	B,@.DEV		;OR LEVEL D DEVICE NAME
	JRST	SYSL1B		;IS SYS
	JRST	SYSL1N		;IS NOT SYS
SYSL1M:	MOVE	B,@.PPN		;GET HISEG OWNER
	CAMN	B,SYSPPN	;IS IT A CUSP HISEG?
	JRST	SYSL1B		;YES-DON'T PRINT ANYTHING
SYSL1N:	MOVEI	B,(SIXBIT /  #/)  ;PREPARE TO FLAG JOB WITH #
	IDPB	B,C		;PUT FLAG AWAY
	TLO	F,FL.NUM	;SET # FLAG
SYSL1B:	POP	P,J		;RESTORE J & A
SYSL1E:	MOVEI	B,(SIXBIT /  +/)
	TRZE	F,FR.CHG	;NEW LOGIN?
	IDPB	B,C		;FLAG ON OUTPUT
	JUMPL	C,RET2		;IF NO FLAGS, JUMP
	PUSHJ	P,SPACE		;PRINT A SPACE
	PUSHJ	P,SIXBP		;PRINT @ OR #
RET2:	PUSHJ	P,CRLF

DUNJOB:	MOVE	A,@.PPN		;IN ANY CASE, SAVE THIS PPN
	MOVEM	A,OLDPPN(J)
	PUSHJ	P,NOWHO
	MOVEM	A,@.PPN		;IN CASE OF **,** WIPEOUT
	AOBJN	J,SYSL1
	MOVEI	M,[ASCIZ/Total KCS used = /]
	MOVE	N,TOTKCT
	IDIV	N,TCKSEC
	MOVEM	N,TEMP
	TRNE	F,FR.END	;2ND OR 3RD PASS?
	PUSHJ	P,MSGDEC
	MOVEI	M,[ASCIZ/ Average KCS = /]
	MOVE	N,TEMP
	IDIV	N,LOGDIN
	TRNE	F,FR.END
	PUSHJ	P,MSGDEC	;ANNOUNCE AVERAGE KCS OVER INTERVAL
	TRNE	F,FR.END
	PUSHJ	P,CRLF
	MOVEI	M,[ASCIZ /@ means superseded Hi-Seg	/]
	TLNE	F,FL.NST
	PUSHJ	P,MSG
	MOVEI	M,[ASCIZ /# means non-system Hi-Seg/]
	TLNE	F,FL.NUM
	PUSHJ	P,MSG
	TLZE	F,FL.NST!FL.NUM
	PUSHJ	P,CRLF
	MOVEI	M,[ASCIZ /& means locked in core	/]
	TLNE	F,FL.AMP
	PUSHJ	P,MSG
	MOVEI	M,[ASCIZ /! means locked in core--can be shuffled/]
	TLNE	F,FL.EXM
	PUSHJ	P,MSG
	TLZE	F,FL.AMP!FL.EXM
	PUSHJ	P,CRLF
	MOVEI	M,[ASCIZ /$ means Execute Only	/]
	TRNE	F,FR.XOM	;WAS THERE AN EXECUTE ONLY JOB?
	PUSHJ	P,MSG		;YES. EXPLAIN FLAG

	MOVEI	M,[ASCIZ /n means job runs in HPQ n/]
	TRNE	F,FR.HPQ	;SEEN ANY JOBS IN HPQ'S?
	PUSHJ	P,MSG		;YES, EXPLAIN NUMBER
	TRZE	F,FR.XOM!FR.HPQ
	PUSHJ	P,CRLF
	MOVEI	M,[ASCIZ &+ means LOGIN during interval&]
	TRNE	F,FR.LGN	;ANY NEW LOGINS?
	PUSHJ	P,MSG		;YES, EXPLAIN +
	TRZE	F,FR.LGN
	PUSHJ	P,CRLF
	SKIPN	PTYS		;SEE IF ANY PTY JOBS
	JRST	DONJOB		;NO--END OF FOOTNOTES
	MOVEI	M,[ASCIZ /Jnn is the controlling job, Pnn corresponds to TTY/]
	PUSHJ	P,MSG		;YES--OUTPUT NOTE
	MOVE	N,PTYOFS	;GET OFFSET
	PUSHJ	P,OPRNT		;OUTPUT IT
	MOVEI	M,[ASCIZ /+nn
/]
	PUSHJ	P,MSG		;(PTY0 DRIVES OFFSET TTY)
DONJOB:	CAIN	WD,L.SSO	;SHORT STATUS ONLY?
	JRST	FINIS		;YES-GO SEE IF WE SHOULD EXIT. OR INTERPRET MORE CHS.
	TLZ	WD,SIGN		;CLEAR SIGN BIT IF IT WAS ON SO PRINTING MAY RESUME
	SKIPL	ONETTY		;SEE IF SINGLE TTY
	JRST	DEVQ		;YES--PROCEED TO DEVICE STATUS
	SKIPN	ONEJOB		;SEE IF SINGLE JOB
	SKIPE	ONEPPN		;OR SINGLE USER
	JRST	DEVQ		;YES--SKIP SEGMENT JUNK
	TLNN	F,FL.HGH
	JRST	DORMNT
	SUBTTL	PRINT HIGH-SEGMENT STATUS
	CAIN	WD,L.GSS	;ONLY GENERAL SYSTEM STATISTICS?
	TLO	WD,SIGN		;YES, SUPPRESS PRINTING
	LDB	D,DSKLEV
	SETOM	SEGFLG		;SEG SEGMENT FLAG
	MOVEI	M,[ASCIZ /
High Segments:
Program	/]
	PUSHJ	P,MSG
	JUMPE	D,.+3
	MOVEI	M,[ASCIZ /Device	/]
	PUSHJ	P,MSG
	MOVEI	M,[ASCIZ  /Owner	High(K)	Users

/]
	SKIPE	CPKI10
	MOVEI	M,[ASCIZ  /Owner	High(P)	Users

/]
	PUSHJ	P,MSG
	MOVE	J,SEGPTR
	SETZM	CORSAV		;CLEAR COUNTER FOR VIRT. CORE SAVED
HIGH00:	SKIPL	JS,@.STS
	JRST	DUNHGH
	SKIPN	A,@.PRG
	JRST	[MOVE	A,[SIXBIT /(priv)/]
		TLNE	JS,SHRSEG
		MOVE	A,[SIXBIT /(obs)/]
		JRST	.+1]
	PUSHJ	P,SIXBP		;PRINT SIXBIT MSG
	JUMPE	D,.+3
	MOVE	A,@.DEV
	PUSHJ	P,TABSIX
	SKIPN	A,SYSTAP	;SEE IF SYSTEM TAPE IS NOT A DISK
	JRST	HIGH04		;DISK--CHECK PPN
	CAME	A,@.PPN		;COMPARE WITH LEV.C DEVICE
	CAMN	A,@.DEV		;COMPARE WITH LEV.D DEVICE
	JRST	[MOVSI	A,(SIXBIT /SYS/)
		 JRST	HIGH2A]
	SKIPN	A,@.PPN		;NOT SYS, GET DEVICE NAME
	MOVE	A,@.DEV		;FROM TABLES
	JRST	HIGH2A		;AND GO PRINT IT
HIGH04:	MOVE	A,@.PPN
	JUMPE	A,.+3		;IF ZERO, LEAVE IT THAT WAY
	TLNN	A,-1		;PPN OR POINTER?
	PUSHJ	P,PEEKA		;POINTER, GET PPN
	CAMN	A,SYSPPN	;CUSP HISEG?
	JRST	HIGH2A		;YES-DON'T LOOK FOR DETACHED OWNER
	JUMPN	A,HIGH05
	PUSHJ	P,SEGSCN	;LOOK FOR JOB WITH THIS SEGMENT NO.
	  JRST	HIGH2C
	SKIPGE	B		;PRIVATE HISEG?
	JUMPE	A,[MOVEI M,[ASCIZ /	Job /]	;YES-COMPUTE JOB NO.
		SUB	B,.SGN
		HRRZ	N,B
		PUSHJ	P,MSGDEC	;AND PRINT IT
		JRST	HIGH2C]
IFE STANSW,<
HIGH05:	JUMPLE	A,HIGH2A	;OWNER MUST BE A DEVICE
	PUSH	P,J		;SAVE CURRENT SEGMENT NO.
	PUSHJ	P,SEGSCN	;FIND 1ST. JOB USING THIS HISEG
	  JRST	NOSEG		;NONE LEFT
	HRRZ	J,B
	SUB	J,.SGN		;GET JOB NO.
	HLRZ	C,@.TTY		;JOB DETACHED?
	CAIN	C,0
	CAME	A,@.PPN		;YES-IS THIS JOB HISEG OWNER?
	SKIPA	J,(P)		;NO-GET HISEG NO. AGAIN
	JRST	GO.ON		;YES-PRINT *'S UNLESS GOD
	AOBJN	P,.+1		;PRETEND WE DID A "PUSHJ"
	SOS	(P)		;DECREMENT PC
	AOBJN	B,HIGH06	;RE-ENTER SUBROUTINE (QUEL HACQUE!)
	POP	P,J		;POP OFF PC IF NO MORE JOBS TO CHECK
NOSEG:	POP	P,J		;RESTORE SEGMENT NO.
	JRST	HIGH2A		;PRINT OWNER
GO.ON:	POP	P,J		;RESTORE SEGMENT NO.
	PUSHJ	P,NOWHO		;PRINT *'S OR PRJPRG DEPENDING UPON GODLINESS
>
	JRST	HIGH2A

HIGH2C:	SETZ	A,		;PRINT BLANKS
HIGH2A:	PUSHJ	P,HIGH01
DUNHGH:	AOBJN	J,HIGH00	;ARE THERE ANY MORE HI SEGS.?
	JRST	DORMNT

HIGH01:	PUSHJ	P,PNTPPN	;PRINT AS P,PN PAIR
	PUSHJ	P,TAB
	TLO	F,FL.HSG	;FLAG HI-SEG
	PUSHJ	P,SEGSZ		;COMPUTE SEGMENT SIZE
	MOVE	B,N		;SAVE FOR LATER TEST
	TLNE	F,FL.DOR
	JRST	HIGH4A
	ADDM	N,CORUSE
	PUSHJ	P,SEGSCN	;FIND FIRST USER OF THIS HIGH SEG
	  JRST	NOALOW		;NO USERS
	JRST	FSALOW		;SEE IF ACTIVE
NXALOW:	ADD	J,.SGN		;RESTORE PTR TO SEGMENT TABLE
	EXCH	J,B		;RESTORE ORIGINAL J AND B
	PUSHJ	P,HIGH6A	;FIND NEXT USER OF THIS HIGH SEG
	  JRST	NOALOW		;NO MORE USERS
FSALOW:	EXCH	J,B		;J=PTR TO USER IN SEGMENT TABLE
	SUB	J,.SGN		;J=JOB NUMBER OF USER
	PUSHJ	P,INACTC	;SKIP IF INACTIVE
	  SKIPA	J,B		;ACTIVE, COUNT THIS HIGH SEGMENT
	JRST	NXALOW		;INACTIVE, CHECK OTHER USERS
	ADDM	N,ACTUSE	;COUNT VIRTUAL CORE FOR ACTIVE SEGMENTS
NOALOW:	PUSH	P,N
HIGH4A:	PUSHJ	P,DECP2X
	MOVSI	A,(SIXBIT //)
	PUSHJ	P,HIPSWP
	TLNE	F,FL.DOR
	JRST	CRLF
	MOVEI	A,(J)
	SUB	A,JOBN
	SOS	N,@.SEGCT
	IMULM	N,(P)
	AOS	N,@.SEGCT
	POP	P,A
	SKIPLE	A		;DON'T ADD TO CORSAV IF 0 OR -VE
	ADDM	A,CORSAV
	PUSHJ	P,DECPRT
	JRST	CRLF
	SUBTTL	PRINT DORMANT-SEGMENT STATUS
DORMNT:	TLZN	WD,SIGN		;SIGN ON?  YES IF GENERAL SYSTEM STATISTICS
	TLNN	F,FL.LPT!FL.DSK	;SEE IF FOR OPERATOR
	JRST	ENDDOR		;NO--SKIP
DODORM:	LDB	D,DSKLEV
	SETOM	SEGFLG		;SET SEGMENT FLAG
	MOVEI	M,[ASCIZ /
Dormant Segments:
Program	Owner	High(K)

/]
	JUMPE	D,.+2
	MOVEI	M,[ASCIZ /
Dormant Segments:
Program	Device	Owner	High(K)

/]
	SKIPE	CPKI10		;KI10 TEST
	MOVEI	M,[ASCIZ /
Dormant Segments:
Program	Device	Owner	High(P)

/]
	SETO	CH,
	MOVE	J,SEGPTR
DOR1:	SKIPGE	JS,@.STS	;SEGMENT DORMANT?
	JRST	DUNDOR		;NO
	MOVEI	N,OUTMSK
	SKIPN	@.ADR		;SEGMENT IN CORE?
	TDNE	N,@.SWP		;NO - ON DISK?
	JRST	DOR2		;YES - GO PRINT IT
	JRST	DUNDOR		;NOT IN USE

DOR2:	JUMPE	CH,DORMN
	PUSHJ	P,MSG
	TLO	F,FL.DOR
DORMN:	MOVE	A,@.PRG
	PUSHJ	P,SIXBP
	SKIPN	A,SYSTAP	;SEE IF "SYS:" NOT "DSK:"
	JRST	DORMN2		;DISK
	CAME	A,@.PPN		;CHECK LEV.C DEVICE
	CAMN	A,@.DEV		;CHECK LEV.D DEVICE
	JRST	[MOVSI	A,(SIXBIT /SYS/)
		 JRST	DORM2A]
	SKIPN	A,@.PPN
	MOVE	A,@.DEV
	JRST	DORM2A
DORMN2:	JUMPE	D,.+3
	MOVE	A,@.DEV
	PUSHJ	P,TABSIX
	MOVE	A,@.PPN
DORM2A:	TLNN	A,-1		;PPN OR POINTER
	PUSHJ	P,PEEKA		;POINTER, GET PPN
	PUSHJ	P,HIGH01
DUNDOR:	AOBJN	J,DOR1		;ARE THERE ANY MORE SEGS. TO LOOK AT?

ENDDOR:	TLZ	F,FL.DOR
	CAIN	WD,L.DSO	;LIST DORMANT SEGS. ONLY?
	JRST	FINIS		;YES - GO SEE IF WE SHOULD EXIT OR INTERPRET MORE CHS.
	SUBTTL	PRINT MEMORY UTILIZATION STATISTICS
MUSTAT:	PUSHJ	P,CRLF
	MOVEI	M,[ASCIZ /Swapping space used = /]
	MOVE	A,XK4SWP
	PUSHJ	P,GETZ
	JUMPE	A,[MOVE   A,CORMAX
		   ASH	  A,-12
		   MOVEM  A,TEMP
		   JRST   MUS3]
	MOVEM	A,TEMP
	MOVE	N,DSKUSE
	PUSHJ	P,PRPCNT
	MOVEI	M,[ASCIZ /Swapping Space Lost = /]	;[166]
	MOVE	A,XSWPER	;[166]
	PUSHJ	P,GETZ		;[166]
	JUMPE	A,MUS3		;[166]
	HRRZ	N,A		;[166]
	TRZ	N,770000	;[166]
	PUSHJ	P,MSGDEC	;[166]
	PUSHJ	P,CRLF		;[166]
MUS3:	MOVEI	M,[ASCIZ /Virt. Core used = /]
	MOVE	N,CORUSE
	PUSHJ	P,PRPCNT
	MOVE	N,CORMAX
	ASH	N,-11
	SKIPN	CPKI10		;FOR A KI10 ALL IS OKAY
	ASH	N,-1		;BUT SHIFT 1 MORE FOR A KA10
	MOVEM	N,TEMP
	SUB	N,CORUSE
	JUMPL	N,SWAP01
	MOVEI	M,[ASCIZ /K Core left/]
	SKIPE	CPKI10
	MOVEI	M,[ASCIZ /P Core left/]
	PUSHJ	P,DECMSG
	JRST	SWAP02

PRPCNT:	MOVEM	N,TEMP1
	PUSHJ	P,MSGDEC
	MOVSI	A,(SIXBIT ./.)
	MOVE	N,TEMP
	PUSHJ	P,SIXDEC
	MOVEI	M,[ASCIZ / = /]
	MOVE	N,TEMP1
	PUSHJ	P,CMPCNT
	MOVEI	M,[ASCIZ /%
/]
	JRST	MSG
SWAP01:	MOVEI	M,[ASCIZ /Swapping Ratio = /]
	MOVE	N,CORUSE
	PUSHJ	P,SWPPRT	;TYPE SWAPPING RATIO LINE
SWAP02:	MOVEI	M,[ASCIZ .
Active swapping ratio = .]
	MOVE	N,ACTUSE	;TOTAL ACTIVE VIRTUAL CORE
	PUSHJ	P,SWPPRT	;TYPE LINE
	SKIPN	N,CORSAV	;ANY CORE SAVED BY SHARING?
	JRST	SWAP03		;NO-DON'T PRINT ANYTHING
	MOVEI	M,[ASCIZ /
Virt. Core saved by sharing = /]
	PUSHJ	P,MSGDEC
	MOVSI	A,(SIXBIT ./(.)
	MOVE	N,CORSAV
	PUSHJ	P,SIXDEC
	MOVSI	A,(SIXBIT .+.)
	MOVE	N,CORUSE
	PUSHJ	P,SIXDEC
	MOVEI	M,[ASCIZ /) = /]
	MOVE	N,CORSAV
	ADD	N,CORUSE
	MOVEM	N,TEMP
	MOVE	N,CORSAV
	PUSHJ	P,CMPCNT	;COMPUTE PERCENTAGE & PRINT
	MOVSI	A,(SIXBIT .%.)
	PUSHJ	P,SIXBP
SWAP03:	PUSHJ	P,CRLF
	MOVE	N,NUMJOB	;NUMBER OF ACTIVE JOBS
	MOVEM	N,TEMP		;USE AS DIVISOR
	MOVEI	M,[ASCIZ .Average job size =.]
	MOVE	N,LOWUSE	;TOTAL OF LOW SEG SIZES
	PUSHJ	P,SWPPRT	;TYPE AVERAGE LOW SEG SIZE
	CALL	KAYPEE		;**[9] PRINT K OR P
	MOVEI	M,[ASCIZ .+.]
	MOVE	N,CORUSE	;TOTAL CORE USED
	ADD	N,CORSAV	;PLUS SAVED BY SHARING
	SUB	N,LOWUSE	;MINUS LOW SEGS= HIGH SEGS
	PUSHJ	P,SWPPRT	;TYPE AVERAGE HIGH SEGMENT SIZE
	CALL	KAYPEE		;**[9] PRINT K OR P
	MOVEI	M,[ASCIZ .  Total=.]
	MOVE	N,CORUSE	;TOTAL CORE USED
	ADD	N,CORSAV	;PLUS SAVED BY SHARING
	PUSHJ	P,SWPPRT	;TYPE AVERAGE TOTAL SIZE
	CALL	KAYPEE		;**[9] PRINT K OR P
	PUSHJ	P,CRLF
	CAIE	WD,L.GSS	;GENERAL SYSTEM STATISTICS ONLY?
	CAIN	WD,L.JSO	;PRINT JOB STATUS ONLY?
	JRST	FINIS		;YES-GO SEE IF WE SHOULD EXIT. OR INTERPRET MORE CHS.
	SUBTTL	"B" - DEVICE STATUS
DEVQ:	TLZ	F,FL.DEV	;CLEAR HEADER FLAG
	SETOM	FSDCNT		;SET 1ST PASS FLAG
	SETZM	DSKDDB		;CLEAR COUNTER OF DISK DDBS
	MOVE	A,XDVLST
	PUSHJ	P,GETZ
DEVLP1:	HLRZ	D,A		;GET POINTER
	MOVEI	JS,^D10000	;PROTECT AGAINST INF. LOOP
DEVLP:	JUMPE	D,DEVEND	;EXIT. LOOP IF ALL DONE
	MOVEI	C,DV.MOD(D)
	PUSHJ	P,PEEKC
	MOVE	B,C
	TRNN	B,ASSCON+ASSPRG
	JRST	NXTDEV
	MOVEI	C,DV.LOG(D)	;GET LOGICAL NAME
	PUSHJ	P,PEEKC		;FROM DDB
	MOVEM	C,LOGNAM	;SAVE FOR LATER
	MOVEI	A,DV.NAM(D)
	PUSHJ	P,PEEKA
	MOVEI	C,@.DVJOB	;[212] NEW ENTRY IN DDB SINCE LOAD 722
	SKIPN	NPJOBN		;IF NEW STYLE THEN SKIP
	MOVEI	C,DV.CHR(D)
	PUSHJ	P,PEEKC
	LDB	J,PJOBN		;YES--GET JOB NUMBER
	SKIPE	NPJOBN		;IF NOT NEW STYLE
	LDB	J,NPJOBN	;GET JOB NUMBER SOMEWHERE ELSE
	MOVEI	C,DV.SPL(D)	;**[5] GET DEVSPL DDB ENTRY
	CALL	PEEKC		;**[C] IN C ASS J HAS BEEN SET
	SKIPL	C		;**[5] SPOOLED DEVICES USE A DISK DDB
	TLNE	B,DVDSK		;SEE IF DISK
	AOS	DSKDDB		;YES--COUNT IT
	TLNE	B,DVTTY		;SEE IF TTY
	TLNE	B,DVTTYC	;IF I/O TTY ALWAYS DO IT
	TLNN	B,DVTTY+DVDSK	;SEE IF TTY OR DISK
	JRST	DEVDO		;NO--JUST GO DO IT
	TLNE	F,FL.DSK	;IS IT DISK MODE?
	JRST	DEVDO		;YES--ALWAYS DO ALL DEVICES
	TLNN	F,FL.LPT!FL.GOD	;IF THIS IS OPER WORK
	CAMN	J,MYJOB		;OR SAME JOB
	SKIPN	LOGNAM		;AND THERE IS A LOGNAM
	JRST	NXTDEV		;**[5] FORGET THE THING
DEVDO:	SKIPE	N1,ONEJOB	;SEE IF SINGLE JOB
	CAMN	J,N1		;YES--SEE IF MATCHES
	JRST	.+2		;A WINNER
	JRST	NXTDEV		;NO--SKIP IT
	SKIPN	N1,ONEPPN	;[147]MAKE WILD CARDS WORK; WAS ANY PPN
	JRST	DEVTTY		;[147]SPECIFIED?  NO; GO ON.
	MOVE	N,@.PPN		;[147]LOAD UP PPN OF DEVICE.
	TRNN	N1,-1		;[147]RIGHT HALF OF SPEC'D PPN WILD?
	TRZ	N,-1		;[147]YES; ZERO IT IN DEV PPN FOR MATCH.
	TLNN	N1,-1		;[147]HOW ABOUT THE LEFT HALF?
	TLZ	N,-1		;[147]DITTO.
	CAME	N,N1		;[147]IF THEY AREN'T SAME NOW,
	JRST	NXTDEV		;[147]GET ANOTHER DEVICE.
DEVTTY:	SKIPGE	N1,ONETTY	;[147](LABEL ADDITION) ;SEE IF SINGLE TTY MODE
	JRST	TTYOKD		;NO--PROCEED
	SETOM	N		;PRESET FOR TEST
	CAMN	N1,@.TTYN	;YES--SEE IF IT MATCHES
	CAMN	N,@.PPN		;SEE IF HIDDEN
	JRST	NXTDEV		;NO--SKIP IT
TTYOKD:	TLNE	B,DVTTY		;IF TTY
	TLNE	A,-1		;AND LH=0
	JRST	.+2		;NO
	HRLI	A,'DET'		;YES--DETACHED
	MOVEI	M,[ASCIZ /
Busy devices:
Device	Job	Why	Logical

/]
	TLNE	F,FL.DSK	;SEE IF DISK MODE
	MOVEI	M,[ASCIZ /
Busy devices:
Device	Job	Address	Why	Logical	UNILOG	DEVFIL	DEVEXT	DEVPPN

/]
	TLON	F,FL.DEV
	PUSHJ	P,MSG
	MOVEI	CH,"'"		;GET FLAG IN CASE DISK
	SKIPL	C		;**[6] IF SPOOLELED OR
	TLNE	B,DVDSK		;IS IT DISK?
	PUSHJ	P,TYO		;YES--OUTPUT FLAG FIRST
	HLRZ	CH,A		;GRAB FIRST 3 CHARS
	CAIN	CH,'PTY'	;IS IT A PTY?
	JRST	[MOVEI	CH,0	;YES, MAYBE LIST ANYWAY
		OR	CH,ONEJOB
		OR	CH,ONEPPN
		ORCM	CH,ONETTY
		SKIPE	CH	;NONE OF THESE
		JRST	.+1	;GIVE HIM THE PTY ANYWAY
		CAME	J,MYJOB	;ESPECIALLY IF IT IS HIS
		TLNE	F,FL.LPT!FL.GOD	;OR HE DESERVES IT
		JRST	.+1
		JRST	NXTDEV]	;SPARE HIM THE TYPEOUT
	PUSHJ	P,SIXTAB	;PRINT SIXBIT MSG FOLLOWED BY TAB
	MOVE	N,J		;**[5] GET JOB NUMBER
	PUSHJ	P,DECP2X
	PUSHJ	P,TAB
	TLNN	F,FL.DSK	;SEE IF DISK MODE
	JRST	DVWHY		;NO--PROCEED
	MOVEI	N,(D)		;YES--GET ADDRESS OF DDB
	MOVEI	CH,-1		;SET FOR 6 DIGITS
	PUSHJ	P,FIXOCT	;OUTPUT IT
	PUSHJ	P,TAB		;AND SPACE
DVWHY:	MOVEI	M,[ASCIZ /as/]
	TRNE	B,ASSCON
	PUSHJ	P,MSG
	TRNN	B,ASSPRG
	JRST	DVLOG
	MOVEI	CH,"+"
	TRNE	B,ASSCON
	PUSHJ	P,TYO
	MOVEI	M,[ASCIZ /init/]
	PUSHJ	P,MSG
DVLOG:	TLNN	F,FL.LPT!FL.GOD	;IF FOR OPERATOR
	CAMN	J,MYJOB		;OR THIS JOB
	SKIPN	A,LOGNAM	;AND THERE IS A LOGICAL NAME
	JRST	DVFILE		;NO--SKIP IT
	PUSHJ	P,TABSIX	;OUTPUT IT
DVFILE:	TLNE	F,FL.DSK	;IN DSK MODE?
	TLNN	B,DVDSK		;AND IS THIS A DSK DDB
	JRST	DVCRLF		;NO--SKIP IT
	SKIPN	LOGNAM		;NEED A TAB?
	PUSHJ	P,TAB		;YES
	MOVEI	A,@.DVUNI	;GET UDB ADDRESS
	PUSHJ	P,PEEKA
	TRNN	A,-1		;DOES "CURRENT" EXIST?
	MOVS	A,A		;IF NOT, USE "ORIGINAL" UDB
	TLZ	A,-1		;SEE IF WE HAVE AN ADDRESS
	JUMPE	A,DVLOG1	;?
	MOVEI	A,UNILOG(A)	;GET UNIT'S LOGICAL NAME
	PUSHJ	P,PEEKA		;...
DVLOG1:	PUSHJ	P,TABSIX	;AND PRINT IT
DVLOGN:	MOVEI	A,@.DVFIL	;USE D AS INDEX
	PUSHJ	P,PEEKA
	JUMPE	A,DVCRL0	;FORGET IT IF ITS ZERO
	PUSH	P,A		;SAVE FILE NAME
	MOVEI	A,@.DVEXT	;GET EXTENSION USE D AS INDEX
	PUSHJ	P,PEEKA
	TRZ	A,-1
	PUSHJ	P,TAB		;LINE IT UP
	CAME	A,[SIXBIT /UFD/]
	JRST	DVFIL1		;PRINT SIXBIT NAME
	EXCH	A,(P)		;GET UFD PPN
	PUSHJ	P,OCTPRA	;PRINT IT
	JRST	DVFIL2		;GO DO THE EXTENSION
DVFIL1:	EXCH	A,(P)		;GET SIXBIT FILE NAME
	PUSHJ	P,SIXBP		;DISPLAY IT
DVFIL2:	POP	P,A		;EXTENSION
	PUSHJ	P,TABSIX	;PRINT IT
	MOVEI	A,@.DVPPN	;GET OWNER USE D AS INDEX
	PUSHJ	P,PEEKA
	PUSHJ	P,PNTPPN	;AND PRINT IT
DVCRL0:
DVCRLF:	PUSHJ	P,CRLF
NXTDEV:	MOVEI	C,DV.SER(D)
	PUSHJ	P,PEEKC
	HLRZ	D,C
	SOJG	JS,DEVLP

DEVEND:	MOVE	A,MONVER	;GET MONITOR VERSION
	CAIGE	A,67700		;7.00 FIELD TEST OR LATER?
	JRST	DEVEN4		;NO, QUIT NOW
	TLNN	F,FL.DSK	;READING A CRASH?
	JRST	DEVEN2		;NO
DEVEN1:	AOS	J,FSDCNT	;BUMP JOB # COUNT
	CAML	J,JOBN		;DONE THEM ALL YET?
	JRST	DEVEN4		;YES
	MOVE	A,@.STS		;PICK UP JOB STATUS
	TLNN	A,JNA		;JOB NUMBER ASSIGNED?
	JRST	DEVEN1		;NO, TRY NEXT
	JRST	DEVEN3		;JOIN COMMON CODE
DEVEN2:	AOSE	FSDCNT		;BEEN HERE BEFORE?
	JRST	DEVEN4		;YES, THAT'S ALL
	SKIPE	A,ONEJOB	;USER SPECIFY JUST ONE JOB?
	CAME	A,MYJOB		;AND IS IT THIS ONE?
	JRST	DEVEN4		;NO, DON'T PRINT ANY DDB'S
DEVEN3:	SKIPE	A,.UPLST	;GET ADDRESS OF PTR TO DISK DDB'S
	PUSHJ	P,PEEKA		;READ FROM OUR PAGE MAP
	JUMPN	A,DEVLP1	;PRINT ANY DISK DDB'S
	TLNE	F,FL.DSK	;READING A CRASH?
	JRST	DEVEN1		;YES, TRY NEXT JOB

DEVEN4:	SETOM	FSDCNT		;SET FLAG AGAIN
	SKIPN	ONEJOB		;SEE IF SINGLE JOB
	SKIPE	ONEPPN		;SEE IF SINGLE PPN
	JRST	FINIS		;YES--ALL DONE
	SKIPL	ONETTY		;SEE IF SINGLE TTY
	JRST	FINIS		;YES--FINISH UP
	MOVEI	M,[ASCIZ /
No busy devices
/]
	TLZN	F,FL.DEV
	PUSHJ	P,MSG
	MOVEI	M,[ASCIZ / disk DDBs
/]
	MOVE	CH,MONVER	;GET VERSION OF MONITOR
	SKIPE	N,DSKDDB	;GET DISK DDB COUNT
	CAIL	CH,67700	;7.00 FIELD TEST OR LATER?
	CAIA			;YES, DON'T PRINT
	PUSHJ	P,DECMSG	;OUTPUT IT IF THERE ARE ANY

DEVFIN:	CAIN	WD,L.BDO	;PRINT BUSY DEVICES ONLY?
	JRST	FINIS		;YES-GO SEE IF WE SHOULD EXIT. OR INTERPRET MORE CHS.
	SUBTTL	"F" - FILE STRUCTURE STATUS

FS:	TLZ	F,FL.DEV	;CLEAR HEADER FLAG
	SETZB	A,C
	MOVE	A,XSYSST
	PUSHJ	P,GETA
FS1:	HLRZ	D,A
	JUMPE	D,FSFIN
	MOVEI	A,STRNAM(D)
	PUSHJ	P,PEEKA
	JUMPE	A,FSL1		;[205] IF BLANK STRUCTURE NAME, PROCEED
	MOVEI	M,[ASCIZ /
System File Structures:
Name	Free	Mount
/]
	TLON	F,FL.DEV	;TYPED THIS HEADING YET?
	PUSHJ	P,MSG		;NO. DO IT NOW.
	PUSHJ	P,SIXTAB	;TYPE STRUCTURE NAME
	MOVEI	A,STRTAL(D)
	PUSHJ	P,PEEKA
	MOVE	N,A
	ADD	C,N		;ACCUMULATE IT IN THE TOTAL
	PUSHJ	P,DECTAB	;PRINT IT
	MOVEI	A,STRMNT(D)
	PUSHJ	P,PEEKA
	MOVE	N,A
	PUSHJ	P,DECPRT	;PRINT IT
	MOVEI	M,[ASCIZ /	Private structure/]
	MOVEI	A,STRUN1(D)	;POINT TO WORD CONTAINING STPPVS
	PUSHJ	P,PEEKA		;GET IT
	TRNE	A,STPPVS	;THIS STR PRIVATE?
	PUSHJ	P,MSG		;YES, TELL THE USER
	MOVEI	M,[ASCIZ /	Single Access by job /]
	MOVEI	A,STRJOB(D)
	PUSHJ	P,PEEKA
	JUMPLE	A,FSNNA
	HRRZ	N,A
	PUSHJ	P,MSGDEC	;AND PRINT HIS NUMBER
FSNNA:	MOVEI	M,[ASCIZ /	No New Accesses/]
	MOVEI	A,STRUNI(D)
	PUSHJ	P,PEEKA
	HLRZM	A,UNIBLK	;SET THE UDB ADDRESS
	PUSH	P,D		;SAVE STR ADDRESS
	CALL	GETDES		;GET UNIDES
	POP	P,D		;RESTORE D
	TLNE	A,(.UPNNA)	;SEE IF NNA
	PUSHJ	P,MSG		;YES--PRINT FLAG
FSL:	PUSHJ	P,CRLF		;GO TO NEW LINE
FSL1:	MOVEI	A,STRSYS(D)	;[205]
	PUSHJ	P,PEEKA
	JRST	FS1		;LOOP

FSFIN:	MOVE	N,C		;TOTAL FREE
	MOVEI	M,[ASCIZ /Total Free /]
	PUSHJ	P,MSGDEC	;PRINT IT
	PUSHJ	P,CRLF		;NEW LINE
	CAIN	WD,L.FSO	;PRINT FILE STRUCTURES ONLY?
	JRST	FINIS		;YES-GE SEE IF WE SHOULD EXIT. OR INTERPRETMORE CHS.
	SUBTTL	"T" - DATA SET TABLE

DSCDO:	MOVE	A,XDSCTB	;GET POINTER TO DATASET TABLE
	PUSHJ	P,GETZ		;(OPTIONAL)
	JUMPGE	A,DSCFIN	;SKIP TABLE IF EMPTY
	TLZA	F,FL.DEV	;CLEAR HEADER FLAG

DSCLP:	AOBJP	A,DSCFIN	;EXIT WHEN DONE
	HRRZ	C,A		;GET LOCATION OF THIS ENTRY
	PUSHJ	P,PEEKC		;LOOK AT IT
	TLNN	C,(DSCSTS)	;SEE IF OTHER THAN IDLE
	JRST	DSCLP		;IDLE--SKIP THIS ENTRY
	MOVEI	M,[ASCIZ /
Dataset Control
TTY#	Status

/]
	TLON	F,FL.DEV	;SEE IF HEADER OUTPUT YET
	PUSHJ	P,MSG		;NO--DO IT
	HRRZ	N,C		;GET TTY NUMBER (RH)
	PUSHJ	P,OPRN2X	;TYPE IT
	PUSHJ	P,TAB		;SPACE TO STATUS
	LDB	N,[POINT 3,C,2+^L<DSCSTS>]
	CAIN	N,6		;CHECK SPECIAL CASE FIRST
	TLNN	C,(DSCTIM)	;TIMED STATE 6
	JRST	DSCREG		;NO--REGULAR STUFF
	MOVEI	M,[ASCIZ /new call/]
	JRST	DSCMSG		;HAS NOT TYPED COMMAND YET

DSCREG:	SKIPE	M,DSCMTB-1(N)	;GET STANDARD MESSAGE IF ANY
	JRST	DSCMSG		;GO OUTPUT IT
	PUSHJ	P,OPRNT		;NO--TYPE OCTAL STATUS
	JRST	.+2		;AND SKIP
DSCMSG:	PUSHJ	P,MSG		;OUTPUT MESSAGE
	PUSHJ	P,CRLF		;AND END LINE
	JRST	DSCLP		;AND LOOP BACK

DSCMTB:	0	;STATE=1
	[ASCIZ /rang/]
	[ASCIZ /carrier interrupt/]
	0	;4
	0	;5
	[ASCIZ /in use/]
	0	;7

DSCFIN:	CAIN	WD,L.DSC	;SEE IF JUST THIS DISPLAY
	JRST	FINIS		;YES--EXIT
	SUBTTL	"E" - NON-DISK ERROR REPORT

	TLNN	F,FL.DSK!FL.LPT	;SEE IF FOR OPERATOR
	JRST	SWFIN		;NO--SKIP REST OF DISPLAYS
ERRPT:	TLZ	F,FL.DEV	;CLEAR TITLE FLAG
	MOVSI	D,-ERRTL1	;SETUP TABLE POINTER

ERRLP1:	MOVE	A,ERRTB1(D)	;GET NEXT GETTAB
	PUSHJ	P,GETZ		;GET IT IF POSSIBLE
	JUMPE	A,ERRLX1	;ZERO--EITHER NOT THERE OR NOT USED
	MOVEI	M,[ASCIZ /
Non-disk Performance

/]
	TLON	F,FL.DEV	;SEE IF TITLE DONE YET
	PUSHJ	P,MSG		;OUTPUT TITLE
	MOVE	N,A		;SAVE COUNT
	HRRZ	M,ERRTM1(D)
	MOVE	B,ERRTM1(D)
	JUMPL	B,ERRLA1
	TLZE	B,200000	;DECIMAL HALF WORDS?
	JRST	ERRLA2		;YES
ERRLA3:	PUSHJ	P,DECMSG	;OUTPUT DECIMAL NUMBER AND MESSAGE
	JRST	ERRLY1		;JUMP TO FINISH LINE

ERRLA2:	HLRZS	N		;PRINT AS DECIMAL HALF WORDS
	PUSHJ	P,DECPRT	;PRINT LEFT HALF
	PUSHJ	P,COMMA
	HRRZ	N,A		;GET RIGHT HALF
	JRST	ERRLA3		;PRINT RH AND MSG
ERRLA1:	PUSHJ	P,OCTPRT	;OUTPUT OCTAL NUMBER
	PUSHJ	P,MSG		;OUTPUT MESSAGE
ERRLY1:	TLNN	B,140000
	JRST	ERRLY2
	MOVEM	A,TEMP
	MOVE	A,[%CVUPT]
IFG NCPUS-1,<
	TLNE	B,20000
	ADDI	A,2
>
IFG NCPUS-2,<
	TLNE	B,10000
	ADDI	A,4
>
IFG NCPUS-3,<
	TLNE	B,4000
	ADDI	A,6
>
	TLNE	B,2000
	MOVE	A,[%CNSUP]
	PUSHJ	P,FGETTB	;TRY TO GET UPTIME
	 JRST	[MOVE A,XUPTIM 	;DEFAULT TO TOTAL
		 PUSHJ P,GETA	;SYSTEMS UPTIME
		 JRST .+1 ]
	EXCH	A,TEMP
	IMULI	A,^D60
	TLNE	B,40000
	IMUL	A,TCKSEC	;[201] REMEMBER ENGLAND !
	PUSHJ	P,CMPDFA
	MOVEI	M,[ASCIZ \/Second\]
	TLNE	B,40000
	MOVEI	M,[ASCIZ \/Minute\]
	PUSHJ	P,MSG
ERRLY2:	PUSHJ	P,CRLF		;END LINE
ERRLX1:	AOBJN	D,ERRLP1	;LOOP BACK UNTIL DONE

;PRINT LAST STOPCD INFORMATION
	MOVE	A,[3,,51]	;GET LAST STOPCODE DATA
	PUSHJ	P,GETZ		;GET IT OR A ZERO
	JUMPE	A,NSTOPC	;THERE WAS NO STOPCD
	PUSH	P,A		;SAVE STOPCD INFO
	HLLZ	BP,A		;COPY STOP CODE NAME
	PUSHJ	P,SIXBP1	;PRINT SIXBIT CODE
	MOVEI	M,[ASCIZ / was last STOPCD type=/]
	PUSHJ	P,MSG		;PRINT NAME
	POP	P,A		;RESTORE STOPCD INFO
	HRRZ	A,A		;ISOLATE ADDRESS
	PUSHJ	P,PEEKA		;GET STOPCD TYPE
	LDB	A,[POINT 3,A,12] ;GET TYPE ( IGNORE LONG FORM BIT )
	MOVE	M,STOPT(A)	;GET TYPE OF STOPCD
	PUSHJ	P,MSG		;PRINT IT AND
	PUSHJ	P,CRLF		;A NEW LINE
NSTOPC:
REPEAT 0,<			;HISTORICAL STUFF

	TLNN	F,FL.DSK	;SEE IF DISK MODE
	JRST	ERRXIT		;NO--SKIP CRASH STUFF
	MOVE	A,XPCMA		;GET PC AND MA (FROM SWITCHES)
	PUSHJ	P,GETZ		;FROM MONITOR
	JUMPE	A,ERRLX0	;NOT USEABLE
	MOVEM	A,D		;SAVE FOR LATER
	PUSHJ	P,CRLF		;START NEW LINE
	MOVEI	M,[ASCIZ /PC=/]
	HLRZ	N,A		;GET PC
	PUSHJ	P,MSGOCT	;OUTPUT PC
	MOVEI	M,[ASCIZ /  MA=/]
	HRRZ	N,A		;GET MA
	PUSHJ	P,MSGOCT	;OUTPUT MA
	MOVE	A,XPIIP		;GET PI SYSTEM
	PUSHJ	P,GETZ		;FROM MONITOR
	ANDI	A,77400		;MASK TO IN-PROGRESS
	JUMPE	A,ERRLXX	;SKIP IF NONE
	MOVSI	B,-^D8		;SET UP COUNT
	MOVEI	M,[ASCIZ /  PIs in prog=/]
ERRLPX:	AOBJP	B,ERRLXX	;COUNT EACH CHANNEL
	LSH	A,1		;POSITION BITS
	TRNN	A,100000	;SEE IF ON
	JRST	ERRLPX		;LOOP IF NOT
	HRRZ	N,B		;GET CHANNEL NUMBER
	PUSHJ	P,MSGDEC	;OUTPUT NUMBER
	MOVEI	M,[ASCIZ /,/]
	JRST	ERRLPX		;LOOP FOR MORE
ERRLXX:	PUSHJ	P,CRLF		;END LINE

ERRLX0:	MOVE	A,MONVER	;IS MONITOR .GT. 5.04?
	CAIGE	A,50400
	JRST	ERRLX2		;NO, "JOB" IS 150
	MOVEI	A,20		;YES, "JOB" IS 20.  GET IT.
	PUSHJ	P,PEEKA
	TLNN	A,-1		;DUAL PROCESSOR?
	JRST	ERRLX3		;NO, PRINT C(JOB)
	MOVEI	M,[ASCIZ /Job (CPU1,,CPU0)  /]
	HLRZ	N,A		;GET CPU1 JOB
	PUSHJ	P,MSGDEC
	MOVEI	M,[ASCIZ /,,/]
	HRRZ	N,A		;GET CPU0 JOB
	PUSHJ	P,MSGDEC	;PRINT IT
	JRST	ERRLX4		;DONE WITH C(JOB)

ERRLX2:	MOVEI	A,150		;GET JOB (FOR MONITOR OLDER THAN 5.04)
	PUSHJ	P,PEEKA		;FROM MONITOR
ERRLX3:	MOVE	N,A		;MOVE TO OUTPUT
	MOVEI	M,[ASCIZ /job  /]
	PUSHJ	P,MSGDEC	;OUTPUT IT
ERRLX4:	MOVEI	A,30		;READ LOCATION 30
	PUSHJ	P,PEEKA		;FROM MONITOR
	MOVE	N,A		;SETUP FOR OUTPUT
	MOVEI	M,[ASCIZ /	C(30)  /]
	PUSHJ	P,MSGOCT	;OUTPUT IT
	PUSHJ	P,CRLF		;NEW LINE
	MOVE	A,XAPRCN	;GET APR CONI
	PUSHJ	P,GETZ		;FROM CRASH
	ANDI	A,7		;GET CHANNEL OF APR
	ADDI	A,40(A)		;GET 40+2*A
	PUSHJ	P,PEEKA		;LOOK IN CORE AS JSR FOR CLOCK
	ANDI	A,-1		;CLEAR JUNK
	CAML	A,DSKFLG	;MAKE SURE IT IS OK
	JRST	ERRNCL		;NO--SKIP THIS LINE
	PUSHJ	P,PEEKA		;GET PC AT LAST CLOCK
	MOVE	N,A		;MOVE TO OUTPUT
	MOVEI	M,[ASCIZ /PC at trap  /]
	PUSHJ	P,MSGOCT	;OUTPUT LINE
	PUSHJ	P,CRLF		;AND END LINE
	PUSHJ	P,GETBTH	;GET IT AND IT-1
	  JRST	ERRNCL		;SKIP IF JUNK
	MOVE	N,C		;GET -1
	MOVEI	M,[ASCIZ /C(PCT-1)  /]
	PUSHJ	P,MSGOCT	;OUTPUT IT
	MOVE	N,A		;GET IT
	MOVEI	M,[ASCIZ /	C(PCT)	/]
	PUSHJ	P,MSGOCT	;PRINT IT
	PUSHJ	P,CRLF		;END OF LINE

ERRNCL:	HLRZ	A,D		;GET PC
	PUSHJ	P,GETBTH	;GET IT AND IT-1
	  JRST	ERRNPC		;SKIP IF BAD
	MOVE	N,C		;GET -1
	MOVEI	M,[ASCIZ /C(PC-1)   /]
	PUSHJ	P,MSGOCT	;OUTPUT IT
	MOVE	N,A		;GET IT
	MOVEI	M,[ASCIZ /	C(PC)   /]
	PUSHJ	P,MSGOCT	;OUTPUT IT
	PUSHJ	P,CRLF		;END LINE

ERRNPC:	HRRZ	A,D		;GET MA
	PUSHJ	P,GETBTH	;GET IT AND IT-1
	  JRST	ERRNMA		;SKIP IF BAD
	MOVE	N,C		;GET MA-1
	MOVEI	M,[ASCIZ /C(MA-1)   /]
	PUSHJ	P,MSGOCT	;OUTPUT IT
	MOVE	N,A		;GET MA
	MOVEI	M,[ASCIZ /	C(MA)   /]
	PUSHJ	P,MSGOCT	;OUTPUT IT
	PUSHJ	P,CRLF		;END LINE

ERRNMA:

> ;END REPEAT 0 OF HISTORICAL STUFF
ERRXIT:	CAIN	WD,L.ERR	;SEE IF JUST THIS DISPLAY
	JRST	FINIS		;YES--END
	JRST	DP		;NO--PROCEED

ERRTB1:
XMNVER:	EXP	%CNVER
	EXP	%CNPOK
	EXP	%CNPUC
	EXP	%NSTPE
	EXP	%NSSPE
	EXP	%NSMPC
	EXP	%NSMPA
	EXP	%NSMPW
	EXP	%NSMPP
	EXP	%NSEPO
	EXP	%NSEPR
	EXP	%NSABC
	EXP	%NSABA
	EXP	%SYNCP
DEFINE	EACHCPU(CPUN),<
	EXP	%CVTUC+CPUN+CPUN
>
	ALLCPUS
DEFINE	EACHCPU(CPUN),<
	EXP	%CVTJC+CPUN+CPUN
>
	ALLCPUS
	0,,51			;SYSERR COUNT
	2,,51			;DISABLED ERROR COUNT
	4,,51			;NUMBER OF DEBUG STOPCDS
	5,,51			;NUMBER OF JOB STOPCDS
ERRTL1==.-ERRTB1

;ERROR PRINT MESSAGES:
;	BIT 0 - PRINT COUNT IN OCTAL
;	BIT 1 - PRINT COUNT AS DECIMAL HALF WORDS
;	BIT 2 - PRINT AVERAGE NUMBER OF OCCURRENCES/SECOND
;	BIT 3 - PRINT AVERAGE NUMBER OF OCCURRENCES/MINUTE
;	BIT 4 - PRINT FOR CPU1
;	BIT 5 - PRINT FOR CPU2
;	BIT 6 - PRINT FOR CPU3
;	BIT 7 - USE SYSUPT, NOT .C0UPT

ERRTM1:
    1B0+[ASCIZ /=monitor version/]
    1B0+[ASCIZ / address of last POKE uuo/]
    1B1+[ASCIZ / lh=job that POKEd, rh=# of POKEs/]
	[ASCIZ / user memory parity errors/]
	[ASCIZ / spurious memory parity errors/]
	[ASCIZ / continues after memory parity errors/]
    1B0+[ASCIZ / address of last memory parity error/]
    1B0+[ASCIZ / contents of last memory parity error/]
    1B0+[ASCIZ / PC of last memory parity error/]
    1B2+[ASCIZ / EXEC PDL overflows=/]
    1B2+[ASCIZ / recovered EXEC PDL overflows=/]
	[ASCIZ / address breaks/]
    1B0+[ASCIZ /=switches on last address break/]
    1B3+1B7+[ASCIZ /=Number of commands processed=/]
DEFINE	EACHCPU(CPUN),<
	ZZZ==1B2
	IFG CPUN,<ZZZ==ZZZ!1B<4+CPUN-1>>
    ZZZ+[ASCIZ /=Number of UUOs executed on CPU'CPUN=/]
>
	ALLCPUS
DEFINE	EACHCPU(CPUN),<
	ZZZ==1B2
	IFG CPUN,<ZZZ==ZZZ!1B<4+CPUN-1>>
    ZZZ+[ASCIZ /=Number of context switches on CPU'CPUN=/]
>
	ALLCPUS
	[ASCIZ /=system wide hardware error count/]
	[ASCIZ /=number of errors for which logging was disabled/]
	[ASCIZ /=number of DEBUG STOPCDs/]
	[ASCIZ /=number of JOB STOPCDs/]
SUBTTL "P" - PERFORMANCE OF DISKS INCLUDING ERRORS

DP:	PUSHJ P,CRLF
	LDB	D,DSKLEV	;DISK LEVEL NO. FROM STATES WORD
	SKIPE	D		;BEFORE 5.01?
	SKIPE	TNFRTY		;NO, SEE IF 10/40N
	JRST	SWFIN		;YES--SKIP DISK PERFORMANCE
	CAIN WD,L.DPO		;"P" TYPED?
	PUSHJ	P,THISIS	;YES--GIVE SYSTEM HEADER
	MOVEI M,[ASCIZ .
Disk performance statistics:
.]
	PUSHJ P,MSG
	SETZM CURFS
	TRZ	F,FR.NFS	;CLEAR "NOT IN A F/S" CODE FLAG
	MOVEI M,[ASCIZ .Unit or F/S
	BR	BW	DR	DW	XR	XW	MR	MW
.]
	PUSHJ P,MSG

	MOVE	A,XSYSST	;SYS STR LIST POINTER
	PUSHJ	P,GETA
FLFSL:	HLRZ	C,A
	JUMPE	C,FLNFS		;IF 0, GO TO UNITS NOT IN ANY F/S
	MOVEM	C,CURFS		;C GETS CLOBBERED LATER
	MOVEI	A,STRNAM(C)
	PUSHJ	P,PEEKA
	JUMPE	A,FLFSN		;[226] GET NEXT STRUCTURE IF STRUCTURE NAME IS NULL;
	PUSHJ	P,SIXBP		;TYPE F/S NAME
	PUSHJ	P,TAB
	MOVEI	A,STRTAL(C)	;GET BLOCKS LEFT
	PUSHJ	P,PEEKA
	MOVE	N,A
	PUSHJ	P,DECPRT	;PRINT IT
	MOVEI	M,[ASCIZ . Free
.]
	PUSHJ	P,MSG
;UNIT STUFF HERE

	MOVEI	A,STRUNI(C)
	PUSHJ	P,PEEKA
FLUNL:	HLRZ	D,A		;D NOW POINTS TO THE UDB
	JUMPE	D,FLFSN		;DONE ALL UNITS?
FLUNL1:	MOVEM	D,UNIBLK	;SET POINTER FOR USE BY ERROR STATISTICS CODE
	movsi	n,-6		;6 read write varibles
	hrri	n,unibrc(d)	;start at unibrc
	setzm	iocnt		;no one read
flu000:	hrrz	a,n		;get the address
	pushj	p,peeka		;get the count
	addb	a,iocnt		;store in both
	jumpn	a,flu010	;non zero then report
	aobjn	n,flu000	;try next entry
	CALL	GETDES		;GET UNIDES
	tlne	a,210000	;ofline zero mount
	pjrst	flunn		;next unit
	ldb	a,[point 2,a,8]	;uniust field
	jumpn	a,flunn		;unit is not mounted
	skipn	iocnt		;any i/o done
	jrst	flunn		;no do not report
flu010:	MOVEI	A,UNINAM(D)	;GET PHYSICAL UNIT NAME
	PUSHJ	P,PEEKA
	MOVEM	A,DSKBLK	;SAVE NAME IN CASE WE MUST DO DSKCHR UUO
	PUSHJ P,SIXBP
	MOVEI M,[ASCIZ /(/]
	PUSHJ P,MSG
	MOVEI A,UNIHID(D)
	PUSHJ	P,PEEKA
	PUSHJ P,SIXBP
	MOVEI M,[ASCIZ /): /]
	CALL	GETTAL		;GET UNITAL
	MOVE	N,A
	PUSHJ P,MSGDEC
	MOVEI M,[ASCIZ . Free, .]
	PUSHJ P,MSG
	MOVEI A,UNIUSC
	PUSHJ P,GETUDB
	MOVEI A,UNIMSC
	ADD A,UNIBLK
	PUSHJ P,PEEKA
	ADD N,A
	MOVEI M,[ASCIZ / Seeks
/]
	PUSHJ P,DECMSG
	MOVSI C,-UDTBL
FLUNL3:	HRRZ	A,UDTAB(C)
	CAIE	A,UNIXRA	;THIS OFFSET CHANGED IN 50634
	JRST	FLUNL0		;NO SKIP UPDATE
	CALL	GETXRA		;GET UNIXRA
	SKIPA	N,A		;SKIP GET UDB
FLUNL0:	PUSHJ P,GETUDB
	HLRE A,UDTAB(C)
	JUMPE A,FLUNLA
	JUMPL A,FLDIFF
	MOVE A,STATES
	TLNN A,(CANXRC)
	MOVEI N,0
	PUSH P,N
	TLZ N,-1
	PUSHJ P,TAB
	PUSHJ P,DECPRT
	POP P,N
	HLRZ N,N
	JRST FLUNLA

FLDIFF:	MOVNS A
	ADD A,UNIBLK
	PUSHJ	P,PEEKA
	SUB N,A
FLUNLA:	PUSHJ P,TAB
	PUSHJ P,DECPRT
	AOBJN C,FLUNL3
FLUN2:	PUSHJ P,CRLF
	TLZ F,FL.NBK+FL.DEV
	PUSHJ	P,SETDES	;GET DSKCHR BITS
	TLZ A,BITMSK
	JUMPE A,FLUN4
	PUSHJ P,SPACE
	TLO F,FL.NBK
	MOVSI C,-BITTL
FLBTL:	SKIPGE A
	PUSHJ P,PRTBIT
	LSH A,1
	AOBJN C,FLBTL
FLUN4:	LDB C,DSKLEV		;DISK LEVEL NO.
	CAILE	C,1		;5.01, 5.02 OR EARLIER?
	JRST	FLUN5		;NO, MUST BE 5.03 OR LATER

;HERE TO DO 5.01, OR 5.02 UNIT ERROR INFO
	MOVSI C,-UERRTL
FLUNL4:	HLRZ A,UERRT1(C)
	PUSHJ P,GETUDB
	HRRZ M,UERRT1(C)
	XCT UERRT2(C)
	PUSHJ P,@UERRT3(C)
	AOBJN C,FLUNL4
	JRST	FLUNN0		;FINISHED

;HERE TO DO 5.03 OR LATER UNIT ERROR INFO
FLUN5:	MOVSI	C,-UER2TL
FLUNL5:	HLRZ	A,UER2T1(C)
	PUSHJ	P,GETUDB
	HRRZ	M,UER2T1(C)
	XCT	UER2T2(C)
	PUSHJ	P,@UER2T3(C)
	AOBJN	C,FLUNL5
FLUNN0:	TLNE F,FL.NBK+FL.DEV
	PUSHJ P,CRLF
	SKIPE	A,DOALT		;ARE WE DOING ALTERNATE PATH?
	 JRST FLMAIN		;YES, GO BACK TO MAIN FOR NEXT
	MOVEI	A,UNI2ND(D)	;[224] GO GET ALTERNATE PART WORD
	PUSHJ	P,PEEKA		;0 IF NOT DUAL PORTED,
				;0,,ALTERNATE UDB ADDRESS IF MAIN
				;-1,,MAIN UDB ADDRESS IF ALTERNATE
				;400000,,ALTERNATE IF MAIN ON OTHER CPU
				;400001,,MAIN IF ALTERNATE ON OTHER CPU
	JUMPE	A,FLUNN		;GO IF NOT DUAL PORTED
	TLNN	A,1		;SKIP IF DOING ALTERNATE NOW
	 JRST FLALT		;SET UP TO DO ALTERNATE

FLUNN:	TRNE	F,FR.NFS
	JRST	FLNFS2
flunn2:	MOVEI	A,UNISTR(D)
	PUSHJ	P,PEEKA
	JRST FLUNL

FLFSN:	MOVE	C,CURFS
	MOVEI	A,STRSYS(C)
	PUSHJ	P,PEEKA
	JRST FLFSL		;LOOP FOR NEXT STRUCTURE

FLALT:	AOS	DOALT		;REMEMBER DOING ALTERNATE
	MOVEM	D,MAIND		;REMEMBER MAIN UDB (D)
	HRLZ	A,A		;PUT UDB (OF ALT) ADDR IN LEFT
	JRST	FLUNL		;GO THROUGH THIS LOOP AGAIN

FLMAIN:	MOVE	D,MAIND		;RESTORE D
	SETZM	DOALT		;RESET ALTERNATE FLAG
		JRST FLUNN
SETDES:	TLNE	F,FL.DSK	;DISK MODE?
	JRST	SETDE2		;YES
	MOVE	A,[XWD 1,DSKBLK]
	DSKCHR	A,		;NOTE! THIS IS THE ONLY WAY TO GET THE "SWP" BIT
	SETZ	A,
SETDE1:	HLLZ	A,A		;CLEAR OUT RH
	POPJ	P,0

SETDE2:	CALL	GETDES		;GET UNIDES
	HLLZ	B,A		;SAVE UNIDES
	SKIPN	C,CURFS		;GET F/S
	JRST	SETDE1		;RETURN IF NOT IN A F/S
	MOVEI	A,STRMNT(C)
	PUSHJ	P,PEEKA
	CAIN	A,0		;ZMT?
	TLO	B,UNPZMT
	MOVEI	A,STRJOB(C)
	PUSHJ	P,PEEKA
	CAILE	A,0		;SAF?
	TLO	B,UNPSAF
	HLLZ	A,B
	POPJ	P,0
;NOTE THAT SWP IS NEVER ON IF /X

;CODE FOR UNITS NOT IN ANY F/S
FLNFS:	TRO	F,FR.NFS!FR.NFP
	SETZM	CURFS
	MOVE	A,XSYSUN	;SYSTEM UNIT LIST POINTER
	PUSHJ	P,GETA
FLNFS1:	HLRZ	D,A
	JUMPE	D,FILEXI
	MOVEI	A,UNISTR(D)
	PUSHJ	P,PEEKA
	JUMPE	A,FLNFS3	;JUMP IF NOT IN A F/S
FLNFS2:	MOVEI	A,UNISYS(D)
	PUSHJ	P,PEEKA
	JRST	FLNFS1
FLNFS3:	MOVEI	M,[ASCIZ .Units not in any File Structure:
.]
	TRZE	F,FR.NFP
	PUSHJ	P,MSG
	JRST	FLUNL1
FILEXI:
SW:	MOVEI	M,[ASCIZ/
Active swapping statistics:
Class	Unit	R	W	Used(/]
	PUSHJ	P,MSG
	MOVEI	M,[ASCIZ/K)
/]
	SKIPE	CPKI10
	MOVEI	M,[ASCIZ/P)
/]
	PUSHJ	P,MSG
	MOVE	A,XSWPUN
	PUSHJ	P,GETA
	MOVEM	A,SWPUNI
	HLRZ	D,A
SWLP1:	MOVEI	M,[ASCIZ/  /]
	PUSHJ	P,MSG
	MOVEI	A,UNIK4S(D)
	PUSHJ	P,PEEKA
	LDB	N,[POINT 3,A,22]
	PUSHJ	P,DECTAB
	MOVEI	A,UNINAM(D)
	PUSHJ	P,PEEKA
	PUSHJ	P,SIXBP
	PUSHJ	P,TAB
	MOVEI	A,UNIICT(D)
	PUSHJ	P,PEEKA
	MOVE	N,A
	PUSHJ	P,DECTAB
	MOVEI	A,UNIOCT(D)
	PUSHJ	P,PEEKA
	MOVE	N,A
	PUSHJ P,DECPRT
	MOVEI A,UNIFKS(D)
	PUSHJ	P,PEEKA
	MOVEM A,N
	MOVEI A,UNIK4S(D)
	PUSHJ	P,PEEKA
	ANDI A,MSKK4S
	SKIPE	CPKI10		;A KA10
	LSH	A,1		;NO SHIFT ONE MORE
	MOVEM A,TEMP
	SUBB A,N
	MOVEI M,[ASCIZ /	/]
	PUSHJ P,PRPCNT
	MOVEI A,UNISWP(D)
	PUSHJ	P,PEEKA
	HLRZ D,A
	JUMPN D,SWLP1
	PUSHJ P,CRLF
;HERE TO CHECK FOR SWAP READ ERRORS
	MOVE A,XSWPER
	PUSHJ P,GETZ
	JUMPE A,SWFIN
	MOVE D,A
	MOVEI M,[ASCIZ /
Swap errors: /]
	PUSHJ P,MSG
	HLRZ N,D
	PUSHJ P,DECTAB
	MOVEI M,[ASCIZ / CHK/]
	TRZE D,IOIMPM
	PUSHJ P,MSG
	MOVEI M,[ASCIZ / DEV/]
	TRZE D,IODERR
	PUSHJ P,MSG
	MOVEI M,[ASCIZ / DAT/]
	TRZE D,IODTER
	PUSHJ P,MSG
	MOVEI M,[ASCIZ /   K Lost: /]
	SKIPE	CPKI10
	MOVEI M,[ASCIZ /   P Lost: /]
	HRRZ N,D
	TRZ	N,770000	;**[6] FIRST 3 ARE NOT NEEDED,BUT
	PUSHJ P,MSGDEC
	PUSHJ P,CRLF
SWFIN:	JRST FINIS
	SUBTTL ROTINES TO SETDES UNITAL AND UNIXRA FROM THE UDB

;ALL USE D TO STORE THE UDB ADDRESS FROM UNIBLK
;CLOBBER B AND RETURN THE VALUE IN A

GETTAL:	MOVE	D,UNIBLK	;GET UDB ADDRESS
	MOVEI	A,UNITAL(D)	;AND ENTRY
	CALL	UPDADR		;UPDATE THE ADDRESS
	LDB	B,DSKLEV	;GET VERSION
	CAIG	B,1		;SEE HOW OLD
	MOVEI	A,UNITL1(D)	;REUPDATE
	PJRST	PEEKA		;AND GET THE VALUE

GETDES:	MOVE	D,UNIBLK	;GET THE UDB ADDRESS
	MOVEI	A,UNIDES(D)	;GET THE ENTRY
	CALL	UPDADR		;UPDATE THE ADDRES
	LDB	B,DSKLEV	;GET THE DISK VERSION
	CAIG	B,1		;SEE HOW OLD
	MOVEI	A,UNIDE1(D)	;SO CHANGE
	PJRST	PEEKA		;AND GET IT

GETXRA:	MOVE	D,UNIBLK	;GET UDB ADDRES
	MOVEI	A,UNIXRA(D)	;AND ENTRY
	hrrz	b,monver	;get monitor version
	cail	b,50750		;if 602 then
	subi	a,1		;one less
	CALL	UPDADR		;UPDATE THE ADDRESS
	PJRST	PEEKA		;AND PEEK


UPDADR:	HRRZ	B,MONVER	;GET VERSION
	CAIL	B,50634		;HERE UNITAL XRA AND DES BECAME 3 LARGER
	ADDI	A,3		;SO UPDATE
	TXNE	F,FR.VMF	;IF VM THEN
	ADDI	A,2		;ADD ANOTHER 2
	RETURN

	;OFFSET IN A GETS CONTENTS INTO N

GETUDB:	ADD A,UNIBLK
	PUSHJ	P,PEEKA
	MOVE N,A
	POPJ P,
PRTBIT:	MOVEI M,BITTAB(C)
	PUSHJ P,MSG
	PUSHJ P,SPACE
	POPJ P,0

PRTUED:	JUMPE N,CPOPJ
	PUSH P,M
	MOVEI M,[ASCIZ / Errors: /]
	TLON F,FL.DEV
	PUSHJ P,MSG
	POP P,M
	PUSHJ P,MSGDEC
	JRST SPACE

PRTUEO:	JUMPE N,CPOPJ
	PUSH P,M
	MOVEI M,[ASCIZ / Errors: /]
	TLON F,FL.DEV
	PUSHJ P,MSG
	POP P,M
	PUSHJ P,MSG
	PUSHJ P,OCTPRT
	JRST SPACE

BITTAB:	ASCIZ /RHB/
	ASCIZ /OFL/
	ASCIZ /HWP/
	ASCIZ /SWP/
	ASCIZ /SAF/
	ASCIZ /ZMT/
	ASCIZ /PRF/
	ASCIZ /PNM/
	ASCIZ /DWN/
	ASCIZ /MSB/
	ASCIZ /NNA/
BITTL=.-BITTAB

BITMSK=77	;CLEAR, LEAVING BITS IN 777700,,0

UDTAB:	XWD 0,UNIBRC
	XWD 0,UNIBWC
	XWD 0,UNIDRC
	XWD 0,UNIDWC
	XWD 1,UNIXRA
	XWD -UNIICT,UNIMRC
	XWD -UNIOCT,UNIMWC
UDTBL==.-UDTAB
;5.01 AND 5.02 MONITOR ERROR INFO TABLES:

UERRT1:	XWD UNIHCT,[ASCIZ /HDEV:/]
	XWD UNIHCT,[ASCIZ /HDAT:/]
	XWD UNISCT,[ASCIZ /SDEV:/]
	XWD UNISCT,[ASCIZ /SDAT:/]
	XWD UNIPCT,[ASCIZ /HPOS:/]
	XWD UNIPCT,[ASCIZ /SPOS:/]
	XWD UNIMCT,[ASCIZ /SER:/]
	XWD UNIMCT,[ASCIZ /RER:/]
	XWD UNIMCT,[ASCIZ /CER:/]
	XWD UNIERR,[ASCIZ /HERR status:/]
	XWD UNISOF,[ASCIZ /SERR status:/]
	XWD UNIHBN,[ASCIZ /LBN:/]
UERRTL==.-UERRT1

UERRT2:	HLRZS N
	HRRZS N
	HLRZS N
	HRRZS N
	HLRZS N
	HRRZS N
	LDB N,[POINT 12,N,11]
	LDB N,[POINT 12,N,23]
	ANDI N,7777
	JFCL
	JFCL
	JFCL

UERRT3:	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUEO
	PRTUEO
	PRTUEO
;5.03 AND LATER MONTIORS ERROR INFO TABLES:


UER2T1:	XWD UNIHCT,[ASCIZ /HDEV:/]
	XWD UNIHCT,[ASCIZ /HDAT:/]
	XWD UNISCT,[ASCIZ /1DEV:/]
	XWD UNISCT,[ASCIZ /1DAT:/]
	XWD UNIECT,[ASCIZ /RETRIES:/]
	XWD UNIMCT,[ASCIZ /SER:/]
	XWD UNIMCT,[ASCIZ /RER:/]
	XWD UNIMCT,[ASCIZ /CER:/]
	XWD UNIERR,[ASCIZ /2CONI:/]
	XWD UNISOF,[ASCIZ /1CONI:/]
	XWD UNIHBN,[ASCIZ /LBN:/]
	XWD UNIHNG,[ASCIZ /PHUNG:/]
	XWD UNIHNG,[ASCIZ /THUNG:/]
	XWD UNIHNG,[ASCIZ /NTHUNG:/]
	XWD UNIHNG,[ASCIZ /SHUNG:/]
	XWD UNIHDI,[ASCIZ /2DATAI:/]
	XWD UNISDI,[ASCIZ /1DATAI:/]
UER2TL==.-UER2T1

UER2T2:	HLRZS N
	HRRZS N
	HLRZS N
	HRRZS N
	HRRZ	N,N
	LDB N,[POINT 12,N,11]
	LDB N,[POINT 12,N,23]
	ANDI N,7777
	JFCL
	JFCL
	JFCL
	LDB N,[POINT 9,N,26]
	LDB N,[POINT 9,N,17]
	LDB N,[POINT 9,N,8]
	LDB N,[POINT 9,N,35]
	JFCL
	JFCL
UER2T3:	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUEO
	PRTUEO
	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUED
	PRTUEO
	PRTUEO
FINIS:	SKIPE	JOBINT+2	;CONTROL C TYPED?
	JRST	CTRAP		;[145] YES, GO SERVICE
	PUSHJ	P,CRLF
	JUMPE	WD,HACKQ	;NO CHS. TYPED--EXIT.
	JUMPL	F,HACKQ		;BREAK CH. FOUND--EXIT.
	TRNN	F,FR.DSK	;DO NOT CLODE DISK FILE
	CLOSE	TTY,		;EMPTY BUFFERS (IN CASE OF TTY ^O)
	AND	F,[FL.GOD!FL.LGI!FL.LPT,,FR.CNT!FR.DPY!FR.DSK!FR.INI!FR.END!FR.INC!FR.USR]
	SETZM	ONCE		;SET ONCE THRU FLAG
	JRST	AGAIN		;GO INTERPRET MORE CHS.


;HERE ON FATAL ERROR

BOMB.:	OUTSTR	[ASCIZ /
? /]
	OUTSTR	(M)		;OUTPUT MESSAGE
	OUTSTR	[ASCIZ /
/]
	CLRBFI			;CLEAR TYPE AHEAD
	JRST	EXIT.		;GO BIND OFF JOB

;HERE WHEN ^C TYPED

CTRAP:	TLNN	F,FL.LGI	;[145] ARE WE LOGGED IN?
	  JRST	KILL		;[145] NO, GO KJOB
	PUSH	P,JOBINT+2	;[145] SAVE RETURN
	CLRBFO			;[145] KILL TYPE-AHEAD
	EXIT	1,		;[145] STOP NOW
	SETZM	JOBINT+2	;[145] ALLOW MORE ^CS
	POPJ	P,		;[145] CONTINUE WHERE STOPPED
	SUBTTL	FINISH UP
HACKQ:	MOVEI	M,REENTR	;[223] SET REENTER POINT
	MOVEM	M,.JBREN	;[223] SAVE IT
	TRO	F,FR.END	;[223] MARK AS HAVING BEEN DONE NOW
	TRNE	F,FR.CNT	;[200] ARE WE CONTINUING ?
	JRST	SNOOZE		;[200] YES--GO SLEEP FOR AWHILE
	TRNE	F,FR.DSK	;KEEP DISK FILES OPEN
	JRST	EXIT.		;NO BIRTH DAYS
	CLOSE	TTY,
	IFN HACKSW,<
	IFL	HACKSW,<
	MOVE	A,XAPRSN	;GET SERIAL NUMBER
	PUSHJ	P,GETZ		; OF THIS MACHINE
	MOVSI	B,-LENHAQ	;SEARCH SPECIAL TABLE
HAQ1:	MOVE	C,HAQAPR(B)	; OF MACHINES TO BE
	CAME	A,C		; HACKED
	AOBJN	B,HAQ1		;LOOP
	JUMPGE	B,EXIT.		;EXIT. IF NOT THIS MACHINE
>
	SETZB	WD,TYOB		;CLEAR WD IN CASE -VE SO PRINTING WILL HAPPEN
	MOVE	A,DATE
	IDIVI	A,^D31*^D12	;GET MODULO YEAR
	MOVEM	B,DATE
	MOVSI	J,-HAKLEN
	JUMPE	J,EXIT.		;GO AWAY IF EMPTY TABLE
HAKLUP:	MOVE	A,HAKTAB(J)
	HLRZ	B,A		;THE DATE FROM TABLE
	ANDI	B,7777		;JUST DATE CODE
	CAME	B,DATE		;TODAY?
	JRST	HAKNXT		;NO
	PUSHJ	P,CRLF2
	MOVEI	M,BMSG
	SKIPL	A
	PUSHJ	P,MSG
	HRRZ	M,A
	PUSHJ	P,MSG
	PUSHJ	P,CRLF
HAKNXT:	AOBJN	J,HAKLUP
>
	JRST	EXIT.

	IFL	HACKSW,<
HAQAPR:	DEC	1,2,40,169,513,514,546,1026,1042,2263
LENHAQ==.-HAQAPR
>
NOCOR:	MOVEI	M,[ASCIZ /?Need more core for data

/]
	PUSHJ	P,MSG
EXIT.:	CLOSE	TTY,		;CLOSE TTY IN CASE OF ^O
	PUSHJ	P,GETCHR	;GOBBLE LEFTOVER CHS. UNTIL A BREAK CH. IS SEEN
	TLZA	F,FL.BRK	;CLEAR BREAK CHAR FLAG
	JRST	.-2
KILL:	TDZ	F,[FL.LPT,,FR.INI!FR.DSK]	;EDIT 17 FORGET ALL ABOUT IO
	RELEASE	TTY,		;[145] CLEAR BITS, THEN RELEASE TTY
	SKIPN	TNFRTY		;EXIT ON 10/40 SYSTEM
	TLNE	F,FL.LGI
	pjrst	[ EXIT	1,
		  pjrst	systat] ;restart it
	OUTSTR	KJMSG
	LOGOUT

KJMSG:	ASCII	/.KJOB/
	BYTE	(7) 15,12,".",0,0

MINUTE==^D1			;THIS IS THE SLEEP TIME

SNOOZE:	CLOSE	TTY,		;CLOSE TTY IN CASE OF ^O
	TLNN	F,FL.LGI
	JRST	KILL		;NOT LOGGED IN, CAN'T REPEAT
	RELEASE	TTY,
	TRZ	F,FR.INI	;**[16] NO MORE INITED
 	SETZM	TYOB		;TO FORCE USE OF TTCALL I/O
	TTCALL	2,M		;JUST TO RESET THE ^O BIT
	  JRST	SNOOZ1
	CAIN	M,3		;IS IT ^C ?
	EXIT	1,
	CLRBFI

SNOOZ1:	MOVEI	M,^D60/4	;SECONDS PER MINUTE/4
	MOVSI	A,-MINUTE*4	;HOW MANY MINUTES TO SLEEP*4
CNTRLC:	TTCALL	2,CH		;JUST IN CASE HE TYPED ^C
	  JRST	ZZZZZ		;NO
	CAIN	CH,3		;IS IT?
	EXIT	1,		;YES
	CLRBFI
ZZZZZ:	CALLI	M,31		;GO TO SLEEP FOR A MINUTE
	AOBJN	A,CNTRLC	;DO IT AGAIN AND AGAIN
	TRNE	F,FR.INC	;[223] INCREMENTAL MODE?
	  JRST	REENTR		;[223] YES, GO DO IT.
	JRST	CNTLP		;[221]WAKE UP, WORLD! HERE WE GO AGAIN
	SUBTTL	HELP

HELPM:	MOVEI	M,[ASCIZ /? Type "SYS H" for Help
/]
HELPER:	PUSHJ	P,MSG		;TELL ABOUT HELP
	JRST	EXIT.		;[200] GO EXIT

HELP:	MOVE	1,['SYSTAT']		;IT MUST BE REGISTER 1
	PUSHJ	P,.HELPR##		;GO TO THE HELPER
	JRST	HACKQ			;AND GO HACK IT

;O IS DELIBERATELY NOT TYPED BY HELP
;ALL JOB STATE CODES ARE LISTED (EVEN THOSE NOT TYPED BY SYSTAT)

	SUBTTL	"X" - INVOKE DSK:CRASH.XPN RATHER THAN RUNNING MONITOR
;COMMAND FORMAT:
; 'ANY NONGO SITCHES' X 'ATLEAST ONE SPACE' [FILE NAME]
;  FILE CRASH.XPN IS TAKEN WHEN FILE NAME IS EMPTY

SETDSK:
	TLNE	F,FL.LGI	;[243] LOGGED IN JOB?
	JRST	STDSK1		;[243] YES
;
;[243] IF JOB IS NOT LOGGED IN BUT CONTROLLED BY A [1,*] JOB
;[243] ALLOW SYSTAT X OTHERWISE BOMB IT OUT
;
	PJOB	A,		;[243] GET CURRENT JOB NUMBER
	CTLJOB	A,		;[243]  GET CONTROLLING JOB NUMBER
	SETO	A,		;[243] NOT IMPLEMENTED
	MOVSI	A,(A)		;[243] SET UP TO GETTAB
	HRRI	A,.GTPPN	;[243] GET PPN OF CONTROLLING JOB
	GETTAB	A,		;[250] [243] DO THE GETTAB
	SETO	A,		;[243] ERROR
	TLNN	A,-2		;[243] PROJECT 0 OR 1?
	JRST	STDSK1		;[243] YES..
	BOMB	(Job not logged in.)	;[243] BYE BYE
STDSK1:	SETZM	INDEV
	SETZM	INFILE
	SETZM	INEXT
	SETZM	INPPN
	PUSHJ	P,GETNXT	;GET A SIXBIT FIELD OR ZERO
	JUMPE	A,SETDS2	;CHECK FOR PPN	;NOTHING FOUND THE JUMP
	CAIE	WD,":"
	JRST	SETDS1
	MOVEM	A,INDEV
	PUSHJ	P,GETNXT
	JUMPE	A,SETDS2	;IS THERE A FILE
SETDS1:	MOVEM	A,INFILE
	CAIE	WD,"."
	JRST	SETDS2
	PUSHJ	P,GETNXT
	  JFCL
	MOVEM	A,INEXT
SETDS2:	CAIN	WD,"["
	PUSHJ	P,INPPPN
SETDS3:	PUSHJ	P,GETFIL
	BOMB	(Can't get at that file)
	MOVSI	A,-NBCSHE	;PRIME THE INCORE CACHE POINTERS
	MOVE	B,FREE		;FIRST AVAILABLE LOC
	HRROM	B,DCACHE(A)	;STORE -1,,BUFFER ADDRESS
	ADDI	B,LN.BUF	;STEP TO NEXT DISK BUFFER
	AOBJN	A,.-2		;STORE ALL ENTRIES
	MOVEM	B,FREE		;STORE NEXT AVAILABLE FREE CORE ADDR
	CAMG	B,.JBREL	;NEED TO EXPAND
	JRST	.+3		;NO
	CORE	B,		;GET THE EXTRA CORE
	  JRST	NOCOR		;WHOOPS
IFN FTEXE,<
	TRNN	F,FR.EXE	;EXE CRASH FILE?
	JRST	NOXCRS		;NO
	MOVEI	A,0		;FIRST, LET'S CHECK HEADER WORD
	PUSHJ	P,DSKA		;GET FIRST WORD FORM FILE
	HLRZS	A		;ISOLATE HEADER CODE
	CAIE	A,1776		;CORRECT?
	BOMB	(Bad header code--not an EXE file)
	PUSHJ	P,CPYEXE	;COPY EXE FILE DIRECTORY AND RE-COMPUTE DSKFLG
NOXCRS:
>;END OF IFN FTEXE
	MOVEI	A,ABSTB1	;GET POINTER TO GETTABS
DSKJN1:	MOVEM	A,MAXGTB	;BORROW THIS CELL TO REMEMBER WHICH ABSTAB TRYING
	PUSHJ	P,DSKA		;READ IT
	TLNE	A,-1		;MAKE SURE ZERO LH
	JRST	DSKJNK		;NO. NOT ABSTAB
	CAMLE	A,MAXGTB	;MAKE SURE IT MAKES SOME SENSE
	CAML	A,DSKFLG	; ..
	JRST	DSKJNK		;NO--GIVE UP
	HRRZ	B,A		;SAVE FOR TEST LATER
	ADD	A,XGTTBI	;ADD OFFSET FOR GETTAB IMMEDIATE
	PUSHJ	P,DSKA		;READ THAT PLACE
	CAIE	B,(A)		;SEE IF IT MATCHES
	JRST	DSKJNK		;NO--MUST BE JUNK
	HRRZM	A,OFSGTB	;YES--REMEMBER OFFSET
	LSH	A,-^D9		;GET NUMBER OF TABLES
	HLRZM	A,MAXGTB	;SAVE IT
	MOVEI	A,TYOCH		;GET ADDRESS OF OUTSTR ROUTINE
	MOVEM	A,COMTOA	;STORE TYPE OUT ADDRESS
	MOVEI	M,[ASCIZ/
[/]
	PUSHJ	P,MSG
	PUSHJ	P,CRSMSG	;TYPE MONITOR NAME, DATE, TIME
	MOVE	A,[%SYSPC]	;GETTAB FOR STOPCD NAME
	PUSHJ	P,GETA		;GET IT
	HLLZ	BP,A		;KEEP ONLY STOPCD NAME
	JUMPE	BP,SETDS4	;DON'T TYPE IF ZERO
	MOVEI	M,[ASCIZ/, stopcode /]
	PUSHJ	P,MSG		;TELL WHAT IT IS
	PUSHJ	P,SIXBP1	;TYPE STOPCD NAME
SETDS4:	MOVEI	M,[ASCIZ/]

/]
	PUSHJ	P,MSG
	SETZM	COMTOA		;USE DEFAULT TYPEOUT
	MOVE	A,XPDBPT	;SET UP PDB POINTER FOR CRASH FILE
	PUSHJ	P,GETZ		;SEE IIF IT IS THERE
	MOVEM	A,PDBPTR	;STORE ZERO OR VALUE
	MOVE	A,XMNVER	;[206] GET CRASHED MONITORS
	CALL	GETZ		;[206] VERSION INTO A
	HRRZS	A		;[206] STRIP OFF NOISE BITS
	MOVEM	A,MONVER	;[206] AND STORE IT AWAY
	CAIGE	A,60122		;[206] OLD STYLE IF LESS
	CAIGE	A,60000		;[206] AN OLD MONITOR
	CAIGE	A,50722		;[206] IF NOT VERSION 6 OR LATER
	SETZM	NPJOBN		;[206] OLD STYLE SO CLEAR NEW JOB PTR.
	SKIPE	NPJOBN		;[206] IS IT OLD STYLE ?
	POPJ	P,		;[206] NO--RETURN
	MOVE	A,[%CNLSD]	;[206] GET LENGTH OF SHORT DDB
	CALL	GETZ		;[206] GET ZERO OR VALUE
	JUMPE	A,CPOPJ		;[206] IF ZERO, RETURN
	HRRM	A,.DVFIL	;[206] UPDATE FILE POINTER
	ADDI	A,1		;[206] EXTENSION POINTER
	HRRM	A,.DVEXT	;[206] . .
	ADDI	A,1		;[206] UPDATE
	HRRM	A,.DVPPN	;[206] PPN POINTER
	ADDI	A,DV.UNI-DV.PPN	;[206] POINT TO UNIT ENTRY IN DISK DDB
	HRRM	A,.DVUNI	;[206] UPDATE UNIT POINTER
	POPJ	P,

DSKJNK:	MOVEI	A,ABSTB2	;TRY SECOND ONE
	CAME	A,MAXGTB	;OR DID WE ALREADY?
	JRST	DSKJN1		;NO, TRY IT.
	JSP	M,BOMB.		;GIVE JUNK ERROR
	ASCIZ	/Can't find GETTABs in CRASH/
GETFIL:	MOVSI	A,DSK		;[203] GET CHANNEL #
	MOVE	B,ME		;[222] GET MY PPN
	CAMN	B,[1,,2]	;[232] AM I THE SAME AS OPR PPN?
	TXO	A,FO.PRV	;-[232] - SET PRIV BIT FOR FILOP.
				;    [1,2] JOBS GET FULL ACCESS
	MOVEM	A,FLP+.FOFNC	;[203] AND STORE IT IN FILOP. BLOCK
	MOVEI	A,.FORED	;[203] SET FUNCTION CODE
	HRRM	A,FLP+.FOFNC	;[203]  TO READ FILE
	MOVEI	A,17		;[203] SET I/O MODE
	MOVEM	A,FLP+.FOIOS	;[203]  . .
	SKIPN	A,INDEV		;[203] DID USER SPECIFY A DEVICE ?
	MOVSI	A,'DSK'		;[203] NO--ASSUME DSK
	MOVEM	A,FLP+.FODEV	;[203] AND STORE IT
	DEVCHR	A,		;[203] GET DEVICE CHARACTERISTICS
	TLNN	A,(DV.DIR)	;[203] IS IT A DISK ?
	JRST	DNDERR		;[203] PROCESS ERROR
	SETZM	FLP+.FOBRH	;[203] NO BUFFERS
	SETZM	FLP+.FONBF	;[203]  . .
	MOVEI	A,LKB		;[203] ADDR. OF LOOKUP BLOCK
	MOVEM	A,FLP+.FOLEB	;[203]  . .
	SKIPN	A,INFILE	;[203] FILE SPECIFIED ?
	MOVE	A,CRASH		;[203] NO--ASSUME CRASH
	MOVEM	A,LKB+.RBNAM	;[203] STORE IT IN LOOKUP BLOCK
	SKIPN	A,INEXT		;[203] EXTENSION SPECIFIED ?
IFE FTEXE,<
	MOVE	A,CRSEXT	;[203] NO--GET CRASH EXTENSION
>;[203] END OF IFE FTEXE
IFN FTEXE,<
	MOVSI	A,'EXE'		;[203] NO--ASSUME EXE
>;[203] END IFN FTEXE
	MOVEM	A,LKB+.RBEXT	;[203] STORE IT
	SKIPN	A,INPPN		;[203] PPN SPECIFIED ?
	MOVE	A,CRSPPN	;[203] NO--USE CRASH PPN DEFAULT
	MOVEM	A,LKB+.RBPPN	;[203] STORE IT
	MOVEI	A,10		;[203] GET EXTENDED LOOKUP BLOCK SIZE
	MOVEM	A,LKB		;[203] STORE IT IN LOOKUP BLOCK
FLPAGN:	MOVE	A,[XWD 6,FLP]	;[203] POINT TO FILOP. BLOCK
	FILOP.	A,		;[203] OPEN CRASH FILE
	  JRST	FLPERR		;[203] GO PROCESS FILOP. ERROR
FILOPN:	HLRZ	A,LKB+.RBEXT	;[203] GET EXTENSION
	CAIN	A,'EXE'		;[203] IS THIS AN EXE FILE ?
	TRO	F,FR.EXE	;[203] YES--SET BIT TO REMEMBER IT
	MOVE	A,LKB+.RBSIZ	;[203] YES--GET FILE SIZE
	MOVEM	A,DSKFLG	;[203] AND SAVE IT AWAY FOR LATER
	JRST	CPOPJ1		;[203] GIVE GOOD RETURN

FLPERR:	CAME	A,[XWD 6,FLP]	;[203] IS FILOP. IMPLEMENTED ?
	JRST	CHKERR		;[203] YES--GO CHECK THE ERROR CODE THEN
	OPEN	DSK,FLP+.FOIOS	;[203] NO--DO MANUAL OPEN
	  POPJ	P,		;[203] CAN'T ACCESS FILE
	LOOKUP	DSK,LKB		;[203] LOOKUP FILE
	  JRST	CHKER1		;[203] GO PROCESS LOOKUP FAILURE
CHKPRV:	HLRZ	B,LKB+.RBPRV	;[203] GET PRIVILEGE WORD FROM LOOKUP BLOCK
	LSH	B,-^D9		;[203] RIGHT JUSTIFY PROT. CODE
	HRLI	B,5		;[203] SET CHKACC FUNC. CODE TO READ FILE
	MOVEI	C,DSK		;[203] GET CHANNEL #
	DEVPPN	C,		;[203] GET DEVICE'S ASSOCIATED PPN
	  MOVEI	C,ME		;[203] ASSUME MY PPN
	CAME	C,ME		;[203] IS IT ME ?
	MOVEM	C,INPPN		;[203] NO--OVERIDE ALL WITH ERSATZ PPN
	SKIPN	C,INPPN		;[203] IS THERE A PPN ARGUMENT ?
	MOVE	C,ME		;[203] NO--ASSUME OUR PPN
	MOVE	D,ME		;[203] PERFORM CHKACC AGAINST ME
	MOVEI	A,B		;[203] POINT TO CHKACC ARGUMENT BLOCK
	CHKACC	A,		;[203] ARE WE ALLOWED TO ACCESS THIS FILE ?
	  JRST	FILOPN		;[203] ASSUME YES AND PROCEED
	JUMPGE	A,FILOPN	;[203] YES--PROCEED
FILPRT:	JSP	M,BOMB.		;[203] NO--FILE'S PROTECTED AGAINST US
	ASCIZ/File is read protected/

DNDERR:	JSP	M,BOMB.		;[203] DEVICE MUST BE A DISK !!
	ASCIZ/Device must be a disk/

CHKER1:	HRRZ	A,LKB+.RBEXT	;[203] GET LOOKUP ERROR CODE
CHKERR:	CAIN	A,2		;[203] PROTECTION FAILURE ?
	JRST	FILPRT		;[203] YES--GIVE ERROR
	JUMPN	A,CPOPJ		;[203] FILE NOT FOUND ?
	HLRZ	A,LKB+.RBEXT	;[203] YES--GET EXTENSION
	CAIE	A,'EXE'		;[203] WAS IT 'EXE' ?
	POPJ	P,		;[203] NO--CAN'T ACCESS FILE
	MOVE	A,CRSEXT	;[203] YES--GET OLD EXTENSION
	MOVEM	A,LKB+.RBEXT	;[203] AND STORE IT
	JRST	FLPAGN		;[203] TRY AGAIN WITH NEW EXTENSION

INPPPN:	PUSHJ	P,GETPPN
	MOVEM	A,INPTH+.PTPPN
	MOVEI	A,INPTH		;POINT TO PATH BLOCK
	MOVEM	A,INPPN		;SAVE AS POINTER IN PPN WORD
	PUSH	P,[-5,,0]	;SAVE AOBJN POINTER TO SFD LIST ON STK
INPPP1:	CAIE	WD,","		;SFD LIST FOLLOW?
	JRST	INPPP2		;NO
	PUSHJ	P,GETNXT	;GET NEXT SFD
	  BOMB	<Command error -- Type SYS /H for help>
	SKIPN	A		;MUST BE NON-NULL
	  BOMB	<Command error -- Type SYS /H for help>
	MOVE	C,(P)		;GET AOBJN POINTER BACK
	MOVEM	A,INPTH+.PTPPN+1(C) ;STORE SFD IN NEXT WORD OF BLOCK
	AOBJP	C,INPPP2	;GO IF TOO MANY
	MOVEM	C,(P)		;STORE UPDATED POINTER BACK ON STACK
	JRST	INPPP1		;AND LOOP FOR NEXT
INPPP2:	POP	P,A		;RESTORE LAST VALUE OF AOBJN POINTER
	SETZM	INPTH+.PTPPN+1(A) ;INSURE ZERO TERMINATOR
	CAIE	WD,12
	PUSHJ	P,GETNXT
	  JFCL
	POPJ	P,
DSKBP1:	CAMN	BP,LASBPA	;SEE IF SAME AS LAST ONE
	JRST	[MOVE BP,LASBP1	;YES--GET SAME ANSWER
		 JRST CPOPJ1]	;GIVE SKIP RETURN
	MOVEM	BP,LASBPA	;NO--SAVE ADDRESS
	PUSH	P,A		;SAVE A
	MOVE	A,BP		;GET ARGUMENT
	PUSHJ	P,DSKA		;GET WORD
	MOVE	BP,A		;GIVE ANSWER
	POP	P,A		;RESORE A
	MOVEM	BP,LASBP1	;SAVE ANSWER
	JRST	CPOPJ1		;SKIP RETURN

DSKC:	PUSH	P,A		;SAVE A
	MOVE	A,C		;GET ARGUMENT
	PUSHJ	P,DSKA		;GET WORD
	MOVE	C,A		;GIVE ANSWER
	POP	P,A		;RESTORE A
	POPJ	P,		;RETURN
DSKA1:	AOS	(P)		;SKIP RETURN
DSKA:	TLZ	A,-1		;CLEAR JUNK
	CAIGE	A,340000	;ADDRESS IN MONITOR LOW SEG?
	JRST	DSKA4		;YES, JUST GET MONITOR LOW SEG VALUE
	PUSH	P,D		;GET A WORKING AC
	MOVE	D,A		;SAVE ADDRESS IN D
	ROT	D,-^D10		;GET PAGE NUMBER/2 PLUS FLAG IN 1B0
	ANDI	A,777		;ISOLATE OFFSET IN PAGE
	PUSH	P,A		;SAVE THIS
	TRNE	D,400000_-^D10	;ADDRESS IN MONITOR HIGH SEG?
	SKIPA	A,.CPTOS	;YES, GET ADJUSTMENT TO POINT TO EPT
	SKIPA			;NO, IN FUNNY SPACE
	JRST	DSKA6		;MAP THROUGH EPT
	MOVSI	A,(J)		;JOB NUMBER TO LH
	HRRI	A,.GTUPM	;NEED JBTUPM FOR THIS JOB
	PUSHJ	P,FGETTB	;GET VALUE
	  JRST	DSKA2		;FAILED, RETURN ZERO
	HRRZS	A		;KEEP JUST PAGE NUMBER
	JUMPN	A,DSKA3		;IF THERE, CONTINUE
DSKA2:	POP	P,(P)		;FLUSH JUNK
	POP	P,D		;RESTORE D
DSKA5:	MOVEI	A,0		;RETURN ZERO TO CALLER
	POPJ	P,		;  AND RETURN
DSKA3:	LSH	A,^D9		;MAKE UPMP PAGE NUMBER AN ADDRESS
DSKA6:	ADDI	A,220(D)	;POINT AT PER-PROCESS SLOTS IN THE UPMP
	PUSHJ	P,DSKA4		;GET THE MAP SLOT FOR THIS ADDRESS
	SKIPL	D		;SKIP IF MAPPING THROUGH RH
	MOVSS	A		;MAPPING THROUGH LH, REVERSE
	TRNN	A,400000	;PAGE HAVE ACCESS ALLOWED ON?
	JRST	DSKA2		;NO, RETURN ZERO
	ANDI	A,17777		;KEEP JUST 13 BIT PAGE NUMBER
	LSH	A,^D9		;MAKE IT AN ADDRESS
	ADD	A,0(P)		;ADD IN OFFSET IN PAGE
	POP	P,(P)		;FLUSH JUNK
	POP	P,D		;RESTORE D
DSKA4:	PUSH	P,B		;SAVE B
	CAML	A,DSKFLG	;COMPARE TO AMOUNT IN FILE
	JRST	[POP	P,B	;RESTORE B
		 JRST	DSKA5]	;RETURN ZERO
	PUSH	P,C		;SAVE A WORK REGISTER
IFN FTEXE,<
	JUMPE	A,DSKA4A	;DON'T RELOCATE 0 (NEED TO READ EXE DIRECTORY)
	TRNN	F,FR.EXE	;IS THIS AN EXE FILE?
	JRST	DSKA4A		;NO, GO STRAIGHT TO FILE
	PUSHJ	P,RELEXE	;RELOCATE ADDRESS TO DISK PAGE ADDRESS
	  JRST	[POP P,C	;ADDRESS NOT IN FILE, RESTORE ACS
		POP P,B
		JRST DSKA5]	;AND RETURN 0
>;END OF IFN FTEXE
DSKA4A:	IDIVI	A,LN.BUF	;SPLIT INTO BLOCK AND WORD
	PUSH	P,B		;OFFSET FOR WORD IN BUFFER
	MOVSI	B,-NBCSHE	;SEARCH THE CACHE FOR THIS DISK BLOCK
	HLRZ	C,DCACHE(B)	;FETCH BLOCK DESCRIBED
	CAIE	C,(A)		;IS THIS IT
	AOBJN	B,.-2		;NO, KEEP LOOKING
	JUMPL	B,DSKARD	;FOUND ONE, UPDATE LEAST RECENTLY USED
	HRLM	A,DCACHE+NBCSHE-1 ;STORE BLOCK NUMBER IN LAST (OLDEST)
	HRRZ	B,DCACHE+NBCSHE-1 ;WHERE DATA IS TO BE READ
	SOS	B		;-1 FOR THE IOWD
	HRRM	B,DSKIOW	;STORE ADDR
	MOVEI	B,NBCSHE-1	;INDEX WHERE READ (FOUND)
IFN LN.BUF-200,<IMULI A,LN.BUF/200>
IFN LN.BUF-<LN.BUF/200>*200,<PRINTX LN.BUF MUST BE MULT OF 200>
	USETI	DSK,1(A)	;NO--POSITION FILE
	IN	DSK,DSKIOW
	JRST	DSKARD		;READ OK
	PUSH	P,M		;BAD--SAVE LOTS STUFF
	PUSH	P,N
	PUSH	P,N1
	PUSH	P,R
	PUSH	P,CH
	PUSH	P,WD
	MOVEI	WD,0
	GETSTS	DSK,N
	MOVEI	M,[ASCIZ /
% Disk read error /]
	PUSHJ	P,MSG
	PUSHJ	P,OCTPRT
	PUSHJ	P,CRLF
	POP	P,WD
	POP	P,CH
	POP	P,R
	POP	P,N1
	POP	P,N
	POP	P,M

DSKARD:	HRRZS	B		;ISOLATE POSITION IN TABLE
	CAIG	B,NBCSHE/3	;DON'T RIPPLE TABLE IF CLOSE TO FRONT ALREADY
	JRST	DSKAR1		;THIS MIGHT NOT BE TOO GOOD WITH SMALL "NBCSHE"
	PUSH	P,DCACHE(B)	;SAVE DESIRED ENTRY
	MOVE	C,DCACHE-1(B)	;COMPRESS TABLE SO LEAST USED IS LAST
	MOVEM	C,DCACHE(B)	;MOVE UP ENTRIES BELOW ONE FOUND
	SOJG	B,.-2		;SO NEW ONE CAN BE FOUND QUICKLY LATER
	POP	P,DCACHE(B)	;PUT SAVED ENTRY AT THE FRONT
DSKAR1:	POP	P,C		;GET WORD OFFSET FOR DATA ITEM
	ADD	C,DCACHE(B)	;FIND WORD IN BUFFER
	MOVE	A,(C)		;FETCH IT
	POP	P,C		;RESTORE WORK AC
	POP	P,B		;RESTORE CALLERS AC
	POPJ	P,		;RETURN WITH DATA ITEM IN A
;SUBROUTINES TO DEAL WITH EXE DIRECTORY

IFN FTEXE,<

CPYEXE:	HRLZ	A,DCACHE	;*** "KNOW" WHERE DSKA READ IT
	HRRI	A,EXEDIR	;PLACE TO SAVE IT
	BLT	A,EXEDIR+LN.BUF-1 ;MOVE AS MUCH AS WAS READ
	HRRZ	A,EXEDIR	;FETCH DIRECTORY SIZE
	CAIL	A,LN.BUF	;DID WE GET ALL OF IT
	BOMB	(EXE Directory too complex, try making LN.BUF larger)
	MOVE	A,EXEDIR-1(A)	;FETCH LAST DESCRIPTOR WORD
	LDB	B,[POINT 9,A,8]	;GET REPEATER COUNT
	ADDI	B,1(A)		;FIRST PAGE NOT IN FILE
	LSH	B,^D9		;FIRST ADDRESS NOT IN FILE
	MOVEM	B,DSKFLG	;RESET MAXIMUM ADDRESS
	POPJ	P,		;AND RETURN

RELEXE:	PUSH	P,D		;SAVE A WORKING AC
	IDIVI	A,1000		;SPLIT INTO PAGE AND OFFSET
	PUSH	P,B		;SAVE OFFSET
	HRRZ	B,EXEDIR	;FETCH NUMBER OF WORDS IN DIRECTORY
	MOVNI	B,-1(B)		;DON'T COUNT HEADER WORD
	HRLZS	B		; = AOBJN
RELEX1:	HRRZ	C,EXEDIR+2(B)	;GET CORE ADDRESS FROM DESCRIPTOR
	CAILE	C,(A)		;PASS THE ONE WE WANT
	JRST	RELEX3		;YES, WORD NOT IN FILE
	LDB	D,[POINT 9,EXEDIR+2(B),8] ;GET REPEATER
	ADDI	D,1(C)		;FIRST PAGE NOT IN POINTER
	CAIL	A,(D)		;PAGE IN THIS POINTER AT ALL
	JRST	RELEX2		;NO, GET ANOTHER POINTER
	SUBI	A,(C)		;HOW FAR INTO THE POINTER
	ADD	A,EXEDIR+1(B)	;HOW FAR INTO THE FILE PROPER
	TLZ	A,-1		;KEEP IT REASONABLE ( FLAGS BITS )
	LSH	A,^D9		;TO A PAGE ADDRESS IN THE FILE
	ADDM	A,(P)		;INCLUDE THE OFFSET WANTED
	AOS	-2(P)		;GIVE GOOD RETURN
	JRST	RELEX3		;AND RETURN
RELEX2:	AOBJN	B,.+1		;ADJUST FOR DOUBLE WORD ENTRIES
	AOBJN	B,RELEX1	;LOOK AT NEXT POINTER
RELEX3:	POP	P,A		;RETURN VALUE
	POP	P,D		;RESTORE WORKING AC
	POPJ	P,		;RETURN

> ;END FTEXE
;GETNXT IS CALLED TO COLLECT A SIXBIT FIELD IN ACCU A
;AND A DELIMITING CHARACTER IN REGISTER WD
;DELIMITERS ARE:
;LINE FEED COMMA PERIOD COLON LEFT BRACKET RIGHT BRACKET LEFTARROW
;IF A BREAK CHARACTER WAS FOUND A ZERO DELIMITER IS RETURNED CAUSING
;SYSTAT TO  FAIL AT ALL DELIMITER TESTS
GETNXT:	SETZ	A,
GETNX0:	SETZ	WD,		;LET TEST ON DELIMITER FAIL
	TLNE	F,FL.BRK
	POPJ	P,
	PUSHJ	P,GETCHR
	  JFCL
	CAIE	WD," "
	CAIN	WD,15
	JRST	GETNX0
GETNX1:	MOVE	B,DELMPT
GETNX2:	ILDB	C,B
	JUMPE	C,GETNX4
	CAIE	WD,(C)
	JRST	GETNX2
	SKIPE	A
GETNX3:	TLNE	A,770000
	JRST	CPOPJ1
	LSH	A,6
	JRST	GETNX3
GETNX4:	TLNE	A,770000
	JRST	GETNX0
	LSH	A,6
	ADDI	A,-40(WD)
	JRST	GETNX0

DELMPT:	POINT	7,DELMTB
DELMTB:	BYTE	(7) 12,54,56,72,133,135,137,0

GETPPN:	PUSHJ	P,GETNXT
	  BOMB	<Command error -- Type SYS /H for help>
	SKIPN	C,A
	  MOVSI	C,'0  '		;IF [,], FAKE GETNUM
	CAIE	WD,","
	  BOMB	<Command error -- Type SYS /H for help>
	PUSHJ	P,GETNUM
	SKIPN	A		;[225] SKIP IF PROJECT# NON-ZERO
	HLRZ	A,ME		;IF [,], USE OUR PROJECT NUMBER
	PUSH	P,A
	TLNN	A,-1
	PUSHJ	P,GETNXT
	  BOMB	<Command error -- Type SYS /H for help>
	SKIPN	C,A
	  MOVSI	C,'0  '		;IF [,] FAKE GETNUM
	PUSHJ	P,GETNUM
	SKIPN	A		;SKIP IF PROGRAMMER NUMBER NON-ZERO
	HRRZ	A,ME		;USER OURS IF [,]
	TLNE	A,-1
	  BOMB	<Command error -- Type SYS /H for help>
	HRL	A,(P)
	POP	P,B
	POPJ	P,

GETNUM:	SETZ	A,
GETNM0:	SETZ	B,
	LSHC	B,6
	CAIL	B,"0"-40
	CAILE	B,"7"-40
	  BOMB	<Command error -- Type SYS /H for help>
	LSH	A,3
	ADDI	A,-20(B)
	JUMPN	C,GETNM0	;GET MORE DIGITS
	POPJ	P,
	SUBTTL	SUBROUTINES
;GETTAB OPTIONAL TABLE--RETURN 0 IF ABSENT (RESULT IN A)
GETZ:	PUSHJ	P,FGETTB	;GO DO GETTAB
	  SETZ	A,
	POPJ	P,

;GETTAB OPTIONAL TABLE--ERROR RETURN IF ABSENT (RESULT IN B)
GETTB:	PUSH	P,A		;SAVE A
	MOVE	A,B		;SETUP FOR GETTAB
	PUSHJ	P,FGETTB	;DO GETTAB
	  JRST	[POP	P,A
		 POPJ	P,]
	MOVE	B,A		;GET ANSWER
	POP	P,A		;RESTORE A
CPOPJ1:	AOS	(P)
	POPJ	P,
CPOPJ2:	AOS	(P)	;[230]
	AOS	(P)	;[230]
	POPJ	P,	;[230]

;GETTAB MANDATORY TABLES (RESULT IN A)
GETA:	PUSHJ	P,FGETTB	;GETTAB
	  TDZA	A,A
	POPJ	P,0
PRQM:	MOVEI	CH,"?"
	JRST	TYO
;ROUTINE TO FUDGE GETTABS VIA SPY IF POSSIBLE
;NOTE--DOES NOT HANDLE -2 IN LH, IF FAIL, CHANGES A

FGETTB:	SKIPE	N1,MAXGTB	;SEE IF GETTAB SPYING POSSIBLE
	JRST	GETTB1		;YES--GO DO IT
FGETT1:	SKIPN	DSKFLG		;DONT GETTAB IF IN /X
	GETTAB	A,		;NO--USE MONITOR
	  POPJ	P,		;ERROR RETURN
	JRST	CPOPJ1		;WIN RETURN
GETTB1:	HRRZ	BP,A		;GET TABLE INDEX
	CAMLE	BP,N1		;SEE IF IN RANGE
	POPJ	P,		;NO--ERROR RETURN
	ADD	BP,OFSGTB	;YES--GET CORE ADDRESS
	TLNE	F,FL.DSK	;SEE IF DISK MODE
	PUSHJ	P,DSKBP1	;YES--READ FROM IT AND SKIP
	MOVE	BP,400000(BP)	;GET NUMTAB POINTER
	CALL	SETSPY		;SET UP SPY DATA
	SKIPE	PDBPTR		;YES. HAVE WE THE POINTER TO JBTPDB?
	SKIPA			;OK
	JRST	FGETT1		;NO. GO USE A GETTAB
	HLRZ	A,A		;GET REQUESTED INDEX IN TABLE
	TRNE	A,1B18		;SEE IF JOB FLAG
	MOVE	A,MYJOB		;YES--GET JOB NUMBER
	CAMLE	A,N1		;SEE IF IN RANGE
	POPJ	P,		;NO--ERROR RETURN
	TLNN	BP,(17B17)	;SEE IF INDEXING
	MOVEI	A,0		;NO--CLEAR REQUEST
	TLNN	BP,(GT.PRC)	;PDB DATUM?
	JRST	FGETT2		;NO
	TLNE	F,FL.DSK	;DISK MODE?
	JRST	FGETP2		;YES, HANDLE IT
	ADD	BP,@PDBPTR	;GET ADDRESS IN JOBS PDB
	MOVEI	A,0		;HAVE ADDED IN A ALREADY
FGETT2:	ADDI	A,(BP)		;ADD TABLE LOCATION TO OFFSET
	TLNE	F,FL.DSK	;SEE IF DISK MODE
	PJRST	DSKA1		;YES--GET WORD FROM DISK
	MOVE	A,400000(A)	;GET WORD
	JRST	CPOPJ1		;GIVE WIN RETURN

FGETP2:	ADD	A,PDBPTR	;GET JOBS PDB POINTER FROM DISK
	PUSHJ	P,DSKA
	ADDB	BP,A		;POINT TO RELATIVE WORD
	PJRST	DSKA1		;GET THE PDB WORD

SETSPY:	LDB	N1,[POINT 9,BP,8];GET TABLE LENGTH
	PUSH	P,N1		;AND SAVE IT
	SKIPN	NEWSPY		;THE NEW STYLE OF SPYING
	JRST	SETSP0		;NO LEAVEIT AS IT IS
	LDB	N1,[POINT 3,BP,11];GET ENTRY TYPE
	TLZ	BP,777760	;ZAP ALL BUT INDEX FIELD
	CAIN	N1,GT.PDB	;SKIP IF NOT PDB DATA
	TLO	BP,(GT.PRC)	;COMPATIBLE
	PUSH	P,A		;SAVE A
	SKIPN	A,BOTH		;GET NUMBER OF JOBS+SEGMENTS
	JRST	SETSP1		;NOT SET  UP YET, LEAVE ALONE
	SUBI	A,1		;COMPUTE HIGHEST SEGMENT OFFSET
	CAIN	N1,.SLIXS	;INDEX BY SEGMENT NUMBER?
	MOVEM	A,-1(P)		;YES, CHANGE MAX
SETSP1:	POP	P,A		;RESTORE A
SETSP0:	POP	P,N1		;GET LENGTH OF TABLE BACK
	TLNN	BP,(GT.PRC)	;PDB DATA??
	AOS	(P)		;SET SKIP RETURN
	RETURN
;PEEK INTO C
PEEKC:	TLNE	F,FL.DSK	;SEE IF DISK MODE
	PJRST	DSKC		;YES--PEEK AT THE DISK
	PUSH	P,A		;SAVE A
	MOVE	A,C		;GET ARGUMENT
	PUSHJ	P,PEEKA		;GET VALUE IN A
	MOVE	C,A		;MOVE TO C FOR RETURN
	POP	P,A		;RESTORE A
	POPJ	P,

;PEEK INTO A
PEEKA:	TLNE	F,FL.DSK	;SEE IF DISK MODE
	PJRST	DSKA		;YES--PEEK AT THE DISK
	TLZ	A,-1		;CLEAR JUNK
	CAIL	A,400000	;MONITOR HIGH SEG ADDRESS?
	JRST	PEEKA1		;YES, GO GET IT WITH PEEK
	CAIL	A,340000	;FUNNY SPACE ADDRESS?
	PJRST	SPYPAG		;YES
	SKIPE	SPYFLG		;SEE IF SPYING
	SKIPA	A,400000(A)	;YES--GET FROM CORE
PEEKA1:	PEEK	A,		;NO--GET FROM MONITOR
	POPJ	P,

GETBTH:	ANDI	A,-1		;MASK TO SIZE
	SKIPE	A		;ERROR IF 0
	CAML	A,DSKFLG	;SEE IF IT FITS
	POPJ	P,		;NO--GIVE ERROR
	MOVEI	C,-1(A)		;GET ADDR-1
	PUSHJ	P,PEEKA		;GET CONT(ADDR)
	PUSHJ	P,PEEKC		;GET CONT(ADDR-1)
	JRST	CPOPJ1		;SKIP RETURN

;ROUTINE TO GET A WORD FROM FUNNY SPACE FOR THIS JOB.  WORKS
;ONLY FOR THIS JOB.  CALL WITH A=ADDRESS, RETURNS A=VALUE.
SPYPAG:	PUSH	P,A		;SAVE ADDRESS
	MOVE	A,MONVER	;GET MONITOR VERSION NUMBER
	CAIGE	A,67700		;7.00 FIELD TEST OR GREATER?
	JRST	SPYPA2		;NO, RETURN ZERO
	MOVE	A,0(P)		;GET ADDRESS BACK
	LSH	A,-^D9		;KEEP JUST PAGE NUMBER
	CAMN	A,LASSPY	;SAME PAGE AS LAST TIME?
	JRST	SPYPA1		;YES, JUST GET IT FROM CORE
	MOVEM	A,LASSPY	;SAVE FOR NEXT CALL
	HRLM	A,GETBLK+1	;ALSO SAVE FOR PAGE CALL
	MOVE	A,[.PAGSP,,DELBLK] ;POINT AT BLOCK TO DELETE PAGE
	PAGE.	A,		;DELETE PAGE FROM OUR ADDRESS SPACE
	  JFCL			;MUST NOT HAVE BEEN THERE
	MOVE	A,[.PAGSP,,GETBLK] ;POINT TO BLOCK TO GET PAGE
	PAGE.	A,		;PAGE IN THAT PAGE
	  JRST	SPYPA2		;FAILED, RETURN ZERO
SPYPA1:	POP	P,A		;GET ADDRESS BACK
	ANDI	A,777		;KEEP JUST OFFSET IN PAGE
	MOVE	A,FSPADR(A)	;GET ADDRESS FROM FUNNY SPACE PAGE
	POPJ	P,		;AND RETURN
SPYPA2:	POP	P,(P)		;PRUNE STACK
	MOVEI	A,0		;RETURN 0
	SETZM	LASSPY		;FORCE REREAD NEXT TIME
	POPJ	P,		;RETURN
GETTTY:	TRNE	F,FR.CNT	;**[16] A CONTINUOUS SYSTAT?
	TLNN	F,FL.LPT	;**[16] (YES) AND GOING TO LPT
	SKIPA			;**[16] (NO) NORMAL
	JRST	GETTT0		;**[16] (YES)  FORCE OF INIT
	TLNE	F,FL.LPT	;IS LPT FILE OPEN?
	RETURN			;(YES) THEN KEEP IT THTA WAY
	CAIE	WD,L.LPT	;DID USER WANT LINE PRINTER
	JRST	SYSIN2		;(NO) SEE IF HE HAS TTY ALLREADY
	TLO	F,FL.LPT	;DID HE HAVE LPT ALLREADY
				;[144] REMOTELY REMOTE?
	TLNE	F,FL.LGI	;[144] OR NOT LOGGED IN?
	  JRST	GETTT0		;[144] NO..OK TO USE LPT
	CTLJOB	A,		;[144] BEING CONTROLLED?
	  SETO A,		;[144] NOT IMPLEMENTED
	MOVSI	A,(A)		;[144] SETUP TO GETTAB ...
	HRRI	A,.GTPPN	;[144] OUR CONTROLLING JOB'S PPN
	PUSHJ	P,FGETTB	;[144] SIMULATE THE GETTAB
	  SETO	A,		;[144] DISALLOW IF NOT IMPLEMENTED
	TLNN	A,-2		;[144] PROJECTS 0 OR 1?
	  JRST	GETTT0		;[144] YES..YOU WIN
	BOMB	(LOGIN to use LPT)  ;[144] NO, TOO BAD
GETTT0:	MOVEI	C,5		;TRY INIT FIVE TIMES
	RESET			;GIVE BUFFERS BACK
SYSIN1:	INIT	TTY,0		;YES--INIT LPT
SYSDEV:	  SIXBIT /LPT/
	  XWD	TYOB,0
	  SKIPA
	JRST	SYSOPN		;IF SUCCESS
	MOVE	B,C
	SLEEP	B,		;WIAT AWHILE
	SOJG	C,SYSIN1	;TRY SOME,THEN GIVE MESSAGE
SYSNOT:	TLON	F,FL.RPT	;FAILED--SEE IF FIRST TIME
	OUTSTR	[ASCIZ /LPT busy--Please assign LPT and continue
/]
	EXIT	1,		;RETURN TO MONITOR MODE
	JRST	SYSIN1		;LOOP BACK FOR ANOTHER TRY
SYSIN2:	TROE	F,FR.INI	;IS THIS THE FIRST TRY
	RETURN			;(NO) YOU HAVE IT ALLREADY
	TLNN	F,FL.DSK	;**[16] DO NOT RESET DISK FILE
	RESET			;GET OLD BUFFERS AWAY
	INIT TTY,0		;FIRST TRY DEVICE SYSTAT
	  SIXBIT /SYSTAT/
	  XWD TYOB,0
	  SKIPA			;NOTHING ASSIGNED AS SYSTAT
	JRST SYSOPN		;OK. USE IT.
	INIT	TTY,0
	  SIXBIT /TTY/
	  XWD	TYOB,0
	  BOMB	(Output init failed)	;DIE IF CAN'T DO OUTPUT
SYSOPN:	TRO	F,FR.INI	;TURN ON FOR L OPTION
	OUTBUF	TTY,1		;ONLY ONE BUFFER
	TRZ	F,FR.DSK	;ASSUME NO DISK
	MOVEI	A,TTY		;GET CHANNEL NUMBER
	DEVTYP	A,		;AND GET IT'S TYPE
	JRST	SYSOP1		;GIVE UP TRY THE ENTER
	ANDI	A,TY.DEV	;GET THE TYPE FIELD
	CAIE	A,.TYDSK	;IS IT A DISK
	JRST	SYSOP1		;(NO) OPEN THE FILE
	TRO	F,FR.DSK	;FLAG THAT THIS IS A DISK FILE
	MOVE	A,[%LDSTP]	;GET STANDARD PROTECTION
	CALL	GETZ		;SEE WHAT IT IS
	ROT	A,^D9		;GET IT IN THE RIGHT HAND SIDE
	HRLI	A,.ACWRI	;WE WANT TO WRITE
	TRZ	A,777000	;MASK OUT JUNK
	MOVEI	B,TTY		;GET OWNERS PPN
	DEVPPN	B,		;FIND THE PPN
	JRST	SYSOP1		;NO PROTECTION
	MOVE	C,ME		;GET MY PPN
	MOVEI	N,A		;GET ADDRESS OF CHECK BLOCK
	CHKACC	N,		;SEE IF I MAY ENTER AND WRITE FILE
	JRST	SYSOP1		;NO CHKACC SO DO IT
	JUMPE	N,SYSOP1	;ALL IS FINE
	BOMB	(No write privilige for file SYSTAT.TXT)
SYSOP1:	MOVE	A,[SIXBIT /SYSTAT/]
	MOVSI	B,(SIXBIT /TXT/)
	SETZB	C,D		;CLEAR DATE & PPN
;**;	[227]	@ SYSOP1+2 1/2 INSERT
	TRNE	F,FR.DSK		;[227]IS OUTPUT GOING TO DISK?
	LOOKUP	TTY,A			;[227]YES.DOES SYSTAT.TXT EXIST?
	SKIPA				;[227]NO. CREATE FILE
	JRST	APPEND			;[227]APPEND TO EXISTING FILE
	ENTER	TTY,A
	  BOMB	(Output enter failed)	;DIE IF CAN'T ENTER
	RETURN
;**;	[227]	@ SYSOP1+6 INSERT
APPEND:	HLRE	N,D			;[227] -WORDS(<128K) OR +BLOCKS(>128K)
	SKIPL	N			;[227] BLOCKS?
	JRST	APPEN1			;[227] YES.
	MOVNS	N			;[227] MAKE WORDS +
	LSH	N,-7			;[227] CONVERT TO BLOCKS
	AOS	N			;[227]NEXT BLOCK
APPEN1:	AOS	N			;[227]NEXT BLOCK
	MOVEM	N,FLP+1			;[227]SET NEXT BLOCK IN USETO REQUEST
	HLLZS	B			;[227] CLEAR ENTER ARG BLOCK
	SETZB	C,D			;[227]
	ENTER	TTY,A			;[227]REQUEST SUPERCEDE EXISTING SYSTAT.TXT
	BOMB	(Output ENTER failed)	;[227]DIE ON ERROR
	MOVE	N,[XWD TTY,.FOUSO]	;[227]SET UP FILOP BLOCK TO DO...
	MOVEM	N,FLP			;[227]...AN APPEND.
	MOVE	N,[XWD 2,FLP]		;[227]SET UP FOR FILOP CALL
	FILOP.	N,			;[227]POINT TO NEXT BLOCK IN SYSTAT.TXT
	BOMB	(Output append failed)	;[227]DIE IF CAN'T APPEND
	RETURN				;[227]
;SUBROUTINE TO TYPE <MESSAGE> N/TEMP = NUM.NUM
;ARGS	M=ADDR OF FIRST ASCIZ MESSAGE
;	N=DIVIDEND
;	TEMP=DIVISOR

SWPPRT:	PUSH	P,N		;SAVE DIVIDEND
	PUSHJ	P,MSGDEC
	MOVSI	A,(SIXBIT ./.)
	MOVE	N,TEMP
	PUSHJ	P,SIXDEC
	MOVEI	M,[ASCIZ / = /]
	POP	P,N		;RESTORE DIVIDEND
	IMULI	N,^D10
	IDIV	N,TEMP
	LSH	N1,1		;CHECK FOR ROUNDING
	CAML	N1,TEMP
	AOS	N		;ROUND UP
	IDIVI	N,^D10
	MOVEM	N1,TEMP1
	PUSHJ	P,MSGDEC
	MOVEI	M,[ASCIZ /./]
	MOVE	N,TEMP1
	PJRST	MSGDEC

;SUBROUTINE TO PRINT THE USER NAME FOR A JOB.
;ARGS	J=JOB NUMBER

USRNAM:	MOVE	A,@.USNM1	;GET FIRST HALF OF USER NAME
	PUSHJ	P,SIXPRT	;PRINT IT
	MOVE	A,@.USNM2	;GET SECOND HALF
	PUSHJ	P,SIXPRT	;PRINT IT
	PJRST	TAB		;END WITH TAB AND RETURN

;SUBROUTINE TO PRINT ALL 6 CHARACTERS OF A SIXBIT NAME
;ARGS:	A=SIXBIT NAME

SIXPRT:	MOVE	BP,A		;MOVE NAME TO BP
	MOVEI	A,6		;AND SETUP LOOP COUNTER
SIXPR1:	MOVEI	CH,0
	LSHC	CH,6		;MOVE NEXT CHAR OF NAME INTO CH
	ADDI	CH,40		;CONVERT TO ASCII
	PUSHJ	P,TYO		;TYPE IT
	SOJG	A,SIXPR1	;LOOP FOR ALL
	POPJ	P,		;RETURN
NOWHO:
IFN HIDPPN,<
	CAME	A,ME
	TLNE	F,FL.GOD
	POPJ	P,		;RETURN IF OK
	SETO	A,		;HIDE IT--CHANGE NAME
>
	POPJ	P,

ASTSIX:	MOVE	A,[SIXBIT /**,**/]
SP4SIX:	TDNE	A,[-1-77B5]	;SEE IF SHORT NAME
	SKIPE	SEGFLG		;NO--SEE IF SEGMENT MODE
	JRST	TABSIX		;YES--DO TAB THEN PRINT
	MOVEI	N,4		;SPACE 4, THEN SIXBIT
	PUSHJ	P,SPACE
	SOJG	N,.-1
SIXBP:	MOVE	BP,A
SIXBP1:	MOVEI	CH,0
	LSHC	CH,6
	IFN CH-BP+1,<PRINTX BP MUST BE CH+1>
	ADDI	CH,40
	PUSHJ	P,TYO
	JUMPN	BP,SIXBP1
CPOPJ:	POPJ	P,0

TABSIX:	PUSHJ	P,TAB		;SEND TAB
	JRST	SIXBP		;THEN SIXBIT MESSAGE

REPEAT 0,<
;SUBR VERPRT - CALL WITH (137) OR THE LIKE IN N, TYPES STD FORM VERSION
VERPRT:	PUSH	P,N
	LDB	N,[POINT 9,0(P),11]
	PUSHJ	P,OCTPRT
	LDB	CH,[POINT 6,0(P),17]
	JUMPE	CH,VERP1
	ADDI	CH,"A"-1
	PUSHJ	P,TYO
VERP1:	HRRZ	N,0(P)
	JUMPE	N,VERP2
	MOVEI	CH,"("
	PUSHJ	P,TYO
	PUSHJ	P,OCTPRT
	MOVEI	CH,")"
	PUSHJ	P,TYO
VERP2:	LDB	N,[POINT 3,0(P),2]
	JUMPE	N,VERP3
	MOVNS	N
	PUSHJ	P,DECPRT
VERP3:
NPOPJ:	POP	P,N
	POPJ	P,0
>
;SUBROUTINE CALLED TO INSURE THAT DATA FOR MULTIPLE CPU'S IS
;LINED UP PROPERLY.THE CALL IS IDENTICAL TO THE CALL OF GETRSP

GETRS0:	PUSHJ	P,GETRSP	;GET THE DATA
	JRST	STAB		;NO MORE SET TABS
	SKIPE	CPU		;DO NOT SEPERATE PRINT OUT THE FIRST TIME
	PUSHJ	P,PLUS		;PRINT THE SEPERATOR
	PJRST	CPOPJ1		;GIVE A SKIP RETURN

STAB:	MOVE	A,NCPCNF	;GET THE NUMBER OF CPUS
STAB0:	CAMG	A,CPU		;LIGNED UP ALLREADY
	POPJ	P,		;YES GIVE NORMAL RETURNS
	PUSHJ	P,TAB		;PRINT A TAB
	SOJA	A,STAB0		;FILL TILL ALL CPUS DONE

;SUBROUTINE TO GET REL ENTRY FROM MONITOR GETTAB SUB-TABLE
;CALL:	MOVEI	A,DESIRED REL ENTRY IN RESPONSE TABLE
;	MOVEM	CPU #,CPU	;STORE CPU NUMBER = 0,1
;	PUSHJ	P,GETRSP
;	  ERROR RETURN NOT PRESENT FOR THIS CPU
;	OK RETURN CONTENTS IN AC A

GETRSP:	PUSH	P,N1		;SAVE N1
	PUSH	P,B		;SAVE B (GETTB USES B INSTEAD OF A)
	PUSH	P,A		;SAVE RELATIVE ADR IN SUB-TABLE
	MOVE	B,CPU		;CPU WANTED
	CAML	B,NCPCNF	;REALLY THERE
	JRST	GTRSPX		;NO, ERROR RETURN
	IMULI	A,NCPUS		;MAKE INDEX TO RESPONSE TABLE IN CORE
	ADD	A,CPU
	MOVEM	A,RSPIDX
	MOVE	B,[%CCRSP]	;GETTAB IN CPU CONSTANTS TABLE
				; FOR REL ENTRY IN CPU VARIABLE TABLE
				; FOR RESPONSE DATA
	ADD	B,CPU		;FORM FOR THIS CPU
	ADD	B,CPU		;CONSTANTS GETTABS ARE EVERY OTHER
	PUSHJ	P,GETTB		;GET ENTRY FROM MONITOR
	  JRST	GTRSPX		;NOT PRESENT, ERROR RETURN
	ADD	B,(P)		;FORM ADR IN CPU VARIABLE TABLE
	HRL	B,B		;TO LH
	HRRI	B,.GTC0V	;VARIABLE GETTAB FOR CPU0
	ADD	B,CPU		;FOR FOR CPU N
	ADD	B,CPU		;VARIABLE TABLE IS EVERY OTHER
	PUSHJ	P,GETTB		;GET FROM MONITOR
	  SOS	-3(P)		;NOT PRESENT, SET FOR ERROR RETURN
	AOS	-3(P)		;SKIP RETURN(UNLESS ERROR)
GTRSPX:	MOVE	A,B		;PUT RESULT IN A
	POP	P,N1		;RESTORE PD LIST
	POP	P,B		;RESTORE B
	POP	P,N1		;RESTORE N1
	POPJ	P,		;ERROR OR OK RETURN


;SUBROUTINE TO PROVIDE INCREMENTAL RESPONSE VALUE
; RETURNS WITH INCREMENTAL VALUE IN A,  OLD VALUE IN OLDRSP(RSPIDX)
; AND INCREMENTAL VALUE IN DIFRSP(RSPIDX).
;
;CALL:	MOVEI	A,VALUE		;VALUE FROM GETTAB
;	PUSHJ	P,GETDIF	;RSPIDX HAS POINTER (SET BY GETRSP)
;	RETURN HERE

GETDIF:	PUSH	P,B		;SAVE B,N
	PUSH	P,N
	MOVE	N,RSPIDX	;GET TABLE POINTER
	MOVE	B,OLDRSP(N)	;GET PREVIOUS VALUE
	MOVEM	A,OLDRSP(N)	;SAVE NEW AS OLD FOR NEXT TIME
	SUB	A,B		;GET DIFFERENCE
	MOVEM	A,DIFRSP(N)	;SAVE DIFFERENCE IN CASE NEED IT LATER
	POP	P,N		;RESTORE N,B
	POP	P,B
	POPJ	P,		;RETURN,  INCREMENTAL VALUE IN A


;ROUTINE TO COMPUTE INTEGER SQRT:  N=ISQRT(A,B)
;CALLED WITH POS ARG IN "A,B", RESULT RETURNED IN "N", USES N1

ISQRT:	MOVEI	N,0		;PRESET NULL ANSWER
	JUMPL	A,CPOPJ		;RETURN 0 IF NEG
	MOVE	N,A		;COPY ARG
	JFFO	N,.+2		;SET N1 TO NUM 0S
	MOVEI	N1,^D36		; IN CASE ALL ZERO
	SOS	N1		;BACK DOWN FOR SIGN BIT
	TRZ	N1,1		;MAKE SMALLER EVEN
	LSH	B,1		;COMPRESS OUT SIGN BIT OF B
	LSHC	A,-^D35(N1)	;POSITION MOST SIG. BITS IN B
	ASH	N1,-1		;DIVIDE SHIFT BY 2
	MOVNS	N1		;SET TO OTHER WAY FOR ANSWER

	TRO	B,1		;FORCE SOME BITS ON TO TERMINATE
	MOVEI	N,0		;CLEAR ANSWER
ISQ1:	ASH	N,1		;MOVE TO NEXT BIT
	CAMG	A,N		;SEE IF REMAINDER IS BIG
	JRST	ISQ2		;NO--LOOP ON
	SUB	A,N		;DECREASE REMAINDER
	SUBI	A,1		; ..
	TRO	N,2		;INCREASE RESULT
ISQ2:	LSHC	A,2		;SHIFT REMAINDER TWO BITS
	JUMPN	B,ISQ1		;LOOP UNTIL DONE
	ASH	A,-1		;BACK OFF REMAINDER
	CAMLE	A,N		;SEE IF ROUNDING NEEDED
	ADDI	N,1		;YES--INCREASE RESULT

	ASH	N,^D17(N1)	;POSITION RESULT
	POPJ	P,		;RETURN
CRLF2:	PUSHJ	P,CRLF
CRLF:	MOVEI	M,[ASCIZ /
/]
MSG:	TLOA	M,440700
MSG1:	PUSHJ	P,TYO
	ILDB	CH,M
	JUMPN	CH,MSG1
	POPJ	P,

;KAYPEE PRINTS A P OR K DDEPENDING ON THE SYSTEM
;WHOSE SYSTAT IS BEING PRINTED

KAYPEE:	MOVEI	CH,"K"		;ASSUME KA10 FIRST
	SKIPE	CPKI10		;IS IT A KI10?
	MOVEI	CH,"P"		;(YES) THEN A P
	PJRST	TYO		;RETURN AFTER PRINTING

PLUS:	MOVEI	CH,"+"
	JRST	TYO

PERIOD:	MOVEI	CH,"."
	JRST	TYO

COLON:	TLNE	F,FL.SZR	;DON'T PRINT IF SUPPRESSINGZEROES
	POPJ	P,
	MOVEI	CH,":"
	TLNE	F,FL.BZR	;PRINT BLANK IF BLANKING ZEROES
	MOVEI	CH," "
	JRST	TYO

COMMA:	MOVEI	CH,","
	JRST	TYO

SIXTAB:	PUSHJ	P,SIXBP
TAB:	SKIPA	CH,["	"]	;PRINT TAB
SPACE:	MOVEI	CH,40
TYO:	JUMPL	WD,CPOPJ
	SKIPE	COMTOA		;SPECIAL TYPEOUT ROUTINE?
	PJRST	@COMTOA		;YES, DISPATCH TO IT
	TRNN	F,FR.DPY	;DOES HE WANT PAGED OUTPUT?
	JRST	TYO1		;NO
	CAIN	CH,12		;IS IT A LINE FEED?
	SOSE	LINECT		;COUNT LINES
	SKIPA
	PUSH	P,[HICCUP]	;HANDLE IT LATER
TYO1:	SOSG	TYOB+2
	OUTPUT	TTY,0
	IDPB	CH,TYOB+1
	POPJ	P,0

TYOCH:	OUTCHR	CH
	POPJ	P,
;WE TRICKED TYO INTO RETURNING HERE AFTER THAT LINE FEED
HICCUP:	PUSH	P,M		;SAVE THE REST FOR LATER
	CLRBFI			;CLEAR THE INPUT BUFFER
	OUTPUT	TTY,0		;EMPTY THE BUFFER JUST IN CASE
	TTCALL	2,M		;RESET THE ^O SWITCH
	  JRST	.+3		;NOTHING TYPED
	CAIN	M,3		;HE SAID SOMETHING, WAS IT ^C?
	JRST	EXIT.		;[210] YES, QUIT
	OUTSTR	[ASCIZ/Type any single character to continue:/]
	INCHRW	M		;WAIT UNTIL HE TYPES SOMETHING, THEN EAT IT
	CAIE	M,15	
	OUTSTR	[ASCIZ /
/]				;SEND CAR.RETURN IF USER DIDN'T.
	CAIN	M,3		;IS IT ^C ?
	JRST	EXIT.		;[210]YES, QUIT!
	CAIN	M,15
	INCHRW	M		;ACCEPT SCANNER SERVICE L.F.
	MOVEI	M,^D19		;PAGE SIZE LESS ONE
	MOVEM	M,LINECT	;RESET THE COUNTER
	POP	P,M		;RESTORE THE REGISTER
	POPJ	P,		;REMEMBER WE HAD STOLEN TYO'S RETURN

OPRN2X:	MOVEI	CH,77		;PRINT OCTAL AT LEAST 2 DIGITS

;PRINT OCTAL FIXED NUMBER OF PLACES
;CALL: CH=BIGGEST VALUE, N=VALUE
FIXOCT:	LSH	CH,-3		;POSITION MASK
	SKIPE	CH		;SEE IF OUT OF PREFIX
	CAMLE	N,CH		;SEE IF DONE
	JRST	OPRNT		;YES--OUTPUT NUMBER
	PUSH	P,CH		;PRESERVE MASK
	PUSHJ	P,SPACE		;OUTPUT FILLER
	POP	P,CH		;RESTORE MASK
	JRST	FIXOCT		;LOOP FOR MORE

;OCTAL OUTPUTS
OPRNT:	MOVEI	R,10		;REGULAR RADIX
	JRST	RDXPRT		;GO DO IT
TCKTIB:	TLOA	F,FL.BZR	;BLANK LEADING ZEROES
TCKTIS:	TLO	F,FL.SZR	;SUPPRESS ZEROES
TCKTIM:	IDIV	A,TCKSEC	;JUNK JIFFIES
	ASH	B,1		;ROUND?
	CAML	B,TCKSEC
	ADDI	A,1		;ROUND-UP
TIME:	PUSH	P,A		;ASVE TIME FOR LATER TEST
	IFGE  FTAMPM,<
	IFE   FTAMPM,<
	MOVSI	B,(CLKCYC)	;GET FLAG FOR 50 HERTZ
	TDNE	B,STATES	; IN STATES WORD
	TRZ	F,FR.DAY	;YES--CLEAR AM/PM REQUEST
>
	TRNE	F,FR.DAY	;SEE IF AM/PM HACK
	CAIGE	A,^D12*^D60*^D60  ;YES--SEE IF PM
	JRST	.+2		;NO--SKIP
	SUBI	A,^D12*^D60*^D60  ;YES--SUBTRACT 12 HOURS
>
	IDIVI	A,^D60*^D60
	IFL   FTAMPM,<
	MOVE	N,A
>
	IFGE  FTAMPM,<
	SKIPN	N,A
	TRNN	F,FR.DAY
	JRST	.+2
	MOVEI	N,^D12
>
	PUSHJ	P,DECP2X
	PUSHJ	P,COLON
	IDIVI	B,^D60
	MOVE	N,B
	PUSHJ	P,DECPR2
	PUSHJ	P,COLON
	MOVE	N,C
	MOVEI	C,DECPR2	;PRESET ROUTINE
	TLZE	F,FL.SZR
	MOVEI	C,DECPRT	;IF SUPPRESSING, MAKE SURE WE PRINT SOMETHING
	TLZE	F,FL.BZR
	MOVEI	C,DECP2X	;LIKEWISE FOR BLANKING
	PUSHJ	P,(C)		;PRINT FINAL FIELD
	POP	P,C		;RECOVER ARGUMENT
	IFGE  FTAMPM,<
	MOVEI	M,[ASCIZ / a.m./]
	CAIL	C,^D12*^D60*^D60
	MOVEI	M,[ASCIZ / p.m./]
	TRZE	F,FR.DAY	;SEE IF AM/PM HACK
	JRST	MSG		;YES--OUTPUT SUFFIX
>
	POPJ	P,		;NO--RETURN
DECP3X:	MOVEI	CH," "
	CAIG	N,^D99
	PUSHJ	P,TYO
	JRST	DECP2X		;PRINT 3 DECIMAL DIGITS
DECPR2:	MOVEI	CH,"0"
	TLNE	F,FL.BZR	;SUBSTITUTE BLANK IF BLANKING ZEROES
DECP2X:	MOVEI	CH," "
	CAIG	N,^D9
	TLNE	F,FL.SZR	;DON'T PRINT IF SUPPRESSING ZEROES
	JRST	DECPRT
	PUSHJ	P,TYO
DECPRT:	MOVEI	R,^D10
RDXPRT:	MOVEI	CH,"-"
	JUMPGE	N,RADIX1
	PUSHJ	P,TYO
	MOVMS	N
RADIX1:	JUMPN	N,RADIX2	;DEFINITELY PRINT IF NON-ZERO
	TLNN	F,FL.SZR!FL.BZR	;SEE IF BLANKING OR SUPPRESSING
	JRST	RADIX2		;NO--PRINT ONE ZERO
	MOVEI	CH," "
	TLNN	F,FL.SZR	;SEE IF SUPPRESSING ZEROES
	PUSHJ	P,TYO		;NO--BLANKING SO OUTPUT SPACE
	POPJ	P,		;YES--RETURN
RADIX2:	TLZ	F,FL.SZR!FL.BZR	;STOP ANY ZERO SUPPRESSION
	IDIVI	N,(R)
	HRLM	N1,0(P)
	SKIPE	N
	PUSHJ	P,RADIX2
	HLRZ	CH,0(P)
	ADDI	CH,"0"
	JRST	TYO

DECTAB:	PUSHJ	P,DECPRT
	JRST	TAB
THISIS:	MOVEI	M,[BYTE (7) 14,0,0,0]	;GIVE HIM A FORM FEED
	TLNE	F,FL.LPT	;IF HE IS OUTPUTTING TO THE LPT
	PUSHJ	P,MSG		;OTHERWISE NOT
	SKIPA	M,[[ASCIZ /
Status of /]]
CRSMSG:	MOVEI	M,[ASCIZ/Monitor is /]
	PUSHJ	P,MSG
	MOVEI	B,0
	MOVEI	C,11		;TAB
SYS2:	MOVEI	M,A
	MOVE	A,C
	PUSHJ	P,GETA
	PUSHJ	P,MSG
	AOBJN	C,.+1
	TRNE	A,376
	SOJA	C,SYS2
	MOVEI	M,[ASCIZ / at /]
	PUSHJ	P,MSG
	MOVE	A,XTIME
	PUSHJ	P,GETA
	MOVEM	A,NOW		;SAVE FOR LATER
	IFGE  FTAMPM,<
	TRO	F,FR.DAY	;SET FOR DATE AM/PM HACK
>
	PUSHJ	P,TCKTIM
	MOVEI	M,[ASCIZ / on /]
	PUSHJ	P,MSG
	MOVE	A,XDATE		;GET TODAY'S DATE
	PUSHJ	P,GETA		;FRESHLY
	IDIVI	A,^D31
	MOVEI	N,1(B)
	PUSHJ	P,DECPR2
	IDIVI	A,^D12
	MOVE	B,MONTAB(B)
	MOVEI	C,0
	MOVEI	M,B
	MOVEI	N,^D64(A)
	PUSHJ	P,MSGDEC	;PRINT MESSAGE FOLLOWED BY DECIMAL NO.
	SKIPE	COMTOA		;SPECIAL TYPEOUT ROUTINE?
	POPJ	P,		;YES, NO CRLF AT END
	CALL	CRLF		;PRINT IT
	OUTPUT	TTY,		;AND FORCE IT OUT
	RETURN
;SUBROUTINE TO PRINT PROJECT PROGRAMMER NUMBER AS A PAIR
;IF ZERO, RETURN
;IF SAME AS SYSPPN, PRINT "SYS"
;IF SAME AS MY PPN, PRINT "[SELF]"
;IF SIGN BIT ON, PRINT IN SIXBIT
;ELSE, PRINT AS PAIR OR OCTAL NUMBERS
;ENTERED WITH PPN TO BE PRINTED IN A
;USES N,R,N1,BP,CH

PNTPPN:	SKIPN	A		;SEE IF NULL
	POPJ	P,		;YES--RETURN
	CAMN	A,[-1]		;SEE IF HIDDEN
	JRST	ASTSIX		;YES--PRINT ASTERISKS
	CAMN	A,FSFPPN	;SEE IF OPERATOR
	MOVE	A,[SIXBIT /[OPR]/]
	CAMN	A,SYSPPN
	MOVE	A,[SIXBIT /[SYS]/]  ;TYPE NAME FOR SYS
	SKIPN	ONEJOB		;SEE IF SELF
	TLNE	F,FL.GOD!FL.LPT	;SEE IF OPERATOR
	JRST	NOTSLF		;YES--SKIP SELF CHECK
	CAMN	A,ME		;SEE IF ME
	MOVE	A,[SIXBIT /[SELF]/]
NOTSLF:	IFN STANSW,<JRST TABSIX>
	IFE STANSW,<
	JUMPLE	A,SP4SIX	;PRINT AS NAME IF SIXBIT
	TLNE	A,7B20		;[246] WIDE PROJECT NUMBER?
	PUSHJ	P,SPACE		;[246] YES--SPACE OVER
	PUSH	P,A		;SAVE ARGUMENT
	HLRZ	N,A		;GET LEFT HALF
	MOVEI	CH,-1		;SETUP MASK FOR 6 DIGITS
	PUSHJ	P,FIXOCT	;OUTPUT IN FIXED FORMAT
	JRST	OCTCRH		;GO FINISH IN  VARIABLE FORM
>

;PRINT OCTAL AS UNSIGNED HALVES
OCTPRA:	MOVE	N,A		;MOVE DATUM
OCTPRT:	PUSH	P,N
	HLRZ	N,N
	JUMPE	N,OCTRH
	PUSHJ	P,OPRNT		;OUTPUT IN OCTAL
OCTCRH:	PUSHJ	P,COMMA
OCTRH:	HRRZ	N,(P)
	PUSHJ	P,OPRNT		;OUTPUT IN OCTAL
	POP	P,N
	POPJ	P,
	JRST	RDXPRT
;SUBROUTINE TO GET A CH. FROM COMMAND BUFFER
;CALL	PUSHJ	P,GETCHR
;	NONE LEFT OR BREAK CH. FOUND
;	GOT A CH. RETURN
;AC WD IS RETURNED WITH THE CH.
;AC F WILL HAVE FL.BRK SET IF BREAK CH. FOUND

GETCHR:	SKIPE	WD,SAVCHR	;SEE IF ALREADY HOLDING CHAR
	JRST	[SETZM	SAVCHR	;YES--CLEAR IT
		 JRST	CPOPJ1]	;AND RETURN IT
	TLNE	F,FL.BRK	;[200] SEE IF ALREADY AT END
	JRST	FLAGIT		;[200] YES
	ILDB	WD,CMDPTR	;[200] GET CHARACTER
	CAIN	WD,0		;[200] NULL CHARACTER ?
	JRST	FLAGIT		;[200] YES--NONE LEFT
	CAIN	WD,3		;IS IT ^C ?
	EXIT	1,		;YES, ABORT, ABORT, ABORT
	CAIL	WD,"A"+40	;CHECK LOWER CASE
	CAILE	WD,"Z"+40
	JRST	.+2		;NO
	SUBI	WD,40		;YES
	CAIN	WD,11		;SEE IF TAB
	MOVEI	WD," "		;YES--CHANGE TO SPACE
	CAIG	WD,14		;IS IT LF,VT
	CAIGE	WD,12		; FF OR
	CAIN	WD,33		; ALTMODE?
	JRST	FLAGIT		;YES - NON SKIP RETURN
	CAIE	WD,176		;[150] OTHER KINDS
	CAIN	WD,175		;[150] OF ALTMODE?
	JRST	FLAGIT		;[150] YES - NON SKIP
IFE FTDEBUG,<
	TRNE	F,FR.CMT	;[150] ARE WE IN A COMMENT?
	JRST	GETCHR		;[150] YES - THROW IT AWAY
	CAIE	WD,";"		;[150] IS THIS A COMMENT?
	CAIN	WD,"!"		;[150] EITHER KIND?
	JRST	.+2		;[150] YES, GO HANDLE IT
>
	JRST	CPOPJ1		;[150] NONE OF THE ABOVE, RETURN IT.
IFE FTDEBUG,<
	TRO	F,FR.CMT	;[150] INTO A COMMENT
	JRST	GETCHR		;[150] SO THROW THE CHAR AWAY.
>
FLAGIT:	TLO	F,FL.BRK	;FLAG THAT BREAK FOUND
	POPJ	P,		;NON SKIP RETURN

;GET RADIX INPUT
GETRDC:	TDZA	N,N		;CLEAR ANSWER AND SUCK CHAR
GETRDX:	TDZA	N,N		;CLEAR ANSWER
GETRD1:	PUSHJ	P,GETCHR	;GET NEXT DIGIT
	  JFCL			;IGNORE END
	CAIL	WD,"0"		;SEE IF DIGIT
	CAIL	WD,"0"(R)	; ..
	JRST	[EXCH	WD,SAVCHR	;NO--SAVE FOR NEXT SCAN
		 POPJ	P,]		;RETURN
	IMULI	N,(R)		;YES--ADVANCE RESULT
	ADDI	N,-"0"(WD)	;ADD DIGIT
	JRST	GETRD1		;LOOP FOR MORE
; [200] @GETRD1+7 1/2, ADD ROUTINE RDCMND, JMT, 3-MAY-76
;SUBROUTINE TO READ COMMAND INTO COMMAND BUFFER
;IF THIS IS THE FIRST TIME, AND TO RESET THE POINTER
;TO THE BEGINNING.
;CALL:
;	PUSHJ	P,RDCMND
;	 . .		;RETURNS HERE
;ACS A & WD ARE DESTROYED

RDCMND:	MOVE	A,ORGPTR	;[200] GET ORIGIONAL POINTER
	MOVEM	A,CMDPTR	;[200] AND RESET COMMAND POINTER
	SETZM	SAVCHR		;[200] RESET LOOK AHEAD
	TLZ	F,FL.BRK	;[200] AND CLEAR BREAK FLAG
	SKIPE	GOTCMD		;[223] GOT COMMAND ALREADY?
	  RETURN		;[223] YES, RETURN
	RESCAN	1		;[223] TRY TO READY COMMAND LINE
	SKPINC			;[223] ANYTHING?
	  JRST	FLAGIT		;[223] NO, RETURN EOF.
RDCMD1:	TTCALL	2,WD		;[200] GET CHARACTER
	  JRST	RDCMD2		;[200] NO MORE LEFT
	IDPB	WD,CMDPTR	;[200] STORE CHARACTER IN BUFFER
	HRRZ	A,CMDPTR	;[214] WHERE DID WE PUT THAT CHAR?
	CAIL	A,CDENDP	;[214] IN THE LAST WORD??
	 JRST CBOFLO		;[214] YES, OVERFLOW ERROR
	CAIG	WD,14		;[200] IS IT LF, VT
	CAIGE	WD,12		;[200] FF OR
	CAIN	WD,33		;[200] ALTMODE ?
	JRST	RDCMD2		;[200] YES--NO MORE LEFT
	CAIE	WD,176		;[200] OTHER KINDS
	CAIN	WD,175		;[200] OF ALTMODES ?
	JRST	RDCMD2		;[200] YES--THAT'S IT
	JRST	RDCMD1		;[200] NO--LOOP BACK FOR REST OF LINE

RDCMD2:	SETZ	WD,		;[200] CLEAR WD TO MAKE NULL
	IDPB	WD,CMDPTR	;[200] MARK BUFFER END WITH NULL
	MOVE	A,ORGPTR	;[200] GET ORIGIONAL BUFFER POINTER
	MOVEM	A,CMDPTR	;[200] AND RESET COMMAND POINTER
	SETOM	GOTCMD		;[200] SET COMMAND GOTTEN FLAG
	MOVE	A,ORGPTR	;[213] GET ORIGIONAL POINTER
	MOVEM	A,CMDPTR	;[213] AND RESET COMMAND POINTER
	SETZM	SAVCHR		;[213] RESET LOOK AHEAD
	TLZ	F,FL.BRK	;[213] AND CLEAR BREAK FLAG
	POPJ	P,0		;[213] RETURN



CBOFLO:	JSP	M,BOMB.		;[214]
	ASCIZ /Input line too long/
;SUBROUTINE TO DIVIDE A NUMBER IN AC N BY TEMP
;ROUND UP RESULT IF NECESSARY AND PRINT MESSAGE FOLLOWED BY N (%)
;CALL	MOVEM	AC,TEMP
;	MOVE	N,NUMBER TO BE DIVIDED
;	MOVEI	M,[ASCIZ /TEXT/]
;	PUSHJ	P,DIVRPT
;	ALWAYS	RETURN
;ACS N1,N,M,CH & R ARE DESTROYED

CMPCNA:	MOVE	N,A
CMPCNT:	IMULI	N,^D100
	IDIV	N,TEMP
	LSH	N1,1
	CAML	N1,TEMP
	ADDI	N,1

MSGDEC:	PUSHJ	P,MSG
	JRST	DECPRT

SIXDEC:	PUSHJ	P,SIXBP
	JRST	DECPRT

DECMSG:	PUSHJ	P,DECPRT	;OUTPUT DECIMAL
	JRST	MSG		;THEN MESSAGE

MSGOCT:	PUSHJ	P,MSG		;SEND MESSAGE
	JRST	OCTPRT		;THEN OCTAL

;SUBROUTINE TO CHECK IF A SEGMENT IS INACTIVE
;INACTIVE IS DEFINED AS RUN BIT OFF OR TI OR SL STATE
;ARGS	J=SEGMENT NUMBER IN RH
;NON-SKIP RETURN IF ACTIVE, SKIP RETURN IF INACTIVE

INACTC:	SKIPL	D,@.STS		;SKIP IF RUN BIT ON
	JRST	CPOPJ1		;OFF, INACTIVE
	LDB	D,[POINT 5,D,14]	;GET WAIT STATE CODE
	HLL	D,TISL		;SET UP FOR TEST
	CAMN	D,TISL		;SKIP IF DOESNT MATCH
	JRST	CPOPJ1		;YES, ONE MATCHES, INACTIVE
	MOVSS	TISL		;SET UP TO TEST OTHER HALF
	HLL	D,TISL
	CAMN	D,TISL		;SKIP IF DOESNT MATCH
	JRST	CPOPJ1		;YES, MATCHES, INACTIVE
	POPJ	P,		;NO, MUST BE ACTIVE

;SUBROUTINE TO PRINT (N) AS A PERCENTAGE OF (CH), RIGHT JUSTIFIED
;CALL	MOVE	CH,REFERENCE NUMBER
;	MOVE	N,NUMBER TO BE DIVIDED
;	PUSHJ	P,PNCT2
;	ALWAYS	RETURN
;ACS N1,N,CH & R ARE DESTROYED

PCNT2:	IMULI	N,^D100
	IDIV	N,CH
	LSH	N1,1
	CAML	N1,CH
	ADDI	N,1

	MOVEI	CH," "		;FOR A LEADING BLANK
	CAIG	N,^D9		;DO WE NEED IT TO RIGHT JUSTIFY?
	PUSHJ	P,TYO		;YES
	JRST	DECPRT

;SUBROUTINE TO PRINT INTEGER+1 DIGIT FRACTION
;CALL:	MOVEM	TEMP		NUMBER TO DIVIDE BY
;	MOVE	A,NUMBER TO BE DIVIDED
;	PUSHJ	P,CMPDFA
;	ALWAYS RETURN

CMPDFA:	MOVE	N,A
CMPDFN:	IMULI	N,^D10		;  * 10
	IDIV	N,TEMP		;DIVIDE BY #K AVAILABLE
	LSH	N1,1		;REMAINDER * 2
	CAML	N1,TEMP		;TEST FOR ROUNDING NEEDED
	AOJ	N,		;  YES, INCR QUOTIENT BY 1
	IDIVI	N,^D10		;DIVIDE TO GET INTEGER/FRACTION
	PUSH	P,N1		;SAVE FRACTION FOR LATER
	PUSHJ	P,MSGDEC	;PRINT MSG & INTEGRAL PART
	POP	P,N		;RESTORE FRACTIONAL DIGIT
	MOVEI	M,[ASCIZ /./]
	PJRST	MSGDEC		;PRINT DEC. POINT & FRACTION

;SUBROUTINE TO PRINT JIFFY TIME TO NEAREST TENTHS OF SECONDS
;CALL:	MOVE	N,TIME IN JIFFIES
;	PUSHJ	P,PNTSEC

PNTSEC:	MOVE	A,TCKSEC	;NO. OF JIFFIES IN 1 SECOND
	MOVEM	A,TEMP		;STORE FOR CMPDFN
	PJRST	CMPDFN		;GO PRINT RATIO
;SUBROUTINE TO PRINT SMALL TIME VALUE
;CALL	MOVE A,VALUE IN JIFFIES
;	PUSHJ	P,TIMPR
;	 .. RETURN

TIMPR:	IMULI	A,^D100
	IDIV	A,TCKSEC	;FORM .01 SECONDS
	TLO	F,FL.SZR	;SUPPRESS ZEROES
	JRST	MEMPR1

;SUBROUTINE TO CONVERT BLT TIME TO SECONDS (ROUNDED)
;PRINTS MESSAGE FOLLOWED BY TIME
;CALL	MOVE	A,BLT COUNT
;	MOVEI	M,[ASCIZ /TEXT/]
;	PUSHJ	P,MEMPR
;	ALWAYS	RETURN
;ACS A,B,C,N,N1,M,CH & R ARE DESTROYED

MEMPR:	TLO	F,FL.SZR	;SUPPRESS ZEROES
	PUSHJ	P,MSG		;SEND MESSAGE
	MUL	A,MEMNSP	;=TOTAL N-SEC/2
	DIV	A,[^D5000000]	;=TOTAL .01 SEC
MEMPR1:	TLNE	B,200000	;CHECK ROUND
	ADDI	A,1		;ROUND-UP
	IDIVI	A,^D100		;GET SEC
	PUSH	P,B		;SAVE .01S
	PUSHJ	P,TIME		;PRINT HR:MIN:SEC
	PUSHJ	P,PERIOD	;PRINT .
	POP	P,N		;RESTORE .01S
	PUSHJ	P,DECPR2	;PRINT .01S
	POPJ	P,		;RETURN


;SUBROUTINE TO COMPUTE THE SIZE OF A HI OR LOW SEGMENT
;ENTERRED WITH J=JOB OR SEGMENT NUMBER;   IF JOB, JS=STATUS
;RETURN WITH N=SIZE IN K
;RESPECTS ALL AC'S

SEGSZ:	MOVEI	N,(J)		;CHECK RANGE.
	CAML	N,BOTH		; ..
	JRST	SEGSZ4		;NO GOOD
	TRNN	F,FR.VMF	;IS THIS A VM SYSTEM?
	JRST	SEGSZ7		;(NO) USE THE CLASSIC LOGIC
	MOVE	N,@.SWP		;(YES) ASSUME WE NEED IMGIN FIELD
	TLNN	F,FL.HSG	;IF THIS IS NO HIGH SEGMENT 
	JRST	SEGSZ6		;THEN RETURN LAST 9 BITS
	MOVE	N,@.STS		;    ELSE SEE IF IT IS
	TLNE	N,SHRSEG	;     NONSHARABLE
	JRST	SEGSZ7		;SHARABLE IS OLD LOGIC
	MOVS	N,@.SWP		;IT IS NONSHARABLE
	JRST	SEGSZ6		;RETURN 9 BITS
SEGSZ7:	MOVS	N,@.ADR		;FETCH SEGMENT ADDRESS AND SIZE IN CORE
	JUMPE	N,SEGSZ1	;JUMP IF NOT IN CORE
	TLNN	F,FL.HSG	;TEST IF HI-SEG REQUEST
	TLNN	JS,JSWP		;N0--SEE IF SWAPPED OUT
	JRST	SEGSZ2		;HI-SEG OR IN-CORE LO-SEG
SEGSZ1:	MOVE	N,@.SWP		;FETCH SWAPPING DATA
	TRNE	N,377		;SEE IF OUT YET
	JRST	SEGSZ3		;  (IN-CORE SIZE)
	MOVS	N,@.ADR		;NO. USE IN-CORE VALUE ANYWAY
SEGSZ2:	SKIPE	CPKI10
	JRST	SEGSZ5		;DO KI10 WORK
	ADDI	N,1777		;ROUND IN-CORE SIZE UP
	ASH	N,-^D10		;DIVIDE BY 1K
SEGSZ3:	ANDI	N,377		;MASK RESULT TO 256K
	POPJ	P,		;RETURN
SEGSZ4:	MOVEI	N,777		;RETURN HUGE NUMBER
	POPJ	P,0
SEGSZ5:	ADDI	N,777	;ROUND TO PAGES
	LSH	N,-^D9
SEGSZ6:	ANDI	N,777
	POPJ	P,
;SUBROUTINE TO FIND 1ST. JOB USING A SEGMENT
;CALL	MOVE	J,SEGMENT NO.
;	PUSHJ	P,SEGSCN
;	NONE FOUND RETURN
;	FOUND
;AC'S B & C DESTROYED
;AC J IS RESPECTED

SEGSCN:	MOVN	B,JOBN
	HRLZS	B
	HRR	B,.SGN		;PREPARE AOBJN PTR. FOR SCANNING JBTSGN
HIGH06:	HRRZ	C,(B)		;GET SEGMENT NO.
	CAIE	C,(J)		;DOES IT MATCH WITH CURRENT ONE?
HIGH6A:	AOBJN	B,HIGH06	;NO-DO AGAIN
	JUMPL	B,CPOPJ1	;WE HAVE A MATCH?
	POPJ	P,		;NO-NONE FOUND RETURN


;SUBROUTINE TO PRINT A MSG. FOLLOWED "SW" IF SEGMENT SWAPPED & NOT FRAGMENTED
; OR "SF" IF SWAPPED & FRAGMENTED, OR "FR" IF JUST FRAGMENTED & A HISEG
; OR NOTHING IF IN CORE & NOT FRAGMENTED
;CALL	MOVE	JS,JOB/HISEG STATUS
;	MOVE	B,CORE SIZE (HI ONLY)
;	MOVSI	A,(SIXBIT .XX.)
;	PUSHJ	P,LOPSWP/HIPSWP
;	ALWAYS GOOD RETURN
;AC'S A,B,BP,CH ARE DESTROYED
;AC JS IS RESPECTED  *******MSG TO BE PRINTED MUSTN'T EXCEED 4 CHS.********

HIPSWP:	TLNE	JS,JSWP		;IS HI SEG SWAPPED?
	JRST	LOPSW1		;YES - GO PRINT "SW" OR "SF"
	SKIPL	@.SWP		;CORE IMAGE FRAGMENTED ON DISK?
	JRST	LOPSW3		;NO
	PUSHJ	P,SIXBP
	MOVSI	A,(SIXBIT .FR.)	;YES - PRESUME HISEG IN CORE
	JRST	LOPSW2		;YES - PRINT "FR"

LOPSWP:	SETZ	B,
	TLNN	JS,JSWP		;IS SEG SWAPPED?
	JRST	LOPSW3		;NO - PRINT MSG & EXIT
LOPSW1:	PUSHJ	P,SIXBP
	MOVSI	A,(SIXBIT /SW/)	;PREPARE TO PRINT "SW"
	SKIPGE	@.SWP		;IS SEG FRAGMENTED?
	MOVSI	A,(SIXBIT .SWF.)	;YES - INDICATE SWAPPED & FRAGMENTED
	CAIGE	B,^D100		;SKIP SPACE IF NO ROOM
LOPSW2:	PUSHJ	P,SPACE
LOPSW3:	PUSHJ	P,SIXBP		;PRINT "FR","SF" OR "SW"
	LDB	N,IMGOUT	;GET CORE SIZE ON DISK
	ADDM	N,DSKUSE	;ADD TO TOTAL SPACE USED ON SWAPPING SPACE
	TLNN	F,FL.DOR
	JRST	TAB		;PRINT TAB & EXIT
	POPJ	P,
;**;[230]	SUBROUTINE TO SIMULATE CTLJOB UUO WHEN SYSTATING
;A CRASH FILE.
;CALL WITH PTY NAME AND NUMBER IN A.
;RETURNS CONTROLLING JOB NUMBER IN N.
;GIVES DOUBLE SKIP RETURN TO JUMP OVER CTLJOB UUO AND ITS ERROR RETURN.
;
CTLJB:	PUSH	P,A		;[230]SAVE DEVICE NAME
	MOVE	A,XDVLST	;[230]TABLE FOR GETTAB UUO
	PUSHJ	P,GETZ		;[230]GET ADDR OF FIRST DDB
	HLRZ	D,A		;[230]MOVE IT TO D
	POP	P,A		;[230]GET BACK PTY NAME
	PUSHJ	P,CNVERT	;[230]CONVERT RIGHT HALF OF PTY NAME TO SIXBIT
	PUSH	P,JS		;[230]SAVE JS
	MOVEI	JS,^D10000	;[230]PREVENT INFINITE LOOP
CTLLOP:	JUMPE	D,ENDDEV	;[230]LAST DDB ENCOUNTERED?
	MOVEI	C,DV.MOD(D)	;[230]NO,GET ITS CHARCTERISTICS
	PUSHJ	P,PEEKC		;[230]FETCH IT
	MOVE	B,C		;[230]
	TRNN	B,ASSCON+ASSPRG	;[230]IN USE?
	JRST	NEXTDV		;[230]NO,GET THE NEXT DDB
	MOVEI	C,DV.NAM(D)	;[230]GET DEVICE NAME FROM DDB
	PUSHJ	P,PEEKC		;[230]FETCH IT
	CAME	A,C		;[230]SAME?
	JRST	NEXTDV		;[230]NO,GET ANOTHER DDB
	MOVE	C,.DVJOB	;[230]GET POSITION OF CONTROLLING JOB IN DDB
	ADD	C,D		;[230]ADDRESS OF DDB+JOB OFFSET
	SKIPN	NPJOBN		;[230]OLD STYLE?
	MOVEI	C,DV.CHR(D)	;[230]YES
	HRRZS	C		;[230]MAKE SURE LEFT HALF IS EMPTY
	PUSHJ	P,PEEKC		;[230]FETCH IT
	LDB	N,PJOBN		;[230]LOAD THE CONTROLLING JOB'S NUMBER
	SKIPE	NPJOBN		;[230]
	LDB	N,NPJOBN	;[230]TRY AGAIN
	JRST	ENDDEV+1	;[230]DOUBLE SKIP RETURN
NEXTDV:	MOVEI	C,DV.SER(D)	;[230]GET LINK TO NEXT DDB
	PUSHJ	P,PEEKC		;[230]FETCH IT
	HLRZ	D,C		;[230]
	SOJG	JS,CTLLOP	;[230]LOOP FOR MORE
ENDDEV:	SETZM	N		;[230]COULDN'T FIND CONTROLLING JOB
	POP	P,JS		;[230]GET IT BACK
	JRST	CPOPJ2		;[230]DOUBLE SKIP RETURN
;
;SUBROUTINE TO CONVERT RIGHT HALF OF PTY NAME TO SIXBIT WHEN SIMULATING
;CTLJOB UUO.
CNVERT:	PUSH	P,N		;[230]SET UP
	PUSH	P,J		;[230]
	PUSH	P,D		;[230]
	PUSH	P,C		;[230]
	PUSH	P,B		;[230]
	PUSH	P,A		;[230]
	SETZM	B		;[230]
	SETZM	C		;[230]
	MOVEI	D,3		;[230]NUMBER OF CHARACTERS TO EXAMINE
	HRRZS	A		;[230]NOW CONTAINS DEVICE NUMBER TO CONVERT TO SIXBIT
	JUMPE	A,ZEROUT	;[230]DEVICE 0
	MOVE	J,[POINT 3,A,26]	;[230]SET UP BYTE POINTER
	MOVE	N,[POINT 6,C,17]	;[230]
SXBT:	ILDB	B,J		;[230]FETCH FIRST NUMBER
	CAIE	D,6		;[230]	
	CAMN	B,C		;[230]
	JUMPE	B,SXBT1		;[230]LEADING ZERO?
	ADDI	B,20		;[230]NO, CONVERT TO SIXBIT
	IDPB	B,N		;[230]DEPOSIT SIXBIT CHARACTER
SXBT1:	SOJN	D,SXBT		;[230]MORE CHARACTERS?
	SKIPA			;[230]NO
ZEROUT:	MOVEI	C,200000	;[230]DEVICE 0
	POP	P,A		;[230]GET BACK PTY NAME
	HRR	A,C		;[230]PUT SIXBIT DEVICE CODE IN RIGHT HALF
	POP	P,B		;[230]CLEAN UP
	POP	P,C		;[230]
	POP	P,D		;[230]
	POP	P,J		;[230]
	POP	P,N		;[230]
	POPJ	P,		;[230]
;END OF EDIT 230 SUBROUTINES TO SIMULATE CTLJOB UUO	
	SUBTTL	TABLES
IFLE HACKSW,<XLIST>
IFN HACKSW,<	RADIX 10
DEFINE BDAY (MO,DA,WHO)
<XWD <<MO-1>*^D31+DA-1>,EXP [ASCIZ /WHO/]>
DEFINE SDAY (MO,DA,SALUD)
<XWD SIGN!<<MO-1>*^D31+DA-1>,EXP [ASCIZ /SALUD/]>
BMSG:	ASCIZ	/Happy Birthday /
HAKTAB:
	SDAY (01,01,<Happy New Year>)
	BDAY (01,03,<Joe Fries>)
	BDAY (01,04,<Lorraine Melewski>)
	BDAY (01,06,<Barb Van Heest>)
	BDAY (01,07,<Charles Mitchell>)
	BDAY (01,11,<Susan Godsell, Karen Smith, & Dave Oran>)
	BDAY (01,12,<Dan Murphy & Larry Campbell>)
	BDAY (01,19,<Robert E Lee & Fran Merriam>)
	BDAY (01,22,<Donna Berard>)
	BDAY (01,23,<Chuck Turley>)
	BDAY (01,25,<Leonard Bosack>)
	BDAY (02,02,<Karen Fitzgerald>)
	BDAY (02,04,<Mike Uhler>)
	BDAY (02,07,<Paula Archibald>)
	BDAY (02,17,<Al Porter>)
	BDAY (02,22,<Sandy Libman>)
	BDAY (02,23,<Liz Dickenson>)
	BDAY (02,24,<Chuck O'Toole, George Mattingly, & Scott Robinson>)
	BDAY (02,28,<Stan Whitlock>)
	BDAY (03,01,<John Connor>)
	BDAY (03,06,<Magee & Kevin McElmoyle>)
	SDAY (03,17,<Happy Evacuation Day>)
	SDAY (03,17,<P.S. It's also St. Patty's Day>)
	BDAY (03,18,<Joe Farrell>)
	BDAY (03,21,<Johann Sebastian Bach>)
	SDAY (03,21,<First Day Of Spring, Tra-La>)
	BDAY (03,30,<Steve Jablonsky>)
	SDAY (04,01,<2+2=5 --- April Fool>)
	BDAY (04,01,<Jim Mills>)
	BDAY (04,01,<Fred Engel>)
	BDAY (04,03,<Roger Lipsett>)
	BDAY (04,06,<Don Fraser>)
	BDAY (04,08,<Eric Osman>)
	BDAY (04,10,<Gerry Harrington>)
	BDAY (04,13,<Don Lewine>)
	BDAY (04,15,<"Red" Caldwell>)
	BDAY (04,19,<Fran Piermarini & Marty Voshell>)
	BDAY (04,20,<Laurie Custer & Patty Hardy>)
	BDAY (04,24,<Valdeane Alusic>)
	BDAY (04,26,<Kalman Reti>)
	BDAY (04,30,<Butch Clark & Mimi Chen>)
	SDAY (05,03,<Happy Anniversary Magee>)
	BDAY (05,04,<Don Mastrovito>)
	BDAY (05,05,<Robert Petty>)
	SDAY (05,10,<Confederate Memorial Day>)
	BDAY (05,13,<Ed Donie>)
	BDAY (05,15,<Jackie Parslow>)
	BDAY (05,17,<Marcia Furtado>)
	BDAY (05,18,<Ed Crowley>)
	BDAY (05,20,<Anne Brophy>)
	BDAY (05,22,<Jim Flemming>)
	BDAY (05,27,<Joanne Gorfinkle>)
	BDAY (05,28,<Seth Cohen>)
	BDAY (05,30,<Huey B Long>)
	BDAY (05,31,<Liz Shapiro>)
	BDAY (06,03,<Mark Hovsepian & Ted Wojcik>)
	BDAY (06,13,<Cindy Labossiere>)
	BDAY (06,15,<Mike Tighe & Betty Savageau>)
	BDAY (06,18,<Doug Vickery>)
	BDAY (06,21,<Dave Russell>)
	BDAY (06,28,<Jim Totton>)
	SDAY (07,01,<Dominion Day>)
	BDAY (07,02,<Arnold Miller>)
	BDAY (07,03,<Paul Clark>)
	SDAY (07,04,<Happy Independence Day>)
	BDAY (07,06,<Bernhard Eiben>)
	BDAY (07,07,<Donee Brandt>)
	BDAY (07,08,<Robert Gottlieb>)
	BDAY (07,09,<Dennis Brannon>)
	BDAY (07,13,<Norma Abel>)
	SDAY (07,14,<Bastille Day>)
	BDAY (07,14,<Dan Deufel>)
	SDAY (07,15,<Happy St Swithin's Day>)
	BDAY (07,15,<Sara Murphy & Roland Belanger>)
	BDAY (07,16,<Sara Marsella>)
	SDAY (07,20,<Lunar Landing Day>)
	BDAY (07,22,<Walt Luse>)
	BDAY (07,30,<Sumner Blount & Dale Cook>)
	BDAY (08,01,<Dave Lyons>)
	BDAY (08,03,<Steve Meidell>)
	BDAY (08,05,<Dave Scheifler>)
	BDAY (08,06,<Larry Samberg>)
	BDAY (08,07,<Dave Wright>)
	BDAY (08,11,<Jared Aaronson>)
	BDAY (08,14,<Sue Porada>)
	BDAY (08,15,<Ruth Gillen>)
	BDAY (08,22,<Terry Decker & Dave Tolman>)
	BDAY (08,24,<Paul Bennett>)
	BDAY (08,31,<Laurie Wu>)
	BDAY (09,02,<Steve Paavola & John Hallyburton>)
	BDAY (09,05,<Laura Neff>)
	BDAY (09,07,<Helen Nayar>)
	BDAY (09,08,<Pat Hughes>)
	BDAY (09,15,<Todd Matson>)
	BDAY (09,17,<Bill Tomczak>)
	BDAY (09,19,<Paul Wexelblat>)
	BDAY (09,23,<Marta Pereira>)
	BDAY (10,02,<Dick Stephenson>)
	BDAY (10,05,<Jean Taylor & Linda Ogilvie>)
	BDAY (10,06,<Tom Eggers>)
	SDAY (10,12,<Real Columbus Day>)
	BDAY (10,13,<Dave Nixon>)
	BDAY (10,21,<Lee Busa>)
	BDAY (10,23,<Bobbin Teegarden, Bob Clements, Peter Mierswa, & Johnny Carson>)
	BDAY (10,24,<Gail Holland>)
	SDAY (10,24,<United Nations Day>)
	BDAY (10,25,<Dawn Fisher>)
	BDAY (10,27,<Twig Mckie & Evalyn McCarthy>)
	BDAY (10,29,<Steve Jenness>)
	BDAY (10,31,<John Robinson>)
	BDAY (11,01,<Dale Gunn>)
	BDAY (11,02,<Evelyn Vermouth>)
	SDAY (11,05,<Guy Fawkes Day>)
	BDAY (11,06,<Jerry Weisbach>)
	BDAY (11,09,<Alan Kotok>)
	BDAY (11,12,<Jim Delahoussaye>)
	BDAY (11,13,<Gene Leache>)
	BDAY (11,22,<Larry Portner & Joan Gregoire>)
	SDAY (11,23,<Time to update birthday list - Tell Magee>)
	BDAY (11,23,<Kathy Walsh>)
	BDAY (11,26,<Tom O'Gorman>)
	BDAY (11,27,<Ed Gauthier & Steve Pomfret>)
	BDAY (11,29,<Craig Fletcher>)
	BDAY (12,01,<Dave Bell>)
	BDAY (12,04,<Cliff Romash>)
	BDAY (12,13,<Bill Hardy>)
	BDAY (12,14,<Tony Wachs & Steve Sullivan>)
	BDAY (12,16,<L Beethoven>)
	BDAY (12,21,<Mary Helen Modeen>)
	SDAY (12,24,<Last shopping day before Christmas>)
	SDAY (12,25,<Merry Christmas>)
	SDAY (12,26,<Boxing Day>)
	BDAY (12,26,<Art Zina>)
	BDAY (12,29,<Lou Cohen>)
	SDAY (12,31,<Drive carefully tonight>)

HAKLEN==.-HAKTAB
	RADIX 8
>
	LIST

;CONSTANTS FOR GETTAB UUO

XTIME:	XWD	10,11
XPDBPT:	XWD	45,11		;POINTER TO JBTPDB
XDATE:	XWD	11,11
XSEGPT:	XWD	15,11
XUPTIM:	XWD	15,12
XDVLST:	XWD	14,11
XCORMX:	XWD	10,12
XSYSSZ:	XWD	12,11
XMEMSZ:	XWD	23,12
XSTATS:	XWD	17,11
XLSTIM:	XWD	22,12
XK4SWP:	XWD	1,15
XSPPN:	XWD	1,16
XTTY:	XWD	-1,10
XSHF:	XWD	16,12
XZCOR:	XWD	21,12
XSRSP:	XWD	42,12		;INDEX OF SYSRSP
XRNUM:	XWD	43,12		;INDEX OF NUMRSP
XMEMNS:	XWD	21,11
XOPR:	XWD	13,11
XSYSST:	XWD	6,16	;SYSTEM STR LIST
XSYSUN:	XWD	7,16
XSWPER:	XWD	5,13
XSWPUN:	XWD	10,16
XSYSTP:	XWD	7,11	;NAME OF SYSTEM TAPE ("SYS:")
XFSFPP:	XWD	2,16	;OPERATOR (FAILSAFE) NUMBER
XPTYCN:	XWD	22,11	;CONFIGURATION FOR PTYS
XAPRSN:	XWD	20,11	;APR SERIAL NUMBER
XSYKTM:	XWD	35,12	;SYSTEM KILL TIME
XGTTBI:	XWD	23,23	;GETTAB IMMEDIATE
XDSCTB:	XWD	35,11	;DSC TAB POINTER
XPCMA:	XWD	2,44	;PC AND MA ON CRASH (SWITCHES)
XPIIP:	XWD	1,44	;PI SYSTEM ON CRASH
XAPRCN:	XWD	0,44	;APR CONI ON A CRASH
XLGMAX:	XWD	50,11	;LOGMAX
XDDBLD:	XWD	75,11	;VALUE OF DDBLDB

MONTAB:	ASCII /-Jan-/
	ASCII /-Feb-/
	ASCII /-Mar-/
	ASCII /-Apr-/
	ASCII /-May-/
	ASCII /-Jun-/
	ASCII /-Jul-/
	ASCII /-Aug-/
	ASCII /-Sep-/
	ASCII /-Oct-/
	ASCII /-Nov-/
	ASCII /-Dec-/

;TABLE OF STOPCD CODES INDEXED BY VALUE

STOPT:	[ASCIZ /HALT/]
	[ASCIZ /STOP/]
	[ASCIZ /JOB/]
	[ASCIZ /DEBUG/]
	[ASCIZ/CPU/]
TABPTR:	XWD	SIGN+0,.STS
	XWD	SIGN+1,.ADR
	XWD	SIGN+7,.SWP
	XWD	SIGN+2,.PPN
	XWD	     4,.TIM
	XWD	    14,.SGN
	XWD	SIGN+3,.PRG
	XWD	SIGN+24,.DEV
	XWD	5,.KCT		;TABLE 5,kilo core ticks
	XWD	37,.RTD
	XWD	.GTNM1,.USNM1
	XWD	.GTNM2,.USNM2
NTAB==.-TABPTR
	XWD	     0,.SEGCT


;MORE MONITOR INTERFACE

PJOBN:	POINT 7,C,6
NPJOBN:	Z		;NEW STYLE JOB POINTER
NEWSPY:	Z			;FOR LOAD 722 AND SUBSEQUENT 
.DVJOB:	D,,DV.JOB
.DVFIL:	D,,DV.FIL		;TO GET FILE NAMES
.DVEXT:	D,,DV.EXT		;TO GET FILE EXTENSIONS
.DVPPN:	D,,DV.PPN		;TO GET PPN
.DVUNI:	D,,DV.UNI		;TO GET UDB ADDRESS
TPCJOB:	POINT 8,B,10
IMGOUT:	POINT 8,@.SWP,26
DSKLEV:	POINT	3,STATES,9
HPQPNT:	POINT	4,A,9

;CRASH-FILE NAME DATA
; WANT TO BE ABLE TO ASK FOR "FILE" IF CAN'T FIND
; "CRASH.XPN", BUT FOR NOW CAN DEPOSIT OTHER FILE NAME HERE.
; (NOTE: ERRORS STILL SAY "CRASH.XPN")

CRASH:	SIXBIT /CRASH/
CRSEXT:	SIXBIT /XPN/
CRSPPN:	1,,4

RSPMSG:	[ASCIZ /    'til TTY output:	/]
RSPMS2:	[ASCIZ /    'til TTY input:	/]
RSPMS3:	[ASCIZ /    'til requeued:	/]
RSPMS4:	[ASCIZ /    'til 1st of above:	/]

IFN FTDEBUG,<
PAT:
PATCH:
FOO:	BLOCK	50		;PATCH AREA
>
IFE FTDEBUG,<
	XLIST		;ONLY LIST LITERALS IF IN DEBUG MODE
>
	LIT
	LIST

PDP:	IOWD	LN.PDL,PDL	;POINTER TO PUSH DOWN LIST
;TEMPORARIES

	IFN	PURESW,<
HIGH:	RELOC
LOW:	RELOC
	PHASE	LOW>

DSKIOW:	IOWD	LN.BUF,0	;IOWD FOR READING CRASH FILE, ADDR FILLED IN
	0			;END OF LIST

QTAB:	SIXBIT /RNWSTS/
	SIXBIT /STAUMQ/
	SIXBIT /DADTDC/
	SIXBIT /MTIOTT/
	SIXBIT /SLNL^C/
	SIXBIT /AABBCC/
	SIXBIT /DDEEFF/
	SIXBIT /GGHHII/
	SIXBIT /JJKKLL/
	SIXBIT /MMNNOO/
	SIXBIT /PPQQRR/
LQTAB==QTAB-.

.DVIOS:	XWD	J,0	;L
.TTY:	XWD	J,0	;L
.TTYN:	XWD	J,0	;L	TTY LINE NUMBERS
.STS:	XWD	J,0	;L+H
.ADR:	XWD	J,0	;L+H
.SWP:	XWD	J,0	;L+H
.PPN:	XWD	J,0	;L+H
.TIM:	XWD	J,0	;L
.SGN:	XWD	J,0	;L
.PRG:	XWD	J,0	;L+H
.DEV:	XWD	J,0	;L+H
.KCT:	XWD	J,0	;L
.RTD:	XWD	J,0	;L
.SEGCT:	XWD	A,0	;H
.USNM1:	XWD	J,0	;L
.USNM2:	XWD	J,0	;L
TCKSEC:	JIFSEC			;JIFFIES PER SECOND
SYSPPN:	XWD	1,1		;PPN OF SYS:
MEMNSP:	NSPMEM			;CORE SPEED
LASSPY:	EXP	0		;LAST PAGE GOTTEN IN SPYPAG
GETBLK:	EXP	1		;PAGE. BLOCK TO PAGE IN PAGE
	XWD	0,FSP
DELBLK:	EXP	1		;PAGE. BLOCK TO PAGE OUT PAGE
	PA.GAF!FSP

ORGPTR:	POINT 7,CMDBUF		;[200] ORIGIONAL COMMAND BUFFER POINTER

	IFN	PURESW,<
ZZZ==.-LOW
	RELOC
LOW:	BLOCK	ZZZ>

CBSIZE==^D14		;[214] SIZE <WORDS> OF COMMAND BUFFER
GOTCMD:	BLOCK	1	;[221] COMMAND GOTTEN FLAG (MOVED)
CMDBUF:	BLOCK	CBSIZE+1	;[200] - [214] COMMAND BUFFER
CMDPTR:	BLOCK	1	;[200] CURRENT COMMAND POINTER (MOVED)
CDENDP==CMDBUF+CBSIZE+1	;[221] END OF COMMAND BUFFER AREA
			;[221]  REDEFINED BECUZ OF MOVED STUFF

LOWEND:				;START OF ZEROED AREA

PDL:	BLOCK	LN.PDL+1	;PUSH-DOWN LIST

COMTOA:	BLOCK	1		;ADDRESS OF SPECIAL TYPEOUT ROUTINE
NCPCNF:	BLOCK	1		;NUMBER OF CPUS IN THE CONFIGURATION
CPNUPT:	BLOCK	NCPUS
CPNNUL:	BLOCK	NCPUS
CPNLST:	BLOCK	NCPUS
CPNOHT:	BLOCK	NCPUS
TEMP:	BLOCK	1
IFG NCPUS-2,<
	BLOCK	NCPUS-2
>
TEMP1:	BLOCK	1

TYOB:	BLOCK	3	;LISTING DEVICE OUTPUT BUFFER POINTERS

FLP:	BLOCK 6		;[203] FILOP. ARGUMENT BLOCK
LKB:	BLOCK 10	;[203] EXTENDED LOOKUP BLOCK

SEGPTR:	BLOCK	1	;LH=-# SEGS, RH=# JOBS
JOBN:	BLOCK	1	;NUMBER OF JOBS IN SYSTEM
SEGN:	BLOCK	1	;NUMBER OF SEGMENTS IN SYSTEM
BOTH:	BLOCK	1	;JOBN + SEGN

CORMAX:	BLOCK	1	;SIZE OF USER CORE
CORUSE:	BLOCK	1	;VIRTUAL CORE USED
DSKUSE:	BLOCK	1	;SWAPPING SPACE USED
ACTUSE:	BLOCK	1	;ACTIVE VIRTUAL CORE USED
LOWUSE:	BLOCK	1	;TOTAL VIRTUAL CORE IN LOW SEGMENTS

FREE:	BLOCK	1	;TEMPORARY .JBFF
ZERLOW:	BLOCK	1	;FIRST ADDRESS OF DYNAMIC TABLES
ZERHGH:	BLOCK	1	;LAST ADDRESS OF DYNAMIC TABLES

JOBTTY:	BLOCK	1	;NAME OF CURRENT JOB'S TTY
DATE:	BLOCK	1	;TODAY'S DATE
STATES:	BLOCK	1	;SYSTEM STATES WORD
FSDCNT:	BLOCK	1	;JOB OR LOOP NUMBER/COUNT IN SYS B CODE
.UPLST:	BLOCK	1	;ADDRESS OF PTR TO OUR DSK DDB'S
.CPTOS:	BLOCK	1	;PAGE NUMBER OF CPU0 EPT-220 TO MAKE CALCULATIONS
			;IN DSKA WORK FOR EPT MAPPING AS WELL AS UPMP
ME:	BLOCK	1	;MY PPN
OPR:	BLOCK	1	;NAME OF "OPR" DEVICE
MYJOB:	BLOCK	1	;MY JOB NUMBER
CORSAV:	BLOCK	1	;VIRTUAL CORE SAVED BY SHARING
ONCE:	BLOCK	1	;-1 FIRST TIME THROUGH
TNFRTY:	BLOCK	1	;1 IF 10/40N (NO LOGIN)
SYSTAP:	BLOCK	1	;NAME OF SYSTEM TAPE ("SYS:"), 0=DSK:
FSFPPN:	BLOCK	1	;OPERATOR NUMBER
CTYLIN:	BLOCK	1	;LINE NUMBER OF CTY
PTYOFS:	BLOCK	1	;NUMBER OF FIRST TTY DRIVEN BY PTY
PTYMAX:	BLOCK	1	;NUMBER OF LAST+1 TTY DRIVEN BY PTY
		.UPSAF==1B4	;BIT FLAGGING S/A
		.UPNNA==1B10	;BIT FLAGGING NNA
CURFS:	BLOCK	1	;CURRENT FILESTRUCTURE
iocnt:	block	1	;# of reads and writes for unit
UNIBLK:	BLOCK	1
SYSUNI:	BLOCK	1
SWPUNI:	BLOCK	1
DSKBLK:	BLOCK	1		;DSKCHR UUO BLOCK
DSKDDB:	BLOCK	1	;COUNT OF DISK DDB'S
LOGNAM:	BLOCK	1	;LOGICAL NAME OF THIS DEVICE
NOW:	BLOCK	1	;CURRENT TIME
SPYFLG:	BLOCK	1	;-1 IF SPYING
MAXGTB:	BLOCK	1	;LARGEST GETTAB TABLE #
OFSGTB:	BLOCK	1	;START OF GETTAB TABLE POINTERS
PTYS:	BLOCK	1	;COUNT OF PTY DRIVEN JOBS
ONEJOB:	BLOCK	1	;NUMBER OF JOB IF SINGLE
ONEPPN:	BLOCK	1	;NUMBER OF PPN IF SINGLE
ONETTY:	BLOCK	1	;NUMBER OF TTY IF SINGLE
SAVCHR:	BLOCK	1	;CHARACTER TO RESCAN IF ANY
SEGFLG:	BLOCK	1	;-1 IF SEGMENT PRINTING
DSKFLG:	BLOCK	1	;FLAG (AND MAX SIZE) OF DISK INPUT FILE
DCACHE:	BLOCK	NBCSHE	;INCORE CACHE FOR CRASH FILE
EXEDIR:	BLOCK	LN.BUF	;SPACE FOR EXE DIRECTORY
LASBP1:	BLOCK	1	;VALUE OF LAST DSKBP1 CALL
LASBPA:	BLOCK	1	;ARGUMENT OF LAST DSKBP1 CALL
MONVER:	BLOCK	1	;MONITOR VERSION GETTAB (0 BEFORE 503)
OLDNUL:	BLOCK	NCPUS	;PREVIOUS NULL TIME IN JIFFIES
OLDLOS:	BLOCK	NCPUS	;PREVIOUS LOST TIME IN JIFFIES
OLDOHT:	BLOCK	NCPUS	;PREVIOUS OVERHEAD TIME IN JIFFIES
OLDZRO:	BLOCK	1
OLDSFL:	BLOCK	1
OLDNUM:	BLOCK	1	;PREVIOUS NUMBER OF SYSTEM RESPONSES(OLD RSP CODE)
TOTKCT:	BLOCK	1	;TOTAL KC TICKS THIS PASS
LOGDIN:	BLOCK	1	;JOBS LOGGED IN
DIFTIM:	BLOCK	NCPUS	;DIFFERENTIAL UPTIME FOR THIS PASS
LINECT:	BLOCK	1	;LINES PER PAGE FOR DISPLAY USERS
JOBTIM:	BLOCK	^D512	;RUN TIM FOR EACH JOB NUMBER
OLDPPN:	BLOCK	^D512	;OLD PPN FOR EACH JOB NUMBER
JOBKCT:	BLOCK	^D512	;KILO CORE TICKS FOR EACH JOB
TISL:	BLOCK	1	;WAIT STATE CODES FOR TI AND SL
NUMJOB:	BLOCK	1	;NUMBER OF ACTIVE JOBS
REMSNO:	BLOCK	1	;CURRENT REMOTE STATION NUMBER
PDBPTR:	BLOCK	1	;ADDRESS OF JBTPDB FOR PEEKING
JOBINT:	BLOCK	4	;INTERRUPT BLOCK FOR INTERRUPTING ^C
CPU:	BLOCK	1	;TEMP FOR GETRSP
DOALT:	BLOCK	1	;FLAG FOR ALTERNATE PATH TYPE
MAIND:	BLOCK	1	;SAVE LOCATION FOR UDB OF MAIN
CPKI10:	BLOCK	1	;IF KI10 AND MONITOR.GT.50510 THEN -1 ELSE 0
INDEV:	BLOCK	1
INFILE:	BLOCK	1
INEXT:	BLOCK	1
INPPN:	BLOCK	1
INPTH:	BLOCK	.PTMAX
RSPCNT:	BLOCK	1	;COUNTER FOR GENRSP CODE
RSPIDX:	BLOCK	1	;INDEX INTO OLDRSP & DIFRSP
RSPIX1:	BLOCK	1	;TEMP FOR GETRSP
OLDRSP:	BLOCK	NCPUS*4*4	;4 DIFFERENT TYPES OF RESPONSE*4
DIFRSP:	BLOCK	NCPUS*4*4	; ENTRIES PER TYPE* # OF CPU'S
TEMEND==.-1		;END OF ZEROED AREA
	END	SYSTAT