Google
 

Trailing-Edge - PDP-10 Archives - bb-x130a-sb - ddb4.mac
There is 1 other file named ddb4.mac in the archive. Click here to see a list.
SUBTTL	INITILIZATION  REX SHADRICK/DVB/DRB/RWS  3-JUL-77


; THIS ROUTINE IS SET UP TO SCAN 507/601, 602 OR 603 DISK DDB
; CHAINS AND OUTPUT SOME USEFUL INFORMATION.  THIS ROUTINE IS
; SET UP TO DRIVE AN ASR33, MINIBEE, HAZELTINE 2000, HAZELTINE
; MODULAR-ONE, LSI ADM-1, LSI ADM-3, DEC VT05B, DEC VT50, DEC
; VT52 OR DEC VT61 TERMINAL.
;
; IF YOU HAVE ANY QUESTIONS, SUGGESTIONS OR COMMENTS CONTACT:
;
;		REX SHADRICK			(303)666-6581
;		INFORMATION SERVICES DIVISION
;		STORAGE TECHNOLOGY CORPORATION
;		2270 SOUTH 88TH STREET
;		LOUISVILLE  CO  80027


;SEARCH SOME UNIVERSAL FILES

	SEARCH	MACTEN	;DEC'S UNIVERSAL MACRO FILE
	SEARCH	UUOSYM	;DEC'S UNIVERSAL UUO SYMBOL FILE

	SALL		;TURN OFF THE MACRO EXPANSION


DDB.VN==600,,230

	LOC	137

.JBVER:	DDB.VN		;STORE THE VERSION NUMBER

	RELOC
SUBTTL	THE TABLE OF CONTENTS


;				SECTION				    PAGE
;
;   1.   THE REVISION HISTORY ......................................   5
;
;   2.   SUGGESTIONS FOR FUTURE IMPLEMENTATION .....................   8
;
;   3.   CONDITIONAL DEFINITIONS ...................................  10
;   3.1    CONDITIONAL ASSEMBLY DEFINITIONS ........................  10
;   3.2    CONDITIONAL VALUE DEFINITIONS ...........................  10
;
;   4.   CONSTANT DEFINITIONS ......................................  11
;   4.1    DEFINE THE AC'S USED AND THERE USAGE ....................  11
;   4.2    DEFINE THE I/O CHANNELS .................................  11
;   4.3    DEFINE THE FLAGS AND THERE USAGE ........................  12
;   4.4    DEFINE SOME MONITOR STATUS BITS .........................  13
;   4.5    DEFINE THE TYPES OF DISPLAYS SUPPORTED ..................  14
;
;   5.   MACRO DEFINITIONS .........................................  16
;   5.1    DEFINE THE .MNVAL MACRO - MONITOR TABLE VALUES ..........  16
;   5.2    DEFINE THE .TITLE MACRO - PROGRAM TITLE .................  19
;   5.3    DEFINE THE .SBTTX MACRO - THE SUBTITLE TEXT .............  19
;   5.4    DEFINE THE .PTHTX MACRO - THE PATH SUBTITLE TEXT ........  19
;   5.5    DEFINE THE .DSPTB MACRO - THE DISPLAY TABLE .............  19
;   5.6    DEFINE THE .HLPTX MACRO - THE HELP TEXT .................  20
;
;   6.   PROGRAM INITALIZATION .....................................  21
;
;   7.   THE DDB SCANNING LOOP .....................................  26
;
;   8.   MAKE THE HEADER LINE AND OUTPUT THE BUFFER ................  31
;
;   9.   THE COMMAND SCANNER .......................................  34
;   9.1    CMDWAT - GET A COMMAND FROM THE TERMINAL ................  34
;   9.2    CMDTST - GET AND TEST A COMMAND .........................  34
;   9.3    CMDERR - COMMAND ERROR ..................................  34
;   9.4    THE COMMAND DISPATCH TABLE ..............................  35
;   9.5    "-" COMMAND - DECREMENT THE DISPLAY BY ONE PAGE .........  36
;   9.6    "+" COMMAND - ADVANCE THE DISPLAY BY ONE PAGE ...........  36
;   9.7    "G" COMMAND - COMPLEMENT THE 'GOD' BIT ..................  36
;   9.8    "^C" OR "^Z" COMMAND - ABORT THE PROGRAM ................  36
;   9.9    "W" COMMAND - COMPLEMENT THE 'WHAT' BIT .................  36
;
;	** THE TABLE OF CONTENTS IS CONTINUED ON THE NEXT PAGE **
;				SECTION				    PAGE
;
;   9.10   "N" COMMAND - CHANGE THE LOGGED IN PPN TO NOT DISPLAY ...  37
;   9.11   "L" COMMAND - CHANGE THE LOGGED IN PPN TO DISPLAY .......  37
;   9.12   "F" COMMAND - CHANGE THE FILE SPEC. TO DISPLAY ..........  37
;   9.13   "J" COMMAND - CHANGE THE JOB TO DISPLAY .................  38
;   9.14   "A" COMMAND - CHANGE THE DISPLAY TO ALL DDBS ............  38
;   9.15   "H" COMMAND - THE HELP TEXT DISPLAY .....................  38
;   9.16   "K" COMMAND - KILL THE DISPLAY AND KJOB THE JOB .........  38
;   9.17   "S" COMMAND - CHANGE THE SLEEP TIME BETWEEN UPDATES .....  39
;   9.18   "$" COMMAND - UPDATE THE SCREEN THEN WAIT ...............  39
;   9.19   "D" COMMAND - CHANGE THE TYPE OF DISPLAY TO BE USED .....  39
;   9.20   "P" COMMAND - COMPLEMENT THE OUTPUT OF THE PATH BIT .....  40
;   9.21   "T" COMMAND - COMPLEMENT THE OUTPUT OF THE TITLE BIT ....  40
;   9.22   CMDFIN - SLEEP BETWEEN DDB SCANS ........................  40
;   9.23   COMNOW - DO A DDB RESCAN NOW ............................  40
;
;  10.   SUBROUTINE TO INPUT A FILE SPECIFICATION ..................  41
;
;  11.   THE INPUT SUBROUTINES .....................................  44
;  11.1    OCTIN, DECIN AND RDXIN - INPUT A NUMBER .................  44
;  11.2    WLDOCT - INPUT A WILD OCTAL NUMBER ......................  44
;  11.3    WLDSIX - INPUT A WILD SIXBIT WORD .......................  45
;
;  12.   THE OUTPUT SUBROUTINES ....................................  46
;  12.1    PPNOUT AND PPNJST - OUTPUT A PPN ........................  46
;  12.2    OCTOUT AND DECOUT - OUTPUT A NUMBER .....................  46
;  12.3    OCTJST, DECJST AND RDXJST - OUTPUT A NUMBER .............  46
;  12.4    CHROUT - OUTPUT A CHARACTER .............................  46
;  12.5    JUST - JUSTIFY TO A COLUMN ..............................  47
;  12.6    ASCOUT - OUTPUT AN ASCIZ STRING .........................  47
;  12.7    SIXOUT - OUTPUT A SIXBIT WORD ...........................  47
;  12.8    BEGLIN - SET UP A LINE TO CONTAIN DDB INFO ..............  47
;  12.9    ENDLIN - FINISH OFF AN OUTPUT LINE RIGHT ................  47
;  12.10   COMOUT - OUTPUT A COMMA .................................  48
;  12.11   CLNOUT - OUTPUT A COLON .................................  48
;  12.12   SLHOUT - OUTPUT A SLASH .................................  48
;  12.13   SPAOUT - OUTPUT A SPACE .................................  48
;  12.14   HGHOUT AND LOWOUT - OUTPUT THE SEGMENT SIZE .............  48
;  12.15   TIMOUT - OUTPUT A TIME VALUE ............................  49
;  12.16   TWOOUT - OUTPUT A TWO DIGIT NUMBER ......................  49
;  12.17   SIXJST - JUSTIFY TO COLUMN AND OUTPUT A SIXBIT WORD .....  49
;  12.18   JOBOUT - OUTPUT A JOBS STATUS ...........................  50
;  12.19   CMDOUT - BUILD THE COMMAND STRING BUFFER ................  58
;  12.20   SPCOUT - OUTPUT A FILE SPECIFICATION ....................  60
;  12.21   WPPOUT - OUTPUT A WILD PPN ..............................  60
;  12.22   WOCOUT - OUTPUT A WILD OCTAL NUMBER .....................  60
;
;	** THE TABLE OF CONTENTS IS CONTINUED ON THE NEXT PAGE **
;				SECTION				    PAGE
;
;  13.   VARIOUS USEFUL SUBROUTINES ................................  61
;  13.1    TSTABR - TEST A SIXBIT WORD FOR AN ABBBREVIATED NAME ....  61
;  13.2    TRMDSP - GET THE DEFAULT DISPLAY TYPE ...................  62
;  13.3    SETDSP - SET UP THE DISPLAY (SIZE AND TYPE) .............  64
;  13.4    SYSIN - GET A CHARACTER FOR 'SYS:DISPLA.INI' ............  64
;  13.5    ADJTIM - CONTVERT FROM NEW DATE/TIME FORMAT TO JIFFIES ..  64
;  13.6    PAGADJ - SET UP THE PAGE BOUNDARIES FOR OUTPUT ..........  65
;  13.7    SIXOCT - CONVERT SIXBIT TO OCTAL ........................  65
;  13.8    RSTTRM - RESTORE THE TERMINAL CHARACTERISTICS ...........  65
;  13.9    CLRLIN - CLEAR THE INPUT COMMAND LINE ...................  66
;  13.10   TSTEOL - TEST A CHARACTER FOR AN E-O-L CHARACTER ........  66
;
;  14.   THE DDB SCANNING SUBROUTINES ..............................  67
;  14.1    NXTDDB - GET THE NEXT DDB IN THE CHAIN ..................  67
;  14.2    FNDSTR - FIND A STRUCTURE ...............................  67
;  14.3    TSTNOT - SEE IF THIS DDB FITS THE "N" COMMAND ...........  68
;  14.4    TSTLOG - SEE IF THIS DDB FITS THE "L" COMMAND ...........  68
;  14.5    TSTFIL - SEE IF THIS DDB FITS THE "F" COMMAND ...........  68
;  14.6    TSTJOB - SEE IF THIS DDB FITS THE "J" COMMAND ...........  68
;
;  15.   THE DISPLAY ROUTINES ......................................  69
;  15.1    TRMCLR - CLEAR THE DISPLAY SCREEN .......................  69
;  15.2    TRMEOS - CLEAR TO THE END OF THE SCREEN .................  70
;  15.3    TRMEOL - CLEAR TO THE END OF THE LINE ...................  71
;  15.4    TRMHOM - HOME THE TERMINAL ..............................  72
;
;  16.   THE ERROR ROUTINES ........................................  73
;
;  17.   THE DATA AND STORAGE AREA .................................  74
SUBTTL	THE REVISION HISTORY


; EDIT	  DATE			COMMENT
;
;  ***	27-MAY-75  CHANGE THE MAJOR VERSION NUMBER FROM 4 TO 5
;
;  134	27-MAY-75  ADD SUPPORT FOR THE HAZELTINE-2000, DEC VT05B, LSI
;		   ADM-1 AND DEC VT50 TERMINALS
;
;  135	28-MAY-75  REPLACE THE MACRO '.TTYDP' WITH THE FILE
;		   'SYS:DDBDPY.INI'
;
;  136  29-MAY-75  ADD THE OPTION TO CHANGE THE DISPLAY BACK TO THE
;		   DEFAULT DISPLAY FOR THIS TERMINAL
;
;  137  29-MAY-75  LIST SPOOLED DEVICE DDBS
;
;  140   4-JUN-75  CHANGE THE TITLE LINE AND REMOVE THE "I" COMMAND
;
;  141   4-JUN-75  ADD SUPPORT FOR THE 602 MONITOR
;
;  142	 4-JUN-75  CHANGE THE OUTPUT UNDER THE 'OTH' COLUMN
;
;  143   4-JUN-75  MORE OF EDIT 141
;
;  144	 6-JUN-75  IMPROVE THE CONTROL-C (^C) INTERCEPT ROUTINE AND
;		   REMOVE THE "L" AND "T" COMMANDS
;
;  145	 6-JUN-75  MORE OF EDIT 135
;
;  146	19-SEP-75  DISPLAY THE ENTERED SPOOLED NAME (602), ALLOW "J"
;		   COMMAND IF NOT [1,2] (BUT ONLY LOOK AT THE JOB IF
;		   LOGGED IN UNDER THE SAME PROGRAMMER NUMBER) AND
;		   CHANGE THE "P" COMMAND TO THE "L" COMMAND
;
;  147	20-OCT-75  ADD THE "K" COMMAND WHICH KILL'S THE DISPLAY AND
;		   LOGOUT'S THE JOB
;
;  150  23-OCT-75  ADD A DEBUGGING AID
;
;  151   4-NOV-75  ADD SUPPORT TO DISPLAY THE ENTIRE PATH OF THE FILE
;		   BEING DISPLAYED AND ADD "P" COMMAND TO DISPLAY THIS
;		   INFORMATION
;
;  152   5-NOV-75  REWRITE SUBROUTINES 'SCAN' AND 'TSTFIL'
;
;  153   7-NOV-75  ADD SOME SMALL GOODIES AND FIX SOME MINOR BUGS
;
;  154   7-NOV-75  REWRITE SUBROUTINE 'FNDSTR' AND DISPLAY THE MOUNT
;		   COUNT
;
;	** THE REVISION HISTORY IS CONTINUED ON THE NEXT PAGE **
; EDIT	  DATE			COMMENT
;
;  155  10-NOV-75  DISPLAY THE CURRENT COMMAND STRING BEING PROCESSED
;
;  156  10-NOV-75  ALLOW A SPACE BETWEEN COMMANDS
;
;  157  18-NOV-75  MAKE THE "K" COMMAND RESTORE THE LINE CHARACTERISTICS
;		   BEFORE THE RUN UUO IS EXECUTED
;
;  160   5-DEC-75  CHANGE THE "J" COMMAND TO DISPLAY MORE INFORMATION
;		   ABOUT THE JOB
;
;  161  10-DEC-75  MORE OF EDIT 160
;
;  162  10-DEC-75  REMOVE 506 SUPPORT (TOO MANY QUESTIONABLE SYMBOLS)
;		   AND DON'T ALLOW SUBJOBS TO RUN DDBDPY
;
;  163  12-DEC-75  ADD DEC VT52 SUPPORT AND DON'T ALLOW THE TITLE
;		   BUFFER TO OVERFLOW
;
;  164  18-DEC-75  REPLACE THE ALLOCATED LENGTH BY THE UNIT STATUS
;		   (I.E. IDLE, SEEK, SEEK WAIT, POSITION, ...) AND
;		   THE LOOKUP COUNT
;
;  165  23-DEC-75  REENABLE THE OLD "T" COMMAND  (COMPLEMENT THE OUTPUT
;		   OF THE TITLE LINE), GET THE JIFFIES PER SECOND FROM
;		   THE MONITOR AND DO ONE UPDATE AND PAUSE ON AN ESCAPE
;
;  166  21-JAN-76  MORE OF EDIT 165 - TIMOUT WAS OUTPUTTING THE PARTS
;		   OF A SECOND INCORRECTLY
;
;  167  25-JAN-76  CORRECT THE CORE SIZE OF A JOB ON A VM MONITOR
;
;  170  19-MAR-76  PUT THE ALLOCATED LENGTH BACK AND FIX THE SIX
;		   DIGIT PPN PROBLEM
;
;  171  24-MAR-76  UNDER THE 'OTH' COLUMN OUTPUT AN 'I' FOR INPUT WAIT
;		   OR AN 'O' FOR OUTPUT WAIT AND CLEAR THE TERMINAL
;		   INPUT BUFFER ON A 'K' COMMAND
;
;  172  26-MAR-76  FIX THE HAZELTINE CLEAR TO THE END-OF-SCREEN ROUTINE
;
;  173   5-APR-76  CHANGE THE SLEEP TIME AFTER 10 SCANS
;
;  174  21-APR-76  MOVE OF EDIT 173
;
;  175  28-APR-76  ALLOW LOWER CASE COMMANDS
;
;  176   4-MAY-76  ADD SUPPORT FOR THE HAZELTINE "MODULAR ONE"
;
;  177  17-MAY-76  SEARCH MACTEN AND UUOSYM INSTEAD OF C
;
;  200  28-JUN-76  ALLOW A TAB AS A BREAK CHARACTER BETWEEN COMMANDS
;
;	** THE REVISION HISTORY IS CONTINUED ON THE NEXT PAGE **
; EDIT	  DATE			COMMENT
;
;  201  28-JUN-76  ADD THE RESCAN CODE
;
;  202  11-AUG-76  DO A LITTLE MORE CODE CLEAN UP
;
;  203   1-SEP-76  ALLOW ONLY PRIVILEGED USERS TO RUN DDBDPY AND MORE
;		   OF EDIT 201
;
;  204  15-OCT-76  ADD SUPPORT FOR THE 603 MONITOR, ADD SUPPORT FOR
;		   THE LSI ADM-3 AND DEC VT61 TERMINALS, AND IMPROVE
;		   EDIT 173
;
;  205  26-OCT-76  IMPROVE THE DDB TO OUTPUT CODE
;
;  206  30-NOV-76  CHANGE THE DEFAULT PPN SPECIFICATION FOR THE
;		   F, J AND L COMMANDS:
;			[OPR]	->  [*,*]
;		      [NON-OPR] -> [*,PRG]
;
;  207  22-FEB-77  DON'T CLEAR THE TERMINAL INPUT BUFFER ON A "^Z"
;		   OR "^C" AND CLEAR TO THE END OF THE COMMAND LINE
;		   ON "K" COMMAND
;
;  210  22-FEB-77  MORE OF EDIT 204 (603 MONITOR SUPPORT)
;
;  211  23-FEB-77  CHANGE THE FILE SPECIFICATION FOR THE 'INI' FILE,
;		   'SYS:DDBDPY.INI' -> 'SYS:DISPLA.INI'
;
;  212  10-MAR-77  ALLOW DDBDPY TO RUN AS A SUBJOB, BUT NOT A BATCH
;		   OR MIC SUBJOB.
;
;  213  14-MAR-77  ADD A LITTLE 2741 SUPPORT, ALLOW "<" AND ">" AROUND
;		   THE PPN SPECIFICATION
;
;  214   6-MAY-77  OUTPUT AN 'S' IF THE STRUCTURE IS MOUNTED SINGLE
;		   ACCESS, IN THE HEADER, AND CHANGE 'RD' TO 'RED' AND
;		   'WT' TO 'WRT', IN THE JOB DISPLAY
;
;  215   6-MAY-77  PUT IN A CHECK FOR A NULL STRUCTURE NAME
;
;  216  13-MAY-77  ADD A THIRD LINE TO THE JOB DISPLAY
;
;  217  18-MAY-77  CHANGE LSI AND LSI3 TO ADM1 AND ADM3 RESPECTIVELY,
;		   TO BE CONSISTENT WITH TECO %124
;
;  220  19-MAY-77  FIX A BUG IN THE PATH MODE OUTPUT
;
;  221  20-MAY-77  OUTPUT THE USER'S ACTIVE SEARCH LIST ON A 'J' COMMAND
;
;  222  20-MAY-77  ADD SUPPORT FOR THE NODE/LINE CONVENSION IN
;		   'DISPLA.INI'
;
;	** THE REVISION HISTORY IS CONTINUED ON THE NEXT PAGE **
; EDIT	  DATE			COMMENT
;
;  223  24-MAY-77  ON THE JOB DISPLAY OUTPUT EVENT WAIT CODES:
;			TK - (1) TAPE KONTROLLER WAIT
;			TR - (2) TAPE REWIND WAIT
;			LP - (3) LABEL PROCESSING WAIT
;			NW - (4) NETWORK WAIT
;			IP - (5) IPCF SYSTEM PROCESS RECEIVE WAIT
;			FI - (6) FRONT END DEVICE INPUT WAIT
;			FO - (7) FRONT END DEVICE OUTPUT WAIT
;			D6 - (10) DAS60 DEVICE WAIT
;
;  224  26-MAY-77  ON THE JOB DISPLAY OUTPUT THE SMALLER OF THE TWO,
;		   FREE ON THE STRUCTURE OR LOGIN QUOTA
;
;  225   2-JUN-77  ON START-UP ALWAYS RESET THE SLEEP TIME AFTER 10
;		   SCANS
;
;  226   2-JUL-77  SEARCH STCMAC TO GET THE $VRSN AND $TITLE MACROS
;
;  227   3-JUL-77  ADD THE "N" COMMAND, DISPLAY JOBS NOT LOGGED-IN
;		   UNDER THIS PPN, THE DEFAULT PPN IS THE USER'S
;
;  ***   3-JUL-77  CHANGE THE MAJOR VERSION NUMBER FROM 5 TO 6
SUBTTL	SUGGESTIONS FOR FUTURE IMPLEMENTATION


;    DATE			SUGGESTION
;
;  27-MAY-75  OUTPUT THE DDBS IN ORDER OF OLDEST TO NEWEST
;
;  10-DEC-75  ADD SPLIT SCREEN SUPPORT (THE UPPER HALF IS FOR DDBDPY
;	      AND THE LOWER HALF IS FOR AN INTERACTIVE SUBJOB)
;
;  24-MAR-76  OUTPUT DDBS THAT ARE DOING SUPER-MODE I/O
;
;  28-APR-76  ON VT50, VT52 AND VT61 TERMINALS CLEAR TO THE E-O-L
;	      INSTEAD OF CLEARING THE LINE THEN TYPING THE DATA
;
;  22-FEB-77  ADD SUPPORT TO SCAN 'SWITCH.INI'
;
;  22-FEB-77  ADD SUPPORT FOR ERSATZ DEVICES
SUBTTL	CONDITIONAL DEFINITIONS


;DEFINE SOME CONDITIONAL ASSEMBLY VALUES

	ND	FTESCAPE,-1	;NON-ZERO TO UPDATE THE SCREEN THEN PAUSE
	ND	FTRESCAN,-1	;NON-ZERO TO SUPPORT RESCAN FEATURE
	ND	FTMOUNT,-1	;NON-ZERO TO DISPLAY THE MOUNT COUNT
	ND	FTTITLE,-1	;NON-ZERO TO ALLOW COMPLEMENT OF THE TITLE
	ND	FTSLEEP,-1	;NON-ZERO TO ADJUST THE SLEEP TIME
	ND	FTSPACE,-1	;NON-ZERO TO ALLOW A SPACE BETWEEN COMMANDS
	ND	FTSPOOL,-1	;NON-ZERO TO DISPLAY THE ENTERED SPOOLLED NAME
	ND	FTDEBUG,0	;NON-ZERO TO ALLOW A DEBUGGING AID
	ND	FTPATH,-1	;NON-ZERO TO DISPLAY THE ENTIRE PATH OF A FILE
	ND	FTWHAT,-1	;NON-ZERO TO DISPLAY THE CURRENT COMMAND STRING
	ND	FTPRIV,0	;NON-ZERO TO CHECK PRIVILEGES TO RUN DDBDPY
	ND	FTPROG,-1	;NON-ZERO TO MAKE PROGRAMMER NUMBER MATCH
	ND	FTPROJ,0	;NON-ZERO TO MAKE PROJECT NUMBER MATCH
	ND	FTJOB,-1	;NON-ZERO TO SUPPORT THE FANCY JOB DISPLAY
	ND	FTVM,-1		;NON-ZERO TO SUPPORT VIRTUAL MEMORY MONITORS


;DEFINE SOME CONDITIONAL VALUES

	ND	MONVER,700	;THE VERSION OF THE MONITOR DDBDPY WILL
				; RUN UNDER
	ND	PDLSIZ,^D20	;THE DEFAULT SIZE OF THE PUSH DOWN LIST
	ND	PATSIZ,^D50	;THE DEFAULT PATCH SIZE WHEN DEBUGGING
	ND	DEFHIB,^D20000	;THE DEFAULT HIBERNATE TIME BETWEEN SCANS
	ND	PASWRD,'RIPE  '	;THE PASSWORD FOR THE 'G' COMMAND
	ND	MAXSTR,^D4	;THE DEFAULT NUMBER OF STRUCTURES TO BE
				; TYPED ON THE TITLE LINE
	ND	SLPSCN,^D10	;THE SLEEP TIME COUNTER
	ND	SLPMIN,^D30000	;THE MINIMUM SLEEP TIME WITHOUT ADJUSTMENT
	ND	SLPADJ,^D30000	;THE NEW SLEEP TIME AFTER ADJUSTMENT
	ND	SLPPTY,^D60000	;THE SLEEP TIME ON A PTY
	ND	DEFTRM,%V52TP	;THE DEFAULT TERMINAL DISPLAY
	ND	MAXLIN,^D26	;THE DEFAULT MAXIMUM NUMBER OF LINES
	ND	WHTSIZ,^D11	;THE DEFAULT COMMAND STRING BUFFER
	ND	LINSIZ,^D15	;THE DEFAULT LINE SIZE (5 CHAR PER WORD)
	ND	BUFSIZ,<LINSIZ*<MAXLIN-1>>  ;THE SIZE THE LINE BUFFER
SUBTTL	CONSTANT DEFINITIONS


