.TITLE *** RSX DISK FILES HANDLER. RESIDENT CODE
/
/ COPYRIGHT (C) 1975
/ DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/ THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY
/ ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH
/ THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS
/ SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO-
/ VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON
/ EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO
/ THESE LICENSE TERMS.  TITLE TO AND OWNERSHIP OF THE
/ SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC.
/
/ THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
/ WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM-
/ MITMENT BY DIGITAL EQUIPMENT CORPORATION.
/
/ DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY
/ OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY
/ DEC.
/
	.EJECT
/
/	EDIT	#75	26 JUN 75	C. PROTEAU
/					M. HEBENSTREIT
/	EDIT	#76	14 MAY 76	M. HEBENSTREIT (RF PLATTER IDX)
/
/
/ DEFINING %RF15 PRODUCES A VERSION FOR THE RF DISK.
/ DEFINING %RP02 PRODUCES A VERSION FOR THE RP02 DISK PACK.
/ DEFINING %RK05 PRODUCES A VERSION FOR THE RK05 CARTIDGE DISK.
/
	.IFUND %RF15
	.IFUND %RP02
	.IFUND %RK05
	.END    NO ASSEMBLY PARAMETERS SPECIFIED
	.ENDC
	.ENDC
	.ENDC
/
/ RSX PLUS FILE HANDLER FOR THE RP02, RK05, OR THE RF15. TWO
/ TYPES OF FILES ARE HANDLED: (1) SEQUENTIAL ACCESS FILES CONSISTING OF
/ NON-CONTIGUOUS DISK BLOCKS AND (2) RANDOM ACCESS FILES CONSISTING OF
/ CONTIGUOUS DISK STORAGE. BECAUSE I/O REQUESTS ARE PROCESSED ONE AT A
/ TIME BY THIS TASK, THE FUNCTIONS TO GET DATA FROM AND PUT DATA INTO
/ A RANDOM ACCESS FILE ARE HANDLED BY THE DISK I/O DRIVER TASK, WHICH
/ IS PART OF THE RESIDENT CODE WITH THE EXECUTIVE. ALSO, FOR SEQUENTIAL
/ FILES, THE I/O DRIVER PERFORMS THE ACTUAL DATA TRANSFERS (GET & PUT)
/ AND ALSO ALLOCATES AND DEALLOCATES DISK SPACE IN BLOCK INCREMENTS OF
/ 256 DECIMAL WORDS.
/
/ NOTE WELL -- RANDOM ACCESS FILES ARE OPENED AND CLOSED ONLY WHEN THEY
/ ARE TO BE RENAMED, NOT WHEN THEY ARE BEING ACCESSED. CONSEQUENTLY,
/ THERE IS NO PROTECTION AGAINST CONFLICT OF INTEREST WHEN TWO OR MORE
/ TASKS REFERENCE THE SAME RANDOM ACCESS FILE.
/
/ RECOGNIZED I/O FUNCTIONS:
/
/	16	CREATE (RANDOM ACCESS FILE)
/	17	ABORT
/	23	PREAL
/	26	INPUT (READ)
/	27	OUTPUT (WRITE)
/	32	SEEK (OPEN SEQUENTIAL FILE FOR INPUT)
/	33	ENTER (OPEN SEQUENTIAL FILE FOR OUTPUT)
/	34	CLOSE
/	35	DELETE
/	36	HINF
/	37	RENAME (OPEN FILE FOR RENAMING)
/	134	ERROR CLOSE
/	777	DISCONNECT AND EXIT
/
/ LEGAL I/O COMMAND SEQUENCES:
/
/	BRACKETED ITEMS [] INDICATE SEQUENCES THAT MAY BE REPEATED.
/
/	SEEK -- [READ] -- CLOSE
/
/	ENTER -- [WRITE] -- CLOSE
/
/	RENAME -- CLOSE
/
/	DELETE
/
/	ABORT, HINF, PREAL, OR CREATE (LEGAL ANYTIME)
/
/	DISCONNECT & EXIT
/
/ LEGAL DATA MODES FOR SEQUENTIAL FILE ACCESS:
/
/	0	IOPS BINARY
/	1	IMAGE BINARY
/	2	IOPS ASCII
/	3	IMAGE ASCII
/
/ LABELLING CONVENTION:
/
/	ALL ADDRESS TAGS DEFINED WITHIN THIS TASK
/	BEGIN WITH "RF".
/
/	COMMENT LINES WHERE ERRORS ARE DETECTED ARE
/	FORMATTED AS FOLLOWS:	/#/ COMMENT
/
/ RF15 DECDISK STATUS REGISTER BITS:
/
/	0	THE "INCLUSIVE OR" OF BITS 1 THRU 7 (THE ERROR FLAG)
/	1	HARDWARE ERROR
/	2	ADDRESS PARITY ERROR
/	3	MISSED TRANSFER
/	4	WRITE CHECK ERROR
/	5	DATA PARITY ERROR
/	6	WRITE LOCKOUT
/	7	NON-EXISTENT DISK
/	8	DATA CHANNEL TIMING ERROR
/	9	PROGRAMMING ERROR
/	10	DONE FLAG
/
	.EJECT
/ EVENT VARIABLES RETURNED:
/
/	+340002		VALUE SET BY THE HINF FUNCTION TO INDI-
/			CATE DEVICE CODE 2 AND DIRECTORY-ORIENTED
/			FILE INPUT AND OUTPUT.	(USED FOR THE RF DISK)
/
/	+340N03		IS THE HINF VALUE FOR THE RP02.
/	+340N24		IS THE HINF VALUE FOR THE RK05.
/			(N INDICATES THE UNIT NUMBER)
/
/
/	+1		NORMAL VALUE RETURNED FOR COMPLETION OF OPERATION.
/
/	-5		ILLEGAL HEADER WORD (THE DATA MODE IN THE
/			HEADER DOES NOT MATCH THE DATA MODE
/			ASSOCIATED WITH THE READ DIRECTIVE).
/			AN END-OF-FILE BLOCK IS AN EXCEPTION
/			SINCE THE MODE INDICATOR IS 5.
/
/	-6		UNIMPLEMENTED OR ILLEGAL CAL FUNCTION.
/			FUNCTION MIGHT BE LEGAL IN A DIFFERENT CONTEXT.
/
/	-7		ILLEGAL DATA MODE.
/
/	-10		SOME FILE STILL OPEN BY THIS TASK ON THIS LUN.
/
/	-11		FILE NOT OPEN.
/
/	-13		FILE NOT FOUND.
/
/	-15		MEDIUM FULL
/
/	-16		ILLEGAL INPUT BUFFER SIZE (SIZE MUST BE +3 OR LARGER)
/			OR ILLEGAL OUTPUT WORD-PAIR-COUNT.
/
/	-23		ILLEGAL INPUT WORD-PAIR-COUNT.
/
/	-25		BUFFER PREALLOCATION UNSUCCESSFUL -- NOT ENOUGH
/			ROOM IN THE PARTITION.
/
/	-30		I/O PARAMETER EXCEEDS THE PARTITION BOUNDS.
/
/	-33		UNINITIALIZED DIRECTORY OR DISMOUNTED UNIT
/
/	-50		RENAME ERROR -- FILE ALREADY EXISTS IN UFD
/
/	-51		ILLEGAL TO READ A TRUNCATED FILE
/
/	-52		INPUT FILE HAS NO END-OF-FILE RECORD.
/
/	-53		ILLEGAL (NULL) FILE NAME OR EXTENSION.
/
/	-54		THIS FILE ALREADY OPEN.
/
/	-55		THIS FILE ALREADY OPEN FOR MODIFICATION.
/
/	-56		NO I/O BUFFER AVAILABLE.
/
/	-57		SEQUENTIAL/RANDOM ACCESS FILE CONFLICT. "ENTER"
/			IS ILLEGAL IF THE FILE ALREADY EXISTS AS A
/			RANDOM ACCESS FILE. "CREATE" IS ILLEGAL IF THE
/			FILE ALREADY EXISTS AS A SEQUENTIAL ACCESS FILE.
/
/	-60		RANDOM ACCESS FILE EXISTS. SIZE DOESN'T MATCH
/			THE SIZE IN THE "CREATE" REQUEST.
/
/	-61		RANDOM ACCESS FILE EXISTS. ACCOUNTING INFORMA-
/			TION IN THE FILE DIRECTORY ENTRY DIFFERS FROM
/			THAT GIVEN IN THE "CREATE" REQUEST.
/
/	-62		RANDOM ACCESS FILE SIZE ERROR. SIZE REQUESTED
/			IS EITHER NEGATIVE OR GREATER THAN 777 OCTAL BLOCKS.
/
/	-203		CAL NOT ISSUED FROM TASK LEVEL.
/
/	-N		DISK ERROR (CODE = STATUS REGISTER CONTENTS)
/
/	-777		"POOL" EMPTY.
/
	.EJECT
/ NOTES ON ORGANIZATION AND OPERATION:
/
/ I/O REQUESTS ARE PROCESSED ONE AT A TIME; NO ATTEMPT IS MADE TO OVERLAP
/ I/O OPERATIONS. THIS DECISION WAS MADE IN ORDER TO REDUCE THE TIME IT
/ WOULD TAKE TO IMPLEMENT AND TEST THIS TASK AND TO ALLOW IT TO BE SEG-
/ MENTED INTO OVERLAYS, AS FOLLOWS:
/
/	.-------.-----------.
/	1	1	    1
/	1	1 OVERLAY 1 1
/	1	1	    1
/	1	.-----------.
/	1 RESI- 1	    1
/	1 DENT  1 OVERLAY 2 1
/	1	1	    1
/	1 CODE  .-----------.
/	1	1	    1
/	1	1 OVERLAY 3 1
/	1	1	    1
/	1	.-----------.
/	1	1	    1
/	1	1 OVERLAY 4 1
/	1	1	    1
/	1	.-----------.
/	1	1	    1
/	1	1 OVERLAY 5 1
/	1	1	    1
/	.-------.-----------.
/	(LOW CORE)	(HIGH CORE)
/
/ RESIDENT CODE:	TASK INITIALIZATION
/			I/O FUNCTION DISPATCH
/			HINF, PREAL AND EXIT
/			BLOCK ALLOCATE AND DEALLOCATE
/			I/O REQUEST COMPLETION
/
/ OVERLAY 1:		SEEK (OPEN SEQUENTIAL FILE FOR INPUT)
/			ENTER (OPEN SEQUENTIAL FILE FOR OUTPUT)
/			RENAME (OPEN FILE FOR RENAMING)
/
/ OVERLAY 2:		READ FROM SEQUENTIAL FILE
/			WRITE INTO SEQUENTIAL FILE
/
/ OVERLAY 3:		CLOSE FILE
/			ABORT TASK I/O
/
/ OVERLAY 4:		DELETE FILE
/
/ OVERLAY 5:		CREATE (RANDOM ACCESS FILE)
/
	.EJECT
