o{p O  @`! #@%`')+-/1 3o7;?C@E`GIKMOQ S@U`WY]a c@e`gikmoq s@u`wy{}/@ @ ` @ ` ` @ ` ǀ ɠ @ ` ׀ ٠  @` @`!Aa   !Aa!O%a)+-/1!3A5a79;=?A!CAEaGIKMOQ!SAUaWY[]_a!cAeagikmoq!sAuawy{}!Aa!Aa!Aa!Aa!Aaǁɡ!Aaׁ١!Aa!Aa " B b  !"!B!b!!!!"!""#B"%b"')"+"-"/#1"#3B#5b#7#9#;#=#?$/$CB$Eb$G$I$K$O%Q"%SB%Ub%W%Y%[%]_&a"&cB&eb&g&i&k&m&o'q"'sB'ub'w'y'{'}'("(B(b((((()/)B)b))))*B*b*****"+O+b+++++,O  @`! #@%`')+-/1 3o7;?C@E`GIKMOQ S@U`WY]a c@e`gikmoq s@u`wy{}/@ @ ` @ ` ` @ ` ǀ ɠ @ ` ׀ ٠  @` @`!Aa   !Aa!O%a)+-/1!3A5a79;=?A!CAEaGIKMOQ!SAUaWY[]_a!cAeagikmoq!sAuawy{}!Aa!Aa!Aa!Aa!Aaǁɡ!Aaׁ١!Aa!Aa " B b  !"!B!b!!!!"!""#B"%b"')"+"-"/#1"#3B#5b#7#9#;#=#?$/$CB$Eb$G$I$K$O%Q"%SB%Ub%W%Y%[%]_&a"&cB&eb&g&i&k&m&o'q"'sB'ub'w'y'{'}'("(B(b((((()/)B)b))))*B*b*****"+O+b+++++,BERWEIS \KLICK \4MAKE \ATERMINER \TSWP 6\WORTBUCH <\'UNARJ_ST230R\ FUZZYUHRV20w\EXTENDER ɽ\A538 aLEES DIT $6`. \.. DATUM BAS  BERWEISDAT uF BERWISPINF 'F kBERWISPPRG  @BD FHJ8LFNPPZRjTtVXZ\^`bdfh j0lHnLpVrdtnvrxz|~@JZjnx*PR`f (,:`l~,DLNhr      f j  &"< " Datum 199 "z"  " " "$"0. (, "z0"00 40.#0 "$"0 (8"08 ,38 40.$"0 "$(  "z"" ("<"@"0. DH  "z0"00 L0.#.<"@"0 D8"08 H8 PL0.@"0<"@ DPf0  U n s i n n !G1T"e DX" \"<X\ P X+\\\ \  P " z = Zeit / n = neuc" x `"zn%0  zNd"l Zeit dh"d 0lp"p ht"d  0lx"x; t|"d  0l"; |l"p:x: D0" " `"26 " "X P"@.$.9m"T" .<.199" TʼT"T6 <- fr den Drucker / Dl$ damit Datum rechtsbndig ist passend in PRG einbauen;T>"  T" o"*4BJT`lv~&2<HR^jrzDANFAXDATYDATADADA_ENDDADA1DAT1DA3DA1DBDA2DBDA2DAT2DA6DA4DA5DUNDDA1DA2DA7TIMTIM1TASTESTDTIM2MINTIM3SEKDAT3DA8AJSDATDL05 060 1992 2 K.Namenlos/Baumstr1/1234)Xy 10 123456789- Sparkasse Posemuckel 12345678 noch frei 9 1000000000 Geldwert-Superbank 10000000 ---- Franz Selbst 12 1234567890 Sparkasse Xyz 12345678 ---- Hier eigener INFO-Text; z.B. hier: Oberkante Druckkopf auf Oberkante Formular Mit [k][R] Schrifttypen 1-6 testen!  BERWISP.PRG stellt den NEC P6/7-Drucker (Voraussetzung) genau auf die Felder der normierten berweisungsformulare bei Banken und Sparkassen ein. Das PRG bentigt BERWISP.DAT zum Start. Darin sind auch Daten zur Feineinstellung des Druckers abgelegt. Die PD-Version kann keine Datei der berweisungen anlegen (kein speichern) und die Anzahl der einprogrammierbaren Adressen ist einge- schrnkt.Mit den Cursor-Tasten runter/rauf gehts durch die Eingaben vor/zurck An einigen Stellen 'denkt' das PRG mit. So z.B beim Datum. Wenn die erste Zif- fer der Tagesdatums grer 3 ist, kann keine zweite Fiffer folgen und es wird der Punkt gesetzt und die Montaseingabe erwartet; dabei dann fr Ziffer grer 1 entsprechend. Datum mit: 32.1./31.4./29.2.93 usw. wird als 'Unsinn' abgefan- gen. Jahreszahl 4 Stellen oder letzte setzbar kann in der Voreinstellung gen- dert werden. Fr die Eingabe von ca. 50 % des mglichen Datums braucht man so nur 2 mal tippen. Gerd Paschmann / Hattinger Str.57 / 4630 Bochum // Tel: 0234/34885 `@jMA*"< .Ӯ"Hd d3 d# d `# # # # Q"<p#Q`XRfSxRkHK)RbA$&XSRg g fB` :<+a&mP Jx>f08h@fJ08hH@CxeB@R@@ @@|84B@ˆ08VFJkf,tQ08tQtf8B7|0kBk 08T xV`"g "AH瀀NLQJxfp.?<NNTp.ѸLRxRNsA:\OM-BASIC.INFOMIKRON.BASLIB 3.05 (C) 1988 ASY K(\OHz ?<&NNBNAJ-` +L Pg Vg Cg Mg `&zp`p`p/TWaZXNuK'FNi+I+_+nA+H8C,A#A&#A##aT&mC0ۓ/ //<JNAPa+xA!AHv8gAJxg. NMU@e B^WNMJg0U+HPBxR+xpA!p]+HZ j(0@4P@Ag$PS@g JPfX4hY+J X Y+hL Y+hLA*+H$xBDvp 8L0 NrOtJ@nr' (<QAD+H +H+N+xN@xAC%zp"QAJgE%"Jp&I Q&m+|+|F#p+@Bp a;mp+@BpMa;mpA000BXBmpNaP?aaRxRRm& mJ(,k0BgHz?<=a$Pk<HmHx??<?a SWaO B@a"Fa mQaN0A$"h X0g:/2"h$ B) //A$aX A$"h$W T"h 3_Nu"hN(_ -R@+@&@/?<HNAJoF+@BS?<HNAJo2"-RA+AҐ"<k.+@?<HNAJo+@.KN`#TX ЛЛЛЛ/?<HNA\Jo+@LNuPpa+m@HFHFBF܇P^܆vx&mX(KJg&P(K"K(Ę&.ޅ/(/H L` "NّбXfL٭Xa(CvّQ(&ۛ&66C SAf&`T6Q Ĝo8p2<v HBSg0e8kBd6d&e` HF&&&&QHFQLNu6&]n`6&&n`&6]n`HaLNuHaLNuH>| $r a:z JjDz-r6BBHB(8HB4HD0 :e^DRAJf L|NuHaLNuJAf$4NuH "mh_ m`da m`eL4RBB0"HXB+H`"$4L$@gIdId `Q` RAId2Id"Id `""""Q"_NupNupNuf fCgNur@BgNuDENugжAgNur@BgNuDENuCa0 AOg& AAg AKg APg AVg ACg AMft2NuA2jrVNuSAkA2gRNuH@a AIg AVg ACg AMf4;@LNu5!9A"9A.9<19<9<9<9<9<9D 9E 9F 9D9KS-At 2XWf0;@r2@ @9fI 00A8"HAA6BAQB@SAo+H;A -dg +@a;P+mlhBmBm>-g ??<>NAX.m|+m@ ra -2-aA. rap0-aHF#;ma*` l? in m@T"m"iȐDnp" ҈$AIdWo J\`"J]dQNu// 2)a*$YJ*g$/ 0@G$R&_ `Q$_ _2NuRAId0Id Id ` Q$_ _2Nu^%0x;@HItBCBD:<BFa`LNuQ4BmBmNu/ H(<:6(@4fIt Z8Dd8Cd60G`QaL/? 2alx8 &_`P4BmNu&m`(K(-haܹd gD`aH$m`* f H`4Q&m`IXd ga`B" f|$gRBR&DSAJ`7$Q+Kh+K/ ?0-S@k@G +Ifa fa08&_Nu 2NuJmf +mlha,J-4f&m`F 2ANuJmfJ-4fJmf Jmfp?a8Fa8PaaVB3@J-4fGv6-(Kr"g&Sr,gfS 2 KARC;CJfBmNugfS R2 @t,gfS4 KB`S-aN@R-kaFfL:gABXp`?Gp~a?BCa6>`pCa7dQCf Jjp`a-5fQ6`VQ5C8 g(C8 `gC8 ^gC8 g C8 ~f fp`2>Wf) gza fa&` eB g:@Cg^ Lr4`SBkhRSBk  g ^f dr` g +gl -gV g aeG Xg Sg Mg CfUBkf` e 0eJ :ez Ae> [e ae0 {eC g` gZJj?)LfH g& `g g ~gf mf ^fJk*@5`$ 0` %fPr` Uf Lf) %` Uf Lf Ag g gJmg Ag %gH 0gB Ag< g6 g0 Lg* Ug$ Mg`SBkҰfr` SBkİfr`VJAgJ-6f.J-lg.Cg*?>Cp H@E0DgRDH@Qa0m560 m$|a4J-5gpDa4P6`CgSDE0Qav` Rf2 gF-l`Cg>Cp H@E0DgRDH@Qa>` MfCgRCpCa3`~ KfJCf glp`ZSCpDa3`\`XE0>C` pa3a3Qfp a3>CpDa3QNu>D`a3Q>C`pTJg| /a Nu L4/` SBRSBkRSBjNu  g ^g ae Cg +g -g >f BakXBx8+ RDDf&_Nu(kCpdQDa mp"-``0&j"CfPf"BQe`a a lH @"B8Ad8D` VfCLNudxLNuxLNu/  Ara|0Y0 _NuAEEEIIIOOUUYAIOUAO``."`0t`H02aXH6&H`HaLQLNuS-@R-kaF/ra _NuJAg ZH78&@(@a LNuH??4a`Q24 _Nu2p `24-f4-k$gAv0 CdNup a/QNur`m`S-H+NA/LR-faJNuS-H+NM`C" A"0A"X0BA"A"A"A."0<S-AN`NBR-gNua@%A'Num$m&A$m$4*@e4pa,ljjPխ 4*Aepa,NRRHӭ Nurtv x0z agg a eRNuge dBJENuXNuQAe "@a0aJmf@`AAaAPdAdYA??<+aBXNu4HA0H`64LH H+|Bm`A000000000ºCgnUCRC0+|Bm`H<+| Bm;|`rk+@Dj+| Bm`PH Aa+|;| `t;A Ad "@B@`0QNuA H,a+| Tm;| `4r`A"<}0H@0ЁHg0H@0ЁHf@@ @e@ xpNNupE`*tv$<azaи`/ah nNu r$_ _Nu// "ZJ)g/ ?6CG"Q06&_J@gS@RdD@Ad2a?`Q2"_ _Nu mhgS`d a`e p+Hh NuH m"Hp"-``40$Xf*2"$Hd2Hd"He`""""Qe`e+I`LNu A<>AUCUĖAo: C!d.2gh Jgtkx dFH@xЀ[DDiVNu 2NuDC C!dB2g,dD AJg2kx dH@xЀ[DDiNuтdTAi vNu2Nup2<NuJAk bx`~gCCi(*H@<HBԆH@GBDHDԄGH@:BBHBЂk EрgUAiEчeNuTAi Nup2<NuJg JAk `Jg <TAi Nug CAi2J@gBCevgH@h(:HEBE|<xTHBJBgH@:BB`8BBH@:dSDԀdHDH@h:HEBE|<8NuJ-g0-aEA"C C E C. ps`@<F~G?<a>CClDABEG62 CAd< C e *tC `,@DCC 禊DJ_fمтd TAiNuTNudD@ AJkfJg8BFJf xF d H@HD0BDFJk SF؄р[FFiNupx2<Nug CAi"2Jg8BgdڄՀSWv@D` dڄՀ߇݆څՂeQ` SCkއ݆څՂdQFFJ_gfFFJ_ge(Rd$Rd DdRd RdTAiTAi( Nu `~***g CCiBC<*,HFݭdRm,HFݭdRm,HF.HGݥdRm,ݕdRm<ݕdRm,HFݭdRm,HFݭdRm,HFݭdRm,HFݭdRm,ݥdRm,HF.HGݕdRm,.HGHFݕdRm,HFݭdRm,HFݭdRm,.HFHG6-( %ІkgCلрUAi0JCjRe Nupx2<NuRdTAiHNur@JgjRADi dA H@SAЀ[SANu  @ 6ɿlŭ+pxIϦGɀT~ތ Jvuu ;]=]5(`R yjNpx2<t;Ba\  g  gE.Bg +g -f>a6 $gN %gD &fJa Hg8 Dg6 Bg( Og hg dg bg og$` a -fFWf(KB`aBg .f>a 0eVRm0  e_  e< *e Rd./$***6* a$*6 a&avafJWgSW`+zJWgRW eg Eg dg DfZa6~ +g -f~a"6 0e40  e  e *e d dڂa`JGjDt4HԅgP[jD ?eJfN`6 C gN CfBC Cfv CfvBJk BiQ`BiQJogJgRAXNupx2<XNu6 Cd$*?a6Jfa`a` <x2<H7 | E? gH$**6*/ a$_LHQU<QLNuteNuBNu+_akְf/-NuH@F$@I$&T:<+J,gaG*(BT0+kPSkQAD(!NCp$QA"F'av+LÂ`F$"HC m F'!{0VL4(Be04(Be2HFߠ 0$Az 0(RXRX00,p0;0 !@Lh`NuP?((JfNuH mhı`d a\`e m"Hp"-``0$Xfْde٨e٭`٭Jk6 A"A d3 d# e` H@# # # # QH@QLNu L"L d2d"e` H@""""QH@QLNuD@<9`2p`.p`*p,`&.m|p`p8`p6`p=`p`p ` p`p7`p` $(,p"`p#`p$`p%`p&`p'`p(`p)``````F```n`j`ʔ`ʐ`ʌ`ʈ`ʔ`ʐ`ʌ`ʈ`ʄ`ʀ`|`x`t`p`l`ʴ`````*`&`"```````"```d```\`f`b`^`Z`V`R`N`J`F````f`͌`ͼ``<`8`4`0`,`(`$` ```<`F`ϖ`0`,`` `````,`(`$` `<`8`״`0`,`(`$` ````` ```` ``````````````"`8`R`N`J`N`؂`~`z`v`r`n`j`f`b`^`Z`V`R`N`J`F`B`>`:`6`2`.`*`&`"`````` ```````````````````׾`׺`׶`ײ`׮`ת`צ`ע`מ`ך`ז`ג`׎`׊`׆`ׂ`~`z`v`r`n`j`f`b`^`Z`V`v`ׂ`~``````````````````````````ټ`ٸ`ٴ`ٰ`٬`٨`٤`٠`ٜ`٘`ٔ`٦`````,`b`^`n`ڐ`ھ```````ھ`ں`ڶ`ڲ`ڮ`ڪ`ڦ`ھ`ں````` ````````````&`(`J`F`B`>`D`ی`ۈ`ۄ`ۀ`|`x`t`p`l`h`d```\`X`T`P`L`H`D`@`<`8`4`0`,`(`$` ````` ````Unprintable error Syntax errorRETURN without GOSUB Out of DATAIllegal function call OverflowOut of memoryUndefined StatementDivision by zeroType mismatchString too longRESUME without errorMissing OperandBreak Bus error Adress errorUnknown opcodeDivision by zero CHK error TRAPV errorPrivilege violationTrace!Out of memory or odd MALLOCationMatrix not regularFIELD overflowBad file numberFile not foundBad file modeFile already openFile not openTOS error #00File already existsFile type mismatch Bad disk Disk fullInput past endBad record numberBad file namePath not foundToo many files Write error Read errorDisk write protectedJ+ g,AA)F?/a ,_0rSBk"gtPFFQNuFF(QNuFF(F(F(QNu+ Pg Vg Cg Mg r`r`r`r@?/`2-kSAAtv d tv gtv g t fJVAG Skgx +Of(kr2+RAk f/ /??<@a BA7ALNuSPd8BP`4PPP`,@A gRP d4SP g g fBP?BVWS-NMR-fad\LNuJmgGFr-WfS-pa&pRa"+-va;0R-`#$@[\]^`{|}~?BVWNM\Nu#$@[\]^`{|}~ *(Jk#ERHC)ig$%0+ytusDI"// m$B( _p a Nu/ m$| _`/pa Jmg?-;ma;_NuHJmfJ-EgQ?`J-(g?aT0J-?f@F$@K (]&U:<+(+ 6+>+J-ga:BmHzzJf dT g < g H g XSg ZSg `Sg Sg Sg Ug FSg XSg Sk.Wk Nu ^fJA hfr`:+ 67FFLNuB+SgV gUe Lg `Ue g A` gAd [gAh YgAh gAp y`va+gB+`8(mZr*A xNLNuaeEiou^`aAeiou^aeiouaAeioOuUyaAnNoO g2BBWf0`8@Ae @7d @0;NNunz\nZ`fl JFg2SFPNuFgRFPNu/ ??aa<:(_NuEgRERNuJkBJDja `BEa |gaNp|`RJEgSESJEfJjJFg |fAp 2`Q faaj:NuaB`aZatJFfNuJEf$JFf kkpOrJkfp''@'A6>BFBE`4a*FfBENuJFf?a:Nua/ ??a`aaWf<:(_NuJkLa0ER@HC/HEHFHG+ O"AASBkgJ6<4J"HJgJd2Jd"Jd `""""QgPQHC(HEHFHGNu6<HDOD4J"HJg HDHDRJd"Je`""""Qg HDHDDQHC(HEHFHGNuHE?6<HDODOEHEOE4J"HJgHDHDDHEEHE\Je`""""QgHDHDDHEEHEEQHC:(HFHGNuap 2E LQFg / ??aBE |fa`<:(_NuBEa\Jjn |@4F2"L`PQA`QPP$H,I2Q/xa0p 2 LQ(Ffp|`Fga,0R@HCHE:SEFHF<<6QC"AASBkgJ6<4$H,IJgJd<6HB4ĄQHC(:HFHG`TBEJj" |fa`Jja0D@ 4|gNu|NugR+NuJj// ??t 0?RCaSC4EdGg.?aNz4 |gBES  g?ap|a0a<:(_(NuCgEkBEFkBF7C7G`JEgt6>`Jja `p RCa@SC  fWga<:(_(Nu@F'?<HyNM\FNugJj L |gJEg(aRCp aSCSESNupE@?aP0QNuV+ e d`BF` e d`BE2+F0A@AkE(mNu@Nu@ NuM4 xNX2.F0Y@YHF<EpBfgRFFHFNuYHd(b\(Y>)qp-@p/0N+mlhr2.p-@H+mlhCNl6$N-$@0g".HNPNENP+mlh+mlh$<v}CNlxzHD8z:./(HEHEBEڄ(N+mlhp rNNpNN\N+mlhp rNN+mlhNbei Kreditinstitut NENa0%6$NsN6$pHNHN6$NsN6$pPNHNtv_xN-@+mlhp". <-@pHfN-Xp rNNpNN\N+mlhCNlENP+mlhNX0CNlENP+mlht&<CNlxzHD8z:./(HEHEBEڄ(N+mlhp rNNpNN\N+mlhpNtQBv[CN". oder zwischen DM und Pf setzenxzHD8*<NtLB&<N*Leerstellen mit -- fllen f sonst [RET]xzHD8*<N$<@v_CpNHN+mlh$<v_CpNHN+mlhp N$<&<N,Np Np r8NN+mlhNBetrag: NEN0+.+,+f6$NsN6$pHNHN6$NsN6$pPNHN6$NsN6$p!NHNt v_xN-@+mlhp". <-@pHfN/p!f p-@T`CNlEJNP+mlhp-@Tp-@Lp0.-@H+mlh$<v .HNN UAh2<pN-@Xp XH-@\pTfJN-$@0g".XNPEDNP+mlhN-$@0g".\NPE>NP+mlhJTf. .XN\EDNP+mlh .\N\E>NP+mlhp rNNpNN\N+mlhrE0*AdpR@NE2NP+mlhrpE2NE2NP+mlhC2Nl6$N.NW/C2Nl6$N,NW"AHH+mlhJg(p-@LrE0*AdpR@NENP+mlh".HWpENE8NP+mlhC>Nl6$C8NlN6$N, N6$CDNlNEJNP+mlh$<V&<CJNlxzHD8z:.N/(HEHEBEڄ(N+mlhp N$.HԮ\U HBHBBBԀԼT&<CNlxzHD8zN+mlhp NN5C>Nl6$CNlN6$CDNlNEJNP+mlh$<V&<CJNlxzHD8z:.N/(HEHEBEڄ(N+mlhp NpLfH .HЮ\U"H@H@B@Ё$<\Ԁ&<CNlxzHD8zN+mlhp Np rNNpNN\N+mlhp NtvnCNVerwendungszweck:NpNtvuCN2 Zeilen / 27 StellenxzHD8z\Np rNN+mlhrNENa0%6$NsN6$pHNHN6$NsN6$pPNHNtv_xN-@+mlhp". <-@pHfN0`prNNpNN\N+mlhprNNpNN\N+mlhprNN+mlhrNENa0%6$NsN6$pHNHN6$NsN6$pPNHNtv_xN-@+mlhp". <-@pHfN5p rNNpNN\N+mlhprNNpNN\N+mlhprNNpNN\N+mlhp NCNlENP+mlhNX0CNlENP+mlht&<CNlxzHD8z:./(HEHEBEڄ(N+mlhCNlENP+mlhNX0CNlENP+mlhtv{CCNlxzHD8z:./(HEHEBEڄ(N+mlhpNprNNpNN\N+mlht&<N Auftraggeber:xzHD8z\Nt&<N 27 StellenNp-@p/ &@ .`b$nT .ЀЀCNl6$rNf &_N:+mlh$<E&.ּH0 .м0NH6$N=NL N+mlh$nT .ЀЀCNltSBHkЂBdBAtAd2NLN-@<+mlh .<"爐-@HpSHlpS-@H$<U&.ּ".8prNNN N+mlhprNNN N+mlht&<[(<"*<NTpNp-@p/ &@ .`$n .ЀЀp0*-@H+mlh Ho -|Ht&. փրּf$n .ЀЀCNlxzHD8*.HN+mlh .R-@o|&_$<,&<fNspeichern + druckenxzHD8zRN$<&<fN[RET]N$<,&<rNnur drucken AnzahlxzHD8zRN$<&<rN[1..]N$<,&<~N nur speichern [s]N$<,&<N Ende [e] neu [n] zurck [ ]xzHD8zrENp-@p/ &@ .`4$<&. փրּfpNHN+mlh .R-@o&_$<M&<pNHN+mlh$<&<pNHN+mlh$<&<pNHN+mlh$<&<pNHN+mlh$<3&<fN SchrifttypxzHD8zLN$<1&<~N [k] ndernxzHD8zNN$<H&<~pNHN+mlhNGp NrENP+mlhpr?NN+mlhrNENa0%6$NsN6$pHNHN6$NsN6$pPNHNtv_xN-@+mlhp". <-@pHfN>8CNlNLN-@+mlhCNl6$NkNfpN$<3&<~N Typ 1 - 6 mitxzHD8zLN$<3&<N [RET] beedenxzHD8zLNNGp NprENN+mlhpN@ENP+mlhCNlNL*6$p2<xNX]/CNlNL*6$ <rxNX^"AHH+mlhJgCNlENP+mlhCNl6$p NHNfvpN$<1&<~N [k] ndernxzHD8zNN$<H&<~pNHN+mlh$<0&<p N\N+mlhp NNC>+mlhNC+mlhCNl6$NeNfNX+mlhCNl6$NnNfC,Nl6$CNlNE,NP+mlhrENP+mlhrENP+mlhrENP+mlhrENP+mlhrENP+mlhrENP+mlhrENP+mlhrENP+mlhrENP+mlhrENP+mlhrENP+mlhpNtv2(<}*<JNXpNN+mlhCNl6$rNfp-@NG^NIv+mlhCNl6$NsNfNG^+mlhJoNIvNC>pr?NNNkein sN+mlhpN$<&<^NPD-VersxzHD8z2Np NNuCNl6$N1Nf,$<3&<rN NLQ 10 cpixzHD8zLN+mlhCNl6$N2Nf.$<3&<rN NLQ f e t txzHD8zLN+mlhCNl6$N3Nf,$<3&<rN NLQ breitxzHD8zLN+mlhCNl6$N4Nf.$<3&<rN Draft 10 cpixzHD8zLN+mlhCNl6$N5Nf,$<3&<rN Draft fettxzHD8zLN+mlhCNl6$N6Nf,$<3&<rN Draft breitxzHD8zLN+mlhNuCNl6$N1Nf p-@`p-@dp-@lp-@pp-@t+mlhCNl6$N2Nf p$-@`p-@dp-@lp-@pp-@t+mlhCNl6$N4Nf p-@`p-@dp-@lp -@pp -@t+mlhCNl6$N5Nf p$-@`p-@dp-@lp -@pp-@t+mlhCNl6$N3Nf p!-@`p$-@dp$-@lp-@pp-@t+mlhCNl6$N6Nf p!-@`p$-@dp$-@lp-@pp -@t+mlhCNlNL*6$ <rxNXo6pN\pNHNNxNpNHNpN\+mlh`2pN\pNHNNxNpNHNpN\+mlh+mlhp-@ ./ &@ .` pN\pNHNN!NpNHNpNHNNlN .NHNpNHNNQN .м[NHNpN\+mlhpN\pNHNN!NpNHNCNlNpN`CNlNpN\+mlhpN\p(N`pNHNN!N .dNHNCNlNpN\+mlhpN\rNpN\pN\pNHNp NHN .pNHNpNHNN!N .`NHNpN\+mlhCNlENP+mlhCNl6$rNf p-@`NW.+mlhpN\pNHNNaNpNHNCNlNpN\+mlhpN\rNpN\p-@xCNl6$rNW/CNl6$rNW"AHH+mlhJgpN\rNpN\NPbCNl6$rNfBCNlENP+mlhNW.pN\CNlNpN\+mlhNPb+mlhCNl6$rNfp@-@x+mlhpN\pNHNN!NpNHNpNHNNlN .xЮNHNpNHNNQN .м[NHNpN\+mlhpN\pNHNN!N .`NHNpN\+mlhCNl6$rNf&pN\CNlNpN\+mlhNPb+mlhr2.p-@x+mlhCNl6$N3NW/CNl6$N6NW"AHH+mlhJg2pN\pNHNp NHNpNHNpN\+mlhCNl6$N4NW/CNl6$N5NW"AHH+mlhJgWxpN\CNl6$ .xN\N6$CNlNNpN\+mlhpN\rNpN\pN\pNHNN!NpNHNpNHNNlN .NHNpNHNNQN .м[NHNpN\+mlhpN\pNHNN!N .`NHNpN\+mlhCNl6$N3NW/CNl6$N6NW"AHH+mlhJg2pN\pNHNp NHNpNHNpN\+mlhCNlENP+mlhCNl6$rNf p-@`NW.+mlhpN\CNlNpN\+mlhpN\rNpN\pN\pNHNN!NpNHNpNHNNlN .м3NHNpNHNNQN .м[NHNpN\+mlhpN\pNHNN!N .`NHNpN\+mlhpLfpN\C>Nl6$C8NlNNN,NpNHNN!N .lNHNpNHNp NHN .tNHNCNlNpNHNN!N .`NHNpNHNp NHN .pNHNCDNlNpN\+mlhJLf@pN\C>Nl6$CNlN6$CDNlNNpN\+mlhpN\rNpN\CNlENP+mlhCNl6$rNf p-@`NW.+mlhpN\CNlNpN\+mlhpN\rNpN\CNlENP+mlhCNl6$rNf p-@`NW.+mlhpN\CNlNpN\+mlhpN\rNpN\CNlENP+mlhCNl6$rNf p-@`NW.+mlhpN\CNlNpN\+mlhpN\rNpN\pN\pNHNN!NpNHNpNHNNlN .NHNpNHNNQN .м"NHNpN\+mlhpN\pNHNN!N .`NHNpN\+mlhr2.p -@H+mlhpN\CNl6$ .HN\NNpN\+mlhpN\pNHNN!NpNHNpNHNNlNpNHNpNHNp NHNpNHNpN\+mlhpN\rNpN\pN\rNpN\pN\pNHNNaNpNHNpN\+mlhpN\pNHNNJN .,NHNpN\+mlh .R-@oj&_NC>p0."H@[H@B@[ЁN$6 <׮zr NN-@H+mlhrNHWp3HWAHHJgSHpN\pNHNN!NpNHNpNHNNlN .NHNpNHNNQN .HЮNHNpN\+mlhpN\pNHNN!N .`NHNpN\+mlhNurE0*AdpR@N6$N Nf6p0.S-@H+mlh".HpENENP+mlhNX0+mlhNuNpNtYBvFCNDruckkopf-AbstandNtUBv_CNauf normal stellenNtUBvxCNdas ist etwa - 3 -Np NN[RET] NpNENPN+mlhNNpNhVr  n   v|FX^xJt t!x"#$%&'((.)H*N+x,-./v0|1234567829h:n;t<z=>?@AB C D E F (G H I J K L 2M dN O P Q R S 0T JU tV W X Y Z [ 2\ J] b^ z_ ` a b c *d Ze f ghJijklm nVopqr0shtuvw`xyz{|} ~*0DJdzzVbllF6~8lrJV``HZn&Fv(:Tdz$*.44Tb " " : N d !!$!\!\!x!!!!!!""""4""""""#X#x########$$f$$$$$$%F%b%b%%&&"&0&F&F&&&''d 'v ' ' ' '((<(P(|()) )b)))*$*8*H*N*** +!+T"+#+$+%+&+'+(+), *,D+,D,,`-,.,/-0-1-X2-X3-t4-5.6.7.48.P9.:/;/</*=/>/?/@/A0B0 C0"D0`E0`F0|G0H0I1J1*K1DL1JM1`N1fO2P2Q2&R2VS2\T2lU2V2W2X2Y2Z2[2\3]3&^3&_3B`3a3b3c3d4e4Tf4g4h4i4j4k4l5"m5dn5jo5p5q5r5s5t6u6v68w6x6y6z6{6|7}7t~777777888$8b8x8~888889969J9v99::\:::;";6;F;b;;;<,8>8>>?2?F?r?r??@@"@@@@@X@^@r@@@@AHAABBRBnBBBBCC2C8C>C>CNCCCCCDDDHDtDzDDDEE.E4E^EzEEEEEEEEFFZFFFFFFFFGGDGXG^G^GGGGGGGHDHH I$ In Iv Iv IIJ*JhJJKrKLLRLLLMM6MxMMM M!N"N#N6$N<%N<&N^'N(O)O&*OD+OJ,OJ-Od.O/P$0Pb1Pb2Pt3P4Q5Q6Q7Q8Q9R:R;R<S=S>S?S@T ATDBTVCTlDTETFTGTHUIU(JU:KULUMUNV$OVPVQVRWSW(TW.UW.VWhWWXWYX.ZX0[X0\X]X^X_X`XaXbYcYdY6Y:DANFIN_10`IN_ABS:DA_END'IN_2@@ENDEXANFtIN_3IvNAM)KONT,DBA/BL-XVA5VB6DA3!DA1 "DA2!\DA6$DA4"DA5#DUN#DA7%bAU8IN_ZC>DA8&FKO_ADR IN_O1KO_2=SPEIG^BR1_INKORR_4KORR_5`KORR_2KORR_6KORR_3lIN_GO1DANF_2 IN_O2|KO_3>8KO_4?rBR2_INrTXTGIN_TXTCRANDW.IN_4PbLEERX0rFJ0>CK0NC9c335/I+56(Fևdf;8|VwIUL XC*99\` txA@g@:0. \4.. KLICK ACC `5KLICK RSC %`9KLICK TXT `=@ ` O(N N @NN DNNN3RByT3V3XByZ#(.N y((f09)yHfN`B?< NA\# # /?< NA\# # NuB?< NA\A C 29)XXf!A C 29)XXf!/?< NA\Nu! 0Nu! Nu! \Nu! Nu! Nu! Nu! Nu! HNu+| 0|Nu+| |Nu+| \|Nu+| |Nu+| |Nu+| |Nu+| |Nu+| H|NuB?< NA\ x>(/?< NA\|nx|l Hy ?< NA\N N HBgNA# # # # # # $# (# ,Nu?<Hy ?<=NAP>J@kHHy) Hx??<?NAO gN ??<>NAX3) )3) )Nu3) 3 ) 3) )3) )Nu?<Hy ?<J@k:Hy)Hx??<@NAO gHy ?<)NA\??<>NAXNuN,y( yNn,y(NN~NRNu yNnr0<A C E G ,y(29) 49) 6Xg$0 6Yg0 QNu0 `0 `0<A C ,y(29) 49) 6Cg$0 6Cg0 QNu0 `0 `36RByT3V3XByZ#.N 890:92<94>9633R3 T3VBXByf3p3r3t3vN 33R3 T3VBX3f3h3j3l3n3p3r3t3vN 3*R3T3V3XByZByf3 h3j3l3n3p#.N Nu36RByT3V3XByZ#.N 890:92<94>963*R3T3V3XByZByf3 h3j3l3n3p#.N Nu32R3T3V3XByZByf#.N 3.( yNn y (f3)) 3)) N>Nu y!(f"3) )3) )NN>Nu y"(fNN>,y(N`Nu y!(f"3) )3) )NN>Nu y"(fN,y(N`tA 09(2<XgQ3)`3)N`B N09(p Nu36RByT3V3XByZ#.N 890:92<94>9633R3 T3VBX3f3h3j3l3n3p3r3t3vN 33R3 T3VBX3f3p3r3t3vN Nu3nRByT3V3XByZ# .N Jy.fHy ?< NA\N HBgNA3pR3T3VByX3ZByf3hN #.(3pR3T3VByX3ZByf3hN #.(Nu3oRByT3VBXN Nu3#R3T3V3XByZ3Ff# x.N 3.H yHfHy ?< NA\NvN HBgNANu3 RByT3VBXN 3.FpAF1U@j1|3d.By03 23 43-6N 3:J3FL3HNNu3e.B0B43J:N 3RByT3VBXN Nu"< 0<NBNu"< 0<sNBNuR2f....FFFF 0Pp @`               x  d 7 d 7   w    w  KlickKLICK.RSCKLICK.INF Accessory KLICK: Eintragung pFEHLGESCHLAGENq Accessory KLICK: Resource-File: pFEHLERq Accessory KLICK: TOS: TOS-Version kleiner 1.06q <        LJ                  8000$00H*KLICK V 1.0PUBLIC DOMAIN 1992PRODUCTION BY CHRISTOPH ASCHWANDENBUCHHALDENSTR. 16 8610 USTER (CH)OK'PING'-GERUSCHALTES PINGTIEFES PINGHOHES PINGTIEFES PALHOHES PALTASTATURKLICKALTER KLICKTIEFES SUMMHOHES SUMMTIEFES KLICKHOHES KLICKABBRUCHSICHERNKLICK-ACCESSORYPUBLIC DOMAIN 1992PRODUCTION BY CHRISTOPH ASCHWANDENKLICK V 1.0BUCHHALDENSTR. 16 8610 USTER (CH)'PING'-GERUSCHALTES PINGTIEFES PINGHOHES PINGTIEFES PALHOHES PALTASTATURKLICKALTER KLICKTIEFES SUMMHOHES SUMMTIEFES KLICKHOHES KLICKOKABBRUCHSICHERNKLICK-ACCESSORY$OP+Q|}+~+     ,- .<=>JK LXY Zef gtu v ++/0+1CDEVWXhijuv w          r rr./#0$0"0L h   #"0 " 0  0          ,H  d! 0            "0( 0D  0`"#0r$0"|  #"0r!  0r    $ @ \x  0r    <!0X "0t 0  0" (***************************************************************************** * KLICK.TXT: Infodatei zum Accessory 'KLICK.ACC' * ***************************************************************************** KLICK.ACC VERSION 1.0 PUBLIC DOMAIN 1992 PRODUCTION BY CHRISTOPH ASCHWANDEN ZUGEHRIGE DATEI KLICK.INF KLICK.RSC INFODATEI KLICK.TXT ***************************************************************************** * Fr den Gebrauch des Programms * ***************************************************************************** Im KLICK.ACC knnen der Tastaturklick und das 'Ping'-Gerusch verndert werden. In zwei seperaten Boxen ist es mglich diese 2 Tne auszuwhlen. Den neu ausgewhlten Tastaturklick knnen Sie sofort ausprobieren, in- dem Sie eine Taste drcken. Das 'Ping'-Gerusch hren Sie, wenn Sie aus- serhalb der Auswahlbox mit einem Mausknopf klicken. Mit SICHERN kann eine Einstellung gespeichert werden. Mit OK oder AB- BRUCH wird die Dialogbox verlassen. ABBRUCH setzt danach wieder die alten Tne! ***************************************************************************** *Zusatzinfos * ***************************************************************************** Das Accessory KLICK.ACC ist PUBLIC DOMAIN, das heisst, jeder der es kopieren oder weitergeben will, darf dies tun so oft er will. Er darf das Programm jedoch nicht an Verlage oder sonstwie verkaufen oder sich auf irgendeine Art durch dieses Programm geschftliche Vorteile zu erlangen versuchen. Das KLICK-Accessory wurde in Assembler geschrieben. Der Sourcecode ist ca. 30'000 Bytes gross, er umfasst 15 Seiten oder etwa 1'000 Zeilen. Falls die Nachfrage genug gross ist, werde ich das Programm mglicher- weise noch verbessern! WICHTIG: Fr TOS-Versionen kleiner 1.06 funktioniert das Programm nicht. Mit TOS 1.06 und 2.06 funktioniert mein Accessory; ich frage mich nur, ob es das auch sonst tut! Da ich nicht den Dosound-Befehl benutzt habe (Fehler!), kann es sein, dass die Tne nur in TOS 1.06 und 2.06 zu hren sind. Sollten Sie die Auflsung ndern (z.B. von mittleren zu niedriger), ist es mglich, dass Sie die alten Tne nicht mehr einstellen knnen! Falls mir jemand ein paar 'Ping'-Gerusche oder Tastenklicks schickt, werde ich sie ins KLICK.ACC aufnehmen. Wer etwas zu pbeln hat oder sonst noch etwas von mir will, schreibt am Besten an folgende Adresse: CHRISTOPH ASCHWANDEN BUCHHALDENSTR. 16 8610 USTER (CH) PS: Spenden werden gerne entgegengenommen!!! . \A.. MAKE PRG ОB`MAKEFILEMKE О[MAKE_ONEMKE О\READ_ME Yc_STANDARDMKE oc `PH-``^V >>> TURBO-C <<<< for ATARI-ST Version 1.1 (C)88/89 Borland International G#^HJ$VH3^L k #^R Ј<.@#^N<"@(I$k,"Jf"JfB// ?<?<JNAO NNnA6<HCBB`6 !jBJ)gHiRC` "fSI "WJAkHiRCBSQJ)gHiRCHy`$O0 J"LN? 9PJg @N 9PNg @NNFh?<LNA// $HpNM& NM#`#` CP^ JN:#^rf#` p yVHN y`A#`N y^rN<:$_&Nu/ / E` RBNFJ@fp yVHN`NN R g&HN$J@fN RB#`3VF$ y`RH`" y`B@NM&_$_NuH4OBCE` K` RRH*NGVH Uf SpN` UR0RC|l* U ae zc U _g Ae Zc`B70RC|m`R U ae zc U _g Ae ZcN'*RNA N!|$N,J@fp SN R fNJ@fp SNO L,Nu/ / E` &R$N R gJ@gg&_$_NuH4OBCx"N:E^r RN8t:| g| g|;g` RN8X:| gGVH0<EgB|g< SpN`4| g4|g| g | g|;f|`BFf0RC RN8:| mB70`SDJDmC0HAT pN.J@fK` JDlBD` U@@RDDn` < UxJFg"p JNJ$_Nu?UOJ@gB@2pNJh` ArpNITO6Nu/?8&JlJ@g pr-NJ<`APTrpNID"0N8&Nu/?UO8&t d r NF"0NJDg r NG"|0pNI` r NF<0ArpNIXTO8&NuHUO86tdNJDgzC| or7E`r0EpNI` zC| op7`p0ArpNHTOL8Nu/r09`BN1//////////// y^nNO&09`BN0f &NuH>O8(HECPU JBC`0@A^v1RC| m3^Hy^C`BA^vN0XO09`BN/AJ0<NH#^nN0R@fAP`pN`APpNK` MNGfM_@*B.v`0H t -f "HRI NNA_N26J@f NN`v`JA_N16J@fN y` g p yVHN yVDg09VDNF29`pNFFN. y^n0<NFr09`BN.l09`BN-0OL|8Nu/N&Jg6 y^n0<NFr09`BN.0N.f09`BN-JoB@`0N y`B@&Nu/ / YOIVHE` < RgBA||bA2;N^^&^,^2^^^x8^N`pN`hN^`bN`\ RRH.AN Wg TpN` p y`>N0 RRH.AN Wg> TpN`6N<`A` N 4J@gp TN R g2 g*N(`"XO(_$_Nu/v y` <e p yVHN y` RH#`NZB@HAU` pNJ@g p yVHN&NuH0YOE` RRH#`Nl&GVH y`g SpNBDJgNN R<g̺<gĺ<fPNj R fRD` R fSD`JDf R fp SNJDl RRH.AN Wgx SpN`n<gfp SN`^N R<fRD`H<fSD`><f8JDf4 RRH.AN^ Wg SpNNN R g g p SNJDlXOL 8NuH>E` G` RRH&NL( Sg yVHpNJgT*RRMNrMVF6(RN\ R<f$<`.<g<g p yVHN&NJf<f`&$<`vN R fRC` R fSCJCfL|NuH>QOBC<E` M` RRH,NLGVH V ae zc V _g Ae Zcp SNp/@.` VR`RF|l& V ae zc V _g Ae Zc`R V ae zc V _g Ae ZcN VR =gp SNN,I[ LN!8J@fAN!,J@fp SNN(AN!J@f A N!J@gN*`z Vg SpNA N(HJl np`B@` mp`B@J@gJNKVF6,R`($:N R gp SN܅Jo mp`B@` np`B@J@f` vNh R fRC` R fSCJCfPOL|xNuH.YOE` RRH.ANIVH Wg TpNNKVF6.M`:$N R gp TN RRH,N( Vg TpNJgXOLtNuH>O*HE` &R69VFI`"TR (g p yVHN,U T )gNJ* TR )g yVHpN`BR$B3'VF/TD.`>A#`>N+pJ@fN<#`>(D+| R g g p yVHN$3VF&U* OHL|NuH06E[ApNz29VFHpNA>pNb0Hr2AU ppNJAApN@G` < SgBA|ICT qpN` SpN8 SgRHpNAWpN0<N>JfN>p y`>N*vL NuNHN y`B@NuB@N NupNNuH6QO:K[E`NrB RB@|Dgln(|,g\nJ@gV|"g.`|.g|gD`|Hg:|g4S@g0Y@g,`tR`0Nd RR<"gJfJfp` R (:f@B@N8b6TN.,<Hf "0N`<Cf 0N `x"0N*`l R ae zc R _g Ae Zb&RAN<Sf6CvAN2 J@f0N F`&pSAN,H g n`A0Nl`$`bN> R ,fR f R .fr 0Nnr 0NfRN RB@POLlxNupN NuB@NNu/?8N8&HÇPHC y`g p`r 0N0SCJ@nB@8&NuN y`B@NuH0N &EVH y`R` ,g Rp"NN ( y`R` ,g Rp"NN N6: y`g RpNN<&@0|Bg| gB| g`LJmmp# RN C`@pfmmp# RN C0`pg Rp#N C ` KNpNPCAN(T(H f"A0N6`(0NZ| fr 0NL LN'8R@f LN)A>0NB@OLNuH(OE_@tC[2<B@ JN P#`AN y`gp`BpAN:`6f*I`C JN/fC JN. JN:6N:XJ@g0H#QB@OLNuH8OE[G_@tC2<B@ KN#`AN| y`gp`:IVD Tg0N:829`pN:46/f$CANJ@gCANJ@g/f.CANlJ@gCAN\J@fpAN:8`F/fCAN8J@fpAN98`"B@AN9,J@g B@AN98` pAN98 Tg Tg Tm T-o ApNB`20o t2pN9pN93`2pN9H6JCg"ApNApNr pN,r pN$B@OLNu/ QOBWBo?|?|G`Br0N hr0N zr0N >A0N NPO&_NuH>E[G_@tC2<B@ KNI`K`+T( MN TN-r;@M[|o NpNLApNBp`B@ MN7;@N#;@2-g*J@f& NpN MpN A6pN+|`M`B0-g@r0N P KN"H+@0N -gXAIpN"-pNA>pN`8"TAN,hm~r0N Hy[C~ MB@N8XOH+@0N\#Q mB@L|NuH>OpNN*$HG`IVH"SR ,gp" TNK_@tC]22<B@ MN&BC` Sp00Nv S0RC S00fK MN* Sg TpN?<L4<|r,0<NTO,Hr09`BN*HWC MN^XO609`BN NNbJCg0gr`BAH#QJgt&AN Sg TpN jN-8 <N,Z%Hfp TN2<B@C jN62<C jN@pCH jN+l%Hfp TNB@O&L|NuH8UO<:/"2H >6BSCHÇ ARCxCJFm<|m62E|n,J@m(2B|npN+$H g0HN+&H f`P%K 0H2IFI??N6l(H00%L5C5D5EB@`BB`&RBBnR@2I@n JTOLxNu/ $H g@ j B@`$BA` "jX"RAjmR@2*IHӪjm j N+ JN+$_NuNo p yVHN y`B@NuNJ@f p yVHN y`B@Nu <Nu/ y`R` (g p yVHNN& y`R` )g yVHpN N&Nu/ y`R` (g p yVHNNh& y`R` )g yVHpN N&NuHpN%^$fp SN R p R!@ R!@ R!@ R!@ R!T R!l `J  Rg"` , R "Jl RA$H`Jo RA$H` R (g Sp!N R RLNuH0N`&E`&RNBA|^g0|g |g`*N6JfJgp`B@H&`N&`N`$NT L NuH0NN&E`&RNfBA|&g |g`"N*JgJgp`B@H&`N&`$ L Nu// N&$y`NBA|g`n|NBnp`B@H`,N0lp`B@H`Nop`B@H`#` $_&NuH0N:&E`&RNPBA|+gUAg `Nր`N`$ L NuH0Nj&E`&RNBA|%g2[Ag[Ag`< /N@" N*&` /N," N+&` /N" N+|&`$ L NuH BC8:NxE` R -f zR`vDR R !g (fRN, RR )g< yVHpN`0 R ae zc R _g Ae ZbN,`N,JEg D` ,JCgJgp@H`0Hr` LxNuNA`"PRBA|=g@n|!g8[Ag|g.Nu|>g&|>gNu"P &f(<"PRNu"P |f`"P =f <)RNuH*TEVHM@ NNA($)N@J@f #`N& y`g RpNBD`x$(JDf#` OLtNu2It4AU p(pNLA]PpN@p y`>NNu y`R` (f y`R` )g p yVHNNu<ae<zc*<Ae<Zc<0e<9c<_g <?g<*fr`BA0NuH8&HNږE` R<ae<pc <Ae"<Pb R(<:f@TIx`(KBD R< gJf p yVHN`(<\g"` R\@RDHkC I@ LNDXO@ R \gJDf p yVHNNB3@"LANB"KANLNuH<*H(I&oBC8E`"R .fN )\fB@r.Rp` R (.f& (\fB@r.AATp` RNJ@fp yVHN` RNjJ@g R0 RR0RC|m.0B30 R .gB`4R.0RC` RN&J@g R@RD RR0RC|mB4@0L<NupN NuB@NNu?/ O@6 y`R` (g yVHpNE_@tC]h2<B@ JN* y`R` ,g p" yVHNtC]k2<B@AN y`R` )g p yVHNJCg C JNH` C JNHO$_6NuH0pNN$H <N(&H f p yVHN KN<6pCH KNV&H f p yVHN jN%K y`B@L NuH0&HBCE]hApN`,< e0RCpN`<fJCg SCA pNגN&< g|mB30ApNr0L Nu/ E]d`&0RR| o4gpN"rf p$ yVHNpN!J@gpN!$_Nu?/ QONA`"P ae zc"P _g Ae Zb AN<Sg p yVHN<AfpsAN&H f8p yVHN`,ApN:&H +fpN'Hf p yVHN kBNj KPO&_6Nu/ B@C``04R@$Q2 gB@`0f4HՑp$_NuH>OBCN E`G IVH R ae zc R _g Ae Zb KN<Sf R ($gp TNBD`@@RD|mB+ KN[@oz` KN*.PN՜ RR ,gp" TNKtC]|2<B@A_@N,R$_@ MN Rg TpN$ (fN,`BF0 MN J@fRC0|H:<AP2|H:HA<AP KpN,H nN <N-Hfp TN2<B@C nN82<C`0 nN8pDH nN -Hfp TN| #l NJ@g\A]lN(J@fA0HN. hN` WB"RB@O(L|xNuH:OBCpANB$HIVH"y`R` ,gp TNtC]j2<B@A_@.NANM` WNJ@g WR0RC|mB60AN Wg TpN.`#`AN y`g TpN <N&H fp TN2<B@C KN62<C KNp62<"N KNb6pCH KN&H fp TN jN6%K W#`B@OL\NuH>N>&xCD*ʼ,̼p ?420NLTOA]0N(ȼp*ʼr,̼t|?024N TOLNuH8:O(H<:,IvBDE`JBg.NB R 'f"'p "NANB/ A/H xR`V/N `N R "f20 LN*<v`4 R /f R R /g 'g "f`x R {fRN\*H gX -g*,R&@$+|]BBC]20 LN0<$+K`42  LN<Nv RR }g,p yVHN` R {f RR`RFFl p yVHNv`xBC`r R ae zc R _g Ae: Zb4JCg2N*H g -g2"@ L0N<`*42  LN <`v RR`RFFl p yVHN RgBA0 o N 2 gJDg RR 'g p yVHN`NΌB4`0OL|xNuCd2222Ab1|Bhrr`AbBh1|1Ar`Ab1ABh1|r`AbBh1|1Ar`AbBhBhre`AbBhBhr{`3b/ Cb2dBi3| Cp 2Q"<7psNB _0bAe"op+2QAep 2QNubcdeeAbBh1|1Arz`1@ 0"<]psNBAe0Nup `"p`#f#fpZa "o2Nu3b@@A CbB@22220<"<8>NBAe0Nubbcefh / 09]kbP`&H/<?< NA#i/@NA\ K$9ig 3]"B`"A]Nv"K f$By]`JS@f"yi f0<`6"H yi f0<`$/NXO`HyiHy]NPOJ@k09i&_Nu"_HpNLJ@f0<N/ / "y^H"i,gD$Hfg:f&IgfJg( J`g J"K` =g J"K` IJfRH&_$_Nu`O~"Ap~WF< oJf J(fp @/Ho/?<?<KNAO oJk0p`Z|g"|g&|g*|g.|g23 PH`03PH`&3PH`3PH`3 PH`3PHpONu"PdB@ Nu(g*gg/a _J@f/aD _J@kf"P`3 PHpNup/aXONuH&H(o Ia6kl g La` a(Jf\(H <a)HgN0@0;\ Ka|gB9@{0`Q l)H()H C#PN LLNup`p`p 3PH la $`a)b*a)b* YOCBgg Ar`THWf0XONup`rwar+w+a+rbwbabr+b rb+ w+b wb+ a+b ab+ Aip`Ar(WVNu?/ A^aRA^$aHGi6<`Gp+g Ka*QJ9^NAXOpCgB?<?p/?<BNAO Jj*`0r߲f*r Cg$pCW|?/ ?<NAXOJkpNua3PHpNu/?<ANA\OJkpNua3PHpNuJ@g//??<?NAO JkNu `a3PHpNuH&Hx&SgkJ9^:kpfxa<g < g6<gJ< e七dRa`JgSSKpap apa`Rp a^:p a`vJgr^:`hxB9^:`^x B9^:`PJ9^:k^ffar<g< g&<g:< eRa``JgSpaTp aPpaL`Rp aD^:p a8 LNuJg^:`xB9^:`x B9^:`?<NATONu??<NAXONu|g2//??<@NAO JkfNua(3PHpNu3PHNu// &H&g??<NAXOSb&_&Nu|b2@?? /?<BNAO JjfSBg jX?<? p/?<BNAO Jk$`X?<? p/?<BNAO JkxЁ"kr?<? p/?<BNAO JkZ$`?<? p/?<BNAO Jk>$Ҁk8 $k0HzP <e/`/? ?<@NAO Jk b Nua3PHpNu0<`D@| |"b;NupNu   JgJgJgJgJg JgJgJfSHggggg ggf @NugfSHNuJgNugHf8g@f0g8f(g0f g(fg fgfgg!epNupNuJfpNu g<g8g4g0g,g(g$g ggggg ggf @Nu"HJgJgJgJgJg JgJgJf SNu"SefBJgSf ANu/ &H" kPR<"+eb"`fa g|$<eJd&Qan gdpШ"K/a Ka* _J@gF`H"// ?<?<JNAO Jf0'A K`$ nfte'@A!Aap K&_Nu`// &oPR<e&/?<HNA\OJo @!CC^> "A`xE^B$R f4/< ?<HNA\OJoj$@Ap !| %H$^B#^BA"P` )d I"Q f`rd ` #@#C"nA$_&Nuk |`3 PH` oJQ d nf>avJg*`4C^> g*g"@ f`"/?<INA\OJj` pNugp`/ G^> g/ &S?<INA\O`G^B g/ &S?<INA\O`&_NuH0$< CE^B g" c $@ f`&@ +gb*"Ҩeg ` 'H`p"@")Ө 'H`>"@ gb" ҩeg`N"(ө`" "H" ҩf @"(ө" k eb$/ ?<INA\OJfQL NuP`Jg/bg2 4gf!Sf`f`!Sg"gH?LxH?LxH?LxH?Lx`H?Lx8H?LxH?LxH?LxH?LxH?LxpH?LxHH?Lx H?LH?SfvLx2|HgS@!!Q|gSA!Q`2 4gfSf`f`S"gH?LxHxLxHx(LxHxPLxHxxLxHxLxHxLxHxLxHxLxHx@LxHxhLxHxLxHxLHSfxLx2|HgS@ Q|gSAQ _Nu<0< SHNu|A:0|Nu|A(0|NuBAA0NuBAA0Nu  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@$HBJBf($HBJBf H@B@H@NuB@H@HB0@0H@0H@Nu AH@r2B@tЀӁd҈рӁQF@Nu$HBJBf"$HBJBfB@H@NuB@H@HB0B@H@Nu A"B@H@HABAtҁрdЈӁрQNu$jD BJjD$HBJBf"$HBJBf $jDNuHBЂ$jDNuHBЂ$jDNu$jD"BJjD$HBJBf4$HBJBfH@B@H@$ jDNuB@H@HB0@0H@0H@$ jDNu AH@r2B@tЀӁd҈рӁQF@$ jDNu"@$jDJjD$HBJBf.$HBJBfB@H@$ jDNuB@H@HB0B@H@$ jDNu A"B@H@HABAtҁрdЈӁрQ$ jDNu/ Hz^?<?<NMPO/Hz?<&NN\O?<?<NMPO$_Nu OJx@3^F1B x@f1J x@fp!PNu.H3 ^FNu/?<NA\ONu?/?<NNAPONu?<NATONu?<NATONu?<ONATONu??<NAXONu??<>NAXONu??<ENAXONu/?<HNA\O @Nu/?<ANA\ONu//??<JNAO Nu???<FNA\ONu//??<@NAO Nu/?< NA\ONu?/?<QTIME_F&SYSTEMRRTOLOWERVERSIONTOUPPERRZRxTIME_S'R<RSCANCHAR)>QRexists$extcmp*Rgetint)Rgetchar(SS,scanchar)>peek'$ShistomakeNSJSstrcmpnc,Ftime_f&systemSStolowerversiontoupperTT:time_s'STXstrcmp,>STvdate_of(NRTTVLVNVRVXV^VeVlVsVzVVVVVVVVVVVVVVVVVVVVVVVWW WVFbZ ,.0RblrLn TWWBWWWWWX%X>XLXZXrX~XXXXXXXY#YUYpYYYZZLZZZ[ [0[<[][z[#DELSHOWSSHOWCOUT_TOSPACECSPACESGETSTRSEARCHCHG_EXTGEMPUTSPUTCLETGOSUBPOKEDIRWARN_VERWARN_SYSEXITIFELSEENDIFWHILEAGAINREPEATUNTILEND.FORNEXTBREAKCONTINUEFUNCRETURNENDFUNCMaximale Zeilenlnge wurde berschrittenEs wurde versucht ber das Dateiende hinauszulesen: vermutlich fehlt END. , sonst StrukturfehlerFehler im FunktionsnamenErwarte END.Fehler beim Pgm-AufrufUnzulssiger BefehlFehler bei Ausfhrung einer einfachen AnweisungSyntaxfehler im AusdruckErwarte ENDIFErwarte AGAINFehler in VariablennameErwarte '='Erwarte TOErwarte NEXTSyntaxfehlerErwarte UNTIL AusdruckErwarte Klammer(n)Erwarte ENDFUNCZeile zu langFehler in Dateiname, bzw. Syntaxfehler im SchlsselwortFehler beim ffnen bzw. Einlesen der MakeprozedurFehler bei der IndizierungMaximale Stringlnge berschrittenOperand mu (existente) Stringvariable seinKeine gltige Anweisung im HauptprogrammUngltige Zeichen nach einem StrukturbefehlDiese Prozedur erfordert eine neuere InterpreterversionProzedur kann nicht ausgefhrt werden, da keine Shell installiert istErwarte '"'Es mu sinnvollerweise mindestens eine Abhngigkeit angegeben werdenUnerlaubte Mischung von VariablentypenKein Speicher fr malloc/realloc mehrErwarte '''Unerlaubte Zuweisung an FunktionErwarte weitere(n) ParameterParameter auerhalb der DefinitionsmengeAbbruch durch BreakpPgm-Aufruf:q TOtoSTEPstep Prozedur wird abgebrochen! Anweisung Nr. K ! komplette Zeile:>< Eine Taste zum Fortfahren DATEpSHOW:q in DateirFehler beim ffnen der DateiconstdoutprinterprnPRN:auxAUX:pOUT_TO:q Fehler beim ffnen von: OUT_TO:q Fehler beim Umlenken in Kommandozeile zu lang! existiert nicht pShell-Aufruf:q Returncode ,).):)+=.FEHLER.) ! Bitte nochmal: :,)),eD Df ,( .FEHLER.bcdeeSHELL]]]^^!^!^!^"^7^7^7^8 f8d &  (<40h " "  0 0   "*< ,Pt J"    F$* $ . X4jd"$b   :<, Dl||.RfT@t:p  @ *( &H   TR@@j  J$h&(6( < :N J|JZ$&` hP$4@& 8"|2    & T "h& ,\ F B  f4R*:* .2<R Z warn_ver 201 # # Hier nun eine Prozedur, die mglichst an ein echtes "Makefile" angelehnt # ist. Es sollen drei Module bersetzt werden, die alle von einer gleich- # namigen Include-Datei abhngen, sowie von einem Projektinclude. Die An- # fhrungszeichen sind unschn und in der Regel berflssig, sollten aber # aus Sicherheitsgrnden verwendet werden. # # (c) P. Vranken, 1992 # let cc$ = "\usr\bin\cc.prg" let cl$ = "\usr\bin\cl.prg" if istomake("main.o": "main.c", "main.h", "Makefile.mke", "projekt.h") cc$ "-xyz -inc=\usr\include main.c"; exit RC; endif if istomake("up1.o": "up1.c", "up1.h", "Makefile.mke", "projekt.h") cc$ "-xyz -inc=\usr\include up1.c"; exit RC; endif if istomake("up2.o": "up2.c", "up2.h", "Makefile.mke", "projekt.h") cc$ "-xyz -inc=\usr\include up2.c"; exit RC; endif if istomake("programm.prg": "main.o", "up1.o", "up2.o") cl$ "-xyz -lib=\usr\lib -o=programm.prg main.o up1.o up2.o -lm"; endif end. warn_ver 201 # # Make-Prozedur fr ein Ein-Modul-Programm. Es darf eine .h-Datei des # gleichen Namens existieren, mu aber nicht. Wird ein Parameter bergeben, # dann ist dies der Name des C-Moduls, sonst wird derjenige dieser Prozedur # verwendet. Man braucht ihr also immer nur den Namen des C-Programms zu # geben, und alles ist in Ordnung. # # Die verwendeten Pfade und Optionen mssen natrlich erst angepat werden # let cc$ = "\usr\bin\cc.prg" let cl$ = "\usr\bin\cl.prg" let prog_art$ = "prg"; # stets verwendete Dateiendung des fertigen Programms let cc_options$ = "-xyz -i=\usr\include" let cl_options$ = "-xyz -o=programm$" let library$ = "float.lib std.lib tos.lib" let programm$ = 'argv$[argc==1]' let quelle$ = 'programm$' let object$ = 'programm$' let include$ = 'programm$' chg_ext quelle$, "c"; # ergibt den Quelltextnamen chg_ext object$, "o"; # ergibt den Namen des Linkmoduls chg_ext include$, "h"; # ergibt den Namen der evtl. Includedatei chg_ext programm$, 'prog_art$';# ergibt den Namen der ausfhrbaren Datei # nun geht es ans bersetzen while istomake(object$: quelle$, include$) putc "cc.prg ", cc_options$, " ", quelle$. del c_err out_to c_err cc$ cc_options$ quelle$ out_to stdout if RC; # Fehler: Editor starten ed.prg c_err quelle$ exit RC; # Prozedurabbruch vom Editor mittels Returncode != 0 endif again # jetzt noch zusammenbinden if istomake(programm$: object$) putc "cl.prg -o=", programm$, " -s=", stacksize, object$, " ", library$. cl$ {cl_options$} object$ library$ # Dank der geschweiften Klammern wird innerhalb von cl_options noch die # enthaltene Variable programm$ richtig expandiert. if RC; # Link-Fehler: Ausgabe anhalten, damit man die putc "eine Taste zum Fortfahren". gosub getchar(); # Meldung des Linkers lesen kann del programm$; # sonst knnen fehlerhafte Programme erzeugt werden else putc programm$, " wurde erzeugt". endif else putc programm$, " ist auf dem aktuellen Stand!". gosub getchar() endif end. Kurze Erklrung zum Make-Interpreter Aachen, Juli 1989 Sinn und Aufgabe: Dieses Programm sollte die Unzulnglichkeiten meiner Kopmmandoshell lindern helfen. Es sollte in der Lage sein, vermittels weniger spezieller Befehle den Aufruf von Compiler, Linker, Editor in logischer Abfolge zu steuern. Dazu sind offenbar Mechanismen erforderlich, die Programmstarts ermglichen und die Returnwerte zur Fehlerabfrage zur Verfgung stellen. Desweiteren bentigt man Zeitabfragefunktionen, die es erlauben, den Compiler wirklich nur dann starten zu mssen, wenn dies erforderlich ist. In der Regel wird ein Altersvergleich von Quell- und Objektdatei hierfr gengen. In der vorliegenden Version stehen neben einigen einfachen Anweisungen auch vier Strukturbefehle zur Verfgung, die recht bersichtliche Programmierung erlauben: IF/ELSE/ENDIF, WHILE/AGAIN (mit BREAK/CONTINUE), REPEAT/UNTIL und FOR-TO-STEP/NEXT. Alle sind bis zum berlaufen des Stapels schachtelbar. Allgemeine Anweisungen und Syntaxregeln: Die zu bearbeitende Prozedur mu als ASCII-Datei abgespeichert sein und mu unbedingt auf ".mke" enden. Das vorliegende Programm wertet zunchst die Kommandozeile aus, wenn hier ein Argument vorhanden ist, welches durch ein fhrendes "-" gekennzeichnet ist, wird es als Name der Prozedur benutzt. Der Interpreter hngt nur noch ein ".mke" an. Ansonsten wird die erste Datei im aktuellen Verzeichnis, die auf ".mke" endet, als Makeprozedur abgearbeitet. Gibt es keine solche, dann erfolgt eine Fehlermeldung. Soll das Programm vom Desktop gestartet werden, mu es also in make.ttp umbenannt werden, oder es mu sichergestellt werden, da sich maximal eine .mke Datei im aktuellen Verzeichnis befindet. Es empfiehlt sich aber die Verwendung einer Kommandoshell. Mit den brigen Kommandozeilenargumenten wird wie folgt verfahren: sie werden der Reihe nach in die vordefinierten Stringvariablen kopiert und ihre Anzahl in der vordefinierten Variable DONE gespeichert. Sie knnen dann mit Hilfe der Stringfunktionen ausgewertet werden. Eine Zeile enthlt beliebig viele Kommandos, die durch ";" getrennt werden. Das letzte Kommando einer Zeile braucht nicht mit ";" abgeschlossen werden. Ein Kommando kann mit beliebig vielen Spaces anfangen, um so eine strukturorientierte Schreibweise zu ermglichen. Danach folgt entweder ein grogeschriebenes Schlsselwort, oder das Kommando wird als zu startendes Programm interpretiert. Im ersten Fall wird bei korrekter Syntax der Befehl ausgefhrt, im letzteren wird alles bis zum ersten Trennzeichen als Pfad und Dateiname des zu startenden Programmes interpretiert, der ganze Rest des Kommandos wird als Kommandozeile weitergereicht. Der Rckgabewert wird in der vordefinierten Variablen RC zur Verfgung gestellt. Hieraus ergibt es sich, da relativ hufig die zunchst unsinnig erscheinende Fehlermeldung "PGM-Aufruf: ... existiert nicht" erfolgt, wenn man sich vertippt hat. Schlsselworte mssen von den folgenden Argumenten stets durch mindesten ein Leerzeichen getrennt sein. Jede Prozedur mu durch END. beendet werden, alles was danach folgt wird ignoriert. Vor dem ersten Befehl drfen eine beliebige Anzahl von Funktionen definiert werden. Beschreibung der einzelnen Kommandos und Funktionen: Vorbemerkungen: Pfadangabe sei im folgenden eine komplette Angabe von Pfad und Name einer Datei. Ausdruck sei eine Zeichenkette, die sich zu einem numerischen Wert berechnen lt (stets long int). Zugelassen als Bezeichner sind Zeichenketten, die aus Klein- bzw. Grobuchstaben und dem Unterstrich bestehen. Lediglich die ersten acht Zeichen sind jedoch signifikant. Noch nicht belegte Variablen werden nach guter alter Basicmanier als Null angenommen. Zuweisung an Variablen: siehe "LET". Folgende Operatoren stehen zur Verfgung (in absteigender Rangfolge): ! (logisches not) ; *,/,%(modulo) ; +,- ; <,>,==,!=,<=,>= ; &&,& (logisches und bitweises und) ; ||,| (dito mit oder) . Die logischen Operatoren , sowie die Vergleichsoperatoren liefern Eins fr wahr und Null fr unwahr. Es drfen verknpft werden: Variablen, vordefinierte Funktionen, Zahlen- und Zeichenkonstanten. Ein Beispiel fr letztere: 'A' liefert den Wert 65. Zahlenkonstanten knnen mit dem Symbol '$' versehen werden. Sie werden dann als Hexadezimalzahlen ausgewertet. Die Rangfolge kann wie blich mit Klammern aufgehoben werden. Fr die Pascal bzw. Modula-Programmierer, denen der Umgang mit der Darstellung von Wahrheitswerten durch Integerwerte sowie mit Bitoperatoren nicht vertraut ist, seien hier einige Beispiele fr Ausdrcke angegeben: (3*3%7==2)+(7>5)*99 (liefert 100) (3*3%7==2)+(7>5)*99 && 98=='b' (liefert 1) !!!!(4*5+3/(5+8)) (liefert 1) 7&4|$10&ff (liefert 20) !0 (liefert 1) Einige Worte zu den Stringvariablen Anders als bei numerischen Variablen, sind bei der Stringverarbeitung sehr enge Grenzen gesetzt worden. Es steht ausschlielich das 16 Elemente umfassende Array FN[...] zur Verfgung. Es gibt keine Mglichkeit auf einzelne Zeichen zuzugreifen, die Verarbeitung beschrnkt sich somit Zuweisung, Vergleich und Addition ganzer Zeichenketten. Da die Stringverarbeitung eigentlich nur zur Generierung und Auswertung von Kommandozeilen vorgesehen ist, habe ich ihre Lnge auf 128 Zeichen begrenzt. Dadurch entfiel die Implementierung einer dynamischen Speicherverwaltung mit all ihren Problemen. Ein Begrif, den ich hufiger verwenden mchte, ist die Stringexpansion. Darunter verstehe ich folgendes: alles weitere des betreffenden Kommandos wird Zeichen fr Zeichen als String betrachtet, lediglich wenn die Auswertung auf FN[] trifft, wird dies durch den Inhalt der entsprechenden Variablen ersetzt. Dieses Ersetzen kann unterdrckt werden, indem ein Hochzeichen (") eingefgt wird. Nun wird bis zum nchsten " alles orginalgetreu bernommen. Das " selbst kann also nicht in den String bernommen werden. Die Expansion bricht ab, wenn sie auf ein Komma oder eine Klammer-zu trifft. Sollen diese Zeichen in den String, dann mssen sie in Hochzeichen gesetzt werden. Die Stringexpansion wird bei einigen stringverarbeitenden Funktionen angewendet. Einzelne Kommandos (nicht mit Funktionen zu verwechseln, welche nur in Ausdrcken stehen drfen und durch Funktionsklammern kenntlich sind): *** PUTS ***: Ausgabe an Stdout (vergleiche OUT_TO). Die Argumente knnen in beliebiger Anzahl vorhanden sein und mssen durch Kommata getrennt werden. Zulssige Argumente sind insbesondere in Hochzeichen eingeschlossene Zeichenketten, oder Ausdrcke, welche dann natrlich vorher ausgewertet werden. Vor die Ausdrcke darf ein "h:" gesetzt werden. In diesem Fall erfolgt die Ausgabe im Hexadezimalsystem (wie fr Hexzahlen blich als vorzeichenlose Zahl). Auch ein "d:" fr Dezimalausgabe ist zulssig, wird aber ohnehin als default angenommen. Ein "c:" bewirkt die Ausgabe als Zeichen, z.b. kann man mit PUTS c:27, "E" den Bildschirm lschen. Da die 27 als Zeichen ausgegeben wird, kann sie vom VT 52 Emulator als Escape erkannt werden. Somit stehen alle Steuersequenzen zur Verfgung. Als weiteres Argument darf FN[...] geschrieben werden. Der entsprechende String wird ausgegeben. Ein spezielles Argument ist DATE, welches Datum und Uhrzeit in blicher Formatierung ausgibt. DATE ist aber keineswegs eine vordefinierte Variable, kann also wirklich nur von PUTS erkannt werden. Wird hinter das letzte Argument ein Punkt gesetzt, dann wird die Ausgabe mit CR/LF abgeschlossen, ansonsten erfolgt die Ausgabe des nchsten PUTS direkt hinter dem zuletzt ausgegebenen Zeichen. *** SPACES ***: Ein Argument vom Typ Ausdruck. Es werden soviele Leerzeichen ausgegeben wie der Wert des Ausdrucks modulo 80. *** PUTC, SPACEC ***: wie die beiden vorhergehenden, jedoch erfolgt die Ausgabe grundstzlich auf dem Bildschirm. *** LET ***: Hierdurch wird eine Zuweisung an eine Variable vorgenommen. Die auf LET folgende Zeichenkette mu wie folgt aufgebaut sein: gltiger Variablenname (s.o.), evtl. Leerzeichen, "=", evtl. Leerzeichen, fehlerfreier Ausdruck. Die Anzahl der mglichen Variablen ist nur durch den Speicherplatz begrenzt. Da hier aber keine Abfrage erfolgt, sollte man nicht mehr als einige Tausend Variablen einfhren, sonst gibt's einen 2-Bomben-Bus-Error. Bereits belegte Variablen werden bei einer Zuweisung mit dem neuen Wert berschrieben. Nicht belegte Variablen werden als Null angenommen. Vorsicht: bei allen mir bekannten Programmiersprachen kann auf eine Kennzeichnung einer Zuweisung verzichtet werden, daher vergit man das LET allzuleicht. Dies fhrt dann zur Fehlermeldung "Fehler in Dateiname", da die Zuweisung als Programmaufruf interpretiert wird. *** LONGPOKE ***: Argumente sind eine Adresse und durch Komma getrennt ein Wert. Dieser wird in der angegebenen Adresse abgespeichert. Es wird im Supervisormode gearbeitet, daher Vorsicht vor Abstrzen! Es mu unbedingt vermieden werden, eine ungerade Adresse anzusprechen, um den 3-Bomben-Adress-Error zu vermeiden. Vergleiche auch die Funktion LONGPEEK().(s.u.). Diese Funktionen sollen die Systemvariablen zugnglich machen. *** DEL ***: Argument ist eine Pfadangabe. Die entsprechende Datei wird gelscht wenn mglich, RC erhlt den Wert 1 im Erfolgsfalle, sonst 0. DEL wertet Wildcards aus, es werden also alle auf das Muster passende Dateien gelscht. *** GEM ***: Dieses Schlsselwort am Beginn einer Zeile, die ansonsten genau den Regeln eines Programmaufrufs gengt (siehe unten), bewirkt, da vor dem eigentlichen Programmstart noch der Bildschirm mit dem Desktopraster berschrieben wird. Einige Gemprogramme, die dies leider nicht selbst besorgen, erfordern also die Benutzung des Befehls. *** RETURN ***: unbedingter Abbruch der Prozedur, wenn im Hauptprogramm benutzt. *** GOSUB, FUNC, ENDFUNC ***: siehe Funktionen. *** CHG_EXT ***: erstes Argument ist eine Stringvariable. Ihr Inhalt wird als Pfadangabe interpretiert. Gelingt dies nicht, gibt es eine Fehlermeldung. Ansonsten wird die Dateierweiterung der spezifizierten Datei gegen das zweite, durch Komma abgetrennte Argument ausgetauscht. Gab es zuvor keine Erweiterung, so wird noch ein Punkt eingefgt. Das zweite Argument besteht lediglich aus ein bis drei Buchstaben, nicht in Hochzeichen eingeschlossen. Sinn dieser Anweisung ist es, abhngige Dateien zu ermitteln. Es knnen z.B. mit SEARCH *.C alle Quelltextdateien gesucht werden und mit Hilfe von CHG_EXT und DATE_OF ein Altersvergleich mit den gleichnamigen .O Dateien vorgenommen werden. *** SHOWC ***: Argument ist eine Pfadangabe. Die entsprechende Datei wird unabhnig von der Ausgabeumlenkung auf dem Bildschirm ausgegeben. Typische Anwendung drfte die Ausgabe der Fehlerdatei nach dem bersetzungvorgang sein. *** SHOWS ***: wie SHOWC, aber Ausgabe ber Standardkanal, also umlenkbar. *** OUT_TO ***: Die umlenkbare Ausgabe wird in die als Argument angegebene Datei gelenkt. Umlenkbar sind sowohl PUTS, wie auch SPACES und die Ausgaben der meisten der gngigen .tos oder .ttp Programme. Erforderlich ist die Umlenkung, weil kein Fehlerkanal im TOS besteht und die Compiler somit gezwungen sind, alle Fehlermeldungen ber den Standardkanal auszugeben. Man lenkt die Ausgabe also vor dem Aufruf des Compilers um, etwa in "fehler.err", und kann die Liste der Fehler nachher im Editor verwenden. Fr die Rckumlenkung auf die Konsole gibt es den vordefinierten Dateinamen "con". Die vordefinierten Namen fr Drucker und serielle Schnittstelle lauten "printer" und "aux". Prinzipiell knnte OUT_TO im Zusammenhang mit SHOWS zum Kopieren von Dateien verwendet werden, jedoch erfolgt eine Aufbereitung der Zeilenendezeichen, so da dies grundstzlich auf reine ASCII-Dateien beschrbnkt bleiben sollte. *** SEARCH ***: Argument ist eine Pfadangabe, die in der Regel Wildcards enthalten drfte. Es werden alle Dateinamen, die auf das angegebene Muster passen, der Reihe nach in die Stringvariablen kopiert. Dabei wird mit FN[0] angefangen. Die gefundene Anzahl wird in DONE abgespeichert. Es darf ein durch Komma abgetrennter Ausdruck folgen, der das Dateiattribut angibt, das die gefundene Datei besitzen sollte *** GETSTR ***: Argument ist eine Stringvariable. Es wird ein String von der Tastatur eingelesen und an die Variable zugewiesen. Vorsicht: im allgemeinen wird man wohl Dateinamen einlesen. Dies ist insofern kritisch, als keine Mglichkeit besteht, Tippfehler zu tolerieren. Wird nmlich eine Funktion aufgerufen, die eine Pfadangabe erwartet, erfolgt sofortiger Abbruch der Prozedur, wenn "Fehler in Dateiname" vorliegt. *** STRCPY ***: erstes Argument ist eine Stringvariable. Das zweite kann ein in Hochzeichen eingeschlossener String, oder eine zweite Stringvariable sein. Es erfolgt keine Expansion. Die Argumente werden durch Komma getrennt. Der zweite String wird an den ersten zugewiesen. *** STRCAT ***: Fr die Argumente gilt das gleiche wie bei STRCPY. Der zweite String wird an den ersten angehngt, das Ergebnis steht im ersten. *** # ***: Einleitung eines Kommentars. Alles bis zum nchsten Kommandotrennzeichen wird berlesen. Auch auf dieses Kommando mu zunchst ein Leerzeichen folgen. *** WHILE, AGAIN ***: abweisende Schleife. Ist der Ausdruck hinter dem WHILE von Null verschieden, dann werden die Befehle zwischen WHILE und AGAIN solange ausgefhrt, bis sich dies gendert hat. Ansonsten wird hinter dem korrespondierenden AGAIN fortgefahren. Wird in der Schleife ein BREAK gefunden, dann wird die Schleife unmittelbar an dieser Stelle verlassen und hinter dem korrespondierenden AGAIN fortgefahren. Bei CONTINUE wird sofort mit der nchsten berprfung der WHILE-Bedingung fortgefahren. Diese beiden Befehle werden nur von der WHILE-Schleife erkannt, man darf sie also nie in den anderen benutzen, auch dann nicht, wenn diese von einer WHILE-Schleife umschlossen werden. Dahingegen drfen die Befehle in einer beliebig geschachtelten Anzahl von IFs benutzt werden, es wird dann die nchstumschlieende WHILE-Schleife angesprochen. *** REPEAT, UNTIL ***: nicht abweisende Schleife, UNTIL hat einen Ausdruck als Argument. Die Kommandos zwischen REPEAT und UNTIL werden ausgefhrt bis der Ausdruck wahr (also ungleich Null) wird, aber mindestens einmal. *** IF, ELSE, ENDIF ***: IF hat ein Argument, einen Ausdruck. Ist dieser ungleich Null, also wahr, dann werden die Anweisungen zwischen IF und ELSE ausgefhrt, sonst diejenigen zwischen ELSE und ENDIF. ELSE darf weggelassen werden. Vorsicht bei IF, ELSE IF, ... , ELSE IF, ENDIF Konstruktionen: da ein ELSE und das folgende IF gewhnlich in derselben Zeile stehen, mssen sie durch Semikolon getrennt werden. Auch mssen in der letzten Zeile der Konstruktion soviele ENDIFs stehen (auch durch ; getrennt), wie IFs verwendet wurden! *** FOR, TO, STEP, NEXT ***: abweisende Schleife. Zwischen FOR und TO mu eine Zuweisung erfolgen, hier jedoch ohne das Schlsselwort LET. Nach dem FOR steht ein Ausdruck. Folgt nun das optionale STEP, dann mu danach als letztes Element des Kommandos noch ein Ausdruck folgen. Fehlt STEP, wird als Schrittweite Eins genommen, sonst das Ergebnis des Ausdrucks. Die Schleife wird solange ausgefhrt, bis die Variable, die in der Zuweisung verwendet wurde, echt grer ist als der Ausdruck hinter TO. (Schrittweite>0 vorausgesetzt, ansonsten analog) Sehr wichtig: Die Auswertung der Ausdrcke erfolgt nur vor dem Eintritt in die Schleife, daher kann sich die Schrittweite ber einen Laufzeitausdruck nicht verndern! Mit NEXT wird die Schleife abgeschlossen. Vordefinierte Funktionen: Diese Funktionen liefern numerische Werte und knnen somit (nur!) in Ausdrcken verwendet werden. *** TIME_F() ***: liefert die Systemzeit in 1/200s - Schritten ("fast"). Nach dem ersten Aufruf erhlt man einen zuflligen Wert, danach immer den Wert, der der seit dem letzten Aufruf vergangenen Zeit entspricht. Soll ein Programmlauf gestoppt werden, mu also vorher TIME_F() einmal mit GOSUB aufgerufen oder einer Dummy-Variablen zugewiesen werden. *** TIME_S() ***: liefert die Systemzeit in Sekunden ("slow"). Hierbei ist garantiert, da es sich um die absolute Sytemzeit handelt, d.h. durch Divisionen und Subtraktionen lt sich die Uhrzeit gewinnen. Die beiden Funktionen knnen zum Stoppen von Programmlaufzeiten benutzt werden. *** DATE_OF(Pfadangabe) ***: liefert das Datum der Dateierstellung der als Argument bergebenen Datei. Existiert sie gar nicht, so wird Null zurckgegeben. Dies entspricht dem hchstmglichen Alter, das eine Datei haben kann. Mit dieser Funktion kann man die Abhngigkeiten von Quelltexten von einander untersuchen und berflssige Compileraufrufe vermeiden. Das Argument zwischen den Klammern wird zuvor expandiert, es knnen also Stringvariablen verwendet werden. *** GETCHAR() ***: wartet auf eine Tastatureingabe und liefert den ASCII-Kode der Taste. Es wird kein Echo ausgegeben, dies mu gegebenenfalls durch PUTS erfolgen. *** SCANCHAR() ***: Fragt den Tastaurpuffer ab. Liefert Null, wenn keine Taste gedrckt wurde und wartet nicht auf eine Eingabe. Ansonsten wie GETCHAR(). *** LONGPEEK(Ausdruck) ***: Der Ausdruck wird als Adresse interpretiert ab der ein Langwort gelesen wird. Dieses ist der Rckgabewert der Funktion. Vergleiche Bemerkungen zu LONGPOKE. *** STRCMP ***: erstes Argument ist eine Stringvariable, das zweite durch Komma getrennt, ein String oder eine zweite Stringvariable. Im ersten Falle mu dieser in Hochzeichen eingeschlossen sein, es erfolgt keine Expansion. Die beiden Strings werden verglichen. Ergebnis ist die Differenz der ASCII-Werte des ersten Zeichens, in dem sie sich unterscheiden. Gleichheit von Strings mu also durch !STRCMP(...) untersucht werden. *** GETINT ***: Es wird ein numerischer Wert eingelesen. Dieser darf als beliebiger Ausdruck eingegeben werden, der Ausdruck wird nach den bekannten Regeln ausgewertet und liefert den Rckgabewert der Funktion. Der Ausdruck darf brigens durchaus wieder die Funktion GETINT enthalten. Selbstdefinierte Funktionen Vor dem eigentlichen Programm drfen Funktionen definiert werden. Eine Funktionsdefinition beginnt durch das Schlsselwort FUNC gefolgt vom Namen der Funktion und symbolischen Funktionsklammern. Fr die Funktionsnamen gilt das gleiche wie fr Variablennamen. Die Funktionsdefinition endet mit dem Schlsselwort ENDFUNC. Alle Anweisungen zwischen FUNC und ENDFUNC werden spter bei Funktionsaufrufen ausgefhrt. Die Anzahl der Funktionen ist nur durch den Speicherplatz begrenzt. Der Aufruf kann auf zwei Arten erfolgen: durch "GOSUB Fktname()" wird die Funktion direkt aufgerufen, ihr Rckgabewert geht verloren. Wenn die selbstdefinierte Funktion hingegen als Teil eines Ausdrucks benutzt wird, kann ihr Rckgabewert verarbeitet oder an eine Variable zugewiesen werden. In den Funktionsklammern kann ein Ausdruck als Parameter bergeben werden. Dieser steht innerhalb der Funktion als Variable mit dem Namen der Funktion zur Verfgung. Dieser Variablen kann in der Funktion ein neuer Wert zugewiesen werden. Dies ist dann der Rckgabewert der Funktion, der im Ausdruck weiterverarbeitet wird. Durch diesen Mechanismus wird eine Rekursion unterbunden, die im Prinzip mglich wre, jedoch uerst sinnlos, da keine lokalen Speichermglichkeiten bestehen. Programmaufruf: Nun endlich zur eigentlichen Aufgabe des Programms. Wird die fhrende Buchstabensequenz eines Kommandos nicht als Schlsselwort erkannt, dann wird versucht, sie als Pfadangabe zu identifizieren. Gelingt dies nicht, dann gibt es eine Fehlermeldung, ansonsten wird die entsprechende Datei gestartet. Der gesamte Rest des Kommandos wird expandiert und dem Programm als Kommandozeile mit auf den Weg gegeben. Nach dem Programmstart wird der vordefinierten Variablen "RC" der Returnwert des Programmes zugewiesen. Gab es einen Fehler (z.B. -33 fr File not found), dann erhlt "RC" diesen Fehlerwert. Sonstiges: Auf einen besonders tckischen Fehler mchte ich hier noch extra hinweisen: Da Kommandozeilen nicht lnger als 128 Bytes werden drfen, kann es hier zu Fehlermeldungen bei rein syntaktisch vllig korrekten Kommandos kommen. Gerade beim Aufruf des Linkers hat man die 128 Byte schnell voll. Auf der Diskette befinden sich einige Demos fr Makeprozeduren, die zum grten Teil nur als Anwendungsbeispiele der Befehle dienen sollen. Lediglich make.mke ist ein echtes Make. Hiermit habe ich in der letzten Phase der Programmentwicklung schon zufriedenstellend am vorliegenden Programm arbeiten knnen. ***** Erweiterungen der Version 2.0 ***** Aachen, im Mai 1992 Nach lngerer Zeit sind nun einige sinnvolle Erweiterungen vorgenommen worden, die teilweise erkannte Mistnde beheben, zum Teil auch einfach neue Funktionen zur Verfgung stellen. Die Kompatibilitt zur ersten Version konnte nicht gewahrt werden, jedoch ist die hnlichkeit der Prozeduren gro. Vorweg eine ntzliche Kleinigkeit: Prozeduren knnen nun durch gleichzeitige Bettigung von Control, Alternate und Shift-links unterbrochen werden, allerdings wird diese Kombination nur nach jedem zehnten Befehl abgefragt. Aufflligste nderung: Es knnen nun auch Kleinbuchstaben bei den Schlsselworten verwendet werden. Nach wie vor mssen diese von einem Leerzeichen gefolgt werden, um erkannt zu werden. Es ist verfhrerisch, nun in C-Syntax "if(a']' modifiziert werden. Allerdings verkrzt sich die signifikante Lnge der Namen bei Feldern auf fnf Zeichen. Der Indexbereich geht von etwa -1600 bis +1600. Der Typ einer Variablen wird durch die jeweils letzte Zuweisung festgelegt, es existieren also nicht zugleich 'var' und 'var$', hingegen sind gewhnliche und indizierte Variablen des gleichen Namens nebeneinander mglich. Bei Typfehlern wird die Prozedur abgebrochen. Nicht zugewiesene Variablen sind Null (numerisch) oder leer (String). Werden Stringvariablen in numerischen Ausdrcken verwendet, dann werden sie ausgewertet, als wenn ihr Inhalt Teil der Prozedur wre, jedoch bilden sie dabei eine vollstndig geschlossene Klammerebene. 'Syntaxfehler im Ausdruck' ist nun hchstwahrscheinlich auf einen nicht arithmetisch interpretierbaren Stringinhalt zurckzufhren! Die Kommandozeilenargumente liegen jetzt im Feld argv$[1..argc], nach Prozedurstart gibt argc also die Anzahl der Kommandos an. Dazu kommt noch der Name der Prozedur in der Variable argv$[0]. Bei der Stringexpansion hat sich durch die neuen Variablen einiges gendert. ""-Zeichen schlieen einen Teil ein, der unverndert bernommen wird, ''-Zeichen drfen den gesamten zu expandierenden Bereich umfassen, um definierte Enden festzulegen. Insbesondere am Zeilenende verbergen sich oft ungewollte Leerzeichen, die normalerweise mit in den String bernommen wrden, andererseits werden ohne Hochzeichen fhrende Leerzeichen ausgelassen; beidem kann man hiermit entgegenwirken. ' a$ ' ergibt einen String, der vor und nach dem Inhalt von a$ genau ein Leerzeichen beinhaltet. Ist das erste Zeichen kein ', dann haben weitere ' keine spezielle Bedeutung, ansonsten bricht die Expansion beim nchsten ' ab. Folgen dann noch weitere Zeichen in der Zeile, gibt es einen Syntaxfehler. /,",' kann man durch //, /", /' in den expandierten String einfgen, in konstanten Strings (durch "" erzeugt) ist davon nur /" wirksam. / dient auch als Trennsymbol: soll vor einem Variableninhalt ohne Leerzeichen ein Buchstabe stehen, dann geht es nicht ohne weiteres: 'halloa$' wrde nicht als "hallo"a$ interpretiert werden, sondern es wrde nach einer Stringvariable des Namens halloa gesucht werden. So mu man schreiben: 'hallo/a$'. (Auch "hallo"a$ ist nicht ganz zufriedenstellend, weil hallo dann nicht als numerische Variable erkannt werden kann.) Alle Nichtbuchstaben sind gleichfalls Trennzeichen. Numerische Variablen werden durch ihren Inhalt als vorzeichenbehaftete Zahl ersetzt, Ausdrcke werden nicht ausgewertet. Man sollte wegen der vielfltigen Expansionsmglichkeiten tunlichst auf "" zurckgreifen, um ungewollte Effekte zu vermeiden. Man hat ja leicht ein paar kurze Variablennamen wie a, i, t etc., die expandiert wrden, sofern sie von Trennzeichen umgeben sind. An Variablen, die expandiert werden sollen, mu in der Vergangenheit bereits etwas zugewiesen worden sein, hier gilt natrlich nicht das zuvor Gesagte ber Apriori-Inhalte von Variablen. Werden zu expandierende Stringvariablen in geschweifte Klammern eingeschlossen, werden sie selbst wieder ber die gleiche Expansionsfunktion ausgewertet, jedoch mit kleinen Unterschieden. '' hat nun keine besondere Bedeutung, es werden alle Zeichen des Stringinhaltes bernommen. Auch wird die Expansion garantiert erst am Inhaltsende abgebrochen, sonst wird je nach Kontext z.B. bei einem Komma oder bei ')' (Endekennung eines Funktionsparameters) o.. abgebrochen. Generell werden keine Variablennamen erkannt, die nur zur Hlfte in einem Stringinhalt stehen und zur anderen in der Prozedurzeile. Zyklische Verschachtelungen sind sowohl bei der Ausdrucksauswertung als auch bei der Stringexpansion verboten und fhren zur Fehlermeldung. Gewhnlich wird jedoch einfach der Inhalt der Stringvariablen unverndert in den Ergebnisstring eingefgt. Die Klammer selbst kann durch {{ in den Ergebnisstring eingefgt werden. Im Gegensatz zu frher werden nun die Stringparameter aller Funktionen ber die Expansion gewonnen, solange es sich nicht um "lvalues" handelt, also um Angaben von Variablen, an die dann zugewiesen werden soll. Eine schreibgeschtzte Variable version (oder VERSION) liefert die Versionsnummer des Interpreters als dreistellige Zahl. Genderte Kommandos: *** PUTS, PUTC ***: Hier wird die Stringexpansion nach wie vor nicht angewandt, da auch Ausdrcke ausgewertet werden sollen. Als weiteres mgliches Argument kommen nun die Stringvariablen hinzu, aber eben jeweils nur einzeln. Das schon frher funktionierende d: vor einem Ausdruck ist nun nicht mehr bedeutungslos: vor eine Stringvariable gesetzt bewirkt es, da diese als dezimal anzuzeigender Ausdruck ausgewertet wird. Fngt ein Ausdruck mit einer Stringvariablen an, dann ist es jetzt sogar notwendig, ein d: davorzusetzen, da sonst nach Ausgabe der Variablen eine Fehlermeldung erfolgte. Desweiteren hat sich DATE in DATE$ verwandelt. *** SEARCH ***: es knnen nun mehrere Pfade angegeben werden, wobei Stringexpansion erfolgt. Jedem Pfad kann ein optionales Suchattribut zugeordnet werden, das ihm nun jedoch in runden Klammern folgen mu, das Komma dient jetzt der Trennung der verschiedenen Pfade. Auch mu nun mitgeteilt werden, wo das Ergebnis abgespeichert werden soll. Dazu wird der neu eingefhrte erste Parameter verwendet. Er mu syntaktisch eine nicht indizierte Stringvariable darstellen. Anschlieend wird das zugehrige Feld die gefundenen Dateinamen im Indexbereich 1...max enthalten. Der Wert von max wird in der numerischen Variable desselben Namens abgelegt. (gewhnliche und Feldvariablen desselben Namens knnen gleichzeitig existieren) *** OUT_TO ***: Statt 'printer' und 'con' knnen nun auch die Bezeichner 'prn' und 'stdout' als gleichwertige Angaben benutzt werden. *** GETSTR ***: Es knnen nun auch Leerzeichen eingegeben werden. Einziger Operand ist eine Stringvariable. Existierte eine numerische Variable des Namens, dann erfhrt sie jetzt eine Typumwandlung. *** LET ***: Es knnen nun auch Zuweisungen an Stringvariablen vorgenommen werden, die die lstige Verwendung von STRCPY und STRCAT berflssig machen. Dabei wird STRCPY durch '=', STRCAT durch '+=' ausgefhrt. Die rechte Seite der Zuweisung wird durch Stringexpansion gewonnen. Bei += wird die Variable der linken Seite auf "" gesetzt, wenn sie vorher als numerische Variable oder gar nicht existierte. Bei = bleibt die Variable der linken Seite zur Zeit der Berechnung der rechten Seite erhalten, auch wenn es vorher eine numerische Variable war. *** STRCAT, STRCPY ***: Existieren nicht mehr. *** LONGPOKE ***: Existiert nicht mehr, wurde in poke umgewandelt. neue Kommandos: *** warn_ver ***: als Argument folgt ein Ausdruck, der eine Make-Versionsnummer (dreistellig, mal hundert) angibt. Ist diese hher, als die des verwendeten Interpreters, dann wird die Prozedur mit einem entsprechenden Hinweis abbgebrochen. *** warn_sys ***: die Prozedur wird mit einem entsprechenden Hinweis abgebrochen, wenn keine Kommandoshell installiert ist. *** exit ***: Argument ist numerisch. Ist der Wert gleich Null, dann passiert nichts. Bei Werten ungleich Null wird die Prozedur unbedingt beendet. Ist der Wert grer Null, dann wird Null zurckgegeben, sonst der Wert selbst. *** dir ***: es folgt die Angabe einer Stringvariablen, ein Komma und eine Pfadangabe. Dann wird eine Dateiauswahlbox angezeigt, die wie blich bedient wird. Der Stringvariablen wird der Name der ausgewhlten Datei zugewiesen. Bei Wahl von 'Abbruch' wird ihr Inhalt nicht gendert. An RC wird die boolsche Aussage zugewiesen, ob eine Auswahl erfolgte. *** poke ***: wie das frhere LONGPOKE, jedoch mit drittem, numerischen, durch Komma abgetrenntem Argument, das angibt, ob Byte-, Wort- oder Langwortzugriff erfolgen soll. Es erfolgt eine Wortgrenzenprfung, jedoch ist trotzdem hchste Vorsicht geboten, da im Supervisormodus gearbeitet wird. Bytes werden vorzeichenlos behandelt, Wort und Langwort sind vorzeichenbehaftet. Das dritte Argument wird so ausgewertet, da man Zeichenkonstanten bergeben kann, also z.B. 'b' oder 'B' fr Byte-Zugriff. Vergleiche peek(). genderte Funktionen: *** LONGPEEK() ***: Existiert nicht mehr, wurde durch peek() ersetzt. neue Funktionen: *** istomake() ***: Erstes Argument: es wird festgestellt, ob diese Datei wirklich jnger ist, als alle weiteren angegebenen. Dann liefert die Funktion false, sonst zeigt sie an, da z.B. compiliert werden mu. Es folgt ein Doppelpunkt und mindestens ein weiteres Argument. Weitere Abhngigkeiten knnen durch Kommas getrennt angegeben werden. Alle Argumente werden ber Stringexpansion gewonnen und mssen als fehlerfreie Pfadangaben interpretierbar sein. *** exists() ***: Ein durch Expansion gewonnenes Argument, das als Pfadangabe interpretiert wird. Die Funktion liefert die boolsche Aussage, ob die entprechende Datei existiert. *** system() ***: Ein durch Expansion gewonnenes Argument, das im ganzen als Kommando an die Shell bergeben wird, wenn eine solche vorhanden ist, sonst wird die Prozedur abgebrochen. Funktionswert ist der Returncode der Shell. Eine Warnung bei Fehlermeldungen der Shell unterbleibt hier aus einsichtigen Grnden. Wird kein Argument bergeben, d.h. system() geschrieben, dann liefert die Funktion eine Aussage ber das Vorhandensein einer Shell. *** toupper(), tolower() ***: Ein numerisches Argument, dessen Gro-, bzw. Kleinschreibung seiner Interpretation als Zeichen zurckgegeben wird, wenn diese existiert. Sonst wird das Argument unverndert zurckgegeben. *** extcmp() ***: Zwei Stringargumente, deren erstes einen Pfad angibt. Das zweite darf maximal drei zusammenhngende Zeichen (ohne '.') beinhalten. Ohne auf Gro-/Kleinschreibung zu achten, wird wie bei STRCMP der String mit der Erweiterung des Dateinamens des Pfades verglichen. *** strcmpnc() ***: Arbeitet genau wie STRCMP() jedoch wird nicht auf Gro-/Kleinschreibung geachtet. *** peek() ***: hat nun zwei numerische, durch Komma getrennte Argumente, wobei das letzte angibt, welche Wortbreite gelesen werden soll. Das erste ist unverndert die Adresse, an der gelesen wird. Es gelten alle Bemerkungen, die zu poke gemacht wurden. # # universelle Make-Prozedur # # fr alle Module wird eine Abhngigkeit von einer # eventuellen Gesamtprojekt-Includedatei und eventuellen modulspezifischen # Includedateien, die denselben Namen wie das Modul tragen, angenommen. # # lauffhig erst ab Interpreterversion 2.01 # # (c) P.Vranken, 4.6.1992 # # Bemerkungen: Da auf konsequente Anwendung von "" verzichtet wurde, ist # darauf zu achten, da keine Variablen des Namens c, h, o, s, cll, mke u.a. # verwendet werden. Auerdem mssen Pfade und Optionen natrlich korrekt # angepat werden. func set_options() # # hier die gewnschten Optionen angeben # # Programmname: let programm$ = "programm.prg" # Module (ohne .C) und ihre Anzahl eintragen: let anz_module = 3 let modul$[1] = "main" let modul$[2] = "up_1" let modul$[3] = "up_2" # Gesamtprojekt-Include: let include$ = "gen_inc.h" # Compiler: let cc$ = "\usr\bin\cc.prg" let cc_optionen$ = "-xyz -inc=\usr\include" # Linker: let cl$ = "\usr\bin\cl.prg" let cl_optionen$ = '-o=programm$ -lib=\usr\lib\' let cl_library$ = "float.lib std.lib tos.lib" endfunc func cc_comline(); # hier wird die Compilerkommandozeile erzeugt let cc_com$ = cc_optionen$ for t=1 to anz_module if istomake(modul$[t].o: modul$[t].c, modul$[t].h, include$, argv$[0].mke) let cc_com$ += ' modul$[t].c' endif next let cc_comline = strcmp('cc_optionen$', 'cc_com$') endfunc # es wird davon ausgegangen, da der Binder als Eingabe auch eine Datei # verarbeiten kann, denn die in der Lnge begrenzte Kommandozeile reicht # gewhnlich nicht, um eine Reihe von Objektmodulen und Bibliotheken anzu- # geben. func cl_comfile(); # hier wird die Linkeranweisungsliste erstellt puts "Eine Datei mit Linkeranweisungen" OUT_TO modul$[1].cll puts cl_optionen$. for t=1 to anz_module puts modul$[t], ".o". next puts cl_library$. OUT_TO stdout puts " wurde erstellt:". shows modul$[1].cll endfunc func mustlink(); # mu der Linker aufgerufen werden? let mustlink = istomake(programm$: modul$[1].cll) for t=1 to anz_module let mustlink = mustlink || istomake(programm$: modul$[t].o) next endfunc # # Beginn des Hauptprogramms # warn_ver 201 gosub set_options() putc " >>>>>> Makeprozedur zur Erzeugung von ", programm$, " <<<<<< ". putc DATE$. if istomake(modul$[1].cll: "standard.mke");# Linkeranweisungen mssen neu erzeugt werden del modul$[1].cll gosub cl_comfile() endif # bersetzung, solange ntig while cc_comline(); # dann ist eine bersetzung erforderlich putc "cc.prg ", cc_com$. del c_err out_to c_err; # Ausgabe umlenken cc$ cc_com$; # tcc aufrufen out_to stdout if RC; # es trat ein Fehler auf ed.prg c_err exit RC; # Editor mit Returncode!=0 verlassen => Prozedur abbrechen else showc c_err; # Warnungen anzeigen endif again # # Zusammenbinden, falls erforderlich # if mustlink() putc "cl.prg -inc=", modul$[1], ".cll". cl$ -inc=modul$[1].cll if RC; # Link-Fehler: Ausgabe anhalten, damit man die putc "eine Taste zum Fortfahren". gosub getchar(); # Meldung des Linkers lesen kann del programm$; # sonst knnen fehlerhafte Programme erzeugt werden else putc programm$, " wurde erzeugt". endif else putc programm$, " ist auf dem aktuellen Stand!". gosub getchar() endif end. . \.. AUTO \ANLEITUNTXT sD3KALENDERTRB Ew KALENDERTRM E T_KALENDPRG JF`T_KALENDRSC |;CT_KONFIGPRG "0T_KONFIGRSC . \.. \CLOCK PRG ;5`T:AON;|?-Hy)NN\p"<DaHy?<#NN\?<NNT+@ - rr0g&EZpaa aaa *apaa Ca:a Ca.pRH@aaElp.aRaa Epa>Ar a*Aa CaaEpaAraAa CaaAa Aa &Epaa aDaa ha8a Ta,a|Ep%apa2;@ mg:?<*NAT+@?<,NAT+@ -H@B@Э+@ /- ?<NN\paa"_KMIO:HQ <-H*,`N,b2::(   F..26"8@"PQ1!P1P!0PP`0  q#p"AӘQNuA Nu|^|  R^,T:Hz(` NHz ?<&NN\Nu9RgNuWRNuaaaNuNuNuNuQfHR$n2Jjg$_NuH LNuPfJ.fg0HR$n2Jjf$_NuHC/*%I $n2%_LNuHzda`HzZaH `Bp'rtat n2rt6(SC0(S@apaB\papava0paNAXOJkpNu0< aF`0< CF2p`p a0`p CFp`aCF"p`Hza `Hz"J`pB.@=|DNua.@FpAR@C`N B.@=|DNuB.@a=GDgNup` a`aCF"E p`.@<.DAp$I"t Q k"RGef~`SG * g *fSG`<.DjZ\FkBJn`g Fgd Fg^HS&I.a&Q`p???<NM\Qj&_NuHQ/?Y6 :fRS@g.t;ak&AA :fRS@g t;akIA??<-NAXNua0g2.k.tak$6g .fS@gt atkAg A .fS@f.Nut a\kAg6 /fS@gtaFkJAgކA /fS@g4<;a.kAjA AbAPjAdYA??<+NAXrNurxS@k0  bS@k .g( :g"0  b DBb BdeS@jJANuSR@JANua"XLpAg Per 1"NuHyNNX @Nu&Hz ?<&NN\Nu|a"XLXB@etAg1B# NuBnp`pBnp`p=| p|=Fn@=@b=n`raFHj=Ah~`:a JfBH@ RfF.f Kg" Mg sg tg Pg Hf~`xSGjtRGFcn>`jAF gp gj g grffnnpenbfJ.fj6pRGFc$SG` J.fjpRGFcRF` Ff`> `?~ap a0p a*0Nu|``CpE`bf`FgRGJGgSGSFFgCpE`Yf`Nua@Jf gH@ fa(@ fza0 b @ Ee0NuagNu4.rf?HyaNM\Nu=|D`LjazEfpadppa`AFEg0PaEfaFRE`ܾEfp a@a8?nnnp a2RF`<aZnnoS@f nhfSnl=Ah=FnNup` papq4.rf?Hya2NM\Nu=|DHaLNu|A0"P2(@e2<EF`QHP=|DJ@g$abAF$HpR@ 0 f _a`QNuHPp?ap a| _2<|0`C&pHQ/Hy@NA NuC pa:NuHQ/Hy?NA Nu&g4 FgagJAga2< R@AdSf0Nu0ap Ce`&g4 FgaLJBjadgPAe CbRa R@Sf0Nu FgRag JBja&AeaJAg RP0 pNu` Fg6agJAga @eaRP Nup NHѨB?<?/?<BNAO JkLLNu&8a~JBjaJAg Df*ڃkd0Nu DfրBH??/?<BNAO LJk!@NuHBHh Hx??<?NAO LJo ѨLNuk:fp`^k: g ѨNuBHPHQ/??<?NAO _JoѨfNuBHPHQS/??<@NAXLfѨNuJkp%`Hz` Hz`Hz&$A?<&NN\NuNu4Nu$Nu?a0` ?a2@@a` a Nu4.`Af n2LR@RANu4.`g S@SAHNutbpbr??papYa0a0`~pERgPR`LJg&B.C`a8aD*9Rfap-I,=|p4aHz*9Rg ENp9R` _a &nO:NMIK$<Nu[1][Error +111][Return]E g g>Jf`Ar Hjr-D@Hd0H@H 0H@0CNuAF"H [1][fSEfNuD@v`v??NMXJNuJ@k??<NM"UAf J@fH@Nuaxjp0fpNu\@`ad`]@><CF Ipa<0HNuaH`]@><CF Ipa Nu?|`?a&0R@f|0aHJFkHPa _Nupo`@HSHP&I>g\SG??<NMXJk Q _t&_Nu&_`Datum / Uhrzeit : CLOCK.PRG Vers. 1.3 (C) 1990 by DiLi-SoftDatum : Zeit : Neue Einstellung : Ok? ==> ndern? ==>  NJ*:,` t((@P* ********************************************************* * * * T_KALEND - DER Terminmanager * * T_KONFIG - das Konfigurierprogramm dazu * * REMINDER - DER Terminerinnerer * * * * ----------------------------------------------------- * * * * Diese Programme sind * * * * S H A R E W A R E * * * ********************************************************* Alle Rechte liegen bei: Gabriele Liebl Dachshof 7 4700 Hamm 1 Tel.: 02381 / 81400 Das Programm darf frei kopiert werden, aber nur voll- stndig mit ALLEN Dateien. Folgende Dateien sollten sich auf der Diskette befinden: - AUTO\CLOCK.PRG Programm fr den AUTO-Ordner, zum Stellen von Datum / Zeit, wenn Ihr ATARI keine Uhr besitzt, - AUTO\REMINDER.PRG der Terminerinnerer, - T_KALEND.PRG Terminkalender, - T_KALEND.RSC Recource dazu, - T_KONFIG.PRG das Konfigurierprogramm fr T_KALEND.PRG, - T_KONFIG.RSC Recource dazu, - KALENDER.TRM eine Beispieldatei, - ANLEITUN.TXT diese Datei. Wenn Sie das Programm regelmig benutzen, honorieren Sie den doch betrchtlichen Zeitaufwand dadurch, da Sie mir - unter Angabe Ihres Namens und der Anschrift - 40,- DM auf mein Girokonto Kto.-Nr.: 212802-464 BLZ: 44010046 Postgiroamt Dortmund berweisen. Bei gewerblicher Nutzung erhht sich Ihr Beitrag auf 100,- DM. Sie werden dadurch als Nutzer registriert und bekommen die !nchsten beiden Versionen kostenfrei! zugesandt. Untersttzen Sie bitte den SHAREWARE-Gedanken - er kommt auch Ihnen zugute. Das Programm wurde auf einem ATARI 520 ST mit 4 MB Arbeitsspeicher, 40 MB-Harddisk, Hypercache Turbo+ und TOS 2.06 Card mit dem Entwicklungssystem MAXON-Pascal Vers. 1.5 entwickelt. Bei Problemen / nderungswnschen / Anregungen rufen Sie mich an. Bedienungsanleitung fr T_KALEND.PRG u. REMINDER.PRG ____________________________________________________ T_KALEND.PRG: Starten Sie das Programm durch Doppelklick. Wird die Recource-Datei nicht im selben Ordner gefunden, bricht das Programm mit einer Fehlermeldung ab. Nachdem das 'DiLi'-Logo erschienen ist und Sie die Maus bewegt haben, whlen Sie mittels Fileselector-Box die Kalenderdatei aus - voreingestellt ist 'KALENDER.TRM'. Wenn Sie verschiedene Kalender-Dateien anlegen, sollte die Extension '.TRM' beibehalten werden. 'TRB'-Dateien sind automatisch erzeugte Backups. Die Datei wird geladen, die Anzahl der Datenstze wird angezeigt. Beantworten Sie die Frage 'Termine fr HEUTE zeigen' positiv, so bekommen Sie in einem Dialogformular eine Tagesbersicht. Diese kann mit 'Zurck' verlassen werden. Der Terminkalender zeigt den aktuellen Kalender fr 3 Monate. Die Tage der Wochenenden, sind im Gegensatz zu den Wochentagen, dick umrahmt. Bei Feiertagen ist die Tagesnummer dick und unterstrichen dargestellt. Vereinbarte Termine sind invers, vereinbarte Zeit- spannen durchstrichen erkennbar. Der gezeigte Kalenderausschnitt kann durch Klicken auf die Fenster-Slider quartalsweise (horizontal) bzw. jahresweise (vertikal) verndert werden. Der Kalender umfat max. 11 Jahre: das aktuelle Jahr, 1 Jahr zurck und 9 Jahre voraus. Alternative Tastaturbedienung: - Wechseln der Jahre : Cursor auf / ab - Wechseln Monat : Cursor links / rechts - Wechseln 1-3 Monate : Shift Cursor links / rechts - zurck zum aktuellen Monat : Clr/Home. Das Kalenderfenster kann verkleinert werden, jedoch nicht kleiner als fr einen ganzen Monat. Das Fenster kann verschoben werden. Ein Klick auf das FULLER-Fensterelement lt den Kalen- der an letzter Position und in letzter Gre erscheinen. Das CLOSER-Fensterelement lt den Kalender ver- schwinden. Gleichzeitig mit dem Kalenderfenster wird das Feier- tagsfenster (rechts oben) geffnet. Ein Klick auf die (zunchst nur sichtbare) Fensterzeile lt das Fenster toppen. Fr das gewhlte Jahr werden feste und bewegliche Feiertage dargestellt. Dieses Fenster lt sich wie gewohnt verschieben. Andere Fenster, evtl. ber ACCs geffnet, knnen bear- beitet werden. Einen neuen Termin anlegen. Dazu klicken Sie im Kalenderfenster einen Tag an. Be- stehen bereits Termine fr diesen Tag, so war das Tages- kstchen invertiert und nun erscheinen in einem Dialog- blatt die Termine in Listenform. Klicken Sie den Knopf 'NEU' an. Im nachfolgenden Formular ist der Termin zu definieren. 'Termin fr __, den __.__.____' : die ersten beiden Stellen mit Leertaste berspringen, danach Tag, Monat und Jahr eintragen. Bei jhrlich-periodischen Ereignissen ist das Jahr = '0000' zu setzen, bei monatlich-periodischen Terminen ist der Monat = '00' zu setzen. Periodische Ereignisse werden in JEDEM Jahr bzw. JEDEM Monat erschei- nen und der 'REMINDER' wird an sie periodisch immer wieder erinnern. 'Bis __, den __.__.____' : fr die Definition von Zeitspannen. Diese werden im Kalender durchstrichen dar- gestellt. Zeitspannen drfen NICHT periodisch sein! Wird innerhalb eines solchen Zeitbereiches ein neuer Termin eingetragen, erscheint ein Hinweis, da dieser Termin innerhalb einer Zeitspanne liegt. Alle Termine werden auf Plausibilitt berprft, evtl. erscheint eine Fehlermeldung. Dann kann das Formular nur durch Korrektur verlassen werden. 'REMINDER-Intervall - ___ / + ___ ' : Hiermit legen Sie fest, wieviele Tage im voraus BIS wieviele Tage nach der Flligkeit des Termines das Erinnerungsprogramm 'REMINDER' Sie erinnern soll. Periodische Ereignisse knnen max. Monat bzw. Jahr gesetzt werden. 'A'ktiv, 'Q'uittiert, zum 'L'schen markiert : Status des Termines. Bei neuen Terminen ist 'A'ktiv vorbe- setzt, damit der 'REMINDER' auch erinnert. Der Status kann aber gewechselt werden. 'Q'uittierte Termine wird der 'REMINDER' nicht anzeigen. Ein Statuswechsel kann auch ber 'REMINDER' erfolgen. Zum 'L'schen markierte Termine sollen spter einmal gelscht werden (ber Men- leistenfunktion). Zum Termin (berschrift) knnen bis zu 10 Bemerkungs- zeilen angelegt werden. Diese Zeilen werden dynamisch verwaltet und bentigen in der Datei nur dann Platz, wenn sie gefllt sind. Whlen Sie 'Neu / ndern', so wird der Termin angelegt, bei 'Zurck' erfolgt keine bernahme. Das oberste Form- blatt wird geschlossen, die Terminliste erscheint wieder, mit Ihrem neuen Termin, in der Liste alphanumerisch sortiert (geht auch mit Uhrzeiten...). Das Glckchen vor dem Termin zeigt den Status 'A'ktiv an. Die zweite Mglichkeit zum Anlegen eine Termines ist der DOPPELklick auf einen Tagesrahmen im Kalender. Dann geht sofort das Formular zur Termindefinition auf, die Liste wird also bersprungen. Einsehen / Bearbeiten bestehender Termine. Whlen Sie im Kalender einen invertierten Tag aus und klicken Sie ihn EINMAL an. In der Tages-Terminliste erscheinen - sortiert - die vereinbarten Termine dieses Tages. In der linken Spalte wird mit einem 'J' auf jhrlich-, mit einen 'M' auf monatlich-periodische Ter- mine hingewiesen. Einmalige Termine haben keine Markie- rung. Sind in der rechts danebenliegenden Spalte Termine mit 'B' markiert, so bestehen Bemerkungen (bis zu 10 Zeilen mglich) zu diesem Termin. Bei Zeitspannendefinitionen ist der BIS-Tag ersicht- lich. Daneben wird der Teil der Terminberschrift dar- gestellt, der noch in die Zeile pat. Der Rest wird abgeschnitten. Wurden mehr als 15 Termine gefunden, so ist mit den rechts angeordneten Pfeilsymbolen aufwrts und abwrts seitenweises Blttern mglich. Es wird die aktuelle Seite von Gesamtzahl der Seiten angezeigt. Ein Klick auf die Seitenzahl ffnet eine Dialogbox, die nun das gezielte Anspringen einer Seite erlaubt. Klicken Sie nun eine Zeile an - sie wird invertiert. Durch Anwahl des Knopfes ' DETAIL / EDIT' kommen Sie in die Termindefinition. Alternativ kann eine Zeile geDOPPELklickt werden. Sie knnen alles einsehen und das Formular mit 'Zurck' wieder verlassen. Sie knnen nun aber auch Vernderungen vornehmen - danach mu aber mit 'NEU / NDERN' verlassen werden. Der Termin kann ber 'Drucken' - in einer der nchsten Versionen - ausgedruckt werden. ber 'Duplizieren' wird der Termin gedoppelt - evtl. nderungen werden dabei nur auf das Doppel, nicht aber auf den ursprnglichen Termin bertragen. In der Tages-Terminliste gibt es drei weitere Funk- tionen: 'Lschen' : Der markierte, invertierte Termin wird - nach Sicherheitsabfrage - aus dem Kalender gelscht. 'Verstecken' : Der markierte Termin wird nur aus der Liste entfernt - nicht aus dem Kalender. So werden Eintrge entfernt, die nicht gedruckt werden sollen. 'Drucken' fhrt - auch spter - zum Ausdruck der Liste. Gummiband-bersicht. Sie knnen eine Terminliste auch ber mehrere Tage - max. 3 Monate - erzeugen. Fhren Sie die Maus im Kalender zum 1. gewnschten Tag, drcken Sie die RECHTE Maustaste, halten Sie diese fest und drcken Sie anschlieend auch noch die LINKE Maus- taste. Sie knnen nun nach rechts und unten ein Gummiband aufziehen. Die RECHTE Maustaste kann dabei wieder losge- lassen werden, sie dient nur zur Einleitung des Gummi- band-Modus. Im Gummiband sollten die gewnschten TagesZAHLEN, nicht die TagesRAHMEN umschlossen sein. Das Loslassen der Maustasten fhrt zur gewnschten Liste - tageweise sortiert, innerhalb eines Tages al- phanumerisch (z.B. also auch nach Uhrzeit) sortiert. In dieser 'Gummiband'-Liste sind einige Funktionen (Neuanlegen, Duplizieren, Lschen) NICHT mglich (wg. int. Verwaltung periodischer Termine). nderungen an den Termindefinitionen sind aber mglich. Eine evtl. Neusortierung der Liste erfolgt nicht. Mit der Gummiband-bersicht ist es mglich, z.B. fr mehrere Wochen die Werktage - oder nur die Wochenenden - zu listen. Oder die nchsten Montage, oder Gasamtwo- chenbersicht, oder ... Ein Ausdruck - bersichtsplan und Dispositionsplan (mit frei definierbarer Terminanzahl) - wird in einer spteren Version nachgelegt. Funktionen der Menleiste. >>Datei-Men<< Neuer Kalender Nach Sicherheitsabfrage und evtl. Abspeichern der ak- tuellen Kalenderdatei wird der Kalender aus dem Arbeits- speicher entfernt. Nun kann eine neue Kalenderdatei - unter neuem Namen - angelegt werden. Kalender laden Erlaubt das Laden einer Kalenderdatei in den Terminka- lender. Haben Sie mit einer Datei gearbeitet und nderun- gen vollzogen, kommt eine Abfrage, ob Sie die nderungen speichern wollen, bevor der neue Kalender geladen wird. Kalender hinzuladen Der zu whlende Kalender wird zum im Arbeitsspeicher befindlichen Kalender dazugeladen. Sie haben damit die Mglichkeit, mehrere Kalender quasi bereinander zu legen und gemeinsam einzusehen. nderungen sind dann aber mit Vorsicht zu behandeln. Kalender speichern Der Kalender wird auf Platte geschrieben. Quittierte Termine auslagern In der Regel werden Sie Termine ber den Terminerinnerer 'REMINDER' quittieren. Diese Termine sind max. 1 Jahr + angebrochenes Jahr rckwirkend einzusehen. Quittierte Termine sollten daher regelmig ausgelagert werden. Da- bei werden sie aus dem im Arbeitsspeicher befindlichen Kalender gelscht und in eine Datei geschrieben. Die Extension dieser Datei sollte '.AUS' sein. Besteht diese Datei bereits, fragt der Kalender nach, ob die alte Datei berschrieben werden soll ('Ersetzen') oder erweitert werden soll ('Anhngen'). Whlen Sie 'Ersetzen', so wird ein Backup der alten Datei angelegt - Extension '.AUB' - und die Datei auf Platte geschreiben. Bei 'Anhngen' erfolgt z.Z. noch kein Backup (grerer Aufwand, sptere Version ...). Es werden nur einmalige Termine ausgelagert, keine perio- dischen! Nach dem Auslagern sollten die verbleibenden Termine gesichert werden. Ausgelagerte Termine laden Quittierte, ausgelagerte Termine knnen so wieder geladen und eingesehen werden. Der Kalender sucht den ltesten Termin und stellt den Kalender auf diesen Monat ein. Mit der Taste 'Clr/Home' kommen Sie immer wieder in diesen Monat zurck. So knnen max. 10 rckliegende Jahre zu- sammenhngend eingesehen werden (Tagebuchfunktion). Programmende Zurck ins Desktop, evtl. nach Abfrage, ob ein genderter Kalender vorher zu speichern ist. >>Kalender-Men<< ffnen Wenn das Kalenderfenster geschlossen ist, wird es geff- net. Ist das Fenster schon vorhanden, aber durch andere Fenster verdeckt, so wird es getopped. Schlieen Das Kalenderfenster verschwindet vom Bildschirm, die Ter- minkalenderdatei verbleibt im Arbeitsspeicher. Gelscht markierte Termine lschen Im Arbeitsspeicher werden - nach Sicherheitsabfrage - alle zum 'L'schen markierten Termine gelscht. Die An- zahl der gelschten Termine wird angezeigt. Danach sollte die Datei gespeichert werden. Anzahl Termine zeigt die Gesamtzahl - unabhngig vom Status - beste- hender Termine. Freier Speicher zeigt den fr Kalenderdaten verfgbaren Speicher an. Das beiliegende Konfigurier-Programm erlaubt, den vom Pro- gramm max. zu belegenden Speicher bzw. den vom Programm min. nicht zu belegenden Speicher einzustellen. (MultiTos...) >>Filter-Men<< Periodizitt, egal zeigt im Kalender / Terminlisten alle Termine an, unab- hngig ihrer Periodizitt. einmalige zeigt KEINE periodischen Ereignisse, sondern NUR einma- lige an. monatliche Periodizitt zeigt monatlich wiederkehrende Termine an (Monat = '00'), jhrliche Periodizitt zeigt jhrlich wiederkehrender Ereignisse an (Jahr = '0000'). Zustand, egal listet alle Termine - gewnschter Periodizitt - unab- hngig ihres Zustandes ('A'ktive + 'Q'uittierte + zum 'L'schen markierte). aktiver Zustand alle NICHT quittierten und NICHT zum Lschen markierten Termine entsprechender Periodizitt werden gezeigt. quittierter Zustand nur quittierte Termine werden gezeigt. 'gelschter' Zustand nur zum Lschen markierte Termine werden gezeigt. >>Suchen-Men<< Zeichenkette Hier ist gegeben, ber einen Suchbegriff - oder besser einen Teil davon - Termine zu finden. Das Suchen fhrt zu einer Liste der gefundenen Termine. In dieser Liste knnen die Definitionen eingesehen / gendert werden. Neuanlegen / Lschen ist hier ebenso mglich wie Du- plizieren. Nach jeder dieser Aktionen wird die Liste aktualisiert bzw. sortiert. In der Grundeinstellung wird die Zeichenkette nur in den Terminberschriften gesucht. ber 'Bemerkungen' kann die Suche auf die Bemerkungszeilen ausgedehnt werden. Der '.' als Suchbegriff listet den Gesamtinhalt des Kalenders. Zeitspannen Vereinbarte Zeitspannendefinitionen (Termin VON und BIS) werden hier gelistet. nderungen, usw. sind hier voll mglich. Feiertage ffnen Das Fenster 'Feiertage' wird bei Programmstart automa- tisch geffnet. Wurde es geschlossen, kann es hier wieder geffnet werden. Ist es geffnet, wird es zum obersten Fenster gemacht. Feiertage schlieen Neben dem Schlieen mit dem Fensterschliefeld hier die alternative Schliemglichkeit. >>REMINDER-Men<< lokalisieren Der 'REMINDER' ist ein typisches AUTO-Ordnerprogramm. Es kann aber auch in einem beliebigen Ordner vorliegen. Um den 'REMINDER' zu konfigurieren oder vom Kalender aus zu starten, mu der entsprechende Pfad bekannt sein; ansonsten gibt es eine Fehlermeldung. Grundeinstellungen - z.B. dieser Pfad - werden bei Programmstart eingelesen, wenn die T_KALEND.INF-Datei besteht, siehe 'Einstellungen sichern'. konfigurieren Das Erinnerungsprogramm 'REMINDER' mu wissen, welche Kalenderdatei zum Erinnern herangezogen werden soll und wo diese Datei zu finden ist. Das geschieht ber diesen Menpunkt. Vorher mu der 'REMINDER' lokalisiert worden sein. ausfhren Der lokalisierte, konfigurierte 'REMINDER' wird ausge- fhrt. Nach Rckkehr wird der Bildschirm neu aufgebaut. Z.Z. gibt es noch Unvertrglichkeiten, wenn beim Start des 'REMINDER's Fenster des neuen CPX-Kontrollfeldes (ab TOS 2.X) geffnet sind. Bitte vorher schlieen... Alternative Menleistenbedienung ber Tasten Die wichtigsten Menleistenfunktionen knnen ber Short- cuts erreicht werden : mit der 'Control' bzw. 'Alternate' - Taste in Verbindung mit der hinter dem Menleistenein- trag vermerkten Buchstaben. Erweiterte Funktionen innerhalb der Dialogformulare Der Cursor kann innerhalb editierbarer Felder mit der Maus beliebig gesetzt werden : ein Klick auf die Position und der Cursor erscheint VOR dem Zeichen. Mit der 'Insert'-Taste kann in den berschreibmodus gewechselt werden. Und auch wieder zurck in den Insertmodus. Shift + Cursor-links bringt den Cursor an die 1. Position innerhalb der Zeile, Shift + Cursor-rechts hinter die letzte Position. Shift Cursor-auf (bzw. 'Clr / Home') steuert das 1. editierbare Feld an, Shift Cursor-ab (bzw. Shift 'Clr / Home') das letzte Feld. Mglichkeiten zum Start von T_KALEND.PRG Vom Desktop aus durch Doppelklick auf den Pro- grammnamen. In der erscheinenden Fileselector-Box ist 'KALENDER.TRM' voreingestellt, es sei denn, Sie haben ber 'Einstellungen sichern' die Datei T_KALEND.INF angelegt. Dann wird die Voreinstellung aus dieser Datei geladen. Eine andere Datei kann natrlich jederzeit gewhlt wer- den. Wurden bereits Backup-Dateien angelegt, so sind diese ('.TRB') auch whlbar. Sie markieren im Desktop-Fenster den Terminkalender und whlen in der Menleiste 'Extras' den Punkt 'Anwendung anmelden'. Unter 'Dateityp' tragen Sie 'TRM' ein. Schlie- en Sie das Fenster und 'sichern Sie die Arbeit'. Ein Doppelklick auf eine beliebige Terminkalenderdatei star- tet das Programm mit der gewnschten Datei. Ab TOS 2.x gibt es weitere Mglichkeiten: Unter 'Anwendung anmelden' bei 'Parameter' tragen Sie eine beliebige Kalenderdatei ein. Ein Doppelklick auf das Programm - evtl. direkt auf dem Desktop mit Icon abgelegt - startet das Programm mit eben dieser Kalenderdatei. Sie legen eine oder mehrere Kalender-Dateien ebenfalls auf dem Desktop ab. Sie selektieren eine und schieben sie auf das T_KALEND-Icon. Das Programm wird mit der ge- wnschten Kalenderdatei gestartet. REMINDER.PRG: Das Programm 'REMINDER' gehrt in den AUTO-Ordner des Boot-Laufwerkes. Arbeiten Sie mit Bildschirmbeschleuni- gern - z.B. 'NVDI' - so sollte REMINDER' physikalisch HINTER den Beschleuniger kopiert werden. Mit Bootmanagern - wie XBOOT - knnen Sie die gewnschte physikalische Reihenfolge auf der Platte leicht erreichen. Der Bildschirmaufbau von 'REMINDER' - aber natrlich auch von 'T_KALEND' - wird dadurch beachtlich beschleunigt. 'REMINDER' - obwohl im AUTO-Ordner - erlaubt die Bedienung mit der Maus. Nachdem Sie 'REMINDER' in den AUTO-Ordner kopiert haben, sollten Sie das Programm - ber T_KALEND, siehe oben - konfigurieren. Bei jedem KALT-Start meldet sich nun das Programm und errinnert an wichtige Termine - entsprechend des Er- innerungsintervalls, das Sie bei den einzelnen Termin- definitionen festgelegt haben. Bei einem WARM-Start (z.B. RESET-Taster) terminiert das Programm sofort wieder, damit es nicht lstig wird. Das Programm kann natrlich jederzeit durch Doppelklick gestartet werden. Das Programm meldet sich nach dem Start mit einer grafischen Oberflche. Es erscheint das aktuelle Datum; neben dem Namen der konfigurierten Kalender-Datei wird die Lnge ( = Gesamtanzahl der Termine in dieser Datei) angezeigt. Weiter unten rechts wird die Anzahl der Termine, an die Sie nun erinnert werden, sichtbar. 'REMINDER' weist Sie darauf hin, in wieviel Tagen ein Ereignis ansteht, bzw. vor wieviel Tagen ein Ereignis gewesen ist. Das Datum - und bei Zeitspannendefinition auch das Ende der Zeitspanne - wird Ihnen angezeigt. Darunter wird nun die berschrift der Termindefinition grau hinterlegt erkennbar. Zur Information wird das Erinnerungsintervall - VON ... BIS - mit ausgegeben. Die evtl. angelegten Bemerkungszeilen sind hier nicht einzusehen. Es erscheinen drei Buttons : Weiter, Quittieren, L- schen : - Weiter (oder 'RETURN') zeigt den nchsten Termin. - Quittieren (oder 'Q') fhrt Statuswechsel aktiv -> quittiert durch. - Lschen (oder 'L') fhrt Statuswechsel aktiv -> zum Lschen markiert durch. Nachdem der letzte Termin angezeigt, ggf. der Status gewechselt wurde, erscheinen zwei weiter Buttons: 'Ende', 'Neustart' : - Ende (oder 'RETURN') speichert die - genderte - Kalenderdatei ab und legt ein Backup an. - Neustart (oder 'N') lt alle Termine nochmals erscheinen, mit dem ursprnglichen Status, soda evtl. Fehlbedienungen noch korrigiert werden knnen. Whrend des Programmlaufes erfahren periodische Ereig- nisse ggf. eine automatische Statusnderung: Wurde ein z.B. monatlicher Termin quittiert, so mu in jedem Falle sichergestellt sein, da an den Termin im nchsten Monat erneut erinnert wird. Deshalb wird ein Termin, der den Status 'Q' hat, dann nach 'A' vern- dert, wenn das aktuelle Tagesdatum nicht mehr im Erin- nerungsintervall liegt! Wurde kein Termin gefunden, an den erinnert werden soll, erscheint eine entsprechende Meldung. Wurde die konfigurierte Datei nicht gefunden, bzw. trat ein Lesefehler auf, so wird eine Fehlermeldung abgesetzt. Erweiterungen nchster Versionen Einige nderungen sind oben schon angesprochen. Es wird natrlich versucht, das Produkt weiter zu verbessern - mehr Leistungsmerkmale einzubauen. Erkennbare Fehler wer- den beseitigt. Schnheitsfehler in der Dialogfhrung werden beseitigt. Beim Anlegen von Zeitspannen werden die schon bestehenden Termine, die innerhalb dieses Intervalls fallen, ange- mahnt. Es ist angedacht, einen flexiblen Termingenerator fr periodische Ereignisse zu realisieren. Der 2. Mittwoch jedes 3. Monats, oder der Letzte jeden Monats, oder ..., sind dann kein Problem mehr. Das Programm wird an MultiTos angepat werden; die Programmierung drfte so sauber sein, da vermutlich nur an wenigen Stellen nachgebessert werden mu. Das Programm drfte jetzt schon auflsungsunabhngig sein - fr Auflsungen ab 640 x 400. Ich habe daran gedacht, im 'REMINDER' die Bemerkungszei- len einsehbar bzw. eingebbar zu machen. Viel Spa mit dem Programm! (c) DiLi im Juni 1992 Neuerungen ab der Version 1.1.3: Die Dialogformulare knnen nun verschoben werden (sog. Flying Dialogs): Dazu fassen Sie mit der Maus das rechte 'Eselsohr'. Wird die Maustaste festgehalten, so erscheint die Maus in Handform, das Dialogformular wird durchsich- tig. Der Rahmen ist allseitig verschiebbar, auch aus dem Fenster heraus! Es gibt unter 'Datei' einen neuen Meneintrag: 'Einstellungen sichern'. Dabei wird die Datei 'T_KALEND.INF' erzeugt. Folgende Einstellung werden gespeichert: - letzte Gre und Position des Kalender-Fensters - letzte Position des Feiertag-Fensters - letzte Position aller Dialogformulare - Pfad des REMINDERs - Kalender-Datei, die bei Programmstart geladen werden soll. Bei Programmstart wird diese INF-Datei geladen. Existiert sie nicht, so werden die Standardeinstellungen wirksam. Das neue Konfigurierprogramm zu T_KALEND T_KONFIG.PRG erlaubt die individuelle Anpassung des Terminmanagers an Ihre Systemumgebung. Zum Verstndnis mu folgendes gesagt werden: Der Ter- minkalender verwendet - fr das Verwalten der doppelten Verkettung der Termine und Bemerkungen, sowie der dyna- mischen Listen - die pascaleigene Speicherverwaltung (sog. Heap). Diese Speicherverwaltung reserviert bei Pro- grammstart statisch Speicher fr diese Aufgaben. Mit dem Feld 'max. vom Progr. zu belegender Speicher' legen Sie nun fest, wieviel Speicher - fr Programmcode (TEXT + DATA + BSS) und Heap gemeinsam - reserviert werden soll. Werte unter 100 KByte sind nicht sinnvoll, da dann nur noch ca. 20 KByte fr Daten zur Verfgung stnden. Das Feld 'min. freibleibender System-Speicher' legt fest, wieviel Mindest-Speicher nach Programmstart noch verfgbar sein soll (unter 50 KByte ist nicht sinnvoll, siehe unten). Beispiel: Sie stellen 'MAX' auf 1000 KByte, 'MIN' auf 50 KByte ein. Sie haben einen ST mit 1 MByte. Das Programm wird versuchen, 1 MB zu reservieren und fest- stellen, da dann die geforderten min. 50 KB nicht mehr gewhrleistet sind. Es wird also nur soviel Speicher verwenden, da die 50 KB eingehalten werden. Unter MultiTos knnen Sie so vorgeben, wieviel Speicher fr diese Applikation freigestellt werden soll. Andere Parallel-Anwendungen brauchen auch Speicher... Die 50 KB fr den min. Systemspeicher erscheinen Ihnen als Benutzer eines Single-Task-Betriebssystems als zu hoch? Normalerweise richtig. Das Programm benutzt jedoch auch diesen Bereich. Die Fliegenden Dialoge reservieren fr den Bildschirmhintergrund Speicher ber Malloc(). Sind Sie stolzer Besitzer eines farbigen Grobildschir- mes, so sind die 50 KB natrlich zu wenig und Sie mssen diese Grenze entsprechend hochsetzen. Auf der linken Seite gibt es 3 Flags, die den Programm- Header entsprechend modifizieren: - 'Fast-Load': wenn gesetzt, wird der freie Speicher nach Laden des Programmes nicht gelscht (bei T_KALEND auch nicht ntig). Dadurch ergibt sich ein schnelleres Starten des Programmes. ltere Betriebssysteme kommen u.U. damit nicht zurecht, ausprobieren! - 'Progr. ins TT-RAM': wenn gesetzt, wird das Programm beim TT ins alternative RAM geladen und dort natrlich schneller ausgefhrt. - 'Malloc aus TT-RAM': wenn gesetzt, werden Speicheran- forderungen ebenfalls aus dem alternativen RAM beantwor- tet. --> Im Einzelfall ausprobieren, was besser geht! Bei den beiden letzten Punkten bernehme ich keine Garantie fr einwandfreies Verhalten des Programmes (keine Testmg- lichkeit). Mit dem Knopf 'Konfigurieren' wird die Modifikation des Programmes durchgefhrt, 'T_KALEND suchen' ffnet die Fileselect-Box, 'Ende' verlt das Programm, ohne zu Speichern. Neuerung ab der Version 1.2.1: Ab dieser Version ist die Anzeige der Kalenderwochen implementiert. Beginnt ein Jahr mit Freitag ... Sonntag, so gehrt diese Woche noch zum alten Jahr. Ein Doppelpfeil deutet dann auf dieses Jahr. Das Anzeigen der Wochen beansprucht natrlich Platz im Kalenderfenster. Wenn Sie vorher mit der Version 1.1.3 gearbeitet haben, so kann dieses Fenster zunchst zu klein dargestellt werden: ziehen Sie einmal das Fenster auf, stellen Sie dann die gewnschte Gre ein und fhren Sie 'Einstellungen sichern' durch. Neuerungen ab der Version 1.3.2: Diesmal habe ich mich mit dem versprochenen flexiblen Termingenerator beschftigt: Diese Funktion wird ber den neuen Meneintrag unter KALENDER - oder ALT T - verfgbar. Das erscheinende Formular drfte selbsterklrend sein. Es gibt grundstz- lich 2 Arten, die Definition der Periodizitt zu defi- nieren: - ber den linken Rahmen des Formulares, den Sie ber Anwahl des Knopfes in der linken oberen Ecke aktivieren, - ber den rechten unteren Rahmen des Formulars. Dieser Rahmen ist bei Programmstart aktiv, und nur dieser Teil ist z.Z. funktionstchtig. Der linke, kompliziertere Teil wird implementiert, wenn ich 'mal wieder Zeit und Lust dazu habe. Haben Sie eine korrekte Definition eingestellt, so wird ber 'Termine generieren' der Kalender entsprechend er- gnzt. Zur Nacharbeitung - und Kontrolle, wenn Sie dem Generator nicht trauen - wird eine Auflistung der erzeug- ten Termine vorgenommen. Obwohl periodisch, sind die erzeugten Termine spter nicht mehr als periodische Termine erkennbar; der Genera- tor erzeugt 'einmalige' Termine, die sich nur regelmig wiederholen. Periodisch nach der Definition sind Termine, die sich monatlich ( Monat = 0) bzw. jhrlich (Jahr = 0) wiederholen! In einer spteren Version wird vielleicht in der Datenbank fr ber den Generator erzeugte Termine ein Flag gesetzt. TerminKalender+Dieses ist ein jhrlich-periodischer Terminn,Dieses ist ein monatlich-periodischer TerminŘ?Der REMINDER wird 7 Tage vor dem Stichtag beginnen zu erinnern..Er wird bis 7 Tage nach dem Stichtag erinnern.8#Es sei denn, Sie quittieren vorher. H+Dieses ist ein jhrlich-periodischer Termin3 +Dieses ist ein jhrlich-periodischer Termin:z3 H@Der REMINDER wird 21 Tage vor dem Stichtag beginnen zu erinnern.ǘ/Er wird bis 14 Tage nach dem Stichtag erinnern.::z3#Es sei denn, Sie quittieren vorher.::z3  +Dieses ist ein jhrlich-periodischer Termin::z3 $Vorsicht! Freitag der DREIZEHNTE!!!! H::z3 Endlich wieder einmal Urlaub! H::z3 Silvesterfeier bei Daniel::z3 H::z Getrnke fr Fete besorgenH::z3 H &Dieser monatliche Termin ist quittiert:z3 x>(vieleicht aber vom REMINDER schon wieder auf AKTIV gesetzt??)11Dieser monatliche Termin ist zum Lschen markiert3 (DEMO fr T_KALEND H::z3 H >Neue Version T_KALEND (ausgetestet) an die reg. USER versenden Termin mit vielen Bemerkungen3 H::z381. Zeile::z3 H::z3̈2. Zeile H::z3 H3. Zeile H::z3 H::z3( ::z3 H::z3 x7Es werden nur die Zeilen in die Datei geschrieben, die Hnicht LEER sind::z3 H::z38. Zeile:z3 H::z3 h7Lschen Sie doch mal das Leerzeichen in der Zeile 4 ... H: &Noch ein Termin mit vielen Bemerkungenz3 1. Zeile H::z3 H::zh2. Zeile::z3 H::z3ϸ3. Zeilen nur die Zeilen in die Datei geschrieben, die H7Es werden nur die Zeilen in die Datei geschrieben, die ::z3Xnicht LEER sind3 H::z3 Ш FGEN von Zeilen wird in einer nchsten Version H6Das EINFGEN von Zeilen wird in einer nchsten Version:z3H realisiert:z3 H::z3 3Monatlicher Termin, an den fast immer erinnert wird4441Ab heute darf wieder gearbeitet werden, schade... enthalten Schon wieder Freitag der 13.ing)entale)ke!HTerminKalender+Dieses ist ein jhrlich-periodischer Terminn,Dieses ist ein monatlich-periodischer TerminŘ?Der REMINDER wird 7 Tage vor dem Stichtag beginnen zu erinnern..Er wird bis 7 Tage nach dem Stichtag erinnern.8#Es sei denn, Sie quittieren vorher. H+Dieses ist ein jhrlich-periodischer Termin3 +Dieses ist ein jhrlich-periodischer Termin:z3 H@Der REMINDER wird 21 Tage vor dem Stichtag beginnen zu erinnern.ǘ/Er wird bis 14 Tage nach dem Stichtag erinnern.::z3#Es sei denn, Sie quittieren vorher.::z3  +Dieses ist ein jhrlich-periodischer Termin::z3 $Vorsicht! Freitag der DREIZEHNTE!!!! H::z3 Endlich wieder einmal Urlaub! H::z3 Silvesterfeier bei Daniel::z3 H::z Getrnke fr Fete besorgenH::z3 H &Dieser monatliche Termin ist quittiert:z3 x>(vieleicht aber vom REMINDER schon wieder auf AKTIV gesetzt??)11Dieser monatliche Termin ist zum Lschen markiert3 (DEMO fr T_KALEND H::z3 H >Neue Version T_KALEND (ausgetestet) an die reg. USER versenden Termin mit vielen Bemerkungen3 H::z381. Zeile::z3 H::z3̈2. Zeile H::z3 H3. Zeile H::z3 H::z3( ::z3 H::z3 x7Es werden nur die Zeilen in die Datei geschrieben, die Hnicht LEER sind::z3 H::z38. Zeile:z3 H::z3 h7Lschen Sie doch mal das Leerzeichen in der Zeile 4 ... H: &Noch ein Termin mit vielen Bemerkungenz3 1. Zeile H::z3 H::zh2. Zeile::z3 H::z3ϸ3. Zeilen nur die Zeilen in die Datei geschrieben, die H7Es werden nur die Zeilen in die Datei geschrieben, die ::z3Xnicht LEER sind3 H::z3 Ш FGEN von Zeilen wird in einer nchsten Version H6Das EINFGEN von Zeilen wird in einer nchsten Version:z3H realisiert:z3 H::z3 3Monatlicher Termin, an den fast immer erinnert wird4441Ab heute darf wieder gearbeitet werden, schade... enthalten Schon wieder Freitag der 13.ing)entale)ke!H1Dieser Termin ist in KALENDER.TRB nicht enthaltenTRB.-Dateien sind Backups+Diesen jhrlich0. X+Dieses Հ*Laden Sie diese doch einfach 'mal hinzu...ո֨IN`DN:FihlNNVNqNq n0( nh=@0.H=@0.HH@J@oRn=n N^.NuNNVNqNq n (rNN=@0.H nШ nrNN=@ noSn0.R@=@ N^.NuNNVH?9?<N?94?<HnHnHy0$Hy0$NޜPnn09LH/BgHn?<N9/HN2 =| AHpHnNV9/HN2 APHpHnNVHz"HnNVHnHnNVHzHnNVHz HnNVHnHy5?<PN?94?<UHy5N.UHy5NHBgBgN09JN2HzHn&NAHp0HnNVHzHnNV09JR@N2AHpHnNVHzTHnNV09JT@N2AHpHnNVHzHnNVHnHy5f?<PN?94?<UHy5gN.UHy5gNHBgBgN?94?<095H ?BgBgBgN?94?<09JS@H5r 5SA$<RB?BgBgBgN?94?<?<dBgBgBgN?94?< 09LyHR@d?BgBgBgNY?<?<?9LN2-_09Jy5S@29JAm=A=@`RnY?<?.?9LN2-_ .rNN=@U?.?9LN2=_U/Nl=_U/N0S@rAm~=A=@`Rn0.=@0.H/?<Hn?<NJnf -|?90.@n?0.@ ?HnNPRn0.nfpr@m=@=A`Rn0.=@?9?.0.@n?0.N2HAHpNPpr@m<=@=A`Rn0.=@0.nR@n=@Jno0.nn0.H/?<Hn?<N09LyHN2 &0.N2 >@0.N2H@A000@J@g noB0.@n?0.nS@?0.@-n?0.@n?N `<0.@n?0.n?0.@-n?0.@n?N ` no`?9?<N0.@n?0.n?0.@,n?0.@n?NԼ?9?<N`<0.@n?0.n?0.@-n?0.@n?NԼ09LyHN2 &0.N2 >@0.N2H@A000@J@g?9?< N?9?<Nb?90.@n?0.@n?HnNP09LyHN2 &0.N2 >@0.N2H@A000@J@g<0.@n?0.n?0.@-n?0.n@?Nt?9?<Nb?9BgN0.nf0.nfj?9?<Nn0.nfB&N^Nu Termine fr  :   NNVNqNq?<BN|?<Nߐ=n=n =n =n?.?< HnHnHnHnNޜ=n=n=n=nUHnHnN`JgpHnHy4NZ?9?<Hy4Nh?9BgN?9Hy4N0.y4fN0.y>fNT?.?< HnHnHnHnNޜJnWDJnWDg2?<Nߐ?<BN|N^ _O NNNVNqNq nf`P?<BN|?<Nߐ?.?< HnHnHnHnNޜ?.?<HnHnHnHnNޜ=n=n=n=n=n=n=n=nUHnHnN`JgpHnHy4NZ?9?<Hy4Nh?9BgN?9Hy4N0.y4fN0.y>fNT?.?< HnHnHnHnNޜJnWDJnWDg2BgNߐ?<BN|N^ _TNNNVNqNqBg?<?<?<P?<b?<HnHnHnHnN߾U?<?.?.?.?.Nݘ34Jy4l(U?<?<N030$N?<cN35?94?<UHy5N.UHy5NHBgBgN35f?94?<UHy5gN.UHy5gNHBgBgN?94?96?98?9:?9Jy>l(U?<?<N030$N?<cNHzfHy4>?<N?9>?<UHy4?N.UHy4?NHBgBgN?9>?9@?9B?.?.NN^Nu Feiertage NNVNqNq?94?<Hy0$Hy0$HnHy0$Nޜ0. @m @n35`& @m @n35` 35095 @f09JeSyJ`\ @fT?9JHnN ?<N?<N?<N?< NXHnNf SyJ`N^NuNNVNqNqp3r6@m.=@=A`Rn/9N?.BgNv0.nf/9N?.?<NvN^ _TNNNVNqNq.HN2/. f?<4N^`@ f?<5N^`* f?<6N^` f ?<3N^N^ _TNNNVNqNqp-r0@m.=@=A`Rn/9N?.BgNv0.nf/9N?.?<NvN^ _TNNNVNqNq.HN2/. f?<-NB`@ f?<.NB`* f?</NB` f ?<0NBN^ _TNNNVNqNq09/RH/BgHn?<3NHzbHnNHnHnNVHzfHnNVHzhHnNVHnHn?<3NU?<HnNڴ30$N^Nu[0][Gre des Kalenders: |  Termine][Aha] NNVNqNqNBgHn?<-NHzbHnNHnHnNVHz`HnNVHz`HnNVHnHn?<-NU?<HnNڴ30$N^Nu[0][Freier Speicher: | Bytes][Aha] NNVHHz~ y5 hgN?9>?<HnHnHnHnNޜHnHn?<BNHnHn?<BN`.HnHy@?<BNHnHyB?<BNHnHy5?<BNHnHyl?<RBNHnHy/V?<RBNHn y Hh?<BNHn y Hh?<BNHn y$Hh?<BNHn y$Hh?<BNHn y(Hh?<BNHn y(Hh?<BNHn y,Hh?<BNHn y,Hh?<BNHn y5Hh?<BNHn y5Hh?<BNHn y0Hh?<BNHn y0Hh?<BNHnNN^NuNNVNqNq09LyHJ@m SyL?94N F?9>N FN^NuNNVNqNq09LyH @ l RyL?94N F?9>N FN^NuNNVNqNq yJWD29LyH\Dg2SyLp y53J?94N F?9>N F`009Jy5o Nd095yJ?94N FN^NuNNVNqNq yJWD29LyH\Dg2SyLp y53J?94N F?9>N F` yJoSyJ?94N FN^NuNNVNqNqp y5yJWD29HA yL^Dg,RyL3J?94N F?9>N F`2Ndp y5yJo095yJ?94N FN^NuNNVNqNqp y5yJWD29HA yL^Dg,RyL3J?94N F?9>N F`&p y5yJoRyJ?94N FN^NuNNVNqNq . l -n `-nN^ _PNNNVNqNq-|7-y/JJf$HyHHyFHyDHy0$Nj``YY n?( n?( n?( N2/.Nn-_ n-h\Jf/.HyDHyFHyHNN^NuNNVNqNqJ95g0. @fd0.y4f8J95g"?94?.?.?.?.N` 5`?.?.?.?.?.N` @f?.?< BgBgBgBgN` @fH=n0.y4f0.X@@S@=@?.?<?.?.?.?.N` ` @f=n=n0.@bnl0.@b=@ nl=|0.@nl0.@=@0.@no0.@=@?94?<Hy0$Hy0$HnHy0$Nޜ?94?<?.?.?.?.NB95Nd0.no?94N F` z @fJ95g?94?<HnHnHnHy0$Nޜ?94?<HnHnHnHnNޜ?94?<?.?.?.?.NB95Nd0.n^D2.IJnWD2.²nWDg?94N F`P?94?<HnHnHnHnNޜ?94?<?.?.?.?.N5Nd`l @f0. @g @f N`` @g @f N`F @f N6`4 @f N`" @f NJ` @fN` @f:p 5S@"<0.H5R@3J?94N F` @f60.H_yHS@3L?94N F?9>N F`h @ f0/9N?.?<Nض0. @"fB y4f5NN `?94?< BgBgBgBgN` @#fJy4oNl` @-f B'NNz?94N F` @.f"<NNz?94N F`b @/f"<NNz?94N F`: @0f"<NNz?94N F` @3f"<NNz?94N F` @4f B'NNz?94N F` @5f"<NNz?94N F` @6f"<NNz?94N F`t @fU?<?<N00 @fNJJy4oNl<Nf N `?9>?< BgBgBgBgN`P @oN`4 @>f NJn`" @?f NK(` @@fNLP`2 @f*0.y4fNl0.y>fNJ.gTSnJnfHB.U?<?<N00 @f*?9D?9F?9H?<BgBgBgBgBgBNP0.@J@VD nWD nWD nWDJy4^DgJU?.?.HnHnHy0$NJg&?.?.?9L?.BgBgBgBgBgBNP0.@J@VD nWD nWDJy4^DgD?.?.BgBgHnHnNNBgBg?9L?<?.?.?.?.BgBNP0.@J@gBn0. @Hf N`x @Pf N`f @Kf N`T @K4f N6`B @Mf N`0 @M6f NJ` @GfR3HL3FJp y5yJlp y53J?94N F?9>N F` @& f=|=|` @#f=|=|` @f=|=|`~ @-f=| =|`f @f=|"=|`N @.f=|#=|`6 @f=|*=|` @f=|-=|` @ f=|.=|` @2 f=|/=|` @$ f=|0=|` @f=|3=|` @f=|4=|` @f=|5=|`v @"f=|6=|`^ @f=|8=|`F @f=|9=|`. @!f=|;=|` @f=|<=|Jno6/9N?.BgNض?<2BgN=| Bg?<HnNְ0.@J@VD n WD n WDgNJ&N^NuNEU.TRM.AUS NNVNqNq#4|JyWD ycWDg`09H/BgHn?<NHzHnNHnHnNVHzHnNVHnHn?<sNHn 9/?<N8XHnHn?<NHnHnNHnHnNVHzHnNVHzHnNVHzHnNVHnHn?<sNU?<HnNڴ30$?<cN N^Nu#[3][ Programmfehler! | Fehlercode: | Offset: /| Fehler notieren und | Hinweis an Entwickler!] [Mach ich] NNVNqNqUNnJf ?<cN?<BN|#4|Hy/#?9?<N?9?<N?9?<N?9?<?<N?9?<N?9?<N?9BgN?9?< Hy0$Hy0$Hy0$Hy0$N6?9?<N?9?<N?9?<Nb3B0&3D0(By4By430&430(4?9?<Hy4NhHyN>UNj0J@fTHzHnNHzHnNVHnHy0*?<PNU?<Hy0+Nڴ30$?<cN BgBN|HyHHyFHyDHy0$NjBgBgHyNNHnHn?9D?9F?9HNfXHn?<?< NHz8HnNVHnHy5?<N/9N?< Hy5N/9N?<N>Bg?<Hy N/9 Hy0$Hy0$Hy0$Hy0$NBg?<Hy$N/9$Hy0$Hy0$Hy0$Hy0$NBg?<Hy(N/9(Hy0$Hy0$Hy0$Hy0$NBg?<Hy,N/9,Hy0$Hy0$Hy0$Hy0$NBg?<Hy5N/95Hy0$Hy0$Hy0$Hy0$NBg?<Hy0N/90Hy0$Hy0$Hy0$Hy0$NN< yB]D yD]Dg"U?<?<N030$?<cN HzjHnNHzHnNVHzHnNVHnHy4?<NHzHnNHzHnNVHzHnNVHzHnNVHzHnNVHzHnNVHzHnNVHzHnNVHzHnNVHzHnNVHnHy5?<NHnHzNLXHnHy/V?<PNNUN0J@fBg?<Hy6^N/96^Hy6bHy6dHy6fHy6hNBgBgBgBgBg?96b?96d?96f?96hND/96^Bg?<BgBg?90&?90(N:?9Hy0$Hy6nHy6pN?9Hy0$Hy6jHy6lN096jy6nVD296ly6pVDg?<BgBgBgBg?96b?96d?96f?96hND`Hn?<N2XHnHy/V?<PNHzPHy/VN0J@f`BgHy/VNHy/VHnNHzHnNVHn?<N2XHnHnNVHnHy/V?<PNB/JB/NBy/RB953`0|3J0~U<B'Hy/VNDJg?9HNOf5343>N:BgN N^Nu/[1][ |Recource-Datei |nicht gefunden!][Abbruch]/dfhwunFWzmloTEXvbnCVSQrzKBfRgfBJGDcbnkmKGHFbgdk/jklBNghjghjFGFcggHGgdGRFWEdxdxevBNjZHnmjujMrfgl-KJiuuZvbEwBounFCSefgGzhjmUkmzhrFCVBhtfbmkUZNn?V5,# 4$TM]AgkjVBF bhKHkK%!0CBKMkghfB   .+G$ :gfCGGhgGD3%?6 XR bnJzhNMJA]}BF/ &'ID zVBeW @|ccWU_vWP[Ye[0!#6*30)fbmkUZNn KALENDER.TRM \ kf o*HWDLԁ.BNPNNN(NZNюNNN:NN\NV>NMNJ\N1^BgNNNVNqNq|0.2. @mT=@=A`Rn0.H/HxNL r y020 Jg"n2`0.nfB.N^ _PNNNVHpr@mp=@=A`Rn0.H/HxNL 2.H/Hx&NL"p y000 ~N"y038 0.nfp r@mp=@=A`Rn0.H/HxNL 2.H/Hx&NL"p y000 ~N"y038 0.nf/90?<?<BgBg?90&?90(N:/90?<?<BgBg?90&?90(N:&N^NuNNVNqNqp y00(~N"y03@p y00(z~N"y03@zJ.g&/90?<?<BgBg?90&?90(N:N^ _TNNNVNqNqB'N n/fYHn y0 h$/NJXHnHy4XHy4ZHy4\N?D#4jYHn y0 hT/NJXHnHy4^Hy4`Hy4bN?D#4nHn y0 hl/NJXHnHy0$N N34dY?<?< 09H@ ?N2#4rJ4jVDr y02(RJVDJ4nVD$94j4n_Dt y04(jJVDJ4jVDJy4dVDgLHn y0 hD/NJXHzrHnN(gHn y0 h/NJXHnHy0$N N34fHn y0 h/NJXHnHy0$N N34hp y00(Jg NB`ND&U?<?<N030$Jy4vo&BgBgBg?<BgBgBgBg?94v/94xNP`2U?<?<N030$?.</ND>=|-` `2U?<?<N030$?.</ND>=|!`/90N&N^Nu NNVNqNqN^NuNNVNqNqHnHylHztHz~NBg?<HnHnHnHnNޜBgBgBgBgBg?.?.?.?.ND?<BN|HylHnNHzHnNVHnHyl?<PNHzHn?<N-|NYHnHnHymBgN-_NJgU?<?<N00H-@?<BN|BgBN|/9N?<N>?<BgBgBgBg?.?.?.?.ND?<BgN?<NߐN^Nu NNVNqNqN^NuNNVNqNq0.Hd=@0.HdH@=@0.H=@0.H=@0.@nnHH@=@0.X@nHH@=@0.HH@=@0.HH@=@0.HH@=@0.nHH@=@0.H2.IA2.AnHH@=@0.@n @n 0.@n"n 2"n2`x nWD nWDg"n 2"n2`J nWD nWDg"n 2"n2`0.n@ "n 2"n2N^ _O NNNVNqNqpr @m=@=A`Rn0.n?HnHnNMY?.?.0.n?N2-_0.N2 HC030.N2 HC030.N2 HC030.N2 HC03 .U/HnHnHnN0.N2 HC030.N2 HC030.N2 HC030.N2 HC03 .R/HnHnHnN0.N2 HC030.N2 HC030.N2 HC030.N2 HC03 .'/HnHnHnN0.N2 HC030.N2 HC03 .1/HnHnHnN0.N2 HC030.N2 HC03 .2/HnHnHnN0.N2 HC030.N2 HC03 .?<UHy4?N.UHy4?NHBgBgN?9>?<HnHnHy0$Hy0$Nޜ?9?<Hy0$Hy0$HnHnN60.n=@pr@m=@=A`RnHn09LyHN2 H&0.N2H@A0?0009LyHN2 H&0.N2H@A0?00?9LNfX0.N2AHpHnNVHnHn?<(N?9?.0.n?HnNP0.аnf?9?< Hy0$Hy0$HnHnN6&N^NuNNVNqNqN^NuNNVHJfB nB` 9/ g g f6HnN 9/H?NXHnHn/<Nb`F f>HnN BgN?<N?<NXHnHn/<Nb-n&n9/ f JkfP0+nf@H?HnHn/<NHnNg n"n"\-n` `Jk f\0+nfL0+nf@H?HnHn/<NHnNg n"n"\-n``d0+ n fX0+nfL0+nf@H?HnHn/<NHnNg n"n"\-n`X`4 fh0+ n fX0+nfL0+nf@H?HnHn/<NHnNg n"n"\-n`` fXJkfL0+nf@H?HnHn/<NHnNg n"n"\-n``h f`Jk fX0+nfL0+nf@H?HnHn/<NHnNg n"n"\-n`" n-h\Jf-n"n"&_N^ _ONNNVNqNqJ fB nB`-n Hy0 nHhN0J@o-n n"n"\``` 9/fT n-hTJgBHy0/.N0J@o-n n"n"\`4` n-hB` n-h\Jf\-n"n"N^ _PNNNVH0.n @l`=n =n0.nHN2H/HxNL  y42AC"20.nl\0.N2H/HxNL  nHh y42 pHhN(d Rn`0.N2H/HxNL  nHh y42 pHhN(c Sn`0.nn0.N2H/HxNL  y42AC"20.N2H/HxNL &0.N2H/HxNL  y42A"y42C8"20.N2H/HxNL A"y42C"2RnSn`0. nl?. ?.NZ0.nl?.?.NZ&N^.NuNNVH0.n @l`=n =n0.nHN2H/HxNL  y42-p0.nl:Y0.N2H/HxNL  y42 p?(0.N2H/HxNL  y42 p?(0.N2H/HxNL  y42 p?( N Y n?( n?( n?( &Nl Rn`DY0.N2H/HxNL  y42 p?(0.N2H/HxNL  y42 p?(0.N2H/HxNL  y42 p?( N Y n?( n?( n?( &No Sn`D0.nn0.N2H/HxNL  y42-p0.N2H/HxNL &0.N2H/HxNL  y42"y42#80.N2H/HxNL "y42#RnSn`0. nl?. ?.N\0.nl?.?.N\&N^.NuNNVHHy4$ y h$/NHzLHy0N(fHz: y hN^NuNNVNqNqU?<?.N030$"y$3|"y$3|"y$3| y$Bh/9$?<HnHnN/9$Bg?<?.?. y$?( y$?(N:U/9$?. Bg?< B'B'Hy0$N=_ y$Bh y$Bh nJ(f y$Bh y$BhN^ _PNNNVNqNqB. Y n?( n?( n?( N"n#_ n hJf|Y n h?( n h?( n h?( N n (氟mBY n h?( n h?( n h?(N n (氟n| N^.NuNNVHB.Y/9/JHnN^-_JgBnU/NjJgJ=| nHhHnNVHn y, hl/NHn n?( n?( n?( N0.N2 H2.H/Hx&NL" y$ p C#0Rn0.nfx0.N2 HABBnJg*BN 290~HmHnHxJN`B-n0.N2 HAJgJgHn0.N2 HA/0NJXHn/.?<@N"n#nF-nN 290~HmHnHxJN`B"n#nB-nRn`U?<?<N030$Rn`6Jg nBBJgHnHxJNv"y/N#nT094:H46lRy4:094:N2H/HxNL "y42#J9/f?<?94:NZ`?<?94:N\=|0.y4:_D&0.N2H/HxNL ". y42VDg Rn`0.S@HR@34`/9$N/9$Np/Nw&&N^ _TN __________ 0__0 NNVNqNq 9/f"y$3|` y$Bh y$Bh y$Bh y$BhN^.NuNNV4H/Nypr@m =@=A6`Rn0.H/HxNL r y 20  f094?< N n0(H/BgHn8?<NHn>Hn6NHn8Hn6NVHn6Hn>?< NHn> y$ h/N n-hTVBnJVg.0.N2 HCb#VRn nV-hBV` n n"0.N2 HAbBRn`Bnpr@m=@=A4`Rn0.N2 HAb-pVJVg0/.V0.H/HxNL  y$ p /N`,Hz0.H/HxNL  y$ p /NRn0.n4ftU/9$?<Bg?< <B'Hy0$N=_ nf>Hn-_ nCp"QUHnB'NlJgA"np"Q40B^pr@m=@=A4`Rn0.@N2 HAbJfHn40.H/HxNL  y$ p /NJXHzHn4N(gN 290~HmHnZHxJN`BZJZg|"nZ#n^FHn40.H/HxNL  y$ p /NJXHn4/.Z?<@N nZBBJ^g"n^#nZB` "n#nZT-nZ^`U?<?<N030$`0.@N2 HAb-p^Hn40.H/HxNL  y$ p /NJXHzHn4N(f n^JFVD n^JBVDgH-n^V nV"nV"iF#hBB nV"nV"iB#hFF nV-hB^HnVHxJNv` n^JFfJ-n^V nV"n#hBT n^JBg nV hBBF nV-hB^HnVHxJNv`D n^JBf8-n^V nVJFg nV hFBB nV-hF^HnVHxJNv`@Hn40.H/HxNL  y$ p /NJXHn4/.^?<@N0.n4f4/T 9/g0J9/f?<?94:NZ`?<?94:N\=|0.y4:_D&0.N2H/HxNL ". y42VDg Rn`0.S@HR@34/Ny`0.n6f&N^Nu __________ _ NNVH=n0.R@=@0.y4:l0.N2H/HxNL &0.N2H/HxNL  y42"y42#80.N2H/HxNL &0.N2H/HxNL  y42"y4238RnRn`H0.N2H/HxNL  y42B&N^ _TNNNVNqNqpr@m(=@=A`Rn0.H/HxNL r y 20  f094@ n0(N2H@A000@J@o094:R@? n?(/.Nrn` n0( nh=@n`nHnN Bg?<N0XHnHn/< NHnHnNf 0&N^.NuNNVHHn?.?.?.NHnN BgN?<N?<NXHnHn/<Nb-y/J=y/RJg n-h\ .f. n WD nJh ^Dg /.Nv`8 nH?HnHn/<NHnNg /.Nv-n`z0.y/RH/BgHn?<AN .fTHzHnNHnHnNVHzHnNVHnHn?<ANU?<HnNڴ30$ .fTHzXHnNHnHnNVHzzHnNVHnHn?<ANU?<HnNڴ30$N^ _TN[0][ | Es wurde(n) | | Termin(e)| gelscht!][Gut] " | Termin(e)| ausgelagert.][Gut] NNVNqNq090~Y@=@J VD nJh^Dg. nHh/. ?. nHhN n -hB `N^ _PNNNVNqNq090~Y@=@ nHhHn?. nHhN n0(H"n~ nJ~WDJWDgN^.NuNNV~NqNq/.Hn?<PNB.. g g f4Hn^N . H?NXHn^Hn/<Nb`F f>Hn^N BgN?<N?<NXHn^Hn/<Nb090|Q@=@X . fvHn~HnHz4Hz6N?<Hy@HyBHy0$Hy0$Nޜ?9>N@?9>Nn3>N^NuNNVNqNqJy4oNlJy>oN/9NBgN>NlN?.NN^ _TNNNVH?<BN|HyR?<BgNJ/Jg9/ g g f6HnN 9/H?NXHnHn/<Nb`F f>HnN BgN?<N?<NXHnHn/<Nb-y/J&n9/ fJkfH?HnHn/<NHnNgpr @m=@=A`Rnpr @mb=@=A`Rn0.N2 &0.N2 >@0+N2H@C300.nf0.nf`@Jk fJkgH?HnHn/<NHnNglpr @mb=@=A`Rn0.N2 &0+N2 >@0+N2H@C300.nf`0+ yH=@ no n lxJkgpH?HnHn/<NHnNgH0.N2 &0+N2 >@0+N2H@C30` f0+ yH=@Jkg noz n lpH?HnHn/<NHnNgH0.N2 &0+N2 >@0+N2H@C30`v fJkfH?HnHn/<NHnNgpr @m=@=A`Rnpr @mb=@=A`Rn0.N2 &0.N2 >@0+N2H@C300.nf0.nf` fJk fJkgH?HnHn/<NHnNglpr @mb=@=A`Rn0.N2 &0+N2 >@0+N2H@C300.nf n-h\Jfpr @mt=@=A`Rnpr@mP=@=A`Rn0.N2 &0.N2 H(0.N2H@A000@N2 >@0.N2 H(0.N2H@A000@N2H@0.N2 (0.N2 H*0.N2H@A000PN2 >@0.N2 H*0.N2H@A000PN2H@A00@@C300.nf0.nfY/9/JHnN^-_Jgv nH?HnHn/<NHnNg2Y n?( n?( n?( N2 Y n?( n?( n?(&N2 m-C-@`R/.HnHnHnN0.yH=@ n^D n ]Dg0.N2 &0.N2 >@0.N2H@0.N2 (0.N2 >@0.N2H@A00@@C30 .谮f(Y/.HnN^-_`BgBN|L8N^NuNNVNqNqN^Nu&WT>NA&WT>NAT.N&WT>NAXN&WT>NAT>N&WT>NAXN&WT>NAX>N&WT>NAX.N&WT>NAT.N&WT>NAT.N&WT> NA\>N&WT> NA\N&WT> NAT>N&WT>NAX>N&WT>NAT>N&WT>NAT>N&WT>NAT>N&WT>NAT>N&WT>NAT>N&WT>NA\N&WT> NA\.N&WT>*NAT>N&WT>+NAX>N&WT>,NAT>N&WT>-NAX>N&WT>/NAT.N&WT>0NAT>N&WT>1NA&WT>6NAP>N&WT>9NA\>N&WT>:NA\>N&WT>;NA\>N&WT>N&WT>=NAP>N&WT>>NAX>N&WT>?NAO .N&WT>@NAO .N&WT>ANA\>N&WT>BNAO .N&WT>CNAO >N&WT>ENAX>N&WT>FNA\>N&WT>GNAP>N&WT>HNA\.N&WT>INA\>N&WT>?<JNAO >N&WT>KNAO.N&WT>LNA&WT>NNAP>N&WT>ONAT>N&WT>?<VNAO >N&WT>WNAO NN;NVNqNqN^NuN;NVNqNqYBN2-_-| n P=h Y/.N1-_N^.NuN;NVNqNq/.Hn?<PN5/. Hn?< N5/.Hn?<N5HnHn.Hn Hn N3HzHn.N5f HnHzzN/XHnHn.?<PN5HHn.HnN5$HnHnN5HnHn.?<PN5 Hn HnN4Hn HnN5^HnHn ?< N4Hn.N-JHn N-BU/N0 @o"HnN-(Hn.Hn Hn HnN``HzHnN4HnHnN4HzHnN4HnHn?<-N4HnN,U?<HnN =_Hn.Hn Hn NZHn.N,Hn N,Hn.Hn.HnHnN2Jn fHzD/.?<PN4`*Hn.HnN3Hn HnN4VHn/.?<PN3N^ _O N [0][| ][Weiter] N9NVNqNq?<?.HnN!BJgU?. /.NT=_ `Bn N^.NuN9pNVNqNq3 3"3 $3 &3(Hy-_H".0<NBLN^ _O NN9NVNqNq# 383:3<3 >?<.?<?<?<BgN^"n2 BN^ _ONN8NVNqNq# 383:3 r n 20 Jf>Rn0.H/HxN7 r n 200. H€Jg =n``N^ _PNN7xNVNqNqU/.?<BgNd=_ N^.NuN7RNVNqNqBn=nU/.?<?.N2=_Jnf=n N^.NuN7NVH?<N0. HN7D@UHnHnHnHnN=_B.JnfU/.NF=_=nBn=|JnoJnVD2.nVDg=nBn .f0.H/HxN5 r n p Pp N6v=@0.H/HxN5  n p PB/.?.Bg?.?<HnN0.H/HxN5` &0.N6:"n"q8 "Q`/.?.Bg?.?<HnNJ.gB./.?.HnHnN0.H/HxN4  n p =h0.H/HxN4  n p 2( Af0.nH=@` Af@0.n2.H/Hx&N4" np0.S@@HÇ=C`L AfD0.n2.H/Hx&N4B"0.S@ n40@H…BHÇ=CJnm|0.H/HxN4 &0.N4r n p8 h0 _f@=|=|Rn0.H/HxN3 &0.N4r n p8 h0 _fRn0.nf/.?.Bg?.?<HnN0.H/HxN3P &0.N4*r n p8 P0p N3=@0.H/HxN3 &0.N3 n p8 PB0/.?.Bg?.?<HnNV0.H/HxN2 &0.N3(0.N3"n"q8 "Q@U?<?<?<?<BgBgBgBgBgBgBgBgBgBgHnBgBgHnHnHnHnHnHnNH=_0.@J@gf n WD nr WDg U/.?<BgN0J@f=|P0. @Rf .f B.`|` @H8g @GfU/.N=_` @P2g @G7fU/.N=_` @K4f/.?.Bg?.?<HnN0.H/HxN1f r n p Pp N2=@0.H/HxN12  n p PB/.?.Bg?.?<HnN0.H/HxN0 &0.N1"n"q8 "Q` @M6f:/.?.Bg?.?<HnN:/.?.Bg?.?<HnN `U/.?.Bg?.HnHnN^=_Jng .fv0. @Kf`f @Mf`Z @Sf`N @R0f`B @f`6 @bf`* @af`/.?.?0.N*  AHpN0.N) AB`0.nfN^.NuN)tNVH/.HnHnHnHnN&nBgBgBgBgBg?.?.?.?.N ?<BgBgBgBg?.?.?.?.N p&_N^.NuN)NVNqNqBg?<HnHnHnHnN?<NJ.g(/.NT/.Bg?< ?.?.?.?.N U/.?.?./.N=_ n=P0.nfHnHnHnHnN : nf/.Nj?<BN /.HnHnHnHnNv?.?.?.?.0.n??.0.?0.H?HnHnN BgBN /.HnHnN0.n=@0.n=@"n3n"n3n/.N8/.Bg?< ?.?.?.?.N0.@ngJ. g /.N=n?<NN^ _ONN'VNVNqNqN^NuNV/.?< NN\ON^.NuN'0NVNqNqB.?<BN ?9?<HyBNB=yJ?9BgHyBN(p=@0.n@@=@0. n=@0.H2.RAH-@Y ./N l-_0.n"n2"n3n"n#nJg|=n=n=n=n BnBn0.n=@=nB-n=n0.R@=@0.H=@Bn=n?9?<HnHnHnN ?<BN xN^ _O NN%NVNqNq nC""Jg?<BN D?9?<HyBN=yJ?9BgHyBNBnBn=n=n=n=n 0.n=@0. n=@-n0.@=@0.R@=@0.H=@Bn=nB?9?<HnHnHnN*?<BNN^ _PNN$NVNqNq nC""Jg/.NBN^.NuN$NVNqNq=n=n =n =n?9?<HnN N^ _PNN$pNVNqNq3 X3  Z3  \3 ^?9?<Hy XN,N^ _PNN$(NVNqNq?.?. ?. ?. N?. ?. ?. ?.N?. ?.?.?.Nr?.?.?.?. N^N^ _PNN#NVNqNq=n=n =n =n?9HnNN^ _PNN#NVNqNqN^NuNqNqNVUN3Jym|pr @m.=@=A`Rn0.HC :30.nf3 NUHnHnHnHnNL3Hy :HyHyBN h|`B.N^NuNqNqNV?9N $NN^NuNqNqNVN^NuNVA 000 0 0A"0<NBN^ _O NNqNqNV=y @N^NuNqNqNV?< Bg?<BgBgN03 @ =y @N^NuNqNqNV383 :/.# ?< ?<?<?<BgN0N^ _PNNqNqNV?<Bg?<BgBgN0N^NuNqNqNV3 83:?<?<?<BgBgN0N^.NuNqNqNV3B83@:3><3<>3:@38B36D34F32H30J3.L3,N3*P3(R/.$# 3"T3 V?<?<?<?<BgN0=y @D"n2 B"n2 D"n2 F"n2 H"n 2 J"n2 LN^ _O3 @3B?<*?<?<?<BgN0N^ _ONNqNqNV# 383 :3 <3>?<+?<?<?<BgN0=y @N^ _O NNqNqNV# 38?<,?<?<?<BgN0"n 2 B"n2 DN^ _ONNqNqNV383:3<3>3@3B3 D3 F3H?<3?< ?<BgBgN0N^ _ONNqNqNV/.# 3 8?<4?<?<?<BgN0=y @N^ _\NNqNqNV# ?<6Bg?<?<BgN0"n2 B"n2 D"n 2 F"n2 HN^ _ONNqNqNV383:3<3>?<F?<?<BgBgN0"n 2 B"n2 DN^ _ONNqNqNV383:3<3>3@3B3D3F?<G?<?<BgBgN0"n 2 B"n2 DN^ _ONNqNqNV?<MBg?<BgBgN0=y @"n2 B"n2 D"n 2 F"n2 HN^ _ONNqNqNV3 8# ?<N?<?<?<BgN0N^ _\NNqNqNV?<OBg?<BgBgN0"n2 B"n2 D"n 2 F"n2 HN^ _ONNqNqNV/.# /. # ?<ZBg?<?<BgN0"n2 BN^ _O NNqNqNV/.# /.# /.# ?<[Bg?<?<BgN0"n 2 BN^ _ONNqNqNV383:3 <3 >3@?<d?<?<BgBgN0=y @N^ _O NNqNqNV383:3 <3 >3@?<e?<?<BgBgN0N^ _O NNqNqNV38?<f?<?<BgBgN0N^ _TNNqNqNV38?<g?<?<BgBgN0N^ _TNNqNqNV383:?<h?<?<BgBgN0"n2 B"n2 D"n 2 F"n2 HN^ _ONNqNqNV383:3<3 >3 @3B?<i?<?<BgBgN0N^ _O NNqNqNV3 83:?<j?<?<BgBgN0=y @ N^.NuNqNqNV38?<k?<?<BgBgN0N^ _TNNqNqNV3"83 :3<3>3@3B?<l?<?<BgBgN0"n2 B"n2 D"n 2 F"n2 HN^ _ONNqNqNV/.# ?<nBg?<?<BgN0N^.NuNqNqNV?<oBg?<BgBgN0N^NuNqNqNV383 :?<p?<?<Bg?<N0"n" N^ _PNNqNqNV3  3,A "psNBN^.NuNqNqNV3  3,A "psNB=y @ N^.NuNqNqNVBy"3&38?. ?. NN^ _\NNqNqNV nCpA"QBy"3 &AC8pA"Q?<d n ?N"n 2,pr,@m8=@=A`Rn0.H2.IA @"n30.nfp-r8@m<=@=A`Rn0.H2.A-IA z"n30.nfN^ _O NNqNqNVBy"By&?<e?.NN^ _TNNqNqNV3"3&3 8pr@m8=@=A`Rn0.H2.I nC X30.nf?<?.NN^ _PNNqNqNV3 "By&0. HS@rAm8=A=@`Rn0.H2.I nC X30.nf?<?.NN^ _PNNqNqNV/.Hn?<PN3"p.3&3 X3  Zp.rAm<=A=@`Rn0.S@H2.tA0C830.nf?<?.NN^ _O NNqNqNV3"By&3*pr@m8=@=A`Rn0.H2.I nC X30.nf?< ?. NN^ _\NNqNqNV?< ?. ?.N*N^.NuNqNqNV?<?. ?.N*N^.NuNqNqNV3"By&3 XBy Z?<?. NN^.NuNqNqNV?<?. ?.N*N^.NuNqNqNVBy"3&3 83:?<l?. NN^ _\NNqNqNV3"By&By X3 Z?< ?.N"n2 z"n2 |"n 2 ~"n2 N^ _ONNqNqNV?<?. ?.N*N^.NuNqNqNV?<j?. ?.N*N^.NuNqNqNV?<?. ?.N*N^.NuNqNqNV?<?. ?.N*N^.NuNqNqNV3"3&U/. N.3.U/. NH30U/.N.32U/.NH3438pr@m8=@=A`Rn0.H2.I nC X30.nf?<m?.NN^ _ONNqNqNVBy"By&U?<|?.N"n2"n 2 z"n2 |N^ _ONNqNqNVBy"3&3 8?<f?.Npr,@m8=@=A`Rn0.H2.IA @"n30.nfp-r8@m<=@=A`Rn0.H2.A-IA z"n30.nfN^ _PNNqNqNV0. no =n `=n N^.NuNqNqNV0. nl =n `=n N^.NuNqNqNV/. H@=@ N^.NuNqNqNV/. =@ N^.NuNqNqNV n C""U n??.N=_U n?(?.N=_U n0 nh?0.n?N=_U n0( nh?0.n?N=_0.n0.nUHnN*JWD@A"n""N^ _PNNqNqNV nC""Jn_DJn_D@ N^.NuNqNqNV n C"""n2"n3n0.nS@"n3@0.nS@"n3@N^ _PNNqNqNVHy # Hy8#Hy X#Hy @#Hy z#Hy #Hy #Hy8#Hy @#Hy #Hy #N^NuNNVNqNqHzHn?<Np2.@mz=@=A`Rn . 0=@ n9o 0.^@=@0.@@=@HnHnNHnHn?<N@ . -@ 0.nfHn/.?<NN^ _\N N NVXNqNq/.Hn?<ONHnZHnN"NxHnZB?<N2NV=_XJnXfHnZN^NNJnXWD@ N^.NuN NVNqNqp n=@ nHh/.?.N F0. nB0N^.NuN LNVNqNqp n=@Jng "nHz=@=A`Sn0.r n0 \f =n `0.nfBn N^.NuNqNqNV/.Hn?<ONU/N=_Jno*HnHn?<?.NHn/.?<CN``4p. @fHn/.?<CN>`Hz/.?<CN*Hn?<p n?NHzHnN=_JnoVHnHn?<0.S@?NhHn/. ?<NHnHn?.p.?N@Hn/.?<N`"Hn/. ?<NHz/.?<NN^ _ON .NV/9?<?<NMP/9?<?<NMPN^NuNV/.?<HNA\O-@ N^.NuNV/.?<INA\ONLN^.NuLpH0Q _PN0/Lc)`Q _O NLtcSBe Vf _PNLprd PF`Q _PNLLtJAnrBn$ARBJ@oBo0S@Q`B _O NLH0prtg(g$AeSA6$H&I Vg RBRQtL  _\O>NNuNVHn/. ?<?.SWNR/.HnNHn/. ?.?<N2HnHnNHn/. ?. NN^ _O NNVHn/. ?<?. SWNHn/. 0. n??<NHnHnNHn/. ?<N8N^ _PNLLt @A`BQ`Q`BQ _O N opBQNu0/ orI _TNL oe tJRfRrSd.NuLL`Q _O N o0/ @ep` 2I0 _\NL/pVNuL/p"XQNu0/Lge`!Q`Q _O NL o`Q _PNprt +g -ftR: d2: d/ПЁkR`JgD@`DNuJlD-C(r \Y"gt/RlЁ`BNu;B@'d NuL#|B P rҀA kHp Pr _PN /gN^@ y|" "H Xb If "i`Jk""#hÉ#A"o"BB`?<8//N J _PN/ L^@"Q y|b `T hbJkB#h"Etf#j $$ё!I$Hеf!i ""ѐ$_ _PN y|pИ PdR//@Nu y|p` hd" j//ANu/$HB&HCCHBBBЂ&NuLN/@.NuHxJjDxJf?<7//N:jDFD$v Ӂd҂рQFJDgDHDJDgDLNuNNuNANu"y gN?<:/9NNu _#"PCcN?<2/NNu _mn #N?<3/NNu _XmXn #N~?<3/NfNuB/ ?@oSB SAoQ4`SA_ "_NuNV .AN A"n 2.4.NN^ _O NNV n Cp`QBAN:Cr"n ÈfrRA n0-@ N^.Nu _H?NALTJj 3xDNNu"o o  # r< o r `aQB...Nu<am <zn< Nu _?9xByxNJyxfNu _?9x/NJfaRJ)g HipAaaTBiNuJ9g`a"e3@Bi _Nu`N??)/pBaPONu/) ?)Bg?)p?a Nu/) ?)Bg?)p@a Nu"o0Sf N\NBQ.Nu"o #o 3oBJ)g3i _ NL/BBYBBBXBNt`4<L faf2N`HaByx23oNgBQ _ N"o)SfN.NuA`A"oapf#o 3iNeig3@x _XONA`A"oa6f,#o 0/?)3@3@N3_"/g A0Byx _NNHLaf 2)a4rN _PON"oa^2)a*/@Nu"oaL 2)a/@Nu$HBHBBBЂNu Ctv BAdAрQ&FNu"oaWD _XNavf*prN/prN/ /rN "NuprNuNV n C@N n"ONHWHo@BgpVN N^ _PONNV n"ONHWpAN N^.Nu(_z#LDAH~#J9zg$-mll$mb*//NڏJ9zg+E// Bg?<JNA ataA,J9zg m$ (ga"A,##NAa?<`Hz#NuJ9zfAa~`a`&9g0Apad09>aFAqaTAxtJgaXHtaBaNuHz?<&NN\ONuxp<0<:m^a"QNuHQO ONv OaPONuga`H ?/<NM\OLNuBaF#3.y yB oN`?9?<LNAAH x2| hg"h$#Nup98tg xp4Ug p5Sgp6 xαd y$f y|?/``p7 o`Apa(#Aa#Nu ypa y0</??<NMPONu Runtime error: at offset: ????. Not enough space for heap Accessory error4  o[1][| Zuwenig Speicher fr| Bildhintergrund.|Aktion kann nur fehlerhaft | durchgefhrt werden!][Nanu?]MoDiMiDoFrSaSo 1 Januar 2 Februar 3 Mrz 4 April 5 Mai 6 Juni 7 Juli 8 August 9 September 10 Oktober 11 November 12 Dezember REMINDER.PRGNeujahr Heilige drei KnigeKarfreitag Ostersonntag Ostermontag Maifeiertag Christi HimmelfahrtPfingstsonntag Pfingstmontag Fronleichnam Mari Himmelfahrt Wiedervereinigung Allerheiligen Bu- und Bettag 1. Weihnachtstag 2. Weihnachtstag KALENDER.TRMaktive quittierte gelschte einmalige monatliche jhrliche T_KALEND.RSC T_KALEND.INFR*0           $@": hT> : >  &H  L 6(   " @   4         $         &  &  <4                                                           2&       &@(  "2   2 &                           $   (8",$ $  0    x                                < :2 :       "    D , .0 .   (       " ,   (    ""(             6  0      " 8          $  $  $  $        , 2"         .     $"  6 X \ d T ` L** ^<""  .<$$$,         8>      $       ,B:   " "  >.   " . $  " "   " &2&Fp((B^    6 &$(0.    .    .     $  *   ( &   6<.  4*(  0 B& dTF   . " ,"2   2      2  x ".  0                 l 2               >2   4     ,(&   tJ"",*F * 8 $:2"&(8< (6. F" p>$8* &((             T"  8*h    .  *H               "   * >L & : : 4 >T &^    $ * $$, ( 4    "0F0VVT" X z( 4($" " $       & $       "  &  *D.. 4 " 8. "   $     .  *D&(  J.J>hj ($ @ 6d0:,L  & 4z   ", V2(, "  ,%,%j%$2%C= C  Datei Kalender Filter Suchen REMINDER?? 99.99.9999 Terminkalender---------------------- Desk Accessory 1 Desk Accessory 2 Desk Accessory 3 Desk Accessory 4 Desk Accessory 5 Desk Accessory 6 neuer Kalender--------------------------- Kalender laden ^L Kalender hinzuladen ^H Kalender speichern ^S--------------------------- ''-mark. auslagern Ausgelagerte T laden--------------------------- Einstellungen sichern--------------------------- Programmende ^X ffnen ^O Schlieen ^C----------------------- ''-mark. lschen----------------------- Anzahl Termine freier Speicher----------------------- Termingenerator T Periodizitt: egal ^E einmalige ^I monatliche ^M jhrliche ^J----------------- Zustand: egal E aktiv ^A quittiert ^Q gelscht ^G Zeichenkette ^Z Zeitspannen Z----------------------- Feiertage ffnen ^F Feiert. schlie. ^T lokalisieren konfigurieren ausfhrenXXxxxxxxxxTermine fr __, den __.__.____XX99999999?????????????????????????? Gesucht: __________________________ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Anzahl: ____ 9999xxxxxx Seite: ___/___ 999999 = aktiv  = quittiert  = zum Lschen markiert???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????NeuDetail/EditLschenZurckDruckenVersteckenNeuerXXxxxxxxxx Termin fr __, den __.__.____ XX99999999XXxxxxxxxx bis __, den __.__.____ XX99999999????????????????????????????????????????????????????????????????________________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX0__0__ REMINDER-Intervall: - ___ / + ___ 999999aktivquittiertlschenBemerkungen zum Termin:????????????????????????????????????????????????????????????????________________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX????????????????????????????????????????????????????????????????________________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX????????????????????????????????????????????????????????????????________________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX????????????????????????????????????????????????????????????????________________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX????????????????????????????????????????????????????????????????________________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX????????????????????????????????????????????????????????????????________________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX????????????????????????????????????????????????????????????????________________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX????????????????????????????????????????????????????????????????________________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX????????????????????????????????????????????????????????????????________________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX????????????????????????????????????????????????????????????????________________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(fr Zeitspannendefinition:)Neu/ndernZurckDuplizierenDrucken Termin-Suche ?????????????????????????? Such-Zeichenkette: __________________________ XXXXXXXXXXXXXXXXXXXXXXXXXXnur berschriftenauch BemerkungenZurckSuchen . = Gesamt-Suche 999 Gehe zu Seite : ___ 999proudlypresents:The Super-Termin-ManagerbernehmenZurckDer Termin liegt in einer vereinbarten Zeitspanne:?????????????????????????????????????????????????????????????????XXxxxxxxxx Von __, den __.__.____ XX99999999XXxxxxxxxx bis __, den __.__.____ XX999999991.2.3.4.letzterMoDiMiDoFrSaSo1234612alleMonateMonatsletzter1_ Tag: __. 99oderoder 99999999 ab __.__.____ 9999999999999999 bis __.__.____ 999999990_ __ mal 99oder heute0__ alle ___ Tage 9990_ alle __ Wochen 99oder0__0__ REMINDER-Intervall: - ___ / + ___ 999999????????????????????????????????????????????????????????????????________________________________________________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXVerwerfenTermine generierenText zum Termin:[1][ Die Datei kann| nicht vollstn-|dig geladen werden.| Zuwenig Speicher!][Leider][3][ Kein Speicher!| Termin kann| nicht|angelegt werden.][Schade][3][ Kein Speicher!|Es knnen nicht|alle Bemerkungen|angelegt werden.][Schade][2][ |Diese Operation| WIRKLICH| durchfhren??][Nein|JA][3][ | Keine Fenster | verfgbar!][Prog.-Ende][3][ |Kalender-Datei | nicht| gefunden!][Nanu?][2][ | Kalender wurde | verndert!| |Vorher sichern?][Natrlich|Nein][3][ Falsche Auflsung! | | Mind.| 640 x 400| erforderlich!][Schade][2][ | Kalender fr | HEUTE| ffnen?][OK|Nein][3][ | Dieses ist | KEINE| T_KALEND-DATEI! ][TSCH][2][ | Es wurde| HINZU-geladen! | | Vorher sichern?][Nein|Doch][3][ Der Termin ist| UNPLAUSIBEL| oder liegt| AUERHALB des|zulssigen Bereiches! ][Verbessern][3][ Das Erinnerungs-INTERVALL|liegt fr periode Ereignisse| auerhalb des zulssigen| Bereiches!| (max. +- 15 bzw. +- 182)][Verbessern][3][ Das Programm | wird aus| Speicherplatzgrnden | abgebrochen!|Vorher noch speichern?][OK|Nein][1][ | Periodische Ereignisse| sind fr Zeitspannen | NICHT| erlaubt!][Schade][1][ | Termin VON liegt | spter als| Termin BIS| oder BIS = VON][Ach ja..][2][ | Die Datei existiert| bereits!| Was soll geschehen?][Anhngen|Ersetzen|Abbruch][3][ | Dateifehler!| | REMINDER lokalisieren! ][mach ich][1][ | Diese Funktion ist | erst in einer| nchsten Version| verfgbar!][Besorgen!][3][ Die AB- oder BIS- | Tagesdefinition| bzw. die Anzahl| ist NICHT| korrekt!][ach ja..][1][ | Es konnten wegen| Speicherplatzmangel | nicht ALLE Termine | angelegt werden!][Schade][3][ |Ein Text zum Termin | sollte aber| schon eingetragen| sein!][Natrlich]a1 a1 a1 a1 a1 DDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDNADDDDDNADDDDNADDDDDDDADDDDDDDADDDDDDDADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDNADDDDNADDDDNADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDnDFDANDDDDDNDAnDNDDNDANDnDDADDNDDADDNDDADDFDDNDADFDDNDANDFDDNDADNDFDDNDADNDFDDNDADNDNDDNDANDNDDNDADnDDNDANDNDDNDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDNADDDDDNADDDDNADDDDDDDADDDDDDDADDDDDDDADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDDDNADDDNADDDDNADDDDNADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDnDFDANDDDDDNDAnDNDDNDANDnDDADDNDDADDNDDADDFDDNDADFDDNDANDFDDNDADNDFDDNDADNDFDDNDADNDNDDNDANDNDDNDADnDDNDANDNDDNDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDADDDDDDDDDDAa1 a1 _0a,bW`}z2Rr @! @$$@Kj u&<~BBBJKBLBBBZ[B\BB&'B(jkBlBB 6 7B j p q r }     YAA $      C AA  GAA AA K AAOAASAAAAWAA[AA_AA?0 4536xyBz  (+6 9>?@GHIRc lu  $VAA P  P / $ ( /  9 A I% S:  =P  at !   6Pj    +"*  #7$M%c&{'()*!7,6 -./0(182H3Z4e5u6 + =8<9:;<7 >@'?@$= 4>J%%&%& *@&<9 2AQ&XA Q&tA Q&A Q&A Q&A Q&AQ'AQ'AQ'8AQ'T AQ'p AQ' AQ' AQ' AQ'A@G@G  8 <   H  PA W6 _( .-  ! " # $ % & ' ( )  *  +  ,  -   >/=0B1B2B3B4B5B6B7B8B9B :B ;B <B =B .B??H>`%jF'((4,(PB(l#  q.A Q L (. (6 (? B (@(@)@)0@)L@)h@)@)@)@) @),D 7 " D`%x 1 1*//Zl} ' *, / `%*H@%`%  3 *d*  %`@% *  %%`@E   1*4*A;*+ + C`%1K & Q!Q Q Q  Q   Q! Q  Q  Q Q Q Q  !         Q Y +( +D@ +`  '!&*"+|&#%$!+% +"+ A ,(+*)!+* ,+@$',$-,@#.,\B/ 0 51,x 22I1`%,28;<=D>>`.DN FihlN%`NVNqNqNN2BgN,N^NuN%BNVNqNq y29LgU?<?<N 39LNN^NuN%NVNqNq?<BgBgBgBg y8>0(W@? y8>0(W@? y8>0(\@? y8>0(\@?NdN^NuN$NVHUNJf ?<cN,$BgBNHy.NUN0J@f6HzFHy8?<N U?<Hy8Nn39LN0?<cN+BgBgHy8>N/98>Hy9LHy9LHy9LHy9LNnHnHzNzXHnHy9N?<PN `HnHy9NHzHzNXHnHy9N?<PN 6UHy9NNJf NNPHy8tHy9NN'Hy8tB?<N'Hy8tHy8B?<2Hy9LN(>Hy8tN'N&"y8>3|j"y8>3|"y8>3| 98XJgp y8>0(j"y8>3@j 98XJgp y8>0("y8>3@ 98XJgp y8>0("y8>3@ 98Dй8Hй8Lй8l#9 99"<N"b/BgHy8?<N#HnHy8?<?<NNHnHy8?<NHy8 y8> hD/N| 98p"<N"/BgHy8?<N"HnHy8?<?<NHnHy8?<NXHy8 y8> h\/N3 9BgBgBgBgBg y8>0(W@? y8>0(W@? y8>0(\@? y8>0(\@?N0/98>Bg?< BgBgBgBgNU/98>?99?<Hy9N0@39099H/HxN r y8>20@Jgd099H/HxN z 299H/Hx&N d"p y8>00 "y8>38 /98>?99?<BgBgBgBgNX?99HnN?<N?< N?< NXHnNg099H/HxN 299H/Hx&N"p y8>00 ~"y8>38 y 9fHn y8> hD/NXHnHy8?<NxHy8Hy9LN #9Hn y8> h\/NrXHnHy8?<N:Hy8Hy9LN #9 d9lU?<BgND39L`. 29lU?<?<N39L` 99r 㨐8D8H8L#8l 99r #8p 98X#8Xp y8>0(jJg 98X#8Xp y8>0(Jg 98X#8Xp y8>0(Jg 98X#8XHy8tHy9NN"Hy8tB?<N"Hy8tHy8B?<2Hy9LN#Hn.HnNHnHnN|HnHn.?<PNHn HnNHn HnNTHnHn ?< NHn.N Hn N U/N0 @o"HnN Hn.Hn Hn HnN``HzHnNHnHnNHzHnNHnHn?<-NxHnN U?<HnN=_Hn.Hn Hn N"Hn.N Hn N Hn.Hn.HnHnNJn fHzD/.?<PN`*Hn.HnNHn HnNLHn/.?<PNN^ _O N [0][| ][Weiter] NZNVNqNq?<?.HnNJgU?. /.NB=_ `Bn N^.NuNNVNqNq3143163 183 1:31Rn0.H/HxN r n 200. H€Jg =n``N^ _PNNNVNqNqU/.?<BgNd=_ N^.NuNNVNqNqBn=nU/.?<?.N2=_Jnf=n N^.NuNNVH?<N|0. HN@UHnHnHnHnN0=_B.JnfU/.NF=_=nBn=|JnoJnVD2.nVDg=nBn .f0.H/HxNz r n p Pp N=@0.H/HxNF  n p PB/.?.Bg?.?<HnN0.H/HxN &0.N"n"q8 "Q`/.?.Bg?.?<HnNJ.gB./.?.HnHnN0.H/HxN  n p =h0.H/HxN  n p 2( Af0.nH=@` Af@0.n2.H/Hx&N6" np0.S@@HÇ=C`L AfD0.n2.H/Hx&N"0.S@ n40@H…BHÇ=CJnm|0.H/HxN &0.Nr n p8 h0 _f@=|=|Rn0.H/HxNd &0.N6r n p8 h0 _fRn0.nf/.?.Bg?.?<HnN0.H/HxN &0.Nr n p8 P0p N=@0.H/HxN &0.N n p8 PB0/.?.Bg?.?<HnNV0.H/HxNr &0.ND(0.N6"n"q8 "Q@U?<?<?<?<BgBgBgBgBgBgBgBgBgBgHnBgBgHnHnHnHnHnHnN 2=_0.@J@gf n WD nr WDg U/.?<BgN0J@f=|P0. @Rf .f B.`|` @H8g @GfU/.N=_` @P2g @G7fU/.N=_` @K4f/.?.Bg?.?<HnN0.H/HxN r n p Pp N=@0.H/HxN  n p PB/.?.Bg?.?<HnN0.H/HxN &0.Nz"n"q8 "Q` @M6f:/.?.Bg?.?<HnN:/.?.Bg?.?<HnN `U/.?.Bg?.HnHnN^=_Jng .fv0. @Kf`f @Mf`Z @Sf`N @R0f`B @f`6 @bf`* @af`/.?.?=@=A`Sn0.r n0 \f =n `0.nfBn N^.NuNqNqNV/.Hn?<ON LU/N=_Jno*HnHn?<?.N Hn/.?<CN `4p. @fHn/.?<CN`Hz/.?<CNHn?<p n?N HzHnN =_JnoVHnHn?<0.S@?N Hn/. ?<NHnHn?.p.?NHn/.?<N``"Hn/. ?<NLHz/.?<N1P3<1R3:1T381V361X341Z321\301^3.1`3,1b3*1d3(1f/.$#53"1h3 1j?<?<?<?<BgN=y2TD"n22V"n22X"n22Z"n22\"n 22^"n22`N^ _ONNuNVHn/. ?<?. SWNRHn/. 0. n??<N8HnHnNHn/. ?<NN^ _PN opBQNu0/ orI _TN o0/ @ep` 2I0 _\N0/Lge`!Q`Q _O Nprt +g -ftR: d2: d/ПЁkR`JgD@`DNuJlD-C(r \Y"gt/RlЁ`BNu;B@'d NuL#0B P rҀA kHp Pr _PN/$HB&HCCHBBBЂ&NuLN/@.NuHxJjDxJf?<7//NjDFD$v Ӂd҂рQFJDgDHDJDgDLNuNNu"y0 gN?<:/90NNu _#0"PC0cN?<2/NhNu _mn #0N?<3/NDNu _XmXn #0N~?<3/N NuB/ ?@oSB SAoQ4`SA_ "_NuNV .AN A"n 2.4.NN^ _O NNV n Cp`QBANbCr"n ÈfrRA n0-@ N^.Nu _H0?NAL0TJj 30DNNu"o o  0#0 r< o r `aQB...Nu<am <zn< Nu _?90By0NJy0fNu _?90/N-JfaRJ)g HipAaaTBiNuJ90g`a"e3@Bi _Nu`N??)/pBaPONu/) ?)Bg?)p?a Nu/) ?)Bg?)p@a NuL/BBYBBBXBN(t`4<L faf2N'D`HaBy023oN'^gBQ _ N"o)SfN'.NuA)Z`A)r"oapf#o 3iNeig3@0 _XONA)Z`A)r"oa6f,#o 0/?)3@3@N3_"/g A0By0 _NN(Laf 2)a4rN)J _PON"oa^2)a*/@Nu"oaL 2)a/@Nu$HBHBBBЂNu Ctv BAdAрQ&FNu"oaWD _XNavf*prN)J/prN)J/ /rN)J "NuprNuNV n C@N(" n"ON("HWHo@BgpVN&N^ _PONNV n"ON("HWpAN&N^.Nu(_0#0LDAH~#0J90g$-mll$mb*//N$ڏJ90g+E// Bg?<JNA ataA,J90g m$ (ga"A,#0#0NAa?<`Hz#0NuJ90fAa~`a`&90g00Apad090>aFAqaTAxtJgaXHtaBaNuHz?<&NN\ONuxp<0<:m^a"QNuHQO ON$4 OaPONuga`H ?/<NM\OLNuBaF#030.y0 y0B0 oN`?90?<LNAAH x2| hg"h$#0Nup98tg xp4Ug p5Sgp6 xα0d y0$f y0|?/``p7 o`Apa(#0Aa#0Nu y0pa y00</??<NMPONu Runtime error: at offset: ????. Not enough space for heap Accessory error4  o[1][| Zuwenig Speicher fr| Bildhintergrund.|Aktion kann nur fehlerhaft | durchgefhrt werden!][Nanu?] T_KONFIG.RSCF&>          4            D4    :($" ""    &     " *  *D.޾ ($ @ 6d0:,  & 4z   ", V2(, "  $  Konfigurierprogramm fr 'T_KALEND.PRG' 1992 by DiLi-Soft Fast-LoadProgr. ins TT-RAMMalloc aus TT-RAMKonfigurierenEnde9999: ____ KByte9999999: ___ KByte999max. vom Progr. zu belegender Speichermin. freibleibenderSystem-Speicher'T_KALEND' suchen...[3][ | Werte unter 100 KByte | fr max.| Speicherbedarf| sind nicht sinnvoll!][ndern][3][ | Werte unter 50 KByte | fr min.| Restspeicher| sind zuwenig!][ndern][3][ | | Dateifehler! ][Abbruch][0][ Die| Konfiguration | wurde| erfolgreich| durchgefhrt!][ Weiter ] C"$PQ,Rghs  ,-91+1  @q  i    @q  @q (       8Tp  %. . 6\.. TSWP CPX u4TSWP_TSRPRG ."TSWP TXT A4#YdTSWPSCHREIBSCHUZ?>ppppp|??TS Schreibschutz= `<H0YOE :$G B R0(gHW/HoC >AzN2XO09 >gG o"S3P"S3hBD` phUg4H"ҁ҂ ShRD|mBgBgBgBBrB@ SN\O`bHTBg/ y : h4NO :R@fn2|g|g | g `Vz)`Rz*`NBD`2@H2,AAgRD|m|l,2H ЀЁ S hBgBgBgBBpD SrN\O|0|'gU@gS@g`p?BgBgBgBgBBBA Sp'NO Bg y : hDNTOJ@gBD`*2H ЀЁ S hftjU`phF@URD|m W0p/HU y : hHNPO`:BD`*2H ЀЁ S hftjU`phF@URD|m W0vJCg09 >NJB@OL<8Nu/ / O$oI >0*g02*g*>4@SB?B?j4/ASB?BA0rNpj >jW@?@rj ?AjWA?A0BANXA0Npjg,?W ?o ?o?oAr0N Ar0NABA0N,pjO(_$_NuA @1ABh1|r`C @3|3|3AC0""A @2<`Cp2222A @1|Bh1| r `A @BhBhre`3 L/ C @2dBi3| Cp 2Q"<ps/ NB$_ _0 LA"op,2QAXp 2QNu @ pXC @3ABi# ( Ira#p (Nu/ 1@ 0"< psNBA0$_Nu#XA 000000p*`.#XA 0000000 0 p/`/ 3 @@@A"C BB@22220<"<NBA0$_Nu @ ^ XX (A    !&%    "           !  # $ %  ('' & )* * (%  A      '  l0. !"#$%&21TONYSOFT SchreibschutzABCDEFGHIJKLMNOPSichernOKAbbruchTONYSOFT SchreibschutzZuerstTSWP_TSR.PRGinstallieren !OK @ pX j0F hRP"  ( ,x0000 ``JXBRATSWP0/g,0/2:g ?/?

#else /* !MODERN */ extern void free(); #endif /* ?MODERN */ #define THRESHOLD 3 #define DDICSIZ 26624 #define MAXDICBIT 16 #define MATCHBIT 8 #define MAXMATCH 256 #define NC (UCHAR_MAX + MAXMATCH + 2 - THRESHOLD) #define NP (MAXDICBIT + 1) #define CBIT 9 #define NT (CODE_BIT + 3) #define PBIT 5 #define TBIT 5 #if NT > NP #define NPT NT #else #define NPT NP #endif #define CTABLESIZE 4096 #define STRTP 9 #define STOPP 13 #define STRTL 0 #define STOPL 7 /* Local functions */ #ifdef MODERN static void make_table(int nchar, uchar *bitlen, int tablebits, ushort *table); static void read_pt_len(int nn, int nbit, int i_special); static void read_c_len(void); static ushort decode_c(void); static ushort decode_p(void); static void decode_start(void); static short decode_ptr(void); static short decode_len(void); #endif /* MODERN */ /* Local variables */ static uchar *text = NULL; static short getlen; static short getbuf; static ushort left[2 * NC - 1]; static ushort right[2 * NC - 1]; static uchar c_len[NC]; static uchar pt_len[NPT]; static ushort c_table[CTABLESIZE]; static ushort pt_table[256]; static ushort blocksize; /* Huffman decode routines */ static void make_table(nchar, bitlen, tablebits, table) int nchar; uchar *bitlen; int tablebits; ushort *table; { ushort count[17], weight[17], start[18], *p; uint i, k, len, ch, jutbits, avail, nextcode, mask; for (i = 1; i <= 16; i++) count[i] = 0; for (i = 0; (int)i < nchar; i++) count[bitlen[i]]++; start[1] = 0; for (i = 1; i <= 16; i++) start[i + 1] = start[i] + (count[i] << (16 - i)); if (start[17] != (ushort) (1 << 16)) error(M_BADTABLE, ""); jutbits = 16 - tablebits; for (i = 1; (int)i <= tablebits; i++) { start[i] >>= jutbits; weight[i] = 1 << (tablebits - i); } while (i <= 16) { weight[i] = 1 << (16 - i); i++; } i = start[tablebits + 1] >> jutbits; if (i != (ushort) (1 << 16)) { k = 1 << tablebits; while (i != k) table[i++] = 0; } avail = nchar; mask = 1 << (15 - tablebits); for (ch = 0; (int)ch < nchar; ch++) { if ((len = bitlen[ch]) == 0) continue; k = start[len]; nextcode = k + weight[len]; if ((int)len <= tablebits) { for (i = start[len]; i < nextcode; i++) table[i] = ch; } else { p = &table[k >> jutbits]; i = len - tablebits; while (i != 0) { if (*p == 0) { right[avail] = left[avail] = 0; *p = avail++; } if (k & mask) p = &right[*p]; else p = &left[*p]; k <<= 1; i--; } *p = ch; } start[len] = nextcode; } } static void read_pt_len(nn, nbit, i_special) int nn; int nbit; int i_special; { int i, n; short c; ushort mask; n = getbits(nbit); if (n == 0) { c = getbits(nbit); for (i = 0; i < nn; i++) pt_len[i] = 0; for (i = 0; i < 256; i++) pt_table[i] = c; } else { i = 0; while (i < n) { c = bitbuf >> (13); if (c == 7) { mask = 1 << (12); while (mask & bitbuf) { mask >>= 1; c++; } } fillbuf((c < 7) ? 3 : (int)(c - 3)); pt_len[i++] = (uchar)c; if (i == i_special) { c = getbits(2); while (--c >= 0) pt_len[i++] = 0; } } while (i < nn) pt_len[i++] = 0; make_table(nn, pt_len, 8, pt_table); } } static void read_c_len() { short i, c, n; ushort mask; n = getbits(CBIT); if (n == 0) { c = getbits(CBIT); for (i = 0; i < NC; i++) c_len[i] = 0; for (i = 0; i < CTABLESIZE; i++) c_table[i] = c; } else { i = 0; while (i < n) { c = pt_table[bitbuf >> (8)]; if (c >= NT) { mask = 1 << (7); do { if (bitbuf & mask) c = right[c]; else c = left[c]; mask >>= 1; } while (c >= NT); } fillbuf((int)(pt_len[c])); if (c <= 2) { if (c == 0) c = 1; else if (c == 1) c = getbits(4) + 3; else c = getbits(CBIT) + 20; while (--c >= 0) c_len[i++] = 0; } else c_len[i++] = (uchar)(c - 2); } while (i < NC) c_len[i++] = 0; make_table(NC, c_len, 12, c_table); } } static ushort decode_c() { ushort j, mask; if (blocksize == 0) { blocksize = getbits(16); read_pt_len(NT, TBIT, 3); read_c_len(); read_pt_len(NP, PBIT, -1); } blocksize--; j = c_table[bitbuf >> 4]; if (j >= NC) { mask = 1 << (3); do { if (bitbuf & mask) j = right[j]; else j = left[j]; mask >>= 1; } while (j >= NC); } fillbuf((int)(c_len[j])); return j; } static ushort decode_p() { ushort j, mask; j = pt_table[bitbuf >> (8)]; if (j >= NP) { mask = 1 << (7); do { if (bitbuf & mask) j = right[j]; else j = left[j]; mask >>= 1; } while (j >= NP); } fillbuf((int)(pt_len[j])); if (j != 0) { j--; j = (1 << j) + getbits((int)j); } return j; } static void decode_start() { blocksize = 0; init_getbits(); } void decode() { short i; short j; short c; short r; long count; #ifdef KEEP_WINDOW if (text == (uchar *) NULL) text = (uchar *)malloc_msg(DDICSIZ); #else text = (uchar *)malloc_msg(DDICSIZ); #endif disp_clock(); decode_start(); count = 0; r = 0; while (count < origsize) { if ((c = decode_c()) <= UCHAR_MAX) { text[r] = (uchar) c; count++; if (++r >= DDICSIZ) { r = 0; disp_clock(); fwrite_txt_crc(text, DDICSIZ); } } else { j = c - (UCHAR_MAX + 1 - THRESHOLD); count += j; i = decode_p(); if ((i = r - i - 1) < 0) i += DDICSIZ; if (r > i && r < DDICSIZ - MAXMATCH - 1) { while (--j >= 0) text[r++] = text[i++]; } else { while (--j >= 0) { text[r] = text[i]; if (++r >= DDICSIZ) { r = 0; disp_clock(); fwrite_txt_crc(text, DDICSIZ); } if (++i >= DDICSIZ) i = 0; } } } } if (r != 0) fwrite_txt_crc(text, r); #ifndef KEEP_WINDOW free((char *)text); #endif } /* Macros */ #define BFIL {getbuf|=bitbuf>>getlen;fillbuf(CODE_BIT-getlen);getlen=CODE_BIT;} #define GETBIT(c) {if(getlen<=0)BFIL c=(getbuf&0x8000)!=0;getbuf<<=1;getlen--;} #define BPUL(l) {getbuf<<=l;getlen-=l;} #define GETBITS(c,l) {if(getlen>(CODE_BIT-l);BPUL(l)} static short decode_ptr() { short c; short width; short plus; short pwr; plus = 0; pwr = 1 << (STRTP); for (width = (STRTP); width < (STOPP) ; width++) { GETBIT(c); if (c == 0) break; plus += pwr; pwr <<= 1; } if (width != 0) GETBITS(c, width); c += plus; return c; } static short decode_len() { short c; short width; short plus; short pwr; plus = 0; pwr = 1 << (STRTL); for (width = (STRTL); width < (STOPL) ; width++) { GETBIT(c); if (c == 0) break; plus += pwr; pwr <<= 1; } if (width != 0) GETBITS(c, width); c += plus; return c; } void decode_f() { short i; short j; short c; short r; short pos; long count; #ifdef KEEP_WINDOW if (text == (uchar *) NULL) text = (uchar *)malloc_msg(DDICSIZ); #else text = (uchar *)malloc_msg(DDICSIZ); #endif disp_clock(); init_getbits(); getlen = getbuf = 0; count = 0; r = 0; while (count < origsize) { c = decode_len(); if (c == 0) { GETBITS(c, CHAR_BIT); text[r] = (uchar)c; count++; if (++r >= DDICSIZ) { r = 0; disp_clock(); fwrite_txt_crc(text, DDICSIZ); } } else { j = c - 1 + THRESHOLD; count += j; pos = decode_ptr(); if ((i = r - pos - 1) < 0) i += DDICSIZ; while (j-- > 0) { text[r] = text[i]; if (++r >= DDICSIZ) { r = 0; disp_clock(); fwrite_txt_crc(text, DDICSIZ); } if (++i >= DDICSIZ) i = 0; } } } if (r != 0) fwrite_txt_crc(text, r); #ifndef KEEP_WINDOW free((char *)text); #endif } /* end DECODE.C */ /* ENVIRON.C, UNARJ, R JUNG, 09/01/91 * Implementation dependent routines * Copyright (c) 1991 by Robert K Jung. All rights reserved. * * This code may be freely used in programs that are NOT ARJ archivers * (both compress and extract ARJ archives). * * If you wish to distribute a modified version of this program, you * MUST indicate that it is a modified version both in the program and * source code. * * If you modify this program, I would appreciate a copy of the new * source code. I am holding the copyright on the source code, so * please do not delete my name from the program files or from the * documentation. * * The UNIX file date-time stamping code is derived from ZOO by * Rahul Dhesi. * * Modification history: * Date Programmer Description of modification. * 04/09/91 R. Jung Rewrote code. * 04/23/91 M. Adler Portabilized. * 04/29/91 R. Jung Added get_mode_str(). * 05/08/91 R. Jung Combined set_ftime() and set_fmode(). * 06/03/91 R. Jung Changed arguments in get_mode_str() and * set_ftime_mode(). * 07/07/91 R. Jung Added default_case_path() and UNIX section. * 07/24/91 R. Jung Fixed use of _chmod to handle directories. * 08/27/91 R. Jung Added date/time handling to Coherent. * 09/01/91 R. Jung Added #include to vanilla section. * Added file date-time stamping to UNIX section. * */ #include "unarj.h" #ifdef __TURBOC__ #define SUBS_DEFINED #include #include #include #include FILE * file_open(name, mode) char *name; char *mode; { return fopen(name, mode); } int file_read(buf, size, nitems, stream) char *buf; int size; int nitems; FILE *stream; { return fread(buf, (size_t) size, (size_t) nitems, stream); } int file_seek(stream, offset, mode) FILE *stream; long offset; int mode; { return fseek(stream, offset, mode); } long file_tell(stream) FILE *stream; { return ftell(stream); } int file_write(buf, size, nitems, stream) char *buf; int size; int nitems; FILE *stream; { return fwrite(buf, (size_t) size, (size_t) nitems, stream); } voidp * xmalloc(size) int size; { return (voidp *)malloc((size_t) size); } void case_path(name) char *name; { strupper(name); } void default_case_path(name) char *name; { strupper(name); } int file_exists(name) char *name; { FILE *fd; if ((fd = fopen(name, "rb")) == NULL) return 0; fclose(fd); return 1; } void get_mode_str(str, mode) char *str; uint mode; { strcpy(str, "---W"); if (mode & FA_ARCH) str[0] = 'A'; if (mode & FA_SYSTEM) str[1] = 'S'; if (mode & FA_HIDDEN) str[2] = 'H'; if (mode & FA_RDONLY) str[3] = 'R'; } int set_ftime_mode(name, tstamp, attribute, host) char *name; ulong tstamp; uint attribute; uint host; { FILE *fd; int code; if ((fd = fopen(name, "r+b")) == NULL) return -1; code = setftime(fileno(fd), (struct ftime *) &tstamp); fclose(fd); if (host == OS) { attribute &= 0x27; if (Fattrib(name, 1, attribute) == -1) return -1; } return code; } #endif #ifdef _QC #define SUBS_DEFINED #include #include #include #include #include FILE * file_open(name, mode) char *name; char *mode; { return fopen(name, mode); } int file_read(buf, size, nitems, stream) char *buf; int size; int nitems; FILE *stream; { return fread(buf, (size_t) size, (size_t) nitems, stream); } int file_seek(stream, offset, mode) FILE *stream; long offset; int mode; { return fseek(stream, offset, mode); } long file_tell(stream) FILE *stream; { return ftell(stream); } int file_write(buf, size, nitems, stream) char *buf; int size; int nitems; FILE *stream; { return fwrite(buf, (size_t) size, (size_t) nitems, stream); } voidp * xmalloc(size) int size; { return (voidp *)malloc((size_t) size); } void case_path(name) char *name; { strupper(name); } void default_case_path(name) char *name; { strupper(name); } int file_exists(name) char *name; { return (access(name, 0) == 0); } void get_mode_str(str, mode) char *str; uint mode; { strcpy(str, "---W"); if (mode & FA_ARCH) str[0] = 'A'; if (mode & FA_SYSTEM) str[1] = 'S'; if (mode & FA_HIDDEN) str[2] = 'H'; if (mode & FA_RDONLY) str[3] = 'R'; } int set_ftime_mode(name, tstamp, attribute, host) char *name; ulong tstamp; uint attribute; uint host; { FILE *fd; int code; uint date_stamp, time_stamp; date_stamp = (uint)(tstamp >> 16); time_stamp = (uint)(tstamp & 0xFFFF); if ((fd = fopen(name, "r+b")) == NULL) return -1; code = _dos_setftime(fileno(fd), date_stamp, time_stamp); fclose(fd); if (host == OS) { if (_dos_setfileattr(name, attribute)) return -1; } return code; } #endif #ifdef _OS2 #define SUBS_DEFINED #include #define INCL_DOSFILEMGR #include #include #include FILE * file_open(name, mode) char *name; char *mode; { return fopen(name, mode); } int file_read(buf, size, nitems, stream) char *buf; int size; int nitems; FILE *stream; { return fread(buf, (size_t) size, (size_t) nitems, stream); } int file_seek(stream, offset, mode) FILE *stream; long offset; int mode; { return fseek(stream, offset, mode); } long file_tell(stream) FILE *stream; { return ftell(stream); } int file_write(buf, size, nitems, stream) char *buf; int size; int nitems; FILE *stream; { return fwrite(buf, (size_t) size, (size_t) nitems, stream); } voidp * xmalloc(size) int size; { return (voidp *)malloc((size_t) size); } void case_path(name) char *name; { strupper(name); } void default_case_path(name) char *name; { strupper(name); } int file_exists(name) char *name; { return (access(name, 0) == 0); } void get_mode_str(str, mode) char *str; uint mode; { strcpy(str, "---W"); if (mode & FA_ARCH) str[0] = 'A'; if (mode & FA_SYSTEM) str[1] = 'S'; if (mode & FA_HIDDEN) str[2] = 'H'; if (mode & FA_RDONLY) str[3] = 'R'; } int set_ftime_mode(name, tstamp, attribute, host) char *name; ulong tstamp; uint attribute; uint host; { int code; FDATE date_stamp; FTIME time_stamp; HFILE handle; FILESTATUS info; USHORT action; date_stamp.day = ts_day (tstamp); date_stamp.month = ts_month (tstamp); date_stamp.year = ts_year (tstamp) - 1980; time_stamp.twosecs = ts_sec (tstamp) / 2; time_stamp.minutes = ts_min (tstamp); time_stamp.hours = ts_hour (tstamp); if (DosOpen (name, &handle, &action, 0L, 0, FILE_OPEN, OPEN_ACCESS_READWRITE|OPEN_SHARE_DENYREADWRITE, 0L) != 0) return -1; info.fdateCreation = date_stamp; info.ftimeCreation = time_stamp; info.fdateLastAccess = date_stamp; info.ftimeLastAccess = time_stamp; info.fdateLastWrite = date_stamp; info.ftimeLastWrite = time_stamp; info.cbFile = 0; info.cbFileAlloc = 0; info.attrFile = 0; code = (int)DosSetFileInfo (handle, 1, (PBYTE)&info, sizeof (info)); (void)DosClose (handle); if (host == OS) { if (DosSetFileMode (name, attribute, 0L)) return -1; } return code; } #endif #ifdef UNIX #define SUBS_DEFINED #include #ifndef time_t #define time_t long #endif extern struct tm *localtime(); extern time_t time(); extern char *strcpy(); extern voidp *malloc(); FILE * file_open(name, mode) char *name; char *mode; { return fopen(name, mode); } int file_read(buf, size, nitems, stream) char *buf; int size; int nitems; FILE *stream; { return fread(buf, (int) size, (int) nitems, stream); } int file_seek(stream, offset, mode) FILE *stream; long offset; int mode; { return fseek(stream, offset, mode); } long file_tell(stream) FILE *stream; { return ftell(stream); } int file_write(buf, size, nitems, stream) char *buf; int size; int nitems; FILE *stream; { return fwrite(buf, (int) size, (int) nitems, stream); } voidp * xmalloc(size) int size; { return (voidp *)malloc((uint) size); } void case_path(name) char *name; { (char *) name; } void default_case_path(name) char *name; { strlower(name); } int file_exists(name) char *name; { FILE *fd; if ((fd = fopen(name, "rb")) == NULL) return 0; fclose(fd); return 1; } void get_mode_str(str, mode) char *str; uint mode; { strcpy(str, "---W"); if (mode & FA_ARCH) str[0] = 'A'; if (mode & FA_SYSTEM) str[1] = 'S'; if (mode & FA_HIDDEN) str[2] = 'H'; if (mode & FA_RDONLY) str[3] = 'R'; } long gettz() /* returns the offset from GMT in seconds */ { #define NOONOFFSET 43200L #define SEC_IN_DAY (24L * 60L * 60L) #define INV_VALUE (SEC_IN_DAY + 1L) static long retval = INV_VALUE; long now, noon; struct tm *noontm; if (retval != INV_VALUE) return retval; now = (long) time((long *) 0); /* Find local time for GMT noon today */ noon = now - now % SEC_IN_DAY + NOONOFFSET ; noontm = localtime(&noon); retval = NOONOFFSET - 60 * (60 * noontm->tm_hour - noontm->tm_min); return retval; } long mstonix(tstamp) ulong tstamp; { uint date, time; int year, month, day, hour, min, sec, daycount; long longtime; /* no. of days to beginning of month for each month */ static int dsboy[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; date = (uint) ((tstamp >> 16) & 0xffff); time = (uint) (tstamp & 0xffff); if (date == 0 && time == 0) return 0L; year = ((date >> 9) & 0x7f) + 1980; month = (date >> 5) & 0x0f; day = date & 0x1f; hour = (time >> 11) & 0x1f; min = (time >> 5) & 0x3f; sec = (time & 0x1f) * 2; daycount = 365 * (year - 1970) + /* days due to whole years */ (year - 1969) / 4 + /* days due to leap years */ dsboy[month-1] + /* days since beginning of this year */ day-1; /* days since beginning of month */ if (year % 4 == 0 && year % 400 != 0 && month >= 3) /* if this is a leap year and month */ daycount++; /* is March or later, add a day */ longtime = daycount * 24L * 60L * 60L + hour * 60L * 60L + min * 60 + sec; return longtime; } int set_ftime_mode(name, tstamp, attribute, host) char *name; ulong tstamp; uint attribute; uint host; { time_t m_time; struct utimbuf { time_t atime; /* New access time */ time_t mtime; /* New modification time */ } tb; (char *) name; (uint) attribute; (uint) host; m_time = mstonix(tstamp) + gettz(); tb.mtime = m_time; /* Set modification time */ tb.atime = m_time; /* Set access time */ /* set the time stamp on the file */ return utime(name, &tb); } #endif /* end of UNIX section */ #ifndef SUBS_DEFINED /* vanilla version for other compilers */ #ifdef MODERN #include #include #else /* !MODERN */ extern char *strcpy(); extern voidp *malloc(); #endif /* ?MODERN */ FILE * file_open(name, mode) char *name; char *mode; { return fopen(name, mode); } int file_read(buf, size, nitems, stream) char *buf; int size; int nitems; FILE *stream; { return fread(buf, (int) size, (int) nitems, stream); } int file_seek(stream, offset, mode) FILE *stream; long offset; int mode; { return fseek(stream, offset, mode); } long file_tell(stream) FILE *stream; { return ftell(stream); } int file_write(buf, size, nitems, stream) char *buf; int size; int nitems; FILE *stream; { return fwrite(buf, (int) size, (int) nitems, stream); } voidp * xmalloc(size) int size; { return (voidp *)malloc((uint) size); } void case_path(name) char *name; { (char *) name; } void default_case_path(name) char *name; { (char *) name; } int file_exists(name) char *name; { FILE *fd; if ((fd = fopen(name, "rb")) == NULL) return 0; fclose(fd); return 1; } void get_mode_str(str, mode) char *str; uint mode; { strcpy(str, "---W"); if (mode & FA_ARCH) str[0] = 'A'; if (mode & FA_SYSTEM) str[1] = 'S'; if (mode & FA_HIDDEN) str[2] = 'H'; if (mode & FA_RDONLY) str[3] = 'R'; } int set_ftime_mode(name, tstamp, attribute, host) char *name; ulong tstamp; uint attribute; uint host; { (char *) name; (ulong) tstamp; (uint) attribute; (uint) host; return 0; } #endif /* end of vanilla section */ /* end ENVIRON.C */ /* UNARJ.C, UNARJ, R JUNG, 10/05/92 * Main Extractor routine * Copyright (c) 1991 by Robert K Jung. All rights reserved. * * This code may be freely used in programs that are NOT ARJ archivers * (both compress and extract ARJ archives). * * If you wish to distribute a modified version of this program, you * MUST indicate that it is a modified version both in the program and * source code. * * If you modify this program, I would appreciate a copy of the new * source code. I am holding the copyright on the source code, so * please do not delete my name from the program files or from the * documentation. * * I wish to give credit to Haruhiko Okumura for providing the * basic ideas for ARJ and UNARJ in his program AR. Please note * that UNARJ is significantly different from AR from an archive * structural point of view. * * Modification history: * Date Programmer Description of modification. * 04/05/91 R. Jung Rewrote code. * 04/23/91 M. Adler Portabilized. * 04/29/91 R. Jung Added l command. Removed 16 bit dependency in * fillbuf(). * 05/19/91 R. Jung Fixed extended header skipping code. * 05/25/91 R. Jung Improved find_header(). * 06/03/91 R. Jung Changed arguments in get_mode_str() and * set_ftime_mode(). * 06/19/81 R. Jung Added two more %c in printf() in list_arc(). * 07/07/91 R. Jung Added default_case_path() to extract(). * Added strlower(). * 07/20/91 R. Jung Changed uint ratio() to static uint ratio(). * 07/21/91 R. Jung Added #ifdef VMS. * 08/28/91 R. Jung Changed M_DIFFHOST message. * 08/31/91 R. Jung Added changes to support MAC THINK_C compiler * per Eric Larson. * 10/07/91 R. Jung Added missing ; to THINK_C additions. * 11/11/91 R. Jung Added host_os test to fwrite_txt_crc(). * 11/24/91 R. Jung Added more error_count processing. * 12/03/91 R. Jung Added backup file processing. * 10/05/92 G. Zahn ST-Implementation * */ #include "unarj.h" #include #ifdef MODERN #include #include #include #else /* !MODERN */ extern void free(); extern void exit(); extern char *strcat(); extern char *strcpy(); extern char *strncpy(); extern char *strchr(); extern char *strrchr(); extern int strlen(); extern int strcmp(); #ifdef VMS #include #define EXIT_FAILURE SS$_ABORT #define EXIT_SUCCESS SS$_NORMAL #else #define EXIT_FAILURE (1) #define EXIT_SUCCESS (0) #endif #define toupper(c) ((c)>='a'&&(c)<='z'?(c)-('a'-'A'):(c)) #define tolower(c) ((c)>='A'&&(c)<='Z'?(c)+('a'-'A'):(c)) #endif /* ?MODERN */ #ifdef THINK_C #include #endif /* Global variables */ UCRC crc; FILE *arcfile; FILE *outfile; ushort bitbuf; long compsize; long origsize; uchar subbitbuf; uchar header[HEADERSIZE_MAX]; char arc_name[FNAME_MAX]; int command; int bitcount; int file_type; int no_output; int error_count; /* Messages */ static char *M_USAGE [] = { " Usage:\n", "UNARJ [v] archive[.arj] (list archive with pathnames)\n", "UNARJ l archive[.arj] (list archive with statistics)\n", "\n", "UNARJ e archive[.arj] (extract archive)\n", "UNARJ x archive[.arj] (extract with pathnames)\n", "UNARJ t archive[.arj] (test archive)\n", "\n", "This is an UNARJ program for ATARI ST/STE/TT-computers by Gero Zahn.\n", "You may freely use, copy and distribute this program, provided that no fee\n", "is charged for such use, copying or distribution, and it is distributed\n", "ONLY in its original unmodified state. UNARJ is provided as is without\n", "warranty of any kind, express or implied, including but not limited to\n", "the implied warranties of merchantability and fitness for a particular\n", "purpose. Refer to the manual for more information.\n", "\n", " UNARJ for PC: Robert K Jung, Internet: robjung@world.std.com\n", "ATARI-version: Gero Zahn, Internet: q92127@pbhrzx.uni-paderborn.de\n", NULL }; char M_VERSION [] = "UNARJ (ATARI-version) 2.30GZ (C)opyright 1991 Robert K Jung / 1992 Gero Zahn\n\n"; char M_ARCDATE [] = "Archive date : %s\n"; char M_BADCOMND[] = "Bad UNARJ command: %s"; char M_BADCOMNT[] = "Invalid comment header"; char M_BADHEADR[] = "Bad header"; char M_BADTABLE[] = "Bad Huffman code"; char M_CANTOPEN[] = "Can't open %s"; char M_CANTREAD[] = "Can't read file or unexpected end of file"; char M_CANTWRIT[] = "Can't write file. Disk full?"; char M_CRCERROR[] = "CRC error!\n"; char M_CRCOK [] = "CRC OK\n"; char M_DIFFHOST[] = " Binary file!"; char M_ENCRYPT [] = "File is password encrypted, "; char M_ERRORCNT[] = "%sFound %5d error(s)!"; char M_EXTRACT [] = "Extracting %-25s"; char M_FEXISTS [] = "%-25s exists, "; char M_HEADRCRC[] = "Header CRC error!"; char M_NBRFILES[] = "%5d file(s)\n"; char M_NOMEMORY[] = "Out of memory"; char M_NOTARJ [] = "%s is not an ARJ archive"; char M_PROCARC [] = "Processing archive: %s\n"; char M_SKIPPED [] = "Skipped %s\n"; char M_SUFFIX [] = ARJ_SUFFIX; char M_TESTING [] = "Testing %-25s"; char M_UNKNMETH[] = "Unsupported method: %d, "; char M_UNKNTYPE[] = "Unsupported file type: %d, "; char M_UNKNVERS[] = "Unsupported version: %d, "; #define get_crc() get_longword() #define fget_crc(f) fget_longword(f) #define setup_get(PTR) (get_ptr = (PTR)) #define get_byte() ((uchar)(*get_ptr++ & 0xff)) #define BUFFERSIZE 4096 #define ASCII_MASK 0x7F #define CRCPOLY 0xEDB88320L #define UPDATE_CRC(r,c) r=crctable[((uchar)(r)^(uchar)(c))&0xff]^(r>>CHAR_BIT) /* Local functions */ #ifdef MODERN static void make_crctable(void); static void crc_buf(char *str, int len); static void strparity(uchar *p); static FILE *fopen_msg(char *name, char *mode); static int fget_byte(FILE *f); static uint fget_word(FILE *f); static ulong fget_longword(FILE *f); static void fread_crc(uchar *p, int n, FILE *f); static void decode_path(char *name); static void get_date_str(char *str, ulong tstamp); static int parse_path(char *pathname, char *path, char *entry); static void strncopy(char *to, char *from, int len); static uint get_word(void); static ulong get_longword(void); static long find_header(FILE *fd); static int read_header(int first, FILE *fd, char *name); static void skip(void); static void unstore(void); static int check_flags(void); static int extract(void); static int test(void); static uint ratio(long a, long b); static void list_start(void); static void list_arc(int count); static void verb_start(void); static void verb_arc(int count); static void execute_cmd(void); static void help(void); #endif /* MODERN */ /* Local variables */ static char filename[FNAME_MAX]; static char comment[COMMENT_MAX]; static char *hdr_filename; static char *hdr_comment; static ushort headersize; static uchar first_hdr_size; static uchar arj_nbr; static uchar arj_x_nbr; static uchar host_os; static uchar arj_flags; static short method; static uint file_mode; static ulong time_stamp; static short entry_pos; static ushort host_data; static uchar *get_ptr; static UCRC file_crc; static UCRC header_crc; static long first_hdr_pos; static long torigsize; static long tcompsize; static int clock_inx; static char *writemode[2] = { "wb", "w" }; static UCRC crctable[UCHAR_MAX + 1]; /* Functions */ static void make_crctable() { uint i, j; UCRC r; for (i = 0; i <= UCHAR_MAX; i++) { r = i; for (j = CHAR_BIT; j > 0; j--) { if (r & 1) r = (r >> 1) ^ CRCPOLY; else r >>= 1; } crctable[i] = r; } } static void crc_buf(str, len) char *str; int len; { while (len--) UPDATE_CRC(crc, *str++); } void disp_clock() { static char clock_str[4] = { '|', '/', '-', '\\' }; printf("(%c)\b\b\b", clock_str[clock_inx]); clock_inx = (clock_inx + 1) & 0x03; } void error(fmt, arg) char *fmt; char *arg; { putc('\n', stdout); printf(fmt, arg, error_count); putc('\n', stdout); exit(EXIT_FAILURE); } static void strparity(p) uchar *p; { while (*p) { FIX_PARITY(*p); p++; } } static FILE * fopen_msg(name, mode) char *name; char *mode; { FILE *fd; fd = file_open(name, mode); if (fd == NULL) error(M_CANTOPEN, name); return fd; } static int fget_byte(f) FILE *f; { int c; if ((c = getc(f)) == EOF) error(M_CANTREAD, ""); return c & 0xFF; } static uint fget_word(f) FILE *f; { uint b0, b1; b0 = fget_byte(f); b1 = fget_byte(f); return (b1 << 8) + b0; } static ulong fget_longword(f) FILE *f; { ulong b0, b1, b2, b3; b0 = fget_byte(f); b1 = fget_byte(f); b2 = fget_byte(f); b3 = fget_byte(f); return (b3 << 24) + (b2 << 16) + (b1 << 8) + b0; } static void fread_crc(p, n, f) uchar *p; int n; FILE *f; { n = file_read((char *)p, 1, n, f); origsize += n; crc_buf((char *)p, n); } void fwrite_txt_crc(p, n) uchar *p; int n; { uchar c; crc_buf((char *)p, n); if (no_output) return; if (file_type == TEXT_TYPE) { while (n--) { c = *p++; if (host_os != OS) { FIX_PARITY(c); } if (putc((int) c, outfile) == EOF) error(M_CANTWRIT, ""); } } else { if (file_write((char *)p, 1, n, outfile) != n) error(M_CANTWRIT, ""); } } void init_getbits() { bitbuf = 0; subbitbuf = 0; bitcount = 0; fillbuf(2 * CHAR_BIT); } void fillbuf(n) /* Shift bitbuf n bits left, read n bits */ int n; { bitbuf = (bitbuf << n) & 0xFFFF; /* lose the first n bits */ while (n > bitcount) { bitbuf |= subbitbuf << (n -= bitcount); if (compsize != 0) { compsize--; subbitbuf = (uchar) getc(arcfile); } else subbitbuf = 0; bitcount = CHAR_BIT; } bitbuf |= subbitbuf >> (bitcount -= n); } ushort getbits(n) int n; { ushort x; x = bitbuf >> (2 * CHAR_BIT - n); fillbuf(n); return x; } static void decode_path(name) char *name; { for ( ; *name; name++) { if (*name == ARJ_PATH_CHAR) *name = PATH_CHAR; } } static void get_date_str(str, tstamp) char *str; ulong tstamp; { sprintf(str, "%04u-%02u-%02u %02u:%02u:%02u", ts_year(tstamp), ts_month(tstamp), ts_day(tstamp), ts_hour(tstamp), ts_min(tstamp), ts_sec(tstamp)); } static int parse_path(pathname, path, entry) char *pathname; char *path; char *entry; { char *cptr, *ptr, *fptr; short pos; fptr = NULL; for (cptr = PATH_SEPARATORS; *cptr; cptr++) { if ((ptr = strrchr(pathname, *cptr)) != NULL && (fptr == NULL || ptr > fptr)) fptr = ptr; } if (fptr == NULL) pos = 0; else pos = fptr + 1 - pathname; if (path != NULL) { strncpy(path, pathname, pos); path[pos] = NULL_CHAR; } if (entry != NULL) strcpy(entry, &pathname[pos]); return pos; } static void strncopy(to, from, len) char *to; char *from; int len; { int i; for (i = 1; i < len && *from; i++) *to++ = *from++; *to = NULL_CHAR; } void strlower(s) char *s; { while (*s) { *s = (char) tolower(*s); s++; } } void strupper(s) char *s; { while (*s) { *s = (char) toupper(*s); s++; } } voidp * malloc_msg(size) int size; { char *p; if ((p = (char *)xmalloc(size)) == NULL) error(M_NOMEMORY, ""); return (voidp *)p; } static uint get_word() { uint b0, b1; b0 = get_byte(); b1 = get_byte(); return (b1 << 8) + b0; } static ulong get_longword() { ulong b0, b1, b2, b3; b0 = get_byte(); b1 = get_byte(); b2 = get_byte(); b3 = get_byte(); return (b3 << 24) + (b2 << 16) + (b1 << 8) + b0; } static long find_header(fd) FILE *fd; { long arcpos, lastpos; int c; arcpos = file_tell(fd); file_seek(fd, 0L, SEEK_END); lastpos = file_tell(fd) - 2; if (lastpos > MAXSFX) lastpos = MAXSFX; for ( ; arcpos < lastpos; arcpos++) { file_seek(fd, arcpos, SEEK_SET); c = fget_byte(fd); while (arcpos < lastpos) { if (c != HEADER_ID_LO) /* low order first */ c = fget_byte(fd); else if ((c = fget_byte(fd)) == HEADER_ID_HI) break; arcpos++; } if (arcpos >= lastpos) break; if ((headersize = fget_word(fd)) <= HEADERSIZE_MAX) { crc = CRC_MASK; fread_crc(header, (int) headersize, fd); if ((crc ^ CRC_MASK) == fget_crc(fd)) { file_seek(fd, arcpos, SEEK_SET); return arcpos; } } } return -1; /* could not find a valid header */ } static int read_header(first, fd, name) int first; FILE *fd; char *name; { ushort extheadersize, header_id; header_id = fget_word(fd); if (header_id != HEADER_ID) { if (first) error(M_NOTARJ, name); else error(M_BADHEADR, ""); } headersize = fget_word(fd); if (headersize == 0) return 0; /* end of archive */ if (headersize > HEADERSIZE_MAX) error(M_BADHEADR, ""); crc = CRC_MASK; fread_crc(header, (int) headersize, fd); header_crc = fget_crc(fd); if ((crc ^ CRC_MASK) != header_crc) error(M_HEADRCRC, ""); setup_get(header); first_hdr_size = get_byte(); arj_nbr = get_byte(); arj_x_nbr = get_byte(); host_os = get_byte(); arj_flags = get_byte(); method = get_byte(); file_type = get_byte(); (void)get_byte(); time_stamp = get_longword(); compsize = get_longword(); origsize = get_longword(); file_crc = get_crc(); entry_pos = get_word(); file_mode = get_word(); host_data = get_word(); hdr_filename = (char *)&header[first_hdr_size]; strncopy(filename, hdr_filename, sizeof(filename)); if (host_os != OS) strparity((uchar *)filename); if ((arj_flags & PATHSYM_FLAG) != 0) decode_path(filename); hdr_comment = (char *)&header[first_hdr_size + strlen(hdr_filename) + 1]; strncopy(comment, hdr_comment, sizeof(comment)); if (host_os != OS) strparity((uchar *)comment); /* if extheadersize == 0 then no CRC */ /* otherwise read extheader data and read 4 bytes for CRC */ while ((extheadersize = fget_word(fd)) != 0) file_seek(fd, (long) (extheadersize + 4), SEEK_CUR); return 1; /* success */ } static void skip() { file_seek(arcfile, compsize, SEEK_CUR); } static void unstore() { int n; long pos; char *buffer; buffer = (char *)malloc_msg(BUFFERSIZE); pos = file_tell(arcfile); disp_clock(); n = (int)(BUFFERSIZE - (pos % BUFFERSIZE)); n = compsize > (long)n ? n : (int)compsize; while (compsize > 0) { if (file_read(buffer, 1, n, arcfile) != n) error(M_CANTREAD, ""); disp_clock(); compsize -= n; fwrite_txt_crc((uchar *)buffer, n); n = compsize > BUFFERSIZE ? BUFFERSIZE : (int)compsize; } free(buffer); } static int check_flags() { if (arj_x_nbr > ARJ_X_VERSION) { printf(M_UNKNVERS, arj_x_nbr); printf(M_SKIPPED, filename); skip(); return -1; } if ((arj_flags & GARBLE_FLAG) != 0) { printf(M_ENCRYPT); printf(M_SKIPPED, filename); skip(); return -1; } if (method < 0 || method > MAXMETHOD || (method == 4 && arj_nbr == 1)) { printf(M_UNKNMETH, method); printf(M_SKIPPED, filename); skip(); return -1; } if (file_type != BINARY_TYPE && file_type != TEXT_TYPE) { printf(M_UNKNTYPE, file_type); printf(M_SKIPPED, filename); skip(); return -1; } return 0; } void create_branch(p) char *p; { char pa[FNAME_MAX]; void create_branch(char *p); if (strlen(p)!=0) { parse_path(p,pa,(char *)NULL); pa[strlen(pa)-1]=0; create_branch(pa); Dcreate(p); } } static int extract() { char name[FNAME_MAX]; char path[FNAME_MAX]; if (check_flags()) { error_count++; return 0; } no_output = 0; if (command == 'E') { strcpy(name, &filename[entry_pos]); strcpy(path, ""); } else { strcpy(name, filename); if (entry_pos!=0) strncpy(path,filename,entry_pos-1); else strcpy(path,""); } if (host_os != OS) default_case_path(name); if (file_exists(name)) { printf(M_FEXISTS, name); printf(M_SKIPPED, name); skip(); error_count++; return 0; } if (path!=NULL) create_branch(path); outfile = file_open(name, writemode[file_type & 1]); if (outfile == NULL) { printf(M_CANTOPEN, name); putchar('\n'); skip(); error_count++; return 0; } printf(M_EXTRACT, name); if (host_os != OS && file_type == BINARY_TYPE) printf(M_DIFFHOST); printf(" "); crc = CRC_MASK; if (method == 0) unstore(); else if (method == 1 || method == 2 || method == 3) decode(); else if (method == 4) decode_f(); fclose(outfile); set_ftime_mode(name, time_stamp, file_mode, (uint) host_os); if ((crc ^ CRC_MASK) == file_crc) printf(M_CRCOK); else { printf(M_CRCERROR); error_count++; } return 1; } static int test() { if (check_flags()) return 0; no_output = 1; printf(M_TESTING, filename); printf(" "); crc = CRC_MASK; if (method == 0) unstore(); else if (method == 1 || method == 2 || method == 3) decode(); else if (method == 4) decode_f(); if ((crc ^ CRC_MASK) == file_crc) printf(M_CRCOK); else { printf(M_CRCERROR); error_count++; } return 1; } static uint ratio(a, b) long a, b; { int i; for (i = 0; i < 3; i++) if (a <= LONG_MAX / 10) a *= 10; else b /= 10; if ((long) (a + (b >> 1)) < a) { a >>= 1; b >>= 1; } if (b == 0) return 0; return (uint) ((a + (b >> 1)) / b); } static void list_start() { printf("Filename Original Compressed Ratio DateTime modified CRC-32 AttrBTPMGVX\n"); printf("------------ ---------- ---------- ----- ----------------- -------- -----------\n"); } static void list_arc(count) int count; { uint r; int garble_mode, path_mode, volume_mode, extfil_mode, ftype, bckf_mode; char date_str[20], fmode_str[10]; static char mode[5] = { 'B', 'T', '?', 'D', 'V' }; static char pthf[2] = { ' ', '+' }; static char pwdf[2] = { ' ', 'G' }; /* plain, encrypted */ static char volf[2] = { ' ', 'V' }; static char extf[2] = { ' ', 'X' }; static char bckf[2] = { ' ', '*' }; if (count == 0) list_start(); garble_mode = ((arj_flags & GARBLE_FLAG) != 0); volume_mode = ((arj_flags & VOLUME_FLAG) != 0); extfil_mode = ((arj_flags & EXTFILE_FLAG) != 0); bckf_mode = ((arj_flags & BACKUP_FLAG) != 0); path_mode = (entry_pos > 0); r = ratio(compsize, origsize); torigsize += origsize; tcompsize += compsize; ftype = file_type; if (ftype != BINARY_TYPE && ftype != TEXT_TYPE && ftype != DIR_TYPE && ftype != LABEL_TYPE) ftype = 3; get_date_str(date_str, time_stamp); strcpy(fmode_str, " "); if (host_os == OS) get_mode_str(fmode_str, (uint) file_mode); if (strlen(&filename[entry_pos]) > 12) printf("%-12s\n ", &filename[entry_pos]); else printf("%-12s ", &filename[entry_pos]); printf("%10ld %10ld %u.%03u %s %08lX %4s%c%c%c%u%c%c%c\n", origsize, compsize, r / 1000, r % 1000, &date_str[2], file_crc, fmode_str, bckf[bckf_mode], mode[ftype], pthf[path_mode], method, pwdf[garble_mode], volf[volume_mode], extf[extfil_mode]); } static void verb_start() { printf("Ratio Filename\n"); printf("----- --------------------------------------------------\n"); } static void verb_arc(count) int count; { uint r; if (count == 0) verb_start(); r = ratio(compsize, origsize); printf("%u.%03u %s\n",r/1000,r%1000,filename); } static void execute_cmd() { int file_count; char date_str[22]; uint r; first_hdr_pos = 0; time_stamp = 0; first_hdr_size = FIRST_HDR_SIZE; arcfile = fopen_msg(arc_name, "rb"); printf(M_PROCARC, arc_name); first_hdr_pos = find_header(arcfile); if (first_hdr_pos < 0) error(M_NOTARJ, arc_name); file_seek(arcfile, first_hdr_pos, SEEK_SET); if (!read_header(1, arcfile, arc_name)) error(M_BADCOMNT, ""); get_date_str(date_str, time_stamp); printf(M_ARCDATE, date_str); file_count = 0; while (read_header(0, arcfile, arc_name)) { switch (command) { case 'E': case 'X': if (extract()) file_count++; break; case 'L': list_arc(file_count++); skip(); break; case 'V': verb_arc(file_count++); skip(); break; case 'T': if (test()) file_count++; break; } } if (command == 'L' || command=='V') { printf("------------ ---------- ---------- ----- -----------------\n"); r = ratio(tcompsize, torigsize); printf(" %5d files %10ld %10ld %u.%03u %s\n", file_count, torigsize, tcompsize, r / 1000, r % 1000, &date_str[2]); } else printf(M_NBRFILES, file_count); fclose(arcfile); } static void help() { int i; for (i = 0; M_USAGE[i] != NULL; i++) printf(M_USAGE[i]); } int main(argc, argv) int argc; char *argv[]; { int i, j, lastc; char *arc_p; #ifdef THINK_C argc = ccommand(&argv); #endif printf(M_VERSION); if (argc == 1) { help(); return EXIT_SUCCESS; } else if (argc == 2) { command = 'V'; arc_p = argv[1]; } else if (argc == 3) { if (strlen(argv[1]) > 1) error(M_BADCOMND, argv[1]); command = toupper(*argv[1]); if (strchr("ELVTX", command) == NULL) error(M_BADCOMND, argv[1]); arc_p = argv[2]; } else { help(); return EXIT_FAILURE; } strncopy(arc_name, arc_p, FNAME_MAX); case_path(arc_name); i = strlen(arc_name); j = parse_path(arc_name, (char *)NULL, (char *)NULL); lastc = arc_name[i - 1]; if (lastc == ARJ_DOT) arc_name[i - 1] = NULL_CHAR; else if (strchr(&arc_name[j], ARJ_DOT) == NULL) strcat(arc_name, M_SUFFIX); make_crctable(); error_count = 0; clock_inx = 0; arcfile = NULL; outfile = NULL; execute_cmd(); if (error_count > 0) error(M_ERRORCNT, ""); return EXIT_SUCCESS; } /* end UNARJ.C */ /* UNARJ.H, UNARJ, R JUNG, 10/05/1992 * Include file * Copyright (c) 1990 by Robert K Jung. All rights reserved. * * This code may be freely used in programs that are NOT ARJ archivers * (both compress and extract ARJ archives). * * If you wish to distribute a modified version of this program, you * MUST indicate that it is a modified version both in the program and * source code. * * If you modify this program, I would appreciate a copy of the new * source code. I am holding the copyright on the source code, so * please do not delete my name from the program files or from the * documentation. * * Modification history: * Date Programmer Description of modification. * 04/05/91 R. Jung Rewrote code. * 04/23/91 M. Adler Portabilized. * 04/29/91 R. Jung Added volume label support. * 05/30/91 R. Jung Added SEEK_END definition. * 06/03/91 R. Jung Changed arguments in get_mode_str() and * set_ftime_mode(). * 06/28/91 R. Jung Added new HOST OS numbers. * 07/08/91 R. Jung Added default_case_path() and strlower(). * 07/21/91 R. Jung Fixed #endif _QC comment. * 08/27/91 R. Jung Added #ifdef for COHERENT. * 09/01/91 R. Jung Added new host names. * 12/03/91 R. Jung Added BACKUP_FLAG. * 10/05/92 G. Zahn ST-Modificatio * */ #ifndef _ARH_DEF_ #define _ARH_DEF_ /* Use prototypes and ANSI libraries if __STDC__ */ #ifdef __STDC__ # define MODERN #endif /* __STDC__ */ /* Do not use prototypes for COHERENT */ #ifdef COHERENT # undef MODERN # define KEEP_WINDOW #endif /* COHERENT */ /* Use prototypes and ANSI libraries if __TURBOC__ */ #ifdef __TURBOC__ # define MODERN #endif /* __TURBOC__ */ /* Use prototypes and ANSI libraries if _QC */ #ifdef _QC # define MODERN #endif /* _QC */ /* Use prototypes and ANSI libraries if _OS2 */ #ifdef _OS2 # define MODERN #endif /* _OS2 */ /* Used to remove arguments in function prototypes for non-ANSI C */ #ifdef MODERN # define OF(a) a #else /* !MODERN */ # define OF(a) () #endif /* ?MODERN */ #ifdef MODERN typedef void voidp; #else /* !MODERN */ # define void int typedef char voidp; #endif /* ?MODERN */ #include #ifdef MODERN # include #else /* !MODERN */ # ifndef UCHAR_MAX # define UCHAR_MAX (255) # endif # ifndef CHAR_BIT # define CHAR_BIT (8) # endif # ifndef LONG_MAX # define LONG_MAX (0x7FFFFFFFL) # endif #endif /* ?MODERN */ #ifndef SEEK_SET # define SEEK_SET 0 #endif #ifndef SEEK_CUR # define SEEK_CUR 1 #endif #ifndef SEEK_END # define SEEK_END 2 #endif typedef unsigned char uchar; /* 8 bits or more */ typedef unsigned int uint; /* 16 - 32 bits or more */ typedef unsigned short ushort; /* 16 bits or more */ typedef unsigned long ulong; /* 32 bits or more */ #define USHRT_BIT (CHAR_BIT * sizeof(ushort)) /* ********************************************************* */ /* Environment definitions (implementation dependent) */ /* ********************************************************* */ #ifdef _QC #define __MSDOS__ #endif #ifdef __MSDOS__ #define OS 0 #define PATH_SEPARATORS "\\:" #define PATH_CHAR '\\' #define MAXSFX 25000L #define ARJ_SUFFIX ".ARJ" #endif #ifdef _OS2 #define OS 0 /* ??? */ #define PATH_SEPARATORS "\\:" #define PATH_CHAR '\\' #define SWITCH_CHARS "-/" #define MAXSFX 25000L #define ARJ_SUFFIX ".ARJ" #endif #ifdef __CI #define PRIME 1 #define OS 1 #define PATH_SEPARATORS ">" #define PATH_CHAR '>' #define FIX_PARITY(c) c |= ~ASCII_MASK #define DEFAULT_DIR "*>" #define ARJ_SUFFIX ".ARJ" #endif /* Error levels */ #ifndef ERROR_DEFINES #define ERROR_OK 0 /* success */ #define ERROR_WARN 1 /* minor problem (file not found) */ #define ERROR_FAIL 2 /* fatal error */ #define ERROR_CRC 3 /* CRC error */ #define ERROR_SECURE 4 /* ARJ security invalid or not found */ #define ERROR_WRITE 5 /* disk full */ #define ERROR_OPEN 6 /* can't open file */ #define ERROR_USER 7 /* user specified bad parameters */ #define ERROR_MEMORY 8 /* not enough memory */ #endif #ifndef MAXSFX /* size of self-extracting prefix */ #define MAXSFX 500000L #endif #ifndef FNAME_MAX #define FNAME_MAX 512 #endif #ifndef SWITCH_CHARS #define SWITCH_CHARS "-" #endif #ifndef FIX_PARITY #define FIX_PARITY(c) c &= ASCII_MASK #endif #ifndef ARJ_SUFFIX #define ARJ_SUFFIX ".ARJ" #endif #ifndef ARJ_DOT #define ARJ_DOT '.' #endif #ifndef DEFAULT_DIR #define DEFAULT_DIR "" #endif #ifndef OS #define OS 2 #endif #ifndef PATH_SEPARATORS #define PATH_SEPARATORS "\\:" #endif #ifndef PATH_CHAR #define PATH_CHAR '\\' #endif /* ********************************************************* */ /* end of environmental defines */ /* ********************************************************* */ /* ********************************************************* */ /* * Structure of archive block (low order byte first): * * 2 header id (comment and local file) = 0xEA60 or 60000U * 2 basic header size (from 'first_hdr_size' thru 'comment' below) * = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1 * = 0 if end of archive * * 1 first_hdr_size (size up to 'extra data') * 1 archiver version number * 1 minimum archiver version to extract * 1 host OS (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MAC-OS) * (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT) * (9 = VAX VMS) * 1 arj flags (0x01 = GARBLED_FLAG, 0x02 = RESERVED) * (0x04 = VOLUME_FLAG, 0x08 = EXTFILE_FLAG) * (0x10 = PATHSYM_FLAG, 0x20 = BACKUP_FLAG) * 1 method (0 = stored, 1 = compressed most ... 4 compressed fastest) * 1 file type (0 = binary, 1 = text, 2 = comment header) * (3 = directory, 4 = volume label) * 1 reserved * 4 date time stamp modified * 4 compressed size * 4 original size * 4 original file's CRC * 2 entryname position in filename * 2 file access mode * 2 host data * ? extra data * 4 bytes for extended file position * * ? filename (null-terminated) * ? comment (null-terminated) * * 4 basic header CRC * * 2 1st extended header size (0 if none) * ? 1st extended header * 4 1st extended header's CRC (not present if 0 extended header size) * ... * ? compressed file * * ********************************************************* */ /* ********************************************************* */ /* */ /* Time stamp format: */ /* */ /* 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 */ /* |<---- year-1980 --->|<- month ->|<--- day ---->| */ /* */ /* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 */ /* |<--- hour --->|<---- minute --->|<- second/2 ->| */ /* */ /* ********************************************************* */ #define CODE_BIT 16 #define NULL_CHAR '\0' #define MAXMETHOD 4 #define ARJ_VERSION 3 #define ARJ_X_VERSION 3 /* decoder version */ #define ARJ_X1_VERSION 1 #define DEFAULT_METHOD 1 #define DEFAULT_TYPE 0 /* if type_sw is selected */ #define HEADER_ID 0xEA60 #define HEADER_ID_HI 0xEA #define HEADER_ID_LO 0x60 #define FIRST_HDR_SIZE 30 #define FIRST_HDR_SIZE_V 34 #define COMMENT_MAX 2048 #define HEADERSIZE_MAX (FIRST_HDR_SIZE + 10 + FNAME_MAX + COMMENT_MAX) #define BINARY_TYPE 0 /* This must line up with binary/text strings */ #define TEXT_TYPE 1 #define COMMENT_TYPE 2 #define DIR_TYPE 3 #define LABEL_TYPE 4 #define GARBLE_FLAG 0x01 #define VOLUME_FLAG 0x04 #define EXTFILE_FLAG 0x08 #define PATHSYM_FLAG 0x10 #define BACKUP_FLAG 0x20 typedef ulong UCRC; /* CRC-32 */ #define CRC_MASK 0xFFFFFFFFL #define ARJ_PATH_CHAR '/' #define FA_RDONLY 0x01 /* Read only attribute */ #define FA_HIDDEN 0x02 /* Hidden file */ #define FA_SYSTEM 0x04 /* System file */ #define FA_LABEL 0x08 /* Volume label */ #define FA_DIREC 0x10 /* Directory */ #define FA_ARCH 0x20 /* Archive */ #define HOST_OS_NAMES1 "MS-DOS","PRIMOS","UNIX","AMIGA","MAC-OS","OS/2" #define HOST_OS_NAMES2 "APPLE GS","ATARI ST","NEXT","VAX VMS" #define HOST_OS_NAMES { HOST_OS_NAMES1, HOST_OS_NAMES2, NULL } /* Timestamp macros */ #define get_tx(m,d,h,n) (((ulong)m<<21)+((ulong)d<<16)+((ulong)h<<11)+(n<<5)) #define get_tstamp(y,m,d,h,n,s) ((((ulong)(y-1980))<<25)+get_tx(m,d,h,n)+(s/2)) #define ts_year(ts) ((uint)((ts >> 25) & 0x7f) + 1980) #define ts_month(ts) ((uint)(ts >> 21) & 0x0f) /* 1..12 means Jan..Dec */ #define ts_day(ts) ((uint)(ts >> 16) & 0x1f) /* 1..31 means 1st..31st */ #define ts_hour(ts) ((uint)(ts >> 11) & 0x1f) #define ts_min(ts) ((uint)(ts >> 5) & 0x3f) #define ts_sec(ts) ((uint)((ts & 0x1f) * 2)) /* unarj.c */ extern long origsize; extern long compsize; extern UCRC crc; extern FILE *arcfile; extern FILE *outfile; extern ushort bitbuf; extern uchar subbitbuf; extern uchar header[HEADERSIZE_MAX]; extern char arc_name[FNAME_MAX]; extern int bitcount; extern int file_type; extern int error_count; /* Global functions */ /* unarj.c */ void strlower OF((char *str)); void strupper OF((char *str)); voidp *malloc_msg OF((int size)); void disp_clock OF((void)); void error OF((char *fmt, char *arg)); void fillbuf OF((int n)); ushort getbits OF((int n)); void fwrite_txt_crc OF((uchar *p, int n)); void init_getbits OF((void)); /* environ.c */ FILE *file_open OF((char *name, char *mode)); int file_read OF((char *buf, int size, int nitems, FILE *stream)); int file_seek OF((FILE *stream, long offset, int mode)); long file_tell OF((FILE *stream)); int file_write OF((char *buf, int size, int nitems, FILE *stream)); voidp *xmalloc OF((int size)); void case_path OF((char *name)); void default_case_path OF((char *name)); int file_exists OF((char *name)); void get_mode_str OF((char *str, uint fmode)); int set_ftime_mode OF((char *name, ulong timestamp, uint fmode, uint host)); /* decode.c */ void decode OF((void)); void decode_f OF((void)); /* Message strings */ extern char M_VERSION []; extern char M_ARCDATE []; extern char M_BADCOMND[]; extern char M_BADCOMNT[]; extern char M_BADHEADR[]; extern char M_BADTABLE[]; extern char M_CANTOPEN[]; extern char M_CANTREAD[]; extern char M_CANTWRIT[]; extern char M_CRCERROR[]; extern char M_CRCOK []; extern char M_DIFFHOST[]; extern char M_ENCRYPT []; extern char M_ERRORCNT[]; extern char M_EXTRACT []; extern char M_FEXISTS []; extern char M_HEADRCRC[]; extern char M_NBRFILES[]; extern char M_NOMEMORY[]; extern char M_NOTARJ []; extern char M_PROCARC []; extern char M_SKIPPED []; extern char M_SUFFIX []; extern char M_TESTING []; extern char M_UNKNMETH[]; extern char M_UNKNTYPE[]; extern char M_UNKNVERS[]; #endif /* end UNARJ.H */ ;>>>>>>> UNARJ.PRJ <<<<<<<< UNARJ.TTP .C[-J,-P] .L[-V] = TCSTART.O UNARJ.C DECODE.C ENVIRON.C TCSTDLIB.LIB TCEXTLIB.LIB TCTOSLIB.LIB `56 qj``>J >>> TURBO-C <<<< for ATARI-ST Version 2.0 (C)88-90 Borland International &H f&op`B@#><3>@ k #>F Ј<.@#>BJy>@g<"@(I$k,"Jf"JfB// ?<?<JNAO A6<HCBB`6 !jBJ)gHiRC` "fSI "WJAkHiRCBSQJ)gHiRCHy`$ON0 J"LN? 958g @N 95b`"")BB|JE$2 "2S@JAf$_6Nu09TA70H?A;eNTOpyT|3TNuH8(H&IE= Jp N$?9J/ LN\O Jp N$pN^LNu`RHfNu/ / $H&INb&H f "JA6t K0Nd&_6NuH0$H6NR09Jg`nG6t yJf<`0 9Tg< y>jB@N$R@f C7 KNx0SCJ@f`""y>j2p JN@g C7 KNLL NuBy>nB9>xByJpNNu?/ 6EJ2*i|5A`2RB@*2hj *gS jN#@`B*4RnʗRB@*2`j$_6Nu??689>nrlN086Nu` /f\RHfNu/&rCA?|??$r |? t|?"p|?$r||?C;mNO &NuH>(H,IG;`H LN,*H g gd$MRKf fBC`A& g0H"L NN-8B60 /g C0 @N,0L|Nur`RAAofBNu/ $H`HN1RJf$_Nu/ N$H fC7A7&Nr J$_Nu yTRT<BA0 yTRT<BB24J@0NuHAT"PR<r "PR<t""PR<v$"PR<x&(z*|؅*؅؀ LxNuH0$HN~&r JpNv JN~(U o(< GT`BA  JNv JN:`"|`g JN:` JN:|f`Rnڸn`P JN6| (b:'|"J0AN0p"+鮳/ JN"fBA  JNv ` RnppL 8NuH<6$H(ING6 |`gJCg "LAN` C7 KNKT JNP;@J@fB@` m (c C7 KN+|I"J0- LN~ JN0+@r$-隵gC7ANR* LR<@ UR<@ UR<@ UR<@ UR<@ UR<BA;A UR<BA;ARN+@N+@N+@N+@NV;@NN;@NF;@BA-A+H0<"HAN -gANp-gAN mN-BA-AA+H0<"HAN -gANz`rpCH JNv JN6fpL<Nur 9>p y>fNvNuH00<Nd$HG>p kN~&N0<? "<N42@6H o4`4+6`H"k2p JNj@gC7A6JNNN0H J0N o6<`6+ n JN/L Nu/ / EJG7e * c.B@* ?AWNTOHyJ KNXONp`p* g$AONHyJ KNXONp`x0* mY@n j f0 * f(?* A"NTOHyJ KNXONp`40*g,S@g(?*A;NTOHyJ KNXON^p`B@&_$_Nu/ O$HN-Jg(BC JNXOAN-B7AN JN5O$_NuH4OEJNJ@g RjB@`BjG jEf 0* C KN,C7AN,`2"J KN,0* gpj H"JAN-8`C7AN, * g KNK6 KNJ@g,Ho MNXOHoAmNXONJRjB@`A gNpjHA"p KNb%H f,HoADNXOA=p N$NRjB@`HoANXO * g0*f ANA;N%|0* fN`. j g j g j fN` j fNL jN&BB* 2*  *  KNp"*󶳀 f AN`ANRjpOL,Nu/ / NJ@gB@`GT7|E7vHyJ JNXOA;N'|0fN`& Sg Sg SfN` SfNLp"+馳f A'N`ANRkp&_$_NuH(*BC`" n ЄЀ(` r N4*RC|m ЄoJfB@` Є"N4L8NuA;NA;NNuH,OJ@fNIJp, gr`BA?A p, gt`BB?Bp, gz`BEp , g|`BF0, o~`BG", ,N6",Ӭ ,",Ӭ 08,JDg|g|g|gx , A NE7CAAN, , f 0, AN0, AN-r d0, HtAFNXO`0, HtAZNXOK75PH?2/ 5H?0o$5H??, 5pH?5@H?5`H?Ho/, Ho"r2HA?t4?/,/,AaNO&O"L4NuAt 9>pN6HyJr2HA?t4?ABD`p0BF20f`<F23`<>Gpp?F@m63p` |<܆9hRCoe`h</n~>އCx6E`J<fBG<FKX;`K`;`2RB<Wg>GK`"M`<FKX"MASCJCf2<F7`RDonm@OpL6>0N8EjJDf40N:BF`B2`RFFnBF`0@A 1RF|m`|BF`X:9>np m|f0<`HRE2y>nf|lp`pEN`RFWfpN:`B2`RFSElFn`B2`RFFnC r J0NLTOLNuH p N6EhJCf6p N8BE`B2PRE|mBE`0@A1RE|m`BE`09>nH@A"80|m00<29>n@g4BA 80 ` 2AA80H|lAB@0@N|n8JDfx`"|fpN8VD`p N8|`B2PRESDl` <PREEnZ`B2PRE|mCr J0<N*L8Nu?/ E0f"pN4trpNNtrpNSR09>nH@A60|e.p29>n@g4BA60 ` 2AA60H|dAB@00N0$_6Nu?/ E09>nH@62|e00<29>n@g4BA60 ` 2AA60H|dAB@00NJCgSC0NriA60$_6NuByNNuH E=H0tmPJDg 0 RNt RN/LxNuH BC8<z EX`D0n29>n*ijpRN40*|g|`BFSRJFf` DDRE| mJEg8Ro09>n*hjpRN4<*pn2*i5ARC0LxNuH BCx:EX`D0n29>n*ijpRN40*|g|`BFSRJFf` DDRE|mJEg8Ro09>n*hjpRN4<*pn2*i5ARC0LxNuH0E=H0n+ikpSN6:+M0+H7@QS R@RRD|hmBDN 0tm@JDg 0 RNt RN/L xNuN$NuHHN#NuN$.NuN#NuHHN"8NuHN.NuNNuNNu/ C=NN$&H fB@` KN&p&_Nu?/ $H6C=QN,p CgApCg|SpCg|HpCg|R$_6NuH0YO$H.:8C=VN$&H fp`6A0+N46 KN&|f|'2p JN5$R@fp`0XOL 8NuA(p"@ "By=nA1B3=n3=pO"Nu/ Hz?<&NN\O$_Nu/YOM,C HzaZXOXO,_NuH@B@H@C=raNJ@kNu.Vp`/YOM, IC HzaXO VBXO,_Nu"VS@eQ,NuH8]O$H&I(o&BCx%p JR@g2fJ@g@HNBEg>BA< <b;k`|<*f<`&<0< b ACp a$Wb<gt<.f6<*f4`$<0< b ACp aj$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA a pA pJWF@?@gA 2SAktaSb (Q2/@4/(jt@jtBgf 0Ao@@Alx?B?D`hH0$H&IB(v`H0$H&IvJWFCJBj4Cb6xJAkCc8Cf K0a0 JN` 0 JN0 Kap0DL Nu6x0/g f@ JaP0/g@AN0/g@ Ja,0/g@A N0/g g@ Ja0OLNuH0E6`H0E4&H6g8Kg SC JpNQ J0|gNL Nu00000000 H:$H&I(S&gfJg^+g`)ft,k x$ڹd SfRe`.&// Ka,$"J@k,f4(SSfRf& L\Nu3 56p`"`&x,A'J'JE8'J & KaJ@kfRf"`H:$H&I(Sx&gZJgV+gX,k$dSfRe`6+g// Kaj$"J@f.// Ka$"J@kf(S,k`& L\Nu3 56p`"PdB@ Nu(g*gg/a _J@f/a~ _J@kf"P`3 56pNu/ &Hrt0+aJk2+gГ` S"+gt SASWfSQ&_Nup`H&H&8|f֓b e&`8+g+g2 KaHJ@f:"40+a\Jk* k&'HpLNu3 56`356p`p/alXONu(g4(f>"P | dNu?/a _2J@f 0Nu3 56pNuC!I!IR!I `H&H(o Ia6kl g La` a(Jf\(H <a h)HgN0@0;\ Ka|gB9@{0`Q l)H()H C#5< LLNup`p`p 356 la `a)b*a)b* YOCBgg Ar`THWf0XONup`rwar+w+a+rbwbabr+b rb+ w+b wb+ a+b ab+ Ap`Ar(WVNu?/ A=aRA=aHG6<`Gp+g Ka*QJ9>2gA a\&_6Nu_TMP_XXX.XXX/ &H+g+g.aJ@f.0+aJ@k"+g kaB@7@&_Nu3 56p`H&H(k L0+"+ aJkRgF+f, L"St gSj`"HSISSk ögSjJg&"'LBLNup`p`H&H(k6+"+g0DtaJk+fZ"S"L Ip gSj`*| // " 0a"_"JkNgPAp SjH@" 0axLJk*g,`0" La`Jkg&'LB@LNup`p`H6&Hp Cgp@CfFpC?/ ?<=NAPOJk&8jaTpCgF?<?p/?<BNAO Jj.`Br߲fNAXONua356p`ް|c??<>NAXOJkpNua356pNu/?<ANA\OJkpNua356pNuJ@f//anJ@fBg`//??<?NAO JkNu  _`a356pNuH&Hx&SgkJ9>0kpfxa<g < g6<gJ< e七dRa`JgSSKpap apa`Rp a>0p a`\JgX>0`NxB9>0`Dx B9>0`6J9>0k0p a0 LNuBx`xB9>0`x B9>0`?<NATONu??<NAXONu//??<@NAO JkfNuaX356pNu356Nu|b2@?? /?<BNAO JjfSBg jX?<? p/?<BNAO Jk$`X?<? p/?<BNAO JkxЁ"kr?<? p/?<BNAO JkZ$`?<? p/?<BNAO Jk>$Ҁk8 $k0HzP <e/`/? ?<@NAO Jk b Nuab356pNu0<`///6?<?B?<BNAO (Bg?/<?<BNAO *Bg?/?<BNAO JWH*(&NuD@| |"b;NupNu   JgJgJgJgJg JgJgJfSHggggg ggf @NugfSHNuJgNug fC`Jg INuSHNu g<g8g4g0g,g(g$g ggggg ggf @Nu"HJgJgJgJgJg JgJgJf SNu"SefBJgSf ANuH0$H|g|$bGrtgJ3kSJgtJ@f"p <0f:pgb<߶<Xf(pf"`N|f<0fg><߶<Xfg.GF3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"56p` 3!56p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!56`0123456789abcdefghijklmnopqrstuvwxyz// &gPR<e:/4 "A`xE>8$R f4/< ?<HNA\OJoj$@Ap !| %H$>8#>8A"P` )d I"Q f`rd ` #@#C"nA$_&Nuk |`3 56` oJQ d nf>avJg*`4C>4 g*g"@ f`"/?<INA\OJj` pNugp`/ G>4 g/ &S?<INA\O`G>8 g/ &S?<INA\O`&_NuH0$< CE>8 g" c $@ f`&@ +gb*"Ҩeg ` 'H`p"@")Ө 'H`>"@ gb" ҩeg`N"(ө`" "H" ҩf @"(ө" k eb$/ ?<INA\OJfQL NuP`BAA0Nu  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#$jD"BJjD$HBJBf4$HBJBfH@B@H@$ jDNuB@H@HB0@0H@0H@$ jDNu AH@r2B@tЀӁd҈рӁQF@$ jDNu"@$jDJjD$HBJBf.$HBJBfB@H@$ jDNuB@H@HB0B@H@$ jDNu A"B@H@HABAtҁрdЈӁрQ$ jDNu?<?/?<WNAO J@kpNu3 56pNu/?<9NA\ONu??/?<CNAO Nu778478l88789799::]:7:;UNARJ (ATARI-version) 2.30GZ (C)opyright 1991 Robert K Jung / 1992 Gero Zahn Archive date : %s Bad UNARJ command: %sInvalid comment headerBad headerBad Huffman codeCan't open %sCan't read file or unexpected end of fileCan't write file. Disk full?CRC error! CRC OK Binary file!File is password encrypted, %sFound %5d error(s)!Extracting %-25s%-25s exists, Header CRC error!%5d file(s) Out of memory%s is not an ARJ archiveProcessing archive: %s Skipped %s .ARJTesting %-25sUnsupported method: %d, Unsupported file type: %d, Unsupported version: %d, ;`;c|/-\BT?DV + G V X * Usage: UNARJ [v] archive[.arj] (list archive with pathnames) UNARJ l archive[.arj] (list archive with statistics) UNARJ e archive[.arj] (extract archive) UNARJ x archive[.arj] (extract with pathnames) UNARJ t archive[.arj] (test archive) This is an UNARJ program for ATARI ST/STE/TT-computers by Gero Zahn. You may freely use, copy and distribute this program, provided that no fee is charged for such use, copying or distribution, and it is distributed ONLY in its original unmodified state. UNARJ is provided as is without warranty of any kind, express or implied, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. Refer to the manual for more information. UNARJ for PC: Robert K Jung, Internet: robjung@world.std.com ATARI-version: Gero Zahn, Internet: q92127@pbhrzx.uni-paderborn.de wbw(%c)%04u-%02u-%02u %02u:%02u:%02u\: Filename Original Compressed Ratio DateTime modified CRC-32 AttrBTPMGVX ------------ ---------- ---------- ----- ----------------- -------- ----------- %-12s %-12s %10ld %10ld %u.%03u %s %08lX %4s%c%c%c%u%c%c%c Ratio Filename ----- -------------------------------------------------- %u.%03u %s rb------------ ---------- ---------- ----- ----------------- %5d files %10ld %10ld %u.%03u %s ELVTXrb---Wr+b====r  @8   "    44t8,  jz( ":@ * 44" 2 22  ( * 6.  p ,2<  4 2.$ @ 6@ :6T "66 0 ^  :4 :. &. 6    H $@V Z "h& >\ ,< V ~p4R*:*0VMZ d=RJSX@.:0!.,ڣ.A>NjعaC&8ùىˌ+>b sHr(>@ r"G;rptuwڲyr+؎JW?X_ҋ3.p6>*1 ~:}!1EF8LxҲhh*T }$tQ\ꑋX9097_r%K⸐ɪ3m>q;|f7ic$v, 9)|EV~u8 K 4YFF0;ڴttPrYF  vE)UʈԸ3\pV7^9JGVV!A FT 5ƥB u ˁٲvǕ8P RY[8:Pq1c1qh %V8%? iZPPh'HF] hwv&j 8l5la!5gu;Ɯ~n J _ ~ bL N bFHfX!@H. >j…F)hYT<(kѳQ.YB—~PRҾ߅aYPS K10)&tdLp5R6r; l!~t?N7FD3W3M{Һ݅3Ң^-(pss9Rw3Xx2|4hvaGax<;{4ћ ɩt0(ދ@2ˆ~F;rWYY)~Vkv& j~ `u gvKTG3V#۪$ݼVXڡ#~c<'a<躹I'u;Fw u;Vwǡ~t2k{{(r a!><\H}u8h, Hl"F iht#0e堌~Y ;u 61dGV5e@jP> ]*x6[`&HsIJX[⣭* &EV:ԲMzNv:Fƃ[.Mp";  9vu<ӊ(٫kcG/aaCv.uSVzS_Fbdǟџ WM{ةic{wnf^$VWH Dٷ W各F᧹P QRT37 gtþFlB \9*VCK[Һ(v_tC {CY{8;[;|#q= v  "5^bhҏG`\2 ^63Rq w)^]SvB"-|ý~5;iuGW!3R) Ă! 㬄 ;TTኂ@.{ P9ww4hhC> ւdKі1 ջm #FEuhawqiR6 J腿=Ee=L)=T0];%H¡ q Owza #LuZDZQWg5R1 PVT̨ 1 Z-u~}?@?u聉H}n|w Pyg/ 10%1 BFF0 000..H(|(Z/t sz q8}슗a = x#u GC_%^ Bc7 CYaٖV>u/ R⸠/2r4Arts芰eQ^vrփrsN'QQξn<k xYSSF3 u;xM G9h}av:{2;V2+N}Ի?N;~Zf}T53 s+?+?7| SQNi Y[3I}VH 0u V;s"q ɵ'|` >99vqCʋɡ>~*]y s tǿ t tF?!īŠ̞ߋ^Fٖ J= uIIqf: ~a PQleAAAayDSH7RDB>rruh ~ua&X-8Ūa Һy ד^&mfFG: |||.uEu XuL]ó P艃y**W?3ak=*8=./=▷/-5=<9&G=*# :+YP "Z;h{8A@up.wZy[3 RDVT6F' Zr m#Śj\ɛ1b ) H3~ q. } tW!wq+;Ҹ \"4:%ROځ'*!7o]ئ?ج.mF9@])^tzQ0 :e_  ;F з1mY/> U; |: o|F0, C Dhi/9t`a|th} }W5|JDNN1yvY|| m0ᘩD ! t JY C8sk2c|)aC9D uèD53@~+ljm! BǦCL2wCC,Ա]o_+_7v3 P uZِUqԶDt#weؗ {MuC@B 1Օ+1=}bte)Vo ~e&?F^Fԭ!Fae9ms($3bk8_ܙIxs||)+Dt 0| | u f]}A2*av S8[( {)&+ >ޠ &֛A{  69qjοdrΟ 'u ~Lvwᦽ F uuAղ넖,q3PRVZ8 Y)It= v9 Ur1uWPlxmz|1YuP?SQR1U@'^}b]B P H(&p| j6 kFni ck]ZY[XϤLڴ!NFmI6R ~"J L J_Y |V !A F|뎧I ? Y a-W輧 YޠYC8jC PqP6@DՃnV|).˜ t ǿߤ {ۅF@sq!WODݭ~""UN9B< u F;Iv;+Ё|t1RXޱ+=/@~u 'ŋv&Rnv uV}i8 dLDh>€u5BU .LZCYrB;>r w;r;ÅD%=ZuQ}_tY/T ~dߝӫ|zu cfaU!"B 0 |zt o {M7 Uzķ TV) jYҍU 룡> У*{oݳV;W:ى U걠Jn_5Eᓌ%|hVD$ꡑN VN:h X~W[6n p _)=#Pkl=% up޴BzNqzIu"VW[~ y$wXrSF N }P -Gt v+c!BF NN, s:FvuJ ~\ꩩm3Ҋ?TҰPa[^|W D  ؎zN ʹ9>|zik" !F٩u@ ͶY~)9y)[j}t#PW芹^-Aj鈞 aCZ"P|S_ي: TK<1 lΉYSQtl@|5مC׿$ ZgNT A}" =<^P;j bѭu_r [ ;{ !bn?Ʃ<t-< SKFL[;Qq ӚPQ||ފq[+[r / ک]Um 5!8GZ2u+@JtI--Vȹq^!Kt :t"txx:"u6FDe1leD]+OѡBP t~ߑH$ -+}ˏ 2<ӆ͝ˇ A yъ'@'FAFPFWHi%I_6YN~/j+.PV r2~~Get<%tv?3ɉN<Nz2Ћ؀"I`s v.u>wO~+tV뵃f õJFqxu)ÓIp6Fs(yiÊoubsʵX,0wvG96Ǟ> ~h*iY\ pF;3]/GGZ.*n~Y/+~onNt%i0 LqRPWǘPPSVEtPx.%7CCQ~:Zu6Qo"N2ϯ; 7UF26&9Yқu =? 6 u 6;Nvp} [WQ^SR(#p9[<6 y V4wO ~,=-uKI+~VFt nO&^=ufoC<~pxtXu@KK}NX  hK; 0WSQa'+?+&E::txrހ \ɴ@t PL X_]YQ3d"PU(01 u ti teIy ۵ 3;r w;r+@[AeƋZ(%[Ssـ Ӈˀ V^&F 6 8: .?6< >> 2&@Ň֓6FF>rߊnP@%+r\?QIުً݇ËCwr@h?Qg< u> ZBCI,"t"<\?u<"u qY.O2 C+r.4 v6wt.yF : 6£ͣK&6\r;BűBq>]9@#wt6 ;6TGD S.[0ċuʉ?(pѠ2?t\!ߋ;t+>@|ÁIQ.> t]Ӊ!É__p1DJRIr6\=s>ot(9sË;uf !q97sk׿`jPn[[%ap`XS>UtkB X@[ĩ!.١މG X)^7,xcpou%%5q(s)?!Extra -12ϳ TextE m` JmfrB?:qnhZ/CVRev Ho/f qOlmps RڥTimo#CRC-32AtT TP*MGHA3Nf8ks^new DYNOOu%v>ڞrydo|o8h Ov.Pc]Q;UITUacpApw݃SOLEm#AW MODE.9T4/f.on܁uu3102/bySkippu.TLWBUn%'YE@SNoQu[ELTVXACFGINP4YPpZs*$[-]RP\]x dic , 2606 V։l*WroMA 022USAdkrw}BT?D;GMS-DOSPRIMUNIXAMIGAC-wbu%0CS4u-2 :mZ-  %:3(,28s u.j3[8lcX4cu r0S' q߾ұOd%%Wq.EXEJr+Kr9 @ fs O;D>"  Լ XCw 5BB۶$4DTdmt  @Dž  TMP.$= #B#(n)P`x9 P># a   p j N S+P..ډ=v)))ÎڎñHH uŽ11JuŲs1JuŲr"JuŲJuŲAAرt AA&리t4<tA -؎r*FAB*X[1tNjǃŽ& u=uڋË>6-؎1֋./2*\LLL)`xx3Q7;sUNARJ230.ARJ This is UNARJ version 2.30. It contains the C source code and executable for UNARJ which is an ARJ archive extraction program. UNARJ.EXE may be freely used and distributed. See documentation for more details. This is a self-extracting archive. Type UNARJ230 to extract all files, UNARJ230 -l to list all files, and UNARJ230 -t to test envelope integrity. ARJ archive created by Robert K Jung R#0000 0K7`*xb&{w\H README.DOCWVc$Zp](C"-r;'Wn9}-^peumF<"$QY`ttyz;˚IifzhRC ZPX Y!f `6[iRN` d 80Vitp>vu6 bTz)(V6,vZ68PG|qЀB7GYc6`GP揶 M:ǦRe>y>X/XK E` |Y?}EssR΃A,!Euӟ-N7tuPWi$. Kʲ{k+`*r G*'BX Ԥ\:K.Tgwh)̴ZKɝ  mԳ.&<}O3Wsn/ӝc3T "M.Z*iҡrreYѩJ_]|>0sbpMF)6A5C\gov MKXXz 5`(x0q&o P,- DECODE.CzK {q$H[69Ȍ/Bp8 bꨚkO=c5>7~{wۯ[$ΖNQvT5g܋~\~WۓSϵRxqUOqUM M ZSA3[5,Z^| Rդ#oxy˞ XmCvstAn]Z} 7d^}WڻCmDU֕~zbIxLN0ѡ6Vzܴ_sl!x,_?%[Oh:ZR!i$m.”9$HUqI)I"f:Dz0[,Ws1BrariK[[Z Y;4orD/8P6^^,bptp*֎pǒ%~n"Y̌0ĩ F@gz9{D(t(.83 7Э6f˄ZC!?LS Wŗݷ[ɸ$lHA?!ݼ`pcдՄN t|>_>'QmmnT{:zz>hY&5jTjJ#xVGU<<$3!Ah+ߐihfpRXHUcU*HΒw-MNxȌV4y7ݪVna^O n ,:dyבKJa-ՉQ%&Gt]׌Ӂj)Q,6Sd( ~y2le [i|AxFDd p .j0 (Vl^8؂Tѳ hW\*樶OVF? 4ɑ%ĕ < pŻNvG+dia]\n9*H,RJUKX"s-fJԚܑz>t䱰1"J[kd:4?< )ak t3Hŝ:p9 Q al$mgȱh|9LĐ9h8Z't3ov76DBjOZ4򉑉0KVT[3L(% ͽ_OgBi_cBlIT,=pR_:^KGrtǦ߅"Lʸ 9n%cKDSSKvbz$)VcCc״rYeqI(1u}sdptԔ±KI3,\]:,U!QB e)kx hiؚ A #M&NLH+rs3@Ѫ>.;KVXbA熤⑟ti3*$̰͡OH![}&{AI&Q&`έo"ߜґH) Ηڱ"u :mQ2 :"JWg-J?=hZ~E >K7h-ԓ7Ғ^<ݕlEe&ZhUu=Ϫ=&M3hϊp)QΏ]\ZWɛx HCVq ,@*ߨ_~z9' X6F}Oe¥]5Wk|@3J\0X01DtP> {|ynS@ \m<o6Uem,&%QIoo6?B_;l2d[hOEn:``MKMtQ%.yry4 U񐅳f`ܠntA\ MZ>"SOr#ժ'tK~Q=7Yjy?hg~TL*MC}uܕ^Gu A]HhϽ'u tݣca]b[~. fzcꌞȺOikeskNeN4YkѦǤmd&3D D >8,{NFyW=2H UYF^'IA5ư\a./ߝXWwTKPXY)3V>{X96~e!|!0RY9YW D&Ed]9Xزc]>w}wq]FVE6נk,4[GcpI_o5$~S7!6]H?R!o?Q ڍ38r= Z[zZ],-+L.|biC`)y2q& N2i( ENVIRON.C;S tq@>sfkqXMǭkѷ-)bIpĀp` CO AoaG}H5(9Q2F @#֘m:cbcay0Ƙř(\wHcGU/G!yaR㭴#Gj"$$Q"8sD ujC$נD9p;ͷZ=rة5j- LvsnU DAa@9A E^@4+h_ӵ#b%DG!o4-s8;*]ii~8c8xYDdZȈݐi6Y2k#n'rkHwj qm GDPel@ l,8 Ik;)Lans, HaA |]Aac$cEo"w:Dz589Hɦ&iҝkި?1زK9ZNE_qfJDN7}bD eu'1¹Dj!Wh`*F8nPB{0DwN"5<֝7D҄G j/ϷXx+,^#8მͫ|w.۵8P cՀ:^ՄBaPlu!ma( 'DCA,?eAQ!91pPР QR$4Y#<1 A\ j>L^C,pէcB?Ed.1&uz[^A_a8DQ(y2 /׷j]IfrK^]s(fC `Ϊ?2QXk hBh;3iAf˕(a\2 ,6kM4a<#6ÁC1" 8Π:t(C‰qf>F(K57|~%V\^aiRƹA$HJӤ4xF9cx#& ȑT^1ˮptewbk7'$1keL_"O`YLj1:dcl}3C@2WM0?/+XM˶y{-_Ꮏ1m0-0/0-Rc P\79mb ȕNi0̀JV'6%AuLmdd(鶪pW{/Nt 0)eWr;izGa _5`ס =Ea;Pxd< [JIR.K?*3{n*]Qfś6`faOc2۾rw }!I:=LBݓtĞFM/H7& / /i-\eNՉ`߯$ PmT } Mֲ#Gzpchh(+ `A0*af=ן M'IЊBƞ(!{6|;ŸZy] 33P9fTƙ5Lr?9RP|{)4i)b}=GMא|n?WsklCtQA'𣔌?NߏRs,].޽v xH^^In7.jǤ٦ a<5Wyz&xwKTzxv @=PAX"_GNHe%TO`R7P rf01lȍ!{TH%΍+S?4xBib/81MBʇ%ToOF$R1@J5WHnV^N5H9X]s@Y|LF[l 8:rYQljo"Vǧ#: Un * A~8?.eGRK_xX_IÞW[{ʸzxwQY~f!d0лfhW.O#Ѿ5jqaoJRWKEO2q-5xJd|Une>+X*5t'!8ߐ)[&d$6[$J2oFO%T^ՙَi'Pd'/UѺ.NCI;y"$Ъ޵n|<ߨ&n}st$?1e.g6]}]?]s?/~7k13͗=,@`'y A Y}b UNARJ.C?4ܛ]0Cf0I"cxB*j\iZUwi7}{I ̛&os3귃[[Y^3-?a#G'[WrPE~N/]RG_[9hm[(r,0" 8yFs.i.u=B*߾ˆ>. ]B0uEQz]֌pu7x "n$7i·. '@pb$(mtZ`~:GK",(1@q:у ׯ<Da}o T@oFh1Mלl/E)b0ʱt:HC:Z'&GNwAy.ɞ-uӜ44ۣ ?VwO o}up1">l8%מ(/UI.s_CnpT9CQaE<m$?Ǧ/8"+ozrg%[t|(wom_o;cslK xAyޕf! >OFq#F밹آI@`!Q֣B( ý0TY$ YuQV 7q8}Yn&5CTC0ᢗ]}ΰcn 1ޞъԳtBQwC{!e6<];sFt Ά {psI$OVZ=w!k+aNPF&"0!l 1@_X? ߊۀW7@@ʒ'jkS|6w*9M󺫦>^,= -pEf(T@[!IңlJJ&n"nR֥C{0/vG-qu,Oc?Dv0m8b@t6"MKӧ~ǟr0\7ۃ2q2+޹ѵ-Ⱥ:TN?Ab'z/{U%w裣 `%bƝΈ;Sv:zG0bF$Qx2lVrX6muZ&k6JIO., cp2d&@l/<5']&!wAr|;{ե)3y Aczpn,*r`p2ꓷ+$KUQcP( Aԝ ^W0 A qW4К}N+[8Ebȇ.^UVp .q]2пd^+Uqq􀑁әp,K }f l.&x YQ?^~k+1ՉLDBc풽M؝z[C,,{$ 9LP9E:D(38kq[_]h% R=֬UP0::>2OfՔʰZe(dk;/ލfŷ`Xqwy)J5k8,U .“}*e}2j9LϷtv"VK&8 ]}moznxѓY98\5{ȹz) N^]}l/d_(rJ p[X:Ɣ%=v^U/Kgxt;Vy44ܼTyG톾M'uأy[V4guzVVq+UmݿG^Y98-|S d3BO* }mmn{*طij/ •oOb^:KT2SvڅƌFݖNm!V gѧp;Ny%ˁy{`@ ;̰Ӱg3k!ž&c̀g뢥̕#YBɏP D (e )ei8a_nþ-N&[F)nޞR& CR$vH~ +rk"lcCy!zuXR$yN|b+ wx{\ˡ%Rp:7@̸P$ w5gm/ivf_*|&ey\XL ԖQ6QIR_;dɴK%> ~-Q=\2h5F:["#^HDGt"!t#KX~""ret'pIy<zyGZ: t0աA_k zp$$裤 Mc($2l2|uA|erU\*kscf s 4zKQ] s$N.@9DDztO=cxzpD"sӂU i¢5a _{~/Z\":ޓ^S0!"6I8*.RHxWzH4rSO;3yp10X?aO›_Ǻi> ?OW"cp6zB5C> L͏F=-zIRQ*RzIh0L{uΝf (!U"zy`.DX堂l_~@րiPF+ٙVeBƆ٘2H@(23/qƌ35d,+fw!bވ`/VÕ(L-*Jp`ON }@ Y>$hABz\M=> oϴm75|#3!0JJ !f=8\6Yt.)qJ?2MSRbp[Tԙw2Wݲɶg2̀Μݵ6TSor ]KI?1b0|FEG*\%2HDW1!. ;bõ`um{-cBZ5$!)mKIXWM ;4h?_$dž[="OCu侄\ן\WYX c:h=5#WZD!m3' I 33,Tf8tvkuگbC C/g\eIdZ >pcwv,*#A>qDHكpycd|a'VBli/ tT9INwzވesMBsМߨ:k:l*4){EP0TMON kg'_,i?$G ٩5,C}ҭ*Ɇ#_l*#lo[pZsՉ5bɬ=dad^|⣫ryyA]&c_oQRFq cYwlEp@˄y=>~ģ,ۏ1ygYVl楱¿lIڜ[@͘^[ nlnު2c03ޘ=[j^l۬%5:K9tyB$왦l.YF͙LNtfB?OHN>gps:n59\Kk(̙eܭv606O 5^ZhE(GThlrNGؠ]ɈrT*Bbdt&>o5E_]]-9tͬF s5!Ev}g:y CR?/$jeGmP|y/In FЯM>_7U82vK£&>r[)ӣ|!G-*+S-̞S>:eb2쁳|,7rYcg'q_κ* sYqlB%ו!RrmQ퀾yx=s+rp<0acg,MN<53iv!hdDmTK9L"NyL WlyKJ ijX;9gPK9"<5vSj/^Y|dooسj߳vűHvU|%|!82>Oo^=9'hk>oDeO,&I6~O64s$'WQ{.$T}ڒ;ʺ '3ЧdA(BPˈKraHZ>!=~;)b7bsIN_"'="VРo!e~eSі/R1m0ﺣ*XCn=c{3W"Tqc㵸Y?XLV+5.rYjR1U 2읰k[522pS#V]ΦAFs b8[k]UÚ<`'y t-f UNARJ.H2{ {ͷjx..[yM#k$n]͎a4Xۉ6:m-H!!B<#ច{mvˢ?-ZLwPV^5 l.|N7r~`͢zrFT% 2+rb(\~b@"؋ z -txNYވd.$#G~CIA@I{02DM@lT=[Z _bQX8]7 z Nt F`v a T}CIC7S-$Ώ]T$aU#$RDPg đ+e>\D`u'8Fɥ-psZ2le(.np$L\n' '2h'xq˒&(0yn1Y#I O"ѪhIY!"Xaw4rlӎDoխȉ4",9kcS-Drjdqlb{PV9ϛ0H]1FW_m B̛x:m*=(ӈ\8k*Td.^8yҦ]~/>ԹoԼ?$OoRϖ6!k3qJ*ATv]n#@85lԑ.*~g_`X2ٽʻ ݾ>:w$FJ8ý6,9ꑫjlxjZ_;ʜHpFgĝ,]F4VZh2* ,\iv.I@%9QSf R0Jq;_~s&MXeq 9 At{}KH_}6B|iq% f^w0w0jD OX-*sމ x?ďo'€_9aĐ-ybneuc~T=g \<9R qJ~ gJqm.AWWWaXVW"lB h譕Ϭ * Xh%GPayCUy߉ޗ^s 9g qchB*Dg1Ue[j,Q\8"Mk~yX*RND $)C@ ")ayjj)#Ȓj62|LI\p~l 4=,_B}gP ^~Ԡʙ0WZ4B<86O'S=;w S][ڳndmwַվϟ]Vs ' ~1Ul۶9g(`G5[9tZCs:1yRٙ{`|8NdI-!t`ם|vޕ#cBOb41qB#e2L"x0W~9bsx]@;QB ^*[ॐ&#pO{y4{0~,20hC+ɿ3 ( :fg8{b/11)frt% 5S̻qIA$/cwoÓI |l\]0U@(aW=3}]]WtkwkZ~~/3㧳W"x ]80#I@8AI"L|1%:2 ? C|#:?TG'ylGԤblЃᮙyRTÄV*@];JͼZF KrW P7tumOtKVb9]+Eǧ{HP0cJ\t^yXs9HK|XgrSsĞ|pS$Zu?ĝZUlǯTgQ^f%uВ\ctrԷz{YT'q()U lĊb`Q[{4U:rmrhgД5Oj#Oxt"h"DȢ#(a:rnznLAp Gi3NX|I'৓r[pABXhF*jV|TE+ba* 4pZ))-FE%g&o&0sBm O_00#?ŽX~"UbarUr%n#whqwC1-B#gw-+H $CH%Z~<*NO9۠R$ρUk'EU <))*vٷz9k[M[ja1aw7{NgVvp}aUm"vF:%ۙνxj/37*O&js嶬k̜g kМ&f5˂WŬThrOABM}FKhqFS ]\xG#LZIm )*%F1;%Xͫ:vL*h*M1xN6 Ze9T&Zm OZ}:ZIoWYD2W"v:%9nd+ 1jotk|_M%AjҨ&)DWE&`es7׹0tFL3~ ٘ijƭ*"b5VP%hNvѺ;+w56S#H91d`"^ρlEEr,Ԓ"|HZ-SYz9/D'쑀"ү=SLRC\{宵?y|x=5/=Dh!NH*1KB L)T\m(M@E;6tRT Ɖ̫@ [@…Y"ձӗ~ bCpq(.pTN"?Q&yV*kh^RMU}sj8!}6N㍓ɧaN*O5b46N EhVFtj@ @9AIzY?%|iEm =5e%8!UE/s;ݔ*tU"y+OEҀ3DQ'1\3XQJO|ח;|)ktW.MNr/'jvT.ø%jh6UQvԢAMd$'הVJzs"(7#M sqȱ8uJJ9Ɗ($piO|=8XO+VOš_ד|v1ɿ`Eۓfl%N;l,YEJ.ZڷpJvv{h2Y1,/{Q ɻ`9ɷ{ߓ|ZؽdovK>|ɒWnMٿn﫻'rdT!'u@`,yyN"V OS2UNARJ.MAK^[v٥!5C- pN1Pdh8pvL̫DeP*i[.(-mCW`Z)p.ov8$G?X H7`ܔ B. jYAΊf"C~blf!=eoETf-&@`)z;!!OE UNARJ.DEF8orNAME unarj WINDOWCOMPAT NEWFILES `)z;3/Nc/ UNARJ.EXE&͏mpRN~w!#eH"D!U7$ BCnUHF ss3puЉE\u UB1jbHL֩JB5j¥!_clٍ _ٖ|AM#*3Jt__$ʃ ¨6,+X%fjHCl3hš &ұ©+B>{iv{Dh! ^R~-,Ǵ9IG̓fRtKSH=c`Ir qly? =J\/c@޳K[ry'@ت*./磳 Ԫ̌bTR:T:ܵOyC ǐ?7to܀.Jk@k{$}"|m/ʤ{^kX&6ԮoJ멋voeI$$`tE$|O=F\*՚Ys/.^Rk»wSUA3_0 .!{$!%on BFPj(7pWm5~N5۴rꪌ,3GFq=PX\m#|.TvJrׅek#+z)iSՌGz^OSϯS^6rC7sO䙐$}@KKڢeL{|lm㕓VҖ|ԡg;%lnܸmkDN~pH({R?9:4Lp fz:$|PKG>Vz%smU.~ x l+L8000Lo1L9q4%ާ(;j,DlVl {9dMԺ!- 8B9Hij]A3ƗU]ҔoYy'nmҖԺo>v-͚rI5-A9&oZ±FVr '(@ԉd_1btw o'%PisJnEGGqI+ h+C<`Wp0_ Kn3Ğ,eYt~#ڭ`O#/|[/#/^F >%ŏ +@oW{h jlX$ AR-[$q[KSI%k?2x\iWgSƴDhGHkB7SECd# UKH0-2;+6 R뙔m_{¥r*8(~d3ۅ% \ XpvRp u!ȤPZbUCr:ZOmygdu {S^m6tkXc72Y?ÿ6g7=O0ݮѨLHno<:l^ qUUv?%mu꤫mjxX?" b%zfvߤVԩ0_gW|zƵ(SE/:}o9׷/ز^G3}|SjڇJjn|Vsft,`r83c*XJcUY8I] [+f*Yb7\%TZ<&ަ>A}HF-t_C!| / PrIHGv5-wWl",Xxrq_ؗE-;lY`:W"Cv"l췐pmpi@lus<˞9~{=jζ3ɘ%vPa]ϖ~M|kNS6wS{Zr~Mt6'ǹ\,oVt"1xt?+RZòv&bV5|ӷeƧ [pe\qp36;5B16Kx:Yl-ݻQ^3 7\SL1O/P~2 =hg&9rX16cU}Mh9K 7e:iVg8@: {gMƹ+2S>]h!S_@з!S#@ŌhhSZP*{[kJճmQkE+(ݻ4K ̪??b1W|8TB0C w# -ܗ [CV2Qofl'"g5nGAُ[?Kg ZF\r.Vș7dydc[q'*#d9 a-Mh&wa3^$We_GP"LF׭\Zˣ;eunףZ(XX kpCb>k'Lu\u!_Y%Z+m'O'DG4tcKy ^>} xm(_֭!wBNhP2c4ݩ-6,qX{=CBRF˝I;A`_0o uӑ}o nhNbDu3`^I tXd@h!FTQ7GjQ?+0+6nLq~?𬖛{b$ rx禩,h؅ab?@=n#9HDFܿtuh 8Dؓ$Dm>ְCڷ=%RL2| aۙK'⇟-ATz%z&e!LfDK`el[ \8%uYKg0#a?&]%Rw %g7g,$vɊW)B+$FA zȒd}LDu(FPVv]*!\-+o5xYl[#=-%~ j Z  ҥ!]YDQzl7+RG!_nx ˖hc-MtK[8>1ŗe˨Y!y8d$RxUn 0-?DAr?熋_ t5JEF4NWNk-U5;p\֏h΅C>h_? h“S3i}WBS/ݑ b8 JݻvFt׷$pi>.{ 6 XW*?7),O%3)Z1-|<|Oƒ~=Faw@jo7NQnQ/DO*CUcfoR,iT.)r-ja)T+FR+'lBlx S<, W&*Bs ^-ݼ73!z FE$1.Yq.$QPta-]ȉE80ܴ88RT -a0ap5IZZ S hf\DmR݊{-C\ʘd:"ln H_㖲KW!G>i/cu-$[nF.A._Ea:lR[qOx ph0)<5-,i4^qR/ 3zHݍ#>MH_0Zjٲ >}kyAv~j5c\hv+ m K}(X]M8 \  ]O%m DG8 7eUsg!3oEIBp$<Ƭ.!cH؈_7:}Ńzّck>biLX93_Z05 m#9nfIjC ͶDVb yxȶL,+^HKė#I-3JLl;Ŭ"6Cj̭ I1H·釳 ӎ-̙LT2FvOj]#-P?#;cNO/vܵga2v-oa~J'할= D)! #ZLUƯ6U·x5@\?Hr A~B[3!F%LĊpAqxm.+]puCP(Vc_X4]PFa0;сfȅ/V8fh'2.[K^ i0 ͢y +k{TytAuɍo1?9mOhY7״O[Ee<%1o[i0]#|rFb~G5^}0*4v\Ft9#fgz a` 7@'7bZ ^+y&{ jh#NxЉxRcj"vY+qrBȟ#.+TnAitD'ɩۦ.L5!UJ(/0>?*W)ZL yh8 Jvc]F.;fPÒeLRxFϝ>8܅o4; ĞΛp2S/QӀTENJ0 8s``-5mR1 $E;J"WvSiD9̥EVF(OO$m(Ipnֈsm6J`btBd+ iE:|]w?F³RṥAѯlJSŮ)"ЦSm S,N !<7emKs9,:>'̋5eH&Q@;FzKzamǐߘyjOR{۔aK)Pmj7{oA^(=[>xnGaPKQ8Cm`WہxB}FZ}g#}yϞ4ѭr Z{\&ns"Mn˿5ʷqj8Xooqj9̴v?qjj,s=z]/U۟~Bdy /ON}r?p[#6~זaڥ[6raJ:0:#4FZ0"A5̃7RSo:5, F@t*k7e#Mk7\B4:c(.טsܧ8qqj6_EWvƪoB[*Q A4OZ:ާBJ13;lA\h SVJ=Zi\ڻbq٣<óZMRђxGjO2uDS.BӍ6EVٓ(2UjS"Nd`W$e $ {ƚF#c*E?ݕT+5|bIKòSҫFVJM jVތ߶|xgȵ0/U1d[ Ddd.$[ xPL m2=&x0v,vȖH"mIX]i`mo.K&)ZAXsd{).\Вa-!^E\6G6'2lA vE,}T;1LIcw@6B1,~;2 Yܬf6Sѩ.#ArY.cwի1e?Uh"ȫ#uPස㵻~I?*EyU]gN[?dL>iIlͫf9(T\x,C.3lgȆxRj%Ot<9ʰsh͔n>er:JhȬ?X|#3͍(ncDi[^x-prDJ+ ު@:߰Ӊ|/Ok7Ot³ 6H?piDN{ 5#&ፅ jA-bh[vJIw|ȰҴW1zEYGCܜoK%4YB,$~Po?,d;+ BD)EJaݒ 䉘Gi7g(AJvwچ\pG#G 1GWB7ڏFW0oc[[|]-VWIr*.`WE\Sq{U -d],>QC~EliXs\L!>UTOZ"F2հ+S.̀aP/.zG">rlTYΈ2OUT ȳ06NV?(؋)2kɜF1uAs^? *RY`mJk8xʬ埝Ob8WUg']oOuBЦy06< E_=5ȳ}Fwxh SQ K~,IԚ'7ԭ.8bq A+>I{GiDuf`LS4oTf&WΌxw&0WM_5V6/* F޺`Xś3f87BlNEʙU?`DQj@vT%Ġf5QeTd=>?3'xK ѭW5l|9A)onH=$u<5hC)[zZr"m#l&X؏IZ7@Na 3G%G#`"n@&>u?a#qhK$\/2j_ q,X!MǏ`wq}%yw"ÂӚD1c ^ U剞І!iK{rPѩXun#‡_Mo; uڷ>4컴OHmć FC  6,P21^O+r,㾷VvH->#r zڼR'%@mǮ#"m1DŽnin޾. t+6[2X@ /A@1_'S3IY%.9~˪iN|7l촚 >?AL'n|vZ& wĿr-v6O;උx+o(1Wp(90IaKCkCXYnW6H1Rk C;m dG!e-^+f dAW\?̏0q'qtG}m&vQyW Ά#db}yuo3h JaCng?Mx./^p['Ѐ!dP;Švd pGOU_oOVemȚWVdA&*{%ǰ̠`QPvwO[PbͯO:='f]7։jVPU1x}zbԪ=S!+ёzu畄E[q̷ُ˯>]]ۏ5l*s!Qet6<[C$=vX"RWmh}j ?>,q.V3e](]QL#[iq4yۏQ~~>(i & ~ȌYr4n=3cdno][GMtتvi({햓8ģcGlAnlJ@&|H|r,36̇S8Q>b lr r\ٔZLnDZsc8~~Ln#$q8ƺI/tlf 7q9\.J4\1@f;U1! ϩ.._nl+o5]"gEx-Zdd cqr}MO2U=N'MNSxyOK/W% 磦W6u?q-eh/w~ڒ岅,_Dyity*\TZNL^p:PN)bs=ۅ|6N37s~N̽0Z%[)qf^xhnԗXm&*})LJVU. ,=y^^9]ݗ qxIK9 pxIvOGMq3>v^Y0<~\8쫉-r6cCO}R3Hfl%s^Wr*,>z⪔I\p;?Yz{?_KOJƏӿ̴), 0ylKn3:0ol:,wpF8 5qeR%˙QΗ4"RY,gDq"䀾՜Gf6)6͜mǹ0} M?uM]3F &)q/{ hK6Ru ̎ Dugu, BUm`'0.:vpYɥ'"Y;qd*Ig>V:\f30F<]2E_ -T0`+\T弤  ;6iN`TMFd `Vg )4';/xqS>.ԕLiaօHc|I46wE=A'aL82UPUVcAD;stZ)r‚Y%n*<9: B<$ÀQOhĬSvVkḜp3lz؊!ŴK$n2 A٥ϼC;D WM"ڸ8_fX|\)bg"*;4gm2)[#|5FV`B鲹c3@c%򧒊`,ʢŃsb:8kTxԓIFGUJI7>w7eтyd-זZ_iNL̝;5S־u(25/TgjMVeM=Bώj5tIwOWOKLu3/vjںA}Sྤ՜1ںzD)j$ ?+C+YP2eY|`3reљi33썦77M$sاtںU vBjoz,53Q[6'nO: c:^34/iuzClLE]&k0ANRR>[{K8P2C KLL%Gf:j |1gj)TT9oYMB`]u \>l&wOUᝨ?0L{4y6Z{6!fAp}[!שiYRX6liė>KiWUX1;Ԛt)< Q:ħBes G^o.|p6'zu`þ֍EJRHi#:z`edqt` 42SU,ˁER:eK⒭]2BKe7wc\ii[c ΃0'fzu0E}hb@ǶŔ/|u4{تeʧdu_fGv>rYN M]1Mbh54H”*H]k;;:޼g{v[=@Lڭe55,bQԢv$cjmVjCճa}OD&kx+iE"SS6 4H7PZHԀW[d@]J:]U ?TWSKORQ}"`ΥJ5NJi=@El5TVz>RYCTrb->(ڝ=5R IS6SP]|SR>lMb/5EڀHT!;sKcS 5%c%P6њ΄Ab;,Qdu&0"J:SON ObuZw:W)TSXs}S6|2UK5T,kKbd'1=j̆P=$~T.0\Cc{n"ؔ/*jAB4@ ?!?ۃ%a1R|[VJ|l:__ed|uVQctY(,QdKaSDq KMSAٝ61׿}x(*uLcǃ||Q/UK"b>a ޛKA#4bUa?GVg{ ߚߋzw?& !$YD#f7>\2+¾hu#?Yznw}zz^t:n/_uz^ׯl#gW|I&ZWA<$'Z]`;e?K+b>bzK/T,W,J$r2Lsy5MHm|_r7\\``)zb&)* UNARJ.DOC |yπ7 @&:lM F$I [EZ̴+,33]wyFl.ɯ{iт/&"՟7?2ҙ#鵵3{ӳ5HLArdDLӪegn[{iu#2jGLV` $>|SnGgOة[%i]2RgS̙:#dTT*PɑNBBɴ&ιbT //oD``%BTK:FZzd95Άf"-%Y0'L̉Sa O'^hTsQ\ctJi.] h"*f/Z2L DFv{;)1d\vKŻΌ=̜T\D1QTMW?(>np#y 48G]Ǚ25hHpmd{2bNoPCͤ5*_k֋qaȚ ۈvh-bx1EǬfnYJ$DFl.L %@> /4ѣJfS@1R3Havb;KC4e/1"`o4+JEX"2ddlEϧG WZvVq Yg~ ҙFÕAhp,ZIh+L븾͇P,_}+_"4)B陔|8v(urr:e2RB-0߿o"10dW*&Fi6r YѶ(۰I }d@L\ԡ:tyYg̒6*s$AR#Y?&ZcIyʙξ[)ܑs6ɽqd')b Mu-]U5սqn$ZrqR%bX[:w{΢t{;4ʉ!_=f6ڇ6{pa]]^7B) b0Ӣf`5,\c4->,$88Nm8H%]Dd '!n]/<.@Pec,| &Cfhig=<0dgTHhovPGx,S+;E&Jׂ {gE2 NzdG fu8_xb+d, I9Qc{BPGJŕ|L^QSPMSiz~ċ|wF_ZxG[t@dK<^c?`Sfd_+nٍ_qB/b-$;kbنC6 V+/ח/0*G<}{^Ro\+uuw{kzC](UZ'.eUxQsֆ(r{۝dJb>AqWhlHov+ fRH$_i]`d"zS8[nP%o7Lb P@3]SIetHbD=+*GNu%9-Ӳ"OƂ:댙A"[-'ٰBxR MHT3( oASu!: 8RCBQj\+9FqYa;yCČ\MB)EbWWk8ͮVόa$ Cn(?VefcZ!VafSnWs]c3$qJfRnJv`$=C*oA#mAu .Ђ{llvv!3`4)M0Ъܑ  F(]aru6"fjʋUҧ@!w$Au8·,뾫\ Z(覞K)gCNtx:]pXsp?9kcmLQ=>LE`&s/@$}:W V֛?f#,ߓGFߵ1a~GRP^j Z/gUC;򞧘4BFT{*. hepFX;wuoϽ~7ϫ<[W{\^~/W{ ͊Aw|<|<[oOGǣ^=Ww7l^s{hrPװ,w޹sM*E[9X-&Wˬ=atY,$|$q*iWוl)1sD3}4IYۋs;5Eٕ?Y(dksU1P_ ¥(߂4p~ŸMJi!T,vDt/W%s;6"YZɟ9uM:\?,KlEkp JĖ&Mʢs?v۸Ӡ>H|Ԫw<kGp,ܵXj:.Z6nw2Sb͒ #Ĝ%{ݨx`Y&*];mP/ݳ-2j'$a~9"SY9Ddzn|7+u/{eM 5 ttlf-&飺s;Z)XpŷҘSH % Uųy#w0,`p}:1?}Ƿ',*ɳ+=߷q:Q{ 7HsL3b~H hG Xq\þ>xcQL,! X,+?A8&vU)HouA|fTUZYS1è_*ʅ"v6-#3m>S}{@`,zb&n] TECHNOTE.DOC -0sc3iw4%6PY(.$I-5a$%$n$p(@ۅGp.ù]xu;mp z 96,x.e|$Fvݷq :1csP{ItRQ3O^BaDK U #JkItP@zR'D*}p!R*^ek;YSË(wB"#H(A:O0Wv%e Tj+;w1!`bGMuzśV-19/[wO@g`hmG^kU:V%d* 1ט6I2^V]sA|ѱ4dN\0s6{a)'hCF,C@x @mFbNjskǘf(y!h,1z>bُ+]Pw<1pK#fc#5*K+*H|1*4snWMګJsMEfš&M4S̔N#!SȣB2pq.ΐd yKͦ7&(q189@ jwHN E.ʑK,"hJ-]*vMɥft4=Q*4զ19ba/k F1~c#h!*膝R"dq:8*7&cJWcѴ"tEzdGJϐ\ۙAe I'*:uW4{vab)nssjOA;)dq1H؁{lc'A1Y!\v.~mێgycשּׁJtbNol@`$'9YӁnjH,V0q`k$(6예e$,~]_{H̏Yk;d,DUsȫ*%{IF4+׮1E9&5U^`(%ltfQNHݼ,߹ۛ+* mʦl7i(gux/ΝT d2}oYurI. tsyim[ c=+˘C塏ЗhCiMN &gH8-o<1i:(1k:a8,< 4oYI"16F-/Ӝx{+~("0s>x`_/qpU+', xC<{˴ C TgK>LQ$K׫s&S5섈P$hƖJGb\;v rT‡K0 *u}܊jO1 -Ia_6Q|Hj#YN]YҖ]g3G(SL#sTF3;]*$</MrWk..D%籠aaP*'9ikVܯ5#kmnQG(`UNARJ V2.30 ATARI ST !!! ======================== ==== English translation of this documentation below the German text ==== Endlich ist es soweit, die (immer noch) aktuelle Version von ARJ hat nun einen Auspacker auf dem ST. Dieses Programm basiert auf der Original-PC- Implementation von Robert K. Jung. Er hat diese Version "abgesegnet", das heit, sie darf als Freeware verbreitet werden. Also: Jeder, der mchte, darf ein Kopie machen und uneingeschrnkt damit arbeiten. Es soll aber das gesamte Paket (mit Sources und Dokumentation, s. unten) kopiert werden. Sie darf nicht kommerziell vertrieben werden! Um UNARJ zum Funktionieren zu bewegen, mute ein "wenig" Arbeit getan werden, einteilbar in drei Teile: a) UNARJ.H: Der ST-Turbo C-Compiler fhlte sich nicht verantwortlich, den Path- Seperator korrekt auf "\" zu setzen sondern blieb hartnckig bei "/" (fr "Nichts besseres gefunden"). Dies habe ich korrigiert. b) ENVIRON.C: Dieser Source-Text stellt die Portable Basis mit Zugriffen auf die (Disketten-)Hardware bereit. Leider benimmt sich ST-Turbo C etwas anders als das PC-Turbo C, als das es fehlerhafterweise erkannt wird. Hier muten vor allem andere #include's herhalten und die Implementationen wurden z. T. komplett ungestrickt auf ST-Hardware-Konventionen. c) UNARJ.C: Die Option "X" (auspacken mit Ordnern) funktionierte zwar theoretisch, aber leider nicht praktisch, da der Befehl Fopen leider nur Dateien im gleichen Verzeichnis erzeugen kann, sobald es aber "in die Tiefe" (also z. B. ein Unterverzeichnis tiefer) geht, klappt das nicht mehr, da die ST- Version das ntige Unterverzeichnis nicht selber erzeugt. Von daher wird nun bei Bedarf das entsprechende Verzeichnis erzeugt. [Eigentlich gehrt dieser Hardware-Zugriff in ENVIRON.C, aber die Aufdrselung wre noch komplizierter geworden, als es nun schon war. Sorry! :-)] Des weiteren ist die Option "V" (Verbose List - Listen mit Pfadnamen) hinzugekommen: Sie zeigt die vollen Dateinamen, ohne Schnickschnack wie "Lnge ungepackt" etc., nur die Kompressions-Rate wird mit ausgegeben. Diese Option ist nun voreingestellt, weil ich diese Ausgabe fr sinnvoller halte als "L". Es liegt in der Natur der Sache, da diese, von mir modifizerte Version nicht mehr portabel sein kann. Wer sowas sucht, sollte besser die Original-Sources nehmen, die ja auch beiliegen. In dieser Package befinden sich die (modifizierten) Sources DECODE.C (nicht modifiziert) ENVIRON.C UNARJ.C UNARJ.H sowie das Executable UNARJ.TTP und diese Dokumentation UNARJ_ST.TXT. Hinzu kommt noch die Turbo C V2.0-Projekt-Datei UNARJ.PRJ die dann den Rest erledigt. Damit es hinterher nicht wieder heit, ich htte Programme ohne Dokumentation weitergegeben, ist noch die Original-Package UNARJ230.EXE von Robert K Jung dabei, die die Dokumentation und die unvernderten Source-Texte zu UNARJ enthlt. Diese Datei kann recht einfach mit "UNARJ e UNARJ230.EXE" ausgepackt werden. Viel Spa mit dieser ST-Version. Robert K. Jung hat mir versichert, da das ARJ im nchsten Jahr als ST-Implementation erscheinen wird. Ich werde mich zuknftig um die Sache kmmern, einfach mal anfragen. Gero Zahn, Sophienstrae 8, W-3060 Stadthagen, Deutschland Internet: q92127@pbhrzx.uni-paderborn.de Robert K. Jung, 2606 Village Road West, Norwood Massachusetts 02062, USA Internet: robjung@world.std.com, CompuServe ID: 72677,445 ====================================================================== English translation - please excuse my poor English! ====================================================================== Finally it's done, the unpacking-utility for the (still) newest version 2.30 of ARJ works on ST-computers. This compilation bases on the original PC-implementation by Robert K. Jung. He allowed to spread this package as freeware, which means that anybody who wants to can make a copy of it and use it without restrictions. It's important to copy the complete package (with sources and documentation, see below). The package mustn't be sold! To make UNARJ work it took a "bit" work, in three of four parts of the source-text. a) UNARJ.H: The ST-Turbo C-compiler didn't feel responsible to set the path- seperator (correctly) to "\" but it set it to "/" (for "didn't find anything better than that"). This has been corrected. b) ENVIRON.C: The source represents the portable basic I/O-routine on the (disk- )hardware. But also in these things ST-Turbo C behaved a bit different to the PC-Turbo C, and (even worse) - the pre-processor-code of UNARJ found no difference between these two completely different compilers. The first thing was to replaces the #include's, the second one was to re- implement some pieces of code again for the ST-hardware. c) UNARJ.C: The option "X" (extract with folders) should be able to work, but the ST- reality is again slightly different: The Fopen-command works only for files in the same folder, but if it's necesary to create a file in a folder doesn't exist yet the ST-GEMDOS doesn't do its work. So it was necessary to implement a routine that creates a folder when needed. [Actually this is a piece of code concerning the hardware, so it should be in ENVIRON.C, but this would have been much more complicated to implement. Sorry! :-)] By the way - UNARJ has been improved by another command-line-option "V" (verbose list with pathnames). It shows the complete file-name without making fuss about "length unpacked" or such things. Just the compression- rate is shown on screen. -- This option is the default-one because I find it more important that "L". There's no doubt about the fact that this modified version is no more portable. If you look for something like that you should use the original sources, which are part of this package as well. This package contains the (modified) Sources DECCODE.C (not changed) ENVIRON.C UNARJ.C UNARJ.H and the executable UNARJ.TTP and this documentationn UNARJ_ST.TXT. To recompile it I've included the project-file UNARJ.PRJ that will do the work for you. Because it's a fine piece of personal style to copy documentations with the programmes I've also included the Original UNARJ230-Package by Robert K Jung UNARJ230.EXE containing the original-documentation and the unchanged sources of UNARJ. You can extract the archive by simply executing "UNARJ e UNARJ230.EXE". Have fun with this ST-version. Robert K. Jung promised, that the ST- implementation of ARJ will be developed during the next year. I will take care of this in near future, just contact me! Gero Zahn, Sophienstrae 8, W-3060 Stadthagen, Germany Internet: q92127@pbhrzx.uni-paderborn.de Robert K. Jung, 2606 Village Road West, Norwood Massachusetts 02062, USA Internet: robjung@world.std.com, CompuServe ID: 72677,445 . w\.. FUZZYUHRACC :/&FUZZYUHRRSC .JFUZZYUHRTXT /1` ``>>> TURBO-C <<<< for ATARI-ST Version 2.0 (C)88-90 Borland International &H f&op`B@#3 k # Ј<.@#Jyg<"@(I$k,"Jf"JfB// ?<?<JNAO A6<HCBB`6 !jBJ)gHiRC` "fSI "WJAkHiRCBSQJ)gHiRCHy`$ON0 J"LN? 9g @N 9g @NN:?<LNA/ E09J@g S@g(S@gF`dHyHyCAr0*N,PO`BHyHyCAr0*N PO` HyHyCAr 0*NPO$_NuH8OE\GI09g JNB09gBCHÇ HC|g|g |g|f "K LN `"|g| f C LN ` C LN B@|;b2@0;Nx&&C LN >`C LN 0`C LN `C& LN `xC0 LN `jC= LN `^CJ LN `RCS LN `FCX LN `:Cg LN `.Cs LN v`"C LN j`C LN ^` C LN eR*C LN >B@*|b@0;N2@N\jx2@N\jxC LN `C LN `C LN `C LN `C LN `xC LN `jC LN `^C LN `RC LN `FC LN t`:C LN h`.C LN \`"B@*?BA?BB*?C LN\O LN (`"LAN nC LN dC LN Sjfjfm Ltj^2*0*hN 5Df`H0*fgBBDB`"LAN $C LN C LNSjfjfm Ltj^2*0*hN BjfOB@N,EVGIKHyVHyTHyR"M jNlO ??????42B@N"O ????p??4H…T2HUNO ???4rB@ jN~\OB@ jN6_@fBgBg???4BA j0NxO M0r jhgBVr jhg<r jhg<Vg BnNNp jh:g=|`Bnp jhg=|`Bn????p??4H…T2HUpNO ??????42pN O L|NuH0ON 6EJ@fApN$`bJClApN`PA*NJ@g,GHyHyCAN.PO7@ABAB@N kl&Bgp??+?+?+4+BA kp N O BS` 0@7RS S m7|HyCAN XO"K KBBr0+N Nr0+N r0+N ,A70N zBkHyHyHyHyHyBg?<BgBgBgBgBgBgBgBgBgBgBg"KA.BBBAp0N O.8r@g W(fNN`AHpN BAB@N 8`N |O L NuA(p"@ "BypA1B3p3rO"Nu/ Hz?<&NN\O$_Nu/YOM, IC HzaXO VBXO,_Nu"VS@eQ,NuH8]O$H&I(o&BCx%p JR@g2fJ@g@HNBEg>BA< <b;k`|<*f<`&<0< b ACp aF$Wb<gt<.f6<*f4`$<0< b ACp a$Wb4g<߲<Lf g`<hggr@dp|?@0;N`````N`N``````````````````````````NNN````````````````` [0`|A`0A2"LaN@`\ [2"LaL@`JJEj `p0?4 La"TO@`*JEj `0H?4 LaTO@` JEj `p0?4 LaTO@`JEj `p0?4 LaTO@`@HN0\OLxNup24C8jxA aA pJWF@?@gA 2SAktaSb (Q2/@4/(jt@jtBgf 0Ao@@Alx?B?D`hH0$H&IB(v`H0$H&IvJWFCJBj4Cb6xJAkCc8Cf K0a0 JN` 0 JN0 Kap0DL Nu6x0/g f@ JaP0/g@AN0/g@ Ja,0/g@A N0/g g@ Ja0OLNuH0E6`H0E4&H6g8Kg SC JpNQ J0|gNL Nu00000000 JgJgJgJgJg JgJgJfSHggggg ggf @Nu g<g8g4g0g,g(g$g ggggg ggf @Nu"HJgJgJgJgJg JgJgJf SNuH0$H|g|$bGrtgJ3kSJgtJ@f"p <0f:pgb<߶<Xf(pf"`N|f<0fg><߶<Xfg.G*3d"3d&HCHCJCfԃԁd` & gSJ"L Nu3"p` 3!p& g"`//"4UB|"bZC"t&HCJCf&HC;0NRBH@B@H@f`$?&8BCHC06H@0HC;0&RBJf8QB" _&Nu3!`0123456789abcdefghijklmnopqrstuvwxyz/ Gt g/ &S?<INA\O`Gx g/ &S?<INA\O`&_Nu@@@@@@@@@@@@@@@@@@@@@@@@@@@::::::8888888888888888888866666644444444444444444444@  !"#  !"#"H?<,NATO2<?@B)I<?IANu/ /A`Bh1|1A1Br'a(A"_2"_2NuA`Bh1|1Ar`/ /A`1|BhBh01A2r aAx"_2"_2"o2"o2NuA`Bh1|1Ar `C`3A03B23|CrtRB2fA`1Br`r3l/ C`2dBi3| Cp 2Q"<psNB _0lA"op,2QAxp 2QNu`x1@ 0"<|psNBA0Nup `p`A00p`#x/ A00000 0 0000000000 pa\"_2"o2"o"2"o&2"o*2"o.2Nu#xA000000p*`#xA0000000 0 p/`#x3p2`#xA0000000 0 0p3`/ #xp6a"_2"o2"o2"o 2Nu#x3p4`n#xpn`b/A00ppaP"_"xNu3#xp#`4/ /pMa*"_2"_2"o2"o2Nu#x3pN`3`@@A CbB@22220<"<NBA0Nu`~xx bald fast punktkurz nachfnf nachzehn nachviertel nachzwanzig nachfnf vor halbfnf nach halbzwanzig vorviertel vorzehn vorfnf vorkurz vorEinsZweiDreiVierFnfSechsSiebenAchtNeunZehnElfZwlf%02d:%02d:%02d[3][FUZZYUHR ist |ein Accessory! ][ OK ][3][Init-Fehler! ][ OK ]FUZZYUHR.RSC FUZZYUHR V2.0 [3][Resource-Fehler! ][ OK ]`xr  & \8nJ~ ~.P$  j& ,$ , p$FJAnAusFuzzyDigitalOKKleinMittelGroFuzzy-Uhr V2.0 - (C) Gero ZahnEntwickelt in Turbo-C V2.0, 14.9.19922OPPX_OGBEHRPWP_Om& $  $' +19   < B I N Dokumentations-Datei zum Programm FUZZYUHR V2.0 ----------------------------------------------- F U Z Z Y U H R V 2 . 0 14.9.1992 Die wahrscheinlich 1001-te Desktop-Uhr (fr die Individualisten unter uns) (C) Gero Zahn, Sophienstrae 8, W-3060 Stadthagen Internet: q92127@pbhrzx.uni-paderborn.de Lieferumfang: ------------- - FUZZYUHR.ACC - FUZZYUHR.RSC - FUZZYUHR.TXT Sollte die .ACC-Datei fehlen, so kann man nicht allzuviel mit diesem Programm anfangen (ach was ...). Sollte die .RSC-Datei fehlen, so luft ebensowenig. Sollte dieser Text fehlen ... ach was, Du liest ihn ja gerade. Ohne ihn jedenfalls darf FUZZYUHR nicht verbreitet werden. -- Wenn Du aber beide Dateien zusammen findest (wenn's geht im Ordner FUZZYUHR.2_0), dann kannst Du sicher sein, da Du ein gutes (Bier?) Programm erwischt hast, denn das Ding ist PD, das heit, jeder, der will, darf sich eine Kopie davon machen. Die aktuellen Updates (wenn erschienen) gibt's entweder bei mir direkt oder auf einem der bekannten FTP-Server (Kln, Paderborn, etc.). [Wem das nichts sagt - hat mit der Verbreitung ber Netzwerk zu tun, ist auch nicht weiter wichtig.] Entwickelt wurde das Ding brigens in Turbo C 2.0; normalerweise schreibt man in einer neu erlernten Programmiersprache erstmal ein Programm "Hello World", bei mir war's halt anders ... Aber jedem das Seine. Unterschiede Version 1.0 zu 2.0: -------------------------------- - Eine Fuzzy-Stufe mehr - etwas genderte Aufteilung der Fuzzy-Stufen - weniger Speicherplatz-Bedarf - optional grere Schrift - GEM-Konfigurations-Box (fr's Auge) Known Bugs (bekannte Kfer): ---------------------------- - digitale Uhrzeit nur alle 2 Sekunden (zwar jede Sekunde, aber nur alle zwei Sekunden exakt) -> "Fehler" im Betriebssystem - ST Low / Let'em Fly: Die Farbe des Mauszeigers ndert sich nach Verlassen der Dialog-Box. Warum war nicht herauszufinden, das selbe Problem haben aber auch andere Accessories, die do_alert oder objc_draw verwenden. -> Wohl eher Fehler in Let'em Fly als in FUZZYUHR. Hardwarevoraussetzungen: ------------------------ FUZZYUHR ist unter allen drei ST(E)-Auflsungen und unter verschiedenen TOS-Versionen (1.0, 1.04, 2.05, KAOS 1.41, MultiTOS-Beta) getestet und fr lauffhig befunden worden. Es bentigt im Speicher ca. 12 KB. Ich vermute, da sich auch in anderen Auflsungen keine Probleme ergeben drften, da nur dokumentierte VDI-/AES-Routinen verwendet werden. Von daher sehe ich weder auf exotischen Grafik-Karten noch auf TTs oder Falcons Probleme auf mich (bzw. FUZZYUHR) zukommen. Mehrere Leute besttigten aufgrund der Version 1.0 diese Annahme. "Und was soll das ganze? Ich habe schon lngst eine DESKTOP-Uhr ... !" ---------------------------------------------------------------------- Kann schon sein, aber ich vermute, keine solche wie FUZZYUHR. Als Anregung nahm ich ein Programm, da ich auf der 92'er Atari-Messe auf irgendeinem Stand gesehen habe. Wie ich heute wei - das Ding war PD, aber ich wute nicht, woher und wie ich's kriegen sollte. Wie dem auch sei: Ich bin glcklicherweise in der Lage, solche Programme selber schreiben zu knnen, wie ich finde ein gelungener Auftakt fr meine Laufbahn (?) als C-Programmierer. "Nun red' doch nicht immer um den heien Brei herum!!!" ------------------------------------------------------- Gut gut, Du hast ein Recht zu erfahren, was du eigentlich gerade vor Dir hast. Wie viele andere Desk-Accessories blendet FUZZYUHR eine Uhrzeit im rechten (freien) Teil der GEM-Menleiste ein. Aber - Computer sind sehr genaue Kreaturen. Normalerweise wird die Uhrzeit digital angegeben, also zum Beispiel "19:37:52". Was in aller Welt soll man mit einer so exakten Uhrzeit?!? Im Zuge dieses Gedankens hat selbst Atari bei der Kreation der XCONTROL-Box umgedacht und die Uhrzeit ohne die "strenden" Sekunden dargestellt. Ob dies nun sinnvoll war, weil man mit dem Ding die Uhrzeit immerhin auch noch einstellen will, sei mal dahingestellt. Trotzdem - selbst die digitale Minuten-Darstellung ist noch ziemlich genau. Eigentlich bentigt man so etwas auch nicht einmal. Stellen wir uns folgende Modell-Situation vor: Zu vorgerckter Stunde fragt man (in "leicht" bierseliger Stimmung) seinen Stammtisch-Nachbarn nach der Uhrzeit. Der lallt einem freundlich entgegen "Viertel vor zwei!", womit eigentlich alles klar ist. Seien wir mal ehrlich: Auf die exakte Minute kommt's doch gar nicht an. Auerdem hat sich die Menschheit so sehr an Digital-Uhren gewhnt, da es gar nicht mitanzusehen ist. (Wer mir dabei nicht zustimmt, mge doch bitte mal das Buch "Per Anhaler durch die Galaxis" von Douglas Adams zur Hand nehmen und die ersten paar Kapitel lesen.) Um genau diesen Mistand zu beheben und damit (a'la Ren Descartes) "Zurck zur Natur" zur kommen (jeder mge mal ein paar Schriften dieses Philosophen lesen), schrieb ich FUZZYUHR, ganz im Zuge der momentan aufkommenden "fuzzy-logic". Fuzzy-Logic: ------------ Fr die, die nicht wissen, was "fuzzy-logic" bedeutet: Das Wort "fuzzy" steht im Englischen fr etwas, das man sinngem mit "unscharf" bezeichnen knnte. Man geht also weg von der blichen Schwarz-/Wei-Malerei bzw. von den normalen Computer-Akzeptoren "wahr" und "falsch" hin zu vielen Zwischen-Stadien, wie zum Beispiel "grau" oder "halb wahr". Dies knnte ein Schritt (zurck) zu den Analog-Rechnern sein, doch wir leben bekanntlich im Zeitalter der Digital-Rechner. Einem Computer der letzteren Generation so etwas beizubringen, ist natrlich mit etwas Aufwand verbunden, aber das hat uns Programmierer ja sowieso noch nie gestrt - genausogut knnte man den unsinnigen, vllig utopischen, Versuch unternehmen, einen PC-Kompatiblen mit einer Maus auszustatten, den Speicher linear zu adressieren, eine grafische Oberflche auf das DOS aufzupropfen und da mit Icons und Fenstern umgehen. -- Was, das gibt's schon?!? Naja, sage ich ja ... Ein Schritt zurck auf die Bume. (Meiner Meinung nach, war es schon ein Fehler, da die ersten Lebewesen das Wasser verlassen haben und auf die Bume geklettert sind. Aber das tut (ebenso wie "Kleine-Weiche Fenster") zum Glck nichts zur Sache.) Wo war ich stehen geblieben? Ach so, ja ...) Wie gesagt, der Trend geht zurck (auf die Bume) zur Unschrfe, ein Beispiel ist nur die Angewohnheit, Uhrzeiten nicht "mega-genau" nennen zu mssen. Und genau dies versucht FUZZYUHR: Wenn die Datei FUZZYUHR.ACC im Hauptverzeichnis des Bootlaufwerks gestanden hat, als der Rechner neu gestartet wurde (man kann es auch gerne mit "The Chameleon" oder unter MultiTOS mit "ACC FUZZYUHR" nachladen), erscheint in der rechten oberen Bildschirmecke ein sehr kleiner Schriftzug, der die aktuelle Uhrzeit reprsentiert (wohl denen, die eine batterie-gepufferte Echtzeituhr haben). Uhr-Darstellung: ---------------- Aber bei FUZZYUHR erscheint dort zum Beispiel nicht etwa "19:54:34" sondern (um bei diesem Beispiel zu bleiben) "fast fnf fr acht". Und diese Darstellung wird sich mit der Zeit ndern, bald zu "fnf vor Acht", dann zu "kurz vor Acht", dann zu "punkt Acht", dann zu "kurz nach Acht", dann zu "bald fnf nach Acht" und so weiter. Weitere Funktionen: ------------------- Klickt man den Accessory-Eintrag "FUZZUHR V2.0" im Desk-Men (richtig, unter GEM das ganz linke) an, erscheint eine se kleine Dialog-Box, in der die ntigen Einstellungen gemacht werden knnen: Fangen wir ("mad", wie wir sind) rechts an: OK - Alle gemachten Einstellungen werden aktiviert. Welche das sind? Weiterlesen!! An / Aus - Hier (sptestens) solltest Du Dir klar werden, ob Du berhaupt eine Uhr sehen willst oder nicht. Naja, besser spt als nie. Nach OK wird die Uhr entweder ein- oder ausgeblendet. Fuzzy / Digital - Wem die Fuzzy-Darstellung nun gar nicht gefllt, schaltet mit "Digital" auf eine konventionelle (=digitale) Uhr-Darstellung um. Man kann's auch als eine Art "Boss"-Key verstehen, der eine Fuzzy-Uhr nicht sehen soll, weil er sie ja doch nicht verstehen wrde (womit ich nichts gegen irgendwelche Bosse gesagt haben will). Klein / Mittel / Gro - Tester der Version 1.0 legten mir nahe, eine solche Option einzubauen. Diese Version lief auf allen Auflsungen sauber, allerdings bentigte man sptestens ab TT-High eine Lupe, um die Uhr erkennen zu knnen. Von daher gibt's nun die Mglichkeit, der Uhr selbst eine zu verpassen. "Klein" steht hierbei fr die Micro-Darstellung, die schon von der Version 1.0 bekannt ist. Sie entspricht dem 6-er TOS-Zeichensatz. "Mittel" verwendet den 8-er TOS-Zeichensatz, ist demnach schon ein gutes Stck grer und lesbarer. "Gro" steht fr den 16-er-Zeichensatz, den man vom SM124 her gewohnt ist. Sauber, wie FUZZYUHR seit Version 1.0 geblieben ist, funktioniert das auch mit diversen Font-Change-Accessories zusammen. -- Ehe Anfragen kommen: Der "Gro"-Button wird entfernt, sobald der 16-er-Zeichensatz nicht mehr in der Menzeile dargestellt werden kann, also zum Beispiel fr ST-Med oder ST-Low. brigens: Die digitale Uhr ndert die Uhrzeit nur im 2-Sekunden-Takt. Gestreng nach dem Motto "It's not a bug, it's a feature!" (nach dem sich viele Software-Firmen verhalten, wenn die User eine Unregelmigkeit im Programm finden) -- das geschieht aus technischen Grnden und ist nicht weiter schlimm, eher sogar normal. Kompatiblitt: -------------- Wie bereits erwhnt - ich sehe keine Probleme, da FUZZYUHR unter irgendeiner TOS-Version und / oder unter irgendeiner Auflung nicht funktionieren sollte. (Sollte dem doch so sein, bitte ich eiligst um eine Information, Postkarte mit der verwendeten Konfiguration gengt.) Kollisionen gibt es natrlich, wenn auer FUZZYUHR noch andere Desktop-Uhren installiert sind. FUZZYUHR ist so eingerichtet, da ca. jede Sekunde die Text-Meldung erneuert wird. Das gengt der Genauigkeit ca. 60 Mal und man braucht auch beim Wechsel der Applikation (=der Menzeile) nicht allzulange auf sie zu warten. Das kollidiert aber leider zum Beispiel mit der internen Uhr des Tempus-Editor, die auch jede Sekunde erneuert wird, und (meineswissens) nicht abschaltbar ist. Witzigerweise sind die beiden Uhren (Tempus und FUZZY) nicht synchron (zumindest bei mir nicht), was zu witzigen, wechselnden Flacker-Effekten fhrt. Naja, ist nicht zu ndern. Wen's strt, kann ja die FUZZYUHR ausmachen. Ansonsten sehe ich keinen Grund, noch andere Uhren (Mortimer, Harlekin, etc.) verwenden zu mssen, man erhlt mit der FUZZYUHR ja sozusagen "Two In One", eine fuzzy und eine digitale. Das leidige Thema: ------------------ Wie schon beschrieben ist FUZZYUHR public domain. PD heit aber nicht Freeware. -- Das ist doch kein Unterschied?!? Na, ich denke aber doch!! "Freeware" steht (frei bersetzt) fr "Freie Ware", also gratis, umsonst, fr lau ... Whrendessen steht "Public Domain" fr "ffentliches Gut", also etwa "fr jeden zu haben". Man verzeihe mir die fremdsprachige Haarspalterei, aber im letzteren Fall steht eben *nicht* dabei, da das Ding kostenlos ist. Jeder PD-Autor wrde sie freuen, wenn er ein bichen klingende Mnze (oder knisternde Note ... noch besser raschelnder Blanko-Scheck --- aber wir wollen's mal nicht bertreiben) einbringen wrde. Rechtlich gibt's fr die User keinen Zwang, aber ich appelliere hier einfach mal an das Gewissen. In diesem Sinne: Ich htte ganz gerne etwa zehn Mark von jedem User. Ist doch wirklich nicht zu viel, fr die Gelegenheit, immer "fuzzy-genau" zu wissen, was einem die Stunde geschlagen hat. Noch was: Ich freue mich (auch ohne beiliegende Kohle) ber jede Art von Resonanz. Ein Brief im Sinne von "Das hatte mir wirklich noch gefehlt ... !" hebt meine Stimmung doch erheblich. Mu ja nicht mal ein Brief sein, Postkarte gengt. Auerdem freue ich mich im kargen Alltag des Studiums ber jede E-Mail, die ich kriege -- kostet doch wirklich keine Gebhr, also was soll's?!? "Ich warte!" (wie schon Claire Zachanassian in Fr. Drrenmatts Drama "Der Besuch der Alten Dame" zum Ende des ersten Aktes sagt. Aber das hat hier eigentlich nichts zu suchen.) In diesem Sinne: 23:55:42 (fnf vor zwlf) -- Zeit zum Handeln! Gero Zahn Stadthagen, den 14.9.1992 . ʽ\.. EXTENDERDOC Ck6EXTENDERPRG Fk/ **************************************************************************** > BEDIENUNGSANLEITUNG: 'EXTENDER.PRG' V 1.0 /92 < Dieses kleine Programm dient zur schnellen nderung von Datei-Endungen. Effektiv anwendbar ist 'EXTENDER' jedoch nur bei greren Datei Ansamm- lungen. **************************************************************************** Zur Anwendung: - Alle Dateien dessen Endungen gendert werden sollen, mssen sich in einem Ordner befinden. Dieser Ordner darf sich nicht in einem weiteren Ordner befinden! - Den Schreibschutz von der Diskette entfernen, auf welcher sich dieser Ordner befindet und dann das Programm starten. Das Programm bentigt nun vor der Ausfhrung folgende Angaben: (..zum eingeben der Werte, mit der linken Maustaste auf die entsprech- ende Eingabezeile klicken und dann die Tastatur benutzen...) 1. In Laufwerk: Hier das Laufwerk angeben, in welchem sich die Diskette mit dem oben erwhnten Ordner befindet. 2. Aus Ordner: Hier den Namen des oben erwhnten Ordners eingeben. 3. Mit Endung: Hier den zu ndernden Endungs-Type eingeben. 4. In Endung: Hier den neuen Endungs-Type eingeben. Wenn alle Eingaben korrekt sind, kann's los gehen! Atari-Taste: 'S' startet die Ausfhrung, 'H' stopt die Ausfhrung, 'F' erlaubt einen Blick auf den Disk-Inhalt, (dient also nur zu Information) 'E' beendet das Programm. Nach einem Tastendruck auf 'S' durchsucht das Programm den betreffenden Ordner nach Dateien, dessen Endungen identisch sind mit dem Eintrag von: 'Mit Endung:'. Bei allen gefundenen Dateien werden nun dessen Endungen so gendert, das sie den Eintrag von: 'In Endung:' erhalten. Das war's! P.s 'EXTENDER.PRG' darf gnadenlos kopiert und weitergereicht werden. Klaus Reichel `.,@V&AON a*?<NATrAЁAa hpapapapap aaE.2pa .traE.Op a "HAat=raE.\patMraE.upat]raE.patmra~E.pa4<rahE.pa4<raRE.pa4<rag pAAaAt=rxa6a*~SWHH/a*Lr nBa*RrAnBa*4mBa*8rQ]HHgzpafpa(&pa(AavCa2Ar a$Aa!$aXCaAa)gE.ip AaE.p atMrxaAtMrxava)SWHH/a)r nBa)rQnBa)tmBa)xra]HHgzpapa'fpa'XAaCarAra#TAa daCaTAa(gE.ipAa,E.pat]rxaAt]rxaa(SWHH/a(r nBa(ranBa(mBa(rq]HHgzpapa&pa&AaCaAra"AaaCaAa(gE.ipAalE.paXtmrxaAtmrxaApEapad`6E/'pa(/E/Cpar"_ta+A8p8fNNuE/Spa4<2<aE/Vpa4<2<a~E/Vpa4<2<afNuE/dpaCa&/a"HA,a!Jpa0rHGGdHGGdSWDуdi?<>0rHGGdHGGdSWDуdi ?<>0rHGGdHGGdSWDуd&2 H@kփAр[SBkփejRAd RdQRBJjDBNutNu?<,>CEdGH@0r`xJCgz?<0rÐdSWЃdi?<0rÐdSWЃdid?<0ÐdSWЃd&2 H@kփAр[SBkփejRAd RdQRBJjDBNutNu?<0riR?0i?`?<`"_K/lMJI O:HQ <-H*,`N,+d d3 d# d# # d# # # # d ALH dAL H LH d AL`H L|0H>L|H>d~# # # # A`@ALH L|H>L|H>L|PH>L| H>L|H>L|H>L|H>L|`H>L|0H>L|H>QL|Nu$H$&"BA -KaXA"f B &nNuH>dd2d"d""d""""d LHC dLHLH C@d LHL|H| L|H|PCd~""""C`:LHL|H| L|H|PL|H|L|H|L|H|L|H|L|H|@L|H|pL|H|L|H|CQL|Nu`Na8A-Hhp apMa=@F?<NNTT@A0r p0Q`pdr ta0.F=@=@ACp,2QAp 2Qa a:``peahp`(p?a(arapaHz?< NA\?<LNAfCR2A0A82r22a "<0<NBLNurt=@:=A@=B2::(   F..26"8@"PQ1!P1P!0PP`0  q#p"AӘQNuA Nu|^|  R^,T:Hz(` NjHz ?<&NN\Nu9VgNuWVNuaaaa O: n*NNuNuNupc?a0QNurdAd6Ag,B(dB(dH Ac<a tgBAp` NuNu?<OA`d?<IA`Z0<H IaLt Ig Og Ug Ag Rg*afNup`ap`0a fHRa>Er$Wgr STD:gr COM:g r LPT:f2FA$_0=@D~CA0< Bha B2"pNu$_AF Ge><QBAFpNuahgzp=` a\gzpaTaRFBd&8*L?a<aSF Be BgQRB`RAdR e <rRF&0xaCձfEv+0JFjDFv-Hƌd0BFHF 0HF0ANuprt|`HQ2.d Aeg>r C 5e&!R 0c 9c0`<R"_`VC0 Ef"_Nuaa/ CFr  g 00VJAgB @ nN @mHJ@j0.4DBUBk0QSAg Q.`S@k 0`0BAF "_Nu.WAkQA 0g` @$@JfS a J`QNu$Aa ,`QBNu?a HQA(B?<NNAP DJNu?<ONATNu?</NATNu/?<NA\NuHPHQ0(ika $I _a IUd4Id4Id$Id `$$$$Q _Jf,a Id4Id4Id$Id `$$$$Q @NuSa bIdIdId`Q @Nup `B/ a *$I> _a G` VNuag`af`ae `ac` acpNuadpNu/ a$I> _a4Ae4v` VfANuHP0(R@kBa $I _aIUd4Id4Id$Id `$$$$Q @JfNuNup `alSAfNuag`af`ae `ac` acpNuadpNua8SAkfUANuH HPhkJa* $I _aIUd4Id4Id$Id `$$$$Q @JgSL`QNup `a̰Af` VNuag`af`ae `ac` acpNuadpNua4@m4v` Vf@Nun\n^648HH`prt`n\n^n\n^8HH`prt`"_A `4RB`"_A42L\A` L0GF11Q-p`prHQ`xBp'rtaj n2rt6(SC0(S@apaB\papava0pa _a~4$FAFp_@[000][vx`* [g" ]g |g QSx` xQSrQ][vx`* [g" ]g |g QSx` xQStQ]BAF0-H,=@p4a>2HNu <}a$Ia `t$XaH`a:HR?<NNT @"_ <}Nuvn\n^~Ha0 @xepw2AtE4*jDjHB t`0QTAtp =| D`a"`QNuHg"cc/ 0)a _$PS@kH2QNu2(g$PRAA4DBH%$Y2Pg 1AHRAA%NuBhNu~dGdEH<Nup` 0@F@AJhg PLNu` LJg(HPBHh/??<@NAXLf ѨLNuJkp%` aJBja!| ??<>NAXOJkpNu0< aF`0< CF2p`p a0`p CFp`aCF"p`Hza `Hz"J`pB.@=|DNua.@FpAR@C`N B.@=|DNuB.@a=GDgNup` a`aCF"E p`.@<.DAp$I"t Q k"RGef~`SG * g *fSG`<.DjZ\FkBJn`g Fgd Fg^HS&I.aQ`p???<NM\Qj&_NuHQ/?`jAF gp gj g grffnnpenbfJ.fj6pRGFc$SG` J.fjpRGFcRF` Ff`> `?~ap a0p a*0Nu|``CpE`bf`FgRGJGgSGSFFgCpE`Yf`Nua@Jf gH@ fa(@ fza0 b @ Ee0NuargNu4.rf?HyaNM\Nu=|D`LjazEfpadppa`AFEg0PaEfaFRE`ܾEfp a@a8?nnnp a2RF`<a^nnoS@f nhfSnl=Ah=FnNup` papq4.rf?HyaNM\Nu=|DHa:LNu|A0"P2(@e2<EF`QHP=|DJ@g$abAF$HpR@ 0 f _a`QNuHPp?ap a| _2<|0`C&pHQ/Hy@NA NuC pa:NuHQ/Hy?NA Nu&g4 FgagJAga2< R@AdSf0Nu0ap Ce`&g4 FgaJBjagPAe CbRa R@Sf0Nu FgRaZg JBjalAeaJAg RP0 pNu` Fg6a"gJAga @ea,RP Nup NHѨB?<?/?<BNAO JkLLNu&8aJBjaJAg Df*ڃkd0Nu DfրBH??/?<BNAO LJk!@NuHBHh Hx??<?NAO LJo ѨLNuk:fp`^k: g ѨNuBHPHQ/??<?NAO _JoѨfNuBHPHQS/??<@NAXLfѨNuJkp%`B9X`$H EaAX AerQBL@͉H Ia&"H _/ aaR _/ ?aHAF-H AerQB2"_A&-H A e ` \gQBa9XgaZe -|Xp[`pZaajAF"H0.g "Hg \f`A&fS !.gR EF _a`QNuHz?<&NN\ @Nu x NuA@Bh`A@a n@!|}Nu?a0` ?a2@@a`` a Nu4.`Af n2LR@RANu4.`g S@SAHNutbpbr??papYa0a0`z/jpE~JgP`LJg&B.C`a8aD*9fap-I,=|p4aHz*9g ENp9~` _a &nO:NMJI K/l$<Nu[1][Error +111][Return]E/j g g>Jf`Ar Hjr-D@Hd0H@H 0H@0CNuAF"H [1][fSEfNu9~HHNu9`aJANuag `af`apNuapNuaP n2L6(n\n^HHHNua0 n20(n\HNua n20(n^HNua n20(HNua:ffNuarNua J[HHNu:nfa@ z^0NuJg6$:Pf,H?<"NNT&@p/&.ra :,ga &Lr`r??Q@.HyNM\0Nu#.Nu .*Nufndert alle Datei-Endungen...In Laufwerk: Aus Ordner : ________.___Mit Endung : ___In Endung : ___Datei Anzahl :Alter Dateiname:Neuer Dateiname:S = StartH = HaltF = File SelectboxE = Ende |Programm beenden? JA | NEIN \????????.|Ausfhrung nicht mglich! ABBRUCH|SIEHE...* * :\*.* @L|0*.nR"V " f\((@Pp$t| *l $ ******************************************************************** Deze diskette is samengesteld door de Stichting ST, Postbus 11129, 2301 EC Leiden. Onze bibliotheek van public domain programma's omvat op dit moment (lente 1993) al meer dan achthonderd disks. Daarop vindt u programma's op elk gebied, van tekstverwerker en database tot de leukste spelletjes, de fraaiste tekenprogramma's en de handigste utilities. Ook bevat onze bibliotheek een speciale afdeling voor public domain disks met Macintosh software, die te gebruiken zijn onder de ALADIN emulator. Deze MAC-PD serie bevat tot nu toe ongeveer vijfendertig disks. ******************************************************************** U vindt in het twee maandelijks tijdschrift "ST" (Onafhankelijk tijd- schrift van en voor gebruikers van Atari ST computers) een overzicht en een bespreking van de inhoud van de nieuwe public-domain diskettes. Dit tijdschrift bevat tevens een bestelkaart zodat U vlot over de software kunt beschikken. De november/december uitgave 1993 bevat een compleet overzicht van de Public Domain bibliotheek op dat moment. De Stichting ST geeft ook een speciale PD catalogus disk (database met filenamen) uit. Deze public domain disk is geproduceerd en gedistribueerd door: ************** Stichting ST afd. Software Bakkersteeg 9A 2311 RH LEIDEN ************** Ondanks onze controle komt het af en toe voor dat een diskje niet goed is gecopieerd.Mocht U dit overkomen, aarzel dan niet en stuur de defecte disk aan ons terug. U krijgt dan direct een vervangende disk toegestuurd. ************************************************************************ Teneinde het voor ons mogelijk te maken om productiefouten op te sporen en vervolgens in de toekomst te vermijden, zijn alle disks, geproduceerd door de Stichting ST, voorzien van een groen productienummer. ************************************************************************