Google
 

Trailing-Edge - PDP-10 Archives - bb-x130a-sb - dir.mac
There are no other files named dir.mac in the archive.
	TITLE	DIRECT %6X(455) DIRECTORY LISTING CUSP
	SUBTTL	P.CONKLIN/PFC/JBC/DCE/MD/JEF/LLN/LCR/MHK/WCL/RDH  12-JAN-84

	SEARCH	JOBDAT,	MACTEN,	UUOSYM	;STANDARD DEFINITIONS
	SEARCH	SWIL			;SWIL PACKAGE DEFINITIONS

	.REQUE	SWIL			;SWIL PACKAGE ROUTINES

	SALL				;PRETTY LISTINGS
	.DIREC	FLBLST			;PRETTIER LISTINGS

	TWOSEG	400000

Copyright (C) Digital Equipment Corporation 1984.

	COMMENT	\

DIRECT  --  Perform directory listings

Copyright (C) 1984
Digital Equipment Corporation, Maynard, Massachusetts, U.S.A.

This software is furnished under a license and may be used and copied only
in accordance with the terms of such license and with the inclusion of the
above copyright notice.  This software or any other copies thereof may not
be provided or otherwise made available to any other person.   No title to
and ownership of the software is hereby transferred.

The information in this software is subject to change  without  notice and
should not be construed as a commitment by Digital Equipment Corporation.

Digital  assumes  no  responsibility  for  the  use  or reliability of its
software on equipment which is not supplied by Digital.

\


;DIRECT VERSION IDENTIFICATION

MAJVER==6		;MAJOR VERSION LEVEL
MINVER=="X"-"A"+1	;MINOR (MAINTENANCE RELEASE) LEVEL
CSTVER==0		;CUSTOMER VERSION (WHO LAST . . .)
EDTVER==455		;EDIT LEVEL

%%DIRE==:<BYTE (3)CSTVER(9)MAJVER(6)MINVER(18)EDTVER>

IF2,<	PURGE	CSTVER,MAJVER,MINVER,EDTVER>
	SUBTTL	TABLE OF CONTENTS

;       	TABLE OF CONTENTS FOR DIRECT
;
;
;                          SECTION                            PAGE
;    1. REVISION HISTORY......................................   4
;    2. STANDARD MNEMONICS--REGISTERS, BITS, UUOS.............   7
;    3. INITIALIZE............................................  13
;    4. MAIN LOOP FOR COMMAND SCANNING........................  14
;    5. FILL IN DEFAULTS AFTER COMMAND SCANNING...............  16
;    6. PERFORM ONE DISK DIRECTORY LISTING....................  21
;    7. PERFORM MAG TAPE DIRECTORY LISTING....................  25
;    8. PERFORM MAG TAPE DIRECTORY LISTING--BACKUP/RESTORE....  34
;    9. PERFORM MAG TAPE DIRECTORY LISTING--FAILSAFE..........  38
;   10. PERFORM MAG TAPE DIRECTORY LISTING--SUBROUTINES.......  43
;   11. ROUTINE FOR DISK AND MAGTAPE DIRECTORY LINE...........  47
;   12. PERFORM DECTAPE DIRECTORY LISTING.....................  72
;   13. PERFORM TMPCOR DIRECTORY LISTING......................  75
;   14. MISC. DIRECTORY SUBROUTINES...........................  77
;   15. SUBROUTINES FOR LISTING OUTPUT........................  84
;   16. STORAGE............................................... 102
	SUBTTL	REVISION HISTORY

;%1 -- 6/71 WITH 5.03 MONITOR

;A)  REARRANGE TO USE SCAN.MAC AND ELIMINATE THE
;	BUILT IN SCANNER.  THIS GIVES INDIRECT FILES AND ALL
;	THE SCAN IMPROVEMENTS OVER SCANER.
;B)  EXPAND TOTAL LINE TO INCLUDE NUMBER OF LOOKUP FAILURES
;C)  FIX BUG ASSOCIATED WITH SYS: AND + UNDER 5.03
;D)  EXPAND TO HANDLE SUB-FILE DIRECTORIES.
;E)  REARRANGE TO USE REVAMPED LOKWLD (WILD)
;F)  IN /SORT, GIVE DATES AS " YYYYMMDD"
;G)  IN /SORT, LIST DIRECTORY IF AND ONLY IF THE REQUEST HAS
;	WILD CARDS IN THE DIRECTORY
;H)  IN /WIDTH, LIST STR OR DIRECTORY AS A SEPARATE LINE
;I)  IN /SORT, LIST STR IF AND ONLY IF DSK OR WILDCARDS
;J)  CHANGE DTA TO USE 300 MODE
;K)  ADD SWITCH /WORDS TO PRINT DISK LENGTHS IN WORDS NOT BLOCKS
;L)  IF MAG TAPE, INTERPRET FAILSAFE TAPE AS DISK DIRECTORY
;M)  OUTPUT VERSION IN FRONT OF STRUCTURE AND DIRECTORY
;N)  OUTPUT SPOOLED NAME (IF NON-ZERO) AT RIGHT END
;O)  /F/SUM WILL GIVE FAST LIST PLUS A SUMMARY
;P)  ADD FREE SPACE TO TMP: DIRECTORY
;Q)  /DETAIL WILL GIVE A LISTING LIKE LOOKFL DID (IE, ALL INTERESTING
;	ITEMS FROM THE EXTENDED LOOKUP
;R)  SUPPORT /DENSITY, /PROTECT, /PARITY SWITCHES FROM SCAN
;S)  DETECT ANSI-LIKE LABELS AND BACKUP TAPES
;T)  CORRECT A BUG WHICH GAVE EXTRA NON-EX. MESSAGES
;U)  ADD SUBTOTALS FOR EACH DIRECTORY AND STRUCTURE
;V)  INCLUDE CHECKSUM IN TOTALS
;W)  SUPPORT /BEFORE AND /SINCE
;X)  ADD /MARKS
;Y)  HANDLE + ON MTA, DTA, TMPCOR
;Z)  USE VERSION FROM RIB IF PRESENT.  IN /DETAIL, GIVE BOTH IF
;	DIFFERENT.
;AA)  REMOVE 'UFD' IN REGULAR LISTING SO COLUMNS LINE UP.
;AB)  USE 317 MODE ON DECTAPES.
;AC)  EXPAND ALL TABS IN /SORT MODE
;AD)  FIX TYPE/LIST LOGIC TO NOT TYPE TITLES, OR DOUBLE TYPE SUMMARIES.
;AE)  FIX BUG TO CORRECTLY SUPPRESS TRAILING TABS.
;%2(125) -- 5/72 WITH SCAN AND WILD

;126	(7613) LIST DIRECTORIES IF WILD AND /SORT
;127	MOVE SWITCHES AIMED AT F TO WORD FLAGS FOR SCAN %3
;	ALSO MOVE S.LODV AND S.TITL TO S.MIN AREA.
;130	CALL .OSCAN TO IMPLEMENT USER OPTIONS
;	ALSO ADD /NORMAL TO OVERRIDE /FAST IN OPTIONS FILE
;131	(8314) SUMMARY OF LOOKUP ERRORS WAS PREMATURE
;132	(8280) DIRECTORY CHECKSUMS WERE INCORRECT IN SUMMARY
;133	(QAR 149) NEEDED 3 EOFS TO END MAG TAPE
;134	(7635) CORRECT MAG TAPE SUB-TOTALS TO COME AT RIGHT TIME
;135	HANDLE FILE NOT MATCHING ON MAG TAPE
;136	OUTPUT RIB INTERNAL FORMAT CREATION TIME IN HUMAN TERMS
;137	(7613) IF /SORT, LIST DIRECTORIES AS 2*6 DIGITS
;140	CORRECT FORMATTING ERROR IN FIXED FORMAT OCTAL 7.
;141	ADD /NOREWIND, /NOEOT, /FILES:N  (QAR 177)
;142	FIX /MARKS TO INDICATE LAST EOF AS WELL (IE, EOT)
;143	CORRECT NULL DEVICE BUG INTRODUCED BY 127.
;144	CORRECT INF.0 BUG INTRODUCED BY 140.
;145	RESTORE .JBFF EACH OPEN. ALSO USE 10. BUFFER RING ON DISK INPUT
;146	ADD /NOSUMMARY, /NODETAIL, AND /NOUNITS.
;147	IF /DETAIL/SUMMARY, DO BOTH. IF /NOSUM NEVER GIVE ONE. IF
;	/NOUNITS, ALWAYS GIVE STR.
;150	IF /SORT, ALLOCATE 15 COLUMNS FOR VERSION
;151	/SORT OF MTA FAILED TO INCLUDE STRUCTURE
;152	IF /SUM, ALWAYS INCLUDE SUMMARIES

;%3(152) 12/72

;153	(10-9943) GET LAST SUB-TOTAL
;154	(10-10979) AVOID ILL UUO ON SOME COMMAND ERRORS
;155	(10-10590) AVOID "NO FILES" ON MTA:/F
;156	MTA BUFFER HEADER INDICATED LENGTH WAS 2 TOO BIG
;157	DEFAULT /OKPROT IF WILDCARDS IN UFD
;160	IF OUTPUT NOT TO TTY:, FORCE ALL SUMMARIES
;161	(10-9981) REJECT NUL: GRACEFULLY IN 5.07
;162	SUPPORT DATE75
;163	HANDLE INDEFINITE NUMBER OF INPUT FILES IN SPEC
;164	STANDARDIZE ERROR MESSAGES
;165	CHANGE TO USE .STOPN TO SUPPORT OUTPUT SFD
;166	GIVE RIGHT MESSAGE ON MTA ERRORS
;167	HANDLE NULL COMMAND (BUG IN EDIT 163)
;170	FIX BUG IN 155
;171	(10-XXXX) PRINT LH(.RBELB) AS CONI IN OCTAL
;172	PICK UP 507 MTCHR. DATA ON TAPES
;173	(10-10324) USE % PREFIX ON FILE NOT FOUND
;174	(10-11580) ADD /AUTHOR /PRDIRECTORY /PRDEVICE
;175	SUPPRESS TOTAL OF 0 FILES MESSAGE
;176	FIX BUGS IN EDIT 162
;177	FIX FORMAT BUG IN 173
;200	(10-11,233) PRINT RIB BLOCK NUMBER IN /DETAIL
;201	COUNT BLOCKS ON DTA FOR /SUM LINE
;202	SUPPRESS TITLES ON DTA, TMP LISTINGS
;203	COMMENT OUT BACKUP/RESTORE CODE
;204	USE C,SCNMAC AS UNIVERSALS
;205	PRINT SUMMARIES BEFORE SUBSEQUENT ERROR MESSAGES
;206	PRINT UFD NAME AS [P,PN] IN FILE READING ERROR MESSAGE
;207	LIST SFD CONTENTS AFTER DIRECTORY CONTAINING SFD
;210	EXTEND 164 TO SUPPORT /MESSAGE LEVEL
;211	REMOVE BUG OF LISTING [,,SFD] TWICE
;212	IN /F WITHOUT /W, GIVE NAME.EXT FOR SPEED
;213	RECOGNIZE SIXBIT TAPE LABELS
;214	(10-11,493) FORCE OUTPUT AT END OF DIRECTORY IN /F
;215	(10-12,805) INDICATE THAT /DEN/PAR ARE AS READ, NOT AS WRITTEN
;216	(10-12,995) WARN OF PARITY ERROR ON DTA, BUT STILL GIVE DIRECTORY
;217	DON'T FORCE OUTPUT ON A TAB
;220	(10-13049) IMPLEMELT /SUM IF DTA, TMP
;221	(10-13048) IMPLEMELT /CHECK, /AUTH, /ACCESS IF IN /F
;222	EXCLUDE THE RIBS FROM MTA CHECKSUM
;223	HANDLE /F/SUM TO NOT SAY 0 BLOCKS
;224	FIX MISC BUGS SINCE V. 3
;225	(10-13458) ADD /FDTA
;226	(QAR 2173) ALLOW DTA3:=DTA3:, ETC.
;227	CANCEL 157
;230	ADD FRS FORMAT AND PRELIMINARY BACKUP FORMAT
;231	ADD FS.NFS
;232	SUPPORT .OSDFS
;233	SUPPORT /OKPROTECTION
;234	(Q2811-2) CANCEL 227 WITH FT$IPF

;%4(234) 11/74

;235	(10-14824) CORRECTION FOR FRS FORMAT
;236	(10-14820) REMOVE DOT IN F.EXT WHEN /F/SORT
;237	(10-14828) FIX PROBLEM WITH FILE CONSTRAINTS BEING IGNORED
;240	(10-14942) FIX PROBLEM WITH JUNK LABELS CAUSING ILL MEM REF
;241	(10-14972) FIX BAD MFS ERROR MESSAGE DURING FRS DIRECTORIES
;242	(10-14975) FIX FRS TAPE ERROR PROCESSING FOR ILL UUO, ETC.
;243	(10-15399) FIX FRS %DRTJFS ERROR FOR NULL FILES
;244	(10-15717) FIX BUG CAUSING ALL FILE OUTPUT TO BE
;		DUPLICATED ON TTY AFTER PREFIX-ONLY "DRTLKE"
;245	(10-16555) BREAK FOR SUBTOTALS CORRECTLY AND
;		SHOW UNIT ONLY WHEN /UNITS
;246	(10-16552) /SORT SUPPRESS PUTTING DIRECTORY AND
;		STRUCTURE ON SEPARATE LINE IN /WIDTH
;300	(10-15,415) IMPROVE EDIT 243
;301	FIX BACKUP BUGS
;302	SUPPORT REWORKED BACKUP FORMAT TO /INTERCHANGE LEVEL
;303	CHANGE ASSEMBLY PROCEEDURE TO USE .REQUEST
;304	CHANGE SYMBOLS F$???? TO B$????
;305	FIX BUG IN FRS/CHECKSUM IF DISK FILE WAS 4(MOD 5) BLOCKS
;306	SUPPORT .EXE FILES
;307	(S70-427) BUG-SUPPRESS DIRECTORY FROM SUMMARY
;		IF 2 ONE FILE OUTPUTS
;310	(Q2489) LIST VERSION Z, AZ, BZ CORRECTLY
;311	(Q2990) SPEED UP BY LETTING WILD KEEP CHANNEL 0 OPEN
;312	DON'T FORCE LINES ON LPT:
;313	(S55-134) CLEAR INITIAL FLAGS SO TCHR OK FROM .ISCAN
;314	(S70-152) CHANGE "INPUT" TO "SOURCE" IN MESSAGES
;315	ADD FEATURE TESTS FOR MAGTAPE CODE
;316	EXTEND 302 TO FILES NOT STARTING AT 0
;317	ADD /COMPARE TO SUPPRESS ALL OVERHEAD LINES
;320	(SER 55-219) IMPROVE /W WITH /N, ETC.
;321	REMOVE WAIT FOR LPT (VIA FT$LPW)
;322	ADD /INDIRECT TO MAKE AN INDIRECT FILE
;323	(QAR 3647) FIX PRINT DECISION ON /UNITS
;324	REMOVE EXTRA BLANK LINES INADVERTENTLY INSERTED
;		BY EDIT 307
;325	USE JOBDAT AS A UNIVERSAL; CHANGE EXTERNS TO ##
;326	CORRECT BUG IN WHICH OUTPUT FILE DIRECTORY WAS IGNORED
;327	REMOVE BLANK LINES ON /SUMMARY
;330	PERMIT /W FOR DECTAPES TOO
;331	FIX LISTING OF BACKUP FORMAT MAG-TAPE WITH SFD'S
;332	(SPR-17317) SEARCH SYS AFTER NEW IF ERSATZ DEVICE SYS
;	REQUESTED AND /NEW ENABLED.
;333	MAKE VERSION CHECKING FOR .EXE FILES WORK
;334	MAKE [226] WORK WHEN EXPLICIT EXTENSION GIVEN (OR NOT A DISK)
;335	CLEAN UP LISTINGS UNDER /TITLE (NOTE THAT THE "SPOOLING"
;	WORD IS NOT REALLY HANDLED - SPACED - CORRECTLY YET)
;336	FIX /NOPRDEVICE & /NOPRDIRECTORY WITH /INDIRECT
;
;%5(336) 5/76
;
;337	(10-19832) Fix problems with edit 221 to allow /ACCESS
;	when running /F mode.
;340	(10-19987) If /L is being used, always send
;	output to the LPT:, unless an explicit output
;	device is specified.
;
;341	SPR # 10-20668	L.C.R	28-Oct-76.
;	Allow for a file length  of up to 8 digits so that the /SORT
;	/WORDS switches can be used together.
;	Areas affected: FLEXT5+4, LDEC8:, to LDEC5:
;
;342	SPR # 10-21432	L.C.R	18-Jan-77.
;	Make DIRECT ignore /AUTHOR when using /INDIRECT.
;	Areas affected: INDEF2 +15(6).
;		NOTE:: Also changed DIRECT to search MACTEN & UUOSYM
;		       instead of C.
;
;343	SPR # 10-21445	L.C.R.	18-JAN-77.
;	Allow for a 'UFD' of up to four digits so that the listing
;	is aligned when using the /SORT switch even when combined
;	 with the /WORDS switch.
;	Areas affected: FLEXT3: + 4.
;
;344	SPR # 10-21921	L.C.R.	15-FEB-77.
;EDITS 344-357 ARE RESERVED FOR MAINTENANCE FIXES
;
;	Make DIRECT check the concatenation requirements
;	before counting any lookup errors.
;	Areas affected:	E.DFLL.
;
;345	SPR #10-21653 AND 10-21654	LCR.	28-FEB-77.
;	Make direct give the correct file lenght when the format is unknown,
;	also clear the R.MTOH bit when done with a mag tape
;	DIRECT will give the correct checksum if the file comes from DISK.
;	Areas affected: MTSVST,
;			MTDONX, ADD LABEL KCHKSM TO HOLD THE CURRENT CHECKSUM TEPMORARALY.
;

;346	When printing the length of a file, check to see
;	if the /WORDS switch was specified
;	before spacing to 8 places.
;
;347	SPR # 10-22018	LCR.	07-JUN-77.
;	Teach DIRECT to check the file requirements before doing the LOOKUP
;	in order to avoid unnecesary LOOKUPs when using the construct
;	.DIRECT SYS:'NOT'.EXE
;	Areas affected: DOLOK1:.
;
;350	SPR # 10-22319   LCR	27-JUN-77.
;	Make /COMPARE more intelligent when doing a directory of
;	non-standard file names IE: [1,1]
;	Areas affected:	FLUFD:,LCHR1:. also create new label S.FUFD
;
;351	SPR # 10-22614	LCR.	30-JUN-77.
;	Teach DIRECT not to print a line over the WIDTH limit when using /F/W:x.
;	Areas affected:	GLDEF2:, FILEND:,
;			create label S.LENT to hold the maximun length of an entry
;
;352	SPR # 10-23040	MHK	30-AUG-77
;	TEACH DIRECT TO RECOGNIZE THE /NOPRDEV AND /NOPRDIR SWITCHES
;	WHEN THE /WIDTH SWITCH IS SET.
;	AREAS AFFECTED: SSTRD7+11
;
;%6(400)
;
;400	ADD SUPPORT FOR NEW WORDS DEFINED IN THE RIB BY 6.03
;	UNITS WRITTEN WORD, LAST ACCOUNTING DATE/TIME (UFD), EXPIRATION
;	DATE/TIME (UFD), AND ACCOUNT STRING (FILE RIB)
;
;401	NO SPR	LCR	09-06-77.
;	FIX THE /TIME SWITCHES. THIS CODE WAS BROKEN BY EDIT 347.
;	AREAS AFFECTED: DOLOK1 + 3.
;
;402	SPR # 10-22690	LCR	09-SEP-77.
;	Eliminate the multiple printing of crlf's
;	as well as title lines on empty pages.
;	Areas affected: TITLEX,LCRLF,LCHR1
;			  Create new flag  L.CRLF
;
;403	NO SPR #	LCR	16-SEP-77.
;	Move the label S.FUFD down from the S.MIN area
;	so that /COMPARE is not ignored.
;	Area affected: S.FUFD
;
;404	NO SPR #	LCR	21-SEP-77.
;	Move three lines of code at DOLOK1 down to DOLOK3
;	before the LOOKUP.
;	This will insure that AC T1 has the correct information
;	for the LOOKUP.
;	This cures the problem of DIRECT printing garbage on the
;	lenght field when using the "OR" or the "+" notation.
;	Areas affected: DOLOK1, DOLOK3
;
;405    SPR # 10-25184  WCL     30-MAY-78.
;       Avoid checksumming files when searching for Version No. unless
;       specifically requested
;	Areas affected: NEXDT3
;
;406	SPR # 10-24955  WCL     31-MAY-78.
;	Make PDL 20 words longer (LN$PDL)
;
;407	SPR # 10-24595  WCL	1-JUNE-78.
;	Much time wasted looking for 1776 identification code in block header
;	preparatory to searching for .JBVER if file is null (CRASH.EXE for example);
;	make it ignore version search if first word of file = 0
;	Areas affected: VERE.1
;
;410	SPR # 10-25016  WCL	23-JUNE-78
;	Make aware of new format of RIBELB (same as BAFELB)
;	Areas affected: DLERRB
;
;411	SPR # 10-26027  WCL	11-JULY-78
;	Checksums taken incorrectly under certain circumstances; CHKSUM
;	not zeroed after every file
;	Areas affected: LCHECK
;
;412	NO SPR	RDH	22-AUG-78
;	ADD /FNDDAT SWITCH TO GENERATE FIND DATABASE OUTPUT. ADD
;	/DIRECT TO GENERATE ASCII LISTING OUTPUT. ADD /MVOLUM TO
;	ASK OPERATOR TO MOUNT MULTI VOLUMES FOR BACKUP SAVESETS.
;	DEFAULT /WID FOR TTY TO TTY-WIDTH ELSE AD.WID; ADD NEW
;	SWITCHS /FLSDIR TO PRINT FIRST-LINE STR/DIR (CURRENT DE-
;	FAULT) AND /HDSDIR TO PRINT STR/DIR AS "HEADER" (AS CUR-
;	RENTLY DOES ON /WID). ADD /PRVERS TO FORCE PRINTING
;	(/NOPRVE TO SUPPRESS ALWAYS) THE VERSION FIELD. SPEED
;	UP CHECKSUMMING.
;
;413	NO SPR	RDH	14-SEP-78
;	[412] MESSED UP /INDIRECT
;
;414	NO SPR	RDH	24-NOV-78
;	[412] CONFUSED TOTALS IF /WORDS; MAKE /ACCESS TAKE LARGE
;	VALUES.
;
;415	SPR # 10-26384  VLR		14-SEPT-78
;	"+" Notation not working for directories of Mag tapes.
;	Areas affected: MTDONX
;
;416	NO SPR	RDH	22-DEC-78
;	ADD /[NO]RETRY TO CONTROL AUTOMATIC MONITOR RETRY ON I/O ERROR
;	SO CAN FIND SOFT ERROR FILES WHICH BOOTS CAN'T READ.
;
;417	NO SPR	RDH	21-JAN-79
;	HANDLE MORE GRACEFULLY (THAN ?ILL MEM REF) INTERCHANGE TAPES
;	WRITTEN BY DUMPER (WHICH LEAVES ALL SORTS OF JUNK ON THE TAPE).
;
;420	NO SPR	RDH	3-NOV-79
;	CHANGE /FNDDAT TO /FNDBLD, ADD /FIND TO READ THE DATA FILES
;	WRITTEN BY /FNDBLD, ADD /FNDDAT:<FILE> TO SPECIFY THE DATA FILES
;	TO READ ON /FIND (DEFAULT IS SYS:FNDDAT).
;
;421	NO SPR	RDH	8-NOV-79
;	FIX CASE OF "ACCOUNT" IN DETAILED LISTING. KEEP DIRECTORY OPENED
;	ON SEPARATE CHANNEL. THIS SPEEDS UP DIRECTORY LISTINGS OF AREAS
;	OTHER THAN JOB'S PATH BY ABOUT 20%.
;
;422	NO SPR	RDH	20-NOV-79
;	/NOMARKS TYPED EXPLICITLY AS COMMAND GETS OVER-RIDDEN BY /MARKS
;	IN SWITCH.INI; JUNK TAPES (E.G., WRITTEN BY PIP) ATTEMPT TO LIST
;	CHECKSUM EVEN IF NO CHECKSUM HAS BEEN CALCULATED.
;
;423	NO SPR	RDH	4-JAN-80
;	421 DIDN'T QUITE WORK. ELAPSED TIME FOR DIRECTORIES OTHER THAN
;	JOB'S PATH IS REDUCED BY APPROXIMATELY ONE HALF (SINGLE RP04, LOTS
;	OF SMALL (TYPICALLY 10-20 FILES) DIRECTORIES.
;
;424	NO SPR	RDH	2-FEB-80
;	FIND DATA FILES CREATED WITH BUM CREATION DATE BY ZAPPING RH(.RBEXT).
;
;425	NO SPR	DC	4-MAR-80
;	ON MAGTAPES, TRY TO PRINT HEADER INFO FROM .TFLPR TAPOP.
;
;426	NO SPR	RDH	11-MAY-80
;	ALLOW FILE LENGTHS TO BE 5 DIGITS WIDE
;
;427	SPR 29355 TARL	21-JULY-80
;	INCORRECT PATH WHEN GIVING A FULL FILE-SPECIFICATION AND
;	/SCAN, /LIB, /SYS, OR /SEARCH ARE SET. DO PATH. UUOS
;	MORE OFTEN.
;
;430	NO SPR	RDH	22-JUL-80
;	C(.RBDED) = .INFIN MEANS "ETERNITY".
;
;431	QAR 10-04624	RDH	15-SEP-80
;	.RBXTR OFF BY ONE (TOO SMALL)
;
;432	QAR <ASSORTED>	RDH	24-SEP-80
;	TYPE OUT MORE INFORMATION ON I/O ERRORS, IN PARTICULAR, READ
;	AND LIST THE "EXTENDED I/O ERROR" STATUS. ADD /[NO]ERLOG TO
;	CONTROL ERROR LOGGING. SUPPRESS TAPE LABEL GENERATION AND
;	VERSION IF ZERO.
;
;433	QAR 10-04838	RDH	27-OCT-80
;	EMBEDDED BLANKS IN /INDIRECT OUTPUT.
;
;434	QAR 10-04841	RDH	27-OCT-80
;	-1 DOESN'T SUCCESSFULLY FOOL WILD IF USER HAS SETSRC-STYLE LIB:
;	DEFINED.
;
;435	QAR 10-04971	RDH	20-NOV-80
;	EDIT 427 DOESN'T WORK; "MOVEI" SHOULD BE A "MOVE"
;
;436	QAR 10-05221	RDH	7-JAN-81
;	IF ON A LABELED TAPE (MEANING PROCESSED BY PULSAR) NO GENERATION
;	IS PRESENT THE TRAILING QUOTE GETS LEFT OFF OF THE NAME STRING.
;
;437	QAR 10-05244/05265 RDH	13-JAN-81
;	DEFEAT EDIT 427 UNTIL WILD VERSION 7 B GETS TO THE FIELD
;	(ERSATZ:FILE.EXT FAILS)
;
;440	QAR 10-05956	RDH	2-JUN-81
;	/FNDBLD/NODIRECT NOT AS FAST AS IT SHOULD BE
;
;441	QAR 10-06068	AWC	12-JUN-81
;	FIX DIRECTORIES OF LABELED MAG TAPES
;
;DIRECT %6(441) RELEASED JUNE, 1981
;
;442	SPR # 10-32298  AH	3-MAY-82
;	DIRECT/WIDTH:80 DOES NOT DISPLAY IN 2 COLUMNS
;	This edit undoes [412] in so far as the default width of the
;	/NORMAL directory listing is concerned - [412] made DIRECT assume
;	a default of 8 spaces for the version field if no /[NO]PRVERSION,
;	0 if /NOPRVERSION, and 16 if /PRVERSION. Revert to simply 0 unless
;	/PRVERSION, in which case use 16. This will mean /NORMAL listing
;	will try to fit into 40-space columns (so that 2 will fit into
;	80-column TTYs), but if a version field gets typed then the column
;	will be messed up (this is what DIRECT used to do prior to [412]).
;
;
;443	SPR 10-32768  AH    08-JUL-82
;	DIRECT/WIDTH:80 EXTENDED PAST COLUMN 80 AND WRAPPED AROUND
;	EDIT [351] dealt with DIRECT/F/W:X so that it would not wrap around.
;	DIRECT/W:X now acknowledges the width if /F is or is not used
;	If a directory is going to be larger than 80 columns
;	a new directory line is output.
;
;444	SPR 10-31928	RDH	16-Aug-82
;	/INDIRECT of a magtape confused the structure name of the first
;	file for each structure.
;
;445	SPR 10-32184  ERS	20-SEP-82
;	Make DIRECT/ACCOUNT/SORT space correctly.
;
;446	ERS 	20-SEP-82
;	DIRECT/SORT/NOPRDEV (or DIRECT/SORT dev:) does not create fixed length
;	records which is useful in SORTing.
;
;447	SPR 10-33339	RDH	1-FEB-83
;	More tape-label-error message problems.
;	NO SPR
;	Address check if /FNDBLD/DIRECT - OUTIN set E.LC one too large.
;
;450	SPR 10-33633	BAH	11-Mar-83
;	A directory of an FRS-formatted tape containing SFDs does not print
;	the SFD on the summary line.
;
;451	SPR 10-33907	RDH	3-Jan-84
;	/TITLE misaligned if /WORDS specified.
;
;452	SPR 10-33368	RDH	3-Jan-84
;	/PRDIR/PRDEV confuses multi-column listing (/WIDTH) if /HDSDIR
;
;453	SPR 10-34256	AQH/RDH	3-Jan-84
;	/MVOLUME doesn't work with MDA-controlled tapes (/LABEL:USER-EOT)
;
;454	SPR 10-32532	RDH	12-Jan-84
;	/FNDBLD of a BACKUP/INTERCHANGE tape writes garbage for directories.
;
;455	No SPR		RDH	12-Jan-84
;	Add new DEVOP. error codes
;
;	End of Revision History
VERWRD==<12,,%%FXVE>		;SCAN/WILD INTERFACE PROTOCOL VERSION


	LOC	.JBVER
	EXP	%%DIRECT
	RELOC
	SUBTTL	MACRO DEFINITIONS

;N$FAIL <XYZ,FOO> SENDS FOO WITH PREFIX "DRTXYZ" AS A FATAL ERROR

DEFINE	N$FAIL ($PFX,$TEXT),<
E$$'$PFX':
	MOVEI	T1,''$PFX''
	PJSP	T2,ERROR
	XLIST
	ASCIZ	\$TEXT\
	LIST
>


;N$FAIX <XYZ,FOO> SEND FOO WITH PREFIX "DRTXYZ" AS START OF A FATAL MESSAGE
;FINAL CALL TO .TCRLF MUST BE LABELLED "X$$XYZ"

DEFINE	N$FAIX ($PFX,$TEXT),<
E$$'$PFX':
	MOVEI	T1,''$PFX''
	XLIST
IFNB <$TEXT>,<	MOVEI	T2,[ASCIZ \$TEXT \] >
IFB  <$TEXT>,<	MOVEI	T2,0 >
	PUSHJ	P,ERRORC
	TXNN	T1,JWW.FL
	JRST	X$$'$PFX'
	LIST
>


;N$FAIN <XYZ,FOO> SENDS FOO WITH PREFIX "DRTXYZ" AS A FATAL ERROR
;WITH P3 IN SIXBIT

DEFINE	N$FAIN ($PFX,$TEXT),<
E$$'$PFX':
	MOVEI	T1,''$PFX''
	XLIST
IFNB <$TEXT>,<	MOVEI	T2,[ASCIZ \$TEXT \] >
IFB  <$TEXT>,<	MOVEI	T2,0 >
	PUSHJ	P,ERRORC
	TXNN	T1,JWW.FL
	JRST	LFERX
	MOVE	T1,P3
	PUSHJ	P,.TSIXN##
	JRST	LFERX
	LIST
>
;N$FAID <XYZ,FOO> SENDS FOO WITH PREFIX "DRTXYZ" AS A FATAL ERROR
;WITH P3 IN DECIMAL

DEFINE	N$FAID ($PFX,$TEXT) <
E$$'$PFX':
	MOVEI	T1,''$PFX''
	XLIST
IFNB <$TEXT>,<	MOVEI	T2,[ASCIZ \$TEXT \] >
IFB  <$TEXT>,<	MOVEI	T2,0 >
	PUSHJ	P,ERRORC
	TXNN	T1,JWW.FL
	JRST	LFERX
	MOVE	T1,P3
	PUSHJ	P,.TDECW##
	JRST	LFERX
	LIST	
>


;N$FAIO <XYZ,FOO> SENDS FOO WITH PREFIX "DRTXYZ" AS A FATAL ERROR
;WITH P3 IN OCTAL

DEFINE	N$FAIO ($PFX,$TEXT),<
E$$'$PFX':
	MOVEI	T1,''$PFX''
	XLIST
IFNB <$TEXT>,<	MOVEI	T2,[ASCIZ \$TEXT \] >
IFB  <$TEXT>,<	MOVEI	T2,0 >
	PUSHJ	P,ERRORC
	TXNN	T1,JWW.FL
	JRST	LFERX
	MOVE	T1,P3
	PUSHJ	P,.TOCTW##
	JRST	LFERX
	LIST
>


;N$FAII <XYZ,FOO> SENDS FOO WITH PREFIX "DRTXYZ" AS A FATAL ERROR
;WITH P3 IN I/O CHANNEL STATUS

DEFINE	N$FAII ($PFX,$TEXT),<
E$$'$PFX':
	MOVEI	T1,''$PFX''
	XLIST
IFNB <$TEXT>,<	MOVEI	T2,[ASCIZ \$TEXT \] >
IFB  <$TEXT>,<	MOVEI	T2,0 >
	PUSHJ	P,ERRORC
	TXNN	T1,JWW.FL
	JRST	LFERX
	MOVE	T1,P3
	PUSHJ	P,IOERM
	JRST	LFERX
	LIST
>
;N$WARN <XYZ,FOO> SEND FOO WITH PREFIX "DRTXYZ" AS A WARNING MESSAGE

DEFINE	N$WARN ($PFX,$TEXT),<
E$$'$PFX':
	MOVEI	T1,''$PFX''
	XLIST
	MOVEI	T2,[ASCIZ \$TEXT\]
	PUSHJ	P,WARN
	PUSHJ	P,.TCRLF##
	LIST
>


;N$WRNX <XYZ,FOO> SEND FOO WITH PREFIX "DRTXYZ" AS START OF A WARNING MESSAGE
;FINAL CALL TO .TCRLF MUST BE LABELLED "X$$XYZ"

DEFINE	N$WRNX ($PFX,$TEXT),<
E$$'$PFX':
	MOVEI	T1,''$PFX''
	XLIST
IFNB <$TEXT>,<	MOVEI	T2,[ASCIZ \$TEXT \] >
IFB  <$TEXT>,<	MOVEI	T2,0 >
	PUSHJ	P,WARN
	TXNN	T1,JWW.FL
	JRST	X$$'$PFX'
	LIST
>
	SUBTTL	ASSEMBLY PARAMETERS

;ASSEMBLY INSTRUCTIONS:
;
;	.LOAD DIRECT
;	.NSSAVE
;
;ASSUMES MACTEN.UNV, JOBDAT.UNV, UUOSYM.UNV, AND NSCAN.UNV ON UNV:
;	 SCAN.REL, HELPER.REL, AND WILD.REL ON REL:

;ASSEMBLY PARAMETERS

ND	FT$LPW,0	;1=WAIT IF LPT NOT AVAILABLE
ND	FT$MTA,-1	;INCLUDE MAGTAPE FEATURES IN GENERAL
ND	FT$MTB,-1	;INCLUDE MAGTAPE FEATURES FOR BACKUP
ND	FT$MTF,-1	;INCLUDE MAGTAPE FEATURES FOR FAILSAFE
ND	FT$MTL,-1	;[425] INCLUDE MAGTAPE LABELING FEATURES (.TFLPR)
ND	FT$MTR,0	;INCLUDE MAGTAPE FEATURES FOR OLD BACKUP/RESTORE
ND	FT$MTS,-1	;INCLUDE MAGTAPE FEATURES FOR FRS

ND	LN$LPP,^D55	;LINES PER PAGE OF DATA
ND	LN$MRC,^D674	;LENGTH OF DEFAULT MINIMUM MAG TAPE RECORD
ND	LN$PDL,200	;LENGTH OF PUSH-DOWN LIST
ND	LN$RIB,55	;LENGTH OF DIRECTORY LOOKUP BLOCK
ND	LN$BLK,200	;LENGTH OF SCRATCH BLOCK - MIN:200 (DECTAPE, ETC.)
ND	LN$LBS,^D1024	;LENGTH OF "LARGE" DISK BUFFER

ND	NM$DBF,^D10	;NUMBER OF DISK BUFFERS FOR INPUT
ND	NM$LBS,^D04	;NUMBER OF "LARGE" DISK BUFFERS FOR INPUT
ND	NM$MBF,^D5	;[412] NUMBER OF MAGTAPE BUFFERS FOR INPUT


IFE FT$MTA,<	FT$MTB==0
		FT$MTF==0
		FT$MTR==0
		FT$MTS==0>

IFN FT$MTS,<	FT$MTB==-1>

IFL LN$RIB-41,<PRINTX ? RIB BLOCK TOO SMALL FOR FAILSAFE>



;SWITCH DEFAULTS

	RADIX	10
DM	ACC,^O1777777777,0,5
DM	FIL,100000,0,1
DM	WID,250,132,0
	RADIX	8
	SUBTTL	SYMBOLS - REGISTERS; I/O CHANNELS

;AC NAMES

F=0		;FLAGS (LH=PERMANENT, RH=TEMPORARY)
T1=1		;TEMPORARIES
T2=2
T3=3
T4=4

P1=5		;PRESERVED
P2=6
P3=7
P4=10

I=11		;GENERAL INDEX REGISTERS
J=12

C=14		;TEMP DEFS FOR LISTING ROUTINES
N=15
M=16
P=17		;PUSH-DOWN POINTER

	.XCREF	F, T1, T2, T3, T4, P1, P2, P3	;[412] CONSERVE PAPER
	.XCREF	P4, I, J, C, N, M, P		;[412] CONSERVE TREES

;I/O CHANNELS

DC==1		;READ DATA FILE
LC==2		;OUTPUT (DIRECTORY LISTING)
DF==3		;[412] DATA FILE OUTPUT (/FNDBLD OUTPUT)
PF==4		;[412] POINTER FILE OUTPUT (/FNDBLD OUTPUT)
DG==5		;[420] DATA FILE INPUT (/FIND)
PG==6		;[420] POINTER FILE INPUT (/FIND)
TW==7		;[421] DIRECTORY CHANNEL TO HOLD ACCESS TABLE OPEN
	SUBTTL	SYMBOLS - FLAG BITS IN "F"

;FLAGS (LH)

L.SVST==(1B0)	;SAVE SET FLAG FOR MT UNTANGLING
L.FKEF==(1B1)	;FAKE EOF TO TRICK DISK CODE
L.BKSS==(1B2)	;OLD BACKUP/RESTORE STYLE SAVE SET
L.SVDW==(1B3)	;SAVED WORD IN INPUT AREA
L.FEOF==(1B4)	;END OF FIND DATA FILE (IN DFGET)
L.ILEN==(1B5)	;INCORRECT LENGTH
L.IMLB==(1B6)	;IMBEDDED LABEL
L.LENT==(1B7)	;LONG ENTER OK
L.FRSS==(1B8)	;BACKUP/FRS SAVE SET
L.FRMT==(1B9)	;[335] FORMAT OUTPUT (I.E., EITHER /SORT OR /TITLES)
L.CRLF==(1B10)	;[402] SUPPRESS MULTIPLE CRLF'S.
L.SBTT==(1B11)	;[412] LAST LINE WAS SUB/TOTAL (WANT BLANK LINE)
L.BPOP==(1B12)	;[412] POPJ FLAG USED BY NEXDV
L.MLBL==(1B14)	;[425] TAPE IS LABELLED NICELY
L.MLBP==(1B15)	;[441] TAPE CONTROLLED BY LABEL PROCESSOR

;FLAGS (RH)

R.WORD==1B18	;QUANTITIES ARE IN WORDS NOT BLOCKS
R.TYPE==1B19	;FORCE TYPEOUT AS WELL AS LISTING
R.ACCS==1B20	;FORCE A FILE ACCESS
R.LSOM==1B21	;SOME OUTPUT SENT
R.OUTD==1B22	;OUTPUT DEVICE INITTED
R.OUTL==1B23	;FORCE OUTPUT AFTER EACH LINE
R.SLOW==1B24	;SLOW FORMAT  --DO NOT MOVE OR INTERCHANGE
R.FAST==1B25	;FAST FORMAT  --THIS ORDER REQUIRED
R.OUTO==1B26	;OUTPUT DEVICE OPEN AND IT IS OUR TTY:
R.LPTB==1B27	;LPT BUSY--WAITING
R.LTAB==1B28	;SET IF TAB TO BE LISTED NEXT
R.FEAT==1B27	;EAT FILES (SPECIAL DTA MODE IN DIRLP)
R.NDSK==1B30	;SET IF NOT A DISK DIRECTORY			[202]
R.LBSX==1B31	;SET IF SIXBIT LABELS				[213]
R.MTOH==1B32	;MT OVERHEAD WORD COMING NEXT			[222]
R.NSF==1B33	;NOT START OF FILE				[316]
R.SPLN==1B34	;SUPPRESS LINE					[317]
R.STAB==1B35	;[335] SUPPRESS NEXT TAB (AT CALL TO LTAB)
	SUBTTL	SYMBOLS - FILE BLOCK NAMES

IF2,<		;ONLY PASS 2 SINCE LOCATION OF LOOKUP BLOCK DEFINED AT END

	DEFINE DR(A,B),<IFL .RB'B-LN$RIB,<A=LBLOCK+.RB'B>>
	DEFINE DQ(A),<DR (F'A,A)>

DR	RIBLEN,CNT;	BLOCK LENGTH
DR	UFDPPN,PPN;	PROJECT-PROGRAMMER NUMBER OR POINTER TO DIRECTORY
DQ	NAM;		FILE NAME
DQ	EXT;		FILE EXTENSION
DR	FCRE,PRV;	PROTECTION, CREATION, ETC.
DR	FLEN,SIZ;	FILE LENGTH
DQ	VER;		VERSION
DQ	SPL;		SPOOLED NAME
DQ	EST;		ESTIMATED LENGTH
DQ	ALC;		ALLOCATED LENGTH
DQ	POS;		POSITION ALLOCATED
DQ	UFW;		UNITS WHICH WROTE FILE (UNIT,, CONTROLLER-APR SERIAL #)
DQ	NCA;		CUSTOMER NON-PRIV
DQ	MTA;		DISK BACKUP TAPE
DQ	DEV;		LOGICAL UNIT
DQ	STS;		FILE STATUS BITS
DQ	ELB;		ERROR LOGICAL BLOCK
DQ	EUN;		ERROR UNIT AND LENGTH
DQ	QTF;		FCFS QUOTA
DQ	QTO;		LOGGED OUT QUOTA
DQ	QTR;		RESERVED QUOTA
DQ	USD;		BLOCK IN USE
DQ	AUT;		AUTHOR
DQ	NXT;		CONTINUED STR
DQ	PRD;		PREVIOUS STR
DQ	PCA;		PRIV CUSTOMER ARG
DQ	UFD;		POINTER BACK TO UFD
DQ	FLR;		RELATIVE BLOCK IN FILE COVERED BY THIS RIB
DQ	XRA;		POINTER TO NEXT RIB IN CHAIN
DQ	TIM;		CREATION DATE,,TIME IN INTERNAL FORMAT
DQ	LAD;		LAST ACCOUNTING DATE/TIME
DQ	DED;		DIRECOTRY EXPIRATION DATE/TIME
DQ	ACT;		FIRST WORD OF THE ACCOUNT STRING
DQ	AC2;		SECOND WORD OF THE ACCOUNT STRING
DQ	AC3;		THIRD WORD OF THE ACCOUNT STRING
DQ	AC4;		FOURTH WORD OF THE ACCOUNT STRING
DQ	AC5;		FIFTH WORD OF THE ACCOUNT STRING
DQ	AC6;		SIXTH WORD OF THE ACCOUNT STRING
DQ	AC7;		SEVENTH WORD OF THE ACCOUNT STRING
DQ	AC8;		EIGHTH WORD OF THE ACCOUNT STRING

	.RBXTR==.RBAC8+1	;LAST THING WE KNOW ABOUT

DQ XTR;	EXTRA RIB WORDS START HERE

>	;END IF2
	SUBTTL	SYMBOLS - MAGTAPE -- BACKUP FORMAT

T$LBL==1	;[412] TAPE LABEL
T$SSS==2	;[412] START SAVE SET
T$ESS==3	;[412] END SAVE SET
T$FIL==4	;DISK FILE DATA
T$DIR==5	;[412] DIRECTORY RECORD
T$EOV==6	;[412] END OF VOLUME
T$CMT==7	;[412] COMMENT
T$CSS==10	;[412] CONTINUE SAVE SET

T$MAX==10	;LARGEST RECORD TYPE

G$FLAG==3	;RECORD DEPENDENT BITS

GF$EOF==1B0	;LAST RECORD OF FILE
GF$RPT==1B1	;REPEAT OF LAST RECORD WRITE ERROR
GF$NCH==1B2	;[412] THIS RECORD NOT CHECKSUMMED
GF$SOF==1B3	;[412] THIS RECORD IS START OF FILE

A$FHLN==0	;ATTRIBUTE HEADER FIXED LENGTH REGION
A$FLGS==1	;ATTRIBUTE FLAGS
A$WRIT==2	;LAST WRITE DATE
A$ALLS==3	;ALLOCATED SIZE
A$MODE==4	;MODE
A$LENG==5	;LENGTH
A$BSIZ==6	;BYTE SIZE
A$VERS==7	;VERSION
A$PROT==10	;PROTECTION
	PR$ATR==7B31	;ATTRIBUTES
	PR$WRT==3B33	;WRITE
	PR$RED==3B35	;READ
A$NOTE==12	;ANNOTATION
A$REDT==14	;LAST READ (ACCESS)
A$ESTS==16	;ESTIMATED SIZE
A$RADR==17	;REQUESTED ADDRESS
A$CUSR==22	;AUTHOR
A$BKID==23	;LAST BACKUP TAPE
A$USRW==30	;NON-PRIVILEGED CUSTOMER WORD
A$PCAW==31	;PRIVILEGED CUSTOMER WORD

.FCDEV==1	;DEVICE
.FCNAM==2	;NAME
.FCEXT==3	;EXTENSION
.FCVER==4	;VERSION
.FCGEN==5	;GENERATION
.FCDIR==40	;TOP LEVEL DIRECTORY
.FCSFD==41	;SFD NAME					[331]

;ALSO SEE STORAGE BLOCKS B$???? IN STORAGE SECTION
	SUBTTL	STARTUP AND INITIALIZATION

;HERE AFTER START OR RUN OR DIRECTORY COMMAND OR RUN UUO

DIRECT:	TDZA	T1,T1		;CLEAR OFFSET
	MOVEI	T1,1		;SET OFFSET
	MOVEM	T1,OFFSET	;STORE IT

	RESET			;RESET ANY EXTERNAL I/O
	SETZB	F,ZCOR		;CLEAR CORE			[313]
	MOVE	T1,[ZCOR,,ZCOR+1]
	BLT	T1,EZCOR
	MOVE	P,[IOWD LN$PDL,PDLST]	;ESTABLISH PUSH-DOWN LIST

	MOVE	T1,[ 4,,[VERWRD
			IOWD  1,['DIRECT']
			OFFSET,,'DIR'
			0,,TCHR]]
	PUSHJ	P,.ISCAN##	;INITIALIZE COMMAND SCANNER

	MOVE	T1,.JBFF	;SAVE ORIGINAL VALUE
	HRL	T1,.JBREL	; OF .JBREL AND			[163]
	MOVEM	T1,ORGFF	; OF .JBFF

;CONTINUED ON NEXT PAGE
	SUBTTL	MAIN LOOP FOR COMMAND SCANNING

;FALL HERE FROM PREVIOUS PAGE

MAINLP:	MOVE	P,[IOWD LN$PDL,PDLST]
	MOVE	T1,[ 7,,[VERWRD
			IOWD DRSWTL,DRSWTN
			DRSWTD,,DRSWTM
			0,,DRSWTP
			'DIRECT'
			CLANS,,0
			AIN,,AOUT]]
	PUSHJ	P,.TSCAN##	;GET THE COMMAND
	SKIPN	I.NXZR		;SEE IF ANYTHING		[167]
	JRST	[PUSHJ P,.CLRFL##  ;NO--CLEAR FILE AREA		[167]
		 PUSHJ P,AIN	;ALLOCATE ONE SPEC		[167]
		 PUSHJ P,.GTSPC##  ;COPY IT IN			[167]
		 JRST  .+1]	;AND PROCEED			[167]
	MOVE	T1,[ 6,,[VERWRD
			IOWD DRSWTL,DRSWTN
			DRSWTD,,DRSWTM
			0,,DRSWTP
			'DIRECT'
			'DIRECT']]
	PUSHJ	P,.OSCAN##	;SCAN USER OPTIONS
	MOVE	F,FLAGS		;GET INITIAL FLAGS
	JRST	DEFAUL		;GO FILL IN DEFAULTS


;SUBROUTINE TO CLEAR ANSWER AREA

CLANS:	SETZM	S.ZER		;ZERO OUT COMMAND ACCUMULATORS
	MOVE	T1,[S.ZER,,S.ZER+1]
	BLT	T1,S.EZER
	SETOM	S.MIN		;PRESET SWITCH PARAMETERS
	MOVE	T1,[S.MIN,,S.MIN+1]
	BLT	T1,S.EMIN
	SETZM	I.NXZR		;AND FOR SCANING
	CLOSE	LC,CL.ACS!CL.DAT;TERMINATE LISTING IF OPEN
	RELEAS	LC,		;  IN CASE OF ERROR RESTART
	CLOSE	DF,CL.ACS!CL.DAT;[412] CLOSE OFF DATA FILE
	RELEAS	DF,		;[412] AND DUMP DEVICE
	CLOSE	PF,CL.ACS!CL.DAT;[412] CLOSE OFF POINTER FILE
	RELEAS	PF,		;[412] AND DITCH IT TOO.
	SETZM	B.LC+.BFPTR	;SET FLAG FOR LISTING CLOSED
	TRZ	F,-1		;CLEAR ALL LOCAL FLAGS
	HRRZ	T1,ORGFF	;RESTORE ORIGINAL VALUE		[163]
	MOVEM	T1,.JBFF	; OF .JBFF
	MOVEM	T1,I.INZR	; FOR .WILD			[163]
	HLRZ	T1,ORGFF	;RESTORE .JBREL			[163]
	CAME	T1,.JBREL	; UNLESS OK			[163]
	CORE	T1,		; TELL MONITOR			[163]
	  JFCL			;(IGNORE ERROR)			[163]
	POPJ	P,		;RETURN
;SUBROUTINE TO ALLOCATE OUTPUT FILE AREA

AOUT:	MOVEI	T1,O.BLK	;POINT TO IT
	MOVEI	T2,.FXLEN	;AND LENGTH
	POPJ	P,		;AND RETURN

;SUBROUTINE TO ALLOCATE INPUT FILE AREA

AIN:	MOVEI	T1,.FXLEN	;ADVANCE ALLOCATION
	SKIPN	I.NXZR		;SEE IF STARTED YET
	MOVE	T1,I.INZR	;NO--START AT BEGINNING
	ADDB	T1,I.NXZR	;AND STORE NEW VALUE
	MOVEI	T2,.FXLEN(T1)	;COMPUTE NEXT FREE		[163]
	MOVEM	T2,.JBFF	; STORE FOR LATER		[163]
	SOS	T2		;GET END			[163]
	CAMG	T2,.JBREL	;SEE IF IN CORE			[163]
	JRST	AINX		;YES--NO SWEAT			[163]
	CORE	T2,		;NO--GET MORE CORE		[163]
	  JRST	E$$TMI		;ERROR IF NO ROOM		[163]
AINX:	HRLZ	T2,T1		;POINT TO START			[163]
	HRRI	T2,1(T1)	;SETUP NEXT ADDR		[163]
	SETZM	(T1)		;CLEAR NEW			[163]
	BLT	T2,.FXLEN-1(T1)	; AREA				[163]
	MOVEI	T2,.FXLEN	;SET LENGTH
	POPJ	P,		;RETURN
	SUBTTL	FILL IN DEFAULTS AFTER COMMAND SCANNING

;HERE AT END OF COMMAND -- SUPPLY ABSENT FILE DEFAULTS

DEFAUL:	MOVEI	P1,O.BLK	;ADDRESS OF OUTPUT FILE SPEC BLOCK
OUDEF0:	MOVE	T1,P1		;ADDRESS OF OUTPUT FILE SPEC BLOCK
	MOVEI	T2,O.LZER	;LENGTH OF OUTPUT FILE SPEC BLOCK
	PUSHJ	P,.OSDFS##	;APPLY SWITCH.INI DEFAULTS AS NEEDED
	MOVE	P2,O.BLK+.FXFLD	;GET FIELD FLAGS
	TXNE	P2,FX.WXX	;WERE ANY WILDCARDS TYPED?
	JRST	E.OWI		;YES, BOMB OUT NOW
	SKIPLE	S.FBLD		;IF /FNDBLD,
	SETOM	S.DODV		; THEN DON'T ALLOW /L
	TXNE	P2,FX.UDV	;DID USER SUPPLY A DEVICE?
	JRST	OUDEF1		;YES
	SKIPG	S.FBLD		;IF /FNDBLD, OR
	TXNE	P2,FX.UND!FX.UDR!FX.UNM!FX.UEX  ;ANYTHING ELSE TYPED,
	SKIPA	T1,['DSK   ']	;THEN LIST ON DISK
	MOVSI	T1,'TTY'	;NO, THEN LIST ON CONTROLLING TTY
	SKIPLE	S.DODV		;SEE IF /L SWITCH
	MOVSI	T1,'LPT'	;YES, DEFAULT OUTPUT DEVICE TO LPT:
	SETO	T2,		;FULLY NON-WILD
	DMOVEM	T1,.FXDEV(P1)	;SET OUTPUT DEVICE IN FILE SPEC BLOCK

OUDEF1:	HRLOI	T1,'DIR'	;[340] DEFAULT OUTPUT EXTENSION
	SKIPLE	S.IND		;IF /INDIRECT,
	HRLOI	T1,'CCL'	;USE DIFFERENT DEFAULT
	SKIPN	.FXEXT(P1)	;HAVE AN EXTENSION?
	MOVEM	T1,.FXEXT(P1)	;NO, SET DEFAULT

	MOVE	T4,.FXDEV(P1)	;GET "LISTING" DEVICE
	MOVE	T1,.FXMOD(P1)	;GET PHYSICAL FLAG
	TXNN	T1,FX.PHY	;SEE IF /PHY
	DEVCHR	T4,		;NO, LOGICAL DEVICE REFERENCE
	TXNE	T1,FX.PHY	;SEE IF /PHY
	DEVCHR	T4,UU.PHY	;YES, PHYSICAL DEVICE REFERENCE
	TXNE	T4,DV.DSK	;[334] SEE IF DISK
	TLOA	F,L.LENT	;YES--INDICATE LONG ENTER
	TLZ	F,L.LENT	;NO
	TXNN	T4,DV.LPT	;SEE IF TYPE LPT
	JRST	OUDEF2		;NO--PROCEED
	TRNN	F,R.FAST!R.SLOW	;SEE IF ANY SPEED SWITCH
	TRO	F,R.SLOW	;NONE--SET TO SLOW MODE
	MOVEI	T1,1		;  (PRESET VALUE)
	SKIPGE	S.TITL		;  AND NO TITLE SWITCH
	MOVEM	T1,S.TITL	;YES--SET DEFAULT TITLE ON
OUDEF2:	MOVE	T1,S.SUM	;GET /SUMMARY
	TXNE	T4,DV.TTA	;SEE IF CONTROLLING TTY
	TROA	F,R.OUTO	;YES--SET FLAG
	JRST	[SKIPGE T1		;UNLESS USER SET /SUM, FORCE SUMMARIES
		MOVEI	T1,1		;  OK--SET SUMMARIES
		JRST	.+1]		;PROCEED
	MOVEM	T1,FLFSUM	;STORE FLAG FOR FORCED SUMMARIES
	TXNE	T4,DV.TTY	;SEE IF LINE MODE DEVICE
	TRO	F,R.OUTL	;YES, DO OUTPUT ON EVERY LINE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

	SKIPN	.FXNAM(P1)	;WAS OUTPUT FILE NAME GIVEN?
	TXNN	T4,DV.DIR	;NO, SEE IF FILE NAME NEEDED
	JRST	OUDEF8		;NO--GO ON
	TLC	T4,-1-<(DV.TTA)>;SEE IF NUL:
	TLCN	T4,-1-<(DV.TTA)>; ..
	JRST	OUDEF8		;YES--ENTER NOT NEEDED
	SKIPLE	S.FBLD		;[412] /FNDBLD?
	JRST	[MOVE	T1,['FNDDAT']	;[412] YES, DEFAULT FILENAME
		SETO	T2,		;INDICATE NON-WILD
		DMOVEM	T1,.FXNAM(P1)	;[412] STORE IN SCAN BLOCK
		JRST	OUDEF6]		;[412] FINISH DEFAULTS
	MSTIME	T1,		;YES--MANUFACTURE NAME HHMMSS
	IDIVI	T1,^D1000	;GET SECONDS
	MOVE	T4,[POINT 6,.FXNAM(P1)]	;SETUP BYTE POINTER
	MOVSI	T3,-6		;INITIALIZE LOOP COUNTER
OUDEF4:	IDIV	T1,[^D36000
		    ^D3600
		    ^D600
		    ^D60
		    ^D10
		    ^D1](T3)	;GET NEXT DIGIT
	ADDI	T1,'0'		;CONVERT TO SIXBIT DIGIT
	IDPB	T1,T4		;STORE INTO NAME
	MOVE	T1,T2		;RESTORE REMAINDER
	AOBJN	T3,OUDEF4	;LOOP
	SETOM	.FXNMM(P1)	;INDICATE NOT WILD		[165]
OUDEF6:	N$WRNX	(DLF,Directory listing to file /)
	MOVE	T1,P1		;ADDRESS OF OUTPUT FILE SPEC BLOCK
	PUSHJ	P,.TFBLK##	;TYPE IT OUT
X$$DLF:	PUSHJ	P,.TCRLF##	;CAP OFF "WARNING" WITH A CRLF

OUDEF8:	SETZM	H.ZER		;CLEAR OUT SUMMARY AREA FOR OUTPUT
	MOVE	T1,[H.ZER,,H.ZER+1]
	BLT	T1,H.EZER
	SETOM	LNPP		;PRESET TO FORCE PAGE EJECT

;OUTPUT FILE DEFAULTED, SET IT UP FOR LISTING OUTPUT

OUDEF9:	PUSHJ	P,OUTIN		;OPEN OUTPUT FILE		[165]

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;HERE TO SUPPLY INPUT SIDE DEFAULTS

INDEF:	MOVE	P1,I.INZR	;INITIALIZE BLOCK POINTER

INDEF0:	MOVE	T1,P1		;POINT TO SPEC
	MOVEI	T2,.FXLEN	;INDICATE LENGTH
	PUSHJ	P,.OSDFS##	;APPLY SWITCH.INI DEFAULTS AS NEEDED
	SKIPLE	S.FIND		;/FIND?
	SKIPA	T1,['*     ']	;YES, DEFAULT DEVICE TO MATCH ANYTHING
	MOVSI	T1,'DSK'	;FORCE DEFAULT DEVICE
	MOVE	T4,.FXMOD(P1)	;GET THE SWITCHES AND BITS WORD
;SCAN BUG - AT THIS POINT FX.NDV WILL BE SET FOR CONSTRUCTIONS OF THE FORM
; "BLKC:*.* ([*,*])" WHICH CAUSE US ALL SORTS OF TROUBLE . . . THEREFORE WE
;USE A STUPID SKIP INSTEAD. SIGH. -RDH
	SKIPN	T2,.FXDEV(P1)	;SIGH.
	JRST	.+4		;SIGH.
	TXZE	T4,FX.NDV	;NO DEVICE GIVEN (HA!)?
	CAME	T2,['DSK   ']	;MAYBE, SCAN LEAVE US A "DSK:"
	JRST	INDEF1		;NO, THEN SCAN GOT DEVICE FROM USER, KEEP IT
	CAMN	T1,['*     ']	;WHAT SORT OF DEFAULT DEVICE?
	TDZA	T2,T2		;A WILD ONE
	SETO	T2,		;A NON-WILD ONE
	DMOVEM	T1,.FXDEV(P1)	;USE OUR DEFAULT DEVICE
	MOVX	T1,FX.WDV	;THE WILDCARDS-IN-DEVICE BIT
	AOJE	T2,.+2		;WILDCARDS PRESENT?
	IORM	T1,.FXFLD(P1)	;YES

INDEF1:	SKIPLE	S.FIND		;/FIND?
	SKIPE	.FXDIR(P1)	;YES, USER GIVE A DIRECTORY?
	JRST	INDEF4		;NOT /FIND OR USER SUPPLIED A DIRECTORY
	MOVEI	T3,.FXDIR(P1)	;ADDRESS OF DIRECTORY WORDS
	HRLI	T3,-.FXLND	;LENGTH (COUNTING UFD)
	SETZ	T2,		;ALL DIRECTORY LEVELS TO BE FULLY-WILD
	SKIPA	T1,[377777,,377777]  ;UFD WILDCARD
INDEF2:	MOVSI	T1,'*  '	;SFD WILDCARD
	DMOVEM	T1,(T3)		;DEFAULT DIRECTORY ENTRY
	ADDI	T3,1		;POINT TO WILDCARD MASK
	AOBJN	T3,INDEF2	;FILL OUT FULL DIRECTORY BLOCK
	MOVX	T2,FX.WDR	;THE DIRECTORY WILDCARDS BIT
	IORM	T2,.FXFLD(P1)	;SET IN FIELDS FLAGS

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

INDEF4:	SKIPE	.FXNAM(P1)	;SEE IF FILE NAME
	JRST	INDEF6		;YES--NO DEFAULT
	MOVSI	T1,'*  '	;NO--SET WILD DEFAULT
	SETZ	T2,		;FULL WILD MASK
	CAME	P1,I.INZR	; FOR FIRST ONE
	DMOVE	T1,.FXNAM-.FXLEN(P1)	;PREVIOUS FOR REST
	DMOVEM	T1,.FXNAM(P1)	;STORE IN ARRAY
	MOVX	T1,FX.WNM	;THE FILE NAME WILDCARDED FLAG
	AOSE	T2		;WILDCARDS PRESENT IN FILE NAME?
	IORM	T1,.FXFLD(P1)	;YES, SET IN THE SCAN BLOCK

INDEF6:	SKIPN	T2,.FXEXT(P1)	;SIGH.
	JRST	.+4		;SIGH.
	TXZE	T4,FX.NUL	;NULL EXTENSION?
	TLNE	T2,-1		;MAYBE - ANYTHING THERE?
	JRST	INDEF7		;TRUST ALREADY EXTANT EXTENSION
	MOVSI	T1,'*  '	;DEFAULT EXTENSION
	CAME	P1,I.INZR	;FIRST SPEC?
	MOVE	T1,.FXEXT-.FXLEN(P1)  ;NO, USE PREVIOUS SPEC INSTEAD
	MOVEM	T1,.FXEXT(P1)	;SET DEFAULT EXTENSION
	TLO	T1,-1		;"EXTEND" WILDCARD MASK
	MOVX	T2,FX.WEX	;THE WILDCARDED EXTENSION FLAG
	AOSE	T1		;ANY WILDCARDS HERE?
	IORM	T2,.FXFLD(P1)	;YES, REMEMBER FOR WILD

INDEF7:	MOVX	T1,FX.STR	;SET MULTIPLE STR CODE
	TDNN	T1,.FXMOM(P1)	;UNLESS USER HAS DEFEATED IT
	IORM	T1,.FXMOD(P1)	;SET IN THE MOD WORD
	MOVX	T1,FX.PRT	;DEFAULT TO /ERPROT
	TDNN	T1,.FXMOM(P1)	; ..
	IORM	T1,.FXMOM(P1)	; ..

	ADDI	P1,.FXLEN	;ADVANCE POINTER
	CAMG	P1,I.NXZR	;SEE IF DONE YET
	JRST	INDEF0		;NO--LOOP BACK

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;HERE TO SUPPLY DEFAULTS FOR GLOBAL SWITCHES

GIDEF:	SKIPG	S.FIND		;/FIND SPECIFIED?
	JRST	GIDEF1		;NO, NORMAL INPUT
	SKIPLE	S.ACCS		;/ACCESS ALSO?
	PUSHJ	P,[N$WARN (IF1,/ACCESS ignored in conjunction with /FIND)
		SETOM	S.ACCS	;ZAPETH THE SWITCH
		POPJ	P,]	;NO MORE /ACCESS
	SKIPLE	S.ACCT		;OR /ACCOUNT?
	PUSHJ	P,[N$WARN (IF2,/ACCOUNT ignored in conjunction with /FIND)
		SETOM	S.ACCT	;ZAPETH THE SWITCH
		POPJ	P,]	;NO MORE /ACCOUNT
	SKIPLE	S.ALC		;OR /ALLOCATE?
	PUSHJ	P,[N$WARN (IF3,/ALLOCATE ignored in conjunction with /FIND)
		SETOM	S.ALC	;ZAPETH THE SWITCH
		POPJ	P,]	;NO MORE /ACCOUNT
	SKIPLE	S.AUT		;OR /AUTHOR?
	PUSHJ	P,[N$WARN (IF4,/AUTHOR ignored in conjunction with /FIND)
		SETOM	S.AUT	;ZAPETH THE SWITCH
		POPJ	P,]	;NO MORE /AUTHOR
	SKIPLE	S.DTL		;OR /DETAIL?
	PUSHJ	P,[N$WARN (IF5,Not all /DETAIL file information available with /FIND)
		POPJ	P,]	;BUT DO WHAT WE CAN
	SKIPL	S.UNIT		;OR /UNIT?
	PUSHJ	P,[N$WARN (IF6,/UNIT ignored in conjunction with /FIND)
		SETOM	S.UNIT	;ZAPETH THE SWITCH
		POPJ	P,]	;NO MORE /UNIT
	MOVEI	T1,1		;"ON" SWITCH SETTING
	SKIPGE	S.PRDE		;USER GIVE EXPLICIT DEVICE/
	SKIPL	S.PRDI		;DIRECTORY PRINTING CONTROL?
	JRST	GIDEF1		;YES, LEAVE IT ALONE THEN
;	SKIPGE	S.PRVE		;OR USER GIVE VERSION/
	SKIPL	S.CHK		;CHECKSUM PRINTING CONTROL?
	JRST	GIDEF1		;YES, LEAVE IT ALONE THEN
	MOVEM	T1,S.PRDE	;NO, DEFAULT TO /PRDEVICE AND
	MOVEM	T1,S.PRDI	;/PRDIRECTORY ON /FIND
;	MOVEM	T1,S.PRVE	;/PRVERSION ALSO
	MOVEM	T1,S.CHK	;/CHECKSUM AS WELL

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;[413] SET UP SWITCHS FOR /INDIRECT OUTPUT

GIDEF1:	SKIPG	S.IND		;/INDIRECT SPECIFIED?
	JRST	GIDEF3		;NO
	TRZ	F,R.SLOW	;CLEAR /S			[322]
	TRO	F,R.FAST	;SET /F				[322]
	MOVEI	T1,1		;SET VALUE
	SETZM	S.ACCT		;[413] CLEAR /ACCOUNT
	SETZM	S.AUT		;[413] CLEAR /AUTHOR
	MOVEM	T1,S.CMP	;[413] SET /COMPARE (KILL HEADERS)
	SETZM	S.DTL		;[413] CLEAR /DETAIL
	MOVEM	T1,S.FLSD	;[413] SET /FLSDIR (PRINT STR/DIR)
	SETZM	S.HDSD		;[413] CLEAR /HDSDIR
	SKIPGE	S.PRDE		;[413] /[NO]PRDEVICE?
	MOVEM	T1,S.PRDE	;[413] NO, DEFAULT /PRDEVICE
	SKIPGE	S.PRDI		;[413] /[NO]PRDIRECTORY?
	MOVEM	T1,S.PRDI	;[413] NO, DEFAULT /PRDIRECTORY
	SETZM	S.SORT		;[413] CLEAR /SORT
	SETZM	S.WDTH		;[413] SET /WIDTH:0

GIDEF3:	SKIPLE	S.CMP		;IF /COMPARE,			[317]
	SKIPL	S.TITL		; AND NO /TITLE			[317]
	SKIPA			;NO				[317]
	SETZM	S.TITL		; SET /NOTITLE			[317]

	SKIPLE	S.DTL		;SEE IF /DETAIL
	TRZ	F,R.FAST!R.SLOW	;YES--CLEAR /FAST/SLOW
	SKIPGE	S.SORT		;IS SORT MODE SPECIFIED
	SETZM	S.SORT		;NO--CLEAR FLAG
	MOVEI	T1,1
	SKIPGE	S.REWS		;SEE IF /NOREW
	MOVEM	T1,S.REWS	;NO--SET /REW
	SKIPGE	S.EOT		;SEE IF /NOEOT
	MOVEM	T1,S.EOT	;NO--SET /EOT
	SKIPLE	S.FBLD		;[412] /FNDBLD?
	MOVEM	T1,S.CHK	;[412] YES, FORCE /CHECKSUM
	SKIPLE	S.FBLD		;[412] /FNDBLD?
	SKIPL	S.MVOL		;[412] AND /MVOL OR /NOMVOL?
	SKIPA			;[412] NO TO ONE OF ABOVE
	MOVEM	T1,S.MVOL	;[412] YES, DEFAULT TO /MVOLUM

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

	MOVN	T2,S.FLSD	;[412] /FLSDIR
	SUB	T2,S.HDSD	;[412] /HDSDIR
	SUB	T2,S.PRDE	;[412] /PRDEVICE
	SUB	T2,S.PRDI	;[412] /PRDIRECTORY
	CAIE	T2,4		;[412] IF ANY OF ABOVE GIVEN
	JRST	GLDEF2		;[412] AT LEAST ONE OF ABOVE
	SKIPL	S.WDTH		;[412] /WIDTH OF SOME FORM?
	JRST	GLDEF1		;[412] YES, DEFAULT /HDSDIR
	MOVEM	T1,S.FLSD	;[412] NO,  DEFAULT /FLSDIR
	SETZM	S.HDSD		;[412] NO, DEFAULT /NOHDSDIR
	JRST	GLDEF2		;[412] GO CHECK FOR /DETAIL

GLDEF1:	SETZM	S.FLSD		;[412] DEFAULT /NOFLSDIR
	MOVEM	T1,S.HDSD	;[412] DEFAULT /HDSDIR

GLDEF2:	SKIPG	S.DTL		;[412] /DETAIL?
	JRST	GLDEF3		;[412] NO
	SETZM	S.FLSD		;[412] YES, FORCE /NOFLSDIR
	SETZM	S.HDSD		;[412] YES, FORCE /NOHDSDIR

GLDEF3:	SKIPN	S.PRDE		;[412] IF NOT /NOPRDEVICE
	SKIPE	S.PRDI		;[412] AND NOT /NOPRDIRECTORY
	JRST	GLDEF4		;[412] (IT'S NOT)
	SETZM	S.FLSD		;[412] /NOPRDE/NOPRDI, FORCE
	SETZM	S.HDSD		;[412] /NOFLSDIR/NOHDSDIR

GLDEF4:	SKIPGE	S.FLSD		;[412] IF NOT SOME FORM OF
	SKIPL	S.HDSD		;[412] /[NO]FLSDIR OR /[NO]HDSDIR
	SKIPA			;[412] (AT LEAST ONE SPECIFIED)
	MOVEM	T1,S.FLSD	;[412] DEFAULT TO /FLSDIR

	SKIPL	S.FLSD		;[412] IF /[NO]FLSDIR
	SKIPL	S.HDSD		;[412] AND NOT /[NO]HDSDIR
	SKIPA			;[412] (IT'S NOT)
	SETZM	S.HDSD		;[412] FORCE /NOHDSDIR

	SKIPGE	S.FLSD		;[412] IF NOT /[NO]FLSDIR
	SKIPGE	S.HDSD		;[412] AND /[NO]HDSDIR
	SKIPA			;[412] (IT'S NOT)
	SETZM	S.FLSD		;[412] FORCE /NOFLSDIR

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

GLDEG:	SKIPLE	S.IND		;[413] /INDIRECT?
	JRST	GLDEW		;[413] YES, LEAVE /WIDTH ALONE
	MOVEI	T1,AD.WID	;[412] DEFAULT LINE WIDTH
	TRNN	F,R.OUTL	;[412] OUTPUT TO A TTY?
	JRST	GLDEG2		;[412] NO, USE CURRENT DEFAULT
	MOVEI	T3,LC		;[412] YES, I/O CHANNEL
	IONDX.	T3,		;[412] FROM WHICH TO GET UDX
	 JRST	GLDEG2		;[412] ???
	MOVE	T1,[2,,T2]	;[412] TRMOP. POINTER TO
	MOVEI	T2,.TOWID	;[412] READ TTY WIDTH
	TRMOP.	T1,		;[412] ASK MONITOR FOR TTY WIDTH
	 MOVEI	T1,AD.WID	;[412] ???
GLDEG2:	SKIPN	S.WDTH		;[412] /WIDTH WITH NO VALUE?
	MOVEM	T1,S.WDTH	;[412] YES, USE DEFAULT
	SKIPGE	S.WDTH		;[412] /WIDTH OF ANY TYPE?
	SETZM	S.WDTH		;[412] NO, SET FOR INTERNAL USE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

GLDEW:	TRNN	F,R.FAST	;[412] /FAST?
	JRST	GLDEW3		;[412] NO
	MOVEI	T1,^D16		;[412] YES, BASIC /FAST WIDTH
	SKIPLE	S.CHK		;[412] /CHECKSUM?
	ADDI	T1,^D8		;[412] YES
	SKIPLE	S.HDSD		;[452] DOING /HDSDIR FORMAT LISTING?
	JRST	GLDEW6		;[452] YES, THEN /PRDIR/PRDEV DON'T COUNT
	SKIPLE	S.PRDE		;[412] /PRDEVICE?
	ADDI	T1,^D8		;[412] YES
	SKIPLE	S.PRDI		;[412] /PRDIRECTORY?
	ADDI	T1,^D24		;[412] YES, USUALLY FITS IN 24 SPACES
	JRST	GLDEW6		;[412] GO CHECK ON NUMBER OF COLUMNS

GLDEW3:	MOVEI	T1,^D40		;WIDTH IF /N			[330]
	TRNE	F,R.SLOW	;				[320]
	MOVEI	T1,^D64		;/S				[320]
	SKIPLE	S.CHK		;				[320]
	ADDI	T1,^D8		;/CHECKSUM			[320]
	SKIPLE	S.AUT		;				[320]
	ADDI	T1,^D16		;/AUTHOR			[320]
	SKIPLE	S.PRDE		;[412] /PRDEVICE?
	SKIPLE	S.HDSD		;[452] DOING /HDSDIR FORMAT LISTING?
	JRST	GLDEW4		;[452] YES, THEN /PRDIR/PRDEV DON'T COUNT
	ADDI	T1,^D8		;[412] YES
	SKIPLE	S.PRDI		;[412] /PRDIRECTORY?
	ADDI	T1,^D24		;[412] YES, USUALLY FITS IN 24 SPACES
GLDEW4:				;[452]
;	SKIPE	S.PRVE		;[412] [442] /NOPRVERSION?
;	ADDI	T1,^D8		;[412] [442] NO, USUALLY FITS IN 8 SPACES
;	SKIPLE	S.PRVE		;[412] [442] /PRVERSION?
;	ADDI	T1,^D8		;[412] [442] YES, FITS IN 16 SPACES TOTAL
;	SKIPLE	S.PRVE		;[442] [443] /PRVERSION?
;	ADDI	T1,^D16		;[442] [443] YES, ASSURE 16 SPACES FOR VERSION

GLDEW6:	MOVEM	T1,S.LENT	;[351] SAVE THE MAX LENGTH OF AN ENTRY
	SKIPLE	T2,S.WDTH	;GET /WIDTH			[320] [330]
	SUB	T2,T1		;REMOVE LENGTH OF AN ENTRY	[320]
	SKIPL	T2		;IF NEGATIVE			[320]
	SKIPLE	S.DTL		; OR /DETAIL			[320]
	MOVEI	T2,0		; KILL WIDTH			[320]
	MOVEM	T2,MXWDTH	;STORE AS RIGHTMOST BEFORE NEW LINE
	SKIPG	S.TITL		;[335] IF TITLE'ING, OR
	SKIPLE	S.SORT		;[335] IF SORT'ING
	 TLO	F,L.FRMT	;[335] THEN FLAG FORMATTED OUTPUT

;CONTINUED ON NEXT PAGE
	SUBTTL	DIRECTORY LISTING LOOP

;CONTINUED FROM PREVIOUS PAGE

;HERE TO RUN OVER THE INPUTS, AND DO THE WORK

DOIT:	MOVE	T1,I.INZR	;INITIALIZE POINTER
	MOVEM	T1,I.NXRD	;  TO INTERP. COMMANDS
	MOVE	T1,.JBFF	;SAVE INPUT
	MOVEM	T1,SVJBFF	; .JBFF

ISLOOP:	PUSHJ	P,DIR		;GO DO A DIRECTORY
	 JFCL			;HOHUM
	SKIPN	B.LC+.BFPTR	;SEE IF OPEN
	JRST	ISLOP1		;NO--SKIP THE CLOSE
	CLOSE	LC,		;CLOSE OFF LISTING FILE
	STATZ	LC,IO.ERR	;SEE IF ANY ERROR
	  PUSHJ	P,LCHRWR	;YES--REPORT IT
	RELEAS	LC,		;AND RELEASE DEVICE
ISLOP1:	SETZM	B.LC+.BFPTR	;CLEAR INITED FLAG

	SKIPG	S.FBLD		;[412] /FNDBLD?
	JRST	ISLOP4		;[412] NO, DON'T CLOSE FIND FILES THEN
	WAIT	DF,		;[412] FLUSH OUT ALL DATA FILE DATA
	STATZ	DF,IO.ERR	;[412] ANY LAST MOMENT ERRORS?
	  JRST	DFERR		;[412] OOPS - GIVE ERROR MESSAGE
	WAIT	PF,		;[412] FLUSH OUT ALL POINTER FILE DATA
	STATZ	PF,IO.ERR	;[412] ANY LAST MOMENT ERRORS
	  JRST	PFERR		;[412] YES, ABORT AND GIVE MESSAGE
	CLOSE	DF,		;[412] CLOSE OFF DATA FILE
	RELEAS	DF,		;[412] DITCH DEVICE
	CLOSE	PF,		;[412] CLOSE OFF POINTER FILE
	RELEAS	PF,		;[412] GET RID OF DEVICE

ISLOP4:	JRST	MAINLP		;ALL DONE
;FILE SCANNING ERRORS

E$$TMI:	MOVE	T1,['DRTTMI']	;INDICATE DIRECT MESSAGE CODE
	MOVE	T2,["?",,[ ASCIZ \Too many source files\ ] ] ; [314]
	MOVEI	T3,E$$TMI	;POINT TO ERROR CODE
	PUSHJ	P,.ERMSA##	;ISSUE MESSAGE
	PJRST	.FMSGE##	;COMPLETE ERROR PROCESSING
	SUBTTL	DIRECTORY LISTING SETUP

;DIR -- PERFORM A DIRECTORY LISTING
;CALL:	PUSHJ	P,DIR
;	RETURN WHEN DONE
;OUTPUT FILE ALREADY OPENED; INPUT POINTED TO BY I.NXRD

DIR:	SETZM	H.ZER1		;CLEAR OUT COUNTERS
	MOVE	T1,[H.ZER1,,H.ZER1+1]
	BLT	T1,H.EZER
	SETZM	ABORTI		;[432] CLEAR ABORTION BLAG
	MOVEI	I,0		;FLAG LOKWLD TO START
	SKIPLE	S.WORD		;SEE IF /WORD
	TROA	F,R.WORD	;YES--SET WORD MODE
	TRZ	F,R.WORD	;NO--CLEAR WORD MODE
	SKIPLE	S.FIND		;/FIND?
	JRST	FNDIR		;YES, SPECIAL FILE SERVICE
;	JRST	DIRLP		;NO, NORMAL DEVIECE-DEPENDENT DIRECTORY SERVICE

;CONTINUED ON NEXT PAGE
	SUBTTL	DIRECTORY LISTING - GENERIC

;CONTINUED FROM PREVIOUS PAGE

;HERE TO LOOP ON USER-SPECIFIED FILE SPECIFICATIONS, HANDLING ANY
;SPECIAL CASES (SUCH AS MAGTAPE OR TMPCOR) AS THEY ARISE IN THE
;INPUT FILE STREAM.

DIRLP:	DMOVE	P3,FOBLK+.FOIOS	;GET PREVIOUS /PHYSICAL AND DEVICE
	MOVE	T1,[6,,[VERWRD		;PROTOCOL VERSION
		I.NXRD,,I.NXZR		;POINTER TO FIRST,,LAST FSB
		FOBLK+.FOIOS,,LBLOCK	;OPEN,,LOOKUP BLOCK ADDRESS
		.FXLEN,,LN$RIB+1	;LENGTH OF FSB,,LOOKUP
		FW.ADO!FW.DBS + I	;ALL DEVS; DIR BEFORE SUBDIR;
		WLDEOD ]]	;			[205]
	PUSHJ	P,.LKWLD##	;GET NEXT FILE
	  JRST	DIRED		;ALL DONE--OUTPUT TOTALS
;RDH	PUSHJ	P,CHKNXF	;CHECK FOR NON-EXISTENT PREVIOUS FILE
	XOR	P3,FOBLK+.FOIOS	;COMPARE /PHYS
	JUMPL	P3,DIRLP3	;IF /PHYS DIFFERENT, DO OPEN
	CAMN	P4,FOBLK+.FODEV	;SEE IF DEVICE IS DIFFERENT
	JRST	DSDEV		;DEVICE SPECIFICATION UNCHANGED, THEREFORE
				; IT IS A DISK (OR DECTAPE), SO JUST PROCESS
				; THE NEXT FILE RETURNED FROM WILD

;A DIFFERENT DEVICE SPECIFICATION, MUST OPEN IT TO SEE WHAT TO DO NEXT

DIRLP3:	TRZ	F,R.FEAT!R.NDSK	;DON'T KNOW ABOUT DEVICE YET
	SETZM	FPRV		; ANOTHER STICKY FLAG TO BE CLEARED
	MOVX	T1,IO.MOD	;THE I/O MODE FIELD
	ANDCA	T1,FOBLK+.FOIOS	;GET OPEN BLOCK I/O STATUS WORD
	IORI	T1,.IOBIN	;READ IN BINARY MODE
	SKIPE	S.RETR		;/NORETRY?
	TXZA	T1,UU.DER	;NO, LET MONITOR RETRY ON ERROR
	TXO	T1,UU.DER	;YES, FIND SOFT ERRORS TOO
	SKIPE	S.ERLO		;/NOERLOG?
	TXZA	T1,UU.DEL	;NO, ALLOW ERROR LOGGING
	TXO	T1,UU.DEL	;YES, DISABLE ERROR LOGGING
	TXO	T1,UU.SOE	;SYNCHRONIZE ON ERRORS
	MOVEM	T1,FOBLK+.FOIOS	;SET OPEN BLOCK
	MOVEI	T1,BFHD		;SET FOR OUR
	MOVEM	T1,FOBLK+.FOBRH	;  BUFFERS
	MOVE	T1,SVJBFF	;RESTORE INPUT
	MOVEM	T1,.JBFF	; .JBFF
	SETZM	BFHD+.BFADR	;NO BUFFERS YET
	SETZM	FOBLK+.FONBF	;NO BUFFERS TO BE BUILT (YET)
	SETZM	FOBLK+.FOLEB	;NO LOOKUP BLOCK (YET)
	SETZM	FOBLK+.FOPAT	;NO PATH BLOCK (YET)
	SETZM	FOBLK+.FOPPN	;NO ON-BEHALF-OF PPN
	MOVE	T1,[FO.PRV+<DC,,.FORED>]  ;READ ONLY FUNCTION ON DATA CHANNEL
	MOVEM	T1,FOBLK+.FOFNC	;SET FILOP. FUNCTION WORD

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

DIRLP5:	MOVE	T1,[.FONBF+1,,FOBLK]  ;FILOP. ARG POINTER TO
	FILOP.	T1,		;OPEN WILD'S SUGGESTED NEW DEVICE
	  JRST	[MOVS	T4,FOBLK+.FODEV	;COPY OF DEVICE THAT FAILED
		CAIN	T4,'TMP'	;WANT TMP:?
		JRST	TMDEV		;YES, FAKE IT OUT
		PUSHJ	P,E.DFF##	;ISSUE OPEN ERROR MESSAGE
		AOSE	T1		;IS THIS AN IGNORABLE ERROR?
		AOS	SNFILR		;NO, COUNT AS FILE ERROR
		SETZM	FOBLK+.FODEV	;ENSURE DEVICE IS DIFFERENT
		JRST	DIRLP]		;GO BACK AND TRY FOR MORE
	MOVEI	T1,DC		;DATA FILE CHANNEL
	DEVCHR	T1,		;SEE WHAT WE ACTUALLY GOT
	TLC	T1,-1-<(DV.TTA)>;SEE IF			[161]
	TLCN	T1,-1-<(DV.TTA)>;  NUL:			[161]
	JRST	E.NDD		;YES--ERROR			[161]
	TXNE	T1,DV.DSK	;LOOKING AT A DISK?
	JRST	DSDEV		;YES
	TXNE	T1,DV.DTA	;SEE IF DECTAPE
	JRST	DTDEV		;YES--GO OUTPUT IT
IFN FT$MTA,<	;MAGTAPES
	TXNE	T1,DV.MTA	;SEE IF MAG TAPE
	JRST	MTDEV		;YES--GO OUTPUT IT
>;END IFN FT$MTA
	TXNN	T1,DV.DIR	;UNKNOWN--SEE IF DIRECTORY TYPE
	JRST	E.NDD		;NO--ISSUE MESSAGE
E.UDV:	N$WRNX	(UDV,Unknown device type )
	MOVE	T1,FOBLK+.FODEV	;GET OFFENDING DEVICE
	PUSHJ	P,.TSIXN##	;TYPE IT OUT
X$$UDV:	PUSHJ	P,.TCRLF##	;CAP OFF THE MESSAGE
	SETZM	FOBLK+.FODEV	;FORCE A NEW LOOKUP
	JRST	DIRLP		;LOOK FOR MORE TO DO

E.NDD:	N$WRNX	(NDD,Not a directory device)
	MOVE	T1,FOBLK+.FODEV	;GET OFFENDING DEVICE
	PUSHJ	P,.TSIXN##	;TYPE IT OUT
X$$NDD:	PUSHJ	P,.TCRLF##	;CAP OFF THE MESSAGE
	SETZM	FOBLK+.FODEV	;FORCE A NEW LOOKUP
	JRST	DIRLP		;LOOK FOR MORE TO DO
;HERE ON DISK (THE NORMAL CASE)

DSDEV:	TRNE	F,R.FEAT	;EATING .LKWLD'S DECTAPE FILES?
	JRST	DIRLP		;YES, IGNORE THIS FILE THEN
	PUSHJ	P,DSDIR		;DO A DISK-BASED DIRECTORY (OF ONE FILE)
	 JFCL			;HOHUM
	JRST	DIRLP		;TRY FOR MORE


;HERE FOR DECTAPE

DTDEV:	PUSHJ	P,DTDIR		;DO A DECTAPE DIRECTORY
	 JFCL			;HOHUM
	JRST	DIRLP		;TRY FOR MORE


;HERE FOR MAGTAPE

MTDEV:	PUSHJ	P,MTDIR		;DO A MAGTAPE DIRECTORY
	 JFCL			;HOHUM
	SETZM	FOBLK+.FODEV	;ENSURE A NEW OPEN IS DONE
	JRST	DIRLP		;TRY FOR MORE


;HERE FOR TMPCOR

TMDEV:	PUSHJ	P,TMDIR		;DO A TMP: DIRECTORY (LIST TMPCOR)
	 JFCL			;HOHUM
	SETZM	FOBLK+.FODEV	;ENSURE A NEW OPEN IS ATTEMPTED
	JRST	DIRLP		;TRY FOR MORE TO DO
	SUBTTL	DIRECTORY LISTING - DISK

;HERE FOR A DISK-BASED DIRECTORY (ONE FILE AT A TIME)

DSDIR:	TRZ	F,R.ACCS	;CLEAR ACCESS NEEDED FLAG
	MOVE	T3,.WIFIR##	;GET FIRST SPEC OF CURRENT SET
	CAMN	T3,LWIFIR	;SAME AS LAST TIME WE WERE HERE?
	JRST	DSLOK		;YES
	MOVEM	T3,LWIFIR	;NO, NOTE WE GOT THIS FAR
	SETZM	FRCLOK		;ASSUME NO LOOKUP REALLY NEEDED
	TRNE	F,R.FAST	;SEE IF SUPER-SPEEDY MODE
	SKIPL	.WLDFL##	;YES--SEE IF WILD CARD
	SETOM	FRCLOK		;NO--NEED A LOOKUP
	SKIPG	S.SUM		;SEE IF/SUM
	SKIPLE	S.AUT		; OR IF /AUTHOR
	SETOM	FRCLOK		;YES--FORCE LOOKUP
	SKIPG	S.CHK		;SEE IF /CHECKSUM
	SKIPL	S.ACCS		;SEE IF /ACCESS
	SETOM	FRCLOK		;YES--FORCE LOOKUP
	SKIPLE	S.ACCT		;SEE IF /ACCOUNT
	SETOM	FRCLOK		;YES--FORCE LOOKUP
	SKIPE	FRCLOK		;DIRECTORY MODE REQUIRE A LOOKUP?
	JRST	DSLOK		;YES

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;HERE IF FAST LISTING MODE NOT NEEDING A LOOKUP (JUST WANT FILE NAME
;AND EXTENSION) - UNLESS ANY SWITCH CONSTRAINTS WERE SPECIFIED
;(SUCH AS /BEFORE OR /LENGTH).

	MOVE	T3,.WIFIR##	;START AT START
DSDIR3:	SETO	T4,		;NO-VALUE VALUE
	CAMN	T4,.FXBFR(T3)	;SEE IF /BEFORE
	CAME	T4,.FXSNC(T3)	; OR /SINCE
	SETOM	FRCLOK		;YES--NEED A LOOKUP
	CAMN	T4,.FXABF(T3)	;SEE IF /ABEFORE
	CAME	T4,.FXASN(T3)	; OR /ASINCE
	SETOM	FRCLOK		;YES--NEED A LOOKUP
	CAMN	T4,.FXPBF(T3)	;SEE IF /PBEFORE
	CAME	T4,.FXPSN(T3)	; OR /PSINCE
	SETOM	FRCLOK		;YES--NEED A LOOKUP
	CAMN	T4,.FXFLI(T3)	;SEE IF MIN /LENGTH
	CAME	T4,.FXFLM(T3)	; OR MAX /LENGTH
	SETOM	FRCLOK		;YES--NEED A LOOKUP
	LDB	T4,[POINTR .FXMOD(T3),FX.TRM]  ;GET FILE SPEC TERMINATOR
	CAIE	T4,.FXTIS	;'IFSAME' ?
	CAIN	T4,.FXTID	;'IFDIFFERENT' ?
	SETOM	 FRCLOK		;YES--NEED A LOOKUP
	CAIE	T4,.FXTIO	;'IFOLDER' ?
	CAIN	T4,.FXTIY	;'IFNEWER' ?
	SETOM	FRCLOK		;YES--NEED A LOOKUP
	CAIE	T4,.FXTIL	;'IFSMALLER' ?
	CAIN	T4,.FXTIB	;'IFBIGGER' ?
	SETOM	FRCLOK		;YES--NEED A LOOKUP
	ADDI	T3,.FXLEN	;ON ONE FILE SPEC
	CAMG	T3,.WILAS##	;SEE IF DONE ALL
	JRST	DSDIR3		;NO, LOOP

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;LOOKUP THE FILE IF NEEDED

DSLOK:	SKIPE	FRCLOK		;IS A LOOKUP NECESSARY?
	JRST	DSLOK2		;YES, DO IT THE HARD AND SLOW WAY

;HERE IF NO LOOKUP NEEDED, JUST VERIFY THE BASIC FILE SPECIFICATION

	TRNE	F,R.NDSK	;LOOKING AT A DISK?
	SETZM	UFDPPN		;NO, DECTAPE, DON'T MISLEAD .CHKTA
	PUSHJ	P,.CHKTA##	;SEE IF FILE IS REALLY OK
	 POPJ	P,		;NO, FILE REJECTED
	JRST	DSLOK8		;FILE IS OK, GO LIST IT

;HERE WHEN A LOOKUP IS NEEDED FOR THE FILE

DSLOK2:	MOVEI	T1,LBLOCK	;ADDRESS OF FILE LOOKUP BLOCK
	MOVEM	T1,FOBLK+.FOLEB	;SET IN FILOP. BLOCK
	MOVE	T1,[.PTMAX,,THSPTH]  ;ADDRESS OF FILE PATH BLOCK
	MOVEM	T1,FOBLK+.FOPAT	;SET IN FILOP. BLOCK
	SETZM	FOBLK+.FOPPN	;NO ON-BEHALF-OF PPN
	MOVX	T1,FO.PRV!FO.UOC+<DC,,.FORED>  ;LOOKUP FILE ON OPENED CHANNEL
	MOVEM	T1,FOBLK+.FOFNC	;SET FILOP. FUNCTION WORD
	MOVE	T1,[.FOPAT+1,,FOBLK]  ;FILOP. ARG POINTER TO
	TRNE	F,R.NDSK	;*** LOOKING AT A DECTAPE?
	JRST	[LOOKUP DC,LBLOCK	;*** YES, FILOP. SCREWS UP
		CAIA			;*** LOOKUP FAILED
		JRST	.+3		;*** CONTINUE WITH SUCCESSFUL LOOKUP
		HRRZ	T1,FEXT		;*** POSITION ERROR CODE
		JRST	.+2]		;*** PRETEND FILOP. CORRECTLY FAILED
	FILOP.	T1,		;LOOKUP WILD'S LATEST SUGGESTED FILE
	 PJRST	[PUSHJ	P,E.DFF##	;NOTE FILE ACCESS FAILURE
		AOSE	T1		;WAS IT AN IGNORABLE ERROR?
		AOS	SNFILR		;NO, COUNT AS FILE ERROR
		POPJ	P,]		;SO MUCH FOR THAT FILE
	MOVEI	T2,THSPTH	;ADDRESS OF RETURNED PATH BLOCK
	MOVEM	T2,UFDPPN	;SET TRUE FILE PATH
	TRNE	F,R.NDSK	;IS THIS REALLY A DISK FILE?
	JRST	[SETZM	UFDPPN		;DECTAPE, NO DIRECTORY EVER
		SETOM	FPRV		;NO PROTECTION EITHER
		SKIPG	T2,FLEN		;GET A POSITIVE WORD COUNT?
		HLRE	T2,FLEN		;NO, NEGATIVE IN LH (DTA'S ARE WIERD)
		MOVMM	T2,FLEN		;SET POSITIVE WORD COUNT
		JRST	.+1]		;AND KEEP PRETENDING TO BE A DISK
	PUSHJ	P,.CHKTA##	;GOT THE FILE, SEE IF WE REALLY WANTED IT
	 JRST	[MOVEI	T3,CL.ACS	;DON'T UPDATE ACCESS DATE
		MOVE	T2,[DC,,.FOCLS]	;WITH THE FILOP. CLOSE FUNCTION
		MOVE	T1,[2,,T2]	;FILOP. ARG POINTER TO
		FILOP.	T1,		;CLOSE THE SUCCESSFULLY-LOOKUP'ED FILE
		 JFCL			;DUH?
		POPJ	P,]		;TOSS THIS FILE AND LOOK FOR ANOTHER

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;NOW ALLOCATE DISK BUFFERS, IF NOT ALREADY SETUP

	SKIPE	BFHD+.BFADR	;GOT A BUFFER RING?
	JRST	DSLOK4		;YES
	HRROI	T3,.GTLBS	;GETTAB ARGUMENT TO
	GETTAB	T3,		;READ DEFAULT LARGE BUFFER SIZE
	 SKIPA	T1,[NM$DBF,,201];UNDEFINED, REVERT TO STANDARD BUFFERING
	MOVE	T1,[NM$LBS,,LN$LBS+1]  ;SELECT LARGE BUFFERING
	TRNE	F,R.NDSK	;ACTUALLY GOT A DECTAPE?
	HRRI	T1,201		;YES, USE SMALL BUFFERS
	ADDI	T1,2		;ALLOW FOR ALL THREE BUFFER OVERHEAD WORDS
	MOVEI	T2,BFHD		;ADDRESS OF BUFFER RING HEADER
	PUSHJ	P,MAKBUF	;BUILD DISK INPUT BUFFER RING

DSLOK4:	TRNN	F,R.NDSK	;IF LOOKING AT A DISK
	SKIPG	S.DTL		;SEE IF /DETAIL
	JRST	DSLOK8		;NOT A DISK, OR NOT /DETAIL
	USETI	DC,0		;POSITION TO RIB
	IN	DC,		;READ RIB
	  SKIPA	T1,BFHD+.BFPTR	;GET BUFFER POINTER
	JRST	DSLOK8		;ERROR--CAN'T READ RIB
	MOVE	T1,200(T1)	;GET POINTER TO SELF
	MOVEM	T1,FRIBLK	;SAVE FOR OUTPUT
	MOVNI	T1,200		;SIZE OF BLOCK 0 (RIB)
	ADDM	T1,BFHD+.BFCTR	;SKIP IT (WANT TO CHECKSUM ONLY USER DATA)
	MOVEI	T1,200		;SIZE OF BLOCK 0 (RIB)
	ADDM	T1,BFHD+.BFPTR	;ADVANCE BYTE POINTER PAST BLOCK 0

;FILE IS GOOD, GO LIST IT

DSLOK8:	PUSHJ	P,ANALYZ	;GO ANALYZE AND PRINT RESULTS
	 JFCL			;IGNORE
	SKIPE	FRCLOK		;WAS A LOOKUP PERFORMED?
	CLOSE	DC,CL.ACS	;YES, MAKE SURE IT GOES AWAY PEACEABLY
	JRST	.POPJ1##	;RETURN FOR ANOTHER FILE
;HERE AT END OF DISK DIRECTORY

DIRED:	PUSH	P,T1		;SAVE .LKWLD TERMINATION CODE
	MOVEM	I,I.NXRD	;STORE PROGRESS
	JUMPE	P4,DIRDON	;IF NO DISKS PENDING, GO WRAP UP
DIREDF:	PUSHJ	P,DIRET		;GO OUTPUT TOTALS LINE

;HERE WHEN DONE WITH DISKS--SEE IF NEXT DEVICE IS REASONABLE AND GO DISPATCH

DIRDON:	MOVE	T1,SVJBFF	;RESTORE INPUT
	MOVEM	T1,.JBFF	; .JBFF
	SETZM	H.ZER1		;CLEAR ACCUMULATION AREA
	MOVE	T2,[H.ZER1,,H.ZER1+1]  ; ..
	BLT	T2,H.EZER	; ..
	POP	P,T1		;RESTORE DEVCHR OF NEXT DEVICE
	CAMN	T1,[-1]		;SEE IF ALL DONE
	POPJ	P,		;YES--RETURN
	N$FAIL	(LEU,.LKWLD returned unknown termination reason)

;CALLED FROM WILD AT END OF DIRECTORY

WLDEOD:;RDH	PUSHJ	P,CHKNXF	;CHECK FOR NON-EX FILE ERROR	[205]
	TRNE	F,R.FAST	;IF /F				[205]
	SKIPLE	S.SUM		; AND NOT /SUM			[205]
	SKIPN	.WLDFL##	;SEE IF MULTIPLE DIRECTORIES	[205]
	PJRST	.TNEWL		;RETURN				[205,214]
	PJRST	SUBTOT		;YES--ISSUE SUBTOTALS		[205]
	SUBTTL	DIRECTORY LISTING - DECTAPE

;HERE WHEN DEVICE IS A DECTAPE
;
;UNLESS /DTA WAS SPECIFIED, TREAT DECTAPE JUST LIKE DISKS, PUTTING
;WHATEVER SMARTS ARE NEEDED IN "NORMAL" DISK SERVICE TO HANDLE DECTAPES'
;VARIOUS IDIOSYNCASIES . . .

DTDIR:	TRO	F,R.NDSK	;INDICATE NOT A DISK		[202]
	SKIPG	S.DTA		;/DTA (OLD COMPACT LISTING FORMAT)?
	JRST	DSDIR		;NO, TREAT AS "NORMAL" DIRECTORY DEVICE
	TRO	F,R.FEAT	;YES, MUST EAT SOME .LKWLD RETURNS
	SETSTS	DC,IO.SSD!IO.NSD!.IODMP  ;CHANGE TO SPECIAL MODE
	USETI	DC,^D100	;READ DIRECTORY BLOCK
	MOVE	T1,[IOWD 200,DIRB]
	MOVEI	T2,0
	IN	DC,T1		;READ IN THE DIRECTORY BLOCK
	  JRST	.+2		;IF OK
	PUSHJ	P,DTERR		;IF ERROR READING		[216]

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

DTDIR4:	SETSTS	DC,.IOASC	;SET TO ASCII (BUFFER) IN CASE	[226]
				; SAME DEVICE IS LISTING DEVICE	[226]
	SKIPE	T2,DIRB+177	;SEE IF TAPE IDENT FIELD
	CAMN	T2,[-1]		;IS 0 OR -1
	JRST	DTDIR5		;YES--DON'T PRINT
	MOVEI	M,[ASCIZ /Tape ID: /]
	PUSHJ	P,LSTR		;LIST NAME
	PUSHJ	P,LSIX		;LIST IDENTIFICATION
	PUSHJ	P,LCRLF		;END OF LINE

DTDIR5:	MOVEI	M,[ASCIZ /Free: /]
	PUSHJ	P,LSTR		;LIST LABEL FOR SPACE
	MOVSI	J,-27		;COUNT FREE BLOCKS
				;  ALSO PRESET J FOR LATER
	PUSHJ	P,DTCNT		;FREE IF IN FILE #0
	PUSH	P,T1		;SAVE BLOCK COUNT
	PUSHJ	P,LDEC3		;PRINT AS 3 DIGITS
	POP	P,T1		;RESTORE BLOCK COUNT
	MOVEI	M,[ASCIZ\ blocks, \]  ;ASSUME PLURAL
	CAIN	T1,1		;EXACTLY ONE BLOCK?
	MOVEI	M,[ASCIZ\ block, \]  ;YES, USE SINGULAR FORM INSTEAD
	PUSHJ	P,LSTR		;IDENTIFY COUNT FIELD

	MOVEI	T1,0		;INITIALIZE FREE FILE COUNTER
	MOVEI	T2,26		;INITIALIZE FILE COUNTER
DTDIR6:	SKIPN	DIRB+122(T2)	;LOOK AT FILE NAME FIELD
	ADDI	T1,1		;IF =0, COUNT FREE
	SOJG	T2,DTDIR6	;LOOP FOR 22 FILES
	PUSH	P,T1		;SAVE FILE COUNT
	PUSHJ	P,LDEC2		;PRINT RESULT
	POP	P,T1		;RETRIEVE FREE-FILE COUNT
	MOVEI	M,[ASCIZ\ files\]  ;ASSUME PLURAL
	CAIN	T1,1		;EXACTLY ONE FILE?
	MOVEI	M,[ASCIZ\ file\];YES, SINGULAR THEN
	PUSHJ	P,LSTR		;AND FINISH LABELING
	PUSHJ	P,LCRLF		;AND FINISH LINE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;HERE TO LOOP OVER FILES AND PRINT ONE LINE EACH

DTFIL0:	AOBJP	J,DTDON		;INCREMENT TO NEXT FILE
	SKIPN	T1,DIRB+122(J)	;SEE IF IN USE
	JRST	DTFIL0		;NO--LOOP BACK
	MOVEM	T1,FNAM		;SAVE FILE NAME
	HLLZ	T1,DIRB+150(J)	;GET EXTENSION
	MOVEM	T1,FEXT		;SAVE
	SETZM	UFDPPN		;CLEAR DIRECTORY WORD
	AOS	NOFIL		;COUNT A FILE SEEN
	PUSHJ	P,.CHKTA##	;SEE IF THIS FILE MATCHES
	 JRST	DTFIL0		;NO, REJECT IT AND TRY ANOTHER ONE
	AOS	NOFILF		;GOOD FILE, COUNT IT AS FILE FOUND
	AOS	NXFCNT		;AND AS FILE PROCESSED

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

DTFIL1:	TRNN	F,R.FAST	;SEE IF /FAST			[220]
	SKIPG	S.SUM		; OR NOT /SUM			[220]
	SKIPA			;YES--PROCEED			[220]
	JRST	DTFIL4		;NO--SKIP OUTPUT		[220]
	MOVE	T2,FNAM		;GET FILE NAME
	MOVEI	T3,6		;USE 6 SPACES
	PUSHJ	P,LSIXC		;LIST IT
	MOVEI	C,"."		;USE . AS SEPARATOR
	PUSHJ	P,LCHR		;PRINT IT
	HLLZ	T2,FEXT		;GET EXTENSION
	MOVEI	T3,3		;USE 3 SPACES
	PUSHJ	P,LSIXC		;LIST IT
DTFIL4:	PUSHJ	P,DTCNT		;COUNT BLOCKS			[201]
	ADDM	T1,NOBLKS	;COUNT FOR SUMMARY		[201]
	SKIPG	S.SUM		;IF /SUMMARY			[220]
	TRNE	F,R.FAST	;SEE IF /FAST SWITCH
	JRST	DTFIL6		;YES--THAT'S ALL
	PUSHJ	P,LSPC		;NO--ADD A SPACE
	PUSHJ	P,LDEC3		;TYPE AS THREE DIGITS
	PUSHJ	P,LSPC2		;TYPE TWO SPACES
	LDB	T4,[POINT 12,DIRB+150(J),35]	;GET CREATION
	HRRZ	T1,J		;GET FILE NUMBER (1-22.)	[162]
	MOVEI	T2,1		;GET A TEST BIT			[162]
	TDNE	T2,DIRB+^D43(J)	;TEST THE EXTENSION BITS	[162]
	TRO	T4,1B21		; AND COPY TO RESULT		[162]
	TDNE	T2,DIRB+^D21(J)	; ..				[162]
	TRO	T4,1B22		; ..				[162]
	TDNE	T2,DIRB-1(J)	; ..				[162]
	TRO	T4,1B23		; ..				[162]
	PUSHJ	P,LDATE		;LIST CREATION DATE
DTFIL6:	TRNE	F,R.FAST	;[330] IF /F
	JRST	DTFIL7		;[330] THEN DON'T TEST /SUM
	SKIPLE	S.SUM		;[330] IF /SUM
	JRST	DTFIL0		;[330] BACK FOR MORE FILES
DTFIL7:	MOVE	T2,NOCHRS	;[330] GET # CHARS SO FAR
	CAMG	T2,MXWDTH	;[330] END OF LINE?
	JRST	DTFIL8		;[330] NO, OUTPUT TAB
	PUSHJ	P,LCRLF		;[330] FINISH OFF LINE
	JRST	DTFIL0		;[330] LOOP BACK FOR MORE
DTFIL8:	PUSHJ	P,LTAB		;[330] OUTPUT TAB
	JRST	DTFIL0		;[330] LOOP BACK FOR MORE

DTDON:	RELEASE	DC,		;GIVE DEVICE BACK NOW
	SETZM	FOBLK+.FODEV	;ENSURE A NEW OPEN IS ATTEMPTED
	JRST	DIREND		;CAP OFF THE DIRECTORY
;DTCNT -- ROUTINE TO COUNT NUMBER OF BLOCKS IN A FILE
;CALL:	HRRI	J,FILE NUMBER (0-22)
;	PUSHJ	P,DTCNT
;	RETURN	WITH T1=NUMBER OF BLOCKS ALLOCATED
;USES T2, T3, T4

DTCNT:	MOVEI	T1,0		;PRESET COUNT
	MOVE	T2,[POINT 5,DIRB]	;PRESET POINTER TO ALLOCATION TABLE
	MOVEI	T3,1101		;PRESET COUNT OF NUMBER ON TAPE
DTCNT1:	ILDB	T4,T2		;PICK UP FILE OF NEXT BLOCK ON TAPE
	CAIN	T4,(J)		;COMPARE WITH REQUEST
	ADDI	T1,1		;MATCHES--COUNT
	SOJG	T3,DTCNT1	;LOOP OVER ENTIRE TAPE
	POPJ	P,		;RETURN


;ERRORS

DTERR:	GETSTS	DC,P3		;GET STATUS
	SETSTS	DC,.IOASC	;SET TO ASCII (BUFFER) FOR LISTING	[226]
	TXNN	P3,IO.DTE!IO.DER;UNLESS PAR.ERR. OR DEV.ERR.,
	PJRST	E.TFR		; GO GIVE FATAL ERROR
	TXNN	P3,IO.DTE	;SEE IF PARITY ERROR
	JRST	E$$DDM		;NO--MUST BE DEVICE ERROR
	N$WRNX	(DPE,<Parity error, status>)
	JRST	DTERR1		;GO DO COMMON STUFF
	N$WRNX	(DDM,<Data missed, status>)
DTERR1:	HRRZ	T1,P3		;GET STATUS
	PUSHJ	P,.TOCTW##	;ISSUE IN OCTAL
	MOVEI	T1,[ASCIZ \, in directory block on \]
	PUSHJ	P,.TSTRG##	;ISSUE EXPLANATION
	MOVE	T1,.FXDEV(I)	;GET DEVICE
	PUSHJ	P,.TSIXN##	;ISSUE IN SIXBIT
	PUSHJ	P,.TCOLN##	;INDICATE IT'S A DEVICE
X$$DDM:!
X$$DPE:	PJRST	.TCRLF##	;END MESSAGE

E.TFR:	N$FAIO	(TFR,Data error reading DECtape directory, status)
	SUBTTL	DIRECTORY LISTING - MAGTAPE

IFN FT$MTA,<	;MAGTAPES

;HERE WHEN MAG TAPE IS DISCOVERED

MTDIR:	TLZ	F,L.MLBL!L.MLBP	;[441] DON'T KNOW ABOUT LABELS YET
	SKIPE	S.REWS		;UNLESS /NOREW
	MTREW.	DC,		;REWIND TAPE TO START
	SKIPLE	S.WORD		;SEE IF /WORD
	TRO	F,R.WORD	;YES--SET FLAG

;SETUP FOR .CHKTA CALLS TO VERIFY SELECTED FILE

	SOS	.CTFLS##	;BACKOFF WILD'S "FILES SEEN" FLAG
	SOS	.CTFLF##	;BACKOFF WILD'S "FILES FOUND" FLAG
				; LEAVE THE OTHER COUNTERS ALONE. WILD WILL
				; CHOOSE AN APPROPRIATE ERROR MESSAGE LATER
				; FROM "NO SUCH FILES" OR "ALL FILES REJECTED"
				; SHOULD ANY BE NEEDED
	SETOM	.WXPRC##	;FORCE FULL FILE SPECIFICATION CHECK
	MOVE	T3,.WIFIR##	;ADDRESS OF [PRESUMED] FILE SPEC BLOCK
	DMOVE	T1,.FXDEV(T3)	;GET ACTUAL DEVICE SPEC
	DMOVEM	T1,MTXDEV	;SAVE IT AWAY
	MOVSI	T1,'*  '	;FULL WILD NAME
	SETZ	T2,		;FULL WILD MASK
	DMOVEM	T1,.FXDEV(T3)	;INDICATE ANY "STR" ACCEPTABLE TO START WITH
	MOVX	T1,FX.WDV	;THE WILDCARDS-IN-DEVICE FLAG
	IORM	T1,.FXFLD(T3)	;SET THAT ON G.P.'S
	SKIPN	T1,.WLDFL##	;SEE IF NO WILD FILE OR STR
	AOS	T1,.WLDFL##	;YES--MAKE WILD STR ONLY
	CAMN	T1,[-1]		;SEE IF WILD FILE ONLY
	SOS	.WLDFL##	;YES--MAKE WILD FILE AND STR

	MOVE	T1,.JBFF	;SAVE .JBFF TO AVOID
	MOVEM	T1,MTSVFF	;  CORE GROWTH ON REOPENS
	MOVEI	T1,DC		;GET PHYSICAL
	DEVNAM	T1,		; NAME OF TAPE
	  MOVE	T1,FOBLK+.FODEV	;(OR LOGICAL IF UNKNOWN)
	MOVEM	T1,MTNAME	;DRIVE FOR MESSAGES
	MOVE	T1,S.FILE	;SET /FILE
	MOVEM	T1,MTFLCT	;INTO FILE COUNTER

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;ALLOCATE I/O BUFFERS FOR TAPE READING

	MOVE	T1,FOBLK+.FOIOS	;GET "OPEN" BLOCK STATUS
	MOVEI	T2,DC		;AND "DEVICE"
	MOVEI	T4,T1		;ADDRESS OF "OPEN" BLOCK
	DEVSIZ	T4,		;ASK FOR A FALL-BACK BUFFERING SIZE
	 MOVEI	T1,LN$MRC+3	;??? ASSUME A DEFAULT
	MOVEI	T3,DC		;"ADDRESS" OF MAGTAPE DEVICE
	MOVEI	T2,.TFBSZ	;RETURN BUFFER SIZE FUNCTION
	MOVE	T1,[2,,T2]	;TAPOP. ARG POINTER TO
	TAPOP.	T1,		;ASK FOR TAPE BLOCKSIZE
	 MOVEI	T1,-2(T4)	;USE DEVSIZ DEFAULT THEN
	ADDI	T1,2		;ACCOUNT FOR RING OVERHEAD WORDS
	CAIGE	T1,LN$MRC+3	;SEE IF MIN TAPE OR BIGGER SIZE	[230]
	MOVEI	T1,LN$MRC+3	;NO--FORCE UP			[230]
	MOVEM	T1,MTFBSZ	;SAVE BUFFERSIZE
MTDIR4:	HRLI	T1,NM$MBF	;[412] NUMBER OF BUFFERS
	MOVEI	T2,BFHD		;POINT TO HEADER		[166]
	PUSHJ	P,MAKBUF	;MAKE A BUFFER RING

;NOW DO A "DUMMY" IN TO FORCE THE TAPE DENSITY CORRECT

	GETSTS	DC,T1		;CURRENT I/O STATUS
	TXO	T1,IO.SYN	;FORCE SYCHRONOUS MODE
	SETSTS	DC,(T1)		;TELL MONITOR TO READ ONLY ONE BUFFER
	MTWAT.	DC,		;WAIT FOR THE TAPE TO SETTLE DOWN
	IN	DC,		;READ FIRST BLOCK (SET DENSITY, CHECK BLOCKSIZE)
	 JRST	MTDRH		;EVERYBODY SEEMS HAPPY ENOUGH . . .
	GETSTS	DC,T4		;SOMEBODY IS UNHAPPY
	TXNE	T4,IO.EOF	;START OFF WITH END OF FILE?
	JRST	[CLOSE	DC,		;YES, CLEAR END OF FILE
		MTBSF.	DC,		;BACKSPACE OVER IT
		JRST	MTDRH]		;AND BLUNDER ONWARDS
	TXC	T4,IO.ERR	;NO END OF FILE, MUST BE ERROR OF SOME SORT
	TXCE	T4,IO.ERR	;EXTENDED I/O ERROR STATUS?
	TXNN	T4,IO.BKT	;NO, NORMAL - BLOCK TOO LARGE?
	JRST	[MTBSR.	DC,		;BACKSPACE OVER THE OFFENDING RECORD
		JRST	MTDRH]		;GO SEE WHAT HAPPENS

;CONTINUED ON NEXT PAGE
;CONTINUED ON NEXT PAGE

;OUR TAPE BUFFERS ARE NOT BIG ENOUGH, TRY TO GROW THEM

	MTBSR.	DC,		;BACKSPACE OVER THE TOO-LARGE RECORD
	TXZ	T4,IO.BKT	;CLEAR ERROR BIT
	SETSTS	DC,(T4)		;AND TELL THE MONITOR TO CLEAR ITS COPY
	CLOSE	DC,		;TRY TO SYNC WITH TAPE SERVICE
	MOVE	T1,MTFBSZ	;GET CURRENT BLOCKSIZE
	SUBI	T1,3		; (LESS OVERHEAD WORDS)
	ADDI	T1,2000		;ADVANCE A K
	ANDCMI	T1,1777		;ESTHETICALLY PLEASING BIT PATTERN(S)
	MOVEM	T1,MTFBSZ	;SET NEW PROPOSED BLOCK SIZE
	N$WRNX	(XMB,Expanding magtape I/O buffers to )
	MOVE	T1,MTFBSZ	;GET NEW SIZE
	PUSHJ	P,.TDECW##	;TELL USER
	MOVEI	T1,[ASCIZ\ words\]  ;A HARMLESS NOISE WORD
	PUSHJ	P,.TSTRG##	;PUT IT OUT TOO
X$$XMB:	PUSHJ	P,.TCRLF##	;CAP OFF THE WARNING MESSAGE

	MOVE	T1,MTSVFF	;GET BACK OLD START OF BUFFER ALLOCATION
	MOVEM	T1,.JBFF	;RESET FOR NEW BUFFER ALLOCATION ATTEMPT
	MOVEI	T1,3		;COUNT OF OVERHEAD WORDS
	ADDB	T1,MTFBSZ	;ADJUST NEW BLOCK SIZE
	JRST	MTDIR4		;GO REBUILD BUFFERS AND TRY AGAIN

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

MTDRH:	GETSTS	DC,T1		;READ CURRENT I/O STATUS
	TXZ	T1,IO.SYN!IO.EOF!IO.ERR	;CLEAR OUT OBNOXIOUS BITS
	SETSTS	DC,(T1)		;AND TELL THE MONITOR TO TAKE OFF
	MTWAT.	DC,		; (NOT THAT I DON'T TRUST TAPSER, BUT . . .)
	PUSHJ	P,MTLBIN	;SETUP TAPE LABEL PARAMETERS (IF ANY)
	SETZB	P1,P2		;CLEAR REGISTERS FOR LATER	[172]
	MOVE	T4,[2,,T2]	;SETUP FOR 5.07 MTCHR.		[172]
	MOVEI	T2,DC		;POINT TO RIGHT CHANNEL		[172]
	MTCHR.	T4,		;TRY IT				[172]
	  JRST	MTDN57		;NOT 5.07 YET			[172]
	MOVE	T2,T4		;OK--COPY AC BITS		[172]
	MOVE	P2,T3		;SAVE REELID			[172]
	TRNE	T4,1B32		;COPY 7-TRACK FLAG		[172]
	TRO	P1,1B32		;(SAME AS DEVSTS)		[172]
	TRNE	T4,1B31		;COPY RING STATUS		[172]
	TRO	P1,1B33		;(SAME AS DEVSTS)		[172]
	JRST	MTDI57		;AND PROCEED			[172]

MTDN57:	SETOM	P1		;FLAG DEVSTS NEEDED		[172]
	MOVEI	T2,DC		;GET TAPE DENSITY
	MTCHR.	T2,		; FROM MONITOR
	  JRST	[GETSTS DC,T2	;NO--FROM INIT
		 ANDI	T2,IO.DEN  ;JUST GET DENSITY
		 JUMPE	T2,MTNODN  ;JUMP IF UNKNOWN
		 LSH	T2,^D33-^L<IO.DEN>  ;POSITION
		 JRST	.+1]	;PROCEED
MTDI57:	MOVEI	T1,[ASCIZ /  Read Density:/]
	PUSHJ	P,.TSTRG##	;LIST LABEL
	ANDI	T2,7		;MASK TO DENSITY
	MOVE	T2,[ASCIZ /???/
		    ASCIZ /200/
		    ASCIZ /556/
		    ASCIZ /800/
		    ASCIZ /1600/
		    ASCIZ /6250/
		    ASCIZ /(6)/
		    ASCIZ /(7)/](T2)
	MOVEI	T1,T2		;SET MESSAGE
	PUSHJ	P,.TSTRG##	;LIST IT
>;END IFN FT$MTA

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTA,<	;MAGTAPES

MTNODN:	MOVEI	T1,[ASCIZ /  Parity:/]
	PUSHJ	P,.TSTRG##	;LABEL
	MOVEI	T1,[ASCIZ /Odd/]
	STATZ	DC,IO.PAR
	  MOVEI	T1,[ASCIZ /Even/]
	PUSHJ	P,.TSTRG##	;LIST PARITY
	JUMPGE	P1,MTNODO	;SKIP DEVSTS IF 5.07		[172]
	MOVEI	P1,DC		;NOW GET DEVICE STATUS
	DEVSTS	P1,		;(HARDWARE STATUS SINCE SOFTWARE LOOSES)
	  JRST	MTNODS		;GIVE UP IF WE CAN'T
MTNODO:	MOVEI	T1,[ASCIZ /  7-Track/]
	TRNN	P1,1B33		;CHECK NUMBER OF TRACKS
	MOVEI	T1,[ASCIZ /  9-Track/]
	PUSHJ	P,.TSTRG##	;LIST THAT
	MOVEI	T1,[ASCIZ /  Read only/]
	TRNN	P1,1B32		;CHECK WRITE LOCK
	MOVEI	T1,[ASCIZ /  Write enabled/]
	PUSHJ	P,.TSTRG##	;LIST THAT
	JUMPE	P2,MTNODS	;DONE IF NO REELID		[172]
	MOVEI	T1,[ASCIZ /  REELID:/]		;		[172]
	PUSHJ	P,.TSTRG##	;ISSUE PREFIX			[172]
	MOVE	T1,P2		;GET ID				[172]
	PUSHJ	P,.TSIXN##	;OUTPUT IT			[172]

MTNODS:	PUSHJ	P,.TCRLF##	;END LINE
	TLZN	F,L.FKEF	;CHECK IF EOF
	JRST	MTFIND		;NO--GO HANDLE DATA
	SKIPGE	ABORTI		;[432] TIME TO ABORT INPUT OPERATIONS?
	JRST	MTABO		;[432] YES - TAPE IS USELESS NOW
	PUSHJ	P,MTLPRT	;[441] PRINT FILE INFO IF ANY
	N$WARN	(TSM,Tape starts with tape mark)
MTSTEF:	CLOSE	DC,		;CLEAR END-OF-FILE
	SOSN	MTFLCT		;DO /FILE ACCOUNTING
	JRST	MTDONX		;EXIT IF /FILE COUNTED OUT
	PUSHJ	P,NEXOVW	;AGAIN, TRY TO READ A WORD	[222]
	  JRST	.+2		;ANOTHER EOF
	JRST	MTEXAM		;NO--GO EXAMINE TAPE
	N$WARN	(ATM,     and another tape mark)
	TLNE	F,L.MLBP	;[441] CONTROLLED BY TAPE LABEL PROCESSOR
	JRST	MTDONE		;[441] YES, THEN THERE IS NO HOPE
	JRST	MTSTEF		;LOOP UNTIL WE GET SOME DATA
>;END IFN FT$MTA
IFN FT$MTA,<	;MAGTAPES

;HERE WHEN DEVICE IS OPEN AND TIME TO LOOK AT NEXT FILE TO SEE IF
;IT IS A SAVE SET
;FORMATS:	IF THE FIRST WORD IS NON-ZERO AND,
;	0-17 = 0, THEN BACKUP FORMAT
;	0-14 = 0, 15-17 NOT 0, THEN FRS FORMAT
;	0-17 = 1???, THEN .EXE OR SOME SUCH
;	0-17 GE 27, THEN FAILSA (LEVEL-D) FORMAT
;     [ 0-5 NOT 0, 6-17 = 0, THEN OLD BACKUP/RESTORE FORMAT ]
;	0-17 NEGATIVE, THEN EITHER:
;		ASCII OR SIXBIT LABEL
;		HRI FORMAT
;		SAVE FORMAT

MTFIND:	PUSHJ	P,NEXOVW	;GET NEXT WORD			[222]
	  JRST	MTEOF		;END OF FILE--GO HANDLE THAT CASE
MTEXAM:	MOVEM	T1,CHKSUM	;SETUP CHECKSUM IN CASE THAT'S IMPORTANT
IFN FT$MTL<	;LABELS/VIA TAPOP
	PUSHJ	P,MTLPRT	;[425] TRY TO TELL ABOUT FILE
	MOVE	T1,CHKSUM	;[425] GET BACK FIRST DATA WORD
>;END IFN FT$MTL
	MOVEI	T2,1		;SET WORD COUNTER
IFN FT$MTB,<	;BACKUP/FRS
	TLNN	T1,777770	;SEE IF FRS OR BACKUP		[230]
	JUMPN	T1,MTFRSS	;YES--GO HANDLE			[230]
>;END IFN FT$MTB
IFN FT$MTR,<	;OLD BACKUP/RESTORE
	TLNN	T1,7777		;SEE IF OLD BACKUP/RESTORE SAVE SET
	JRST	MTBKSS		;YES--GO PROCESS
>;END IFN FT$MTR
	TLNN	T1,776000	;IF 1???			[306]
	TLNN	T1,1000		; ..				[306]
	SKIPA			;NO--PROCEED			[306]
	JRST	MTIOW		;YES--HANDLE AS SAVE FILE	[306]
IFN FT$MTF, JUMPG T1,MTSVST	;JUMP IF LOOKS LIKE FAILSA SAVE SET
>;END IFN FT$MTA

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTA,<	;MAGTAPES

	MOVE	T3,T1		;GET COPY OF WORD
	TRZ	T3,77777	;REDUCE TO FIRST THREE ASCII CHARS
	MOVSI	T4,-LNLBLT	;POINT TO LABEL TYPES TABLE
	CAME	T3,LABTYP(T4)	;SEE IF ASCII LABEL
	AOBJN	T4,.-1		;LOOP TO MATCH
	JUMPL	T4,MTLABL	;YES--GO READ ASCII LABEL
	TRZ	T3,-1		;CLEAR DOWN TO SIXBIT TYPE	[213]
	MOVSI	T4,-LNLB6T	;POINT TO SIXBIT LABELS TABLE	[213]
	CAME	T3,LABTY6(T4)	;SEE IF SIXBIT LABEL		[213]
	AOBJN	T4,.-1		;LOOP TO MATCH			[213]
	JUMPL	T4,MTLAB6	;YES--GO READ SIXBIT LABEL	[213]
	JRST	MTIOW		;ELSE, GO READ AS SAVE OR HRI FILE

;ASCII LABELS
LABTYP:	ASCII	/VOL/		;BEGINNING OF VOLUME
	ASCII	/UVL/		;USER VOLUME
	ASCII	/EOV/		;END OF VOLUME
	ASCII	/UTL/		;USER TRAILER
	ASCII	/HDR/		;BEGINNING OF FILE
	ASCII	/UHL/		;USER HEADER
	ASCII	/EOF/		;END OF FILE
LNLBLT==.-LABTYP

;SIXBIT LABELS
LABTY6:	SIXBIT	/VOL/		;BEGINNING OF VOLUME
	SIXBIT	/UVL/		;USER VOLUME
	SIXBIT	/EOV/		;END OF VOLUME
	SIXBIT	/UTL/		;USER TRAILER
	SIXBIT	/HDR/		;BEGINNING OF FILE
	SIXBIT	/UHL/		;USER HEADER
	SIXBIT	/EOF/		;END OF FILE
LNLB6T==.-LABTY6
>;END IFN FT$MTA
IFN FT$MTL,<	;IF DOING LABEL INFO VIA TAPOP...

;[425] This routine will try to print information about a labeled tape
;[425]  which can be obtained via the .TFLPR TAPOP.
;[425]  The magtape should be open on DC
;[425]  The tape is not moved.

MTLBIN:	PUSHJ	P,.SAVE4##	;[425] PRESERVE THE P ACS
	MOVE	P1,[2,,P2]	;[425] POINT AT THE ARG BLOCK
	MOVEI	P2,.TFLBL	;[425] CODE TO GET LABEL TYPE
	MOVEI	P3,DC		;[425] GET OPEN CHANNEL
	MOVEM	P3,M.MTLB+.TPDEV;[425] SAVE DEVICE SPECIFIER (CHAN #)
	TAPOP.	P1,		;[425] FIND OUT THE LABEL TYPE
	 POPJ	P,		;[425] CAN'T, SO GET OUT
	CAIN	P1,0		;[441] CONTROLLED BY LABEL PROCESSOR
	POPJ	P,		;[441] NO, NOTHING TO DO WITH LABELS
	TLO	F,L.MLBP	;[441] YES, EVEN IF "UNLABELED"
	CAIL	P1,.TFLAL	;[425] IS IT ANSI ?
	CAILE	P1,.TFLIU	;[425] OR EBCDIC (IBM)
	 POPJ	P,		;[425] NO, NO LABELS TO READ
	MOVEI	P1,.TFLPR	;[425] FUNCTION CODE - LABEL PARAMETERS
	MOVEM	P1,M.MTLB+.TPFUN;[425] SAVE FUNCTION CODE
	MOVE	P1,[.TPLEN,,M.MTLB]  ;[425] AIM AT THE LABEL PARAMETER BLOCK
	TAPOP.	P1,		;[425] READ THE LABEL PARAMS OF THE NEXT FILE
	 POPJ	P,		;[425] CAN'T, SO GET OUT NOW!
	TLO	F,L.MLBL	;[425] TAPE CONTROLLED BY LABEL PROCESSOR
	POPJ	P,		;[441] NOW RETURN
;[441] RINT OUT THE TAPE LABEL INFORMATION AS SUPPLIED BY MTLBIN

MTLPRT:	SKIPN	M.MTLB+.TPFNM	;[441] ANY DATA THERE ???
	POPJ	P,		;[441] NO, RETURN
	PUSHJ	P,.SAVE4##	;[441] PRESERVE THE P ACS
	TLZ	F,L.CRLF	;[425] DAMMIT, A NEW LINE!
	PUSHJ	P,LCRLF		;[425] BLANK LINE
	MOVEI	M,[ASCIZ/  Labeled tape file information:/]
	PUSHJ	P,LSTR		;[425] TYPE THAT
	PUSHJ	P,LCRLF		;[425] START A NEW LINE
	MOVEI	M,[ASCIZ/    File Name:"/]
	PUSHJ	P,LSTR		;[425] TYPE THAT
	MOVEI	M,M.MTLB+.TPFNM	;[425] AIM AT FILENAME
	PUSHJ	P,LSTR		;[425] TYPE FILENAME STRING
	MOVEI	C,""""		;[436] TRAILING QUOTE
	PUSHJ	P,LCHR		;[436] ALWAYS CLOSE OFF THE FILENAME
	LDB	T1,[POINTR M.MTLB+.TPGEN,TP.GEN] ;[425] GET GENERATION NUMBER
	JUMPE	T1,MTLPR3	;[432] SKIP IF NOT GENERATION DATASET
	MOVEI	M,[ASCIZ/, Generation:/]  ;[436]
	PUSHJ	P,LSTR		;[425] LIST DESCRIPTOR
	PUSHJ	P,LDEC		;[425] LIST GENERATION AS DECIMAL
MTLPR3:	LDB	T1,[POINTR M.MTLB+.TPGEN,TP.VER] ;[425] GET VERSION NUMBER
	JUMPE	T1,MTLPR4	;[432] SKIP IF NO VERSION FIELD
	MOVEI	M,[ASCIZ/, Version:/]
	PUSHJ	P,LSTR		;[425] LIST DESCRIPTOR
	PUSHJ	P,LDEC		;[425] LIST VERSION AS DECIMAL
MTLPR4:	PUSHJ	P,LCRLF		;[425] CAP OFF THIS LINE
	MOVEI	M,[ASCIZ/    Protection:/]
	PUSHJ	P,LSTR		;[425] TYPE THAT
	MOVE	T1,M.MTLB+.TPPRO;[425] GET PROTECTION
	PUSHJ	P,LOCT3Z	;[425] LIST WITH LEADING ZEROS
	MOVEI	M,[ASCIZ/, Creation Date:/]
	PUSHJ	P,LSTR		;[425] DELIMIT CREATION FIELD
	LDB	T4,[POINTR M.MTLB+.TPEXP,TP.ECR] ;[425] GET THE CREATION DATE
	PUSHJ	P,LDATE		;[425] CONVERT AND OUTPUT DATE
	MOVEI	M,[ASCIZ/, Expiration Date:/]
	PUSHJ	P,LSTR		;[425] DELIMIT EXPIRATION FIELD
	LDB	T4,[POINTR M.MTLB+.TPEXP,TP.EEX] ;[425] GET THE EXPIRATION DATE
	PUSHJ	P,LDATE		;[425] CONVERT AND OUTPUT DATE
	PUSHJ	P,LCRLF		;[425] CLEAN LINE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

	MOVEI	M,[ASCIZ/    Block size:/]
	PUSHJ	P,LSTR		;[425] LIST DESCRIPTOR
	MOVE	T1,M.MTLB+.TPBSZ;[425] GET THE BLOCK SIZE
	PUSHJ	P,LDEC		;[425] LIST THAT
	MOVEI	M,[ASCIZ/, Record size:/]
	PUSHJ	P,LSTR		;[425] LIST DESCRIPTOR
	MOVE	T1,M.MTLB+.TPRSZ;[425] GET THE RECORD SIZE
	PUSHJ	P,LDEC		;[425] LIST THAT
	PUSHJ	P,LCRLF		;[425] CLEAN LINE
	MOVEI	M,[ASCIZ/    Record Format:/]
	PUSHJ	P,LSTR
	LDB	T1,[POINTR M.MTLB+.TPREC,TR.RFM] ;[425] GET THE RECORD FORMAT CODE
	MOVE	M,MTRCFM(T1)	;[425] AIM AT RECORD FORMAT STRING
	PUSHJ	P,LSTR		;[425] AND LIST THE RECORD FORMAT TYPE
	MOVEI	M,[ASCIZ/, Form control:/]
	PUSHJ	P,LSTR		;[425] IDENTIFY NEXT FIELD
	LDB	T1,[POINTR M.MTLB+.TPREC,TR.FCT] ;[425] GET THE FORM CONTROL
	MOVE	M,MTFCTL(T1)	;[425] AIM AT FORM CONTROL STRING
	PUSHJ	P,LSTR		;[425] AND TYPE IT OUT TOO
	PUSHJ	P,LCRLF		;[425] CLEAN LINE
	SETZM	M.MTLB		;[441] CLEAR THE FIRST WORD
	MOVE	T1,[M.MTLB,,M.MTLB+1]  ;[441] GET BLT PARMS
	BLT	T1,M.MTLB+.TPLEN-1  ;[441] ZERO THE PARAMETER BLOCK
	POPJ	P,		;[425] ALL DONE!
;LERTAB:	[ASCIZ/No errors/]
;	[ASCIZ/Continue processing/]
;	[ASCIZ/EOF/]
;	[ASCIZ/Label type error/]
;	[ASCIZ/Header label error/]
;	[ASCIZ/Trailer label error/]
;	[ASCIZ/Volume label error/]
;	[ASCIZ/Device error/]
;	[ASCIZ/Data error/]
;	[ASCIZ/Write-lock error/]
;	[ASCIZ/Positioning error/]
;	[ASCIZ/BOT/]
;	[ASCIZ/Illegal operation/]
;	[ASCIZ/File not found/]

;Table of record format names

MTRCFM:	[ASCIZ/Default/]
	[ASCIZ/Fixed/]
	[ASCIZ/Variable/]
	[ASCIZ/Spanned/]
	[ASCIZ/Undefined/]

;Table of form control names

MTFCTL:	[ASCIZ/????/]
	[ASCIZ/None/]
	[ASCIZ/ANSI/]
	[ASCIZ/Embedded/]

> ;END INF FT$MTL
IFN FT$MTA,<	;MAGTAPES

;HERE WHEN THE FILE IS AN IOWD (IE, SAVE OR HRI FORMAT) OR .EXE

MTIOW:	SETOM	P1		;SET FLAG FOR FIRST IOWD
	SETZM	FVER		;CLEAR VERSION NUMBER
	JUMPG	T1,MTEXE	;IF .EXE, GO HANDLE		[306]
MTIOWD:	MOVE	T3,T1		;GET COUNT OF IOWD
	JUMPE	T1,MTIOHR	;IF ZERO, JUNK OR HRI FORMAT
	AOS	P1		;ADVANCE IOWD COUNTER
	JUMPG	T1,MTIOJK	;JUMP IF JUNK FORMAT
MTIODT:	PUSHJ	P,NEXDTW	;GET DATA WORD
	  JRST	MTIOJF		;JUMP IF EOF
	AOS	T2		;COUNT WORD READ
	MOVEI	T4,1(T3)	;GET LOCATION OF DATA
	CAIN	T4,.JBVER	;SEE IF VERSION NUMBER
	MOVEM	T1,FVER		;YES--SAVE FOR LATER
	MOVE	T4,T1		;SAVE DATA WORD IN CASE OF HRI FORMAT
	AOBJN	T3,MTIODT	;COUNT OFF WORDS IN IOWD
	PUSHJ	P,NEXDTW	;GET NEXT IOWD OR JRST
	  JRST	MTIOHE		;SEE IF HRI FORMAT
	AOS	T2		;COUNT WORD READ
	JUMPLE	T1,MTIOWD	;LOOP IF ANOTHER IOWD
	MOVE	T4,T1		;NO--SAVE DATA WORD (MAYBE JRST WORD)

MTIODN:	PUSHJ	P,NEXDTW	;GET ANY MORE OF RECORD
	  JRST	.+2		;JUMP TO OUTPUT
	AOJA	T2,MTIODN	;LOOP UNTIL DONE
	TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENTATION THEN
	MOVEI	P1,[ASCIZ /  Save format:    length = /]
	JRST	MTIOJM		;GO CHECK FOR JRST WORD

;HERE IF LOOKS LIKE HRI FORMAT

MTIOHR:	PUSHJ	P,NEXDTW	;IF ONLY ZEROS TO EOF
	  JRST	MTIOHE		;  THEN MUST BE OK
	JUMPN	T1,MTIOJK	;NO--JUNK
	AOJA	T2,MTIOHR	;LOOP TO EOF

MTIOHE:	JUMPN	P1,MTIOJK	;JUNK IF NOT FIRST IOWD
	MOVE	T1,T4		;RESTORE LAST DATA WORD
	TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENTATION THEN
	MOVEI	P1,[ASCIZ /  HRI format:     length = /]
	SETZM	FVER		;CLEAR VERSION NUMBER
	JRST	MTIOJM		;GO FINISH UP			[306]
;STILL IN IFN FT$MTA

MTEXE:	MOVEI	T3,0		;CLEAR PROGRESS COUNT		[306]
	JRST	MTEX.1		;START WITH FIRST WORD
MTEX.0:	PUSHJ	P,NEXDTW	;GET BLOCK TYPE OF HEADER
	  JRST	MTIOJF		;NONE IF EOF
	AOS	T2		;COUNT WORD
	AOS	T3		;COUNT WORD
MTEX.1:	HLRZ	P1,T1		;GET BLOCK TYPE
	CAIN	P1,1776		;SEE IF EXE DIRECTORY
	JRST	MTEX.3		;YES--GO LOOKUP PAGE 0
	CAIL	P1,1776		;IF NOT VALID TYPE,
	JRST	MTIOJK		; EXIT WITHOUT VERSION
	HRRZ	P1,T1		;OK--GET BLOCK SIZE
MTEX.2:	SOJLE	T1,MTEX.0	;(ALLOW FOR FIRST WORD)
	PUSHJ	P,NEXDTW	;SKIP THIS BLOCK
	  JRST	MTIOJF		;GIVE UP IF EOF
	AOS	T2		;COUNT WORD
	AOS	T3		;COUNT PROGRESS
	JRST	MTEX.2		;LOOP
MTEX.3:	HRRZ	T4,T1		;DIRECTORY--GET SIZE
	LSH	T4,-1		;GET COUNT OF BIWORDS
MTEX.4:	SOJL	T4,MTIOJK	;GIVE UP IF NOT IN DIRECTORY
	PUSHJ	P,NEXDTW	;GET FIRST WORD OF PAIR
	  JRST	MTIOJF		;GIVE UP IF END
	AOS	T2		;COUNT WORD
	MOVE	P1,T1		;SAVE FOR A MINUTE
	PUSHJ	P,NEXDTW	;GET SECOND WORD OF PAIR
	  JRST	MTIOJF		;GIVE UP
	AOS	T2		;COUNT WORD
	ADDI	T3,2		;COUNT PROGRESS
	TRNE	T1,-1		;SEE IF PAGE 0
	JRST	MTEX.4		;NO--LOOP OVER DIRECTORY
	HRRZ	T4,P1		;GET POSITION IN FILE
	LSH	T4,^D9		;CONVERT TO WORDS
	SUB	T4,T3		;ALLOW FOR CURRENT POSITION
	JUMPLE	T4,MTIOJK	;ERROR IF BEHIND US
	ADDI	T4,.JBVER	;SET TO VERSION LOCATION
MTEX.5:	PUSHJ	P,NEXDTW	;ADVANCE TO WORD
	  JRST	MTIOJF		;GIVE UP IF END
	AOS	T2		;COUNT WORD
	SOJGE	T4,MTEX.5	;LOOP THROUGH .JBVER


MTEX.9:	PUSHJ	P,NEXDTW	;LOOP TO END
	  SKIPA			;DONE
	AOJA	T2,MTEX.9	;LOOP
	TLNE	F,L.MLBL	;[425] HAVE WE TYPED OUT LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENT THEN
	MOVEI	P1,[ASCIZ /  .EXE format:    length = /]
	MOVEI	T4,0		;INDICATE NO START ADDRESS KNOWN
	JRST	MTIOJN		;OUTPUT MESSAGE			[306]
;STILL IN IFN FT$MTA

;HERE WHEN DONE WITH HRI OR SAVE FORMAT READ

MTIOJM:	HLRZ	T3,T4		;SEE IF START
	TRZ	T3,(<HALT>-<JRST>)  ;CLEAR HALT BITS
	CAIE	T3,(JRST)	;TEST FOR JUMP
	JRST	MTIOJK		;NO--JUNK
MTIOJN:	MOVE	M,P1		;FETCH CORRECT MESSAGE
	PUSHJ	P,LSTR		;TYPE LABEL
	MOVE	T1,T2		;GET LENGTH IN WORDS
	PUSHJ	P,LDEC		;LIST DECIMAL
	MOVEI	M,[ASCIZ /, start = /]
	SKIPE	T4		;IF KNOWN,
	PUSHJ	P,LSTR		;LIST LABEL
	HRRZ	T1,T4		;GET START ADDRESS
	SKIPE	T4		;IF KNOWN,
	PUSHJ	P,LOCT		;LIST OCTAL
	MOVEI	M,[ASCIZ /, checksum = /]
	SKIPG	S.CHK		;[422] /CHECKSUM GIVEN?
	JRST	.+3		;[422] NO
	PUSHJ	P,LSTR		;LIST LABEL
	PUSHJ	P,LCHECK	;LIST CHECKSUM
	MOVEI	M,[ASCIZ /, version = /]
	SKIPE	T4,FVER		;SEE IF VERSION
	PUSHJ	P,LSTR		;YES--PREFIX IT
	PUSHJ	P,LVER		;AND LIST IT
	PUSHJ	P,LCRLF		;END LINE
	AOS	.CTFLS##	;COUNT THIS AS A FILE SEEN
	AOS	.CTFLF##	;AND FOUND
	JRST	MTEF		;JUMP TO END OF FILE PROCESSING
;STILL IN IFN FT$MTA

;HERE IF JUNK BUT NOT YET EOF

MTIOJK:	PUSHJ	P,NEXDTW	;GET NEXT WORD
	  JRST	MTIOJF		;JUMP WHEN DONE
	AOJA	T2,MTIOJK	;LOOP COUNTING WORDS

;HERE IF JUNK AT EOF

MTIOJF:	AOS	.CTFLS##	;COUNT A FILE SEEN
	AOS	.CTFLF##	;AND FOUND
				; THIS RATHER QUESTIONABLE TACTIC SUPRESSES
				; "SPURIOUS" %WLDNSD NO SUCH DIRECTORY MES-
				; SAGES . . .
	TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENTATION THEN
	MOVEI	M,[ASCIZ /  Unknown format: length =/]
	PUSHJ	P,LSTR		;LIST LABEL
	MOVE	T1,T2		;GET LENGTH
	PUSHJ	P,LDEC		;LIST DECIMAL
	MOVEI	M,[ASCIZ /, checksum = /]
	SKIPG	S.CHK		;[422] /CHECKSUM GIVEN?
	JRST	.+3		;[422] NO
	PUSHJ	P,LSTR		;LIST LABEL
	PUSHJ	P,LCHECK	;LIST CHECKSUM
	PUSHJ	P,LCRLF		;END LINE

;HERE AT EOF AFTER JUNK OR IOWD FILE

MTEF:	SKIPGE	ABORTI		;[432] TIME TO ABORT INPUT?
	JRST	MTABO		;[432] YES
	MOVEI	M,[ASCIZ /<Tape mark>
/]
MTEFM:	SKIPLE	S.MARK		;[422] /MARKS?
	PUSHJ	P,LSTR		;YES--TELL USER
MTEFX:	REPEAT	0,<		;NEED THIS ONLY IF TAPE ENDS WITH 3 EOFS
	CLOSE	DC,		;CLEAR END-OF-FILE
	SOSN	MTFLCT		;DO /FILE ACCOUNTING
	JRST	MTDONX		;EXIT IF /FILE COUNTED OUT
	JRST	MTFIND		;NEW FILE--GO PROCESS IT
>
	JRST	MTEOFH		;HANDLE EOF
;HERE AFTER NEW FILE FOUND EOF

MTEOF:	SKIPGE	ABORTI		;[432] TAPE USELESS?
	JRST	MTABO		;[432] YES, ABORT TAPE DIRECTORY
	MOVEI	M,[ASCIZ /<Tape mark>
/]
	SKIPLE	S.MARK		;[422] /MARKS?
	PUSHJ	P,LSTR		;YES--LIST COMMENT
MTEOFH:	CLOSE	DC,		;CLEAR END-OF-FILE
	SOSN	MTFLCT		;ACCOUNT FOR /FILE
	JRST	MTDONX		;JUMP IF DONE WITH /FILES
	PUSHJ	P,NEXOVW	;READ WORD TO SEE IF DOUBLE EOF	[222]
	  JRST	.+2		;YES--CLEAN UP
	JRST	MTEXAM		;NO--START OVER
	MOVEI	M,[ASCIZ /<Second tape mark in succession>
/]
	SKIPLE	S.MARK		;[422] /MARKS?
	PUSHJ	P,LSTR		;YES--LIST COMMENT
	JRST	MTDONE		;AND GO FINISH UP



;HERE TO ABORT THE TAPE OPERATIONS

MTABO:	N$FAIX	(ADE,<Aborting directory listing due to device error(s)>)
X$$ADE:	PUSHJ	P,.TCRLF##	;CAP OFF THE ERROR MESSAGE
	JRST	MTDONY		;AND LEAVE THIS VALE OF TEARS
;STILL IN IFN FT$MTA

;HERE WHEN ANSI-LIKE TAPE LABEL SEEN

MTLAB6:	MOVEI	M,[ASCIZ /	 SIXBIT Label "/]
	TROA	F,R.LBSX	;INDICATE SIXBIT LABEL		[213]
MTLABL:	MOVEI	M,[ASCIZ /	 Label "/]
MTLABR:	MOVE	T4,BFHD+.BFCTR	;GET LENGTH			[166]
MTLABS:	PUSHJ	P,LSTR		;LIST PREFIX
	MOVEI	T2,^D80/5	;GET ASCII LABEL LENGTH		[213]
	TRNE	F,R.LBSX	;SEE IF SIXBIT			[213]
	MOVEI	T2,^D80/6	;YES--GET SIXBIT LABEL LENGTH	[213]
				;NOTE--COBOL WRITES 78 CHARS, NOT 84
	CAIE	T4,-1(T2)	;SEE IF STANDARD LABEL LENGTH	[213]
	TLO	F,L.ILEN	;NO--SET FLAG
	MOVEI	P1,1(T4)	;SET END TO LENGTH
	CAILE	P1,(T2)		;BUT NOT BEYOND			[213]
	MOVEI	P1,(T2)		;  STANDARD LENGTH		[213]
	MOVEI	T2,1		;PRESET WORD COUNT
MTLAB1:	MOVE	T4,T1		;MOVE WORD TO PAIR
	MOVEI	T1,5		;SET TO COUNT CHARS
	TRNE	F,R.LBSX	;IF SIXBIT,			[213]
	MOVEI	T1,6		; GET 6 CHARS PER WORD		[213]

;HERE FOR EACH CHARACTER IN LABEL

MTLAB2:	MOVEI	T3,0		;CLEAR RESULT
	TRNE	F,R.LBSX	;SEE IF SIXBIT LABEL		[213]
	JRST	[LSHC T3,6	;YES--GET NEXT CHAR		[213]
		 ADDI T3,40	;CONVERT TO ASCII		[213]
		 JRST MTLAB4]	;AND GO OUTPUT IT		[213]
	LSHC	T3,7		;GET CHAR
	CAILE	T3,37		;SEE IF CONTROL CHAR (OR NULL)
	JRST	MTLAB3		;NO--PROCEED
	MOVEI	C,"^"		;YES--LIST FLAG
	PUSHJ	P,LCHR		; FOR USER
	ADDI	T3,100		;CONVERT TO ALPHA
MTLAB3:	CAIGE	T3,140		;SEE IF LOWER CASE
	JRST	MTLAB4		;NO--PROCEED
	MOVEI	C,"'"		;YES--LIST FLAG
	PUSHJ	P,LCHR		; FOR USER
	SUBI	T3,40		;CONVERT TO UPPER CASE
MTLAB4:	MOVE	C,T3		;GET CHAR
	PUSHJ	P,LCHR		;LIST
	SOJG	T1,MTLAB2	;LOOP FOR THIS WORD
	PUSHJ	P,NEXDTW	;GO GET NEXT WORD
	  JRST	MTLABX		;AT EOF
	CAIE	T2,(P1)		;DON'T GO TOO FAR
	AOJA	T2,MTLAB1	;LOOP DOWN LABEL

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;STILL IN IFN FT$MTA

	TLO	F,L.FKEF	;TOO FAR, SET FAKE EOF FLAG
	MOVE	P1,T1		;SAVE WORD FOR LATER

;HERE AT END OF LABEL

MTLABX:	TRZ	F,R.LBSX	;CLEAR SIXBIT LABEL INDICATOR	[213]
	MOVEI	C,""""		;END OF QUOTE
	PUSHJ	P,LCHR		;LIST END
	PUSHJ	P,LCRLF		;END LINE
	TLNN	F,L.ILEN!L.FKEF	;SEE IF BAD LENGTH
	JRST	MTEF		;NO--GO CLEAR EOF AND PROCEED
	TLZN	F,L.ILEN	;TEST INCORRECT LENGTH
	JRST	MTLNOK		;LENGTH OK
	N$WARN	(ILL,Incorrect length for label)
MTLNOK:	TLZN	F,L.FKEF	;CLEAR FAKE EOF
	JRST	MTEF		;NOT SET--PROCEED
IFN FT$MTR,<	;OLD BACKUP/RESTORE
	TLZE	F,L.IMLB	;SEE IF IMBEDDED LABEL
	JRST	MTBKSR		;YES--RETURN TO THAT LOOP
>;END IFN FT$MTR

	MOVE	T3,P1		;GET NEXT WORD
	TRZ	T3,77777	;REDUCE TO FIRST THREE ASCII CHARS
	MOVSI	T4,-LNLBLT	;POINT TO LABEL TYPES TABLE
	CAME	T3,LABTYP(T4)	;SEE IF LABEL
	AOBJN	T4,.-1		;LOOP TO MATCH
	JUMPL	T4,MTLBCN	;CONSECUTIVE LABELS
	TRZ	T3,-1		;REDUCE TO FIRST THREE SIXBIT CHARS	[213]
	MOVSI	T4,-LNLB6T	;POINT TO SIXBIT LABEL TYPES TABLE	[213]
	CAME	T3,LABTY6(T4)	;SEE IF SIXBIT LABEL		[213]
	AOBJN	T4,.-1		;LOOP TO MATCH			[213]
	JUMPL	T4,MTLBC6	;CONSECUTIVE SIXBIT LABELS	[213]
	N$WARN	(MTM,Missing tape mark after label)
	MOVE	T1,P1		;RESTORE WORD
	JRST	MTEXAM		;AND GO EXAMINE DATA

MTLBC6:	MOVEI	M,[ASCIZ / Grouped SIXBIT label "/]
	TROA	F,R.LBSX	;SET SIXBIT LABEL FLAG		[213]
MTLBCN:	MOVEI	M,[ASCIZ / Grouped label "/]
	MOVE	T1,P1		;RESTORE WORD
	JRST	MTLABR		;GO DO NEXT LABEL
>;END IFN FT$MTA
	SUBTTL	DIRECTORY LISTING - MAGTAPE -- OLD BACKUP/RESTORE

IFN FT$MTR,<	;OLD BACKUP/RESTORE

MTBKSR:	PUSHJ	P,NEXOVW	;GET NEXT CONTROL WORD
	  JRST	E$$MBS		;UNEXPECTED EOF
MTBKSS:	TLO	F,L.LEVD	;SET LEVEL-D DATA
	MOVEM	T1,MTSVVR	;SAVE HEADER WORD
	HLRZ	T2,T1		;GET CONTROL WORD
	CAIE	T2,100000	;SEE IF FILE HEADER
	CAIN	T2,200000	;SEE IF DIRECTORY HEADER
	JRST	MTBKLK		;YES--GO READ LOOKUP BLOCK
	CAIN	T2,40000	;SEE IF IMBEDDED LABEL
	JRST	MTBKIL		;YES--GO HANDLE IT

;HERE WHEN JUNK IN OLD BACKUP/RESTORE SET

	N$WARN	(JBS,Junk during BACKUP/RESTORE save set)
MTBKJL:	TLO	F,L.BKSS	;SET FLAG FOR SAVE SET
	PUSHJ	P,NEXOVW	;READ ON
	  JRST	MTBKJM		;AT END OF DATA
	MOVE	T1,BFHD+.BFCTR	;GET DATA LEFT IN BLOCK		[166]
	SOJG	T1,MTBKJL	;SOME--LOOP THRU DATA
MTBKJM:	TLZ	F,L.BKSS!L.FKEF	;CLEAR FLAGS
	PUSHJ	P,NEXOVW	;LOOK AT RESULTS
	  JRST	MTBKJG		;EOF--GO HANDLE
	HLRZ	T2,T1		;GET HEADER TYPE
	CAIE	T2,100000	;SEE IF DIRECTORY
	CAIN	T2,200000	; OR FILE HEADER
	JRST	MTBKSS		;YES--GO PROCESS IT
	CAIN	T2,40000	;SEE IF LABEL
	JRST	MTBKIL		;YES--GO HANDLE
	JRST	MTBKJL		;NO--LOOP ONWARDS
>;END IFN FT$MTR
IFN FT$MTR,<	;OLD BACKUP/RESTORE

;HERE AT UNEXPECTED EOF

	N$WARN	(MBS,Tape mark during BACKUP/RESTORE save set)
MTBKJG:	JRST	MTEFX		;GO ISSUE MESSAGE

;HERE AT IMBEDDED LABEL

MTBKIL:	ANDI	T1,777		;GET LABEL LENGTH
	SOSG	T4,T1		;MOVE TO LOC. FOR LABEL PRINTER
	JRST	E$$JBS		;NO--JUNK
	TLO	F,L.IMLB	;YES--SET FLAG
	PUSHJ	P,NEXOVW	;SKIP CHECKSUM
	  JRST	E$$MBS		;GIVE UP
	PUSHJ	P,NEXOVW	;GET START OF LABEL
	  JRST	MTBKIF		;GO HANDLE EOF
	MOVEI	M,[ASCIZ / Blocked label "/]
	JRST	MTLABS		;GO DO LABEL

;HERE WHEN IMBEDDED LABEL IS SEPARATE FILE

MTBKIF:	MOVEI	M,[ASCIZ /<Tape mark preceeded by label flag>
/]
	JRST	MTEFM		;GO ISSUE MESSAGE
>;END IFN FT$MTR
IFN FT$MTR,<	;OLD BACKUP/RESTORE

;HERE WHEN LOOKUP BLOCK COMING

MTBKLK:	MOVEI	T2,(T1)		;GET LOOKUP WORDS
	ANDI	T2,777		;CLEAR JUNK
	CAILE	T2,LN$RIB	;PROTECT LOOKUP AREA
	JRST	E$$JBS		;BAD--GIVE UP
	MOVEI	T3,0		;SET TO START OF LOOKUP BLOCK
	PUSHJ	P,NEXOVW	;GET NEXT WORD
	  JRST	E$$MBS		;BAD TO EOF HERE
				;THROW AWAY WORD
MTBKLL:	PUSHJ	P,NEXOVW	;GET NEXT LOOKUP WORD
	  JRST	E$$MBS		;BAD TO EOF IN MIDDLE
	MOVEM	T1,LBLOCK(T3)	;SAVE IN STANDARD AREA
	AOS	T3		;ADVANCE BLOCK
	SOJG	T2,MTBKLL	;LOOP UNTIL DONE
	HRRZ	T2,MTSVVR	;GET LENGTH AGAIN
	SOS	T2		;SUBTRACT ONE
	ANDI	T2,777		;MASK TO FORWARD LENGTH
	CAME	T2,RIBLEN	;COMPARE TO LOOKUP LENGTH
	JRST	E$$JBS		;BAD--GIVE UP
	SKIPLE	S.MARK		;[422] /MARKS?
	JRST	MTBKLM		;YES--TYPE UFD
	HLRZ	T2,MTSVVR	;REFETCH HEADER
	CAIE	T2,100000	;SEE IF FILE HEADER
	JRST	MTBKNW		;NO--SKIP TO NEXT HEADER
>;END IFN FT$MTR

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTR,<	;OLD BACKUP/RESTORE

;HERE WHEN FILE HEADER IS IN LOOKUP AREA

MTBKLM:	MOVE	T1,FMTA		;GET MAG TAPE WORD
	MOVEM	T1,FSTR		;STORE AS STUCTURE
	SETZM	FMTA		;CLEAR OUT TAPE WORD
	TLO	F,L.BKSS	;SET SAVE SET FLAG
	PUSHJ	P,MTDOFL	;GO DO MAG TAPE FILE

	TLZ	F,L.BKSS!L.FKEF	;CLEAR SCREWBALL FLAGS
	HLRZ	T2,MTSVVR	;SEE WHAT KIND OF FILE
	CAIE	T2,100000	;CHECK FILE
	JRST	MTBKNW		;NO--SKIP BELOW
	PUSHJ	P,NEXOVW	;GET NEXT CONTROL
	  JRST	E$$MBS		;NEED END OF DATA FILE
	HLRZ	T2,T1		;GET TYPE
	CAIE	T2,20000	;SEE IF END OF FILE
	JRST	E$$JBS		;NO--JUNK
	PUSHJ	P,NEXOVW	;YES--GET CHECKSUM
	  JRST	E$$MBS		;ERROR IF ABSENT
MTBKNW:	PUSHJ	P,NEXOVW	;GET NEXT HEADER WORD
	  JRST	MTEF		;GO TO EOF PROCESSING
	TLNN	T1,7777		;SEE IF OLD BACKUP/RESTORE HEADER
	JRST	MTBKSS		;GO HANDLE HEADER
	PUSH	P,T1		;SAVE NEXT WORD
	N$WARN	(MMB,Missing tape mark after BACKUP/RESTORE save set)
	POP	P,T1		;RESTORE NEXT WORD
	JRST	MTEXAM		;GO EXAMINE THE DATA
>;END IFN FT$MTR
IFE FT$MTR,<
	E$$JBS==6B20	;SAVE SYMBOL
	E$$MBS==6B20	;SAVE SYMBOL
	E$$MMB==6B20	;SAVE SYMBOL
>;END IFE FT$MTB
	SUBTTL	DIRECTORY LISTING - MAGTAPE -- BACKUP AND FRS

IFN FT$MTB,<	;BACKUP/FRS

MTFRSS:	SETZM	H.MZER		;CLEAR FOR THIS SAVESET
	MOVE	T3,[H.MZER,,H.MZER+1]
	BLT	T3,H.EMZR	; ..
	PUSHJ	P,FRSLAH	;DO BACKUP/FRS LOOK-AHEAD
	JRST	MTFRSH		;GO HANDLE HEADER

;BACK HERE AFTER EACH RECORD

MTFRSR:	PUSHJ	P,NEXOVW	;GET FIRST WORD
	  JRST	E$$MFS		;END OF FILE IS ERROR
	PUSHJ	P,FRSLAH	;DO BACKUP/FRS LOOK-AHEAD
IFN FT$MTS,<	;FRS
	HLLZ	T4,T1		;GET COPY OF FRS/BACKUP FLAG
	TLNE	T4,-1		;IF FRS,
	TLO	T4,-1		; SET WHOLE FLAG
	XOR	T4,B$GTYP	;COMPARE WITH PREVIOUS RECORD
	JUMPL	T4,E$$JFS	;JUNK IF DIFFERENT
>;END IFN FT$MTS

MTFRSH:	TLNN	T1,-1		;SEE IF BACKUP FORMAT
	JRST	MTFRSP		;YES--GO HANDLE HEADER
IFN FT$MTS,<	;FRS
	TLNE	T1,777770	;SEE IF VALID FOR FRS		[240]
	JRST	E$$JFS		;NO, GO PROCESS AS JUNK		[240]
>;END IFN FT$MTS
>;END IFN FT$MTB

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTS,<	;FRS

;HERE IF FRS HEADER FORMAT--READ HEADER AND CONVERT TO BACKUP FORMAT

	HRLZM	T1,B$GFLG	;STORE FLAGS
	HLRZS	T1		;POSITION RECORD TYPE
	MOVE	T1,[0		;ERROR
		    1		;LABEL
		    2		;START SAVE SET
		    3		;END SAVE SET
		    4		;FILE DATA
		    5		;DIRECTORY DATA
		    0		;ERROR
		    0](T1)	;ERROR
	JUMPE	T1,MTFJKB	;[425] JUNK IF ERROR(NOT FRS FORMAT)
	HRROM	T1,B$GTYP	;SET AS TYPE
	PUSHJ	P,NEXOVR	;GET RELATIVE VOLUME NUMBER
	  JRST	MTFJKB		;[425] JUNK
	MOVEM	T1,B$GRTN	;SAVE
	MOVE	T4,B$GTYP	;GET TYPE
	MOVE	T4,FRSTBL-1(T4)	;GET TABLE OF TRANSLATIONS
MTFRSL:	MOVE	T1,(T4)		;GET -COUNT,,ITEM
	TLNN	T1,-1		;IF BLANK,			[302]
	TLO	T1,-1		; SET FOR ONE WORD		[302]
	PUSHJ	P,BLKOVR	;COPY TO STORAGE AREA		[302]
	  JRST	MTFJKB		;[425] JUNK IF END		[302]
	AOBJN	T4,MTFRSL	;LOOP OVER HEADER
	JRST	MTFRSD		;GO HANDLE DATA PORTION
;STILL IN IFN FT$MTS

;FRS TRANSLATION TABLE POINTERS

FRSTBL:	-FRSLLB,,FRSTLB		;BACKUP 1=LABEL
	-FRSLSS,,FRSTSS		;BACKUP 2=START SAVE SET
	-FRSLSS,,FRSTSS		;BACKUP 3=END SAVE SET
	-FRSLFL,,FRSTFL		;BACKUP 4=FILE			[235]
	-FRSLDR,,FRSTDR		;BACKUP 5=DIRECTORY		[235]

;TABLES CONTAINING -NO WORDS (0=1),,ADDRESS TO STORE

FRSTLB:				;LABEL
	    B$LREL		;REEL
	-21,,B$LTIM		;TIME, DATE, DESTROY DATE, LABEL COMMENT
FRSLLB==.-FRSTLB


FRSTSS:				;START/END SAVE SET
	-5,,B$SSNM		;SYSTEM NAME
	    B$SSVR		;VERSION
	-2,,B$SFMT		;FORMAT VERSION, FRS VERSION
	-5,,B$STIM		;TIME, DATE, MODE, TRACKS, SAVE SET NAME
	    B$SDEV		;DEVICE				[300]
	-4,,B$SCMT		;COMMENT			[300]
FRSLSS==.-FRSTSS

FRSTDR:				;DIRECTORY
	    B$USTR		;UFD STRUCTURE
	    B$ULVL		;DIRECTORY LEVEL
	-20,,DIRB		;DISCARD JUNK
FRSLDR==.-FRSTDR


FRSTFL:				;FILE
	-11,,B$FSTR		;STR, NAME, EXT, PPN, REL BLK,
				;  CHECKSUM, BLKS IN REC,
				;  WRDS IN L.BLK, DIRECTORY LEVEL
	-11,,DIRB		;DISCARD JUNK
FRSLFL==.-FRSTFL
>;END IFN FT$MTS

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTB,<	;BACKUP/FRS
MTFJKB:	N$WARN	(JFS,Junk during BACKUP/FRS save set)
MTFJKL:	SETZM	BFHD+.BFCTR	;CLEAR REST OF RECORD
	PUSHJ	P,NEXOVW	;GET START OF NEXT RECORD
	  JRST	MTFJKG		;EOF--GO HANDLE
	TLNE	T1,777770	;SEE IF OK YET
	JRST	MTFJKL		;NO--LOOP ON
	HLLZ	T4,T1		;GET BACKUP/FRS FLAG
	TLNE	T4,-1		;IF FRS,
	TLO	T4,-1		; SET WHOLE HALF WORD
	XOR	T4,B$GTYP	;COMPARE WITH FRS FLAG
	JUMPL	T4,MTFJKL	;IF DIFFERENT, JUNK
	JRST	MTFRSH		;ELSE, GO HANDLE HEADER

	N$WARN	(MFS,Tape mark during BACKUP/FRS save set)
MTFJKG:	JRST	MTEFX		;GO HANDLE EOF
;STILL IN IFN FT$MTB

;HERE TO HANDLE BACKUP STYLE HEADER

MTFRSP:	JUMPLE	T1,MTFJKB	;[425] ERROR IF BAD TYPE	[302]
	CAILE	T1,T$MAX	;SEE IF VALID			[302]
	JRST	MTFJKB		;[425] NO--ERROR		[302]
	MOVEM	T1,B$GTYP	;STORE TYPE			[302]
	MOVE	T1,[-^D11,,B$GBNM] ;GET REST			[302]
	PUSHJ	P,BLKOVR	; OF STANDARD HEADER		[302]
	  JRST	MTFJKB		;[425] JUNK IF TRUNCATED	[302]

	MOVE	T1,B$GTYP	;GET TYPE
	MOVE	T1,[B$LBL	;1=LABEL
		    B$SSS	;2=START OF SAVE SET
		    B$SSS	;3=END OF SAVE SET
		    B$FIL	;4=FILE
		    B$DIR	;5=DIRECTORY
		    B$EOV	;6=END OF VOLUME
		    B$CMT	;7=COMMENT
		    B$SSS]-1(T1);10=CONTINUE SAVE SET
	HRLI	T1,-^D20	;SET REST OF HEADER LENGTH	[302]
	PUSHJ	P,BLKOVR	;GET REST OF HEADER		[302]
	  JRST	MTFJKB		;[425] JUNK IF NOT ALL THERE	[302]

;HERE WHEN HEADER READ

MTFRSD:	MOVE	T4,B$GTYP	;GET RECORD TYPE
	JRST	@[MTFLBL	;1=LABEL
		  MTFSSS	;2=START OF SAVE SET
		  MTFESS	;3=END OF SAVE SET
		  MTFFIL	;4=FILE
		  MTFDIR	;5=DIRECTORY
		  MTFEOV	;6=END OF VOLUME
		  MTFCMT	;7=COMMENT
		  MTFCSS]-1(T4)	;10=CONTINUE SAVE SET
;STILL IN IFN FT$MTB

;HERE ON BACKUP/FRS LABEL RECORD

MTFLBL:	SETZM	BFHD+.BFCTR	;CLEAR REST OF BLOCK
	PUSHJ	P,NEXOVW	;GET EOF
	  SKIPA			;OK
	JRST	E$$JSS		;ERROR IF NOT EOF

	SKIPL	B$GTYP		;SEE IF BACKUP
	SKIPN	T1,B$LDDT	;GET LABEL DESTROY DATE
	JRST	MTFLB1		;CLEAR--LEAVE ALONE
	PUSHJ	P,.CNTDT##	;SPLIT IT
	MOVEM	T2,B$LDSD	;STORE DESTROY DATE
MTFLB1:	TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENTATION THEN
	MOVEI	M,[ASCIZ /  BACKUP label /]
IFN FT$MTS,<	;FRS
	SKIPGE	B$GTYP		;IF FRS,
	MOVEI	M,[ASCIZ /  FRS label /]
>;END IFN FT$MTS
	PUSHJ	P,LSTR		;LIST LABEL
	MOVEI	M,[ASCIZ / reel=/]
	SKIPE	T2,B$LREL	;IF REEL,
	PUSHJ	P,LSTR		; LABEL OUTPUT
	PUSHJ	P,LSIX		; AND OUTPUT REEL
	MOVEI	M,[ASCIZ / destroy on /]
	SKIPE	T4,B$LDSD	;IF DESTROY DATE,
	PUSHJ	P,LSTR		; LABEL OUTPUT
	SKIPE	T4		; AND
	PUSHJ	P,LDATE		; OUTPUT DESTROY DATE
	PUSHJ	P,LCRLF		;END LINE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

	MOVE	T1,[B$LCDT,,B$SCDT] ;COPY STANDARD STUFF
	BLT	T1,B$SMTC	; WHERE SAVE-SET HEADERS
	MOVE	T1,[B$LTIM,,B$STIM]
	BLT	T1,B$SDAT
	SETZM	B$SMOD
	SETZM	B$STRK
	SETZM	B$BSYS
	PUSHJ	P,MTFXSL	;ISSUE LINES COMMON TO SAVE-SET
	SKIPE	B$LCMT		;SEE IF COMMENT
	JRST	[TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
		PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENT
		MOVEI	M,[ASCIZ /    Comment: /]
		PUSHJ	P,LSTR		;LABEL RESULT
		SETZM	B$LCMT+16	;PROTECT ASCIZ
		MOVEI	M,B$LCMT	;POINT TO COMMENT
		PUSHJ	P,LSTR		;OUTPUT IT
		PUSHJ	P,LCRLF		;END LINE
		JRST  .+1]
	JRST	MTEOF		;GO CLEAR FAKE EOF AND REPEAT BACKUP PROCESSING	[241]
;STILL IN IFN FT$MTB

;HERE ON BACKUP/FRS END OF VOLUME

MTFEOV:	SETZM	BFHD+.BFCTR
	PUSHJ	P,NEXOVW	;GET NEXT WORD
	  SKIPA			;EOF--OK
	JRST	E$$JFS		;ELSE JUNK

;HERE AFTER READING END OF VOLUME

MTFEO0:	TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENTATION THEN
	MOVEI	M,[ASCIZ /  BACKUP end of volume/]
	PUSHJ	P,LSTR		;INDICATE EOV
	PUSHJ	P,LCRLF		;[412] END OF LINE
	PUSHJ	P,LCRLF		;[412] PLUS BLANK LINE FOR NEATNESS
	SKIPG	S.MVOL		;[412] MULTI-VOLUME CONTINUE?
	JRST	MTENDS		;NO - GO END LISTING OF SAVE SET
;[453]	MTUNL.	DC,		;[412] YES - UNLOAD OLD TAPE
	MOVE	T1,B$GRTN	;[412] RELATIVE TAPE NUMBER
	ADDI	T1,1		;[412] NEXT TAPE NUMBER
	MOVEM	T1,B$HRTN	;[412] HOLD IT FOR VERIFICATION
	MOVE	T1,[B$BSSN,,B$HSSN] ;[412] BLT POINTER TO
	BLT	T1,B$HSSN+6	;[412] SAVE SAVE-SET NAME
	MOVEI	T1,0		;[412] OUTPUT TO TTY:
	PUSHJ	P,.TYOCH##	;[412] FORCE IT THERE
	PUSH	P,T1		;[412] SAVE OLD OUTPUT ROUTINE
	MOVEI	T1,[ASCIZ/"End of volume reached on /]
	PUSHJ	P,.TSTRG##	;[412] TELL USER/OPERATOR
	MOVE	T1,MTNAME	;[412] NAME OF TAPE DRIVE
	PUSHJ	P,.TSIXN##	;[412] GIVE DRIVE NAME
	MOVEI	T1,[ASCIZ/:
/]				;[412]
	PUSHJ	P,.TSTRG##	;[412] CAP OFF DRIVE
	JRST	MTFEO2		;[412] NOW ASK FOR NEW TAPE
;STILL IN FT$MTB

MTFEO1:	MOVEI	T1,0		;[412] OUTPUT TO TTY:
	PUSHJ	P,.TYOCH##	;[412] REDIRECT SCAN
	PUSH	P,T1		;[412] SAVE OLD TYPEOUT
MTFEO2:	TLNN	F,L.MLBP	;[453] CONTROLLED BY MDA?
	JRST	MTFEO4		;[453] NO, ASK USER TO MANUALLY MOUNT NEW TAPE
	MOVEI	T1,[ASCIZ\"Asking MDA for automatic volume-switch . . .
\]				;[453] NICE INFORMATIVE TEXT
	PUSHJ	P,.TSTRG##	;[453] TO TELL THE USER WHAT IS HAPPENING
	MOVEI	T3,DC		;[453] TAPE CHANNEL
	MOVEI	T2,.TFFEV	;[453] TAPOP. FUNCTION
	MOVE	T1,[2,,T2]	;[453] AND TAPOP. ARG POINTER TO
	TAPOP.	T1,		;[453] ASK MONITOR/MDA TO SWITCH VOLUMES
	 SKIPA	P3,T1		;[453] FAILED!
	JRST	MTFEO5		;[453] CONTINUE PROCESSING NEXT TAPE VOLUME
	N$FAIO	(CGN,Couldn't get next volume, error )

MTFEO4:	MTUNL.	DC,		;[453] PUNT CURRENT TAPE VOLUME
	MOVEI	T1,[ASCIZ/$Mount next volume, type "C" to continue, "E" to exit: /]
	PUSHJ	P,.TSTRG##	;[412] ASK FOR COMMAND
	CLRBFI			;[412] JUST TO MAKE SURE
	INCHWL	T1		;[412] FIRST CHARACTER
	CLRBFI			;[412] EAT REST OF LINE
	CAIE	T1,"E"		;[412] EXIT (ABORT)?
	CAIN	T1,"e"		;[425] ALTERNATE WAY OF SAME?
	JRST	[POP	P,T1	;[412] RESTORE TYPEOUT ADDRESS
		PUSHJ	P,.TYOCH##  ;[412] TELL SCAN
		SETZM	MTNAME	;[412] FLAG NO LONGER HAVE TAPE
		TLZE	F,L.BPOP;[412] CALLED FROM NEXDV?
		POPJ	P,	;[412] YES, THEN RETURN TO THERE
		JRST	MTENDS]	;[412] END OUTPUT FILES ALSO
	CAIE	T1,"C"		;[412] CONTINUE?
	CAIN	T1,"c"		;[425] . . . ?
	CAIA			;[412] YES
	JRST	MTFEO2		;[412] GARBAGE, TRY AGAIN
MTFEO5:	POP	P,T1		;[412] RESTORE ADDRESS OF TYPEOUT
	PUSHJ	P,.TYOCH##	;[412] TELL SCAN
	TLZE	F,L.BPOP	;[412] CALLED FROM NEXDV?
	JRST	.POPJ1		;[412] YES, SUCCESSFUL RETURN TO THERE
	JRST	MTFRSR		;[412] NEXT RECORD PROCESSING
;STILL IN FT$MTB

;HERE FOR WRONG TAPE MOUNTED

MTFEO6:	MOVEI	T1,0		;[412] FORCE OUTPUT TO TTY:
	PUSHJ	P,.TYOCH##	;[412] REDIRECT SCAN'S OUTPUT
	PUSH	P,T1		;[412] REMEMBER OLD OUTPUT
	MOVEI	T1,[ASCIZ\$Wrong volume mounted, expecting tape # \]
	PUSHJ	P,.TSTRG##	;[412] START OFF MESSAGE
	MOVE	T1,B$HRTN	;[412] TAPE NUMBER WE WERE EXPECTING
	PUSHJ	P,.TDECW##	;[412] TELL USER THAT
	MOVEI	T1,[ASCIZ\; mounted tape is # \]
	PUSHJ	P,.TSTRG##	;[412] MORE ASCII TEXT
	MOVE	T1,B$GRTN	;[412] THIS TAPE NUMBER
	PUSHJ	P,.TDECW##	;[412] TELL USER
	PUSHJ	P,.TCRLF##	;[412] END THE LINE
	TLZE	F,L.BPOP	;[412] CALLED FROM NEXDV?
	JRST	MTFEO9		;[412] YES, ERROR RETURN TO THERE
	JRST	MTFEO2		;[412] LOOP BACK AND ASK FOR NEW TAPE

MTFEO7:	MOVEI	T1,0		;[412] FORCE OUTPUT TO TTY:
	PUSHJ	P,.TYOCH##	;[412] REDIRECT SCAN'S OUTPUT
	PUSH	P,T1		;[412] REMEMBER OLD OUTPUT
	MOVEI	T1,[ASCIZ/$Wrong volume mounted, expecting save set /]
	PUSHJ	P,.TSTRG##	;[412] START OFF MESSAGE
	MOVEI	T1,B$HSSN	;[412] SAVE SET WE WERE EXPECTING
	PUSHJ	P,.TSTRG##	;[412] TELL USER
	MOVEI	T1,[ASCIZ\; mounted tape is save set \]
	PUSHJ	P,.TSTRG##	;[412] MORE ASCII TEXT
	MOVEI	T1,B$BSSN	;[412] THIS TAPE SAVE SET
	PUSHJ	P,.TSTRG##	;[412] TELL USER
	PUSHJ	P,.TCRLF##	;[412] END THE LINE
	TLZN	F,L.BPOP	;[412] CALLED FROM NEXDV?
	JRST	MTFEO2		;[412] NO, LOOP BACK AND ASK FOR NEW TAPE

MTFEO9:	POP	P,T1		;[412] OLD TYPEOUT ADDRESS
	PJRST	.TYOCH##	;[412] RESTORE IT
;STILL IN FT$MTB

;HERE ON BACKUP/FRS COMMENT

MTFCMT:	SETZM	BFHD+.BFCTR	;CLEAR REST OF BLOCK
	PUSHJ	P,NEXOVW	;GET NEXT WORD
	  SKIPA			;EOF--OK
	JRST	MTFJKB		;[425] ELSE JUNK

;HERE AFTER READING COMMENT

	TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENTATION THEN
	MOVEI	M,[ASCIZ /  BACKUP comment: /]
	PUSHJ	P,LSTR		;INDICATE COMMENT
	MOVEI	M,B$CMT		;POINT TO COMMENT AREA
	PUSHJ	P,LSTR		;ISSUE IT
	JRST	MTENDS		;GO END LISTING OF SAVE SET

;HERE ON BACKUP/FRS END OF SAVE SET

MTFESS:	PUSHJ	P,MTFBGO	;UPDATE ANY OVERHEAD REGIONS	[302]
	  JRST	MTFJKB		;[425] ERROR IF GARBAGED	[302]
	SETZM	BFHD+.BFCTR	;DISCARD REST OF BLOCK
;[417]	@ MTFESS:+3L
;[417]	PUSHJ	P,NEXOVW	;GET NEXT WORD
;[417]	  SKIPA			;EOF--OK
;[417]	JRST	MTIOJK		;ELSE JUNK

;HERE AFTER READING END OF SAVE SET

	PUSHJ	P,DIRE		;GIVE TOTAL LINE
	MOVEI	T1,[ASCIZ /end/]
	PUSHJ	P,MTFXSS	;INDICATE END OF SAVE SET
	PUSHJ	P,NEXOVW	;[417] TRY READING ANOTHER RECORD
	  JRST	MTENDT		;[417] GO END LISTING OF SAVE SET
	PUSH	P,T1		;[417] SAVE NEW START OF RECORD
	TLZ	F,L.CRLF	;[417] SAVE SET (FILE) DIDN'T END
	PUSHJ	P,LCRLF		;[417] CAP OFF END SAVE SET MESSAGE
	SETZM	H.MZER		;[417] CLEAR TOTALS
	MOVE	T1,[H.MZER,,H.MZER+1]  ;[417] . . .
	BLT	T1,H.EMZR	;[417] . . .
	PUSHJ	P,WRNTMM	;[417] WARN ABOUT MISSING END OF FILE
	POP	P,T1		;[417] RESTORE NEW RECORD TYPE
	JRST	MTEXAM		;[417] AND SEE IF ANOTHER SAVE SET FOLLOWS
				;[417]  (WHICH DUMPER IS PRONE TO DO)

WRNTMM:	N$WARN	(TMM,Tape mark missing after end of save set)  ;[417]
	POPJ	P,		;[417] CONTINUE MERRILY . . .
;STILL IN IFN FT$MTB

;HERE AT START OR CONTINUATION OF FRS OR BACKUP SAVE SET

MTFCSS:	MOVEI	T1,[ASCIZ /continue/]
	SKIPA
MTFSSS:	MOVEI	T1,[ASCIZ /start/]
	PUSH	P,T1		;SAVE LABEL			[302]
	MOVE	T1,MTFBOT+3	;CLEAR SYSTEM HEADER		[302]
	PUSHJ	P,MTFBCB	; ..				[302]
	MOVE	T1,MTFBOT+4	;CLEAR SAVE SET NAME		[302]
	PUSHJ	P,MTFBCB	; ..				[302]
	PUSHJ	P,MTFBGO	;UPDATE OVERHEAD REGIONS	[302]
	  JRST	MTFJKB		;[425] ERROR IF GARBAGED	[302]
	POP	P,T1		;RESTORE LABEL			[302]
	SKIPG	T2,B$HRTN	;[412] THIS A CONTINUATION TAPE?
	JRST	MTFSS6		;[412] NO
	CAME	T2,B$GRTN	;[412] YES, TAPE WE WERE EXPECTING?
	JRST	MTFEO6		;[412] NO, GO COMPLAIN AT OPERATOR
	MOVSI	T2,-7		;[412] LENGTH OF SAVE SET NAME TEXT
MTFSS4:	MOVE	T3,B$BSSN(T2)	;[412] THIS TAPE SAVE SET NAME
	CAMN	T3,B$HSSN(T2)	;[412] MATCH EXPECTED SAVE SET NAME?
	AOBJN	T2,MTFSS4	;[412] YES, LOOP FOR WHOLE SAVE SET NAME
	JUMPL	T2,MTFEO7	;[412] NO, WRONG TAPE MOUNTED
MTFSS6:	SETZM	BFHD+.BFCTR	;DISCARD REST OF BLOCK
	PUSHJ	P,MTFXSS	;OUTPUT START
	SKIPG	S.IND		;[444] IF A NORMAL (NOT /INDIRECT) LISTING,
	TLO	F,L.SBTT	;[425] HEADER IS SAME AS TOTAL FOR SSTRDR
	TLZE	F,L.BPOP	;[412] CALLED FROM NEXDV?
	JRST	.POPJ1		;[412] YES
	JRST	MTFRSR		;RESUME FRS LISTING
;STILL IN IFN FT$MTB

;ROUTINE TO OUTPUT START, CONTINUATION, OR END OF SAVE SET

MTFXSS:	TLZ	F,L.CRLF	;[425] REALLY HONESTLY AND TRULY
	PUSHJ	P,LCRLF		;[425] WANT A BLANK LINE HERE!
	TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENTATION THEN
	MOVEI	M,[ASCIZ /  BACKUP /]
IFN FT$MTS,<	;FRS
	SKIPGE	B$GTYP		;SEE IF FRS
	MOVEI	M,[ASCIZ /  FRS /]
>;END IFN FT$MTS
	PUSHJ	P,LSTR		;ISSUE SAVER
	PUSH	P,T1		;[412] SAVE START/END TEXT
	MOVEI	M,[ASCIZ/reel number /]  ;[412]
	PUSHJ	P,LSTR		;[412] LIST TEXT
	MOVE	T1,B$GRTN	;[412] GET THIS REEL NUMBER
	PUSHJ	P,LDEC		;[412] AND LIST IT
	MOVEI	M,[ASCIZ/; /]	;[412] AND SEPARATE FROM
	PUSHJ	P,LSTR		;[412] ENSUING START/END INDICATOR
	POP	P,M		;[412] GET START/END TEXT
	PUSHJ	P,LSTR		;ISSUE IT
	MOVEI	M,[ASCIZ / save set: /]
	PUSHJ	P,LSTR		;ISSUE START OF SAVE SET
	SKIPL	B$GTYP		;IF BACKUP,			[302]
	JRST	[MOVEI M,B$BSSN	; POINT TO SAVE SET NAME	[302]
		 PUSHJ P,LSTR	; LIST IT			[302]
		 JRST  MTFXS1]	; AND PROCEED			[302]
	MOVE	T2,B$SNAM	;GET SAVE SET NAME
	PUSHJ	P,LSIXN		;ISSUE IT
MTFXS1:	PUSHJ	P,LCRLF		;END LINE			[302]
	PUSHJ	P,MTFXSL	;ISSUE LINES COMMON TO LABEL
	SKIPE	B$SCMT		;SEE IF COMMENT
	JRST	[TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
		PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENT
		MOVEI	M,[ASCIZ /    Comment: /]
		PUSHJ	P,LSTR		;LABEL IT
		SETZM	B$SCMT+4	;PROTECT ASCIZ
		MOVEI	M,B$SCMT	;OUTPUT
		PUSHJ	P,LSTR		; COMMENT
		PUSHJ	P,LCRLF	;END LINE
		JRST  .+1]	;RETURN
	POPJ	P,		;RETURN
;STILL IN IFN FT$MTB

;ISSUE LINES COMMON BETWEEN LABEL AND SAVE SET HEADERS

MTFXSL:	TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENTATION THEN
	PUSHJ	P,LSPC3		;[425] INDENT
	MOVEI	M,[ASCIZ / by version /]
	SKIPE	T4,B$SVER	;IF FRS/BACKUP VERSION SET,
	PUSHJ	P,LSTR		;INDICATE VERSION
	SKIPE	T4		;IF SET,
	PUSHJ	P,LVER		;LIST IT

	SKIPL	B$GTYP		;IF NOT FRS
	SKIPN	T1,B$SCDT	;AND DATE SET
	JRST	MTFXS2		;NO--SKIP ON
	PUSHJ	P,.CNTDT##	;SPLIT
	MOVEM	T1,B$STIM	;STORE CREATION TIME
	MOVEM	T2,B$SDAT	;STORE CREATION DATE
MTFXS2:
IFN FT$MTS,<	;FRS
	SKIPE	T1,B$STRK	;GET 7-TRACK FLAG
	MOVX	T1,MT.7TR	;SET FOR MTCHR.
	LDB	T2,[POINTR (B$SMOD,IO.DEN)]
	DPB	T2,[POINTR (T1,MT.DEN)]
	SKIPGE	B$GTYP		;IF FRS,
	MOVEM	T1,B$SMTC	; STORE MTCHR.
>;END IFN FT$MTS

	MOVEI	M,[ASCIZ / at /]
	PUSHJ	P,LSTR		;LABEL TIME
	MOVE	T1,B$STIM	;GET TIME
	PUSHJ	P,LMSECS	;LIST IT
	MOVEI	M,[ASCIZ / on /]
	PUSHJ	P,LSTR		;LABEL DATE
	MOVE	T4,B$SDAT	;GET DATE
	PUSHJ	P,LDATE		;LIST IT
	PUSHJ	P,LCRLF		;END LINE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;STILL IN IFN FT$MTB

	TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENTATION THEN
	PUSHJ	P,LSPC3		;SPACE IN
	MOVEI	M,[ASCIZ / written on /]
	SKIPE	T2,B$SDEV	;IF DEVICE,
	PUSHJ	P,LSTR		;LABEL DEVICE
	SKIPE	T2		;SKIP IF BLANK
	PUSHJ	P,LSIXCL	;LIST DEVICE
	MOVEI	M,[ASCIZ \ on S/N \]
	SKIPE	T1,B$SAPR
	PUSHJ	P,LSTR
	SKIPE	T1
	PUSHJ	P,LDEC
	LDB	T1,[POINTR (B$SMTC,MT.DEN)]
	JUMPE	T1,MTFXS3	;IF DENSITY SET,
	MOVEI	M,[ASCIZ / at /]
	PUSHJ	P,LSTR
	MOVE	T1,[ASCII /200/
		    ASCII /556/
		    ASCII /800/
		    ASCII /1600/
		    ASCII /6250/
		    ASCII /(6)/
		    ASCII /(7)/]-1(T1)
	MOVEI	M,T1		;ASCII OF DENSITY
	PUSHJ	P,LSTR		;ISSUE IT
	MOVX	T1,MT.7TR	;LOOK AT 7-TRACK FLAG
	MOVEI	M,[ASCIZ / 9-track/]
	TDNE	T1,B$SMTC	;SEE IF ON
	MOVEI	M,[ASCIZ / 7-track/]
	PUSHJ	P,LSTR		;ISSUE TRACKS
MTFXS3:	PUSHJ	P,LCRLF		;GO TO NEW LINE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;STILL IN IFN FT$MTB

	TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENTATION THEN
	PUSHJ	P,LSPC3		;SPACE 5
	MOVEI	M,[ASCIZ / under/]
	PUSHJ	P,LSTR		;ISSUE LABEL			[302]
	SKIPGE	B$SMTY		;GET SYSTEM TYPE		[302]
	TDZA	T1,T1		;IGNORE IF FUNNY		[302]
	LDB	T1,[POINTR (B$SMTY,CN%MNT)]
	CAILE	T1,3		;IS IT KNOWN?			[302]
	MOVEI	T1,0		;NO--FORGET IT			[302]
	MOVE	M,[	[ASCIZ \\]
			[ASCIZ \ TOPS-10\]
			[ASCIZ \ I.T.S.\]
			[ASCIZ \ TENEX\]  ](T1)
	PUSHJ	P,LSTR		;GIVE SYSTEM TYPE		[302]
	MOVEI	M,[ASCIZ / system/]
	PUSHJ	P,LSTR		;LABEL SYSTEM VERSION
	SKIPE	B$SSVR		;AND
	PUSHJ	P,LSPC		;SPACE
	SKIPE	T4,B$SSVR	;GET SYSTEM VERSION
	PUSHJ	P,LVER		;LIST IN VERSION		[302]
	MOVEI	M,[ASCIZ /: /]
	PUSHJ	P,LSTR		;SEPARATE SYSTEM NAME		[302]
	MOVEI	M,B$SSNM	;POINT TO SYSTEM NAME
	SKIPL	B$GTYP		;IF BACKUP,			[302]
	MOVEI	M,B$BSYS	; POINT TO SPECIAL REGION	[302]
	PUSHJ	P,LSTR		;OUTPUT IT
	PJRST	LCRLF		;END LINE
;STILL IN IFN FT$MTB

;HERE ON BACKUP/FRS DIRECTORY

MTFDIR:	PUSHJ	P,WLDEOD	;OUTPUT SUMMARIES
	SETZM	BFHD+.BFCTR	;DISCARD REST OF BLOCK
	JRST	MTFRSR		;AND CONTINUE ONWARD

;HERE ON BACKUP/FRS FILE

MTFFIL:	SETZM	LBLOCK		;CLEAR OUT ANY EXCESS
	MOVE	T1,[LBLOCK,,LBLOCK+1]
	BLT	T1,FRIBLK	; ..
IFN FT$MTS,<	;FRS
	SKIPL	B$GTYP		;IF BACKUP,			[302]
	JRST	MTFBFL		; GO HANDLE SEPARATELY		[302]
	MOVE	T1,B$FRBN	;GET RELATIVE BLOCK NO.		[302]
	LSH	T1,7		;CONVERT TO WORDS		[302]
	MOVEM	T1,B$FRDW	;STORE SIMILAR TO BACKUP	[302]
	SKIPL	T1,B$FNDW	;GET NUMBER OF WORDS
	CAILE	T1,200		;SEE IF OK
	JRST	MTFJKB		;[425] NO--ERROR
	SKIPN	T1,B$FNDB	;GET NUMBER OF DATA BLOCKS
	SKIPGE	B$GFLG		;UNLESS EOF			[305]
	SKIPA			;YES				[305]
	MOVEI	T1,5		;(BUG IN OLD VERSION OF FRS)
	SKIPL	T1		;SEE IF
	CAILE	T1,20		; MAKES SENSE
	JRST	MTFJKB		;[425] NO--ERROR
	IMULI	T1,200		;CONVERT TO WORDS
	ADD	T1,B$FNDW	;ADD LAST PARTIAL BLOCK
	CAIL	T1,200		;IN CASE JUST RIB, SKIP		[243,300]
	SUBI	T1,200		; REMOVE LAST BLOCK IN COUNT
	MOVEM	T1,BFHD+.BFCTR	;STORE AS ACTUAL DATA LENGTH
	MOVE	T1,B$FSTR	;GET STRUCTURE
	MOVEM	T1,FSTR		;SET FOR LISTER
	SKIPE	B$FRBN		;GET STARTING BLOCK
	JRST	[MOVE  T1,B$FNAM;GET HEADER NAME
		 MOVEM T1,FNAM	;STORE
		 MOVE  T1,B$FEXT;GET EXTENSION
		 HLLZM T1,FEXT	;STORE
		 MOVE  T1,B$FUFD;GET DIRECTORY
		 MOVEM T1,UFDPPN;STORE DIRECTORY
		 JRST  MTFDFM]	;GO STORE
>;END IFN FT$MTS
>;END IFN FT$MTB

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTS,<	;FRS

	MOVNI	T2,177-.FXLND	;PRESET COUNT OF RIB
	PUSHJ	P,NEXOVR	;GET RIB POINTER
	  JRST	E$$JFS		;UNEXPECTED END OF RECORD
	HRRZM	T1,RIBLEN	;SET AS RIB LENGTH
	TLZ	T1,-1		;CLEAR JUNK
	CAILE	T1,LN$RIB	;SEE IF IT FITS
	JRST	E$$JFS		;NO--ERROR
	MOVNS	T1		;GET NEGATIVE COUNT		[302]
	HRLZS	T1		;POSITION FOR AOBJN		[302]
	HRRI	T1,LBLOCK+1	;POINT TO RIB			[302]
	PUSHJ	P,BLKOVR	;TRANSFER BLOCK OF DATA		[302]
	  JRST	E$$JFS		;JUNK IF NOT THERE		[302]
MTFFR2:	PUSHJ	P,NEXOVR	;GET JUNK RIB
	  JRST	E$$JFS		;UNEXPECTED END OF RECORD
	JUMPN	T2,MTFFR2	;LOOP UNTIL DONE
	MOVEI	T4,.FXLND	;GET SFD DEPTH
;**;[450] @ MTFFR3 - 1L, Change 1L, BAH, 11-Mar-83
	SETZM	THSPTH+.PTPPN(T4) ;[450]SET END FLAG
MTFFR3:	PUSHJ	P,NEXOVR	;GET SFD
	  JRST	E$$JFS		;UNEXPECTED END OF RECORD
	MOVEM	T1,THSPTH+.PTPPN(T4) ;STORE SFD
	SOJGE	T4,MTFFR3	;GO GET NEXT ONE
	MOVE	T1,B$FLVL	;GET SFD LEVEL
	SETZM	THSPTH+.PTPPN+1(T1) ; CLEAR BEYOND IT

	SETZM	THSPTH		;CLEAR UNUSED AREA
	SETZM	THSPTH+1	; ..
	MOVEI	T1,THSPTH	;POINT TO SFD AREA
	SKIPE	THSPTH+.PTPPN+1	;SEE IF SFD NEEDED
	MOVEM	T1,UFDPPN	;YES--POINT TO IT
	JRST	MTFDFL		;GO HANDLE FILE
>;END IFN FT$MTS
IFN FT$MTB,<;	BACKUP/FRS

;HERE ON START OF BACKUP FILE TO ACQUIRE ATTRIBUTES, ETC.

MTFBFL:	MOVE	T1,MTFBOT	;CLEAR
	PUSHJ	P,MTFBCB	; NAME BLOCK
	MOVE	T1,MTFBOT+1	;CLEAR
	PUSHJ	P,MTFBCB	; ATTRIBUTES BLOCK
	MOVE	T1,B$GFLG	;[412] GET RECORD FLAGS
	TXNN	T1,GF$SOF	;[412] TRUE START OF FILE?
	JRST	[TRO	F,R.NSF	;RECOVER NAME
		 JRST	MTFB.1]	;GO PROCESS
	PUSHJ	P,MTFBGO	;GET OVERHEAD DATA
	  JRST	E$$JFS		;JUNK IF SCREWY
MTFB.1:	MOVEI	T1,.FCDEV	;GET
	PUSHJ	P,MTFBDT	; DEVICE
	MOVEM	T1,FSTR		;SAVE FOR DIRECTORY
	MOVEI	T1,.FCNAM	;GET
	PUSHJ	P,MTFBDT	; NAME
	MOVEM	T1,FNAM		;SAVE
	MOVEI	T1,.FCEXT	;GET
	PUSHJ	P,MTFBDT	; EXTENSION
	MOVEM	T1,FEXT		;SAVE
	MOVEI	T1,.FCDIR	;INDICATE UFD
	PUSHJ	P,MTFBDT	; GET IT
	JUMPE	T1,MTFB.3	;JUMP IF NOT THERE
	MOVEM	T1,MTPATH+.PTPPN;ELSE SET IN PATH
	MOVSI	P1,1-.FXLND	;COUNT SFDS			[331]
MTFB.2:	MOVEI	T1,.FCSFD(P1)	;INDICATE SFD			[331]
	PUSHJ	P,MTFBDT	;GET IT
	MOVEM	T1,MTPATH+.PTPPN+1(P1) ;STORE IT
	SKIPE	T1		;UNLESS DONE,
	AOBJN	P1,MTFB.2	; LOOP
	MOVEI	T1,MTPATH	;POINT TO PATH
MTFB.3:	MOVEM	T1,UFDPPN	;STORE AS DIRECTORY
	TRZE	F,R.NSF		;IF NOT START AT START,
	JRST	MTFDFM		; GO ISSUE MESSAGE
	MOVE	T1,B$BATT+A$FHLN;GET ATTRIBUTE LENGTH
	CAIGE	T1,^D8		;MAKE SURE BIG ENOUGH
	PUSHJ	P,[N$WARN (AMW,<File attributes may be wrong, proceeding . . .>)  ;[417]
		POPJ	P,]	;[417] DUMPER IS KNOWN TO DO THIS (CNT=0)
	MOVEI	T1,LN$RIB	;SET FULL
	MOVEM	T1,RIBLEN	; RIB LENGTH

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;STILL IN IFN FT$MTB

;NOW DO ATTRIBUTES

	MOVEI	T2,0		;PRECLEAR ACCESS
	SKIPE	T1,B$BATT+A$REDT;GET ACCESS TIME
	PUSHJ	P,.CNTDT##	;CONVERT FORMAT
	DPB	T2,[POINTR (FEXT,RB.ACD)]
	SKIPE	T1,B$BATT+A$PROT;GET PROTECTION
	PUSHJ	P,MTFDPR	;CONVERT TO TOPS-10
	DPB	T1,[POINTR (FCRE,RB.PRV)]
	SKIPN	B$BATT+A$PROT	;IF MISSING PROTECTION,
	SETOM	FPRV		;NO PROTECTION IN INTERCHANGE
	MOVE	T1,B$BATT+A$MODE;GET MODE
	DPB	T1,[POINTR (FCRE,RB.MOD)]
	MOVE	T1,B$BATT+A$WRIT;GET WRITE DATE
	PUSHJ	P,.CNTDT##	;TAKE APART
	DPB	T2,[POINTR (FCRE,RB.CRD)]
	LSH	T2,-^D12	;DATE75 EXCESS
	DPB	T2,[POINTR (FEXT,RB.CRX)]
	IDIVI	T1,^D60000	;CONVERT TO MINUTES
	SKIPE	T2		;IF EXCESS,
	AOS	T1		; ROUND UP
	DPB	T1,[POINTR (FCRE,RB.CRT)]
	MOVEI	T2,^D36		;GET WORD WIDTH IN BITS
	IDIV	T2,B$BATT+A$BSIZ;CONVERT TO LENGTH IN BYTES
	SKIPGE	T1,B$BATT+A$LENG;LENGTH IN BYTES
	MOVEI	T2,1		;IF OVERFLOW, KILL DIVISOR
	IDIV	T1,T2		;CONVERT TO LENGTH IN WORDS
	SKIPE	T2		;IF PARTIAL WORD,
	AOS	T1		; ROUND UP
	MOVEM	T1,FLEN		;STORE AS SIZE
	MOVE	T1,B$BATT+A$VERS;GET VERSION
	MOVEM	T1,FVER		;STORE
	MOVE	T1,B$BATT+A$NOTE;POINT TO ANNOTATION
	PUSHJ	P,MTGTSX	;CONVERT TO SIXBIT
	MOVEM	T1,FSPL		;SET IN SPOOL WORD
	MOVEI	T2,0		;PRECLEAR
	SKIPL	T1,B$BATT+A$ESTS;GET ESTIMATE
	IDIVI	T1,^D128	;CONVERT TO BLOCKS
	SKIPE	T2		;IF OVERFLOW,
	AOS	T1		; INCREMENT
	MOVEM	T1,FEST		;SET AS ESTIMATE
	MOVEI	T2,0		;PRECLEAR
	SKIPL	T1,B$BATT+A$ALLS;ALLOCATED SIZE IN WORDS
	IDIVI	T1,^D128	;CONVERT TO BLOCKS
	SKIPE	T2		;IF PARTIAL BLOCK,
	AOS	T1		; ROUND UP
	MOVEM	T1,FALC		;STORE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;STILL IN IFN FT$MTB

	SKIPL	T1,B$BATT+A$RADR;GET REQUESTED ADDRESS
	IDIVI	T1,^D128	;CONVERT TO BLOCKS
	MOVEM	T1,FPOS		;STORE
	MOVE	T1,B$BATT+A$USRW;GET USER WORD
	MOVEM	T1,FNCA		;STORE
	MOVE	T1,B$BATT+A$BKID;GET LAST BACKUP TAPE
	PUSHJ	P,MTGTSX	;CONVERT TO SIXBIT
	MOVEM	T1,FMTA		;STORE
	MOVEI	T1,0		;PRECLEAR STATUS BITS
	MOVSI	T2,(1B0)	;SET FIRST BIT
	MOVSI	T3,-LMTRBT	;SET LOOP LENGTH
MTFB.4:	TDNE	T2,B$BATT+A$FLGS;TEST BACKUP FLAG
	IOR	T1,MTRBT(T3)	;ON--SET TOPS-10 BIT
	LSH	T2,-1		;MOVE TO NEXT BACKUP BIT
	AOBJN	T3,MTFB.4	;LOOP OVER TABLE
	MOVEM	T1,FSTS		;STORE STATUS
	MOVE	T1,B$BATT+A$CUSR;GET AUTHOR
	PUSHJ	P,MTGTPP	;CONVERT TO PPN
	MOVEM	T1,FAUT		;STORE
	MOVE	T1,B$BATT+A$PCAW;GET PRIV USER WORD
	MOVEM	T1,FPCA		;STORE
	JRST	MTFDFL		;GO HANDLE FILE

;TABLE OF TOPS-10 FILE RIB STATUS BITS IN BACKUP ORDER

MTRBT:	RP.NDL
	Z
	Z
	RP.ABU
	RP.NQC
	RP.ABC
	RP.FCE
	RP.FWE
	RP.BFA
	RP.BDA
LMTRBT==.-MTRBT
;STILL IN IFN FT$MTB

;HERE WHEN FILE ACTUALLY FOUND ON TAPE

MTFDFM:	MOVEI	M,[ASCIZ \ File starts in middle: \]
	PUSHJ	P,LSTR		;NOT START OF FILE!

MTFDFL:	TLO	F,L.FRSS	;INDICATE FRS/BACKUP DATA
	PUSHJ	P,MTDOFL	;GO HANDLE FILE

	TLZ	F,L.FRSS!L.FKEF	;CLEAR FLAGS
	JRST	MTFRSR		;PROCEED TO NEXT BLOCK
>;END FT$MTB
	SUBTTL	DIRECTORY LISTING - MAGTAPE -- FAILSAFE

IFN FT$MTF,<	;FAILSAFE

MTSVST:	MOVE	T3,CHKSUM	;[345] SAVE THE CURRENT CHECKSUM
	MOVEM	T3,KCHKSM	;[345] ..
	SETZM	H.MZER		;CLEAR FOR THIS SAVESET		[222]
	MOVE	T3,[H.MZER,,H.MZER+1]
	BLT	T3,H.EMZR	; ..
	MOVE	T3,KCHKSM	;[345] RESTORE THE SAVED CHECKSUM
	MOVEM	T3,CHKSUM	;[345] ..
	MOVEM	T1,MTSVVR	;SAVE HEADER
	PUSHJ	P,NEXOVW	;GET CODE WORD			[222]
	  JRST	MTIOJF		;JUNK
	PUSHJ	P,NEXDT3	;[345] DO THE CHECKSUM
	JFCL			;[345] SILLY RETURN
	AOS	T2		;COUNT WORD
	CAME	T1,[SIXBIT /*FAILS/]
	JRST	MTIOJK		;NOT FAILSAFE TAPE
	SETZM	CHKSUM		;[345] CLEAR THE CHKSUM FOR THIS SAVE SET
	PUSHJ	P,NEXOVW	;GET TAPE NUMBER		[222]
	  JRST	MTIOJF		;DEATH
	AOS	T2		;COUNT STILL
	HRRM	T1,MTSVVR	;SAVE TAPE NUMBER
	TRZ	T1,377777	;CLEAR TAPE NUMBER
	CAME	T1,[SIXBIT /AFE/]
	JRST	MTIOJK		;JUNK
	PUSHJ	P,NEXOVW	;GET DATE, ETC.			[222]
	  JRST	MTIOJF		;NOT ENOUGH
	AOS	T2		;COUNT RECORD
	MOVE	P2,T1		;SAVE TAPE AND DATE
	PUSHJ	P,NEXOVW	;LAST WORD			[222]
	  JRST	MTIOJF		;SORRY
	AOS	T2		;COUNT WORD IN RECORD
	CAME	T1,[1,,2]	;CHECK THAT TOO
	JRST	MTIOJK		;NO--GIVE UP
	PUSHJ	P,NEXOVW	;READ THE EOF			[222]
	  JRST	.+2		;GOOD
	AOJA	T2,MTIOJK	;NO--JUNK

	TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENTATION THEN
	MOVEI	M,[ASCIZ /  FAILSAFE save set by version /]
	PUSHJ	P,LSTR		;LIST LABEL
	HLRZ	T1,MTSVVR	;GET VERSION OF FAILSA
	PUSHJ	P,LOCT		;LIST OCTAL
	PUSHJ	P,MTLTDT	;LIST TAPE'S DATE AND TIME
	MOVEI	M,[ASCIZ /  tape /]
	PUSHJ	P,LSTR		;LIST LABEL
	HRRZ	T1,MTSVVR	;GET TAPE NUMBER
	PUSHJ	P,LDEC		;LIST IT
	PUSHJ	P,LCRLF		;END LINE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;STILL IN IFN FT$MTF

;HERE AFTER SAVE SET HEADER IS OUTPUT AND
;BACK HERE AFTER EACH FILE TO LOOK FOR NEXT USER/STR

MTUSER:	MOVEI	M,[ASCIZ /<Tape mark>
/]
	SKIPLE	S.MARK		;[422] /MARKS?
	PUSHJ	P,LSTR		;YES--TELL USER
	STATZ	DC,IO.EOT	;SEE IF EOT
	  JRST	E$$PET		;YES--GO WRAP UP
	CLOSE	DC,		;CLEAR END-OF-FILE
	SOSN	MTFLCT		;DO /FILE ACCOUNTING
	JRST	MTDONX		;JUMP IF DONE WITH /FILE
	PUSHJ	P,NEXOVW	;READ NEXT HEADER		[222]
	  JRST	[N$WARN	(DTM,Double tape mark)
		 JRST  MTUSER]	;AND TRY AGAIN

;BACK HERE TO PROCESS NEXT FILE

MTLOOK:	JUMPGE	T1,MTRAIL	;MUST BE AT TRAILER
	TLC	T1,-1		;FLIP FLAG
	TLNN	T1,-1		;MAKE SURE IT WAS -1
	CAIGE	T1,42		;MAKE SURE FULL BLOCK THERE
	JRST	MTSVJK		;NO--JUNK IN SAVE SET
	PUSHJ	P,NEXOVW	;GET STR NAME			[222]
	  JRST	E$$JSS		;ERROR
	MOVEM	T1,FSTR		;SAVE FOR TYPEOUT
	MOVSI	P1,-41		;PRESET LOOKUP COPY LOOP
MTLOK1:	PUSHJ	P,NEXOVW	;GET WORD			[222]
	  JRST	E$$JSS		;ERROR
	MOVEM	T1,LBLOCK(P1)	;SAVE WORD
	AOBJN	P1,MTLOK1	;LOOP UNTIL DONE
	MOVE	T1,RIBLEN	;GET COUNT FROM TAPE
	CAIE	T1,40		;MUST BE 40
	JRST	MTSVJK		;NO--JUNK
	TLO	F,L.SVST	;FLAG SAVE SET READ TO SKIP OVER
				;  THE RECORD PREFIXES

;HERE WHEN FILE FOUND ON TAPE

	PUSHJ	P,MTDOFL	;GO HANDLE FILE

	TLZ	F,L.SVST	;CLEAR FUNNY MODE
	TLZN	F,L.FKEF	;SEE IF REAL OR FAKE EOF
	JRST	MTUSER		;REAL--GO TO NEXT STR OR PPN OR TRAILER
	MOVE	T1,MTSVHD	;FAKE--GET NEXT HEADER
	JRST	MTLOOK		;GO PROCESS NEXT FILE
>;END IFN FT$MTF
IFN FT$MTB!FT$MTF!FT$MTR,<	;BACKUP/FRS, FAILSAFE, OLD BACKUP/RESTORE

;MTDOFL -- ROUTINE TO ANALYZE FILE IF USER WANTS IT AND SKIP OVER DATA
;USES T1-4

MTDOFL:	AOS	.CTFLS##	;COUNT UP FILES SEEN ON TAPE
	AOS	.CTFLF##	;ASSUME FILE FOUND (.CHKTA WILL DECREMENT
				; THIS IF IT REJECTS THE FILE)
	PUSHJ	P,.CHKTA##	;SEE IF FILE MATCHES
	 JRST	MTSKIP		;REJECTED, ADVANCE TO NEXT FILE
	PUSHJ	P,ANALYZ	;GO LIST IN APPROPRIATE FORMAT
	 JFCL			;HOHUM

MTSKIP:	PUSHJ	P,NEXDTW	;READ REST OF DATA FILE
	  POPJ	P,		;GOOD--WE'RE DONE
	JRST	MTSKIP		;LOOP TO FILE'S END
>;END IFN FT$MTB!FT$MTF!FT$MTR
IFN FT$MTF,<	;FAILSAFE

;HERE WHEN TRAILER SEEN ON TAPE

MTRAIL:	HLLZ	T2,MTSVVR	;GET VERSION FROM HEADER
	PUSHJ	P,NEXOVW	;GET CHECK WORD			[222]
	  JRST	E$$JSS		;ERROR
	CAME	T1,[SIXBIT /*FAILS/]
	JRST	MTSVJK		;JUNK
	PUSHJ	P,NEXOVW	;AND COUNT			[222]
	  JRST	E$$JSS		;ERROR
	HRRZ	T2,MTSVVR	;GET SAVED TAPE NUMBER
	ADD	T1,T2		;MATCH AGAINST TRAILER'S
	CAME	T1,[<SIXBIT /AFE/>+1B17]
	JRST	MTSVJK		;ERROR
	PUSHJ	P,NEXOVW	;GET DATE, ETC.			[222]
	  JRST	E$$JSS		;ERROR
	MOVE	P2,T1		;SAVE FOR OUTPUT ROUTINE
	PUSHJ	P,NEXOVW	;GET FINAL CHECK		[222]
	  JRST	E$$JSS		;ERROR
	CAME	T1,[1,,2]	;CHECK CODE
	JRST	MTSVJK		;ERROR
	PUSHJ	P,NEXOVW	;READ EOF			[222]
	  JRST	.+2		;GOOD
	JRST	MTSVJK		;ERROR

;HERE AFTER READING THE TRAILER FILE

	PUSHJ	P,DIRE		;GIVE TOTAL LINE
	TLZ	F,L.CRLF	;[425] WE REALLY WANT A BLANK
	PUSHJ	P,LCRLF		;[425] (I.E., A "BLANK") LINE
	TLNE	F,L.MLBL	;[425] HAVE WE TYPED LABEL INFO?
	PUSHJ	P,LSPC2		;[425] YES, ANOTHER LEVEL OF INDENTATION THEN
	MOVEI	M,[ASCIZ /  End of save set/]
	PUSHJ	P,LSTR		;TYPE INDICATOR
	PUSHJ	P,MTLTDT	;LIST TIME AND DATE
MTENDS:	PUSHJ	P,LCRLF		;AND END LINE
MTENDT:	TLZ	F,L.CRLF	;[417] SEPARATE SAVE SETS FOR NEATNESS
	PUSHJ	P,LCRLF		;AND ADD A BLANK LINE
	SETZM	H.MZER		;CLEAR TOTALS
	MOVE	T1,[H.MZER,,H.MZER+1]
	BLT	T1,H.EMZR
	SKIPN	MTNAME		;[412] STILL HAVE A TAPE MOUNTED?
	JRST	MTDONY		;[412] NO, JUST CAP OFF AND QUIT
	JRST	MTFIND		;GO BACK TO START
>;END IFN FT$MTF
IFN FT$MTA,<	;MAGTAPES
IFN FT$MTF,<	;FAILSAFE

;HERE WHEN JUNK IN SAVE SET

MTSVJK:	SETZM	BFHD+.BFCTR	;CLEAR REST OF RECORD
	PUSHJ	P,NEXOVW	;READ ON TO EOF			[222]
	  JRST	E$$JSS		;GOT IT
	JRST	MTSVJK		;NO--LOOP
>;END IFN FT$MTF

;HERE WHEN EOF JUNK

	N$WARN	(JSS,Junk in save set)
	JRST	MTUSER		;GO START OVER

IFN FT$MTF,<	;FAILSAFE

;HERE ON PREMATURE EOT

	N$WARN	(PET,Premature end of tape in save set)
	PUSHJ	P,DIRE		;GIVE FINAL TOTALS		[153]
>;END IFN FT$MTF

;HERE AT EOT ON MAG TAPE

MTDONE:	SKIPE	S.EOT		;SEE IF /NOEOT
	JRST	MTDONX		;NO--GO FINISH UP
	CLOSE	DC,		;CLEAR END-OF-FILE
	SOSE	MTFLCT		;DO /FILE ACCOUNTING
	JRST	MTFIND		;START OVER UNLESS /FILE COUNTED OUT

;HERE WHEN TRULY TIME TO STOP

MTDONX:	SKIPE	S.REWS		;SEE IF /NOREW
	MTREW.	DC,		;REWIND TAPE AT END
MTDONY:	PUSHJ	P,DIRET		;ISSUE TOTALS, ETC.		[170]
	RELEAS	DC,		;RELEASE THE DATA CHANNEL
	SETZM	FOBLK+.FODEV	;INDICATE DEVICE IS NO LONGER WITH US
	DMOVE	T1,MTXDEV	;ORIGINAL DEVICE SPEC
	MOVE	T3,.WIFIR##	;COMMANDING FILE SPEC BLOCK ADDRESS
	DMOVEM	T1,.FXDEV(T3)	;RESTORE ON G.P.'S
	TRZ	F,R.WORD+R.MTOH	;[345] CLEAR WORD MODE AND TAPE OVERHEAD
	JRST	.POPJ1##	;RETURN HAPPILY
>;END IFN FT$MTA
	SUBTTL	DIRECTORY LISTING - MAGTAPE -- MISCELLANEOUS SUBROUTINES

IFN FT$MTF,<	;FAILSAFE

;MTLTDT -- ROUTINE TO LIST TIME AND DATE FROM FAILSAFE TAPE
;CALL:	MOVE	P2,WORD FROM HEADER
;	PUSHJ	P,MTLTDT
;LISTS " AT HH:MM:SS ON DATE"

MTLTDT:	PUSHJ	P,.SAVE1	;SAVE P1
	MOVEI	M,[ASCIZ / at /]
	PUSHJ	P,LSTR		;LIST LABEL
	HLRZ	T1,MTSVVR	;GET VERSION NUMBER
	CAIG	T1,27		;IF SINCE V.27 OK
	JRST	[LDB	T4,[POINT 11,P2,23]
		 PUSHJ	P,LTIME
		 JRST	MTSVDT]
	LDB	T4,[POINT 17,P2,23]
	CAILE	T1,77		;SEE IF V.100			[176]
	LDB	T4,[POINT 17,P2,20]  ;YES--GET NEW FORMAT	[176]
	PUSHJ	P,LSECS		;ISSUE TIME IN SECONDS
MTSVDT:	MOVEI	M,[ASCIZ / on /]
	PUSHJ	P,LSTR		;LIST LABEL
	HRRZ	T4,P2		;GET DATE			[162]
	ANDI	T4,77777	;MASK TO DATE			[176]
	HLRZ	T1,MTSVVR	;GET FAILSA VERSION		[162]
	CAIG	T1,77		;IF BEFORE VERSION 100,		[176]
	ANDI	T4,7777		;MASK OUT JUNK
	PJRST	LDATE		;LIST IT AND RETURN
>;END IFN FT$MTF
REPEAT	0,<

IFN FT$MTA,<	;MAGTAPES

;SUBROUTINE TO OPEN MAG TAPE
;CALL:	PUSHJ	P,MTOPEN
;RETURNS T1=0 IF FILE COUNT DONE (/FILE SWITCH)

MTOPEN:	MOVE	T1,MTSVFF	;RESTORE JOBFF
	MOVEM	T1,.JBFF	;  TO AVOID GROWTH
	MOVX	T1,FX.PAR	;CHECK FOR /PARITY
	TDNN	T1,.FXMOD(I)	; SUPPLIED BY USER
	TDZA	T1,T1		;NO--CLEAR IT
	MOVX	T1,IO.PAR	;YES--SET IT
	LDB	T2,[POINTR (.FXMOD(I),FX.DEN)]
	DPB	T2,[POINTR (T1,IO.DEN)]
	MOVE	T2,.FXMOD(I)	;GET PHYSICAL BIT
	TXNE	T2,FX.PHY	;TEST IT
	TXO	T1,UU.PHS	;YES--SET FOR OPEN
	IORI	T1,.IOBIN	;SET BINARY MODE
	SKIPN	S.RETR		;[416] /NORETRY?
	TXO	T1,UU.DER	;[416] YES, SUPPRESS AUTOMATIC RETRY
	SKIPN	S.ERLO		;[432] /NOERLOG?
	TXO	T1,UU.DEL	;[432] YES, DISABLE ERROR LOGGING
	MOVE	T2,.FXDEV(I)	;GET DEVICE NAME
	MOVEI	T3,BFHD		;GET INPUT BUFFER HEADERS	[166]
	OPEN	DC,T1		;OPEN CHANNEL
	  POPJ	P,		;RETURN WITH ERROR

;HERE WHEN TAPE IS OPENED--SETUP BUFFERS

	MOVEI	T4,T1		;GET SYSTEM BUFFERING
	DEVSIZ	T4,		;FROM MONITOR
	  SETZ	T4,		;[412] ???
	HRRZ	T1,T4		;GET BUFFER SIZE
	CAIGE	T1,LN$MRC+3	;SEE IF MIN TAPE OR BIGGER SIZE	[230]
	MOVEI	T1,LN$MRC+3	;NO--FORCE UP			[230]
	HRLI	T1,NM$MBF	;[412] NUMBER OF BUFFERS
	MOVEI	T2,BFHD		;POINT TO HEADER		[166]
	PUSHJ	P,MAKBUF	;MAKE A BUFFER RING
	SETOM	MTAEOF		;[441] SET NEW MTA FILE FLAG
	SOS	T1,MTFLCT	;COUNT DOWN FILE COUNTER
	JRST	.POPJ1##	;WIN RETURN
>;END IFN FT$MTA

> ;END OF REPEAT 0
IFN FT$MTB,<	;BACKUP/FRS

;MTFBGO -- GET OVERHEAD REGIONS FROM BACKUP/FRS TAPE
;CALL:	PUSHJ	P,MTFBGO
;	RETURN +1 IF ERRORS
;	RETURN +2 IF OK

MTFBGO:	PUSHJ	P,.SAVE3##	;MAKE SOME WORK ROOM
	HRRZ	P1,B$GLND	;[417] LENGTH (DUMPER LEAVES JUNK IN LH)

;LOOP OVER OVERHEAD BLOCKS
MTFG.1:	SOJL	P1,MTFG.3	;EXIT IF DONE
	PUSHJ	P,NEXOVR	;GET NEXT BLOCK HEADER
	  POPJ	P,		;ERROR IF MISSING
	HLRZ	P3,T1		;GET TYPE
	CAILE	P3,MTFBOL	;SEE IF TOO BIG
	POPJ	P,		;ERROR IF SO
	MOVEI	P2,-1(T1)	;GET LENGTH OF DATA PORTION
	SUB	P1,P2		;COUNT IF DOWN
	JUMPL	P1,.POPJ##	;ERROR IF TOO LONG
	MOVE	T1,MTFBOT-1(P3)	;GET AREA
	PUSHJ	P,MTFBCB	;CLEAR OUT AREA
	HLRE	T3,MTFBOT-1(P3)	;GET MAX LENGTH WE CAN HANDLE
	MOVN	T1,P2		;GET NEGATIVE LENGTH
	CAMG	T1,T3		;IF TOO NEGATIVE TO FIT,
	MOVE	T1,T3		; JUST USE OUR SPACE
	ADD	P2,T1		;SUBTRACT FROM TAPE SIZE
	HRLZS	T1		;POSITION FOR AOBJN
	HRR	T1,MTFBOT-1(P3)	;GET START
	PUSHJ	P,BLKOVR	;GET BLOCK OF DATA
	  POPJ	P,		;ERROR IF NOT ALL THERE
	MOVEI	T1,377		;MASK OF RIGHTMOST ASCIZ CHARACTER
	SKIPE	MTFBOU-1(P3)	;IF SET,
	ANDCAM	T1,@MTFBOU-1(P3); PROTECT AGAINST JUNK
MTFG.2:	JUMPLE	P2,MTFG.1	;SKIP REST
	PUSHJ	P,NEXOVR	; IF WE DIDN'T USE IT
	  POPJ	P,		;ERROR IF NOT ALL THERE
	SOJA	P2,MTFG.2	; LOOP
MTFG.3:	MOVE	T1,B$GSIZ	;UPDATE
	MOVEM	T1,BFHD+.BFCTR	; WORDS OF DATA
	JRST	.POPJ1##	;GIVE GOOD RETURN
>;END IFN FT$MTB

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTB,<	;BACKUP/FRS

MTFBOT:	-^D30,,B$BNAM	;1=NAME BLOCK
	-^D50,,B$BATT	;2=FILE ATTRIBUTES
	0		;3=DIRECTORY ATTRIBUTES
	 -^D6,,B$BSYS	;4=SYSTEM HEADER
	 -^D7,,B$BSSN	;5=SAVE SET NAME
MTFBOL==.-MTFBOT

MTFBOU:	0		;1=NAME BLOCK
	0		;2=FILE ATTRIBUTES
	0		;3=DIRECTORY ATTRIBUTES
	B$BSYS+5	;4=SYSTEM HEADER
	B$BSSN+6	;5=SAVE SET NAME


;MTFBCB -- ROUTINE TO CLEAR A SPECIFIC OVERHEAD BLOCK
;CALL:	T1/ AOBJN TO BLOCK
;	PUSHJ	P,MTFBCB
;	RETURN +1
;USES T1

MTFBCB:	SKIPGE	T1		;UNLESS NULL,
	SETZM	(T1)		; CLEAR WORD
	AOBJN	T1,.-1		;LOOP
	POPJ	P,		;RETURN
>;END IFN FT$MTB

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTB,<

;MTFBDT -- ROUTINE TO GET A SPECIFIC NAME COMPONENT
;CALL:	T1/ CODE OF COMPONENT TO GET
;	PUSHJ	P,MTFBDT
;	RETURN +1 WITH T1/ VALUE (CONVERTED TO SIXBIT) OR 0

MTFBDT:	PUSHJ	P,.SAVE2##	;SAVE SPACE
	MOVE	P2,T1		;COPY REQUEST FOR SAFE KEEPING
	MOVEI	P1,0		;SET COUNT
	TRNE	F,R.NSF		;IF NOT AT START,
	MOVEI	P1,B$FPTH-1	; USE RECOVERY HEADER
MTFD.1:	TRNE	F,R.NSF		;IF NOT AT START,
	JRST	[HRLI P1,(POINT 7,,35)
		 ILDB T2,P1	;GET SUB-BLOCK CODE
		 ILDB T4,P1	;GET LENGTH
		 JRST MTFD.2]	;AND PROCEED
	HLRZ	T2,B$BNAM(P1)	;GET NEXT SUB-BLOCK CODE
	HRRZ	T4,B$BNAM(P1)	;GET LENGTH
MTFD.2:	SKIPN	T4		;IF EMPTY,
	MOVEI	T4,1		; SET FOR JUST HEADER
	CAMN	T2,P2		;SEE IF MATCH
	JRST	MTFD.4		;YES--GO HANDLE
	TRNE	F,R.NSF		;IF NOT AT START,
	JRST	[HRRZ  T2,P1	;GET CURRENT WORD
		 CAIGE T2,B$FPTH+^D12 ;MAKE SURE FITS
		 JRST  MTFD.1	;OK--CONTINUE
		 JRST  MTFD.3]	;BAD--LOOSE
	ADD	P1,T4		;NO--ADVANCE
	CAIGE	P1,^D30		;SEE IF OVERFLOW YET
	JRST	MTFD.1		;NO--TRY AGAIN
MTFD.3:	MOVEI	T1,0		;YES--RETURN 0
	POPJ	P,		; TO CALLER
>;END IFN FT$MTB

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTB,<	;BACKUP/FRS

;HERE WHEN FOUND THE COMPONENT

MTFD.4:	TRNE	F,R.NSF		;IF NOT AT START,
	JRST	[HRRZ  T1,P1	;GET LOCATION
		 MOVNS T1	;GET -AMOUNT USED
		 CAILE T4,B$FPTH+^D12(T1) ;SEE IF FITS
		 MOVEI T4,B$FPTH+^D12(T1) ;NO--TRUNCATE
		 IMULI T4,5	;GET CHARACTER COUNT
		 SUBI  T4,2	;ALLOW FOR OVERHEAD
		 JRST  MTFD.5]	;AND PROCEED
	MOVN	T1,P1		;GET -AMOUNT USED
	CAILE	T4,^D30(T1)	;SEE IF LENGTH FITS
	MOVEI	T4,^D30(T1)	;NO--USE ACTUAL IN CORE
	SOS	T4		;REMOVE OVERHEAD WORD
	IMULI	T4,^D5		;CONVERT TO CHARACTERS
	ADD	P1,[POINT 7,B$BNAM,35] ;POINT TO START IN NEXT WORD
>;END IFN FT$MTB

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTB,<	;BACKUP/FRS
MTFD.5:	MOVEI	T1,0		;CLEAR SIXBIT ANSWER
	MOVE	T2,[POINT 6,T1]	;POINT TO ANSWER
	CAIN	P2,.FCDIR	;IF UFD,
MTFDPP:	JRST	[PUSHJ P,MTFD.G	; GET FIRST CHARACTER
		 CAILE T3,"7"	;IF ALPHA,
		 JRST  MTFD.7	; HANDLE AS SIXBIT
		 JRST  MTFD.8]	;ELSE, HANDLE IN OCTAL
MTFDSX:!
MTFD.6:	PUSHJ	P,MTFD.G	;GET NEXT CHARACTER
MTFD.7:	JUMPE	T3,.POPJ##	;EXIT WHEN DONE
	CAIG	T3,137		; IN ASCII COL 0-5
	TRC	T3,40		; FORCE TO ALPHA (COL 4-5)
	IDPB	T3,T2		;STORE
	TLNE	T2,(77B5)	;IF NOT DONE,
	JRST	MTFD.6		; LOOP FOR MORE
	POPJ	P,		;RETURN WHEN FULL

MTFD.8:	PUSHJ	P,MTFOCT	;UFD--GET PROJECT IN OCTAL
	PUSH	P,T1		;SAVE
	PUSHJ	P,MTFD.G	;SKIP SEPARATOR (_)
	PUSHJ	P,MTFOCT	;GET PROGRAMMER IN OCTAL
	HRL	T1,(P)		;INSERT PROJECT
	POP	P,(P)		;DISCARD TEMP
	POPJ	P,		;RETURN UFD

;HELPER TO CONVERT OCTAL

MTFOCT:	TDZA	T1,T1		;STARTS WITH CHAR
MTFO.1:	PUSHJ	P,MTFD.G	;GET CHAR
	CAIL	T3,"0"		;IF
	CAILE	T3,"7"		; OCTAL DIGIT,
	POPJ	P,		;NO--DONE
	LSH	T1,3		;ADVANCE RESULT
	ADDI	T1,-"0"(T3)	;INCLUDE DIGIT
	JRST	MTFO.1		;LOOP

;HELPER ROUTINE TO GET NEXT CHARACTER
; COUNTS IN T4, POINTER IN P1
; RESULT IN T3

MTFD.G:	SOSGE	T4		;SEE IF ROOM
	TDZA	T3,T3		;NO--GIVE NULL
	ILDB	T3,P1		;YES--GET IT
	POPJ	P,		;RETURN
>;END IFN FT$MTB

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTB,<	;BACKUP/FRS

;MTGTPP -- ROUTINE TO CONVERT ATTRIBUTE STRING TO UFD
;CALL:	1/ RELATIVE BYTE POINTER IN ATTRIBUTES
;	PUSHJ	P,MTGTPP
;	1/ CONVERSION

MTGTPP:	PUSHJ	P,.SAVE1	;SAVE P1
	PUSHJ	P,MTGT.P	;FIXUP POINTER SET COUNT
	MOVEI	T1,0		;PRESET ANSWER
	MOVE	T2,[POINT 6,T1]	;POINT TO ANSWER
	PJRST	MTFDPP		;GO USE ABOVE ROUTINE

;MTGTSX -- ROUTINE TO CONVERT ATTRIBUTE STRING TO SIXBIT
;CALL:	1/ RELATIVE BYTE POINTER IN ATTRIBUTES
;	PUSHJ	P,MTGTSX
;	1/ CONVERSION

MTGTSX:	PUSHJ	P,.SAVE1	;SAVE P1
	PUSHJ	P,MTGT.P	;FIXUP POINTER SET COUNT
	MOVEI	T1,0		;PRESET ANSWER
	MOVE	T2,[POINT 6,T1]	;POINT TO ANSWER
	PJRST	MTFDSX		;GO USE ABOVE ROUTINE

;HELPER TO SET STRING POINTER

MTGT.P:	MOVEI	T4,0		;PRESET TO DONE
	JUMPE	T1,.POPJ	;RETURN IF NO POINTER
	HRRZ	T2,T1		;GET ADDRESS OF POINTER
	CAIL	T2,^D50		;SEE IF BAD
	POPJ	P,		;YES--GIVE UP
	HRRI	T1,B$BATT(T2)	;COMPUTE REAL LOCATION
	MOVE	P1,T1		;SET FOR CHAR GETTER
	MOVEI	T4,^D50		;SET MAX LENGTH
	SUB	T4,T2		;REMOVE HEADER
	IMULI	T4,5		;CONVERT TO BYTES
	POPJ	P,		;RETURN
>;END IFN FT$MTB

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTB,<	;BACKUP/FRS

;MTFDPR -- ROUTINE TO CONVERT PROTECTION ATTRIBUTE
;CALL:	1/ BACKUP PROTECTION
;	PUSHJ	P,MTFDPR
;	1/ TOPS-10 PROTECTION

MTFDPR:	PUSH	P,T1		;SAVE ARG
	LSH	T1,-^D16	;GET OWNER
	PUSHJ	P,MTFDPF	;CONVERT OWNER FIELD
	MOVE	T4,T1		;SAVE
	MOVE	T1,(P)		;GET ARG
	LSH	T1,-^D8		;GET AFFINITY GROUP
	PUSHJ	P,MTFDPF	;CONVERT AFFINITY
	LSH	T4,3		;SHIFT ANSWER
	IOR	T4,T1		;INCLUDE GROUP
	POP	P,T1		;RESTORE WORLD
	PUSHJ	P,MTFDPF	;CONVERT WORLD
	LSH	T4,3		;POSITON ANSWER
	IOR	T1,T4		;COMBINE RESULT
	POPJ	P,		;RETURN

;HELPER TO CONVERT ONE FIELD

MTFDPF:	MOVEI	T3,7		;SET WORST
	LDB	T2,[POINTR (T1,PR$RED)]
	SUB	T3,T2		;REMOVE READ ACCESS
	CAIGE	T3,5		;BUT NOT LESS
	MOVEI	T3,5		; THAN 5
	LDB	T2,[POINTR (T1,PR$WRT)]
	JUMPN	T2,[MOVEI T3,5	;IF SOME WRITE,
		    SUB   T3,T2	; USE THAT INSTEAD
		    JRST  .+1]	; AND CONTINUE
	LDB	T2,[POINTR (T1,PR$ATR)]
	CAIN	T2,7		;IF DELETE,
	MOVEI	T3,1		; SET THAT
	CAIN	T2,6		;IF CHANGE PROT,
	MOVEI	T3,0		; SET THAT
	MOVE	T1,T3		;SET RESULT
	POPJ	P,		;RETURN
>;END IFN FT$MTB
	SUBTTL	DIRECTORY LISTING - TMPCOR

;HERE WHEN DEVICE IS "TMP:" AND DOES NOT EXIST

TMDIR:	PUSHJ	P,.SAVE4##	;WANT SOME ACS
	TRO	F,R.WORD!R.NDSK	;SET WORD MODE AND NOT A DISK	[202]
	MOVEI	P1,20		;RANDOM DEFAULT TMPCOR DIRECTORY SIZE
	SOS	.CTFLS##	;BACK OFF WILD'S "FILES SEEN" FLAG
	SOS	.CTFLF##	;BACK OFF WILD'S "FILES FOUND" FLAG

;ALLOCATE A BUFFER INTO WHICH TO DUMP THE TMPCOR DIRECTORY

TMDIR1:	MOVE	T1,P1		;GET NEEDED TMPCOR DIRECTORY SIZE
	PUSHJ	P,GETCOR	;GET A BUFFER
	MOVE	P2,T1		;SAVE START ADDRESS (OLDE .JBFF)
	MOVN	T4,P1		;NEGATIVE LENGTH
	HRLZ	T4,T4		;IN THE LEFT HALF
	HRRI	T4,-1(P2)	;T4:=IOWD POINTER TO DIRECTORY BUFFER
	SETZ	T3,		;NO PARTICULAR NAME
	MOVE	T1,[.TCRRD,,T3]	;TMPCOR ARG POINTER TO
	TMPCOR	T1,		;READ TMPCOR DIRECTORY
	  JRST	E$$NTD		;ERROR IF NOT IMPLEMENTED
	JUMPE	T1,[MOVEI M,[ASCIZ\TMPCOR directory is empty
\]
		PUSHJ	P,LSTR		;TELL USER OF NO FILES
		MOVEM	P2,.JBFF	;DEALLOCATE THE DIRECTORY BUFFER
		JRST	.POPJ1##]	;RETURN HAPPILY
	CAMGE	T1,P1		;IS DIRECTORY BIGGER THAN THE BUFFER?
	JRST	TMDIR4		;NO, ALL SET
	MOVE	P1,T1		;YES, SET NEEDED DIRECTORY BUFFER SIZE
	MOVEM	P2,.JBFF	;BACK OFF .JBFF TO RECLAIM OLD DIRECTORY
	JRST	TMDIR1		;RE-READ DIRECTORY WITH LARGER BUFFER

TMDIR4:	MOVE	J,T4		;IOWD POINTER TO DIRECTORY BUFFER
	SETOM	NXFCNT		;NO FILES FOUND YET
	SETOM	.WXPRC##	;FORCE FULL FILE SPEC VERIFICATION
;RDH	MOVEI	M,[ASCIZ /TMPCOR directory
;RDH/]
;RDH	PUSHJ	P,LSTR		;OUTPUT HEADING
;RDH	MOVEI	M,[ASCIZ\Free: \]
;RDH	PUSHJ	P,LSTR		;PREFIX FREE COUNT
;RDH	MOVEI	T1,.TCRFS	;GET FREE COUNT
;RDH	TMPCOR	T1,		;FROM MONITOR
;RDH	  JRST	E$$NTD		;IF POSSIBLE
;RDH	PUSHJ	P,LDEC		;AND TELL USER
;RDH	PUSHJ	P,LCRLF		;THEN END LINE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

TMDLP:	AOBJP	J,TMDON		;SEE IF DONE
	SKIPN	T2,(J)		;SEE IF ENTRY NEXT
	JRST	TMDLP		;NO--LOOP BACK
	HLLZM	T2,FNAM		;SAVE NAME
	HRRZM	T2,FLEN		;SAVE FILE LENGTH
	SETZM	FEXT		;CLEAR EXTENSION
	SETZM	UFDPPN		;CLEAR DIRECTORY
	AOS	.CTFLS##	;COUNT A FILE PRESENT
	AOS	.CTFLF##	;AND ASSUME IT MATCHES
	PUSHJ	P,.CHKTA##	;SEE IF IT MATCHES THE USER SPECIFICATION(S)
	 JRST	TMDLP		;FILE DOESN'T MATCH, LOOK FOR ANOTHER ONE

;COMPUTE CHECKSUM IF REQUESTED (WELL, WHY NOT?)

	SKIPG	S.CHK		;/CHECKSUM?
	JRST	TMDLP4		;NO
	MOVE	T1,FLEN		;YES, GET WORD COUNT OF FILE
	PUSHJ	P,GETCOR	;GET AN "I/O" BUFFER FOR THE DATA FILE
	MOVE	P3,T1		;SAVE ADDRESS OF BUFFER (.JBFF)
	MOVN	T4,FLEN		;NEGATIVE FILE LENGTH
	HRLZ	T4,T4		;IN THE LEFT HALF
	HRRI	T4,-1(P3)	;IOWD TO TMPCOR DATA FILE BUFFER
	HLLZ	T3,FNAM		;SET NAME OF THE TMPCOR FILE DESIRED
	MOVE	T2,[.TCRRF,,T3]	;TMPCOR ARG POINTER TO
	TMPCOR	T2,		;READ TMPCOR DATA FILE
	 JRST	E$$NTD		;ERROR??? SHOULDN'T HAPPEN
	HRLI	T1,(POINT 36,)	;CONCOCT A 36-BIT BYTE POINTER
	MOVEM	T1,BFHD+.BFPTR	;SET DATA RETRIEVER
	MOVE	T1,FLEN		;GET "BYTE" COUNT
	MOVEM	T1,BFHD+.BFCTR	;SET DATA COUNT FIELD
	TLO	F,L.FKEF	;SET FAKE "EOF" AT END OF CURRENT BUFFER
	MOVEM	P3,.JBFF	;DEALLOCATE THE TMPCOR DATA FILE BUFFER

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

TMDLP4:	SKIPLE	S.TMPC		;/TMPCOR SWITCH (OLD TMPCOR LISTING FORMAT)?
	JRST	TMDLP5		;YES
	SETOM	FPRV		;FORCE BIZARRE PROTECTION
	PUSHJ	P,ANALYZ	;GO HANDLE A "DATA FILE" LISTING
	 JFCL			;HOHUM
	JRST	TMDLP		;BACK FOR MORE FILES

TMDLP5:	MOVEI	M,[ASCIZ /TMPCOR directory
/]				;GET HEADER LINE
	AOSG	NXFCNT		;IS THIS THE FIRST FILE?
	PUSHJ	P,LSTR		;YES, PREFIX THE LISTING OUTPUT
	SKIPLE	S.SUM		;SEE IF /SUM			[220]
	JRST	TMDLP6		;YES--SKIP OUTPUT		[220]
	MOVE	T2,FNAM		;GET NAME
	MOVEI	T3,4		;OUTPUT 4 CHARS
	PUSHJ	P,LSIXC		; (3 FOR NAME AND ONE SPACE)
TMDLP6:	MOVE	T1,FLEN		;GET FILE LENGTH
	ADDM	T1,NOBLKS	;COUNT IN TOTAL BLOCKS (REALLY WORDS)
	SKIPLE	S.SUM		;SEE IF /SUM			[220]
	JRST	TMDLP		;YES--LOOP ON			[220]
	PUSHJ	P,LDEC4		;OUTPUT LENGTH
	SKIPG	S.CHK		;/CHECKSUM?
	JRST	TMDLP8		;NO
	PUSHJ	P,LSPC2		;YES, SPACE OVER
	SETZM	CHKSUM		;INITIALIZE CHECKSUM
	PUSHJ	P,NEXDCW	;CALCULATE
	PUSHJ	P,LCHECK	;AND LIST THE CHECKSUM TOO
TMDLP8:	PUSHJ	P,LCRLF		;END THE LINE
	JRST	TMDLP		;AND LOOP BACK

TMDON:	MOVEM	P2,.JBFF	;DEALLOCATE THE DIRECTORY BUFFER
	PUSHJ	P,DIRET		;OUTPUT ANY TOTAL AND/OR SUMMARY
	JRST	.POPJ1##	;RETURN HAPPILY


;ERRORS

	N$FAIL	(NTD,TMPCOR not supported in this monitor)
	SUBTTL	DIRECTORY LISTING - FIND FORMAT

FNDIR:

;NOW HANDLE /FNDDAT (IF ANY)

	SKIPN	F.BLK+.FXDEV	;DO WE HAVE A FILE SPEC (A LA /FNDDAT:FILE)?
	SKIPE	F.BLK+.FXNAM	; ( . . .)
	JRST	FNDIR1		;YES, USE IT
	SKIPN	F.BLK+.FXEXT	; ( . . .)
	SKIPE	F.BLK+.FXDIR	; ( . . .)
	JRST	FNDIR1		;YES, USE IT
	SETO	T2,		;NON-WILD MASK
	MOVSI	T1,'SYS'	;DEFAULT SCAN BLOCK - DEVICE SYS:
	DMOVEM	T1,F.BLK+.FXDEV	;SET IN FILE SPEC BLOCK
	MOVE	T1,['FNDDAT']	;DEFAULT FILENAME
	DMOVEM	T1,F.BLK+.FXNAM	;SET IN FILE SPEC BLOCK
	MOVE	T1,['FDF',,-1]	;DEFAULT EXTENSION (NO WILDCARDS)
	MOVEM	T1,F.BLK+.FXEXT	;SET IN FILE SPEC BLOCK

FNDIR1:	SETO	T2,		;FULL NON-WILD MASK
	MOVSI	T1,'DSK'	;DEFAULT DEVICE
	SKIPN	F.BLK+.FXDEV	;USER GIVE A DEVICE?
	DMOVEM	T1,F.BLK+.FXDEV	;NO, HE HAS ONE NOW
	MOVE	T1,['FNDDAT']	;DEFAULT NAME
	SKIPN	F.BLK+.FXNAM	;USER GIVE A FILE NAME?
	DMOVEM	T1,F.BLK+.FXNAM	;NO, HE HAS ONE NOW
	HRLOI	T1,'FDF'	;DEFAULT EXTENSION
	SKIPN	F.BLK+.FXEXT	;USER SUPPLY AN EXTENSION?
	MOVEM	T2,F.BLK+.FXEXT	;NO, USE OUR DEFAULT
				;WE UNCONDITIONALLY OVER-RIDE THE EXTENSION
				;ANYWAY, BUT IF USER TYPES .* WE STILL WANT
				;TO ISSUE ERROR MESSAGE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

FNDIR4:	MOVE	T1,[6,,[VERWRD		;PROTOCOL VERSION
		I.NXRD,,I.NXZR		;POINTER TO FIRST,,LAST FSB
		FOBLK+.FOIOS,,LBLOCK	;OPEN,,LOOKUP BLOCK ADDRESS
		.FXLEN,,LN$RIB+1	;LENGTH OF FSB,,LOOKUP
		FW.IFX + I		;IMMEDIATE FILE EXIT
		WLDEOD ]]		;END OF DIRECTORY
	PUSHJ	P,.LKWLD##	;SETUP WILD (.CHKTA) PARAMETERS
	 AOJA	T1,FNDIR5	;EXPECTED RETURN
	N$FAIL (LFS,LKWLD skip-returned to FNDIR - internal error)

FNDIR5:	JUMPE	T1,FNDIR8	;IF T1 = -1 THEN ALL DONE
	AOJE	T1,FNDIR6	;IF T1 = -2 THEN WE HAVE FILES TO DO
	N$FAIL	(LFU,LKWLD returned unknown reason to FNDIR - internal error)

FNDIR6:	MOVE	P4,T2		;POSITION ADDRESS OF RETURNED MATCHING FSB
	SOS	.CTFLS##	;BACKOFF WILD'S "FILES SEEN" FLAG
	SOS	.CTFLF##	;BACKOFF WILD'S "FILES FOUND" FLAG
	PUSHJ	P,FNDIN		;INITIALIZE INPUT FIND FILES
	SETZ	J,		;START AT THE BEGINING
	PUSHJ	P,FNLOP		;LOOK FOR FILES THAT MATCH
	JRST	FNDIR4		;BACK FOR MORE FILE SPECS

;HERE WHEN ALL DONE

FNDIR8:	PUSH	P,[-1]		;SETUP STACK FOR DIRED/DIRDON
	JRST	DIREDF		;HANDLE ANY END OF DIRECTORY STUFF
;LOOP OVER POINTER FILE LOOKING FOR A FILENAME/TYPE MATCH (WITHOUT WHICH
;WE KNOW IT IS USELESS TO CALL .CHKTA).
;
;CALL WITH P4 CONTAINING THE ADDRESS OF THE "MASTER" FILE SPEC BLOCK TO
;BE USED FOR POTENTIAL FILE MATCHES

FNLOP:	PUSHJ	P,PFGET		;WORD 00 - FILENAME
	MOVE	P1,T1		;SAVE IT FOR LOOP
	PUSHJ	P,PFGET		;WORD 01 - FILETYPE
	HLLZ	P2,T1		;SAVE IT FOR LOOP
	TLZE	F,L.FEOF	;REACHED END OF FILE ANYWHERE?
	POPJ	P,		;YES, CAN DO NO MORE HERE
	AOS	.CTFLS##	;NOTE A FILE HAS BEEN SEEN

;NOW SEE IF THE CURRENT FILE HAS ANY CHANCE OF MATCHING

FNLOP6:	XOR	P1,.FXNAM(P4)	;GET DIFFERENCE IN NAME
	XOR	P2,.FXEXT(P4)	;AND TYPE FIELDS
	TDNN	P1,.FXNMM(P4)	;FILE NAME DIFFER IN NON-WILD BITS?
	TLNE	P2,(P2)		;FILE TYPE DIFFER IN NON-WILD BITS?
	AOJA	J,FNLOP		;YES, CAN'T POSSIBLY MATCH

;FILENAME AND TYPE MIGHT MATCH, MUST CALL .CHKTA TO VERIFY TIMES ETC.

	PUSHJ	P,FNDOR		;GO DO THE GRUNDGE WORK
	 JFCL			;HOHUM
	AOJA	J,FNLOP		;LOOK FOR MORE FILES
;SETUP ONE FILE BLOCK FROM THE FIND DATA FILE INPUT

FNDOR:	MOVE	T1,J		;ENTRY NUMBER IN DATA FILES
	IMULI	T1,20		;DATA FILE IS 16 DECIMAL WORDS PER ENTRY
	IDIVI	T1,200		;DSK BLOCK IS 128 DECIMAL WORDS PER UUO
	CAME	T1,DGBLK	;HAVE WE ALREADY USETI'ED HERE?
	JRST	FNDOR1		;NO, NEED AN IN UUO
	SUB	T2,DGWRD	;YES, SEE HOW MUCH FURTHER INTO BLOCK
	JRST	FNDOR2		;AND POSITION THERE

FNDOR1:	USETI	DG,1(T1)	;POSITION MONITOR FOR NEXT IN
	SUBI	T1,1		;(DFGET WILL AOS ON THE FORCED IN)
	MOVEM	T1,DGBLK	;REMEMBER WHERE WE ARE IN DATA FILE
	SETZM	DGWRD		;START OF A NEW BLOCK
	SETZM	B.DG+.BFCTR	;MAKE SURE WE DO AN IN UUO
	PUSHJ	P,DFGET		;GET A WORD (FORCE IN UUO, REPLETE WITH ERROR
				; HANDLING AND ALL THOSE NICETIES)
	JUMPE	T2,FNDOR4	;IF POSITIONED, ENTER FILE READING CODE
	SUBI	T2,1		;ALLOW FOR WORD JUST READ
FNDOR2:	ADDM	T2,DGWRD	;POSITION WITHIN BLOCK
	ADDM	T2,B.DG+.BFPTR	;POINT TO PROPER WORD WITHIN DATA BLOCK
	MOVN	T2,T2		;(NO SUB TO MEMORY)
	ADDM	T2,B.DG+.BFCTR	;ADVANCE COUNTER ACCORDINGLY

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;EXTRACT AND BUILD A FILE BLOCK FROM THE DATA FILE

	PUSHJ	P,DFGET		;WORD 00 - IGNORED (NODE NAME, RESERVED)
FNDOR4:	PUSHJ	P,DFGET		;WORD 01 - DEVICE/STRUCTURE
	MOVEM	T1,FOBLK+.FODEV	;SET FOR ANALYZ
	MOVEI	T4,F.PTH	;PATH BLOCK
	MOVEM	T4,UFDPPN	;SET FOR ANALYZ
	HRLI	T4,-6		;SET TO BUILD DIRECTORY, FIVE SFD'S
				; (.FXLND NOTWITHSTANDING)
FNDOR6:	PUSHJ	P,DFGET		;WORD 02/07 - DIRECTORY
	MOVEM	T1,.PTPPN(T4)	;STORE AWAY IN PATH BLOCK
	AOBJN	T4,FNDOR6	;LOOP FOR UFD AND FIVE SFD'S
	PUSHJ	P,DFGET		;WORD 10 - FILE NAME
	MOVEM	T1,FNAM		;STORE FOR ANALYZ
	PUSHJ	P,DFGET		;WORD 11 - EXTENSION,,PROTECTION
	HLLZM	T1,FEXT		;STORE EXTENSION FOR ANALYZ
	HRLZM	T1,FCRE		;SET PROTECTION AND I/O MODE FOR ANALZY
	PUSHJ	P,DFGET		;WORD 12 - FILE LENGTH
	MOVEM	T1,FLEN		;SET IN FILE BLOCK
	PUSHJ	P,DFGET		;WORD 13 - CREATION DATE/TIME
	PUSHJ	P,.CNTDT##	;SPLIT IT UP INTO DATE AND TIME
	DPB	T2,[POINTR FCRE,RB.CRD]  ;STORE MOST OF CREATION DATE
	LDB	T2,[POINT 3,T2,23]  ;POSITION AND
	DPB	T2,[POINTR FEXT,RB.CRX]  ;STORE REST OF CREATION DATE
	IDIVI	T1,^D60*^D1000	;CONVERT MILLISECONDS TO MINUTES
	DPB	T1,[POINTR FCRE,RB.CRT] ;STORE CREATION TIME
	PUSHJ	P,DFGET		;WORD 14 - ACCESS DATE/TIME
	PUSHJ	P,.CNTDT##	;CONVERT TO DATE AND TIME
	DPB	T2,[POINTR FEXT,RB.ACD]  ;STORE ACCESS DATE
				; (NO ACCESS TIME AVAILABLE)
	PUSHJ	P,DFGET		;WORD 15 - VERSION
	MOVEM	T1,FVER		;STORE IN FILE BLOCK
	PUSHJ	P,DFGET		;WORD 16 - IGNORED
	PUSHJ	P,DFGET		;WORD 17 - CHECKSUM
	MOVEM	T1,CHKSUM	;STORE FOR ANALYZ

	AOS	.CTFLF##	;ASSUME FILE IS FOUND (.CHKTA WILL DECREMENT
				; THIS IF IT REJECTS THE FILE)
	PUSHJ	P,.CHKTA##	;SEE IF THIS FILE MATCHES
	 POPJ	P,		;NO - FILE REJECTED
	PUSHJ	P,ANALYZ	;PRINT DIRECTORY LISTING
	 JFCL			;HOHUM
	JRST	.POPJ1##	;FILE PRINTED
	SUBTTL	ROUTINE FOR DISK AND MAGTAPE DIRECTORY LINE

;SUBROUTINE TO ANALYZE AND PRINT FROM AN EXTENDED LOOKUP
;BLOCK AND READ THE FILE IF NECESSARY
;	SKIPS IF MATCHES, NON-SKIP IF TOO OLD OR TOO YOUNG

ANALYZ:	AOS	(P)		;WIN--GIVE OK RETURN
	PUSHJ	P,.SAVE1	;SAVE P1
	MOVEI	P1,0		;NO SPECIAL OFFSET
	SKIPLE	S.FIND		;/FIND?
	JRST	GOTSTR		;YES, ALREADY HAVE CHECKSUM AND STRUCTURE
	SETZM	CHKSUM		;CLEAR CHECKSUM ACCUMULATOR
	SKIPLE	S.FBLD		;[412] /FNDBLD?
	JRST	GOTSTR		;[412] YES, SKIP THIS JUNK THEN
	SKIPLE	S.UNIT		;SEE IF USER REQUESTED UNITS	[245]
	SKIPN	T1,FDEV		;YES--SEE IF FILSER TOLD US
	JRST	GOTSTR		;NO--DON'T CHANGE
	SKIPN	S.UNIT		;YES--SEE IF /NOUNITS
	SKIPE	.WLDFL##	;AND NO STR WILDCARD
	JRST	NEWSTR		;NO--OK
	MOVEM	T1,DCHBLK	;YES--SETUP FOR DSKCHR
	SETZM	DCHBLK+.DCSNM	;CLEAR ANSWER
	MOVE	T1,[.DCSNM+1,,DCHBLK] ;POINT TO BLOCK
	DSKCHR	T1,		;ASK MONITOR STR NAME
	  JRST	GOTSTR		;NICE TRY
	SKIPE	T1,DCHBLK+.DCSNM;GET STR NAME
NEWSTR:	MOVEM	T1,FSTR		;YES--UPDATE INFO TO PRINT
GOTSTR:	PUSHJ	P,SSTRDR	;SET STATUS AND TYPE SUMMARY	[323]
	AOS	SNFILF		;COUNT FILE FOUND		[323]
	SKIPG	S.SUM		;SEE IF /SUM
	TRNN	F,R.FAST	;NO SEE IF /F
	JRST	GETLEN		;[337] NO--ANALYZE
	SKIPLE	S.FIND		;/FIND?
	JRST	GETLEN		;YES, SETUP LENGTHS
	SKIPGE	S.ACCS		;[337] ACCESS REQUIRED?
	JRST	VERNON		;NO--NO ANALYSIS		[221]

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

GETLEN:	MOVE	T1,FLEN		;GET LENGTH
	SKIPE	FALC		;SEE IF FILE ALLOCATED
	SKIPG	S.ALC		;YES--SEE IF USER PREFERS THAT
	JRST	NOTALC		;NO--USE COMPUTED LENGTH
	MOVE	T1,FALC		;YES--PICK UP ALLOCATED LENGTH
	ASH	T1,7		;CONVERT TO WORD COUNT
NOTALC:	SKIPG	S.DTL		;IF /DETAIL, DON'T CLOBBER INFO
	MOVEM	T1,FLEN		;STORE AWAY FOR PRINTING
	MOVE	T2,T1		;[414] SAVE WORD COUNT
	ADDI	T1,177		;[414] AND GENERATE THE
	LSH	T1,-7		;[414] CORRESPONDING BLOCK COUNT
	SKIPG	S.SUM		;[337] SEE IF /SUM
	TRNN	F,R.FAST	;[337] IF NOT, DON'T ACCUMULATE IF /F
	CAIA			;[414] ACCUMULATE TOTALS
	JRST	NOTAL2		;[414] DON'T ACCUMULATE TOTALS
	ADDM	T1,SNBLKS	;[414] ACCUMULATE BLOCK COUNT
	ADDM	T2,SNWRDS	;[414] AS WELL AS WORD COUNT
NOTAL2:	SKIPLE	S.FIND		;/FIND?
	JRST	FILEND		;YES, NO /ACCESS, ALREADY HAVE VERSION
	CAMG	T1,S.ACCS	;SEE IF SHORT ENOUGH TO ACCESS
	TRO	F,R.ACCS	;YES--SET FLAG
	SKIPG	S.FBLD		;[412] /FNDBLD?
	TRNN	F,R.FAST	;[337] In fast mode?
	JRST	VERGET		;[337] No, go ahead and grunge
	SKIPG	S.SUM		;[337] Summing?
	JRST	VERNON		;[337] No, avoid all this work

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

VERGET:	SETZM	FRVER		;CLEAR RIB VERSION FOR /DET
	SKIPE	T1,FVER		;SEE IF FILE HAS A VERSION ALREADY
	SKIPLE	S.DTL		;YES--SEE IF /DETAIL
	JRST	.+2		;NO VERSION OR /DET
	JRST	VERNON		;YES--SKIP READING
	MOVEM	T1,FRVER	;SAVE RIB VERSION FOR /DETAIL
	HLRZ	T1,FEXT		;SEE IF VERSION SEARCH USEFUL
	CAIN	T1,'EXE'	;				[306]
	JRST	VEREXE 		;YES--HANDLE .EXE		[306]
	CAIE	T1,'HGH'
	CAIN	T1,'SHR'
	JRST	VERHGH		;YES--HIGH SEGMENT VARIETY
	CAIE	T1,'SAV'
	CAIN	T1,'LOW'
	JRST	VERLOW		;YES--LOW SEGMENT VARIETY
	CAIE	T1,'SVE'
	JRST	VERNON		;NO--FORGET THE IDEA

VERLOW:	PUSHJ	P,NEXDTW	;GET NEXT IOWD POINTER
	  JRST	VERNOF		;GIVE UP IF EOF
	JUMPE	T1,VERNOF	;GIVE UP IF JUNK
	SKIPA	T2,T1		;SAVE IT
VERLO1:	AOBJP	T2,VERLOW	;IF ALL USED UP, LOOP BACK FOR ANOTHER
	PUSHJ	P,NEXDTW	;GET A DATA WORD
	  JRST	VERNOF		;GIVE UP IF EOF
	HRRZ	T3,T2		;LOOK AT CURRENT ADDRESS
	CAIGE	T3,.JBVER-1	;  (NOTE-T3 IS ADDR-1)
	JRST	VERLO1		;NOT THERE YET SO LOOP BACK FOR MORE
	CAIN	T3,.JBVER-1	;MAKE SURE NOT TOO FAR
	JRST	VERGOT		;A WINNER--GO SAVE IT
	JRST	VERNON		;AND PROCEED

VERHGH:	MOVEI	T2,.JBHVR	;GUESS HOW FAR TO READ
VERHG1:	PUSHJ	P,NEXDTW	;GET NEXT WORD
	  JRST	VERNOF		;GIVE UP IF EOF
	SOJGE	T2,VERHG1	;COUNT AND LOOP UNTIL THERE
	JRST	VERGOT		;GO FINISH WITH RESULT		[306]

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

VEREXE:	MOVEI	T3,0		;CLEAR PROGRESS COUNT		[306]
VERE.1:	PUSHJ	P,NEXDTW	;GET BLOCK TYPE OF HEADER
	  JRST	VERNOF		;NONE IF EOF
	JUMPE	T1,VERNON	;[407] IF BLOCK HEADER=0, SKIP READING FURTHER
	AOS	T3		;COUNT WORD
	HLRZ	T2,T1		;GET BLOCK TYPE
	CAIN	T2,1776		;SEE IF EXE DIRECTORY
	JRST	VERE.3		;YES--GO LOOKUP PAGE 0
	CAIL	T2,1776		;IF NOT VALID TYPE,
	JRST	VERNON		; EXIT WITHOUT VERSION
	HRRZ	T2,T1		;OK--GET BLOCK SIZE
VERE.2:	SOJLE	T1,VERE.1	;(ALLOW FOR FIRST WORD)
	PUSHJ	P,NEXDTW	;SKIP THIS BLOCK
	  JRST	VERNOF		;GIVE UP IF EOF
	AOS	T3		;COUNT PROGRESS
	JRST	VERE.2		;LOOP
VERE.3:	HRRZ	T4,T1		;DIRECTORY--GET SIZE
	LSH	T4,-1		;GET COUNT OF BIWORDS
VERE.4:	SOJL	T4,VERNON	;GIVE UP IF NOT IN DIRECTORY
	PUSHJ	P,NEXDTW	;GET FIRST WORD OF PAIR
	  JRST	VERNOF		;GIVE UP IF END
	MOVE	T2,T1		;SAVE FOR A MINUTE
	PUSHJ	P,NEXDTW	;GET SECOND WORD OF PAIR
	  JRST	VERNOF		;GIVE UP
	ADDI	T3,2		;COUNT PROGRESS
	TRNE	T1,-1		;SEE IF PAGE 0
	JRST	VERE.4		;NO--LOOP OVER DIRECTORY
	HRRZ	T4,T2		;GET POSITION IN FILE
	LSH	T4,^D9		;CONVERT TO WORDS
	SUB	T4,T3		;ALLOW FOR CURRENT POSITION
	JUMPLE	T4,VERNON	;ERROR IF BEHIND US
	ADDI	T4,.JBVER	;SET TO VERSION LOCATION
VERE.5:	PUSHJ	P,NEXDTW	;ADVANCE TO WORD
	  JRST	VERNOF		;GIVE UP IF END
	SOJGE	T4,VERE.5	;[333] (@ VERE.5 + 2L) READ TO .JBVER

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

VERGOT:	SKIPE	T1		;SEE IF WE GOT SOMETHING
	MOVEM	T1,FVER		;GOT IT! SO SAVE IT
VERNON:	SKIPG	S.CHK		;CHECKSUM NEEDED?
	JRST	VERNOA		;[412] NO, CHECK FOR /ACCESS

VERCHK:	PUSHJ	P,NEXDCW	;[412] YES - READ REST OF BLOCK
	  JRST	VERNOF		;DONE IF EOF
	JRST	VERCHK		;KEEP GOING TO EOF

VERNOA:	TRNE	F,R.ACCS	;[412] /ACCESS?
	PUSHJ	P,NEXDTW	;[412] YES, MUST READ FILE THEN
	 JFCL			;[412] (ONE IN UUO IS SUFFICIENT)

VERNOF:	TLNE	F,L.SVST!L.BKSS!L.FRSS  ;SEE IF MAG TAPE	[230]
	JRST	FILEND		;YES--SKIP THE CLOSES
	TRZN	F,R.ACCS	;SEE IF ACCESS NEEDED
	JRST	FILNOA		;NO--CLOSE WITHOUT IT
	CLOSE	DC,CL.DAT	;CLOSE AND INDICATE ACCESSED
	JRST	FLIST		;AND CONTINUE BELOW
FILNOA:	CLOSE	DC,CL.ACS!CL.DAT;DON'T UPDATE ACCESS DATES
FILEND:

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;HERE WHEN IT IS TIME TO OUTPUT ONE LINE OF THE DIRECTORY

FLIST:	SKIPLE	S.FBLD		;[412] /FNDBLD?
	PUSHJ	P,DOFND		;[412] WRITE FILE INTO FIND FILES
	SKIPN	S.DIRE		;[412] /NODIRECT?
	POPJ	P,		;[412] YES, DONE WITH THIS FILE
	TRNN	F,R.NDSK	;IF NOT A DISK (E.G., DECTAPE)
	SKIPG	S.DTL		;A DISK, /DETAIL?
	CAIA			;NOT A DISK, OR NOT /DETAIL
	JRST	DLIST		;DISK/DETAIL, GO ISSUE DETAILED LISTING
	SKIPLE	S.SUM		;SEE IF SUMMARY MODE
	TRNE	F,R.FAST	;YES--CHECK /F
	JRST	.+2		;YES--GIVE OUTPUT
	POPJ	P,		;NO--SKIP LISTING
	TLZN	F,L.SBTT	;[412] DID WE JUST OUTPUT TOTALS LINE?
	JRST	FLIST2		;[412] NO
	TLZ	F,L.CRLF	;[412] YES WE DID
	PUSHJ	P,LCRLF		;[412] SO GIVE A BLANK LINE FOR NEATNESS
;FLIST2:TRNE	F,R.FAST	;[351] [443] IF IN FAST MODE
;	SKIPN	S.WDTH		;[351] [443] AND WIDTH SPECIFIED
FLIST2:	SKIPLE	S.IND		;[443] /INDIRECT ?
	JRST	FLNAM		;[351] NO SKIP WIDTH TEST
	MOVE	T1,NOCHRS	;[351] GET NUMBER OF CHARACTERS ON THE LINE
	ADDI	T1,7		;[351] ADD A POSSIBLE TAB.
	TRZ	T1,7		;[351] AND ROUND IT OFF
	ADD	T1,S.LENT	;[351] ADD THE LENGTH OF AN ENTRY.
	SKIPE	S.PRVE		;[443] PRINTING VERSIONS???
	SKIPN	FVER		;[443] YES, PRINT VERSIONS, BUT IS THERE ANY
	SKIPA			;[443] NO, NO VERSIONS & THERE IS NONE
	ADDI	T1,^D16		;[443] YES, THERE ARE VERSIONS, SO PRINT THEM
	SKIPE	FSPL		;[443] ANY SPOOLED NAMES????
	ADDI	T1,^D10		;[443] YES THERE IS, SO ALLOW 10(dec) FOR IT
	CAMLE	T1,S.WDTH	;[351] IF LESS THAN THEN WE CAN GO AHEAD
	PUSHJ	P,LCRLF		;[351] ELSE PRINT THE LINE UP TO NOW.
FLNAM:	PUSHJ	P,LSTFNM	;LIST FILE NAME
	PUSHJ	P,LTBEXT	;SPACE OVER			[177,212]
FLEXT:	HLLZ	T2,FEXT		;OUTPUT EXTENSION
	SKIPG	S.IND		;[433] /INDIRECT SPECIFIED?
	JRST	FLEXT2		;[433] NO, NORMAL DIRECTORY LISTING
	PUSHJ	P,LSIXN		;[433] YES, LIST EXTENSION, NO BLANKS
	JRST	FLSDIR		;[433] AND GO DIRECTLY TO DIRECTORY OUTPUT

FLEXT2:	TRNN	F,R.FAST	;SEE IF /F MODE
	JRST	FLEXT3		;NO--GO DO SLOW FORMAT
	MOVEI	T3,3		;IN CASE DOING /SORT		[236]
	PUSHJ	P,LSIXC		;LIST IN 3 COLUMNS		[236]
	SKIPLE	S.CHK		;SEE IF /CHECKSUM		[221]
	PUSHJ	P,LSPC2		;YES--SPACE OVER TO IT		[221]
	JRST	FLCHEK		;AND END LINE			[221]
FLEXT3:	CAMN	T2,['UFD   ']	;SEE IF .UFD
	SKIPGE	FNAM		;AND NUMERIC
	JRST	FLEXT4		;NO--PROCEED
	MOVE	T1,FLEN		;YES--SKIP EXT
	ADDI	T1,177		;[412] ROUND UP TO BLOCK BOUNDRY
	LSH	T1,-7		;[412] AND TRUNCATE TO BLOCK SIZE
	PUSHJ	P,LDEC4		;[343] LIST LENGTH
	JRST	FLEXT8		;AND PROCEED
FLEXT4:	MOVEI	T3,3		;AS THREE CHARACTERS
	PUSHJ	P,LSIXC
	PUSHJ	P,LSPC		;[426] POSITION FOR LENGTH
	MOVE	T1,FLEN		;GET FILE LENGTH
	TRNE	F,R.WORD	;[412] /WORDS?
	JRST	FLEXT7		;[412] YES - PRINT DIRECTLY
	ADDI	T1,177		;[412] NO - ROUND UP TO NEXT BLOCK
	LSH	T1,-7		;[412] CONVERT TO BLOCKS
	PUSHJ	P,LDEC5		;[426] SPACE 5 PLACES ONLY
	JRST	FLEXT8		;[412] CONTINUE

FLEXT7:	PUSHJ	P,LDEC9		;[426] DO THE SPACING TO 9 PLACES
				;[412] AND FALL INTO FLEXT8

FLEXT8:	MOVEI	M,[ASCIZ /  </]	;[412]
	PUSHJ	P,LSTR
	SKIPN	T1,FPRV		;SEE IF FORCED KNOWN PRIV	[316]
	LDB	T1,[POINTR (FCRE,RB.PRV)]	;		[162]
	JUMPL	T1,[MOVEI M,[ASCIZ /***/]
		    PUSHJ P,LSTR;LIST "UNKNOWN"
		    JRST  .+2]	;AND PROCEED
	PUSHJ	P,LOCT3Z
	MOVEI	M,[ASCIZ />   /]
	PUSHJ	P,LSTR
FLCHEK:	SKIPG	S.CHK		;SEE IF CHECKSUM
	JRST	FCHKN		;NO--SKIP OUTPUT
	PUSHJ	P,LCHECK	;LIST CHECKSUM
	PUSHJ	P,LSPC2		;AND SPACE OVER

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

FCHKN:	TRNN	F,R.SLOW	;SEE IF IN SLOW MODE
	JRST	FCRED		;NO--SKIP ACCESS DATE
	LDB	T4,[POINTR (FEXT,RB.ACD)]	;		[162]
	PUSHJ	P,LDATE		;OUTPUT ACCESS DATE
	PUSHJ	P,LTAB
	LDB	T4,[POINTR (FCRE,RB.CRT)]	;		[162]
	PUSHJ	P,LTIMEB	;OUTPUT CREATION TIME
	PUSHJ	P,LTAB
FCRED:	TRNE	F,R.FAST	;SEE IF /FAST			[221]
	JRST	FLSDIR		;YES--SKIP ON			[221]
	LDB	T4,[POINTR (FCRE,RB.CRD)]	;		[162]
	LDB	T3,[POINTR (FEXT,RB.CRX)]	;GET EXTENSION	[162]
	DPB	T3,[POINT 3,T4,23]	;ADD INTO RESULT	[162]
	PUSHJ	P,LDATE		;OUTPUT CREATION DATE
	TRNN	F,R.SLOW	;SEE IF IN SLOW MODE
	JRST	FLVER		;NO--SKIP FILE MODE
	PUSHJ	P,LSPC2
	LDB	T1,[POINTR (FCRE,RB.MOD)]	;		[162]
	PUSHJ	P,LOCT2		;OUTPUT FILE MODE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

FLVER:	SKIPN	S.PRVE		;[412] /NOPRVERSION?
	JRST	FLACCT		;[412] YES, SKIP ONWARDS
	MOVE	T4,FVER		;OUTPUT FILE VERSION
	TLNN	F,L.FRMT	;[335] FORCE OUTPUT IF FORMATTING
	SKIPLE	S.PRVE		;[412] OR IF /PRVERSION
	JRST	FLVER2		;[412] (ONE OF THE ABOVE)
	JUMPN	T4,FLVER2	;IF NON-ZERO VERSION THEN PRINT IT
	TRNN	F,R.SLOW	;IF SLOW (LONG) PRINTING
	SKIPLE	S.FIND		;OR IF /FIND OUTPUT
	PUSHJ	P,LTAB		;PRESERVE COLUMN-NESS OF OUTPUT
	JRST	FLACCT		;GO CHECK ACCOUNT STRING
FLVER2:	PUSHJ	P,LTAB
	MOVE	P1,NOCHRS	;GET POSITION
	ADDI	P1,7		;ALLOW FOR DELAYED TABBING
	TRZ	P1,7		;TAB OVER
	MOVNS	P1		;PREPARE TO SUBTRACT
	PUSHJ	P,LVER
	ADD	P1,NOCHRS	;GET DISTANCE MOVED BY VERSION
	TLNN	F,L.FRMT	;[335] IF NICE OUTPUT FORMAT
	SKIPLE	S.PRVE		;[412] OR IF /PRVERSION
	SKIPA			;[412] (ONE OF THE ABOVE)
	JRST	FLACCT		;[335] NO - SKIP FORMATTING STUFF
	CAIG	P1,7		;[335] AND LESS THAN ONE TAB
	PUSHJ	P,LTAB		;[335] YES--MOVE ANOTHER TAB
	SKIPG 	S.SORT		;[335&446] /SORT'ING ?
	 JRST	FLS335		;[446] NO - GO AFFECT TAB PLACEMENT
FLS446:	PUSHJ	P,LSPC		;[446] MOVE (AT LEAST) ONE SPACE
	MOVE 	P1,NOCHRS	;[446] GET COLUMN COUNT
	TRC	P1,7		;[446] WE ONLY CARE ABOUT CHARS AFTER LAST TAB
	TRNE	P1,7		;[446] IS IT 7?
	 JRST	FLS446		;[446] NO - GO PLACE ANOTHER SPACE
	JRST	FLACCT		;[335] YES - MOVE ON

FLS335:	PUSHJ	P,LSPC		;[335] MOVE (AT LEAST) ONE SPACE
	MOVE	P1,NOCHRS	;[335] GET COLUMN (CHARACTER) COUNT
	TRNE	P1,4		;[335] 1.5 TAB COLUMNS YET?
	 JRST	FL335A		;[335] YES - NO MORE SPACING
	TRNE	P1,3		;[335] 1.5 TAB COLUMNS OVER?????
	 JRST	FLS335		;[335] NOT YET - KEEP SPACING
FL335A:	TRO	F,R.STAB	;[335] AND FLAG SUPPRESS NEXT TAB
				;[335] AS ALREADY PROPERLY POSITIONED.

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

FLACCT:	SKIPG	S.ACCT		;SEE IF /ACCOUNT
	JRST	FNVER		;NO
	PUSHJ	P,LTAB		;POSITION
	MOVEI	M,FACT
	PUSHJ	P,LSTR
	TLNN	F,L.FRMT	;ARE WE FORMATTING OUTPUT?
	JRST	FNVER		;NO
	MOVEI	P1,^D103	;BRING OUT TO COLUMN 103
FLACC1:	CAMG	P1,NOCHRS	;[445] ARE WE THERE YET?
	JRST	FNVER
	PUSHJ	P,LSPC
	JRST	FLACC1
FNVER:	SKIPG	S.AUT		;SEE IF /AUTHOR			[174]
	JRST	FLSDIR		;NO--JUST GO DO DIRECTORY	[174]
	SKIPE	T2,UFDPPN	;GET FILE'S OWNER		[174]
	TLNE	T2,-1		;SEE IF SFD			[174]
	SKIPA			;NO				[174]
	MOVE	T2,.PTPPN(T2)	;YES--GET OWNER			[174]
	SKIPE	T1,FAUT		;SEE IF AUTHOR			[174]
	XOR	T1,T2		;YES--COMPARE TO OWNER		[174]
	TLNN	F,L.FRMT	;[335] SEE IF NICE OUTPUT FORMAT
	JUMPE	T1,FLSDIR	;NO--SEE IF SAME AS OWNER	[174]
	PUSHJ	P,LTAB		;TAB OVER			[174]
	PUSHJ	P,LAUT		;YES--GO LIST AUTHOR		[174]
FLSDIR:	TRZ	F,R.STAB	;[335] ONLY SUPRESS TAB IF IN AUTHOR
	SKIPN	S.SORT		;UNLESS /SORT			[246]
	SKIPLE	S.FLSD		;[412] FIRST-LINE STR/DIR LISTING?
	PUSHJ	P,LSTRDR	;YES - OUTPUT STR AND DIRECT.
	TRNN	F,R.FAST	;SEE IF /F
	SKIPN	T2,FSPL		;NO--SEE IF SPOOLED NAME
	JRST	FDONE		;NO--SKIP OUTPUT
	PUSHJ	P,LTAB		;YES--SPACE OVER
	PUSHJ	P,LSIXN		;AND TYPE SPOOLED NAME
FDONE:	MOVE	T1,NOCHRS	;SEE IF DONE WITH THIS LINE
	CAMG	T1,MXWDTH	;SEE IF OVER REQUEST		[320]
	PJRST	LTAB		;NO--GO ISSUE TAB
	PJRST	LCRLF

;ROUTINE TO ISSUE DOT OR SPACE BEFORE EXTENSION

LTBEXT:	TRNE	F,R.FAST	;SEE IF /F
	SKIPE	S.WDTH		;YES--SEE IF NOT /WIDTH
	PJRST	LTAB		;NO--ISSUE TAB
	SKIPE	S.SORT		;SEE IF /SORT			[236]
	PJRST	LTAB		;YES, THEN NO .			[236]
	MOVEI	C,"."		;YES--USE DOT (IT'S FASTER)
	PJRST	LCHR		; AND RETURN
;HERE TO OUTPUT A DETAILED DIRECTORY LISTING

DLIST:	PUSHJ	P,.SAVE4##	;SAVE ALL JUST IN CASE
	TLZN	F,L.SBTT	;[412] DID WE JUST ISSUE SUBTOTALS LINE?
	JRST	DLIST2		;[412] NO
	TLZ	F,L.CRLF	;[412] YES WE DID
	PUSHJ	P,LCRLF		;[412] SO GIVE A BLANK LINE FOR NEATNESS
DLIST2:	SKIPE	T2,FDEV		;GET UNIT
	SKIPN	S.UNIT		;IF /NOUNITS
	SKIPE	T2,FSTR		;  OR IF UNIT NOT AVAILABLE, USE STR	[316]
	PUSHJ	P,LSIXCL	;LIST IN SIXBIT WITH COLON
	HLRZ	T1,FEXT		;GET EXTENSION
	CAIN	T1,'UFD'	;SEE IF UFD
	SKIPGE	T4,FNAM		;AND NOT ALPHA
	JRST	DLNAME		;NO--LIST AS ALPHA
	PUSHJ	P,LXWD		;LIST AS XWD
	JRST	DLEXT		;GO HANDLE EXTENSION
DLNAME:	MOVE	T2,FNAM		;GET NAME
	PUSHJ	P,LSIXN		;LIST IN SIXBIT
DLEXT:	MOVEI	C,"."		;LIST
	PUSHJ	P,LCHR		;PUNCTUATION
	HLLZ	T2,FEXT		;GET EXTENSION
	PUSHJ	P,LSIXN		;LIST IT
	MOVEI	P1,0		;CLEAR OFFSET POINTER
	PUSHJ	P,FLBDIR	;LIST DIRECTORY WITH []

	DEFINE	MSG(A),<
	MOVEI	M,[ASCIZ /
A: /]
	PUSHJ	P,LSTR
	>

	HRRZ	T4,FEXT		;GET ACCESS DATE
	ANDX	T4,RB.ACD	;MASK DOWN			[176]
	JUMPE	T4,DLCREA
	MSG	<Access date>
	PUSHJ	P,LDATE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

DLCREA:	MOVE	T4,FCRE		;GET CREATION
	ANDX	T4,RB.CRD!RB.CRT; TIME AND DATE		[162]
	ROT	T4,-<WID(RB.CRD)>  ;DATE AT HIGH END		[162]
	LDB	T3,[POINTR (FEXT,RB.CRX)]	; GET DATE EXTENSION	[162]
	LSHC	T3,WID(RB.CRD)	;GET DATE TOGETHER		[162]
	SKIPN	T3		;				[162]
	JUMPE	T4,DLPROT
	MSG	<Creation time, date>
	PUSH	P,T3		;SAVE DATE			[162]
	LSH	T4,-<WID(RB.CRD)>  ;POSITION TIME		[162]
	PUSHJ	P,LTIME
	PUSHJ	P,LSPC		;MAKE SOME ROOM
	POP	P,T4		;RESTORE DATE			[162]
	PUSHJ	P,LDATE
DLPROT:	SKIPN	T1,FPRV		;SEE IF FORCING			[316]
	LDB	T1,[POINTR (FCRE,RB.PRV)]	;		[162]
	JUMPL	T1,DLMODE	;SKIP IF NO PROTECTION		[316]
	MSG	<Access protection>
	PUSHJ	P,LOCT3Z
DLMODE:	MSG	<Mode>
	LDB	T1,[POINTR (FCRE,RB.MOD)]	;		[162]
	PUSHJ	P,LOCT
	MOVE	T1,FLEN		;GET FILE LENGTH
	SKIPE	RIBLEN		;SEE IF EXTENDED LOOKUP
	JRST	DLSIZE		;YES--GO LIST LENGTH
	HLRE	T1,T1		;NO--GET LEVEL-C STYLE
	SKIPLE	T1		;SEE IF IN BLOCKS
	ASH	T1,7		;YES--MAKE INTO WORDS
	MOVM	T1,T1		;GET NUMBER OF WORDS
DLSIZE:	JUMPE	T1,DLVERS
	MSG	<Words written>
	PUSHJ	P,LDECP

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

DLVERS:	SKIPN	T4,FVER		;GET VERSION
	JRST	DLVERR
	MSG	<Version>
	PUSHJ	P,LVER
DLVERR:	SKIPE	T4,FRVER	;SEE IF RIB VERSION DIFFERENT
	CAMN	T4,FVER		; FROM FILE VERSION
	JRST	DLCHEK		;NO--PROCEED
	MSG	<RIB version>
	PUSHJ	P,LVER		;OUTPUT RIB VERSION NUMBER
DLCHEK:	SKIPG	S.CHK		;SEE IF /CHECKSUM
	JRST	DLSPOL		;NO--SKIP ON
	MSG	<Computed checksum>
	PUSHJ	P,LCHECK

DLSPOL:	SKIPN	T2,FSPL		;GET SPOOLED FILE NAME
	JRST	DLESTL
	MSG	<Spooled name in ENTER>
	PUSHJ	P,LSIXN
DLESTL:	SKIPN	T1,FEST		;GET ESTIMATED LENGTH
	JRST	DLALLB
	MSG	<Estimated length>
	PUSHJ	P,LDECP
DLALLB:	SKIPN	T1,FALC		;GET ALLOCATED LENGTH
	JRST	DLALLP
	MSG	<Blocks allocated>
	PUSHJ	P,LDECP
DLALLP:	SKIPN	T1,FPOS		;GET POSITION ALLOCATED
	JRST	DLUFWR
	MSG	<Position of last allocation>
	PUSHJ	P,LDECP

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

DLUFWR:	SKIPN	T1,FUFW		;GET UNITS FILE WAS WRITTEN ON
	JRST	DLNCAR
	MSG	<Written on>
	LDB	T1,[POINTR (FUFW,RB.UNI)]	;GET UNITS
	JUMPE	T1,DLUFW3	;ARE THERE ANY?
	MOVEI	M,[ASCIZ /Unit(s) /]	;YES
	PUSHJ	P,LSTR
	LDB	T1,[POINTR (FUFW,RB.UNI)]	;MAKE SURE WE HAVE THE UNITS
	MOVEI	T2,0		;CLEAR ALL BITS
	MOVEI	T3,1		;SET UP FIRST BIT TO BE TESTED
	MOVSI	T4,400000
DLUFW1:	TDZE	T1,T3		;IS THIS BIT SET?
	TDO	T2,T4		;YES, RECORD IT
	LSH	T3,1		;LOOK AT NEXT BITS
	LSH	T4,-1
	JUMPN	T1,DLUFW1	;HAVE WE REVERSED ALL THE BITS?
	MOVE	P2,T2		;YES, NOW SAVE UNITS
	SETO	P4,		;CONTAINS UNIT NUMBER
DLUFW2:	JFFO	P2,.+1		;GET FIRST UNIT NUMBER
	ADDI	P4,1(P3)	;SAVE THE UNIT NUMBER
	MOVE	T1,P4		;SET UP FOR PRINTING
	PUSHJ	P,LOCT
	LSH	P2,1(P3)	;GET RID OF THE BIT
	JUMPE	P2,DLUFW3	;ARE WE DONE?
	PUSHJ	P,LCOMMA	;NO, PRINT COMMA-SPACE
	PUSHJ	P,LSPC
	JRST	DLUFW2		;GO GET THE NEXT UNIT NUMBER
DLUFW3:	LDB	T1,[POINTR (FUFW,RB.CON)]	;GET CONTROLLER
	MOVEI	M,[ASCIZ / on controller /]	;YES
	PUSHJ	P,LSTR
	LDB	T1,[POINTR (FUFW,RB.CON)]	;MAKE SURE WE HAVE IT
	PUSHJ	P,LOCT
DLUFW4:	LDB	T1,[POINTR (FUFW,RB.APR)]	;GET APR SERIAL NUMBER
	JUMPE	T1,DLNCAR	;ARE WE FINISHED?
	MOVEI	M,[ASCIZ / on CPU /]	;NO
	PUSHJ	P,LSTR
	LDB	T1,[POINTR (FUFW,RB.APR)]
	PUSHJ	P,LDEC
DLNCAR:	SKIPN	T1,FNCA		;GET CUST ARG
	JRST	DLMTAP
	MSG	<Nonprivileged customer arg>
	PUSHJ	P,LOCT

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

DLMTAP:	SKIPN	T2,FMTA		;GET DISK BACKUP TAPE
	JRST	DLSTAT
	MSG	<Backup tape>
	PUSHJ	P,LSIXN

DLSTAT:	MOVE	T1,FSTS		;GET STATUS BITS
	HLRZ	T2,FEXT		;SEE WHAT KIND OF FILE
	CAIE	T2,'UFD'	;IF KNOWN DIRECTORY,
	CAIN	T2,'SFD'	; ..
	TXC	T1,<RP.LOG!RP.DIR!RP.ABC>  ;CORRECT STANDARD SETTINGS
	JUMPE	T1,DLERRB
	MOVE	T1,FSTS		;GET BACK STATUS
	MSG	<Status bits>
	PUSHJ	P,LOCT
DLERRB:	MOVE	T1,FELB		;GET ERROR BLOCK
	IOR	T1,FEUN		;INCLUDE ERROR UNIT AND COUNT
	JUMPE	T1,DLQUTF
	MSG	<Error logical block>
	MOVE	T1,FELB		;[410] GET ERROR BLOCK
	TSZ	T1,[770000]	;[410] IGNORE VERSION AND ERROR BITS
	PUSHJ	P,LDECP		;[410] PRINT ERROR BLOCK
	MSG	<Monitor Version>	;[410]
	HLRZ	T1,FELB		;[410] GET VERSION, ERROR BITS

	LSH	T1,^D-15	;[410] GET VERSION ALONE
	PUSHJ	P,LOCT		;[410] PRINT MONITOR VERSION
	MSG	<Error Bits>	;[410]
	HLRZ	T1,FELB		;[410]
	LSH	T1,^D-12	;[410] GET ERROR BITS
	TRZ	T1,70		;[410]
	PUSHJ	P,LOCT		;[410] PRINT ERROR BITS
	MSG	<Error unit>
	HLRZ	T1,FEUN		;GET ERROR UNIT
	PUSHJ	P,LDECP
	MSG	<Number of bad blocks>
	HRRZ	T1,FEUN		;GET ERROR LENGTH IN BLOCKS
	PUSHJ	P,LDECP

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

DLQUTF:	MOVE	T1,FQTF		;GET QUOTAS
	IOR	T1,FQTO
	IOR	T1,FQTR
	IOR	T1,FUSD		;AND BLOCKS USED
	HLRZ	T2,FEXT		;AND EXTENSION
	CAIE	T2,'UFD'	;IF NOT UFD
	JUMPE	T1,DLAUTH	;AND ZERO, SKIP ON
	MSG	<Logged in quota>
	MOVE	T1,FQTF		;GET FCFS QUOTA
	PUSHJ	P,LDECP
	MSG	<Logged out quota>
	MOVE	T1,FQTO		;GET LOGGED OUT QUOTA
	PUSHJ	P,LDECP
	SKIPN	T1,FQTR		;GET RESERVED BLOCKS
	JRST	DLUSED
	MSG	<Reserved quota>
	PUSHJ	P,LDECP
DLUSED:	MSG	<Blocks used>
	MOVE	T1,FUSD
	PUSHJ	P,LDECP

DLAUTH:	HLRZ	T1,FEXT		;SEE IF
	CAIE	T1,'UFD'	; DIRECTORY
	JRST	DLAUTF		;NO--PROCEED
	MOVE	T1,FNAM		;YES--AUTHOR IS NORMALLY UFD NAME
	JRST	DLAUTC		;SO GO DO IT
DLAUTF:	SKIPN	T1,UFDPPN	;GET OWNER OF FILE
	MOVE	T1,.MYPPN##	;IF NONE, USE SELF
	TLNN	T1,-1		;SEE IF SFD POINTER
	MOVE	T1,.PTPPN(T1)	;YES--GET UFD
DLAUTC:	SKIPE	T4,FAUT		;GET AUTHOR
	CAMN	T4,T1		;SEE IF SAME AS OWNER
	JRST	DLNXTS		;YES--PROCEED BELOW
	MSG	<Author>
	JUMPL	T4,DLAUAL	;IF ALPHA, GO BELOW
	PUSHJ	P,LXWD
	JRST	DLNXTS
DLAUAL:	MOVE	T2,T4
	PUSHJ	P,LSIXN

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

DLNXTS:	SKIPN	T2,FNXT		;GET NEXT STR
	JRST	DLPRVS
	MSG	<Next structure>
	PUSHJ	P,LSIXN
DLPRVS:	SKIPN	T2,FPRD		;GET PREVIOUS STR
	JRST	DLPCAR
	MSG	<Previous structure>
	PUSHJ	P,LSIXN
DLPCAR:	SKIPN	T1,FPCA		;GET PRIV CUST ARG
	JRST	DLUFDB
	MSG	<Privileged customer arg>
	PUSHJ	P,LOCT
DLUFDB:	SKIPN	T1,FUFD		;GET DIRECTORY POINTER
	JRST	DLFLR
	MSG	<Data block in directory>
	PUSHJ	P,LDECP

DLFLR:	SKIPN	T1,FFLR		;GET RELATIVE BLOCK IN FILE
	JRST	DLXRA		;NONE--SKIP ON
	MSG	<Relative block in file>
	PUSHJ	P,LDECP
DLXRA:	SKIPN	T1,FXRA		;GET POINTER TO NEXT RIB
	JRST	DLTIM		;NONE--DO REST
	MSG	<Pointer to next RIB>
	PUSHJ	P,LOCT		;LIST IN OCTAL
DLTIM:	SKIPN	T1,FTIM		;GET INTERNAL CREATION TIME
	JRST	DLRBLK		;NONE--PROCEED			[200]
	MSG	<Internal creation date,time>
	PUSHJ	P,.CNTDT##	;CONVERT TO EASY FORMAT
	PUSHJ	P,LDATIM	;LIST DATE/TIME

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

DLRBLK:	SKIPN	T1,FRIBLK	;SEE IF BLOCK NUMBER KNOWN	[200]
	JRST	DLLADT		;NO--PROCEED			[200]
	MSG	<RIB block number>
	PUSHJ	P,LDECP		;YES--PRINT IN DECIMAL		[200]
DLLADT:	SKIPN	T1,FLAD		;GET LAST ACCOUNTING DATE/TIME
	JRST	DLDEDT		;THERE IS NONE
	MSG	<Last accounting date,time>
	PUSHJ	P,.CNTDT##	;CONVERT TO EASY FORMAT
	PUSHJ	P,LDATIM	;LIST IT
DLDEDT:	SKIPN	T1,FDED		;GET THE DIRECTORY EXPIRATION DATE
	JRST	DLACCT		;THERE IS NONE
	MSG	<Directory expiration date,time>
	CAMN	T1,[.INFIN]	;+ INFINITY?
	JRST	[MOVEI	M,[ASCIZ\ Eternity\]  ;LABEL EXCEPTIONAL DATE/TIME
		PUSHJ	P,LSTR		;LIST MNEMONIC (SORTA) STRING
		JRST	DLACCT]		;AND BLUNDER EVER ONWARD
	PUSHJ	P,.CNTDT##	;CONVERT TO EASY FORMAT
	PUSHJ	P,LDATIM	;LIST IT
DLACCT:	SKIPN	T1,FACT		;IS THERE AN ACCOUNT STRING?
	JRST	DLXTRA		;NO
	MSG	<Account>
	MOVEI	M,FACT
	PUSHJ	P,LSTR

;HERE WHEN ALL DONE, PRINT IN OCTAL ANY MORE THAT EXIST

DLXTRA:	MOVEI	P1,.RBXTR	;POINT TO FIRST UNDEFINED AREA
	HRLI	P1,.RBXTR-LN$RIB;AND COUNT OF ARGS
DLXTRL:	SKIPN	LBLOCK(P1)	;GET NEXT WORD
	JRST	DLXTRC
	MOVEI	M,[ASCIZ /
Unknown arg #/]
	PUSHJ	P,LSTR
	MOVEI	T1,(P1)		;GET POSITION
	PUSHJ	P,LOCT
	MOVEI	M,[ASCIZ /: /]
	PUSHJ	P,LSTR
	MOVE	T1,LBLOCK(P1)
	PUSHJ	P,LOCT
DLXTRC:	AOBJN	P1,DLXTRL	;LOOP UNTIL DONE

	PUSHJ	P,LCRLF		;END LINE
	TLZ	F,L.CRLF	;[412] KLEAR KROCK FLAG
	PJRST	LCRLF		;ISSUE BLANK LINE AND RETURN
IFN FT$MTA,<	;MAGTAPES

;BLKOVR -- READ BLOCK OF OVERHEAD WORDS
;CALL:	T1/ AOBJN TO READ
;	PUSHJ	P,BLKOVR
;	RETURN +1 AT END OF RECORD
;	RETURN +2 IF READ OK
;COUNTS WORDS IN T2
;USES T1-4

BLKOVR:	SKIPL	T3,T1		;PUT COUNT IN SAFE PLACE
	JRST	.POPJ1##	;GOOD RETURN IF NONE TO TRANSFER
BLKO.1:	PUSHJ	P,NEXOVR	;GET NEXT WORD
	  POPJ	P,		;RETURN IF EOF
	MOVEM	T1,(T3)		;STORE AWAY
	AOBJN	T3,BLKO.1	;LOOP
	JRST	.POPJ1##	;GOOD RETURN


;NEXDCW -- READ REST OF BLOCK COMPUTING CHECKSUM
;NEXDTW -- READ ONE WORD COMPUTING CHECKSUM
;NEXOVW -- DITTO, BUT DON'T INCLUDE IN CHECKSUM
;NEXOVR -- DITTO, BUT STOP AT END OF RECORD
;CALL:	PUSHJ	P,NEXDTW/NEXOVW/NEXOVR
;RETURN CPOPJ IF END OF FILE
;SKIP RETURN WITH DATUM IN T1
; NEXOVR COUNTS WORDS IN T2
;USES M, C

NEXOVR:	SKIPN	BFHD+.BFCTR	;SEE IF SOMETHING HERE		[230]
	POPJ	P,		;NO--RETURN			[230]
	PUSHJ	P,NEXOVW	;YES--GET IT			[230]
	  POPJ	P,		;EOF!				[230]
	AOS	T2		;COUNT WORD			[230]
	JRST	.POPJ1##	;OK RETURN			[230]
>;END IFN FT$MTA

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

NEXOVW:	TRO	F,R.MTOH	;INDICATE OVERHEAD WORD		[222]
NEXDTW:	TLNE	F,L.FKEF	;SEE IF FAKE EOF SET
	POPJ	P,		;YES--GIVE IT AGAIN
	TLZE	F,L.SVDW	;SEE IF SAVED WORD
	JRST	[MOVE	T1,MTSVWD
		 JRST	NEXDT3]
IFN FT$MTR,<	;OLD BACKUP/RESTORE
	TLNE	F,L.BKSS	;SEE IF OLD BACKUP/RESTORE SAVE SET
	JRST	NEXDT1		;YES--GO HANDLE IT
>;END IFN FT$MTR
	SKIPN	BFHD+.BFCTR	;NO--SEE IF READY TO READ NEXT RECORD  [166]
	TLNN	F,L.SVST!L.FRSS	;AND IN SAVE SET MODE
	JRST	NEXDT2		;NO--JUST PROCEED
IFN FT$MTB,<	;BACKUP/FRS
	TLNE	F,L.FRSS	;SEE IF BACKUP/FRS
	JRST	NEXDF1		;YES--GO HANDLE
>;END IFN FT$MTB
IFN FT$MTF,<	;FAILSAFE
	PUSHJ	P,NEXDT		;FAILSAFE--READ THE NEXT WORD	[166]
	  POPJ	P,		;EOF--ALL DONE
	TLNN	T1,-1		;SEE IF MORE DATA
	JRST	NEXDT2		;YES--GO READ DATA WORD
	MOVEM	T1,MTSVHD	;NO--SAVE HEADER
	TLO	F,L.FKEF	;AND SET FAKE EOF
	POPJ	P,		;RETURN EOF
>;END IFN FT$MTF

;HERE FOR BACKUP/FRS SAVE SETS

IFN FT$MTB,<	;BACKUP/FRS
NEXDF1:	SKIPGE	B$GFLG		;SEE IF END OF FILE
		..==GF$EOF	;(FOR CREF)			[302]
	TLOA	F,L.FKEF	;YES--SET EOF
	PUSHJ	P,NEXDT		;NO--GET START OF RECORD
	  POPJ	P,		;RETURN IF EOF
	PUSHJ	P,FRSLAH	;HANDLE BACKUP/FRS LOOK-AHEAD
	MOVEM	T1,MTSVWD	;SAVE WORD JUST IN CASE
	TLNE	T1,777770	;MAKE SURE FRS OR BACKUP
	JRST	NEXDF9		;NO--SET ERROR
	TLNE	T1,-1		;SEE IF FRS
	TLO	T1,-1		;YES--SET WHOLE HALF
	XOR	T1,B$GTYP	;COMPARE WITH PREVIOUS
	JUMPL	T1,NEXDF9	;IF DIFFERENT, ERROR
>;END IFN FT$MTB

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTB,<	;BACKUP/FRS

	MOVE	T1,MTSVWD	;RESTORE WORD
IFN FT$MTS,<	;FRS
	TLNE	T1,-1		;IF FRS,
	JRST	NEXDF2		;JUMP BELOW IF FRS		[302]
>;END IFN FT$MTS
	CAIE	T1,T$FIL	;MAKE SURE FILE			[302]
	JRST	NEXDV		;[412] NO--CHECK FOR END OF VOLUME
NEXDFG:	PUSHJ	P,NEXDT		;GET RECORD NUMBER
	  POPJ	P,		;EOF!
	MOVEM	T1,B$GBNM	;STORE RECORD NUMBER		[301]
	PUSHJ	P,NEXDT		;GET TAPE NUMBER
	  POPJ	P,		;EOF!
	CAME	T1,B$GRTN	;MUST BE THE SAME
	JRST	NEXDF9		;NO--ERROR
	PUSHJ	P,NEXDT		;GET FLAGS
	  POPJ	P,		;EOF!
	MOVEM	T1,B$GFLG	;STORE
	PUSHJ	P,NEXDT		;GET CHECKSUM			[302]
	  POPJ	P,		;EOF!
	MOVEM	T1,B$GCHK	;STORE
	PUSHJ	P,NEXDT		;GET SIZE
	  POPJ	P,		;EOF!
	JUMPL	T1,NEXDF9	;ERROR IF NEGATIVE
	CAILE	T1,^D512	;SEE IF TOO BIG
	JRST	NEXDF9		;YES--ERROR
	MOVEM	T1,B$GSIZ	;STORE
	PUSHJ	P,NEXDT		;GET SKIP REGION
	  POPJ	P,		;EOF!
	JUMPL	T1,NEXDF9	;ERROR IF NEGATIVE
	MOVEM	T1,B$GLND	;STORE
	ADDI	T1,31		;COUNT OF REST OF HEADER
	JRST	NEXDF5		;GO SKIP HEADER AND JUNK
>;END IFN FT$MTB
IFN FT$MTS,<	;FRS

;HERE IF FRS--READ BLOCK HEADER
NEXDF2:	HRLZM	T1,B$GFLG	;UPDATE FLAGS			[302]
	HLRZS	T1		;GET TYPE			[302]
	CAIE	T1,4		;SEE IF FILE			[302]
	JRST	NEXDF9		;NO--ERROR			[302]
	PUSH	P,[5]		;SAVE COUNT TO SKIP FORWARD	[301]
NEXDF3:	PUSHJ	P,NEXDT		;GET HEADER
	  JRST	[POP  P,(P)	;CLEAN UP STACK
		 POPJ P,]	;RETURN EOF
	SOSLE	(P)		;COUNT DOWN
	JRST	NEXDF3		;REPEAT
	POP	P,(P)		;CLEAN UP STACK
	PUSHJ	P,NEXDT		;GET STARTING BLOCK		[302]
	  POPJ	P,		;EOF!				[302]
	MOVEM	T1,B$FRBN	;SAVE				[302]
	LSH	T1,7		;CONVERT TO WORDS		[302]
	MOVEM	T1,B$FRDW	;SAVE				[302]
	PUSHJ	P,NEXDT		;GET WORD TO SKIP		[302]
	  POPJ	P,		;EOF!				[302]
	PUSHJ	P,NEXDT		;GET DATA BLOCK IN RECORD
	  POPJ	P,		;EOF!
	SKIPL	T1		;CHECK FOR
	CAILE	T1,20		; REASONABLENESS
	JRST	NEXDF9		;NO--JUNK
	MOVEM	T1,B$FNDB	;SAVE
	PUSHJ	P,NEXDT		;GET WORDS IN LAST BLOCK
	  POPJ	P,		;EOF!
	SKIPL	T1		;CHECK FOR
	CAILE	T1,200		; REASONABLENESS
	JRST	NEXDF9		;NO--JUNK
	MOVEM	T1,B$FNDW	;SAVE
	SKIPN	T1,B$FNDB	;GET NUMBER OF BLOCKS
	SKIPGE	B$GFLG		;UNLESS EOF			[305]
	SKIPA			;YES				[305]
	MOVEI	T1,5		;(BUG IN OLD VERSION OF FRS)
	IMULI	T1,200		;CONVERT TO WORDS
	ADD	T1,B$FNDW	;GET NUMBER OF WORDS IN LAST
	CAIL	T1,200		;ALLOW FOR NO DATA		[300]
	SUBI	T1,200		;ALLOW FOR DOUBLE COUNT
	MOVEM	T1,B$GSIZ	;SAVE AS DATA SIZE		[302]
	MOVEI	T1,12		;INDICATE REST OF HEADER
>;END IFN FT$MTS

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

IFN FT$MTB,<	;BACKUP/FRS
;HERE TO SKIP REST OF FRS/BACKUP BLOCK HEADER
NEXDF5:	PUSH	P,T1		;SAVE DISTANCE
NEXDF6:	PUSHJ	P,NEXDT		;GET MORE HEADER
	   JRST	[POP  P,(P)	;CLEAN UP STACK
		 POPJ P,]	;RETURN EOF
	SOSLE	(P)		;COUNT DOWN
	JRST	NEXDF6		;LOOP OVER HEADER
	POP	P,(P)		;RESTORE STACK
	MOVE	T1,B$GSIZ	;GET LENGTH OF DATA AREA	[302]
	MOVEM	T1,BFHD+.BFCTR	;STORE AS REAL STUFF TO READ
	JRST	NEXDTW		;GO GET SOME DATA		[300]

NEXDF9:	TLO	F,L.FKEF!L.SVDW	;INDICATE ERROR
	POPJ	P,		;RETURN
>;END IFN FT$MTB
;[412] HERE TO CHECK AND MOUNT NEXT VOLUME IF DESIRED

IFN	FT$MTB,<		;[412] BACKUP ONLY

NEXDV:	SKIPLE	S.MVOL		;[412] ONLY IF /MVOLUME
	CAIE	T1,T$EOV	;[412] IS THIS BACKUP END OF VOLUME?
	JRST	NEXDF9		;[412] NO - JUST END OF FILE
	SETZM	BFHD+.BFCTR	;[412] READ NEXT RECORD
	PUSHJ	P,NEXDT		;[412] . . .
	CAIA			;[412] TAPE MARK EXPECTED
	JRST	NEXDV8		;[412] AND DATA ISN'T
	TLO	F,L.BPOP	;[412] ASK MTFEOV TO "POPJ"
	PUSHJ	P,MTFEO0	;[412] ASK FOR NEXT TAPE
	 JRST	NEXDV9		;[412] USER SAID "EXIT"
NEXDV2:	SETZM	BFHD+.BFCTR	;[412] MAKE SURE NO DATA
	PUSHJ	P,NEXDT		;[412] FIRST WORD NEW TAPE
	 JRST	NEXDV9		;[412] NO FIRST WORD
	CAIE	T1,T$CSS	;[412] BACKUP CONTINUE SAVE SET?
	 JRST	NEXDV8		;[412] NO, FORGET IT
	TLO	F,L.BPOP	;[412] ASK MTFCSS TO POPJ
	PUSHJ	P,MTFRSP	;[412] LIST SAVE SET HEADER
	 JRST	[TLO	F,L.BPOP;[412] ASK MTFEOV TO POPJ
		PUSHJ	P,MTFEO1;[412] WRONG TAPE, ASK AGAIN
		JRST	NEXDV9	;[412] USER SAID "EXIT"
		JRST	NEXDV2]	;[412] TRY AGAIN
	PUSHJ	P,NEXDT		;[412] FIRST WORD NEXT RECORD
	JRST	NEXDV9		;[412] EOF
	CAIE	T1,T$DIR	;[412] DIRECTORY RECORD?
	JRST	[CAIE	T1,T$FIL;[412] NO, FILE RECORD?
		JRST	NEXDV4	;[412] YES
		JRST	NEXDV8]	;[412] NO, GARBAGE FORMAT
	SETZM	BFHD+.BFCTR	;[412] EAT DIRECTORY RECORD
	PUSHJ	P,NEXDT		;[412] THIRD RECORD
	JRST	NEXDV9		;[412] EOF
	CAIE	T1,T$FIL	;[412] NOW, THIS SHOULD BE FILE RECORD
	JRST	NEXDV8		;[412] IT'S NOT, BUMMER
NEXDV4:	MOVEM	T1,B$GTYP	;[412] MAKE SURE B$GTYP CORRECT
	JRST	NEXDFG		;[412] CONTINUE WITH FILE DATA


;ERRORS

NEXDV8:	MOVEM	T1,MTSVWD	;[412] RE-READ THIS WORD
	TLO	F,L.SVDW	;[412] ON NEXT CALL TO NEXD??
NEXDV9:	TLO	F,L.FKEF	;[412] FORCE EOF
	POPJ	P,		;[412] AND TAKE EOF RETURN
> ;END IFN FT$MTB
IFN FT$MTR,<	;OLD BACKUP/RESTORE

;HERE FOR OLD BACKUP/RESTORE SAVE SETS

NEXDT1:	SOSLE	MTSVCT		;DECREMENT COUNT
	JRST	NEXDT2		;STILL IN THIS HEADER
	PUSHJ	P,NEXDT		;GET NEXT HEADER		[166]
	  POPJ	P,		;RETURN IF EOF
	MOVEM	T1,MTSVWD	;SAVE WORD IN CASE
	TRZ	T1,777000	;CLEAR BACK POINTER
	HRRZM	T1,MTSVCT	;SET COUNT
	HLRZS	T1		;GET CONTROL HEADER
	CAIE	T1,400000	;IS IT DATA?
	JRST	[TLO F,L.FKEF!L.SVDW  ;SET FLAGS
		 JRST NEXDT8]	;GIVE EOF RETURN
	PUSHJ	P,NEXDT		;THROW AWAY CHECKSUM		[166]
	  POPJ	P,		;EOF
	JRST	NEXDT2		;GO DO NORMAL READ NOW
>;END IFN FT$MTR

NEXDT2:	PUSHJ	P,NEXDT		;READ FILE			[166]
	  JRST	NEXDT8		;RETURN IF EOF
NEXDT3:	SKIPLE	S.CHK		;[405] IS CHECKSUMMING REQUESTED?
	TRZE	F,R.MTOH	;SEE IF MAG TAPE OVERHEAD	[222]
	JRST	.POPJ1##	;DON'T CHECKSUM IT	[222]
NEXDT4:	EXCH	T1,CHKSUM	;GET CHECKSUM SO FAR
	ROT	T1,1		;ROTATE
	ADD	T1,CHKSUM	;ADD THIS WORD
	EXCH	T1,CHKSUM	;STORE AWAY
	EXCH	T1,SCHKSM	;GET CHECKSUM SO FAR
	ROT	T1,1		;ROTATE
	ADD	T1,SCHKSM	;ADD THIS WORD
	EXCH	T1,SCHKSM	;STORE AWAY
	EXCH	T1,TCHKSM	;GET CHECKSUM SO FAR
	ROT	T1,1		;ROTATE
	ADD	T1,TCHKSM	;ADD THIS WORD
	EXCH	T1,TCHKSM	;STORE AWAY
	JRST	.POPJ1##	;AND SKIP RETURN

NEXDT8:	SETZM	MTSVCT		;CLEAR COUNTER
	POPJ	P,		;RETURN
;[412] THIS ENTIRE ROUTINE
;
;NEXDCW  --  READ CHECKSUMMED WORD/BLOCK
;CALL AS NEXDTW
;
;THIS ROUTINE READS THE REST OF THE BLOCK OF DATA, CHECKSUMMING
;AS IT GOES. THIS ROUTINE CUTS THE CHECKSUMMING OVERHEAD FROM 27
;INSTRUCTIONS/WORD TO 14/WORD, (TO 6/WORD IF /FNDBLD/NODIRECT)
;PLUS IN UUO AND (IF APPLICABLE) ANY MAGTAPE RECORD PROCESSING, ETC.
;
;USES T1, T2.

NEXDCW:	IFN	FT$MTR,<TLNN F,L.BKSS>  ;NEXDTW IF OLD BACKUP/RESTORE
	SKIPG	T2,BFHD+.BFCTR	;ANY WORDS LEFT IN BUFFER?
	JRST	NEXDTW		;NO, DO IN, MAGTAPE RECORD HANDLING
	SKIPN	S.DIRE		;/NODIRECT?
	JRST	NEXDC6		;YES, THEN ONLY NEED 7 INSTR/WORD
	JRST	NEXDC3		;NO, NEED ALL THREE RUNNING CHECKSUMS

;HERE TO MAINTAIN ALL THREE RUNNING CHECKSUMS (E.G. NOT /FNDBLD/NODIRECT)

NEXDC2:	ILDB	T1,BFHD+.BFPTR	;GET NEXT WORD TO BE CHECKSUMMED
	EXCH	T1,CHKSUM	;GET CHECKSUM SO FAR
	ROT	T1,1		;ROTATE
	ADD	T1,CHKSUM	;ADD THIS WORD
	EXCH	T1,CHKSUM	;STORE AWAY
	EXCH	T1,SCHKSM	;GET CHECKSUM SO FAR
	ROT	T1,1		;ROTATE
	ADD	T1,SCHKSM	;ADD THIS WORD
	EXCH	T1,SCHKSM	;STORE AWAY
	EXCH	T1,TCHKSM	;GET CHECKSUM SO FAR
	ROT	T1,1		;ROTATE
	ADD	T1,TCHKSM	;ADD THIS WORD
	EXCH	T1,TCHKSM	;STORE AWAY
NEXDC3:	SOJGE	T2,NEXDC2	;LOOP FOR REST OF BLOCK
	SETZM	BFHD+.BFCTR	;THIS BUFFER NOW EXHAUSTED
	PJRST	NEXDTW		;START UP A NEW BUFFER

;HERE ON /CHECKSUM/NODIRECT (E.G., /FNDBLD/NODIRECT), GO EVEN FASTER

NEXDC5:	ILDB	T1,BFHD+.BFPTR	;GET NEXT WORD TO BE CHECKSUMMED
	EXCH	T1,CHKSUM	;GET CHECKSUM SO FAR
	ROT	T1,1		;ROTATE
	ADD	T1,CHKSUM	;ADD THIS WORD
	EXCH	T1,CHKSUM	;STORE AWAY
NEXDC6:	SOJGE	T2,NEXDC5	;LOOP FOR REST OF BUFFER
	SETZM	BFHD+.BFCTR	;THIS BUFFER NOW EXHAUSTED
	PJRST	NEXDTW		;START UP A NEW BUFFER
IFN FT$MTB,<	;BACKUP/FRS

;FRSLAH -- ROUTINE TO HANDLE FRS/BACKUP LOOK-AHEAD TO CORRECT ERRORS
;CALL:	1/ FIRST WORD OF A RECORD
;	PUSHJ	P,FRSLAH
;	RETURNS 1/FIRST WORD OF FIRST GOOD RECORD
;USES NO AC'S

FRSLAH:	PUSH	P,T1		;SAVE T1
	MOVE	T1,@BFHD+.BFADR	;GET POINTER TO NEXT BUFFER
	SKIPL	.BFHDR-1(T1)	;MAKE SURE IT IS FULL
	JRST	FRSLHG		;NO--ASSUME ALL OK
	SKIPL	B$GTYP		;IS IT FRS OR BACKUP
	SKIPA	T1,.BFCNT+G$FLAG(T1) ;BACKUP--GET FLAGS		[302]
	HRLZ	T1,.BFCNT(T1)	;FRS--GET FLAGS
	TXNN	T1,GF$RPT	;IS IT A REPEAT			[302]
	JRST	FRSLHG		;NO--OK TO RETURN
	POP	P,(P)		;DISCARD OLD RECORD
	SETZM	BFHD+.BFCTR	; ..
	PUSHJ	P,NEXDT		;GET NEXT
	  TLO	F,L.FKEF	;EOF!
	JRST	FRSLAH		;AND TRY AGAIN

FRSLHG:	POP	P,T1		;RESTORE FIRST WORD
	POPJ	P,		;RETURN
>;END IFN FT$MTB
;NEXDT -- ROUTINE TO READ ONE WORD FROM THE BUFFER
;NON-SKIP RETURN IF EOF
;SKIP RETURN WITH WORD IN T1

NEXDT:	SOSGE	BFHD+.BFCTR	;SEE IF ANY LEFT
	JRST	NEXDTR		;NO--GO DO A READ
	ILDB	T1,BFHD+.BFPTR	;YES--GET IT
	JRST	.POPJ1##	;SKIP RETURN

NEXDTR:	AOSN	MTAEOF		;[441] START OF A NEW FILE ??
	PUSHJ	P,MTLBIN	;[441] YES, GET LABEL PARMS
	IN	DC,		;READ NEXT BLOCK
	  JRST	NEXDT		;GO ANALYZE

;ERROR OR END OF FILE, CHECK IT OUT

	PUSHJ	P,.PSH4T##	;SAVE ALL TEMPS
	GETSTS	DC,T1		;GET CURRENT I/O STATUS
	TXNE	T1,IO.EOF	;END OF FILE?
	JRST	NEXDTF		;YES, TAKE EOF RETURN
	PUSH	P,T1		;SAVE ERROR STATUS
	N$WRNX	(IDE,<Error reading>)

IFN FT$MTA,<	;MAGTAPE
	SKIPE	T1,MTNAME	;SEE IF MAG-TAPE NAME
	PUSHJ	P,[PUSHJ P,.TSIXN##	;YES--TYPE IT
		MOVEI	T1,[ASCIZ /: file /]
		PJRST	.TSTRG##]	;MORE MESSAGE
>;END IFN FT$MTA

	MOVEI	T1,FOBLK+.FOIOS	;POINT TO OPEN BLOCK
	MOVEI	T2,LBLOCK	;POINT TO LOOKUP BLOCK
	PUSHJ	P,.TOLEB##	;ISSUE FILE SPEC
	MOVEI	T1,[ASCIZ\; \]	;A NICE SEPARATOR
	PUSHJ	P,.TSTRG##	;SEPARATE FILE FROM I/O STATUS
	MOVE	T1,0(P)		;RETRIEVE A COPY OF THE I/O STATUS
	HRLI	T1,DC		;AND ITS CHANNEL
	PUSHJ	P,IOERM		;TYPE ERROR STATUS
	AOSN	T1		;T1 SAY TO ABORT?
	SETOM	ABORTI		;YES, ABORT INPUT
X$$IDE:	PUSHJ	P,.TCRLF##	;END LINE
	POP	P,T1		;RETRIEVE I/O/ERROR STATUS
	TRZ	T1,IO.ERR	;CLEAR OUT ERROR BITS
	SETSTS	DC,(T1)		;SET CLEARED STATUS
	PUSHJ	P,.POP4T##	;RESTORE TEMPS
	SKIPL	ABORTI		;ANYTHING REALLY WRONG?
	JRST	NEXDT		;NO, JUST READ WHAT WAS RETURNED TO US
	POPJ	P,		;YES, ABORT I/O HERE

;HERE ON EOF

NEXDTF:	PUSHJ	P,.POP4T##	;RESTORE THE T'S
	SETOM	MTAEOF		;[441] INDICATE NEW FILE
	POPJ	P,		;AND TAKE EOF RETURN
;IOERM  --  ISSUE GENERAL I/O CHANNEL/STATUS ERROR MESSAGE
;CALL IS:
;
;	MOVE	T1,<STS>
;	PUSHJ	P,IOERM
;	RETURN
;
;WHERE <STS> IS THE OFFENDING I/O STATUS.
;
;ON RETURN I/O CHANNEL IS UNAFFECTED, AND T1 HAS -1 IF NO FURTHER
;I/O SHOULD BE ATTEMPTED (PULSAR/AD NAUSEUM HAS STOMPED ON THE I/O).

IOERM:	PUSHJ	P,.SAVE1##	;WANT A PRESERVED AC HERE
	MOVE	P1,T1		;HANG ON TO STATUS
	MOVEI	T1,[ASCIZ\I/O status = \]
	PUSHJ	P,.TSTRG##	;PREFIX STATUS MESSAGE
	HRRZ	T1,P1		;RETRIEVE STATUS AGAIN
	PUSHJ	P,.TOCTW##	;LIST OCTAL I/O STATUS
	MOVE	T1,P1		;RETRIEVE STATUS YET AGAIN
	TXCN	T1,IO.ERR	;ANY ERROR BITS SET?
	JRST	IOERM9		;NO?
	TXCN	T1,IO.ERR	;EXTENDED ERROR STATUS?
	JRST	IOERX		;YES, LIST I/O REASON
	MOVEI	T1,[ASCIZ\ (\]	;START EXPLANATORY TEXT
	PUSHJ	P,.TSTRG##	; . . .
	MOVEI	T1,[ASCIZ\Improper mode\]  ;WRITE-LOCK, ETC.
	TXZE	P1,IO.IMP	;"IMPROPER MODE" ERROR?
	PUSHJ	P,IOERM5	;YES, LIST EXPLANATION
	MOVEI	T1,[ASCIZ\Hard device error\]  ;DEVICE (NOT DATA)
	TXZE	P1,IO.DER	;DEVICE AT FAULT (POWER, ETC.)?
	PUSHJ	P,IOERM5	;YES, LIST EXPLANATION
	MOVEI	T1,[ASCIZ\Hard data error\]  ;DATA PARITY ERROR
	TXZE	P1,IO.DTE	;DATA INCORRECT?
	PUSHJ	P,IOERM5	;YES, LIST EXPLANATION
	MOVEI	T1,[ASCIZ\Block too large\]  ;DATA RECORD TOO BIG
	TXZE	P1,IO.BKT	;DATA RECORD BIGGER THAN BUFFER?
	PUSHJ	P,IOERM5	;YES, LIST EXPLANATION
	MOVEI	T1,")"		;END OF EXPLANATORY TEXT
	PJRST	.TCHAR##	;CAP OFF ERROR STATUS TEXT

;SUBSIDIARY OF IOERM, FOR TYPING MESSAGE, OPTIONAL SEPARATING COMMA

IOERM5:	PUSHJ	P,.TSTRG##	;TYPE OUT ASCII TEXT
	MOVEI	T1,[ASCIZ\, \]	;PRETTY ITEM SEPERATOR
	TXNE	P1,IO.ERR	;MORE EXPLANATIONS COMING UP?
	PJRST	.TSTRG##	;YES
	POPJ	P,		;NO

;HERE WHEN NO APPARENT REASON

IOERM9:	MOVEI	T1,[ASCIZ\ (no apparent error)\]
	PJRST	.TSTRG##	;CAP OFF OUR OUTPUT
;HERE TO LIST EXTENDED DEVICE I/O ERROR STATUS

IOERX:	HLRZ	T3,P1		;CHANNEL WITH ERROR
	MOVEI	T2,.DFRES	;READ I/O ERROR FUNCTION
	MOVE	T1,[2,,T2]	;DEVOP. ARG POINTER TO
	DEVOP.	T1,		;READ EXTENDED I/O ERROR STATUS
	 SETZ	T1,		;NONE?
	CAIL	T1,0		;MUST BE POSITIVE
	CAILE	T1,IOERXX	;AND KNOWN TO US
	 SETZ	T1,		;UNKNOWN ERROR STATUS
	PUSH	P,T1		;SAVE THE CODE FOR A BIT
	HRRZ	T1,IOERXT(T1)	;[447] GET EXPLANATORY TEXT
	PUSHJ	P,.TSTRG##	;AND GIVE IT TO USER
	POP	P,T1		;RESTORE THE EXTENDED ERROR CODE
	HLLE	T1,IOERXT(T1)	;[447] RETURN "FATALNESS" IN T1
	POPJ	P,		;RETURN TO CALLER

IOERXT:	00,,	[ASCIZ\ ((00) - Unknown error status)\]
	00,,	[ASCIZ\ (IOPLE% (01) - Page limit exceeded)\]
	00,,	[ASCIZ\ (IOVFE% (02) - VFU format error)\]
	-1,,	[ASCIZ\ (IOLTE% (03) - Label type error)\]
	-1,,	[ASCIZ\ (IOHLE% (04) - Header label error)\]
	-1,,	[ASCIZ\ (IOTLE% (05) - Trailer label error)\]
	-1,,	[ASCIZ\ (IOVLE% (06) - Volume label error)\]
	00,,	[ASCIZ\ (IODER% (07) - Hard device error)\]
	00,,	[ASCIZ\ (IOPAR% (10) - Data parity error)\]
	00,,	[ASCIZ\ (IOWLE% (11) - Device is write-locked)\]
	-1,,	[ASCIZ\ (IOIPO% (12) - Illegal positioning operation\]
	00,,	[ASCIZ\ (IOBOT% (13) - Begining of tape)\]
	-1,,	[ASCIZ\ (IOIOP% (14) - Illegal operation)\]
	-1,,	[ASCIZ\ (IOFNF% (15) - Labelled file not found)\]
	-1,,	[ASCIZ\ (IOCAN% (16) - Operator cancelled volume switch)\]
	-1,,	[ASCIZ\ (IOTMV% (17) - Too many volumes in volume set)\]
	00,,	[ASCIZ\ (IONND% (20) - Network communications broken)\]
	00,,	[ASCIZ\ (IOUNC% (21) - Undefined character interrupt)\]
	00,,	[ASCIZ\ (IORPE% (22) - RAM parity error)\]
	-1,,	[ASCIZ\ (IOLRA% (23) - Labeler request aborted by RESET)\]
	-1,,	[ASCIZ\ (IOVPF% (24) - Volume protection failure)\]
	-1,,	[ASCIZ\ (IOFPF% (25) - File protection failure)\]
	-1,,	[ASCIZ\ (IOUEF% (26) - Unexpired file)\]

	IOERXX==.-IOERXT	;LARGEST KNOWN TO US ERROR CODE
REPEAT	0,<

;CHKNXF -- CHECK FOR PREVIOUS SPEC. WAS NON-EXISTENT EVERY PLACE
;PRESERVES T1-4

CHKNXF:	CAMN	I,LASI		;SEE IF STILL SAME REQUEST
	POPJ	P,		;YES--DON'T WORRY YET
	MOVEM	I,LASI		;SAVE LAST REQUEST
	SKIPN	NXFCNT		;SEE IF ANY FILE FOUND
	SKIPN	NXFI		;NO--SEE IF ERROR FOUND
	JRST	CHKNXY		;NO--JUST CLEAN UP AND RETURN
	PUSH	P,T1		;PRESERVE T1-4
	PUSH	P,T2	
	PUSH	P,T3
	PUSH	P,T4
	EXCH	I,NXFI		;GET OLD I
	MOVEI	T1,H.ZERX-H.ZER1;POINT TO OLD COPY AREA
	MOVE	T2,.FXDEV(I)	;GET ORIGINAL DEVICE REQUESTED
	MOVEM	T2,FSTR(T1)	;SAVE AWAY FOR LATER
	HLLZS	FEXT(T1)	;CLEAR ERROR CODE
	SKIPN	NXUCNT		;SEE IF UFD FOUND
	JRST	[MOVEI T2,1	;NO--SET UFD NOT FOUND
		 SKIPE NXSCNT	;SEE IF SFD MISSING
		 MOVEI T2,23	;YES--SET THAT CODE
		 HRRM  T2,FEXT(T1)  ;AND STORE THE
		 JRST  .+1]	;  CODE AWAY
	PUSHJ	P,E.DFLS	;ISSUE ERROR
	MOVE	I,NXFI		;RESTORE I
	POP	P,T4		;RESTORE T1-4
	POP	P,T3
	POP	P,T2
	POP	P,T1

CHKNXY:	SETZM	NXFI		;CLEAR ERROR FLAG
	SETZM	NXFCNT		;CLEAR FOUND COUNT
	SETZM	NXSCNT		;CLEAR NX SFD COUNT
	POPJ	P,		;RETURN
;STILL IN REPEAT 0

;SUBROUTINE IF LOOKUP ERROR

;		BEFORE COUNTING THE ERROR.	LCR.	15-FEB-77.

E.DFLL:	PUSHJ	P,.CHKTA##		;[344] GO CHECK CONCATENATION REQUIREMENTS.
	JRST	[SOS	NXFCNT	;[344] WE DON'T NEED THIS FILE. DO NOT COUNT ERROR
		 POPJ	P,]	;[344] AND RETURN TO MAINLINE.

	HRRZ	T1,FEXT		;GET ERROR CODE
	CAIN	T1,ERPRT%	;SEE IF PROTECTION ERROR	[233]
	JRST	[MOVX  T2,FX.PRT;YES--SEE IF /OKPROT		[233]
		 TDNN  T2,.FXMOD(I) ; ..			[233]
		 JRST  .+1	;NO--PROCEED			[233]
		 MOVEI T1,LBLOCK;YES--USE			[233]
		 MOVEI T2,LN$RIB; E.LKEN			[233]
		 MOVEI T3,(I)	; TO GET WILD			[233]
		 PJRST E.LKEN##]; ERROR COUNTS			[233]
	CAIE	T1,ERSNF%	;SEE IF NX SFD
	CAIG	T1,ERIPP%	;NO--SEE IF NX FILE OR NX UFD
	SKIPG	.WLDFL##	;YES--SEE IF STR WILDCARDING
	JRST	E.DFLC		;NO--ISSUE MESSAGE NOW ANYWAY
	SKIPN	T1		;SEE IF UFD PRESENT
	AOS	NXUCNT		;NON-X FILE
	CAIN	T1,ERSNF%	;SEE IF SFD
	AOS	NXSCNT		;YES--COUNT IT
	MOVEM	I,NXFI		;YES--SAVE I AS FLAG FOR LATER
				;THIS IS NEEDED BECAUSE WE WISH TO
				; GIVE NX FILE MESSAGE ONLY IF IT DOES
				; NOT EXIST ON ANY STR IN THE LIST
	MOVE	T1,[H.ZER1,,H.ZERX]
	BLT	T1,H.ZERY-1	;COPY TO ALTERNATE AREA
	SKIPE	T1,UFDPPN	;SEE IF SFD TO COPY
	TLNE	T1,-1		;  ..
	POPJ	P,		;NO--RETURN
	HRLZ	T1,T1		;YES--COPY TO ALTERNATE
	HRRI	T1,H.ZERY	;  AREA
	BLT	T1,H.ZERY+2+.FXLND  ; ..
	POPJ	P,		;GO AROUND THE LOOP

E.DFLC:	MOVEI	T1,0		;POINT TO REGULAR AREA
	PUSHJ	P,E.DFLS	;ISSUE ERROR MESSAGE
	AOS	SNFILR		;COUNT LOOKUP ERROR
	AOS	NXFCNT		;COUNT FILE FOUND
	POPJ	P,		;AND GO AROUND LOOP
;STILL IN REPEAT 0

;E.DFLS -- SUBROUTINE TO PRINT ERROR IN FILE LINE
;T1 MUST BE SET TO 0 FOR REGULAR AREA
;USES T1, T2, T3, T4, M, C

E.DFLS:	PUSHJ	P,.SAVE1##	;SAVE P1
	MOVE	P1,T1		;SAVE POINTER THERE
	TRO	F,R.TYPE	;DUPLICATE TO TTY:		[173]
	PUSHJ	P,SSTRDR	;OUTPUT DIR AND DEV		[173]
	PUSHJ	P,.TNEWL	;FORCE BEGINNING OF LINE
	N$WRNX	(LKE,)
	HRRZ	T1,FEXT(P1)	;GET ERROR CODE			[173]
	MOVE	T3,FCRE(P1)	;GET LOOKUP ANSWER (PROT. CODE)	[173]
	PUSHJ	P,.LKERR##	;LIST ERROR CODE		[173]
	MOVEI	T1,[ASCIZ / file    /]
	PUSHJ	P,.TSTRG##	;OUTPUT HEADING			[173]
	PUSHJ	P,LSTFNX	;LIST FILE NAME
	MOVEI	C,"."		;SEPARATE WITH			[177]
	PUSHJ	P,LCHR		; A DOT				[177]
	HLLZ	T2,FEXT(P1)	;GET EXTENSION
	PUSHJ	P,LSIXT		;LIST IT
	MOVEI	T1,.CHTAB	;PICK UP TAB
	PUSHJ	P,.TTCHR	; AND TYPE IT
	SKIPN	S.WDTH		;SEE IF /WIDTH
	PUSHJ	P,LSTRDX	;LIST STR/DIR
X$$LKE:	TRZ	F,R.TYPE	;CLEAR FLAG			[244]
	PJRST	.TCRLF##	;END LINE			[244]

> ;END OF REPEAT 0
;LSTFNM -- LIST FILE NAME IN APPROPRIATE MODE
;USES T1, T2, T3, T4

LSTFNM:	PUSHJ	P,.SAVE1	;SAVE P1
	MOVEI	P1,0		;SET TO NO OFFSET
LSTFNX:	HLRZ	T1,FEXT(P1)	;LOOK AT EXTENSION
	CAIN	T1,'UFD'	;TO SEE IF IT IS A UFD
	SKIPGE	FNAM(P1)	;YES--SEE IF ALPHA
	JRST	.+2		;YES--USE SIXBIT ANYWAY
	JRST	FLUFD		;NO--SPECIAL PRINT
	MOVE	T2,FNAM(P1)	;OUTPUT FILE NAME
	PJRST	LSIX		;LIST IN SIXBIT			[177]

FLUFD:	HLRZ	T1,FNAM(P1)	;GET PROJECT
	SKIPLE	S.CMP		;[350] IF /COMPARE
	SETOM	S.FUFD		;[350] FORCE THE PRINTING OF THE UFD.
	PUSHJ	P,LOCT6B	;ISSUE RIGHT ADJUSTED
	SETZM	S.FUFD		;[350] RESET THE PRINTTING WHEN DONE
	MOVEI	C,","		;ISSUE COMMA
	PUSHJ	P,LCHR		; ..
	HRRZ	T1,FNAM(P1)	;GET PROGRAMMER
	PJRST	LOCT		;ISSUE LEFT ADJUSTED		[177]
;SSTRDR -- SET FLAGS TO LIST STR AND OR DIRECTORY
;CALL:	PUSHJ	P,SSTRDR
;	WITH I AND P1 SETUP
;USES T1-4

SSTRDR:	MOVE	T1,FSTR(P1)	;SEE IF SAME FILE STRUCTURE
;RDH	CAMN	T1,[SIXBIT /DSK/]
;RDH	SKIPE	LASSTR		;IS IT THE FIRST ONE?
;RDH	JRST	.+2		;NO--PRINT IT
;RDH	MOVEI	T1,0		;IF FIRST DSK, NEVER PRINT
	MOVEM	T1,LSTSTR	;SAVE FOR PRINTING
	EXCH	T1,LASSTR	;UPDATE MEMORY
	CAMN	T1,LASSTR	;SEE IF DIFFERENT
	SETZM	LSTSTR		;SAME--FLAG TO NOT PRINT

	MOVEI	T3,(I)		;POINT TO DIRECTORIES
	HRLI	T3,-.FXLND	;SET COUNT
SSTRD1:	SKIPN	.FXDIR-.FXDEV(T3)	;SEE IF NULL DIRECTORY
	SKIPE	T2,.FXDIM-.FXDEV(T3)  ;YES--USE WILDCARD STRAIGHT
	SETCM	T2,.FXDIM-.FXDEV(T3)
	JUMPN	T2,SSTRD2	;IF WILD--PROCEED
	AOS	T3		;ADVANCE EXTRA SHOT
	SKIPN	.FXDIR-.FXDEV-1(T3)  ;SEE IF AT END
	SKIPE	.FXDIM-.FXDEV-1(T3)  ; ..
	AOBJN	T3,SSTRD1	;LOOP UNTIL DONE

;HERE WITH T2=0 IF NOT WILD DIRECTORY, .NE. 0 IF WILD
;COPY THIS DIRECTORY TO OLD ONE WATCHING FOR CHANGES

SSTRD2:	MOVE	T1,UFDPPN(P1)	;SEE IF SAME DIRECTORY
	MOVEM	T1,LSTDIR	;SAVE FOR LISTING
	EXCH	T1,LASDIR	;UPDATE MEMORY
	PUSH	P,T2
	MOVE	T2,T1		;SETUP POINTER TO OLD AREA
	MOVE	T3,UFDPPN(P1)	;  AND TO NEW AREA
	TLNE	T3,-1		;SEE IF NEW HAS PATH
	JRST	SSTRD4		;NO--PROCEED
	TLNE	T2,-1		;IF OLD DIDN'T,		[211]
	SETOM	T1		; THEN DEFINITELY DON'T MATCH	[211]

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

	MOVEI	T2,LASPTH	;POINT TO LAST PATH
	HRLI	T3,-.FXLND	;SET LOOP COUNTER
SSTRD3:	MOVE	T4,.PTPPN(T3)	;GET NEW DIRECTORY
	CAME	T4,.PTPPN(T2)	;SEE IF SAME AS OLD ONE
	SETOM	T1		;NO--SET DIFFERENT FLAG
	MOVEM	T4,.PTPPN(T2)	;STORE FOR OLD MEMORY
	AOS	T2		;ADVANCE OLD POINTER
	SKIPE	T4		;SEE IF END OF PATH YET
	AOBJN	T3,SSTRD3	;NO--LOOP UNTIL DONE
	CAME	T1,[-1]		;SEE IF DIFFERENT
	MOVE	T1,LASDIR	;SAME--FAKE OUT CHECK BELOW

;HERE WITH T1=OLD DIRECTORY (OR -1 IF KNOWN DIFFERENT)

SSTRD4:	CAMN	T1,LASDIR	;NO--SEE IF CHANGED
	SETZM	LSTDIR		;NO--CLEAR LISTING FLAG

	TRNE	F,R.FAST	;SEE IF /F
	SKIPLE	S.SUM		;YES--SEE IF /SUM
	JRST	.+2		;/F/SUM OR NOT /F
	JRST	SSTRD6		;/F AND NOT /SUM--NO SUBTOTALS
	SKIPN	LSTSTR		;SEE IF SEVERAL STRS
	SKIPE	LSTDIR		;OR SEVERAL DIRS
	PUSHJ	P,SUBTOT	;YES--ISSUE SUBTOTALS
	MOVE	T1,LASSTR	;GET LAST STRUCTURE
	MOVEM	T1,SUBSTR	;SAVE FOR SUBTOTALS
	SKIPE	T1,LASDIR	;GET LAST DIRECTORY
	TLNE	T1,-1		;SEE IF PATH POINTER
	JRST	SSTRD5		;NO--JUST STORE WORD
	HRLZS	T1		;SET AS FROM POINTER
	HRRI	T1,SUBPTH	;SET TO POINTER
	BLT	T1,SUBEND	;COPY PATH
	MOVEI	T1,SUBPTH	;SET POINTER TO SUBTOTAL PATH
SSTRD5:	MOVEM	T1,SUBDIR	;SAVE SUBTOTAL DIRECTORY

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

SSTRD6:	POP	P,T2		;RESTORE WILD FLAG (.NE. 0 IF WILD)
	SKIPN	S.SORT		;SEE IF SORTING
	JRST	SSTRD7		;NO--PROCEED
	SETOM	LSTSTR		;YES--SET TO LIST
	SETOM	LSTDIR		;LIST DIRECTORY
	SKIPGE	T1,.WLDFL##	;SEE IF WILD STR
	SETCM	T1,T1		;  OR WILD FILE AND STR
	CAIE	T1,1		; ..
	SETZM	LSTSTR		;NO--CLEAR LIST
	SKIPN	T2		;CHECK WILD DIRECT
	SETZM	LSTDIR		;NO--CLEAR LIST DIRECT
SSTRD7:	SKIPLE	S.IND		;IF /INDIRECT			[322]
	JRST	[SKIPN S.PRDE	;[336] IF /NOPRDEVICE
		  POPJ	P,	;[336] THEN DON'T OUTPUT DEVICE NAME
		 SKIPE T2,FSTR	; IF STRUCTURE KNOWN,		[322]
		 PUSHJ P,LSIXCL	; OUTPUT IT ALWAYS		[322]
		 POPJ  P,]	;AND RETURN			[322]
	SKIPN	S.SORT		;UNLESS /SORT,			[246]
	SKIPG	S.HDSD		;[412] HEADER STR/DIR LISTING?
	JRST	SSTRD8		;NO--PROCEED			[174]
	SKIPN	LSTSTR		;YES--SEE IF CHANGE OF STR
	SKIPE	LSTDIR		; OR OF DIRECTORY
	JRST	.+2		;YES--PRINT THEM
	JRST	SSTRD8		;NO--SKIP OUTPUT		[174]
	PUSHJ	P,.TNEWL	;FORCE NEW LINE
	TLZN	F,L.SBTT	;JUST OUTPUT A SUB-TITLE?
	JRST	.+3		;NO
	TLZ	F,L.CRLF	;YES, ZAP BLANK-LINE SUPPRESSOR
	PUSHJ	P,LCRLF		;AND GIVE A BLANK LINE
	PUSHJ	P,SSTRD8	;[352] CHECK FOR PRDEV/PRDIR SWS.
	PUSHJ	P,LSTRDX	;PRINT STR AND DIRECTORY
	PUSHJ	P,.TNEWL	;SPACE OVER AND RETURN		[174]

SSTRD8:	SKIPL	T1,S.PRDE	;SEE IF /PRDEVICE		[174]
	MOVEM	T1,LSTSTR	;YES--USE THAT			[174]
	SKIPL	T1,S.PRDI	;SEE IF /PRDIRECTORY		[174]
	MOVEM	T1,LSTDIR	;YES--USE THAT			[174]
	POPJ	P,		;RETURN				[174]
;LSTRDR -- LIST STRUCTURE AND DIRECTORY IF APPROPRIATE
;CALL:	PUSHJ	P,LSTRDR
;RETURNS
;USES T1, T2, T3, T4, C, M

LSTRDR:	SKIPLE	S.IND		;IF /INDIRECT,			[322]
	 JRST	[SKIPN	S.PRDI	;[336] DOES HE WANT DIRECTORY?
		 POPJ	P,	;[336] NO - JUST RETURN NOW
		 JRST	FLBDIR] ;[336] YES - PRINT DIRECTORY SANS <TAB>
	PUSHJ	P,.SAVE1	;SAVE P1
	MOVEI	P1,0		;SET TO NO OFFSET
LSTRDX:	SKIPN	LSTSTR		;SEE IF APPROPRIATE TO LIST
	JRST	FNSTR		;NO--PROCEED
	SKIPE	T1,NOCHRS	;SEE IF INTO LINE
	JRST	[CAIG  T1,7	;SEE IF AT LEAST COL 8 YET
		 PUSHJ P,LTAB	;NO--MOVE OVER
		 PUSHJ P,LTAB	;YES--POSITION
		 JRST  .+1]	;PROCEED
	SKIPE	T2,FSTR(P1)
	PUSHJ	P,LSIXCL	;DO SO IN SIXBIT WITH COLON
FNSTR:	SKIPN	LSTDIR		;SEE IF TIME TO LIST
	POPJ	P,		;NO--PROCEED
FLDIR:	SKIPE	NOCHRS		;SEE IF INTO LINE
	PUSHJ	P,LTAB

;FLBDIR -- SUBROUTINE TO LIST DIRECTORY INSIDE []

FLBDIR:	SKIPN	T4,UFDPPN(P1)	;IF UFD,			[316]
	POPJ	P,		;(NO--RETURN)			[316]
	TLNN	T4,-1		;[454] PPN OR PATH POINTER?
	SKIPE	.PTPPN(T4)	;[454] PATH POINTER, ANYTHING THERE?
	CAIA			;[454] VALID DIRECTORY, TYPE IT OUT
	POPJ	P,		;[454] NULL DIRECTORY, DON'T LIST "[0]"
	MOVEI	C,"["
	PUSHJ	P,LCHR
	PUSHJ	P,LDIRB
	MOVEI	C,"]"
	PJRST	LCHR		;AND RETURN
;HERE AT END OF A NON-DISK DIRECTORY

DIREND:	PUSHJ	P,DIRE		;OUTPUT SUMMARY AND TOTAL LINE
	TRZ	F,R.WORD!R.NDSK	;CLEAR WORD MODE AND NOT DISK	[202]
	MOVE	I,.WILAS	;GET END OF SET
	MOVEM	I,I.NXRD	;SET FOR MASTER LOOP
	POPJ	P,		;RETURN
	SUBTTL	MISCELLANEOUS DIRECTORY SUBROUTINES

;ENDSUB -- ROUTINE TO CLEAN UP SUBTOTALS AT END

ENDSUB:	SKIPLE	NUMSUB		;SEE IF SUBTOTALS ALREADY	[307]
	PJRST	SUBTOT		;YES--DO SOME MORE		[307]
	PJRST	SUBLOP		;NO--JUST CLEAN END OF WORK	[307]


;SUBTOT -- ROUTINE TO ISSUE SUBTOTALS
;USES T1-4

SUBTOT:	SKIPN	S.SUM		;SEE IF /NOSUM
	POPJ	P,		;YES--NEVER GIVE IT
	PUSHJ	P,.SAVE1	;SAVE P1
	SKIPE	NOCHRS		;SEE IF AT START OF LINE
	PUSHJ	P,LCRLF		;NO--END THIS LINE
	MOVEI	P1,SUBT-TOT	;POINT TO SUBTOTALS
	SKIPLE	FLFSUM		;SEE IF FORCED SUMMARY		[160]
	JRST	SUBTDO		;YES--GO DO SUBTOTAL
	MOVEI	T1,1		;SET ONE
	CAML	T1,SNFILF	;IF MORE THAN ONE FILE
	CAMGE	T1,SNFILR	;OR MORE THAN ONE ERROR
SUBTDO:	PUSHJ	P,TOTALS	;GO ISSUE SUBTOTALS

;HERE FROM END OF DISK TO MOVE SUBT. TO TOT.

SUBLOP:	SKIPN	SNFILF		;SEE IF ANY FILE FOUND		[307]
	SKIPE	SNFILR		;OR ANY ERRORS			[307]
	AOS	NUMDIR		;COUNT DIRECTORY FOUND		[307]
	PUSH	P,TCHKSM	;PRESERVE TOTAL CHECKSUM
	MOVSI	T1,-<SUBT-TOT>	;SET COUNT TO COPY
SUBTL:	MOVE	T2,SUBT(T1)	;GET SUBTOTAL
	ADDM	T2,TOT(T1)	;ADD INTO TOTAL
	SETZM	SUBT(T1)	;CLEAR SUBTOTAL
	AOBJN	T1,SUBTL	;LOOP UNTIL DONE
	POP	P,TCHKSM	;RESTORE TOTAL CHECKSUM
	SETZM	SUBSTR		;CLEAR STRUCTURE FROM TOTAL	[245]
	POPJ	P,		;RETURN
;DIRE  -- OUTPUT EMPTY OR TOTAL LINE
;DIRET -- OUTPUT TOTAL LINE
;CALL:	PUSHJ	P,DIRE/DIRET
;USES T1-4

DIRE:	PUSHJ	P,ENDSUB	;FINISH LAST SUBTOTAL		[307]
	PUSHJ	P,.TNEWL	;FORCE BEGINNING OF LINE
	MOVEI	T1,[ASCIZ /Directory empty/]
	SKIPE	NOFIL
	MOVEI	T1,[ASCIZ /Directory has no such files/]
	SKIPN	NOFILF
	JRST	DIREL		;GO PRINT MESSAGE
DIRET:	PUSHJ	P,ENDSUB	;FINISH LAST SUBTOTAL		[307]
	PUSHJ	P,.TNEWL	;FORCE NEW LINE
	SKIPLE	FLFSUM		;SEE IF FORCED SUMMARY		[201]
	JRST	DIRETP		;YES--GO DO IT			[201]
	TRNE	F,R.NDSK	;NO--SEE IF NOT DISK FORMAT	[201]
	JRST	DIRELX		;RIGHT--NO SUMMARY		[201]
	MOVE	T1,NOFILR	;GET NUMBER OF LOOKUP ERRORS
	MOVE	T1,NOFILF	;SEE HOW MANY FILES FOUND
	CAILE	T1,1		;IF LE 1, NO SUMMARY NEEDED
	SKIPN	NOBLKS		;SEE IF BLOCKS ACCUMULATED
	JRST	DIRELX		;NO--JUST PRINT BLANK LINE AND RETURN
DIRETP:	SKIPN	S.SUM		;SEE IF /NOSUM
	POPJ	P,		;YES--NEVER DO IT
	SOSG	NUMSUB		;SEE IF SUBTOTALS
	PUSHJ	P,LCRLF		;NO--SEPARATE SUMMARY BY BLANK LINE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

	PUSHJ	P,.CLOSU##	;CLEAR ^O SUPPRESSION
	PUSHJ	P,.SAVE1	;SAVE P1
	MOVEI	P1,0		;POINT TO TOTALS
	MOVEI	T1,[ASCIZ /  Grand total of /]
	SKIPGE	T2,NUMSUB	;GET NUMBER OF SUBTOTALS
	JRST	TOTALS		;IF NONE, DO TOTAL
	JUMPN	T2,TOTALO	;IF SEVERAL, DO GRAND TOTAL
	MOVE	T2,NUMDIR	;IF ONE, GET NUMBER OF DIRECTORIES
	CAIG	T2,1		;IF MORE THAN ONE, DO GRAND TOTAL
	JRST	DIRELX		;NO--JUST EXIT
	JRST	TOTALO		;YES--GIVE GRAND TOTAL

;TOTALS -- ROUTINE TO ISSUE EITHER SUB OR GRAND TOTALS
;CALL:	MOVEI	P1,0 FOR GRAND OR SUBT-TOT FOR SUBS
;USES T1-4

TOTALS:	MOVEI	T1,[ASCIZ /  Total of /]
TOTALO:	SKIPN	NOFILF(P1)	;SEE IF ANY FILES		[175]
	SKIPE	NOFILR(P1)	; OR ERRORS			[175]
	SKIPA			;YES--OUTPUT LINE		[175]
	POPJ	P,		;NO--SKIP TOTAL LINE		[175,324]
	TLO	F,L.SBTT	;[412] SUB/TOTALS LINE PRINTED
	PUSHJ	P,.TSTRG	;PRINT HEADING
	AOS	NUMSUB		;COUNT SUBTOTAL
	SKIPN	NOFILF(P1)	;SEE IF ANY FILES
	JRST	[SKIPN NOFILR(P1)  ;NO--SEE IF ANY ERRORS
		 JRST  DIRETF	;NO--SAY 0 FILES
		 JRST  DIRETL]	;YES--TELL ALL
	TRNE	F,R.FAST	;SEE IF /F			[223]
	SKIPLE	S.SUM		; AND NOT /SUM			[224]
	SKIPA			;NO--DO THE OUTPUT		[224]
	JRST	DIRETF		;YES--SKIP "N BLOCKS"		[223]
	TRNE	F,R.WORD	;[414] WORDS OR BLOCKS DESIRED?
	SKIPA	T1,NOWRDS(P1)	;[414] WORDS
	MOVE	T1,NOBLKS(P1)	;[414] BLOCKS
	PUSH	P,T1		;[414] SAVE FOR MOMENT
	PUSHJ	P,.TDECW##	;PRINT NUMBER OF BLOCKS
	MOVEI	T1,[ASCIZ / block/]
	TRNE	F,R.WORD	;SEE IF WORD MODE
	MOVEI	T1,[ASCIZ / word/]	;IF SO, CHANGE MESSAGE
	PUSHJ	P,.TSTRG##
	POP	P,T2		;[414] GET BACK WORD/BLOCK COUNT
	MOVEI	T1,"s"		;MAKE PLURAL IF NEEDED
	CAIE	T2,1		; ..
	PUSHJ	P,.TCHAR##	;YES

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

	MOVEI	T1,[ASCIZ / in /]	;AND REST OF MESSAGE
	PUSHJ	P,.TSTRG##	; ..
DIRETF:	MOVE	T1,NOFILF(P1)	;GET NUMBER OF FILES
	PUSHJ	P,.TDECW##	;  FOUND AND PRINTED
	MOVEI	T1,[ASCIZ / file/]
	PUSHJ	P,.TSTRG##	;OUTPUT LINE
	MOVE	T2,NOFILF(P1)	;GET NUMBER FOUND
	MOVEI	T1,"s"		;GET PLURAL
	CAIE	T2,1		;SEE IF NOT ONE
	PUSHJ	P,.TCHAR##	;YES--TYPE PLURAL
	SKIPG	S.FIND		;IF /FIND THEN CHECKSUMS VALID ONLY FOR
				;THE INDIVIDUAL FILES . . .
	SKIPG	S.CHK		;SEE IF /CHECKSUM
	JRST	DIRETC		;NO--PROCEED
	MOVE	T1,TCHKSM(P1)	;GET AGGRAGATE CHECKSUM
	MOVEM	T1,CHKSUM	;SET FOR PRINTOUT
	SETZM	TCHKSM(P1)	;CLEAR FOR NEXT TIME
	MOVEI	M,[ASCIZ / Checksum = /]
	PUSHJ	P,LSTR
	PUSHJ	P,LCHECK	;LIST CHECKSUM
DIRETC:	SKIPN	NOFILR(P1)	;SEE IF ANY ERRORS
	JRST	DIRELE		;NO--THAT'S ALL
	MOVEI	T1,[ASCIZ / and /]
	PUSHJ	P,.TSTRG##	;YES--ISSUE CONNECTIVE
DIRETL:	MOVE	T1,NOFILR(P1)	;GET NUMBER OF ERRORS
	PUSHJ	P,.TDECW##	;TYPE THE COUNTER
	MOVEI	T1,[ASCIZ / LOOKUP error/]
	PUSHJ	P,.TSTRG##	;TYPE LABEL
	MOVE	T2,NOFILR(P1)	;GET COUNT
	MOVEI	T1,"s"		;GET PLURAL
	CAIE	T2,1		;SEE IF NOT ONE
	PUSHJ	P,.TCHAR##	;TYPE PLURAL
	JRST	DIRELE		;AND GO FINISH
DIREL:	PUSHJ	P,.TSTRG##
DIRELE:	MOVE	T1,NUMDIR	;SEE HOW MANY DIRECTORIES
	CAILE	T1,1		;SEE IF MORE THAN ONE
	JUMPE	P1,DIRELF	;YES--JUMP IF GRAND TOTAL
	SKIPN	SUBSTR		;SEE IF DEVICE KNOWN
	JRST	DIRELF		;NO--SKIP THIS LINE
	MOVEI	T1,[ASCIZ / on /]
	PUSHJ	P,.TSTRG##
	MOVE	T1,SUBSTR	;GET STRUCTURE
	PUSHJ	P,.TSIXN##	;LIST IT
	MOVEI	T1,[ASCIZ /: /]
	PUSHJ	P,.TSTRG##	;LIST SEPARATION
	MOVEI	T1,SUBDIR	;POINT TO DIRECTORY
	PUSHJ	P,.TDIRB##	;PRINT IT
DIRELF:	PUSHJ	P,.TCRLF##
DIRELX:	SKIPG	S.SUM		;UNLESS /SUMMARY,		[327]
	PUSHJ	P,LCRLF		; GIVE A BLANK LINE		[175]
	POPJ	P,		;RETURN
DM	FND,.FXLEN,0,0

DEFINE	SWTCHS,<
SP ACCESS,S.ACCS,.SWDEC##,ACC,FS.NFS!FS.LRG
SN ACCOUNT,S.ACCT,FS.NFS
SS ALLOCATED,S.ALC,1,FS.NFS
SN AUTHOR,S.AUT,FS.NFS
SS BLOCKS,S.WORD,0,FS.NFS
SN CHECKSUM,S.CHK,FS.NFS
SN COMPARE,S.CMP,FS.NFS
SN DETAIL,S.DTL,FS.NFS
SN DIRECT,S.DIRE,FS.NFS
SN DTA,S.DTA,FS.NFS
SN EOTS,S.EOT,FS.NFS
SN ERLOG,S.ERLO,FS.NFS
SS *FAST,<POINTR (FLAGS,R.FAST!R.SLOW)>,R.FAST/R.FAST,FS.NFS
SP FILES,S.FILE,.SWDEC##,FIL,FS.NFS
SN FIND,S.FIND,FS.NFS
SN FLSDIR,S.FLSD,FS.NFS
SN FNDBLD,S.FBLD,FS.NFS
SP FNDDAT,F.BLK,.SWFIL##,FND,FS.NFS!FS.VRQ
SN HDSDIR,S.HDSD,FS.NFS
SN *INDIRECT,S.IND,FS.NFS
SS *LIST,S.DODV,1,FS.NFS
SN MARKS,S.MARK,FS.NFS
SN MVOLUM,S.MVOL,FS.NFS
SS *NORMAL,<POINTR (FLAGS,R.FAST!R.SLOW)>,0,FS.NFS
SN PRDEVICE,S.PRDE,FS.NFS
SN PRDIRECTORY,S.PRDI,FS.NFS
SN PRVERSION,S.PRVE,FS.NFS
SN RETRY,S.RETR,FS.NFS
SN REWINDS,S.REWS,FS.NFS
SS *SLOW,<POINTR (FLAGS,R.FAST!R.SLOW)>,R.SLOW/R.FAST,FS.NFS
SN SORT,S.SORT,FS.NFS
SN SUMMARY,S.SUM,FS.NFS
SN TITLES,S.TITL,FS.NFS
SN TMPCOR,S.TMPC,FS.NFS
SN UNITS,S.UNIT,FS.NFS
SP *WIDTH,S.WDTH,.SWDEC##,WID,FS.NFS
SS WORDS,S.WORD,1,FS.NFS
SS WRITTEN,S.ALC,0,FS.NFS
>
	DOSCAN	(DRSWT)
	SUBTTL	SUBROUTINES FOR LISTING OUTPUT

;ERROR -- ROUTINE TO ISSUE ERROR MESSAGE WITH JUST TEXT
;ERRORC -- ROUTINE TO ISSUE ERROR MESSAGE WITH MORE STUFF
;WARN -- ROUTINE TO ISSUE WARNING MESSAGE

ERROR:	HRLI	T2,(1B0)	;SET FLAG TO NOT RETURN
ERRORC:	TLOA	T2,"?"		;SET FATAL ERROR CODE
WARN:	HRLI	T2,"%"		;SET WARNING CODE
	HRLI	T1,'DRT'	;SET DIRECT'S PREFIX
	PUSHJ	P,.ERMSG##	;ISSUE MESSAGE
	JUMPGE	T1,.POPJ##	;RETURN UNLESS ERROR ENTRY

;LFERX -- ROUTINE TO CLEAN UP AFTER FATAL ERROR
;THE ROUTINES IN SCAN CANNOT BE USED AFTER ANOTHER PUSHJ

LFERX:	PUSHJ	P,.TCRLF##	;ISSUE FINAL <CRLF>
	RELEAS	LC,		;BIND OFF LISTING
	RESET			;CLEAR I/O AND CORE ASSIGNMENTS
	JRST	MAINLP		;AND TRY AGAIN
;TITLER -- PLACE PAGE TITLE IF USER REQUESTED ONE
;CALLED AT START OF FIRST PAGE AND END OF EACH PAGE BUT LAST
;CALL:	PUSHJ	P,TITLER

TITLER:	PUSHJ	P,SAVTYP	;CLEAR R.TYPE AND SAVE OLD VALUE
	PUSH	P,M		;PRESERVE POINTER
	PUSH	P,C		;PRESERVE CHARACTER
	SKIPG	S.TITL		;SEE IF TITLES ON
	JRST	TITLEY		;NO--RETURN
	MOVEI	M,LN$LPP+2	;RESET LINES THIS PAGE COUNT
	MOVEM	M,LNPP		; ..
	TRON	F,R.LSOM	;SEE IF FIRST CALL
	JRST	TITLEH		;YES--SKIP BIND-OFF OF PREVIOUS PAGE
	MOVEI	C,.CHFFD	;EJECT TO NEW PAGE
	PUSHJ	P,LCHR		; ..

;HERE WHEN IT IS DESIRED TO OUTPUT A PAGE HEADER

TITLEH:	PUSH	P,T1		;SAVE T1-P1
	PUSH	P,T2
	PUSH	P,T3
	PUSH	P,T4
	PUSH	P,P1
	MOVEI	M,[ASCIZ /	Directory listing	/]
	PUSHJ	P,LSTR		;SEND START OF LINE 1
	DATE	T4,		;GET CURRENT DATE
	PUSHJ	P,LDATE		;PRINT IT
	PUSHJ	P,LTAB		;SPACE OVER
	MSTIME	T4,		;GET CURRENT TIME
	IDIVI	T4,^D60000	;CONVERT TO MINUTES
	PUSH	P,P1		;SAVE REMAINDER
	PUSHJ	P,LTIME		;PRINT TIME (HH:MM)
	POP	P,T1		;RESTORE REMAINDER
	IDIVI	T1,^D1000	;CONVERT TO SECONDS
	PUSHJ	P,LTIMES	;PRINT SECONDS (:SS)
	MOVEI	M,[ASCIZ /	Page /]
	PUSHJ	P,LSTR		;SPACE OVER TO PAGE NUMBER
	AOS	T1,PAGCNT	;GET NEXT PAGE NUMBER
	PUSHJ	P,LDEC2		;LIST IT
	TRNE	F,R.NDSK	;SEE IF NOT A DISK		[202]
	JRST	TITLEX		;RIGHT--SKIP SUBTITLE		[202]
	PUSHJ	P,LCRLF		;END OF LINE

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;HERE WHEN FIRST LINE HAS BEEN PRINTED, DO THE REST

	MOVEI	M,[ASCIZ /Name Extension/]
	PUSHJ	P,LSTR
	TRNE	F,R.FAST
	JRST	TITLEX
	TRNE	F,R.WORDS	;[451] /WORDS SPECIFIED?
	PUSHJ	P,LSPC4		;[451] YES, ALLOW FOR WIDER COLUMN
	MOVEI	M,[ASCIZ / Len  Prot  /]
	PUSHJ	P,LSTR
	MOVEI	M,[ASCIZ /Checksum/]
	SKIPLE	S.CHK
	PUSHJ	P,LSTR
	MOVEI	M,[ASCIZ /  Creation/]
	TRNE	F,R.SLOW
	MOVEI	M,[ASCIZ /   Access      ---Creation---   Mode/]
	PUSHJ	P,LSTR
	MOVEI	M,[ASCIZ /	   Version/] ;[335]
	SKIPE	S.PRVE		;[412] SKIP IF /NOPRVERSION
	PUSHJ	P,LSTR		;[335] <TAB><SP><SP><SP>VERSION
	MOVEI	M,[ASCIZ/			Account String/]
	SKIPLE	S.ACCT
	PUSHJ	P,LSTR
	MOVEI	M,[ASCIZ/	Author/] ;[335]
	SKIPLE	S.AUT		;[335] NEED AN AUTHOR FIELD?
	PUSHJ	P,LSTR		;[335] <TAB>AUTHOR
	MOVEI	M,[ASCIZ/	Device/] ;[335] NO
	SKIPN	S.PRDE		;[412] IF /NOPRDEVICE
	JRST	TITLE5		;[412] THEN NO DEVICE FIELD EVER
	SKIPG	S.PRDE		;[412] IF /PRDEVICE
	SKIPLE	S.FLSD		;[412] OR /FLSDIR
	PUSHJ	P,LSTR		;[335] <TAB>DEVICE
TITLE5:	MOVEI	M,[ASCIZ/	Directory/] ;[335]
	SKIPN	S.PRDI		;[412] IF /NOPRDIRECTORY
	JRST	TITLE6		;[412] THEN NO DIRECTORY FIELD EVER
	SKIPG	S.PRDI		;[412] IF /PRDIRECTORY
	SKIPLE	S.FLSD		;[412] OR /FLSDIR
	PUSHJ	P,LSTR		;[335] <TAB> [DIRECTORY]
TITLE6:				;[335] SPOOLNAME HERE IF FIGURE OUT
				;[335] WHAT TO DO WITH IT . . .

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE
TITLEX:	POP	P,P1		;RESTORE THE ACS
	POP	P,T4
	POP	P,T3
	POP	P,T2
	POP	P,T1
	PUSHJ	P,LCRLF		;ISSUE END OF LINE
	TLZ	F,L.CRLF	;[402] TURN OFF CRLF SUPPRESS FLAG
	PUSHJ	P,LCRLF		;AND A BLANK LINE

TITLEY:	SKIPGE	LNPP		;SEE IF FIRST TIME		[202]
	JRST	[HRLOI C,377777	;YES--SET COUNTER HIGH		[202]
		 MOVEM C,LNPP	;YES--CLEAR FLAG		[202]
		 SKIPG S.SUM	;UNLESS /SUMMARY,		[327]
		 PUSHJ P,LCRLF	;YES--SKIP ONE LINE		[202]
		 JRST  .+1]	; AND CONTINUE			[202]
	POP	P,C		;RESTORE CHARACTER
	POP	P,M		;RESTORE POINTER
	POPJ	P,		;RETURN
;LDIRB -- LIST DIRECTORY IN SFD FORMAT
;CALL:	MOVE	T4,CONTENTS OF UFDPPN
;	PUSHJ	P,LDIRB
;USES T1, T2, T3, T4, C

LDIRB:	JUMPE	T4,.POPJ##	;GIVE UP IF BLANK
	JUMPL	T4,[MOVE  T2,T4 ;IF SIXBIT, TYPE IT
		    PJRST LSIXN]
	TLNE	T4,-1		;SEE IF SFD POINTER
	JRST	[PUSH P,[[0]-3]	;NO--JUST DO UFD
		 JRST LDIRBU]

	PUSH	P,T4		;SAVE ARGUMENT
	MOVE	T4,2(T4)	;GET UFD IN PATH LIST
LDIRBU:	JUMPL	T4,[MOVE  T2,T4 ;IF SIXBIT, TYPE IT
		MOVEI	T3,6	;SET FOR 6 CHARS
		SKIPLE	S.SORT
		PUSHJ	P,LSIXC ; IF /SORT, DO 6 CHARS
		SKIPG	S.SORT
		PUSHJ	P,LSIXN
		JRST	LDIRBR]
	SKIPG	S.SORT		;IF NOT /SORT
	JRST	LDIRBN		; PROCEED BELOW
	HLRZ	T1,T4		;IF /SORT,
	PUSHJ	P,LOCT6Z	; DO FIXED FORMAT
	MOVEI	C,","		;SEPARATE HALVES
	PUSHJ	P,LCHR		; WITH A COMMA
	HRRZ	T1,T4		;THEN DO
	PUSHJ	P,LOCT6Z	; RIGHT HALF
	JRST	LDIRBR		;CONTINUE BELOW
LDIRBN:	PUSHJ	P,LXWD		;TYPE UFD
LDIRBR:	POP	P,T4		;RESTORE ARGUMENT
	HRLI	T4,-.FXLND+1	;SET MAX LIST LENGTH
LDIRB1:	SKIPN	T2,3(T4)	;GET NEXT SFD IN PATH
	POPJ	P,		;IF NONE, RETURN
	MOVEI	C,","		;YES--TYPE COMMA
	PUSHJ	P,LCHR		; ..
	MOVEI	T3,6		;SET FIXED LENGTH
	SKIPLE	S.SORT		;IF /SORT
	PUSHJ	P,LSIXC		; DO FIXED
	SKIPG	S.SORT		;ELSE,
	PUSHJ	P,LSIXN		;  AND SFD
	AOBJN	T4,LDIRB1	;LOOP UNTIL DONE
	POPJ	P,		;RETURN
;LVER -- LIST WORD IN VERSION NUMBER FORMAT
;CALL:	MOVE	T4,WORD
;	PUSHJ	P,LVER
;USES T1, T2, T3, T4, C

LVER:	LDB	T1,[POINT 9,T4,11]  ;GET MAJOR VERSION
	SKIPE	T1		;IF NON-ZERO,
	PUSHJ	P,LOCT		;  PRINT IN OCTAL
	LDB	T1,[POINT 6,T4,17]  ;GET MINOR VERSION
	JUMPE	T1,LVER2	;IF NON-ZERO,
	SOS	T1		;OFFSET				[310]
	IDIVI	T1,^D26		;  PRINT IN ALPHA
	JUMPE	T1,LVER1	;  ONE OR TWO
	MOVEI	C,"A"-1(T1)	;  CHARACTERS
	PUSHJ	P,LCHR		;  ..
LVER1:	MOVEI	C,"A"(T2)	;  ..				[310]
	PUSHJ	P,LCHR		;  ..
LVER2:	HRRZ	T1,T4		;GET EDIT NUMBER
	JUMPE	T1,LVER3	;IF NON-ZERO,
	MOVEI	C,"("		;  PRINT (
	PUSHJ	P,LCHR		;  ..
	PUSHJ	P,LOCT		;  IN OCTAL
	MOVEI	C,")"		;  AND )
	PUSHJ	P,LCHR		;  ..
LVER3:	LDB	T1,[POINT 3,T4,2]
	JUMPE	T1,.POPJ##	;IF CUST. NUMBER NON-ZERO,
	MOVEI	C,"-"		;  PRINT -
	PUSHJ	P,LCHR		;  ..
	PJRST	LOCT		;  AND NUMBER
;LAUT -- LIST THE AUTHOR FIELD
;CALL:	PUSHJ	P,LAUT
;USES T1-4,C

LAUT:	SKIPN	T2,FAUT		;SEE IF ANYTHING THERE
	PJRST	LTAB		;NO--JUST ISSUE TAB
	PJUMPL	T2,LSIXT	;IF SIXBIT, ISSUE AS SUCH
	HLRZ	T1,T2		;ELSE GET PROJECT
	SKIPG	S.SORT		;SEE IF /SORT
	PUSHJ	P,LOCT6B	;NO
	SKIPLE	S.SORT		;ELSE
	PUSHJ	P,LOCT6Z	;YES
	MOVEI	C,","		;SEPARATOR
	PUSHJ	P,LCHR		;TO FILE
	HRRZ	T1,FAUT		;GET PROGRAMMER
	SKIPG	S.SORT		;SEE IF /SORT
	PJRST	LOCT		;NO
	PJRST	LOCT6Z		;YES


;LCHECK -- ROUTINE TO LIST THE ACCUMULATED CHECKSUM
;CALL:	PUSHJ	P,LCHECK
;USES T1, T2, T3, C

LCHECK:	HLRZ	T1,CHKSUM	;YES--COMBINE HALVES
	HRRZ	T2,CHKSUM	;GET RH
	SETZM	CHKSUM		;[411] CLEAR CHECKSUM FOR NEXT FILE
	ADD	T2,T1		;ADD
	HLRZ	T1,T2		;GET CARRY
	ADDI	T1,(T2)		;COMBINE
	PJRST	LOCT6Z		;LIST AS 6 DIGIT OCTAL AND RETURN



;GCHECK -- ROUTINE TO GET THE ACCUMULATED CHECKSUM
;CALL:	PUSHJ	P,GCHECK
;USES T1, T2, T3

GCHECK:	HLRZ	T1,CHKSUM	;COMBINE HALVES
	HRRZ	T2,CHKSUM	;GET RH
	ADD	T2,T1		;ADD
	HLRZ	T1,T2		;GET CARRY
	ADDI	T1,(T2)		;COMBINE
	ANDI	T1,-1		;REDUCE TO 6 DIGITS
	POPJ	P,		;RETURN
;LXWD -- LIST WORD IN XWD FORMAT (N,N)
;CALL:	MOVE	T4,WORD
;	PUSHJ	P,LXWD
;USES T1, T2, T3, C

LXWD:	HLRZ	T1,T4		;GET LEFT HALF
	JUMPE	T1,LXWD1	;SKIP FIRST PART IF 0
	PUSHJ	P,LOCT		;OUTPUT LH IN OCTAL
	MOVEI	C,","		;SEND SEPARATOR
	PUSHJ	P,LCHR
LXWD1:	HRRZ	T1,T4		;DO RIGHT HALF
	PJRST	LOCT		;IN OCTAL AND RETURN



;LOCT6Z -- LIST 6 OCTAL DIGITS WITH LEADING ZEROS
;LOCTZ -- LIST N OCTAL DIGITS WITH LEADING ZEROS
;CALL:	(MOVE	T2,MASK OF LARGEST NUMBER  IF LOCTZ)
;	MOVE	T1,NUMBER
;	PUSHJ	P,LOCT6Z/LOCTZ
;USES T1, T2, T3, C

LOCT6Z:	MOVEI	T2,-1		;PRESET FOR 6 DIGITS

LOCTZ:	LSH	T2,-3		;COUNT DOWN MASK
	SKIPE	T2		;SEE IF ALL DONE
	CAMLE	T1,T2		;SEE IF DONE YET
	PJRST	LOCT		;REST ARE NON-ZERO
	PUSHJ	P,LZER		;NO--TYPE A ZERO
	JRST	LOCTZ		;AND GO AROUND AGAIN


;LOCT6B -- SAME ONLY LEADING BLANKS
;LOCTB -- SAME ONLY BLANKS

LOCT6B:	MOVEI	T2,-1		;SET FOR 6 DIGITS

LOCTB:	LSH	T2,-3		;COUNT DOWN MASK
	SKIPE	T2		;SEE IF ALL DONE
	CAMLE	T1,T2		;SEE IF DONE YET
	PJRST	LOCT		;REST ARE NON-ZERO
	PUSHJ	P,LSPC		;NO--TYPE A SPACE
	JRST	LOCTB		;AND GO AROUND AGAIN
;LDATE -- OUTPUT DATE IN FORM DD-MMM-YY
;CALL:	MOVE	T4,DATE IN SYSTEM FORMAT
;	PUSHJ	P,LDATE
;USES T1, T2, T3, T4, M, C

LDATE:	PUSHJ	P,.SAVE1	;SAVE P1
	SKIPE	S.SORT		;SEE IF /SORT
	JRST	LDATEN		;YES--USE SORTABLE FORMAT
	JUMPE	T4,LDATEZ	;JUMP IF NO DATE
	IDIVI	T4,^D31		;GET DAY
	MOVEI	T1,1(P1)
	PUSHJ	P,LDEC2
	IDIVI	T4,^D12		;GET MONTH
	MOVE	T1,[ASCII /-Jan--Feb--Mar--Apr--May--Jun--Jul--Aug--Sep--Oct--Nov--Dec-/](P1)
	MOVEI	T2,0
	MOVEI	M,T1
	PUSHJ	P,LSTR
	MOVEI	T1,^D64(T4)	;GET YEAR
	IDIVI	T1,^D100	;GET YEAR IN CENTURY		[176]
	MOVE	T1,T2		;GET REMAINDER			[176]
	PJRST	LDEC2Z		;OUTPUT YEAR AND RETURN

LDATEZ:	MOVEI	M,[ASCIZ /(undated)/]
	PJRST	LSTR

;HERE WHEN /SORT TO USE ANSI FORMAT:  YYYYMMDD

LDATEN:	PUSHJ	P,LSPC		;SPACE ONE TO USE SAME WIDTH
	IDIVI	T4,^D31		;GET DAYS
	MOVE	T2,P1		;SAVE FOR LATER
	IDIVI	T4,^D12		;GET MONTHS VS. YEARS
	MOVEI	T1,^D1964(T4)	;START WITH YEARS A.D.
	IMULI	T1,^D100	;MAKE ROOM FOR MONTHS
	ADDI	T1,1(P1)	;INCLUDE MONTHS (1=JAN)
	IMULI	T1,^D100	;MAKE ROOM FOR DAYS
	ADDI	T1,1(T2)	;INCLUDE DAYS
	PJRST	LDEC		;OUTPUT THIS MESS

;LDATIM -- OUTPUT DATE AND TIME IN FORM DD-MMM-YY HH:MM:SS
;CALL:	MOVE	T1,TIME RETURNED BY .CNTDT##
;	MOVE	T4,DATE RETURNED BY .CNTDT##
;	PUSHJ	P,LDATIM
;USES T1, T2, T3, T4, M, C

LDATIM:	PUSH	P,T1		;SAVE TIME
	MOVE	T4,T2		;POSITION DATE
	PUSHJ	P,LDATE		;LIST DATE
	PUSHJ	P,LSPC		;SPACE OVER
	POP	P,T4		;RESTORE TIME
	IDIVI	T4,^D60000	;GET MINS
	PUSHJ	P,LTIME		;LIST HH:MM
	MOVE	T1,P1		;GET MILLI-SECS
	IDIVI	T1,^D1000	;CONVERT TO SECS
	PJRST	LTIMES		;LIST :SS
;LOCT3Z -- LIST OCTAL 3 DIGITS (LEADING ZEROS)
;LOCT2Z -- DITTO 2 DIGITS
;CALL:	MOVEI	T1,NUMBER
;	PUSHJ	P,LOCT3Z/2Z
;USES T1, T2, T3, C

LOCT3Z:	CAIGE	T1,100		;TEST FOR FIRST ZERO
	PUSHJ	P,LZER		;YES--DO IT
LOCT2Z:	CAIGE	T1,10		;SEE IF NEXT
	PUSHJ	P,LZER		;YES--DO IT
	PJRST	LOCT		;THEN FINISH NUMBER


;LDECP -- LIST DECIMAL (POSSIBLY NEGATIVE) FOLLOWED BY .
;CALL:	MOVE	T1,NUMBER
;	PUSHJ	P,LDECP
;USES T1, T2, T3, C

LDECP:	JUMPGE	T1,LDECPP	;JUMP IF NOT NEGATIVE
	MOVEI	C,"-"		;TYPE MINUS
	PUSHJ	P,LCHR		; SIGN
	MOVMS	T1		;AND MAKE POSITIVE
LDECPP:	PUSHJ	P,LDEC		;LIST DECIMAL NUMBER
	MOVEI	C,"."		;LIST .
	PJRST	LCHR		;TO INDICATE DECIMAL NUMBER


;LOCT2 -- LIST OCTAL AT LEAST TWO DIGITS
;CALL:	MOVEI	T1,NUMBER
;	PUSHJ	P,LOCT2
;USES T1, T2, T3, C

LOCT2:	CAIGE	T1,10		;SEE IF LARGE ENOUGH
	PUSHJ	P,LSPC		;NO--SEND A SPACE
	PJRST	LOCT		;SEND IN OCTAL
;LTIME -- OUTPUT TIME IN FORM HH:MM
;LTIMEB-- OUTPUT TIME OR BLANKS IF 00:00
;LTIMES-- OUTPUT JUST ":DD" FOR SECONDS CALL
;LSECS -- OUTPUT TIME IN FORM HH:MM:SS
;LMSECS-- DITTO WITH INPUT IN MILLISEC.
;CALL:	(MOVE	T4,TIME IN MINUTES    FOR LTIME/LTIMEB)
;	(MOVE	T1,SECONDS            FOR LTIMES)
;	(MOVE	T4,TIME IN SECONDS    FOR LSECS)
;	(MOVE	T1,TIME IN MSEC       FOR LMSECS)
;	PUSHJ	P,LTIME
;USES T1, T2, T3, T4, C

LSECS:	SKIPA	T1,T4		;MOVE ARGUMENT
LMSECS:	IDIVI	T1,^D1000	;CONVERT TO SECONDS
	IDIVI	T1,^D60		;GET HH:MM PART
	PUSH	P,T2		;SAVE SECONDS
	MOVE	T4,T1		;POSITION HH:MM
	PUSHJ	P,LTIME		;ISSUE HH:MM
	POP	P,T1		;RESTORE SECONDS
	PJRST	LTIMES		;ISSUE :SS AND RETURN

LTIMEB:	JUMPE	T4,LSPC5	;IF 0, PRINT BLANKS

LTIME:	PUSHJ	P,.SAVE1	;SAVE P1
	IDIVI	T4,^D60		;GET HOURS
	MOVE	T1,T4
	PUSHJ	P,LDEC2		;LIST HOURS
	MOVE	T1,P1		;LIST MINUTES

LTIMES:	PUSHJ	P,LCOLON
				;FALL INTO LDEC2Z

;LDEC2Z -- LIST DECIMAL AT LEAST 2 DIGITS WITH LEADING ZERO
;CALL:	MOVEI	T1,NUMBER
;	PUSHJ	P,LDEC2Z
;USES T1, T2, T3, C

LDEC2Z:	CAIGE	T1,^D10		;TEST TO SEE IF NEEDED
	PUSHJ	P,LZER		;YES--SEND ZERO
	PJRST	LDEC		;GO FINISH WORK
;LDEC9 -- LIST DECIMAL AT LEAST NINE DIGITS
;LDEC8 -- LIST DECIMAL AT LEAST EIGHT DIGITS
;LDEC7 -- LIST DECIMAL AT LEAST SEVEN DIGITS
;LDEC6 -- LIST DECIMAL AT LEAST SIX DIGITS
;LDEC5 -- LIST DECIMAL AT LEAST FIVE DIGITS
;LDEC4 -- LIST DECIMAL AT LEAST FOUR DIGITS
;LDEC3 -- LIST DECIMAL AT LEAST THREE DIGITS
;LDEC2 -- LIST DECIMAL AT LEAST TWO DIGITS
;CALL:	MOVEI	T1,NUMBER
;	PUSHJ	P,LDEC2
;USES T1, T2, T3, C

LDEC9:	CAMGE	T1,[^D100000000];[426] WILL IT FIT IN 9 DIGITS?
	PUSHJ	P,LSPC		;[426] NO, EMIT A SPACE FILLER THEN
LDEC8:	CAMGE	T1,[^D10000000]	;[341] SEE IF GREATER THAN 8 DIGITS
	PUSHJ	P,LSPC		;[341] No. type a space then.
LDEC7:	CAMGE	T1,[^D1000000]	;[341] See if greater than 7 digits.
	PUSHJ	P,LSPC		;[341] No. type a space then.
LDEC6:	CAIGE	T1,^D100000	;[426] See if greater than 6 digits.
	PUSHJ	P,LSPC		;[341] No. type a space then.
LDEC5:	CAIGE	T1,^D10000	;[341] See if greater than 5 digits.
	PUSHJ	P,LSPC		;[341] No. type a space then.
LDEC4:	CAIGE	T1,^D1000	;SEE IF NEEDED
	PUSHJ	P,LSPC
LDEC3:	CAIGE	T1,^D100
	PUSHJ	P,LSPC
LDEC2:	CAIGE	T1,^D10
	PUSHJ	P,LSPC		;YES
	PJRST	LDEC		;GO LIST IN DECIMAL
;LDEC -- LIST DECIMAL NUMBER
;LOCT -- LIST OCTAL NUMBER
;LRDX -- LIST VIA PRESET RADIX
;CALL:	MOVEI	T1,NUMBER
;      (MOVEI	T3,RADIX    LRDX ONLY)
;	PUSHJ	P,LDEC/LOCT/LRDX
;USES T1, T2, T3, C

LOCT:	JUMPGE	T1,LOCTC	;IF POS, EASY TO DO
	MOVE	T2,T1		;NO--USE OTHER WAY
	MOVEI	T3,^D12		;SET DIGIT COUNT
LOCTL:	MOVEI	T1,0		;CLEAR RESULT
	LSHC	T1,3		;GET NEXT DIGIT
	MOVEI	C,"0"(T1)	;CONVERT TO ASCII
	PUSHJ	P,LCHR		;OUTPUT IT
	SOJG	T3,LOCTL	;AND LOOP UNTIL DONE
	POPJ	P,		;RETURN

LDEC:	SKIPA	T3,[^D10]	;INITIALIZE FOR DECIMAL RADIX
LOCTC:	MOVEI	T3,10		;INITIALIZE FOR OCTAL RADIX
LRDX:	IDIV	T1,T3		;DIVIDE BY RADIX
	HRLM	T2,(P)		;SAVE REMAINDER
	SKIPE	T1		;SEE IF ANYTHING LEFT
	PUSHJ	P,LRDX		;YES--LOOP BACK WITH PD LIST
	HLRZ	C,(P)		;GET BACK A DIGIT
	ADDI	C,"0"		;CONVERT TO ASCII
	PJRST	LCHR		;GO LIST IT
;LCRLF - LIST END OF LINE
;CALL:	PUSHJ	P,LCRLF
;USES M, C

LCRLF:	TLNE	F,L.CRLF	;[402] HAVE WE DONE A CRLF?
	JRST	[TRZ	F,R.SPLN	;[444] THIS SATISFIES EOL FOR R.SPLN
		POPJ	P,]		;[444] RETURN EMPTY HANDED
	MOVEI	M,[ASCIZ /
/]
				;FALL INTO LSTR

;LSTR - LIST ASCII STRING
;CALL:	MOVEI	M,STRING (END WITH 0 BYTE)
;	PUSHJ	P,LSTR
;USES M, C

LSTR:	TLOA	M,(POINT 7,)	;CONVERT TO BYTE POINTER
LSTR1:	PUSHJ	P,LCHR		;OUTPUT CHARACTER
	ILDB	C,M		;GET NEXT CHARACTER
	JUMPN	C,LSTR1		;LOOP UNLESS NULL
	POPJ	P,		;RETURN


;LSIXT -- LIST SIXBIT WORD FOLLOWED BY TAB
;CALL:	MOVE	T2,WORD
;	PUSHJ	P,LSIXT
;USES T1, T2, C

LSIXT:	PUSHJ	P,LSIX		;OUTPUT WORD
	PJRST	LTAB		;GO OUTPUT TAB AND RETURN


;LSIXCL -- LIST SIXBIT WORD FOLLOWED BY COLON
;CALL:	MOVE	T2,WORD
;	PUSHJ	P,LSIXCL
;USES T1, T2, C

LSIXCL:	PUSHJ	P,LSIX		;ISSUE IN SIXBIT
LCOLON:	MOVEI	C,":"		;GET COLON
	PJRST	LCHR		;ISSUE AND RETURN
;LSIX  -- LIST SIXBIT WORD (AT LEAST ONE SPACE)
;LSIXN -- SAME EXCEPT 0 GIVES NO SPACES
;CALL:	MOVE	T2,WORD
;	PUSHJ	P,LSIX/LSIXN
;USES T1, T2, C

LSIX:	MOVEI	T1,0		;CLEAR NEXT CHARACTER
	LSHC	T1,6		;FETCH NEXT CHAR
	PUSHJ	P,LCHRS		;LIST IT IN SIXBIT

LSIXN:	JUMPN	T2,LSIX		;LOOP UNTIL ONLY BLANKS LEFT
	POPJ	P,		;RETURN


;LSIXC -- LIST SIXBIT WORD FIXED NUMBER OF CHARACTERS
;CALL:	MOVE	T2,WORD
;	MOVEI	T3,NUM CHARS TO PRINT
;	PUSHJ	P,LSIXC
;USES T1, T2, T3, C

LSIXC:	MOVEI	T1,0		;CLEAR NEXT CHAR
	LSHC	T1,6		;GET NEXT CHAR
	PUSHJ	P,LCHRS		;LIST IT IN SIXBIT
	SOJG	T3,LSIXC	;LOOP UNTIL DONE
	POPJ	P,		;RETURN


;LSPC2 -- LIST TWO SPACES
;LSPC4 -- LIST FOUR SPACES
;LSPC5 -- LIST FIVE SPACES
;CALL:	PUSHJ	P,LSPC2
;USES C

LSPC5:	PUSHJ	P,LSPC		;SPACE ONE
LSPC4:	PUSHJ	P,LSPC		;SPACE ONE MORE
LSPC3:	PUSHJ	P,LSPC		;SPACE ANOTHER ONE
LSPC2:	PUSHJ	P,LSPC		;DO ONE
	PJRST	LSPC		;DO ANOTHER AND RETURN


;LCOMMA -- LIST A COMMA
;CALL:	PUSHJ	P,LCOMMA
;USES C

LCOMMA:	MOVEI	C,","		;GET CHARACTER
	PJRST	LCHR1		;GO LIST IT


;LZER -- LIST A ZERO
;CALL:	PUSHJ	P,LZER
;USES C

LZER:	MOVEI	C,"0"		;GET CHARACTER
	PJRST	LCHR1		;GO LIST IT
;LTAB -- LIST TAB
;LSPC -- LIST SPACE
;LCHR -- LIST CHARACTER
;LCHRS -- LIST CHARACTER IN SIXBIT
;CALL:	(MOVEI	C,CHARACTER    IF LCHR)
;	(MOVEI	T1,CHARACTER   IF LCHRS)
;	PUSHJ	P,LTAB/LSPC/LCHR
;USES C EXCEPT LCHR USES NO AC'S

LCHRS:	MOVEI	C," "-' '(T1)	;CONVERT TO ASCII AND MOVE TO C
LCHR:	CAIE	C,.CHTAB	;SEE IF A TAB
	JRST	LCHR1		;NO--GO SEND IT

LTAB:	TRZN	F,R.STAB	;[335] KILL TAB IF SO REQUESTED
	TRON	F,R.LTAB	;SET/TEST TAB
	POPJ	P,		;RETURN IF NOT TWO IN A ROW

LTAB1:	SKIPA	C,[.CHTAB]	;GET THE TAB
LSPC:	MOVEI	C," "		;GET THE SPACE

LCHR1:	SKIPGE	LNPP		;SEE IF AT END OF PAGE
	PUSHJ	P,TITLER	;YES--GO ISSUE PAGE HEADER
	CAIN	C,.CHCRT	;SEE IF CARRIAGE RETURN
	TRZ	F,R.LTAB	;YES--CLEAR TAB MEMORY
	CAIN	C,.CHLFD	;SEE IF END OF LINE
	JRST	[SOS  LNPP	;YES--DECREMENT LINES PER PAGE
		 TLO  F,L.CRLF	;[402] SET ON CRLF SEEN FLAG.
		 TRZE F,R.SPLN	;STOP SUPPRESSING LINE		[317]
		 JRST LCHR4	;FINISH LAST SUPPRESSION	[317]
		 JRST .+1]	;AND PROCEED			[317]
	SKIPLE	S.CMP		;IF /COMPARE,			[317]
	JRST	[SKIPN	S.FUFD	;[350] AND PRINTING A "UFD".
		 SKIPE NOCHRS	; AND AT START OF LINE		[317]
		 JRST  .+1	;NO--PROCEED			[317]
		 CAIE  C,"%"	;YES--IF WARNING		[317]
		 CAIN  C,"?"	; OR ERROR			[317]
		 TRO   F,R.SPLN	; SUPPRESS			[317]
		 CAIE  C,.CHCRT ;IF BLANK LINE, OR		[317]
		 CAIN  C," "	;IF BLANK,			[317]
		 TRO   F,R.SPLN	; SUPPRESS			[317]
		 JRST  .+1]	;AND PROCEED			[317]
	TRNE	F,R.SPLN	;IF SUPPRESSING,		[317]
	JRST	LCHR4		; HANDLE EXIT			[317]

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

	TRZE	F,R.LTAB	;CLEAR TAB MEMORY
	JRST	LCHR5		;IF SET, GO ISSUE ONE
	CAIE	C,.CHCRT	;[402] IS IT A CR?
	CAIN	C,.CHLFD	;[402] OR A LINE FEED?
	SKIPA			;[402] YES. DON'T TURN OFF THE FLAG.
	TLZ	F,L.CRLF	;[402] ELSE. RESET IT.
	AOS	NOCHRS		;ADVANCE CHARACTER POSITION COUNTER
	CAIE	C,.CHTAB	;SEE IF TAB
	JRST	LCHR3		;NO--PROCEED BELOW
	PUSH	P,T1		;YES--SAVE AN AC
	MOVE	T1,NOCHRS	;GET CHARACTER COUNTER
	ADDI	T1,7		;ROUND UP
	TRZ	T1,7		;ROUND OFF
	SUB	T1,NOCHRS	;FIND EXCESS
	ADDM	T1,NOCHRS	;UPDATE CHARACTER COUNTER
	SKIPE	T1		;IF NO FILLING
	SKIPN	S.SORT		; OR NOT /SORT
	JRST	LCHR2		; DON'T FILL IN SPACES
	MOVEI	C," "		;GET A SPACE
	PUSHJ	P,LCHR3		;OUTPUT IT
	SOJG	T1,.-1		;LOOP FOR ENOUGH SPACE
	MOVEI	C,.CHTAB	;RESTORE THE TAB
LCHR2:	POP	P,T1		;RESTORE AC

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

LCHR3:	SKIPN	S.DIRE		;[412] /NODIRECT?
	JRST	LCHR4		;[412] YES, NO LISTING OUTPUT
	CAIL	C,.CHLFD	;SEE IF VERTICAL MOTION
	CAILE	C,.CHFFD	; ..
	JRST	.+2		;NO
	SETZM	NOCHRS		;YES--CLEAR POSITION
	SOSG	B.LC+.BFCTR	;SEE IF ROOM IN THE BUFFER
	PUSHJ	P,LCHRW		;NO--GO WRITE THIS BUFFER
	IDPB	C,B.LC+.BFPTR	;YES--SEND CHARACTER
	SKIPN	NOCHRS		;SEE IF END OF LINE		[217]
	PUSHJ	P,LCHRWL	;YES--OUTPUT BUFFER IF APPROPRIATE
LCHR4:	TRNN	F,R.TYPE	;SEE IF NEED TO DUPLICATE	[317]
	POPJ	P,		;NO--RETURN
	PUSH	P,T1		;PRESERVE TEMP
	MOVE	T1,C		;GET CHARACTER
	PUSHJ	P,.TTCHR	;YES--TYPE IT (IF NOT SAME)
	POP	P,T1		;RESTORE TEMP
	POPJ	P,		;RETURN


LCHR5:	PUSH	P,C		;SAVE REQUESTED CHARACTER
	PUSHJ	P,LTAB1		;SEND A TAB
	POP	P,C		;RESTORE CHARACTER
	JRST	LCHR1		;PROCEED


LCHRWL:	TRNE	F,R.OUTL	;SEE IF OUTPUT APPROPRIATE FOR EACH END OF LINE
LCHRW:	OUT	LC,		;OUTPUT BUFFER
	  POPJ	P,		;OK--RETURN
LCHRWR:	PUSH	P,T1		;ERROR--SAVE SOME ACS
	PUSH	P,T2		; ..
	PUSH	P,T3		; ..
	PUSH	P,F		;SAVE F
	TRZ	F,R.OUTO!R.OUTD	;CLEAR OUTPUT FLAGS
	N$WRNX	(LOE,Listing device output error,)
	GETSTS	LC,T1		;GET ERROR STATUS
	PUSH	P,T1		;SAVE THE STATUS
	HRLI	T1,LC		;SUPPLY THE CHANNEL TOO
	PUSHJ	P,IOERM		;ISSUE REST OF ERROR STATUS
	POP	P,T1		;GET BACK THE STATUS
	TXZ	T1,IO.EOF!IO.ERR;CLEAR OFFENSIVE BITS
	SETSTS	LC,(T1)		;AND TELL MONITOR TO CLEAR ERROR STATUS
X$$LOE:	PUSHJ	P,.TCRLF##	;AND END LINE
	POP	P,F		;RESTORE THE ACS
	POP	P,T3		; ..
	POP	P,T2		; ..
	POP	P,T1		; ..
	POPJ	P,		;RETURN
	SUBTTL	MISCELLANEOUS I/O ROUTINES

;FNDIN  --  SUBROUTINE TO OPEN THE FIND INPUT FILES
;USES T1 - T4

FNDIN:	MOVEI	T1,F.BLK	;/FNDDAT SCAN BLOCK
	MOVEI	T2,F.OPN	;OPEN BLOCK
	MOVE	T3,[F.LEN,,F.LKP]  ;FILE LOOKUP BLOCK
	MOVEI	T4,F.PTH	;DIRECTORY PATH BLOCK
	PUSHJ	P,.STOPB##	;SETUP OPEN AND LOOKUP BLOCKS
	  JRST	[N$FAIL (FWI,/FNDDAT wildcards illegal)]
	MOVX	T1,.IOBIN	;FIND FILES ARE BINARY
	IORM	T1,F.OPN	;SET I/O MODE
	MOVEI	T1,B.DG		;DATA FILE INPUT BUFFER RING HEADER
	MOVEM	T1,F.OPN+.OPBUF	;SET IN OPEN BLOCK
	OPEN	DG,F.OPN	;OPEN FIND FILE INPUT DEVICE
	  JRST	E.OPF		;OPEN FAILURE
	MOVEI	T1,F.LEN-1	;LENGTH OF LOOKUP BLOCKS
	MOVEM	T1,F.LKP+.RBCNT	;SET IN LOOKUP BLOCK
	MOVE	T4,F.LKP+.RBPPN	;PRESERVE PATH ACCROSS LOOKUP
	MOVSI	T1,'FDF'	;DATA FILE TYPE
	MOVEM	T1,F.LKP+.RBEXT	;SET IN LOOKUP BLOCK
	LOOKUP	DG,F.LKP	;DO FILE LOOKUP
	  JRST	E.LKF		;LOOKUP FAILURE

;NOW GET THE POINTER FILE

	MOVEI	T1,B.PG		;POINTER FILE INPUT BUFFER RING HEADER
	MOVEM	T1,F.OPN+.OPBUF	;SET IN OPEN BLOCK
	OPEN	PG,F.OPN	;OPEN POINTER FILE DEVICE
	  JRST	E.OPF		;OPEN FAILURE HERE?
	MOVEM	T4,F.LKP+.RBPPN	;USE SAME PATH AS DATA FILE
	MOVSI	T1,'FPF'	;POINTER FILE EXTENSION
	MOVEM	T1,F.LKP+.RBEXT	;SET IN LOOKUP BLOCK
	LOOKUP	PG,F.LKP	;LOOKUP POINTER FILE
	  JRST	E.LKF		;LOOKUP FAILED HERE?

	INBUF	DG,1		;WANT ONLY ONE BUFFER FOR USETI
	INBUF	PG,		;BUT LOTS ARE OK FOR POINTER FILE

	SETZM	DGWRD		;INITIALLY ON WORD 0
	SETOM	DGBLK		;OF BLOCK 0 (I.E., BLOCK 1)
	TLZ	F,L.FEOF	;CLEAR END OF FILE FLAG
	POPJ	P,		;FIND INPUT DATA FILES READY TO BE READ
E.OPF:	MOVE	P3,F.BLK+.FXDEV	;GET FIND DEVICE
	N$FAIN	(OPF,Find File input OPEN failure for device )

E.LKF:	MOVEI	T1,'LKF'	;FIND LOOKUP ERROR PREFIX
	SETZ	T2,		;NO TEXT HERE
	PUSHJ	P,ERRORC	;TYPE OUT ERROR PREFIX
	TXNN	T1,JWW.FL	;WANT FIRST LINE INFO?
	JRST	LFERX		;NO, ABORT NOW
	HRRZ	T1,F.LKP+.RBEXT	;YES, GET LOOKUP ERROR CODE
	PUSHJ	P,.LKERR##	;TYPE OUT ERROR CODE
	MOVEI	T1,[ASCIZ/ Find input file /]
	PUSHJ	P,.TSTRG##	;TYPE OUT MORE ENGLISH TEXT
	MOVEI	T1,F.OPN	;ADDRESS OF OPEN BLOCK
	MOVEI	T2,F.LKP	;ADDRESS OF LOOKUP BLOCK
	PUSHJ	P,.TOLEB##	;TYPE OUT THE FILE SPEC
	JRST	LFERX		;CAP OFF THE ERROR
;OUTIN -- SUBROUTINE TO OPEN THE OUTPUT LISTING FILE
;USES T1-4

OUTIN:	MOVE	T1,[O.LZER,,O.BLK]  ;POINT TO OUTPUT SPEC	[165]
	MOVEI	T2,O.LC		;POINT TO OUTPUT OPEN BLOCK	[165]
	MOVE	T3,[LE.LC-1,,E.LC]  ;POINT TO OUTPUT ENTER BLOCK	[165]
	PUSHJ	P,.STOPN##	;SETUP BLOCKS			[165]
	  JRST	E.OWI		;ERROR IF WILD-CARDS		[165]
	MOVSI	T1,B.LC		;GET BUFFER HEADERS		[165]
	MOVEM	T1,O.LC+.OPBUF	;STORE IN OPEN BLOCK		[165]
	MOVE	T4,E.LC+.RBPPN	;SAVE OUTPUT PATH

	SKIPN	S.DIRE		;[412] /NODIRECT?
	JRST	OUTIN4		;[412] YES, CHECK FOR FNDBLD
	OPEN	LC,O.LC		;OPEN DEVICE			[165]
	  JRST	E.OPO
	MOVE	T1,O.BLK+.FXNAM	;ENTER IF NEEDED
	JUMPE	T1,OUTIN2
	MOVEI	T1,0		;LONG OFFSET			[224]
	TLNN	F,L.LENT	;IF SHORT ENTER,		[224]
	MOVEI	T1,2		; SET SHORT OFFSET		[224]
	ENTER	LC,E.LC(T1)	;ENTER FILE			[165]
	  JRST	E.OPE

OUTIN2:	OUTBUF	LC,0		;SETUP STANDARD BUFFERS		[165,312]

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

OUTIN4:	SKIPG	S.FBLD		;[412] /FNDBLD?
	JRST	OUTIN8		;[412] NO, SKIP THIS STUFF
	MOVEI	T1,.IOBIN	;[412] /FNDBLD FILES ARE BINARY
	MOVEM	T1,O.LC		;[412] SO SET IN OPEN BLOCK
	MOVSI	T1,B.DF		;[412] DATA FILE BUFFER HEADER
	MOVEM	T1,O.LC+.OPBUF	;[412] SET IN OPEN BLOCK
	OPEN	DF,O.LC		;[412] OPEN DATA FILE CHANNEL
	  JRST	E.OPO		;[412] OPEN FAILURE
	MOVEM	T4,E.LC+.RBPPN	;[420] USE SAME CREATION PATH
	MOVSI	T1,'FDF'	;[412] FIND DATA FILE EXTENSION
	HLLM	T1,E.LC+.RBEXT	;[424] SET IN ENTER BLOCK
	ENTER	DF,E.LC		;[412] ENTER THE FILE
	  JRST	E.OPE		;[412] ENTER FAILURE
	OUTBUF	DF,0		;[412] SET UP BUFFER RING

	MOVSI	T1,B.PF		;[412] POINTER FILE BUFFER HEADER
	MOVEM	T1,O.LC+.OPBUF	;[412] SET IN OPEN BLOCK
	OPEN	PF,O.LC		;[412] OPEN POINTER FILE CHANNEL
	  JRST	E.OPO		;[412] OPEN FAILURE
	MOVEM	T4,E.LC+.RBPPN	;[420] USE SAME CREATION PATH
	MOVSI	T1,'FPF'	;[412] FIND POINTER FILE EXTENSION
	HLLM	T1,E.LC+.RBEXT	;[424] SET IN ENTER BLOCK
	ENTER	PF,E.LC		;[412] ENTER POINTER FILE
	  JRST	E.OPE		;[412] ENTER FAILURE
	OUTBUF	PF,0		;[412] SETUP BUFFER RING

OUTIN8:	TRO	F,R.OUTD	;INDICATE OUTPUT INITIALIZED
	POPJ	P,		;RETURN
E.OWI:	TRZ	F,R.OUTD!R.OUTO!R.OUTL	;CLEAR LISTING FLAGS
	N$FAIL	(OWI,Output wildcard illegal)

E.OPO:
IFN FT$LPW,<			;				[321]
	MOVE	T1,O.BLK+.FXDEV	;SEE WHAT TYPE
	DEVCHR	T1,		;  OF DEVICE
	TXNN	T1,DV.LPT	;IS IT LINE PRINTER
	JRST	E.OPO1		;NO--FAIL
	TRON	F,R.LPTB	;YES--SECOND TIME?
	OUTSTR	[ASCIZ /LPT busy--waiting
/]
	MOVEI	T1,5		;SLEEP 5 SECONDS AND TRY AGAIN
	SLEEP	T1,		; ..
	JRST	OUTIN1		; ..
E.OPO1:
>;END IFN FT$LPW						[321]
	TRZ	F,R.OUTD!R.OUTO!R.OUTL  ;CLEAR LISTING FLAGS
	MOVE	P3,O.BLK+.FXDEV
	N$FAIN	(OPO,Output OPEN failed on device)
E.OPE:	TRZ	F,R.OUTD!R.OUTO!R.OUTL  ;CLEAR LISTING FLAGS
	MOVE	P3,O.BLK+.FXNAM
	N$FAIN	(OPE,Output ENTER failed on file)
;.TNEWL -- FORCE LISTING OUTPUT TO START OF LINE
;CALL:	PUSHJ	P,.TNEWL
;RETURNS AT BEGINNING OF LINE
;PRESERVES ALL ACS

.TNEWL::TRNE	F,R.OUTD	;SEE IF OUTPUT
	SKIPN	NOCHRS		;YES--SEE IF AT START OF LINE
	POPJ	P,		;YES--RETURN
	PJRST	LCRLF		;NO--OUTPUT END OF LINE


;TCHR -- TYPE CHARACTER ON TTY
;CALL:	MOVEI	T1,CHARACTER
;	PUSHJ	P,TCHR
;PRESERVES ALL ACS

TCHR:	PUSHJ	P,SAVTYP	;SAVE R.TYPE AND CLEAR IT
	MOVE	C,T1		;(TEMP)
	TRNN	F,R.OUTD	;SEE IF OUTPUT
	JRST	TTCHR1		;NOT OPEN--FORCE TO TTY
	PUSHJ	P,LCHR		;YES--LIST CHARACTER
.TTCHR:	TRNN	F,R.OUTO	;SEE IF LISTING ON CONSOLE
TTCHR1:	OUTCHR	T1		;NO--TYPE IT ALSO
	POPJ	P,		;RETURN


;SAVTYP -- ROUTINE TO SAVE R.TYPE ON THE STACK AND CLEAR IT
;	THIS AVOIDS TYPING TITLES AND DOUBLE LISTINGS
;CALL:	PUSHJ	P,SAVTYP
;RETURNS CPOPJ.  SETS STACK TO RESTORE R.TYPE WHEN CALLER
;	RETURNS (CPOPJ OR CPOPJ1)
;PRESERVES ALL ACS

SAVTYP:	EXCH	T1,(P)		;GET CALLING PC
	MOVEM	T1,1(P)		;STASH AWAY FOR THE NEXT CALL
	MOVE	T1,(P)		;RESTORE T1
	SETZM	(P)		;FLAG R.TYPE=0
	TRZE	F,R.TYPE	;CLEAR R.TYPE
	SETOM	(P)		;FLAG THAT IT WAS ON
	PUSHJ	P,@1(P)		;CALL BACK TO CALLER
	  JRST	.+2		;HANDLE NON-SKIP
	AOS	-1(P)		;HANDLE SKIP
	SKIPE	(P)		;TEST MEMORY OF FLAG
	TRO	F,R.TYPE	;RESTORE R.TYPE
	POP	P,(P)		;DISCARD MEMORY
	POPJ	P,		;RETURN TO CALLER'S CALLER
	SUBTTL	SUBROUTINES FOR FIND FILE(S) OUTPUT

;DOFND  --  WRITE FILE INTO FIND FILES
;CALL FROM ANALYZ WITH F--- AREA SET UP WITH FILE INFO.
;
;THERE ARE TWO FIND FILES, THE POINTER FILE AND THE DATA FILE.
;
;THE POINTER FILE HAS ONLY FILENAME/EXTENSIONS AND IS USED TO
;SEE WHERE TO GO WITHIN DATA FILE FOR FILE INFORMATION. FORMAT IS:
;
;	0/	FILE NAME IN SIXBIT
;	1/	EXTENSION IN SIXBIT,,0
;
;THE DATA FILE HAS ALL THE PERTINENT INFORMATION ABOUT THE ACTUAL
;FILE. FORMAT IS:
;
;	00/	NODE NAME IN SIXBIT (RESERVED FOR FUTURE)
;	01/	DEVICE/STRUCTURE NAME IN SIXBIT
;	02/	UFD
;	03/	SFD 1
;	04/	SFD 2
;	05/	SFD 3
;	06/	SFD 4
;	07/	SFD 5
;	10/	FILE NAME
;	11/	EXTENSION,,PROTECTION & I/O MODE (LH OF .RBPRV)
;	12/	WORD COUNT
;	13/	CREATION TIME
;	14/	ACCESS TIME
;	15/	VERSION
;	16/	0 (RESERVED FOR FUTURE)
;	17/	CHECKSUM

DOFND:	MOVEI	T1,0		;NODE NAME (RESERVED)
	PUSHJ	P,DFPUT		;WORD 0
	MOVE	T1,FSTR		;FILE STRUCTURE
	PUSHJ	P,DFPUT		;WORD 1
	SKIPN	T1,UFDPPN	;[454] UFD/PATH POINTER
	JRST	DOFND1		;[454] BLANK, WRITE OUT 0'S
	TLNN	T1,-1		;UFD OR PATH POINTER?
	JRST	DOFND2		;PATH POINTER
DOFND1:	PUSHJ	P,DFPUT		;[454] WORD 2
	MOVEI	T1,0		;NO SFD'S
	PUSHJ	P,DFPUT		;WORD 3
	PUSHJ	P,DFPUT		;WORD 4
	PUSHJ	P,DFPUT		;WORD 5
	PUSHJ	P,DFPUT		;WORD 6
	PUSHJ	P,DFPUT		;WORD 7
	JRST	DOFND4		;FINISH RECORD
DOFND2:	MOVEI	T2,.PTPPN(T1)	;ADDRESS OF UFD/SFD'S (6 WORDS MAX)
	HRLI	T2,-6		;UFD + 5 SFD'S
DOFND3:	SKIPN	T1,(T2)		;GET UFD/SFD
	SOJ	T2,		;0 TERMINATES LIST
	PUSHJ	P,DFPUT		;WORDS 2 - 7
	AOBJN	T2,DOFND3	;LOOP FOR WHOLE PATH

DOFND4:	MOVE	T1,FNAM		;FILE NAME
	PUSHJ	P,DFPUT		;WORD 10
	PUSHJ	P,PFPUT		;POINTER FILE WORD 0
	MOVE	T1,FPRV		;SPECIAL PROTECTION CODE
	LSH	T1,^D9		;POSITION PROTECTION
	SKIPN	FPRV		;SPECIAL PROTECTION CODE?
	HLRZ	T1,FCRE		;NO, GET FROM FILE BLOCK
	SKIPGE	FPRV		;IS PROTECTION UNKNOWN?
	SETZ	T1,		;YES
	HLL	T1,FEXT		;EXTENSION,,PROTECTION+I/O MODE
	PUSHJ	P,DFPUT		;WORD 11
	ANDCMI	T1,-1		;EXTENSION,,0
	PUSHJ	P,PFPUT		;POINTER FILE WORD 1
	MOVE	T1,FLEN		;FILE SIZE (WORDS)
	PUSHJ	P,DFPUT		;WORD 12
	LDB	T1,[POINTR FCRE,RB.CRT]  ;CREATION TIME
	IMULI	T1,^D60*^D1000	;(.CNVDT WANTS MILLISECONDS)
	LDB	T2,[POINTR FCRE,RB.CRD]  ;CREATION DATE
	LDB	T4,[POINTR FEXT,RB.CRX]  ;CREATION DATE EXTENSION
	DPB	T4,[POINT 3,T2,23]  ;REST OF CREATION DATE
	PUSHJ	P,.CNVDT##	;CONVERT TO UNIVERSAL DATE/TIME
	PUSHJ	P,DFPUT		;WORD 13
	MOVEI	T1,0		;ACCESS TIME UNKNOWN
	LDB	T2,[POINTR FEXT,RB.ACD]  ;ACCESS DATE
	PUSHJ	P,.CNVDT##	;CONVERT TO UNIVERSAL DATE/TIME
	PUSHJ	P,DFPUT		;WORD 14
	MOVE	T1,FVER		;VERSION WORD
	PUSHJ	P,DFPUT		;WORD 15
	SETZ	T1,		;0
	PUSHJ	P,DFPUT		;WORD 16
	PUSHJ	P,GCHECK	;GET FILE CHECKSUM
	PJRST	DFPUT		;WORD 17 AND END OF RECORD
;DFPUT  --  WRITE ONE WORD INTO DATA FILE
;CALL WITH T1/DATA WORD
;RETURN CPOPJ0

DFPUT:	SOSGE	B.DF+.BFCTR	;ROOM?
	JRST	DFPUT2		;NO
	IDPB	T1,B.DF+.BFPTR	;YES
	POPJ	P,		;RETURN

DFPUT2:	OUT	DF,		;GET NEXT BUFFER
	JRST	DFPUT		;AND STUFF WORD IN
DFERR:	GETSTS	DF,P3		;I/O ERROR, I/O STATUS
	HRLI	P3,DF		;AND ASSOCIATED CHANNEL
	N$FAIO	(DOE,Find Data File output error,)


;PFPUT  --  WRITE ONE WORD INTO POINTER FILE
;CALL WITH T1/DATA WORD
;RETURN CPOPJ0

PFPUT:	SOSGE	B.PF+.BFCTR	;ROOM?
	JRST	PFPUT2		;NO
	IDPB	T1,B.PF+.BFPTR	;YES
	POPJ	P,		;RETURN

PFPUT2:	OUT	PF,		;GET NEXT BUFFER
	JRST	PFPUT		;AND STUFF WORD IN
PFERR:	GETSTS	PF,P3		;I/O ERROR, I/O STATUS
	HRLI	P3,PF		;AND I/O CHANNEL
	N$FAIO	(POE,Find Pointer File output error,)
;DFGET  --  READ ONE WORD FROM DATA FILE
;RETURNS NEXT DATA WORD IN T1

DFGET:	SOSGE	B.DG+.BFCTR	;ANY WORDS LEFT?
	JRST	DFGET2		;NO, GO TO NEXT BUFFER
	ILDB	T1,B.DG+.BFPTR	;READ NEXT WORD
	AOS	DGWRD		;REMEMBER HOW FAR INTO BLOCK WE HAVE READ
	POPJ	P,		;RETURN

DFGET2:	AOS	DGBLK		;REMEMBER HOW MANY BLOCK WE HAVE READ
	IN	DG,		;READ NEXT BUFFER
	JRST	DFGET		;AND RETURN THE FIRST WORD
	STATO	DG,IO.EOF	;REACH END OF FILE?
	JRST	DFGET4		;NO, I/O ERROR
	TLO	F,L.FEOF	;YES, NOTE EOF REACHED
	SETZ	T1,		;RETURN ZILCH
	POPJ	P,		;RETURN IT NOW

DFGET4:	PUSHJ	P,.PSH4T##	;SAVE THE T ACS
	GETSTS	DG,T1		;GET THE I/O ERROR STATUS
	PUSH	P,T1		;SAVE A COPY
	N$WRNX	(DFI,Find Data File input error,)
	MOVE	T1,0(P)		;FETCH A COPY OF THE STATUS
	HRLI	T1,DG		;SET THE I/O CHANNEL TOO
	PUSHJ	P,IOERM		;ISSUE I/O STATUS
X$$DFI:	PUSHJ	P,.TCRLF##	;CAP OFF ERROR MESSAGE
	POP	P,T1		;RESTORE I/O STATUS
	TXZ	T1,IO.ERR	;CLEAR OUT ERROR BITS
	SETSTS	DG,(T1)		;AND TELL MONITOR TO CONTINUE WITH I/O
	PUSHJ	P,.POP4T##	;RESTORE TEMP ACS
	JRST	DFGET		;AND PROCESS WHAT DATA WE GOT
;PFGET  --  READ ONE WORD FROM POINTER FILE
;RETURNS NEXT POINTER WORD IN T1

PFGET:	SOSGE	B.PG+.BFCTR	;ANY WORDS LEFT?
	JRST	PFGET2		;NO, GO TO NEXT BUFFER
	ILDB	T1,B.PG+.BFPTR	;READ NEXT WORD
	POPJ	P,		;RETURN

PFGET2:	IN	PG,		;READ NEXT BUFFER
	JRST	PFGET		;AND RETURN THE FIRST WORD
	STATO	PG,IO.EOF	;REACH END OF FILE?
	JRST	PFGET4		;NO, I/O ERROR
	TLO	F,L.FEOF	;YES, NOTE EOF REACHED
	SETZ	T1,		;RETURN ZILCH
	POPJ	P,		;RETURN IT NOW

PFGET4:	PUSHJ	P,.PSH4T##	;SAVE THE T ACS
	GETSTS	PG,T1		;READ I/O STATUS
	PUSH	P,T1		;SAVE A COPY
	N$WRNX	(PFI,Find Pointer File input error,)
	MOVE	T1,0(P)		;RETRIEVE A COPY OF I/O STATUS
	HRLI	T1,PG		;AND I/O CHANNEL IN QUESTION
	PUSHJ	P,IOERM		;ISSUE I/O STATUS MESSAGE
X$$PFI:	PUSHJ	P,.TCRLF##	;CAP OFF ERROR MESSAGE
	POP	P,T1		;RESTORE I/O STATUS
	TXZ	T1,IO.ERR	;CLEAR OUT ERROR BITS
	SETSTS	PG,(T1)		;AND TELL MONITOR TO CONTINUE WITH I/O
	PUSHJ	P,.POP4T##	;RESTORE TEMP ACS
	JRST	PFGET		;AND PROCESS WHAT DATA WE GOT
;MAKBUF -- ROUTINE TO MAKE A BUFFER RING
;CALL:	HRLI	T1,NUMBER OF BUFFERS
;	HRRI	T1,SIZE OF EACH (INCLUDING HEADERS)
;	MOVEI	T2,LOCATION OF BUFFER HEADER
;	PUSHJ	P,MAKBUF
;RETURNS UNLESS NOT ENOUGH CORE

MAKBUF:	PUSHJ	P,.SAVE2##	;SAVE P1 AND P2
	HLRZ	P1,T1		;GET BUFFER COUNT
	MOVEI	T3,(T1)		;GET BUFFER SIZE
	TLZ	T1,-1		;CLEAR JUNK
	IMUL	T1,P1		;GET TOTAL SPACE
	PUSHJ	P,GETCOR	;GET CORE AT .JBFF
	MOVE	P2,T1		;SAVE OLD .JBFF
	AOS	T1		;POINT TO LINK WORD
	MOVE	T4,T1		;AND MAKE A COPY
	HRLI	T4,-2(T3)	;PUT SIZE IN POINTERS		[156]

MAKBF1:	ADD	T4,T3		;ADVANCE TO NEXT BUFFER
	MOVEM	T4,(T1)		;STORE POINTER IN PREVIOUS BUFFER
	MOVE	T1,T4		;STEP TO NEXT BUFFER
	SOJG	P1,MAKBF1	;LOOP UNTIL DONE
	SUB	T1,T3		;BACKUP TO LAST POINTER
	HRRI	T4,1(P2)	;GET FIRST BUFFER LINK WORD ADDRESS
	MOVEM	T4,(T1)		;STORE POINTER TO FIRST BUFFER
	HRLI	T4,(1B0)	;SET USE BIT
	MOVEM	T4,(T2)		;STORE IN HEADER
	POPJ	P,		;RETURN
;GETCOR -- ROUTINE TO GET SOME CORE AT .JBFF
;WILL EXPAND LOW SEG IF NECESSARY
;CALL:	MOVEI	T1,AMOUNT NEEDED
;	PUSHJ	P,GETCOR
;RETURN WITH T1=START OF AREA (OLD .JBFF)

GETCOR:	PUSH	P,T2		;SAVE TEMP
	MOVE	T2,T1		;GET ARG
	MOVE	T1,.JBFF	;SAVE OLD .JBFF
	ADDM	T2,.JBFF	;ADVANCE .JBFF

GTCOR1:	MOVE	T2,.JBFF	;GET AMOUNT NEEDED
	CAMG	T2,.JBREL	;SEE IF MORE THAN WE HAVE
	JRST	GTCOR2		;NO--OK TO RETURN
	CORE	T2,		;TELL MONITOR
	  JRST	E.NEC		;ERROR--TELL USER
	JRST	GTCOR1		;LOOP TO VERIFY IT'S OK

GTCOR2:	POP	P,T2		;RESTORE TEMP
	POPJ	P,		;RETURN

E.NEC:	MOVE	P3,.JBFF	;GET VALUE NEEDED
	N$FAID	(NEC,Not enough core--need)
	SUBTTL	STORAGE

	XLIST		;LITERALS
	LIT
	LIST

	RELOC

OFFSET:	BLOCK	1		;STARTING ADDRESS OFFSET
ZCOR:!			;START OF AREA TO ZERO ON INITIAL LOAD

PDLST:	BLOCK	LN$PDL+1	;PUSH DOWN LIST
SAVCOR:	BLOCK	1		;LENGTH OF CORE ORIGINALLY
ORGFF:	BLOCK	1		;ORIGINAL .JBFF
H.ZER:!			;START OF AREA FOR OUTPUT PARAMETERS
O.LC:	BLOCK	3		;LISTING OPEN BLOCK		[165]
E.LC:	BLOCK	1+.RBEST	;LISTING ENTER BLOCK		[165]
	LE.LC==.-E.LC
B.LC:	BLOCK	3		;DIRECTORY FILE OUTPUT BUFFER RING HEADER
B.DF:	BLOCK	3		;DATA FILE OUTPUT BUFFER RING HEADER
B.PF:	BLOCK	3		;POINTER FILE OUTPUT BUFFER RING HEADER
B.DG:	BLOCK	3		;DATA FILE INPUT BUFFER RING HEADER
DGBLK:	BLOCK	1		;LOGICAL DATA BLOCK WITHIN DATA FILE
DGWRD:	BLOCK	1		;WORD WITHIN BLOCK WITHIN DATA FILE
B.PG:	BLOCK	3		;POINTER FILE INPUT BUFFER RING HEADER
F.OPN:	BLOCK	3		;FIND INPUT OPEN BLOCK
F.LKP:	BLOCK	.RBEST+1	;FIND INPUT FILE LOOKUP BLOCK
	F.LEN==.-F.LKP
F.PTH:	BLOCK	.PTMAX		;FIND INPUT PATH BLOCK

LNPP:	BLOCK	1		;LINES LEFT TO GO ON PAGE
PAGCNT:	BLOCK	1		;PAGE COUNTER
SVJBFF:	BLOCK	1		;INPUT SIDE .JBFF

LWIFIR:	BLOCK	1		;LAST .WIFIR
FRCLOK:	BLOCK	1		;.NE. 0 THEN LOOKUP REQUIRED FOR THIS FILE


H.ZER1:!		;START OF AREA FOR ONE OUTPUT
DCHBLK:	BLOCK	.DCSNM+1	;DSKCHR BLOCK

FOBLK:	BLOCK	.FOMAX		;FILOP. BLOCK
	FSTR==FOBLK+.FODEV	;ADDRESS OF "FILE STRUCTURE"

LBLOCK:	BLOCK	LN$RIB		;EXTENDED LOOKUP BLOCK

FRVER:	BLOCK	1		;RIB VERSION IF DIFF. FROM FILE
FPRV:	BLOCK	1		;FILE PRIVILEGE
FRIBLK:	BLOCK	1		;RIB BLOCK NUMBER		[200]

MTNAME:	BLOCK	1		;DEVICE NAME OF MAG-TAPE	[166]
MTXDEV:	BLOCK	2		;SAVED ORIGINAL DEVICE SPEC BI-WORD
ABORTI:	BLOCK	1		;SETOM'ED IF SHOULD ABORT INPUT
BFHD:	BLOCK	3		;BUFFER HEADERS FOR INPUT	[166]

H.ZERX:	BLOCK	.-H.ZER1	;REGION FOR PREVIOUS FILE
H.ZERY:
	BLOCK	.PTMAX		;  ..
MTPATH:	BLOCK	.PTMAX		;FOR PATH ON TAPES
MTSVFF:	BLOCK	1		;.JBFF AT FIRST MTOPEN
MTFBSZ:	BLOCK	1		;TAPE BLOCKSIZE (PLUS 3 OVERHEAD WORDS)

H.MZER:!		;START OF AREA FOR ONE MT SAVE SET
MTSVHD:	BLOCK	1		;LAST WORD READ FOR FAILSAFE MODE
MTSVVR:	BLOCK	1		;VERSION,,TAPE NUMBER
MTSVWD:	BLOCK	1		;SAVE HEADERS DURING BACKUP TAPES
MTSVCT:	BLOCK	1		;COUNTER FOR BACKUP DATA READS
LASI:	BLOCK	1		;LAST FILE FOUND
LASDIR:	BLOCK	1		;LAST DIRECTORY LISTED
LASSTR:	BLOCK	1		;LAST STRUCTURE LISTED
LASPTH:	BLOCK	.PTMAX		;ROOM FOR PREVIOUS PATH
THSPTH:	BLOCK	.PTMAX		;ROOM FOR CURRENT PATH
SUBDIR:	BLOCK	1		;SUBTOTAL DIRECTORY
SUBSTR:	BLOCK	1		;SUBTOTAL STRUCTURE
SUBPTH:	BLOCK	.PTMAX		;SUBTOTAL PATH
SUBEND==.-1
NOFIL:	BLOCK	1		;NUMBER OF FILES IN UFDS SCANNED
TOT:!			;GRAND TOTALS
NOFILF:	BLOCK	1		;NUMBER OF FILES ACTUALLY USED
NOFILR:	BLOCK	1		;NUMBER OF LOOKUP ERRORS
NOBLKS:	BLOCK	1		;NUMBER BLOCKS IN FILES PRINTED
NOWRDS:	BLOCK	1		;[414] NUMBER WORDS IN FILES PRINTED
TCHKSM:	BLOCK	1		;GRAND CHECKSUM
SUBT:!			;SUB TOTALS
SNFILF:	BLOCK	1		; (MUST PARALLEL AND IMMED. FOLLOW TOT)
SNFILR:	BLOCK	1
SNBLKS:	BLOCK	1
SNWRDS:	BLOCK	1		;[414] WORD COUNT
SCHKSM:	BLOCK	1

NUMDIR:	BLOCK	1		;NUMBER OF DIRECTORIES
NUMSUB:	BLOCK	1		;NUMBER OF SUBTOTALS
CHKSUM:	BLOCK	1		;CHECKSUM ACCUMULATOR
NOCHRS:	BLOCK	1		;CURRENT HORIZONTAL POSITION
LSTSTR:	BLOCK	1		;STR TO LIST IF NEEDED
LSTDIR:	BLOCK	1		;DIRECTORY TO LIST IF NEEDED
NXUCNT:	BLOCK	1		;COUNT OF UFDS FOUND
NXSCNT:	BLOCK	1		;COUNT OF SFDS MISSED
NXFCNT:	BLOCK	1		;COUNT OF FILES FOUND
NXFI:	BLOCK	1		;I OF LAST NON-EX FILE
H.EMZR==.-1
KCHKSM:	BLOCK	1		;[345] TEMP CHKSUM
MTFLCT:	BLOCK	1		;COUNT DOWN ON MT FROM /FILE:N
;BACKUP/FRS FORMAT HEADER STORAGE AREAS

B$GTYP:	BLOCK	1		;RH=TYPE, LH=-1 IF FRS
B$GBNM:	BLOCK	1		;BLOCK NUMBER
B$GRTN:	BLOCK	1		;RELATIVE TAPE NUMBER
B$GFLG:	BLOCK	1		;FLAGS
B$GCHK:	BLOCK	1		;CHECKSUM
B$GSIZ:	BLOCK	1		;DATA SIZE
B$GLND:	BLOCK	1		;OVERHEAD WORDS
	BLOCK	5		;(FUTURE) WASTE SPACE

;LABEL HEADER

B$LBL:!
B$LCDT:	BLOCK	1		;CREATION DATE/TIME
B$LFRM:	BLOCK	1		;FORMAT STYLE
B$LFVR:	BLOCK	1		;FRS/BACKUP VERSION NUMBER
B$LMTY:	BLOCK	1		;MONITOR TYPE
B$LSVR:	BLOCK	1		;SYSTEM VERSION
B$LAPR:	BLOCK	1		;APR S/N WRITTEN ON
B$LDEV:	BLOCK	1		;DEVICE WRITTEN ON
B$LMTC:	BLOCK	1		;MTCHR.
B$LREL:	BLOCK	1		;REEL
B$LDDT:	BLOCK	1		;DESTROY DATE/TIME
	BLOCK	^D10		;WASTE SPACE
B$LTIM:	BLOCK	1		;TIME
B$LDAT:	BLOCK	1		;DATE
B$LDSD:	BLOCK	1		;DESTROY DATE
B$LCMT:	BLOCK	16		;COMMENT
	BLOCK	1		;PROTECT ASCIZ
;START/END OF SAVE SET

B$SSS:!
B$SCDT:	BLOCK	1		;SAVE DATE/TIME
B$SFMT:	BLOCK	1		;TAPE FORMAT
B$SVER:	BLOCK	1		;BACKUP/FRS VERSION
B$SMTY:	BLOCK	1		;MONITOR TYPE
B$SSVR:	BLOCK	1		;SYSTEM VERSION
B$SAPR:	BLOCK	1		;SAVE APR S/N
B$SDEV:	BLOCK	1		;DEVICE SAVED ON
B$SMTC:	BLOCK	1		;SAVE MTCHR.
	BLOCK	^D12		;WASTE SPACE
B$SSNM:	BLOCK	5		;SYSTEM NAME
B$STIM:	BLOCK	1		;SAVE TIME
B$SDAT:	BLOCK	1		;SAVE DATE
B$SMOD:	BLOCK	1		;MODE
B$STRK:	BLOCK	1		;TRACKS
B$SNAM:	BLOCK	1		;SAVE SET NAME
B$SCMT:	BLOCK	4		;COMMENT
	BLOCK	1		;PROTECT ASCIZ

;DIRECTORY RECORD

B$DIR:!
B$UPCH:	BLOCK	1		;PATH CHECKSUM
B$ULVL:	BLOCK	1		;DIRECTORY LEVEL (0=UFD)
B$USTA:	BLOCK	^D12		;DIRECTORY NAME
	BLOCK	6		;WASTE SPACE
B$USTR:	BLOCK	1		;STRUCTURE OF DIRECTORY

;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE

;FILE RECORD

B$FIL:!
B$FPCH:	BLOCK	1		;PATH CHECKSUM
B$FRDW:	BLOCK	1		;RELATIVE DATA WORD
B$FPTH:	BLOCK	^D12		;REDUNDANT PATH
	BLOCK	6		;WASTE SPACE
B$FSTR:	BLOCK	1		;STRUCTURE
B$FNAM:	BLOCK	1		;NAME
B$FEXT:	BLOCK	1		;EXTENSION
B$FUFD:	BLOCK	1		;UFD
B$FRBN:	BLOCK	1		;RELATIVE BLOCK NUMBER
B$FCHK:	BLOCK	1		;CHECKSUM
B$FNDB:	BLOCK	1		;NUMBER OF DATA BLOCKS
B$FNDW:	BLOCK	1		;NUMBER OF DATA WORDS
B$FLVL:	BLOCK	1		;FILE DIRECTORY LEVEL

;END OF VOLUME

B$EOV:	BLOCK	^D20		;WASTE SPACE

;COMMENT

B$CMT:	BLOCK	^D20		;COMMENT
	BLOCK	1		;PROTECT ASCIZ

;VARIOUS "DATA" REGION BLOCKS

B$BNAM:	BLOCK	^D30		;FILE PATH
B$BATT:	BLOCK	^D50		;FILE ATTRIBUTES
B$BSYS:	BLOCK	^D6		;SYSTEM NAME
B$BSSN:	BLOCK	^D7		;SAVE SET NAME

;[412] MULTI-VOLUME HOLD WORDS FOR VERIFICATION

B$HRTN:	BLOCK	1		;[412] VERIFICATION OF B$GRTN
B$HSSN:	BLOCK	7		;[412] VERIFICATION OF B$BSSN

H.EZER==.-1
S.MIN:!			;START OF AREA FOR COMMAND ACCUMULATION
S.ACCS:	BLOCK	1		;VALUE OF /ACCESS SWITCH
S.ACCT:	BLOCK	1		;/ACCOUNT SWITCH
S.ALC:	BLOCK	1		;/ALLOCAT SWITCH
S.AUT:	BLOCK	1		;/AUTHOR SWITCH			[174]
S.CHK:	BLOCK	1		;/CHECKSUM SWITCH
S.CMP:	BLOCK	1		;/COMPARE SWITCH
S.DODV:	BLOCK	1		;CODE FOR DEFAULT OUTPUT DEVICE
S.DTL:	BLOCK	1		;/DETAIL SWITCH
S.DIRE:	BLOCK	1		;[412] /DIRECT SWITCH
S.DTA:	BLOCK	1		;/DTA SWITCH (.GT. 0 LIST IN SHORT DTA FORMAT)
S.EOT:	BLOCK	1		;/EOT SWITCH
S.ERLO:	BLOCK	1		;[432] /ERLOG SWITCH
S.FILE:	BLOCK	1		;/FILES:N SWITCH
S.FIND:	BLOCK	1		;/FIND SWITCH
S.FLSD:	BLOCK	1		;[412] /FLSDIR SWITCH
S.FBLD:	BLOCK	1		;[412] /FNDBLD SWITCH
S.HDSD:	BLOCK	1		;[412] /HDSDIR SWITCH
S.IND:	BLOCK	1		;/INDIRECT SWITCH
S.MARK:	BLOCK	1		;[422] /MARKS SWITCH
S.MVOL:	BLOCK	1		;[412] /MVOLUME SWITCH
S.PRDE:	BLOCK	1		;/PRDEVICE SWITCH		[174]
S.PRDI:	BLOCK	1		;/PRDIRECTORY SWITCH		[174]
S.PRVE:	BLOCK	1		;[412] /PRVERSION SWITCH
S.RETR:	BLOCK	1		;[416] /RETRY SWITCH
S.REWS:	BLOCK	1		;/REWINDS SWITCH
S.SORT:	BLOCK	1		;/SORT SWITCH
S.SUM:	BLOCK	1		;/SUMMARY SWITCH
S.TITL:	BLOCK	1		;-1,1=TITLE, 0=2=NO TITLE
S.TMPC:	BLOCK	1		;/TMPCOR (.GT. 0 LIST IN SHORT TMPCOR FORMAT)
S.UNIT:	BLOCK	1		;/UNITS SWITCH
S.WDTH:	BLOCK	1		;VALUE OF /WIDTH SWITCH
S.WORD:	BLOCK	1		;/WORD SWITCH
S.LENT:	BLOCK	1		;[351] USED TO HOLD THE MAXIMUN LENGTH OF AN ENTRY.
FLFSUM:	BLOCK	1		;FORCE SUMMARY IF 1		[160]
S.EMIN==.-1

S.ZER:!
S.FUFD:	BLOCK	1		;[350] USED WITH /COMPARE TO FORCE
				;[350] THE PRINTING OF UFD DIRECTORIES
				;[350] EG: DIRECTORY [1,1]/COMPARE
O.ZER:!				;START OF OUTPUT SPEC STORAGE
O.BLK:	BLOCK	.FXLEN		;OUTPUT FILE SPEC BLOCK
O.LZER==.-O.ZER

;THE FIND (/FNDDAT) INPUT SCAN BLOCK

F.BLK:	BLOCK	.FXLEN		;FIND FILE SPEC BLOCK

I.INZR:	BLOCK	1		;POINTER TO START OF INPUT SPEC
I.NXZR:	BLOCK	1		;POINTER TO NEXT INPUT SPEC STORAGE
I.NXRD:	BLOCK	1		;POINTER TO NEXT INPUT SPEC TO DO
FLAGS:	BLOCK	1		;COPY OF F DURING SCAN
FLAGSM:	BLOCK	1		;DITTO--MASKS
MXWDTH:	BLOCK	1		;MAX WIDTH IF /W


	BLOCK	2		;ROOM FOR BUFFER HEADERS	[225]
DIRB:	BLOCK	LN$BLK		;DIRECTORY BLOCK FOR DECTAPE/ETC.

IFN FT$MTL,<
M.MTLB:	BLOCK	.TPLEN		;[425] LABEL PARAMETERS AREA
MTAEOF:	BLOCK	1		;[441] NEW FILE FLAG
>;END INF FT$MTL

S.EZER==.-1
EZCOR==.-1		;END OF AREA TO ZERO

	END	DIRECT
	END