;DEFINE THE ACCUMULATORS

	F=0	;FLAGS
	T1=1	;TEMPORARY AC
	T2=2	;TEMPORARY AC
	T3=3	;TEMPORARY AC
	T4=4	;TEMPORARY AC
	T5=5	;TEMPORARY AC
	P1=6	;HOLDS THE CURRENT DISPLAY TYPE		(PERMANENT AC)
	P2=7	;HOLDS THE LINK TO THE CURRENT DDB	(PERMANENT AC)
	P3=10	;HOLDS THE LINK TO THE CURRENT ACC	(PERMANENT AC)
		; OR THE LINK TO THE CURRENT PDB  (JOB DISPLAY)
	P4=11	;HOLDS THE LINK TO THE CURRENT AKB	(PERMANENT AC)
		; OR THE LINK TO THE CURRENT NMB
		; OR THE LINK TO THE CURRENT STR
		; OR THE JOB STATUS		  (JOB DISPLAY)
	P5=12	;HOLDS THE LINK TO THE CURRENT PPB	(PERMANENT AC)
		; OR THE JOB OR SEGMENT NUMBER	  (JOB DISPLAY)
	C=13	;HOLDS A CHARACTER
	CC=14	;HOLDS THE COLUMN COUNT
	LC=15	;HOLDS THE LINE COUNT
	BP=16	;HOLDS A BYTE POINTER
	P=17	;HOLDS THE PUSH DOWN POINTER


;DEFINE AN I/O CHANNEL TO THE TTY AND TO THE DISK

	SYS==16		;I/O CHANNEL TO SYS
	TTY==17		;I/O CHANNEL TO THE TTY
;DEFINE SOME PERMANENT FLAGS FOR 'F' (LEFT HALF)

	F.PTH==1B0	;IF ON, DISPLAY THE ENTIRE PATH (SIGN BIT)
	F.HLP==1B1	;IF ON, GIVE A HELP TEXT
	F.INI==1B2	;IF ON, THE PROGRAM HAS BE INITALIZED
	F.WLD==1B3	;IF ON, CHECK FOR A EVENT TO OCCUR
	F.GOD==1B4	;IF ON, THE JOB IS PRIVILEGED
	F.CLR==1B5	;IF ON, CLEAR THE SCREEN BEFORE THIS SCAN
	F.DDT==1B6	;IF ON, DDT IS LOADED AND DON'T DO SOME GOODIES
	F.WHT==1B7	;IF ON, DISPLAY THE CURRENT COMMAND BEING PROCESSED
	F.PAG==1B8	;IF ON, THIS CPU USES PAGES
	F.VMS==1B9	;IF ON, THIS IS A VIRTUAL MEMORY SYSTEM
	F.JOB==1B10	;IF ON, USING JOB DISPLAY MODE
	F.PAS==1B11	;IF ON, IN PASS ONE OF THE JOB DISPLAY
	F.SRH==1B12	;IF ON, IT IS TIME TO OUTPUT THE SEARCH LIST
	F.TTL==1B13	;IF ON, DON'T OUTPUT THE TITLE LINE
	F.ESC==1B14	;IF ON, DO AN UPDATE AND THEN PAUSE
	F.RES==1B15	;IF ON, WE ARE IN RESCAN MODE


;DEFINE SOME TEMPORARY FLAGS FOR 'F' (RIGHT HALF)

	F.NOD==1B18	;IF ON, NODE NAME SEEN
	F.DEV==1B19	;IF ON, DEVICE NAME SEEN
	F.FIL==1B20	;IF ON, FILE NAME SEEN
	F.EXT==1B21	;IF ON, EXTENSION WAS SEEN
	F.PPN==1B22	;IF ON, PPN WAS SEEN
	F.AST==1B23	;IF ON, ASTRISK WAS SEEN
	F.DIG==1B24	;IF ON, A DIGIT HAS BEEN OUTPUT
	F.NEG==1B25	;IF ON, A NEGATIVE SIGN MUST BE OUTPUT
	F.LOW==1B26	;IF ON, GET GET THE LOW SEGMENT SIZE
	F.DCT==1B27	;IF ON, DON'T CLEAR THE TERMINAL INPUT BUFFER
	F.STR==1B28	;IF ON, OUTPUT A SPACE BEFOR THE STRUCTURE NAME
;DEFINE SOME STATUS BITS ABOUT THE JOB OR SEGMENT

	JS.RUN==1B0	;THE JOB IS RUNNABLE
	JS.CMW==1B1	;THE JOB IS IN A COMMAND WAIT
	JS.JNA==1B3	;THE JOB NUMBER IS ASSIGNED
	JS.LOK==1B5	;THE JOB IS LOCKED IN CORE
	JS.SWP==1B7	;THE JOB IS SWAPPED
	JS.NSH==1B8	;THE JOB CAN'T BE SHUFFLED
	JS.CLK==1B18	;THE JOB HAS A CLOCK REQUEST
	JS.JDC==1B20	;THE JOB IS IN A DAEMON WAIT
	JS.DCE==1B22	;THE JOB IS WAITING FOR A DEVICE TO CONTINUE
	JS.SFL==1B33	;THE JOB WILL PAUSE ON A DISK FULL CONDITION

	SS.SNA==1B0	;THE SEGMENT NUMBER IS ASSIGNED
	SS.SHR==1B1	;THE HIGH SEGMENT IS SHARABLE


;DEFINE SOME CUSTOMER PRIVILEGE BITS

	JP.DPY==1B34	;THE USER HAS PRIVILEGES TO RUN DDBDPY
	JP.PAS==1B35	;THE USER CAN'T CHANGE HER PASSWORD
;DEFINE THE TYPE OF TERMINALS DDBDPY KNOWS ABOUT

	%AD1TP==0			;LSI ADM-1 TERMINAL
		%AD1SZ==^D24		;NUMBER OF LINES PER SCREEN
		%AD1LD==33		;THE LEAD IN CHARACTER
		%AD1HM==36		;HOME THE CURSER
		%AD1ES==131		;CLEAR TO END OF THE SCREEN
		%AD1EL==124		;CLEAR TO END OF THE LINE

	%AD3TP==1			;LSI ADM-3 TERMINAL
		%AD3SZ==^D24		;NUMBER OF LINES PER SCREEN
		%AD3CL==32		;CLEAR THE SCREEN

	%ASRTP==2			;ASR-33 TERMINAL
		%ASRSZ==^D19		;NUMBER OF LINES PER PAGE

	%HZLTP==3			;HAZELTINE-2000 TERMINAL
		%HZLSZ==^D26		;NUMBER OF LINES PER SCREEN
		%HZLHP==^D68		;CLEAR THRU COLUMN 68
		%HZLLD==176		;THE LEAD IN CHARACTER
		%HZLCL==34		;CLEAR THE SCREEN
		%HZLHM==22		;HOME THE CURSER
		%HZLDL==23		;DELETE A LINE

	%MBETP==4			;MINI-BEE TERMINAL
		%MBESZ==^D25		;NUMBER OF LINES PER SCREEN
		%MBELD==33		;THE LEAD IN CHARACTER
		%MBECL==105		;CLEAR THE SCREEN
		%MBEHM==110		;HOME THE CURSER
		%MBEES==112		;CLEAR TO END OF THE SCREEN
		%MBEEL==113		;CLEAR TO END OF THE LINE

	%MDLTP==5			;MODULAR ONE TERMINAL
		%MDLSZ==^D24		;NUMBER OF LINES PER SCREEN
		%MDLHP==^D68		;CLEAR THRU COLUMN 68
		%MDLLD==176		;THE LEAD IN CHARACTER
		%MDLCL==34		;CLEAR THE SCREEN
		%MDLHM==22		;HOME THE CURSER
		%MDLDL==23		;DELETE A LINE


;	** THE TYPE OF TERMINALS IS CONTINUED ON THE NEXT PAGE **
	%V5BTP==6			;DEC VT05B TERMINAL
		%V5BSZ==^D20		;NUMBER OF LINES PER SCREEN
		%V5BHM==35		;HOME THE CURSER
		%V5BES==37		;CLEAR TO END OF THE SCREEN
		%V5BEL==36		;CLEAR TO END OF THE LINE

	%V50TP==7			;DEC VT50 TERMINAL
		%V50SZ==^D12		;NUMBER OF LINES PER SCREEN
		%V50LD==33		;THE LEAD IN CHARACTER
		%V50HM==110		;HOME THE CURSER
		%V50ES==112		;CLEAR TO END OF THE SCREEN
		%V50EL==113		;CLEAR TO END OF THE LINE

	%V52TP==10			;DEC VT52 TERMINAL
		%V52SZ==^D24		;NUMBER OF LINES PER SCREEN
		%V52LD==33		;THE LEAD IN CHARACTER
		%V52HM==110		;HOME THE CURSER
		%V52ES==112		;CLEAR TO END OF THE SCREEN
		%V52EL==113		;CLEAR TO END OF THE LINE

	%V61TP==11			;DEC VT61 TERMINAL
		%V61SZ==^D24		;NUMBER OF LINES PER SCREEN
		%V61LD==33		;THE LEAD IN CHARACTER
		%V61HM==110		;HOME THE CURSER
		%V61ES==112		;CLEAR TO END OF THE SCREEN
		%V61EL==113		;CLEAR TO END OF THE LINE
SUBTTL	MACRO DEFINITIONS -- .MNVAL


IFN <<MONVER-507>*<MONVER-601>*<MONVER-602>*<MONVER-603>*<MONVER-700>>,<
	$ERROR	?,NSM,NOT A SUPPORTED MONITOR BY DDBDPY >

DEFINE	.MNVAL($SYM,$601,$602,$603,$700)<

	IFE <<MONVER-507>*<MONVER-601>>,<
		$SYM==$601 >

	IFE <MONVER-602>,<
		$SYM==$602 >

	IFE <MONVER-603>*<MONVER-700>,<
		$SYM==$603 >
	IFE <MONVER-700>,<
		$SYM==$700 >>

NS==-1		;** NO SUCH SYMBOL IN THIS MONITOR **


; DEFINE SOME VALUES USED BY DDBDPY IN THE DDB (DEVICE DATA BLOCK)

	.MNVAL	DEVNAM,0,0,0,0 	;THE DEVICE NAME IN SIXBIT
	.MNVAL	DEVCHR,1,1,1,1 	;THE DEVICE CHARACTERISTICS (JOB NUMBER BITS 0-6)
	.MNVAL	DEVIOS,2,2,2,2 	;THE INPUT/OUTPUT STATUS
		.MNVAL	IOSIO,20,20,20,20	;OUTPUT WAIT
		.MNVAL	IOSIOW,1,1,1,1 	;INPUT/OUTPUT WAIT
	.MNVAL	DEVSER,3,3,3,3 	;THE LINK TO THE NEXT DDB (LH)
	.MNVAL	DEVMOD,4,4,4,4 	;THE DEVICE CHARACTERISTICS (CHAR.,,MODES)
	.MNVAL	DEVSPL,12,12,12,12	;THE SPOOL BIT FOR THIS DDB
	.MNVAL	DEVPAL,NS,NS,13,13	;THE PRE-ALLOCATION WORD
		.MNVAL	DEPPAL,NS,NS,20,20	;PRE-ALLOCATED (BIT 31 603)
	.MNVAL	DEVJOB,NS,16,20,21	;THE JOB NUMBER (BITS 27-35 602)
	.MNVAL	DEVFIL,16,17,21,22	;THE FILE NAME IN SIXBIT
	.MNVAL	DEVEXT,17,20,22,23	;THE FILE EXTENSION IN SIXBIT (LH)
	.MNVAL	DEVREL,23,24,26,32	;THE RELATIVE BLOCK IN THE FILE TO READ OR WRITE
	.MNVAL	DEVUNI,24,25,27,33	;THE LINK TO THE UNIT DATA BLOCK (RH)
	.MNVAL	DEVSFD,26,27,31,35	;THE LINK TO THE FATHER SFD (RH)
	.MNVAL	DEVBLK,27,30,32,36	;THE LOGICAL BLOCK IN THE UNIT TO READ OR WRITE
	.MNVAL	DEVACC,30,31,33,37	;THE LINK TO THE ACCESS BLOCK (RH)
	.MNVAL	DEVPRI,35,36,40,45	;THE DISK PRIORITY (BITS 27-29)
	.MNVAL	DEVSPN,NS,37,41,46	;THE ENTERED SPOOLED NAME (602)


;	** THE MONITOR TABLE DEFINITIONS ARE CONTINUED ON THE NEXT PAGE **
; DEFINE SOME VALUES USED BY DDBDPY IN THE TTY DDB

	.MNVAL	DDBLDB,16,17,21,22	;THE LINK TO THE LINE DATA BLOCK (RH)
	.MNVAL	DDBICC,NS,NS,22,NS	;THE INPUT CHARACTER COUNT
	.MNVAL	DDBOCC,NS,NS,23,NS	;THE OUTPUT CHARACTER COUNT
	.MNVAL	DDBBCC,NS,NS,24,25	;THE COMMANDS TYPE (LH) AND
				; THE INPUT WAKEUP'S (RH)


; DEFINE SOME VALUES USED BY DDBDPY IN THE NMB (FILE NAME DATA BLOCK)

	.MNVAL	NMBNAM,0,0,0,0 	;THE NAME OF SFD IN SIXBIT
	.MNVAL	NMBPPB,1,1,1,1 	;THE LINK TO THE FATHER SFD (LH)
		.MNVAL	NMPUPT,2,2,2,2 	;THE SFD NAME IS IN NMBNAM (BIT)


; DEFINE SOME VALUES USED BY DDBDPY IN THE ACC (ACCESS DATA BLOCK)

	.MNVAL	ACCAKB,0,NS,NS,NS	;THE LINK TO THE SECOND ACCESS BLOCK (LH)
				; THE LINK TO THE PROJ-PROG BLOCK (RH)
	.MNVAL	ACCALC,NS,0,0,0 	;THE BLOCKS ALLOCATED TO THIS FILE (602)
	.MNVAL	ACCPPB,NS,4,4,4 	;THE LINK TO THE PROJ-PROG BLOCK (RH 602)
	.MNVAL	ACCSTS,1,5,5,5 	;THE FILE STATUS (RH)
		.MNVAL	ACPREN,40,200,200,200  ;A RENAME UUO IN PROGRESS (BIT)
		.MNVAL	ACPDEL,20,100,100,100  ;THE FILE MARKED FOR DELETION (BIT)
		.MNVAL	ACPSMU,NS,4,4,4      ;SIMULTANEOUS UPDATE (BIT 602)
	.MNVAL	ACCWRT,2,6,6,6 	;THE BLOCKS WRITTEN IN THE FILE
	.MNVAL	ACCDOR,3,3,3,3 	;THE LIST LINK WORD (IF ZERO, ACCESS IS NOT
				; DORMANT)


; DEFINE SOME VALUES USED BY DDBDPY IN THE AKB (SECOND ACCESS BLOCK)

	.MNVAL	AKBALC,0,NS,NS,NS	;THE BLOCKS ALLOCATED TO THIS FILE


; DEFINE SOME VALUES USED BY DDBDPY IN THE PPB (PROJ-PROG BLOCK)

	.MNVAL	PPBNAM,0,0,0,0 	;PROJECT NUMBER,,PROGRAMMER NUMBER
	.MNVAL	PPBSYS,NS,NS,1,1	;LINK TO THE NEXT PPB (LH)
	.MNVAL	PPBUFB,NS,NS,2,2	;LINK TO THE UFB'S FOR THIS PPN (LH)


; DEFINE SOME VALUES USED BY DDBDPY IN THE UFB (USER FILE DIRECTORY BLOCK)

	.MNVAL	UFBTAL,NS,NS,0,0 	;PROJECT NUMBER,,PROGRAMMER NUMBER
	.MNVAL	UFBPPB,NS,NS,1,1	;LINK TO THE NEXT UFB (LH)
	.MNVAL	UFBFSN,NS,NS,4,4	;THE FILE STRUCTURE NUMBER (BITS 0-5)


;	** THE MONITOR TABLE DEFINITIONS ARE CONTINUED ON THE NEXT PAGE **
; DEFINE SOME VALUES USED BY DDBDPY IN THE UNI (UNIT DATA BLOCK)

	.MNVAL	UNINAM,0,0,0,0 	;THE UNIT NAME (I.E. RPA0)
	.MNVAL	UNISTR,4,4,4,4 	;THE LINK TO THE FILE STRUCTURE DATA BLOCK (RH)


; DEFINE SOME VALUES USED BY DDBDPY IN THE STR (FILE STRUCTURE DATA BLOCK)

	.MNVAL	STRNAM,0,0,0,0 	;THE FILE STRUCTURE NAME IN SIXBIT
	.MNVAL	STRFSN,1,1,1,1	;THE FILE STRUCTURE NUMBER (RH)
	.MNVAL	STRSYS,1,1,1,1 	;THE LINK TO THE NEXT FILE STRUCTURE (LH)
	.MNVAL	STRTAL,11,11,11,11	;THE NUMBER OF FREE BLOCKS
	.MNVAL	STRMNT,13,13,13,13	;THE MOUNT COUNT FOR THIS STRUCTURE
	.MNVAL	STRJOB,20,20,20,20	;THE SINGLE ACCESS JOB


;DEFINE SOME VALUES USED BY DDBDPY IN THE NDB (NETWORK DATA BLOCK)

	.MNVAL	NDBNNM,NS,NS,0,0	;THE NODE NUMBER (LH)
				;THE LINK TO THE NEXT NDB (RH)
	.MNVAL	NDBSNM,NS,NS,2,2	;THE POINTER TO THE NODE NAME (LH)
	.MNVAL	SCBOPR,NS,NS,17,17	;THE POINTER TO THE OPR'S LDB (RH)


;DEFINE SOME VALUES USED BY DDBDPY IN THE LDB (LINE DATA BLOCK)

	.MNVAL	LDBDCH,15,16,16,23	;THE TERMINAL CHARACTERISTIC BITS
		.MNVAL	LDRPTY,1B18,1B18,1,1B18  ;THE TERMINAL IS A PTY
		.MNVAL	LDRREM,NS,NS,1,1B31      ;THE TERMINAL IS REMOTE
	.MNVAL	LDBREM,NS,NS,23,32	;THE REMOTE LINE NUMBER (BITS 0-7)
	.MNVAL	LDBMIC,NS,NS,30,43	;THE TERMINAL IS UNDER MIC CONTROL


;DEFINE SOME VALUES USED BY DDBDPY IN THE PDB (PROCESS DATA BLOCK)

	.MNVAL	.PDJSL,NS,NS,27,27	;THE JOB'S SEARCH LIST
		.MNVAL	.FSFNC,NS,NS,45,45	;THE FENCE ACTIVE/PASSIVE
		.MNVAL	.FSEND,NS,NS,46,46	;THE LOGICAL END
		.MNVAL	.FSTMP,NS,NS,47,47	;THE TEMPORARY
		.MNVAL	.FSSTP,NS,NS,77,77	;THE PHYSICAL END
		.MNVAL	FS.WLK,NS,NS,100,100;THE STRUCTURE IS WRITE-LOCKED
		.MNVAL	FS.NCR,NS,NS,200,200;THE STRUCTURE IS NO-CREATE


; DEFINE SOME LOCATIONS IN THE MONITOR

	.MNVAL	LIMLVL,5,5,5,5		;THE MAXIMUM SFD NESTING LEVEL
	.MNVAL	GTBSLF,410,410,410,410	;THE ABSOLUTE ADDRESS THAT CONTAINS THE
					; ADDRESS OF THE 'GETTAB' POINTERS
	.MNVAL	HI,400000,400000,400000,400000	;THE OFFSET TO THE SPY SEGMENT
SUBTTL	MACRO DEFINITIONS -- .TITLE, .SBTTX, .PTHTX AND .DSPTB
TITLE	DDB4 - DISK DDB DISPLAY FOR A 700 MONITOR
DEFINE	.SBTTX<

XLIST	;;TURN THE LISTING OFF

ASCIZ	/JB M     PPN                FILE              NXT   WRT   ALC   OTH/

LIST	;;TURN THE LISTING ON

>


DEFINE	.PTHTX<

XLIST	;;TURN THE LISTING OFF

ASCIZ	/JB M     PPN          FILE       UNIT   BLK   NXT   WRT   ALC   OTH/

LIST	;;TURN THE LISTING ON

>


DEFINE	.DSPTB<

XLIST	;;TURN THE LISTING OFF

	.DSP	ADM1,%AD1TP,%AD1SZ
	.DSP	ADM3,%AD3TP,%AD3SZ
	.DSP	ASR33,%ASRTP,%ASRSZ
	.DSP	HAZELTINE,%HZLTP,%HZLSZ
	.DSP	MINIBEE,%MBETP,%MBESZ
	.DSP	MODULAR,%MDLTP,%MDLSZ
	.DSP	VT05B,%V5BTP,%V5BSZ
	.DSP	VT50,%V50TP,%V50SZ
	.DSP	VT52,%V52TP,%V52SZ
	.DSP	VT61,%V61TP,%V61SZ
	.DSP	VT100,%V52TP,%V52SZ

LIST	;;TURN THE LISTING ON

>
SUBTTL	MACRO DEFINITIONS -- .HLPTX


DEFINE	.HLPTX($MON,$VER,$EDT)<

XLIST	;;TURN THE LISTING OFF

ASCIZ	\DDBDPY %'$VER($EDT) Help Text - Set up for a $MON Monitor

Each command must be terminated by a break character
^C (Control-C) OR ^Z (Control-Z) will exit the job

<CR>  Update the listing
<ALT> Update the listing and wait for a new command
  +   Advance the listing by one page
  -   Decrement the listing by one page
  A   List all the disk DDBs (privileged command)
  D   Change the type of display
  F   List only the DDBs that reference a file specification
  H   This help text
  J   List only the DDBs from a job
  K   Kill the execution and this job
  L   List only the DDBs that are from jobs logged-in under a PPN
  N   List only the DDBs that are from jobs not logged-in under a PPN
  P   Complement the listing of the entire path
  S   Change the sleep time between updates
  T   Complement the listing of the title line
  W   Complement the listing of the command buffer\

LIST	;;TURN THE LISTING ON

>
SUBTTL	PROGRAM INITALIZATION


DDBDPY:	JFCL
IFE <MONVER-700>,<
	MOVE	[25,,113]
	GETTAB			;GET OFFSET FOR .UPLST
	  MOVEI	771		;PRE R?330 LOAD
	ADDI	UPT		;RELOCATE IT
	MOVEM	LSTLOC
>
	MOVX	T1,%CNVER	;GET THE MONITOR
	GETTAB	T1,		; VERSION NUMBER
	 JRST	E$$DRM		;NO - BEFORE 503
	ANDX	T1,777_^D6	;REMOVE THE COSTUMER VERSION NUMBER AND
				; WHO LAST EDITED THE MONITOR
;	CAXE	T1,MONVER_^D6	;SKIP IF THE RIGHT MONITOR
;	JRST	E$$DRM		;JUMP AN ILLEGAL MONITOR VERSION NUMBER
	SETZB	F,PAGNUM	;RESET ALL THE FLAGS AND CURRENT PAGE NUMBER
IFN FTDEBUG,<
	SKIPE	.JBDDT##	;SKIP IF DDT ISN'T LOADED
	TXO	F,F.DDT		;SET THE DDT IS LOADED FLAG >
	MOVX	T1,DEFHIB	;GET THE DEFAULT SLEEP TIME BETWEEN SCANS
	HRRM	T1,HIBTIM	;SAVE FOR LATER
IFN FTRESCAN,<
	RESCAN	1		;SKIP IF THERE ISN'T A RESCAN'ABLE COMMAND
	TXO	F,F.RES		;SET THE RESCAN FLAG >

DDBDP0:	RESET			;RESET THE WORLD
	MOVX	T1,%CNSIZ	;GET THE SIZE OF
	GETTAB	T1,		; THE MONITOR
	 JRST	E$$NPS		;NO - GO INFORM THE USER
	SOJ	T1,		;GETTAB RETURNS MONITOR SIZE + 1
	SPY	T1,		;SET UP TO SPY ON THE MONITOR
	 JRST	E$$NPS		;NO - GO INFORM THE USER

	HRRZ	P5,HI+GTBSLF	;GET THE ADDRESS OF THE START OF THE
				; GETTAB TABLES
	MOVEI	T2,HI(P5)	;SAVE THE ADDRESS OF
	HRRM	T2,GETSLF	; THE GETTAB TABLES

	HRRZ	T2,HI+.GTLVD(P5);GET THE ADDRESS OF LEVEL-D TABLE

IFE <MONVER-603>*<MONVER-700>,<
	MOVEI	T1,HI+%LDSPB_-^D18(T2)	;GET THE ADDRESS OF THE 
	MOVEM	T1,GETSPB		; POINTER TO THE PPB'S >

	MOVEI	T1,HI+%LDSTR_-^D18(T2)	;GET THE ADDRESS OF THE 
	MOVEM	T1,GETSTR		; POINTER TO THE STR'S

	HRRZ	P2,HI+.GTCNF(P5)	;GET THE MAX
	MOVE	T1,HI+%CNSJN_-^D18(P2)	; NUMBER OF
	HRRI	T1,-1(T1)		; JOBS ON THE
	HRRZM	T1,JOBMAX		; SYSTEM
	MOVE	T1,HI+56(P5)
	MOVEI	T1,HI+10(T1)		;POINT AT HIGHJB
	MOVEM	T1,HIJOB		;SAVE THE ADDRESS
