;<EXEC>X3CMD.MAC;12     6-OCT-75 15:44:06    EDIT BY PLUMMER
;1.54

;<EXEC>X3CMD.MAC;11    19-SEP-75 09:46:28    EDIT BY PLUMMER
; PARC CHANGES TO ARCHIVE STATUS
;<EXEC>X3CMD.MAC;7    17-MAR-75 11:32:53    EDIT BY PLUMMER
; .DIRECT BECOMES ..DIRE  FOR MACRO 50
;<EXEC>X3CMD.MAC;4     6-JAN-75 17:59:49    EDIT BY PLUMMER
; MAKE DIRECTORY NAME PRINTER WORK FOR DIR <*>*.*;* CASE
;<EXEC>X3CMD.MAC;3     6-JAN-75 10:16:34    EDIT BY PLUMMER
; MORE DECTAPE DATE CURES
;<EXEC>X3CMD.MAC;2     5-JAN-75 20:15:45    EDIT BY PLUMMER
; NEW DEC DATE STUFF (AGAIN) AT DTADR1
;<EXEC>X3CMD.MAC;3     2-JAN-75 12:24:39    EDIT BY PLUMMER

;1.53
;<EXEC>X3CMD.MAC;2    31-DEC-74 11:39:20    EDIT BY PLUMMER
; "ARCHIVE STATUS" ALLOWS STARS (PARC)
; "ARCHIVE FILE" DEFAULTS TO LOWEST VERSION (PARC)
; MAKE DIRECTORY TABLE LENGTH MAXIMUM (PARC)
;<EXEC>X3CMD.MAC;1     2-DEC-74 10:19:54    EDIT BY PLUMMER

; 1.52
;<N-EXEC>X3CMD.MAC;10    26-JUL-74 17:37:27    EDIT BY PLUMMER
; SWITCH ARCHIVE LOOKUP PROGRAM TO <SYSTEM>
;<N-EXEC>X3CMD.MAC;6    19-MAR-74 12:41:00	EDIT BY PLUMMER
; MAKE DIFFERENCES IN AUTHOR AND EPHEMERALITY CAUSE PRINTING ON
;  SEPARATE LINES
;<N-EXEC>X3CMD.MAC;5    31-JAN-74 16:56:00	EDIT BY PLUMMER
; ALLOW FOR NEW DEC DECTAPE DATE FORMAT
;<N-EXEC>X3CMD.MAC;4    25-JAN-74 11:56:27	EDIT BY PLUMMER
; NEW "ARCHIVE" COMMANDS
;<N-EXEC>X3CMD.MAC;3     4-DEC-73 16:52:36	EDIT BY PLUMMER
; FLUSH EOL'S IN FAVOR OF CRLF'S SO FTP WORKS TO 360'S
;<EXEC>X3CMD.MAC;29     2-OCT-73 13:11:48	EDIT BY PLUMMER

; 1.51
; FIX SORT OF 2-PART DIRECTORIES
; FIX "2ND ARCHIVE TAP #" TYPEOUT BUG
; ADD PRINTING OF ;S FOR SCRATCH FILES AND ;E FOR EPHEMERAL FILES
; FLUSH SPACES IN CRAM MODE FOR TIME FIELD OF UNREAD FILE
; INCLUDE "PGS" IN "DIR, EVERY"
; "AUTHOR" SUBBCOMMAND OF "DIRECTORY"
; SUPER CLEANUP
; ADD TAD TO DIR LIST ON OTHER THAN COJFN (SRI)

; 1.50

; 1.49

; 1.48
; FDBREF CHANGED TO FDBRED TO MATCH 1.30 MONITOR
; DIR PRINTS "NEVER READ"  INSTEAD OF NOV 18,1858

; 1.47
; "ARCHIVE" COMMAND

; 1.46
; QFD TYPES DIRECTORY UNLESS "NO (HEADING)" SUBCOM. LOST IN <*>X.Y;Z
; "DIRECTORY" ONLY PRINTS DIRECTORY AND HEADING WHEN IT CHANGES

; PDP-10 TENEX EXECUTIVE

;SEE XMAIN.MAC FOR ASSEMBLY

	.DIRECTIVE XSRCVN %X3
	%X3==%X3


;ROUTINES TO DECODE AND EXECUTE SPECIFIC COMMANDS.
;THIS FILE CONTAINS LONG AND NOT PARTICULARLY COMMON
;COMMANDS, SEGREGATED FROM THE OTHER, SHORTER, COMMAND
;ROUTINES TO REDUCE THE EXEC'S NORMAL WORKING PAGE SET.

;CONTENTS
;	ARCHIVE
;	QFD
;	DIRECTORY

;DEFINITIONS REQUIRED FOR DIRECTORY LISTER

DIRORG=760000		;BASE OF 8-PAGE AREA WHERE DIRECTORY IS MAPPED

;DIRECTORY FIXED ALLOCATION AREA
;DIRLCK==DIRORG+0
;DIRUSE==DIRORG+1
DIRNUM==DIRORG+2		;DIRECTORY NUMBER
SYMBOT==DIRORG+3		;BEGINNING OF SYMBOL TABLE
SYMTOP==DIRORG+4		;END OF SYMBOL TABLE

;FILE DESCRIPTOR BLOCK
FDBCTL==1		;CONTROL BITS IN LH THIS WORD
	FDBNEX==B2	;SET IF FILE HAS NO EXTENSION & DOESN'T EXIST
	FDBNXF==B4	;FILE DOESN'T EXIST BECAUSE 1ST WRITE NOT DONE
FDBEXT==2		;LOC EXT BLOCK,, FDB FOR NEXT EXTENSION
FDBPRT==4		;PROTECTION
FDBUSE==6		;WRITER,, USE COUNT
FDBVER==7		;VERSION #,, LOC FDB FOR NEXT VERSION
FDBACT==10		;ACCOUNT # (NEG) OR STRING BLOCK PTR (POS)
FDBSIZ==12		;SIZE IN BYTES (COUNT THAT WOULD ADDRESS EOF)
FDBCRV==13		;VERSION CREATION DATE AND TIME
FDBWRT==14		;WRITE DATE AND TIME
FDBRED==15		;REFERENCE DATE AND TIME
FDBBCK==17		;BACKUP (ARCHIVAL) WORD
			;LH = BITS, RH = MOST RECENT TAPE #
	FDBARC==200000	;ARCHIVE REQUEST
	FDBNAR==100000	;DON'T (EVER) ARCHIVE REQUEST
	AFDBDL==10000	;DON'T DELETE AFTER ARCHIVING
	FDBAAR==4000	;FILE IS ALREADY ARCHIVED

;ARCHIVE COMMAND
;USE OF F REG:
;	SINCE ONLY THE LEFT 18 BITS OF FDBBCK CAN BE CHANGED
;	(AND SINCE THE LEFT-MOST BIT IS NOT USED BY BSYS)
;	F IS DIVIDED INTO 2 PARTS, GIVING ALL INFO FOR CHFDB
;	LH - NEW VALUES FOR THE BITS IN LH OF FDBBCK
;	(BIT 0 IS USED AS A HACK FOR THE STATUS COMMAND)
;	RH - WHICH BITS TO CHANGE IN LH OF FDBBCK
;	LH AND RH USED BASICALLY AS IN GTFDB AFTER FULL
;	REGISTER EXTENSION

.ARCHI:	KEYWD $ARCHI
	 0			;NO DEFAULT KEYWORD
	 JRST CERR
	 JRST (KWV)

$ARCHI:	TABLE
	T DELETE,LPROK+LANOK,ARC.DL
	T EXPUNGE,LPROK+LANOK,ARC.EX
	T FILE,COMOK+LPROK+LANOK,ARC.FL
	T RESET,LPROK+LANOK,ARC.RS
	T STATUS,LPROK+LANOK+EOLOK,ARC.ST
	T UNDELETE,LPROK+LANOK,ARC.UN
	TEND

ARC.FL:	NOISE <FILE LIST>
	MOVE A,[2,,2]		;DEFAULT NAME AND EXT
	MOVE B,[-2,,B2+B11+B15+B16]	;DEFAULT TO LOWEST VERSION
	CALL SPECFN		;GTJFN W/B FLAGS
	;IF SUBCOMMANDS START WITH DEFAULTS AND LET USER ALTER THEM
	 JRST [	MOVE F,[FDBARC,,FDBARC+AFDBDL+FDBNAR]
		CONFIRM		;, TYPED
		SUBCOM $ARC
		JUMPE F,ARCH3	;NO SUBCOMMANDS AFTER ,
		JUMPGE F,ARCH1	;STATUS SUBCOMMAND CAN'T BE MIXED
		TRNE F,377777
		JRST STATER
		JRST ARCH1]
	CONFIRM
	;DEFAULT - ARCHIVE AND DELETE, RESET "DON'T DELETE"
ARCH3:	MOVE F,[FDBARC,,FDBARC+AFDBDL+FDBNAR]
ARCH1:	HRRZ A,@INIFH1		;JFN
	DVCHR
	TLNN B,B4		;DSK (MULT DIR) CHECK
	ERROR <CANNOT ARCHIVE NON-DISK FILES>
	HRRZ A,@INIFH1		;GET CONTROL WORD BITS INTO C
	MOVE B,[1,,FDBCTL]
	MOVEI C,C
	CALL $GTFDB
	 SETO C,		;$GTFDB ERROR
	TLNE C,(FDBDEL)		;ERROR IF DELETED UNLESS DOING GROUP
	 JRST [	TLNN Z,GROUPF
		UERR [ASCIZ /CANNOT MANIPULATE DELETED FILE/]
		JRST ARCH2]
	MOVE B,[1,,FDBBCK]	;GET BACKUP BITS
	MOVEI C,C
	CALL $GTFDB
	 SETO C,		;$GTFDB ERROR
	JUMPL F,ARCSTR		;SO STATUS IF STATUS
	TLNE C,FDBAAR		;IF ARCHIVED, OK IF DOING GROUP
	 JRST [	TLNN Z,GROUPF
		UETYPE [ASCIZ /FILE %1S ALREADY ARCHIVED/]
		JRST ARCH2]
	CALL TYPIF		;TYPE FILENAME IF GROUP DESIG.
	HRLI A,FDBBCK		;A - DISP,JFN
	HRLZI B,0(F)		;B - BITS TO CHANGE
	HLLZ C,F		;C - VALUES TO CHANGE TO
	CHFDB

ARCH2:	CALL GNFIL		;GET NEXT FILE
	 JRST RLJFNS		;NO MORE - RELEASE AND EXIT
	JRST ARCH1		;MORE