/ EXTERNALLY DEFINED GLOBAL SYMBOLS.
/
	.GLOBL	RFOPEN,RFREAD,RFCLOS,RFDLET,RFCREA
/
/ INTERNALLY DEFINED GLOBAL SYMBOLS.
/
	.GLOBL	RFRQND,RFALUN,RFAL1B,RFSREV,RFGTBL,RFPTBL,RFBFAD,RFPDNA
	.GLOBL	RFFLBF,RFOPED,RFSTL,RFFCNT,RFCLFL,RFGPC1,RFCNVT,RFGPCT,RFLUNN
/
	.IFUND %RF15
	.GLOBL RFUNIT,RFCNTT,RFDNAT
	.ENDC
/
/ DEFINITION OF REGISTERS LOCATED WITHIN THE RSX EXECUTIVE.
/
R1=101				/GENERAL REGISTER #1.
R2=102				/GENERAL REGISTER #2.
R4=104				/GENERAL REGISTER #4.
NADD=107			/ENTRY POINT TO "ADD NODE TO DEQUE" SUBROUTINE.
NDEL=112			/ENTRY POINT TO "DELETE NODE FROM DEQUE"
				/SUBROUTINE.
SNAM=123			/ENTRY POINT TO "SEARCH
				/FOR NODE IN DEQUE UNDER
				/THIS NAME" SUBROUTINE.
SPRI=126			/ENTRY POINT TO "SEARCH DEQUE FOR PRIORITY
				/AND INSERT NODE" SUBROUTINE.
	.IFDEF %RF15
RFACTB=210			/LOCATION OF 3-WORD CONTROL TABLE USED
				/BY THIS HANDLER FOR ALLOCATING DISK
				/STOREAGE. STORAGE IS DEALLOCATED
				/WHENEVER THE MCR FUNCTION TASK ...SAV
				/IS REQUESTED.
				/WORD0=DESIRED STORAGE/STORAGE GRANTED.
				/WORD1=DISK PLATTER.
				/WORD2=DISK ADDRESS.
	.ENDC
	.IFDEF %RP02
RPACT0=364			/1ST WORD OF 1ST CTA FOR DISK PACK ALLOCATES
	.ENDC
	.IFDEF %RK05
RKACT0=414			/1ST WORD OF 1ST CTA FOR CARTIDGE DISK ALLOCATES
	.ENDC
POOL=240			/HEAD OF THE EMPTY NODES DEQUE.
STKL=242			/HEAD OF SYSTEM TASK LIST DEQUE.
PDVL=252			/HEAD OF THE PHYSICAL DEVICE LIST QUEUE.
DQRQ=337			/ENTRY POINT TO "DE-QUEUE REQUEST" SUBROUTINE.
IOCD=345			/ENTRY POINT TO "DECREMENT I/O PENDING
				/COUNT" SUBROUTINE.
PABF=350			/ENTRY POINT TO "PREALLOCATE BUFFER" SUBR.
DABF=356			/ENTRY POINT TO "DEALLOCATE BUFFER" SUBR.
	.IFUND %RF15
X10=10
	.ENDC
/
/ IOT AND PARAMETER DEFINITIONS.
/
.INH=705522			/INHIBIT INTERRUPTS.
.ENB=705521			/ENABLE INTERRUPTS.
IDX=ISZ				/IDX IS USED INSTEAD OF ISZ WHEN THE
				/INTENT IS TO ADD 1 TO A REGISTER BUT
				/NOT TO SKIP.
RFNFSD=22			/NUMBER OF FILE STATUS DESCRIPTORS.
	.IFUND %RF15
ECLA=641000			/CLEAR THE AC WITH AN EAE INSTUCTION
	.ENDC
	.TITLE *** USER FILE DIRECTORY (UFD)
/
/ DOS-15 EMPLOYS TWO TYPES OF FILE DIRECTORY. AT THE BASE OF THE SYSTEM
/ IS THE MASTER FILE DIRECTORY (MFD), WHICH IS A CATALOGUE OF THE NAMES
/ AND STARTING LOCATIONS OF ALL THE USER FILE DIRECTORIES (UFD). EACH
/ USER FILE DIRECTORY IS A LIST OF FILES. EACH FILE ENTRY CONSISTS OF
/ A FILE NAME AND RELEVANT INFORMATION ABOUT THE FILE, SUCH AS, ITS FIRST
/ DATA BLOCK NUMBER.
/
/ THE SIZE OF THE UFD IS UNLIMITED BECAUSE IT IS MADE UP OF LINKED
/ DISK BLOCKS.
/
/ EXAMPLE:      A 3-BLOCK UFD
/
/       1ST	2ND		3RD
/       UFD	UFD		UFD
/       BLOCK	BLOCK		BLOCK
/
/ XXXXXXXXX	XXXXXXXXX	XXXXXXXXX
/ X	  X	X	X	X	X
/ X	  X	X	X	X	X
/ X	  X	X	X	X	X
/ X	  X	X	X	X	X
/ X	  X	X	X	X	X
/ X	  X	X	X	X	X
/ X       X     X       X       X       X
/ X	  X	X	X	X	X
/ X	  X	X	X	X	X
/ X	  X	X	X	X	X
/ X	  X	X	X	X	X
/ XXXXXXXXX	XXXXXXXXX	XXXXXXXXX
/ X	  X     X       X       X       X
/ X NONE  X<--------O   X<----------O   X
/ X       X     X       X       X       X
/ XXXXXXXXX	XXXXXXXXX	XXXXXXXXX
/ X       X     X       X       X       X
/ X   O-------->X   O---------->X NONE  X
/ X       X     X       X       X       X
/ XXXXXXXXX	XXXXXXXXX	XXXXXXXXX
/
	.EJECT
/ THERE ARE TWO FILE ENTRY FORMATS -- ONE FOR SEQUENTIAL ACCESS FILES
/ AND ANOTHER FOR RANDOM ACCESS FILES -- DETERMINED BY THE STATE OF
/ BIT 0 IN ENTRY WORD 4.
/
/ THE FORMAT OF A SEQUENTIAL ACCESS FILE ENTRY IN THE UFD AS SHOWN BELOW
/ IS DERIVED FROM DOS-15.
/
/ UFD SEQUENTIAL ACCESS FILE ENTRY FORMAT (IN GENERAL):
/
/ WORD	CONTENTS	MEANING
/
/ 0	.SIXBT "FIL" FILE NAME (1ST HALF) OR 0 IF FILE ENTRY IS FREE.
/ 1	.SIXBT "NAM" FILE NAME (2ND HALF) OR 0 IF FILE ENTRY IS FREE.
/ 2	.SIXBT "EXT" FILE EXTENSION OR 0 IF FILE ENTRY IS FREE.
/ 3	T+FB		T (BIT 0) = 1 IF FILE IS TRUNCATED (SEE DEF. BELOW).
/			FB (BITS 1-17) = 1ST BLOCK NUMBER OF THE FILE.
/ 4	TYPE+NB		TYPE (BIT 0) = 0 = A SEQUENTIAL ACCESS FILE.
/			NB (BITS 2-17) = NUMBER OF DATA BLOCKS IN THE FILE.
/ 5	RB		FIRST BLOCK NUMBER OF THE RETRIEVAL INFORMATION
/
/ 6	PC+WD		PC (BITS 0-2) = FILE PROTECTION CODE.(SET TO 1 IN RSX)
/			WD = THE WORD WITHIN THE FINAL FILE DATA BLOCK
/				IN WHICH THE RIB STARTS (0 IF THE RIB
/				CANNOT FIT AND THEREFORE MUST START IN
/				A BLOCK ALL ITS OWN).
/ 7	DATE		DATE THE FILE WAS CREATED:       MM/DD/YY
/				(YY = 0 FOR 1970).
/
/	.
/	.
/	.
/
/ 376	PB		PREVIOUS UFD BLOCK NUMBER OR -1 IF NONE.
/ 377	NB		NEXT UFD BLOCK NUMBER OR -1 IF NONE.
	.EJECT
/
/ DESCRIPTION OF TABLES IN THE EXECUTIVE TO ALLOW MULTIPLE UFD'S
/
/
/ RSX SUPPORTS MULTIPLE UFD'S FOR ALL DISK ATTACHED TO THE SYSTEM.
/ WHEN A LUN IS ASSIGNED TO A DISK, SOME UFD SPECIFICATION IS MADE
/ BY REASSIGN FOR THAT DISK-LUN PAIR. THE USER HAS THE CHOICE OF
/ NAMING A UFD IN REASSIGN'S COMMAND STRING OR ACCEPTING THE DEFAULT
/ UFD. WHEN REASSIGN HAS OBTAINED THE UFD NAME AND MADE SURE THAT THE
/ UFD IS INITIALIZED IN THE MFD, REASSIGN ENTERS THE UFD NAME IN THE
/ LUN-UFD TABLE FOR THE LUNS BEING ASSIGNED TO THE DISK. IF THE USER
/ DOES NOT TYPE A UFD NAME TO REASSIGN, THE REASSIGN WILL LOOK UP
/ THE DEFAULT UFD IN THE DISK-UFD TABLE FOR THE SPECIFIED DISK.
/ THE DISMOUNT MCR FUNCTION (DSM) WILL LOGICALLY DISMOUNT A USER
/ DISK BY ZEROING THE DEFAULT UFD NAME IN THE DISK-UFD TABLE AND
/ ZEROING ALL ENTRIES IN THE LUN-UFD TABLE FOR THE DISK SPECIFIED.
/ WHEN A DISK IS LOGICALLY MOUNTED, MOUNT WILL ENTER THE DEFAULT 
/ UFD NAME INTO THE DISK-UFD TABLE AND INTO ALL ENTRIES OF THE LUN-
/ UFD TABLE FOR LUNS ASSIGNED TO THE DISK.
/
/ HENCE THERE CAN BE AS MANY UFD'S ACTIVE FOR A DISK AS THERE ARE LUNS
/ ASSIGNED TO THE DISK.
/
/ NOTE: THE FIRST BLOCK OF THE MFD FOR THE THREE TYPES OF DISK IS
/ AS FOLLOWS.
/
/ RF -- 1777
/ RP -- 47040
/ RK -- 1777
/
	.EJECT
/
/
/ DEFINITION OF A TRUNCATED SEQUENTIAL ACCESS FILE:
/
/ WHEN A FILE IS OPENED FOR OUTPUT, A UFD ENTRY IS MADE THEN AND THERE
/ (INSTEAD OF WHEN THE FILE IS CLOSED) SO THAT OTHER SEQUENTIAL OUTPUT
/ FILES CAN BE OPENED AT THE SAME TIME. UNTIL THE FILE IS PROPERLY
/ CLOSED, IT CANNOT BE READ OR DELETED BECAUSE NEITHER THE NUMBER OF THE
/ FIRST DATA BLOCK (WORD 3) NOR THE TOTAL NUMBER OF BLOCKS (WORD 4) HAS
/ BEEN RECORDED. SUCH A FILE, FOLLOWING DOS-15 CONVENTION, IS CALLED A
/ "TRUNCATED FILE", WHOSE UFD ENTRY WORD 3 HAS BIT 0=1. EXCEPT WHEN A
/ FILE IS BEING CREATED, TRUNCATED FILES SHOULD NOT EXIST UNLESS THE
/ DISK IS MALFUNCTIONING.
/
	.EJECT