IFN FTJOB,<
	MOVEI	T1,HI+%CNDTM_-^D18(P2)	;GET THE ADDRESS
	HRRZM	T1,GETDAT		; OF THE DATE

	MOVE	T1,HI+%CNPTY_-^D18(P2)	;GET THE PTY'S ON THE SYSTEM
	HLRZM	T1,PTYMIN		;SAVE THE MINIMUM PTY NUMBER

	SETO	T1,		;TEST A KA VS
	AOBJN	T1,.		; KI OR KL
	CAIN	T1,0		;SKIP IF A KA
	TXO	F,F.PAG		;SET THE PAGE FLAG

IFN FTVM,<
	MOVE	T1,HI+%CNST2_-^D18(P2)	;GET THE SECOND STATES WORD
	TXNE	T1,ST%VMS		;SKIP IF NOT A VM SYSTEM
	TXO	F,F.VMS			;SET THE VIRTUAL MEMORY FLAG >

	MOVEI	T1,^D60		;GET DEFAULT TIME FOR A JIFFY
	MOVE	T2,HI+%CNSTS_-^D18(P2)  ;GET THE STATES WORD
	TXNE	T2,ST%CYC	;SKIP IF A 60 CYCLE CLOCK
	MOVEI	T1,^D50		;SET UP FOR A 50 CYCLE CLOCK
	MOVEM	T1,JIFFIE	;SAVE THE TIME OF A JIFFY FOR LATER
	IMULI	T1,^D60		;GET JIFFIES PER MINUTES
	MOVEM	T1,JIFMIN	;SAVE FOR LATER
	IMULI	T1,^D60		;GET JIFFIES PER HOUR
	MOVEM	T1,JIFHOR	;SAVE FOR LATER >

IFN FTJOB,<
	HRRZ	T1,HI+%CNPDB_-^D18(P2)	;GET THE ADDRESS
	MOVEI	T1,HI(T1)		; OF THE PDB
	HRRM	T1,GETPDB		; TABLE >

IFE <MONVER-603>*<MONVER-700>,<
	HRRZ	T1,HI+%CNNDB_-^D18(P2)  ;GET THE POINTER TO
	MOVEM	T1,GETNDB		; NETWORK DATA BLOCK >

	HLRZ	P2,HI+%CNDEV_-^D18(P2)  ;FIND THE ADDRESS OF THE FIRST DDB

	MOVE	T2,[-GETSIZ,,GETTBL]  ;SET THE GETTAB POINTERS
DDBDP1:	LDB	T1,[POINT 9,(T2),8]  ;GET THE TABLE TO LOOK AT
	HRRZ	T1,@GETSLF	;GET THE ADDRESS OF THE TABLE
	MOVEI	T1,HI(T1)	;SET UP FOR SPYING
	HRRM	T1,(T2)		;SAVE FOR LATER USE
	AOBJN	T2,DDBDP1	;LOOP BACK BACK IF NOT FINISHED
	MOVEI	T1,DDBDP0	;SET UP TO HAVE IMR'S
	MOVEM	T1,.JBAPR##	; RESTART THE PROGRAM
	MOVX	T1,AP.ILM	;SET UP TO TRAP
	APRENB	T1,		; ILL MEM REF'S

IFN FTDEBUG,<
	TXNE	F,F.DDT		;SKIP IF DDT ISN'T LOADED
	JRST	DDBDP2		;SKIP SETTING UP THE CONTROL-C INTERCEPT >
	MOVEI	T1,INTBLK	;SET UP TO INTERCEPT 
	MOVEM	T1,.JBINT##	; CONTROL-C'S (^C)
	SETZM	INTBLK+2	;RESET THE INTERCEPT BLOCK

DDBDP2:	MOVE	T1,CMDWAT	;SET UP THE DEFAULT INPUT
	MOVEM	T1,INCHR	; ROUTINE (INCHWL C)
	MOVE	P,[-PDLSIZ,,PDL];SET UP THE PUSH DOWN LIST

	TXOE	F,F.INI		;SKIP IF THE PROGRAM WAS JUST STARTED
	JRST	DDBDP7

	PJOB	P5,		;GET MY JOB NUMBER
	MOVEM	P5,CURJOB	;SAVE MY JOB NUMBER FOR LATER
IFN FTPRIV,<
	MOVX	T1,JP.DPY	;GET THE PRIVILEGE BIT
	TDNN	T1,@GETPRV	;SKIP IF THE USER IS PRIVILEGED
	JRST	E$$NPR		;NOT ENOUGH PRIVILEGES >
	MOVE	T1,@GETPPN	;GET MY PPN
	MOVEM	T1,MYPPN	;SAVE FOR LATER
	HLRZ	T4,T1
	CAIE	T4,10
	CAMN	T1,[1,,2]	;SKIP IF NOT 1,2
	JRST	DDBDP3		;GO SET THE GOD BIT
	HRRZ	T4,T1
	CAIN	T4,10
	JRST	DDBDP3
IFE FTPROJ,<
	IFN FTPROG,<
		HRRZM	T1,IDIR		;ASSUME [*,PRG]
		HLLOS	IDIRMSK >>
IFN FTPROJ,<
	IFE FTPROG,<
		HLLZM	T1,IDIR		;ASSUME [PRJ,*]
		HRROS	IDIRMSK >
	IFN FTPROG,<
		MOVEM	T1,IDIR		;ASSUME [PRJ,PRG]
		SETOM	T1,IDIRMSK >>
	MOVE	T1,[IROUTI,,ROUTIN]  ;SET UP THE INITIAL
	BLT	T1,BLTEND	     ; SCAN CONDITIONS
	TXOA	F,F.WLD		;SET THE WILD FLAG
DDBDP3:	TXO	F,F.GOD		;SET THE GOD BIT

IFN FTSLEEP,<
	MOVX	T1,SLPSCN	;SET THE DEFAULT
	MOVEM	T1,SLPCNT	; SLEEP COUNTER >
	SKIPN	T4,@GETTTY	;GET THE ADDRESS OF MY TERMINALS DDB
	 JRST	E$$TTF		;ERROR - NO DDB
	HRRZ	T4,HI+DDBLDB(T4);GET THE ADDRESS OF THE TERMINALS LDB
	JUMPE	T4,E$$TTF	;JUMP IF THE ADDRESS IS ZERO
IFE <MONVER-700>,<
	PUSHJ	P,GETLDB	;SET SPY-PAGE FOR LDB
>
	MOVE	T3,HI+LDBDCH(T4);GET THE DEVICE CHARACTERISTIC BITS
	TXNN	T3,LDRPTY	;SKIP IF A PTY
	JRST	DDBDP4		;SKIP SOME PTY CODE
	MOVX	T1,JB.LBT	;GET THE BATCH BIT
IFE <MONVER-603>*<MONVER-700>,<
	SKIPN	HI+LDBMIC(T2)	;SKIP IF A MIC COJOB >
	TDNE	T1,@GETLIM	;SKIP IF NOT A BATCH JOB
	JRST	E$$CRS		;CAN'T RUN DDBDPY
	MOVX	T1,SLPPTY	;SLEEP TIME
	HRRM	T1,HIBTIM	; ON A PTY
IFN FTSLEEP,<
	SETZM	SLPCNT		;DON'T RESET THE SLEEP COUNTER >
DDBDP4:	DPB	T3,[POINT 9,TRM+1,35]  ;STORE THE TEN TERMINAL NUMBER
IFN <MONVER-603>,<
	ANDX	T3,777		;CLEAR SOME JUNK >
IFE <MONVER-603>*<MONVER-700>,<
	TXNN	T3,LDRREM	;SKIP IF A REMOTE TERMINAL
	JRST	[ANDX	T3,777		;REMOVE UNNEEDED BITS
		 HRRZ	T1,@GETLOC	;THE NUMBER OF THE CENTRAL NODE
		 JRST	DDBDP5]		;GO STORE THIS HOT INFO
	HLRZ	T1,HI+LDBREM(T4);GET THE POINTER NETWORK INFO
	JUMPE	T1,E$$TTF	;JUMP IF AN INVALID POINTER
	LDB	T3,[POINT 8,HI+LDBREM+4(T4),7]  ;GET RELATIVE LINE NUMBER
	HLRZ	T1,HI+NDBNNM(T1);GET THE NODE NUMBER
DDBDP5:	MOVEM	T1,NODIDX	;SAVE THE NODE NUMBER >
	MOVEM	T3,LINIDX	;SAVE THE LINE NUMBER

	MOVSI	T3,-TRMSIZ	;SET A AOBJN COUNTER
DDBDP6:	MOVE	T2,TRMTAB(T3)	;GET THE TRMOP. TO PREFORM
	HLRZM	T2,TRM+2	;SAVE THE NEW STATUS
	HRRZM	T2,TRM		;SAVE THE READ FUNCTION
	MOVE	T1,[2,,TRM]	;READ THE BIT IN
	TRMOP.	T1,		; QUESTION
	 JRST	E$$TTF		;NO - GO INFORM THE USER
	MOVEM	T1,TRMSAV(T3)	;SAVE FOR LATER
	MOVEI	T2,.TOSET(T2)	;CHANGE THE FUNCTION INTO A SET
	MOVEM	T2,TRM		;SAVE FOR LATER
	MOVE	T1,[3,,TRM]	;SET THE FUNCTION
	TRMOP.	T1,		; IN QUESTION
	 JRST	E$$TTF		;NO - GO INFORM THE USER
	AOBJN	T3,DDBDP6	;JUMP IF NOT FINISHED

	PUSHJ	P,TRMDSP	;SET UP THE DEFAULT DISPLAY TYPE
	PUSHJ	P,PAGADJ	;SET UP THE SCREEN SIZE INFO
IFN FTWHAT,<
	PUSHJ	P,CMDOUT	;GO SETUP THE COMMAND STRING BUFFER >
DDBDP7:
IFN FTDEBUG,<
	TXNE	F,F.DDT		;SKIP IF DDT WASN'T LOADED
	JRST	DDBMAN		;SKIP THE INIT CODE >
	INIT	TTY,IO.SUP!.IOASC  ;INIT THE TTY WITH ECHO OFF
	SIXBIT	/TTY/
	OCT	0
	 JRST	E$$CIT		;NO - INFORM THE USER!!
	PUSHJ	P,CLRLIN

SUBTTL	THE DDB SCANNING LOOP


DDBMAN:	TXZE	F,F.CLR		;SKIP IF THE SCREEN SHOULDN'T BE CLEARED
	PUSHJ	P,@TRMCLR(P1)	;GO CLEAR THE SCREEN
	SETZB	LC,DDBCNT	;ZERO SOME COUNTERS
IFL <MONVER-700>,<
	MOVE	P2,ADRDSK	;GET THE POINTER TO THE FIRST DISK DDB
>
IFGE <MONVER-700>,<
	SETZB	P2,JOB
>
DDBLOP:	PUSHJ	P,NXTDDB	;GET THE NEXT DDB IN THE CHAIN
	 JRST	DDBEND		;FINISHED WITH THE CHAIN
	MOVX	T1,DV.DSK	;GET THE DEVICE IS A DISK BIT
	TDNN	T1,HI+DEVMOD(P2);SKIP IF THE DDB IS FOR A DISK
	JRST	[SKIPGE	HI+DEVSPL(P2)	;SKIP IF THE DEVICE ISN'T SPOOLED
		 JRST	DDBLO0		;GO LIST THE DDB
		 JRST	DDBLOP]		;GO TRY THE NEXT DDB
DDBLO0:	HRRZ	P3,HI+DEVACC(P2);GET THE POINTER TO ACC-TAB
	JUMPE	P3,DDBLOP	;JUMP IF ZERO
IFL <MONVER-602>,<
	SKIPN	HI+ACCDOR(P3)	;SKIP IF THE FILE IS DORMANT
	SKIPN	P5,HI+ACCAKB(P3);SKIP IF THE POINTERS TO THE PPB
				; AND AKB ARE NON-ZERO
	JRST	DDBLOP
	HLRZ	P4,P5		;GET THE POINTER TO PPB >
IFGE <MONVER-602>,<
	SKIPE	HI+ACCDOR(P3)	;SKIP IF THE FILE ISN'T DORMANT
	JRST	DDBLOP		;GO TRY THE NEXT DDB
	HRRZ	P5,HI+ACCPPB(P3);GET THE PPB POINTER
	JUMPE	P5,DDBLOP	;NO PPB - TRY NEXT DDB THEN >

	TXNE	F,F.WLD		;SKIP IF WILD PROCESSOR ISN'T WANTED
	JRST	@ROUTIN		;GO EXCUTE THE WILD PROCESSOR
DDBLO1:	MOVE	T1,DDBCNT	;GET THE DDB COUNTER
	CAML	T1,PAGFST	;SKIP IF THE DDB IS TO SOON
	CAML	T1,PAGLST	;SKIP IF THE DDB IS IN TIME
	JRST	DDBL13		;GO COUNT THE DDB
	PUSHJ	P,BEGLIN	;SET UP THE LINE
	MOVEI	T4,^D2		;SET UP OUTPUT THE JOB NUMBER
	LDB	T1,JOBPTR	;GET THE JOB NUMBER OF THIS DDB
	PUSHJ	P,DECJST	;OUTPUT THE JOB NUMBER
	LDB	T1,STSPTR	;GET THE FILE STATUS
	MOVE	T1,MODE(T1)	;GET THE MODE AND
	PUSHJ	P,SIXOUT	; OUTPUT IT
	LDB	T5,JOBPTR	;GET THE JOB NUMBER AGAIN
	SKIPN	T5,@GETPP	;SKIP IF THE PPN FOR THIS
				; JOB IS NON-ZERO
	JRST	DDBLOP
	MOVEI	T4,^D6		;SET UP TO OUTPUT THE PPN
	PUSHJ	P,PPNJST	;GO OUTPUT THE PPN
	MOVEI	T1,^D17		;JUSTIFY TO
	PUSHJ	P,JUST		; COLUMN 17
	PUSHJ	P,FNDSTR	;GO FIND THE STRUCTURE NAME
	 JRST	DDBLOP		;GO ABORT THE OUTPUT
	PUSHJ	P,SIXOUT	;GO OUTPUT THE STRUCTURE NAME
	MOVEI	T1,^D22		;JUSTIFY TO
	PUSHJ	P,JUST		; COLUMN 22
	SKIPN	T1,HI+DEVFIL(P2);SKIP IF THE FILE NAME IS NON-ZERO
	JRST	DDBLOP
	HLRZ	T5,HI+DEVEXT(P2);GET THE EXTENSION
	CAIN	T5,'UFD'	;SKIP IF IT ISN'T A UFD
	JRST	[MOVEI	C,"["
		 PUSHJ	P,CHROUT	;GO OUTPUT OPEN BRACKET
		 MOVE	T5,T1		;GET THE PPN IN THE RIGHT PLACE
		 PUSHJ	P,PPNOUT	;GO OUTPUT THE PPN
		 MOVE	T1,['].UFD ']
		 PUSHJ	P,SIXOUT	;GO OUTPUT '].UFD'
		 JRST	DDBLO5]		;SKIP OUTPUTTING THE UFD
IFGE <MONVER-602>,<IFN FTSPOOL,<
	SKIPGE	HI+DEVSPL(P2)	;SKIP IF NOT A SPOOLED FILE
	SKIPN	T2,HI+DEVSPN(P2);SKIP IF A NON-ZERO ENTERED SPOOLED NAME
	JRST	DDBLO2		;GO OUTPUT THE FILE NAME
	MOVE	T1,T2		;OUTPUT THE ENTERED
	PUSHJ	P,SIXOUT	; SPOOLED NAME
	MOVEI	T1,^D28		;JUSTIFY TO
	PUSHJ	P,JUST		; COLUMN 28
	MOVEI	C,"*"		;OUTPUT A
	PUSHJ	P,CHROUT	; ASTERISK
	JRST	DDBLO3		;GO OUTPUT THE SPOOLED DEVICE >>
DDBLO2:	PUSHJ	P,SIXOUT	;OUTPUT THE FILE NAME
	JUMPE	T5,DDBLO4	;JUMP IF THE EXTENSION IS ZERO
	MOVEI	T1,^D29		;JUSTIFY TO
	PUSHJ	P,JUST		; COLUMN 29
DDBLO3:	MOVSI	T1,(T5)		;GET THE EXTENSION AGAIN
	PUSHJ	P,SIXOUT	;OUTPUT THE EXTENSION
DDBLO4:	MOVEI	T1,^D32		;JUSTIFY TO
	PUSHJ	P,JUST		; COLUMN 32
IFN FTPATH,<
	JUMPL	F,[HRRZ  T1,HI+DEVUNI(P2)  ;GET THE LINK THE UNIT DATA BLOCK
		   JUMPE T1,DDBLOP	;JUMP IF NO UNIT DATA BLOCK
		   MOVE  T1,HI+UNINAM(T1)  ;GET THE UNIT NAME
		   LSH   T1,-^D6	;SHIFT IN A SPACE
		   PUSHJ P,SIXOUT	;OUTPUT THE UNIT NAME
		   MOVEI T4,^D7
		   MOVE	 T1,HI+DEVBLK(P2)  ;OUTPUT THE LOGICAL BLOCK
		   PUSHJ P,DECJST	   ; TO BE READ OR WRITTEN
		   MOVEI T4,^D6		;SET UP OUTPUT THE
		   JRST  DDBLO6]	; RELATIVE BLOCK >
	MOVEI	T4,^D6
	MOVE	T5,HI+PPBNAM(P5);THE PPN OF THE FILE
	PUSHJ	P,PPNJST	;GO OUTPUT THE PPN
DDBLO5:	MOVEI	T1,^D45		;JUSTIFY TO
	PUSHJ	P,JUST		; COLUMN 45
	MOVEI	T4,^D5
DDBLO6:	MOVE	T1,HI+DEVREL(P2);GET THE NEXT (RELATIVE) BLOCK
	PUSHJ	P,DECJST	; TO BE READ OR WRITTEN
	MOVEI	T4,^D6
	MOVE	T1,HI+ACCWRT(P3);GET THE NUMBER OF BLOCKS WRITTEN
	PUSHJ	P,DECJST	;OUTPUT IT
	MOVEI	T4,^D6
IFL <MONVER-602>,<
	MOVE	T1,HI+AKBALC(P4);GET THE NUMBER OF BLOCKS ALLOCATED >
IFGE <MONVER-602>,<
	MOVE	T1,HI+ACCALC(P3);GET THE NUMBER OF BLOCKS ALLOCATED >
	PUSHJ	P,DECJST	;OUTPUT IT
	PUSHJ	P,SPAOUT	;OUTPUT A SPACE
	LDB	T1,[POINT 3,HI+DEVPRI(P2),29]  ;THE DISK PRIORITY
	JUMPE	T1,DDBLO7	;JUMP IF ZERO
	TRZE	T1,4		;SKIP IF NEGATIVE
	MOVEI	C,"-"
	PUSHJ	P,CHROUT	;OUTPUT A MINUS SIGN OR A SPACE
	PUSHJ	P,DECOUT	;OUTPUT THE DISK PRIORITY
	PUSHJ	P,SPAOUT	;OUTPUT A SPACE
DDBLO7:	MOVEI	C,"S"
	SKIPGE	HI+DEVSPL(P2)	;SKIP IF THE FILE ISN'T A SPOOLLED FILE
	PUSHJ	P,CHROUT	;OUTPUT A "S"
	HRRZ	T1,HI+ACCSTS(P3);GET THE FILE STATUS
	MOVEI	C,"D"
	TRNE	T1,ACPDEL	;SKIP IF THE FILE ISN'T MARKED FOR DELETION
	PUSHJ	P,CHROUT	;OUTPUT A 'D'
	MOVEI	C,"R"
	TRNE	T1,ACPREN	;SKIP IF THE FILE ISN'T BEING RENAMED
	PUSHJ	P,CHROUT	;OUTPUT A 'R'
IFGE <MONVER-602>,<
	MOVEI	C,"M"
	TRNE	T1,ACPSMU	;SKIP IF NOT SIMULTANEOUS UPDATE, MULTI-USER
	PUSHJ	P,CHROUT	;OUTPUT A 'M' >
IFE <MONVER-603>*<MONVER-700>,<
	MOVEI	C,"P"
	MOVX	T1,DEPPAL	;GET THE PRE-ALLOCATION BIT
	TDNE	T1,HI+DEVPAL(P2);SKIP IF NOT PRE-ALLOCATED
	PUSHJ	P,CHROUT	;OUTPUT A 'P' >
	HLRZ	T1,HI+DEVIOS(P2);GET THE I/O STATUS
	TRNN	T1,IOSIOW	;SKIP IF IN I/O WAIT
	JRST	DDBLO8		;JUMP NOT IN AN I/O WAIT
	MOVEI	C,"I"		;ASSUME INPUT WAIT
	TRNE	T1,IOSIO	;SKIP IF INPUT WAIT
	MOVEI	C,"O"		;OUTPUT WAIT
	PUSHJ	P,CHROUT	;OUTPUT THE WAIT STATE
DDBLO8:	PUSHJ	P,ENDLIN	;GO FINISH OFF THE LINE
	AOJ	LC,		;INCREMENT THE LINE COUNT
IFN FTPATH,<
	JUMPGE	F,DDBL13	;JUMP IF THE ENTIRE PATH ISN'T WANTED
	PUSHJ	P,BEGLIN	;SET UP THE LINE
	MOVEI	T4,^D10
	MOVE	T5,HI+PPBNAM(P5);GET THE PPN TO BE OUTPUT
	PUSHJ	P,PPNJST	;OUTPUT THE PPN
	HRRZ	P4,HI+DEVSFD(P2);SEE IF THE FILE IS IN AS SFD
	JUMPE	P4,DDBL12	;SKIP IF THE FILE IS IN AN SFD
	PUSH	P,[0]		;SET A FLAG
DDBLO9:	PUSH	P,HI+NMBNAM(P4)	;SAVE THE SFD NAME
DDBL10:	HLRZ	P4,HI+NMBPPB(P4);GET THE POINTER TO THE NEXT NMB
	TRZN	P4,NMPUPT	;SKIP IF THE CONTAINS THE SFD NAME
	JUMPN	P4,DDBL10	;GO SAVE THE SFD NAME
	JUMPN	P4,DDBLO9	;GO GET THE NEXT NMB POINTER
DDBL11:	POP	P,T1		;GET THE SFD NAME BACK
	JUMPE	T1,DDBL12	;JUMP IF THE FLAG WAS FOUND
	PUSHJ	P,COMOUT	;OUTPUT A COMMA
	PUSHJ	P,SIXOUT	;OUTPUT THE SFD NAME
	JRST	DDBL11		;GO GET THE NEXT SFD LEVEL
DDBL12:	PUSHJ	P,ENDLIN	;GO FINISH OFF THE LINE
	AOJ	LC,		;INCREMENT THE LINE COUNT >
DDBL13:	AOS	DDBCNT		;INCREMENT DDB COUNT
	JRST	DDBLOP		;GO TRY THE NEXT DDB
SUBTTL	MAKE THE HEADER LINE AND OUTPUT THE BUFFER


DDBEND:	CAXN	P1,%AD3TP	;SKIP IF NOT A LSI ADM-3
	OUTSTR	[BYTE (7).CHCRT,.CHLFD,0]
	MOVEM	LC,CURCNT	;SAVE THE LINE COUNT
IFN FTTITLE,<
	TXNE	F,F.TTL		;SKIP IF THE TITLE FLAG IS SET
	JRST	DDBEN7		;GO OUTPUT THE DDB BUFFER >
	SETZ	LC,		;SET UP THE FOR
	PUSHJ	P,TTLLIN	; THE TITLE LINE
IFN FTJOB,<
	TXNN	F,F.JOB		;SKIP IF THE JOB DISPLAY IS WANTED
	JRST	DDBEN0		;SKIP THE JOB DISPLAY STUFF
	PUSHJ	P,JOBOUT	;GET SET UP THE JOB BUFFER
 	 JRST	DDBEN4		;GO TERMINATE THE LINE OFF RIGHT >

DDBEN0:	MOVE	T1,DDBCNT	;OUTPUT THE NUMBER
	PUSHJ	P,DECOUT	; OF DDB'S
	PUSHJ	P,SPAOUT	;OUTPUT A SPACE
	MOVE	T1,PAGNUM	;GET THE CURRENT PAGE NUMBER
	AOJ	T1,
	PUSHJ	P,DECOUT	;OUTPUT THE CURRENT PAGE NUMBER
	PUSHJ	P,SLHOUT	;OUTPUT A SLASH
	SKIPE	T1,DDBCNT	;SKIP IF THE DDB COUNT IS ZERO
	SOJ	T1,		;MAKE IT ONE LESS
	ADD	T1,PAGSIZ
	IDIV	T1,PAGSIZ	;GET THE NUMBER OF PAGES OF DDB'S
	PUSHJ	P,DECOUT	;OUTPUT THE NUMBER OF PAGES
	HLRZ	P4,@GETSTR	;GET THE POINTER TO THE STRUCTURE CHAIN
	JUMPE	P4,DDBEN4	;JUMP IF THE END OF THE CHAIN WAS REACHED
	MOVEM	CC,TEMP		;SAVE THE CURRENT COLUMN COUNT FOR LATER
	MOVX	T5,MAXSTR	;SET UP A STRUCTURE COUNTER

