IMD 1.16: 29/05/2007 12:12:09 FOGCPM.020 --FOGCPM020CERTIFY COMy CERTIFY DOC DU-V88 COM;DU-V87 DOCY !"#$%&'(DU-V88 AQM)*+,-./012345678DU-V88 AQM9:;<=>?@ABCDEFGHDU-V88 AQM6IJKLMNO-CPM020 DOCEDFILE COMPQRSTUVWXYZ[\]^_EDFILE COM`ab-12-00 85 EDFILE DOCcdefghijklmnopqrEDFILE DOCstuvFIX COMwxyz{|}~FIX COMeFIX DOCSPZ COM/SPZ DOCUThis is the disk name. 8 ;b͸{==Jw{ÖüH!K]jU 2͵ ^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2hZZk:h|/g}/o#|/g}/o#:h<2hqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2hZZ͉M|}ȯ|g}o)|/g}/o#z/W{/_!9~#fo! ! ! ! ! ! P!9~#A!9"w**w"j!z*"d!"f!Y"H>2^>2a>2`2c>2s2t>2r>2v!"@!"D!@"B!"F !F#x:~#!|2i~# :" 2i +}|~#:G:ix."2i+w# +6#!6#@A2n2?*j**|+`"d!"f!!>ڌo&͖=}  w~2ʸͼ56!+W ?_!~7z?ͧ:>͞@w#5.ww#w#w#w*>?@͌>w#͌5> w#@ͧ͵g 2q&0OxG͵j/ʆSx\͞.7:77!a{  ʨ ʨ0:?ŷO !y$ 7o&))T])))!y 2p_ :p6)))Y~0̿7G~`2@2@#~2@~?>&=2@#^#V#^#V#"@^#V"@:@ '*{@!:@@'"@*@#w"@*@~9'D'/Ϳ7͈?+"@*@+"@!6D"@6!^D"@*@~*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'|E'}X27*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@p';(ͯ''͋(!"@"K@2@<2@2@2@ͥ)()(*¾(2@2@(S*(#)2@2@)l*-2 s 8*w#w*w#w! ! ͻ!D ͻ![ ͻ;| Rev 2.4 3/29/84 DISK CERTIFICATION & UTILITY %s By: Carl Beck Arvada, CO. } 8!9DM!!z !Y!z ͐ !z ͐ !z 8! !  8 !A!  8 !@!  8!! !0! < P2!G 9 0PQ P2!\ N Ke P2!p b kÑ -2 Â2#îW $!9DM! v ! v !! v !G v !k v ! v ! v ! v ! v ! v `iy ! `i| | ! ! ! `i| |. ! ! ! `i| |H ͂ ! ! `i| |b ͅ ! !! `i| || ͈ ! !% `i| |– ͋ ! !) `i| |° ͎ ! `i!!- v !9 SELECT DESIRED TASK FROM THE FOLLOWING MENU CERT - Read Disk & Report Errors | LOGBAD - Log Bad Blocks in Directory DIR - Print DIR | DIB - Print DIR with Block Numbers CPM - Return to CP/M | DSK - Select a Drive DUMP - Display in Hex/ASCII | Only the first 3 letters CERLOGDIRDIBCPMDSKDUM %c%3s is an invalid command. Try again. ` -2×!9DM`iw#w\+|€ ! Z \|ڢ *~#fo+s#rô *~#fo#s#r͐] !9 Flushing BIOS buffer with revised data. 389!9DM`iw#w͐|ҷ!! ! s!|w! n&|w! ^#Vr+s! ns`i^#Vr+s! n& ͐|ڴ! n}ʚ! n}´`i^#Vr+s! ^#Vr+sn ͐6! ͐!99!9DM`i6`in&! `in&!9-2369k9'!9DM`in&|B`in&|V!`is!! `in&+|g}o`is`in&!`in&`in&A!\ !\ !\!1\!Y!s\\!\\?!\|ʤ\!\! s#r! w#w͐\Ҝ͐|Ҝ͐|t!! ^#Vr+sn&!! ^#Vr+s?!!9 Enter desired drive. ( A - P) The Disk in Drive %c has: %-4d Logical Tracks  %-4d Reserved System Tracks %-4d 128 Bytes Records per Track %-4d Directory Entries. DISK CAPACITY: %-6d Blocks at %-6d Bytes Each. = %-6d Kilobytes. The Following Sector Translate Table is at: %4xH %4d Check to see if your first sector is 1 or 0 3|9-28!9DM!! n&! *! s#r͐|z! n&A! -0͐~#fo*s#r͐~#fo*s#r͐ ~#fo~#fo*s#r͐ ~#fo##n&+++*s#r͐ ~#fo~#fo#*s#r͐ ~#fo~#fo#*s#r͐ ~#fo ~#fo* s#r͐ ~#fo###n&#*s#r`iw#w* 6#6! w#w͐\`i~#fo\s#r͐\`i~#fo\s#r* ^#Vr+s! ^#Vr+sÃ* ~#fo\ s#r!9 DRIVE %c SELECT ERROR 2-28~b!9DM! w#w!* 60! 6#6͐\ +͐!&͐! )`iw#w͐\͐,! s#r* ! )͐\ ͐\?͐\! s#r! )|͐͐͐͐!.&͐1+|! ^#Vr+s)! ͐s#r\|چ͐|†!* n&! ͐/!* n&#s! w#w\|͐|!* n&! ͐/!* n&#s! w#w`i^#Vr+sÄ! ^#Vr+sQ͐1+|͐|!* n&! ͐/!-9 Track %3d ERROR track %3d - lsec %3d - psec %3d - block %4d wK3â9-299ð:!9DM!7!0 e!E n!6 s!0 h! s#rz½!0 !Ck͐ n`is#r!\͐ q͐͐A\?s\|ڻ! w#w! w#w͐͐AҸ͐͐!C ~#fo͐)~#fo|g}os͐͐#!C ~#fo͐)~#fos͐|ڔø! ^#Vr+s! ^#Vr+s! ^#Vr+s! w#w͐͐A͐͐!C ~#fo͐)~#fos! ^#Vr+s͐A\?͐A!Vk͐ t!=9BLOCKS0.BAD Can't create '%s' %2d blocks with %d bytes blocked out. Ç|98!9DM\͐!́`is`in&! ̈́`in&þ!9-2"(Ù!9DM!X`isz`in&|k }M`in&Ok }MG`i6`in&|D`in&`i4&O!!9 Enter User Number: (0-15 or ax for All Users Invalid User.â-2k9!9DM! 6\#6!) w#w͐)|͐͐)6?!) ^#Vr+sû!) 6 #6͐)|͐͐)6!) ^#Vr+s!+ w#w!- 6#6!u͐͐͜-͟!/ s#r!|U!- 6#6͐/ ?!' s#r͐'n`is{R`in!7 n}R͐' n}R͐'n&!w͜!) 6#6͐)|͐'͐)n&!|͜!) ^#Vr+sò!͜!) 6 #6͐)|)͐'͐)n&!͜!) ^#Vr+s!+ ^#Vr+s!|J!͜R!͜-!7 n&͐+!͜!39 %2d %c.%c | %3d Directory Entries on User %2d.÷t#\ ?!ʹͱ×-2 38í,P0!9DM! 6#6! ^#Vr+sz\\ _\\ \?͐ ! s#r͐\! s#r\|o͐ `is#r\͐ʙ*w#w͐*s#r͐ \!͐͐!͐!A!q!! 6#6͐|!!! s! n}N>PTEʐFʞSʬï! w#w! ^#Vr+sï! w#w͐ |‚\! s#r*^#Vr+sÍ! ^#Vr+sï! w#wï! w#wï͐ \*^#Vr+s! ~#fo\s#r! 9 TRACK %3d - SECTOR %2d - PHYSICAL SECTOR %2d - BLOCK %3d ext sector

revious sector top dit ill with Data à|98!9DM\͐!͚`is#r͐! ͝\! ͝* ! ͝!! ͐͝!9-29ó:9!!9DM! `iw#w͐|X͐! `i^#Vr+s1! ! w#w͐|m ͐ ?! `iw#w͐|͐))))* ͐n&! `i^#Vr+sÏ!!`iw#w͐|W ͐))))* ͐n&|g}o! s! n&|C ! n&|C ! n&K !.`i^#Vr+s! ! ^#Vr+sh͐ \ ?\ڏ !!`iw#w͐| ͐ ?* ! s#r͐`i^#Vr+sÝ !9addr %02x %02d %02x  User Filename Ext Records Assigned Blocks E!-2(#9!9DM͐`is#r͐n! s!|"͐n&!"<í,P0!9DM!+ )`i)!`i)! s#rz€)`i!!+ )Û+! s#r! s#r!* ͐)! s#rzʛ+͐|)͐)! s#r͐ ))Û+͐)+\! s#r\|%*͐͐  )! s#r@*͐͐ #)! s#r͐͐d*͐! s#r! w#w͐&)! s#r͐͐͐\!+ )͐))!+ )!., )! 6#6͐|ʘ+!!/),)! s! n}N*P+EB+Fj+Sʒ+Õ+! w#w! ^#Vr+sÕ+! w#w!͐)++͐2)! ^#Vr+sÕ+! w#w5)!͐)+͐2)Õ+! w#w8)!͐)+͐2)Õ+Û+ø*Ñ)!"9 Enter filename.type: %cCant Open %s TRACK %-3d - SECTOR %-2d - BLOCK %-3d ext sector

