Google
 

Trailing-Edge - PDP-10 Archives - bb-d868b-bm_tops20_v3a_2020_dist - 3a-sources/wild.mac
There are 29 other files named wild.mac in the archive. Click here to see a list.
	TITLE	.WILD -- SUBROUTINE TO PERFORM WILDCARD LOOKUP  %7(311)
	SUBTTL	P.CONKLIN/PFC		21-SEP-74


;***COPYRIGHT 1970, 1971, 1972, 1973, 1974  DIGITAL EQUIPMENT CORP., MAYNARD, MASS.***


CUSTVR==0		;CUSTOMER VERSION
DECVER==7		;DEC VERSION
DECMVR==0		;DEC MINOR VERSION
DECEVR==311		;DEC EDIT VERSION


;SUBROUTINE TO SCAN DIRECTORIES AND RETURN LOOKUP BLOCKS FOR THE
;VARIOUS NAMES WHICH MATCH WILD-CARDS.

	SEARCH	C,SCNMAC
	SALL

;ASSEMBLY INSTRUCTIONS:
;
IF1,<	..==%%C+%%SCNM
IFNDEF	..,<
PRINTX	?	.COMPILE WILD USING C.MAC AND SCNMAC.MAC AS UNIVERSALS
	PASS2
	END>
	PURGE	..>

;
;THEN LOAD THE .REL FILE WITH ANY PROGRAM NEEDING IT.

;;;;;;;;;;;;;;; W A R N I N G ;;;;;;;;;;;;;;;;
;;;;   UPDATE WILDDM IF LOW-SEG CHANGES   ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

XP %%WILD,CUSTVR*1B2+DECVER*1B11+DECMVR*1B17+DECEVR
;       	TABLE OF CONTENTS FOR WILD
;
;
;                          SECTION                            PAGE
;    1. REVISION HISTORY......................................   5
;    2. MISC. DEFINITIONS.....................................   7
;    3. INITIALIZE AND PRESET CALL............................   8
;    4. LOOKUP ONE FILE.......................................   9
;    5. SECONDARY WILD-CARD LOGIC.............................  25
;    6. DIRECTORY SUBROUTINES.................................  35
;    7. STRUCTURE SUBROUTINES.................................  49
;    8. USEFUL SUBROUTINES....................................  54
;THIS SUBROUTINE WORKS ON THE DATA BASE LEFT BY THE COMMAND SCANER.
;A LIST OF PARAMETER AREAS DEFINES THE FILES REQUESTED AND THE VARIOUS
;SYSTEM STRUCTURES AND DIRECTORIES ARE SEARCHED.

	ENTRY	.LKWLD

;ONLY ONE PRINCIPLE ENTRY POINT IS DEFINED--GET THE FIRST OR NEXT FILE.
;CALL:	MOVE	T1,[LENGTH,,BLOCK]
;	PUSHJ	P,.LKWLD
; RETURN CPOPJ IF NO MORE FILES WITH T1=-1 (OR DEVCHR IF DISK ONLY)
;SKIP RETURN WITH OPEN BLOCK AND LOOKUP BLOCK PRESET
;	INDEX LOCATION WILL POINT TO CURRENT SCANER FILE SPEC
;		WITH T1=THE DEVCHR OF THE NEXT DEVICE
;		WITH T2=-1 IF DISK, 0 IF DTA, 1 OTHERS OR NUL:

;BLOCK+0: LH = LOCATION CONTAINING FIRST WORD OF FIRST SCANER FILE SPEC
;	  RH = 0 OR LOCATION CONTAINING FIRST WORD OF LAST SPEC
;      1: LH = LOCATION OF OPEN BLOCK (3 WORDS LONG)
;	  RH = LOCATION OF LOOKUP BLOCK
;      2: LH = LENGTH OF FILE SPEC FROM SCANER
;	  RH = LENGTH OF LOOKUP BLOCK
;      3: LH = CHANNEL FOR DATA FILE READING IF ANY AND FLAGS
;		1B0=1	HANDLE ALL DEVICES (ELSE, JUST DISK)
;		1B1=1	SCAN DIRECTORY BEFORE DOING ITS SFD'S
;	  RH = LOCATION OF POINTER TO FILE SPEC (INITIALLY 0)
;      4: RH = LOCATION OF ROUTINE TO NOTIFY AT END OF DIRECTORY

	ENTRY	.SCWLD

;ENTRY POINT TO COMPUTE SECONDARY FILE GIVEN
; INPUT AND WILD-CARDS.
;
;CALL:	MOVE	T1,[LENGTH,,BLOCK]
;	PUSHJ	P,.SCWLD
;	  ERROR RETURN IF NOT POSSIBLE TO SETUP (MESSAGE ALREADY ISSUED)
;	SKIP RETURN WITH DEVICE CHARACTERISTICS IN T1
;		AND T2=-1 IF DISK OR SPOOLED, 0 IF DTA, 1 OTHERWISE OR NUL:
;
;BLOCK THROUGH BLOCK+2 MANDATORY, LH=INPUT, RH=OUTPUT
;BLOCK+0:	ADDRESS OF SCAN FORMAT FILE SPEC (AT LEAST 32 WORDS)
;      1:	OPEN BLOCK (3 WORDS)
;      2:	LOOKUP/ENTER BLOCK (EXTENDED FORMAT)
;      3:	LH=ADDRESS OF DEFAULT OUTPUT EXTENSION WITH RH=-1
;		RH=LENGTH OF ENTER BLOCK

;AT RETURN, OUTPUT OPEN AND ENTER BLOCKS WILL BE SETUP
;SECONDARY ENTRY POINTS:
;	PUSHJ	P,E.DFO
;		REPORTS OPEN ERROR FOR DATA FILE
;	PUSHJ	P,.NXDTW
;	  EOF RETURN
;	NORMAL RETURN WITH NEXT WORD IN T1
;		READS ONE BYTE
;	PUSHJ	P,E.DFL
;		REPORTS LOOKUP ERROR 
;		ERROR INFO IN LOOKUP BLOCK
;	PUSHJ	P,.LKERR
;		REPORTS LOOKUP ERROR MESSAGE (NO FILE)
;		(CODE IN T1)
;		(PROT. IN 0-8 OF T3)
;	PUSHJ	P,.CHKTM
;		CHECKS /BEFORE AND /SINCE CONSTRAINTS
;		(ASSUMES LOOKUP WAS DONE INTO AREA LAST
;		 POINTED TO BY LAST CALL TO .LKWLD)
;		(ASSUMES PARAM AREA POINTED TO BY RH(E+3)
;		 IN LAST CALL TO .LKWLD)

;	PUSHJ	P,E.SCO
;		REPORTS OPEN ERROR
;	PUSHJ	P,E.SCL
;		REPORTS ENTER ERROR FROM ENTER BLOCK

;.WLDFL	=FLAG (-1 IF WILD, +1 IF STR WILD, -2 IF BOTH)
;.WIFIR	=LOCATION OF START OF CONCATENATED SET
;.WILAS	=LOCATION OF END ...  (X+Y)
;B.DC	=LOCATION OF BUFFER HEADER
;.WLDBF =BUFFER WITH CURRENT DIRECTORY BLOCK
;.WILDZ	=START OF WILD LOW SEG
;.WILDL	=LENGTH OF WILD LOW SEG

	TWOSEG
	RELOC	400000


ND FT$COR,-1		;+ TREATED SAME AS 'OR'
ND FT$SFD,-1		;SUB-FILE DIRECTORIES

IFLE .FXLND-1,<FT$SFD==0
		.FXLND==1>
	SUBTTL	REVISION HISTORY

;%1 -- 6/71 WITH 5.03 MONITOR (NAMED LOKWLD)

;A)  SHIFT INDEX TO P1 WHICH IS PRESERVED.  UPDATE USER'S
;	INDEX VIA ARGUMENT.
;B)  UPDATE TO USE THE REVISED TYPEOUT ROUTINES IN SCAN.
;C)  CHANGE CALL TO BE A BLOCK POINTED TO FROM T1.
;D)  USE CHANNEL 0 FOR ALL DIRECTORY READING.  HANDLE SFDS.  DIRECTORY
;	READING IS NOW IN DUMP MODE.
;E)  USE ARGUMENT CHANNEL FOR DATA READS.
;F)  USE C.MAC (AND SCNMAC.MAC) FOR ALL BITS AND BYTES INCLUDING THE
;	FILE SPEC AREA.
;G)  HANDLE [,] [P,] [,P] AND [-] NOTATIONS.
;H)  HANDLE + FOR UFDS (DEFICIENCY OF VERSION 1).
;I)  USE PATH. WHERE POSSIBLE FOR SYS:, ETC.
;J)  HANDLE STR, CONTROLLER CLASS, AND CONTROLLER ABBREVIATIONS.
;K)  FLAG FOR CALLER BOTH STRS AND WILD (.WLDFL=-2).
;L)  DO NOT OPEN DATA CHANNEL.
;M)  RETURN LOOKUP BLOCK IN CORE INSTEAD OF ACS.
;N)  ADD ROUTINE (.CHKTM) TO CHECK /BEFORE AND /SINCE SWITCHES.
;O)  DELAY DIRECTORY LOOKUP ERRORS TO END IN CASE SOME OTHER
;	STRUCTURE GETS IT OK.
;P)  MAKE OPEN FAILURE FATAL.  INCLUDE ASSIGNED JOB NUMBER IF KNOWN.
;Q)  ADD SEARCH LIST EMPTY (24) TO STANDARD LOOKUP ERRORS.
;R)  CHKACC DIRECTORIES
;S)  HANDLE SPECIAL DEVICES SUCH AS HLP:, ALL:, SXS:, ETC.

;%2(76) -- 5/72 WITH DIRECT %2.

;77	CORRECT BUG WHEN READING BLOCKS OF THE DIRECTORY.  EXAMINED
;	ONLY 63 FILES PER BLOCK INSTEAD OF 64.

;%3(77) -- 6/72

;100	USE .FX SYMBOLS FROM SCNMAC %3(50)
;101	USE .FXDFX TO FLAG MFD FIXUPS. HANDLE SYS:.UFD
;102	ALLOW REENTRY AFTER NON-DISK DEVICE.
;103	ALLOW FX.ADD OR .FXTRO FOR OR FUNCTION.
;104	ADD DEFENSIVE HALT IN CASE LH(DIRECTORY)=0.  (SPR 10-7182)
;105	REPLACE INTERNS BY :: FLAG.
;106	USE REAL EXTENSION IN LOOKUP ERROR MESSAGE
;107	ADD DTA HANDLING
;110	CORRECT SUBSCRIPTS IN E.DFL ROUTINE
;111	SET /DEN/PAR SWITCHES FOR MTA
;112	CONSIDER /BEFORE AND /SINCE =-1 TO BE ABSENT
;113	[*,NOT *,...] WILL NOT MATCH FOR USER PROJECT GT 7
;		AND TARGET PROJECT LE 7
;114	HANDLE [1,1].UFD CORRECTLY.  THIS ELIMINATES THE OLD NOTATION
;		OF #X0000YY.UFD[1,1]
;115	FIX BUG IN CHKACC LOGIC OF MFD.
;116	FIX BUG IN SYS: INTRODUCED BY 107.
;117	ADD ENTRY .CHKTA FOR DIRECT
;120	INCLUDE "." IN MODULE NAME.
;121	ADD SYMBOLS .WILDZ AND .WILDL FOR START AND LENGTH OF
;	LOW CORE AREA
;122	HANDLE NO MFD MESSAGE GRACEFULLY.

;%4(122) -- 12/72 WITH DIRECT %3

;123	ADD ERROR MESSAGE "NO FILE NAME SPECIFIED".
;124	ADD ROUTINE .SCWLD FOR SECONDARY WILDCARD (E.G., OUTPUT)
;125	SIMPLIFY CHECKS FOR END OF DIRECTORY LIST
;126	CHANGE HALT TO JRST AT WILDK
;127	ADD E.LKEN AND .TFILB AS GENERAL SCAN-STYLE TYPEOUTS
;130	CREATE MODULE\WILDDM
;131	DEFAULT OUTPUT PROTECTION IF TO SAME OWNER AS
;	INPUT FILE IS XYY WHERE X IS SYSTEM FILE PROT AND YY
;	IS COPIED FROM THE INPUT FILE
;132	SUPPORT DATE75
;133	SUPPORT /OKPROT AND /ERPROT.  DEFAULT IS /ERPROT
;	UNLESS WILD UFD.
;134	FIX BUG IN E.LKEN (EDIT 127)
;135	HANDLE NUL: CORRECTLY
;136	(10-10819) REMOVE BUG IN DECTAPE DIRECTORY READ
;137	GET RIGHT DIRECTORY WHEN UFD READ PROTECT. ERROR
;140	PREFIX ALL ERROR MESSAGES WITH WLDXXX
;141	(10-11421) CHECK /STR/PHY ON DIRECTORY MATCHING
;142	CORRECTLY STORE POINTER TO INPUT SPEC FOR CALLER
;%5(142) DEC, 73

;143	CORRECT BUG IN MULTIPLE DIRECTORY WILD-CARD LOGIC
;144	CORRECT SKIP INSTRUCTION ERROR IN DTA DIRECTORY LOGIC
;145	DON'T DELETE ACCESS TABLES IF WE ARE THE OWNER
;146	ADD ENTRY POINTS .INSTR, .NXSTR
;147	CONVERT TO USE C, SCNMAC AS UNIVERSALS
;150	SUPPORT /MESSAGE FROM .GTWCH
;151	MOVE .PTWRD TO .SCAN
;152	SUPPORT /MESSAGE FROM SCAN
;153	(10-12368) HANDLE UFD NAME CORRECTLY AS A FILE
;154	FIX /STRS ON NON-WILD TO GET RIGHT MESSAGE AND DIRECTORY
;155	IF /OKNONE AND NOT WILD, NO ERROR
;156	(10-12368) SUPPORT /SINC/BEFOR ON DTA
;157	ADD OPTION TO .LKWLD TO INDICATE END OF DIRECTORY
;160	ADD OPTION TO .LKWLD TO SCAN DIRECTORIES BEFORE SFD
;161	SUPPORT /ABEFORE/ASINCE/ERSUPERSEDE/LENGTH/ESTIMATE/VERSION
;162	(QAR 1882) FIX 153
;163	MORE 161
;164	MORE 153
;165	MORE 135
;%6(165) JUNE, 1974
;300	SUPPORT OF 'OR', ETC., (ADD FT$COR)
;301	DEFAULT TO /OKPROTECT IF ANY WILDCARDS
;302	ADD ERROR TWC IF TWO MANY WILD-CARDS ON INPUT
;303	IGNORE SINGLE ACCESS F/S IF NOT OWNED BY THIS JOB
;304	WARN WLDAFP IF ALL FILES PROTECTED
;305	WARN WLDAFR IF ALL FILES REJECT CONDITIONS
;306	(10-13,944) FIX TYPO IN MESSAGE
;307	(QAR 2760) ADD WLDSDP
;310	(QAR 2836) BUG IN 304
;311	ADD WLDSFP
	SUBTTL	MISC. DEFINITIONS

;ACCUMULATORS


T1=1	;SCRATCH
T2=2
T3=3
T4=4

P1=5	;INDEX TO COMMAND SCANNER DATA BASE
P2=6	;PRESERVED ACS
P3=7

P=17	;PUSH DOWN LIST

;CHANNELS

WC==0	;CHANNEL FOR DIRECTORY READING
DC==0	;READ DATA (UPDATED BY ARGUMENT)

;FLAGS

DOALDV==1B0	;DO ALL DEVICES
DIRSFD==1B1	;DO DIRECTORY BEFORE SFD
	SUBTTL	INITIALIZE AND PRESET CALL

;HERE ON EXTERNAL CALL

.LKWLD:	MOVEM	P1,SAVEP1	;SAVE POINTER
	HLRZ	T2,T1		;GET LENGTH OF BLOCK
	PUSHJ	P,.GTWRD##	;GET BLOCK+0
	TRNE	T3,-1		;SEE IF END GIVEN
	HRR	T3,(T3)		;YES--GET END OF SPECS
	MOVS	T4,T3		;SWITCH TO START
	HRR	T4,(T4)		;GET START OF SPECS
	TLNN	T4,-1		;SEE IF END SPECIFIED
	HRL	T4,T4		;NO--USE START
	HLRZM	T4,AGLIMS	;STORE END FOR TESTS
	TLZ	T4,-1		;CLEAR JUNK FOR LATER
	PUSH	P,T4		;SAVE AWAY
	PUSHJ	P,.GTWRD	;GET BLOCK+1
	HLRZM	T3,AGOPEN	;SAVE OPEN BLOCK
	HRRZM	T3,AGLOOK	;SAVE LOOKUP BLOCK
	SKIPE	AGOPEN		;PROTECT AGAINST JUNK
	SKIPN	AGLOOK		; ..
	HALT	.+1		;BAD USER CALL
	PUSHJ	P,.GTWRD	;GET BLOCK+2
	HRRZM	T3,AGLENL	;SAVE LENGTH OF LOOKUP BLOCK
	HLRZ	T3,T3		;GET LENGTH OF PARAMETER AREA
	MOVEM	T3,AGLENP	;SAVE FOR LATER
	PUSHJ	P,.GTWRD	;GET BLOCK+3
	HRRZM	T3,AGPNTR	;SAVE LOCATION OF POINTER
	HRRZ	P1,(T3)		;SETUP USER'S POINTER
	MOVEM	T3,AGFLAG	;STORE FLAGS
	HLLZ	T4,T3		;ISOLATE CHANNEL
	TLZ	T4,777760	;REMOVE JUNK
	LSH	T4,5		;POSITION FOR UUOS
	HLLZM	T4,AGDCHN	;SAVE FOR DODCHN ROUTINE
	PUSHJ	P,.GTWRD	;GET BLOCK+4			[157]
	HRRZM	T3,AGEODN	;SAVE FOR DIRECTORY READER	[157]
	POP	P,T4		;RESTORE SPEC POINTER
	SUBTTL	LOOKUP ONE FILE

	JUMPN	P1,[SKIPN NOTDSK ;IF ALREADY SETUP, CONTINUE
		    JRST  WILDN	;WITH DISK
		    MOVE  P1,.WILAS  ;OR AFTER
		    JRST  LOOKST] ; NON-DISK
	MOVX	T1,%LDMFD	;GET LOCATION OF MFD
	GETTAB	T1,		;FROM MONITOR
	  MOVE	T1,[1,,1]	;(LEV C)
	MOVEM	T1,MFDPPN	;SAVE FOR LATER