; "ARCHIVE DELETE ..."

ARC.DL:	ALLOW TSPC+TALT
	HRROI B,[ASCIZ /<SYSTEM>ARCHIVE-LOOKUP.SAV/]
	CALL TRYGTJ
	 ERROR <NO LOOKUP PROGRAM???>
	TLO KWV1,PROGX
	MOVEI B,4		;ENTRY VECTOR INDEX FOR DELETE
	JRST CIN40		;RUN IT AS AN EPHEMERON


; "ARCHIVE UNDELETE ..."

ARC.UN:	ALLOW TSPC+TALT
	HRROI B,[ASCIZ /<SYSTEM>ARCHIVE-LOOKUP.SAV/]
	CALL TRYGTJ
	 ERROR <NO LOOKUP PROGRAM???>
	TLO KWV1,PROGX
	MOVEI B,6		;ENTRY VECTOR INDEX FOR UNDELETE
	JRST CIN40		;RUN IT AS AN EPEMERON


; "ARCHIVE EXPUNGE ..."

ARC.EX:	JRST NIYE


; "ARCHIVE RESET ..."

ARC.RS:	NOISE <FILES>
	MOVE A,[2,,2]
	MOVEI B,B2+B8+B11+B15+B16	;GTJFN FLAGS
	CALL $INFG		;INPUT FILE GROUP
	 JRST CERR
	CONFIRM
	HRRZI F,FDBARC+FDBNAR+AFDBDL
	JRST ARCH1		;GO DO IT


; "ARCHIVE STATUS ..."

ARC.ST:	NOISE <OF FILES>
	MOVE A,[[ASCIZ /*/],,[ASCIZ /*/]]	;DEFAULT NAME AND EXT
	MOVE B,[-3,,B2+B8+B11+B15+B16]	;* VERSION, IGNORE DELETED
	CALL SPECFN
	 JRST CERR
	TLO KWV1,ALTCON		;ALTMODE ACCEPTABLE FOR CONFIRMATION
	CONFIRM
	MOVSI F,(1B0)
	JRST ARCH1

ARCSTR:	MOVE B,[2,,FDBBCK]	;GET REAL STATUS VIA GTFDB
	MOVEI C,C	;C_BITS,,LAST DUMP #; D_1ST AREC #,,2ND ARC #
	CALL $GTFDB
	 ERROR <$GTFDB ERROR>
	TLZ C,-1-<FDBARC+AFDBDL+FDBNAR+FDBAAR>	;IGNORE UNKNOWN BITS
	TLNE Z,GROUPF		;DOING A GROUP?
	 JRST [	TLNN C,377777	;YES, OMIT IF NOT ARCHIVE STATUS
		 JRST ARCH2
		ETYPE < %1S  >	;TYPE NAME
		JRST .+1]
	HRRZ G,C		;G_LAST DUMP TAPE #
	HRRZ E,D		;E_2ND ARC TAPE #
	HLRZ D,D		;D_1ST ARC TAPE #
	TLNE C,FDBARC
	 JRST [	UTYPE [ASCIZ /ARCHIVE /]
		TLNE C,AFDBDL
		UTYPE [ASCIZ /WITHOUT /]
		TLNN C,AFDBDL
		UTYPE [ASCIZ /AND /]
		UTYPE [ASCIZ /DELETION PENDING/]
		JRST .+1]
	TLNE C,FDBNAR
	 TYPE <ARCHIVE NOT ALLOWED>
	TLNE C,FDBAAR
	 ETYPE <	DUMP TAPE # %7Q, ARCHIVE TAPE #'S %4Q, %5Q>
	TLNN C,377777		;SAY NOTHING IF NOTHING
	 TYPE <NONE>
	PRINT EOL
	JRST ARCH2

$ARC:	TABLE
	T DEFERRED,ONEWD,..ARDF
	T DELETE,ONEWD,..ARDL
	T DON'T,,..ARDN
	T IMMEDIATE,ONEWD,..ARCIMMED
	TEND

..ARDF:	;DEFERRED DEFAULTS TO AND DELETE, FALL INTO IT

	;SET ARCHIVE, RESET DON'T DELETE AND DON'T ARCHIVE
..ARDL:	JUMPL F,STATER		;CAN'T MIX STAT
	MOVE F,[FDBARC,,FDBARC+FDBNAR+AFDBDL]
	RET

..ARDN:	JUMPL F,STATER		;CAN'T MIX STAT
	KEYWD $DONT
	0			;NO DEFAULT
	JRST CERR		;NULL ILLEGAL
	CONFIRM
	JRST (KWV)

$DONT:	TABLE
	T ARCHIVE,ONEWD,...DAR	;DON'T ARCHIVE
	T DELETE,ONEWD,...DDL	;DON'T DELETE (IF ARCHIVED)
	TEND

	;RESET ARCHIVE, SET DON'T ARCHIVE
...DAR:	JUMPL F,STATER	;CAN'T MIX STAT
	TLO F,FDBNAR		;GOING TO SET DON'T ARCHIVE
	TLZ F,FDBARC		;GOING TO RESET ARCHIVE REQUEST
	TRO F,FDBARC+FDBNAR	;YUP
	RET

	;DON'T DELETE MEANS SET ARCHIVE AND DON'T DEL, RESET DON'T ARCH.
...DDL:	TRO F,AFDBDL		;DON'T DELETE AFTER ARCHIVING
	TLO F,AFDBDL
	RET

..ARCIMMED:	JUMPL F,STATER	;CAN'T MIX STAT
	;WOULD MARK ARCHIVED BIT HERE ?? (UGH - NOT YET ON TAPE)
	JRST NIYE		;IMMEDIATE NOT IMPLEMENTED YET


STATER:	ERROR <STATUS SUBCOMMAND CANNOT BE MIXED WITH OTHER SUBCOMMANDS>


;QFD
;QUICK FILE DESCRIPTION
;INTENDED TYPICAL USE IS "QFD <FILE NAME>" WHICH GIVES AN "EVERYTHING"
; DIRECTORY PRINTOUT FOR THE SINGLE FILE, WITHOUT EXCESS SPACES OR HEADG
;BUT IMPLEMENTATION IS LIKE "DIR" PLUS SUBCOMMANDS
; CRAM, EVERYTHING, AND NO (HEADING);
; THUS ADDITIONAL SUBCOMMANDS AND DIFFERENT ARGUMENTS (INCLUDING NONE)
; ARE POSSIBLE.

.QFD:	MOVE E,[001111177751]
	HRLZI F,B10	;SAY QFD MODE - ONLY DIR PART OF HEADING PRINTS
	JRST DIR0

;DIRECTORY.

;CAN TAKE AN ARGUMENT SPECIFYING DIRECTORY OR FILES TO LIST.
;CAN BE TERMINATED WITH COMMA TO INITIATE SUBCOMMAND INPUT.

;AC USE
;  E  FIELDS-TO-PRINT INFO A LA JFNS JSYS CALL.
;	ALSO: B26: PRINT LENGTH IN BYTES
;	      B27: CREATE TIME (IMPLIES CREATE DATE)
;	      B28: WRITE TIME (IMPLIES WRITE DATE)
;	      B29: READ DATE (IMPLIES READ TIME)
;	      B30: PRINT AUTHOR (WRITER)
;	      B32: SUPPRESS COLUMNATION (CRAM)
;  F  FLAGS FOR FORMAT, ETC:
;	B10	QFD, ONLY DIR PART OF HEADING PRINTS
;	B11	USE 10/50 FORMAT FOR DECTAPE DIRS
;	B12	NOW PRINTING A DECTAPE, NOT DISK
;	B13	SUPPRESS HEADING
;	B14	SUPPRESS MULTIPLE VERSIONS ON SAME LINE
;	B15	SUPPRESS OMISSION OF NAME, EXT WHEN SAME AS ABOVE
;		(NOTHING SETS B15 (5/20/70/)).
;	B16	DOUBLE SPACE
;	B17     DELETED FILES ONLY
;  RH Z: FLAGS FOR ORDER OF PRINTOUT:
;	B31=20	CHRONOLOGICAL BY WRITE DATE
;	B32=10	CHRON READ
;	B33=4	CHRON CREATION
;	B34=2	ALPHABETIC
;	B35=1	INVERSE ALPHABETIC OR CHRONOLOGICAL
;  LH Z:
;	F1:	ON IF LIST ACCESS VIOLATION(S)
;	F2:	ON IF MORE FILES TO LIST FOR THIS IFH
;	F3:	ON IF MORE THAN ONE ARGUMENT IN LIST

..DIRE:	MOVE E,[001110040001]	;DEFAULT FORMAT: NAME.EXT;VERS;T
	SETZ F,			;DEFAULT: NO SPECIAL FORMAT

;"QFD" JOINS HERE

DIR0:	MOVE A,COJFN		;DEFAULT OUTPUT TO PRI FILE
	MOVEM A,OUTDSG		;NB: RH OF Z IS 0

;DECODE ARGUMENT LIST WITH SUBROUTINE "DIRARG" IN SUBRS.MAC.
;THIS INPUTS A FILE GROUP (NAMES WITH "*" ALLOWED,
;MULTIPLE NAMES ALLOWED, -2 RETURNED FOR EACH EMPTY DIR).
;DEFAULTS NOTHING TO WHOLE CONNECTED DIRECTORY;
;INTERPRETS COMMA OR EOL TERMINATOR TO THE
;WORD "DIRECTORY".
	CALL DIRARG
	JRST [	CONFIRM		;R1: LIST ENDED WITH COMMA
		SUBCOM $DIR	;INPUT SUBCOMMANDS FROM TABLE $DIR
		JRST .+2]
	CONFIRM

;EXECUTE "DIRECTORY"

	MOVE A,OUTDSG		;OUTJFN
	MOVEI B,1B20		;WRITE.
	CALL $OPEN7		;OPEN, 7 BIT BYTES, MODE 0.

	MOVE A,INIFH1		;PTR TO FIRST JFN IN BUFFER
	CAMGE A,INIFH2		;PTR TO LAST
	TLO Z,F3		;SET FLAG IF MORE THAN 1 JFN
	SETOM OLDDIR		;IMPOSSIBLE DIRECTORY NUMBER

;COME BACK HERE TO PROCESS NEXT ARGUMENT IN LIST