DDBEN1:	SKIPN	HI+STRNAM(P4)	;SKIP IF A NON-NULL STRUCTURE NAME
	JRST	DDBEN3		;GO TRY THE NEXT STRUCTURE
	SOJGE	T5,DDBEN2	;JUMP IF NOT TIME FOR A NEW LINE
	PUSHJ	P,ENDLIN	;TERMINATE THE CURRENT LINE
	AOJ	LC,		;INCREMENT THE LINE COUNT
	PUSHJ	P,TTLLIN	;SET UP A TITLE LINE
	MOVE	T1,TEMP		;GET THE COLUMN COUNT
	PUSHJ	P,JUST		; AND JUSTIFY TO IT
	MOVX	T5,MAXSTR-1	;SET UP A STRUCTURE COUNTER
DDBEN2:	MOVE	T1,HI+STRNAM(P4);GET THE STRUCTURE NAME
	LSH	T1,-^D6		;SHIFT A SPACE INTO THE FIRST CHAR
	PUSHJ	P,SIXOUT	;OUTPUT THE STRUCTURE NAME
	PUSHJ	P,CLNOUT	;OUTPUT A COLON
	MOVE	T1,HI+STRTAL(P4);GET THE NUMBER OF FREE BLOCKS ON THE STRUCTURE
	PUSHJ	P,DECOUT	;OUTPUT THE NUMBER OF FREE BLOCKS
IFN FTMOUNT,<
	PUSHJ	P,CLNOUT	;OUTPUT A COLON
	SKIPLE	HI+STRJOB(P4)	;SKIP IF THE STRUCTURE IS MOUNTED SINGLE
	JRST	[MOVEI	C,"S"		;OUTPUT AN 'S' FOR
		 PUSHJ	P,CHROUT	; SINGLE ACCESS
		 JRST	DDBEN3]		;KEEP ON TRUCK'N
	MOVE	T1,HI+STRMNT(P4);GET THE MOUNT COUNT FOR THIS STRUCTURE
	PUSHJ	P,DECOUT	;OUTPUT THE MOUNT COUNT >
DDBEN3:	HLRZ	P4,HI+STRSYS(P4);GET POINTER TO THE NEXT STRUCTURE
	JUMPN	P4,DDBEN1	;GO DISPLAY THIS STRUCTURE
DDBEN4:	PUSHJ	P,ENDLIN	;FINISH OFF THE LINE
	AOJ	LC,		;INCREMENT THE LINE COUNT

	CAILE	LC,^D2		;SKIP IF TWO OR LESS TITLE LINES
	JRST	DDBEN5		;SKIP SOME CRUDE CODE
	PUSHJ	P,TTLLIN	;SET UP ANOTHER TITLE LINE
	MOVEI	T1,STLBUF	;ASSUME NOT OUTPUTTING THE PATH
IFN FTPATH,<
	TXNE	F,F.PTH		;SKIP PATH NO WANTED
	MOVEI	T1,PTHBUF	;GET THE PATH BUFFER >
	PUSHJ	P,ASCOUT	;OUTPUT TEXT TO THE BUFFER
	PUSHJ	P,ENDLIN	;FINISH OFF THE LINERRIGHT
	AOJ	LC,		;INCREMENT THE LINE COUNT

DDBEN5:	MOVEI	T5,TTLBUF	;THE POINTER TO THE TITLE LINE
DDBEN6:	PUSHJ	P,@TRMEOL(P1)	;CLEAR TO THE END OF THE LINE
	OUTSTR	(T5)		;OUTPUT A TITLE LINE
	MOVEI	T5,LINSIZ(T5)	;GET THE POINTER TO THE NEXT LINE
	SOJG	LC,DDBEN6	;LOOP UNTIL FINISHED

DDBEN7:	MOVEI	T5,LINBUF	;SET UP THE LINE BUFFER
	SKIPG	LC,CURCNT	;SKIP IF NO LINES TO OUTPUT
	JRST	DDBEN9		;SKIP SOME CODE
DDBEN8:	PUSHJ	P,@TRMEOL(P1)	;GO CLEAR TO THE END OF THE LINE
	OUTSTR	(T5)		;GO OUTPUT A LINE
	MOVEI	T5,LINSIZ(T5)	;POINT TO THE NEXT LINE
	SOJG	LC,DDBEN8	;JUMP IF MORE LINES TO OUTPUT

DDBEN9:	PUSHJ	P,@TRMEOS(P1)	;GO CLEAR TO THE END OF THE SCREEN
IFN FTSLEEP,<
	SOSE	SLPCNT		;SKIP IF TIME TO ADJUST THE SLEEP TIME
	JRST	DDBE10		;SKIP SOME CODE
	MOVX	T1,SLPADJ	;ADJUST THE SLEEP
	HRRM	T1,HIBTIM	; TIME INTERVAL
IFN FTWHAT,<
	PUSHJ	P,CMDOUT	;SET UP COMMAND STRING BUFFER >
DDBE10: >
IFE FTWHAT,<
	TXNN	F,F.HLP		;SKIP IF HELP IS NEEDED
	JRST	DDBE11		;GO HOME THE SCREEN THEN
	OUTSTR	[ASCIZ /  ** Type "H<CR>" for help **/] >
IFN FTWHAT,<
	TXNN	F,F.HLP!F.WHT	;SKIP IF THE HELP OR COMMAND BUFFER IS NEEDED
	JRST	DDBE11		;GO HOME THE TERMINAL
	MOVEI	T1,WHTBUF	;GET THE ADDRESS OF THE COMMAND LINE
	TXNE	F,F.HLP		;SKIP IF HELP ISN'T NEEDED
	MOVEI	T1,[ASCIZ /  ** Type "H<CR>" for help **/]
	OUTSTR	(T1)		;OUTPUT THE LINE >
	CAXN	P1,%ASRTP	;SKIP IF NOT AN ASR33 DISPLAY
	OUTSTR	[BYTE (7).CHCRT,.CHLFD,0]
DDBE11:	PUSHJ	P,@TRMHOM(P1)	;GO HOME THE TERMINAL
SUBTTL	THE COMMAND SCANNER


IFN FTESCAPE,<
	TXZE	F,F.ESC		;SKIP IF THE SCREEN SHOULD NOT BE FROZEN
	JRST	CMDWAT		;GO WAIT FOR A NEW COMMAND >

	SKPINL			;SKIP IF A COMMAND WAS TYPED
	 JRST	CMDFIN		;NO - GO HIBERNATE

CMDWAT:	INCHWL	C		;GET A CHAR FROM THE TTY

CMDTST:	CAIL	C,"a"		;SKIP IF LESS THAN A LOWER CASE A
	CAILE	C,"z"		;SKIP IF LESS THAN A LOWER CASE Z
	JRST	CMDTS0		;JUMP IF NOT LOWER CASE CHARACTER
	MOVEI	C,"A"-"a"(C)	;CONVERT TO UPPER CASE
CMDTS0:	TXZ	F,F.HLP		;CLEAR THE COMMAND ERROR FLAG
	MOVSI	T2,-CMDSIZ	;SET UP A AOBJN COUNTER
CMDTS1:	MOVS	T1,CMD(T2)	;GET A CHAR TO TEST
	CAIE	C,(T1)		;SKIP IF THE CHAR MATCH
	AOBJN	T2,CMDTS1	;JUMP IF NOT FINISHED
	JUMPGE	T2,CMDERR	;JUMP IF A MATCH WASN'T FOUND
	HLRZS	T1		;GET THE FLAGS AND WHERE TO GO TOO
	TRZN	T1,EC		;SKIP IF EOL SHOULD FOLLOW THE COMMAND
	JRST	(T1)		;NO - GO TO THE RIGHT ROUTINE
	PUSHJ	P,TSTEOL	;GO TEST FOR AN EOL
	 JRST	CMDERR		;NOT EOL - GO GIVE AN ERROR MESSAGE
	JRST	(T1)		;FOUND AN EOL GO TO THE ROUTINE


;HERE IF A COMMAND ERROR WAS DETECTED

CMDERR:	CAIE	C,.CHCNC	;SKIP IF A CONTROL-C WAS INPUT
	CAIN	C,.CHCNZ	;SKIP IF A CONTROL-Z WASN'T INPUT
	JRST	CMDABT		;GO ABORT THE JOB
	CLRBFI			;CLEAR THE INPUT BUFFER
	TXO	F,F.HLP		;SET THE HELP FLAG
	JRST	DDBMAN		;GO DO A RESCAN
	EC==400000	;COMMAND SHOULD BE FOLLOWED BY AN EOL CHAR


CMD:	.CHCRT,,DDBMAN+EC	;DO A RESCAN NOW (CARRIAGE-RETURN)
	.CHESC,,CMDESC		;FREEZE THE SCREEN (ALTMODE)
IFN FTSPACE,<
	.CHTAB,,CMDWAT		;GO GET THE NEXT COMMAND
	   " ",,CMDWAT		;GO GET THE NEXT COMMAND >
	   "+",,CMDNXT+EC	;OUTPUT NEXT PAGE
	   "-",,CMDLST+EC	;OUTPUT PREVIOUS PAGE
	   "A",,CMDALL+EC	;GO DO THE NORMAL JOB SEQUENCE
	   "D",,CMDDSP		;SET UP A NEW OUTPUT DISPLAY
	   "F",,CMDFIL		;SET UP TO TEST FOR A FILE SPECIFICATION
	   "G",,CMDGOD		;COMPLEMENT THE GOD BIT
	   "H",,CMDHLP+EC	;SET TO PRINT A HELP MESSAGE
	   "J",,CMDJOB		;SET UP TO TEST FOR A JOB
	   "K",,CMDKIL+EC	;KILL THE DISPLAY AND THE JOB
	   "L",,CMDLOG		;SET UP TO TEST FOR A LOGGED IN JOB
	   "N",,CMDNOT		;SET UP TO TEST FOR A NOT LOGGED IN JOB
IFN FTPATH,<
	   "P",,CMDPTH+EC	;COMPLEMENT THE PATH BIT >
	   "S",,CMDSLP		;GO GET THE SLEEP TIME
IFN FTTITLE,<
	   "T",,CMDTTL+EC	;COMPLEMENT THE OUTPUT OF THE TITLE >
IFN FTWHAT,<
	   "W",,CMDWHT+EC	;COMPLEMENT THE COMMAND BUFFER BIT >
CMDSIZ==.-CMD
;HERE ON A "-" COMMAND - DECREMENT THE DISPLAY BY ONE PAGE

CMDLST:	SOSGE	PAGNUM		;DECREMENT THE PAGE POINTER


;HERE ON A "+" COMMAND - ADVANCE THE DISPLAY BY ONE PAGE

CMDNXT:	AOS	PAGNUM		;INCREMENT THE PAGE POINTER
	PUSHJ	P,PAGADJ	;SET UP THE PAGE BOUNDARY
	JRST	CMDNOW		;DO A RESCAN NOW


;HERE ON A "G" COMMAND - COMPLEMENT THE 'GOD' BIT

CMDGOD:	PUSHJ	P,WLDSIX	;GO GET THE PASSWORD
	 JRST	CMDERR		;ERROR WHILE GETTING THE PASSWORD
	PUSHJ	P,TSTEO0	;GO TEST FOR AN E-O-L CHARACTER
	 JRST	CMDERR		;ERROR, NOT AN E-O-L CHARACTER
	CAXE	T1,PASWRD	;SKIP IF THE RIGHT PASSWORD WAS INPUT
	JRST	CMDERR		;GO GIVE A COMMAND ERROR
	TXC	F,F.GOD		;COMPLEMENT THE GOD BIT
	JRST	CMDNOW		;GO DO A RESCAN


;HERE ON A CONTROL-C OR CONTROL-Z COMMAND - ABORT THE PROGRAM

CMDABT:	TXO	F,F.DCT		;DON'T CLEAR THE TERMINAL INPUT BUFFER
	CLRBFO			;CLEAR THE OUTPUT BUFFER
	PUSHJ	P,@TRMCLR(P1)	;GO CLEAR THE SCREEN
CMDAB0:	SETZM	INTBLK+.EROPC	;ALLOW MORE CONTROL-C'S
	PUSHJ	P,RSTTRM	;GO RESTORE THE TRMINAL CHARACTERISTICS
CMDAB1:	TXZN	F,F.DCT		;SKIP IF BUFFER ISN'T TO BE CLEARED
	CLRBFI			;CLEAR THE INPUT BUFFER
IFN FTDEBUG,<
	TXNN	F,F.DDT		;SKIP IF DDT IS LOADED >
	RELEASE	TTY,		;RELEASE THE TTY
	SETZM	.JBINT##	;DISABLE CONTROL-C INTERCEPT
	MONRT.			;RETURN TO MONITOR MODE
	JRST	DDBDPY		;RESTART THE PROGRAM ON A CONTINUE


;HERE ON A "W" COMMAND - COMPLMENT THE 'WHAT' BIT

IFN FTWHAT,<
CMDWHT:	TXC	F,F.WHT		;COMPLEMENT THE COMMAND BUFFER BIT
	JRST	CMDNOW		;DO A RESCAN NOW >
;HERE ON A "N" COMMAND - CHANGE THE LOGGED IN PPN NOT TO DISPLAY

CMDNOT:	TXNE	F,F.GOD		;SKIP IF NOT GOD
	PUSHJ	P,SCAN		;GO GET THE PPN
	 JRST	CMDERR		;AN ERROR INFORM THE USER
	TXNE	F,F.PPN		;SKIP IF A PPN WASN'T INPUT
	JRST	CMDNO0		;SKIP SOME CODE
	MOVE	T1,MYPPN	;GET MY PPN
	MOVEM	T1,XDIR		;SAVE FOR
	SETOM	XDIRMSK		; 'TSTNOT'
CMDNO0:	MOVEI	T1,TSTNOT	;SET UP TO GET THE NOT LOGGED IN PPN
	MOVEM	T1,XROUTIN	;SAVE FOR LATER
	JRST	CMDFI0		;GO SET EVERYTHING RIGHT


;HERE ON A "L" COMMAND - CHANGE THE LOGGED IN PPN TO DISPLAY

CMDLOG:	SKIPA	T1,[TSTLOG]	;SET UP TO GET THE LOGGED IN PPN


;HERE ON A "F" COMMAND - CHANGE THE FILE SPECIFICATION TO DISPLAY

CMDFIL:	MOVEI	T1,TSTFIL	;SET UP TO TEST A FILE SPECIFICATION
	MOVEM	T1,XROUTIN	;SAVE FOR LATER
	PUSHJ	P,SCAN		;TO SCAN THE FILE SPECIFICATION
	 JRST	CMDERR		;ERROR IN SPECIFICATION
CMDFI0:	MOVE	T1,[XROUTI,,ROUTIN]  ;SET TO STORE THE SPECIFICATION
	BLT	T1,BLTEND	     ; IN THE RIGHT PLACE
IFN FTJOB,<
	TXZ	F,F.JOB		;ZERO THE JOB DISPLAY FLAG >
CMDFI1:	TXO	F,F.WLD		;SET THE WILD FLAG
CMDFI2:	SETZM	PAGNUM		;START ON PAGE ONE
	PUSHJ	P,PAGADJ	;SET UP THE PAGE BOUNDARY
CMDFI3:
IFN FTWHAT,<
	PUSHJ	P,CMDOUT	;GO BUILD THE COMMAND STRING BUFFER >
	JRST	CMDNOW		;GO DO A RESCAN
;HERE ON A "J" COMMAND - CHANGE THE JOB NUMBER TO DISPLAY

CMDJOB:	PUSHJ	P,DECIN		;GO GET A DECIMAL NUMBER
	 JRST	CMDERR		;JUMP IF NO EOL SEEN
	CAIG	T1,^D0		;SKIP IF NOT JOB ZERO
	MOVE	T1,CURJOB	;CONVERT JOB ZERO INTO MY JOB NUMBER
	CAMLE	T1,JOBMAX	;SKIP IF THE JOB NUMBER IS .LT. JOBMAX
	JRST	CMDERR		;JUMP IF JOB NUMBER IS OUT OF RANGE
	MOVEM	T1,JOBNUM	;SAVE THE JOB NUMBER FOR LATER
	MOVE	T1,IDIR		;GET THE DEFAULT
	MOVEM	T1,DIR		; DIRECTORY
	MOVE	T1,IDIRMSK	;GET THE DEFAULT
	MOVEM	T1,DIRMSK	; DIRECTORY MASK
	MOVEI	T1,TSTJOB	;SET UP TO TEST FOR A JOB
	MOVEM	T1,ROUTIN	;SAVE FOR LAVER
IFN FTJOB,<
	TXO	F,F.JOB!F.PAS!F.SRH  ;SET SOME JOB DISPLAY FLAGS >
	JRST	CMDFI1		;CLEAR THE PAGE COUNTER AND DO A RESCAN


;HERE ON AN "A" COMMAND - DISPLAY ALL DDB'S

CMDALL:	TXNN	F,F.GOD		;SKIP IF GOD
	JRST	CMDERR		;GO INFORM USER NOT A VALID COMMAND
	TXZ	F,F.WLD!F.JOB	;CLEAR THE WILD AND JOB DISPLAY FLAGS
	JRST	CMDFI2		;CLEAR THE PAGE COUNTER AND DO A RESCAN


;HERE ON A "H" COMMAND - DISPLAY A HELP TEXT

CMDHLP:	PUSHJ	P,@TRMCLR(P1)	;GO CLEAR THE SCREEN
	OUTSTR	HLPBUF		;OUTPUT THE HELP MESSAGE
	PUSHJ	P,@TRMHOM(P1)	;GO HOME THE TERMINAL
	TXO	F,F.CLR		;CLEAR THE SCREEN BEFORE NEXT SCAN
	JRST	CMDWAT		;GO WAIT FOR A COMMAND


;HERE ON A "K" COMMAND - KILL THE DISPLAY AND THE JOB

CMDKIL:	PUSHJ	P,CLRLIN	;CLEAR TO THE END OF THE COMMAND LINE
	PUSHJ	P,@TRMCLR(P1)	;CLEAR THE TERMINAL
	PUSHJ	P,RSTTRM	;GO RESTORE THE TERMINAL CHARACTERISTICS
	MOVEI	T1,LGOBLK	;SET UP THE RUN
	RUN	T1,UU.PHY	; THE LOGOUT CUSP
	 HALT	.		;NO 'SYS:LOGOUT'
;HERE ON A "S" COMMAND - CHANGE THE SLEEP TIME BETWEEN DISPLAYS

CMDSLP:	PUSHJ	P,DECIN		;GO GET A DECIMAL NUMBER
	 JRST	CMDERR		;NO END-OF-LINE, GO INFORM USER
	CAILE	T1,^D60		;SKIP IF LESS THAN 61 SECONDS
	JRST	CMDERR		;ERROR IF THE TIME IS GREATER THAN 60
	IMULI	T1,^D1000	;CONVERT TO MILLISECONDS
	CAIN	T1,^D0		;SKIP IF THE SLEEP TIME ISN'T ZERO
	MOVEI	T1,^D250	;SET THE SLEEP TIME TO 250 MILLISECONDS
	HRRM	T1,HIBTIM	;SAVE FOR LATER
IFN FTSLEEP,<
	TXNN	F,F.GOD		;SKIP IF GOD
	CAXL	T1,SLPMIN	;SKIP IF LESS THE MINIMUM SLEEP TIME
	TDZA	T1,T1		;DON'T ADJUST THE SLEEP TIME
	MOVX	T1,SLPSCN	;SET THE SLEEP
	MOVEM	T1,SLPCNT	; TIME COUNTER >
	JRST	CMDFI3		;GO UPDATE THE SCREEN NOW


;HERE ON A "ESCAPE" COMMAND - FREEZE THE SCREEN

IFN FTESCAPE,<
CMDESC:	TXO	F,F.ESC		;PAUSE AFTER UPDATING THE SCREEN
	JRST	DDBMAN		;GO UPDATE THE SCREEN NOW >
IFE FTESCAPE,<
CMDESC==CMDWAT	;FREEZE THE SCREEN AND WAIT FOR A NEW COMMAND >


;HERE ON A "D" COMMAND - CHANGE THE TYPE OF DISPLAY

CMDDSP:	PUSHJ	P,WLDSIX	;GO GET THE NEW DISPLAY TYPE
	 JRST	CMDERR		;ERROR WHILE SEACHING FOR A DISPLAY TYPE
	PUSHJ	P,TSTEO0	;TEST FOR AN E-O-L CHARACTER
	 JRST	CMDERR		;ERROR, NOT AN E-O-L CHARACTER
	JUMPE	T1,CMDDS1	;JUMP IF THE DEFAULT DISPLAY IS TO BE USED
	MOVE	T2,[-DSPSIZ,,DSPNAM]  ;INFORM TSTABR WHAT TO MATCH
	PUSHJ	P,TSTABR	;GO FIND OUT WHICH ONE MATCHES
	 JRST	CMDERR		;NO MATCH OR NOT UNIQUE
	HLRZ	P1,DSPNUM(T2)	;SET UP THE DISPLAY OFFSET
CMDDS0:	PUSHJ	P,SETDSP	;GO SET UP THE SCREEN SIZE
	JRST	CMDFI2		;GO CLEAR THE PAGE NUMBER AND DO A RESCAN
CMDDS1:	PUSHJ	P,TRMDSP	;GO READ THE DEFAULT DISPLAY TYPE
	JRST	CMDFI2		;GO CLEAR THE PAGE NUMBER AND DO A RESCAN
;HERE ON A "P" COMMAND - CHANGE THE DISPLAY OF THE ENTIRE PATH

IFN FTPATH,<
CMDPTH:	TXC	F,F.PTH		;COMPLEMENT THE ENTIRE PATH BIT
	JRST	CMDDS0		;GO SET UP THE SCREEN SIZE >


;HERE ON A "T" COMMAND - CHANGE THE DISPLAY OF THE TITLE LINE

IFN FTTITLE,<
CMDTTL:	TXC	F,F.TTL		;COMPLEMENT THE TITLE BIT
	JRST	CMDDS0		;GO SET UP THE SCREEN SIZE >


;HERE TO SLEEP FOR AWHILE

CMDFIN:	MOVE	T1,HIBTIM
	HIBER	T1,		;HIBERNATE AWHILE
	 JFCL			;NO - PUNT IT
	INCHSL	C		;SKIP IF INPUT MADE ME WAKE UP
	 JRST	DDBMAN		;NO - GO DO A RESCAN
	JRST	CMDTST		;GO TEST THIS NEW COMMAND


;HERE TO SEE IF THE SCREEN SHOULD BE UPDATED NOW

CMDNOW:
IFN FTSPACE,<
	CAIE	C," "		;SKIP IF THE CHARACTER IS AN SPACE
	CAIN	C,.CHTAB	;SKIP IF THE CHARACTER IS A TAB
	JRST	CMDWAT		;GO WAIT FOR A NEW COMMAND >
	CAIN	C,.CHESC	;SKIP IF THE CHARACTER ISN'T AN ESCAPE
	JRST	CMDWAT		;GO WAIT FOR A NEW COMMAND
	JRST	DDBMAN		;GO UPDATE THE SCREEN NOW!!!
SUBTTL	SUBROUTINE TO INPUT A FILE SPECIFICATION


SCAN:	MOVE	T1,[INOD,,XNOD]	;SET UP THE INITIAL CONDITIONS
	BLT	T1,XBLTEND	; FOR SCAN - ALL:*.*[MYPPN]
	TXZ	F,F.NOD!F.DEV!F.FIL!F.EXT!F.PPN  ;CLEAR SOME FLAGS

SCAN0:	PUSHJ	P,WLDSIX	;GO READ A SIXBIT WORD
	 POPJ	P,		;ERROR IN THE SIXBIT ROUTINE
	CAIE	C,"["		;SKIP IF AN OPEN BRACKET
	CAIN	C,"<"		;SKIP IF NOT AN OPEN CARROT
	JRST	SCNDIR		;GO PROCESS IT
IFE <MONVER-603>*<MONVER-700>,<
	CAIN	C,"_"		;SKIP IF NOT A BACKARROW (UNDERSCORE)
	JRST	SCNNOD		;GO PROCESS IT >
	CAIN	C,":"		;SKIP IF NOT A COLON
	JRST	SCNDEV		;GO PROCESS IT
SCAN1:	CAIN	C,"."		;SKIP IF NOT AN PERIOD
	JRST	SCNFIL		;GO PROCESS IT
SCAN2:	PUSHJ	P,TSTEO0	;GO SEE IF AN EOL WAS FOUND
	 POPJ	P,		;NO E-O-L - ERROR RETURN

SCNEXT:	TXNE	F,F.FIL		;SKIP IF NO FILE-NAME SEEN
	JRST	SCNEX0
	JUMPE	T1,.POPJ1	;JUMP IF DEFAULT NAME IS WANTED
	TXO	F,F.FIL		;SET THE FILE SEEN FLAG
	MOVEM	T1,XFIL		;SAVE FOR LATER
	MOVEM	T2,XFILMSK	;SAVE FOR LATER
	PJRST	.POPJ1		;GIVE A GOOD RETURN
SCNEX0:	TXO	F,F.EXT		;SET THE EXTENSION SEEN FLAG
	HLR	T1,T2		;GET THE EXTENSION MASK
	MOVEM	T1,XEXT		;SAVE FOR LATER
	CAME	T1,['UFD',,-1]	;SKIP IF THE EXTENSION IS 'UFD'
	PJRST	.POPJ1		;GIVE A GOOD RETURN
	MOVE	T1,[1,,1]	;MOVE THE
	EXCH	T1,XDIR		; DIRECTORY
	MOVEM	T1,XFIL		; TO THE FILE
	SETO	T1,		; NAME AND [1,1]
	EXCH	T1,XDIRMSK	; TO THE
	MOVEM	T1,XFILMSK	; DIRECTORY
	PJRST	.POPJ1		;GIVE A GOOD RETURN
