	TAD I	LOJOBP		/PICK UP PROJ,PROG NUMBER
	JMS I	UTS01		/SEARCH UFD TABLE
	JMP	LGO2		/OOPS!! MIGHT AS WELL TRY TO LEAVE GRACEFULLY
	ISZ I	UTPRNU		/REMOVE THIS JOB FROM ACCESS COUNT
	JMP	LGO2
	CLA CMA			/LAST USER ACCESSING THIS UFD
	TAD	UTPRNU
	JMS I	TF01		/FREE THE UFD TABLE ENTRY
LGO2,	CLA
	DCA I	LOJOBP		/REMOVE USER FROM JOB TABLE
	TAD	LGO4A		/KLUDGE FIEXIT TO RETURN TO LGO4
	DCA	LGKLUJ
TABOUT,	CLA CMA
	DCA	TABSTA		/FORCE TABLES OUT
	JMP I	FIEXIT
LOJOBP,	0

LOSRRI,	RTABLE
	0
LGO4A,	LGO4
LGO1A,	LGO1
LGKLUJ,	FIX500
LGRESA,	LGRES0
/ROUTINE TO OPEN A UFD

/CALLING SEQUENCE:
/	TAD (PROJ,PROG NUMBER)
/	JMS UFO0
/	ERROR RETURN (AC=0 IF TABLES FULL; OTHERWISE UFD NOT FOUND)
/	NORMAL RETURN (POSITION ON TABLE IN AC)

*3200

UFO0,	0
	JMS	UFO6		/GO GET THE RETR. INFO FOR THIS GUY'S UFD INTO CORE
	JMP I	UFO0		/COULDN'T GET IT
	DCA	UOBUFP		/POINTER TO RETRIEVAL INFORMATION
	TAD	UFDTBL
	IAC
	DCA	UOUFDP		/UFD TABLE POINTER
/SEARCH FOR A FREE SLOT IN UFDTBL
UFO3,	TAD I	UOUFDP
	SNA CLA
	JMP	UFO2		/FOUND A FREE SLOT ON THE TABLE
	TAD	UOUFDP		/THIS SLOT IS OCCUPIED
	TAD	P0004
	DCA	UOUFDP		/NEXT POSITION (ACCES COUNT ENTRY)
	TAD	UFDEND		/ARE WE AT THE END OF THE TABLE
	CMA
	TAD	UOUFDP
	SNA CLA			/HAVE WE SEARCHED THE WHOLE TABLE?
	JMP I	UFO0		/NO ROOM ON TABLE
	JMP	UFO3		/LOOK AT NEXT SLOT

/COMES HERE WITH UOUFDP POINTING TO A FREE SLOT IN UFDTBL
UFO2,	CLL STA RAL		/AC=-2
	TAD	UOUFDP		/BACK UP THE POINTER
	DCA	INDEX
	TAD	UFORET+1
	JMS I	UFQUOA		/LOAD THE UFD TABLE
	STA
	TAD	UFDTBL
	CIA
	TAD	INDEX
	CLL RTR
	DCA	UFO6		/RELATIVE POSITION ON TABLE
	TAD	UFO6
	JMS I	BLDP1		/GENERATE A PTR INTO RETTBL
	DCA	UFORET		/RETRIEVAL POINTER
	TAD	C7771
	DCA	CFH		/COUNTER FOR TRANSFER TO TABLE
/NOW MOVE RETRIEVAL INFORMATION FOR THIS GUY'S
/UFD INTO RETTBL
UFO4,	ISZ	UOBUFP
	TAD I	UOBUFP
	DCA I	UFORET
	ISZ	UFORET
	ISZ	CFH		/ENTIRE RETRIEVAL BLOCK TRANSFERRED?
	JMP	UFO4		/NO, KEEP IT UP
	ISZ	UFO0		/YES, PREPARE FOR NORMAL RETURN
	TAD	UFO6		/PICK UP RELATIVE POSITION
	JMP I	UFO0

UFORET,	0
	0
UFQUOA,	UFQUOT
UOUFDP=	UTPRNU
UOBUFP,	0


UFO6,	0
	DCA	UFORET+1	/SET UP CALLING SEQUENCE FOR MFD SEARCH
	TAD	RETTBL
	DCA	UFORET
	CMA
	JMS I	DS01		/ONE WORD MASTER FILE DIRECTORY SEARCH FOR PROJ,PROG MATCH
	UFORET
	JMP I	UFO6		/COULD NOT FIND UFD ENTRY
	TAD	P0004		/POINT AT DISK QUOTA WORD
	DCA	UFORET
	TAD I	UFORET
	AND	P0077		/SAVE ONLY LOGIN QUOTA
	DCA	SEGLIM		/SAVE FOR LATER
	TAD	P0003
	TAD	UFORET
	DCA	UFORET		/POINTER TO UFD RETRIEVAL INFORMATION
	TAD I	UFORET
	DCA	UFO1
	TAD	RETTBL		/POINTER TO RET. INFO OF FILE BEING SEARCHED (IN THIS CASE, THE MFD)
	JMS I	GE01		/GET RETRIEVAL INFORMATION INTO CORE
UFO1,	0
	ISZ	UFO6
	JMP I	UFO6
/ROUTINE TO SEARCH UFD TABLE FOR PROJ,PROG NUMBER

/CALLING SEQUENCE:
/	TAD (PROJ,PROG NUMBER)
/	JMS UTS0
/	NOT FOUND RETURN
/	NORMAL RETURN (RETRIEVAL POSITION IN AC)

UTS0,	0
	DCA	UTPR1		/PROJ,PROG NUMBER
	TAD	UFDTBL		/PTR TO HEAD OF UFDTBL
	DCA	UTUPTR
UTS1,	TAD	UFDEND		/END OF UFD TABLE
	CIA
	TAD	UTUPTR
	SNA CLA
	JMP I	UTS0		/COULD NOT FIND PROJ,PROG NUMBER ON TABLE
	TAD I	UTUPTR
	CIA
	TAD	UTPR1
	SNA CLA
	JMP	UTS3		/FOUND ENTRY, GET POINTER
	TAD	UTUPTR		/STEP UP ONE SLOT
	TAD	P0004
	DCA	UTUPTR
	JMP	UTS1		/LOOK IN THE NEXT ENTRY
UTS3,	TAD	UFDTBL
	CIA
	TAD	UTUPTR
	CLL RTR			/RELATIVE POSITION ON TABLE
	IAC			/THE RELATIVE POSITION
	ISZ	UTPRNU		/UTPRNU POINTS TO ACCESS COUNT OF THIS PROJ, PROG #
	ISZ	UTS0
	JMP I	UTS0

DVT1,
UTPR1,	0
UTUPTR=	UTPRNU