DIRFL:	CALL UNMDIR		;UNMAP DIR'TORY BUF PAGES, THUS 0ING THEM
	TLZ Z,F2
	MOVE A,OUTDSG
	HRROI B,[ASCIZ /
/]
	SETZ C,
	TRNN E,1B32		;SKIP INITIAL CR IN CRAM FORMAT FOR QFD
	SOUT			;BLANK LINE ABOVE DIRECTORY
	HRRZ A,@INIFH1		;JFN
	CAIN A,-2		;TREAT EMPTY DIR AS DISK
	JRST DDIR
	DVCHR
	LDB B,[POINT 9,B,17]	;DEVICE TYPE
	JUMPE B,DDIR		;DISK
	CAIE B,3		;DECTAPE
	 ERROR <ILLEGAL DEVICE>
	TLOA F,B12		;DECTAPE. DEV DESIGNATOR IN A.

;DISK
;E,F, AND Z STILL CONTAIN VARIOUS FLAGS (SEE ABOVE)

DDIR:	TLZ F,B12
	CALL DNAME		;TYPE DIRECTORY NAME IF APPROPRIATE
	CALL DSKDIR		;LIST IT

;DONE A DEVICE OR DIRECTORY.
;F2 SET IF MORE FILES FOR THIS JFN.

	TLNE Z,F2
	JRST DIRFL		;DO NEXT ONE FOR THIS JFN (NOW GNJFN'D)

;NEXT ARGUMENT IN LIST
	AOS A,INIFH1		;STEP POINTER INTO JFN BUFFER
	CAMG A,INIFH2		;BEYOND END?
	JRST DIRFL		;NO
	CALL UNMDIR		;UNMAP BUFFERS
	MOVE A,OUTDSG
	MOVEI B,CR
	BOUT			;BLANK LINE AFTER ALL
	MOVEI B,LF
	BOUT
	CALL RLJFNS		;RELEASE JFNS
	JRST CMDIN4		;GO GET NEXT COMMAND

;UNMDIR
;SUBROUTINE TO UNMAP PAGES USED AS BUFFERS IN LISTING DIRECTORIES
;CLOBBERS A-D.  ALSO USED IN LIST/TYPE.

UNMDIR:	SETO A,
	MOVE B,[B0,,<BUF1>B44]
	HRLZI C,1
	MOVEI D,767-<BUF1>B44
	PMAP
	AOS B
	SOJGE D,.-2
	RET

;DIRECTORY...

;SUBCOMMAND TABLE

$DIR:	 	TABLE
		T ACCOUNT,ONEWD,...ACC
                T ALPHABETIC,ONEWD
		T AUTHOR,ONEWD
                T BEGIN,ONEWD,0
                T CHRONOLOGICAL,EOLOK+LPROK
		T CRAM,ONEWD
		T DATES,EOLOK+LPROK
		T DELETED,EOLOK+LPROK,..DELE
		T DOUBLESPACE,ONEWD
		T EVERYTHING,ONEWD
		T LENGTH,EOLOK+LPROK
		T LPT,EOLOK
		T NO,EOLOK+LPROK,..NO
                T OUTPUT,CONMAN+LPROK
		T PROTECTION,ONEWD,..PROT
		T REVERSE,ONEWD
		T SEPARATE,EOLOK+LPROK
		T SIZE,ONEWD,..SIZE
                T START,ONEWD+INVIS,0
		T TEN50,ONEWD+INVIS,..TEN5
		T TIMES,EOLOK+LPROK
                T VERBOSE,ONEWD
                TEND

;SUB-COMMAND ROUTINES FOR "DIRECTORY" COMMAND

...ACC:	TRO E,1B20
	RET

.ALPHA:	TRZ Z,36		;CLEAR ORDER OF PRINTOUT FLAGS
	TRO Z,1B34		;SAY ALPHABETIC
	RET

.AUTHO:	CONFIRM
	TRO E,1B30
	RET


.CHRON:	NOISE <BY>
	KEYWD $CHRON
	 T WRITE,EOLOK+LPROK,20	;NULL DEFAULTS TO THIS
	 JRST CERR		;NOT FOUND IN TABLE
	CONFIRM
	TRZ Z,36		;CLR FLAGS RELATED TO ORDER OF PRINTOUT
	ORI Z,(KWV)		;AND OR IN THOSE FROM RESPONSE DECODING
	RET

$CHRON:	TABLE
	T CREATION,EOLOK+LPROK,4
	T READ,EOLOK+LPROK,10
	T WRITE,EOLOK+LPROK,20
	TEND

;DIRECTORY SUB-COMMANDS...

.CRAM:	TRO E,1B32
	RET

.DATES:	NOISE <OF>
	TLZ Z,F1
DATES1:	KEYWD $DATE		;"TIMES" JOINS HERE
	 T WRITE,EOLOK,1B24
	 JRST CERR
	CONFIRM
	MOVEI KWV,(KWV)
	TLNE Z,F1
	LSH KWV,-4		;TIME ARE 4 BITS TO LEFT OF DATE BITS
	IORI E,(KWV)		;UPDATES JFNS OPTIONS FROM TABLE
	RET

.TIMES:	NOISE <AND DATES OF>
	TLO Z,F1
	JRST DATES1

$DATE:	TABLE
	T CREATION,EOLOK,1B23
	T READ,EOLOK,1B25
	T WRITE,EOLOK,1B24
	TEND

..DELE:	NOISE <FILES ONLY>
	CONFIRM
	TLO F,1			;SAY DELETED FILES ONLY
	RET

.DOUBL:	TLO F,2			;SAY DOUBLE SPACE
	RET

.EVERY:	IOR E,[00111137741]	;ALL FIELDS THAT CAN BE PRINTED
	RET			;THIS IS TOO MUCH TO FIT ONE TTY LINE.

.LENGT:	NOISE <IN BYTES>
	CONFIRM
	TRO E,1B26		;SAY PRINT LENGTH IN BYTES
	RET

;DIRECTORY SUB-COMMANDS...

;"LPT" IS SHORT FOR "OUTPUT (TO) LPT:"

.LPT:	CONFIRM
;"LIST" CALLS "$LPT" AS A SUBROUTINE TO ASSIGN A JFN TO LPT.

$LPT:	MOVE B,[POINT 7,[ASCIZ /LPT:/],-1]
;"EDDT" CALLS $GTJFN WITH TEXT POINTER IN B.

$GTJFN:	HLRZ A,JBUFP		;CHECK FIRST FOR JFN STACK SPACE
	CAIN A,-1		;WOULD PDL OV OCCUR AT NEXT PUSH?
	ERROR <TOO MANY JFN'S IN COMMAND>;	YES.
	HRLZI A,B2+B17		;OLD FILES ONLY, SHORT GTJFN CALL.
	GTJFN
	 CALL JERR
	MOVE B,JBUFP
	PUSH B,A
	MOVEM B,JBUFP
LPT5:	MOVEM A,OUTDSG		;JFN.
	RET

.OUTPU:	NOISE <TO FILE>
	MOVE A,[[ASCIZ /DIR/],,[ASCIZ /DIR/]] ;DEFAULT NAME & EXT
	CALL COUTFN
	 JRST CERR
	CONFIRM
	JRST LPT5

..NO:	NOISE (HEADING)
	CONFIRM
	TLO F,B13
	RET

..PROT:	TLO E,1			;SAY PRINT PROTECTION
	RET

.REVER:	TRO Z,1			;SAY LIST IN REVERSE ORDER
	RET

.SEPAR:	NOISE (LINES FOR EACH VERSION)	;MAINLY A DEBUGGING CMD
	CONFIRM
	TLO F,B14
	RET
..SIZE:	TRO E,1B22
	RET

..TEN5:	TLO F,B11
	RET

;TIMES: SEE PREVIOUS PAGE

.VERBO:	IOR E,[001111166041] 	;ALL BUT CREATION DATE, LEN. IN BYTES,
	RET			;TIMES.  FITS ON ONE TTY LINE.

;DHEAD
;TYPE HEADING, IF ANY, FOR DISK FILE DIRECTORY PRINTOUT.
;THIS ROUTINE MUST BE CHANGED WHENEVER DFILE'S FORMAT IS CHANGED!
;TAKES:	OUTDSG: OUTJFN
;	E: FIELDS TO PRINT BITS
;	F: B13 TO SUPPRESS HEADING

DHEAD:	PUSH P,A
	MOVE A,DIRNO
	CAMN A,OLDDIR
	JRST DHEADZ		;NO CHANGE, FORGET HEADING
	MOVEM A,OLDDIR
	TLNN F,B10+B12+B13	;"QFD","SUPP. HEAD." OR "DTA" FLAG ON?
	TRNN E,777B30		;NOTHING TO LIST AFTER ACCT FIELD?
	 JRST DHEADZ		;YES,NON-VERBOSE LISTINGS GET NO HEADING
	PUSH P,B
	PUSH P,C
	MOVE A,OUTDSG
	CALL DINDNT		;INDENT RIGHT AMT. FOR FIELDS TO PRINT
;PRINT HEADERS FOR THE COLUMNS TO BE INCLUDED IN THIS LISTING
	SETZ C,
	HRROI B,[ASCIZ /PGS  /]
	TRNE E,1B22		;SIZE IN PAGES
	SOUT
	HRROI B,[ASCIZ /BYTES(SZ) /]
	TRNE E,1B26		;SIZE IN BYTES
	CALL DHSOUT
	HRROI B,[ASCIZ /CREATION /]
	TRNE E,1B23+1B27	;CREATION DATE
	CALL DHSOUT
	HRROI B,[ASCIZ /        /]
	TRNE E,1B27		;CREATION TIME
	CALL DHSOUT
	HRROI B,[ASCIZ /WRITE    /]
	TRNE E,1B24+1B28
	CALL DHSOUT
	HRROI B,[ASCIZ /        /]
	TRNE E,1B28
	CALL DHSOUT
	HRROI B,[ASCIZ /READ     /]
	TRNE E,1B25+1B29
	CALL DHSOUT
	HRROI B,[ASCIZ /        /]
	TRNE E,1B29
	CALL DHSOUT
	HRROI B,[ASCIZ /AUTHOR/]
	TRNE E,1B30
	SOUT
	HRROI B,[ASCIZ /

/]
	SOUT
DHEADX:	POP P,C
	POP P,B
DHEADZ:	POP P,A
	RET

;DINDNT: SUBR TO INDENT THE RIGHT AMOUNT BEFORE HEADING,
; AS A FUNCTION OF FIELDS TO BE PRINTED.
;ALSO USED BY DFREST WHEN GOING TO A NEW LINE.

DINDNT:	MOVEI B,TAB
	BOUT			;NAME, EXT, VERSION CROSS FIRST TAB STOP
	TLNE E,<3B17>B53	;PROTECTION, IF REQUESTED IN PRINTOUT,
	BOUT			;CROSSES ANOTHER TAB STOP.
	TRNE E,3B20		;ACCT CROSSES ANOTHER.
	BOUT
	TRNN E,1B32		;UNLESS COLUMNATION SUPPRESSED,
	BOUT			;FOLLOWING FIELDS BEGIN AT NEXT TAB STOP
	RET

;DHSOUT: SOUT AND APPEND SPACE UNLESS COLUMNATION SUPPPRESSED (E B32 ON)
;FOR "DHEAD". CLOBBERS B.

DHSOUT:	SOUT
	MOVEI B," "
	TRNN E,1B32
	BOUT
	RET

;DNAME
;SUBROUTINE TO TYPE DIRECTORY NAME IF "*" GIVEN
;FOR DIRECTORY OR IF MORE THAN ONE ARGUMENT
;IN LIST OR IF OUTPUT NOT TO TERMINAL.

DNAME:	TLNE F,B13
	RET			;HEADING SUPPRESSED
	PUSH P,A
	PUSH P,B
	PUSH P,C
	MOVE A,OUTDSG		;DESTINATION
	MOVE C,@INIFH1		;JFN OF CURRENT ARG
	CAMN C,[-2]		;FOR EMPTY DIR TYPE NOTHING
	JRST DNAMEX		;RETURN
	MOVE A,CSBUFP		;JFNS TO STRING BUFFER
	MOVE B,OUTDSG		;OUTPUT JFN
	CAME B,COJFN		;GOING TO OTHER THAN PRIMARY?
	 CALL SITEO		;OUTPUT SITE
	MOVEI B,(C)
	MOVE C,[2B2+1B5+1B35]	;DEFAULT DEV, PRINT DIR
	TLNE F,B12
	MOVE C,[2B2+1B35]	;DECTAPE: DEVICE ONLY
	MOVE D,A		;SAVE BEG OF DIRECTORY NAME FOR BELOW
	JFNS
	CAMN A,CSBUFP
	JRST DNAMEX		;NULL STRING, PRINT NOTHING
DNAME4:	MOVE 2,OUTDSG
	CAMN 2,COJFN		;GOING TO PRIMARY OUTJFN ?
	 JRST DNAME5		;YES, NO DATE AND TIME
	PUSH P,A		;SAVE PTR INTO CSBUF
	HRROI 2,[ASCIZ /   /]	;THREE SPACES
	SETZM 3
	SOUT
	SETOM 2
	ODTIM			;AND THE TIME
	POP P,A			;RESTORE PTR TO END OF DIR NAME
DNAME5:	TLNE F,B12
	 JRST [	SETOM OLDDIR	;DTA:  BESURE HEADING, ETC WILL PRINT
		JRST DNAME8]
DNAME6:	SETZM B
	DPB B,A			;FLUSH THE CLOSING LESS THAN SIGN
	PUSH P,A	
	SETZM A
	MOVE B,D		;PTR TO BEGINNING OF DIRECTORY
	IBP B			;PASS THE OPENING GREATER THAN SIGN
	STDIR
	 JFCL			;NO MATCH (CAN'T HAPPEN)
	 JFCL			;AMBIGUOUS (CAN'T HAPPEN)
	POP P,B
	MOVEI C,">"
	DPB C,B			;PUT IT BACK
	HRRZS A
	MOVEM A,DIRNO		;REMEMBER DIRECTORY NUMBER
	CAMN A,OLDDIR
	JRST DNAMEX		;NO CHANGE, DON'T PRINT AGAIN
DNAME8:	MOVE A,OUTDSG
	SETZ C,
	HRROI B,[ASCIZ /   /]
	SOUT			;INDENT FOR DIR NAME
	MOVE B,CSBUFP
	SOUT
	HRROI B,[ASCIZ /
/]
	SOUT
DNAMEX:	POP P,C
	POP P,B
	POP P,A
	RET

;$GTFDB
;SUBROUTINE TO DO GTFDB JSYS AND SKIP UNLESS
;AN INSTRUCTION TRAP WITH "LIST ACCESS NOT ALLOWED"
;ERROR OCCURED.
;USED IN DIRECTORY, UNDELETE, DSKSTAT, COPY/APPEND, LIST/TYPE.
;SHOULD BE IN SAME PAGE AS DSKDIR CAUSE ITS IN A LOOP THERE.

$GTFDB:	PUSH P, A
	MOVEI A,FDBILI		;WHERE TO GO ON INST TRAP
	MOVEM A, ILIDSP
	POP P,A
	GTFDB
	SETZM ILIDSP		;CLEAR SPECIAL INST TRAP DISPATCH
	AOS (P)
	RET

;TRAP OCCURRED, CHECK ERROR CODE

FDBILI:	PUSH P,A
	HRRZ A,ERCOD
	CAIE A,GFDBX3		;"LIST ACCESS NOT ALLOWED"?
	JRST [	POP P,A
		JRST ILIPSI]	;NO,TREAT AS OTHER ILL INST TRAPS.
	JRST [	POP P,A
		RET]

;DSKDIR
;SUBROUTINE TO LIST DISK OR DECTAPE DIRECTORY
;READS (WITH GNJFN),SORTS,PRINTS ONE DIRECTORY
;TAKES:	A: SOURCE DEVICE DESIGNATOR FOR DECTAPE
;	OUTDSG: DESTINATION JFN
;	INIFH1:	POINTER TO INDEXABLE FILE HANDLE
;	Z,E,F:	VARIOUS FLAGS, SEE COMMENTS AT
;		BEGINNING OF "DIRECTORY", INCL F B12 FOR DECTAPE.
;RETURNS F2 SET IF ADDITIONAL FILES ARE TO BE LISTED
;	FOR CURRENT INDEXABLE FILE HANDLE.
;CLOBBERS A-D,G-GG.

;BUFFER DEFINITIONS

DTADRC==BUF1			;WHERE DECTAPE DIRECTORY IS READ
DTATBL==BUF1+200		;TABLE FOR DECTAPE FILE LENGTHS
TABLE=BUF2			;WHERE SYMBOL TABLE IS BUILT
TABLEN==777			;LENGTH OF TABLE. CANNOT
				;BE GREATER THAN 511.
DIRBUF=TABLE+TABLEN		;BOTTOM OF STRING AND FDB STORAGE

;SUCCESSIVE PAGES UPWARD FROM BUF1 ARE USED.
;THERE ARE ENOUGH PAGES BELOW DDT AS LONG
;AS DIRECTORY LENGTH REMAINS LIMITED TO 4K.

DSKDIR:	TLNN F,B12		;DECTAPE?
	JRST DSKD2		;NO
	TLNE F,B11		;TEN50 FORMAT REQUESTED?
	JRST OLDTAD		;YES, USE OLD ROUTINE.
	TRNN Z,36		;ORDERING SPECIFIED?
	TRO Z,1B34		;NO, DEFAULT TO ALPHABETIC

;DSKDIR...
;DECTAPE SPECIFIC PROCESSING.

;FORMAT OF THE DIRECTORY BLOCK ON DECTAPE:
; WORDS 0-82: 5-BIT "SLOTS", 1 PER BLOCK: 0 FREE,
;					  1-22 FILE NUMBER
;					  27 DIRECTORY & TENDUMP BLOCKS
; WORDS 83-104: NAMES OF FILES 1-22
; WORDS 105-126: LH: EXT. B24-35: WRITE DATE.

;READ DIRECTORY
	MOVEI B,DTADRC		;WHERE TO READ IT. DEV DESIG STILL IN A.
	RDDIR			;READ IT
	 CALL [	CAIN A,RDDIX1
		UERR [ASCIZ /TROUBLE READING DIRECTORY,
 MAYBE DECTAPE NOT ON "REMOTE"/]
		JRST JERR]

;SCAN "SLOTS" PORTION OF DIRECTORY, COUNTING BLOCKS IN FILES
	MOVE B,[POINT 5,DTADRC,-1]	;5 BITS PER BLOCK ON TAPE
	MOVEI C,^D578		;# BLOCKS ON TAPE
	ILDB D,B		;FETCH A SLOT BYTE
	AOS DTATBL(D)		;INDEX APPROPRIATE TABLE WORD
	SOJG C,.-2

;TYPE # FREE BLOCKS
;SUPPRESS IF NOT LISTING WHOLE DIRECTORY ??
	TRNE E,1B32
	JRST DSKD2		;OMIT IN CRAM FORMAT (QFD)
	MOVE A,OUTDSG
	HRROI B,[ASCIZ /
/]
	SETZ C,
	TLNE F,B16
	SOUT			;EXTRA CRLF IF DOUBLE-SPACING
	MOVEI B," "
	BOUT
	MOVE B,DTATBL+0
	MOVEI C,^D10
	NOUT
	 CALL JERRC
	HRROI B,[ASCIZ / FREE BLOCKS
/]
	SETZ C,
	SOUT
DSKD2:	CALL DHEAD		;PRINT COLUMN HEADS IF APPROPRIATE
	MOVE A,OUTDSG
	HRROI B,[ASCIZ /
/]
	SETZ C,
	TLNE F,B16
	SOUT			;EXTRA CRLF IF DOUBLE-SPACING

;DSKDIR ...
;READ FDB, NAME, EXT OF EACH FILE TO LIST,
;LOOPING OVER FILES WITH GNJFN, STOPPING IF DEVICE OR
;DIRECTORY CHANGES.
;IN FDB PUT POINTERS TO NAME, EXT, AND ACCT STRINGS.
;FOR DECTAPE FILES A DUMMY FDB CONTAINING NAME, EXT, WRITE DATE,
;  # BLOCKS, AND THE REST 0 IS BUILT
;FORM TABLE OF POINTERS TO FDB'S STARTING AT "TABLE".
;LH OF EACH POINTER WORDS HAS 9-BIT REVERSE AND
;FORWARD LIST POINTERS TO PERMIT SORTING IN PLACE
;AND LISTING IN FORWARD OR REVERSE ORDER.
;WORD TABLE +0 IS A DUMMY, WITH FORWARD POINTER
;TO HEAD OF LIST, REVERSE POINTER TO END, AND
;0 RH TO TERMINATE SORT AND PRINT OPERATIONS.
;FIRST ENTRY IN LIST HAS 0 REV PTR, LAST HAS 0 FWD PTR.

	MOVEI GG,0		;INITIALIZE TABLE INDEX
	MOVEI C,DIRBUF		;INITIALIZE BUFFER SPACE POINTER
	MOVE A,@INIFH1
	CAMN A,[-2]		;IS IT A COMPLETELY EMPTY DIRECTORY ?
	JRST DSKR9		;YES.
;TOP OF LOOP

;CHECK FOR TABLE FULL, IF SO PRINT MULTIPLE PARTIAL DIRECTORIES

DSKR1:	CAIG C,767720
	CAIL GG,TABLEN-2	;BOTH ENDS MUST HAVE 0'S
	JRST [	UTYPE [ASCIZ / STORAGE FULL,
 DIRECTORY WILL BE PRINTED IN TWO SECTIONS
/]
		JRST DSKR8]	;GO SET F2, LIST THIS MUCH.

;DSKDIR... READ...
;READ AND STORE FDB AND STRINGS FOR A FILE
	TLNE F,B12
	JRST DSKR2		;FOR DTA LEAVE A 0 BLOCK FOR "FDB"
	HRRZ A,@INIFH1		;JFN
	MOVE B,[16,,0]		;FDB THRU "FDBCRV"
				;C ALREADY SET RIGHT
	CALL $GTFDB		;DO GTFDB JSYS AND SKIP UNLESS...
	JRST [	TLO Z,F1	;LIST ACCESS NOT ALLOWED
		JRST DSKR7]	;FLAG INVOKES MSG LATER
	MOVE A,FDBCTL(C)	;CONTROL BITS WORD OF FDB
	TLNE F,B17		;"DELETED FILES ONLY" REQUESTED?
	TLC A,<FDBDEL>B53	;YES,COMPLEMENT "DELETED" BIT
	TLNE A,<FDBDEL>B53	;THIS FILE DELETED OR NOT AS REQUESTED?
	JRST DSKR7		;NO SKIP IT.
DSKR2:	MOVE D,C		;WHERE THIS FDB IS
	HRROI A,16(D)		;CREATE STRING POINTER PAST FDB
	HRRM A,FDBCTL(D)	;NAME POINTER TO FDB
	HRRZ B,@INIFH1		;JFN
	HRLZI C,B8		;FORMAT
	JFNS			;GET NAME STRING
	HRROI A,2(A)		;STRING PTR TO BEG OF NEXT WORD TO USE
				;LEAVES A 0 WORD TO TERMINATE
				;STRING FOR SORT.
	HRLM A,FDBEXT(D)	;EXT PTR TO FDB
	HRLZI C,B11
	JFNS			;EXTENSION STRING
	MOVE B,FDBACT(D)	;ACCOUNT
	JUMPLE B,DSKR4		;NUMERIC OR MISSING
	HRROI A,2(A)
	HRRZM A,FDBACT(D)
	HRRZ B,@INIFH1
	MOVEI C,1B20
	JFNS			;GET ACCOUNT STRING

DSKR4:	MOVEI C,2(A)		;WHERE TO STORE NEXT FDB
				;AGAIN LEAVING A 0 WORD POINTER
	TLNN F,B12
	JRST DSKR5
;FOR DTA PICK UP DATE AND SIZE
;SEARCH DIRECTORY TO GET DATE (IN SAME WORD AS EXT)
;AND SIZE (AT SAME INDEX INTO DTATBL).
	HRLZI AA,-^D22

;CONVERT NAME AND EXT FROM "FDB" TO SIXBIT IN BB, CC.
;CLOBBERS BB-FF.
	HRLI EE,<POINT 7,0,-1>B53	;NAME
	HRR EE,FDBCTL(D)
	MOVEI FF,6
DTADRN:	ILDB CC,EE		;NAME CHAR LOOP
	JUMPE CC,.+2
	SUBI CC,40
	LSH CC,36
	LSHC BB,6
	SOJG FF,DTADRN
	HRLI EE,<POINT 7,0,-1>B53	;EXTENSION
	HLR EE,FDBEXT(D)
	MOVEI FF,3
DTADRE:	ILDB DD,EE		;EXT CHAR LOOP
	JUMPE DD,.+2
	SUBI DD,40
	LSH DD,36
	LSHC CC,6		;EXT ENDS UP IN RH CC, GARBAGE IN LH.
	SOJG FF,DTADRE
DTADR1:	CAME BB,DTADRC+^D83(AA)
	JRST DTADR9		;WRONG NAME
	HRLZ B,CC		;EXT,,0 FROM "FDB"
	XOR B,DTADRC+^D105(AA)	;COMPARE EXT, PICK UP DATE FROM DTADRC
	PUSH P,C
	ANDCMI B,7B23
	MOVEI C,1B35		;NEW DEC DATE STANDARD
	TDNE C,DTADRC+0(AA)	;PICK UP THREE EXTRA BITS
	 TRO B,1B23
	TDNE C,DTADRC+^D22(AA)
	 TRO B,1B22
	TDNE C,DTADRC+^D44(AA)
	 TRO B,1B21
	POP P,C
	TLNE B,-1
	JRST DTADR9		;WRONG EXT
	DPB B,[POINT 15,FDBWRT(D),35]	;DATE TO "FDB"
	MOVE B,DTATBL+1(AA)
	HRRM B,FDBBYV(D)	;SIZE IN BLOCKS
	JRST .+2
DTADR9:	AOBJN AA,DTADR1		;IF NOT FOUND LEAVE THINGS 0

;DSKDIR... READ...
;MAKE TABLE ENTRY

DSKR5:	DPB GG,[POINT 9,TABLE+1(GG),8]	;REVERSE POINTER
					;TO ENTRY WE ARE ABOUT TO USE
	MOVEI GG,1(GG)			;INCREMENT TABLE INDEX
	DPB GG,[POINT 9,TABLE-1(GG),17]	;FORWARD POINTER
					;TO PREVIOUS ENTRY
					;LEAVES 0 IN LAST ENTRY.
	HRRM D,TABLE(GG)		;PTR TO FDB TO THIS TABLE ENTRY

;STEP TO NEXT FILE, STOP IF ANOTHER DEVICE OR DIRECTORY

DSKR7:	MOVE A,@INIFH1
	TLNE A,<77B5>B53	;IF NO *-FLAGS SKIP GNJFN
	GNJFN
	 JRST DSKR9		;NO MORE,DONE READING
	TLNN A,70		;DEVICE OR DIRECTORY CHANGED?
	JRST DSKR1		;NO,DO THIS FILE.
DSKR8:	TLO Z,F2		;YES,SAY THERE'S MORE FOR THIS JFN,
				;SORT AND PRINT WHAT WE HAVE
DSKR9:	DPB GG,[POINT 9,TABLE,8];PUT "REVERSE" POINTER
				;TO LAST ENTRY IN DUMMY ENTRY 0.
				;USED FOR REVERSE UNSORTED LISTING.
	TRNN Z,36		;ANY ORDER-OF-PRINTOUT FLAGS ON?
	JRST DSKP		;NO, NO SORT REQUIRED, GO PRINT

;DSKDIR...

;SORT DISK DIRECTORY
;FOR EACH SUCCESSIVE WORD OF UNSORTED TABLE, FIND
;PLACE TO PUT IT IN LIST-STRUCTURED TABLE, STARTING
;FROM LAST INSERTED ENTRY TO MAKE MAXIMUM
;USE OF PARTIAL ORDERING.
;ENDS OF LIST ARE INDICATED BY 0 RH OF TABLE WORD.
;START WITH ZEROED WORD 0; THIS PUTS POINTERS TO IT
;(AS TERMINATING ENTRY) AT EACH END OF LIST.

	SETZM TABLE		;INITIALIZE SORTED TABLE:
				;MAKES LAST FIND AND FIRST REV
				;PTR POINT TO A WORD (NAMELY THIS WORD) 
				;WITH 0 RH.
	MOVEI GG,0		;INDEX OF CURRENT (LAST INSERTED)
				;SORTED TABLE ENTRY
	MOVEI AA,1		;INDEX INTO UNSORTED TABLE

;TOP OF LOOP

DSKS1:	SKIPN TABLE(AA)
	JRST DSKP		;NO MORE TO SORT, GO PRINT
	CALL FDBSC		;COMPARE ENTRY (GG) TO (AA),3 RETURNS
	 JRST LESS		;UNSORTED ENTRY (GG) LESS
	 JRST HERE		;EQUAL

;UNSORTED ENTRY GREATER, SEARCH FORWARD

GRATR:	LDB GG,[POINT 9,TABLE(GG),17]	;GET FWD PTR
	CALL FDBSC		;COMPARE AGAIN
	 JRST .+3		;LESS
	 JRST .+2		;EQUAL OR AT END OF TABLE
	JRST GRATR		;GREATER, KEEP SEARCHING

;LESS OR EQUAL, PUT IT BEFORE THIS ONE

	LDB GG,[POINT 9,TABLE(GG),8]	;BACK UP 1
	JRST HERE		;PUT IT AFTER THIS ONE

;UNSORTED ENTRY LESS, SEARCH BACKWARD

LESS:	LDB GG,[POINT 9,TABLE(GG),8]	;GET REVERSE PTR
	CALL FDBSC
	 JRST LESS		;KEEP SEARCHING
	 JRST HERE		;EQUAL OR BEGINNING OF TABLE

;INSERT ENTRY AFTER CURRENT ENTRY BY UPDATING LIST POINTERS

HERE:	LDB A,[POINT 9,TABLE(GG),17]	;SORTED ENTRY'S FWD PTR
	DPB A,[POINT 9,TABLE(AA),17]	;TO ENTRY BEING INSERTED
	DPB AA,[POINT 9,TABLE(GG),17]	;SET FWD PTR OF
			;SORTED ENTRY TO POINT AT NEW ENTRY
	DPB AA,[POINT 9,TABLE(A),8]	;SET REV PTR OF ENTRY
			;FOLLOWING SORTED ENTRY TO POINT AT NEW ENTRY
	DPB GG,[POINT 9,TABLE(AA),8]	;SET NEW ENTRY'S REV
			;PTR TO POINT PREVIOUS SORTED ENTRY
	MOVE GG,AA	;ENTRY JUST INSERTED IS CURRENT
	AOJA AA,DSKS1	;BOTTOM OF LOOP: NEXT UNSORTED ONE

;DSKDIR...
;SUBROUTINE FDBSC FOR SORT
;COMPARE FDB'S THAT TABLE ENTRIES SPECIFIED BY INDICES
;IN GG AND AA POINT TO.
;RETURN+1 IF GG LESS, +2 =, +3 GREATER
;ACCORDING TO SORT KEY SPECIFIED BY FLAGS IN RHZ
;RET +2 IF GG POINTS TO NULL TABLE ENTRY.
;CLOBBERS A - D, G, BB.

FDBSC:	HRRZ BB,TABLE(GG)	;BB POINTS TO FIRST FDB
	HRRZ G,TABLE(AA)	;G TO SECOND
	JUMPE BB,FDBEQ		;NULL, RETURN AS THOUGH EQUAL.
	TRNN Z,1B34
	JRST FDBSC2

;ALPHABETIC COMPARISON.

	HRRZ A,FDBCTL(BB)	;NAME PTRS
	HRRZ B,FDBCTL(G)
	CALL FDBSTC		;STRING COMPARE RETURNS HERE
				;ONLY IF EQUAL.

;NAMES =, COMPARE EXTENSIONS

	HLRZ A,FDBEXT(BB)
	HLRZ B,FDBEXT(G)
	CALL FDBSTC

;=, COMPARE VERSIONS

	HLRZ A,FDBVER(BB)
	HLRZ B,FDBVER(G)
	JRST FDBSC3		;JOIN CHRONOLOGICAL CASE FOR COMPARE

;DSKDIR SORT SUBR FDBSC...
;FOR EACH CHRONOLOGICAL COMPARISON FETCH THE DATES AND TIMES
;TO COMPARE THEN CONVERGE ON COMPARE

FDBSC2:	TRNN Z,1B31
	JRST .+4
	MOVE A,FDBWRT(BB)	;WRITE
	MOVE B,FDBWRT(G)
	JRST FDBSC3
	TRNN Z,1B32
	JRST .+4
	MOVE A,FDBRED(BB)	;READ
	MOVE B,FDBRED(G)
	JRST FDBSC3
	TRNN Z,1B33
	JRST FDBGR		;NO SORTING SPEC. (IE DIRECTORY ORDER)
				;TREAT AS THO GREATER.  NOTE THAT
				;"REVERSE" STILL WORKS

;THIS IS WHERE TO ADD CASES

	MOVE A,FDBCRV(BB)	;CREATE
	MOVE B,FDBCRV(G)
FDBSC3:	CAMN A,B
	JRST FDBEQ
	CAML A,B		;RETURN "GREATER" IF DATE LESS
	JRST FDBLS		;BECAUSE DEFAULT ORDER IS
	JRST FDBGR		;REVERSE CHRONOLOGICAL
FDBGR:	AOS (P)
FDBEQ:	AOS (P)
FDBLS:	RET

;DSKDIR... SORT...
;FDBSTC: STRING COMPARE FOR FDBSC.
;A AND B POINT TO STRING BLOCKS WITH
;HEADER WORD AND 0 WORD AFTER.
;RETURNS IF =, ELSE GOES TO FDBLS OR FDBGR.
;CLOBBERS A-D.

FDBST1:	SKIPN (A)		;WORDS =. END OF STRINGS?
	RET			;YES, STRINGS =.
	MOVEI A,1(A)
	MOVEI B,1(B)

;ENTER HERE

FDBSTC:	JCRY0 .+1
	MOVE C,(A)		;FETCH WORD OF FIRST STRING 
				;PASSING HEADER WORD.
	SUB C,(B)		;SUBTRACT WORD OF 2ND STRING
	JUMPE C,FDBST1		;WORDS =?
	JCRY0 [	SUB P,[1,,1]	;FORGET RETURN
		JRST FDBLS]
	SUB P,[1,,1]
	JRST FDBGR

;DSKDIR...
;PRINT DISK DIRECTORY

DSKP:	SETZM LPNAME
	SETZM LPEXT
	SETZM LPFDB

;COPY FLAGS APPROPRIATE TO DEVICE FORM E TO BB
	MOVE BB,E		;ALL FOR DISK
	TLNE F,B12
	AND BB,[7B8+7B11+1B22+1B24+1B28];DECTAPE
	MOVEI GG,0		;GG IS TABLE POINTER
				;WORD TABLE+0 IS A DUMMY,
				;NOT TO BE LISTED
DSKP1:	TRNN Z,1			;SKIP IF REVERSE ORDER
	LDB GG,[POINT 9,TABLE(GG),17]	;FWD POINTER
	TRNE Z,1			;SKIP IF NORMAL ORDER
	LDB GG,[POINT 9,TABLE(GG),8]	;REVERSE PTR
	HRRZ G,TABLE(GG)	;FDB PTR FROM TABLE ENTRY
	JUMPE G,DSKP4		;0 MEANS END
	CALL DFILE		;LIST THIS ENTRY
	JRST DSKP1

DSKP4:	CALL DFREST		;PRINT REST OF LAST LINE
	TLZN Z,F1		;ANY LIST ACCESS ERRORS?
	JRST DSKP5
	TLNN Z,GROUPF
	TYPE < LIST PROTECT VIOLATION
>;			FOR A SINGLE FILE
	TLNE Z,GROUPF
	TYPE < PLUS FILE(S) THAT ARE LIST PROTECTED FROM YOU
>;
DSKP5:	RET			;RETURN FROM DSKDIR

;DFILE
;LIST ONE FILE
;TAKES: OUTDSG: OUTPUT JFN
;	BB: WHAT FIELDS TO PRINT BITS -- SAME AS JFNS'S EXCEPT
;	   COMBINATIONS NOT PRODUCED BY "DIRECTORY" COMMAND AREN'T
;	   NECESSARILY HANDLED.
;	   AND ALSO: B26: PRINT LENGTH IN BYTES.
;		     B27-30: CREATE, WRITE, READ TIMES (IMPLYING DATES)
;		     B32: SUPPRESS COLUMNATION
;	F: B14: DON'T PUT MULTIPLE VERSIONS OF SAME NAME.EXT
;		ON SAME LINE
;	   B15: SUPPRESS THE NORMAL OMISSION OF NAME OR NAME.EXT
;	        WHEN SAME AS THOSE LAST PRINTED
;	   B16: ON FOR DOUBLE-SPACING
;	   B17: ON TO LIST DELETED FILES ONLY
;	G: POINTER TO FDB
;AC USE
;	D: # COLS MIN TO USE FOR CURRENT FIELD / RUNNING NEGATIVE
;	   TOTAL OF PREVIOUS FIELD OVERFLOW COLUMNS (SEE "DFILL").

;CLOBBERS A, B, C, D.

;DFILE

DFILE:	MOVE A,OUTDSG
	SETZ D,			;NO FIELDS HAVE EXCEEDED MIN WIDTH YET

;NAME, EXTENSION, VERSION

	HRRZ B,FDBCTL(G)	;NAME
; IF NAME IS SAME AS THAT LAST PRINTED, JUST PRINT 3 SPACES.
	TLNE F,B15
	JRST DFL03A		;FLAG SUPPRESSES COMPACT FORMAT
	SKIPE C,LPNAME		;LAST NAME PRNTD. NONE MEANS "DIFFERENT"
	CALL DCMPR		;COMPARE CURRENT NAME TO LAST PRINTED
	 JRST DFL03A		;DIFFERENT, PRINT IT.
	HLRZ B,FDBEXT(G)
	SKIPE C,LPEXT
	CALL DCMPR		;NAME IS SAME, IS EXT SAME ALSO?
	 JRST [	CALL DFREST	;FINISH PREVIOUS LINE, IF ANY.
		MOVE B,[POINT 7,[ASCIZ / /],-1]   ;NAME SAME, EXT DIFF
		AOJA D,DFL03B]	;PRINT SPACES AND PROCEED TO EXTENSION

;NAME AND EXTENSION ARE THE SAME AS THOSE LAST PRINTED.
;NORMALLY PUT COMMA AND ADDITIONAL VERSION ON SAME LINE UNLESS
; SOME OTHER FIELD TO BE PRINTED IS DIFFERENT,
; BUT IF THAT IS SUPPRESSED OR A FIELD IS DIFFERENT,
; START NEW LINE WITH TAB INSTEAD OF NAME.EXT.

	TLNE F,B14
	JRST DFL02B		;MULTIPLE VERSIONS PER LINE SUPPRESSED

;COMPARE CURRENT FDB TO PREVIOUS, COMPARING ONLY THOSE
; FIELDS WHICH ARE TO BE PRINTED.

	CALL DFDBCM
	 JRST DFL02B		;DIFFERENT, NEW LINE.
	MOVE D,LFPOS		;SAME, RETRIEVE "POSITION" ON THIS LINE
	MOVEI B,","		;USE A COMMA,
	SOJA D,DFL05A		;ACCOUNT COLUMN USED BY COMMA,
				;AND GO PRINT VERSION ON SAME LINE.

;FINISH OLD LINE AND START NEW FOR SAME NAME.EXT

DFL02B:	CALL DFREST		;PRINT REST OF LAST FILE'S INFO, IF ANY
	MOVEI D,^D8		;8 COLS IF COLUMNATION NOT SUPPRESSED,
	HRROI B,[ASCIZ / /]	;ONE SPACE IF IT IS SUPPRESSED.
	CALL DFILL		;SPACES(S) IN PLACE OF NAME.EXT
	JRST DFL05		;GO PRINT VERSION

;DFILE...
;PRINT NAME

DFL03A:	CALL DFREST		;PRINT REST OF PREVIOUS LINE, IF ANY
	MOVEI B," "
	BOUT			;SPACE AT BEGINNING OF EACH LINE
	HRRO B,FDBCTL(G)	;NAME BLOCK RELATIVE LOCATION
	HRROM B,LPNAME		;REMEMBER LAST PRINTED NAME
DFL03B:	ADDI D,3		;USE 3 COLUMNS MINIMUM
	CALL DFILL		;PRINT NAME OR SPACES

;PRINT EXTENSION

	HLRO B,FDBEXT(G)	;EXT
	HRROM B,LPEXT		;REMEMBER LAST PRINTED EXTENSION
	PUSH P,B
	MOVEI B,"."		;"." IS NORMAL SEPARATOR
	BOUT
	POP P,B			;EXT PTR AGAIN
	ADDI D,3		;# COLS TO USE: 3 - EXTRAS USED FOR NAME
	CALL DFILL		;OUTPUT EXTENSION

;PRINT FIRST VERSION ON LINE

DFL05:	MOVEI B,";"
DFL05A:	TLNE BB,<1B14>B53	;SUPPRESS FOR DTA
	BOUT			;ADDIT'L VERSION ON SAME LINE JOINS HERE
	HLRZ B,FDBVER(G)	;VERSION
	MOVEI C,^D10
	TLNE BB,<1B14>B53
	CALL DFNOUT		;NOUT AND KEEP TRACK OF COLS USED.
	MOVEM G,LPFDB		;SAVE FDB ADDRESS FOR "DFREST"
	MOVEM D,LFPOS		;LINE "POSITION" (- # COLS OV) ALSO
	RET

;PRINTING OF ADDITIONAL FIELDS FOR THIS NAME.EXT;VERSION IS DEFERRED
; SO THAT ADDITIONAL VERSION NUMBERS MAY BE PRINTED HERE, 
; SEPARATED BY COMMAS.

;DFREST
;LIST REST OF FIELDS AFTER VERSION NUMBER
;CALLED FROM DFILE WHEN A DIFFERENT VERSION NUMBER IS DETECTED,
; AND AT END OF LISTING.
;TAKES:	LPFDB:	ZERO OR POINTER TO FDB FOR WHICH TO FINISH PRINTOUT
;	LFPOS:	- # COLS LINE OVERFLOW, AS REQUIRED FOR "DFILL"
;	OUTDSG,E,F:	AS FOR "DFILE" ABOVE.
;RETURNS: LPFDB 0, B,C CLOBBERED, D-G PRESERVED.

DFREST:	SKIPN LPFDB
	RET			;NOTHING TO PRINT REST OF, RETURN.
	PUSH P,D
	PUSH P,G
	MOVE A,OUTDSG
	MOVE G,LPFDB		;LOCATION OF FDB
	MOVE D,LFPOS		;LINE OVERFLOW SITUATION
	SETZM LPFDB		;MAKE SURE IT ISN'T LISTED AGAIN

;PROTECTION

	TLNN BB,<3B17>B53
	JRST DFR07		;PRINTING PROTECTION NOT REQUESTED
	HRROI B,[ASCIZ /;P/]
	SETZ C,
	SOUT
	HLRZ B,FDBPRT(G)	;LEFT HALF OF PROTECTION WORD
	CAIE B,500000		;500000 MEANS 18-BIT OCTAL IN RH
	JRST DFR06A		;0 MEANS STRING PTR
	HRRZ B,FDBPRT(G)
	MOVEI C,10
	CALL DFNOUT		;NOUT AND KEEP TRACK OF COLUMNS USED
	JRST DFR07
DFR06A:	HRROI B,[ASCIZ /FANCY PROTECTION/]
	CALL DFILL		;DFILE WILL HAVE TO BE MODIFIED WHEN
				;HAIRY PROTECTION IS IMPLEMENTED. _____

;DFREST...
;ACCOUNT

DFR07:	TRNN BB,3B20
	JRST DFR08
	HRROI B,[ASCIZ /;A/]
	SETZ C,
	SOUT
	MOVE B,FDBACT(G)
	JUMPL B,DFR07A

;STRING ACCOUNT

	SKIPN FDBACT(G)		;"NONE" FOR NO BLOCK # OR PTR FOUND
	HRROI B,[ASCIZ /NONE/]
	HRROI B,0(B)		;MAKE PROPER LH
	CALL DFILL		;PRINT THE STRING
	JRST DFR08

;NUMERIC ACCOUNT

DFR07A:	TLZ B,700000		;CLEAR HI BITS.
	MOVEI C,^D10		;DECIMAL
	CALL DFNOUT		;NOUT AND KEEP TRACK OF CHRS OUTPUT

; ;T: ALWAYS PRINTED IF FILE IS TEMPORARY.
; ;S: ALWAYS PRINTED IF FILE IS SCRATCH

DFR08:	MOVE B,FDBCTL(G)	;CONTROL BITS
	TLNN B,<FDBTMP>B53	;IS FILE TEMP?
	JRST DFR85
	HLRZ C,FDBVER(G)
	CAIGE C,^D100000	;SCRATCH?
	HRROI B,[ASCIZ /;S/]
	CAIL C,^D100000
	HRROI B,[ASCIZ /;T/]
	CALL DFILL		;SOUT AND KEEP TRACK OF COLUMNS


; ;E: ALWAYS PRINTED IF FILE IS EPHEMERAL

DFR85:	MOVE B,FDBCTL(G)
	TLNN B,(FDBEPH)
	 JRST DFR09
	HRROI B,[ASCIZ /;E/]
	CALL DFILL		;SOUT AND KEEP TRACK OF COLUMNS IN D

;DFREST...

DFR09:	TRNN BB,777B30		;ANY TIMES, ETC. TO PRINT?
	JRST DFRXIT		;NO

;BEFORE PRINTING THE REST SPACE OVER TO THE APPROPRIATE TAB STOP,
;OR PRINT ONE SPACE IF BEYOND IT, OR USE A NEW LINE IF TOO FAR BEYOND.

	TRNN BB,1B32		;NEVER AN EOL IF COLUMNATION SUPPRESSED
	CAML D,[-35]		;TO MUCH LINE OVERFLOW?
;-35 WAS CHOSEN BECUASE IT IS ONE CHARACTER SHORT OF PUSHING
;DATES CLEAR INTO NEXT COLUMN WHEN ;A AND ;P ARE PRESENT.
	JRST DFR09A		;OK
	MOVEI B,CR
	BOUT
	MOVEI B,LF
	BOUT
	CALL DINDNT		;INDENT THE RIGHT AMOUNT ON NEW LINE
	SETZ D,			;NO LINE OVERFLOW NOW
	JRST DFR09C
DFR09A:	HRROI B,[ASCIZ / /]	;THE ONE SPACE
	ADDI D,7		;RIGHT # COLS BEYOND MIN FOR NAM.EXT;VER
	TLNE F,B12
	SUBI D,2		;2 COLS NARROWER FOR DECTAPE
	TLNE BB,<3B17>B53
	ADDI D,6		;ANOTHER TAB STOP FOR PROT
	TRNE BB,3B20
	ADDI D,6		;";A" AND ";P NOT COUNTED IND
	CALL DFILL		;SOUT AND ADD SPACES

;SIZE IN PAGES OR DECTAPE BLOCKS

DFR09C:	TRNN BB,1B22
	JRST DFR09D
	HRRZ B,FDBBYV(G)	;SIZE IN PAGES
	MOVEI C,^D10		;DECIMAL
	CAIGE B,^D1000		;WILL FIT IN 3 COLS?
	HRLI C,(1B2+3B17)	;YES, RIGHT JUSTIFY IT
	ADDI D,3		;3 COLS MIN WIDTH, LESS PRECEDING OVFLO
	CALL DFNOUT		;NOUT WITH FANCY COLUMNATION
	MOVEI B," "
	BOUT
	BOUT
;LENGTH IN BYTES: PRINT "LENGTH(SIZE)"

DFR09D:	TRNN BB,1B26
	JRST DFR10
	MOVE B,FDBSIZ(G)
	MOVEI C,^D10		;DECIMAL
	CALL DFNOUT		;NO COLUMNATION YET
	MOVEI B,"("
	BOUT
	LDB B,[POINT 6,FDBBYV(G),11]	;BYTE SIZE
	MOVEI C,^D10
	CALL DFNOUT
	MOVEI B,")"
	BOUT
	HRROI B,[ASCIZ / /] ;NOW A SEPARATING SPACE, PLUS ENOUGH MORE
	ADDI D,^D9		;SO "SIZE(LENGTH)" TAKES UP 10 COLS,
	CALL DFILL		;( 10 - ()'S+" "=9)
				;LESS EXCESS USED BY NAME.

;DFREST...
;THE VARIOUS DATES AND TIMES

DFR10:	SETZ C,			;FORMAT: DD-MMM-YY HH:MM:SS
	TRNE BB,1B32		;SUPPRESS COLUMNATION?
	TLO C,B17		;SUPPRESS COLUMNATION.
	TRNN BB,1B23+1B27
	JRST DFR11
	TRNN BB,1B27		;TIME TO BE INCLUDED?
	TLO C,B9		;NO, EXCLUDE IT
	MOVE B,FDBCRV(G)	;VERSION CREATION DATE & TIME
	ODTIM			;PRINT DATE AND MAYBE TIME.
	MOVEI B," "
	BOUT
DFR11:	TRNN BB,1B24+1B28
	JRST DFR12
	TLZ C,B9
	TRNN BB,1B28
	TLO C,B9
	MOVE B,FDBWRT(G)	;WRITE DATE
	TLNE F,B12
	JRST [	CALL DTADAT	;PRINT DECTAPE FORMAT DATE
		JRST DFR12]
	ODTIM
	MOVEI B," "
	BOUT
DFR12:	TRNN BB,1B25+1B29
	JRST DFR129
	SKIPN B,FDBRED(G)
	 JRST [	HRROI B,[ASCIZ / NOT READ/]
		MOVEI C,0
		SOUT
		TRNE BB,1B29	;TIMES BEING PRINTED...
		TRNE E,1B32	;AND NOT IN CRAM MODE?
		 JRST DFR129	;NOT SO.
		HRROI B,[ASCIZ /         /]
		SOUT		;YES
		JRST DFR129]
	TLZ C,B9
	TRNN BB,1B29
	TLO C,B9
	ODTIM
DFR129:	TRNE E,1B30		;GOING TO PRINT AUTHOR?
	TLNE F,(1B12)		;AND NOT DECTAPE
	 JRST DFRXIT		;NO.
	MOVEI B," "		;YES, PRINT A SPACE
	BOUT

DFR13:	HLRZ B,FDBUSE(G)	;DIR NUM OF WRITER
	MOVEI C,10
	DIRST
	 NOUT
	  JFCL

;CRLF AND EXIT

DFRXIT:	HRROI B,[ASCIZ /
/]
	SETZ C,
	SOUT
	HRROI B,[ASCIZ /
/]
	TLNE F,2		;DOUBLE-SPACE?
	SOUT			;YES, ANOTHER EOL.
	POP P,G
	POP P,D
	RET

;SUBROUTINE DTADAT: PRINTS DECTAPE FORMAT DATE FROM B.
;USED IN DFREST, OLDTAD.
;TAKES: A: DESTINATION, B: DATE. CLOBBERS C,D.

DTADAT:	PUSH P,E
	MOVE D,B
	IDIVI D,^D31
	HRLZ C,E		;DAY OF MONTH
	IDIVI D,^D12
	HRR B,E			;MONTH
	HRLI B,^D1964(D) 	;YEAR
	HRLZI E,B9		;SUPPRESS TIME
	ODTNC		;OUTPUT DATE WITHOUT CONVERSION FROM INTERNAL
	POP P,E
	RET

;DCMPR: SUBOUTINE FOR DFILE.
;COMPARE STRING C POINTS TO TO STRING B POINTS TO.
;SKIP IF EITHER POINTER IS ZERO OR IF STRINGS ARE SAME.

DCMPR:	JUMPE C,[AOS (P)
		RET]
	JUMPE B,[AOS (P)
		RET]
	PUSH P,B
	PUSH P,C
	PUSH P,D
	PUSH P,E
	HRLI B,<POINT 7,0,-1>B53
	HRLI C,<POINT 7,0,-1>B53
DCMPR1:	ILDB E,C
	ILDB D,B
	CAME E,D
	JRST DCMPR9		;DIFFERENT
	JUMPN E,DCMPR1		;TERMINATE ON NULL
	AOS -4(P)
DCMPR9:	JRST [	POP P,E
		POP P,D
		POP P,C
		POP P,B
		RET]

;DFDBCM: COMPARE FDB'S POINTED TO BY G AND LPFDB
;COMPARE ONLY FIELDS TO BE PRINTED, PER DFILE FORMAT WORD IN E.
;SKIPS IF SAME. CLOBBERS B,C,D. ONE CALL IN "DFILE".

DFDBCM:	MOVE B,LPFDB
	JUMPE B,[RET]		;NO PREVIOUS FDB, GIVE "DIFFERENT" RET.
	MOVE C,FDBCTL(B)	;CONTROL BITS
	XOR C,FDBCTL(G)
	TLNE C,(FDBEPH)		;CHECK BITS WHICH MATTER
	 RET
	TRNN E,1B30		;GOING TO PRINT AUTHOR?
	 JRST .+5		;NO, SKIP CHECK
	HLRZ C,FDBUSE(B)	;AUTHOR
	HLRZ D,FDBUSE(G)
	CAIE C,0(D)		;SAME?
	 RET			;NO, GIVE "DIFF" RET
	TLNN BB,<3B17>B53 	;PROTECTION: IS IT TO BE LISTED?
	JRST .+4		;NO, CONTINUE COMPARING FIELDS
	MOVE C,FDBPRT(B)
	CAME C,FDBPRT(G) 	;IS IT SAME?
	RET			;NO, DIFFERENT
	TRNN BB,3B20		;ACCOUNT
	JRST .+4
	MOVE C,FDBACT(B)
	CAME C,FDBACT(G)
	RET
	TRNN BB,1B22		;SIZE IN PAGES
	JRST .+5
	HRRZ C,FDBBYV(B)
	HRRZ D,FDBBYV(G)
	CAME C,D
	RET
	TRNN BB,1B26		;BYTES
	JRST DFDC10
	MOVE C,FDBSIZ(B)
	CAME C,FDBSIZ(G)
	RET

;ALSO MAKE SURE BYTES ARE SAME SIZE:
	LDB C,[POINT 6,FDBBYV(B),11]
	LDB D,[POINT 6,FDBBYV(G),11]
	CAME C,D
	RET

;DATES AND TIMES
DFDC10:	MOVE C,FDBCRV(B)
	XOR C,FDBCRV(G)
	TRNN BB,1B27
	TRZ C,-1		;NOT TIME, MASK IT OUT.
	TRNE BB,1B23+1B27 	;CREATE DATE OR TIME TO BE PRINTED?
	JUMPN C,[RET]		;YES, TEST FOR SAME
	MOVE C,FDBWRT(B)
	XOR C,FDBWRT(G)
	TRNN BB,1B28
	TRZ C,-1
	TRNE BB,1B24+1B28
	JUMPN C,[RET]
	MOVE C,FDBRED(B)
	XOR C,FDBRED(G)
	TRNN BB,1B29
	TRZ C,-1
	TRNE BB,1B25+1B29
	JUMPN C,[RET]
	AOS (P)			;SAME!
	RET

;DFNOUT: SUBROUTINE FOR DFILE.
;LIKE NOUT EXCEPT ADDS TRAILING SPACES, LIKE "DFILL" (NEXT),
;USING D IN SAME MANNER.
;REQUIRES A, B, C SET UP FOR NOUT, D FOR DFILL.
;CLOBBERS B, C.

DFNOUT:	PUSH P,A
	MOVE A,CSBUFP		;STRING BUFFER PTR
	NOUT			;CONVERT NUMBER TO STRING IN CORE
	 CALL JERRC		;JSYS ERROR ROUTINE FOR ERR # IN C
	SETZ C,
	IDPB C,A		;APPEND NULL (NOUT REALLY DOESN'T !)
	POP P,A
	MOVE B,CSBUFP

;DFILL: SUBROUTINE FOR DFILE.
;OUTPUT STRING B POINTS TO, THEN TYPE SPACES IF NECESSARY TO
;MAKE IT TAKE UP NUMBER OF COLUMNS SPECIFIED IN D.
;DESTINATION IN A; CLOBBERS B,C; RETURNS - # COLS OVERFLOW IN D.

DFILL:	HLRZ C,B
	CAIN C,-1
	HRLI B,<POINT 7,0,-1>B53	;FILL IN LH BYTE PTR FOR -1
	PUSH P,B
	SETZ C,
	SOUT
	POP P,B
	ILDB C,B
	SOJL D,DFILL9
	JUMPN C,.-2
	MOVEI B," "		;SPACES NEEDED
	TRNN E,1B32		;E B32 SUPPRESS COLUMNATION
	BOUT
	SOJGE D,.-2
DFILL9:	JUMPE C,[AOJA D,[RET]]	;REMOVE THE NULL TERMINATOR FROM COUNT
	ILDB C,B		;COUNT CHARS OVER SPECIFIED MINIMUM
	SOJA D,.-2

;OLDTAD
;LIST DECTAPE DIRECTORY IN 10/50 FORMAT
;TAKES: OUTDSG: OUTPUT JFN
;	A: DEVICE DESIGNATOR (UNIT # IN RH)
;AC USE: A: OUTJFN
;	F: POINTER TO BLOCK COUNT BUFFER IN PUSHDOWN
;	G: AOBJN POINTER DURING PRINTING

OLDTAD:	PUSH P,E
	PUSH P,F
				;DEVICE DESIGNATOR IS IN A

	MOVEI B,DIRBUF		;WHERE TO READ DIR TO
	RDDIR			;GET DEVICE DIRECTORY
	 CALL [	CAIN A,RDDIX1
		UERR [ASCIZ /TROUBLE READING DIRECTORY,
  MAYBE DECTAPE NOT ON "REMOTE"/]
		JRST JERR]

;SCAN "SLOTS" PORTION OF DIRECTORY, COUNTING BLOCKS ASSIGNED TO EACH
;FILE, AND FREE BLOCKS (THESE HAVE 0 FILE # BYTE).

	HRRZI F,1(P)		;WHERE BLOCK COUNT BLOCK WILL BE
	MOVEI B,^D22
	PUSH P,[0]		;ALLOCATE AND CLR 23 WRDS FOR BLK COUNTS
	SOJGE B,.-1
	MOVE B,[POINT 5,DIRBUF]	;THERE IS ONE 5-BIT BYTE PER BLOCK
	MOVEI C,^D578		;NUMBER OF BLOCKS
OLDTA2:	ILDB D,B		;GET FILE # FOR THIS BLOCK
	MOVE E,F
	ADD E,D
	CAIG D,^D22		;IS IT A FILE # OR 0?

;NOTE: DIRECTORY BLOCK (100) AND TENDMP BLOCKS (0, 1, 2)
;  HAVE 36 IN THEIR SLOTS.
	AOS (E)			;INDEX BLOCK COUNT
	SOJG C,OLDTA2

;OLDTAD...
;TYPE # FREE BLOCKS
	MOVE A,OUTDSG
	MOVE B,(F)
	MOVEI C,^D10		;FREE FORMAT, DECIMAL
	NOUT
	 CALL JERRC
	HRROI B,[ASCIZ /. FREE BLOCKS LEFT
/]
	SETZ C,
	SOUT

;TYPE EACH FILE IN THE FORM NNNNNN.EXT  BB  DD-MMM-YY
	HRLZI G,-^D22		;NUMBER OF POSSIBLE FILES
OLDTA4:	ADDI F,1		;STEP TO NEXT COUNT WORD IN BLOCK IN PD
	SKIPN C,DIRBUF+^D83(G)	;NAME
	JRST OLDTA7		;NONE, NO FILE FOR THIS FILE #
	MOVEI D,6
	SETZ B,
	LSHC B,6
	ADDI B,40		;CONVERT CHAR TO ASCII
	BOUT			;PRINT A CHARACTER OF NAME
	SOJG D,.-4
	HLLZ C,DIRBUF+^D105(G)	;EXTENSION
	MOVEI B,"."		;SEPARATING CHARACTER: PERIOD,
	JUMPN C,.+2
	MOVEI B," "		;EXCEPT SPACE IF NO EXTENSION
	BOUT
	MOVEI D,5		;3 CHARS OF EXT AND 2 TRAILING SPACES
	SETZ B,
	LSHC B,6
	ADDI B,40
	BOUT			;PRINT A CHAR OF EXTENSION
	SOJG D,.-4

;NUMBER OF BLOCKS IN FILE: USE 3 COLUMNS, LEADING 0 IF <10,
;TRAILING SPACE IF <100, A LA DEC 10/50 SYSTEM.
	MOVE B,(F)		;# BLOCKS
	CAIL B,^D10
	JRST .+3
	MOVEI B,"0"
	BOUT
	MOVE B,(F)		;# BLOCKS IN THIS FILE
	MOVEI C,^D10
	NOUT
	 CALL JERRC
	MOVE C,(F)		;# BLOCKS ONCE MORE
	MOVEI B," "
	CAIGE C,^D100
	BOUT			;FILL TO 3 COLS WITH A SPACE
	BOUT			;SEPARATING SPACE

;OLDTAD...
	LDB B,[POINT 12,DIRBUF+^D105(G),35]		;DATE
	MOVEI C,1B35		;OR IN 3 MORE DATE BITS
	TDNE C,DIRBUF+0(G)	;NEW DEC DATE TANDARD
	TRO B,1B23
	TDNE C,DIRBUF+^D22(G)
	TRO B,1B22
	TDNE C,DIRBUF+^D44(G)
	TRO B,1B21
	CALL DTADAT		;TYPE DATE IN DECTAPE FORMAT
	MOVEI B,CR
	BOUT
	MOVEI B,LF
	BOUT
OLDTA7:	AOBJN G,OLDTA4
	SUB P,[^D23,,^D23]
;STEP PAST ALL JFNS THIS DECTAPE. ADDED 1/71
	TLZ Z,F2
	HRRZ A,@INIFH1
	GNJFN
	JRST OLDTA9
	TLNN A,70		;DEV OR DIR CHANGED ?
	JRST .-4
	TLO Z,F2
OLDTA9:	POP P,F
	POP P,E
	RET

LITC5:	LIT