IFE <MONVER-603>*<MONVER-700>,<
SCNNOD:	TXON	F,F.NOD		;SKIP IF THE NODE FLAG IS SET
	TXNE	F,F.DEV!F.FIL!F.PPN  ;SKIP IF NON ARE SET
	POPJ	P,		;ERROR RETURN
	JUMPE	T1,.POPJ	;NULL NODE IS ILLEGAL - ERROR RETURN
	MOVEM	T1,XNOD		;SAVE FOR LATER
	MOVEM	T2,XNODMSK	; ..
	JRST	SCAN0		;GO LOOK FOR MORE >

SCNDEV:	TXON	F,F.DEV		;SKIP IF THE DEVICE FLAG IS SET
	TXNE	F,F.FIL!F.PPN	;SKIP IF NON ARE SET
	POPJ	P,		;ERROR RETURN
	JUMPE	T1,.POPJ	;NULL DEVICE IS ILLEGAL - ERROR RETURN
	CAMN	T1,IDEV		;SKIP IF THE DEVICE ISN'T 'ALL'
	JRST	SCAN0		;GO LOOK FOR MORE
	MOVEM	T1,XDEV		;SAVE FOR LATER
	MOVEM	T2,XDEVMSK	; ..
	JRST	SCAN0		;GO LOOK FOR MORE

SCNFIL:	TXOE	F,F.FIL		;SKIP IF I HAVEN'T BEEN HERE BEFORE
	POPJ	P,		;ERROR RETURN
	JUMPE	T1,SCAN0	;JUMP IF THE DEFAULT NAME IS WANTED
	MOVEM	T1,XFIL		;SAVE FOR LATER
	MOVEM	T2,XFILMSK	; ..
	JRST	SCAN0		;GO LOOK FOR MORE
SCNDIR:	TXOE	F,F.PPN		;SKIP IF I HAVEN'T BEEN HERE BEFORE
	POPJ	P,		;ERROR RETURN
	PUSHJ	P,WLDOCT	;GO GET THE PROJECT NUMBER THEN
	CAIE	C,","		;SKIP IF A COMMA
	POPJ	P,		;ERROR RETURN
	CAMN	T3,[-1,,0]	;SKIP IF THE PROJECT NUMBER ISN'T ZERO
	HLRO	T3,MYPPN	;USE MY PROJECT NUMBER THEN
IFN FTPROJ,<
	TXNE	F,F.GOD		;SKIP IF NOT A PRIVILEGED USER
	JRST	SCNDI0
	HLRO	T4,MYPPN	;GET THE UESR'S PROJECT NUMBER
	CAME	T3,T4		;SKIP IF THE INPUT PROJECT AND THE
				; USER'S PROJECT NUMBER DON'T MATCH
	POPJ	P,		;ERROR RETURN >
SCNDI0:	HRLZM	T3,XDIR		;SAVE FOR LATER
	HLLZM	T3,XDIRMSK	; ..
	PUSHJ	P,WLDOCT	;GO GET THE PROGRAMMER NUMBER THEN
	CAMN	T3,[-1,,0]	;SKIP IF THE PROGRAMMER NUMBER ISN'T ZERO
	HRRO	T3,MYPPN	;USE MY PROGRAMMER NUMBER THEN
IFN FTPROG,<
	TXNE	F,F.GOD		;SKIP IF NOT A PRIVILEGED USER
	JRST	SCNDI1
	HRRO	T4,MYPPN	;GET THE UESR'S PROGRAMMER NUMBER
	CAME	T3,T4		;SKIP IF THE INPUT PROGRAMMER AND THE
				; USER'S PROGRAMMER NUMBER DON'T MATCH
	POPJ	P,		;ERROR RETURN >
SCNDI1:	HRRM	T3,XDIR		;SAVE FOR LATER
	HLRM	T3,XDIRMSK	; ..
REPEAT 0,<			;		**** SAVE T1-T2 ****
	PUSH	P,P1		;SAVE P1
	MOVSI	P1,-<LIMLVL+1>	;SET UP A COUNTER
SCNDI2:	CAIE	C,","		;SKIP IF THE CHARACTER IS A COMMA
	JRST	SCNDI4		;GO TEST FOR EOL
	AOBJP	P1,SCNDI3	;JUMP IF TOO MANY SFD
	PUSHJ	P,WLDSIX	;GO READ THE SFD NAME
	 JRST	SCNDI3		;ERROR IN SFD NAME
	JUMPE	T1,SCNDI3	;NULL SFD IS AN ILLEGAL
	MOVEM	T1,XDIR+1(P1)	;SAVE THE SFD NAME
	MOVEM	T2,XDIRMSK+1(P1);SAVE THE SFD MASK
	JRST	SCNDI2		;LOOP BACK FOR MORE
SCNDI3:	POP	P,P1		;RESTORE P1
	POPJ	P,		;ERROR RETURN
SCNDI4:	POP	P,P1		;RESTORE P1 >
	CAIE	C,"]"		;SKIP IF THE BREAK CHARACTER WAS A "]"
	CAIN	C,">"		;SKIP IF THE BREAK CHARACTER WASN'T A ">"
	JRST	[XCT	INCHR		;GET THE NEXT CHARACTER THEN
		 JRST	SCAN1]		;GO TEST FOR A "."
	JRST	SCAN2		;GO TEST FOR AN E-O-L
SUBTTL	THE INPUT SUBROUTINES


;HERE TO INPUT A NUMBER

OCTIN:	SKIPA	T3,EIGHT	;SET UP OF OCTAL INPUT
DECIN:	MOVEI	T3,^D10		;SET UP OF DECIMAL INPUT
RDXIN:	SETZ	T1,		;CLEAR THE INPUT BUFFER
RDXIN0:	XCT	INCHR		;GET A CHARACTER
	CAIL	C,"0"		;SKIP IF LESS THAN AN ASCII ZERO
	CAIL	C,"0"(T3)	;SKIP IF LESS THAN THE RADIX OF INPUT
	PJRST	TSTEO0		;GO TEST FOR EOL
	IMULI	T1,(T3)		;MULIPLY BY THE RADIX
	ADDI	T1,-"0"(C)	;ADD IN THE NEW DIGIT
	JRST	RDXIN0		;GO GET ANOTHER CHAR


;HERE TO INPUT A WILD OCTAL NUMBER

WLDOCT:	MOVSI	T3,-1		;SET UP THE DEFAULT NUMBER
	MOVEI	T4,^D7		;SET UP A CHARACTER COUNTER
WLDOC0:	SOJL	T4,.POPJ	;RETURN IF MORE THAN SIX DIGITS INPUT
	XCT	INCHR		;GET A CHARACTER
	CAIL	C,"0"		;SKIP IF LESS THAN A "0"
	CAILE	C,"7"		;SKIP IF LESS THAN AN "8"
	JRST	WLDOC1
	LSH	T3,3		;MULTIPLY BY 8
	TLO	T3,7		;PUT A 7 IN THE MASK
	ORI	T3,-"0"(C)	;ADD IN THE LAST NUMBER
	JRST	WLDOC0		;GO GET ANOTHER NUMBER
WLDOC1:	CAIN	C,"*"		;SKIP IF NOT AN ASTRISK
	JRST	WLDOC2
	CAIE	C,"?"		;SKIP IF A QUESTION MARK
	POPJ	P,		;RETURN
	LSH	T3,3		;MULTIPLY BY 8
	JRST	WLDOC0		;LOOP FOR MORE DIGITS
WLDOC2:	CAME	T3,[-1,,0]	;SKIP IF THE DEFAULT NUMBER
	POPJ	P,		;ERROR RETURN
	SETZ	T3,		;SET THE '*' FLAG
	XCT	INCHR		;GET THE NEXT CHARACTER
	POPJ	P,		;RETURN
;HERE TO INPUT A WILD SIXBIT WORD

WLDSIX:	TXZ	F,F.AST		;RESET THE ASTRISK FLAG
	SETZ	T1,		;RESET THE SIXBIT WORD
	SETO	T2,		;RESET THE MASK WORD
	MOVE	T3,[POINT 6,T1]	;SET UP A BYTE POINTER

WLDSI0:	XCT	INCHR		;GET A CHARACTER FROM THE USER
	CAIL	C,"a"		;SKIP IF LESS THAN A LOWER CASE A
	CAILE	C,"z"		;SKIP IF LESS THAN A LOWER CASE Z
	JRST	WLDSI3		;GO STORE THE CHARACTER
	MOVEI	C,"A"-"a"(C)	;CONVERT LOWER CASE TO UPPER CASE

WLDSI1:	TXNE	F,F.AST		;SKIP IF AN ASTRISK HAS BEEN INPUT
	POPJ	P,		;ERROR
WLDSI2:	MOVEI	C,' '-" "(C)	;CONVERT ASCII TO SIXBIT
	TXNE	T3,77B5		;SKIP IF THE SIXBIT WORD IS FULL
	IDPB	C,T3		;STORE THE CHARACTER
	JRST	WLDSI0		;GO GET THE NEXT CHARACTER

WLDSI3:	CAIG	C,"Z"		;SKIP IF GREATER THAN A "Z"
	CAIGE	C,"0"		;SKIP IF GREATER THAN A "0"
	JRST	WLDSI4		;GO TEST FOR AN "*" OR "?"
	CAIGE	C,"A"		;SKIP IF GREATER THAN A "A"
	CAIG	C,"9"		;SKIP IF GREATER THAN A "9"
	JRST	WLDSI1		;GO STORE THE CHARACTER

WLDSI4:	CAIN	C,"*"		;SKIP IF NOT AN ASTRISK
	JRST	WLDAST		;GO PROCESS THE ASTRISK
	CAIE	C,"?"		;SKIP IF A QUESTION MARK
	PJRST	.POPJ1		;GIVE A GOOD RETURN

WLDQST:	TXNE	F,F.AST		;SKIP IF THE ASTRISK FLAG ISN'T SET
	POPJ	P,		;ERROR RETURN
	MOVX	T4,77B5		;SET UP THE QUESTION MARK MASK
	JRST	WLDAS0		;TO STORE THE CHARACTER AND MASK

WLDAST:	TXOE	F,F.AST		;SKIP IT ASTRISK FLAG ISN'T SET AND SET IT
	POPJ	P,		;ERROR RETURN
	SETO	T4,		;SET THE MASK FLAG
WLDAS0:	LDB	T5,[POINT 6,T3,5]  ;GET THE LOCATION OF THE BYTE
	LSH	T4,-^D36(T5)	;POSITION THE MASK
	XOR	T2,T4		;STORE THE MASK
	JRST	WLDSI2		;TO STORE THE CHARACTER
SUBTTL	THE OUTPUT SUBROUTINES


;HERE TO OUTPUT A PPN

PPNOUT:	SETZ	T4,		;CLEAR THE JUSTIFY COUNTER
PPNJST:	HLRZ	T1,T5		;SET TO OUTPUT THE PROJ NUMBER
	PUSHJ	P,OCTJST	;OUTPUT THE PROJ NUMBER
	PUSHJ	P,COMOUT	;OUTPUT A COMMA
	MOVEI	T1,(T5)		;SET UP TO OUTPUT THE PROG NUMBER


;HERE TO OUTPUT A NUMBER

OCTOUT:	TDZA	T4,T4
DECOUT:	TDZA	T4,T4

OCTJST:	SKIPA	T3,EIGHT	;SET UP FOR OCTAL OUTPUT
DECJST:	MOVEI	T3,^D10		;SET UP FOR DECIMAL OUTPUT
RDXJST:	JUMPGE	T1,RDXJS0	;JUMP IF THE NUMBER OF POSITIVE
	MOVNS	T1		;MAKE THE NUMBER POSITIVE
	SOJ	T4,		;DECREMENT COLUMN COUNTER
	TXOA	F,F.NEG		;SET THE NEGATIVE FLAG AND SKIP
RDXJS0:	TXZ	F,F.NEG		;CLEAR THE NEGATIVE FLAG
RDXJS1:	SOJ	T4,		;DECREMENT COLUMN COUNTER
	IDIVI	T1,(T3)		;GET A DIGIT
	MOVEI	C,"0"(T2)	;CONVERT BINARY TO ASCII
	HRLM	C,(P)		;SAVE FOR LATER
	JUMPE	T1,RDXJS3	;JUMP IF NO MORE DIGITS TO OUTPUT
	PUSHJ	P,RDXJS1	;GO GET ANOTHER DIGIT
RDXJS2:	HLRZ	C,(P)		;GET A DIGIT AND FALL INTO CHROUT


;HERE TO OUTPUT A CHAR

CHROUT:	AOJ	CC,		;INCREMENT THE COLUMN COUNTER
	IDPB	C,BP		;SAVE THE CHAR
EIGHT:	POPJ	P,8		;A CONSTANT FOR OCTOUT AND OCTJST


RDXJS3:	JUMPLE	T4,RDXJS5	;JUMP IF NO SPACES TO OUTPUT
	MOVEI	C," "
RDXJS4:	PUSHJ	P,CHROUT	;OUTPUT A SPACE
	SOJG	T4,RDXJS4	;JUMP IF MORE SPACES TO OUTPUT
RDXJS5:	TXNN	F,F.NEG		;SKIP IF THE NEGATIVE FLAG IS SET
	JRST	RDXJS2		;GO OUTPUT SOME DIGITS
	MOVEI	C,"-"		;OUTPUT A
	PUSHJ	P,CHROUT	; NEGATIVE SIGN
	JRST	RDXJS2		;GO OUTPUT SOME DIGITS
;HERE TO JUSTIFY THE OUTPUT

JUST:	SUBI	T1,(CC)		;GET THE NUMBER OF SPACES NEEDED
	JUMPLE	T1,.POPJ	;JUMP IF NONE TO OUTPUT
	MOVEI	C," "
JUST0:	PUSHJ	P,CHROUT	;OUTPUT A SPACE
	SOJG	T1,JUST0	;LOOP IF MORE SPACES TO OUTPUT
	POPJ	P,		;RETURN


;HERE TO OUTPUT AN ASCIZ STRING

ASCOUT:	TLOA	T1,(POINT 7)	;SET UP THE BYTE POINTER
ASCOU0:	PUSHJ	P,CHROUT	;OUTPUT THE CHAR
	ILDB	C,T1		;GET THE NEXT CHAR
	JUMPN	C,ASCOU0	;GO OUTPUT THE CHAR IF NON-NULL
	POPJ	P,		;RETURN


;HERE TO OUTPUT A SIXBIT WORD

SIXOU0:	SETZ	T2,		;CLEAR A SHIFT REGISTER
	ROTC	T1,6		;GET THE CHAR INTO T2
	MOVEI	C," "-' '(T2)	;CONVERT FROM SIXBIT TO ASCII
	PUSHJ	P,CHROUT	;OUTPUT THE CHAR
SIXOUT:	JUMPN	T1,SIXOU0	;LOOP FOR MORE CHARACTERS
	POPJ	P,		;RETURN


;HERE TO START OFF A TITLE LINE RIGHT

TTLLIN:	MOVEI	BP,(LC)		     ;MAKE A BYTE
	IMULI	BP,LINSIZ	     ; POINTER TO THE
	ADD	BP,[POINT 7,TTLBUF]  ; CURRENT LINE
	SETZ	CC,		;RESET THE COLUMN COUNT
	POPJ	P,		;RETURN

;HERE TO START OFF A LINE RIGHT

BEGLIN:	MOVEI	BP,(LC)		     ;MAKE A BYTE
	IMULI	BP,LINSIZ	     ; POINTER TO THE
	ADD	BP,[POINT 7,LINBUF]  ; CURRENT LINE
	SETZ	CC,		;RESET THE COLUMN COUNT
	POPJ	P,		;RETURN

;HERE TO FINISH OFF THE LINE RIGHT

ENDLIN:	MOVX	T1,%HZLHP	;ASSUME A HAZELTINE TERMINAL
	CAXE	P1,%HZLTP	;SKIP IF THE DISPLAY IS FOR A HAZELTINE-2000
	CAXN	P1,%MDLTP	;SKIP IF NOT THE DISPLAY IS FOR A MODULAR ONE
	PUSHJ	P,JUST		;CLEAR THRU COLUMN 68
	MOVEI	T1,[BYTE (7).CHCRT,.CHLFD,0]
	PUSHJ	P,ASCOUT	;OUTPUT A CR-LF
	PJRST	CHROUT		;GO PUT A NULL CHAR IN THE LINE BUFFER
;HERE TO OUTPUT A COMMA

COMOUT:	MOVEI	C,","		;GET A COMMA TO OUTPUT
	PJRST	CHROUT		;OUTPUT IT AND RETURN


;HERE TO OUTPUT A COLON

CLNOUT:	MOVEI	C,":"		;GET A COLON TO OUTPUT
	PJRST	CHROUT		;OUTPUT IT AND RETURN


;HERE TO OUTPUT A SLASH

SLHOUT:	MOVEI	C,"/"		;GET A SLASH TO OUTPUT
	PJRST	CHROUT		;OUTPUT IT AND RETURN


;HERE TO OUTPUT A SPACE

SPAOUT:	MOVEI	C," "		;GET A SPACE TO OUTPUT
	PJRST	CHROUT		;OUTPUT IT AND RETURN


;HERE TO OUTPUT THE LOW OR HIGH SEGMENT SIZE

IFN FTJOB,<
HGHOUT:	TXZA	F,F.LOW		;CLEAR THE LOW SEGMENT FLAG
LOWOUT:	TXO	F,F.LOW		;SET THE LOW SEGMENT FLAG
IFN FTVM,<
	TXNN	F,F.VMS		;SKIP IF A VIRTUAL MEMORY SYSTEM
	JRST	LOWOU0		;USE THE OLD WAY
	MOVE	T1,@GETSWP	;GET THE SWAPPED SIZE
	TXNE	F,F.LOW		;SKIP IF THE HIGH SEGMENT
	JRST	LOWOU3		;RETURN ONLY THE LAST 9 BITS
	MOVX	T1,SS.SHR	;GET THE SHARABLE BIT
	TDNE	T1,@GETSTS	;SKIP IF THE SEGMENT ISN'T SHARABLE
	JRST	LOWOU0		;GO USE THE OLD WAY
	MOVS	T1,@GETSWP	;GET THE SWAPPED SIZE
	JRST	LOWOU3		;RETURN ONLY THE LAST 9 BITS >
LOWOU0:	MOVS	T1,@GETADR	;GET THE PROTECTION REGISTER INFO
	JUMPE	T1,LOWOU1	;JUMP IF ZERO
	TXNE	F,F.LOW		;SKIP IF THE HIGH SEGMENT
	TXNN	P4,JS.SWP	;SKIP IF SWAPPED
	JRST	LOWOU2		;GO CONVERT WORDS TO PAGES OR K
LOWOU1:	MOVE	T1,@GETSWP	;GET THE SWAPPED SIZE
	ANDI	T1,777		;GET ONLY 9 BITS
	JUMPN	T1,DECOUT	;OUTPUT IT IF NON-ZERO
	MOVS	T1,@GETADR	;GET THE PROTECTION REGISTER
LOWOU2:	AOJ	T1,		;ROUND UP THE NEARIST UNIT
	LSH	T1,-^D9		;CONVERT WORDS TO PAGES
	TXNN	F,F.PAG		;SKIP IF KI OR KL
	LSH	T1,-^D1		;CONVERT PAGES TO K
LOWOU3:	ANDI	T1,777		;CLEAR OUT SOME TRASH
	PJRST	DECOUT		; AND OUTPUT THE SIZE >
;HERE TO OUTPUT A TIME VALUE

IFN FTJOB,<
TIMOUT:	TXZ	F,F.DIG		;CLEAR THE DIGIT OUTPUT FLAG
	IDIV	T1,JIFHOR	;GET THE NUMBER OF HOURS
	PUSH	P,T2		;SAVE THE MINUTES AND SECONDS FOR LATER
	JUMPE	T1,TIMOU0	;JUMP IF THE HOURS FIELD IS ZERO
	PUSHJ	P,TWOOUT	;OUTPUT THE HOURS
	PUSHJ	P,CLNOUT	;OUTPUT A COLON
TIMOU0:	POP	P,T1		;RESTORE THE MINUTES AND SECONDS
	IDIV	T1,JIFMIN	;GET THE MINUTES
	PUSH	P,T2		;SAVE THE SECONDS FOR LATER
	TXNN	F,F.DIG		;SKIP IS A DIGIT HAS BEEN OUTPUT
	JUMPE	T1,TIMOU1	;JUMP IF THE MINUTES FIELD IS ZERO
	PUSHJ	P,TWOOUT	;OUTPUT THE MINUTES
	PUSHJ	P,CLNOUT	;OUTPUT A COLON
TIMOU1:	POP	P,T1		;RESTORE THE SECONDS
	IDIV	T1,JIFFIE	;GET THE WHOLE SECONDS
	PUSH	P,T2		;SAVE THE PART OF A SECOND FOR LATER
	PUSHJ	P,TWOOUT	;OUTPUT THE WHOLE SECONDS
	MOVEI	C,"."		;OUTPUT
	PUSHJ	P,CHROUT	; A "."
	POP	P,T1		;RESTORE THE PART OF A SECOND
	IMULI	T1,^D100	;CONVERT TO CENTI-SECONDS
	IDIV	T1,JIFFIE	; AND FALL INTO 'TWOOUT' >


;HERE TO OUTPUT A TWO DIGIT NUMBER IF NEEDED

IFN FTJOB,<
TWOOUT:	TXON	F,F.DIG		;SKIP IF A DIGIT HAS BEEN OUTPUT
	PJRST	DECOUT		;OUTPUT THE NUMBER AND RETURN
	MOVEI	C,"0"		;SET UP TO OUTPUT A ZERO
	CAIGE	T1,^D10		;SKIP IF THE NUMBER IS GREATER THAN 9
	PUSHJ	P,CHROUT	;OUTPUT A ZERO
	PJRST	DECOUT		;OUTPUT THE NUMBER AND RETURN >


;HERE TO JUSTIFY AND OUTPUT A SIXBIT WORD

SIXJST:	PUSHJ	P,JUST		;JUSTIFY TO THE RIGHT COLUMN
	MOVE	T1,T2		;GET THE SIXBIT WORD TO BE OUTPUT
	PJRST	SIXOUT		;NOW OUTPUT IT AND RETURN
;HERE TO OUTPUT THE JOB STATUS

IFN FTJOB,<
JOBOUT:	MOVE	P5,JOBNUM	;GET THE JOB NUMBER
	MOVE	P4,@GETSTS	;GET THE JOB'S STATUS
	TXNN	P4,JS.JNA	;SKIP IF THE JOB NUMBER HAS BE ASSIGNED
	PJRST	.POPJ1		;THE JOB ISN'T IN USE
	SKIPE	P2,@GETTTY	;SKIP IF ON TTY ASSOCIATED WITH THE JOB
	SKIPN	P3,@GETPDB	;SKIP IF THE JOB HAS A PDB
	PJRST	.POPJ1		;THE JOB ISN'T IN USE

	MOVE	T1,['PRG:  ']	;OUTPUT
	PUSHJ	P,SIXOUT	; 'PRG:'
	MOVE	T1,@GETPRG	;GET THE PROGRAM NAME
	PUSHJ	P,SIXOUT	; AND OUTPUT IT

	PUSH	P,P5		;THE SAVE JOB NUMBER FOR LATER
	MOVEI	T1,^D12		;JUSTIFY TO COLUMN
	MOVE	T2,['COR:  ']	; 12 AND OUTPUT
	PUSHJ	P,SIXJST	; 'COR:'
	PUSHJ	P,LOWOUT	;OUTPUT THE LOW SEGMENT SIZE
	SKIPG	P5,@GETSGN	;SKIP IF THERE IS A HIGH SEGMENT
	JRST	JOBOU0		;GO SEE IF SPYING
	MOVEI	C,"+"		;OUTPUT
	PUSHJ	P,CHROUT	; A "+"
	PUSHJ	P,HGHOUT	;OUTPUT THE HIGH SEGMENT SIZE
JOBOU0:	MOVEI	C,"P"		;ASSUME THE CORE IS IN PAGES
	TXNN	F,F.PAG		;SKIP IF A KI OR KL CPU
	MOVEI	C,"K"		;CORE IS IN K'S
	PUSHJ	P,CHROUT	;OUTPUT THE CORE SIZE
	JUMPGE	P5,JOBOU1	;JUMP IF NOT SPYING
	MOVSI	T1,'+S '	;OUTPUT '+S' TO SHOW
	PUSHJ	P,SIXOUT	; JOB IS SPYING