IFN FT$SFD,<
	SETZM	PTHARG		;CLEAR PATH
	MOVE	T1,[PTHARG,,PTHARG+1]
	BLT	T1,PTHEND	; ..
	MOVE	T1,[PTHLEN-1,,PTHARG]
	SETOM	PTHARG		;-1 MEANS RETURN DEFAULT PATH
	PATH.	T1,		;GET DEFAULT PATH
	  SETZM	PTHARG		;IF ERROR, CLEAR ARGUMENT
>
	GETPPN	T1,		;GET USER'S NUMBER
	  JFCL			;IN CASE OF JACCT
	MOVEM	T1,MYPPN	;STORE FOR LATER
IFN FT$SFD,<
	SKIPN	PTHDIR		;SEE IF PATH. WORKED
	MOVEM	T1,PTHDIR	;NO--SIMULATE IT
>

	SKIPA	P1,T4		;BRAND NEW--GET STARTING POINT

;LOOP OVER EACH FILE SPECIFICATION IN THE REQUEST
; TO FIND ANY AND ALL FILES WHICH MATCH IT

LOOKST:	ADD	P1,AGLENP	;NOT BRAND NEW--ADVANCE PARAMETER
	HRRZM	P1,@AGPNTR	;STORE CURRENT POINTER FOR USER
	CAMG	P1,AGLIMS	;SEE IF AT END YET
	JRST	LOOKGO		;NO--GO DO OUR BIT
	SETO	T1,		;YES--FLAG ALL DONE
	EXCH	P1,SAVEP1	;RESTORE POINTER
	POPJ	P,	

;HERE WHEN AN INPUT REQUEST HAS BEEN SPECIFIED AND SETUP IN P1

LOOKGO:	SETZM	FWAZER		;CLEAR TEMPORARIES
	MOVE	T1,[FWAZER,,FWAZER+1]	; ..
	BLT	T1,LWAZER	; ..
	MOVEM	P1,.WIFIR	;SAVE STARTING BLOCK
;LOOP TO DISCOVER A SET OF CONCATENATED FILE SPECIFICATIONS
;THE USER HAS CONCATENATED THEM TO CAUSE A SINGLE PASS WILD SEARCH.

LOOK1:	MOVEM	P1,.WILAS	;SAVE ENDING BLOCK
	PUSHJ	P,SETDIR	;SETUP DIRECTORY DEFAULTS
	LDB	T1,[POINTR (.FXMOD(P1),FX.TRM)]  ;GET TERMINATION
IFN FT$COR,<
	CAIN	T1,.FXTRC	;IF "+"				[300]
	MOVEI	T1,.FXTRO	; TREAT AS 'OR'			[300]
>
	CAIE	T1,.FXTRA	;IF 'AND'			[300]
	CAIN	T1,.FXTRO	; OR 'OR'			[300]
	JRST	LOOK1A		; CONTINUE IN SET		[300]
	CAIE	T1,.FXTRN	;UNLESS 'NOT'			[300]
	JRST	DIR1		; END SET			[300]
LOOK1A:	MOVE	T1,.FXDEV(P1)	;YES--COMPARE DEVICES
	ADD	P1,AGLENP	;ADVANCE TO NEXT ONE
	CAMG	P1,AGLIMS	;SEE IF OFF END
	CAME	T1,.FXDEV(P1)	;TEST
	JRST	DIR1		;DIFFERENT--IGNORE +
	PUSHJ	P,SETDIR	;SETUP DIRECTORY DEFAULTS
	MOVE	T1,.WIFIR	;SAME--COMPARE DIRECTORY
	MOVE	T2,.FXMOD(T1)	;COMPARE			[141]
	XOR	T2,.FXMOD(P1)	; /PHYSICAL			[141]
	TXNE	T2,FX.STR!FX.PHY ;AND /STR			[141]
	JRST	DIR1		;DIFFERENT--THAT'S ALL		[141]
	MOVE	T2,P1		; ENTRY
	HRLI	T1,-2*.FXLND	; BY
LOOK2:	MOVE	T3,.FXDIR(T2)	; ENTRY
	AOS	T2		; ..
	CAMN	T3,.FXDIR(T1)	; ..
	AOBJN	T1,LOOK2	;LOOP BACK
	JUMPGE	T1,LOOK1	;LOOP IF MATCHED
;HERE WHEN CONCATENATED REQUESTS HAVE BEEN SELECTED TO DETERMINE
; WHAT TYPE OF SEARCHING TO DO ACROSS STRS

DIR1:	MOVE	P1,.WIFIR	;REFETCH POINTER
	MOVX	T1,FX.PHY	;SEE IF USER ASKED FOR PHYS.
	TDNN	T1,.FXMOD(P1)	; ..
	JRST	NOTPHY		;NO--SKIP TESTS
	MOVSI	T1,'SYS'	;YES--SEE IF POSSIBLE
	DEVCHR	T1,UU.PHY	; BY TRYING ONE
	TRNE	T1,-1		;SEE IF GOT SOMETHING BACK
	SETOM	PHYS		;YES--SET FOR PHYS I/O
NOTPHY:	MOVSI	T2,.FXDEV(P1)	;POINT TO ARGUMENT AREA
	HRRI	T2,FSTR		;POINT TO INTERNAL AREA
	BLT	T2,ENDERR	;COPY FOR ANY ERROR MESSAGES

	MOVE	T2,.FXDEV(P1)	;GET NAME
	PUSHJ	P,DOPHYS	;GET PHYSICAL
	  DEVNAM T2,		; DEVICE
	    MOVEI T2,0		; NAME
	HLRZ	T3,T2		;SAVE GENERIC PART
	SYSSTR	T2,		;SEE IF STRUCTURE NAME
	  SKIPA			;NO--OK
	MOVEI	T3,0		;YES--KILL NAME
	MOVE	T2,.FXDEV(P1)	;FIND OUT IF STRUCTURE SEARCH NECESSARY
	PUSHJ	P,DOPHYS	;PERFORM PHYSICAL I/O CALL
	  DEVCHR T2,		;SEE IF DISK TYPE DEVICE
	CAIN	T3,'NUL'	;SEE IF NUL:
	TLO	T2,-1-<(DV.TTA)> ;YES--CHANGE DEVCHR BITS
	MOVEM	T2,DVCH		;SAVE FOR USER
	TLC	T2,-1-<(DV.TTA)> ;BUT NOT
	TLCE	T2,-1-<(DV.TTA)> ; NUL:
	TXNN	T2,DV.DSK	; ..
	SKIPA			;BAD
	JRST	ISDISK		;OK--PROCEED
	SKIPL	AGFLAG		;SEE IF ALL DEVICES TO BE HANDLED
	JRST	[MOVE	T1,T2	;NO--POSITION DEVCHR
		 EXCH	P1,SAVEP1 ;RESTORE P1
		 SETOM	NOTDSK	;SET FLAG
		 POPJ	P,]	;AND RETURN
	MOVX	T3,FX.DIR	;CLEAR
	ANDCAM	T3,.FXMOD(P1)	;  DIRECTORY
	SETZM	.FXDIR(P1)	;CLEAR DIRECTORY
	SETZM	.FXDIM(P1)	; TO AVOID CONFUSION
	TLC	T2,-1-<(DV.TTA)> ;WATCH OUT FOR
	TLCE	T2,-1-<(DV.TTA)> ; NUL:
	TXNN	T2,DV.DTA	;SEE IF DECTAPE
	SKIPA			;NO
	JRST	ISDTA		;YES--GO HANDLE
	SETOM	NOTDSK		;FLAG FOR REENTRY
	JRST	STR7		;GO SETUP OPEN BLOCK
ISDTA:	SETOM	FLDTA		;SET FLAG FOR LATER ON
ISDISK:	SETCM	T1,.FXNMM(P1)	;GET NAME MASK
	IOR	T1,.FXNAM(P1)	;AND NAME
	JUMPE	T1,E$$NFS	;ERROR IF NO NAME SPECIFIED
	HLRZ	T1,.FXEXT(P1)	;GET EXTENSION
	SKIPN	FLDTA		;IF NOT DECTAPE
	CAIE	T1,'UFD'	;AND UFD
	SETCM	T1,.FXNMM(P1)	;CHECK NAME MASK FOR WILDCARD
	JUMPN	T1,SEEIFD	;IF SO, GO DO WILD THINGS
	MOVEI	T2,.FXDIR(P1)	;NO--CHECK DIRECTORY
	HRLI	T2,-.FXLND	;ENTRY BY ENTRY
NOTPH1:	SKIPN	(T2)		;CHECK DIRECTORY
	SKIPE	1(T2)		; AND WILDCARD
	SKIPA			;SOMETHING THERE
	JRST	NOTPH2		;IF NULL, MUST BE DONE
	SETCM	T1,1(T2)	;NO--CHECK DIRECTORY MASK
	JUMPN	T1,SEEIFD	;IF WILD GO SEE IF LEVEL D
	AOS	T2		;ANDVANCE
	AOBJN	T2,NOTPH1	;AND LOOP BACK
NOTPH2:	SETCM	T1,.FXEXT(P1)	;NO--CHECK EXTENSION
	CAMN	P1,.WILAS	;SEE IF CONCATENATION
	TRNE	T1,-1		;TEST EXT. MASK
	JRST	SEEIFD		;WILD--GO SEE IF LEVEL D

;HERE IF NOT A WILD FILE SPECIFICATION

	MOVX	T1,FX.STR	;NOT WILD--SEE IF STR WILD
	TDNE	T1,.FXMOD(P1)	; BEING RQUESTED
	SKIPE	FLDTA		;AND NOT DTA:
	JRST	STR7		;NO--JUST USE USER'S DEVICE
	MOVEI	T1,1		;YES--FLAG STR WILD (BUT NOT FILE)
	JRST	DIR2		;AND GO SELECT A SEARCH LIST

;HERE WHEN THE FILE IS WILD

SEEIFD:	SETOB	T1,.WLDFL	;SET WILD FILE FLAG
	SKIPE	FLDTA		;SEE IF DECTAPE
	JRST	STR7		;YES--NO DIRECTORY JUNK
DIR2:	MOVX	T2,%CNSTS	;SEE IF LEVEL D SYSTEM
	GETTAB	T2,		; ..
	  MOVEI	T2,0		;(NO)
	TXNN	T2,ST%TDS	;TEST FIELD
	JRST	DIR4		;NO--NO FUNNY F/S LOGIC
	MOVEM	T1,.WLDFL	;YES--STORE FILE WILD FLAG
	TXNE	T2,<ST%TDS-1B9>	;SEE IF 5.03 OR LATER
	SETOM	SY2RCH		;YES--SET FLAG THAT REAL SYS: SL IS AVAILABLE

	SETZM	SUBSTR		;INDICATE INTERNAL CALL
	PUSHJ	P,INSTR		;GO INITIALIZE STR SEARCHING
	  HALT	.+1		;NOT A DISK!
	MOVE	P1,.WIFIR	;RESTORE INDEX
	JUMPGE	T1,STR6		;IF NOT SEARCHING, SKIP STR LOGIC
	SKIPGE	.WLDFL		;IF WILD FILES,
	SOS	.WLDFL		;SET FLAG TO -2 TO INDICATE WILD STRS AS WELL
	MOVSI	T1,'SYS'	;SEE IF PHYSICAL IS POSSIBLE
	DEVCHR	T1,UU.PHY	;BY TRYING A DEVICE KNOWN TO EXIST
	TRNE	T1,-1		;IF IT WORKED,
	SETOM	PHYS		;  FORCE PHYSICAL SINCE STR NAMES
				;  SHOULD NOT BE TRANSFORMED
	JRST	STR1		;GO GET A STRUCTURE
;HERE IF LEVEL-C WILDCARD INDICATED
;NEED TO CHECK FOR "SYS:" AND FIXUP DIRECTORY IF SO

DIR4:	MOVS	T1,FSTR		;GET DEVICE
	CAIN	T1,'SYS'	;SEE IF "SYS:"
	PUSHJ	P,SETSYS	;YES--SETUP FOR SYS:
	JRST	STR7		;PROCEED WITHOUT F/S LOGIC

;BACK HERE TO PROCEED TO NEXT STRUCTURE

STR1:	MOVE	P1,.WIFIR	;RESET INDEX
	PUSHJ	P,.NXSTR	;GET NEXT STRUCTURE
	JUMPE	T1,LOOKEN	;IF DONE, GO TO NEXT REQUEST
	JRST	STR7		;GO PROCESS THIS STRUCTURE

;HERE WHEN NO NEED TO SEARCH STRUCTURES

STR6:	SKIPL	.WLDFL		;SEE IF WILD FILE FLAG
	SETZM	.WLDFL		;YES--CLEAR WILD CARD INDICATOR

;HERE TO START ONE DEVICE (FILE STRUCTURE)

STR7:	AOS	NOSTRS		;COUNT STR SELECTED
	PUSHJ	P,SETOPN	;SETUP AN OPEN BLOCK
	MOVE	T4,DVCH		;GET DEVICE CHARS
	TLC	T4,-1-<(DV.TTA)> ;SEE IF NUL:
	TLCE	T4,-1-<(DV.TTA)> ;IF SO, NOT MAG TAPE
	TXNN	T4,DV.MTA	;XEE IF MAG TAPE
	JRST	NOTMTA		;NO--PROCEED
	MOVX	T4,FX.PAR	;GET BIT FOR TEST
	TDNE	T4,.FXMOD(P1)	;SEE IF /PAR:EVEN
	TXO	T1,IO.PAR	;YES--SET INTO OPEN
	LDB	T4,[POINTR (.FXMOD(P1),FX.DEN)] ;GET /DEN
	DPB	T4,[POINTR (T1,IO.DEN)] ;SET INTO OPEN
NOTMTA:	MOVE	T4,AGOPEN	;POINT TO USER AREA
	MOVEM	T1,(T4)		;STORE PHYSICAL BIT, ETC.
	MOVEM	T2,1(T4)	;STORE DEVICE NAME
	MOVEI	T3,B.DC		;POINT TO BUFFER HEADER FOR INPUT
	MOVEM	T3,2(T4)	;STORE FOR USER
	SKIPE	NOTDSK		;SEE IF NOT DIRECTORY
	JRST	UFD6		;RIGHT--GO GIVE ANSWERS
	SETZB	T4,DEPTH	;CLEAR DEPTH OF NEST
	JRST	WILDSN		;GO START A NEW UFD
;BACK HERE TO GET NEXT FILE IN THIS DIRECTORY

WILDN:	MOVE	P1,.WIFIR	;RESET SPEC POINTER
	MOVE	T4,DEPTH	;SET INDEX TO TABLES
	SETZB	T3,DIRBU(T4)	;CLEAR DIRECTORY AT THIS LEVEL
	LSH	T4,1		;GET DOUBLE WORD POINTER
	SETZM	UFDPPN(T4)	;CLEAR ERROR MESSAGE STORAGE
	SETZM	UFDPPN+1(T4)	;  AND ITS MASK
	LSH	T4,-1		;REPOSITION COUNTER
	SKIPG	DIRSTI(T4)	;SEE IF WILD AT THIS LEVEL
	JRST	WILDE		;NO--PRETEND EOF THIS DIRECTORY
	SKIPE	DIRFLG		;SEE IF DIRECTORY BEING REPEATED
	JRST	WILDP		;YES--DON'T ADVANCE BUFFER
	SOSGE	BUFCNT(T4)	;COUNT DOWN FILES IN THIS BLOCK
	JRST	WILDR		;NON LEFT--GO READ NEXT BLOCK
	MOVEI	T3,2		;OK--ADVANCE TWO WORDS
	SKIPE	FLDTA		;SEE IF DECTAPE
	MOVEI	T3,1		;YES--ADVANCE ONE WORD
WILDP:	ADDB	T3,BUFPOS(T4)	;NOTE NEW POSITION
	SKIPE	FLDTA		;SEE IF DECTAPE
	ADDI	T3,^D84		;POSITION TO FILE NAME
	MOVE	T1,.WLDBF-2(T3)  ;GET FILE NAME
	JUMPE	T1,WILDN	;NULL--LOOP FOR NEXT FILE
	SKIPE	FLDTA		;SEE IF DECTAPE
	ADDI	T3,^D21		;POINT TO EXTENSION
	HLRZ	T2,.WLDBF-1(T3)  ;GET EXTENSION
	SKIPE	FLDTA		;SEE IF DECTAPE
	JRST	WILDF		;YES--NO DIRECTORY JUNK
	CAIN	T2,'SFD'	;SEE IF SUB-FILE DIRECTORY
	JUMPN	T4,WILDS	;YES--GO HANDLE
	SKIPGE	FNDSFD(T4)	;IF REPEATING FOR SFD'S		[160]
	JRST	WILDN		; IGNORE ALL OTHER FILES	[160]
	CAIN	T2,'UFD'	;SEE IF DIRECTORY
	JUMPE	T4,WILDU	;YES--GO HANDLE
WILDF:	LSH	T4,1		;DOUBLE DEPTH
	ADDI	T4,(P1)		;POINT TO INPUT SPEC
	SKIPE	T3,.FXDIM(T4)	;GET DIRECTORY MASK		[143]
	JRST	WILDN		;NO--NO FILE ALLOWED HERE
;HERE WHEN FOUND A POSSIBLE FILE--SEE IF IT MATCHES
	AOS	NOFIL		;COUNT FILE AS SEEN
WILDC:	MOVE	T3,T1		;GET THIS FILE
	XOR	T3,.FXNAM(P1)	;COMPARE
	HRLZ	T4,T2		;GET THIS EXT
	XOR	T4,.FXEXT(P1)	;COMPARE,,FETCH MASK
	TDNN	T3,.FXNMM(P1)	;CHECK NAME
	TLNE	T4,(T4)		;CHECK EXT
	JRST	WILDCP		;FAIL--GO LOOP
	JRST	UFD7		;WIN--GO GIVE ANSWER TO USER
WILDCP:	ADD	P1,AGLENP	;ADVANCE SPEC POINTER
	CAMG	P1,.WILAS	;SEE IF STILL IN RANGE
	JRST	WILDC		;YES--GO BACK AND CHECK
	JRST	WILDN		;NO--GO GET NEXT FILE

;BACK HERE WHEN NEW DIRECTORY AND NO WILDCARD NEEDED
WILDNW:	SKIPN	DEPTH		;IF TOP LEVEL,			[154]
	SKIPN	T1,FRCPPN	; AND NOT FORCING DIRECTORY	[154]
	MOVE	T1,.FXDIR(T3)	;GET NAME
	SETOM	DIRSTI(T4)	;SET -1 FOR NO-WILD FLAG
	MOVE	T4,T3		;SETUP INDEX TO ARGS
	JRST	WILDK		;GO HANDLE DIRECTORY
