IMD 1.16: 29/05/2007 12:06:41 FOGCPM.015 --FOGCPM015SD129 COM)SD129 NOT SD DOC= SD129 HIScSD-RCPM INF !"SD129 AQM#$%&'()*+,-./012SD129 AQM3456789:;<=>?@ABSD129 AQMCDEFGHIJKLMNOPQRSD129 AQMbSTUVWXYZ[\]^_-01-08 88 -CPM015 DOCSFILE32 COM`abcSFILE DOCdefgSFILE32 HIS9hijklmnoSFILE32 ASMpqrstuvwxyz{|}~SFILE32 ASMSFILE32 ASMSFILE32 ASMThis is the disk name. !fAPFKyT!I6mCY1e30e8a,$ 2sN#0RBf4fPNS}i/5pzgl!X=Ut'3IySJj)B3TFsNr&C@LԵ X11E'JQ7 `-)~E`S&UM9ٴqf,1c$g(2tD ReF1P3#467UL 6"&sRzU- mm%g0 gQ98=g8wmAΉj\a Q7CO;a)-a(Q^&{Ai2w!F#v~[&$/ +~# v ']'!u# J<6' d j !~k #_>? Ò :yŒͩ :Œ>2\:w¡:{ʡ22:x>k¬>r2::v½/2v: \ E:\=; _! ~G2!; x !]~$ / [   6?# >?2h͎ !\^\ L##~2#~2##^#V"#^#Vk*.;^#~2#~2#^"Ú":0ښ:\=_.\ !~w+ˆ ‚**#ڰW+}z«çi`:)="*#)~""*{zҽ :_ \ >?!hw#w#w!"""͎ \\ <=! o:A#~+:~P~\:\~} o:#* w#no&o|go|gr#s#"*#"! *{z; Memory){ *}2*!~ s#r# +}*"+}l*|g}ol}o"#"*{ozg"*" W** **{ozgWW%**#{z*:z!5\ <¡\ <; Open; Write\ <ʐ:!4\ <ª5\ :=2\ ; Append!~#!5!5\ <:=22":4>2:4: *"!""!~"":v*͗*""*+"|ʌ:v *> Œ##"d*^#V#":v¶* " B >.  *"*#":x*:v|}*|d?: *| d dV#^":_zW/_zW{_3ɯ2:2m2mmm>0 0yox0‘:>0 : 2 T])))ͭ *~ >.  V#^?: *+"| 7:v:|*|2*|2:v:2  :\@ KͿ : A :K ? *? ͖ :vy/_*  y22o&͗"*>w#›!4 *͟*͟*͟*͟* "*|!5¥:|*|:w :{  :!4:w!~6T !~6L @ *6#=9 \ ˜\ !~6’ !z5 n :\@ ڀ Ϳ  ͖ :v 4:y© >!\4ک :P  \  \ P : 2/ Gy x0 > > >: > ͬ G :z3 *:* { \ ˜!>p#"=2x_:\ { ¨ :}ʨ :ʨ :zʨ :<2.ڨ P  ʋ ʋ ʋ ڛ ʜ _Cʋ Kʋ Xʋ 2X ɷ Aھ [Ҿ _  ~ #   *. [  N _ S R _B B B N R CB KB XN 1 g A G:0xw w | x :_ \ Ñ \  *? :v  ð ^#V#N#F_ #  |) ) Nq#Nq|) ) N#FYPN#fi :-  - - ####- >2z c :yg >!\4g :v  \ \ :0ڋ -\ Ò :y̩ :_\ :_ \ *|:0ڹ -\ *#^#V. r>FNpq#= : 1|P >22$կ ~#: ,e !e ~ A# A <2#~:f ?; 2#~:f  G~#:Y 0  OxG= x  2f ~:m #~,x !Ґ  >?} :G:O>ͪ ~.¤ #ͪ à à *¼ >?þ #ª # >  ~ ! =_.:;,<>ɾa{ !~"2*+"|_ *> _##" *|2:.  ? *? >2*^#V#"!͎ʂj$2:. :š :\@ Ϳ >:  >.  ?4 :\ B6#8\ \ { !~M:~K!8:!R /*|/ \ :_ \ \  > ##R^#~#^#Vz"*#">2!ä*}!+"8\ { !~ʹ: ¤Å !> >: # >.  ##^#V*":x!{_j)))))?: *#":=2©>2 é~#Bɯ=2*#">2##!x#x! 6 #†6#!~#.ʯž~.»#~#»!^#V#N{z_yW"!͹!~*!րwz $\ * +" !W! 4\:<>2o&~WO=28\ { !pŠ# sCʊK!m¤# —Ͱ Ò Available Options (start with a $ or / or [ character): A - all user areas P - printer output C - file sizes in records Q - show non $ARChived files D - all drives R - reset disk system F - file output (DISK.DIR) S - include $SYS files H - Current area to highest T - order files by EXT type L - list LBR/ARC/ARK members V - show version number N - no page pause [more] X - aux. format (horiz/vert) O - show $SYS files only Example - to list all drives and user areas, no pauses: B0>SD $AND ++ ABORTED ++ Drive/User[more] $ $ Error ->>> No detectable file(s) on : Drive /k Files: Free: k There are member files in library(s) and/or archive(s) Archive directory for Library directory for k ++ Not a library file ++ ++ Not an archive file ++ LBRAR eds CP/M 2.0 or Newer to RUNuuisplay, if available, to show the attribute characters $SYS, $R/O and $ARC. ULINE - selects underlining to be used to display the status line of the directory. SHOPUB - allows directory display of ZRDOS Public user areas. WHLPUB - makes SHOPUB wheel oriented. - Notes by Irv Hoff and others  The .COM file included in this library is assembled for a normal CP/M system with two drives, no ZCPR-anything and no wheel byte needed. It shows any archive bits set by disk back-up systems. al one. ; ; *Added new fence characters for horizontal alphabeti- ; zation, and for library member listings. These may be ; patched into the .COM file for easy customization (as ; can VLIST, by the way). The library fence was added ; because library members are never sorted, and it was ; felt that some way of indicating the ordering was ; desirable. ; ; *Found and fixed several "minor" bugs which had to do ; with combinations of options selected by conditionals. ; ULINE could not be used without the REVID option on. ; If PGPAWS were off, option characters were skewed, etc. ; ; *Cleaned up the option character processing to make it ; more consistent and easier SD129.DOC Documentary help guide 06 Jan 88 Super Directory program ----------------------- INTRODUCTION: ------------ This is a help guide to operate the CP/M-80 Super Directory program. It is often renamed to "DIR.COM" on RCP/M systems or on systems running CCP replacements that allow an external directory program. It is one of the most useful and one of the most versatile programs available for CP/M-80 computers. It can direct its output the the CRT, to a printer or to a disk file for later reference. It can alphabetize a directory either vertically or horizontally (selected when assembling the program but can be changed to the other mode at any time for the current display.) It shows how many files have been used on the current drive/user area, how much space this has taken and how much space remains. Those and other useful features are mentioned below. Spend at least a few moments looking at the quick-reference option list as you may find some things are now available that would be very beneficial when using your computer. To get a HELP Summary of Options: B0>SD ? Example of Option Usage: B0>SD $ANDLV (...etc.) (The "$" denotes start of commands but "/" or "[" may also be used.) QUICK SUMMARY OF OPTIONS: ------------------------- A - all user areas allowed, (0-15), some systems (0-31) C - shows file sizes in records, rather than 'k' D - all drives starting with first available (usually A:) F - file "DISK.DIR" created/appended with contents of output H - shows all user areas from here to highest L - LBR/ARC/ARK list option (shows names of member files) N - defeats the page pause, permits non-stop display O - shows only $SYS files in directory P - copies output to printer Q - shows files that have NOT yet been archived R - resets disk, if not already logged in S - include any $SYS files T - sorts files by type (extent) V - shows version number and date X - uses alternate listing format (horizontal/vertical) COMMENTS: --------- Using the $D option automatically starts on the first available drive (usually A:) drive regardless of what drive you were on when you started. It then checks all available drives. Similarly, using the $A option will always start with User 0 and individually display each available user area. If desired you can include a specified drive/user area on the command line. Any of the following can be used: EXAMPLES OF USE: --------------- 1) B0>SD 2) B0>SD *.* 3) B0>SD *.COM 4) B0>SD C4: 5) B0>SD C4: *.COM 6) B0>SD $AND 7) B0>SD *.COM $AND 8) B0>SD *.COM /AND 9) B0>SD *.COM[AND 1) Normal use to show all files on the current drive/user area 2) Same as 1), shows all files on the current drive/user area 3) All files with .COM extent on current drive/user area 4) All files on C4: drive/user area, seldom used but possible 5) All .COM files on C4: (normally you would go to C4: first) 6) Shows all files on all drives and all user areas, no pauses (very useful for making a remote listing of all files) 7) All .COM files on all drives and all user areas, no pauses 8) Can use '/' UNIX-type command rather than '$' if you prefer 9) Can use CP/M+ type command, note no space is permitted here OPTIONAL COMMANDS: ---------------- "A" - All users: Causes SD to display the directories of all the user areas starting at user 0 and continuing to the maximum available. Most systems have 16 user areas, 0-15 but CP/M+ etc. can have 32 user areas 0-31. "C" - Shows file sizes in records: Gives individual cile sizes in records instead of "k". Sizes are followed by "r" instead of the normal "k" to indicate this option in effect. Totals and library summary lines are still reported in "k". Very nice on larger disk systems where 16k might be anything from 97-128 records. "D" - All disk option: Allows SD to search all disk drives on-line. It starts with the disk drive specified or implied with the command line filename. Example: B0>SD $D Shows all drives starting with A: B0>SD C:$D SHows all drives starting with C: "F" - File option: The directory output will be sent to a disk file named "DISK.DIR" on the default drive. If this name already is present on that drive, then the directory output will be appended to the end of the file. "DISK.DIR" will otherwise start as a new file. The append feature allows you to build up one massive file on the default drive that contains the directories of all of your disks, without having to concatenate a swarm of individual files. "H" - From here option: Displays files on all user areas from current to highest allowed (usually area 15 unless on a RCPM system.) It it handy to use on systems that have MANY files on user 0 area, to see what remains on the other user areas. If on B5: for example, using $H would show all the files (if any) from B5: through B15: if permitted to go that high. (The $A option is ignored, if included, otherwise the $H option would not be requested.) "L" - LBR list option: Allows for listing of ".LBR", ".ARC", or ".ARK" file members which are shown followed by their length in 'k' (or 'r', if the 'C' option is used). The total length of the entire library is is also shown. These are always alphabetized hori- zontally and may have a little border (assembler option) at the left, showing it is a library listing. "N" - No page option: Shows the display without stopping each when the screen is full. Particularly useful for remote users on an RCPM so they can display the entire director non-stop for disk copy, etc. by using $AND, etc. "O" - Shows only $SYS files: Very useful on large system where it is harder to notice an occasional $SYS file. "P" - Copy output to printer: Highlighting characters are not sent (for files that are archived or set as $SYS files) and the "N" option is automatically selected to prevent [more] pauses. To insure the file names are similar in appearance, only upper-case characters are sent to the printer. "Q" - Shows unarchived files: Show the files that do NOT have the archive flag in a file's directory entry, set. This will show new files that have been recently added to the disk. For example, to see a list of ALL new files in ALL user areas of ALL drives: B0>SD $ADQ To see the new files in just the area that you are currently logged into, enter: B0>SD $Q (Note: This is worthless on systems that do not use any archive backup system.) "R" - Reset disk system: A disk system reset is done before directory information is accumulated. Useful to show the correct free space remaining when a new diskette has been inserted, etc. (Without a reset, it will show the remaining space for whatever disk was last logged in.) Not useful and a waste of time on a hard drive. "S" - Include $SYS files:  Files with the $SYS attribute set are normally not displayed. This option includes them. Also see the "O" which displays ONLY the $SYS files. "T" - Order files by type: Alphabetizes files by type (extension). This groups files of the same type together. Such as .ASM, COM, LBR.) "V" - SD Version number, suffix, and date is displayed. "X" - Use alternate listing format - If vertical alphabetization is in effect normally, using this option will cause a horizontal listing to be shown. If horizontal is the default, then this option produces a vertical listing. - Notes by Irv Hoff and others h NEATL to make source ; code upper case, comments lower case. (It's much easier to ; work with) Cleaned up heading. Made both CTL-C and CTL-X ; work for abort. (FILE uses CTL-X) ; - Ed Svoboda ;======================================================================= ; 06/19/84 Original program coding. - Gary Shaffstall ; v12 SYSOP Lakewood RCPM ;SD History This file contains the history of modifications originally found within the SD1xx.LBR, but which has been separated to keep the source file to a reasonable state. Please place future modification notes here. ;----------------------------------------------------------------------- ; 01/06/88 When Mr. Reid (SD125ARC) added routines from SD118ARK, he ; v129 did not incorporate all of the changes. Those were all re- ; replaced in version 128 with the exception of several 'ARK' ; characters in the help guide, specifically the 'L' option. ; I also want to point out that Mr. Reid gives credit for the ; "ARC and ARK" changes in SD118ARK to a Mr. Shaffstall. This ; is incorrect. Mr. Shaffstall made the ".ARC" changes in ; SD117ARC. I modified SD117ARC to also display the members ; of an ".ARK" file as used for CP/M files. This was released ; as version SD118ARK. ;  - Neil E. Filby Chula Vista, CA ; (619) 422-6842 ; ;----------------------------------------------------------------------- ; 01/01/88 Modified the exit return to reset the original drive / user ; v128 area. Suggested by Bill Duerr who confirmed that some com- ; puters were jumping to area 17 if the requested area wasn't ; available. Checking previous versions indicates this prob- ; has been around since prior to SD95, at least. Changed the ; location of the USELCW equate to follow the USELC equate as ; these are directly associated. Added a WMBOOT equate which ; does a warm reboot upon exit if the above solution does not ; work properly on your system. Try it first with WMBOOT set ; no, and then say something like: B0>DIR H14:*.* and if ; it returns to B0> after indicating H14: is not available to ; the user, just leave WMBOOT set NO. If it says B17: change ; it to YES. Added ZRDOS named directory routines which were ; in SD124 but not SD125 and later. Supplied by Jim Lindholm. ; - Irv Hoff PRACSA Sysop RCPM ; ;----------------------------------------------------------------------- ; 12/11/87 Added SD123A corrections which were not included in v124 or ; v127 later versions. Added needed blanks after [more] to erase ; it properly when doing ASCII copy to disk with remote modem ; programs. Segregated the ZCPR3 options to allow easier se- ; lection. - Irv Hoff PRACSA Sysop RCPM ; ;----------------------------------------------------------------------- ; 12/08/87 Allows date to be displayed correctly if EDATE=YES. Allows ; v126 search of files with a one character filename (you have to ; specify "?." or "?.ext", "?" displays help screen. Program ; now assembles correctly with ASM. Options are set up for ; "normal" user (no ZCPR, no RCP/M). Updated documentation ; and history files and put back in the distribution library. ;  - Bill Duerr ; ;----------------------------------------------------------------------- ; 12/02/87 Added routines from SD118ARK to list ARC/ARK files with the ; v125ARC $L option - routines by G.B Shaffstall of Lakewood RCPM. ; - Ken Reid ; ;----------------------------------------------------------------------- ; 08/23/87 o Added dynamic identification of Named Directories for ; v124 ZCPR3/33 users. Controlled by the NDIRS equate, the pro- ; gram optionally becomes a Z-system utility of sorts. The ; environment descriptor address is patched by ZCPR33 on ; startup; ZCPR30 users should patch the address at Z3ENV; ; and the address of the resident named directory buffer ; located from this. The NDR is scanned for each user area ; and if a match is found, the name is printed after the ; DU form on the information line. ; o It has always been an annoyance to me that under ZRDOS ; in order to get a directory of any area declared Public ; I had to first clear the Public flag, view the directory ; and then restore the flag. ; The equates SHOPUB and WHLPUB when enabled solve the ; problem by clearing the flag on startup of SD and res- ; toring them to their initial state on exit. SHOPUB wnab- ; les the function and WHLPUB restricts the function. ; The only drawback is that in order to make this work I ; had to "hardwire" the "R" option (Reset drives) making ; its use redundant with the SHOPUB equate enabled. ; Perhaps someone can find a better method, my resources ; are limited and my patience is thin. ; Without SHOPUB the "R" option will function normally. ; - Greg C. Miner ; Port Williams, Nova Scotia ; (902) 542-5284 - RCPM ; (902) 542-7259 - voice ; ;----------------------------------------------------------------------- ; 07/17/87 o After SD122 was released Paul Foote noticed the '[' used ;  v123 by CP/M+ systems (rather than '$') did not work properly ; as it had in SD116 where it was introduced together with ; the '/' UNIX/ZCPR3 separator. SD117, SD118B and SD120 ; had neither '/' nor '['. SD121 had '/' but not '['. All ; fixed now. (I never did find SD119, don't think there ; was one as Larry Clive had originally skipped from SD115 ; directly to SD120 and SD117 and SD118 were not based on ; the same SD116, sigh... (Hopefully SD123 will bring the ; program back to some sense of normalcy once again.) ; o Hopefully fixed the bug reported by Bill Wempren and by ; Dave Hardy where they were being sent to User 17 when an ; error on the command line was detected. The fix works ok ; for Dave Hardy now, leaving him on the same user area he ; was originally on. This bug apparently had existed for ; some time, preventing them from using recent versions. ; o Made a small change in the header file that retains the ; same spacing for all user areas: ; ; Drive B0 Files: 78/3124k Free: 2334k ; Drive B15 Files: 16/1227k Free: 2334k ; ; Admittedly a trivial change but had annoyed me for some ; time. Only took a few extra bytes. ; o Removed the 'U' option. It was made superfluous by the ; 'H' option and always was confusing to use, needing the ; 'A' option in addition to a user number. After talking ; with several Sysops I found none of them were using the ; option and had not seen anybody else try to use it. The ; 'H' option does the same thing and is very easy to use. ; o Rewrote the '?' help and .DOC file and RCPM-help guides. ; - Irv Hoff, PRACSA RCPM ; ;----------------------------------------------------------------------- ; 07/11/87 o Rewrote the abort routine. This program has long needed ; v122 two consecutive CTL-L to abort, normally never stopping ; where you expect. Now it stops properly with one in ad- ; diton to showing a nice "++ ABORTED ++" message. CTL-S ; now pauses at the end of a line instead of any old place ; on the line. The abort likewise takes effect at the end ; of the line, speeding up the display in general since it ; now only checks at the end of a line for an abort char. ; Can pause with 'S' or CTL-S, abort with C, K or X, CTL-C ; CTL-K, or CTL-X like many other programs already offer. ; o Removed an initial line feed when using vertical alpha- ; betization which was annoying particularly if using LUX. ; o Added a missing line feed when showing all user areas in ; horiztonal mode. This lets you know which area the data ; for "files used and space remaining" goes with. It has ; been jamming the sections together in an awkward manner. ; o Added the 'H' (from here to highest) option. If using $H ; it displays all files from the current user area through ;  the highest available. Much easier to use than the $U ; command which requires both the 'A' option and a number ; from which to start. This is a feature I've personally ; wanted for some time and finally got around to adding. ; o Renamed BDOS calls to conventional names, such as RDCON, ; WRCON, LIST rather than "FCIN, FOUT and FLOUT", gadzook. ; o Moved the disk/user table to the 'options area' where it ; is easily found. It was previously buried in the actual ; program where many people missed it entirely. ; o Moved the BDOS equates to the end of the program as they ; are not altered by the user and were cluttering up the ; option area. Also rearranged and segregated the options ; area for simple selection of those needed. ; o Eliminated all superfluous and unused labels (a number ; of them had accumulated through the years.) This should ; help immensely in setting up this program which was be- ; coming difficult even for experienced users. ; o Fixed bug present since prior to v100 that locks up some ; mainframes using interrupt-controlled systems, requiring ; use of older versions of the program. ; o In keeping with Ben Gray's actions in version 117, also ; eliminated all trailing, unattended ';' characters used ; on comment lines. ; Even with all the new features it is over 3 shorter than ; SD112.ASM. ; o My appreciation to Frankie Hogan for his C, R, T and X ; options of SD121. These are some of the most useful new ; features added to this program since vertical alphabeti- ; zation. - Irv Hoff, PRACSA RCPM ; ;----------------------------------------------------------------------- ; 03/19/87 *NOTE: This version is a re-work of version 118. ; v121 Noted (from originator of version 120) that optional ; disk reset had been removed earlier, and hack solution ; was to use a conditional to select an unconditional ; reset. Version 118 always reset the disk system. This ; prompted modification to re-implement the optional (via ; option 'R') or unconditional reset (by hard-wiring the ; data area near the end of the code, which is described ; in the sour`). Since version 120 was basically version ; 115, this version, modified from 118, was numbered 121. ; ; *Added several new options: ; ; C - Give record sizes in terms of 128-byte records ; used. When this option is used, file sizes are ; followed by an "r". The summary lines still ; report the totals in "k". ; R - Disk reset before processing begins. ; (See above) ; T - Order files by type as the primary sort key. ; This causes files of the same type to be grouped ; together. ; X - Use alternate format for display alphabeti- ; zation. The VCODE conditional was eliminated, ; and VLIST was added. By setting this to YES, ; the vertical listing is the normal one, as ; before, but now a horizontal listing may be ; selected by using the $X option. Or, if VLIST is ; NO, the normal listing is horizontal, and $X ; selects a vertical one. ; ; *Added new fence characters for horizontal alphabeti- ; zation, and for library member listings. These may be ; patched into the .COM file for easy customization (as ; can VLIST, by the way). The library fence was added ; because library members are never sorted, and it was ; felt that some way of indicating the ordering was ; desirable. ; ; *Found and fixed several "minor" bugs which had to do ; with combinations of options selected by conditionals. ; ULINE could not be used without the REVID option on. ; If PGPAWS were off, option characters were skewed, etc. ; ; *Cleaned up the option character processing to make it ; more consistent and easier  for SYSOPs to customize. ; Added "USEx" conditionals so that any of the options may ; be wheel-locked. ; ; *Performed general cleanup and tightened the code in ; several places. Removed unnecessary POP's and PUSH's, ; etc. - Frankie Hogan, Los Angeles ; ;--------------------------------------------------------------------- UL 6"&sRzU- mm%g0 gQ98=g8wmAΉj\a Q7CO;a)-a(Q^&{AiSD [A ok, shows all files this drive/user area B>SD *.COM[A note, no space here, else will not work SPECIAL OPTIONS: ---------------- PRBRDR - prints a semi-border around the left side of library file mem- ber lines if set YES. This makes for a more readable format when displaying a large number of LBR files. USELC - can be set to put the attribute character(s) into lowercase for $SYS, $R/O and $ARC attribute bits. USELCW - if set NO, prevents displaying attributes in lower case unless wheel byte is active. (Sysop is using the system.) REVID - selects reverse video on the display, if available, to show the attribute characters $SYS, $R/O and $ARC. ULINE - selects underlining to be used to display the status line of the directory. SHOPUB - allows directory display of ZRDOS Public user areas. WHLPUB - makes SHOPUB wheel oriented. - Notes by Irv Hoff and others  vQSD129.ASMg  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefoRy_cuiYS/Ŧ>y/'T$_] Ry|Gf=cѕb 6㬝 llG3 5x+?J-Ngkd)jgxfpzڕN?=$8Mn W~wi #*dTHf}6.\xm}bqxʓbLl@D~/>=F- >rzʓK>`{ hcx{D|"ʓِNZŀEcLRybGNbqǟ|ͱʓu{=5} 6O{TW~`ِ h57 QB[x/ʓG.<#y ܝNRym{<^`r@)>1 b{ F~ǽH7'@J1PƧhÀh{/0R$=^`r@)>M{Ry؃v6%HD)f-ORy1"h&q6$ qcY>!{i珑o 0`pKaĬyB)³c 0(o/gOً'1 >I*0N\1ދ 6V#R|1"hL"шE*/'8j{81 >ڋHf#D2xt"@Tʏ[[X HbvTHD4ޅg0nc kpK`{ [`LA4"&Ryoc ΆX؃v6K>FhqиGl_]_] +ES^ [G8!z/0ې'LF<%8 q. K>63A2F$ Zhq&WD*Oۈ,څg=vL0Rx >rzk{;jD ƽ$qA ;è8j{ͱ,I"oNֈ?D$ߖ6A;b(80#xTC\xFOwa`'1[3$1ɕ"ۈaBoFl0R$Hb =A[*/Db.<#Z@ɚSn%܄56XJ副%RoÀnx/L?oۏ6ht;ᓼ.$5$=֘\)|?Na dx=ߖK呉$tF*/U7+^HzK;0Hu[j.߽ߒhI RݺqGoK_ _MzdI.yWE4Ry_ '|!K׬q?H&5I x8X U_/5^,nB_/?i knYR.߽0X_ ܄1qoE[㣽%OZH%U^Y#=~^ mqb0@#nB_Dzj.߽y%4)~1`DMWE"U}T5^3ңx˜_!H =[R}cv^ٲ#=~^ m^v6MnYҟ|U$RI:|µ#=*/Ƙ $A&'niSm|¯.U`S,^X"} AoǮpkGz4>tV%B b :-T̎|xlYomN"h4T̎|$=2& X>„XJ|%=N"h`D|f˜?L*~Gz1.PI#&p'RϿ'Tqŷ.0FD~</Ry|IQcx{ɖȅgx/bx8{0.j<0vB~D*s (i)~N c" 9G{!Jܟ 80'<&k ѕ^OK"z>1Y"GhՈ+Hd~ƘhDLxgRyh?/0& -^?Q*/m\';ik-N |mdk(]~1bRytv`{`Ov4H-NK ^$$^轐c"{/ BC1^|kL0a0YGN1¸-q#&TyKjiÀKT#ދa^'<ąg8sG{!Jܟ)~,8!R`WŘORyfy֠.c"e#;5XO $BC[|mmq0Z*#NV >j|dr] R@[@>rznYRܟD*/եZ\{HHei?)~3"J;K>lO_R-^$yYڏG.<Æ ?ZarH.եZZ.߽I$?vcqA %څKuw/| ,G\1DHTj|'?~do?r,aV\)KORy<ȅg,DZ$Ry|K呹P'1R$=t|~G-|-~\}y]@o cpN1aXxB4"&O nDT^*x:E*OtY~z9G--'My|2؂?Z!?nRyܤ˚'=sW-~\C ~bY"Z*/f/0ٲ 1j#W8srUm1P'J#Y RyDZ$pH1($^FLħt(ݾH奺TKZp_]*#/KJ0c"P I7-եZ\{HHei?Bi?sL>rzoGB?iuT|KQ$ ,A;<>ߤ&[#!~1F-+K99*\r(^`rH{,reX~.Gi?B OY mqxw/1=l"h TK$Hq9@['-L@- b >u ,Nv 8 bE"0 ]@ĕO8D=ŀ#6[="^nMU'p05 Ke| K L,G. |mN6 yJ8%S.Z$_G,q\r(>Ki[|µ#=*-Ni[1{ϤRyl-K ȕ%œ Q hCĀ1qz/XFc"$O'dٷ[_* 'aD[Y~`w l(HEC^ـ0|"jU'XFc"-V ? RϿ'Tom {ΆD*Ͽ"[֟}1&(E|/k7!X1qoE[&hϸ|µ#=!ē08#fm\lO.֬+.߽pHC08#fmBdG?}>c؃v6`*TR͙j9Kȇ5՗dMɕvԇQA*bYLR-g"3nKbv;?xIE,k֜Izj9K%#vG!Lƞ0ƈ-y/-##sɡO(D8݅I0Y*fG>jqC{Le|J*9R-T̎|HEW+L l("5k$=.I%ќv\ّw~𺓊X֬9X .I%ќyV*fG>Gk\0j؃v6HE,k֜Iz\J*9s6TK+#ڇu'Ys&v\J*fG>|X${l(ly]`rHhμTK-#ң;hgC,aD"4%#yJ8IE,k֜Iz\J*9s6TK-#u'Ys&v\J*9R-T̎|H&8jɕ"X֬9TK%TDsmpJ*fG>TN*bYLc6TK%T̎|<qhXqJtR1;@zT{ I R1;@z&D->ޅvߌ c {~<Ry}esIU|Q9jg\aԸ$T̎|ǯ`'ܟHPIQF8MHCT_+?ʚݨٕ"ēD?Rm6H奪6yyazm۾J,X.-$:Kjf6y%QNKڰj&/GHt?J*9s͚.Ah,36Dȇ$a})"ē9#fm4 |'R13fRn\Tl+wRn̶=-XGmхkV##D*6;w7^*YGXmr>kjңxBOwa`' Q*^XҌkYMz|)0$A0R˚5gkԕT^*Ѡ拏qIAnDLXxKe|T^*9u(];X{gl8I"[l*[ee'AA*/k\Hz])B< w7۞xL4}4qHŢmңI4IwِݢA0 جWHdU|Q죑}wcI/€bM0Rh>h8kRfm6G3!XQ {Q0+KQF-To moϳ|#:"QRZI@ F8kab6|Q'HS)0ҝF*{cv_;'L,GP'ߖz(#- (:gNzl95_7i%-f }wcIdDh|haN.DmTRi kl{.Gɕ [*yBz"I0Rx觃T\1樝 Rh;ңA]*{c^*"&2#=VE"4| f79jgTRzaݘo  f79jgT,چ(FcD_Xk_T69&=VE"4D$1Q;by̫KUKE,k֜IzoE[&TEv [b[\R*yh{#q<#]XmrviU_U|/0Y#&!1Hf 1R.sq$=^`pFښ'L{/bzm۞#orl6Ľߖ}wcI3b~LT|׷6yB*M^o_^G $:1a}&gVңY};I&8 `,1Qh<"9Y߳z/G.8'h z/ +E'O<reTg1|o$s {ٞN1 (]$ L{a1@TXj#bc"?=hgC i0. >re`5&pz/Ep.$09QD*/kvsI"=`]HžI"=YRyT"y0) (iap՘-b'`lH>{Qpa\ |_Z1|"*֬K_جWH"=yYQHz~(̺v˧NMÀ8M@I*ݍ'=bM0Rh>(;HS)0ҝRv=UHŢmңh/R`;9-ץ7VWE"÷HR`;9-ץUf]JzV*fŕ;-CNcq0b}wcIֈΎ }4qHfr'Uf]Jz!b xT^*[,݀A0Ojz/`Da'}&a0Y{Ά<cIp޻D Ļ5T]bG'(#- |8X0ɷ*֮ݼYH"=7yYQHz~(̺v{LNħ8&Z [OJX ,2#=R؃v6`Gg-T,چx =Nkץ7Vڵ"٢y8-HD?Z Q[uUvِ0ٲA sr!jkbzmvc#=1a5<ңۤG"[_|hϾ.Kc[}{_XB*YoҮ =R|I 9sң2>'R׮ϋGc[$5Biw7۞Hm:K{ vޑyYڏ Rn9Qqpp:K!Tk ۮe[}EZ5("5k$=[T*X-{ңC49R@mkŎh&S~y/ħZ*XDlgG- R]߲*֮ݐ څQ cKht{ٞN1 (]z/0z5m1@9uZ*/U.uk3'=RD_.Hf2#=6" (M~eFz|=0'F*y3鱊P bzmm/c̓T,4e{TR16̶K]oxRӔeSIp/<ң-=Hkp.h*%m_w7۞(Y #:gNz c.߽H+Ul!>uZ*yl]Mzv ;è-f[ جWH"=`]|Q*[钶GavaRIUa}鱉(]="ɉrEl/bWK"OSuz&=VRTR͙ծk/GXiʺڴTIJf͙GQ*Ww}ׯhGza(vX\p^ R]r6/|RyTg$BobWIU"kM<$RƼk7+LVol11A;b)oғGcUXb@{)f9vN?3b~7]YIw7!X-[|`j\5oKAz4aps`G8iao Tœ\h/^qߴA0ͱD,x}3jg'Ry4ۃv6 XjaB5?ʣSÀIY`Gg- <[3\>}"iڵQ1&kp=hgTꜹTLs =>h7S׮ݬǻt,lEXD (^X~ko :papsHjvNGn4$T׮ݬ/*J&[#a F$B'{%#yJ8}lF$B4&Z*`@wTMN{Xjw( &ϰlK!K1.8&E\]@縏$ lПHb嬻~ =j%]*vu\*[߸v]K呹c 7=hgDˆ6`S JT^*Ŷ^e#|8[3 |S-&8~ XijTuAzTB#sLuNbp>gy/揥bzm۞#Z4Ź8b0l ΈY[$eۓ v=\bV\H՚S,7 vA"J1kjIKzT5O{/-ƉB*yh{c8{,ŬE,-5Q1 8⻂ɧ|ɳ8DOB @? !>OR5,Yeh&|}O>1H4(re`5bQ|J0a1 1l1|lT.${a0r˨ h/^g؃v6%Hbvb򘣎}vP .8 H\x.ދ-dor`Ql Q>.DqpbD*/չ^V4c}~%=^?EOwa`' ΈY[q"iQ1 8]X ?{ݑE}u^/^InqIl9$R1r#8`0@OwabVI՚S,7TmNz\ٞHq8f]9To Mz2jg!Kxaݘo{#pF TǷ}wcIZ8 WHU|qF T̊GKwYZ{d >ID*fEB*[xGңڻI3hwTLwir&=VXj⻾eBzTg!TzYx}akXlֽR1+jRs|RyvV4^WI*Hqa(F*/G-D`/ H{"~1qI"|w {X0 NvRye9/LwiƬJz6 ;'$B*6;#sFښ'$.A}~ΣT;# alIx @{)o 3#/K;G-` tB*V4vƓg|FA{ D*V4\7x-vbK3#фd4 {c bA0 w7E*V#Sw7L*V#wRZlE,-5Q 97`E_H4˹.߸T58`pFښ'0FDw7.\*Ŷ\c" 1 `G%4c" x 7h Tc<@.@gĬyK0>|(b5ȕS-n{.yB*ݍ6'==bYB|EЉTl+wRn9G=#OZ$RYIžGG,KT_E"kU*V4c] ],7NQ{v ZXҌnsnRk:\)01habK3nMռ_ձD)01hab)eSQ 1Y1kkhTo mU38!{L$fli}Iz|HD45xL4NQ{TN ΈY[q"Kwu/o mUD4A|1aJ׆\I{+f%?T,4eG-1kk 6ORYk||}Rn UlXw G^Hh bpFښ'͓T^*fE͜`{gZ#3ң 0cJ<˘Xjw(beI>w11R12=gĬyy1'=\Ͼy1'=OZ$(mxn9^yGk]q~T̳)Z4W+LTl+wWEų{h{/pB*ݍYqN*vuΜ(bwSLy]`rz]55LH=k%\)B< ꪯV/L]מم6Oq +Eu9sn}ceJ*ݍ'=*-FhqI 9sң؋cܝO1YW_0RHw-Κh&{K0RxR]߲ju$=2b58E=勒j4Yu9@zdn#~1DW+LץbW̥7V_ݗG3I$[O}wcIB#yJ8qX*vuΜ(bwSLW+LR]Ͼ&=z5&W Z/_w7۔`q#X]>8 m1& 0^,K;GlToKž1.h yBI4˹.߸T5Aḥ1"h0R[Rƾ&=`0iF-ʝT^*޾A'h 縷Kk@c ^ .qHz,A'"<=Ilb A[*6}w[^fAh}4qH%ќv|R-iFܚR1_#=jqG-e͚3I{jI t5dߖJ*ݍ6'=*m ^ جWfRYIŬy$=zkץ-RYHlD(ʌȖKT_H4˯HB'-SiTo}ŷb{vܑU|/Kbݘnsң4Ncݡ|n*[gRӔ.MI] ؏+ v*-ħZHŬ2#=_գT̊+3#[>/!>"hfAhOZ*YT*ݍ6}wcIżh*6'=v)1:jt"[RӔ.MI]}L%"IPDC|b^/Q*6-򗨾zeFz mY[َAK4˯HBigSw7\*ݍv'TwۜإXˆٚ!.%Y$$00?!ُT,TnvTRn췙Tl+wRn췋Tl鑗%q"XsTl+wRڥِU|/0@#D*^ҌEwY7q<pzދ8جWbK3eHp}7 >A'3x-vHzG=un6p \@HtfdU*/Gw.E)&;H奪vi,ϸYQ(7oYT*/GeF -jfݼӔղ9w-Q =m1R0jd}cLbK3eݐJO}wcMbWܑyxd0|]*{c[oMJz,: 7!XL &;A*jQ+f;-MVmAz,!KRg|Sd<HgT^*&8b) @{)R1ݥ7Ǵ+HB#h !tB*^M"kݶ&=Z낆f:K!k3c <Y勒f]n Q I"ʝTmFzT=a 0$RYIk@c@#bJ,x$=Z낆S ybA*^7G x/0$[6(=`cHŬrGzv ( |JŮι#=zkץuKIz6^ a0"IH{f;-T|f]_E V B*]Q"01ha` R1ݥnHBccRڥңb_A[$hWH.Ox<}]*ݍ6]s'߽1օHH,5Z*/f$h;j\8ă&cOy`ui%.Xeݐx ;AmH*}|aWI`w*.Hk ]CJž1.ǻ4[X]Lbݘnsw7L*V#wRnmsJ?{aK3bA*4ㇼ%=}ɻ|[3XҌ>H"OS]BztF{ヘ|݇oKw-̈́{{R1ݥIk ]XiyKz,}1 {R1ݥߑ~y+TLwiy+|Hrd*tKž1fR:}wnKw=̈́w|ų(?]3%=?d )ޘP*[I%U4cUtuCzA0RZ>HtflH'wb^}wc]HfB<[h X]Lbݘo3XIw-/bK3~[o>Jp bYbAs "hD"*iܵqvaԘ,:gNzTB]*[߸veCzvcw= ʣc" A; Bb"# {əDd z/>+\X'؃a&N;İEbz/`"|"n۵9@nԇQcr=R[Gm"4&tzN?LT|qˆh&tzN? Xo cH>v؃R1+jR&bDhtzN?`A|1&WRy<$$+ €q0@T_~55pH*k10OR16̶es.ȬH`G}5&W O].[b[,+T,4eRYkG5γHi,.߭o\!=*-  KL8ŏ=)2bs0T].u"OS.Hȇ U*/7R/,4R_T̎|qZ+biD >uN9A8lⴳA*-^5(c!>"ORu6Ŷk"1j4;è1RH"OSm/f.߽kץIc0XMxL4>ADJ]~a.sqQٚRh>~`Zmh&zeL4ħZ-kݶl;_HfٓK-\8-TC|ER5,]"ORfn^9sңI.T!Nuk]6WEE.<#b.E HʨT̊9Zs5f;-M9|=*al̀0@[z3ңq@ #fk +T,4eRsG5γHi,aD.߽κ/Idd5X3N|,Ty c@ш3'Ryn]6˙uAC[QF8M h_F}54 RgJݍ'=}4qHŢm_w +ץ7KUԤWEE  Z1 0"E-Z0yYQHz"B![|z>Hd+MsSW Q əDCTgf9o]{N?7agRsG%ץkw -I 8TL m׼_Ulq0.h&q6H"OSMEz HqY*yӳTRݭk7/LwiƢXҌi]֍TL wWXҌqmRXҌi6TL wۮΖh. @{)p.habK3uJjf\f#,Hb/1P'L֜bW̥YIw7!Xh7R*4c] QA`èE !tB*yHYDGa'$baRHk@{a&W.hkĀ8iabK3niW0Ġ!>"F{1|[*fyL*V4|ԤG 8 Tvik58[2jaRyt>z/08#fm&WR- ].8R$8E=ŀَAKŬrGzv GXҌEwY7Rn̷;ңI. 1ј\).:g*߽ UlQDcr@b|KQ!=D ?HF#Qi$հA|]*]#QD[#] -SHݗmnHnq0.h8-ʝTl+wG;lw{hOeL4\@-]q]T|׷\MU#{?d TDC|ERyK}.͸.͆ 4R`]HžqQڏ` 0$RYIž1w{X38 F$Tl+wRڥِU|/0b&KyإR1ri(bKe|dI*vu\*[}֏ǻt{ac)K{8 F$ w}/ҌvS0$pA|鹿8'-b{vܑU|/$a}0$R13fRڥ&=^`e{" tRZHJḥ1"h{h8 F$T$=&mrGzTBcAd Lƞ$qHz])B|@z8; NZL!T,4e{F}To H+~:"8kab۵loHwuSF}5bz/ &W Th X[$: > B*/պ|#mG-I$8َA #StaF*6k#qO io5ҖH=珥*k>,]QD[#p.habݘoRh>>oX KwFzv tpZ*Y~ =RMaץbW̥bko^eSjң5.h if9K[Ah$8 $`D80Y*vuΜp0.h1R@[D*o$=*-4{Rg$8D*[Vm^,G*3)䓃qA#9YHʚ M~ =RMa,2>#Z*[MIָQ8o cw i'_T^*W>HI6x7v.wTKf:KaijK0?3T%<~¾1bݸlSwR13fR13bgI,ϘIzH?RyҦ ƎmaG}5"&WO1 m9QH奺- RhTB*kßwG;O;-K{0Nm9B"[Gk\И\)B< 0@?T,4e{TGۇOb)˦R5.͸6&%=jNKž1bWLI7a,THz|U$[5+E"fAzvAFDpZ*VٚY`<X/K`MK$% niSm`]T|KQGV!1 \)Rۤ/Ls =?C0Ys]3֛nHzO nTLiמRsRƶtGҌnsnRcg?)'L NQ{1|]*ݍv':g*mI'=^M6Lv TR#=vָoڠc|o!>unBJ4YusA*vu\*{c[oRZ̥bYusA*[|&Tm6_ӔEJt^^fMGz=~}|> 3xT,4e{TR1rT̳RӔeSjңa{T,4em⻂kwZ*yl.UMzt>c" x #TDs5u%[|Xi)vT,4YSKE,k֜IzYSWRI4y굖EU*׆v}T|WTL ڝ<ң5.h$$,Xib<~uɋ q8k^|]*vu\*{]&=*-c9AH%ќyIuaJzlF`0S b)HfBa,Ke͚3IKڬTRݥZ׆vmh _ٕ"yפb)˦mrGzbeM97T,4em!=ZƯ`'L NQ{1H0nM_EQg!1l1P'?|El/J*4T鱱:c"ܟpzދ+E"bK3n͹IIX"0&WD*fy#Q1 X(]R5,N*ֶ^7/l֚Q|n3>re-tvY1#=RDmq\r(⻂k[Gw7B*Vi. H{1Y2jabY]ڪ-H,GHq Fbp+MHX].ڝDyB)@Owa`'ܟH-.@Tmh/.{akXlHz"a<݅0r^X-,4NSwOa+^KUӣ '4gĬy˜0HfKŢoٓTcL >pxT|昒dhDL-TLǼT5QDhc"0& 0}wcI^ O5gĬyB"Ry XiHָTL ڝ^*yl*ң5.hDg!,8J#8$B*Y9?^cpɡO9IŮΙKb}cQgcb@ VAQg56Xd!ۮN*6k^*֬i3sR|DbbTꜹT|qm -A|1T,4ee~7GǘxFK0}vY}GjSqf;hDD3bzm۞#фو3b<\1^`ZE߲'=2+!>pxT|WpmTR͙}~TL5oGjLj1Xc9 Tl֚T,=$pHKw׶ސJQM֢Iw}˵ Qh=TcpR˚5g}~TRZpvCzT"y >\1܄St0VCQHh&qA zoXF*/֛Yζk9sң5.hagދKwk!=VDC|To mT.HָQY*yh{.W#uA`bE,^*[.fCze!>uڢ(Z'_T^*nԇQCDtv ΈY[0ٝb)l.U4˹.߸TT,چ%~R]r%=*- T69/URT;Inq0vIׇ{vZ*G._}a,HBC`pNKU*[ fA6hk1E#Tۜ{18`pNKž1Gk\"$ܳRӔeSjw7#Q9%t=;-ۮQ*yN#eSj|Ry<A|`G}5b01&kp8&B*/UQ3ңa@QK"OSMbko_IJY*[M|Ry<*q&j vԇQD.|!b+ t'bei?O0HqH:/kEڼXbko^H&ZXi)v54BE@Dr&ZڼX^ hh jYB*/6'=^ b&ZhT,چG!;tA|]*o,̏(b5ahQ$Z*YsמG`raԈvץbW̥kِ,潘?d YDMVK8R0j g |SX G^X{ $ E<^ O5}4q|f}&a0eGi;j̣1"h1[3`r&Ry0@E@ш#1[3#GcDИY T^*4rn 8`A>N08X0R1r/bݐ4 98E\x]3'=4 i,˯Kwx9ݢA0 XijٜH d}8 F$TL mwٜ#=2[|dGcDи$ 쨥bkXlQ7E*yh{{s,KD#}4q-:gNz,Xun}7RפWEi K>4%AN*׆mw/gz"qa}G-qIgl ~{$=z^`Gmħq&N;b^#=8M`]Hjf<^!=0 YQ3'=4 y f;T69snH< H{jQ7ݍHzbeDw8>8kab6yGzTڸ8Ӱ>8kabݸlsңzD$$> ۶n vԘb؅gL֠tA`bHb)YWI"OS~X6ŎFt5Y #C_wG~FB*{rm6Rh>|_wGgPlϿ޸\ͣT,چׇ#=:b~~޸\ͣT,چx =*!& څgh⬅ f*ci jkYh&D$8-ħNC[ nAPYH|m(1< hp9&B*mÇ(b@[{[RkyEңnGN_Jwo\Q*mÇQĀxF#tT|lj6KWZIZ$BtA`cRIv_MδYu#klwR qZ@~sFKe|amfH"OS:gNz"z/?ghale¶k#=Od eSjv-3v-R^6RO}TݨƼ&Z->rz~k`{a{7{ޗy]xw{=k%AH|mȵ6>jD-Q -GR˚5gjI t5dRIE4gjIo _3|c,TmNzT h⬅d ʨi+HfG{!Jܟ@{bWĬ1(G`5[Iž1.q{yM0Ke|XtkwHE,k֜IzjIo _3|c,TR͙rk2^G h⬅aoJzlF`x/L" J"OSeS̈́`5XRZ7HZ$yM0R˚5grk2"3/ՒRh>GY '䟿Iw7_mB*mÇyM01*͓To 7[⻾1*ң!@7è|Ry'-D] ;YqmHl)u0.ha5RHj/¾1RӔeSjجWbVa,ϵ0'm\xmHl)u0.ha5RHj/i_}4q`2lA R1_#=*mvp'9sңIuXHsr!j!h>uGzR/WE/Fb6|7_/b6|>|םT|T,چx = ؤh⬅"ޭR]T,4ee~!Q"&ZLƞF C ߽2?~!×R/Rh>\ŗ3*̏_06̶ŗ}( У p>]*[Xj:`)THb5XB*vu\*[ߘU_.uMz,: 7JKc}wc=K-f @I*mr'ۮe&ۮQ*F*W/κ 1`c1 -N(bYB|tmQRy̷:*Eͦ[ңz/Q4'ܭ&b)YWGx0ږT,4eT:oIZ$BCoYb5:-+ߗKQ oDsZ:*Tղy^wRT;fRT;bkXle(jh= R16̶8n꼕E愻XmT8n}azmf՗K]ӣz4{a⤅6#b{vܑU|/U_.u 8,ʣF4'ؘx xKU/զۗR1(Kc[}C*Ŷ^o7E"4>愻ăT,41*v-RZb۵̤b۵IzHE,k֜IzYWI?RyJ;èq=mac" 1 HF瘬 LRyQF8M|"Z6}a)/oKMzs4 nB~eH4٥٥IBcLAOwa5Rn\To mTK-`G-ac" x 7h ^f9^{1{B"$ \V*[V ңaԸ$TT|_*/Go .qAXji5 fِHÀcU8E "0Yz|)ࣽ+T.`ra8A#v4 ORU˦׆vsILLq,5>G> F$TRUŶd}NzTB#s`DHw}ˢ|Ry}]*vu\*o$= O"br%{1Hw}ˢNϤR&z41@|MD邐K#$ڸ  -T^j}i_Ƽ&ZLƞ-HqY*kßwG;N8$:gNz4 FץbF"B sr!j!K{#]Ib{v̤b{vI"OS]6GaGg- llCbK!ۮHm`ijK0TlTlGجWf*>Hq8lծQؠ]T|_*/GaOh 5(c!>"h +ͼKUt}[T;H*^ a0"Ibݸl{#q@i?50RYIž1Gj〽{ÚAجWbXl{جWbxRy<ق`?-DƉ.0!1H}}wIBccRIUmھ0+RZIpw?K|mh;NȥKŢoٓzN*6Gn}m捻wGaN.9E=bV\H@vlǠEߦT^,M_v-wR^6$=  EY&e)+ߗKQ}A'f:K!F޾06HžRYIž}}w-bݘmRn,Tl+wRnm{w7B*gGaǠ1Y`)HR1rn~ =?d k4OO!:g.߭o,6mx:M֜b-K{O&d ʨ1qң.hhɕ RZ>H,xbA*gGaǠ1YtE,6mv-3ң8^ ēIb۵ܑ^*To d B< tFH"OS}T7جWfGk]S-ze&L*6;جWb^qQ1hL@|EИJovyaWf:gOz)^*kßwGivB.uΞR[f/f{:D#b^Ifr'M*fEͣT|۴]bl|Ry<ciTK}m6/o #=cR ^fۥ_b5_El/h '$YH"OSuz&=CQK|4>G,K 6-H5Rykya̺~ =%#.:g.߭o\jH>v񩖊E,̏(b5ah]շ.o40^`HD4^*׆8M818#fmqf;ج5{X-{#"Aj .Y;KwTR͙}~TL5oGjLj1Xc9 Tl֚T,=$pHKw+q5m-JT|׷\ݐf#O5|,Ys&׬I%߭׮k7G%S%MkV#X mF!TivNG\r(&kNRsRxcQgc3{(]" p Kۢ[ Q1f[ $:1E,^*vuΜ(Y .<]*ŶΊnƢI~/}4qH%ќVg]%,[[u _]37.fUHE,k֜IzYWI%,m&LlTgX ?{ݑE}urm6jbkXlvWE}%=j a58A@[ bcb)˵|Az|wtZ*ky|a̺~ = z/0GpTꜹT,X}#o^*kYW"3]^RӔui/Ge͚3Ij׵TR͙]_N*bYL6RI4٥YV}Iz"X]% w7.\*RӔEK4٥٥IZ$kܳ ĘhD}wͥbkXl?B*yh{Ҍ&/$=> [Ht?UKIz=C[r@T I< 0B&@[E++ߗKQD[#Ў͈Fnދ'|$Y Ryj׵Tui/4owR5̶R5\?]vR13fR1rcVߤbosجWbl/KUKžR^6R˚5gծk/G'_T^*9s͚j_WXmr:kjң NXbދcv Z*ּ4yVk<3b<8N0ȇ$J5Ysq$=>y4F̸B*}˞ȬHf5D =4ދKw&kjc[{1 >R1r7.UMz|hc"Tl+wR[GfE5!6O8E=1ƈ1&|]*[߸^7YSbދc񩖊a}q6$!\cXi)vTo Hu<݅P죉& A'ʚ/l+wGߢ.hh1kkƓ}wcIBGg-T,چ_H% DRƬ#ZʚؽT;7bko@z ϸ8,T,4e{Z*]˶T|׷̚}!TYSyl]-f!߭o̚դG7èƼ&ZD*[fM]^blHzd6.v_n̷TꜹTߤbkoxݑgW=CEuI$~,b)˦R1+jRƬR^6RI^7YS0r:kjg I&FDȜ F*VťΚZ*׆z鳦E߲'=Og!1b <}]*{eMMz|U$[0.AA'L@]"]qH0Sb6uGz,XX+_ V/^In1&Ǭ ŬIbkXlvWEŘcs,K.yGzXiʢIJh|=6O_B*F*o/LwicUy$=R Zh{LcURYܑG >`\xF}wIgO~(V*6;w7f^*^N-^`AF*Gk]F XbH0ޖbsL|:cx=h^x/To IEm|RIU}#o}wqۓOZ`2]*TmOz6?iE*ݍHzTI LƞK}}wc-H*?iE*6;ң '4ħ>guA Hf2YQ3'= ;-RyGavaH> R^6RO}T^h0a<݅У 1ODh #>/o(o֠ZXV$ΆooaMy\h>KU|y[YRMـsb6uGzz|ץbl|Ry ;j Ǭ8,-k!=0@|4qڢ(Z'_T^*W>HI|FN8yQ Ry0B*O 6O[d @[#]`re)-v)@[L$Z*Oޟy6.À nX*/U_w/|5OiR1+jIŽAcn}ymF*]ˌ 4- qX*jQF*/G5ǀ̶aٞNq k,m\xKUtin̷=Q1`-m5HqRYܑuAC[񩖊E(li&;R.GX GaOɎaT|(Hzdt'T|Wò9?Jw}ˢK(l.nBKJ*[_v-wGQh8,|ۓU|/pI`{ f79jgT,4eQăӱtRh>G枝P$ǀ_ ^.$=Zcg$a]X]>GY`2*B4ORh5k/Io8ww;!T|WeMT^ky9sc109jkb۵HZ$lKH3\@r0cT-k/_ج5s#~?&5Z5XmrfMڑU|/0Y*6;ң.hh >՘Y #ʣ؋cL`LKu}wcIB`K1EX-DtF*{esnE*mÇ?yYbLAOwaKw/RRTKvG%4rRYܑuAC[I #|ۓhf[ ˃T|ܤT|׷\z6u,!nB-m@0TR]._xsǛ0c" x #6'= rL`LAOwaRi׵/}wcIBcpNKfrGz mħZ*mÇ#A|]*{㥪U*VGa{a4݅h⻂K]/fCz\a]cT,چRZplbXlscj iB*ݍHzt0R12Ͽy1'=~Cg&,cNzU*YƂw{vZ*ݍmNz"K pNJKUg |{$=> >c" x #a_/RpzL RZplbyzH*pS⻾esnE*/6q֘\)IHlΏ/l;8X0'-R}X6&]^|ۓuA m1҆KŢm ߭opnQ*6;ң` ٖ6H%Շs./mOz|A|1F*mÇ鑉ҝR?{Y*X Gc(ia.߭?tB*>{Y6qve_To G'-ۇ?H%ՇIVʌhGuجWfGk]A|bV<`? RsRIu^n]^f9rHBcp.TۜhR1r^^;a]w7ۜhv-3ңFghayGzkbWIJhLe|NblRy|+B< LNC"ùI/^? =rM?I L!T,4eUÀɕTo H\dg?iɕB?TmOz|(iab6|8Rxap.k|R&]>zh bGg- ⤅>T,4eUÀɕT|׷ Y #yT,چ/R~E?HM*mÇTߤb6|݃Tߤb6|TT^lI/_X-{ңC49G" 5辔K*za6|R.b6|wbR4u'e#+ߗʓ0N8yQ T^*j;jDmaDP +gĬyK֛_plI&8b)` tF*V4\7T9sXmrknjY7W4cZtuCz|َAKŬrGzdb6$RڥӢw7${@ʘhL_]3ޘM!=*-=RT;b)/c!=OẁxF]*4\7To T,4emMzl.<Gj .ۮQ*[ߘM!=VTl+wRYܑ=E!>"h1pKTviunRo)Z{=cA|QڏD!>"h'_T^*S 'q qA,*=.ftfLMIbݘowRsR~qGzTI`cRZIB#Xh+MVmAzT`Dqp!" V2i3]u#[tCңPDtA%ƲbAC&HŢoħD.Xo,Lz4hK.-ħD.!1H0ݺ4 #פb)˦mrGz|X$Nwa01hT,4emaMTh _.L5XibK3MIb)hTL mko^6T^*[,y9pvRyc6/o #M&|ŷKXmr6U^R1ݥII @{)p.habݸl{#Aa0"Ib^}wcI{ÚAa0"Ib^.͸.MJzTxtF*׆bg̤b)/c-߽1=ղE,B*[ߘuJk3&gSu!T鱮 Kc&,gF*R[RXXY*jǶnL4\!kl}Gj3Rw7ü&ZvJB*ylT,4eռ-(0j}SN(DTRӔRF*׆6=UT,4e{TRZRyTHh0R ē "=(i\bzmmc}.XXm+3جWfR5i v6H"OSmOztTo mTL mzQ*yh{XijٜV*׆mz<^Rn̷TꜹT|4kjң؋c ΈY[RI4Ty]HŮΙKwykw7^*mü.X|gM-T8M h$J,}wcIB$Nwa`"`*T9d Amݯy/TiYi򺐊]3TL g_8݅A Dh3ccħ1 T̊GңIpIA?Rƴ,ՆX- - >A'okIdgħqK/l/Վ;ң5.h. B< 0 qRT;b)/c!=OẁxF]*׆mF*R[RƶQ*̶>Y-[|#q#[3yM0RӔeSjң5.h8-[|K"OSMIg pf1 S-Ys&:mݯRI?ӔUTo ˃T,4e{Z*yjbJ]ˣTl;^wRT;b^qJIYb)˦:J0>|@z8; NZL!T,4e{Z*ggY N\)AH"OSMuzN*6;w7.^*6;w7f^*^Tݨ $v 0ncɕB*/Kc&KN*^ҌiiWHk b0J,ϸ#=tvǸ?iH,ϸYq'dkRYHEj|MۯIŬy$=zkץ}w[HdڃT InaMKͼw&W $Q Tŗy/9s5sXmr~X61%=8M%Ʋ&g #ʻTLwi6)qOnylǠTl+wRڥۤR5̷?$=,'Mbəź!=jO"A.v Z"m_Xiˆ 4^ O5}4q`28MHŢmEפGiD3{08E0_7,=֤GĻ5nBZ*yò!=>0x/Ll]3'= nQ?$(c  +V*{cڧ˵!=0#`TL mBzTBC[L,qqqyG%x@KEA)P$JOB*mG8jhh I x7~X6>v j&q6Q*׆.c)^A?IHlv 0bfGcD0bfm2#=jhk`)Z*fyƌ(0j >5D*+x̳Ẍ́_oCCL4hE+TviXwJ*#1[3 ObkXl%^0b)?,z)bW̥uAC[̣1"h1[3OZ*6k͞8&kDbA#E.0"RI.fw}˼.ҖH=`A|1RH?Ry|A|_"hKܟd {^`rKaټT;I*0%ZD*jL*jǝTLM~LIֺ-ʘhܟqZ3'=r  qT,چ?xIb-a٬ UlaDħF a8X0RlcJzT@>N08X0RnLTo wW^fxbg̤bݘo{,I Lƞv-wG-m.$RZfRZblHzB&H 4T#E.0bfd {^`rKa٬ [b[/yFzTBQbi v6`Elꥐ]37RRT;7ΙKŬKjòɏTlm X/Tu ۮq|X6u#hTl;ң(E {g8,ۮe&ۮQ*]Qixs,K$,z)^^wRT;b)ef}NzTBtw>G#D*׆6=HJsqD#D*]#QD[#`D0aXiʢIi^G $:1E͹kIZ$B5.hLqHv-G-mq@v-wG-m}&ap.habl|Ry<6"ј\) >"hL oRy/xa{vIRIRxbA*׆m^R5,_x @iBDK*i_I|mN*}^*[X|WجWb^IŬYHw/:K L$_G!nBk%&kI^RyfT׆?=b6|(HJ _+&߽2Rh>|@zTBMڗ_J˼Zb۵̤b۵IzH?RylD1R@|EИAzR_q'Kc&KQ*^^|aL*/c4˯̤b6y'e/߭o,LWجWb^IŬYHw/c*Tŗ¶kym2mr'e#cKQ Ry|{c="ͼHp ڽRyM/*զ4h hN[ R1+ܑ̈́WYb+lۓ?x8~uh\"Yq^ݖbmL,Gb _;~uTm/kgGy,`DN8~uh\B*fyƌ^6ָg{1kkhk eۓ>ja0"IجWHf±*YblA`] }wcIθgbcUmHl)`G}5ދY[#Z4 lI$I|Rn̷=AhBkab6|yGz6FC[0c"&!1HŢmp| =6 ׎_]&G7j ǯ.V#ڽRYIž1R1_#=  - AA Rh>|A*Tl+wRn̷T׆?;H†hh9&nBbT,چ˃T7bzmmMz [ ڢY*fyL*ݍ˶'=>zS/ga0"Ib^#=0`'w7f۞hE*^vTL OInTq' 'O'ܟ}wcII ^nGz|c/H5. E̖Ga{a4.DmWEH0n>H"OSMEz 8$B*ˆGG|Ry<>reنhĀ4.D0!E v)@[@_Q9jg> #yU4 OZ$Ry|wD[#O8o cD#I"-m@rHpOv4$ bF`e'Ry KQ*jL*HE\x7,[l*TRa}x}Q*/l֚T.Gf+T|̖_veH<˘q4qX*ݍmNz]}wc-HB[Rh><>oدKwkl)~UHž1.Gǘ,:gNz"Rn̷QD[#pB*{c?!鑊8o cD#|1H%U?}wcIJ[#4 #фو&> v [ez>HJh|SRI-~¾1fR4+ m*lKž1IZ 0RZ0[<ӈg ^H>~,WEHžG$b۵̤b۵nzF-؀)6W/̎|W~}X֬94ҭRy Xij}C*YoҮ =?G{!J9sң^Q`Aժk7.fZ|R16̶W}Gk]Ј'$YH"OSVR]r6/H< :-cw N"A;|p@[kNĘ{-K`5T80&qdh<%Z`/FgI|"k7}ّm_m_bvR;hgC%:#?X #`Gg-̷_m_m_bvsIJĘhDL𕿮qLăT̎|oNֈ?J\)o.ٚ!W]|do?Bus #0R$϶R1;9bYb0Hl9JG1#F4"B[^$_ #ۏ^ #]gWK4c._$Nwa|W|8~ &kNQ?H|oo }l}l*#x:C[.шe"A DD#b}ّ8&"yy>~}|>~}|ّߎ28_3uu*cw N"A;AD E |c,)\DORU_ّm_sA.Zu-v6$7v˒Z6sA*fG>~}|>~}|ّcra^T_~5?F$BcpR1;SaU*fG>>GW+L l(V.8W_0R$϶R1;h9- ~>~}|>~}|ّR˚5g-K*c'N"p@?İm0&.<#'L1Ox+ hk$O'TDsmݲR햴׆ٶk7}uA#jDg!~}|>~}|ّ@>2K h4>rz`̓T̎|~h⬅T̎|l*##%DD#b80>A*fG>~}|ّ@1R q \5C~`~޽ÃT̎|JJ e"WQs%#yJ8=H϶R1;8sL>˚O6 ÅW_bv&WaU*fG>;|b4FhDػH4 >50\) m_bvs.HV^8݅I9I R1;a<݅y>~}|ّ,YD7'k^9'9E #5z/T̎|:|do?V\)P>=l?>n?>J`4K4bYb0HÀ1шlbv!H^m_m_bv/ ? 3BA*fG>~}|>~}|>~}|>~}|>~}|>~}|>~}|ّR˚5gk7v˒JEg 1 Q:KU|W/̎|l}wzdwR_/̎l_K_}xavCf{K"U #~sFۇ?HwR/̎|laR-uW/̎|TK]/̎|Xa*Rכ #/R9__bR`r^m؀TkwfG>~}|>~}|>a*ڝfG>WW0;xؾJUusّRmM_=0;_af{TnW?|av÷RmM_ّW6ݦ~])two#[ yދ%}*?U϶ۇ5OUW #?>n~sny5OUWg/̎|A*fG>?ّm_R˚5gm}Z*̵۠uVKUt|avgf/@4Ws. #p0\)Tis_M4OKoYh{/|a*U~ّm_5OUW #?>nRw7| #?>n_"5k$=V:jMّVQ +gWּ./̎|wZͼw&W |;϶Rzّ~*WfG> 'hhL\ >_f/P|hHC4QT0D\p}S FDTf`V}5q̺ F X08hF*f`V}5q̺ (Ŭ!.hafqx/fmT^*% f;}8] ֈ6`ppz/I\)RydQGD#"piKM1E@%0c50ŒA*/UoW.߽ǤGѰ],7TRucFNlRHu;fʻ~xaVQkfʺ~xaVQsמ/*>JsYGҮ=^U|jsYG=^U|sYG۵ R]{N?0(Uյ Rm~xaVQ[מ/*>JusYG5 Lz,a`縷K屄v=hgJk?^ T˹]7/*~AzSQ;}&a:^źyaVX] '-bpvԇQ>N0Ru͹80|30l1Rx[0`rO!(].KշsYG#=hg潘?d YAnrs6Hu^sYGJzދ2>KufIWve|JYu¬#+.l@2!TiiWd =1%OcRg*7&}aV ۤ/*~!UYGҢfj]Y/s./*~!UڬK¬#鱎0JDmq8:7uټ0HzI4; Le|d 8]*fRy\ NXoCш(W~aV( v5مXbpFښ'0T>0s{hK;_ ƽR/fIZ ɷ?x~Y/*>x d&@[RDߺKUtu¬ylǠʚϯ/*~Az^$+~08#fm͓T&]Y/H+M`l͐Huf =tv(Ťag>`{!չjޖYGJ}S`Gg- yTY/H cG@BY/H cG@Bw/*~AzTh;jmM|R¬GevA g!UvN?0Hz⣽8 (E\x7T}~T G?Ř_aqTKU0Hz\a+$Oڏ/_=hgTrl^UXŧ:KyKYGңAO(>wqT]]YG0`<9jgTU] _HRUjfITg$8 Le|jsLY/HJGa'x^ 6ܤ/*~Azl%x ;arHty{aV ccu,o ,1R$R]z_U|$=.0.T>^U|$=[= 8]|'#>/oR9¬#Vg]$tF*|?r?&=0NFDh vtRIE4gYSWRyg _k<3b<8N0ȇ$jYS0Hz. q"YS0HzYb/11ha"5k$=֬+"3]^RcV^U|$=*mM|A;K7#3I R/*>_kK" IE,k֜IzTòɏ R\_UR¬?J|YϤʫmyaVRuqnf-TvS0Qh4D6 ^ m׬fݥoY/H&FDИA"fx/J9^/*>~ңaԘ\)pITǬ ~1F-TǬ|ןH%hֺ1YcUcY&R#^bGzdbcq.ȇ$js|HLLq,5>G> F$TRYѭ\{#QؐRèF]t+^QؐR0jҦp?#=RhQF-U[7w/-4m\xj>>lCbKDG=&Rm[j.߽ ңz4EI RKl|HZ$BcpH-NRUKU_r?$=*QYcpRur?#=\)*ҮZ|_EiɕB.vg.߽G%Lbr? =*ͼd TKU/y~Jz"H/FTߨ~Hz|8-_"hK˅w/ ң LR: Q =y4F%KUm> 5Q ϑI"UV})^OIB#I;!v6མ5Re՗m^s=F#vq&&\ ?ֳa]"3ꬫzRs?Q =$|κRU ^WңEsZ m{TR} QDh| wk5|κR˚5gouURIŬ_IJcD#T&/|aV ң+$:`]H%UWgK tF' #˚I|9E #5z/T̎|:|do?V\)P>=l?>n?>J`4K4bYb0HÀ1шlbv!]3FzO a)Q1 AD#Ǐbg̤}n*|'-`'1[3`cpTB*u!뺐񼓊}wI< 8N珥bݘn3{{܄bkm_I1z/`F$څg8 wG?'8>b0J,ϸ#=tvǸ?iH,ϸYq'dkRYHEj|MۯIŬy$=zkץ}w[HdڃT InaMKͼw&W $Q Tŗy/9s5sXmr~X61%=!9"12 2 2 0}2  }2 2 ڵ !]~ [?W:^ [ e 2 2 !\~2 >w Ͷ Ͷ Ͷ: G  :\=! _!~2 ! !] 6?#>?2hU !\^##~2 #~2 ##^#V" #^#V" :\@2  Ͷ: 2 ͖  Ͷ* #)" " *{z: _ >?!hw#w#w!" U `\< =! oÁ~^} o: ^#*  w#“o&l o|gl o|gr#s#" * #" ! *{z^Memory*. W*.W! 5# (!a]# B!c]!dARCK > # #j^#~ #^#Vz " !* #" 6) ) N#F^#V_~W #¬^#V#N#F_~W #: G: 0x|ux> \ > \ 2 %%%>0\ 01'x0K: >0\ : > \ 2 \ ^#~))))! o&: /o1* +" |ʼ* > ͼ¼##" {* +" |ʢ* > ͼ¢##" ÝͶ Ͷ: >!\4Û Ͷ Ͷ: 2 ͖  Ͷ2  Ͷ* > Ͷ* \ Ͷ*  : 0K-R: G *+ ͶZ Ͷw ø  ɯ2 ; ~W #?ʚžˆ>2 * ^#V#" !9 2 :\  e6#C   9 !0~e: ~Km* |vÝ* } +" C  9 !0~:  6=2 * #"    ss!  6 #6#Š!  ~#.ʪ™ ~.¶#~#¶! ^#V#N{z_yW" ! ! ~* ! րwz $*-+ "-!R !,4W: <92 o&0~RJ=2 C  9 ~#e* " !" " {: ! 4: w! 6: >!\4^!~ʗÛ* ^#V#" * #" ̀D* #" > \ :\@\ ͖ >:\ > \ : > \ r >.\ h V#^: _zW/_zW{_( >k\ >2 * | {r >.\ h ##^#V* " !{_j))))) >k\ ! r ! r >.\ h >2 {\ ö! !" Ý#* #" ̀{* #" > \ :\@\  >:\ > \ : O> \ O* |2 À4: _ : _ 02 )l * |g}on}o" #" * {ozg" * " > ͚ * *  * * {ozg Õ * * #{z * u 9 * } 2 * ! s#r# +} * " +}nr ) ) Nq#Nq*#^#V.  >FNpq#=: : : 0+ -~ ~\ #h ~\ #r ɷ Aڐ [Ґ _: ڰ / ҡ Gy\ x0\ z ͶR!u+ ] +  SuperFILE 3.2 includes $SYS files (also searches lbr / arc / ark) - ^X to abort SuperFILE v3.2 A FILE search program that includes $SYS files (also searches lbr / arc / ark) - ^X to abort (Use FILE.COM to skip lbr/arc/ark checks) Examples to search all drive and user areas: A>SFILE *.AQM A>SFILE IMP*.* Examples to search a single drive and all user areas: A>SFILE B:BYE5??.* A>SFILE D:KMD*.* +++ Drive Error in LBR Checking : User #  Finished after d/u = Lbr/Arc/Ark searched = Files that matched = # of files checked = +++ Needs CP/M 2.0 or Newer to RUNuuc. - Frankie Hogan, Los Angeles ; ;--------------------------------------------------------------------- UL 6"&sRzU- mm%g0 gQ98=g8wmAΉj\a Q7CO;a)-a(Q^&{AiSFILE ? 1) A0>SFILE MOD*.* 2) A0>SFILE C:MOD*.* 3) 1) displays a small help guide 2) looks on all allowable drives and user areas starting with A0: 3) looks on all allowable user areas only on B: Recent changes allow 32 user areas to be checked rather than the original limit of 16. (ZCPR3 and TurboDOS, etc. allow extended user areas.) An equate also allows system files to be displayed - this is controlled by the wheel byte to limit their display to the SYSOP, if using ZCPR or ZCMD to have a wheel byte. Setting the USELC (use lower-case) option will put the following bytes into lower case to show the status of that file: A0>HELLO.COM m = archive bit (on some systems) o = system file c = read-only file (These attributes can all be shown in lower case without a wheel byte on private systems that do not use ZCPR or ZCMD, etc.) The program handles up to 16 disk drives and up to 32 user areas, each. Most will select the maximum user for each available disk by inserting the appropriate value into the table at the start of the source code file. You may easily do this with DDT, however, starting at 0103H for the first drive. Be sure to put in the hex value for your maximum user area for each drive. Put in a FF (0FFH) for each drive that is not used or available - this lovely feature allows the user to skip drives - some systems (such as HEATH/ZENITH) have drives that are not sequential. If you have used DDT to patch the file, save 12 pages for the new file. - Irv Hoff W6FFC (415) 948-2166 - voice ttributes in lower case unless wheel byte is active. (Sysop is using the system.) REVID - selects reverse video on the display, if available, to show the attribute characters $SYS, $R/O and $ARC. ULINE - selects underlining to be used to display the status line of the directory. SHOPUB - allows directory display of ZRDOS Public user areas. WHLPUB - makes SHOPUB wheel oriented. - Notes by Irv Hoff and others  This file contains the history of modifications for the SFILE.ASM file. ;====================================================================== ; 01/01/87 Added search for .ARK filetype to complement that of .ARC. ; v3.2 Various RCPM's and the like (most notably GEnie) are using ; the .ARK filetype to distinguish between true MS/DOS ; program archives (.ARC) and CP/M "MS/DOS type" program ; archives (.ARK). On a "mixed" (MS/DOS - CP/M) system it ; makes file identification somewhat easier. Hopefully, ; future standardization in the "CP/M only" world on the .ARK ; filetype will avoid confusion with "Library type" .ARC's. ; Perhaps this will occur with the release of a CP/M "MS/DOS ; style" arc(K?)hiver. Anyway... ; ; Thanks to Gary Shaffstall for his great code that made ; this a simple (read "piece of cake") change. ; - Bill Brehm ;  GEnie Mail - B.BREHM ;======================================================================= ; 10/10/86 Added ability to search ms-dos type of .ARC files. ; v31 - G.B. Shaffstall ; Sysop - Lakewood RCP/M ; 303-985-1108 ;======================================================================= ; 86/03/12 Added option to display area names instead of d/u. Many ; v30 RCPM's now use CD.COM or similar utilities to change areas ; on the hard disk. This makes d/u display of found files ; rather useless. Names must be hardwired into code at ; locations ATABLE:, BTABLE:, etc and pointers to each table ; at PTRTBL:. Also expanded 'ck' to 'checking'; too many ; users asking "What does ck mean?" ; - Ian Cottrell ;  Sysop - ICBBS ; 613-990-9774 ;======================================================================= ; 12/11/85 Fixed a bug in the abort routine which gave an inconsistent ; v26 display when activated. Placed the subroutines in a common ; area and alphabetized them so they could be easily located. ; Also edited the DOC file to be current with recent changes. ; - Irv Hoff W6FFC ;======================================================================= ; 12/08/85 Added capability for ZRDOS. Method of J. Wright. No EQU's ; v25 need be changed for ZRDOS use, as program dynamically deter- ; mines presence of ZRDOS. ; - Norman Beeler ; ZeeMachine RAS ; 408-245-1420 ;======================================================================= ; 12/05/85 Removed requirement for entering the specific BDOS address. ; v24 The distribution copy can now be used on any two-drive CP/M ; computer. Added ability to select up to 32 users areas, as ; some systems running TurboDOS, etc. have that many avail- ; able areas. Relocated the messages and data information to ; a common area at rear of program. Several other changes. ; - Irv Hoff W6FFC ;======================================================================= ; 11/14/85 Hate to do it so soon, but v22 should have included a WHEEL ; v23 check to determine if the $SYS files should be shown...why ; keep extra files around if you use the WHEEL... Set the ; equates to NOT search through libraries and put on your ; system as FILE.COM (how many library files contain $SYS ; files.....). Another nice feature added is the USELC, ; which (when set YES) will display all $SYS files with ; the attributes set in lower case - thx to Irv Hoff for ; pushing me headfirst into that very simple addition!! ; - Tom Brady ; Decibel RCP/M (404) 288-6858 ;======================================================================= ; 11/14/85 Simple code changes to provide output of files with the ; v22 SYS attribute set, especially useful for systems with hard ; disks. Set CKSYS to YES to enable this feature, and call ; it something different (obviously don't want this 'on line' ; on your RCPM, but I find it VERY useful on my system for ; searching all directory entries for those certain 'I know ; it's around here somewhere...' files - I'll get organized ; someday... but until then, searching thru all files regard- ; less of the attribute has been REAL handy. ; - Charles Blanchard ;======================================================================= ; 11/07/85 Cleaned up the extra line feeds between filenames, made the ; v21 display say "ck A0:" instead of "Searching A user 0" - this ; saved a startling amount of time on large disk systems which ; might need to print that statement 150 or more times before ; searching all user areas. This takes time, at 300/1200 bps. ; Added CKLBR equate to skip opening .LBR files. Now you can ; assemble it twice, once with CKLBR EQU NO (and put that ; online as FILE.COM), then assemble with CKLBR EQU YES (and ; put that online as SFILE.COM.) Otherwise if takes "forever" ; to look for a file on a large disk system if each library is ; searched, which usually is a waste of time. This makes a ; neat and fast FILE.COM and SFILE.COM in one package. Fixed ; the program to work with any normal assembler now (removed ; the macros, etc.) Other minor changes we think most users ; will like. - Irv Hoff & Wayne Masters ;======================================================================= ; 10/28/85 Simple code changes to provide clean screen output of ; v20 d/u searches, especially for systems with hard disks. ; Bumped version number up in case something else is out ; there since 1.4 last year. ; - Tom Brady ;======================================================================= ; 12/28/84 Updated source to be ZCPR-compatible. The program is ; v14 configurable (via the ZCPR EQUate) for operation on ; a system using ZCPR to store the maximum drive/user in ; page zero (MAXD and MAXU). Set the drive/user table to ; the maximum privileges anticipated i.e., set all to 15. ; - George Peace ;======================================================================= ; 07/18/84 Renamed file from SFF to SFILE to maintain name ; v13 compatability with the FILE utility, which doesn't check ; library files. Ran program through NEATL to make source ; code upper case, comments lower case. (It's much easier to ; work with) Cleaned up heading. Made both CTL-C and CTL-X ; work for abort. (FILE uses CTL-X) ; - Ed Svoboda ;======================================================================= ; 06/19/84 Original program coding. - Gary Shaffstall ; v12 SYSOP Lakewood RCPM ;======================================================================= b0J,ϸ#=tvǸ?iH,ϸYq'dkRYHEj|MۯIŬy$=zkץ}w[HdڃT InaMKͼw&W $Q Tŗy/9s5sXmr~X61%=; SFILE32.ASM - SuperFILE v3.2 for CP/M-80 - January 4, 1987 ; ; ; NOTE: Read the SFILE.HIS file to follow ; the ongoing history of this pgm. ; ; ; NOTE: This version assembles with ; ASM, LASM, MAC, M80 or SLRMAC ; ; ; ASEG ; Needed by the M80 assembler, ignore for others ; VER: EQU 32 ; Version 3.1 87/01/04 ; ; This program allows full wildcard searches of the directories and all ; library files on a CP/M system for a requested file, starting at A0: ; The user can optionally specify a single drive to be searched by in- ; cluding the drive name as a prefix to the search file. This is based ; on SD-81, so credit is given to the MANY people that have worked on it ; in the past. ; ; This program is particularly beneficial on a RCPM with a large disk ; system. You may wish to do the following: ; ; FILE.COM - set CKLBR option to NO ; SFILE.COM - set CKLBR option to YES ; ; This gives the users two separate programs to use - on large systems, ; it may take as long as 5-6 minutes to find a program if using SFILE, ; while searching for the same program may only take 30-40 seconds with ; FILE. ; ; Entering SFILE or SFILE ? will display a brief help message. ; ; The USER AREA PATCH TABLE is the same as in SD - if 0FFH is placed in ; an user location, that drive will be skipped. This makes it possible ; to use the program on multi-disk systems where the drive numbers are ; not necessarily sequential. ; ; The program can now be optionally assembled to support named directories. ; If the RCPM uses 'CD ' (or something similar) to change areas, ; then the program will report the name of the area rather than d/u. The ; list of directoriy names is currently 'hard wired' into the program and ; must be updated each time the area names are changed. Name tables begin ; at ATABLE:; there is one table for each drive available and pointers to ; these tables must be inserted at PTRTBL:. ;======================================================================= ; current revision ; ; 86/03/12 Added option to display area names instead of d/u. Many ; v30 RCPM's now use CD.COM or similar utilities to change areas ; on the hard disk. This makes d/u display of found files ; rather useless. Names must be hardwired into code at ; locations ATABLE:, BTABLE:, etc and pointers to each table ; at PTRTBL:. Also expanded 'ck' to 'checking'; too many ; users asking "What does ck mean?" ; - Ian Cottrell ; ICBBS ; 613-990-9774 ; ;======================================================================= ; ; NO EQU 0 YES EQU NOT NO ; (Cannot be 0FFH for some assemblers) ; CR EQU 0DH LF EQU 0AH ESC EQU 1BH ; ; ; To skip or include library searches ; CKLBR EQU YES ; YES to include .LBR searches ; NO to skip looking in .LBR files ; (then name that version FILE.COM) ; ; ZCPR Compatibility - disregard MAXD and MAXU if ZCPR is NO ; ZCPR EQU NO ; YES = ZCPR/BYE used for MAX D/U MAXD EQU 3DH ; Set to max drive location _/ / MAXU EQU 3FH ; Set to max user location ___/ ; ; ; To skip or include $SYS search and/or WHEEL check ; CKSYS EQU YES ; YES to include system files CKWHL EQU NO ; YES if you use the WHEEL WHEEL EQU 3EH ; Normal WHEEL byte location ; ; ; To display $SYS or R/O files that have attributes set, in lower-case. ; USELC EQU YES ; YES to show attribute(s) in lower case ; ; ; To use area names instead of DU: ; ; NAMDIR EQU NO ; YES to use directory names ; Be sure to change ATABLE:, BTABLE:, etc ; to reflect the area names on your system ; ; BDOS equates ; BDOS EQU 0005H FCB EQU 005CH TBUF EQU 0080H ; RDCHR EQU 1 ; Read character from console WRCHR EQU 2 ; Write character to console PRINTS EQU 9 ; Print string CONST EQU 11 ; Check console status RESET EQU 13 ; Reset disk system SELDSK EQU 14 ; Select disk OPEN EQU 15 ; 0FFH = not found CLOSE EQU 16 ; " " " SEARCH EQU 17 ; " " " NEXT EQU 18 ; " " " READ EQU 20 ; Not 0 = EOF WRITE EQU 21 ; Not 0 = disk full MAKE EQU 22 ; 0FFH = directory full CURDSK EQU 25 ; Get currently logged disk name SETDMA EQU 26 ; Set current DMA GALLOC EQU 27 ; Get address of allocation vector CURDPB EQU 31 ; Get current disk parameters CURUSR EQU 32 ; Get currently logged user number READRN EQU 33 ; Get random read RECORD EQU 36 ; Set random record number ; ARCMAR EQU 26 ; Archive header marker byte HDRSIZ EQU 27 ; Header size for archive (-4 if version = 1) FCR EQU 32 FRN EQU 33 ; ; ORG 0100H ; JMP START ; ; ;----------------------------------------------------------------------- ; ; Drive/user area lookup table ; ; Configure the following table for your specific needs. CP/M v2.2 can ; have 16 user areas (0-15), but ZCPR3 extends this to 32 user areas ; (0-31). If the ZCPR equate is set YES, you can totally disregard the ; following table, if the CLWHL is also set YES. ; ; Assuming ZCPR is set NO, then insert the maximum user area allowed for ; each drive. Put a 0FFH for all drives that are not available. This ; allows use of non-sequential drive systems. ; ; With the CKWHL equate set YES, all user areas available will then be ; searched, regardless what is placed into the following table, when the ; WHEEL byte is set high by ZCPR. ; LODRV EQU $ ; Mark beginning of drive/user table ; DB 15 ; 1) A: drive maximum user area DB 15 ; 2) B: drive maximum user area DB 0FFH ; 2) C: drive maximum user area DB 0FFH ; 2) D: drive maximum user area DB 0FFH ; 2) E: drive maximum user area DB 0FFH ; 2) F: drive maximum user area DB 0FFH ; 2) G: drive maximum user area DB 0FFH ; 2) H: drive maximum user area DB 0FFH ; 2) I: drive maximum user area DB 0FFH ; 2) J: drive maximum user area DB 0FFH ; 2) K: drive maximum user area DB 0FFH ; 2) L: drive maximum user area DB 0FFH ; 2) M: drive maximum user area DB 0FFH ; 2) N: drive maximum user area DB 0FFH ; 2) O: drive maximum user area DB 0FFH ; 2) P: drive maximum user area ; HIDRV EQU $ ; Mark end of drive/user table ; ; ;----------------------------------------------------------------------- ; ; Program starts here ; ;----------------------------------------------------------------------- ; ; START: LXI H,0 DAD SP ; HL=old stack SHLD STACK ; Save it LXI SP,STACK ; Get new stack ; XRA A STA FNDFLG ; Clear file found flag STA NEWUSR ; Make new user = 0 STA BASUSR ; Duplicate it if multi-disk mode MVI C,48 ; Get ZRDOS version CALL BDOS MOV A,L STA ZRDFLG ; Save it MVI C,12 ; Get and save the CP/M version # CALL BDOS MOV A,L STA VERFLG STA DOPFLG ; Do not allow multi-drive yet CPI 20H ; Set carry if CP/M 1.4 JC VERERR ; Exit on earlier than 2.0 LXI H,FCB+1 ; Point to name MOV A,M ; Any specified? CPI ' ' JZ GUIDE ; So print help guide CPI '?' JNZ START1 LDA FCB+2 ; Question mark by itself? CPI ' ' JZ GUIDE ; If yes, print help guide ; START1: PUSH H ; Save FCB address LXI D,SEARN ; Point to search name holding area MVI B,11 ; Size of file name, type CALL MOVE ; Move it POP H ; Restore fcb address MVI E,0FFH ; Get current user number MVI C,CURUSR CALL CPM STA OLDUSR ; Initialize startup user number ; CLNON: MVI C,CURDSK CALL CPM ; Get current disk number STA OLDDSK ; Save for reset if needed LXI H,FCB MOV A,M ; Get drive name for directory search ORA A ; Any specified? JNZ START2 ; Yes skip next routine XRA A STA DOPFLG ; Ok let multi-drive in MVI A,1 ; Otherwise, get disk 'A:' ; START2: MOV M,A ; Put the absolute drive code in FCB ; CKREST: LXI D,SIGNON CALL PRINT ; IF CKWHL LDA WHEEL ; WHEEL set? ORA A JZ CKRST1 ; NO - don't bother with $SYS files ENDIF ; CKWHL ; IF CKSYS OR CKWHL LXI D,SIGN1 CALL PRINT ENDIF ; CKSYS OR CKWHL CKRST1: LXI D,SIGN2 CALL PRINT ; LDA DOPFLG ORA A CZ SWAPEM ; Swap BDOS error vector tables ; ; ; Validate drive code and user area numbers from the drive table ; NOOPT: LXI D,DRVMSG ; Get the drive/user error message PUSH D LDA FCB ; Get directory drive code DCR A ; Normalize to range of 0-15 drives ; IF NOT ZCPR CPI HIDRV-LODRV ; Compare with maximum drives on-line JNC ERXIT ; Take drive error exit if out of range ENDIF ; NOT ZCPR ; IF ZCPR LXI H,MAXD ; Adddress to HL MOV L,M ; MAXD to L INX H ; Add one CMP L ; Check it JNC EX0 ; Exit if out of range ENDIF ; ZCPR ; LXI H,USRMSG ; Switch to user # error message XTHL MOV E,A ; Use drive code as index into table MVI D,0 ; IF NOT ZCPR USRCK: LXI H,LODRV ; Point to base of drive/user table DAD D MOV A,M ; Get the maximum user # for this drive CPI 0FFH ; Check for skip drive JZ ERXIT ; Exit if not wanted ENDIF ; NOT ZCPR ; IF ZCPR LDA MAXU SUI 1 ENDIF ; ZCPR ; USRCK2: ANI 1FH ; Make sure its in range 0-31 STA MAXUSR ; Save it for later LXI H,NEWUSR ; Point to the directory user area CMP M ; Compare it with the maximum JC ERXIT ; Take error exit if user number illegal POP D ; Destroy error message pointer LXI H,FCB+1 ; Point to name ; ; ; Make FCB all '?' to search for every file ; WCD: MVI B,11 ; Filename + filetype count ; QLOOP: MVI M,'?' ; Store '?' in FCB INX H DCR B JNZ QLOOP ; GOTFCB: MVI A,'?' ; Force wild extent STA FCB+12 CALL SETSRC ; Set DMA for BDOS media change check LXI H,FCB ; Point to fcb drive code for directory MOV E,M ; Get the drive code out of the FCB DCR E ; Normalize drive code for select MVI C,SELDSK ; Select the directory drive to retrieve CALL CPM ; The proper allocation vector MVI C,CURDPB ; It is 2.x or MP/M...request DPB CALL BDOS INX H INX H MOV A,M ; Get block shift STA BLKSHF INX H ; Bump to block mask MOV A,M STA BLKMSK  ; Get it INX H INX H MOV E,M ; Get max block # INX H MOV D,M XCHG SHLD BLKMAX ; Save it XCHG INX H MOV E,M ; Get directory size INX H MOV D,M XCHG SHLD DIRMAX ; Save max # of entries in directory ; ; ; Re-enter here on subsequent passes while in the all-users mode ; SETTBL: LDA FCB IF NOT NAMDIR ADI 'A'-1 STA PROC1 LXI D,PROCES ; Show the user what area is being CALL PRINT ; worked on LDA NEWUSR STA LSTUSR CALL TYPUSR LXI D,PROC2 CALL PRINT ENDIF ; NOT NAMDIR IF NAMDIR CALL PRTNAM LXI D,PROCES CALL PRINT ENDIF ; NAMDIR ; SETTB1: LHLD DIRMAX ; Get directory maximum again INX H ; Directory size is DIRMAX+1 DAD H ; Double directory size LXI D,ORDER ; To get size of order table DAD D ; Allocate order table SHLD TBLOC ; Name table begins after order table SHLD NEXTT XCHG LHLD BDOS+1 ; Make sure we have room to continue MOV A,E SUB L MOV A,D SBB H JNC OUTMEM LDA NEWUSR ; Get user area for directory MOV E,A MVI C,CURUSR ; Get the user function CALL CPM ; And set new user number ; ; ; Look up the FCB in the directory ; MVI A,'?' LXI H,FCB+12 MOV M,A ; Match all extents INX H MOV M,A ; Match all S1 bytes INX H MOV M,A ; Match all S2 bytes LXI H,0 SHLD COUNT ; Initialize match counter CALL SETSRC ; Set DMA for directory search MVI C,SEARCH ; Get 'SEARCH FIRST' function JMP LOOK ; And go search for 1st match ;..... ; ; ; Read more directory entries ; MORDIR: MVI C,NEXT ; Search next ; LOOK: LXI D,FCB CALL CPM ; Read directory entry INR A ; Check for end (0FFH) JZ SPRINT ; If no more, sort & print what we have ; ; ; Point to directory entry ; SOME: DCR A ; Undo prev 'INR A' ANI 3 ; Make modulus 4 ADD A ; Multiply by 32 as each entry is 32 ADD A ; bytes long ADD A ADD A ADD A LXI H,TBUF+1 ; Point to buffer (skip to filename) ADD L ; Point to entry ADI 9 ; Point to .SYS byte MOV L,A ; Save (can't carry to 'H') ; IF CKWHL LDA WHEEL ; WHEEL set? ORA A JNZ SYSFOK ; YES - show $SYS files, too ENDIF ; CKWHL ; IF CKSYS AND (NOT CKWHL) JMP SYSFOK ; Show system files too ENDIF ; CKSYS AND (NOT CKWHL) ; MOV A,M ; Get .SYS byte ORA A ; Check bit 7 JM MORDIR ; Skip that file ; SYSFOK: MOV A,L ; Go back now SUI 10 ; Back to user number (allocation flag) MOV L,A ; Hl points to entry now LDA NEWUSR ; Get current user CMP M JNZ MORDIR ; Ignore if different INX H ; ; ; Move entry to table ; XCHG ; Entry to DE LHLD NEXTT ; Next table entry to HL MVI B,11 ; Entry length (name, type, extent) ; TMOVE: LDAX D ; Get entry character ; IF NOT USELC ANI 7FH ; Remove attributes ENDIF ; NOT USELC ; MOV M,A ; Store in table INX D INX H DCR B ; More? JNZ TMOVE INX D ; DE->> S1 INX D ; DE->> S2 LDAX D ; Get S2 byte, overflow=int(extents/32) PUSH H ; Save HL MOV L,A ; Set up 16-bit multiply MVI H,0 MVI B,5 CALL SHLL ; HL is now # of overflow extents DCX D ; DE->> S1 DCX D ; DE->> extent LDAX D ; Get extent ADD L MOV L,A MOV A,H ACI 0 MOV H,A ; HL now has total extents MVI B,7 CALL SHLL ; HL now has total records less last ext INX D ; DE->> S1 INX D ; DE->> S2 INX D ; Point to record count LDAX D ; Get it ADD L MOV L,A MOV A,H ACI 0 MOV H,A ; HL now has total records XTHL ; Do some fancy shuffling XCHG XTHL XCHG MOV M,D INX H MOV M,E POP D ; All back to normal INX H SHLD NEXTT ; Save updated table address XCHG LHLD COUNT ; Bump the # of matches made INX H SHLD COUNT LXI H,13 ; Size of next entry DAD D XCHG ; Future NEXTT is in DE LHLD BDOS+1 ; Pick up TPA end MOV A,E SUB L ; Compare NEXTT-TPA end MOV A,D SBB H JC MORDIR ; If TPA end > NEXTT, loop back for more ; OUTMEM: CALL ERXIT ; Exit if directory too large DB 'Memory',0 ;..... ; ; ;----------------------------------------------------------------------- ; s u b r o u t i n e s ;----------------------------------------------------------------------- ; ; ; Fetch character from console (without echo) ; CINPUT: LHLD 0001H MVI L,9 CALL GOHL ANI 7FH RET ;..... ; ; ; Check for a CTL-C or CTL-S entered from the keyboard. Jump to exit ; if CTL-C, pause on CTL-S. ; CKABRT: LHLD 0001H MVI L,6 ; Check status of keyboard CALL GOHL ; Any key pressed? ORA A RZ ; No, return to caller CALL CINPUT ; Get character CPI 'C'-40H ; CTL-C? JZ EX0 ; If yes then quit CPI 'X'-40H ; CTL-X? JZ EX0 ; If yes then quit CPI 'S'-40H ; CTL-S? RNZ ; No, return to caller CALL CINPUT ; Yes, wait for another char. CPI 'C'-40H ; Might be CTL-C JZ EX0 ; If yes then quit CPI 'X'-40H ; Might be CTL-X JZ EX0 ; If yes fall through and continue RET ;..... ; ; ; Test file extent for LBR ; CKLBRY: PUSH H PUSH D PUSH B XCHG LXI H,LBRTYP MVI C,3 ; CKLBL: LDAX D ANI 7FH CMP M JNZ CKLBX INX H INX D DCR C JNZ CKLBL CKLBX: POP B POP D POP H RET ;..... ; ; ; Test file extent for ARC or ARK ; CKARC: PUSH H PUSH D PUSH B XCHG LXI H,ARCPRE MVI C,2 ; CKARL: LDAX D ANI 7FH CMP M JNZ CKARX INX H INX D DCR C JNZ CKARL ; LXI H,ARCTY1 LDAX D ANI 7FH CMP M JZ CKARX ; LXI H,ARCTY2 CMP M ; CKARX: POP B POP D POP H RET ARCPRE: DB 'AR' ARCTY1: DB 'C' ARCTY2: DB 'K' ;..... ; ; ; Check to see if there indeed is a library file directory ; CKLDIR: MVI B,11 ; Length of file name MVI A,' ' ; Space INX H ; CKDLP: CMP M JNZ LMLEXI DCR B INX H JNZ CKDLP ; ; ; The first entry in the LBR directory is indeed blank. Now see if the ; directory size is >0 ; MOV E,M ; File starting location low INX H ; Must be zero here MOV A,M ; File starting location high ORA E ; Must be zero here also JNZ LMLEXI INX H MOV E,M ; Get library size low INX H ; Point to library size high MOV D,M ; Get library size high MOV A,D ORA E ; Library must have some size JZ LMLEXI DCX D XCHG SHLD SLFILE MVI B,3 LXI H,17 DAD D PUSH H LHLD TLIBRA INX H SHLD TLIBRA POP H JMP LMTEST ;..... ; ; ; New compare routine ; COMPARE:LXI B,ORDER-2 DAD H DAD B XCHG DAD H DAD B XCHG MOV C,M INX H MOV B,M XCHG MOV E,M INX H MOV D,M XCHG MOV E,A ; Count ; CMPLPE: MOV A,M ANI 7FH MOV D,A LDAX B ANI 7FH CMP D INX B INX H RNZ DCR E JNZ CMPLPE RET ;..... ; ; ; Compare routine for sort ; COMPR: PUSH H ; Save table address MOV E,M ; Load low order INX H MOV D,M ; Load high order INX H MOV C,M INX H MOV B,M ; ; ; BC, DE now point to entries to be compared ; XCHG MOV E,A ; Get count ; CMPLP: MOV A,M ANI 7FH MOV D,A LDAX B ANI 7FH CMP D INX H INX B JNZ NOTEQL ; Quit on mismatch DCR E ; Or end of count JNZ CMPLP ; NOTEQL: POP H RET ; Cond code tells all ;..... ; ; ; Entry to BDOS saving all extended registers ; CPM: PUSH B PUSH D PUSH H LDA ZRDFLG ; ZRDOS running? ORA A JNZ ZRD ; ZRDOS error trap and DOSs call CALL BDOS MOV B,A ; Save return code LDA VERFLG ; Is this 3.0? CPI 30H MOV A,B JC CPM20 ; No, exit normally CPI 0FFH ; It is 3.0 - was return code ff? JNZ CPM20 ; No, exit normally MOV A,H ; 3.0 and A=FF - check for error code ORA A JNZ DSKERR ; Trap out if we got a physical error MOV A,B ; Else continue normally ; CPM20: POP H POP D POP B RET ;..... ; ; ; Start a new line ; CRLF: MVI A,CR ; Send CR CALL TYPE MVI A,LF ; Send LF JMP TYPE ; Exit to caller from TYPE ;..... ; ; ; Print HL in decimal with leading zero suppression ; DECPRT: XRA A ; Clear leading zero flag STA LZFLG LXI D,-1000 ; Print 1000'S DIGIT CALL DIGIT LXI D,-100 ; Etc. CALL DIGIT LXI D,-10 CALL DIGIT MVI A,'0' ; Get 1'S DIGIT ADD L JMP TYPE ; DIGIT: MVI B,'0' ; Start off with ASCII 0 ; DIGLP: PUSH H ; Save current remainder DAD D ; Subtract JNC DIGEX ; Quit on overflow POP PSW ; Throw away remainder INR B ; Bump digit JMP DIGLP ; Loop back ; DIGEX: POP H ; Restore pointer MOV A,B CPI '0' ; Zero digit? JNZ DIGNZ ; No, type it LDA LZFLG ; Leading zero? ORA A MVI A,'0' JNZ TYPE ; Print digit LDA SUPSPC ; Get space suppression flag ORA A ; See if printing file totals RZ ; Yes, don't give leading spaces MVI A,' ' JMP TYPE ; Leading zero, so print space ; DIGNZ: STA LZFLG ; Leading zero flag so next zero prints JMP TYPE ; And print digit ;..... ; ; ; Compute the size of the file/library and update our summary datum. ; This has been changed into a subroutine so that both the file size ; computation and a library size (when printing out library members) ; can be computed in k. ; DOIT: MOV E,M ; Get extent # MVI D,0 INX H MOV A,M ; Get record count of last extent XCHG DAD H ; # of extents times 16k DAD H DAD H DAD H XCHG ; Save in DE LXI H,BLKMSK ADD M ; Round last extent to block size RRC RRC ; Convert from records to k RRC ANI 1FH MOV L,A ; Add to total k MVI H,0 DAD D LDA BLKMSK ; Get records/blk-1 RRC RRC ; Convert to k/blk RRC ANI 1FH CMA ; Use to finish rounding ANA L MOV L,A RET ;..... ; ; ; Recovery point from intercepted BDOS select and bad sector errors. ; DSKERR: LXI SP,STACK ; Get out of BDOS' STACK JMP EXIT ; And exit back to CCP ;..... ; ; ; Output the directory files we've matched. ; ENTRY: LHLD COUNT DCX H ; Dock file count SHLD COUNT MOV A,H ; Is this the last file? ORA L JZ OKPRNT ; If count=0, last file so skip compare ; ; ; Compare each entry to make sure that it isn't part of a multiple ex- ; tent file. Go only when we have the last extent of the file. ; CALL CKABRT ; Check for abort code from keyboard LHLD NEXTT MVI A,11 CALL COMPR ; Does this entry match next one? JNZ OKPRNT ; No, print it INX H INX H ; Skip since highest extent last in list SHLD NEXTT JMP ENTRY ; Loop back for next lowest extent ;..... ; ; ENTRYL: LHLD LCOUNT ; Get FCB count DCX H ; Decrement it SHLD LCOUNT MOV A,H ; Is this the last file? ORA L JZ LBRTST ; If count=0, last file skip compare PUSH B CALL CKABRT ; Check for abort code from keyboard LHLD NEXTL MVI A,11 CALL COMPR ; Does this entry match next one? POP B JNZ LBRTST ; No, print it INX H INX H ; Skip, highest extent comes last in list SHLD NEXTL JMP ENTRYL ; Loop back for next lowest extent ;..... ; ; ; Error exit ; ERXIT: CALL CRLF ; Space down POP D ; Get pointer to message string CALL PRINT ; Print it LXI D,ERRMS1 ; Print " error" CALL PRINT CALL CRLF ; Space down ; ; ; Exit - all done restore stack ; EXIT: LDA DOPFLG ; Check multi disk mode ORA A JNZ EX0 CALL CKABRT ; Check for user abort first ; IF NOT ZCPR MVI A,HIDRV-LODRV ; Get maximum drive code to search ENDIF ; NOT ZCPR ; IF ZCPR LDA MAXD ENDIF ; ZCPR ; LXI H,FCB ; Bump directory fcb drive code INR M CMP M ; Does next disk exceed maximum? JC EX0 JMP NOOPT ; Search next disk if MAXDR not true ;..... ; ; ; Prints the ending results ; EX0: LXI D,CLEAR CALL PRINT IF NAMDIR LXI D,AREA ; Show the last area searched CALL PRINT ENDIF ; NAMDIR IF NOT NAMDIR LXI D,PROC1 ; Show the last drive searched CALL PRINT LDA LSTUSR STA NEWUSR CALL TYPUSR ; Show the last user area searched LXI D,PROC2 CALL PRINT ENDIF ; NOT NAMDIR XRA A ; Be sure space suppress flag is set STA SUPSPC ; IF CKLBR LXI D,TLMSG CALL PRINT LHLD TLIBRA CALL DECPRT ENDIF ; CKLBR ; LXI D,TMMSG CALL PRINT LHLD TMATCH CALL DECPRT LXI D,TCMSG CALL PRINT LHLD TFILES CALL DECPRT ; CALL CRLF ; Just for neatness MVI C,CONST ; Check console status CALL CPM ORA A ; Char waiting? MVI C,RDCHR CNZ CPM ; Gobble up character LDA VERFLG ; Or error mode, depending on version CPI 30H JC EXIT0 MVI C,45 MVI E,0 ; Set error mode back to default CALL CPM JMP EXIT1 ; EXIT0: LDA DOPFLG ; If they were swapped ORA A CZ SWAPEM ; EXIT1: LHLD STACK ; Get old stack pointer SPHL ; Move back to old stack RET ; And return to CCP ;..... ; ; ; Kludge to allow call to address in HL ; GOHL: PCHL JMP CPM ;..... ; ; GUIDE: LXI D,HELP ; Print help information CALL PRINT ; IF CKWHL LDA WHEEL ; WHEEL set? ORA A JZ GUIDE1 ; NO - don't bother with $SYS files ENDIF ; CKWHL ; IF CKSYS OR CKWHL LXI D,HELP1 CALL PRINT ENDIF ; CKSYS OR CKWHL ; GUIDE1: LXI D,HELP2 JMP VERER1 ;..... ; ; ; Close the library file ; LBCLOSE:LXI D,LBRFCB MVI C,CLOSE CALL CPM RET ;..... ; ; ; Exit library member printing ; LBEXIT: XRA A ; Get a zero to... STA SUPSPC ; Suppress leading spaces in totals RET ;..... ; ; ; At least one more file to output - can we put it on the current line? ; LBGNXT: POP B POP H JMP LMTESA ; And go output another file ; COMPS: PUSH H PUSH D PUSH B LXI B,SEARN MVI E,11 ; COMPS1: MOV A,M ANI 7FH MOV D,A LDAX B INX B INX H ANI 7FH CPI '?' JZ COMPS2 CMP D JNZ COMPS3 ; COMPS2: DCR E JNZ COMPS1 ; COMPS3: POP B POP D POP H RET ;..... ; ; ; Valid entry obtained - spit it out ; LBRTST: MVI A,1 ; Set not an .ARC/.ARK file as default STA ISARC ; in type of file flag. LHLD NEXTL ; Get order table pointer MOV E,M ; Get low order address INX H MOV D,M ; Get high order address INX H SHLD NEXTL ; Save updated table pointer LXI H,8 DAD D CALL CKLBRY JZ LBRSET ; It's a library so skip .ARC/.ARK test CALL CKARC ; Check if current file is a .ARC/.ARK JNZ LBRNEX XRA A STA ISARC ; Save current file type is archive LBRSET: PUSH D POP H ; ; ; Saves the library file name into LBRFCB ; LDA FCB LXI D,LBRFCB ; To STAX D INX D MVI B,11 ; Length CALL MOVE ; Do the move XCHG MVI B,25 ; CLMFCB: MVI M,0 INX H DCR B JNZ CLMFCB CALL SETLDMA LXI D,LBRFCB ; Point to file MVI C,OPEN ; Get function CALL CPM ; Open it MVI C,READ LXI D,LBRFCB CALL CPM CALL SETFOP LXI H,LBBUF MOV A,M ORA A JZ CKLDIR ; Check directory present? LDA ISARC ; Was file a .ARC/.ARK file ORA A JNZ LMLEXI ; No so error MOV A,M ; Get buffer byte again CPI ARCMAR ; is an archive mark ? JZ CKADIR ; Yep so Check directory present? ; LMLEXI: CALL LBCLOSE ; ; ; Do next library file ; LBRNEX: LHLD LCOUNT ; Check count MOV A,H ORA L JZ LBEXIT ; No more, all done JMP ENTRYL ; Else, get next .lbr file ;..... ; ; LFMLOP: LHLD SLFILE ; Get MOV A,L ORA H JZ LMLEXI DCX H SHLD SLFILE CALL SETLDMA MVI C,READ LXI D,LBRFCB CALL CPM CALL SETFOP MVI B,4 ; Get file count per record LXI H,LBBUF ; Get buffer starting address ; LMTEST: MOV A,M ; Get member open flag ORA A ; Test for open JZ PRMNAM ; LMTESA: LDA ISARC ; Test if we are doing an archive file ORA A RZ ; Just return if .ARC/.ARK LXI D,32 ; Member not open get offset DAD D ; To next and add it in. DCR B ; Is buffer empty ? JNZ LMTEST ; No so test next entry JMP LFMLOP ; Yes get next buffer... ; ;..... ; ; ;------------------------------------------------ ; Archive file subroutines ;------------------------------------------------ ; CKADIR: XRA A DCR A STA GETABL ; Say buffer is full (first read by lbr test) LHLD TLIBRA ; Bump library count total INX H SHLD TLIBRA ARCLP: CALL GET ; Get the next character from buffer CPI ARCMAR ; Is it archive header marker? JNZ LMLEXI ; and abort if not CALL GET ; Get header version ORA A ; If zero, that's logical end of file, JZ LMLEXI ; and we're done LXI D,ANAME ; Set to fill header buffer MVI B,HDRSIZ ; Setup normal header size less file name CPI 1 ; But test if version 1 JNZ GETHD1 ; Skip if not version 1 LXI B,HDRSIZ-4 ; Else, header is 4 bytes less GETHD1: CALL GET ; Get header byte STAX D ; Store in buffer INX D DCR B JNZ GETHD1 ; Loop for all bytes LXI H,ARCFIL ; Prefill dummy arc fcb name with spaces MVI B,11 FIXAN: MVI M,' ' INX H DCR B JNZ FIXAN MVI B,5 ; Prefill rest of dummy fcb with zero FIXAE: MVI M,0 INX H DCR B JNZ FIXAE LXI H,ANAME ; Get pointer to archive header buffer LXI D,ARCFIL ; Point to our dummy fcb MVI B,8 ; Get name length MANAME: MOV A,M ; Get character from header INX H ORA A JZ AEDONE ; Nothing in buffer so we're done CPI 02EH ; Is the char a point JZ DAEXT ; DO FILE EXTENT STAX D INX D DCR B JNZ MANAME DAEXT: LXI D,ARCFIL+8 ; Get dummy file extent address MVI B,3 MOV A,M CPI 2EH JNZ AELOP INX H AELOP: MOV A,M ; Fill in the file extent ORA A JZ AEDONE STAX D INX H INX D DCR B JNZ AELOP AEDONE: LXI H,ASIZE MOV E,M ; Fetch BCDE from (HL) INX H MOV D,M INX H MOV C,M XRA A ; Clear flags MOV A,E ; Convert file length count in bytes RAL ; to length in records for output MOV A,D RAL MOV E,A MOV A,C RAL MOV D,A XCHG SHLD ARCFIL+13 ; Save file length LXI H,ARCFIL-1 ; Point to dummy fcb CALL PRMNAM ; List the file info LXI H,ASIZE ; Get remaining file size MOV A,M ANI 7FH LHLD ARCFIL+13 ; Save file length XCHG ; Save record offset LXI H,GETABL ; Point to offset of last byte read ADD M ; Add byte offsets CPI 80H ; Does it overflow current record? JC NRAD SUI 80H ; Adjust pointer INX D ; Bump record number NRAD: MOV M,A ; Update buffer ptr for new position MOV A,D ; Check record offset ORA E JZ LEXIT ; Return if none (still in same record) SEEK2: PUSH D ; Save record offset LXI D,LBRFCB MVI C,RECORD ; Compute current "random" record no. CALL CPM ; (I.e. next sequential record to read) LHLD LBRFCB+FRN ; Get result DCX H ; Adjust next record to current record POP D ; Restore record offset DAD D ; Compute new record no. JC LMLEXI ; If >64k, it's past largest (8 Mb) file SHLD LBRFCB+FRN ; Save new record no. MVI C,READRN ; Read the random record CALL GETREC ORA A JNZ LMLEXI ; File read error LXI H,LBRFCB+FCR ; Point to current record in extent INR M ; Bump for subsequent sequential read LEXIT: JMP ARCLP ; Loop for next file ;..... ; ; ; Get next sequential byte from archive file ; GET: PUSH B ; Save registers PUSH D PUSH H LDA GETABL ; Point to last byte read INR A ; At end of buffer? CPI 80H CNC GETNXT ; Yes, read next record and reset ptr STA GETABL ; Save new buffer ptr MOV L,A MVI H,0 LXI D,LBBUF DAD D MOV A,M ; Fetch byte from there POP H ; Restore registers POP D POP B RET ; Return ;..... ; ; ; Get next sequential record from archive file ; GETNXT: MVI C,READ ; Setup read-sequential function code CALL GETREC ORA A JNZ RDERR PUSH PSW XRA A DCR A STA GETABL POP PSW RET RDERR: POP H ; Strip getnxt return POP H ; Clean up the get stack POP D POP B POP H ; strip get calling address JMP LMLEXI ; Show error ;..... ; ; ; Get record (sequential or random) from archive file ; GETREC: PUSH H PUSH B CALL SETLDMA ; Set library DMA address LXI D,LBRFCB ; Setup FCB address POP B ; Restore read function CALL CPM ; Do it PUSH PSW ; Save read status CALL SETFOP ; Reset Print file DMA address POP PSW ; Restore read status POP H ; Restore buffer ptr RET ;..... ; ; ; Move characters from 'HL' to 'DE' length in 'B' ; MOVE: MOV A,M ; Get a character STAX D ; Store it INX H ; To next 'FROM' INX D ; To next 'TO' DCR B ; More? JNZ MOVE ; Yes, loop RET ; No, return ;..... ; ; ; Sort is all done - print entries that compare ; NOOUT: LHLD COUNT SHLD LCOUNT LXI H,ORDER ; Initialize order table pointer SHLD NEXTL SHLD NEXTT JMP ENTRY ;..... ; ; ; Directory for one user area completed. If 'ALL USERS' option is se- ; lected, then go do another directory on the next user number until we ; exceed the maximum user # for the selected drive. ; NXTUSR: CALL CKABRT ; Check for user abort first LDA MAXUSR ; No abort - get maximum user number LXI H,NEWUSR ; Bump directory user number INR M CMP M ; Does next user # exceed maximum? JNC SETTBL ; Continue if more user areas to go LDA BASUSR ; Reset base user number for the MOV M,A ; Next directory search ; ; ; Directory for all user areas completed. If the multi-disk option is ; enabled and selected, reset to the base user area and repeat the di- ; rectory for next drive on-line until we either exceed the drives in ; our LODRV-HIDRV table, or the BDOS shuts us down with a select or bad ; sector error, which will be intercepted back to the exit module. ; NXTDSK: LXI H,FNDFLG ; Get file found flag MVI M,0 ; Clear file found flag for next drive ; NDSK: LDA DOPFLG ; See if the flag is set now ORA A JNZ EXIT ; If yes, all done CALL CKABRT ; Check for user abort first MVI A,HIDRV-LODRV ; Get maximum drive code to search LXI H,FCB ; Bump directory FCB drive code INR M CMP M ; Does next disk exceed maximum? JC EXIT MOV E,M MVI D,0 DCR E LXI H,LODRV DAD D MOV A,M CPI 0FFH JZ NDSK ; Search next disk if MAXDR not true JMP NOOPT ;..... ; ; OKPRNT: LHLD NEXTT ; Get order table pointer MOV E,M ; Get low order address INX H MOV D,M ; Get high order address INX H SHLD NEXTT ; Save updated table pointer XCHG ; Table entry to HL ; ; ; Put in user and drive printout here ; PUSH H ; Save the current address LHLD TFILES INX H SHLD TFILES POP H CALL COMPS ; Match what we are looking for ? JNZ OKEXIT ; No, so don't print it PUSH H LHLD TMATCH INX H SHLD TMATCH POP H MVI A,CR CALL TYPE LDA FCB ; Precede new line with drive name IF NAMDIR CALL PRTNAM ; Type area name LXI D,AREA CALL PRINT ENDIF ; NAMDIR IF NOT NAMDIR ADI 'A'-1 CALL TYPE CALL TYPUSR ENDIF ; NOT NAMDIR MVI A,':' ; Tag header with a colon and a space CALL TYPE ; And exit back to entry MVI A,' ' CALL TYPE IF NOT NAMDIR LDA NEWUSR CPI 10 JNC OVER9  MVI A,' ' CALL TYPE ENDIF ; NOT NAMDIR ; OVER9: MVI B,8 ; File name length CALL TYPENM ; Type filename MVI A,'.' ; Period after filename CALL TYPE MVI B,3 ; Display 3 characters of filetype CALL TYPEXT MOV D,M INX H MOV E,M ; Size in DE (records) LDA BLKMSK PUSH PSW ADD E MOV E,A MOV A,D ACI 0 MOV D,A POP PSW CMA ANA E MOV E,A ; Size in DE MVI B,3 ; SHRR: MOV A,D ORA A RAR MOV D,A MOV A,E RAR MOV E,A DCR B JNZ SHRR XCHG ; Get file size ; ; ; Output the size of the individual file. ; CALL DECPRT ; Go print it MVI A,'k' ; And follow with k size CALL TYPE CALL CRLF MVI A,0FFH STA FNDFLG ; Set file found flag ; ; ; One file output - test to see if we have to output another one. ; OKEXIT: LHLD COUNT ; Get current file counter and test it MOV A,H ORA L JZ PRTOTL ; If no more files exit to summary output JMP ENTRY ;..... ; ; OVER91: MVI B,8 ; File name length CALL TYPENM MVI A,'.' ; Period after  file name CALL TYPE MVI B,3 ; Display 3 characters of filetype CALL TYPEXT INX H INX H MOV E,M INX H MOV D,M XCHG ; ; ; Output the size of the individual file. ; PUSH D PUSH H PUSH H LHLD LLENLOC PUSH H POP D POP H DAD D SHLD LLENLOC POP H ; ; ; New code added to convert .LIB members from records to 'k'. Upon ; entry, member's size in records is in HL ; XCHG ; Put it in DE LXI H,0 ; Zero out HL MOV A,E ; Put low byte of record count in a ADI 7 ; Add seven to always round up 1k RRC ; Convert it to k RRC RRC ANI 1FH MOV E,A ; And put it back MOV L,D ; Get the high byte if any MVI D,0 ; Clean out the old resting place DAD H ; Multiply it by 32 to convert to DAD H ; Number DAD H ; Of DAD H ; k DAD H ; Bytes DAD D ; And add in the low byte POP D CALL DECPRT ; Go print it MVI A,'k' ; And follow with size CALL TYPE LXI H,INLBF MVI B,6 CALL TYPENM LXI H,LBRFCB+1 MVI B,8 ; File name length CALL TYPENM MVI A,'.' ; Period after file name CALL TYPE MVI B,3 ; Display 3 characters of filetype CALL TYPEXT CALL CRLF ; So we can still see it! MVI A,0FFH STA FNDFLG ; Set file found flag JMP LBGNXT ;..... ; ; ; Print string terminated with '0' character ; PRINT: LDAX D ORA A RZ ; If zero, finished CALL TYPE ; Display on CRT INX D JMP PRINT ;..... ; ; PRTLMEM: IF NOT CKLBR XRA A RET ; Skip library checks ENDIF ; NOT CKLBR ; LXI H,SEARN+8 CALL CKLBRY RZ LXI H,ORDER ; Initialize order table pointer SHLD NEXTL JMP ENTRYL ;..... ; ; PRMNAM: PUSH H ; Print member name and size PUSH B CALL CKABRT ; Check for abort code from keyboard ; PRMNA1: POP B POP H PUSH H PUSH B INX H PUSH H LHLD TFILES INX H SHLD TFILES POP H CALL COMPS ; Match what we are looking for ? JNZ LBGNXT PUSH H LHLD TMATCH INX H SHLD TMATCH POP H MVI A,CR CALL TYPE LDA FCB ; Precede new line with drive name IF NAMDIR CALL PRTNAM ; Print area name LXI D,AREA CALL PRINT ENDIF ; NAMDIR IF NOT NAMDIR ADI 'A'-1 CALL TYPE CALL TYPUSR ENDIF ; NOT NAMDIR MVI A,':' ; Tag header with a colon and a space CALL TYPE ; And exit back to entry MVI A,' ' CALL TYPE IF NOT NAMDIR LDA NEWUSR CPI 10 JNC OVER91 MVI A,' ' CALL TYPE ENDIF ; NOT NAMDIR JMP OVER91 ;..... ; ; PRTNAM prints the name of the area being searched ; IF NAMDIR PRTNAM: PUSH H ; Save regs PUSH B DCR A ; Adjust - 0=A, 1=B, etc LXI H,PTRTBL ; Point to table of pointers ADD A ; Calculate offset into table MOV C,A MVI B,0 DAD B MOV A,M INX H MOV H,M MOV L,A ; HL now points to name table for drive LDA NEWUSR ; Now calc offset into that table STA LSTUSR ADD A ; *2 ADD A ; *4 ADD A ; *8 MOV C,A ; To BC MVI B,0 DAD B MVI B,8 ; 8 characters in each name LXI D,AREA ; Point to storage buffer AREALP: MOV A,M ; Move name STAX D INX H INX D DCR B JNZ AREALP XRA A STAX D ; Terminator POP B POP H RET ENDIF ; NAMDIR ;..... ; ; ; Now check for libraries ; PRTOTL: LHLD LCOUNT ; How many files did we see? MOV A,H ORA L CNZ PRTLMEM ; Skip the .lbr check if none found XRA A ; Get a zero to... STA SUPSPC ; Suppress leading spaces in totals JMP NXTUSR ;..... ; ; ; Reset Warm Boot Trap in ZRDOS ; RESTRAP:PUSH H PUSH D PUSH B PUSH PSW MVI C,52 ; Reset warm boot trap CALL BDOS POP PSW POP B POP D POP H RET ;..... ; ; ; For file output mode, return to old user area and set dma for the file ; output buffer. ; SETFOP: LDA OLDUSR ; Get user number at startup MOV E,A MVI C,CURUSR CALL CPM ; Reset the old user number RET ;..... ; ; ; Set the library file DMA address ; SETLDMA:LDA NEWUSR ; Get user area for directory MOV E,A MVI C,CURUSR ; Get the user function CALL CPM ; And set new user number LXI D,LBBUF MVI C,SETDMA CALL CPM RET ;..... ; ; ; Move disk buffer dma to default buffer for directory search operations ; and BDOS media change routines (necessary for pre-CP/M 2 systems while ; in file output mode with an active buffer). ; SETSRC: LXI D,TBUF ; SET2: MVI C,SETDMA JMP CPM ;..... ; ; ; Set Warm Boot Trap in ZRDOS ; SETTRAP:PUSH H PUSH D PUSH B MVI C,50 ; Set warm boot trap to come here LXI D,WBTRAP CALL BDOS POP B POP D POP H RET ;..... ; ; ; Shift HL left by B bits ; SHLL: DAD H DCR B RZ JMP SHLL ;..... ; ; ; This sort routine is adapted from Software Tools by Kernigan and ; Plaugher. ; SORT: LHLD SCOUNT ; Number of entries ; L0: ORA A ; Clear carry MOV A,H ; GAP=GAP/2 RAR MOV H,A MOV A,L RAR MOV L,A ORA H ; Is it zero? JZ NOOUT ; Then none left MOV A,L ; Make GAP odd ORI 1 MOV L,A SHLD GAP INX H ; I=GAP+1 ; L2: SHLD I XCHG LHLD GAP MOV A,E ; J=I-GAP SUB L MOV L,A MOV A,D SBB H MOV H,A ; L3: SHLD J XCHG LHLD GAP ; JG=J+GAP DAD D SHLD JG MVI A,13 ; Compare 13! characters CALL COMPARE ; Compare (J) and (JG) JP L5 ; If A(J)<=A(JG) LHLD J XCHG LHLD JG CALL SWAP ; Exchange A(J) and A(JG) LHLD J ; J=J-GAP XCHG LHLD GAP MOV A,E SUB L MOV L,A MOV A,D SBB H MOV H,A JM L5 ; If J>0 goto l3 ORA L ; Check for zero JZ L5 JMP L3 ; L5: LHLD SCOUNT ; For later XCHG LHLD I ; I=I+1 INX H MOV A,E ; If I<=N goto l2 SUB L MOV A,D SBB H JP L2 LHLD GAP JMP L0 ;..... ; ; ; Sort ; SPRINT: CALL SETFOP ; Return to file output DMA & user # LHLD COUNT ; Get file name count MOV A,L ORA H ; Any found? JZ PRTOTL ; Exit if no files found PUSH H ; Save file count STA SUPSPC ; Enable leading zero suppression ; ; ; Initialize the order table ; LHLD TBLOC ; Get start of name table XCHG ; Into DE LXI H,ORDER ; Point to order table LXI B,13 ; Entry length ; BLDORD: MOV M,E ; Save low order address INX H MOV M,D ; Save high order address INX H XCHG ; Table address to HL DAD B ; Point to next entry XCHG XTHL ; Save table addr, fetch loop counter DCX H ; Count down loop MOV A,L ORA H ; More? XTHL ; (restore table address, save counter) JNZ BLDORD ; Yes, go do another one POP H ; Clean loop counter off stack LHLD COUNT ; Get count SHLD SCOUNT ; Save as # to sort DCX H ; Only 1 entry? MOV A,L ORA H JZ NOOUT ; Yes, so skip sort JMP SORT ;..... ; ; ; Swap entries in the order table ; SWAP: LXI B,ORDER-2 ; Table base DAD H ; *2 DAD B ; + base XCHG DAD H ; *2 DAD B ; + base MOV C,M LDAX D XCHG MOV M,C STAX D INX H INX D MOV C,M LDAX D XCHG MOV M,C STAX D RET ;..... ; ; SWAP20: LHLD BDOS+1 ; Get pointer to base of BDOS INX H ; Swap in the new pointer if running a MOV E,M ; Program below the CCP INX H MOV D,M XCHG ; Now HL points to the proper vector MVI L,9 ; Point to record error vector LXI D,VECTBL ; Exchanging with our own vector table MVI A,4 ; 4 bytes to swap ; SWAPLP: MOV B,M ; Get byte from HL XCHG MOV C,M ; Get byte from DE MOV M,B ; Put byte from HL XCHG MOV M,C ; Put byte from DE INX H ; Bump exchange pointers INX D DCR A ; Dock counter JNZ SWAPLP ; Continue swapping til done RET ;..... ; ; ; Trap BDOS select and sector error vectors to our own intercept routine ; so we can catch a reference to an illegal drive. ; SWAPEM: LDA ZRDFLG ; See if ZRDOS running ORA A RNZ ; Yes, quit this LDA VERFLG ; Check version CPI 30H ; See if error mode call is available JC SWAP20 ; If not, use BDOS error vectors MVI C,2DH MVI E,0FFH ; Use set error mode call CALL CPM ; Set "return code only" mode RET ;..... ; ; ; Output character in a to console, and optionally to printer and/or the ; output file. ; TYPE: PUSH B PUSH D PUSH H PUSH PSW ; Save the character to output CALL TYPE1 ; Send it to console POP PSW ; Restore the output character ; TYPRET: POP H ; Exit from type POP D POP B RET ;..... ; ; ; Print a string at HL of length B, retains any high bits set in the ; file extent - can be changed to lower case if USELC option is set YES. ; TYPEXT: MOV A,M CALL TYPE INX H DCR B JNZ TYPEXT RET ;..... ; ; ; Print a string at HL of length B, removes any high bits set. ; TYPENM: MOV A,M ANI 7FH CALL TYPE INX H DCR B JNZ TYPENM RET ;..... ; ; ; Output character ; TYPE1: IF USELC AND CKWHL OR (NOT CKWHL AND NOT ZCPR) ORA A ; Check for attributes not set JP TYPE2 ANI 7FH ; Delete the attribute bit now CPI 'A' ; Change only from A-Z JC TYPE2 CPI 'Z'+1 JNC TYPE2 ; Punctuation can change so leave it ORI 20H ; If attribute, make lower case ENDIF ; USELC AND CKWHL, etc. ; TYPE2: MOV E,A ; Get character into BDOS entry register MVI C,WRCHR JMP BDOS ; Call CONOUT via the BDOS ;..... ; ; ; Print the user number of the directory in decimal ; TYPUSR: LDA NEWUSR CPI 10 ; If user no. < 10, skip tens digit JC DUX PUSH B MVI C,'0'-1 ; DUY: INR C ; Get tens digit SUI 10 JNC DUY ; Loop until we've gone too far ADI 10 MOV B,A ; Save units digit MOV A,C ; Print tens digit CALL TYPE MOV A,B ; Get units back POP B ; DUX: ADI '0' JMP TYPE ;..... ; ; VERERR: LXI D,VERBAD ; Abort, bum CP/M version ; VERER1: CALL PRINT JMP EXIT1 ;..... ; ; ; WBTRAP is where the ZRDOS returns control on warm boot (error) ; WBTRAP: LXI H,DSKERR ; Return here after reseeting the trap PUSH H ; Save DSKERR on stack JMP RESTRAP ;..... ; ; ; ZRDOS Error Trap and System Call exits to CPM20 ; ZRD: CALL SETTRAP ; Set the warm boot trap CALL BDOS ; Do what we're told CALL RESTRAP ; Reset the trap JMP CPM20 ; Error free exit ;..... ; ; ;----------------------------------------------------------------------- ; ; END OF PROGRAM CODE ; ;----------------------------------------------------------------------- ; ; SIGNON: DB CR,LF,'SuperFILE ' DB VER/10+'0','.',VER MOD 10+'0',CR,LF,0 ; IF CKSYS OR CKWHL SIG"N1: DB 'includes $SYS files',CR,LF,0 ENDIF ; CKSYS OR CKWHL ; SIGN2: IF CKLBR DB '(also searches ' ENDIF ; CKLBR ; IF NOT CKLBR DB '(does not search ' ENDIF ; NOT CKLBR ; DB 'lbr / arc / ark) - ^X to abort',CR,LF,CR,LF,0 ;..... ; ; HELP: DB CR,LF,' SuperFILE v' DB VER/10+'0','.',VER MOD 10+'0',CR,LF DB CR,LF,' A FILE search program ',0 ; IF CKSYS OR CKWHL HELP1: DB 'that includes $SYS files',CR,LF DB ' ',0 ENDIF ; CKSYS ; HELP2: IF CKLBR DB '(also searches ' ENDIF ; CKLBR ; IF NOT CKLBR DB '(does not search ' ENDIF ; NOT CKLBR ; DB 'lbr / arc / ark) - ^X to abort',CR,LF,CR,LF ; IF CKLBR DB ' (Use FILE.COM to skip lbr/arc/ark checks)' ENDIF ; CKLBR ; IF NOT CKLBR DB ' (Use SFILE.COM to include lbr/arc/ark checks)' ENDIF ; NOT CKLBR ; DB CR,LF,CR,LF,CR,LF DB ' Examples to search all drive and user areas:',CR,LF DB CR,LF,' A>' ; IF CKLBR DB 'S' ENDIF ; CKLBR ; DB 'FILE *.AQM',CR,LF,' A>' ; IF CKLBR DB 'S' ENDIF ; CKLBR ; DB 'FILE IMP*.*',CR,LF DB CR,LF,' Examples to search a single drive and all ' DB 'user areas:',CR,LF DB CR,LF,' A>' ; IF CKLBR DB 'S' ENDIF ; CKLBR ; DB 'FILE B:BYE5??.*',CR,LF,' A>' ; IF CKLBR DB 'S' ENDIF ; CKLBR ; DB 'FILE D:KMD*.*' DB CR,LF,CR,LF,CR,LF,CR,LF,0 IF NAMDIR PTRTBL: DW ATABLE ; Location of name table for drive A DW BTABLE ; Location of name table for drive B DW CTABLE ; Location of name table for drive C DW DTABLE ; Location of name table for drive D DW ETABLE ; Location of name table for drive E DW FTABLE ; Location of name table for drive F DW GTABLE ; Location of name table for drive G DW HTABLE ; Location of name table for drive H DW ITABLE ; Location of name table for drive I DW JTABLE ; Location of name table for drive J DW KTABLE ; Location of name table for drive K DW LTABLE ; Location of name table for drive L DW MTABLE ; Location of name table for drive M ; ; Table of area names for each drive. Each entry must be 8 characters ; long. Number of entries must be equal to or greater than the ; maximum user area shown in HIDRV: ; ATABLE: DB 'FLOPPY ' ; Eight characters/entry ; Users only access to A1: BTABLE: CTABLE: DTABLE: ETABLE: FTABLE: GTABLE: HTABLE: ITABLE: JTABLE: KTABLE: LTABLE: MTABLE: DB 'BASE ' DB 'ASSEM ' DB 'WSTAR ' DB 'COMM ' DB 'EMPTY ' DB 'BASIC ' DB 'SCALC ' DB 'DBASE2 ' DB 'RBBS ' DB 'MEXPLUS ' DB 'GAMES ' DB 'NEWSOFT ' DB ' ' DB 'ZCPR3 ' DB 'DEVELOP ' DB 'XFER ' ; Users access to M15: ENDIF ; NAMDIR ;..... ; ; ; Message area ; DRVMSG: DB '+++ Drive',0 ERRMS1: DB ' ' ERRMS2: DB 'Error',0 INLBF: DB ' in ' LBRTYP: DB 'LBR' PROCES: DB CR,'Checking ' IF NAMDIR AREA: DB ' ',0 ENDIF ; NAMDIR PROC1: DB ' ',0 PROC2: DB ': ',0 USRMSG: DB 'User #',0 CLEAR: DB CR,'  ' IF NAMDIR TUMSG: DB CR,LF,' Finished after area ',0 ENDIF ; NAMDIR IF NOT NAMDIR TUMSG: DB CR,LF,' Finished after d/u = ',0 ENDIF ; NOT NAMDIR TLMSG: DB CR,LF,' Lbr/Arc/Ark searched = ',0 TMMSG: DB CR,LF,' Files that matched = ',0 TCMSG: DB CR,LF,' # of files checked = ',0 VERBAD: DB '+++ Needs CP/M 2.0 or Newer to RUN',0 ; ; ;======================================================================= ; ; UNINITIALIZED DATA AREA ; ;======================================================================= ; BASUSR: DB 0 ; Dupe of original dir. user # to search BLKMSK: DB 0 ; Records/blk - 1 BLKSHF: DB 0 ; # shifts to mult by sec/blk DOPFLG: DB 0 ; FNDFLG: DB 0 ; File found flag HITRAP: DB 0 ; Highlit trap (previously typed char) LSTUSR: DB 0 ; To show last user area checked LZFLG: DB 0 ; 0 when printing leading zeros MAXUSR: DB 0 ; Max user # for drive from lookup table NEWUSR: DB 0 ; User # selected by "$U" option OLDDSK: DB 0 ; Holder for currently logged-in drive OLDUSR: DB 0 ; Contains user number upon invocation SUPSPC: DB 0 ; Leading space flag for decimal routine VERFLG: DB 0 ; CP/M version number (0=pre-CP/M 2) ZRDFLG: DB 0 ; ZRDOS version ; BLKMAX: DW 0 ; Highest block # on drive COUNT: DW 0 ; Entry count DIRMAX: DW 0 ; Highest file # in directory GAP: DW 0 ; Sort routine storage I: DW 0 ; Sort routine storage J: DW 0 ; Sort routine storage JG: DW 0 ; Sort routine storage LCOUNT: DW 0 LLENLOC:DW 0 ; Running total of .LBR length NEXTL: DW 0 NEXTT: DW 0 ; Next table entry SCOUNT: DW 0 ; # to sort SLFILE: DW 0 TBLOC: DW 0 ; Pointer to start of name table TEMP: DW 0 ; Save dir entry TFILES: DW 0 TLIBRA: DW 0 TMATCH: DW 0 VECTBL: DW DSKERR ; BDOS sector error intercept vector DW DSKERR ; BDOS select error intercept vector ; ISARC DS 1 ; Current file type flag for .arc/.ark GETABL DS 1 ANAME: DS 13 ; Name string ASIZE: DS 14 ; Compressed bytes ARCFIL DS 16 ; Dummy archive fcb ;# SEARN: DS 11 ; Holding area for search name LBRFCB: DS 36 LBBUF: DS 80H ; DS 100 ; Stack area STACK: DS 2 ; Save old stack pointer here ; ORDER EQU $ ; Order table starts here ; ; END TBLOC: DW 0 ; Pointer to start of name table TEMP: ; ; Trap BDOS select and sector error vectors to our own intercept routine ; so we can catch a reference to an illegal drive. ; SWAPEM: LDA ZRDFLG ; See if ZRDOS running ORA A RNZ ; Yes, quit this LDA VERFLG ; Check version CPI 30H ; See if error mode call is available JC SWAP20 ; If not, use BDOS error vectors MVI C,2DH MVI E,0FFH ; Use set error mode call CALL CPM ; Set "return code only" mode RET ;..... ; ; ; Output character in a to console, and optionally to printer and/or the ; output file. ; TYPE: PUSH B PUSH D PUSH H PUSH PSW ; Save the character to output CALL TYPE1 ; Send it to console POP PSW ; Restore the output character ; TYPRET: POP H ; Exit from type POP D POP B RET ;..... ; ; ;  This is the release date of the disk. FILE32 ASM SFILE32 .ASM 75 3F 49408 386  Fog Library Disk FOG-CPM.015 Copyright (1988) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Find the file you are searching for or get a better directory display with these programs. Filename Description -01-08 .88 This is the release date of the disk. -CPM015 .DOC This is the description of the disk contents. SD129 .COM E75C 6K ver. 12.9 [SuperDirectory 1 of 6] Considered by many to be the best directory program for CP/M. ASseMbler source is included so you can modify the program to suit your systems and style. SD129 .NOT 3661 1K ver. 12.9 [SuperDirectory 2 of 6] SD .DOC 0E63 8K ver. 12.9 [SuperDirectory 3 of 6] SD129 .HIS 4A1F 13K ver. 12.9 [SuperDirectory 4 of 6] SD-RCPM .INF 1807 4K ver. 12.9 [SuperDirectory 5 of 6] SD129 .AQM C04C 61K ver. 12.9 [SuperDirectory 6 of 6] SFILE32 .COM EC11 4K ver. 3.2 [SuperFile 1 of 4] Search for a specific file, even when it's a member of a .LBR file, on all drives and user ares of a hard disk. Will also work on floppy disks. ASseMbler source is included. SFILE .DOC 894A 4K ver. 3.2 [SuperFile 2 of 4] SFILE32 .HIS 5FBE  8K ver. 3.2 [SuperFile 3 of 4] SFILE32 .ASM 753F 49K ver. 3.2 [SuperFile 4 of 4] tation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Find the file you are searching for or get a better directory display with these programs. Filename Descript$%&'