`L i=L\Ʃx ? N'i  ͭЅ?0ȱ Ѕ?iȱi lԠԠ͠ԠϠŠͮŠ SYSTEM.APPLE   L$JN^֢FCAT.TEXTr=vgFCAT.CODEr=vgF JIM.DOC.TEXTvgFPSCAL17 FIRSTPART.TEXTg֢FIRSTPART.CODEg֢. MAINCAT.CODEvg.P MAINCAT.TEXTvgPd CATALOG.CODEvgdh JOHN.DOC.TEXTvgh| CAT3.TEXTr=vgF| CAT1.TEXTr=vgF CAT2.TEXTr=vg&꽌ɪɖ'*&%&,E'зЮ꽌ɪФ`+*xH&x'8*7Ixix&&  ') + &п x) ++`FG8`0($ p,&") (jJJ>L+ "?I>  N `  ` x V Nx .x- z `V0^*^*>` aI꽌ɪVɭ&Y&&Y& 꽌ɪ\8`& (*$S+*)  UNIT FIRSTPART;   INTERFACE (*RATHER SLOPPY-INCLUDES ALL MAIN PROGRAM VARIABLES*)   CONST  "BLANKS=' '; "MAXREC=200; "MAXREC1=201; "NFILENAME='#5:MASTCAT.DATA'; "OFILENAME='#5:BACKCAT.DATA'; "PFILENAME='#5:CAT.POIFILE TYPE TO CONSOLE OR PRINTER *)   BEGIN  CASE FILEKIND OF "XDISK: WRITE(P,'BAD BLOCK'); "CODE: WRITE(P,'CODE FILE'); "TEXT: WRITE(P,'TEXT FILE'); "INFO: WRITE(P,'INFO FILE'); "DATA: WRITE(P,'DATA FILE'); "GRAF: WRITE(P,'GRAF FILE'); "FOTWRITE(P,'JUN'); &7: WRITE(P,'JUL'); &8: WRITE(P,'AUG'); &9: WRITE(P,'SEP'); &10: WRITE(P,'OCT'); &11: WRITE(P,'NOV'); &12: WRITE(P,'DEC'); $END; $WRITE(P,'-',YEAR:2,' ':3); "END;  END; (* PRINTDATE *)    PROCEDURE PRINTKIND;   (* PRINTS  PROCEDURE PRINTDATE ;   (* PRINTS DATE TO CONSOLE OR PRINTER *)   BEGIN "WITH REC DO "BEGIN $WRITE(P,DAY:3,'-'); $CASE MONTH OF &1: WRITE(P,'JAN'); &2: WRITE(P,'FEB'); &3: WRITE(P,'MAR');  4: WRITE(P,'APR'); &5: WRITE(P,'MAY'); &6: e to be removed-->'); $READLN(VOL); "UNTIL (LENGTH(VOL)<=8); "IF (POS(':',VOL)<>0) THEN DELETE(VOL,POS(':',VOL),1); "SPS:=COPY(BLANKS,1,7-LENGTH(VOL)); "VOL:=CONCAT(VOL,SPS); "WRITELN(VOL,':'); "DREC:=0 "  END; (* ENTERVOLNAME *)        BEGIN "RESET(DEXFILE,PFILENAME); "DEXRAY:=DEXFILE^; "GET (DEXFILE);  CLOSE (DEXFILE);  END;  "  PROCEDURE ENTERVOLNAME;  VAR SPS:VOLID;   BEGIN  "VOL:=' '; "REPEAT $WRITE(CHR(CLEARSCREEN)); $WRITE('Enter name of volum "UNITREAD(4,DIR[0],2048,2); "VOL:=DIR[0].DIRVOLNAME; "SPS:=COPY(BLANKS,1,7-LENGTH(VOL)); "AVOL:=CONCAT(VOL,SPS);  END;    PROCEDURE READDEX;   "(* READS THE FILE OF POINTERS TO THE FIRST OCCURRENCE *) "(* OF EACH LETTER IN THE ALPHABET *)  PROCEDURE MEM; !  BEGIN "WRITELN('Memory available at Procedure ',PN, ' = ',MEMAVAIL);  END;    PROCEDURE GETSYSVOL;   (* SETS NAME OF VOLUME IN DRIVE 4 *)   VAR "I,J: INTEGER; "SPS: STRING[16]; "AVOL:VOLID; "DIR: DIRECTORY; "  BEGIN PROCEDURE PRINTRECORD(CAT1:CATALOGRECORD);  PROCEDURE RENAME(OLD,NEW: FILEID );  %  IMPLEMENTATION  %    PROCEDURE WAIT; "  BEGIN "GOTOXY(0,0 ); "WRITE(' Press space bar to continue '); "READ (CH)  END;   F CATALOGRECORD; #NCAT,OCAT: CATARRAY; #  PROCEDURE WAIT;  PROCEDURE MEM(PN:STRING);  PROCEDURE GETSYSVOL(VAR VOL:VOLID);  PROCEDURE READDEX;  PROCEDURE ENTERVOLNAME;  PROCEDURE PRINTDATE(REC:DATERECORD);  PROCEDURE PRINTKIND(FILEKIND:FILETYPE); 0..2047; #REMOV,NFILEEND,OFILEEND,DONE: BOOLEAN; #CH:CHAR; #DEX: INDEX; #DEXRAY: INDEXARRAY; #DEXFILE: FILE OF INDEXARRAY; #P: FILE OF CHAR; (*USED TO SWITCH FROM CONSOLE TO PRINTER*) #VOL,TEST,SYSTEMVOLUME:VOLID; #CATFILE,OCATFILE,NCATFILE: FILE O#DIRECTORY=ARRAY[DIRSIZE] OF DIRRECORD; #CATARRAY=ARRAY [0..MAXREC] OF CATALOGRECORD; #FILEN=STRING[20]; #RECNUM=0..MAXREC1; #INDEX='A'..'Z'; #INDEXARRAY=ARRAY [INDEX] OF INTEGER; #  VAR #NREC,NLREC,OREC,OLREC,DREC,DLREC:RECNUM; #NTOTREC,OTOTREC:(DIRFILENAME:FILEID; (LASTBYTE:1..512; (DIRFILEDATE:DATERECORD) %END; # #CATALOGRECORD=PACKED RECORD %VOLNAME: VOLID; %FILENAME:FILEID; %FILEKIND:FILETYPE; %FILEDATE:DATERECORD; %FILESIZE:0..988; #END; # % "DIRRECORD=RECORD $FIRSTBLOCK: INTEGER; $LASTBLOCK: INTEGER; $CASE DIRFILEKIND: FILETYPE OF &SECUREDIR,UNTYPED: ((DIRVOLNAME:VOLID; )ZEROBLOCK, )NUMOFFILES, )TOTALBLOCKS:INTEGER; )LASTBOOT:DATERECORD); &XDISK,CODE,TEXT,INFO,DATA, &GRAF,FOTO: (NT.DATA'; "CLEARSCREEN=12; "  TYPE  "DATERECORD=PACKED RECORD $MONTH: 0..12; $DAY: 0..31; $YEAR: 0..100 "END;  "DIRSIZE=0..77; "VOLID=STRING[7]; "FILEID=STRING[15]; "FILETYPE=(UNTYPED,XDISK,CODE,TEXT, $INFO,DATA,GRAF,FOTO,SECUREDIR); O: WRITE(P,'FOTO FILE');  END;  END;    PROCEDURE PRINTRECORD;   (* PRINTS RECORD TO CONOSE OR PRINTER *)   BEGIN "WITH CAT1 DO  BEGIN $WRITE(P,FILENAME,' ':18-LENGTH(FILENAME)); $WRITE(P,VOLNAME,' ':8-LENGTH(VOLNAME)); $WRITE(P,FILESIZE:4); " PRINTDATE(FILEDATE); $PRINTKIND(FILEKIND); $WRITELN(P); "END;  END;  PROCEDURE RENAME; (*CHANGES NAME OF MASTCAT.DATA TO BACKCAT.DATA *) " "VAR I:INTEGER; (SPS: STRING[16]; (VOL,AVOL: VOLID; (DIR: DIRECTORY; ( "BEGצ/ Press space bar to continue TتPצMemory available at Procedure  = ( RdM M צ Ƅ PROCEDURE PRINTRECORD(CAT1:CATALOGRECORD);  PROCEDURE RENAME(OLD,NEW: FILEID );  %  IMPLEMENTATION E NDEXARRAY; #P: FILE OF CHAR; (*USED TO SWITCH FROM CONSOLE TO PRINTER*) #VOL,TEST,SYSTEMVOLUME:VOLID; #CATFILE,OCATFILE,NCATFILE: FILE OF CATALOGRECORD; #NCAT,OCAT: CATARRAY; #  PROCEDURE WAIT;  PROCEDURE MEM(PN:STRING);  PROCEDURE GETSYSVOL(VAR VOL:VOLID);  PROCEDURE READDEX;  PROCEDURE ENTERVOLNAME;  PROCEDURE PRINTDATE(REC:DATERECORD);  PROCEDURE PRINTKIND(FILEKIND:FILETYPE); 0..2047; #REMOV,NFILEEND,OFILEEND,DONE: BOOLEAN; #CH:CHAR; #DEX: INDEX; #DEXRAY: INDEXARRAY; #DEXFILE: FILE OF INDEXARRAY; #P: FILE OF CHAR; (*USED TO SWITCH FROM CONSOLE TO PRINTER*) #VOL,TEST,SYSTEMVOLUME:VOLID; #CATFILE,OCATFILE,NCATFILE: FILE O#DIRECTORY=ARRAY[DIRSIZE] OF DIRRECORD; #CATARRAY=ARRAY [0..MAXREC] OF CATALOGRECORD; #FILEN=STRING[20]; #RECNUM=0..MAXREC1; #INDEX='A'..'Z'; #INDEXARRAY=ARRAY [INDEX] OF INTEGER; #  VAR #NREC,NLREC,OREC,OLREC,DREC,DLREC:RECNUM; #NTOTREC,OTOTREC:DIRFILEDATE:DATERECORD) %END; # #CATALOGRECORD=PACKED RECORD %VOLNAME: VOLID; %FILENAME:FILEID; %FILEKIND:FILETYPE; %FILEDATE:DATERECORD; %FILESIZE:0..988; #END; # % -$LASTBLOCK: INTEGER; $CASE DIRFILEKIND: FILETYPE OF &SECUREDIR,UNTYPED: ((DIRVOLNAME:VOLID; )ZEROBLOCK, )NUMOFFILES, )TOTALBLOCKS:INTEGER; )LASTBOOT:DATERECORD); &XDISK,CODE,TEXT,INFO,DATA, &GRAF,FOTO: ((DIRFILENAME:FILEID; (LASTBYTE:1..512; ("DATERECORD=PACKED RECORD $MONTH: 0..12; $DAY: 0..31; $YEAR: 0..100 "END;  "DIRSIZE=0..77; "VOLID=STRING[7]; "FILEID=STRING[15]; "FILETYPE=(UNTYPED,XDISK,CODE,TEXT, $INFO,DATA,GRAF,FOTO,SECUREDIR); "DIRRECORD=RECORD $FIRSTBLOCK: INTEGER;  (*RATHER SLOPPY-INCLUDES ALL MAIN PROGRAM VARIABLES*)   CONST  "BLANKS=' '; "MAXREC=200; "MAXREC1=201; "NFILENAME='#5:MASTCAT.DATA'; "OFILENAME='#5:BACKCAT.DATA'; "PFILENAME='#5:CAT.POINT.DATA'; "CLEARSCREEN=12; "  TYPE  BB FIRSTPAR "END; (*RENAME*)  # %     BEGIN (* NULL INITIALIZATION SECTION *)  END. (* FIRSTPART UNIT *)   IN " "UNITREAD(5,DIR[0],2048,2); "VOL:=DIR[0].DIRVOLNAME; "SPS:=COPY(BLANKS,1,7-LENGTH(VOL)); "AVOL:=CONCAT(VOL,SPS); "FOR I:=1 TO DIR[0].NUMOFFILES DO $WITH DIR[I] DO &IF (DIRFILENAME=OLD) (THEN DIRFILENAME:=NEW; "UNITWRITE(5,DIR[0],2048,2); "  ̄ƄƄƄ"h#5:CAT.POINT.DATA@ ת צ%Enter name of volume to be removed-->ȡ:ץˡצ:צ :ب -JANצFEBMARצAPRMAYצJUNJ T.POINT.DATAצThere is no file named #5:CAT.POINT.DATAצ on this diskDo you want to create a #5:CAT.POINT.DATAצ (Y/N)@@Yy˄AAZZAŹGʁGȡAZAצ#5:CAT.POINT.DATAإצ#5:CAT.POINT.DATA Written to disk IצFile #5:CAT.POINT.DATAצ existsQƁ-#5:CAT.POINT.DATAצThere is no file named #5:CAT.POINT.DATAצ on this diskDo you want to create a #5:CAT.POINT.DATAצ (Y/N)@@hCr`S "$&(*,.02468:<>@DFHJLNPRTVXZ\c The file צ#5:MASTCAT.DATA already exists on this volume fj~ תʋɢצ ʋɢ ʋɢ  ʋɢ ʋɢ  dʋɢ ̋ʋȡArray is filled צ#5:MASTCAT.DATA̋ʋȡ   eate a new צ#5:MASTCAT.DATA or Q)uit ?#5:BACKCAT.DATA#צ BACKCAT.DATA MASTCAT.DATA צFILLING ARRAY[0]̋ʋɦ תʋɢצ צ#5:MASTCAT.DATAThere is no file named צ#5:MASTCAT.DATA ON THIS DISK#5:BACKCAT.DATAe R)esurect Backup C)reate a new #5:MASTCAT.DATAצ Q)uit ?TצC)rBBB B*CATALOG FIRSTPARINIT1 INIT2  o Ƅ!Ƅ̄Ƅ!ƄƄ%M ̄ʄȡ(%M ̄ʄ  ʄ%M CH DTV t CODE FILEצ TEXT FILEr ICH DDEXRAY KDEXFILE -NS[DREC `P v .?P)@VOL  q!)?%M  Ƅ!Ƅ̄Ƅ!ƄƄ%M ̄ʄȡ(%M ̄ʄ  ʄ%M CH DTV t CODE FILEצ TEXT FILEr INFO FILE[צ DATA FILED GRAF FILE-צ FOTO FILEjU@+ ب    b  ٪ت%M !ULuצAUGdSEPSצOCTBNOV1צDEC  zk\M>/-  $F >عצ BAD BLOCK CODE FILEצ TEXT FILEr IYy˄AAZZAŹGʁGȡAZAצ#5:CAT.POINT.DATAإצ#5:CAT.POINT.DATA Written to disk IצFile #5:CAT.POINT.DATAצ existsQڪ " áN ˡFצ IORESULT FOR צ IS  ~ s""צ   á؂ 6 !..02 B "$&( á󓄡ȡȡ쥆[-"[á EצDELETE [[  ADD "" "M"[צDELETE [[ R AAZMɡMߢ[ !"ߢ[!!ߥ[!ߥ[!!ق!ō !ع"M Ƅ ʄ Ƅ ʄ ̄ Ƅ ʄ Ƅ ƃƄ ʄ ʄ M ʄ  M ʄ6 "ġd"š1AZAZá AZ"áAZAZá AZM̄ ʄ ƃʄ ʄ ƃ Ƅ ʄ Ƅ ʄ ̄ Ƅ ʄ Ƅ ƃƄ ʄ ʄ ʄ ʄ ʄ  ʄ ʄ ʄʄ  ̄ʃ̃M̄ ʄ ƃʄ צ FREE.SPACEƃצ ʃ0ʃ ̃̃ 45ʃM "ˡ'צUnit not onlineƃM ƃצ Ƅ ƃƄ ƃ̄ Ƅ ƃƄ ƃƄ ̃M ̄ ʃʄ ȡʃM ̄ ʄ šMM5MMMM.צ Done sorting$ ̄GETDIRצ,Enter unit number for required directory--> ƃ#5:MASTCAT.DATAצ NOT PRESENTq]\ pƁ-#5:CAT.POINT.DATAإ H Sorting   recordsġX"" ȡT""""" """"؄" OqצCONSOLE:ackup---> C)onsole P)rinter PpÍqPRINTER:qצCONSOLE:צ#5:MASTCAT.DATA q(The following files are not backed uppedq#5:MASTCAT.DATA؄,"  PqצCONSOLE:#5:MASTCAT.DATAצ not presentצMastercat contains  recordsq,  -B%Display--> C)onsole P)rinter PpÍqPRINTER:qצCONSOLE:צ#5:MASTCAT.DATA#5:MASTCAT.DATAȡ_Pá" Cá *ɡ"ǒ"٦ ת٢צ ٢ ٢  ٢ ٢  d٢ "ȡ)".  W      s[[צ   á؂    áxۓZɡ*ZȡAZAAZA  -Y[*0hf qCONSOLE:#5:BACKCAT.DATA%צ#5:BACKCAT.DATAצ MASTCAT.DATA BACKCAT.DATA 6 ̄̄ʄʄȡʄM ʄ̄#5:BACKCAT.DATA צ#5:BACKCAT.DATAצ#5:MASTCAT.DATA qצBACKCAT CONTAINS   RECORDSMASTERCAT CONTAINS RENAME: LOOKUP NEWCAT DISPLAY  :N^NFILEEND NCATFILENCAT "NREC NLREC NTOTREC  OFILEEND OCATFILEOCAT [OREC OLREC OTOTREC  P qUNTYPED TEXT SECUREDIREMOV TEST SYSTEMVOVOL XDISK  DEX DEXRAY DEXFILE +DREC DLREC DONE  INFO GRAF FOTO MAXREC1 NFILEEND NCATFILENCAT "NREC NLREC NTOTREC  OFILEEND OCATFILEOCAT [OREC OLREC OTOTREC  P qUNTYPED TEXT SECUREDIMAXREC CLEARSCR CH CATFILE  CODE DATA DEX DEXRAY DEXFILE +DREC DLREC DONE  INFO GRAF FOTO MAXREC1 PRTVXZ\^f q+ R+;F|  R4\   צMAIN9Catalog--> S)earch D)isplay B)ackup U)pdate R)emove Q)uit..𥂢7צ#INSERT SYSTEM DISK AND PRESS RETURNPáoBuhq &*,.02468:<>@DHJLN#5:MASTCAT.DATAצ#5:CAT.POINT.DATA    צ  צMAIN9Catalog--> S)earch D)isplay B)ackup U)pdate R)emove Q)uit? Ä ? Ą   ō٥ ؓ:FILE ? NOT FOUNDq  *쥂奅 Lq+W?ȡ ?P?š"צNAME TOO LONG צ RECORDS/( ??ȡ.?"ˡ" qdT צ ?:ײ? ? (*$S+*)   PROGRAM CATALOG;   (* WRITTEN BY EDWARD HEYMAN *)  (* 300 CENTER HILL ROAD *)  (* CENTERVILLE DELEWARE 19807 *)  (* DOCUMENTED IN BYTE, MAY, 1981*)  (* MINOR REVISIONS BY JOHN F. LONG ,6/81*)    USES (*$U#5:FIRSTPARTND; " "OREC:=I-1; "OTOTREC:=OTOTREC+OREC; "OFILEEND:=TRUE; "  END; (*READCAT *)   PROCEDURE WRITECAT;   (*WRITES NREC RECORDS TO NCATFILE *)   VAR I:RECNUM;   BEGIN "IF (NTOTREC=0) THEN WITH NCAT[0] DO "BEGIN $VOLNAME:=' '; $FIF ((OCAT[I].VOLNAME=' ')) THEN $BEGIN &OREC:=I-1; &OTOTREC:=OTOTREC+OREC; &OFILEEND:=TRUE; &EXIT(READOLDCAT); $END; $ $IF (I=OLREC) THEN $BEGIN &OREC:=I; &OTOTREC:=OTOTREC+I; &EXIT(READOLDCAT); $END; $ $I:=I+1; $GET (OCATFILE); " "E"NFILEEND:=TRUE;  END; (*NREADCAT *)   PROCEDURE READOLDCAT;   (* READS OREC RECORDS OR TO EOF FROM OCATFILE *)   VAR I:RECNUM;   BEGIN  "I:=1; "OREC:=0; "GET (OCATFILE); "WHILE (NOT EOF(OCATFILE)) DO "BEGIN $OCAT[I]:=OCATFILE^; $I=I-1; &NTOTREC:=NTOTREC+NREC; &NFILEEND:=TRUE; &EXIT(READNEWCAT); $END; $ $IF (I=NLREC) THEN $BEGIN &NREC:=I; &NTOTREC:=NTOTREC+I; &EXIT(READNEWCAT); $END; $I:=I+1; $GET(NCATFILE); "END; (* WHILE *) "NREC:=I-1; "NTOTREC:=NTOTREC+NREC; E READNEWCAT;   (* READS NREC RECORDS OR TO EOF FROM NCATFILE *)   VAR I:RECNUM;   BEGIN "I:=1; "NREC:=0; "GET(NCATFILE); "WHILE (NOT EOF (NCATFILE)) DO "BEGIN $NCAT[I]:=NCATFILE^; $IF ((NCAT[I].VOLNAME=' ')) $THEN $BEGIN &NREC:  "(*$I-*) " "RESET(CATFILE,FN); "IOR:=IORESULT; "CLOSE(CATFILE); # "(*$I+*) " "IF (IOR=0) $THEN LOOKUP:=TRUE $ELSE $BEGIN &LOOKUP:=FALSE; &IF (IOR<>10) THEN WRITELN('IORESULT FOR ',FN,' IS ',IOR);  END;  END; (*LOOKUP*)   PROCEDUR#CLOSE(DEXFILE,LOCK); #WRITELN(PFILENAME,' Written to disk ') !END (*IF *)  !ELSE WRITELN('File ',PFILENAME,' exists');  END; (* INIT2 *)   FUNCTION LOOKUP;  (* RETURNS TRUE IF FILENAME PRESENT, FALSE IF NOT *) !  VAR IOR:0..15;   BEGINe a ',PFILENAME,' (Y/N)'); #REPEAT %READ(CH) #UNTIL (CH IN ['Y','y','n','N']); #IF ((CH<>'Y') AND (CH<>'y')) THEN EXIT(CATALOG); #FOR DEX:='A' TO 'Z' DO DEXRAY[DEX]:=0; #REWRITE(DEXFILE,PFILENAME); #DEXFILE^:=DEXRAY; #PUT(DEXFILE); ');   END; (*INIT1*)     SEGMENT PROCEDURE INIT2;   VAR  "DEXFILE: FILE OF INDEXARRAY;   BEGIN   !IF NOT LOOKUP(PFILENAME) THEN !BEGIN #WRITELN('There is no file named ',PFILENAME,' on this disk'); #WRITELN('Do you want to creatRITE(CATFILE,NFILENAME); +FOR I:=0 TO MAXREC DO -BEGIN /CATFILE^:=CAT[I]; /PUT (CATFILE); -END; (*FOR I*) +CLOSE(CATFILE,LOCK) )END (*CASE C*) " END (*CASE*) $END (*IF*) $ "  ELSE WRITELN('The file ',NFILENAME,' already exists on this volume-WITH CAT[0] DO -BEGIN /VOLNAME:=' '; /FILENAME:=' '; /FILEKIND:=UNTYPED; /FILEDATE.MONTH:=0; /FILEDATE.DAY:=0; /FILEDATE.YEAR:=0; /FILESIZE:=0; -END; +FOR I:=1 TO MAXREC DO CAT[I]:=CAT[0]; +WRITELN('Array is filled'); +REWH OF & &'q', 'Q': EXIT(CATALOG); $ &'R','r' : ) )BEGIN +IF (LOOKUP ('#5:BACKCAT.DATA')) THEN -RENAME('BACKCAT.DATA','MASTCAT.DATA') & ELSE EXIT(CATALOG); )END; ) & &'C','c' : ' )BEGIN ) +WRITELN ('FILLING ARRAY[0]'); S DISK'); $IF (LOOKUP('#5:BACKCAT.DATA')) THEN &WRITELN('R)esurect Backup C)reate a new ',NFILENAME,' Q)uit ?') $ ELSE WRITELN('C)reate a new ',NFILENAME,' or Q)uit ?'); $REPEAT &READ(KEYBOARD,CH) $UNTIL (CH IN ['R','r','C','c','Q','q']); $CASE C.CODE*) FIRSTPART;  # %  FUNCTION LOOKUP(FN:FILEN):BOOLEAN;FORWARD;   SEGMENT PROCEDURE INIT1;   VAR " "I: RECNUM; "CAT: CATARRAY; "  BEGIN " "IF (NOT LOOKUP (NFILENAME)) THEN "BEGIN $WRITELN('There is no file named ',NFILENAME,' ON THILENAME:=' '; $FILEKIND:=UNTYPED; $FILEDATE.MONTH:=0; $FILEDATE.DAY:=0; $FILEDATE.YEAR:=0; $FILESIZE:=0; $NCATFILE^:=NCAT[0]; $PUT (NCATFILE); "END; " "FOR I:=1 TO NREC DO "BEGIN $NCATFILE^:=NCAT[I]; $PUT(NCATFILE); $WRITE('.'); "END; " "WRITELN; "NTOTREC:=NTOTREC+NREC; "NREC:=0; "IF DONE THEN CLOSE(NCATFILE,LOCK);  END; (*WRITECAT *)    PROCEDURE DISPLAY;   (* WRITES THE ENTIRE MASTCAT.DAT FILE  TO THE CONSOLE OR PRINTER*)   VAR I,LINENO:RETE('Enter unit number for required directory--> '); $READ(KEYBOARD,CH3); $WRITELN "UNTIL CH3 IN ['4','5']; "CASE CH3 OF $'4': UNITNUM:=4; $'5': UNITNUM:=5; "END (*CASE*); "UNITREAD(UNITNUM,DIRX[0],2048,2); (*READ DIRECTORY INTO ARRAY DIRX*) "IF IOLUME AND PUTS IT IN DCAT *)   VAR DIRX: DIRECTORY; %UNITNUM,I: INTEGER; %CH3,CHBUF: CHAR; %VOL: VOLID; %SPS: STRING[16]; %BLOCKSUSED: 0..988; %  BEGIN "BLOCKSUSED:=6; (*ASSUMES SINGLE DIRECTORIES*) "DREC:=0; "MEM('GETDIR'); "REPEAT $WRI&BEGIN (*EXCHANGE ROUTINE *) (BUF:=DCAT[I]; (DCAT[I]:=DCAT[I-1]; (DCAT[I-1]:=BUF; (FLAG:=FALSE; &END; $WRITE('.'); "UNTIL FLAG; " "WRITELN; "WRITELN('Done sorting');  END; (*SORT*)    PROCEDURE GETDIR;   (*READS DIRECTORY OF UPDATE V(*HOLDS RECORD DURING EXCHANGE*) &FLAG: BOOLEAN; (*FALSE IF AN EXCHANGE MADE DURING PASS*) &  BEGIN "WRITELN('Sorting ',DREC,' records'); "REPEAT $FLAG:=TRUE; $FOR I:=DREC DOWNTO 2 DO &IF (DCAT[I].FILENAME < DCAT[I-1].FILENAME) THEN DEXARRAY;   BEGIN "REWRITE(DEXFILE,PFILENAME); "DEXFILE^:=DEXRAY; "PUT(DEXFILE); "CLOSE(DEXFILE,LOCK);  END; (*WRITEDEX*)    PROCEDURE SORT;   (*SORTS THE DIRECTORY FILE IN ALPHABETICAL ORDER *)   VAR I:RECNUM; $ BUF:CATALOGRECORD; ACKUP*)    PROCEDURE UPDATE;   VAR DCAT: ARRAY[DIRSIZE] OF CATALOGRECORD; &RN: RECNUM; & "   PROCEDURE WRITEDEX;   (*WRITES A FILE OF POINTERS TO THE FIRST OCCURRENCE OF EACH "LETTER IN THE ALPHABET *) "  VAR DEXFILE: FILE OF IN&NCAT[0]:=NCAT[NREC]; &IF (NFILEEND AND UNBACK) THEN PRINTRECORD(NCAT[NREC]); $UNTIL NFILEEND; $CLOSE (NCATFILE); "END (* IF LOOKUP *) " "ELSE "BEGIN $REWRITE(P,'CONSOLE:'); $WRITELN(NFILENAME,'NOT PRESENT'); "END; "CLOSE(P); "WAIT;  END; (*BCAT; &FOR N:=1 TO NREC-1 DO (IF ((NCAT[N].FILENAME<>NCAT[N-1].FILENAME) AND *(NCAT[N].FILENAME<>NCAT[N+1].FILENAME)) *THEN PRINTRECORD(NCAT[N]); &PASS:=TRUE; &IF (NCAT[NREC].FILENAME<>NCAT[NREC-1].FILENAME) (THEN UNBACK:=TRUE; NAME)) THEN "BEGIN " WRITE(CHR(CLEARSCREEN)); $WRITELN(P,'The following files are not backed upped'); $RESET (NCATFILE,NFILENAME); $REPEAT $ IF (PASS AND UNBACK) THEN (IF (NCAT[0].FILENAME<>NCAT[1].FILENAME) (THEN PRINTRECORD(NCAT[0]); &READNEWBEGIN "PASS:=FALSE;UNBACK:=FALSE; "WRITE(CHR(CLEARSCREEN)); "WRITE('Backup---> C)onsole P)rinter '); "READ(KEYBOARD,CH1); "WRITELN; "IF (CH1='P') OR (CH1='p') THEN REWRITE(P,'PRINTER:') $ELSE REWRITE(P,'CONSOLE:'); "IF (LOOKUP(NFILE"WRITELN('Mastercat contains ',NTOTREC, 'records'); "CLOSE(P); "WAIT; "  END; (* DISPLAY *)     PROCEDURE BACKUP;   (*COMPARES FILE NAMES AND REPORTS FILES WITHOUT BACKUP *)   VAR PASS,UNBACK: BOOLEAN; 'N: RECNUM; 'CH1: CHAR; '  (NCAT[I]) *ELSE *BEGIN ,LINENO:=0; ,WAIT; * WRITE(CHR(CLEARSCREEN)); *END &END; $UNTIL NFILEEND; $CLOSE(NCATFILE); $WAIT; "END "ELSE $BEGIN &REWRITE(P,'CONSOLE:'); &WRITELN(NFILENAME,' not present'); " END; " P(NFILENAME)) THEN "BEGIN $NREC:=0; $RESET(NCATFILE,NFILENAME); $REPEAT &READNEWCAT; &FOR I:=1 TO NREC DO &IF CH1='P' THEN PRINTRECORD(NCAT[I]) &ELSE &BEGIN & LINENO:=LINENO+1; ( (IF LINENO=1 THEN WRITELN (ELSE IF LINENO<24 THEN ,PRINTRECORDCNUM;  CH1: CHAR; %  BEGIN "LINENO:=0; "WRITE(CHR(CLEARSCREEN)); "WRITE('Display--> C)onsole P)rinter '); "READ(KEYBOARD,CH1); "WRITELN; "IF (CH1='P') OR (CH1='p') THEN REWRITE(P,'PRINTER:') $ELSE REWRITE(P,'CONSOLE:'); "IF (LOOKUORESULT<>0 THEN "BEGIN $WRITELN('Unit not online'); $EXIT(CATALOG); "END; "VOL:=DIRX[0].DIRVOLNAME; "SPS:=COPY(BLANKS,1,7-LENGTH(VOL)); (*PUT VOL IN CONSISTENT FORMAT*) "VOL:=CONCAT(VOL,SPS); "FOR I:=1 TO DIRX[0].NUMOFFILES DO (*MOVE DIRECTORY TO DCAT*) "BEGIN $WITH DIRX[I] DO $BEGIN &IF LENGTH(DIRFILENAME)>0 &THEN &BEGIN (DREC:=DREC+1; (WITH DCAT[DREC] DO (BEGIN *VOLNAME:=VOL; *FILENAME:=DIRFILENAME; *SPS:=COPY(BLANKS,1,15-LENGTH(TE('DELETE ',OCAT[OO].FILENAME:18); *WRITELN(OCAT[OO].VOLNAME:10) (END; (*ELSE*) ' ' $IF (NOT OFILEEND)  THEN &BEGIN (* IF YOU ARE NOT OUT OCAT GET SOME MORE *) (READOLDCAT; (O:=OREC; (OREC:=1; (CONTINUE:=TRUE; &END; (* IF *) & "UNTHATS LEFT OF OCAT *) " $CONTINUE:=FALSE; $ $IF (OREC<=O) &THEN &FOR OO:=OREC TO O DO &IF (OCAT[OO].VOLNAME<>VOL) (THEN (BEGIN *NREC:=NREC+1; *NCAT[NREC]:=OCAT[OO]; *IF (NREC=NLREC) THEN WRITECAT; *SETDEX; (END (*THEN*) & (ELSE (BEGIN *WRI$IF ((OREC>OLREC) AND (NOT OFILEEND)) (*IF YOU ARE OUT OF OCAT GET $ SOME MORE *) $THEN $BEGIN &READOLDCAT; &O:=OREC; &OREC:=1; $END; (* IF *) $ "END; (* WHILE *) (* DCAT IS EMPTY *) " "REPEAT (* GET W[OREC].VOLNAME:10); -OREC:=OREC+1; (*INCREMENT OREC*) +END; + &END; (* CASE OF Z*) ) &SETDEX; $END; (*WITH*) $ $IF (NREC=NLREC) THEN WRITECAT; (*NLREC IS THE MAX ARRAY SIZE*) ; (* INCREMENT D*) *END; * ( 23,31,33: ) +BEGIN (* ADD RECORD TO NCAT FROM OCAT*) -NREC:=NREC+1; -NCAT[NREC]:=OCAT[OREC]; -OREC:=OREC+1; (*INCREMENT OREC*) +END; + )32: +BEGIN -WRITE('DELETE ',OCAT[OREC].FILENAME:18); -WRITELN (OCATD]; ,D:=D+1; (*INCREMENT D *) ,WRITE(' ADD ',NCAT[NREC].FILENAME:18); ,WRITELN(NCAT[NREC].VOLNAME:10); *END; * (22: *BEGIN (* ADD RECORD TO NCAT FROM DCAT*) ,NREC:=NREC+1; ,NCAT[NREC]:=DCAT[D]; ,OREC:=OREC+1; (*INCREMENT OREC*) ,D:=D+1&THEN Y:=1 &ELSE IF (VOLNAME=OCAT[OREC].VOLNAME) &THEN Y:=2 &ELSE Y:=3; & &Z:=X+Y; &IF ((OREC=0) OR (OREC>O)) THEN Z:=11; & " &CASE Z OF ( (11,12,13,21: ( ( BEGIN (*ADD RECORD TO NCAT FROM DCAT *) * ,NREC:=NREC+1; ,NCAT[NREC]:=DCAT[S 1 MORE THAN THE NUMBER OF FILES IN DCAT*) "WHILE (D=DEX " "(* HAVE WE REACHED OR EXCEEDED THE NEXT INDEX?*) " "THEN "BEGIN $IF NCAT[NREC].FILENAME[1]>DEX $THEN (*FILLS DEXRAY TO THE NEXT VALID INDEX*) " $REPEAT &DEXRAY[DEX]:=0; &IF DEX='Z' THEN EXIT(SETDEX$FILEDATE:=DIRX[0].LASTBOOT; $FILESIZE:=DIRX[0].TOTALBLOCKS-BLOCKSUSED; "END; (*WITH*)  END; (*GETDIR*)    PROCEDURE SETDEX;   (*IF FIRST OCCURRENCE OF FILE NAME WITH DEX AS FIRST LETTER THEN "PUT RECORD NUMBER IN DEXRAY AND INCREMENT DEX*) Y WITH NAME FREE.SPACE CONTAINING THE UNUSED SPACE "ON THE VOLUME *) " "DREC:=DREC+1; "WITH DCAT[DREC] DO "BEGIN $VOLNAME:=VOL; $FILENAME:='FREE.SPACE'; $SPS:=COPY(BLANKS,1,15-LENGTH(FILENAME)); $FILENAME:=CONCAT(FILENAME,SPS); $FILEKIND:=INFO; FILENAME)); *FILENAME:=CONCAT(FILENAME,SPS); *FILEKIND:=DIRFILEKIND; *FILEDATE:=DIRFILEDATE; *FILESIZE:=LASTBLOCK-FIRSTBLOCK; *BLOCKSUSED:=BLOCKSUSED+FILESIZE; (END; (*WITH*) &END; (*IF LENGTH*) $END; (*WITH DIRX*) "END; (*FOR*)   (*CREATE ENTRIL (NOT CONTINUE); " "IF (DEX <'Z') $THEN FOR CH:=DEX TO 'Z' DO $DEXRAY[CH]:=DEXRAY[PRED(DEX)]; $ "DONE:=TRUE; "WRITECAT; "WRITEDEX; "  END; (* MERGE *) "   BEGIN (* UPDATE PROCEDURE STARTS HERE *)  "REWRITE(P,'CONSOLE:'); "IF LOOKUP(OFILENAME) $THEN $BEGIN &RESET(OCATFILE,OFILENAME); &CLOSE(OCATFILE,PURGE); (*REMOVE OLD BACKCAT*) $END; (*IF*) "RENAME('MASTCAT.DATA','BACKCAT.DATA'); " "IF (NOT REMOV) $THEN $BEGIN &GETDIR; &SORT; &FOR RN:=1 TO DREC DO PRmove Q)uit'); 'READ(KEYBOARD,CH); 'WRITELN; %UNTIL (CH IN ['R','r','B','b','U','u','S','s','D','d','Q','q']); %CASE CH OF ''U','u': UPDATE; % 'S','s': SEARCH; ''D','d': DISPLAY; ''R','r': BEGIN 2REMOV:=TRUE; 2ENTERVOLNAME; 2UPDATE 0END; ''B'Y*) #REPEAT %REMOV:=FALSE; NFILEEND:=FALSE; OFILEEND:=FALSE; DONE:=FALSE; %NREC:=0; OREC:=0; DREC:=0; %NTOTREC:=0; OTOTREC:=0; %VOL:=' '; %REPEAT 'WRITE(CHR(CLEARSCREEN)); 'MEM('MAIN'); 'WRITE('Catalog--> S)earch D)isplay B)ackup U)pdate R)e#IF ((NOT LOOKUP(NFILENAME)) OR (NOT LOOKUP(PFILENAME))) THEN % %BEGIN 'INIT1; 'INIT2; %END; % #GETSYSVOL(SYSTEMVOLUME); (*RECORD SYSTEM VOLUME NAME FOR REBOOTING*) #DLREC:=MAXREC; OLREC:=MAXREC; NLREC:=MAXREC; #READDEX; (*LOAD THE POINTER ARRATAR1) OR (CAT.FILENAME[2]>TAR2)) 'THEN STOP:=TRUE; %GET(NCATFILE); #UNTIL (STOP OR EOF(NCATFILE)); #IF (NOT FOUND) THEN WRITELN('FILE ',TARGET,' NOT FOUND'); #CLOSE(NCATFILE); #CLOSE(P); #WAIT !END; (*SEARCH*) ! # % !BEGIN (* MAIN *) ! CAT:=NCATFILE^; %IF ((WILDCARD=0) AND (POS(TARGET,CAT.FILENAME)=1)) 'THEN BEGIN )PRINTRECORD(CAT); )FOUND:=TRUE; 'END; %IF ((WILDCARD>1) AND (POS(TARGET,CAT.FILENAME)>=1)) 'THEN BEGIN )PRINTRECORD(CAT); )FOUND:=TRUE; 'END; %IF ((CAT.FILENAME[1]>RAY*) #IF (WILDCARD<>2) (*TAR2 USED TO END SEARCH*) %THEN TAR2:=TARGET[2] %ELSE TAR2:='Z'; #IF (TAR1<'A') %THEN START:=0 %ELSE IF (TAR1>'Z') 'THEN START:=DEXRAY['Z'] 'ELSE START:=DEXRAY[TAR1]; #SEEK(NCATFILE,START); #GET(NCATFILE); #REPEAT %#RESET(NCATFILE,NFILENAME); #IF (POS(':',TARGET)<>0) THEN SEARCHFORVOLUME; #WILDCARD:=POS('=',TARGET); #IF (WILDCARD=1) THEN LONGSEARCH; #IF (WILDCARD>1) THEN TARGET:=COPY(TARGET,1,WILDCARD-1); #TAR1:=TARGET[1]; (*TAR1 USED TO GET POINTER FROM DEXIF(LENGTH(TARGET)>16) THEN WRITELN('NAME TOO LONG '); #UNTIL (LENGTH(TARGET)<=16); #IF (POS('<',TARGET)=1) (*'<' SENDS OUTPUT TO PRINTER *) %THEN %BEGIN 'DELETE(TARGET,1,1); 'REWRITE(P,'PRINTER:'); %END (*IF*) %ELSE REWRITE (P,'CONSOLE:'); RD(NCAT[N]); %UNTIL(NFILEEND); %CLOSE(NCATFILE); %WAIT; %CLOSE(P); %EXIT(SEARCH) #END; (*VSEARCH*) # !BEGIN (*SEARCH PROCEDURE STARTS HERE *) #STOP:=FALSE; FOUND:=FALSE; #REPEAT %WRITE('ENTER NAME OF FILE TO BE FOUND--> '); %READLN(TARGET); %N: RECNUM; ( #BEGIN # %BLKS:=' '; %DELETE(TARGET,POS(':',TARGET),1); %SPS:=COPY(BLKS,1,7-LENGTH(TARGET)); %TARGET:=CONCAT(TARGET,SPS); %WRITELN(TARGET); %REPEAT 'READNEWCAT; 'FOR N:=1 TO NREC DO )IF (NCAT[N].VOLNAME=TARGET) THEN PRINTRECO'FOR N:=1 TO NREC DO IF POS(TARGET,NCAT[N].FILENAME)<>0 # THEN PRINTRECORD(NCAT[N]); $ UNTIL (NFILEEND); %CLOSE(NCATFILE); %WAIT; %CLOSE(P); %EXIT(SEARCH) #END; (*LONGSEARCH*) # # #PROCEDURE SEARCHFORVOLUME; # #VAR BLKS,SPS:STRING[7]; (; %TARGET,SPS: STRING; % #PROCEDURE LONGSEARCH; # #(*LONGSEARCH USED WHEN ALPHABETICAL POINTER CANNOT BE USED*) # #VAR N:RECNUM; # #BEGIN %DELETE(TARGET,1,1); (*REMOVE WILDCARD CHAR *) %WRITELN(TARGET); %REPEAT 'READNEWCAT; REC,' RECORDS'); "WRITELN('MASTERCAT CONTAINS ',NTOTREC,' RECORDS'); "CLOSE(NCATFILE,LOCK); "WAIT;  END; (*UPDATE*)   PROCEDURE SEARCH;   VAR STOP,FOUND: BOOLEAN; %TAR1,TAR2: CHAR;  START: INTEGER; %WILDCARD: 0..16; %CAT: CATALOGRECORDINTRECORD(DCAT[RN]); $END; $ "IF LOOKUP(OFILENAME) $THEN $BEGIN &RESET(OCATFILE,OFILENAME); &READOLDCAT; $END $ $ELSE OREC:=0; $ "REWRITE(NCATFILE,NFILENAME); "NREC:=0; "MERGE; "CLOSE(OCATFILE); "CLOSE(P); "WRITELN('BACKCAT CONTAINS ',OTOT,'b': BACKUP; ''Q','q': REPEAT 2GETSYSVOL(TEST); 2IF (TEST=SYSTEMVOLUME) 4THEN EXIT(CATALOG) 4ELSE WRITELN('INSERT SYSTEM DISK AND PRESS RETURN'); 2READLN(CH); 0UNTIL CH='P'; &END; (*CASE*) $UNTIL (CH IN ['Q','q']); "END. % CATALOG FIRSTPARINIT1 INIT2  T.POINT.DATAצThere is no file named #5:CAT.POINT.DATAצ on this diskDo you want to create a #5:CAT.POINT.DATAצ (Y/N)@@Yy˄AAZZAŹGʁGȡAZAצ#5:CAT.POINT.DATAإצ#5:CAT.POINT.DATA Written to disk IצFile #5:CAT.POINT.DATAצ existsQƁ-#5:CAT.POINT.DATAצThere is no file named #5:CAT.POINT.DATAצ on this diskDo you want to create a #5:CAT.POINT.DATAצ (Y/N)@@hCr`S "$&(*,.02468:<>@DFHJLNPRTVXZ\c The file צ#5:MASTCAT.DATA already exists on this volume fj~ תʋɢצ ʋɢ ʋɢ  ʋɢ ʋɢ  dʋɢ ̋ʋȡArray is filled צ#5:MASTCAT.DATA̋ʋȡ   eate a new צ#5:MASTCAT.DATA or Q)uit ?#5:BACKCAT.DATA#צ BACKCAT.DATA MASTCAT.DATA צFILLING ARRAY[0]̋ʋɦ תʋɢצ צ#5:MASTCAT.DATAThere is no file named צ#5:MASTCAT.DATA ON THIS DISK#5:BACKCAT.DATAe R)esurect Backup C)reate a new #5:MASTCAT.DATAצ Q)uit ?TצC)r%M  Ƅ!Ƅ̄Ƅ!ƄƄ%M ̄ʄȡ(%M ̄ʄ  ʄ%M CH DTV t CODE FILEצ TEXT FILEr INFO FILE[qצ DATA FILEDq GRAF FILE-qצ FOTO FILEjU@+ بqq qq q  qb  ٪ت%M !ULuqצAUGdqSEPSqצOCTBqNOV1qצDEC  zk\M>/q-q  q $F >عqצ BAD BLOCKq CODE FILEqצ TEXT FILErq I :بq q-qJANqצFEBqMARqצAPRqMAYqצJUNqJ ̄ƄƄƄ"h+#5:CAT.POINT.DATA+++@ ת צ%Enter name of volume to be removed-->ȡ:ץˡצ:צ צ/ Press space bar to continue TتPצMemory available at Procedure  = ( RdM M צ ƄBBB BYy˄AAZZAŹGʁGȡAZAצ#5:CAT.POINT.DATAإצ#5:CAT.POINT.DATA Written to disk IצFile #5:CAT.POINT.DATAצ existsQڪ " áN ˡFצ IORESULT FOR צ IS  ~ s""צ   á؂ 6 !..02 B "$&( á󓄡ȡȡ쥆[-"[á EצDELETE [[  ADD "" "M"[צDELETE [[ R AAZMɡMߢ[ !"ߢ[!!ߥ[!ߥ[!!ق!ō !ع"M Ƅ ʄ Ƅ ʄ ̄ Ƅ ʄ Ƅ ƃƄ ʄ ʄ M ʄ  M ʄ6 "ġd"š1AZAZá AZ"áAZAZá AZM̄ ʄ ƃʄ ʄ ƃ Ƅ ʄ Ƅ ʄ ̄ Ƅ ʄ Ƅ ƃƄ ʄ ʄ ʄ ʄ ʄ  ʄ ʄ ʄʄ  ̄ʃ̃M̄ ʄ ƃʄ צ FREE.SPACEƃצ ʃ0ʃ ̃̃ 45ʃM "ˡ'צUnit not onlineƃM ƃצ Ƅ ƃƄ ƃ̄ Ƅ ƃƄ ƃƄ ̃M ̄ ʃʄ ȡʃM ̄ ʄ šMM5MMMM.צ Done sorting$ ̄GETDIRצ,Enter unit number for required directory--> ƃ#5:MASTCAT.DATAצ NOT PRESENTq]\ pƁ-#5:CAT.POINT.DATAإ H Sorting   recordsġX"" ȡT""""" """"؄" OqצCONSOLE:ackup---> C)onsole P)rinter PpÍqPRINTER:qצCONSOLE:צ#5:MASTCAT.DATA q(The following files are not backed uppedq#5:MASTCAT.DATA؄,"  PqצCONSOLE:#5:MASTCAT.DATAצ not presentצMastercat contains  recordsq,  -B%Display--> C)onsole P)rinter PpÍqPRINTER:qצCONSOLE:צ#5:MASTCAT.DATA#5:MASTCAT.DATAȡ_Pá" Cá *ɡ"ǒ"٦ ת٢צ ٢ ٢  ٢ ٢  d٢ "ȡ)".  W      s[[צ   á؂    áxۓZɡ*ZȡAZAAZA  -Y[*0hf qCONSOLE:#5:BACKCAT.DATA%צ#5:BACKCAT.DATAצ MASTCAT.DATA BACKCAT.DATA 6 ̄̄ʄʄȡʄM ʄ̄#5:BACKCAT.DATA צ#5:BACKCAT.DATAצ#5:MASTCAT.DATA qצBACKCAT CONTAINS   RECORDSMASTERCAT CONTAINS . In order to run the program  the master catalog program and about 80  blocks of free space must be on the  disk in drive #5. Any other disk whose  directory is to be added to the master  catalog should be placed in unit #4.  ng disk units #'s and  an option of resurecting the backup  catalog in case of a prior crash.  %More details can be read in the  BYTE article but there are a few  basics. The host program is MAINCAT  which must be linked with the unit  FIRSTPART %This master file catalog program  is a slightly altered version of one by  Edward Heyman in BYTE, May, 1981. My  additions include options for printer  output and page by page screen output  as well as a screen for bad character  inputs on enteri(^PRTVXZ\^f q+ R+;F|  R4\   צMAIN9Catalog--> S)earch D)isplay B)ackup U)pdate R)emove Q)uit..𥂢7צ#INSERT SYSTEM DISK AND PRESS RETURNPáoBuhq &*,.02468:<>@DHJLN#5:MASTCAT.DATAצ#5:CAT.POINT.DATA    צ  צMAIN9Catalog--> S)earch D)isplay B)ackup U)pdate R)emove Q)uit? Ä ? Ą   ō٥ ؓ:FILE ? NOT FOUNDq  *쥂奅 Lq+W?ȡ ?P?š"צNAME TOO LONG צ RECORDS/( ??ȡ.?"ˡ" qdT צ ?:ײ? ? N^FF write('Delete ',ocat[oo].filename:18); writeln(ocat[oo].volname:10); end; end; if (not ofileend) then begin readcat(orec,false,ocat,ofileend,ototrec); then begin nrec:=nrec+1; ncat[nrec]:=ocat[oo]; if (nrec=nlrec) then writecat; setdex; end else begin end; repeat continue:=false; if (orec <= o) then for oo:=orec to o do begin volpresent:=false; for num:=1 to j do if ocat[oo].volname=volarray[num] then volpresent:=true; if not (volpresent) nd; end; setdex; end; if(nrec=nlrec) then writecat; if ((orec>olrec) and (not ofileend)) then begin readcat(orec,false,ocat,ofileend,ototrec); o:=orec; orec:=1; end; end; 32: begin write('Delete ',ocat[orec].filename:18); writeln(ocat[orec].volname:10); orec:=orec+1; e+1; d:=d+1; end; 23,31,33: begin nrec:=nrec+1; ncat[nrec]:=ocat[orec]; orec:=orec+1; writeln(ncat[nrec].volname:10); end; 22: begin nrec:=nrec+1; ncat[nrec]:=dcat[d]; orec:=orec,12,13,21: begin nrec:=nrec+1; ncat[nrec]:=dcat[d]; d:=d+1; write('Add ',ncat[nrec].filename:18); ocat[orec].volname) then y:=1 else if (volname=ocat[orec].volname) then y:=2 else y:=3; z:=x+y; if ((orec=0) or (orec>o)) then z:=11; case z of 11drec+1) do begin with dcat[d] do begin if (filename < ocat[orec].filename) then x:=10 else if (filename=ocat[orec].filename) then x:=20 else x:=30; if (volname < procedure merge; var x,y,z:1..33; continue,volpresent:boolean; oo,o:recnum; num,d:integer; begin dex:='A'; o:=orec; orec:=1; d:=1; if remov then begin j:=1; volarray[1]:=vol; end; while (d< o:=orec; orec:=1; continue:=true; end; until (not continue); if (dex < 'Z') then for ch:=dex to 'Z' do dexray[ch]:=dexray[pred(dex)]; done:=true; writecat; writedex; end; begin if pr then begin close(p);rewrite(p,'console:');end; if bk then bkup := true else bkup := false; if (not remov) then begin getdir; sort; if look the,' not found'); close(rncatfile); wait; end; procedure toggleprinter; begin if pr then begin close(p);pr:=false;rewrite(p,'console:');end else begin close(p);pr:=true;rewrite(p,'printer:');end; end; begin if ((not lookup(nfilenam found:=true; end; if ((cat.filename[1]>tar1) or (cat.filename[2]>tar2)) then stop:=true; get(rncatfile); until (stop or (rncatfile^.volname=' ')); if (not found) then writeln('File ',target printrecord(cat); found:=true; end; if ((wildcard>1) and (pos(target,cat.filename) >= 1)) then begin printrecord(cat); (tar1 > 'Z') then start:=dexray['Z'] else start:=dexray[tar1]; seek(rncatfile,start); get(rncatfile); repeat cat:=rncatfile^; if ((wildcard=0) and (pos(target,cat.filename)=1)) then begin et); if (wildcard=1) then longsearch; if (wildcard>1) then target:=copy(target,1,wildcard-1); tar1:=target[1]; if (wildcard<>2) then tar2:=target[2] else tar2:='z'; if (tar1 < 'A') then start:=0 else ifo long '); if (length(target)<2) then writeln('Name too short '); until (length(target)<=16) and (length (target)>1); caps(target); reset(rncatfile,new); if pos(':',target)<>0 then searchforvolume; wildcard:=pos('=',targ close(ncatfile); wait; exit(search); end; begin stop:=false;found:=false; repeat write('Enter name of file to be found --> '); readln(target); if (length(target)>16) then writeln('Name toget,sps); writeln(p,target); repeat readcat(nrec,true,ncat,nfileend,ntotrec); for n:=1 to nrec do if (ncat[n].volname=target) then printrecord(ncat[n]); until (nfileend); blks,sps:string[7]; n:recnum; begin close(rncatfile); reset(ncatfile,new); blks:=' '; delete(target,pos(':',target),1); sps:=copy(blks,1,7-length(target)); target:=concat(tar for n:=1 to nrec do if pos(target,ncat[n].filename)<>0 then printrecord(ncat[n]); until (nfileend); close(ncatfile); wait; exit(search); end; procedure searchforvolume; var procedure longsearch; var n:recnum; begin close(rncatfile); reset(ncatfile,new); delete(target,1,1); writeln(p,target); repeat readcat(nrec,true,ncat,nfileend,ntotrec); close(ncatfile,lock); if bk=(not bkup) then readdex; wait; end; procedure search; var stop,found:boolean; tar1,tar2:char; start:integer; wildcard:0..16; cat:catalogrecord; target,sps:string; close(ocatfile); if pr then begin close(p);rewrite(p,'printer:');end; if bkup then writeln('Backup file:') else writeln('Regular file:'); writeln('Backcat contains ',ototrec,' records'); writeln('Mastcat contains ',ntotrec,' records'); n for rn:=1 to drec do printrecord(dcat[rn]); end; if bkup then nfle:=bfilename else nfle:=nfilename; rename; reset(ocatfile,ofilename); readcat(orec,false,ocat,ofileend,ototrec); reset(ncatfile,nfle); nrec:=0; merge; e)) or (not lookup(pfilename))) then initialize; pr:=false; bk:=false; look:=true; new:=nfilename; rewrite(p,'console:'); getsysvol(systemvolume); dlrec:=maxrec;olrec:=maxrec;nlrec:=maxrec; readdex; repeat remov:=false;nfileend:=false;ofileend:=false;done:=false; nrec:=0;orec:=0;drec:=0; ntotrec:=0;ototrec:=0; vol:=' '; repeat write(chr(clearscreen)); write('Catalog --> S)earch D)isplay B)ackup U)pdate R)emove Q)u month: 0..12; day: 0..31; year: 0..100; end; dirsize=0..77; volid=string[7]; fileid=string[15]; filetype=(A'; ofilename='#5:OLD.DATA'; clearscreen=12; nrfiles=250; (*This may have to be reduced is you don't have an 80-column board and run out of memory*) nrdisks=25; type daterecord = packed record(*$S+*) program catalog; const blanks = ' '; maxrec=192; maxrec1=193; nfilename='#5:MASTCAT.DATA'; bfilename='#5:BACKCAT.DATA'; pfilename='#5:CAT.POINT.DATA'; bpfilename='#5:BCAT.PT.DATN^FF readdex; end; 'L','l' : if look then look:=false else look:=true; end; until (ch in ['Q','q']); end. bk then begin bk:=true; new:=bfilename; readdex; end else begin bk:=false; new:=nfilename; if (test=systemvolume) then exit(catalog) else writeln('Insert system disk and press return'); readln(ch); until ch='P'; 'V','v' : if not remov:=true; entervolname; update; end; 'B','b' : backup; 'P','p' : toggleprinter; 'Q','q' : repeat getsysvol(test); ead(keyboard,ch); writeln; until (ch in ['V','v','R','r','B','b','U','u','S','s', 'D','d','Q','q','p','P','l','L']); case ch of 'U','u' : update; 'S','s' : search; 'D','d' : display; 'R','r' : beginit '); if pr then writeln('P)rinter ON') else writeln('P)rinter OFF'); if bk then write('V)olume backup ') else write('V)olume regular '); if look then writeln('L)ook-at-sort ON') else writeln('L)ook-at-sort OFF'); runtyped,xdisk,code,text,info,data,graf,foto, securedir); dirrecord=record firstblock:integer; lastblock:integer; case dirfilekind:filetype of securedir,untyped: (dirvolname:volid; zeroblock,numoffiles, totalblocks:integer; lastboot:daterecor filetowrite:=concat(ofilename,'[72]'); rewrite(ocatfile,filetowrite); for k:=1 to 6 do n:=blockwrite(ocatfile,cat[1],12); close(ocatfile,lock); for dex:='A' to 'Z' do dexray[dex]:=0; rete(ocatfile,cat[1],12); close(ocatfile,lock);end else writeln('File ',bfilename,' exists'); if lookup(ofilename) then begin rewrite(ocatfile,ofilename); close(ocatfile,purge);end; if ((ch<>'Y') and (ch<>'y')) then exit(catalog); if not initial then init1; filetowrite:=concat(bfilename,'[72]'); rewrite(ocatfile,filetowrite); for k:=1 to 6 do n:=blockwriln('There is no file named ',bfilename,' on this disk'); writeln('Do you want to create a ',bfilename,' (y/n)'); repeat read(ch) until (ch in ['Y','y','N','n']); close(ocatfile,lock); end; begin initial:=false; if (not lookup(nfilename)) then init2 else writeln('The file ',nfilename,' already exists on this volume '); if (not lookup(bfilename)) then begin writend (ch<>'y')) then exit(init2); initial:=true; init1; filetowrite:=concat(nfilename,'[72]'); rewrite(ocatfile,filetowrite); for k:=1 to 6 do n:=blockwrite(ocatfile,cat[1],12); writeln('There is no file named ',nfilename,' on this disk'); writeln('Do you want to create a ',nfilename,' (Y/N)'); repeat read(ch) until (ch in ['Y','y','N','n']); if ((ch<>'Y') a writeln('Filling array'); fill(cat[1]); for i:=1 to maxrec do cat[i] := cat[1]; writeln('Array is filled'); end; procedure init2; begin len):boolean;forward; procedure fill(var rcd:catalogrecord);forward; procedure initialize; var i:recnum; cat:catarray; n:integer; initial:boolean; dexfile:file of indexarray; procedure init1; begin writeln; vol,test,systemvolume:volid; ocatfile,ncatfile:file; rncatfile,rocatfile:file of catalogrecord; ncat,ocat:catarray; curdate:daterecord; new:filen; k:integer; filetowrite:string; function lookup(fn:fi nrec,nlrec,orec,olrec,dlrec:recnum; drec:integer; ntotrec,ototrec:recsize; remov,nfileend,ofileend,done,pr,bk,look:boolean; ch,dummy:char; dex:index; dexray:indexarray; p:file of char; directory = array[dirsize] of dirrecord; catarray=array[0..maxrec] of catalogrecord; filen=string[20]; recnum=0..maxrec1; recsize=0..2047; index='A'..'Z'; indexarray=array[index] of integer; var catalogrecord=packed record volname:volid; filename:fileid; filekind:filetype; filedate:daterecord; filesize:0..988; filler:string[1]; end; d); xdisk,code,text,info,data,graf,foto: (dirfilename:fileid; lastbyte:1..512; dirfiledate:daterecord) end; write(dexfile,pfilename); dexfile^:=dexray; put(dexfile); close(dexfile,lock); rewrite(dexfile,bpfilename); dexfile^:=dexray; put(dexfile); close(dexfile,lock); end; procedure fill; begin with rcd do begin volname:=' '; filename:=' '; filename[1]:=chr(127); filekind:=untyped; filedate.month:=0; end; with cat1 do begin write(p,filename,' ':18-length(filename)); write(p,volname,' ':8-length(volname)); write(p,filesize:4); printdate(filedate); printkind(filekind); writeln(p); end;; text: write(p,'Text file'); info: write(p,'Info file'); data: write(p,'Data file'); graf: write(p,'Graf file'); foto: write(p,'Foto file'); end; end; procedure printrecord(cat1:catalogrecord); begin ; 12: write(p,'Dec'); end; write(p,'-',year:2,' ':3); end; end; procedure printkind(filekind:filetype); begin case filekind of xdisk: write(p,'Bad block'); code: write(p,'Code file') 4: write(p,'Apr'); 5: write(p,'May'); 6: write(p,'Jun'); 7: write(p,'Jul'); 8: write(p,'Aug'); 9: write(p,'Sep'); 10: write(p,'Oct'); 11: write(p,'Nov') end; procedure printdate(rec:daterecord); begin with rec do begin write(p,day:3,'-'); case month of 1: write(p,'Jan'); 2: write(p,'Feb'); 3: write(p,'Mar'); -> '); readln(trade); if (pos(':',trade)<>0) then delete(vol,pos(':',trade),1); until (length(trade)<=7); caps(trade); for n:=1 to length(trade) do vol[n]:=trade[n]; writeln(vol,':'); drec:=0; xfile^; get(dexfile); close(dexfile); end; procedure entervolname; var trade:string; n:integer; begin vol:=' '; repeat write(chr(clearscreen)); write('Enter name of volume to be removed -th(vol)); avol:=concat(vol,sps); curdate:=dir[0].lastboot; end; procedure readdex; var dexfile:file of indexarray; begin if not bk then reset(dexfile,pfilename) else reset(dexfile,bpfilename); dexray:=de read(ch) end; procedure getsysvol(var vol:volid); var i,j:integer; sps:string[16]; avol:volid; dir:directory; begin unitread(4,dir[0],2048,2); vol:=dir[0].dirvolname; sps:=copy(blanks,1,7-lengkup:=true else begin lookup:=false; if (ior<>10) then writeln('Ioresult for ',fn,' is ',ior); end; end; procedure wait; begin gotoxy(10,24); write('Press space bar to continue'); if name[n] in ['a'..'z'] then name[n]:=chr(ord(name[n])-32); end; function lookup; var ior:0..15; begin (*$i-*) reset(ocatfile,fn); ior:=ioresult; close(ocatfile); (*$i+*) if (ior=0) then loo filedate.day:=0; filedate.year:=0; filesize:=0; end; end; procedure caps(var name:string); var n:integer; begin if length(name)>0 then for n:=1 to length(name) do N^FF ' then if ocat[o].filename=ncat[n].filename then begin if (ocat[o].filedate<>ncat[n].filedate) and (ncat[n].filename<>'FREE.SPACE ') then lename<=ncat[n].filename) and (ocat[o].volname<>' ')) or ((ncat[n].volname=' ') and (ocat[o].volname<>' ')) do begin if ncat[n].volname<>' n:=n+1; if (n>nlrec) and (not nfileend) then begin n:=1; readcat(nrec,true,ncat,nfileend,ntotrec);end; end; while ((ocat[o].find ((ncat[n].filename'FREE.SPACE ' then printrecord(ncat[n]); reset(ocatfile,bfilename); readcat(orec,false,ocat,ofileend,ototrec); readcat(nrec,true,ncat,nfileend,ntotrec); repeat while (ncat[n].volname<>' ') aeger; begin if (lookup(nfilename)) then begin o:=1;n:=1;nrec:=0;orec:=0; write(chr(clearscreen)); writeln(p,'The following files are not backed up'); reset(ncatfile,nfilename); until nfileend; close(ncatfile); end else writeln(new,' not present'); writeln(p);writeln(p,new,' contains ',ntotrec,' records'); wait; end; procedure backup; var o,n,nrec,orec:int then begin nrec:=0; reset(ncatfile,new); repeat readcat(nrec,true,ncat,nfileend,ntotrec); for i:=1 to nrec-1 do printrecord(ncat[i]); ll(ncat[nrec+1]) else if done and (nrec=nlrec) then again:=true; k:=blockwrite(ncatfile,ncat[1],12); ntotrec:=ntotrec+nrec; nrec:=0; if again then writecat; end; procedure display; var i:recnum; begin if (lookup(new)) 127),cat[1]); if i<6144 then fileend:=true; rec:=i div 32; totrec:=totrec+rec; end; procedure writecat; var i:recnum; again:boolean; begin if ntotrec=0 then fill(ncat[0]); again:=false; if done and (nrec' ' then begin n:=n+1; if (n>nlrec) and (not nfileend) then begin n:=1; readcat(nrec,true,ncat,nfileend,ntotrec);end; end; end; o:=o+1; if (o>olrec) and (not ofileend) then begin do begin volname:=vol; filename:=dirfilename; sps:=copy(blanks,1,15-length(filename)); filename:=concat(filename,sps); if drec>nrfiles then begin drec:=drec-1; writeln('Too many files. Press any key to continue.'); wait; exit(getdir);end; with dcat[drec] blocksused:0..988; procedure copydir; begin with dirx[i] do begin if length(dirfilename)>0 then begin drec:=drec+1; writeln('Sorting...'); quicksort(1,drec); writeln; writeln('Done sorting.'); end; procedure getdir; var dirx:directory; unitnum,i:integer; chbuf:char; sps:string[16]; begin w:=dcat[i];dcat[i]:=dcat[j];dcat[j]:=w; i:=i+1;j:=j-1; end;; until i>j; write('.'); if l dex then repeat dexray[dex]:=0; if dex='Z' then exit(setdex); dex:=succ(dex); until (ncat[nrec].filename[1]=dex); dexray[dex]:=ntotrj,' more volumes'); writeln(' Or ',nrfiles-drec,' more files before writing to file.'); read(keyboard,dummy); until dummy<>chr(32); end; procedure setdex; begin if ncat[nrec].filename[1] >= dex then begin if ncat[nrec j:=0; drec:=0; writeln('Hit any key to catalog first volume'); read(keyboard,dummy); repeat gettingdir; writeln(vol,'--> ','Number of files: ',dirx[0].numoffiles+1); writeln(' You can add ',nrdisks- volume'); j:=j-1; exit(gettingdir);end; for i:=1 to dirx[0].numoffiles do copydir; drec:=drec+1; freespace; end; begin bkup:=false; for j:=1 to nrdisks do volarray[j]:=''; bkup and (pos('.B',vol)=0) then begin writeln(vol,' is not a backup volume'); j:=j-1; exit(gettingdir);end else if not bkup and (pos('.B',vol)<>0) then begin writeln(vol,' is a backup already entered ',vol); j:=j-1; exit(gettingdir);end; volarray[j]:=vol; sps:=copy(blanks,1,7-length(vol)); vol:=concat(vol,sps); if drec=0 then if pos('.B',vol)<>0 then bkup:=true; if writeln('Too many files.'); j:=j-1; exit(gettingdir);end; vol:=dirx[0].dirvolname; if j>1 then for num:=1 to j do if volarray[num]=vol then begin writeln('You haveult<>0 then begin writeln('Unit not online'); j:=j-1; exit(gettingdir); end; if dirx[0].numoffiles +1+ drec>nrfiles then begin nrdisks then begin writeln('Too many volumes; hit any key to continue'); wait; j:=j-1; exit(getdir);end; blocksused:=6; (*$i-*) unitread(4,dirx[0],2048,2); (*$i+*) if iores:=concat(filename,sps); filekind:=info; filedate:=curdate; filesize:=dirx[0].totalblocks-blocksused; end; end; procedure gettingdir; var num:integer; begin j:=j+1; if j>(*$I CAT1.TEXT*) (*$I CAT2.TEXT*) (*$I CAT3.TEXT*) צ#5:BCAT.PT.DATAب j d ת צ'Enter name of volume to be removed --> P:ˡd:ȡ*+*+ȡd**** ~ צPress space bar to continue>M M צ ƄƄ ̄ƄƄƄPM "x Ɓ-#5:CAT.POINT.DATA ת٢٢ ٢  ٢ ٢  d٢^š8ȡ+ٛ ٛٛ 3 Jڪ"áN ˡFצ Ioresult for צ is Z\ʍZȡ( ̌\\𥁐AAZZAZ̍ZʍZȡAZAƌצ#5:CAT.POINT.DATAʌƌƌƌצ#5:BCAT.PT.DATAʌƌƌƌ]צ ٢\̍Z\ʍZȡ( ̌\\GצFile #5:BACKCAT.DATAצ existsצ #5:OLD.DATA! #5:OLD.DATA]̍ZƍZ #5:OLD.DATA ƍZצ[72]ƍZP]\̍TAצ on this diskDo you want to create a #5:BACKCAT.DATAצ (y/n)@@Y˩y˄ʌ]̍ZƍZ#5:BACKCAT.DATAƍZצ[72]ƍZP]\\= zƌƍ@̌צ#5:MASTCAT.DATAcצ The file #5:MASTCAT.DATAצ already exists on this volume צ#5:BACKCAT.DATAצThere is no file named #5:BACKCAT.DAצDo you want to create a צ#5:MASTCAT.DATA (Y/N)@@Y˩y˄]צ#5:MASTCAT.DATAצ[72]P]\\ȡ*  Filling arrayȡ$Array is filledQ There is no file named צ#5:MASTCAT.DATA on this diskB*(CATALOG d:?V ب/ /-/צJan/צFeb/צMar/צApr/צMay/צJun/צJulp/צAug`/צSepP/צOct@/צNov0/צDec  tfXJ<./-/  / "D . ع/ Bad block/ Code file/ Text filem/ Info fileW/ Data fileA/ Graf file+/ Foto filekup volumeX.Bץd˄Adצ is a backup volumeM ȡ  ̄ʄȡ תdGצYou have already entered dd dddá.Bץdˡ.BץdÄGdצ is not a bac hit any key to continueM "ˡ1צUnit not onlineM š1צToo many files.dM šoȡa٢ ٢ آ ٢٣$إdآצ FREE.SPACE آآآآ آ PآM "šM)Too many volumes; Done sorting.TM آššJ+Too many files. Press any key to continue.٥d٢آצ ٢٢٢ȡ@š.ɡڮɡخD  Sorting...5ʄ צ MASTCAT.DATAʄ צ BACKCAT.DATAM yU( Ɓ-צ#5:CAT.POINT.DATA#5:BCAT.PT.DATAإ l؂ ʄ ȡ;M ̄ ʄ צOLD.DATAʄ צ HOLDER.DATAM ̄ ʄ ȡoM ̄ ,ʄ  MASTCAT.DATAׯʄ OLD.DATAת*ʄ  BACKCAT.DATAׯʄ OLD.DATAתM ̄ ʄ ȡ^M ̄ ʄ צ HOLDER.DATA 0 ׯ쥁h;#5:MASTCAT.DATAצ not present@ak(M M  Ƅ Ƅ  ̄ Ƅ Ƅ Ƅ M ̄0 ׷@צ 0@0 @ @צFREE.SPACE  @@ ׷@ 0 @צ 0 @ @צ @00 ׯN@צFREE.SPACE  @@ 0@0צ @צ //Q/ contains / / records/ צ#5:MASTCAT.DATA /צ%The following files are not backed up/hצ#5:MASTCAT.DATAצ#5:BACKCAT.DATA @Ʉ@ Äh@ \ ١vQZhQ@ ȡ@h,Qצ not presentyeQ=) ب// // /  / Zۡh   ɡ  zá#Hit any key to catalog first volumedצ--> צNumber of files: M  צ You can add  צ more volumes Or  # more files before writing to file. ˡ  @ġn@š5AZAZáAZ@áAZAZáAZ\ AAZh/ Lu9@X<N ~ 6D  j.bF 4!!t&'"P"!B!oo !` `\7#Insert system disk and press returnPá Q#5:BACKCAT.DATAת  Q#5:MASTCAT.DATAת   rBvj )&},.02468:<>@DHJLNPRTiXZ\,6f>V)olume backup צV)olume regular &L)ook-at-sort ON%L)ook-at-sort OFFoo !` `\7#Insert syonsole:\    dצ  ;Catalog --> S)earch D)isplay B)ackup U)pdate R)emove Q)uit ! P)rinter ON צ P)rinter OFF" !/ /צconsole:/ /printer:L!쥁 h/[צ#5:MASTCAT.DATA#5:CAT.POINT.DATA  Q#5:MASTCAT.DATAת/ciP@ˡ @zAɡ!ZšZAZA AZA@ Ä@ Ą  ō٩צ ؓ:צFile @צ not foundAj #Enter name of file to be found --> @P@š"Name too long @ɡ#Name too short @@ń@Q:@ˡ צ=@áš@@ihbH hQצ @:ײ@ @ @ @P W P/@/@  ȡ&@@ @ h[ צ recordsצMastcat contains  צ recordshʏ \ hQ@/@/@ ȡ-@@ˡ @Ɛ#5:BACKCAT.DATAתƐצ#5:MASTCAT.DATA #5:OLD.DATA0 hƐ//printer:ʏ" Backup file:! Regular file:צBackcat contains  0 ܓZɡ/Z ȡ"AZAAZA17ik%Ait//console:̏̏0)̐̐.ʐʐ.ȡʐʐ̐ʏ "$&(á0 ȡ ȡ  ȡ%0 ۓ-@0áEצDelete 00@@ @@0צDelete 00 6 !.')+ ;dɡ 0 !"0!!᥄0!᥄0!!ق!ō !ع@Add stem disk and press returnPá Q#5:BACKCAT.DATAת  Q#5:MASTCAT.DATAת   rBvj )&},.02468:<>@DHJLNPRTiXZ\,6f>ll over. But it is worth it -- this version is much faster. >te that that disk was cataloged with this program. This enables you to see at a glance what disks need to be updated with the catalog program. Note: the present version of the program is not compatible with the previous one. You will have to start aere isn't room) and then run the program. You can have about 1150 filenames in the regular file, the same number in the backup file. Another improvement in the program is that the date on the file listed as FREE.SPACE for each disk is now the last daremove, not for update, and performs those commands either on the regular file or the backup file, as chosen. Before running the program, you must put a formatted disk, empty disk in drive 5. Transfer the catalog.code program to it (but not the text -- thbackup volumes so that they have a ".B" somewhere in the volume name. Then the program will automatically catalog them in the backup file. You cannot update backup and regular disks at the same time. The V)olume command is used for display, search, and e and listing of files as not backed up of dates do not match. The gets have been replaed by blockreads, making the program faster by a facter of 3 or 4. Disks must be updated on drive 4. In order to use this program, you have to rename all your by George Hart, CL0728, so that it is possible to update more disks than one at a time, to print out the entire file, and to keep a backup file separately so that the size of the main file can be kept down. Other additions include ability to use lower cas >TY (12)CL0728>CAT2.TXT Not Found. (12)CL0728>CAT2.TXT (TY) >TY (12)CL0728>CAT3.TXT Not Found. (12)CL0728>CAT3.TXT (TY) >TY (12)CL0728>CATALOG.DOC {{his program was written by Edward Heyman and published in the May '81 issue of Byte. It was modified X1NR:DK$;"READ EAMON.ROOM NAMES,R";X:RN$(X):NR(X)((1)1001)ZF59000cl100lv 38NORTH,N,SOUTH,S,EAST,E,WEST,W,UP,U,DOWN,D,GET,TAKE,DROP,PUT,LOOK,EXAMINE,ATTACK,FLEE,RETREAT,ESCAPE,GIVE,INVENTORY,I,BLAST,HEAL,POWER,SPEED,SMMD%(0,9)NZ1:MD%(0,11)WD%(1):MD%(0,12)WS%(1):MD%(0,14)3\jNC:C$(NC):C1NC:C$(C):tS14:S2%(S)SA%(S)::V%(96):ROOM1~LV1: LOCKS THE OAK DOORED%(NR,6)X1NR:DK$;"READ EAMON.ROOMS,R";X:Y16:ED%(X,Y):Y,XRN$(NR)5W2)AN$(A)AN$(A)"#":A00::1090dLA,W2:EA0:MD%(0,8)0:A2(AC2):A22ACMD%(0,8)1:EA5VA2MD%(0,8)MD%(0,8)A2:EAEAA210:A23MD%(0,8)MD%(0,8)2:EAEA30;`NANZMD%(0,10)(EAAE)(EAAE)WO%(1)WA%(WT%(1))2MD%(0,2):MD%(0,7)0:L64":DK$;"OPEN EAMON.ROOMS,L64".W214:WN$(W2)"NONE"NANA1:AN$(NA)WN$(W2):AD%(NA,2)2:AD%(NA,3)2:AD%(NA,4)1:AD%(NA,5)WO%(W2):AD%(NA,6)WT%(W2):AD%(NA,7)WD%(W2):AD%(NA,8)WS%(W2)::W248WZW2:WTWWZ$BW21WZ:A1NAWZ:AN$(A)WN$()::AE,SEX$,GOLD,BANK,ACNW15:WN$(NW),WT%(NW),WO%(NW),WD%(NW),WP%(NW):A14:WN$(A),WT%(A),WO%(A),WD%(A),WS%(A)::DK$;"CLOSE"DK$"DELETE FRESH MEAT"!DK$;"NOMONC,I,O""33,40 $DK$;"OPEN EAMON.DESC,L256":DK$;"OPEN EAMON.ROOM NAMES,A:DK$;"OPEN EAMON.MONSTERS,L128":MN$(NM),MD%(NM,15):A1NM:DK$;"READ EAMON.MONSTERS,R";A:MN$(A):A2112:MD%(A,A2):A2,A:DK$;"CLOSE"DK$;"OPEN FRESH MEAT":DK$;"READ FRESH MEAT":REC:MN$(0),MD%(0,1),MD%(0,2),CH:A14:SA%(A)::A15:WA%(ADATAVDK$;"OPEN EAMON.DESC":DK$;"READ EAMON.DESC":NR,NZ,NE,NM:DK$;"CLOSE":NANZDK$;"OPEN EAMON.ARTIFACTS,L128":AN$(NA4),AD%(NA4,9):A1NA:DK$;"READ EAMON.ARTIFACTS,R";A:AN$(A):A214:AD%(A,A2):A2:AD%(A,2)1āA258:AD%(A,A2):A2rM21NM:MD%(M2,5)ROOMMD%(M2,14)3(1).25DFM2:7500:M2200:M2:490d|M2:DF0:7500:490mOFMM21NM:MD%(M2,5)ROOMMD%(M2,14)1DFM2:7500:M2200:M2:490M2NBTL(FD%(1)TD%(1)):NBTLĂM100///INITIALIZE (41(1)20)20(MD%(M,9)1)TMD%(M,4)MRĞ:MN$(M);" FLEES OUT AN EXIT."::8500:MD%(M,5)R2:M2MD%(M,14):TD%(M2)TD%(M2)MD%(M,1):FD%(MD)FD%(M2)MD%(M,13):490YMD%(M,14)2490^MD%(M,14)3390hOFM:TD%(3)MD%(0,1)DF0:7500:490L000,8000,8000,8000,9000,10000,10000,11000,12000,13000,14000,15000,15000,16000,17000{ 'C3318000,19000,20000,21000,22000 ,///COMMANDS RETURN TO HERE 6NBTL500 @M1NM:MD%(M,5)ROOM490JM2MD%(M,14)(MD%(M,14)2):MR100FD%(M2)TD%(M2)1NC:C$(C)V$C$(C)S$Ă::"HUH? I ONLY UNDERSTAND THESE COMMANDS-- ";:C1NC:C$(C);20(C$(C)));::::210 C$(C)S$S$V$:V$C$(C) 200S "C3000,3000,3000,3000,3000,3000,3000,3000,3000,3000,3000,3000,4000,4000,5000,5000,6000,6000,7> YOUR ";AN$(A);" IS HERE."- A:V%(ROOM)1O :"YOUR COMMAND?";::" ";A$p (A$,1)" "A$(A$,2):220 A$""A$CZ$:(37):17:A$ CZ$A$:A2(A$):(A$,A,1)" "Ă V$(A$,A1):S$(A$,A1) (S$,1)" "S$(S$,2):260w CЂ:170N DK$;"READ EAMON.DESC,R";M300:A$:DK$:MD%(M,15)1:A$""ĺA$::q A1NZ:AD%(A,4)ROOMĂ:190 AD%(A,9)ĺ" -- YOU SEE ";AN$(A)::190 DK$;"READ EAMON.DESC,R";A100:A$:DK$:A$:AD%(A,9)1:: AANA:AD%(A,4)ROOMĺ" -)MD%(0,10)2MD%(0,2):(1).8ĺ"YOUR SPEED SPELL HAS JUST EXPIRED!":t V%(ROOM)ĺ"YOU ARE":" ";RN$(ROOM):150 DK$;"READ EAMON.DESC,R";ROOM:A$:DK$:A$::V%(ROOM)1 M1NM:MD%(M,5)ROOMĂ:170 MD%(M,15)ĺ" >> ";MN$(M);" IS HERE.":;F  EAMON ADVENTURE #22? THE SENATOR'S CHAMBERSEb BY JAMES PLAMONDONh{2DK$(4):1000<d///MAIN LOOP. FIRST GIVE ROOM DESC, THEN GET COMMANDi255nG xSPDSPDSPD1:SPDMD%(0,2)MD%(0,2)2:MD%(0,10                                       BURN. IT IS TIME TO":"BEGIN."D U"(HIT ANY KEY TO CONTINUE)":A$X Z:"GOOD LUCK!"q d(4);"RUN MAIN PGM"<"SIR CHARLES OF AKNOR, FORMER COUNSELOR":"TO THE KING." F:"YOU STAND BEFORE THE SENATOR'S HOUSE.":"IT IS A LONELY EDIFICE FAR FROM OTHER":"BUILDINGS OR PEOPLE. IT IS ALMOST MID-" P"NIGHT,AND THE HOUSE IS STILL, THOUGH A":"FEW LIGHTS STILL UR HAS IT THAT THE SENATOR HAS KID-":"NAPPED A NUMBER OF HIS POLITICAL RIVALS" 9"(OF WHICH THERE WERE ONCE MANY; NOW":"THERE ARE FEW). IT IS NOW THOUGHT THAT":"THE PERSON MOST LIKELY TO STILL BE IN" :"THE SENATOR'S FOUL CLUTCHES IS THE GOOD"; s (:"THE SENATOR HAS BEEN IN POLITICS FOR A":"LONG TIME, AND HAS THEREBY AMASSED A":"SMALL FORTUNE. HIS CHAMBERS ARE QUITE"2"WELL GUARDED, THOUGH HE DOES NOT REALLY":"BELIEVE ANYONE WOULD EVER INVADE HIS"7"STRONGHOLD."O 8:"RUMO   Դ͍ңҠҍàčàģOU MUST FIRST"4 8);"BOOT THE EAMON MASTER DISK"< :k " NON COMMERCIAL DISTRIBUTION ENCOURAGED"q PAE ";NUM H   "*****************************************";38);"**";((38(A$))2));A$;((38(A$))2)((A$)2((A$)2)));"**";38);"*****************************************": 12);"BY ";A2$ h: 0" TO GO ON THIS ADVENTURE Yr 4xA3$"THE WONDERFUL WORLD OF EAMON"K@A1$"DONALD BROWN"kA$"THE SENATOR'S CHAMBERS"A2$"JAMES PLAMONDON"NUM22` 7);A3$( "----------------------------------------"; 14);"BY ";A1$ :: 15);"ADVENTUR