File: DI.TK of Disk: Disks/MyPDP/m8-blue-rka1-rkb1
(Source file text) 

/******* MULTI8 DIRECTORY SEARCHER *******
/
/NAME: 	"D^100+"I&3777
/LENGTH:ONE PAGE + TWOPAGE BUFFER
/FUNCTION:THE MODULE SEARCHES THE OS8 DIRECTORY OF
/	THE SPECIFIED DEVICE FOR THE SPECIFIED FILE-
/	NAME. IT THEN RETURNS THE LENGTH OF THE
/	FILE AND THE POSITION OF ITS FIRST BLOCK.
/CONCEPT:THIS MODULE HAS A ONE BLOCK BUFFER TO TRANSFER
/	THE SUCCESSIVE DIRECTORY SEGMENTS INTO. IT THEN
/	SEARCHES THESE SEGMENTS FOR A MATCH WITH THE
/	ENTERED FILENAME, ACCORDING TO THE RULES OF OS8.
/	IT ALSO ACCOUNTS FOR DIRECTORIES WITH MORE THAN
/	ONE EXTRA WORD PER ENTRY. THE NEXT SEGMENT IS
/	COMPUTED FROM THE SEGMENT 'LINK'.
/	PART OF THE FILENAME IS OVERWRITTEN.SEE FORMAT.
/ERRORS:1) DISK TRANSFER ERROR OR DISKQ FULL.
/	2) NAME NOT FOUND IN DIRECTORY
/	3) THE MODULE IS BUSY FOR SOMEONE ELSE.
/TASK CIRCULATION:BETWEEN TRANSFERS
/SUBROUTINES USED:CDTOIF
/USE:
/	CDF FIELD OF 'FILENAME'
/	TAD (POINTER TO INPUT DATA
/	JMS MONITOR
/	   CALL
/	   "D^100+"I&3777
/	RETURN		/ERROR IF AC UNEQUAL 0
/	NOTE THAT THE DATAFIELD IS RESTORED AND THUS AS BEFORE.

/INPUT FORMAT:
/	"D^100+"K&3777	/NAME OF MASS STORAGE DRIVER
/	1		/UNIT #
/	FI;LE;NA;ME	/AS IN OS8

/OUTPUTFORMAT:
/	"NAME"		/UNCHANGED
/	-LENGTH		/-NUMBER OF BLOCKS 
/	0
/	STARTING BLOCK#	/FIRST BLOCK OF THE FILE.
/THE FOLLOWING VARIABLES CAN BE SHARED IN PAGE 0
DISB=ZTEM1	/STARTING BLOCK #
DIEXTRA=ZTEM2	/# OF ADDITIONAL INFORMATION WORDS
DISEGCNT=ZTEM3	/COUNTS # OF ENTRIES IN THIS SEGMENT
DICNT=AUTO14	/TEMPORARY COUNTER FOR COMPARISON
/AUTO15 'RUNS' IN FILENAME FIELD;AUTO16 IN THIS FIELD

	"D^100+"I&3777	/NAME
	600		/3 PAGES;NO CONNECTS
	DIDTV		/RELOCATED POINTER
DIDTV,	1		/DUMMY FOR TRANSFER VECTOR
	DIRBUF		/RELOCATED POINTER TO BUFFER
DILNK,	0		/CONTENT OF SEGMENT LINK;ALSO BLOCK#

/THE MODULE IS ENTERED ONLY ONCE AND THEN DISAPPEARS OUT
/OF CORE. SO SOME CODE IS ONCE ONLY!
/NOTE THE OVERLAP OF TRANSFERVECTOR AND MODULE HEADER.

DIR,	DCA DIBLKL	//SAVE PNTR
	TAD I DIBLKL	//
	DCA DINAME	//NAME OF MASS STORAGE DRIVER
	ISZ DIBLKL	//
	TAD I DIBLKL	//GET UNIT #
	AND C7		//YOU NEVER KNOW !
	RIF		//SET UP CORRECT FIELD FOR TRANSFER
	TAD (200	//READ;ONE BLOCK
	DCA DIDTV	//
	TAD I ZMYCDF	/REMEMBER CALLER'S FIELD
	DCA DICDF	//
	TAD DICDF	//COPY A FEW MORE TIMES
	DCA DICDF2	//
	TAD DICDF	//
	DCA DIRET	//
	ISZ DILNK	//BEGIN WITH FIRST SEGMENT
DI2,	TAD DIDTV+1	//PTR FOR SEARCH IN DIRECTORY
	DCA DIPTR	//
	CDTOIF
	TAD DIDTV-1	/DO THE TRANSFER
	JMS MONITOR
	  CALL
DINAME,	   0
	 JMP DIERR	/DRIVER NOT AVAILABLE
	DCA DISLOT
	JMS MONITOR	/WAIT FOR COMPLETION
	   WAIT
DISLOT,	   0
	SZA CLA
	 JMP DIERR	/TRANSFER ERROR
/NOW PICK UP ALL SPECIALS FROM THIS SEGMENT
	CDTOIF
	CLA CMA		/SET AUTOINDEX
	TAD DIDTV+1
	DCA AUTO16
	TAD I AUTO16	/-# OF ENTRIES IN THIS SEGMENT
	DCA DISEGCNT
	TAD I AUTO16	/STARTING BLK #
	DCA DISB
	TAD I AUTO16	/LINK TO NEXT SEGMENT
	DCA DILNK
	ISZ AUTO16	/DONOT LOOK AT TENTATIVE FILES
	TAD I AUTO16	/-# OF EXTRA WORDS FOR EACH ENTRY
	CIA
	DCA DIEXTRA
/HERE COMES THE ACTUAL SEARCH THROUGH THE SEGMENT
DI3,	TAD (-4		/SET UP COUNTER
	DCA DICNT
	TAD DIBLKL	/AND POINTER TO  FILENAME
	DCA AUTO15
DI6,	TAD I AUTO16	/FETCH ENTRY
	SNA		/IS IT <EMPTY>?
	 JMP DI8	/Y
DI10,	CIA		/N;COMPARE
DICDF,	 0		/CDF TO FILENAME
	TAD I AUTO15	//
	CDTOIF
	SZA CLA
	 JMP DI7	/NO MATCH:GO TO NEXT ENTRY
	ISZ DICNT	/ALL 4 MATCHED?
	 JMP DI9	/NOT YET
/THE FILENAME IS FOUND;MOVE AUTO16 TO LENGTH
/AND TRANSFER ALSO STARTING BLOCK#
DIMATCH,TAD AUTO16	/AUTO16=AUTO16+DIEXTRA
	TAD DIEXTRA
	DCA AUTO16
	TAD DIBLKL	/GO PAST DRIVER'S NAME
	DCA AUTO15
	TAD I AUTO16	/-# OF OS8 BLOCKS
	SNA		/IF THE LENGTH IS ZERO, THIS IS
	 JMP DI4	/JUST AN ENTERED FILE.
DICDF2,	 0
	DCA I AUTO15	//
	DCA I AUTO15	//
	TAD DISB	//
	DCA I AUTO15	//
	JMP DIRET	//

DI9,	TAD I AUTO16	/NEXT ITEM
	JMP DI10
DI7,	TAD DICNT	/AUTO16=AUTO16-DICNT-1+DIEXTRA
	CMA
	TAD DIEXTRA
	TAD AUTO16
	DCA AUTO16
DI8,	TAD I AUTO16	/FETCH LENGTH OF FILE
	CIA
	TAD DISB	/AND ADD TO STARTING BLK
	DCA DISB
DI4,	ISZ DISEGCNT	/ALL ENTRIES DONE?
	 JMP DI3	/N;SEARCH FURTHER
	TAD DILNK	/BUT ALL SEGMENTS DONE?
	SZA CLA
	 JMP DI2	/N;FETCH NEXT SEGMENT
DIERR,	CLA CMA		/ERROR CODE
DIRET,	CDF		/OVERLAID
	JMS MONITOR
	   EXIT+SWPOUT

DIBLKL,	0		/PNTR TO 'FILENAME'
DIPTR,	0		/PNTR WITHIN THE SEGMENT

PAGE

DIRBUF=.	/THE SEGMENT BUFFER
BUFEND=.+377
$$$$