IMD 1.16: 28/05/2007 16:14:36 -FOG/UTL002         CAT ASM(CAT COMCATALOG DOCN CROSSREFCOM CROSSREFDOC FMAP ASM< FMAP COMFMAP DOCHELP1 HELP2 SIMPLCATDOCUCAT ASM9UCAT COMDISPLAY COMFIND COMLIST COM LOGIN COM LOOK COM!SHOW ASM"#SHOW COM$SHOW DOC%NEWCAT COM)&'(FIND DOC)DISPLAY DOC*DISK DOC+,MAST CAT--FOG/UTL002;V2.0 ;CAT.ASM - PERFORMS DIR FUNCTION ON MAST.CAT ;11/??/77 WRITTEN BY WARD CHRISTENSEN ;01/07/78 MODIFY FOR NON-BASIC MASTER CAT ;01/08/78 MODIFY TO SKIP IGNORE FILENAMES ;TO EXECUTE: ; CAT FILENAME.FILETYPE DISKNAME.DISKTYPE ;COMMAND MAY BE FOLLOWED BY COMMENTS (TITLE) ;MAST.CAT M-U-S-T HAVE IGNORE FILENAMES FIRST ;EG: (NAME.TYPE ; NAME.TYPE ; LASTNAME.TYPE) ORG 100H CALL START DB 'CAT.COM 1/8/78' DB 0DH,0AH,'$' ;PRINT ID MESSAGE START POP D MVI C,PRINT CALL BDOS ;INIT LOCAL STA  CK LXI H,0 DAD SP SHLD STACK LXI SP,STACK ;SAVE THE NAMES LXI D,FCB+1 LXI H,FNAME MVI B,8 CALL MOVER MVI B,3 CALL MOVER LXI D,FCB+17 ;DISK NAME LXI H,DNAME MVI B,8 CALL MOVER MVI B,3 CALL MOVER ;MOVE 'MAST.CAT' TO FCB LX ;MATCH A LINE, PRINT IF IT MATCHES ;EXIT IF KEY PRESSED LOOP MVI C,KSTAT CALL BDOS DCR A JZ EXIT ;MATCH FILENAME LXI D,BUFF ;WHERE TO STORE NAME READ LXI H,FNAME MVI B,8 CALL MATCH JC SKIP ;NAME/TYPE DIDN'T MATCH INX D ;ALLOW FOR '.'I D,FCBNAME LXI H,FCB+1 MVI B,8+3+1 CALL MOVE ;SAVE THE COMMAND LINE AS THE TITLE ;ALLOWS 'CAT *.* *.* MM/DD/YY' TYPE TITLE ;FOR HARD COPY LISTINGS LXI D,80H LXI H,TTL0+6 LDAX D ;GET LENGTH ORA A ;NO OPERANDS ON CAT? JZ NOOP INX D MO ;MATCH FILETYPE MVI B,3 ;TYPE CALL MATCH JC SKIP ;SKIP PAST COMMA ;MATCH DISK'S FILENAME LXI D,BUFF+15 LXI H,DNAME MVI B,8 CALL MATCH JC SKIP INX D ;ALLOW FOR '.' ;MATCH DISK'S FILETYPE (NUMBER) MVI B,3 CALL MATCH ;TYPE JC SKIPV B,A ;SET FOR MOVE CALL MOVE NOOP MVI M,'$' ;END OF TITLE ;OPEN MAST.CAT LXI D,FCB MVI C,OPEN CALL BDOS INR A JNZ SKPIGN ;SKIP THE 'TO BE IGNORED' NAMES ;OPEN FAILED CALL ERXIT DB '++UNABLE TO OPEN MAST.CAT$' ;EXIT PRINTING MSG ON TOP  ; ;GOT MATCHING NAME ; LXI H,BUFF ;PRINT MESSAGE UP TO BINARY 0 PRBUF MOV A,M ORA A ;END OF BUFF? JZ EOBUF CALL TYPE INX H JMP PRBUF EOBUF LDA ENTRY INR A ANI 1 STA ENTRY JNZ SKIP CALL CRLF LDA LINECT INR A STA LINECT COF STACK ERXIT POP D ;GET ERR MSG MVI C,PRINT CALL BDOS ;RESTORE STACK, EXIT EXIT LHLD STACK SPHL RET ; ;SKIP THE IGNORE FILENAMES AT THE HEAD OF MAST.CAT ; SKPIGN CALL RDCHR CPI ')' ;END OF IGNORE? JNZ SKPIGN CALL RDCHR ;GET CR CALLPI 58 JC SKIP CALL SKIPLF JMP NEWPG ; SKIP CALL SKIPLF JMP LOOP ;SKIP TO END OF LINE (L/F) SKIPLF CALL RDCHR CPI 0AH ;SKIP TO END JNZ SKIPLF ;OF LINE RET ; ;MATCH ENTRY BY READING CHARS ;STORE IN BUFFER POINTED TO BY DE ;MATCH NAME PO RDCHR ;GET LF JMP NEWPG1 ; NEWPG MVI A,'L'-40H ;FORMS FEED CALL TYPE ;EJECT ;PRINT TITLE NEWPG1 LXI D,TTL0 MVI C,PRINT CALL BDOS CALL CRLF CALL CRLF LXI D,TTL MVI C,PRINT CALL BDOS CALL CRLF ;RESET LINECOUNT MVI A,5 STA LINECTINTED TO BY HL ; MATCH CALL RDCHR STAX D CMP M JNZ MAT50 ;CHECK '?' MAT25 INX D INX H DCR B ;MORE? JNZ MATCH CALL RDCHR ;DELETE '.' OR '"' ORA A ;CARRY OFF, SHOWS OK RET MAT50 CPI '.' ;END OF NAME? JZ MAT100 CPI ',' ;END OF NAME?    JZ MAT100 MOV A,M ;MATCHING '?' CPI '?' JZ MAT25 MAT75 MVI A,' ' ;PAD STAX D INX D INX H DCR B JNZ MAT75 STC ;SHOW BAD RET MAT100 MOV A,M CPI '?' JZ MAT200 CPI ' ' JNZ MAT75 MAT200 MVI A,' ' STAX D INX D INX H DCR ST CAT',0 ;0 = EXTENT # ENTRY DB 0 ;0/1 = LEFT, RIGHT BUFAD DW 100H ;BUFFER PONTER TTL DB ' NAME DISK ' DB ' NAME DISK' DB 0DH,0AH,'$' BUFF DB '............ ............ ',0 LINECT DB 0 TTL0 DB 'FILES:' ; (CB JNZ MAT100 ORA A ;MATCH RET ; ;READ CHAR FROM DISK ; RDCHR PUSH B PUSH D PUSH H LHLD BUFAD MOV A,H ;TIME TO READ? DCR A JNZ NOREAD LXI D,FCB MVI C,READ CALL BDOS ORA A JZ RDOK CALL ERXIT DB '++READ ERROR OR EARLY EOF$'OMMAND TITLE MOVED HERE) ; * * * * * * * * * * * * * * * * * * * * * * * * ; * ;BDOS/CBIOS EQUATES (VERSION 5) * ;(WITH UNREFERENCED EQUATES EDITED OUT) * ; * WRCON EQU 2 ; * PRINT EQU 9 ; * KSTAT EQU 11 ;1=KEY PRESSED * OPEN EQU RDOK LXI H,80H NOREAD MOV A,M ;GET CHAR INX H SHLD BUFAD POP H POP D POP B CPI 'Z'-40H ;EOF? JZ EOF RET ; CRLF MVI A,0DH CALL TYPE MVI A,0AH ; TYPE PUSH B PUSH D PUSH H MOV E,A MVI C,WRCON CALL BDOS POP H POP D PO 15 ;0FFH=NOT FOUND * READ EQU 20 ;0=OK, 1=EOF * BDOS EQU 5 ; * FCB EQU 5CH ; * ; * * * * * * * * * * * * * * * * * * * * * * * * P B RET ; ;MOVER - MOVE CHARS FROM (DE) TO (HL), LENGTH IN (B) ; IF FIRST CHAR = ' ', MOVE ALL '?' ; MOVER LDAX D CPI ' ' JZ QUEST ; ;MOVE CHARS FROM (DE) TO (HL) FOR LENGTH IN (B) ; MOVE LDAX D ;GET A CHAR MOV M,A INX D INX H DCR B  JNZ MOVE RET ; ;PAD FILENAME OR TYPE WITH ALL '?' ; QUEST MVI M,'?' INX H INX D DCR B JNZ QUEST RET ; EOF CALL ERXIT DB 0DH,0AH,'$' DS 50 ;STACK STACK DW 0 FNAME DS 8 FTYPE DS 3 DNAME DS 8 DTYPE DS 3 FCBNAME DB 'MA  CAT.COM 1/8/78 $ !9",1,]!.m!9D!] !_G6$\<•͊++UNABLE TO OPEN MAST.CAT$ *,̓)•̓̓ë>  S >2 =ʐ!.?0?0!9?0?0!~#:P<2P0:<2:06æ6̓ 6̓R#?̓.m,m~?G> #b7~?x b> #m*Q|=º\ʷ͊++READ ERROR OR EARLY EOF$!~#"Q> > _ w#6?#͊ $?0!~#:P<2P0:<2:066̓ 6̓MAST CAT NAME DISK NAME DISK $............ ............ FILES:  This document describes a system for cataloging all of a users CP/M diskettes. Written by Ward Christensen. WITH A FEW ADDED NOTES BY JIM JOHNSTONE, LIBRARIAN! Pieces have been previously distributed. All are included here for convenience. This causes a "NAMES.SUB" file to be written to the catalog disk. Now type UCAT which will then perform its normal function of executing the catalog updating program, which alphabetically merges the NAMES.SUB file with the MAST.CAT file, the Some changes have been made. The master cataloging system consists of the following: MAST.CAT The catalog itself FMAP.COM Used to create NAMES.SUB, the "transaction file" for catalog update CAT.COM Like DIR, i.e. the lookup progn erases the NAMES.SUB file. The format of MAST.CAT is: First, a list of names of files _@THAT YOU DO NOT WISH TO BE CATALOGED@_. The format is as follows: Each file name is on a separate line. The first name is preceded by a parentram CAT2.COM Quick kludge program, lists entire catalog, printing each filename only once, & stringing disk names out after. UCAT.COM The update program, merges NAMES.SUB into MAST.CAT QCAT.COM Enables the performance of UCAT.COhesis " ( " . The last file name is followed by a parenthesis " ( ". The list supplied with the sample is: (ASM.COM DDT.COM LOAD.COM PIP.COM SID.COM STAT.COM SUB.COM <-- I renamed SUBMIT on most disks SUBMIT.COM) Then a list of aM functions for single disk systems. UCAT.COM is slightly modified from the version distributed in CP/M user's group disk 25: it now catalogs the "volume serial" (-name.nnn) whereas the version in vol. 25 threw this name away. QCAll cataloged files, in the form: filename.type diskname.serial For example: ALLOC.COM SYSRES.802 -------- A disk must have a special filename on it, which is the volume indentifier: -diskname.serial, such as "-SYSRES.801". This may be dT.COM allows cataloging disks on a single (1) disk system. Type QCAT, and the program asks you to mount the disk to be cataloged. Do so, then press the key lettered D. It then tells you to mount the catalog disk . Do so, then press RETURN.one via the CP/M command SAVE as follows: save 0 b:-sysres.801 NOTE that the SAP (sort and pack directory) program previously distributed by the CP/M U.G. deletes all 0-length file entries, so if you use this utility, do a save 1, not a   save 0. To update the catalog for a disk, use FMAP to create the NAMES.SUB file (which contains a sorted listing of the files on the particular disk). Filename $$$.SUB is automatically skipped, as I recall. FMAP B: Q This writeAL - without the dash. Sample queries: CAT <-- LISTS ENTIRE CATALOG CAT *.* WORK.* <-- LISTS ALL FILES ON ANY "WORK" DISK CAT *.* *.002 <-- LISTS ALL ENTRIES FOR DISK .002 CAT *.ASM <-- LISTS ALL .ASM FILES CAT *.* <-- LISTS ALL FILES STARTs to disk only. FMAP B: F Use this to write to disk AND terminal screen. Both FMAP B: Q and FMAP B: F will write NAMES.SUB to the logged in disk which is erased once the UCAT program is run. Remember that the only time you'll be able to findING WITH "A" CAT *.* *.8* <-- ALL FILES ON DISKS WITH SERIAL NUMBERS 8xx CAT *.BAS WORK.* <-- LISTS ALL ".BAS" FILES ON ANY DISK WITH THE NAME "WORK" (ANY SERIAL #) NOTE: Anything you type following the complete CAT co this file is between running FMAP and UCAT! Then type UCAT which will merge NAMES.SUB with MAST.CAT, and erase NAMES.SUB. Note that UCAT is a "belts and suspenders" type program, i. e. it creates NEW.CAT, and merges NAMES.SUB with mmand i.e. using the full "CAT filename.NNN diskname.NNN" appears as the title of the resulting listing. This is particularly useful for keeping and dating hardcopy listings. For example: CAT *.* *.* AS OF 22/1/81 will result in the title:  MAST.CAT and puts it there. It then does: era mast.bak ren mast.bak=mast.cat ren mast.cat=new.cat This means that unless you era mast.bak, there will be 3 copies of the master catalog on the disk during the ucat execution. If you don FILES: *.* *.* AS OF 22/1/81 appearing on each page of the catalog listing. Note that the "-diskname.serial" file is written to the disk under this version of UCAT (it wasn't under the earlier UCAT in the CP/M users group). Thus you can ge't have sufficient space for it, era mast.bak first. -------- CAT works just like DIR, i.e. "*" and "?" are allowed. However, it takes a second operand (after the filename/type) which is the disk information, in the form NAME.SERIt a list of all disk serials via: CAT -*.* Other than this one file entry, the "-" characters are eliminated from the directory, i.e. the disk names are stored as 7 characters (or less). ------ FMAP has some additional options:    FMAP displays a sorted listing on the console FMAP specs displays a selective listing. Specs mean *.asm, etc just like DIR. FMAP *.* F writes NAMES.SUB to disk with the names of all the files on the disk. Useful during er CP/M users group catalog volume "nn". Not generally useful, but thought you might like to know how it was done. LIBRARIANS NOTE: HAVEN'T FOUND THE "FIND" PROGRAM REFERRED TO BELOW, BUT WILL KEEP TRYING---JBJ NOTE that I have found asure operations. _@HAVEN'T QUITE FIGURED THE FOLLOWING $1,$2.$3,$4 SECTION OUT YET, AND WILL TRY TO GET A COPY OF THE MODEM PROGRAM REFERRED TO.--- JBJ. FMAP specs D writes the names to NAMES.SUB with $1 $2 before the namthe FIND program (also distributed on this users group disk) to be very useful when used with MAST.CAT - suppose you have the following in MAST.CAT: BIOS1.ASM BVIOS.ASM CBIOS.ASM M2BIOS.ASM It's ovbious that CAT cannot e, and $3 after: $1 $2FOO.COM $3 Thus $1 may be substituted with a command name, $2 with a disk name, and $3 if the program takes options (only my programs do, as far as I know) FMAP specs Q writes the sorted names, without any find all your BIOS related files - but if you type: FIND MAST.CAT IOS You will find them all ERASING FROM MAST.CAT If you wish to erase entries from MAST.CAT you do so by erasing the file, or files, from the working diskette it is"$", to NAMES.SUB. FMAP specs M writes the names to NAMES.SUB with $1 $2 $3 before the name, and $4 after: $1 $2 $3FOO.COM $4 This is specifically for use with the modem program. For example, to send all .ASM files from the B: dis on, then recataloging --- FMAP then UCAT --- the disk. You could of course edit the MAST.CAT file, but if you have more that a few files to delete this could become a serious "search and destroy mission" If you crash a disk and want to erase all k to another person: FMAP B: M <-- MAKE NAMES.SUB MODEM SO.600 NAMES.SUB <-- SEND THEM NAMES.SUB SUBMIT NAMES MODEM SO.600 B: <-- SUBMIT THE SEND MODEM gets substituted for $1, SO.600 for $2, and B: for $3. FMAP specs UNN createsit's entries from the catalog, you haveto edit a dummy 'disk NAMES.SUB' with just the disk name on it -- using the SAVE 0 -diskname.NNN -- then execute 'UCAT' which will be faked into thinking you are cataloging an empty disk. This will cause all ent  ries for the disk to be erased. EXAMPLE: Suppose disk '-WORK.023' crashed, and you want to delete all references to it from MAST.CAT. (you might first want to do 'CAT *.* *.023 to see what was lost). Remove the files as instructed above with ts: QCAT allows cataloging disks on a 1 disk system. You type QCAT, and the program asks you to mount the disk to be cataloged, and press a D. You do so. It then tells you to mount the catalog disk, and press return. You do that. This causes a "Nthe dummy disk, then locate the -diskname.NNN in the section of the MAST.CAT just below the parenthesised "not to be cataloged files" at the head of the MAST.CAT file, and erase. This removes all final references to the crashed disk. ------------AMES.SUB" file to be written to the catalog disk. Type: UCAT which will then execute the catalog updating program, which alphabetically merges NAMES.SUB with the file MAST.CAT, then erases the NAMES.SUB file. NOTE that each disk to be cataloged mus------------------------------------- N O T E S ------------------------------------------------- The UCAT program creates a file 'NEW.CAT', and ONLY when the update appears to be successful, does it do the following functions internally: ERA t have a file "-diskname.serial" (such as "-MAC.005"). When the list of names on the disk is sorted, the leading "-" on this filename causes it to be sorted first. It is then taken as the disk name and serial, and is written to the master catalog nexMAST.BAK REN MAST.BAK=MAST.CAT REN MAST.CAT=NEW.CAT Thus, there are 3 versions of the catalog on your disk at one time: MAST.BAK, MAST.CAT, AND NEW.CAT, so if your disk is low on space, you may sacrifice this integrity, and manually ERA MAST.BAKt to each filename on the disk. You are referred to the previous documentation on the cataloging system for more details. ------ the disk. You are referred to the previous documentation on the cataloging system for more details.  before running UCAT. The program could also be modified, to do the erase first. ------------------------------------------------- ------------------------------------------------- QCAT was submitted subsequently, with the following commen  1!I6!p"5!"3!"+A > "5*3#"38!6!".*.#"0*0#"0*3zچ{چ*.#".*3+z{!6:] !b\ !2hͿ.!!!!>22 :2<22 _!ZO> T>22> *0 !*0#"0*3#z/{/ô!ZO*0".#"0*3#z{ý!ZO͇!h+6!6*.*0# *.*0G~p# ))))p~#"> @> @~@#6_> d> d~d#Z:-xͩ!"+<2-*+w#"+>d*+:-ʠ6#<Ôͩ\!K\\\!K ., > *+|=;A!!~#"+sMASTER DISKETTE CATALOG CROSSREFERENCE UTILITY V2.0 ++UNABLE TO OPEN MAST.CAT++ **NOW READING MAST.CAT** ++READ ERROR OR EARLY EOF++ **NOW SORTING FILE NAME TABLE** **SORT CCROSSREF.CO͠ wa sen t th librar b membe wh wante listin o ou library Unfortunately h di no includ th .AS͠ file CROSSREF.CO͠ produce "DISKETTE.NDX whic cros reference al o th file s tha fil listeOMPLETE** **NOW WRITING OUTPUT FILE** ++UNABLE TO MAKE OUTPUT FILE++ ++DISK OR DIRECTORY FULL++ **FUNCTION COMPLETE** ++PROGRAM ABORTED++ - + **NOW READING MAST.CAT** ++READ ERROR OR EARLY EOF++ **N SORTING FILE NAME TABLE** **SORT C o mor tha on dis i reference b al dis number o singl lin rathe tha multipl line fo eac dis number.    ORG 100H JMP START ;SKIP PROGRAM ID DB '(FMAP 8/21/77)' ;SORTED DIRECTORY MAP PROGRAM ;WITH OPTION OF WRITING FILE OF NAMES ; ;FMAP FN.FT OR JUST MAP ;FMAP FN.FT F TO WRITE A FILE ;ALLOWS '*' OR '?' TYPE SPECIFICATIONS FCB EQU 5CH ;SYSTEM FCB ;SAVE THE STACK START LXI H,0 DAD SP ;H=STACK SHLD STACK ;SAVE IT LXI SP,STACK ;GET NEW STACK ;SAVE FILE WRITE REQUEST CHAR LDA FCB+17 STA FILESW ;NO FCB SPECIFIED? LXI H,FCB+1 MOV A,M CPI ' ' JNZ GOTFCB ;NO FCB - MAKE FCB ALL '?'  MVI B,11 ;FN+FT COUNT QLOOP MVI M,'?' ;STORE '?' IN FCB INX H DCR B JNZ QLOOP ;LOOK UP THE FCB IN THE DIRECTORY GOTFCB MVI C,FSRCHF ;GET 'SEARCH FIRST' FNC LXI D,FCB CALL BDOS ;READ FIRST INR A ;WERE THERE ANY? STA TEMP ;SAVE JNZ PRTTL ;GOT SOME - PRT TITLE, CONT LXI D,NONMSG CALL WRCON JMP EXIT NONMSG DB '++NOT FOUND$' ;PRINT TITLE PRTTL LXI D,TTL CALL WRCON CALL CR LDA TEMP ;RELOAD EXTENT JMP SOME TTL DB 'FILENAME TYP EX RC -----EXTENT-----$' ;READ MORE DIRECTORY EN  TRIES MOREDIR MVI C,FSRCHN ;SEARCH NEXT LXI D,FCB CALL BDOS ;READ DIR ENTRY INR A ;CHECK FOR END (0FFH) JZ SPRINT ;NO MORE - SORT & PRINT ;POINT TO DIRECTORY ENTRY SOME DCR A ;UNDO PREV 'INR A' ANI 3 ;MAKE MODULUS 4 ADD A ;MULTIPLY... ADDPARE STA SCOUNT ;SAVE HIGHEST ENTRY JZ DONE ;EXIT IF NO MORE LXI H,ORDER ;POINT TO ORDER TABLE SORTLP CALL COMPR ;COMPARE 2 ENTRIES CM SWAP ;SWAP IF NOT IN ORDER INX H ;BUMP ORDER INX H ;..TABLE POINTER LDA TEMP ;GET COUNT DCR A STA TEMP A ;..BY 32 BECAUSE ADD A ;..EACH DIRECTORY ADD A ;..ENTRY IS 32 ADD A ;..BYTES LONG LXI H,81H ;POINT TO BUFFER ;(SKIP TO FN/FT) ADD L ;POINT TO ENTRY MOV L,A ;SAVE (CAN'T CARRY TO H) ;MOVE ENTRY TO TABLE XCHG ;ENTRY TO DE LHLD NEXTT  JNZ SORTLP ;CONTINUE ;ONE PASS OF SORT DONE LDA SWITCH ;ANY SWAPS DONE? ORA A JNZ SORT ;SORT IS ALL DONE - PRINT ENTRIES DONE LXI H,ORDER SHLD NEXTT ;IF WRITING A FILE, OPEN THE FILE LDA FILESW CPI 'F' JNZ ENTRY LXI D,MYFCB MVI C,E;NEXT TABLE ENTRY TO HL MVI B,31 ;ENTRY LENGTH TMOVE LDAX D ;GET ENTRY CHAR MOV M,A ;STORE IN TABLE INX D INX H DCR B ;MORE? JNZ TMOVE SHLD NEXTT ;SAVE UPDATED TABLE ADDR LDA COUNT ;GET PREV COUNT INR A STA COUNT JMP MOREDIR ;SORT ARASE CALL BDOS LXI D,MYFCB MVI C,FMAKE ;MAKE THE FILE CALL BDOS INR A JNZ ENTRY ;MAKE ERROR CALL ERXIT DB '++FILE MAKE ERROR$' ;PRINT AN ENTRY ENTRY MVI C,CONST ;CK STATUS OF KB CALL BDOS ;ANY KEY PRESSED? DCR A JZ ABORT ;YES, ABORND PRINT SPRINT LDA COUNT ;INIT THE ORDER TABLE LXI H,ORDER LXI D,TABLE LXI B,31 ;ENTRY LENGTH BLDORD MOV M,E ;SAVE LO ORD ADDR INX H MOV M,D ;SAVE HI ORD ADDR INX H XCHG ;TABLE ADDR TO HL DAD B ;POINT TO NEXT ENTRY XCHG DCR A ;MORE?T LHLD NEXTT ;GET ORDER TABLE POINTER MOV E,M ;GET LO ADDR INX H MOV D,M ;GET HI ADDR INX H SHLD NEXTT ;SAVE UPDATED TABLE POINTER XCHG ;TABLE ENTRY TO HL MVI B,8 ;FILE NAME LENGTH CALL TYPEIT ;TYPE FILENAME CALL PERIOD ;SPACE AFTER FN JNZ BLDORD ;..YES LDA COUNT ;GET COUNT STA SCOUNT ;SAVE AS # TO SORT DCR A ;ONLY 1 ENTRY? JZ DONE ;..YES, SO SKIP SORT SORT XRA A ;GET A ZERO STA SWITCH ;SHOW NONE SWITCHED LDA SCOUNT ;GET COUNT DCR A ;USE 1 LESS STA TEMP ;SAVE # TO COM MVI B,3 ;GET THE FILETYPE CALL TYPEIT CALL FILECR INX H ;SKIP EXTENT INX H ;SKIP INX H ;UNUSED MOV A,M ;GET REC COUNT DCR A ;FUDGE RAR ;DIVIDE RAR ;..BY 8 RAR ANI 1FH ;DELETE GARBAGE INR A ;MAKE RELATIVE TO 1, NOT 0 MOV B,A ;  SAVE AS # EXTENTS MOV A,M ;RELOAD RECORD COUNT CALL XOB ;PRINT RECORD COUNT INX H ;SKIP RECORD COUNT MVI C,0 ;FOR EXTENT SKIP CTL EXTLP MOV A,M ;GET EXTENT BYTE ORA A ;EMPTY? JZ ENDEXT ;..YES CALL XO ;..NO, PRINT IT INR C ;INCR COUNT MOVVI C,PRINT JMP BDOS TYPEIT MOV A,M CALL FILCHR ;TO DISK IF REQ'D CALL TYPE INX H DCR B JNZ TYPEIT RET SPACE MVI A,' ' JMP TYPE CR MVI E,13 ;PRINT MVI C,2 ;C/R CALL BDOS MVI E,10 ;LF MVI C,2 JMP BDOS TEMP DS 1 ;SAVE DIR ENTRY  A,C ;TIME TO SPACE? ANI 3 CZ SPACE INX H ;POINT TO NEXT CHR DCR B ;MORE IN EXTENT? JNZ EXTLP ;YES ;BUMP TOTAL FILE COUNT ENDEXT LDA NFILE ;GET # FILES INR A ;BUMP DAA ;MAKE DECIMAL STA NFILE ;SAVE IT BACK CALL CR ;END, TYPE C/R ;SEE ;ERROR EXIT ERXIT POP D ;GET MSG MVI C,PRINT JMP CALLB ;PRINT MSG, EXIT ;ABORT - READ CHAR ENTERED ABORT MVI C,RDCHR CALLB CALL BDOS ;DELETE THE CHAR ;FALL INTO EXIT ;EXIT - ALL DONE , RESTORE STACK EXIT LHLD STACK ;GET OLD STACK SPHL ;MOVE TIF MORE ENTRIES LDA COUNT DCR A STA COUNT JNZ ENTRY ;YES, MORE ;ALL DONE - PRINT # FILES LDA NFILE CALL XOB LXI D,NMSG CALL WRCON ;CLOSE FILE IF NECESSARY LDA FILESW CPI 'F' JNZ EXIT MVI A,'Z'-40H ;EOF CHAR CALL FILCHR ;WRITE ITO STACK RET ;..AND RETURN ;ROUTINES FOR CREATING FILE ; ;WRITE CHAR IN A TO FILE ;(SAVES ALL REGS INCLUDING A) FILCHR CPI ' ' RZ ;DON'T WRITE BLANKS PUSH PSW LDA FILESW ;WRITING A FILE? CPI 'F' JNZ NOFILE POP PSW ;GET CHAR PUSH PSW ; CALL WRSEC ;WRITE FINAL SECTOR LXI D,MYFCB MVI C,FCLOSE CALL BDOS JMP EXIT NMSG DB 'FILES$' ;HEX OUTPUT W/BLANK XOB CALL XO JMP SPACE ;HEX OUTPUT XO PUSH PSW ;SAVE CHAR RAR RAR RAR RAR CALL NIBBL ;PRINT LEFT NIBBLE POP PSW ;GSAVE IT BACK PUSH H LHLD BUFAD ;CURRENT BUFFER ADDR MOV M,A INX H SHLD BUFAD MOV A,H ;SEE IF FULL BUFF DCR A CZ WRSEC ;YES, WRITE SECTOR POP H NOFILE POP PSW ;RESTORE CHAR RET ;WRITE A SECTOR WRSEC PUSH B PUSH D LXI D,MYFCB MVIET VALUE BACK NIBBL ANI 0FH ;ISOLATE NIBBLE CPI 10 ;NUMBER? JC XNUM ;YES ADI 7 ;FUDGE ALPHA HEX XNUM ADI '0' ;MAKE PRINTABLE ;TYPE CHAR IN A TYPE PUSH B PUSH D PUSH H MOV E,A MVI C,WRCHR CALL BDOS POP H POP D POP B RET WRCON M C,FWRTE CALL BDOS ORA A JZ WROK CALL ERXIT DB '++WRITE ERROR$' WROK LXI H,80H ;START OF BUFF SHLD BUFAD POP D POP B RET ;TYPE A PERIOD INTO THE FILE PERIOD MVI A,'.' ;GET PERIOD CALL FILCHR ;WRITE TO FILE JMP SPACE ;WRITE CR/LF I  NTO FILE FILECR MVI A,13 CALL FILCHR MVI A,10 CALL FILCHR JMP SPACE ;COMPARE ROUTINE FOR SORT COMPR PUSH H ;SAVE TABLE ADDR MOV E,M ;LOAD LO INX H MOV D,M ;LOAD HI INX H MOV C,M INX H MOV B,M ;BC, DE NOW POINT TO ENTRIES TO BE COM DS 1 ;'F' IF WRITING FILE BUFAD DW 80H ;OUTPUT ADDR MYFCB DB 0,'NAMES SUB',0 DS 19 DB 0 ORDER DS 128 ;ORDER TABLE TABLE EQU $ ;READ ENTRIES IN HERE END 100H PARED XCHG CMPLP LDAX B CMP M INX H INX B JZ CMPLP POP H RET ;COND CODE TELLS ALL ;SWAP ENTRIES IN THE ORDER TABLE SWAP MVI A,1 STA SWITCH ;SHOW A SWAP WAS MADE MOV C,M INX H PUSH H ;SAVE TABLE ADDR+1 MOV B,M INX H MOV E,M  MOV M,C INX H MOV D,M MOV M,B POP H MOV M,D DCX H ;BACK POINTER TO CORRECT LOC'N MOV M,E RET DS 30 ;STACK AREA STACK DS 2 ;SAVE OLD STACK HERE NFILE DB 0 ;NUMBER OF FILES PRINTED ; ; BDOS EQUATES ; RDCHR EQU 1 ;READ CHAR FROM CONSOLE WRCHR EQU 2 ;WRITE CHR TO CONSOLE PRINT EQU 9 ;PRINT CONSOLE BUFF CONST EQU 11 ;CHECK CONS STAT FOPEN EQU 15 ;0FFH=NOT FOUND FCLOSE EQU 16 ; " " FSRCHF EQU 17 ; " " FSRCHN EQU 18 ; " " ERASE EQU 19 ;NO RET CODE FREAD EQU 20 ;0=OK, 1=EOF (FMAP 8/21/77)!9"1:m2!]~ 3 6?#,\<2WK(++NOT FOUND$f:ÖFILENAME TYP EX RC -----EXTENT-----$\<ʾ=!o*w#©":<2Ê:!ys#r# =:2= 2:=22 !͉##:=2FWRTE EQU 21 ;0=OK, 1=ERR, 2=?, 255=NO DIR SPC FMAKE EQU 22 ;255=BAD FREN EQU 23 ;255=BAD FDMA EQU 26 BDOS EQU 5 REBOOT EQU 0 NEXTT DW TABLE ;NEXT TABLE ENTRY COUNT DB 0 ;ENTRY COUNT SCOUNT DB 0 ;# TO SORT SWITCH DB 0 ;SWAP SWITCH FOR SORT FILESW:!":FC-L(FILES$  0_ ~-  #>    %* :FJ*w#"|=Lk++WRITE ERROR$!">.- > -> - ^#V#N#F #ʒ>2N#F#^q#Vpr+s:F(>-L(FILESyNAMES SUB0_ ----FMAP.COM---- AUTHOR: Ward Christensen OVERVIEW: Prints a sorted list of files on disk, with their size in records and K, and a map of the allocation groups where the file resides. Optionally writes the selected names to a file. Improvement over earlier FMAP in that the additional extents after the 1st are printed, and also for the new options: B, M, P, U. USAGE: FMAP Maps the logged in disk FMAP A: Maps disk A (Etc) Ambiguous references are allowed: FMAP A:*.ASM etc. FMAP can also produce a bit map of disk allocation. Each bit is printed as a 0 if no file is allocated to that 1K block or a 1 if a file is allocated, or even a 2 or more if due to disk errors more than 1 file are allocated to the same block. This is a B option: FMAP A: B The following all create a file called "NAMES.SUB" ON the logged in disk. The comments after the command show what is written to NAMES.SUB FMAP A: F fn.ft to NAMES.SUB (also lists to console) FMAP A: Q fn.ft ("  q"uiet i.e. no list) FMAP A: D $1 $2fn.ft $3 e.g. submit names type b: $1 $2 FMAP A: M $1 $2 $3fn.ft (for use with SUBMIT and my MODEM program) e.g. submit names modem so.600 b: $1 $2 $3 FMAP A: P $1 $2fn.ft$3 (VIEW OF SUBJECTS WITHIN NUMBERING SYSTEM. In order to make your own catalog, simply pip this entire disk over to your disk, then use the erase function of CP/M to erase the file MAST.CAT from YOUR disk ---- NOT THE LIBRARY DISK !!!!!!!!!!!!!!!!!for use with submit, and PIP, where $2 is the disk, and $3 is typically the "[V]" option). FMAP B: Unn Creates "CATALOG.nn" on the B: disk, which is the skeletal CP/M Users Group catalog, with headings, serial numbers, the # of K, and alphabetical!!!!!!!! PLEASE !!!!!!!!!!!!!!!!!!!!!!!!!!!! rename MAST-2-.CAT TO MAST.CAT, i.e. use CP/M's "REN" function as follows: *****ON YOUR DISK --- PLEASE----******* REN MAST.CAT=MAST-2-.CAT then do a carriage return This gives you an empty MAST.CAly sorted names. (Just thought you might be interested) DEPENDENCIES: 64 directory entries. 1.3 or 1.4 only. Probably gets mixed up by the high bits on in the filenames in 2.0. T FILE which looks exactly as described in the CATALOG.DOC instruction file. *ON YOUR DISK --- PLEASE----******* REN MAST.CAT=MAST-2-.CAT then do a carriage return This gives you an empty MAST.CA This catalog shows the disk contents of the disks in the CP/M INFO-NET LIBRARY. In order to use, as library reference, refer to CATALOG.DOC, or if you are partially familiar with the system, try SIMPLCAT.DOC. FILE CATCODE GIVES A GENERAL   CAT" OPERATION WILL PROCEED ON SCHEDULE. IT SEEMS THERE IS A MINOR GLITCH IN THE FMAP PROGRAM, WHICH I HAVEN'T PINNED DOWN YET,THAT SOMETIMES FAILS TO PUT THE FILE NAME OF THE DISK IN THE TEMPORARY "NAMES.SUB FILE. JBJ. ****QUICKY LIST OF CATALOG.COMMANDS**** *****TO RECOVER INFO FROM CATALOG****** CAT <-- LISTS ENTIRE CATALOG IN DOUBLE COLUMN SINGLE ENTRY FORMAT CAT2 <-- LISTS ENTIRE CATALOG IN SINGLE COLUMN MULTIPLE ENTRY FORMAT. CAT -*.* <-- LISTS ALL DISK TITLES *****QUICK REFERENCE ***** FOR MORE DETAIL, SEE CATALOG.DOC, OR CATINST.DOC. TO LOG A DISK INTO THE CATALOG, GIVE IT A FILE TITLE (SEE CATALOG.DOC, OR CATINST.DOC) USING "SAVE 0 -NAME.NNN", THEN PLACE CATALOG DISC ON DRIVE A, DISK TO BE C KNOWN TO CATALOG. CAT *.* WORK.* <-- LISTS ALL FILES ON ANY "WORK" DISK CAT *.* *.002 <-- LISTS ALL ENTRIES FOR DISK .002 CAT *.ASM <-- LISTS ALL .ASM FILES CAT *.* <-- LISTS ALL FILES STARTING WITH "A" CAT *.* *.8* <-- ALL FILES ON DISKS WITH ATALOG ON DRIVE B, THEN USE  A:FMAP B: F = CARRIAGE RETURN. THIS CREATES THE TEMPORARY "NAMES.SUB" FILE. AS SOON AS IT RETURNS TO CP/M, AS INDICATED BY THE "A:", TYPE A:UCAT THE CATALOG IS THEN UPDATED, THE TEMPSERIAL NUMBERS 8xx CAT *.BAS WORK.* <-- LISTS ALL ".BAS" FILES ON ANY DISK WITH THE NAME "WORK" (ANY SERIAL #) NOTE: Anything you type following the complete CAT command i.e. using the full "CAT filename.NNN diskname.NORARY "NAMES.SUB" FILE IS ERASED, AND IS RETURNED TO CP/M IF WHEN YOU TYPE "UCAT " YOU GET AN ERROR MESSAGE TELLING YOU TO TYPE IN THE FILE TITLE OF THE DISK, DON'T PANIC, JUST TYPE AS FOLLOWS: A:UCAT -FILENAME.NNN AND THE "UNN" appears as the title of the resulting listing. This is particularly useful for keeping and dating hardcopy listings. For example: CAT *.* *.* AS OF 22/1/81 will result in the title: FILES: *.* *.* AS OF 22/1/81 appearing on each page   of the catalog listing. r example: CAT *.* *.* AS OF 22/1/81 will result in the title: FILES: *.* *.* AS OF 22/1/81 appearing on each page SIMPLIFIED INSTRUCTIONS FOR CATALOG T us CATALO i i necessar t plac a th firs director ite on each disk in the directory th following: -NAME.001 - NAME . 000 Minus sign name of file period file number Th locatio a firs entr o dis i easil mad by: Save 0 -NAME.000 Nam ma b u t character (includin numbers) Shorte name eas scann  in o th listing. Th fil number ma b fro 00 t 999 Fo you director yo ma d somethin lik th following: .001 - .099 Info-net .100 - .199 Games .200 - .299 Machine code .300 - .399  Thes堠 program wil b omitte from th catalo listings. Must be totally inclosed in parenthesis (). Fo printin o 6 lin printer star print-ou abou 10 lines from top of page. The use of CONTROL-P will start printer iMbasic .400 - .400 Cbasic O yo ma wan seperat director fo eac serie o programs. Catalo dis o driv "A" dis t b liste o "B": (May be reversed by the use of A: etc.) FMAP B: F f desired. CAT *.* *.* As of 12/11/80 Prints dated heading of 12/11/80 CAT *.ASM LISTS .ASM PROGRAMS CAT PRIMES*.* LISTS PRIMES/PRIMES1/etc. GOOĠ LUCK FRO͠ NOנ O YO WIL̠ KNOנ WHERŠ EVER PROGRAM  The space between : and F is necessary!!! FMA wil mak listing yo ma edi thi t remov an item no desire o fina listing If fo instance basi progra ha on o mor files i i ofte desirabl to removIS LOCATED IN YOUR LIBRARY !!!!! (You hope.) (Don't forget to back them up!)S CAT PRIMES*.* LISTS PRIMES/PRIMES1/etc. GOOĠ LUCK FRO͠ NOנ O YO WIL̠ KNOנ WHERŠ EVER PROGRAM e files from listing. When ready to place listing in catalog: UCAT Thi wil remov temporar files an updat catalog. Use WordStar or other editor to make a file: MAST.CAT .PA I everythin o you disk i desire mak firs ite on the file: (DUMMY.000) Anything not wanted listed on each file, i.e.: (PIP.COM STAT.COM DDT.COM FORMAT.COM WS.COM WSMSGS.OVR WSOVLY.OVR)   FOR IGNORED NAMES TEST EQU 0 ;TESTING? MACLIB SEQIO FILERR SET EXIT ;EXIT IF ERRORS MOVE MACRO ?F,?T,?L MVI B,?L LXI D,?F LXI H,?T CALL MOVER ENDM COMPARE MACRO ?F1,?F2,?L MVI B,?L LXI D,?F1 LXI H,?F2 CALL COMPR ENDM ; ;SAVE CP/M'S STACK ; POP H ;GET CP/M RET ADDR SHLD EXIT+1 ;SAVE IN EXIT JMP LXI SP,STACK FILE INFILE,MASTIN,,MAST,CAT,BSIZE FILE INFILE,NAMES,,NAMES,SUB,BSIZE IF NOT TEST FILE OUTFILE,MASTOUT,,NEW,CAT,BSIZE ENDIF FILE SETFILE,BAK,,MAST,BAK ; ;SETUP THE FILES ; INITRD CALL READNA ;READ NAMES FILE ; ;IF NAME IS $$$.SUB THEN SKIP IT ; COMPARE NADAT,SUBNAME,12 JZ INITRD ; ;CHECK FOR '-DISKNAME' HAVING BEEN READ ; LDA NADAT CPI '-' JZ NAMEOK CALL MSGXIT DB '++NO ''-NAME'' IN DIRECTORY$' ; NAMEOK MOVE NADAT+1,DKNAME,7 MOVE NADAT+9,DKNAME+9,3 ; ;READ IN THE NAMES TO BE IGNORED (I.E. NOT ;CATALOGED). THEY ARE AT THE FRONT OF MAST CAT. ;THEY ARE SIMPLY A LIST OF FILENAME.FILETYPE (CR/LF) ;WITH THE FIRST HAVING A ( BEFORE IT;MASTER CATALOG UPDATE - UCAT.ASM ;01/07/78 BY WARD CHRISTENSEN ;01/10/78 ADD: ; (RUN UCAT) ; ERA MAST.BAK ; REN MAST.BAK=MAST.CAT ; REN MAST.CAT=NEW.CAT ; ERA NAMES.SUB ORG 100H BSIZE EQU 4096 ;DK BUF SIZE (TIMES 3) IGNSIZE EQU 1024 ;BUFF , AND THE ;LAST HAVING A ) AFTER IT. ; GET MASTIN ;GET THE LEADING '(' JZ NOIGN ;IF EOF CPI '(' JNZ NOIGN PUT MASTOUT LXI H,IGNORE ;POINT TO BUFFER LXI B,IGNSIZE ;FOR BUFFER OVERFLOW TEST IGNRD PUSH B PUSH H GET MASTIN JZ IGNEOF ;UNE  XPECTED EOF PUSH PSW ;SAVE CHAR PUT MASTOUT POP PSW POP H POP B MOV M,A INX H CPI ')' JZ IGNEND ;TABLE IS LOADED DCX B ;MORE ROOM IN TABLE? MOV A,B ORA C JNZ IGNRD ;TABLE OVERFLOW CALL MSGXIT DB '++TOO MANY IGNORE NAMES FOR T CALL MESG CALL READNA ;READ NEXT NAME JMP COMPLP ADDMSG DB 'ADD: $' ; ;BOTH FILES EQUAL ; EQUAL MOVE MIDAT,MODAT,25 CALL WRITEMO ;WRITE OUT MASTER JMP NAMELP ;READ BOTH ; ;READ NAME FILE ; READNA LXI H,NADAT MVI B,8 CALL READNAC ;READABLE$' NOIGN CALL MSGXIT DB '++NO IGNORE NAMES IN MAST.CAT$' IGNEOF CALL MSGXIT DB '++EOF READING FOR IGNORE NAMES.' DB 0DH,0AH,'MAY BE MISSING ) AFTER LAST NAME.$' IGNEND GET MASTIN JZ IGNEOF PUSH PSW PUT MASTOUT POP PSW CPI 0AH JNZ I CHARACTERS MVI M,'.' INX H MVI B,3 ;TYPE LENGTH CALL READNAC MVI M,',' ; ;IF THIS IS A NAME NOT TO BE CATALOGED, ;READ THE NEXT ; LXI D,IGNORE ;GET IGNORE TABLE IGNLP LXI H,NADAT MVI B,12 ;# OF CHARS TO MATCH IGNCLP LDAX D CMP M JZGNEND ;DELETE CR/LF ;PRIME THE BUFFERS ; NAMELP CALL READNA ;READ NAME INTO NADAT MASTLP CALL READMI ;READ MASTER INTO MIDAT ;IF EOF ON BOTH FILES, WE ARE ALL DONE COMPLP LDA NAEOFLG ;NAME FILE EOF? ORA A JZ NOTEOF ;..NO LDA MIEOFLG ;MASTER IN  IGNMAT ;MATCHED MOV A,M ;GET CHAR CPI ' ' ;SPACE? JZ IGNMAT1 ; ;GET NEXT ENTRY ; IGNEXTE LDAX D INX D CPI ')' ;END OF TABLE? RZ ;..YES, RETURN CPI 0AH ;NEXT LINE? JNZ IGNEXTE JMP IGNLP ; ;CHAR MATCHED ; IGNMAT INX D ;SKIP MATCH EOF? ORA A JNZ ALLDONE ;YES, THAT'S IT. NOTEOF COMPARE NADAT,MIDAT,25 JZ EQUAL JC WRITEN ; ;MASTER IS LOWER - WRITE IT IF FOR ANOTHER DISK ; COMPARE MIDSK,DKNAME,12 ;SAME DISK? JZ DELMI ;DELETING MIDAT MOVE MIDAT,MODAT,25 CALL WRITEMO CHAR IGNMAT1 INX H DCR B JNZ IGNCLP ;LOOP UNTIL DONE ; ;NAME IS TO BE DELETED ; JMP READNA ;READ NEXT NAME ; ;READ CHARACTERS INTO NAME BUFFER ; READNAC LDA NAEOFLG ;EOF ON NAMES? ORA A JNZ NAEOF ;YES, PAD W/0FFH PUSH H PUSH B GETNA  JMP MASTLP ; ;DELETE MASTER IN ; DELMI LXI D,DELMSG LXI H,MIDAT CALL MESG JMP MASTLP DELMSG DB 'DEL: $' ; ;NAME IS LOWER - WRITE IT ; WRITEN MOVE NADAT,MODAT,25 CALL WRITEMO ; ;PRINT THAT NAME WAS ADDED ; LXI D,ADDMSG LXI H,NADAT GET NAMES CPI 0AH JZ GETNA ;IGNORE LF POP B POP H CPI '.' ;END? JZ NAEND CPI 0DH ;END? JZ NAEND CPI 'Z'-40H ;EOF? JZ NAEOF MOV M,A INX H DCR B JNZ READNAC PUSH B PUSH H GET NAMES ;KILL DELIMITER CHAR POP H POP B CPI   'Z'-40H ;EOF? RNZ STA NAEOFLG RET NAEND MVI M,' ' INX H DCR B JNZ NAEND RET NAEOF MVI M,0FFH INX H DCR B JNZ NAEOF MVI A,1 STA NAEOFLG RET ; ;READ MASTER IN NAME ; READMI LXI H,MIDAT CALL MINAME ;GET FILE NAME MVI M,',' 5 WRMOL MOV A,M CPI ' ' ;NULL CHAR? JZ WRSKIP PUSH B PUSH H IF NOT TEST PUT MASTOUT ELSE PUT CON ENDIF POP H POP B WRSKIP INX H ;POINT TO NEXT CHAR DCR B JNZ WRMOL ;LOOP UNTIL DONE MVI A,0DH IF NOT TEST PUT MASTOUT ELSE ;SEPARATOR INX H CALL MINAME ;GET DISK NAME RET ; ;READ MASTER IN, 1 FIELD ; MINAME MVI B,8 CALL READMIC ;GET CHARS MVI M,'.' INX H MVI B,3 CALL READMIC ;GET TYPE RET ; ;READ CHARS INTO MASTER NAME ; READMIC LDA MIEOFLG ORA A  PUT CON ENDIF MVI A,0AH IF NOT TEST PUT MASTOUT ELSE PUT CON ENDIF RET ; ;PRINT MESSAGE IN DE, THEN NAME IN HL ; MESG PUSH H MVI C,@MSG CALL @BDOS POP H MVI B,12 ;NAME + '.' + TYPE MESGL PUSH H PUSH B MOV A,M ;GET CHAR JNZ MIEOF PUSH H PUSH B GETMI GET MASTIN CPI 0AH ;IGNORE LF JZ GETMI ;L/F'S POP B POP H CPI ',' JZ MIEND CPI '.' JZ MIEND CPI 0DH JZ MIEND CPI 'Z'-40H ;EOF? JZ MIEOF MOV M,A INX H DCR B JNZ READMIC PUSH B PUSH H GCPI ' ' JZ MESGS ;SKIP IF ' ' PUT CON MESGS POP B POP H INX H DCR B JNZ MESGL MVI A,0DH PUT CON MVI A,0AH PUT CON RET ; ;MOVE SUBROUTINE (DE)=>(HL), LEN IN (B) ; MOVER LDAX D MOV M,A INX D INX H DCR B JNZ MOVER RET ;ET MASTIN ;GET DELIMITER POP H POP B CPI 'Z'-40H ;EOF? RNZ STA MIEOFLG RET MIEND MVI M,' ' INX H DCR B JNZ MIEND RET MIEOF MVI M,0FFH INX H DCR B JNZ MIEOF STA MIEOFLG ;SHOW EOF RET ; ;WRITE AN ENTRY TO MASTER OUT ;ALSO B ;COMPARE ROUTINE (DE)<=>(HL), LENGTH IN B ; COMPR LDAX D CMP M RNZ ;RET W/NON ZERO SET INX D INX H DCR B JNZ COMPR RET ;ZERO SET, SHOWS = ; ;ALL DONE - WRITE EOF TO OUTPUT, RETURN ; ALLDONE EQU $ MVI A,'Z'-40H ;EOF CHAR IF NOT TUMP COUNT OF ENTRIES WRITTEN ; WRITEMO LXI H,COUNT+3 BUMP MOV A,M ;GET COUNT DIGIT CPI ' ' JNZ BUMPNB MVI A,'0' BUMPNB INR A MOV M,A CPI '9'+1 ;TIME TO CARRY? JNZ BUMPD ;..NO, DONE MVI M,'0' DCX H JMP BUMP BUMPD LXI H,MODAT MVI B,2EST PUT MASTOUT FINIS MASTOUT ENDIF ; ;RUN WAS SUCCESSFUL - SET FINAL FILE DISPOSITIONS ; ERASE BAK ;ERA CAT.BAK ERASE NAMES ;ERA NAMES.SUB RENAME BAK,MASTIN ;REN MAST.BAK=MAST.CAT RENAME MASTIN,MASTOUT ;REN MAST.CAT=MAST.NEW CALL MSGX  IT DB 'MAST.CAT HAS ' COUNT DB ' ENTRIES.$' ; MSGXIT POP D ;GET MSG MVI C,@MSG CALL @BDOS EXIT JMP $-$ ;TO CP/M RETURN ADDR DS 50 ;STACK SPACE STACK EQU $ NAEOFLG DB 0 ;NAME FILE EOF FLAG MIEOFLG DB 0 ;MASTER IN EOF FLAG NADAT DB 'XXXXXXXX.YYY,' DKNAME DB ' . ' MIDAT DB 'XXXXXXXX.YYY,' MIDSK DB 'XXXXXXXX.YYY' MODAT DB 'XXXXXXXX.YYY,XXXXXXXX.YYY' SUBNAME DB '$$$ .SUB' ;NAMES TO BE IGNORED READ IN HERE: IGNORE DB ')' ;DUMMY END OF TABLE DS IGNSIZE BUFFERS EQU $ MEMS"11MAST CATv;:0w  á*-*/}|ڊ!"/*-{z|*+ v*/"/H*/"-!"/*+*-}>*/#"/ɯ22*!"-"/ <  NO MASTIN FILE$NAMES SUBH USE FACTOR !/w IZE EQU BUFFERS+@NXTB BNAME DB '$$$ .SUB' ;NAMES TO BE IGNORED READ IN HERE: IGNORE DB ')' ;DUMMY END OF TABLE DS IGNSIZE BUFFERS EQU $ MEMS"s**}|\!"*{zN*H*"*"!"**}>*#"ɯ22!""<ª  NO NAMES FILE$NEW CAT  NO Mw4N Y**}|I!"*{z;**" & DISK FULL: MASTOUT$!"**#"ɯ22!"!"<£  NO DIR SPACE: MASTOUT$MAST BAK CAT  !j8:-b:]-&:g ++SERIAL MUST BE 3 DIGITS$^!,/e!5/x++NO "-NAME.NNN" IN NAMES.SUB ++REISSUE: UCAT -name.nnn$ !,/(!5/4(!v4w#)4 xŒ++TOO MANY IGNORE NAMES FOR TABLE$++NO IGNORE NAMES IN MAST.CAT$++EOF READING F  OR IGNORE NAMES. MAY BE MISSING ) AFTER LAST NAME.$4 4JW:[:B!88ڝ E!,8ʋ8!Q/J!8JDEL: $!Q/!MADD: $8!Q/G! 6.# 6,v! ~ ) P7>P+*/"*wM*P4*z"~"M:tDJ*DM͕MSgYLYv !\q*\& !]q*]& !_p+q*^ !ap+q*` 2[!cp+q*b 2[!ep+q*d !gp+q*f !ip+q*h 2[!kp+q*j#:J .B BJw# 26 #B6#J>2!8d6,#dr6.#r:µ4 {,ʭ.ʭ ʭʵw#r426 #­6#µ2!~ >0 >   2[!mp+q*l  !nq*n& !pp+q*o  g g!rp+q*q A!s6!Y"z"~"*z"!6!6*"|!+p+q:sO**",|S!".![6>.P:[H*,DM1*,",*.+".ð:[!s6*," ~ _#> _> _w#/#8>*}S">G<‹ tË CANNOT CLOSE MASTOUT$ò w# £! ͞! ͞MAST.CAT HAS ENTRIES.$ > >  1:s/,H+s#r*,~/*,#",*,+",*,~ I*,+",6*,"!2r+s+q:0›>1P~CHҘ*~~ Ž*1+"1*~#"~`*1#"1>1Pz~CH*~~ *1+"1*~+"~âz~C*~#"~*~"!46~ ~ _#> XXXXXXXX.YYY, . XXXXXXXX.YYY,XXXXXXXX.YYYXXXXXXXX.YYY,XXXXXXXX.YYY$$$ .SUB)SE MASTOUT$ò w# £! ͞! ͞MAST.CAT HAS ENTRIES.$ > >  Cf*~~23 Z:3 '*3Mg!44P:4O>26!56:6!5P g!44#48*~#"~*~#"~ g*"8"~!76>!7ڈ!74u*~"*8"~!;p+q>:P¼~C"@*~">+*z"<>:P!"B>BP*<~ *B+"B*<#"<S !Display Ver.1.0, Oct.,30,1980$1Y.!\ -,_͗:[NL *zDM͇g:t mgYÅBy4E҅ !w6!":t- !w6͟:t02xO> *x&"͟:t02xO> *)))*) *x& "͟ú:tL*wM*PM:t!"B!":*:+":<C"@*<">*@*>DM*z +|9z>C#s#r>~Cn@~C+s#rt*z"~*~"@C+s#r@C+s#r*DM͇*u& ~2tO>Zһ:t2t:u<2u*g͇ g:2v!t6 !u6͟!Dq!D:t:v  HDM!>))덑o|g) =DM!>))> =6i`N#Fogo&ogn@~C+s#rt*z"~*~"@C+s#r@C+s#r*DM͇*u& ~ File not found$ Illegal command$ۑ@!!\ #~?-#ʻMn+~OŸ+~CŸ++CAN'T DISPLAY .COM FILES$JŸ+~BŸ+~OŸ++CAN'T DISPLAY .OBJ FILES$\ FILE XXXXXXXX.XXX !"!H~0}ƀo|g­+~+w+++×#~g}o|g~ +p+q2h2|:L>2!\ ͌:\2!\ ͌\À!\ ͌\!\ ͌\<7=Ɓo& ͌] ͌2h#fo> ++ABORT++$ *p\!9"1bV!NK %#~> > >JͲͷUI6> ?*> 7?r I SOME KIND OF ERROR $FILE NOT FOUND $\Ig!6!"!5*~I#"!4 ?5 2? :;> ?!4 Ͳ > :4ͷ O> ? *>^?@?_\j2|2ɯ222<2:] ʓ?ʓ:mC>2C>2>2̓!I List - will list a source text file in ascii form (or compressed ascii) from a   file to either the printer or console. The 1st argument is the source filename. The 2nd argument may be: "C" = list to console. or " " = list to printer. :!\I> ?*Q!*#"22 More....~#? Sorcim List program. Version 00.01 Page 123 asmyLOGIN VERSION A00 14-MAR-81 (WRITTEN BY ROBERT E. SPIVACK) INSERT THE DESIRED DISCS, THEN PRESS C/R TO CONTINUE...$  Ͱ(THE DISC SYSTEM HAS BEEN RESET.) $ :I:I:I:I}0>02_>0]T< ==kbG:_V> x>2_0~0~0#y`2E#~:+:\•~@##:<~>:7.~.#y! :E7x7~#.*>?~# G>  x!|;=:@2#2*2?72Ea>{ w~:+:\•~@##:<~>:7.~.#y! :E7x7~#.*>?~# G>    :j#"d#"d+\#*d+"d|} ͟!KN*d~ ͟ !cyq>f#I*d#"dv ʑ!'&--- BYTE SEARCH PROGRAM --- HOW MANY BYTES (1-8)? ENTER "XX" FOR UNKNOWN BYTES: HEX BYTES? START ADDRESS? END ADDRESS? NO MATCH ^C -- SEARCH ABORTED -- xy͹:c!&:L=2L,N+Fq#p͑0u:AuXGu:l<2lxͫXx ͟2l ͟:l( ͟͟ß!aF͟#Fß!aGw#xw0:!))))?؅o 0 F͟#&K"7!!&*I:AuXGu:l<2lxͫXx ͟2l ͟:l( ͟͟ß!aF͟#Fß!aGw#xw!9"I1m*"!&1m͹1!&#͑>1+9+G͟0O2K2c͹&#MZðuG:kxʐXZ͟uXpG͟ ͟} ZXª͟uX͟ ͟Êk͹&>2k#dZh͹&gZh͹͹͹!gN#FM*d2j:K2LB  +9 ;FILE TYPE FCBCR EQU FCB+32 ;NEXT RECORD ; ; SAVE OLD STACK, SET UP NEW ONE ; START: LXI H,0 DAD SP SHLD OLDSP ;SAVE STACK LXI SP,STACK CALL SETUP ;SET UP INPUT FILE CPI 255 JZ NOFILE ;FILE NOT PRESENT MVI A,80H STA IBP ;BUFFER POINTER END LXI H,0 ;START POINTER AT 0 ; GLOOP: PUSH H ;SAVE POINTER CALL GNB POP H JZ FINIS ;END OF FILE MOV B,A CPI EOF ;END? JZ FINIS ;YES CALL PCHAR ;PRINT BYTE MOV A,B ANI 7FH CPI CR ;END OF LINE? JNZ GLOOP ;NO ; ; NEW; FROM INTERFACE AGE NOVEMBER 1981 ; PAGES 112 AND 170-172 ; By Alan R. Miller ; SHOW - DISPAY FILES BY TYPING - SHOW(Filename.xxx) ; DISPLAYS 22 LINES - WAITS FOR "SPACE BAR" ; ELIMINATES NEED FOR CONTROL "S" TO STOP LISTING ; A CP/M PROGRAM TO DISP LINE, INCREMENT COUNT ; LDA LCOUNT INR A STA LCOUNT CPI LMAX ;FULL PAGE? JNZ GLOOP ; ; FREEZE SCREEN UNTIL SPACE BAR PRESSED ; OR ABORT IF OTHER KEY PRESSED ; PUSH D LXI D,LMES ;MESSAGE CALL PRINT POP D FREEZE: CALL ABORT ;CHECK CLAY ASCII FILES ; chs ; ORG 100H ; LMAX EQU 22 ;MAX LINES/SCREEN BDOS EQU 5 ;DOS ENTRY POINT CONS EQU 1 ;READ CONSOLE TYPEF EQU 2 ;WRITE CONSOLE PBUF EQU 9 ;PRINT CONSLOE BUFFER BRKF EQU 11 ;CONSOLE READY OPENF EQU 15 ;FILE OPEN READF EQU ONSOLE RRC JNC FREEZE ;LOOP UNTIL CHAR CALL READ ;GET THE CHAR ANI 7FH CPI ' ' ;BLANK? JNZ FINIS ;ABORT XRA A STA LCOUNT ;RESET LINE COUNT MVI A,CR CALL PCHAR ;SEND CARRIAGE RETURN JMP GLOOP ; ; NO SUCH FILE, GIVE ERROR MESSAGE20 ;READ FUNCTION ; FCB EQU 5CH ;FILE CONTROL BLOCK BUFF EQU 80H ;DISK BUFFER ADDRESS ; CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED EOF EQU 1AH ;END OF FILE ; ; FILE-CONTROL BLOCK DEFINITIONS ; FCBFN EQU FCB+1 ;FILE NAME FCBFT EQU FCB AND QUIT ; NOFILE: LXI D,OPNMSG CALL PRINT ; ;DONE, RETURN TO CCP ; FINIS: CALL CRLF LHLD OLDSP ;GET OLD STACK SPHL RET ;TO THE CCP ; ; READ CONSOLE CHARACTER ; READ: PUSH H ;SAVE REGISTERS PUSH D PUSH B MVI C,CONS ;CONSOLE INPU  T CALL BDOS POP B ;RESTORE REGISTERS POP D POP H RET ; ; CHECK CONSOLE FOR KEY PRESSED ; ABORT: PUSH H ;SAVE THE REGISTERS PUSH D PUSH B MVI C,BRKF CALL BDOS POP B ;RESTORE REGISTERS POP D POP H RET ; ; SEND CARRIAGE RETUBORT ; LXI D,CMES ;ERROR MESSAGE CALL PRINT ;SEND JMP FINIS ; SET2: LXI D,FCB MVI C,OPENF JMP BDOS ; ; READ DISK FILE RECORD ; DISKR: PUSH H ;SAVE REGISTERS PUSH D PUSH B LXI D,FCB MVI C,READF CALL BDOS POP B ;RESTORE REGISTERRN AND LINE FEED ; CRLF: MVI A,CR CALL PCHAR MVI A,LF ; ; PRINT CHARACTER IN ACCUMULATOR ; PCHAR: PUSH H ;SAVE REGISTERS PUSH D PUSH B MVI C,TYPEF MOV E,A CALL BDOS POP B ;RESTORE REGISTERS POP D POP H RET ; ; PRINT BUFFER S POP D POP H RET ; ; STORAGE AREA ; OPNMSG: DB CR,LF DB 'ERROR--Disk file not found$' CMES: DB CR,LF,'Can''t print com files$' LMES: DB CR,LF DB 'Press space bar to continue,' DB ' or anything else to quit.$' ; LCOUNT: DB 0 ;LINES PEUP TO $, POINTER IS DE ; PRINT: MVI C,PBUF JMP BDOS ; ; GET NEXT BUTE FROM DISK BUFFER ; GNB: LDA IBP CPI 80H JNZ GBYTE ; ; READ ANOTHER BUFFER ; CALL DISKR ORA A ;ZERO IF READ OK JZ GBYTE ;FOR ANOTHER BYTE STC ;END IF DATA RET R SCREEN IBP: DS 2 ;INPUT BUFFER POINTER OLDSP: DS 2 ;INCOMING STACK POINTER ; DS 30 ;STACK SPACE STACK: ENDnt com files$' LMES: DB CR,LF DB 'Press space bar to continue,' DB ' or anything else to quit.$' ; LCOUNT: DB 0 ;LINES PE ; ; READ THE BUTE AT BUFF + ACCUMULATOR ; GBYTE: MOV E,A ;PUT A IN DE MVI D,0 INR A ;NEXT STA IBP ;SAVE ADDRESS LXI H,BUFF DAD D ;ADD OFFSET MOV A,M ;GET BYTE ORA A ;RESET CARRY RET ; ; SET UP FILE AND OPEN FOR INPUT ; SETUP: X!9"f1d>2d!ͣjGj͑x :c<2c*͞~Gr j2c> ͑͊͞*f > ͑> _ :d´ʴ7_<2d!~ɯ2|*e}C|O͞j\\ ERROR--DiRA A ;ZERO ACCUMULATOR STA FCBCR ;RESET RECORD ; ; CHECK FOR COM FILE ; LHLD FCBFT ;FILE TYPE MOV A,L ;FIRST CHARACTER CPI 'C' JNZ SET2 ;NOT COM MOV A,H ;SECOND CHARACTER CPI 'O' JNZ SET2 ;NOT COM ; ; TELL ABOUT COM FILE AND THEN Ask file not found$ Can't print com files$ Press space bar to continue, or anything else to quit.$ > ͑> _ :d´ʴ7_<2d!~ɯ2|*e}C|O͞j\\ ERROR--Di   SHOW SHO i progra writte b Ala R Miller Interfac Age November 198 - page 11 an 170-172 SHOW i use i plac o TYPE(filename.xxx t prin ou fil (hex doc,txt etc) I wil prin ou 2 line an wai fo th SPAC ba t b pressed An othe characte wil retur t CP/M Thi allow eas readin fro file withou usin CONTRO t stop Sinc SHO i a executabl fil i ma als b use unde th n fil leve o Wordstar. (Use "R" function). I you scree i not a 2 lin screen chang LMA to 2 less than lines of your screen. Us CP/ AS t asembl SHOW Tr i --- you'l lik it. Howie Us CP/ AS t asembl SHOW Tr i --- you'l lik it. !  ALOGED and the CATALOG SYSTEM DISK will alternately be inserted in Drive A: :A2p2:A22\2_ CATALOG SYSTEM DISK *MUST* remain in Drive A: When requested, mount DISK TO BE CATALOGED in Drive A: ::_ A scratch disk *MUST* remain in Drive A:1Y-!""!"! " " >)2 22!"_ Mount DISK TO BE CATALOGED in Drive B:, Ready? (Y/N) _ʕ ʘYFt  :_ !\ e ! .FRE e ͌ !6 #6 #\<&=o&)))))-p 6.#p 6 #6 #*#"6*+""gv!Pb#B*+"|:(Nwy#gS:-_ ++MISSING "-NAME.nnn" FILE ON DISK. PUT THE NAME FILE ON THE DISK BEFORE RUNNING THIS DISK AGAIN. : _ Mount CATALOG SYSTEM DISK in Drive A:, press RETURN :u_ Mount CATALOG SYSTEM DISK in Drive A:, press RETURNt  :_îMAST CAT" FILE ON DISK. PUTY-@ N**}|!"*{z**"*"" 1Y-_ Diskette Catalog Maintenance Utility, V2.8 "Free Space" option ENABLED. 51K CP/M required to run. Type "NEWCAT ?" for help. :]? ! "*Zzҗ!w#w:lʺ=w:\=2:>=2S:A2J2p22\_ The DISK TO BE CAT!"**}>*#"ɯ22!@""kT / 5 z/W{/_y1S xyT >+T *w#"~_#~` #_ > _> _ ???????????XXXXXXXX.YYY, . XXXXXXXX.YYY,XXXXXXXX.YYYXXXXXXXX.YYY,XXXXXXXX.YYYFRE͍_ { ++NO IGNORE NAMES IN MAST.CAT{ ++EOF READING FOR IGNORE NAMES. MAY BE MISSING ")" AFTER LAST NAME.ͱ!̓ i  :ʍ:>  ! ͂   ! ͂ ʽ ! e |! 0 |DEL: $ ! e ! 0  ADD: $ ! e  NEWCAT NEWCAT IS A PART OF THE DISKETTE CATALOG SYSTEM UTILITY. IT READS THE DISK DIRECTORY OF THE "DISK TO BE CATALOGED" AND UPDATES THE FILE "MAST.CAT", WHICH IT EXPECTS TO FIND ON THE CATALOG SYSTEM DISK. THE PROGRAM WILLy! + 6.#+ 6, !  5 ~ 6 ) (  #  >̓*~}O "|>̓C Y<‡  p Ç CANNOT CLOSE MASTOUT$Ræ  w# — !R͒ !Y͒ _ MAST.CAT now has entries. THIS UPDATE COMPLETE._ ANOTHER  WORK WITH A SINGLE DRIVE SYSTEM, BUT IS MUCH EASIER TO USE ON A MULTI-DRIVE SYSTEM. THE "DISK TO BE CATALOGED" AND THE "CATALOG SYSTEM DISK" MAY EACH RESIDE ON ANY DESIRED DISK DRIVE BY USING THE RUNTIME OPTIONS DESCRIBED IN THE NEXT FRAME. DISK TO CATALOG (Y/N) _ YÕ :i v 4 .a a i w#+ v 26 #a 6#i >2*~#"! ͌ 6,#͌ ͚ 6.#͚ : ͱ ʣ , .  w#š ͱ26 # 6# 2 ! ͂  ! ~  > HIT ANY KEY TO PROCEED:͍_ NEWCAT USEAGE AND SYNTAX: NEWCAT YOU WILL BE ASKED TO ALTERNATELY INSERT THE CATALOG SYSTEM DISK (CONTAINING MAST.CAT) AND THE DISK TO BE CATALOGED IN THE CURRENTLY 0 ̓> ̓  ~ I _#9 > _> _w#e ,z >/w#p #‚ "^#V#"*##~  2*~ z #þ *#":*= ) { ++CAN'T READ FR LOGGED DRIVE. NEWCAT B: MAST.CAT WILL BE FOUND ON THE LOGGED DRIVE, BUT USE THE SPECIFIED DRIVE FOR THE DISK TO BE CATALOGED (DRIVE B: IN THIS EXAMPLE.) IF THE SPECIFIED DRIVE IS THE SAME AS #  THE CURRENT DRIVE, YOU WILL BE ASKED TO ALTERNATELY INSERT THE DISKS. NEWCAT B: C: MAST.CAT WILL BE FOUND ON THE SECOND SPECIFIED DRIVE (HERE, DRIVE C:), WHILE THE DISK TO BE CATALOGED WILL BE PLACED IN THE FIRST SPECIFIED DRIVE (HERE, DRIVE B:). HIT ANY KEY TO PROCEED:͍_ GETTING STARTED: EACH DISKETTE MUST CONTAIN A FLAG FILE WHICH SPECIFIES THE DISK NAME AND/OR NUMBER. THE FIRST CHARACTER OF THE FILE NAME OF THE FLAG FILE MUST BE A "-". CREATE THE FLAG FILE, FOR EXAMPLE, BY "SAVE 0 -DISK.001". WHEN YOU FIRST START USING THE SYSTEM, YOU MUST CREATE A FILE NAMED "MAST.CAT", AND PLACE IN THIS FILE A LIST OF FILE NAMES TO IGNORE IN THE CATALOGING PROCESS. THIS LIST SHOULD HAVE 1 NAME PER LINE, AND SHOULD BE ENCLOSED IN PARENTHESIS, FOR EXAMPLE: (STAT.COM PIP.COM ED.COM) Õ &t %{  ++ FATAL ERROR - CP/M system too small for this .COM file. Memory requirements can be reduced by rDocumentation of various original programs written by Ward Christensen -----FIND.COM----- OVERVIEW: Finds ASCII, upper case character strings in a file. May take a generic file name, thus may search all .ASM files on a disk. Also very useful foeducing the BUFSIZE equate in the .ASM file and reassembling. $.COM) Õ &t %{  ++ FATAL ERROR - CP/M system too small for this .COM file. Memory requirements can be reduced by rr finding things in MAST.CAT - for example if you have multiple VDM routines: VDMSCROL.ASM, PRINTVDM.ASM, etc you could FIND MAST.CAT VDM to see them all. USAGE: find b:*.asm alpha will find all occurrences of ALPHA in all .ASM files on B:. $   Used with LIST.COM which takes a starting line number, you can: 1) use find to find a particular part of the code, then 2) use LIST specifying a starting line number just before the part of the code you wanted to see. DEPENDENCIES: Note that FIND is a quickie program - it gets the label to search for from the second FCB so you can't put some special characters in the ASCII string. I.E. find b:*.asm in.to would find IN (since .to would be put as the filetype). DISPLAY.DOC To display an ASCII file on the console, type DISPLAY filename.typ (e.g., DISPLAY FILENAM.TXT). DISPLAY uses commands simlar to the CPM editor ED.COM (without editing features). The commands are: B move pointer to beginning of file and display page -nP move pointer - n pages and display nP move pointer n pages 0P move pointer to beginning of buffer -nL move pointer -n lines and display nL  move n lines etc. nD discard n pages, refill buffer and display 0D discard buffer and display first page. E Exit DISPLAY and go to CP/M. ^C Exit DISPLAY and go to CP/M. Carriage return, move pointer to next page The pointer is always at the top of the screen display. When there is no more file data to dis- play, will result in repeat of the * prompt. %  ions, refer to HELP1, HELP2, and the .DOC files SIMPLCAT, CATALOG, and CROSSREF. The NEWCAT program, obtained from the Osborne Users Group (OUG) of the Washington D.C. area, obviates the need to run FMAP and UCAT. For instructions, place NEWCAT.COM in drive A. At the A> prompt, type NEWCAT ? Then read CATALOG.DOC to learn how to run CAT. A skeleton MAST.CAT file is provided. To catalog your own library, PIP NEWCAT.COM, CAT.COM, and MAST.CAT from this disk to another disk. Place the result in drive A. At the A> prompt type NEWCAT B: When prompted, place the disks to be cataloged in drive B. The remaining utilities were previously found on -FOG.016. DISPLAY is for viewing an ASCII file on the console. Refer to its .DOC file, which was copied from information supplied by OUG. LIST was submitted by Byron McKay of FOG. It lists an ASCII file on the printer (60 lines/page with heading and page number) or on the console (24 lines/screen). To use, p DISK.DOC -FOG/UTL.002 First Osborne Group (FOG) Utilities Disk This disk contains the catalog utility CAT and related programs CROSSREF, FMAP, and UCAT previously found on -FOG.003. For instructlace LIST.COM in drive A. At the A> prompt, type LIST for instructions, or LIST d:filename.typ for printer output (turn printer on), or LIST d:filename.typ C for console output. As when using the [Z] option in PIP, the high order&   bit is zeroed out leaving only printable 7 bit ASCII characters. Therefore, WordStar "document mode" files can be viewed on the screen without funny looking __ characters. The printer heading generated by LIST indicates that the program is from Sorcim. I can find no copyright or proprietary notice or serial number even using DDT to dump the file. LOGIN will reset each disk drive which has been accessed since the last system boot cold start. The result is similar to pressing ^C (warm start). Place LOGIN.COM in drive A. At the A> prompt, type LOGIN LOOK permits searching RAM for a specific byte pattern. Place LOOK.COM in drive A. At the A> prompt, type LOOK The program is self-prompting. SHOW is similar to DISPLAY and LIST. Refer to its .DOC file. Jim Woolley FOG Disk Librarian August, 1982 '  (DISK.DOC XDIR.COM This_is a_sample of_MAST.CAT)