JOBOU1:	POP	P,P5		;RESTORE THE JOB NUMBER
	MOVEI	T1,^D24		;JUSTIFY TO COLUMN
	MOVE	T2,['STS:  ']	; 24 AND OUTPUT
	PUSHJ	P,SIXJST	; 'STS:'
	MOVSI	T1,'^W '	;ASSUME COMMAND WAIT STATE
	TXNE	P4,JS.RUN	;SKIP IF NOT IN A RUN STATE
	MOVSI	T1,'CW '	;ASSUME CORE WAIT STATE
	TXNE	P4,JS.CMW	;SKIP IF NOT IN COMMAND WAIT
	JRST	JOBOU4		;GO OUTPUT THE STATE
	MOVSI	T1,'OW '	;ASSUME OPERATOR WAIT
	TXNE	P4,JS.DCE	;SKIP IF NOT IN OPERATOR WAIT
	JRST	JOBOU4		;GO OUTPUT THE STATE
	MOVSI	T1,'^D '	;ASSUME DAEMON WAIT STATE
	TXNE	P4,JS.JDC	;SKIP IF NOT IN DAEMON WAIT
	JRST	JOBOU4		;GO OUTPUT THE STATE
	MOVSI	T1,'^C '	;ASSUME THE JOB IS STOPPED
	JUMPGE	P4,JOBOU4	;GO OUTPUT THE STATE
	LDB	T1,[POINT 5,P4,14]  ;GET THE STATE OF THE JOB
	IDIVI	T1,^D3		;GET THE WORD THE STATE IS IN
	IMULI	T2,^D12		;GET THE SHIFT VALUE TO GET THE STATE
	MOVE	T1,@GETWSN	;GET THE RIGHT STATE FOR THE JOB
	LSH	T1,(T2)		;GET THE STATE IF THE RIGHT PLACE
	ANDX	T1,7777B11	;CLEAR ANY UNNEEDED BITS
IFE <MONVER-603>*<MONVER-700>,<
	CAME	T1,['EW    ']	;SKIP IF IN A EVENT WAIT STATE
	JRST	JOBOU2		;SKIP THE EW STATE
	LDB	T2,[POINT 5,@GETST2,24]  ;GET THE EVENT WAIT CODE
	JUMPE	T2,JOBOU4	;0 IS UNKNOWN
	CAIG	T2,10		;SKIP IF GREATER THAN THE KNOWN ONE'S
	MOVE	T1,EVWTAB-1(T2)	;GET THE EVENT WAIT STATE
	JRST	JOBOU4		;GO OUTPUT THE STATE >
JOBOU2:	CAME	T1,['SL    ']	;SKIP IF IN A SLEEP STATE
	JRST	JOBOU3		;GO TEST THE 'TI' STATE
	TXNE	P4,JS.CLK	;SKIP IF NOT IS A CLOCK REQUEST QUEUE
	MOVSI	T1,'HB '	;CHANGE THE STATE TO HIBERNATE
	JRST	JOBOU4		;GO OUTPUT THE STATE
JOBOU3:	CAMN	T1,['TI    ']	;SKIP IF NOT TERMINAL I/O WAIT
	SKIPL	HI+DEVIOS(P2)	;SKIP IF OUTPUT WAIT
	JRST	JOBOU4		;GO OUTPUT THE STATE
	MOVSI	T1,'TO '	;CHANGE THE STATE TO TERMINAL OUTPUT
JOBOU4:	PUSHJ	P,SIXOUT	;OUTPUT THE STATE OF THE JOB
				; NOTE - T1 IS ZERO ON RETURN
	TXNE	P4,JS.LOK	;SKIP IF THE JOB ISN'T LOCKED IN CORE
	MOVSI	T1,' LS'	;JOB IS LOCKED IN CORE SHUFFLING ALLOWED
	TXNE	P4,JS.NSH	;SKIP IF THE JOB CAN BE SHUFFLED
	MOVSI	T1,' LK'	;JOB IS LOCKED IN CORE IN PLACE
	JUMPN	T1,JOBOU7	;GO OUTPUT THE STATE OF THE JOB
	TXNN	P4,JS.SWP	;SKIP IF THE JOB IS SWAPPED
	JRST	JOBOU5		;GO SEE IF VIRTUAL
	MOVSI	T1,' SW'	;ASSUME SWAPPED
	SKIPGE	@GETSWP		;SKIP IF NOT FRAGMENTED
	MOVSI	T1,' SF'	;SET THE JOB TO SWAPPED AND FRAGMENTED
JOBOU5:
IFN FTVM,<
	TXNN	F,F.VMS		;SKIP IF A VIRTUAL MEMORY SYSTEM
	JRST	JOBOU7		;GO SEE IF THE STATE SHOULD BE OUTPUT
	HLRZ	T2,@GETVRT	;GET THE VIRTUAL FLAGS FOR THE JOB
	JUMPE	T2,JOBOU7	;JUMP IF NOT VIRTUAL
	JUMPE	T1,JOBOU6	;JUMP IF NOT SWAPPED
	TLNN	T1,'SW'^!'SF'	;SKIP IF NOT FRAGMENTED
	TLCA	T1,'SF'^!'F'^!'M'  ;SET THE STATE TO 'VF'
	TLC	T1,'SW'^!'S'^!'M'  ;SET THE STATE TO 'VS'
JOBOU6:	TLC	T1,'VM'		   ;SET THE STATE TO 'VM' >
JOBOU7:	PUSHJ	P,SIXOUT	;OUTPUT THE STATE OF THE JOB
	MOVEI	T1,^D34		;JUSTIFY TO COLUMN
	MOVE	T2,['RUN:  ']	; 34 AND GET 'RUN:'
	TXNE	F,F.PAS		;SKIP IF NOT PASS ONE
	TRO	T2,' ? '	;CHANGE TO 'RUN:?'
	PUSHJ	P,SIXJST	;OUTPUT THE SIXBIT MESSAGE
	MOVN	T1,@GETTIM	;GET THE RUN TIME OF THE JOB
	EXCH	T1,TOTTIM	;SAVE FOR THE NEXT SCAN
	SUB	T1,TOTTIM	;GET THE INCREMENTAL RUN TIME
	CAIGE	T1,0		;SKIP IF NON-NEGATIVE
	MOVN	T1,TOTTIM	;USE THE TOTAL RUNTIME (ASSUME NEW JOB)
	MOVEM	T1,DELTIM	;SAVE FOR LATER
	TXNN	F,F.PAS		;SKIP IF PASS ONE
	PUSHJ	P,TIMOUT	;OUTPUT THE INCREMENTAL RUN TIME
	PUSHJ	P,SLHOUT	;OUTPUT A SLASH
	MOVN	T1,TOTTIM	;GET THE TOTAL RUN TIME
	PUSHJ	P,TIMOUT	;OUTPUT TOTAL RUN TIME

	MOVEI	T1,^D55		;JUSTIFY TO COLUMN
	MOVE	T2,['CPU:  ']	; 55 AND GET 'CPU:'
	TXNE	F,F.PAS		;SKIP IF NOT PASS ONE
	TRO	T2,' ? '	;CHANGE TO 'CPU:?'
	PUSHJ	P,SIXJST	;OUTPUT THE SIXBIT MESSAGE
	MOVE	T1,DELTIM	;GET THE DELTA RUNTIME
	IMULI	T1,^D100	;SET UP TO GET A PERCENTAGE
	MOVN	T2,@GETDAT	;GET THE DATE
	EXCH	T2,CURDAT	;SAVE FOR THE NEXT SCAN
	SUB	T2,CURDAT	;GET THE DELTA DATE
	PUSHJ	P,ADJTIM	;CONVERT TO THE RIGHT FORMAT
	MOVE	T3,T2		;ROUND THE
	ASH	T3,-^D1		; PERCENTAGE
	ADD	T1,T3		; OF RUNTIME
	IDIV	T1,T2		;GET THE PERCENTAGE OF RUNTIME
	TXNN	F,F.PAS		;SKIP IF PASS ONE
	PUSHJ	P,DECOUT	;OUTPUT THE PERCENTAGE OF RUNTIME
IFGE <MONVER-602>,<
	PUSHJ	P,SLHOUT	;OUTPUT A SLASH
	MOVN	T1,TOTTIM	;GET THE RUNTIME
	IMULI	T1,^D100	;SET UP TO GET A PERCENTAGE
	MOVN	T2,CURDAT	;GET THE LENGTH OF TIME THE
	SUB	T2,@GETJLT	; JOB HAS BEEN LOGGED IN
	PUSHJ	P,ADJTIM	;CONVERT TO THE RIGHT FORMAT
	MOVE	T3,T2		;ROUND THE
	ASH	T3,-^D1		; PERCENTAGE
	ADD	T1,T3		; OF RUNTIME
	IDIV	T1,T2		;GET THE PERCENTAGE
	PUSHJ	P,DECOUT	; OF RUNTIME >
	PUSHJ	P,ENDLIN	;FINISH OFF THE LINE RIGHT
	AOJ	LC,		;INCREMENT THE LINE COUNT
	PUSHJ	P,TTLLIN	;SET UP FOR THE NEW LINE
	MOVE	T1,HI+DEVNAM(P2);GET THE TERMINAL NAME
	HRRZ	T4,HI+DDBLDB(P2);GET THE LINK TO THE TERMINALS LDB
	JUMPE	T4,[HRLI  T1,'DET'	;SAY THE JOB IS DETACHED
		    TXNN  F,F.GOD	;SKIP IF GOD
		    TRZ   T1,-1		;CLEAR THE TERMINAL NUMBER
		    JRST  JOBO10]	;GO OUTPUT THE TERMINAL NAME
IFE <MONVER-700>,<
	PUSHJ	P,GETLDB	;SET SPY-PAGE FOR LDB
>
	MOVE	T2,HI+LDBDCH(T4);GET THE TERMINAL CHARACTERISTIC BITS
	HRL	P2,T2		;SAVE LINE NUMBER
	TLZ	P2,777000	;ISOLATE LINE NUMBER
	TXNN	T2,LDRPTY	;SKIP IF A PTY
	JRST	JOBO10		;NO NEED TO CHANGE ANY THING
	ANDX	T2,777		;REMOVE SOME UNNEEDED BITS
	SUB	T2,PTYMIN	;CONVERT FROM TTY RANGE TO PTY RANGE
	MOVSI	T1,'PTY'	;SET THE TERMINAL TO BE A PTY
	PUSH	P,JOBOU9	;SET UP TO MAKE THE PTY NAME
JOBOU8:	IDIVI	T2,^D8		;GET A DIGIT
	HRLM	T3,(P)		;SAVE IT FOR LATER
	CAIN	T2,0		;SKIP IF NOT FINISHED
	SKIPA	T3,[POINT 6,T1,17]  ;SET UP A TYPE POINTER
	PUSHJ	P,JOBOU8	;LOOP BACK
	HLRZ	T2,(P)		;RESTORE A DIGIT
	MOVEI	T2,'0'(T2)	;CONVERT FROM BINARY TO SIXBIT
	IDPB	T2,T3		;STORE THE DIGIT IN THE NAME
JOBOU9:	POPJ	P,JOBO10	;MAGIC
JOBO10:	PUSHJ	P,SIXOUT	;OUTPUT THE TERINAL NAME

	MOVEI	T1,^D7		;JUSTIFY TO COLUMN
	MOVE	T2,['HPQ:  ']	; 7 AND OUTPUT
	PUSHJ	P,SIXJST	; 'HPQ:'
	LDB	T1,[POINT 4,@GETRTD,9]  ;GET THE HPQ LEVEL
	PUSHJ	P,DECOUT	;OUTPUT THE LEVEL NUMBER

	MOVEI	T1,^D13		;JUSTIFY TO COLUMN
	MOVE	T2,['PRI:  ']	; 13 AND OUTPUT
	PUSHJ	P,SIXJST	; 'PRI:'
	LDB	T1,[POINT 3,@GETSPL,26]  ;GET THE DISK PRIORITY
	TRZE	T1,4		;SKIP IF A POSITIVE PRIORITY
	MOVNS	T1		;NEGATE THE ABSOLUTE VALUE OF THE PRIORITY
	PUSHJ	P,DECOUT	;OUTPUT THE PRIORITY

	MOVEI	T1,^D20		;JUSTIFY TO COLUMN 20
	MOVE	T2,['DSK:E ']	;ASSUME ERROR ON QUOTA EXAUSTED
	TXNE	P4,JS.SFL	;SKIP IF ERROR ON DISK FULL CONDITION
	TRC	T2,'E '^!'P '	;CHANGE ERROR TO PAUSE
	PUSHJ	P,SIXJST	;OUTPUT THE MESSAGE

	MOVEI	T1,^D26		;JUSTIFY TO COLUMN
	MOVE	T2,['DDB:  ']	; 26 AND OUTPUT
	PUSHJ	P,SIXJST	; 'DDB:'
	MOVE	T1,DDBCNT	;OUTPUT THE
	PUSHJ	P,DECOUT	; DDB COUNT
	MOVEI	T1,^D33		;JUSTIFY TO COLUMN 33
	MOVE	T2,['RED:  ']	; AND OUTPUT 'RED:'
	TXNE	F,F.PAS		;SKIP IF NOT PASS ONE
	TRO	T2,' ? '	;CHANGE TO 'RED:?'
	PUSHJ	P,SIXJST	;OUTPUT THE SIXBIT MESSAGE
	LDB	T1,[POINT 24,@GETRCT,35]  ;GET THE NUMBER OF DISK READS
	MOVNS	T1		;NEGATE THE NUMBER THE DISK READS
	EXCH	T1,DSKRED	;SAVE FOR THE NEXT SCAN
	SUB	T1,DSKRED	;GET THE INCREMENTAL DISK READS
	TXNN	F,F.PAS		;SKIP IF PASS ONE
	PUSHJ	P,DECOUT	;OUTPUT THE INCREMENTAL DISK READS
	PUSHJ	P,SLHOUT	;OUTPUT A SLASH
	MOVN	T1,DSKRED	;OUTPUT THE TOTAL
	PUSHJ	P,DECOUT	; DISK READS

	MOVEI	T1,^D49		;JUSTIFY TO COLUMN 49
	MOVE	T2,['WRT:  ']	; AND GET 'WRT:'
	TXNE	F,F.PAS		;SKIP IF NOT PASS ONE
	TRO	T2,' ? '	;CHANGE TO 'WRT:?'
	PUSHJ	P,SIXJST	;OUTPUT THE SIXBIT MESSAGE
	LDB	T1,[POINT 24,@GETWCT,35]  ;GET THE NUMBER OF DISK WRITES
	MOVNS	T1		;NEGATE THE NUMBER THE DISK WRITES
	EXCH	T1,DSKWRT	;SAVE FOR THE NEXT SCAN
	SUB	T1,DSKWRT	;GET THE INCREMENTAL DISK WRITES
	TXNN	F,F.PAS		;SKIP IF PASS ONE
	PUSHJ	P,DECOUT	;OUTPUT THE INCREMENTAL DISK WRITES
	PUSHJ	P,SLHOUT	;OUTPUT A SLASH
	MOVN	T1,DSKWRT	;OUTPUT THE TOTAL
	PUSHJ	P,DECOUT	; DISK WRITES
	PUSHJ	P,ENDLIN	;FINISH THE LINE OFF
	AOJ	LC,		;INCREMENT THE LINE COUNT
IFE <MONVER-603>*<MONVER-700>,<
	PUSHJ	P,TTLLIN	;SET UP FOR THE NEXT LINE

	TXCN	F,F.SRH		;SKIP IF TIME TO OUTPUT THE SEARCH LIST
	JRST	JOBO11		;GO OUTPUT THE CHARACTER COUNTS
	TXNE	F,F.GOD		;SKIP IF NOT GOD
	JRST	JOBO13		;GO OUTPUT THE JOB'S SEARCH LIST
	MOVE	T1,@GETPPN	;GET THE JOB'S PPN
	XOR	T1,DIR		;COMPARE THE PPN
	TDNN	T1,DIRMSK	;SKIP IF NOT A MATCH
	JRST	JOBO13		;GO OUTPUT THE JOBS SEARCH LIST

JOBO11:	MOVE	T1,['ICC:  ']	;OUTPUT
	PUSHJ	P,SIXOUT	; 'ICC:'
IFL <MONVER-700>,<
	MOVE	T1,HI+DDBICC(P2);OUTPUT THE INPUT
>
IFGE <MONVER-700>,<
	HLRZ	T2,P2		;LINE NUMBER
	TRO	T2,.UXTRM	;TURN IT INTO A UDX
	MOVEI	T1,.TOOCT
	MOVE	T5,[3,,T1]	;READ OUTPUT CHARACTER COUNT
	TRMOP.	T5,
	  SETZ	T5,
	PUSH	P,T5		;SAVE OCC
	MOVEI	T1,.TOICT
	MOVE	T5,[3,,T1]
	TRMOP.	T5,		;READ INPUT CHARACTER COUNT
	  SETZ	T5,
	MOVE	T1,T5
>
	PUSHJ	P,DECOUT	; CHARACTER COUNT

	MOVEI	T1,^D12		;JUSTIFY TO COLUMN
	MOVE	T2,['OCC:  ']	; 12 AND OUTPUT
	PUSHJ	P,SIXJST	; 'OCC:'
IFL <MONVER-700>,<
	MOVE	T1,HI+DDBOCC(P2);OUTPUT THE OUTPUT
>
IFGE <MONVER-700>,<
	POP	P,T1		;GET OCC
>
	PUSHJ	P,DECOUT	; CHARACTER COUNT

	MOVEI	T1,^D24		;JUSTIFY TO COLUMN
	MOVE	T2,['CMD:  ']	; 24 AND OUTPUT
	PUSHJ	P,SIXJST	; 'CMD:'
	HLRZ	T1,HI+DDBBCC(P2);OUTPUT THE COMMAND
	PUSHJ	P,DECOUT	; COUNT

	MOVEI	T1,^D33		;JUSTIFY TO COLUMN
	MOVE	T2,['UUO:  ']	; 33 AND OUTPUT
	PUSHJ	P,SIXJST	; 'UUO:'
	MOVE	T1,@GETUUC	;OUTPUT THE UUO
	PUSHJ	P,DECOUT	; COUNT

	MOVEI	T1,^D45		;JUSTIFY TO COLUMN
	MOVE	T2,['KCS:  ']	; 45 AND OUTPUT
	PUSHJ	P,SIXJST	; 'KCS:'
	MOVE	T1,@GETKCT	;OUTPUT THE NON-VM KILO-CORE-SECONDS
	IDIV	T1,JIFFIE	; ..
	PUSHJ	P,DECOUT	; ..
IFN FTVM,<
	TXNN	F,F.VMS		;SKIP IF VM SYSTEM
	JRST	JOBO12		;SKIP SOME VM CODE
	PUSHJ	P,CLNOUT	;OUTPUT A COLON
	MOVE	T1,@GETVKS	;OUTPUT THE VM KILO-CORE-SECONDS
	IDIV	T1,JIFFIE	; ..
	PUSHJ	P,DECOUT	; .. >>

JOBO12:	TXZ	F,F.PAS		;CLEAR THE PASS ONE FLAG
	POPJ	P,		;RETURN 
IFE <MONVER-603>*<MONVER-700>,<
JOBO13:	TXZ	F,F.STR		;RESET THE STRUCTURE OUTPUT FLAG
	MOVE	T5,[POINT 9,HI+.PDJSL(P3)]  ;GET THE POINTER TO THE SEARCH LIST
JOBO14:	ILDB	T3,T5		;GET A FILE STRUCTURE NUMBER
	ANDX	T3,77		;CLEAR SOME FLAGS
	CAIN	T3,.FSTMP	;SKIP IF NOT A TEMPORARY STRUCTURE
	JRST	JOBO14		;GO TRY THE NEXT STRUCTURE
	CAIE	T3,.FSEND	;SKIP IF THE END OF THE SEARCH LIST
	CAIN	T3,.FSFNC	;SKIP IF THE END OF THE ACTIVE SEARCH LIST
	JRST	JOBO12		;FINISHED
	CAIN	T3,.FSSTP	;SKIP IF THE END OF EVERY THING
	JRST	JOBO12		;FINISHED
	HLRZ	T4,@GETSTR
JOBO15:	HRRZ	T2,HI+STRFSN(T4);GET THIS FILE STRUCTURE NUMBER
	CAMN	T2,T3		;SKIP IF NOT A MATCH
	JRST	JOBO16		;YEA! WE FOUND IT
	HLRZ	T4,HI+STRSYS(T4);GET THE POINTER TO THE NEXT STRUCTURE
	JUMPN	T4,JOBO15	;SKIP IF NOT THE END OF THE LINE
	JRST	JOBO14		;WELL I TRIED
JOBO16:	MOVE	T1,HI+STRNAM(T4);GET THE NAME OF THE STRUCTURE
	TXOE	F,F.STR		;SKIP IF THE FIRST STRUCTURE OUTPUT
	LSH	T1,-^D6		;INSERT A SPACE
	PUSHJ	P,SIXOUT	;OUTPUT THE STRUCTURE NAME
	PUSHJ	P,CLNOUT	;OUTPUT A COLON
	MOVE	T1,@GETPPN	;GET THE USER'S PPN
	HLRZ	T2,@GETSPB	;GET THE POINTER TO THE PPB CHAIN
	TRNA			;FAST SKIP
JOBO17:	HLRZ	T2,HI+PPBSYS(T2);GET THE POINTER TO THE NEXT PPB
	JUMPE	T2,JOBO19	;JUMP IF END OF THE CHAIN
	CAME	T1,HI+PPBNAM(T2);SKIP IF THE USER'S PPB
	JRST	JOBO17		;KEEP ON TRUCK'N
	HLRZ	T2,HI+PPBUFB(T2);GET THE POINTER TO THE PPB CHAIN
	TRNA			;FAST SKIP
JOBO18:	HLRZ	T2,HI+UFBPPB(T2);GET THE POINTER TO THE NEXT PPB
	JUMPE	T2,JOBO19	;JUMP IF THE END OF THE CHAIN
	LDB	T1,[POINT 6,HI+UFBFSN(T2),5]  ;GET THE FILE STRUCTURE NUMBER
	CAME	T1,T3		;SKIP IF THE RIGHT STRUCTURE
	JRST	JOBO18		;KEEP ON TRUCK'N
	MOVE	T1,HI+UFBTAL(T2);GET THE LOGIN QUOTA
	CAMLE	T1,HI+STRTAL(T4);SKIP IF SMALLER THAN STRUCTURE FREE
JOBO19:	MOVE	T1,HI+STRTAL(T4);GET THE FREE
	PUSHJ	P,DECOUT	; SPACE LEFT
	JRST	JOBO14		;GO FIND THE NEXT STRUCTURE >>
;HERE TO BUILD THE COMMAND STRING BUFFER

IFN FTWHAT,<
CMDOUT:	PUSH	P,C		;SAVE C FOR LATER
	MOVE	BP,[POINT 7,WHTBUF]  ;SET UP THE POINTER TO THE BUFFER
	SETZ	CC,		;RESET THE BUFFER COUNTER
	TXNN	F,F.WLD		;SKIP IF THE WILD PROCESSOR IS IN USE
	JRST	CMDOU3		;GO INFORM USER
	MOVE	T1,ROUTINE	;GET THE ADDRESS OF THE WILD PROCESSOR
	CAIN	T1,TSTFIL	;SKIP IF NOT THE "F" COMMAND
	JRST	CMDOU1		;GO OUTPUT THE "F" COMMAND STRING
	CAIN	T1,TSTJOB	;SKIP IF NOT THE "J" COMMAND
	JRST	CMDOU2		;GO OUTPUT THE "J" COMMAND STRING
	CAIN	T1,TSTLOG	;SKIP IF NOT THE "L" COMMAND
	JRST	CMDOU0		;GO OUTPUT THE "L" COMMAND STRING

	SKIPA	C,["N"]		;OUTPUT AN "N"

CMDOU0:	MOVEI	C,"L"		;OUTPUT AN "L"
	PUSHJ	P,CHROUT	;THE CHARACTER
	PUSHJ	P,WPPOUT	;GO OUTPUT THE PPN FOR THE "L" COMMAND
	JRST	CMDOU4

CMDOU1:	MOVEI	C,"F"		;OUTPUT
	PUSHJ	P,CHROUT	; THE "F"
	PUSHJ	P,SPCOUT	;GO OUTPUT THE FILE SPEC
	JRST	CMDOU4

CMDOU2:	MOVEI	C,"J"		;OUTPUT
	PUSHJ	P,CHROUT	; THE "J"
	MOVE	T1,JOBNUM	;GO OUTPUT THE JOB NUMBER
	PUSHJ	P,DECOUT	; FOR THE "J" COMMAND
	JRST	CMDOU4

CMDOU3:	MOVEI	C,"A"		;OUTPUT
	PUSHJ	P,CHROUT	; THE "A"
CMDOU4:	MOVSI	T1,' D '	;OUTPUT
	PUSHJ	P,SIXOUT	; THE " D"
	MOVE	T1,DSPNAM(P1)	;OUTPUT THE
	PUSHJ	P,SIXOUT	; DISPLAY NAME

IFN FTPATH,<
	MOVSI	T1,' P '	;SET UP TO OUTPUT A "P" IF IN PATH MODE
	TXNE	F,F.PTH		;SKIP IF NOT IN PATH MODE
	PUSHJ	P,SIXOUT	;OUTPUT A " P" IF A PATH MODE >

	MOVSI	T1,' S '	;OUTPUT
	PUSHJ	P,SIXOUT	; THE " S"
	HRRZ	T1,HIBTIM	;GET THE HIBERNATE TIME
	IDIVI	T1,^D1000	;CONVERT FROM MILLISECONDS TO SECONDS
	PUSHJ	P,DECOUT	;OUTPUT THE TIME

