IMD 1.16: 8/06/2007 8:25:04 VDOOS1 LBR VED33 LBR VED33 LBR !"#$%&'()VED33 LBR*+,-./0123456789VED33 LBR:;<=>?@ABCDEFGHIVED33 LBRJVEGAS LBRKLMNOPQRSVEHTAX LBRTUVWXYZ[\]^_`abcVEHTAX LBRdefghijklmnopqrsVEHTAX LBRtuvwxyz{|}~VEHTAX LBRVERIFY LBRVICTORY CQRVIDLIB LBRVIDLIB LBRVIRTUAL LBR\VIXBIOS DOC@VIXEN DEL#VIXENMM COMYVIXENMM DOCVIXENMM PQSVMAP BQS(VMAP DQC -PUBDOM 069 VDO COM VDO2A DQC"RVDO2QUIKDOCtVDO2READMQ zZ VDO for O-1P*",!."*,"*,"?>2H1Ab ͜:! "1)Ϡ報젱( $!:\(w#6#!]> (!e6#>(6 #= !#!3FNy(-B0 ##>B84 ##NFy(>}B> 6#= 'd _!"h"j"k"|\:|G:k $ !h4!"j"k"|\ H\ T!~(. (! ( ~ >>( 4#w# \> (#w2 7  _: (1!\ !\!2 \\!"h"j"k"|! w# 2G\:G :! > (| } ʱ ǰ(>w\ \>2H>2HBAK!~w  ;w# 0 @>^w#w#>(+~+ 0+> www}ր*U+6 *:Do%"+":G#6  *#"E BDM*UDM*W**DM*WDM*++͇*+*W"W#"͑*W#*"+"Ẅ́0*W~ > 7>  ###7?(#+͎0S> *! 7?z 7*+> ##>+*?+"?:D(=:D*?#"?!(<:2D> :C=:C=<:C!<:2Cm̈́8,*UT]u~# ((~( (>"W͎*T]u~+ ((~( (>"o͚0 ͓͚0>2H}*W#w"W*Uͦ8k!"?*ͽd͌̈́8 > *W I"?0 <kͦ+8 Oký*͌~ ½Oý̈́*W~(5> +"W* ~( ~o4o+w" ʌ o͌<͎*~(5> #"*W ~(~4#w"W v Ok:+)x-8_vFVDO2A.DOCb  !"#$%&'()*o+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYuZ[\]^_`a$?:yu.WDQ^:_%&ur9%Y^MQCKj+<_#D(P G/NӏO'/d&sa-NN(„@ġ%<8EhRuaRוWY$Ї IW k:/p~q\ zXP;l H 1!tK7L54eB-⌏#kgWK5ϯn1D9Fl v4'尭egWЈ4m9\s`LQQ jы20#PX|ۋ1(: : >2H ++ͽ8͌O<>2H :=G   8 >2H%v̈́8*W~(~4>!~*> !~(6!!6!0͎8:m> Ok͎͑*~(5>#"!50 *~ # +*W~ #"͓*W#"E*E͇0>2H*E+"W͌< ( #w#:@ =2@ :=2@ :@ Oa GO> w# :@ (0O:=2@ !:=2@ :W> A  !:=2@ ~#A ͬ * ( o 8o *> wɯ ~#(O > y(A ( !  yO ( ' w# :9  :9 O> :=G:9 O x( Ha +>  T]>  (:D_"s 08:D2D0 k29 <2>6 xG ͇0:COx2>829 x2C29 !*s :D=(_: :C=(G:9 O "A:=!C<( G*B  0*#:D_:(_: *?$:>o&*A>w͉ :H͓͚8*WR >2H0>2H*W"W#ͦ<͓͎* !\ *E͇*E) !\ ÜͶ File name (end with RETURN): y ƀo&>6 #= !6)&#E,'-r"23/1D8/Ps%t!'mZKSCR*InU}EC8԰% \XМ jF  wNoeFCC6IQ,p;SVRD/WW7N^^p; |q/ChG`EL:0N!.e 9Ԋ`+p"P.pI.\ryy;1 orx8Gv#u]Fp" MQ2Nǫ<"Ǐyv^LVx`+9~BGHsQmT+0eWIA ]\zq0uEPI ВڊrB<3E,ȱIR %r:AkD N=4bMH p",u9d"W&\ONï /1&-A"ZDE!qF1 'rI9\wWO0u뿣%umL\rﴑ1⤍< Fq'57IErzwx9F]@k2#6  !:: :A8Y8 8Q0M<2!~.($ (*a8 !83:8A8+[0'>(!#>8#\! 2 ͜>2Hɯ2 ͓Ͷ Printer Setup codes (then RETURN): ( G!~A#͎* A: <2 :> 82 > A [{z0 * (#" ^#VS ! "  Ͷ Command: #O! " !Y>!YT]P>K q#pS !f 8͎8̈́8*~A7_[?)o 0o 8o 0͑o 8͑o 0F#^#V## ^#V## ͋ Ͷ VDO 2.A (F.M.) <> Commands: Cursor:T-Top, B-Bottom Character: O-change case File:N-setName, L-Load, S-Save P-Print, I-Insert Define:F-Findstring, U-Usercommd Block:H-starts Here, W-Write, D-delete Exit:Q-no update (Quit), X-update TB0FI[ S W N P H U" D% O QO XG Lɯ2\ !]6 #?I:] ͋ [ 2H*EMD*W#z0mu O  m VmV@ o f   a     J tH  :HE͋ Ͷ Error::Ho& ~_#~Wͬ Ͷ WaitingN#N(^#1تZRPK.Ј zshXr\8Qw uC0p"XL䄅 XraG'BKj+3HwCKc!%9\~7ZlEuEor8Ku%P' :`A] }2p11 -(8K~A !"ְJ\tNʐϯ/NϮwRFqB G'ʥxuz{rs!\ro~r NԵ19z-.g< 8){މ7<]_Bd#Q`oI]Ϲt NdhI]Ϲ\ ^Ɂ`'BduD0z˹`h'U#.?aE!,D =8j0s| N-Y'B Fs.Xoz(aK`lP,D`*[Azp"LN CD Fs.׷gp"9#DH!X2uP'szω%o>_?AGp"D qqiM `"v=|`#wN >T28QAll25x}:!8lCCCdB'}ԑ׷gK< 8)@^zp".u]0Z9\8ErP<]}|DKژ|Y"t!NUHsnY:/@aM0Zs= ֈa'H6@zACm%ܞޡq`W (FxDRK.; , *ɃL`o޳ AF k""Tey9 pU+8"Czp"iP<`ø%;I]N"u`T:eE0p"ҌDK] X.Z":1BG8P #uP'Y.X 9 Dh; sz?I \oSTN61 L:eE0p"R.XMG N ҃!6'7=8}DGA{&G'VPTn(ί.~>zE*t$$0al -v !'%8!k'2p\KЇJN#u`AAчJLX.X#ԋ8 FKҜK.{&(&qbLo20Xw2}*8Kmv f2e't2D<>Pl_N61Q<LG45l C,@`z˹`]F&uDC%@M8j`#uAЇJ3Ԅ919E)b|LdXu`D=P.X}n @ B45 rz@]>=c(#H+ rz߇JP Gi `Gbgh%28 l p{0''0y0&ϯrz ::F3~P+U8%F`g/&B0("{GKژ<[B$\޳a`L^WA [ (}NY8R""9&^|0}`zpGeA)7 Ȉd]D``'|Ə2`E.]1X0D'BAkrCd "q.=2zq[J;c! Cdq寜M:0j,aB0(Pi%8/3~0͸ڪubD.0uC}A+Sy bg!b~Ul5 m-:(~l%NN }ONCW[N mp'\S:š0Zt:$UCY!e"N!B,qHx8!X$gВ6&P'L].XЇJDAzp"ɡ N6xe80! N!=8j0C衶K.Vg!B~Ե1y/& 4UmNԵ1yD0p"šeBKкEĊ8buK.;5bq%,ήH (ΐ5 _n>H '\2 I, ,hImEDI- #Hp"i!=8VԻg8LKXNP4ubT98!Mk0A'jA+d"Wb.|q>J`R%zqĉZЊԵ1yZR݂rzo4 .B.`Y?Ԋ\jE'Ks\!NUDA؜V=q8ӑ1#͸鱐}n1tlr(r0 .#1BD?ԺB@ ThImE@ 4Nхx$fZ'8iοouJEuNGZDACm9\9Ai!R?T#R:2B:|apɃ$#J ⹼#',23n08[Ep$+oǿϹ鑠"7D }`HwrBX&e,d@SCi` 1 or8hI]G 1 wg /6;ȕ) /63Vd"#W{.XVdNԂV#)q-arjDu.XuvVPLC =8K'm  „091/rRhhI$mL X&umQFD#F] "ڊa)֑C`,dpLɱLdpVDN36SF&䐾2\40~pRh0ys~s# /6; _l7@.Xon\~|r~ /6/@.Xon0_'"L]S4b:\~œ0NBDbSv\~|H4@ΡiɃ1y;aA#z1'] H<\~߼¼~$ =h '09 n. rC$].Xe"Wbq-UY^w= d 1I vKܞ|"Wbq%}"BD=Ñ;,dlDD"Ҍ+'Ve"F!NHj5DD;~~A,B#TY"ܞA&r N{:lH9 (&'. ɡ=#`+ܞ͸鱐 sY1X0 ;=2!0BDTuA]. ޑN<'B*8KԂr(d"Wb!% 'x% 8ђ6&DC9\8+9XP52ZR}K.'5lђ6&Przo! ҃N>Tq(-kcuSep"lYFHN l@lNd;uVXN=|4'§\D"X%8ML8 Ե1y!ӌe@[BS~`O䴃Fp"D`+,CzX]  z1*^b2&nƍЋC1*0Mh #)M,:`KBߓ1zUh)K. 9!Dp"DVgHŶJ;Bz#Xrz%tT8.K.NpA@`+.#8Fv,`Dh; 1I f;r` #:<>Pl;p!2@].X5Ze x%'B<}hI]?`KS7 9\tWr p"8zzhD9%umLl Ub\rzK| q% '8%'B*t$`K"uqN!?̹`?K>TH;CdNϯЋ1dLNf!=8bs"s n,3\5B5 /6'8&2_l7 zqLe.Xo\~5 /6S _l7g@.Xo>`bsyr~\~1_< Cn+ʴFu}4=ņӻ?ca<"_l7r~s柁w|^SrRhhI]GL8=h8M)Nb(p" ցrᤌ8Q Z1ZA Ww77CR.a6vw ZX cK19u]Fp"~<~=y#-!-A#8uׯwxy8^bBKXP; AsD 4j:cK cr\r%*+<_ϸ鱐INDvr\~M0%d 1,dpǭ 0-(NI1L%<_#s'[F2_/^cpqq"TiA /_l (%bs"C g rRڡQÑ)77]8t27spqqS|g˗_ׯsprOxO+~:_^ \\&8ts1\RXP;4'eh&|q;pRR%*NX.4K.w_~=ŧk<^ޜ?|K.oՎx5j /^+uS / *wW~z2\cY"N'Kdx8œ\2uZeFh#ۺ@.Um5v,h2NH4a;K*a6VY[AВڊ"F,ȅHwh2j]J"%E1YG].,HDC 8!1Tuxws.䲹 Q#,Ż\6Tee|q!H 8u Q"cF@RЭ Ns.<< z#ދJ7+e::tVt6u>^f}02pGZD ŻSV(a8R'.KDb`e^-ri2N#D.IK]Y"tue.? DPu!R?T5P MQ/s78K P&8t 86^۟pEZ/_‘^;e9sF5qKe"Bb"f;DA豐"9-cK8aT?raz@qDՏ脢}qUN~QHʉ'a'elAdպe'kG`!xp˅5aK8Aye/_0NV`A. _QQH1tCWdS*9ZrBX&.po35 .uj0 Brief Documentation of VDO2A ^Commands: ^A - Left one word ^B - Turn on insert mode ^C - Scroll toward bottom of file ^F - Right one word ^G - Delete character over cursor ^J - Transpose characters ^Kn - Set marker n (from 0 thru 7) ^L - Find again (first set marker 0) ^N - Insert a RETURN left of cursor ^O - Oops; unerase last erased character(s) ^Pc - Insert character c as is; display graphic ^Qn - Jump to marker n ^R - Scroll toward top of file ^T - Erase next word ^U - Execq-"9c 0aH_\Ub!1e.W8]xpes`')jdk-kc9/qq F#wH|{l~ QHlprx-aN b.XQzLs3Np!>uh2j].g!24bK8jU "9' H`YQN:1vH(?x9 NUكze1*D1w2FKژ|e_p֨BlУ%umL3K.DxE6NQor'8G\4Ge.w8gt!8u3Rh2jB"= ң8uZ2Ԋ-R\/0DrbONP8uXȺ`|2 8RszߋӁ|ƽSVP[H .#8؊z 2Ep" MQC0;kX%s= *#zqHR/NXz`+ ='28ENPt9\rWn Uror˗9a:Nx""1믗~ 6'2$ '/09E2 Db(N^^O_pIWJℇ)q] Ce.ܝzutv'<^ޜ?|&\O,68M [z,dwC\5RRۡıҎऌF%$:`K H \NP x 'V / E8,LdX "S$*NV$' H ;l9,N䄥Fp ute user defined command ^V - Toggle insert mode on/off ^Y - Erase to end of line ^- or ^? - Delete character left of cursor ^\c - Cancel ^U if next character matches c ^\^\ - Cancel ^U if next character is not a letter v$VDO2READ.ME7  !"#$%&'()*+,-./0123o456/RJ0'1Ftlg$}~NU#K@BZ=g}]c=Qy^?0㟟`ǯrCbv%cfQ<`uALNHt ܵ),v&ySGJPz%7ծL+4^]wR$7bgJ!@d5 ԕ|Sr]1ZøAX{49W !(E)o%.&xeOjIډټF! pBW5예FhD~;X &]'N%'gB} ^.Ѕ0iw RqЧ]EPYԹ=}9.U#K(]! 吸AhZ`>MJ<Rb 3va]=}{+O߻[;@Ds6B1LB懒]ޠo)7LF#lJ.dzX2|&'|ta"%&i!C F0tC#lï~N'B<#kN`Ys!88͹9NQ{"Bc Ssu'j݉TMZïK.@f|G.Vǩ'B}.[!Dp"sӇ8ZlK.w2jlm>n~DϹ4UmBZEH?}2pNNaF.ON!#E& =6`$thImlKHZ{#Y"l>Cd].҃![!X"8)8upH98R>X`W}w\{)"KdqCGP,suhj8Uɘ:,'p"4G.;G 6\m>Y MQ(ŗ8 N>T`j.dp"Tb&LJs.< 8)ah2jB-`j.C$/&|`5 }MQA˅28ZRكNarшЃ-$'idK.7u!R?TH4!H슎`X%8uХ. q+ne:#-Y 8.0TEp"0n!=H~KG}0dպ=h4K.W7x8TQ'B\D.KisYN!KGZ:tB>0ZR[8јVqRX#`e)5GZD8x/ޝm4q.[mG,"ڎqFpDNj؜M $=5A ,"jNim;p"iIG}A Mڡ 2l+}tbGe.Cm!FX&щ8v`)&1l+%`qJ'-kcr,qEă c8rz{~XN8qBRځ  QCOMPILE SUB<%LINK33 SUB MBUFFER MAC OuMBUFFER REL {PRINTF H 9jREADME VEDSETUP VEDVED0 C /VED1 CCC3VED10 C ;0VED2 C kuDVED3 C VED33 COMr VED33 DOCRF"VED33 PRNVED4 C +^VVED5 C OVED6 C VED7 C BVED8 C $sVED9 C VR33 C VR33 COM[ c3 -d550 -w125 -m -a ved2 m80 v2=ved2 era ved2.mac f c3 -s150 -m -a ved3 m80 v3=ved3 era ved3.mac f c3 -m -a ved4 m80 v4= * * Energy and Resources * * Room 100, Bldg. T-4 * * University of California * * Berkeley, CA 94720 * * * * It is adapted from the program "ED2" (SIG/M v76) written * * in the C language with minor assembly language optimization. * * * * The original author was: * * * * Edward K. Ream * * 1850 Summit Ave. * * Madison, WI 53705 * * * * The editor appeared in Dr. Dobb's Journal, No. 63, Jan. 1982, * * v. 7, Issue 1, and is more fully documented in the accompanying * * article and listing. The present listing documents only changes * * * * This version (VED33) was directly adapted from that written by * * * * Alan D. Howard * * Rt. 3, Box 680 * * Crozet, VA 22932 * * * * * * The original program and modifications are in the publived4 era ved4.mac f c3 -m -a ved5 m80 v5=ved5 era ved5.mac f c3 -m -a ved6 m80 v6=ved6 era ved6.mac f c3 -m -a ved7 m80 v7=ved7 era ved7.mac f c3 -m -a ved8 m80 v8=ved8 era ved8.mac f c3 -m -a ved9 m80 v9=ved9 era ved9.mac f c3 -m -a ved10 m80 v10=ved10 era ved10.mac f l80 v2,v3,v4,v5,v6,v7,v8,v9,v10,a:clibrary,mbuffer,ved33/n/e  ENTRY mbuffer mbuffer:: db 0 end  3J}*3#"3+Ú3!9K*36"3ɅPQ`d%TddY@ɨJȳ/* printf.h: definitions for printf and fprintf to allow multiple args. */ #undef printf #undef fprintf #undef sprintf #define printf prnt_1(),prnt_2 #define fprintf prnt_1(),prnt_3 #define sprintf prnt_1(),prnt_4  c domain. * * Mr. Howard would appreciate notification of any bugs found and * * listings of any major enhancements. * * * ****************************************************************************** ***** NOTE ON USE WITHOUT M80 AND L80 ***** To use this editor with a C compiler that does not produce Microsoft M80 and L80 compatible code you must create an include file for the remaining modules. The other modules will also have to be edited to remove the #include statements at the beginning of each file. Also, the extern char mbuffer[1]; statement should be changed to char mbuffer[1]; You will have to check that your compiler places mbuffer as the very last item on the COM file, or you will overwrite the program. Special heroic efforts may be necessary to set up the buffer if mbuffer ends up internal to the program. This version is supposed to auto-check for 8080 or Z-80 processors [see VED8.C for details], but hThis library contains VED (3.3), an adaptation of Alan Howard's ED2 update of Edward K. Ream's full screen editor. (See Dr. Dobb's Journal, Number 79, May 1983 for Howard's article). This adaptation has greatly modified the screen commands to provide as close a clone as possible of the VI screen editor familiar to all you **NIX fans within the limitations of CP/M-80. It was written for the Software Toolworks C-80 compiler, but should be easily adaptable to any other C-compiler with only a modest amount of modification. At the moment, it is set up only for a Televideo 925/950 or compatible; if you have a different terminal, you will have to go through by hand and make changes wherever screen commands are called out. ****************************************************************************** * This version of the Portable Screen-Oriented Editor was * * written in the C language for Software Toolworks C-80 by * * * * Gene I. Rochlin as only been tested on Z-80 systems. If you are adapting for non-8080, non-Z80 processors, please be sure to go through the various #asm calls and edit them as needed. ***** NOTE FOR USE ON OTHER TERMINALS ***** This version of VED was written specifically for tvi925/950 series terminals. Since it was never intended to give it wide distribution, no effort was made to remove terminal dependent calls (such as clear to end of line, or cursor addressing) from the various vedxx.c files. If you have a different type of terminal, you will have to go through and change things by hand. Sorry. If you do not have an intelligent terminal, make sure that the outhasup and ouhasdown calls return "NO" (can't scroll up or down); if it can't erase to the end of the line, you will have to fudge a cleareol call. /* VED0.C */ #define MAXLEN 80 /* 80 character video screen */ #define MAXLEN1 81 /* MAXLEN+1 */ #define SYSFNMAX 15 #defiline=min(bufmaxln+1,line); line=max(1,line); if (line==bufline) { return(OK); } while (linebufline) { if (bufdn()==ERR) { return(ERR); } } return(OK); } bufup() { char *oldbufp; oldbufp=bufp; if (bufattop()) { return(OK); } if (*--bufp!=CR) { pmterr("bufup: missing CR"); bufp=oldbufp; return(ERR); } while (*--bufp!=CR) { ; } bufp++; if (bufp<(mbuffer+1)) { pmterr("bufup: bufp underflow"); bufp=oldbufp; return(ERR); } bufline--; return(OK); } bufdn() { char *oldbufp; oldbufp=bufp; if (bufatbot()) { return(OK); } while (*bufp++!=CR) { ; } if (bufp>bufpmax) { pmterr("bufdn: bufp overflow"); bufp=oldbufp; return(ERR); } bufline++; return(OK); } bufins(p,n) char *p; int n; /* altered: a full buffer does not truncate */ { /* line, but issues warning and returns */ int k; /* ERR - allows editing of large files ne EOS 0 #define OK 1 #define ERR -1 #define EOF -2 #define YES 1 #define NO 0 #define CR 13 #define LF 10 #define TAB 9 #define BEEP 7 #define HUGE 16000 /* generally large number */ #define TABDEF 5 /* default tab screen space*/ #define WMDEF 8 /* default hot zone wrapmargin */ #define SIGNON "VED 3.30\t\t4/12/85 " /* VED1.CCC */ /* March 1985 */ #define UP1 15 /*^O for open a line above */ #define DOWN1 13 /*^M*/ #define UP2 11 /*^K*/ #define DOWN2 22 /*^V in insert, allows controls to be entered */ #define LEFT1 8 /*^H*/ #define RIGHT1 12 /*^L*/ #define INS1 14 /*^N*/ #define EDIT1 5 /*^E*/ #define ESC1 27 /*esc*/ #define DEL1 127 /*del*/ #define ZAP1 25 /*^Y*/ #define ABT1 24 /*^X Changed from ^U to allow for scroll */ #define HOME 30 /* ^^ = home cursor or to bottom of screen */ #define DSCROL 4 /* ^D = scroll down */ #define USCROL 21 /* ^U = scroll up */ #define FORPG 6 /* ^F = forward a page */ #define BACKPG 2 /* */ if(bufext(n+1)==ERR) { return(ERR); } k=0; while (k0) { if (bufatbot()) { break; } if (bufdn()==ERR) { bufline=oldline; bufp=oldbufp; return(ERR); } k++; } bufupmov(bufp,bufpmax-1,b ^B = back a page */ #define SCRNW 80 /* tvi screen width */ #define SCRNW1 79 /* SCRNW-1 */ #define SCRNL 24 /* tvi screen length */ #define SCRNL1 23 /* SCRNL-1 */ #define SCRNL2 22 /* SCRNL-2 */ #define SCRNL3 12 /* half a screen length */ #define LISTW 80 /* width of listing */ #define LFTDEL 8 /* delete to left of cursor */ /* VED10.C */ /* March 1985 */ #include ved0.c #include ved1.ccc int bufcflag; char *bufp; char *bufpmax; char *bufend; int bufline; int bufmaxln; /* mbuffer is external for Software Toolworks compiler to force it beyond code sections */ extern char mbuffer[1]; bufnew() { bufcflag=NO; bufp=bufpmax=mbuffer+1; /* need more room for Software Toolworks stack and buffers */ bufend=sysend()-1500; bufline=1; bufmaxln=0; mbuffer[0]=CR; } bufln() { return(bufline); } bufchng() { return(bufcflag); } bufsaved() { bufcflag=NO; } buffree() { return(bufend-bufp); } bufgo(line) int line; { ufp-oldbufp); bufpmax=bufpmax-(bufp-oldbufp); bufp=oldbufp; bufline=oldline; bufmaxln=bufmaxln-k; bufcflag=YES; return(OK); } bufrepl(p,n) char *p; int n; { int oldlen, k; char *nextp; if (bufatbot()) { return(bufins(p,n)); } if (bufdn()==ERR) { return(ERR); } nextp=bufp; if (bufup()==ERR) { return(ERR); } n=n+1; oldlen=nextp-bufp; if (oldlenn) { bufupmov(nextp,bufpmax-1,oldlen-n); bufpmax=bufpmax-(oldlen-n); } k=0; while (k<(n-1)) { bufp[k]=p[k]; k++; } bufp[k]=CR; bufcflag=YES; return(OK); } bufgetln(p,n) char *p; int n; { int k; if (bufatbot()) { return(0); } k=0; while (k=bufend) { message ("insufficient room in buffer for copy or move"); return; } if (bufext(length)==ERR){ return; } bufgo(1); bufmaxln=bufmaxln+n; if (frombufmaxln); } bufnrbot() { return(bufline>=bufmaxln); } bufattop() { return(bufline==1); } bufout(topline,topy,nlines) int topline, topy, nlines; { int l,p; l=bufline; p=bufp; while ((nlines--)>0) { outxy(0,topy++); buflnout(topline++); } bufline=l; bufp=p; } buflnout(line) int line; { int c; if (bufgo(line)==ERR) { fmtsout("disk error: line deleted",0); outdeol(); return; } if (bufatbot()) { outdeol(); } else { c=fmtsout(bufp,0); /* c= added */ if (c=bufend) { pmterr("main buffer is full"); return(ERR); } bufdnmov(bufp,bufpmax-1,length); bufpmax=bufpmax+length; return(OK); } /* bufstrch is bufext modifed to allow entering beyond buffer with warniON); outxy(0,1); fileclear(); /* make sure no read or write files indicated */ killclear(); /* same for kill buffer */ bufnew(); mode=CMNDMODE; AIFLG = NO; /* default is auto-indent off */ WWFLG = YES; /* default is word wrap on */ edgetln(); while(1){ if (mode == EXITMODE) break; switch(mode) { case CMNDMODE: /* clears r also */ mode=command(); break; case EDITMODE: mode=edit(); break; case INSMODE: mode=insert(); break; default: { pmtmode("no mode"); mode=EDITMODE; } } } } edit() { char sbuffer[SCRNW1]; int cflg,b,v,x,y; extern char pattbuf[MAXLEN1]; register char c,d; cflg = NO; pmtedit(); while(1) { c=syscin(); switch(c) { /* tolower eliminated */ /* and so are the special chars */ case 'J': { /* replaces JOIN1 */ edend(); edins(' '); if (edjoin()==ERR) { edcdel(); } pmtline(); break; } /* SPLT1 removed */ case ZAP1: { edzap(); pmtline(); brng */ bufstrch(length) int length; { if ((bufpmax+length)>=bufend) { bufdnmov(bufp,bufpmax-1,length); bufpmax=bufpmax+length; message("Caution: main buffer is full"); return(ERR); } bufdnmov(bufp,bufpmax-1,length); bufpmax=bufpmax+length; return(OK); } buflength(first,n) int first, n; /* new: returns length of n lines from */ { /* first line specified */ char *start; int i,len,line; if (n<=0) { len=0; return(len); } if (bufgo(first)==ERR) { len=0; return(len); } start=bufp; i=1; line = first; while (i++<=n) { if (bufgo(++line)==ERR) { len=0; return(len); } } len=bufp-start; return(len); } bufcopy(from,to,n) int from,to,n; /* new: copies "n" lines from "from" */ { /* to "to" */ int length; char *source,*dest; if (from==to){ return; } if ((length=buflength(from,n))==0){ return; } if (bufgo(from)==ERR){ return; } source=bufp; if (bufgo(to)==ERR){ return; } dest=bufp; if ((bufpmax+lengeak; } case ':': /* enter command mode */ return(CMNDMODE); break; case 'a': { /* append mode (GR) */ edright(); tc=0; return(INSMODE); break; } case 'A': { /* append at end */ edend(); tc=0; return(INSMODE); break; } case 'I': /* insert at line begin */ edbegin(); /* and fall through to.... */ case 'i': { /* enter insert mode */ tc=0; return(INSMODE); break; } /*GR added unerase, p and P for restoring last deletion */ /* U and ABT1 restore line to previous condition */ case 'U': /* GR added unerase from VI */ case ABT1: edabt(); break; case 'p': /* last deletion placed after cursor */ { edright(); edrestore(1); /* open down on p for whole line */ return(EDITMODE); break; } case 'P': { /* last deletion placed before cursor */ edrestore(0); /* whether string, line, or char. */ return(EDITMODE); break; } case 'O': /* same as UP1 */ case UP1: { tc=edtab case 'n' : /* n = same direction, next */ case 'N' : { /* N = reverse dir., next */ b = bufln(); y = outyget(); x = edscan(outxget()); if ( (c=='/') || (c=='n' && r==0) || (c=='N' && r==1) ) { if (c=='/') { pmtcmnd(" /:",pattbuf); r = 0; } pmt1mode("/..."); if ((v=find(HUGE)) >= 0) { edgo(b,bufln(),v,y); x = -1; } } else if ( (c=='?') || (c=='n' && r==1) || (c=='N' && r==0) ) { if (c=='?') { pmtcmnd(" ?:",pattbuf); r = 1; } pmt1mode("?..."); if ((v=find(0)) >= 0) { edgo(b,bufln(),v,y); x = -1; } } if (x >= 0) { beep(); edgo(b,b,x,y); } pmtedit(); break; } case 'g': { /* go to line entered */ b=bufln(); x=outxget(); y=outyget(); pmtcmnd("edit: goto: ",sbuffer); if(sbuffer[0]=='$') { edgo(b,HUGE,0,y); } else if(number(sbuffer,&v)) { edgo(b,v,0,y); } else { outcnt(); ednewup(); pmtline(); return(INSMODE); break; } case 'o': { /* like old DOWN1 in insert */ tc=edtabcnt(); ednewdn(); pmtline(); return(INSMODE); break; } case DOWN1: { /* DOWN1 now does not */ eddn(0,1); /* enter insert mode but */ /* just advances to next line */ if(edwht()) /* goto first non-white */ edsrch(02); pmtline(); break; } case 'j': case DOWN2: { x=outxget(); eddn(x,1); pmtline(); break; } case UP2: case 'k': { /* go up */ x=outxget(); edup(x,1); pmtline(); break; } case RIGHT1: case ' ': case 'l': { edright(); break; } case LEFT1: case 'h': { edleft(); break; } case 'x': /* delete at cursor */ case DEL1: { edcdel(); break; } case 'X': /* delete to left of cursor */ edldel(); break; /* * BS no longer erases in edit ! **/ case 'D': /* erase to end of line */ ederase(); break; xy(x,y); } pmtedit(); break; } case 'c': { /* new 2/85 == change */ cflg = YES; } /* and fall through to "d" */ case 'd': { /* kill to character entered */ pmtmode("edit: delete"); d=syscin(); switch (d) { case 't': case 'f': { c=syscin(); if (control(c)==NO) { if(d=='t') edkill(c,0); else { edkill(c,2); } } break; } case '$': ederase(); break; case 'e': { if(edkill(03,0)==NO) ederase(); break; } case 'w': { if(edkill(03,0)==NO) ederase(); else if(!cflg) edkill(02,1); break; } case 'E': { if(edkill(01,0)==NO) ederase(); break; } case 'W': { if(edkill(01,0)==NO) ederase(); else if (!cflg) edkill(02,1); break; } case 'd': { edzap(); pmtline(); break; } default: beep(); } if(cflg) {  case 'C': /* change to end of line (2/85) */ ederase(); return(INSMODE); break; case HOME: { /* move cursor alternatingly to */ edhome(); /* top and bottom of screen */ pmtline(); break; } case '0': /* beginning of line */ edbegin(); break; case '^': { /* first non-white */ edbegin(); if(edwht()) edsrch(02); break; } case '$': { /* move to end of line */ edend(); edleft(); break; } case 'R': { /* OVERTYPE added 2/85 */ pmtmode("edit: overtype"); while((c=syscin())!=ESC1) edchng(c); pmtedit(); break; } case 'r': { /* BACK to original exchange using "r" */ pmtmode("edit: replace"); c=syscin(); if (c==DOWN1) { edcdel(); /* delete at cursor and ...*/ edsplit(); pmtline(); /* ..split line */ } else { edchng(c); /* will not accept control(c) */ } pmtedit(); break; } case '/' : /* for back and forward searches */ case '?' : /* /=forward, ?=backwards */  return(INSMODE); cflg = NO; } pmtedit(); break; } case 'f': case 't': { /* search right */ d=c; pmtmode("edit: findr"); c=syscin(); if (control(c)==NO) { if(edsrch(c)==NO) { beep(); } else if (d=='t') { edleft(); } } pmtedit(); break; } case 'F': case 'T': { /* search left to character */ d=c; pmtmode("edit: findl"); c=syscin(); if (control(c)==NO) { if (edlsrch(c)==NO) { beep(); } else if(d=='T') { edright(); } } pmtedit(); break; } case 'e': /* end of word */ case 'E': { /* end of big word */ if(c=='E') x=01; else x=03; edright(); if(edwht()) edsrch(02); if(edsrch(x)==NO) edend(); edleft(); break; } case 'b': /* back word */ case 'B': { /* back big word */ if(c=='B') { x=01; y=02; } else { x=03; y=04; } if(edlsrch(y)==YES) { if(edlstrol(c)==YES) { edins(c); } pmt2line(); } else if (control(c)==YES) { tflg=NO; continue; } else { edins(c); } tflg=NO; } } control(c) char c; { if (c==TAB) { return(NO); } else if (c>=127) { return(YES); } else if (c<32) { return(YES); } else { return(NO); } } command() { int v,j,k,topline,oldline,ypos; char c; char args[SCRNW1]; char carg[30]; char *argp; extern int bufmaxln; r = 0; edrepl(); oldline=bufln(); ypos=outyget(); topline=oldline-ypos+1; while(1) { outxy(0,SCRNL1); outchar(':'); pmtmode("command:"); getcmnd(args,1); fmtcrlf(); wait(); pmtline(); c=args[0]; if ((c==EDIT1)|(c==INS1)) { if (oldline==bufln()) { edgetln(); bufout(topline,1,SCRNL1); outxy(0,ypos); } else { edgo(-HUGE,bufln(),0,0); } if (c==EDIT1) { return(EDITMODE); } else { return(INSMODE); } } /* note that only first letter of edit, write, quit rch(x)==NO) edbegin(); else edright(); } else edbegin(); if(edwht()) edsrch(02); break; } case 'w': /* next word */ case 'W': { /* next big word */ if(c=='W') { x=01; y=02; } else { x=03; y=04; } if(edwht()) edsrch(02); else if(edsrch(x)==YES) edsrch(y); break; } case 'm': { /* NEWEST */ pmtmode("edit: mark"); c = syscin(); switch(c) { case 'a': ma = bufln(); break; case 'b': mb = bufln(); break; case 'c': mc = bufln(); break; default: beep(); } pmtedit(); break; } case FORPG: { /* forward a page */ eddn(0,22); pmtline(); break; } case BACKPG: { /* back a page */ edup(0,22); pmtline(); break; } case DSCROL: { /* scroll down */ eddn(0,11); pmtline(); break; } case USCROL: { /* scroll up */ edup(0,11); pmtline(); break; } default: /* if command not fparsed */ else if (c=='w') { name(args); save("1,$ "); closewrite(); } else if (c=='q') { /* used to be dos */ if (chkbuf()==YES && wrfchk()!=ERR) { /* auto-closewrite removed */ syscout(ESC1); /*clear display*/ syscout('*'); return(EXITMODE); } } else if (c=='e') { /* NEW 3/85 */ closeedit(); if(fedit(args)!=ERR) { /* NEW 4/85 */ open(args); /* open newfile for read */ getit("1,$"); } } else if (c=='f') { /* NEW 4/85 */ file(); } else if (c =='$') { edgo(-HUGE,HUGE,0,0); return(EDITMODE); } else if (number(args,&v)!=ERR) { if (v > bufmaxln) { message("past end of buffer"); continue; } j = k = 0; while(args[j] != EOS) { if (args[j] == '\'') { /* skip marker */ j++; } else if (args[j] > '@') { /*not numb or comma */ carg[k++] = args[j]; args[j] = ' '; } j++; } carg[k] = EOS; if (lookup(carg,"change")) { changeound */ beep(); break; } /* endswitch */ } /* endwhile */ } /* endedit */ insert() { register char c; int t,tflg; tflg=NO; if(AIFLG) { tflg=YES; } pmt2line(); while(1) { if(AIFLG && tflg) { t=tc; while(t-- > 0) { edins(TAB); } } carryon: c = syscin(); if(AIFLG && tflg && c==TAB) { tc+=1; } if(AIFLG && c==CR) { tflg=YES; } if (c==ESC1) { edleft(); return(EDITMODE); } else if (c==INS1) { ; } else if (c==DOWN1) { /* in insert mode DOWN1 treated */ edsplit(); /* differently from edit mode */ pmt2line(); /* inserts new line by splitting */ continue; } else if (c==LFTDEL) { /* BS deletes to left of cursor */ edldel(); if(tflg) tc-=1; goto carryon; } else if (c==UP1) { ednewup(); pmt2line(); continue; } /* special characters in general now out */ else if (c==DOWN2) { /* ^V gets controls here */ pmtmode("control"); c=syscin(); if (con(args); } else if (lookup(carg,"delete")) { delete(args); } else if (lookup(carg,"list")) { /* to printer */ list(args); } else if (lookup(carg,"move")) { /* new */ copmov(args,1); } else if (lookup(carg,"copy")) { /* new */ copmov(args,0); } else if (lookup(carg,"find")) { /* renamed */ wait(); /* old find now used */ search(args); /* for pat. searches */ } else if (lookup(carg,"put")) { /* new */ extract(args); } else if (lookup(carg,"save")) { save(args); } else if (lookup(carg, "")) { edgo(-HUGE,v,0,0); return(EDITMODE); } else { cnf(); } } else if (lookup(args,"setai")) { /* new 2/85 */ AIFLG = YES; } else if (lookup(args,"noai")) { /* autoindent on/off */ AIFLG = NO; } else if (lookup(args,"setww")) { /* new 2/85 */ WWFLG = YES; wrapset(args); } else if (lookup(args,"noww")) { /* wordwrap on/off */ WWFLG = NO; } e/* VED3.C */ /* rev. March 15, 1985 */ /* new rev. April 12, 1985 */ #include ved0.c #include ved1.ccc int readfile = -1; /* separate read and write files */ int writefile = -1; /* -1 for inactive, file channel no. for active */ char rfilename[SYSFNMAX]; /* file names */ char wfilename[SYSFNMAX]; char efilename[SYSFNMAX]; /* NEW 4/85 */ char pattbuf[MAXLEN1]; /* for holding find pattern */ char databuf[MAXLEN1]; /* single buffer replaces redundant buffers */ int ma, mb, mc; /* GR added line markers */ extern int fmttab; extern int WM; /* for wrapmargin "hot zone" */ fileclear() /* initializes filenames to zero length */ { rfilename[0] = EOS; wfilename[0] = EOS; efilename[0] = EOS; /* NEW 4/85 */ pattbuf[0] = EOS; } markclear() /* clears line markers */ { ma = mb = mc = 0; } append(args) char *args; { int file; int n,m; int topline; char locfn[SYSFNMAX]; if (name1(args,locfn)==ERR) { return; } if (locfn[0]==EOS) { nfaerr(); return; } if ((file=slse if (lookup(args,"get")) { append(args); } else if (lookup(args,"clear")) { clear(); } /* "delname" and "rewrite" removed; name now asks if overwrite OK */ else if (lookup(args,"bak")) { /* new 4/85 */ movbak(args,YES); } else if (lookup(args,"open")) { /* new */ open(args); } else if (lookup(args,"load")) { /* changed */ open(args); getit("1,$"); /* old "rest"*/ } else if (lookup(args,"name")) { name(args); } else if (lookup(args,"clwrt")) { /* new */ closewrite(); } else if (lookup(args,"clrd")) { /* new */ closeread(); } else if (lookup(args,"cledit")) { /* NEW 4/85 */ closeedit(); } else if (lookup(args,"save")) { save("1,$ "); } else if (lookup(args,"tabs")) { tabs(args); } else if (lookup(args,"read")) { getit(args); } /* "rest" omitted: Use "read $" */ else { cnf(); } } } cnf() { message("command not found"); } lookup(line,command) char *lineysopen(locfn,"r"))==ERR) { fnferr(); return; } if (bufdn()==ERR) { return; } topline=max(1,bufln()-SCRNL2); while ((n=readline(file,databuf,MAXLEN))>=0) { if (n>MAXLEN) { ltrunc(); n=MAXLEN; } if (bufins(databuf,n)==ERR) { break; } if (bufdn()==ERR) { break; } topline++; } sysclose(file); bufout(topline,2,SCRNL2); bufgo(topline); markclear(); } change(args) char *args; /* extensively modified 4/12/85 */ { /* adds "delete" mode, "^$" */ char oldline[MAXLEN1]; char newline[MAXLEN1]; char oldpat[MAXLEN1]; char newpat[MAXLEN1]; int from,to,col,j,k,n,p,t,v,verify,glob,blnk,delit,lm; lm=delit=glob=verify=0; if (get2args(args,&from,&to)==ERR) { return; } fmtsout("search mask ? ",0); getcmnd(oldpat,15); fmtcrlf(); if(oldpat[0]==EOS) { return; } if(oldpat[0]=='^') { if(oldpat[1]=='$') blnk=1; while(oldpat[j]) { oldpat[j]=oldpat[++j]; } lm = 1; } p=strlen(oldpat); pmtline(); fmtsout("change mask, *command; { while(*command) { if (tolower(*line++)!=*command++) { return(NO); } } if((*line==EOS)|(*line==' ')|(*line==TAB)) { return(YES); } else { return(NO); } } getcmnd(args,offset) char *args; int offset; { int j,k; char c; outxy(offset,outyget()); outdeol(); k=0; while ((c=syscin())!=CR) { if ((c==EDIT1)||(c==INS1)||(c==ZAP1)) { args[0]=c; return; } if ((c==DEL1)|(c==LEFT1)) { if (k>0) { outxy(offset,outyget()); outdeol(); k--; j=0; while (j 0 ) { if(amatch(oldline,oldpat,col++)==YES) { v=1; if(!delit) fmtcrlf(); if(verify) { t=fmttab; /* set tab=1 kludge 2/85 */ fmttab=1; /* so ??? line up OK */ putline(oldline); fmttab=t; fmtcrlf(); if(!delit) { outxy(col+4,SCRNL); j=p; while(j-- > 0) { fmtsout("?",0); } } fmtsout(" (ynq):",0); switch(syscin()) { sn(YES); if (bufgo(line++)!=OK) { break; } if (bufatbot()) { bufup(); break; } n=bufgetln(databuf,MAXLEN1); n=min(n,MAXLEN); databuf[n]=CR; fmtsout(databuf,0); fmtcrlf(); } fmtassn(NO); bufgo(oldline); } extract(args) char *args; /* write indicated line range to file */ { char args1[SCRNW1]; char *argp; int file; char locfn[SYSFNMAX]; int oldline, from, to, n; oldline = bufln(); if (get2args(args,&from,&to)==ERR) { /* from and to are line range */ return; } message("enter file name"); /* request the file name */ getcmnd(args1,0); argp=skipbl(args1); if (syschkfn(argp)==ERR) { return; } syscopfn(argp,locfn); if (locfn[0]==EOS) { nfaerr(); return; } if ((file=sysopen(locfn,"w"))==ERR){ return; } if (bufgo(from)==ERR){ sysclose(file); return; } while ((bufatbot()==NO)&(bufln()<=to)) { /* do the writing */ n=bufgetln(databuf,MAXLEN); n=min(n,MAXLEN); if (pushline(file,databuf,n)==ERR){ break; case 'q': case 'Q': case ESC1: { message("Interrupted"); return(ERR); break; } case 'n': case 'N': { v=0; break; } default: break; } } if(v) { if(delit) { edzap(); from--; } else { k=replace(oldline,newline,oldpat,newpat,col-1); if (k==ERR) return; t=fmttab; /* swap tabs again */ fmttab=1; putline(newline); fmttab=t; bufrepl(newline,k); k=bufgetln(oldline,MAXLEN); oldline[k]=EOS; if(glob&&!lm) { col = col + strlen(newpat) -1; } } /* end else (for delit) */ } /* end if v */ } /* end if amatch */ if(lm) break; /* break while n-- */ } /* end while n-- */ } /* end while from > to */ fmtcrlf(); } strlen(s) char *s; /*return length of string s */ { int n; for(n=0; *s!=EOS ; s++) { n++; } return(n); } clear() { if (chkbuf()==YES) { outclr(); outxy(0,SCRNL1); b} if (bufdn()==ERR) { break; } } bufgo(oldline); sysclose(file); /* close the file */ } open (args) char *args; { /* open a file for reading */ char locfn [SYSFNMAX]; int n; int file; int topline; if (readfile > 0) { /* check for open readfile */ message("read file still open"); return; } if (name1(args,locfn)==ERR) { return; } if (locfn[0]==EOS) { nfaerr(); return; } if (chkbuf()==NO) { return; } if ((file=sysopen(locfn,"r"))==ERR) { fnferr(); return; } syscopfn(locfn, rfilename); /* make the file name the readfile */ readfile = file; pmtrfile(rfilename); pattbuf[0] = EOS; markclear(); bufnew(); } /* rest combined with getit (4/12/85) */ getit (args) char *args; /* new: add n lines to buffer if room */ { /* REST now = read("1,$") */ int n; int topline; int nlines,npoint; if (readfile == -1) { nrfile(); return; } pmtrfile(rfilename); if (get1arg(args,&nlines)==ERR) { return; } if (nlines<1) { ufnew(); pattbuf[0] = EOS; markclear(); bufclrd(); return(YES); } else{ return(NO); } } delete(args) char *args; { int from, to; if(get2args(args,&from,&to)==ERR) { return; } if (from>to) { return; } if (bufgo(from)==ERR) { return; } if (bufndel(to-from+1)==ERR) { return; } bufout(bufln(),1,SCRNL1); markclear(); } find(n) int n; /* new version 4/11/85 */ /* n=HUGE => find forward, n=0 <= find reverse */ { int x; if (edrepl() != OK) { return(ERR); } if(pattbuf[0]!='^') { bufgetln(databuf,MAXLEN1); while( (n&&(edsrch(pattbuf[0])==YES))|| (!n&&(edlsrch(pattbuf[0])==YES))) { x=edscan(outxget()); if(amatch(databuf,pattbuf,x)==YES) return(x); } } return(surch1(bufln(),n,YES)); } list(args) char *args; { int n; int from, to, line, oldline; oldline=bufln(); if (get2args(args,&from,&to)==ERR) { return; } line=from; while (line<=to) { fmtassn(NO); if (chkkey()==YES) { break; } fmtas return; } /* Following offers some flexibility on read (4/12/85) */ /* If nlines==HUGE (i.e. "read $", check buffer and return if not */ /* cleared. Else (i.e. "read n" where n < HUGE) simply append to */ /* the existing buffer, whether it has been saved or not, without */ /* checking. Needs to be used with caution but useful nonetheless */ if(nlines==HUGE) { if(chkbuf()==NO) return; outclr(); outxy(0,SCRNL1); bufnew(); markclear(); bufclrd(); } else { if(bufgo(HUGE)==ERR) return; } npoint=1; wait(); while (npoint<=nlines) { /* add the lines */ npoint++; if ((n=readline(readfile,databuf,MAXLEN))>=0) { if (n>MAXLEN) { ltrunc(); n=MAXLEN; } if (buf1ins(databuf,n)==ERR) { bufgo(1); topline=max(1,bufln()-SCRNL2); bufout(topline,2,SCRNL2); bufgo(topline); return; } if (bufdn()==ERR) { break; } } else { /* reached end of file - close it */ sysclose(readfile); readfile = -1; rfllowing replaces SAVE also -- line #s required */ save(args) char *args; /* write n,m lines of buffer to */ { /* writefile */ int n, from, to, oldline; extern int bufmaxln; oldline = bufln(); if (writefile == -1) { message("file not opened"); return; } if (get2args(args,&from,&to)==ERR) { return; } if ((from > to) || (from > bufmaxln)) { oops(); return(ERR); } if (bufgo(from)==ERR) { sysclose(writefile); writefile = -1; wfilename[0] = EOS; pmtwfile(wfilename); return; } while ((bufatbot()==NO)&(bufln()<=to)) { n=bufgetln(databuf,MAXLEN); n=min(n,MAXLEN); if (pushline(writefile,databuf,n)==ERR) { return; } if (bufdn()==ERR) { return; } } if ((from == 1) && bufatbot()) { bufsaved(); message("buffer saved"); } else { message("OK"); } bufgo(oldline); } closeread() /* new: close the readfile */ { if (readfile!= -1) { sysclose(readfile); readfile= -1; rfilename[0]=EOS; pattbuf[0] = EOS; pilename[0] = EOS; pmtrfile(rfilename); bufsaved(); break; } } bufgo(1); topline=max(1,bufln()-SCRNL2); bufout(topline,2,SCRNL2); bufgo(topline); } /* Following are new 4/85 for editfile name transfer */ /* transfer args to efilename */ fedit(args) char *args; { char locfn[SYSFNMAX]; if(wrfchk()==ERR) return(ERR); if(name1(args,locfn)==ERR) { fnferr(); return(ERR); } else { syscopfn(locfn,efilename); } } /* echo back efilename for info */ file() { message(efilename); } closeedit() /* "close" efile by wiping out efilename */ { efilename[0]=EOS; } /* end new efile stuff from 4/85 */ /**/ /* * Note (3/85): delname no longer exists, as "name" asks whether to * overwrite or backup if writefile exists. */ wrfchk() /* new 3/25/85 */ { if (writefile > 0 ) { message("writefile open"); return(ERR); } } name(args) char *args; /* name the writefile */ { if (wrfchk()==ERR) return; if (name0(args,wfilename)==ERR) return; mtrfile(rfilename); } } closewrite() /* new: close the writefile */ { if (writefile != -1) { sysclose(writefile); writefile = -1; wfilename[0]=EOS; file(); pmtwfile(wfilename); } } search (args) char *args; /* suurch removed */ { int from, to; char pat [MAXLEN1]; if (get2args(args,&from,&to)==ERR) { return; } fmtsout("search mask ? ",0); getcmnd(pat,15); fmtcrlf(); if (pat[0]==EOS) { return (-1); } syscopfn(pat,pattbuf); surch1(from-1,to,NO); } surch1(from,to,flag) int from, to, flag; { int col,j,n; if (pattbuf[0]==EOS) { return (-1); } while (from != to) { if (chkkey()==YES) { break; } if (from < to) { from++; if(bufatbot()) { bufup(); break; } } else { from--; if(bufattop()) { break; } } if (bufgo(from)==ERR) { break; } n=bufgetln(databuf,MAXLEN); n=min(n,MAXLEN); databuf[n]=EOS; if (pattbuf[0]=='^') { if(amatch(databuf,pattbuf+1,0)==YES) { if(flag pmtwfile(wfilename); } name0(args,wfilename) char *args, *wfilename; /* names new wrtfile */ { int c,file; args=skiparg(args); args=skipbl(args); if (args[0]==EOS) { /* changed from sychkfn 4/85 */ if(efilename[0]!=EOS) { /* NEW 4/85 -- is efile named? */ syscopfn(efilename,wfilename); /* 4/85 Yes, copy to wfile */ if(movbak(efilename,NO)==ERR) return(ERR); } else { /* 4/85 NO */ nfaerr(); /* added 4/85 */ return(ERR); } } else { /* else added 4/85 'cause efile doesn't return*/ syscopfn(args,wfilename); } if ((file=sysopen(wfilename,"r"))!=ERR) { sysclose(file); fmtsout("File exists: Overwrite?",0); if (yget()!='y') { return(ERR); } } if ((file=sysopen(wfilename,"w"))==ERR) { return(ERR); } writefile = file; return(OK); } name1(args,filename) char *args, *filename; { args=skiparg(args); args=skipbl(args); if (syschkfn(args)==ERR) { return(ERR); } syscopfn(args,filename); return(OK); } /* the fo==NO) { fmtcrlf(); putline(databuf); } else { return(0); } } continue; } if((flag==YES)&&(from > to)) { col=n; while(col>0) { if(amatch(databuf,pattbuf,--col)==YES) { return(col); } } } else { col=0; while (colMAXLEN-1) { message("new line too long"); return(ERR); } if (*newpat!='?') { newline[k++]= *newpat++; continue; } while (*oldpat!='?') { if (*oldpat==EOS) { message("too many ?'s in change mask"); return(ERR); } oldpat++; oldline++; } newline[k++]= *oldline++; oldpat++; newpat++; } while (*tail!=EOS) { if (k>MAXLEN-1) { fmtcrlf(); putline("new line too long"); fmtcrlf(); return(ERR); } newline[k++]= *tail++; } newline[k]=EOS; return(k); } copmov (args,mode) char *args; int mode; /* 0 copies n1-n2 to n3 */ { /* 1 moves n1-n2 to n3 */ int i,j,k; int fstart, fend, tstart; if (mode > 1) { return(ERR); } if (get3args(args,&fstart,&fend,&tstart)==ERR) { return; } if ( (fend < fstart) || } else { fmtcrlf(); return(YES); } } message(s) char *s; { fmtsout(s,0); fmtcrlf(); } /* new: get three arguments */ get3args(args,val1,val2,val3) char *args; int *val1, *val2,*val3; { if (*args==EOS) { bargerr(); return(ERR); } if (number(args,val1)==ERR) { bargerr(); return(ERR); } args=skiparg(args); args=skipbl(args); if (*args==EOS) { bargerr(); return(ERR); } if (number(args,val2)==ERR) { bargerr(); return(ERR); } args=skiparg(args); args=skipbl(args); if (*args==EOS) { bargerr(); return(ERR); } if (number(args,val3)==ERR) { bargerr(); return(ERR); } return(OK); } get1arg(args,val1) char *args; int *val1; { args=skiparg(args); args=skipbl(args); if ((*args==EOS)||(number(args,val1)!=YES)) { bargerr(); return(ERR); } else { return(OK); } } get2args(args,val1,val2) char *args; int *val1, *val2; { if (*args==EOS) { bargerr(); return(ERR); } if (number(args,val1)==ER (fstart <= 0) || (tstart < 0) || ((tstart>=fstart)&&(tstart",15); if ((file=sysopen(locfn,"r"))==ERR) { fnferr(); return(ERR); } sysclose(file); for(i=0;(locfn[i]!='.')&&(locfn[i]!=0);i++) { back[i] = locfn[i]; } back[i++]='.'; back[i++]='B'; back[i++]='A'; back[i++]='K'; back[i]=0; unlink(back); rename(locfn,back); fmtsout(back,20); fmtcrlf(); return(OK); } putline(s) char *s; { outxy(0,SCRNL); putdec(bufln(),5); fmtsout(s,5); outdeol(); } yget() /* NEW 4/9/85 */ { fmtsout(" (y/n):",0); return(tolower(syscout(syscin()))); } ltrunc() { message("line truncated"); } fnferr() { message("file not found"); } nfaerr() { message("no file argument"); } nrfile͕ |1:i͌G|N1:i|1:ESS :i|O!"U!":EY7|h!F*F|x U}2 *|J * #i] : i?i#ij *#"*| : i?i#iʋ !" : i|² yC!" " " É : i| É : i| ͪEͬS É : i| [:* | *+"() { message("no read file"); } bargerr() { message("bad argument"); } oops() { message("bad line number"); } bufclrd() { message("buffer cleared"); } wait() { pmtmode("WAIT..."); } ij* !7M!ͲP!" 4QxP!! P!*!!Pͤ;7͊^!" !"!"͍I!|* |†* ø " "  " !gR!" iço" !9*******!"SS!| U}2:i @#|9y:`S 3H`S !"""""""!O9 :E!"!K ͬSÉ : i͕ +|~ !" É : i<>!" à !9i|¬ ! !9ḯi ! !9ḯi ! !!9* * * * * * * !" Iͷ^" P" * * i#" !|!!P!:P!!gR!,9!͆xP4`S!{9!.9i}!{9i?i!}9i?ii|-ͷ^* +i ͍I* !!d!* P !ͷ^!!!!z"Xi*ͷ^**!*<0!9!jY|#**!*<0**PSS !"!gRU}2:iGU}2:i͕ |:i|:i!AÝ:i!Aoͦ7o!!A|»ͦ7o!!A|ͦ7*?i!!Ao!!A|ͦ7o!!A|ͦ75*?i5!!Ao3H`SoNoiTtTf$ewEW8dA*|ʃ!K!"SS :i}2!gRU}2:i͕ |:iF|N:i|yCSS :i}2!gRU}2:i!9!M|'!,9B!9!R|K!,9!Ͷ0!9!W|o!,9!Ͷ0!9!\|ʑ4!,9'!9!a|ʰ!,9; !9!e|!,9&!9!|!* !!*<*:*8ͷ^"@! 9i!:!<v,#|"8":"<">"@*:">*<*>Wi !7Mͽ-+|´ !7M*>#">+^+| d|a_ !M!Qc"8*8!PS["89i}""3!9i?i!9i?ii|ʒ*̈́iҏ!9iPPVQ*+"#!"**giʏ*#"+! 9iiPf8!9i|¿!9iPPVQ!"8!9i#i!9i gi!9i?iii|é8*!9iOgi8*#"+! 9i!9i}!9iPé! 9i*6 *L!U!bU*L0ẍ́iy*L#"L+b!U!dU"LVED 3.30 4/12/85 no modeedit: overtypeedit: replace /:/... ?:?...edit: goto: edit: deleteedit: findredit: findledit: markcontrolcommand:1,$ 1,$past end of bufferchangelistmovecopyfindputsavesetainoaisetwwnowwgetclearbakopenloadnameclwrtclrdcledittabsreadcommand not found!}2!}2!}2!}2!"""!9****!9i! 9Ϳ%#|*8M6 !M!NxPÓ!7M*@^x!9*9 *7 *5 *3 *1 */ ͷ^"3 !l9i!5 !7 v,#|˜ "/ "1 "3 "5 "7 "9 !^9!>5*!9!͆!9x-"/ */ HW#| z */ !9mW! 9i| ͯ4z ! 9!N5JV"1 #?i!z *5 ^#|!*1 ͂Vz d?iͷ^*7 Xii|ʂ!!M!Pc"9 *9 !PS["9 *1 !M*9 ^#|s!Â!_#|!Â!!*3 ^*1 ͂Vz !9*!*!*!*̈́i!!P5*"!"!"!!9!9i!9Ϳ%#|!!!9i|!ͯ4!ͽ*| "!!9!4JV"!#?i("ͦ4!!9!mW*!"!ͷR!}2͊^!*Z"*X"*V"*T"*#|‰"͸4"T""V""X""Z"!ͷR! 9i!X",#|«"x"*X"̈́iں"x"*X"|"ͽ*|"x"4Q!!P͊^4"!>^#|"x"!"Z"4*X"*Z"Wi#*Z"#"Z"+*!M!P͋]"T"Xiʪ#*T"̈́iO#͝4!P"T"!M*T"`#|›#!^!ͷ^)["V"*V"!!d*V"^x"_#|§###*͂V!"!}2!ͷRͿ^##!^!ͷ^)["V"*V"!!d*V""""!9!9i|+ͯ4!9!4JV"#?iIͦ4_#|U!ͷ^)["*!M!P͋]"Xi*̈́iҜ͝4!P"!M*V`#|²_#|¾*#"+i*͂V*!!d*^!9* * ************!""" " !b9i!!v,#|³""""""""""""" " !D9!4!N!m9!͆xP!m9i|u!m9i|;!m9#i|!"!m9*~5!m9**#"!o9i}!" !m9"`S!4!N!9!͆xP!9i|Ž!5!N!" í! 5!N͂4|­!"!5!N͂4|!"xP**Wiwͽ-+|xP!5!Nw*#"+^#|wd+|a_w!9!Pc"*?i:*#iC* #iT3H*+"#*!PS["!9*6!""*+"#̈́it!9!o9*#"+ .+|f!"* ?iʺxP*|ʭ*L"!"L!9S4*"LxP* ?i!*!P*""^x"!9h$#|"$!!9!9i!9Ϳ%#|F$ͦ4!$T$!9!mW$!*!}2*̈́iҀ$!e5*!h$#|‹$!9i!Ͱ$#|£$!S*$*$!9! 9i$-i!9! 9ix-i!9ii|;%:i|/%!!9imW!!͵2#|,%!"$"$8%ͯ4!!%P%!9i!9imW!9i!4JV"$##iʒ%*$͂V!t5!N͂4|ʒ%!!%!9i!N5JV"$#?iʳ%!!%*$"!!%!9!9i$-i!9!9ix-i!9iHW#|%!!9i!9imW!*&*&*&*&ͷ^"&*#|V&!5*"&"&"&"&! 9i!&!&v,#|u&E&*&*&hiŒ&*^*&hi#iʫ&4!"&"&"&"&*&^#|&*͂V!"!}2!SØ&d?iͷ^*&Xii|<'!M!Pc"&*&!PS["&*!M*&^#|-'Ø&_#|9'Ø&&*&+?iI'd#i]'Ϳ^!5*e'!5**&^Ø&*#|ʝ'*͂V!"!}2!}2!ͷR*#|'*͂V!"!}2W$!S!9*'*'!W9i!'!'v,#|("'"'!Qi+ù/*.#".+!9i!9i#i+i}! 9i#i+! 9i#i+I/*.i|ʖ0*.̈́is0xP!5S4xP!o/*.#".+!9i*.#".+i}H0!9i*.6*.o/*0*0*0*0*0*0!9ḯi0!"0"0"0"0"0"0!9i!0!0!0+#| 10*0*0gi61*0Wi#iE1*0gi#ie1*0*0Xib1*0*0gi#i#i†1!9i+?iʃ1*0*0+i#i#iʒ140*0^*0ͷ^S["0*0^d|ʽ1a_*0ͷ^S["0!"0"0*0*0i*0Wiʫ2!9i| 2*0*0*0^2*0*0^d|#2ë2!M!Pc"0!9i|P2*0*0#^~2ͦa*0*0giq2*0*0#^~2*0*0^!M*0V`*0#"0+*0*0giʨ2*0#"0+10!9*2*2*#|2!6*!"2"2!9!$9i|3!&9i!9Ϳ%#|3!2%3!&9i!9mW!9i|:3ͯ4!2!9!N!6!N!9!4JV"2#?iv3ͦ4!2*2͂V!"2!9*2i#iʩ3!9*2i#i#i3ý3*2#"2+Ä3!9*2!9*2i}ò3*2#"2+!96.*2#"2+!96B*2#"29!4!N!9!͆xP!9i|@(!"'"'!Q9!9!mW*'+*'!j(0(*h(*f(*d(:i|“(!"d("f("h(! 9i!9iIiC*ͽ-+|´(C*! 9i! 9ihi(! 9i#i+d|(a_C*)! 9i+i#d|)C*! 9i^#|)C*!M!Pc"h(*h(!PS["h(*h(M6:i|ˆ)!M!! .+|…)!9i|)xP!MS4Å)!Ä(Ó(!9i+?iʩ)! 9i! 9igi#i)*h("d(*d(̈́i)!M!*d(+"d( .+|)*d(Ä(õ)@*!"d(*h(*d(gi@*!M!*d(#"d(+ .+|=*!9i|6*xP!MS4@*=**d(+Ä()Ó(!9i+|Y*!Ä(\*xPÄ(*_*!9i!_*,#|‡*!" "_**_*" Â***!9i!*,#|²*"***ͲPí*ͻ^|*!!5!N`S͂4|*xP!5*!*xP!!9i!NxP!9ii|*+4!!9i!9ijY#|L+4!!9! 9i$-i!9! 9ix-i!9ii|Š+4!!9i!9ijY#|¬+4!!9! 9i$-i!9! 9ix-i!9ii|+4!!9i!9ijY#+!96A*2#"2+!96K!9*26!9͆X!9!9*X!9!NxP!2!!Pͷ^!́[!9i!NVQ!6!NUU/Y!!6*!06*!?6*!P6*!]6*!j6*!z6*!6gRrsearch mask ? change mask ? Delete-global? verify?Interrupt.. (ynq):Interruptedenter file namewread file still openwritefile openFile exists: Overwrite?file not openedbuffer savedOKBuffer not saved: proceed ?cancellednew line too longtoo many ?'s in change maskwritefile still open==> (y/n):line truncatedfile not foundno file argumentno read filebad argumentbad line numberbuffer clearedWAIT...!}26!"77͍I6I͐7!"57*176i?i~7*176i?i#iʋ7!Ï7!!"17!PP*7*37*17+iʼ7"7!"7!"57*17*7*37hi7*76*17*76i}*7#"7+7*| ,4!!!9!9i$-i!9!9ix-i!9ii?ia,!9i!9ijY+#i#iq,4!u,!!9ii|Œ,4!!9i!9ijY#|®,4!!9!9i$-i!9!9ix-i!9ii|,!9i!9iii!!9i!9ijY#| -4!!!9ii#i!9ii#ii!9ii#ii|p-!9i#i+$-!9i!9ii?i-!9ii?i#iʳ-!9i#i+x-!9i*-͐U"-*--!"-`SU|-!-!-.i-- --*.!".!9i*.i|.!9i*.i! 9i!9ii+ii.*.#".+!9i#i+.!9i*.i?i! 9i!9ii#ii|ʶ.*.#".+!9i#i+.!"..!ù.*.*.*.!".!9i*.gi/*.#".+!9i!9i#i+i}.!9i".! 9i".*.#".+i|I/*.#".+./! 9ii|H0*.̈́i~/!5*!".".".! 9ii|ʹ/*.#".+!9i! 9i#i+i}I/! 9ii|0! 9ii|/!5*!o/! 9i#i+!9i# 766!"77*17"376I÷7*8!"57*77?ir8!"8*86i|o8R8*8#"8+58*86i<>#|l8"8G88!9i|ʄ8CÇ8̀D!"8*86i|8ê8*8#"8+Í8*86*86i}ß8*8"37ͦa+#i8!6*37V`+#i#i8g86Ig8*8I+|9"8P"8 giN9*8gi'9d?i#iK9_+|@9!"8*8#"8+9À9*8hi`9d?i#iʀ9a_+|u9!99*8+"8#N9͍IsI*8P99;*9!9i͕ +|²9"93*37*17Xi9!9i<>ì9!9*176i}*176!9i}!6*17*37bM!6*37M"9*9̈́iG:*176!9i}!6*17*37bMU:!"57*17#"17+6Iì9*17̈́ip:yCy:t:N*w:*u:sIPhiʦ:P+PP"u:"w:!"57*176i}26!}26!"77*37*17+i:*17|:Ý:*17+"17#*37+"37#6IÝ:*17"u:*37+*u:gi*;*u:6*u:#6i}*u:#"u:+:*37+"37#6IÝ:*8;I+|Q;!"8;!9i*8;gi;d|p;!J;_+|;!J;#I|ʫ;*8;#"8;+ͷ^eJ!!Pý;!9iP#P!9i+|;;Q;͍I*37"17!9isIS[PPP!J"17!C_+|DC!6!V`+|%DC͍I#I|LDͷ^eJsI!PxDP"C!U!U!EUsI*C#PC*~DI+|ʒD"~D!6!V`+|ʨDÍD͍I.I|Dͷ^ͥJsI!PDP"~D!U!EUsI*~DPÍD!"17!"97*37*17gi6E*17#"17+6i|0E*97#"97+3E6EE*97sIPhicE!OP#S[PPãEsIPgiʁEsIPPãE*37*17giʣE*17#"17+sIPP*E*E*E!"57d|E!6*17V`+|E"E"E"EE!6*17̀b+|EE*37"E*17"E*17"37!"176I!"17*E*EgiMF*17#"17+6*E#"E+6i}F*17"37!"17_+|eFE!6*37V`+|{FE#I|ʟFͷ^eJ!!PFP"E!U!U!EU!*E#P6IE*F*F*17"FP"F*37+*17XiG!"F"F*17#"17+*37*17giuG*176i!9iJ|@GuGrG*37+*17XijG*F"17*FPP!FrG*17#"17+GsIPP!F*G*G*17"GP"G*17|¶G!"G"G*17+"17#*17̈́iH*176i!9iJ|GHH*17|H*G"17*GJ;*ͷ^̈́i>ͷ^!!dsI!P2>!!!dsIͷ^P!*:>*8>*6>*37̈́ii>N!"6>"8>":>*37*17+isIPhii|>PsIi"8>*37*8>"37*8>+"8>#̈́i>*17#"17+66 ß>*37"17*37"8>*17*8>hi>*8>6*8>+6i}*8>+"8>#>*176! 9i}*17#"17+*37#"37+!6*17+*37bM!6*37M"8>!O* i*8>hiW?*#iʑ@*37*17+is?!":>y?*17":>*17+*37)["8>*8>hi*8>6i#ii*8>6i#ii|?*8>+"8>#Î?*8>|?NZ>*8>"6>*37+*6>gi@@*6>#"6>+PP!ëGH*17+"17#þGsIPP!ëG*1H*/Hͦa+|MH"/H"1H!"1H*37*1HgiʆHnH*1H#"1H+SH*1H6*1H6i}cH*1H66!"77d|Ha_+|ʩHDH͍I.I|ʺH6IHEQ!P+PDH͍I.I|Hͷ^eJ!!PIP"/Hͷ^*/H!*/Hid!*/HPDHP?iP+?i!6!*37bM!6!*17+)[*37NsIPP!O!6*17MS[*I!"17!"57!6!Pc"I*ḮiI!LR!P"37I*I"37!6!*37bM"I*57|I!!"57d|J!6*37V` J!6*37̀b!"17*37*17giaJ!6*17M!9ihi[J*17#"17+^JaJ'J*17gQ+|ŽJoQ!9i!!däJ!9i!!dkQ+|JͅQ!9i!!dJ!9i!!d!9i+|K!9i?i K!9i?i#iK!L!9i++|TK!9i#iGK!9i#i#iQK!L!9i+++|K!9i0gi“K!9i9hiʐK!9iAgi#i#i¹K!9iZhiʶK!9iagi#i#iK!9izhi#iK!L!9i|_L!9i0XiL!9i?*6>6*6>#6i}?*8>"17*37+"37#ͪEͬS*:>̈́i@@<Î@*8>*:>hij@͐7*:>+":>*8>gig@:EP@Î@!!<*:>+":>#̈́iҎ@:Ew@@*8>Ohiʣ@*?i#iʸ@[:N!Z>@!"576IZ>*@d|@"@I+|@@!6!Pc"@_+|@@*@6!P*@ic*@"@*@OhiEAa_!6!Pc!"@a_+|QA>A*@"37!"57I+#inA_+#i#i{Aͦa+#i#iˆAa_+#i#iʑA>AP"@ͷ^*@!*@id!*@P6I>A*A*A*A*A*A*AP"A*17"A*37*17+i!B!"A"A"A"A"A"A!"57!"A*17*A*37XiʠB*17*A6i!9iJ|gBàBÝB*17*A*37+iʕB*A"17*APP!BÝB*A#"A+-B!9i++|¶B*A#"A+*17*A"A"A!"A!9i+|B*A6i|B*A#"A+B*37*AgiMC*A*A*Ai6*A*Ai6i}*A*Ai6*A6i}*A#"A+B*A*A66!"77*37*Ai"376I!B*wCsIPhiʦC!P+)[PPC*17|C*17+"17#sIPPCN"wC*Cd|C!6*37V`+|C"CDI+|D 9Wi#i,L!9iAXi)L!9iZWi#i#iRL!9iaXiOL!9izWi#i#i\L!L!9i!9i+i{L!L!line truncated!9i+|SM!"L!P"L_M!"L!O"L*`M!"L!9i"`M!9i*`MgiM!9i*`Mi|¢MM*`M#)L*`M)Li! 9i*`Mi*`M)Li͇Oi*`M#"`M+vM"`M!9i)Li*M!9i)Li*LWi"N"M!9i)LiPP!9i!9ihiN!9i!9ii|pNN!9i#)Li*LgiʍNN!9i!9ii!9i)LiO!9i#i+;N!9i)LḯiNVQN;*N*N!"N!9! 9i#i+i}|xO!9i|'OxO!9i*N͇O"N*N*N!9i*LgiYOxO!9i*NO*N*N"NN*N"N"N3!9i|²O!9i*L$j*LiO!9ḯiO!O!*O!9i|P! !9i͇O"O*O+"O#y$X><X$Xx$X~# X!9!:9i!9X!!́U!!9́U!89i!9X!!9́U!69!9!&9i!9X!!́U!!9́U!!9́U!$9ypdisk write failedno filename!9iagi!9izhii|"Y!9i.Y!9i!9iAgi!9iZhii|]Y!9iiY!9i ;!9i6#6!9!9i#i+i}!9i|³Y!9i6#6>!3&[!9i|Y!9iͷ^i!îY&[!9i|pZ!9ii3Z!9i*iGZ!9i*iGZ!9i*iGZ!îYGZiYaZbZc*Z!9ii|gZ!o^*!îYmZ!îY&[!9i0gi!9i9hii|ʜZ!îY&[!9i!9ii!9!9i#i+i}| [!9i0gi!9i9hii|Z [!9i!9ii j!9iiòZ!îYîY!9i!9iWiJ[!9iR[!9i!9i!9iXit[!9i|[!9i*[*}[!9i!9! \"[!"}[*[*}[gi[*}[#"}[+!9iUî[*["}[*}[#"}[+!9ihi[! U["}[hiP! SPONP!9ḯiBP!^SP!9i@SPNP!9iSP"O*L+|kP!9i*VwP!9iP*L+|”P! *V! *VñP!!P! U! U!!9i)["L*P*P!9iU*P#"P+!9i!9i"P!9i"P!U!=U!9i U!9i U!U!*U!*PPVQ!U!tU!!!!P! U!!P!U!EU*R*RP"RP"R9U!aU!N!9i!NU*R*RP"R"R*eR*cRP"cRP"eR9UVQ!Q͍T!RT!9i6T*cR*eRP"cR"eR*R*RP"RP"R9UVQ!9i͍T!RT!Q6T*R*RP"R"R*S*SP"SP"S9UVQ!Q͍T!9iT!Q6T*S*SP"S"S!jUgR*^S*\SP"\SP"^S9UVQ!Q͍T!RT!Q6T*\S*^SP"\S"^S*S*SP"SP"S9UVQ!-!P!rU!-N*S*SP"S"S*S*"[*\*\*\* \* \!9i`]" \!9i6!"\! 9i*\giʖ\*\#"\+!9i* \! $j0}* \! $j" \* \|“\Ö\F\! 9i*\gi!9igii|\*\#"\+!9i6-*\+" \*\+"\#!"\*\*\giF]!9i*\i"\!9i*\!9i*\i}!9i*\*\}*\+"\#*\#"\+\* \" \" \"\"\"\!9ḯi~]!9iiÆ]!9i*]*]!"]!|^! 9i͔V"]*]#|]!"]"]*]##|]!ü]*]|]*]ü]!9i*]gi^!9i#i+*]}*]#"]+Ù]ü]!9i+i#hi]^!9i#i+i!9iV#|Z^!^! !9iVmarker not set!"~^!p"^"^CV$"^!"^!"^! }2p*^*~^!"~^*^*^i!9*^#!9iS[i!9!!9i)[i*^!9i+i_!!9i*^hi:_a_#|7_!_!9i*^gi[__#|X_!:_!*__*^"__d|}_!"__*^+"^i|ʤ_!HhR*__"^!v_*^+"^i|ʺ_ä_*^#"^+*^p͜i_!ZhR*__"^!v_*^+"^#!v_*_*^"_d|SP"SP"S!9i6T!9iP͆"S"S*4T!-!P!9i!-N!"4T*4T#"4T+Q!9i#i+i}|ʆT^T"4T*T!!P!9i!N!"T*T#"T+Q!9i#i+i}|TõT"T*T!!P!9i!N!"T*T#"T+R!9i#i+i}|4U U"T!!P!zU!Nͷ^!́[ ERROR: edit: INSERT:line: o&*U!!́U"U*U|¹U!"UÿU*UïUïU*U!!́U"U?iUU*U"U!!9íU!9i͕ +|!V!^!9i )V!9i!!9íU!9i*+*HV!9i!9i2m"HV?iyV!"HVV*HVoVoV!9in!*V!9i͡n"V#?iʻV!"VV*V|V! ñVV*V&}oñVñV!9i|W! !9i&o#|W!XR!GW!9i!9i&o#|?W!XR!GW!9i!9ii|fW!X*!jW!*kW!"kW*kẄ́iW!9i*kWi|WWW!9i*kW!9i*kWi}*kW#"kW+wW!9i*kW6"kWyW> ̀k> !&mͧl:k4lk2k_~9l Nl Jl ! Wll`lo&!*k&o> !*mͧl} l > _con:rdr:pun:lst: ڹll_~O7`l !"# !l  Tm#Ami& ~=m!l~sm#emÎn~#F6,6pw#62mmi!9iy=pʎnyp>wm<ʎn!ls w#6 w+w ~# n͈ks#r{ʎn{ /n!*mͧl#^{!!l~<ʎn6͓n!l~rʀn!lN!li}n*lybon>w#hn%!=yn)ͫo{=pbnx ʡn`lʡnh&{ ͓n!m~!lN#F{p+pH#n6osl Dovl+!9~ no!l~bko!ho5io> no6> *l w`i#i᯾œo%,!ͫo|!!9n&:ho&oɯ2ap>o!9i):ap|!lwo#4!lw>2ap>2o:kkbpxNpi?id*cc!9i*c*^*ci}*c#"c+c*^*ci#iXd*c#"c+8d*cc!9i!9ii#!9i!9i!9iW!9i!9ii#!9i!9ii! 9iX*^*^hi*^*^Xi*^+?i*d*d*^"d*^"d!9i+i#hi@e!! 9i#i+P! 9i#i+Wed*d"^*d"^"d"d*Ue!9i^#|‚e!h!NVQ"Ued|ʐeVQïe*^!N"Ue*Uë́iگeVQ}e*^!9i*^͊ie!hR!*^*^+!9i^d*^!9i"^!*^!9i*^͊iFf*^*^+!9i^d*^!9i"^!h*!*^*^+!9i^d*^!9i"^!*vf*tf*rf*pf! 9ḯiڴf!"tf*tf"pf"rf"tf"vf! 9i^#|f!"tf*tfáf*^"pf!"rf! 9i"vf*rf#"rf+! 9iXi g*vf#"vf^#|g!"tf*tfáff*^*pfi"tf*tfáf*7g*5g*3g! 9i!9i+igg"3g"5g"7g! 9i! 9ixf"3g?iʈgZg! 9i^#|gZg*^"5g! 9i^#|¸gZg*^"7g*^*3g*^͊ig!h*Zg*3gͲe#|gZg!^*^!9i:oOp! DMo:oNp4p !TpWrite error - Disk full $`iiõo!!9~=+pV+^+F+N "p> w+ ‚pw w##w w #~+:­p~##p@~#.ʾppíp*p++pw#p=a O! m ~_#V!$͈kr+sbk#|p DOCUMENTATION FOR VED33 COMMANDS -- APRIL 12, 1985 ------------------------------------------------- /* NOTE: x,y,z stand for numbers. Also note that the following substitutions can be made: .= the current line, as indicated in the upper left $ = the last line of the buffer 'a,'b, and/or 'c = the lines marked by markers a,b,c. Thus, ['a,$ move 'b] would move all lines from a to the end of the buffer to the position just after line b. */ COMMAND MODE (may be entered upper or lower case) Command Examples Function/Result (no prefix) 27, 'a Go directly to line, enter edit mode. ^E Enter edit mode. setai, no ai Autoindent on or off (default is off). setww, noww setww 0 Wordwrap on o"^! 9i! 9ihi.h*3g*7g*5gXEh*3g*7g*5g*3gXZgbufup: missing CRbufup: bufp underflowbufdn: bufp overflowdisk error: line deletedmain buffer is fullCaution: main buffer is fullinsufficient room in buffer for copy or movedlóki}o|g}o|g}o|g|!,|}!=i=i,ɯ|)i!|}!-zii{ti!,zzizti{!-|!xi|g|’i}!Қi-ɵz¤i{!-||g}oëiíi)þi{ozg+|/g}/o~og~#fos#rN#F#xj~#~#ii`iDM!z>jS\))j =jɯ/jzi|iMD!xHjjS\>))Pj# Xj =Hjii*+%"l%"l%"l "m "m " my 6"k+6+hj!p͜iʩj"k!^6 F+N+j!* !kj!9~#k jO"j'j +}|+#~jj6#~#<1k>Ck!ij4j6#6*ij!kj*k|.kn!?k2m"AkNkr!k2m"k[kjhk Can't open > or < file.$"kw*k ͜i£k! 9͊i!"kp*Ak͡n*:k<*k 2k kk ʀk k> _*k~+ r off (default is on); with an argument, changes the default auto-return zone from the default (8). bak bak file.ext Moves file.ext to file.bak; unprotects if necessary. change x,y change Make indicated changes in all lines from x through y. Asks for search pattern and verification. Note that global changes all, non-global only first time on each line. .. **Typing ^Y for "change mask" will DELETE lines containing search mask. The special pattern "^$" for a blank line is recognized. clear Clears the buffer cledit Clears the name in the edit (e) buffer. clrd Closes the read file clwrt Closes the write file copy x,y copy z Copies all lines from x through y to the buffer position just after line z. delete x,y delete Deletes all lines from x through y inclusive. e (edit) e fn.ft Opens fn.ft, reads it into buffer, saves the edit junk.a file name for "write" (which see). f (file) f Echoes the filename saved by "h forward for pattern "p" ?(p) search backwards for pattern "p" n repeat the last / or ? pattern search in the same direction N repeat the last / or ? pattern search in the opposite direction (note that n will continue to search in the same direction as the original / or ?, while N will reverse the original sense. N and n can be used to search back and forth as long as you want. f(c) go right to character c F(c) go left to character c t(c) go right to just before character c T(c) go left to just after character c e go to end of current word (only alphanumericals counted in word) E go to end of "big" word (all non-blanks counted as part of word) b go to beginning of current word B go to beginning of current "big" word w go to next word, "word" separated by any non-alphanumerical W go to next word, "word" separated by blanks (NOTE: the distinction between "words", made up only of the letters a-z,A-Z and numbers 0-9 and "big words", which are separated by blanks, is ae". (see "w"). "cledit" clears the saved name. find x,y find Asks for search pattern and lists all lines from x through y that have it (old "search"). get get more.c Reads in file at present buffer position. list x,y list Sends named lines to the printer. load load junk.a Opens readfile, tries to read whole file into the buffer (with "rest"). mark mark a Marks the line as a, b, or c. Note that ANY change to buffer clears markers. move x,y move z Moves all lines from x through y to the buffer position just after line z. open open junk.a Opens file for reading into buffer. put x,y put Writes named lines to another file. The editor asks for the filename. (See "get"). q (quit) q, quit Exit from editor to operating system. read read n Reads n consecutive lines from the opened readfile into the buffer (see "rest"). .. read $ Tries to read the rest of the readfile into the buffer (used to be called REST). save x,y save Appends named little incovenient for text sometimes, but very convenient in programming languages. Note that these definitions are also used in "delete" searches (see below). m(a) mark current line as a [m(b), m(c) also allowed] a append at cursor A append at end of line i insert at cursor I insert at beginning of line r replace character at cursor R overtype until ESC is typed (NOTE, BS will NOT erase in this mode. o open a new line below current line O, ^O open a new line above current line J join line below to current line (split) to split a line, insert or replace a blank with a x delete character at cursor X delete character to left of cursor (BS) backspace does not delete in edit, backs over characters. ^Y erase current line (dd does the same) D delete to end of line (d$ does the same) C (change); same as D above, but returns to insert mode. d(fn) "d" begins a delete command that takes as its argument (fn) the search right strings w, W, e, E, f(c) and t(c) described above buffer lines to the writefile. "1,$ save" saves all, clwrt will then close. tabs tabs n Sets tab spacing (default is 8) w (write) w file Opens writefile, saves, and closes it; write junk.b asks to overwrite if writefile exists. w If writefile is open, "w" by itself will save the buffer and close the writefile. If file was opened with "e", "w" by itself will move file=>file.BAK and save the buffer to the original name (file). "f" will echo the name being held to write to (if any). "w xxxx" will ALWAYS write to file xxxx. EDIT MODE (case is important) : go to command mode 0 beginning of line ^ first non-white on line $ end of line h,j,k,l cursor movement (left,down,up,right) arrow keys duplicate these. ^^ (home) alternately move to upper left, lower right of screen ^U scroll up half-screen ^D scroll down half-screen ^F page forward one screen ^B page back one screen g(n) go to line n ('a,'b,'c or $ allowed) /(p) searc . In addition, dd deletes a whole line, d$ to the end of line. c(fn) (change); same as d above, but returns to insert mode U, ^X restore previous edit line from buffer ("unerase") (only works if cursor not moved to new line). p put last erased (char, string, line) after cursor P put last erased (char, string, line) before cursor (note that xp transposes characters, ddp transposes lines) P and p use the killbuffer, which only stores the last erased character, string, or line. If you use p and P to move words or lines around, be careful not to overwrite the killbuffer. INSERT MODE In insert mode, BS deletes to the left of the cursor, DEL does nothing. The only special commands in insert mode are: ^O open a new line above the current line ^V make the next character a literal one (used to write control characters into a file). OVERTYPE MODE ("R" mode from edit). "R" mode was never meant to be a normal mode of the editor, and is used only infrequently (si VED -- a "VI"-like Adaptation of the Dr. Dobb's Editor Gene I. Rochlin Energy and Resources Group University of California, Berkeley This project started when I got a copy of SIG/M v.76, which contained an adaptadinn (b`Lan D& Howard) of Edward K. Ream's C-Screen editor ED. Since I am an old UNIX user, who still regards VI as the paradigm of no-fuss editor, I first began by adapting the edit mode cursor movement commands to be vi-compatible. This began a process of modification and adaptation that led (through several generations -- hence VED6) to the present version. VED33 as it now stands is strictly a personalized editor created for my own convenience. I have no particular urge to adapt it further for general public domain distribution for a variety of reasons, the most important of which are: (a) large files can be handled only by the very indirect process of reading them in, altering them, and writing them out in segments; and, (b) there are few "safety" precance c(fn) lets you change words or strings without worrying about conserving length. You cannot back up and correct in R mode. ------------------------------ OTHER NOTES A. P and p With The Kill Buffer. Because I often use "xp" to transpose letters in correcting files, I have let the killbuffer store single character deletions as well as strings and whole lines. This can be inconvenient if you are trying to move a word, phrase, or line by deleting and going to a new location. Do be careful, or you will lose what you wanted to move. However, a few simple patches to the program will remove the single character store to killbuffer if you want to disable that particular function. B. Working With Long Files Using Read and Save To work with a long file, first "open" it for reading and name it for writing, then do "read n" to get the first n lines into the buffer. Do not close the readfile. Do not close the writefile. When finished editing this batch, save it to the writefile (must utions to prevent losing files from time to time to CP/M errors or if there is a momentary glitch. The first of these may not matter much for those using the editor to write C-source files, since files up to 30K can be fit into memory if you have a 64K CP/M system. (Actually, the file limit is about 28K, but since the buffer stores only "0D" (CR), disk files (where CR is mapped to CRLF) can be somewhat longer. I have tried to mitigate the second problem by including a "bak" command that moves the named file.ext to file.bak, which allows for making a backup copy at will. In addition, I have included a new program called VR33 (for VRECOVER for VED33) -- both .C and .COM files. VR33 starts at MBUFFER (70FD in the version on this disk), saving to file everything up to the first non-ascii character, mapping CR to CRLF as it goes along. Note that if you were working on a long file then accidentally "quit" or got a disk write error, VR33 will not only recover the shorter file. Since VED doesNOT be the same as the readfile!!) with "1,$ save". Since "read" leaves the read pointer at the last line read, you can then read in the next batch of lines with "read n" again. Since "save" leaves the write pointer at the end of the writefile, you can then save this next batch to the end of the first, and so on ad infinitum. Admittedly, you cannot transfer or copy blocks from one batch to the other. But if you are careful not to close either the readfile or the writefile, you can go on like this all day. C. Deletion with the "change" command. When working with change, the response ^Y (control-Y) to the inquiry for a change mask will request DELETE of lines containing the pattern (with all the usual wild cards) instead of change. The delete command also recognizes the special pattern "^$" for a blank line. Verification is optional (except with ^$, which is automatic).   not mark the end of the buffer, it will probably keep going and recover the tail of the first file. So do remember to VED the recovered file and check it. In the version supplied here, the recovered file will be named VED33.$$$. Even so, the tricky file handling (and the lack of any recovery if the buffer is lost, e.g. to a bried power failure) means that VED33, like ED2 before it, is really a program for the experienced computer user -- which is why I have no urge to adapt it for general distribution. From this point, I assume you have first read through the ED2 documentation so that you have a reference point for the changes. * * * * * * * * * * * * * For the most part, I kept the basic structure of ED2, with almost no modifications to the C-source files (V)ED6.C - (V)ED10.C. The only major change is the addition of two system level commands -- UNLINK and RENAME -- adapted from the C-80 v.3.1 standard library. These were used to create one major new "command" utility -- "--*.!".!9i*.i|.!9i*.i! 9i!9ii+ii.*.#".+!9i#i+.!9i*.i?i"what you see is what you get" editor, the line break may be taken more than one word back -- several words before the cursor sometimes. Auto-indent also works pretty well, but won't indent on an auto-wrap. The forward and back searching lacks the global pattern-matching capabilities of VI; its only wild cards are '^' for the beginning of a line and '?' to match any character. Otherwise it works fine. Changes to File Handling and Command Mode Operation All command line commands (GET, PUT, READ, etc., are case- insensitive and may be typed lower or upper case. You should look through the files VED2.C and VED3.C to see what these are made up of. To save space (VED just kept growing), many of the separate functions of ED3.C were combined into new composite functions with flags passed from the commands in VED2.C. I have included all the original ED2 C-source movbak", which is used to rename the named file args.ext to args.bak (with extreme prejudice, since it removes both SYS and R/O attributes to guarantee the move). This was then incorporated to make major changes to "write" to allow backup for files opened with "e". The other relatively major changes were: (a) the inclusion of a word wrap function adapted from Ed Ream's article on RED in Dr. Dobbs Journal, and a "hot zone" n spaces from the end of a line for auto-return; (b) the ftImn of an auto-indent feature that greatly facilitates writing C and Pascal programs (both of whch can be turned on and off from the command line); (c) the inclusion of line markers for delete, move, change, etc. These are 'invisible' like those in VI, and only three markers can be set -- just enough to order " 'a,'b doit 'c ", where 'a,'b,'c are the editor commands to substitute the number of the line(s) marked a,b,c; (d) the inclusion of a rather elaborate backwards and forwards search program for efiles on this disk so you can make a comparison. For the most part, I elected to keep the options introduced by Alan Howard to ED2, although many of them were renamed for my own convenience, and some of the functions (in VED3.C) were combined slightly differently to alter the mix of command-mode commands (in VED2.C). New is the "movbak" command, which is incorporated into write via a special edit file name buffer. When you open a file with "e" or "edit" (as in edit file.ext), the name is saved to the buffer. When you then call "w" or "write" WITHOUT a file name, the original file is moved: file.ext => file.BAK, and the new buffer is saved to the original file name (file.ext or whatever). This is handy for saving to disk periodically, which is always good insurance! SETAI turns auto-indent on, NOAI turns it off (default) -- note also that the default for TABS is 8 spaces. SETWW turns wordwrap on (default), and activates the auto-return "hot zone" at the default ( 8 spaces from the end dit mode that is modeled on VI; (e) a "killbuffer" was added to save the last character, string, or line deleted. This can be restored by using one of the "put" functions, "p" or "P" in editmode (see below). (f) the "change" command will now let you delete lines containing the search mask pattern (type ^Y=control-Y when asked for a change mask). It also recognizes the pattern "^$" for a blank line. (g) the command "e file" (edit) will not only open the file and read it in, but saves its name in a special buffer. At the end of the editing session, the simple command "w" (write) without any file name will move the original file to file.BAK, and save the buffer to "file". You can still write to any OTHER file in the middle of an editing session (or even back to the original) by using the standard form "w filename". Only another "e" call will reset the edit file memory. If you want to know what name is being "saved", just type "f" in command mode. After a disk write, "w" will ech of the line). SETWW with an argument (setww n) resets the hot zone to the value "n" . NOWW turns off both word wrap and auto-return. If you need a "narrow" file for an Osborne or wide printing, or columnar copy, or whatever, just set the wrapmargin to a large number (try setww 40 and see). Typing a number alone on a line goes to that line and shifts into editmode. Command line syntax using line numbers has been changed to correspond to VI usage. For example, n1,n2 delete will delete lines from n1 through n2. Note also that '$' always means the last line. "." is the current line (shown by line:xxx at the upper left), and three line "marks" a, b and c are available that can be called as numbers with the syntax 'a or 'b or 'c. Thus, the command: 'a,'b move . will move all lines from a to b inclusive to just after the current line. "GET file.ext" gets the named file and inserts it at the current line. " n1,n2 PUT" will write the named lines to a new file. VED33 will ask for the nace, it will ask before clearing and return if you answer "n". Most useful for new files. "READ n", where "n" is any reasonable number (and not "$"), will always append the lines to the end of the existing buffer without clearing, and without checking whether the buffer has been changed since the last save or write. Thus, to work a large file in pieces as described above, you will have to be careful to save and "clear" the buffer by hand. If you accidentally append without clearing, just go back and erase the piece already saved (if it was saved) and continue with he remainder. "read" will remember its place in the readfile even if a full buffer forces readin to stop. This is not a perfect system, but VED was getting pretty big as it was, and I did not want to add the additional 1K or so it would take for complete "safety checks" of all possible procedures for manipulating pieces of large files. If you are going to do a lot of large file editing with VED, you ought thing about reprogrme (unlike NROFF or some other editors). If the target exists, it will be deleted. If the target exists and is R/O, you will bomb out with a CP/M error! Most important, besides EDIT, are LOAD to open a readfile and get it into the buffer, and WRITE. WRITE has now been modified (and rewrite eliminated) by having it ask if you want to overwrite a pre-existing file with the contents of the buffer. Note please that trying to write over a read-only file will bomb you out with a CP/M error and dump VED. May of the rest of the commands are used for various interesting purposes such as sequentially editing portions of a large file. However, retention of the original command allows intersting things to be done. For example, a new file can be made of pieces of old files by "name"-ing newfile for writing, then reading in the old files (with "load"), editing out all but the pieces wanted, and "save"-ing the pieces into newfile. Remember that SAVE appends the buffer to the file currently opened famming the routine "getit" in VED3.C and recompiling. Changes to Edit and Insert Modes These were very extensive; no description is as adequate as actually working with the editor for a while. If you know VI, you will feel VERY comfortable with VED. As an unfortunate side-product of my developing this strictly as a "personal" editor, however, it has been customized for a Televideo 925/950 or compatible terminal. What is more, not all of the patches are in the header files. In particular, you will have to look through the other C-source files to find things like delete-to-end-of-line strings. I did not implement any function keys (since VI does not), but note that ^V is the "down arrow" key on a tvi925/950, quite unlike most other terminals. If you want to change this, be sure to retain the definition of ^V as the "insert control character" sequence in VED2.C by hand patching. Insert Mode Insert mode works pretty much the same, with ESC used to write the current line andor writing! Files Larger than the Buffer These are handled with a combination of "read n" and "save", but you have to be pretty careful about what you are doing. The BEST way to handle a big file is to read in about 1000 lines or so using "read 1000", work on the piece, open a writefile, and write this batch of lines to it. Since "read" leaves the read pointer at the last line read from the readfile, and "1,$ save" leaves the write pointer at the last line written to the write file, you can just keep up the sequence of reading and writing, building up the edited file as you go. But you do have to be careful not to close the writefile, since VED has no command to open a file for writing in "update" mode (i.e. it does not use either "u" mode or the fseek function). To facilitate file handling in a reasonably efficient yet safe way, "read" works in two different ways depending upon the argument. "READ $" always clears the buffer. If the buffer has been changed and not saved sin  shift to edit mode. The big difference from VI is that ^O can be used to open a line above the cursor without leaving insert mode. DEL is useless, since there is nothing to delete at the cursor in insert mode; backspace erases previous inserted characters. Control characters (and ESC) can be inserted by typing a ^V first (one at at time), which is consistent with VI usage. They are displayed as ^A, ^B, etc. Edit Mode As with VI, most of the cursor movement is controlled by the main keyboard; in particular, one can scroll around the file with the keys hjkl without moving your hands to the arrows or other special cursor keys ( a great convenience ). The major changes are the great extension of the find-on-line and delete sequences, and the elaborated search mode. As with VI, fx goes right to character x, while tx goes right up to it. Fx and Tx do the same to the left. "e" goes to the end of a word, "w" to the next word, and "b" left to the beginning of a word. "E", "W", and "B" aif something should crash, your file will start at that location (MBUFFER). However, the buffer uses only 0D for line ends (and not the 0D,0A pair) until it writes to disk, so recovery may be tricky unless you use VR33. See the ED2 documentation and the articles in Dr. Dobbs Journal for procedures for working with files longer than 28-30K in pieces. Despite its hangups and shortcomings, I like this editor a LOT. It is nearly perfect for writing C and Pascal programs. When used with a formatter (especially ROFF4), it makes a delightful approximation to the standard UNIX VI/NROFF combination for your micro. Althought admittedly only a subset of VI/NROFF, VED/ROFF4 does run on a 64K CP/M-80 machine that is about two orders of magnitude cheaper than a VAX, and probably three to five times cheaper than any micro running a fully capable UNIX-compatible system. Other Details and a Wish List Anything that could be done to make the editor more compact would be helpful, since handlire the same, except the definition of a word is extended to include all other punctuation characters (such as []{}) up to the first blank. This is handy for editing C programs! "D" deletes to the end of a line and, for consistency with some users, ^Y deletes a whole line. Typing a "d" will shift into delete mode, at which point many options are available; "dd", like ^Y, deletes a whole line, "dtx" deletes up to x, "dfx" up to and including x. "de" deletes a word up to the blank, "dw" includes the blank. You can also use "dE", "dW", and "d$" (same as "D"). C and c are the same as d and D, except that they mean "change" and shift into insert mode instead of remaining in edit mode. Several new "undo" commands have been added. "U" will undo all changes to the CURRENT line since it was last written to the buffer. (Moving to a new line writes the screen line to the buffer irretrievably). "P" puts the contents of the killbuffer (the last deletion) before the cursor, while "p" puts it after.ng of large files is a little tricky. I sweated bullets keeping it at 28K with dozens of extensions in capabilities, but some clever work (e.g. with #asm) might do better. The facility for handling files larger than 28-30K is still clumsy. If you are using this with ROFF4 or any other formatting program, or to write C or Pascal files, the buffer size is probably not much of a limitation. I would have liked to integrate this with the buffer routines used by Ed Read to develop RED, so that files of any length could be handled, but that is more work than I am up for so far, and I have no copy of RED to play with, so I don't know how easy it would be to adapt. There are also some edit operations that are far from optimal in terms of execution time in the interest of keeping the code as small as possible to protect the buffer area. This is particularly, and obviously true for word-wrap, which can cause you to lose a few letters during quick typing while it redraws. However, the original ED  If WW is on, the line will autowrap if large insertions are made. If the previous deletion was a whole line, "P" inserts it above the current line, while "p" adds it below the current line. This can be used to move whole lines (but be careful!!). Also "xp" will transpose two characters, while the sequence "dd p" will transpose lines. Words and phrases can also be transposed in this way. For searching, "/" means forward, "?" means backwards, always from the current line. "n" will repeat the last search in the same direction. direction, while "N" repeats the last search, but in the OPPOSITE direction. Other definitions for edit mode are pretty clearly spelled out in accompanying VED33.DOC file. What I could not add without blowing the program up to unmanagable size were extra delete buffers (VI has a bunch) or a delete stack, or the buffers needed to use the VI "repeat last command" functions, such as ";". Other Details The size of VED33 is 70FD hex, or about 28K. Thus,  code was 26K, and this expanded version has already been worked down from 34K to 28K, and I hate to push it back up again. Adapting this for other operating systems is not trivial, since it is not "pure" C, but uses some assembly language calls as well. In addition, the C language used is not standard, but is a C-80 adaptation of a BDS C-program, so that some system calls (such as fopen) are handled by redefinition in later files. For an operating system with more memory available (CP/M-86 or MS-DOS), one could easily implement more advanced "VI" like features, such as named buffers or "stacking" the kill buffer to allow recovery more than one item back. Unfortunately, it does not seem possible to modify for VI's most lovable feature, the "u" undo command which undoes the last command, whatever it was and however many changes it performed. _____________________________________________ Notes: UNIX is a trademark of American Telephone and Telegraph. VED33 (C) copyright 1985 by Gefdn()!=OK){ return(ERR); } ypos++; } } else { while((ypos>1)&&(!bufattop())){ if (bufup()!=OK){ return(ERR); } ypos--; } } edgetln(); outxy(edxpos(),ypos); } edchng(c) char c; { char oldc; int k; if(control(c)==YES) return; if (editp>=editpmax) { edins(c); return; } oldc=editbuf[editp]; editbuf[editp]=c; fmtadj(editbuf,editp,editpmax); k=fmtlen(editbuf,editpmax); if (k>SCRNW1) { editbuf[editp]=oldc; fmtadj(editbuf,editp,editpmax); } else { edcflag=YES; editp++; } edredraw(); } edldel() /* deletes to left of cursor */ { if(editp>0) { edleft(); edcdel(); } else { beep(); return; } } edcdel() /* deletes character at cursor */ { int k,q; if(edxpos() < outxget()) { outxy(outxget()-1, outyget()); return; } edcflag=YES; killbuf[0]=editbuf[editp]; killbuf[1]=EOS; zapflg=NO; if (editp == editpmax) { if (editp==0) { return; } editp--; editpmax--; edredrne I. Rochlin, given completely into the public domain, but without support or any implicit or explicit guarantee of performance or suitability. ED2, VED, and ROFF4 are public-domain programs, and may not be sold or otherwise distributed for profit. /* VED4.C */ /* Feb. 1985 */ #include ved0.c #include ved1.ccc char editbuf[MAXLEN]; char killbuf[MAXLEN]; /* NEW 2/85 == delete buffer */ int editp; int editpmax; int edcflag; extern int WWFLG; /* NEW for wordwrap 2/85 */ extern int WM; /* NEW wrapmargin for "hot zone" 3/85 */ int zapflg; /* NEW */ int tabcnt; /* new 2/85 */ killclear() /* to initialize */ { killbuf[0]=EOS; zapflg=NO; } edabt() /* restores line (undoes changes) with 'U' */ { edgetln(); edredraw(); edbegin(); edcflag=NO; } edwht() /* returns YES if cursor on "white" space */ { if(editbuf[editp]==' ' || editbuf[editpaw(); return; } k=editp; while (k<(editpmax-1)) { editbuf[k]=editbuf[k+1]; k++; } editpmax--; edredraw(); } eddn(oldx,mode) int oldx, mode; { int n; if (edrepl()!=OK) { return(ERR); } while (n < mode) { if (bufnrbot()) { return(OK); } if (bufdn()!=OK) { return(ERR); } if (edatbot()) { n++; edsup(bufln()-SCRNL2); outxy(0,SCRNL1); } else { outxy(oldx,outyget()+1); } if (mode == 1) { break; } } edgetln(); editp=editpmax; outxy(min(oldx,edxpos()),outyget()); editp=edscan(outxget()); return(OK); } edup(oldx,mode) int oldx, mode; { int n; if (edrepl()!=OK) { return(ERR); } while (n <= mode) { if (bufattop()) { return(OK); } if (bufup()!=OK){ return(ERR); } if (edattop()) { n++; edsdn(bufln()); outxy(0,1); } else { outxy(oldx,outyget()-1); } if (mode == 1) { break; } } edgetln(); editp=editpmax; outxy(min(oldx,edxpos()),outyget()); ]==TAB) return(YES); else return(NO); } edbegin() { editp=0; outxy(0,outyget()); } ederase() /* new: erase from cursor to end of line */ { int q; if (editp==editpmax) { return; } q=0; edcflag=YES; while((editp+q)=0)&&((nb-ob)<(SCRNL1-yp))) || (((nb-ob) <0)&&((ob-nb) 6) { bufout(bufln()-6,1,SCRNL1); outxy(edxpos(),7); } else { bufout(1,1,SCRNL1); outxy(edxpos(),bufln()); } return(OK); } edins(c) char c; { int i,k,x; if (editpmax>=MAXLEN){ beep(); return(ERR); } if ((editp==editpmax) & (edxpos() 0) { editbuf [editp++] = ' '; } editp=editpmax; } k=editpmax; while (k>editp) { editbuf[k]=editbuf[k-1]; k--; flg==02) /* df rather than dt */ k++; /* one more char */ p=r=editp+k; s=0; if(flg==01) { while(killbuf[s]!=EOS) s++; } while (p(SCRNW1-WM) && WWFLG) { /* auto-split */ if(editp == editpmax) { x = -1; } else { x = editp; } /* guess at split rules -- try to split several words back */ /* unless typing near end of line */ k = max((editp-1),(editpmax-24)); while ((k>0) & (editbuf[k] != ' ') & (editbuf[k] != TAB)) { k--; } /* never split a word */ if(k==0) { beep(); return; } /* else split at current word */ for(i=k; i<(editpmax-1);i++) editbuf[i]=editbuf[i+1]; editp=k; editpmax--; edsplit(); pmt2line(); if(x<0) { edend(); } else if (x>k) { edbegin(); while(--x>k) edright(); } else { edup(0,1); while(x-->0) edright(); } } else if (k>SCRNW1 && !WWFLG) {=OK){ return; } edgetln(); if (edattop()){ edsdn(bufln()); outxy(edxpos(),1); } else { k=outyget(); syscout(27); syscout('E'); outxy(edxpos(),k); } markclear(); } edtabcnt() /* new 2/85 */ { editp=0; tabcnt=0; while(editp < editpmax) { if(editbuf[editp++] == TAB) tabcnt++; else break; } return(tabcnt); } edright() { if (edxpos()outxget()){ outxy(edxpos(),outyget()); } else if (editp < editpmax) { editp++; outxy(edxpos(),outyget()); } } edsplit() { int p,q; int k; edcflag = NO; if (bufatbot()){ if (bufins(editbuf,editp)!=OK){ return; } } else { if (bufrepl(editbuf,editp)!=OK){ return; } } p=editpmax; q=editp; editpmax=editp; editp=0; edredraw(); editp=0; while (q(SCRNW1)) { bufup(); bufgetln(editbuf,MAXLEN); return(ERR); } if (bufup()!=OK) { return; } editpmax=k; edcflag=YES; if ((edrepl()!=OK) || (bufdn()!=OK) || (bufdel()!=OK) || (bufup()!=OK)) { return; } k=outyget(); bufout(bufln(),k,SCRNL-k); outxy(0,k); markclear(); edredraw(); } edkill(c,flg) char c; int flg; /* amended 2/85 */ { int k,p,q,r,s; int oldx; oldx=outxget(); q=editp; if (editp==editpmax) { return(NO); } edcflag=YES; k=0; while ((editp+k)<=editpmax) { if (edwtst(editbuf[editp+k],c)){ break; } else if ((editp+k)==editpmax) { editp=q; outxy(oldx,outyget()); return(NO); } else { k++; } } if(OK) { return; } if (edatbot()) { edsup(bufln()-SCRNL2); outxy(1,SCRNL1); } else { k=outyget(); syscout(22); syscout(27); syscout('E'); outxy(1,k+1); } edredraw(); markclear(); } edsrch(c) char c; /* amended 2/85 */ { int p,q; p=editp; q=outxget(); if (editp>=editpmax-1){ return(NO); } editp++; while (editp=editpmax-1) { editp=p; outxy(q,outyget()); return(NO); } else { editp++; } } outxy(edxpos(),outyget()); return(YES); } edlsrch(c) char c; /* new == search to left (amended 2/85) */ { int p,q; p=editp; q=outxget(); if (editp==0){ return(NO); } editp--; while (editp>=0) { if (edwtst(editbuf[editp],c)) { break; } else if (editp==0) { editp=p; outxy(q,outyget()); return(NO); } else { editp--; } } outxy(edxpos(),outyget()); return(YES); } edzap() { int k,q; if (bufdel()!=OK' && q<='z')) return(YES); } else if (q==c) return(YES); else return(NO); } /* VED5.C */ /* Feb. 1985 */ #include ved0.c #include ved1.ccc int fmttab; int fmtdev; int fmtwidth; int fmtcol[MAXLEN1]; fmtassn(listflag) int listflag; { if (listflag==YES) { fmtdev=YES; fmtwidth=LISTW; } else { fmtdev=NO; fmtwidth=SCRNW1; } } fmtadj(buf,minind,maxind) char *buf; int minind,maxind; { int k; fmtcol[0]=0; k=minind; while (k=fmtwidth) { return; } outxy(fmtcol[i],outyget()); while (ifmtwidth) { break; } fmtoutch(buf[i],fmtcol[i]); i++; } if (fmtcol[i]MAXLEN) { pmterr("line truncated"); editpmax=MAXLEN; } else { editpmax=k; } fmtadj(editbuf,0,editpmax); } edrepl() { if (edcflag==NO) { return(OK); } edcflag=NO; if (bufatbot()){  outdeol(); } } fmtsout(buf,offset) char *buf; int offset; { char c; int col,k; col=0; while (c= *buf++) { if (c==CR) { break; } k=fmtchlen(c,col); if ((col+k+offset)>fmtwidth) { break; } fmtoutch(c,col); col=col+k; } return(col); /* fmtsout() now returns column value */ } fmtchlen(c,col) char c; int col; { if (c==TAB) { return(fmttab-(col%fmttab)); } else if (c<32) { return(2); } else { return(1); } } fmtoutch(c,col) char c; int col; { int k; if (c==TAB) { k=fmtchlen(TAB,col); while ((k--)>0) { fmtchdev(' '); } } else if (c<32) { fmtchdev('^'); fmtchdev(c+64); } else { fmtchdev(c); } } fmtchdev(c) char c; { if (fmtdev==YES) { syslout(c); } else { outchar(c); } } fmtcrlf() { if (fmtdev==YES) { syslout(CR); syslout(LF); } else { outxy(0,SCRNL1); syscout(CR); syscout(LF); } } fmtset(n) int n; { fmttab=max(1,n); } return(bufins(editbuf,editpmax)); } else { return(bufrepl(editbuf,editpmax)); } } edscan(xpos) int xpos; { editp=0; while (editp'9' && q<'A') || (q>'Z' && q<'a') || (q>'z')) return(YES); } else if (c==04) { /* alphanum = non-gray */ if ((q>='0' && q<='9') || (q>='A' && q<='Z') || (q>='a/* VED6.C */ /* Feb. 1985 */ #include ved0.c #include ved1.ccc int outx,outy; outxget() { return(outx); } outyget() { return(outy); } outchar(c) char c; { syscout(c); outx++; return(c); } outxy(x,y) int x,y; { outx=x; outy=y; syscout(27); /* tvi950 values */ syscout('='); syscout(y+32); syscout(x+32); } outclr() { syscout(27); /* tvi950 */ syscout('*'); } outdelln() { outxy(0,outy); outdeol(); } outdeol() { syscout(27); /* tvi950 */ syscout('t'); } outuphas() { return(YES); } outdnhas() { return(YES); } outsup() { outxy(0,SCRNL1); syscout(10); } outsdn() { outxy(0,0); syscout(27); /* tvi950 */ syscout('E'); } /* VED7.C */ /* March 1985 */ #include ved0.c #include ved1.ccc char pmtln[MAXLEN]; char pmtrfn[SYSFNMAX]; /* now both read and write filenames */ char pmtwfn[SYSFNMAX]; /* pmtmess replaced with pmterr */ pmterr(s) char *s; { int x,y; x=outxNPUT OR OUTPUT POP B ;INT O -- OPCODE PUSH B PUSH D PUSH H ;REPLACE RETURN CALL 5 MOV L,A MVI H,0 /* RET Note: Software Tookworks compiler supplies RET */ #endasm } /* added */ syscstat() { int c; c=cpmcall(6,-1); if (c==0){ /* correction of original version */ return(-1); } else { return(c); } } syscin() /* extensively altered to recognize escape sequences */ { /* from H19/H89 special keys */ int c; while ((c=cpmcall(6,-1))==0) { ; } return(c); } syscout(c) char c; { cpmcall(6,c); if (control(c) == YES) { return('^'); return(c+32); } else { return(c); } } syslout(c) char c; { cpmcall(5,c); return(c); } sysend() { #asm LHLD 6 DCX H /* RET Note: Software Tookworks compiler supplies RET */ #endasm } /* added */ sysopen(name,mode) char *name, *mode; { int file; if ((file=fopen(name,mode))==0) { return(ERR); } else { return(file); } } sysclose(file) int file; { fclose(file); return(OK); } sysrget(); y=outyget(); pmt1line(); fmtsout(" ERROR: ",15); fmtsout(s,23); syscin(); outxy(x,y); } pmtmode(s) char *s; { int x,y; x=outxget(); y=outyget(); pmt1line(); outdeol(); pmt1file(pmtrfn); pmt2file(pmtwfn); pmt1mode(s); outxy(x,y); } pmtrfile(s) char *s; /*changed: readfile */ { int x,y; x=outxget(); y=outyget(); pmt1line(); outdeol(); pmt1file(s); pmt2file(pmtwfn); /* add writefile */ pmt1mode(pmtln); outxy(x,y); } pmtwfile(s) char *s; /* new: writefile */ { int x,y; x=outxget(); y=outyget(); pmt1line(); outdeol(); pmt1file(pmtrfn); pmt2file(s); pmt1mode(pmtln); outxy(x,y); } pmtedit() { pmtmode("edit: "); /* add blanks to assure erasing "command" */ } pmtline() { int x,y; x=outxget(); y=outyget(); pmt1line(); outdeol(); pmt1file(pmtrfn); /* change: separate read and write files */ pmt2file(pmtwfn); pmt1mode(pmtln); outxy(x,y); } pmt2line() /* GR addition for faster line update*/ { int x,y; x=outxget(dch(file) int file; { int c; if ((c=getc(file))==-1) { return(EOF); } else if (c==LF) { /* map LF to CR for Software Toolworks */ return(CR); /* compiler */ } else { return(c&0x7f); /* 4/85 to strip 8th bit*/ } } syspshch(c,file) char c; int file; { if (c==CR) { /* map CR to LF for Software Toolworks */ if (putc(LF,file)==-1) { /* compiler */ pmterr("disk write failed"); return(ERR); } } else if (putc(c,file)==-1) { pmterr("disk write failed"); return(ERR); } else { return(c); } } syschkfn(args) char *args; { if (args[0] == EOS) { /* add check for zero-length file name */ message("no filename"); return(ERR); } else { return(OK); } } syscopfn(args,buffer) char *args, *buffer; { int n; n=0; while (n'9')) { return(ERR); } else { *val=c-'0'; while (c= *args++) { if ((c<'0')|(c>'9')) { break; } *val=(*val*10)+c-'0'; } return(YES); } } max(m,n) int m,n; { if (m>=n) { return(m); } else { return(n); } } min(m,n) int m,n; { if (m<=n) { return(m); } else { return(n); } } putdec(n,w) int n,w; { char chars[10]; int i,nd; nd=itoc(n,chars,10); i=0; while (i0) { if (syspshch(*p++,file)==ERR) { return(ERR); } } return(syspshch(CR,file)); } /* VRECOVER 3.3 for VED(rev3.3) -- April 12, 1985 */ #include a:tprintf.c /* shorter version of printf */ #define BEGIN 0x70FD /* location of mbuffer in compiled VED33 */ #define END 0xF000 /* don't go past here */ #define CR 0x0D #define LF 0x0A #define CPMEOF 0x1A main() { int fp; char *p; p=BEGIN; fprintf(0,"\t\tVRECOVER for VED 3.3\n\n"); fprintffcb(file,fcb) - unpack filename into char fcb[36]. */ makfcb(file,fcb) { #asm POP B POP H POP D PUSH D PUSH H PUSH B #endasm x_fcb(); } /* VED9.C */ /* March 1985 */ #include ved0.c #include ved1.ccc extern int ma, mb, mc; toupper(c) int c; { if ((c<'a')|(c>'z')) { return(c); } else { return(c-32); } } tolower(c) int c; { if ((c<'A')|(c>'Z')) { return(c); } else { return(c+32); } } number(args,val) char *args; int *val; /*GR modification*/ { /* returns NO for wild card, YES for real number */ char c; *val = 0; /* initialize for test */ c= *args++; if (c == '$') { *val = HUGE; return(YES); } else if (c == '.') { *val = bufln(); return(NO); } else if (c == '\'') { switch(*args) { case 'a': *val = ma ; break; case 'b': *val = mb ; break; case 'c': *val = mc ; break; default: return(ER(0,"Opening temporary file VED.$$$\n"); if((fp=fopen("VED.$$$","w"))==0) { fprintf(0,"Can\'t open VED.$$$\n"); exit(); } while(p++ < END) { /* just in case */ if((*p > 0x7f)|| (*p <= 0)) /* non-ASCII */ break; else if(*p == CR) /* C-80 puts in CR */ putc(LF,fp); /* add missing line feed */ else putc(*p,fp); } fclose(fp); fprintf(0,"Buffer recovered to VED.$$$. Check before using\n"); } *+%"J%"H%"F " " "y 6"C+6+!^6 F+N+<!* !!9~#ʗ RO"k'k +}|+#~ʂu6#~#<ʷ>!4R6#6*!ͧ * |ʴ͕!͸"r! ͸" R Can't open > or < file.$èw*6 )! 9!"6*':B<*C 2B ́F  €> _*C~+#4N s> > !-:EºF2B_~ÿ   ! ʘo&!* ͬ> ! [ !9Y~0 !9Y#^+S *+" ! ͒ [ [ f d u o x c s !9Y } !9Y0Ì !9YA *+"Ұ :T Ò * !9Y" *+"#*| * .|g| *+"#* K" !"**  * ͠0 ͒ *|% !- * _ Þ *ͼJ * !5n *ͼd * ! ͜n * !5ͳ *ͼʎ * ! ͜Ù *+* ͖_ " * * !p" !! 0 !! 0 ! ! ͸" ͼ !! 0 ͨ* #" +f * S( * S͠4 f c * S|S ! * ͬc * S* ͬ * ͕!! 0 " " VRECOVER for VED 3.3 Opening temporary file VED.$$$ VED.$$$wCan't open VED.$$$ Buffer recovered to VED.$$$. Check before using -}  > _con:rdr:pun:lst: ??_~O7 !"# !  #i& ~!j~#~#F6,6pw#62BD!9Yy=`>wS<!is w#6 w+w ~#’s#r{{ ڵ!-#^{!!i~<6!~~r!N!pY}*gyb>w#%!=)1{=`bʁx ''h&{ !~!pN#F{p+pH#ͅ¼ +!9~ !~b!5> 6> *g w`i#^᯾"%,!1|!!9n&:ʬɯ2>h!9Y):|!RwY#4!`w>2>2::Ecx::O¡! DMv:: !Write error - Disk full $`iD;!9~=+`V+^+F+N "V> w+ w w##w w #~+:3~##X@~#.DX3*V++Xw#Ja O! ~_#V!$r+sbk#|}o|g}o|g}o|g|!,|}!ºº,ɯ|ʦ!|}!-z{!,zz{!-|!|g|}!-ɵz!{!-||g}o(*);{ozg+|/g}/o~og~#fos#rN#F#x~#~#hh`iDM!z>S\))җ =ɯìzK|KMD!x<z>jS\>))#  =KK !9"*++"Y~ !9*/ *++"Y,  *++"Y"**++"Y͐  *++"Y"**++"Yͨ  * !9Y͐ !9Y"!9Y" !9Y"!!9Y͐ *S͠ *S͠͠ *#"+S *##| *#"+!9S}*6!9S*ͬ*#"+S|= !"*S0^ *S9͠ʅ * ̀*#"+S"C ! }2! ""!"*#"+S> !"!9Yͳ [ !0}2!"!9Yͳ [ !0}2!"!9Yͳ [ !9Y GVEGAS DQC VEGAS CQM |DTva VEGAS.DOCN  !"#$%o&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLM֣ev6%2lv?p.3H%==ev6f3)8 \fo1i 6jqUg= ['6d= 5xuNw;!V ~zj$k 8fR*2';:NK NBm`uNbjCP%jݯ" ܎^}NmMZs>PQ,u4uL&''jRN5#8VF7O21csknoz7BiNN5p u֣.aetcG(`#'b&4CkS 8'!a='8ERGԢ9r##'JzC ONQ!ɐim6/%ŗ}nTwwXPY ClJlgÀ>k7(XPY ClJl9ݠxcCe~x>k7(7,vRbQ|gCyv8J<+g ݠxء~7Y<;@aS6MU* BE&~+ E@aS\EPQ(TdGըXaS* BE"OS)y;BaijB,biRB,B /0,M"Y+d,LmYEr&fmB,&fX$İ4y'YEAai}֣YE1HbXeB,B k&z 1uۇ,a& Y7e!! 9ai0X$;$&d& ErҐqiߗif@A-@qoaܛiOe@ jgIԘ'& I0X24)paܛi_v:c4Y1 $|⤪ HøX4_9if@Aƽ@   Hø70Vg%_ݠxءvmq6%C8(~g';Tߎ-p.pFaYAq}bzQ\[sH4N  ԆH!:QC(%.Q'Q a-Kp"QVQMf[q=)ƨ `ce(baRGP"5X$Hst4J!~!R֣n٩Q9@#zY3zՏSNAv=MaҨNTQpG 'Г11.q"@d(=X$^uB-!a#<X#Hu ֯rY:@Dh @#jQ d j uT\aetc9Ⱥv{",u | $@(1z ~<|h(rjD-F 6i(*5.~"X/]g(zGAֆTM8NR4yCbrLvlVEGAS.COM 2< !"#$%&'()*+,-./0123456786o9:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd5=H. efghijklmnopqrstuvwxyz{|}~8*P>:%-g,4;@AƗ449i8i4wBAN Hø70̀4{3 ;! g:!  x Hø70f;!pȍpfӁ c)Z|f$vif@Ai_ ܛc4Yt`O1*)a QbU4 ={\8uՒAF%yMflj}m~74ȾAHø70̀4{3  H@1* K#H0  Hø70̀4{3 cqoaܛiw@Aƽ@qo[ %a3688{~6Wհ]ua=?'Aj̮:m\3LRvI ƙ5ihe"F$&"yVWZS UV0. cif@Aƽ@qoiXwAfr%h \JALA1JL98bvֵb&]LD+yܓ*߮TCU.4yma&W0˥im,A1v7 &W0Kim+QlJw߅i<ɕ(6Wbr%{2[]uzW.o_glD7+Pɖp+쫔=v!@ۏZ?~فd?~$eeKHv#9ˏd?~n?kHv_n?]~9 .?kn$Hvn?!?HH#GÏdY~ڃd~G?~Hv#GÏ,a~$<Hv#Hve~9ko KIB_A+JPزɎ<*Io$ם-nLXъ0^*(D" 4aGݖ;ww#="!{DJ,C򮰯X¾ʩ'MK+Pr>|s Y, JF&ާ w؁TI4a鏠f;*AmW옰GʞD+%?cҏ I'ѐ%bG0q;ݑ\UJI{ r;ZoWvlOф?Td+Cd)PW;J.IUVIF= ﴇGPIR]hZt}v'#aI{QIRF8h& Ddw$ 9L3*9srm1]\[Lk@0l*\۸o5lL^U6}3墛^kqe.|6ЈW_{ XǍRTj6MiFvj,4p`uSŁ'A}&l$MbDBO-QVij=× S}AS=3@&oymCkFVJH6lϙaݽZi}{5;zZu9׫;wWkUejQ\kc?JXȔd&!T/VCv%[B&&p"Z9-L!el^ wD%WYEsZFiZrrbkƤPfqAw8kaf՚}F(mʮʮ1#1kQl-j1cmcфc"Xhհ .ޓdm2o> *3c4{5wj d5MfthMYJt?Z%CX뀦EfxcLCDQkz!̎We^}جwEѦjҍ(5D(Bú6r}A n9OnY}nnq~razṫ֐. vu K]]Fʿٹ˔UMgʗeBŖ/pRPb~oS{G4]j7Mo=n:h/#t(oh4{AgI{W"?;\FĄwQlLąT4d)_۰DLM7(vJ)ӧw'_/8饭VpӞ7]W B"/cY D^«g!D^B"|VE >+"@d M|V ""bYDD\8tƹHbu\i%Tg5bK*YC QKɔpgJ(l8dB.QM$TےYQAqb3 or;*w}ҎhrEፖ!_:',h$=(o }# >Dv ^nD&HH. HH. ڢ(AˆTsz=PHdBɎ-$P҂ 1KDч}vR#Hݢ(A%-@1KDч}vDaɮ-$ Q҂ gmR-C GܶE?QdwA!JZPb-C Ht!b~Bſ [Gk~8JZP"ݭPٻ*{w7['J.(TR#H޵E?QdGAq1JZPz- K{{ GH_-ݖ%v#MG}# juWDi;Z^@pAA% ޮNԮ/I:U&,T2èdݾKA%ݖ {Wr=,G6mX|Zݍ6I 2=hz>N#ľ&Є?-C[jDt]A%=)cD(/D+"]ɤ=hH/F ԭ_hy%od% G%ݖ$O/ ۑO?dG["_D?D͠鋞iZvmI/җtwU,P^en1AaF@C]K=@bt0jZ8ĸåz2N3v+EzrQ 6Vm[fAFq K55JkU pӶzu;|V165uNJExn6G0inKӵuui֫R4IKtmap!s'4]TP\6h++FaIY6h+$ZmV+F{?nNjіHW8mb%N"r|4]ΞW'ZNx ;42ިY z4]kvHmg1í\\# )l8,XrY}m)OZƤe0W1EQFS!L>k0 -NO˘Fs֎gp]YP> `b9A:ymz ƤF_P~o_s|>g{Y>ilrmkU)Nl::"AȚԘٵLa5 y|ڨ&lğcp(ʫq$\i]&7^xŽ˵qun:]+0aLMewb2O.*峃hL.2&UylYŦka]$ӵd\bN0&5XEgWuʻ?] vfiXJѐAp5;KȠFj K)'dPN`)'\K{ X`)%A%2+jRՐAUKU쭰2[n ,(5Ni52efGXsakx(: QJ i)(FqJ~T {k1v4]\j8%oŹlpI P+ݴe{au%e஭Hm3kGq*}j9ZԤRT>G5`fNQ`fM(5Ni5p*Nn4hdABkk* 'IP$($(M դRT(5N_p>$}~EB5 nQjbGrj,VSw_RdV7R[dOQ^S>JS5E~FÃϚQ|=*gS&5pvs1&ZkjG үIƩxį1hREFY&? >k`fziފ ׇZE\vp@LY&LY3K^O.sAz @Ơrz .{mq+L2qb=<+炆C}}mu^3tճq99]o 'cz+DtJ7zv5nđ4v[F؊F(.>\( zQGCT3om~V 6^-9j^o徭U԰QM"_7<ԘFm$i.I2׫vV9+kǜʥJt8+ 3>g6r5YcVgSO@YMPhp:Mpf25s^}1FK.SPhuyh:<2^LsJƩT(22gSzSFjǓT b`W`Ls` don65>r{j(ԣ +,hNtbM`St0VH]TY)x+Z4R +*>uZV*f_x8i]2R [ɽV-J%+;w {s dQuĞ쏄QӚxD>KI-4;ϼى[;'f>ڏ\ 'rYiz{SN݊fNzזyЙ5D#;w+l^ظ5xH4#;w+*ټ& \vi5m|ȉ(iɋN},b/5;oى[Ǒٙ'7vv4v@fBjqԾ 9B^3(݉ڽGT5'fА6־ ҟh}|%\4sg5.G]udon.pkN W"{˚C;߸ȉEGv-DeToq>r򙙅Q3(v:݁}͉&5 ̉don.Лa+>̏pfӁ_zc^zyH#2͕sۼLΊ%uG[`9޻Os}İ_/85덳sQ7ZUͿ(ZvR;>_޾Em5ְۡoQiۧU5a2jcrߪ{: UhQ 7JҶۧ=*C rcfJkuѤ0b;rP⨆}SÕV|R6hԣԣxj?.TC}8.kPy|,2$"|t 6Dt fQi\pR& rIn ȍjrMn HZcF)/M& +gm褌VHmZ06tRn6^PѶ~ehʵβJgoh9Z88g5)4]Gj Hm4Z/fzH%\0C1GH@cԳC–mk&Moo7>SL[՗ F6gНX/4QKr^eྜS_皋ᖇ.\U7^zjS(ɰ zuo2K״ԭ[k+$EW[=tw®BR w箄BKCݹ> \X5Wܚݹ[HM(JR ˉ:\XLznIJgar>ʼnkZm- &Er3Fʮpsajg! B#1*Oa[eRhϖyܘ˕s;nXpP&ȧc.\XCNzLyrI(v^ vhQ ;;W4OpC4ՄRF8Wcbo:)L:.j B)Ӳt[S79j~QZi#?3ZMo߳hpc-M/7ߣigiBRiZy-; 7M#вcj-;.ƹtt{AISFw ){Lʞ<Ӡ'T, @yk1~mu?`ʙ;fDz_g(3-W>'—yUwi`RÛS>9WZtHi.4Ugxeיky;]44Uugx+/4Xӭ,` 7\p9o')Йv_otZ;)ywsI7sq.xsyM!'(lP"Ӗp(J+Q63VLZ5ckqڱyɰ_ K~f54QfQԈ!Ͼ]bq{a5:&/ξ#kK['TŬͬ,2>-g9cNEUkqq r EEuEpA l3",E|kX{!YPP,SƞWZIocxRv(z#wE]a4TѼ@:Ap 4`VM 2ܬeN!|8kͲȴ~j3U#29zNpVV|C/E$`oE~2 3mT˗J qdax x#*rX3iˌ:x,f1U2cAegLx.e2c+MYŘ؜MYT\ [_ 1ӁƔuC̭ܯKcKch יvZbZ pm"NgBUt-eB(\[;hX< *ڔtsw?o"(\ %nKcp,gLb .Eb-cRڔQ,S'PvL4p~k܄*Ⅲ*SN Vy[ jD)j9x<fEDxG!/2׫b8{2*o}j3,|B^@pY̘?e-n浌IF֤bf֤6B\e1ј mpZ}3GqJ b6ztBoc[:)kS'em꤬M6h2\8J6LGSǥ{.'wN*o.j>gfw-xI^278蔑,,fɁl+[O,+;4g * SբJ}+\ Ea+WCjO*- Oa t )3e\.() *3U4WWT, |\~sy9.˷sy9. '?jse}&Ƶfrx'%h\#`q.Lè>Q?qMl $2Y(̮۶X%C+L21^ h$[R;GdCӰ$gHw%-sp^vw/s Mq0ӹGWEH㜤PhZ]yPN꜐9ZƧjkp4oT\;$gOuJN#`Vr@s`V?+:8/E4Vuk7k׍%uA+iqyl(T/^yL|ǑP(958S_1E br4 ۊu9ZxYa.;+V(Vj]rxIPS [GK[~he ow.)=y&rsirsXyIITi ŢxR"iӼcxo[ xqZj:E(g \VZkܯd L\`j2  ̭pq(amUkBNSK]4e4 L9k--^;r=>Ҏ (cPWpUQnZ9SZ ق{L;2ZPd&ւPQTڸְ( ;s([^q u N\ t tźǾ8ZP9B]9psh4+ L愔w$hDte2Wc`|ijt(xӱWuV螵΅MΜ­fe"JGb+~hhBJQVDm©BO)g$Υs_+2mu4DRb+"uf9aLp~L[ٸ\xlyAJM8@ڴrG'6,"*Ӑm\eBPOs${ s#.|)>\ƑѢ|S}ƑSfrw VNs[>\PnUq\PUU\jvx NW3LL~ڐ녖6cSQ!}\8򟩣ڽK|mծ{*A-gݣ)3UN eeZ2C8 s7P{EopVL-gz5r^Zv\qcsrݳM悽>ޤn.| jWpTsbSq2\Pfr.TMt\Y]YTS!SyG*8 }).U8[ׂ8k .8cLS ^ә98?"5Lq͔И_TqךitG'f(3[O v@RC[ 矮]i>005 Vt 8e8Z{U.G&qMP&L <\!@ F8kFq*LU{8׀qG'6\$}[I*#8ثdzTxDܮ( 8\&4ܥVkxLӼ0rK /aj.qx= L.9Qd`vrXKTLWdbY]pzS#SQRX-ˌS{WPƳvUSU:v2egu2ޱ2fi<}2S%h!o; ,KTJ2Us2v iV0מ 01 M00 01 R00 02 M00)02 R00>03 M00L03 R00d1 D00r 1 DIR1 E001 L001 S00 11 M00611 R0012 M00 712 R00A13 M00['13 R0014 M00+14 R002 D00$2 DIR2 E002 L00)2 S00%21 M00:'21 R00a22 M00t22 R003 D00$3 DIR3 E00=pzL\ꬥerNS*T,Bm8̥Z{^v zm2:se-e\I=GEkX<׷g&*ط[ S5+[Tl/K4}-5Ao{߶5Y-y[|59نŠ=Jԛ'v[Hj;.#GZm?=Q5Iuy*UZL=:^QaӍm^ݾR'^zdRe߼R7%[9Cו-+3U8BjesSn)͢͢͢f3l2=–s?ғ8 ۋy͞KV1}#ssA5cRxZ ^30fZ.^y s)+Ӿ_XCzxEUim4-,m4h:&jZ3:FĹ}6ΙkXᆳJXrjIv\ޱUUWDU.8c`зzz/crTdV`U9 } k 5z~涒+]CӮ[<4j6W,m=i\ ;QD6`pUu=aU:N\r.x͕v8?rTYPED REGISTRATION NUMBER  PLATEE EXPIRATIONVP================================================================================d7 f 7 h 7`j`7VP*********************************************** TOTAL PAGES IN REPORT #### *****l8n8 p8r8t8+v8>x8H#uX31B:1.K00 x#6IW9X0  Z4l \4u ^4 `4b4d4f4h4 j4 l4  n5 lu2r26lu<v<7 NxN81 D00@B:1.D00$L$4>CL_____'N'4HRE__/__/__c UPDATEB:02.M00Bp Z502B:02.Q00 ^Bj jZ11REGISTRATION RENEWAL ROSTER:P V\V2OOPSORTB:1.D00B:1.F002A   X 0B^B6#,7b6VZ[\]999 ` 6sds7 ,©RIGHT 1985 BY: JASON M. BLOOMBEERG(&$+ASSOCIATED MANAGEMENT SERVICESVP************************ REGISTRATION RENWAL ROSTER ****************** PAGE ####VEHICLE LICENSE DATEREGISTRATION EXPIRES<MONTH RENWAL DUE NUMBER  NzN8p5  %5;?HL2t26evlu\9++++m+]z ~XZ\^`bdfh-j@giaxzcPRTVXZ\^`bdfhjlnpra~_| <>B:01.R00=p~wǞ؞c :h-Ap^L:PLATEVP================================================================================f7 h 7VP================================================================================VPTHE ABOVE LISTED VEHICLE NEED TO HAVE THEIR LICENSE RENEWED DURING THE MONTH OF: .D>CHECK AND SEE IF ALL NECESSARY CERTIFICATIONS ARE IN THE FILE. j 7`l`7VP*********************************************** TOTAL PAGES IN REPORT #### *****n8rp8 r8# t8? ,v8 7uX31B:1.K00 _r 0>  nX0  Z4S \4\ ^4g `4pb4d4f4h4 j4 l4  n5 S\gpT11LIST OF VEHICLES:PV3$33©RIGHT 1985 BY: JASON M. BLOOMBEERG&3(&+(+3+ASSOCIATED MANAGEMENT SERVICES]*]3P************************ REPORT LISTING VEHICLES ********************* PAGE ####]>]3P================================================================================@3,3VEHICLE LICENSE.3YEAR03MAKE23-MODEL43>TYPE63D REGISTRATION83NUMBER:3 PLATE<3E EXPIRATIONP3 ]R]3 P*********************************************** TOTAL PAGES IN REPORT #### *****"B"4V___)D)4 L __________#F#4Y____.H.4MA_______________.J.4+MO_______________2r26rS\<v<7 NxN81 D00@B:1.D00NzN8p5   " & / 3 2t26L ] rS\\9++++d+ L~ NPRT~?|ACEGIKMOQ'N P H _ a J 79;=?ACEGIKMOQSUWY<>B:02.R00=p~֞3O`ßp,.&44Ef:X 0rdr6!*.9>NTdLhL69999999$$99,999,999.99$$999,999,999,999.99 f 6j7,©RIGHT 1985 BY: JASON M. BLOOMBEERG(&$+ASSOCIATED MANAGEMENT SERVICESVP************************ REPORT LISTING VEHICLES ********************* PAGE #### DATE OF  VEHICLE LICENSE  YEAR (MAKE :TYPEEPURCHASEPURCHASE  NUMBER PLATE EPRICEVP================================================================================V P================================================================================l7 n 75p57TOTAL VEHICLE PURCHASES: `r`7VP*********************************************** TOTAL PAGES IN REPORT #### *****t8!&v8 *=x8 .=z8 9|8&>~V11REGISTRATION RENEWAL ROSTER: PIMR.RE3$33©RIGHT 1985 BY: JASON M. BLOOMBEERG&3(&+(+3+ASSOCIATED MANAGEMENT SERVICES]8]3P================================================================================:3D3 ]T]3P*********************************************** TOTAL PAGES IN REPORT #### *****"<"4V___)>)4 L __________]*]3P************************ REGISTRATION RENWAL ROSTER ****************** PAGE ####,3VEHICLE LICENSE.3DATE!0!3REGISTRATION EXPIRES23<MONTH RENWAL DUE43NUMBER63 PLATE'@'4REMM/DD/8:N8AT98'db5+`+4iii^3uX31B:1.K00 &9L_r  & b X0  Z4 \4 ^4 `4b4d4f4h4 j4 l4  n5 2r26  <v<7 NxN81 D00@B:1.D00NzN8YY)B)4? MR __________]F]3 P================================================================================H3 ]J]3 PTHE ABOVE LISTED VEHICLE NEED TO HAVE THEIR LICENSE RENEWED DURING THE MONTH OF:R3)L)4  MR __________N3 .KPK3 >CHECK AND SEE IF ALL NECESSARY CERTIFICATIONS ARE IN THE FILE. UPDATEB:03.M00=B Z503B:03.Q00 $Ty l7Z11!LIST OF VEHICLE PURCHASES & DATES:PQ\Q2JJPSORTB:1.D00B:1.F002A p5 ! * 5 > N ^ d h q u 2t26 #\#9++++###|+.K  ~ 0CVi              y{}0<>B:03.R00 !!!!!=p~ҟ -rc۠Ԟ N$BVRǠwTb11!LIST OF VEHICLE P NxN81 D00@B:1.D00NzN8p5 !'+482t26QbwXa|9+/8oPP < o1MASTERBLRFCLDPLMAMO MR PP REVYDFHJLNPRTV,SUMdfO<>@BDFHJLNPRTVXZ\^wXalu     "    .URCHASES & DATES: PIDP-3$33©RIGHT 1985 BY: JASON M. BLOOMBEERG&3(&+(+3+ASSOCIATED MANAGEMENT SERVICES]*]3P************************ REPORT LISTING VEHICLES ********************* PAGE ####]B]3P================================================================================D3]`]3P*********************************************** TOTAL PAGES IN REPORT #### *****)J)4 L __________#L#4 Y____.N.4&MA_______________$P$4:CL_____:3PURCHASE<3 NUMBER>3PLATE@3EPRICE,3DATE OF.3 VEHICLE03LICENSE23 YEAR43(MAKE63:TYPE83EPURCHASET3 ]V]3 P================================================================================X3 ^3 'F'4DPMM/DD/YY"H"4 VP___.R.4APP$$__,___,___.__A\A4 '3TVP$$___,___,___,___.__TVP+PP&Z&3 TOTAL VEHICLE PURCHASES: FCD 1B:1.K00 dw"5C%suX0  Z4X \4a ^4l `4ub4d4f4h4 j4 l4  n5 Xalu2r26wXa<v<7*************************************`8Gb8. Gd8Gf8h8) j8Bl8 0n8 .Cp8 V r8 C i uX31B:1.K00  0CVi|0lX0  Z4% \4B ^4_ `4|b4d4f4h4 j4  l4 * n5 2r26 <v<7 NxN81 D00@B:1.D00NzN8APDIRB:1.DIRpÜ$j$50101LIST OF VEHICLES/l/50202REGISTRATION RENEWAL ROSTER5n550303!LIST OF VEHICLE PURCHASES & DATES<v<7 p5 +4?HXhnr{2t26?\?9++++???+-9/V1s3579;=!?>~':M`s!#%')! =Z;Xu#@)<Obu<>vNvB:1.S00؜"0{ɝ[} MΞ{ț6UŸrퟙf UPDATEB:1.L00GBZ41B:1.T00#%B_| *X6 Z6 AEPUeu{>\>6 9999999$$99,999,999.99?^?7COPYRIGHT 1984 BY:JASON M. BLOOMBERG-&$2ASSOCIATED MANAGEMENT SERVICESVP********************* VEHICLE INFORMATION FILE *********************************VEHICLE NUMBER: LICENSE PLATE NUMBER: > VINTAGE: MANUFACTURER: "MODEL: <TYPE: OI{TYPE: refers to truck, coupe, sedan, station wagon (wagon), conv., etc.} DATE OF PURCHASE:  PURCHASE PRICE: $ REGISTRATION EXPIRATION DATE:  /REGISTRATION MONTH: V P*******************************************VV3I{TYPE: refers to truck, coupe, sedan, station wagon (wagon), conv., etc.}] ]3 P********************************************************************************]ޙ]3P********************* VEHICLE INFORMATION FILE *********************************ԙ3COPYRIGHT 1984֙3BY:ؙ3JASON M. BLOOMBERGڙ3-&+ܙ+32ASSOCIATED MANAGEMENT SERVICES""4V999))4. L __________##4GY99993VEHICLE NUMBER: ##3LICENSE PLATE NUMBER: 3> VINTAGE: ..4MA_______________..4)MO_______________$$4BCL_____3MANUFACTURER: 3"MODEL: 3<TYPE: ''4 DPMM/DD/YY..4 .PP$$99,999,999.993 DATE OF PURCHASE: 3 PURCHASE PRICE: ''4 REMM/DD/YLLONAGE: TOTAL MILEAGE: 9 AVE. MPG: TOTAL EXPENDED FOR FUEL: +AVERAGE COST PER MILE: 7VP++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/)TOTAL FUEL EXPENDITURE FOR ALL VEHICLES: TOTAL MILEAGE: "OVERALL MILES PER GALLON: TOTAL GALLONAGE: '!OVERALL COST PER MILE OF TRAVEL: ``7VP*********************************************** TOTAL PAGES IN REPORT #### *****88 8G8 Z8$ 8.486 !8C8I !!8+ D!!80 !!86 !!8F 8 G8 8+ 8C88Y))4 C MR __________++3 REGISTRATION EXPIRATION DATE: !!3 /REGISTRATION MONTH: UPDATEB:11.M007DD\511B:11.Q0079 8L 2x@ k MJu& Ussm}^ { ) F c  ! > [ x Z12FUEL USAGE REPORT:P [\[2TTPSORTB:2.D00B:2.F002A  X 06&3DV\f6B &8)38D8<V8 \Đ8? f5 @+j+4D .D 7 D  +l+4D VD  D  +n+4D BD  D  +p+4D D V D  `4 ;  +r+4D D  D  b4 ;  +t+4D D  D  d4 ;  +v+4D  D B D  f4 ;  +x+4D  D  D  h4 ;  +z+4D  D B D  +|+4D  D  D  +~+4&3DV\f999 999,999.99 999,999.9$$99.99 $$999,999.99999.9$$99.999999999 999,999.9 999,999,999.9999.9$$999,999,999.99 $$999,999.99$$999,999,999.99999,999,999,999.9999.9 999,999.9 $$999,999.99 67COPYRIGHT 1985 BY:JASON M. BLOOMBERG(&$+ASSOCIATED MANAGEMENT SERVICESJD************************** FUEL USAGE REPORT ****************** PAGEF #### ***** VEHICLE  DATE OF TYPE OF GALLONS &MILES /PRICE/ 7TOTAL CMILES/ KCOST/ NUMBER PURCHASE FUEL USED%TRAVELED /GALLON7PURCHASE CGALLON KMILEVP================================================================================7ss7 VP================================================================================1+SUBTOTAL OF FUEL EXPENDITURES FOR VEHICLE:  FUEL TYPE: G A{A=Aviation, D=Diesel, E=Ethyl, P=Propane, R=Regular, U=Unleaded}TOTAL GAD  D . % D % ++4D . D . D . ++4D  D  7 D 7 A^A35) ' R } O  4z\1 X32B:2.K00V!4GZm'2X0 Z4! \4*^4 . `4!7 b4"@d4#B f4$K h4%Tj4& V l4' _n4( a p4) j r4* s t4+| v4, x4- z5!*.7@BKTV_ajs|~6...7 NN82 D00@B:2.D00NN8.B!]ˤRQp襌!?/c}֧JǩMfMҪd12FUEL USAGE REPORT:PV.D.FT֝3COPYRIGHT 1985 BY:؝3JASON M. BLOOMBERGڝ3(&+ܝ+3+ASSOCIATED MANAGEMENT SERVICES]]3P================================================================================33VEHICLE3 DATE OF3TYPE OF3GALLONS3&MILES3/PRICE/37TOTAL3CMILES/3KCOST/3NUMBER3 PURCHASE3FUEL3USED3%TRAVELED3/GALLON37PURCHASE3CGAL|5 63.uZ31B:1.K00 -@Sfy-iX0  Z4 \4 ^4 `4b4d4f4h4 j4 l4  n5 2r26 <v<7 NxN81 D00@B:1.D00NzN8p5 (1<EUekox|LON3KMILE3 ]]3 P================================================================================QޝQ3D************************** FUEL USAGE REPORT ****************** PAGE3F #### ***** 3 F3]H]3P++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++J3`3" "4V___  4FT_))4 GT ___,___.__444$ (AM ___,___._ M-PM' '4 DPMM/DD/YY&&4.PG$$__.__++46 TG $$___,___.__ . 4 FT/AM_,3 FUEL TYPE: N0N3 A{A=Aviation, D=Diesel, E=Ethyl, P=Propane, R=Regular, U=Unleaded}4444 (SG/AM ___,___._ SG+G004C$MPG___._ G/AM334I&CPMAM$$__.__ TG/AM9894+ ,TMMAM ___,___,___._ 2t261^19++++111+_}r a c e g i k m= oZ qw s u w y { }5 R o       O W _ a g z  &(.ACI\^dflnt.06>@FY[acikq  + >Qdw571suwy{}t y |  " 8Q Y $7J]p "$&   ~ <>@  B:11.R00H1IIIII-;נ'9L^q͡ fàS֣zTM+AM1<14C$SPGAM___._ TM/SG23TOTAL GALLONAGE: 63TOTAL MILEAGE: :39 AVE. MPG: =@=4/SEGAM$$___,___,___.__SEG+TG9D94B +APMAM $$___,___.__SEG/TM&>&3TOTAL EXPENDED FOR FUEL: $B$3+AVERAGE COST PER MILE: =N=4)/ATGAM$$___,___,___.__ATG+TG6L63)TOTAL FUEL EXPENDITURE FOR ALL VEHICLES: >R>40TTMAM___,___,___,___._TTM+TM6Z64 (ABGAM ___,___._ABG+SG3V34<$OPGAM___._TTM/ABGP3TOTAL MILEAGE: 'T'3"OVERALL MILES PER GALLON: 0$04 +"VG/AM___K11&14 0#YG/AM____D1<(<4 6.MA/AM_______________D12*24 F$CL/AM_____D18"83 +SUBTOTAL OF FUEL EXPENDITURES FOR VEHICLE: :^:4? +TPMAM $$___,___.__ATG/TTMX3TOTAL GALLON0SUBTOTAL OF LUBRICANT EXPENDITURES FOR VEHICLE: TOTAL QUARTS: TOTAL MILEAGE: 7 SALES TAX: TOTAL EXPENDED FOR LUBE: +AVERAGE COST PER MILE: !!7 VP++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++,&TOTAL LUBE EXPENSES FOR ALL VEHICLES: 7 SALES TAX: TOTAL MILEAGE: "OVERALL MILES PER QUART: TOTAL QUARTS: 0*OVERALL LUBRICATION COST PER MILE OF USE: ``7VP*********************************************** TOTAL PAGES IN REPORT #### *****88 $88 8# 8-858> 8K !!80 !!85 0!!8; C!!8K i8 8( 8BAGE: .\.3!OVERALL COST PER MILE OF TRAVEL: ]b]3P*********************************************** TOTAL PAGES IN REPORT #### *****]UPDATEB:12.M00DB\512B:12.Q009;":KA R$% 'm?jP T1 N k  6 W x  . K h Z12#REPLENISHABLE LUBRICANTS USE REPORT:P V\V2OOPSORTB:2.D00B:2.F002A  X 0--6 (5FRdjt  88B (8&58B F8RĐ8;dƐ8 jȐ8D t,,5@+j+4 }    334      334      +l+4     +n+4     `4   +p+4     b4   +r+4     d4   +t+4     f4   +v+46'8EVbtz999 999999.99 999,999.9$$99.99$$999.99 $$999,999.99999.99999999 999,999.9 999,999,999.9 $$9,999.99$$999,999,999.99 $$999,999.99$$999,999,999.99 $$99,999.99999,999,999,999.9999.9 999,999.9 $$999,999.99 67COPYRIGHT 1985 BY:JASON M. BLOOMBERG(&$+ASSOCIATED MANAGEMENT SERVICESJD******************* REPLENISHABLE LUBRICANTS USE REPORT ******* PAGEF #### ***** VEHICLE  DATE OF TYPE OF QUARTS &MILES /PRICE/7 SALES TOTAL IMILES/ NUMBER PURCHASELUBRICANT USED%TRAVELED /QUART 7TAX=PURCHASE IQUARTVP================================================================================77 VP================================================================================6     h4   +x+4     +z+4     +|+4      +~+4       ++4      ++4      E^E37+ ? r  )o T&Q| X32B:2.K00V$7J]p.Av3X0 Z4p \4y^4 } `4! b4"d4# f4$ h4%j4&  l4' n4(  p4)  r4*  t4+ v4, x4- z5py}~67}gikmoqsuZ\TkmVS Q r <>@ B:12.R00E.FFFFFR۟'R)=Qdvǥܥ .CRàנ4ij0VH\$9͡7ƤUΦբ6r^2zp3 ]]3 P==================================..7 NN82 D00@B:2.D00NN8|5 (13<>GPYbm67}uZ31B:1.K00  0CVi|TJ|X0  Z4 \4 ^4 `4b4d4(f4.h42 j4 ;l4 ? n5 (.2;?2r26Xi <v<7 NxN81 D00@B:1.D00==============================================3 3]]3P++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 33""4V___4$44# (AM ___,___._ M-PM''4 DPMM/DD/YY9894 ( ,TMMAM ___,___,___._ TM+AM>D>40TTMAM___,___,___,___._TTM+TM0.04 0"VG/AM___K11014 5#YG/AM____D1<2<4 ;.MA/AM_______________D12424 K$CL/AM_____D1]]3P*********************************************** TOTAL PAGES IN REPORT #### *****Q̝Q3D******************* REPLENISHABLE LUBRICANTS USE REPORT ******* PAGEΝ3F #### *****==3 0SUBTOTAL OF LUBRICANT EXPENDITURES FOR VEHICLE: 4TL_)")4 OT __.___&&&4-PNzN8p5 w2t26 U^U9++++UUU+^E `b b d f h j l n- pJ rk t v x z | ~% B _ |     4 < D F L _ g o w y  #68>@FHNaci|~  35;NPVX^`fy{  %'-/57=PR.TAVTXgZz\^`bdfhjl%n8G L d i  a 6 > q ':M`sceO$$__.__Н3VEHICLEҝ3 DATE OFԝ3TYPE OF֝3QUARTS؝3&MILESڝ3/PRICE/ܝ37 SALES TOTALޝ3IMILES/3NUMBER3 PURCHASE3LUBRICANT USED3%TRAVELED3/QUART37TAX3=PURCHASE3IQUART:(:45'STX$$___.__ ((PO*O)*TR)?*?4> +TOP $$___,___.__ ((PO*O)+STX)0,04K$OPM___._ O/AM4644  (SO/AM ___,___._ SO+O8:84 B )SSTAM $$_,___.__SST+STX3 TOTAL QUARTS: 3 TOTAL MILEAGE: 3 7 SALES TAX: ><>4/SOPAM$$___,___,___.__SOP+TOP9>94B +OPMAM $$___,___.__SOP/TM&&3TOTAL EXPENDED FOR LUBE: $$3+AVERAGE COST PER MILE: >@>4&/TOEAM$$___,___,___.__TOE+SOP9B94B *TTXAM $$__,___.__TTX+SST3 33&TOTAL LU****** TOTAL PAGES IN REPORT #### *****z8BD |8 FW ~8 ON 8 Z 8% _j 80i81 ka !!8-xD = !!82| c!!88 v!!8H 8 8: h5@3f34N N N N+b+4NN N `4E +d+4NN N %^%3! % X32B:2.K00V+ D W j }   ( ; N a t   8 f X0 Z4  \4 ^4   `BE EXPENSES FOR ALL VEHICLES: 37 SALES TAX: 4H44 (TQGAM ___,___._ TQ+O2F24;$OPQAM___._TTM/TQ3TOTAL MILEAGE: &&3"OVERALL MILES PER QUART: :J:4D +LPMAM $$___,___.__TOE/TTM3TOTAL QUARTS: 773*OVERALL LUBRICATION COST PER MILE OF USE: XUPDATEB:13.M00 D;u \513B:13.Q00   N # i 0.:G8UrZ12(NONFUEL OR LUBRICANT EXPENDITURES REPORT:P V\V2OOPSORTB:2.D00B:2.F002A  X 0j6 BFOZ_ikx|4!  b4" d4#  f4$  h4% j4&  l4' n4(  p4)  r4*  t4+  v4,  x4-  z5   ~6' j ..7 NN82 D00@B:2.D00NN8|51 : > G P R [ d f o q z 6 j uZ31B:1.K00 *=Pcv} 9X0  Z4 \4' ^42 `4unu6    9999999 999,999.99 $$999,999.999999999$$999,999,999.99$$999,999,999.99 l 6p7COPYRIGHT 1985 BY:JASON M. BLOOMBERG(&$+ASSOCIATED MANAGEMENT SERVICESJD************* NON-FUEL OR LUBRICATION EXPENDITURES REPORT ***** PAGEF #### ***** VEHICLE  DATE OF WORK ORDER OR$ODOMETER/ AMOUNT OF NUMBER PURCHASERECEIPT NUMBER $READING/PURCHASEVP================================================================================r7t7VP================================================================================SUBTOTAL OF ABOVE EXPENDITURES FOR VEHICLE: v7VP++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@:TOTAL NONFUEL & NONLUBRICATION EXPENSES FOR ALL VEHICLES: `x`7VP*****************************************;b4Kd4[f4ah4e j4 nl4 r n5 '2;K[aenr2r26=P'<v<7 NxN81 D00@B:1.D00NzN8p5 2t26(=P'^9+++++(*,.0/2L4i68:<> @'     2 4 : B D J ] _ e x z N a t  2 E X k         ! # % ' ) + - / ) + % MOUNT OF3NUMBER3 PURCHASE3RECEIPT NUMBER3$READING3/PURCHASE3 SUBTOTAL OF ABOVE''3 EXPENDITURES FOR VEHICLE: ))4 WO __________((4% MM ___,___._++41 WPP $$___,___.__==4 /SWP$$___,___,___.__SWP+WP=$=4:/TWPAM$$___,___,___.__TWP+WPG"G3:TOTAL NONFUEL & NONLUBRICATION EXPENSES FOR ALL VEHICLES: 5UPDATEB:14.M00f UD" \514B:14.Q00%'&3  d _  1 r''Hi8UZ12SUMMARY OF VEHICLE EXPENSES:P Q\Q2JJPSORTB:2.D00              ! # 3 1k<   G Zm*,   "$<>@B:13.R00+,,,,,-;ͣ5I]wʤfàSj|נH,>nۢϥ\p͡I fbAfAfffffĩ٩'3 ] ]3 P================================================================================ 3 3]]3P++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3&3""4V___''4 DPMM/DD/YY004 -"VG/AM___K1114 2#YG/AM____D1<<4 8.MA/AM_______________D1224 H$CL/AM_____D1](]3P*********************************************** TOTAL PAGES IN REPORT #### *****))4 OT __.___::40'STX $___.__ ((PO*O)*TR)QޝQ3D************* NON-FUEL OR LUBRICATION EXPENDITURES REPORT ***** PAGE3F #### *****3VEHICLE3 DATE OF3 WORK ORDER OR3$ODOMETER3/ A+++++++++++++++++++++++++++++++$TOTAL FLEET EXPENDITURES FOR :  FUEL: REPAIRS & PARTS:" LUBRICATION: "TOTAL FLEET OPERATING COST: ``7VP*********************************************** TOTAL PAGES IN REPORT #### *****!!8-I U!!82M!!88R!!8Hb+8h8y88:8& 8 8/ 8 x5@+h+4    `4  +j+4    b4  +l+4) p5 9BMVfv|2t26k^k9++++kkk +13;5\7}9;=?AC!/E#LG%in p v ~   % ' - @ B H J P R X Z ` s u {      ! ' ) /     1 " D $ W & j ( } * , . 0 2 4 6   FHB x  "5H[n%')+-/1357-/#!Bc<>@B:14.R00& Edtţܣơ'c7V0.P-AץkW ) ) d4) ) 3t34  ) 2 2 f42 2 +n+4; W ; ; +p+4D  D D +r+4M  M M 3v34M D ; V V 3^33) a F ; f X32B:2.K00C   ' : M ` s  8 GX0 Z48  \4A ^4 E  `4!N  b4"W  d4#`  f4$i h4%k  j4& t l4' v  n4(   p4)  r4*  t4+   v4,   x58 A E N W ` i k t v  |6  E ..7 NN8s fbAfAfffffĩ٩'Z3 ]\]3 P++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++^3 r30B04-"VG/AM___K11D142#YG/AM____D1<F<48.MA/AM_______________D12H24H2 D00@$B:2.D00NN8z5 $/~6D E uZ31B:1.K00 +>Qdw >zX0  Z4 \4 ^4 `4b4d4f4h4 j4 l4  n5 2r26+<v<7 NxN81 D00@B:1.D00NzN8$CL/AM_____D1]t]3P*********************************************** TOTAL PAGES IN REPORT #### *****>3SUBTOTAL OF ABOVE'@'3EXPENDITURES FOR VEHICLE: =L=4/SWP$$___,___,___.__SWP+WPQ4Q3D********************* SUMMARY OF VEHICLE EXPENSES ************* PAGE63F #### *****83(J(3REPAIRS & PARTS PURCHASES: >h>40TWPAM $$___,___,___.__TWP+WP=P=4/SLE$$___,___,___.__SLE+LE#N#3LUBRICATION EXPENSES: AlA4/3TLE$$___,___,___,___.__TLE+LEf3REPAIRS & PARTS:j3" LUBRICATION: =T=4 /SEG$$___,___,___.__SEG+TGAdA4 &3ATG$$___,___,___,___.__ATG+TG+`+3 TOTAL FLEET EXPENDITURES FOR :b3 FUEL: FXF4 :3VSU$$___,___,___,___.__ SWP+SLE+SEG R 3 FUEL EXPENDITURES: #V#3 $TOTAL OPERATING COST: JpJ47FTO$$___,___,___,___,___.__ TLE+TWP+ATG)n)3TOTAL FLEET OPERATING COST: FCD  V*2B:2.K00Vr#6I\oIb X0 Z4 \4^4  `4! b4" d4#  f4$ h4%j4&  l4' (n4( * p4) 3 r4* < t4+E v4,N x4-Y z5  (*3<ENY~6n..7 NN82 D00@B:2.D00NN8|5x69+/8(N!2MASTERBLRFDFLO FT GLEM OPGPM POTG TLTRVWOWP-@SfyXZ\^`bdfhjlnprtvprl<>@BDFHJLNPRTVXZ\^`bdfhj     #  6 ( I * \ 3o<ENY   / B U h{  APDIRB:2.DIRrΜ %j%51111FUEL USAGE REPORT7l751212#REPLENISHABLE LUBRICANTS USE REPORT<n<51313(NONFUEL OR LUBRICANT EXPENDITURES REPORT/p/51414SUMMARY OF VEHICLE EXPENSESRICE PER QT. ; % TAX RATE: PJ{TAX RATE: should be entered as follows: .10 for 10%, .065 for 6.5%, etc.}60AMOUNT EXPENDED FOR LUBRICANTS (INCLUDING TAX): 0*OTHER PURCHASES - RECEIPT OR WORK ORDER #:8AMOUNT: VP********************************************************************************!h!8 !j!8# l8C n8 0  p8/ C r8FV t8  i v8 :| x8 N$ z8  & |8 E0 ~82 826 8G> 87 D 8, Q 8@ \' ^5+Z+4C C  C  K\K4..7 xUPDATEB:2.L00 D; \42B:2.T00 @ . i9Z{ )Fc `6$&026>DQ\b6C C C L L C L  C  ?X?3+/37;     X32B:2.K00V  0 C V i |   ' : o , z X0 Z4i 9 \4r {^4 v  `4!  b4" d4#  f4$  h4% )j4& F l4' cn4(  p4)  r4*  t4+  v4,  x4-   z5i r v  ~6 0 v ..7 NN82 D00@B:2.D00NN8|5  !*,57@IR[fd6HLMNXbcowx999 999,999.9 999,999.9 $$99,999.99$$99.99 999999.99999$$99.99.9999 $$999,999.99 $$999,999.99f7COPYRIGHT 1985 BY:JASON M. BLOOMBERG)&$.ASSOCIATED MANAGEMENT SERVICESVP********************** VEHICLE SERVICE AND EXPENSE FILE ************************VEHICLE NUMBER: LICENSE PLATE :.DATE OF EXPENDITURE: ODOMETER READING NOW: !LAST FILL UP: : TYPE ENTRY: VP{fuel,lubricants, or other purchases should be individually entered:"F,L, or O"}VPNOTE: should several purchases occure simultaneously, offset their mileage by .1! AMOUNT FOR FUEL PURCHASED:  (PRICE PER GALLON:  C FUEL TYPE: S M{FUEL TYPES: A=Aviation, D=Diesel, E=Ethyl, P=Propane, R=Regular, U=Unleaded}$ QUANTITY OF GALLONS PAID FOR: # (TYPE OF LUBRICANT PURCHASED: QK{LUBRICANT TYPES: A=Automatic Transmission Fluid, E=Engine Oil, G=Gear Oil}%QUARTS OF LUBRICANT PURCHASED: $P6{0 v uZ31B:1.K00 )<ObuMCuX0  Z49 \4Z ^4 `4b4d4!f4'h4+ j4 4l4 8 n5 !'+482r26Qb<v<7 NxN81 D00@B:1.D00NzN8p5 py2t26RCHASED: ""4OL999&&42PO$$99.99$$4GTR.9999,,3QUARTS OF LUBRICANT PURCHASED: 3$PRICE PER QT. 3; % TAX RATE: )()4, WO __________+,+4@ WP $$999,999.997&73*OTHER PURCHASES - RECEIPT OR WORK ORDER #:*38AMOUNT: ''4CDMM/DD/YY((4 M 999,999.9((4/ PM 999,999.9ZZ3 M{FUEL TYPES: A=Aviation, D=Diesel, E=Ethyl, P=Propane, R=Regular, U=Unleaded}]]3P{fuel,lubricants, or other purchases should be individually entered:"F,L, or O"}]]3PNOTE: should several purchases occure simultaneously, offset their mileage by .1E$E47 +LE $$999,999.99((O*PO)*TR)+(O*PO)="=30AMOUNT EXPENDED FOR LUBRICANTS (INCLUDING TAX): 4FFLO_##3ODOMETER READING NOW: 3!LAST FILL UP: 3: TYPE ENTRY: 004w^w9++++www&+s&Mu(nw*y,{.}024 6=8Z:w<>@BD F%    $ , . 6 I  K ' M : O M Q ` S s U W Y [ ] _ a c e  g 1 }y O " ?\ y   &  4 < '  ) < O b u 3   3FYl\^`bdfhjlnSUMdfOVTu"<>@; P; B:2.S00-ʞAzCߥޣ`BԠaΡyR#E֢k_CzCz"V999K1774# )L __________D13VEHICLE NUMBER: 3LICENSE PLATE :""3.DATE OF EXPENDITURE: HUPDATEB:21.M00 DW \521B:21.Q00   m kwz*-Jg:[|Z13VEHICLE USAGE REPORT:P V\V2OOPSORTB:3.D00B:3.F002A  X 0h6DHQSg֜3COPYRIGHT 1985 BY:؜3JASON M. BLOOMBERGڜ3)&+ܜ+3.ASSOCIATED MANAGEMENT SERVICES]ޜ]3P********************** VEHICLE SERVICE AND EXPENSE FILE ************************W W3J{TAX RATE: should be entered as follows: .10 for 10%, .065 for 6.5%, etc.}].]3P********************************************************************************XX3K{LUBRICANT TYPES: A=Automatic Transmission Fluid, E=Engine Oil, G=Gear Oil}**4  TG $$99,999.99&&4 :PG$$99.99  4 NFT_((3 AMOUNT FOR FUEL PURCHASED: 3 (PRICE PER GALLON: 3 C FUEL TYPE: 5 54  (GT 999999.99 TG/PG  4 ETL_+ +3 QUANTITY OF GALLONS PAID FOR: **3 (TYPE OF LUBRICANT PUele6,01234?@AEJKLY999 99999999.99999999 9999999999.9999999999999999.9 j 6n7COPYRIGHT 1985 BY:JASON M. BLOOMBERG&( & ASSOCIATED MANAGEMENT SERVICESVP****************************** VEHICLE USE REPORT ***************** PAGE #### ** VEHICLE  DATE OF TYPE OF OTHER- PURPOSE OF NUMBER  TRIP USESPECIFIC 0TRIPOI{TYPES OF USE:B=Business, C=Commute, P=Personal, R=Recreational, O=Other} MILEAGE TRAVEL-FROM:0 TRAVEL-TO:V P================================================================================p7r7VP================================================================================#SUBTOTAL OF USE FOR VEHICLE: JMILESt7VP++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++TOTAL FLEET MILEAGE: _v_7UO******************************************** TOTAL PAGES IN REPl4  n5 :CNWgw}2r26Y:lC<v<7 NxN81 D00@B:1.D00NzN8p5   2t263DY:lC^9+++++($*A,^.{02468  :"-<$N>&o@(B*| ~ E G I K M O Q S  U  W -             ; = ? A C E G I K M O Q S U W Y [ ] E&C`} &c(v*,.02468ORT #### *******x8Dx z8H |8Q ~8S# 8&g 8  8 81 !!8x Y !!8! !!8& !!85 8=  8$f5@+b+4[  [ [ `4[ [ +d+4d  d d !^!3) T o X33B:3.K00 e x  # 6 \ X0  Z4Y  \4b ^4f `4  b4 d4  f4  h57/FH1 "$&(*,.02468:<>@4Uv<>@y y B:21.R00.!/////=\{-AUg~Ǟ؞.B[Ik Ir%V򣽢O h4|~13VEHICLE USAGE REPORT:PV.D$3COPYRIGHT 1985 BY:&3JASON M. BLOOMBERG-(-3( & ASSOCIATED MANAGEMENT SERVICES]H]3 P================================================================================J3 ,3VEHICLE.3 DATE OF03TYPE OF23OTHER4 j4 l4! n5 Y b f +r+6   b  <v<7 NxN83 D00@$ !"#B:3.D00NzN8p5  $ ( G P o x +t+6  b  uZ31B:1.K00 FYl%UX0  Z4: \4C ^4N `4Wb4gd4wf4}h4 j4 43- PURPOSE OF63NUMBER83 TRIP:3USE<3SPECIFIC>30TRIPV@V3I{TYPES OF USE:B=Business, C=Commute, P=Personal, R=Recreational, O=Other}B3MILEAGED3 TRAVEL-FROM:F30 TRAVEL-TO:\3]^]3P================================================================================`3p3]r]3P++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++t3z3]*]3P****************************** VEHICLE USE REPORT ***************** PAGE #### **\|\3O******************************************** TOTAL PAGES IN REPORT #### *******"L"4 V___'N'4 DMM/DD/YY P 4 N_2R24 OTH___________________<T<4 &PTH_____________________________)V)4  TMH ________._;X;4 SLH++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++TOTAL FLEET MILEAGE: _v_7UO******************************************** TOTAL PAGES IN REPORT #### *******x83  z8 </ |8 >B ~8!R 8 p 8{ 81 8, 8$ f5@+b+4z zz`4zz+d+4  !^!3JuX33B:3.K00   / B U   ? { X0  Z4x  \4 ^4 `4  b4 d4____________________________9Z94 1ELH__________________________9l94= +SZM __________._SZM+TM>x>4$0TZM_______________._TZM+TM"v"3TOTAL FLEET MILEAGE: 0d04"VLH___K11f14!#YLH____D1;h;4&-MAH______________D13j345%CLH______D1*b*3SUBTOTAL OF USE FOR VEHICLE: n3JMILESBUPDATEB:22.M00 B Z522B:22.Q00 *#Bq 'Da~Z13TYPE OF USE REPORT:P [\[2TTPSORTB:3.D00B:3.F002A   f4  h4 j4 l4! n5 x +r+6" .   <v<7 NxN83 D00@$ !"#B:3.D00NzN8p5 : C G f o +t+6   A\A9++++AAA+!#%';)X+u-/1~d f h j l n p  r & t 9 v L & ( * , . 0 2 4 6 8 $ &  0 2  X 0h6 3<>Rp{LlL6   99999999.9 9999999999.9999999999999999.9 j 6n7COPYRIGHT 1985 BY:JASON M. BLOOMBERG&( & ASSOCIATED MANAGEMENT SERVICESVP****************************** TYPE OF USE REPORT ***************** PAGE #### ** DATE OF  TYPE OF OTHER$ PURPOSE OF> VEHICLE # TRIP  USESPECIFIC 'TRIPOI{TYPES OF USE:B=Business, C=Commute, P=Personal, R=Recreational, O=Other} MILEAGE TRAVEL-FROM:0 TRAVEL-TO:V P================================================================================p7 A___r7VP================================================================================*$SUBTOTAL OF TYPE OF USE FOR VEHICLE:&_ 9MILESt7VP++++++ Z \ ^ ` b d f h j l n p r t v x z |  =Zw<>B:22.R00*"+++++R۟j~$4I !:FZQe¡ѥ֡G[oˢDVof$ڦ13TYPE OF USE REPORTRT:PKN.D.Vĝ3COPYRIGHT 1985 BY:Ɲ3JASON M. BLOOMBERG-ȝ-3( & ASSOCIATED MANAGEMENT SERVICES]]3 P================================================================================3 VޝV3I{TYPES OF USE:B=Business, C=Commute, P=Personal, R=Recreational, O+r+6 c<v<7 NxN83 D00@$ !"#B:3.D00NzN8p5 %)HQpy+t+6 c|9+/8oPP < o3MASTERBLRFDELEM N OTH PSLSMTMVFHJLNPRTVX.  <>@BDFHJLNPRTVXZ\^yZcg     $     0=Other}3MILEAGE3 TRAVEL-FROM:30 TRAVEL-TO:3]]3P================================================================================33]]3P++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++33\\3O******************************************** TOTAL PAGES IN REPORT #### *******''4 DMM/DD/YY  4 N_224 OTH___________________< <4 !PTH_____________________________) )4  TMH ________._;;4 SLH____________________________994 1ELH__________________________994, +SZM __________._SZM+TM>>4$0TZM_______________._TZM+TM""3TOTAL FLEET MILEAGE: ]ʝ]3P****************************** TYPE OF USE REPORT ***************** PAGE #### **֝3TRIP؝3 USEڝ3SPECIFICܝ3'TRIP3 A___̝3DATE OFΝ3 TYPE OFН3OTHERҝ3$ PURPOSE OFԝ3> VEHICLE #113$SUBTOTAL OF TYPE OF USE FOR VEHICLE:3&_39MILESFCD  e3B:3.K00 fy$7!]X0  Z4Z \4c^4g`4 b4d4 f4 h4j4 l4! n5 Zcg%'IbI6 \`abcmnx999 999,999.9 999,999.9 999,999.9 d 7COPYRIGHT 1985 BY:JASON M. BLOOMBERG)&$-ASSOCIATED MANAGEMENT SERVICESVP**************************** VEHICLE USE RECORD ********************************VEHICLE NUMBER: LICENSE PLATE NUMBER: 7 DATE OF USE: STARTING LOCATION: 5STARTING MILEAGE: ENDING LOACTION: 5ENDING> MILEAGE: #*MILEAGE TOTAL FOR THIS TRIP:  PURPOSE OF TRAVEL:  3NATURE OF VEHICLE USE: P J{TYPES OF USE: B=Business, C=Commute, P=Personal, R=Recreational, O=Other}P JNOTE: If O (Other) was selected as type of use, it is recommended that you;5specify the type of use in the data entry area below.SPECIFIC OTHER USE: VP***************************************************************APDIRB:3.DIRn(j(52121VEHICLE USAGE REPORT&l&52222TYPE*****************!f!8? !h!8+ 3 j8DRl8en8G xp8 r8G (t8G 2v8 < x8 J[ z8] \5+Z+4t L } } 'X'3 #00X33B:3.K00 ,?Rex ~ # q X0  Z4  \4) ^4- `4L  b4U *d4t G f4} d h4 j4 l4! n5 ) - L U t }  OF USE REPORT<v<7 UPDATEB:3.L00 D\43B:3.T00tr< *Gd^6 (2<[]`6 +r+6 R) xL <v<7 NxN83 D00@$ !"#B:3.D00NzN8p5   6 ? H g i +t+6 R) xL uZ31B:1.K00  3 F Y l  j`  X0  Z4  \4  ^4  `4 b4. d4> f4D h4H  j4 Q l4 U  n5    . > D H Q U 2r26n    _____________________((4G EM 999,999.93ENDING3 LOACTION: 35ENDING3> MILEAGE: ((4G SM 999,999.9 3STARTING LOCATION: 35STARTING MILEAGE: 554G (TM 999,999.9 EM-SM**3*MILEAGE TOTAL FOR THIS TRIP: =œ=4 PM______________________________ Ɯ 4 JNM_ 3 PURPOSE OF TRAVEL: $Ĝ$3 3NATURE OF VEHICLE USE: 3М34OTH____________________!Μ!3SPECIFIC OTHER USE: 004"V999K1774+ )L __________D13VEHICLE NUMBER: ##3LICENSE PLATE NUMBER: 37 DATE OF USE: ]]3P**************************** VEHICLE USE RECORD ********************************2SYSDIR B:PEARL.DIRƛ,,111VEHICLE INFORMATION FILE221223 <v<7 NxN81 D00@B:1.D00NzN8p5 2t26   3 ^9+++++|F~HJLN!P>R[TxVXZ I \ o           "$%#@]zK^q * = P c v y{}p r j l       , ? <>@PB:3.S00!ĞҞ⣈!QȣJqf&=P͡,iT͢VEHICLE SERVICE & EXPENSE FILE&&133VEHICLE USE RECORDVED33 LBR:;<=>?@ABCDEFGHIVED33 LBRJVEGAS LBRKLMNOPQRSVEHTAX $$$TUVWXYZ[\]^_`abcVEHTAX $$$defghijklmnopqrsVEHTAX $$$tuvwxyz{|}~VEHTAX $$$)Fi3COPYRIGHT 1985 BY:3JASON M. BLOOMBERG3)&++3-ASSOCIATED MANAGEMENT SERVICESWȜW3 J{TYPES OF USE: B=Business, C=Commute, P=Personal, R=Recreational, O=Other}WʜW3 JNOTE: If O (Other) was selected as type of use, it is recommended that youB̜B35specify the type of use in the data entry area below.]Ҝ]3P********************************************************************************''4DDMM/DD/YY==4SL______________________________==4EL_________VERIFY is a program which works exactly like FINDBAD except VERIFY is written for CP/M 3.0 and will verify the integrity of a disk. It will not destroy an existing file so it is ok to use on a disk containing valid files. The program will lockout bad sectors on the disk by creating a dummy file called UNUSED.BAD and putting in in user 15. Command format: VERIFY d: c/r (d = A-P) Verify for CP/M Plus v3.3 $ Which drive is to be verified? (A-P) or (Q)uit: $ ABORTED!$[BADBLK]MAP0E -:vvG:v!VERIFY OBJVERIFY DOC.og!vv5po:vSo!xv5bo!G654321Copyright (c) 1983,SDSystems,10111,Miller rdDallas,Texas,752381E!ͳ2;-:1Gv#%:;O> "7^#VS5"9 ! ~G:08/nu~=w~=w^V:srî ͓ͷ & !C :)ʍ*|:}_Ku  Z )=21_ʁAvrv_Qʁ > MͻK Ēnf#B *A|!C}ݾ  ~ ~ '0 C  :OFCi`F)^ N| }ݾ8B}"3K3> [5>> >  yݾ*38>22#F0 @*?#"?*A^"A*Cq#~(p#"C!E"C*A|}Q*C2 *?0 |D-}/ x2"2ͣ̀ͣ̀ͣ̀ͣ̀:0_*:š2–> Ý:w>0#w"* |"è 222"SC2G>*o:0!0!  No Bad Blocks Found $ Verifying Track # [ 0]$ $ **** Error in Command Line ****  Must be "Verify" or "Verify x:" $  *** Bad Spot in Directory Area - Cannot Continue *** $ Cannot Create [BADBLK].MAP $  **** Warning **** System Tracks Bad *** Verifying track # [ ]$ *** Too Many Bad Blocks *** $=!6 Disk Verify for CP/M Plus v3.3 $ Which drive is to be verified? (A-P) or (Q)uit: $ ABORTED!$[BADBLK]MAP0Ev`Dvictory.curP   !"$#&%'(*),+-/.10325467o8:9;<=>?@ADBCEFGIHKJMLNOsCa2Ѐ|$$d>74 !!& 0 HHȇ|nh@BB>L8, g8U"zcҫ=tÖO=2D:ĐԾ1K߃*Jzf7^cp2C#^՘ŝ0;uƼ4C iHåg|[_׾4fѼ|y78uc9m_v >)?ѷa,䨟~r2: c ©G&'ѷE\@dMEo 2 _G} ^sFy y+~CLFo}(4G1xOנ&oմVg~+_?RmJƸUz^?/ pcy44Nc-Eu ·{6~1xkY|fxfߴ3T,/G}a㋮}JOF9_tng|ѵou4foUIS\nmSś}cy4z\׽e}i6|1ܴ3ˍ6&>KCyFHZlژx.ŅhkfGF>M8{bc՗Mp4Xgoca;c jBVpXzB*ըOj׾nc:ًxoWkXb/هl;6Lcwu afgtz_9Wh]}Ggz «@U,}YY* "zL4kzkزo9%uzAcE׾ma8yI cpaVHiF}p׼ jm|됷3ҏ}Fa ¢ ` >*峭}<,%[ņ~Yg8O^=޺Ϯy=ґ&ω~>-k]o< Xt-g>ґ&S0-W9]Mzg9.`Hv|M8c 5*_?C[f1Wh]pgqGiYwj|kQ,5 S8Z0'[\qUꑡɦmz,}Шo*0EJ/) grӸ5k_>4()ɐE"?`YeUΘ~J ^Rz9ƽO#0~> |:d+E"oҧ^g8hj~UӢKi^RT,um5f|>-f8Ϣy3|g0ƽ_>fǎB]Jp}֧l 8ÆWJ/)}*:pjߘ,}VE"idL||IE",ƽZCy׽1ᕛ+(@o0^^%S6>u{{{g @B>fK#\+"\W?K z ߰|+7?D8óu:FCXyg ^zig_-_, !}O\7i |~.}ۺ3O!½~͕WܟO 1ASCII H CLRSCRN NRO %CRT H sDEFLECT C =&DEFLECT NRON'ERALIN NROV(sLIBO1 C Z LIBO1 NROg=LIBVT52 C oHOMCUR NROoLIBVT52 NRO MOVCUR NRONRO COMi"NRO MAN$NRO NRO|README DOC9 1SETCUR NROD8VIDLIB DOCLڃVTTT C T0KNVTTT NRO/* * Ascii.h defines the values of the ascii control characters */ #define NUL 000 #define SOH 001 #define STX 002 #define ETX 003 #define EOT 004 #define ENQ 005 #define ACK 006 #define BEL 007 #define BS 010 #define HT 011 #define LF 0_߲MpNig\<䷊~/J^q!!…Ae>uzEޟEgܻo}@:()j ~h;WnM׵ũbX>bs ˛=ԱYo5vGSۺ,}~FuW8tѳW |oק.4YzuХiFMѷ)2ҧbqvgaV3<~bQga Yz=/pes,Ϛxi*8UDC4ҢKi:GQ6ַҧbs#s^ ܟtu4N04~~18_/ |c.ҧb {}-5Ԋy˃1Hd.Yn"M#)d T!Vo< q7~PhxUiU_z7r9qNCA@3ذw*3~PGB-\q>"1K>d3<ҽMN8+|:`^$i_o&migMt6zJaަ?e174/ {|:M#r00oC,cO4n]*79ᛯ~שc.7-Liy!7BƟjy&eMOx=0; --j) { for (i=0; i 0) { inchar = -1; switch (i) { case SLASH: case BSLASH: if (board[ballx][bally] == ' ') board[ballx][bally] = i; else putchx(BEL); break; case 'd': case 'D': /* delete character */ i = board[ballx][bally]; if (i == SLASH || i == BSLASH) board[ballx][bally] = ' '; else putchx(BEL); break; case 'f': case 'F': /* faster */ if (speed < 1000) { speed += SPEDINC; putspeed(); } break; case 's': case 'S': /* slower */ if (speed > (SPEDINC + 50)) { speed -= SPEDINC; putspeed(); } brlisecs" per second */ #define QUITCH ETX /* ^C exits program */ #define DELETE 0177 /* DELETE (rubout) restarts game */ #define XON DC1 /* ^Q */ #define XOFF DC3 /* ^S */ #define VBAR '|' #define HBAR '-' #define SLASH '/' #define BSLASH '\\' #define BALL 'O' #define TARGET '*' char board[MAXX][MAXY]; /* board with current layout */ int best; /* best score so far */ int inchar; /* character input buffer */ int ballx,bally,ballxv,ballyv; /* ball positioning data */ int speed,dist; /* speed control */ int targleft; /* no. of targets remaining */ int msecs,secs; /* timers */ int newtime; /* time remaining */ char bellflag; /* turns off/on bell output */ main() { int i; clrscrn(); puts("Welcome to Deflection\n"); for (i=0; i<30000; ++i) ; best = 0x7fff; speed = ISPEED; bellflag = TRUE; while (playgame()); clrscrn(); } playgame() { int i,j; char buff[100]; inchar = -1; /* initially no character input */ clrscrn(); getchx();eak; case DELETE: /* new game */ clrscrn(); return(0); break; case 'h': case 'H': /* help */ help(); return(0); break; default: putchx(BEL); break; } } switch (board[ballx][bally]) { case VBAR: ballxv = -ballxv; break; case HBAR: ballyv = -ballyv; break; case BSLASH: i = ballxv; ballxv = -ballyv; ballyv = -i; break; case SLASH: i = ballxv; ballxv = ballyv; ballyv = i; break; case TARGET: if (--targleft <= 0) { clrscrn(); return(0); } puttarg(); board[ballx][bally] = ' '; do { nx = rand() % (MAXX-2) + 1; ny = rand() % (MAXY-2) + 1; } while (board[nx][ny] != ' '); board[nx][ny] = TARGET; ouch(nx,ny+1,TARGET); break; } nx = ballx + ballxv; ny = bally + ballyv; ouch(nx,ny+1,BALL); ouch(ballx,bally+1,board[ballx][bally]); setcux(0,0); if (newtime) puttime(); ballx = nx; bally = ny; /* * now delay for awhile */ while (dist < (ballyv ? 22000 : 10000(); } return(c); } return(-1); } /* * print speed */ putspeed() { char buff[10]; sprintf(buff,"%03d",speed/10); buff[3] = '\0'; outs(SPEEDX,SPEEDY,buff); } /* * update target count */ puttarg() { char buff[10]; sprintf(buff,"%02d",targleft); buff[2] = '\0'; outs(TARGX,TARGY,buff); } /* * update time display */ puttime() { char buff[10]; sprintf(buff,"%03d",secs); buff[3] = '\0'; outs(TIMX,TIMY,buff); newtime = FALSE; } /* * Special version of set cursor which utilizes putchx. * This version is for VT-52. * Well, so much for portability. */ setcux(x,y) int x,y; { putchx(ESC); putchx('Y'); putchx(23-y+' '); putchx(x+' '); }.in 10 .rm 70 .he " DEFLECT(6) .fo " 01/01/82 NAME .br .ti +5 deflect - the game of deflection .sp SYNOPSIS .br .ti +5 deflection .sp DESCRIPTION .br .in +5 The object of the game of DEFLECTION is to deflect the ball usin)) putchx(NUL); return(1); } /* * explain the game */ help() { clrscrn(); printf("The object of the game is to deflect the ball\n"); printf("by using the '/' and '\\' characters so that it\n"); printf("hits the target. The time it takes to eliminate\n"); printf("20 targets is your score.\n\n"); printf("Other characters recognized:\n\n"); printf("\tf - increases the speed of play\n"); printf("\ts - decreases the speed of play\n"); printf("\td - deletes the character at the current position\n"); printf("\th - prints this message\n"); printf("\t^S - suspends execution\n"); printf("\t^Q - resumes execution\n"); printf("\tDELETE(rubout) - restarts the game\n"); printf("\t^C - quit\n"); printf("\nAny other characters will typically cause the bell\n"); printf("to sound. Typing ^G (bell) will toggle the flag\n"); printf("which enables/disables the output of bells.\n\n"); printf("Type a character to resume play: "); getchar(); clrscrn(); } /* * Outputg the '/' and '\' characters so that it hits a target. The time it takes to eliminate twenty targets is the score for that game. .sp Some characters that affect the play of the game are as follows: .sp .in +3 F - increases the speed of play .br S - decreases the speed of play .br D - delete the character at the current position .br H - print the help message .br ^S - suspends execution .br ^Q - resume execution .br DELETE - restart the game .br ^G - toggle the bell output flag .br ^C - exit from the game .sp .in -3 Any other characters typically cause the bell to sound. Typing a bell (^G) will toggle the flag which enables/disables the output of bells. .sp Both lower and upper case characters are recognized. .in 10 .rm 70 .he " ERALIN(3) .fo " 09/29/82 NAME .br .ti +5 eralin - erase line .sp SYNOPSIS .br .ti +5 eralin(y) .br .ti +5 int y; .sp DESCRIPTION .br .in +5 ERALIN generates the appropriate code sequence to cause th character at location x,y */ ouch(x,y,c) int x,y; int c; { setcux(x,y); putchx(c); } /* * Position cursor to x,y - then output string */ outs(x,y,s) int x,y; char *s; { setcux(x,y); puts(s); } /* * Special version of puts - needed by srand1 */ puts(s) char *s; { while (*s) putchx(*s++); } /* * Special variation of putchar */ putchx(c) int c; { if (++msecs >= MSPS) { msecs = 0; ++secs; newtime = TRUE; } dist += speed; if (inchar == -1) { inchar = getchx(); switch (inchar) { case BEL: bellflag = !bellflag; break; case XOFF: while (inchar != XON) { inchar = getchx(); } inchar = -1; break; } } if (c == '\0') return; if (c != BEL || bellflag) bios(4,c); if (c == '\n') bios(4,'\r'); } /* * special variation of getchar */ getchx() { int c; if (bios(2)) { for (c=0; c<10; ++c) ; /* debounce */ c = bios(3) & 0177; if (c == QUITCH) { clrscrn(); exite contents of the line specified by Y to be replaced with blanks from the left margin to the end of the line. .sp .ti -5 SEE ALSO .br libvt52(3), libo1(3) /* * Library of routines to utilize * control codes for the Osborne 1. * * Stephen L. Browning * 5723 North Parker Avenue * Indianapolis, Indiana 46220 */ #include "crt.h" #define ESC 033 /* * Home the cursor and clear the screen */ clrscrn() { putchar('\032'); } /* * Erase entire line */ eralin(_y) int _y; { putchar(ESC); putchar('='); putchar(23-_y+' '); putchar(' '); putchar(ESC); putchar('T'); } /* * Erase from cursor to end of line */ erteol() { putchar(ESC); putchar('T'); } /* * Set terminal in graphics mode */ graphics() { putchar(ESC); putchar('g'); } /* * Move cursor to home position */ homcur() { putchar('\036'); } /* * Move cursor to one of eight adarker Avenue * Indianapolis, Indiana 46220 */ #include "a:crt.h" #define ESC 033 /* * Home the cursor and clear the screen */ clrscrn() { putchar(ESC); putchar('H'); putchar(ESC); putchar('J'); } /* * Erase entire line */ eralin(_y) int _y; { putchar(ESC); /* setcur(0,_y) */ putchar('Y'); putchar(23-_y+' '); putchar(' '); putchar(ESC); /* erteol() */ putchar('K'); } /* * Erase from cursor to end of line */ erteol() { putchar(ESC); putchar('K'); } /* * Erase from cursor to end of screen */ erteos() { putchar(ESC); putchar('J'); } /* * Set terminal in graphics mode */ graphics() { putchar(ESC); putchar('F'); } /* * Move cursor to home position */ home() { putchar(ESC); putchar('H'); } /* * Move cursor to one of eight adjacent locations */ movcur(_dir) int _dir; { switch (_dir) { case N: putchar(ESC); putchar('A'); break; case NE: putchar(ESC); putchar('A'); jacent * locations */ movcur(_dir) int _dir; { switch (_dir) { case N: putchar('\013'); break; case NE: putchar('\013'); putchar('\014'); break; case E: putchar('\014'); break; case SE: putchar('\012'); putchar('\014'); break; case S: putchar('\012'); break; case SW: putchar('\012'); putchar('\010'); break; case W: putchar('\010'); break; case NW: putchar('\013'); putchar('\010'); break; } } /* * Set terminal to its default * power up mode. */ normal() { putchar(ESC); putchar('G'); } /* * Set cursor to coordinate value. * 0,0 is lower left corner of display * with "window" set to upper left * of the video ram. */ setcur(_x,_y) int _x, _y; { putchar(ESC); putchar('='); putchar(23 - _y + ' '); putchar(_x + ' '); } .in 10 .rm 70 .he " LIBO1(3) .fo " 09/29/82 NAME .br .ti +5 libo1 - terminal I/O library for the Osborn putchar(ESC); putchar('C'); break; case E: putchar(ESC); putchar('C'); break; case SE: putchar(ESC); putchar('B'); putchar(ESC); putchar('C'); break; case S: putchar(ESC); putchar('B'); break; case SW: putchar(ESC); putchar('B'); putchar(ESC); putchar('D'); break; case W: putchar(ESC); putchar('D'); break; case NW: putchar(ESC); putchar('A'); putchar(ESC); putchar('D'); break; } } /* * Set terminal to its default power up mode */ normal() { putchar(ESC); putchar('G'); } /* * Set cursor to coordinate value. * 0,0 is lower left corner of display */ setcur(_x,_y) int _x, _y; { putchar(ESC); putchar('Y'); putchar(23-_y+' '); putchar(_x+' '); } .in 10 .rm 70 .he " HOMCUR(3) .fo " 09/29/82 NAME .br .ti +5 homcur - home cursor .sp SYNOPSIS .br e 1 .sp DESCRIPTION .br .in +5 LIBO1 provides a standard interface to cursor manipulation functions available with the Osborne 1 computer. .sp Some of the functions provided are listed below: .sp .in +3 .br clrscrn - home the cursor and clear the screen .br eralin - erase a line .br homcur - home cursor .br movcur - move cursor to adjacent position .br setcur - set the cursor to a coordinate position .sp .ti -3 Other functions which may be unique to the Osborne are: .sp erteol - erase to end of line .br graphics - place terminal in graphics mode .br normal - place terminal in power up mode .sp .in -3 .br The use of these functions to control cursor operations on any suitable CRT is one approach to providing more portable code. .sp .ti -5 SEE ALSO .br clrscrn(3), eralin(3), homcur(3), movcur(3), setcur(3), vttt(6), deflect(6) /* * Library of routines to utilize control codes * for the DEC VT-52 terminal. * * Stephen L. Browning * 5723 North P.ti +5 homcur() .sp DESCRIPTION .br .in +5 HOMCUR generates the appropriate code sequence to cause the cursor to be placed in the home position (upper left corner of the display area). The contents of the display are not affected. .sp .ti -5 SEE ALSO .br libvt52(3), libo1(3).in 10 .rm 70 .he " LIBVT52(3) .fo " 09/29/82 NAME .br .ti +5 libvt52 - terminal I/O library for VT-52 .sp DESCRIPTION .br .in +5 LIBVT52 provides a standard interface to cursor manipulation functions available with the Digital Equipment Corporation VT-52 video terminal or any other terminal which emulates the VT-52. .sp Some of the functions provided are listed below: .sp .in +3 .br clrscrn - home the cursor and clear the screen .br eralin - erase a line .br homcur - home cursor .br movcur - move cursor to adjacent position .br setcur - set the cursor to a coordinate position .sp .ti+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#.¶66*>?w#> w#.7:77!a{   `OE!y6$ -7rBo&))T])))!yg!>3͹(>3>@2:;u *1;";.04:/;2/;";|¶!}§!=/04ʽ!ª!=004>G>)3!#'͇&)*͹( 1!&,2#%"d/04b(ͨ&&)*͹(}(~7#^#V#/" 1)))S~+2G~`24;29;#~23;~?>o"=2-;#^#V#^#V#"5;^#V"7;:9;ʙ"* ;!:4;@ʪ""7;*K;#w"K;*K;~""/+25:+"K;*K;+"K;!>"K;6!/>"M;*K;~*3;*M;s#r#*5;s#r#*7;s#r#*/;s#r#*1;s#r#:9;w#"M;{#*>;*M;s#r#*@;s#r#*B;s#r#*:;s#r#*<;s#r#:D;w#"M;{#|?†'(l(Ñ D C Ùõ( *A2!|9DM! ~#fo! ~#fo! Usage:nro inpu -3 Other functions which may be unique to the VT-52 are: .sp erteol - erase to end of line .br erteos - erase to end of screen .br graphics - place terminal in graphics mode .br normal - place terminal in power up mode .sp .in -3 .br The use of these functions to control cursor operations on any suitable CRT is one approach to providing more portable code. .sp .ti -5 SEE ALSO .br clrscrn(3), eralin(3), homcur(3), movcur(3), setcur(3), vttt(6), deflect(6) .in 10 .rm 70 .he " MOVCUR(3) .fo " 09/29/82 NAME .br .ti +5 movcur - move the cursor to an adjacent position .sp SYNOPSIS .br .ti +5 #include "crt.h" .sp .ti +5 movcur(dir) .br .ti +5 int dir; .sp DESCRIPTION .br .in +5 MOVCUR generates the appropriate code sequence to cause the cursor to be moved to any one of eight adjacent character cells. DIR describes the direction of the desired movement in terms of compass points; N, S, E, W, NE, SE, SW, and NW. These deft output ͡È ! ~#fo++|8*. 6#6! w#wL*(*. s#r*"! ^#Vr+s~#foͤ`is#r*. ~#fo+|ʩ*(! ^#Vr+s~#foͧ! s#r`i~#fo#|! ~#fo#|!nro:cannot open or create file ͡È ͪ*"! ͭ#|/ ! n}.# ! Ͱ, ! ͳ*~#foK !Ͷ*. ~#fo!͹*. ~#foͼ`i~#foͿ! ~#foͿ!9!9DM*6#6*##6#6*w#w*6<#6*w#w* w#w* w#w*6#6*w#w*6#6*w#w*6B#6*6#6*6#6*6#6*6#6*~#fo*~#fo*~#fo* s#r*"6 *6 `i6#6`i~#fo `i~#fo*"6`i~#fo*6`i^#Vr+sß *0 w#w*2 w#w*4 w#w`iw#w`i~#fo2 `i~#fo*6 6`i^#Vr+s * 6!9J Ê+!9DM`iw#w`i~#fo ! ~#fo`i~#fo! ~#foG s! ~#fo`i~#fon} ! ~#fo`i^#Vr+s6`i~#fo: ! ~#fo`i~#fon} ! ~#fo`i^#Vr+s6`i~#fo+|͝ !initions are found in the file crt.h. Movement in some directions may cause the contents of the display to be altered. .sp .ti -5 SEE ALSO .br libvt52(3), libo1(3)*K͞+ 5 5>'+FÎr7 :2!q: ʊ *M8 ^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r `i~#fo: `i^#Vr+sX ! ~#fo`i^#Vr+s6`i~#fo: !9[ u'_õá!9DM! ~#foF `is#r`i~#fo#|¸ ! ~#fo! ï nro: unrecognized command %s I ì! ! ~#foL ! s#r`i~#fo> >ʜ > > > >> >C> >Q>! >j>- >ʃ>9 >>E >>Q >>] >> i >-> u >>  >>  >?> ™ >{ì*~#foҸ !O !!*~#fo#! n&! ~#fo*R *~#fo*s#rìU ìU !!!! n&! ~#fo* R ìU *6#6ì*! ~#foX ì*"! ~#foX ì*~#fo+!!! n&! ~#fo*R *~#fo*s#rì*6#6ì!!!! n&! ~#fo*##R ìU *w#wì*w#wì!*~#fo*~#fo*~#fo*~#fo#!B! n&! ~#fo*R *~#fo*~#fo*~#fo* s#rì!*~#fo#!<! n&! ~#fo*R *!! ! ~#fo͟* ^#Vr+s* ~#foi! ~#fo͢! ~#foͥ* ^#Vr+s! ~#fon} ʇ! ~#fon} —! ~#foͥ*~#fo|³! ~#foͥ! ! ~#foͨ`is#r!! ͫ! ~#fo`i~#fos#ró!9 æ}"*~#fo*s#r*^#Vr+s*~#fon*~#fo+*~#fo*"*~#fo*~#fo*~#fo#*s#rì(!9DM! ~#fo,`iw#w`i~#fo! ~#fo,*. ~#fo! ͩ*. ~#fo! ͩ*. ~#fo! ͩ`i^#Vr+s!9!9DM! ~#fo! ~#fo`! ~#foh! ~#fouæ}"*~#foo*~#fo*~#fo*r*~#fo+o!9DM! ~#fo! ~#fo! ~#fo! ~#fo( #æ5l!9DM*~#fo|H*~#fo* ~#foK`iw#w`i~#fo*~#foҋ*. ~#fo! `i^#Vr+sQ*~#fo*s#r*. ~#fo! ~#fo* ~#fo*~#fo*##~#fo+  *~#fo*##~ì!!!! n&! ~#fo! R ! ~#foO ìU *~#fo!!! n&! ~#fo*R ì!!!! n&! ~#fo* R ì!9æ5l!9DM͸*~#fo* ~#fo*~#fo|ͻ* ~#fo#*~#fo! ~#fo;*~#fo! ~#fos#r*~#fo* ~#fos{Ü,!9DM! ~#fo#n&x`is! ~#fo##n&x! s`in}b! n}p!V`in}b! n}r!V`in}c! n}e!V`in}f! n}i!V`in}f2! n}o2!V`in}hL! n}eL!V`in}if! n}nf!V`in}l€! n}s€!V`in}nš! n}fš!V`in}p´! n}l´! V`in}r! n}m! V`in}s! n}p! V`in}t! n}i! V`in}u! n}l! V`in}j6! n}u6!V`in}nP! n}jP!V!V!9h!9DM! ~#fon} ʫ! ~#fon} ʫ! ~#fon} ʫ! ^#Vr+sp! ~#fo! ~#fobs#r! ~#fo! ~#fons! ~#fon}+! ~#fon}-! #fo*s#r*~#fo* ~#fo2!9A!9DM>`iw#w! ~#fo`i~#fon} v`i^#Vr+sR! ~#fo`i~#fon} ʸ! ~#fo`i~#fon} ʸ`i~#fo*s#r! w#w! ~#fo`i~#fon}! ~#fo! ~#fo! ~#fo`i^#Vr+sns! ^#Vr+s! ~#fo! ~#fo6!9!9DM! w#w`iw#w! ~#fo`i~#fon} ʔ! ~#fo! ~#fo+Ҕ! ~#fo`i~#fon&0ڲ! ~#fo`i~#fon&9&! ~#fo`i~#fon&A! ~#fo`i~#fon&Z&! ~#fo`i~#fon&aZ! ~#fo`i~#fon&zZ! ~#fo! ^#Vr+s6_! ~#fo! ^#Vr+s6! ~#fo! ^#Vr+s! ~#fo`i~#fons`i^#Vr+sG! ~#fo! ^#Vr+s6 ! ~#fo! ~#fo6! ~#fon}! ^#Vr+s! ^#Vr+sns! ~#fo6!9`#!9DM!*~#fo*~#fo! ~#fo *s#r!9DM`iw#w! ~#fon} ʌ! ~#fon} £`i^#Vr+s! ^#Vr+sn! ~#fon} ! ! ~#fon}! ! ~#fon} ! ! ~#fon} ! ~#fon} ! ! ~#fo! ^#V^#Vr+s! ~#foe!5!9DM! n} F F+_-â! ~#fo! ~#fos#rû! ~#fo~#fo! ~#fos#rû! ~#fo~#fo! ~#fos#rû! ~#fo! ~#fos#rû! ~#fo! ~#fo! ~#fo~#fos#r! ~#fo! ~#fo! ~#fo~#fos#r*0 ~#fo~*0 ~#fo*6 6 *0 ~#fo#*6 6 *0 ~#fo##*6 6*6 *0 w#w*2 w#w*4 w#wç!9DM! ~#fon} ! ~#fon} ! ~#fon} ! ^#Vr+sï! ~#foͤ`is#r! ~#fo`i~#fos#r! ~#fon}'2! ~#fon}"=! ^#Vr+s! ~#fon}l! ^#Vr+s! ^#Vr+sns=! ~#fo6!9!9DM`iw#w! ~#fon} ʫ! ~#fon} `i^#Vr+s! ^#Vr+sÍ`i~#fo!9\!9DM`iw#w! ~#fon}J! ^#Vr+sn&! s#r! ~#fo#|*`i~#foS`i~#fo ?! ~#fo`is#r`i~#foS!9!9DM! n&0ڄ! n&9Ҋ!Õ! n&î;1`= !~9DM! ~#fon} ! ~#fon} ! ~#fon} ! ~#fo͜* ~#for+sns! ^#Vr+s`i^#Vr+sã! ~#fo6`i~#fo4 !9L `##$!9DM! ~#fo@ `is#r! ~#foC *0 ~#fo! s#r*~#fo*~#fo! s#r*0 ~#fo *2 ~#fo`i~#fo! ~#fo ! ~#foҿ!! ~#fo*0 ~#fos#r*~#fo+|¼!! ~#fo*2 ~#fo#! s#r*4 ~#fo! ~#fo*0 ~#fo+*6 F ! ~#foҼ!*4 ~#foҼ!*0 ~#fo! ~#fo+s#rI ! ~#fo! s#r*0 ~#fo*6 ! s#r! ~#fon}"! ^#Vr+s! ^#Vr+sns!! ~#fo*0 s#r*0 ^#Vr+s*6 6 *2 ~#fo`i~#fo#s#r*4 ^#Vr+s! 9Æ"%(!9DM`iw#w! ~#fo`i~#fon}#! ~#fo`i~#fon}#"*. ~#fo!! ~#fò" #*. ~#fo! ~#fo`i~#fon&̓"`i^#Vr+sÔ"!9&#(!9DM! ~#fon}^#! ~#fo! ^#Vr+sn&##.#!9DM`iw#w! ~#fon}#! ~#fon}—#`i^#Vr+sþ#! ~#fon} ʾ#! ~#fon} ʾ#`i^#Vr+s! ^#Vr+sn#`i~#fo#!9!9DM`iw#w! ^#Vr+sn} $`fo! ~#fo~#fo͓+`is#r!?,! ~#fo##^#Vr+sÓ,! ~#fo##͐?+s#r! ~#fo! ~#fos#r! ~#fo^#Vr+sn&Ó,!9â,o0!9DM! n&͟,|,! n& ,! n&!9DM͐|,͐,͐-Þ0H1w11!i9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{.0`in}%0! ! s#r! 6#6! s! s͐n}-‘-! ^#Vr+s! 4͐n&,}ʮ-! -ñ-!! s#r! ^#Vr+sn`is{.-! -! s#r! 4! ^#Vr+sn`is`in&-}D%.Ua.Xj.Os.Cʹ.S.0͐~#fo|a.! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 y.! 6y.! 6! ~#fo! n&! ^#Vr+s~#fo! ,ѯgs#rb/! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+sb/! n}.! 6#6! ^#Vr+s~#fo! s#r͐n}b/͐|b/! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s/͐6! ! s#r! n}¥/! ^#Vr+s!ҥ/! ^#Vr+s6 ~/͐! ^#Vr+sns{/! ^#Vr+så/! n}/! ^#Vr+s!/! ^#Vr+s6 /i^#Vr+s#`i~#fo$!9#$5!9DM! ~#foM$! ~#foP$%* n}͝* s! ~#fo! s#r! ~#fo+! s#r! ~#fo+`is#r`i~#fo! ~#fo!} $! s#r`i~#fo! ~#fo%! ~#fo! ~#fo! ~#fo`i~#fons! ~#fo`i~#fon} %* n}@%! ~#fo+! ~#fo#! s#r]%! ~#fo! ~#fo! s#r! ~#fo! ~#fos#r! ^#Vr+s! ~#fo%! ^#Vr+s! ~#fo! ~#fo6 ! ^#Vr+sÄ%`i^#Vr+s! ^#Vr+sú$! 9%ð&(!9DM!`i! ~#fo%! s#r! ~#fo#! s#r! ~#fo! ~#fo[&! ~#fo! %! ^#Vr+s#&! w#w! ~#fo! ~#foҧ&! ~#fo! ~#fo`in&%! ^#Vr+sc&! 9ö&,!9DM! ~#foͳ&! s#r`i6! 6#6! ^#Vr+s`i! ~#fo 0s! ~#fo s#r! ~#foF'! ~#fo! ~#fo&! ~#fo|~'! ~#fo! ~#fo~'! ^#Vr+s`i6-! w#w! ~#fo! ~#fo'! ^#Vr+s! ~#fo! ~#fo+`ins! ^#Vr+sÆ'! ~#fo'!9',=0!y9DM!0! ^#Vr+s`ins+0! ^#Vr+s`ins5-͐6!9C02!9DM͐n}m0! ^#Vr+sn&@0K0!9DM! n&Aͯښ0! n&Zͯä0Þ0!9DM͐͐ 0͐^#Vr+s͐ 0͐00͐7s!&?1͐ ͐͐ ͉͐͡0`is͐ ͐͐ )͐͡0`in&#&?1!9!9DM! n&0ͯs1! n&9ͯ}1H1!9DM`iw#w͐~#fon&z1}1͐ ?͐^#Vr+snѯg`is#rË1͐1!912!9DM! n&1|2! n& 2! n&!9DM! n&aͯ=2! n&zͯ#7,2q*&:q):ʀ2=ʀ2=r:qo& !\&!æ2È2D27*͠2\!*ͣ2  2  2_ 27:O*o`7:)~:,"s!"u*|*u}3*~#T3"*s*u}3#"u*+"A37*|DM**3ڮ3><3~# x¢3 ><3~+ x¾3|}347:,*3:*3}|2q `i'`i'!9 (D2!9DM! ~#fo!͐(s#rzN(!! ~#fo##w#w! ~#fo~#fou(È2Ý2!9DM͐o(! ~#fo͐r(s#rz(!! ~#fo! ~#fos#r! ~#fo##6#6! ~#fo~#fo(233!9DM͐+|)! n&(͐++|.)! n&!(͐+++|M)! n&!(! ~#fo##^#Vr+szʆ)! ~#fo^#Vr+s! ns&!! ~#fo! ~#fo~#fo(ʸ)!! ~#fo##6#6! ~#fo! ~#fos#r! ~#fo^#Vr+s! ns&*333!9DM͐0*!Á+! ~#fo##~#foM*!Á+! ~#fo##~#fo`is#r͐! ~#fo! ~#fo~#fo *͐ʦ*!Á+͐+?`is#r! ~#fo##~#fo|N+!! ~#fo! ~#fo͐*! ~#fo##~#fo͐s#r! ~#fo~#fo͐s#r!!! ~#fo~#fo*Á+! ~#fo##6#6! ~#fo! ~#fos#r!Á+!9Ö+;43p4!9DM͐|­+͍+Ó,͐+++|+!͐+Ó,! ~#fo##^#Vr+sz+! ~#fo^#Vr+sn&Ó,!! ~# )44:qw4! {w:woJ42w&!o m4 . &7:)~:,"s!"u*|4**s4! ~46*u*+"*"*u#"uÒ4 , FNxg>Goy 5$ NRO(1) NAME nro - text processor SYNOPSIS nro inputfile [outputfile] DESCRIPTION NRO is a text processor and formatter based on the design provided in Software Tools by Kernighan and Plauger. The text and commands found in inputfile are processed to generate formatted text. The output may be directed into a file if outputfile is present in the command line; otherwise, the output will appear at the user console. C header. The format is the same as for the footer. in - indent left margin to the column value specified by the argument. If no argument is provided, the left margin is set to zero. ju - justify causes blanks to be inserted between words in a line of output in order to align the right 11/21/80 NRO(1) margin. The default is to justify. ls - line spacing is set to the value specified by the argument. The default is for single spacing. nf - no fill specifies that succeeding text should be printed without rearrangement. nj - no justify specifies that no attempt should be made to align the right margin. The default is to justify. pl - page length specifieommands are distinguished by a period in column one of the input followed by a two character abbreviation for the command funtion. The abbreviation may then be followed by an optional numerical argument. The numerical argument may be an absolute value such as setting the right margin to a particular column, or the argument may be preceded by a plus sign or a minus sign to indicate that the parameter should be modified relative to a previous setting. The following commands are recognized: bp - begin page causes succeeding text to appear at the top of a new page. The optional argument specifies the page number for the new page. The default value is one. br - break causes succeeding text to start on a new line at the curs the number of lines per output page. The default is sixty-six. rm - right margin sets the column value for the right margin. The default is sixty. sp - spacing sets the number of blank lines to be output between printed lines. ti - temporary indent alters the left margin value for a single succeeding line of text. ul - underlining is accomplished character by character. The optional argument specifies the number of lines to be underlined. 11/21/80  nj - no justify specifies that no attempt should be .in 10 .rm 70 .he " NRO(1) .fo " 11/21/80 NAME .br .ti +5 nro - text processor .sp SYNOPSIS .br .tirent left margin. There is no numerical argument for this command. ce - causes the next line of text to appear centered on the output. The optional argument specifies if more than one line is to be centered. fi - fill causes the input text to be rearranged to obtain the maximum word count possible between the previously set left and right margins. No argument is expected. fo - specifies text to be used for a footer. Leading blanks may be recognized by preceding them with a quotation mark. The absence of footer text indicates that a footer should not be printed. The presence of the character '#' in the text yields the current page number. he - specifies text to be used for a  +5 nro inputfile [outputfile] .sp DESCRIPTION .br .in +5 NRO is a text processor and formatter based on the design provided in Software Tools by Kernighan and Plauger. The text and commands found in inputfile are processed to generate formatted text. The output may be directed into a file if outputfile is present in the command line; otherwise, the output will appear at the user console. Commands are distinguished by a period in column one of the input followed by a two character abbreviation for the command funtion. The abbreviation may then be followed by an optional numerical argument. The numerical argument may be an absolute value such as setting the right margin to a particular column, or the argument may be preceded by a plus sign or a minus sign to indicate that the parameter should be modified relative to a previous setting. The following commands are recognized: .sp .in +5 .br .ti -5 bp - begin page causes succeeding text to appear at the top of a new page. The optional ished character by character. The optional argument specifies the number of lines to be underlined. The programs provided on this diskette are primarily concerned with implementation of libraries to control cursor movement on a variety of video devices. The files LIBVT52.C and LIBO1.C are examples of just such libraries. The files VTTT.C and DEFLECT.C are rewrites of games which make use of the above libraries. To generate an executable version, first create a .CRL file using the compiler, then link in the usual way, specifying the library for the target terminal. clink vttt libvt52 would create the file VTTT.COM for use with a VT-52 terminal. Likewise, the command clink vttt libo1 would create the file VTTT.COM for use with the Osborne 1. The file NRO.COM is a word processor similar to ROFF and WP. The sources were not included because of the similarity, and because the others are probably more complete implementations. NRO.COM is included to argument specifies the page number for the new page. The default value is one. .sp .ti -5 br - break causes succeeding text to start on a new line at the current left margin. There is no numerical argument for this command. .sp .ti -5 ce - causes the next line of text to appear centered on the output. The optional argument specifies if more than one line is to be centered. .sp .ti -5 fi - fill causes the input text to be rearranged to obtain the maximum word count possible between the previously set left and right margins. No argument is expected. .sp .ti -5 fo - specifies text to be used for a footer. Leading blanks may be recognized by preceding them with a quotation mark. The absence of footer text indicates that a footer should not be printed. The presence of the character '#' in the text yields the current page number. .sp .ti -5 he - specifies text to be used for a header. The format is the same as for the footer. .sp .ti -5 in - indent left margin to the column value speciallow processing of manual pages which document the programs provided. Each of the libraries have manual pages, and each of the standard functions from the libraries have manual pages. The format for these manual pages is similar to that used in the Unix environment. The file NRO.NRO is the manual page input to NRO which describes NRO.COM. The file NRO.MAN is the result of processing NRO.NRO by NRO.COM. .in 10 .rm 70 .he " SETCUR(3) .fo " 09/29/82 NAME .br .ti +5 setcur - set the cursor to coordinate position .sp SYNOPSIS .br .ti +5 setcur(x,y) .br .ti +5 int x, y; .sp DESCRIPTION .br .in +5 SETCUR generates the appropriate code sequence to cause the cursor to be moved to the character position described by the parameters X and Y. This routine considers the display screen to occupy the first quadrant of the X,Y coordinate space. As such, cursor position 0,0 is locfied by the argument. If no argument is provided, the left margin is set to zero. .sp .ti -5 ju - justify causes blanks to be inserted between words in a line of output in order to align the right margin. The default is to justify. .sp .ti -5 ls - line spacing is set to the value specified by the argument. The default is for single spacing. .sp .ti -5 nf - no fill specifies that succeeding text should be printed without rearrangement. .sp .ti -5 nj - no justify specifies that no attempt should be made to align the right margin. The default is to justify. .sp .ti -5 pl - page length specifies the number of lines per output page. The default is sixty-six. .sp .ti -5 rm - right margin sets the column value for the right margin. The default is sixty. .sp .ti -5 sp - spacing sets the number of blank lines to be output between printed lines. .sp .ti -5 ti - temporary indent alters the left margin value for a single succeeding line of text. .sp .ti -5 ul - underlining is accompl ated in the lower left corner of the display area. It should be noted that most terminals address the cursor in terms of a row and column address rather than an x,y position. The row,column addressing tends to place the display screen in the fourth quadrant and although this may be useful for text applications, it seems cumbersome for graphics applications. .sp .ti -5 SEE ALSO .br libvt52(3), libo1(3)Description: Standard Libraries for video terminals and games demostrating their use. Size Name Comments 2k -CATALOG.DOC 1k ASCII.H Header file of ASCII character definitions 1k CLRSCRN.NRO Manual page input to NRO.COM 1k CRT.H Header file for video library 8k DEFLECT.C The game of deflection 1k DEFLECT.NRO Manual page input to NRO.COM 1k ERALIN.NRO Manual page input to NRO.COM 1k HOMCUR.NRO Manual page input to NRO.COM 2k LIBO1.C Video library for Osborne 1 1k LIBO1.NRO Manual page in32,32,32,88,88,32,32,32"); initb(&xchar[3][0],"32,32,88,32,32,88,32,32"); initb(&ochar[0][0],"32,32,79,79,79,79,32,32"); initb(&ochar[1][0],"32,32,79,32,32,79,32,32"); initb(&ochar[2][0],"32,32,79,32,32,79,32,32"); initb(&ochar[3][0],"32,32,79,79,79,79,32,32"); initw(winner,"0,1,2,3,4,5,6,7,8,0,3,6,1,4,7,2,5,8,0,4,8,2,4,6"); newgame = TRUE; playfirst = TRUE; srand(0); while (newgame) { initbrd(); if (playfirst) { playchar = X; compchar = O; } else { playchar = O; compchar = X; } play(playfirst); score(); newgame = query(); playfirst = !playfirst; } clrscrn(); } /* * Initialize display and parameters */ initbrd() { int i; clrscrn(); for (i=0; i<(3*BLKW+2); ++i) { setcur(XR+i,YR+BLKH); putchar('-'); setcur(XR+i,YR+2*BLKH+1); putchar('-'); } for (i=0; i<(3*BLKH+2); ++i) { setcur(XR+BLKW,YR+i); putchar('|'); setcur(XR+2*BLKW+1,YR+i); putchar('|'); } setcur(XR+BLKW,YR+BLKH); putchar('+'); setcput to NRO.COM 2k LIBVT52.C Video library for VT-52 terminal 2k LIBVT52.NRO Manual page input to NRO.COM 1k MOVCUR.NRO Manual page input to NRO.COM 14k NRO.COM Word processor similar to ROFF and WP 5k NRO.MAN Manual page describing NRO.COM 4k NRO.NRO Manual page input to NRO.COM 2k README.DOC Directions on where to start 1k SETCUR.NRO Manual page input to NRO.COM 6k VTTT.C Video Tic-tac-toe game 1k VTTT.NRO Manual page input to NRO.COM /* * Video Tic Tac Toe * * A rewrite of Tic Tac Toe by Leor Zolman * using the cursor addressing capabilities of a CRT. * * Stephen L. Browning * 5723 North Parker Avenue * Indianapolis, Indiana 46220 */ #define TRUE 1 #define FALSE 0 /* * To implement on a 52 X 24 display such as the Osborne, * reduce each of the horizontal reference points by 10 * (ie subtract 10 from XR, WINX, LOSSX, and TIEX). */ #define XR 20 /* reference coordinate for play grid */ #define YR 0 #ur(XR+2*BLKW+1,YR+BLKH); putchar('+'); setcur(XR+BLKW,YR+2*BLKH+1); putchar('+'); setcur(XR+2*BLKW+1,YR+2*BLKH+1); putchar('+'); setcur(XR+BLKW-1,YR+2*BLKH+2); putchar('1'); setcur(XR+BLKW+1,YR+2*BLKH+2); putchar('2'); setcur(XR+2*BLKW+2,YR+2*BLKH+2); putchar('3'); setcur(XR+BLKW-1,YR+BLKH+1); putchar('4'); setcur(XR+BLKW+1,YR+BLKH+1); putchar('5'); setcur(XR+2*BLKW+2,YR+BLKH+1); putchar('6'); setcur(XR+BLKW-1,YR+BLKH-1); putchar('7'); setcur(XR+BLKW+1,YR+BLKH-1); putchar('8'); setcur(XR+2*BLKW+2,YR+BLKH-1); putchar('9'); for (i=0; i<9; ++i) board[i] = EMPTY; } /* * Play one game */ play(playturn) int playturn; { int i; int bestmove; int round; round = 0; while (round < 9) { if (playturn) { eralin(QRYY); setcur(QRYX,QRYY); puts("Your move (1-9)? "); i = getchar() - '0'; if (i < 1 || i > 9 || board[i-1] != EMPTY) { eralin(QRYY); setcur(QRYX,QRYY); puts("Illegal move"); for (i=0; i<7000; ++i) ; define CHW 8 /* width and height of x's and o's */ #define CHH 4 #define BLKW (CHW+2) /* size of spaces for x's and o's */ #define BLKH (CHH+2) #define WINX 15 /* positioning data for messages */ #define WINY 21 #define LOSSX 30 #define LOSSY 21 #define TIEX 50 #define TIEY 21 #define QRYX 0 #define QRYY 23 #define X 1 #define O 5 #define EMPTY 0 int wins; /* number of times player has won */ int losses; /* number of times player has lost */ int ties; /* number of tie games */ char board[9]; /* playing board */ char xchar[CHH][CHW]; /* pattern definition for 'x' */ char ochar[CHH][CHW]; /* pattern definition for 'o' */ int playchar; /* player's character - either X or O */ int compchar; /* computer's character */ int winner[8][3]; /* definition of winning combinations */ main() { int i; int newgame; int playfirst; wins = losses = ties = 0; initb(&xchar[0][0],"32,32,88,32,32,88,32,32"); initb(&xchar[1][0],"32,32,32,88,88,32,32,32"); initb(&xchar[2][0],"! continue; } board[i-1] = playchar; put(playchar,i); if (won(playchar)) { ++wins; break; } playturn = !playturn; } else { if (round == 0) bestmove = rand() % 9; else if (round == 1) { if (board[4] != EMPTY) { bestmove = rand()%2*6 + rand()%2*2; } else bestmove = 4; } else ttteval(compchar,playchar,&bestmove); board[bestmove] = compchar; put(compchar,bestmove+1); if (won(compchar)) { ++losses; break; } playturn = !playturn; } ++round; } if (tied()) ++ties; } /* * Put the appropriate character pattern in the * designated block */ put(c,blk) char c; int blk; { char *p; int xref, yref; int x, y; xref = XR + (((blk-1)%3)*BLKW) + ((blk-1)%3) + 1; yref = YR + (((9-blk)/3)*BLKH) + ((9-blk)/3) + 1; p = c == X ? xchar : ochar; for (y=0; yBCDAEFGKJHILMN61Uө[x͍3`n}bG+mxw}>w߭~PPn}b@< dG (n}b@ w}ݍkL]ƿL3#9C<áģa;5M\;׽wJ! 1\LWzި )w͍3`.S~+m(s˘&n<w1l1-[]:S*nI`;=ӳy7 $8{L{~]t wşt/~-3:eaE { r;aܙ.iޭz #f8ek^*.h g-uj\LdV%q~x ierBZwIkwQn5.?mh ie}g PLYڍ[}Ttd+؀+ɖ2 da:'ĹH[Jq*acXnu]Qtatus = ttteval(pc,cc,pbest); board[i] = 0; /* restore empty space */ if (status == -1) { *pbest = i; return(1); } if (status == 1) continue; loseflag = 0; safemove = i; } *pbest = safemove; return(-loseflag); } /* * Test for game won */ won(c) int c; { int i; for (i=0; i<8; ++i) { if (board[winner[i][0]] == c && board[winner[i][1]] == c && board[winner[i][2]] == c) return(TRUE); } return(FALSE); } .in 10 .rm 70 .he " VTTT(6) .fo " 10/03/82 NAME .br .ti +5 vttt - video tic-tac-toe .sp SYNOPSIS .br .ti +5 vttt .sp DESCRIPTION .br .in +5 VTTT is the X and O game popular in the early elementary grades. Grid positions are defined by the numbers 1 through 9 as presented when the game starts. This version makes use of the cursor addressing capabilities of most video terminals to present and update the playing grid.!5ʻ5ҿ5RH RIr1u!̻ |(,y#62(FqѹSܙc_$x:cؼx4_(hޅ3ٖv\*aj;Sӫws5Hp0 O?&ḡ\LT5MQ85i_W.i9"fW<[0UX귵 aCC}wGan WMAw-8=x2u3)wA_i@Ww5476o589<:;=@?>BCDAEFvf@VIRTUAL.ASM_ o !#"$%'&()+*,-./0132465879:;<=>@?ABCDEFGHJIKLNMOPQRTSUVWXYZ[\]^9AWЈAS̈r&L[T:gM3&ԇ Eգd̈rAA qJ/kun'9ݛ+֯!o֏P^Z _Ӎga}ۺzin'^ݜqYno@w_uCd#gW٦@t8uǮ!Gݪ˵j.+'IgYe^:r!aFs?{eM[W}΁!gar9Vo˶AW߬ z9e5ɣܩWVMܪ~Mߟ3; YO+oV1hY r^^M4~o]AA 10a-x rL9 z9>w'./gJA/0s?" -x+j^΁ϝɵoWmݛ~on^΁!gk-ە~L:z9>wp-m#{]wJAC&; 0#]8'#N%?qZ۠?"s`YP }k9/W՛]"&H0dI@! Zn#q/Mt >* ГEYBk910a- ~Dʕjf}ʾn\-pj90,l@0d 8T6$_9=$̈rywת'\u56YCc; 0#]8'QnkՄ/iJAAY r^u܍#pwi;GrO]&w߱V/G[YbF{:yYPX/~Zt-ow[(90vȳןط~7gߙsW&g2+r7;l"v7#pި2^ʃ^΁!ga $\g)l Y+oe6hl"ƵMDp;φJA/0MDpo-x+j^΁ϝ{rA/ןˤssgA +oe6hU=ƻM'#.=$̈r6N*pmAH;o#ptzS.V0rߺwߛmkVjvK bpr"FVnmgycӻ,uvo Ԡ,f~fF.gvu뎜n)fDY"vvG`)fDNy%Wmj=*~nM8r ?8zYVc<.e!|s:UGNw ZGs)-Pjpa`Aau8r66ߵzrvQc{C~nۻw=#7G_}c ԳdZzN=.~A⻸C|0[J 36!k!#1m1s[-Ёb9ttv*@Q S9 m>|xnA5S'bZ@ǓTŠbXaRA=_3s0$J:AU?f}x>SlQ xJXtR +p)(kcrS G)?Q:SךLYD-SI*aEI1*M:`~wyl7]& Znq9 |TW:}_:r^X?|Wzn~Ǡ}:$GwZu_v畏JA/@ޗZv7,n#;hҁCr|,$r^v孬-7ݸVM:r!5PmTmZQ:TqC_9ןQXۺ=@ z9>w3S~rw?8Ae[ 2Pʃ^΁ϝʔb!*e^΁ϝfQɴJ~fQɵJĠssgiUןQ w_ʃ^΁ϝ6~2mJ6PM+Xov*+Pr|,0@ZϨJtXi^΁ϝ$ݩgTB%4ssga"ϕHDoTzױ+z9>w*zN?ʐ\JFwr+#Ǜ[A/\EOTϕHD7q&YI*UŻϕHDr|,0JϹןeT2DB%_k < 7xWML),twРsH9LYDѡ:)/Ǿ1FG9y(VGq z94O8(EܹA'A/sȢX}btp炏S9y D|,j)N^qsri:,hFG >NA/ i?1٠$?YvA^!S8N,='/'أ߱V/G[Y^!SOdIeK`I.G`_u5rZrKm G?beߺsH9 EqQ"bn[WA˛+֯! z9ǁs|rrMt:M z94O r~ovG7o˷Ơsf3q݄]*k'^!S8N,hFGi9y?qZ-78}C!`h-'&boL跛ymbg9J]}Tw/b v*v2rܪϪv^3Ur^Y vbZG?U+hAߟv^3U;r^Y vbx{՗ھ)$:_o; AT=V}-~I*a;SuA߹&vةM7w%;SuA߹ ,}mRջ_y5!e-gk/Tcr9M,;φv2rX:KYզoݛ&hgk; ߙslۮ^FN\mߙs`tpxh" TL96 b's&L9 <0O}gk ГE)w =YD3ĝ+??)stUEY|Oe](4]dŠ:(Z:9AA*Q[f =7ur'VcNfo֏e*<|,p)}9?"f؞2dL)Z}9 Y)ЁVc_}~t7qr"h>J,r𹳀i,oGW߬ݵ}Wќ]}m4!"^^!UK!r~5a;|٣0mW/#'3u|r~Dnۗwc9je6,rdCߓAA/s'XJޗK`Vٰ\< *:I~'8v2rS9臂<0NlA->I;,e'4Q*9yQt9yo#kMDpC XŪ;sGzE(w&ZA/s`E*>XNB~mct_ȫ"m+wkՏVߺ#K7ݛ[AA/s'3y/hj5=rc8N|Z^~„]G:T^/=v$lX^!S8N);mW/#' 9q1_T?1: ZGn淝̠sH9|W٣@𶫗oeNE?y橀r^ 9w_A/ Z|2~v^6f:hhsʠf,;yA/琏Rɓ<09~y>*=v7qc^sUarvfk95q/ um'^!S ,D3&Z! z94O XŪ;cQ V#cn#-?^/?aۮ^F#0h^Q^[vsy9[ U_u5Z^!S8N);6ko;~„]s* r^Q)0hݺv2^!SOqZ_mjW Lxq7A{'}.XUZy1pt+؃^A?d49egm=.ucߺh^VŻE9ؙuOC΁X0k9/٣M"f^άs&:k9O{ݽ^A˓MtW=JT@+ˀ0V}7Ѥ97ԗI z94O8(E='_Y98(EhFGik9 |Tz94OCbZd8_Y?J9y(E='d: |Tz94OCb(C>J%'O>J.}z-&w^qs%(w's3X9~ѣ+G`\Ǡsf1 4 h9~W}GD9yeQO]\Dpw~vsw9y E?g)*WOmi:'7ECOA'd9:PU8xnp{()㏕[5P9/v1Is|'_+T/C,L~l DAACU Jتxw>sbM|j z9[NtZ9~ov nj5=C!LYD-AS|2ri:,3f5Q'^!'%y`L Zlz9[N,^άs|"p z-C,L~l DA/80vA/s'x/u2r ZX(E?y橀^άs@㧽VӣA˂YZDpw7ѠeA߃^Q'bأ!~ Vc^!SDb":)žM#0B{ٶC"BǓE;"E9y~AAfn~94O]Vy(.Ÿ/_u5|Wz&;SlQ$k9 |Tz9,q`7\W^>**C!LYDM:`~0G%sH9dQ<)6I ُ &߿r4fB+8yʫG%ss'xr-'_yuri:,'I8-'_yuri:,'#.8-'_yuri:\XoJnkՄ/oJA/%8N\ZW^>*C!"=$X8-'_yul>*w'OA/`g9i-'+hY8S9J EqQn9y^wo7;V_uCri:\7 z9s'X.ެ_eT _;ߔ(bt(Na|ZϭVӣ#p.Zz94OE\bXA/@UtB9ʓXN Wn(Kw5uo*n*cl‘S7~уffL43˨t?6[EŕWoկĻfw**ҽ A3@*:?*Mcqb'8h$⽸JD\EOT\yu^ &=WѓTʫϕHD!n|4fC>J%'i?1r_޷[GNwֱ޷n;A/s'bZ"ؿMXn#j孬A/sȢ(AS|2|sbn~ZtV+oez94O8(E\m#EIq9y(%8-ž٭l78{WV^!'>I/i_UGn# z94O:(L"-io"?QNsH9>ˢHߟrT+ܞ?Jg +,En+/v*r$9/ uAAUVQYRcOqL+PިcWri:q?Q<)6h+N_MXn#j孬A/sȢ(AS|2|sGb;q9y D|,j)N^!SE(i9/u܍#һ=Q*9yLA_9y E?gi9O{"tg7~C XEŠs(BgQO?ʐ ~ױ{ukMA/(Оӏ2$n96+ؽ5ri:,7Eӏ2$n~׭ ~A/(ObiUt{~N?ʐJ:PU8xnp{9 >Nk9yz9?*hYxsVz9y(N1#=YDa|ZN/q;꥛~in^!S8N,Ccnn\&G%s;>i-/\h[WA˛+֯! z94ObcTP A/s|1}N*Na|r*;r.N{C" }fu :)'+oe6hU7D=Z&p|!z.'أ6hb!sH9>QX"I$EI1O/nj5=Vn 1wQtR ž˷Fת_{MD=C X)fD'r=kMD7;4S 'o`Pƌ7BDs9Csu1h ? z94OC>\:<ʫs2 LkCM\@~C!LYD-AS|2<ri:qI or9yʫG%sH9dQ<)6ь|Y9Tr$?r_޷m\֏}?'^VŻE9ؙuOC΁X0k9/٣M"f^qs%(:ZyulA%t w߃^!SqCYD F1@ޝ_nwM:sH9(BgQO*bXDzz94O" }f5"(HsUasb&Zv&@ z9[N`r…n z94O8(E='_Y98(EhFGik9 |Tz94OCbZd8_Y?J9y(EhFG Zyur(<(c"()={4~V};Is|'=WsQĭJ9dQ,~!q'_~׭ e9ʓX瘫]}pA%*7ZAA*7YǠ9ؙuYL9ؙu| z9;!^άs@s3):'^άs`rdA*8Rutow[@n~N T~O͐r:(RniƞT&^\αr:(R}Rr7n$\['Q ))fDߙsr96fwq9"_;]dA-αr:(R}Rr7n$\['Q ))fDߙsr96fwq9 E\m#EIq9y(%8-ž٭l78{WV^!'>I/i_UGn ; Read from disk E12A C32BE5 JMP WRITE ; Write onto disk E12D C3BEE6 JMP LISTST ; Return LST: device status E130 C32FE6 JMP SECTRN ; Sector translation routine ;Extensions E133 C348E8 JMP BIOFUN ; BIOS EXTRA FUNCTION INTERFACE E136 C3A3E7 JMP IORST ; RESET ALL THE I/O .PA ;This area is reserved data storage area for the set-up program to install printer drivers, function ;keys, auto boot command, iobyte value, and auto horizontal scroll flag E139 00 IOBITE: DB 0 ; CP/M INPUT OUTPUT BYTE DEFAULT E13A 00 PRNTER: DB 00H ; default to serial printer = 40h, parallel printer=80h ; default to standard serial= 0 ; Qume ETX/ACK = 1 ; Diablo XON/XOFF = 2 E13B EE MODE: DB SI.MOD ; SERIAL PORT MODE BYTE (.MT 2 .MB 6 BDOS/BIOS ENHANCEMENTS Tperform a characte compariso fro consol inpu an stil allo th characte t b entere int th 25 characte type- ahea keyboar buffer th followin BDOS/BIO consol statu CALL hav bee enhanced Thes enhancement hav als reduce th overhea i tim necessar fo checkin keyboar statu an inputtin th characters. BDOS CALL 11 I statu tru the characte type fro consol wil appea in B register. BIOS CALL 03 I statu tru the characte type fro consol wil appea i register. VIXEN CBIOS Rev 1.01 B & B 12/8/84 B:VBIOS .ASM ;The following jump table defines the entry points into the CBIOS for use by CP/M and other external ;routines, therfore the order of these jump cannot be modified. The location of these jumps can only ;be modified by 400h locations, which is a restriction of MOVCPM. 8251) E13C 10 BRATE: DB 16 ; default baud rate IS 19200 E13D 00 DB 0 ; UNUSED E13E 78E1 XLTBL: DW CNTRL0 ; Fixed length table E140 79E1 DW CNTRL1 ; contains pointers E142 7AE1 DW CNTRL2 ; to strings E144 7BE1 DW CNTRL3 ; to decode E146 7CE1 DW CNTRL4 ; function keys E148 7DE1 DW CNTRL5 E14A 7EE1 DW CNTRL6 E14C 7FE1 DW CNTRL7 E14E 80E1 DW CNTRL8 E150 81E1 DW CNTRL9 E152 82E1 XLTBLA: DW UP E154 83E1 DW RIGHT E156 84E1 DW DOWN E158 85E1 DW LEFT E15A 86E1 XLTBLE: DW EOTBL ; end of table address E15C 01 SRATE: DB 1 ; STEP RATE, THIS BYTE IS WRITE TO "SEKDEL" DURING "BCCP" ; 0=6, 1=12, 2=20, 3=30 E15D 00 PINTFG: DB 0 ; Flag indicates if printer has been initialized E15E 00 DB 0 ; Length of string E15F = 0010 DS 16 ;  0000 = E100 ORG BIOS E100 C366EB JMP CBOOT ; Cold boot E103 C302E3 JMP WBOOT ; Warm boot E106 C37CE6 JMP CONST ; Console status (input) E109 C364E6 JMP CONIN ; Console input E10C C36CE6 JMP CONOUT ; Console output = 0000 IF P6080 - BLIST: JMP HDLIST ; List output ELSE E10F C39AE6 BLIST: JMP LIST ENDIF E112 C3B0E6 JMP PUNCH ; Punch output E115 C3B7E6 JMP READER ; Reader input E118 C3C1E3 JMP HOME ; Set track to zero = 0000 IF HARDD - JMP HSELDSK ; Select disk unit ELSE E11B C3CFE3 JMP SELDSK ENDIF E11E C3FAE4 JSETTRK JMP SETTRK ; Set track E121 C308E5 JMP SETSEC ; Set sector E124 C30DE5 JMP SETDMA ; Set Disk Memory Address E127 C312E5 JMP READ#Printer initialization string E16F 01 ACMD: DB 1 ; auto command = 0 ignore auto boot ; = 1 auto on cold boot ; = 2 auto on warm boot ; = 3 auto on both E170 08 CAUTO: DB :CAL ; length of auto command here E171 4155544F53 DB 'AUTOST' ; auto command goes here E177 00 DB 0 = 0008 :CAL: = *-CAUTO E178 30 CNTRL0: DB '0' ; Variable length table is placed here by set-up program, with xlttbl E179 31 CNTRL1: DB '1' ; pointing to the entries E17A 32 CNTRL2: DB '2' E17B 33 CNTRL3: DB '3' E17C 34 CNTRL4: DB '4' E17D 35 CNTRL5: DB '5' E17E 36 CNTRL6: DB '6' E17F 37 CNTRL7: DB '7' E180 38 CNTRL8: DB '8' E181 39 CNTRL9: DB '9' E182 0B UP: DB 'K'-40H ; Default values E183 0C Rnd length of function key ;ENTRY ;A = FUNC KEY NUMBER ;EXIT ;A = THE LENGTH OF THIS FUNC KEY ;C = THE LENGTH OF THIS FUNC KEY ;HL = FBA ADDRESS OF THE NEXT FUNC KEY ;DE = FBA ADDRESS OF THIS FUNC KEY .PA RTBEND: ;RETURN THE ADDRESS OF THE END OF BIOS ;ENTRY ;NONE ;EXIT ;HL = END OF BIOS Vixen Function Key program doc 12/1/84 STACK - INTO KEYBOARD WITH NO AT END STACK INTO KEYBOARD WITH AT END STACK 0 EDIT FUNC KEY 0 STACK 1 EDIT FUNC KEY 1 STACK 2 EDIT FUNC KEY 2 STACK 3 EDIT FUNC KEY 3 STACK 4 EDIT FUNC KEY 4 STACK 5 EDIT FUNC KEY 5 STACK 6 EDIT FUNC KEY 6 STACK 7 EDIT FUNC KEY 7 STACK 8 EDIT FUNC KEY 8 STACK 9 EDIT FUNC KEY 9 STACK A W SET ARROW KEYS TO WORDSTAR STACK A C SET ARROW KEYS TO CPM STACK R GET DATA FOR STACK COMMAND FROM STACK W WRITE THE DATA FROM THE FUNC KEYS INTO A FILE IGHT: DB 'L'-40H ; for the cursor E184 0A DOWN: DB 'J'-40H ; keys are standard E185 08 LEFT: DB 'H'-40H ; values for CP/M = E186 EOTBL: = * E186 = E200 ORG BIOS+256 ; space reseverd for function key decoding +---------------------------------+ | BIOS FUNCTION INTERFACE SECTION | +---------------------------------+ BIOFUN: ;PROCESS EXTRA BIOS FUNCTIONS ;ENTRY ;H = 0 = PERFORM FUNCTION ;L = FUNCTION TO PERFORM ;OTHERS SET PER ROUTINE ;EXIT ;SET PER ROUTINE BFTB: DW SISTAT ; (0) RETURN SERIAL PORT INPUT STATUS ; DW SPINP ; (1) INPUT ONE CHARACTER FROM THE SERIAL PORT ; DW SOSTAT ; (2) RETURN OUTPUT STATUS OF SERIAL PORT ; DW SPOUT ; (3) OUTPUT ONE CHARACTER TO THE SERIAL PORT ; DW RTBVER ; (4) RETURN THE ADDRESS OF THE BIOS VERSION # ( 4 BYTES ) ; DW GRFCHR ; (5) GET NUMBER OF BYTES LEFT IN FUNC KEY BUFFER ; DW GAKADD ; (6) GET THE ADDRESS OF THE ARROW KEYS ( 4 BYTES ) ; DW GETADD ; (7) Get starting address and  This program shows how to convert the BDOS used by the Osborne Vixen computer so the "DEL" key works as a nor- mal backspace. Do the following: 1) Call up SYSGEN 2) Hit "A" to get system from drive A 3) Hit Return to go back to CP/M 4) Say: A0>SAVE 65 BDOS 5) Say: A0>DDT BDOS 6) Change 1397 from: 78 B7 to 18 ED 7) CTL-C to return to CP/M 8) Call up SYSGEN again 9) Hit "M" to get system from memory 10) Then hit "A" to put the revised system back on "A" disk 11) Then hit return to go back to CP/M, all done NOTE: The Vixen BDOS is written in Z80 mnemonics/code. Normal BDOS were written in 8080 code and differ. Hitting the "DEL" key will now give a normal backspace, similar to CTL-H, which is rather awkward to use. The source code below shows what was altered, the line above the ";;;" was added and replaces the two lines nulled out. - Irv Hoff 17 Sept 85 1 2 length of function key ; DW RTBEND ; (8) RETURN THE ADDRESS OF THE END OF BIOS SISTAT: ;RETURN SERIAL PORT INPUT STATUS ;ENTRY ;NONE ;EXIT ;A = 0FFH IF CHARACTER READY TO READ ;A = 0 IF NO CHARACTERS ARE READY TO READ ;DE = OUTPUT POINTER SPINP: ;INPUT ONE CHARACTER FROM THE SERIAL PORT ;ENTRY ;NONE ;EXIT ;A = CHARACTER SOSTAT: ;RETURN OUTPUT STATUS OF SERIAL PORT ;ENTRY ;NONE ;EXIT ;A = 0FFH IF READY TO OUTPUT A CHARACTER ;A = 0 IF NOT READY TO OUTPUT A CHARACTER .pa SPOUT: ;OUTPUT ONE CHARACTER TO THE SERIAL PORT ;ENTRY ;C = CHARACTER TO OUTPUT ;EXIT ;NONE RTBVER: ;RETURN THE ADDRESS OF THE BIOS VERSION # ( 4 BYTES ) ;ENTRY ;NONE ;EXIT ;HL = FBA OF BIOS VERSION # GRFCHR: ;GET NUMBER OF BYTES LEFT IN FUNC KEY BUFFER ;ENTRY ;NONE ;EXIT ;A = # OF BYTES LEFT IN BUFFER GAKADD: ;GET THE ADDRESS OF THE ARROW KEYS ( 4 BYTES ) ;ENTRY ;NONE ;EXIT ;HL = FBA OF UP ARROW KEY BUFFER GETADD: ;Get starting address a# .Z80 3 ASEG 4 5 0008 BACKSP EQU 08H 6 D60C COLUMN EQU 0D60CH 7 D3FB CONIN EQU 0D3FBH 8 000D CR EQU 0DH 9 D60A CTEMP1 EQU 0D60AH 10 D60B CTEMP2 EQU 0D60BH 11 0005 CTRLE EQU 05H 12 D643 FCB EQU 0D643H 13 000A LF EQU 0AH 14 1415 RB10 EQU 01415H 15 13E0 RB65 EQU 013E0H 16 D5AC RBEXIT EQU 0D5ACH 17 ; 18 ; 19 ; 20 1361 ORG 1361H 21 ; 22 ; 23 1361 3A D60C REDBUF: LD A,(COLUMN) ; Get the column counter into A 24 1364 32 D60B LD (CTEMP2),A ; Save it at CTEMP2 25 1367 2A D643 LD HL,(FCB) ; Get the information into HL 26 136A 4E LD C,(HL) ; Get the buffer count byte 27 136B 23 echo the char 65 ; 66 ; Check for Control-E (physical end-of-line) 67 ; 68 13A0 FE 05 CHKEOL: CP CTRLE ; Is it end of line? 0 Error(s) Detected. 65 Absolute Bytes. 18 Symbols Detected. ; Check for Rubout (remove & echo last char.) 54 ; 55 1393 FE 7F CHKRUB: CP 7FH ; Do we have a rubout? 56 1395 20 09 JR NZ,CHKEOL ; If not jump over 57 1397 18 ED JR USEBS 58 ;;; LD A,B ; If so move b into A 59 ;;; OR A ; Set the flags 60 1399 28 D4 JR Z,RB0 ; If b was zero go get another 61 139B 7E LD A,(HL) ; Get the char at (ODATA) 62 139C 05 DEC B ; Decrement the count in B 63 139D 2B DEC HL ; Point back to FCB 64 139E 18 75 JR RB10 ; Jump to INC HL ; And bump the pointer to the next spot 28 136C E5 PUSH HL ; Save it for later 29 136D 06 00 LD B,0 ; Zero B 30 ; 31 136F C5 RB0: PUSH BC ; Save BC for later 32 1370 E5 PUSH HL ; And HL as well 33 ; 34 1371 CD D3FB RB1: CALL CONIN ; Go get a char from the console 35 1374 E6 7F AND 7FH ; Strip the parity bit 36 1376 E1 POP HL ; Recover HL 37 1377 C1 POP BC ; And BC 38 1378 FE 0D CP CR ; Is this character a CR? 39 137A CA D5AC JP Z,RBEXIT ; If so jump over 40 137D FE 0A CP LF ; How about a LF 41 137F CA D5AC JP Z,RBEXIT ; Jump with that as well 42 1382 FE 08 CP BACKSP ; Do we have a backspace? 43 1384 20 0D JR NZ,CHKRUB ; If not over we go 44 ; 45 1386 78 USEBS: LD A,B ; Put B into A 46 1387 B7 OR A ; Is it still zero? 47 1388 28 E5 JR Z,RB0 ; If so go get another character 48 138A 05 DEC B ; If not decrement the count in B 49 138B 3A D60C LD A,(COLUMN) ; Get the column counter 50 138E 32 D60A LD (CTEMP1),A ; Save it at CTEMP1 for later 51 1391 18 4D JR RB65 ; Jump over 52 ; 53 ; Check for Rubout (remove & echo last char.) 54 ; 55 1393 FE 7F CHKRUB: CP 7FH ; Do we have a rubout? 56 1395 20 09 JR NZ,CHKEOL ; If not jump over 57 1397 18 ED JR USEBS 58 ;;; LD A,B ; If so move b into A 59 ;;; OR A ; Set the flags 60 1399 28 D4 JR Z,RB0 ; If b was zero go get another 61 139B 7E LD A,(HL) ; Get the char at (ODATA) 62 139C 05 DEC B ; Decrement the count in B 63 139D 2B DEC HL ; Point back to FCB 64 139E 18 75 JR RB10 ; Jump to $ ͫCopyright (C) 1985 BORLAND IncB Osborne 1al SelectedP)(= EE RT(1)1~7#~= oͦkԄ!!"~#(}:$= +*!5!*!!:(2!5:(>2!!!:O::O:!*! !45(! +/ 0y0( d!k5!{5__o&  :(͠|(  *"x2y( >28!"9!! og2"">~22 9/4*9 Co&ͦͣ} [ (!e{ͦA8Q0G: x@!\w# (͂ ?(*( .( w^. ^!h6# (?( *( ͂( w#>?> w#ͦ 8 !ɿ .,;:=?*[]<>{}a{ |ʹ}ͽƐ'@'7||}>2ͯ*Bڨ  "og"2>2!  ,,,-xGg?+2n*8t z~,->' x' ͘}. ͆́ , ! >4,͢- o&0%,͗ }gr }؉}颋.:}8c~I$I~L*͢ٷx˸ }0G,<},-(-́ !>I0 ͗͘ o8 ͆ >' m.`1pF,t6|!wS<.z}[|%FXc~ur1}͆ٯx(<˸ 8 !~J 0.O!>s 8 =  n s͗ ͆ .n 0 ͎-́ OT0 j oD,:j !I}袋.}8c~I$I~L! >ͬ͗ I× nn ͗ = ͆ nf^VNF!DLT\I!!53!r1!͒!> x #-= o˸x͆(- }(x>8(z ,z `iÃ!>' |r |̀>)=|(DMbo˸88x(0 8> ̀x(>-{(ay( z(>. ( {>E>+|(|Dg>-|/ 0:p# ~# +>0w#,-  60#}""*B"[Ru*"^#V#^#V#N#FO/o&9O/o&9!9(> (G!9 w#Eͺw}8' RB0 >' RqRR!+ Ͱ R!+ Ͱ r!+ Ͱ r!+ Ͱ r!# Ͱ r!+ Ͱ T]KB!z> S>))0 = | |̀̀DMgo>jB0 7?= H͒<z5a)a<z {0Gɯgo||~}||/g}/o#}o&K[xAJSJDM!b"!6J"DM'd } ) W _}8(8J`9{T]=o`9y .(z = ~> x0w#xG%͇ %͇ ZJDM%͇ = _~65+~hìx-Sx9?+{Η@}|z z gZJDM0{ ,7}o˸? #yO!@9i&?  #?w#?/w#?w#!9! E9!!9~(+Fͺ!"9!(#>2*"| >"2:( Ͷ *w*6 !\$![ (ͦ( #:~CONTRMKBDLSTCAUXUSR>2i:*ˮ~0:*:(@q##pZ* :(  ~* < >26"!"""~>2""v>2>"!"ˮ(!~8>~O6~*"8 (8~wPT] ) >' ́ ͬ͗ }>' xˆ }} ˸T}ٕ(0D=z ,= ( ͒ 0%{ , 7 ?(8ͬ x ͆ - r 8˸x ͏  ,-xG}r }مM 9r .>#n0͒ { = - nx ͇ ,-(-˸G,-r }ٕ?M 9.> 8ͬ ?= u+-(>͆ 0ͬ ͆ 8 ?x ͇ , 78ƀ8ƀ8ox٨!دoGOW_gɷɷ|لg{ً_zيWyىOxوG|ٔg{ٛ_zٚWyٙOx٘Gxٸyٹzٺ{ٻ|ټx٨ xx( ?}ٽ }ցr <(r 7{ = |٤g{٣_z٢Wy١Ox٠G{ ͬ ́ }x>' ͬ}ƀ/ƀo -́ }0͎-́ ͎,}l˸ 8 4 ͗ x( - 8́ - 8,́ }l8;*!͗ ! >4ͬ͗ ͗ ͬ--- ́$w(6(2(-()(6 (8 0 :(* y(~#+ (( 66 #6 #"*: y~o p .##~ͺ(.6w4._~ =*##55= *[R8*~#"= ͣ}== ͯ}͵}*#w+#~+>*~('k!0(ˮ]k!8ˮ!]~-#8~>27kˮw>O$6̃s #r$ͣ6̏ k ( (ˮ qk(ˮ ( k ˮ*O:~ ##~._q4((=ʦ==ʩ=ʬò*:4^q*##~6ͺ>2}*|(̓|( ̓6-#[RM8( G> A~#*'C! !TRUEFALSE!9N#Y~#( G~#> >    "~(kѻ(( !0 (ˮ!!>2Sz:0:*6##ww#w$w#w:  ##N#F*B>2w#w#[s#r> "~ͮ*-w#ww##> ͮÁ""~>2:ZR0 *4#4>2:ZR> *4 #4(> ocationLetterMASTMINDDo you want to play again (Y/N)? >*6!!+)))))))!+! s!}2!!fzʤ!}2*6!*&+)))))))*&+!s*&#l!*&!}2*&!3Ea!! }2!!fzp"}2*&*&!fzV"}2!}2*6!*&+)))))))*&+!s*&!}2*&!E"*&#!*&!}2*&#!!}2!!!fzʺ"}2*6!*&+)))))))*&+! s*&#Â"!-!/fz"}2*6!*&+)))))))*&+! s*&#"*6!*&+)))))))!"+!s*6!*&+)))))))!'+!s*6!*&+)))))))!,+!s!#!&fzʾ#}2*6!*&+)))))))*&+! !*&!"R+n&!s*&#k#!(!+fz$}2*6!*&+)))))))*&+!!*&!'R+n&!s*&##*6!!+)))))))!!+!s*6!!+)))))))!%+!s*6!!+)))))))!)+!s*6!!+)))))))!-+!s!}2!}2!@}2*6!*&+)))))))*&+*&#s*&!}2*&!}2*&!5E>22*f(/˦:G(##~++ :O x yC!ͺ Q*:G(##~._.͚f<\=<͚*##w ͮ +4 #4x >>2:G("ͮ"*nˮ*0 SZѷR8@* N#F#s#r, 0})jS\*##w+ N#FB ͮr+s>2!T]>)j)0 0= ]R!#]*^#V#N#F#^#V>2Ͱ:0:*6 #-Nw#Fwq#p#6#w#w#w"~Á>">!DM!":*B:!>(>2>">!"2"~ʰ*w#wx(9* :O *-4 #4!*4 #4 *-N#Fq#pV+^Bq#pSZѷR&* s#r$ s#rL <?*L!\  <( !\$>2>2L:>!(* \$\<(!3: [1ð\!(7"~> 2"S"Ns#FrB(Z#\: \<(?*"}K\! !*}#"}! x \* *>) 2""{_!"*ʭ$!!fz\%}2H!<;}2*&! }2!*&+*&!As*&#%!!fzʏ%}2!*&+!s*&#g%!!fz%}2!*&+!s*&#Ú%!}2!}2!1}2!}2!}2!}2!}2!!}2!!fz9&}2!*&+!*&+n&s*&#&!!fzʵ(}2*6!*&+)))))))*&+!s!ͩ!D *&}2*&!Eʡ&'-*&́!A!F͛OE&*6!*&+)))))))*&+*&s'*6!*&+)))))))*&+!?s*&!}2*&!*&+n&EY'!*&+!*&+n&!s*&!!+n&Eʮ'!!+!s!*&+!*&+n&!sê(*&!!+n&E(!!+!s!*&+!*&+n&!sê(*&!!+n&EX(!!+!s!*&+!*&+n&!sê(*&!!+n&Eʪ(!!+!s!*&+!*&+n&!s*&#D&!!fz )}2*6!*&+)))))))*&+! *&!R+n&nf}(HR0nf" ^VMDnfutqp*s#r*s#r"* uKB!0>' ~#fo{_"*R0RnfR0KqputsrNF( ^VNF^V*SutKqp R*R(~w~wnf ut"6#K*K*!""*NFy(* "*B0Cnf* [R*"*RS[s#r^#V""6#>O"w2x2*"!F"" &y*"*>2"*"!F"""!\*: Nr!~6go(\R*s#r_2x( s x(T]DMx(R0 U(͝O/o&9q# (!>F0#( ~ ( #]( ~ ( (#}(  i&T-a%â}ͦo*!~6o&|:2 2}:__zѯ2*|KB " z ^C User break+=  I/O Run-time error {ʹ, PC=*ͯNot enough memory Program aborted :ʎ'1!d!.-B>8!L%s*&#(!3!8fze)}2*6!*&+)))))))*&+!!*&!2R+n&s*&#)*6!*&+)))))))*&+!*&+n&!0s*6!*&+)))))))*&+!*&+n&!0s!*&+n&!͒E **6!*&+)))))))!+!ss!*&+n&!͒EI**6!*&+)))))))!9+!ss*&!R}2*&!R}2*&!}2*&!R}2*&!}2!*&!R+n&!*&!}oE%*6!!+)))))))! +!s*6!!+)))))))!"+!s*6!!+)))))))!$+!s*6!!+)))))))!&+!s*6!!+)))))))!(+!s*6!!+)))))))!*+!s*6!!+)))))))!,+!s*6!!+)))))))!.+!s*6!!+)))))))!!+!!+n&!s*6!!+)))))))!%+!!+n&!s*6!!+)))))))!)+!!+n&!s*6!!+)))))))!-+!!+n&!s!!6fz,}2*6!!+)))))))*&+!!*&!R+n&s*&#Ó,*6!!+)))))))!7+!s!ͩ!D *&!Y͒E8!>+-* *&+!!*&!R+n&s*&#Ó,*6!!+)))))))!7+!s!v)~VIXENMM.PASW  !"#$%&'(o)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVQK˛1 k)Ew|txűyd4o `(UJHO(L C~rF2]ZW9 \(W.<&W`X1LhRyC.phr+YKj͍K+pT^d<&W`XxzYs7EZ \(W.:o~˚ 8Ryn> \aExS +B~)?wӨ~N-]b7Vgd A n+n4Y%REbFE~EjIqQeZR J{/K!xWYF͕@,Ԓz"חiTD鋌h`lMQfJKvC.phrō,D %]!84Fs[tYb kI-.+v7hJ%~+%U7I9PrtYF+[àFōb2a831 @& 7P)F/B%a%B@-{W !pLg\<6ň533a ܧpL07XH`H`%:hHEj4B*d!ȰE@-F?e hMASTMIND.COM This is a simple deduction game. It will only work on a VIXEN or OSBORNE 1, because it addresses the screen directly. Type "mastmind" at the "A>" The computer will randomly choose a string of 4 letters, using the 6 letters A, B, C, D, E, & F, with possible duplications. They will not be displayed. You are given 7 attempts to match the string. The computer tells you after each attempt how many letters were correct, plus how many letters were also in the correct location. Examples: Computer string: EFAA Computer string: ABBB Your guess: ABCD Your guess: AABB Locations: 0 Locations: 3 Letters: 1 Letters: 3 After the 7 attempts, the computer's random string will be displayed. (You can quit with Ctrl-C) Written in TURBO PASCAL by Doug Cox, July 85, on a Vixen, for use in the public domain.%"hb2!l83.Ub53~C-7}jBǍFFg! PZsJ0th`!20O`%swUy93.Ubfh`!2Н`% jػ̼`Hh * !pU !pUey7XHL0O+wUypM.{w~-pōR! D7G-{W תiG?IFwr>!ػM9xGݦ/B۔ @&G^ qcǍEʭhwUypiy?j6X_auOkgFg!J0ES[ psTX VC-tYFݿZ+Fg}݌# />1eHfh C [r| !x+J0c%n4(RnF|΍F_HgJt%,DQfsRY0$ji4.hwUy DZ.163 _!_463n4bCm(X`lPpniaJ{W תff4[ػ̼`xsLgh`ȰEǍF{[,06`8={؆R rm!ӥ[y01LnEF{[,06`t]aJFHE K7%^05%3%t+/ҭ?@ABCNoMC3`fP_uWS"De zL8nxoORrL:VxknE%7Є53 ځ,T`} F0DH&Xtl|n 3ȈɛA؂C3vvkxKC :x'[ [sonm` ƨ~tNsE0cW1ѯ"cn,9NdL;1!Ʒމ ];1xwkj`t3jNP6 |U mϯ߫I<4pب`fJ鏗Kx ]K؝f 6?xD{V*Pn[Ф{KEw(WN3Zۦ?΍Yj_@qM=w}k݆ڃ+FTAxŇV Diϛ/>nCbm7aB(&!؞;>nCbm7aYt0aK6ݛ۳r9utF1ɥM9~9=oԞ;6grQ ?m[Фh]aob׫3ޒ$u+xϯ߯t=i&kphCQQ rcr v/3C`@"bB)Bv '"Xߩ7 榸N`;hUR;7fi Tw#hҌ]/B&N D]Uf^0\zz%벇ӝqcacn .c#S YKjV[tWhbA-dt+?6"*G/1yf4}@֒ZH`J{W IrF' o[lpTJ0ES[ 9涐ҭn0Ռ۔CwryGݦ?zGݦ_y7۔ݝ !pm.xGݦ:/B۔ݣ !pػM9{p(3HGݦo`Vt ~-pōb6exp(373l+ػMٝ`Vt [$ ,B&B8u%b2Z{C^!$~{ !pEyc]blfCilf?àFō ! /RKZ 5Pa(#ԪIc}Cr| !x+J0c%n4(RnF|΍F_HgJt%,DQfsRY0$ji4.hwUy DZ.163 _!_463n4bCm(X`lPpniaJ{W תff4[ػ̼`xsLgh`ȰEǍF{[,06`8={؆R rm!ӥ[y01LnEF{[,06`t]aJFHE K7%^05%3%t+/ҭߏtQLUq5PYp;@͡ߎg drsL͡wn<ϹWj*jz 5xw[@f(& P]Up&8R!vF1UqWݻbg9=AbB&1]֫1=z9]~_ bgS;} rK0/ !(@b zw ._.TAԅr?^iuϹia .9jLX[@f ,Cc ,"V*L?d~ϹWcZ篊2Qr?1uGk|d9'~νǟ*sNF'ǘ8>Ф: v֣TP埿-Mń9jmCT(*vF1CmT̍Q!tMsk}8wUq~`4m Wx.:j J<~XϹ19DA7f7aݐbQ *0Ts-սV@f ,JΉ@^z}2 /?d5q kpGXý>` 2&P3hҌ9s~ {Km:s﹚/WdVw T ^0&͘s={޹U fФm%x玂6Uk ޹@ФFpmU4iѴ1s'3x.{ 7kkư9!:x>*U05Z9PҤr T~_ BsrcJKf̹%sNX-YIn]?@ABCDEFGHIJKLM߾~,rw i9f_݄}kwOۧ-v˄۴Yv8tMvz^WvsfpwX_!rߡ"Q=*R@.Epo #GZ³I4\)E)@ l3!gp;LF8qgȩfg +6(R+TYW"`CNFW$j, 4ײ ! Ud+y!O4FNZ~p,J0r8@sE&T#͑#jkԺjŦ7+' ЪaE(k)(Ri4!FNugv%a֮DeHC TaK399<5gO-9P8?wqH1r+*- `/u׼U# M*xGU4`gyQ'Fkv:i6Kn, 5QLie9Ĵ袘Ң2It2zt26Qrn{, 5bJ1nCiuc.fIhvC3 *e9i :xhcIE鸤CRU)*`iATh%)M-9>n*77X)&d;tZ~dt$3hJC34tԧt]4tChҜ~kNN4Ԡ9 %5.5igUCZtI%KҶ$mb$}R&xwZKC i))bJQsRmI.o-%!uJ(Xj`6=Aqb56Isw`iA3$Ud9Y_ZhJ??+}[%xw: E 1;&b:(& l17F5?~{[uF1U{KۓN/AgS;hYsnaQonmО3Ҽ(3ɇ[̍Q!nxVQLޒ$Kjc.j@{Ɯ[XFTATw#hҌ]& 9EwO+WZ 7BBVV+JVCBY䁕+FNn!QL`e"q|m AWl*΃BYL5r|v'@ f-@*-xTϺy@cDNw* G*" xq !^+\)p#*_#PhKCNxx@8yd]EBMY6΀F9Q ]{5 ġ<ͨyɓ /Lp#颁[%#G<. f{ƕjזv1Ր f]k4 ]y4jIm- ~)Мr O)eM5. ~ݓ o×ȁmSNno?uboz ϝF nC__(3bj`njQ(֠3vosǹb !(@d%:0^gjێ=ub ,8overlays the reverse video on the prompt). Just ignore this and start typing the filename. One other suggestion. If you change the program name, you should make a conforming change in the VIXLABL1.ASM file so the program can find itself after asking for a filename. After a filename is supplied, the program goes back to user 0 to look for "VIXLABL1" and, if it is not there (as when the name has been changed), it will abort. No harm will be done, but you will have to restart the program at the CȝD)%A+5|Y?K) :rS\nMq).7妸rS\nMq).7妸rM:HN{֠rޥOMq).7妸rS\nMq).7妸"vhLIST10.:  !"#$%&o'()*+,-./0123456789kaqA]΄lfwjd.jpY&t *XDmPd8&jw*&I3^eFdZLT*LLÊFDT0^;(g3"]I__a? 'Y-V|5@_5ӰѩgGpT0^;#8MU~`8jALhvbCIV "_ WaW#6xL&&}?jGMM%|El(LZ\B < &~fzfZWaWS&"6x^;ugm"'ܢ4j#&ӰALLÊFDT0_NRRzhj "p?&}}DmPd8&jw*&}}p?ld bX}e1.?0GVn7,.u I3& Ohj A]P0t6NJhP0xLÊFD oLIST1 QQQ ޑLIST10 QQQ yLIST2 QQQ&LIST3 QQQB%ULIST4 QQQg!ńLIST5 QQQLIST6 QQQ.ULIST7 QQQ4/LIST8 QQQ2LIST9 QQQvNOTABENETQTZREADME 1QT&cvSINE DQT:" vLIST1.L  !"#$%&'()*+,-./0123456789:;<=>?@ABCDTڡ38%`lC9L!f&Ӱѩ7Q%LaW94jT04 霰e1qDAA',rdҦ.!uqy?l8QPD 'L\z/Ig$& i4lp M6Dl(LÊFDT0_LÊF{LaW/L'D IsP!,plSႂ̴k+Ӱы"6x0 +4jdz`kxkxí cC|(L:'Y%D`2=34jIjB4j#&ӰIsP㭡[TGl!vɤqUBDGdzfS__>IMQ_ tdV|5c2=0sʵt5trRR#x!*ǔ֠ևow?J[Vj$%A+5HtL) n ZvTLIST2.[  !"#$%&'()*+,-./0123456789:;<o=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ]&+ŀ E`RN%dvѫO1 LpB1:s!WdXz4dFYר*C ~D VAVsDXrr!A]CX 6nrupeYpQ?UW!kXcf%:e ˠZÌp4`U%Z*@+]AY顯`&A+5$S':PPBAZث M $Xp+AK7IA h~D(럪pT|RG MW Tޭ j`&A+5lTJ= =e zAzJ xC~D*F$d ~Dx?Un$I򂩖z laf ;r`ZvTOǴlaQ]7[؁zT^,XpFN0tXʈ $Xp+{FAp+{~Qq5~J= ~  ~j3F4hYj@k4 5j jPk4wPQoCÈث>jj*,b*/? nܢ6 lT?G$f giV6K0l`"9"K8 &2#BTpLdT?G` ΂kǽ|#agHr"}R#pw }֠^FtL[Vj$Zև7Ww>uv}xR#ы~!R#.DIpkJD;QpkJD ѽ֠QpkJD/;ʻ֠rRR#x!*ǔ֠ևow?J[Vj$%A+5HtL) n Z']x2>oL^b8ZF4a<ۡ{>o JI ] 5\(\ ~fᯣ4E(.P*1$dj5Lʓu.2o0YgY2so>jQ{Nd$# &YsC"KW :Yg7h˘EH\ŷWjl'q0Z!%SaRaJh,&o.DLA4sSjB]DT\ (M1?DsC"KVä%]We8Ks!Y2&uBvNrڏbÒY2ѫbjA*%FP R] ,jmV"#$#ȣFKK] ,0LZ{&aR/6a sC+!Ug`= +x`'I=F+1`!ɄuzȔ=ƏX1@4Xc]{&Éab='B=&lA`!:& =&ECd`H\1>={`H` z<$WG0\]l'1aJx(B?qߜco{6TM5jcUʥ}] I$j1V\p]Ȉ;7o1 eHh#h*xŷbCFĀA`h# I⚌g\ aG1+G1 = hc 'ND)1 M8=\HMޡ&p=ThCdf0t6r `O+g j; M5xoh*1b@bxyvAwAOЃ^AicSlCnGp !vhcPzcNw;9ZAAOAOƠNr5נWXY ]>Au<*as"ncdу'ozTIV1t9dȖ uKhK!G2,h*xa<h@]ƅ|s"˔xژf0jDj1Yg8\HM󍎖VђE|Acѳ0)O0%epUfq FK7LIUsa*CeTI&lgosF_̓CCz m IMƠwX1N+Av8hdђݛm tcN1zp vp v;a m XN.q [u%7K1+\ !}: 1֣AVkaJVXY ]>Au<:F9zl1Z7L =$F_̓h9V ;D)J2bmLBSjb}5Vˠ&\ء߀6 ;lUs7:ZZ2ƪK= 'oZ2ƪK= VIZ.cJ$w[oP%qTsCc@ƿ|o+$k2c@bxyvAwAO`t@6mz#'8Z vGh1wq}]TiclV֞p%hcA4Xcll5:[b= LAvǠgoeJf)cL$z2WWXaL+AC NŰ)X'lAb=D2`!1۫#0$FCSCdpU G zz$Ѓ'om9zBC 3LzyJOyYAurY/O)IJh/-$w#S^zƠ:9ԬT'gO C,ϩÐ+1 pB+AUkos S^X, ')/+m1;hcP&n^? S^XޣbP ?e{6UmarY/aA kBىE6 |09ԬbTY2S^Vh g1;hcP&;09Ԭ9O )/+[1jm;09Ԭ9O )/+[1jm_wajK|% [1(wajKŷ3۷oOyY-f'm bPaj˅*o@A1lJU&N^S^z\XAurY/uÅ*Ibؔ{ m wX8>Bx~B :9ԬO ۝Ķ=&lٿ8`6fӧƠbxC~b(aQ}s>x03h*f[=у'=&EXMlhU E4d<?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^c[f N^^?Q*`)Er'vؼM)EXٴ3^~ߔ֪}^UM;g8|H-cv~rEq 8oa&zQgC(j:TuCr*ՇXN ՇQ*3;9E_~W*:G_x$w[oM50 3;.{\ J.d]VFT\e<#÷0à`vDc5H Ⱥ[azN@ASqM3f{TCS`oz/c;՗Xj^=cô z,] } ]v@T_bIeAWq˟X[c݂˟,x>.w@T_bq> /;BOlw z,ۻ===} zg_/lgAeǂ z,тgbгa@m x5^ŋ_oAX!U`oH2T̶z45 f޿8-V[1i~q|PxVhc4ypE;a.rG\;8hM[)_*-3͗Wd,fd -1;4!TCbL;*k/X8+x'i`ﰉH1PLщhi`jp UM=x'-| R)kMX5nu{ Ø\`ES4e1&WYN Zr=6YSl|}Bs:  l^1xe+\bL")X{-zkH{M1ES2: h0&ؼfHn"bLєC= Up轃zΔK|whPO)K1hʢ21: 8Ĩ5Fx' lbLW_&pB'c M O1ES)gt2к=)g)_*k+t28f~Qsc,-t2&0%};Nh;p.R)OєP%܀.́mSd,0Zz( ?GنŘb6HCEr~՗^}B'c ?G&O?1́mׇ$\{WXw+m-0jԀ=1́mׇp՗^}B'cznx'm`g°Ø\` c f޽tՍBKL.LNC{ט,@19 PܘWw{ &# S29 ]cŘb6HCEr`_}է+t2ȡ%ށw0&ؼB(3A_*lS.ݫOWd,0A'8މPPOXѥ(6E;,sE7|y} (=E&kX(29E6&(UbEȄ LJRQ T[rNŘMq,RD_s{Nh)*g(EcR˸70&WY1ZKq,RD\fA;a{z׆ Qwʄ= vJ ) Tw0jCC5"1E ܀+ާ({uwv+6S&W ]"5,PLFS*kKQZS\`BMQʄ)E(h@16CUwiOxLp4;ʤgc; 9cj=ᆜGKA3ڰ\`SD1(5,PLFS*kKQ5&t)z, iEfgr:3~|ՙVt)ΔtgڌM'M`3=R)WgzZѥ(2;Sk0&ؼf<_4gz* cryEL_Ngk|C_4gz*ݰKQdv/3ӟ[Sk뗗?3=(tEL_Nʌ91T57gzZѥ(r5/Phcr]"3~9U!3L 24woKQk^(q`XI6Eqĵn.ŷ)}1E7J(oSG\?uCr*ՇXT$޽tNt l^qP)fl4>T$]~uٻWX`؃NSL.4F8@@0&1́mׇdUsg^}B'cWz0;:3)؀bL1s`" ռt"ca:* sp%&'c ɄNd,p UM=A{Ɏ8aŘb6HCE2)= T=X&ށw0&ؼ P)6>T$eEX12ԤbLQ&\`)Z(%%tQ5Vt)oL9`f%6ژVY]ҐcEVLĖf*kQƔQ P"EٛrFkfhPOXѥ8)@LQy?bLQzp8| L/`L %_+cEr>ZPGxEQ&EsRʸkt)MQz, iEdv/3>ǧ_iEΔtgoi21_㙞JVt)L_Ng|ƏO<ӊ.E)ˉ6&\h27gzZѥ("G_E6&Xѥ("3~929 BKLPՔ9ӊ.E9(JlLNEdv/'S&Bc# ,9ӊ.E9(Jܘ2Vt)L_Na߬ L0=˄rh;`͙Vt)Hk^(q]"2;SvњZ[o~y#LO%&RyHH(Jč)DƊ.E;,sESW.29B+}]"oSKCzeEdv/# 2,9׼@Q"cE"Eh<*SBA60F)@eJܰ!dz(羮`=&P{#f< nyHŘX\`"ռ,PkE͔)JliF%nL%R#$%&'()*+,-./0123456789o:;<=>?@ABCDEFGHIJKLMNOPQRSTUVC$F{<ƀ p81Bm:`v._vg.TX3 [Bge Ux(PaZfo`s>l_m-G uJDY mkZo{46O%/TP[|jz[AN݇P 1ѥ˅xwv㺳.!uabE+./2 Xqٙ+"aE v밢&XQ8$cP6ZvbX[mwӻĀjbd*hn6akλ|7CyOUufT(OX(q`(mjVRٙr4w ߜiE'G_EͰKQmc" 44XCx؉wr`+SD+` N37<Q)XnJLJ((q`(mjJLQ~Ls+JkMQPC=aŚ<(.űH LU;9Fw1s(#BK&#UPћQHf2<2\ʌ Lnw|;WĤ" .x{@U>v6gCsN;cZSD!:ސ"vr>؃»p[ZSDx ,#SES9~x\s(Eǂx ..ŗ}]"2Pϻh|sXzF=7A1(BU&X-\\}"sElSPb3(СKQD~>`pf(q@]"2c%QC=aEE뱠%} |{/}"r@Q%Mm@P"DCzŠ.E9S>`9Jdڀ%:Vt)D|,P(9J<}l