.TITLE *** RSX DISK FILES HANDLER OVERLAY #5
/
/ 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
/
/
/ 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
/
/ INTERNALLY DEFINED GLOBAL SYMBOL: MUST BE THE SAME AS THE FILE NAME.
/
	.GLOBL	RFCREA
/
/ EXTERNALLY DEFINED GLOBAL SYMBOLS.
/
	.GLOBL	RFRQND,RFALUN,RFAL1B,RFSREV,RFGTBL,RFPTBL,RFBFAD
	.GLOBL	RFCLFL,RFFLBF,RFLUNN
/
	.IFUND %RF15
	.GLOBL RFUNIT
	.ENDC
/
/ DEFINITION OF REGISTERS LOCATED WITHIN THE RSX EXECUTIVE.
/
X10=10				/AUTOINCREMENT REGISTER 10.
R1=101				/GENERAL REGISTER #1.
R2=102				/GENERAL REGISTER #2.
R3=103				/GENERAL REGISTER #3.
R4=104				/GENERAL REGISTER #4.
NADD=107			/ENTRY POINT TO "ADD
				/NODE TO DEQUE" SUBROUTINE.
MONTH=166			/1 - 12.
DAY=167				/1 - 31.
YEAR=170			/0 - 99.
POOL=240			/HEAD OF THE EMPTY NODES DEQUE.
VAJX=342			/ENTRY POINT TO "VERIFY AND ADJUST TO 17
LUFD1=304			/ADDR. OF PTR TO START OF LUN-UFD TABLE
				/BITS I/O TRANSFER PARAMETER" SUBROUTINE.
/
/ 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.
ECLA=641000			/CLEAR AC WITH EAE.
/
	.TITLE *** CREATE (A RANDOM ACCESS FILE)
/
RFCREA	0
	LAC	(.)		/COMPUTE THE PAGE ADDRESS BITS FOR THIS
	AND	(70000)		/OVERLAY AND SAVE THEM IN BOTH POSITIVE
	DAC	RFPAGE		/AND NEGATIVE FORM.
	TCA
	DAC	RFXADJ
	DZM	RFERCD
/
/ VERIFY THAT THE CONTROL TABLE LIES WITHIN THE TASK'S CORE.
/
	LAC*	RFRQND		/SET THE XR WITH THE REQUEST NODE'S ADDRESS.
	DAC*	(R2)
	JMS	RFADJX
	LAC	7,X		/ADDRESS OF THE CONTROL TABLE.
	DAC*	(R3)
	LAC	(11)		/SIZE OF THE CONTROL TABLE.
	DAC*	(R4)
	JMS*	(VAJX)		/VERIFY THE CONTROL TABLE LIMITS AND SET
				/THE ADJUSTED 17-BIT TABLE ADDRESS IN R3.
				/(R3, R5, XR & AC ARE ALTERED).
				/ERROR?
	JMP	RFXPER		/#/ YES -- CONTROL TABLE EXCEEDS TASK LIMITS.
	LAC*	(R3)		/NO -- SAVE THE ADDRESS.
	DAC	RFCTAB
	JMS	RFADJX