IFN FTTITLE,<
	MOVSI	T1,' T '	;SET UP TO OUTPUT A "T" IF IN TITLE SUPPRESSION
	TXNE	F,F.TTL		;SKIP IF THE TITLE IS WANTED
	PUSHJ	P,SIXOUT	;OUTPUT A " T" IF IN TITLE SUPPRESSION MODE >

	MOVSI	T1,' W '	;OUTPUT
	PUSHJ	P,SIXOUT	; THE " W"

	IDPB	T1,BP		;STORE A NULL CHARACTER IN THE BUFFER
	POP	P,C		;RESTORE C
	POPJ	P,		;RETURN >
;HERE TO OUTPUT A FILE SPECIFICATION

IFN FTWHAT,<
SPCOUT:	MOVE	T1,DEV		;OUTPUT THE
	PUSHJ	P,SIXOUT	; DEVICE NAME
	PUSHJ	P,CLNOUT	;OUTPUT A COLON
	HLRZ	T5,EXT		;GET THE EXTENSION
	CAIN	T5,'UFD'	;SKIP IF NOT 'UFD'
	JRST	[MOVE	T3,FIL		;GET THE FILE NAME
		 MOVE	T4,FILMSK	; AND FILE NAME MASK
		 PUSHJ	P,WPPOU0	;OUTPUT THE NAME AS A UFD
		 JRST	SPCOU0]		;CONTINUE
	MOVE	T1,FIL		;OUTPUT THE
	PUSHJ	P,SIXOUT	; FILE NAME
SPCOU0:	JUMPE	T5,WPPOUT	;JUMP IF THE EXTENSION IS ZERO
	MOVEI	C,"."		;OUTPUT
	PUSHJ	P,CHROUT	; A PERIOD
	MOVSI	T1,(T5)		;OUTPUT THE EXTENSION
	PUSHJ	P,SIXOUT	; AND FALL INTO WPPOUT

WPPOUT:	MOVE	T3,DIR		;GET THE DIRECTORY AND
	MOVE	T4,DIRMSK	; DIRECTORY MASK
WPPOU0:	MOVEI	C,"["		;OUTPUT
	PUSHJ	P,CHROUT	; A "["
	HLLZ	T1,T4		;GET THE PROJECT MASK
	HLR	T1,T3		;GET THE PROJECT NUMBER
	PUSHJ	P,WOCOUT	;OUTPUT THE WILD PROJECT NUMBER
	PUSHJ	P,COMOUT	;OUTPUT A COMMA
	HRLZI	T1,(T4)		;GET THE PROGRAMMER MASK
	HRRI	T1,(T3)		;GET THE PROGRAMMER NUMBER
	PUSHJ	P,WOCOUT	;OUTPUT THE WILD PROGRAMMER NUMBER
	MOVEI	C,"]"		;OUTPUT A "]"
	PJRST	CHROUT		; AND RETURN

WOCOUT:	JUMPE	T1,WOCOU3	;JUMP IF THE NUMBER IS COMPLETELY WILD
	TXZ	F,F.DIG		;CLEAR THE DIGIT SEEN FLAG
	MOVEI	T2,^D6		;SET UP A COUNTER
WOCOU0:	JUMPGE	T1,WOCOU1	;JUMP IF THIS DIGIT IS WILD
	LDB	C,[POINT 3,T1,20]  ;GET A DIGIT
	TXNN	F,F.DIG		;SKIP IF A DIGIT HAS BEEN SEEN
	JUMPE	C,WOCOU2	;JUMP IF THE DIGIT IS A ZERO
	TROA	C,"0"		;CONVERT BINARY TO ASCII AND SKIP
WOCOU1:	MOVEI	C,"?"		;SET UP TO OUTPUT A QUESTION MARK
	TXO	F,F.DIG		;SET THE DIGIT SEEN FLAG
	PUSHJ	P,CHROUT	;OUTPUT THE DIGIT OR QUESTION MARK
WOCOU2:	LSH	T1,^D3		;ADJUST THE MASK
	SOJG	T2,WOCOU0	;LOOP BACK IF NOT FINISHED
	POPJ	P,		;RETURN
WOCOU3:	MOVEI	C,"*"		;SET UP TO OUTPUT AN
	PJRST	CHROUT		; ASTRISK AND RETURN >
SUBTTL	VARIOUS USEFUL SUBROUTINES


;HERE TO TEST FOR AN ABBREVIATED NAME

TSTABR:	SETO	T4,		;RESET A COUNTER

TSTAB0:	LSH	T4,-6		;SHIFT THE MASK ONE CHARACTER TO THE RIGHT
	TDNE	T1,T4		;SKIP IF OUT OF CHARACTERS
	JRST	TSTAB0		;LOOP BACK UNTIL FINISHED

	SETZ	T3,		;CLEAR THE FLAG FOR LATER
	HRRZM	T2,TEMP		;SET THE BASE ADDRESS FOR LATER

TSTAB1:	MOVE	T5,(T2)		;GET A WORD TO TEST
	XOR	T5,T1		;TRY TO CLEAR SOME CHARACTERS
	JUMPE	T5,TSTAB3	;JUMP IF A MATCH WAS FOUND
	ANDCM	T5,T4		;CLEAR ANY CHARACTERS AT THE END OF THE WORD
	JUMPN	T5,TSTAB2	;JUMP IF NOT A VALID ABBREVIATION
	TRON	T3,1		;SKIP A IF NOT THE FIRST MATCH
	TLOA	T3,(T2)		;SET THE FLAG FOR AN ABREVIATION FOUND
	TLZ	T3,-1		;MORE THAN ONE ABBREVIATION FOUND
TSTAB2:	AOBJN	T2,TSTAB1	;LOOP BACK IF NOT FINISHED

	TLNN	T3,-1		;SKIP IF AN ABBREVIATION WAS FOUND
	POPJ	P,		;ERROR - T3 CONTAINS A:
				;	0 - NO ABBREVIATION FOUND
				;	1 - NO UNIQUE ABBREVIATION FOUND

	HLRZ	T2,T3		;SET UP T2 TO POINT TO THE ABBREVIATION
TSTAB3:	SUB	T2,TEMP		;SET UP T2 TO BE 0, 1, 2, ...
	JRST	.POPJ1		;GIVE A GOOD RETURN
;HERE TO GET THE DEFAULT TERMINAL TYPE OF DISPLAY

TRMDSP:	PUSH	P,C		;SAVE C FOR LATER
	MOVEI	P1,DEFTRM	;GET THE DEFAULT TERMINAL TYPE
IFE <MONVER-700>,<
	MOVE	T1,[2,,TRM]
	MOVEI	T2,1041		;ASK THE MONITOR WHAT TYPE TERMINAL WE HAVE
	HRRZM	T2,TRM
	TRMOP.	T1,
	 JRST	E$$TTF		;CAN'T TELL
>
IFN <MONVER-700>,<
	MOVE	P3,[PUSHJ P,SYSIN]  ;SET UP SCAN TO USE 'SYS' INSTEAD
	EXCH	P3,INCHR	    ; OF THE TERMINAL FOR INPUT
	OPEN	SYS,OPNBLK	;GET AN I/O CHANNEL TO 'SYS'
	 JRST	TRMD13		;NO 'SYS'
	SETZM	LOKBLK+.RBPPN	;ZERO THE PPN
	HLLZS	LOKBLK+.RBEXT	;ZERO THE ACCESS AND HI CREATION DATE
	LOOKUP	SYS,LOKBLK	;SEE IF 'DISPLA.INI' IS ON SYS
	 JRST	TRMD12		;NO FILE 'DISPLA.INI'
	MOVEI	T1,SYSBUF	;SET UP TO GET A TWO BUFFER RING
	EXCH	T1,.JBFF##	;FAKE THE MONITOR OUT
	INBUF	SYS,2		;GET TWO BUFFERS
	MOVEM	T1,.JBFF##	;RESTORE THE OLD VALUE

TRMDS0:	PUSHJ	P,SCAN		;GO GET THE TERMINAL NAME AND DISPLAY TYPE
	 JRST	TRMD12		;ASSUME E-O-F

IFE <MONVER-603>,<
	SKIPGE	T4,XNOD		;GET THE NODE NAME/NUMBER
	JRST	TRMDS2		;JUMP IF A NODE NAME
	JUMPE	T4,TRMDS1	;IF THE NUMBER IS ZERO USE THE CENTRAL NODE
	PUSHJ	P,SIXOCT	;CONVERT SIXBIT TO OCTAL
	 JRST	TRMDS2		;NOT OCTAL GO TRY THE NEXT ENTRY
	SKIPN	T4,T1		;SKIP IF NOT ZERO
TRMDS1:	HRRZ	T4,@GETLOC	;GET THE CENTRAL NODE NUMBER
	JRST	TRMDS5		;GO SEE IF THE ONE WE WANT
TRMDS2:	SKIPN	T3,GETNDB	;GET THE POINTER TO THE FIRST NODE
	JRST	TRMDS0		;NO NETWORK CODE
TRMDS3:	HLRZ	T2,HI+NDBSNM(T3);GET THE POINTER TO THE NODE NAME
	CAMN	T4,HI(T2)	;SKIP IF THEY MATCH
	JRST	TRMDS4		;SKIP IF A MATCH
	HRRZ	T3,HI+NDBNNM(T3);GET THE POINTER TO THE NEXT NODE
	JUMPN	T3,TRMDS3	;WELL KEEP ON TRUCK'N
	JRST	TRMDS0		;TRY THE NEXT ENTRY
TRMDS4:	HLRZ	T4,HI+NDBNNM(T3);GET THE NODE NUMBER FOR THE NODE
TRMDS5:	CAME	T4,NODIDX	;SKIP IF THEY MATCH
	JRST	TRMDS0		;TRY THE NEXT ENTRY >
	HLRZ	T4,XDEV		;GET THE TYPE OF TERMINAL
	CAIN	T4,'TTY'	;SKIP IF NOT 'TTY'
	JRST	TRMD10		;GET THE RELATIVE LINE NUMBER
IFE <MONVER-603>*<MONVER-700>,<
	CAIN	T4,'OPR'	;SKIP IF NOT 'OPR'
	JRST	TRMDS6		;GET THE OPERATORE LINE NUMBER >
	CAIE	T4,'CTY'	;SKIP IF 'CTY'
	JRST	TRMDS9		;ASSUME AN OCTAL NUMBER

	MOVE	T1,PTYMIN	;GET THE NUMBER OF THE FIRST PTY
	SOJA	T1,TRMD11	;ADJUST IT TO THE CTY

IFE <MONVER-603>*<MONVER-700>,<
TRMDS6:	SKIPN	T2,GETNDB	;GET THE POINTER TO THE FIRST NODE DATA BLOCK
	JRST	TRMDS0		;SKIP IF NOT A NETWORK SYSTEM
TRMDS7:	HLRZ	T1,HI+NDBNNM(T2);GET THE NODE NUMBER
	CAMN	T1,NODIDX	;SKIP IF NOT A MATCH
	JRST	TRMDS8		;GO GET THE OPR LDB
	HRRZ	T2,HI+NDBNNM(T2);GET THE POINTER TO THE NEXT NDB
	JUMPN	T2,TRMDS7	;JUMP IF NOT THE END OF THE LINE
	JRST	TRMDS0		;NO SUCH NODE
TRMDS8:	HRRZ	T4,HI+SCBOPR(T2);GET THE POINTER TO THE OPR LDB
	JUMPE	T4,TRMDS0	;JUMP IF NO OPR LINE
	LDB	T1,[POINT 8,HI+LDBREM+4(T4),7]  ;GET THE RELATIVE LINE NUMBER
	JRST	TRMD11		;GO SEE IF THE RIGHT LINE >

TRMDS9:	SKIPA	T4,XDEV		;ASSUME AN OCTAL NUMBER INPUT
TRMD10:	HRLZ	T4,XDEV		;GET THE TERMINAL NUMBER
	PUSHJ	P,SIXOCT	;CONVERT SIXBIT TO OCTAL
	 JRST	TRMDS0		;TRY THE NEXT ENTRY

TRMD11:	CAME	T1,LINIDX	;SKIP IF WE FOUND THE RIGHT ENTRY
	JRST	TRMDS0		;NO - TRY THE NEXT ENTRY

	MOVE	T1,XFIL		;GET THE DISPLAY TYPE
	MOVEM	P3,INCHR	;RESTORE FOR TERMINAL INPUT
>
	MOVE	T2,[-DSPSIZ,,DSPNAM]  ;GET INFORM TSTABR WHAT TO MATCH
	PUSHJ	P,TSTABR	;GO SEE IF ONE MATCHED
	 JRST	TRMD12		;NO GIVE UP
	HLRZ	P1,DSPNUM(T2)	;SET UP THE DISPLAY OFFSET
TRMD12:	RELEAS	SYS,		;RELEASE THE DISK FILE
TRMD13:	POP	P,C		;RESTORE C
				; FALL INTO SETDSP
;HERE TO SET UP THE DISPLAY SIZE

SETDSP:	HRRZ	T1,DSPNUM(P1)	;GET THE SIZE OF THE DISPLAY
IFN FTTITLE,<
	TXNE	F,F.TTL		;SKIP IF THE TITLE FLAG ISN'T SET
	MOVEI	T1,^D2(T1)	;THE SCREEN IS LARGER IN NO TITLE MODE >
IFN FTPATH,<
	TXNE	F,F.PTH		;SKIP IT THE PATH OPTION ISN'T WANTED
	LSH	T1,-^D1		;DIVIDE BY TWO >
	MOVEM	T1,PAGSIZ	;SAVE FOR LATER
	TXO	F,F.CLR		;SET UP CLEAR THE SCREEN ON THE NEXT SCAN
	POPJ	P,		;RETURN


;HERE FOR A CHARACTER FROM 'SYS:DISPLA.INI'

SYSIN:	SOSG	SYSCNT		;SKIP IF THE BUFFER ISN'T EMPTY
	JRST	SYSIN1		;GO FILL THE BUFFER
SYSIN0:	ILDB	C,SYSPNT	;GET A CHARACTER
	JUMPE	C,SYSIN		;GET ANOTHER CHARACTER IF A NULL CHARACTER
	POPJ	P,
SYSIN1:	IN	SYS,		;FILL THE INPUT BUFFER
	JRST	SYSIN0		;FULL TO EMPTY IT
	MOVEI	C,-1		;ASSUME E-O-F, INFORM THE CALLER
	POPJ	P,		;RETURN


;HERE TO CONVERT FROM THE NEW DATE/TIME FORMAT TO JIFFIES

IFN FTJOB,<
ADJTIM:	MUL	T2,[^D<24*60*60*1000>]  ;ADJUST THE FACTION OF A DAY
	ASHC	T2,^D17		;ADJUST THIS RESULT
	MUL	T2,JIFFIE	;CONVERT FROM MILLI-SECONDS
	DIVI	T2,^D1000	; TO JIFFIES
	POPJ	P,		;RETURN >
;HERE TO SET UP THE PAGE BOUNDARIES

PAGADJ:	MOVE	T1,PAGNUM	;GET THE PAGE TO OUTPUT
	IMUL	T1,PAGSIZ	;GET THE FIRST
	MOVEM	T1,PAGFST	; DDB TO OUTPUT
	ADD	T1,PAGSIZ	;GET THE LAST
	MOVEM	T1,PAGLST	; DDB TO OUTPUT
	POPJ	P,		;RETURN


;CONVERT SIXBIT TO OCTAL

SIXOCT:	JUMPE	T4,.POPJ	;JUMP IF NOTHING TO CONVERT
	SETZ	T1,		;RESET THE NUMBER
	MOVE	T3,[POINT 6,T4]	;SET UP THE BYTE POINTER
SIXOC0:	ILDB	T2,T3		;GET A CHARACTER
	JUMPE	T2,.POPJ1	;RETURN IF NULL
	CAIL	T2,'0'		;SKIP IF LESS THAN A '0'
	CAILE	T2,'7'		;SKIP IF LESS THAN A '7'
	POPJ	P,		;GIVE AN ERROR RETURN
	LSH	T1,3		;MUTIPLY BY EIGHT
	ORI	T1,-'0'(T2)	;ADD IN THE NEW DIGIT
	TXNE	T3,77B5		;SKIP IF THE END OF THE WORD IS REACHED
	JRST	SIXOC0		;GO TRY THE NEXT BYTE
	JRST	.POPJ1		;GIVE A GOOD RETURN


;HERE TO RESTORE THE TERMINAL CHARACTERISTICS

RSTTRM:	MOVSI	T1,-TRMSIZ	;SET UP A AOBJN COUNTER
RSTTR0:	MOVE	T2,TRMSAV(T1)	;GET THE BIT TO SET
	MOVEM	T2,TRM+2	;SAVE FOR THE TRMOP. UUO
	HRRZ	T2,TRMTAB(T1)	;GET THE FIRST FUNCTION
	MOVEI	T2,.TOSET(T2)	;SET UP AS A SET FUNCTION
	MOVEM	T2,TRM		;SAVE FOR THE TRMOP. UUO
	MOVE	T3,[3,,TRM]
	TRMOP.	T3,		;SET THE BIT
	 JRST	E$$TTF		;NO - GO INFORM THE USER
	AOBJN	T1,RSTTR0	;JUMP IF MORE TO DO
	POPJ	P,		;RETURN
;HERE TO CLEAR TO THE END OF THE COMMAND LINE

CLRLIN:	MOVSI	T5,-<EOLSIZ-2>	;GET THE NUMBER OF END OF LINE CHARACTERS
CLRLI0:	CAMN	C,EOL(T5)	;SKIP IF NOT THIS CHARACTER
	POPJ	P,		;RETURN
	AOBJN	T5,CLRLI0	;LOOP UNTIL ALL HAVE BEEN TRIED
	XCT	INCHR		;GET THE NEXT CHARACTER
	JRST	CLRLIN		;GO TRY THIS CHARACTER


;HERE TO TEST FOR AN EOL CHARACTER

TSTEOL:	XCT	INCHR		;GET A CHARACTER
TSTEO0:	CAIN	C,.CHCRT	;SKIP IF THE CHAR ISN'T A CARRIAGE RETURN
	XCT	INCHR		;GET ANOTHER CHARACTER THEN
	MOVSI	T5,-EOLSIZ	;SET UP AN AOBJN COUNTER
TSTEO1:	CAMN	C,EOL(T5)	;SKIP IF IT EQUALS THIS CHAR
	JRST	.POPJ1
	AOBJN	T5,TSTEO1	;JUMP IF MORE CHAR TO TEST
	POPJ	P,		;RETURN


EOL:	.CHBEL	;A BELL
	.CHLFD	;A LINE-FEED
	.CHVTB	;A VERTICAL-TAB
	.CHFFD	;A FORM-FEED
	.CHCNZ	;A CONTROL-Z
	.CHESC	;AN ESCAPE
IFN FTSPACE,<
	.CHTAB	;A TAB
	" "	;A SPACE >
EOLSIZ==.-EOL

IFE <MONVER-700>,<
;HERE TO SET UP A SPY-PAGE FOR AN LDB
GETLDB:	HRRZ	T3,T4
	LSH	T3,-11
	HRLM	T3,LDBBLK+1
	ADDI	T3,1
	HRLM	T3,LDBBLK+2
	MOVE	T3,[11,,DELLDB]
	PAGE.	T3,
	  JFCL
	MOVE	T3,[11,,LDBBLK]
	PAGE.	T3,
	  HALT
	TRZ	T4,777000
	TRO	T4,LDB-400000
	POPJ	P,
>
SUBTTL	THE DDB SCANNING SUBROUTINES

;HERE TO FIND THE NEXT DDB
SPY==377000
UPT==376000
LDB==374000
SPYPAG==377
UPTPAG==376
LDBPAG==374
NXTDDB:
IFL <MONVER-700>,<
	HLRZ	P2,HI+DEVSER(P2);GET THE LINK TO THE NEXT DDB
	CAIE	P2,0		;SKIP IF OUT OF DDB'S
>
IFGE <MONVER-700>,<
	JUMPN	P2,NXTDD5
NXTDD1:	AOS	T1,JOB
	CAMLE	T1,@HIJOB
	POPJ	P,
	SETZ	P2,
	HRRZ	T2,@GETUPM
NXTDD2:	JUMPE	T2,NXTDD1
	MOVEM	T2,CURUPM
	HRLM	T2,UPTBLK+1
	MOVE	T2,[11,,DELUPT]
	PAGE.	T2,
	  JFCL
	MOVE	T2,[11,,UPTBLK]
	PAGE.	T2,200000
	  HALT
NXTDD3:	SKIPE	P2
	SKIPA	T2,DEVSER(P2)
	MOVE	T2,@LSTLOC
	HLRZS	T2
	MOVEM	T2,CURVRT
	JUMPE	T2,NXTDD1
	MOVE	T3,T2
	LSH	T2,-11
	ADDI	T2,440
	ROT	T2,-1
	TLZE	T2,400000
	TLOA	T2,001500
	TLO	T2,221500
	ADDI	T2,UPT
	MOVEM	T2,CURPTR
	LDB	T2,T2
	MOVEM	T2,CURPAG
	HRLM	T2,FUNBLK+1
	MOVE	T2,[11,,DELSPY]
	PAGE.	T2,
	  JFCL
	MOVE	T2,[11,,FUNBLK]
	PAGE.	T2,200000
	  HALT
	MOVE	P2,T3
NXTDD4:	JUMPE	P2,.POPJ
	ANDI	P2,777
	ADDI	P2,SPY-HI
.POPJ1:	AOS	(P)		;SET UP FOR A SKIP RETURN
.POPJ:	POPJ	P,		;RETURN
NXTDD5:	SUBI	P2,HI
	MOVE	T1,JOB
	HRRZ	T2,@GETUPM
	CAME	T2,CURUPM
	JRST	NXTDD2
	HLRZ	T2,DEVSER(P2)
	JUMPE	T2,NXTDD1
	XOR	T2,CURVRT
	TRNE	T2,777000
	JRST	NXTDD3
	LDB	T2,CURPTR
	CAME	T2,CURPAG
	JRST	NXTDD3
	HLRZ	P2,DEVSER(P2)
	JRST	NXTDD4

>


;HERE TO FIND A STRUCTURE

FNDSTR:	HRRZ	T1,HI+DEVUNI(P2);GET THE POINTER TO THE UNIT
	JUMPE	T1,.POPJ	;ERROR RETURN
	HRRZ	T1,HI+UNISTR(T1);GET THE POINTER TO THE STRUCTURE
	JUMPE	T1,.POPJ	;ERROR RETURN
	MOVE	T1,HI+STRNAM(T1);GET THE STRUCTURE NAME
	JRST	.POPJ1		;GO DO A SKIP RETURN
;HERE TO TEST IF A DDB FIXS A NOT LOGGED IN SPECIFICATION

TSTNOT:	LDB	T5,JOBPTR	;GET THE JOB NUMBER
	MOVE	T1,@GETPP	;GET THE PPN IN USE
	XOR	T1,DIR		;COMPARE THIS PPN
	TDNN	T1,DIRMSK	;SKIP IF NOT A MATCH
	JRST	DDBLOP		;NO - GO TRY NEXT DDB
	JRST	DDBLO1		;YEA - GO OUTPUT THIS DDB


;HERE TO TEST IF A DDB FIXS A LOGGED IN SPECIFICATION

TSTLOG:	LDB	T5,JOBPTR	;GET THE JOB NUMBER
TSTLO0:	MOVE	T1,@GETPP	;GET THE PPN IN USE
	XOR	T1,DIR		;COMPARE THIS PPN
	TDNE	T1,DIRMSK	;SKIP IF A MATCH
	JRST	DDBLOP		;NO - GO TRY NEXT DDB
	JRST	DDBLO1		;YEA - GO OUTPUT THIS DDB


;HERE TO TEST IF A DDB FIXS A FILE SPECIFICATION

TSTFIL:	MOVE	T1,HI+PPBNAM(P5);GET THE PPN OF THE FILE
	XOR	T1,DIR		;COMPARE THIS PPN
	TDNE	T1,DIRMSK	;SKIP IF A MATCH
	JRST	DDBLOP		;NO - GO TRY NEXT DDB THEN
	PUSHJ	P,FNDSTR	;GO FIND THE STRUCTURE NAME
	 JRST	DDBLOP		;NO - GO TRY NEXT DDB THEN
	XOR	T1,DEV		;COMPARE THIS DEVICE
	TDNE	T1,DEVMSK	;SKIP IF A MATCH
	JRST	DDBLOP		;NO - GO TRY NEXT DDB THEN
	MOVE	T1,HI+DEVFIL(P2);GET THE FILE NAME
	XOR	T1,FIL		;COMPARE THIS FILE NAME
	TDNE	T1,FILMSK	;SKIP IF A MATCH
	JRST	DDBLOP		;NO - GO TRY NEXT DDB THEN
	HLLZ	T1,HI+DEVEXT(P2);GET THE EXTENSION
	XOR	T1,EXT		;COMPARE THIS EXTENSION
	TLNE	T1,(T1)		;SKIP IF A MATCH
	JRST	DDBLOP		;NO - GO TRY NEXT DDB
	JRST	DDBLO1		;YEA - GO OUTPUT THIS DDB


;HERE TO TEST IF A DDB IS FROM A GIVE JOB

TSTJOB:	LDB	T5,JOBPTR	;GET THE JOB NUMBER
	CAME	T5,JOBNUM	;SKIP IF A RIGHT JOB NUMBER
	JRST	DDBLOP		;GO TRY THE NEXT JOB NUMBER
	TXNE	F,F.GOD		;SKIP IF NOT GOD
	JRST	DDBLO1		;GO OUTPUT THE DDB
	JRST	TSTLO0		;GO TEST THE PPN OF THIS USER
