IMD 1.16: 28/05/2007 16:33:22 -FOG/UTL011   åååååååååå  åååååååååå  åååååååååå  DIF RNO DIF2 COMs SSED2 COMQ OZCPR COMOZCPR DOCREAD ME ZCPR DOC€ !"#$%ZCPR DOCY&'()*+å-FOG/UTL011DISK DOC ,åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå.in 8 .rm 72 .ce 99 Reducing the Swelling of the Phone Bill with DIF and SSED November 17, 1981 Chuck Forsberg Computer Development Inc Beaverton OR .ce 0 Lately (if not sooner) it has become obvious that there must bå  á  betteò anä cheapeò åwaù tï distributå softwarå  updateó  tï changing programs than to transmit all of the new files in their totality, even though only a few lines in each have been changed. For some years the Unix differential file print program diff(1) (the (1) re  fers to the section of the Unix Programmers Manual in which it is described) has had a -e flag which provides a set of ed commands suitable for transforming the first file to the second. With these tools, only an update file need be transmitted, heck, compare the two files with dif. Unix folks with 14 character file names and modification times stored by the filesystem have little trouble keeping the files synchronized. (If the antecedent files are different, there's no telling what th provided, of course, that both the sender and the receiver had copies of the same antecdent file. I have written a "new" diff called dif.c which manages to operate in the primitive CP/M environment. The editing commands output in response to thee output file will look like!) ŠFor us poor CP/M folks (verrry) patiently awaiting something like Unix to appear magically on out desktops, I propose that the revision or revision date of the antecedent file be placed in the new file adjacent to the n -e option refrence sequential lines in the source files, so they (the commands) can be executed by a stream editor. (The Unix diff(1) creates difference files with non-forward- sequential commands.) To generate a difference file, the command is ew revision or date, preferably on the same line. This way the user may easily verify that he has the correct antecedent. Dif Versions 1.10 and later place hash indices of the RETAINED lines of the antecedent file in the difference output. This all  dif -e oldfile newfile >file.dif The >file.dif redirects the standard output to the file. A + may be susbtituted for > if simultaneous console output is desired. The receiver then invokes:  ssed oldfile newfileows ssed 1.10 or later to verify correctness of the antecedent file. The new .dif files are compatible with the old ssed, but, alas, not with Unix ed or sed. The array sizes in dif.c may have to be shrunk somewhat to run on a 48k system. For  Which will result in newfile being created identical to the original newfile. Well, not precisely identical, but identical up to and including the EOF (^Z) character. The dribble after that may change, so CRCK may say they are different. To ctesting, give:  dif -e filea fileb |ssed filea >filec  dif fileb filec (fileb and filec should be identical) It ought to work if you said:  dif -e filea fileb |ssed filea |dif fileb and it does, with version 2.0.    Version 2.0 of dif.c adds a -u flag which will unsqueeze filea before comparing it to fileb. Thus you can say:  sq filea  dif -eu filea.qqq fileb |ssed filea |dif fileb Or you can say:  dif -eu filea.qqq fileb·ð7Éë|ªòó|·ð7ÉzõÍZëÍZëÍ)ñ·ð|/g}/o#É|µÈÕå͉ÑÍk|/g}/o#Ñɯ2qÍZëÍZÍk:qÐ|/g}/o#É|·ð/g}/o#:q<2qÉÅÍqÁÉDM!x±ÈxGyOÒƒë)ëÃv|µÈÅÍ”`iÁÉ|·ú )ÖëxõÍÝÚ·Õz/W{/_ѯzW{_ñ=ÈõyOxGæ¯2qÍZëÍZë͉ÃM|ºØÀ}»Éëȯ|g}oÃæëÈ)Ãô|/g}/o |ssed -u filea.qqq |dif fileb to test dif and ssed. (Be sure dif and ssed are exactly where you say they are, or else pipes will be broken.) Restriction: Since the BDS Standard I/O library and the Directed I/O package are somewhat confused abo#Éz/W{/_É!9~#foÉ!à !à ! à ! à !à !à Ÿ!9Å~#ÂAÁÉá"s!`å*"³!è"µ!ÜY"—>Û2­>Ó2°>É2¯2²!Ì"�!"“!@"‘!"• ÍæÊžÍ!€ßF#x·Â±Ã~#±¯!ßb¯2r~#þ ÊÈ·Êþ"ÂÞ2rÃß+}|~#·ÊÅG:r·xÁÊþ"Âæ¯2rut translation between CP/M's cr/lf terminated lines and **nixs' \n terminated lines, dif was written to strip cr's from the input in order that only one cr appear on the output. As a result, lines terminated by cr/lf, lf, and lf/cr all come out t+w#þ Âæ+6#ÃÈÕ!×6#¯2w2x*sé!ÿÿÉ>õÍrÚ<o&åÍFáñ=þÂ-ÃÍ`Í ÍrÚ'~æÊhåÍÅÍëÍÁá6þÿ!À+ÉÍ`WÖØþ?ØÕ_!×~æ7ÑzÈ?ÉÍ`ÅÍ åþ:>ªÍÖ@w#ÍGþ.¶ÍƯww#Ã?Åþ*>?ÊéÍñÚçw#ÂÇÁÍñØÃÞ> w#ÂéÁÉÍþ.7Èþ:7Èþ7Èhe same! This would munge files where lf/cr has a special meaning (MBASIC continuation lines) or where embedded cr's are used (RTTY art). Unix is a trademark of WECO, CP/M of Digital Research. þ!ÉþaØþ{ÐÖ Éþ Ê þ Ê ÉÅÍ`·OÂE×!·æyÂ6ÁÉÕ$Ñ Â-7ÁÉÍrÚBÖo&))T])))ë!·yÁÉÕÅõå€ÍáñÁÑÉ:=æÂb#:=æÂù#:$=æÊ2#Ív+:à<·Âò"Íê(ÂÃ">6Í‹5:&=Í‹5Ã#*&=|µÂÔ"M1Í¿5Ã#>6Í‹5:&=Í‹5>#Í‹5>6Í‹5:'=Í‹5Ã#*&="ü<Íê(Â#>Í‹5:&=Í‹5>sÍ‹*ùÍKÍžÃ+@žO:‡¤Ã'Ã+ÃFÃŽÃrÃÃû Í– þ8Ê{ æÄ‚w#w#wÑÁÉÍÆÃÞá^#V#å*~#foÉá^#å*~#foÉá^#V#å*nÉá^#å*nÉá^#V#åë ~#foÉá^#åë& ~#foÉ!È+É!È#É!Ø+É!Ø#É!ð+É!ø+ÉÈÉÈÉØÉØÉðÉøÉ}»À|ºÉëz¼À{½Éë|ºÀ}»Éë|ªòìz5>@2=Ã#R1Í¿5Ã#ÍÑ(Â,#:==2=áñÍ)ÉÍê(Â@#>sÍ‹5Ã#͘(ÂY#X1:à<·ÊS#]1Í¿5Ã#ˆ2Í¿5Ã#*="ü<*&="þ<:$=æÊÃ#:à<·Â¤#Íê(—#>>Í‹5:&=Í‹5c1Í¿5Ã#f1Í¿5¯2=Ã#Íê(—#>Í‹5:&=Í‹5>{Í‹5c1Í¿5Ã#Íê(ÂÜ#:$=æÀµ#>}Í‹5c1Ú#:$=æÀÄ;-͘(Âó#>&Í‹5¯Í‹5f2Ú#:$=æÊ$Ív+è":=æÂ  $Í,Ív+Ã2#:$=æÀ>åÊ$$>ÕÍ‹5Ív+>ÑÍ‹5>@2$=Ã2#å*="ü<áä1Í¿5:=æþö2=É"ü<|·Âs$}·Âd$[2Í¿5Éõñõ·Êz$Âg$ñ[3Í¿5Éñ>�GÈ>)Í‹5Ã$#Íž*ÍD)ñõÍ�,ͶÍÏ,Ív+Í+4þÊʱ$̓)ñÃÔÃc"Ãs Æ Ãv(Ù î(Ã]6Ãå(Ãñ&Ã!ûÃ+)Ãú)ÃÃ`6Ã&Å!ùÿ9ùDM!"9P! ~#foë! s#r! ~#foë! såͰÑÑ*9P|µÊ* *9PåÍÎÑ*9På!d å!åͰÑÑÑÍÑë!9ùëÁÉdif.c 2.00 (dif 2.0) 11-17-81Usage: dif [-dev] filea {fileb,outfile] -d display lines that match -e generate Editor script -u Unsqueeze filea -v Verbose Can't open %sCan't open %sS#r! ^#Vr+sz³ÊP! ^#Vr+së~#fon}þ>Ê=! ~#fo~#fon}þ+ÂM! ~#fo~#fo#"9PÃ! ~#foå! åÍ¡ÑÑ{2`P{2bP{2cP{2aP{2_P*¥"jP*¨"lP! ^#Vr+sz³Ê6 ! ^#Vr+së~#foë! s#rën}þ-Â6 ! ^#Vr+sën}·Ê3 ! ~#fon&åͪÑ>d½Âä>¼Ê >e½Âð>¼Ê >u½Âü>¼Ê >v½Âtandard Inputbottom[%d]=%x top=%x %s$a %u . Files are different No differences encountered '%s' Unlinked Ãy Ãè)Å*5PåÍv ÑÁÉÁÉÃŒ Ãè)Å*7På͉ ÑÁÉÁÉß ÃlÅ!þÿ9ùDM*}TÍÒà *}T+"}T*TÃÃÍœ ë`is#r!�ÍåÊö `i~#fo"T*T#|µÂí !0u"}T*TÃÃÍœ "}T|µÂ  >¼Ê& Ã- !bP4Ã0 !aP4Ã0 *®"jP!cP4Ã0 !`P4Ã0 ÃX öÃ…! ~#foÍùÚX ! ~#foÍÒ® !6 å!åͰÑÑ!T å!åͰÑÑ!‡ å!åͰÑÑ!¥ å!åͰÑÑ!Á å!åͰÑÑ!Ö å!åͰÑÑ!åͳÑ!)Hå! ~#fo~#fo"?PåͶÑÑ#|µÂó ! ~#fo~#foå!ã å!åͰÑÑÑ!€åͳÑÃú )Hë"5P! ~#!�ÃÃ*}T++"}T*TÃë!9ùëÁÉÃ6ÃÃ%ÃÖ*î(Ã]6Ãè)Å!éÿ9ùDMÍ$Í'*5PåÍ*ÑvÿÍåÊo*?På!}å!åÍ-ÑÑÑ!åÍ0Ñ*5PåÍ*Ñ! ë! s#r! ~#foå*5PåÍ3Ñëás! ^#Vr+sën}·Âƒ! å*?På!Žå!åÍ-ÑÑÑÑ*5PåÍ*Ñë! s#r! ~#fo|·úð! ~#foÍùÚ *?På!šå!åÍ-Ñfo++|µÂ\ !/Lå! ~#fo##~#fo"APåͶÑÑ#|µÂR ! ~#fo##~#foå!ñ å!åͰÑÑÑ!€åͳÑÃY /Lë"7PÃh *º"lP!ÿ "AP*cP}·Êy *®"jPͼ!"=P";P"dP{2iP{2hP‡dë"CP"pP"TP‡„ë"GP"EP"\P‡¤ë"IP*`P}·Ê `i6`in&ÍùÒ `in&)GP~#foå`in&)CP~#foå`in&å! å!åͰÑÑÑÑÑ`iÑÑ!åÍ0Ñ!ÿþ"yP!ÿþ"{P`i¯w#w`i~#foå! ~#foÑÍúÒt`i~#fo))yPå*5PåÍ*Ñëás#r`i~#fo))yP##å*5PåÍ*Ñëás#r`i^#Vr+sÃë!9ùëÁÉ%s Not Squeezed (%s -> %s) %s has invalid decode tree size ÃÍÃ,"Ã1+î(Ãn+ÃØ+Å!úÿ9ùDM! n&);Pë! s#r! n&)jP~#fo"nP! 4ü !"fP!"MP"KP!OPå!åÍ¿ÑÑ*CP"KP!WPå!åÍ¿ÑÑ*EP"MP*KP###~#foýÍåÍ£å*MP###~#foýÍåÍÇá|²g}³o|µÊÎ *MPå*KPåÍÂÑÑ|µÊŒ ÍÅÃË *dPå*KP~#foÑ"dP*bP}·Êµ *KPå!$ åÍÈÑÑ*KPåÍËÑ"KP*MPåÍËÑ"MPÃ9 *aP}·Êã *dPå!* åÍÈÑÑ*_P}·Êû !3 å!åͰÑÑÃ* !H å!n&)GP~#fo"rP*rPõþ"rP! n}·Ê)*MPÃ,*KP"tP*tPõþ"vP! ~#fo~#fo"pP*pP|µÂ}! ~#fo"pP*pPå! ~#foåÍÁÑ Ñ"pP*`P}·Ê¼*pPå*vPå*tPå*rPå! ~#fo~#foå! n&å!!å!åÍÄë!9ùë! n&hPn}·ÊE!Iå!åÍÄÑÑ*pPå! ~#fo~#foå! ~#fo~#foå!   ~#foå! ~#fo~#foå! n&å!eå!åÍÄë!9ùë!å! ~#foåÍÇÑÑÃ*pPå*rPÑÍóÒ‹! n&)CP~#fo"pP*`P}·Ê€*pPå!Šå!åÍÄÑÑÑ*tP|µÂ‹ç*pPå*tPÑÍóÚ¿*pPå*vPÑÍìÚ¿*`P}·Ê¼!™å!åÍÄÑÑÃ*pPë`is#r`i~#fo##å! nëás`i~#fo"pP>ÿ2xP!xP5n}·ÊÞ*pP#"pP+å*n*ƒTåÍ Ñëás#rz³Â! 6Ãk`i^#Vr+së~#fo"ƒT! ^#Vr+s!ÍåÂL! 6Ã*ƒT###~#foýÍåÂh! 6ÃkÃé! n}·Ê! ~#foë! s#r! ^#Vr+sz·ú`i~#foå*…TåÍ Ñëás#rz³Â·! 6Ã`i^#Vr+së~#fo"…T! ^#Vr+s!ÍåÂè! 6Ã*…T###~#foýÍåÂ! 6På!å!9~#foéÑëás{þÊ+þÿÊ+þ ÊÂþ ÊÔÃÛ*`P}·ÊW! ~#fo~#foå! n&å!¨å!åÍÄÑÑÑÑ! n&hP6`i~#fo6ÿ#6ÿ`i~#foå`i~#foëás#r`i~#fo###6ý#6!Ãå`i~#foåÍÊÑÑ! ~#foå`i~#foëás#rÃ! ~#fo^#Vr+sÃù*pP+"pPÃë! ~#fo~#foå!Ìå!åÍÄÑÑÑ*pP6*pÃÃ…*`P}·ÊA! n&å! n&å! n&å! ~#foå!aå!åÍ ÑÑÑÑÑÑ*`P&ÍÒ ! ¯w#w! ~#foå! ~#foÑÍúÒ ! ~#fo)‡T~#fo~#foå! ~#fo)‡T~#fo###~#foå! ~#fo)‡T~#fo~#foå! ~#fo)‡T~#fo##n&å! ~#fo)‡T~#foå! ~#foå!Šå!åÍ ë!9ùë! På`i~#foÑÍúë! s#rz³ÊK`i~#foå!å! ~#foå`i~#foå;ÑÑÑëás#rÃU`i~#fo¯w#w`i~#fo###å! ~#fo~#foëás#r! ~#foå`i~#foëás#r*`P&ÍÒð*pPå! ~#foå`i~#fo~#foå`i~#foå! ~#fo~#foå! n&å!áå!åÍÄë!9ùë!å`i~#foåÍÇÑÑ`i~#foë! s#r! ^#Vr+sÃW*å!å! ~#foå!‡TåÍÑÑÑÑ! ~#foåÍÑ|µÊ;ÃC! å~#foå! ~#foÑëás#rñ*MP###~#foå*KP###~#foå!µå!åÍ ÑÑÑÑ*`P}·Ê;! ¯w#w! ~#foå! ~#foÑÍúÒ;! ~#fo)‡T~#foå! ~#fo)‡T~#fo###~#foå! ~#fo)‡T~#fo~#foå! ~#fo)‡T~#fo##n&å ~#fo¯w#w*pP#"pPÃEë!9ùëÁÉFile %d line %d q=%x qq=%x qqq=%x p=%x Getline called after E-O-F %d %3d fp=%x hash=%04x next=%x p=%x Wrapped: p=%x Buffer Filled EOF on file %d at line %d **EOF** Line %d is too long %d %3d gp=%x hash=%04x len=%3d ! ~#fo)‡T~#foå! ~#foå!Þå!åÍ ë!9ùë! ^#Vr+sÃŒ!åÍÑë! 9ùëÁÉDifference at %d:%d Dodiff Quantity=%d k't=%d w'a=%d w'b=%d HTBL %3d:addr=%x f=%d h=%4x l=%3d nxt=%x Can't find match at a:line %d b:line %d HTBL %d:addr=%x f=%d h=%4x l=%3d p=%x Ãî(Ãà ,Ã.ûÃ]6Å!ôÿ9ùDM>2_P*`P}·ÊU*MP###~#foå*KP###~#foå!Lå!åÍ ÑÑÑÑ! s! s‡T`is#r`i^#Vr+sÕ*KP"ƒTëás#r`i^#Vr+sÕ*MP"…Tëás#r! 6#6! 6#6! 6! n}·ÊW! n}·ÂÏ! n}·ÊW! n}·Êk! ~#foë! s#r! ^#Vr+sz·úk`i~#foå%.30s à ûÅ!9ùDM! ~#fo~#fo|µÊ<! ~#fo~#foÁÉ! ~#foå! ~#fo##n&åÍ ÑÑ! ~#fo~#foÁÉÁÉÃrÃè)Å!"�T*yT#"yTÍÒÈ*5PåÍoÑ"{T#|µÂŸ!ÿÿÁÉ!"yT*�T))yPå*{T|¢g}£o)Ñ~#fo"�TÃñ*�T))yPå*{TÍå"{T|¢g}£o)Ñ~#fo"�T*�T|·òy*�T#Íú  "�T*�TÍåÂ!ÿÿÃ*�TÁÉÁÉÅ!"}TÁÉÅ!c"yTÁÉÅ!9ùDM! ~#fo~#fo~#foå! ~#fo~#fo~#foÑÍóÒc!ÁÉ! ~#fo~#fo~#foå! ~#fo~#fo~#foÑÍìÒ�!ÿÿÁÉ! ~#fo~#fo##nå! ~#fo~#fo##nѯgWÍúÁÉÁÉÃÓÃ+)î(Ãn+ú)Ã�'ÃÃ�-Å!êÿ9ùDM! þs#r! s#r! ~#fo)‡Të! s#!Ë!åÍÇÑÑÑà *dPå!Ó!åÍÇÑÑ! ~#fo###~#foå! ~#foÑÍúÒb ! ~#foåÍÐÑ! ~#foåÍÍÑë! s#rà !Ù!åÍÇÑ*fPå! ~#foÑ"fPË *dPå!Ü!åÍÇÑÑÃp!*?På*KP###~#foå!â!åÍÇÑÑÑ*KPë! s#r! ~#fo###~#foå! ~#foÑÍúÒÿ ! ~#foå!"åÍÇÑÑ! ~#foåÍÍÑë! s#rò *r‡T! s#r! ~#foå! ~#foÑÍìÒG! ~#fo~#fo##n}·Ê:Ã8! ~#fo##ë! s#r! ~#foå! ~#foÑÍìÒ8! ~#fo~#fo##n}·Â{Ã)! ~#fo~#fo~#foå! ~#fo~#fo~#foÑÍåʦÃ)! ~#fo~#fo###~#foå! ~#foÑÍÚì! ~#fo~#fo###~#foå! ~#foÑÍÒïÃ)! ~#fo~#fo~APå*MP###~#foå!"åÍÇÑÑÑ*MPë! s#r! ~#fo###~#foå! ~#foÑÍúÒp!! ~#foå!("åÍÇÑÑ! ~#foåÍÍÑë! s#rÃ#!`i~#fo"KP! ~#fo"MP!Ê!ë!9ùëÁÉFound match at %d:%d Fudge=%d skipa=%d skipb=%d %d%d%da %u c %u . d %u -------- Line %4d of '%s' ----#fo|µÊ!! ~#fo~#fo~#fo|µÂ$Ã)! ~#fo~#fo~#fo~#foå! ~#fo~#fo~#fo~#foÑÍåÊ_Ã)! ~#fo~#foå! ~#fo~#foå;ÑÑ|µÊŽÃ)! ~#fo~#fo~#foå! ~#fo~#fo~#foå;ÑÑ|µÊÍÃ)! ~#fo~#fo###~#foë! s#r! ~#fo~#fo###~#foë!  ---%s++++++++ Line %4d of '%s' ++++ +%sÍ7Å*ŸN#"Ÿ*£|æ€õ)y…oñÊO"|î g}î—o"£*¡+"¡|µÂ0"*£ÁÉÃx"Ãå(î(Ã]6Ã+)Ã`6ó-Å!úÿ9ùDM*##sÕ*#ÑsÕ*Ñs! ~#foåÍ� ~#fo)Ñå*Ñs#r! 6#6`i6#6Í�åÍ� ~#foÑÍúÒ­%Íw}·Êå"í%! ~#foåÍ�)Ñ~#fon}þ<Ê#s#r! ~#fo~#foë`is#r! ~#fo~#foë! s#r! ^#Vr+sÃL! ^#Vr+sà ! ~#foýÍÒ^!Ê!*`P}·Ê±! ~#foå! ~#foå!“!å!åÍÁÑÑÑÑ!å`i~#foåÍÄÑÑ!å! ~#foåÍÄÑÑ*aP}·ÊŽ ! ~#foå*KP###~#foÑÍúë! s#r! ~#foå*MPë! s#rë###~#foÑÍúë! sþ|ʾ#þ+Ê7$þ>ÊK$Ö%! ~#foåÍ�)Ñ~#fo#n}·Â0#Ãf$* å! ~#foåÍ�)Ñ~#fo#åÍf"ÑÑ#|µÂ€#! ~#foåÍ�)Ñ~#fo#å!¶%å!åÍi"ÑÑÑÍl"*6!Å%å! ~#foåÍ�)Ñ~#foåÍo"ÑÑ|µÂ»#*ån&|²g}³oëásÃå$*##4! ~#foåÍ�)Ñ~#fo#å*###Ñs#r! ~#foåÍ�)Ñ~#fo#n}·Ê4$!#r*`P}·Ê0! ~#foå! ~#foå*fPå!©!å!åÍÁÑÑÑÑÑ! ~#fo|µÊÃ*fPå*KP###~#foÑå!Å!åÍÇÑÑ! ~#fo+|µÊ¯!,åÍÊÑ! ~#foýÍå‰!$åÍÊÑï*fPå*KP###~#foÑå! ~#foÑ+å!È!åÍÇÑÑ*fPå! ~#foÑÍú"fP! ~#fo|µÊ~ ! ~#fo|µÊð*KP###~#foýÍå *dPå*MP###~#fo+å ~#foåÍ�)Ñå!Ñ%ëás#r! ~#foåÍ�)Ñå*Ñs#rÃK$*#ån&|²g}³oëás! ~#foåÍ�)Ñ~#fo#n}·Âv$!Þ%å!åÍi"ÑÑÍl"! ~#foåÍ�)Ñ~#fo#åÍr"Ñ*å! ~#foåÍ�)Ñ~#fo#åÍu"ÑÑ#|µÂà$! ~#foåÍ�)Ñ~#fo#å!ý%å!åÍi"ÑÑÑÍl"*#4Íw}·Âm%Í�ë! s#rÍ�åÍ  � ~#foÑÍúÒG%! ~#foåÍ�)Ñå! ~#foåÍ�#)Ñ~#foëás#r! ^#Vr+sÃú$Í� ^#Vr+s`i^#Vr+s*^#Vr+sÓ%Í� åÍ�ëás#r! ~#foåÍ� ~#fo)ѯw#wá%! ^#Vr+s`i^#Vr+sÃÅ"ë!9ùëÁÉCan't open %s <ê«8í°ÁÉ~# x±Â«8ÁÉ ë ë><êÇ8í¸ÁÉ~+ x±ÂÇ8ÁÉ|ºÀ}»ÉÃß8Ã):Í7:ŸÍ,ÚÅå*ŸåÍÜ8Ñë:£*¡·Ê9  }|æ2qã å¾Ê29ãëÕÍÑáþÿÂ(9ÑÁÃ:qwÕÍÑþÿÊ#9! Ñ{æwëÁÉÍ7Å*Ÿë!Äÿ9åååÍ&á 6C#6O#6MÑÍþÿÂs9áÁÃ*¡|µÂ‰9¡Õ!\Í&áÛ9ë!\Í&*£|µÂ›9!£ë!lÍ&�¯!¡å~#fo´ÊÓ9> +ÍÊ9#~·Â¸9á##ì9þaØþ{ÐÖ Éá!€pÿ9!Ö*w#Âà9Á:þ**Ê÷9*ù!åÃÖåÕÅÍÑÕÍÁÑ·Êø€ÍÃ!€ëÃÙÍ Í,ÚÅ FN¯xg>G�oy òM:$ÁÉ\Í&áÛ9ë!\Í&*£|µÂ›9!£ë!lÍ&�¯!¡å~#fo´ÊÓ9> +ÍÊ9#~·Â¸9á##ì9þaØþ{ÐÖ Éá!€pÿ9!Ö*w#Âà9Á:þ**Ê÷9*ù!åÃÖåååå*ùÍKÍžÃ+@žk)_QÃ'Ã+ÃFÃŽÃrÃÃû Í– þ8Ê{ æÄ‚w#w#wÑÁÉÍÆÃÞá^#V#å*~#foÉá^#å*~#foÉá^#V#å*nÉá^#å*nÉá^#V#åë ~#foÉá^#åë& ~#foÉ!È+É!È#É!Ø+É!Ø#É!ð+É!ø+ÉÈÉÈÉØÉØÉðÉøÉ}»À|ºÉëz¼À{½Éë|ºÀ}»Éë|ªòìzå·ð7Éë|ªòó|·ð7ÉzõÍZëÍZëÍ)ñ·ð|/g}/o#É|µÈÕå͉ÑÍk|/g}/o#Ñɯ2qÍZëÍZÍk:qÐ|/g}/o#É|·ð/g}/o#:q<2qÉÅÍqÁÉDM!x±ÈxGyOÒƒë)ëÃv|µÈÅÍ”`iÁÉ|·ú )ÖëxõÍÝÚ·Õz/W{/_ѯzW{_ñ=ÈõyOxGæ¯2qÍZëÍZë͉ÃM|ºØÀ}»Éëȯ|g}oÃæëÈ)Ãô|/g}/o  #Éz/W{/_É!9~#foÉ!à !à ! à ! à !à !à Ÿ!9Å~#ÂAÁÉá"s!`å*"³!è"µ!ÜY"—>Û2­>Ó2°>É2¯2²!Ì"�!"“!@"‘!"• ÍæÊžÍ!€ßF#x·Â±Ã~#±¯!ßb¯2r~#þ ÊÈ·Êþ"ÂÞ2rÃß+}|~#·ÊÅG:r·xÁÊþ"Âæ¯2r ^#Vr+së~#foë`is#rën}þ-Âl`i^#Vr+sën}·ÊiÍ�n&åͧÑ>u½ÂF>¼ÊU>v½ÂR>¼Ê\Ãc!PM4Ãf!OM4ÃfÃvÃÃïÍ�+|µÊÌ!‚ å!åͪÑÑ!– å!åͪÑÑ!Å å!åͪÑÑ!á å!åͪÑÑ!û å!åͪÑÑ! å!åͪÑÑ!åÍ­Ñ!)Hå! ~#fo~#fo"1LåͰÑÑ#|µÂ *1Lå! å!åͪÑÑÑ!€+w#þ Âæ+6#ÃÈÕ!×6#¯2w2x*sé!ÿÿÉ>õÍrÚ<o&åÍFáñ=þÂ-ÃÍ`Í ÍrÚ'~æÊhåÍÅÍëÍÁá6þÿ!À+ÉÍ`WÖØþ?ØÕ_!×~æ7ÑzÈ?ÉÍ`ÅÍ åþ:>ªÍÖ@w#ÍGþ.¶ÍƯww#Ã?Åþ*>?ÊéÍñÚçw#ÂÇÁÍñØÃÞ> w#ÂéÁÉÍþ.7Èþ:7Èþ7ÈåÍ­Ñà )Hë"/L*PM}·Ê *´"SMͶ!"3L!"L}þaÂS >i2>L*5L#"5L*3Lå*5LÑÍÒ{ *5Lå*3Lå!, å!åͪÑÑÑÑÃ; *3Lå*5LÑÍúÒ— *RM}·Â— ͼÃ{ *9L}·ÊÞ *:Lå*L}þiÊ *7L+"7L#å*3LÑÍúÚ *RM}·Âþ!ÉþaØþ{ÐÖ Éþ Ê þ Ê ÉÅÍ`·OÂE×!·æyÂ6ÁÉÕ$Ñ Â-7ÁÉÍrÚBÖo&))T])))ë!·yÁÉÕÅõå€ÍáñÁÑÉ:=æÂb#:=æÂù#:$=æÊ2#Ív+:à<·Âò"Íê(ÂÃ">6Í‹5:&=Í‹5Ã#*&=|µÂÔ"M1Í¿5Ã#>6Í‹5:&=Í‹5>#Í‹5>6Í‹5:'=Í‹5Ã#*&="ü<Íê(Â#>Í‹5:&=Í‹5>sÍ‹ Í¿Ãç *>L}þcÊ *>L}þi ÍÂÃP *>L}þdÊP !?Lå!Ÿ å!åͪÑÑÑ!² å!åͪÑÑ!åÍ­ÑÃ6 *RM}·Âa ͼÃS !á å!åͪÑÑÍÅ!åÍ­Ñë!9ùëÁÉssed.c 2.0 11-4-81 Usage: ssed [-v] infile [outfile] Editing commands on stdin Edited output on stdout -u U5>@2=Ã#R1Í¿5Ã#ÍÑ(Â,#:==2=áñÍ)ÉÍê(Â@#>sÍ‹5Ã#͘(ÂY#X1:à<·ÊS#]1Í¿5Ã#ˆ2Í¿5Ã#*="ü<*&="þ<:$=æÊÃ#:à<·Â¤#Íê(—#>>Í‹5:&=Í‹5c1Í¿5Ã#f1Í¿5¯2=Ã#Íê(—#>Í‹5:&=Í‹5>{Í‹5c1Í¿5Ã#Íê(ÂÜ#:$=æÀµ#>}Í‹5c1Ú#:$=æÀÄ;-͘(Âó#>&Í‹5¯Í‹5f2Ú#:$=æÊ$Ív+è":=æÂnsqueeze infile -v Verbose Can't open %sAt line %d: Can't back up to %d CRC error on Antecedent File %u should be %u '%s' is not the correct Antecedent Illegal command %sDifference file garbled or not made by dif -e Ssed finished Ãö ÃñÅ*/LåÍó ÑÁ$Í,Ív+Ã2#:$=æÀ>åÊ$$>ÕÍ‹5Ív+>ÑÍ‹5>@2$=Ã2#å*="ü<áä1Í¿5:=æþö2=É"ü<|·Âs$}·Âd$[2Í¿5Éõñõ·Êz$Âg$ñ[3Í¿5Éñ>�GÈ>)Í‹5Ã$#Íž*ÍD)ñõÍ�,ͶÍÏ,Ív+Í+4þÊʱ$̓)ñÃÈÃ)Ãð Ã<ÃtÃy%ëÃ É Ãé Ã+ÃøÃCÃÔÅ!þÿ9ùDMÍ�å! åÍ¡ÑÑ*¥"SM{2PM{2OM! ^#Vr+sz³Êl!ÉÁÉà ÃéÅ!þÿ9ùDM*YQÍÒ- *YQ+"YQ*[QÀ À Í ë`is#r!�ÍåÊ^ Í�"[Q*[Q#|µÂU !0u"YQ*[QÀ À Í "YQ|µÂr !�À À *YQ++"YQ*[QÀ ë!9ùëÁÉÞ ÙâÃßÃtÃy%ÃñÅ!éÿ9ùDMÍŒ Í� */LåÍ’ ÑvÿÍåÊ× *1Lå!· å!åÍ• ÑÑÑ!å͘ Ñ*/LåÍ’ Ñ! ë! s#rÍ�å*/LåÍ› Ñëás! ^  #Vr+sën}·Âë */LåÍ’ Ñë! s#rÍ�|·ú4 Í�ÍùÚN *1Lå!È å!åÍ• ÑÑÑ!å͘ Ñ!ÿþ"UM!ÿþ"WM`i¯w#wÍ�åÍ�ÑÍúÒ® Í�))UMå*/LåÍ’ Ñëás#rÍ�))UM##å*/LåÍ’ Ñëás#r`i^#Vr+sÃ` ë!9ùëÁÉ%s Not Squeezed %s has invalid decode tree size Ãþ Ãtë÷ÃkÃ<Ã:Å>>ºÊÃHÃ_!Ãb! ^#Vr+sÕÍ�ëás! ^#Vr+së6Í�åÍ�ÑÍúÃb! ^#Vr+sÕÍ�ëásÃ_ÿë!9ùëÁÉÃqÃ,Å!þÿ9ùDM`i¯w#w*MMn}þ.–*MM#"MM*3LÃé*MMn}þ$­*MM#"MM!}Ãé*MMn&åÍnÑ|µÊâÍ� Í?å*MM#"MM+n&ÐÿÑë`is#ríÍ�Ãéë!9ùëÁÉÍ7Å*ŸN#"Ÿ*£29L*OM}·Ê$!":L*3Lå!íå!åÍì ÑÑÑ*QM}·Â>*ó å!?LåÍï ÑÑ|µÂX*OM}·ÊS!ñå!åÍì ÑÑ!ÁÉ?Lë"MMÍõ "7L"5L*MMn}þ,Â*MM#"MMÍõ "7L*MM#"MM+n&åÍø Ñ}2>L*MM#"MM+n}þ ²>29L*MMåÍû Ñ":L*OM}·Êæ*:Lå*3Lå*>L&å*7Lå*5Lå!?Lå!ÿå!åÍì ë!9ùë!ÁÉÁÉ%d:EOF on stdin %|æ€õ)y…oñÊ|î g}î—o"£*¡+"¡|µÂö*£ÁÉÃ>ëÃtÃy%Ã[Ã|%ÃêÅ!úÿ9ùDM*##sÕ*#ÑsÕ*Ñs! ~#foåÍ� ~#fo)Ñå*Ñs#r! 6#6`i6#6Í�åÍ� ~#foÑÍúÒsÍw}·Ê«Ãs! ~#foåÍ�)Ñ~#fon}þ<ÊØþ|Ê„þ+Êýþ>ÊÃ\! ~#foåÍ�)Ñ~#fo#n}·ÂöÃ,* å! sop1=%d op2=%d cmd=0%o linno=%d cmdcrc=%u Ã=ÃòëÃtÃúÃy%Å!þÿ9ùDM*SMå!ÆLåÍ1ÑÑë`is#rz³Âz>2RM*OM}·Êw!Ûå!åÍ4ÑÑÃÒ!ÆLåÍ7Ñ#|µÂ�!ìå!åÍ4ÑÑ!€åÍ:Ñ*3L#"3L`i^#Vr+s!ÍÒÒ*2RMÁÉÁÉEOF on old file ÃUë÷ÃtÃúÃy%Å*Jå!ÆLåÍFÑÑ|µÂ|!Äå!åÍLÑÑ>2QMÁÉ*ÆL}þ.•*ÇL& ÍÚ•ÁÉ!ÆLåÍOÑ#|µÂ¸!Ýå!åÍLÑÑ!€åÍRÑ*3L#"3LÃVÁÉUnexpected EOF on stdin Write ErrorÃïÃñÅ!"]Q*UQ#"UQ#ån&|²g}³oëás! ~#foåÍ�)Ñ~#fo#n}·Â<!¤å!åÍ/ÑÑÍ2! ~#foåÍ�)Ñ~#fo#åÍ8Ñ*å! ~#foåÍ�)Ñ~#fo#åÍ;ÑÑ#|µÂ¦! ~#foåÍ�)Ñ~#fo#å!Ãå!åÍ/ÑÑÑÍ2*#4Íw}·Â3Í�ë! s#rÍ�åÍ� ~#foÑÍúÒ ! ~#foåÍ�)Ñå! ~#foåÍ�#)Ñ~#foëás#r!ÍÒE*/LåÍìÑ"WQ#|µÂ!ÿÿÁÉ!"UQ*]Q))UMå*WQ|¢g}£o)Ñ~#fo"]QÃn*]Q))UMå*WQÍå"WQ|¢g}£o)Ñ~#fo"]Q*]Q|·òö*]Q#Íú"]Q*]QÍåÂ’!ÿÿÕ*]QÁÉÁÉÅ!"YQÁÉÅ!c"UQÁÉÅ!üÿ9ùDMÍ�ë! s#rÍ� å!Ñå!9~#foéÑë`is#r> »Âä>ºÊ >ÿ»Âð>ÿºÊ>»Âü>ºÊ> »Â ^#Vr+sÃÀÍ� ^#Vr+s`i^#Vr+s*^#Vr+sÃYÍ� åÍ�ëás#r! ~#foåÍ� ~#fo)ѯw#wÃg! ^#Vr+s`i^#Vr+sËë!9ùëÁÉCan't open %s <êÇ'í°ÁÉ~# x±ÂÇ'ÁÉ ë ë><êã'í¸ÁÉ~+ x±Âã'ÁÉ|ºÀ}»ÉÃû'ÃE)Í7:ŸÃÈ"Í�œå!� ^#Vr+sënëás{·Ê,#!œ ^#Vr+sÃ#!� n}·Ê]#!’ ^#Vr+s!ÍÒ]#!œ ^#Vr+së6 Ã6#Ãs#!œ ^#Vr+sÕ`inëásÉ#!œ ^#Vr+sÕ`inëásÃj Í�œ6ë!˜9ùëÁÉá#ÃsÅ!ÿÿ9ùDM! ^#Vr+sënë`is{·Êö#`in}þ Â×#Í�å! åÍž#ÑÑÍ�å`in&åÍž#ÑÑ#|µÂó#!ÿÿÃü#é#!Ãü#ë!Í,ÚÅå*ŸåÍø'Ñë:£*¡·Ê(}|æ2qã å¾ÊN(ãëÕÍÑáþÿÂD(ÑÁÃ:qwÕÍÑþÿÊ?(! Ñ{æwëÁÉÍ7Å*Ÿë!Äÿ9åååÍ&á 6C#6O#6MÑÍþÿÂ�(áÁÃ*¡|µÂ¥(¡Õ!\Í&á÷(ë!\Í&*£|µÂ·(!£ë!lÍ&�¯!¡å~#fo´Êï(> +Íæ(#~·ÂÔ(á##ÃÈ(þaØþ{ÐÖ Éá!€p)!Ö*w#9ùëÁÉà $Ã$Å!ÿÿ9ùDMÍ�åÍ� ÑÍìÒ[$Í�^#Vr+sÕÍ� ÍëÒH$Í�0ÃP$Í�7ëás!&æ$Í� åÍ�åÍ� Ñ͉åÍ�åÍ$ÑÑÑë`isÍ� åÍ�åÍ� ÑÍ)åÍ�åÍ$ÑÑÑ`in&#&æ$ë!9ùëÁÉõ$Ã,Å!þÿ9ùDM`i¯w#wÍ�~#fon&åͲ$Ñ}·Ê%Í� Í?åÍ�^#Vr+sënѯgÐÿë`is#rÃÂü(Á:þ**Ê)*ù!åÃÖÕÅÍÑÕÍÁÑ·Êø€ÍÃ!€ëÃÙÍ Í,ÚÅ FN¯xg>G�oy òi)$ÁÉ#ÍþÿÂ�(áÁÃ*¡|µÂ¥(¡Õ!\Í&á÷(ë!\Í&*£|µÂ·(!£ë!lÍ&�¯!¡å~#fo´Êï(> +Íæ(#~·ÂÔ(á##ÃÈ(þaØþ{ÐÖ Éá!€p)!Ö*w#Ã$Í�à %ë!9ùëÁÉÃ%ÃJ%Å!9ùDM! n&åÍ%Ñ|µÊ?%! n&àÿÃD%! n&ÁÉÁÉÅ!9ùDM! n&aÍùͯÚu%! n&zÍͯÁÉÁÉà Í Åë!\Í&Í!ÁÉÍ7Å*Ÿë!»%Í&*¡ë!Ë%Í&»%ÍÁþÿÊ!ÉÑÑÉ,Í Åë!\Í&Í!ÁÉTELÌkÃÃÍ7Ãü%Ã`(ÃtÃy%Í7*å  åååÃZÒÃVÒP ?ÏÏCOM$$$ SUBÍDIR �ÓLISTlÔTYPEpÔUSERÎÕDFU ØÕGO ÖERA EÔSAVE ÕREN ŠÕGET ‘ÖJUMPàåÕ> ÍÐ> Å_åÍáÁÉÍ>ÐþaØþ{Ðæ_Éõ>·(ñÅÞñõÍÐñþ ÊðÔÉ›ÏÅÍÁ·ÉõÍÐñãõÍRÐñãÉ~æÍÐ~#·Èøó € ï2›ÏÍjÐ:êÒ=Èò–Ð:ëзȯ2›ÏÍéÒÈÍéÒÈ:ëÐ_ѯ2»Ï›ÏÍ<É÷›Ïðì!Ò~·È6zÏ¥>_ÿ šÍEÐNo FilåÉÍÌЇ‡‡‡!ëж>2É:Ò·(EzÏÕÍ¢ÐÑ(;å:‰Ï=2šÏÍ<Ð /Ï!€Pí°!ˆÏ6#5zÏÍ©Ð(>>ÍÐ!ÏÍRÐÍgÑÈ͸ÐÃ�Ò͸ÐÍÝÐ>>ÍÐ ÏÍÃêÐ!ÏF#~ÍÐwø6!Ï"YÏÉÕ Í>ÐÄÐÑÉÍÄÑþØÍÐ*[Ï~þ!8åÍÐá#óÍJп͸ÐÃ�Ò·Èþ 8ÜÈþ=Èþ_Èþ.Èþ:Èþ;Èþ<Èþ>Éí[YÏ·Èþ À÷…oÐ$ÉÍóÒ!¦Ï ~+þ øþH(+!œÏ~þ (#Ö0þ 0Wy�8 �8‚8OãyÉÃåxÑÍóÒ!œÏ ~þ (-þH()Ö08åþ 8Öþ0Û#OzæðW{_æ²W{æð±_Îë}ÉÍ�ÐÍóÒ:œÏÖ !êÒ¶ÂxÑ9¯2Ï1wÏÅyæ_ÍÎÐÍjÐ2ÒÁyæ2ëÐ(Í–ÐzÏ>·/İÐ/2Ò:Ï· )1wÏÍÐÍ_ÐÆAÍÐÍÌз(þ 8 Ö õ>1ÍÐñÆ0ÍÐÍðÐÍQÑÍcÐÍ_Ð2ëÐÍóÒÄxÑBÒÕ:êÒ·ÂåÕÍnÓÂåÕ~#foé!€�Í¿Ñ~É>·È=!ëоÉ!›Ï¯2êÒͲÑíS[  Ï·( Þ@Gþ:(:ëÐwx2êÒp¯2¾ÏÍCÓþ. ÍCÓÍ`Ó#6ûíSYÏ:¾Ï·ÉÍ•Ñ(#þ* >?wþ?ÌfÓêÍ•ÑÈù#6 ûÉ:¾Ï<2¾ÏÉ!¿Ï œÏ¾ #øþ É#ý## å É>€õÍóÒÍ…Ð!œÏ~þ Ì=ÔͲÑ(þA(þS €íSYÏþS(ñ¯õñWÕx2âÓÍ­ÐÌÒÐ(i=æ`O> ÍàÒÑÕ¢þ LÑ{þ —_Õõ ÍÐÍJÐ | xdocumentation® � Instructionó  foò installatioî oî aî Osbornå ±  arå � included. OZCPÒ  requireó  Osbornå ± leveì 1.3®  Iô haó  noô � beeî testeä oî versioî 1.2® Iô definitelù wilì noô � worë oî Reö A. DIFFERENCEÓ BETWEEÎ OZCPÒ ANÄ ZCPÒ (1.0). ÍàÒæþ ñõþ > ÍàÒæþ (> ÍÐxþ 0 þ Ö>.ÍÐÏñÍgÑ Í´Ð•ÑÉ 6?#ûÉÍóÒþ ÍEÐAll¿ÍÐþYÂ�ÒÍÐÍoЯGÍÂÓ›ÏÃÃÐ>ÿ¯2#ÐÍóÒÂxÑͲÑ2úÔ(ë"YÏÍ…ÐÍ›ÐÊíÔÍÐ>2¼Ï!½Ï6ÿ!½Ï~þ€8 åÍ9Ðá =¯w4!€Í¿Ñ~æþÈþ (þ ( þ ( Í!ÐÍ!Ð > Í!Ðxæ õÍgÑ(¹þÈ´=ÈËÖå!¼Ï5 6>þP(Í - Thå  directorù displaù haó beeî  modifieä  tï �       fiô oî thå 5² characteò display. - Á   disë  reseô  ió  performeä  automaticallù �       beforå  deletinç  files¬   savinç  files¬  oò �       executinç á program. - OZCPÒ wilì ruÐþÊBÒáÉÍÄÑo&åÍ[ÕͤÐá(:¯2»ÏͲÑþS()íSYÏ|µ(+å!€åÍfЛÏÍ>ÐÑá ä›ÏÍ©Ð< ÍñÖÃcÐÍóÒÂxÑÍoÐͭЛÏÈÕÍEÐDelete File¿ÍÐÑþYÂBÒÕÍÃÐÑÉÍ[Õ:êÒõ!›Ï«Ïí°Í²Ñþ= (ë#"YÏÍóÒ ñG!êÒ~·(¸p p¯2›Ï›ÏͤÐÀÍÒÐËÖÍrÑ_ÍÎÐÃEÒÍrÑ2¹ÖõÍÒ8:œÏþ :êÒ·ÊEÒ=2ëÐÍêÐÍ–ÐÃEÒî properlù oî aî Osbornå 1. INSTALLATION. Thå installatioî instructionó assumå thaô thå  useò � ió familiaò witè uså oæ DDT. 1.  Usinç DDT¬  checë thå bytå aô locatioî 018bè oæ �     setup.com®  Iô  shoulä bå 0c0h®  Changå iô tï �     0c9h®   :¤Ïþ ÂxÑ!wϤÏí°!Í›ÖÀ!"yÖÍ�ÐÍóÒ!êÒå~2›Ï!«ÏÍöÒá~2«Ï¯2»Ï\!›Ï!í°!Ï~·(þ (#õ�~·(#öx2€ÍÐÍcÐÍÝÐÍjÐÍ~ÐÍÍcÐÍêÐÍ–ÐÃ�ÒáÍÇÐÍ�ÐÃxÑÍÒåÍóÒá óͤÖõÍÇÐñÉ"ÔÖÍÌÐ2ÈÐ2»ÖÍ…Ð͛Р>þ( 2»Ö_ÍÎÐé!êÒ¯¶Â‡Ö6Ý!>μ8åëÍfЛÏÍ<Ðá €ç=ÈÍEÐFulì>·ÉcÐÍê Thió   changå  wilì  noô  affecô   thå �     operatioî oæ setuð undeò thå standarä ccp®  Iæ �     thió changå ió noô made¬  yoõ wilì noô bå  ablå �     tï uså setuð undeò OZCPR. 2.  Copù OZCPR.COM¬  DDT.COM¬  anä SYSGEN.COÍ tï  á �     blanë diskette®.hå OZCPÒ -- ZCPÒ (1.0© foò Osbornå 1. Page # .po 0 .op 11 Apr 82 Michael M Rubenstein ABSTRACT. Thió  documenô  describeó thå  differenceó  betweeî � OZCPÒ  anä  ZCPR®  Iô  ió  meanô  tï  bå  useä  iî � conjunctioî    witè   thå    ZCPÒ     Thió diskettå shoulä havå beeî �     SYSGENeä   witè  thå  standarä  CP/Í  operatinç �     systeí anä configureä witè setuð aó desireä foò �     thå majoritù oæ youò diskettes. 3® Witè thió diskettå iî drivå A¬ type ddô ozcpr.com Th  eî movå OZCPÒ tï higè memorù with m100,8ff,8000 .cp 4 Š Loaä sysgeî with isysgen.com r Clear the default dcb name with f5d,67,20 Starô sysgeî with g100,27f Sysgeî wilì asë foò   initiaì system. ENÄ OÆ DOCUMENT aô iô  wilì  bå �     necessarù tï uså setuð tï reconfigurå anù diskó �     whicè  dï  noô  uså thå  configuratioî  oî  yoõ �   thå sourcå drive®  Responä �     A®  Sysgeî wilì theî reaä thå operatinç systeí �     anä breaë tï ddt. Movå OZCPÒ tï 4000è with m8000,87ff,4000 Typå ç anä sysgeî wilì asë foò thå  destinatioî �     drive®  Responä  A®  Sysgeî åwilì copù thå ne÷ �     systeí  tï  A®  Wheî sysgeî askó  foò  anotheò �     destination¬ jusô responä returî tï exit. 4. Presó  reseô anä returî tï restarô  thå  systeí �     witè thå ne÷ ccp. 5.  Mounô  á  disë oî drivå  anä tesô thå  variouó � å    featureó oæ OZCPR®  Paù especiaì attentioî  tï �     thå directorù command® Iæ therå ió anù probleí �     becauså  oæ  á  changå iî thå  Osborne¬  iô  ió �     likelù thaô thå mosô visiblå effecô wilì bå  iî �     thå diò command® Iæ therå ió anù pråobleí here¬ �     DÏ NOÔ CONTINUE. 6. Uså SYSGEÎ tï movå thå operatinç systeí tï youò �     otheò  diskettes®  Remembeò  thaô iô  wilì  bå �     necessarù tï uså setuð tï reconfigurå anù diskó �     whicè  dï  noô  uså thå  configuratioî  oî  yoõ �   å  .MB0 OZCPR OZCPÒ requireó Osbornå ± leveì 1.3® Iô haó noô beeî testeä oî versioî 1.² anä iô definitelù wilì noô worë oî REÖ A. Thió ió á modificatioî oæ thå CP/Í Built-iî commandó aó theù � werå  originallù  sheò pagå tï read®  Witè á "P¢ optioî thå  commanä  fun� ctionó aó iô doeó today¬ scrollinç thrõ thå entirå file. 4© SAVE-Allowó yoõ tï specifù thå numbeò oæ "pages¢ yoõ wanô � saveä iî HEØ oò iî sectors® Alsï iæ thå filå thaô yoõ arå tryinç � tïeô uð foò us®  Iô expandó  thå  usabilitù  oæ � commandó DIR¬  ERA¬  TYPE¬  SAVE¬ REN¬ anä USEÒ anä addó commandó � LIST¬  DFU¬  JUMP¬  GO¬ anä GET® Thå modificationó arå extremelù � easù  tï  instalì anä É havå trieä thå ne÷ anä changeä  functionó � anä SAVÅ alreadù exists¬ á messagå "Deletå file?¢ ió returned® 5©  REN-Iæ  thå  ne÷ filå namå alreadù  exists¬  á  messagå � "Deletå File?¢ ió returned. 6© USER-Useò numbeò maù bå specifieä iî HEX®  Alsï USEÒ ió � ½ USEÒ 0. Thå ne÷  seå somå improvementó thaô coulä helð alì oæ us®  Afteò  thå � modificationó arå installed¬  alì oæ thå thingó thaô yoõ coulä dï � iî  thå  pasô caî stilì bå done¬  thió jusô addó tï  youò  systeí � commanä  power®  Alsï thå familiaò A¾ prompô thaô wå acommands“ are: 1©  LIST-Typeó á filå oî thå lisô devicå  (printer©  withouô � paging. 2©  DFU-Allowó  á temporarù changå iî defaulô  useò  numbeò � froí thå customarù 0. 3©  JUMP-Allowó  thå  useò tï "call¢ thå prograí  oò  "sub-�rå  accus-� omeä to¬  changeó no÷ wheî yoõ arå usinç á useò numbeò otheò thaô � 0®  Foò instance¬  iæ yoõ enteò thå commanä USEÒ 10¬  thå prompô � wilì no÷ reaä A10>. Brieflù summarizeä arå changeä commands: 1© DIR-Listó iî threå columnó i routine¢  thaô  ió currentlù loadeä iî memorù  aô  thå  specifieä � address® 4©  GO-Samå aó jumð excepô nï addresó ió specifieä anä  thå � instructioî  performó  á  jumð tï 100h®  Haó thå effecô  oæ  re-� executinç whateveò yoõ diä lasô withounsteaä oæ two. 2©  ERA-Listó  thå fileó thaô havå beeî  deleteä  wheî  iô � finisheó iô action® 3©  TYPE-Withouô  specifyinç  aî optioî thå filå  typinç  ió � stoppeä aó sooî aó youò screeî ió filled® Yoõ theî hiô á keù anä � geô  anotô anù interveninç commands. 5© GET-Allowó thå useò tï loaä á filå intï memorù  startinç � aô á specifieä address® Additionaì Modification“ Iæ loggeä iî tï drivå B:¬ thå OZCPÒ wilì searcè drivå Aº foò � á  commanä prograí thaô y  oõ arå tryinç tï ruî iæ iô can'ô finä iô � oî  B:®  Iô  won'ô gï froí Á tï  wheî yoõ arå loggeä  iî  oî  Á � however. Iæ  loggeä iî oî anotheò Useò number¬  thå OZCPÒ wilì searcè � thå  defaulô Useò numbeò (usuallù 0© foò á commanä prograí iæ  iô �å can'ô finä iô iî youò useò number® Iæ loggeä iî oî Bº  anä á useò numbeò otheò thaî thå defaulô � number¬ iô wilì searcè iî thå followinç sequence: 1© Thå  Drivå anä youò useò number 2© Thå  Drivå anä defaulô useò number 3© Thå Replacement for the CP/M CCP ZCPR is a Group Project By the CCP-GROUP: RLC - Richard Conn FJW - Frank Wancho KBP - Keith Peterson RGF - Ron Fowler ZCPR Documentation By RL Á Drivå anä defaulô useò number è iî thå followinç sequence: 1© Thå  Drivå anä youò useò number 2© Thå  Drivå anä defaulô useò number 3© ThåC Table of Contents ----- -- -------- Introduction 2 Part A: Installation Instructions 4 ZCPR Integration Example å 5 Setting the ZCPR Inline Options 8 REL, BASE, CPRLOC, RAS, SUBA, CLEVEL3 8 Customization Symbols 8 NLINES, WIDE, PGDFLT å 8 PGDFLG, MAXUSR, SYSFLG, SOFLG, SUPRES, DEFUSR, SPRMPT, CPRMPT, NUMBASE, 9 SECTFLG, FENCE 10 Patching SUBMIT.COM 10 Part   B: Usage Instructions and Explanation of Commands 11 The ZCPR Command Hierarchy Search 11 The ZCPR-Resident Commands 14 DIR, ERA is available which sends its output to the CP/M LST: Device and does NOT page . The DIR command has been extended to allow the dis- play of the system files or all files . The ERA command now prints out the names of the  14 LIST, TYPE, SAVE 15 REN, USER, DFU 16 JUMP, GO, GET 17 ZCPR Error Messages files it is erasing . The current user number may be included as part of the command prompt; if the user is under a number other than 0, the prompt is of the form 'du>' (like 'A2>' or 'B10>'), and, if the user is under  18 Part C: ZCPR Command Levels and How to Use Them 19 Page 1 ZCPR - A Z80 Replacement for the CP/M CCP Documentation on ZCPR - A Z80 Replacement for the CP/M CCP 0, the prompt may be 'd>' or 'd0>' as per his choice . The SUBMIT facility has been changed in two basic ways: - the prompt changes to 'du$' or 'd$' when the SUBMIT command is printed -  ZCPR is a replacement for the CP/M Console Command Processor (CCP) which is designed to run as part of CP/M on Z80-based microcomputers. In most cases it is upward-compatible with the original CP/M Version 2.2 CCP. ZCPRthe $$$.SUB is executed from drive A: (note that the original SUBMIT problem now exists, but the new SUB.COM facility corrects it); the CCP-GROUP definition of an Indirect Command File now applies, and this definition is that a, however, provides many extensions to the CP/M CCP. Included in these extensions are the following features: . The TYPE function can be made to page or not page its output at the user's discretion . A LIST function ny sequence of commands which may be issued from the console is also a valid sequence of commands for execution from an Indirect Command File; hence, the sequence: DIR B:    DIR A: may be issued from either the console or an Indirect Command File, and the results of the execution of this sequence are the same. Basically, this says that Indirect Command Files are upward-compe COM file is loaded and executed if found or an error message (COMMAND?, when COMMAND was the user's command name) is printed . The numeric argument for the SAVE command can be specified in hexadecimal so that the user may atible to the console input (but not necessarily that the contents of an Indirect Command File may be issued at the console without modification). Page 2 ZCPR - A Z80 Replacement femploy the values presented by tools such as DDT exactly as they are given . A GET command which loads a file at a specified memory address and a JUMP command which "calls" the subroutine at a specified memory address have or the CP/M CCP . A command-search hierarchy is now implemented which is executed roughly as follows: - the user's command is checked against the CPR- resident commands and executed immediately if a match is found been added; a GO command which "calls" the subroutine at 100H (subset of the JUMP capabidity) has also been added This document provides the user of ZCPR with the following information: Part A: Installation Instruct - failing that, the current user number on the current disk is scanned for the COM file; the COM file is loaded and executed if found - failing that, a default user number (initially 0 but can be reset ions Part B: Usage Instructions and Explanation of Commands Part C: ZCPR Command Levels and How to Use Them Page 3 ZCPR - A Z80 Replacement for the CP/M CCP with the DFU CPR-resident command) on the cur- rent disk is scanned for the COM file; the COM file is loaded and executed if found - finally, failing that, the default user number on disk A: is scanned for the COM file; th Part A Installation Instructions In order to install ZCPR on a target microcomputer (must be currently running CP/M 2.2), the user must know two basic things: 1) Where his CCP is cur  rently running in memory 2) Where his CCP is located in the SYSGEN image, or, for systems which don't support SYSGEN (such as P&T CP/M 2.2 for the TRS-80 Model II), where his CCP is located on disk and how to place the new ZCPR done by obtaining a SYSGEN image of your system, scanning it via a debugger such as DDT to find the offset for the CCP, reading the new CPR in on top of the old one, and finally running SYSGEN again to place the resultant system on  on top of it The first question is answered relatively easily. A pro- gram, known as either BDOSLOC or BDLOC (for BDOS Locator), is provided with ZCPR. You should assemble this program for your particular computer (change t disk. If you DO NOT have SYSGEN capability, a Disk Utility program is required to locate the CCP on disk and then write the new ZCPR on top of the old one. The net result of this integration is the placement of the new Zhe base ORG if you are running non- ORG-0 CP/M) and execute it. Upon execution, it will provide you with the base address of (1) the BDOS and (2) the CCP for your particular system. BDOSLOC has worked correctly for all systems tested CPR onto disk in the proper place so that it will be loaded with the rest of CP/M on cold boot and executed properly. To find the original CCP, you typically have to locate it by its appearance. It is probably stored contiguously so far, but there is always a chance that it may NOT work for some non-tested system. For the time being, assume that it works correctly and record the starting base page address of your CCP. The second question is not answered neaon disk, so, once it is found, a sequential overwrite is all that is required. Probability is extremely high that it is stored contiguously in the SYSGEN image. The CCP starts with two (2) and ONLY TWO jump instructions followed by arly so easily. If you have the ability to SYSGEN your system, it is much easier (commonly) than if you do not. You must, after assembling the ZCPR properly, integrate it into the sysgen (or disk) image of CP/M. This can be buffer area (possibly containing an initial command and/or the Digital Research copyright notice). The Digital Research manuals show the CCP to reside at address 980H in the SYSGEN image, but this may vary with system. To fin  d this image, use DDT or some other such debugger, load the SYSGEN image you can get via SYSGEN, and examine memory starting at around 900H for the two (and ONLY two) jumps described above. If you find an area with more than two jumps (ant). This assembler is required because of the MACROs used. Only the resultant HEX file is required. 3. Assuming that you can use SYSGEN, obtain a SYSGEN image of your current CP/M system and save it on disk.  group of them), you are probably looking at the BIOS and should go lower for the CCP. The CCP will probably start on an even page or half-page address (like 900H, 980H, 1100H, etc). Page 4 4. Load the SYSGEN image into memory with DDT (or equivalent). Once loaded, verify that the original CCP is at the IMAGE address found above and compute the integration offset using the DDT H command: H, The second number displayed gives you the OFFSET value required for step 5. 5. Integrate ZCPR into your SYSGEN image via DDT's I and ROFFSET commands. Use IZCPR.HEX (or the name of your version of ZCPR) toeps using the information of the page address of the CCP (obtained from BDOSLOC and called CPRLOC within ZCPR) and the SYSGEN image address of the CCP (called IMAGE for reference in this document). 1. Edit ZCPR and set load the FCB and ROFFSET (where OFFSET was computed in step 4) to load the ZCPR.HEX file into memory at the proper location. Check to see that ZCPR is indeed properly loaded by examining the SYSGEN IMAGE area. 6. Place t the CPRLOC equate to the value obtained from above. Also set any flags and values as you desire (see the section on ZCPR Customization below). When satisfied, end the edit session. 2. Assemble ZCPR with MAC (or equivalehe new system on disk by running SYSGEN and NOT loading the system from disk (use the memory image). For further clarification of the above process, the following is a sample terminal session which outlines the steps taken.    ZCPR Integration Example B>; Sample terminal session for integrating ZCPR B>sysgen SYSGEN VER 2.2 SOURCE DRIVE NAME (OR RETURN TO SKIP)b SOURCE ON B, THEN TYPE RETURN <-- I hit the RETURN key here FUNCTION COMPLETE CCP's address The Base Page Address of this system's BDOS is C5 The Base Page Address of this system's CCP is BD <-- This is it B>ddt cpm56.com <-- Now to find the CCP in the SYSGEN image DDT VERS 2.0 NEXT PC 2D00 0100 -d900,90f  / DESTINATION DRIVE NAME (OR RETURN TO REBOOT) <-- and here B>save 44 cpm56.com <-- We now have a SYSGEN image of CP/M to work with  <-- Start looking around here 0900 31 80 E7 3E 06 3C 3C FE 1B CA 00 C2 DA 11 E7 D6 1..>.<<......... -da00,a0f 0A00 31 00 01 01 01 0C C5 CD 0F E4 21 00 BE 11 00 04 1.........!..... -db00,b0f 0B00 31 00 01 01 01 11 C5 CD 0F E4 21 00 C0 11 Page 5 ZCPR - A Z80 Replacement for the CP/M CCP B>xdir XDIR Version 2.6 User Number: 0, Double Density File Attributes: Non-System Filename.Typ Size K Filename.Typ Size K Filename.Typ Size K -------- --- ------  00 02 1.........!..... -db80,b8f 0B80 31 00 01 01 09 01 CD A8 00 21 00 D2 11 00 C2 0E 1........!...... -- Detail Left Out -- -d1100 <-- I found it at 1100H; note the 2 JMP's 1100 C3 FF BD C3 FB BD 50 10 20 20 20 20 20 20 20  -------- --- ------ -------- --- ------ !TEXTWRK.-12 0 CPR .DOC 8 EE687 .TXT 4 CPR .AQM 34 TFS .HLP 6 EE687PRE.TXT 4 CPR .ASM 50 CONTENTS.T01 6 SW1 .TXT 10 CPR .20 ......P. 1110 20 20 20 20 20 20 20 20 00 00 00 00 00 00 00 00 ........ 1120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -- Detail Left Out -- -^C <-- Return to CP/M; I know that CPRLOC BAK 4 CONTENTS.T02 4 SW2 .TXT 2 CPM56 .COM 12 CONTENTS.T03 4 B: 30 Entries & 22 Files -- 338K Bytes Remaining File Data: 14 Files -- 154K Bytes Displayed B>bdosloc <-- Now to locate the will be BD00H and the IMAGE offset is 1100H B>ed cpr.asm {edit ZCPR here and place CPRLOC=BD00H}# -- Detail Left Out -- B>mac cpr $pz sz <-- Now to assemble the CPR CP/M MACRO ASSEM 2.0 C4F0    <-- Note that CPR MUST end before BDOS begins! 014H USE FACTOR END OF ASSEMBLY Page 6 ZCPR - A Z80 Replacement for the CP/M CCP B>ddt cpm56.PRLOC (CPRLOC equ 0) for integration via MOVCPM rather than the DDT/SYSGEN technique outlined above; set to TRUE for MOVCPM integra- tion or FALSE for DDT/SYSGEN integration BASE Base addrecom <-- Now to integrate! DDT VERS 2.0 NEXT PC 2D00 0100 -h1100,bd00 <-- Compute offset for new CPR CE00 5400 <-- Offset is 5400H -icpr.hex <-- Init FCB -r5400 <-- ss of your CP/M system; standard CP/M has a base of 0, but some CP/M systems (such as for the TRS-80 Model I and Heath/Zenith H89/Z89) start physical RAM memory at a higher address; eqRead in new CPR with offset NEXT PC 2D00 0000 -^C <-- Done! B>sysgen <-- Now to SYSGEN onto disk SYSGEN VER 2.2 SOURCE DRIVE NAME (OR RETURN TO SKIP) <-- Use memory image DESTINATION DRIVE NAME (uate BASE to the starting RAM memory address of your system CPRLOC This is the starting address of ZCPR; set the second CPRLOC equate to the address you obtain from BDOSLOC RAS OR RETURN TO REBOOT)b <-- onto B: DESTINATION ON B, THEN TYPE RETURN FUNCTION COMPLETE DESTINATION DRIVE NAME (OR RETURN TO REBOOT) <-- Done for now B> Page 7 ZCPR - A Z80 ReplaThis is an equate which masks out selected ZCPR command functions for security purposes on Remote Access Systems such as Bulletin Boards; the masked out functions currently include SAVcement for the CP/M CCP Setting the ZCPR Inline Options The following are the four basic options available to the user under ZCPR for customization of his package. Option Name Function REL Configures CE, ERA, REN, JUMP, GO, and GET; set RAS to TRUE to mask these out or FALSE to leave them in SUBA This is an equate which determines the drive onto which ZCPR will look for an executing Indi  rect Command File. If the basic philosophy of the Indirect Command File described above is to be maintained, this symbol should be set to TRUE (look on drive A: for the $$$.SUB file); if  Page 8 ZCPR - A Z80 Replacement for the CP/M CCP Customization Symbols The following symbols are provided for further customization of ZCPR to a user's particular tastes an not, this symbol should be set to FALSE (look on the default drive from the $$$.SUB file). To review, the basic philosophy of the Indirect Command File is that any sequence of commands d hardware facilities. Option Name Function NLINES Number of lines on the user's CRT for paging WIDE This equate is used to select a narrow or wide display under the DIR command; if WIDE is equated  which may be issued from the console (within reason, which means NOT to erase a $$$.SUB file) may also be issued from within an Indirect Command File, and the resultant execution should  to TRUE, each file name is separated by two spaces, a FENCE, and two more spaces; if WIDE is equated to FALSE, each file name is separated by one space, a FENCE, and one more space PGDFLT  be identical (same functions performed). CLEVEL3 This equate enables or disables extended Command Level 3 Processing. If set to TRUE, extended Command Level 3 Processing is enabled and the user  This is the Paging Default flag for the TYPE command; if PGDFLT is set to TRUE, the TYPE command will page its output by default and the P option on the TYPE command (see below) w command line is automatically capitalized, the terminating zero is placed at the end of the buffer, and the internal CIBPTR is set correctly (see later for more information). ill prohibit paging; if PGDFLT is set to FALSE, the TYPE command will NOT page its output by default and the P option will enable paging PGDFLG This sets the option character in the command l  ine for the TYPE command (the 'P' mentioned above); if the user wishes to change this option character, he need only change this equate MAXUSR This is the largest user number recognized by thr on B: in user 0 sees 'B>' as the prompt, but with SUPRES set to FALSE, a user on B: in user 0 sees 'B0>' as the prompt Page 9 ZCPR - A Z80 Replacement for e USER command; if the user wishes to protect the higher user areas, he may set this symbol to the highest area normally accessable; 15 is the largest permitted value for MAXUSR SYSFLG This ithe CP/M CCP DEFUSR This is the CPR-default user number which is searched in the command hierarchy for the COM files (distributed as 0); the DFU changes this temporarily until a Warm Boot or s the option character for the DIR command line which is used to specify that DIR search All Files (both $SYS and $DIR) for its display; the distributed default for this is 'A' SOFLG This isCold Boot is done, at which time the search reverts to this value SPRMPT This is the CPR prompt character which indicates that a SUBMIT file is in execution; by default it i the option character for the DIR command line which is used to specify that DIR search ONLY the $SYS files for its display; the distri- buted default for this is 'S' SUPRES Set SUPRES to TRUs set to '$', so prompts like 'A$' appear during SUBMIT file execution CPRMPT This is the CPR prompt character which indicates that the CPR is awaiting a user console command; by default it iE to suppress printing the user number when the user is under User Number 0 or set SUPRES to FALSE to ALWAYS display the User Number with the CPR prompt; with SUPRES set to TRUE, a uses set to '>', so prompts like 'A>' appear during user input to the CPR NUMBASE This is the escape character used by those commands which require a DECIMAL number as an argument; placing this c  haracter after the number argument switches the base to HEXADECIMAL; for example, 'SAVE 15 MYFILE' can be expressed as 'SAVE FH MYFILE' if NUMBASE is set to 'H' (the default) SEC1A 1A 1A 1A 1A 1A SUB......... -^C <-- Done A>save 5 newsubmt.com <-- Save new SUBMIT.COM file Page 10 ZCPR - A Z80 Replacement for the CP/M CCP TFLG This character constant is the suffix option for the SAVE command which specifies that sectors, as opposed to pages, are to be saved; the default value is 'S' FENCE This is the char Part B Usage Instructions and Explanation of Commands The following instructions are written with the assumption that the reader is quite familiar with how to use CP/M 2.2 and its CCP. ZCPR is written as a logicalacter printed to separate entries in a directory listing; it's default value is '|' Patching SUBMIT.COM SUBMIT.COM may be patched to run with ZCPR by the following procedure (this is recommended  extension of the CP/M 2.2 CCP philosophy and should be addressed as such. The ZCPR Command Hierarchy Search The first, and most basic thing, to learn about ZCPR is the order in which is searches for a COM file for execuif the user does not have SUB.COM). This patch simply makes it always place the $$$.SUB file on Drive A:. Illustrative terminal session follows: A>ddt b:submit.com DDT VERS 2.0 NEXT PC 0600 0100 -s5bb <-- Patch ition or a file specified by the GET command. Under the CP/M 2.2 CCP, if the specified COM file command was not found on the current drive in the current user area, the CCP aborted with an error message. ZCPR, however, continuess at 5BB Hex 05BB 00 1 <-- Change 0 (default drive) to 1 (drive A:) 05BC 24 . <-- That's it! -d5b0 5cf <-- See change 05B0 00 00 00 00 00 00 30 30 31 20 24 01 24 24 24 20 ......001 $.$$$ 05C0 20 20 20 20 53 55 42 00 00 00  searching from this point a maximum of two more levels. This command hierarchy search was outlined above and is described here in further detail. 1. If the command is of the form 'COMMAND' and NOT 'd:COMMAND', the CPR  -resident command list is searched for a match. If the match is found, the CPR-resident command is immediately processed. If the match is not found or the command is of the form 'd:COMMAND', the next step is taken. Note that  the current Default User Number, ZCPR temporarily logs him into it and searches the directory. If COMMAND.COM is found, it is loaded as described above and executed. If not, ZCPR proceeds to the next step.  the 'd:COMMAND' form is good for executing a command COM file which has the same name as a CPR-resident command (such as SAVE or DIR). 2. If the command is of the form 'd:COMMAND', disk drive 'd:' is temporarily log Page 11 ZCPR - A Z80 Replacement for the CP/M CCP 5. The user is now in the Default User Number, and at this point, ZCPR checks to see if the user is on disk drive A:. If not, it temporariged in for the purpose of the command search. Otherwise, the currently logged-in drive is used. 3. Now the file named COMMAND.COM is searched for. If found, it is loaded into memory starting at 100H and executed. ly logs into A: and searches the default user number of A: for COMMAND.COM. If found, it is loaded as described above and executed. If not, ZCPR prints the command name as an error message and returns to command input mode,  If not, proceed to step 4. 4. Now that the first search for COMMAND.COM has failed, the CPR checks to see if the user is under the current Default User Number. The Default User Number may be that set by the DEFUSR eq aborting the SUBMIT file if COMMAND came from it. In all cases of the search above, if COMMAND.COM is found, after it is loaded into memory, ZCPR resets the user to his original disk drive and user number. Hence, the files refeuate in the CPR or that set by the user via the DFU command. DEFUSR is in effect if DFU has not been issued since the last Warm or Cold Boot, and DFU is in effect if it was issued since the last Warm or Cold Boot. If the user is NOT underrenced by the user by default are obtained from this environment. To illustrate this command hierarchy search, consider the following examples: Example 1: DEFUSR equ 0 {default user number is 0} B10> <-- User is on Drive   B:, User Number 10 B10>ASM TEST.BBZ <-- User wishes to assemble TEST.ASM in Drive B:, User 10 <-- At this point, ZCPR looks on B:/10 for ASM.COM, fails, looks on B:/0, fails, and finally looks on A:/0 12 ZCPR - A Z80 Replacement for the CP/M CCP Another Example: For example, if the user is logged into Drive B: in User Area 10, the Default User Number is 0, and the following COM files are present as indicated --; it finds ASM.COM here and goes back to B:/10 for the file Example 2: DEFUSR equ 0 and DFU issued B10> <-- User is on Drive B:, User Number 10 B10>DFU 5 <-- User Selects User 5 as default B10>ASM TEST.BBZ <-- As WM.COM on Drive A: in User 0 MBASIC.COM on Drive A: in User 0 and on Drive B: in User 0 TEST.COM on Drive B: in User 10 and Drive B: in User 0 then the above <-- At this point, ZCPR looks on B:/10 for ASM.COM, fails, look on B:/5, fails, and finally looks on A:/5; it fails here also and prints ASM? as an error message Example 3: DEFUSR equ 0 B> <-- Use following happens when the following commands are issued from the console (or Indirect Command File): B10>WM TEST2.TXT \ \ \__ File to be edited \ \__ Invoke the WM.COM file (Word Master editor) \__ User is on Drive B: ir is on Drive B:, User Number 0 B>ASM TEST.BBZ <-- As above <-- At this point, ZCPR looks on B:/0 for ASM.COM, fails, looks on A:/0, fails, and prints error message Example 4: DEFUSR equ 0 A10> <-- User is on Dn User Area 10 Results: ZCPR searches B: User 10, B: User 0, and A: User 0 for WM.COM; it finds WM.COM in A: User 0, loads it, logs the user back into B: User 10, and executes it. B10>MBASIC \ \__ Invoke the MBASrive A:, User Number 10 A10>ASM TEST.AAZ <-- As above, but file on A: <-- At this point, ZCPR looks on A:/10 for ASM.COM, fails, looks on A:/0, fails, and prints error message PageIC.COM file (MBASIC Interpreter) \__ User is on Drive B: in User Area 10 Results: ZCPR searches B: User 10 and B: User 0 for MBASIC.COM; it finds MBASIC.COM in B: User 0, so it doesn't bother to look on A: User 0. MBAS  IC.COM is then loaded and executed as described in the previous example. B10>TEST \ \__ Invoke the TEST.COM file (TEST program) \__ User is on Drive B: in User Area 10 Results: ZCPR searches B: User 10 for TESthe names of the files on disk Forms: DIR <-- Displays $DIR files DIR S <-- Displays $SYS files DIR A <-- Displays both $DIR and $SYS files Customization Variables: WIDE T.COM; it finds TEST.COM in B: User 0, so it doesn't bother to look further (if it had, it would have found TEST.COM in B: User 0). TEST.COM is then loaded and executed as described above. B10>TEST2 \ \__ Invoke the TEST2.COM f SYSFLG SOFLG FENCE Examples: DIR *.ASM <-- All $DIR .ASM files DIR *.COM S <-- All $SYS .COM files DIR *.COM A <-- All .COM files Notes: If a file is scanned for and no such name exiile (TEST2 program) \__ User is on Drive B: in User Area 10 Results: ZCPR searches B: User 10, B: User 0, and A: User 0 for TEST2.COM; it doesn't find it, so it issues the error message 'TEST2?', which says it couldnsts on disk, the 'No Files' message will appear. However, if a file is scanned for and the name exists as a $SYS file and $DIR files are being scanned for, no file name is displayed but the 'No Files' message does NOT appear. Fo't find TEST2.COM. Page 13 ZCPR - A Z80 Replacement for the CP/M CCP The ZCPR-Resident Commands The following pages describe the ZCPR-Resident Commands. Tr example, if TEST.COM is a $SYS file and 'DIR TEST.COM' is issued, no message appears. If 'DIR TEXT.COM' is issued and TEXT.COM does not exist on disk, the 'No Files' message is displayed. Command: ERA Function: To Erase the sphese are commands located within ZCPR itself which are executed from within ZCPR. The phrases and refer to ambiguous file name and unambigous file name as per the CP/M convention. Command: DIR Function: To Display a listing of ecified $R/W files from disk Forms: ERA <-- Erase both $DIR and $SYS files Customization Variables: WIDE FENCE Examples: ERA *.ASM <-- Erase all .ASM files ERA *.* <-- Eras!  e all files Notes: If a $R/O file is encountered, a BDOS error message will be displayed and the procedure is stopped. The user is unsure at this time as to which files have been erased and which have not and should check. Sos: When the display pauses during paging, type any char to continue or ^C to abort. ^S also works. Command: SAVE Function: To Copy the TPA starting at 100H to disk Forms: SAVE <-- in DEC SAVE H <-- in HEX SAVE S <-- Number of sectors SAVE H S <-- Number of sectors Customization Variables: NUMBASE RAS : LIST Function: To Print the specified file on the CP/M LST: device Forms: LIST <-- Print the file (no paging) Customization Variables: -None- Examples: LIST TEST.TXT <-- Print TEST.TXT on LST:  Examples: SAVE 15 MYFILE.TXT <-- 15 pages saved SAVE FH MYFILE.TXT <-- 15 pages saved SAVE 10H MYFILE.TXT S <-- 16 sectors (8 pages) saved Notes: If the file name to be saved already exists, then SAVENotes: If the file has a $SYS attribute, it will be found as well as those with $DIR attributes. Command: TYPE Function: To Print the specified file on the CP/M CON: device Forms: TYPE <-- Print the file with  will exit with the message 'Delete File?'; if the user REALLY wants to save under this name, he may then type Y or y and the current file will be deleted and then recreated containing the specified part of the TPA. the paging deflt TYPE P <-- Print the file with the paging deflt negated Customization Variables: NLINES PGDFLT PGDFLG Examples: TYPE TEST.TXT TYPE TEST.TXT P Note Page 15 ZCPR - A Z80 Replacement for the CP/M CCP Command: REN Function: To Change the name of a disk file Forms: REN = Customization Variables: RAS Examples: "   REN NEWFILE.TXT=OLDFILE.TXT Notes: If already exists, the message 'Delete File?' will be printed and the user may respond with Y or y to delete the current and then rename to . Command: ress> in HEX Customization Variables: NUMBASE RAS Examples: JUMP E000 or JUMP E000H <-- Jump to E000H JUMP <-- Jump to 000H JUMP 0 <-- Jump to 000H Notes: JUMP perforUSER Function: To Change the current user number Forms: USER <-- in DEC USER H <-- in HEX Customization Variables: -None- Examples: USER 15 ms a subroutine "call", so the called routine may return to the ZCPR by either a RET or a Warm Boot. Command: GO Function: To "call" the subroutine starting at 100H Forms: GO <-- Execute reentrant at 100H Cust USER FH USER 0 USER <-- Same as USER 0 Notes: -None- Command: DFU Function: To Temporarily Change the default user number for the command hierarchy search Forms: DFU <-- omization Variables: RAS Examples: GO *.ASM <-- Assuming XDIR is loaded, gives directory of *.ASM Notes: This command is identical in function to JUMP 100H; JUMP, ho in DEC DFU H <-- in HEX Customization Variables: -None- Examples: DFU 15 DFU FH DFU 0 DFU <-- Same as DFU 0 Notes: See above for explanatiwever, leaves the address as the first entry in CP/M BASE + 80H (the input line buffer), while GO has no such address. Command: GET Function: To load a file from disk into memory starting at the specified page Forms: GETon. Page 16 ZCPR - A Z80 Replacement for the CP/M CCP Command: JUMP Function: To "call" the subroutine at the specified page address Forms: JUMP
<-- <--
in HEX Customization Variables: NUMBASE RAS Examples: GET 8000 TEST.80 <-- Load TEST.80 starting at 8000H GET 100 TEST.80 or GET 100H TEST.80 <-- Load TEST.80 #   starting at 100H GET 0 TEST.80 <-- Load TEST.80 starting at 000H Notes: GET searches for the specified file according to the same command hierarchy search employed by the ZCPR command scanner. space on disk From GET or command load by CPR, means that there is not enough space in memory Delete File? From REN or SAVE, means that the file specified already exists on disk and Hence, if the user is on B:/10 and the file is on A:/0 with the current default user number at 0, GET will search from B:/10 to B:/0 to A:/0 in looking for the file. Page 17 ZC the user may type Y or y to delete it and proceed with the REN or SAVE function Page 18 ZCPR - A Z80 Replacement for the CP/M CCP Part C PR - A Z80 Replacement for the CP/M CCP ZCPR Error Messages The following are the error messages issued by ZCPR and their meanings. Message Meaning ? Printed after a command or an argument means th ZCPR Command Levels and How to Use Them ZCPR Version 1.0 and beyond supports three distinct command levels in its implementation. Each level constitutes a different way to issue a command for ZCPR to process. Command Leveat such was invalid No File From DIR, this means that DIR did not locate any files Also from ERA with the same meaning All? Issued in response ERA *.*, asks the user is he really wants to erase all thls 1 and 2 are common to all implementations of CP/M and CP/ZM from CP/M Version 1.4. Command Level 1 is that command level in which the command is issued by the user from his console terminal. The prompt 'd>' or 'du>' appears on te files. Unlike under the original CP/M 2.2 CCP, single character input is required (Y or y for yes and anything else for no) with NO to end the line Full From SAVE, means that there is not enough he terminal, and the user is allowed to enter the command with editing from the terminal. Command Level 2 is that command level in which the command is entered from an executing $$$.SUB file. In both cases, the command is store$  d in the internal ZCPR buffer called CIBUFF (Command Input BUFFer). Under both Command Levels 1 and 2, the command is placed into this buffer, the characters of the command line are capitalized, a character count which indicates tng: 1. Locate the ZCPR. Since the ZCPR is ALWAYS 2K bytes in size and located directly under the BDOS, the transient can locate the ZCPR by examining the BDOS entry page address at location 7 and subtracting 8 from thhe number of characters in the command line is stored in CBUFF (the byte before CIBUFF), an ending binary 0 is placed after the last character in the command line, and the internal pointer CIBPTR (Command Input Buffer PoinTeR) is set tis number (8 pages = 2K bytes). The resulting number is the base page address of ZCPR. 2. Store the command line in CIBUFF and the character count in CBUFF. Knowing the base page address of ZCPR, the following informato point to CIBUFF (the first character of the command line). Command Level 3 is an extended concept to Command Levels 1 and 2 which is specifically supported by ZCPR Version 1.0 and beyond. This command level allows a transient pion is useful in doing this: Page 19 ZCPR - A Z80 Replacement for the CP/M CCP ORG CPRLOC ;Base Address of ZCPR JMP CPR ;Enter ZCPR and Execute Derogram to place a command line into CIBUFF and the character count into CBUFF and have this command line executed by ZCPR. Once control is trans- ferred to ZCPR to execute the command line, the transient program which placed the commanfault Cmd JMP CPR1 ;Enter ZCPR and Don't Execute MBUFF: DB BUFLEN ;Size of CIBUFF in bytes CBUFF: DS 1 ;Number of Bytes in Command Line CIBUFF: DS BUFLEN ;Buffer for Command Line d line loses control and the command is executed exactly as though it had been typed by the user at his console terminal. In order for a transient program to utilize the Command Level 3 facility, this program MUST do the followi CBUFF: DS 1 ;Number of Bytes in Command Line CIBUFF: DS BUFLEN ;Buffer for Command Lin DS 1 ;Buffer for Ending 0 (set by ZCPR) CIBPTR: DS 2 ;Address of CIBUFF (set by ZCPR) %   3. Obtain the User/Disk Flag. Location 4 contains this number, but the user may select a flag of his choice. This flag is one byte long, and the high-order nybble (4 bits) contains the user number and the low-order n mov a,h ;High-Order Address in A sui 8 ;A=High-Order Address of CPR mov h,a ;HL=Address of CPR mvi l,0 shld cpr ;Save address in buffer lxi d,6 ;Poinybble contains the disk number to process the command from. The User/Disk Flag is to be passed to ZCPR in the C Register. 4. When ready, transfer control to ZCPR to process the command by JMPing to the base address of ZCPR. t to command line buffer dad d ;HL points to command line buffer xchg ;DE points to command line buffer mvi c,10 ;READLN into this buffer call bdos lhld cpr ;Get A The first JMP in the JMP Table given above is at this address. At this time, ZCPR will log in the user and disk in the User/Disk Flag and process the Command Level 3 Command Line. Page 20 ddress of CPR lda udflag ;Get User/Disk Flag mov c,a ; ... in C pchl ;Run Command Line cpr: ds 2 ;CPR Address buffer prmpt: db 'User Command? $' Enjoy using ZCPR!  ZCPR - A Z80 Replacement for the CP/M CCP The following is a sample program which illustrates the steps outlined above: ; ; Demonstration of Command Level 3 Facility by RLC ; udflag equ 4 ;Address of User -- RLC Page 21 SIG/Access: Enjoy using ZCPR!un Command Line cpr: ds 2 ;CPR Address buffer prmpt: db 'User Command? $' Enjoy using ZCPR! /Disk Flag bdos equ 5 ;Address of BDOS Entry Point org 100h lxi d,prmpt ;Print User Prompt mvi c,9 ;PRINT function call bdos lhld bdos+1 ;Get address of BDOS å&  ålt-in functions to CP/M. Dennis McFerran of FOG reviewed this program and verified proper operation. He supplied the READ.ME file, which briefly explains features of ZCPR. More detailed documentation is contained in ZCPR.DOC and OZCPR.DOC. å Jim Woolley FOG Disk Librarian October, 1982 ME file, which briefly explains features of ZCPR. More detailed documentation is contained in ZCPR.DOC and OZCPR.DOC.  DISK.DOC -FOG/UTL.011 First Osborne Group (FOG) Utility Disk This disk contains DIF2 and SSED2, which were submitted by Jim Crowell of FOG. DIF2 permits identification of differences between åtwo files. It can feed information regarding the differences to SSED2, which will edit the differences into a copy of the original file. For a brief description of the use of these programs, place the .COM files in drive A. At the A> prompt, tåype DIF2 or type SSED2 More complete instructions are contained in DIF.RNO. OZCPR was received from the Osborne Users Group (OUG) of the Washington D.C. area. It replaces your Console Command Processor (CCP) and adds several new buiå'  åååååååååå