IMD 1.16: 8/06/2007 8:17:00 TERMCAP LBR TERMCAP LBR !TERMCAP LBR""#$%&'()*+,TERMINALDQT-.TERMINALLBR[/01234TESTCONDCQ 5TEX LBR6789:;<=>?@ABCDETEX LBRFGHIJKLMNOPQRSTUTEX LBRVWXYZ[\]^_`abcdeTEX LBRfghijklmnopqrstuTEX LBR vwxyz{|}~TEX LBR (TEXSEND1LBRTIME C TIMEDATEAQMTLIST AQMfWHATSA-TWITWHATSN01LBR{WHATSN03LBR<WHATSNEWAQM\WHATSNU COM -PUBDOM 063  LSIADM21TRM LSIADM3ATRMLSIADM31TRM HEATH19 TRM TERMCODETRM( TERMMENUTRM4TVI920C TRM8 TERMMASTTRMA-TERMCAPTRMITERMCAP AQMITERMCAP UQX |TERMCAP COM                      D/rTrZrrrrrs:sAsfsssssst-t4t:tAtGtNt[tctitotutLear Siegler ADM 21 capabilities. Comments/Suggestions. (Return to main TERMCAP menu.) :Lear Siegler ADM 21 capabilities. \E - or 1B ^ - control key dc - or 7F cl - ^Z or 1A or ; or 1B + 3B or + or 1B + 2B ce - + T or 1B + 54 nl - ^J or 0A bl - ^G or 07 cr - or 0D ct - N/A st - N/A dl - R or 1B + 52 al - E or 1B + 45 kb - ^H or 08 ku - ^K or 0B kd - ^J or 0A kl - ^H or 08 kr - ^L or 0C ho - ^^ or 1E ic - N/A ta - or ^I or 09 se - G 0 or 1B + 47 + 00 (normal video) so - G 4 or 1B + 47 + 04 (reverse video) up - ^K or 0B us - N/A ue - N/A ks - N/A ke - N/A cm - = + Row + Col (move cursor to row and column) cp - ? or 1B + 3F (report cursor position, row and column) ph - ) or 1B + 29 (start half intensity, protected field) un - ( or 1B + 28 (start normal intensity, unprotected field) :Comments/Suggestions. There are many more codes not reported here...this is an experimental version of the file. Users should up-date and report errors and extensions. fg 10/19/82 ::TERMMENU.TRM Lear Siegler ADM 3A Comments/Suggestions. (Return to main TERMCAP menu.) :Lear Siegler ADM 3A \E - or 1B ^ - control key dc - or 7F cl - ^Z or 1A ce - T or 1B + 54 nl - ^J or 0A bl - ^G or 07 cr - or 0D ct - N/A st control key dc - [DEL] or 7F cl - [SHIFT]&^&[ERASE] or 1B+45 (ESC "E") ce - [ESC]+K or 1B+4B nl - N/A bl - ^G or 07 cr - [RETURN] or 0D ct - N/A st - N/A dl - [ESC]+l or 1B+6C al - [ESC]+L or 1B+4C kb - [ESC]+D or 1B+44 or [SHIFT]&^&[LEFT ARROW] ku - [ESC]+A or 1B+41 or [SHIFT]&^&[UP ARROW] kd - [ESC]+B or 1B+42 or [SHIFT]&^&[DOWN ARROW] kl - [ESC]+D or 1B+44 or [SHIFT]&^&[LEFT ARROW] kr - [ESC]+C or 1B+43 or [SHIFT]&^&[RIGHT ARROW] ho - [ESC]+H or 1B+48 or [SHIFT]&^&[HOME] ic - [ESC]+@ or 1B+40 (enter insert mode) ta - [TAB] or 09 se - [ESC]+q or 1B+71 (normal video) so - [ESC]+p or 1B+70 (reverse video) up - [ESC]+A or 1B+41 or [SHIFT]&^&[UP ARROW] us - N/A ue - N/A ks - N/A ke - N/A cm - [ESC]+n or 1B+6E (report cursor position) ph - N/A un - N/A :Comments/Suggestions. There are many more codes not reported here,... this is an experimental version of the file. RCK 10/17/82 ::TERMMENU.TRM  - N/A dl - N/A al - N/A kb - ^H or 08 ku - ^K or 0B kd - ^J or 0A kl - ^H or 08 kr - ^L or 0C ho - ^^ or 1E ic - N/A ta - or ^I or 09 se - N/A so - N/A up - ^K or 0B us - N/A ue - N/A ks - N/A ke - N/A cm - = + Row + Col (move cursor to row and column) cp - N/A ph - N/A un - N/A :Comments/Suggestions. There are more codes not reported here...this is an experimental version of the file. Users should up-date and report errors and extensions. fg 10/20/82 ::TERMMENU.TRM Lear Siegler ADM 31 capabilities. Comments/Suggestions. (Return to main TERMCAP menu.) :Lear Siegler ADM 31 capabilities. \E - or 1B ^ - control key dc - or 7F or W or 57 cl - ; or 1B + 3B or + or 1B + 2B ce - T or 1B + 54 nl - ^J or 0A bl - ^G or 07 cr - or 0D ct - N/A st - N/A dl - R or 1B + 52 (delete line) al TERMCAP codes and Cross-reference How to create a new TERMinal term file. (Return to main TERMCAP menu.) :TERMCAP codes and cross-reference \E - escape key ^ - control key dc - delete character cl - clear screen and home cursor ce - cursor erase to end of line (eteol) nl - new line (simple line feed without cursor return) bl - bell or beep cr - cursor return ct - clear all tabs st - set column tab dl - delete line al - line insert kb - cursor left (backspace) ku - cursor up kd - cursor down kl - cursor left kr - cursor right ho - cursor home ic - insert character ta - tab horizontal se - set normal background so - set reverse background up - cursor up us - underline start ue - underline end ks - duplex edit keys ke - local edit keys cm - cursor address ph - start protected field (half intensity) un - start unprotected field (normal intensity) :Create a new TERMinal TRM file. Simply copy the file (TERMMAST.TRM) and then edit each line to insert a new TERMinal's code. - E or 1B + 45 (all line) kb - ^H or 08 ku - ^K or 0B kd - ^J or 0A kl - ^H or 08 kr - ^L or 0C ho - ^^ or 1E ic - N/A ta - or ^I or 09 se - G 0 or 1B + 47 + 00 (normal video) so - G 1 or 1B + 47 + 01 (reverse video) up - ^K or 0B us - G 1 or 1B + 47 + 01 (start underline} ue - G 0 or 1B + 47 + 00 (end underline) ks - N/A ke - N/A cm - = + Row + Col (move cursor to row and column) cp - ? or 1B + 3F (report cursor position, row and column) ph - ) or 1B + 29 (start half intensity, protected field) un - ( or 1B + 28 (start normal intensity, unprotected field) :Comments/Suggestions. There are more codes not reported here,... this is an experimental version of the file. Users should up-date and report errors and extensions. fg 10/19/82 ::TERMMENU.TRM Heath 19 capabilities. Comments/Suggestions. (Return to main TERMCAP menu.) :Heath 19 capabilities. \E - [ESC] or 1B ^ -Then update your TERMMENU.TRM file to include (in alphabetical order, the new terminal name i.e. 'HAZELTINE 1520' etc.) and then add a line to call the file, i.e. (HZLT1520.TRM). Something like this: >> Hazeltine 1520 >> ... >> ... >> ::HAZL1520.TRM >> ... >> ... That's all there is to it. Note that (...) represents the code for other terminals already in the file. ::TERMMENU.TRM Display Escape/Control code cross-reference. Adds DEC VT-100 Hazeltine 1410 Hazeltine 1420 Hazeltine 1500 Hazeltine 1520 Heathkit 19 LSI ADM-21 LSI ADM-31 LSI ADM-3A Televideo 910 Televideo 912C Televideo 920C Televideo 950 Zenith 19 ::TERMCODE.TRM ::ADDS.TRM ::DECVT100.TRM ::HAZL1410.TRM ::HAZL1420.TRM ::HAZL1500.TRM ::HAZL1520.TRM ::HEATH19.TRM ::LSIADM21.TRM ::LSIADM31.TRM ::LSIADM3A.TRM ::TVI910.TRM ::TVI912C.TRM ::TVI920C.TRM ::TVI950.TRM ::ZENITH19.TRM ments/Suggestions. ::TERMMENU.TRM vTERMCAP.ASM] ! "#%$&'(*)+-,.0/123546798:;o<>=?@ABDCFEGHIKJLMNPOQRTSUVWXYZ\[4/Oi _F' s%d𔭧&~E)~kOl?ѧ. / ω-N{{,ECȓ3D􄧢!d)[趿GMO'X==&Qɩ}bU;~M!vgy U~@*{,_EzSA'ە& >L@(Ң$`Co54|J$ /O !ωt2D<3l?|'tAۿ϶'ǒHG C#_d貅-_7EMMxF{YM@'Cį{,϶'PCe;l=+Lx }*_d%hd}2Mn$O=m?@s7 $n4Ͳ4 or 1B ^ - control key dc - or 7F cl - ^Z or 1A ce - T or 1B + 54 nl - ^J or 0A bl - ^G or 07 cr - or 0D ct - 3 or 1B + 33 st - 1 or 1B + 31 dl - R or 1B + 52 al - E or 1B + 45 kb - ^H or 08 ku - ^K or 0B kd - ^J or 0A kl - ^H or 08 kr - ^L or 0C ho - ^^ or 1E ic - N/A ta - or ^I or 09 se - k or 1B + 6B (normal video) so - j or 1B + 6A (reverse video) up - ^K or 0B us - l or 1B + 6C ue - m or 1B + 6D ks - N/A ke - N/A cm - = + Row + Col (move cursor to row and column) cp - ? or 1B + 3F (report cursor position, row and column) ph - ) or 1B + 29 (start half intensity, protected field) un - ( or 1B + 28 (start normal intensity, unprotected field) :Comments/Suggestions. There are more codes not reported here... this is an experimental version of the file. Users sh&~E)mEz|ECcI ]/2wў~R4>m A Oį Ol}_C@=|&d+w} ]!G -Bmc=h{,)SzB_7߈ dwI:3ڇǒ"_{"!Q1]7sE{,MxVӋ]6hCnn cuU$ocI |b ]t'>/7fa@+kPqn|Itф7ˏh3M?~d4.{"}ȍf?ӤGFCj1%Gj@a95wu%;7hZY/g4pl#Gͤf17⨹˺z9xn0{*߷$ okb*OZ'~}b=)"ں*[h›1o8nMkl'FS=J-?Ǎ-_^A5w֠b4+uYXhc c im? hDW꬇-xXal~k+w%Ύ8n Vd%U=KI*!]5P6nfNr^cg Z=8^Yt#@Ft c[[c(x{ʌn`_JQsɵ_1ѕ:+Wf *r/K~QC@֦5G⸵6h˺5J-kg.n# {,0$[8ǭ@x܁ZYc˺RZH֦5r^c+kn^IvpYXZ4xڭym|z #VoP=-Rkeq+ould up-date and report errors and extensions. fg 10/19/82 ::TERMMENU.TRM (NEW TERMINAL'S NAME HERE) capabilities. Comments/Suggestions. (Return to main TERMCAP menu.) :(NEW TERMINAL'S NAME HERE) capabilities. \E - escape key ^ - control key dc - delete chatacter cl - clear screen and home cursor ce - cursor erase to end of line (eteol) nl - new line (simple line feed without cursor return) bl - bell or beep cr - cursor return ct - clear all tabs st - set column tab dl - delete line al - line insert kb - cursor left (backspace) ku - cursor up kd - cursor down kl - cursor left kr - cursor right ho - cursor home ic - insert character ta - tab horizontal se - set normal background so - set reverse background up - cursor up us - underline start ue - underline end ks - duplex edit keys ke - local edit keys cm - cursor address ph - start protected field (half intensity) un - start unprotected field (normal intensity) :Com5?dʜ5^YXpg vgM8nх6h;8DfVZ5J9wq0_q[7V.K{(5?hDWj,^]ecim:<^c+w5"J8nMklZ;QY!oYX /L?gZ+kVؽVӋV^A˺ǒoBGm5)#-*[FtVYOt)K(_Ư8-[E͢Lke=ݙSѬAYXzvn֠⸕voJ|ǂۓec)48n]{` ]7jP;+~.KpXyN/Wф7kg4?7wfqrscYXǭ@xr,[X`a^ckm+ecOuU$ocI_~&|ō&Y4BEuUJqMxrT6_qrsVwEz+w4f^cg=KILg,+nƟ"uUqv:Ijm? hDW-77*]=̈-:Rk{v5v/{?ʝ:[vWk7^!Vx˺R͍Y?tyVk"ںǪGfDZ,5cGpRG:-FS=J-[nnZ[/ 8zc=8n]ec㖛6C?];)uʺҢFq7sɿ)3@ؼ۹{,.qkƎf1ѕZqc+nAEq͍ece1&걞adzZF+ /hʺ]Vfw-ՠ^Jk{˺] XXU~Q,y Gzx_qrsV.K/@<.nP0=V+Z4x-77ʼ*KfDZk8n7 <):к-R;ZT{p7j9ܨ̋ec)o{|q+Y`I-*[nnڃQ⸱˺@i,:PJhQ@,^Z,cQ=ܨAq <pEZ_o~΢q{,-=Xt8^YXh›Y<8naƲ;J-ߗōv0W^n-֌{s-]˺#7?^cܭ@jg>vD~)E}حAq[XzMx<|z[8Ps~Sec[Xф7F +/~k3O/{⸱ê[3Q*YkV4u!eqzZ4xHjMxsYX+q|WJ[+g-n4 Øsxu%w@z *[FtZaE6h;O@uU$oc{"yXE=qMxf^|F++ 3NQb|;7voy S=2T{"}s=X$K Fo/?|xjs})wU=nW5)n/\դrY #7c6C\դvTtVq$i{`Ҫ&ŭ)A0OKi=jR܂q9c@RߓhUˑ%=V5)nٓSq9 ?ijсFGU)ȸqO`LIqQ`L{,w%zIalƑ/pcoB,s({,w=!~XM[{9Mn [a_tg"Iq˞~aR,#kYi=2դerdY¤C 5cGp(>EXwYXۻ^۫A֦5r^cqL˺Ҍks?EB*=VCLoWjmA4]uU?![ǭ"fMk;[`aNQ*{*qܚ#kY#Qx)]?S=Vu%kO@'Ch6'O/{z[kӁ[e^-űp #]=>8^YHi%[t~5^YXb4+|b GtqF\=f^|F[a95J8n;E:6%ʺ6m 謗)+E}حv˺ǒyQ[qԠzb4+WB=@kвq[p]g -\ޘoB,wYXz!t 67)?̋ڝkF Z=RG:a@p8nq!Q>?EWx(W0veB)+[t4| g{,Aic"!_-D_b4/{,/O|4]˓2/}IzBIzB>/&OшF ׿{>Ub4YXU""J(įSj(DTf4Țj>hD?Y=V/O|4IzB>' e_>$=LuUb`LxY<)=#l&BS^-#kYF#1jRܲ#lvqp ֠Fs=ɻǒܨffy<^c_iΚvo{,w=iHݻ>]);Ov{H=F70[ڮ5J鬹Qi{,p=HIqTj?Y"UkzZa=X$Krsyx-M,77jn,ZX${@&&XդY@&]7jjAsE$77*Yh+O =ɻ dUh+Ojj{H=F70[z)шY,58jn{,w=t`hT5)n1r]YpkPqb4c=F70[j1ѕZU!( ohdc=MLp!M5)n1rU!(n4sE$77*Yv ܨA謏RG:叵˺"yÍ0離IqkM5 BO==mq!{"yXR懬A53E=ɻiH{2?{*۬%?ɿS=Vu @ E_yO>hD?5-"ںǪIzB߿ʺǪIzB' e_>$=LG˺Ǫ1|D1|J$~@YXESjS}SF4Yec ˓2/MyP&ec bH/&O鿬{"}^-77*c2zWyu[FtVx[شwh=8noB.naޡsYXz{pܨ$[+)-X<_Yvg^[=̋w|6Ǐa@kV>nсFC{"}K/4[1'NS`BEڡhDWj7i30Jy+kƎ^Yk}|_T>Xi^]̋ec)`?n xXشwh hDW@֦5vYXz!t Dq=QFtyQ_z)iPqec͍,F#Rm>Eq͍ km:<^cu6Xm=||b1ѕZش1u%⸵6hv7_ŭ +q˼̍ecm {EscxtyV ;{,@},8;SS, n4)Gj~bсMXh0{DV]r7J-[صhM*M9jLd /2#ȌH8},Ǣ(|=4ޢ+={*W4;]BaRtJLSa^e=eQ+uϪK\ȼ S&|!]{@M,=e"ѕ$(|OSqCtaf=sL)Yev(*Gv(vѕ=OUf{ ,Qf)QsL |ASQs@&]QsS& ]oQ HBR*3"](9 H;xO*SUJIؙ8=3=e"JZ*G3v=\( w9ǒr? @хEW{*_*G3h)YӿraE.|OR`{*̫ )=EWG`֢{,iƵYEz(gTx)Ռk3]f\hDWjgJ?!{DV~bсTx) F¼ ҸS6ۣ}Oa=XXҌk3AEWj#`R JsVzX̸61b(:zS?bC>RSj -\ޘ_n {U W92/O$e͍ym|OUv)r4xv)m,uO}zza=eFr'͜C*r'͜CFt~)YThJ |=O5U {Uq#=OUf{**r9qm{ ,Qf)QsL=e".{#Ʒ^Tx)UrmR?$Tx)U{*W&p70wS `{*La)Tx)Un&p7#ܬ0Tx)UDUZ)lKJ1ѕZkӁ{*hإhfRxO8Xrf{$,wJA?ORa?@hд>7֦CcѕZz_HJrBES_ 77ܬ=FmoS_ d9C`Imos%ؚCc-Rkm7͍ڮ5؛V*.G3h)Y~)Gc-RST0 ~K9ڃ5c 垲!}OȪ\͊45k{* #SfD}r)@JGe~ȟ d9 qIсMX`I-<ǒkl}Cc-RkmQ[E+OS&۬"fQ5p=e"71rZTFAꣁMXnn3V,G`l;1J({*"r_E*=nLdUA&&Xr(H}4Ps͍S&*|\SfQaK`0=~V/ p9bJ}kS&*|R[tK`0=Urkν=e=*C{,i̼Ɩcxh̽EWj-77 Rc 4}nb'`7 71V?{9[s < 垲3>7=Up+O"-kF-82UM+O۟NX`I{DVQԁVK`0=~V/ p9bJ[e/ i1]R*|OygsorOlK qIсMXtV!'CLMORaf"GenS3l7 <ܨEⷽ ^Jy>7J-ꕣ驣:aE 4}nbѷR{f{74-G`9(M,F#Rkm:<^cs%ѕZ{p7Ԉ`a?鸧zP9Ge~ȟ*.G!ܢ+=e"wTQH#=^JR*Lmv恭"f'6B=XXR懬Aō&Y3/>su7{*7 ;7+ z_r(>TWibnϪˍ]Zf.z_SP4*w56{Uq92/Oj,{*̫r&Bōf@r^cV|OR͸6kQf\h6xR^q!RG:wn-*J${jW N${ƣ=x kQqO٘RG:.G!#kY#{Yy͢vg(#[ؙ58nq o֌ËÍTx)vn&rT6;7+ <9]7S)N20Y Fy{ {,iƵYq?Ш@xr5f^cÍf /qm&~͸6+q(H+Q*ʝ:;|ORLtUZRԑNhƵY#]7Sg8ӄ霟ьkff{*jƵ0=~V0v9J0yS FCt*GEJ餩 ꕣ,7S6ōfST3̈́霟F3 |gff 9?oST3̈́霟y#o=^JUع0 )T9fx(S{ƣ *?,G!1( p ¼*uD#lvqfnVH{ƣRG:⾧f75gr_Tx)UDy5grmVS]ev*GظE* w=eFr_(;c羧lv(n4ǒ֎71rZTFAꣁMXnn(n4h:]vccQTWE͍(HTzxOȪMLfQh@&?LdUyrs}OR`{*jƵFCЕ:s%~bM,hrs@ѕZp!@{DVg#hn7 ڮ冀=gخ |mRfthƵYL}OU;?oO\`t${*WhԑN۬ԑNڮ敏^9͢y=eQtKf\ 9?oC{*yTx)Ռk3a:{**ˑYy;=UKa9z@rOx7r!kD¼*̆x@&By {ƣ *?,G!1( p ¼*uD#lvq:ă2(S=x S6ōTWLa9Gyc=U#l&Ba[</oܨԑNGt"}Oy¤;!~X&΢8z,(G30TWe~DYjm:S65D|ORf"D\sڭ0Z[֠z)S|=dY |Oe~E&k{5r֌#tk{ǒ&;Eg^ IwKైw,GwWjm:<^cClG30YؼZT{=ecgd=L/LST.G rgЌY͢LS6fyM06fs^{==5xǂۻ^۫A6h;K$P/uO*.G֔)@rdM=(Pi{ TY#9?of@=^J5LyJ7"uS96knKf$@*G3zY2/SgtLy͸67P4ST3̈́霟LS L5pc96+YimWfB*G{3 /ьk^KTY#&L}OR͸6s~޾Kqmy ל}Q~V%|̯ BSkξ۬KnS& NCBfMCB=^J5ӐhƵYӐ|OR͠=*;͸6kڞ)3W{f2U Yr"/} :LSم .Gم_`÷ 5冀B9Z;`ެKnS6ftg>S@m¤־̈}(HimT B#oR?W~3ES_rhSϸ6S6ۣf{ʌHo(Gf]|Oe~M{O |ʑGrOlAьk(npOȪ^f\ }O٘fS̠zP͊=*;#,z9u :| / Cb\f\z_agz6sE2X霟6Rڨ܁EuE2Í{ eF,Eȿ 'eaˆW9z@y ?g~ޞ6pt"ï}D3]xyFpL>5NLW9fx{&S.%Bkڐ==x LoW!~xO2?d"/ˑkfP懬A6h ~aҝ?ڧN>#IxhƎfQ|pM={|WD#SDvn4͢_R#h'd OhOF` :a)Wo__;7f/_4Y>SyB'4{ ΍&Y8PZ~ ]H݄' Mk'4+7/o㯝MxqՃjSF4 Mk'/L6= M kFެF( џ@τ`ۿf &EV ҲS.$=a&{RG:5= M kFެF( d%?mF.OOp&{x)Wo__;7f5@kyC4tdmOȊTn&{67= M kFެF( ~FD3|&d~yg Mk'`?Ј+7/o㯝Mxq'|ԞS pb%F#l&{ch{ ΍&Y8Pb4ڃ_D{ה~ =#9?oS.{"AԑN 9?oS."t0=303Os~٘4 h R̈Tr_Ѭ2{x&=e".{9cI-Rvf *{*)P2l1Ϥ)Pf{ ,n 0Ƙ)3"yѬ2{ ǺǒCNDS t9ʝ:[3ЅތQ͌!0z3FiPMklƾ'DO\( ,إLa)kn֠+3Hk=@r>7J-WAN+jz߳>?4;{ BS t9J^M+:P2/iƵn4DH{ .G5pQH'7kZY`{(>v O\hnԠ .bog{&20O\7¼rI *F#Rk?Y_:{ d9¤Bߓ{ \7L}u74%LSDv@&m;q o+Cߵ<<7d{ ׾m?!Chm?~YF4BSDv~74%LNSDvzWfK'~ ING˓įOl}'<є SOOX"p!`S.?C#MxT;!ړ,0T=}l}'<+7ѯ]$~`h7|5"ڪm|DT[~nZiPyŤ[dӺ;w߅^sVַ&opboM{{1{ֽ+n_Ln\Lwv.uoMCD"o D#o_L9  yi 9b'Gbz .&yCSyib!o_L^_ iP܊q oV4|&doYSAgB{ e!'SD)T_4?F?!4AZ>Ȃ;E{jt/L/r{ Iz'>mEOL![ߑiEc)O=m?@(SSA﹧- n4)G3ZThLoQ!n :p&Mk/_hdO@#k*/wdh›lA4EC'~O~IO4HG nFczGZEzb*O_E@ Ol+7ѯgB>Ț Q4iyNTп O~"+BУ!~dTo=Ԣ 4}nb hьk7h+7xO~&ȞFT_۹ф7_ l/h Op&%hd@na4vi YE HG )Wo_{4GC3!hdMA%>L>w@|`{)WoDva4 t2D/2=IO'zSE~O~}ȿ> [OF4[يшF k|>&OOFc\~@ք|OO_A#ۿ+b*&HMx'zBSD F_~O~E2eF,>_D{~SD߀FEoBMECYУ!F>b4ENЄp|'_D{~MECY5AZ>b4ȇhO~O~?D Ya4SDva@ 4|&,F#F?7Ezp/=IO"nDE[GDV[ՖyDdUmjzT[ՖyT[ȩuӻ[?ӺwŴ}J_Lj_Lw1{w ֽ?ٹֽ+n\L7ߨ)j\ )CWCbZw\:Ӻ}pi|Q7S]̭V]ĭ*O3y(Cz=fϔFݴn/[i /[韼Ii<Ϸ.gL yl Ke&Eg沼l}M C8! j1Y;FtSr3$&ys1f$1tW8!\X<‚~' ågͽc>!7&/&X/|1f.b͸Ib2"pBEX<‚|'Q-4k7ߨ.bSnD"r.܌$&9yŝ;+vcU|G.Ս7,w{JyJeOoMCˢpUGO?tR31`!7&/&X/|1f.bͬӆdjE\@~hjkϏ\Ȃ;E{jt/L/r{ Iz'>v7TERMCAP.UNXm   !"#$&%'()*,+-./01o23456879;:<>=@?ABCDEFGHJIKLMNOQPRSTUVWYXZ[]\^_`abcdefghjkil |cRj(GRGY,E|i#/[n}[ YbZ߻oM KmbT(+-+Wu`(&/&K3ݞ_LoMs1Q6k.&Jִ(s1Qu_L rF4_L苉(oMCDoȹܮoݐbrK~?b⍖#"֎bGQph3 KБnX>22á|gJteCp!CX Yq2N7,w{JyJeOoMk1 3LSzLy1a&nBdqQFtSr3$&ys1FeXUXUXUHoM`SlmFt滘V7Yius1峽ȦɋɥsbRXt\Luuﲨ!brihjH^L7/ ES}Co|Q7 9S US -.Xz~nZnݟO"]NC[j/EQm-#"E0jk#"Z~nZd:[m-\V"<kv*4ߨe+ e+=i|Q7-T/"k^KE{N%?ʗF4幬%epe5:Sm}s&Kń߯&(ZgXg(*0,oMk11bZXi NP"n9"8U_N<#'#'γ!c<R6ߨ6Y| K-e5Z역Ź,eݗoMӲw{J|&/[XZ ,Fݴis.sې!~Y ї-~JCe57ߏ=~=Ã<`~nbZB*`#{1շDh|Q7-Tɥ~1o]L5L5癦ɋɥߏm5?QݸLr8bjLrs1:YZ(Ge'1 *gz?bT7MłURpS~<~Zُ\aHR}X זS40ү}~uG3E4Ə0gr4n`˘RNF)v׿~Đ\ڔ3 ;n`GU,5nH ?L#S6;[z?b:g0$?F)љ|Vܮqe76rnPL,~ w@4e(n#"kˈ~2h懯z?b#"GXLvndv?r,gYi׍S3)љbCr tfeYf~?eV+)E#h~뵨h6%:Fdf,ͬSoX>%:S40R~h0f~f}2kR?%:?)';uK3ql9S"Sޏ~ tc' 2ShFDQ_'8S3~Ęjڟa뇟Bs0 اD~I -p`RL[S"SFçShC1`y Ҁ}U#hY1er{m;."e X8|JtY5#h-?b̾k)7pˇ[,ͬ+2eH5Xrx˘Y~D&ww3ub~S"nhJdH Ϊ#F6#)G htYz?؋xF_*s*T)T{n|Q7=^@^F^-&ky.o|Q7-,Zֳ|[[Ev9[v_r_]\VS]^=G_^wd/[Ϩ.[sդv9 l=sCij`l=^UeCؚ Uh\~ F4M^h ȋx+M^"K ~zbl=˗gO~? ?!f).uK3ˣ3e^§DgvUcޏh@Y5S3E Z>;3>%:S40rY! /S kQa|Ҭ` ƓGh#xE#(n&;u4hAKçi`dv?~X>?|H~ _z?b\`3FL FZ#?n Q7L#5X[z?Y[)-L1 w@)g4kߏՍ<7j,L#G'w? 4 rx?bT7V䨱\S`vHvXd'niL3 r~Ĩnuh0a%~ޏՍ$9j,Wo!!-/FٗޏՍűc8N)g׀Ǐ:u~`~ޏulDuSX0%:S40rx;%:CG0?GN.ù tH+uKG̼1ˣ~0E)o3dgڟ}O5~)gWYZ[e#7ugV,s,e2fV)gǯz?b4|x]DƏg,|JtY5%:u#K}Dd?cFZanhYƀq ֦DL9<)vJt-( ?\eify,;LY;2kdh4SU9<\z?bGge,|Ɏ E[`&}#ڪU#j"VMDV[jʑUSrzGjYz[I#&>ߧnŔ3hb:/ib#&6n?זA_(,9ek?#z\赩„11#G@،U袈3^<G<<r1Ux4ߨbR/ӂ_߻ll'7ꦗ4RўSI*Oeo|Q7ﲨ幬%epe5:<LnXWG~n.Mɋ)%|y~#n:;5(~nZIپ\LN ~Y|˞4ߨ^KE{N%?ʗF4,jy.oape5:S}G]e,M-G'(S3 [ 7Dgvm~ҎUsQx(8Ux(8!< Nsx(nƩBia GY<7~YD[\~nZ{4O^Fݴ(Sվ\LN/i=GUϟBpUpjG:GLn,ob筇Ei/^@^?yٓuRբ%C yYͬe5&/[幬Fݴ.&=ϸ癎e5:΢wy1T-e/M_<.[ŗuӂ_߻ll'7ꦥ&E K:\V?"%:S}(n0-5gcKt?#ӿuQkgifytS#~~D[>ý`ƀ} ?GLi9j<2Ŏ X;9Yc`n4|r{ml?pߏ#܈CҜ?o)gif]g`d>$]F#FE?~w|F7%:|JdD&YzS7LLvޏx?b)mdp# aQ KnXtrxQXj0]@֍M9DF##i`-"3O9<]}tND'{?bZ4:h_4n! 7匰KRp?E6?i٪GXIg`䁗 _ӠFݴn/[i /[韼I K8բG`"U~?b^t&ֿ]7~;7]K4,2k۩gr a,|J~;ܟإ{뱗{^gM1ٵ*g4GY Fݴn/[i /[韼Ii*`pUs6ߨ}Dq^B瀉RR4MgL.3-,zy9. UջKqauG_ Eb0*[y9 A\4y1(7,VbگN{{YU:jLiH^tCe+ XCŠ\4eoMCe o,ֿ7,Z\z,քF4uY!oX oX7sY7.uyꘇe˔NpJ'8tXW(l;Fݴn/[i /[韼Ir1շ/Sh|Q7ᗊJU1? Ni<ϷSޖ-,Sɋɥ~18u~1Րn_L/&T"jvσluߏu&f[#ޏOO5jIn}j'x#fyt8jh(X@`U;w }<t&23H)vv;0]1[@/1ڏ?adv?X99j ],r,jpd,1O)v~gbgz _LH ;b~z{s(7roMk1Qb0QbWJL؟eq77t7ߨe+ e+=i|Q7mDѻ(񽋋( :(Ev1Qܵ7ߨ苉~1QjH^L+N~գ`7ꦅ%e_Lk#Lؕ&Jϲe|s5ߨb^aĮ(?G]-(~ţ`<~nZ{m2D9"n1?GYYi??;2CTZ"-!tf~n)_JtGLLp>?eٙ^[0>43}Jt#g?Խ1d?LSK`#Eø.O~nZ{4O^Fݴ:m}^C1L̶:G1=.˦WIG1Oi ΀}4Z5耩 (SnoS" ֦Gg,]GZRNdrg3Җ)g6%:?,DNPrev{

