TDMl/f+Altos 580 ZDE 1.4DSQD (80tracks, 5.25") 4O!"pz !o:n :(9*p "pz 8>2n##M#Hv*~} | yχlCG <4"C{2!"E9"1A22!ty)K!G_^#V*C~E ,&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :E B 2>: b# : y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN# \X ©RIGHT (C) 1979, DIGITAL RESEARCH %_͌> ͒> Ò> Ò͘~#͌ì _2<د2 ه!߶2:2a{_:߷ʖ:߷>Ľʖ:=2–!B!6#5ʖ:߷Ľ!yͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Nx: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD #2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*#͘*~ "ڷ"͌#>?͌͘ =_.:;<> Oڅo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USER4!yO#< Ty#O 3ۯ21y_͸2y2ͽ:ط˜1͘A͌>>͌92^ :߷¥.!_~#fow]ݭގޥ!v"!çREAD ERRORçNO FILE^:߷'yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^"*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~# K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ݯw4!Y~ʆ͌†t=ʆf ^ T ݯ2o&)|+!<ͧ %"**#"͕: 2Þy<_WyOxOxG* ~V5dw^ :ʈNÎ N#Fyʝ*}|\#u*#DM*6# x±**s#r͡*6#6^>:A#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5`~2߯2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !߶  $$$ SUB$  *C ^OT *C~wD -'  -@ͦ~^*C Ox! N!Fwyxʋ>ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=262*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{CP00=2)ͽÉ T!@k!}|q=qf^!~2>`~2߯2\!!B!~>3s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bw!>2*C~=2u:B2~2wE:A*Cw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2'e >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !߶  $$$ SUB'"C{2!"E9"1A22!ty)K!G_^#V*C~E ,&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 1O͐  :E 0Ib> 2WSlÄò>>÷ vCBIOSxx COM B1د22!^|G G x!   *"C"=(=ѷ !!;!Þ! 64K Altos Loader 2.25f$ CBIOSxx.COM not found on cold boot disk.$>// y.2Q>2RM!+*)!1@l*)~=(8C+2-*)i`NB}^(< ".g.<"/C'|( n&*)n *)!V^*+R V^*-R(!+1R B 2>: b# : y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN# x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Nx: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>#m͌ͅ*/NV^ ['#F>~ 2ɯw: >~~w:>~w2G濰~wV^fn+S">2~!:G !5 >8!R6(:Q(yϿZ;*#P +x]G  7^x     $@7 5ZDE COMZDE14C NOT)SNAP11 CIMNULU15 NOT SNAP11 COMSNAPRCP CIMSNAPRCP COMNLUPATCHMAC(3NULU15 DOC7)*+,-./0123456NULU151 COMx789:NULUFIX ASM ;NULUTERMASM<SNAP11 DOC=SNAP11 Z80I>?@SNAPRCP Z800ABZDENST14COMSCDEweZDEPROP DOC8FGZDEPROP Z80 HCBIOS64 COM TEST DOC   *vZ3ENV0_oZDE 1.4C Copr. 1990 C.WilsonADOCWTXTWCMDNLIBNAAB@8 _TELEVIDEO 925 PTG4G0S= ER02 Teletype 6W' Q(     & 1  < y  g y] & x::a!L:͈ͦ͟)!"M$"<  5! 8$%1 w$$=!"%1" !O:ͦw Ͳ08:<͈ ]B[ |Mt#"!=]{>!:::G͛͗::Ýx~͝#x^>#!,A:^ !<":*.%":2:<2:2:2:!":":":*:+":6 *:#":6 F#^#V## ^#V##Ͳ@`0@a{_::>G::x= :aG x BDM*:DM*:*:K:K:*:++*:+*:":#":*:#*:":+":0+ > 7> g ###7?(#+0S> *: 7?z 7*:+> ##>4::?-*:+":::(=*:#":::!:(<::2:>5::=(,'!:8#$::=::=~a+;!F:ͦ͌͟ ͈&*d&*n&  & 'GL&0'&1<2J'\ \!C:ͦ͟w ͈ [sJ6hD!     JͿ3Z33,3MͿ3~:` JͿ3,3o3o3<6ͼ1ͽ$::ͽ$::í::( !9E3_ <62:2"-( !@ :! 3::_͈+::_ + S(D e- ͽ7::2::: ҭ7:]Ĺ3Z30͞2[[::o&8^#V{2ͣ2 ]]] o3::( <6í7~ >>>>>> >> > 2:*b&))))#2!c<::!<:::< 2:ɯ ~# >  8&T]~  > 8 > # x S:*:T] >0~ uS:o @ }> ͒( !m(!:6*:#w":͒!:6*:+w":!":*:#> *: *:":*:+> *: *:R":!9E3~Ͳ2:N(Q ͭ3~0 W>!)<>_!z(N #= ~(^6#DM!BDM{(I: :s#K!T]BBDMN#!)<::N(Q +~#8#+<6 !!>ݾ8^R8#"|F + ::_:: /2:6͏82 !:5#~T]#T (O!:4^q{8>2U ::2U ɯ~ͲY(N  !(!!  ( (#OGyH~A="==ʆ>B2 !}ր0>~w (2(. (M(Jy(!w# 0@_3Ͱ3t3Ͱ3  >+͔3 ͔3͔36}ր~͟ > BKxbk~08 :0 #x0Ex(<($8*(8 ,!'ͳ 8$!ͳ 8!dͳ 8! ͳ 8 !ͳ 8x70= DMOE V د 7!' FNy(-B0 ##>1B84 #m6#+| !"!!!:F~0:2:!:F0G!(^#~#O~˾(#~˾>1)!v9E3 (cO!}9E3~ͲQ ͭ3~y( !)<6<6*( 08 0Gx2:!)<":>2:!R~2:~j&>2)<<6::2:~!:6[(+](.>(5<(<_!)<~#({ #":!)<":ɯ2:_ ͆*:++++":>>2u::~_*~>2:::  *:^!":)*:~#":($_~< :: !:~<(5(!)<":{ɯ2:!36!3w|8::!Rj&!3~62:::#NFy(>0}0B> 6 #= 'd !: <2:2:2:/2:2 >2:2::2::2:!Q9E3 !:j Ͳ B(dD(ZP(SL(22:O+!F#/*:":*::: ::!:2:!:n(g!Oj R+ m *:[:":S:͗!:~(2:<2:::Gz 8o*:': 9͝ ($::_( ͗x(( x:: 23!3~62:::23Z30͞2! {2@ `i : *:#[:RB9 *:[:͇*:[:͇ 9 ::>Y >N29!9{2o3í7{z~# (8::Ĩ2! 3! 3h0í7*:ͤ!":í7*:":*:+í7"-PY!~O >>w44!>N#Fx!~@8 *:>W!8 *:>R!B>2:i8'*'::=G::ͽ7::!:G::"ͽ7!j9::(::N !p9E3E ::N(::(_jb x( #DM͹z('(t++ (t++ͨí(z 80>2:n͝ [:{z0͗::O::( y͝! ~(˾F#/!:5ª !F#/*:++d+<6::> ĝ::g(d+!Z:ͦ0O+!:40N::_::=00::O::!:8˶>2::(G!:N(E::G::0>F͛= *:::G$͛::!:o&4 !4$2::G7nnnnn (.(::ȯ2:B>2:::W ::(>2: !J+::W >^͝@> > !:v ` 0O!J+(R!n( 4>_!`F#/->_! ~ F#˾_ <7͇8Č5BV8ͯ::Ei8͇8Č5t+0*:~ ^8+=*:'!: 8"*( ~=!c #+": ( (i8ͯ'=!n8::=n8͒;8* ͇8Č5~(6 +#":͸ ( ( i8>2::=!c!:n8*+( P( P+++ ʆ+"+ ͆͆+"+͆*> ( +"+Ͷ > > ( +"+Ͷ> ++ͭ7::=_!Y8<_t+k *!:(2: ::N!:~ 6 !!:má!"!"g!#Gw ++ͨí7!:68$:m T]! +~8*::m F T]x(+:m!:mͭ7T]8S:+x *::m"*::mͱ7T]8S:#x g!O 2w DM*:B`i(#S: K:BDM(+S: S:#": í7g!+#RDM[:"0@g!+#RDM[:"S: ñ7 `i7B̈́"::1"!L9E3> :\G::O(@G![:S:+(ͭ7::_=!Y8_Bڹ¹[:S:::E::??6*:[:R !8ڭ77<6!:~! (6(3*:":*:Vx:; 4:;2T] C:'1( | }  K:n:;2B##y2:( >  ++~#( 1( | } Z~Ͳw#: +6p- %0:8 @G 0:: OY !;p#6?; 6Z3:S(Ϳ3:2:::=2::!:wgN ;͈+ ͣ2NFile #$;͈+$_!#! ~(:Z( ˾#6+> w+w+w+T]+y6.O{2 !:5( > :2::Oͣ2...  y!:(> :2o3}4::_ ͭ7::( !9E3_ <6íV%!/9ͳ%:: c0+:\+ͅ+<t%<6V%!"9ͳ%:: +O+@ 8*:- 0 [:":#t%d+ í7:] ͗%:::: !9E3_ <6O+*:":*:0*:ͨ.0 K:t:;=G;'1(!lòy+++*:~( (~6 ͸ͨ!:Fʭ7!;( O#> ʭ7!;ʵ7O#> ʭ7õ7y+*:~( (~6 ͸ͨí7!<9E3 ;2:2:>21!~/ $#~#/(ͲC(B( 7>21>2:~#1(x2;*:"::;( G> !;~(G#~ͥ::O͆R>2:!B9E3 <6;O!>2:ͨ:;<6::F(ʹ8 (ʹ0::í7>2:ʹ::(::7::68( :::;̓(::?::7JͿ3Z3!R:3o3}2:*:++d+V%!(9ͳ%:: .O+*:":*:g!O( RBKͨ.0*:++d+t%<6!\; 2l:::::~:!;\ 2l~2:_#~2:#~2~: V%!9ͳ%::t%%h0 <6E3> G!~Ͳw#!~/ #+ x,2~:#~W( A(N2:!":::N(>2::T2:::= *W": !":2:2:ü1*_A8[0 nˮ  ù7!Z9E3: 2:h0<6ͭ7!:~/w!Uj&!l:::N(:U !@:>ô0!Rj&:R!:~(::!f: !@:7ô0!:j&::!r: !@:Dô0!:j&::!o: !@:Aô0!Vj&::=::N( :V!x: !@:G}͏8JͿ3:`Z3,3o3 7* 2:7_YN !:j&ͼ1::!i: !@:;ô0'!d8#~=!n8:R~ʩ'î''::(H!k +y0+6~:c/<6é'!b9E3 ::(@(=#([ (18,j_:k7!d~( 0# +s{!jk d (+O<d8d 8 <6ü1!b9E3:: 8(!d(#6( T]#H<6ü1!I:ͦ͟( !m (V I ͝'0ͦ'͵7_?8 ܹ7ԃ3{ͥ::!n8 ͋{ !m3(::W> ͥ͵7͋::!c ô0*'O::8>2:y2: *'!:0%2:ͼ1<6::N(::=J'!b9E3:: \'!::b'ͤ0ü1!::~(6w>::G:: = '2:+ >GB' x!cGx( 0x::!:4q'͆5+ - :U(* (ͣ* 4͝'( 8 >'x==::=6)*"&*8'V*'' )'!:>?2:)*ʜ) ~=!c ͥ::!:7ͱ7Tt::> > + !7ñ7:R¹7*:~ʹ7!mʹ7*:> > ̵7::> 2:::8 :R(::='<é'* J6  *:+":~ ʱ7ù7  x(*:++> ##":ñ7͆ ͹7*:~(i *:~6 +w~#": ̱7  x7*:#x8gT]#i > Ͳ8*:6":t0 *:#": !7ڱ7::G>6t0 *:~ # +*:6͆ ͹7":>2:!]:ͦ2:>  !o>g::2:]0 "02: 2:44q'0+ *(^͆+ )*- :U('q'0͆ͣ+ '͝'))>*( > > ('(+ B͆+ : -(N> q*>'* : ͆͆'+ ͣ6(q*::Fí7:U(60(: J067* 7 (6* 6͆+ k* (6͆6* *͆> >  {2*::6*(H+ > J͆+ > '̓'!:::=G::*(6'ͣ6͆5J*:~F =!S2:ɯ7G#^#͹3 ]>  ͹30Z3t2*0Z3:<_͆7o3:_!: 3>2::_!: 32:::! ::!::8 ::_͹3? _͔3:`(::(:Wz2::N !!f4z(  ͹3 {!f4 A(=!f4!:R(z_͹3#{_͹3{_͹3#z_͹3:G!w4z !L+!I+!I+!A+!A+ !E+*+~ #,;:-.?!  JͿ3Z3!V:3o3:`( :S1<6JͿ3Z3,3o3\+2+*#^#VS++r+s[+*#s#r*#s#r>2\1<+o>0ɷ(%![˶#˶<(!()% :A2: 3T]ʙ,O>: z+6p-6:(#x2\y2:_ e+~08+:0'0_+~08:00W_+ 0l{2: }(~ (A8T_>8N+}(~ D#{<2\>:> +#(]#(j.( (F/  F#9-(  >  37ɯ(>. ##(2 (/  #9-(~ #E:C:2 ͂86<5͇8 ::=ʓ5=ʆ5=5 6::چ55 6:`"Ϳ3Z3*:::Nx5**:s52::o&s5o3Ϳ34 !43K v8::G>6K v8+ ʆ5::W:SW::=_ʆ5Ϳ3B!:::=W=G:<_ͺ6S::!: *:ú6K |8! 3::!:(G)͖4h0<5K |8! 3ͼ1ͽ72:/2:>6::< ! 3:32 :SWͿ3::(:8_B:<_::GJD_t:W<_:: 8(7::GW$B::G::=W:<_ͺ6S!: *:zȯGO_O(:'7 (z7"{!c<_DWDG6> z7>~/ #~( g- 2:!eBN-FN-JN-NN-:] (!F- .,;:?*=?( #g-2:ANW> +#(T] (#8-(0PY() 45 #( +N+F* |( N#Fxɯ2h2i2|2:/2:ͅ+< 7͈+ͅ+ʠ.0!::W K~ >-w(o ::(e/2:~ ~ (0˾> #wz ˾~ +~(8 2:"!m( ~ 8~ > #wz#.-2: +:\+!] ˾#c0:fͅ+2::~:(4!\ !\!{:͈+< 'HG() 8_͔3{=7 (2@_3Ͱ3t3By (::( <͔3{7: Ͱ3(> Ͱ3HG! 3:: Ͱ3 ::=W3:_>> >> ::02::bG>2087>20!88!!887͇8Č5:`!!: 0 3:ļ17::=::=7*( ::!(%::!:7::=7::!:7::͵72:>2:>2:!:!:6Ͳ8*::+ (8<̓3Ô3::_:S!:Wÿ388888889 9OuoMemoryInvaliKeyI/ErrorNoFoundV0͈+_+8NS(JD(F-͈+2:2h2|ͅ+-͈+(H| 'c2}2~2ͅ+V0ͅ+'ͅ+< V02:2h2|ͅ+::= gͅ+2::: ~#ͅ+(L0B!:w > (|£/}£/£/(6#ͅ+(L0ͅ+<72i:`Ϳ3!6:;30!c:::N :: !`:ʹ0͓&Et&&͵&::=!u:&Gô0:`Ϳ3Z33o3:S(ÿ3!`j&( 2í72͸h0í7Z3  SyntaErrorCannoReformatNameReadWriteEraseLoadFindChangtoDirOptionsLengthColumnPageLineMacroRepeacoun([Q],0-9/*)Kenumbe([N/Q],0-9)Abandochanges(Y/N)Unchangedsave(Y/N) ChangedQFilsizeNNNNNMemorusedNNNNNFreeNNNNN [MenudisabledseZDE.DOo.QRF] 'LCl ^Q ^O ^P ^KESCChg?WaitRdy^QTOP Pg INSvt hy AI DS MR PS BAKA3,3Ϳ3:\@Ͱ3::O30 2y01y x԰30y0Ͱ3-(+`iF($:\# N::(>/Ͱ3#~ İ3>:Ͱ3!]~˿ (Ͱ3#>.Ͱ3!e~Ͱ3# ͹3>/Ͱ3::Ͱ3o3!Sj&(22͸̭7:S!%;:: :<2:::_~# ~#G> B2:2t2{2::!:j&(/2::ĝ7ͤ>2: 6:` Ϳ3͂402:í72í7::!:F(?2!` 8)":^ !:63<6::!1=u63}4~͟ (!4> ((!8@(!b? 63í7^csup^worrt^linup^delete^UNdelete^Ptcode ^down^worlf^lindnDEdeleft^reform^Pplacmark ^left^pagup^insert^deword^castoggle ^right^pagdn^insrCR^deline^L(^\rpfind (PRES^K/ESC^O^FOSUBMENUS) ^KBegiblock^KblocWrite^KLoanew^KNameEscMacrdef ^Kenblock^Kdeletblock^KSave ^KInfoEscstorkey ^KUnmarblk^KReafile^Ksave+load^KPrintEsc0..usky ^KCopblock^KF7illist^Ksave+eXitEsc-TAtaback ^KmoVblock^KErasfile^KQuit Esc-Arrowshifscreen ^QgotBlock^Q 1 occasionally didn't work in ZDE 1.4B; 1.4C fixes that problem (hopefully). Please report any problems you have with this version to me at the above remote system, or by mail. When describing difficulties, try to tell precisely what the symptoms are, and include as much information as possible: what equipment and operating system, the editing conditions under which problems occur (e.g. rect left margin with or without a page header or top margin. The printout is also slightly faster when left and top margins are used together. Under CP/M Plus and Z3PLUS, file output is slightly faster. ZDE now preserves file CREATE stamps under CP/M Plus and Z3PLUS, if enabled on the CP/M disk label. ZDE now always finds strings exactly at the end of a file. When searching with the /c/ option, erroneous results occurred if a non-matching string of the same length as the search string  beginning with the same first character as the search string was located at the very end of a file. This has been fixed. What does all this cost? Bean counters will find that ZDE 1.4 grew by 327 bytes, with the result that the maximum size of text files is about 6 lines shorter (with a right margin of 65) than before. 3. NEW IN ZDENSTAL VERSION 1.4. Version 1.4 is REQUIRED to install ZDE 1.4. ZDENSTAL 1.4 allows the user to configure proportional spacing [this can also be toggled while operating ZDE]. ZDENSTAL's "R" option now restores ZDE's proportional spacing table to its default values. ZDENSTAL's "F" option now gives the location of ZDE's proportional spacing table. ZDENSTAL's Osborne 1 and Vixen terminal definitions are now separate due to different screen width requirements (thanks to Ben Cohen for sorting this out). Some ZDENSTAL messages have been improved. There is no change in .ZDE, ZDP, or ZDK install file formats, so install files used with prmEevious versions of ZDE or VDE are compatible with ZDENSTAL 1.4.  - End of ZDE14B.NOT -   33dë >_ÍÒ~c!$>v2h:O(2L*"!">2!"2!"*"1 G x! Gyx! ^#V !{!^#V^#VNyx>(N x>Nyx >=,(yN y>Nyx >ȯM(yN yNyM],>/. G(#2!( 2!6M:8>! N84! N#FFNF("~"zfnN!^|G !! Ϗ7^ !###### ZZ~(!{N#F#^q#Vp!{s#r V#^#QY/(((! -!-! -!-`7 Altos CP/M 2.20S0$Hard disk drive #1 not available for CP/M$Bad sector table full. Re-assemble XIOS$/ !FN}2GOC_͍[ͥBKCC_V ^ !sR<<:<0s!>2E!():E=2E KCCC_ 4> 2E!/(FNr s !v#!*~~ #>fnfn7f n*zfn *~NͥS}2*~i`NB}^(< "g.<"C||( n&*~n >!B0 = {/_z/W*~V( wV!"͒( V͒y2*~V(wk͒(:(V͒> :(!!^B F( k *~tu!w !Y*|tu w:!V^*~R( = ~ 2ww: ͵>ί~ݾ>~w:͵>~w2G濰~w͔S"ͪ!͢:͵G Ox東ȯ̈́!5 6!5 E͔S"ͪ!͢:͵G>̈́!5 6!5  {> F>2>2~ ?ݶ 8!6(:(yϿ(yχ~ݾ wvFF= }gv 0u v Mv 0=.u F F7FFv 0^C$0FtF- v 0vF F둃 ]Urww> ;>ί""fn}!|! N(V ^ V^{"z"Rrs>;>< N(~~w N(~~w!>2>2!" S">2>2!" "S#>>2>2 Yt ?ݶ K*:;G>x@( Y N A N :>(<!5 6!5  Ff n % <V  <V KC͒  ! ɯGOV͵V͵V͵V͵x =y~( G#O#Gxy!6#(:h y!χh y! thi i tes o th emergenc broadcastin system. I shoul no d wha want except th blankin o th curso doesn't seem t wor properly. 3NV^fn+ ( p!~w"~w#~w$~w%44> fnRtu44ɯquYtqs qq4I3P # CY P 3aZss6$,D  Y A  22 Bu                        P=t33CÃ*]UFvWFv<tFVFF]Uv0P&u v<tFv F]Uv0Pt v<tFF]Uv 0Pu(v 0Puv <t~FF Njv]UlKۉFx60멸Pv뛍FPF PFPF u|FF;F|hKۉxB0vB0SPaF뾡Hx6F0Pv3]U ~u3 ]ËFH&F ^v~tKvD^ ;w/;u vvD+F DFF )(F ]ËFF^믋F Ph;ÉFt ]3 ]U~u]ËF^K^F Ë^(&F N^Fu\;v FvƋv FDƋv3]ËF;F u ~ FDENjvqv t0PuF v tH0Pt. |yv0Fv0@$0%u F0ãFFv0Ft)@$0%uF=}F~4FɋvƄ4vF0=>vu F2Fv0Ft)@$0%uF=}F~EFɋvƄEM..FXv0Ft-@$0%uF=>uf=<u==u볋v0FFt*v0@$0%tFv0tP4P62ESF廘SVSFF u P]~uv Pt]øPvF ع\NFt\F]UF x=~ ]ËF ؁\^t% t ]ËFvDFD 0FtNFPvv Hu3]Ã>t]ËvD]UF x=~ ]ËF ؁\^t%@t ]ËFvDFD 0FtNFPvv `=u3]Ã>t]ËvD]U Fx=~ ]ËF ؋\%u ]ËFO33ۅyK 5PS~uv PP840uvD0 DE0uvD0 Dv D0 DXP6.3P ]U0Ft F]øPP%]UF%PPF]U0t]ËF]Uv0uv PF@@v\0v]UFFv0tFv$v PJv]U P0u33CÃ]Uv 0v0;u0u3]FF ًv 0v0+؋Ã]U 썆F 0t|މ^C0=%Fu[0 F^LFP Pv 7FP!Pv " ]=t=t=tރ>t ]ËFF^^FP PvQ t ]ÍFPPv) t ]ËF^ ]UF x=~ ]ËF ؋\%u ]øPv Sv F FF 3\~u~t]3]UFF=}#0Ft Px Fv v ]UFV!2]U썆F 0uމ^C0=%Ft0=%u40 =%u0PFFPF PF P FtFF;F}B 0PbFvUx ]P3XPx+u3;twH XUFP^;sG0tFF=Pu3]vv v ]U vDt0%t VPvD0Pv0t4@PvfF@u4PvKFP3P3SvpFG64v)FF14Pv FF3 ]\ N^ v>3ɅyIN ^F yBV ^^ F1~tv>\ N^ v>3F ^F FHFF ^3ɺ vm0vR"F ^3ɺ SF ^F Fu ]UvD0%t VPPvt5vDDD0P]Uvv܋]UFF F UFvu%؋~uӊf!t S3]Uvu]Ë؊uӴ!t Sl]Sa3]QVw.tAtAtAN#‹^YQVw.tAtAtA3^YF'F(RQG0;G.uGG2G!G#GG2W!G#O0Ӄ4!ӊf!2YZ;G2u3PG%t tXÈG%XG2;Frt3G0ËFG0uËG.G0lU v t ~狝Pu~u FHB"-FF"^ظ +FF ^~tv>\ N^ v>3F ^FFH^ N3ہيxJ"^ V^ FV^ F FuF"^ظ+FF ^@~tv>\ N^ v>3F ^F FH^ N3ہ0J"^ V^ FV^ F FuF"^ظ +FF ^~uFF F ;F}~>5<0tF v>^pF"F v>FN"VFOFHFA36]f/e/g/c/sM/o.x+.u-d;- .;/u./y뿃~uuquLufu uu $ ]3^~牅PSڨu3G(G&G%ЉG2GG*GG,븨u3ɊG%ttAӴ!uu듨u~E;G,r u ;O*v| G(O&mu&~FuG(EG&QG,EG*CDt_v x |Ftgt! Lgt!< u Ggt!+||<tЪËv xtG(W&;G,r u;W*vO*+O&LG(W&]|FG,W*LFVFuJG.F +;~+ȉN 4N 3F͋W&G(vLW&G(Ft>?uFt;F }F FF )FF~ t?F HF xFFv<~FދFHFxQFFv<FFHFxFFv<FF HF xFFv<~FދFv@F:@6]Ã~uF~~FF@^"S^S^SvP^>78v>^"NɉF N^y^~u~ t~}F~ tN3F~tF~t!F@^؋F^xF~t1F,FFFyF=cF~F~~F~ u)F;F~!^)^FHFxvpu*6pu]áprvt~ u]ËF @@H $Fy vFuNF txv N xF ϋFxA=7FF^NV ֊͊ߊĿOu% F 3333ҋv4Ft D\Lv2F(]UF +r; r;s  +듉]3]Uv 0v0;u0u3]FF ًv 0v0+؋Ã]  [5Error: cant find library Old library has %u slots lu$$$$$$.tmpNot enough room in new directory Copying %s lu$$$$$$$.tmpDirectory error: %s is bad or not an LBR file Directory error: is %s an LBR file? Number of slots (4 - 256, 0 to abort): .-LBR close error: library may be trashed ,+jd@  ((((( H     ((((( H     w024arCan't open stdin file Can't create stdout file *,l0123456789ABCDEFCONAUXCOM1LPT1PRNNUL 4@8LU -- T. Jennings 15 Jan 84 LU lbrfile file file file ... Where is: T List of files in LBR file, L Same as T, " A Extract all files from the LBR file, E Extract file(s) from LBR file, U Add to or create LBR file, D Delete a file from LBR file, R Reorganize the LBR file. Not enough memory Not a command. Error: cant create new directory Updating existing file %s Adding new file %s Error: LBR file not found Deleting %s %s not in library %-16s %8lu %8u %-16s %8lu total bytes %u active files, %u deleted files, %u empty slots. Extracting %s Error: cant create %s No room in directory Cant find %s PȘP@PP (FP]YuIDP'Y3PPOPRUYF \ =?t=Lt=St=XtEm*3P^Y^]U~WVv3PPEOPTYWPJUu>+tPh'Y>t5WP%Ut&3Ptt6^ȣȋTDȣȋȡ;| '60>uxP&Y3PPNFƆ~\PPPP3P*Y3P66N=uP3P8R3P)YvPJN~PQY+PP* } H'VY|>u6ȸPVV;|T>uB6+>+tPP%" >uq3PYPVI>uV. Y PV53PV(r3PV >(3P\Y>u >t ^_]V YɎW&M2_ !.?ABCDEFIJLMPQRSTUVWXYZ%+8BP]ekyG3nUFPFPH~u$PP$6YP66ȍFPFPȘP^P<P}$]UWVv~D t }^_]ËTD VFPvv%VFPvv%VFu*|t$VFȋVFȋVF6t tu(|u"VF)ȋVF)ȋVF)ȃtt66ȸP#t u|t3}LjDV,YU~VvD t^]øP]#YFP,YtFPYtV((YPFPk*FPY~PFPVV u~tFP*Y6~YFPP3P4UzWVvdž|V'YD t2dž|F=.u!}t}.uP3P43^_]Ã~t3|tPP~"3PP'JPOY=Yt3D tCPS"Y3PPIPOY=Yt33PWJtP3P3)"MZp:  @/_ 0_ 3x|uWLY=uWPP32zPtLY=uPPP3zt3#>t:3P PgI6ȸPYI^P'LY=u^PPPb3WLY=uWP3PJ33W YYtWP3P,33PVPtt ")ȡ;Ft+FPF@Pv1*dUWVP Y3PPHPRNYF+t_FPYPFtS.PFtH.PFtR.PF t.APvv[PFPSFF t.FFFF=}"BNNt3 BFfFFt*F*؊PFPFPFP@PnPL( >F*؊PFPPvv)PFPF |^VcP Y`P Y`tW`PPq'=tP`P,^]`PPT } uƄ?F36FVFPx(;6}FPP$1t6FUĀqPkYFP (Yt]ÍFP"YPKYUWVP8YP'Yt^_]ÍPYFލPYt ~t~uP PP03VFP';6|$t~t>t 3Pvv6OVVFȣȍP^PKFPo#YP^P%^~tPFPFPȘP~tPPH F+t*XPYP]*PVTIPPr? ƆƆz.PPP{PAƆ~\*؊PPPVTPzPHPȘP@PlP#vލPFPz =t=t=tPFPqF~t6QYUPY3PPmEP KYF=St =Ut]ø~SuPFYUWV^G t^_]FFȁ>v>uW3Pv)"YPȍPPY/u!~uPFdž = džA0PPP^G*PC~uPYF=}%=uu- t F;'|FFF;)|G~u(PP%DuV P)JtVIY=LuNFFPPCtV P"YPHPhYuPP3PFȋFȋFȋF6\KY=u^P$YuUWVv3}'Vv(tPtt v&KGӋ^_]UPFPvJ=t3]ËF%=t P3P%3FF= ~PP3P$3~u3붋F^GPSvKJ=t3떸U^ G3F؊{F^G+҉VFG+ҋ^N+ӉVF^wFPlYP^ww d|uw.G WPdXы^O_Fd+ڋӋPyFP^wwSP(]UItruPPCu u0~t PPC PPCFFu!~t WPmC WP`CF>u6SYUQ?PYFP6$Yt]ÍFPvP YP;SuTFPP"=t ^PY5ƆSFPSP PTPvbHv$Y6Y P3P,UĀLPYFP#Yt]ÊFPAHYF}^% F= ~n ~uF % = rpaP%PvG% Pd+R_^G%P;Pp P<p ]UR裲ȣȣȡȣv~P>3PvAYPȍZPfPq#tD6HY~u&vYP~PPv~PvB PvZ~PZTP~PYbdž`\b1R^F^F*=u FdžRw ^Fdždd=s^Fd拆R=wuo^GG;Xu]>t(3PRPbGPdPat^_]Ãu F*;tFPv+t2Fu,FPFPȘPP vލFPLGoU\WVPY^P["Yt^_]ÿ ^\\?t<PFY& =At=Ht=Rt=St\3VFP";6|ut닀~ub^PFPFPȘPP DžuF*%FPFPYP@=uP3P*FވFFFP!YFwkUVvD tURVYPYPP/EPPPLu VRYPY^]U~ POYFP!Yt]ÍFPY~FPBY=uFP blG^GdGGdGVTbP;t P3P!e6YGYbQGY~PGYd%=YP YP:u~AdPPPe!=u=t=t6FYbFY~t ~P9Y]U6uFY~u ~FPvFPv  PvCVI"gPY3PRP63F"^;W|u;G sPYPtPjs~eP;.PeP5<Jt؀uGGQ|PeP;!P3P)~tFPY6zYU}WVdž}!PYFP Yt^_]ÊF<+t<-u+u}FPFPDFP>Y}t}6N}6ȋƙ>ȋ| ;6}6UHWV=~P3P)^_]vlPVDPYjlPBP3PvȡȉFȉFȉFȉFP3PP3j6FUPYPYFFVFVFVFjhFFF;|hvYFVFhFPvHP PFPHPjC ePFPGFPYFePPLP8LPYPP ;s+ҋ^;Wu;G u#裲3PRP68Eȣȣȡȣ~F=tN6DYFDYFPEYH:YP[YP^:uȘHPPPdžَt :u>u :u3^_]UWVvP F^?t$~=tPe0Yȋ^;uFFԋ^ދ~:u3^_]UWV^G tP3P^_]Ã~tvv{YPitڋ^:u P/YȉFPqYVFF^;Wu;G rFPv,=t.Ft 3Pv2.019 04/21/87 Copyright 1986, 87 Dave Rand Released to the Public Domain - Utility - - File functions - ? This help screen B Move back one file ! Escape to DOS C Copy current file . Create new directory D Delete current file/directory I Timestamp display toggle F Find file/directory L Log to new disk/directory J Jump to file number S Check remaining space R Rename file/directory X Exit to DOS V View file Z Zoom into archive/directory - Mass operations )v9YtvPPv YVF^O _;|u;w5PFAPPP>uE3PvYPfFF63P6v?P/ ;6t v8YF~uFPv+=u ^G Fv:YF>t"NVَ^vP->tFvvR u63PVv@P. ;t4~tvc8Yv\8Yv8YvYPFAPP~t63P6v?P-. 3u~tv8Y>u"NVَ^vPX,v7YF Pv(3U P!D - A Retag files E Erase tagged/untagged files T Tag current file M Mass copy tagged files U Untag current file Q Squeeze/Unsqueeze tagged files W Wildcard tag files Y Set attributes on tagged files $PoY3FFvFPF;}~uFFvP PFPȹ PP ]U/WVdžOdžQFvFPEtFFSPPR0 FPP>0uQ;F|捆ZTD=;D :VW?َ_^ƆC P@P/Pn5/P]UO]U: FPv?*PF0w]U:- =c~bFt*.YF%PYY ::F]UVv<t FPY^]U:- P PP6: ]U#P@Y]UVvFF=|3PP&FuE2F[2^FNFNt NN%PY6FFPP~& =t=t= t= t=t=tʀ~tFkJ^^F^]UFڋȋVF-2nPFڋȋVFB2ȅXtN3]Uvv^1F=uv) Y~tP=; ^WOQ/ FPP/StvP3PQ^_]UzvFP4FP YF~؀?t7:u1P4Yȉ|Ș;u~|PP/Ș|~?uȘ;|tPPPF1~1YPPP/1Ș;|tP|6FP1FPw1YP|6 P16ȸP|.^PJ1Y0Ș;|u^P P3P|6 Px1 ]UWVFF;FF@FFFF=~F;v}1+~|$FPW1=~ FPWe PPF]UFPv(=tFt 3Pv%Pv1F=uvPPF]U3PP]%ȸ/PAP)PPw(ȣ\PPP'PAP3P^P?(P*Y]U6ȸP$P'YPlY]U~tFH^!r H!sȴH!sȡȱ࣬ȅt> uPP]U~t I !I!]Uh^:Gu<.u^PYPPȉF^ t&^:uP)YFPP#F^?tgShPN)+~FʹFF^_]UFFFFVW v~ &&:uFG3r_^]UF FFFFVWNv~ &&&FG_^]UWVv~3P*=u,%P@P2*=uVW-/F=t=u ^_]3Uv3YFuv3PPF]U|>uV´6!=t3VFY3NA%4Sұ3|V.Z3Z~|%PXщVFVF8]UVv<u3^]Ê t|:u |uހ|:uD (hPYhPYt hP&YhP0YQv0YY;u69FP )v2YPFP(69FP(F=|=~]ËFȍFPFAP?PPs&PPhP%hPȘPEP^PL&3ȣPPFPW=}|6Y3oUWVv<FF=}F$K< tGF%= t+G.FF=}F$K< tGF<^_]UvPBF@]UVvVLP%F=tPPF=tƋGVYu VPF=t ƋGVY^ ]FP_YPY3PcY6ȸP^PY6P6NLHPPFF;L}T7>!YF6T1!YT]UWVV6`VP\]PP,>LVPPuY7tPPƹFG tQ.tHCP YPYLTLLTFGL=|PPPNF@PPeuRR=~@PYPPXFu=t=uPP)R+PP F=t=uPPF=uPPuF@PYPvjYP ]UPP!Ft"P P'tOPY]3V696Ȏv 266^ô?63ҋ6!r t6׸UWV3ێȋ>St [u5ت9>wSش@^6+ʋ![r;uø[ 9^u3^_]UWVvX ȋ>P=t 9>w3^_]UWȋ>ȋF>_]UWȋ>ȊF>_]UWVv~<t'Vd-YފGPPr&u ^PV%WV%^_]UWVv<t!Pv;&t +F^_]FڸUWVvV,YO;rPv%t +^_]O  PPVPPLF;~}.TWVَ^_]W"YG͸PKY^_]U^TGF=u70P,vY^T70PeP0PW0]UWVvV#Y@P-YVWj^_]USWVF6`FPFFSPPFPP=t(PY3PPPFY=Yt ^_]ÍFPPrF3FPP^t3[.t[PxYPP3P`FPP'NjUWVv~FF= }$ 3VFP;6}FPFPE uFڋƹࣄ VыFωVFWV~vˌَ^_FʈFF PFPFP$FP]Y> ;6u^_]UvY^?t3]UFࣄ P62 v6 6 S# ]U P6 6 62 v3# ]UFP6 FP6 FP # ]U裲ȣȣȡȣPPFP^G*FP0F=WVȋ>ȃ~ u8d=t;+;s +;r zv v^M F$]øPPP%YP%Y=t=t=tUVW&* 20 2 ^Sw6, >tV"%=vuC_WP #u@ t2=r#u3^YOY&* _^]ðUSQ section (C) 1983-1987 by Dave Rand (805) 493-1987&* >2 u&-V uت9>wQPȋ+# XYË^G;t P3PF]@AAŁ@ Aρ@ ʁ@  AAہ@ށ@Aԁ@AAс@01A3@26@754A<@=?>A:;A9@8(@)+*A./A-@,$%A'@&"@#! A`aAc@bf@gedAl@monAjkAi@hx t3F7=tȣ;u|t%6됸4 PP"UWV @=uɉ+҃u=tu˸F PbYdžY+3dž}+ヿtLJ㍆6?GPPPb63P=uvdždž3}Kヿt9ɋRP㋇ڋXZPRXX G믋^_]UWV3v}㋇ɋN+N;vGFF c@y{zA~A}@|tuAw@vr@sqpAP@QSRAVWAU@T\]A_@^Z@[YXAHIAK@JN@OMLAD@EGFABCAA@@V8)2Š؊2.342܊2.34۝sA$^UĮ~u_vfPRvFP FPYYFP'YQvy'YY;u`vYPP<PFP>Tt1FF;L}T7!YF6T!YTL3NPP6YTFPYTG~:uFPYPP b v݋@FF3}'㋇ɉF;Fs=v FFFӀ~uF=~"3}N㋇+FF^_]UVFHH|FHPVv N^]UF@F^^FF;Fm;F}!@^7^^7UtF^^7v;t0^^^^^^Fvvvr]UWVv~㋇ɋ;v ^_]S㋇[;uS㋇[;v3UFF=^FNFË؋^FHP3PS^FFɉFFF^FGF ss;d|u;bs'U6sYPYss]UVW>\u;} ˳;s~w ˳;s~ss;sstHs>\~s s\s3sQCY=t FGsI+ u+st ss"_ _^]V>tn>nu=tlljnnNj6lǬ26l^WV؎>t\= t = t SPP3P3>r >t =tpǢrpǹ=tu!3>r \˳p=t̿Y;6˳rrǪ6pǁrt r 0 NG^㋇ɋ^ɋ^^㋇ɋ^;w3@t^㋇ ^㋇ɋ^GFHP3Pv)"^]UV3}#LJLJLJLJF^]UV3} LJF^]UWVv~㋇ɉFɉFF=u5F=u-㉷+θ#;~^_]ËF=t$!vAP=u΋F=t" vAPV=u3UWVvPwY6oY^:uF^PsY^F?u>|FP3Y36;~}T㋇ bt rǪY+GrPP6˳;6s}rNjt Vr plj^F6˳pNjǝ^_UF*F +҉VFVFPRfXfXfщVF%]UF*F:%]UWVvƋ؋t^_]UWVF*PvsǃNj؀u^_]WYe%Fƪ<tFF=u FNj؋FUVF*PvsǃFFƪD;FuD:FuF^]Ã|uDFUV3P`PP 3}VPF^]UVvv ɉFɉFF=}@+FFF=}@+FFvYvYGN^_]UV3F;F|&~u+N N.F)i=~+N )F=t+F=uF^㋇FF=u^]i<t3=t9=uS[=t) t ,âu*Uss'dǣbǃ>s| u >swHssVF~u~u FFss^N0VF!ssss VFVF;`|u;^w `ǣ^2` ƪDFDFD^]UWV=uL=u ^_]Á=u&%&*`=u벁*UWV>t%auNj؊*w^_]áZ=ϳtZNjZNJ*,FF=uы>ZNjFƪ<uuljFƪwNjGD=tDGDFƪډ>ZNJD*wNjZZLjZ=YrPPe>t46w6u4ƪDuljDwLjDFuZNjZNJ*U>u>u {^P,NP6p ˳\PY]UWV6s>sFsF=}LF^*Ȋg *#ȋP^ *QVY#X F+++~|F^FFFtF^sss;su,Fs>sǙss^F*Pa YOus˳;s \=s=~/FssFssFNt^F*P Ys>\t s Hs\!ss= uss sHsAsFsss=~FNt^F*P Ys^_]Us\ss`  ]Ã2UFJO]sSLN>sǡLN0sǡLK"PYP/P/P=PKPKP-=s.[P޸ ~ u ssࣰs ~} ssHs˳Zϳ\3JUFb^Ofv vU^ =Q^NvYA^KvY1^DvY!XQPP'QPQ'Q'Q'QQ= s.7Q]U]U]UWVv< t< uFF<-uFF<+uF3 tFȋQ Yȋ؋ǃ~t^_]UFuVN!%]UCVN!s ^ssdb' s Hs˳P,NP6p s P Yͳ]U>ͳtbF*sjhfNj>h u >fr"jNjhǡfPXщhǣf̸+jǣjͳ]ÃssF*+ҹ ڋȡs+ڋӋhǣfNJF*j3sFp W;hu;fu^㋇ss돋^p |u?sl+FF~uFF+FF=}F^p W;hu;fu^㋇ss#^p u?v6scYF*s˳;s}&˳^㉇s^p hǡfljW n  0 ]+]UFPv]UFPv]U\WV}F^?t^F^F?tMF=ulPWF=u \PWF =tF;sGFF릋ƍ}+|\PlP|P3Pv ^_]UWVvvv Ph=t3^_]øw PYtE<t@~<t<;uF FG~tvvFP=t3뻸UVvFP/PFPuu\PFPat|t| PFPnvFPa.Pv-u@~ PFPBvFPX=t3^]ø P.PFPP ^FFPYFD^FFF1^ =ct=dt=ot=st=ut=xtҍ2+FFF;F~FF~tP^?-t?+u#F=0uNFPY=u ^_]ËFN;F~vY=uFF^?t!F;F}FPY=uF׋FF~u!FN;F~ PY=uFvY=ulFdF`UvPv]UWV~=Ft<3PvWw=uFt3Pv<PWFtVY0 ^_]Ã|#FtPRPVVNYP W+y؃Gy ك9 GvFP&UWVߎNjv~)!%&} u^_]UF~uvSYFu3]F3PvGPy =u~tvY3ыFU9V!s0 ]U:U;UVvFPP! PvNP =u^]ÊFVFTDVFTD3UVFzǍFPv5UPYz^]UFzzLj%]UVW606..MU.&OUF ؎F  F  F  ؎ VK!.MU.&OUs0 +.0_^]UVWێ^< ,+t6+<=u*&:u tGu⬄ pt؃_Wy؃GyكÅu;wP+Xʋ+ʋUWV++ +x@yߋ^_]UUNVWvߎNj~u +_^]ør@HUWߎNj~++H_]UFu r'VGuVvNV!s0 ^]ËV!%]@u.-_+݁v+شJ!&< &n t &j Ջu&: &6n tJ&6l A&. s&: ،+،ŌގƴJ!s J!sp +A+,+&% uۿ * +_^]UWF^NV !s 0 ]Ft+ҋʋ]ôM!s[WώNj&I_UWVN ~vuutt^_]U^FFGwFG+]UFێË^&'&o&w&u@&gUWߎNj~NFtt_]UUVVWߎNj~+Ovʬt*_^F]UVWߎNj~vu_^F]UVWNߎNj~v t_^F]UF*. Wt*G>. >6 n uċj u+ã8 2 4 XXL!..+_U3]UWVv3PYP PYQ P{YR F@PYNj@ ~>>ǀ< t< uF<tMGG7ǸPSY=uPA PPsPaYF<t< t< uF66Þ3PY^_]U> vY]U?^.U@^$U?U@^P t]?t&f &d VN!s0 ]U>^!s0 ]+]UBF VN^!s0 ]UAV!s0 ]+]UWVV ^]ËH^]UWߎNj~++OFt+_]Ë@_]UWVvD%F+ƉF;Fv FFƉFV7Yv5Yt&;t"vWV_ ~;r;Fs +Ƌߡlj^_]UWVFF>~u||ǁ|~|F6~ljv;6 u^FF=~SFvL Y=u3^_]Ë;t < n~<|ǁ > ^%;uuJv%u+ƉF;Fr(;FvF؋Nj?~ǁ t%BgUVvNNu^]Á$6~3UVvF =u^WVF#F=~^+҉VF ^ sߎNj~!_s0 ]+]UV6مu0PPv,t uNh Ȇlj6;v~vtVv6t6)6ً^]UWV~vNt0G? u&+FPvvPi Pv~;~t+FPvvF^_]UVWߎNjv~N;u;trONtONtt_^]U^D!r€t t]+]UWF>. P Yu_]UF@$;6 rhn u;8 sY;sS. +];: w;. wPعASَ< +< J![Xr. u : +]0 ]U+F8 ] VFF F=}"^~u~r^^^F FڋȋVF؊ NFڋȋVFVF u˃~ tN-^]U$WVv~FFFGFu=%tmƆ2FF F'GF=-uFGFF=0uF0GFF=*u^FFGF*F^ tF FGFۋF=.uOGF=*u^FFGF*F^ tF FGFFF=luGFFF=hu GFFiFF FFv2PvvFFFP  @ *# xX\/:Option Start-->P<--Option End. CPCDOS 4.1OSCOMSPECcommand %8ld %c%c%c%c %s %4d. <%-8.8s%s> %s:%c %4d. %c:%-8.8s%s %6dK %s:%c No files. ?BCPMV Type EXIT to return to nswp. Timestamps are %s.OnOff NSWEEP 3 - %s Copr. Dave Rand, 1986 Version 1.019 04/21/87 Current directory is %s Drive %c:%-8.8s.%3.3s %dK in %d files. %dK free. Tagged files = %6dK (%6dK). Copy to (filespec)? Delete %s? directoryfile R/O. Delete? .... Erase tagge  I don't know how to deal with this version (%d)  Can't create directory "%s".  Can't erase . or ..!  Can't chdir to "%s"!  Warning: Too many files in directory (> %d files).  Sorry - too many directories (> %d)  File "%s" NOT COPIED  File p)acked with %d bits, I can only handle %d Bug - bad state 7Analyzing...?sPATH/.com.exe< Cd or untagged files (T/U)? Do you wish to be prompted (Y/N/A)? Deleting --> %c:%-8.8s.%3.3s Find what? New drive/mask? Copy to drive? %s --> %c:%-8.8s.%3.3s to %sSQ/USQCopying Squeeze or Unsqueeze? Original filename (%s) Press ^S to pause, ^X to abort, L for line, any key to go to next screen New name? Which drive? %dK remaining on drive %c: Tag what? UntTRet %sagging --> %c: %-8.8s.%3.3s Attributes to set (A,H,S,R or None)? Setting --> %c: %-8.8s.%3.3s to 3K||0123456789abcdef  00000 @@@ @@@@@@@   @@@@@@  @@@@ }`Too many args. b~b H EY %s ARC New directory name? Number to jump to (or +rel) ? Directory for %s Name ;Length Stowage SF Size now Date Time CRC == == == ==== == === ====== ====  ==== == ==== == Total %6ld %8ld %3d%% %8ld %8ld C=%d %s %s:%4d. %c:%-8.8s%s %6dK %s:%c $$$-6Unknown! -- Packed SqueezedcrunchedCrunchedSquashed%-12s %8ld %s %3d%% %8ld %s %04x  #'+ Hles = %6dK (%6dK). Copy to (filespec)? Delete %s? directoryfile R/O. Delete? .... Erase tagged or untagged files (T/U)? Do you wish to be prompted (Y/N/A)? Deleting --> %c:%-8.8s.%3.3s Find what? New drive/mask? Copy to drive? %s --> %c:%-8.8s.%3.3s to %sSQ/USQCopying Squeeze or Unsqueeze? Original filename (%s) Press ^S to pause, ^X to abort, L for line, any key to go to next screen New name? Which drive? %dK remaining on drive %c: Tag what? UntTRe !Y/37 JanFebMarAprMayJunJulAugSepOctNovDec%2d %3s %02d %2d:%02d%c(%s) Scanning...%s%-15s.QQQ(%s)%s%-15s %d%% reduction p  q  E %3d %3dK used for memory buffer.%c:\%s\/%s  %c:%s*.*%c:%s;*.*%c:%s%c:\%s?* --Aborted-- \b*.* Searching for "%s". Press ^S to pause, ^X to abort. %d directories searched, %d files searched, %d files found. Press any key to continue search, ^X t  t %sagging --> %c: %-8.8s.%3.3s Attributes to set (A,H,S,R or None)? Setting --> %c: %-8.8s.%3.3s to %s ARC New directory name? Number to jump to (or +rel) ? Directory for %s Name ;Length Stowage SF Size now Date Time CRC == == == ==== == === ====== ====  ==== == ==== == Total %6ld %8ld [%3d%% %8ld %8ld C=%d %s %s:%4d. %c:%-8.8s%s %6dK %s:%c $$$-6Unknown! -- o abort.Found --> %s%s ..\ Directory contains files. Delete all files? y  J g 2 R j Can't allocate %d bytes.  Can't copy a directory!  Can't erase %s!  Insufficient space left on %c: (%dK)  Can't open file "%s".  Can't create file "%s".  Can't zoom! Too many files in directory.  Sorry - not enough memory  Can't reset attributes.  Invalid drive.  Cannot copy to path "%s". CRC failed  File cannot be renamed! File is not an archive.  Sorry,  Packed SqueezedcrunchedCrunchedSquashed%-12s %8ld %s %3d%% %8ld %s %04x  #'+/37 JanFebMarAprMayJunJulAugSepOctNovDec%2d %3s %02d %2d:%02d%c(%s) Scanning...%s%-15s.QQQ(%s)%s%-15s %d%% reduction p  q  E %3d %3dK used for memory buffer.%c:\%s\/%s  %c:%s*.*%c:%s;*.*%c:%s%c:\%s?* --Aborted-- \b*.* Searching for "%s". Press ^S to pause, ^X to ï!Ҁ ҀҀҀ߀( =  ߀( %s%s ..\ Directory contains files. Delete all files? y  J g 2 R j Can't allocate %d bytes.  Can't copy a directory!  Can't erase %s!  Insufficient space left on %c: (%dK)  Can't open file "%s".  Can't create file "%s".  Can't zoom! Too many files in directory.  Sorry - not enough memory  Can't reset attributes.  Invalid drive.  7 Cannot copy to path "%s". CRC failed  File cannot be renamed! File is not an archive.  Sorry, I don't know how to deal with this version (%d)  Can't create directory "%s".  Can't erase . or ..!  Can't chdir to "%s"!  Warning: Too many files in directory (> %d files).  Sorry - too many directories (> %d)  File "%s" NOT COPIED  File packed with %d bits, I can only handle %d Bug - bad state 7Analyzing...?sPATH/.com.exe  ||0123456789abcdef  00000 @@@ @@@@@@@   @@@@@@  @@@@ }`Too many args. 1b~b vZDE14C.COM[BETA VERSION 1.4C]#   Z3ENV ( =  (!e~ 6C#6O#6M:i_ ͭ<(#:> : (/(ͣ_NͭͭAͭ!*?R0ͭ΀ Հ\= * ~#fo Done$RSNAP, Ver 1.0 Syntax: RSNAP file[.typ] Save RCP to reloadable file$File Exists. Replace? (Y/n) $ $ Z3ENVvK B 8 v* yR #8 iF System Loaded$YSystem Mismatch$v= ! ^#V#~ѷ        Z3ENV=ͷ ͳS?:] (|/(x:m2>!e~ 6C#6O#6M:i_ ͭ<(#:> : (/(ͣ_NͭͭAͭ!*?R0ͭ \= *  ~#fo Done$RSNAP, Ver 1.0 Syntax: RSNAP file[.typ] Save RCP to reloadable file$File Exists. Replace? (Y/n) $ $ Z3ENVvK B 8 v* yR #8 iF System Loaded$YSystem Mismatch$v= ! ^#V#~ѷ        vZDE14C.COM[BETA VERSION 1.4C]# aV 0@ C"9Z"DpІ !!tr9JsIo7D hp0'b D' $"t5@ p0,  L2 BQQn2&9YH HJ H6T  2 ,*MSeh HW4H z>P> zl@#]4 Uo$ k!w@Ŵ<A+gݫp1 BP! =@(?M  2Ȱ8e}F Aze P< %ȗH ;' *شJ å/=ȵ< B34 lJC0` C`,PpS4 Lѡ.AS4t?w"$4a |@J`  F +":vC4< X43@p#Ã4{Y/Cs4y1jp @\r B̀ `ppР:0p N`x 7,ytP4 AD] P`X rXH1( B20)s4T !@<pM c".$@8 @8 A Ow 2$CЄ7,`L%` B n+$!~3K =S:v:GABH2! d[+@$|D)dtP+0c&2R@&Ȑ` ,A( `'px`D  ')X<Ar2'APl\w`܆@K% K[! ĠX `h!)3Z0"8 *vP4ȿlR,2G( @ff3H8 f0fbFh,`D& s V &@ &&G tNP^_]ˎZ &&uL &#0wF=t=u ^_]ːF^_]ːUPF.7FF:F F&9 #N &P &6D &6^&O F F:~*;v+^&G^F&^&.7FF:ϐ^&G*P &P&~ vN^&*䐎N &*]U3PVX &>.wu&.w~tff *ȊFHR &2wNuB &&Oxf B &&7&&G&ΎB &6 &6f *P밎B &&OxB &&7&&G&B &  6 &6PR &2w^]ˀ~u X &.w^]ˎB &&OxFf B &&7&&G& B &6 &6Ff *PR F*&2w^]U PVFPvvFVK.7FF:^& uF&^F&G^]ˋFF~r~.7vF'^&7u^]U PFVFV^F&^F&8t.F^&F t2^ &8uFVFV̉FV^&?uFV]ː+]ːdU0!<s 6+rׁ s3P L!6&z6&vƱH6t6+۴J  MZE^@  k?(R R R R R R R R R R )kb={[R [oR R R  L  &7 | < +KS *:-~_bAv R I k A ' J   P &6D &6R.N &,vKP &6D &6N@ &6&6F@ &&Ox@ &&7&&G&*@ &6&6* NR F&92wt 'PvvIP@ &6&6pB &6 &6p^]UPVF.7F:+T &LJF|+VoP%F|++PPF|^]UPF & .7FF:vvb^F&^F&GF & L &0wF &9 |+J &> s&L &0w]ːH &]ːUP  Q 0 * o=*vg[:wR Qu!## $$$I' FPvvDFVFF~r~.7vF'^&?uێF & F&]ːUPVF*3vF%* F^ u&㍇:^]ː3PL &0wJ & H &F & V &N &X &.wR &2wUPWV@ &&Ox@ &&?&&G&*@ &6&6J &*V &+ tuZ &&J & tu ӎZ &&V +& }h@ &&Ox@ &&?&&G&*@ &6&6΀tuZ & & JU3PFN=}BP+PiPuPzP F^&w&7FN u+P]U`PVPvvV@ && uvvP^]ˎ@ &&Ox@ &&7&&G&*@ &6&6=vuD@ &&Ox@ &&7&&G&*@ &6&6=t vv\vvPFFV?@ &6&6^& tF^&?Ar &?Zw& &&F@ &&Ox@ &&7&&G&밍FPPPFP ؎&6 &6PR &2w^]ˀ~u X &.w^]ˎB &&OxFf B &&7&&G& B &6 &6Ff *PR F*&2w^]U PVFPvvFVK.7FF:^& uF&^F&G^]ˋFF~r~.7vF'^&7u^]U PFVFV^F&^F&8t.F^&F t2^ &8uFVFV̉FV^&?uFV]ː+]ːdU0!<s 6+rׁ s3P L!6&z6&vƱH6t6+۴JGPFPVB && u FP}@ &&Ox@ &&7&&G&@ &6&6F@ &&Ox@ &&7&&G&@ &6&6F@ &&Ox@ &&7&&G&@ &6&6F@ &&Ox@ &&&W&@ &6&6~ r~/v vviFoD F&F=u6~th@ &&Oy@ &&7&&G&*~uAF & H &J & L &0wFoN &(lH &>t4v u!6f  +33666 6 6P ظ6xP Px0!5!%!2 .&6,4 360 s68 ڻ60 &,63&=t, t 3utHD!r €t@Ky< < < < U  < @ vU@ @ h@ @ _ t ~uFt>!CFL!2 0 %!>t %!;s EtYZ+r ;$rRQˡ @u3kRQ. &(8P &6D &6R.N &,vKP &6D &6N@ &6&6F@ &&Ox@ &&7&&G&*@ &6&6* NR F&92wt 'PvvIP@ &6&6pB &6 &6p^]UPVF.7F:+T &LJF|+VoP%F|++PPF|^]UPF & .7FF:vvb^F&^F&GF & L &0wF &9 |+J &> s&L &0w]ːH &]ːUPt)&,33uGG>ыѿ< t< t< to tkGN< t< t< t\ tX<"t$<\tB3A<\t<"tӋѨuN< t+ t'<"t<\tB3A<\t<"tۋѨu>G׀+ģ  6?6W6N u63< t< t< u u6?6WתN< t< t< tk tg<"t&<\t3A<\t<"t\Ѱ\s"Fװ"ON< t. t*<"t<\t3A<\t<"t\Ѱ\s"3G t.&U*u *+!OVN!Is3]UV^&GFPvvDFVFF~r~.7vF'^&?uێF & F&]ːUPVF*3vF%* F^ u&㍇:^]ː3PL &0wJ & H &F & V &N &X &.wR &2wUPWV@ &&Ox@ &&?&&G&*@ &6&6J &*V &+ tuZ &&J & tu ӎZ &&V +& }h@ &&Ox@ &&?&&G&*@ &6&6΀tuZ & &  u&G @tSF-h ㋇\ Fvv`^&G P" |h~teVPFP6 FFV^&\tXPFPN Pvvvl FP  t^&G ^]ːUFV tvPv v vv. +]ːU VtF^F FVvFvvvvvvn FvvVF^]ːUVF-h X F^&G t&G @t^&G t&O &O ^'^&G u'-h X u v:^&G&W&&s V &@ &&G tNP^_]ˎZ &&uL &#0wF=t=u ^_]ːF^_]ːUPF.7FF:F F&9 #N &P &6D &6^&O F F:~*;v+^&G^F&^&.7FF:ϐ^&G*P &P&~ vN^&*䐎N &*]U3PVX &>.wu&.w~tff *ȊFHR &2wNuB &&Oxf B &&7&&G&ΎB &6 &6f *P밎B &&OxB &&7&&G&B & qW^w^&w&w&G P^&G t=u&t &G &GQ&O&7&&G&*^]UWV^&G F-h X F&G t&G @t^&O p&G u&O &g +&Gv&G t-h X u|~tu~ t~u[~ uTv  uQf~tu~ u ^h ^h &G&W&&W^G v v^&G u-h X tj^&7&+w&G&W@&&W~EH&G ~VR&wvF^ tP+PPSB^&_F&PFaF ^&G u-h X t+OF-h X F^FV&G&W&&WvD&G^&O ^]U~u~tu~ t~t~ t^&G P  uF-h X F^v v^&&G^+&&W&G&WC^&hu& t&hu(& u &G P  tv v]ːUV+^&G $<uY&G u-h X t8^&&+GF ~'P&w&w&G P;Ft ^&O ^&G&W&&W&G^]U P CPvF9vtF*^_]UP >\tZP ]˸ V3B22UtP ^UU3ɋI6, t&>tEuE@$W _ϋ.3I<;Ct ~F uNN]]UVWVh ;t@t 3_^]UWvn t3I@!_]UV+h j l n \ & & FVR^P^&w&7$FV tvP^&w&7CF^&w&7 u5F^&& Gt+&7&&G&<"uF&w&7 t˸+ɡl 4 FV  FVr t   A~%t +| x z v p  ^ &0uIF  0>^ &?+u |  (&? u>| u p ^ &?-u F ^ &PJ  uv v PF V > }  أ ^ &?.u. F v PYF V > }   ^ &=Ft==Nt@=ht+=luz >z u ^ &?LuF ^ &?uz z z &F=Et =Gt=Xux F F-c=v.l & & M p P4v x > u  n FV^vtA uv^^NPo#FV t FV& &  F&l n FV^v^T&&WFt uv^^^+&G&"l &G&Wl n vvZ#l n FV u+^]ːUWVF~ ^v &=/t&=:tO;u;t&=\u^~ F &?:u FV@;u;V tvvrf^ &F<\tz u+z F9 t' F> t  .  }+  P>:P~t"> tF- }+  . P m'+PY"v=>z t F V N F V @FVR<PBBBLPLLLL6djLL2LLLL,> t> unr &G u^aF 4F^&F t<%u+F Pv v LFVF V ^ &F t> ur &G t ]ːUWV~ t >z t>z u &&WFV +> t &FF &FV d ta~vv^$@Po#FV tvvVvvvPv$ RP6 +RPY uG+PP:FV t~ uF Ft^&G&Wl n RP+^_]UPo#FV uU^FV&&W+&G&Gl n th FV&G&WFVl n FVh j +]UF Fu{^&w&7^&w&74$ }4^&&WFV^&&W^&&W^FV&&W^&G&WFV u^&G&WFV^&G&WFV tn]U^&G t5&G t.&w&wZ# )>p tF FtF+  FV> u1~}+~ u^F&-FV؃ډFVFF~ F^vPvv$ > t1vv^$ +ȉN~&0GI ~FNx ^v^& t u|  t ~u+P^_]UWV~t  FV >z t &&WFV  &FF^ >z tF Fu ~u F^FVFV+96 t ^F&?tF;~F^F&?u> +> uW_Vvv> tWB^y^&g +&&W&G&W&G]UF-h X F^Po#^&G&W t&O ^&G ^&O FV@&G&W^&G^&G&W&&W&G]U V^ &=at'=rt =wt++F"F uCFF ^ &?t7 t3&=+t=bt=tuƩu@АƩt+Đ뽉NPVvv!F }i^F&G f-h X F*^^&G^G^+&&W&G&WF&G Ì^]ːUVf~tu~ u FhF ~u5~ u.Fh _]ːU  FV~gt~Gu*F> u ~t > u 6x 6 v6 6 vv^ & ~t>p u6 6 ^ & >p t> u6 6 ^ &   |  tvv^ &  t+P3]ːUV> u=r &OxF&7&&G&*6t Sv@u  ^]ːUWV> uWv ~P6t 6r 6 @u N ~r &OxԠ &?&&G&*ԃ> uF ^_]UWVv > u^"6t 6r ^&P@u FN t%r &Ox^&r &?&FN N FuF uV!F $ FV=!rؓFuF tVC!rF@u?VC!2%tF t ;r >! NË]2ܡ#3ɨuYZ$;s+RQ3U^ t&O]UVWF=s>" u%t" utu v%_^]˻9^v^C^3PPOQPZ'tA‡$ & ;* v* tڣ^3HHG G  Ì؎N3ێ&  ҌU׋v~ 3+t]U~3I]UWV~&G&*ʃ> uF  ^_]U V  FV+FF> 0u9 t9v t9 u 6 vv^$F++v> u"^&?-u> 0uF&PZN> 0t ~> t~tFi> tFs> u)Vg~t ~u<> t ~uCvvv> t V!^]ː>| t+ P˸0P> u>x tXxPUWVF^ &?*u &7 F a^ &?-uFF +^ &F<0|@<9<96 u <0u 0&=9&ȃ0G&=0}މ~ F F^&7F 2v ߋN t2Ì^_]UVWUW~W^$@Po#[ u u RP6 _]U VWv Ў3~ tȰCv3Ҭ%tȰ"CtD_^]ˋNFV~ W t u y -ۃڋ3 t0<9v' uODD;rX_^]U^ tO]UVW ?u)su3$@$  D6 N؎ _^]AtswtBH;st4Dt L+HLƌڌ;t&& &, =t%tH;stD!V ^_]ːUW F^N~G&=t&8 u~F ~F+_]ːUhF^^&G u%+&G&G &G&W&&W&G Ì̃F ; u; u+]ːU^;r >!rƇU^;r *F tH~ t3ɋѸB!rKF uFV y(6VFѸB!FV y NVB!؋VN F B!rUU^;r g3N `uYN V?!s Gt@VW^ ' < u&:t<u&G+_^t< t@tD! u V?!rҰ ,FV?!r t~ t#G t&, t،;t&" 7뼋w3j;t $@@^t MtNN뙌،;t&& G3QEt+IAA&;( vurr #+ uu3YRQtWDw+JUXYZSP3RRPPZ'Z[t UVW~ u8zVFHuSr'H6Ht;t DFV:^s0s uڃ۱H!r钉T63_^]ˋN9Lt u?r9ӎ;u9ts&;u ١+؎J!r ;ut1JѸB!~ t VV됀~ uU^;r U t B3ɋ!rt|^F V3FFWVfN ^ uQ^F#=vKܺ=(s+ԋN < t ;t&o ;u F^_^cP3PSQ+^@!rF tY[Xs $^@t^ ^?u F+Ff^_^[N uOV@!s u@t &?uU׋~3u~ +؎FFtI]U׋v ؎3~ǨtI]UVWN F3҃ u ~U^;}| @t3]UVA!Czr59ts%Pرً+ËشJ!Xr$Ht.zzËr3]sPX]s]2ˢ u#>r <"s < r<v טÊUVhF^+^&G tS@tFF  9Fv؋^]ːU2~F Fu@u uFV$ Ǵ=!s=u t1%=u >!FD!€tN@F@tF tt 3ɴ@!>!VC!gFuuѸB!ٍV?! t~uًѸB!3ɴ@!3ɋѸB!n T  3      -  !  ; Patches to NULU 1.51 (to 1.52) for faster CRC generation, and to ; allow CCITCRC use (the last two bytes of the file are not included ; in its internal CRC self-check, allowing them to be patched to the ; CCITCRC checksum, causing CCITCRC to report 0). Load time cut from ; 4.9 secs to 2.3 secs on 2.5 Mhz Kaypro 4 of which 1.2 is load time. ; C.B. Falconer, 680 Hartford Tpk, Hamden Conn. 06517 (203) 281-1438 ; ; Suggest changing the Y command so that it reports the library ; directory (if open) in a compact form, unless a drive spec is used, ; when it reports the drive directory. Analogous to the D command. ; ; The only video characteristic I have is FLASHING. Useless with ; the present setup. If used to report attribute bits, the headers ; flash. Suggest two more strings, and define them by system usage ; rather than terminal characteristics. Seems to be 1: Sweep header ; 2: attribute bits 3: directory headers, with 2 and 3 merged now. ; Attribute bits could be reported by setting the file character to ; lower case (a blank becomes a `). Could be conditioned by a ; user settable patch, i.e. 0..5 = none, video case 1, 2, 3, lowcase. ; org 010ch; Revised sign-on, ISO std. date db '2 (86/2/23) ' ; org 0149h; Revised self-check range and CRC lxi b,03a7fh ds 3; unchanged orig. call lxi d,0da91h; revised crc checksum for file ; org 01a60h ; crc for (bc) bytes from (hl) up, initialized to (de) ; leaves de pointing past last byte. Result in hl, bc=0 ; a,f,b,c,d,e,h,l   .crcrg: xchg crcrg1: mov a,c ! ora b ! rz; zero range, exit push d; CRC push/pop d moved to here ldax d ! call .crc pop d inx d ! dcx b jmp crcrg1 ; org 03a11h ; This algorithm needs no final zeroes injected, but returns ; with the bytes interchanged from the slow routine. .fincrc: push psw mov a,h ! mov h,l ! mov l,a pop psw ret ; org 03b14h; for NULU 1.51 to 1.52 patch ; This crc routine updates the checkword in (bc) using the byte ; passed in (a). The checkwords computed !tMS Run-Time Library - Copyright (c) 1988, Microsoft CorpUsage : uncr ... 25 Dec 19862.32UNCRunch/C Version %s (%s) rb***** can't open %s ***** %s is not a crunched file %s --> %s .wb***** can't create %s ***** this version of UNCR cannot proces are suitable for IBM ; floppy disk communications. The two byte checkword is the word ; produced by the generating polynomial x**16 + x**12 + x**5 + 1. ; The checksum should be initialized to 0ffffh (i.e. 0ffffh is ; passed in bc when the checksum sequence is started) to detect ; variations in length of initial zero strings. The new checksum ; is returned in (bc). ; a,f,b,c--> FOR NULU patch, hl for bc, de modified. .crc: ;push d; changes to alter i/o reg bc/hl. bc in PASCLIB xra l; c/l mov d8rray will bear no responsibility for losses resulting from the use or inability to use this program. NULU.COM may not be distributed without NULU.DOC, nor may the copyright messages be removed from either file nor caused to not be displayed. ACKNOWLEDGEMENTS This program would not have been possible were it not for the elegant work of Gary P. Novosielski and those others working with the LU library structure. Additionally, I would like to thank the people who have suppo',a rrc ! rrc ! rrc ! rrc ani 0fh ! xra d ! mov e,a rrc ! rrc ! rrc mov d,a ani 1fh ! xra h ! mov l,a; b/h, c/l mov a,d ! ani 0e0h xra e ! mov h,a; b/h mov a,d rrc ani 0f0h ! xra l ! mov l,a; c/l ; pop d; <-- REMOVED TO FIT IN NULU space. ret ; end 4e#@rted the development of NULU in a variety of ways, from suggestions to financial contributions. All comments (good, bad and disastrous) are welcome. Special thanks to Keith W. Antcliff of Mead, Washington for his development of NULUTERM.ASM, a patcher overlay, and to Ron Fowler of Nightowl Software for his gracious permission to include MLOAD23.COM in the NULU release library. Honors for Courage go to Dennis Recla, Norm Gregory, and Jim Switz for having the guts to "risk everything" by testing NULU and offering suggestions and pointing out bugs. INTRODUCTION NULU is a complete replacement for LU and LSWEEP. Weighing in at 15k, it includes all features of both programs and then some. It features: Two operation modes with a full menu for each LU style CRC support and verification Viewing and printing of member files and disk files, unsqueezing when necessary Extraction of member files with an option to unsqueeze where appropriate  Bigger libraries, up to 800 members or more depending on available memory Automatic member sorting, all members kept sorted at all times Faster reorganization Enhanced error handling Swapped disk handling Automatic self-verification Access to deleted members Access to read/only libraries Wildcard library processing Optional read/only patch CP/M Plus support General compatibility with LU and NSWEEP syntax Numerous user patches DIFFERENCES BETWEEN NULU  NULU.DOC Documentation for NULU.COM as of 11/01/85 Version 1.5 NULU.COM and NULU.DOC are both Copyright 1984 and 1985, by Martin Murray, P.O. Box 35972, Dallas, TX 75235. Both may be used freely for non-commercial purposes, but neither may be sold, included in a package for sale, or used as an incentive to buy, by any person, organization or corporation without prior arrangement with the copyright holder, Martin Murray. Furthermore, Martin Mu ?1.5 AND NULU 1.1 NULU 1.5 incorporates several significant changes, not least of which are the bug fixes. Version 1.1 had several bugs, including occasional improper extraction of large files, and clobbering of bytes in directory entry member names. All known bugs have been addressed as of the new release. (Actually, the extraction "bug" was due to one of the bugs in CP/M that effect unusual combinations of direct and sequential file access. If you watch carefully, you will see Brary directory. After that, it may be accessed for viewing, printing, or execution, or may be extracted from the library to assume the status of a stand-alone file once again. The reasons for doing this are many. For one, under CP/M each file occupies a minimum amount of disk space. This amount can range from 1k to 16k, depending on the system. Even though a file may only be 1 byte in length, it will still occupy the minimum required amount; the rest of the space is wasoDOS re-allocate used blocks of the disk, in descending order, no less!) If you attempt to make changes to a library file that is logically read/only, NULU will display the message: Library is READ-ONLY. Modify anyway? (y/n) and will wait for you to say yes or no. If you say no, then the operation you were attempting will be cancelled. If you say yes, you will be able to make changes and when you close the library, the file will be read/only once again. There have been othted. Putting these files in a library minimizes the possible waste to 127 bytes. Each file also occupies a directory entry. On most floppy disk systems, the maximum number of file entries per disk is 64. By including a file in a library the directory space it used to occupy is freed for another file. Additionally, using library files can simplify the process of categorization by subsuming several files of similar types or subjects into one file. However, there are also daner, more visible changes. The disk interface has been expanded so that several commands that used to apply only to library member files, can now also work on disk files. These commands include, -D, -P, -V and a new command, -S, which performs a limited string search. For example, to delete a library member the command is still: -d filespec but you can also delete disk files with: -d du:filespec where the drive/user combination informs NULU that you are talking hgers associated with using libraries. The main one is that if a library file is lost or damaged, all of the member files are lost as well. The solution to this problem can be summed up in one word: BACKUP. NULU probably isn't perfect, and we all know that disk systems aren't, so backup your important libraries, please. I don't want to hear any sad stories. Almost as important as backing up libraries is the use of discretion when deciding what to put into them. Let's face +about disk files instead of library members. (Note that the -Z command has been re-assigned.) This syntax applies to the other commands listed above, as well. Additionally, I have made an effort to bring NULU 1.5 further in line with LU syntax and operation, especially LU310.COM. Therefore, in addition to other changes, the user will find that the -M command for the NULU Command Menu has been changed to -H for Help. NULU To the best of my knowledge, NULU will run o * it, if a file is in a library it is not as easy to get to. If you need to get to a file every 15 minutes, it probably shouldn't be in a library except as a backup measure. AN ASIDE CONCERNING FILESPECS When specifying a filespec, wildcards may be used freely, however, unlike most programs, NULU doesn't insist that a "." separate the filename from the filetype. For example, the filespec "**" means the same thing as "*.*" to NULU. On the other hand, the filespen any system running CP/M 2.x or higher, however it has only been tested by me on the Osborne 1 and the Osborne Executive computers. It is written in 8080 compatible, Z80 assembly language. A complete discussion of the nature and advantages of library files is beyond the scope of my endurance, however a short recap is in order. A library file is a single CP/M file which maintains 1 or more smaller files as its members. Each file is written into the library and recorded in the libr Cc "FRED.TXT" should be typed in just like that. "FREDTXT" would make NULU think that no filetype had been specified. The rule is simple: use a dot any time you like, but it is only strictly necessary when it is needed for clarity. When specifying a drive and/or user area the syntax is very liberal. "A15:**" means the same as "15/A:*.*", as does "1A5:**". The colon is absolutely necessary. If a different user area is desired for the default drive, the drive specifier may be ers to an unambiguous file specification, while the term "filespec" refers to a potentially ambiguous file specification. Filespec parameters enclosed in (parenthesis) indicate references to deleted member files. Three dots ("...") after a parameter indicate infinite repetition. During the execution of most commands which receive an ambiguous filespec as a parameter, entering a ^C at the console will interrupt the current process. COMMANDS -A ADD MEMBERS Syntax: -a fi  omitted, as in "15:**", just as the user area may be omitted as in "A:**". If a drive/user specification is made, but no filespec is indicated, a filespec of ??e.??? is generated. Therefore to indicate the default drive, current user area, and a filespec of ??.???, just type a colon by itself (e.g., ":") ! NULU OPERATION When NULU loads, it automatically verifies its own CRC. This process causes a 2.5 second delay on my 4mhz machine. However, because of lespec[ filespec...] Use this command to add files from disk to the current library. NULU will make a series of passes through the directory, adding files as it goes, until the list of matching files is exhausted. If a matching filename already exists as an active member in the library, its name will be displayed and the file will not be added. In all file addition and replacement operations, if a deleted entry of identical size can be located, that disk spacthe safety that this feature affords, I hope that you will find it to be a reassuring pause. Note that the CRC is not affected by normal user patches. NULU may be invoked with or without a command tail. A command tail can consist of any combination of valid NULU operators up to 128 characters (the limit imposed by the CCP. Once NULU is running, command lines can be as long as 254 characters.) As in LU, all NULU commands are preceded by a dash. This is a copy of the menu for the coe and directory entry will be used rather than allocating new space for the file. This means that it will be necessary to reclaim wasted disk space less often. An LU style CRC will be generated for each file added. -B BRIEF TOGGLE Syntax: -b This toggles the prompting mode. The release version of NULU is setup to print the full name of the current mode for a prompt, as in "-Add members A0:>". If BRIEF is turned on the user will simply see "-A A0:>". NULU may Cmmand mode of operation: -A Add members -B Brief toggle -C Close the library -D Delete members/files -E Extract members -F Filesweep mode -G Get filespec -H Help -K Krunch library -L List members -N Rename members -O Open a library -P Print members/files -Q Unsqueeze members -R Replace members -S String search -T Replace/Add members -U Drive/User change -V View members/files -W Wildcard open -X Exit NULU -Y Disk directo  be permanently patched to default to BRIEF ON or OFF. See NULU MODIFICATION. -C CLOSE THE LIBRARY Syntax: -c This command closes the current library, writing its directory to disk if any changes have been made to the directory. The library directory is NEVER written except when the library is closed, so be sure to do it. If you forget to do so and remove the disk, NULU will prompt you for the disk again and will attempt to recover. Some othery -< Redirect input -> Redirect output Commands may be strung together, each terminated by a space. They are processed left to right. All characters are converted to upper case. The default drive/user area are displayed along with the name of the current command mode each time the console is prompted for input. The commands will be explained in order of their appearance above. All items in [square brackets] indicate optional parameters. The word "filename" ref Sr operations that cause the current library to be closed are: -k, -o, -w, -x -D DELETE MEMBERS/FILES Syntax: -d filespec[ filespec (filespec)...] Syntax: -d du:filespec[ du:filespec...] If the drive/user specification is included, the DELETE function will apply to files on disk, otherwise it applies to library member files. Member files matching the given filespec will be given deleted status in the library directory, except when the filespec is enclosed 6:*asm=*bak" would extract all member files to the current drive/user, renaming them, and would ignore the "6:" specification. During extraction, a CRC is generated for each file. After the destination file has been closed, the CRC so generated is compared to the CRC for that library member that was stored in the library directory, if that value was non-zero. If the results are not identical, an error message will be displayed before the next member file or fil in parenthesis. In that case matching deleted members will be given active status. That is, they will be undeleted. If the filename of a matching deleted member file already exists as an active member, the filename will be displayed and the file will not be undeleted. If the member file being deleted has a size of zero sectors, its entry will be entirely REMOVED from the library directory, thereby creating a new, free entry. -E EXTRACT MEMBERS Syntax: -e /espec will be processed. The erroneous destination file will not be deleted from disk by NULU as a result of this error. -F FILESWEEP MODE Syntax: -f This command places NULU in its second operational mode: the filesweep mode. This allows the user to move through the directory of active member files as if they were individual files being examined by a program like NSWEEP. The filesweep mode's command list is as follows: A Next member B Prevfilespec[=newfilespec filespec du:filespec...] Use this command to extract active member files. If extraction to the current drive/user area is desired, no further syntax is necessary. To indicate another drive, however, a destination drive/user area may be included in the source filespec. Example: -e a5:** would extract all active members to drive A, user area 5. Files may be renamed as well as redirected by indicating a filespec along with, or in place ious member C Close library D Delete member E Extract member F Find member L Log new drive/user M Mass operations O Open new library P Print member Q Unsqueeze member R Rename member T Tag member U Untag member V View member W Wildcard rename X Exit NULU Y Disk directory Z NULU command mode ? Help! Because of the extreme similarity between these commands and the commands of NULU's command mode, only a short description of each of, a drive user specification following an equals sign. Examples: 1. -e *asm=*bak 2. -e *asm=5:*txt 3. -e fred.txt=sam.txt jane.inf=c8:girls.dbf The examples would produce the following results: 1. Extract all files with a type of .ASM to the default drive/user renaming them with the filetype of .BAK. 2. Extract all files of type .ASM to user area 5 of the default drive, renaming each with the .TXT filetype. 3. Extract the member file FRED.TXT to the d  command will be given. A -- Advance to next member (spacebar, cr, or lf will produce the same result) B -- Back up to previous member C -- Close the current library D -- Delete current member file E -- Extract current member file (prompt allows redirection) F -- Find first member matching input filespec L -- Change drive/user defaults (returns file pointer to the top of the file list and untags all member files) M -- Mass operations on all tagged filesHefault drive/user under the name of SAM.TXT, and extract the member file JANE.INF to user area 8 of drive C: with the filename GIRLS.DBF. The two redirection rules to remember are: 1) if a destination filespec is entered it cannot be any less ambiguous than the source filespec, i.e., "*asm=*bak" is valid while "**=*bak" is not valid; and 2) any filespec following an equals sign takes precedence over any drive/user specification in the source filespec, i.e., "-e 6 (allows Deletion, Extraction, Printing, Unsqueezing, or Viewing) O -- Open new library (closes the current library) P -- Dumps the current member file to LST: (unsqueezes if needed) Q -- Extract current member file, unsqueezing if necessary (prompt allows redirection) R -- Rename current member file T -- Tag current member U -- Untag current member V -- View current member file (unsqueezes if needed) W -- Wildcard rename (prompts for oldname & newname)tive member files would be extracted to user area 10 of drive B:. Finally, NULU would search user area 0 of drive A: for a filespec called -5.005 until found. Then NULU would terminate. Notice here that the ASM.LBR didn't have to be closed before the search for the final filespec because no change had been made to the library directory. If a change had been made, after the new filespec had been loaded, NULU would have demanded the disk with AS6 X -- Exit NULU (closes all files) Y -- Get disk directory for default drive/user (returns file pointer to the top of the file list and untags all member files) Z -- Return to NULU command mode (current library remains open) ? -- Print the filesweep mode menu If, when the filesweep mode is entered, or after a library has been closed, there is not a library currently open, the filesweep mode will prompt with: No library open. and will accept only tM.LBR back so it could update the directory. Therefore the GET operation would be effectively negated. -H HELP Syntax: -h Print the command mode menu. -K KRUNCH LIBRARY Syntax: -k[ he current NCF file beginning at line number 1. Forw and NULU would wait for the user to enter a line of text NOT EXCEEDING the length of the prompt(!). If the user entered and RETURN by itself or a null line, the prompt would reappear on the next line. If the user entered a valid line, the first word on that line (delimited by a space, tab, etc.) would be passed to the OPEN LIBRARY mode and the balance of the line would be ignored. If, on the other hand, the user entered an ESCAPE followed by a RETURN (1bh, 0dh) the4ard and backward references are allowed. A reference to line number 0 will be ignored. Any references to non- existent line numbers will cause the current NCF file to terminate, thereby returning to the next higher NCF level, or to the command mode if this is the highest NCF level. Note that if you add or delete any lines in an NCF file, that will completely foul up any jump commands in that file. That's a bug, not a feature. -Z TOGGLE CONSOLE Syntax: -z commands after the prompt would be executed and control would be passed to line number 65535, almost surely a non-existent line, thereby terminating the current NCF file. Some commands which normally accept parameters cannot receive parameters from this mode because they are decoded differently. These include: -:, -;, -l, -n, -x, -y, -> -: WAIT FOR RETURN Syntax: -: -failure mode This command will force NULU to wait for the RETURN (0dh) character to b  This command toggles all output to the console device. That is, if this command is issued once, all console output is shut down, with the exception of the special commands listed below. Issue it again, and console output will be re-enabled. -' PRINT TEXT Syntax: -' "text to print" Use this command to print text to the console, no matter what the condition of the console output toggle. Text to be printed must be enclosed in quotes. The opening quote  e input to the console device. If a RETURN is received, the balance of the command line will be ignored. If a ^C is entered, the remaining commands on the line will be executed. -; COMMENT Syntax: -; comment about this kludge of a JCL This command will cause NULU to ignore all text appearing after the command on the same physical command line.  --?- -> REDIRECT OUTPUT Syntax: -> filename Syntax: -> MUST be present, but the closing quote is only necessary to delimit any following commands. -" PROMPT AND CHAIN TO PREVIOUS MODE Syntax: -mode to chain to -" "prompt" -failure mode My method of syntax diagramming falls utterly short of describing this command, I know. Let's take it one step at a time. This command allows the NULU programmer to specify the mode to which he wishes to pass a parameter, prompt the user for that parameter, and to also specify actions to be   With the first form of this command, NULU output will be sent to the filename indicated. The default filetype of ".NOF" will be used if no filetype is specified. If the file already exists, it will be deleted. All special characters that the user may have patched into NULU (see below, NULU MODIFICATION) will be sent to the file as well, with the exception of the EOF character, 26 (1ah). The only output not echoed to the file will be output caused by viewing or printiDn disk of an extraction command became full. Solution: If the error occurred during KRUNCHing, NULU should have recovered by itself, reopening the old library. If it did not recover, then you removed the original disk before the KRUNCH was complete or a serious read error occurred. If the error occurs during file addition to the library, operation should not be impaired, but no files that required additional diang a member file. Even if the console has been turned off by an NCF file, all console output will continue to be sent to this file. The filename passed must be unambiguous. Under the second form of this command, the current output file, if any will be closed. When NULU is caused to terminate, the current output file is closed along with the current library, if any. ERROR HANDLING NULU should never crash to CP/M anymore. When NULU signs on, it redirects/sk space can be added to the library until some disk space is cleared. Note that deleted entries can still be overwritten by incoming files as long as the file sizes match. The incoming file that caused the error will be recorded in the library directory as a deleted entry. If the error occurs as a result of attempting to replace a member, the original library member should be unharmed and left as an active mu the warm boot BIOS vector, thereby preventing NULU termination due to BDOS errors. Under CP/M Plus, it goes even further, shutting down the console error messages, handling them internally. Therefore, if NULU attempts to perform some operation on a drive where no disk is mounted, one could reasonably expect (on a 2.2 system) for the BIOS to issue some error message. The user then hits RETURN or ^C and NULU should recover. It may think that the disk was full, when theember. If the error occurs during file extraction or unsqueezing the destination file is deleted because it is an incomplete file. Extraction can continue as before. ERROR 4: reading unwritten data See ERROR 1. This is the same except that BDOS mentioned that an entire extent was missing. ERROR 5: can't make file Problem: An attempt was made to create a file on a disk with no free directory entries. ERROR 1.re really wasn't one there at all, but it should still take the proper course of action needed to recover. ERROR MESSAGES Most NULU error messages are of the form: ERROR XX: Explanation where "XX" is some number from 0 to 255 and "Explanation" is a clue as to the nature of the error. Each error message is listed below, along with an explanation. Suggestions about ways to handle the error are given where appropriate. ERROR 1: reading unwritten data Problem: A sec 0: media changed Problem: You pulled the diskette out in the middle of a crucial operation. Solution: Don't do that. It is probably an unrecoverable error. ERROR 11: disk i/o error Problem: You are probably running under CP/M Plus if you get this message. It means that the operating system detected a physical problem with your disk and the read or write failed. Solution: Try it again. I have recovered from this type of tor required to gain access to a file is indicated by CP/M to be unwritten. Solution: The library directory or perhaps the library itself has become trashed at some point. Deleting the entry and KRUNCHing will probably render it harmless, but the safest course to take is to obtain a fresh copy of the library. ERROR 2: disk full Problem: The library disk became full during file addition or KRUNCHing or the destinatio {E error by persistence. ERROR 12: disk r/o Problem: Your operating system probably discovered that you have a write-protect tab on your diskette. Solution: Remove it. ERROR 14: bad drive Problem: An invalid drive for your system was chosen (see below, NULU MODIFICATION) or a letter higher than "P" was indicated. Solution: Choose another drive or re-patch NULU. ERROR 17: password error Problem: You tried to access a file for whichmaller system. ERROR 78: user cancel Problem: No problem. NULU is simply letting the user know why an operation has been cancelled. Most operations which work on ambiguous filespecs may be interrupted by entering a ^C during their operation. (You may have to hold the key down a while.) The KRUNCH operation may be so interrupted as well. ERROR 83: bad syntax Problem: Improper syntax was used to attempt some or a password was required. NULU does not support access to such files. ERROR 18: file exists Problem: You attempted to KRUNCH a library from one user area into a different one in which a file with the same name already resided. ERROR 19: ambiguity error Problem: This means that you entered an ambiguous filespec where an unambiguous filename was required, or that the destination filespec in an extraction or unsquee[peration. ERROR 85: file not found Problem: The filespec indicated for some operation could not be located. ERROR 86: incompatible cp/m version Problem: An attempt was made to run NULU on a system with a CP/M version number of less than 2.0. ERROR 100: bad library directory Problem: The file specified could not be opened as a library file. Solution: The directory could be bad, but most likely the file simply isn't a librarPze command was less ambiguous than the source filespec. See -E EXTRACT MEMBERS for complete details. ERROR 70: file table full Problem: You attempted to open one more NCF file than your nesting patch supported. See NULU MODIFICATION. ERROR 74: checksum error Problem: During the unsqueezing of a file, the internal checksum generated did not match the explicit checksum stated in the file's squeeze decoding table.y. Check it out with some disk editor like SPZ or EDFILE. ERROR 107: library directory CRC error Problem: The CRC that was calculated and stored for the directory the last time the library was modified does not match the directory CRC calculated as the library is opened this time. Solution: With most libraries, this error will be valid. In that case, the only remedy is to obtain a new copy of the library. However, there are some Solution: Get a new copy of the member file. Yours has been trashed somehow. ERROR 75: CRC error Problem: When each member file is added to a library, a CRC is created for it and stored in the library directory. If, upon extraction or unsqueezing, the CRC generated at THAT time does not match the original CRC in the directory, that means that the sectors wherein that library entry resides have become corrupted. T  libraries that were created with LU, and then modified but never KRUNCHED by NULU 1.0. In that case, it is likely that the old, original CRC stored in the library directory would still be there, even though it is way out of date. My suggestion is, when you first get NULU 1.5, go through all of your .LBR files, if you were using NULU 1.0 previously, and KRUNCH them. This way you will know later on ~here is an outside chance that the CRC entry in the library directory has become damaged instead, however that condition would probably also generate ERROR 107. ERROR 77: not enough memory Problem: An attempt was made to open a library with a directory too large to be accounted for with available memory. Solution: Open the library on a computer with a larger TPA and reorganize it so it can be handled by the s that the CRCs stored in each library should all be accurate. ERROR 116: squeeze decode table error Problem: A file has a squeeze decoding table, but at some point the table is trashed or perhaps is missing. Solution: None really; get a new copy of the file. If your Data Buffer Size has fallen below 9 sectors, then the reason might be that the entire decode table could not be read into memory. ERROR XX: undefined Problem: Unknown.disk drives in your system. If you have drives A and B, set this value to 2. It will prevent you from accessing an invalid drive. 0016bh 10h Number of contiguous user areas that NULU will be allowed to access. Under normal CP/M 2.2, Turbo-Dos or a ZCPR system, I understand that this number can be as high as 20h. For CP/M Plus or most systems that use time/date stamping t Solution: Write down all information presented on the terminal. The number following the word ERROR is especially important. Get the information to me. Mail it or call and I will try to help. The most serious, non-recoverable error is: NULU CRC error which can occur when NULU 1.5 is first loaded. This means that NULU failed to match its own CRC. You need to get a fresh copy. Or perhaps you have tried some patch not described below...? his number should not exceed 10h. 0019ch 0005h This is the address of the BDOS vector. All operating system calls go through this address. If you have some weird, non-standard CP/M implementation you can patch this to try to make NULU work with it. 0021ch 00h Set to a non-zero value to make NULU READ/ONLY. No operators will be executed that could change the library or disk direct NULU MODIFICATION Patches are listed in the order in which they appear in NULU.COM. Each patch is explained and the default values are listed immediately next to the patch address. All addresses are absolute hexadecimal. Patch Default Explanation 00163h 50h Number of characters each full video line can contain. Not necessarily the same as the number you can see. 00164h 50h Number of characters visible oories in any way. 0021dh 00h LU.COM was set up to exit automatically if a command tail was used when LU was invoked. With the release version of NULU, it takes the -X command to exit. Set this byte to a 01h to get it to act like LU in this respect. That is, it will automatically exit after executing the passed command tail, if one was present. 0021eh 01h Set ton a line at any one time. 00167h 07h This byte indicates the number of files that NULU can have open at any one time. The base number is 4 and should never fall below that. The value of 3 has been added to it to allow 3 level nesting of NCF files. If the NCF value is increased or decreased, identical changes should be made to this byte. (See Patch at 00220h.) 00168h 0010  a 00h to start NULU with BRIEF mode ON (long messages not printed). 0021fh 01h Set to zero to prevent users from being able to ESC,RET from the PROMPT AND CHAIN TO PREVIOUS MODE prompts in NCF files. (Be sure to also change the values at 00167h and 00168h.) 00220h 03h This byte indicates the nesting level allowed for NCF files. I have no idea what the upper limit Jh This obscure word controls the number of relocatable tasks that can be controlled by the NULU memory management routines. Because each file is a relocatable task, the same modifications for the previous byte apply here. The base value of this word is 000dh and should never fall below that point. (See Patch at 00220h.) 0016ah 10h Number of contiguously numbered ~ is, but watch that Data Buffer Size! 00221h '-Y *LBR -O',0 Starting here are 39 bytes in which any valid NULU operators may be stored. This line will be automatically executed when NULU is loaded, even before any other parameters passed on the command line. This might be used to create a version of NULU that, after loading, sets the drive/user defaults to B0:, pr.+M SOLUTIONS, so please, no checks made out to them. I am now working for INOVA, a company founded specifically to support 8-bit computers running CP/M. Look for new and exciting retail products from that source. (The preceeding has been an official plug.) 2v@ints the menu, scans the drive for library files, then switches to the open library mode. That command line would look like this: -U B: -H -Y *LBR -O Notice that all characters in this line MUST be UPPER CASE. The entire line MUST be terminated by a null byte. Only 39 bytes are available for text...not a byte more. The 40th byte is for the null terminator.  0026fh 3ch This is the number of lines that NULU will print on each page during member file printing. Change this value in accordance with the line printer patch below. Set it to zero to have NULU ignore line counts altogether. Starting at 0024ch are 5 data areas used to define strings needed to control the console attributes. Each string is preceded by an identification byte and a byte indicating its active length. Then 5 bytes are available for the actual definition. Therefore a total of 7 bytes is consumed for each video control. The attributes are, in order: DIM or REVERSE VIDEO ON (DIM is preferred) DIM or REVERSE VIDEO OFF UNDERLINING ON UNDERLINING OFF CLEAR SCREEN Each control becomes active as soon as it is patched in. Likewise, there is one string defined for the LST: device that will be issued immediately before printing a file. It begins at 00271h *F NULU 1.51 (01/09/86) Copyright (C) 1984, 1985 by Martin Murray!:72O<`Ͱ4 âPPF>2>G3:8=0ډm͔Ï!"1!9"1!9"*e&###:fO *<"8*hDM) "<22m332r2(3 ͔"8=}0 -͔m͔">,_Tm͔*"!"ͯ+ -Y *LBR -OW<  WORK-LBR.$$$ NCF NOF LBR 2)ibrary lL membersNULU/s oryDiskUn and has the same format as the strings above. FINAL NOTES Please report any bugs or problems to Martin Murray, P.O. Box 35972, Dallas, Tx 75235 or call (214) 351-6117, EVENINGS AND WEEKENDS ONLY. Please specify the version of NULU with which you are working. As always, donations will be gratefully accepted. It took a lot of work to produce NULU and if you enjoy it and it benefits you, don't hesitate to show your appreciation with a check! Note: I no longer work for SYSTE e9Dfile erroreleteress RETURN CRCreadunwritten datalRe runchKBrief entriesAbandonConsole put to be ing enameRWildcard specsqueezeFilesweep Extract drive/user to: ...ReplacedirectAddtoggleClose themodeGetHelpListOpen aPrintStrsearch/AddDrive/User changeViewopenExit inputoutputREADYNextPreviousCloseFindLog newMass operationsOpen newPrintTagUntagViewrExit command modeHh : D{  Ͷ4 name: g "6kg  Ͷ4  ͱ Ͷ4  ;{ ͫ*c >*"22s Ͷ4 Tagged = >k͆Ë ͫ ʔ O<> e  ͡4Old:  =<Oͼ:"6͡4New: K N g o7!"6!"U >!͖564O6LOXYZ?y?` a ͽ Menu>52x 2$>2d !~> 2x ^No. ;^No open. Jͧ4ö4+j; !"2!#";<ڑgk<>ʨ#N#F<* g##~"i #k<*>::*6"*<"6*Ù6!"6B*U>"#:6#"Uelp! FJKMNSUVdktdisk fullcan't make filemedia changeddisk i/odisk r/ofile r/obad drivepassword existsambiguityfile table fullchecksumno memoryuser cancelsyntaxfile not foundincompatible cp/m versionbad decode table͔4!͓TYPE -H FOR HELP  * &j;e9*<"RN8 :8= ^>V l21!N#W>ͼ: 6!!"6>2yʈ:2 ÈABORTEDï2*6>!  2j%y$>2j%G ͪ4ð4 ͔>ë5:<2Clos͑Ͷ4\$:Ͷ,m>"*6Ϳ2?2=2E!\>,8) C% >ʁ>͗+',,\3!=33ͭ.́.<:>ON)2E `iÎ%%(&>a(ž; 3;!#"> ͇5Ͷ4--> found;Ð!"͡4Now searching: O9e9TʬBO: 2y2 6':;BCFHKLXY>:y6"JZ:e:m m4 CmlF+͹2:.GG31Insert disk containx͗͡4 and pC]O9e9!W>"6"U>¾!J~6>¬͡4-:: 6ABCDEFGHKLNOPQRSTUVWXY<>?O!>\>g222ê4 Ͷ4 changes?h4͡4͑2<~-#~GͶxN*U6ml! ͚͡4inreceived from :.͗>ON)ʨ:e2,2e*4m ã:͗+mTo! ͡4outsent to F+:.͗2O9ͪ4>KN) v2~5mͧ4ö4,}*6\, ͡4Press ^C to stopF+t9ȗ,:͗+X*h,1/Xͤ9.,w͡4Deleting: :.G3́.>P͛13,3*6Ϳ *6) ʣ úC% N8 ͡4Undeleting%" ͡4 %.&*%*%*/&.C%"%"% Ͷ4 can't beͥ7͘7͓͉͆9z>:4Ͷ4:>>a*6:eG:͗+G&H6[7 !!̀6"U*62>͗+ʦt9ʑfʑ!+"z}l C5!"z!"zͣ:,2e'd>ͫ5O*6> ڷw# ²,2͋!33ͭ.!W>ͭ.> 6;76 #!U=͘7>O2 !mT5}"z:e͗+*:2i~5͒ERROR ͧ4>v>Ç5>&H%'2e9͒closed. 2~5͡4CONOUT file ö4!=:,ͭ.\[-og2G'3OG3;<1> y$`i""N8% |& undeleted--name existsU&7÷~(#>):< +6>2:2> 92 2 g Tj !=2 º ͪ4>2  Ͷ4 |  2:\2:=Ī4:0ͪ4221em:À>?Ͷ!͚92<2ɗ2B *<;<= *6Ϳ: >:͟7 ͊7:= !<*6>͛ *6" *U" !"U:0!" >O2 :͗+Jo7:͗+y$y;`i#"" N8 e<% s#r#6 #%:B=N7s#r#å oN8 7!"* ͪ4! y;;< " g Z#:N87g,!:,2=ͭ.!=͘7oG3F+͛1>5!ͭ. will be ked to >W4>5ͪ42ʬ!"%"r"%!oG3)2"+!"I"&&!="t9ʕ+"*&&}O<Ͷ4 -Continue?h4ʕ!}+"+͡4 Copying: !#"U&#!:"$ͼ:͓.% s#r###"ͨ&+>+>G3ͺ+`}*%"%*j"jʦ>MʦM•*,DM!"r:,G3>ͱ*ʕ*,",I8 :,G3'2*!O9Ͷ4 abortedreopenold>K2 *6!"6k"6m7*j}*,DM*r:,G3>ͱ*#|<") 2[ {<": ͪ4!Ͷ4.>͇5!|&͏.."6!R I6>  7>k2X Ͷ4 : 4O6ABCDEFLMOPQRTUVWXYZ? ] y͆!Ú9* # * +} * Õ g Ͷ4?h4 *) { %͡4Deleting: .&:>O >> >U&Ͷ4    Ͷ4ind what? s  O >*w#w#wC% %}BK;<, * Ͷ4Log: g "6g >*s͡4, , Print, , or View (DEPQV) Enter one: 42 O6EQDPV y͆ ͡4Destination? \[-  ͭ.>::#6} >D ͼ |&."6 iʕ\:=G3͛1:,G3g,!>::#>.682͑Ͷ4 ked.m7÷!"jͪ4eT) +!<+*6\[-K !52>-2$>2!>?2ͧ4͔4Ͷ4 >5ö4l2 :.G32(321F+m2>͗+G>g,*<:,ͭ.o1Can't find ͑͡4Replace it and pCʑ1F+: 6KOXm͡4NO LIBRARY OPENmlF+! ͥ 2͑͘222 Ͷ4 open. (Buffer size: *,*,O<><Ͷ4 sectors)múU :>U !=> 6͓Ͱ4 not found. ͡4 %*/&͏.\͋Ͷ4 to ͨ&>7a(: ͗ '2RyN!=;6̓͗>&ʑa(S‘'ʑ:͗++*&&}O<>K \[-BK!=. '\͹2!=>ͭ.>K<:N)+ *!O9:<'4&*,>ͱ* 'C%͡4Deleting...%ʼ%͡4 .&y =U& >U&*%+"E >2< *,"; !; w3A ͡4Active entries: *%Ͷ4, Deleted: *%Ͷ4, Free: *&Ͷ4, Total: *%Ͷ4.ɗ2<>ON)!"&"&"&}#",J*ʁ!~’! #~ ’! #|<A<’!{<{<"T!'))Ͳ&y! To make it, enter the number of to allow.!"͡4 Pnow to abort making the. Allow how many: ~~<~T#͓É!> ͖5ʑ52}>N ;<ڪ;<ҼDM!=o͇M Too many.2!<"*6>=:6#͌:"o5f5> 4o5f5͡4 ͧ42ʧ4O> >͇5#ͪ4>Ćy͆͆9͓#:2 :2ͪ4͓2>@mm͌:2|e<͘7o9*<@>ͫ5u*6̀66~ž:‹um*U6 :͗+mͪ4l*6) *<;<>>̀$K >Oà>Rà:>O mg,͘"%"a!!j;"!e9<:*<>N):.2,>;;k *, ~͊& yi!:l,͙!>M'ʕ!ʕ!'>dO9'C%t9%ʼx5̔4̪4%(&c'å!2A",2#<=,"+t9q#+"H$2j%<$><$,q#,=;=m$#"!I->.:#m$#"!!"W$#ͪ4C%q"|<"W$V$q">Oʠ"Rʠ".&Ͷ4 already exists--not added.!:A"R "d$Ͷ4 not in library--not replaced!=3"d$Ͷ4: Cannot add an 8 megabyte file!!"#V$>U&z$%"%"#*#O<"#e#>2͡4 is READ-ONLY. Modify anyway?h4g22 <2>S ͡4now O:2^>NÆͼ4FF:2: 6'":;BHIJLOUYZ<>ʋ>Í>?2 g,:,*<ͭ.> 6¨ > 6'":;ABCDEFGHJKLNOPQRSTUVWXYZ<>?*6Ϳ:22*6) ͢! >2:22?CmU:2*U>U=͘76,}"*6\, !I-͘7 w<2yOyO}o|g|g}!oi a_{zı9{z33:l,>͗+*,*,w*,O<K'H",ė+G3Z͔z   :=<#Ͷ4No room for: d$<[#*&}>fG#Ͷ4No directory space for: #*H$"#*%O<#e#V$>U&!2# !>2j%U2$V$ʘ#Ͷ4Replacing: ç#Ͷ4Adding: "*$U&!=͘7;d$ q#p###"$4$=)2*,DM!"6$>+2$:.G3ͺ+:,G3$($+"<*#>ͱ**6$"6$($#!>U&q#pz$%%;G:cx2> 2<5&o:2͡4ERROR Ͷ4: }!Z:!]W!Oͥ7͓ê4unnamed!W>{ʍ)ʍʍʍw# p6y~<#O!ͥ7͓Õ͉ÕJ*: 6VPS<+4T`UC} O P)Pk#E N d] = W ) / E Z  ,}\,͔4\:.́.!=<:>ON)3!DMc'',,LUS"`i#>(<"))"Ͳ&<:>PN)>2< <",;<͞:!  :`i"!rs#rͶ'!ͥ MSe<>K͛ --new name existsï$<2<͏.Ͷ4 to ! ͼ:͏.ï$A%7 <2%:.\[-2.e¤%!#"%!"%ò%!#"%!"%l%s#r#l%"%DM"%y>U!}+"%!^#V#"%!O<*,DM"&|&"/&<~ k2<~!&n&<##d&^#Vr+swÊ&+> <*,!&ʙ&<##Ï&4Ÿ!Aj; >9~ʼ&ʾ7#&y&~&&# &<<*+*B+w*D++}K'*,#"9 1'>M   w212l"n͡4Library: +͡4Name Index Size KiloBytes CRC2j%>!C%"<%% y¸͋>5͡4DIRECTORY  >5xͪ4(&>P5͂>P5͂>P5:B=N7͂>P5>2<*&&=I6>0 7͓x"<*%?͋*%X͋p͋>5͡4Active sectors  ͡4Unused  ͡4Total  <2j%>5G ͈Ó=> 2 72$:l,2՗C%<N8=[-2\BK.F+͡4Extracting...>͗+t9%<7 ,g,͛1'USɗ%'>%'>%'<<;'<4'K'g,1ȗ2e,K,*,7<*,DMF/g,*,͸,`i",>a('Gyʀ'Ͷ4---> !=͓x5:o'>5͡4^C=abort,^X=next file,L=next line,=next page>5>2(ͪ4x' (a('_(x5'4<͡4press RETURN...4>N͉ t9<>=2(x53(:o2(446 L3(!H(Ú9R(W(<\(R(>(>(>N2((2(+>ͺ:l,2(!("/"(!"(*<"(*, "(>(U/"(®(t(*,O<",*tڨ(!/"(>2(!;<~#"(:l,2)>͗+J**, "(*+1W+}11z 1`i:B=-1)=(1<0ͼ<͔=1@=::8=1ȗ+w+w<͔ʼe1>Z3<͔ʼZ3<"͔ʼOZ3<!͔ʼOZ3S͔<Z3*< 2ͼ<"<q*B+"(>͗+(S>*,DM8)/)**5)!)#",*,;<>RS*, ~2)")`i>(<> <"):l,͗+*,:gG~})#p)>F:g<͗+<:*g98PYO<گ)><> <³)>ڳ)ʳ)>MDMO<)BKe<*,s#r`i",!:)=$:)[-2,G3:<>,.K,9,,*,N8g,!$9:l,͗+>2e,*,DM*,!",J*<F*{><<2*]*"*",`i",*,}DM*,*,O<><>M;ҙ*2!3͋1,,*,DM*,O<",Ҿ*"*`i",BK*,*,g,*2!3{1*g,͸,:<,*<*,Ô#͔! |<!!s#r#6>332(3:I3< ͔2I3<ͼ<2I3_ ÔG:8=0yu3xn3u3|y| d4:|<"A4{<")4{<"04{<"3|Ÿ3}=!I<Ҵ3DM)ң3`i÷34+}¾3#"3# 43!O<33 43!O<33*34þ3|g}o#4:g4A4!4;4;4J4 :f4-7J4͋9YͶ4No>N>5>2ͪ4ö4ͪ4ͼ4 o9ö4͓͓43;>́:42S=.:C5~>5~͆>5#4> 4|,O:g,>Bɷ!+ "b,!++ ",v<"h,8 ", H2!͞:R1<#22!͞:j1<2#!"-*-#"-< -[n#~55#N#65 ͆S5:2:2::2O:<͆9É5*5++"5ͫ5##"5qܨ<#6+ ͔^#r{ͬ<=I6Ó՗2F6͌:A62ͼ<"k6:<O͜;}Q6{0:j6!w#"k66~ͮ9#v6+Ͷ6"6W>~ʧ6ʥ6#ͫ6ʎ6Ͷ6y~6 #ͫ6¶6Z:;7::~ʰ-͟7 # 6> 2<5ʙ-|™-}*kҙ-2.6ʯ-@O:j".+q# -*?-.- ڴ-3;-ô-xʴ- y-xʴ--w#.x >?-> H99>?:.>2<+:#>>;7#Pd.12Ͱ4File exists-delete it?h4>P͛12U2KU.2w.)2US>M<2!=ͭ.ɗÕ.> !=ͭ.>::#6ͼ 2<2@w#i&I6;76:#:>.:# .ͺ:<~  ;[SAS<2$7e<͘7=/O>9:3;287̈́<>U~3;G3;#<(<)=U7"f7!N#F# ͌:{7 bk ͑7ü:͘7 ͌:ò:͌:ü:.:ü:|< xʼ7:#zª7<:`:88*Mm8*8*hOTDM#"8*8 w#s#r8e<"<#9ʼs#rÐ828"88*8;<><#|<8#98"8v<>8O<8"ÿ8ê8!}!#~#8~ 9o> 2-/#~?/?/>2-/~=/#PY:>< #~?A/6/`i>(t×/ʹ/=2/>////>==2/:/2/O! "/O>/70O>=2/yO! 0##^#Vz/y2/z&0{/*/O<>70>J<2@2T0@ͳ0Ͷ4Drive : Total *I=T]*E=#zW{_u0+j0:B=ʆ0)=~0Ͷ4k, Used O<Ͷ4k, Free Ͷ4k<21:8=00*<*<22=_.͔D^#V2<0`Z30><<͔*E=# ;<#8++~<2$9~>269bk",9<>=2$9!##",9>v<<<<:*g9< O<*g9O<`9"g9<>M!"g9>Æ>́:>N:> Æͼ<͙<~w#_N::ͼ<_ 9 9 9:9=ü9 9 9>9><29ÔW:d 9999 y:2:͙<6#;;O~*:<#:<#2:yͬ<*՗2;>)ܔ;yOxG҈;ܔ;=v;:;><2;?y";}|;3333x;՗yOxG{_zWñ;z;}o|g!";é;*;<`i+have the date of 01/09/86. ; ; More than special thanks are due to Howard Goldstein for this fix. He ; found the problem. He tested the fix. He waded through all my self- ; modifying code. His family will appreciate any help in paying the ; psychiatrist's bills. ; ; ORG 010CH DB '1' ; ORG 0110H DB '01/09/86' ; ORG 0150H DW 9832H ; ORG 32B9H RET ; ORG 32BCH RET ; END 3Z@ ; ; FIX FOR NULU VERSION 1.5 ; A Message from Martin Murray ; with acknowledgements to ; Howard Goldstein ; 01/09/86 ; ; A fix has been found for NULU v1.5. Like all good fixes, however, it ; causes its own share of problems and can only stand as a temporary fix ; until I can get version 1.6 out. The problem was BDOS function 37, ; which NULU15 uses before writing to a drive in case it has been ; changed. Under certain circumstances, BDOS loses its mind when this ; f wcters etc. PATCH2 EQU 00167H ; Number of Open Files etc. PATCH3 EQU 0019CH ; BDOS Vector PATCH4 EQU 0021CH ; Some Toggles and Storage Area PATCH5 EQU 0024CH ; Terminal Control Area PATCH6 EQU 0026FH ; Number of Lines for LST PATCH7 EQU 00271H ; Printer Initialization Area ; ; ORG PATCH1 DB 80 ; Number of Characters each line can contain DB 80 ; Number of Visible Characters/Line ; ORG PATCH2 DB 04H+NL ; Number of Open Files Allowed DW 0CH+NL ; Number of Relocatable Tasks DB 16 ; Number of Contiguously numbered drives DB 32 ; Number of Contiguous User Areas ; ORG PATCH3 DW 5 ; BDOS vector (See Doc) ; ORG PATCH4 DB NO ; NULU Read/Only DB NO ; Exit like LU on command tail DB YES ; BRIEF mode OFF DB YES ; Allow ESC,RET from PROMPT etc. DB NL ; Nesting Level for NCF files ; ; ; The following 39 bytes can be used to store any valid NULU operators. ; See NULU.DOC for details ; DB '-O',0 DB  0,0 DB  0,0  DB 0,0 DB 0 ; Terminator...Do Not Change ; ; ; The following routines are for a TeleVideo 950 terminal. Change to ; suit your terminal. Use This Format: ; ; ID byte,Number of Bytes,byte,byte,byte,byte,byte - 7 bytes total ; Do Not Change The ID Byte ; ORG PATCH5 DB 1,2,27,41,0,0,0 ; Background Mode ON DB 2,2,27,40,0,0,0 ; Background Mode OFF DB 3,3,27,71,56,0,0 ; Underline ON DB 4,3,27,71,48,0,0 ; Underline OFF DB 6,1,26,0 ; Clear Screen ; ORG PATCa; NULUTERM.ASM 11/01/85 ; ; For NULU.COM Version 1.5 ; ; The NULU.DOC contains the information to patch NULU.COM using DDT and ; the save command. An easier way is to use this routine and then use ; MLOADxx.COM. Set the various items as desired and assemble with ASM ; or MAC to obtain a .HEX file. Then use MLOAD as follows: ; ; MLOAD NEWFILE.COM=OLDFILE.COM,NULUTERM.HEX ; ; Keith W. Antcliff ; P.O. Box 906 ; Mead, WA 99021 ; Northwest GodBout/CompuPro RCP/M (509) 624-6799 ; S.M.U.G. (509) 6 jH6 DB 60 ; Number of lines/page for LST ; 0 to supress page formatting ; ; ; Number of Bytes,byte,byte,byte,byte,byte,byte - 6 bytes total ; ORG PATCH7 DB 0,%0 ; Initialize Printer ; ; END Xz 24-7321 ; ;#--- ; ; 11/01/85 Revised for Version 1.5 - Martin Murray ; 01/25/85 Revised for Version 1.1 - Keith Antcliff ; 12/02/84 Added EQU's for Patch ORG's - Keith Antcliff ; ;#--- ; ; See NULU.DOC for further information on the following values. ; NO EQU 0 YES EQU NOT NO ; NL EQU 03 ; Nesting Level for NCF files PATCH1 EQU 00163H ; Number of Chara _,s about 2k smaller than LAP. Error checking is minimal. I followed Bob's scheme of disabling interrupts, loading the image, calling the IOP initialization routine at IOPBASE+9, and enabling interrupts. If that doesn't work for you, I would like to hear about it. Note that SNAP is not a package relocator. It just plugs a package setup back into memory. The type3 version runs at 8000h and so does its output file. Usage: SNAP SYS <- Save current packages to file SYS.COM %1 LDR OTHER.ENV,OTHER.RCP,OTHER.NDR,OTHER.FCP  3SNAP OTHER <- Save this version to OTHER.COM  SYS + <- Reload all original packages at once.  OTHER Z <- Run the other configuration. SNAP particularly speeds up the system cold start. %--- SNAPRCP, Version 1.1 29 May 1989 SNAPRCP saves an image of the RCP segment to an executable COM file. The output file will reload theProgram: SNAP, Version 1.1 Author:  Rob Friefeld Purpose: @Save image of Z-System packages into a reloadable file. Syntax: SNAP file[.typ] o Version 1.1 Update: - A patch byte at 10Dh (800Dh for CIM files) may be set to 00 to cause SNAP to erase an existing file without warning. Any character on the command line at "o" reverses the sense of the default setting. h As distributed, SNAP will ask whether or not to erase an existing file. - The loader does more e RCP as long as the system running at the time has an RCP of the same or larger size at the same address. Usage: SNAPRCP RCP/SYS Save current RCP to file RCP/SYS.COM LDR CALC.RCP Load some other RCP SNAPRCP RCP/CALC Save this one  RCP/SYS Original RCP is back. The advantage of using SNAPRCP is that the RCP loads very quickly. Unless you use a huge RCP, it is handy to have several packages to load - e.g. a file oriented package (CP PROT ERA REN TYPE LIST ...lrror checking. In addition to making sure the ENV descriptor is at the same address as when the image file was made, it adds up the total memory allotted to the RCP, FCP, IOP, and NDR packages to make sure there is enough room to overwrite them with the stored image. For this check to mean much, the RCP,FCP,IOP and NDR must be contiguous in memory, as is normally the case. The PATH size is checked separately. Finally, if a Z34 ENV is loaded, the addresses of the CCP, DOS, BIOS are compared fi^), a system oriented package (P POKE REG WHL Q MOVM FILL FIND ...), etc. -- Rob Friefeld . There are many other checks which could be made. They are left as an exercise for the fearful. Version 1.0: SNAP was written after I decided I liked Bob Andersson's LAP a lot. My minor objections to it were: 1) no source code, 2) too big, 3) verbose. SNAP saves an image of the ENV, RCP, FCP, IOP, NDR, PATH, and QUIET flag with a small loader to the file named on the command line. That is, rather than installing itself, it writes another program to reload the packages. The output file i ld de,image+[cim-load] ; Buffer for core image ld bc,env_off ; ENV offset call getseg ; Save the segment ld bc,rcp_off ; RCP call getseg ld bc,iop_off ; IOP call getseg ld bc,fcp_off ; FCP call getseg ld bc,ndr_off ; NDR call getseg1 ; Get segment address and size jr z,getpth ; No NDR getndr: ld bc,18 ; 18 byte entries ldir dec a jr nz,getndr ldi ; NDR size = (Z3NDIRS*18)+1 getpth: ld bc,pth_off ; PATH call getseg1 jr z,getwhl ; No path add a ; # 2 byte en-; Program: SNAP ; Version: 1.1 ; Description: Save an image of the Z-system packages in a reloadable file. ; Syntax: SNAP file[.typ] o ; Author: Rob Friefeld ; Date: 28 May 1989 ; Derivation: LAP by Bob Andersson (the idea, not the code) ; Assembly: SLR assembler ;SNAP captures an image of the ENV,TCAP,IOP,RCP,FCP,NDR, WHEEL and PATH ;then writes the image, with a loader, to the file specified on the command ;line. When the output file is run, it puts the images back where they came ;from antries * 2 inc a ; Path size = (EXPATHS*2)+1 ld c,a ld b,0 ldir getwhl: ld bc,whl_off ; WHL call getseg1 ldi ei ; Done capturing ld (imagetop),de ; Save top of buffer pointer ; ld b,128 ; Zero any remainder of last image record ; xor a ;zloop: ld (de),a ; inc de ; djnz zloop ; ; SET UP THE OUTPUT FILE ; ld a,(fcb1+1) ; Was it specified? cp ' ' jp z,help ; No cp '/' jp z,help ld a,(fcb2+1) ; Save command line option character ld (cl_opt),a ld hl,fcd calls the IOP initialization, if one is present. The overhead for ;the loader is 2 records. ;Version 1.1 - ;Existing output files will be erased without warning if the patch byte at ;entry + 0DH is set to 00. A command line option character after the ;filename reverses the sense of the default setting. ; ;More extensive error checking in loader. ; PROGRAM DEFINITIONS majver equ '1' minver equ '1' y equ -1 n equ 0 .accept 'Type 3 program to load at 8000h? (Y/N) ',hiload if hilb1+9 ; Check .TYP ld a,(hl) cp ' ' jr nz,find_file ; Specified ld (hl),'C' ; Make default .COM type inc hl ld (hl),'O' inc hl ld (hl),'M' find_file: ld a,(fcb1+13) ; Log in output file user # ld e,a ld c,sguserf call bdos ld c,srchff ; Look for file call bdosfcb inc a jr z,make_file ; Not there ; File exists ; Check whether or not to ask user what to do ; If no query, erase without warning ld a,(cl_opt) ; Check command line for option char cp ' ' ; Anyoad entry equ 8000h else entry equ 100h endif ; SYSTEM DEFINITIONS bdos equ 05h fcb1 equ 5ch fcb2 equ 6ch rdconf equ 1 wrconf equ 2 prbuff equ 9 openf equ 15 closef equ 16 srchff equ 17 erasef equ 19 writef equ 21 makef equ 22 setdmaf equ 26 sguserf equ 32 bs equ 8 lf equ 0ah cr equ 0dh ; PACKAGE DATA OFFSETS IN ENV rcp_off equ 0ch ;RCP iop_off equ 0fh ;IOP fcp_off equ 12h ;FCP env_off equ 1bh ;ENV pth_off equ 09h ;PATH ndr_off equ 15h ;NDR whl_off equ thing but ' ' is OK ld a,(opt_flag) ; Get the default option jr z,query ; Nothing there, use default cpl ; Flip default option query: or a jr z,era_file ; Z = skip query ld de,existmsg ; File exists. Erase Y/n ? ld c,prbuff call bdos ld c,rdconf call bdos and 5fh cp 'N' ret z ; Abort era_file: ld c,erasef call bdosfcb make_file: ld c,makef ; Make the file call bdosfcb ; ; WRITE THE OUTPUT FILE ; ld de,image ; Start of saved image (loader code) wrtloopsw 29h ;WHL ty4_off equ 8 ;TY4 ENV BYTE (80H) ccp_off equ 3fh ;CCP dos_off equ 42h ;BDOS bio_off equ 45h ;BIOS ;'==! ; ; S N A P C O D E ; ;'== org entry jp start db 'Z3ENV' db 3 z3eadr: dw 0fe00h dw entry opt_flag: db 0FFH ; Ask to erase existing file? 0 = NO, FF = YES ; ; TAKE A SNAPSHOT OF MEMORY ; start: di : push de ; DMA address ld c,setdmaf call bdos ld c,writef ; Write a record call bdosfcb pop de ; Inc DMA to next ld hl,128 add hl,de ex de,hl ld hl,(imagetop) ; Stored end of image xor a sbc hl,de jr nc,wrtloop ; Not past end yet ld c,closef call bdosfcb ld de,exitmsg ld c,prbuff jp bdos ; Exit program ; ; SUBROUTINES ; bdosfcb: ld de,fcb1 jp bdos ; Fetch a package segment from memory ; DE is destination getseg: call getseg1 ; Return HL -> CCP page sub (iy+ccp_off+1) jr nz,loaderr ld a,(ix+dos_off+1) ; DOS page sub (iy+dos_off+1) jr nz,loaderr ld a,(ix+bio_off+1) ; BIOS page sub (iy+bio_off+1) jr nz,loaderr load2: ld a,(iy+pth_off+2) ; Now check path size sub (ix+pth_off+2) ; Current size - image size jr c,loaderr ; No go ; ld ix,cim ; Image ENV call add_sizes ; Return package space in HL push hl ld ix,(lenvadr) ; Memory ENV call add_sizes pop de xor a sbc hl,de ; Memory block - image block jr  segment, A = size ret z ; Zero size segment getseg01: ld bc,128 ; Move A records ldir dec a jr nz,getseg01 ret getseg1: ld ix,(z3eadr) ; ENV address add ix,bc ; Package info ld l,(ix) ; Package address to HL ld h,(ix+1) ld a,(ix+2) ; Package size to A or a ret ; Print help message help: ld de,helpmsg ld c,prbuff call bdos ld a,(opt_flag) ; 0 = no query or a ret nz ; Already said ON ld de,sayoff ; Report default option flag ld c,prbuff jp bdos ; nc,putpkg ; OK, load it up loaderr: ld de,lderrmsg jp ldprt ; Load the packages into memory putpkg: di ld hl,cim ; ENV image ld bc,env_off call putseg ld bc,rcp_off ; RCP call putseg ld bc,iop_off ; IOP call putseg ld bc,fcp_off ; FCP call putseg putndr: ld bc,ndr_off ; NDR call putseg1 jr z,putpth ; No NDR putndr1: ld bc,18 ; 18 byte entries ldir dec a jr nz,putndr1 ldi ; NDR SIZE = (Z3NDIRS*18)+1 putpth: ld bc,pth_off ; PATH call putseg1  ; MESSAGES ; exitmsg: db ' Done$' helpmsg: db 'SNAP, Ver ',majver,'.',minver,cr,lf db ' Syntax: SNAP file[.typ] o',cr,lf db 'Option o - Reverse default erase query (ON)$' sayoff: db bs,bs,'FF)$' existmsg: db 'File Exists. Replace? (Y/n) $' crlf: db cr,lf,'$' ; Data cl_opt: ds 1 ; Command line option char imagetop: ds 2 ; Pointer to end of image file image equ $ ; Start of image file ;'== or a ; # 2 bytes entries jr z,putwhl add a ; # 2 byte entries * 2 inc a ; Path size = (EXPATHS*2)+1 ld c,a ld b,0 ldir putwhl: ld bc,whl_off ; WHL call putseg1 ldi call iopinit ; Init the IOP, if any ei ld de,loadmsg ; Tell user we are done ldprt: ld c,prbuff ; Exit with message jp bdos loadmsg: db 'System Loaded$' lderrmsg: db 'System Mismatch$' ; Put a segment ; Enter BC = segment descriptor offset in ENV ; HL -> segment image ; Return ˿.; ; O U T P U T F I L E C O D E ; ;&=== ; This is the loader written to disk with the package segments. ; It runs at the same address as SNAP did -- 100H or 8000H .phase entry load: jp load1 db 'Z3ENV' db 3 lenvadr: dw 0fe00h dw entry load1: ; Load error check ; - Are the image and memory ENV at the same address? ; - Are CCP, DOS, and BIOS addresses the same? (Requires Z34 ENV) ; - Is the p HL -> next segment image putseg: call putseg1 ; Return DE -> segment address ret z ; Zero size segment putseg01: ld bc,128 ; One record ldir dec a ; # records jr nz,putseg01 ret putseg1: ld ix,cim ; Start of ENV image putseg11: add ix,bc ; Segment info ld e,(ix) ; Segment address to DE ld d,(ix+1) ld a,(ix+2) ; Segment size to A or a ret ; Initialize IOP iopinit: ld bc,iop_off call putseg1 ; Pointer to IOP in DE ret z ; No IOP ld hl,9 ; Offset_ackage space in memory large enough for the image to be ; loaded over it? Assume RCP,IOP,FCP,NDR are contiguous in any order. ; - Is path same size? ld bc,env_off ; Make sure ENV is where image expects it call putseg1 ; DE -> ENV address of image ld hl,(lenvadr) ; HL -> current ENV xor a sbc hl,de jr nz,loaderr ; They differ ld ix,cim ; Image ENV ld iy,(lenvadr) ; Memory ENV ld a,(ix+ty4_off) add (iy+ty4_off) jr nc,load2 ; Not a ty4 environment ld a,(ix+ccp_off+1) ; A to INIT vector add hl,de jp (hl) ; Run the routine ; Get total size of contiguous package space in bytes to HL ; Enter IX -> ENV add_sizes: ld a,(ix+rcp_off+2) ; Accumulate record count add a,(ix+iop_off+2) add a,(ix+fcp_off+2) ld l,a ; Convert records in A to bytes in HL ld h,0 ld b,7 ; HL * 128 sla l rl h djnz $-2 ld a,(ix+ndr_off+2) ; NDR entries, 18 bytes each or a ret z ld b,a ld de,18 add hl,de djnz $-1 inc hl ; NDR bytes = entries*18 + 1 ret WL ; ; CORE IMAGE SAVED BY SNAP ; cim: equ $ .dephase END START ; Program: SNAPR ; Version: 1.1 ; Description: Save an image of the Z-system RCP in a reloadable file. ; Syntax: SNAPR file[.typ] ; Author: Rob Friefeld ; Date: 19 Sept 1988 ; Assembly: SLR assembler ;SNAPR captures an image of the ENV and RCP, then writes the image, with a ;loader, to the file specified on the command line. When the output file is ;run, it puts the RCP image back where it came from. The load is aborted if ;the RCP address in the captured ENV differs from the one in memory, a nd if ;the image RCP is too large. ; PROGRAM DEFINITIONS majver equ '1' minver equ '0' y equ -1 n equ 0 .accept 'Type 3 program to load at 8000h? (Y/N) ',hiload if hiload entry equ 8000h ; Image reloader also works at ENTRY else entry equ 100h endif ; SYSTEM DEFINITIONS bdos equ 05h fcb1 equ 5ch fcb2 equ 6ch wrconf equ 2 prbuff equ 9 openf equ 15 closef equ 16 srchff equ 17 erasef equ 19 writef equ 21 makef equ 22 setdmaf equ 26 sguserf equ 32 lf Msc equ 0ah cr equ 0dh ; PACKAGE OFFSETS IN ENV rcp_off equ 0ch ;RCP env_off equ 1bh ;ENV ;'==# ; ; S N A P R C O D E ; ;'== org entry jp start db 'Z3ENV' db 3 z3eadr: dw 0fe00h dw entry opt_flag: db 0FFH ; ; TAKE A SNAPSHOT OF MEMORY ; start: ld de,image+[cim-load] ; Buffer for core image ld bc,env_off ; ENV off of seg at BC ld a,(bc) ; Now in A or a ret ; ; MESSAGES ; exitmsg: db ' Done$' helpmsg: db 'RSNAP, Ver ',majver,'.',minver,cr,lf db ' Syntax: RSNAP file[.typ]',cr,lf db 'Save RCP to reloadable file$' existmsg: db 'File Exists. Replace? (Y/n) $' crlf: db cr,lf,'$' ; Data cl_opt: ds 1 ; Char from command line imagetop: ds 2 ; Pointer to end of last item image: ; Write output file from here ; ==set call getseg1 ; Dereference the segment address dec a ; Don't save TCAP call getseg01 ; Save ENV ld bc,rcp_off ; RCP call getseg ld (imagetop),de ; Save top of buffer pointer ; ; SET UP THE OUTPUT FILE ; ld a,(fcb1+1) ; Was it specified? cp ' ' jr z,help ; No cp '/' jr z,help ld a,(fcb2+1) ; Save possible command line option ld (cl_opt),a ld hl,fcb1+9 ; Check .TYP ld a,(hl) cp ' ' jr nz,find_file ; Specified ld (hl),'C' ; Make default .COM type inc hl==0 ; ; O U T P U T F I L E C O D E ; ;&=== .phase entry load: jp load1 db 'Z3ENV' db 3 lenvadr: dw 0fe00h dw entry ; ; LOADER ; ; First make sure image matches current segment location and size ; load1: ld bc,env_off ; ENV data in Z3ENV call putseg1 ; HL -> ENV addwress from image ld bc,(lenvadr) ; BC -> current ENV xor a sbc hl,bc jr nz,loaderr ; They differ ld bc,rcp_o ld (hl),'O' inc hl ld (hl),'M' find_file: ld a,(fcb1+13) ; Log in destinaton user ld e,a ld c,sguserf call bdos ld c,srchff ; Look for file call bdosfcb inc a jr z,make_file ; Not there ld a,(cl_opt) ; File exists. Ask user what to do? cp ' ' ; Any char will do ld a,(opt_flag) ; Get default option jr z,query ; Use default cpl ; Flip default query: or a jr z,erase_file ; Erase without warning ld de,existmsg ; File exists. Erase Y/n ? call prtmsg ld c,]ff ; Now check the RCP call putseg1 ; HL -> RCP addr from image, A = size push af ex de,hl ld hl,(lenvadr) call putseg11 ; HL -> current RCP addr, A = current size ex af,af' ; Save size pop bc ; B = expected size xor a sbc hl,de ; DE = expected address jr nz,loaderr ; Addresses differ ex af,af' ; Now check size sub b jr c,loaderr ; Current segment size too small ; Load the new RCP ; ld de,cim+80h ; Start of RCP image (ENV is first) ld bc,rcp_off call putseg ld1 call bdos and 5fh cp 'N' ret z ; Exit on NO erase_file: ld c,erasef call bdosfcb make_file: ld c,makef call bdosfcb ; ; WRITE THE OUTPUT FILE ; ld de,image ; Start of saved image wrtloop: push de ; DMA address ld c,setdmaf call bdos ld c,writef ; Write a record call bdosfcb pop de ; Inc DMA to next ld hl,128 add hl,de ex de,hl ld hl,(imagetop) ; Stored end of image xor a sbc hl,de jr nc,wrtloop ; Not past end yet ld c,closef call bdosfcb   de,loadmsg ; Tell user we are done ldprt: ld c,prbuff jp bdos ; Exit program loadmsg: db 'System Loaded$' loaderr: ld de,lderrmsg jr ldprt lderrmsg: db 'System Mismatch$' ; Put a segment ; Enter: BC = offset to segment in ENV, DE -> start of image to load ; Return: DE -> next image to load putseg: call putseg1 ; Pointer in HL ret z ; Zero size segment putseg01: ld bc,128 ; Record length ldir dec a ; Record counter jr nz,putseg01 ret ; Enter with BC = o ld de,exitmsg prtmsg: ld c,prbuff jp bdos ; Exit program help: ld de,helpmsg jr prtmsg ; ; SUBROUTINES ; bdosfcb: ld de,fcb1 jp bdos ; Fetch a segment getseg: call getseg1 ; Set pointers ret z ; Zero size segment getseg01: ld bc,128 ; Move A records ldir dec a jr nz,getseg01 ret getseg1: ld hl,(z3eadr) ; Start of ENV add hl,bc ; Offset to segment ld a,(hl) ; Address of seg to HL inc hl push hl ld h,(hl) ld l,a pop bc inc bc ; Size эffset into ENV for package data ; Return HL -> segment address, A = segment size, no change to DE, BC ; putseg1: ld hl,cim ; Start of ENV image putseg11: push de add hl,bc ; Offset to segment ld e,(hl) ; Address of seg to HL inc hl ld d,(hl) inc hl ld a,(hl) ex de,hl pop de or a ret ; ; CORE IMAGE SAVED BY SNAP ; cim: equ $ .dephase END ?sX*1V**"j"m!xe. ZDENSTAL - ZDE Installer, Version 1.4 Copyright 1989 by Carson Wilson [Opening !] <!l~ \<!Z,\ B *j,˽R !{!Z*[*6: ʕ., ! <!{ # #( K(P ~<$~<&Õ:˿!Z*~P(DK B *Z*PR!Z* .>B *Z*R!j*,pB *Z*fR!j*J-.] Installing: !z,<. ...Press to see Main Menu` . -- - ZDENSTAL M]ENU --- ption configuration ey definitions erminal installation urther patching

rinter installation estore defaults Choose option, ave, uit, or elp: `o OT PKFQRjS?Hó. ZDENSTAL HELP -- press ^C at any time to abort ZDENSTAL ZDENSTAL asks for several types of values: LOGICAL values: Simply enter "Y" or "N" (Yes/No). DECIMAL values: Enter a number from 0-255. HEX (byte) values: 2 digits 0-F (don't omit l Meading zeros). BYTE STRINGS: Fixed length - just enter the required  & number of HEX bytes, 2 digits each.  - Variable length - enter the HEX # of bytes  - at the "(" prompt, up to the "[max]" value  1 shown, then the bytes themselves. CHARACTERS: Type the single character directly. TEXT STRINGS: Enter text, then to end. For all items you can either press immediately to keep the current v alue, or enter a new value instead. (See ZDENSTAL.DOC for further explanation of patches and values.) . RESTORE DEFAULTS. This will restore ZDE to its original distribution state: default options, terminal, printer, proportional spacing; no function keys, no user patches. Proceed? (Y/N) `oY!,6!J-Z!"[,!"f,!-T]6/!,p!h 0_. Done.. USER OPTIONS. Create BAKup files: !,. Default file mode (W/A/N): . Auto mode select filetype 1 1: ͌. Mode: . Auto mode select filetype 2: ͌. Mode: . Auto mode select filetype 3: ͌. Mode: . Auto mode select filetype 4: ͌. Mode: . Default insert on: . Default ruler on: . Default HCR display on: . Enable hyphenation: . Enable proportional formatting: . Left margin col: . Right margin col: . Scroll overlap: . Show system files: . Fixed drives (A-P): ͌. Ring2. switch [07]: . :,̈́. switch [07]: . :,̈́. switch [07]: . :,̈́. switch [07]: i3. Select <0-9> or ap; or to exit: `o Z-20ڿ ҿ2h. New definition: ( edits, saves; use ^P to enter these) ͉iÌZÌ. MACRO KEYS. ()! .ͱ! .ͱ.h bytes free)! . > 02~. |.!i (0((w#i>8+~ \\i!>w7W bell on error: . Enable help menus: . Use alt video in header: . Suppress header by default: . Clock speed in MHz: u. Horizontal & vertical scroll delay: u. Fixed tab display spacing:  . Variable tab columns: . MODIFY DEFAULT CHARACTERS? (Y/N) `oY. Wildcard character: . Code for block marker: u. Print toggles 1-4 ( .): . Print switches 1-4 ( .): 4+5#~i#.. :hW:_! .z(N #= ~(^6#DM! 0BDM){&: . : .s#K! 0T]BBDMN#!. Choose o-repeat or uiet if desired: `oiN(Q +~#8#+) !! .>ݾ8^R8#" .|6#+| !" .! .! Ol@O^ll#($#~Ĵ~+ ~Ĭ+~#G~#i.<>... FURTHER PATCHING. You will need DDT or a similar utility.  . TERMINAL INSTALLATION. Currently "!,<." CHOOSE: dit current or ist terminals: `oE L . TERMINALS: press to select from list: !~#G<`oY(p.(End of list),p.Selected. EDIT TERMINAL.. Terminal ID: !,͌. Viewable columns: . Auto wrap at line end: . Viewable lines: . Extra DELete key: u. Extra arrow keys u/d/r/l: #. Clear to end of line [06]: . Terminal init [07]:Addresses in this version of the program are: User patch area: *l,k-l:n,_+k. Proportional table: *o,k-l:q,_+k. Command tables   Basic: *r,k.  ESC/^K: *t,k.  ^O: *v,k.  ^Q: *x,k. [Closing !] <2h2|22!Z,\ d&: ., ! <:K(.P(!"Z*!,j*p(!f"Z*!J-j*!P"Z*! .\*!Z*~d&.] {X*. *Aborted* . 7 . Terminal deinit [07]: . Alternate video on [06]: . Alternate video off [06]: . Alt video uses high bit: . Output filter limit: u. Cursor position mode (Std/Rev/ANSI/None): . [Non-ANSI] Cursor position sequence: . Delay after cursor positioning: u. Insert line [06]: . Delete line [06]: . Ins/del specific to line 1: . Cursor off [06]: . Cursor on [06]: . PRINTER INSTALLATION.   *File). *Read. *Version . *Write. error*  7 <(ط<%K (.!w#K ( 8w#6 #!HH ~Y Nl%`o (Y(N Olq##~i`o ( iw###ͱͱ%͌8(2j͌8(w#:jw###|Ͳ}òͱ%͌8(w#K 7?؇2KO:A~OlOl0:0 ?o?>2C"$2C"(lPrinter ID: !J-͌. Send LF after CR: . Page length, lines: . Top margin, lines: . Left margin, columns: . Printer initialization [13]: . Printer deinit [07]: . :,̈́. toggle on [07]: . ...and off [07]: . :,̈́. toggle on [07]: . ...and off [07]: . :,̈́. toggle on [07]: . ...and off [07]: . :,̈́. toggle on [07]: . ...and off [07]: . :,̈́ S*ͱ)l*F#(ͱ#%!6K:x(!w(Y#K -ú8ʺ0!wG(4#K : "8wK w#[KH!: #*KH :#(l͌)l.... w%+8(w#K 7?͕2K (0͕_:W2K (͕_:W؇؂؂؃2:~o&ͤ!~ ( Ol#0 ?!FNy(-B0 ##>1B84 ##NFy(>0}0B> 6 #= 'd 8Tg**)(S= ER^Northstar Advtg.P S= LM POsborne 1  T)(S= ER`Osb.Exec./TVI912PTlmS= ER.0.2XOsborne Vixen P T)(S= ERY~F#^#V## ^#V##. :. .? 㯆#Ol#Ol`o` Oliila{_COMZDE>AZ80NWS WCMDNLIBN@@@8 Teletype 6?P     Generic CRT P  POtrona Attache P KU&U S= LM_Qume 102a PT=7 )(S= ER..QTelevideo 910+ P TG4G0S= EROTRS-80 mod 2 P&TP  SY  )TRS-80 model 4P P  N ADDS 25 A P KkkG4G0SY LMPADDS Viewpoint PK0A  G4G0SY ER`Amstrad / Heath P KHEHEpqSY LMx5y5`ANSI standard P A;A;IBondwellS= Wyse 60 Q P T++GpG0S= ER`0`1PZenith ZT10 P Ts1s0S= ER|mH 2 P TINS= ERDEC VT52 P KHJHJ SY QCommodore 128 P T)(S= ER*Epson Geneva PX8PT   S=  +Kaypro II/IV P  S=  kER`Kaypro 2/4/10 P B0C0S= ERC4B4*LearSiegler ADM3P T S= ER*Morrow MDT-20 P T R= ER`Morrow MT-70 PTG1G0S= ER"6"2NEC Starlet 8401P  . If you have tried using the proportional capability of your printer, you probably have noticed that LINES WITH LOTS OF WIDE CHARACTERS IN THEM print out much wider than lines comprised of narrow characters. ZDE 1.4 allows you to compensate for this by counting the width of each character when it formats a paragraph (^B command), and wrapping each line when its width count reaches the equivalent of the current right margin setting. The ^OJ command toggles this feature on and off [the def  0ault may also be installed with ZDENSTAL]. When proportional spacing is active, the legend "PS" appears in ZDE's status line (this is overwritten by "MR" when the margins are released). Proportional spacing occurs only during the ^B reformat command, not during wordwrap, so to format a document proportionally, you must use ^B at the beginning of each paragraph after you key it in. Still, the results are well worth the extra trouble, especially for material that will be reproduced. 3. OZDEPROP.DOC Proportional Spacing with ZDE January 19, 1990 Carson Wilson  1. INTRODUCTION.  12. USING ZDE'S PROPORTIONAL FORMATTING FEATURE  3. INSTALLATION AND CUSTOMIZATION. 1. INTRODUCTION. ZDE version 1.4 incorporates an elemental proportional formatting feature. This option is useful only to those whose printers have proportional spacing capabilities. Proportional formattiPng allows you to format ragged right text properly for proportional output.  INSTALLATION AND CUSTOMIZATION. ZDE comes preconfigured to format text for proportional spacing with Epson's new LQ510 dot matrix printer. Since most printers allocate roughly the same ratios of space to the various characters, there is a good chance you won't need to install ZDE for your printer. This file has been formatted for proportional output by ZDE; try printing it proportionally to see the results. If you should decide to change ZDE's proportional spacing to match your printer Centering and right justification of proportional text are not available. 2. USING ZDE'S PROPORTIONAL FORMATTING FEATURE Proportionally spaced printing gives a more professional look, allowing more characters to be printed on a line without crowding. This is because less space is allocated to narrow characters like "i" and more to wide characters like "M." Most computer printers do NOT allow proportional spacing; only laser printers, some daisy-wheel equipment, and newer dot-matrix 6, you can patch ZDE's offset values for individual characters. The offsets are stored in a sequential ASCII table whose location is given by ZDENSTAL's "F" option. The table consists of positive and negative (2's compliment) byte values, one for each character beginning with " " and going through "~". As distributed, all of the values are either -12, -6, 0, +6, or +12. The negative numbers are expressed as (256+n), where n is the negative number. So for example, -6 is expressed as (256+ 6printers have this ability. Typically, there is a special set of instructions which when sent to the printer, cause it to use proportional spacing rather than monospacing. On some models (the Silver Reed SR550 for example), DIP switches also control this feature. ZDE does not itself perform proportional spaced printing; it simply allows you to format your text for use with a printer that has this capability. You must instruct your printer to space proportionally before sending text to it : P(-6)) or 250 (FA hex). ZDE uses its ASCII table as follows. When reformatting a line, ZDE counts each character as (30+table value)/30 of a column wide. So if the offset is zero, the character is one column wide (30/30 = 1) and ZDE increments the current column by one. If the character's offset is -6, it counts as only (30+(-6)/30) or 24/30 columns wide, and ZDE increments the current column by only 24/30. If the character's offset is +12, it counts as 42/30 columns wide, and so on. Wh Qo get the proper offset value, just subtract the number of characters equal in length to a line of "base" characters from 30. For example, if only 18 capital "M"'s take up the same length as 30 base characters, the offset for "M" is 30-18 or +12. If it takes 42 "i"'s to equal the length of 30 base characters, the offset for "i" is 30-42 or -12. Once you have determined the offsets in 30ths of each character's width from the base length, just plug these values into ZDE's proportional table en a full column is "lost" due to characters with negative offsets, ZDE adds the next character to the line without incrementing the column count. Similarly, when enough "extra" columns are counted to equal a full character, ZDE increments its column count without actually adding another character to the line. To see the effects of this, try reformatting a paragraph or two, first with PS on, then with it off. Lines of wide characters are shortened on screen, while lines of narrow characte . You can use a patcher to alter a few characters. For extensive modification, I have provided the assembly language file ZDEPROP.Z80 which can be assembled to a .HEX file overlay file for ZDE. Before assembling ZDEPROP.HEX, you must edit the file and set the equate TABLE to the current address of ZDE's proportional spacing table as given by ZDENSTAL. Then overlay ZDE with ZDEPROP.HEX using MLOAD, SID, or DDT. - End of ZDEPROP.DOC -  rs are allowed to extend beyond the right margin. When the text is printed proportionally, your printer reverses the process. Lines of wide characters are lengthened and lines of narrow characters are shortened, the net result being proportionally spaced text with an even right margin. If your printer's proportional output is not properly compensated for by ZDE, it is possible to install another offset table within ZDE to suit your needs. The current table's address is given by ZDENSTA  L's "F" option. To find the location of a character's offset, add its ASCII value to ZDE's table address and subtract 32. For example, the ASCII value for "A" is 65, so the location of "A"'s offset is (table address+65-32) or (table address+33). You may adjust a character's offset to any value between -34 and +35 decimal, but keep in mind that offsets if less than -29 may result in lines that _never_ reformat since characters with offsets of -30 or less take up no virtual space or less! To     calculate the proportional ratios used by your printer, it is best to print out a line of thirty of each character in proportional mode and compare the length of each line to the others. Most characters should result in lines of roughly the same length; this is your "base" length, and you should set the offsets of these characters in ZDE to 00. Other lines will probably fall into four or so other lengths; hopefully these lengths will correspond to an even xx/30ths of the "base" length. T !$!; ; File: ZDEPROP.Z80 - Default proportional width table for ZDE 1.4. ; Author: Carson Wilson ; Date: 14 Jan 90 ; Notes: Assembles to a .HEX file which overlays ZDE's native table. ; EQUATES TABLE equ ????h ; Change "????" to the value given by ZDENSTAL ; ..for "proportional table." ; ORG TABLE ; Offset Corresponding character db 0 ; space db -12 ; ! db 0 ; " db 0 ; # db 0 ; $ db 6 ; % db 6 ; & db -12 ; ' db -6 ; ( db -6 ; ) db 0 ; * db 0 ; !!R+ db -12 ; , db 0 ; - db -12 ; . db 0 ; / ; db 0 ; 0 db 0 ; 1 db 0 ; 2 db 0 ; 3 db 0 ; 4 db 0 ; 5 db 0 ; 6 db 0 ; 7 db 0 ; 8 db 0 ; 9 ; db -12 ; : db -12 ; ; db 0 ; < db 0 ; = db 0 ; > db 0 ; ? ; db 6 ; @ db 6 ; A db 6 ; B db 6 ; C db 6 ; D db 6 ; E db 6 ; F db 6 ; G db 6 ; H db -6 ; I db 0 ; J db 6 ; K db 6 ; L db 12 ; M db 6 ; N db 6 ; O db 6 ; P db 6 ; Q db 6 ; R db 6 ; S db 6 ; T!! db 12 ; U db 6 ; V db 12 ; W db 6 ; X db 6 ; Y db 0 ; Z db -6 ; [ db 0 ; \ db -6 ; ] db 0 ; ^ db 0 ; _ db -12 ; ` ; db 0 ; a db 6 ; b db 0 ; c db 6 ; d db 0 ; e db -6 ; f db 6 ; g db 6 ; h db -12 ; i db -6 ; j db 6 ; k db -12 ; l db 12 ; m db 6 ; n db 0 ; o db 6 ; p db 6 ; q db 0 ; r db 0 ; s db -6 ; t db 6 ; u db 6 ; v db 12 ; w db 0 ; x db 6 ; y db 0 ; z db -6 ; { db -12 ; | db -6 ;!!r;- } db 0 ; ~ end ; End ZDEPROP.Z80 )! ,^s %s! ***** checksum error detected in %s! ***** Unexpected EOF on input file!  &z;C_FILE_INFO   C\\*?...]! !!!!!!7 h h >!8vZDENST14.COM[ZDE INSTALLER V. 1.4]# K2bV  Aء:!<B&P"X3Eh(D"eB 0@-JIt0 S@V&pb.Jfi3r 1D3 G&P -Sqg%Ft H%8`BZai2EFc-z&X2CCO!=dK "[#l"tIP;A7g_00k/,P:'a A@[ՎX|q$:_=A@(i f@0`>g`DiZv!h,Gg!`0fH$]J<:],<8j PQsSteB4a\fu сZ@M/LD԰ULĠ<tQG1r!}3:FL (null)(null)+- #     R!:Į <>R6008 - not enough space for arguments R6000 - stack overflow R6003 - integer divide by 0 R6009 - not enough space for environment run-time error R6002 -! hՌC,>Uѐe ]9JtrW \dD@` )ah@>TҼ¤JNh auA(SFo>PCL>GaktPm9xHFIC4oLO O#PELF/aD!`H?3  )) Q0PL1ZxC)lnWhѶjsUZ0Z|1G1]9Fɐy[ѼfduäI|lG9&ƑpվY="Y8o B J1$M [BuF*f 5 x)˅(W,^2U;]ndQu[a$pzO+Q6K!$N=e|e7ޟ{uqcgph!OE floating point not loaded R6001 - null pointer assignment  """""vZDE14C.NOT[ZDE BETA TEST NOTES]#  qhEbq< !$Q\4Ce9yGSa9cd`r9 GZ@4C\lAj9Hsn6L&ibDfIg7 $`6 ALE8N&Ip2Ճ)5)Jsd/Ѩ)JⰡ 1'#I%Χ LR N*r;L*N"vz.V"dB3r }4gH l4ap6MLƓČA 3bׄor%pmӄEXAfuc!' ZGWdOSQiFz'v ՐE DSbAcq^fwNh VGtxFvnIMQ7GAރո~\WeahA^haUTqo~(%HxQD' ^{ D""pIh#Wu$HxIF)^!Ta)BKG\N!GOgFdRTj@I~hcXP@. E13aQ}bQJdny.`mjnJR#aFV;cf`Q`)ƭ 1{2D `rcV0fs& U!-W,ɾERn!hS8cv%{"i)AHe!ćzH%!%[Xun QvCa/goceyBers~a#^^hl HKpu]zoՁ(a5꟱&lR^Q15F,IgY$ԍ8ZnApnNq|o_aub7c,x[SlJ 0ϋHI8PCi8:AZIG2XVH4HCIW"" " "("";vDEPROP.DOC[FORMATTING NOTES]# -<."`Q@o8GCIa6 g n3擡A"Fqr<#dr9Cs#d@W4(|<@ E$T 2$NRic*pSPQ9LAU #[I`e#nRJ RLI 8 !؊i$WTfT[yXe9騸h Ce9%)m2%xhs!c.r2 N'SuFMCA(7$rnajP)DW|bQqXkAHDllvF|\gQ/Fq.n ߨb{Qpan.t\f` i ˆ.LoaQgY}OXEEZ P[ZUs]Wu{_EECy$) ߧOƖ""B~`W\skhЂ!ƴk)>vn7|~ZIAĉI9!d}yk9~\ 7nDZkP*IGLF"B _I mF%d|Dj;Z\iީ40&+o="~e\kxlʾ-E`bu6͘nlYc zFM+?'(I9K~ԑI,rdѲ"""" " #6##ٽJ1НM0O 0Q*1R)qVYAT0YearX^7( jhVVg`-iF0k1X(Voh@sGJ0uk7aeaea __-EdbXM(2'###### #vDEPROP.Z80[OVERLAY FILE]# ACl2 P)` S1l:#yr:M @w4b ҡ@ ,uJ3 .U#u":a:C!a7# 8\9H'3;2@.$KQdh4l0n=_,N'P8*E(H%B)N *HD($q:G!!,f|\] `u8!@zBd㐀E&JV.Vz$tPhq%c@cqA*%J1흨4"">ęX ######### # $$$$$$$$$ $ $$$$$$$$$ $ %%%%%%%%% % %%%%%%%%% % &&&&&&&&& & & &&&&&&&& & ''''''''' ' ''''''''' ' ((((((((( ( (r(((((((( ( )l)))))))) ) ))))))))) ) ********* * *`******** * +~++++++++ + +++++++++ + ,,,,,,,,, , ,V,,,,,,,, , -H-------- - --------- - ......... . .D........ . /Z//////// / ///////// / 000000000 0 0=00000000 0 1#11111111 1 111111111 1 222222222 2 2/22222222 2 3133333333 3 333333333 3 444444444 4 444444444 4 555555555 5 555555555 5 666666666 6 6 66666666 6 777777777 7 777777777 7 888888888 8 8u88888888 8 9k99999999 9 999999999 9 ::::::::: : :g:::::::: : ;y;;;;;;;; ; ;;;;;;;;; ; <<<<<<<<< < <Q<<<<<<<< < =O======== = ========= = >>>>>>>>> > >C>>>>>>>> > ?]???????? ? ????????? ? @@@@@@@@@ @ @@@@@@@@@ @ AAAAAAAAA A AAAAAAAAA A BBBBBBBBB B BBBBBBBBB B C CCCCCCCC C CCCCCCCCC C DDDDDDDDD D D"DDDDDDDD D E