SUBTTL	THE DISPLAY ROUTINES


;HERE TO CLEAR THE SCREEN

TRMCLR:	AD1CLR		;LSI ADM-1 CLEAR THE SCREEN ROUTINE
	AD3CLR		;LSI ADM-3 CLEAR THE SCREEN ROUTINE
	ASRCLR		;ASR-33 CLEAR THE SCREEN ROUTINE
	HZLCLR		;HAZELTINE-2000 CLEAR THE SCREEN ROUTINE
	MBECLR		;MINI-BEE CLEAR THE SCREEN ROUTINE
	MDLCLR		;MODULAR ONE CLEAR THE SCREEN ROUTINE
	V5BCLR		;DEC VT05B CLEAR THE SCREEN ROUTINE
	V50CLR		;DEC VT50 CLEAR THE SCREEN ROUTINE
	V52CLR		;DEC VT52 CLEAR THE SCREEN ROUTINE
	V61CLR		;DEC VT61 CLEAR THE SCREEN ROUTINE

AD1CLR:	PUSHJ	P,AD1HOM	;GO USE THE LSI HOME ROUTINE
	PJRST	AD1EOS		;GO CLEAR TO THE END OF THE SCREEN

AD3CLR:	OUTCHR	[%AD3CL]	;CLEAR THE SCREEN FOR THE LSI ADM-3
	POPJ	P,		;RETURN

ASRCLR:	OUTSTR	[BYTE (7).CHCRT,.CHLFD,0]
	POPJ	P,		;RETURN

HZLCLR:	OUTSTR	[BYTE (7)%HZLLD,%HZLCL,.CHDEL,.CHDEL,0]
	MOVEI	T1,^D150	;HIBERNATE FOR AWHILE
	HIBER	T1,		; ..
	 OUTSTR	[BYTE (7).CHDEL,.CHDEL,.CHDEL,.CHDEL,0]
	SETOM	LSTCNT		;RESET THE COUNT FOR THE NUMBER
				; OF LINES ON THE LAST DISPLAY
	POPJ	P,		;RETURN

MBECLR:	OUTSTR	[BYTE (7)%MBELD,%MBECL,0]
	POPJ	P,		;RETURN

MDLCLR==HZLCLR		;SAME AS THE HAZELTINE-2000

V5BCLR:	OUTSTR	[BYTE (7)%V5BHM,%V5BES,0]
	POPJ	P,		;RETURN

V50CLR:	OUTSTR	[BYTE (7)%V50LD,%V50HM,%V50LD,%V50ES,0]
	POPJ	P,		;RETURN

V52CLR==V50CLR		;SAME AS DEC VT50

V61CLR==V50CLR		;SAME AS DEC VT50
;HERE TO CLEAR TO END OF THE SCREEN

TRMEOS:	AD1EOS		;LSI ADM-1 CLEAR TO END OF THE SCREEN ROUTINE
	AD3EOS		;LSI ADM-3 CLEAR TO END OF THE SCREEN ROUTINE
	ASREOS		;ASR-33 OR ASR-35 CLEAR TO END OF THE SCREEN ROUTINE
	HZLEOS		;HAZELTINE-2000 CLEAR TO END OF THE SCREEN ROUTINE
	MBEEOS		;MINI-BEE CLEAR TO END OF THE SCREEN ROUTINE
	MDLEOS		;MODULAR ONE CLEAR TO END OF THE SCREEN ROUTINE
	V5BEOS		;DEC VT05B CLEAR TO END OF THE SCREEN ROUTINE
	V50EOS		;DEC VT50 CLEAR TO END OF THE SCREEN ROUTINE
	V52EOS		;DEC VT52 CLEAR TO END OF THE SCREEN ROUTINE
	V61EOS		;DEC VT61 CLEAR TO END OF THE SCREEN ROUTINE

AD1EOS:	OUTSTR	[BYTE (7)%AD1LD,%AD1ES,0]
	MOVEI	T1,^D100	;HIBERNATE FOR AWHILE
	HIBER	T1,		; ..
	 JFCL			;NO HIBER - PUNT
	POPJ	P,		;RETURN

AD3EOS:	HRRZ	T1,DSPNUM(P1)	;GET THE SCREEN SIZE
	TXNE	F,F.TTL		;SKIP THE TITLE IS BEING OUTPUT
	MOVEI	T1,^D3(T1)	;GET THE SIZE OF THE TITLE
	SUB	T1,CURCNT	;GET THE NUMBER OF BLANK LINES
	JUMPLE	T1,.POPJ	;RETURN IF NO BLANKS LINES NEEDED
AD3EO1:	OUTCHR	[.CHLFD]	;OUTPUT A LINE-FEED
	SOJG	T1,AD3EO1	;LOOP BACK IF MORE LINES TO OUTPUT
	POPJ	P,		;RETURN

ASREOS==.POPJ		;NOOP FOR ASR TERMINALS

HZLEOS:	MOVE	T1,CURCNT	;GET THE NUMBER OF LINES DISPLAYED
	EXCH	T1,LSTCNT	;SAVE FOR THE NEXT SCAN
	SUB	T1,LSTCNT	;GET THE NUMBER LINES TO DELETE
	AOJLE	T1,.POPJ	;RETURN IF NO LINES TO CLEAR
HZLES0:	OUTSTR	[BYTE (7)%HZLLD,%HZLDL,.CHDEL,.CHDEL,0]
	SOJE	T1,.POPJ	;JUMP IF NO MORE LINES TO DELETE
	MOVEI	T2,^D10		;HIBERNATE FOR AWHILE
	HIBER	T2,		; ..
	 OUTSTR	[BYTE (7).CHDEL,.CHDEL,.CHDEL,.CHDEL,0]
	JRST	HZLES0		;LOOP BACK UNTIL FINISHED

MBEEOS:	OUTSTR	[BYTE (7)%MBELD,%MBEES,0]
	POPJ	P,		;RETURN

MDLEOS==HZLEOS		;SAME AS HAZELTINE-2000

V5BEOS:	OUTCHR	[%V5BES]
	POPJ	P,		;RETURN

V50EOS==MBEEOS		;SAME AS MINE-BEE

V52EOS==MBEEOS		;SAME AS MINI-BEE

V61EOS==MBEEOS		;SAME AS MINI-BEE
;HERE TO CLEAR TO END OF THE LINE

TRMEOL:	AD1EOL		;LSI ADM-1 CLEAR LINE ROUTINE
	AD3EOL		;LSI ADM-3 CLEAR LINE ROUTINE
	ASREOL		;ASR-33 OR ASR-35 CLEAR LINE ROUTINE
	HZLEOL		;HAZELTINE-2000 CLEAR LINE ROUTINE
	MBEEOL		;MINI-BEE CLEAR LINE ROUTINE
	MDLEOL		;MODULAR ONE CLEAR LINE ROUTINE
	V5BEOL		;DEC VT05B CLEAR LINE ROUTINE
	V50EOL		;DEC VT50 CLEAR LINE ROUTINE
	V52EOL		;DEC VT52 CLEAR LINE ROUTINE
	V61EOL		;DEC VT61 CLEAR LINE ROUTINE

AD1EOL:	OUTSTR	[BYTE (7)%AD1LD,%AD1EL,0]
	POPJ	P,		;RETURN

AD3EOL==.POPJ		;NOOP FOR LSI ADM-3 TERMINALS

ASREOL==.POPJ		;NOOP FOR ASR TERMINALS

HZLEOL==.POPJ		;NOOP FOR HAZELTINE-2000 TERMINALS

MBEEOL:	OUTSTR	[BYTE (7)%MBELD,%MBEEL,0]
	POPJ	P,

MDLEOL==HZLEOL		;SAME AS HAZELTINE-2000

V5BEOL:	OUTCHR	[%V5BEL]
	POPJ	P,		;RETURN

V50EOL==MBEEOL		;SAME AS MINI-BEE

V52EOL==MBEEOL		;SAME AS MINI-BEE

V61EOL==MBEEOL		;SAME AS MINI-BEE
;HERE TO HOME THE TERMINAL

TRMHOM:	AD1HOM		;LSI ADM-1 HOME THE SCREEN ROUTINE
	AD3HOM		;LSI ADM-3 HOME THE SCREEN ROUTINE
	ASRHOM		;ASR-33 OR ASR-35 HOME THE SCREEN ROUTINE
	HZLHOM		;HAZELTINE-2000 HOME THE SCREEN ROUTINE
	MBEHOM		;MINI-BEE HOME THE SCREEN ROUTINE
	MDLHOM		;MODULAR ONE HOME THE SCREEN ROUTINE
	V5BHOM		;DEC VT05B HOME THE SCREEN ROUTINE
	V50HOM		;DEC VT50 HOME THE SCREEN ROUTINE
	V52HOM		;DEC VT52 HOME THE SCREEN ROUTINE
	V61HOM		;DEC VT61 HOME THE SCREEN ROUTINE

AD1HOM:	OUTCHR	[%AD1HM]
	MOVEI	T1,^D100	;HIBERNATE FOR AWHILE
	HIBER	T1,		; ..
	 JFCL			;NO HIBERNATE - PUNT
	POPJ	P,		;RETURN

AD3HOM==.POPJ		;NOOP FOR LSI ADM-3 TERMINALS

ASRHOM==ASRCLR		;ASR TERMINALS PRINT OUTPUT '<CR><LF>'

HZLHOM:	OUTSTR	[BYTE (7)%HZLLD,%HZLHM,0]
	POPJ	P,		;RETURN

MBEHOM:	OUTSTR	[BYTE (7)%MBELD,%MBEHM,0]
	POPJ	P,		;RETURN

MDLHOM==HZLHOM		;SAME AS HAZELTINE-2000

V5BHOM:	OUTCHR	[%V5BHM]
	POPJ	P,		;RETURN

V50HOM==MBEHOM		;SAME AS MINI-BEE

V52HOM==MBEHOM		;SAME AS MINI-BEE

V61HOM==MBEHOM		;SAME AS MINI-BEE
SUBTTL	THE ERROR ROUTINES


E$$DRM:	OUTSTR	[ASCIZ /
?DDBDRM DDBDPY isn't set up to run on this monitor
/]
	JRST	CMDAB1		;GO DO A MONITOR RETURN

E$$NPS:	OUTSTR	[ASCIZ /
?DDBNPS No privileges to SPY on the monitor
/]
	JRST	CMDAB1		;GO DO A MONITOR RETURN

E$$DCB:	PUSHJ	P,@TRMCLR(P1)	;GO CLEAR THE SCREEN
	OUTSTR	[ASCIZ /
?DDBDCB DDB chain was broken
/]
	JRST	CMDAB0

E$$TTF:	OUTSTR	[ASCIZ /
?DDBTTF A TRMNO. or TRMOP. UUO failed
/]
	JRST	CMDAB1		;GO DO A MONITOR RETURN

E$$CIT:	OUTSTR	[ASCIZ /
?DDBCIT Can't INIT the terminal
/]
	JRST	CMDAB1		;GO DO A MONITOR RETURN

E$$CRS:	OUTSTR	[ASCIZ /
?DDBCRS DDBDPY can't be ran as a subjob
/]
	JRST	CMDAB1		;GO DO A MONITOR RETURN

IFN FTPRIV,<
E$$NPR:	OUTSTR	[ASCIZ /
?DDBNPR No privileges to run DDBDPY
/]
	JRST	CMDAB1		;GO DO A MONITOR RETURN >
SUBTTL	THE DATA AND STORAGE AREA


PDL:	BLOCK	PDLSIZ	;THE PUSH DOWN LIST
IFN FTDEBUG,<
PATCH:	BLOCK	PATSIZ	;A PATCH AREA IF DEBUGGING >
TEMP:	BLOCK	1	;A TEMPORARY STORAGE LOCATION
IFE <MONVER-700>,<
LSTLOC:	BLOCK	1
>
IFE <MONVER-603>*<MONVER-700>,<
NODIDX:	BLOCK	1	;THE NODE NUMBER OF THE TERMINAL >
LINIDX:	BLOCK	1	;THE RELATIVE LINE ON THE NODE
INCHR:	BLOCK	1	;CONTAINS AN INSTRUCTION TO BE EXECUTED WHEN
			; ANOTHER CHARACTER IS WANTED ON INPUT
ADRDSK:	BLOCK	1	;ADDRESS OF THE FIRST DISK DDB
MYPPN:	BLOCK	1	;MY PROJECT PROGRAMMER NUMBER
JOBMAX:	BLOCK	1	;THE MAXIMUM NUMBER OF JOBS
CURJOB:	BLOCK	1	;MY JOB NUMBER
IFN FTJOB,<
JIFFIE:	BLOCK	1	;THE NUMBER OF JIFFIES IN ONE SECOND
JIFMIN:	BLOCK	1	;THE NUMBER OF JIFFIES IN ONE MINUTE
JIFHOR:	BLOCK	1	;THE NUMBER OF JIFFIES IN ONE HOUR
PTYMIN:	BLOCK	1	;THE NUMBER OF THE FIRST PTY
CURDAT:	BLOCK	1	;THE CURRENT DATE
TOTTIM:	BLOCK	1	;THE TOTAL RUNTIME
DELTIM:	BLOCK	1	;THE DELTA RUNTIME
DSKRED:	BLOCK	1	;THE NUMBER OF DISK READS
DSKWRT:	BLOCK	1	;THE NUMBER OF DISK WRITES >
PAGNUM:	BLOCK	1	;CURRENT PAGE TO OUTPUT
PAGSIZ:	BLOCK	1	;THE NUMBER OF DDB'S ON ONE SCREEN
PAGFST:	BLOCK	1	;THE FIRST DDB TO OUTPUT ON THE PAGE
PAGLST:	BLOCK	1	;THE LAST DDB TO OUTPUT ON THE PAGE
CURCNT:	BLOCK	1	;THE NUMBER OF LINES OUTPUT THIS SCAN
LSTCNT:	BLOCK	1	;THE NUMBER OF LINES OUTPUT ON THE LAST SCAN
DDBCNT:	BLOCK	1	;THE NUMBER OF DDB'S FOUND ON THIS SCAN
JOB:	BLOCK	1	;THE CURRENT JOB WE'RE LOOKING AT FOR DDBS
HIJOB:	BLOCK	1	;HIGHEST JOB IN SYSTEM
CURUPM:	BLOCK	1	;CURRENT UPMP FOR JOB (PHYSICAL ADDRESS)
CURPTR:	BLOCK	1	;PNTR TO CURRENT FUNNY PAGE
CURPAG:	BLOCK	1	;CURRENT PHYSICAL PAGE OF FUNNY PAGE
CURVRT:	BLOCK	1	;CURRENT VIRTUAL PAGE OF SPIED DDB
TTLBUF:	BLOCK	LINSIZ*^D3  ;THE TITLE BUFFER
STLBUF:	.SBTTX		;THE SUBTITLE TEXT
IFN FTPATH,<
PTHBUF:	.PTHTX		;THE PATH SUBTITLE TEXT >
IFN FTWHAT,<
WHTBUF:	BLOCK	WHTSIZ	;THE COMMAND STRING BUFFER >
XLIST	;;TURN THE LISTING OFF
HLPBUF:
ASCIZ	\DDB Set up for a 701 Monitor

Each command must be terminated by a break character
^C (Control-C) OR ^Z (Control-Z) will exit the job

<CR>  Update the listing
<ALT> Update the listing and wait for a new command
  +   Advance the listing by one page
  -   Decrement the listing by one page
  A   List all the disk DDBs (privileged command)
  D   Change the type of display
  F   List only the DDBs that reference a file specification
  H   This help text
  J   List only the DDBs from a job
  K   Kill the execution and this job
  L   List only the DDBs that are from jobs logged-in under a PPN
  P   Complement the listing of the entire path
  S   Change the sleep time between updates
  T   Complement the listing of the title line
  W   Complement the listing of the command buffer\

LIST	;;TURN THE LISTING ON

IFN FTSLEEP,<
SLPCNT:	BLOCK	1	;SLEEP TIME ADJUSTMENT COUNTER >
HIBTIM:	HB.RTL!HB.RWJ	;HIBER TIME AND WAKE BITS
ROUTIN:	BLOCK	1	;THE ROUTINE TO BE USED IS STORED HERE
JOBNUM:
NOD:	BLOCK	1	;THE FILE SPECIFICATION GO HERE
NODMSK:	BLOCK	1
DEV:	BLOCK	1
DEVMSK:	BLOCK	1
FIL:	BLOCK	1
FILMSK:	BLOCK	1
EXT:	BLOCK	1
DIR:	BLOCK	1
DIRMSK:	BLOCK	1
BLTEND==.-1

XROUTI:	BLOCK	1	;THE ROUTINE TO BE USED IS STORED HERE
XNOD:	BLOCK	1	;THE TEMPORARY FILE SPECIFICATION GO HERE
XNODMS:	BLOCK	1
XDEV:	BLOCK	1
XDEVMS:	BLOCK	1
XFIL:	BLOCK	1
XFILMS:	BLOCK	1
XEXT:	BLOCK	1
XDIR:	BLOCK	1
XDIRMS:	BLOCK	1
XBLTEND==.-1

IROUTI:	TSTFIL		;THE ROUTINE TO BE USED IS STORED HERE
INOD:	'      '	;THE INITIAL FILE SPECIFICATION GO HERE
INODMS:	-1		; 'ALL:*.*[PRJ,*]
IDEV:	'ALL   '
IDEVMS:	0
IFIL:	'*     '
IFILMS:	0
IEXT:	'*  ',,0
IDIR:	0
IDIRMS:	0
JOBPTR:					;POINTER TO THE JOB NUMBER
IFL <MONVER-602>,<
	POINT	7,HI+DEVCHR(P2),6	;507/601 >
IFGE <MONVER-602>,<
	POINT	9,HI+DEVJOB(P2),35	;602 OR 603 >

STSPTR:					;POINTER TO THE FILE STATUS
IFL <MONVER-602>,<
	POINT	3,HI+ACCSTS(P3),29	;507/601 >
IFGE <MONVER-602>,<
	POINT	3,HI+ACCSTS(P3),32	;602 OR 603 >


TRMTAB:	1,,.TONFC	;SET THE NO FREE CARRIAGE RETURNS
	0,,.TOALT	;CLEAR THE ALTMODE SETTING
TRMSIZ==.-TRMTAB
TRMSAV:	BLOCK	TRMSIZ	;SAVE THE TTY STATUS HERE
TRM:	BLOCK	1	;THE TRMOP. DATA AREA
	.UXTRM
	BLOCK	1


INTBLK:	4,,CMDABT	;GO ABORT THE JOB ON A CONTROL-C
	ER.ICC
	BLOCK	2


MODE:	SIXBIT	/ R/	;READ		** THE FILE STATUS MODES **
	SIXBIT	/ U/	;UPDATE
	SIXBIT	/ S/	;SUPERSEDE
	SIXBIT	/ ?/	;NO SUCH MODE
	SIXBIT	/ C/	;CREATE


IFE <MONVER-603>*<MONVER-700>,<
EVWTAB:	SIXBIT	/TK/	;TAPE KONTROLLER WAIT
	SIXBIT	/TR/	;TAPE REWIND WAIT
	SIXBIT	/LB/	;LABEL PROCESSING WAIT
	SIXBIT	/NW/	;NETWORK WAIT
	SIXBIT	/IP/	;IPCF SYSTEM PROCESS RECEIVE WAIT
	SIXBIT	/FI/	;FRONT END DEVICE INPUT WAIT
	SIXBIT	/FO/	;FRONT END DEVICE OUTPUT WAIT
	SIXBIT	/D6/	;DAS60 DEVICE WAIT >

UPTBLK:	1
	UPTPAG
FUNBLK:	1
	SPYPAG
LDBBLK:	2
	LDBPAG
	LDBPAG+1
DELUPT:	1
	SETZ	UPTPAG
DELSPY:	1
	SETZ	SPYPAG
DELLDB:	2
	SETZ	LDBPAG
	SETZ	LDBPAG+1
	XALL		;EXPAND THE MACROS

DEFINE	.DSP	($NAM,$TYP,$SIZ),<
	LIST
	<SIXBIT	/$NAM/>
	XLIST
>

DSPNAM:	.DSPTB			;** GENERATE THE DISPLAY NAME TABLE **
DSPSIZ==.-DSPNAM


DEFINE	.DSP	($NAM,$TYP,$SIZ),<
	LIST
	$TYP,,$SIZ-4	;$NAM DISPLAY
	XLIST
>

DSPNUM:	.DSPTB			;** GENERATE THE DISPLAY SIZE TABLE **

	SALL		;SUPPRESS THE MACRO EXPANSION
DEFINE	GT($GET,$IDX,$FTX)<
	IFN $FTX,<
		BYTE	(9)$GET (5)0 (4)$IDX (18)0 >
>

GETSLF:	GT ,T1,1		;THE GETTAB TABLE POINTER
GETPDB:	GT ,P5,FTJOB		;THE PDB POINTER
GETDAT:	GT ,,FTJOB		;GET ADDRESS OF THE DATE
GETSPB:	GT ,,FTJOB&^-<MONVER-603>  ;THE ADDRESS OF THE WHERE TO FIND THE FIRST PPB
GETSTR:	GT ,,1			;THE ADDRESS OF THE WHERE TO FIND THE FIRST STR
GETNDB:	GT ,,^-<MONVER-603>	;THE ADDRESS OF THE FIRST NETWORK DATA BLOCK

GETTBL:			;THE GETTAB TABLES TO BE SET UP

GETSTS:	GT .GTSTS,P5,FTJOB	;THE STATUS OF A JOB
GETADR:	GT .GTADR,P5,FTJOB	;THE RELOCATION AND PROTECTION
GETPP:	GT .GTPPN,T5,1		;THE PROJECT PROGRAMMER NUMBER
GETPPN:	GT .GTPPN,P5,1		;THE PROJECT PROGRAMMER NUMBER
GETPRG:	GT .GTPRG,P5,FTJOB	;THE PROGRAM NAME
GETTIM:	GT .GTTIM,P3,FTJOB	;THE CURRENT RUNTIME
GETKCT:	GT .GTKCT,P3,FTJOB&^-<MONVER-603>  ;THE KILO-CORE-TICKS
GETPRV:	GT .GTPRV,T5,FTPRIV	;THE JOB PRIVILEGES
GETSWP:	GT .GTSWP,P5,FTJOB	;THE SWAPPING DATA
GETTTY:	GT .GTTTY,P5,1		;THE TTY POINTER
GETSGN:	GT .GTSGN,P5,FTJOB	;THE SEGMENT NUMBER
GETRCT:	GT .GTRCT,P5,FTJOB	;THE DISK READ COUNT
GETWCT:	GT .GTWCT,P5,FTJOB	;THE DISK WRITE COUNT
GETWSN:	GT .GTWSN,T1,FTJOB	;THE RUN STATES
GETLOC:	GT .GTLOC,,^-<MONVER-603>  ;THE LOCATION NUMBER
GETSPL:	GT .GTSPL,P5,FTJOB	;THE SPOOL BITS
GETRTD:	GT .GTRTD,P5,FTJOB	;THE REAL TIME STATUS WORD
GETLIM:	GT .GTLIM,P5,1		;THE LIMITS WORD
GETUPM:	GT	.GTUPM,T1,1	;JBTUPM
GETVRT:	GT .GTVRT,P5,FTJOB&FTVM	;THE VIRTUAL FLAGS
GETST2:	GT .GTST2,P5,FTJOB&^-<MONVER-603>  ;THE SECOND STATUS WORD
GETJLT:	GT .GTJLT,P5,FTJOB&^-<<MONVER-602>*<MONVER-603>>  ;THE LOGGED-IN TIME
GETVKS:	GT .GTVKS,P3,FTJOB&FTVM&^-<MONVER-603>  ;THE VM KILO-CORE-TICKS
GETUUC:	GT .GTUUC,P3,FTJOB&^-<MONVER-603>  ;THE UUO COUNT

GETSIZ==.-GETTBL	;DEFINE THE SIZE OF THE GETTAB TABLE
	XLIST	;DON'T LIST THE LITERALS
	LIT	;FORCE THE LITERALS TO BE PUT HERE
	LIST	;TURN THE LISTING BACK ON

LGOBLK:	SIXBIT	/SYS/	;DEVICE - FOR THE "K" COMMAND
	SIXBIT	/LOGOUT/;FILENAME
	EXP	0	;EXTENTION
	EXP	0	;PRIVILEGES
	EXP	0	;PPN
	EXP	0	;CORE

OPNBLK:	EXP	.IOASC	;GET AN INPUT CHANNEL TO 'SYS'
	SIXBIT	/SYS/
	EXP	SYSHED

LOKBLK:	EXP	.RBEXT	;.RBCNT - LOOKUP THE FILE 'DISPLA.INI' ON SYS
	XWD	0,0	;.RBPPN - NO PPN
	SIXBIT	/DISPLA/;.RBFIL - FILE NAME
	SIXBIT	/INI/	;.RBEXT - EXTENSION NAME

LINBUF:	BLOCK	BUFSIZ	;THE LINE BUFFER

SYSHED==LINBUF		;THE BUFFER HEADER FOR 'SYS'
SYSPNT==LINBUF+1	;THE BYTE POINTER
SYSCNT==LINBUF+2	;THE BYTE COUNTER
SYSBUF==LINBUF+3	;THE DISK BUFFER FOR 'SYS:DISPLA.INI'


	END	DDBDPY