a2(̮k~nZIپ\LN ~Y|˞4ߨbri_Ls1e7M\V?\K~hϩQPS\-<~nԿr1n-.[g&꽋i]7ŹJbko/u?Rբ%CM#]z~k# /r2}>ܔ 5#%wޏjOE;PL茥?Ce4cg{2~OO5n_q/]pCFS40Fݴ F|:eŹ&J:eEv5&׷s]*.LŴ!bbސbzbs1)ڐn_LoMCb KKMl-%di.&JۋR5M^L[~QV inYㆌ84ߨe+ e+=i|Q7-,ZjBZdGb*S=`7ib윿x:w. h|Q7mŤl-.Ŵs_ꇷ܊S[1NoM ~Y|˞4ߨTss1-o!o)eyzF`5F4$/o,oC 헭tSrUc>@ lE/ ӼFN9<ٹ~K0L9@ #fytf:wLqs,y)>L]S_z?b֥Kd2%:S40r48OvV(Rh~e`)#fj6og"3-c2%:#8)g``ʚ-vWErxa~nZ{4O^FȮtKKMCrӢj|Q7-eVV'/{&ky.'.oMyeZjȮ;gR KW-5Quӻ, |eL3\[2dQkq2edo{e=̶m|Q7e8SLsgn`0gn`Ꟗg/<z,?@s2Zmή8Uh|Q7]3 ~GNBu5x@+LNB9L#oM ~Y|˞4ߨ-5Q-d-ńS<Ϸ.&tB;w_r_j_Lei Ns1([:΢ЩBbBj>:NmkH^LECbB'(/&t~1 ~nۋ !,ڟ E!,: Cp>: Cp<9>#3AFn/[i /[韼Ii<Ϸš"̭;<1Ĵh#{Ye57ߨ˖mq.o8vf.Vزl=yZ=]:Nx(Lm 7EvzSʙi;~, _ξ~yyFݴn/[i /[韼I幬Ev1]`e,]FbǟF)љ~:ϯnv;u܀kaOf3Jj~uo84 /ènzc5 ٞEL]#Fݴn/[i /[韼Iy(5d-e7~1QVZ&J=&Jbk}oa~nzwwy(ݑ(]`(n|Q7:6w1QΠuv.&J~n/&KCD!y1Qn_L E!{wjY%uӐCXI_!nR(.X(M |l)M %>*XI F4t.PM e% unR(.X(ԹI-:7)ܤP„~n:j1Q1Qj3L1XUXUXUXU(L73`(V?%ko/&Jm(Yb,ɋ篇Qv1gg7TH o|Q7]Dq]kpu.bl\e+:(yoMk1bl\?&7&Jh\AbZ< ncBl 翋FsP_]` Y>&n9UFjp|/&J\kp\L\kHLcm|Q7T\kpʼn%DQ 1G71!Dk?ia?N0Ft*EX X X'Ԉ aqg{!`Nr.& UO'uXR=2'j7V!;4ߨqBP[A !]eX!80aBXܠY{N h|Q7M%]L2%% )N*;Tnn!eʭ~nZ{4O^FݴZ[=\Zna#{Zjzn_4yY,c_ n7r³Fݴn/[i /[韼Ii<Ϸ.[ݗܗZjtd/o_Til]-ey[X?DصSei( &FsP_0a~{[NU-Fjp|/&Jp Z]D 5V e+:(yoMk1bl\ʼn%DQ 1G71!D"QܦgènW {jsfZ<<~n:/&Zu/&Jb&n9U3R'b GjX2ۣ"~!PFs,L)љj 7~,?00?ccGCMǗR7D&wޏ3&58_rxCm[5?Fe9#Y;eUsr[/~c-c"PU/vM1J{dv?r)GRGuӂ_߻ll'7ꦅ%jD[|X(-GB9S~nZ{4O^F4,j%:S,9R3۳z";EuKG:GL=~*_G1ˣ3jO9U;:KO#ϘFG^&Yz?bGڏc&러VA[O=Bj 쌅OP>iaSx;k Ol~u׀M)4?cSh4X] H ƌ 74<:uco>)Y H92z_VGXZc$ti~)љߑr_#9i# a`D(ڂNo|Q7-eVV'/{~nȋF幬~1յ8w&b5ߨT{q3-,zw&˻ S|Gbo|Q7Gb҃?Lh|Q7ŤôLpoM}1QթDɋ qUFt9e+WUHLW%oi/r(.j1Qkpu\ča(ZWe#oMC^qCGqKMT1]54y*Fs湇~{[NUŌ<^u~1Qڬ3~1Q~ٵ6 (Ygbf7i1QYbfDۋ5ߨ.ZLzL S V!`V!`V!`V!`V!`fb07ߨbfj1Q1`l*L'nLE |Qp3b"Qܮb?èn+d?&n0,fJFjp|/&2 ds1Qkp @blW%oi/ZL\21Q1Q2LE |Qp3bKM(Cq6 ~8nFsFs[xa~{[N #58~4~r39~n:/&Zu/&Jb( &[]54<"< c1xov˩a7ߨ.b,kp @v9e+$&Vpu1Q6ߨbD 5.ʼn%DQ 1G71!"tרna?|L3ޛrH o|Q7]D$'vLPi(\Lr..& )/ihq1-i m]LDibZ'517s1!y17D_L. _ ES}ij`w1nɋɥsb;w.&+GNW!lS0grz?vhh/#"oM}1uv1Bqqs aYr?|b՞6ϮwHa30]@m@/H9G ǀ}3NLNiNaci `Sޏ4^[0>9==(R$iy8 D tYz2S70SL t6Ӟ6Ӟ6r؁@m@7ߨe+ e+=i|Q7mTM\V?bZ B y1oMb=ϸ ]ą)#{17ߨokq1u4ߨbRbaZ&TLL;&!1݆Ťhi(\L 9Slb )/}C);{F4T{1kb])wCb}14_L5]L7ꦥ&Eb\Ҟ_L&/&iܹD_Uy܌DŽR[FsP_a?0,f|j?pZ;3FteE\kpU˹j1Qkp @bo eh|Q7D 5*RčaTAb( Qs1Q(+n|Q7]54Ygby?Y޳`7Y;" ޏ39O&58) 80YYYmg3iR#i`Y"lW`7Y;2Yh~ g4<:ۋ~(0ZH 1`ߩ`ȒgY)g9^ߑr~tճ[H~5@R>QxnVE7,w{JyJeOoM{{۟˞V" wgLbiy.o!&EF4M^'滾sXE|2[;.Nfy#Mѹj wy?bt d,h0%:g[Dg2 t|i)[>SCCY5[n`C~4Yy҈~8f5X 1`S tX@ev{ʁZ<zcZA?ʁ @+"T Em|Q7-eVzV'/{~nZ Glri_ČS;(pf3ϵ#gOcFݴZ{7V7YZjBhaB^9Mm_4koMy4=F޻]j,uӻ]D[g=E,6naY4ߨeORs@_ti=MZqߑ5.{zzw,uiyw yH=-|wM}eOs6;~jP=o;EjG9,B`,뵨,3ڏ-g&~nZ᧸&G?eb[5BÇ)7u;0S7Ŏ1RN1?~ĬY>۳DMf3~^Xt2=(R&23~Hk1eJdOqh0Py49_kg,/z"eY5ߨKE{N%?wNsFݴn/[i /[韼Ii#Sme[ַ%FFݴ]^s`qwd/K-5Q6ߨe5V7Yڟ;27LeyYi?ǂ?GZjhƔ4 õ&;g`D? o|Q7m]Lq.zFݴn/[i /[韼Ii"o|Q7]eO,ysә!oo/{ڔ2ysӦȻSWScX(<ʁfQ-Ft(]eO RFݴ=-l6J%rp|ʩ]U=R*W-UUϵW*ww~?bb6~m@2v;٬!ٚi3N̿~~S3f&f940]1nHn׸ɆMX?~e~ߏ`^7ŎJj,Aso}{ f"e`CK3.USg(RޏΔ茠|#HY<)ù t-n4'23f7d92p˧ CdܮѧFݴ(Ӿ؉vQ*g"fkgyjoM幬lu&-˞^k}4yYuӻ,6?yٓ7 ˞z͵,6]eO,2r.{f~?bQ(S`vǏYv@9X@4ǏnǩGDUZ~n˞ P!+uP1C*{Z3*bOc|*R^LzJC[PŔkb5s1)4ߨ鯆!y17D_L.7ꦥ&Eb\\Lio`7}.]qҴ|M;g!ϪW_z?brzJtϘ2_F9 O r/,~DV~,(v<~ g_4<:h?%:;O(ޏSI?k Dg~Ox:KJ90]#DgL_5?,-Yc.]tSkKG ܡW~O3S3L1c2pߏ%:| ̎Of@b)v"]DLѠn<#fy ɢ-p-`mO)vhFdݏSkGL+ǏOv2ƀ}Jt&2 `m~s&=~D:w;Fݴ(}^KE{N%?ʗ]_Lw{Ji/o  V!`V!`r 0-Ǵ'7M\V?bJL+-UbB^%zL+-,ZdSl]l?7ߨNk_*1]^'L\LOuRsy`V!`B*B)/V!`V!`Ziyi_LV7Y&/&T߹s4ߨlِb -.&Tںj/\CF4_L5]L ɋŔ!br#fV#Fw'Z|gNO~'=OG1qM(8eD$4)Bjq,@ ǩ@[f8au\V߂_@^һl'mblKM(-,j*T`,`h06Ү4M^"q~qq`GjpfFڵ1x"q~?b֙muޏx?bL?~CPz_F,`l) H9Pg07,w{JyJeOoM幬F첼y/}%CG2-e.le5M^l1e&2~赁E6#rv? CE 'r`- 4 tFY;ŏNovxaȳ~yv@qBx}eoM첼y/}!粿 UU!oHy_J -.kF4|_ں- ^W-/yi(̥!yY bklنVߏg2UX54(ǗP0TFݴ/&Ź.{".?k~?|v@fv@F4.+ oȹ/yCeUR^yCZ o|Q7 =_3.k yCUGPe o|Q7 E4$/˷!~Yl ї-~JqY;Tߏg2Cr|9Ń"<̾g2~nȋ)wy1bb >SPܴB>:ƴ7ߨ.v@Y :KOdrg|1`t۟FDG'*1Iu X;~Ս>\Ɖޏx?bGdSΘt;|,|v ~@^[§Dg;SwC K4?zmZ`t5n?ޏ澌gJdDf> h,]DgScSg#PFG?ԤPўSZ*cLg}YDSgi>? ]1ÞXtYzJyF#f5|]5u0V;k §DgSwޏ+Nv?p &K4fe-"Í(lJ~l>^)vX;pp ֦D/1h?-_jLV3ǔȀ)0# ϔ~Gg- g_z?N'oa8dq?Cq4k7ߨ.bͰD"GE\'z'?CX Y q2NbHv|^?yٓ&Ki/|1Mlj1=c$1ũǔV!`*L0-FtSr3$&ys1fːHoMy11-e-oq.&T y1Ŏd{ia~nzs]^L>b*>uv1-5Q-: 6ߨ~EM˦ɋɵ_bzz`A@b       0m|Q7 Ť}16_LԐm_LbF4\L UVCʋńUio/۟i,Rgwgbs1L;5Lp6ma8dq6ma8d'Hv`~l/|1fIL$.bͰD"GE\m[~-&3|MɆLb24g?L1)7"-MrꏥC-0R ?f ޏ Dg~^'m8k Od`Jt뵨1k-/cOÏٗf-_5%:fM"l+ߏ :KO92_z?Y=&x1?K)kO>iOv@#/g4z";#ƌFgS"SDgr a9`4ꢈzLL]#4X FçDg,Rpx."K3Y>Y]Ӫ)a>$?u;cGL8! ǀ}8|)S"F{*Q|gJtSk1,YigY^7[Hp> ?I F5 ޏ-=€)ueOY;kLN6#WℰmG8!<#&WoM ~Y|˞hjB瀉ZR4ߨ6Y>ck}o %0Q\oMs(y[9`Dڟ[adM[a,ϭ0Qu~+L' 6w+L笳s+L(k(թo|Q7Ť(&JJBb,1Qb0Qb%v't:%vGbRF4_*s*T)T}1uihoH^LnnwY}^Lm )/&Z\Lnb.[di3B FݴSmsq1];۝G8! la8d'Hvv oMC^qCGqCkCS,5s1. 'o'\ < C8綁'q2NfU-̏Onrz?F47t7T{161RC1"p6GLp- DgD6槥.u|m>f߹Xt(:1Kj,{?{'o ۰!,,N߆ma8d'Hvh00~oMk1ibT?&)N= ]7V!`ńi7ꦋŔg.c"w9Sn7&9&u"p?~q'23Ⱥi[#Mѹ31Ώ`xÏ4E);0ˡz-*~VMT 5XE4h;}O !G:KŎ ΐf LnxKFZ|ֻB#ޏ8`g]X05gJdD6;~bɱNfyݪ~M)v~ڪqn2vVMX fY;eJtpna:?ž13]ƀi6rbS3p-ԍ4#C l.@~0%:`Jt)v"+- 4,YвLU9ShX8|JtFߑ~8dXt2S;5(iyi|Q7Ŕ/&8ZLϘ1ILq1A ]7V!`*Lq/Sغ0Y\bj|Q7]N<'C8!l60ᄰs r@8!l6000]v oMC^qCGqq6 N<N< qℰs0&coMk1 3LSzL&Bd׍U,.j15ߨ.XUXUXUXUXUXUXUu9sGq{{1b:]N~,N1e*z_z? a?e? a?CqBh|Q7]LV!`\{~ŽQE\'pBmCma8dqBm†@BbʋU.M+=. 'm#fV#f;j~zKIqz}||򻥾-u#&-gJd(Yh4\qB2u9S3dga8dY5^qޏ4#cfp!E[0H3Lby?b !˘2`m,|Q(#58&WƔ9` i?Rx~)'wgK[HȀ]QZTƂ'#fL'23>DR1)cK ,M9S"SF@2)T!><4"i?{:;))Sg񧌡reZUSg.c\qB&ߑ~L?cS" DFʳO8!## @1#0r#L%:|,8,3W9@Hz`e4ڗ)gGU5gJt/+NCu*ggJd20-5ؗfGgDd8Nޏ`s ?/rVḷڪQnU 7丌?F47t7D_L. _ ɋŔbVSmUtNQ#H4o} ):;SS7p#GLN@m@nǐ1|ifKOdrg}?b"+- 4LvʔdS(d,1V@ߏjzhi~FçDڏOZ3X &:c~.S3L#/R>ʁϏ*Ztڪ~?bGO9<>3?2g},y_z)e42|o|Q7-Ťl_.&,w{JyJeOȋF幬Fݴ/b"m-TiEv0۸s]57ߨ-rӺ^s_bZ߻苉zbF4&Eg~1b.[di.uۋiJi_Ln\L7M^L.A="'f1%ttH4F4/й.FN91۴Dǔe`TЩ#>>rv*{aAsoyi_Ls1]čmM?cJ20]~47ߨyŝ;91ۿ~?b֙muޏx?bdOB}ZHԇ~ĬOΘ=S:sOpK.bn2ϪД߫׏"#F!E[0[g4㬚}f3!S>3ncmY ~Fv<-0]Dj,=ɝ1`h_g3~z=1{V5ߨe+ e+=i#/&ky.o_L58brm|Q7-<wq1wy1Qo|Q7}^Z)mhl2֐!~YDh_Vi~R0{|(1{l|Q7-eVV'/{~nd-e-e˶D\oa'g걨1{oMŔr0)5ߨe+ e+=i|Q7mj&ky.o_L58brm]L=ϸ7wq1wy1Q/&:ٚ[qDh|Q7+e5ڟIho/'.bi j|Q7MNmm|~={~3Ja>fϔNio/'⦏.=S:~Ĭ31~d=Sw܇gJ3 Sf #K?"Z?"ZG7jk_?7drx7ꦅS=٭uw ŭŴ5y[m-nLL<1Ώ Bj 'h?,~):wޏ |9f /9`Y5 8g_zjk~jk0 ȩ 7ߨ↎.V[~?bk6FYNfyݪ@M'Ϙ2MYٗ/jrH T[~nZjbߑ[dӺ;w߅NVSmUtؑw;|iEz;$?HSǂ9^,_Vljr|T[jr9V Lhi~GuӐWQP!ZqCRqC\qC.FdU9pGLs7_B}K.5[yV@^o;ҀO1??`܂?/*jrAyDT[30*`o|Q7M]čjr*g`D#H?rJt3#LN8 D^grz"أڪm|DdU90*V<"r4#}i/uyCbZ:\Vle1L̶:G1gu.wg=IquS-#O3ڏ5x?lF.1ˣ3Fy a)W͏.SS7`tgkTUVjcIGaDy~dZp[ƈ2uӴ\T}ٲ mH^Ve˲&򮣋FE1.LxR2^sdv?K3Fg?ec>}-S,/{aDyiƈ~ni}s1RPt׈GLΎk6?ע||1`tY7>?ע2?Fʺu64#Sh&Dg~\Eہ>%2eǏ,lhr,ޏZko~S쬝2[cF??zm,-!2?#`n/?2mkQLgi|Q7e5?=_.f:;~Ytv#2>?ע2Ύ~n˞j.fL]tv<2TLgG?2ܖótvuӂ_߻ll'7ꦍZ[=\ZȋA.[<[X?4ߨl]]̭ꖚ jb.[diZ\oe^ eyoMkSXܝje˖mh,oCe5Wɨw1~,?Sτ!P[>T!2%:S40r4iaA9R75g"Kdv?x;_z?2lGl2  ƀ9 2@}VΧS?x񴈦D-1k aGj茷)kw?0K}X Lhi)~"K)ѩEi硝k V940r\pY7 uӂ_߻ll'7ꦅFbZiq.-5Q-ZX?4ߨ6bѻ&/&Ŕ#{1շ.&;w3ys4ߨ6YsY}|{{1ڟC/Bx,BxhłY~nZ{4O^F_*s*T)Tmb~FݴF幬Ź(qZȋRȮDqW+[X?./&J|i~1Q7M^LDYD(U}DYHLw]\LERōe!1QB~<̾s Fݴn/[i /[韼IijFGe5/~n&/6Ysٲ-"yPY[-e 4ny]j|Q7-eVV'/{~nd-eO\l-e5ZX?Dh_VseR^Vϰߏu&f[#ޏ>,ϻzP[6Y#ryDN̶yDǔh1%t6ALČ^Of~nZ{4O^Fݴ׉ ũ&ky.o_Lbm!/&J"(ڽru[X?4ߨDq.&߻(_}DYȎDo]LERբ3~n_L'dmDq3\\L6k(K霿(.ΝB6,j(KCDqjH^LDq7ߨR r.&O5T]Ln7brkCuܺ?IuӲHv}C۸Ro|Q7_LZ*]Ϯ[1%d(a^oM ~Y|˞4ߨ6V!.&ky.o*ąiŹSt{iaлn|Q7[غ7/}YކV:b=Vi]LlZjZ4/^LjbrmV7ߨŴjYi?Oΐgg2(Rwg nD9rLg2Lg2۹Gl2  ƀ9 2@}rFݴn/[i /[韼Ii#ob.-e-[0ŹַST{q3e5]\wy[WkV}evd/en/ )C~nZjZ4/]e,^LMK{~14/Ebzζ(<2gNFKS4X"GioMys]\\VSl+M1L̶:G1dD=8j'Gyy~dpH92;|Ci/^@^?yٓu\V?ŹUUEv1g0goMGbojR^L\SɋɥFtf.[o-G1ߏ?VAi0Gf~nzI/9?b~*_vKiQ.&er19-eVV'/{~nd-e-bZB^GYaǴ#{1շDh|Q7-Tɥ~1o]L5L5癦ɋɥsֳzߏ pH92;|*uK~hϩQP ^oMr1)ۗi/^@^?yٓ6>/=DžF幬FϷs\VZiu yeJGbo)/zL.7Ev1g0gZX?.s\.s\Z\LqZg5yj|Q7 OL~Ik~FϮ,  kc~x))[HYYH6{:`mbj ' cr/-l,8~c>1N[51N%VML~& b ?S3ƂDn"e9f5X[z(9TzTQr: +)Gޏm|Q7ᗊJU1? /Fݴ(}e+ e+=i|Q7mU*”d-e-ŴEv1]bj"1UخG|#ONҬ~ni۩.bEܒ1N~GmGy2 i֎o|Q7ńtvؚ.bv%cC_nQr:9l?ϔyh~nZ{ I6t.&%cC.Z )~1-/e.[bYuӐs1QwiՐbD/&ꩡzl7ꦡڋ/& \LW7.&+~Ĭ31~䳧m|x,OWqϿ?i)Gp /5ߨe+ e+=i|Q7mt{i!/[%b:oMM3Т=+g8fFݴn/[i /[韼Ii<Ϸa5ZjZh_i8j)/\b,8 ʠ~nZ{4O^FݴDhaБ,~|0\Z= )oM ~Y|˞4ߨ6&oq.˷Nlt{iaл./6ߨ>/[ޑ.[Rբ~YXbm,o~Sby=GAu->ϞU!4ߨe+ e+=i|Q7me M\V?\2";wKK-,h|Q7eٲ޳/eai]&~v1ni.ie 8[o|Q7-eVV'/{~nZ[ ,6ZlR y[[FbyQ[e7ߨp:3wlb4/<]*V6M^ߏ#Lvm6%:#lF(|`5[Fs4Tfx se_>=guӂ_߻ll'-5Q-ZXbkB^&;~o|Q7MZ[Le3s[ih~|w|п# o|Q7ᗊJU1? ;R6ߨe+ e+_Qr:9l(9Fbn~n[⦽⦏.▜y~,ڔx5Y~fW #ߏn)'9(fV)4XS ?G rvGaa;?F]g m9Ç&j1‚mdv?C S?Fu7dg,>0~"]X0?i40!X8|a~pb Gjp?FeBSh?R30~3#'cǨYÇD~Ĝ]~&Ǩdi>?i4"2|Oqax?bgήdv?C ?F0?yGᇏp+sCr[(Ç& ?F]K+2ЩC CrM64𑆗?`MGjpH90g#vl|:uSm9}a aO[)-L)v-#Fu#\~t9|aRXU1g#uC UX6m9}}#uC BUX}Q>p}>:IAUXO)G~t9|a8f ? R5L XGL0?;Mʣ0sv]:u~a ,:`(k69~ĨiC u c`st`mr˙Gyrؘ~nzI/9?b~*_vKiQ.&er19-eVV'/{~nZ0Ǵcz0ab°D ;&0anF`0g S L  UXI*BuIAUXIa0c7ꦍR幬bZbZS\-<~nZX?..u./&b/&ޑ=iaR֥&7,w{JyJeOoM Kp粚'.w{Yަ˖m!/c-eO:~YM~Tx(r l;!4ߨe+ e+=i|Q7-e-[OK-uB`Xt(vϣ%n|Q7-5luf: i_Ly4).V!Um,o1L̶:G1)jO~SS7ZheΘ)zjCXz?o,oMqi ~kRoMqi ~~cFd". `aϟ)8f9~nKX!I 5(kP4X{H ΐ\rxi/^@^?yٓpUG䃔?HSD M7ߨ.<0~nd=iaЂ_߻ll#^;"uE\@@1L̶:G1gyYOq?~Gѵ!ӓ4M^i1=o|Q7]L?B*B*B*B*B*B*B*B7ߨΝ ꜿd+~?~Os.Ҭ?f Jiaџ2!j?ޏՍ4⌠|LҬ FjpZa%qP;~ҬycOZ1as@9\9 Ɵ2bgHv&D#Fu#,:`.QX5Sf?R3Y;C b4⌠|LZrP;~ߣtsخGsخG9~lsU5Y;Fݴ߱aʏi$`Z1ńaQ&wL0L5a:a V!`& BUX7 9V!`B0mu\LP;]ń`Eܒ1ϡߏx?bK4pK!cOZ1)5R3Y;C #Fu#)8#h-S4kgªFXIg`i;G1pK!ڙ0f Jia05Xj)S-Fjp4kgaBtx?bT7¢(UÏ?ebFjp4kgaBT~Ĩ<)8#h-S&i;G_NDž)[iynay=ϴS\-,zӺzw+.LoM}1euv1峥&Eg~Ybzۋɢi򲼍73sV e01~ !,4kǿ1pע2q~B<-q00]~FݴSj1=c$1ũǔV!`*LoMyqabd-lŅoq=B*.VEv1~fOs#/y< 1ayrz?69 ?؁Q-4k7ߨb;6L10= 8&0,j1Q &Lg[|Q7 LB*B`V!`R F`RPbV!`RX *LJLۡvFt9v.bBt0m"ns~Ĭ31~,O5uߏx?brH5?HyYf9pS̥>͝)â1Ne4|,=ɝ9D/͸Ng)GnK4%:#h-_h1Ll)6v/-'wh?$?ucFY9 Q<=v:M9pS7oM ~Y|˞4W=Cx즘T!<)&;6S=~{Fݴg˶[ֳ|[37.[R K,wqYMֳoM}zݑl=:lꖚ Dԛ&/[j>1Zvv~nޏظf_Ggы+81rm6`GLfa8dGLtL ]/rbN#:DA2L 2M : 2N 2X 2\ !]~ <K+ >2X 1 !\6 6#Y!] ~?#e!e:] >2M 2L \ | 2M  \2L \ͥ:X ;ͥ bh |7 72M  hN2L hͥh >2W !\6#6?#p-,ZjZ)E£y7ߨe+ e+=i|Q7-e-iŹ򶐗h]L5<oM"^L-5Q-Zʋi_LV7Y&/W(Nr rQ<ԍuӢ\LOڗ)^KE{N%?yk|Q7-eVV'/{~n[ŅF幬~L+-Ŕ"jv3y%C]\Lq.o>vd/bZ:q5ߨ˖u.[jHyٲʆ-heںl٭j/[˖o|Q7-5Q-S.Mbߍ7ꦵ|Öu0Ŋ)Pe+Lb7(ٲJLb7,ز Lb7c|di >r̾4<: 0RΚ}?b Ph#eP=ւe1NGbxaA2ޏx*GU9@vڪm "ڪPVEjrAjr`QmULvڪmq"nSmWd_L*1Uخ~P]čydqcy :W =2W bz! "Y \ͥ1 >2] ! ~:T:\ ñͥ*   :\ 9# .ʥ^ʱ@G`id `*T {T~#ʜ ʏ {#~:q{:L ʸ_>2L :M _ >2M a{__ ~#\*Y :N XT*Y ~#I3 S6#I"Y  ~ z {|#a##:V =2V ~w:] <2] :\ ʨM.ʥ^ʱLS"Q *O >2]  Ë+~:] ==2] > > >2V >2] ! >A2S ~:P :S <2S >.> a("T "O !"Q ~w >2] a~ʓ:ʓ i#ͅi:V G|‰~w:V =2V —:] <2] :\ M.ʥ^ʱLS *O >2] i äi*O *Q z{2] #~+::\ :## !] :\ <2\ 8 ]o>.oK~#.ʚ!ښ"terminal" is the name of the TRM File (terminal.TRM, like H19.TRM). Please refer to the TRM File "TERMCODE.TRM" for more information. ult Information (^C=Abort) -- $:The TERMCAP Subsystem for Online Documentation This is TERMCAP, the Online Documentation Subsystem. The purpose of TERMCAP is to allow the user to interactively query the *.TRM files of the system in order to receive information on various aspects of certain terminals in use. When the user types 'TERMCAP', a search is done for the file 'TERMMENU.TRM'. If found, its contents are to the user; if not found, this message is displayed. If the user desires information on a specific terminal and he has a TRM File of that name (ie, H19.TRM is a TRM File on the H19), he may issue of TERMCAP Command of the form -- TERMCAP d:terminal where "d:" is the disk the TRM File resides on (optional) and o~#.!. O> ›y:\ >:\ ^ =2\ 8 ~ ##>.~#] K^ o&]T))):\ 6 :\ E :] E 2[ dZ Z0d \G:[ zy2[ z> }y0xTERMCAP Version 1.0 $ TERMCAP File Selections are -- $TERMMENUTRMEOI ^C=CP/M $^=Level .=Root $M=Menu S=Start L=Last CR=Next $ TERMCAP FATAL ERROR -- File Name Contains Wild Card$ TERMCAP FATAL ERROR -- File not Found$ TERMCAP ERROR -- Invalid Response $ TERMCAP ERROR -- EOF on TRM File $ TERMCAP ERROR -- Not Possible to Backup Before Start of Info $ TERMCAP ERROR -- Node Level Limit Reached -- Aborting $ TERMCAP ERROR -- Invalid File Name in Load $ TERMCAP ERROR -- No Higher Level to Return to $ TERMCAP ERROR -- Not Enough Room for TRM File $ TERMCAP ERROR -- TRM File NOT Terminated by ^Z $Level $/ $: $Type ^C=CP/M$ ^=Level .=Root$ or Enter Selection $ Loading TRM File $le Name in Load $ TERMCAP ERROR -- No Higher Level to Return to $ TERMCAP ERROR -- Not Enough Room for TRM File $ TERMCAP ERROR -- TRM File NOT Terminated by ^Z $Level $/ $: $Type ^C=CP/M$ ^=Level .= Default TERMCAP Facility Invoked Names of Available TRM Files are -- $ Type Any Char for Default Information (^C=Abort) -- $:The TERMCAP Subsystem for Online Documentation This is TERMCAP, the Online Documentation Subsystem. The purpose of TERMCAP is to allow the user to interactively query the *.TRM files of the system in order to receive information on various aspects of certain terminals in use. When the user types 'TERMCAP', a search is done for the file 'TERMMENU.TRM'. If found, its contents are to the user; if not found, this message is displayed. If the user desires information on a specific terminal and he has a TRM File of that name (ie, H19.TRM is a TRM File on the H19), he may issue of TERMCAP Command of the form -- TERMCAP d:terminal where "d:" is the disk the TRM File resides on (optional) and  vATERMINAL.DATT  !"#$%&'()*+,-./012345o6789:;<=>?@ABCDEFGHIJKLMNOPQRS;܎g 5\Xr;^J0혘s [Zc3jap55&ђpLLL9n_Ҋ8:&ђPD猚P8rtx}}|ǿnҊ8:&ђPD猚P8rtx}}|ǿmҊ8:&ђPD猚P8rtln52ID猚pX(9t :tI$ g~31ζhI-15P8rthI8&݁I-15P8rthI8&~o/ &9&55&PL%P_a8c eb$™LL~0I8Q rtukpL+&ђpLIrpLLR~t$ I Ew$a|!LV G&Q x}m$ŖVhLsFM8,$Z ŎIjaaZP,w#^6LRli$:gԄBȡkСkL%PD&Q łi~\}>駗m$ŖVD猚pX(9t :tI$bpn}˧&)G$:gԄBȡkСkL%P옘VgggLRli$:gԄBq$},7$Z0IWI#Sbs t$j5PIjBiuvXޮ;޾yn50ID猚pX(9t :tI$ g~31t+&)$:gԄcZ t0I_O&ђpLIrpL_d>1=0Z X(^1Z-PLҏpX(0IpX(8l[Zc3jap55&ђpLLL;7׏L;)GǴ3ja:t 9ti'}i'Z ſvUBL;OpX(VL;/b´2_%=F =`vrfb-NάhJ8,{vҏpX(. Njax´ZPbbZ]$ŖVq`3jBG G&aأg-) =,{BNJixژҊ8L׭B3 x/aP&)v I8,+&98,7ȡkСkLҏ`RĴ\6&)"$:gb :c:L׭BG$ZR=zX(x$BapLVC=0Z-PI/aIrPL2ac߭ 1$:g‘CנCט`bK+uk{PL%qc*LVw/'LV ^8,$ǫ~aP&OaX159t :tI(a(L2^Bqb3+e48,[&9*Pe~"w&)U&as`bK+p[ g-${P1IW TERMNL AQMTERMNL DOCTERMNL2 AQM2TERMNL2 DQCL vTERMNL.ASMZ  !"#$%&'()*+,-./o0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYY+[LAqfV έZE\:SlT8)(L*zOp5ppV$}B+Zx\kp:Ak>_%:kf&J'8Fkl<}EsŢ5!HHʚ8#y·Cum4ju(ę8oWv@P,(J*`Mʢ83RYp&jezfnB4٩鿈3q&Y33QB85ZKg Fw;T늉8bRT*auQ[(1g$(!⻠NP|uޣx%p5W77 |z8qlO3qoO_l ƳWę8cOw?ٽxBL2pBb3j rt#LR*LL?֏n߬q6O7&)Gc3jq-t ukpcJ&ђpcIrpL'&Opc*LҏpcIJ ՀW&QsL5o׷Ϙ ItΨ 9a6L׭q)DKqg&_1d>q0I?q&)sL7LVsL_D81U&5okÚI-a3jBȡkСkLL{ I!9ͱ͗1|*g#"g !9ͱ!9ͱ#Ͷ+͗? } !9ͱ͗ b´2_%=F =`vrfb-NάhJ8,{vҏpX(. Njax´ZPbbZ]$ŖVq`3jBG G&aأg-) =,{BNJixژҊ8L׭B3 x/aP&)v I8,+&98,7ȡkСkLҏ`RĴ\6&)"$:gb :c:L׭BG$ZR=zX(x$BapLVC=0Z-PI/aIrPL2ac߭ 1$:g‘CנCט`bK+uk{PL%qc*LVw/'LV ^8,$ǫ~aP&OaX159t :tI(a(L2^Bqb3+e48,[&9*Pe~"w&)U&as`bK+p[ g-${P1IW ~ODf?fO?_/q/݋'%./w=ٝxf>`KL8[Y_+΍5qIi1_glThj buDǷyfOuMq7 p "|}3q&OoO!uSr]Z{<e ^%\:-ѵ#.#8u-^g|AWwU5eߢ5NFSjARGzhנĂa Af#$m^zūǫ_> glY8o?,t~Im== gLtū/pG#-}zpwݟ^}zAǏۻ/ŋ~W~yẃn/n>|xA_*/ݾ (S6]{ۚQڻx)sS͐Gt>h$< /GL#ѽpt{"#?5Y8wptjY8 gbׄͲS*73aY{x]KLX̸S8 gaG:zC5Qiԙ@# @FaJ%" [yas"L[yayꑅsRVzX7v~gZߔz Nz,4FGd:=}yCD7CkaDQtzSoXq4jMKˆJ6emq*|B7JX뎮y|ЛR؆UK6VȮDF#5sMI+ZC*K_Zߔ4h,ʫR&*aȮDa4EʯzP榄%hd-Xә()aDDQ 0BxZzd&HW^=ƹouV&=M4`0\^oMKeVuVzA FuI4$#33'E&$q#ע{sk*!];bI`-u @[wpt sk"NA"~&a-mS?u}! $ǎA4'ƎuDP%to#Ql]%b$]@CHki#1B-Z'r! ZtAqTLB#l]%*&{P%J6Ql]%b?7v @sk$qƢ'zZG eedZG ^ <1Xҽ];'*ΞCYY#AbJMARK AALDERING 12301 LUNA PL. GRANADA HILLS, CA 91344 TERMNL.AS͠ IӠ AΠ ASSEMBL٠ LANGUAG PROGRA͠ THAԠ ALLOWӠ TH OSBORNŠ TϠ EMULAT STANDARĠ ASCIɠ TERMINAL ORIGINALL CREATEĠ TϠ ALLO M OSBORN T AC A TH TERMINA FOҠ STEV CIARCIA'Ӡ 'Z BASI CONTROLLER (BYT AUG'81 NO SOLĠ B٠ TH MICROMINT THI PROGRA SHOULD HOWEVER B O INTERES T AL OSBORNŠ USER THA OCASSSIONALL REQUIR STANDARĠ TERMINAL TH BAU RAT I A SE B TH UTILIT PROGRA "SETUP" ANĠ TH PROGRA I SE FO FUL DUPLEX N PARITY WHE ASSEMBLED TH .CO FIL TAKE U 16K DU T TH COL֤cYzdaDj}Sʵ0]ouV =*"H7{\щ<2+ ٹ5֯Dz°mdz05FWpIctzA&I\gEmMLz-P=Gy꬐Z{ZUȷ:+aGGt37e,M8ۚlo>\nuG, 4jSY]Y Y:y,YQiԦ,0\ҨMwdate4ha,=0ҨMwda$ pIÆU YQ-0]%Vg,\o.iԦ,7e,YY-Ч? #Te鑅q:+da4,=p-zC" # YЯ,  Ym1! αDŽ,`,nsR¨bBK),8{,YQiԦ,0mZf, 4jSYz,K,mˆDz鑅Fmʾ [yaYQiԦ,0]E-Bn[uDòˆJBS ZߔTfUgE7CN.[%GF5IUzmȕ/MQi 2*[ya9&F02=2K0m0vS*N?KY #Teu{恒hk㼃5:!BdN*-*0BX_Y_ZG&z0ZێR0BXK!k+^ L{*NdM4Et;hDՖ՝0B<_Y_ZjtA!=H3AQ3פ|ӎBi_V+_0v*iU^hȷ:+&D WHIC MUS RESID 4000 S THA BANK MEMORY CAN BE ACCESSED FOR SERIAL I/O. ENJOY, MARK AALDERINGv?TERMNL2.ASMh  !"#$%&'()*+,o-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgYnvZҨڲk2bIJm69yriѫ'zhs"!i[hz <+zj&5׿yb7][iӳpΝ/3zHkm-7ˆܯ^P(׷7n>P㋁#bY8 ӛ9H2[H ?p7s4*z UmsQ)c̪F8wKW4ꗿzp?/T2:+ҍtITmY[ݑ*z#{~c>ݴ{p7s4E*dM(mRviGt| 2IzlK%k+^ CUkL&=箒*ToXRevFzlteGW&yl `"y*Bm)kLFTN%*y|"Uh2MSTf%sWqm2ѴDeVڑVZK1: ^;C2:+^ ck=M,4Fda ktB^Rщ^;ߊpp6Kte3h5uo}ّ5aѭ [y9LDaiLVa0vS*QA;iF'aG:Y# FaJ% #h0$n塇e{aD1:> ^TL¨" \)]YA08`Z ÷-0\[$avN ÷-za$sWsTaC #*M^q*|FktzaXat+=,Ͻ0Ҙq4V# ^A;)( 4y}wFa;( [.%[.n˸ 4 #hmwn X^]Y0\Ҙq4ݳ0vvGaXޒu-Yޒu0tXƥFWVpK<ƾQA;h0tX^j8ate7halUQأ5Jx%=%ѭ<ˆJc۩0vkF^Qil;Fv+#^օd]xKօd]x+v0v*i%zeѕA0vvˆJc۩0vkFWVЃu-Yޒu-Y #hvˆJJZ #h簻^ate=8aƶSI+av+#n塇FTN%s][0?ˆJc۩0vkK0 oɺ oɺVA;h;aDTJA;ݵ%S\ /TTl3t>۰JZ!El&dԵ1&^nis o;BM&P7GET!h۷Yze.s^^.ic98pm2pIc۩0tt|yFTp˦Nsuf{ 4zYzalzawHsuf+ 4zˆJÆUJA;klq*UFK!^{zaq C7e #0\҄^60Ұa6-KB5&sW 6p^KWKN%Q/K/5jM·:+xU/)y kBOФ#u+AeVeѭ?@ABCDEFG SHIJKLMNOPQRSTUVWXYZ[\]^oN6V2 _`abcdefgh]YOijklG?>0-G`2tƵOFʃ\.mFɍ ^ti'pQ JA;h;aDTJA;ݵ[yaI0v*i%zeQcFc$:)C #* VI+aI.iذJZ #Tƹ`F-0jH¨b0Q»k땹DcIu=0{9^aR $Z*&aX.2 #T s/ kvqxcѽ0l'8{,{aXktA]m=Й?Rt3s3AȖYf韄ѭ< aaJ% [ya##LDakawJ #Tc<y&aGqޡ P={ZJټy0BxG_ CU0Bx#_ CUka#qޡ^·:+%FTN%q*肂pU%^Qil;ƹ Jpn塇FTN%q*肂pUCKƶSI+a)2Vz,0҄mV8wStA W5^[ya #*mV8wStA WDFTN%q*a.(Kt+=lB/4JZ Ou HCgb\'n_#h0ѭ<°FaJ% #TM_ CU(P==Z8wY WpIc۩0xˆJc۩0]EU(\tKN%QFTTJpz31? [y9LDazm2Y8 g,?pY8 w&҄þĩfhC7tʗFՖ~vpFa } t?\pG~C&K~}/yq{񁾿zu_a?;QižNo:ǻtn^Nj{o~y?;QižNo(:ů^_^W7C&^xQe~{rxdmc\] *j%m+2kgVKx**:aMY 1=TaIHN6<`46`iP"W&e;pDCl, f74`/.ϚTab [!ܲ*7RV=m{wk\sV[~>1hE)` G { ^J44 "Ԣk29=Y1ޠT8KJb>sT tL*?Ɛ1VK(6xOcI {v>Tr kVVЁW+̤C Rܜ%2 s R*?D`7 4'nmKsR|)/.}f74(rSl  H+އ DZ4ْO v=vC]N!qџcЧ'S ъ5+N je-w tHu:WnVi`@j3ʣ|e]Ёp.EQ9[L=~+P nm `G̜؀c44ysJ:ЁWRc`:$8k *D`H)څNZoLR }yI 8ƪ: *Gjm0^ZIxz}h}2!V)FKQ 4)@MO j%bmp\+A*?EK4а(k2'?;; Fynpt R9̬`Q~'^afufG$$ZIxv1.6 CRݴ%՚{mPlA9++U8 ǃBjmelA>߼xm 2Ӥ( @C iR5 ˎw7׷C&;q韻#}ի{zn w&iBpFa_ݯ8 |tKwrz{z8qv/ܙ/&gۛ]4px1П^`7n w&%҄|狟n/]ӛa۽pgb\x4!8w_}xׇW! i^#=g/?xE#b?;qp0҄DHi:wT>|zs{u)W!&=#}ޑӋWTon?;P<}O_!&=#}Qwx^C7 #MzGzё{zux8Qi~Gz'/m(WHkzGzޑӋWTon?;P<}O_!&{zGzQwx^Coq%҄~7 /~}{8Qi^#=f8. M78Qi~GzBͯ>`7n w&K m=pqիt{WWOoCoY8 g,?pY8 N7HZߔTfUgEZxtz}DX6Ȼ>oȖYfhtz-{JZ!E,EU^r%hKq4)bٷ:+rq4V6e"#r)ciXr%^8 g,_QSІӏ u0X 2+LO?Y8 ga,}P4 ؠ1|[Qn f7{q S BԬ26ԕ-9ZdP?–JJ)JZLp忡Q+ vlCBK) nvO<<;;{gCBSY1RUmA39T]萰~۠ʻ{OjmpH@Tl}tNs`PTܺ;!x0CHYuɠglC2;5 AilVi2huݞAuw [hXo0ʣoOn!.ace5X"jvCIֱ36tSF)F<ʸ͡C/F;bu SRu޾Ic۩ #TEX C TEXUMAN TEX$b8>INSTALL GDE"#TEX COMMBASIC TEXI "?HACKERS TEXVKMACRO TEXWMSCRIBE TEX1"OPT12 FON BASIC TEX7?SCRIBE TEX0 ySBASIC TEX=*MATH1 FONE;$xMATH2 FON7SCRIBE+ TEX5z-CAT/TEX TXT oCEDIT CRL$QCEDIT COM>CEDIT C Z=MASTER CHR9/* * small tex - (tau epsilon chi; pronounced `tech') A stripped down * version of Knuths TEX for micros. This uses the Fancy Font/Epson * system as an output device. * * copyright (c) 1982, Mike Meyer * * This code and all documentation thatvTESTCOND.C= o! "$%#(&'+)*,-.1/23045768:;<97:ZLo4&*`jl46})PS,tJ󴲽ÈiP4ء 0~ Jط5~)zOie;ڙ3MyVҔڸ4Z^oŢ!)5`\gxl7АҔ4??Ӕke{<^ƾȤpgxl7S!)ې?i㵲CJSw/c4Z^o@JSw/ck4Z^oѐҔwz3[gxl7 e;S揟il7"! e싼7~s淲N )zwHi̙Ι:9sul+NDelete File͹YFdg:!O= (#"Y G!~(p p2 accompanies it may be freely * distributed by anyone who has a copy, under the following provisions: * * 1) My copyright notices stay where they are. * 2) The source is distributed with the package. * 3) Fixes and improvements eventually come back to me. * * Note that this does not disallow you from selling copies of this program * to other people, so long as my copyright notices, etc stay with it. I * don't care if you make money of my work - I just want credit for having * done it. * * /* * DEBUG - until such a time as I can make the #)(%&*#% thing justify * with my margins, the code to let users play with the right margin * is turned off. This hardwired to RIGHTDEFAULT. */ #define RIGHT FALSE /* * TRACEPOINTS - turns on some printfs to trace the margins/breakpoints. */ #define TRACEPOINTS FALSE /* Some characters that are magic to tex */ #define SP ACE ' ' #define NL '\012' #define CR '\015' #define TAB '\t' #define OPEN '{' #define CLOSE '}' #define COMMAND '\\' #define MATHMODE '$' #define COMMENT '%' #define PARAMETER '#' #define FONTCHAR ':' /* the names of some strings we print every once and a while (ff commands) */ #define ENDLINE "\n" #define JUSTON "\\j" #define JUSTOFF "\\k" #define CENTER "\\c" #define LEFTIFY "\\b" #define RIGHTIFY "\\r" #define UNDERLINE "\\u" #define ONMATH "" #define OFFMATH "" #define ONDISPLAY "\\b\n\n\\c" #define OFFDISPLAY "\n\n" #define PARAGRAPH "\\b\n\n" #define PAGE "\\b\n\\p" /* And some formats for ff commands for us to use */ #define FORMLINE "\\a%04d" #define FORMCHAR "\\d%03d" #define FORMHORIZ "\\i%03d" #define FORMVERT "\\b\n\\v%04d" #define FORMFONT "\\f%d" /* and now some magic constants */ #define LEFTDEFAULT 0 #define RIGHTDEFAULT 900 #define INDENTDEFAULT 0 #define DEFAULTCHARLEN 12 #define FILENAMELEN 15 #define COMLENGTH 10 #define NUMFONTS"Copyright (c) 1982, Mike Meyer\n\n") ; if (argc > 2 || argc < 2) error("usage: tex \n", NULL, 1) ; for (p = argv[1]; *p && *p != '.'; p++) ; sprintf(filename, *p ? "%s" : "%s.tex", argv[1]) ; if (strlen(filename) >= FILENAMELEN) error("tex: Invalid file name: %s\n", argv[1], 1) ; if (fopen(filename, infile) == ERROR) error("tex: Can't open file: %s\n", filename, 1) ; *p = NULL ; /* the output filename WILL be *.ff */ sprintf(filename, "%s.ff", argv[1]) ; if (fcreat(filename, outfile) == ERROR) error("tex: Can't create file: %s\n", filename, 1) ; /* initialize the globals... */ init() ; inchar = readch(infile) ; if (processtext(readch, infile) != EOF) printf("tex: Missing right brace in file: %s.TEX\n", argv[1]) ; if (mathmode) puts("tex: Document completed in math mode\n") ; /* cleanup the last pieces of text, and close everything */ fputs(inbuffer, outfile) ; fputs(PARAGRAPH, outfile) ; putc(CPMEOF, outfile) ; fflush(outfile) ; fclose 10 #define NUMDEFS 200 #define ASCIICHARS 128 #define INBUF 1024 /* and a (the?) magic file name... */ #define FFIFILE "tex.ffi" /* and a few macros */ #define strequal(x,y) (!strcmp(x, y)) /* and a few global variables */ char mathmode, displaymode ; /* a pair of mathmode flags */ char fillmode ; /* are we doing word filling? */ char FFflag ; /* Fancy Font commands valid? */ char mathfont, textfont ; /* the math and text mode fonts */ char *endpointer, inbuffer[INBUF] ;/* input buffer & pointer into it */ int inchar ; /* the next char to be processed */ int rightmargin, leftmargin ; /* current margin settings */ int indent ; /* indent for paragraphs */ int currentpoint, lastbreakpoint ; /* last word break & current char */ char outfile[BUFSIZ] ; /* output file pointer */ int nextdef ; /* the next free defdata structure */ int cfont ; /* the current font number */ char passtoff[INBUF] ; /* user commands to fancy fonts */ char fontnames[NUMFONTS][FILENAMELEN] ;(outfile) ; puts("tex: Run complete\n") ; unlink(FFIFILE) ; if (fcreat(FFIFILE, outfile) == ERROR) error("tex: Can't create temp file: %s\n", FFIFILE, 1) ; /* Possibly not portable, but... */ if (fprintf(outfile, "%s\n", passtoff) == ERROR || fprintf(outfile, "+FO %s %s %s %s %s %s %s %s %s %s ,", fontnames[0], fontnames[1], fontnames[2], fontnames[3], fontnames[4], fontnames[5], fontnames[6], fontnames[7], fontnames[8], fontnames[9]) == ERROR) error("tex: Write error on file: %s\n", FFIFILE,1) ; putc(CPMEOF, outfile) ; fflush(outfile) ; fclose(outfile) ; execl("pfont", filename, "<", FFIFILE, 0) ; puts("tex: Can't execute pfont\n") ; return ERROR ; } /* * init - make the global variables have reasonable values */ init() { int i, j ; puts("tex: Initializing ... ") ; fputs(JUSTON, outfile) ; /* justification defaults on */ _allocp = NULL ; fillmode = TRUE ; FFflag = displaymode = mathmode = FALSE ; textfont = mathfont = nextdef = cfont = 0 /* the names of the font files used */ struct chardata { char f_width ; /* how much space it takes */ char f_leftmargin ; /* how much left margin it has */ char f_inkwidth ; /* the width of ink in the character */ char f_inkheight ; /* how high the ink is */ char f_inkbottom ; /* how low the ink goes */ } fontdata[NUMFONTS][ASCIICHARS] ; struct defdata { char d_defname[COMLENGTH] ;/* the define name */ char *d_parameter ; /* does it have a parameter */ char *d_altparm ; /* a pointer into parameter */ char *d_replace ; /* the replacement string */ char *d_nextchar ; /* a pointer into it */ } defines[NUMDEFS] ; /* and a few non-int global functions */ char width() ; int readch(), defch(), stringch() ; /* these are a few (crock, a LOT) of my favorite (?) things */ main(argc, argv) char **argv; { char *p, filename[FILENAMELEN], infile[BUFSIZ] ; printf("tex version %d%c - %s\n", VERSION, RELEASE, DATE) ; puts("For use with pfont version 1\n") ; puts(  ; *passtoff = *(endpointer = inbuffer) = NULL ; currentpoint = lastbreakpoint = leftmargin = LEFTDEFAULT ; rightmargin = RIGHTDEFAULT ; indent = INDENTDEFAULT ; for (i = 0; i < NUMFONTS; i++) { *(fontnames[i]) = 0 ; for (j = 0; j < ASCIICHARS; j++) fontdata[i][j] . f_width = fontdata[i][j] . f_leftmargin = fontdata[i][j] . f_inkwidth = fontdata[i][j] . f_inkheight = fontdata[i][j] . f_inkbottom = DEFAULTCHARLEN ; } puts("done\n") ; } /* * processtext - do the actuall text formatting. This routine consists * of a driver loop that reads characters with the following entry * invariants: * 1) currentpoint < rightmargin * 2) inchar has the NEXT character to be processed * 4) endpointer points to next empty slot in inbuffer */ processtext(nextchar, arg) int (*nextchar)(); { char myfont, myfill ; int myleft, myright, myindent ; for (;; *endpointer = NULL) { if (endpointer - inbuffer > INBUF) /* unlikely, but... */ error("tex: Out of buCEPOINTS puts("currentpoint reset to margin+indent\n") ; #endif return skipwhite(nextchar, arg) ; } } else if ((inchar = (*nextchar)(arg)) == EOF) break ; if (inchar == COMMENT && skipto(NL, nextchar, arg) == EOF) break ; } while (inchar == SPACE || inchar == TAB || inchar == NL) ; if ((currentpoint += width(SPACE)) < rightmargin) { lastbreakpoint = currentpoint ; *endpointer++ = SPACE ; } else { currentpoint = lastbreakpoint = leftmargin ; #if TRACEPOINTS puts("currentpoint reset to margin\n") ; #endif fputs(ENDLINE, outfile) ; fprintf(outfile, FORMLINE, leftmargin) ; } return inchar ; } /* * domath - change the magic math modes around. All this does is * toggles the mathmode/displaymode flags, and outputs the * things to make it change modes. Assumes that the first $ * has been read, but not the (possible) second. Leaves inchar * correct for next loop. * * The decision table for this toy is as follows: * * Mathmodeffer space\n", NULL, 1) ; #if TRACEPOINTS printf("Char %c, current %d, lastbreak %d, width %d\n", inchar, currentpoint, lastbreakpoint, width(inchar)) ; #endif if (!fillmode && inchar == NL) { inchar = SPACE ; /* will be tossed */ makenewline(ERROR) ; inchar = (*nextchar)(arg) ; } else if (inchar == SPACE || inchar == TAB || inchar == NL) if (!mathmode) dowhite(nextchar, arg) ; else inchar = (*nextchar)(arg) ; else if (inchar == COMMAND) docommand(nextchar, arg) ; else if (inchar == MATHMODE) domath(nextchar, arg) ; else if (inchar == COMMENT) skipto(NL, nextchar, arg) ; else if (inchar == OPEN) { /* stack the environment */ myfill = fillmode ; myfont = cfont ; myleft = leftmargin ; myright = rightmargin ; myindent = indent ; /* jump down a level */ inchar = (*nextchar)(arg) ; processtext(nextchar, arg) ; /* now unstack the environment */ setfill(myfill) ; changetofont(myfont) ; leftmargin = myleft * * TRUE FALSE * TRUE User Error Internal Error inchar != $ * FALSE MM=F MM=T * Displaymode * TRUE MM=DM=F Internal Error inchar == $ * FALSE User Error MM=DM=T * * N.B. - this code should probably be rewritten as an else-if chain, * as it isn't used very often; We could afford the loss in speed for * the gain in size. Hence this is a good place to trim. */ domath(nextchar, arg) int (*nextchar)(); { inchar = (*nextchar)(arg) ; fputs(inbuffer, outfile) ; endpointer = inbuffer ; switch ((mathmode ? 1 : 0) + (displaymode ? 2 : 0) + (inchar == MATHMODE ? 4 : 0)) { case 0: /* !mathmode, !displaymode, inchar != $ */ mathmode = TRUE ; fputs(ONMATH, outfile) ; textfont = cfont ; changetofont(mathfont) ; return inchar ; case 1: /* mathmode, !displaymode, inchar != $ */ mathmode = FALSE ; fputs(OFFMATH, outfile) ; changetofont(textfont) ; return inchar ; case 2: /* !mathmode, displaymode, inchar != $ */ cas ; rightmargin = myright ; indent = myindent ; } else if (inchar == CLOSE) return inchar = (*nextchar)(arg) ; else if (inchar == EOF) return EOF ; else if ((currentpoint += width(inchar)) < rightmargin) { *endpointer++ = inchar ; inchar = (*nextchar)(arg) ; } else { if (lastbreakpoint == leftmargin) makenewline(ERROR) ; else makenewline(currentpoint - lastbreakpoint) ; inchar = (*nextchar)(arg) ; } } return OK ; } /* * dowhite - handle the word break code... */ dowhite(nextchar, arg) int (*nextchar)(arg); { fputs(inbuffer, outfile) ; /* flush the current word */ endpointer = inbuffer ; do { /* eat spaces */ if (inchar == NL) { /* test for paragraph break */ if ((inchar = (*nextchar)(arg)) == EOF) break ; if (inchar == NL) { /* DO a paragraph break */ fputs(PARAGRAPH, outfile) ; fprintf(outfile, FORMLINE, indent + leftmargin) ; currentpoint = lastbreakpoint = leftmargin + indent ; #if TRA e 6: /* !mathmode, displaymode, inchar == $ */ error("tex: Internal error in mathmode: inchar = %c\n", inchar, 1) ; case 3: /* mathmode, displaymode, inchar != $ */ puts("tex: Leaving display mode with `$'\n") ; mathmode = displaymode = FALSE ; changetofont(textfont) ; fputs(OFFDISPLAY, outfile) ; fprintf(outfile, FORMLINE, leftmargin) ; lastbreakpoint = currentpoint = leftmargin ; return skipwhite(nextchar, arg) ; case 4: /* !mathmode, !displaymode, inchar == $ */ mathmode = displaymode = TRUE ; fputs(ONDISPLAY, outfile) ; textfont = cfont ; changetofont(mathfont) ; lastbreakpoint = currentpoint = leftmargin ; return inchar = (*nextchar)(arg) ; case 5: /* mathmode, !displaymode, inchar == $ */ puts("tex: Leaving math mode with `$$'\n") ; mathmode = displaymode = FALSE ; fputs(OFFMATH, outfile) ; changetofon(textfont) ; return inchar = (*nextchar)(arg) ; case 7: /* mathmode, displaymode, inchar == $ */ mat ; if (strequal(command, "vskip")) return dovert(nextchar, arg) ; if (strequal(command, "hskip")) return dohoriz(nextchar, arg) ; if (strequal(command, "par")) return dopar(nextchar, arg) ; if (strequal(command, "indent")) return setindent(nextchar, arg) ; if (strequal(command, "lftmarg")) return setleft(nextchar, arg) ; #if RIGHT if (strequal(command, "rtmarg")) return setright(nextchar, arg) ; #endif if (strequal(command, "input")) return doinput(nextchar, arg) ; if (strequal(command, "math")) return setmath(nextchar, arg) ; if (strequal(command, "ff")) return doff(nextchar, arg) ; if (lookup(command, nextchar, arg)) return inchar ; printf("tex: Illegal command: \\%s\n", command) ; return inchar ; } /* * dofont - take care of font changes/load. Assumes that the font char hasn't * been gotten, but that the ':' in the font command has. Will return * EOF/not EOF */ dofont(nextchar, arg) int (*nextchar)(); { char newfont ; if (inchar != FONTCHAR) { printf("tex: Illhmode = displaymode = FALSE ; changetofont(textfont) ; fputs(OFFDISPLAY, outfile) ; fprintf(outfile, FORMLINE, leftmargin) ; lastbreakpoint = currentpoint = leftmargin ; inchar = (*nextchar)(arg) ; return skipwhite(nextchar, arg) ; default: /* I can't get here from there! */ error("tex: Domath compiler error!\n", NULL, 1) ; } } /* * docommand - take care of command strings in the text of the * program. This is generally handled by dumping magic * straight to outfile, or invoking processtext (recursively) * on some other intput stream. Note that this assumes that inchar * has the COMMAND char in it, and that it leaves inchar updated... */ docommand(nextchar, arg) int (*nextchar)(); { char *compointer, command[COMLENGTH] ; if ((inchar = (*nextchar)(arg)) == EOF) return EOF ; *(compointer = command) = inchar ; if (!isalpha(inchar)) { command[1] = NULL ; inchar = (*nextchar)(arg) ; } else { /* * inchar HAS to be in this loop, to pregal font command: \\f%c\n", inchar) ; return inchar = (*nextchar)(arg) ; } inchar = (*nextchar)(arg) ; if (inchar < '0' || inchar > '9') { printf("tex: Illegal font character: %c\n", newfont) ; if ((inchar = (*nextchar)(arg)) == EOF) return EOF ; if (inchar != '=') return inchar ; /* eat up the file name... */ if ((inchar = (*nextchar)(arg)) == EOF) return EOF ; if (skipwhite(nextchar, arg) == EOF || skiptowhite(nextchar, arg) == EOF) return EOF ; return skipwhite(nextchar, arg) ; } newfont = inchar - '0' ; if ((inchar = (*nextchar)(arg)) == '=') return loadfont(nextchar, arg, newfont) ; changetofont(newfont) ; return skipwhite(nextchar, arg) ; } /* * loadfont - load a font data file into memory. This thing opens the * data file from Softcraft, load the right font file, and then goes * on it's merry way. Note that it doesn't [I repeat - DOES NOT!] * reinitialize the font tables, so loading a second font on top * of a used font character can prodevent EOF's from * getting clipped to DEL's... */ while (isalpha(*++compointer = inchar = (*nextchar)(arg))) if (compointer - command >= COMLENGTH - 1) { *compointer = NULL ; printf("tex: Command too long: %s\n", command); return skiptowhite(nextchar, arg) ; } *compointer = NULL ; texcase(command) ; } skipwhite(nextchar, arg) ; if (strequal(command, "f")) return dofont(nextchar, arg) ; if (strequal(command, "char")) return dochar(nextchar, arg) ; if (strequal(command, "mathonly")) return checkmath(nextchar, arg) ; if (strequal(command, "def")) return dodef(nextchar, arg) ; if (strequal(command, "eject")) return doeject(nextchar, arg) ; if (strequal(command, "ctr")) return docenter(nextchar, arg) ; if (strequal(command, "rt")) return doright(nextchar, arg) ; if (strequal(command, "lft")) return doleft(nextchar, arg) ; if (strequal(command, "underline")) return dounder(nextchar, arg) ; if (strequal(command, "fill")) return dofill(nextchar, arg) uce unpredictable results. * This does leave inchar pointed at the next character, and returns * EOF/OK. */ loadfont(nextchar, arg, newfont) int (*nextchar)(); { char i, c, fontfile[BUFSIZ], filename[FILENAMELEN] ; struct chardata *pointer ; if ((inchar = (*nextchar)(arg)) == EOF) return EOF ; getfilename(filename, nextchar, arg) ; strcpy(fontnames[newfont], filename) ; strcat(filename, ".fon") ; if (fopen(filename, fontfile) == ERROR) { printf("tex: Can't open font file: %s\n", filename) ; return OK ; } printf("tex: Loading font file %s ... ", filename) ; for (i = 0; i++ < 42;) getc(fontfile) ; /* chew up header */ while (c = getc(fontfile)) ; /* look for trailing null */ if (getc(fontfile) != 2 || getc(fontfile) != 3) { printf("tex: Bad font file: %s\n", filename) ; fclose(fontfile) ; return OK ; } getc(fontfile); getc(fontfile) ; /* eat more stuff */ i = getc(fontfile); /* # of defined characters */ /* DEBUG - you really need to check ttchar, arg) ; if (strlen(filename) > FILENAMELEN - 5) { printf("tex: Invalid file name: %s\n", filename) ; return inchar ; } for (p = filename; *p;) if (*p++ == '.') { printf("tex: Invalid file name: %s\n", filename) ; return inchar ; } strcat(filename, ".tex") ; if (fopen(filename, filebuf) == ERROR) { printf("tex: Can't open file: %s\n", filename) ; return inchar ; } savechar = inchar ; inchar = readch(filebuf) ; printf("tex: Processing file %s\n", filename) ; if (processtext(readch, filebuf) != EOF) printf("tex: Missing right brace in file: %s\n", filename) ; printf("tex: Finished with file %s\n", filename) ; return inchar = savechar ; } /* * dodef - do the define command. This expects a '\' in inchar, and * eats up a define command afterwards. The syntax for the * (currently) accepted define commands are: * * \def\defname#1{text of define} \def\x#1{text of define} * \def\defname{text of define} \def\x{text of define} * * The sto see if we ran out of file on these getc's.. */ for (c = 6; c++ <= 15;) getc(fontfile) ; /* eat reserved bytes */ while (i--) { /* loop over defined bytes */ c = getc(fontfile) ; /* the character defined */ if (c >= ASCIICHARS || c < 0) { /* signed or unsigned chars? */ printf("tex: Bad font file: %s\n", filename) ; return OK ; } pointer = &fontdata[newfont][c] ; /* now fetch the data that goes with the character */ pointer -> f_width = getc(fontfile) + 2 ; pointer -> f_leftmargin = getc(fontfile) ; pointer -> f_inkwidth = getc(fontfile) ; pointer -> f_inkheight = getc(fontfile) ; pointer -> f_inkbottom = getc(fontfile) ; } puts("done\n") ; fclose(fontfile) ; /* clean up after myself */ return OK ; } /* * dochar - do the 'char' command. Leaves inchar in the right state for the * next loop of processtext. */ dochar(nextchar, arg) int (*nextchar)(); { int tempin ; char tempbuf[FILENAMELEN] ; getnumber(&tempin, nextchar, arg)ring #1 following the defname indicates a parameter. The * x in the right-hand defines is a single non-alphabetic character. */ dodef(nextchar, arg) int (*nextchar)(); { char *defpointer, defname[COMLENGTH] ; if (inchar != COMMAND) { printf("tex: Bad define character. Expected %c, got %c\n", COMMAND, inchar) ; return inchar = (*nextchar)(arg) ; } if ((inchar = (*nextchar)(arg)) == EOF) return EOF ; *(defpointer = defname) = inchar ; if (!isalpha(inchar)) { defname[1] = NULL ; inchar = (*nextchar)(arg) ; } else { while ((inchar = (*nextchar)(arg)) != OPEN && inchar != PARAMETER) { if (defpointer - defname >= COMLENGTH - 1) { *defpointer = NULL ; printf("tex: Define to long: %s\n", defname) ; return skiptowhite(nextchar, arg) ; } *++defpointer = inchar ; } *++defpointer = NULL ; texcase(defname) ; } if (inchar == OPEN) return definsert(defname, nextchar, arg, FALSE) ; if (inchar != PARAMETER) { puts("tex ; if (tempin < 0 || tempin > 127) { printf("tex: Invalid character: %03d\n", tempin) ; return inchar ; } #if TRACEPOINTS printf("currentpoint %d, lastbreak %d, width %d\n", currentpoint, lastbreakpoint, width(tempin)) ; #endif currentpoint += width(tempin) ; /* Curse you, DRI! */ if (!tempin || tempin == CPMEOF || tempin == COMMAND) sprintf(tempbuf, FORMCHAR, tempin) ; else sprintf(tempbuf, "%c", tempin) ; forceout(tempbuf) ; return inchar ; } /* * checkmath - just check to see if we are in math mode, and bitch * if not... */ checkmath() { if (!mathmode) puts("tex: Math only command issued outside math mode\n") ; return OK ; } /* * doinput - change to a different input stream. This routine * works by running a second copy of processtext with a change * of input stream. Leaves inchar in the right state. */ doinput(nextchar, arg) int (*nextchar)(); { char *p, filename[FILENAMELEN], filebuf[BUFSIZ] ; int savechar ; getfilename(filename, nex: Bad define: %s", defname) ; return skiptowhite(nextchar, arg) ; } if ((inchar = (*nextchar)(arg)) != '1') { printf("tex: Bad define parameter. Expected 1, got %c", inchar) ; return OK ; } if ((inchar = (*nextchar)(arg)) == OPEN) return definsert(defname, nextchar, arg, TRUE) ; printf("tex: Bad define: %s", defname) ; return skiptowhite(nextchar, arg) ; return OK ; } /* * definsert - put the named object in the define table. The parameter * flag is copied appropriately. * * Note: right now, the parameter flag could be set in dodef, but * if I change the table search (binary search, or hashing, or * whatever), this would no longer be true. */ definsert(name, nextchar, arg, parameter) int (*nextchar)(); char *name; { char token[INBUF] ; if (nextdef >= NUMDEFS) error("tex: To many defines: %s not defined\n", name, 1) ; defines[nextdef] . d_parameter = parameter ; strcpy(defines[nextdef] . d_defname, name) ; gettoken(token, INBUF, nextchar, arg) ;UF, nextchar, arg) ; forceout(LEFTIFY) ; savechar = inchar ; inchar = stringch(&charpointer) ; processtext(stringch, &charpointer) ; return inchar = savechar ; } /* * doright - Put the following text on the far right side of the line, doing * the appropriate magic with inchar. */ doright(nextchar, arg) int (*nextchar)(); { char buffer[INBUF], *charpointer ; int savechar ; gettoken(charpointer = buffer, INBUF, nextchar, arg) ; forceout(RIGHTIFY) ; savechar = inchar ; inchar = stringch(&charpointer) ; processtext(stringch, &charpointer) ; lastbreakpoint = currentpoint = leftmargin ; makenewline(ERROR) ; return inchar = savechar ; } /* * dounder - turn on the underline mode for a token or so. Does the * appropriate magic with inchar. */ dounder(nextchar, arg) int (*nextchar)(); { char buffer[INBUF], *charpointer ; int savechar ; gettoken(charpointer = buffer, INBUF, nextchar, arg) ; forceout(UNDERLINE) ; savechar = inchar ; inchar = stringch(&char if ((defines[nextdef] . d_replace = sbrk(strlen(token) + 2)) == ERROR) error("tex: Out of string space\n") ; strcpy(defines[nextdef++] . d_replace, token) ; return inchar ; } /* * lookup - decide if command is in the define tables. If it is, feed * it to processtext and return TRUE, otherwise return FALSE. * In either case, make sure that inchar is correct for the future. * If no input is done, this is already true... */ lookup(command, nextchar, arg) char *command; int (*nextchar)(); { int i, savechar ; char token[INBUF] ; for (i = 0;; i++) if (i >= nextdef) return FALSE ; else if (strequal(command, defines[i] . d_defname)) break ; defines[i] . d_nextchar = defines[i] . d_replace ; if (!defines[i] . d_parameter) { savechar = inchar ; inchar = stringch(&defines[i] . d_nextchar) ; processtext(stringch, &defines[i] . d_nextchar) ; } else { gettoken(token, INBUF, nextchar, arg) ; savechar = inchar ; defines[i] . d_altparm = NULL ; defines[i] .pointer) ; processtext(stringch, &charpointer) ; forceout(UNDERLINE) ; return inchar = savechar ; } /* * dofill - reads in the next number. If it is zero, turn off word filling, * otherwise turn on word filling. Does the right thing with inchar. */ dofill(nextchar, arg) int (*nextchar)(); { char flag, buffer[MAXLINE] ; getnumber(&flag, nextchar, arg) ; setfill(flag != 0) ; return inchar ; } /* * setmath - does the \math command to set the mathmode variable to * the rigth thing. Assumes that inchar has the : and that a * digit follows thereafter. Makes inchar right. */ setmath(nextchar, arg) int (*nextchar)(arg); { if (inchar != FONTCHAR) { puts("tex: Illegal command \\math%c\n", inchar) ; return inchar = (*nextchar)(arg) ; } if ((inchar = (*nextchar)(arg)) == EOF) return EOF ; if (inchar < '0' || inchar > '9') { printf("tex: Illegal font character: %c\n", inchar) ; return inchar = (*nextchar)(arg) ; } mathfont = inchar - '0' ; if ((inchar d_parameter = token ; inchar = defch(defines + i) ; processtext(defch, defines + i) ; } inchar = savechar ; return TRUE ; } /* * doeject - force a new page to start. */ doeject(nextchar, arg) int (*nextchar)(); { lastbreakpoint = currentpoint = leftmargin ; forceout(PAGE) ; return skipwhite(nextchar, arg) ; } /* * docenter - Center the following token on the line, doing the * appropriate magic with inchar. */ docenter(nextchar, arg) int (*nextchar)(); { char buffer[INBUF], *charpointer ; int savechar ; gettoken(charpointer = buffer, INBUF, nextchar, arg) ; forceout(CENTER) ; savechar = inchar ; inchar = stringch(&charpointer) ; processtext(stringch, &charpointer) ; return inchar = savechar ; } /* * doleft - The following code should be on the left of the line, but... * do the appropriate magic with inchar. */ doleft(nextchar, arg) int (*nextchar)(); { char buffer[INBUF], *charpointer ; int savechar ; gettoken(charpointer = buffer, INB = (*nextchar)(arg)) == EOF) return EOF ; return skipwhite(nextchar, arg) ; } /* * dopar - force a paragraph to start/end... */ dopar(nextchar, arg) int (*nextchar)(); { char buffer[MAXLINE] ; currentpoint = lastbreakpoint = leftmargin + indent ; forceout(PARAGRAPH) ; sprintf(buffer, FORMLINE, currentpoint) ; forceout(buffer) ; return OK ; } /* * dohoriz - skip over some horizontal number of points... */ dohoriz(nextchar, arg) int (*nextchar)(); { int number ; char buffer[MAXLINE] ; getnumber(&number, nextchar, arg) ; if (inchar != 'p' || (inchar = (*nextchar)(arg)) != 't') puts("tex: Need `pt' to follow hskip number\n") ; inchar = (*nextchar)(arg) ; /* skip over the t... */ currentpoint += number ; sprintf(buffer, FORMHORIZ, number) ; forceout(buffer) ; return skipwhite(nextchar, arg) ; } /* * dovert - skip over some vertical number of points... */ dovert(nextchar, arg) int (*nextchar)(); { int number ; char buffer[MAXLINE] ; getnumberar counter ; if (skipwhite(nextchar, arg) == EOF) return EOF ; for (counter = 0; inchar != EOF; inchar = (*nextchar)(arg)) { if (counter > FILENAMELEN - 5) { strcpy(name, "bad name") ; if (skiptowhite(nextchar, arg) == EOF) return EOF ; return skipwhite(nextchar, arg) ; } if (isalpha(inchar) || isdigit(inchar) || inchar == ':') *name++ = inchar ; else { /* got the whole thing */ *name = NULL ; return skipwhite(nextchar, arg) ; } } *name = NULL ; /* EOF - make sure to turn it off */ return EOF ; } /* * getnumber - fetch a number from the input stream, skipping whitespace * afterwards. Automagically leaves inchar right. */ getnumber(number, nextchar, arg) int *number, (*nextchar)(arg); { int sign ; sign = *number = 0 ; if (skipwhite(nextchar, arg) == EOF) return 0 ; if (inchar == '+') sign = 1 ; else if (inchar == '-') sign = -1 ; if (sign) inchar = (*nextchar)(arg) ; while (isdigit(inchar)) { *number = 10 * *number + (&number, nextchar, arg) ; if (inchar != 'p' || (inchar = (*nextchar)(arg)) != 't') puts("tex: Need `pt' to follow vskip number\n") ; inchar = (*nextchar)(arg) ; /* skip over the t... */ currentpoint = lastbreakpoint = leftmargin ; sprintf(buffer, FORMVERT, number) ; forceout(buffer) ; return skipwhite(nextchar, arg) ; } /* * setleft - set the left margin to some new value. Leaves inchar updated. */ setleft(nextchar, arg) int (*nextchar)(); { int number, flag ; if ((flag = getnumber(&number, nextchar, arg)) == 0) leftmargin = number ; else if (flag > 0) leftmargin += number ; else if (flag < 0) leftmargin -= number ; if (leftmargin < 0) { puts("tex: Negative left margin, left set to 0\n") ; leftmargin = 0 ; } return inchar ; } #if RIGHT /* * setright - like setleft, but for the right margin. */ setright(nextchar, arg) int (*nextchar)(); { int number, flag ; if ((flag = getnumber(&number, nextchar, arg)) == 0) rightmargin = number ; else if(inchar - '0') ; if ((inchar = (*nextchar)(arg)) == EOF) return sign ; } skipwhite(nextchar, arg) ; return sign ; } /* * gettoken - fetch a token out of the input stream. A token is defined * as a single character, OR a string surrounded by OPEN and CLOSE. * Expects inchar to have an OPEN (if there is one), and leaves it * updated. */ gettoken(token, length, nextchar, arg) int (*nextchar)(); char *token; { char count ; if (inchar != OPEN) { *token++ = inchar ; *token = NULL ; inchar = (*nextchar)(arg) ; return OK ; } count = 0 ; while ((inchar = (*nextchar)(arg)) != CLOSE || count > 0) { if (inchar == EOF) { *token = NULL ; return ERROR ; } if (length > 0) { *token++ = inchar ; length-- ; } if (inchar == OPEN) count++ ; if (inchar == CLOSE) count-- ; } *token = NULL ; inchar = (*nextchar)(arg) ; skipwhite(nextchar, arg) ; if (length <= 0) puts("tex: Input token to long\n") ; return OK; } /* * width - retur (flag > 0) rightmargin += number ; else if (flag < 0) rightmargin -= number ; return inchar ; } #endif /* * setindent - setleft/setright again, but for the indentation. */ setindent(nextchar, arg) int (*nextchar)(); { int number, flag ; if ((flag = getnumber(&number, nextchar, arg)) == 0) indent = number ; else if (flag > 0) indent += number ; else if (flag < 0) indent -= number ; if (leftmargin + indent < 0) { printf("tex: Indent to small, set to: %d", -leftmargin) ; indent = -leftmargin ; } return inchar ; } /* * doff - get things from the input stream to be passed to Fancy Fonts. * This also leaves inchar done up right. */ doff(nextchar, arg) int (*nextchar)(); { gettoken(passtoff, INBUF, nextchar, arg) ; return inchar ; } /* * getfilename - go fetch a file name from the current input stream. * reads the name into name, and leaves inchar pointed to the * right thing. */ getfilename(name, nextchar, arg) char *name; int (*nextchar)(); { chn the width of the argument character in the current font */ char width(ch) char ch; { return fontdata[cfont][ch] . f_width; } /* * skipwhite - skips over whitespace in the input stream. Assumes that inchar * has the next char to be processed, and it may/may not need to be * skipped. */ skipwhite(nextchar, arg) int (*nextchar)(); { while (inchar == SPACE || inchar == TAB || inchar == NL) { if ((inchar = (*nextchar)(arg)) == EOF) return EOF ; if (inchar == COMMENT) skipto(NL, nextchar, arg) ; } return inchar ; } /* * skiptowhite - skips over non-white things. Generally used for eating * bad commands and the like. Same assumptions as skipwhite */ skiptowhite(nextchar, arg) int (*nextchar)(); { while (inchar != SPACE && inchar != TAB && inchar != NL && inchar != EOF) { if ((inchar = (*nextchar)(arg)) == EOF) return EOF ; if (inchar = COMMENT) skipto(NL, nextchar, arg) ; } return inchar ; } /* * skipto - skip to the character asked for. */ ringch(string) char **string; { char ch ; if (!(ch = *(*string)++)) return EOF ; return ch ; } /* * readch - a `censored' read character. Throws out carriage returns and checks * for CPMEOF. */ readch(file) char *file; { int c ; while ((c = getc(file)) == CR) ; if (c == CPMEOF) return EOF ; return c ; } /* * makenewline - start us a fresh new line, complete with FF \a command, * etc. If offset is zero, it assumes that the buffer should be flushed. * Otherwise, it assumes that what's in the buffer is offset long, and * should be left in the buffer to start the next line. */ makenewline(offset) { if (offset == ERROR) { fputs(inbuffer, outfile) ; endpointer = inbuffer ; } fputs(ENDLINE, outfile) ; fprintf(outfile, FORMLINE, leftmargin) ; *endpointer++ = inchar ; currentpoint = leftmargin + width(inchar) + (offset == ERROR ? 0 : offset) ; lastbreakpoint = leftmargin ; if (*inbuffer == SPACE) { currentpoint -= width(SPACE) ; *endpointskipto(ch, nextchar, arg) char ch; int (*nextchar)(arg); { while (inchar != ch) if ((inchar = (*nextchar)(arg)) == EOF) return EOF ; } /* * setfill - set the fill mode to the passed flag... */ setfill(flag) char flag; { if (fillmode == flag) return OK ; fillmode = flag ; /* change fill & */ /* now set the justification properly */ forceout(fillmode ? JUSTON : JUSTOFF, outfile) ; } /* * changetofont - make the current font be the font passed as an argument */ changetofont(newfont) char newfont; { char strtemp[5] ; if (newfont == cfont) return OK ; /* right font, don't change */ if (newfont < 0 || newfont > 9) { printf("tex: Illegal font character: %d\n", newfont) ; return OK ; } cfont = newfont ; /* do the font change */ sprintf(strtemp, FORMFONT, newfont) ; forceout(strtemp) ; } /* * texcase - change the case of the passed string to lower, * except for leaving the first character in the case it is in... */ texcase(string) char *string;er = NULL ; strcpy(inbuffer, inbuffer + 1) ; endpointer-- ; } #if TRACEPOINTS puts("currentpoint reset to margin + offset (maybe)\n") ; #endif } /* * error - print a message (possibly with an argument), and exit */ error(format, arg, code) char *format; { printf(format, arg) ; exit(code) ; } /* * topofstack - debuging routine tells me where the top of the stack is */ topofstack(x) { return &x ; }  it assumes that the buffer should be flushed. * Otherwise, it assu% defines to make life easier for the macro package writer \def\macros#1{\def\macname{#1}\def\fetchman{\input b:m#1}} \macros{Basic} % Which macro package are we documenting? \input a:basic % set up the environment \ff{+nf +hl "tex USERS MANUAL\rDecember 1982" +fl "Mike Meyer\rPage \s#"} \f:9=ff12 % the fancy font fonts \def\FF{\f:9} \def\heading#1{\vskip 20pt{\bf #1}\vskip 10pt\par} \def\subhead#1{\vskip 20pt{\it #1}\vskip 10pt\par} \def\tex{{\rm T\FF E\rm X}} % define some usefull string { if (!*string) error("tex: Internal error in texcase.\n", NULL, 1) ; while (*++string) *string = tolower(*string) ; } /* * forceout - puts the string in the output stream, RIGHT NOW! */ forceout(string) char *string; { while (*string) *endpointer++ = *string++ ; *endpointer = NULL ; } /* * defch - traipse through the characters in a define, possibly with * parameters. */ defch(string) struct defdata *string; { char ch ; if (string -> d_altparm) { if (ch = *(string -> d_altparm++)) return ch ; string -> d_altparm = NULL ; } if (!(ch = *(string -> d_nextchar++))) return EOF ; if (!string -> d_parameter || ch != PARAMETER) return ch ; if ((ch = *(string -> d_nextchar++)) == PARAMETER) return PARAMETER ; if (ch != '1') { printf("tex: Bad parameter number %c\n", ch) ; return EOF ; } string -> d_altparm = string -> d_parameter ; return defch(string) ; } /* * stringch - go through the characters in a string, one at a time. */ sts \def\metafont{{\ss METAFONT}} \def\tm{{\FF TM}} \def\cr{{\FF R}} \def\pfont{{\ss pfont}} \def\describe{\lftmarg +60\indent 0\indent -60} \def\bold#1{{\bf #1 }} \vskip 72 pt % set up the title page \ctrline{\bf SMALL tex USERS MANUAL} \ctrline{\bf For the \macname\ Macro Package} \vskip 24 pt \ctrline{Mike Meyer} \vskip 72 pt This users manual for the small tex text formatting system is intended for people familiar with some text formatter (not necessarily \tex) and computers in general. The reader is assumed to have used and to be familiar with the {\FF Fancy Font} typesetting system. \vskip 200 pt \ctrline{copyright $\copyright$ 1982, Mike Meyer} \eject % now start the paper \heading{Introduction} Small tex (`tex' is never capitalized) is a micro-computer text formatter based on Donald Knuth's \tex\tm\ computerized typesetting system. tex (see?) shares with \tex\ user-definable commands, multiple typefaces of various sizes and shapes, support for typesetting mathematicsx to go to the top of a page (with the {\ss eject} command) and tex, not realizing that it is already at the top of a page, will leave a blank page behind when it obeys your command. This behavior can be modified by magic characters in the input stream. tex considers the same characters magic that \tex\ considers magic in its {\ss basic} package: `\\', `\%', `$\$$', `\{', and `\}'. These have the same meanings as the do in \tex, but cannot be changed as they can in \tex. They can be added to the output stream in the same manner as they are in \tex: by preceding them with a `\\' character, which effectively makes them commands. The `\\' character is used to indicate to tex that a command follows. Commands are {\it action} words - they tell tex to do something, usually immediately. The `\%' character signals a comment. When tex sees a `\%' in the input stream, it ignores any preceeding whitespace, all characters to the end of the line, and any whitespace following the end of the line. {, and the ability to group text. Unlike \tex, tex does not work with a character-definition system, like \metafont, for output. Instead, tex uses {\FF Fancy Font}\tm\ from SoftCraft for output. This package is not as powerful as \metafont, and the missing abilities are reflected in tex as missing features. Likewise, a z80 CP/M\tm\ system isn't a DEC\tm\ 10, so many nice features of \tex\ that I considered dispensable were dispensed with. I wish to emphasize that tex is not meant for {\bf all} micro-computer text formatting purposes. It is intended specifically for formatting small documents that require more abilities than most printers supply. Specifically, it was designed to let me typeset papers for my courses in graduate mathematics - which called for characters not generally available on my printer. tex is also suitable for setting letters, etc. However, for anything longer than about 20 pages, I don't recommend it. I don't consider this an unreasonable restraint, as it takes about 4 \it Whitespace,} if you were wondering, consists of blanks, tabs, and new line characters - things that don't leave ink on the paper. The $`\$'$ character indicates a change of mode - to or from one of the two math modes. $`\$''$s are used in pairs, either as: \ctrline{\ss$\$$text for math mode$\$$} or: \ctrline{\ss$\$\$$text for display mode$\$\$$} In math mode and display mode above, tex recognizes extra commands, and ignores spaces (except as needed to separate out commands). Finally, the `\{' and `\}' characters group text and arguments to commands. When freestanding, they indicate that commands that alter global properties of the text should apply {\bf only} to the text contained in them. These commands will be noted as we encounter them. For commands that require textual arguments, `\{' and `\}' set off arguments that are longer than one character. The following sections will discuss tex input syntax, the builtin commands for tex, and the \macname\ macro package in particular. Exahours to print a 20 page document in {\ss +rd 0} mode. \heading{What Does tex Do?} tex provides a {\it mapping} from its input to input for \pfont\ that hopefully reflects the user's intent for the resulting document's appearence. Unfortunately, tex is {\bf dumb.} tex only knows about {\it words} and {\it lines.} A {\it word} is anything that has whitespace on both sides {\bf in the output.} Most especially, anything printed in math mode is considered to be a single word. A {\it line} is a single line of text in the output document. As tex maps input to output, it reads in words, one at a time, until the words won't fit on the output line it is preparing. Then tex outputs the words that will fit on the line, and starts the next line with whatever word wouldn't fit on the current line. This is insufficent since {\it pages} are also important. Since tex ignores them, it can't do anything about widowed lines - it doesn't know that they're widowed. Likewise, you may occasionally tell temples will be drawn from the input used for the manual. In particular, references to "line of the input" refer to the appropriate line number in the file {\ss texuman.tex.} Also, there are occasional references to things done nearby in the text. These also indicate that you should check the appropriate input file. Therefore, if you have not printed off copies of the tex source for this manual (both {\ss texuman.tex} and {\ss\macname.tex}) you should do so now. I recommend {\ss pip prn:=} to get numbered listings. \heading{What the Magic Characters Do} As previously mentioned, there are several magic characters that change the way tex behaves. These are `\\', `\%', `$\$$', and the curly braces `\{' and `\}'. This section discusses their behavior and use in some detail. \subhead{The Command Character and Command Formats} The magic character `\\' introduces a tex command. Commands to tex have several formats. The basic format for all commands is a `\\' character, followed by theith an argument of {\ss x.} Finally, there are the commands which have a strange argument syntax. These either require more information, or are done in some specific manner to be compatible with \tex. These commands are {\ss def, vskip, hskip, f:, input} and {\ss math:.} \subhead{Comments} Comments in tex are introduced by the character `\%', and continue from the \%\ to the end of input text line. When a bare \%\ is seen, tex will ignore any white space preceding the \%, any text between the \%\ and the end of the line, and any whitespace following the comment. For examples of comments, see the first 20 or so lines of the input for this document. To get a \%\ into the output text, use the {\ss \\\%} command. \subhead{The Math Modes} \tex\ was originally designed for typesetting text with a high content of mathematics. tex has the same intent, and uses the \tex\ techniques for specifying equations. Specifically, an equation is introduced by either `$\$$' or `$\$\$$'. A single $\$$ name of the command, possibly followed by arguments. In any of the formats, any following whitespace is ignored by tex. Therefore, if you want the output from a command followed by a space, you should probably issue a `hard space' command. This is usually {\ss`\\\ '.} If you are not sure, you can always force tex to output a space by using the string {\ss \{\}} followed by a space. Command names come in two forms. The first consists of a single nonalphabetic character. Examples would be the commands used to get magic characters into the text. Around line 190 in the input is a good example of this type of thing. The second form consists of a string of alphabetic characters terminated by some nonalphabetic character. Usually, this nonalphabetic character is a blank. In this form, the case of the first character is significant, but the case of any following characters is ignored. For example, {\ss \\sigma, \\sIGMA,} and {\ss \\sIGma,} are all the same command, and all different from {\ss \\Sig introduces an inline equation, like $a=3x+b.$ The double $\$$, $\$\$$, introduces an equation centered on a line by itself, as: $$a=3x+b$$ While in math mode, tex changes to an italic-like font for normal characters. Any whitespace in an equation in math mode is ignored, except for the space command `\\\ '. The advantage of math mode is that a {\bf large} number of commands become available to output symbols not normally available. A complete list of these commands can be found in the appendix. Those of general interest are printed here, as pairs of {\it name, graphic representation}:{\fill 0\ss{} \lft{$\$$, $\$$} \ctr{$\#$, $\#$} \rt{dag, $\dag$} \lft{ddag, $\ddag$} \ctr{ldots, $\ldots$} \rt{ldotss, $\ldotss$} \lft{circ, $\circ$} \ctr{bullet, $\bullet$} \rt{copyright, $\copyright$} \lft{section, $\section$}} In addition, the two math mode commands {\ss +, -} generate superscripts and subscripts, and are occasionally useful outside of equations. As in \tex, there are lots of technima.} Commands usually have either one or zero arguments. Examples of the first case include commands to insert character strings into the text stream, as in the {\ss tex} command used on line 26 of the manual, in the abstract. The other use for commands without arguments is to change some global parameter of tex, say the typeface being used to print characters. The {\ss FF} command on line 12 of the input is a good example of that. If a command has a single argument, this command is known as a {\it token.} Tokens come in two forms. The general case is that they are a sequence of text between `\{' and `\}.' In such cases, {\bf the argument is limited to 1024 characters.} An example of this form is the {\ss macros} command on line 4 of the document. The argument to this command is the string {\ss \macname.} The other form for a token is a single, non-whitespace character. Generally, these are used after the non-alphabetic commands, as in {\ss \\+x,} which would be the command named {\ss +} wques for making the equations from tex look better than just typing commands in math mode. These will be discused in the next version of this manual. \subhead{Nesting Text and Tokens} The characters `\{' and `\}' are used in tex to group arguments to commands, and to indicate {\it environment nesting.} Before I can discuss the brace characters, I need to discuss environments, and the nesting of environments. It must be understand that the text formatting done by tex does not take place in a vacuum. The output of tex is governed by several knobs of tex that the user can set. These knobs comprise such things as the current typeface, the margins, etc. The current {\it environment} is the current setting of all of tex's knobs. The {\it nesting} of one environment inside of another implies that the environment is changed temporarily for a piece of text, and after the text is processed, the environment is restored to its previous state. This concept will be familiar to anyone wh has workedbf do not cause environment nesting}. In some cases, the command can be built to cause this to happen. None of tex's builtin commands do this. \heading{The Builtin Commands to tex} Following is a list of the commands that tex will always know about, no matter what macro package you are using. This list is not a complete list of all the commands a normal tex user will use, but merely covers those that are useful for setting up a document. There are other builtin commands that will probably be useful if you are building or modifying a macro package. See the Appendices for a complete list of builtin commands. The majority of the commands normally used will probably be defined in a macro package. See the following section for a list of these commands. \subhead{The {\ss def} Command} The single most useful builtin command is {\ss def.} It allows the user to define new commands that look, and act, just like builtin tex commands. Defined commands can have either alphabetic or non-alphabet with an ALGOL-like language, and indeed works in a similar manner. You can nest an environment inside of an environment that is already nested. In fact, you can nest environments in this manner arbitrarily deep (until you run out of stack space, anyway). This facility is very powerful, and makes many things easy that would be difficult in a text formatter such as roff. In tex, environments are nested with the pair of characters `\{' and `\}.' When not used to delimit arguments, the character `\{' indicates that a new level of environment nesting is being entered. Commands that change the current formatting environment may be issued, and will affect only the text enclosed between the open and close braces. To see how this nesting works, consider the subheadings in the next section. These nest an environment using an italic typeface for the main text of the subheading, and nest another environment inside of that one to use a sans serif typeface for the command names. {\lftmarg +20\indent ic names, and can have either of the two standard argument forms - none, or a single token. Examples of the {\ss def} command can be found on lines 9 through 15. Only lines 10 and 11 define commands with arguments. The other lines all demonstrate the standard, non-argument {\ss def} command format: \ctrline{\ss \\def\\name\{text of define\}} This string in the input text causes the command {\ss name} to be defined, such that every time the string {\ss \\name} appears in the input stream, {\ss text of define} will appear in the output stream. For example, the defintion for {\ss tex} appears on line 13. This line defines the {\ss tex} command such that every time the string {\ss \\tex} appears in the input, the string {\ss \{\\rm T\\FF E\\rm X\}} will be fed to tex, causing the symbol \tex\ to be printed on the page. The second form of the {\ss def} command is shown on lines 10 and 11 - a {\ss def} command with an argument. The general form of this is: \ctrline{\\def\\name#1\{text with 0\indent -20\sc The true value of this technique may be seen in this paragraph, which change the margin and indentation to become an outdented paragraph, and changes the typeface to script. Then, when the paragraph is finished, the environment closed, and things will return to normal, regardless of what `normal' was before.} Likewise, environment nesting can be used in letters. For example, a typical heading might look something like: {\fill 0{\lftmarg 450{} P.O. Box 1749 Norman, OK 73070 Jan. 20, 1982} Hank Harlison Dr. Mobs Urinal Somewhere, CA xyzzy } Find the commands in the source file that were used to produce this text to see how easy this is for tex, and then compare it to what would have to be done in a roff-like formatter. The other use for the brace characters is to delimit an argument to a command. This is discussed fully in the subsection on command characters and formats. The important thing to note at this point is that the braces used to delimit an argument {\possible #1 expansion\}} This form of the {\ss def} command works the same as the argumentless form of {\ss def,} except that, when the text for the definition is being used by tex, any occurence of the string {\ss #1} will be replaced by the argument. For example the {\ss heading} command, which is defined on line 10, when used on line 33 will expand to the string {\ss\{\\vskip 20pt\{\\bf Introduction\}\\vskip 10pt\\par\}.} A particularly good example of the power of the {\ss def} with a single argument can be found on line 2 of the input. This line defines the {\ss macros} command, which has one argument. Immediately below this, on line 4, the {\ss macros} command is used, with the argument of {\ss \macname.} This causes the text of the {\ss macros} command to be read by tex, which defines two more commands - the {\ss macname} command, and the {\ss fetchman} command. The {\ss macname} command just puts the argument to the {\ss macros} command in the input stream. The {\ss macname} commahis is seen on line 31, where it is used to get to a new page to start the manual after the title page has been printed. As has been pointed out before, tex does not know about pages, so {\ss eject} issued at the top of a page will cause a clean sheet of paper to be printed. For this reason, it is inadvisable to use lots of ejects or, if you do use lots of ejects, to number your pages. The three commands {\ss lft, rt} and {\ss ctr} are relatively dangerous, and should only be used by experienced tex users: those who know what the commands actually do. In general, the only place they will be used is in producing `tables,' or the closest approximation that tex can make to tables. For an example of this, see the section around line 200 in the input document on math mode. The only really useful feature any of these offer is centering lines of text. Check the definitions provided by the macro package you are using for a specific centering command. \subhead{Fill and Nofill} One of the nonsnd is used in the preceding sentence to get the argument of the {\ss macros} command on line 4 into the text, and on line 19 to get the name of the macro package this manual documents into the subtitle. The {\ss fetchman} command tells tex to input the parts of the manual that are specific to some macro package, and is used to do so later on in this document. Note that the {\ss macros} command demonstrates that you can use the {\ss #1} sequence in a definition expansion as often as needed. It is left as an exercise to the reader to determine if a definition can define commands with arguments, and how this would be done if it can be done. \subhead{Positioning Commands - {\ss vskip, hskip, ctr, rt, lft, eject}} There are five commands built in to tex for positioning text on the page. These are {\ss hskip, vskip, ctr, rt, lft} and {\ss eject.} The only two that will generally be used are {\ss vskip} and {\ss hskip.} These both have the same format: \ctrline{\ss \\hskip xx pt} or \ctrline{\ss tandard form commands is the {\ss fill} command. Fill affects the behavior of tex in a major way. The general form is {\ss \\fill x,} where x is either zero or one. If x is one, then tex behaves as previously described, treating newline characters as spaces, and packing as many words per line as possible. If x is zero, then tex {\bf stops doing word filling.} This means that every newline character in the input causes one newline in the output. Of course, if a line would be to long to fit on the page, tex will break it if you are not in fill mode. Additionally, tex does not justify the right margin when in it is not in fill mode. {\fill 0 For example, this text is not filled in. You can see the difference it makes in the output.} {\ss fill} is useful for such things as addresses on letters, tables, etc. Note that fill is one of the global formatting parameters for tex, so it is restored to its old value when leaving a nested environment. The tables in the discussion of math mode demonst\\vskip yy pt} {\ss hskip} causes a {\bf h}orizontal {\bf skip} in the output text of xx {\it pts.} A {\it pt} (for hskip) is one 120$\+{th}$ of an inch. For example, the following text is produced by the input sequence {\ss |\\hskip 50 pt|}:|\hskip 50 pt| {\ss vksip} causes a {\bf v}ertical {\bf skip} in the output text of yy pts. For {\ss vskip,} a pt is {\bf one 72$\+{nd}$} of an inch. {\bf NOTE THE \underline{DIFFERENCE}} between the unit for {\ss vskip} and {\ss hskip.} This is unfortunate, but it is also unavoidable, being imposed by {\FF Fancy Font}. An example of the use of {\ss vskip} is in the definition for {\ss heading} and {\ss subheading,} where {\ss vskip} is used to get appropriate amounts of vertical spacing around the headings. In both {\ss vskip} and {\ss hskip,} the string {\ss pt} is {\bf required.} If it is left off, tex will complain, and eat the character following the {\ss v[h]skip} command. The {\ss eject} command is used to get to a new page. An example of trate this. \subhead{Paragraph Commands - {\ss par, indent, lftmarg}} In general, tex does not know about paragraphs. However, the three commands {\ss indent, lftmarg} and {\ss par} affect the shape of the document by affecting the way paragraphs are laid out on the page.\par The simplest of these is {\ss par.} {\ss par} is causes tex to start a new paragraph {\bf immediately.} For example, this paragraph was started with a {\ss par} command in the input stream. Note that if you are in fill mode, two consecutive newline characters are synonymous with the {\ss par} command. This is usually preferable, since most text editors that know about paragraphs will recognize that sequence for a paragraph. Additionally, it visually breaks out paragraphs in the input. {\ss lftmarg} and {\ss indent} are used to change the shape of a paragraph. {\ss lftmarg} is used to set the left margin of the page, and {\indent} is used to set the amount of paragraph indentation. The form for both {\ss lftmarg} andput text. The second command is the {\ss underline} command. This command has a single token as an argument, as in {\ss \\underline\{text\}.} This will cause {\ss text} to be underscored. {\ss underline} obeys all the constraints placed on normal, one-argument commands. The third command is the {\ss ff} command. This command passes a single argument to \pfont\ when it is invoked by tex. Lines 6 and 7 in the input show how I used this to put headers and footers on the manual. Note that only the last occurrence of this command in the text is actually used. Finally, there is the {\ss f:} command. This command is used to declare a {\FF Fancy Font} font file to be associated with a font number, and to change to that font during the input stream. Normally, there are only two font numbers you can use, 8 and 9. The syntax to associate a font file with font number 8 is: {\ss \\f:8=file}. To cause a change to font number 8, the command {\ss \\f:8} is issued. Normally, you won't use this version o {\ss indent} is the same: \ctrline{\ss \\lftmarg sxx} or \ctrline{\ss \\indent sxx} In these forms, the {\ss xx} is some number of pts as defined for {\ss hskip}, one 120$\+{th}$ of an inch. The {\ss s} in the argument is used to allow finer control. If it is a blank, the value of {\ss lftmarg} or {\indent} is set to the numeric value of xx. If s is a `+' (or `-'), then the value of xx is added (or subtracted) from the current value of {\ss lftmarg} or {\ss indent.} Since both {\ss lftmarg} and {\ss indent} are part of texs formatting environment, these values will nest with curly braces, so some rather nice effects can be achieved. For example, a quotation can be done by setting up a block of text in curly braces that start with {\ss \\lftmarg +20.} This will indent the paragraph(s) in the quotation by 1/6$\+{th}$ of an inch. Similarly, outdented paragraphs can be set up by changing the left margin to an appropriate value, then setting indent to 0, and finally subtracting whatever you deemf the command, as you (or whoever wrote the macro package you are using) will have defined a command to change fonts for you. Lines 8 and 9 in the input file show font 9 being associated with the file ff12.fon, and the the command {\ss FF} being defined to change to that font. From then on, when I want to use that font (like I did in this paragraph), I issue the {\ss FF} command. \heading{Making use of the \macname\ Macro Package} \fetchman \heading{Caveats} This manual is not the last word on using tex. It is meant to be enough of an introduction to let new users start with tex, and get some work done. It does not document all the features and behavior of tex: the source code does that. If you don't have the source, somebody is distributing copies of tex in violation of the release agreement. Get in contact with me in that case. If you have problems, or need help with tex, get in contact with me. The appropriate addresses are currently: {\fill 0 U.S. Post Offal:{\lftmarg +50 M appropriate from indent. See the appendices for examples of this. \subhead{Miscellaneous Commands} Finally, there are four commands varying in usefulness from considerable to nearly none. These don't fit in any of the above sections, as each is unique. The most useful of these three commands by far is the {\ss input} command. You will use it in almost every document you use tex on, generally to fetch the macro package you need for that document. The syntax of the {\ss input} command is: \ctrline{\\input filename} This causes tex to go look for the file {\ss filename.tex}, and start reading input from that file. This input is inserted directly into the stream, in the middle of the word if that's where the {\ss input} command occurred. Inputting text via the input command is {\bf not} like nesting text inside a pair of curly braces - any changes made to the global environment in the input file will affect text following the {\ss input} command. For examples, see lines 2 and 5 in the inike Meyer P.O. Box 1749 Norman, OK 73070} Bell Telephone:{\lftmarg +50 405/360-2508} ARPANet:{\lftmarg +50 mwm@okc-unix} UUCPNet:{\lftmarg +50 decvax!duke!uok!mwm} CNet:{\lftmarg +50 The Oklahoma Cnode - Ishtar: 405/329-1373}} \heading{Appendix A} This appendix is the most important single part of tex users manual. It lists all the error messages that tex issues. The format of an error message is {\ss tex: text of error message.} The following list contains the text of the error message, followed by comments about the probable cause and possible fixes. {\describe \bold{Invalid file name:} You told tex to format a file with a name that is longer than is valid for the operating system. File names used with the {\ss input} command cannot contain `.' character. If you used a `.' in such a file name, the {\ss Invalid file name} error message can be issued. In either case, check the filename on the command line, or in the appropriate {\ss input} command. \bold{Can't opend itself in display mode while not in math mode. Write down the entire output line and get a hacker to look at your input and the version of tex you are running. \bold{Leaving display mode with $`\$'$} You closed display mode text with a single `$\$$.' Either you closed display mode incorrectly, or you forgot to close some math mode text. In the latter case, you should also get {\ss Math only command$\ldotss$} messages. \bold{Leaving math mode with a $`\$\$'$} This is the converse of the previous error message. The reasons and fixes are the same. \bold{Domath compiler error!} Something that shouldn't be possible happened. Write down the error message, and get a hacker to look at the your tex input, the source for the version of tex you are running, {\bf and} the version of the compiler that was used to compile it. \bold{Illegal command:} tex found a command that it didn't recognize. You probably made a typo in the command name. Check your spelling. \bold{Illegal font command:} Thn file:} tex couldn't find the input file. Check the spelling of the filename on the command line or in the appropriate {\ss input} command. \bold{Can't create file:} tex couldn't create the output file. Possibly your disk is full. \bold{Missing right brace in file:} There is a missing right brace in the named file. Verify that every open brace has a matching close brace. \bold{Document completed in math mode} tex found the end of the file while it was in math mode. You undoubtedly forgot to put the final $\$$'s on math mode or display mode text. Use the {\FF Fancy Font} {\ss +sd} mode to find where tex stops outputting spaces. This is probably where the missing $\$$ belongs. \bold{Negative left margin, left margin set to 0} You tried to change the left margin to a negative value. It was set to zero. You probably tried a {\ss lftmarg} command with a decrement argument that was larger than the current left margin. \bold{Indent to small, set to:} You tried to change the indent to a vere is a command that looks like a font command ({\ss \\f} followed by a non-alphabetic character) that is not a valid font command. Normally, font commands are set up in the macro package, so this shouldn't occur for the normal user. If it does, check the macro package you are using. \bold{Illegal font character:} A font or math command occured in the text that changed to an illegal font. See the previous error meesage for discussion. \bold{Can't open font file:} Somebody is trying to use a font file that doesn't exist. Once more, check the macro package you are using. Also verify that all the font files it uses are where it expects them. \bold{Bad font file:} The named font file contains data that tex doesn't understand. Possibly it or tex is corrupt. Get a fresh copy of the files. If that fails, verify that the version of tex you are using is compatible with the \pfont\ you are using. \bold{Invalid character:} You tried to use the builtin {\ss char} to print a non-ascii character. alue that, when added to the left margin, created a negative offset. tex set the indent to the negative of the left margin, which is probably close to what you wanted (pray, pray). Look for sequences like {\ss \\indent 0\\indent -x} where x is larger than the value of the left margin. \bold{Can't create temp file} tex couldn't create the file it uses for passing parameters to \pfont. Possibly your disk is full. \bold{Write error on file:} The write to the file tex uses for passing parameters to \pfont\ failed. Possibly your disk is full. \bold{Can't execute pfont} tex couldn't find the \pfont\ command. Check to see that it is on the correct disk. \bold{Out of buffer space} tex ran out of buffer space for input. This is highly unlikely. The only thing I can think of that would cause it is having the margins set to allow a large number of characters per line (either wide margins or small characters, or both), and being in math mode. \bold{Internal error in mathmode: inchar =} tex fouIf you don't use the {\ss char} command, check the macro package you are using. \bold{Math only command issued outside math mode} The math mode commands complain about this if they are used outside of math mode. In most cases, the command will do what you wanted, but not fixing the cause of the problem is bad form. If you get many of these, you probably forgot to close some math mode text properly. \bold{Bad define character.} A {\ss def} command was encountered that didn't end in a `\\'. Find the appropriate define, and fix it. \bold{Define too long:} You tried to define a command whose name was longer than tex can accept. Change the name of the defined command. \bold{Command too long:} You issued a command that was too long. This is an illegal command, as you couldn't have defined it in the first place. Find the occurence of the substring that tex printed, and change it to a legal command. \bold{Bad define:} The name of a defined command was not followed by either a `\{' or a `$\#ssociates font number {\ss x} with font file {\ss name.fon.} This causes no \pfont\ commands to be issued, but does cause tex to load the named font file. The form used to change to a font number is {\ss \\f:x}, which changes to font {\ss x.} This causes the \pfont\ command {\ss \\fx} to be issued. \bold{math} The {\ss math} command is used to tell tex which font is to be use for math mode. The format is {\ss \\math:x,} which causes font number {\ss x} to be used for math mode text. \bold{def} This defines a command, and its use is discussed in the main body of the manual. It causes no \pfont\ commands to be issued. \bold{fill} The {\ss fill} is used to turn fill mode on and off. Its use is discussed in the main body of the text. The current fill mode is part of the tex environment. If used to turn fill and justification on, a {\ss \\j} command is issued to \pfont. Otherwise, a {\ss \\k} command is issued to \pfont. \bold{lftmarg} This command is used to change the left margin. Its u.$' Find the appropriate {\ss def} command and fix it. \bold{bad define parameter.} You tried to use a parameter number other than 1 in a define. Currently, tex only allows one parameter on a command. Change the appropriate define. \bold{Too many defines:} The number of allowable defines in tex has been exceeded. The named command was not defined. The fix is either to use fewer defines, or reconfigure tex to allow more defines. \bold{Out of string space} You have run out of memory. Either get more memory, decrease the size of defined commands, or reconfigure tex. \bold{Illegal command \\math} The builtin command {\ss math} has been misused. Change the usage to correspond to {\ss \\math=x,} where {\ss x} is an appropriate font number. \bold{Need `pt' to follow hskip number} You left off the {\ss pt} from an hskip command. tex will eat the charcter following the misformed hskip command. Fix the offending hskip. \bold{Need `pt' to follow vksip number} Identical to the previous errose is discussed in the main body of the text. The left margin is part of the tex environment. This command causes no \pfont\ commands to be issued. \bold{indent} The {\ss indent} command is used to change the paragraph indentation tex is using. This indentation is part of the tex environment. The use of the {\ss indent} command is discussed in the main body of the manual. It causes no \pfont\ commands to be issued. \bold{rtmarg} The {\ss right} command is analogous to the {\ss lftmarg} command. It is currently disabled. \bold{mathonly} This command checks to see that tex is currently in math mode, and issues an error message if not. The correct usage is merely {\ss \\mathmode.} This command should be used by builders of macro packages to flag commands that should only be issued in math mode. No \pfont\ commands are issued. \bold{par} The {\ss par} command forces a paragraph output. It could probably be made a define, but I don't see any point in it yet. Its usage is discussed in the r, except that it applies to vskip instead of hskip. \bold{Input token too long} An argument to a command exceeded the maximaum length. Check commands with long arguments, and break the offending command up into two separate commands. } % end of the appendix A \heading{Appendix B} This appendix describes the builtin commands of tex. For each command, its form and usage is is discussed, as well as its exact behavior in terms of the \pfont\ commands that it issues. This appendix will probably be of use only to those building macro packages. Everybody should be aware of the names of the all the builtin commands, as you cannot use these names for defined commands. {\describe \bold{f} The {\ss f} command is used to change fonts, or to associate a font file with a font number. The font numbers currently valid are 0 through 9, and attempts to use any others will (hopefully) result in error messages. The form used to associate a font file with a font number is {\ss \\f:x=name,} which amain body of the manual. No \pfont\ commands are issued. \bold{eject} The {\ss eject} command is used to force a new page. The string {\ss \\b\\p} is issued to pfont. Therefore, the trailing line will not be justified, and the next line will start on a new page. \bold{ctr} This command is used to center text. The form is {\ss \\ctr\{text\}.} The \pfont\ command {\ss \\c} is issued, followed by the text of the argument. Note that \pfont\ will center any text that follows the {\ss ctr} command, unless other commands are issued. \bold{rt} The {\ss rt} command is used to force text to the right side of the line. Usage is {\ss \\rt\{text\}.} The pfont command {\ss \\r} is isued, followed by the text of the argument, followed by a newline character. \bold{lft} The {\ss lft} command is used to force text to the left side of the line. Usage is {\ss \\lft\{text\}.} The pfont command {\ss \\b} is issued, followed by the text of the argument. Hence, the total effect of the {\ss lft} command set is the Greek alphabet. The upper case Greek characters that are not also part of the English alphabet are included, as:{\fill 0\ss{} \lft{Gamma, $\Gamma$} \ctr{Delta, $\Delta$} \rt{Xi, $\Xi$} \lft{Theta, $\Theta$} \ctr{Lambda, $\Lambda$} \rt{Pi, $\Pi$} \lft{Phi, $\Phi$} \ctr{Sigma, $\Sigma$} \rt{Upsilon, $\Upsilon$} \lft{Omega, $\Omega$} \ctr{Psi, $\Psi$}} The entire lower case Greek alphabet is available, including both forms of theta and and phi. Note that the {\bf case of the first character} in the command is significant, and that the case of the first character is the only thing that differentiates the {\ss gamma ($\gamma$)} from the {\ss Gamma ($\Gamma$)} command. The commands for the lower case Greek characters are:{\fill 0 \ss{} \lft{alpha, $\alpha$} \ctr{beta, $\beta$} \rt{gamma, $\gamma$} \lft{delta, $\delta$} \ctr{epsilon, $\epsilon$}\rt{xi, $\xi$} \lft{theta, $\theta$} \ctr{eta, $\eta$} \rt{iota, $\iota$} \lft{kappa, $\kappa$} \ctr{lambda, $\lambda$} \rt{mu, $\mu$ommand is to turn off justification for the line it's issued on. \bold{vskip} This command is used to force a vertical skip down the page. Usage is discussed in the main body of the manual. The \pfont\ command {\ss \\b} is issued, followed by a {\ss \\v} command to cause the skip. Thus, the line the {\ss vskip} is issued on will not be justified, and the next line will occur the appropriate number of points down the page. \bold{hskip} The {\ss hskip command} is used to skip horizontally across the page. Usage is discussed in the main body of the manual. The \pfont\ command {\ss \\i} is issued to cause the skip. \bold{char} This command is used to force some non-printable ascii character into the output stream. Usage is {\ss \\char xxx}. The ascii character corresponding to the decimal value of {\ss xxx} will be inserted into the output stream. Normally, the appropriate ascii character is output. However, there are a couple of cases where the \pfont\ command {\ss \\d} is used. \bold{un} \lft{nu, $\nu$} \ctr{pi, $\pi$} \rt{phi, $\phi$} \lft{rho, $\rho$} \ctr{sigma, $\sigma$} \rt{tau, $\tau$} \lft{upsilon, $\upsilon$}\ctr{omega, $\omega$} \rt{chi, $\chi$} \lft{psi, $\psi$} \ctr{zeta, $\zeta$} \rt{vartheta, $\vartheta$} \lft{varphi, $\varphi$}} The upper case script characters are also available in math mode. These characters are from the standard {\FF Fancy Font} script character set, which is probably available with the macro package you are using. They are provided in math mode as a convenience for the user. They are:{\fill 0\ss{} \lft{Ascr, $\Ascr$} \ctr{Bscr, $\Bscr$} \rt{Cscr, $\Cscr$} \lft{Dscr, $\Dscr$} \ctr{Escr, $\Escr$} \rt{Fscr, $\Fscr$} \lft{Gscr, $\Gscr$} \ctr{Hscr, $\Hscr$} \rt{Iscr, $\Iscr$} \lft{Jscr, $\Jscr$} \ctr{Kscr, $\Kscr$} \rt{Lscr, $\Lscr$} \lft{Mscr, $\Mscr$} \ctr{Nscr, $\Nscr$} \rt{Oscr, $\Oscr$} \lft{Pscr, $\Pscr$} \ctr{Qscr, $\Qscr$} \rt{Rscr, $\Rscr$} \lft{Sscr, $\Sscr$} \ctr{Tscr, $\Tscr$} \rt{Uscr, $\Uscr$} \lft{Vscr, $\Vscr$} \ctr{Wscr,derline} The {\ss underline} command is used to underline text in the output document. Usage is {\ss \\underline\{text\}.} The output to pfont is {\ss \\utext of argument\\u.} \bold{input} The input command is used to fetch text from another file. Usage is discussed in the main body of the manual. No \pfont\ commands are generated. \bold{ff} This command is used to pass page formatting information to \pfont. Usage is discussed in the main body of the manual. No pfont commands are generated, but its argument is passed to pfont on the command line. } % end of Appendix B \heading{Appendix C} This appendix describes the commands available in math mode. These commands should be independent of the macro package you are using. The command set is broken up into pieces. The description of each piece of the command set consists of a brief discussion of that particular piece, followed by a table that has each command listed beside the resulting graphics character. The first piece of the c $\Wscr$} \rt{Xscr, $\Xscr$} \lft{Yscr, $\Yscr$} \ctr{Zscr, $\Zscr$}} There is a large selection of binary relations. These are:{\fill 0\ss{} \lft{normal, $\normal$} \ctr{noteq, $\noteq$} \rt{eqv, $\eqv$} \lft{supset, $\supset$} \ctr{subset, $\subset$} \rt{in, $\in$} \lft{notin, $\notin$} \ctr{perp, $\perp$} \rt{le, $\le$} \lft{ge, $\ge$} \ctr{onlyif, $\onlyif$} \rt{implies, $\implies$} \lft{if, $\if$} \ctr{iff, $\iff$} \rt{mapsto, $\mapsto$} \lft{lsls, $\lsls$} \ctr{grgr, $\grgr$} \rt{simeq, $\simeq$} \lft{approx, $\approx$} \ctr{doteq, $\doteq$}} There is also a variety of binary operators available in tex. These are:{\fill 0\ss{} \lft{pm, $\pm$} \ctr{mp, $\mp$} \rt{times, $\times$} \lft{div, $\div$} \ctr{odot, $\odot$} \rt{oplus, $\oplus$} \lft{odiv, $\odiv$} \ctr{ominus, $\ominus$} \rt{otimes, $\otimes$} \lft{cdot, $\cdot$} \ctr{union, $\union$} \rt{inter, $\inter$} \lft{and, $\and$} \ctr{or, $\or$}} In addition to the binary operators, the following unary operators are avihe following table is similar to the preceding tables, except that the string used to generate the glyph is {\ss A\\?\{exg\},} where the {\ss ?} is the command entered in the table. {\fill 0\ss{} \lft{mod, $A\mod{exg}$} \ctr{+, $A\+{exg}$} \rt{-, $A\-{exg}$}} Finally, there is a collection of math mode commands to generate miscellaneous characters that are not associated with mathematics, but are generally useful. These are listed in the section on math mode, and repeated here for completeness.{\fill 0\ss{} \lft{$\$$, $\$$} \ctr{$\#$, $\#$} \rt{dag, $\dag$} \lft{ddag, $\ddag$} \ctr{ldots, $\ldots$} \rt{ldotss, $\ldotss$} \lft{circ, $\circ$} \ctr{bullet, $\bullet$} \rt{copyright, $\copyright$} \lft{section, $\section$}} \ctr{max, $\max$}This file explains the things that you need to do to bring up small tex on your system. Hopefully, if you have this file, you will have all the files needed to bring up tex. First, you may have three .hex files. These should be math1.hex, opt12.hex aalable:{\fill 0\ss{} \lft{partial, $\partial$}\ctr{surd, $\surd$} \rt{int, $\int$} \lft{oint, $\oint$} \ctr{sum, $\sum$} \rt{prod, $\prod$} \lft{prime, $\prime$}} There are also a several different flavors of arrows. Note that there is no right arrow as such. The arrows that are there are:{\fill 0\ss{} \lft{up, $\up$} \rt{bigup, $\bigup$} \lft{down, $\down$} \rt{bigdown, $\bigdown$} \lft{left, $\left$} \rt{bigleft, $\bigleft$} \lft{right,$\right$} \rt{bigright, $\bigright$}} The following miscellaneous math symbols can also be used:{\fill 0\ss{} \lft{thereis, $\thereis$}\ctr{forall, $\forall$}\rt{therfor, $\therfor$} \lft{cdots, $\cdots$} \ctr{cdotss, $\cdotss$} \rt{nabla, $\nabla$} \lft{imag, $\imag$} \ctr{natural, $\natural$}\rt{rat, $\rat$} \lft{real, $\real$} \ctr{integer, $\integer$}\rt{complex, $\complex$} \lft{top, $\top$} \ctr{bot, $\bot$} \rt{aleph, $\aleph$} \lft{iit, $\iit$} \ctr{jit, $\jit$} \rt{angle, $\angle$} \lft{infty, $\infty$} \ctr{emptyset, $\emptyset$}} Thend math2.hex. If you don't have these as hex files, make sure you have the file math1.fon and math2.fon. If you do have the hex you need to create the appropriate fon files. Math1.hex becomes math1.fon and math2.hex becomes math2.fon, of course. Having gotten through the preceding paragraph, you should have the following files: tex.c C source math1.fon first tex font file math2.fon second tex fon file opt12.fon optima-like font file basic.tex basic macro pacage source file sbasic.tex stripped version of same scribe.tex scribe-like macro package sscribe.tex stripped version of same install.gde this file texuman.tex tex users manual macro.tex generic macro package manaul mbasic.tex manual for basic macro package mscribe.tex manual for scribe macro package hackers.tex manual for people who want to hack on tex In addition, you will need the following font files from the Fancy Font package: romn12, romn8p, romn8b, romnb12, romni12, scrp12, and sans12.  following commands are useful as paired delimiters:{\fill 0\ss{} \lft{lfloor, $\lfloor$} \rt{rfloor, $\rfloor$} \lft{lceil, $\lceil$} \rt{rceil, $\rceil$} \lft{langle, $\langle$} \rt{rangle, $\rangle$} \lft{dleft, $\dleft$} \rt{dright, $\dright$}} There are many operators that appear in formulas that {\it should not} be set in the same face as the surrounding formula. These are usually set in the face of the surrounding text. tex provides the following such operators:{\fill 0\ss{} \lft{cos, $\cos$} \ctr{cot, $\cot$} \rt{csc, $\csc$} \lft{sin, $\sin$} \ctr{sec, $\sec$} \rt{tan, $\tan$} \lft{exp, $\exp$} \ctr{ln, $\ln$} \rt{log, $\log$} \lft{lim, $\lim$} \ctr{liminf, $\liminf$} \rt{limsup, $\limsup$} \lft{min, $\min$} \ctr{max, $\max$} \rt{Pr, $\Pr$} \lft{sup, $\sup$} \ctr{inf, $\inf$} \rt{lg, $\lg$} \lft{det, $\det$} \ctr{gcd, $\gcd$} \rt{modop, $\modop$}} There are three math mode commands that use arguments. These are the super and sub script command, and the modulo operator. TOf course, you will also need pfont.com. The first step is to compile the tex sources. If you already have a tex.com, you can skip this step. To compile it, use the BDS C compiler, version 1.5 or later. Version 1.4x may work, but I haven't tried it. You should also use the L2 linker, as tex does lots of subroutine calls, and this will make a considerable difference in size and speed (and I'm not sure that tex will link under clink). Now, you are ready to start moving files. Put all the font files on one disk. On the same disk, put pfont.com and tex.com. I recommend that this disk be drive A: if you have a hard disk. On the same disk you need to put the macro package tex files: basic.tex, sbasic.tex, scribe.tex and sscribe.tex. If, for some reason you can't put them in drive A:, change line 5 in texuman.tex from `\input a:basic' to `\input x:basic' where x is the drive these files will be on. Along the same lines, the files texuman.tex, mbasic.tex and mscribe.tex need to go on drive B:. If* b͸{)Q)Qtw{ÖüH!K]jU 2͵ ^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2hZZk:h|/g}/o#|/g}/o#:h<2hqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2hZZ͉M|}ȯ|g}o)|/g}/o#z/W{/_!9~#fo! ! ! ! ! ! P!9~#A!9"w**w"j!z*"d!"f!Y"H>2^>2a>2`2c>2s2t>2r>2v!"@!"D!@"B!"F !F#x:~#!|2i~# :" 2i +}|~#:G:ix."2i+w# +6#!6#@A2n2?*j**|+`!#"0!#"2!>ڌo&͖=}  w~2ʸͼ56!+W ?_!~7z?ͧ:>͞@w#5 this isn't possible, change the `\input b:m#1' in line two to `\input x:m#1' with x once again being the appropriate drive. Now, you can try it out. Go to the drive with tex.com on it, and utter the command `tex b:texuman.tex' (of course, use whatever drive you put the texuman.tex file on for the b:). tex should then print the following things: tex version 1a - December 1982 For use with pfont version 1 Copyright (c) 1982, Mike Meyer tex: Initializing ... done tex: Processing file a:basic.tex tex: Loading font file romn12.fon ... done tex: Loading font file romn8p.fon ... done tex: Loading font file romn8b.fon ... done tex: Loading font file romnb12.fon ... done tex: Loading font file romni12.fon ... done tex: Loading font file scrp12.fon ... done tex: Loading font file sans12.fon ... done tex: Loading font file math1.fon ... done tex: Loading font file math2.fon ... done tex: Finished with file a:basic.tex tex: Loading font file ff12.fon ... done tex: Processing .ww#w#w#w*>?@͌>w#͌5> w#@ͧ͵g 2q&0OxG͵j/ʆSx\͞.7:77!a{  ʨ ʨ0:?ŷO !y$ 7o&))T])))!y 2p_ :pS%%\!h9DM! !a!! \?! t?!7 t?͐| ͐|file b:mBasic.tex tex: Finished with file b:mBasic.tex tex: Run complete Pfont: Print with Fonts (Version 1.7) Copyright (c) 1982 SoftCraft FO Fonts> The last three lines come from pfont, of course. If you got this far, then everything is working. Hit return a couple of times to get pfont started printing. Once it has started, make sure that the first page looks like a title page. If it does, then just let the pfont print. You might check it occasionally to make sure that it is still printing English. Other than that, you can go have dinner: the manual will finish printing in about four hours. After you have a copy of the main tex users manual, you may decide that you want a to use a macro package other than the one documented in the manual as you printed it. To avoid having to print the entire manual again, use the macro.tex file. To use this file, modify the macros command near the top as you would for the users manual, then print a copy of that. ne tex: Processing  !!!X *?! ~#fo##~#fo`is#r͐n}H ͐n}.H `i^#Vr+s' ! ~#fo##~#fo͐n}g !k j !n ! ͠?! ?|ڥ !! ~#fo##~#fo!u *?! ! @#| !! ! *?͐6! ~#fo##~#fo! ! ͠?*! K@#| !! ! *? ! ;=*s#r! != #|` ! ~#fo##~#fo! \?w}q ! t?**ͧ@*! ͧ@*! A*0B*͎C!" t?!5 >L*!= K@#| !!E !M *?*!n *C#|ʅ *, * * *******!r *C!9#|— !! ! *?*! A*0B*͎C!! ! ! ! eL! t?! !9December 1982tex version %d%c - %s For use with pfont version 1 Copyright (c) 1982, Mike Meyer usage: tex %s%s.textex: Invalid file name: %s tex: Can't open file: %s %s.fftex: Can't create file: %s tex: Missing right brace in file: %s.TEX tex: DocuM*s#r* ^#Vr+s6 lM*s#r*s#r*!ͧ@M!*CM\b \a%04d \a%04d!9DM͐͐!!9~#fo*s#r**ͧ@** s#rw}!!w}!!M|͝!"!>0>ʇ><>>H>>T>>`>>l>ʀ>x>>„>d*6*!ͧ@M* sw &;M*6*!ͧ@w &;M!M!*?!Ct?*s*sw &;*!gͧ@M!j*CM*s#r*s#r͐͐:9*s*s*!qͧ@M* sw &;M*s#r*s#r͐͐!!9~#fo*s#r!xt?*s*s*!ͧ@w &;͐͐!S!9~#fo*s#r*s*sw &;*!ͧ@M!*CM*s#r*s#r͐͐!!9~#fo*s#r͐͐:9!ment completed in math mode \b tex: Run complete tex.ffitex.ffitex.ffitex: Can't create temp file: %s %s +FO %s %s %s %s %s %s %s %s %s %s ,tex.ffitex: Write error on file: %s tex.ffi<pfonttex: Can't execute pfont !9DM!t?*!ͧ@*w#w*6*s*s* s*s#r*s#r* s* s** s#rs*s*s#r*s#r*s#r*6#6*w#w`iw#w͐|͐k*6! w#w͐|͐k*; ͐k͐k*; ͐k#͐k*; ͐k##͐k*; ͐k###͐k*; ͐k sssss! ^#Vr+s`i^#Vr+s!t?!9tex: Initializing ... \jdone !9DM\ *|?!!!S*?w}’M|’*6 #6!>͐ ͐!!9~#fo*s#r;M|ʼM|ʼM|w}͐͐ m͐ ͐!!9~#fo*s#r;!!*?tex: Internal error in mathmode: inchar = %c tex: Leaving display mode with `$' \a%04d\b \ctex: Leaving math mode with `$$' \a%04dtex: Domath compiler error! !9DM͐͐!!9~#fo*s#rz!ø! `is#rMsMC|K! 6͐͐!:!9~#fo*s#r`i^#Vr+s͐͐!l!9~#fo*s#rsC|͐! |͐6! !\?͐͐9øK͐6! ;͐͐:9!! D| ͐͐Xø!! D|0͐͐G#ø!! D|U͐͐=$ø!! D|z͐͐s&ø!! D|Ÿ͐͐,ø!! D|͐͐ -ø!! D|͐͐.ø!! D|͍͐͐-ø!! D|3͐͐͸.ø! ! D|X͐͐F/ø!! D|}͐͐P2ø!! D|¢͐͐N1ø!! D|͐͐0ø! ! D|͐͐94ø!'! D|M|͐͐ ;M|?͐͐ ͊;M|d͐͐ ! i:;M|)w! sM`isM! s#rM! s#rM! s#r͐ ͐!!9~#fo*s#r͐͐ ! n&ͺ:`in&;͐*s#r͐*s#r͐*s#r;M|c͐ ͐!N!9~#fo*s#rJ;M#|w!J;*~#foM9ѯgs#rM* ^#Vr+sMs͐ ͐!!9~#fo*s#r;MM!>MM>͐ ͐!-!9~#fo*s#r\ 6!J!9tex: Out of buffer space !9DM**ͧ@** s#rM|R͐͐!!9~#fo*s#rzM|O*!uͧ@MM!z*CMM*s#r*s#r͐͐:9À͐͐!i!9~#fo*s#rz€M|«͐͐! i:#|«M|ʞM|ʞM|ʞ*~#fo! 9ѯgs#rM&͐Z3ø!/! D|6͇͐͐$ø!5! D|[͐͐/ø!:! D|€͐͐*5ø͐͐! *|ʢMø! !=\?Mø! 9tex: Command too long: %s fcharmathonlydefejectctrrtlftunderlinefillvskiphskipparindentlftmarginputmathfftex: Illegal command: \%s !9DMM|ʦM!) \?͐͐!!9~#fo*s#r ͐͐!!9~#fo*s#rM|M|ڰ`in&!J \?͐͐! !9~#fo*s#rz'! M|=M ͐͐!T!9~#fo*s#rzn! ͐͐:9#|ʘ͐͐9#|ž! ͐͐:9 M`is͐͐!!9~#fo*s#r!| `in&͐͐k `in&;͐͐:9 !9tex: Illegal font command: \f%c tex: Illegal font character: %c !f9DM͐͐! !9~#fo*s#rz¤ !"͐͐! X5! ͐k*͞D!"! D! ! @#|!! tex: Bad define character. Expected %c, got %c tex: Define to long: %s tex: Bad define: %stex: Bad define parameter. Expected 1, got %ctex: Bad define: %s!9DMM8|)!̓!**?Mk*;" ̓ s#r̓Mk*;"͞D̓̓!`i͉7Mk*;"`i?##͑Ms#rzc*!**?`i*^#Vr+sk*;"~#fo͞DMÜ*!9tex: To many defines: %s not defined tex: Out of string space !9DM`iw#w͐M +!û,5+͐k*;"̓D|5+A+`i^#Vr+s*͐k*;"͐k*;"~#fos#r͐k*;" ~#fo|+M! s#r͐k*;"͇=*s#r͐k*;"!= å,̓ ̓ !! ͉7M! s#r͐k*;" w#w͐k*;" ! s#r͐*;"!kn<*s#r͐*;"!k!n< ͐*s#r!û,!9!9DMM*s#r*s#r!-0<͐͐:9!"\?!"! !"\?`i6`i~4o&|=!! HE!!! HE! s{T!=!! HE++|u!! HE+++|ʒ!! !#\?! ͎C!"! HE! HE! HE`is! 6! ~4o&|!! HE÷!`i~5o}ʮ"! HE! s! n&| "! n&|"! !)#\?!"͐k*; ! n&k! s#r͐! HE##s͐#! HEs͐##! HEs͐###! HEs͐! HEs!!A#t?! ͎C!"!9.fontex: Can't open font file: %s tex: Loading font file %s ... tex: Bad font file: %s tex: Bad font file: %s done !9DM͐͐`iu6͐|x#͐|ڎ#͐!$\?M $*~#fo͐9ѯgs#r͐|#͐|#͐|#͐!3$! ͠?#͐!:$! ͠?! 0̓*s#rì.!9\r!9DM̓ ̓!`i! s#r͉7!@/00!9~#fo*s#rM* s͐͐!y0!9~#fo*s#rz’0!͐͐:9tex: Illegal command \math%c tex: Illegal font character: %c !j9DMMM*Mø%$!%! D! ! @#|D%! !%\?Mø%M! s#r! ;=*s#r! !&\?! != #|ʖ%! !1&\?! !W&\?͐*s#rø%!9tex: Invalid file name: %s tex: Invalid file name: %s .textex: Can't open file: %s tex: Processing file %s tex: Missing right brace in file: %s tex: Finished with file %s !9DMM|&M!\!)\?͐͐!&!9~#fo*s#r(͐͐!&!9~#fo*s#rz&!(! `is#rMsMC|G'! 6͐͐!6'!9~#fo*s#r'͐͐!^'!9~#fo*s#r!|'M|'͐! |'͐6! !0)\?͐͐9(`i^#Vr+sMsG'`i^#Vr+s6! ;M|(!͐͐! ͟)(M|C(! !I)t?͐͐9(͐͐!Z(!9~#fo*s#r!|ʆ(M!])\?!(͐͐!(!9~#fo*s#r!|(!͐͐! ͟)(! !)\?͐͐9(!(! 9s#r*s#r!B10**ͧ@** s#r*!!?ͧ@M!#?*C* ^#Vr+sMsMM9ѯg͐#|͝¨>!ì>͐*s#rM*s#rw} ?*~#fo! 9ѯgs#r\ 6**͞D* ^#Vr+s \a%04d!9DM͐͐\?͐M!9DM! !9DM!M! wF!9DM͐n}ʞ?! ^#Vr+sn&M|?!9DM! !PJ! wF͐6!9DM`iw#w! ^#Vr+sn}?`i^#Vr+s?͐?!9!9DM͐!͐Ms#rz+@!͐##w#w͐6͐~#fo!9DM͐͐\Ns#rzp@!͐͐s#r͐##6#6͐6͐~#fo!9DM! ^#Vr+sn`is{@`in} @͐! A͐`in& A#|@!Aï@!!9tex: Indent to small, set to: %d!9DM͐͐!*͉7M!9DM͐ ͐:9#|{5!c6`i6M#|W6`in&|5!l6͐͞D͐ ͐9#|5!c6͐ ͐:9c6MC|5MF|5M|6! ^#Vr+sMs/6͐6͐ ͐:9c6͐͐ !F6!9~#fo*s#r5͐6!c6!9bad name!9DM͐s#r`is#r͐ ͐:9#|§6!À7M|¿6`i6#66M|6`i6#6͐|7͐͐ !6!9~#fo*s#rMF|j7͐͐~#fo ?Ms#r͐͐ !L7!9~#fo*s#rzg7͐À77͐ ͐:9͐À7!9!9DMM|7! ^#Vr+sMs͐6͐ ͐ !7!9~#fo*s#r!8`i6͐ ͐ !8!9~#fo*s#r!|%8`in&|ڎ8M#|<8͐6!8͐|i8! ^#Vr+sMs! ^#Vr+sM|z8`i4M|‹8`i57͐6͐ ͐ !8!9~#fo*s#r͐ ͐ :9͐|8!8t?!8!9tex: Input token to A!9!9DM͐ڴA͐>.A>UA>:A>cA>FA>vA>RA>ʉAôA! n&M! n&!͕N! n&!͕N! n} ¡A! !͕N! n&!͕N͐##^#Vr+s|B!͐͐~#foͦN+|A!͐##6#6͐͐s#r͐^#Vr+s! ns&!9DM͐IB!ÅC͐n&|g}o|hB!ÅC͐##~#fo|B!ÅC͐##~#fo`is#r͐͐͐~#foͦN͐B!ÅC͐+?`is#r͐##~#fo|^C!͐͐͐ZO͐##~#fo͐s#r͐~#fo͐s#r!!͐~#foͫOÅC͐##6#6͐͐s#r!ÅC!9!9DM͐ڦC!͐0B͐~#foO!9DM͐!nJ! wF!9DM! n&ͭJ|ͣ D! n&J|ͣ!9DM`iw#w! ~#fo͐n! ~#fo͐n}iD! ~#fo`i^#Vr+sn}fD!ÕDD! ~#fo͐n! ~#fo͐nѯgWÕD!9!9DM͐`is#r! ^#Vr+s! ^#Vr+sns{DðD͐D!9!9DM͐`is#r͐n}long !9DMMk*; ! n&kn&!9DMM|l9M|l9M|9͐͐!9!9~#fo*s#rzœ9!M|¾9͐͐! i:B9M!9DMM|`:M|`:M|`:M#|`:͐͐!:!9~#fo*s#rz7:!*%s#rz]:͐͐! i:9M!9DMM! n&ʸ:͐͐!:!9~#fo*s#rzµ:!q:!9DMw! n}:!! n*s*w}:!;;! ;0<\j\k!9DM! nM0;!Ñ;! n&|L;! n&|c;! n&!;\?!Ñ;! n*s#6! n&!;`i͠?`i0 2?+7*P!9/:q2 6C#6O#6M5L*R|³LR!\&L!\&*T|L!T!l&!9~#foL> +^M#~L##LxS'MMto boldface typeface: {\bf that looks like this.} \bold{rm} Use the standard roman typeface. This is the default typeface for this package. \bold{it} Change to italic typeface: {\it that looks like this.} \bold{ss} Change to sans serif typeface: {\ss that looks like this.} \bold{sc} Change to script typeface: {\sc that looks like this.} \bold{ctrline} This command takes one argument. It centers that argument on a line by itself. It does not put in extra lines other than that one line, so your text will look like \ctrline{this line centered} followed by more text on the next line. } % end of basic command set {\ss sbasic,} available. It provides only the math mode commands listed in the main body of the manual - those that aren't ma\input a:scribe \f:8=ff12 \def\FF{\f:8} \majorhead{The tex Hackers Guide} \head{Introduction} This document is a guide to those tex users who are, for some reason, dissatisfied with the way tex works. Since tex is a stage one program (pasted up  ØLEXECL: Command line overflow $!pgM!*w#3M*:1MM*VM!VM!a{ ѷ! *dڷM+*f|/g}/o#9ͻMҷM#"dz{   M > _ M 7,N> 2h*P/:q2> SN:h):R?N=?N=> SN:qw#w#w:ho&552?7*P>L:q2\5‡N> 2?!*PM7:PO*R7:P)"XV>TOz> TOz2:P,"j!"l*T|O*j!^#V*X#^#VNr+s*l5*R"R*j"*l*O2?N#"l*T+"T*j! N#Fp+qxN##6>2?N2?7*T|DM*R*PډO><}O~# x}O >O2?!^#V*R:TO=OO*PP*R!s#r#:noP2n& !o +P . &7:P)V>Pz>Pz2:P,"j!"l*T|*liP5*R*j!ѷʚP2?ʔPʔP!dP*ldP*T+"T*R"R*l#"l*j! N#Fp+qxYP##6>2?^P2? ,P>2?)~2#"j!!~#by some hacker with more guts than brains, and it does what I want) it is to be expected that lots of people will be dissatisfied with the way tex works. Therefore, this document is a guide to adding things to tex allowing easy integration into the tex distribution, and pointier to things that I think need to be done. The first section discusses extending the existing macro packages. The second section discusses adding new macro packages, and how to document them with little pain. The final section discusses changes to the actual tex code. Before going into how these things can be done, there are two things to point out. First, the tex package {\b is not in the public domain!} I still own all copyrights, etc. I will, however, allow redistribution of the package on three conditions: {\verse 1) My copyright notices stay where they are. 2) The source is distributed with the package. 3) Fixes and improvements eventually come back to me. } Second, tex was written to satisfy me, and I am hOr, when you send them to me, I can do it, and see that things get onto the tex distribution. \head{Adding a New Macro Package} If you don't like any of the macro packages currently available for tex, you'll probably want to add your own. If you are trying to make tex look like your favorite text formatter, I suggest that you consider carefully which commands should and shouldn't have arguments, based on the current 1K limit to argument sizes. For example, when the \example{scribe} package was added - to make tex behave like scribble - I made the \example{scribble} inline commands take arguments, and those that affect the environment were turned into simple commands. You should also document your new macro package in a manner similar to what is already there. The standard tex manual has been designed so that any macro package documentation can be put into it with very little work. Assume that your macro package is called \example{gort.} Then you need to create the file \example{mgort.appy with it. It was designed to let me use the power of {\FF Fancy Font} on my math courses, and in writing letters. It does an adequate job of that. It probably won't do an adequate job of anything that deviates too far from that. \head{Changing the Macro Packages} Probably the simplest thing in tex to change is the macro packages themselves. The general rule is: {\b DON'T.} The macro packages should be fairly complete. If you really want a large set of new commands, the thing to do is to add a new macro package that includes the commands you want. In this case, see the next section. \subhead{New Characters} There are two exceptions to the general rule of not changing macro packages. The first one is if you want to change the characters set around. For example, you may decide you need a new math mode character. Just print off a copy of the math fonts, and add it - probably to \example{math2,} as \example{math1} is about full. If you do this, send me a copy of the \example{edf} filtex} which documents the commands in the package. This file should look like \example{mbasic.tex.} Place it on the same disk as \example{mbasic.tex} (or whichever macro doc file you use), and modify the \example{macros} command in the file \example{texuman.tex} to use the name of the package in question. This should do the trick. You should also build two versions of the macro package. One should include all the math mode commands, and use both math fonts. The other should only include the miscellaneous math mode commands, and not include the \example{math2} font. The reason for this is that there are {\b lots} of math mode commands, and for anything but mathematics, you won't need most of them. So the second version of the macro package doesn't include them, and also frees up another font file for the user. See the two basic macro package files, \example{sbasic.tex} and \example{basic.tex,} for examples. I don't have any suggestions as to what kind of new macro packages need to be built.e for the character, and the command name you used on the character, and I'll see that the character/command pair winds up in the next distribution. Maybe not in the same place, but it will be there. I will also add that character to the documentation. Along these lines, there are two things that I would like to see done, but don't have time to do. First, the Greek characters are a bit bolder than I would desire, and not quite to the right scale. This could be fixed. Second, {\b all} the characters in the math2 font cause extra lines to be added to the output. I don't know why these lines are there, but it annoys me. If somebody (are you listening, SoftCraft?) would fix this, I would greatly appreciate it. \subhead{Changing Tex} The second reason to want to change a macro package is to take advantage of capabilities you have added to tex. There isn't much I can say about this, except that you ought to add the new commands to the documentation in the command list and the appendices.  Naturally - I built the ones I want. \head{Changing tex Itself} Finally, we come to the part that every true hacker probably went to first. Well, it's not going to do them any good. I'm not going to talk about the details of tex's internals. Instead, I will talk about the major organization. tex was designed to give me the ability to cleanly use the power of {\FF Fancy Font} as quickly as possible: I was in the middle of a very hairy algebra course when it was written, and wanted to get tex up without destroying my grades. I almost succeeded. \subhead{The Insides of tex} Given this constraint, it should come as no suprise that the basic algorithm that tex uses is stupid. To wit: tex reads in characters until it finds a word break, and then outputs the word and starts the next one with a space. If, at any time in this process, a character should be read in that wouldn't fit on the current line, tex starts a new line, and continues collecting words. To compound tex's stupidity, I letition, the input to the \example{ff} (or to the header/footer commands, if they exist by then) could be run through tex, so that you get to all the nice math mode characters. \head{Last Note} Well, so much for the things I think you should/can do to tex, and what to do if you do them. I would like to remind all the readers that if they are going to stay legal, they have to send me any changes they implement. The appropriate addresses are currently (Spring '83): {\verbatim Post Offal: Mike Meyer P.O. Box 1749 Norman, OK 73070 Ma Bell: 405/360-2508 ARPANet: mwm@okc-unix UUCPNet: decvax!duke!uok!uokvax!mwm CNet: Ishtar - the Oklahoma CNode 406/364-1373 } Obviously, I can't do a lot about it if you decide not to send me updates - unless you start distributing tex yourself. I probably won't get upset in that case, unless you are selling tex without my name on it. Then I may get legally angry. In any case, I hope you get as much good out of tex as I am. {\closing Happy ha \example{pfont} do all the hard work: pagination, justification, etc. All tex does is word filling, macro expansion, and environment nesting. Fortunately, the result is very usable. The last thing I have to say on the internals is that I tried hard (well, reasonably hard) to make it easy for other people to modify tex. Along these lines, all globals have nice, long names; procedures tend to have descriptive names (\examplg{docom, setleft,} etc), and every procedure is commented. Hopefully, you will have little trouble figuring out what is going on internally. \subhead{tex Wish List} There are only three things that I can think of that I would like to do to tex. I'm not going to do them - I'm going to play with my now two-month old LISP processor. First, modify tex so that it inputs an entire line and does its own justification. This would allow the \example{rtmarg} command to be turned on, and a couple of commands for handling quotes, etc could be added to the \example{scribe} macro cking and may all your bugs be small, Mike} header/footer commands, if they exist by then) could be run through tex, so th% This file is used to get a copy of a single macro package document. % Change the macros command to have the appropriate argument, & run it % through tex. \def\macros#1{\def\macname{#1}\def\fetchman{\input b:m#1}} \macros{Scribe} % Which macro package are we documenting? \input a:basic % set up the environment \f:9=ff12 % the fancy font fonts \def\FF{\f:9} \def\heading#1{\vskip 20pt{\bf #1}\vskip 10pt\par} \def\subhead#1{\vskip 20pt{\it #1}\vskip 10pt\par} \def\tex{{\rm T\FF E\rm X}} % define some usefull strings \def\metafont{{\ss METAFONT}} \def\tm{{\FF TM}} \def\cr{{\FF R}} \def\pfont{{\ss pfont}} \def\describe{\lftmarg +60\indent 0\indent -60} \def\bold#1{{\bf #1 }} \ctrline{\bf User Manual for the \macname\ Macro Package} \par \fetchman nt. \bold{blankline} Skip down by the number of points specified by its argument. \bold{style} The argumentpackage. Second, do the same thing as the first change, but vertically instead of horizontally: have tex do its own pagination. This would fix the \example{eject} kludge mentioned in the user manual, allow footers and headers to be done reasonably, and is necessary (but not sufficient) for adding footnotes to tex. Finally, the major change. This is the change I was reserving for version 2. Go look at the source code: you will observe that the \example{processtext} function is the entry point for what amounts to a recursive descent parser for tex files. To facilitate macros and such things, the functions in this parser expect that one of their arguments is a function that will return the next character in the current input stream. This parser needs to be changed so that its output can go somewhere other than the output file, by giving all the procedures a functional parameter that you pass characters to be output to. Such a change would allow such things as footnotes and endnotes. In add\subhead{Introduction} The {\ss Scribe} macro package is designed to give the tex user some of the convenience found in the {\ss scribble} text formatter. The {\ss Scribe} package consists of a set of commands borrowed from {\ss scribble}, using the {\ss scribble} philosophy. This philosophy dictates that the user doesn't want or need detailed control over what goes on the page. Hence, there are a set of commands that generate environments similar to things that people like to do in documents. These environments come in three flavors: inline, vertical and switches. The inline environments take an argument, and cause no vertical spacing. The vertical environments start a new line when they are invoked, and most of them don't take arguments. The switch environments generally don't take arguments, and don't generate new lines. All switch environments change the current typeface. In addition to these commands, the {\ss scribe} package includes all the math mode commands listed in the section o correspond to the pieces of a document - headings, quotes, verse, addresses, etc. Some of these commands expect an argument, and act only on that argument. These are noted in the following list. Those that do not take arguments cause an tex environment change, and should be have a pair of curly braces to designate the text the command applies to, like so: {\ss \{\\command text for it to apply to\}.} {\describe \bold{center} Centers its argument. This command starts a new line for its argument, and a second new line for the text following its argument. \bold{majorhead} This command prints its argument in the {\ss B} typeface, centered on the page. It leaves 2/3's of an inch above and 1/6 of an inch plus paragraph spacing below its argument. The piece of text that follows this command will be indented as a paragraph. \bold{head} This command prints its argument in the {\ss b} typeface, left justified. It leaves 1/3 of an inch above and 1/6 of an inch plus paragraph spacing below its af the tex users manual on math mode. This only includes the symbols of general interest, and not all of the math mode commands normally available. If you need these commands, use the {\ss scribe+} package. This contains all of the math mode commands listed in the appendix, except for the script characters. \subhead{The Switches} The switches are commands that change the current typeface. These are: {\describe \bold{r} Change to a roman typeface. This font is the default typeface for the {\ss scribe} package. \bold{t} Exactly the same as the {\ss r} command. {\ss t} is an abbreviation for {\it text}, which is the default environment. \bold{b} Change to a bold typeface: {\bf that looks like this.} \bold{i} Change to an italic typeface: {\it that looks like this.} \bold{s} Change to a sans-serif typeface: {\ss that looks like this.} \bold{B} Change to a large bold typeface. This face is used for major headings in the scribe package, and cannot be gotten to from the package thrgument. The piece of text that follows this command will be indented a paragraph. \bold{subhead} This command prints its argument in the {\ss i} typeface, left justified. It leaves 1/6 of an inch above and paragraph spacing below its argument. The piece of text that follows this command will be indented as a paragraph. \bold{address} Non-filled, left justified environment. This environment is indented approximately 4 inches from the left margin. It is suitable for the return address on a letter. \bold{closing} Identical to the {\ss address} environment, with a name more appropriate for the closing of a letter. \bold{verbatim} This environment is non-filled. Other than that, it is identical to the surrounding environment. It is suitable for including text fragments that you don't want formatted. \bold{display} Identical to {\ss verbatim}, except that the font is changed to the {\ss s} font. Usefull for including program text, or long examples. \bold{verse} A non-filled environmente manual is set in. } % end of the switches \subhead{The Inline Environments} The inline environments all take an argument. These commands generally cause a change of font over there argument, without generating any vertical whitespace in the output document. These are: {\describe \bold{+} The argument to the {\ss +} command is printed raised above the normal print line, in a position appropriate for superscripts: for example$\+{this}$ is a super script. \bold{-} The {\ss -} command is identical to the {\ss +} command, except that it generates subscripts. For example$\-{this}$ is a subscript. \bold{ux} The {\ss ux} command underlines every character in its argument, \underline{like so.}{} \bold{example} This command prints its arguments in a sans-serif typeface, imitating (as best as pfont can) a typewriter. } % end of the inline environments. \subhead{The Vertical Environments} The vertical environments all cause a vertical skip when they are invoked. In general, they indented by 1/2 an inch. As its name indicates, it is suitable for verse. \bold{quote} A filled environemt indented by 1/2 an inch. Suitable for use with long text quotations. \bold{describe} This is an outdented environment. It is useful for a list of descriptions. In this environment, the {\ss @} command is useful for the first object being described. The {\ss @} command causes a change to a bold typeface, and insures that at least one space follows its argument. } % end of the vertical environments \subhead{The Rest of the Commands} The following commands are added to make users of scribble and scribe more comfortable. {\describe \bold{newpage} Skip to the top of the next page. \bold{blankspac} Skip left by the number of points specified by its argument. \bold{blankline} Skip down by the number of points specified by its argument. \bold{style} The arguments of the {\ss style} command is passed to {\FF Fancy Font} as parameters. It is used exactly like the builtin {DDDD@@@@@888@@@@@@@@@`  @800<0 0 0 0@x @ @ `0@@@@@@@@@`` P @@@ 8DDD$ 8@@ $`0``8 ``  p`\ss ff} command. } % end of the miscellanious crap suitable for verse. \bold{quote} A filled environemt indented by 1/2 Translation by Pacific Software SystemsV Optima-sans serif, 12 pt; 2/24/83_ !"#  $ %  &  '()* + ,-  ./0  12 3 4 5 6 7 8 9 :;< =  > ? @  A  B C  D  EF G  H  IJK  LMN  O  P Q  R  S T  U  V  WX  Y  Z  [\]^_ `a b c d e fg h ijk lm  n o p q rstu v w x y z {|}~  xxH0@0D  <@x@ @ D8D0@"88@@ $DD$@@`p ``x `p 0@`@`` ` x|@|@ `@ $D @@`00  P p PXxXD8 @PPP<H0@@8@@@@8x@8@@8@@@@x8@@8@@@x`8@D 8PPP4@@@jejUT%?D@@@@pCx@@<@@@<x||~~0@ H(Dxxx|@@<@@<|@@<@@  ? @ ABCDEFGHI J KL MNOPQRSTUVWXYZ[\ ]^_ `a  b c d  e f g  h  ij k  lmn  o p  q  r s tu  v w x  y  z  {|}~ @  @ @@@ 8D  @$ pINxK\H@80RN00KDk00ED# DDDD`@ pP 0@@0 `` pp 0000`pd@pppPp``p @@ @ tp@ ````dd` ` x  @| @< P$DDD@@H0@@h0H0Hh  $D @0@ @  $DDDdD0@0D $@@@`@0@0@0H 0H,8 h   $@@DDD\d@0@0@xxxx||``p( $$$$  ``P PP P` ` 0xȀ8xDx?@ A B  C D  E  F  G  H  IJ K  L M N  O  P  Q  R  S  T  U  V  W  X  Y  Z [  \ ] a  b  c  d e f g  h  ik  l  m n  o p  q  r  s  t  v  w  x  y z ` @t(0$$d4H @ @ $D @? ???  DD``  ``  @@ @|@B @|0x``0QTafkpuzbf BIO!!INIT_SCSETCURSPRINT: !9DM*= &|ͩ*= &|ͯ|g}o|M*= `is#6T`i6.#6!!! * +|‚!^ ! Ê! !!2! *= &!!͐!! !9!9CEDIT v1.1/Epson MX80 Work File:%-26sNone G@.TEX users manual for tex 7 1k MACRO.TEX generic macro package manual 75 10k HACKERS.TEX manual for tex hackers 13 2k MBASIC.TEX users manual for basic macro package 49 7k MSCRIBE.TEX users manual for scribe macro package 55 7k BASIC.TEX basic macro package 8 1k SBASIC.TEX " without the math commands 13 2k SCRIBE.TEX scribe macro package 53 7k SCRIBE+.TEX " with the math commands 32 4k OPT12.FON optima-like font 59 8k MATH1.FON first math font 55 7k MATH2.FON second math font 286 36k TEX.C tex source 161 21k TEX.COM tex itslef The following programs allow creation of alternate character sets for the Epson MX-80. Submitted by Paolo Prandini, Viale Europe 72/G, 25100 Brescia -- Italy 8k CEDIT.C Source Code for Epson Mx-80 Character Editor 5k CEDIT.CRL 8k CEDIT.COM 3k MASTER.CHR Epson MX-80 master character set GDG@GDChar %s%c%s Value %s%-02x%s>K]bfpw{SETCURSPRINTTOUPPEINKEEXISCANEDIT_MASTRLESTRCASTRCPOPEN_IOPEN_OUPUTCHAt*!9DM!!! !=!a `is`in}XʍCʓNʽEFLʒS!!8 }2= *= &|Һ> 2= !!C!" !f͐"|> 2= ͐"}2= !i! !l!$ w#w͐$! n!! s{=!! n}.R͐$! x͐$~ !! n& s!$ ^#Vr+s͐$~ 6!o!~ !" !~ !> !> !* +|!~ !^ !" !~ !> !> $* +|!~ !^ !'!&9-- X=Exit E=Edit C=Chan F=File L=Load S=Save N=Numb ----> %x_%s.CHR8;@DHLPTX\joty~ 0;HPdvENDEXSETCURSs !9DMd*= & ?`is#r!!͐͐d))`iMAIEDIT_MAINKEٱSTATUS_GET_INPSARE SETCURS OPEN_Io OPEN_OUԓ EX^GET_MATҠPUT_MATlINIT_SCFOUT_MATPRINTEXISTATUS_STRCASTRCPOPEN_IGET_MATAREOUT_MATGET_INP!!9DM!" !" ͐ |M!v!> 2= ͐ ++|`iw#w! ~#fo##~#fo͐n! s{ʷ! n}.ʷ͐> ! ns`i^#Vr+sn͐> 6!!> !> !^ !> | `i6#6͐|C! 6#6͐|7͐)))͐6! ^#Vr+s`i^#Vr+s> 2= * |m* +|d H!9Use: CEDIT charset.CHR .CHR@CGKNR[fs#r͐j!99HhPUTCHA:!9DM!!=͐ ͐ (5OPESETCURSPRINTREAENDEXCLOS!9DM!͐`is#rzX!!͐! !î!d͐ |ҙ!!͐! !î͐!" !î!9Can't open:%sCharacter set %s invalid'5@JNV]jvCREAWRITENDEXSETCURSPRINTCLOS!9DM͐`is#rzR! d͐!" m!! ͐!͐!9Can't create:%s #07DP[eisEX2!9DM͐|+! ^#Vr+s).!$)EX!9DM*= ! s! 6#6͐|Ҧ͐ n`is! 6#6͐|ҍ͐)))͐`in͐|g}os! ^#Vr+s?! ^#Vr+s! ^#Vr+s ! n}2= !9+JpEX!9DM*= ! s! 6#6͐|Ҳ`i6! 6#6͐|Ҏ͐)))͐n}ʀ`in͐|g}o`is! ^#Vr+s:BIO!!INIT_SCSETCURSPRINT: !9DM*= &|ͩ*= &|ͯ|g}o|M*= `is#6T`i6.#6!!!9DM!" !" ͐ |!F! F> 2= / ͐ ++|h`iw#w! ~#fo##~#fo͐n! s{4! n}.4͐> ! ns`i^#Vr+s͐> 6! !> k!> !^ !> E|h/ `i6#6͐|! 6#6͐|Ҵ͐)))͐6! ^#Vr+sÅ`i^#Vr+so> 2= * |* +|ͧʹ͉] / !9Use: CEDIT charset.CHR .CHR!9DM`i6! 6##6! 6#6͐͐! w#w͐|  `is`in}ʍ ʱ     0ʍ   ! ^#Vr+s͐|ڮ ! 6#6 ! ^#Vr+s͐| ! 6#6 ! ^#Vr+s͐| ! 6##6 ! ^#Vr+s͐| ! 6+#6 ͐)))͐6͐͐))-! F! ^#Vr+s͐|ڊ ! 6+#6 ͐)))͐6! F! ^#Vr+s͐| ! 6+#6 ! 6#6 ! 6#6ͧf !͐͐ `ins! ^#Vr+s! ^#Vr+s ! n}2= !9+E]pSETCURSPRINTn !9DM`i6#6͐|]͐!!!f͐!-!j`i^#Vr+s!9GDG@ #/48EJN[SETCURSPUTCHA !9DM! 6#6`i6#6͐|ҽ͐!#! ^#Vr+s! 6#6͐|ұ͐)))͐n}€!Oã͐͐))-! ^#Vr+sP`i^#Vr+s!!9 ,8[sz~*K͞+ '+FÎr ͖ 8{ Ăw#w#w^#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͐I !9%cO!!2!9DM$*= &|ͩ*= &|ͯ|g}o|p *= `is#6w `i6.#6!!! F* +|¥ !^ ! Fí ! F!!2!0 *= &!4 !8 ͐!< !@ F!9!9CEDIT v1.1/Epson MX80 Work File:%-26sNone G@GDG@GDChar %s%c%s Value %s%-02x%s!9DM!!!>F!pF!F `is`in}X C N E+ F1 L S -5!!8 }2= *= &| > 2= 5!!C!" !G͐"| > 2= ( ͐"}2= 5 5!F! !G!$ w#w͐$! n!! s{p !! n}.… ͐$! oҫ ͐$~ !! n&s!$ ^#Vr+sO ͐$~ 6!!~ k5!" !~ !> !> E* +| !~ !^ 5!" !~ !> !> * +|*!~ !^ 5!!&9-- X=Exit E=Edit C=Chan F=File L=Load S=Save N=Numb ----> %x_%s.CHR!9DMVd*= & ?`is#r!!͐͐Vd))`is##z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77!a{   `OE!y6$ -7rBo&))T])))!y! 6##6! ^#Vr+s͐|! 6+#6͐)))͐6͐͐))-! ! ^#Vr+s͐|ڋ! 6+#6͐)))͐6! ! ^#Vr+s͐|! 6+#6! 6#6! 6#6 !͐͐J!9%cO%>QTafkpuzbf r͐!9!9DM!!=͐ ͐ !9DM!͐Z`is#rzˆ!!͐!F!!Vd͐͞|!!͐!F!͐!" !!9Can't open:%sCharacter set %s invalid!9DM͐`is#rzK!Vd͐?!" f!!͐!xF͐!9Can't create:%s!9DM͐|ʭ! ^#Vr+s͈)ð!!9DM*= ! s! 6#6͐|T͐ n`is! 6#6͐|;͐)))͐`in͈͐|g}os! ^#Vr+s! ^#Vr+s! ^#Vr+s! n}2= !9!9DM*= ! s! 6#6͐|`i6! 6#6͐|͐)))͐n}`in͈͐|g}o`is! ^#Vr+sÚ͐ `ins! ^#Vr+s! ^#Vr+sÀ! n}2= !9!9DM`i6#6͐|x͐!!!F͐!-!F`i^#Vr+s3!9GDG@!9DM! 6#6`i6#6͐|=͐!#! ^#Vr+s! 6#6͐|1͐)))͐n}!O# ^#Vr+sÜ! n&j`in}I! ^#Vr+s~#fo͐ ͐?s#r! 4͐n}]! n&jÜ! n&j!9!9DM͐͐ ͐^#Vr+s͐ Ұ͐0ø͐7s!&͐ ͐͐ ͉͐s`is͐ ͐͐ )͐s`in&#&!9!9DM! n&0ͯB! n&9ͯ!9DM`iw#w͐~#fon&}ʓ͐ ?͐^#Vr+snѯg`is#rT͐Ú!9!9DM! n} ͝! n} ͝! n} ͝!9DM͐~#fon`isͣ|͐^#Vr+s`in& !9!9DM! n&! s͠|N! n&sv! n&}q! n&sv!! n! n&+ҕ!Þ! n&!9DM! n&|ͣ! n&8|ͣ!9DM! n&Aͯ! n&Zͯ    > _ &7*+++:G_*DM!Qo&*7,2q*&:q):ʖ=ʖ=r:qo&7:)~:,"s!"u*|**s! ~6*u*+"͐͐))-! ^#Vr+s`i^#Vr+sá!9!y9DM! `iͬ`i !9!9DM͐`is#r͐n}ʕ! ^#Vr+s}! ^#Vr+s͐ns! ^#Vr+sn}•͐!9!9DM͐`is#r! ^#Vr+s! ^#Vr+sns{͐ !9!9DM! n&8|<! n&A! n&!y9DM`iͧ! `igf!9!9DM`iw#w! ^#Vr+sn}ʜ`i^#Vr+s}͐ã!9!h9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{`in}%! ! s#r! 6#6! s! s! s͐n}-<! ^#Vr+s! 4͐n}0L! 4͐n&}i! Fl!! s#r! ^#Vr+sn`is{.´! F! s#r! 4! ^#Vr+sn`is`in&}DUX%O.CtSʥ͐~#fo|! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 4! 64! 6! ~#fo! n&! ^#Vr+s~#fo! sѯgs#r! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s! n}¸! 6#6! ^#Vr+s~#fo! s#r͐n}͐|! ^#Vr+s! ^#Vr+s*"*u#"u#7*\!*Z7:)~:,"s!"u*|*uʥ*~#|"*s*u¥#"u*+"i 6  #F#x~#7*:w !\&!:%sGD#include BDSCIO.H /**************************************************************/ /* TITLE: CEDIT Utility (Epson MX80 version) */ /* */ /* ID: CEDIT Version 1.1 30th January 1983 */ /* */ /* PROGRAMMER: Paolo Prandini */ /* Viale Europa 72/G */ /* 25100 Brescia -- Italy */ /* */ /* DESCRIPTION: In any Epson MX80/III or Epson MX80 with Graf-*/ /* trax we can easily notice the presence of 3 */ /* 2716-type EPROMS. The central one contains the*/ /* character patterns of the main set and also of*/ /* the national sets: the content of this EPROM */ /* is reproduced in the MASTER.CHR file (Please */ /* note that from now on we'll refer to every */ ns! ^#Vr+s! ^#Vr+s͐6! ! s#r! n}t! ^#Vr+s!t! ^#Vr+s! n}k!0n! s9͐! ^#Vr+sns{ʝ! ^#Vr+st! n}! ^#Vr+s!! ^#Vr+s6 ç! ^#Vr+s`ins! ^#Vr+s`ins͐6!9!9DM͐n}6! ^#Vr+sn&!9DM! n&aͯc! n&zͯ!9DM! ^#Vr+s~#fo! s#r͐! s#r! 6! ^#Vr+sn! s{`! n&ͣ|Ü! n}%! n! ! n&j! ^#Vr+sI! 6#6! 6 `i6! ^#Vr+sn! s{*K`i4! ^#Vr+sn! s! n&}XyOʂDʋUʱS=C ! 6ñ! 6ñ! -±! 6#6! ^#Vr+s! w#w! n&! #|! n&j! n&! ^#Vr+sn&! s{/͐ ! nѯg?! nѯg! s#r! ^#Vr+s! ͐ ~#fo! s#r! ^#Vr+sn! s{ʮ! n͐n}Ž! ^#Vr+sî`in}«! ^#Vr+s! nsV`in}! 4͐6! ^#Vr+sÜ`in}͐n&! ^#Vr+s~#fo! 4!/* character set file as .CHR, that is the defau-*/ /* lt forced specification for this type of file)*/ /* With this program anyone can easily edit his */ /* own set (even APL!): a scholar used it to de- */ /* fine an old Indian language for his Softcard */ /* Apple CP/M system! */ /* The edited char set can be saved to disk and */ /* later programmed onto a new 2716 EPROM with */ /* any suitable hardware ( I used an homebrew */ /* programmer ). */ /* COMMANDS AVAILABLE: */ /* X .E(X)it and reboot CP/M */ /* E .(E)dit current char pattern */ /* The cursor positions on the upper left corner */ /* of the character screen area and then the fol-*/ /* lowing control sequences are accepted: */ /* ^S,^H moves cursor left */ /* ^D moves cursor right */ /* ^X moves cursor down */ /* ^E moves cursor up */ /* Space clears current dot and moves right */ /* 0 sets current dot and moves right 7]=1; printf("%c",45-2*((x-34)-((x-34)/2)*2)); ++x; if (x>34+COLUMN) x=34+COLUMN; break; case 48: matrix[x-34][y-7]=0; printf("O"); ++x; if (x>34+COLUMN) x=34+COLUMN; break; case 27: txit=TRUE; break; case 17: txit=TRUE; put_matrix(area()); break; default: putchar(7); } setcursor(x,y); } } inkey() /* Get single char without echo ! */ { return(bios(3,0)); } status_line() { int cm; init_screen(); if ((caract<126) & (caract>31)) cm=caract; else cm='.'; setcursor(0,0); printf("CEDIT v1.1/Epson MX80 Work File:"); if (yes_file==TRUE) printf("%-26s",filename); else printf("None "); setcursor(50,0); printf("Char %s%c%s Value %s%-02x%s", INTOREV,cm,OUTAREV,INTOREV,caract,OUTAREV); } get_input() { char opt,filenout[32],s; int value,j; setcursor(0,22); printf("-- X=Exit E=Edit C=Chan F=File L=Load S=Save"); printf(" N=Numb ----> \b\b\b\b\b\b\b\*/ /* ^Q exits edit mode and saves edited char */ /* ESC exits edit mode without saving modifi-*/ /* ed character */ /* C .(C)hange current char waiting for any char */ /* N .Change current char waiting for a two digit */ /* hexadecimal (N)umeric value */ /* F .Change current default (F)ile name */ /* L .(L)oad char set file using default file name */ /* S .(S)ave char set file using default file name */ /* */ /* HISTORY: Cursor addressing sequences for ADM 3A */ /* */ /**************************************************************/ #define COLUMN 9 /* Character matrix width and length */ #define ROW 8 /* for EPSON MX80 */ char matrix[COLUMN][ROW],caract; char file_in[32],filename[32],work_file[32]; int yes_file,yes_exit; main(argc,argv) int argc; char **argv; { int i,j; char c; yes_file=FALSE; yes_exit=FALSE; if (argc>2) { /* If more than 2 parms then error */ printf("Use: CEDIT charset.CHR\n"); b"); printf("\b\b\b\b"); opt=toupper(inkey()); switch(opt) { case 'X': exit(); break; case 'C': setcursor(56,0); caract=inkey(); if (caract<32) caract=' '; break; case 'N': setcursor(67,0); scanf("%x",&value); if (value<32) caract=32; else caract=value; break; case 'E': edit_matrix(); break; case 'F': printf("_\b"); scanf("%s",filenout); for (j=0;((s=filenout[j]) && s!='.') || j>strlen(filenout);j++) work_file[j]=toupper(s); work_file[j]='\0'; strcat(work_file,".CHR"); break; case 'L': yes_file=FALSE; strcpy(file_in,work_file); open_in(file_in); if (yes_file==TRUE) strcpy(filename,work_file); break; case 'S': yes_file=FALSE; strcpy(file_in,work_file); open_out(file_in); if (yes_file==TRUE) strcpy(filename,work_file); break; default: putchar(7); } } area() /* Compute address of working char */ { int s; s=(endext()+100+(caract-32)*9); setcursor(5,5); s=s+4exit(); } printf(CLEARS); /* Clear screen */ caract=' '; status_line(); if (argc==2) { /* Get work char set file */ for (i=0;(c=argv[1][i]) && c!='.';i++) file_in[i]=c; file_in[i]='\0'; strcat(file_in,".CHR"); /* Force .CHR */ strcpy(filename,file_in); if ((open_in(file_in))==OK) status_line(); } /* Initialize current char matrix */ for (i=1;i<=COLUMN;++i) for (j=1;j<=ROW;++j) matrix[i][j]=0; caract=' '; while (yes_exit==FALSE) { if (yes_file==TRUE) { get_matrix(area()); out_matrix(); } get_input(); status_line(); } } edit_matrix() { char cm; int x,y,txit; cm=0; x=35; y=8; setcursor(x,y); txit=FALSE; while (txit==FALSE) { cm=inkey(); switch(cm) { case 24: ++y; if (y>7+ROW) y=7+ROW; break; case 05: --y; if (y<8) y=8; break; case 8: case 19: --x; if (x<35) x=35; break; case 04: ++x; if (x>34+COLUMN) x=34+COLUMN; break; case 32: matrix[x-34][y-*((s-(endext()+100))>>8); return(s); } setcursor(x,y) /* Set cursor function , modify for your terminal */ int x,y; { putchar(ESC); putchar('='); putchar(y+32); putchar(x+32); } open_in(file_in) /* Read workfile in memory at endext()+100 */ char file_in[32]; { int n; if ((n=open(file_in,0))==ERROR) { setcursor(24,0); printf("Can't open:%s",file_in); return(ERROR); } if ((read(n,endext()+100,16))<16) { setcursor(24,0); printf("Character set %s invalid",file_in); return(ERROR); } close(n); yes_file=TRUE; return(OK); } open_out(file_in) /* Write workfile present in memory from endext()+100 */ char file_in[32]; { int n; if ((n=creat(file_in))!=ERROR) { write(n,endext()+100,16); yes_file=TRUE; } else { setcursor(24,0); printf("Can't create:%s",file_in); } close(n); } int exp(n) /* Compute 2 raised to nth power */ int n; { return(n ? (2*exp(--n)) : 1); } get_matrix(pa) /* Load specified memory area into character matJb{j*Jj(`h*hj*{jnzJ#cjjjjjnbczc:sgCoFG5CEGGGFlgCCCoF8BnBj8jJG jjoC8j(jGChOBzB{CECoBnB*8~jC8MW(`b(oG( knBܗ"j@jh*j`hn "nnHjkkjz@nJ@kjjjznGGGWOoM@oWEGBZoFnGOBGC{Gy8zǸ8~8~G(8GCG~GBoGGzo@F{B׸{8kGר Kn5 5`jj5rix */ char *pa; { char cm; char scratch; int i,j; scratch=caract; for (i=1;i<=COLUMN;++i) { cm=*pa; for (j=1;j<=ROW;++j) matrix[i][j]=(cm & exp(8-j)); ++pa; } caract=scratch; } put_matrix(pa) /* Write back character matrix to memory */ char *pa; { char cm,scratch; int i,j; scratch=caract; for (i=1;i<=COLUMN;++i) { cm=0; for (j=1;j<=ROW;++j) { if (matrix[i][j]!=0) cm=(cm | exp(8-j)); } *pa=cm; ++pa; } caract=scratch; } init_screen() { int y; for (y=7;y<17;y++) { setcursor(33,y); printf(INTOREV); setcursor(45,y); printf(OUTAREV); } } out_matrix() /* Print out character matrix */ { int i,j,y; y=8; for (i=1;i<=ROW;++i) { setcursor(35,y); ++y; for (j=1;j<=COLUMN;++j) { if (matrix[j][i]==0) putchar('O'); else putchar(45-2*(j-(j/2)*2)); } } } PMXList =0 2060 P=0 2070 RETURN INT "-------------------------" 1660 END 2000 Z=4 2010 S=6 2020 C=0 2030 C1=0 2040 Q=0 2050 F8gW8CO(OPgH GG@OE@o(EO0@gSGG'@ו0GDGF0g GWOOGGoGGWGWGWCoGGGGOWؼGWGOj*hn SEND COM TEXSEND AQM TEXSEND COM vTEXSEND.ASM:  !"#$%&'()*o+,-./0123456789靡39d")"V* țK__a/ifvFlB/4ǿgEUJll{M "fM/̉)_/ln1JVNؔ؀rb R+aN/ Πظ)*9Nq R+a'~#NvJI6ftX\ 1:Ep'_1l̘S%$Sۘ')[l#)S]_œ*)f2`cNzQM3|MJIJq1 Uv7a݃bx}B !1lNnH  [K%= goL_oL_Viॾ' U)ITJ`qv:7Y6ҥ,Xp(uʶ=a^ĞCJH6xiKiRZl(fTJxJA1u ؀b "tZ)T0 a0/%I;]J56cFlKʞ㗒 /*v:@3̌9Ur-v:?m,`Z/mIrR1f";SH3aH5xyby(ԌmAntMUt<3Aeg~cP1f UALL, MYTE ETC) you should now see your modem program command mode prompt. YOU TYPE : R FILENAME.TYP where filename.typ is the name you wish to save the file on your system under. (NOTE: A DRIVE NAME (D:) IN FRONT OF THE FILE NAME IS OK) the transmission of the file will begin after a short delay and your modem software will beep and alert you that the transfer is done, when the transfer is completed. --=-- For more help on different transfers (.lbr type files etc) YOU TYPE : XMODEM and you will see a menu of Xmodem.com options. <--- STOP INSERTING HERE, DO NOT DELETE THE 00H HERE urx7iKG¤84ٙ~Dvbϛ,f_ U%,fA/)KbcFѠ`H )xy~(՘la"~,kimgxIB4]cFlHL$~v)J=E Vbn]lgdqV,>~-!1w,"I[8/2{lRTr⊋ڕKޥ5E%jWuNp| H1R UlHQ1.fs0o$xɻ4w"߯~ ^.͝u>Ii&˔a"'^i\Ksg5Dð4lJ׳K=) ls%"ú93̌Av% Ke;͂ FJLNNm{$E$xo M"w{y2!X~+_-&!-+# INSERT MESSAGE STARTING HERE --> TEXSEND.ASM,.COM THIS PROGRAM IS USED TO SEND SHORT (100H OR LESS) MESSAGES IN ASCII WHEN THE TEXSEND (RENAMED TO YOUR NAME) COMMAND IS TYPED. IT IS USEFUL FOR SHORT HELP FILES YOU WISH TO DISPLAY ON YOUR MACHINE, OR ON REMOTE CP/M SYSTEMS. TO USE, MERELY INSERT THE TEXT YOU WISH TO BE DISPLAYED BETWEEN THE "INSERT MESSAGE STARTING HERE --> MARKER, AND THE "<--- STOP INSERTING HERE, DO NOT DELETE THE 00H HERE/* test program for epson qx10 clock routine.. */ #include "xpm.h" char *locst; /* used in QX10 routine below */ char time[10],date[10]; char buffer[128]; main() { readclock(); printf("The time is %s, the date is %s\n",time,date); } putchar(ch) int ch; { bdos(6,ch); } getchar(ch) { return (bdos(6,0xff)); } readclock() { locst=(char *)0xc900; /* copy to easy access location */ #asm push h push d push b lhld locst_ ; get location of bios lxi d,45h dad d ; add 45h to it lxi d,qx10cont ; put address of qx10 routine cont. point push d ; on the stack push h ; this one gets returned to in a sec lxi h,buffer_ ; address of where to put the time/date stuff ret ; and jump to read clock routine (top of stack) qx10cont: pop b pop d pop h #endasm clock_ascii(time,date,buffer+4,buffer+1); } /* readclock */ clock_ascii(t,d,tb,db) char *t,*d,*tb,*db; { sprintf(t,"%02x:%02x:%02x",(int)tb[0],(int)tb[1],(int)tb[2]); sprintf(d,"%02x/%02x/%02" MARKER. ENSURE THE 00H END OF MESSAGE BYTE JUST BEFORE THE STOP INSERTING MARKER IS LEFT IN PLACE!!! ENJOY IT, AND FEEL FREE TO USE AS YOU SEE FIT. REMEMBER DELPHI DATA SYSTEMS, FOR YOUR COMPUTER NEEDS! DELPHI DATA SYSTEMS BYRON A. MCKAY PROP. P.O. BOX 391567 MOUNTAIN VIEW, CA. 94039-1567 <--- STOP INSERTING HERE, DO NOT DELETE THE 00H HERE !X~+_-&!-+# INSERT MESSAGE STARTING HERE --> To send a file from this system to yours... YOU TYPE : XMODEM S FILENAME.TYP where filename.typ is the name of the file on this system you wish to send. Xmodem will respond with a short message stating the length of the file in both Kbytes, and Minutes and seconds to send at your current baud rate, then wait for you to start reception at your end. YOU TYPE : ^E (FOR MODEM740, ^J E FOR MEX, ESC E FOR AMCx",(int)db[0],(int)db[1],(int)db[2]); } ؟ zW&j:&uE?IeL6(b J 뮈tpFߕ.C F<|k: ]@$`CxMBI"rӁx70QBJ.6Ƹl~S2_{\ ol~ !+"7w }iVxtgVYUʦ&ĨM2SuCY1d˨'P}O 1?'0_0/B';V$J11V0_ٝ@W5$+7 o 1ƕDn:̋Ogwƀ_ -ʬQMl^;'e21!+}W~|NT6ۥLWxc @Bi2j 'F5A猘7J){c@Vz%BW2x~|żmnl^~cos|j+]Đ_g󓢁%zj~]ch7]"7ha~׊!00ă洀~28.P~c\5{jz͋y1WݙJ@:B/a?=3؇?ͭC(1V"ғBs yVOJsRZhnB0iݙJ@y!z Mn;[ 0:B/a~o% Vu^¼~=3:@Æ0p23ؐ<,aCK?o% öH^_ٝħ0;;[vETIMEDATE.ASMO  "!#$%&(')*+-,.0/123546789:<;=?>o@BACDEGFIHJKMLN~0ɯvCr4hU[N tb^,0Ÿh;h;5X?x oټKⅧA$&q0/HҠ1}MW>CL[_ǘ^rSZ6/4џbtRe:bj "n;B/$ Z͋y6K8åz Sb^nYM22/ż|1x)#ώ/Uy1yvL6^jMu3;&/'b^Nq`E_^Z?GF۠FĊ˼gdEJ14VS6_vy+GXMU;y1/rS Rż4]ft 1fbު1]QΘ*'F5]rE9#UżUQ7?IW'1(o 1Z_i7]@_ Va~/WHܼ 5kUTa~KdV2#US+U̘*́V6qW2W]u͋c F5]b~bT-n2S7?vJ0?kTj'O }惣ݙJ@ Xgwi;;[ >B>z sbvg~+HiG>z&^ɘݙJ@-?I0o>3OWL: b93X[$^ϤK<3M^¼Q;[}QcV1>oh~MnP?oFm^cR;[} ~m~ '6Vcp>5Շba~'VoX^mc^̏2'H70QBJ.6Ƹl~S2_{\ ol~ !+"7w }iVxtgVI|:/d#d'_Wd}C2_cz+|f8]d"]L.Ȩ:y10Մe~bT TyOe~o.ͭh;>oX-_@oSSh w63a~ Y_r &qO8;iuzcRw ߨjZDQWk:淿9w寅(b J hC3Tos|j+]ԇAe~Ma+5!昨d~R:*ԇ xP6Ƹ"rӁw̋O N]N) cR'IJ}6؟I A` @@0}ԕS m>7GBRhO .bb<>I7B?@ABDCEGFIHJLKNMOQPSRTVUWXYZ[\]^_`bac[hb܌ir)N#s̔fYkdVځ9-41gieFw2@ϻ652?n4Y0~;t~fe̊*j;4Ճq‱K}p, )4ITk2]7?kD`UvnLoPGFDL[KTiq LftD:%Z-%:nZeJ3ves\Fn-ez֪פr]ei;]qHW3MfzST?%k3]wUG9e)Ԉ)nq_Z"KTk2Oɦ)7?ׯfqMN3;S p M;oZy SS-4&U=k,kؔ&⪎6R3(p<ĸ*MoQYPmt tĸf_הwKC:3G[8[hb\7S;\]z̪+?Bem*4tk+fq02Bqe{~@erv}F")ԃ &ƍ~]Sy\-4oXBuw:ϫ,tDBQFFw3mF^Gzw<,=e~3۟$_k?\yE-NkwurGwfwsR'"PŝH?n֞[y :~x? Xon [ywUٮ{=o;uK +zπ|b{uOE4xιNNHVM3˻*uYL|ONM+?8EM(i,.:w)߷+V-$^۟v U/|Pǁ"utg\^[οk.N_ k/"s󊚀uXsqU/|͇ÚHgdָk$cϵ f?<e[NDATYZ{?~G:#z@ZYZ{ q^?0Rϻf7k%|Ynwʸt)J=Bq& r4k躦R.k1˔6Bjy:4Qrtiܡmfg\u)nq:cW3̕ vƝWNY X[8[hbL.wY2Xj݁>ZB^9jw^WNY нnfw~yљ) 8=n[KWusFJ#sI=)Z26[yiz(CII\,sXOo!(- uKwesѹ ^Oo!()lacK{ No*TV;#d+<)Z|bl2e6+tiv7Z^Y4:䓢[OA:4_J7;8ڌ}2fWE-BuHh$cu}*jnA;L庶̦r=P]O{-B>q (i,srR[WB,J˻ў=7KkCc{$T">)Z|"q C(i,fiu6_up xw:Bhy[ꨲ]:,Z'ER=2ȹtz#s;tp I-䋼Tўߡ;tW.'EOy C#s度E9},WUƬ8@h0_{r͢ϕ<)Z<較tY-hE[8\W\הw(ʘ< Oo!ӟEڎo}3:NI-䧐GwYƞt8hliYyRx )5p=}]z=]:䓢['5?N%5We|y=Xp pmyѯ1E9},7Kky=[Oq ˔fNcwjWr ݜQ%oͥs{Lnz tcVFzFhdng\yEͽZ-v]J [hWNߕq٥T{SmtwR= M7fkIK=/]tg܁]NÔwR`<V?Ȟԃa8"@uFw9!"ŤRswg\5ne(OoD#θ򊚛ټܝټ$1]of?c̢-fiu6;K'7^4'?12Yey) 12Wk {KIsBπ߷R3]KD9!"STw~3פpѸ+\72z^Qf>Ah|n$Hҩ\=,`ߩ{E|hGk$cUٮ{=~!4LKў= S+}4s3藉L%;uI[DHoߩO"wdK/ Hr\3k<[yWuf,o!㖆N]yEe|y=Xzs+粛\o!];wLoi]-esBڪify]#z(Ylm!W+4{o04=YZ]iTׯ=- uWΥΌ̭`gd6e~H;jFCTJ#/FTMmWHA4ҝqo䴖 &2:w2ck%IڢONπxgw,ݝquli]u}Fw,[Ο+}%3Wg'?~k%I"@6RPo9k#㍜;,j,Uӹ]@/&'fK-.֍~ΌQUݜFw]S^-dw]KΌ <)Z㏥w{םΓ[;7p1LY|V?]]Ҹ뺀Γ[?X-B~^L{othmc ˔ۡotw\ǜ׃Uݜt_@3YoXyy#2X:uVN?XZK\Yy7|[.8Hgwc,ׯn!roڏ,M˾tGjr2e;ܥ WVpRsw;fQ2Oz>'߰곸swnp]ms2g?#<,"??75y?<e[}Ioify7͢|b׊f.KzNS?fQX\Ju-)p+?,=k]EIcyo9s8'h蚹z3~yMo9:9 r4|H5I>> {T-5s]~k^Դ6r2N+?8EY4wR-)|N,t0~k %,Fw|n _a8:;ϕ;W^f9!%Tgq#5jyYZ{2u> ?Ol:D[οkNj;,/7?+'u,J {WN ?W#{Z5tcO'|SsuN }>QƏZΝq*~3ۓJG~~!^9dfjg~!2ku{oZ{E$-;G|1ړify?^Qf47x}'鏖N_&9|'i_zRf7? Zy?R}2>z >v]C sBu ǁ-K-o^_8. 2idngyEM!<Հ߷Ro>$OZ'_Y }+> lO*WuMy_o's1ﴽ\HV+S Q-4sU^Y9!UNW&Jx4Un!ezO_hh O}sB +cm97Kky=k`͢'r@?{2o}%f;f,@/VqKC؝q]ܩSo+B- lD4}s(7'R~i:0¯Gҕ@u}^F`E@ 7_}"jz͝,WޜF|Nlj?:0Vev7ǴVW6I[#7]ZFnp k5_ߟؾ"D1w;F̤w<2E~[~r\?2ȹ3m&g&'J O+Oπ/5hOƞ;7&rp0~o%Bx2yϕ@րrR>;O!?F{2,zͱ?;?~"v_~"v2a8ꕓ"s}+DI|%Y\i| 1c_u>KN禯n!ip ON+->;oa8ʏ>.o9l+x?n;UFץw>'߰ N*/'WVWm''7 eo9$ -;?F{2TMV?A34n`rf~rVPl?RpE1wW LL[_ ܝ;wmi&]ΊAݹuK~3;M 5]bw㥥QJzy #Styk:f3OT 4-LowR/AmwʍK|Na3qLԪA~j0 O5'J , _#W/e|.F6K]n֞2;Ίot7=֖F^k,b vj]v3Kgd^m Hإwe73w{N7oX42wp,@nm9$,nrAh|nW8`$\?QO!?,tVso[:L@@j'7؞;}jϫyx"OO mt~dtk]niu]OgȏYy_:uV| 17܂HKj,㍜[y׽7;'? Z}sosK#ϫyx"?< XyEB> ?)rB6o>AhŚ讼2:wY-"4xI[D5 wz}HOg d ȝ>[^w: nπ|b{"~e~V_A~:~x"|WIBa8|nG9W/etvo95sUGa8Jܝ裝W LL[_ SH7̖W3{t_W5yr~SoV|HZKL핪1ړ̴ָk2ʔ>a8jʏ;7GkK3&g&-/mi| jwmi&1ړ|^_"> cV|藸>y%f| 1GkK3馯'흚OWf?U}~jBE |Hn` Og` +n~r5Io>$N Ԥ~e95-_ZCIԀ¯S}$V|:5 PsB%T߷Mj0i={n*֦~e1ړfWNgX[ο& [~*_F{2pE$xt_[Io9Rjl'c LL[οw~d칩X o-LG2~rV'oO#0KTkRMz$3XWᷖkK3)-/TJ:X-d칁ə I{\J6-6U*[,bM*Rq`=+)-/TJ:X-d칁ə [KǁkK3)-/TJ:X-d칁ə I{\J6-V4 ?X o-fQt*_F{2p#Y][Io9Rjl'c LOg?[T; ෧SQMݦw{ 7ؾV~t44f7+cV|wmڳv e[tF=G=~!ds)Kw2nj2nt7Np.-ϝo>)~ӫky$Og d Q nYjyM7Kky=Fmez@"a86.-ϝo~$8C_WCܩGRZsf`zu{o;G|p ߷?wȝNGy>O$+B-';|b{t:j/5 Hm4kr2RkKKu{o@Yclt,];m/+j2%hr2l֞Ffqfn4tv׸{ne N@nrosi}v5,=k\ }~/~3ۇE'E Oof$I7}XtR$ם7}XtR:ׯkj4tn'cگe73٥ W'p o>$ #U>Ȼ3.㍜ify:-soڎ`2fW`o(wFf]ONg'b /&"W[ofR5|Na5?;߷?wjTѹ<)uXUɩ"W[of/䏔7=I[t"a8nN7~i`K]U9^|-:?Me5oXIYj[Ο;p*B(z ^}} }Wd_o\j]㮖Gϫ"W[ofU\w_oOJRtR0~k-ϝoa8[Ο;u|Na95?;߷?wjTq^:׸{L_]_Fq@րBT߷@Տ` 6ړ&g& Rկ᧖1Rsg\M3c ?i߷YĚT_ k@@lW? 7.q"?erLəTII6U{Rts[#O(B:ؙ?;wﺥQw¯ީ L4rY _3] "FN/;wF斉F쌫:ڡ{,ǵ4뮡7IB$_Zq(][NSn5tYgkRpCQu4F{2qX{o9s8/5 tFswH3.Mn_t3j7QN*/WCCVjȷՐ?"~5'|~5[qWC!׀_ 2 Ր=}unGźGźV݃YXMmob]C+WQ.`ͶźbvyT ؊:s6ź|usyu]%Qu}.ISTu+fwX!O?hjUyՐ$WC~Y~5!Bր-}T xPN_{2Gźھ4GźCw@^b]!:m{b]~unǛ@:mQ. Su.ź?nfzZ`WFy4nѦ.W%o:hQf`X]%efYqX۵z[ "u_,ޱxwwI9_G|Ú6U kp:θaX]ul4;G] ~u.aʻv_{er{~uiF^jm;_{eٽ-nfz68]-T8.Ww,5u @1М>VZekLyWѝ=k9wY^j4ZyWϝvT߽?ZF1]g*]kjGǹtߦ;m/n+)_,ޱxnπ_rqI¶J<< {w=~u.)T8˞r A public service announcement from the Tampa Bay Bandit Board RCPM I am often asked, "What's a TWIT?" ... my answer is: {}==================={} || A "TWIT" IS A || {}==================={} Caller who keeps signing in with phony names to get another 30 minutes before being asked to sign off. Caller who won't bother to TYPE the .INF (info) files to find out how to use the system properly. Caller who insists on TYPE'ing files endlessly, especially useless ones, like the LASTCALR file, XMODEM.LOG, any programs written in "C", and even *.*. Caller who does endless DIR commands and never echoes anything to the printer. Caller who tries XMODEM R to send a file (about 50 times) Caller who keeps trying to XMODEM S RBBS.COM or other .COM files. Caller who doesn't know that CTRL-C aborts almost everything including DIR listings and tries every other key instead. CaQ;Xu{>J˻}r8hn!{nπ[H}unSZ)Y~- F {nπ_ԾxJ8Kgdhҩ[:u:/XckHA`uM O*%A_,ޱ5Cu{xn"lǔwOJne"t^xbcu0S܎)ԃ"tt.WRkNTu:/Xck&EdM:7ѹ]-: `mWt?ty;RatLN}uN@3._Jѹ2RSwx[:Ə]nθf)]jZk|u4s5]7G;H3.Mn_2n!D@G|;_9Oڪify^9-u9ɩyfwU^L4r^&Jxr^G#{v뗉F^ꯜ'h$cUٮ{]̢-¿rD-"+ Nj?f,ҥSgŗF,tr>u?RFgw7cvoY~4NW?RFgwڪify+n} j "zPM/ ~u.aʻv_{er{~uiF^jm;_{eٽ-nfz68]-T8.Ww,5u @1М>VZekLyWѝ=k9wY^j4ZyWϝvT߽?ZF1]g*]kjGǹtߦ;m/n+)_,ޱxnπ_rqI¶J<< {w=~u.)T8˞r ller who repeatedly tries to TYPE .LBR files, and leaves messages asking why the machine won't let him. Caller who tries something like this: A0:SYSTEM>apple //e with a hayes card and cp/m APPLE? A0:SYSTEM>yes an apple //e, what's wrong with an apple? YES? A0:SYSTEM>yes, I said yessssss!!!!!! YES? A0:SYSTEM>list LIST? A0:SYSTEM>load LOAD? A0:SYSTEM>fre FRE? A0:SYSTEM>run RUN? A0:SYSTEM>menu MENU? A0:SYSTEM>exit EXIT? A0:SYSTEM>quit QUIT? ++CARRIER LOST++ and calls back several times each week to ask the same questions. Caller who leaves a message on RBBS and says you should have a message program on the system so he can leave messages. Caller who discovers CHAT and tries 300 times in a row to summon an operator even after being told, "Sorry operator is not available" Caller who tries every possible combination to change user areas and just can't seem to remember to use the colon ":" Caller who leaves a message on RBBS asking  -03FEB85 ALL COM 8READ ME oWHATSN01AQM _}WHATSN01COM iRWHATSN01DQC%(XMD AQMDXMD COM dW-02FEB85 ALL-01 COM 8!9"1:2 >AA_  h22#R2#2::<2::@x2 j:`2*e: z.'+ʚ::æ`4´:x,ʙxɯ2::<2:O: K_4 44C4K4XK ++ ABORTED ++$+~\ O:0ʈ1ʚ5ʤ6ʮ SYSOP to please leave out a copy of BASCOM.COM or MAC.COM ... etc Caller who leaves complaints on RBBS that he can't send you his new universal debugger because XMODEM won't let him leave a .COM file. Caller who, disgusted with his inability to use the system, leaves a message to SYSOP telling him that he should try a really good system, like the APPLE-based one in New York that has all those really neat games on it. Caller who ignores repeated notices from SYSOP that system will be going down, then calls back immediately, and for the next 2 hours only to be denied access each time. Caller who complains about the FREE service offered through the RCPM and tells you how you SHOULD run your system. Caller who ignores the fact that the SYSOP is trying to tell him something by typing on the screen and doing or CTRL-U's. I MEAN LET'S FACE IT FOLKS, IT IS "OUR" MACHINES THAT YOU USE (ABUSE) AND IN THE FINAL ANA 11ý 3õ12õ2400 bps     :_ :_*~D#~ **"*#"#~D~ /h:Q  :::  D/U Filename Size Speed :ʽ  Date Time Uploaded by  Uploaded by Date *O/OO/ [End of listing]$  ++ FILE TOO LONG, NEWEST ENTRIES LIKELY NOT SHOWN ++ ;_ ++ NO NEW FILES ++$XMODEM LOGWHATSN01 is really two programs in one; change one btye in the .COM file to get either: 103H 00 displays XMODEM.LOG in reverse manner, last first 01 displays only uploads, replacement for WHATSNEW.COM The first option could be called ALL.COM and put on A15: (with other private .COM files) for the SYSOP's own use (or A0: if you don't mind others using it.) ILYSIS, WE HAVE THE ON/OFF SWITCH ... NOT YOU. C#̈%3#4g5AfŅOlz+9ՍWdP5쌳{ ,xo(f7^(5pW&gY~{:Ȗ*PE4R Q챑 rFBíy9Ucv CYCLE.ASMS o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRfIŀ  o -VҷO Mt;MҷO MtMG :KzQ5.}Di9eX n6,jY"E>v [W\A& vP bMY~!ASvalSFMp'x宀_TølSO+) *F׺#th!ާhcؤ6 4A^5P)P ? 5: L ޡ7) ?Fn,.~ťW rjA pBdn,Ό]?r+KQiDG؈^d$']|A^se0P #[_#h"DܢvOhOc9\sq|@'8NUQ}{,0x{2,jm:!MòD]!MORj9e!M˘rʧPiò(UR܏xexj&u>Գ 4a_#;rmp&,@-%Vᕥ0G5#%*2Z6i8!+!MOpVo >xHa^0RɼR/Ekuc/B);0E/>B3kXYKaexexEㅍ-6uXp8sj/0;YKQFp eqi+ի')/.y1 f K`+<,2_^%=ރwWR=M̩~-Xwp'xY Cxy`ϡe=bpj2p^NAkwrW0Rygek3CzcmVmęS{)!/в[OmęS{)¼F {XmR5Z4Z#Ţ nę+!b 0\X0W'! aH}dJTxXeJ{آn&!㙵cXݲƯ/) Ԇ֍vF R) aIk~c3WVg)X]a^>Գ"DwbUݧO&^kR) O7Gr +P?2z7Ԇ[OR) 5.٤Wɶ~vw53twOߤ0RHaMʸVm젵ǯgR) ߱v}6g]~zӟa/gmUIa0*£O9@an2(˟'~n6 -80Rlk\I=[ﮒm k7X>}7`/\?coJ #y{HaA ݵo/$gԍg& n#5E' 5!bal=값gԍgVBY\I=/b0eWAEH4xufj̟vWHATSN01.ASM^  !"#$%&'()*+,-./0123456789:;<=>?@AoBCDEFGHIJKLMNOPQRSTUVWXYZ[\]R\I=[һMNˢ̗WIqcXݲwwM #!"bMY~qK) ?') s#W۪ѯ;:)F I6uX;hizo>W\;TVcpKt wrWN &B3kǰe="%;k0xTۣ+/pt1=aؤ6>B3k#1Z Ha"g5yleQKlbޡ-UR"`+MjC,6?C뫊5G0D@ UH1lRZw% Y b73;L=N 0}q%mwp,#B);0E/A>B3kǰe}L6A+ҠՐBYpR\6MpXYyQ' ԆO -ʧb&(O0+,BęIÂ[l^5aA1bʧ`5!AsЗϸVe\CYh-TxXeJ{T>^54Š:Iaga<,2_^%=*_Wu 'YY~yR3:a T#.j޿Ge`#>2CU?+GvPMPH}B1̋vwS^(n0ϨF#Gxe 硪XKa?ሐH}dC;njx3kǰe=JaT38^x: O١ک+) ^[F7I޺$y:$o#_Gd wrWRyO}!2xXeJ{8e5hX3|0R\< D]mp08}7]bp,y{HamF =AЬȋG.䱅P"y =A#bnlo)qC{"0 硪X#f0R{)۲b'b[5?nh^tOKlˢ"yCʼjUp0R\5=eRP=ɨ}NdPw ͎4,JaהՓω jeG,VTeR BjJ #E_&_))3f9#2DžG06V ;DZ zʤzQW$7˙F #aT6MGhVGǐzleQKH}d'2b:ܳ(oTeR$2WVa18eW>Gw̨+TXtXE,a*u9Ʊ>8l+ s #6VwR.B  KA≲qKdPw#+h Z 'Փω je5+TVca3km8fÄȠVa}TP }YO|GVgR).5u9vRmGaBdP I5>mcMU?KAtN/RmGu>+ G~f}RGF`aangt2i?[Pw];R)3ʤ鸞>L 'MD Z>i; uYPʝtE)0R\w״|v<\ j ڈP)XtXE.KYHqᚖOsڎ j-&,X ]NgF5u9L v86XtXEܭێ|VJAIA]$TrGdPslh >baa|v<\ E-BXC5ʧV,.TR #E횺.vT糒`}T|P #ήn줠n:?t,̏jjg1lޥn:/n;YId0>*QY w)F npʮ!hb 0*2#KąNfRP7N :D v߽2Hn3"{VP caaCT8+1(.t`^!GOm9)+f=+,BF MY+f;" c5FgSbg?L Ni?cʧ8AՓlB Yaa)éj mΓJ}!29兂 h{E3KQL?nhȠpD+*]R9?nh;AZh{ESϳ7t&29p!ESˌ7t;A 2Ch[IQ瓛 ȠfF`#Z^0R{)Sm:TʡaR)T[R)v9z)Fz_$TnYBdP7aaWaY*)#4?v,E1̮R1̋AW86ҫ 9^SR-{"S^(CvR)$'הyOdPXCY<,2_^%= -ԍu>{)˒eQKaӜO9A e,|yTn/-'L Z>ͩ<)RP% mˢHa0(6ʧ,,IhLTnq\KAÜqRiNXLeIB۲ȠkxjD (~ЬD3ʧ<{%,IhLTnp&,aK e ҍX eVTnq1y+슣:k) }l0fRP*4PGVPbZRPIA$$ODNY͈|jb9HAÜȠg vPAac}TT^ Z>i;#AZMUė Ka.KY#2j*ۄKA]$TrGd-ԥW:8)˒MId0>*qC #m‚t,Ha~MtNێ|VL aAt;ORP% L Nm‚*mP,.T糒 k[MXFOMORmGu>+ G0_16uX288J }PJ"yh6V>baq`)˒|V G0*ۄKA]$TrGd-ԥۄ;)v9Y0!2lT>Khv B#VY #Ek{|enPUVs8ūFY0ȠqU e/RyV&S"y;Y!DpPVKA)]eRL fvđBaIJ #g7D_78Um5;'-'-=+h x,It^ SܳAIA≺1#2 ūA$%eFI>쥠fKt;geIBu>+wDAA5>*>IA)M+bXb+ORiN1y$2^:8)#, (uYPtP+^Y}Ha09pPVvg`T>e)}9d{(-ԍ\fRP% mˢHAÜqRiNY)uYж,j)TeD=).r^%2+c ,6vDyllVn?hR`Ctk6Ej^IA]$?'RPo.n.B3k4m`HAIQ/)3ʤY)%eF],gD53|Qy6VQ *2)vA}`^!Z5{%g=eRP=ɨ+ƃ™#*¦*"R0R) ^:OQi6' sI1cjap,eTX4AbsXJAtN`xGFF&E }E_&;"yh]<>L #2x#UpeÜ|R,ՓiBd0hS>Oߑ G^F)dTO>'2X IA)]eE #E_&ks:"I5/?sʧTO2'EԬF#op >bKAtї"AR)mOizSi/Mo=RV Z>ͩbVO t /^,3|W>a9n.KږE-}FtAٶ'wD OhvህǁӜ/bFd0'l4;pĢ+*V+)˒eQKAlNDϬŰٰ"8zOd0w $y~n?(d'u9޾DsMHAm~#2Wvj8baq`)pxB7I~n?(d'u9tAٶ';) ~P-N s:<eۢIaȶE?]ӴҖȠgfbi1R SKAbJ{".eIl[wTڮTXJA]$?'D 'v#TB8[b‘rK]?&ߐm~xFl[kSJAbJ4-|"z)Ha WaeSA+ al4?{;8>Fm}^S=^ ZOK))/fםM<䱅X4Abt;m}1+&#}|v/D #6iZLiOdгSV3 W)v9IY/DYѻ[;T>e)O)F ah^0AFmvS^SRfTO>tAn-u9v)Xn:÷tAz-u9~?HA^KA˧9mRP% IA]$Tr'uYPʝeIBu>+wRrJN suu%H״|v< uYPʝ|v<RP% IA˧9m uYPʝtq>IaaӜ)˒|VӜ)v9|V0Rlww5-eIBu>+wRiNpwnS>g^ #z}M˧9mNxxF #ŤH5uY<)R׏~<1) $~, ٤5<+f)ҡ3a1y~LǵtҤ,fF sS # b5|DGk(Φ,bi~MӛzO[)hzS穀7Rвx|̈ &P,rTV~ZJA˧9uE3" CY,lt6e)˒eQKAbJ{)hZLŔRPO0W/?0R)f,.K)R׏~ì,AA_  hgkZ>i;)˒|V0Rl系kZ>i;p,IgN Z>i;)˒|VӜas,IgN Z>i;A $:;)h4xA $:;)h4xA ]NgN sS #`}TXsP Gw,駥Fa>i1V\82BjvN Z>ͩ|6!2jV\8eIB۲.K'~Bd0>*t}3WV36x|*h;(ohS#6G-CT>EY[) Ce^=AGeiAA5BjvRY[(oR| +)dOaOȠό&qd;жH1OeMRP% M:͉ AmDS룂]IA≲qId0aPY TeR4JA}BD=;e5IGhVm9)'Ddгt&808TXsRR)Š6B :,k( 0"_)))怒i1i}A:==2!" h;++ SOURCE FILE READ ERROR ++$!~;G ::<2xP:>22#R2#2::<2::@x2 j:`2*e: z.'+ʚ::æ`4´:x,ʙxɯ2::<2:O: K_4 44C4K4XK ++ ABORTED ++$+~\ O:0ʈ1ʚ5ʤ6ʮ  11ý 3õ12õ2400 bps     :_ :_*~D#~ **"*#"#~D~ /h:Q  :::  D/U Filename Size Speed :ʽ  Date Time Uploaded by  Uploaded by Date *O/OO/ [End of listing]$  ++ FILE TOO LONG, NEWEST ENTRIES LIKELY NOT SHOWN ++ ;_ ++ NO NEW FILES ++$XMODEM LOGdp a,B9,^z=PIdP+a,B}Rtܳj硪Xcc}TDм⨠^IA>)i: je5C5ȗXk)O)F a>2*mWXӈ ^9\z =y|Ǣ :,k)D3h 6G>,(DƢ :,k)˒&D5ʢ'hۤ$-'%=+h |霒G"Rst;z_\+DFY!wEtX(RPOȠP K5B5!0W/?0R) &:DWwhmdaZh)6)Ka,ӜK:9<ɥ.KږE-uYP-ulBdP3WPw4(n?hVr"yhNxx'y.,IhLTnǵ˞xD@áeTeRMb+D^ "!2{׌eQ˫E *2)&e1 NF6V5qUCZ # +Gvh80RPRfTL'3)3ʤ,,IhLTnC/~)ǰb#7-^|RPRfTL'3)i'~Ф,fN $y2'RPPxį&a1y~LǵtҤ,fFIY5uY<)fr (c8v-%c׏c [!"vBWHATSN01.DOCW  !"#$%&'()*+,-./0123456789:;<=>?@ABoCDEFGHIJKLMNOPQRSTUV)N&`yX8Iq2ǬKq2W8l\Lq2ZnnSrP"T̑~jq?<V7^&6u=i?<ϑ {;Mq=G~y#MP֓RYNqܢm9퇫'?WX&v"oO's俶sLqamXrڥ#Ϸ9jŗǫv)|]\*tTKSceqXn*A pNs0n0YBcȪ r =e(\̚k,S)CE-`Zh|5*3 Hk{p0kban!>ӻGxuM9, e2; K%82#W\qʋ^JK1 =Ykڱq5A v#( h fz\nFPg$P6%=/Lg$g,v)dri zgdq(vH1nG%k 8(F+0S)TJr,` Oa0YZBNyBVP(!]87J0#rPYFKRA EY8 q#u$L6S D0.EJW6aX# Wڪ ҍ'FG-AL.E%@ rTQV1Epԃ[C2F!'wr \Px 3OT6nFHtT-0\hetNEm-9Nq2yLͰ4][k)~ϟ>'q pBE"jD ('Hе0#'Nq2)AA*nJmڢQMQ{e!0UC)rث6J,08>@xZR[Z7B݀d\"k܄8ņӯ yޢ* q#(UEeH1O׸e7)?? ip,TxXeJ{w[}f)|S>yOdPXCY<,2_^%= -ԍu>{vXMD.ASM[  !"#$%&'()*+,-./0123456789:;<=>?@AMV F, #(jR2ƌ0#G)ukFhH7R,,eQjB;fVq#a鄩ǃ87 WڪIvlͬf@5 )/`J cq<}%Fl#8%(K`0P3BQpHx\*dA9XR"T<KhYUQypP |V$)*ԣ9!awwuMxmqyjvZePhVLP.B%8o(/AeP8۝ 2הupݧ8Q8{8{+ev p nfXOQOL9ʼnݣ4ɍ8,@\ P.C-AAtE}P̔%YrԶR ʡ%Ǹ&+F;RL1Et"t%vhYU%ǾC #TͺRl }$#OL=2;UFJIPZ]u3=.7z)Qc( Bx2A-nU08SEOn!ʼn.a=}Gi<- J A@Ƒ@YJqRjLk0YBqv%nr^7GTRp cc z2#W0B|q3n4bau5oS.~6|"A ;qdmFvG= 4VͨB_v"AZe|@-j!(-(c3pb;oO@74FfDK膍v}\|[F-@*# !OSYݰ3O1E\sƝF ]@g3xHKnfXOqFΆ'KRj!}UU -fuhntmtT_JbjƇ-1-tbWB9E-+e(4TxLͰ#3x *JH_Ux J 9#BCDEFGHoIJKLMNOPQRSTUVWXYZcC)exi1MsH]yxCH4 {}{Ƿ.l }6Wqv0|L"/xϿ-nU88fVw,qx6F`rlE܅S">8]q[1X|v[2ʮ B9QK-+e pyV3K.NCHٵrE8E.DL!4daH;+:_ ,WD6`qD"dᜨ%gFrgyZ̮}~K]UVn .^!$ `ݦ.mZUX s%< Ɏ"wvK""a961/8-2K >(+YÊh%tf8_|EF׈劐X$J fxK,pn+}[dd1KXX<]]t ݈1A]iLb}=`0"6X\f%o w0GΘ[JYL,%67a#lq,1s2" 4R̳ -dGn ag)nwzV\vID;719S4q10qtT=nR/W܄qwꄍyF}{ǷB̭t1lBx}MGa#l6Fx p;eFK >gyZ̮}~.!ppS^ K >gyZ̮}~.ap`pYJO{~j>ai$lF S8F0.z誦Saja0M 59}haS9.Ƒ,&,6F;00,P@+]#Y/&l5ϧ{PW37x gv1d V;)N_֩0tSLimX߾ lc `/U.cNz(+Ecqt9d i- 6H!R!dT!p* U `M^ uE[%6)YzW􀃋]-0؏BYé0.`KnDqt6S܅aq75}wM #Ơo-krm xK"f0,Cd6x\D Y,y%\ 3MxNWx߅0(&7KԀYJ+O'\ ! ߅!oja_@] ސw&;%Y];aAڲ̛B-~פCs0X\ ~#Js@ C[ЖySlIQW\,2Eqd$ OI~Cs脺"3Ra865Ж5es]}p!D  l5ЖySl5X/E xs/߅!oj ű0؏VH? ئ0- l $:bb2[2aPWk7+*Nm{ema 6oHBv1d1-e&ga#-=<4D+h~'h:~tE3i8]|0 ^b틒UئM 0e ]-\W2Bq9cxin`# ~S]ܖovS]ܖ0lz7%wITԀ,b2XJ/߅5e80bO8H߅!oj ű0؏V.cr~WFxOۿ`%1Xs,gt#)sF,X$J(>.an v.$  K780OWKm7#\K{;vqx+^Cq n nuɀ }0Ҙ,8d>eWa#l ӼEc(eFx-m vӷӼEj_0-epvK0xCUbц3B@.Bq oYUbE 1  OM-Z/i7\Du>|ۖu %!]Y3MtḈ;u! O۟P|\[hheJsֽp>[(>.D.{ $-?손]H8-|QBq w0@J8N=9fǂd $Kx0G7>X$<P|\YL8b[ (>.Oə0 $ܖ鬆 `%9d>emQ.KYL,%"],l?|6FdåMΘib5Y6F68-6F/5Lm}Q쒈dnx*4W`p[Myæ CZNoHu3Mvn| mYw? +SETvڲ~3Mvx .*YajSS CUu8R|S8bvC5!oj ڲn;ajSS COSO9~>!ECmY7困n˺)OM) ?N.^b ~j>!EC6mY7=t)!]CT_U.DuqA=0.z&0tN )^nCb[%6)Ya=aZ._nKaGC)4]ܖ0lq6A[lSas᫰6a#l]|Yۢ6a#l V3e!yEǂ2y L)18HF^MyӲFeTe0.z.߶e]nEgԀO:[ațjax|z7~^d)h^(.DuqA0衫˷O"V{1XLnUaja0~]m v!UԀӉ,z8t7 bWwax|z70tS7 bW? ) #P(.DuqAM=7 bW:o;aA^My' A^My' x)߄pΛ|52 PW.]d3a Ra 60l v%?uX g4= CW{ű/ #PV(ɺx,K.I5tM寪×/X,RP>pΛ|0L0LahR\*lv zZ(ǓuQq1pN;wN-Y|pـt6pZtin`- Ӳ@* ӲFun/ CZ6i˷{Ho ci7a^:0͍0 0M ^E/KaPW0iA{(20la'Ha'X CSWa#l NE3eYrI+H?o3a#\| ))˒Kd>e0衫ߖ'♲,$aja歰.}yw>!mm!`ݥɀs^"#oݳ04u# MCS7ԍ0WLqE].2XJa_@Q0衫ڢ\ l(` u.&.2XJuw;:)Y\Nd1XY% C7p`KnD2L}ؗw+/*c\) >a0xCֽҷEFVڲYE``Ia-)έ{o,j@]gyZ̮}~)1 $lavCQ-ۢ0ؒ"#8bvL,%0衫ڢ\0tNVf=Uֽj,Oٵo0C0 (Zf=tU[) ]=Ӽ6F`~YX6C罹t ]Sj/ CZ]0(q78avCWSi Cm0حhcEax|m- nn Sa#l DFS.&B I19\Ok_ qtaL4. mY7 #Ơ=ln `0L]Lԅ(&g!Ң- +:u~#aXix .*Ya]Ui`J)a_~L] Jcr&a*-R{Xy+ jV, ng#=B]%190cim) ]=Ӽ~@- O͛<b8Q Ta 8wv C罹t ]S8LQ^a %shh; $lNtCZ0.z誶Lg0tNV}`d g<]G7#f Radumd, "SBxDQWs^ `1aPT0.z誶i 6iKֽ0tNV{Ԕ'b+1X?NKaH57>N/ MQ _6]b*̒W`ݥɀBIFtE66WKavCW/Ja*-R{Xy+ c_ CUuӾWK+ySۛ `7xP>F"ɺhB]$|'fuOE9j4="0a.1,!]ؘ%@E]F疲 Qɢ#Pɾ6xv1`p罹c`M^ WCx,K. R O~Y~u50xCUb/S`0_iT6ࢢCa_@] 0M 5`\OOp,7 6iBK|n)˄)J0ؐ.lS)ꊐÈ"|YR]#Yo$ nsxH0O!󦸇t {a#|-!}{u.&."pmy;.RtRt#=Ηe6he9=`//˶6 aH[ 6!q Jf입6ؒuJxG"K۰s"l!on௟oooo,l˫>|g.Ƒ,fXpE۲~Bq UѼ6Fm mY7|G&!9"1y XMD - rewrites XMODEM.LOG :VyKeeps "R" and "P" entriesryKeeping only "R" entriesy Continue? (Y/N): _Y:2n >AA_y +<ʏ:] !\L͆!+L ͆2X2l!"x!"vLL<ʸy wait a moment...+L!~|yG ʃ:mo<2m:xcP2ovR2oo2o:o|x,52m*p#"pͦ:o|*r#"rv _ CKX ++ ABORTED ++$  |{0 :n_ :n_y *L ++ DISK FULL, ABORTING, SAVING ORIGINAL FILE$~#~z~#† ++ No files transferred recently ++$ NO DIR SPACE: OUTPUT$ CANNOT CLOSE OUTPUT$*x*v}|<!"v_S܆$E].Ƒ,J6Y~u v+=̈ЍhC8xG.P,C^C* Om /f,w&;%+ æuEe2R)d3ah7>|YNe`` uEOE%|n)˄p,mnP<,&,C5!-7>|YRbb~#tQ6 0v1dexN~\@RWB* r ŭd.^a8pCZa_@]Юװm|0؏8PUH?bLt⥰6".Ƒl&qjdQ)Su!67>|Yi`uExG疲L:`=)d5$ nsa]Umj# ]=Ӽ!Ң-avCWki CP ,~8+$kЍ8w3 0` =U㋭0O!_SCZ C)r*axM/;a#/˷{Ҫ\/avCWe:u=l0B,6=͍0O!_uCZ ñÔO0 ސw&;%Yڲ>B `` uE[%6)YaB,0xC"]#Y<0#l qgLQQWtvSȗT6[ PW\T疲L6 a#M7M=rV4. OP0XpZ( 좇J _ dsD]8*|&:ad!Ң-uCqKaHp|t^S,&o˗as᫰6Kl$.yq7pN G76eo{B,Y~u兡bNOPvSȗe? 2ͷ=.z"in`j CW{60L*x{z.*tL?*v"v!"v*t*v#"vyL++ SOURCE FILE READ ERROR ++$*v}…"x>y+L<y *py original lines *ry retained lines *r}L:U$!,]͆+L_XMODEM LOG $$$LݯRTZf鴐)g/~ *ϝhRTVL!L6Ss:o>\aް_b7R8qhsp5Ch)"MHRmnA2i'0ߟr@s>HRTf HAU<'ЇdEYhn T@CYhn0rmg}L Zwj5A2i'0ߟȵE4Z7 HAU<;U2>X4 kLdv7RTZF8(U+)@"Iwn]Uͭ S)@HuX'|Z=쁥!i]h85kX{`<%Z߻ I9O&>\!oZq$I!j\73~|Õ=HBX+F3[b]\Oo4ނ%]O#+{RToAU z~׍e|:_ e):΢_->=Ka4h]h85k)@j]hdҺyXwv7RԺUl [h6w)zפO78y#Hm,A:V J-:JRiU UFSNOPE]- vC<-f> $ CZ]i 좇|!dYϟ?!Ң-uo iF{Ԕk*UuM寪~C)._nK7i8H CZtz?50k(uu] 8HA5tM寪~C)4]ܖoH1,P\$܅ETaj!-|Y CW{R5:XE"exFGBO E*$dAW82a# ~Sh|- ސBO E]XDY~u!oj 4o0衫0cim) ]=Ӽ6Fi-5E[~'-=ə ʔ߅z8|> c_G|Bdpte+ a#lə6 G7PI12u1Q"n ə!0;΍FMu,K-L9n Ԁ{Hh/wE,(avCW/J) K<-f> $ CZ]i ?Viіə8bvgԀYk좇jm=+u88坰Ua-9VMvJ]-]Lɢ܅pin`- Ӳ@* ӲFfU `[%6)YԀb7} 좇zt;PB@:[a 600)Jas᫰6)BO $lz_C}u8!P}վW{aHװվWj_}վWj/my?ϟվWj_}t j_}վWj_}Frt {]a,Oٵoppf=k̭t1pn+}[dd+EKQ-$ Kb-22FEB85 ALL COM %READ ME 8BWHATSN03AQM#aeWHATSNEWCOM p[WHATSNEWDQC%XMDEL COM !9"1:2 >AA_ v<_WHATSNEW Type ^S to pause, ^C, ^X or ^K to abort wait a moment...:==2!" vI++ SOURCE FILE READ ERROR ++$!~IG ::<2xP:>22#R2#2::<2::@x2 j:`2*e: z.'+ʚ::æn4´:x&,ʙx&ɯ2::<2:O: Y"B BB_CBKBXY ++ ABORTED ++$+~j ]:0ʖ1ʨ5ʲ6ʼ  11 3122400 bps    :s" option "0" on either program where no customization is being done. INFO: A companion program currently named XMDEL deletes all downloaded entries from XMODEM.LOG, keeping the uploaded lines. Since this is a small part of most XMODEM.LOG files, this allows the SYSOP to easily keep the "R" and "P" entries for a long period of time while automatically minimiz- ing the length of XMODEM.LOG. The combination of WHATSN02 and XMDEL for WHATSNEW makes the entire system almost self-maintaining. (XMDEL.COM should go in A15: area. If XMODEM.LOG is not on A14: change the following byte(s) as needed, then save 5 pages: 103H - 41 Drive A: 104H - 0E User 14 (XMDM105 asks for a description of the file just uploaded and builds a file called WHATSFOR.TXT. A small program called WHATSFOR.COM then goes on A0: and displays the information. That program plus WHATSNEW make it possible for the use_ :_*~R#~**"*#"#~R~ =v:_ ::: D/U Filename Size Speed : Date Time Uploaded by Uploaded by Date *]=]]= [End of listing]$ ++ FILE TOO LONG, NEWEST ENTRIES LIKELY NOT SHOWN ++ I_ ++ NO NEW FILES ++$XMODEM LOGTOPIC: WHATSN02 (WHATSNEW FOR RCPM USE) FROM : IRV HOFF DATE : 22 FEB 85 NOTE: Modest change added to WHATSN02 to show the first digit on files 100k and over, in the "Size" column. (Did not show on some systems.) Modest change in the ABORT section to directly include CTL-S. WHATSN02 is really two programs in one; change one btye in the .COM file to get either: 103H 00 displays XMODEM.LOG in reverse manner, last first 01 displays only uploads, replacement forr (and poor SYSOP as well!) to learn more about what is on the system than ever before.) It would be nice to call the 3 programs: ALL, NEW and FOR, but would require quite a training effort. (Even XMODEM is a handful to type for file transfers.) - Irv Hoff W6FFC 07 February 1985 vlWHATSN03.ASM^  !"#$%&'()*+,-./0123456789:;<=>?@AoBCDEFGHIJKLMNOPQRSTUVWXYZ[\]R\I=[+J6i89<.Z^%=|'֎auX|R) lRϪ˫^Jaqq0O>by- ) _!v0RPVWDd`5Z#2kGc #Y+Ha0iFۣ+x!MOPg㫍|LCa58{ՠoKSrR4#yY-@HS>e(+X;,4.NP qHa\ۣ WHATSNEW.COM The first option could be called ALL.COM and put on A15: (with other private .COM files) for the SYSOP's own use (or A0: if you don't mind others using it.) It immediately shows the most recent file transfers first, a feature all SYSOPs that have used the program love. The second option shows only the uploads and replaces the WHATSNEW.COM file on RCPM systems, generated by D-32 and similar programs. It should be A0: drive since it can be called from any drive/user area and reads the all "R" uploads entered in XMODEM.LOG, then shows them in reverse order (newest first). If the wheel byte is set for the SYSOP's use, it includes "P" (private) uploads. This offers full security as well. Read WHATSN02.DOC for additional information. The entire .COM file is only 10 records (1-1/4k) long. NOTE: Prior to XMODEM101, private uploads showed a "R" like all other uploads. They also had a somewhat different format, although would show correctly in the "as i$+ƞTx\eJ{Ogv NIa\ۣ+/p=;ؘ0lR:ΞcjC0Rtv vF[qحw|hXa9(OA1`Q') PhBzR Ԇ]Ia0yHatsO_), em~r9$y,VUm˼Oe2/U#h5#4?v ;Wa! :=ap\ )E:;( ,h: *=aؤ6t}96t! CMPP 4_Ia0UX & #kj`Uퟂb\OjdkV#bp<yІ4jFۣ+dIrKV;Asク0R2KXAYF;̵=ϐ`xGVۤ{#QgpTڳGŚ;\j)B5e^V˫$GS#||bVwM>ԳR §08#TPX/NN]O qnS\;8VRVC5ou>?8 GxбC'߱)(ưIm0i1f) \cg{G(kiğqX] L ޡW) ?F,VUeܭwiP*;( bpʮب4 #lDc8A#I%= 2C:#wWThG) TBEHSPhB't?Fw`8Ja|H*>Gh o>x|QPh>ԳR GVO.=ap܍XכjqL GUpqT?ao|xh0R{)O~W`Z )vjq*ƞ}Ka0>N #ESȠ ZpdhVRTU?ni (|xſ|Hcʧ8A6~nGdp MN58C\(ou7~ A)/4}`C:X|^ͨqKD#:PhqK?uλ7>e)*+qK7k"C8*R>e)ĮqK7$2Y\f]9)jr[T7D5+ 5y&¼>Ka0k{aV kHazHAw9ՓHa0R"g]mRVe^V˫$ڱ|2rK|2gD_mRۈWsH}ԳJ #!4W̪˫6_Ja0T#;ma#hF,BFF$WmD6R"<^ c\F:#aXհ}6gU/b͠`#5 bp|%¼>Ka0k) ^P]mB6bQUz")wx\U0( /B0qʊBq§Ph2/Uߏxcxj&s(>Գ 4a_3;rm-p&De`X CapT^3"QyI !]YP izx]UF |/ O?0xYԍ=;4ESva<.Z^%=|'֎ 1excxEㅍ6uXp̸Ԟ0_w 4gQFpalի')Ͽ4k3CzkG#;˼WI~Cz؁&ep=b;S,!B'֎auG>S6 Qx+) TXIA>)d7":<1Ba5WRP8z>֓F5+8oXk)/{"{VX ZsTOc-Փz"ZYR)5+t?P q*4).Ka˔z"q*4)h2vmKAm$-Z #-_e?} jVb(e^V˫$GvJ_v{)hP5fReJXWIY,Ih[F #Ag`>e)fIBdOrKm?&Z JTӤ/Sj|^ͤ6Kږy-Mg=eDmË7V#Z G)f"2Y>+)fIBdOrK}6g%& _j(MvĿ(>IA˗)m KS{vp>SF#CY\0\cQ j$;"#V$HasxF z(|R)*+5%S*A ZLI̤6Kږy-)4˔ڱR j$mR)(3ʈ z/R]Fd7v#^AYAm%) ؽ)"}ФgD l:߽,IzNrK?u~۷IJT}R)+ㅲj3(>e~P}<~Hqٗ5%SڏZ z.`uHqٗI>eBٸ$2gbڮ9tׇͦ=A`W'\x%)aOdPrpa)fo_0RTj2v@>(z\X͟0R/٤Uɶ' {[}R) B, tKx)ǰb37ݤ6t$`^_rMYuyl{ofS- >|W)_0RTj2nU;hVg)v}6g]nͧ?}_`E!{(Rn >V f?ʠϿMnR:pqHa]q&lJ=p7`w^bͧ?}v'mQHa0R) 8A0CႱIÂ;l} g cEX4jm:0tucCs +,.٤UWmDPPMPP~R٠*(iz.X;,9*t?F03AYd/PC0yY-Oy٫ŐpW') }|A5e^V˫$GS jNp>1.0M] Cn<;pX4H}d8W w,lGP0hTRy/'| ;) 3je5;+^Y}P0ϟqpDHS>C ͡yIA5cXݱ0D\c>NABSv(vJ ֟NvD;I^h'vķ##F|GHS}"\X Z CT]a,9*>> EHSPhB't?F0x3zVj1Oc9vs 98,Br'`09t>=a18eW xGVPn wh.Xs\`0怠;\!v]lC5 mtP)fB )/;XxhP~9+) =%FcΧTDU` >e~ctA2UD+XG,RxJ Z/3":<1TX4AbjD{"ȿHAwTW2y 28߽Ha0i 38*˼WI~c>SIąeRլ26On3"(v (}Ft7˾L~L DFw鬧L 'yr\xP`k鰊#k)F g;8*_08)wpPXou>?8 0R2lܳj&PqoRP;a~ 24!)(ưIm~ftٗɎ`Z Z5{%%eFJ(>/o H}dh\cg;('RP=hO_&D;qpn85zQ=np >b+x'-tٗ)}쮩O &wx׼` /RP=ɨ}EdPjE)Ep,}e_&_ aai8±Hqٗ7gIA$zAg+i8BYHqٗkJʌIWD#|T+^Y}E 2)f`Z Z5{%//הyrLB󊣂j b-Mg=eRP=ɨ͓L #`0 Uj1(^[q;RIa(OfD`7(}FtAu5+ UX Nٕ+)()3jv9#2g06V ;Dx~:xa|¦*F }e#2Vaaaq3baq`)hP6n rհ>{8j&PzQ=ȠVV3Ba56>vF(0tAtӬz*l a/yUꂵF~wM|JtҬzo~~aav>C{>(F jS:|;HAwm~r#)R샲mO~Jaȶy?y>-AώTp*,ޤy>R sKA|N{"6fIlwڮTXIAm$T=N'D'v#TBZa΅#KA~LlptHm~RHAm$TWr'b0\eJfIBu5+wReJpq,IfN ZLi;6)͒jV˔6KY/Sڎ6KY/SڎjV0WϿJa0R̵ +v.E;HQ=N'4TܳŠ GF:IA˗)㼟&DsŠ G,Ih[fIb}RGF`aaRP;tR]J"QXTv86XtXEn]_hO_&D#E8x }GE 2).)(IF~2/Sڎ;HAm$TWr'-tB #esM˗)mȠV~bMUF j$;)kZLi;p 29vp`)n9R)./ΧtsCd0>*F`aaqZY)>*YP]Aͱâ :,kMnvReJpu 2Ⱥvb 0 2bXtS]J)kjStR]J"Q)C6;8bMX~tҬzLjjcؼKA|J_~JAw-լ$2kT(|p,}eG)F vpʮ!hb 0 23Ka(OfRP;N Dv߽26On3"{VP caaCT7cQ [+@ /7#6*Hq,If`}T(v n,YP]AuPg tpRP% mے`}TP " tP;ۄ;)n9Y8HqHAw-լ$2kTb)nA6KY#2k ۄ#5X [Ωf%Aup`)O럤jV̵ a(bl=988J }P]J"ih6V_:baq`)͒jV G0 ۄKAm$TWrGdum‚tӬz6*٫-=HQWDߘ75BivN Z/["{VP c5.M j$v{)hiOdp >n(X#tfpoR)f䚦"F٫_ꫬLDBdO GOpՌ^)RPq-2GCN'48.M ^ ^ ^ ^ fSZ? ZX#hR2j̤˔ڱ&uO=;e5j1kA j$mR)()3*ۺ YA5 ǐ? 5.M fSZ? ZFўeB՘IA˗)c]%e zvjcHiRP% m˼HA>)d7))&R_0R) 1>*h;(hS#6G N|?RxzVbҔ5j+BXC5?P_0XWR)ɼ\dAM: +v.4;'b̓5-%=+,6Km^ ^IA# Ge e`N;)(3ʤMy2' zvjFЬNsRP_MȠg5Mp ap` b‘0WϿJa0R &P,TÈ|FSPkF8faN m >B5(X&P0R䷓v_Ӽ$2 0MaXўd4D3{ƑTø56GIA^ JIIYKAeVR)$'Rc%=+h a&ՓJ"ZYP c쓒擞Tø56GZ iOd0 + T擞ȠVV3TÈ|X#tf礠HaHa0{vP #QhŠWVF}U&P0R򚦳G¢ :,klR2l\ܳj&P6Km^;(n_(DƢ :,kcQ jSJ .WH}d/R}~Id'v8BV5xs$#+hU'R+)Fk{|cb( ]9)hP6n YA5EtX(ָ7)͒I怒y>==+.`uEXIA}5\=*HQW2y>L 'yrw 鰊X#ڳfIB6'D!*(^!CwE Jʌ}ԍ=xG5q*>L N JʌIWDU` H}_(>hV=N U#1ZPwxOޥ0RլLv4 NAYY!`cWҁzQ&D )`##,\cRPRfd;"{Vx߿)X ZsTX_3"ZYPXOORPRfT^ oJAwjVJAm$TWrGd0THࣲXt$O= +XY#VbHS)R)^ #!"d:j)^ #AvarP n GhNq7bP1=!(p` >Flk{ቡd{uJ)h~[i+-_Ԏm>'DmË7( _Ohv;)͒e^KAyQ&}PO"ih'l4;pFReJؗm>#2x6nj8b V+)(M{"W ګݠfuKAm$-Z jS:ԇ/=A;I^k(M">(dGd0-߽/SjǾlAg U k,B,Ih[ׇͦ=A+inЌaa0Rdۼ쮩O^DSN)mOnv>÷`I)mOn Xب|X jS:<^DSN_ʶy?ٔ> ZX+(%0-qdMaXKA}5!"\51 kjC#KaHa0]ޡEjc| ۈ§,bRꚖ/Sj6J JTӤ,Ih[fIB6'RPRf淳 A _ ēj|L Y> U#\8}cV]aTF j$i2'RPRPRf/{"[ /RPgIAw4)YuCd0-{4:RPRfTȠn#8*˼WI~eRM|VL ؍l<(\Xհ٫ F #A;8eWpXKa(OfRPgIAw4)Yu#Y4)Rۏ-{)ǰb37;k)()3瓙Χ>hRj'Y4)(b<6+pIm0,IhnRP% R [iR'7 #|>*0RL|V}6K)R0x*vR=:HaHaI>6K&~"[j?aT9|v?bV]VlO[ |TnPc0R sJA}5\=*H1g5YP8HA~<Ux&UCDEFGHIJKLMNOPQRSTUVW)N&p_8Nq2ǢKq2W8l\Lq2<;-ll%~y 1y<9D׶ :#BzlUi"[J~@:adF h[U vM1EWKM~w 9 A ;qdmFv G= 4V8 .~ AZe|F-j!(r/(SUZx\h%f8\WanRLAPaF K@[4ڍa r/tbi< K)âeS,-%Vm%C)s|/G/&)Hн4V9) u3=.7|`閬*uzFi\1>0UEQLíg}Ш0,w)f&C P BUAr2knP8FGʁߥX(QZ]A^v #ǢcTKofh O%hPރ5jaQר80z#Q(nɊ|nS0#L$A>ÂP()r/tSW 1,0| 2prX =eXtPC-d8j*E:dE-d,xZ#0mQhV 58p_[VU>" e`8DUeIAyZe^C,B>ӌPSZP9dRqRaJS@YRC)9{0 KU #Nj! eItKNR|L08[[tn 0% , l8EݲNPjo5~bXR?0 Hap(yAm§,aTTni=yY-$?HAz\q=Z *z\q=Z #EVT^ l(XéIVO5Au-h >b( R'5&2[k, q1k)m.gTniMdtXE˼WI~Gogk*o몿rKk"\!EЬHdMDݯRG')erMDw]w>/{RԓZ #5k" up*,ޤ0R) jV8kCQ'؄#')?ϟnnQ #qKDd+PTʡaRԓFՏ[>AA_ v<_WHATSNEW Type ^S to pause, ^C, ^X or ^K to abort wait a moment...:==2!" vI++ SOURCE FILE READ ERROR ++$!~IG ::<2xP:>22#R2#2::<2::@x2 j:`2*e: z.'+ʚ::æn4´:x&,ʙx&ɯ2::<2:O:4ָ1@ƑX"W7Fo8lwR[ԭ*5c*mx*"E#) 1Jm08>UP aHpp֚[ńZe%!U !(K{E:*,82knP9 hIeƍPO0 iq$0n Aیto8J RAQ^LP+<@qFexj-SaX֖(Em8YsK'Qg$%@j-7RLq@y{AK>h{^c߁5LUQf D0%O4AD*(r,j-0t HU7W򢡼׽krByOVvl\MPJ:Fڂa>} ^`Ijk8Y *#K99]}0E.j[rpY.8Lr@}MiNRA}S` S5O{9!$L1qcYCy4μ>[Rƍo*aIjςYRe%KQV3w;^RLq@:ahdFZ:A4kQxU0#XFy(I00JmQh,j6n @]?l 0UwS,tm՘vl͢f@-)/`J cq4}%lc58%(K`P BSpHx\*dA9XR"T-<Kh[UIypP |V$)*ԣ9!~wuMxmqylfZePhULP.B%8of(/AeP8۝ 2upݧ8Q8{8{+evkp nfOQOL9ʼnݣ4ɍ9A\ P.C-AAtE}P̔%YrԶR ʡ%Ǹ%+F;RL1Et"x%Zvh[U Y"B BB_CBKBXY ++ ABORTED ++$+~j ]:0ʖ1ʨ5ʲ6ʼ  11 3122400 bps    :_ :_*~R#~**"*#"#~R~ =v:_ ::: D/U Filename Size Speed : Date Time Uploaded by Uploaded by Date *]=]]= [End of listing]$ ++ FILE TOO LONG, NEWEST ENTRIES LIKELY NOT SHOWN ++ I_ ++ NO NEW FILES ++$XMODEM LOGv'WHATSNEW.DOCX  !"#$%&'()*+,-./0123456789:;<=>?@ABo&%ǾC rUByߥ8@yLkQxVWxL0qJ7NqP^LPj~5_`2T2sHqKp nfOQOkqg%8q$PR"ӽZe2LVPjabt~5_\q9GN) 96Gi}q0Ȯ'a Wh^RKL$^P^L(E-%P8\W4yjn^RLɛ%{@*#'eu_Q !BSaAlÂSLɛ|v 9~^#Ȯ!Aq$%^7r3̧8S#gC\|% _tT8ŗqI*#F-$j= 4@:a^RLq/W%j1nqr[ߖp_zI1+F֕2BAZ*Li nfOߑi`^ƍSj=A %Pʃ[C [][k 0U(,EHU w` :BJNgjtÊp$Aog\w|7ŷ)椙~0Q<~ *u~ original lines *w~ retained lines *w}Q:Z$!1b͋0Q_XMODEM LOG $$$b^^,s+RH!|M^??FNmY݀ tg *-K"- ߴPsavj6ӟ,@~93epfZ"rg$ gvUSPLICE.ASM`o  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_o;x .~ܜ"oNn;Se3\j_8!p7^rw\||w9i><ϐ?oo~:(Ip,8j4 W&v"oNO'3俶73LqanXrڥ8!Ϸw9jŗǫf)t/#N'wyE+@ޜ4w'3y޼z,SrVgyo1f~@sXIv<|{7΍wbtt oo)>^\*tTZKcceqXn*A pNs0n 0YBkت rX =e(\̚[,%5 r %w-4\́,2knP`T_l*B-` ;Xʍ gy~)djgM~R[WUP޸1RE.ӵ(6p7BZAV RAy2Ao8ltmq6?q(vN5n %k 8(F+˰P)TJr,` Oa0YZBNyBVP(!ݒ87J rPYFKRA EY8Z qcu$L6S D0.EJW6aX# Wڪ1 Zҭ'FG-AL.E%@ rTQV1Epԃ[C2ƨ!'r vfWHATSNEW.ASM_   !"#$%&'()*+,-./0214356789:;=<>?@BACDEFHGJILKoMONPQSRTUVWXY[Z]^\q=չ8D^p0qzyg1G_3[Ѹ{ک>/d`&fv^^_\~ީ <8?Yg`srp٥Qlǵb ac (ycpy!yׇ:aλz=R/]Dcvg.w><\w4d]ၳ>83[5$<C{dX.GҐ]\ gZ< Eip/\T?=#Gm2Baq<f#=9c"sa .a . sbFδTC39\~ީ <8?C6~ٞ#N W>Ec^Qk] KCQ#یq:.{0;N #88(g|}tE玗K9G1CG4F8V}ahܻR(]v^\82l9sQ\Ph OTZ6n FHtT0\hetNEm-9Nq2yL04[][k9~ݧO?}'1q pBE"jLk('Hеϰ 'Nq2)AAZ*JmڢUMQ{e!0UC)r86J18>@xZR[Z7F݂d\"k\8ņ5FGӯ yޠ* qc(UEeH1_qeoq߯S?ڱ|2rK|2gD_mRۈWsH}!q?Ѹw]Dh e"kge˚9F)nv5#sExީ ,/'#G⌃sFVpC݃35u~F,k&݃oϩB :7uu*bѸwNuԫ]pU\vK}s"u4U4ct-3Dh e2{KyVWl!Q˕!7~wYgg_"Ǖ!s\ql 3͝%/p v?7C6Rh33L낉#Nև9\c\9y[rװaG4FU:}U }9#Ef> \gZ8 |H_ƎhkK|=,.?w#ó`ADnjq #?7K}Qs]X@G4Ƶ%~]d=OgqTzYq]v|uD㮽8F y?.zLJݗ҅ ¢#w'RgFSې{37g0_våzusstF\#}_p=>Fz8/S9CKljp^8z9>$ﮈh|d:范sEŸ3åza"Ǝhpp)LJK}q{Vcz\ܐ^粝9h5;CQ3.C#G(nR4~iSY6e-$PO$E|ʲܢT~'MeY@Y︩,kgLn|8NnL5BQn*ڙtДh 6e-Yi񑕎龀ЉOMMʲݕ7Mзs2†n*ZpoM5i<:$|wSYֺ{#qlwCx_wi}Qtܙh 1 m~$,hE'Pʬ.zyMddEh20r 3ʈ,5L;6)Akݯ8`ܿͩݏwA>kyE8%q)ݏt遯eu_N7Zr{pp(~-Ec!ɞEVE3ېfFf7֎DM8A~5SK8A~c.S3K ZZonS_?~sjΈv9%pͩwzgDh*>cc !v云QFtk D~FHcz샢[ξ@67_FQH,׳SK9>\q=]τher'g78ԢZ,Hxz#E ;(˟ sW=<.y7RE_uCקh9\c .W> FѸl_uTH}xbx(pgTz|=\w=/p}^Ϲ[4v]z`A(.8\sྜ ED"?KCQ#8HKZB4ΚRuuޗݢq1\yF$~0gZ @(mE*3H-DBS`hyvv( Kxx-pk(zg^`FK5~'e_p0_ҊFѸ?l+Rq}Gj!g.0Eh;s=>\|p#qjGjqCxTe:Q4!<;;}v?xx%ȩlf$wFc=L֌hk[{<}V4F8dferEiΈFѸ? k{q}xe_p02/8dq?~VDhC6p~8Ӆ 8N6;~qB.~%Q(EWsjW͵˟ sW=<Xta9}=},Qofם Och־mVfҬL8]jxk6뱷mEKfrȾxkEhdUs-Un)](Et?M4t|6)]tE7=DΙ[;'gh^pލTѥig 0S-Qt[дBѹ~n?L/A+m߿MljkF}{FzUs-ᐁQl%{:=*E!fSxkMBʬێ(]p0vFQH&3ېfFfljRôoǐxkDKfrȾP+E#sԮk 2K_΀At?׎(_tfMǿEhjxNp6 sW=3 ,E!70@辞҅_PY_DJݢQJ~Mf!ڍďѥi$| %YzJ%m3n9d_HlQ42|NpϊT\/0w3:pG辞ҵB^&A&-n4'ߛ#zJ;06$&xi |-EWsjW͵+*6λzFgpݳw*Ώh&Yjv?pFt_OBb5) M4+nt2Mbh&j2 ind&~.5L | M4Kt_O龤mF- ɗhSj><\QypލԎhlp3v?]2tDRô'ѥi }=PEM끙5#ݏG)sc%~(LmAz E_Bߦoc}O辞E'Jnlo:y0xEyvv( YC#U'/v^Ҟ\32;3ۇlg_hðfGj!g_p0^x/s<}9O(mE*3H-D]%hEiC̗;\}Q! axTSH<:cԢ#EdϘ30p?3tC|k;/i]o= l͈FѸl翶V4R(]v Hp^uTv^λ \1KZј=n|Ei>=zV|&EhܯIAw(oL-龀X_ʈF8g0_Zg/g}1ٟK}q«9tO_o0ƟS]Ws?g为1ٟK}q.шuG>d><\fL/ǥåzO_/47T5fFpيˋhψghv8\9sчlK˕όhGᐁQp=|#?l[<9DF('R=>{a/s__\Q񑕀{ #> ^VKј#up鞽Sxp~ ܇lK5<\[H4CC"( zR\_\1[/hd.v^ˋsw0>Yg`srp ֊U]N=\Gjq.s/uCgG4eEjV}1?U>d%~ެ)=cpލTѸa{_7,d0AWT\3sN5V*w3\s `>d(Rg NG4v:8?wf|:Q4Ng.R_ܬ39skWp?{9/Sј'($_♥/gDcM>~o3r2Ea}m>S}w݆4|[ٗI8辞E'Jnlo:t΃X42 ,~/dE}!+׋nK@/-hJs}=l nM5i<:$tWt[д/S:q(J'2ۂowMN0)]:v0xf[д/FS:6oѥi-}= E}_H`]EiLE%4 vkݹZow.۝vK Z\tkEh|KQ挃s};}Wp@j\ cf\ mX|K Z6~yΏ藸Zo׊nK@Vt=D\t? P݆4;8&>N hMQt7߹趠i03qf޹MзI4ziٖfz;z8m߉ӟœ-76,~%Pt'hعw$}=݆4;zㅹ^_ެӇ>EΙ6]C&xMK/q27,+}8/qVsizPt׋n9d/qVIKcMOR9JKF^t!2I3B1:1eJnkEз/Lن4k72?t O6ٿ6om h=nLA?MMw ?($趠i@趠i_`ff#m: Ea}QMfͶ[ֿsѝaNаsѵ︯C}iJƛwO4FϕcF 8Wq0=ЍoC|=]jgf66d=N6v趠i[ hcߛ6Y!5d<ېf[6 o~<mzr( kX4BwY7 7A-NFtkƿ'KЊh"åzagtR=w#U4Do3K FQ(m2zݷ6EWtG ?]jRô`fFt_O龤mF-g_hItzL.m6QڈFh+Rq=\*Em9s7d}Ita9xff#'ﱚNGtk7v:m:N&*Em(88!u2y5|`mAӾ8$0/t|ېfېf6ٿѯ7}ʢg:N<=(}M4;HD&2A~t:k]ӁO+6d89 o薷;0hӇp^hef\gZ\83)E!(8J|mKѯrȾtz]j6#G)sәk 2]2[fmЃF8l%=g>Gv@ŅC\3<F\u+N=<ܬӇp#t;H#ѥ֯'P]2[w+EF;Nt_ }Pt׋n9d_twj~(aA{z̾ҝ'o66A4.5L;ow~GORôt)+tWt[д/*Ea2̶h7{~<m]2[?&{(aA薳/$rV܄GDw(H iDDM/%_]jSK>ѝ~z}(Kɗr{oc p8A~izJ_$%4X1Eh LE1tۏiMljKHܢQK̾m?ak {{/%_ti%iL+vܢQ4}M6ȳH.qQF42K/q2E~薳o2L|#$LljO)m߿Q4ީ ||8 Ch}?m㞳>mX|6os߻tzƏ4tJNt1ɽo#E7s _t7_+ \tώ(m:t$_to0+ <.5LkTt[д/ЌzJo'E!̵i=θE.h薷;#EE(L̜;܏? k{EM}G;܏?l+Rq}Gj[4QI8DE~CE'8m,oc~~(aADZQ]2[$0 4 4Dt8A~nH`r)ݿ%薷͢Dh*>R0wåz8Fhg5ѝЅ DZ_ ݷ ȯ薳8+Kt|(e薿%6F/qVVf_O($w܍_P2^K@I4v=gӁ}5|`Ndo$E#p=\Z\9\Gudޗh] oLA?MQ4-v՜ZFѾn*Q;MeY f T$MeY;3#RMeY;o|覲7s,kgLiSY΀蘼TYAӦ͚moTYY/k零藸mh( 6~S}܏\t\tҬ݆41q(3zJDmu0. Z(㢥`Mc!-s!iΕЃkZ ] aۓbHerArH%4q*D1F& 1BHKjwHՌ0e^\7LYLH%cc5d\.!В] R pe"i26ȍ;@Y:tfxL ZɁ@2$c޼F ߰_7c_o+}4PT”)@ȅ"\iVʄ+#7L&#Klz[$aWT•vcc8bF@sYj! .J;SXhrcc,5 8(f-;-)P`lR=%&?#A*!ѡ$Hc\cdu 2)x,PǷ??6c_o+}4Pgo^D!kr3PP)E=cc|:T АL%](b&ψ '88#1vWHEREAMI.PRNm o !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklu4okfififWi!XbP#jƈ9kfifz,x7_Tq `_WfifK`}2Mʀm^ǷUՓ*5nWUBtMi8r >cZ4[ UcXE q2\ỤJV*yr7(#MT4K3ЇzeyC 8vI# ʰ h]*-V/b`Ƿi7g>n.FU9nW .>mYHb(,qp+e\%<*Q3ʒ4ne(#MTୋ}Yv6Rz)^c!9" 1 @WHATSNEW ver 2.4 CTL-S pauses, CTL-C aborts $ *"_"i:^2\:m2!]uZAP  M•dY!m B>Ù!]ͦASSIGN  M¼:l22\Ù!]KILL  Mdҙ͕++NAME NOT IN TABLE++$!]FIX  M*!m$B>2->20͋:] 2.̦=͋:\K=_ͨ\ͨ\<=o&))))) ~2/ ~w#…:-:.!0~< # ¯6Z â[o:\:/Z>2~5# >.5~5# > 5>|5> 5Z.U:4:.4 :-Q:.:P:\Qͬ!0 ͨ~ʢ<>2~5#n>.5~5#~> 5>| 5> 5^.Y^ï :$ \ >:5. -->New files$ -->Deleted files$:Q:.Q Q:\:/*Y B>Z> 5> _~# xB# xM!0~#<\+!0~7m M| g!w#<!] >?w#’]ͫATSNEWCOM B\2-2222|\YD\!z\{D p~ӹ*NVCtMi׈ T@ŗ:@ح0-fL!DI "4_7t+~m%QϱGaIafBzn("[<ɯ6:>U:YYS@q^Jʪ meŗx5nW SkTuex[JFK3[+V":=|@[yUJVn)`a­ mڥ*JZcܮ,!X7l +q["t%%n+B$hҶfo1sI4O OpmURV] $Z2@[xn9O$m9 ج]MH3qYGfif_̺ؗỤ*2oV8lcY\8@dz@;*Jw _EY ԟo>|F'N3z,84㴘 L aZsyY3~ LifA'N3P" qzx y{˳1¡-qrhvx+bY/iphTs3 )))щ +=KN- R)Aʠ޳ԂA e2H :qptŒS )A e2i>L <3<%V3޺ؗ./-)ă*) l.Y ԏ}͚sܿ< FU`޺ؗ./-)|0-rl.Y _Ϛy] ) ) ) ) )]]ȡxo.% KN- R)Aʠ?\ӻSOwg,,9BBBʒS YUu\8UR=-{r8 Owe!e!e!e!e!eɩV.Q8\ӻP<&͕++DONE++$͕++WRITE ERROR++$͕++BAD CLOSE, WHATSNEW.COM CLOBBERED!!++$:-ʛÙ ee}͕ ++ABORTED++ $Û * :\¸<@5: $ \YD\!z>s++NONE++ $ since 01/13/84$-NEWSTUFF00WHATSNEWCOMORM5 LBRGLEDGR3 LBRGLEDGR3 NTEIASM PATKING DOCLOBOMAX MSGLU-MSDOSEXEMDRIVE LBRMEM LBRMEX2-NOSDQCNANIMAL LBRNEAT5 LBROFFTIME EXEONTIME EXEPLOT33 LBRXMAS84 IRVGREP LB7ϸ4 ī#G1$H%t-hHR o>h'A'j_*:#zvcc Ε"BR WϐJi.Z t`l DR sBc @rS%@ꈥJ{>c{1%@+FΕڀO.w^!fcc99h»"fɐJ(B3D(Ưm56-Ў=M  b@2?#zCP?@*Hcdr;T j q pKB(@AJAh66ȞYJP?QȄA>\)`l~h)pz|˄=MDH\'»/onnÓnl4]I\'7aR ] A.qntcccc'6666fcccI  ݝah)ٛEI1D߁F?$A*k Xo+.Z