IMD 1.18: 22/01/1996 4:54:32 micro cornucopia kaypro user group disk 2 utilities     WASH COM2-DISK DOC ALLOC COM CAT COM CATALOG DOC@COMPARE COM CRC COMCRC DOCCRCKLISTCRC D COM D DOC!"#DASM COMP$%&'()*+,-DASM DOC./0123456789:;<=DASM DOCT>?@ABCDEFGHDIRCHK COM IJDIRCHK DOCK1s ͙ MICRO RESOURCES DIRECTORY "WASH UTILITY" Ver 1.0 Command Function ------- ---------------------------- V View file at Console L Print file to List Device P Send file to Punch Device C Copy file to another Disk R Rename file D Delete file X Exit to CP/M B Backup one file in List S Restart on anothDIR-DUMPCOMLDISK BAKMNOPDU-77 COM0QRSTUVDU-77 DOC-WXYZ[\DUMPX COM]^_DUMPX DOC"`abcdFINDBD54COM efFINDBD54DOCgFIX COMhijklmnopqrstuvwFIX COMxyz{|}~FIX COMFIX DOCFMAP COMFORMFEEDCOMFORMFEEDDOCLISTT COMer Drive sp or cr Forward to next file in List :] j:e j!_] ͎ j???????????2h2|\Ÿ͙ ++ Not Found ++K! " ƀo&:\¼:LCPHCSL ͙ ? d*  ́ ͙ Beginning of List *  " ͙ LISTT DOC MAST CATQCAT COMSUPERSUBCOMSUPERSUBDOC$UCAT COMUNERA11 HLPUNERA19 COM UNERA19 DOCUNLOAD COMUNSPOOL COM UNSPOOL DOCm   < * ͇ " >͙ * * ́ >͙ End of List ! " >*  ͇   ͎ ͙ New Name ?   ! F#~ͮ w! 6# 6 #”! N# ± ʻãi&6 Ͷ ڻ .w#»Ͷ  .! Ͷ  .w#! 6# !  G>w# : 2u  ! v ͎ ! 6#8u q͙ ++ Name Already Exists ++ d*  ͇ !  ͎  ͙ ++ Not Found ++*  ͇   ͎  ͙ ++ Not Found ++͙ Deleted*  ͇ " * ́ ------------------- Contributed by Wayne Campeau of Anchor Computer Systems, Seattle Washington FORMFEED.COM FORMFEED.DOC This tiny program outputs a form feed from the LST: device (either the serial or parallel port depending on how your system is set up). DIR-DUMP.COM This program displays all the disk files and their locations on the disk, along with the user number. ------------------------------------------------------------------- Taken from BIG BOARD USERS DISKS (FROM MICRO COl on Write ++: m  ͙ ++ Destination Close Error ++͙ New Drive ? ͮ Aһ<2\> 2]2ez{}o|g~#Ž ~_#ʬ Ú `_ainst another. Usage is COMPARE FOO.FIL BOO.FIL. DU-77.COM DU-77.DOC Very powerful disk utility. The user interface leaves much to be desired but you can do anything you might ever imagin on a disk. LISTT.COM LISTT.DOC Prints out CP/M files with headers, page #'s, and offsets from left margin. Slight bug: after page 1, headers kick back to left edge. ----------------------------------------------------------------- More or less Directly from CP/M users group disks DASM.COM DASM.D  ͎ "  ́ * ́ ͙ List EmptyK>J>J>2 *  ͇ u  ͎ ! 6#ku ¢͙ ++ File Cannot Be Opened ++2 u ʵ!~_: O #ºæ*  ͇ u  ͎ ! 6#2 !!u  ͎ u B͙ ++ Source File Cannot Be Opened ++͙ Destination Drive ? ͮ Aһ<2 G:u ª͙ ++ Cannot Select Same Disk as Source ++ d ͙ Replace ? ͮ Y   ͙ ++ Destination DiRNUCOPIA) D.COM D.DOC This super directory program produces an alphabetical list in vertical order. It understands nearly all disk and directory formats. WASH.COM This is probably the best file transfer/maintenance program around and it is available for $49.95 on the commercial market, but it is also available in the public domain and here it is. DUMPX.COM DUMPX.DOC This is like the CP/M routine called DUMP.COM except it is incredibly more powerful and more useful (e.g. displayKAYPRO USERS DISK FROM: MICRO CORNUCOPIA PO BOX 223 BEND, OREGON KAYPRO DISK # 2 UTILITIES -------------------------------------------------------------------------- CRC.COM CRC.DOC CRCKLIST.CRC This Cyclic Redundancy Checker will detect a difference between two files as small as a single byte. Also detects two bytes out of order which is something usually missed by a simple check- sum type checker. ------------------------------------------------------OC Zilog format disassembler for 8080 and Z80 object (.COM) files. This is a very famous update of an extremely famous parent called RESOURCE. UNSPOOL.COM UNSPOOL.DOC This routine lets you use your system and print at the same time (without one of those fancy print buffers). It dumps data to the printer anytime your system is waiting for an input. This way it doesn't slow the system's normal operation. Neat!!! FINDBD54.COM FINDBD54.DOC This super utility really checks a disk (withrectory Full ++*+* ́  xd ͙ ++ No Memory Available for Copy Buffer ++i`" 2 !" * " * u ¬ * " * #" * ́ y ñ >2 * " * | +" * "  · ͙ ++ Disk or Directory Full on Write ++: m  ͙ ++ Destination Close Error ++͙ New Drive ? ͮ Aһ<2\> 2]2ez{}o|g~#Ž ~_#ʬ Ú `_ _ = : ; < > 7# Nwy# Directory Fuls the ASCII equivalents). It is very fast, and I use it a lot to look for text (instructions) in .COM files I am not familiar with. SUPERSUB.COM SUPERSUB.DOC A definite improvement over CP/M's submit. The .SUB file must be on drive a (like submit). --------------------------------------------------------------------- N.W. KAYPRO USERS' GROUP -- Miscellaneous Utilities Disk ALLOC.COM Produces bit map of disk, also write-protects files. Menu driven. COMPARE.COM Checks one file ag  out destroying the data on it) and reports bad sectors and the blocks (in hex) where they lie. It then creates a file containing the bad block(s) named [unused].BAD. I'd be lost without it. CATALOG.DOC CAT.COM UCAT.COM MAST.CAT FMAP.COM This group of programs creates and maintains a directory of all the programs you have on all your disks. You can display which disks contain certain files or which files are on a certain disk etc. etc. etc. UNERA*.* This program unerases files. Kiwz# \!l~# !e p#z.*+|&.H&."|>?2h>2Ô*DM=o&)))))^#x=}V#zʔ!e 6**#" s:O>2<[:ʳ!"*o"!]  "0:?T])))0o$::> 5> 52z~022&:\=_ }*6~##^#F##~###^#V###F#N2 #":] 6ͽ7:6>2Go>2*"Gd *&"*z"*:/_B>0*#"ʙ ~™>1:<22zʹͻÀɷ#*yoxg!":PY)*)":'2="!(THIS IS FILE CATALOG.DOC AS OF 3/13/78) CP/M DISK CATALOGING SYSTEM FOR COMPUTER HOBBYISTS BY WARD CHRISTENSEN -----OVERVIEW----- I have always wanted to be able to keep track of where files are on my CP/M diskettes. The first step was to make a 'DIR' listings with the printer on. Next I wrote a command called 'MAP' which printed the disk extent information also (but not any extent past the first). Then I wrote 'SMAP' which produces a sorted directory listing. This made finding filnda handy. ------------------------------------------------------------------ CAT.COM 1/8/78 $ !9"-1-]!/m!:E!] !_G6$\<•͊++UNABLE TO OPEN MAST.CAT$ *-̓)•̓̓ë>  T >2 =ʐ!/?0?0!:?0?0!~#:Q<2Q0:<2:06æ6̓ 6̓R#?̓.m,m~?G> #b7~?x b> #m*R|=º\ʷ͊++READ ERROR OR EARLY EOF$!~#"R> > _ w#6?#͊ $?0z!~6 &0w0#w*!**{_zW:/o&#!`iʹ#͹ʹʹʹ͹ʹʹy/Ox/G {_{Z!6 #6 ! ~#j ¦ʗG(® 5×){_   K/bit; 0K dir. + 0K files + 0K free = 0K total. ??% full `i) y2O:G5G +x2!5:O:>D5:<2xͻG Hx *c :)=r:ʉ=}:: ++ K to "zap" rounded down to whole blocks ++ $|g}o:2:*DM>x es in the listings easier. At this time I also adopted the convention of editing a 'dummy' file on each disk, called '-DISK.nnn' where nnn is the disk's serial number. Later I changed the word 'DISK' to any more meaningful name, such as '-WORK.023' or '-CBIOS.019', etc. The important thing was that each started with a '-' which meant it would sort to the top of the sorted listing. Eventually, I wrote 'FMAP' which creates a sorted directory listing, but also, if 'FMAP *.* F' is typed, writes 'NYd ALLOC 4/10/82 by Ward C. ALLOC show bit map. ALLOC B: show bit map for drive B. ALLOC FOO.ASM show bit map, with FOO.ASM as "*". ALLOC 22 zap (temporarily write-protect) 22K of map. ALLOC - 22 zap "all but" 22K. ALLOC - FOO.ASM zap "all but" nnK, where nn = FOO.ASM size. Notes: 1) Typing ^C restores the original map. 2) If interrupted, ALLOC skips bit map and prints just totals. 3) Drive name prefix is ok!~#:Q<2Q0:<2:066̓ 6̓MAST CAT NAME DISK NAME DISK $............ ............ FILES:  AMES.SUB' to disk with the names of all the files on the disk. This file of names then got me thinking about having a master file of names, or a 'master catalog'. That is what I did. I now have 1 disk file which contains the file names and disk names for every pertinent file I have. I also wrote a command which behaves like 'DIR' but scans the master catalog. -----PROGRAMS----- UCAT.ASM/COM Maintains 'MAST.CAT' CAT.ASM/COM Allows 'DIR' search of 'MAST.CAT' FMAP.ASM Creates ial number. The easiest way to place an entry in the directory, with 0 data as- sociated with it is to 'ED -anyname.nnn' then when 'NEW FILE' types, type control-c. This will leave the entry in the catalog, but will not take any data space. Then type:ERA *.$$$ (or ERA B:*.$$$) to erase the temporary file which was created by the editor. 2) Assuming the disk with the catalog programs is on drive a, whenever you want to catalog the disk on drive b, type: FMAP B: Q then type: UCAT This resul-s-t serial number (3 digits) all your diskettes, placing a file '-anyname.nnn' on each disk. The UCAT routine then takes this as the name of the disk. 3) Put the following files on this master disk: MAST.CAT FMAP.COM UCAT.COM CAT.COM -anyname.nnn 4) Type: FMAP A: Q (FMAP ON THIS DISK DOES NOT ACCEPT THIS) This will creates NAMES.SUB, which has the names of the files on this disk. The 'q' means to write the file to disk 'quietly'. If you want to see the listing, type: F'BAS' files on any disk with name 'WORK' (any serial) Note that what you type following the CAT command appears as the title of the resultant listing. This is particularly useful for keeping hard copy listings of your catalog, such as by typing: CAT *.* *.* AS OF 02/17/78 this will result in the title: FILES: *.* *.* AS OF 12/17/77 appearing on each page of the catalog listing. 4) If you want to erase something from MAST.CAT you do so by erasing the file from the diskette it is a file of the names on a diskette as input to 'UCAT.COM' along with 'MAST.CAT' -----INSTALLING THE CATALOGING SYSTEM----- 1) Edit 'MAST.CAT' in order to place entries in it for the file names you don't want to be placed in the catalog. I already have ASM.COM, STAT.COM, PIP.COM, and others in the sample MAST.CAT. Since these are on nearly every disk, I therefore don't want them to take room in the catalog. N-O-T-E you don't have to edit the file - you may type it and decide to take ts in the disk being added to the catalog. This can be done whenever you want, as the entries for the disk are deleted from MAST.CAT and the new ones added. This means the cataloging system properly keeps track of erased files also (i.e. erases them from the catalog when it no longer finds them on the disk being cataloged). If you want to re-catalog the 'A' disk, type: FMAP A: Q then type: UCAT 3) Use the 'CAT' command to scan the catalog as you use 'DIR' to scan the directory of the currenMAP A: F (USE THIS WITH THE FMAP ON THIS DISK) Which will write the file, but also print the sorted directory listing. 5) Type: UCAT This will merge the file names in 'NAMES.SUB' (created by FMAP) with the names in MAST.CAT. It will report the names of any files which are added to, or deleted from, the catalog. -----USING THE CATALOGING SYSTEM----- 1) Whenever you put a new diskette into service you must place a '-anyname.nnn' entry in the directory. nnn should be the disk's unique seron, then cataloging that disk. If you crash a disk and want to erase all it's entries from the catalog, you have to edit a dummy 'NAMES.SUB' with just the disk name in it, then execute 'UCAT' which will be faked into thinking you are cataloging an empty disk. This will cause all entries 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). Edit NAMES.SUmy defaults. NOTE The format of the 'empty' MAST.CAT is simply a list of names which you don't want put in the catalog. This may be 1 or more file names. It cannot be zero names. If you want everything cataloged, put a name such as 'DUMMY.FIL' in the catalog. The format is as follows: Each name is on a separate line. The first name is pre- ceeded by a '('. The last is followed by ')'. thus: (ASM.COM PIP.COM STAT.COM) 2) Pick a disk which will contain the master catalog 'MAST.CAT'. You m-ut disk. The operands of 'CAT' are just like 'DIR' except that there is a second filename.type - namely the disk's name and serial. N-O-T-E that UCAT deletes the leading '-' when it places a disk name in the directory. Therefore you don't use the '-' when asking for a particular disk. Examples of 'CAT' command requests: CAT lists entire catalog CAT *.* *.002 lists entries for disk 002 CAT *.asm lists all asm files CAT A*.* lists all files starting with 'A' CAT *.BAS WORK.* lists all   B and place the following single line in it: -WORK.023 then run UCAT. This will result in all files referring to -WORK.023 being erased. ------------------------------------------------- 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 MAST.BAK REN MAST.BAK=MAST.CAT REN MAST.CAT=NEW.CAT Thus, there are 3 versions of the catalog<2=o|g~:YD8EOF FILE 2 BEFORE FILE 1 $ obFILES MATCH, LENGTH IS $  * sg~*w,"!~0Y2 ڴ0>12x++UNABLE TO OPEN FILE 2$N * BYTES $:YD8EOF FILE 2 BEFORE FILE 1 $ obFILES MATCH, LENGTH IS $  * sg~*w,"!~0Y2 ڴ0>12x++UNABLE TO OPEN FILE 2$N * ed, 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 next to each filename on the disk. You are referred to the previous documentation on the cataloging system for more details. ------ #CRC.COM 5.0 6/18/82CRCKFILE???!9" 1 M @ CRC Ver 5.0 CTL-S pauses, CTL-C aborts :] O@ ++Searching for CRCKLIST file++@ Now searching for "CRCKFILE" file++ !  1 .) F!  ͡]͸! ͔0CRCKLIST???CRCKFILE???!9" M à*,*.}|ډ!".*,{z{** u*.".G*.",!".***,}>*.#".ɯ22)! ",". <  NO FILECRC FILE$!   >. @ Checking wi 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.BAK before running UCAT. The program could also be modified, to do the erase first. ------------------------------------------------- ------------------------------------------------- QCAT was submitted subsequently, with the following comments: QCAT allows cataloging disks on a 1 disk system. You type QCAT, and the program asks you to   COMPARE.COM VER=01, LEV=00 $ !9"1>xw# 3 l!3\<ʺ<ʿOGb͊FILES UNEQUAL AFTER $  ͿLAST DATA READ FROM FILE 1: $ *-,~   &&_:<2 >(ͫͫ:2>) xs*v:xy*v\¤*vy<2x=o|g~*w,"!~0Y2EOF FILE 1, NOT FILE 2 $ o*:** th file - ! ~T #M M 2 2 2 2 ! >2 3o: : @ ***No CRC Files found***$> ʉ ʉw#: <2 P6: .6@ Can not parse string ! ~ʽT #ñM ! > 6 #6^#6! ~T #! 4M #x] #e w~ T #>2 @ - s M@ File not found ! 4 >2 o: G: „: G: „@ *Match* 2 ! 4@ <-- is, was --> : ) > T : ) M 2 ! 4<2 ~# @ Not a space between CRC values<2 G-CATALOG???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 "NAMES.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 must have a file "-diskname.serial" (such as "-MAC.005"). When the list of names on the disk is sort  @ ++ Now searching for "-CATALOG" file++ !  ) .) ! ”>.”#””͡”››tK››͸›* =: =͔="  ʳ ª~#.  ¿~  #~  .+~#0:0~#!A.O.Gy~#0M0 K MMɷ:m2 FSÄCRCKLIST$$$››tK›, › **}|!"*{z*~]*"Ü  DISK FULL: CRCFILE$!"*~ match - : ̓ : J M @ Quantity of lines failed parse test - : ̓ : ~ M @ Quantity of file(s) not found - : ̓ * d͔  ͔ 0T  Җ Wyʩ 0T 0ztiil81 --> FILE: UNSPOOL .DOC CRC = EF F0 --> FILE: FORMFEED.DOC CRC = DF 5E --> FILE: UNERA19 .COM CRC = 5B 3E --> FILE: UCAT .COM CRC = 59 B8 --> FILE: CATALOG .DOC CRC = BE 89 --> FILE: MAST .CAT CRC = F0 2F --> FILE: QCAT .COM CRC = 90 20 --> FILE: UNERA19 .DOC CRC = 30 B5 --> FILE: DU-77 .COM CRC = 6B 38 --> FILE: FINDBD54.COM CRC = 03 43 --> FILE: DASM .COM CRC = CE B2 --> FILE: 2-DISK .DOC CRC = E1 B2*#"ɯ2i2}! "!"]]2 s : ~# ++FILE NOT FOUND++$: F*}’">͇†]<  CANNOT CLOSE CRCFILE$CRCKLISTCRCSK FULL: CRCFILE$  w# !]͐ DONE$!e S!]Q !eZ @ --> FILE: XXXXXXXX.XXX CRC = oS) \<‘@ ++OPEN FAILED++ !" !" * | ʹ) \!~2 #" Ý: ) > T : ) @ ++FILE READ E --> FILE: CRC .COM CRC = B2 07 --> FILE: D .COM CRC = 66 48 --> FILE: DIR-DUMP.COM CRC = 46 A3 --> FILE: UNSPOOL .COM CRC = 32 52 --> FILE: DUMPX .COM CRC = 4D 5D --> FILE: FORMFEED.COM CRC = D1 C3 --> FILE: UNLOAD .COM CRC = 64 A4 --> FILE: DASM .DOC CRC = 50 74 --> FILE: WASH .COM CRC = 4B 2D --> FILE: FINDBD54.DOC CRC = B3 50 --> FILE: FMAP .COM CRC = 7B D4 --> FILE: CAT .COM CRC = 1B C4 --> FILE: DUMPX .DOC CRC = 16 7E --> FILE: FIX  Using CRC Type CRC to verify all the files on this disk. Type CRC *.* F to generate CRC's for an entire disk and create a CRC file (CRCKLIST.CRC) for checking the CRC's of a copy of the disk etc. Omitting the F will suppress creation of a CRCKLIST.CRC file. *.* can be replaced with an unambiguous file name for checking just one file. RROR++ <* |): o% |g}o" 2  ; 0T ~T #~A > T > _h : F{͇2h2|: ʲ !\   :\2 ! \  \ ! \  \! \  \<7=Ɓo&   ]  2h2|2   ~$#~# x  : F} *}= ">͇1 ] FILE: FIX .COM CRC = 3E 89 --> FILE: SUPERSUB.COM CRC = 3D 3F --> FILE: UNERA11 .HLP CRC = 9C 28 --> FILE: SUPERSUB.DOC CRC = 9F E0 --> FILE: ALLOC .COM CRC = 1B 2F --> FILE: COMPARE .COM CRC = A9 CC --> FILE: DIRCHK .COM CRC = B5 C4 --> FILE: DIRCHK .DOC CRC = D3 E1 --> FILE: D .DOC CRC = 92 09 --> FILE: LISTT .COM CRC = DC 72 --> FILE: LISTT .DOC CRC = 51 D9 --> FILE: DU-77 .DOC CRC = 9C A8 --> FILE: CRC .DOC CRC = E5    Hit Space: KK : k Used: /k Not used: k *% DMf : remain on 1 !9" ! J> # ->! . *ͪe> # < * v K  K  K !B r+s+p+qA ?  p*A *? :]$Ž l]Q !]6 !E 6!C 6 :C *C &l ~2D U¼:E 2 :D S:E 2:D F:E 2:D V:E 2:D P:E 2 :D N2E ! _{ozgO{ozgi`N#Fogo&og_{_z#W OK = Y -S {-_ ! s+p+q*  ͼ 2 <2 : ! ڗ  K ! 4Á ! 6: =! ڻ * & NK ! 4œ >3  03} Z; { ) # ^#V"; *;  ͪ  *; q#pÝn* " ! p+q* )*= ^#V"; ! 6> ! i* &*; >OK : <2 E:/ *; ^#V*% DMf kK : *; Nf E*; ~ڻWK þE *; ~SK E = ! 6:! ':/ : = !: = : <2 * " !" >! .  * *&͵ "( * *&͵ > j*( #"( *DM*( V"( !" (   K!" }2 : <2 O:* * * "    >! = * DM** +" *( * " Ø* #" *& 05 uses 77 columns If you want the display to stop with a full screen and wait until the space bar is depressed before it continues, change: 0103H from 80 to 16 This byte sets the number of directory lines that will show on the CRT before the display stops with "Hit SPACE" to continue. 16H shows twenty-three lines. If you want the complete directory to show without stopping (it looks much better if making a hard copy print to put in the jacket), usC 4Ø:!4:!5(  ! I3= : [= t:\a:\=_: :] t ?]\ : ҃! 6?Î : 2   ]Q  ?\\ : DM, Q ! "= *3 ##)*= "; */ &# "! *3 #"#  !! "% >!1 . 2' \: 2 : ʩ: ƀo&"* ~ʛ*# +"# ** DMY қ** DM  *; q#p* " . ** #DM*; -e**  *; w* #" )*= *; s#r*; "; : 2 !S 6!"V * "n >!S d*S &T ) ^#V"K O!l ^#V"M :S =2S M K  a*K "G * DIRR.COM (ALPHABETIZED DIRECTORY LISTING) ------------------------------------------ This program lists the directory in four vertically alphabetized columns. It also shows the length of each file. It turns up an initial new line prior to the listing and another new line after the listing. It has a summary line which shows the following information: 1) Disk drive in use 2) Length of disk (948k for DS, DD -- 241k for SS, SD) 3) Number of fil*( * " 3*1 #" " " *5 " > # R : B * +" ! +s#r( ! 6: " * ~2 * #" * +" > ʶ : 2 Ғ * +" : <2 O>ҳ ! 6* #" * ~2 p ̓: AOK = * Ͱ= * ͷ= * Ͱ= *# ͷ= * Ͱ= . g S -A >>!  ~?l W >#^ : /!:' —  ʑ #‹  W ʢ #™ i`N#FogDM!>))덑o|g =¼ DM!>)) = ^#V) ^#V|g}o e a large number. Using '80H' would show 512 filenames before stopping. (You are unlikely to have that many. If you did, you could make the number even larger.) Byte 0789H is the "k" after each file length. You can eliminate that (gaining four additional columns) by changing from 6B to 00. It may appeal to some, as gives a less cluttered appearance. Irvin M. Hoff Los Altos Hills, CA 94022 M "I *K  )*= ^#V"O I G  *G )*= N#F*O ? J*G #"G (*I )*= ^#V*O DM? m*I +"I JI G  *G )*= ^#V"Q *I )*= *G )*= N#Fq#p*I )*= *Q s#r*G #"G *I +"I K I  G M   !M G  :S <2S O!T *G s#r*S &l ) *M s#r*I "M ^I K  X:S <2S O!T *K s#r*S &l ) *I s#r*G "K û!" "    #* #" )*= * #" )*= N#Fq#p   * )*= * ) *= ^#VN#F? H * #" )*= ^#V";  *; ^#V" * )*= es used (does not include extents used) 4) Length of files used 5) Number of files / extents remaining 6) Amount of disk space remaining Address 0784H controls the space between the file type and the length of the file displayed. At present it is: 0784 03 If you want more space after the file type, increase that to 04 or even 05. The following table shows the width of the display: 03 uses 69 columns 04 uses 73 columns    3 April 1982 P.S. I did not write this program, nor do I have the source code. However I did modify it extensively to suit my needs and then called it DIRR. LD SP,HLADC A,ADD A,AND CP OR SBC A,SUB XOR DEC INC ADD HL, DEC INC LD A,LD POP PUSH RET RST @ LD  LD ADD A, ADC A, AND CP OR SUB SBC A, XOR IN A, OUT JR DJNZ JR LD JP CALL :LD A,*LD HL,"LD 2LD CALL JP RLC RRC RL RR SLA (SRA 8SRL @BIT RES SET *EX (SP),JP LD SP,POP PUSH ADD #INC +DEC 4INC 5DEC ADD A,ADC A,SUB Ì#͙*%,KÌ#KÌ#%,*>Hͷ#>Lͷ#KÌ#/KÌ#7*%,KÌ##F"%!O͞ͻËX#"%F!͞ͻڋ*ʋ!#ڈ#ÈY#"%F!O ͞ͻ(ڋ*ʋ##ÈcÌ#Ì#%*Ì#{X~!(!ͣÌ##Ì#ͅ*%#Ì##*%cÌ#,KÌ#%,*KÌ#%,*KÌ##}##F!O͞ͻx :!%*%( *$++"$##++ͅ%>Cͷ#*Ì#~>Iʺ>Dͷ#~ʌ#>Rͷ#Ì#%,**%͙KÌ#͙*%%,*KÌmbol Dump starting at symbol Ennnn,.symbol Enter symbol into table Fnnnn,ssss Find nnnn after ssss F or Fnnnn Cont Find or Find nnnn Issss,oooo Inc addrs>=ssss by oooo K.symbol Kill symbol from table L List next 18 lines Lssss,eeee List over range L,eeee List to eeee Lssss List 18 lines from ssss L=nn[,others] Set list default O Print current offset Onnnn Set new offset Pssss,eeee Generate program prolog Q Quiet prefix Rfilename.COM Read file @ offset+100H Rfilename.CTL Read Control Table RfSBC A,AND XOR OR CP FLD p LD !!LD ""LD *#LD 6$LD %**p*DNEGERETNFIM 0VIM 1^IM 2GLD I,AMRETIOLD R,AWLD A,I_LD A,RgRRDoRLDBSBC HL,JADC HL,@&IN AOUT (C),'LD'CP'IN'OUT'OTC(LD K)LD **1%$ DASM, Version 1.5 )$c$:]!8I$ Reading in All Files for !]~ͷ##͗$ -- Read Complete --  $ Type H for Help, ? for Stats c$2%2%2%2%1%#:&%G ( GOɯ2%2%$ ** Command Error **  ;At#*$+"$*%+$DB ~>,÷#> ÷#>;÷#>(÷#>)÷#>A÷#~8!S͌~ͷ##~.ķ#~NZZ.NCC.POPEP.M.~!u͌~÷#%>Hͷ#>Lͷ#*~do$BCDEHLMA~!~!͌~ͷ##~÷#BCDEHLSPBCDEHLAFBCDEIXSPBCDEIYSP~0÷#>Iͷ#{÷#>'ͷ#'·#ͷ#÷#;">0ͷ#;"~ͷ## %>+ͷ#~>Hͷ#*#^#V+!= 7: %(͎  :% z>0( z({;">Hͷ#{ 80EX DE,HLEX AF,AF'EXXEX (SP),HL'DAADIEIvHALT/CPL?CCFNOP7SCFJP (HL)RLCARLARRCARRARETilename.SYM Read Symbol Table Rfilename.DOC Read Comments Table Rfilename.ALL Read CTL, SYM, DOC, COM Sfilename.ASM Save ASM File Sfilename.CTL Save CTL File Sfilename.SYM Save SYM File Sfilename.DOC Save DOC File Sfilename.ALL CTL, SYM, DOC, ASM Unnnn Set Comment Table addr X Restart DASM Z Write EOF to ASM File ? Print Statistics ç $Restart DASM (Y/N)? ͖Y§ $Restarting DASM ä _ͫ#!'%~ V" (, #>2%$ ORG z{;">Hͷ#ͫ#V" !,##~ʧ ++~#~8 +~#~I ç DASM for ZILOG-Standard Mnemonics Derived from ZZSOURCE/RESOURCE $> *%|(F#m*$*$"%#"$F!x͞ͻ 8*$#80#"$_!^#V*%~# #~2!% > ͷ##~(*$:!% #)/5APV\et} *BPbs&AXbÌ#cÌ#ͅÌ#͙Ì#%͙*Ì#%͙*/Ì#͟Ì#7Ì#~8oÌ#ͅ*%cÌ#ͅ*%#~ 8[0>'ͷ#:%ʌ# ~ 8 >Hͷ#Ì#0ͷ#Ì#%#~>Hͷ#*Ì#%#~>Hͷ#*>Aͷ#Ì#N*%#~_*$0KBCDpEL!FH7 IPK!LO PQZRySUX^Z3?$ HELP on DASM -- Command Summary ;addr,comment Enter Comment at addr ;addr List comment at addr ; List Comments Table ;addr, Delete Comment A (see L) Attempt to find DB's B (see L) Build Symbol Table C Dump Control Table Cnnnn Dump Ctrl Table at nnnn Cnnnn,x Set Ctrl (x=BEHISW) Dnnnn Dump from nnnn on Daaaa,bbbb Dump over range D,bbbb Dump thru bbbb D Dump 80H more D=nn Set Dump Size Default DS Dump the Symbol Table DS.sy  #F#~+A8H#~+(B-(>F>2%#~ͷ#$ EQU ~+~;">Hͷ#ͫ#2%##~͌#͕$>2%&%!'%~# ú *$*$"$!'%~ Sʑ=t,ʡV"*$"$ ( (, #V""$*$"$*$"$ $Addr +0 +2 +4 +6 +8 +A +C +E ASCII *$͕$&I"Q"~;"#}Q"}Q"}Q"} >!ͷ#~ 88>.ͷ##}(Q">!ͷ#ͫ#"$:$:$0ç #V"#"$,ʕ ʕ ʧ !(%~. ! 0*%!,^#V#~I">=ͷ#F>O#~ͷ##AQ"͕$ͫ#ç : %=2 %ͫ#>2 %$Offset = *ing .DOC file... y!$"$Saving .SYM file... !$"$Saving .CTL file... )$Create a New .ASM File (Y/N)? ͖Y§ !$">2%2%#$++ Writing ASM Enabled Use Z Command or E Control to Close File ++ ç !e$͌$Gç !,#^#V#~#G"+> i#~i##> i#> i#>i###z,"i#z0"i#{,"i#{0"i#!e$͌$#!e$͌$(!e$͌$ Êyç o*%##6*%$++ No File Accessed Permitted until ASM Closed ++ ç $++ Unexpected EOF ++ ç !'%~ V"  (, #~*$I"$ SYMTBL = !,I"*$I"ͫ#$PC = *$I"ͫ#$OFFSET = *$I"ͫ#*%|($COMNTS = *%I"*%I"ͫ#}͡ç $CTLTBL = !&I"~###< +++I"ë#$Symbol Comments are O:%>N >Fͷ#ͷ#ë#!'%~ (+V"" %*$"% ( (, #V" *$"%* %͕$*%~#"% ~ &+I"Q":$/_:$/W> >2%$END 2%:%ʧ >i###2%$++ ASM File Closed ++ ç #:%‰!e$͌$.͗Ù!$"$ Reading DOC file... m!$"$Reading SYM file... _!$"$Reading CTL file... `!8~#͌++ѷO͌$0H͌$(0++"%7!,~# ~( #~7#o0$#~#G7!'%V"~ (, #~. +!8ͫ# $ was Killed +++Ϳ!!x8 bk# 6A͡ ç !'%~. ! Ϳ!ç DM##~#͌*${ z(`i"$##6#~#+(-($(.(?(@(_(08 :8A8[8 +,"w#0"w# 80,"ͷ#0"÷#|;"};"> ÷#~.( ~0:8AG0))))o#! ^#V~!"%2|\<$ File Not Found *%| \! ~#"%8$++ Unexpected EOF ++ ç >w$I"ͫ#ç !'%~ (V" "$ͫ#:%‰2\2h!'%:(% : ~@2\##]UU~ (#.(~ .#> >2%2 %>2 %2%2 %2%2%: %2%2%!'%~ (N,(> (:= !#V"{ 2 %2%~#,( ( ʧ V""$ ( (, #V""$2%͕$:%( :%= *$:$:$ҧ :%(3*$*$~$8##~#$0+&*$>B"$>I*%|(F*$8=##F#~;+ $"%.7>2% #~\ ͫ#ͷ# * "%lͫ#*$ͬ+8###~I(OE3#^#V*$> "%2%SBiHcW5ͷ#$: Invalid CTL Entry ç L2ç ͬ+8###Ѿ2!%ͬa:!%I(W(H(B(S( E(K( ##w!~#+<( }ç :!%K E(H(B( W( I(S !&~###< T]###+~} | s#r#:!%w!&~#+<7#z+ {###ͬ!&͕$^#V#z< ͫ#}ç +!8ͫ#~ͷ##>:ͷ#Q"Q"I">=ͷ#> ͷ#~ͷ#Q"Q"#)ç #!&^#V#z<(+>,i#~i#> i#> i##>i###`Ù͋"!&ͺ"($,(:80))))oͺ"s#r#ͺ"w#6#6o!'%~ #O #~F( 2%ç V"#  (, 8K~ ʧ *%s#r##w #"%6#6pç$"$Reading COM file... Ue2hU!e$͌$ _Ù!e$͌$Uç ͋"*$|2\ e$Last Block Read into Memory at I"$ Last Block Ends at Relative &"$I"ͫ#!e$͌$ Z!e$͌$ mÙ$++ NO, that would overlay the Disassembler because the Offset is too small: $ ++ !,"$##6o*%"%6#6͋"ͺ" ( ( (͵s#r##ͺ" ( (w#p :80))))oͺ"#:%‰!e$͌$!$"$ Sav\\< 2|!"%\ $\<$++ Close Error ++ ç $++ Write Error ++ *%w,"%\ !"%*%|(F(#~ͷ#!"%"%> ͷ#> ÷#>*_:%:%!%{i#{ :%(!%5͵#$%>P !%%^#6 !%%#~ ʫ#a8{0_w2%2%~ͷ##~ #>P2$%>2$>2 %2%!%"%!"$"$"$!L"$!"$!"%"%ɯ2,!,"$> 2'%!"&>I2%!"%"%6#6#  (-(ͫ#ç $ Abort (Y/N)? ͖Yç ?ALLASMCOMCTLSYMDOC.%:$/o:$/g#>2%$DS |};">Hͷ#ͫ#"$>2%$DW *$*$^#V0ͫ#*$##"$ͫ#2%>2%2%<2%$DB *$*$:%~( 8 8>Hͷ#:%2%0ͷ##*$#"$:% :%J*$+!]:%2%]>,ͷ#}>'ͷ#:%<2%~ͷ#~'̷##*$#"$:% :%(3*$+!0(:%<2%#08+~# (~ 8>'ͷ#ú>'ͷ#ͫ#!'%~ V" (, #V" BK!,#~+8 ~8~w#~w+##~ʧ #o>g$Scratch Area Start = !&I"$ Scratch Area End = *.I"$ COM Start = 0100 COM End =  *%~#+<7#z+ {##~͌#*%͕$^#V#z<ʧ I">;ͷ#F#~ͷ#ͫ##~#<+T]##~͌#~#O2%*$+!s H~+(-(# >:ͷ#Kͫ#2%Q"Q"*$I">2%!$%6L#z"{"!$% 8s#r*$T]xo|g"$##6++DM*%{ z( s#r#p#w!,##~#(,8 O͌$(   @(_(08 :8A8[8 +,"w#0"w# 80,"ͷ#0"÷#|;"};"> ÷#~.( ~0:8AG0))))o#! ^#V~!"%2|\<$ File Not Found *%| \! ~#"%8$++ Unexpected EOF ++ ç >witimate purchase of licensed software. I do not regularly use any programs which I have not purchased. (Yes, I do occasionally "try" one, but then buy it if I plan on using it). I have been asked by software businesses to NOT distribute ZESOURCE - because of it's ability to produce good .asm source quickly. But, there are so many disassemblers out, why not a good, conversational one? Please use it in the spirit in which it was contributed: to enlarge your understanding of the micro- computer******************** A disassembler for Z80 programs by Dave Barker (from RESOURCE by Ward Christensen) {NOTE: Most of the text of this file was written by Ward Christensen. I have modified or added to it to make it agree with the features of ZESOURCE, which is RESOURCE enhanced to disassemble into TDL Z80 mnemonics.} Suggestions? Call me eve's at (805) 526-2438 (D.Barker) ---------------- ZESOURCE commands are inconsistent at best. - ZESOURCE is a kludge based on years of disassValzah would have solved that by making resource relocatable and moving itself up under BDOS. I wasn't that industrious. Instead, ZESOURCE uses the concept of an "invisible" OFFSET. After all, what do you care where it is as long as it LOOKS like it's at 100h? So, you set an offset. O2F00 sets it to 2F00 Hex. Reading a .COM file (RFOO.COM) causes it to come into 3000 on. If you say D100 or L100 it dumps or lists what LOOKS like your program. Internally, ZESOURCE is adding the offset to the D\\< 2|!"%\ $\<$++ Close Error ++ ç $++ Write Error ++ *%w,"%\ !"%*%|(F(#~ͷ#!"%"%> ͷ#> ÷#>*_:%:%!%{i#{ :%(!%5͵#$%>P !%%^#6 !%%#~ ʫ#a8{0_w2%2%~ͷ##~ #>P2$%>2$>2 %2%!%"%!"$"$"$!L"$!"$!"%"%ɯ2,!,"$> 2'%!"&>I2%!"%"%6#6#  (-(ͫ#ç $ Abort (Y/N)? ͖Yç ?ALLASMCOMCTLSYMDOC. world around you, and to allow you to customize programs which you legitimately own, for your own use. "Semper non rippus offus" ---- NOTE: any command taking a hex address (Dnnnn, etc) may take a value in the form .label but arithmetic may not be performed. (i.e. d.start is ok, but d.start+8 not) ---------------- Overall structure of ZESOURCE: It is a .COM file, which runs at 100H. It goes thru 1C00 or so, then the stack. At 1D00 is a 512 entry table for control commands. Each is 3 bembler experience and hacking, and was never "planned" - just coded sitting at a tube, and modified over 2 years before being contributed to the CP/M UG. For example, to kill a symbol: k.label but to kill a control value: caddr,k and to kill a comment: ;addr, but ZESOURCE does the job like no other I have seen. ---------------- N-O-T-E: Pardon the editorial, but I feel hardware without good software is useless to 99% of us. Most good software has to be paid for. I strongly support the leg and L addresses. DASM will set an offset for you automatically. What should you set the offset to? Well, that depends upon how many symbols you will use. O2400 will load the program at 2500, thus allowing only 2300-24FF for symbols, i.e. 512 bytes or about 50-60 labels. If you didn't leave enough space, then used B to build a default symbol table, the table could run into and clobber your .com file! (easy recovery, however: just change the offset to being higher, and read in the .COM file agai DASM ************************************************************* MICRO CORNUCOPIA NOTE: I didn't have a copy of DASM.DOC so this is a copy of ZESOURCE.DOC. ZESOURCE is an extension of RESOURCE for TDL mnemonics and this is a further extension that provides Zilog mnemonics. (You don't know how I've looked for this). Anyway, if anyone has the real ZZSOURCE.DOC, please let me know where it is so I can offload it or please send it in. Dave Thompson *******************************************ytes long, and controls the format of the re-sourced list, i.e. is it DB, DS, DW, instructions, etc. At 2300 is the start of the symbol table. It has no defined length as such. If it is not used, it occupies only 2 bytes. If you want to re-source something which is in memory, such as a PROM, a program previously loaded in high memory, "CP/M itself", or whatever, you can just do so. However, typically you want to disassemble a program which runs at 100H, which is were ZESOURCE runs. Bob Van   n) Each entry takes 3 bytes + the symbol length, and if you like 7 byte labels like I do, that means 10 bytes/label. An offset of 2F00 should be adequate. If you want to put comments into the disassembled program, you will have to designate an area to Use for the comments. The U command (e.g. U4000) specifies what area is to be used. Before issuing the O (offset) command, do: L5 7 which will show the JMP to BDOS, which is the highest memory you may use. (Note if you have, for example, an e) * Forgetting how big the .COM file you are disassembling was. * Using ZESOURCE to rip off software (yes, I know, you heard that before, but only 3 in 100 needed to be told, and 2 in 100 needs to be told again, and 1 in 100 doesn't give a rat's fuzzy behind anyway!!) * Forgetting to take checkpoints when disassembling large files. You may even want to rotate the names under which things are saved: STEMP1.SYM STEMP1.CTL STEMP1.DOC * Missing a label: Suppose you have a contt offset. Hoo, boy! Hope this kludge of documentation is enough to get you going - hmmm, better give you some of the gotcha's I've discovered... ---- WATCH FOR ---- * Symbols overflowing into the .COM. (Use ? command to see how full symbol table is) * Control entries overflowing into .SYM (altho I can't believe anyone will have a program with more than 512 control entries!!!) * Comments overflowing into BDOS (ug!!) * Using an offset which is not in free memory and overlaying ress + whatever). Then you QB100,400 and viola!! ZESOURCE overlaid your "E" control with a "B". ---------------- ZESOURCE is relatively complete. (well, actually, the phrase "rampant featureitis" has been "mentioned"). ...But there's always another day, and another K... SO... Here's my "wish list" ..it might save you telling me YOU think such-and-such would be nice... * Targets of LHLD, SHLD should automatically be flagged as type DW in the control table. Ditto LDA and mpty 4K memory board in high memory, you can Use THAT for comments). Let's take an example: You have an 8K file, FOO.COM which you want to disassemble. It will have about 300 labels. 300 x 10 is 3000, or call it 4K (what's a K unless your tight). The symbol table starts at 2300. 4K more is 3300. Let's load the .COM at 3300, so since it normally starts at 100H, the offset is 3200. O3200 is the command. We then RFOO.COM to read it in. It says 5300 2100 which means it came into actual memory torol entry for a DW, resulting in: DFLT: ;172C DW 100H but somewhere in the program, the following exists: LDA 172DH Even if you did a B and have a label L172D, it won't show up since it's in the middle of a DW. Instead, do this: K.l172d kill the old label e172d,.dflt+1 put in the new label as a displacement off the beginning. * improperly disassembling DW's (see previous item). You might be tempted to make DFLT a DB so that DFLT: ;172C DB 0 L172D: ;17BDOS or whatever. * The B(uild) command gobbling up too much when building a DB: "B" will take a DB 'GOBBELDY GOOK' followed by LXI H,FOO and take the LXI as a '!' (21H) so you'll have to manually stick a new "I" control entry in at the address of the LXI. You might also delete the incorrect "I" entry which ZESOURCE stuck in (typically at the second byte of the LXI) * Trying to dump real memory without setting the offset back to 0. (then forgetting to set it back to its proper valueSTA as DB or as second half of DW. Ditto targets of LXI as DB (?). * E5C,.FCB followed by E6C,.FCB+ should automatically calculate the appropriate displacement, and put it in the symbol table. * The comments facility should be enhanced to allow total SUBSTITUTION of entire line(s) of the code, i.e. at address such-and-such, replace the next 3 bytes with the following arbitrary line. This would help those "how do I explain what was being done" cases such as: LXI H,BUFFER AND 0 5300, but 2100 if we are talking with respect to loading at 100. Thus, we could set our comments table up after the .COM program - say at 6000: U6000 The ? command shows the memory utilization for control, symbol, and comments entries. (no, I never put in anything to keep track of the .COM - you'll just have to do that yourself). If you ever want to dump real memory, you'll have to reset the offset to 0: O0 but then set it back. If you are not sure what it is, typing O will tell the curren2D DB 1 Note that while this disassembles and reassembles properly, it is not "as correct" as the technique used in the previous item. * Having the "B" command overlay your "E" control entry. What? Well, "B"uild is pretty dumb. If he finds 8 DB type characters in a row, he fires off a DB from then on until he runs out of those characters. Suppose your program was 200 long (ended at 3FF), and you had zeroed (aha! Nice DB candidates) memory there (there meaning at your offset add  FF00H ---------------- ZESOURCE types an "*" prompt when it is loaded. You may then enter any of the following commands. Each command is a single letter followed by operands. Commas are shown as the delimiter, but a space will also work. ---------------- ---------------- ; Put comments into the program. (must execute 'u' command first, to assign area for comments to be placed) ;addr,comment enter a comment ;addr lists existing comment ; lists entire comments table ;addr,assuming FCB is at 5C) but would be allowed to be entered. Note when a new symbol is entered any ather symbol at that address will be killed. This prevents having two symbols with the same address. If you have a label which has the wrong address, you need not explicitly kill the old one before entering the new. A label which is spelled exactly the same as an existing one will replace the existing one even if the addresses are different. ---------------- Find occurrence of addretring in memory which disassembles as: DB 'Invalid operand',0DH DB 0AH You might want to change it putting the 0DH,0AH together on the second line - just enter a "B" control entry for the address of the 0DH. The same technique could be used to make DB 'TYPESAVEDIR ERA REN ' appear as DB 'TYPE' DB 'SAVE' DB 'DIR ' DB 'ERA ' DB 'REN ' ---------------- dump: - dxxxx Dumps 80H from xxxx on daaaa,bbbb Dumps from aaaa thru bbbb d,bbbb Continues, thru bbbb d Co0. NOTE when using L to list the .ASM program to disk, you should either list the entire program at once using: Lssss,eeee or, you can list small pieces at a time. As long as you list again without specifying a starting address, (L or L,nnnn) then the output file will continue uninterrupted. You may do dump commands, and others, without affecting what is being written to disk. ---------------- offset for disassembly - o print current offset onnnn establish new offset (note  deletes existing comment note that '\' is treated as a new line, i.e. \test\ will be formatted: ; ;TEST ; ---------------- Attempt to find DB's while listing the program. - This command works just like 'L', but attempts to find DB's of 8 chars or longer. (see 'L' command for operand formats) ---------------- Build default sym tbl (LXXXX) labels for each - 2 byte operand encountered. Note 'B' is identical to 'L' except labels are built. (see 'L' command for operand formss or label. Note this function - runs until interrupted (press any key). fnnnn,ssss find address nnnn in memory. Start the search at ssss. Runs forever. Press any key to stop. f continue previous find command fnnnn find nnnn starting at address you last stopped at in the f command ---------------- kill symbol from table - k.symbol ---------------- list (disassemble). This command is used to list the - file, or to list it to disk after enabling the .ASM file save via 'ntinues, 80H more NOTE 80H is the default dump length. If you have a larger display, you can change the default via: d=nn nn is the HEX new default. For example, a 24 line tube could display 100H: d=100 or.. d=100,200 Defaults to 100, dumps 200-2ff ---------------- enter symbol: - ennnn,.symbol symbol may be of any length, and contain any char A-Z or 0-9, or "+" or "-". This allows: E5D,.FCB+1. Note the "+" is not checked, i.e. E5D,.FCB+2 would be wrong (the offset is always added to any address specified in an a, b, d, or l command. to dump real memory, the offset must be reset to 0 (O0) before the dump.) ---------------- prolog generation - this routine generates an - ORG instruction, and equates for any label outside of a given low-hi address pair. (the start and end addresses of your program). e.g. if disassembling from 100 to 3ff, it will generate 'fcb equ 5ch' if FCB is in the symbol table. In typical use, you would 'sfilename.aats) ---------------- Control table usage: - c dump ctl tbl cnnnn dump from starting cnnnn,x define format from nnnn to next entry. values of x: B = DB (attempts ASCII printable, 0DH, 0AH, 0) W = DW (attempts label) S = DW to next ctl entry I = instructions K = kill this ctl entry E = end of disassembly NOTE every control entry causes a "control break" (NO, ZESOURCE was NOT written in RPG) which means a new line will be started. Thus if you have a sSFILENAME.ASM' command l lists 10 lines from prev pc lssss,eeee lists from ssss to eeee l,eeee lists from current pc to eeee lssss lists 10 lines at ssss Note that if you have a control 'e' entry, then the list will stop when that address is found. This allows you to 'lstart,ffff'. The 10 line default may be changed via: L=nn where nn is a HEX line count, e.g. L=14 set to 20 lines/screen You can change the default and list, e.g. L=9,100 Dflt to 9 lines, list at 10  sm' then use the P command to write the prolog, then the L command to write the program itself. Pstart addr,end addr quiet command: any command which is preceeded by a q - will be done 'quietly'. For example, to save a .asm program, you could just do: ql100,3ff or ql100,ffff if you have set the 'e' control in the control table. Another use is to build a default symbol table by taking a pass thru the program: QB100,xxxx ---------------- read .com, .ctl, .sym, or .doc file - re: if your symbol table is nearing the .com file, then just set a new offset (higher) and re-load the .com) if you want to dump r-e-a-l memory, you would have to reset the offset to 0: o0 (but don't forget to reset it to 1f00 before continuing with your program.) If you are disassembling something which is in memory at it's correct address (such as looking at ccp) then don't set the offset. It defaults to 0 when dis is first loaded. ---> l100 list your program - lists "about" 10 lines.ESOURCE usage. Given: a COM file (lets say test.com) which runs at 100 (as any good COM file should), and goes thru 2FF. lines preceeded with ---> are typed by you. ---> ZESOURCE ---> o2200 set the offset to 2200, which means the program will read into 2200 + 100 = 2300. ---> rtest.com reads the com file into memory. system says: 2500 0300 which is the actual hi load addr, (2500) and the original hi load addr (300) REMEMBER this address (300) because you might want to put a "4 4f50xxxx xxxxxxxx xxxxxxxx *...copyr ight....* 0110 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx *xxxxxxxx ........* thus you would want to instruct the disassembler to switch to db mode at 103, and back to instruction mode at 117, thus: c103,b c117,i Continue doing this, bracketing every ascii db which is in the middle of instructions, by a b control instruction and an i control instruction. Note that multiple db's in a row need not have separate cnnnn,b instructions, but that these do caufilename.com reads in at offset+100h rfilename.ctl loads the ctl table rfilename.sym loads the sym file rfilename.doc loads the comments table (note 'u' command must have been issued) rfilename.all loads the doc, sym, and ctl files with one command ---------------- save .asm, .ctl, .sym, or .doc file - sfilename.asm use 'l' command to write, z to end sfilename.ctl saves the ctl table stablename.sym saves the sym file sfilename.doc saves the comments table sfilename.all saves the ---> d100 do a dump of your program. NOTE that typically here are the steps to disassembling a program which has just been read into memory: Use the dump command to find the ASCII DB areas. Note that the 'a' command may be used to automatically find the db's, but you must then check them to insure that they don't extend too far. All printable characters, 0dh, 0ah, and 00h are considered candidates for ascii db's. At least 8 characters in a row must be found to make sure that long sequE" (end of assembly) control entry there. <<<>>> that all 'L' (disassembly list) and 'D' (dump) commands work with the offset added. Thus, you should learn to forget that the disassembler is in memory, and think of it as if your program were actually at 100. D100 will dump your program. also note: if the program being "ZESOURCEd" will have a fairly large symbol table, then you will have to set the offset higher: o2f00 or some such. (the ? command will show symbol table usagse a 'line break', i.e. if you have a table of ascii commands, for example: 02e5 db 'load' 02e9 db 'save' the disassembler would disassemble these as: 02e4 db 'loadsave' you could put in an additional control entry: c2e9,b, which would cause the disassembler to generate: 02e4 db 'load' 02e8 db 'save' which is much more readable and realistic. Note that before generating each byte of a db, a symbol table lookup is done to determine if there is a label at that location, and if so, a n doc, sym, and ctl files with one command ---------------- use area of memory for comments table - unnnn such as ud000 if you had an open board at 0d000h ---------------- purge sym tbl and CTL tbl x - ---------------- close .asm file (note that a preferred way to close the .asm file is to have specified a control entry for the end address (e.g. c1ff,e)) z - -------------------------------------------- -------------------------------------------- Here is a sample of the Zences of mov instructions won't be taken as db's. Use the cnnnn,k command to kill erronious entries put in the control table by the a command, but then immediately put in the right address, such as via cnnnn,i if you wanted to scan the program for ascii db's yourself, use the 'c' (control) command to set the beginning and end of ascii areas. F JZ 078BH XRA A STA 1712H STA 1714H CALL 1647H CMC DCR C LDAX B NOP JMP 0177H L01F8: ;01F8 CALL L1647 ;16 dump as: 0100 c317014  ew line is started. Thus if 'loadlit' and 'savelit' were in the symbol table, as the labels on the 'load' and 'save' above, no separate 'b' control instruction would be required as the label would cause the break. <<<>>> that at this time the automatic label checking is n-o-t done for ds instructions. Make sure that each ds instrucion references only up to the next label. This means that multiple ds's in a row must each be explicitly entered into the control table. Presence of a label buffer for disk I/O. You want it to disassemble to: DKBUF ;07CF DS 80H You do this as follows: C7CF,S to start the DS C84F,B to define it's end, and E7CF,.DKBUF to put the symbol in the table. Continue, iteratively using the 'l' command and the 'c' and 'e' commands until you have the listing in a nice format. You will then probably want to save the control symbol, and comments tables. Or, you could have been saving them at checkpoint times (so if you make a major mistake you  b (for build labels) instead of l (for list program). The b commands causes lnnnn default labels to be inserted in the symbol table for every 2 byte operand encountered (LXI, SHLD, JMP, etc). It will undoubtedly make some you don't want, such as L0000. You will have to: K.L0000 kill label L0000 from the table. When you encounter data reference instructions, try to determine what type of area the instruction points to. Typically,, LXI instructions may point to a work area which should be dntering a 'e' control, or typing a z command will then close the .asm file. The listing may be interrupted, and continued. Since the l command types only 10 lines, use laddr,ffff to list thru the end of the assembly. If this is the 'final' save of the .asm file, you will probably want to put an 'org' at the beginning of the output file, as well as generate equ instructions for any references outside of the program. For example, a typical cp/m program will have references to: bdos at 5 fcb is not sufficient. ---- steps, continued: After building the control entries with cnnnn,b and cnnnn,i put in a control entry cnnnn,e which defines the address of the end of your program. The l command will then automatically stop there, and in addition, if you are in 'save xxx.asm' mode, the output .asm file will be closed. If you do mot define a control 'e' entry, then you will have to use the break facility to stop the l command (don't use control-c as that will re-boot cp/m). If you wecould go back to a previous one). To save a control file: sfilename.CTL (any filename, may include a: or b:) To save a symbol file: sfilename.sym To save a comments file: sfilename.doc (not ".com" of course) NOTE that the filetypes must be used as shown, but that any legal filename (or disk:filename such as b:xxxx.CTL) may be used. You could now control-c to return to CP/M, and come back later to resume your disassembly: ZESOURCE o2200 rtemp.com rtemp.sym rtemp.ctl uxefined as a DS, or to an ASCII string, in which case we will have already made it a 'b' control instruction. Operands of LHLD and SHLD instructions should be made DW instructions. For example if you encounter LHLD 0534H, then issue a control instruction: C534,W NOTE that whatever mode you are last in will remain in effect. Therefore if 534,w is the last entry in the control table, all data from there on will be taken to be DW's. Suppose that you determine that address 7cf is a 128 byte at 5ch tbuff at 80h the 'p' (for prologue) command generates the org, then scans the symbol table and generates equates: BDOS EQU 05H FCB EQU 05CH (etc.) If you have a "e" control entry in your file, you can list as follows: laddr,ffff - the listing will continue until the "e" control entry is found additional commands: if you entered a label in the symbol table but now want to get rid of it: k.symbol note to rename a symbol, such as when you had a system- assigned lnnnn labre writing an .asm file, you would have to user the z command to close the file. Next, you would list your program to determine how it looks. when you recognize a routine by it's function, insert a label. For example, if you saw that location 7ef was a character out routine (type) then enter a label into the symbol table: E7EF,.TYPE NOTE that all symbols start with a '.', so as to be dis- tinguished from hex data. NOTE that if you want the disassembler to make default labels for you, usexxx (such as u4000) rtemp.doc This will take you back exactly where you left off. If you want to save a .asm file out to disk, do the following: Make sure that there is a control entry defining the end of the program (such as c200,e) or else you will have to specify the ending address and manually type a z command to close the file. sfilename.asm A message will indicate that the file is opened. Any subsequent a, b, or l command will have whatever is listed written to disk. Encou  el but now want to make it meaningful: k.l0334 e334,.type you could even: e.l0334,.type k.l0334 but that takes more typing. here are some more commands: ? prints statistics on symbol and control table usage, etc. c prints the entire control table cnnnn prints the control table starting at address nnnn ds dumps the symbol table. Interrupt it by typing any key. ds.symbol starts dumping at the specified symbol, or the nearest symbol. thus "ds.f" starts 0 lines from prev pc Lssss,eeee Lists from ssss to eeee L,eeee Lists from current pc to eeee Lssss Lists 10 lines at ssss L=nn nn is hex list default # of lines O Print current offset Onnnn Establish new offset Pstart addr,end addr Generate program prolog Q Before any command suppresses console output: QB100,200 Rfilename.COM Reads in at offset+100h Rfilename.CTL Loads the ctl table Rfilename.SYM Loads the sym file Rfilename.DOC Loads the comments table Rfilename.ALL Load the dump at the first label starting with the letter 'f'. ....have fun, and let me know of any problems or suggested improvements ------------------------ ZESOURCE "Quick" command summary Any address may be replaced by .symbol i.e. D.START ;addr,comment Enter a comment ;addr Lists existing comment ; Lists entire comments table ;addr, Deletes existing comment A(see "L" for operands) Attempt to find DB's B(see "L" for operands) Build default sym tbl (Lxxxx) C Dump ctl tO1ZA:VV:Wk:X:W/:Y Number of files: $ Number of blocks: $ Number of actual directory entries: $ Number of blocks remaining on disk: $ Number of errors in the directory: $ =    |^#*.7?yOxGxJGyO-82M>d2L2P:MO:LW4x2Myx:Pʇy0_>2PÊ:LO 4y2L:L[:M0_\ Š 6?#ƒ>?2hͩͩʬôÛ *Nw#"N!~:=#!W4!Z_~s#r5 * Block is already assigned to: $ !Y4^#V *O  DIRCHK [6/8/81] This program is used to verify a directory. The directory is checked to be sure that a group is used by only one file. This can happen when a disk reset is not performed after a new diskette is inserted. DIRCHK is also useful to see if groups of an accidently deleted file have already been allocated to another file. The directory and group numbers (in decimal) are displayed. Also groups used by multiple files are marked. ------------------- Contributed by Wayne Campeau of Anchor Computer Systems, Seattle Washington FORMFEED.COM FORMFEED.DOC This tiny program outputs a form feed from the LST: device (either the serial or parallel port depending on how your system is set up). DIR-DUMP.COM This program displays all the disk files and their locations on the disk, along with the user number. ------------------------------------------------------------------- Taken from BIG BOARD USERS DISKS (FROM MICRO CO Disk select should be " N:"$& Bad delimeter, should be ":"$N No drive specified$l Only drives A to D allowed$:ڳ*|:}AEEc=_W0:O͡Pü*ainst another. Usage is COMPARE FOO.FIL BOO.FIL. DU-77.COM DU-77.DOC Very powerful disk utility. The user interface leaves much to be desired but you can do anything you might ever imagin on a disk. LISTT.COM LISTT.DOC Prints out CP/M files with headers, page #'s, and offsets from left margin. Slight bug: after page 1, headers kick back to left edge. ----------------------------------------------------------------- More or less Directly from CP/M users group disks DASM.COM DASM.DRNUCOPIA) D.COM D.DOC This super directory program produces an alphabetical list in vertical order. It understands nearly all disk and directory formats. WASH.COM This is probably the best file transfer/maintenance program around and it is available for $49.95 on the commercial market, but it is also available in the public domain and here it is. DUMPX.COM DUMPX.DOC This is like the CP/M routine called DUMP.COM except it is incredibly more powerful and more useful (e.g. displayKAYPRO USERS DISK FROM: MICRO CORNUCOPIA PO BOX 223 BEND, OREGON KAYPRO DISK # 2 UTILITIES -------------------------------------------------------------------------- CRC.COM CRC.DOC CRCKLIST.CRC This Cyclic Redundancy Checker will detect a difference between two files as small as a single byte. Also detects two bytes out of order which is something usually missed by a simple check- sum type checker. ------------------------------------------------------OC Zilog format disassembler for 8080 and Z80 object (.COM) files. This is a very famous update of an extremely famous parent called RESOURCE. UNSPOOL.COM UNSPOOL.DOC This routine lets you use your system and print at the same time (without one of those fancy print buffers). It dumps data to the printer anytime your system is waiting for an input. This way it doesn't slow the system's normal operation. Neat!!! FINDBD54.COM FINDBD54.DOC This super utility really checks a disk (with!9"1  ҉6 _B2O?????????????B2O y7#0#nn> #> #> #:OG_!~͛~͛͛͛#~>1>0#͛͛͛~##>.#~###͛ ͛~>1>0#͛# x̛~#"͐Sorry, CP/M Version 2.X required$User Pro Filename.Typ R/OSysRes exs1s2rc <--------------Group--------------> ============================================================================= $ s the ASCII equivalents). It is very fast, and I use it a lot to look for text (instructions) in .COM files I am not familiar with. SUPERSUB.COM SUPERSUB.DOC A definite improvement over CP/M's submit. The .SUB file must be on drive a (like submit). --------------------------------------------------------------------- N.W. KAYPRO USERS' GROUP -- Miscellaneous Utilities Disk ALLOC.COM Produces bit map of disk, also write-protects files. Menu driven. COMPARE.COM Checks one file ag  out destroying the data on it) and reports bad sectors and the blocks (in hex) where they lie. It then creates a file containing the bad block(s) named [unused].BAD. I'd be lost without it. CATALOG.DOC CAT.COM UCAT.COM MAST.CAT FMAP.COM This group of programs creates and maintains a directory of all the programs you have on all your disks. You can display which disks contain certain files or which files are on a certain disk etc. etc. etc. UNERA*.* This program unerases files. Ki!W>2s :s.!W 2 ++NO "<" SAVE COMMAND ISSUED ~#Wɯ2Qt!#6 G~{:*h}ͼ 2*v*to !~#"h:ʁ-{!Qs~c~8 ? ? ? ?~k Bw,sͼ *v*to ++EOF++ S :2 ++Can't dump, no sector read. 2 Use G command following F, or R or S following T ~;  BKsk Information: Tracks: *#͞ Sec/trk: *͞ Grpsize: : x<Q/ c[mmOÌw ~ ;]#AOy2:ʰ|^#V#"!~#fo**x|2 ``*"t!"v*#DMBK:=l*t: o 2 ++Can't read - not positioned Position by: Track then Sector, or Group ͮ >>w:ʆ x͇ y͐  ڙ 0w ڧ  |Ğ {0w> w>*wQ~ m w#~ #-z{ƀ_ɯ2 ++BAD DISPLACEMENT (NOT 0-7F) ~#m~] ;,->#0:`AG0))))o6#~] ;,-#0:0bk)))o|gq :!#mOF . ڬw#wì+>*wìww> w!#ɯF+ynda handy. ------------------------------------------------------------------  ; # `i}͇ :AT ~͇ } } {E #}% Q:Hʌ ~ d ~f >.w{u #}W SQ{ S{ ~;ʥ © Tʼ S GP n*8`>2 nz*o2 **t**v+:G}2r:G "p*2~:}2r-? o&"ph -*8"p2r} o2 bk:)=‚ :ro*ڗ ** #`>2~\  \< 2} ++FILE NOT FOUND =2}o&)))))*voͼ ! xl::-{EBK{ >-w> 2+*#}b|ʇ+Qʒz{{U { ͚E { ͚S*ph |~> ¬>(w~͇ #>.w:w~͇ ~> >)w ++FREE++ :n2nS>:w ~# ~#k &w*#"{!"!~{~_#~{:[W#͵w*|s>*2"\ *{+"{|;*:G::ʵ*!W LAST ADDR=* "+|͇ }͇ 2 ++YANK MEMORY FULL : ~wììʧ*  $6 S!#~ ʬw#8>^w>Uwà> w> w`_O > w:z€ ҟ ʟ ´:y ´>2z :z<2z:o*8"tBK*"v*t`i:.+.* :$g:.&i"xDMɯ2 ++not within tracks 0-*͞ ++ `>2ʬ2 ++READ failed, sector may be invalid++ :2 ++CANNOT WRITE UNLESS READ ISSUED è2 ++WRITE failDU.COM ver 7.7 7/12/81*." |2!0"*"g"q""""""4"m"v":v"Ë*."" DISK UTILITY ver 7.7 Universal Version Type ? for help Type X to exit h!~G###W> !#2͠>2l2m12n>2!"hQ:~, ~ ;# ]2+? -t =t<>#? AzCL DzFʫ Gʙ HzLqM'NʳPQR Sʙ Tʙ UVWe XYʒZ%/2 ?2 +++ Out of memory +++  Di >D2 ~.5 6 ;6 ]# ~ ;#.#> 6 ~ U ;U -zͼ zU *v*to ~ ʊ ;ʊ -z*v+|¯ *t|¨ *"t*ï +"t*"vzŠ ^ *v#* *t#* "t!"v **t G=*pDM{ >:w:r͇ >,w T=*t͞ , S=*v͞ , PS=*x͞ S~]# #-i #BKn ,H A~ ;  ڒ ~Ғ Ø k Û w"ͳ#yʯ *y ~ ; #~ ; , "j-{͇ y *j ~ ;   ed++ Operands in brackets [...] are optional Numeric values: 'n' are decimal, 'x' hex +[n] step in [n] sectors; -[n] step out [n] sectors # print disk parameters for curr drive. =xxx search for ASCII xxx from curr sector. Caution: upper/lower case matters. Use for hex: To find "IN 0" use: =<0> or "(tab)H,0(CR)(LF)" use: =<9>H,0 < save current sector into mem. buff. > restore saved sector ? give help A[ff,tt] ASCIIt. (see the dis- claimer for certain non-standard versions of CP/M 1.4). The only parameter that should need to be changed will be the clock speed flag at 103H. Leave this byte zero if you have a 2 mhz clock. Patch it non-zero for 4 mhz. This is only needed for the "Z" (sleep) command. USE: Any valid command string may be placed as an operand of the original DU command, i.e.: A>DU G0;D;G2;=OK<1A>;D Functions supported: Tnn Seek to track nn (no read) Snn Positisleep 2 sec, and repeat until control-c typed. All "nn" usage except "/", "T", and "S" are HEX. Use #nn for decimal. See DU.DOC for complete examples. yʿ#x}/o|/g#ɷ|g}o }o|gBKx! T]x :WL*.:^#"^#"~#2~#2^#"^#"^"!r~:w*} ""we ASCII in sector NOTE that may be hex imbedded in the Ascii: ca0,OK<1a> ----> Use W to write changes to disk. Note that the C command echoes the overlaid data for verification. CHaddr-addr,byte or CAaddr-addr,byte repeats a change + advance 1 sector (if below track 2, this advances to next numerical, if 2 or >, advances based on CP/M's normal sector scrambling algorithm, i.e. so + will get the next logical sector of the file - backs up 1 logical sector dump (Type any char. to continue) C Change: CHaddr,byte,byte... (hex) or CAaddr,data... (Ascii) Allowed for imbedded hex. or CHfrom-thru,byte e.g. ch0-7f,e5 or CAfrom-thru,byte D[ff,tt] Dump (hex+ASCII) Fn.t Find file Gnn CP/M Allocation Group nn H[ff,tt] hex dump L Log in drive Lx Log in drive x M[nn] Map [from group nn] (Type any char. to continue) N New disk P Toggle printer switch Q Quiet mode (no msgson to sector nn, and read Gnn Position to group nn and read. G Shows current position V Views the current sector. (assumes ASCII data) Vnn Views nn sectors Fname print directory for file "name", then positions to its directory sector. (Won't position under CP/M 2.x, but see = command below.) =string Ascii search, starting at current sector. hex may be imbedded, or used alone: To find "IN 0FEH": = Ignores bit 7 unless is used. L Re-logs in the cur DU-V77.DOC by Ward Christensen with additional notes by Ron Fowler and Keith Petersen (revised 7/23/81) HOW TO USE DU ver 7.7 DISK UTILITY INSTALLATION: The 7.0 and later versions of DU are designed to be installed with a minimum of trouble. In fact, in al- most all cases, no changes to the source file should be necessary to get DU up and running. This is because DU uses the disk paramter block of CP/M to determine the characteristics of the disk environmen Note + and - may take an amount: for example, +F steps in 15 sectors. Note also that "-" issued at the first logical sector of the disk will wrap back to the last. Further, "+" issued at the last sector will wrap forward to the first. ? Gives command summary # Prints the disk parameters M Dumps a map of the group allocations for files. Mn Shows which file is allocated to group "n". N Resets CP/M via the BDOS. This may make it possible under some implementat) R Read current sector Snn Sector nn Tnn Track nn Unn Set User nn for Find command (CP/M-2 only) V[nn] View [nn] ASCII sectors W Write current sector X Exit program Y Yank current sector into sequential memory Z[nn] Sleep [nn tenths] /[nn] Repeat [nn (decimal) times] (Type any char. to continue) Cancel a function with C or Ctl-C. Suspend output with S or Ctl-S. Separate commands with ";". Example: g0 +;d;z#20;/ would step in, dump, rent disk. You may pull out a disk, put in a new, and "L" just to log it in. Lx Logs in disk 'x', such as: LB Ux Logs user 'x' for next F command. Gives '?' error if not CP/M version 2.x. D Dump sector, hex + ASCII A Dump sector, ASCII only H Dump sector, hex only note all dump commands (D, A, H) may be optionally followed by a starting and ending address: D0,7F is the same as just D D3,5 A20,3F CHaddr,val,val,val... change hex in sector CAaddr,char string... chang  ions of CP/M to change the disk format (e.g., density, sides, etc) R Reads the sector currently positioned to into memory. Note R (Read) is implicit in the G, +, and - commands, but N-O-T in the S and T commands (I did it because I was tired of disk reading after T command before I had a chance to issue the S command) W Write back the current sector (N-O-T-E may not be used after an F command, as CP/M was used to find the file in the directory X Exit back to CP/M (Mus0000 00000000 *3456789:........* | | | | ^---allocation group numbers-------^ END w;+;/16 INTERPRETATION OF DIRECTORY DATA PRESENTED BY THE DU PROGRAM The following explains the format of a CP/M directory entry as shown by DU, using either the "F" (find file) command, or just doing "D" (dump) of the directory sectors, which are located in groups 0 and 1 on a single density disk. ---------------- Sample result of "FSID.COM" command: 40 00534944 20202020 20434F4D 0000003A *.SID COM...:* 50 33343536 3738393A 00000000 00000000 *3456789:........* First linè : (?O*.!" : (?3O*."1 : _*.'"H: o DRIVE A -$T  TRACK $z !: oú ڝ |Ĕ{0__͔ SECTOR $ !: o͔  ! : 4 DRIVE B -$ w>2 >'2 {6# > w# 7 J@ ._w# J7yj# e w# l!\/ e!ÙCOM¢!" : _\| \ø: p !" * : \: \ $ ~t press return). Ctl-c was too easy to hit over modem lines, so I decided on 2-byte (X, CR) to exit. P Toggle printer switch on/off Y Yanks current sector into sequential memory and prints ending address. This allows sectors to be written sequentially into memory starting at 3000H, for later recovery by DDT, etc. Z Sleep - causes the program to pause, such as to look at a dump. Z is 1 sec. Znn is nn tenths of a second on a 2 MHz 8080. < Saves current sector in !9" 1 2 :):og,ʸw!K CP/M DUMP UTILITY VERS 1.3 $, wCOPYRIGHT 1978 BY S. J. SINGER $V Æ *$ >2 1 2 !" !s# § >!\!s# ¿ #!A:!B:"2 >2 x~# !@ Bx?G=#* 7!@R%ZVALIDATEڋ!@m%rGROUP!@%ÇG !@%ÝMAP! !@%óDIR} !@%TRACK!@%T ,~!#:0 - 40 00534944 20202020 20434F4D 0000003A *.SID COM...:* || ||| | || || | | || ||^----hex file name-----^ || || ^file name^ || || || || in ASCII || || extent-^^ || || || || || || file size in sectors-^^ || || || ^^-00 = file active || E5 = file erased ^^-displacement of line in directory sector Second line - 50 33343536 3738393A 0000\  #y "     * ~B D>._#y a   5  Ͷ* " * " >2 2 : _: (?ڲO*." : (?O*.!" *.'"cͶ: 2 (<2 µ: <(2 Ý: & SUCCESSFUL VALIDATION$ : LA DRIVE A$8 X DRIVE B$O w ERROR - TRACK $f : !o͔Ö SECTOR $ !: o͔  >2  :} 2 B 2 ̀ : <2 &: oTa save buffer > Gets saved buffer. < and > may be used to move a sector to another place. / Repeats entire command. Defaults or /nn to "forever". NN may be 2 to 65535 multiple commands may be separated by ";" Example: the following commands will erase the b disk directory to all E5's: lb log in b drive g0 position to dir. ch0-7f,e5 fill with e5 < save the sector >;w;+;/16 restore, write, next, repeat 16 ----This could be shortened to: lb;g0;ch0-7f,e5;< >; ?))) O } 2 !@+%1SECTORI!@D%FS :} 2 2 " @l%m-Ғ:} 2 ! G~2 p* @%æEDITҌù EDIT - $ !  s#   >! %WRITE! %STOP.!0 O))))  }A.& |K}& "   seƐ'@'_: \: \  * ~\  ! s# ¡  > }.E : }* w  : <2 Y!" Jì*.*"  ))): _><  2 ~2 2 : _`o" !" j GROUP ALLOCATION MAP DRIVE -$=  :   A $|  Þ Ö B $  * ø $  ~ 0$  : <2 1$  x y z )  #   ã : $,  * ͔r GROUPS REMAINING ON DISK OUT OF 195 $K  : : _2 <2 : (?ګ O*.!" : (? O*." *." *.'" INPUT ERROR$   INCORRECITED EDITING FEATURE IS INCLUDED IN THE DUMP UTILITY TO ALLOW CHANGING DATA ON THE DISK. THE EDIT FEATURE WORKS AS FOLLOWS. ANY SINGLE SECTOR ON EITHER DRIVE MAY BE EDITED BY REQUESTING DISPLAY OF THE SECTOR FOLLOWED BY THE WORD EDIT. DUMP B:TRACK 4 SECTOR 2 EDIT THE REQUESTED SECTOR WILL BE DISPLAYED FOLLOWED BY AN EDIT PROMPT EDIT - ENTER THE ADDRESS OF THE FIRST BYTE TO BE CHANGED. THE PROGRAM WILL RESPOND BY TYPING BACK THE ADDR ENTERED AND THE PRESENT CONTENTS OF THAT ADDRESS. TOION IN THIS MODE IS SIMILAR TO OTHER UTILITIES LIKE PIP OR DDT. THE OPERATION DESIRED MAY THEN BE TYPED IN AS FOLLOWS: DUMP FILE.NAM DUMP A:FILE.NAM DUMP B:FILE.NAM OR DUMP MAY BE TYPED SEPARATELY AS: DUMP *FILE.NAM *B:FILE.NAM (THE * IS A PROGRAM PROMPT) THE PROGRAM MAY ALSO BE USED TO DUMP DISK SECTORS DIRECTLY, DUMP ANY CP/M EIGHT SECTOR GROUP, A MAP OF THE GROUP ALLOCATIONS FOR THE ENTIRE DISK OR THE DIRECTORY SORTED ALPHABETICALLY. DUMP TRACK 3 SECTOR 7 DUMP P/M TO "DEATH" BY CHANGING A SINGLE BYTE. ONE OCCASIONAL VALUABLE USE IS TO RESTORE FILES THAT HAVE BEEN ACCIDENTALLY ERASED. ERASING A FILE USING THE ERA COMMAND DOES NOT ERASE THE DATA FROM THE DISK, BUT ONLY ENTERS AN E5 INTO THE FIRST BYTE OF THE DIRECTORY. TO RESTORE A FILE, DISPLAY THE DIRECTORY BY DISPLAYING GROUPS 0 AND 1. FIND THE SECTOR CONTAINING THE NAME OF THE FILE TO BE RESTORED AND DISPLAY IT USING THE EDIT FEATURE CHANGE THE BYTE PRECEEDING THE FILE NAME FROM E5 TO 00 AND WRITE THE SECT SECTOR NUMBER$  7 INCORRECT TRACK NUMBER$  q INCORRECT GROUP NUMBER (GREATER THAN 194)$E  : ³ è NO FILE BY THAT NAME ON DRIVE A$   NO FILE BY THAT NAME ON DRIVE B$   DISK DEAD ERROR$  p  ERROR IN FILE NAME$  : ADDRESS ERROR$)  ìe ERROR - HEX INPUT ONLY $H  Y  : _* $ $Y THAT NAM   NO FILE BY  !"#$%&'() CHANGE THE CONTENTS OF THE ADDRESS ENTER THE NEW BYTE FOLLOWED BY A CARRIAGE RETURN. THE PROGRAM WILL DISPLAY THE NEXT ADDRESS AND ITS CONTENTS. TO STOP ENTERING DATA TYPE A PERIOD. THE PROGRAM WILL REDISPLAY THE SECTOR SHOWING THE CHANGES MADE. THE EDIT FEATURE WORKS ALMOST EXACTLY LIKE THE S ENTRY FEATURE IN DDT. TYPING ONLY A CARRIAGE RETURN OMITS ENTRY. TYPING A PERIOD MERELY REDISPLAYS THE SECTOR FROM MEMORY, IT DOES NOT CAUSE IT TO BE WRITTEN BACK ON THE DISK. WHEN EDITING IS COMPLETE, REDISPTRACK 5 SECTOR 3 - 9 DUMP TRACK 6 (DUMPS ALL 26 SECTORS) DUMP GROUP 19 DUMP MAP DUMP DIR (DUMPS DIRECTORY) THE WORDS TRACK, SECTOR AND GROUP MAY BE ABREVIATED AS FOLLOWS DUMP G 4 DUMP T 7 S 3-4 *TRACK 5 S 6 *SECTOR 2- 9 T 14 DUMP B: TRACK 3 DUMP A: T 9 S 4-6 DUMP B: G 5 DUMP B:MAP NOTE THAT THE FORMAT IS QUITE FREE. SPACES ARE USUALLY IGNORED THEY ARE ONLY REQUIRED AFTER THE WORDS TRACK AND SECTOR OR T AND S, AND AFTER THE WORD DUMP. A LIMTOR BACK ON THE DISK. THIS WILL RESTORE THE FILE PROVIDED NONE OF THE SECTORS IN THE FILE WERE CHANGED AFTER THE FILE WAS "ERASED". AN ADDITIONAL FEATURE OF DUMP IS THE ABILITY TO VALIDATE A DISK. DUMP VALIDATE DUMP A:VALIDATE DUMP B:VALIDATE THIS CAUSES THE ENTIRE DISK SELECTED TO BE READ ONE SECTOR AT A TIME. THE SECTOR NUMBER OF ANY SECTOR CAUSING A READ ERROR WILL BE DISPLAYED. WHEN VALIDATING THE PROGRAM READS EVERY SECOND SECTOR FOR SPEED. AS WITH OTHER CP/M UTILITIES ^S "FR --- DUMP --- BY: S. J. SINGER THIS PROGRAM IS AN IMPROVED DUMP UTILITY FOR CP/M. ANY CPM FILE MAY BE DUMPED TO THE CONSOLE IN A FORMAT SIMILAR TO THAT USED BY THE DDT DUMP COMMAND. IN ADDITION, ANY SECTOR OR GROUP OF SECTORS MAY BE DUMPED IN THE SAME FORMAT. -- OPERATION -- THE PROGRAM MAY BE RUN EITHER BY TYPING DUMP, OR DUMP FOLLOWED BY THE FILE NAME OR TRACK AND SECTOR. IF DUMP IS TYPED THE PROGRAM RESPONDS WITH A HEADING FOLLOWED BY A '*' AND WAITS FOR MORE INPUT. OPERATLAY THE SECTOR BY TYPING A PERIOD AND TYPE EITHER WRITE (WRITE SECTOR BACK ON DISK) STOP (STOP EDITING WITHOUT WRITING ON DISK) ALL EDIT ENTRIES MUST BE MADE IN HEX. ENTERING NON HEX CHARACTERS RESULTS IN AN ERROR MESSAGE. THE PERMISSABLE ADDRESS RANGE IS 0000 TO 007F. LARGER ADDRESSES GIVE AN ERROR MESSAGE. WHEN ENTERING A GROUP OF BYTES THE ADDRESSES ARE COMPUTED MODULO 128, THE NEXT ADDRESS AFTER 007F IS 0000. THE EDIT FEATURE SHOULD BE USED WITH CAUTION SINCE IT IS POSSIBLE TO EDIT C  EEZES" THE DISPLAY, AND ^C RETURNS TO THE MONITOR. DUMP CONTAINS MANY ERROR AND CONSISTANCY CHECKS. THE RESULTING MESSAGES SHOULD BE SELF EXPLANATORY.d total sectors read $ <*+PY 0:*ʹ!"**DM ;:ºg" Bad block: $ x.y.ͭ*:<_"*#"* q#:p#" i:2!d" :W!yP)=K:GcU}2*DMڐxʅ`i͐" e͐" !:<22|ʻک|».:22}2:G* !w#:w##Ý Drive speci$:BIOS SELECT DRIVE,BLOCK,CHECK FOR CONFLICTS,DIRECTORY,DISK PARAMETERS,ERASED FILE DIRECTORY,FINISHED,FIX BAD SPOTS,HELP,MARK BAD SPOT,RECOVER ERASED FILE,RESET DRIVE,SELECT DRIVE,TRACK AND SECTOR,TURN OFF DISPLAY OF BAD FILENAME,VERIFY,WHAT FILES,WHERE IS FILE@kZRH;>;AR?VK?Y@ZBL&[LWP ':!!='>2!P '><2Su':!!>U' Q2!:!!>6uwyPR':!!=M'>2!PR'>>2!u':!!:u' Q!=u'>_2!P:!2+>}24!:4!og"2+:+!ʮ'!+V"+:+}2FINDBD54.DOC This program is one of my favorites. If I even suspect that a disk might be bad I run this to see if it finds any errors. Note that it creates a file of bad sectors and labels the file in the directory so you will not try to access those sectors again. If FINDBD54.COM is on drive A and the disk you want to check is on drive B, enter: A>FINDBD54 B: The drive name is the only parameter that FINDBD54 will accept. fier out of range$ +++ Warning...System tracks bad +++ $BÝ Bad directory area, try reformatting$oÝ Can't create [UNUSED].BAD$ ڔ |ċ{0ʹ> ʹ> _*.*.   Test aborted by control-C $*dDM6# x }o|g}/o|/g#~#%7Ɛ'@'ô:W:Wi&"^ Yɷ|g}o:{%*.:^#"^#"~#2~#2^#"^#"^"> _[UNUSED]BAD  TesNo$ bad blocks found $5!:5! 26!:5!!Z!6!'>(:5!!a27!:5!!z!7!'>(>}28!:8!ogͲ'29!:8!og'(!9!}2:!::!!02;!::!!9!;!R(>Ù(::!!A2Ù(::!!a2=!::!!f!=!ʖ(>Ù(>}2>!P2?!:?!! 2@!:?!! !@!(P2?!è(:?!!>!4 ):>!!_2A!:?!!:!A!)P!=)! c"B!! "D!>2y+>!U! >og"O!*O![D!~2F!!#5ʺ*:F!!02Y!:F!!9!Y!s):F!og0R}2F!):F!!A2Z!:F!!F!Z!ʸ)*B!8ʢ)!c:F!ogAR }2F!1dg FINDBAD - ver 5.4 Bad sector lockout program Universal version Type CTL-C to abort $ ͥ@|5ͭ> ʹ*|ʕ͋Ú  *" "w"o"z " |2*.":\O2y+>g!K! > g!G! í*:y+!t*!U!*B!/:F!*g!U! í*:F!g!Q! !Q!!G! !K!!K! !G!! ] Ͱ !G! *O!"O!0):y+!*!K!!U!m `!))[+ +!U!!))[+ !))[+}2]!:]!!a2^!:]!!z!^!@+:]!og R}:]!F+8 $!9;>+++O8:n3/*+[P+͙>og*+[\+͙*r+*+`R*r+"r+!͈D!u3SS*+"z+*z+[T+P 4!cT4*z+[R+P=4!0cT4*z+[N+PT4ͭX*z+[\+P}2K+:K+og[D+~2+![͙(,:+*E"+!]͙(!_͙(*z+"R*+/g!/gE"+*+:+ogKeT!,4!,͙(*+:+_W"+÷4vSGT*+"z+>og*z+[L+͙>og*z+[P+͙:}+og*z+[N+͙>og*z+[T+͙>og*z+[\+͙*z+[R+P6:}+!5t5*r+*z+`ReT!_ʶ5!_͙(eT!"5ʚ5! c͎P"+:}+!5ʳ5*+>I5*z+[\+͙vS>2}+]>2}+]>2}+]>2K+!"2+:+!k1!O8"+*+[+0:h1!:"+*+[+,0:h1!n3"+*+[+a1GT*+"z+*z+[R+P0eT![ʚ0![͙(,E"+:K+og[D+~og[+͓"+!]͙(â0>og"+:}+!50*r+*z+`R*+̀J0*r+*z+`R*r+"r+!͈D>og*z+[L+͙:}+og*z+[N+͙>og*z+[P+͙>og*z+[T+͙:K+og*z+[\+͙*z+[R+PV1!?0S]1!?0ESh1!cô1:+!ʁ1! cô1:+!ʴ1!+[L+Pʭ1! cô1!c*+w that you have selected a new drive, so don't be surprised if DIRECTORY doesn't give correct answers. [track,sector] is optional. If present, track sector will be read. Display of bad file names is automatically turned off by this command. Examples: BIO sel(B), b s(c,3,21), etc. JBLOCK(block number) Gives the file name in which the block occurs. Examples: block(15), bl(243, b(10, etc. gCHECK FOR CONFLICTS Scans the dire )+  +  +. V>O>,;p?p?p&,DEFINE BYTE INTEGER GOTO FUNCTIONEXTERNALGLOBAL LOCAL IF ENDIF ELSEIF FOR ENDFOR RETURN END TO BY ARRAY STRING WHILE ELSE LABEL DATA INCLUDE IDENT ENDWHILEENTRY IMPLICITFIELD LIST NOLIST REAL LONG CIF CELSEIF CELSE CENDIF UNTYPED NORST CTYPE h--/V3:O8///,;;;K<>:-?O>V>n34d>;u331?7>:i7)698D8f3^35???,@]>e@`eT!(5!(͙"+!)͙(5>og"+:}+!55*+I!4ES(6*r+*z+`R*r+"r+!iSGT*+"z+>o( FIX version 1.9 as of 4 Feb 82  *z+Breaking out of setmap.   2+!:͙(,C2+:+!(Running under CP/M version %h.%h !/5:+!=?og"+*+:+o"+*WParameters for drive %c: xSectors per track: %d-%d Number of tracks: %d Storage capacity: %dk Directory entries: %d Block shift fa"z+*z+[R+PO2:K+!1*p+"p+ 2:K+!2+:K+!!+ 2*p+"p+*r+*z+`R>og*z+[P+͙:K+og[D+~og[r+"r+:K+og͈D2eT!=ʁ2!=͙(,*z+`R>og*z+[P+͙2:K+og[D+~2+eT!_2!_͙(:}+!ʹ2!"2*r+:+ogK:}+!52*r+*z+`R*r+:+_W"r+>og*z+[P+͙>og*z+[L+͙:}+og*z+[N+͙:K+og*z+[\+͙*z+[R+PN3!/SU3!/ES>2K+/>2K+/>2K+/!1cGT*+[R+Pʒ3!c>og*+[L+͙>og*+[N+͙>ogctory for files that overlap. Files are deemed to be overlapping when they have at least one block number in common. When a conflict is detected, the names of the two files that conflict and the block number at which they conflict are typed. Examples: check for conflicts(), c f c, c f(), etc. >DIRECTORY Gives a sorted directory listing of the currently selected drive. This routine will NOT work properly with disks that have more than 512 directory entries. DIA( !"2+:+!ʿ.!/"+*+[+ .>2K+À.!V3"+*+[+%.>2K+À.!^3"+*+[+@.>2K+À.!f3"+*+[+[.>2K+À.!O8"+*+[+y.!8BÀ.!c!"2+:+!52+!O8"+*+[+8!+ʴ.!'c:K+og8B*+"z+!_͙(9!+ !+*z+`R>og*z+[L+͙>og*z+[P+͙>og*z+[X+͙!+!))[+ :y+!?/>2K+ð/!+!/|!/5b/>2K+ð/!)[+2+!)[+2+!)[+ !+!+ʫ/>2K+ð/>2K+:K+ogctor: %d Block mask: %d "Block size: %d 8+Directory allocation blocks: %s (%hH) e!Operating system tracks: %d Extent mask: %d #Checked directory entries: %d BIOS SELECT DRIVE(drive,[track,sector]) Selects drive directly through the BIOS. The reason for having this function is so you can select a disk with a bad directory. If you use this routine to select the disk, all that will happen is the drive will get selected. CP/M will not kno  SK PARAMETERS Displays the disk parameters of the currently selected disk. For 1.4 systems, the following parameters are displayed: sectors/track, block shift factor, block mask, number of blocks, capacity of disk, number of directory entries, directory block allocation, and the number of tracks reserved for the operating system. For 2.2 systems, the extent mask and number of checked directory entries are also displayed. ERASED FILE DIRECTORY Same is DIRECTORYhe file has been destroyed. The file will be recovered anyway. Examples: RECOVER(D.COM), recov(fix.spl, recov(junk.???), etc. #PRESET DRIVE(drive) This function resets the disk system and selects drive . This enables you to change disks without having to reboot. A typical use for this routine would be if you were verifying a bunch of disks and fixing all the errors on them. Examples: reset drive(b), r d(p), reset(A, etc. $SELECT DRIVE(drive) This  FIX BAD, fix, fix(all), f b(all), f b, etc. 0`HELP(command) Displays all commands or one command in detail. For instance, typing 'help' would give you a list of all the commands. Typing 'help(list)' would give you a brief description of what the command 'list' does. As with the rest of the commands, HELP can can be abbreviated (e.g. he, hel, he(di, h(fix), etc.) qMARK BAD SPOT(track,sector) Adds the block corresponding to track and sector inthe initial track and the final track. If neither the initial track nor the final track are specified, all the data from the directory track to the last track is verified. Unless explicitly asked for, VERIFY will not attempt to read the system tracks (tracks 0 and 1 usually). This is because track 0 is usually single density and if the rest of the disk is double density, FIX thinks that ALL the tracks are double density. The current track is always displayed on the scre command, but the files displayed are files that have been erased. These files may be recovered using the RECOVER ERASED FILE command. #FINISHED Return to CP/M. tFIX BAD SPOTS([ALL]) Fix does two things: (1) Displays the track, sector, block and file (if any) that contains the bad spot and asks if it should attempt to fix it (by reading the sector, writing the sector, and reading it again). (2) Asks if the user wishes to place the bad block a bad spot fiselects the disk drive to which all subsequent disk accesses will take place on this drive. The default drive is whichever drive is logged in when this program is run. Examples: s d(b), sel(c, s(a, etc. %TRACK AND SECTOR(track,sector) Displays the file name of the file containing the track and sector . Examples: t a s(12,23), t(76,5, t a(34,15, etc. & TURN OFF/ON DISPLAY OF BAD FILENAME(switch) This function is here so that you can contro BADSPOT.!!! file. If bad spot file doesn't exist, one is created. This command is used when there is a known bad spot on the disk that for some reason the VERIFY command doesn't find. Examples: MARK BAD(45,6), mark(23,23), m b s(3,16, etc. "RECOVER ERASED FILE(filename) This function attempts to recover the erased file given by . A check is made to see if any of the erased file's blocks have been re-allocated. Re-allocation of a block means that a piece of ten. If an error is found, it displays the track, sector, and block in which the error occurred, and the file name (if any) in which the error exists. These are stored in an array that is later used by FIX BAD SPOTS. Hitting the Escape key (ESC) at any time will abort. Examples: ver(0,76), verify(45,55, v(34,34, v, verify, etc. g,WHAT FILES(track,track) This command displays the names of all the files that have data between the two tracks specified. Hitting the Escale. IMPORTANT! The VERIFY command must be used before FIX is called. To get back to the main program without going through all the badspots, the user can hit the Escape key (ESC) followed by a carriage return when the computer asks 'Try to fix it?'. If you want to place all the badspots in a file without going through all the questions, call fix with the optional argument of ALL. FIX will then merrily place all the badspots in a file and return to the prompt. Examples:l whether or not FIX will display the name of a bad file when it encounters a bad sector while doing either VERIFY or FIX BAD SPOTS. When the directory of the disk you're checking has a bad sector in it, you should turn the display off, otherwise, leave it on. is either 'off' or 'on' (upper or lower case). The default is ON. Examples: T O D(OFF), T O(off, t off/on(ON, t o(on, etc. (VERIFY(initial track,final track) This routine reads every track between   pe key (ESC) at an time will abort. Examples: what f(10,11), w f(3,76, w files(5,5), etc. h-WHERE IS FILE(filename) Displays all the track, sector, and block numbers that occupies. For instance, if the file FOO.BAR occupies all of block 2, the following might appear: FOO.BAR: Track: 2, Sector: 20, Block: 2 FOO.BAR: Track: 2, Sector: 26, Block: 2 FOO.BAR: Track: 2, Sector: 6, Block: 2 FOO.BAR: Track: 2, Sector: 18, Block: 2 FOO.BAR:7 Sector fixed.7Add to bad spot file? 47BADSPOT.!!!E7\\\ Out of directory space.f7Unable to close BADSPOT.!!!>  7"Track %d, sector %d (block %d)7 now in BADSPOT.!!! !"( *& >7MMz\*& ~02V^"8%s: Track:%d, Sector:%d, !8Block: %d (%hH) \UND<8%s: Track:%d, Sector:%d, [8Block: %d (%hH) ct8Block %d not in a file. 8%s contains block %d u`*r+8$No file at track %d, sector %d 8 %s is at track %d, sector %d8eady allocated to 31...Funny, I can't find who it's allocated to.G3))[+ !)[+2R!k3&Can't find %s as an erased file. tX!)[+3 Track:%3d R3' ### ERROR: Track: %d, Sector: %d3 Block: %d (%hH) 3Error not in a file4Occurs in file: %S X+4+More than %d bad blocks on this verify.X4> Use the FIX command to store the bad blocks just found.46To get the rest of the bad blocks, use the command4)VERIFY(%d,%d), then do another FIX. 4 g"3![~og"<![~25![~26:6ogͩ"8![~og":![~ogͩ">![~og"B:5(!>(!d!*:R-!͟*3@Ϳ*B@x!@xV"D*:Ս"J!ʹb"F*F=*3R"H=*3"Hj:>og"!!K2|!! K"8>>og"*C*Ս*!Ϳ͊b-;*E?"/"1*/"3*:@ʖ>*1)[3)ã>*1[/~og"5"7"9*5";*:@>*9*7)[;U>*9*7[5s:|Aog*U!Ϳ*H*F Track: 2, Sector: 24, Block: 2 FOO.BAR: Track: 2, Sector: 4, Block: 2 FOO.BAR: Track: 2, Sector: 10, Block: 2 Hitting the Escape key (ESC) at any time will abort. Examples: w i f(hi.ho), w i(d.com, w i(badspot.!!!, etc. /H<. "#$%&(e,f-!022Q"3-0*Put new diskette in drive %c:, type CRY0 R[7Qwi0Unable to select drive."~+*~+TU!c*~+0"Need argument of 'OFF' or 'ON'0OFF0OFR0ON0"Need argument of 'OFF'  (block %d) ͯ_IZ!" <[}Z$9&9fn* AP(897 ### Error. Start track greater than final track.q9, ### Error. No files on system tracks.9????????.???_9%s is on track: %d 9%s is on track: %d 9%s is on track: %d zY* :%s is on track: %d =*͛>2}>*E*Q"s*s"u!>* **{k*͛6:*F"*#"*H[-:*F"*[FRʹb[N:*"t!:*͗Ì:**)[ Ur:>\og"![~!D;*3[Fͩ No bad spots detected.5 %d bad block-5 detected.=5s detected. 6P5BADSPOT.!!!a5\\\ Out of directory space.5BADSPOT.!!!5BADSPOT.!!!5BADSPOT.!!!5BADSPOT.!!!5&No more directory space available.++5BADSPOT.!!!6&No more directory space available.z Z36Z0w#"( !E6ZͩY!Q6No errors found.g6BADSPOT.!!!x6Track: %d, Sector: %d, 6 Block: %d6 File: %S is BAD. 6 is BAD.6Try to fix it? 6Failed to fix. Try again? *v!Ϳ*D*!Ϳ*8Ս[:ͩ*!Ϳ*<*!Ϳ:5og*!Ϳ:6og* !Ϳ*8* !Ϳ*=E!!*=*>G*>*=*6!Ϳ*B*c!Ϳ*N?:7og*!Ϳ*@*!Ϳ!?*/**=p*_2*0:*0og*+0!Ϳ*0x*W0͛:*0ogAR}2*0:*0ogE@!D@Y@"_0!! K*"_2|:|ogAR}2|:|og!K͊b-;>og"*"_2|:|ogAR}2|:|ogbog@*g0͗>2}-;>og"*{NA*"! *^"c0!or 'ON'R!+U!+͙(1R!-#10### Error in directory: track %d sector %d og*R[\+a1*p+*R`R>og*R[P+͙1111????????.???+[L+͙>og*z+[P+͙111*z+[T+͙>og*z+1MP"R>og*R1????????.???+1+There is a conflict, but ah dunno whar.$2#File %s conflicts with file %s I2at block %d (%hh) b2 There n2are no conflicts.2is 1 conflict.2are %d conflicts. ʴ22Ré2)Block %d (%hH) is already allocated 2+Block %d (%hH) is alr* ͖_*͗!̈́c*͛!̈́c*͛*N! [~ogͩ"! [~og["@![~ogͩ"! [~og["B:5(!>(!d!*:R-!͟*3@Ϳ*B@x!@xV"D*:<>og"L<>og"L=*4"![~o   *^"e0*e0*e0*c0!bH"0"0*0E>20>og"0*0#"0> og[0-A*0[0~! 9ʪA*0 ʓA:0!ʓA*0!.>20*0*0[0~ogA:0!A>20*0!.CA"0*0"20:0!a(20:0!z!0B:0og R}20:0"0"0*0-"0*0-"0*0{"0*0{"0*0[0NOB>*0{"0>20*0{"0:0og20*0N!0ʯB*0A20*0A20:0!0JʬB>20^B*0*0a*0*0a:0*{B*0͗*0* B20*0* B20:0[8CNK*2"2>og"2*2#"2*2[2-K*2![2)[2)`GogʽK![2)[2)![2)[2)*2!Ϳ![2)[2)EogʶK*g͗ýK*3͗#K*E3*h>![E3w>?! [E3w*E3ͿEog"g3*g3L**i3!Ϳ*8*a*g3 ͩ"g3*w[g3I>*g3[ww*ʹb**w c*E3(Dog"g3*g3NʷL*g3 ͩ"g3*w[g3I>*g3[ww*ʹb**w c*E3(Dog"g3cL*8*a*{L*B"*DR"!M! *^"*{:]1!G*_1(D2^1F:]1!+G>]G*:FG*1R"1RG*1R"1*g*1!A>"1"1*1Ս"1*1C}21>21>og"1*1#"1:1og[1-ʺG:1!y21ÔG*1[1~21:1!1!KG>G>"1"1*1Ս"1*1C}21>21>og"1*1#"1:1og[1-9H:1!y21H*1[1~!1*1[1w!"1*J*1!ͩ>og"1!!K*1*1h>?! [1w*1!K21:1ogNʦI:1!og"1*1*1h>N21*1[L!1ʕI*1*1h>~!K25*O!5)Q*O"OP*O[s~!K25*O-!5Q:N!72N>og"O*Q*5h:N! [Qw> og"L5*L5#"L5>og[L5-ʨQ>*L5[QwÂQ*Q!KogQ*5͗H>![QwûR*O)[u)N25*O!5 R*O"OQ*O)[u)N25*O-!5ʻR:N!72N>og"O*Q*5h:N! [Qw> og"L5*L5#"L5>og[L5-ʍR>*L5[QwgR*Q!KogʮR*6͗H>![Qw>og"O>2N>2-6*"_!AS*{NR*"R>2N6og20:0og!0'C>2}MC*0* BogFC>2}MC*0͗*8*a"1*1)[ )" 1* 1[FRʹb" 1" 1* 1]C"1* 1[BR[3ͩ[1R"1>!5I21*1:1_WՍ"1>!5Iog[1ͩ[3Ս[B"1!:5_WX[1ͩ[3CrC"1*[<21:~!!1ʔE*CD*"*3R"1*[1@ʔD*">og"*ʹb**wb!KD***!1!Ϳ>*C ͩ[w"1>og"1>2~:~og2S1*1 M*"!M! *^"*"3>og">23*3[23:3!!3ʎO*3*3!Ϳ*H[FR!*3!b"3*3N23:3!!3pOt!K+O*3*3*3!Ϳ*3*3͉C"3*3*3*3!Ϳ:}og N*3E!M*3͗ N*g* 4!Ϳ*SN*3*)[ U*3*)[U*3*)[ U*"N>23>og"3*3#"3*R[3-ʚN*3)[ )[3ʗN>23bN:3ogN*3*)[ U*3*)[U*3*)[ U*"*3]C[HN!"3(O*3]"1*1*1`Gog}I*1E!2I*1͗*1E*1*1R!A*g*1*"2!Ϳ*1*1*G2!Ϳ*1"1ÈI*1*1G*1"1H*1!K21àH*`2͛*1I*l2͗I*1I*2͗I*1*2!Ϳ"2!!K"2*2"2*:J![2~ogͩ[8Ս"2![2~ogͩ[8CNYJ*2"2>og"2*2#"2*2[2-J*2![2[2~og`GogJ![2[2~og![2[2~og*2!ͿcJK![2~ogͩ[8Ս"2![2~ogͩS>2N6*S*O6͗>og")6*)6#")6*R[)6-MV*)6)[ )Eog}S>2/6*e6*g BogzSJVÂS>2/6*)6)[ )*)6)[)*v6!Ϳ*)6)[ )*6!Ϳ:/6ogS*g*6!ͿS*6͗:N6!T*6͛*C6E*C6x*C6_2.6:.6!!T:.6!YʨT*)6)[ )*)6)[)hb!206:|ogE@:|og!K:06!ʛT*6͛*C6E*C6x*C6_2.6åT*7͗JV!T*7͛*C6E*C6x*C6_2.6T>Y2.6:.6!YJV:-6!TO>2-6:/6ogU!S1QE*1[1~!?KDE*1[1~2T1*1[1~2U1:T1!U1JDE>2~*1"1D*"![1~og2V1![1~og!V1ʑE>og"0D:~ogʼE>2~*RC}ÿE>"W1>og"!"*B">2~*W1(D"Y1*_1*1h>?! [_1w>2]1*gE*_1ͿE2^1:^1ogN21:]1!!1G*:ʦF:^1!og"[1*[1#"[1>og[[1-ʣF*[1[1~og[Y1ʠF>2]1oFG:^1!og"[1*[1#"[1>og[[1-G*[1)[1)[Y1F>2]1FC"'4*H[FR*'4[FR*3!b"30O>23*mO!*)4!Ϳ*V4͗*4͗**3*4!ͿyM*3"3t!ʋO>234Mt*ʨO*4͗O**5!Ϳ*O*+5͗O*;5͗*Q*N5h*Q!Kog`P> og"L5*L5#"L5>og[L5-'P>*L5[QwP*Q!KogHP*_5͗H>![Qw>og"OûR>2N*Q*5h>! [Qw*Q!KogNP:N!72N*Q*5h:N!7! [Qw}P*Q*5h:N! [Qw*Q!K>og"O*:Q*O[s  *16*gh*16!K*:![Qw>![Qw*Q!K*Q*27h> og"+6*+6#"+6>og[+6-U>*+6[QwU>og"O:N2N:N! [Qw*Q!Kog=V*C7͗H>![Qw%S:-6ogʡV:6og[Oͩ![Qs>![Qw*Q!KogʡV*d7͗! *^"7! *^"7*7*7͉C"7O*:V*7*O[ssV*7*O)[uU![ _>2!9]*$9!K29â]0_:_%s C_%s L_ U_%c]_.d_ k_%s t_%s }_ _%c_.=" _""_*"_Ս"$_*"_C"&_>og",_*$_@ a>og"(_*(_#"(_*$_R[(_- a*._E!!*._*,_d*._*8_!Ϳ*(_ͩ"*_**_#"*_*(_ͩ[*_-|`*._E!!*._**_[ _~ogd*._*A_!Ϳ)`*J_͛*(_ͩ"*_**_#"*_*(_ͩ[*_-`**_[ _~27_:7_! (2R_:7_!!R_`:7_og*S_!Ϳ`*[_͛Ñ`*b_͗*8*8*g*8!Ϳ*8*8!Ϳ! *^"9! *^"9*9[9@W[*69͗*9[Bl[*o9͗*9[Bʔ[*<ՍrC*9͉C"9â[*F*9͉C"9*F*9͉C"9*9C[9N[*9R"9[*9"9!!K*$9*9h>?! [$9w*gE*$9!K29>2!9*:ʢ]:9ogN29:!9!!9ʟ]:9!og"9*9#"9>og[9-ʎ]*9[s~og[9-29*9[s~og[9!929:!9!!9ʋ]*sR""9*g*"9!A*9[s~ogC"9*9*g*9!Ϳ*9[sh1ͯd*ebe:h( =GĖee͈f{h!>2h"h!Re\>?2h͇cͯdA2f?????????????2h!"h\ͯd*h#"h`ƀo&"h͇hTgͯdyqh"hyqh *hSh8 xqh[hSh8x8 e x(x0}MܖeyD8yghxgh~w*h&[cTad{(#"h:c2h2h2h2h:h!h_!h0:h(͕d {ͽg:h!hw:h![Qw*Q!K*7*7*7*7!Ϳ*7͗*7"s*s"u*7*h>2N:6og"7>27*7!KogN27:7!!7[Z>og"7![7~og"7*:Y*7[s~!K27*7!727:7!!7X**7!A*7[s~og"7*7C"7*7C"7>og"7*7[727*7@!727:7!!7Xt!lX>27*7*7**8!Ϳ*7*7*8!Ϳ*7]C"7*7"7*7rC"7*7*7͉C[7NX*F"7*7"7*7"7*7R"7.X*7"7W,_",__*&_@ b*._E!!*._*,_d*._*i_!Ϳ*$_ͩ"*_**_#"*_*$_ͩ[&_[*_-ʣa*._E!!*._**_[ _~ogd*._*r_!ͿOa*{_͛*$_ͩ"*_**_#"*_*$_ͩ[&_[*_- b**_[ _~27_:7_! (2_:7_!!_b:7_og*_!Ϳb*_͛øa"0c"4cVc\cK0cʹb"2cDMYc_c *0c[4cR0 *0c#"0c!*2cVc\cYc_cbc_c"c | } >26c26cOSc^#VS7c:6c 0* n&[7c!hcSc| } >^#VS7c"9c\cVc~ogC"9*9]C"9>!5Iog[9R"9*9rC"9*9*9͉C"9*9[s~29*9:9_WNz]*9*g*9!Ϳt!ʋ]>2!9g\*$9!K29#\_:9ogN29:!9!!9_:9!og"9*9#"9>og[9-_*9)[u)[9-29*9)[u)[9!929:!9!!9 _*uR""9*g*"9!A*9)[u)C"9*9*g*9!Ϳ*9)[u)C"9*9]C"9>!5Iog[9R"9*9rC"9*9*9͉C":*9)[u)":*:[:N^*9*g* :!Ϳt!;d͕d/g;d͕dk USED Files/Bytes: *h&;d͕d/*h-h;d͕dk [032381]ɯ2huh"h!h0*h[hSh:h(<~2h4ghwbhw*h#[h *h:h( ~#( ( #:hbhywqh ~ͧd#gh~bh^*h"h-h;d͕dk`o*h>2hh0 x -h:h=2h >2h~2h#:h2h*h,&dChChChxGyOzW{_ #q#!!O gh~o&))) *h:c7#h?(7#́>>*9*7)[;:>*9???????????! w#w#w#wSXibk 6 fnV^RD>Z*7)[u)N268*7!68278:7!!78>Z**7!A*7)[u)"7*7C"7*7C"7>og"7*7[7288*7@!88298:7!!981Zt!ʫY>27*7*7**:8!Ϳ*7*7*Y8!Ϳ*7]C"7*7"7*7rC"7*7*7͉C[7NZ*F"7*7"7*7"7*7R"7mY*7"7Y:N!72N:N! [7w|W*8*a! *^"p8*p8E!ʛZ*p8*r8!ͿîZ*p8*g*8!Ϳ! *^"8! *^"8*8*8͉C"8*8E!Z*8*8*8!Ϳ%[*Yc_c*9c"9c\cVcYcbc*9c*;c0physical = %d d }c~2h~2h~2hnf"h>(>2hnf"h*~62h~72h2hn8&"hn5&"hBK80)xcz2_d{2`d"h!"h:_d2_d:`d2`d;d*h5d*h DM:`dg:_d]d*h)"h*h)Wd#"hd<)cdKB7B0 =nd|}/o|/g#͕d ͛d~˿ͧd~#(_ͯd~#OF#|̈́d  ad{0} (>- x( 8G͕dͧd y2cs  M[Xi#~:+ ~_@## ~.( ( a8{0 #  (![Xi#~a8{0 # * i?*=hi!*=*>*>*=*6!x?*B*c!ͥ?*4;?:7og*!ʹ?*@*!?!?*/***_2*0:*0og*+0!?*0*W0*;:*0j j\\\ No such command4j\\\ Command underspecifiedogXj^jdjV@X>-;>uj?*^jjAR}2|:|gog+>@*j>2}-j"*ͽ?A*͖@! *"c0! *@"e0*e0*e0*&s*'k)[j)"'k*'k)"'k*'k͗Ús*'kAs*Zk͗*jÚs*'kʚs*j*kͣn!s*k*kn*k-"'k*k*kn!Kʗs*'k*ka*k͗XsIäs sʹII*2;II*1*2!nI"2!!">"2*2"2*:HJ![2~ogD[8G"2![2~og!J[8GHYJ*2"2>og"2Ot2*2[2%HJ*2![2[2~og`GogIJ![2[2~og![2[2~og*2!IcJK![2~og=J[8(J"2![2~ogJ[8DJt (*j{"j*j7o*jE!j[jf2o*j*j[[if"j*j"j*jR"j-ʵo*j"2j:j!(2j:j!,!j2j:j!)!j2j:j!/!jʨoúo*j"jJo> 2j*j[jR"j*j[j*j[[iͯ*j[j*j[]iͯ:j"j"j"j*j*jͣn>og"j*j#"j*j[j-og"'k!p*k*kn*'k"'kp:"k!@Sq*'ks-y! zxÕx(vg2sMv!z*Mt{{2s:s! Ky:sog|$y:sog|!z*Mt{{2s:s! KryKy*Mt:sog(v!z!Z|*sR"s-ʴy*s"!%zÎy(v*Mt{"fu*s{[fu"u*u@z:s!Ky!S*uR"u*s8[uR*sm*Mt8"u*s*Mtͷ*sE*Mt*sͷ*u*Mtm*s8"u>2sgx!z!Z|*sR"s-ʇz!z!z!3~`z(v:s!Kʶz*s͛:uogNʶz:uogz(v!S(v*uE*Mt*uͷ>*hu͗>}2u:s!K{:u!c0"kkk0>og"0/k&3kAvailable commands:LkSk \k\\\ No such HELP command="_i"ai"ci}2ei*fiE*fi{k!*fia*fi:eiogͻu*fi{²kk:eiogS*j͛:j!(l*fi*ai m" j:Zi2j*fi-" j* j-l*_iE:j!(ʥl>2j!l*fiL2j!)Knl:j!(]l:j2j*_i:jog2l:jogR}2j!Kʗl*_i:jog2l!l*fiL2j* j)[ci)" j!l* jG*_i{—k*_i-[ j*fiam* jl*j͗m*2j2>og uvvvvvv,w>w xiw>wwWww x4xBxPxxxxPxy$yyyUzBu user string too long to edit[2kju line edit internal errorEogWKʶK*gIýK*3ͱK#K*E3*̓H>=}2u"u*u{@u*@u͗>>2s>2s*sE*u*sͷ*s8"u*MtE:uogN(v:uogSg2s:s!Mv:sog)[u)&~*Mt{-gv!Sv*Mt:sog:sogz:s!ʖv!(v*sL(v>!s2s(v!z*Mt{{2s:sog|(v!z!z!!|(v!z!z!3~(v!z!w!3~v:s!R"'k>og")k*)k#")k*'k[)k-Pq*)k)[j)"+k*+k)"+k*+k͗*Jk͗qr:"k!22Pk:"k!3!Pkr:"kog0R}2"k:"kogR[-k~2$k*'k:"k_WR:"k_WՍ")k>og"+k*+k#"+k*)kR[+k-r*jE>2#k!#k4:"kogR:#k_W-r:#kog[)kͩ[+k"%k*%k['kr:#k!K4r*Qk*jͷ*%k*j*ko*k{"%k:$kog[%k-ʏr*k*jͷ*%k"%k:$k_Wʌr*j! hrr>og"%k*%k#"%k:$kog[%k-r*k"2Yk*j:YkogÙrq*j͗øqr2s*j*kͣn*j*j m"'k*'k-{:u@2u!^S:uogS"u*u{"u>og"u*u#"u*u[u-^{*u"ogz9{*u-[uR"u*u*ua"u"u*u{ʜ{*u*u-"u*u8R"u*u*ua*u"2u*u*ua*u*um:u:s!K|:s!K|:sogS:s!K|:sogS}2u:s!KY|{! S{:u!Y|{! S{}2u"ug2s*s-"u:u!ʎ|!|*sL>og"s!|*sL!sJʷ|*s"sÖ|*u*sa*s}*u*sa*u}2u}2u"u"u*Mt{"u:u!*fi͗mçk"Rj"Tj>2hj>og"ij!"kj!m*Tj*bjn2Zi*Rj*\jͣn!m*\j*Vjn*Vj*bjn!Kʆm:hj!{m!*ij"kj>2hj*ij"ijHm*kj"mj!?S*mj-"oj*mj8"qj!*mja*oj*mjm*mj͛! S*oj*mja*qj*mjm*mj͛*sj͗"zj"|j>2~j*zj*jͣn!n*jV2j! 9nn>2~j*|j*jͣn!n*jV2j:j!jʚn!n*jV2j:j! KIn!n*jV2j! Kʗn}ncn>2~j:~j"j"j*j[jR"j*j[[if[j*j[[iͯ*j[]if[j*j[]iͯ"j"j"jw><2sw>>2s:sogz>!s2s{(v!z!w!3~,w:s!KTw:sogSMv!z!(v!3~Ww!z!z!!|(v!z*Mt{{2s!w͎~:sog|w:sog|!z*Mt{{2s!w͎~*Mt:sog(v!z!w!3~w!+z(v*s͛*uE*Mt*uͷ:s*s-}2s!91x:sogR*saåv!z!Z|`z!z!Z|Îy*sE*u*sm>2s!(v*Mt{{2s:sog|gx:s!ʪx! S*s{*s͛*Mt{(v!z*sL!%z(v:s!y*s͛*Mt8"bu*Mt-"du*bu[duR"s*sR"  X}>og"s*s#"s>og[s-P}*s[t~og[uRR"u*u@M}} }*u}>og"s *sR"s>og[s}*s[t~!Kʾ}*s[t~og[uRR"u*u@ʹ}}*ub}*uR"u- ~:u!~*Mt! ! z:s! ~!~*sL~!!~!}!3~}*u"u*u}2u"u"u!~*sLog"u*Mt{-j~*u*Mt*u:u!Kʈ~*uz*u"u:s!0(2u:s!9!u2u:s!A(!u2u:s!Z!u2u:s!a(!u2u:s!z!u~*u:og0R}2* :_Wͩ:_W" : !-C* T]goR" * ""}2}2> 2'> 2)*E*2*:! !*ʟ>-2)*T]goR"ö*ʶ*!0*Np:!*}o|g}2&*|"7:!*}o|g}2&*|"7*:_WC}2&*:_WՍ":&! 9W:&Aog R}2&_:&02&*:&ogö:)!-ʇ*!-:ogN*{"+:og[+و>2(!(4:!('Ո*!*͂÷*{"-:og[-R}2>2(!(4:R #**tu*R *͛**"%([o*+"> 2*"% [o*++"08p(,:0402*"08+:0'0:! ͒!w2*"G>2xa8 "D(+N('O('X('H(#C(BS(dU(xAʾ!͗> >>G:OH**: G6d1*: }2L*:oM* **ͷ*{"*>2|:(_Ս [: Gd*|CX:o [d: >2*N*:=I2*#"1/!1/*]]!s*!*### >RT]goM#"R* } wT]^o&Ս}]To&|G(o>gz(_>W!9!T]&){ݖOzݞ#YW3333ȯo>g^o&Ս{]To&ՍbkFOxy'Ez(!{C%FOxy?Ez(!{C<n2Ž}2>22Îx|2}2Žz2{2Îgh>!!ŽOx!Gy!!!Žӎ:ŽG:nN#F#^#Vq#p#s#r!~o&z o&"~| !!"~{nfnfJDM!~fnR`iFNBDM!~ր2! ր!w! V^yHV^S_:! ! ~!~!!!0Z>2 ր2!ր!w! !~>2!!xd!!~!d_!~! ~x !~>!w:(<2: (#:( !~!!~>!~!~x!!~>ɯGOW_~>  !('*:'og͂*{}2>2(!(4:!('c:!(og[~2&*:&og͂-""}2}2>02'b}2/"0*0ʨ:/ogSö*0:/og""*V^*fnV^էR(0DM" *V^* tuV^~rsa{ %[[[[fnV^R"ŊE>2ȊNJ :ȊO*Ŋ*ŊV^T]!Ɋfn_tu dÔ_"_i"ai"ci}2ei*fisa*fiRt[="*{"*V> *""}2*52:!-ʉ>-2 Î>+2 :!+2 :!-! ʴ*52:!02:!99!օ>og>2:!0(2:!9!2:!A(2:!F!!=::og[w:2*52ۅ:!HX>2*5ã:!Os>2*5ã:ogR[~!Dʣ! }2:ogR}2:ogR}2 >og" >2!4: !'*:og[~2:!99:ogAR }2R(.n((0$R(%n8R3n8R%>n(8R(3nR s#r_z)O_|y_!){ozg??zO_X"y_!)X[zW{_>ݦw>ݦwg_ >~x ~x >~x ~x > ͹ ʺ ǻ ~!~!~!~!~!~!~͒#= !~͒8= !~~ ~ ~ ~>GOW_yO#xG#{_#zW!~yO#xG#{_#zW!~yO#xG#{_#zW!~,PRINTF called with invalid format string"""*R(* *E*"*{"*fn"*k!*fihZ*fi:eiog*fi)++++##)++++"_*_!ututq#p##q#p"*fnV^R>>2"*fnV^R8(DM*^# x y :  }2"*V^:wrsU]F#Nah  FIX.DOC Fix is a super routine which gives you a lot of direct control over your disks. You can, for instance recover a file you have erased. And, you can specifically create files that cannot be accessed from the keyboard or that cannot be display on the screen. To use the Fix help command (good documentation), just type HELP(COMMAND NAME) For instance; HELP(RECOVER ERASED FILES) or HELP(DIRECTORY) and so on; HELP, by itself display the list of commands. Enjoy s or bit map ++$!v~# 80ڀ :Ҁ xGG x2M aGmG Q Oxgþp y0_:S FʘBʘ/ʘLʘ ̟: P{  :L O>2L \!o~ʹ: U:M ¹#] ?#ù$_ > ͟  ~`x>.`#"> `>?`_N7SY4> `> `_!v~0$ >1 > >$ >2 :S P> >$ >3 ~ {#±> {> {> {:S B / o  ) U z:V *T "U >02T !` p  ~# :T 2 2' 2A 2x :U 2 2( 2B 2y :V 2 2) 2C 2z :H 2o :I =_o o <’ ++CAN'T MAKE NAMES FILE$:S U¢! eͱ *F ^#V#"F U 2K : S:S DP̈́:S M̈́͝:S LU!T ͱ!Y v:S K2K ͱY ͱ:S LD=P@͝:S KP>, a :S /~aF###~{xgya~=#:S /: ʆ͊®>-{ʗ* z>,{Ìî!yv:S /:J <2J >|{> {UMBER SIZE NAME COMMENTS CATALOG.___ CONTENTS~OF~CP/M~VOL.~___ / . 1 000K -CATALOG000NAMES SUBoptions: this great program.  ![ :S K 2K ͱ![ 60#60#60*F ++^#V! F~G!] vB mM *N +|7*F ++^#V#N#F 7#l >*N +"N *F ##"F  }¹ *4~2 #~2 #~2 #~2 #~2 #~2   ~# x :I =_* :S / B/ // L/ :K / *k ~$ > w#"k }1 o P ++WRITE ERROR$!"k >. þ> > þ^#V#N#F #w ! ͉ ~{#~‰ >2R N#F#^q#Vpr+s:S B ! ͉ *m * #2{+|  þ $ Bit map: FMAP by Ward C. Help: 2J *N +"N |¢:S +BB/BLB>F2S :S BB B/B>$2v :S ʨ Bʨ /ʨ Lʨ 2K > 1 o è FILES, K $͓" :S Bz*m |=ҳ: >?{>?{4^#: V#" ͓: : z| p ))))xyO{x* & : |g}o=(: B)==|J} ++ ERROR COMPUTING #K - MORE THAN 255K/EXTENT$O! ~ʛx›!=ʛ)Ñ DM* #DM*F "m T] : 60# x¼: W: _*m )>1| ++ Insufficient room for table+FMAP V2.3 - 12/07/81 FMAP H for help $!9" 1 :]HE:^ ʀ :\2H b<2I :\=_>?2\!mS ~# o:u2 U… ͊ !]~   6?#™>?2h͹<» ++NOT FOUND$:S B  FILENAME TYP EX RC #K EXTENTS...$͹<0*F :  w#w#"F *N #"N *N DM! s#r#{_zW x;*N "P |]}=ʐ2R *P +" "P |ʐ! n ##* +" |s:R ]ͣ! "F :S ʢBʢ/ʢLʢ:S UY:T  ++ "U" OPTION REQUIRES VOLUME NUMBER AS IN "U23" OR "U123"$FMAP fn.ft [option][.suboption] fn.ft: ? and * allowed. Opt Console out? To disk as: Usage: --- -------- -------------- -------- / Y (across) B Y + bit map D Y $1 $2fn.ft $3 for SUBMIT F Y fn.ft UCAT input K fn.ft nnK L Y + seq# + #K M N $1 $2 $3fn.ft SUBMIT MODEM Q N fn.ft P N $1 $2fn.ft$3 SUBMIT PIP Unnn Users group catalog nnn to -CATALOG.nnn Suboptions: .S selects names as listed; .P output to printer; .Unn selects only user nn VOLUME~___ DESCRIPTION: N   art at page : Quit at page : HIGHEST PAGE IS: !9"1!V7!~!~:!#?#~ !\ #~?  :g2o|g"!\ $222*" "<͂# :ʿ Et2 \ d ʂ ʼ> ?:2:<26ҙ> ͧd:<26ҙ> ͊2 K4!3-j#:> t:¼2>^t@t) !A!7xLISTT--File utility program for printers--10/17/82 Irvin M. Hoff Los Altos Hills, CA 94022 "LISTT" is a printer utility program that lists any requested file on your printer. (The CRT also displays what is being printed). The name was selected so it would be easy to type, easy to remember and be illus- trative of its capabilities. Include the name of the file (and its extent) that is to be listed when asking for the program: A>LISTT HELLO.ASM A menu then appears asking several questio> +> w͘>͘!#~ +4+ &!#~ >+n+ K2 !7-K!?-j* *}|!"* {zҺ* ´*"Æ*" !"* * }>*#" 9*r!>A2ɯ22: 8!~ DF>0 t:G:j!-!7!; £Ð ڐw#0ڻ:һxڐ Ð>!<~ +~ 0G> +~10G >  !7âAN  Page  1  1  == No file by that name on this disk == $== No file requested == $== No "*" or "?" please == $ LISTT Pgm v1.0 10/17/82 Do you want tear tabs to use roll paper? (Y/N): Number of spaces to augment left margin (0-99): Ignore FF (Y/N): Heading/date is: Stns: Do you want tear tabs to use roll paper? (Y/N): (1) Number of spaces to augment left margin (0-99): (2) Ignore FF (Y/N): (3) Heading/date is: (4) Start at page : (5) Quit at page : (6) 1) A "Y" gives tear tabs for roll paper. Any other reply (including RET) defaults to fanfold with no tear tabs. 2) Ability to include 0-99 spaces at the left margin for those printers without adjustable margins. A RET de- faults to no spaces (normal left margin). Rejects any non-numeFORMFEED.DOC All that FORMFEED does is output a formfeed character to the LST: port. It is not a bad example of how you can output any characters you want through this port. To look at the code you can: DDT FORMFEED.COM L0100 You will see what just a few instructions will do through CP/M.7!7_Y2!77!7!M L:'w#x}' '!77!7! ʂp]w#x] ]!77!7! ʸ¦Ów#xړ Ó!77: U> ͧ:<26> ͧK!A!t7_Y2K!?"!77  ʿ ~# $~t#-~͘#7~ͧ#A!->-͊:G> ͊[>-t!-2 ʊ ʊ:<2͑ͧ_: {__:   ric characters except RET. 3) Responds to form feeds unless a 'Y' is typed. Outputs an appropriate number of line feeds enabling printers without form feed to paginate correctly. 4) Heading desired (such as current date, etc.) Up to 124 characters may be used. The name of the file plus cur- rent page number near the right margin are both automatic. A RET defaults to file name and page number. 5) Asks for starting page (defaults to page 1). 6) Asks for page to stop at (defaults to end of ol characters imbedded in the text other than CR, LF, form feed or tab. You can thus dis- cover any unknown characters that normally do not print. COMMENT: Line numbers can be added to any ASCII file with PIP.COM and the [N] option: A>PIP HELLO1.ASM=HELLO.ASM[N] Form feeds can be removed with PIP.COM and the [F] option. You can edit CTL-L (form feed char.) into the file to force a new page wherever desired. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * , etc. (Byte at location 0104, via DDT.) f) Can indent up to 99 spaces to effectively provide an ad- justable left margin (many printers do not permit changing the margin). This allows you to easily center any printing. g) Can start on any page desired, saving paper (and time!) if you only wish to reproduce certain portions of a file. h) Can stop at any page desired, allowing the operator to do other things when only part of the file is needed. i) Shows the total number of pages in the file if you!9"1!:] ʝ-l͜++MUST USE DISK NAME WITH '-' AS THE FIRST CHARACTER, AND NNN AS THE FILETYPE$:e~ ]!N̈́.NeN6 #6 #>2\)LOAD DISK TO BE CATALOGED, THEN PRESS D: _Dž!]??????????? N\<8=o&)))))N6.#N6 #6 #:W<2W6"X:W=2WO!ak#S K=Nwy#pd:-)++MISSING '-' NAME ON DISK OR QCAT COMMAND RELOAD CATALOG DISK, PRESS RETURN͜++RUN QCAT, THIS TIME WITHfile). NOTE: There are two options which may be user-set. These are locations 0103 and 0104. They may be set with "DDT", "SID" or by editing and reassembling: 1) PAGCOL--sets the column the Page number starts at. Some printers have 72 columns total, some 80, some 132,etc. (Byte 0103) 2) TTABN--Sets the space between tear tabs for roll paper. Some printers have 72 columns, some 80,some 132, etc. (Byte 0104) Thus you can compensate for various printers and also pri( )  intion- ally (or otherwise) ask for a page number that is too high for the file. j) If a heading/date is longer than normal spacing for the page number, it is automatically moved further along. Up to 124 characters may be used for the heading/date. k) An option on the menu allows you to ignore form feed chars. It automatically paginates without form feeds in the text. l) Works equally well on printers without form feed since it inserts the correct number of line feeds to paginate. m)prints contr NAME OPERAND$)MOUNT CATALOG DISK, PRESS RETURN !]gNAMES SUB N\\<\!z:Y<Ґ\͜++DONE. NOW ISSUE COMMAND: UCAT$͜++WRITE ERROR$͜++CAN'T MAKE NAMES.SUB$> A> A~A#~4#_w#NgNAMES SUB N\\<> A> A *nt any portion of the file you wish. FEATURES: a) Shows on the CRT what is being printed. b) Optional fanfold or roll paper. Adds tear tabs if roll paper is selected. c) Can abort at any time with CTL-C, but finishes the cur- rent line first. d) Can change the location of the Page number for use with printers of 72 columns, 80 columns, 132 columns, etc. (Byte at location 0103, via DDT.) e) Can change the spacing between the tear tabs for use with printers of 72 columns, 80 columns, 132 columns  !9" 1 SuperSUB V1.1 $ :] ʛqh@!e~ U& ;¹!& _~#_!͟2x/†#"u~2w #x~# ʔ †͟ͱÔ~#7 ʟ ʟ+*g*i~s#r#"i~#  "gp7?!"k:x/\<ʹ*k#"k*m*g"ms#r##QK͂K  Cw# "gq"gq:x/b͎z:tn>_<2t!~\>7?:w¬:ک=2> >*u~#"u;¼> ɷ>m  :!"u7?:=ê <:, 2=  ombined on the same input line by sep- erating them with semicolons. Example: A>SUPERSUB /STAT;DIR specifies two commands on the same input line. Submitted jobs may be nested...SUPERSUB does not erase any existing submit job (appends to them instead). To insert a control character into the output, pre- fix it with a "^" (works in any mode). $mmands on the same input line.Submitted jobs may be nested...SUPERSUB does not erase any existing submit job (appends to them instn of a zero-length line in $$$.SUB. 2) SUBMIT jobs may be nested. 3) For small SUBMIT jobs, the command lines may be specified on the SUPERSUB command line, seperated by semicolons. 4) An interactive mode allows command lines to be entered directly into SUPERSUB without need of a text editor. 5) A built-in help function is provided. 6) The output drive and number of allowable parameters may by specified at assembly time. NESTING ------- SUBMIT jobs may be nested und<ʘ*m| ^#V#"m~9*k+"k*m|F^#V#"mN*k+"k( ~#2o"p!"r2Ew#a^‚@ $Ÿ:x/>$ʟ$¥gEüE0OxGðx= Gg~# ‹!o~=7w*p~#"p?!4*rw#"r:o7~? o&)y^#Vz7~##;0:? U |L{0u> u> _a{_3Disk full$3Directory full$3Memory full$3Submit file not found$3Parameter$3Too many parameters:$3Line t SUPERSUB DOCUMENTATION (revised 09/13/81) ---------------------- 09/05/81 by Ron Fowler Westland, Mich SUPERSUB is intended as a replacement program for SUBMIT.COM provided with CP/M by Digital Research Corporation. This document assumes you are familiar with that utility and its use. ------------------ Version 1.1 update: Control-character translation has been added. This facility works similarly to CP/M's SUBMIT, where a desired control character is gen- ead). To insert a contro$$$ SUBer SUPERSUB. For example, suppose you have a submit file to compile a program: BASCOM =$1 L80 $1,$1/N/E PIP B:=$1.COM ERA $1.REL ERA $1.COM named COMPILE.SUB. You may then submit a job to compile several programs using COMPILE.SUB. For example, you can create a file called COMPALL.SUB consisting of: SUPERSUB COMPILE MYPROG SUPERSUB COMPILE RBBS.ASC SUPERSUB COMPILE PRIMES.BAS. This is especially useful when using INTERACTIVE or SUMMARY modes. In combination with Ward Christensen's FMoo long:$3Submit file empty$3Control character$ U *kLn  error on line number: $ *$!g26# xw!y"i!"! "g>2t2 * How to use SUPERSUB: SUPERSUB :print this HELP message SUPERSUB / :go into interactive mode SUPERSUB / :use SUMMARY mode SUPERSUB :as in standard SUBMIT.COM In "/" (interactive) mode, SUPERSUB will prompt you a line at a time for the SUBMIT job input...logical lines may be cerated in the text file by preceeding the character with a circumflex character. For example, control-V is generated from "^V". Thanks to Keith Petersen for pointing out this omission. A bug in line number reporting when errors are encountered has been repaired. Line numbers reported should now correspond to the actual line number in the file. ------------------ SUPERSUB provides the following new capabilities: 1) Null input lines are properly interpreted; they cause the creatio!  AP program (CPMUG), some very powerful command structures may be built. SUMMARY MODE ------------ Summary mode allows the entire SUBMIT job to be specified in the CP/M command line. This mode is enabled by using the slash ("/") character as the first character of the command line. The indiv- idual submit lines must be seperated with a semicolon. For example, A>SUPERSUB / CRCK *.* F;CRCK B:*.* F;COMPARE CRCKFILE.CRC B: ^ | ----> (this space is optional) will create a file tation of the CP/M Console Command Processor. 2) If you change the drive specification for the output file, you may want to do the same thing with XSUB (Digital Research's function nine extender). Within XSUB, find the submit File Control Block (search for "$$$ SUB" within XSUB.COM) and change the first FCB byte (ie, the byte before the first "$") to: 0 - use default drive 1 - use drive A: 2 - use drive B: etc. 3) In SUMMARY and INTERACTIVE modes, passed paramete5 !#!]/!͗DEL: $!]R!͗iADD: $!]!ͩ6.#ͩ6,! ?ʠʠ~ ʡ) “~#ƒi: ʲ. w#©26 #6#>2!6,#6.#:R4 ,J.J JRw#426 #J6#R2!t~ h>0 >   ~ ʰ_# > _> _w##>*}">of CRC's of all files on A:, then create a similar file on B:, then compare the two. (CRCK, by Keith Petersen, and COMPARE, by Ward Christensen, are available from the CP/M Users Group). INTERACTIVE MODE ---------------- You may enter the interactive entry mode by typing "SUPERSUB /" (ie, "SUPERSUB /" with no arguments). Supersub will prompt for input with an asterisk, and you may then enter SUBMIT lines from the keyboard. You may enter more than one logical line on a physical line using "11MAST CAT0464F522049474E4F524 E4á*-*/}|ڊ!"/*-{z|*+ v*/"/H*/"-!"/*+*-}>*/#"/ɯ22*!"-"/ < Å NO MASTIN FILE$NAMES SUB :1004E70007B7CAF304"s**}|\!"*{zN*H*"*"!"**}>*#"ɯ22!""<ª Å NO NAMES FILE$NEW CAT Å NO M,N Y**}|I!"*{z;*rs have no meaning. When these modes are used, the parameter flag, "$", will be passed through literally to the output file. 4) Zero-length output lines may be created in SUMMARY and INTERACTIVE modes by using two consecutive semicolons. This is, in effect, a blank logical line. 5) Interactive mode may be aborted by typing control-C as the first character of a line. Also, all normal CP/M editing characters are available. <( ( CANNOT CLOSE MASTOUT$O w# @! ;! ;MAST.CAT HAS ENTRIES.$ z> >   ~ ʰ_# > XXXXXXXX.YYY, . XXXXXXXX.YYY,XXXXXXXX.YYYXXXXXXXX.YYY,XXXXXXXX.YYY$$$ .SUB)semicolon seperation. An empty line terminates the input. Example: A>SUPERSUB / *CRCK *.* F *CRCK B:*.* F *COMPARE CRCKFILE.CRC B: * A>CRCK *.* F has the same effect as the above SUMMARY mode example. HELP FUNCTION ------------- Typing SUPERSUB with no arguments will print the built-in help file. NOTES ----- 1) Nested SUBMIT runs are only usable up to a maximum of 128 nested commands at any one time. This is a limi*" &Å DISK FULL: MASTOUT$!"**#"ɯ22!"!"<£ Å NO DIR SPACE: MASTOUT$MAST BAK CAT Åi !:-++NO '-NAME' IN DIRECTORY$!!4h(h!4ʉw#) x'++TOO MANY IGNORE NAMES FOR TABLE$++NO IGNORE NAMES IN MAST.CAT$++EOF READING FOR IGNORE NAMES. MAY BE MISSING ) AFTER LAST NAME.$4ʉ i::!X"  Proper credit to original PROGRAM author History of UNERA Info on UNERA Command Format Version info on this help file :Proper credit Proper credit is given to the original author, who by writing this software will save many adult computer hobbyists from crying Original author: Gene Cotton Original publication: Interface Age, December 1981 All I did was type in the ASM file from the magazine, assemble it to insure that it ran, and then disseminate the ASM & HLP files to RCP/M sysng the file to be un-erased, or the software assumes drive A, not the logged in drive ! :Version info UNERA.HLP Help file version 1.1 As of 11/18/81 Henry B. Rothberg ! The UNERA.ASM program is written to run on an 8080, 8085 or Z80 (registered tmark of you know who) microprocessor. To use UNERA, look over the source file and change it for CP/M 2.2 or 1.4 as required. Check the disk translate table to be sure it is correct for your disk system. Change if necessary. Assemble UNERA Load ERA Then TRY it on a scratch disk ! :Command format In order to use UNERA you MUST know the name of the file(s) to reclaim/ restore/un-erase. A>UNER:UGWW~#"W*X*V*cDM*^DM!5  ~#͈.͈  ~ ʚ_#ˆ:m_P5W |g}o}o|g*-*DM:]G*͎ :UGWW~#"W/5 n     tems accross the US of A. Oh yes, I wrote this HLP file also. I take credit for typing in this HLP file in the format established previously by another. This help file is excerpted from the original printed article accompaning the UNERA.ASM program listing Henry B. Rothbrg - Woodbridge, Ct 11/18/81 :History of UNERA For the last few years I've been looking for a 'restore' or 'unera' type program to forgive my errors. I found it in the December '81 issue of Interface Age. e Unerase Version 1.9 (11/13/83) for CP/M $1.4 $2.2 $File(s) Recovered -- DOUBLE CHECK before using $ ABORT -- Program has not been verified for CP/M+ $ ABORT -- Program has not been verified for MP/M $ ABORT -- Error during disk Read $ ABORT -- Error during disk Write $ ABORT -- Illegal drive requested $ ABORT -- No file name specified UNERAse syntax: UNERA19 [d:]filename.type [P] Items in brackets are optional. Filename and type may be ambiguous. P requests a pause foA D:FILENAME.EXT Will bring back into existance the file D:FILENAME.EXT that you erased in error. For limitations on files that may be un-erased, see the writen article in IA, 12/81 page 98. You may have problems un-erasing a file if you have created new files since you erased it. The CP/M operating system may have re-used the disk space where your erased file is/was. Test the un-erased file to insure that UNERA worked properly. You must give the disk drive when specifi If you don't subscribe, you should ! :Info The following is excerpted from the IA article The safest and most reliable method of guarding a disk file is to have a back up copy. Often in the fever of creation we forget. Sometimes we even go to 'clean-up' our work disk, and in error type A>ERA *.BAS When what we meant was: A>ERA *.BAK So now we're in big trouble, we've just erased the last four hours, or days, of work. What to do ? To the rescue, comes UNERA r disk change before execution. $ File NOT found $ Change disk and type RETURN $01 Pw:a_:`#:Wɯ2b!~¸¸ w>2b2` —:b*cDM*^DM$*X#"X*^#*\"^*c#"c"Z#] &# *Z\3~? |¾}0ҵ 4^>*2U.W͠ :\_:\O|^#V"-^#V+"\^#V#"V!~#fo"ckWWWW:\2a<=2\:]!BW*#  UNERA19.DOC - 11/20/82 RECOVERING ERASED CP/M FILES This program appeared in INTERFACE AGE for December 1981 (pg.96) and was written by Gene Cotton. When a file is erased, all that happens is an E5 byte is placed at the start of that file name in the disk directory area. This releases the sectors used by that file for future use. If you notice you erased the wrong file, you can immediately recover it by using this program: A)UNERA HELLO.ASM (name kill a file, want to revive it, and the pro- gram puts it in user area 0 instead -- meaning you have to run another program to move it back to 8. 2) "Short messages" are now implemented. If you don't like L--O--N--G warning messages, (i.e., you are an experienced hacker), then set this option TRUE. Additions by: Paul S. Traina Saratoga, CA 95070 rase files rather than the ERA command will minimize accidently erasing incor- rect files -- those programs show the name of the file to be erased and asks if you want to then erase that file? (They work with wild cards). COMMENT2: Files may also be recovered using programs such as DU, DUU, DUUP, DU-V79, etc. Those require some talent to use and do not compare with UNERA for simplicity. They are very power- ful multi-UNSPOOL Ver 3.3/T/P$ i!~ W!&xA ~#4&bxe {X~#o}oaG33o:‹*‹#w#w# z*"!9~#fo"t*"X* "dm !wm!w>2m!w:2m!w m!w:\<2\\*I#"Iɯ202D!"G"I$<  NO COM FILE$!\ %y!9"HEX~# !\$ .æ*!*#}|ږ!"#*!{z҈*k*#"#= w DISK FULL: HEX$!"#**##"#ɯ2 2!"!!"#<  NO DIR SPACE: HEX$!"+>:2->ͫpurpose disk-handling utilties. Notes by: Irvin M. Hoff Los Altos Hills, CA 94022 ------------------------------------------------------------------------ UNERAse version 1.4 adds some "cosmetic" features and also a couple of nice additions to previous versions. 1) If you erase a file then run UNERA, it now restores the file to the current user area and not user area 0. This is handy when you are in user area 8, yC M:İWW":>İq W Invalid operation attempted under UNSPOOL. Program aborted.$2!91W2«:-:!>)2:!5> Š2!~ڧ F75G A6G G4:ʉ n ]Ê:< Ê:G>B22=2> Ê_:_WW:_W2#W W2:_ WW*W:_ W7: W1red intact, or sections may have been overwritten. In that case, examine it carefully, and with luck it will again be a normal file. In any case portions can likely be recovered. This program does not support "wild cards" such as ? or *. It automatically adjusts for current CP/M 2.2 or for older CP/M 1.4. It can be used with Micropolis drives but in that case you need to edit one byte at the start of the program and reassemble. COMMENT1: Using ERAA.COM or ERAQ.COM with which to e*+ͦ>ͫ/ͫ*+#"+ :-/<ͫ>ͫ/:-/<ͫ!͜*#}U"!>(I<‰ vÉ CANNOT CLOSE HEX$*:0000000000 ~#Ü|ͫ}!-wͽ 0(> > N$  :( W ny WW1:H W*!" Wv W!3"!"!2"!" Unspooling in progress.$ UNSPOOL Completed.$ Do you want to cancel UNSPOOL? {Y|N} ?>$ UNSPOOL Cancelled.$W1:( W!Z" !f"+2 $HD @I$$HI"AB@""I$ H$" !A$$II$m Feed characters into the output. This is useful for UNSPOOLing source files, which normally contain no Form Feeds. LST is normally used for .PRN files, or other types which have Form Feeds Revised 82-01-06 Page 1 of 6 already included. If not specified, LST is assumed. OFF If OFF is specified instead of a device name, the  UNSPOOL [d:]filename.ext [dev] or UNSPOOL dummy OFF [square brackets denote optional parameters] Where d: is an optional drive spec such as A: or B:. If not entered, the current default drive is assumed. filename.ext is the name of the CP.M file to be printed/punched. dev is the symbolic name of the output device to be used. Note that the colon (:) age by the operator. UNSPOOL B:ZINGER.HEX PUN will send the file ZINGER.HEX from the B drive to the current PUN: device. Note that the device is "PUN" not "PUN:". UNSPOOL . OFF UNSPOOL *.* OFF UNSPOOL OFF OFF all cause an operator prompt: "Do you want to cancel UNSPOOL?" A single "Y" or "N" (Yes or No) is accepted from the console as a response. Any other character is assumed to mean "No". UNSPOOL OFF causes the file "OFF. " to be sent to the list device. operator will be offered the option of cancelling UNSPOOL if it is already running. dummy Because the word OFF is the second parameter, a filespec is still needed. A dummy name of "." will suffice as a place holder. EXAMPLES: UNSPOOL TEST.PRN will send the file TEST.PRN from the current default drive to the current LST: device. UNSPOOL A:TEST.PRN LST is exactly equivalent to the  usually present in device names is NOT entered. Valid devices are LST and PUN, which refer to the physical devices assigned to the logical LST: and PUN: devices at the time UNSPOOL is started, as well as PAG, a special name recognized by unspool. PAG refers to the same physical device as LST, but supplies automatic paging of output by inserting For Revised 82-01-06 Page 2 of 6 OPERATION: Upon loading, the program checks to see that the the BIOS vector table pointed to by the word at location 0001H is valid, i.e. is a table of JMP instructions containing at least 16 entries. If an error is detected, the program will display an error message on the console and attempt to warm-boot CP/M. If found, the BIOS vector table is copied into the program segment which will remain active duri Documentation for UNSPOOL Version 3.2 for CP/M 2.0 and up. AUTHOR: Gary P. Novosielski Rutherford, NJ (201) 935-4087 Evenings and weekends. INTRODUCTION: UNSPOOL is a program to send a standard CP/M file such as a .PRN or .ASM file to the system's list or punch device, while still allowing nearly all other system operations to take place. The file is transferred during periods when console is waiting for input. SYNTAX: above, assuming drive A is the default drive. Note that the device name has no trailing colon. UNSPOOL B:TEST.ASM PAG will send the file TEST.ASM from drive B: to the current LST: device, regardless of which drive is currently the default. Form Feeds will be inserted whenever the page length would exceed 56 lines. If any Form Feeds are contained in TEST.ASM, they will also start a new page. The program assumes that the paper has been positioned to top-of-form for the first p%  ng unspooling so that subsequent application programs running concurrently with UNSPOOL will still have access to the BIOS. This table is modified to trap attempts to warm boot the system, perform direct console input, or perform direct disk sector writes. Direct sector writes are not permitted (see notes) under UNSPOOL. Warmboot requests and direct console input are handled as described below. The address of the old BIOS vector table, the BDOS entry address, and the CCP retuhese requests and checks to see if the console is idle. If it is, characters are transferred from the input file to the output device until the console becomes ready, i.e. a key is actually pressed. At that time the BDOS function or BIOS call is executed normally, and control returns to the application program. If a jump to BOOT is attempted, this is also intercepted by the UNSPOOL supervisor segment. The message "Unspooling in progress" is displayed on the console, and no actapplication programs will, however, use the new values of the user number and the new physical device assignments. If no errors were detected, the active program segment which monitors all calls to BDOS is relocated into high memory just below the CCP. This reduces the available user program area by 3 K: 4 pages for the UNSPOOL supervisor segment, and 8 pages for the CCP which is commonly overwritten by user program buffers. The BOOT and BDOS jumps in low memory are mod, the spool writer becomes inactive, and passes on previously intercepted requests immediately, without checking console status. The sole exception to this is that direct BIOS writes are still not permitted until the next warmboot. When the next warm-boot request is detected, the supervisor removes itself from memory by executing a true warm-boot, and informs the operator with the message "UNSPOOL completed.". Revised 82-01-06 Page 4 of 6 NOTErn address (from the top of the stack on entry) are saved in memory. The "dev" parameter from the command line is checked. If not valid, an error message is typed and control returns to the CCP. If the "dev" parameter is the literal OFF, the program executes a BDOS funcion 0 (System Reset) and terminates. The file named in the command line is opened for input. If not present, the command is echoed to the console followed by a "?" and control returns to CCP. ual boot takes place. Control is returned to the protected copy of the CCP instead. Before returning, a disk reset is performed and the default DMA address is reset to 0080H to simulate a true warm-boot as closely as possible. If warmboot is attempted using BDOS function 0, the program will prompt the operator with the option to cancel. If the response is "Y", warmboot is performed using BDOS function 0 as requested. Otherwise the request is handled as with normal warmboot, above.ified to protect the CCP and UNSPOOL Revised 82-01-06 Page 3 of 6 supervisor segment. Control is then returned to the console. Normal CP/M operation will then be possible. Characters will be sent from the input file to the output device whenever the console is idle. Whenever an application program or the CCP requests console input using BDOS functions 1 or 10, or a direct call into the jump table at A(BOOT + 1) + 6, the supervisor segment intercepts tS: While UNSPOOL makes every effort to restore the values of the DMA address, USER number, IOBYTE, and default disk drive before returning control to the program, a hardware reset may leave these values in an undetermined state if unspooling was actually taking place at the time. When function 10, Read Console Buffer is used, UNSPOOL will transfer characters only until the first key is pressed. At that time, no characters will be transferred until the input line is coIf the drive is not explicit, the current default drive number is recorded internally in case the default drive is changed while UNSPOOL is active. The current user number and IOBYTE values are checked and stored internally so that if the user number is changed, UNSPOOL will still be able to read the input file. If the device is changed (using STAT LST:=TTY: for example) unspool will continue to use the physical device in effect at the time the program was initiated. Any  If a direct BIOS call to write a sector to disk is attempted, UNSPOOL will display the message "Invalid operation attempted under UNSPOOL. Program aborted." The application program will be terminated, but UNSPOOL will continue to run. (See Notes.) This restriction applies only to direct BIOS writes. All normal file-oriented (BDOS) reads and writes are fully supported under UNSPOOL. When the input file is completely transferred, or a 1AH end-of-file character is detected&  mpleted by pressing a carriage return. UNSPOOL requires that the List Status function in the BIOS was properly implemented at system installation time. UNSPOOL will not send characters to the LST or PAG devices unless it recieves a ready condition from the List Status routine. If the PUN device is used, no status check is provided for by CP/M, so a not-ready condition on the punch may cause the system to hang up if PUN was specified on the command line. See the CP/M Alterating that console input is not allowed to intervene between disk addressing and disk I/O, it is not in the author's power to rewrite all existing applications software. This better-safe-than-sorry trap was therefore included. Note that direct reads are NOT trapped, since they do not have the same potential for disaster, but still may be unreliable for the same reasons. It is therefore recommended that software using direct disk I/O not be run under UNSPOOL. Normal CP/M file-orienteare, for example DU.COM, uses direct BIOS writes in a manner which could cause a major system crash if allowed under UNSPOOL. The problem arises when a program calls the BIOS directly (it is actually calling UNSPOOL's copy of the BIOS table) to select the drive, set the track and sector, and perform direct disk I/O without going through the normal CP/M file handling system. This causes no problem if the selecting, addressing, and I/O are all done together, but if a console input is  if backspace characters are ignored by the printer. All other control codes except carriage return are assumed to be non- printing, and are ignored by the algorithm. If tab expansion is included, the version number in the signon message will be followed by "/T". The default page size used by the PAG device is set at 56 in the distribution version. This value may be changed by altering the value of the assembly-time variable LPP (lines per page). Gary Novosielski ion Guide for a discussion of the BIOS List Status routine. Although the console is polled frequently during the unspooling of the file, some of the diskette operations may take a second or two to complete, for example when a new extent is opened. Since the console is not polled during this period, high speed typing may cause one or more characters to be lost. This effect will vary depending upon the program being run, the types of input reqests (character or line) it uses, and d (BDOS) reads and writes always re-select and re-address the disk before reading or writing a sector, so no similar problem exists in the vast majority of software which uses the normal CP/M file handling system. INSTALLATION: The source file is written for assembly with the MAC assembler. The .HEX file produced is LOADed to a .COM file and executed just as any normal program. Relocation is done at execution time as described above. If the assembly option EXPAND is set to done between the time the disk address is set and the call to read or write a sector, the disk address may no longer be valid. This could cause the sector to be written to the wrong disk address, or even over the directory. Revised 82-01-06 Page 5 of 6 This is true because a request for console input is taken by UNSPOOL as an opportunity to perform its own functions, which themselves include disk I/O. Although this problem could be eliminated by insur Revised 82-01-06 Page 6 of 6 -time variable LPP (lines per page). Gary Novosielski the relative locations on disk of the spool file and any files in use by the program. As a result, heads-down typing is not reccommended while UNSPOOL is running. Some experience with UNSPOOL will teach the user when caution is required. Although it would be possible to perform direct BIOS writes while unspool is active, (indeed this was permitted in earlier versions) this action is now trapped and prohibited. The reason this was deemed necessary is that some existing softw TRUE, tab characters in the input file will be expanded to spaces with assumed tab stops at every eighth print position. This option should be set to FALSE if the printer driver or the printer itself can properly handle the tab character. If the option PHYSBS is set to TRUE, a backspace character will cause the tab expansion algorithm to recognize backspace characters and decrement the column count when a backspace is encountered in the input file. This option should be set to FALSE'