/******* 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 / 77 / RETURN /ERROR IF T THE DATAFIELD IS RESTO /INPUT FORMAT: / "D^S 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. FIXTAB /THE FOLLOWING VARIABLES DISB=ZTEM1 /STARTING BLOF ADDITIONAL INFORMATIO/COUNTS # OF ENTRIES IN 14 /TEMPORARY COUNTER FOR COMPARISON /AUTO15 'RUNS' IN FILENAME FIELD;AUTO16 IN THIS FIELD *200 "D^100+"I&3777 /NAME 600 /3 PAGES;NO CONNECTS DIDTV /RELOCATED POINTER DIDTV, 1 /DUMMY FOR TRANSFER VECTOR 400 /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 DINAME, 0 JMP DIE DCA DISLOT JMS MONI WAIT DISLOT, 0/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 #6 /LINK TO NEXT SEGMENT /DONOT LOOK AT TENTATIV-# OF EXTRA WORDS FOR EAXTRA /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 ? 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 TTING BLK DCA DISB DI4IES DONE? JMP DI3 /N;NK /BUT ALL SEGMENTS DON/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 ZBLOCK 400 /THE SEGMENT BUFFE