;HERE WHEN UFD OR SFD SEEN IN SCANNING THE DIRECTORIES

WILDS:	SKIPL	FNDSFD(T4)	;UNLESS SFD SECOND PASS,	[160]
	SKIPE	DIRFLG		;SEE IF DIRECTORY REPEATED
	JRST	WILDL		;YES--HANDLE AS DIRECTORY NOW
	MOVX	T3,DIRSFD	;SEE IF USER WANTS SFD LATER	[160]
	TDNE	T3,AGFLAG	; (IT'S SLOWER)			[160]
	JRST	[AOS   FNDSFD(T4) ;YES--INDICATE ONE FOUND	[160]
		 JRST  WILDF]	;AND DO THIS AS FILE NOW	[160]
	SETOM	DIRFLG		;NOT YET--SET FLAG
	JRST	WILDF		;AND HANDLE AS FILE FIRST
WILDU:
WILDL:	SETZM	DIRFLG		;CLEAR DIRECTORY FLAG
	LSH	T4,1		;DOUBLE DEPTH INDEX
	ADDI	T4,(P1)		;POINT TO INPUT SPEC
WILDK:	SKIPN	DEPTH		;SEE IF TOP LEVEL		[154]
	SKIPN	T3,FRCPPN	;YES--SEE IF FORCING PPN	[154]
	MOVE	T3,.FXDIR(T4)	;NO--GET THIS DIRECTORY IN REQUEST
	JUMPE	T3,WILDN	;NO--GO HANDLE AS FILE

	TLNN	T1,-1		;SEE IF LH=0
	JRST	WILDN		;YES--CAN'T HAPPEN UNLESS MONITOR ERROR
	MOVE	T3,DEPTH	;YES--GET DEPTH OF OUR WORK
	MOVEM	T1,DIRBU(T3)	;SAVE DIRECTORY NAME
	LSH	T3,1		;DOUBLE POINTER
	MOVEM	T1,UFDPPN(T3)	;STORE FOR POSSIBLE ERROR MESSAGE
	SETOM	UFDPPN+1(T3)	;SET MASK ON FULL
	SKIPN	DEPTH		;SEE IF TOP LEVEL		[154]
	SKIPN	FRCPPN		;YES--SEE IF FORCING PPN	[154]
	SKIPA			;NO				[154]
	JRST	WILDJ		;YES--MATCH			[154]
	XOR	T1,.FXDIR(T4)	;COMPARE TO REQUEST
	TDNE	T1,.FXDIM(T4)	;SEE IF MATCH
	JRST	WILDN		;NO--GO TRY AGAIN
	JUMPN	T3,WILDJ	;SEE IF UFD
	SKIPE	T1,.FXDIM(T4)	;YES--SEE IF [*,NOT*]
	TLNE	T1,-1		; ..
	JRST	WILDJ		;NO--OK TO PROCEED
	MOVE	T1,MYPPN	;YES--GET OUR NUMBER
	MOVE	T2,UFDPPN	;AND TARGET NUMBER
	TLNE	T1,777770	;SEE IF WE ARE GT PROJ 7
	TLNE	T2,777770	;AND TARGET IS LE PROJ 7
	JRST	WILDJ		;NO--PROCEED
	JRST	WILDN		;YES--SKIP MATCH SINCE THIS
				; IS TO A SYSTEM FILE FROM USER
WILDJ:	AOS	T4,DEPTH	;LOOKS GOOD--ADVANCE DEPTH OF SEARCH
	CAIG	T4,.FXLND	;SEE IF TOO DEEP
	JRST	WILDSN		;NO--PROCEED
	SOS	DEPTH		;YES--BACK UP
	JRST	WILDN		;AND TRY AGAIN
;HERE WHEN NEW DIRECTORY SELECTED

WILDSN:	MOVEI	T3,(T4)		;GET DEPTH
	LSH	T3,1		;DOUBLE IT
	ADDI	T3,(P1)		;POINT TO INPUT SPEC
	SKIPE	T4		;SEE IF LOWER LEVEL		[154]
	SKIPN	FRCPPN		;YES--SEE IF FORCED PPN		[154]
	CAIN	T4,.FXLND	;NO--SEE IF LIMIT OF DIRECTORY	[154]
	JRST	WILDSG		;YES--GO WITH MATCH		[154]
	SKIPE	FRCPPN		;IF PPN FORCED,			[154]
	JRST	WILDNW		;  TREAT AS NO WILD-CARDS	[154]
	SETCM	T2,.FXDIM(T3)	;GET MASK
	JUMPE	T2,WILDNW	;IF NO WILD CARD, GO DOWN ONE LEVEL
	SKIPE	.FXDIR(T3)	;  OF REQUESTED DIRS.
	JRST	WILDD		;NO--SKIP ON
WILDSG:	AOS	NOUFDF		;YES--COUNT DIRECTORY AS FOUND
	AOS	NSUFD		;PRECOUNT SUCCESSFUL LOOKUP
	SKIPL	.WLDFL		;SEE IF WILD FILE NAME
	JRST	UFD6		;NO--GIVE TO CALLER
WILDD:	SETZM	DIRSTI(T4)	;CLEAR USETI POINTER

;HERE WHEN TIME TO READ NEXT BLOCK OF A DIRECTORY

WILDR:	MOVEI	T1,100		;SET FOR 100
	SKIPE	FLDTA		;SEE IF DECTAPE
	MOVEI	T1,^D22		;YES--ONLY 22 FILES
	MOVEM	T1,BUFCNT(T4)	;  FILES IN A BLOCK
	SETZM	BUFPOS(T4)	;CLEAR POSITION IN BLOCK
WILDRR:	PUSHJ	P,SETOPN	;SETUP OPEN BLOCK
	HRRI	T1,.IODMP	;READ IN DUMP MODE
	SKIPE	FLDTA		;SEE IF DECTAPE			[136,144]
	TXO	T1,IO.NSD!IO.SSD  ;YES--SET SEMI-STANDARD MODE	[136]
	OPEN	WC,T1		;OPEN WILD CHANNEL
	  JRST	E.UFO		;ERROR--GO ISSUE MESSAGE
	SKIPN	FLDTA		;SEE IF DECTAPE
	JRST	WILDRD		;NO--CHECK DIRECTORY
	SKIPE	DIRSTI		;SEE IF FIRST TIME HERE
	JRST	WILDE		;NO--GO HANDLE AS EOF
	MOVEI	T1,^D100	;SET FOR DECTAPE POSITION
	MOVEM	T1,DIRSTI	;FLAG FOR NEXT TIME
	JRST	WILDRI		;GO READ BUFFER
WILDRD:	SETZM	DIRBU-1		;ALWAYS CLEAR SWITCHES (AND MFD)
	MOVE	T1,DIRBU-1(T4)	;GET THIS DIRECTORY'S NAME
	SETZM	DIRBU-1(T4)	;CLEAR DIRECTORY
	CAIG	T4,1		;SEE IF UFD
	JRST	WILDRM		;YES--GO HANDLE IT
	MOVSI	T2,'SFD'	;SET FOR SFD
	MOVEI	T4,DIRB		;POINT TO PATH
	MOVEI	T3,1		;INDICATE NO
	MOVEM	T3,DIRBS	;  DIRECTORY SCANNING
	SKIPN	DIRBU+1		;SEE IF FIRST SFD
	MOVE	T4,DIRBU	;YES--GET UFD
	JRST	WILDRL		;GO LOOKUP DIRECTORY
WILDRM:	MOVSI	T2,'UFD'	;SET UFD
	MOVE	T4,MFDPPN	;SET MFD
	SKIPN	T1		;SEE IF TOP LEVEL
	MOVE	T1,T4		;YES--READ MFD ITSELF
WILDRL:	MOVEI	T3,0		;CLEAR E+2
	LOOKUP	WC,T1		;LOOKUP DIRECTORY
	  JRST	E.UFL		;ERROR--GO GIVE MESSAGE
	SETZM	DIRBU-1		;CLEAR SWITCHES (AND MFD)
	SKIPE	T4,DEPTH	;RESTORE DEPTH
	MOVEM	T1,DIRBU-1(T4)	;SET DIRECTORY
	HLRZ	T1,T3		;GET PROTECTION CODE
	ANDI	T1,(RB.PRV)	;CLEAR TO JUST DIRECT. PROT.
	HRLI	T1,.ACSRC	;SET SEARCH DIRECTORY FUNCTION
	MOVE	T3,MYPPN	;GET USER'S NUMBER
	SKIPN	T2,DIRBU	;GET DIRECTORY OWNER
	MOVE	T2,MFDPPN	;IF MFD, USE MFD NUMBER
	MOVEI	T4,T1		;POINT TO ARGS
	CHKACC	T4,		;CHECK ACCESS RIGHTS
	  MOVEI	T4,0		;(ASSUME OK)
	MOVEI	T2,ERPRT%	;SET PROTECTION ERROR JUST IN CASE
	HRLZ	T3,T1		;RESTORE PROTECTION JUST IN CASE
	JUMPN	T4,E.UFL1	;GIVE ERROR IF NOT PERMITTED

	MOVE	T4,DEPTH	;RESTORE DEPTH INDEX
	AOS	T1,DIRSTI(T4)	;ADVANCE BLOCK COUNT
	CAILE	T1,1
WILDRI:	USETI	WC,(T1)		;POSITION FILE
	MOVE	T1,[-200,,.WLDBF-1]
	MOVEI	T2,0		;SETUP DUMP LIST
	IN	WC,T1		;READ BUFFER
	  JRST	WILDRK		;OK
	STATZ	WC,IO.ERR	;SEE IF ANY ERRORS
	  PUSHJ	P,E.UFE		;YES--GO TELL USER
	STATO	WC,IO.EOF	;SEE IF END OF FILE
	  JRST	WILDRK		;NO--PROCEED WITH THIS BLOCK
;HERE AT END OF FILE IN A DIRECTORY

WILDE:	MOVEI	T1,CL.ACS	;DON'T UPDATE ACCESS DATE	[145]
	MOVE	T2,DIRBU	;IDENTIFY OWNER			[145]
	CAME	T2,MYPPN	;SEE IF SELF			[145]
	TRO	T1,CL.DAT	;NO--DELETE ACCESS TABLE	[145]
	CLOSE	WC,(T1)		;CLOSE DELETING ACCESS TABLES	[145]
	RELEAS	WC,		;RELEASE CHANNEL
	MOVE	P1,SAVEP1	;RESTORE AC			[157]
	SKIPE	AGEODN		;SEE IF USER WANTS TO HEAR	[157]
	PUSHJ	P,@AGEODN	; AT EO DIRECTORY		[157]
	MOVE	P1,.WIFIR	;RESTORE INDEX			[157]
	MOVE	T4,DEPTH	;GET DEPTH AS INDEX		[160]
	SKIPE	T1,FNDSFD(T4)	;SEE IF NEED SECOND PASS FOR SFD [160]
	JRST	[SETZM FNDSFD(T4) ;YES--INDICATE DONE		[160]
		 JUMPL T1,.+1	;IF END OF SECOND PASS, DONE	[160]
		 SETOM FNDSFD(T4) ;ELSE, FLAG FOR SECOND PASS	[160]
		 JRST  WILDD]	;AND DO SECOND PASS		[160]
	SOSGE	T4,DEPTH	;BACK OFF DEPTH
	JRST	STR1		;DONE WITH MFD--GO TO NEXT STR
	SETZM	DIRBU(T4)	;CLEAR DIRECTORY ENTRY
	SOSL	DIRSTI(T4)	;BACKUP BUFFER INDEX(TO FILE)
	JRST	WILDRR		;AND RE-READ BUFFER
	JRST	WILDN		;NOT WILD--GO UP AGAIN

;HERE WHEN BLOCK READ

WILDRK:	CLOSE	WC,CL.ACS	;DON'T UPDATE ACCESS DATES
	RELEAS	WC,
	JRST	WILDN		;AND GO READ FOR FILES
;HERE  WHEN FILE PRESUMED (NO WILD CARD)
UFD6:	MOVE	T1,.FXNAM(P1)	;GET USER'S NAME
	HLRZ	T2,.FXEXT(P1)	;AND EXTENSION
	AOS	NOFIL		;COUNT FILE SEEN
;HERE WHEN A FILE IS FOUND
;SETUP ANSWER BLOCK FOR CALLING PROGRAM

UFD7:	AOS	NOFILF		;COUNT FILE FOUND
	MOVEM	T1,FNAM		;SAVE FILE NAME
	HRLZM	T2,FEXT		;SAVE FILE EXTENSION
	MOVE	T2,AGLENL	;GET LENGTH OF LOOKUP BLOCK
	MOVE	T1,AGLOOK	;GET START OF LOOKUP BLOCK
	MOVEI	T3,-1(T2)	;SET LENGTH IN BLOCK
	PUSHJ	P,.PTWRD##	;STORE IN BLOCK+0
IFE FT$SFD,<
	MOVE	T3,UFDPPN
>
IFN FT$SFD,<
	SKIPN	DIRBU+1		;SEE IF PATH NEEDED
	SKIPA	T3,DIRBU	;NO--GET UFD
	MOVEI	T3,DIRB		;YES--SETUP POINTER
>
	JUMPN	T3,UFD8		;IF DIRECTORY SETUP, PROCEED
	MOVX	T4,FX.DIR	;SEE IF USER SAID NO DIRECT.
	TDNE	T4,.FXMOD(P1)	; ...
	MOVE	T3,MFDPPN	;NO--SO MUST BE MFD
UFD8:	MOVE	T4,T3		;SAVE FOR LATER
	PUSHJ	P,.PTWRD##	;STORE IN BLOCK+1
	MOVE	T3,FNAM		;GET FILE NAME
	PUSHJ	P,.PTWRD##	;STORE IN BLOCK+2
	HLLZ	T3,FEXT		;GET EXTENSION
	PUSHJ	P,.PTWRD##	;STORE IN BLOCK+3
	MOVEI	T3,0		;CLEAR PRIV WORD
	PUSHJ	P,.PTWRD##	;STORE IN BLOCK+4
	MOVE	T3,T4		;GET DIRECTORY AGAIN FOR LEVEL C
	PUSHJ	P,.PTWRD##	;STORE IN BLOCK+5
	MOVEI	T3,0		;ZERO ALL THE REST
	PUSHJ	P,.PTWRD##	;STORE IN BLOCK+6, ETC.
	JUMPG	T2,.-1		;LOOP UNTIL DONE
	MOVEM	P1,@AGPNTR	;UPDATE ARG POINTER FOR CALLER	[142]
	EXCH	P1,SAVEP1	;RESTORE ARGUMENT
	SETCM	T2,FLDTA	;GET -1 IF DISK, 0 IF DECTAPE
	SKIPE	NOTDSK		;SEE IF NOT DIRECTORY DEVICE
	MOVEI	T2,1		;RIGHT--SET FLAG
	MOVE	T1,DVCH		;RESTORE DEVICE CHARS.
	JRST	CPOPJ1		;RETURN SUCCESSFULLY
;.CHKTM -- SUBROUTINE TO CHECK CREATION DATE/TIME OF FILE
;	AGAINST /BEFORE AND /SINCE SWITCHES
;	FOR DISK FILES, IT ALSO CHECKS /ABEFORE/ASINCE
;	AGAINST ACCESS DATE AND /LENGTH AGAINST FILE LENGTH
;.CHKTA -- DITTO EXCEPT TESTS FOR ANY DEVICE
;CALL:	(AFTER LOOKUP AFTER LAST RETURN FROM .LKWLD)
;	PUSHJ	P,.CHKTM
;	  RETURN IF TOO OLD OR TOO YOUNG
;	RETURN IF OK
;USES T1-4

.CHKTM::SKIPE	NOTDSK		;SEE IF NONDIRECTORY
	SKIPE	FLDTA		; AND NOT DECTAPE		[156]
	SKIPA			;OK--GO DO			[156]
	JRST	CPOPJ1		;YES--ASSUME OK
.CHKTA::MOVE	T1,AGLOOK	;GET POINTER TO LOOKUP BLOCK
	MOVE	T2,.RBPRV(T1)	;CREATION TIME/DATE MUST EXIST
	LDB	T3,[POINTR (.RBEXT(T1),RB.CRX)]
	LSH	T3,WID(RB.CRD)	;GET EXTENSION OF CREATION DATE
	SKIPE	FLDTA		;IF DECTAPE,			[156]
	TDZA	T1,T1		; NO CREATION TIME		[156]
	LDB	T1,[POINTR (T2,RB.CRT)]  ;GET CREATION TIME
	IMULI	T1,^D60000	;CONVERT TO MILLI-SEC.
	ANDI	T2,RB.CRD	;MASK DATE
	ADD	T2,T3		;COMBINE WITH DATE EXTENSION
	PUSHJ	P,.CNVDT##	;CONVERT TO INTERNAL FORMAT
	MOVEM	T1,FLCRDT	;STORE FOR LOOP			[300]
	MOVE	T1,AGLOOK	;POINT TO LOOKUP BLOCK		[300]
	MOVE	T2,.RBEXT(T1)	;GET ACCESS DATE		[161]
	ANDX	T2,RB.ACD	;REMOVE JUNK			[161]
	MOVEI	T1,0		;CLEAR TIME			[161]
	PUSHJ	P,.CNVDT##	;CONVERT TO INTERNAL FORMAT	[161]
	MOVEM	T1,FLACDT	;STORE FOR LOOP			[300]

;LOOP OVER EACH SPEC IN THE CONCATENATED SET LOOKING FOR MATCH

	MOVE	T4,.WIFIR	;START AT START			[300]
;HERE WHEN WINNING SO FAR

CHKTML:	PUSHJ	P,CHKTST	;TEST NEXT SPEC FOR MATCH
	  JRST	CHKTMB		;NO--BAD MATCH
CHKTMD:	LDB	T1,[POINTR (.FXMOD(T4),FX.TRM)] ;GET TERMINATOR
	JRST	@[CPOPJ1	;END--WIN BIG
		  CHKTMC	;'AND'--NEXT MUST ALSO WIN
		  CPOPJ1	;'OR'--WIN BIG
		  CHKTMN	;'NOT'--NEXT MUST NOT WIN
		  CPOPJ1	;+ (INDEPENDENT OF FT$COR)--WIN BIG
		  CPOPJ1	; (5)--ASSUME WIN BIG
		  CPOPJ1	; (6)--ASSUME WIN BIG
		  CPOPJ1](T1)	; (7)--ASSUME WIN BIG

;HERE WHEN OK SO FAR, THEN 'NOT'

CHKTMN:	PUSHJ	P,CHKTAD	;ADVANCE TO NEXT SPEC
	  JRST	CPOPJ1		;NOT THERE!--ASSUME BIG WIN
	PUSHJ	P,CHKTST	;TEST FOR MATCH
	  JRST	CHKTMD		;NO--PROCEED TO NEXT BASED ON SEPARATOR

;HERE WHEN LOST--MUST WAIT FOR NEXT 'OR' TO WIN

CHKTMB:	LDB	T1,[POINTR (.FXMOD(T4),FX.TRM)] ;GET TERMINATOR
	JRST	@[CHKTMF	;END--LOOSE BIG
		  CHKTMS	;'AND'--SKIP ON
		  CHKTMC	;'OR'--START MATCHING OVER
		  CHKTMS	;'NOT'--SKIP ON
		  CHKTMP	; + --DEPENDS ON FT$COR
		  CHKTMF	; (5)--ASSUME LOOSE BIG
		  CHKTMF	; (6)--ASSUME LOOSE BIG
		  CHKTMF](T1)	; (7)--ASSUME LOOSE BIG

;HERE WHEN SKIPPING TO NEXT 'OR' BECAUSE LOOSING

CHKTMS:	PUSHJ	P,CHKTAD	;ADVANCE TO NEXT SPEC
	  JRST	CHKTMF		;IF DONE, LOOSE BIG
	JRST	CHKTMB		;IF SOMETHING, REDISPATCH

;HERE WHEN WINNING AND 'AND' ENCOUNTERED

CHKTMC:	PUSHJ	P,CHKTAD	;ADVANCE TO NEXT
	  JRST	CPOPJ1		;IF DONE, ASSUME WIN BIG
	JRST	CHKTML		;THEN GO TEST THIS ALSO

;HERE IF TOO OLD OR TOO YOUNG
;	BACK DOWN SUCCESS COUNTER

CHKTMF:	SOS	NOFILF		;DECREMENT SUCCESS COUNTER
	AOS	NOFILR		;COUNT REJECTED FILE		[305]
	POPJ	P,		;GIVE BAD NEWS TO CALLER

;DEFINE + BEHAVIOUR
IFN FT$COR,<CHKTMP==CHKTMC>
IFE FT$COR,<CHKTMP==CHKTMF>
;CHKTST -- CHECK TO SEE IF CURRENT SPEC MATCHES FILE
;CALL:	MOVE	T4,ADDR OF SPEC
;	PUSHJ	P,CHKTST
;	NON-SKIP IF NO MATCH
;	SKIP IF MATCH
;USES T1-3

CHKTST:	MOVE	T3,AGLOOK	;GET RIB POINTER		[161]
	HLLZ	T2,.RBEXT(T3)	;GET EXTENSION
	XOR	T2,.FXEXT(T4)	;COMPARE TO MATCH
	MOVX	T1,FX.NUL	;IF USER OMITTED THE
	TDNE	T1,.FXMOD(T4)	; EXTENSION, THEN
	TLZ	T2,-1		; IGNORE IT IN TEST
	MOVE	T1,.RBNAM(T3)	;GET FILE NAME
	XOR	T1,.FXNAM(T4)	;COMPARE TO MATCH
	TDNN	T1,.FXNMM(T4)	;TEST AGAINST MASK
	TLNE	T2,(T2)		;TEST AGAINST MASK
	POPJ	P,		;NO--FAIL

	SKIPE	T1,.RBPPN(T3)	;GET DIRECTORY
	CAMN	T1,FRCPPN	;SEE IF BEING FORCED
	JRST	CHKTS1		;NONE OR FORCED--ASSUME MATCH DIRECTORY
	SKIPE	FRCPPN		;SEE IF FORCING
	POPJ	P,		;YES--DIDN'T MATCH SO REJECT
	SKIPN	.FXDIR(T4)	;SEE IF LEFT AT [-]
	JRST	CHKTS1		;YES--ASSUME MATCH
IFN FT$SFD,<
	TLNE	T1,-1		;SEE IF SFD
	JRST	CHKTSU		;NO--JUST CHECK UFD
	MOVEI	T2,(T4)		;GET COPY OF SPEC POINTER
	HRLI	T1,-.FXLND	;PROTECT END
CHKTSS:	MOVE	T3,.PTPPN(T1)	;GET SFD DIRECTORY
	XOR	T3,.FXDIR(T2)	;COMPARE TO SPEC
	SKIPN	.FXDIR(T2)	;SEE IF MATCH =0
	SKIPN	T3		;YES--ERROR IF VALUE NOT 0
	TDNE	T3,.FXDIM(T2)	;TEST MASK
	POPJ	P,		;ERROR IF NOT MATCH
	SKIPN	.PTPPN(T1)	;SEE IF END
	JRST	CHKTS1		;YES--WIN ON DIRECTORY
	ADDI	T2,2		;ADVANCE SPEC BIWORD
	AOBJN	T1,CHKTSS	;LOOP OVER DIRECTORY
	JRST	CHKTS1		;WIN IF ALL MATCH
>
CHKTSU:	XOR	T1,.FXDIR(T4)	;MATCH UFD
IFN FT$SFD,<
	SKIPE	.FXDIR+2(T4)	; (MAKE SURE
	SKIPN	.FXDIM+2(T4)	;   SFDS)
>
	TDNE	T1,.FXDIM(T4)	;TEST MASK
	POPJ	P,		;FAIL IF BAD
;NOW TEST SWITCHES

CHKTS1:	MOVE	T2,AGLENP	;GET BLOCK LENGTH		[161]
	MOVE	T1,FLCRDT	;GET CREATION DATE-TIME	[300]
	SKIPLE	.FXBFR(T4)	;SEE IF /BEFORE GIVEN
	CAMG	T1,.FXBFR(T4)	;YES--SEE IF TOO YOUNG
	CAMGE	T1,.FXSNC(T4)	;SEE IF TOO OLD
	POPJ	P,		;NO--REJECT

	CAILE	T2,.FXASN	;SEE IF INCLUDES /ASINCE/ABEFORE	[161]
	SKIPE	FLDTA		; AND IF DISK			[161]
	JRST	CPOPJ1		;NO--ALL DONE WITH TESTS	[161]
	MOVE	T1,FLACDT	;GET ACCESS DATE		[300]
	SKIPLE	.FXABF(T4)	;SEE IF /ABEFORE		[161]
	CAMG	T1,.FXABF(T4)	;YES--SEE IF OK			[161]
	CAMGE	T1,.FXASN(T4)	;OK--COMPARE TO /ASINCE		[161]
	POPJ	P,		;BAD--REJECT			[161]
	MOVE	T3,AGLOOK	;GET POINTER TO FILE SPEC
	SKIPL	T1,.RBSIZ(T3)	;IF FILE LENGTH SET,		[161]
	CAIG	T2,.FXFLM	; AND SCAN INCLUDES /LENGTH,	[161]
	JRST	CPOPJ1		;NO--ACCEPT AS OK		[161]
	SKIPL	.FXFLM(T4)	;SEE IF MAX SET			[161]
	CAMG	T1,.FXFLM(T4)	;YES--COMPARE			[161]
	CAMGE	T1,.FXFLI(T4)	;CHECK MIN			[161]
	POPJ	P,		;BAD--REJECT FILE		[161]
	JRST	CPOPJ1		;JUST RIGHT--GIVE OK RETURN

;CHKTAD -- ROUTINE TO ADVANCE WITHIN A CONCATENATED SPEC
;	MAINTAINS T4 AND AGPNTR

CHKTAD:	ADD	T4,AGLENP	;ADVANCE TO NEXT SPEC
	CAMG	T4,.WILAS	;SEE IF DONE
	AOSA	(P)		;NO--SKIP RETURN
	MOVE	T4,.WIFIR	;YES--GET CLEAN POINTER
	MOVEM	T4,@AGPNTR	;STORE POINTER
	POPJ	P,		;RETURN
;HERE AT END OF A REQUEST TO SEE IF ANYTHING WAS FOUND
;IF NOT, AN APPROPRIATE ERROR MESSAGE WILL BE TYPED

LOOKEN:	MOVX	T1,FX.NOM	;SEE IF WE CARE IF ANY MATCHED
	TDNE	T1,.FXMOD(P1)	; ..
	JRST	LOOKNY		;NO--NO WARNINGS AT ALL		[311]
	HRLZI	T1,.FXDEV(P1)	;COPY ORIGINAL REQUEST
	HRRI	T1,FSTR		;  INTO ANSWER AREA
	BLT	T1,ENDERR	;  FOR TYPE OUT
	SKIPE	NOFILF		;SEE IF ANYTHING FOUND
	JRST	[SKIPN NOFILP	;YES--SEE IF ANY FILES OR	[311]
		 SKIPE NODIRP	; DIRECTORIES PROTECTED		[311]
		 JRST  E$$SFP	;YES--WARN USER			[311]
		 JRST  LOOKNY]	;NO--JUST EXIT NORMALLY		[311]
	SKIPE	NOFILR		;SEE IF REJECTIONS		[305]
	JRST	E$$AFR		;YES--INDICATE THAT		[305]
	SKIPE	NODIRP		;SEE IF DIRECTORY PROT FAILURE	[307]
	JRST	E$$SDP		;YES--ISSUE ERROR		[307]
	SKIPE	NOFILP		;SEE IF PROTECT. FAILURES	[304]
	JRST	E$$AFP		;YES--ISSUE ERROR		[304]
	SKIPE	NOFIL		;NO--SEE IF ANY FILES EXAMINED
	JRST	E$$NSF		;YES--JUST NO SUCH FILES
	SKIPE	NOUFDF		;NO--SEE IF ANY DIRECTORIES MATCHED
	JRST	E.DEM		;YES--DIRECTORY EMPTY
	SKIPE	T2,LASERR	;SEE IF ANY ERRORS LEFT LYING AROUND
	JRST	DLYERR		;YES--GO GIVE THEM AS EXPLANATION
	SKIPE	NOSTRS		;SEE IF ANY STRUCTURES FOUND
	JRST	E$$NSD		;YES--JUST NO SUCH DIRECTORY

;ERROR:	SEARCH LIST IS EMPTY

E$$SLE:	MOVE	T1,['SLE',,[ASCIZ /Search list empty for device /]]
	PUSHJ	P,WLDWRN	;ISSUE WARNING MESSAGE
	  JRST	LOOKNX		;SKIP REST IF NOT /VERB:FIRST
	PUSHJ	P,TYPSTR	;AND STR NAME
	JRST	LOOKNX		;AND RETURN

;ERROR:	NO DIRECTORY MATCHES THE USER'S REQUEST

E$$NSD:	MOVE	T1,['NSD',,[ASCIZ /No such d/]]	;NO--NO SUCH DIRECTORY
	PUSHJ	P,WLDWRN	;ISSUE WARNING
	  JRST	LOOKNX		;SKIP REST IF NOT /VERB:FIRST
	PUSHJ	P,DIRERR	;ISSUE DIRECTORY ERROR
	JRST	LOOKNX		;GO ISSUE CRLF AND RETURN

;ERROR:	THE DIRECTORY IS EMPTY

E.DEM:	SKIPE	UFDEF		;SEE IF WE FOUND AN ERROR YET
	JRST	LOOKNY		;YES--DON'T REPORT IT AGAIN
	SKIPN	NSUFD		;SEE IF ANY SUCCESSFULLY LOOKED UP
	JRST	E$$NXD		;NO--GO GIVE MESSAGE
E$$DEM:	MOVE	T1,['DEM',,[ASCIZ /D/]]
	PUSHJ	P,WLDWRN	;ISSUE WARNING
	  JRST	LOOKNX		;SKIP REST IF NOT /VERB:FIRST
	PUSHJ	P,DIRERR	;ISSUE DIRECTORY ERROR
	MOVEI	T1,[ASCIZ / is empty/]
	PUSHJ	P,.TSTRG##	;DIRECTORY EMPTY MESSAGE
	JRST	LOOKNX		;GO ISSUE CRLF AND RETURN
;ERROR: DIRECTORY COULD NOT BE FOUND ON SOME STRUCTURE

DLYERR:	MOVE	T2,[ERIPP%	;MFD MISSING
		    ERSNF%	;SFD MISSING
		    ERFNF%]-1(T2)  ;OR FILE MISSING
	SKIPN	UFDEF		;SEE IF ERROR ALREADY GIVEN
	PUSHJ	P,LKERRD	;NO--GIVE THIS ONE
	JRST	LOOKNY		;AND FINISH UP

;ERROR:	ALL MATCHING UFDS WERE NON-EXISTENT

E$$NXD:	MOVE	T1,['NXD',,[ASCIZ /Non-existent/]]
	PUSHJ	P,WLDWRN	;ISSUE WARNING
	  JRST	LOOKNX		;SKIP REST IF NOT /VERB:FIRST
	PUSHJ	P,UFDERR	;ISSUE DEVICE AND UFD CODE
	JRST	LOOKNY		;AND START OVER

;ERROR:	NO FILE MATCHES THE USER'S REQUEST

E$$SFP:	MOVE	T1,['SFP',,[ASCIZ /Some files protected /]]
	JRST	E.NSF1		;ISSUE WARNING			[311]

E$$AFP:	SKIPA	T1,['AFP',,[ASCIZ /All files protected /]]
E$$SDP:	MOVE	T1,['SDP',,[ASCIZ /Some directories protected /]]
	JRST	E.NSF1		;GO ISSUE MESSAGE		[305]

E$$AFR:	SKIPA	T1,['AFR',,[ASCIZ /All files rejected by conditions /]]
E$$NSF:	MOVE	T1,['NSF',,[ASCIZ /No such files as /]]
E.NSF1:	PUSHJ	P,WLDWRN	;ISSUE WARNING
	  JRST	LOOKNX		;SKIP REST IF NOT /VERB:FIRST
	PUSHJ	P,FILOUT	;ISSUE FILE ERROR
	JRST	LOOKNX		;END LINE AND START OVER

;ERROR:	NO FILE NAME SPECIFIED FOR DISK FILE

E$$NFS:	MOVE	T1,['NFS',,[ASCIZ /No file name specified /]]
	PUSHJ	P,WLDERR	;ISSUE ERROR
	  JRST	LOOKNX		;SKIP REST IF NOT /VERB:FIRST
	PUSHJ	P,FILOUT	;ISSUE FILE ERROR

LOOKNX:	PUSHJ	P,.TCRLF##	;ISSUE NEW LINE
LOOKNY:	MOVE	P1,.WILAS	;POSITION POINTER
	JRST	LOOKST		;GO BACK FOR NEXT REQUEST
	SUBTTL	SECONDARY WILD-CARD LOGIC
;.SCWLD -- ROUTINE TO COMPUTE SECONDARY WILD-CARDS SUCH AS FOR
;	ALTERNATE INPUT FILES AND OUTPUT FILES.
;SEE START OF LISTING FOR ARGUMENT FORMAT

.SCWLD::HLRZ	T2,T1		;GET ARGUMENT COUNT
	PUSHJ	P,.GTWRD##	;GET BLOCK+0
	MOVE	T4,(T3)		;GET ADDRESS OF OUTPUT SPEC
	MOVEM	T4,SCOSP	;SAVE FOR LATER
	HLRZS	T3		;POSITION FOR INPUT
	MOVE	T4,(T3)		;GET ADDRESS OF INPUT SPEC
	MOVEM	T4,SCISP	;SAVE FOR LATER
	PUSHJ	P,.GTWRD	;GET BLOCK+1
	HLRZM	T3,SCIOPN	;SAVE INPUT OPEN
	HRRZM	T3,SCOOPN	;SAVE OUTPUT OPEN
	PUSHJ	P,.GTWRD	;GET BLOCK+2
	HLRZM	T3,SCILKP	;SAVE INPUT LOOKUP BLOCK
	HRRZM	T3,SCOLKP	;SAVE OUTPUT LOOKUP BLOCK
	PUSHJ	P,.GTWRD	;GET BLOCK+3
	HLRZM	T3,SCODFE	;SAVE ADDRESS OF DEFAULT EXTENSION
	HRRZM	T3,SCOLLK	;STORE LENGTH OF OUTPUT LOOKUP BLOCK

	PUSHJ	P,.SAVE3##	;SAVE P1-P3
	MOVE	P1,SCOOPN	;POINT TO OUTPUT OPEN BLOCK
	MOVE	P2,SCOSP	;POINT TO OUTPUT SPEC
	SETZB	T4,2(P1)	;CLEAR BUFFER POINTERS
	MOVX	T1,FX.PHY	;CHECK FOR /PHYSICAL
	TDNE	T1,.FXMOD(P2)	; IN OUTPUT SPEC
	TXO	T4,UU.PHS	;YES--SET FOR OPEN
	MOVE	T3,[DEVCHR T2,]
	TDNE	T1,.FXMOD(P2)	;SEE IF /PHYSICAL
	TXO	T3,UU.PHY	;YES--TURN ON IN DEVCHR
	MOVSI	T2,'SYS'	;TRY IT
	XCT	T3		; RIGHT
	TRNN	T2,-1		;SEE IF SET
	TRZ	T3,UU.PHY	;NO--PHYS DEVCHR DOESN'T WIN
	MOVE	T2,.FXDEV(P2)	;GET DEVICE
	MOVEM	T2,1(P1)	;SET IN OPEN BLOCK
	XCT	T3		;GET CHARACTERISTICS
	MOVEM	T2,SCCHR	;SAVE FOR LATER ALSO
	TXNN	T2,DV.MTA	;SEE IF MAG TAPE
	JRST	SCWLD1		;NO--PROCEED
	MOVX	T1,FX.PAR	;CHECK FOR /PARITY
	TDNE	T1,.FXMOD(P2)	; FOR :EVEN
	TXO	T4,IO.PAR	;YES--SET FOR OPEN
	LDB	T1,[POINTR (.FXMOD(P2),FX.DEN)]  ;GET /DENSITY
	DPB	T1,[POINTR (T4,IO.DEN)]  ;SET INTO OPEN
SCWLD1:	MOVEM	T4,(P1)		;STORE FIRST WORD OF OPEN BLOCK
	ADDI	T3,<<DEVTYP T2,>-<DEVCHR T2,>>  ;CHANGE TO DEVTYP
	MOVE	T2,.FXDEV(P2)	;GET DEVICE NAME AGAIN
	XCT	T3		;GET DEVTYP
	MOVEI	T2,0		;CLEAR IT IF NOT AVAILABLE
	MOVEM	T2,SCTYP	;SAVE FOR ERROR MESSAGES AND LATER
;HERE TO SETUP SECONDARY LOOKUP BLOCK

	MOVE	P1,SCOLKP	;POINT TO BLOCK
	MOVE	T1,SCOLLK	;GET LENGTH
	SOS	T1		;MINUS ONE
	HRLZI	T2,1(P1)	;POINT BEYOND FIRST
	HRRI	T2,2(P1)	;SETUP BLT POINTER
	MOVEM	T1,.RBCNT(P1)	;SET LENGTH
	ADDI	T1,(P1)		;POINT TO END
	SETZM	1(P1)		;CLEAR START
	BLT	T2,(T1)		;CLEAR ENTIRE ARRAY
	MOVX	T1,RB.NSE	;GET NON-SUPERSEDING ENTER BIT
	MOVX	T2,FX.SUP	;GET /ERSUPERSEDE BIT
	TDNE	T2,.FXMOD(P2)	;SEE IF USER SET IT
	IORM	T1,.RBCNT(P1)	;YES--TELL MONITOR

	LDB	T1,[POINTR (.FXMOD(P2),FX.PRO)]  ;GET /PROTECTION
	LSH	T1,^D35-POS(RB.PRV)  ;POSITION
	MOVEM	T1,.RBPRV(P1)	;STORE FOR ENTER (WON'T HURT LOOKUP)
	SKIPG	T1,.FXEST(P2)	;GET /ESTIMATE			[161,164]
	MOVEI	T1,0		; DEFAULT TO 0			[164]
	LSH	T1,-7		;CONVERT TO BLOCKS		[161]
	CAILE	T2,.RBEST	;SEE IF ROOM IN ENTER BLOCK	[161]
	MOVEM	T1,.RBEST(P1)	;YES--SET IT FOR ENTER		[161]
	MOVE	T1,.FXVER(P2)	;GET /VERSION			[161]
	CAILE	T2,.RBVER	;SEE IF ROOM IN ENTER BLOCK	[161]
	CAMN	T1,[-1]		; AND SEE IF SET		[161]
	SKIPA			;NO--IGNORE			[161]
	MOVEM	T1,.RBVER(P1)	;YES--SET FOR ENTER		[161]
;HERE TO APPLY WILD-CARDS.  IDEA IS TO COPY CORRESPONDING INPUT WILD
; CARDS IN THE SAME ORDER OF FILE NAME, EXTENSION, DIRECTORY.

	SETZM	SCNBT		;CLEAR BIT FETCHER
	MOVE	T1,SCISP	;GET INPUT SPEC ADDRESS
	HRLI	T1,-4		;PRESET COUNTER
	ADDI	T1,.FXNMM-1	;POINT TO NAME MASK
	MOVEM	T1,SCNWD	;SAVE FOR FNDNBT ROUTINE
	MOVE	P3,SCILKP	;POINT TO INPUT BLOCK

	SKIPN	T1,.FXNAM(P2)	;GET OUTPUT NAME
	SKIPA	T1,.RBNAM(P3)	;OR INPUT IF BLANK
	SKIPA	T2,.FXNMM(P2)	;GET OUTPUT MASK
	SETOM	T2		;SET FULL MASK IF BLANK
	PUSHJ	P,INSWLD	;INSERT WILD CHARS		[153]
	  JRST	E$$IWC		;ERROR IF NO MORE
	MOVEM	T1,.RBNAM(P1)	;STORE OUTPUT NAME

	SKIPN	T1,.FXEXT(P2)	;GET OUTPUT EXT
	HLLO	T1,@SCODFE	;GET DEFAULT
	HRLO	T2,T1		;GET MASK
	TRZ	T1,-1		;CLEAR OUT JUNK
	PUSHJ	P,INSWLS	;INSERT WILD CHARS
	  JRST	E$$IWC		;ERROR IF NO MORE
	HLLZM	T1,.RBEXT(P1)	;STORE RESULT FOR ENTER
	HLRZ	T2,T1		;SAVE EXTENSION			[153]
	MOVE	T1,.RBNAM(P1)	;GET FILE NAME BACK		[153]
	CAIE	T2,'UFD'	;UNLESS .UFD			[153]
	PUSHJ	P,INSWLF	; COMPACT OUT BLANKS		[153]
	MOVEM	T1,.RBNAM(P1)	;STORE RESULT			[153]
	MOVEI	T1,0		;CLEAR DIRECTORY (SET [-])
	MOVX	T2,FX.DIR	;SEE IF ONE GIVEN
	TDNN	T2,.FXMOD(P2)	; BY THE USER
	JRST	SCNODR		;NO--USE DEFAULT
	MOVE	T1,.FXDIR(P2)	;GET USER SPECIFIED UFD
	MOVE	T2,.FXDIM(P2)	;GET UFD MASK
	TLNN	T1,-1		;SEE IF PROJECT
	TLO	T2,-1		;NO--SET MASK FULL ON
	TLNN	T1,-1		;SEE IF PROJECT
	HLL	T1,MYPPN	;BLANK--USE LOGGED IN PROJECT
	TRNN	T1,-1		;SEE IF PROGRAMMER
	TRO	T2,-1		;NO--SET MASK FULL ON
	TRNN	T1,-1		;SEE IF PROGRAMMER
	HRR	T1,MYPPN	;BLANK--USE LOGGED IN PROGRAMMER
	PUSHJ	P,INSWLD	;INSERT WILD-CARDS
	  JRST	E$$IWC		;ERROR IF NO MORE
	SKIPGE	T1		;SEE IF SIXBIT DIRECTORY
	PUSHJ	P,INSWLF	;YES--FIX IT UP
	TLNE	T1,-1		;IF NO PROJECT
	TRNN	T1,-1		;OR PROGRAMMER,
	JRST	E$$NNO		;THEN ERROR

IFN FT$SFD,<
	SKIPN	.FXDIR+2(P2)	;SEE IF SFD
	JRST	SCNODR		;NO--JUST USE UFD
	MOVEM	T1,SCSFDD	;YES--STORE UFD IN PATH
	SETZM	SCSFD		;CLEAR FIRST ARG
	SETZM	SCSFDS		;CLEAR SCAN SWITCH
;LOOP OVER SFDS
	MOVSI	P1,1-.FXLND	;PRESET DEPTH COUNTER
SCSFDL:	SKIPN	T1,.FXDIR+2(P2)	;GET NEXT SFD
	JRST	SCSFDM		;DONE--JUST CLEANUP
	MOVE	T2,.FXDIM+2(P2)	;GET MASK
	PUSHJ	P,INSWLS	;INSERT WILD CHARACTERS
	  JRST	E$$IWC		;ERROR IF NO MORE
	JUMPE	T1,E$$NNO	;ERROR IF BLANK
SCSFDM:	MOVEM	T1,SCSFDD+1(P1)	;STORE SFD
	ADDI	P2,2		;ADVANCE SPEC POINTER
	AOBJN	P1,SCSFDL	;LOOP OVER PATH
	SETZM	SCSFDD+1(P1)	;FORCE A ZERO
	MOVEI	T1,SCSFD	;POINT TO PATH
	MOVE	P1,SCOLKP	;RESTORE OUTPUT BLOCK POINTER
>

SCNODR:	MOVEM	T1,.RBPPN(P1)	;STORE DIRECTORY OR POINTER
	MOVEM	T1,.RBSIZ(P1)	;(FOR LEV.C)

	SETCMI	T2,1		;SET SINGLE WILD BIT		[302]
	PUSHJ	P,INSWLD	;GO SEE IF ANY LEFT		[302]
	  SKIPA			;NO--WORKED OUT OK		[302]
	JRST	E$$TWC		;YES--TOO MANY ON INPUT		[302]
;HERE WHEN ALL DONE

	SKIPN	T1		;SEE IF DIRECTORY
	MOVE	T1,MYPPN	;DEFAULT--USE SELF
	TLNN	T1,-1		;SEE IF SFD
	MOVE	T1,.PTPPN(T1)	;YES--GET OWNER UFD
	MOVE	T2,SCILKP	;POINT TO INPUT LOOKUP
	MOVE	T3,.RBPRV(T2)	;GET INPUT PROTECTION
	MOVE	T2,.RBPPN(T2)	;GET INPUT OWNER
	SKIPN	T2		;SEE IF DEFAULT
	MOVE	T2,MYPPN	;YES--GET SELF
	TLNN	T2,-1		;SEE IF SFD
	MOVE	T2,.PTPPN(T2)	;YES--GET OWNER UFD
	SKIPE	T1		;IF NO OUTPUT OWNER
	SKIPN	T2		;OR NO INPUT OWNER
	JRST	SCDONE		;LEAVE PROT. ALONE
	SKIPN	.RBPRV(P1)	;IF /PROTECTION
	CAME	T1,T2		;OR DIFFERENT OWNERS
	JRST	SCDONE		;LEAVE PROT. ALONE
	ANDX	T3,<RB.PRV-7B2>	;CLEAR OWNER PROTECTION
	JUMPE	T3,SCDONE	;IF 000, LEAVE ALONE
	MOVX	T1,%LDSTP	;GET SYSTEM
	GETTAB	T1,		;STANDARD FILE PROTECTION
	  MOVEI	T1,0		;(USE 0XX)
	ANDX	T1,7B2		;GET OWNER PROTECTION
	IOR	T1,T3		;INCLUDE INPUT FILE PROT
	MOVEM	T1,.RBPRV(P1)	;STORE FOR ENTER
SCDONE:	HLRZ	T1,.RBEXT(P1)	;GET RESULTING EXTENSION	[153]
	CAIN	T1,'UFD'	;SEE IF .UFD			[153]
	JRST	[SKIPN T1,.RBPPN(P1) ;YES--GET DIRECTORY	[153]
		 MOVE  T1,MYPPN	;BLANK, ASSUME SELF		[153]
		 TLNN  T1,-1	;SEE IF SFD POINTER		[153]
		 MOVE  T1,.PTPPN(T1) ;YES--GET UFD		[153]
		 CAMN  T1,MFDPPN ;SEE IF MFD:			[153]
		 JRST  .+1	;YES--ALL SET			[153]
		 MOVEM T1,.RBNAM(P1) ;NO--STORE UFD AS NAME	[153]
		 MOVE  T1,MFDPPN ;GET MFD			[153]
		 MOVEM T1,.RBPPN(P1) ;STORE AS DIRECTORY	[153]
		 JRST  .+1]	;AND PROCEED			[153]
	MOVE	T1,SCCHR	;GET DEVICE CHARACTERISTICS
	MOVE	T2,.RBNAM(P1)	;GET FILE NAME			[164]
	TLC	T1,-1-<(DV.TTA)> ;WATCH OUT FOR			[164]
	TLCE	T1,-1-<(DV.TTA)> ; NUL:				[164]
	TXNN	T1,DV.DTA!DV.DSK  ;IF DISK OR DECTAPE,		[164]
	SKIPA			;NO				[164]
	JUMPE	T2,E$$NDO	;  ERROR IF NULL NAME		[164]
	MOVE	T3,SCTYP	;GET DEVTYP
	MOVEI	T2,1		;SET FOR MISC. DEVICE
	TLC	T1,-1-<(DV.TTA)> ;IF DEVICE
	TLCN	T1,-1-<(DV.TTA)> ; IS NUL:
	JRST	CPOPJ1		; THEN RETURN
	TXNN	T3,TY.SPL	;SEE IF SPOOLED
	TXNE	T1,DV.DSK	;OR DISK
	SETOM	T2		;YES--FLAG AS SUCH
	TXNE	T1,DV.DTA	;SEE IF DECTAPE
	SETZM	T2		;YES--FLAG
	JRST	CPOPJ1		;OK RETURN TO USER
;E.SCO -- REPORT OPEN ERROR

E.SCO::
E$$SCO:	MOVE	T1,['SCO',,[ASCIZ /OPEN failure on /]]
	PUSHJ	P,WLDERR	;ISSUE ERROR
	  PJRST	.TCRLF##	;SKIP REST IF NOT /VERB:FIRST
	MOVE	T1,SCOOPN	;POINT TO OPEN BLOCK
	MOVE	T1,1(T1)	;GET NAME
	PUSHJ	P,TYPST1	;TYPE IT
	LDB	T2,[POINTR (SCTYP,TY.JOB)]  ;GET USER JOB
	PJRST	OPNER1		;GO TYPE IT

;ERROR: CAN'T LOOKUP OR ENTER SECONDARY FILE

E.SCL::	MOVE	T1,SCOLKP	;POINT TO LOOKUP BLOCK
	MOVE	T2,SCOLLK	;GET LENGTH
	MOVE	T3,SCOSP	;POINT TO OUTPUT SPEC
	PJRST	E.LKEN		;GO OUTPUT ERROR

;ERROR:	NULL NAME OR DIRECTORY

E$$NDO:	SKIPA	T1,['NDO',,[ASCIZ /Null name in output wild-card/]]
E$$NNO:	MOVE	T1,['NNO',,[ASCIZ /Null directory in output wild-card/]]
	JRST	ENEWC

;ERROR:	INSUFFICIENT INPUT WILD CARD CHARS TO MATCH OUTPUT

E$$TWC:	SKIPA	T1,['TWC',,[ASCIZ /Too many wild-cards in input for output/]]
E$$IWC:	MOVE	T1,['IWC',,[ASCIZ /Insufficient wild-cards in input for output/]]
ENEWC:	PUSHJ	P,WLDERR	;ISSUE ERROR
	  PJRST	.TCRLF##	;SKIP REST IF NOT /VERB:FIRST
	PJRST	.TFILE		;TYPE ERROR FILE SPEC
;INSWLS -- ROUTINE TO INSERT WILD CHARACTERS IN A WORD AND LEFT COMPRESS NULL CHARS
;INSWLF -- FIXUP WORD BY LEFT COMPRESSING NULL CHARS

INSWLS:	PUSHJ	P,INSWLD	;INSERT WILD CHARACTERS
	  POPJ	P,		;ERROR RETURN
	AOS	(P)		;GOOD RETURN

INSWLF:	SKIPN	T2,T1		;SHIFT ARGUMENT
	POPJ	P,		;RETURN IF NULL
	MOVEI	T1,0		;CLEAR RESULT
INSWF1:	SKIPE	T2		;IF DONE
	TLNE	T2,(77B5)	;OR NOT NULL
	JRST	INSWF2		;GO SHIFT TO ANSWER
	LSH	T2,6		;ELSE, COMPRESS NULL
	JRST	INSWF1		;AND LOOP
INSWF2:	TLNE	T1,(77B5)	;SEE IF ALL DONE YET
	POPJ	P,		;YES--RETURN
	LSHC	T1,6		;NO--SHIFT SOME MORE
	JRST	INSWF1		;AND LOOP


;INSWLD -- ROUTINE TO INSERT WILD CHARACTERS IN A WORD
;CALL:	MOVE	T1,PROPOSED WORD (TYPED BY USER OR DEFAULTED)
;	MOVE	T2,REPLACEMENT MASK (1=LEAVE BIT ALONE)
;	PUSHJ	P,INSWLD
;	  ERROR RETURN IF INSUFFICIENT INPUT WILD-CARDS TO MATCH
;	SKIP RETURN WITH T1 UPDATED FROM INPUT FILE
;ASSUMES P3 POINTS TO INPUT LOOKUP BLOCK
;GLOBAL VARIABLES SCNBT AND SCNWD MUST BE PRESET FOR FNDNBT ROUTINE

INSWLD:	MOVEI	T4,^D35		;BIT COUNTER FOR WORD IN T1
INSWL1:	MOVEI	T3,1		;GET A BIT
	LSH	T3,(T4)		;POSITION
	TDNN	T2,T3		;SEE IF NEED REPLACEMENT
	JRST	INSWL3		;YES--GO DO IT
INSWL2:	SOJGE	T4,INSWL1	;NO--LOOP UNTIL DONE
	JRST	CPOPJ1		;SUCCESS RETURN
INSWL3:	TDZ	T1,T3		;REPLACE--CLEAR OUTPUT BIT
	PUSHJ	P,FNDNBT	;FIND VALUE OF NEXT REPLACEMENT BIT
	  POPJ	P,		;NONE--GIVE ERROR RETURN
	LSH	T3,(T4)		;POSITION REPLACEMENT BIT
	IOR	T1,T3		;INCLUDE IT IN RESULT
	JRST	INSWL2		;GO REPEAT LOOP
;FNDNBT -- HELPER TO INSWLD TO FIND VALUE OF NEXT REPLACEMENT BIT
;CALL:	PUSHJ	P,FNDNBT
;	  ERROR RETURN IF NO MORE INPUT WILD-CARDS
;	SKIP RETURN WITH VALUE IN BIT 35 OF T3
;PRESERVES ALL OTHER ACS
;GLOBAL VARIABLES SCNBT AND SCNWD MUST HAVE BEEN PRESET ORIGINALLY
;	SCNBT IS BIT DOWN COUNTER FOR SCANNING INPUT SPEC
;	SCNWD IS WORD UP COUNTER FOR SCANNING INPUT SPEC
;		LH=-3 NAME, -2 EXT, -1 UFD, 0-4 SFD
;		RH=LOCATION OF INPUT SPEC MASK
;LOCAL AC USAGE:
;	T1 CONTAINS SCNBT
;	T2 CONTAINS SCNWD
;	T3 GETS RESULT
;P3 IS ASSUMED TO POINT TO THE INPUT LOOKUP BLOCK

FNDNBT:	PUSH	P,T1		;SAVE ACS
	PUSH	P,T2
	MOVE	T2,SCNWD	;GET SCNWD WHERE IT IS USEFUL

FNDNB1:	SOSL	T1,SCNBT	;COUNT TO NEXT BIT
	JRST	FNDNB2		;STILL SAME WORD--PROCEED

	MOVEI	T1,^D35		;SET COUNT FOR NEXT WORD
	AOBJP	T2,FNDNW1	;GET NEXT WORD
	HLRZ	T3,T2		;NOT SFD--GET INDEX
	XCT	[JFCL		;FILE NAME--OK
		 MOVEI T1,^D17	;EXTENSION IS ONLY 18 BITS
		 ADDI  T2,.FXDIM-.FXEXT-1]+3(T3)  ;UFD IS FARTHER DOWN
	CAIN	T3,-1		;SEE IF UFD
	JRST	FNDNW2		;YES--CHECK FOR PRESENCE
	JRST	FNDNB2		;PROCEED

FNDNW1:	AOS	T2		;ADVANCE SFD SPEC BY 2
	HLRZ	T3,T2		;GET SFD DEPTH
	CAIGE	T3,.FXLND-1	;SEE IF ALL DONE
FNDNW2:	SKIPN	-1(T2)		;SEE IF SFD IS NULL
	JRST	FNDNBX		;YES--GIVE ERROR RETURN
FNDNB2:	MOVEM	T1,SCNBT	;STORE UPDATED COUNTER
	MOVEI	T3,1		;GET A BIT
	LSH	T3,(T1)		;POSITION IT
	TDNE	T3,(T2)		;SEE IF WILD IN INPUT SPEC
	JRST	FNDNB1		;NO--REPEAT LOOP
;HERE WHEN FOUND NEXT WILD BIT--GET VALUE
	HLRE	T3,T2		;GET WORD TYPE
	SKIPLE	T1,T3		;SEE IF SFD
	MOVEI	T1,0		;YES--MAKE UNIFORM
	XCT	[MOVE T3,.RBNAM(P3)  ;FILE NAME
		 HLRZ T3,.RBEXT(P3)  ;EXTENSION
		 JRST  [MOVE T3,.RBPPN(P3)  ;UFD
			TLNN T3,-1	;SEE IF PATH
			MOVE T3,.PTPPN(T3)	;YES--GET TOP OF PATH
			JRST .+1]
		 JRST  [ADD  T3,.RBPPN(P3)  ;SFD--POINT TO PATH
			TLNE T3,-1	;SEE IF PATH
			TDZA T3,T3	;NO--KILL RESULT
			MOVE T3,.PTPPN+1(T3)	;YES--GET SFD
			JRST .+1]
		    ]+3(T1)
	MOVN	T1,SCNBT	;GET COMPLEMENT OF BIT POS
	LSH	T3,(T1)		;POSITION RESULT
	ANDI	T3,1		;MASK TO ONE BIT
	AOS	-2(P)		;SET SKIP RETURN

FNDNBX:	MOVEM	T2,SCNWD	;STORE UPDATED WORD POINTER
	POP	P,T2		;RESTORE ACS
	POP	P,T1
	POPJ	P,		;RETURN
	SUBTTL	DIRECTORY SUBROUTINES

;SUBROUTINE TO SUPPLY DEFAULTS FOR DIRECTORIES
;CALL:	MOVEI	P1,POINTER TO SPECIFICATION
;	PUSHJ	P,SETDIR
;USES T1-4
;
;HANDLES [,] (IE, DEFAULT PROJECT, DEFAULT PROGRAMMER),
;HANDLES [-] (IE, DEFAULT TO DEFAULT DIRECTORY)
;HANDLES .UFD (IE, DIRECTORY IS REALLY FILE NAME)

SETDIR:	MOVX	T1,FX.DFX	;GET FLAG
	TDNE	T1,.FXMOD(P1)	;SEE IF HERE ALREADY
	POPJ	P,		;YES--RETURN
	IORM	T1,.FXMOD(P1)	;NO--SET FLAG FOR LATER
	MOVX	T1,FX.DIR	;SEE IF DIRECTORY
	TDNE	T1,.FXMOD(P1)	;  SPECIFIED
	JRST	SETDR2		;YES--GO HANDLE IT
	HLRZ	T1,.FXEXT(P1)	;GET EXTENSION
	CAIN	T1,'UFD'	;SEE IF UFD
	JRST	SETDR		;YES--GO DO DEFAULTS
	LDB	T1,[POINTR (.FXMOD(P1),FX.TRM)] ;GET TERMINATOR	[300]
IFN FT$COR,<
	CAIN	T1,.FXTRC	;IF "+"				[300]
	MOVEI	T1,.FXTRO	; TREAT AS 'OR'			[300]
>
	CAIE	T1,.FXTRA	;IF 'AND'			[300]
	CAIN	T1,.FXTRO	; OR 'OR'			[300]
	JRST	SETDR		; NEED TO GO SET DIRECTORY	[300]
	CAMN	P1,.WIFIR	;  OR SECOND FILE
	CAIN	T1,.FXTRN	; OR 'NOT'			[300]
	JRST	SETDR		;YES--SAME AS WILD CARDS
	SETCM	T1,.FXNMM(P1)	;SEE IF WILD NAME
	SETCM	T2,.FXEXT(P1)	;  OR EXT
	TRNN	T2,-1		;IF NOT,
	JUMPE	T1,SETDR4	;  LEAVE DIRECTORY CLEAR
SETDR:
IFN FT$SFD,<
	MOVE	T1,[-.FXLND,,PTHDIR]
	MOVEI	T2,.FXDIR(P1)	;NO--COPY DEFAULT DIRECTORY
SETDR1:	SKIPN	T3,(T1)		;GET NEXT LEVEL
	SOS	T1		;BLANK--HOLD POINTER
	MOVEM	T3,(T2)		;STORE IN ARGUMENT AREA
	SKIPE	T3		;SEE IF BLANK
	SETOM	T3		;NO--FULL MATCH
	MOVEM	T3,1(T2)	;STORE AWAY
	ADDI	T2,2		;ADVANCE STORAGE
	AOBJN	T1,SETDR1	;LOOP UNTIL DONE
	JRST	SETDR3		;AND PROCEED BELOW
>
SETDR2:	MOVE	T1,.FXDIR(P1)	;GET DIRECTORY
	MOVE	T2,MYPPN	;DEFAULT PPN--GET USER
	TLNN	T1,-1		;SEE IF PROJECT PRESENT
	HLLM	T2,.FXDIR(P1)	;NO--FILL IN MY PROJECT
	TLNN	T1,-1		; ..
	HRROS	.FXDIM(P1)	; AND NO WILDCARD
	TRNN	T1,-1		;SEE IF PROGRAMMER PRESENT
	HRRM	T2,.FXDIR(P1)	;NO--FILL IN MY PROGRAMMER
	TRNN	T1,-1		; ..
	HLLOS	.FXDIM(P1)	; AND NO WILDCARD
SETDR3:
REPEAT 0,<			;SET /OKPRO IF ANY WILD-CARDS	[301]
	SETCM	T1,.FXDIM(P1)	;SEE IF WILD USER
	JUMPE	T1,SETDR4	;NO--OK
>
	MOVX	T1,FX.PRT	;YES--SET
	TDNN	T1,.FXMOM(P1)	; /OKPROTECTION
	IORM	T1,.FXMOD(P1)	; UNLESS /ERPROTECTION
SETDR4:	HLRZ	T1,.FXEXT(P1)	;GET EXTENSION
	CAIE	T1,'UFD'	;SEE IF .UFD
	POPJ	P,		;NO--ALREADY SETUP CORRECTLY
	MOVE	T1,MFDPPN	;YES--GET CORRECT DIRECTORY
	EXCH	T1,.FXDIR(P1)	;STORE (MFD)
	SETO	T2,		;CLEAR WILDCARDS
	EXCH	T2,.FXDIM(P1)	;SET INTO DIRECTORY
	MOVEM	T1,.FXNAM(P1)	;MOVE DIRECTORY TO NAME
	MOVEM	T2,.FXNMM(P1)	;MOVE DIRECTORY TO NAME
IFN FT$SFD,<
	SETZM	.FXDIR+2(P1)	;CLEAR SUB DIRECTORY
	SETZM	.FXDIM+2(P1)	; ..
>
	POPJ	P,		;RETURN

;ERROR:	DIRECTORY OPEN

E.UFO:	MOVEI	T1,[ASCIZ /directory on /]
	PUSHJ	P,OPNERR
	SETOM	UFDEF		;INDICATE ERROR MESS FOR DIRECTORY
	JRST	STR1
;ERROR:	DIRECTORY LOOKUP FAILURE

E.UFL:	SKIPE	T4,DEPTH	;RESTORE DEPTH POINTER
	MOVEM	T1,DIRBU-1(T4)	;RESTORE DIRECTORY LIST
E.UFL1:	TLZ	T2,-1		;CLEAR JUNK
	JUMPE	T4,[PUSHJ P,E.MFL  ;ISSUE MFD ERROR
		    JRST  WILDE]   ;AND LOOP
	SOS	NSUFD		;DISCOUNT UFD FOUND SUCCESSFULLY
	CAIE	T2,ERSNF%	;SEE IF SFD ERROR
	CAIG	T2,ERIPP%	;SEE IF NON-EXISTENT ERROR
	SKIPN	SRCH		;AND STR SEARCHING
	JRST	.+2		;NO--PROCEED
	JRST	E.UFLX		;YES--SKIP MESSAGE FOR NOW
	PUSHJ	P,LKERRD	;ISSUE ERROR MESSAGE
	JRST	WILDE		;AND TRY NEXT DIRECTORY

E.UFLX:	CAIN	T2,ERSNF%	;COMPACT ERROR CODE
	MOVEI	T2,2		; SFD IS WORST
	SKIPN	T2		; ..
	MOVEI	T2,3		;EXCEPT FOR FILE MISSING
	CAMLE	T2,LASERR	;SEE IF WORST YET
	MOVEM	T2,LASERR	;YES--REMEMBER IT
	JRST	WILDE		;AND CONTINUE ONWARDS

;ISSUE ERROR IN SFD/UFD/MFD
LKERRD:	SETOM	UFDEF		;FLAG THAT ERROR WAS FOUND
	MOVX	T1,FX.PRT	;SEE IF
	TDNE	T1,MOD		;/OKPROTECTION
	CAIE	T2,ERPRT%	;AND PROTECTION ERROR
	SKIPA			;NO
	JRST	[AOS  NODIRP	;YES--INDICATE PRO ERROR	[304,307]
		 POPJ P,]	;RETURN				[304]
	PUSHJ	P,LKERR		;OUTPUT LOOKUP ERROR
	  JRST	E.MFL1		; (IF MFD FAILED)
	PJRST	UFDERR		;OUTPUT UFD ERROR AND RETURN

E.MFL1:	MOVEI	T2,0		;FUDGE FILE NOT FOUND ERROR
E.MFL:	CAIN	T2,ERIPP%	;SEE IF ILL PPN
	MOVEI	T2,ERFNF%	;CHANGE TO NO SUCH FILE (MFD)
	PUSHJ	P,LKERR		;OUTPUT LOOKUP ERROR
	  HALT	.+1
	PJRST	MFDERR		;OUTPUT MFD ERROR AND RETURN

;ERROR:	I/O ERROR WHILE READING DIRECTORY

E.UFE:	GETSTS	WC,T1		;DATA ERROR--GET STATUS
	PUSHJ	P,STSERR	;OUTPUT MESSAGE
	SETSTS	WC,(T1)		;AND CLEAR ERROR BITS
	PJRST	UFDERR		;OUTPUT UFD ERROR
;.NXDTW -- GET NEXT WORD FROM DATA FILE
;CALL:	PUSHJ	P,.NXDTW
;	ERROR RETURN IF END-OF-FILE
;	NORMAL RETURN WITH WORD IN T1

.NXDTW::SOSGE	B.DC+.BFCTR	;SEE IF WORD IN BUFFER
	JRST	NXDATR		;NO--READ SOME MORE OF FILE
	ILDB	T1,B.DC+.BFPTR	;FETCH WORD
	JRST	CPOPJ1		;SKIP RETURN

NXDATR:	PUSHJ	P,DODCHN	;EXECUTE DATA CHANNEL UUO
	  IN	DC,		;READ
	    JRST  .NXDTW	;OK TO PROCEED

	PUSHJ	P,DODCHN	;EXECUTE DATA CHANNEL UUO
	  STATZ	DC,IO.ERR	;SEE IF ANY ERRORS
	    PUSHJ P,E.DFE  	;YES
	PUSHJ	P,DODCHN	;EXECUTE DATA CHANNEL UUO
	  STATO	DC,IO.EOF	;SEE IF EOF
	    JRST .NXDTW  	;NO--GET MORE DATA
	POPJ	P,		;YES--EOF RETURN



;ERROR:	DATA FILE OPEN

E.DFO::	MOVEI	T1,[0]
OPNERR:	PUSH	P,T1		;SAVE MESSAGE INSERT
E$$DFO:	MOVE	T1,['DFO',,[ASCIZ /Open failure for /]]
	PUSHJ	P,WLDERR	;ISSUE ERROR
	  JRST	[POP   P,T1	;IF NOT /VERB:FIRST
		 PJRST .TCRLF##] ; SKIP REST
	POP	P,T1		;RECOVER INSERT
	PUSHJ	P,STRER1	;OUTPUT STRUCTURE NAME
	MOVE	T2,FSTR		;GET DEVICE
	PUSHJ	P,DOPHYS	;GET PHYSICAL BIT
	  DEVTYP T2,		;GET JOB USING IT
	    JRST OPNER2		;GIVE UP IF NOT IMPLEMENTED
	LDB	T2,[POINTR (T2,TY.JOB)]  ;GET USER JOB
OPNER1:	JUMPE	T2,OPNER2	;GIVE UP IF NOT ON RECORD
	MOVEI	T1,[ASCIZ / in use by job /]
	PUSHJ	P,.TSTRG##	;TYPE PREFIX
	HRRZ	T1,T2		;GET JOB NUMBER
	PUSHJ	P,.TDECW##	;TYPE JOB NUMBER
OPNER2:	PJRST	.TCRLF		;END LINE AND RETURN
;ERROR:	DATA FILE LOOKUP ERROR

E.DFL::	MOVE	T1,AGLOOK	;POINT TO LOOKUP BLOCK
	MOVE	T2,AGLENL	;GET LENGTH
	MOVEI	T3,FSTR		;POINT TO TEMP ERROR AREA
	TDZA	T4,T4		;FLAG WILD INPUT AND SKIP INTO E.LKEN

;E.LKEN -- OUTPUT LOOKUP/ENTER ERROR FOR SCAN-BLOCK
;CALL:	MOVEI	T1,EXTENDED LOOKUP BLOCK
;	MOVEI	T2,LENGTH OF LOOKUP BLOCK
;	MOVEI	T3,SCAN BLOCK (INC. SFDS)
;	PUSHJ	P,E.LKEN

E.LKEN::SETOM	T4		;SECONDARY FLAG
	HRLZ	T3,T3		;POINT TO SCAN BLOCK
	HRRI	T3,FSTR		;POINT TO ERROR BLOCK
	BLT	T3,ENDERR	;COPY TO TEMP AREA
	CAIG	T2,.RBDEV	;SEE IF STR IS INCLUDED
	JRST	EDFL1		;NO--USE ARGUMENT
	SKIPE	T3,.RBDEV(T1)	;SEE IF BETTER STR SPECIFIED
	MOVEM	T3,FSTR		;YES--UPDATE DIAGNOSTIC
EDFL1:	SKIPE	T3,.RBNAM(T1)	;GET REAL NAME
	MOVEM	T3,FNAM		;UPDATE DIAGNOSTIC
	HLLZ	T3,.RBEXT(T1)	;GET REAL EXTENSION
	MOVEM	T3,FEXT		;USE IT IN MESSAGE
	MOVE	T3,.RBPPN(T1)	;GET BETTER PPN
	TLNE	T3,-1		;SEE IF BETTER UFD SPECIFIED
	MOVEM	T3,UFDPPN	;YES--UPDATE DIAGNOSTIC
	TLNE	T3,-1		;SEE IF SFD
	SETOM	UFDPPN+1	;NO--CLEAR WILD CARDS
	MOVE	T3,.RBPRV(T1)	;GET PROTECTION
	HRRZ	T2,.RBEXT(T1)	;GET CODE
	MOVX	T1,FX.PRT	;SEE IF
	TDNE	T1,MOD		;/OKPROTECTION
	CAIE	T2,ERPRT%	;AND PROTECTION ERROR
	SKIPA			;NO
	JRST	[SOS  NOFILF	;DON'T COUNT FILE FOUND		[304]
		 AOS  NOFILP	;COUNT PROTECTION ERROR		[304]
		 POPJ P,]	;RETURN				[304]
	MOVX	T1,FX.NOM	;SEE IF				[155]
	TDNE	T1,MOD		; /OKNONE			[155]
	JUMPE	T2,CPOPJ	;YES--IF NOT FOUND, SUPPRESS ERROR	[155]
	CAIE	T2,ERSNF%	;SEE IF NO .SFD			[155]
	CAIN	T2,ERIPP%	;SEE IF NO .UFD
	JUMPE	T4,ENDFL2	;YES--IF WILD IN, THEN SPECIAL HANDLING
	SKIPE	SRCH		;IF MULT STRS			[154]
	JUMPE	T2,[SOS  NOFILF	; AND MISSING FILE		[154]
		    POPJ P,]	; SUPPRESS MESSAGE AND CATCH LATER	[154]
E$$LKE:	MOVSI	T1,'LKE'
	PUSH	P,T2		;SAVE ERROR CODE
	MOVEI	T2,WLDWRN
	SKIPE	T4		;IF INPUT, JUST WARN
	MOVEI	T2,WLDERR
	PUSHJ	P,(T2)		;ISSUE PREFIX
	  JRST	[POP   P,T1	;IF NOT /VERB:FIRST
		 PJRST .TCRLF##] ; SKIP REST
	POP	P,T1		;RESTORE ERROR CODE
	PUSHJ	P,.LKERR	;OUTPUT LOOKUP ERROR
	PJRST	.TFILE		;OUTPUT FILE NAME AND RETURN

ENDFL2:	SKIPN	SRCH		;SEE IF MULTIPLE STRS
	JRST	E$$NXU		;NO--ISSUE MESSAGE
	SOS	NOUFDF		;YES--BACK OFF COUNTER
	SOS	NOFIL		; ..				[154]
	SOS	NOFILF		; ..				[154]
	POPJ	P,		;AND RETURN

E$$NXU:	MOVE	T1,['NXU',,[ASCIZ /Non-existent/]]
	PUSHJ	P,WLDWRN	;ISSUE WARNING
	  PJRST	.TCRLF##	;SKIP REST IF NOT /VERB:FIRST
	PJRST	UFDERR		;OUTPUT UFD NAME AND RETURN

;ERROR:	I/O ERROR WHILE READING DATA FILE

E.DFE:	PUSHJ	P,.SAVE1##	;SAVE P1
	MOVE	P1,SAVEP1	;GET BACK LOCAL P1
	PUSHJ	P,DODCHN	;DO DATA CHANNEL UUO
	  GETSTS DC,T1		;GET STATUS BITS
	PUSHJ	P,STSERR	;OUTPUT STATUS MESSAGE
	PUSHJ	P,DODCHN	;DO DATA CHANNEL UUO
	  SETSTS DC,(T1)	;CLEAR ERROR BITS
	PJRST	.TFILE		;OUTPUT FILE NAME
;LKERR -- OUTPUT LOOKUP ERROR MESSAGE
;CALL:	MOVEI	T2,ERROR CODE
;	MOVEI	T3,PROTECTION IF ERROR 2
;	PUSHJ	P,LKERR
;	ERROR RETURN IF UFD BAD
;USES T1, T2, T3

LKERR:	HRRZ	T2,T2		;GET ERROR CODE
	CAIN	T2,ERIPP%	;SEE IF UFD ERROR
	POPJ	P,		;YES--ERROR RETURN
	AOS	(P)		;NO--ADVANCE RETURN
E$$LKP:	MOVSI	T1,'LKP'
	PUSH	P,T2		;SAVE ERROR
	PUSH	P,T3		;SAVE PROTECTION
	PUSHJ	P,WLDWRN	;LIST FLAG
	  JRST	[POP  P,T3	;IF NOT /VERB:FIRST
		 POP  P,T1	; SKIP REST OF
		 POPJ P,]	; MESSAGE
	POP	P,T3		;RESTORE PROTECTION
	POP	P,T1		;RESTORE ERROR CODE

;SUBROUTINE ENTRY TO TYPEOUT A LOOKUP ERROR CODE
;CALL IS SAME AS LKERR EXCEPT ERROR IN T1 (LH=0)
;AND ALWAYS RETURNS CPOPJ
;WILL GIVE HUMAN MESSAGE FOR COMMON ERRORS

.LKERR::HRLZ	T2,T1		;PRESERVE ERROR CODE
	MOVSI	T1,-LKETBL	;GET LENGTH OF ERROR TABLE	[163]
LKERRL:	HRR	T2,LKETB(T1)	;INCLUDE JUNK			[163]
	CAME	T2,LKETB(T1)	;SEE IF MATCH			[163]
	AOBJN	T1,LKERRL	;NO--LOOP ON			[163]
	JUMPL	T1,LKERR1	;MATCH--GO HANDLE IT		[163]
	MOVEI	T1,[ASCIZ \Lookup/enter failure \]
	PUSHJ	P,.TSTRG##	;NO--PRINT OCTAL CODE
	HLRZ	T1,T2		;GET ERROR CODE
	PJRST	.TOCTW##	;  AND RETURN
LKERR1:	HLRZ	T2,T2		;GET ERROR CODE BACK		[163]
	HRRZ	T1,LKETB(T1)	;GET ASCIZ TEXT			[163]
	CAIE	T2,ERPRT%
	PJRST	.TSTRG##	;ISSUE MESSAGE AND RETURN
	PUSHJ	P,.TSTRG##	;ISSUE PROTECTION MESSAGE
	LSH	T3,-<ALIGN.(RB.PRV)>  ;POSITION PROTECTION CODE
	MOVEI	T1," "
	SKIPE	T3
	PUSHJ	P,.TCHAR##
	SKIPE	T1,T3
	PUSHJ	P,.TOCTW
	MOVEI	T1,[ASCIZ / failure/]
	PJRST	.TSTRG##	;AND RETURN

;LOOKUP/RENAME/ENTER ERROR MESSAGES

LKETB:	ERFNF%,,[ASCIZ /Non-existent/]
	ERIPP%,,[ASCIZ /Non-existent UFD/]
	ERPRT%,,[ASCIZ /Protection/]
	ERFBM%,,[ASCIZ /File being modified/]
	ERAEF%,,[ASCIZ /Already existing/]
	ERTRN%,,[ASCIZ /RIB or directory read error/]
	ERNRM%,,[ASCIZ /No room/]
	ERWLK%,,[ASCIZ /Write locked/]
	ERCSD%,,[ASCIZ /Can't supersede directory/]
	ERSNF%,,[ASCIZ /Non-existent SFD/]
	ERSLE%,,[ASCIZ /Search list empty/]
	ERLVL%,,[ASCIZ /SFD too deep/]
	ERNCE%,,[ASCIZ /No create/]
LKETBL==.-LKETB
;STSERR -- ISSUE I/O STATUS ERROR MESSAGE
;CALL:	GETSTS	T1
;	PUSHJ	P,STSERR
;UPDATES T1 TO CLEAR ERROR BITS

STSERR:	PUSH	P,T1		;SAVE STATUS
	PUSH	P,T2		;SAVE ACS
	PUSH	P,T3		; ..
E$$IOE:	MOVE	T1,['IOE',,[ASCIZ /Error /]]
	PUSHJ	P,WLDWRN	;ISSUE WARNING
	  JRST	[POP  P,T3	;IF NOT
		 POP  P,T2	; /VERB:FIRST
		 POP  P,T1	; SKIP REST
		 POPJ P,]	; OF MESSAGE
	MOVE	T1,-2(P)	;GET STATUS
	PUSHJ	P,.TOCTW	;LIST STATUS
	POP	P,T3		;RESTORE ACS
	POP	P,T2		; ..
	MOVEI	T1,[ASCIZ / while reading/]
	PUSHJ	P,.TSTRG##	;AND REST OF MESSAGE
	POP	P,T1		;RESTORE STATUS
	TRZ	T1,IO.ERR	;CLEAR ERROR BITS
	POPJ	P,		;RETURN
;MFDERR -- ISSUE MESSAGE THAT ERROR IS IN MFD
;CALL:	PUSHJ	P,MFDERR
;USES T1

MFDERR:	MOVEI	T1,[ASCIZ / MFD/]
	PUSHJ	P,STRERR	;OUTPUT STRUCTURE NAME
	PJRST	.TCRLF		;END LINE AND RETURN



;.TFILB -- OUTPUT SPECIFIC SCAN STYLE BLOCK
;.TFILE--OUTPUT UFD OR FILE NAME
;CALL:	MOVEI	T1,SCAN BLOCK (.TFILB ONLY)
;	PUSHJ	P,.TFILE/.TFILB
;USES T1

.TFILB::HRLZ	T1,T1		;POINT TO SPEC
	HRRI	T1,FSTR		;POINT TO TEMP AREA
	BLT	T1,ENDERR	;COPY
.TFILE::HLRZ	T1,FEXT		;SEE WHAT KIND OF FILE
	CAIE	T1,'UFD'	;SEE IF DIRECTORY
	JRST	DATERR		;NO--OUTPUT NORMAL FILE NAME
	SKIPN	T2,FNAM		;GET NAME
	MOVE	T2,UFDPPN	;ELSE GET DIRECTORY
	MOVE	T1,UFDPPN	;GET DIRECTORY
	CAMN	T1,MFDPPN	;SEE IF MFD
	MOVEM	T2,UFDPPN	;YES--USE FILE NAME
	SETZB	T2,UFDPPN+2	;CLEAR SFD
	SETZM	UFDPPN+3	; ..
	JRST	UFDER2		;YES--OUTPUT DIRECTORY



;UFDERR -- ISSUE MESSAGE THAT ERROR IS IN UFD
;CALL:	PUSHJ	P,UFDERR
;USES T1

UFDERR:	MOVE	T2,FLDTA	;GET DECTAPE FLAG
UFDER2:	MOVEI	T1," "		;SPACE OVER
	PUSHJ	P,.TCHAR	; ..
	PUSHJ	P,TYPSTR	;OUTPUT STRUCTURE
UFDER3:	SKIPN	T2		;SEE IF NOT DECTAPE
	PUSHJ	P,UFDLSN	;OUTPUT DIRECTORY
	MOVEI	T1,[ASCIZ /.UFD/]
IFN FT$SFD,<
	SKIPE	UFDPPN+2	;SEE IF SFD INCLUDED
	MOVEI	T1,[ASCIZ /.SFD/]
>
	SKIPE	T2		;SEE IF DECTAPE
	MOVEI	T1,[ASCIZ / directory/]
	PUSHJ	P,.TSTRG##	;SEND EXTENSION
	PJRST	.TCRLF		;END LINE AND RETURN
;DATERR -- ISSUE MESSAGE THAT ERROR IS IN A FILE
;CALL:	PUSHJ	P,DATERR
;USES T1

DATERR:	MOVEI	T1,[ASCIZ / file /]
	PUSH	P,T2		;SAVE AC
IFN FT$SFD,<
	HLRZ	T2,FEXT		;CHECK EXTENSION FOR SFD
	CAIN	T2,'SFD'	; ..
	MOVEI	T1,[ASCIZ / directory /]
>
	PUSHJ	P,.TSTRG##	;ISSUE PREFIX
	PUSHJ	P,FILOUT	;OUTPUT FILE NAME AND EXTENSION
	POP	P,T2		;RESTORE AC
	PJRST	.TCRLF		;AND END LINE AND RETURN


;DODCHN -- ROUTINE TO INCLUDE THE DATA CHANNEL IN A UUO AND EXECUTE IT
;CALL:	PUSHJ	P,DODCHN
;	  UUO TO EXECUTE
;	    NON-SKIP POINT
;	SKIP POINT
;USES NO ACS

DODCHN:	PUSH	P,T1		;PRESERVE T1
	MOVE	T1,-1(P)	;GET UUO
	MOVE	T1,(T1)		;GET UUO
	AOS	-1(P)		;ADVANCE RETURN
	IOR	T1,AGDCHN	;INCLUDE DATA CHANNEL
	EXCH	T1,(P)		;RESTORE T1 SAVE UUO
	XCT	(P)		;DO THE UUO
	  JRST	.+2		;NON-SKIP
	AOS	-1(P)		;SKIP
	POP	P,(P)		;DISCARD UUO
	POPJ	P,		;RETURN
;FILOUT -- OUTPUT NAME OF FILE AND EXTENSION
;CALL:	PUSHJ	P,FILOUT
;USES T1, T2

FILOUT:	PUSHJ	P,TYPSTR	;OUTPUT DEVICE
	HLRZ	T2,FEXT		;CHECK EXTENSION		[153]
	TRC	T2,'UFD'	;SEE IF .UFD			[153]
	JUMPE	T2,UFDER3	;YES--USE UFD FORMAT		[153]
	MOVE	T1,FNAM		;GET FILE NAME
	PUSHJ	P,.TSIXN##	;LIST IT
	HLLZ	T2,FEXT		;GET FILE EXTENSION
	MOVX	T1,FX.NUL	;SEE IF USER SPECIFIED NO EXT
	TDNE	T1,MOD		; SEE IF HE GAVE .
	JUMPE	T2,FILOU1	;NO--SEE IF HE LEFT AS NULL
	MOVEI	T1,"."		;AND SEPARATOR
	PUSHJ	P,.TCHAR	;YES--TYPE SEPARATOR
	MOVE	T1,T2		;GET NAME
	PUSHJ	P,.TSIXN	;LIST EXTENSION
FILOU1:	PJRST	UFDLSN		;OUTPUT DIRECTORY AND RETURN
;DIRERR -- ISSUE DIRECTORY ERROR MESSAGE
;CALL:	PUSHJ	P,DIRERR
;USES T1

DIRERR:	MOVEI	T1,[ASCIZ /irectory /]
	PUSHJ	P,STRER1	;OUTPUT DEVICE
				;FALL INTO UFDLSN


;UFDLSN -- ISSUE NAME OF DIRECTORY
;CALL:	PUSHJ	P,UFDLSN
;USES T1

UFDLSN:	PUSH	P,T3		;SAVE SOME ACS
	PUSH	P,T2		; ..
	SKIPE	T1,FRCPPN	;SEE IF FORCING PPN		[154]
	SETOM	UFDPPN+1	;YES--INDICATE FULL MATCH	[154]
	SKIPE	T1		;AGAIN				[154]
	MOVEM	T1,UFDPPN	;YES--FORCE NAME		[154]
	SETCM	T2,UFDPPN+1	;GET DIRECTORY MASK		[154]
	MOVE	T1,UFDPPN	;GET DIRECTORY			[154]
	CAMN	T1,MFDPPN	;IF MFD				[154]
	JUMPE	T2,[MOVE  T1,FNAM ;YES--GET NAME		[154]
		    MOVEM T1,UFDPPN ;STORE AS DIRECTORY		[154]
		    MOVE  T2,FNAM+1 ;GET NAME MASK		[154]
		    MOVEM T2,UFDPPN+1 ;STORE AS DIRECTORY MASK	[154]
		    JRST  .+1]	;THEN PROCEED			[154]
	MOVEI	T1,UFDPPN	;GET UFD NUMBER
IFN FT$SFD,<
	TLO	T1,2		;INDICATE DOUBLE WORD PATH
>
	PUSHJ	P,.TDIRB##	;AND LIST IT
	POP	P,T2		;RESTORE THOSE ACS
	POP	P,T3		; ..
	POPJ	P,		;AND RETURN
;STRERR -- OUTPUT MESSAGE AND STRUCTURE NAME
;CALL:	MOVEI	T1,MESSAGE
;	PUSHJ	P,STRERR
;USES T1

STRERR:	PUSHJ	P,.TSTRG##	;OUTPUT MESSAGE
	MOVEI	T1,[ASCIZ / on /]
STRER1:	PUSHJ	P,.TSTRG##	;OUTPUT IDENTIFICATION
TYPSTR:	SKIPN	T1,FSTR		;GET DEVICE NAME
	POPJ	P,		;RETURN IF NULL
TYPST1:	PUSH	P,T2		;SAVE AC
	PUSHJ	P,.TSIXN	;OUTPUT IT
	POP	P,T2		;RESTORE AC
	PJRST	.TCOLN##	; ..



;WLDWRN -- ISSUE WARNING PREFIX
;WLDERR -- ISSUE ERROR PREFIX
;CALL:	MOVSI	T1,ERROR CODE IN SIXBIT
;	HRRI	T1,0 OR ADDRESS OF ASCIZ MESSAGE
;	PUSHJ	P,WLDWRN/WLDERR
;NON-SKIPS IF REST OF LINE TO BE DISCARDED
;USES T1-T3

WLDWRN:	TDZA	T2,T2		;GO FOR WARNING
WLDERR:	MOVEI	T2,"?"-"%"	;GO FOR ERROR
	ADDI	T2,"%"		;CONVERT TO RIGHT TEXT
	HRLZS	T2		;POSITION ERROR INDICATOR
	HRR	T2,T1		;MOVE TEXT POINTER
	HLRZS	T1		;POSITION ERROR CODE
	HRLI	T1,'WLD'	;INDICATE FROM WILD
	HRRZ	T3,(P)		;GET ADDRESS+1 OF CALL
	SUBI	T3,2		;BACKUP TO E$$ POINT
	PUSH	P,T4		;PRESERVE T4
	PUSHJ	P,.ERMSA##	;ISSUE ERROR PREFIX
	POP	P,T4		;RESTORE T4
	TXNE	T1,JWW.FL	;SEE IF /MESSAGE:FIRST
	AOS	(P)		;YES--INDICATE TO DO REST OF LINE
	POPJ	P,		;RETURN
	SUBTTL	STRUCTURE SUBROUTINES

;.INSTR -- ROUTINE TO INITIALIZE STRUCTURE SEARCH LOOP
;CALL:	MOVE	T1,DEVICE
;	MOVE	T2,1B0 IF /PHYSICAL
;	PUSHJ	P,.INSTR
;NON-SKIP IF NOT A DISK
;SKIP WITH CODES PRESET FOR .NXSTR
;  AND T1=0 IF NO SCANNING, =1B0 IF SCANNING

.INSTR::PUSHJ	P,.SAVE1##	;SAVE P1
	MOVSI	T3,'SYS'	;SEE IF
	DEVCHR	T3,UU.PHY	; PHYSICAL
	TRNN	T3,-1		; POSSIBLE
	TXZ	T2,UU.PHS	;NO--CLEAR ARGUMENT
	LSH	T2,-^D35	;POSITION TO BIT 35
	MOVEM	T2,PHYS		;STORE FOR UUO
	SETOM	SY2RCH		;ASSUME AT LEAST 5.02
	MOVEM	T1,FSTR		;SAVE DEVICE
	SETZM	SYSRCH		;CLEAR
	SETZM	STRMSK		; FLAGS
	SETZM	STRMTH		; FOR .NXSTR
	SETZM	SRCH		;CLEAR SEARCH MODE
	SETOM	SUBSTR		;INDICATE .INSTR CALL
	MOVE	T2,T1		;COPY ARGUMENT DEVICE
	PUSHJ	P,DOPHYS	;GET
	  DEVCHR T2,		; ITS CHARACTERISTICS
	MOVS	T1,FSTR		;GET NAME AGAIN
	CAIN	T1,'NUL'	;SEE IF NUL:
	TLO	T2,-1-<(DV.TTA)> ;YES--FAKE DEVCHR FOR OLD MONITORS
	TLC	T2,-1-<(DV.TTA)> ;SEE IF NUL:
	TLCE	T2,-1-<(DV.TTA)> ; ..
	TXNN	T2,DV.DSK	;OR NOT DISK
	POPJ	P,		;RIGHT--ERROR
				;FALL INTO INSTR
				;FALL HERE FROM ABOVE
;INSTR -- INTERNAL ROUTINE TO INITIALIZE .NXSTR

INSTR:	SETZM	FRCPPN		;INDICATE NOT OVERRIDING PPN	[154]
IFN FT$SFD,<
	MOVE	T3,FSTR		;GET STRUCTURE
	MOVEI	T4,0		;CLEAR ANSWER
	MOVE	T2,[3,,T3]	;SETUP CODE
	PUSHJ	P,DOPHYS	;ASK MONITOR FOR
	  PATH.	T2,		;  SYS IDENT.
	    JRST INSTR3		;NOT IMPLEMENTED--TRY OLD WAY
	MOVE	T1,P1		;SAVE DEVICE PPN
	HLRZ	T2,T3		;GET GENERIC STR NAME
	CAIE	T2,'SYS'	;LOOK FOR SYS:
	TXNE	T4,PT.IPP	;NO--SEE IF IGNORE DIRECTORY ARGS
	JRST	.+2		;YES--CLOBBER ARGUMENT
	JRST	INSTR2		;NO--PROCEED
	CAIN	T2,'SYS'	;IF SYS,
	HRLI	T3,'DSK'	;SWITCH TO DSK TO GET RIGHT SUBSET
	MOVEM	T3,FSTR		;  LIKE "SYSA:", ETC.
	SKIPN	SUBSTR		;IF INTERNAL CALL,
	PUSHJ	P,SETPPN	;  SET REQUESTED PPN
	TXNN	T4,PT.IPP	;SEE IF IGNORE PPN
	SETOM	SYSRCH		;NO--SET SYS FLAG

;HERE TO SEE IF SPECIAL SEARCH LIST NEEDED

INSTR2:	LDB	T1,[POINTR (T4,PT.SLT)]  ;GET S/L CODE
	JUMPE	T1,INSTR3		;PROCEED IF NOTHING SPECIAL
	SETZM	SY2RCH		;EXPLICIT INFO, SO CLEAR FLAGS
	SETZM	SYSRCH		; ..
	CAIE	T1,.PTSLA	;SEE IF ALL S/L
	CAIN	T1,.PTSLS	;OR SYS S/L
	SETOM	SYSRCH		;YES--FLAG FOR ALL OR SYS
	CAIN	T1,.PTSLS	;SEE IF SYS S/L
	SETOM	SY2RCH		;YES--FLAG FOR SYS
	JRST	INSTR7		;AND SKIP AD HOC KLUDGERY
>
INSTR3:	MOVE	T2,FSTR		;GET DEVICE NAME
	MOVE	T3,[1,,T2]	;SET FOR DSKCHR
	PUSHJ	P,DOPHYS	;DO PHYS I/O CALL
	  DSKCHR T3,		;SEE IF SYS OR GENERIC
	    JRST INSTR5		;FAILED--MUST BE SYS:
	LDB	T1,[POINTR (T3,DC.TYP)]  ;GET NAME CLASS
	JUMPE	T1,INSTR7		;JUMP IF DSK:
	CAIN	T1,.DCTAB	;IF STR ABBR. (SE:)
	JRST	INSTM1		;  GO SET MASK
	CAIN	T1,.DCTCN	;IF CONTROLLER CLASS (DP:)
	JRST	INSTM4		;  GO SET DSKCHR MASK
	CAIN	T1,.DCTCC	;IF CONTROLLER (DPA:)
	JRST	INSTM5		;  GO SET IT
	JRST	INSTRX		;NOTHING SPECIAL--USE USER'S DEVICE
;HERE WHEN STR ABBREVIATION FOUND (LIKE SE: FOR SEFI: AND SEMA:)

INSTM1:	MOVE	T3,FSTR		;GET ABBREVIATION
	DEVNAM	T3,		;CONVERT TO PHYSICAL IF WE CAN
	  MOVE	T3,FSTR		;IF NOT DO THE BEST WE CAN
	PUSHJ	P,.MKMSK##	;GET MASK OF SIZE
	JRST	INSTM8		;AND GO STORE

;HERE WHEN CONTROLLER CLASS (DP:)

INSTM4:	MOVX	T1,DC.CNT	;SET MASK FOR TYPE OF CONTROLLER
	JRST	INSTM8		;AND GO STORE

;HERE WHEN CONTROLLER (DPA:)

INSTM5:	MOVX	T1,<DC.CNT!DC.CNN>	;SET MASK FOR TYPE AND NUMBER OF CONTROLLER

;HERE WITH T1=MASK, T3=MATCH

INSTM8:	MOVEM	T1,STRMSK	;STORE MASK
	MOVEM	T3,STRMTH	;STORE MATCH
	JRST	INSTR6		;AND FLAG FOR SYSSTR TYPE SEARCHING

;HERE WHEN SYS SEARCH LIST IS SELECTED

INSTR5:	SKIPN	SYSRCH		;SEE IF ALREADY SETUP
	PUSHJ	P,SETSYS	;SETUP DIRECTORY FOR SYS:
INSTR6:	SETOM	SYSRCH		;FLAG FOR SYSTEM SEARCH LIST (F/S LIST)

;HERE WHEN ANY SEARCH LIST IS SELECTED

INSTR7:	SETOM	SRCH		;FLAG TO USE A SEARCH LIST
INSTRX:	SETZM	LASSTR		;CLEAR STRUCTURE TO START
	SKIPE	T1,SRCH		;SEE IF SEARCHING
	MOVX	T1,UU.PHS	;YES--RETURN /PHYSICAL
	JRST	CPOPJ1		;AND SKIP RETURN
;.NXSTR -- ROUTINE TO GET NEXT STRUCTURE
;CALL:	PUSHJ	P,.NXSTR
;NEVER SKIPS. RETURNS NAME IN T1, 0 IF DONE.
;RESULT SHOULD ALWAYS BE USED PHYSICAL ONLY

.NXSTR::SKIPN	SRCH		;HERE FOR NEXT--SEE IF SEARCHING
	JRST	CPOPJZ		;NO--GO TO NEXT REQUEST
NXSTR2:	MOVE	T1,LASSTR	;GET F/S NAME FOR LIST
	SKIPE	SYSRCH		;NEED A NEW F/S
	JRST	NXSTR3		;FROM SYSTEM F/S LIST
	SKIPN	T1		;SEE IF FIRST PASS
	SETOM	T1		;YES--BLANKETY-BLANK UUO
	MOVE	T2,[1,,T1]	;SETUP POINTER
	JOBSTR	T2,		;FROM JOB'S SEARCH LIST
	  HALT	CPOPJZ
	JRST	NXSTR5		;GOT IT

NXSTR3:	SKIPE	SY2RCH		;NEEDS SYS: S.L.
	SKIPE	STRMSK		;IF MASK, NEEDS ALL STR LIST
	JRST	.+2		;YES--USE IT
	JRST	NXSTR4		;GO USE REAL SYS: SEARCH LIST
	SYSSTR	T1,		;CAN'T--USE ALL STRS IN SYSTEM
	  HALT	CPOPJZ
	JRST	NXSTR5		;GOT IT--GO PROCESS

NXSTR4:	SKIPN	T1		;SEE IF AT START
	SETOM	T1		;YES--FOOLISH UUO
	MOVEM	T1,GOBST+2	;STORE STR IN GOBSTR'S ARG LIST
	SETZM	GOBST		;SPECIFY JOB 0
	MOVX	T1,%LDSYS	;GET LOCATION OF SYS:
	GETTAB	T1,		;FROM MONITOR
	  MOVE	T1,[1,,1]	;(LEV. C)
	MOVEM	T1,GOBST+1	;STORE IN ARGUMENT
	MOVEI	T1,GOBST	;SETUP SHORT BLOCK
	GOBSTR	T1,		;ASK MONITOR
	  HALT	CPOPJZ		;GIVE UP IF ERROR
	MOVE	T1,GOBST+2	;GET ANSWER
;HERE WITH RESULT FROM S/L IN T1

NXSTR5:	CAMN	T1,[-1]		;LOOK FOR END
	JRST	CPOPJZ		;YES--DONE
	JUMPE	T1,CPOPJZ	;IF ZERO, ALL DONE
	MOVEM	T1,FSTR
	MOVEM	T1,LASSTR	;SAVE FOR SEARCH

	MOVEM	T1,.WLDBF	;DO A DSKCHR			[303]
	MOVE	T3,[.DCSAJ+1,,.WLDBF]
	PUSHJ	P,DOPHYS	; TO HANDLE			[303]
	  DSKCHR T3,		; SINGLE ACCESS			[303]
	    HALT CPOPJZ		; ..				[303]
	TXNE	T3,DC.SAF	;SEE IF SINGLE ACCESS		[303]
	JRST	[PJOB T2,	;YES--GET OUR JOB		[303]
		 XOR  T2,.WLDBF+.DCSAJ ;COMPARE TO S.A. USER	[303]
		 TRNE T2,-1	;SEE IF MATCH			[303]
		 JRST NXSTR2	;NO--IGNORE STRUCTURE		[303]
		 JRST .+1]	;YES--OK TO TRY IT		[303]
	SKIPN	T2,STRMSK	;SEE IF MASKING RESULTS
	JRST	NXSTRX		;NO--PROCEED WITH RESULTS
	SKIPL	T2		;SKIP IF NAME MASKING
	SKIPA	T1,T3		;POSITION DSKCHR FOR MATCH
	MOVE	T1,FSTR		;YES--GET BACK NAME		[303]
	XOR	T1,STRMTH	;SEE IF MATCHES
	TDNE	T1,STRMSK	;WHERE IMPORTANT
	JRST	NXSTR2		;NO--GO GET NEXT STR

;HERE TO RETURN VALUE TO THE CALLER
NXSTRX:	SKIPA	T1,FSTR		;RETURN RESULT
CPOPJZ:	MOVEI	T1,0		;RETURN ZERO
	POPJ	P,		;RETURN
	SUBTTL	USEFUL SUBROUTINES

;SETSYS -- SETUP DIRECTORY FOR SYS:
;CALL:	PUSHJ	P,SETSYS
;USES T1, T2

SETSYS:	MOVX	T1,%LDSYS	;GET LOCATION OF SYS:
	GETTAB	T1,		;FROM MONITOR
	  MOVE	T1,[1,,1]	;(LEV C)
SETPPN:	CAMN	T1,MFDPPN	;IF MFD:,			[153]
	JRST	[MOVE  T2,UFDPPN ;GET DIRECTORY			[153]
		 CAMN  T2,MFDPPN ;UNLESS MFD,			[153]
		 POPJ  P,	;(YES--RETURN)			[153]
		 MOVEM T2,FNAM	; STORE AS NAME			[153]
		 MOVE  T2,UFDPPN+1 ;GET DIRECTORY MASK		[153]
		 MOVEM T2,FNAM+1 ;STORE AS NAME MASK		[153]
		 JRST  .+1]	;PROCEED			[153]
	MOVEM	T1,FRCPPN	;OVERRIDE DIRECTORY		[154]
	MOVE	T2,MFDPPN	;GET MFD
	CAMN	T2,UFDPPN	;SEE IF SAME			[154]
	JRST	SETPP1		;YES--GO DIDDLE NAME
	MOVEM	T1,UFDPPN	;AND OVERSTORE REQUEST		[154]
	SETOM	UFDPPN+1	;AND NO WILD DIRECTORY		[154]
IFN FT$SFD,<
	SETZM	UFDPPN+2	;CLEAR SUB DIRECTORY		[154]
	SETZM	UFDPPN+3	; AND MASK			[154]
>
	POPJ	P,		;RETURN
SETPP1:	MOVEM	T1,FNAM		;STORE OVER NAME		[154]
	SETOM	FNAM+1		;CLEAR WILD CARD		[154]
	POPJ	P,		;RETURN
;DOPHYS -- PERFORM A LOGICAL OR PHYSICAL CALLI AS NEEDED
;CALL:	PUSHJ	P,DOPHYS
;	CALLI TO BE EXECUTED
;	CPOPJ RETURN POINT
;	SKIP RETURN POINT
;USES T1

DOPHYS:	MOVE	T1,(P)		;FETCH CALLI
	MOVE	T1,(T1)		; ..
	AOS	(P)		;ADVANCE RETURN POINT
	SKIPE	PHYS		;SEE IF PHYS I/O REQUESTED
	TRO	T1,UU.PHY	;YES--TURN ON PHYSICAL BIT
	XCT	T1		;DO THE CALLI
	POPJ	P,		;OK RETURN
CPOPJ1:	AOS	(P)		;SKIP
CPOPJ:	POPJ	P,		;RETURN



;SETOPN -- SETUP OPEN BLOCK WORD 1 AND 2
;CALL:	PUSHJ	P,SETOPN
;RETURNS WITH T1, T2 SETUP, T3=0
;USES NO ACS

SETOPN:	SETZB	T1,T3		;OPEN MFD
	SKIPN	PHYS		;SEE IF PHYS I/O REQUESTED
	SKIPE	SRCH		;OR IF USING A SEARCH LIST
	TLO	T1,(UU.PHS)	;YES--SET FOR PHYS OPEN
	SKIPN	T2,LASSTR	;GET STRUCTURE OR		[310]
	MOVE	T2,FSTR		;GET ARGUMENT DEVICE
	POPJ	P,		;RETURN
	XLIST	;LITERALS
	LIT
	LIST
	RELOC

.WILDZ::!		;START OF LOW CORE AREA

FWAZER:!	;START OF TEMPORARIES (CLEARED EACH REQUEST)
		;THIS PARALLELS INPUT PARAMETER AREA
FSTR:	BLOCK	1		;CURRENT STRUCTURE
FNAM:	BLOCK	2		;CURRENT FILE NAME
FEXT:	BLOCK	1		;CURRENT FILE EXTENSION
MOD:	BLOCK	2		;CURRENT SWITCHES
UFDPPN:	BLOCK	2*.FXLND+2	;CURRENT DIRECTORY
ENDERR==.-1

FLDTA:	BLOCK	1		;FLAG THAT DISK DEVICE
NOTDSK:	BLOCK	1		;FLAG THAT NOT A DTA/DISK DEVICE
SUBSTR:	BLOCK	1		;FLAG CALL TO SUBROUTINE .NXSTR
LASSTR:	BLOCK	1		;LAST STR FROM SEARCH UUOS
LASERR:	BLOCK	1		;LAST ERROR OF DIRECTORY NATURE
NOSTRS:	BLOCK	1		;NUMBER OF STRS IN SEARCH LIST
NOFILF:	BLOCK	1		;NUMBER OF FILES FOUND
NOFILP:	BLOCK	1		;NUMBER OF FILES WITH UNREPORTED PROTECTION ERRORS
NODIRP:	BLOCK	1		;NUMBER OF DIRECTORIES WITH UNREPORTED PROTECTION ERRORS
NOFILR:	BLOCK	1		;NUMBER OF FILES REJECTED
NOFIL:	BLOCK	1		;NUMBER OF FILES LOOKED AT
NOUFDF:	BLOCK	1		;NUMBER OF UFDS FOUND
NSUFD:	BLOCK	1		;NUMBER OF EXISTENT UFDS FOUND
DIRFLG:	BLOCK	1		;-1 IF THIS IS A DIRECTORY
FRCPPN:	BLOCK	1		;PPN TO OVERRIDE WITH
FNDSFD:	BLOCK	.FXLND		;+N IF SFD FIRST PASS, -1 IF SECOND
.WLDFL::BLOCK	1		;FILE WILD FLAG (-1=WILD FILE, +1=WILD STR ONLY,
				;  0=NEITHER, -2 IF WILD FILE AND WILD STR)
STRMSK:	BLOCK	1		;MASK FOR MATCHING STRS
				;  BY NAME IF LT 0, BY DSKCHR IF GT 0
STRMTH:	BLOCK	1		;MATCH FOR ABOVE
UFDEF:	BLOCK	1		;FLAG THAT UFD ERROR WAS REPORTED
PHYS:	BLOCK	1		;FLAG TO FORCE PHYSICAL I/O
SRCH:	BLOCK	1		;FLAG FOR SEARCH LIST IN USE
SYSRCH:	BLOCK	1		;FLAG FOR SYSTEM SEARCH LIST IN USE
SY2RCH:	BLOCK	1		;FLAG FOR REAL SYS: SEARCH LIST
.WIFIR::BLOCK	1		;FIRST P1 IN LINKED SET
.WILAS::BLOCK	1		;LAST P1 IN LINKED SET
FLCRDT:	BLOCK	1		;FILE'S CREATION DATE-TIME	[300]
FLACDT:	BLOCK	1		;FILE'S ACCESS DATE		[300]
GOBST:	BLOCK	5		;GOBSTR PARAMETER AREA

IFN FT$SFD,<
DIRB:	BLOCK	1		;BLOCK FOR DIRECTORY FOR SFD LOOKUPS
DIRBS:	BLOCK	1		; (SCANNING SWITCH)
DIRBU:	BLOCK	.FXLND		; (ACTUAL DIRECTORY LIST)
DIRBE:	BLOCK	1		;0 TO FORCE END
>
DEPTH:	BLOCK	1		;INDEX OF DIRECTORY DEPTH (0=MFD)
BUFCNT:	BLOCK	.FXLND+1	;COUNT DOWN OF FILES IN BLOCK
BUFPOS:	BLOCK	.FXLND+1	;INDEX IN BLOCK
DIRSTI:	BLOCK	.FXLND+1	;USETI IN DIRECTORY
.WLDBF::BLOCK	200		;BUFFER FOR READING DIRECTORIES
DVCH:	BLOCK	1		;LAST DEVICE CHARACTERISTICS
LWAZER==.-1	;END OF CLEARED AREA

MFDPPN:	BLOCK	1		;DIRECTORY FOR MFD
MYPPN:	BLOCK	1		;PPN OF THIS JOB

IFN FT$SFD,<
PTHARG:	BLOCK	1		;ARGUMENT/FLAG FOR PATH UUO
PTHSCN:	BLOCK	1		;SCAN SWITCH FOR PATH UUO
PTHDIR:	BLOCK	.FXLND		;ACTUAL PATH
PTHEND:	BLOCK	1		;0 TO FORCE END
PTHLEN==.-PTHARG
>

AGLENL:	BLOCK	1	;LENGTH OF LOOKUP BLOCK
AGLENP:	BLOCK	1	;LENGTH OF PARAMETER AREAS FROM SCANER
AGLIMS:	BLOCK	1	;LOCATION OF LAST AREA FROM SCANER
AGLOOK:	BLOCK	1	;LOCATION OF LOOKUP BLOCK
AGOPEN:	BLOCK	1	;LOCATION OF OPEN BLOCK
AGPNTR:	BLOCK	1	;LOCATION OF INDEX TO SCANER AREAS
AGDCHN:	BLOCK	1	;DATA CHANNEL
AGFLAG:	BLOCK	1	;USER'S FLAGS
AGEODN:	BLOCK	1	;ROUTINE TO NOTIFY AT END OF DIRECTORY
;STORAGE FOR SCWLD

SCISP:	BLOCK	1	;INPUT SPEC LOCATION
SCIOPN:	BLOCK	1	;INPUT OPEN LOCATION
SCILKP:	BLOCK	1	;INPUT LOOKUP LOCATION
SCOSP:	BLOCK	1	;OUTPUT SPEC LOCATION
SCOOPN:	BLOCK	1	;OUTPUT OPEN LOCATION
SCOLKP:	BLOCK	1	;OUTPUT LOOKUP LOCATION
SCODFE:	BLOCK	1	;ADDRESS OF DEFAULT EXTENSION
SCOLLK:	BLOCK	1	;OUTPUT LOOKUP LENGTH

SCCHR:	BLOCK	1	;DEV CHR
SCTYP:	BLOCK	1	;DEV TYP
SCNBT:	BLOCK	1	;TEMP FOR FNDNBT
SCNWD:	BLOCK	1	;TEMP FOR FNDNBT
IFN FT$SFD,<
SCSFD:	BLOCK	1	;ARG/FLAG
SCSFDS:	BLOCK	1	;SCAN
SCSFDD:	BLOCK	.FXLND	;ACTUAL PATH
SCSFDE:	BLOCK	1	;0 TO FORCE END
>

SAVEP1:	BLOCK	1	;STORAGE FOR USER'S P1


B.DC::	BLOCK	3		;DATA

.WILDL==:.-.WILDZ	;LENGTH OF LOW CORE AREA

	END