DVT0,	0			/COMPUTE DEVICE TIME AT RELEASE
	DCA	DVT1		/ELAPSED DEVICE TIME
	JMS I	JBLD0
	DCA	DVT3		/PROJ,PROG NUMBER OF CURRENT USER
	CLA CMA
	JMS I	DS01		/SEARCH MFD FOR PROJ,PROG NUMBER
	DVT4
	JMP I	DIRBAD		/***********DEBUG ONLY***********
	TAD	C0005
	DCA	CFH		/POINTER TO DEVICE TIME WORD
	TAD	DVT1
	TAD I	CFH		/UPDATE USER'S CUMULATIVE DEVICE TIME
	DCA I	CFH
	DCA	BUFMOD		/SCHEDULE WRITE
	DATFLD
	JMP I	DVT0

DVT4,	RTABLE
DVT3,	0



/COMES HERE IF FIP WAS CALLED BY S.I.
/READ S.I. BACK IN AND RETURN TO IT
FIX30,	CFLD			/CHANGE TO CURRENT FIELD
	TAD	C0603
	DCA	FLPARB		/SET UP READ IOT
	DCA	FLPARB+1	/SI IS ON TRACK 0 OF THE DISC
	JMS I	FIX401
	JMS I	FIO01		/RETURN WILL BE TO SI


SCL1,	0
	JMS I	RD301		/SET UP DISK PARAMETERS
	STA
	DCA	BUFSTA		/FUDGE TO APPEAR THAT READ WAS DONE
	JMP I	SCL1

RD301,	RD30
/EXIT ROUTINE
/COMES HERE WHEN FIP HAS COMPLETED ITS TASK
/FIRST, SEE IF ANY INTERNAL FILES HAVE BEEN CHANGED
/THOSE THAT HAVE CHANGED MUST BE WRITTEN BACK OUT TO DISC
*3400
/*** ANY DATA FIELD IS OK AT THIS POINT!!

FIX0,	JMS I	WRT1		/MAKE SURE THE BUFFER IS EMPTY
	ISZ	TABSTA		/CHECK TABLE STATUS
	JMP	FIX1		/NOTHING CHANGED IN TABLES
	TAD	JOBTAB		/BOTTOM OF TABLE AREA
	JMP	FIX2		/SAVE TABLES BEFORE EXIT

FIX1,	ISZ	SATSTA		/CHECK SAT STATUS
	JMP	FIX20		/NOTHING TO BE SAVED, EXIT
	TAD	SATBOT		/BOTTOM OF SAT
FIX2,	JMS I	FIX401
	TAD	FIDEXP		/GLOBAL TI "FIPDEX"
	DCA	FLPARB+1	/MEMORY FIELD
	TAD	C0605
	DCA	FLPARB		/WRITE IOT
	JMS I	FIO01		/PERFORM THE WRITE
	HLT			/ERROR ON WRITE, FATAL

/ALL DISC TABLES ARE NOW UP TO DATE (*** ANY DATA FIELD IS OK AT THIS POINT!!)
FIX20,	FGETJT
	JOBSTS
	DCA	FIOPTR
	DATFLD
	TAD I	FIOPTR
	AND	FISIOT
	DCA I	FIOPTR
	CFLD
	FGETJT			/RESTORE USER AC
	JOBREG+2
	DCA	FIOPTR		/ADDRESS OF USER'S AC
	TAD	FIUSAC
	DATFLD
	DCA I	FIOPTR
	CDF
	TAD	C002		/FIP ALWAYS RUNS IN FIELD 2 SO ADD 2 TO CORTBL
	TAD	CORTBA		/GLOBAL TO "CORTBL"
	DCA	FIOPTR		/POINTS TO THIS FIELD'S ENTRY IN CORTBL
	JMP I	.+1
FIX500,	FIX50

FISIOT,	-JSIOT-1
/ROUTINE TO DETERMINE IF A DEVICE IS ASSIGNED TO THIS JOB

/CALLING SEQUENCE:
/	TAD (DEVICE NUMBER)
/	JMS DTE0
/	0	(SET BY DTE0 TO POINT TO ENTRY IN DEVTBL)
/	RETURN (DEVICE NOT ASSIGNED TO THIS JOB)
/	RETURN (DEVICE ASSIGNED)

DTE0,	0
	SPA
	JMP	DTE10		/NON-TTY DEVICE
	TAD	NULNM1		/CHECK FOR VALID TTY NUMBER
	SMA
	JMP	DTE6		/INVALID TTY NUMBER
	CLL RAL			/TWO WORDS PER TTY
DTE4,	TAD	DEVEND		/FIND LOCATION IN DEVTBL
DTE5,	CFLD
	DCA I	DTE0		/RETURN ARGUMENT
	TAD I	DTE0
	ISZ	DTE0
	DCA	DTE2
	DATFLD
	TAD I	DTE2		/GET POINTER TO DDB
	SNA			/IS THERE ONE?
	JMP I	DTE0		/NO, RETURN
	DCA	DTE2		/YES
	ISZ	DTE2
	TAD I	DTE2		/GET JOB NUMBER
	CIA
	TAD	FIJOB		/NUMBER OF CURRENT JOB
	AND	P0037
	SNA CLA			/DOES DEVICE BELONG TO THIS JOB?
	ISZ	DTE0		/YES
	JMP I	DTE0		/RETURN
DTE6,	STA
	TAD	DEVTBA		/POINT TO DUMMY DEVTBL ENTRY
	JMP	DTE5


DTE2,	0
NULNM1,	-NULINE-1
P3777,	3777
NUDEVM,	DEVTBE-JOBTBL
NUDEV,	JOBTBL-DEVTBE

DTE10,	AND	P3777
	TAD	NUDEVM		/CHECK DEVICE NUMBER FOR VALIDITY
	SMA
	JMP	DTE6		/INVALID DEVICE NUMBER
	TAD	NUDEV		/GET DEVICE NUMBER BACK
	JMP	DTE4		/GO FINISH UP
LNK0,	0			/GET FILE LINKAGE
	TAD	LNKF
	DCA	LNK1
	FGETJT
LNK1,	0
	DCA	CFH
	DATFLD
	TAD I	CFH		/PTR TO FILE CONTROL BLOCK
	JMP I	LNK0
LNKF,	JOBF0
SAV1,
FGETJ0,	0
	CFLD
	TAD I	FGETJ0
	DCA	.+4
	TAD	JOBDAT
	CIF
	GETJTA
	0
	ISZ	FGETJ0
	JMP I	FGETJ0
SAVCRE,	0
	DCA	SAV1
	TAD	SAV1		/FILE ADDR
	TAD	P0004		/PTR TO PROTECTION BITS IN FILE
	DCA	SAV2
	TAD I	SAV2		/GET THE PROTECTION BITS
	AND	C0020		/IS IT WRITE PROTECTED AGAINST THE OWNER?
	SZA CLA
	JMP I	EXT10A		/YES, RETURN WITH PROT. VIOLATION MESSAGE
	TAD	SAV1		/NO, REDUCE THE FILE TO 0 SEGS
	JMS I	RED11		/GO DO REDUCTION
	JMP I	SAVCRE		/RETURN
RED11,	RED1
EXT10A,	EXT10
SAV2,
CRFUFD,	1
	JMS I	ACC01		/IS THIS ACCOUNT 1?
	JMP	CRFUF1		/YES
	IAC
	DCA I	INDEX		/FILE SIZE INITIALLY 1
	JMP I	CRFUFD		/BACK FOR THE DATE
CRFUF1,	DCA I	INDEX		/ZERO CPU TIME
	JMP I	.+1		/GO ZERO DEVICE TIME ALSO
	CRFUFR
/CONVERT AN ABSOLUTE PTR INTO RETTBL TO A RELATIVE ENTRY NUMBER
ENS3,	0
	CIA
	TAD	RETTBL		/REL. PTR TO ADDRESS WITHIN RETTBL
	CIA
	AND	P7770		/ANY POINTER WITHIN THE BLOCK IS OK
	CLL RTR
	RAR			/DIVIDE BY 8
	JMP I	ENS3
/ROUTINE TO ASSIGN A DEVICE

*3600
ASD1,	TAD	FIOSTK+1
	SMA			/TTY?
	JMP I	LGI201		/DON'T LET HIM/HER ASSIGN TTY'S! RETURN WITH AC=7777
	JMS I	DTE01		/IS THIS DEVICE ASSIGNED TO THIS JOB?
ASD2,	0			/SET BY DTE01 TO POINT TO PROPER ENTRY IN DEVTBL
	SKP
	JMP	ASD4		/YES
	TAD I	ASD2		/GET DDB ADDRESS FOR THIS DEVICE
	SZA			/ZERO?
	JMP	ASD11		/NO, SO SOMEONE HAS IT
/COMES HERE IF OKAY TO MAKE THIS ASSIGNMENT
	CFLD			/CHANGE TO CURRENT FIELD
	TAD	ASD2
	6202			/CIF FIELD 0
	GETDDB			/GET A BLOCK FROM THE FREE LIST AND LINK IT INTO DEVTBL
	JMP I	LGI201		/NO BLOCK.. REDO IN CASE OF USER OTHERWISE ERROR RETURN FOR SI
	DATFLD
	TAD I	ASD2			/PICK DDB ADDRESS FROM DEVTBL
	DCA	CFH		/SAVE IT
	TAD	FIOSTK+1
	AND	P0037		/CLEAR BIT 0
	DCA I	CFH		/SET TO REFLECT THE DEVICE NUMBER
	ISZ	CFH
	TAD	FIJOB
	DCA I	CFH		/PLUG IN THE JOB NUMBER
ASD7,	CFLD
	JMP I	FIEXIT

/COMES HERE IF ONE JOB ATTEMPTS TO ASSIGN AN ALREADY ASSIGNED DEVICE
ASD11,	IAC
	DCA	CFH
	TAD I	CFH
	SNA
	CMA
	DCA	FIUSAC		/DELIVER TO USER'S AC
	JMP	ASD7		/EXIT

ASD4,	TAD	FIOSTK+1
	CLL RAL
	SZA CLA			/PTR?
	JMP	ASD7		/NO
	TAD I	ASD2
	CIF 00
	JMS I	ASDCLR		/CLEAR THE READER BUFFER
	JMP	ASD7
ASDCLR,	SICLR
/ROUTINE TO PERFORM ACTUAL REDUCTION

/CALLING SEQUENCE:
/	TAD (NUMBER OF SEGMENTS TO REMAIN)
/	JMS RED30
/	RETRIEVAL CHAIN POINTER
/	UFD RETRIEVAL POINTER
/	RETURN


/FIRST TRACE THRU THE LINKED LIST OF FILE INFORMATION
/RETRIEVAL BBLOCKS UNTIL WE GET TO THE ONE IN WHICH THE
/NEW LAST SEGMENT IS
RED30,	0
	DCA	RED31		/LINKAGE TO RETRIEVAL CHAIN
	TAD	GDRETP		/PICK UP RETRIEVAL POINTER
	JMS I	GE01		/GET THIS WORD INTO CORE
RED31,	0
	DCA	REBUFF
	TAD I	REBUFF		/PICK UP LINK TO NEXT
	DCA	RED31		/SAVE LINK
	TAD	WNDREM		/DELETING ENTIRE WINDOW?
	SNA CLA
	JMP	RED36		/YES, REMOVE LINK TO LAST WINDOW AS WELL
RED37,	ISZ	REWNDC		/AT END OF CHAIN?
	JMP	RED30+2		/NO, KEEP SAVING
	DCA I	REBUFF		/YES, TERMINATE IT
/FOUND RETRIEVAL BLOCK IN WHICH TO CHOP OFF
/THE LIST OF SEGMENTS.
/START DELETING THE SEGMENT NUMBERS AND RETURNING
/THE ACTUAL DISC SEGMENTS TO THE POOL
	TAD	WNDREM
	IAC			/GET POINTER TO FIRST SEGMENT TO BE DELETED
	TAD	REBUFF
	DCA	REBUFF		/POINTER TO FIRST SEGMENT TO REMOVE
	DCA	SEGLIM		/CLEAR SEGMENT COUNTER
	TAD	WNDREM		/NUMBER OF SEGMENTS TO LEAVE IN RET. WINDOW
RED32,	TAD	C7771		/7 SEGMENTS PER RETRIEVAL WINDOW
	DCA	REWNDC		/SAVE COUNT
	DCA	BUFMOD		/REMEMBER TO WRITE OUT THE BUFFER
RED33,	TAD	REDM9
	DCA	CFH		/SET COUNT FOR SATREL DIVIDE
	STL STA
	TAD I	REBUFF		/PICK UP THE SEGMENT NUMBER
	SZL			/IS IT A REAL SEGMENT
	JMP	RED38		/NO; END OF WINDOW, END OF FILE
	JMS I	SATREA		/RELEASE IT ON SAT
	DCA I	REBUFF		/CLEAR THE CCELL
	ISZ	SEGLIM		/COUNT SEGMENT
	ISZ	REBUFF
	ISZ	REWNDC		/END OF CURRENT RETRIEVAL WINDOW?
	JMP	RED33		/NO, CONTINUE
	TAD	RED31		/YES, MOVE TO NEXT
	SNA			/END OF CHAIN?
	JMP	RED39		/YES, EXIT
RED34,	DCA	RED35		/NO
	TAD	GDRETP
	JMS I	GE01		/GET NEXT WINDOW
RED35,	0
	DCA	REBUFF
	TAD I	REBUFF
	DCA	RED31		/SET UP LINK TO NEXT
	DCA I	REBUFF		/CLEAR FIRST WORD OF WINDOW
	ISZ	REBUFF
	JMP	RED32		/KEEP WIPING OUT

RED36,	STL CLA RTL		/ARE WE TWO WINDOWS FROM THE END YET?
	TAD	REWNDC
	SZA CLA
	JMP	RED37		/NOT EXACTLY
	DCA I	REBUFF		/YES, CLEAR LINK TO NOW EMPTY WINDOW
	DCA	BUFMOD		/SCHEDULE WRITE
	JMP	RED37

RED38,	CLA
	DCA I	REBUFF		/CLEAR TO END OF WINDOW
	ISZ	REBUFF
	ISZ	REWNDC		/ARE WE THERE YET?
	JMP	RED38		/NO
RED39,	TAD	GDRETP		/GET RETRIEVAL POINTER
	JMS I	ENS32		/CONVERT IT INTO A RELATIVE ENTRY NUMBER
	STL RTL			/TIMES 4 PLUS 2
	IAC
	TAD	UFDTBL		/POINTS TO WORD3 OF UFDTBL ENTRY
	DCA	REBUFF
	TAD I	REBUFF		/HAS HIS/HER SEGMENT COUNT BEEN SET UP YET?
	SNA CLA
	JMP I	RED30		/NO; SO JUST EXIT
	TAD	SEGLIM		/NUMBER OF SEGMENTS WE REMOVED FROM THIS FILE
	CIA
	TAD I	REBUFF		/SUBTRACT FROM THOSE THAT WE KNEW ABOUT
	DCA I	REBUFF		/UPDATE UFDTBL ENTRY
	STA
	DCA	TABSTA		/REMEMBER TO WRITE OUT THE TABLES
	JMP I	RED30		/EXIT

ENS32,	ENS3
REDM9,	-11
SATREA,	SATREL
REBUFF,	0
*4000
/RENAME ROUTINE

REN0,	JMS I	ACC01		/IS IT ACCOUNT 1?
	JMP	PASSQU		/YES; GO CHANGE PASSWORD AND DISK QUOTA
	JMS I	IFN01
	TAD	FIOSTK+1	/PICK UP INTERNAL FILE NUMBER
	JMS I	UC01		/USER-OWNER CHECK
	JMP I	REN1A		/USER NOT OWNER, ERROR
	JMS I	FILNAM		/CHECK IF THIS NEW NAME IS IN DIRECTORY
	JMP I	BADNAM		/YES, DON'T RENAME
	TAD	FIOSTK		/PICK UP INTERNAL FILE NUMBER NOW SHIFTED TO FIOSTK
	JMS I	GD01		/GET THIS DIRECTORY ENTRY INTO CORE
	DCA	REENTP		/POINTER TO DIRECTORY ENTRY
	TAD	REENTP
	TAD	P0004
	DCA	REPRTP		/POINTER TO PROTECTION BITS
	TAD I	REPRTP		/PICK UP PROTECTION BITS
	AND	C0020		/WRITE PROTECTED AGAINST OWNER?
	SZA
	JMP I	REN1A		/YES, ERROR
	TAD	FIOSTK+2	/TRANSFER NEW NAME TO DIRECTORY
	SNA			/IS IT A NULL NAME?
	JMP I	BADNAM		/YES, DON'T RENAME
	DCA I	REENTP
	ISZ	REENTP
	TAD	FIOSTK+3
	DCA I	REENTP
	ISZ	REENTP
	TAD	FIOSTK+4
	DCA I	REENTP
	DCA	BUFMOD		/SCHEDULE WRITE
	JMP I	FIEXIT		/EXIT FROM FILE PHANTOM
REN1A,	REN1
FILNAM,	USENAM
BADNAM,	CRF30
SEGS0,	TAD I	SEGCNT
	DCA	FIUSAC
	JMP I	FIEXIT
SEGCNT,	-SATSIZ+1
SIFLD,	CORTBL+1

PASSQU,	CDF 00
	TAD I	SIFLD		/IS THIS REQUEST FROM SI?
	AND	C0200
	CFLD
	SZA
	JMP I	REN1A
	TAD	FIOSTK+1	/OR IS [S]HE TRYING ACCOUNT 0?
	SNA
	JMP I	BADNAM		/YES; ERROR
	JMP I	.+1
	PASQU0
/BUILD A RETRIEVAL POINTER GIVEN RELATIVE POSITION ON RETTBL

/CALLING SEQUENCE:
/	TAD (RELATIVE POSITION)
/	JMS BLDP
/	RETURN (POINTER IN AC)

REENTP,
BLDP,	0
	DCA	CFH
	CLA CMA
	TAD	CFH
	CLL RAL
	RTL
	TAD	RETTBL
	JMP I	BLDP
/JMS I LINK01
/MISSING SEGMENT ADD
/REPLACEMENT

LINK0,	0
	DCA	LINK1
	TAD	GDRETP
	JMS I	GE01
LINK1,	0			/GET A DIRECTORY WORD INTO CORE
	TAD	P0003
	DCA	LINK2
	TAD I	LINK2
	CIA
	TAD I	LINK0
	SZA CLA			/SEARCH THROUGH UFD UNTIL WE FIND ENTRY BEING SOUGHT
	JMP	LINK3
	ISZ	LINK0
	TAD I	LINK0		/TAKE A BLOCK OUT OF THE CHAIN
	DCA I	LINK2
	DCA	BUFMOD		/SCHEDULE WRITE
	ISZ	LINK0
	JMP I	LINK0

REPRTP,
LINK2,	0

LINK3,	TAD I	LINK2
	JMP	LINK0+1
/ROUTINE TO SET UP A UFDTBL ENTRY AS FOLLOWS:
/WORD 0:	PROJECT, PROGRAMMER NUMBER
/WORD 1:	-ACCESS COUNT
/WORD 2:	-DISK SEGMENT QUOTA (LOGIN)
/WORD 3:	ACTUAL NUMBER OF SEGMENTS OWNED.
/(WORDS 1 AND 3 ARE INITIALLY SET TO 0.)
/WORD 3 IS LOADED BY "CREATE," OR BY "EXTEND" IF IT HAS NOT PREVIOUSLY
/BEEN LOADED. "CREATE" & "EXTEND" ALWAYS MODIFY WORD 3, "REDUCE" ONLY
/MODIFIES WORD 3 IF IT IS NON-ZERO.

UFQUOT,	0
	DCA I	INDEX		/SAVE PROJECT, PROGRAMMER NUMBER
	DCA I	INDEX		/ZERO ACCESSES SO FAR
	TAD	SEGLIM		/LOGGED IN QUOTA
	CLL RAL			/TIMES 2
	TAD	SEGLIM		/THREE
	RAL			/SIX
	RTL			/TWENTY FOUR
	TAD	SEGLIM		/TWENTY FIVE
	CIA			/NEGATE
	DCA I	INDEX		/SAVE LOGGED-IN SEGMENT QUOTA
	DCA I	INDEX		/NO KNOWN SEGMENTS AS OF YET
	JMP I	UFQUOT
/ROUTINE TO GET THE NUMBER OF A DEVICE ATTACHED TO THIS JOB

/CALLING SEQUENCE:
/	JMS LNS0
/	RETURN IF NONE AVAILABLE
/	NORMAL RETURN (DEVICE NUMBER IN AC)

LNS0,	0
	TAD	DEVTBA		/GLOBAL TO #DEVTBL#
	DCA	CFH
	DATFLD			/CDF FIELD 0
LNS4,	TAD I	CFH		/PICK UP POINTER TO DDB
	SNA
	JMP	LNS2		/DEVICE UNASSIGNED
	IAC
	DCA	LNS3		/POINTER TO SECOOND WORD OF DDB
	TAD I	LNS3
	AND	P0037		/PICK OFF THE JOB NUMBER OF OWNER
	CIA
	TAD	FIJOB		/NUMBER OF CURRENT JOB
	SNA CLA
	JMP	LNS5		/THIS DEVICE IS OURS
LNS2,	ISZ	CFH
	TAD	CFH
	CMA
	TAD	DEVOVR		/GLOBAL TO "JOBTBL"
	SZA CLA
	JMP	LNS4		/CONTINUE LOOKING DOWN TABLE
LNS7,	CFLD			/MAKE SURE WE ARE IN THIS FIELD
	JMP I	LNS0		/FOUND NOW DEVICES

LNS5,	TAD	DEVEND
	CIA
	TAD	CFH
	ISZ	LNS0
	SMA
	JMP	LNS6
	TAD	LNS10
	CLL RAR
	JMP	LNS7

LNS6,	TAD	C4000
	JMP	LNS7

LNS10,	DEVTBE-DEVTBL
LNS3,	0
C4000,	4000
/ROUTINE TO RELEASE A DEVICE

*4200

REL00,	0
	JMS I	DTE01		/IS THIS DEVICE ASSIGNED TO THIS USER?
REL5,	0			/SET BY DTE0 TO POINT TO DEVTBL ENTRY FOR THIS DEVICE
	JMP	REL13		/NO, SO DON'T RELEASE IT
	TAD I	REL5
	DCA	REL6		/SAVE ADDRESS OF DDB FOR LATER
	TAD	REL6
	TAD	P0003		/POSITION OF TIME IN DDB
	DCA	REL2
	TAD I	REL2		/GET TIME ASSIGNED
	CIA
	DCA	REL2		/-TIME ASSIGNED
	CDF
	TAD I	RELCK1		/GET TIME NOW
	RTL
	RTL
	AND	P0007		/JUST SIGNIFICANT PART OF LOW ORDER TIME
	DCA	REL3
	TAD I	RELCK2
	DATFLD
	RTL
	RAL
	AND	P7770		/JUST INSIGNIFICANT PART OF HI ORDER
	TAD	REL3		/TIME AT RELEASE
	CLL
	TAD	REL2		/-TIME AT ASSIGNMENT
	DCA	REL2		/TIME WE OWNED IT
	TAD	REL2
	SNL			/GONE THRU MIDNITE WHILE ASSIGNED?
	TAD	RELCON		/YES, FUDGE TO PROPER VALUE
	SZA
	JMS I	DVT01		/RECORD TIME SINCE WE USED A MEASURABLE AMOUNT
	STL
	TAD	REL5
	TAD	RELCDR		/IS IT A CARD READER OR DECTAPE OR RK05?
	SPA
	RAR			/NO - IS IT A KEYBOARD OR THE PTR?
	SNL
	JMP	REL11		/EITHER KEYBOARD, PTR, CDR, DTA, OR RK05
	TAD	RELREG		/EITHER PTP OR LPT
REL8,	DCA	REL6		/ENTER HERE FROM REL12 FOR TELEPRINTER
	STA
	TAD I	REL5
	DCA	INDEX		/POINT TO WORD 0 OF DDB (AUTOINDEXED)
	TAD I	INDEX		/CHECK STATUS IF TELEPRINTER
	SPA CLA
	JMP	REL4		/[S]HE'S IN THE ^S CONDITION - FLUSH HIM/HER OUT
	DCA I	INDEX		/CLEAR THE JOB NUMBER
	ISZ	INDEX
	ISZ	INDEX
	TAD I	INDEX		/CHECK FILL POINTER
	SZA CLA
	JMP	REL9		/STILL BUSY - LET "CONOUT" RELEASE IT
	TAD	REL6
	SZA CLA			/ASSIGNABLE DEVICE?
	JMP	REL7		/YES
REL4,	TAD I	REL5
	CIF 00
	JMS I	RELTBL		/MAKE SURE THE BUFFER IS CLEAR
	DATFLD
	TAD I	REL5		/RELEASE THE DDB
	JMS I	RETBK1
	CLA
	DATFLD
	DCA I	REL5
REL9,	CFLD
	JMP I	REL00
REL7,	CIF 20			/INHIBIT INTERRUPTS
	TAD I	REL6
	CLL RAL
	SNA
	JMP	REL4
	SPA
	STL
	RAR
	DCA I	REL6
	JMP	REL9
REL11,	SMA CLA			/IS IT A KEYBOARD OR THE PTR?
	JMP	REL12		/NO
	TAD	REL6
	CIF 00
	JMS I	RELTBL		/FLUSH OUT THE BUFFER
REL12,	TAD	REL6
	JMS I	RETBK1		/RELEASE THE DDB
	CLA
	DATFLD
	DCA I	REL5		/REMOVE FROM DEVTBL
	TAD	DEVEND
	CIA
	TAD	REL5
	SMA CLA
	JMP	REL9
	ISZ	REL5
	JMP	REL8

REL13,	CDF
	TAD I	JOB
	AND	C0200
	CFLD
	SZA CLA			/CALLED BY SI??
	JMP I	LGI201		/YES, INDICATE ERROR WITH AC=-1
	JMP I	REL00		/NO, UUO CALL
RELREG,	OUTREG+NULINE+3
RELCDR,	-DEVTBE-4
DVT01,	DVT0
REL2,	0
REL3,	0
RELCK1,	CLK1
RELCK2,	CLK2
RELCON,	3227			/FUDGE FOR MIDNIGHT OVERFLOW
RELTBL,	SICLR
P0100,	100
FIXSCH,	0
	IAC
	DCA	REL5
	TAD I	REL5
	AND	P0100
	SNA CLA
	JMP I	FIXSCH
	TAD	DEVOVR
	CIA
	TAD	INDEX
FIXOUT,	CIF CDF
	DCA I	FIPJOB
	WAIT
EXCEED,	215;212;"[;" ;" ;" ;" ;" ;" ;" ;"E;"X;"C;"E;"E;"D;"I;"N;"G
	" ;"D;"I;"S;"K;" ;"Q;"U;"O;"T;"A;"];215;212;0
/COMPLETION OF LOGOUT ROUTINE
/REMOVES JOB FROM PERMANENT MONITOR TABLES
/MUST BE DONE LAST, SINCE WE NEED THE JOB STATUS BLOCKS
/TO INDICATE ANY ERRORS IN THE FIP I/O

LGO4,	TAD	LGO500		/RESTORE THE FIP EXIT
	CFLD
	DCA I	LGOFIX
	TAD	FIJOB		/SEE IF [S]HE OWNS ANY CORE FIELDS
	CIF
	CORE			/SEARCH CORE TABLE FOR HIM/HER
	FIP SI CJOB
	JMP	LGO5		/NO; NOTHING TO RELEASE
	AND	P0007		/YES; RELEASE THE FIELD
	TAD	CORTBA
	DCA	CFW		/POINTS TO ENTRY IN CORTBL
	CDF
	DCA I	CFH		/ZERO THE ENTRY
LGO5,	TAD	FIJOB		/RETURN STATUS BLOCKS
	TAD	DEVOVR		/START OF JOB TABLE (END OF DEVTBL)
	DCA	LGO6		/POINTS TO JOB TABLE ENTRY
	DATFLD
	TAD I	LGO6		/GET ADDRESS OF JOB STATUS
	JMS I	LGOBLS		/RETURN STATUS
	DATFLD
	DCA I	JOBDAT		/CLEAR JOBDAT
	DCA I	LGO6		/CLEAR POINTER IN JOBTABLE
	CDF
	DCA I	JOB		/CLEAR JOB (SO SAVJOB WON'T SAVE US)
	JMP I	.+1		/AND NOW GO DO FIX50
LGO500,	FIX50
LGOBLS,	RETBLS
LGOFIX,	FIX500
LGO1,	TAD	FIOSTK+1	/LOGOUT WITH AC=0?
	SZA CLA
	JMP I	LGI201		/NO, SO IT'S AN ERROR
	TAD	FIJOB
	TAD	JOBTAB
	DCA	CFH		/GET HIS/HER PROJ-PROG #
	TAD I	CFH
	CIA
	DCA	FIOSTK+2	/SAVE HIS/HER #
	TAD	JOBTAB
	DCA	INDEX		/INITIALIZE TO START OF TABLES
	TAD	LGOMAX		/-JOBMAX
	DCA	FIOSTK+3	/COUNT OF JOBS TO CHECK
	DCA	FIOSTK+4	/COUNT OF MATCHES
	TAD I	INDEX
	TAD	FIOSTK+2	/COMPARE
	SNA CLA
	ISZ	FIOSTK+4	/EXACT MATCH - INDEX COUNT
	ISZ	FIOSTK+3	/DONE?
	JMP	.-5		/NO
	STA			/YES - RETURN # OF MATCHES -1
	TAD	FIOSTK+4
	DCA	FIUSAC
	JMP I	FIEXIT		/AND AWAY

LGOMAX,	-JOBMAX
OPN11,	0
	DCA	OPN13
	TAD	FIOSTK+2	/GET RETRIEVAL POINTER OF UFD BEING ACCESSED
	CIA
	TAD	RETTBL		/IS IT THE MFD?
	SNA CLA
	JMP	OPN14		/MFD OR UFD, READ OK/WRITE NEVER OK
	JMS I	ACC01		/IS [S]HE THE SYSTEM MANAGER?
	JMP	OPN12		/YES; SKIP PROTECTION CHECK
	TAD I	OPN11		/GET PROPER TEST BITS
	AND	P0007		/JUST TEST FOR READ PROTECTION FIRST
	AND I	OPN13		/COMPARE AGAINST FILE'S PROTECTION WORD
	SZA CLA
	JMP I	OPNPRA		/PROTECTION ERROR
	TAD I	OPN11		/READ OK, GET TEST BITS FOR WRITE
	CLL RAL			/CHECK FOR WRITE PROTECTION
	AND I	OPN13
OPN12,	CMA
	DCA	LGO6		/-1 IF OK TO WRITE
	TAD I	ZDS1		/SOME MORE CONDITIONS TO TEST
	DCA	OPN13
	TAD	FIOSTK+2
	JMS I	OPN16		/IS [S]HE THE ONLY PERSON TO OPEN THE FILE?
OPN13,	0
	JMP	OPN14		/NO
	TAD	BASSWT
	CIA
	DATFLD
	SZA
	DCA I	BASWIN		/MAKE SURE THE BASIC WINDOW GETS LOADED
	CFLD
	ISZ	LGO6		/IS [S]HE ALLOWED TO MODIFY IT?
OPN14,	TAD	P0004		/NO, SO WRITE PROTECT BIT IS ON
	ISZ	OPN11		/SKIP ON RETURN
	JMP I	OPN11
OPN16,	ENS0
OPNPRA,	OPNPRE


LGO6,
FIX40,	0
	DCA	FLPARB+3
	TAD	FLPARB+3
	DCA	FLPARB+5
	CLA CMA
	TAD	FLPARB+5
	DCA	FLPARB+4
	JMP I	FIX40
*4600
TTYTBA,	TTYTBL
CLK1A,	CLK1
CLK2A,	CLK2
RESET,	DCA I	CFH
	FGETJT
	JOBACC
	DCA	ADDR
	DATFLD
	TAD	FIOSTK+2
	DCA I	ADDR		/PLUG HIS/HER ACCOUNT # INTO HIS JOB STATUS BLOCKS
	TAD	FIJOB		/GET JOB #
	TAD	TTYTBA
	DCA	ADDR
	TAD I	ADDR		/GET LINE #
	CLL RAL
	TAD	DEVTBA		/FIND THE DDB
	DCA	ADDR
	TAD	P0003
	TAD I	ADDR
	DCA	ADDR
	CDF
	TAD I	CLK1A
	RTL
	RTL
	AND	P0007
	DCA	CFH
	TAD I	CLK2A
	RTL
	RAL
	AND	P7770
	TAD	CFH
	DATFLD			/NOW RESET THE
	DCA I	ADDR		/ASSIGN TIME
	JMP I	.+1		/THEN EXIT
	TABOUT
BASCO0,	0
	JMS I	IFN01		/JUST RETURN INTERNAL FILE # IN FIOSTK+1
	TAD	FIOSTK+1
	JMS I	CL01		/CLOSE ANY FILE THAT IS OPEN
	TAD	FIOSTK+3	/MAY BE
	SNA			/IS IT A NULL FILE NAME?
	JMP I	OPN3A		/YES, ERROR RETURN
	TAD	OPN3A+1		/COMPARE BA
	SZA CLA
	JMP	BASSET		/NO MATCH
	TAD	FIOSTK+2	/IS ACCT # 2?
	SNA
	JMS I	JBLD0		/WHAT'S HIS/HER ACCOUNT?
	CLL RTR
	SNA CLA
	TAD	FIOSTK+4	/COMPARE SI
	TAD	OPN3A+2
	SNA CLA
	TAD	FIOSTK+5
	TAD	OPN3A+3		/COMPARE C
	SNA CLA
	CMA			/IF BASIC, BASSWT=-1
BASSET,	DCA	BASSWT		/IF NOT, BASSWT=0
	TAD	FIOSTK+1
	JMS I	EBLD0		/GET PTR TO ENTTBL WORD 1 RELATIVE PTR WORD 2 ADDRESS IN UFD
	JMP I	BASCO0		/RETURN
OPN3A,	OPN3
	-4241		/-BA
	-6351		/-SI
	-4300		/-C 

CLOBAS,	0
	JMS I	RETBK1
	DCA	BAS3
	TAD	BAS3
	CIA
	TAD	BASWIN
	SNA CLA
	JMP	CLOBA1
	TAD	BAS3
	JMS I	RETBK1
	CLA SKP
CLOBA1,	CLA CMA
	JMP I	CLOBAS
BAS0,	0
	DCA	BAS1		/SAVE BUFFER ADDRESS OF RETRIEVAL WINDOW
	TAD	BASWIN		/BASIC WINDOW ADDRESS
	DCA	ADDR		/GET BUFFER ADDRESS READY
BAS5,	TAD	BAS1		/
	DCA	BAS2
	TAD	C7771
	DCA	BAS3		/COUNT OF 7 SEGS PER WINDOW
BAS4,	ISZ	BAS2
	CFLD
	TAD I	BAS2		/PICK UP THE SEG #
	ISZ	ADDR
	SNA
	JMP	BAS6
	DATFLD
	DCA I	ADDR		/SAVE IT IN WINDOW
	ISZ	BAS3		/COUNT
	JMP	BAS4		/STILL IN SAME BLOCK
	CFLD
	TAD I	BAS1		/CHANGE THE BLOCK
	SNA
	JMP	BAS6		/NO MORE SEGMENTS
	DCA	BAS1
	TAD	FIOSTK+2	/GET THIS BLOCK OF UFD IN BUFFER
	JMS I	GE01
BAS1,	0
	DCA	BAS1		/SAVE THE BUFFER ADDRESS CONTAINING THE NEEDED BLOCK
	JMP	BAS5		/CONTINUE
BAS6,	SNA
	TAD I	BAS1
	SZA CLA
	JMP I	BAS123		/BASIC MUST BE 39 SEGMENTS OR LESS TO USE SPECIAL WINDOW
	TAD	ADDR
	SMA CLA
	JMP	.+5
	DATFLD
	DCA I	ADDR
	ISZ	ADDR
	JMP	.-2
	DATFLD
	CLA CMA
	DCA I	BASWIN		/-1 IN FIRST WORD TO MARK BASIC WINDOW
	JMP I	BAS0
ADDR,	0
BAS2,	0
BAS3,	0
BAS123,	OPN123
/ROUTINE TO LET SYSTEM MANAGER CHANGE PASSWORDS AND DISK QUOTAS

UFDNAM,	RTABLE
	0

PASQU0,	DCA	UFDNAM+1	/SAVE ACCOUNT NUMBER TO SEARCH FOR
	CMA
	JMS I	DS01		/SEARCH MFD FOR THIS ACCOUNT
	UFDNAM
	JMP	PASNOT		/ACCOUNT NOT FOUND IN MFD
	DCA	INDEX		/SAVE POINTER TO OLD PASSWORD
	TAD	FIOSTK+2	/FIRST TWO CHARACTERS OF NEW PASSWORD
	DCA I	INDEX		/SAVE IN MFD NAME BLOCK
	TAD	FIOSTK+3	/SECOND TWO CHARACTERS OF NEW PASSWORD
	DCA I	INDEX		/SAVE IN MFD
	ISZ	INDEX		/SKIP PAST LINK TO NEXT UFD
	TAD	FIOSTK+4	/GET NEW DISK QUOTA
	DCA I	INDEX		/SAVE NEW QUOTA
	DCA	BUFMOD		/REMEMBER TO WRITE OUT THE MFD SEGMENT
	TAD	FIOSTK+1	/SEE IF THIS ACCOUNT IS CURRENTLY IN THE UFDTBL
	JMS I	UTS01
	JMP I	FIEXIT		/NOT THERE
	ISZ	UTPRNU		/POINTS TO -QUOTA ENTRY
	STA
	TAD	FIOSTK+1	/IS IT THE QUOTA FOR THE "GRACE SPACE"?
	SNA CLA
	JMP	PASQU1		/YES
	TAD	FIOSTK+4	/TRIM OFF THE LOGOUT PORTION OF THE QUOTA
	AND	P0077
	DCA	FIOSTK+4
	TAD	FIOSTK+4
	CLL RAL			/MULTIPLY BY TWO
	TAD	FIOSTK+4	/THREE
	RAL			/SIX
	RTL			/TWENTY FOUR
PASQU1,	TAD	FIOSTK+4	/TWENTY FIVE; OR ACTUAL COUNT IF FOR "GRACE SPACE"
	CIA			/NEGATE THE RESULT
	DCA I	UTPRNU		/SAVE AWAY IN THE UFDTBL
	JMP I	.+1
	TABOUT

PASNOT,	TAD	P7000		/RETURN FILE NOT FOUND
	DCA	FIUSAC
	JMP I	FIEXIT
/SUBROUTINE TO FIND AN EMPTY DIRECTORY ENTRY

/CALLING SEQUENCE:
/	TAD (POINTER TO UFD RETRIEVAL INFORMATION)
/	JMS DE0
/	BAD RETURN (COULD NOT FIND A FREE ENTRY)
/	NORMAL RETURN (POINTER TO ENTRY IN AC)

DE0,	0
	DCA	DERETP		/SAVE RETRIEVAL PTR
	DCA	DE2		/ZERO THE ADDRESS IN UFD
	TAD	BUFSTA		/IS THERE A SEGMENT IN THE BUFFER?
	SMA CLA
	JMP	DE7		/NO, SO START FROM THE BEGINNING
	TAD I	GERETA		/GET THE SEGMENT IN CORE
	CMA
	DCA	NSEGCR
	TAD	DERETP		/GET RETRIEVAL PTR FOR INCREMENT
	DCA	UFDPTR
DE5,	TAD I	UFDPTR
	SNA			/IS THERE A SEGMENT?
	JMP	DE7		/NO, START FROM 0 LOC IN UFD
	TAD	NSEGCR		/YES, DOES IT AGREE WITH THE SEGMENT IN CORE?
	SNA CLA
	JMP	DE6		/YES, START SEARCHING AT THIS POINT
	TAD	DE2		/NO, INCREMENT THE ADDR
	TAD	C0400
	DCA	DE2
	ISZ	UFDPTR		/POINT TO NEXT SEGMENT IN RETRIEVAL BLOCK
	JMP	DE5		/GO BACK
DE7,	DCA	DE2		/INDICATE THAT SEARCH IS FROM WORD 0
	STA
DE6,	DCA I	UFD01		/SAVE SECOND PASS FLAG
DE1,	TAD	DERETP
	JMS I	GE01		/GET ENTRY INTO CORE
DE2,	0
	SNA			/SKIP IF ENTRY EXISTS
	JMP	DE4		/DID NOT EXIST, EXTEND UFD
	DCA	DEBUFP
	TAD I	DEBUFP		/FIRST WORD OF ENTRY
	SZA CLA
	JMP	DE3		/NOT EMPTY, LOOK AT NEXT ENTRY
	ISZ	DEBUFP		/ZERO COULD MEAN END OF STRING OF RETRIEVAL INFORMATION BLOCKS
	TAD I	DEBUFP		/LOOK AT SECOND WORD OF ENTRY
	SZA CLA			/IF ZERO, EMPTY ENTRY
	JMP	DE3		/NOT EMPTY, KEEP LOOKING
	TAD	DE2		/PICK UP ENTRY POINTER
	SNA			/ENTRY 0 NEVER AVAILABLE
	JMP	DE3
	ISZ	DE0		/POINT TO NORMAL RETURN
	JMP I	DE0
DE3,	TAD	C0010		/INCREMENT TO NEXT ENTRY
	TAD	DE2
	DCA	DE2		/SAVE NEXT ENTRY INDEX
	JMP	DE1		/LOOK AT NEXT ONE

DE4,	ISZ I	UFD01		/HAVE WE TRIED FROM THE BEGINNING YET?
	JMP	DE7		/NO, WELL TRY IT THEN...
	TAD	DERETP
	JMS I	UFD01		/TRY EXTENDING THE UFD
	JMP I	DE0		/TOO BAD, CAN'T EXTEND UFD
	JMP	DE1		/NOW WE HAVE PLENTY OF ROOM
DEBUFP,	0
UFD01,	UFD0
DERETP,	0
UFDPTR,	0
GERETA,	RDCURR
NSEGCR,	0

/ROUTINE TO OUTPUT QUOTA EXCEEDED MESSAGE
EXTEL0,	0
	DATFLD
	TAD	FIJOB		/CURRENT JOB NUMBER
	TAD	TTYTAB		/POINTS AT POSITION IN TTYTBL
	DCA	DE0
	TAD I	DE0		/GET CONSOLE NUMBER FOR THIS JOB
	STL RAL			/TIMES 2 PLUS 1
	TAD	DEVTBA		/INDEX TO OUTPUT DDB
	CDF
	DCA I	CONDVA		/STORE FOR FIELD 0 PRINT ROUTINE
	CFLD
	TAD	EXTMES		/GET MESSAGE POINTER
	DCA	INDEX
EXTEL1,	TAD I	INDEX		/GET CHARACTER OF THE MESSAGE
	SNA			/ANY LEFT?
	JMP I	EXTEL0		/NO; SO GO EXTEND
	CIF CDF 00
	DCA I	FICHAR		/STORE FOR PRINT OUT ROUTINE
	CFLD
	PRINT			/SEND MESSAGE #[EXCEEDING DISK QUOTA]#
	JMP I	EXTEL0		/RAN OUT OF SPACE IN THE OUTPUT BUFFER (TOO BAD!)
	JMP	EXTEL1		/BACK FOR NEXT CHARACTER

TTYTAB,	TTYTBL
CONDVA,	CONDBA
EXTMES,	EXCEED-1
FICHAR,	TTCHAR
/ROUTINE TO CLEAR ALL CPU AND DEVICE TIME ACCUMULATORS IN THE MFD
/THIS IS USED BY THE #RESET# FUNCTION IN THE CUSP #CAT#
LGRES0,	CLA IAC			/SET RESET FLAG IN DIRECTORY SEARCH ROUTINE
	DCA I	RETBK1
	TAD	RETBK1
	DCA	EXQ1		/SET POINTER SO FLAG WILL CLEAR ON COMPLETION
	TAD	RETTBL
	DCA	GDRETP		/SET RETRIEVAL POINTER
	JMS	LOQUO		/GO DO THE RESET
	CMA			/SHOULD RETURN A ZERO IN AC
	JMP	EXTQU1

/ROUTINE TO COUNT TOTAL SEGMENTS OWNED BY A UFD AND
/SAVE THE RESULT IN WORD 3 OF THE UFDTBL ENTRY FOR THE RESPECTIVE UFD
/CALL:
/	EXQ1 POINTS TO WORD 3 OF CORRECT UFDTBL ENTRY
/	JMS	LOQUO
/	RETURN (ENTRY 3 LOADED, TOTAL ALSO IN AC)

EXQ3,
LOQUO,	0
	DCA	WNDREM		/FUDGE A FILE NAME BEGINNING WITH TWO SPACES
	JMS I	DS01		/SEARCH DIRECTORY TO DETERMINE SEGMENT COUNT
	GDRETP			/(HOPE NO ONE SCRAMBLES LOC. 23-26 ON PAGE 0!!)
	CLA SKP			/GOOD - COULDN'T FIND SUCH A FILE
	JMP I	DIRBAD		/FOUND IT! OOPS!
	TAD	SEGLIM		/GET THE TOTAL FROM THE DIRECTORY SEARCH
	DCA I	EXQ1		/SAVE IN UFDTBL
	TAD	FIOSTK+1	/INTERNAL FILE NUMBER?
	SMA			/IF THIS IS NOT A "RESET" WE MUST RELOAD
	JMS I	GD01		/THE CORRECT DIRECTORY SEGMENT
	DCA	REL6		/SAVE POINTER TO NAME BLOCK
	TAD	SEGLIM		/RETURN WITH CURRENT TOTAL
	JMP I	LOQUO


EXTQU8,	CLA			/WE'VE BEEN HERE BEFORE FOR THIS GUY
	CFLD
	TAD	EXQ2		/WILL THIS EXTEND CARRY
	TAD I	EXQ1		/THIS FILE ACROSS THE QUOTA BOUNDARY AGAIN?
	SMA SZA CLA		/(I.E. HAS [S]HE REDUCED SINCE LAST EXTEND?)
	JMP	EXTQU9		/NO; [S]HE'S STILL ABOVE QUOTA, EXTEND QUIETLY
EXTQU6,	TAD	EXFILE		/ADDRESS WITHIN MESSAGE TO STORE FILE NAME
	DCA	INDEX
	JMS	EXTNAM		/CHAR 1 & 2 OF FILE NAME
	JMS	EXTNAM		/CHAR 3 & 4 OF FILE NAME
	JMS	EXTNAM		/CHAR 5 & 6 OF FILE NAME
	JMS I	EXTELL		/NOTIFY USER THAT QUOTA IS BEING EXCEEDED
EXTQU9,	CLA
	JMP I	EXTQU0		/EXIT TO EXTEND FILE AS REQUESTED

EXTQU5,	TAD	FIOSTK+2	/NUMBER OF SEGMENTS [S]HE WON'T GET
EXTQU1,	DCA	FIUSAC		/PASS RESULT BACK TO THE USER
	JMP I	FIEXIT
/ROUTINE TO CHECK LOGIN QUOTA BEFORE EXTENDING A FILE

EXTQU0,	0
	TAD	GDRETP		/COMPARE RETRIEVAL POINTER
	CIA
	TAD	RETTBL		/AGAINST THE MFD'S ENTRY
	SNA CLA			/IS IT FROM THE SYSTEM MANAGER?
	JMP I	VIOLAT		/GET OUT QUICK, BEFORE [S]HE DESTROYS THE SYSTEM
	TAD	FIOSTK+2	/NUMBER OF SEGMENTS TO BE ADDED
	SPA			/IS [S]HE BEING REASONABLE?
	JMP	EXTQU1		/NO - [S]HE DESERVES TO FAIL!
	CLL CIA
	TAD I	SATSEG		/ARE THERE THAT MANY SEGMENTS LEFT ON THE SYSTEM?
	SNL CLA
	JMP	EXTQU5		/NO; SO DON'T GIVE ANY
	TAD	GDRETP		/RETRIEVAL POINTER
	JMS I	ENS33		/CONVERT TO RELATIVE ENTRY NUMBER
	STL RTL			/TIMES FOUR PLUS TWO
	TAD	UFDTBL		/POINTS AT -LOGIN QUOTA
	DCA	EXQ1		/SAVE POINTER
	TAD I	EXQ1		/GET NEGATIVE QUOTA
	DCA	EXQ2		/AND SAVE
	ISZ	EXQ1		/POINTS AT CURRENTLY OWNED COUNT
	TAD I	EXQ1		/GET HIS/HER PRESENT TOTAL
	SNA			/HAS THE COUNT BEEN SET UP YET?
	JMS	LOQUO		/NO; GO FIGURE IT OUT
	TAD	FIOSTK+2	/ADD THE NUMBER [S]HE WANTS
	TAD	EXQ2		/AND SUBTRACT FROM QUOTA
	SPA SNA			/WILL THIS EXCEED THE QUOTA FOR THIS ACCOUNT?
	JMP	EXTQU9		/NO; GO EXTEND
	TAD I	GRACE		/WILL IT GO BEYOND THE #GRACE SPACE#?
	SMA SZA CLA
	JMP	EXTQU5		/YES; DON'T BOTHER EXTENDING
	TAD	FIOSTK+1	/SEE IF THIS FILE IS ALREADY IN THE GRACE AREA
	JMS I	LNK01		/GET POINTER TO FILE CONTROL BLOCK
	TAD	FILPRP		/POINT TO STATUS WORD
	DCA	EXQ3
	DATFLD
	TAD I	EXQ3		/GET CURRENT STATUS FOR THIS FILE
	RAR
	SZL			/IS THIS FILE IN THE GRACE AREA?
	JMP	EXTQU8		/MAYBE; SEE IF [S]HE'S REENTERING
	STL RAL			/SET GRACE BIT
	DCA I	DXQ3
	CFLD
	JMP	EXTQU6		/SEND MESSAGE, THEN GO EXTEND
/ROUTINE TO PLANT FILE NAME INTO "EXCEEDING QUOTA" MESSAGE

EXTNAM,	0
	TAD I	REL6		/GET PART OF FILE NAME
	RTR
	RTR
	RTR
	AND	P0077		/SAVE LEFT BYTE
	TAD	P0240		/CONVERT TO ASCII
	DCA I	INDEX		/STORE IN THE MESSAGE AREA
	TAD I	REL6		/NOW FOR THE RIGHT BYTE
	AND	P0077
	TAD	P0240		/CONVERT TO ASCII
	DCA I	INDEX		/SAVE RIGHT BYTE
	ISZ	REL6		/POINT TO NEXT CHARACTER
	JMP I	EXTNAM

/ROUTINE TO CHECK FOR THE SAFE REDUCTION OF A UFD
/TWO CONDITIONS MUST BE MET:
/	THE ACCOUNT CANNOT BE IN USE TO ANYONE
/	THE ACCOUNT MUST HAVE AN EMPTY DIRECTORY

EXQ2,
REDUF0,	0
	TAD	GDRETP		/GET RETRIEVAL POINTER
	CIA
	TAD	RETTBL		/IS [S]HE TRYING TO REDUCE A UFD?
	SZA CLA
	JMP I	REDUF0		/NO; LET HIM/HER REDUCE NORMAL FILES
	TAD I	REL6		/GET THE ACCOUNT NUMBER OF THE UFD IN QUESTION
	JMS I	UTS01		/LOOK IT UP IN THE UFD TABLE
	JMP	REDUF1		/NOT THERE - GOOD
	CLA
	TAD	C4400		/TELL HIM "FILE IN USE"
	JMP	EXTQU1
REDUF1,	TAD I	REL6		/GET THE ACCOUNT NUMBER OF THE UFD TO BE DELETED
	JMS I	UFO01		/LOAD ITS RETRIEVAL WINDOW INTO RTABLE
	JMP	EXTQU5		/COULDN'T; PAS HIS/HER OWN AC BACK AS AN ERROR INDICATION
	JMS I	BLDP1		/MAKE A RETRIEVAL POINTER
	DCA	GDRETP		/SAVE IT FOR THE SEARCH
	ISZ	EXQ1		/POSITION UFDTBL POINTER FOR THIS ACCOUNT
	ISZ	EXQ1		/TO POINT TO THE SEGMENT ACCUMULATOR
	JMS	LOQUO		/SEE IF THIS UFD STILL CONTAINS FILES
	CLL STA RTL		/AC=-3
	TAD	EXQ1		/POSITION WE'VE BEEN ASSIGNED ON UFDTBL
	JMS I	TF01		/FREE THE POSITION
	TAD I	EXQ1		/DID [S]HE OWN ANY SEGMENTS?
	SZA CLA
	JMP I	VIOLAT		/STILL SOME FILES IN THERE!
	STA
	DCA	FIOSTK+2	/FORCE HIM/HER TO COMPLETELY DELETE THIS UFD
	JMP I	REDUF0

VIOLAT,	PRT1+1
ENS33,	ENS3
SATSEG,	-SATSIZ+1
EXFILE,	EXCEED+2
EXTELL,	EXTEL0
P0240,	240
GRACE,	UTABLE+2

$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$