/ THE FORMAT OF A RANDOM ACCESS FILE ENTRY IN THE UFD IS DEPICTED BELOW.
/ NOTE THAT THIS IS ENTIRELY DIFFERENT FROM THE TYPE OF RANDOM ACCESS
/ FILE USED IN DOS-15. THE FILE ENTRY KEY, WHICH DISTINGUISHES ONE FOR-
/ MAT FROM ANOTHER, IS BIT 0 IN ENTRY WORD 4.
/
/ UFD RANDOM ACCESS FILE ENTRY FORMAT:
/
/ WORD	CONTENTS	MEANING
/
/ 0	.SIXBT "FIL" FILE NAME (1ST HALF) OR 0 IF FILE ENTRY IS FREE.
/ 1	.SIXBT "NAM" FILE NAME (2ND HALF) OR 0 IF FILE ENTRY IS FREE.
/ 2	.SIXBT "EXT" FILE NAME EXTENSION OR 0 IF FILE ENTRY IS FREE.
/ 3	FB		BIT 0 = 0 (UNUSED).
/			FB (BITS 1-17) = 1ST BLOCK NUMBER OF THE FILE.
/ 4	TYPE+NB		TYPE (BIT 0) = 1 = RANDOM ACCESS FILE.
/			NB (BITS 2-17) = NUMBER OF DATA BLOCKS IN THE FILE.
/ 5	ACCT1		ACCOUNTING INFORMATION (NUMBER OF RECORDS IN THE
/			FILE, IF FILE CREATED BY FORTRAN'S CALL DEFINE).
/ 6	ACCT2		ACCOUNTING INFORMATION (RECORD SIZE, IF FILE
/			CREATED BY FORTRAN'S CALL DEFINE).
/ 7	DATE		DATE THE FILE WAS CREATED: MM/DD/YY
/				(YY = 0 FOR 1970).
/
/	.
/	.
/	.
/
/ 376	PB		PREVIOUS UFD BLOCK NUMBER OR -1 IF NONE.
/ 377	NB		NEXT UFD BLOCK NUMBER OR -1 IF NONE.
	.TITLE *** INITIALIZATION CODE/VARIABLES
/
/ HANDLER INITIALIZATION CODE -- CONTROL STARTS AT THIS POINT AS A RESULT
/ OF A "REQUEST" BY THE MCR TASK "REASSIGN".
/
/ THIS CODE IS EXECUTED ONLY ONCE -- IT RESIDES WITHIN THIS HANDLER'S
/ INTERNAL FILE DATA BUFFER.
/
/ *******************************************************************
/
/ ************************* OVERLAYED *******************************
/
RFINIT	LAC	RFSTKL		/ADDRESS OF THE STL DEQUE.
	DAC*	(R1)
	LAC	RFHNAM		/ADDRESS OF: .SIXBT "RX...."
	DAC*	(R2)
	JMS*	RFSNAM		/SCAN THE SYSTEM TASK LIST FOR THE RX FILE
				/HANDLER'S NODE.
				/(R1, R2, R6, X17, XR & AC ARE ALTERED).
				/WAS THE NODE FOUND?
	CAL	(10)		/#/ NO -- EXIT.
	DAC	RFSTL		/YES -- SAVE THE NODE ADDRESS.
/
	.IFDEF %RF15
	LAC	RFPDVL		/ADDRESS OF THE PHYSICAL DEVICE LIST QUEUE.
	DAC*	(R1)
	LAC	RFPNAM		/ADDRESS OF: .SIXBT "RF@@@@".
	DAC*	(R2)
	JMS*	RFSNAM		/SCAN THE PHYSICAL DEVICE
				/LIST FOR THE RF DISK
				/FILE HANDLER'S NODE.
				/(R1, R2, R6, XR & AC ARE ALTERED).
/
/ NOTE -- THE RF DISK FILE HANDLER HAS A DIFFERENT PHYSICAL DEVICE
/ NODE THAN DOES THE RF DISK DRIVER. THIS IS DONE SO THAT EACH TASK
/ MAY HAVE ITS OWN I/O REQUEST QUEUE.
/
				/WAS THE NODE FOUND?
	CAL	(10)		/#/ NO -- EXIT.
	DAC	RFPDNA		/YES -- SAVE THE NODE ADDRESS.
/
/ SAVE THE ADDRESS OF THE REGISTER IN THE PHYSICAL DEVICE LIST NODE
/ WHICH IS SUPPOSED TO CONTAIN THE ADDRESS OF RF'S TRIGGER EVENT
/ VARIBALE. THEN, STORE THE TRIGGER EVENT VARIABLE ADDRESS IN THE
/ PHYSICAL DEVICE LIST NODE.
/
	AAC	+10
	DAC	RFPDEV
	LAC	RFPTTG		/PICK UP THE ADDRESS OF THE TRIGGER EVENT VARIABLE.
	DAC*	RFPDEV
/
	.EJECT
/ COMPUTE AND STORE THE INDEX REGISTER ADJUSTMENT FACTOR. WHEN USING
/ THE CONTENTS OF THE INDEX REGISTER AS A BASE ADDRESS AND THE ADDRESS
/ OPERAND AS A CONSTANT OFFSET, AS IN   LAC 3,X , ONE MUST ADD AN
/ ADJUSTMENT FACTOR TO THE CONTENTS OF THE XR TO OFFSET THE ADDRESS
/ OPERAND'S IMPLIED PAGE BITS.
/
	AND	RF70K		/SAVE THE PAGE BITS
	DAC	RFPAGE		/AS SUCH AND ALSO
	TCA			/AS A NEGATIVE
	DAC	RFXADJ		/ADJUSTMENT FACTOR.
	JMP	RF.TW		/WAIT FOR TRIGGER.
	.ENDC
	.IFUND %RF15
/
/ COMPUTE AND STORE THE XR ADJUSTMENT FACTOR
/
	DZM	RFUCNT		/CLEAR THE UNIT COUNTER
	LAC	RFPTTG		/FIX THE X ADJUST. FOR THE TRIGGER ADDR.
	AND	RF70K
	DAC	RFPAGE
	TCA
	DAC	RFXADJ
/
/ CONSTRUCT A TABLE OF PDVL NODE ADDRESSES FOR EACH UNIT
/
	LAC	(RFDNAT-1	/INIT. X10 TO POINT AT TABLE
	DAC*	(X10		/OF PDVL NODE ADDRESSES
	LAC	RFPDVL		/SET XR TO ACCESS PDVL LISTHEAD
	JMS	RFADJX
	LAC	0,X		/GET ADDR. OF 1ST PDVL NODE
RFINI1	JMS	RFADJX		/SET XR TO ACCESS PDVL NODE
	LAC	2,X		/GET NAME FROM A PDVL NODE
	SAD	RFNAME		/IS NAME=RX? (RP OR RK)
	SKP
	JMP	RFINI2		/NO -- CHECK NEXT NODE
	LAC	3,X
	SZA
	JMP	RFINI2
	LAC	6,X		/YES -- MAKE SURE THE PDVL NODE IS INIT.
	DAC	7,X
	DZM	11,X
	PXA			/SAVE THE NODE'S ADDRESS
	TAD	RFPAGE		/IN RFDNAT TABLE
	DAC*	X10
	LAC	RFPTTG		/PUT TRIGGER ADDR. INTO PDVL NODE
	DAC	10,X
	IDX	RFUCNT		/INCR. UNIT COUNTER
RFINI2	LAC     0,X		/TEST FOR END OF PDVL DEQUE
	SAD	RFPDVL
	SKP
	JMP	RFINI1		/NOT END OF DEQUE
	JMP	RF.TW		/ WAIT FOR THE TRIGGER
	.ENDC
/
/ DATA CONSTANTS USED ONLY DURING THE INITIALIZATION CODE.
/
	.IFDEF %RF15
RFNAME	.SIXBT	"RF@@@@"
	.ENDC
	.IFDEF %RP02
RFNAME	.SIXBT	"RP@@@@"
	.ENDC
	.IFDEF %RK05
RFNAME	.SIXBT	"RK@@@@"
	.ENDC
RFPDVL	PDVL			/ADDRESS OF THE PHYSICAL DEVICE
				/LIST QUEUE.
RFPNAM	RFNAME
RF70K	070000			/PAGE BIT MASK.
RFPTTG	RFTGEV			/ADDRESS OF THE TRIGGER EVENT VARIABLE.
RFSNAM	SNAM			/ADDRESS OF THE EXECUTIVE'S SNAM ROUTINE.
RFSTKL	STKL			/ADDRESS OF THE SYSTEM TASK LIST.
	.IFDEF %RF15
RFTNAM	.SIXBT	"RF...."
	.ENDC
	.IFDEF %RP02
RFTNAM	.SIXBT	"RP...."
	.ENDC
	.IFDEF %RK05
RFTNAM	.SIXBT	"RK...."
	.ENDC
RFHNAM	RFTNAM
/
/ ********************* END OF OVERLAYABLE CODE *******************
/
/ *****************************************************************
/
/ THE FOLLOWING IS THIS HANDLER'S OWN FILE DATA BUFFER, WHICH CONTAINS
/ SPACE FOR FILE STATUS DESCRIPTORS AND FOR A 256-WORD DATA BLOCK (SEE
/ FILE BUFFER STRUCTURE DESCRIPTION AT THE END OF THE RESIDENT CODE
/ LISTING). SUCH A BUFFER, NOT SUPPLIED BY SOME OTHER TASK, IS NECESSARY
/ SO THAT THE PROCESS OF DELETING OLD SEQUENTIAL ACCESS FILES CAN GO ON
/ WHILE OTHER FILES ARE OPENED. IT IS ALSO USED DURING RIB CREATION.
/
	.LOC	RFINIT
RFFLBF	.BLOCK	RFNFSD+400
/
/ THE FOLLOWING TWO TABLES ARE USED ONLY FOR DEVICES HAVING MORE THAN
/ ONE UNIT, NAMELY THE RP02 AND THE RK05. THE FIRST OF THESE TABLES
/ IS A LIST OF THE PDVL NODE ADDRESSES FOR EACH UNIT.   THE SECOND TABLE
/ CONTAINS THE COUNT OF OPEN FILES FOR EACH UNIT.
/
/ BEFORE DISPATCHING TO PROCESS AN I/O REQUEST RFPDNA AND RFFCNT ARE
/ SET TO CORRESPOND TO THE CORRECT TABLE ENTRY. WHEN THE PROCESS IS
/ COMPLETE THE TABLE ENTRY IS RESET TO THE NEW VALUE FOR RFFCNT.
/ RFCLOS ACCESSES THESE TABLES, WHEREAS THE OTHER OVERLAYS DON'T,
/ BECAUSE ON ABORT OR DISCONNECT AND EXIT MANY FILES MUST BE CLOSED
/ AND THEY MIGHT BE ON DIFFERENT UNITS.
/
	.IFUND %RF15
RFDNAT=.
	.REPT 10		/TABLE OF ADDR. OF PDVL NODES
	0
RFCNTT=.
	.REPT 10		/TABLE OF OPEN FILES COUNTERS
	0
	.ENDC
	.EJECT
	.TITLE *** PICK NEXT I/O REQUEST
/
/ WAIT FOR THE TASK TO BE TRIGGERED, WHICH WILL OCCUR AS THE RESULT
/ OF ONE OF TWO THINGS:
/
/	1 -- AN I/O REQUEST ENTERED BY THE "QUEUE I/O" CAL SERVICE
/	ROUTINE.
/
/	2 -- AN "ABORT" REQUEST ENTERED BY THE I/O RUNDOWN TASK "IORD".
/
RF.TW	CAL	RFWFTG		/"WAITFOR" RF FILE HANDLER TRIGGER
				/EVENT VARIABLE TO BE SET.
	DZM	RFTGEV		/CLEAR THE TRIGGER.
/
/ THE TASK HAS BEEN TRIGGERED. CHECK IF THERE IS ANYTHING
/ IN THE I/O REQUEST QUEUE IN THE PHYSICAL DEVICE NODE.
/
	.IFDEF %RF15
RFPICK	LAC	RFPDNA		/PUT PDVL NODE ADDR
	DAC*	(R1)		/INTO R1.
	JMS*	(DQRQ)		/DE-QUEUE AN I/O REQUEST.
				/(R1, R2, R4, R5, R6, XR & AC ARE ALTERED).
				/WAS A REQUEST FOUND?
	JMP	RF.TW		/NO.
	.ENDC
	.IFUND %RF15
/
/ FOR MULTIPLE UNITS NODES ARE DE-QUEUED BY PRIORITY
/
RFPICK	LAC       (RFDNAT-1		/SET X10 SO THE RFDNAT TABLE
	DAC*	(X10		/CAN BE SCANNED.
	LAW	-1500		/SET THE INITIAL PRIORITY VERY LOW
	DAC	RFTMP2
	LAC	RFUCNT		/SET THE COUNTER OF THE NO. OF UNITS CHECKED
	TCA
	DAC	RFTMP1		/SAVE 2'S COMP. IN RFTMP1
RFPCK1	LAC*    X10		/GET ADDR. OF A PDVL NODE
	JMS	RFADJX		/SET XR TO ACCESS THE PDVL NODE
	PXA			/COMPUTE THE ADDRESS OF WORD 6 IN THIS PDVL NODE
	TAD	RFPAGE
	AAC	6
	SAD	6,X		/ARE ANY NODES QUEUED?
	JMP	RFPCK2		/NO -- CHECK THE NEXT UNIT
	LAC	6,X		/YES -- SET XR TO ACCESS QUEUED NODE
	JMS	RFADJX
	LAC	4,X		/GET PRIORITY OF THIS REQUEST
	TAD	RFTMP2		/SUBTRACT CURRENT PRIORITY
	SPA			/IS THIS NODES PRIO. HIGHER THAN CURRENT PRIO.?
	JMP	RFPCK3		/YES -- THIS NODES PRIO IS HIGH
RFPCK2	ISZ     RFTMP1		/NO -- WAS THIS THE LAST UNIT?
	JMP	RFPCK1		/NO -- LOOK AT NEXT PDVL NODE
	LAW	-1500		/YES -- ANY NODES DETECTED?
	SAD	RFTMP2
	JMP	RF.TW		/NO -- WAIT FOR TRIGGER
	LAC	RFTMP3		/YES -- SET UP TO DEQUEUE A REQUEST NODE
	DAC*	(R1
	JMS*	(DQRQ		/DEQUEUE A NODE
	JMP	RF.TW		/NO NODE FOUND SO WAIT
	JMP	RFPCK4		/GOT THE NODE GO PROCESS IT.
RFPCK3	LAC     4,X		/SAVE THE NEW PRIORITY
	TCA
	DAC	RFTMP2
	LAC*	(X10		/SAVE THE ADDRESS OF THE PDVL NODE
	DAC	RFTMP3
	LAC*	RFTMP3
	DAC	RFTMP3
	JMP	RFPCK2		/GO LOOK AT NEXT PDVL NODE
	.ENDC
RFPCK4	DAC     RFRQND		/YES -- SAVE ITS ADDRESS
	JMS	RFADJX		/SET UP THE XR TO ACCESS
				/THE REQUEST NODE.
	LAC	6,X		/SAVE THE ADDRESS (OR 0
	DAC	RFRQEV		/IF NONE) OF THE REQUESTOR'S
				/EVENT VARIABLE.
	LAC	2,X		/WAS THIS DIRECTIVE ISSUED FROM TASK LEVEL?
	SNA
	JMP	RFNTSK		/#/NO -- ERROR.
	LAC	5,X		/GET THE LUN TO WHICH REQ. WAS MADE
	AND	(777000
	SWHA
	DAC	RFLUNN		/SAVE IT
	.IFUND %RF15
	PXA			/SAVE THE XR
	DAC	RFTMP1
	LAC	RFTMP3		/GET ADDR. OF PDVL HAVING THIS NODE
	DAC	RFPDNA		/SAVE THE ADDRESS
	JMS	RFADJX		/SET XR TO ACCESS PDVL NODE
	LAC	5,X		/GET THE UNIT NO.
	DAC	RFUNIT		/SAVE IT
	TAD	(RFCNTT		/GET COUNT OF OPEN FILES FOR THIS UNIT
	DAC	RFTMP2
	LAC*	RFTMP2
	DAC	RFFCNT		/SAVE IT
	LAC	RFTMP1		/RESTORE THE XR
	PAX
	.ENDC
/
	.EJECT
/ FETCH THE CAL FUNCTION CODE AND DISPATCH TO THE APPROPRIATE ROUTINE.
/ THE AC, CONTAINING THE FUNCTION CODE, IS PASSED ON TO EACH OVERLAY.
/
	LAC	5,X		/EXAMINE THE CAL FUNCTION CODE.
	AND	(777)
	SNA
	JMP	RFDEAL		/RF HANDLER'S INTERNAL DEALLOCATE.
	SAD	(016)
	JMS*	RFCREA		/CREATE.
	SAD	(017)
	JMS*	RFCLOS		/ABORT.
	SAD	(023)
	JMP	RFPRAL		/PREAL.
	SAD	(026)
	JMS*	RFREAD		/INPUT (READ).
	SAD	(027)
	JMS*	RFREAD		/OUTPUT (WRITE).
	SAD	(032)
	JMS*	RFOPEN		/SEEK.
	SAD	(033)
	JMS*	RFOPEN		/ENTER.
	SAD	(034)
	JMS*	RFCLOS		/CLOSE.
	SAD	(035)
	JMS*	RFDLET		/DELETE.
	SAD	(036)
	JMP	RFHINF		/HINF.
	SAD	(037)
	JMS*	RFOPEN		/RENAME.
	SAD	(134)
	JMS*	RFCLOS		/ERROR CLOSE.
	SAD	(777)
	JMP	RFEXIT		/DISCONNECT & EXIT.
/
/#/ UNIMPLEMENTED OR ILLEGAL FUNCTION.
/
RFIFNC	LAW	-6
RFSTFL	DAC	RFCLFL		/SET FLAG SO FILE WILL BE CLOSED IF
				/ONE IS OPEN.
	JMP	RFSREV		/SET REQUESTOR'S EVENT VARIABLE.
/
/#/ CAL NOT ISSUED FROM TASK.
/
RFNTSK	LAW	-203
	JMP	RFSREV
	.TITLE *** HINF/PREALLOCATE
/
/ HINF (HANDLER INFORMATION) FUNCTION. SET THE REQUESTOR'S EVENT
/ VARIABLE TO INDICATE THAT THE HANDLER PERFORMS
/ DIRECTORY-ORIENTED INPUT AND OUTPUT.
/
	.IFDEF %RF15
RFHINF	LAC	(340002)
	.ENDC
	.IFUND %RF15
RFHINF	LAC       RFUNIT
	CLL
	ALS	6
	.IFDEF %RP02
	TAD	(340003
	.ENDC
	.IFDEF %RK05
	TAD	(340024
	.ENDC
	.ENDC
	JMP	RFSREV
/
/ PREALLOCATE SPACE AT THE TOP OF THE TASK'S PARTITION FOR I/O BUFFERS.
/ THIS IS DONE FOR TASKS, SUCH AS THE ASSEMBLER, WHICH MUST RESERVE
/ SPACE FOR BUFFERS BEFORE THEY CAN GRAB REMAINING FREE CORE.
/
RFPRAL	LAC	RFRQND		/SET R2 WITH THE I/O REQUEST NODE ADDRESS.
	DAC*	(R2)
	LAC	(400+RFNFSD) /SET R4 WITH THE DESIRED BUFFER SIZE.
	DAC*	(R4)
	JMS*	(PABF)		/PREALLOCATE BUFFER SPACE.
				/(R4, R5, XR & AC ARE ALTERED).
	SKP			/#/ ERROR RETURN.
	JMP	.+3		/SUCCESSFUL RETURN.
	LAW	-25
	JMP	RFSTFL
	CLA!IAC
	JMP	RFSREV
	.TITLE *** DISCONNECT & EXIT
/
/ DISCONNECT THE INTERRUPT LINE, CLEAN UP, AND THEN EXIT (AN I/O REQUEST
/ MADE BY THE "REASSIGN" MCR TASK). DISCONNECT IS NOT DONE SINCE THIS
/ HANDLER IS NOT CONNECTED TO AN INTERRUPT LINE.
/
/ "REASSIGN" WILL TELL THE OPERATOR WHEN THIS HANDLER HAS OPEN FILES,
/ BUT THE OPERATOR MAY CHOOSE TO REASSIGN ANYWAY. IN CASE THIS SHOULD
/ HAPPEN AND A REQUEST TO EXIT RESULTS, A SCAN IS MADE HERE OF THE ACTIVE
/ LUNS DEQUE TO CLOSE ALL FILES.
/
RFEXIT	LAC	(777)		/CALL THE "CLOSE" OVERLAY TO CLOSE ALL
	JMS*	RFCLOS		/OPEN FILES, RELINQUISH SYSTEM RESOURCES,
				/AND RETURN HERE WHEN DONE.
	JMS	RFRTND		/RETURN THE I/O REQUEST NODE TO
				/THE POOL OF EMPTY NODES.
				/(R2, R6, XR AND AC ARE ALTERED).
	.IFDEF %RF15
	LAC	(RFACTB		/DEALLOCATE ALL THE SPARE DISK BLOCKS
	DAC	RFDALO+3
	CAL	RFDALO
	CAL	RFWAIT
	DZM*	(RFACTB
	.ENDC
	.IFUND %RF15
	LAC	RFUCNT		/SET TMP1 WITH 2'S COMP. OF NO. OF UNITS
	TCA
	DAC	RFTMP1
	.IFDEF %RP02
	LAC	(RPACT0		/GET ADDR. OF 1ST ALLO. CONTROL TABLE
	.ENDC
	.IFDEF %RK05
	LAC	(RKACT0
	.ENDC
	DAC	RFTMP2		/SAVE IT
RFEXT1	DAC     RFDALO+3	/DEALLOCATE BLOCKS FOR THIS UNIT
	CAL	RFDALO
	CAL	RFWAIT
	DZM*	RFTMP2
	LAC	RFTMP2		/GET NEXT CTA
	AAC	3
	DAC	RFTMP2		/SAVE IT
	ISZ	RFTMP1		/END OF ALL UNITS ?
	JMP	RFEXT1		/NO -- DEALLOCATE FOR NEXT UNIT
	.ENDC			/YES
	.IFDEF %RF15
	.INH			/INHIBIT INTERRUPTS.
	IDX	RFPDEV		/CLEAR THE "ASSIGN INHIBIT" FLAG LOCATED
	DZM*	RFPDEV		/IN THE PHYSICAL DEVICE NODE.
	.ENB			/ENABLE INTERRUPTS.
	.ENDC
	.IFUND %RF15
	LAC	RFUCNT		/SET UP 2'S COMP OF NO. OF UNITS
	TCA
	DAC	RFTMP1
	LAC	(RFDNAT		/SET TMP2 TO ACCESS RFDNAT TABLE
	DAC	RFTMP2
	.INH
RFEXT2	LAC*    RFTMP2		/GET ADDR. OF WORD IN PDVL NODE HAVING ASS. INH. FLAG
	AAC	11
	DAC	RFTMP3		/SAVE IT
	DZM*	RFTMP3		/ZERO THE WORD IN THE PDVL NODE
	IDX	RFTMP2		/INCR. PTR TO RFDNAT TABLE TO ACCESS NEXT NODE
	ISZ	RFTMP1		/END OF TABLE?
	JMP	RFEXT2		/NO -- FIX NEXT PDVL NODE
	.ENB			/YES -- EXIT
	.ENDC
	CAL	(10)		/EXIT.
	.TITLE *** DEALLOCATE
/
/ NORMAL DEALLOCATE REQUESTS ARE I/O FUNCTION CODE 16. THIS FORM OF
/ DEALLOCATE IS ENTERED WITH FUNCTION CODE 0 AND IS STRICTLY INTERNAL
/ TO THIS I/O HANDLER. THE REQUEST NODE CONTAINS THE NUMBER OF THE
/ STARTING BLOCK OF SOME FILE WHICH HAS BEEN DELETED AND ALSO THE NUMBER
/ OF BLOCKS IN THE FILE. IF IT IS A SEQUENTIAL ACCESS FILE, DEALLOCATION
/ WILL TERMINATE EITHER WHEN THE COUNT RUNS OUT OR WHEN THE FORWARD
/ LINKAGE WORD IN THE FINAL BLOCK IS -1. THE FOLLOWING CODE WILL READ
/ SEQUENTIALLY THROUGH THE FILE AND DEALLOCATE BLOCKS IN TURN. IF IT IS
/ A RANDOM ACCESS FILE, ITS BLOCKS ARE DEALLOCATED ALL AT ONCE SINCE
/ THEY ARE CONTIGUOUS.
/
RFDEAL	777000			/IF THE LUN IS NON-0, THIS I/O REQUEST
	AND	5,X		/WAS MADE OUTSIDE OF THIS HANDLER AND
	SZA			/IS THEN AN ILLEGAL FUNCTION.
	JMP	RFIFNC		/#/
	LAC	7,X		/SAVE THE FILE'S START BLOCK.
	PAL
	LAC	10,X		/EXAMINE THE FILE TYPE INDICATOR (BIT 0).
	SPA
	JMP	RFDERA		/ITS A RANDOM ACCESS FILE.
/
/ DEALLOCATE BLOCKS FROM A SEQUENTIAL ACCESS FILE.
/
	AAC	-1		/DECREMENT THE BLOCK COUNT AND SAVE THE
	DAC	10,X		/RESULT IN THE MQ.
	LMQ
	LAC	(RFFLBF)	/SET THE XR TO POINT TO THE BUFFER
	DAC	RFBFAD		/AND SAVE THE "CURRENT BUFFER" ADDRESS.
	JMS	RFADJX
	PLA
	DAC	RF.BLK,X
	LACQ			/IS THE BLOCK COUNT NOW 0 (INDICATING THAT
	SNA!CLC			/THIS IS THE FINAL BLOCK)?
	JMP	RFDEFB		/YES.
	JMS	RFGTBL		/NO -- GET CURRENT BLOCK.
				/(EFFECTIVELY, ALL ACTIVE REGISTERS ARE
				/ALTERED. THE XR IS LEFT POINTING AT
				/THE FILE BUFFER).
				/DISK ERROR?
	SKP!CLC			/#/ YES -- PRETEND THIS IS THE FINAL BLOCK.
	LAC	RF.DAT+377,X /NO -- SAVE THE FORWARD LINKAGE WORD AS
RFDEFB	DAC	RF.NXB,X	/THE NEXT BLOCK.
/
	.EJECT
/ SET UP THE DEALLOCATE CONTROL TABLE.
/
	LAC	(400)		/SET THE WORD COUNT FOR ONE BLOCK'S WORTH.
	DAC	RFDACT+0
	CLL
	LAC	RF.BLK,X	/COMPUTE THE PLATTER NUMBER.
	SNA
	JMP	RFNODA
	.IFDEF %RF15
	LRS	12
	DAC	RFDACT+1
	LAC	RF.BLK,X	/COMPUTE THE DISK ADDRESS.
	AND	(1777)
	ALS	10
	.ENDC
	.IFUND %RF15
	LMQ
	LLSS!ECLA 10
	DAC	RFDACT+1
	LAC	RFUNIT
	ALS	17
	TAD	RFDACT+1
	DAC	RFDACT+1
	LACQ
	.ENDC
	DAC	RFDACT+2
	LAC	RF.NXB,X	/IS THIS THE FINAL BLOCK?
	SAD	(-1)
	JMP	RFDAFN		/YES.
	PAL			/NO.
	LAC	RFRQND		/SET THE XR TO POINT TO THE I/O REQUEST NODE.
	DAC*	(R2)
	JMS	RFADJX
	PLA			/STORE THE NEW BLOCK NUMBER IN PLACE OF
	DAC	7,X		/THE OLD.
	LAC	RFPDNA
	AAC	+6
	DAC*	(R1)
	JMS*	(SPRI)		/INSERT THE NODE BY PRIORITY.
				/(R1, R2, R3, R6, XR & AC ARE ALTERED).
	JMP	RFDCAL
/
/ DEALLOCATE BLOCKS FROM A RANDOM ACCESS FILE.
/
RFDERA	AND	(377777)	/# OF BLOCKS IS IN THE AC.
	CLL			/MULTIPLY BY THE NUMBER OF WORDS
	ALS	10		/PER BLOCK (MAY RESULT IN A NEGATIVE
				/NUMBER, WHICH IS ACTUALLY A LARGE, POSI-
				/TIVE 18-BIT NUMBER).
	DAC	RFDACT+0	/STORE THE WORD COUNT.
	CLL			/COMPUTE THE PLATTER NUMBER.
	LAC	7,X
	.IFDEF %RF15
	LRS	12
	DAC	RFDACT+1
	LAC	7,X		/COMPUTE THE DISK ADDRESS.
	AND	(1777)
	ALS	10
	.ENDC
	.IFUND %RF15
	LMQ
	LLSS!ECLA 10
	DAC	RFDACT+1
	LAC	RFUNIT
	ALS	17
	TAD	RFDACT+1
	DAC	RFDACT+1
	LACQ
	.ENDC
	DAC	RFDACT+2
/
RFDAFN	JMS	RFRTND		/RELINQUISH THE I/O REQUEST NODE.
				/(R2, R6, XR & AC ARE ALTERED).
RFDCAL	CAL	RFDALO		/DEALLOCATE.
	CAL	RFWAIT		/WAITFOR COMPLETION SO THAT DEALLOCATE
				/NODES DON'T PILE UP.
	JMP	RFPICK		/SEE IF ANOTHER I/O REQUEST IS PENDING.
RFNODA	JMS	RFRTND		/DEAL. OF BLK 0 IS ILLEGAL SO RETURN
	JMP	RFPICK		/THE NODE AND SEE IF A REQ. IS WAITING
	.TITLE *** I/O REQUEST COMPLETED
/
/ SET THE REQUESTOR'S EVENT VARIABLE (IF ANY).
/ IF AN ERROR OCCURRED, THE ERROR CODE IS IN
/ THE AC AND ENTRY IS AT THIS LOCATION. THE
/ HINF FUNCTION TRANSFERS HERE WITH THE HINF
/ CODE IN THE AC.
/
RFSREV	PAL			/SAVE VALUE TEMPORARILY.
	LAC	RFRQEV		/DID THE REQUESTER SPECIFY AN EVENT
	SNA			/VARIABLE ADDRESS?
	JMP	RFIOCD		/NO.
	JMS	RFADJX		/YES -- SET THE XR TO POINT TO THE EVENT
	PLA			/VARIABLE.
	DAC	0,X
RFIOCD	LAC	RFRQND		/ADDRESS OF THE I/O REQUEST NODE.
	DAC*	(R2)
	LAC	RFCLFL		/CHECK IF AN ERROR OCCURRED THAT SHOULD
	SZA			/CAUSE A FILE TO BE CLOSED. IF SO, DON'T
	JMP	RFERCL		/DECREMENT THE TRANSFERS PENDING COUNT
				/BECAUSE THAT WILL BE DONE FOLLOWING THE
				/CLOSE.
	JMS*	(IOCD)		/DECLARE I/O COMPLETED BY DECREMENTING THE
				/COUNT OF PENDING I/O TRANSFERS TO THE
				/TASK'S PARTITION (NORMAL MODE TASK ONLY).
				/(R5, XR & AC ARE ALTERED).
	JMP	RFRLND
/
/ SUCCESSFUL COMPLETION OF A FILE OPEN DIRECTIVE WILL RETURN HERE WITH
/ +1 IN THE LR TO BYPASS DECREMENTING THE I/O PENDING COUNT. WHEN THE
/ FILE IS CLOSED, THE COUNT IS DOUBLY DECREMENTED TO MAKE UP FOR THIS.
/ THIS IS DONE SO THAT I/O RUNDOWN WILL ALWAYS BE INVOKED FOR A TASK THAT
/ HAS EXITED OR IS BEING ABORTED IF THE TASK HAS AN OPEN FILE.
/
RFOPED	LAC	RFRQEV		/DID THE REQUESTOR SPECIFY
	SNA			/AN EVENT VARIABLE ADDRESS?
	JMP	RFRLND		/NO.
	JMS	RFADJX		/YES -- SET THE XR TO POINT TO THE
	PLA			/EVENT VARIABLE.
	DAC	0,X
	JMP	RFRLND
/
/ AN ERROR OCCURRED WHICH REQUIRES THAT THE CURRENTLY OPEN FILE BE
/ CLOSED. QUEUE AN I/O REQUEST AS IF THE TASK HAD ISSUED AN "ERROR CLOSE"
/ COMMAND (SPECIFYING NO EVENT VARIABLE). SOME ERRORS WILL CAUSE THE
/ FLAG TO BE SET WITHOUT TESTING TO SEE IF A FILE IS OPEN.
/
RFERCL	DZM	RFCLFL		/CLEAR THE FLAG.
	LAC	RFRQND		/I/O REQUEST NODE ADDRESS.
	JMS	RFADJX
	777000			/CHANGE THE RIGHT HALF (FUNCTION CODE)
	AND	5,X		/TO 134 TO SIGNIFY "ERROR CLOSE".
	AAC	134
	DAC	5,X
	DZM	6,X		/CLEAR THE EVENT VARIABLE ADDRESS.
	DZM	7,X		/CLEAR THE FILE NAME AND EXTENSION
	DZM	10,X		/IN CASE THE FILE IS OPEN FOR RENAMING.
	DZM	11,X
/
	LAC	RFPDNA		/SET UP THE ADDRESS OF THE I/O REQUEST QUEUE.
	AAC	+6
	DAC*	(R1)
	LAC	RFRQND		/SET UP THE ADDRESS OF THE "TASK NAME"
	AAC	+2		/(REALLY AN STL POINTER).
	DAC*	(R2)
	JMS*	(SNAM)		/SCAN THE REQUEST QUEUE FOR A NODE ENTERED
				/UNDER THIS TASK NAME.
				/(R1, R2, R6, X17, XR & AC ARE ALTERED).
				/WAS A NODE FOUND?
	JMP	RFSPRI		/NO.
	JMS	RFADJX		/YES -- PICK UP ITS BACKWARD POINTER SO
	LAC	1,X		/THAT THE "CLOSE" REQUEST CAN BE INSERTED
	DAC*	(R1)		/BEFORE ANY OTHER REQUESTS MADE BY THIS TASK.
	LAC	RFRQND		/I/O REQUEST NODE ADDRESS.
	DAC*	(R2)
	JMS*	(NADD)		/ADD NODE TO DEQUE.
				/(R2, R6, XR & AC ARE ALTERED).
	JMP	RFSET6
/
RFSPRI	LAC	RFPDNA		/COMPUTE THE ADDRESS OF THE I/O REQUEST QUEUE.
	AAC	+6
	DAC*	(R1)
	LAC	RFRQND		/ADDRESS OF THE I/O REQUEST NODE.
	DAC*	(R2)
	JMS*	(SPRI)		/SINCE THERE ARE NO OTHER REQUESTS IN THE
				/QUEUE MADE BY THIS TASK, SIMPLY INSERT
				/THE "CLOSE" REQUEST IN ORDER OF TASK PRIORITY.
				/(R1, R2, R3, R6, XR & AC ARE ALTERED).
	JMP	RFSET6
/
RFRLND	JMS	RFRTND		/RETURN THE I/O REQUEST NODE TO THE POOL
				/OF EMPTY NODES.
				/(R2, R6, XR & AC ARE ALTERED).
	.IFUND %RF15
	LAC	(RFCNTT		/UPDATE THE COUNT OF OPEN FILES TABLE
	TAD	RFUNIT
	DAC	RFTMP1
	LAC	RFFCNT
	DAC*	RFTMP1
	.ENDC
/
/ DECLARE A SIGNIFICANT EVENT BY POSTING
/ AN API LEVEL 6 INTERRUPT.
/
RFSET6	LAC	(401000)
	ISA
	JMP	RFPICK		/SEE IF ANOTHER I/O REQUEST IS PENDING.
	.TITLE *** ALLOCATE DISK SPACE SUBROUTINE
/
/ SUBROUTINE RFAL1B -- ALLOCATES ONE DISK FILE BLOCK (256 DECIMAL WORDS).
/ THIS ROUTINE ATTEMPTS TO MAINTAIN A GENERAL RESERVE OF DISK BLOCKS TO
/ BE DOLED OUT ONE AT A TIME FOR ANY I/O OPERATION BY ANY TASK. THIS IS
/ DONE IN ORDER TO CUT DOWN THE NUMBER OF DISK ACCESSES REQUIRED FOR
/ SPACE ALLOCATION.     THE CONTROL TABLE "RFACTB" IS LOCATED IN THE
/ SYSTEM COMMUNICATION AREA WITHIN THE EXECUTIVE SO THAT THE ALLOCATED
/ BLOCKS CAN BE DEALLOCATED BY THE MCR FUNCTION TASK ...SAV.    THIS
/ PREVENTS WRITING OVER EXISTING FILES FOLLOWING WARM STARTS.
/
/ CALLING SEQUENCE:
/
/	JMS	RFAL1B
/	(RETURN HERE WITH ERROR CODE IN THE AC)
/	(RETURN HERE WITH THE BLOCK NUMBER IN THE AC
/	AND THE XR LEFT POINTING AT THE FILE BUFFER)
/
/ ALTERED REGISTERS:
/
/	EFFECTIVELY ALL (DUE TO THE CAL) & RFTMP1
/
RFAL1B	0
	PXA			/SAVE THE XR.
	DAC	RFXRTP
/
/ CHECK IF THE RESERVE OF DISK BLOCKS IS EMPTY.
/
	.IFDEF %RF15
RFALCK	LAC*	(RFACTB)	/NUMBER OF AVAILABLE DISK WORDS.
	SNA
	JMP	RFALMT		/NONE.
	TAD	(-400)		/DECREMENT THE NUMBER OF WORDS REMAINING
	DAC*	(RFACTB)	/BY 400 (THE SIZE OF A FILE BLOCK).
	CLL
	LAC*	(RFACTB+1)	/EACH DISK PLATTER CONTAINS 2000 OCTAL
	ALS	12		/FILE BLOCKS.
	DAC	RFTMP1
	LAC*	(RFACTB+2)	/CONVERT THE DISK ADDRESS TO A FILE
	LRS	10		/BLOCK NUMBER.
	TAD	RFTMP1
	LMQ			/SAVE THE BLOCK NUMBER IN THE MQ.
	CLL			/#76 INCREMENT PLATTER IF WD CNT OVERFLOWS
	LAC*	(RFACTB+2)	/UPDATE THE DISK ADDRESS BY 400 OCTAL.
	TAD	(400)
	DAC*	(RFACTB+2)
	SZL			/#76 WAS THERE AN OVERFLOW?
	IDX*	(RFACTB+1	/#76 YES -- SO INCREMENT PLATTER
	.ENDC
	.IFUND %RF15
RFALCK	CLL			/GET ADDRESS OF CORRECT CTA
	LAC	RFUNIT
	MUL
	3
	LACQ
	.IFDEF %RP02
	TAD	(RPACT0
	.ENDC
	.IFDEF %RK05
	TAD	(RKACT0
	.ENDC
	DAC	RFTMP1		/SAVE IT
	IAC
	DAC	RFTMP2		/GET ADDR. OF WORD 1 IN TABLE
	IAC
	DAC	RFTMP3		/GET ADDR. OF WORD 2 IN TABLE
	LAC	RFTMP1		/PUT ADDR. OF CTA INTO CPB
	DAC	RFALC8+3
	LAC*	RFTMP1		/ARE THERE ANY BLOCKS TO BE GIVEN OUT?
	SNA
	JMP	RFALMT		/NO -- ALLOCATE SOME
	TAD	(-400		/YES -- GET ONE OUT
	DAC*	RFTMP1		/GET THE BLOCK NO.
	LAC*	RFTMP3		/GET DISK ADDR. AND SAVE IN MQ
	LMQ
	LAC*	RFTMP2		/GET PLATTER NO.
	AND	(007777		/REMOVE UNIT NO.
	LRSS	10		/LEAVE BLOCK NO. IN MQ
	CLL
	LAC*	RFTMP3		/UPDATE THE DISK ADDRESS
	TAD	(400
	DAC*	RFTMP3
	SZL			/IF LINK GETS SET INCR. PLATTER NO.
	IDX*	RFTMP2
	.ENDC
	LAC	RFXRTP		/RESTORE THE XR.
	PAX
	IDX	RFAL1B		/SKIP ON RETURN AND RETURN WITH THE
	LACQ			/BLOCK NUMBER IN THE AC.
	.IFUND %RF15
	JMS	RFALSR		/UPDATE THE RFALAR AND RFALCT TABLES
	.ENDC
	JMP*	RFAL1B
/
/ THERE ARE NO FILE BLOCKS AVAILABLE.
/
RFALMT	CLL
	.IFUND %RF15
	LAC	(RFALT1		/GET RFALAR AND RFALCT FOR THIS UNIT
	TAD	RFUNIT
	DAC	RFTMP3
	LAC	(RFALT2
	TAD	RFUNIT
	DAC	RFTMP2
	LAC*	RFTMP3
	DAC	RFALAR
	LAC*	RFTMP2
	DAC	RFALCT
	.ENDC
	LAC	RFALAR		/CHANGE THE NUMBER OF 400-WORD FILE BLOCKS
	ALS	10		/TO THE NUMBER OF WORDS.
	.IFDEF %RF15
	DAC*	(RFACTB)
	.ENDC
	.IFUND %RF15
	DAC*	RFTMP1		/ENTER NO. OF WORDS AND UNIT NO.
	LAC	RFTMP1		/GET A PTR TO PLACE WHERE UNIT SHOULD
	IAC			/BE ENTERED
	DAC	RFTMP2
	CLL
	LAC	RFUNIT
	ALS	17
	DAC*	RFTMP2		/ENTER UNIT NO.
	.ENDC
	CAL	RFALC8		/ALLOCATE.
	CAL	RFWAIT		/WAITFOR COMPLETION.
	LAC	RFIOEV
	SMA			/WAS THERE AN ERROR?
	JMP	RFALCH		/NO.
/
/ THE ALLOCATE WAS NOT SUCCESSFULLY PERFORMED. IF THE AMOUNT REQUESTED
/ WAS MORE THAN 1 BLOCK, DIVIDE THAT AMOUNT IN TWO AND TRY AGAIN.
/
	LAC	RFALAR		/AMOUNT REQUESTED = 1?
	SAD	(1)
	JMP	RFALER		/#/ YES -- ERROR.
	RCR			/NO -- DIVIDE BY 2.
	DAC	RFALAR
	.IFUND %RF15
	DAC*	RFTMP3
	.ENDC
/
/ EACH TIME THE AMOUNT TO BE ALLOCATED IS HALVED, 8 SUCCESSFUL
/ ALLOCATES MUST BE PERFORMED AT THE HALVED VALUE BEFORE THE
/ FULL VALUE IS REINSTATED.
/
	LAW	-10
	DAC	RFALCT
	JMP	RFALMT
/
/ ALLOCATE WAS SUCCESSFUL. BEFORE DOLING OUT A BLOCK TO THE CALLER,
/ CHECK THE REPEAT COUNT TO SEE IF THE AMOUNT TO BE ALLOCATED SHOULD
/ BE DOUBLED.
/
RFALCH	LAC	RFALCT		/IS THE REPEAT COUNT NON-0?
	SNA
	JMP	RFALCK		/NO.
	ISZ	RFALCT		/YES -- WHEN THE COUNT RUNS OUT, DOUBLE
	JMP	RFALCK		/THE AMOUNT TO BE ALLOCATED NEXT TIME.
	LAC	RFALAR
	RCL
	DAC	RFALAR
	SAD	(10)		/BACK UP TO THE MAXIMUM OF 8?
	JMP	RFALCK		/YES.
	LAW	-10		/NO -- RESET THE REPEAT COUNT SO THAT
	DAC	RFALCT		/THE AMOUNT TO BE ALLOCATED WILL NOT
	JMP	RFALCK		/BE DOUBLED AGAIN UNTIL AFTER 8 SUCCESSFUL
				/ALLOCATES.
/
/#/ 1 BLOCK CANNOT BE ALLOCATED EITHER BECAUSE THE DISK IS FULL (-15)
/ OR BECAUSE OF A PERMANENT DISK FAILURE (-N).
/
RFALER	LAC	RFXRTP		/RESTORE THE XR.
	PAX
	LAC	RFIOEV		/RETURN THE ERROR CODE IN THE AC.
	.IFDEF %RF15
	DZM*	(RFACTB)	/ZERO RFACTB SINCE NO BLOCKS COULD BE
				/ALLOCATED AND SUPPLY IS EMPTY.
	.ENDC
	.IFUND %RF15
	DZM*	RFTMP1
	JMS	RFALSR		/UPDATE RFALAR AND RFALCT TABLES
	.ENDC
	JMP*	RFAL1B
/
/ THE FOLLOWING TWO TABLES ARE USED ONLY FOR DEVICES WITH MULTIPLE UNITS.
/ THE FIRST TABLE IS A LIST OF THE RFALAR VARIABLES FOR EACH UNIT.
/ THE SECOND TABLE IS A LIST OF THE RFALCR'S FOR EACH UNIT.
/
	.IFUND %RF15
RFALT1=.
	.REPT 10		/TABLE OF RFALAR'S
	10
RFALT2=.
	.REPT 10		/TABLE OF RFALCT'S
	0
/
/
/ SUBROUTINE RFALSR -- USED ONLY FOR DEVICES WITH MULTIPLE UNITS
/
/       THIS SUBROUTINE IS USED TO UPDATE THE VALUES OF RFALAR AND
/       RFALCT FOR A UNIT JUST PRIOR TO LEAVING THE RFAL1B S.R.
/       RETURN IS UNCONDITIONALLY TO LOCATION JMS+1.
/
/
/	NO REGISTERS ARE ALTERED.
/
RFALSR	0
	DAC	RFTMP1		/SAVE THE AC
	LAC	(RFALT1		/PUT NEW VALUE OF RFALAR INTO TABLE
	TAD	RFUNIT
	DAC	RFTMP2
	LAC	RFALAR
	DAC*	RFTMP2
	LAC	(RFALT2		/PUT NEW VALUE OF RFALCT INTO TABLE
	TAD	RFUNIT
	DAC	RFTMP2
	LAC	RFALCT
	DAC*	RFTMP2
	LAC	RFTMP1		/RESTORE THE AC
	JMP*	RFALSR
	.ENDC
	.TITLE *** MISCELLANEOUS SUBROUTINES
/
/ SUBROUTINE RFADJX -- SET THE INDEX REGISTER FROM THE VALUE IN THE AC
/ BY ADDING THE INDEX ADJUSTMENT FACTOR, WHICH COMPENSATES FOR THE
/ PAGE ADDRESS BITS ADDED FOR MEMORY REFERENCE INSTRUCTIONS.
/
/ CALLING SEQUENCE:
/
/	UNADJUSTED VALUE IN THE AC
/	JMS	RFADJX
/	(UNCONDITIONAL RETURN)
/
/ ALTERED REGISTERS:
/
/	AC & XR
/
RFADJX	0
	TAD	RFXADJ
	PAX
	JMP*	RFADJX
/
/
/
/
/
/ SUBROUTINE RFRTND -- RETURN THE I/O REQUEST NODE TO THE POOL OF EMPTY NODES.
/
/ CALLING SEQUENCE:
/
/	JMS	RFRTND
/	(UNCONDITIONAL RETURN)
/
/ ALTERED REGISTERS:
/
/	R2, R6, XR & AC
/
RFRTND	0
	LAC	RFRQND
	DAC*	(R2)		/SAVE THE NODE'S ADDRESS.
	LAC	(POOL)		/ADDRESS OF THE HEAD OF THE EMPTY POOL.
	DAC*	(R1)
	JMS*	(NADD)		/ADD THE NODE TO THE POOL.
				/(R2, R6, XR & AC ARE ALTERED).
	JMP*	RFRTND
/
	.EJECT
/ SUBROUTINE RFGTBL -- GET THE BLOCK WHOSE NUMBER IS IN (RF.BLK,X) AND
/ STORE IT IN THE INDICATED BUFFER.
/
/ CALLING SEQUENCE:
/
/	(BLOCK NUMBER IN RF.BLK,X)
/	JMS	RFGTBL
/	(RETURN WITH ERROR CODE IN THE AC)
/	(NO-ERROR RETURN WITH THE XR STILL
/	POINTING AT THE FILE BUFFER)
/
/ ALTERED REGISTERS:
/
/	EFFECTIVELY ALL (DUE TO THE CAL)
/
RFGTBL	0
	PXA			/SAVE THE XR.
	DAC	RFXRTP
	JMS	RFCNVT		/CONVERT THE BLOCK NUMBER INTO A DISK
				/ADDRESS AND PLATTER NUMBER AND STORE
				/THEM IN THE GET/PUT CONTROL TABLE.
				/(XR, AC & MQ ARE ALTERED).
	LAC	RFBFAD		/STORE THE BUFFER ADDRESS IN THE
	AAC	RF.DAT		/CONTROL TABLE.
	DAC	RFGPCT+2
	CAL	RFGBLK		/"GET" BLOCK FROM DISK.
	CAL	RFWAIT		/WAITFOR COMPLETION.
	LAC	RFXRTP		/RESTORE THE XR.
	PAX
	LAC	RFIOEV
	SMA			/#/ SKIP ON RETURN IF NO ERROR OCCURRED.
	IDX	RFGTBL
	JMP*	RFGTBL
/
	.EJECT
/ SUBROUTINE RFPTBL -- PUT BLOCK ON DISK.
/
/ CALLING SEQUENCE:
/
/	(BLOCK NUMBER IN RF.BLK,X)
/	JMS	RFPTBL
/	(RETURN HERE WITH THE ERROR CODE IN THE AC)
/	(RETURN HERE, IF NO ERROR OCCURRED, WITH
/	THE XR STILL POINTING AT THE FILE BUFFER)
/
/ ALTERED REGISTERS:
/
/	EFFECTIVELY ALL (DUE TO THE CAL)
/
RFPTBL	0
	PXA			/SAVE THE XR.
	DAC	RFXRTP
	JMS	RFCNVT		/CONVERT THE BLOCK NUMBER INTO A DISK
				/ADDRESS AND PLATTER NUMBER AND STORE
				/THEM IN THE GET/PUT CONTROL TABLE.
				/(XR, AC & MQ ARE ALTERED).
	LAC	RFBFAD		/STORE THE BUFFER ADDRESS IN THE CONTROL
	AAC	RF.DAT		/TABLE.
	DAC	RFGPCT+2
	CAL	RFPBLK		/"PUT" THE BLOCK ON THE DISK.
	CAL	RFWAIT		/WAITFOR COMPLETION.
	LAC	RFXRTP		/RESTORE THE XR.
	PAX
	LAC	RFIOEV
	SMA			/#/ SKIP ON RETURN IF NO ERROR OCCURRED.
	IDX	RFPTBL
	JMP*	RFPTBL
/
	.EJECT
/ SUBROUTINE RFCNVT -- PREPARE TO GET OR PUT A DATA BLOCK FROM OR TO
/ THE DISK. CONVERT THE BLOCK NUMBER INTO A DISK ADDRESS AND PLATTER
/ NUMBER. THESE PARAMETERS ARE STORED IN THE GET/PUT CONTROL TABLE.
/
/ CALLING SEQUENCE:
/
/	JMS	RFCNVT
/	(UNCONDITIONAL RETURN)
/
/ ALTERED REGISTERS:
/
/	XR, AC & MQ
/
RFCNVT	0
	JMS	RFXRFB		/SET THE XR TO POINT TO THE FILE BUFFER.
	CLL
	LAC	RF.BLK,X	/COMPUTE THE PLATTER NUMBER.
	.IFDEF %RF15
	LRS	12
	DAC	RFGPCT+0
	LAC	RF.BLK,X	/COMPUTE THE DISK ADDRESS.
	AND	(1777)
	ALS	10
	DAC	RFGPCT+1
	.ENDC
	.IFUND %RF15
	LMQ
	LLSS!ECLA 10
	DAC	RFGPCT+0
	CLL
	LAC	RFUNIT
	ALS	17
	TAD	RFGPCT+0
	DAC	RFGPCT+0
	LACQ
	DAC	RFGPCT+1
	.ENDC
	JMP*	RFCNVT
/
/
/
/
/
/ SUBROUTINE RFXRFB -- SET THE XR TO POINT TO THE FILE BUFFER.
/
/ CALLING SEQUENCE:
/
/	JMS	RFXRFB
/	(UNCONDITIONAL RETURN)
/
/ ALTERED REGISTERS:
/
/	AC & XR
/
RFXRFB	0
	LAC	RFBFAD
	JMS	RFADJX
	JMP*	RFXRFB
	.TITLE *** ACTIVE LUNS DEQUE (RFALUN)
/
/ THE LISTHEAD FOR THIS DEQUE BEGINS AT 'RFALUN'. A NEW NODE IS ADDED
/ TO THE DEQUE EACH TIME A REQUEST TO OPEN A FILE IS RECEIVED FROM A
/ NEW TASK-LUN COMBINATION. THE NUMBER OF OPEN FILES IS VIRTUALLY UN-
/ LIMITED AND SEVERAL TASKS MAY PERFORM I/O ON THE SAME LUN.
/
/ THIS DEQUE APPLIES MAINLY TO SEQUENTIAL ACCESS FILES. RANDOM ACCESS
/ FILES ARE NEVER OPENED UNLESS THEY ARE TO BE RENAMED.
/
/ FORMAT OF NODES IN THE "RFALUN" DEQUE:
/
/	WORD 0 FORWARD POINTER
/	WORD 1 BACKWARD POINTER
/	WORD 2 TASK NAME (1ST HALF -- .SIXBT)	<<< SEE NOTE BELOW
/	WORD 3 TASK NAME (2ND HALF -- .SIXBT)	<<< SEE NOTE BELOW
/	WORD 4 UNUSED
/	WORD 5 LUN (0-8); ZERO (9-17)
/	WORD 6 ADDRESS OF PDVL NODE (FOR RP OR RK VERSIONS)
/	WORD 7 DISK UNIT NUMBER (FOR RP OR RK VERSIONS)
/	WORD 10 UNUSED
/	WORD 11 FILE BUFFER POINTER
/
RFALUN	.			/FORWARD POINTER.
	.-1			/BACKWARD POINTER.
/
/ NOTE -- IN PHASE 1 OF RSX, I/O REQUEST NODES WERE FORMATTED WITH
/ THE TASK NAME IN WORDS 2 AND 3 (AS SHOWN ABOVE). FOR PHASE 2, WORD
/ 2 CONTAINS A POINTER TO THE STL NODE (IN WHICH THE TASK NAME CAN BE
/ FOUND IF NEEDED) AND WORD 3 CONTAINS 0 OR A POINTER TO THE TASK'S
/ PARTITION BLOCK NODE. SINCE THE STL POINTER IS UNIQUE, WHICH IS ALL
/ THAT MATTERS, WORDS 2 AND 3 ARE TREATED IN THIS HANDLER AS IF THEY
/ STILL CONTAIN THE TASK NAME.
	.TITLE *** FILE BUFFER STRUCTURE
/
/ FILE BUFFERS ARE CREATED IN THE TOP PART OF A TASK'S CORE PARTITION BY A
/ COMMON "GET BUFFER" SUBROUTINE WITHIN THE EXECUTIVE.
/ THE BEGINNING OF THE BUFFER IS USED FOR FILE STATUS DESCRIPTORS.
/ THESE ARE DEFINED BELOW RELATIVE TO THE BEGINNING OF THE BUFFER.
/
RF.FN1=0		/FILE NAME -- 1ST HALF.
RF.FN2=1		/FILE NAME -- 2ND HALF.
RF.EXT=2		/FILE NAME EXTENSION.
RF.OPN=3		/CAL FUNCTION CODE BY WHICH THIS FILE WAS OPENED.
RF.BLK=4		/CURRENT DISK DATA BLOCK NUMBER.
/
/ LOCATION OF A FREE FILE ENTRY IN THE UFD.
/
RF.FEF=5		/SET NON-0 (UFD START BLK.) BY "RFSRCH" WHEN A FREE FILE
			/	ENTRY HAS BEEN FOUND.
RF.FEB=6		/NUMBER OF THE UFD BLOCK WHICH HAS A FREE FILE ENTRY.
RF.FEL=7		/RELATIVE LOCATION WITHIN THE UFD BLOCK OF THE
			/	FREE FILE ENTRY.
RF.FES=10		/THE NEW FILE'S STARTING BLOCK NUMBER.
/
/ LOCATION OF THE OLD FILE ENTRY IN THE UFD.
/
RF.OFF=11		/SET NON-0 (-1) BY "RFSRCH" IF THE FILE ALREADY
			/	EXISTS IN THE DIRECTORY.
RF.OFB=12		/NUMBER OF THE UFD BLOCK WHICH HAS THE OLD FILE ENTRY.
RF.OFL=13		/RELATIVE LOCATION WITHIN THE UFD BLOCK OF THE
			/	OLD FILE ENTRY.
RF.OFS=14		/BIT 0 = 1 IF THE FILE IS TRUNCATED.
			/BITS 1-17 = THE FILE'S STARTING BLOCK NUMBER.
/
/ READ AND WRITE PARAMETERS.
/
RF.DPT=15		/POINTER TO A DATA LINE IN THE FILE DATA BLOCK.
RF.PER=16		/SET NON-0 WHEN THE CURRENT DATA BLOCK
			/	HAS A PARITY ERROR.
RF.EOF=17		/SET NON-0 WHEN AN END-OF-FILE RECORD
			/	HAS BEEN READ.
RF.FSZ=20		/SIZE OF THE CURRENT OUTPUT FILE IN
			/	NUMBER OF DATA BLOCKS.
RF.NXB=21		/NEXT DATA BLOCK NUMBER ALLOCATED PRIOR
			/	TO WRITING OUT THE CURRENT BLOCK.
/
	.EJECT
/ WITHIN THE FILE BUFFER THERE IS A FILE DATA BUFFER OF 256 (DECIMAL)
/ WORDS, WHICH STARTS IMMEDIATELY AFTER THE FILE STATUS DESCRIPTORS.
/ DATA BLOCKS ARE READ HERE FROM THE DISK OR ARE ASSEMBLED HERE AND
/ THEN WRITTEN TO THE DISK.
/
RF.DAT=RFNFSD		/START OF 400 OCTAL WORD FILE DATA BLOCK.
/
/ THE FOLLOWING CONDITIONAL WILL GENERATE AN ERROR IF THE NUMBER OF
/ FILE STATUS DESCRIPTORS VARIABLE IS INCORRECTLY DEFINED.
/
	.IFNZR	RF.DAT-22
	YYYYYY
	.ENDC
	.TITLE *** VARIABLES AND CAL PARAMETER BLOCKS
/
/ VARIABLES.
/
RFTGEV	0			/THE TRIGGER EVENT VARIABLE.
RFIOEV	0			/THE I/O EVENT VARIABLE.
RFRQND	0			/ADDRESS OF THE CURRENT I/O REQUEST NODE.
RFRQEV	0			/ADDRESS OF THE REQUESTER'S EVENT VARIABLE.
RFTMP1	0			/TEMPORARY STORAGE.
	.IFUND %RF15
RFTMP2	0
RFTMP3	0
RFUCNT	0			/COUNT OF THE NUMBER OF UNITS
RFUNIT	0			/CURRENT UNIT NUMBER
	.ENDC
RFLUNN	0			/CURRENT LUN NUMBER
RFPDNA	0			/ADDRESS OF THE PHYSICAL DEVICE NODE.
RFXADJ	0			/INDEX REGISTER ADJUSTMENT FACTOR (SEE
				/INITIALIZATION CODE FOR EXPLANATION).
RFPAGE	0			/PAGE ADDRESS BITS FOR THE PAGE IN
				/WHICH THIS CODE IS LOCATED.
				/C(RFXADJ) = -C(RFPAGE).
RFPDEV	0			/ADDRESS OF THE WORD IN THE PHYSICAL
				/DEVICE NODE THAT CONTAINS THE TRIGGER
				/EVENT VARIABLE ADDRESS.
RFFCNT	0			/COUNT OF THE NUMBER OF OPEN FILES.
RFCLFL	0			/FLAG SET NON-ZERO TO SIGNAL THE RESIDENT
				/"DONE" CODE NOT TO RELINQUISH THE I/O
				/REQUEST NODE BUT, INSTEAD, TO USE IT TO
				/CLOSE THE FILE.
RFALAR	10			/THE NUMBER OF 256-WORD BLOCKS TO BE
				/ALLOCATED AT A TIME. THIS COUNT
				/MIGHT BE HALVED IF NECESSARY.
RFALCT	0			/FLAG AND COUNTER USED BY THE ALLOCATE
				/SUBROUTINE TO DETERMINE (IF THE FLAG
				/IS NON-0) THAT THE NUMBER OF BLOCKS
				/ALLOCATED AT ONE TIME IS LESS THAN 8
				/BECAUSE OF DISK ERRORS OR NO ROOM.
				/THE COUNTER IS SET TO -8 AND IS IN-
				/CREMENTED EACH TIME AN ALLOCATE IS
				/SUCCESSFULLY PERFORMED. IF THE COUNT
				/GOES TO ZERO, THE AMOUNT TO BE ALLOCATED
				/IS DOUBLED (NOT TO EXCEED 8).
RFBFAD	0			/ADDRESS OF THE CURRENT FILE BUFFER.
RFSTL	0			/ADDRESS OF THIS HANDLER'S SYSTEM TASK
				/LIST NODE.
RFALNA	0			/ADDRESS OF THE CURRENT RFALUN NODE.
RFXRTP	0			/TEMPORARY STORAGE FOR THE XR.
/
	.EJECT
/ CAL PARAMETER BLOCKS.
/
RFWFTG	20			/"WAITFOR" THE TRIGGER EVENT VARIABLE
	RFTGEV			/TO BE SET NON-0.
/
RFWAIT	20			/"WAITFOR" THE I/O EVENT VARIABLE
	RFIOEV			/TO BE SET NON-0.
/
RFALC8	11500			/CODE FOR "ALLOCATE".
	RFIOEV			/EVENT VARIABLE.
	1			/LUN 1 = DISK I/O DRIVER.
	.IFDEF %RF15
	RFACTB			/CONTROL TABLE ADDRESS.
	.ENDC
	.IFUND %RF15
	XX			/MODIFIED TO THE CORRECT CTA ADDRESS
	.ENDC
	.IFDEF %RF15		/DEVICE CODE
	2
	.ENDC
	.IFDEF %RP02
	3
	.ENDC
	.IFDEF %RK05
	24
	.ENDC
/
RFDALO	11600			/CODE FOR "DEALLOCATE".
	RFIOEV			/EVENT VARIABLE ADDRESS.
	1			/LUN 1 = DISK I/O DRIVER.
	RFDACT			/CONTROL TABLE ADDRESS. THIS WORD IS
	.IFDEF %RF15		/DEVICE CODE
	2
	.ENDC
	.IFDEF %RP02
	3
	.ENDC
	.IFDEF %RK05
	24
	.ENDC
				/MODIFIED BY THE EXIT CODE.
/
RFGBLK	13000			/CODE FOR "GET".
	RFIOEV			/EVENT VARIABLE.
	1			/LUN 1 = DISK I/O DRIVER.
	RFGPCT			/CONTROL TABLE ADDRESS.
	.IFDEF %RF15		/DEVICE CODE
	2
	.ENDC
	.IFDEF %RP02
	3
	.ENDC
	.IFDEF %RK05
	24
	.ENDC
/
RFPBLK	13100			/CODE FOR "PUT".
	RFIOEV			/EVENT VARIABLE ADDRESS.
	1			/LUN 1 = DISK I/O DRIVER.
	RFGPCT			/CONTROL TABLE ADDRESS.
	.IFDEF %RF15		/DEVICE CODE
	2
	.ENDC
	.IFDEF %RP02
	3
	.ENDC
	.IFDEF %RK05
	24
	.ENDC
/
/ DEALLOCATE CONTROL TABLE.
/
RFDACT	XX			/NUMBER OF WORDS TO DEALLOCATE.
	XX			/DISK PLATTER NUMBER.
	XX			/DISK ADDRESS.
/
/ GET AND PUT CONTROL TABLE.
/
RFGPCT	XX			/DISK PLATTER.
RFGPC1	XX			/DISK ADDRESS.
RFGPC2	XX			/CORE BUFFER ADDRESS.
	400			/WORD COUNT.
/
	.END	RFINIT