revious sector top dit ill with Data !9DM͐`is#r͐͐)~#fox,!9!9DM͐`is#r͐͐n&ä,!9ÿ,-2"(0698!9DM!E.Ͱ,!.Ͱ,!.Ͱ,!&/Ͱ,!e/Ͱ,ͳ,`is#r͐|<.͐|<.͐Ͷ,ͳ,! sz.! n&|.k } T-IW-'ʂ-.-..͐* ! ns! n&!/Ͱ,.!/Ͱ,!/Ͱ,͐Ͷ,͹,! s{ -͐* ! ns! n&!/Ͱ,`i^#Vr+s͐Ͷ,Û-`i^#Vr+s* 6.!!ͼ,*6#6<.!/Ͱ,`i^#Vr+s͐|9.`iw#w,!9 Use Hex Numbers Only. A Hex Number followed by (I) will be inserted. A will leave original data. A (.) will exit the edit mode and write the modified sector to disk. To enter ASCII characters, type a (') followed he characters to be entered. A will stop ASCII entry. Enter HEX Address to edit. %02xH Hex Number Inserted. Type Characters to be Inserted. Type to end. %c ASCII Character Inserted. Data Left Unchanged.0-2!9DM͐* n&͐!@00 %02x %02x \0-2"(8!9DM!Z1S0V0`is#r!|ډ0!y1S0l0!1S0V0! s#r!|ҵ0͐͐0!1S0Ñ0!1S0V0! s!|0! 2S00! w#w͐͐͐51͐* ͐! ns! ^#Vr+s0!!Y0*6#6Q1!9 Enter Start Address to Fill: Start Address must be >= 0 and <= 7F. Enter End Address to Fill: End Address must be < 128 and > Start Address. Enter Hex Byte to Fill with: Fill Byte must be >= 0 and <= FF.62ó:Ó3!9DM*12! 32V2ó:!9DM͐n}ʀ2! ^#Vr+sn&S2^2!9DM`iw#w! ~#fo͐n! ~#fo͐n}2! ~#fo`i^#Vr+sn}2!3Ð2! ~#fo͐n! ~#fo͐nѯgW3!93Ì7!9DM! n&3|>3! n&E3! n&&!9DM͐`is#r! ^#Vr+s! ^#Vr+sns{ʃ3]3͐Ê3!9â3û7c8Ò83!Y9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{}7`in}%N7! ! s#r! 6#6! s! s! s͐n}-24! ^#Vr+s! 4͐n}0B4! 4͐n&͙3}_4! ͜3b4!! s#r! ^#Vr+sn`is{.ª4! ͜3! s#r! 4! ^#Vr+sn`is`in&͟3}D4U5X 5O)5Co5Sʠ577͐~#fo|5! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 /5! 6/5! 6! ~#fo! n&! ^#Vr+s~#fo! ͖3ѯgs#r6! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s6! n}³5! 6#6! ^#Vr+s~#fo! s#r͐n}6͐|6! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s5͐6! ! s#r! n}†6! ^#Vr+s!|چ6͐͐! n}c6!0f6! !t6!9~#fo#|ƒ6!Ã746͐n}6͐͐! ^#Vr+sn&!6!9~#fo#|6!Ã7Æ6! n}7! ^#Vr+s!|7͐͐! !7!9~#fo#|7!Ã76K7!Ã7͐͐`in&!<7!9~#fo#|K7!Ã7z7͐͐`in&!k7!9~#fo#|z7!Ã73!Ã7!9!9DM! n&|ͯڷ7! n&|ͩ7û7!9DM͐͐ 8͐^#Vr+s͐7͐08͐7s!&Z8͐ ͐͐ ͉͐;7`is͐ ͐͐ )͐;7`in&#&Z8!9!9DM! n&|ͯڎ8! n&|ͩØ8c8!9DM`iw#w͐~#fon&͕8}8͐ ?͐^#Vr+snѯg`is#ræ8͐8!9 7*+++:PG_*RDM!9o& _ 19  :noE92n& !o h9 . &7:PO*R7*+++:PG_*RDM*TT]!9ë9Ï<;7*Pͥ9:q2\59> 2?!*Pͨ9 )9>2? ,7:P)"XV>ڪ:z> ʪ:z2:P,"j!"l*T|X:*j!^#V*X#^#VP:r+s*l5*R"R*j"*lʀ:2?S:#"l*T+"T*j! N#Fp+qx*:##6>2?P:2?#  : > _ :  !j96  #F#x;~#;7,";> 2h*P/:q2> r;:h):R^;=^;=> r;:qw#w#w:ho&552?7:P)V>2?ë;2? ,5<>2?!~#foD<ö<7:P,>Z<2?!^#V*R:Tʃ<=t<Ã<*PA<*R!s#r !\/:q25!> 2?+ ,<>2?)~2#"j!!~#fo#^#Vp+q*j~#fo=s#r5#*+++:PG_*RDM*TT]!9ë9Ï<;7*Pͥ9:q2\59> 2?!*Pͨ9 )9>2? ,7:P)"XV>ڪ:z> ʪ:z2:P,"j!"l*T|X:*j!^#V*X#^#VP:r+s*l5*R"R*j"*lʀ:2?S:#"l*T+"T*j! N#Fp+qx*:##6>2?P:2?#  : > _ :  !j96  #F#x;~#;7,";> 2h*P/:q2> r;:h):R^;=^;=> r;:qw#w#w:ho&552?7:P)V>2?ë;2? ,5<>2?!~#foD<ö<7:P,>Z<2?!^#V*R:Tʃ<=t<Ã<*PA<*R!s#r !\/:q25!> 2?+ ,<>2?)~2#"j!!~#fo#^#Vp+q*j~#fo=s#Certify is a Disk Certification and Utility program. It has been placed in the Public Domain by the Author Cark Beck. It comes to you compliments of the Denver, Co. Xerox Computer Club. Certify is essentially menu driven as in the example below: "CERTIFY" DISK CERTIFICATION & UTILITY Rev 2.4 3/29/84 By: Carl Beck Arvada, CO. Enter desired drive. ( A - P) "A" The Disk in Drive A has: 77 Logical Tracks 2 Reserved System Tracks 52 128 Bytes Records per Track 128 Directory Entries. DISK CAPACITY 243 Blocks at 2048 Bytes Each. = 486 Kilobytes. SELECT DESIRED TASK FROM THE FOLLOWING MENU CERT - Read Disk & Report Errors | LOGBAD - Log Bad Blocks in Directory DIR - Print DIR | DIB - Print DIR with Block Numbers CPM - Return to CP/M | DSK - Select a Drive DUMP - Display in Hex/ASCII Only the first 3 letters "DUM"  SELECT DESIRED DATA B - Block | T - Track | S - Sector | N - File name R - Return to main menu. If Hex Numbers entered, enter H in front of Number "T" Enter Track Number (1 - 76 ) 1 Enter Sector Number (0 - 51 ) 0 TRACK 1 - SECTOR 0 - PHYSICAL SECTOR 0 - BLOCK -1 addr 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 (SECTOR DATA IN HEX) (SECTOR DATA 10 IN ASCII) 20 30 40 50 60 70 And so on and so forth through the various menues. END at 2048 Bytes Each. = 486 Kilobytes. SELECT DESIRED TASK FROM THE FOLLOWING MENU CERT - Read Disk & Report Errors | LOGBAD - Log Bad Blocks in Directory DIR - Print DIR | DIB - Print DIR with Block Numbers CPM - Return to CP/M | DSK - Select a Drive DUMP - Display in Hex/ASCII Only the first 3 letters "DUM" DU.COM v8.8 07/13/84*."g "h}0! 6! "!0"p*"2"<"p"0қ""""Z"""X:hʇ"3Û*.!"3!"j͇ DISK UTILITY v8.8 Universal Version under :i>M>CB͇P/M :h>0:B>.B0B͇ Type ? for help Type X to exit ͕!~WGW## > !^2Xk>2@2A12B>2U!"<~W:T ~ W;#f(2~+ʗ-=- <ʰ>#t?ʸA5 BiCD5 Fl GW H5 K LʞMdNP?QRʰSW TW U Vʶ WXJYCZJ/(@2X͇?W:C/2Cf 2X͇+++ OUT OF MEMORY +++ W͇Statistics for drive :ZAB>:B͇ Tracks: *[#[> B>͇ Sys tracks: *[> B>*_*͕͇ Sec/track: 7͇ Sec/trk 00: *_[> B>͇ Sec/non-trk 00: *[> B>͇ Groups: *[> B/͇ Dir groups: *b[> B>͇ Sec/group: : B>͇ Dir entries: *#[> B>f :ZO͹f2Xf0z*@#|"@*@!zf"@|fW:h40{ 4z4 f:D2Df{T @:i>i] xi~WTf.ˆ88Oùͤf~ ; (#AOy2Z͛> ͡:h|4^#V+"j! ~#foͼ*Ͷ*M|2Yͼ   *"I!"K*#́́DM/BK:=R͔*IͶ*Kͩ! x,͔*I"d*K"f{ʐ*b͕?ڐ*͕^Ó*b DM:aĔ/>-B> 2o*#}¼|~z{ʯ /Ø /**d͕*f"I*d"IͶͩ2VÛ*E) }|n~> 0>(B~D}#ͮ>.Bͮ:nB:o2n~D~> h>)BÆ͇ ++FREE++ :B2B>2a:B¡é>:B}2a~# ڼ~B®*#"Q!"l!/:C#~,~!,~_#~,: W#m(*l|> !>*2o"l  *Q+"Q|*l:G:qҍ:W*p! ͇LAST ADDR=*p "p+|D}D͇ f2X͇++ YANK MEMORY FULL ++ f:W! >2Hf:H! f2X͇++ NO "<" SAVE COMMAND ISSUED ++ W~# ɯ2W~- !6 ö ́ G~{4:U” *<} 2U*K*IͶͩͼ !~#"<:W< { !~. ~ ~ ~ B, . *K*IͶͩ ͇ ++ EOF ++ ö :W¤ 2X͇++ Can't dump, no sector read ++ 2X͇Use G command following F, or R or S following T W~;ʯ ¸  ͫBK ; #ͫ`i}D}}:~A ~D}}}}{ #} ~W:~HJ ͂~ " ~$ >.B{3 #} ͂~W{ f{ f~;c g ÛTz Sʖ G 40*[͕^Ͷ >2Vö 0z4*͕͌4ͩ2Vͼ Û**I͕*͜*K+:G}2G:Ǵ "E*2T:S2G- o&"E) *͕^"E2G> Ͷͩ2VÛbk:)=C :Go*yX ** # >2T\  \<² 2S͇++ FILE NOT FOUND ++ f=2So&))))) >D2~ ~. :  ; (# ~ ;#.:4#>  ɯ2\ +~#:^ !]~(@2\#~ U ~ P yO~0O#: y<2]  " *p|0‰ }‰ ͇Empty! Ñ 2:ʡ =_ \< ͇File exists! Delete? 8(Y ͇N È͇Y \\< ͇No dir space! È!0"2*\?͇Write error À!4*"*pz{*&[͇ sectors written. !0"p\:_ *f~ ʭ;ʭz4z­*K*IͶͩö ~ ;z4*K+| *I|*["I*] +"I*͌"Kzö*K#*͕͌I*I#*[͕<"I!"K*[*I͕C*]͕C<0zy*Ä*͕4"_f*I|™*_͡f**I͕͇G=*EDM/>:B:GD͇, ͇T=*I[͇, S=*K[͇, PS=*M[~(#ͫ#-ͫ#BK,4HrA4~ f;f B~BHKB"|l #y_f*|)~ f;f4#~ f;f,q">{Dyʞf*>r~ f;f4:V½ͩf2X͇++ Can't read - not positioned ++ Position by: Track then Sector, or Group ff>>B::xDyDxDyM V0B d |[{0B> B>*B~W~Ÿ8WâB#~ˆ#z{ƀ_ɯ2X͇++ BAD DISPLACEMENT (NOT 0-7F) ++ W#~#/~( ;,->#04:"A4G40))))o#~#~( ;,->#04:40bk)))o|g9͇ :!8O ʴ ww#Bw+>*BwwB> B!ɯ+y~Bwwr  $6 !~ wB#>^B>UBk> B> B`_O [> B:PKÕ j j :Xy >2PÍ ڍ:P<2P:Dę͛ڱ>͡*[͕^"IBK͛> ͡*"K*I͕`i͛+:2O: Ẃ#DM:YG+G*j ͛2>͡5:=g:hG&i"MDM͛Y> ͡ɯ2X͇++ Not within tracks 0-*[[͇ ++  W`i"r͛ڦ> á>2W͛|*r 2X͇++ READ failed, sector may be invalid ++ :W92X͇++ CANNOT WRITE UNLESS READ ISSUED ++ f ͛W|^*r >͡Zz2X͇++ WRITE failed ++ > ͡> ͡:O =•:h0"z"x`i"v2tt2͇ Operands in brackets [...] are optional Numeric values: 'n' are decimal, 'x' hex +[n] step in [n] sectors -[n] step out [n] sectors # print disk parameters for current drive =Abc search for ASCII Abc from current sector caution: upper/lower case matters use for hex: to find "IN 0" use: =<0> or "(tab)H,0(CR)(LF)" use: =<9>H,0 < save current sector into memory buffer > restore saved sector ( toggle map display of erased files ? help (displays this guide) A[ff,tt] ASCII dump B[nn] Boot track number of sectors per track [More] CHANGE: CHaddress,byte,byte... (hex) CAaddress,data... (ASCIIx Allowed for imbedded hex CHfrom-through,byte, e.g. CH0-7F,E5 CAfrom-through,byte D[ff,tt] Dump (hex+ASCII) Fn.t Find file Gnn CP/M Allocation Group nn H[ff,tt] hex dump K[du:]filename[.ext] Dump sequential memory to disk L Log in drive LX Log in drive X M[nn] Map [from group nn] [More] N New disk P Printer toggle switch Q Quiet mode (no msgs) R Read current sector Snn Sector nn Tnn Track nn Unn User nn for Find command (CP/M-2 only) V[nn] View [nn] ASCII sectors W Write current sector X Exit program Y Yank current sector into sequential memory Z[nn] Sleep [nn tenths] /[nn] Repeat [nn (decimal) times] [More] Cancel a function with C or Ctl-C Suspend output with S or Ctl-S Separate commands with ";" Example: G0 +;D;Z#20;/ would step in, dump, sleep 2 seconds and repeat until CTL-C is typed All "nn" usage except "/", "T", and "S" are hex (use #nn for decimal) (See DU.DOC for complete examples) fyw#x}/o|/g#ɷ|g}o&Ґ,%‹}o|gBKx¬!ù T]xʹ ï:h *"_ *.:^#""_^#"~#2~#2^#"^#"^"!G~:w*> "]"[w.:͉:͉&"b R Read current sector Snn Sector nn Tnn Track nn Unn User nn for Find command (CP/M-2 only) V[nn] View [nn] ASCII sectors W Write current sector X Exit program Y Yank current sector into sequential memory Z[nn] Sleep [nn tenths] /[nn] Repeat [nn (decimal) times] [More] Cancel a function with C or Ctl-C Suspend output with S or Ctl-S Separate commands with ";" Example: G0 +;D;Z#20;/ would step in, dump, sleep 2 seconds and repeat until CTL-C is typed All "nn" usage except "/", "T" DU-V87.DOC ---------- By Ward Christensen (revised 05/14/84) additional notes by Ron Fowler, Irv Hoff, and Jeffrey Nonken This version of DU is compatible with CP/M 1.4, 2.x and 3.x and does not require alteration for various hardware configurations. It adjusts itself automatically to the correct number of sectors, tracks, directory size, etc. INDEX 1.0 INSTALLATION: 2.0 USE: 2.1 COMMANDS, BY FUNCTION 2.2 ALPHABETIC COMMAND SUMMARY 3.0 NOTES 4.0 INTERPRETATING DIRECTORY DATA 4.1 SINGLE DENSITY 4.2 DOUBLE DENSITY 1.0 INSTALLATION: === "DU" should require no changes to the source file because of the use of the automatic adaption feature. The only alteration that needs to be done is to use DDT to set the byte at 103H for your clock speed. Use 0 for 2MHz, 1 for 4MHz, 2 for 6MHz. (This only affects the "Z" SLEEP command.) 2.0 USE: === To invoke "DU", simply enter "DU" at t he CP/M prompt. A>DU An initial command string may optionally be placed as an operand of the original "DU" command, i.e.: A>DU M;X for example, if you want to only map the disk, and then exit: Once "DU" is running, it expects single-letter commands much like "SID" OR "DDT". For ease of use, multiple commands may be placed on one line, separated by ";". In addition, a given command or string of commands may be repeated -- either indefinitely (until ^C is pressed) or a given number of times. To avoid an accidental ^C from dropping out of "DU", only the explicit "X" command will exit "DU". 2.1 COMMANDS, BY FUNCTION === HELP: ? displays the help guide POSITIONING: Gnn by allocation group Snn by sector Tnn by track +nn going ahead nn sectors -nn going back nn sectors I/O: < puts current sector "away" into a buffer > recalls previously saved sector K writes "yanked" sectors to a file (see "saving sequential memory" in notes below) R reads sector W writes sector Y "yanks" current sector into sequential memory DISPLAYING: # shows disk parameters A dump sector in ASCII D dump the sector (hex + ASCII) G shows current group, track, sector H dump sector in hex M maps the disk -- where the files are located Mxx map starting at group xx Vnn views (like CP/M type) nn sectors CHANGING: CAnn,VAL change data in ASCII (with escape to hex) CHnn,VAL change data in hex Unn change user to nn SEARCHING: =Abc scan for Abc (IN ASCII) from current sector on (very slow, allow up to 15 minutes to scan an entire disk. Either finds the answer or says: "out of bounds". FNAME find a file in the directory F find next occurrence (extent) of same name MISC: ( toggles the map display to show/not show erased files /nn repeat previous command nn times (repeats indefinitely if nn omitted) Bnn boot nn sectors per track LX log in disk X P printer toggle Q before a command does it "quietly" X exit to CP/M Znn sleep (nn tenths of a second) to allow viewing data before it scrolls off 2.2 ALPHABETIC COMMAND SUMMARY === # Prints the disk parameters + Advance 1 sector (if below track 2, this advances to next numerical, if 2 or more, advances based on CP/M"s normal sector scrambling algorithm, i.e., allows + to the next logical sector of the file. - backs up 1 logical sector NOTE: + and - may take an amount: For example, +15 advances 15 sectors / repeats entire command -- defaults to "forever" /nn nn may be 2 TO 65535 ( toggles the map display to show/not show erased files. When showing erased files "*" indicates that block duplicates a block in another file. It may not be possible to restore this program without errors. If there are no "*" in this complete file, it can be correctly restored. < saves current sector in a "save" buffer =Abc ASCII search, starting at current sector. hex  may be imbedded or used alone. To find the ASM instruction: "IN 0FEH" use: = (Ignores bit 7 unless using .) Since ";" is a command delimiter, you have to use <3B> to search for a ";". Also, since "<" is a hex escape character, use << to mean a single "<". NOTE: This is a very slow routine. It can take 15 minutes or longer to search an entire double- density double-sided disk so be patient. It either finds the string or says: "OUT OF BOUNDS". > gets saved buffer. < and > may be used to move a sector to another place. ? displays the help guide A dump sector (ASCII only) Bnn boot nn sectors per track -- not all disks have 26. CHADDR,VAL,VAL,VAL... change hex values in sector CAADDR,CHAR STRING... change ASCII calues in sector NOTE: may be hex imbedded in the ASCII string: CA00,OK<0D><0A><1A> ----> W writes changes to disk note that the "C" command echoes the over-  laid data for verification. CHADDR-ADDR,BYTE repeats a change CAADDR-ADDR,BYTE repeats a change D dump sector (hex + ASCII) FNAME print directory for file "NAME", then positions to its directory sector. F find next occurrence of name in directory Gnn position to group nn and read G shows current position H dump sector, hex only Kdu:filename.ext save a file from "yanked" sectors. drive, user are optional. Resets "yank" address. see "saving sequential memory" in notes below. L re-logs in the current disk -- you may pull out a disk, put in a new one, and "L" just to log it in. (see "logging in disk" in notes below) LX logs in disk "X", such as: LB, LC, LA, etc. M dumps a map of the group allocations for files Mn shows which file is allocated to group "N" N resets CP/M via BDOS -- this may make it possible under some implementations of CP/M to change the disk format, i.e., density, sides, etc. P toggles the printer on/off Q  quiet -- preceedintg any command, suppresses CRT output R reads into memory the sector currently positioned at. NOTE: "R" (read) is implicit in the G, +, and - commands but NOT in the "S" and "T" commands Snn position to sector nn, and read TNN seek to track nn (no read) Ux logs user "x" for next "F" command V views the current sector -- assumes ASCII data Vnn views nn sectors W writes the current sector to disk NOTE: may NOT be used after an "F" command as CP/M was used to find file in the directory X exit back to CP/M (must press return). ^C was too easy to hit over modem lines -- requires two bytes: (X,CR) to exit. Y "yank" the current sector into sequential memory (starts at 3000H, increments for each yank) Z sleep -- causes the porgram to pause -- such as to look at a dump. Z is 1 second Znn nn tenths of a second Z50 = 5 seconds 3.0 NOTES === * Multiple commands: May be separated by ";" EXAMPLE: The following commands will erase the B: disk directory to all E5"s: LB log in B: drive G0 position to directory CH0-7F,E5 fill with E5 < save the sector >;W;+;/16 restore, write, next, repeat 16 ---- this could be shortened to: LB;G0;CH0-7F,E5;< >;W;+;/16 * DUMP COMMANDS: All dump commands (D, A, H) may be optionally followed by a starting and ending address: D0,7F the same as just "D" D3,5 A20,3F * LOGGING IN DISK: If you have a disk with a "blown directory", try logging in a good disk of the same density, then put in the "blown" disk without logging it in. You are opening yourself to possible problems because of the buffering of physical sectors in the "BIOS". The best technique, (but not guaranteed), would be to seek to the unused inner tracks of the first disk, do the read, then change disks. That way, if it writes anything, you won"t have destroyed anything -- assuming the disk is not completely full. Another technique (assuming the second disk does not contain a CP/M system, would be to seek to track 1, do the read there, then change disks to the blown one. * SAVING SEQUENTIAL MEMORY: Since CP/M v 3.0 does not have a SAVE function, one has been added. Syntax is: Kdu:filename.ext ^^^ ^ ^ ||| | +-- file extension (0-3 characters) ||| +-------- file name (1-8 characters) ||+--------------- user # (or none) |+---------------- drive designation (A-P or none) +----------------- DU command Drive and user may be omitted. If so, omit the colon as well. Drive must be specified if the user is. If the user # is omitted, the current user is used. If the drive is omitted, the current CP/M default drive is used. This function saves the current contents of sequential memory into a disk file. The contents of sequential memory are determined by the "yank" function, and the pointer of that function is used here. If nothing has been yanked, you get an error. Once the file has been saved, the "yank" pointer is re-initialized to its original value (3000H). Control is re- turned to DU. 4.0 INTERPRETATING DIRECTORY DATA === 4.1 SINGLE DENSITY === The following explains the format of a CP/M directory entry as shown by "DU", using either the "F" (find file) command, or just doing "D" (dump) of the directory sectors, which are located in groups 0 and 1 on a single-density disk. SAMPLE RESULT OF "FSID.COM" COMMAND: 40 00534944 20202020 20434F4D 0000003A *.SID COM...:* 50 33343536 3738393A 00000000 00000000 *3456789:........* FIRST LINE - 40 00534944 20202020 20434F4D 0000003A *.SID COM...:* || ||| | || || | | || ||^---hex file name/type--^ || || ^file name^ || || || || in ASCII || || extent-^^ || || || || || || file size in sectors-^^ || || || ^^-00 = file active other values (E.G 03) = user # || E5 = file erased ^^-displacement of line in directory sector SECOND LINE - 50 33343536 3738393A 00000000 00000000 *3456789:........* | | | | | ^- allocation groups ^-----allocation group numbers-----^ (just happened to be printable) 4.2 DOUBLE DENSITY === The following is a sample of "FSID.COM" running on a double- density system: :FSID.COM 00 00534944 20202020 20434F4D 0000003A *.SID COM...:* 10 38003900 3A003B00 00000000 00000000 *8.9.:.;.........* G=0000:00, T=2, S=1, PS=0 The primary difference is that the groups now occupy 2 bytes, i.e., 38 00" "39 00" ... this follows the Intel and CP/M convention of putting 16-bit values high-byte-first. This it means group 0038, 0039 etc. Note that in double-density, each group stood for 2k not 1K, so there were half as many groups for the same file. Be very careful when patching a directory under double-density. For exmaple: CH10,38,39,3A,3B... This might try to access group 3938 with resultant angry noise from the disk stepper as it attempts to find where it sh ould go for the data.  numbers-----^ (just happened to be printable) 4.2 DOUBLE DENSITY === The following is a sample of "FSID.COM" running on a double- density system: :FSID.COM 00 00534944 20202020 20434F4D 0000003A *.SID COM...:* 10 38003900 3A003B00 00000000 00000000 *8.9.:.;.........* G=0000:00, T=2, S=1, PS=0 The primary difference is that the groups now occupy 2 bytes, i.e., 38 00" "39 00" ... this follows the Intel and CP/M convention of putting 16-bit values high-byte-first. This it means group 0038, 0039 etc. Note that in double-density, each group stood for 2k not 1K, so there were half as many groups for the same file. Be very careful when patching a directory under double-density. For exmaple: CH10,38,39,3A,3B... This might try to access group 3938 with resultant angry noise from the disk stepper as it attempts to find where it shvYDU-V88.ASMe  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHoIJKLMNOPQRSTUVWXYZ[\]^_`abcd,.AU;%OH~{X,4iT&gj=P\IlMT鮋h4/XŲX6yB߅6iBOJeQK>{eF2̿Rnxz3f׆я2&>1$YB~I.VWfcCSlP:ы g %$}=H_//D6鋢1_.zfNgwd6yB߅鑌gELP:ɳ;rѷ>\ޓ}C"|I~Mϙi%I2TJ_tTI) jI:#7W4|aPO6'KwiF?}˧ӧ?=~-fC)*>#$Q L)FJ)Yi@~bCڤ&>[w05.D}9|O3E?ԑ^TBfX,%QG2a:yNg!14f#*YLBl%QGJ0a쎒g *Z>҇.waz$^M&h*$}xKϙɯ M\M.waz4IG(JLi8g/*3/),gJO*h|Ff(yH: sra'Nl@yM LI}b4I׉"QT}n݂v #MҌ5t !1Hlyb)d6$Iя2Wh BGJ6~=ՇϴFRblLÑҋ g %[M_]"(T^:P٤FѼ+ꆪs?X 䙢:1_>(JIKDdPQRpYCCbԑLNz͆gFJ0|6'E)B4S e@t)hRUB>c(hzb&TBƓ Bdžv3&~TGJiw,0FQ_j(d6&0TFX`0=$I13/,>ۅuBb?}XoE߫wgTS&nɆ^z6R];: z SJ_?($5j$)JzRyvG_?>F /,'I;5҇?YB>Yf/DU~l}BboWDJH>(5d6T6_(Z; 䙢e,>:"x\GDN[H? ŇO~OfK3$5.]BihPM<5^X,}~y>QVabY,=^}շ_SMM)JQd<||4c:*JF4Y>lX,|>. Gr0Ofȇ]3Jf_Ee H?* 7&kdfwj2E;&>nLMzZ S_)Tx2El|8Mȇ]332s!T,?Xǟ*3 ji#|ֻ15<(2@ _Hu}iw>QB%Ƈjhcjh^_R Qo6*d?̇4٤ٝJ.'j*rbY,=^}W"ISRF5gzT͆F5ɏlzbtVɅ(G5ҏ?i6ߩ0F Nd&scbA!T٤e&Ԥt2JICkn6d6y ӘB]{ UjTHffd6fib.eЏ7,lLNI/DQ^rNfc#l яf6,QcnTP M( Nڤ8ShP1Rł>c#Mf#==п:+mlvߩp`)16H:٨ł>d^ }EyBzxzR.aK;gF = }EibAKçNQ.-|kPjh.DhSF2BbAZĐ(0TCZ뙡03څxS4cɅbAڭ %i4)T/yƆ2Jy6GГ7$?3Jł>Q/Di;JLyvGO;3B.i̓gzMʼOO,'LMQJw_guИ'&Inr^s3JY,OCbԑLNih̓gzHO.;h>S#KBł>&ޫڨB4ldHOjE??k$쎢E ڐ(^$z&(Яw6#jG+}iLN%jb|H;&Y] Fя?HbA2E^ӄ҇rCwdfwj<"eTH4MX,߾% Q4c4}^MP:ׄ$}Q2)ZHfX,|>4,ަ?UftFGuf׆f*}ɳ;63*HKXD:UH_/׆^7dCWI65I_/&xLW>',>2-}H..D-mM 5RnhCzbr:_hgXKo߿}J6ivF2EtGO-}xlȇ]332CƳX"z~JJ6T&je>SɅ6֣J(hOSʗd6<&MIł>ƨ ̛ i"f/ MXǟvaC29hC Q0K)>|Z}&/)RFTiBi6R|H/*Lr_X"z~@'rL]*T4٤ٝJ(lmlGw|TJ\XKo+Q0jd҇4sB*2EO2a:yMNz#}i3YBKBJ0!I3fB2a:yNguOy6И' }i cj)ϨT=$F}-}xL nTȄ䙮WJn>XǟF%ylwzz0B54f#yQ!0<'F~O,QeIn57?W`j1jg&!㩊ł>6tLIdfwj$)ͼ٨^ZͲHdvł>4 l„~V =wQ?|H~=)T5̍"Qł>!j?Lg3&s|Ff(S 0<&L't}b>Q P exDg>nɆ&:Q#ݥSzxzR̐d6#}iQ!Krh٭ ~mLјyC20lX,OfhItbTHg332ES7PQ?|"7{exv_{51|HO;3z MuO6 Ջʌ)>2Gz'KD//WS:UH.VӇˇ J2W# S|FuzY՟Y,O??ٳMݩ/KdC3?IM32̿ҟ/E?t' dfw*c:*2\L~>X|OTw9m/6[ߩŲX~_j?\Tmߦ [{PllW>i%^~rML3>4o![M_/i̓gj,S#kn6gYB?ֿXǟ҄&xT-;_ Dg)gr Hz U\bASh٘\OTw9m/6[ߩŲX i@lTHMݩyU*;H >7 Eʨ0QYCp=QT/ KÑnQY~./f#_.,ŲX~vӷ~'.^'f51Oѻ4I_m<1*KTbY,bY,U> hC2EtL~I<$gd6&~T}F~If' ] k?CtF2N xJR':>PԘ464&!$o6*dS~7Sl:QBԚ{,'LjrQНcCOkC&,t=,<M2lYb>K.,KÑ&De,~xc,Ĩ#?S2\s Op! E˲ust?0]2 ̃{hmxRtU7o~8+K <*\Elpe&:T]~`uC\guCpG2/C;olbrQ>>0aW7t?;y C,ΡGy q, bt?eh\w t?[&_%[M_/i̓gڥazTF4gbY,jgʵ-M6iN  t?pKN0;E20c[t?p JLRe~8&}bW~8S:yNvDX˂aTd,:BT{?;/*O(Jxa,NxG^C4_7iotpq}M//o_}մy J"fNѸLŲDA5tc;eh̨yW2>^2T<"yW,RĤg2*TQuC5}~MEK,5*Yb U V]QNrѷ^T>,d <+Tꊭ6I_0}Fi6R}i9KXP+ryQaI!-}H)-g \d޷(+`]4/2,8;,H*}yX}='e eY>T'TG~[@[Z6r/~|&xL<3*dAU_oA\XbR;I:^w OX, tc̃4<ғv>ό Y-+`C!Ȃ8*uvİ b,JcE;Y b,JcE?|~̯ F̂1VϏaZ|uѷ^Ciݳ bĀݭɆq#lQ,1 RX}}~ F̂1VUϏ3 F̂1VU7oaeL̂8*uU5T( F̂1VGD b,JcUtAJGAUc}~} sX "@=E# F Yİ b,JcUX|~MĄiƂsY,Kܻ~^XuT1|:@k:*sLo5M+ t`[}cA_Xp^c?E7Ssh[7TCDZhQ&,e3k k|tiTH<bYvo5 "@Q_m؝OrIg4 ͂vGɂ=.UǂjKXS4;9mf e,?l1OvlTbYSA>T,pQ) šbZL3eUdZLnʂ=`ձE-?eEW }aʂ=!*SQv:bZL) uΧ,8c \b,8Õ74|PG,pQvʂ=ڶ.j1MYpGW,pQi9eXӷ) VVw*XumuGۢKxb:7E) ]E-{A.,8cѽ74|X - \bÔ{ph.j1-,8#.Yjʂ=bZL) .j1=Lo5}o=l=UWE-) X;ݔ{} \b|};E-_,8KxcZL,8ߣ]E-ߦ,8ߣ.Xӟ,8co]Xwe0/,?lupc Fb`A<ʂs!*h(X,e4w7S4n>_ Dg*a,C[W,CXp#DE_Ge,OD՟i*ɦFO)ᑞ7qG׏?5h(2RelyLCbY,˾NW-\StU7o,p֘}łsaTe,ju-׳0!ez{' ![XX13-]_Ss ʂs!*h(X,eyfh̓gJLj䓄ŲTC0T'DDhVGxieR'&$!ah\YqѮ:qi0e %XPZ4e %XXFo4m~@:Fbѡ*QZ# U \5/Qǂ0g FYXFoi sr6k,ХQ}ѡ*QZ# U \5/Qǂ0g FYK{WXK]yc Fu  ,phuT ,pEʹRo&L'ϧiʂse`x<ZQ1 6JMӴ]se.u*WDDhs,W-w,pD >œ.eg Fb`A<+m||Ʉt+e`p.u*X% \5α^߱Zcu,s@k.hB%iw͕1fAtJ,pֈ;ǂz"h~hKԱ #YQv9 \5Z 9\m3B%i]q[܊ѡ*QZ# U \5/Qǂ0g FYXFoi&Bޝ+ t`k ~,W-ʂP(YwE.×cAGZ,phuT ,pE4CR s+ tcE͂vGɂP(YwE.×cAGZ,pp޲ #,8ŲXKFf5h4)T2 1O)yH:لkrѷ4>ГbNҧiI<#Q43*Kr@> O A/t,8#*:;3NX=bN:34׌#1}V҇ {YwUc gAݯ4%`ٌF_/h]y`tLy^΄,8/} |CJ ul:3bY,Jrѷ>\7։ )[TbYUW "@=ޕhswPVQ#R/,cZ|ؗtfy  A/,8/ ԫUW :T%J&鋢& į.(CD >Bɂs!*:X,e4]gŲDbnOqh EGTCh uh`,R5SjG_~cZL{ۢXq\Pu,h{,-ukRus ѡ*QWǂjlBFQWEiX <҇$}gaUu:~?;ʗxyO>,W- DZabhfw,W-f^u:`5SCcdAݯ55`!Q!ih̨buB,%`w> OICC~IqT` RǨ:75 E<^D2h eyp?}я2W#0(rÂ8W|L'<3*dAأb<ł_lj^.iB4Lʨun^.ŲTޢ\5tkRǨTCP%ʐ 3H`{Oc \5n7^.>#}y2wyhrlN@:FT~:X|BlFFf,/iDMX4`/M*zz_Ͽ,=[&ƇW7% ~h}ۢsl\cŲq[P :T%b &fAݯ:0N6jLGu%g,]PwYQuC\,ХP` \5n7Rp Zꆪs,p( f b?TcAGY,eZ b,ػƂ1gAݯ4sEǂE:b޷7>,p֨!D}E7XbNwd6W7% ~hRQ=Ab],`G5ˏQ!?0O|Ƃ_!h4`_7*PJ(Ϗ \r1ѫMH(5rayq:#`/Q43M]:‚_!hJ:œŲAO% [Ā\lWEihbAtJ,pָuí{ 7 #ĀM|IIzT,ppv h`Aݯ41 \dyq:v˂_!h::fu$=&>3yV,ŲXR*3gT6̨P,ݞ=,p(b9 ZEP\G(޲XbFK:;RQOs)C41,p(.u-ŲXK]6_1' '}F.T/_'tŲA? e.uK5o,ػ]U7@kTy57$hfLQnXK VUK։"o'}gw,Jxcޕ7@kTPu1`5o,Jxcޕ7@kT0o,p( f,!+D}:BE]?D,ػƂs![ŲXKQgLQ|5@f,u-h* \ǂ_!hJE g,8c/cAݯ45`(_R: \2T,W-fJSE=^SRG*z<Zcu,UIh̨uB,p(=`uB'Zױ]Q6ywNTHOF :T%,W-w@kAz"h) \5/Qǂzb|e FD,qm.×lK'|HIC8@| >D[}cAGWwʐzoTfXQv{D}uB,pQkELiʂu,W-f˔ŲѢ>1|:ˏ/IiFZ3łsaۈŲ,EPw'@k:*sLO?o>㴹Xnt`x",û^v[ĺ.;Y~̍ )?P,(Ųĝnt`x"E=N# \5\,8NwOW-fzZcu,p֨u,%t[8a_XP b],?F&f6,(ŲXKQgl(hbY Z|8Wo%`;$ɟf>\SjL?ܰ]QE-4.3>ԯYpvh6= \] v'4Sg3JQ+i‚CDeh<Zc^v{u->ܳX:\5/QbY Z|?!v,8/Q n`,6Fz -󙢻ЯwBOj泻g,n 11}OcL@`Aأ1}V)T/Ucl[ݹzߢl,JFCoQ6q[tn`,nP(/v>ό xңbAtJ,qu, ΋{To]]QX+~'ϴјӃQ,% \dn-, MhCrѷ3lp\XK&.TIB&?ocj-s5/ ume޷_6t jÑ&~AKv>4raAݯ45`/<+[M_ XnK ]]QW}cn-,W-O]ab(Q>rCw.aU} `U[Ăzբk6;S~Gw_RՁE' q6I_݅~$<Ij|bYnpNh{<3yvGyfS,ŲXu6(Z3bY%`E];<3*d.uz  ~)Y4 >BɂPjNR (1ih(FJE;gF,W-fJSQGۢXPZ,u-j~dAU6 RiBfUŲ,'Į@X5KM:34׌=np{ɨP⏊>T, P6&OgY-&<OzoX1b]yc.um;7lT(OhsCƓzQ bGɂ1_!hJE͂+ol>.cyq[7tbY,2d6ORq U4/)X, tch(XPte,3: Uf(QC3騎>|OR,ނ`,_ :[)C(Kr.3B &`|YqN2~GOF_Q}@;gF,pu9 /5`%ч\f %%lɇ:`'5y|I)*i&TF "@=A2OJdžFe4IzHO CUd.u/ .{/51><3왎]yc޷(yPu_Kԫw@kc FbQnTh&& ӉQ!%&̳;RuACUl(JLgwyfTbY•h":)C)==ł_aMEaAݯ45`'5yL7tLdCM \bwS冞m_W9`C*&4L'F,8ߣ*\Y,Zv[6S M6iN )O(\^.ĄrCe,UJxBtJD;@kܺah)CJɆ^ZW7 >BTc#{LdkE_<S3ٰ]QWԯY`Up`ZL=•ŲXK7o蘚ɆŲTE} `A5a \5Z 9`ise fAhmh۳Zz˂siw+"bY,ݔtV l6^.UbYnݰ uB,pQMQI%t~͂bqfPuXbǿ,!)~d,h{,fZLnʂŲXK7oh޳XDDh۷ )C/lXӿv iTuBtS^Z #,8/ 0! n`,RґRzz0RC)X,KϿ ѡ*Q@C!#,pp޲\Gp݊ŲXK49eut+Ƃ༸G|Ų̃8En,phuT ,~L.ͦSCk(󔨉!*iFo+e>a_XP ~hVGx!Qt?lkѶ6hSRA>~6yvGôqE͕:BTPXPG uB,pQ|PGZaZ=:Z[bY,EZa, zb̃Z@[u-Yp#ć:zd,q- .q[E,M̂_5 \,8#># \bj,8#># %`|Gfh"bY,ߐFP(/&xLv>ό YP+͜uneu~,-~-YQv{@kTQ:@kTQ:8@|/ \bLYpG|bAtJMEICbY۟P+Mh۳W͂`+ \+ =(p ~,-~- =(p ~X{Q]QW͂`-Yp^#.=e>:Z U,8#*h(XD,pQi9e*n{Q244cŲć: \5j 8Wo% \bJS+XJŲQWPZ2e,qv %XP+MWG,8#1 % ~,-ے=bW,% .A5t \5\,U.nЮbAGYpGTPWYp^#>ԑXJQbYET'D}9 \5\,c#hu#D}:BTu4Xb)InrXNUzǂ_!hjNYpGW+Xp^#ŲD}.~8!#D;UvBGw,pQ0eQ_ o1 \bZMYpGWY۔{D}uJ``,Q_ o .qej(NU1`?o,p֨cAG(Ypvnk@kT0o,pXE;t5a:yѫ2o(TȂz"hYP `$7Ȃsiw+"U\5ε  A/t,8] =eP:WJ,%ꫪs'DD]U4ZÕo+ \5{WXKs,% Fu¼ XP+fA0gA5QV,qyUW7eq>:Z臢,]9 ΋{8t*u["D}E7Xb)InrQ(PM(]RJ<ѫ2oՇϔgoX8!:T%J&鋢v1?lYKc^,TCm4|g?UbXq[D};eh>cA,(ѡ*UX,,"ۊQ!ޱXbP bW@༸GWX,Z<N zǂ_A7`e;ZEXPZ͕Uc܊` un|gd<ŲD}u\5n.X,KW":!:T%JRLj.aw,% am͂+o,JV{WX/,"ۊѡ*QXnч\5n[9@kT0o,ػhαZ肘"@j臨W$7ȂP\Gh?XVu_lb Xd,7 qdA ,8/q}@nE 8$2oh ~,ŲX|T@YH~I& yM2BuLlTo51>d,ػ]U4ZcXwzb\Y,KܮttBc΂8+ v{Yw1h`AĈY% tcT_xcAĘ` >BɂvGɂX,KWVvXPZ# !][ ӫOrfQ! Elݜ"@jY.YPZ̛,p֨WXPZ̛,p֨WX-f,W-\Sܲ :T%J@kbA(༸Vo,q[D}ػЯwt|I7ld Fb`ALBƓLo7_?` F̂+o,W-fOYP C=|Xp#ć:`_7dC;Kd,j uBԀSFdĨ.j1L(E{$ ea.Ie#%-,=*4%D)ʗ4Q%]g{ԫ6 b>t|I3†oraZ4 NQ:~͂= FK噢JT6_2)ңbZLj(_Ҩf17*dQ6_RJң4!WZFyh2ֻ i&6I_& ӉQ!mݜb;gL74٤a:1*dA#!)S mݜ&4L'F,]9`'~kF=&4L'F ΋{ԫEPwy|IG*2< ~/i6QyfTHS,?F,pQ W'fyhTgZL:&~3ڥazTF4Y~̍ YPܳ]QE-)`w*HyB|(KF5ˏQ! {4|FyBcoD4Y~̍ YPܳ\GxWeWmħvGbY >^)MY,Kď'TCĜvĜ༸Gď,(ŲOo,?U鋢Dy23:g43e$o5˕FʼM(*Xu\g!)ڤ =)Q:j ՅŲX2<9Xm\LeQ]{b/B_?|LzoT>dĨ0/BH|(K~~&4L'F/,:Q!~!e>SX_>4Q%]gs)"R3 >_h4Y,8_HDtLI?ƨB.) cnlMg&f Q/qzR$_j|IfhB.l(Oscؐ(O,BZ'*$}Q : Ufh32_RVчgSbi̓gZ3u!6&>3*3 %%k3OYP 1`GL3Cd*34bA#fAj1o6Kd&y EyBO_i /,p֨W{ 妡lhcݱ v{5鳢f?SjljsB AS]QE-)`_ӄrCcoDfyqE+f4IGE4!QGłP(/LQ$a޷(~&QYCICCِ(EXP+MhC䂪g/*4dИ&aAj+e9w' ASNJirR/ig>c`%%eF,NPe^Z c,`W,{qxeAݯI(7,2d6.7,-^KgEyfP+2NTHB`q1Ovt*3*P >B P%ƇLQ|@[??v̐g(K.jeYq:^7_{ FeI% \5";T-U/f~g䗤&xLż+ґFQC~IfhS4zP ybXX13E})V3eԯi\YElnRCf(͒WRZX/S&JQ|[>Q͔Qd6LZQ1 c6h\GqlCEDJBeabYNoOphuT ,~6h@[YPZwLE|X1ŲT'ԫY2)}ٺ9 \5q_](E~; C‚ChVGxӘ҉iFo+ unW+R>'}z^K&& MQ\cUc|,TCbYtc|S&h'}Ƃ+o,W-\OMR:J@kb޷NZ3łz5FQV \5q_ XXpG \5Z 9(RaiFo+ unW+bYկNeS`%&51>_g@]_ E|,1`w> Ozo(QCJ1TI‚1 ]y`EQQܱ@:Ɨ[S2C=S:J AJ&JQWEwސ٨Pу2,8;TͼeXP+MWG,8;T|C4fBRǨ\X ,W-hs݅yf䗔ahVGx)%jb|k˴qE͕zߢl^גUc|YqP%C=S:J-jNqusԫy`'3(Z3hyW,[p2.XP+tMz5_?6QrhyW,VVK[ī@6T",$5Xp#DE_G`CeabY"}NqQ-̐HWwPl0E-\XW{DPz^.*ihTt=3d<=E-vʂ="}n= \5n.{ uB, xWe'@k,C9nG*2YP+M̂б༸GխbY, $TG5񔨉aC2HJGCU'DD]PTcޕ7@kTPu1ܡ7]yc F CƂPZ肘:VD,no7MQ-̰WwdĨ.j ,8ߣn˃J2]oYS;eu,p(}?uB, xWeŭ?!:T%JRp bGɂ_!hJE͂uXKxcAݯ4% "fyq 1`?o} O*/i̓gTP@:Fα\GEbY.bGɂ1ܡ7RǨ.|^;٨3-}H&L'tX]o'TE9D}#fAݯ41 "@ǂu,8"}ŲXK7OSJŲ,CչCUdAtJ,ХE9=J]yc.u*Xʷ<҇dtL+ \5Y2a:y5 @:;Ch0;D}wP^iCJ3 n?o͗yC>Y2a:yfޕ7VPKzUvibXKU{ĐմNҧDMYQqǂ+o,8/~/)vibh&I4S! E\fj5Lwd<%& %ŷsa(ŲXKs 0<.$yvbY}?w]W}ߩ0F_TFfyqy%zPICLNY,+߮CUl(Jv|FI',ХPW}@ք䙮W5 ΋{z},QEQ3&1h^KdghC2a:ylvtgtbY\v>J)C&||H>_)<bY, j6Mj.]CcfDUf2a:yn(QÆv$3JŲNph?T9 uh`,R><:(Y?~mLz&kFzݨ"@?fC'Sa/,]P'DD]՗j(Xw1ܡ7@kTyܱoEhVGx7]?D,Mɂ_5.e^ihKԱ@nE \5nhVGxiCbYNphuT ,6WRpb(Xw.ӆL+ tcCQu.qXX1m(~3m,Х_αZ# \5\,% n`,P+M ;e<\vʵ/,p8D.:DDTl(|H??]QZ#nw415<2bzb\l+eCYc.j14QQcnTHi̓,}`yqWC ̓ل~}aAtJĀMEYU;elB۰]Q6ywF5ˏQaʂ_a,\v7d6_mXb)CYp#,ŕPfʂ``, Q!ޱE-{Vv{4༸ǻ2X,e6iv(\۲XWP+Mp NYpGTu4@1 \bJS\y = \]ɂܳ\Gp-bY\y .۳\Gp-bY\y >1|:[1{l$Mh6G@kܺahk[!]vShItbTȂvG X)S nmhItbTbY,J)ʗ40PyF˂_!h "@=\,v‚=˃JXKc7`1' ΋{uB,pQ W|h`ZL{DE_G uwe0XbmNQY,+oOh{,ŕ۟P+Mp NYpGTu4E-ܨ,8Õ,UUc>g4IEӡ,S@kݾ]v>Kx,?WwK:[+D}K:JDDTl(zIgk{ĀSld F&OyFegAGwS2ʂj/2ʂ_!h`(_t(Ô} `,C %:BA% >SfQ]eb^.?чŲ\ @ǂݞuB,pQ W|h`ZL{DE_G uwe0X/ >A "@.X Eh bQbY\} `A5a`3o\@k:*sL?&fөP#}$7H?OW4z˂xi>ӴqE,]3tLf2!NW4z˂x5[׻iFo+ uh`,q_Cw ƻ:QbYe?!:T% Uݔ.×cAGw,p(= U.×cA ,t Ϗ, (uBYQv{Rv uB8eg,e?W9 "@GYP+c,e?!:T% `A,(EPZcQ!ޱXE;EdZ<^Ypv( n[Rv n1NYp# _ŲXKtF~mvkC_@[̛+ Ɯ{WXP+MɂY;ǂ_!h:quhKԱ #,1 >œE7X* \wBj4S\GDe +NW-fOS×c,RL.3C_BT24Y~̍ YPteq[E' ![XX1ALq[E:p]-yt/h\G: vG 9SRvvq޷+ ~Y?L;I~Lgfe.{Lje)ۅNf !rAձE-\.j1S,pQi3eAq~v:ak,pQOYPܳ]QE-) ``ZL7ȂC..j1 ,8;+.j1N??pxW C߲X], ա:eޕ7AqdA(Y1Jq ͂_A7 \G(ۅX,K%`|G?LY,Kܹvq޷+ ~Y?LYpG\  P+MhC䂪cZ= \bj,(Yfʂ.j14t(,(YӿV%t,(Xb.j1NYpvxW \bG``Auh1NY% ~YP+cA( F bAĈ,%`?^Y14 ~,dAZ\YP+M+o,% u]ŲXKJG3Ji=Kr=X"'@k:*sfz6WR zߢleAj1o,::Zv_5`E҇Qa,R֩Q4 &4L'F eZLO,8ߣݠ,pQ W|"v \bZN?Z|"W,pQnKQ.j1-~u-YpGA,pQ~Wג{.j1) E< ~ X.(Y. Yp=hhKԱ\G(⹎X, +0gA(YPZM,ѫ4T\f,pD u"ŲXK7o,]qBݯP7`EQnX1|:SnXPZVM6ra %{̖,e.- n`,LE>!5xʗX"W'`SCgraA_rK5 (b7`/4&OfA(Ys AXrWOɯYpZ]u u"vG򮍺P :T%bDDo7n}J'.]:Q =dN U DEX1QdAGY,(Ų̫1)MyL8e,rT4*S,ݠUq \5\,e.- Uyse,E }Bݯ45 \,8ߣ:b %X. Y.(Yp#+4e,nސzGӓ˳,/igbY pBj4Zcu,W-fzZcu,8x~زXW Eи.×cAj4z˂sau,NpQ?]K%`鳢nBbA ,j8!:T%,Uѡ*Q\\5鏀M1TIB|6S#==д]ÔQdAGY,(Ų~.NU9 CU"fAtJ,+/ .G$e>h.aʂP #,sbY,%lȤO,}bY/QwBtJY1 CUdAݯK_P& \b,8/1|G2|`~Bj4SZcu,q!^ X- ΋{ _!\GDE7Xbiό ɯ M|fB?& ӉQaB.T/*3tO面qLXK=SpD,pQ W|K[D WXKp} `AtJ/&B?'۾?=FQ.\=鏀M1TIB|6S#==д]ÔQaP0W/FdbY,vcjMl}hLD.͒g,uB8)CMB+Xp^c-\z"h,C0wf0|t5XKp .j1)`ݠ?M6iN ͂%%4٤ٝ< t`,hTC!^XK: Xxd[Ce4uS ݅Ų _N% >B̂0gA ,EpBtJ/jP%,Uѡ*Qt[ '@kclF3zzih) >Bɂ #YPte);!:T%J@k{d&ϴ!0}F_/YpvX}vCz'҇{ԫA3/+Z}FB@kt6yW4QdA ,eUuw ?8*Ihfj<v #,(ŲXK2dtL\޳^y C;olbrQ>>.~$h)bAG(YPteYUPOl:alF3zzih) >BɂX,K UNUѡ*@:F7]ycAUPTc.u w(.aw,s e3gAݯǂPwMEYzZcՕ`'5yEI3zyςC Uw҇xyO>,%`I:S!+ t *k6I>Ig!"lP&Ƈg^.UȂj[9&鋢i :T%b8@Tm|(QCJ6į3ÂvQgZ2O&_QuC=K|XP+Mؙ;uf(hOY,K UhR6KCR>>ncX1`G5 Qefhיayq`gh|FeO1 %`I:S!G lv*5O*<+ "@j:7ۣJJ&=  K=>\޳^yչX۾:gO*d <_;Ig3}E/yJXp#*7_Y,˪rC8Z㏟tCZ泙)遦,eUzT?pEd6*'z 0͒Yjr༸ǪrCXRDѳR;Jg3z=&aAݯP6eYUn(OqUWl R/EI3pyς6Q.ayq[5T?;ʗo5}gAjQ6W[M_ѝ#O>=wzM‚_A7G}E20#Q,%m|(Q.O i,j:wBUQ`&O>ГP̤&= j:إ|H.YPZͼꆪsh&&e Y1WNٌm_K<+D}E7XU5T;Z㏟tC$g35RME;LYJbYà} `A5a \5Z 9?z&Ȅ9iseAtJ,ХQxc F9D}.SyʂxW4z\YvXp#DE e!CUl(*5 ~Nq UPQYP+Ʊ*ul(ZfQ! >B P%ƇJhWWvol䙖>&= jK=>\޳^y q۾:gO*d0WNٌm_K<+˲N8鏀M1TIB|6S#==д]ÔŲ]PZ# !bo,U.;٨3-}H/*Lr{VEĀ]/ɇ.E_tv$3J=+ KRaC*Yw Mq Uw,ХAq UTj]y`CDQ:J҇'@kѿ(D}JGZYlȂX,˪h?~#`q U2HyFO4m0eA_XpGqbY+En,phuT ,~LEĴLJ=)ʳthX 턨PhxWl} `yq]eEn,phuT ,~L.X,a bjh\Gf,ѻCUdAjG.}8QFy)z,8;vCz'҇{@k]2<$$Q&Ƈ,8/T{WDM)P% Oq]qqظ(P% Of Fݯ:15)OOR,W-fhvQ\g.~$h)bzWWQ4LXջ\5鏀M1e>h.abYVvzB_Xpǻ7} `A5a \5Z 9?ӻ:ZLqE͕Ų+ڡ;!#,(Ų]=A[̛x~no50}F_/)TȂP6I_-}HԨE̫n6Q:tC$,p֘}+ U]6TH)=KZc,%`˥ )P% OfA_;٨30!MXP,PuQ$>d޷7vI:DM)XU24w$Q&I,`3O~L|IQgAq7J1lh~3Se) Os2QQ%yFJ+vיѿf4w!e Yp^ܣ3hbA ltÆ73XWWvo'8+FMiCzQa^޳E-^KN0|DʗyC_/YPte} UcnMEK(hQOYwUc]XP+͜un Rǘl o7v̐K i',W-\+`q_rML3'\G}bY,7b(lGu>*bŲNphuT ,pE+mNi6&gger"3ٔh.GzIgkh:ͦSJCEtt~:z?eA<+m\- 9>CbԎ51>L+eA<_Hڑ_k7J06h?܅yfh̓gڥazTF -}Hu/jڸ[sLzTqE,=}P%ƇEqE,Lc1OvT&je>SɴqE,>Fv'Y ݭQ2m\- 9_ƘQPq}MW4z˂xY7{C&L'ϔO*$DMکLN,pE+m\mFoW4z۸޲ cڇoSs<6h?+m\- 9 4m\mFoY1ue:JB?o_+eA<8*I15r!9\۾6hS{)iCʏOjH~ڸ[sL] ل~}ijH].n޲ ce菟&M`ԴqE,].cF7rm˴qE,nͳLMW4z˂x-㿹[Ml'}FЯwe޲ cZulm{ݴqE,瘾u\g*K(^w?UftFGuOc[&Ƈe޲ c:d}!L'ϔe޲ cz2oDe!ml?l]|6{eڸ[sLWͲǟVzf(\R&ƇɴqE,瘾.̍: Uf(QiFoY1v qE,~%͞iCJxJԟ*3y::aʂxW4zLe?U3v,#2I6m\- 9e?jRC2yT~!U) 9\mFoW4z۸6hhqE+m\mFoY1kC) 9W4S6hqE+m\mFoW4z˂xKQJu6157rCrfMW4z˂xiNv*ɯnm57ȇS5m\- 9ڥajMfcBЏiFoY1ާLv6hS6pߦ+eA<ǔ>_FJQ54R;@lL,pE,GNBSuf'GyBaiFoY1 f31~u)R'jgo?6cCi6ҏՏ6qE,Gy(C҇4I~LgLYFoW4z۸6hӟ+(>\҇4LE}zT˔hqE+m\mse} ,Ųxc,o~TjRCQ"@_!hJA_l AYP ~,(ŲXKfjble /i8$g4 &į3CyFS=e,םNW-;eq@pp}F,h4eq}F'Į@ɂ}ĂX,eTOqKSY,Ku uBhT9: XP+Mɂj>Ĝ_lbY,䙞gNq=3nP)7{*5ez8!:T%,U{WXP+̛uk: A3gA_p,8/Q,es2RS<$M uZt\L=]Y,K}Ю_=,dAݯ5Ų=脺_!h,{: F̂1gP#R_t'D}Qa΂X,eT3E2(h̓gڥazTF fCE4&eNqUWl} lrѷ>\ޓ٨{+rCiB_@[MKd6*Qd<$^7q4Շ.(@kc.u*XP:F +`$Y0?vexbAj+ EѼnaFeD2FWGsAE\YP+tM ̿ѿ(ڥazTF % *u*XP:F +`$Y0+3OrCyfԝ YP:F"l(ufXPte,u0 (1>LJY, wUz-a>,7y:P#K5BidC)b[BǟJjRC o&>3 CtB<Ǖeo Wh W>fa!:!~+˭:!RnO縲C1o'peq ;LhB2a:yfu]t? QcnTH:Hkn&-nEtBWN:3t.t6Ԩ1 VCvBW0ό xPeq Uu ;\߯%`:tC$,e{X9}E4Lʨf~x+,qWtwn'pe,WX)×脸#e/N+|o?ҫ) Ur ,p'Y* qGn}B\e>X,ah̓gڥazTF4g:5F?,%~8, XUyB\e ,ݾ>!W q,qQW qG@?Wxdqo q,՗j(N+|`#`w$3J6į3 qG6I>Ig!ŲXl$1OiQOY짏7Ra{B\wv1?lO+<~ q_]'6I>Ig!=KXb)C51>|P#mT,SpW>SŲ7t?G-:7?Xt¯`w$3J˥ Y,e硚>Pґ6*T{,QeeQ_LhB2a:yfu]t? QcnTH:Hkn&-nEtBWN:3t.t6Ԩ1 VC1 Vers: 01-10-84; by: J.C.Kaltwasser & M.J.Mosko, K3RL $= T **͂+}2'++*'&0+!'ͥ(}2'*'&!)*/!*!ͪ*͢*!'!)*"'*'!Z!b(!Z!!*!\8+!)*ʇ!Z*!*!ͪ*͢*!\+!\!!"'*'*"'*'!)*ʶ!"'!*'*! ͘(!i͇+*'!}2'"'2'*"'͹ !\"'*'! (!C)**'! (!O)*ͤ)*'! (!M)*ͤ)=!"'!!͟!\ͺ+|ʅ! ͪ*!*!ͪ*M! ͪ*!"'Ý*'&*ʖ_Ý!}2'!?ͪ**'&|*'&!E*!}2'*'&!g)!x)!}2'*'&*'&***u(}2'!!*'&!E)**'&!)*ͯ)9 !}2'*'&!Q)**'&!)*ͯ)b*'&!H)*t*'&!M)*ʆ*'&!B)*ʛ!"'*'&!Z)*ʷ*'!:*"'*'&!-)**'!)*'!:*"'*'!:*"'*'&!R)* !*"'*'&!A)*b!*"'*'*':*!E**')"'|b!*':**'!E*"'*'&!O)*~!*"'*'&!S)**'&!C)*ͯ)ʠ]*'&! )**'&!+)*ͯ)*'&!=)*ͯ)!'(*'V)!"'*'*'*=͓ !\@+͢*!*͓ ͓ !*͓ !*!͢ !*!͢ !1*͓ !E*!͢ !\*!͢ !s*͓ !*!͢ !*!͢ !*͓ !*!͢ !*!͢ !*͓ ! *͓ ͓ !- *͓ !B *!͢ !Z *!͢ !q *͓ ! *!͢ ! *!͢ ! *͓ ! *͓ ! *͓ ͓ ! *͓ !͢ !!*͓ !͢ !7!*͓ !͢ !i!*͓ !͢ !!*͓ !͢ !!*͓ !͢ !!*͓ !͢ !"*͓ !͢ !U"*͓ !͢ !f"*͓ !͢ !"*͓ ! ͢ !"*͓ ! ͢ !"*͓ ! ͢ !+#*͓ !͢ !G#*͓ !͢ !o#*͓ !͢ !#*͓ !͢ !#*͓ !͢ !#*͓ !͢ !$*͓ ͓ !>$*!'!!*!'+!͢ !V$*͓ !͢ !$*͓ !͢ !$*͓ !$*͓ !͢ !#%*͓ !͢ !f%*͓ !͢ !%*͓ !͢ !%*͓ ͓ !͢ !%*͓ !͢ ! &*͓ !>&*͓ !&*!'!!*!'+!}2(*(&!)ʇ ͓ !(D)!!! ͪ*! ͪ*!9)ʵ ! ͪ*͇*!}2(*(&!Y!(2) !Y*(&(*!(D)!&*! }2'*'&|6 *'&}2'*'&}2'!>*'&!g)}2'K !}2'!}2'!>}2'*"'!}2'!}2'*'&*'&**| *}2(͟*(&! )*(&*ͤ)ʨ *(&"(!*()* !!!&*!\+| ! ͪ*!&*!ͪ*M! !è !*()*M !!!&*!\ͺ+|> ! ͪ*!&*!ͪ*M! !è *X&*()*| !',)!)s !}2'*"'è *W&*()*ʨ !')!)ʢ !}2'*"'*'&|0 *(&! )*(&*ͤ)ʬ *(&"(*U&*()*d *'&|T *'&!)# *'&!:*}2'!')!'ͺ)!}2'Q *'!)Q !6}2'!M}2'!')!'ͺ)!}2'a !')!}2'é *V&*()*y é !*()*ʩ !}2'*'&!)*ʩ !}2'!')- *(&}2(!)- *(&u(ͪ*!i*'!i*'(!*'&)ͤ)*(&*'&)ͯ)**'&*'&!i*'($=*(&! )*(&*ͤ)*(&" (*U&* ()*ʺ *'&!>)ʐ *'&!:*}2'!')!'ͺ)÷ *'!)ʷ !5}2'!M}2'!')!'ͺ) *V&* ()* ͍ !* ()* !}2' !* ()* !)}2(=!}2(*(&$!i*'*(&**'&*'&*(&3͍*'&! *'&)**n *'"5(*'&!S)*}!(!!*!}20(2'21(2(2'2'!}2(!!!&*!(+!(!(!(!!*!(!".(!(!(!)*(͟!!!?ͪ**5("'!)}2'!}22(*2(&!)X!'*2(&!*!2(D)*.(!(!!(!((s*.((!\)*ʦ*(&!))}2(!.(%)X*.((!;)**1(&!))}21(!.(%)! *X*1(&| !'!'D)*.((u(*!.(%)! *X*.((!,)*-!.(%)!}2(X*(&|S!'!'D)!.(%)(*p!.(%)(u(}2 (* (&!A)* (&!F)ͯ)* (&!0)* (&!9)ͯ)ͤ)ʷ!ͪ*!}20(sP* (&!AV)* (&!F2)ͤ)* (&!A:*! }2 (* (&!0:*}2 (!'*'&!'*'&(*(&* (&x)**(&!)*I!'D)!}2(!}2(*'&!)p!ͪ*!}20(sX*0(&|r!"7("9(}2'23(*'&*'&}22(*'&!C(ʹ!}2'!Uͭ|?!)}2'!}24(*4(&*'&2)?!'*4(&(!aV)!'*4(&(!z2)ͤ)7!'*4(&!'*4(&(!ͤ)*!4(D)!}2'!Zͭ|Y!}2'!Oͭ||͓ !&*!:*"7(!Mͭ|ʙ͓ !'*}2'!Aͭ|ʹ*'!"'*!\ͺ+*3(&*'&)!'*3(&(*2(&N)*ͤ)!3(D)!}23(*3(&*'&)*y!Oͭ*7(*9((ͤ)2!}23(!9(%)y*2(&*'&V)^*2(&*'&:*!}2'g*2(&}2'!}2'!)}2'!2(D)*2(&!V)!Bͭ|ʣ!'ͺ)é!'%)*'*'*!}22(!\ͺ+|*5("'!!!(!*!4'*!ͪ*!}2'*|2*2(&}2'*}23(!!!@'*!}2'ù**A*}2;(*;(&!i!9((*'&ͤ)}2<(*'&|ʤ*<(&!aV)*<(&!z2)ͤ)ʤ*<(&!ͤ)͇**<(&͇**'&!)*!͇*!}2=(*=(&*'&2) !'*=(&(!9()*!)͇*!=(D)!͇**'&|*!'D)!}2'Ì*'&!6)^*'&!}2'!'D)!'%)!}2'Ì*'!)ʌ!}2'!>}2'!'D)!'%)!}2'*'&!M)ʺ*'&!}2'!'D)!'%)*'!)!}2'!>}2'!'D)!'%)!9!9(u(*!9(!A)!9(!0:*͇*!9(!7:*͇**'&!:*!)*'&!>:*!:">(!>(K)^͓ !O'*!Z*!V'**'! !a'**'Ϳ!d'*!h'*!*!p'**'Ϳ!s'*͓ !v'*!}2@(*@(&!)*@(&*'!ͤ)3! ͪ*!@(D)!'*!}2@(*@(&!)A*@(&*'!ͤ)!g)ͼ!@(D)͓ !'*!}2@(*@(&!)p!'*!@(D)!'**'!x)*'"'!}2@(*@(&!)V͓ *'*@(&"C(*C(d!'*!}2A(*A(&!)!i*@(&*A(&(3! ͪ*!A(D)!'*!}2A(*A(&!)=!i*@(&*A(&($!A(D)!<ͪ**@(&!}2@(Ñ͓ ''!9!9(!ͤ)*!9(!)Y!9(ͪ*`!.ͪ*͇*!9*"'!}2E(*E(&!2)*'!g)}2G(*'!E*"'*G(&! )*G(&!0}2F(*G(&!7}2F(!*E(&*F(&*!E()!!!*!*! ͪ*͇*!9*"'!}2I(*I(&!2)*'!(ͤ)s*'! g)}2H(*'! E*"'!!I()*H(&!0**I(&!2)ʗ!!I()!0*!!!*!9*ʸ!*!͇*!}2J(*J(&!(/*J(&!:*}2J(!9**J(&)!ͤ)!0}2K(*K(&!9)$*K(&!}2K(*K(&ͪ*͇*!9(!)!ͤ)!0}2L(*L(&!9)p*L(&!}2L(*L(&ͪ*!9(!ͤ)!0}2L(*L(&!9)ʯ*L(&!}2L(*L(&ͪ*͇*!9(!ͤ)!0}2M(*M(&!9)*M(&!}2M(*M(&ͪ*͇*!P(!!*!P(+!P(!(}2O(!P(!͂(!P(*O(&!(!H)*a!O()!}2V(h! }2V(!"X(!"Z(*O(&!}2N(*N(&!V)!P(*N(&(}2W(!0"\(*W(&!9)ʿ!7"\(*X(*Z(*W(&*\(:*x)"X(*Z(*V(&x)"Z(!N()*X(!}2^(*^(&!@!(2)/!@*^(&(*!^(D)*E&!)g!9**E&*!9**E&*Û!9**E&!ͤ)*!9**E&!ͤ)*͇*!}2_(*_(&!P!(2)!P*_(&(*!_(D)!}2`(*`(&!K!(2)!K*`(&(*!`(D)!F!(!)*X!}2a(*a(&!O)N! *!a(D)! *Ñ!}2a(*a(&!F!(2)ʑ!F*a(&(*!a(D)No File Specified. Not Found.Bad Record.RECORD = ADDRESS = OFFSET = HelpRead/Edit File Utility Functions:A - Address to dump B - Dump at beginning C - Continue SearchE - Enter Edit Mode H - This help list M - Expanded Help listO - Set address offsetQ - Quit this program R - Read & dump recordS - Search for string Z - Dump at end of fileCR - (+/=) - Adv record(-/_) - Decr record Edit Mode Functions:^E - Toggle data fields^W - Write buffer out ^X - Abort Edit Mode ^J - Cursor Down ^K - Cursor Up ^H - Cursor Left ^L - Cursor Right Expanded HelpRead/Edit File Utility Functions:A - Enter relative address to dumpB - Set record to beginning of file and dump dataC - Continue search. Restarts search on last entered search string.E - Enter Edit mode on current recordH - Brief description of the functionsM - This help descriptionO - Enter offset address relative to start of file (.COM = 100h)Q - Quit programR - Enter record number to dumpS - Search for hex or ASCII string in file (starts at current record)'\' = ASCII string delimiters (ex: \Test\)',' = hex and/or ASCII delimiters (ex: 41,\Test\,4A';' = select search optionsA - Start search from beginning of fileB - Search BackwardsM - Search on certain bits set; use mask xxO - Stop on xx occurrence of stringU - Translate lower case characters to upper caseZ - Search recognition on least significant 7 bits onlyHit for more -Z - Set record to end of file and dump dataCR - carriage return (or +/= key) - advances record and dumps the data-/_ key - decrements record and dumps the dataEdit mode: ('^' refers to the Control key)^[ - (ESC) Accept next char into edit field even if a control char^E - Toggle between ASCII and hex data fields^W - Flush record to disk^X - Abort edit mode without updating record^J - Cursor down ^K - Cursor up ^H - Cursor left ^L - Cursor right Input integers are decimal. Use 'h' suffix for hexadecimal entries.Hit to continue -Edit RecordWriting Buffer ** WRITE ERROR **EDIT ABORTED** READ ERROR **?Search String = Stop on string occurrence = Enter string search mask = Not Found.SEARCH ABORTEDFile: Record: (H) LOF: (H) -- ---------------- - >xs(~# f(}a{ o~aڔ({Ҕ( w#Ä(~#Ü(!^#6~( (#÷(}|#~ (((6#÷(i`^#Vr+s|r)!„*+Ä*ngr)!ڄ*+Ä*r)!ڄ*+Ä*(+|4ng*r)!+,)-|^#Vr+s|*r)!+E*|z{.zW{_-ʠ)җ)} DMoxGyOÁ)|}o|g}o|gK)#|5ng),|}o|gzʄ*|g}o)zʄ*}o|g)͑*#||!„*#Ä*~#fo}}|r)!ʄ*+Ä*}o|g"*."*{_zW**-"*ʄ*>)D**OxG|* ?T*} =Š*}/o|/g!+ñ*ÿ*o&ÿ*͙*!**͙*K* !+*ñ*͙*͙* ͙*_+͙*  ʴ*>ô*  ͙*͙*ñ*͙*ñ*͙*ñ*ñ*͙*ñ*͙*ñ*͙*ñ*͙*ñ*͙*ñ*ñ*͙*͙*ñ* ñ*͙* ͙*!ñ*͙*"ñ*͙*#͙*$͙*%͙*(ñ*yxX+G]T~w+”,kb ,xG-"L-"N-Hi&)))#"T-!W-^-Aw#,!W-"P-!^-"R-*N-A#,C-A*L-~w#,!T-5,#5G-*P-A~w#-y2V-*R-DM*P-*N-#:V-=2V--?,*P-*R-"P-"R-,7H-*P-xH "-!- "-i`)))#"-A!-6#„-A*-+~w-kbA+~w›-Һ-*-!-Aw#°-!-5Œ-#455Ì-}WGgG~gEgUU!EDFILE DQC`defghi`??????????????? 0@P`p2"RBrb$4dtDT6&vfVFHXhx(8ZJzj :*뛋l|L\,< ݭ~n^N>.Ͽ0 P@p`"2BRbr4$tdTD&6fvFV陉XHxh8(JZjz *:ͽ|l\L<, ߯n~N^.>!Bc)Jk1sR9{ZbC ǤjK( ϬSr0[z8冧@a#펯Hi +ԷqP3ܿyX;"`A* hI2Qp:Yx -No%Fg=^5wV˨nO, àfG$_~]|6UtW@EDFILE.DOC!  !"#$%&'()o*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg}2'!')!'ͺ) *V&* ()* ͍ !* ()* !}2' !* ()* !)}2(=!}2(*(&$!i*'*(&**'&*'&*(&3͍*'&! *'&)**n *'"5(*'&!S)*}!(!!*!}20(2'21(2(2'2'!}2(!!!&*!(+!(!(!(!!*!(!".(!(!(!)*(͟!!!?ͪ**5("'!)}2'!}22(*2(&!)X!'*2(&!*!2(D)*.(!(!!(!((s*.((!\)*ʦ*(&!))}2(!.(%)X*.((!;)**1(&!))}21(!.(%)! *X*1(&| !'!'D)*.((u(*!.(%)! *X*.((!,)*-!.(%)!}2(X*(&|S!'!'D)!.(%)(*p!.(%)(u(}2 (* (&!A)* (&!F)ͯ)* (&!0)* (&!9)ͯ)ͤ)ʷ!ͪ*!}20(sP* (&!AV)* (&!F2)ͤ)* (&!A:*! }2 (* (&!0:*}2 (!'*'&!'*'&(*(&* (&x)**(&!)*I!'D)!}2(!}2(*'&!)p!ͪ*!}20(sX*0(&|r!"7("9(}2'23(*'&*'&}22(*'&!C(ʹ!}2'!Uͭ|?!)}2'!}24(*4(&*'&2)?!'*4(&(!aV)!'*4(&(!z2)ͤ)7!'*4(&!'*4(&(!ͤ)*!4(D)!}2'!Zͭ|Y!}2'!Oͭ||͓ !&*!:*"7(!Mͭ|ʙ͓ !'*}2'!Aͭ|ʹ*'!"'*!\ͺ+*3(&*'&)!'*3(&(*2(&N)*ͤ)!3(D)!}23(*3(&*'&)*y!Oͭ*7(*9((ͤ)2!}23(!9(%)y*2(&*'&V)^*2(&*'&:*!}2'g*2(&}2'!}2'!)}2'!2(D)*2(&!V)!Bͭ|ʣ!'ͺ)é!'%)*'*'*!}22(!\ͺ+|*5("'!!!(!*!4'*!ͪ*!}2'*|2*2(&}2'*}23(!!!@'*!}2'ù**A*}2;(*;(&!i!9((*'&ͤ)}2<(*'&|ʤ*<(&!aV)*<(&!z2)ͤ)ʤ*<(&!ͤ)͇**<(&͇**'&!)*!͇*!}2=(*=(&*'&2) !'*=(&(!9()*!)͇*!=(D)!͇**'&|*!'D)!}2'Ì*'&!6)^*'&!}2'!'D)!'%)!}2'Ì*'!)ʌ!}2'!>}2'!'D)!'%)!}2'*'&!M)ʺ*'&!}2'!'D)!'%)*'!)!}2'!>}2'!'D)!'%)!9!9(u(*!9(!A)!9(!0:*͇*!9(!7:*͇**'&!:*!)*'&!>:*!:">(!>(K)^͓ !O'*!Z*!V'**'! !a'**'Ϳ!d'*!h'*!*!p'**'Ϳ!s'*͓ !v'*!}2@(*@(&!)*@(&*'!ͤ)3! ͪ*!@(D)!'*!}2@(*@(&!)A*@(&*'!ͤ)!g)ͼ!@(D)͓ !'*!}2@(*@(&!)p!'*!@(D)!'**'!x)*'"'!}2@(*@(&!)V͓ *'*@(&"C(*C(d!'*!}2A(*A(&!)!i*@(&*A(&(3! ͪ*!A(D)!'*!}2A(*A(&!)=!i*@(&*A(&($!A(D)!<ͪ**@(&!}2@(Ñ͓ r rr r r  I1REAL PQG ABSTRACTFQMBACKUP23CMBIGDIR COMBISHOW29CMBYE COMCCPZ27 HQPGCHAT COMCHEK COMCOMP ASMCOMPARE COMCP CMGCPM HQP CPMINFO CPMUG1 HQPCRAWL CMvDCON11 LBRDE-LBR OBJ1DELBR CM1DELPHI PRI"DIR CMDU CM;EDFILE CMVEDFILE DQC`ENSOFT COM&ENTAB CMERA CMERASE CMEX COMFEATURE IDFILE COMFILT COMFILTER CM(FILTW CMFIND COMFIND40 CM FINDBAD CMFORM COM FORM2 LBRLFORMS COMFT CMGOTHIC CMUHELP HELP COM'HELP HQPmHELP-V20HQPnIOCAP11 CMLABEL CMLDIR COM7LISTT CMLU3 CMMAKE CM MANUAL MASTER LQTGMBASIC HQPfMBOOT3 ASM@METAL GMETAL HLP METLUSERDQC!MEX COMHMEX HLPMI1200 COM{MI19200 CM{MI9600 CM{MLOAD CMMOVCPM FQX MSA CM3N CMNDDT AQM!NDDT CM0NDDT DQCNEAT COMNEATB3 CM NEATL3 CM NEATLN3 CM NEATN CM NEATN3 CM NEATU3 CM NOTES IDNULU10 COMpNULU10 DQCBOSFILTERCM(OTHERSYS TPAIR CMPASSWORDCMPBH CMPICONET PORTCHK CM PORTCHK1CM PRACSA11LBRGPRACSYS LBR6PRINT HQPRBBS HQPREN CMRENAME CMRESOURCECM-RESOURCEDQCSAP37 CM SC2 HLPoSD-92 CMSDT CM(SDT NOT SEARCH COMSFILE13 AQM4SFILE13 CMSFILE13 DQCSHIFT CMSM ASMESQ CM.SRX COMWSRX DOCSRX NOTSSUB CMSTARTER1LBR}STARTER2LBR8STATUS CMSWEEP CM\SYNONYM CM SYS212 CM2SYSTEM  TABS COMTELL CM TEN-COM TQTTIME COMTXT23 CMTXT2ASM CM G$:$k234 Q͇Sa1Iz Q е08|,ŇÂ, YhRph ) fHYj>,HP[3Q&TLꊮ=Tx0Q28CRO1pv> h6J&΅Kk͍beG1pĠIQ`pWi ET">FFM"+4yߵ]J&s·||<kzhRɿ"+$yf ԼDv^Y J&ӵײ^Z_V5[5|Lqص]{_z%Yƍ]gv&S4 Q5܄fkLI㬒BqA}ud5YLqh|\(]{O/'LnĢYD5e}I~`zbtO?' HDId ײ>WvS$k2\_d e QfzF hLg5LRkw(ɚ3S&|XVpW;&I㬂tmdM`nB54 &S$k2Qe h6j2 h_ۗg|DBbRW]۵,6kbqz]%bf@m4qƧ$)+S-IڻOWv^3Hj2l*faELh4&a4 ]%Yj>,+8e1Z%ҸT#(ɚJTv+Q})LiMpFWѲfvQaapڮn%YUa[7|۵#%YR[ܵ] #|)0xM*~~)yQlF܀&fLB 4KqӘL:oVpb28#&Ml*v7n|@PN7"|)4BbJdv^3(ɚLµW]۵?@@dM ,0"G,%YGVe%e *6T*)T4 Mo>2ջ h&S hׇJTaY'rI,K>hꕮ\#D kY#AŤ#MS \keB"š>4n iSMS u~Aе&J F,4EgfqӔB +J \/QZԁf^\`2%]] IAеQ)n@·||<kzhRɿ"+$yf ԼDv^Y J&ӵײ^Z_V5[5|Lqص]{_z%Yƍ]gv&S4 Q5܄fkLI㬒BqA}ud5YLqh|\(]{O/'LnĢYD5e}I~`zbtO?' HDId ײ>WvS$k2\ EDFILE UTILITY USAGE Jan 10, 1984 by Mike Mosko, K3RL EDFILE is a public domain utility which allows display and editing of data in files. It has been tested and run under CP/M- 80 version 2.2 and TurboDOS 1.2 and should run in any CP/M-80 type environment. EDFILE is approximately 11k in size. EDFILE may be freely distributed to whomever desires it. The date of this document should agree with the version date in EDFILE. FEATURES: ======== - Hex and ASCII display of record data. - Screen editing of selected record. - Hex or ASCII input when editing file records. - Fully programmable cursor control. - Powerful file search capabilities. - Forward and backward record scrolling. - Address and/or record number referencing. - Decimal or Hex number inputs. - Disk reset on input (prevents Disk R/O error). - Full online abbreviated help AND expanded help menus. INSTALLATION: ============ The following information will aid the user when installing EDFILE on a different terminal. The EDFILE original distribution program is originally configured for an ADM-3A type terminal or equivalent (I use a Digilog S1500). The terminal must be able to display 80 columns by 24 rows. The only absolutely necessary function required for proper use is the cursor positioning function. Other functions that can be added merely for visual purposes are the cursor on, cursor off and clear to end-of-line functions. If the clear to end-of-line function is not preprogrammed, it is performed in software. These functions are not implemented in the original distribution version of EDFILE. For ADM-3A type terminals, the following commands can be patched in EDFILE if these attributes are desired: Clear to end-of-line .... ESC 'Q' (1B,51) Enable Cursor ........... ESC 'X' (1B,58) Disable Cursor .......... ESC 'Y' (1B,59) For example, to add the clear to end-of-line function, patch a 02 for the string length (2 bytes for the sequence) at address 146. Then patch a 1B in location 147 and a 51 in location 148. Certain functions are programmable for the type of terminal in use. Five bytes are reserved for each terminal function (string sequence). The first byte represents the length of the string sequence. For example: the initial cursor positioning string for an ADM-3A terminal is 'ESC ='. This is two bytes in length. Therefore, the values inserted into the cursor positioning sequence area are (in hex): 02,1B,3D. To complete the cursor positioning sequence for the terminal, the row and column must be issued as well. The ADM-3A requires an adjustment value (or offset) of 32 decimal (20 hex) be added to the row and column. For terminals that require a different offset, this value can be changed as well. The row is usually sent before the column, but if your terminal is different, i.e., the column must be issued first, then set the high order bit of the cursor offset value. This flags the cursor positioning routine to send the column before the row. The following addresses detail the location of the modifiable parameters for the terminal. Address Default (hex) Function ------- ------------- -------- 140 02,1B,3D,00,00 *Initial cursor positioning string sequence 145 20 *Row/column adjustment (set high bit for column/row) 146 00,00,00,00,00 Clear to end-of-line string sequence 14B 00,00,00,00,00 Enable cursor (cursor on) string sequence 150 00,00,00,00,00 Disable cursor (cursor off) string sequence 155 08 Cursor left (normally CTRL-H) 156 0C Cursor right (normally CTRL-L) 157 0B Cursor up (normally CTRL-K) 158 0A Cursor down (normally CTRL-J) 159  00..........00 Terminal initialization string (35 bytes) * - Must be implemented. If your terminal requires some sort of initialization string, either to preset it or to program a function key pad, this can be inserted into the terminal initialization string area provided. The first byte represents the length of the string to be issued to the terminal. There are 35 bytes available for an initialization string. Why so many? The Digilog S1500 computer I use allows reprogramming of the numeric keypad. This requires 28 bytes. The actual control sequences for positioning the cursor (up, down, left and right) can be changed. This is provided for terminals that have cursor positioning keypads which don't issue the same ones programmed here. For example: usually a CTRL-L moves the cursor one space to the right. However, if your cursor pad issues some other control character, like a CTRL-D (WordStar type), then patch a 04 (hex equivalent of CTRL-D) for the cursor right value. Note, the help menus will still display the default values for up, down, left and right cursor movements. You'll have to make a note about this or, better yet, use EDFILE to patch the help menus. All of the above modifications (patches) can be made easily with EDFILE itself. Of course, if it won't run at all, you'll have to resort to some sort of debugger such as DDT, SID, MONITOR, etc..., or better yet, use someone elses computer with a (working) version of EDFILE to modify it for your terminal. EDFILE should work on virtually all terminals currently in use. There may be some real strange ones out there that I don't know about, but that's life. OPERATION: ========= EDFILE is simple to use especially with the online help menus. Therefore, just a few tidbits of information is provided here for operation. To invoke EDFILE, simply type EDFILE followed by the name of the file you wish to dump and/or edit. Example: EDFILE EDFILE.COM The display should look similar to the following: ------------------------------------------------------------------------------- Vers: 01-10-84; by: J.C.Kaltwasser & M.J.Mosko, K3RL File: EDFILE.COM Record: 00000 (0000H) LOF: 00086 (0056H) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ---------------- 0100 - 31 EA 01 C3 EA 01 0D 0A 56 65 72 73 3A 20 30 31 >1j.Cj...Vers: 01< 0110 - 2D 31 30 2D 38 34 3B 20 62 79 3A 20 4A 2E 43 2E >-10-84; by: J.C.< 0120 - 4B 61 6C 74 77 61 73 73 65 72 20 26 20 4D 2E 4A >Kaltwasser & M.J< 0130 - 2E 4D 6F 73 6B 6F 2C 20 4B 33 52 4C 0D 0A 24 1A >.Mosko, K3RL..$.< 0140 - 02 1B 3D 00 00 20 00 00 00 00 00 00 00 00 00 00 >..=.............< 0150 - 00 00 00 00 00 08 0C 0B 0A 00 00 00 00 00 00 00 >................< 0160 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................<  0170 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................< ? ------------------------------------------------------------------------------- EDFILE performs an automatic disk reset (^C) when executed. Therefore, don't panic if you suddenly realized you forgot to perform a Control-C after making some changes. This prevents the infamous (and frustrating) Bdos Err on A: R/O from occuring when writing records. The LOF means the Length-Of-File which is the total number of records in the file. Record numbers begin at 0; the last displayable record number is actually the LOF - 1. If you don't specify a file on the command line, you'll get an error: "No File Specified."; or if the file is not found, you'll get an error telling you this: " Not Found." Simple. At the ? prompt, type 'H'. The brief help menu will be displayed: ------------------------------------------------------------------------------- Read/Edit File Utility Functions: A - Address to dump B - Dump at beginning C - Continue Search E - Enter Edit Mode H - This help list M - Expanded Help list O - Set address offset Q - Quit this program R - Read & dump record S - Search for string Z - Dump at end of file CR - (+/=) - Adv record (-/_) - Decr record Edit Mode Functions: ^E - Toggle data fields ^W - Write buffer out ^X - Abort Edit Mode ^J - Cursor Down ^K - Cursor Up ^H - Cursor Left ^L - Cursor Right ------------------------------------------------------------------------------- Again at the ? prompt, type 'M'. This will display the expanded help menu. ------------------------------------------------------------------------------- Read/Edit File Utility Functions: A - Enter relative address to dump B - Set record to beginning of file and dump data C - Continue search. Restarts search on last entered search string. E - Enter Edit mode on current record H - Brief description of the functions M - This help description O - Enter offset address relative to start of file (.COM = 100h) Q - Quit program R - Enter record number to dump S - Search for hex or ASCII string in file (starts at current record) '\' = ASCII string delimiters (ex: \Test\) ',' = hex and/or ASCII delimiters (ex: 41,\Test\,4A ';' = select search options A - Start search from beginning of file B - Search Backwards M - Search on certain bits set; use mask xx O - Stop on xx occurrence of string U - Translate lower case characters to upper case Z - Search recognition on least significant 7 bits only Z - Set record to end of file and dump data CR - carriage return (or +/= key) - advances record and dumps the data -/_ key - decrements record and dumps the data Edit mode: ('^' refers to the Control key) ^[ - (ESC) Accept next char into edit field even if a control char ^E - Toggle between ASCII and hex data fields ^W - Flush record to disk ^X - Abort edit mode without updating record ^J - Cursor down ^K - Cursor up ^H - Cursor left ^L - Cursor right Input integers are decimal. Use 'h' suffix for hexadecimal entries. ------------------------------------------------------------------------------- Use the '=' key (which has the '+') or the RETURN key to advance the record. You don't have to use the shift key with the '=' key. EDFILE will wrap around to the start of the file when attempting to advance beyond the end of the file. The following paragraphs expand on the features available in EDFILE. Most of the options are self-explanatory from the help menus. However, some require additional explanations and are provided below. ADDRESS/OFFSET OPTIONS ---------------------- The address option allows you to specify an address within the file. This is useful for patching COM files and the like when the address of the patch is known. Note that when EDFILE'ing COM files, EDFILE automatically sets the offset to 0100h. The offset can be changed by typing 'O' at the command level and entering the desired offset. The headings will be adjusted for the different offset automatically. The address option always references the starting offset so that locations within programs which don't begin at 0100h (overlays, for example) can be easily referenced once the offset has been properly programmed. The Address option also has a wrap-around feature so that references below the current offset will be readjusted. This feature can be quite handy when tinkering around with COM files. You have to experiment a little to pickup the usefulness of these options. SEARCH OPTION ------------- The 'search' option is the most involved because it offers so many different possibilites. The description provided here should provide enough information to effectively use it. String searches normally start from the current record and proceed until the end of the file (EOF) is encountered. Certain suboptions can alter this sequence. If a match is not found, the program will indicate this and restore the screen to the record last displayed. The search can be aborted at any time by simply striking a key. If a string match occurs across records, the search will stop on the last record read into its' local buffer and position the cursor at the end of the found string. It just wasn't worth putting in the extra code to handle this wierd situation. When using the Occurrence ('O') and Mask ('M') suboptions, the program will prompt for the occurrence number and/or search mask to be used. The suboptions are inserted after a semicolon to delimit them from the search string entered. No spaces should be inserted between the suboptions. Upper or lower case is acceptable. Example: ?Search String = \This is great\;auo Stop on string occurrence = 3 This means to search for the string 'This is great' starting from the beginning of the file, ignoring the case of the string (i.e., translate lower to upper case) and stopping on the third occurrence of the string. ASCII strings must be delimitted by backslashes ('\'). The limitation here, of course, is that you can't search for backslashes in the file. So use the hex equivalent if necessary: 5C. The 'U' suboption (translate lower case to upper case) will translate the search string to upper case automatically, as well as converting all lower case characters read from the file. So, you don't have to input the search string in upper case when using the 'U' suboption. When inputting hexidecimal values as part of a search key, they MUST be two-digit HEX (not decimal) numbers. An invalid hex digit entry will cause an error and the string entry must be reentered. Two digits must be supplied for each hex number otherwise the search won't work properly. Upper or lower case for the hexidecimal letters is acceptable. Example: ?Search String = 40,FE,e5,05 You can mix hex entries with string entries within the search key. Example: ?Search String = 40,FE,\help me\,E5,05 The Backward search suboption (B) will start the search from the current record and continue towards the start of the file. It DOES NOT reverse the search string key, that is, if you enter \HELP\ for a search string key, it will not search backwards for \PLEH\. It only refers to the direction the records will be read while searching for a matching string. Also, each record is searched from the start of the record. The search stops when the start of the file (SOF) is encountered. The Mask suboption is for those cases where bytes in a file use certain bits for special meanings. The input mask is logically AND'd with each byte in the file before comparing it to the search string. Therefore, some bytes could pass the search test but still may not be exactly what your looking for. ?Search String = 03;M Enter string search mask = 0Fh This will mask all upper nibbles (upper 4 bits of each byte) and then compare it to a 3. Therefore, any data bytes which have a 3 in the lower nibble will cause a match with the search key. When the search string is found in the file, the search is temporarily terminated and the cursor is positioned at the start of the found string. Note, that the program is NOT in the edit mode, so the next key entered is a command not an edit control key. Hit a space (or any unrecognizable command) to redump the record and place the cursor on the command line. Hit an 'E' to go into the edit mode. The cursor will remain positioned at the start of the found string. CONTINUE SEARCH OPTION ---------------------- Hitting a 'C' at the command level will restart the search from the current record and cursor position (if previously defined). The search facility will then look for the NEXT occurrence of the entered string sequence. The 'O' suboption is affective only on the initial start of the search. The Continue ('C') option effectively disables the occurrence value previously entered. The default string occurrence is 1, i.e., the first (or next) occurrence. The Continue option can be invoked at any time after a search string key has been entered. All other suboptions are in affect when continuing the search. RECORD EDITING -------------- Record editing is accomplished by typing an 'E' at the command level. When in the edit mode, there are two modes of editing. You can edit the HEXIDECIMAL field area of the record or the ASCII field area. When  entering the edit mode the cursor will be positioned at the upper left corner in the HEX data field of the current record. To switch to the ASCII data field of the record, simply enter a CTRL-E. This will toggle the cursor between the two fields. The HEX field area will only accept hexidecimal digits for inputs. The ASCII field will accept all key inputs including control key inputs if they are preceeded by an ESC key. For example: to input a CTRL-K into the record at the current cursor position, hit the ESC key followed by a CTRL-K. The ESC key simply means 'put the next input character into the record even if its' a control character'. This is only affective in the ASCII field area. Non-control characters (i.e., regular ASCII) can be typed in directly. To make the record changes permanently to the file, they must be flushed to the disk by typing a CTRL-W. Typing a CTRL-X will exit the edit mode without updating the file. BUGS: ==== There are currenly no know bugs. However, inputs are not completely validated, therefore, some conditions could cause different results. None, however, are know to cause file crashes or anything catastrophic. Any reports of bugs will be noted and appreciated. USE UNDER TURBODOS: ================== EDFILE is especially useful under TurboDOS. Using the filename $.DSK or $.DIR upon entering EDFILE allows editing of the disk and/or directory. I use EDFILE in every case when I need to look at the disk directory and make changes to it. The search facility makes this task a breeze. BACKGROUND INFO: =============== EDFILE was written in a language called SIL (Systems Implementation Language) which was obtained from DDJ and then enhanced and improved at Digilog, Inc for use in writing systems programs and utilities. SIL is very similar to 'C' but allows true inline 8080/Z80 assembly language coding (very useful) and compiles to actual assembly mnemonics. The output of the compiler is passed to Digital Research Inc's Relocatable Assembler (RMAC) and then to DRI's Linker (LINK). No special tricks were used in this program; that is, no system specific calls or locations were referenced, therefore, it should run on any CP/M or equivalent system. Of course, Murphy is lurking around, so don't depend on that assumption. FUTURE VERSIONS: =============== On the wish list is to add the capability to read and edit the data off of the disk on a track/sector basis. Any other ideas will be seriously considered in future versions of EDFILE. Thanks and good EDFILE'ing. Problems, suggestions or questions can be sent to me on my CompuServe number (#72345,1540) or via my home address: Mike Mosko 519 E. Station Ave. Coopersburg, PA 18036 is very similar to 'C' but allows true inline 8080/Z80 assembly language coding (very useful) and compiles to actual asseP-5F#Nah1!*]]!Z*!f*### >T]goM#"R* }CJw#Ò^o&ͭ}]To&|G(o>gz(_>W!9!T]&){ݖOzݞ#YW3333ȯo>g^o&ͭ{]To&ͭbkFOxy'Ez(!{C%FOxy?Ez(!{C<n2}2>22͛x|2}2z2{2͛gh>!!ҺOx!Gy!!!«:G:nR(.n((0$R(n8R n8R>n(8R( nR s#r_zO_Ty_!c{ozg??zO_0"y_!c0[zW{_>ݦw>ݦw")"'*)V^*'fnV^էR(0DM"%*)V^*%tu"*V^~""*fnV^R8*""*fnV^R8 *"*V^~rs"s>2 :O**V^T]!fn_tu d++++##++++"*!ututq#p##q#p"*fnV^R>>2"*fnV^RDM*^# x y :  }2B"C*CV^:BwrsK*N_W">og*[K>og*[vog*[K:og*[K"E*Eͩ"G*Gʺ> *E͉"I}2K*I͛2c:c!->-2h>+2h:c!+2i:c!-!i*I͛2c:c!02j:c!9!j8>og>2d:c!02k:c!9!k2l:c!A2m:c!F!m!lʟ:c:dog[Lw:d2d*I͛2c=:c!Hʺ>2K*I͛ :c!O>2K*I͛ :dogR[L~!D ! }2K:dogR}2d:dogR}2e>og"f>2d!d4:e!dʌ :dog[L~2c:c!9d :cogAR }2cs :cog0R}2c*f:K_Ẃ:c_W"f# :h!-ʥ *fT]goR"f*f"n"p}2r}2s> 2> 2*ts*n2:r! ! >-2*nT]goR"n *n *t!0*n& :r!M *n}o|g}2*nT"n :r!x *n}o|g}2*nT"n :r!ʣ *n}o|g}2*nT"n *n:r_W}2*n:r_Wͭ"n:!  :Aog R}2 :02*t:og :!- *t!-:sog&ʦ *tͩ":sog[d >2!4:s!` *p!* B æ *tͩ":sog[R}2s>2!4:s!ʦ *p:og Å *tͩ}2s>2!4:s! :s!og[t~2*p:og ø "n"p}2r}2s>02 }2"*/ :og:= *:ogF ,PRINTF called with invalid format string" " "B * R(*  *D s*D " *B ͩ" *B fn" * R #*B * tu* R * * *B ͉%([ o* +" > 2A *B ͉% [ o* ++" 08Q(:002 *B ͉2A *B ͉G>2 xa8 "> D(&N("O("X("H(U({C(9S([! > >>G: OH* *> :A ͩ 6 1*> :  }2 L* : oM*  *> * *B ͩ" I *> >2@ T: (_ͭ [ :A ͩ  *> T0:@ o [ Y:!͝2*%s %s  %c&.- 4%s =%s F O%cW.""*ͭ"*">og"*>og"*#"*R[*s!!** **!T]goR *́"*#"*́[Q*s!!**[~og ** !T]goR **́"*#"*́[*[~2:! 2:!!:og*!T]goR *$f*+*"ß**s!!** **2!T]goR *́"*#"*́[[ʍ*s!!**[~og **;!T]goR 2*D*́"*#"*́[[*[~2:! 2L:!!L:og*M!T]goR *Uâ"!"%GDsMK!ͥ"#DMJP *![%R0 *!#"!!*#GDsMJPSP | } >2'2'OD^#VS(:' 0* n&[(!YD| } >^#VS("*MGJP**"*MGJS***,0 >2%*>u6!:% ! p/(!hp/( !hphysical = %d  }ʹ~2~2~2nf">(>2nf"*~62~722n8&"n5&"BK80)xz2P{2Q"!":P2P:Q2Q,*&* DM:Qg:PN*)"*)H#" <)TKB7B0 =_|}/o|/g#͆ ͌~˿͘~#(_͠~#OF#|u  R{0} (>- x( 8G͆͘ y2ts1D͠S:( =Gćy{!>2"!C\>?2hx͠A2|?????????????2!"\͠*#"`ƀo&"xE͠yb"yb *D8 xb[D8x8  x(x0}M܇yD8yXxX~w*&[sTR{(#":r2222:!_!0:(͆ {ͮ:!w:20 x :=2 >2~2#:2*,&444xGyOzW{_ #q#!Du!DsO X~o&)))Dw *:t7#?(7#)[0*0͠ʓ4*0!)[0???????????! w#w#w#wSGbk 6 fnV^RDM[G#~:+  ~_@## ~.( ( a8{0 #  ![G#~a8{0 # ɠ]5*[T0:0!-͝M5*0T]goR"0*0*0*024:0 5! Unknown Command" Too abbreviatedʣ5*"0>&![0w*"0*0!)[0*!)[0*"*"*My commands are: 0%I don't know anything about that.WPlease be more specific."I"K"M}2O"P*Is:O!-#ʱ*:Oog:*Iͪ!G*R*IW*R*KL"**)[M"!*.ÍG>_WogR"*[$*ÍG>_WogR"*[G*Í*P"">2>2!**W>2!4!:_W:og)["*"*6!*e2:!.*6**m2:!#:og":!#>2>2v:!">_WogR"::!#:>_WogR"*}2:! 2:![!i: 2:"">2*6!2*e2:og>2:! !2*e2:og>2:! ê!-*e2:og>2:! #!2*e2:og>2:!->2Ã>2:">![w>![w"""*s*ͩʁ**ͩ&*͉2 : !(2 : !,! 2 : !)! *: ogÁ" ""* ͩa*>og"*#"![a*)["*"*6*͉!.I*6**6 * *L"*ʗ*)["*"**ʫ*.*ʿ*UBIOS SELECT DRIVE BLOCK DIRECTORYDISK PARAMETERS ERASED FILE DIRECTORY$ FINISHED2FIX BAD SPOTSEHELPOMARK BAD SPOTbRECOVER ERASED FILE{RESET DRIVESELECT DRIVETRACK AND SECTOR'TURN OFF/ON DISPLAY OF BAD FILENAME VERIFYWHAT FILESWHERE IS FILE . "0CM`y 9 VDnQTQWf8Vaj+`NVVn1Y!a.ok͜?_À=![b:~}2f:"g:*͠ʞ=!:f:*:w*"7;:*7;[k:w*k:["i:*g:!!)[i:*"*͠=!*R"*"5;*k:[5;"i:!)[i:"*5;[k:~2*5;[k:~*͠O>!}*R"5; >ͪ>29;\<*[ʁ>! :9;!-͝ʟ>*[T]goR"[ =2:;::;!+͝>!+@>::;!-͝>!-@>>+2:;::;";;>og*;;[K>og*;;[K**;;[K>og*;;[K"=;"?;*=;*?;[K>og*?;[K>og*?;[K*=;#͠ʇ?>og*?;[K×?>og*?;[K**[K>og*[K>og*[K>og*[K>og*[K͍9"A;>og*A;[K>og*A;[K:og*A;[K**A;[K*:_W"*"*A;*"*>2W:(2k** ʏ@ T@w!4#"*!{ R >7*"*":(#*#"::G**@> @> @*#"!4>͎6~@#@_:N :T(L :!4:DA!4: (:{ >:2:9`A!4:2!6> !ͳ7!B~͵A#OA!6! P~ wA+fAÇA!{ ~͵A#{A> ͵A> ͵A!FOxDGy£A> ͵A!{ P> w#«A:N(T(:( ml@O:y ͣA!"fn"!{ "*+"RiB*~#"W???? .B70B0*w#z GB7IB0w#"! 8AA!{ "AA!FN~YC# x y :•BAJC(>72JC!wJC!w!FN !###JCw# x y :N!V^*R!"G@ͣA:L(&T("!fn"!{ >ͳ7> 2  { :(O!@"k*"ml*O:yʟC! ~"|ml*#vC> |ml> |mlͣA*>u6*8¶C~ʧCCC!FOxLGy§CW"!{ "*>u6h6z#D*~02 V^">! ͳ74D! " !>Dh6A*çCUNDEFINED>2̈́k!lj:N(WͨkW!lj!">2:N(Z>2!">rH> ~G>*ͣG!"!"!{ "!E.(>7>Qw>-U͸FͣA!"͖BA!fn*8(!fn">͋7!fn"N!fnRDD!~D͠C:N( T(̈́kG:N(5>~G>!ͣG:(=F>~G:( :|ml|̈́kͨkͮkWͨk*!8 !Q"> !\ͳ7!\ @*"> !iͳ7!g@$INIT O:Nȯ=FyFOyO=FO:N>=Fy/=Fy=F}F|F(!ZF!zF:''o>g::62.*&"ˇˏ˗˟˧ ˯˷˿2:=(2>2:|ml>fn}*IU|*##IU*####"~0(;~((~E~E>>fnF*##"(> 7~ ~ EE >nfF*ut>Fݓ+ G:NxO>=F=F=FyO=FG:NxO=Fy=F}F|F+~ (#x x,( FIX version 1.7 as of 3 Sep 81 */,1,Breaking out of setmap.N, nY,~0(~k,(Running under CP/M version %h.%h ,~GͣG2>,Parameters for drive %c: ,Sectors per track: %d-%d ,Number of tracks: %d -Storage capacity: %dk )-Directory entries: %d F-Block shift factor: %d d-Block mask: %d z-+Directory allocation blocks: %s (%hH) -!Operating system tracks: %d -Extent mask: %d -#Checked directory entries: %d .BIOS SELECT DRIVE(drive,[track,sector]) Selects drive directly through the BIOS. The reason for having this function is so you can select a disk with a bad directory. If you use this routine to select the disk, all that will happen is the drive will get selected. CP/M will not know that you have selected a new drive, so don't be surprised if DIRECTORY doesn't give correct answers. [track,sector] is optional. If present, track sector will be read. Display of bad file names is automatically turned off by this command. Examples: BIO sel(B), b s(c,3,21), etc. 0BLOCK(block number) Gives the file name in which the block occurs. Examples: block(15), bl(243, b(10, etc. 1DIRECTORY Gives a sorted directory listing of the currently selected drive. This routine will NOT work properly with disks that have more than 512 directory entries. 1DISK PARAMETERS Displays the disk parameters of the currently selected disk. For 1.4 systems, the following parameters are displayed: sectors/track, block shift factor, block mask, number of blocks, capacity of disk, number of directory entries, directory block allocation, and the number of tracks reserved for the operating system. For 2.2 systems, the extent mask and number of checked directory entries are also displayed. 3ERASED FILE DIRECTORY Same is DIRECTORY command, but the files displayed are files that have been erased. These files may be recovered using the RECOVER ERASED FILE command. p4#FINISHED Return to CP/M. 4 FIX BAD SPOTS Fix does two things: (1) Displays the track, sector, block and file (if any) that contains the bad spot and asks if it should attempt to fix it (by reading the sector, writing the sector, and reading it again). (2) Asks if the user wishes to place the bad block a bad spot file. The user may try to fix a sector as many times as he likes (through yes or no questions). *** IMPORTANT *** The VERIFY command must be called before FIX is called. VERIFY puts all the badspots in an array that is in turn used by FIX. To get back to the main program without going through all the badspots, the user can must hit the Escape key (ESC) followed by a carriage return when the computer asks 'Try to fix it?' 7`HELP(command) Displays all commands or one command in detail. For instance, typing 'help' would give you a list of all the commands. Typing 'help(list)' would give you a brief description of what the command 'list' does. As with the rest of the commands, HELP can can be abbreviated (e.g. he, hel, he(di, h(fix), etc.)  9qMARK BAD SPOT(track,sector) Adds the block corresponding to track and sector in BADSPOT.!!! file. If bad spot file doesn't exist, one is created. This command is used when there is a known bad spot on the disk that for some reason the VERIFY command doesn't find. Examples: MARK BAD(45,6), mark(23,23), m b s(3,16, etc. v:RECOVER ERASED FILE(filename) This function attempts to recover the erased file given by . A check is made to see if any of the erased file's blocks have been re-allocated. Re-allocation of a block means that a piece of the file has been destroyed. The file will be recovered anyway. Examples: RECOVER(D.COM), recov(fix.spl, recov(junk.???), etc. ;PRESET DRIVE(drive) This function resets the disk system and selects drive . This enables you to change disks without having to reboot. A typical use for this routine would be if you were verifying a bunch of disks and fixing all the errors on them. Examples: reset drive(b), r d(p), reset(A, etc. O=SELECT DRIVE(drive) This selects the disk drive to which all subsequent disk accesses will take place on this drive. The default drive is whichever drive is logged in when this program is run. Examples: s d(b), sel(c, s(a, etc. X>TRACK AND SECTOR(track,sector) Displays the file name of the file containing the track and sector . Examples: t a s(12,23), t(76,5, t a(34,15, etc. ? TURN OFF/ON DISPLAY OF BAD FILENAME(switch) This function is here so that you can control whether or not FIX will display the name of a bad file when it encounters a bad sector while doing either VERIFY or FIX BAD SPOTS. When the directory of the disk you're checking has a bad sector in it, you should turn the display off, otherwise, leave it on. is either 'off' or 'on' (upper or lower case). The default is ON. Examples: T O D(OFF), T O(off, t off/on(ON, t o(on, etc. AVERIFY(initial track,final track) This routine reads every track between the initial track and the final track. If neither the initial track nor the final track are specified, all the data from the directory track to the last track is verified. Unless explicitly asked for, VERIFY will not attempt to read the system tracks (tracks 0 and 1 usually). This is because track 0 is usually single density and if the rest of the disk is double density, FIX thinks that ALL the tracks are double density. The current track is always displayed on the screen. If an error is found, it displays the track, sector, and block in which the error occurred, and the file name (if any) in which the error exists. These are stored in an array that is later used by FIX BAD SPOTS. Hitting the Escape key (ESC) at any time will abort. Examples: ver(0,76), verify(45,55, v(34,34, v, verify, etc. DWHAT FILES(track,track) This command displays the names of all the files that have data between the two tracks specified. Hitting the Escape key (ESC) at an time will abort. Examples: what f(10,11), w f(3,76, w files(5,5), etc. EWHERE IS FILE(filename) Displays all the track, sector, and block numbers that occupies. For instance, if the file FOO.BAR occupies all of block 2, the following might appear: FOO.BAR: Track: 2, Sector: 20, Block: 2 FOO.BAR: Track: 2, Sector: 26, Block: 2 FOO.BAR: Track: 2, Sector: 6, Block: 2 FOO.BAR: Track: 2, Sector: 18, Block: 2 FOO.BAR: Track: 2, Sector: 24, Block: 2 FOO.BAR: Track: 2, Sector: 4, Block: 2 FOO.BAR: Track: 2, Sector: 10, Block: 2 Hitting the Escape key (ESC) at any time will abort. Examples: w i f(hi.ho), w i(d.com, w i(badspot.!!!, etc. lH.0113n4479t:;M=V>?ADEW!Hd͜H*Put new diskette in drive %c:, type CRBi!*X)HUnable to select drive."Xdd_:W!͝20X*X)[YUI"Need argument of 'OFF' or 'ON'J&Can't find %s as an erased file. K Track:%3d K' ### ERROR: Track: %d, Sector: %dHK Block: %d (%hH) aKError not in a filezKOccurs in file: %S K No bad spots detected.K %d bad blockK detected.Ks detected.KBADSPOT.!!!K\\\ Out of directory space.LBADSPOT.!!!.LBADSPOT.!!!?LBADSPOT.!!!QLBADSPOT.!!!bL&No more directory space available.LBADSPOT.!!!L&No more directory space available.LLLNo errors found.MBADSPOT.!!!MTrack: %d, Sector: %d, 0M Block: %d?M File: %S is BAD. YM is BAD.gMTry to fix it? |MFailed to fix. Try again? M Sector fixed.MAdd to bad spot file? MBADSPOT.!!!MBADSPOT.!!!M\\\ Out of directory space.NUnable to close BADSPOT.!!!:N"Track %d, sector %d (block %d)^N now in BADSPOT.!!!NN%s: Track:%d, Sector:%d, NBlock: %d (%hH) N%s: Track:%d, Sector:%d, OBlock: %d (%hH) %OBlock %d not in a file. DO%s contains block %d hO$No file at track %d, sector %d O %s is at track %d, sector %dO (block %d) OOO7 ### Error. Start track greater than final track.&P, ### Error. No files on system tracks.TP????????.???iP%s is on track: %d P%s is on track: %d P%s is on track: %d P%s is on track: %d *+!}2+͆T*+s*y " * " !P!>*7 * *+v*p "),*),#"),*r [),ʆQ*p "+,*+,[p Rͥ[),&vQ*+,"+,[!sQ*/,=Q*+,*),)[##Q>\og"-,![-,~!DʽQ*] [p ́*#_*L,"S,!u"U,!u*'!&ʟS!!2"W,![W,~oǵ"Y,![W,~og[Y,"] ![W,~2_ ![W,~2` :` oǵ"b ![W,~2a ![W,~oǵ"[,![W,~og[[,"d ![W,~oǵ"],![W,~og[],"f ! [W,~oǵ"_,! [W,~og[_,"h ! [W,~oǵ"a,! [W,~og[a,"j ![W,~oǵ"c,! [W,~og[c,"l >!_ !2e,*d R:e,_Ẃ[] ͭ[l "n *d ʁS:a 2f,>!f,͛ogR"t ÜS:a 2g,>!g,͛ogR"t WT*4"W,![W,~og"] ![W,~og"f ![W,~2_ ![W,~2` :` oǵ"b ![W,~og"d ![W,~oǵ"h ![W,~og"l >!_ !2h,*d R:h,_Ẃ[] ͭ[l "n !ͥ"p *p |T*] R"r ÂT*] "r Q>og"-!!!22+!! 2"'!ʻT>og"'!*'!*'!ͭ*i,!T]goR {Q*+s!T8V",:+Aog*,!T]goR *r *p *,!T]goR *n *,!T]goR *b ͭ[d ́* -!T]goR *f *'-!T]goR :_ og*D-!T]goR :` og*b-!T]goR *,s!!*,*h ͩ *h *,*x-!T]goR *l *-!T]goR *'!&7V:a og*-!T]goR *j *-!T]goR ".*jH* *+"H*++_2H:Hog*H!T]goR *Hͪ:HogAR}2H:Hog͡V!VͳV"H!! 2"H*+͉_2+:+ogAR}2+:+og!2{Q>og"-!"H*+͉_2+:+ogAR}2+:+ogog0W*H>2+Q>og"-!*+ͩ&ʂW*+͉! *+"H! *+"H*H*H*H"H/"H"H*Hs>2H>og"H*H#"H> og[H3X*H[H~! X*H W:H!W*H!.>2H*H*H[H~og0X:H!0X>2H*H!.íW"H*H͉2H:H!a2H:H!z!HoX:Hog R}2H:H"H"H*H_"I*H_"I*Hͩ" I*Hͩ" I* I[ I&ʵX>*Hͩ"I!}2 I*Hͩ"I: Iog2I*I&!IY*H4X2I*H4X2I:I!I"Y>2 IX*I*H͏*I*H͏: I"I*+ͩOY*I*:I*+sX2KI*CI*+sX2LI:KIog2MI:LIog!MIʕY>2+ýY*NI*+sXogʶY!}2+ýY*VI"zI*zI)[#"|I*|I[p Rͥ"~I"I*I;Y"I*~I[l R[] ́[IR"I>!_ !2I*I:I_Wͭ"I>!_ !og[Í[] ͭ[l "I!:_ _W0[Í[] Y"I!!2*I*I>?! [Iw>2I*+s*I!22I:Iog&2I:I!!Iʿ[*d I[:I!! jog"I>og"I*I#"I>og[IF[*I[I~og[IC[!}2I[â[:I!! jog"I>og"I*I#"I>og[Iʢ[*I)[I[Iʟ[!}2In[:I!ʼ[*I!22IZ:I![>\>2I*d [*IR"I[*IR"I*+*I͍W!}"I!!2"I*Iͭ"I*I}2I!}2I>og"I*I#"I:Iog[Iq\:I!Q2IK\*I[I~2I:I!I!#ʕ\!}Ø\>"I*I"I*d s]![I~oǵ[b ͭ"I![I~oǵ[b &\*I"I>og"I*I#"I*I[Ip]![I[I~og \ogm]![I[I~og![I[I~og*I!T]goR ]]^![I~oǵ[b ͭ"I![I~oǵ[b &ʻ]*I"I>og"I*I#"I*I[I]^![I)[I \ogZ^![I)[I![I)[I* J!T]goR ![I)[I}ZogS^*+Z^*8J]"kJ*%![f 2qJ:+!!qJ_*%!_*!!"!!*] R"rJ*!![rJ^*#!"#!>og"!!*!!ͥ*#!* !#_*!!*#!*tJ!T]goR !}*%! ́[ "mJ>og"oJ!}2+:+og2J*oJ !Jʐ_*oJ[kJ~!?#ʃ_*oJ[kJ~2J*oJ[mJ~2J:J!J"ʃ_>2+*oJ"oJ)_*%!"%!![mJ~og2J![mJ~og!J_!"%!d^:+og_>2+*%!R}_!}"J>og"%!>_WogR"!!*l "#!>2+*J^^"J*J*+!![Js>?! [Jw*J_og"J*Jʇ`*+*J!T]goR *J ́"J* [J͘\>*J[ w*!!ͥ*#!* *J^^og"J*J& a*J ́"J* [J͘\>*J[ w*!!ͥ*#!* *J^^og"J`"J*+ͩLa*l ")!*n R"+!Áa! *+")!*+ͩsa*)!"+!Áa! *+"+!*)!"J>og"-!>2K*J[+!2K:K!!Kc*J* K!T]goR *r [p R!*J"K*K&2K:K!!Kʥc[!#ʛc*K*J*K!T]goR *K*JY"K*K*K*FK!T]goR :+ogʉb*K}Z!sb*_KÉb*+*xK!T]goR *-!b*K*-!)["*J*-!)[/!*K*-!)[!*-!"-!Pc!}2K>og"J*J#"J*-!R[Jc*J)["[K c>2Kb:KogPc*K*-!)["*J*-!)[/!*K*-!)[!*-!"-!*K;Y[r jc!"KØc*K;Y"K*r [p R*K[p R*J"Kâc!}2Ka*J"J[!c!}2KÔa[*-!c*Kd*-!*K!T]goR *-! d*Kd*K*y *K*y !2ogʞd> og"K*K#"K>og[Ked>*K[y w?d*y !2ogʆd*K/>![y w>og"w f>2v *y *L>! [y w*y !2og&d:v 2v *y *,L:v ! [y wûd*y *=L:v ! [y w*y !2>og"w *d e*w [ ~!#2NL*w [t !NL`e*w "w 0e*w [ ~!#e:v 2v >og"w *y *OL:v ! [y w> og"K*K#"K>og[Ke>*K[y wåe*y !2oge*`L/>![y wf*w )[ &2L*w [t !L-f*w "w e*w )[ &2L*w [t !Lf:v 2v >og"w *y *L:v ! [y w> og"K*K#"K>og[Kʪf>*K[y wÄf*y !2ogf*L/>![y w"L>og"w >2v >2L*-!g*L>og"L*L#"L*-!R[L j*L)["}Zoggg!}2L*M*+sXogdg jlg>2L*L)[!*L)[/!*M!T]goR *L)["*.M!T]goR :Logg*+*=M!T]goR g*WM*eM*Ls*Lͪ*L+_2L:L!h:L!Yʑh*L)[!*L)[/!Y!2L:+og͡V:+og!2:L!ʄh*zM*Ls*Lͪ*L+_2LÎh*M jh*M*Ls*Lͪ*L+_2L:L!Y j:L!hd!}2L:Log i*M*+sX! i*L*+ *L!2*d 1i*L)["*w [ sEi*L)["*w )[ *w "w *w [t  j!![y s>![y w*y !2*y *M> og"L*L#"L>og[Lʽi>*L[y w×i>og"w :v 2v :v ! [y w*y !2ogi*M/>![y wg:Log`j:` og[w ́![y s>![y w*y !2og`j*N"0N! *+"2N! *+"4N*4N*2NY"6Nd*d ʱj*6N*w [ sþj*6N*w )[ ![y ~!` ![y w>![y w*y !2*6N*4N*2N*8N!T]goR *\N"uN*N" * " *N*+>2v :` og"N>2N*N!2og&2N:N!!NCn>og"yN![N~og"N*d l*yN[ ~!#2N*yN!N2N:N!!Nl*+*N͍W*yN[ ~og"N*N/Z"N*NTZ"{N>og"wN*wN[N2N*N!N2N:N!!Nl[!>l!}2N*{N*N*+*N!T]goR *N*N*N!T]goR *{N;Y"}N*}N"}N*}NY"{N*{N*NY[N&ʹl*p "{N*N"N*wN"wN*NR"Nk*yN"yNÖk*n*yN)[ &2N*yN!N2N:N!!N*n*+*N͍W*yN)[ "N*N/Z"N*NTZ"{N>og"wN*wN[N2N*N!N2N:N!!Nn[!ʉm!}2N*{N*N*+*N!T]goR *N*N*O!T]goR *{N;Y"}N*}N"}N*}NY"{N*{N*NY[N&n*p "{N*N"N*wN"wN*NR"NIm*yN"yNl:v 2v :v ! [NwLk"O! *+"!O*!O}Z!ʁn*!O*#O!T]goR Ûn*!O*+*BO!T]goR "^O! *+"`O! *+"bO*bO*`OY"dO*dO}Z!n*bO*`O*fO!T]goR -o*bO*`O*+*O!T]goR *dO*O!T]goR "O! *+"O! *+"O*O[Oeo*O*O[l zo*$P*O[l ʢo*f ͭY*OY"Oðo*p *OY"O*p *OY"O*O/Z[O&o*OR"Oo*O"O!!2*O*RP>?! [Ow*+s*O!22O>2O*d q:Oog&2dP:O!!dPʽq:O!! jog" >og"O*O#"O>og[Oʬq*O[ ~og[O2eP*O[ ~og[O!eP2fP:O!!fPʩq* R"O*+*O͍W*O[ ~og/Z"O*O*+*gP!T]goR *O[ ~ogTZ"O*O;Y"O>!_ !og[OR"O*OY"O*O*OY"P*O[ ~2P*P:P_W&ʖq*O*+*P!T]goR [!ʩq!}2Oup*O!22O1pCs:Oog&2P:O!!PCs:O!! jog" >og"O*O#"O>og[O2s*O)[ [O2P*O)[ [O!P2P:O!!P/s* R"O*+*O͍W*O)[ /Z"O*O*+*P!T]goR *O)[ TZ"O*O;Y"O>!_ !og[OR"O*OY"O*O*OY"P*O)[ "P*P[P&s*O*+*P!T]goR [!/s!}2Or*O!22OqR"O*OY"O*O*OY"P*O)[ "P*P[P&s* ʢo*f ͭY*OY"Oðo*p *OY"O*p *OY"O*O/Z[O&o*OR"Oo*O"O!!2*O*RP>?! [Ow*+s*O!22O>2O*d q:Oog&2dP:O!!dPʽq:O!! jog" >og"O*O#"O>og[Oʬq*O[ ~og[O2eP*O[ ~og[O!eP2fP:O!!fPʩq* R"O*+*O͍W*O[ ~og/Z"O*O*+*gPFIX.DOC Fix is a super routine which gives you a lot of direct control over your disks. You can, for instance recover a file you have erased. And, you can specifically create files that cannot be accessed from the keyboard or that cannot be display on the screen. To use the Fix help command (good documentation), just type HELP(COMMAND NAME) For instance; HELP(RECOVER ERASED FILES) or HELP(DIRECTORY) and so on; HELP, by itself display the list of commands. Enjoy this great program. C SUPERZAP 2 FOR OSBORNE 1 (C) W.M.DAVIDSON JULY 1981 DBGRCNFGT=SUPERZAP VERSION 2.2::*;U<2*;y,u":=???????????DSK:???????????:$:Ę:":̘&=? 4=2W:<2$:? 5&:":_2>W!%:7~&$:MAIN**0*""[!"222<2!> #͜ :ڤa9M:\(2=2!]~ !  ~?(#?(W!] :!   :_XFDPENDR2FDMD\ !n"M!"""}\:( !U"Ms!\4]!222/2:( !?2!(!u͎2!(Ͱ:F À\ Select Function ===> $Enter Hex SectorN Next Sector(C Change SectorP Previous Sector(F Select New FileB First Sector of File(S Select SectorE Last Sector of File(X Exit from Superzap File-Name Access $Current-Sector 5File-Offset d:filename.typ R/s ) 7NCPFBESX!! x I MTnkDRMD:2/2!]^6  :(!!h2*| !R((*Ͱ!":u͎!6(Ͱ@:D 0^H Cursor left^L Cursor right^K Cursor up^J Cursor downS Select FileX Exit from Superzap6C Change Drive6P Select physical sector  SXCP>Wqka** No records in file ** File not found PSMD:O'I*SY[YKf "l:\_SjK^ [YKY+Sh$!"n"p222!!͉?222:!u͎2!(Ͱ:P  :7=<2;ā2;,!,-!,-*:|N,>, Enter Hex Track Enter Hex Sector 2Enter Hex Block N Next SectorC Change SectorP Previous SectorS Select SectorD Next TrackT Select TrackU Previous TrackX Exit from Superzap6F Exit to File List6K Select Block Current-Track Current-Sector 2Current-Block  # 7 NCPSDTUXFKA m F m  kM@ DPSI!*nx!*px!*rxUBLK[nKY [p[lR0!"rKj+*^R8Sr!"rNXPS*p#"p[YR8 !"pF  ͉?PRPS*p| *Y+"p *p+"p͉?SPSN*p"@ !!"p:2[:2ZJu͎2!S *p))))"p? *@ "p3 !qg!pg" *p[YR8 Ͱ*@ "p2Ͱ: ((ê ͉?!;FRTR*n#"n[hR8!"n͉?SPTN*n" !t!"n:2[:2ZJu͎2!S *n))))"n? * "n3 !og!ng" *n[hR8 Ͱ* "n2Ͱ: (( ͉?!q BWTR*n| *h"n*n+"n͉?SPBL*r" !!"r:2[:2ZJu͎2!S [r "rd * "rX [r+SrD =[r*^R Ͱ* "r2[rKj [lKY+Sn"pͰ: ((R ͉?!OLSEL NXFS*#"\: >2 Ͱ*""}PRFS*| Ͱ+"\: >2s Ͱ*"FSCH:(Ͱ !:+ (|\>2PSCH !:+ (ʹ͉?SCCH! !, >2+ 22* 2222bJu ! (Ͱ :(Ϳ:* ! ^H Cursor left(^L Cursor right^K Cursor up(^J Cursor down^I Change Side(CR New Line^Q Cancel changes(^Z Save Changes  .DlLEFT: :=2: :/2bJTOGL:/2>2bJDOWN:2bJUPWD:2bJRGHT: :/2: :<2bJNWLN>2:p2bJCHND>2* 2+ QUIT>2* SFSN*"!!""}!:2[:2ZJu͎!S *))))""}- !""} !g!g*"} (Ͱ: *"\:(Ͱ*"""}!?!> 2!FRFS!"}""\?!LSFS\#*}+"\?!CHDR!(!>2u͎ NA!%(O'| Ͱ52<22 :_[:2\>2M:D(Enter Drive Name or press ESC ===>** No files on drive -:=?2; ::?2; ::?2; ::<2; ::STFL: Ͱ!n"Z:2\:&o))))[] 2h\!"}""\: W\!U"Ͱ:WRBF*">22*">22[iJO:2͜J*~#"gͼ:<2 ͼ: >2*"ͭ:[=2[J>|͝*~#"S:<2:<2 >|͝:<2M #&),0369?@ABCDEFGHIJKLMN (2O:g:g:gi~!:O ~2Z:(ͭ͜:(:[<2[!:O ~2[ɷ!:O ~2[: 88Ͱ':&o[:wS͜J:gͼͭD:͎2!S(ͰEM:S:&o[F:(x yOxw2ͭJ:S͜JD0123456789ABCDEFDLST:@2!*"2:!(H~??_! F!:_n`:͝ͼ[!C*"!4(Drive d: Directory ListRDIR*""+"2K_*"*"K_*"L(*"*[Rz*# ͜[z!"RS*#RDM*"xʛ>2yʼG~2¼# á:_[*#!42! _F!:_n` |E<FMTN!w#>.w#2w#:>W(>O2FMTD! > w#w@w#>:w:Zg:[o>22*}"*"}\!2\"PSRDKn*Kp*n[fR8 [I<DM-3PSWRKn*Kp*n[fR8 [I<DM-6MTCHN# B+DOIT)LDHL~#foMULT>!j =&)DIVD>!))8#BA =H0SETD>D2SETF>F2SETP>P2SETX>X2CHRI(2FOLDa8{0_CHRO_ALRM>͝SPCO> ͝CLRS!CCLRL.g!CCURS!C| ͝} ͝DPNLF#DFLD~#ng##CCFLD~#ng##~(ͼ##STRO~(͝##ASCO0 0>.͝HEXO͇͇HEXW|g}gHEXCƐ'@'͝LD~#ng##CCFLD~#ng##~(ͼ##STRO~(͝##ASCO0 0>.͝HEXO͇͇HEXW|g}g#RDM*"xʛ>2yʼG~2¼# á:_[*#!42! _F!:_n` |E<FMT" SPZ.COM SPZ is a full screen interactive disk update utility, providing many of the features found in DU.COM. The program is menu driven, and little additional documentation is required. The following notes consist of a functional overview, plus notes on features not documented in the menus. SYSTEM REQUIREMENTS. SPZ requires a Z80 - it may be possible to update the source for 8080 but extensive use is made of Z80 opcodes, and this would be a large exercise. Subroutines would be required to simulate LDIR, LDDR, and CPIR, to say nothing of varieties of shift, rotate and load instructions. CPM 2.x is required. One or more disks may be used - SPZ determines if a selected disk is defined in the BIOS before attempting to access it. The terminal used must support cursor addressing, clear  screen, and erase to end of line. At least an 80 by 24 display is required. FACILITIES. SPZ enables disk sector editing in HEX or ASCII, using File Relative or Track/Sector addressing. In File Relative mode a sorted directory listing is used to select the file. In both modes forward and backward browse is provided, in addition to random record selection. The displayed sector may be copied to a scratchpad buffer, or exchanged with the scratchpad. The directory list may be full (*.*) or selective, eg *.ASM and the selection may be changed at any time. A file TYPE facility gives a paged, formatted display of any file. Control characters are displayed as "." except for TAB and Carriage return/Line feed which are processed normally. COM files are not formatted. The SPZ command format may enter any operational mode directly - SPZ enters SPZ with a *.* directory list. SPZ d: as above with d:*.* directory list. SPZ [d:]afn as above with d:afn directory list. SPZ [d:]ufn enters SPZ in file relative mode, using the specified file. SPZ [d:]DSK: enters SPZ in Track Sector addressing mode on the specified drive. DIRECTORY LIST MODE. In directory list mode the cursor is positioned on the first filename displayed. The cursor can be moved LEFT, RIGHT, UP or DOWN using Control keys. A file is selected by typing a command character against the required file name - "E" for file relative editting, or "T" for the TYPE function. Up to 32 file names are listed. If there are more files, the directory list may be paged forward and back. Other drives may be selected or the current disk changed - NOTE - if the disk in the current drive is changed, the "change disk" function should be used to select the same drive again. This provides a new directory list, and avoids CP/M making the disk Read Only. Track/Sector addressing is selected from the directory list display. The directory list selection may be changed - the default is *.* unless set by the SPZ command. FILE RELATIVE MODE. In this mode the selected file is displayed in HEX and ASCII format with record number and file offset displayed. For .COM files the address when loaded at 0100H is diplayed. The record displayed may be selected by browsing forward and back, locating the first or last record, or by setting a record number (in HEX). When setting a record number, Hex digits are entered in "calculator style" - new digits are entered on the right while the number moves left. Backspace deletes the last digit entered, and Escape restores the original number. These features are common to all number entries in SPZ. The selected record is read when RETURN is pressed. If it is not found, the previous record number will be restored. The displayed record may be changed by typing "C". The cursor is positioned on the first hex digit, and is moved using the same control keys as are used in the directory list mode. Any valid hex digit may be typed to alter the record. The TAB key moves the cursor to it corrosponding location in the ASCII display, allowing character strings to be easily changed. Another TAB returns the cursor to the HEX display area. Two control codes are available to stop editing the re#cord - one saves the changes and rewrites the record to disk, the other restores the record to its original contents. Return to directory list mode is made by typing "L". TYPE FILE Files are TYPEd with up to 72 characters per line, 18 lines per page. Except for .COM files, Carriage return/Line feed codes are honoured, and Tabs are expanded. All other control characters are displayed as "." to prevent unwanted terminal control functions. Forward and backward paging operations are provided, including return to top of file. Following paging, the highest page displayed can be restored. DIRECTORY LIST SELECTION. The ambiguous file name used for the directory list may be edited by typing "M" in the directory list mode display. The existing file NAME and TYPE may be overwritten or edited using INSERT and DELETE control keys. Only those characters defined as legal in the CPM documentation are permitted. If "*" is typed at any point in the NAME or TYPE, the remainder of the field will be filled with "?". If a SPACE is typed the remainder of the field will be blanked out. Period also has this effect if used in the NAME field - an ambiguous file name may thus be entered in the normal fashion. The TAB key switches between editing the NAME and TYPE. The ESCAPE key restores the original selection, RETURN produces a new directory list. NOTE - insert and delete affect only the field being editted, - characters do not wrap between name and type. TRACK/SECTOR ADDRESSING. This mode is entered by typing "S" in directory list mode. The facilities provided here are similar to File Relative mode, but sectors are selected by setting (or browsing back and forward) track and sector numbers. The allocation block number is also displayed and may be set. When a block number is set, the first sector of that block is displayed. The record diplayed may be altered in the same manner as File Relative mode. The scratchpad facility is also available in this mode. Note that sectors saved in one mode are available for exchange in the other mode. INSTALLATION SPZ uses the following terminal facilities - Cursor Addressing Clear Screen Erase to end of line. SPZ assumes that the cursor is positioned by a prefix string followed by ROW+020H, COLUMN+020H. If this is not the case for your terminal you must update routine CURS and reassemble and link SPZ. The cursor positioning prefix, and other functions may be altered using DDT, or preferably a Z80 debugger. Three 4 byte strings are reserved at 189H, for VDU control strings, each of which MUST end in 00H. 189H - Clear Screen 18DH - Erase to end of line 191H - Cursor position prefix The byte at 195H is used as a "flag" character in the directory list - the cursor is positioned over it. The control keys used for cursor movement are defined by equates in the assembler source and may be altered if desired. The menus will reflect any changes made to these equates. SPZ.MAC Several Macros are used in the SPZ assembly. These are provided inline. $RTN is used to head each subroutine. It generates a label (using DS 0 because Microsoft seem to think EQU statements do not need to be listed in the Macro expansion [ Ah well, it takes all kinds ...]). An entry statement is also generated so that the L80 /Y otption will provide symbols for ZSID. $PANEL Generates a call to the panel display subroutine, passing a panel name as a parammeter. $NPANEL Does the same, but first clears the screen. $FLD Generates a call to the field display subroutine. $IFLD Same as $FLD, but also inputs a character and converts to upper case. $STRO Prints the specified string. $HEXW Prints a 4 byte HEX number. $MTCH Calls the string search function. $EXVA Calls the vectored call function. Control Code Equates. A set of EQU statements is provided to change the control codes used throughout SPZ. These EQUates are also used in the menus, hence changes to the$se will correctly update displayed messages. Take care not to use 00H - CPM function 6 does not return the ^@ key! also codes realy must be control codes - 01H to 1FH otherwise the panels get funny, and results might not be what you expect when editting a sector. Thats it Folks - Willie Davidson. 8 Comely Bank Street Edinburgh Scotland.  $HEXW Prints a 4 byte HEX number. $MTCH Calls the string search function. $EXVA Calls the vectored call function. Control Code Equates. A set of EQU statements is provided to change the control codes used throughout SPZ. These EQUates are also used in the menus, hence changes to the This is the release date of the disk. SPZ DOC *SPZ .COM 0B 17 6016 47 SPZ .DOC 2E D4 10880 85  Fog Library Disk FOG-CPM.020 Copyright (1985) 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. This disk contains a number of disk and file utility programs Filename Description -12-00 .85 This is the release date of the disk. -CPM020 .DOC This is the description of the disk contents. CERTIFY .COM 084B 16K [Certify 1 of 2] Disk certification and utility program for CP/M 2.2 systems which lets you map out bad sectors and examine the disk. CERTIFY .DOC 2B6B 2K [Certify 2 of 2] DU-V88 .COM 3933 8K ver. 8.8 [Disk Utility 1 of 3] Disk utility allows you to edit any track or sector on a disk. ASM source included. Great for recovering files on damaged disks and much more! DU-V87 .DOC 91C9 12K ver. 8.8 [Disk Utility 2 of 3] DU-V88 .AQM 2620 39K ver. 8.8 [Disk Utility 3 of 3] EDFILE .COM 3394 19K [Edfile 1 of 2] Display and edit any file on your disk. Shows both ASCII and Hexadecimal. Perfect for modifying any program or fixing a data file. EDFILE .DOC 4738 20K [Edfile 2 of 2] FIX .COM 7643 29K [Fix 1 of 2] Disk utility and editor with on-line help. FIX .DOC D060 1K [Fix 2 of 2] SPZ .COM 0B17 6K [SPZ 1 of 2] A menu-driven disk sector editor. SPZ .DOC 2ED4 11K [SPZ 2 of 2] development. Often, more complete documentation, additional modules, and new releases are available only to registered users. This disk contains a number of disk and file utility programs Filename Description -12-00 .85 This is the % This is the release date of the disk.  FOG LIBRARY DISK FOG-CPM.019 Text editors (limited word processing) and other utilities are on this disk. (EDIT was originally on FOG-CPM.032). Filename Description -01-08 .88 This is the release date of the disk. -CPM019 .DOC This is the description of the disk contents. VDE-2C .COM 090E 6K [VideoDisplayEditor 1 of 4] A full screen text editor with word-wrap and macros similar to WordStar. Osborne 1 & Vixen and Osborne Executive specific versions are included here with squeezed ASseMbler source. A later version for most CP/M computers is on FOG-CPM.032. VDE-2CE .COM CD43 6K [VideoDisplayEditor 2 of 4] VDE-2C .DOC 1C5A 14K [VideoDisplayEditor 3 of 4] VDE-2C .AQM E3CF 41K [VideoDisplayEditor 4 of 4] EDIT .COM 30A6 2K ver. 1.1 [EDIT 1 of 3] Text editing, disk file space and free space reports, file printing, file copying, binary file dumping, file patching, etc. Excellent with programs like dBASE II. EDIT .DOC 0DF0 13K ver. 1.1 [EDIT 2 of 3] EDIT11 .CRD C5AD 2K ver. 1.1 [EDIT 3 of 3] BISHOW32.COM 3D1C 3K ver. 3.2 [Bigshow 1 of 3] A replacement for the TYPE command which allows browsing forward or backward through a file. Squeezed ASseMbler source is included. BISHOW32.NOT B884 3K ver. 3.2 [Bigshow 2 of 3] BISHOW32.AQM 0E32 34K ver. 3.2 [Bigshow 3 of 3] WT20 .COM 351B 2K ver. 2.0B [WordStar TYPE 1 of 3] BETA version of a program which allows typing and browsing through WordStar files on most CP/M computers. Formats the file for video attributes and can jump to anyplace in file. WT20 .DOC 6292 6K ver. 2.0B [WordStar TYPE 2 of 3] WT20 .NOT 4D7C 1K ver. 2.0B [WordStar TYPE 3 of 3] . BISHOW32.NOT B884 3K ver. 3.2 [Bigshow 2 of 3] BISHOW32.AQM 0E32 34K ver.  Disk utility and editor with on-line help. FIX .DOC D060 1K [Fix 2 of 2] SPZ .COM 0B17 6K [SPZ 1 of 2] A menu-driven disk sector editor. SPZ .DOC 2ED4 11K [SPZ 2 of 2]  and edit any file on your disk. Shows both ASCII and Hexadecimal. Perfect for modifying any program or fixing a data file. EDFILE .DOC 4738 20K [Edfile 2 of 2] FIX .COM 7643 29K [Fix 1 of 2] &'