/
/ PICK UP THE CONTROL TABLE PARAMETERS.
/
	LAC	0,X
	DAC	RFFNM1		/FILE NAME (FIRST HALF).
	LAC	1,X
	DAC	RFFNM2		/FILE NAME (SECOND HALF).
	LAC	2,X
	DAC	RFFEXT		/FILE NAME EXTENSION.
	LAC	3,X
	DAC	RFFSIZ		/FILE SIZE (# OF 256-WORD BLOCKS).
	AND	(777000)
	SZA
	JMP	RFSZER		/#/ SIZE ERROR -- NEGATIVE OR > 777.
	LAC	4,X
	DAC	RFACT1		/ACCOUNTING INFORMATION.
	LAC	5,X
	DAC	RFACT2		/ACCOUNTING INFORMATION.
	LAC	6,X
	DAC	RFUPDT		/UPDATE INDICATOR.
/
	.EJECT
/ USE THIS HANDLER'S INTERNAL FILE BUFFER TO READ IN UFD BLOCKS.
/
	LAC	RFFLBF
	DAC*	RFBFAD
/
/ SEARCH THE ACTIVE LUN DEQUE TO SEE IF THE FILE IS ALREADY IN USE.
/
	LAC	RFALUN		/SET THE INDEX REGISTER TO START AT
	JMS	RFADJX		/THE HEAD OF RFALUN.
/
RFALLP	LAC*	RFRQND		/SET AUTOINCREMENT REGISTER 10 TO
	IAC			/ACCESS THE TASK NAME IN THE REQUEST NODE.
	DAC*	(X10)
/
/ TEST FOR END OF DEQUE.
/
	LAC	0,X		/END OF RFALUN DEQUE?
	SAD	RFALUN
	JMP	RFANEW		/YES.
	JMS	RFADJX		/NO -- SET THE INDEX REGISTER TO
				/POINT TO THE NEXT NODE.
/
/ TEST FOR TASK NAME. (ACTUALLY, IT IS NOT A TASK NAME -- SEE COMMENTS
/ AT "RFALUN" IN RESIDENT CODE).
/
	LAC	2,X		/FIRST HALF OF TASK NAME FOUND?
	SAD*	X10
	SKP
	JMP	RFALCF		/NO -- TRY NEXT CHECK.
	LAC	3,X		/SECOND HALF FOUND?
	SAD*	X10
	SKP
	JMP	RFALCF		/NO -- TRY NEXT CHECK.
/
/ TEST FOR LUN.
/
	LAC*	X10		/SKIP THE PRIORITY CODE.
	LAC	5,X		/DO THE LUNS MATCH?
	XOR*	X10
	AND	(777000)
	SZA
	JMP	RFALCF		/NO -- TRY NEXT CHECK.
/
	.EJECT
/#/ THE TASK-LUN NODE IN RFALUN HAS BEEN FOUND. THAT MEANS THAT THAT TASK
/ STILL HAS A FILE OPEN ON THAT LUN, WHICH IS AN ERROR.
/
	LAW	-10
	DAC*	RFCLFL		/SET A FLAG FOR THE "DONE" CODE SO THAT
				/IT WILL CLOSE THE FILE.
	JMP*	RFSREV
/
/ CHECK THE ACTIVE LUN TO SEE IF THIS FILE IS ALREADY OPEN.
/
RFALCF	PXA
	LMQ			/SAVE THE NODE'S ADJUSTED ADDRESS IN THE MQ.
	LAC	11,X		/SET THE XR TO POINT TO THIS FILE'S
	JMS	RFADJX		/CORE BUFFER.
	LAC	RF.FN1,X	/FIRST HALF OF FILE NAME MATCH?
	SAD	RFFNM1
	SKP
	JMP	RFNALN		/NO.
	LAC	RF.FN2,X	/YES -- SECOND HALF?
	SAD	RFFNM2
	SKP
	JMP	RFNALN		/NO.
	LAC	RF.EXT,X	/YES -- EXTENSION?
	SAD	RFFEXT
	JMP	RFFLOP		/#/ ERROR -- FILE ACTIVE.
/
/ TRY NEXT RFALUN NODE.
/
RFNALN	LACQ			/RESTORE THE XR.
	PAX
	JMP	RFALLP		/TRY THE NEXT NODE.
/
	.EJECT
/ A SCAN OF THE RFALUN DEQUE DID NOT TURN UP A NODE FOR THE TASK-LUN
/ COMBINATION OF THE CURRENT I/O REQUEST. VALIDATE THE FILE NAME AND
/ EXTENSION.
/
RFANEW	LAC	RFFNM1		/IS THE FILE NAME NULL?
	SZA!CLA
	JMP	.+3
	SAD	RFFNM2
	JMP	RFIFNM		/#/ YES -- ERROR.
	SAD	RFFEXT		/WHAT ABOUT THE EXTENSION?
	JMP	RFIFNM		/#/ YES -- ERROR.
/
	JMS	RFXRFB		/SET THE XR TO POINT TO THE FILE BUFFER.
	TAD	RFPAGE		/COMPUTE THE ADDRESS OF THE BUFFER AND
	JMS	RFZERO		/THEN ZERO OUT THE FILE DESCRIPTORS.
	-RF.DAT			/ARGUMENT -- NEGATIVE WORD COUNT.
				/(X10, RFTMP1 & AC ARE ALTERED).
/
/ MOVE THE FILE NAME TO THE FILE BUFFER, TO BE USED BY THE SEARCH
/ SUBROUTINE. ALTHOUGH THIS ADDS 6 INSTRUCTIONS WHICH COULD BE AVOIDED,
/ KEEPING THE SAME SUBROUTINE IN ALL THE OVERLAYS AVOIDS A POTENTIAL
/ BOOBYTRAP SHOULD SOMEONE WANT TO LIFT THE CODE.
/
	LAC	RFFNM1
	DAC	RF.FN1,X
	LAC	RFFNM2
	DAC	RF.FN2,X
	LAC	RFFEXT
	DAC	RF.EXT,X
/
/ DETERMINE WHERE THE 1ST BLOCK OF THE UFD IS STORED AND GET IT
/
	LAC*	(LUFD1		/CALC THE ADDR OF THE LUN-UFD TABLE ENTRY
	AAC	-1
	TAD*	RFLUNN
	DAC	RFTMP1		/SAVE IT
	LAC*	RFTMP1		/GET THE UFD NAME
	SNA			/IS DISK DISMOUNTED?
	JMP	RFUIDR		/#/YES -- ERROR
	DAC	RFTMP1		/NO -- SAVE UFD NAME
	.IFUND	%RP02
	LAC	(1777		/GET MFD START BLK FOR RF AND RK
	.ENDC
	.IFDEF	%RP02
	LAC	(47040		/GET MFD START BLOCK FOR RP
	.ENDC
RFMFD1	DAC	RF.BLK,X	/MAKE THIS BLOCK CURRENT
	JMS*	RFGTBL		/GET THIS BLOCK
	JMP	RFDKER		/#/RETURN HERE ON ERROR
	JMS	RFDBFA		/RETURN HERE IF OK -- MAKE AC+START OF BUFFER
	AAC	-1		/SETUP X10 AS A POINTER TO BUFFER
	DAC*	(X10
	AAC	370		/MAKE RFTMP2 POINT TO LAST ENTRY
	DAC	RFTMP2
RFMFD2	LAC*	X10		/GET AN UFD NAME
	SAD	RFTMP1		/DOES IT MATCH?
	JMP	RFMFD3		/YES
	LAC*	(X10		/NO -- END OF MFD BLK?
	SAD	RFTMP2
	JMP	RFMFD4		/YES
	AAC	3		/NO -- INCREMENT X10
	DAC*	(X10
	JMP	RFMFD2		/GO LOOK AT NEXT ENTRY
RFMFD4	LAC	RF.DAT+377,X	/LAST MFD BLOCK?
	SAD	(-1
	JMP	RFUIDR		/#/YES -- ERROR
	JMP	RFMFD1		/NO -- PREPARE TO GET NEXT MFD BLK
RFMFD3	LAC*	X10		/GET STARTING UFD BLK
	SAD	(-1		/IS IT INITIALIZED?
	JMP	RFUIDR		/#/NO -- ERROR
	DAC	RFUFDB		/YES -- SAVE BLK NO.
/
/ SEARCH THE FILE DIRECTORY FOR THE EXISTENCE OF THIS FILE AND FOR A FREE ENTRY
/
RFGBLN	DAC	RF.BLK,X	/SET THE CURRENT BLOCK NUMBER.
	JMS*	RFGTBL		/READ IN THE CURRENT BLOCK.
				/(EFFECTIVELY, ALL ACTIVE REGISTERS ARE
				/ALTERED; THE XR IS LEFT POINTING AT THE
				/FILE BUFFER).
	JMP	RFDKER		/#/ RETURN HERE, IF AN ERROR OCCURRED,
				/WITH THE ERROR CODE IN THE AC.
				/RETURN HERE OTHERWISE.
	JMS	RFSRCH		/SEARCH THE UFD BLOCK FOR A FREE FILE
				/ENTRY SLOT AND FOR THE EXISTENCE OF
				/THE OLD FILE ENTRY.
				/(X10, LR, AC & RF.CNT ARE ALTERED).
	LAC	RF.OFF,X	/WAS THE OLD FILE FOUND?
	SZA
	JMP	RFENFF		/YES.
/
/ THE CURRENT UFD BLOCK DOES NOT CONTAIN THE FILE.
/
	LAC	RF.DAT+377,X    /IS THIS THE FINAL UFD BLOCK?
	SAD	RFL002		/SAD (-1).
	SKP			/YES.
	JMP	RFGBLN		/NO -- READ IN THE NEXT ONE.
/
/ THE FINAL UFD BLOCK HAS BEEN READ. IF A FREE FILE ENTRY SLOT HAS NOT
/ BEEN FOUND, ADD ANOTHER BLOCK TO THE UFD.
/
	LAC	RF.FEF,X	/WAS A FREE ENTRY FOUND?
	SZA
	JMP	RFNTER		/YES.
	JMS*	RFAL1B		/NO -- ALLOCATE A BLOCK OF 256 WORDS
				/ON THE DISK.
				/(EFFECTIVELY, ALL REGISTERS + RFTMP1
				/ARE ALTERED).
				/WAS A BLOCK ALLOCATED?
	JMP	RFDKER		/#/ NO -- ERROR CODE IS IN THE AC.
/
/ THE XR IS POINTING AT THE FILE BUFFER.
/
	DAC	RF.DAT+377,X    /YES -- SET THE FORWARD LINKAGE IN THE
				/CURRENT UFD BLOCK (WHICH WILL NOW BE
				/THE NEXT TO LAST UFD BLOCK) TO POINT
				/TO THE NEWLY ALLOCATED BLOCK.
	JMS*	RFPTBL		/WRITE OUT THE CURRENT UFD BLOCK.
				/(EFFECTIVELY, ALL ACTIVE REGISTERS ARE
				/ALTERED -- THE XR IS LEFT POINTING AT
				/THE FILE BUFFER).
	DAC	RFERCD		/#/ RETURN HERE, IF AN ERROR OCCURRED, WITH
				/THE ERROR CODE IN THE AC.
				/RETURN HERE IF NO ERROR OCCURRED.
/
/ *********************************************************************
/
/ NOTE -- I/O SHOULD NOT BE ABORTED AT THIS POINT SINCE THE UFD IS
/ NOW OPEN-ENDED, I.E., THE FORWARD LINK IN THE LAST UFD BLOCK ISN'T -1.
/
/ *********************************************************************
/
/ INITIALIZE THE NEWLY-CREATED UFD BLOCK.
/
	LAC	RF.BLK,X	/SAVE THE NUMBER OF THE NEXT-TO-LAST
	DAC	RF.DAT+376,X    /UFD BLOCK AS THE BACKWARD LINK.
	LAC	RF.DAT+377,X    /MAKE THE NEWLY ALLOCATED UFD BLOCK
	DAC	RF.BLK,X	/THE CURRENT DISK BLOCK.
	LAW	-1		/SET THE FORWARD BLOCK LINKAGE WORD
	DAC	RF.DAT+377,X    /TO INDICATE THIS IS THE LAST BLOCK.
	JMS	RFDBFA		/GET THE FILE DATA BUFFER ADDRESS AND ZERO
	JMS	RFZERO		/ALL BUT THE LAST 2 WORDS IN THE DATA BUFFER.
	-376			/(X10, RFTMP1 & AC ARE ALTERED).
	JMS	RFSRCH		/SEARCH THE UFD BLOCK FOR A FREE FILE
				/ENTRY SLOT.
				/(X10, LR, AC & RF.CNT ARE ALTERED).
	JMP	RFALOC		/ALLOCATE THE FILE STORAGE.
/
	.EJECT
/ THE FILE HAS BEEN FOUND. X10 IS SET FOR PICKING UP FILE ENTRY WORD 4.
/
RFENFF	LAC	RF.OFS,X	/SAVE THE FILE'S STARTING BLOCK NUMBER.
	DAC	RFSTBL
	LAC*	X10		/IS THIS A RANDOM ACCESS FILE?
	SMA
	JMP	RFNOTR		/#/ NO -- ERROR.
	AND	(377777)	/YES.
	DAC	RFSIZE		/SAVE FILE SIZE.
	SAD	RFFSIZ
	JMP	RFSZOK
	LAW	-60		/SIZE ERROR. SET ERROR CODE, BUT RETURN
	DAC	RFERCD		/THE PARAMETERS TO THE REQUESTER ANYWAY.
	JMP	RFCHKA
RFSZOK	LAC	RFUPDT		/DOES THE REQUEST ASK TO UPDATE THE
	SNA			/ACCOUNTING INFORMATION?
	JMP	RFCHKA		/NO.
/
/ UPDATE THE ACCOUNTING INFORMATION IN THE UFD ENTRY.
/
	LAC	RFACT1		/YES.
	DAC*	X10
	LAC	RFACT2
	DAC*	X10
	JMP	RFREWR		/REWRITE THE UFD BLOCK.
/
/ CHECK THE ACCOUNTING INFORMATION FOR A MATCH.
/
RFCHKA	LAC	RFCTAB		/SET THE XR TO POINT TO THE "CREATE"
	JMS	RFADJX		/CONTROL TABLE.
	LAC	RFSIZE
	DAC	3,X		/SAVE THE FILE SIZE.
	LAC*	X10
	SAD	RFACT1
	JMP	RFCKA2
	DAC	4,X		/SAVE THE ACCOUNTING INFORMATION.
	LAW	-61		/#/ ERROR -- ACCOUNTING INFORMATION DIFFERS.
	DAC	RFERCD
RFCKA2	LAC*	X10
	SAD	RFACT2
	JMP	.+4
	DAC	5,X		/SAVE THE ACCOUNTING INFORMATION.
	LAW	-61		/#/ ERROR -- ACCOUNTING INFORMATION DIFFERS.
	DAC	RFERCD
	JMP	RFDONE
/
	.EJECT
/ PREPARE TO ENTER THE FILE NAME INTO THE DIRECTORY. FIRST, MAKE SURE
/ THAT THE PROPER UFD BLOCK IS IN CORE.
/
RFNTER	LAC	RF.FEB,X	/IS THE CURRENT BLOCK THE ONE WITH THE
	SAD	RF.BLK,X	/FREE ENTRY?
	JMP	RFALOC		/YES.
	DAC	RF.BLK,X	/NO -- READ IN THAT UFD BLOCK.
	JMS*	RFGTBL		/(EFFECTIVELY, ALL ACTIVE REGISTERS ARE
				/ALTERED; THE XR IS LEFT POINTING AT THE
				/FILE BUFFER).
	JMP	RFDKER		/#/ RETURN HERE, IF AN ERROR OCCURRED,
				/WITH THE ERROR CODE IN THE AC.
				/RETURN HERE OTHERWISE.
/
/ ALLOCATE CONTIGUOUS DISK SPACE FOR THE FILE.
/
RFALOC	LAC	RFFSIZ		/CONVERT THE NUMBER OF BLOCKS INTO A
	CLL			/WORD COUNT.
	ALS	10
	DAC	RFALWC
	.IFUND %RF15
	LAC*	RFUNIT		/FOR MULTI-UNIT DISKS ADD IN THE UNIT NO.
	CLL			/TO THE HIGH ORDER 3 BITS OF THE PLATTER WORD.
	ALS	17
	DAC	RFPLAT
	.ENDC
	CAL	RFACPB		/ALLOCATE DISK STORAGE.
	CAL	RFWAIT		/WAITFOR COMPLETION.
	JMS	RFXRFB		/RESTORE THE XR WITH THE FILE BUFFER ADDRESS.
	LAC	RFIOEV		/ERROR?
	SPA!CLL
	JMP	RFDKER		/#/ YES -- ERROR CODE IS IN THE AC.
/
/ CONVERT THE DISK ADDRESS AND PLATTER NUMBER INTO A BLOCK NUMBER.
/
	.IFDEF %RF15
	LAC	RFPLAT		/EACH PLATTER CONTAINS 2000 OCTAL BLOCKS.
	ALS	12
	DAC	RFTMP1
	LAC	RFDADR		/CONVERT THE DISK ADDRESS TO A FILE BLOCK #.
	LRS	10
	TAD	RFTMP1
	.ENDC
	.IFUND %RF15
	LAC	RFDADR		/CALC. BLK NO. FOR RP AND RK
	LMQ
	LAC	RFPLAT
	AND	(007777		/MAKE SURE THE UNIT NO. IS REMOVED
	LRSS	10
	LACQ
	.ENDC
	DAC	RF.FES,X	/SAVE THE STARTING BLOCK NUMBER.
	DAC	RFSTBL
/
/ CHANGE THE FREE FILE ENTRY SLOT IN THE UFD TO ENTER THIS FILE.
/
	JMS	RFDBFA		/SET AUTOINDEX REGISTER 10 IN ORDER
	AAC	-1		/TO STORE THE FILE PARAMETERS IN THE
	TAD	RF.FEL,X	/FREE ENTRY SLOT.
	DAC*	(X10)
/
	LAC	RFFNM1		/STORE THE FILE NAME.
	DAC*	X10
	LAC	RFFNM2
	DAC*	X10
	LAC	RFFEXT		/STORE THE FILE NAME EXTENSION.
	DAC*	X10
	LAC	RF.FES,X	/STORE THE FILE'S STARTING BLOCK NUMBER.
	DAC*	X10
	LAC	RFFSIZ		/STORE THE FILE SIZE (NUMBER OF BLOCKS)
	TAD	(400000)	/AND SET BIT 0=1 TO INDICATE THAT THIS
	DAC*	X10		/IS A RANDOM RATHER THAN A SEQUENTIAL
				/ACCESS FILE.
	LAC	RFACT1		/STORE THE TWO WORDS OF ACCOUNTING
	DAC*	X10		/INFORMATION.
	LAC	RFACT2
	DAC*	X10
/
/ COMPUTE THE DATE AS IS DONE FOR DOS-15.
/
	CLQ			/STORE THE DATE IN THE FORM: MM/DD/YY,
				/WHERE YY=0 FOR 1970.
	.INH
	LAC*	(YEAR
	AAC	-106
	AND	(77
	DAC	RFTMP1
	LAC*	(MONTH
	AND	(77
	PAL
	LAC*	(DAY
	.ENB
	AND	(77
	CLQ
	LRS	6
	PLA
	LRS	6
	LACQ
	TAD	RFTMP1
	DAC*	X10
/
	.EJECT
/ WRITE THE UFD BLOCK ONTO THE DISK.
/
RFREWR	JMS*	RFPTBL		/(EFFECTIVELY, ALL ACTIVE REGISTERS ARE
				/ALTERED -- THE XR IS LEFT POINTING AT
				/THE FILE BUFFER).
	JMP	RFDKER		/#/ RETURN HERE, IF AN ERROR OCCURRED, WITH
				/THE ERROR CODE IN THE AC.
				/RETURN HERE IF NO ERROR OCCURRED.
/
/ RETURN THE PLATTER NUMBER AND DISK ADDRESS CORRESPONDING TO THE START-
/ ING BLOCK OF THE FILE IN WORDS CTB+7 AND CTB+10 OF THE CONTROL TABLE.
/
RFDONE	LAC	RFCTAB		/SET THE XR TO POINT AT THE CONTROL TABLE.
	JMS	RFADJX
	.IFUND %RF15
	LAC*	RFUNIT
	CLL
	ALS	17
	DAC	RFTMP1
	.ENDC
	CLL			/COMPUTE THE PLATTER #.
	LAC	RFSTBL
	AND	(377777)
	.IFDEF %RF15
	LRS	12
	DAC	7,X
	LAC	RFSTBL		/COMPUTE THE DISK ADDRESS.
	AND	(1777)
	ALS	10
	.ENDC
	.IFUND %RF15
	LMQ
	LLSS!ECLA 10
	XOR	RFTMP1		/XOR IN THE UNIT NO.
	DAC	7,X
	LACQ
	.ENDC
	DAC	10,X
/
	LAC	RFERCD		/DID AN ERROR OCCUR?
	SZA
	JMP	RFDKER		/#/ YES.
	CLA!IAC			/NO -- I/O REQUEST COMPLETED. SET THE
	JMP*	RFSREV		/REQUESTER'S EVENT VARIABLE TO +1.
/
/ ERRORS.
/
RFXPER	LAW	-30		/CONTROL TABLE DOESN'T LIE WITHIN THE TASK.
	SKP
RFUIDR	LAW     -33		/UNINITIALIZED DIRECTORY OR DISMOUNTED DISK
	SKP
RFIFNM	LAW	-53		/ILLEGAL FILE NAME OR EXTENSION.
	SKP
RFFLOP	LAW	-54		/FILE OPEN ELSEWHERE.
	SKP
RFNOTR	LAW	-57		/CAN'T "CREATE" WHEN A SEQUENTIAL FILE
	SKP			/OF THE SAME NAME EXISTS.
RFSZER	LAW	-62		/RANDOM ACCESS FILE SIZE ERROR -- RE-
				/QUESTED SIZE IS NEGATIVE OR GREATER
				/THAN 777 OCTAL BLOCKS.
RFDKER	JMP*	RFSREV		/SET REQUESTER'S EVENT VARIABLE.
	.TITLE *** DIRECTORY SEARCH SUBROUTINE
/
/ SUBROUTINE RFSRCH -- A UFD BLOCK IS IN THE FILE DATA BUFFER. SEARCH
/ THE BLOCK FOR A FREE FILE ENTRY SLOT AND ALSO FOR THE FILE NAME IN
/ QUESTION.
/
/ CALLING SEQUENCE:
/
/	XR POINTING AT THE FILE BUFFER
/	JMS	RFSRCH
/	(UNCONDITIONAL RETURN)
/
/ THE CALLER MUST INITIALIZE THE FREE-ENTRY-FOUND FLAG (RF.FEF) AND
/ THE OLD-FILE-ENTRY-FOUND FLAG (RF.OFF) IN THE FILE BUFFER AS
/ APPROPRIATE.
/
/ ALTERED REGISTERS:
/
/	X10, LR, AC & RF.CNT
/
RFSRCH	0
	LAW	-37		/NUMBER OF FILE ENTRIES PER UFD BLOCK.
	DAC	RF.CNT
	DZM	RF.REL		/RELATIVE POSITION WITHIN THE BLOCK.
	JMS	RFDBFA		/PREPARE AUTOINDEX REGISTER 10 TO
	AAC	-1		/SCAN THROUGH THE DATA BLOCK (UFD).
/
RFSRCL	DAC*	(X10)
	PAL			/SAVE TEMPORARILY.
	LAC*	X10		/FIRST HALF OF FILE NAME MATCH?
	SAD	RF.FN1,X
	SKP
	JMP	RFSRFE		/NO -- TRY FOR FREE ENTRY.
	LAC*	X10		/YES -- SECOND HALF MATCH?
	SAD	RF.FN2,X
	SKP
	JMP	RFSRCE		/NO.
	LAC*	X10		/YES -- EXTENSION MATCH?
	SAD	RF.EXT,X
	SKP
	JMP	RFSRCE		/NO.
/
/ OLD FILE ENTRY FOUND -- RECORD ITS LOCATION AND TYPE.
/
	LAC	RF.BLK,X	/NUMBER OF THE CURRENT UFD BLOCK.
	DAC	RF.OFB,X
	LAC	RF.REL		/RELATIVE LOCATION WITHIN THE BLOCK.
	DAC	RF.OFL,X
	LAC*	X10		/BIT 0 = 1 INDICATES A TRUNCATED FILE AND
	DAC	RF.OFS,X	/BITS 1-17 = THE STARTING BLOCK NUMBER.
RFL002	LAW	-1		/[USED AS A LITERAL].
	DAC	RF.OFF,X	/SET FLAG TO INDICATE "OLD FILE FOUND".
	JMP*	RFSRCH
/
/ TEST FOR FREE ENTRY IN UFD.
/
RFSRFE	SZA			/ENTRY = 0?
	JMP	RFSRCE		/NO -- NOT A FREE ENTRY.
	LAC	RF.FEF,X	/YES -- HAS A FREE ENTRY ALREADY BEEN FOUND?
	SZA
	JMP	RFSRCE		/YES.
	LAC*	X10		/NO -- WORD 2 = 0?
	SZA!CLC
	JMP	RFSRCE		/NO -- NOT A FREE ENTRY.
	SAD*	X10		/YES -- WORD 3 = 0?
	JMP	RFSRCE		/NO -- NOT A FREE ENTRY.
/
/ FREE FILE ENTRY FOUND -- RECORD ITS LOCATION.
/
	LAC	RFUFDB		/GET THE UFD BLOCK
	DAC	RF.FEF,X	/SET THE FLAG TO INDICATE "FREE FILE
				/ENTRY FOUND".
	LAC	RF.BLK,X	/NUMBER OF THE CURRENT UFD BLOCK.
	DAC	RF.FEB,X
	LAC	RF.REL		/RELATIVE POSITION WITHIN THE UFD BLOCK.
	DAC	RF.FEL,X
/
/ MOVE TO THE NEXT UFD FILE ENTRY AND TEST FOR THE END OF THE BLOCK.
/
RFSRCE	ISZ	RF.CNT		/END OF UFD BLOCK?
	SKP			/NO.
	JMP*	RFSRCH		/YES -- RETURN.
	LAC	RF.REL		/UPDATE THE RELATIVE FILE ENTRY LOCATION.
	AAC	+10
	DAC	RF.REL
	PLA			/UPDATE AUTOINCREMENT REGISTER 10 FOR
	AAC	+10		/THE NEXT ENTRY.
	JMP	RFSRCL
	.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 A NODE TO THE POOL OF EMPTY NODES.
/
/ CALLING SEQUENCE:
/
/	NODE ADDRESS IN THE AC
/	JMS	RFRTND
/	(UNCONDITIONAL RETURN)
/
/ ALTERED REGISTERS:
/
/	R2, R6, XR & AC
/
RFRTND	0
	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 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
/
/
/
/
/
/ SUBROUTINE RFDBFA -- COMPUTE THE ADDRESS OF THE FILE DATA BUFFER.
/
/ CALLING SEQUENCE:
/
/	XR POINTING AT THE FILE BUFFER
/	JMS	RFDBFA
/	(UNCONDITIONAL RETURN)
/
/ ALTERED REGISTERS:
/
/	AC
/
RFDBFA	0
	PXA
	TAD	RFPAGE
	TAD	(RF.DAT)
	JMP*	RFDBFA
/
	.EJECT
/ SUBROUTINE RFZERO -- CLEAR A SPECIFIED AREA OF CORE.
/
/ CALLING SEQUENCE:
/
/	STARTING ADDRESS IN THE AC
/	JMS	RFZERO
/	TWOS COMPLEMENT WORD COUNT
/	(UNCONDITIONAL RETURN)
/
/ ALTERED REGISTERS:
/
/	X10, RFTMP1 & AC
/
RFZERO	0
	AAC	-1		/PREPARE AUTOINDEX REGISTER 10 WITH THE
	DAC*	(X10)		/FIRST ADDRESS MINUS 1.
	LAC*	RFZERO		/PICK UP THE WORD COUNT.
	DAC	RFTMP1
	DZM*	X10		/ZERO CORE.
	ISZ	RFTMP1
	JMP	.-2
	IDX	RFZERO
	JMP*	RFZERO
	.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.
/
/ 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=22		/START OF 400 OCTAL WORD FILE DATA BLOCK.
	.TITLE *** VARIABLES AND CAL PARAMETER BLOCKS
/
/ VARIABLES.
/
RFCTAB	0			/ADDRESS OF THE "CREATE" CONTROL TABLE.
RFFNM1	0			/1ST HALF OF FILE NAME IN .SIXBT.
RFFNM2	0			/2ND HALF OF FILE NAME IN .SIXBT.
RFFEXT	0			/FILE NAME EXTENSION IN .SIXBT.
RFFSIZ	0			/DESIRED FILE SIZE (# OF 256-WORD BLOCKS).
RFSIZE	0			/ACTUAL FILE SIZE (# OF 256-WORD BLOCKS).
RFACT1	0			/ACCOUNTING INFORMATION (# OF RECORDS).
RFACT2	0			/ACCOUNTING INFORMATION (# OF WORDS PER RECORD).
RFUPDT	0			/0=DON'T UPDATE; NON-0=UPDATE ACCOUNTING INFO.
RFSTBL	0			/FILE'S STARTING BLOCK NUMBER.
RFIOEV	0			/I/O EVENT VARIABLE.
RFTMP1	0			/TEMPORARY STORAGE.
RFTMP2	0
RFPAGE	0			/PAGE ADDRESS BITS FOR THE PAGE IN WHICH
				/THIS CODE IS LOCATED.
RFXADJ	0			/INDEX REGISTER ADJUSTMENT FACTOR (SEE
				/INITIALIZATION CODE IN RESIDENT SECTION
				/FOR AN EXPLANATION). C(RFXADJ) = -C(RFPAGE).
RF.CNT	0			/COUNTER.
RF.REL	0			/RELATIVE POSITION WITHIN UFD BLOCK.
RFERCD	0			/TEMPORARY STORAGE FOR THE ERROR CODE.
RFUFDB	0			/UFD START BLOCK
/
/ CAL PARAMETER BLOCKS AND CONTROL TABLES.
/
RFACPB	11500			/"ALLOCATE" DISK STORAGE CPB.
	RFIOEV
	1			/LUN 1 = RF DISK I/O DRIVER.
	RFALWC			/CONTROL TABLE ADDRESS.
	.IFDEF %RF15		/DEVICE CODE
	2
	.ENDC
	.IFDEF %RP02
	3
	.ENDC
	.IFDEF %RK05
	24
	.ENDC
/
RFALWC	0			/# OF WORDS DESIRED.
RFPLAT	0			/PLATTER #.
RFDADR	0			/DISK ADDRESS.
/
RFWAIT	20			/"WAITFOR" CPB.
	RFIOEV
/
	.END