Q `IBMarlp !@!DI8<?<NNO"J@k|?nJAkֲ|n88?<NNT|n@8QHz?< NA\,xNA8<rp02(&N$IJ҂:HFE02(h|?op0$N$IJ҂<HFF0 60 4\Q 8g 8ffg`vNubY) vHi there is Bandit from the E.M.T Team!!If you want other swapps from us, pleasewrite to this adress: E.M.T #P.O.BOX 9 5424 Unterehrendingen, Schweizw]O`  @`! #@%`')+-/1 3@5`79;=?A C@E`GIMOQ S@U`WY[]_a c@e`gikmq s@u`wy{} @` @ ` @ ` @ ` @ ` ǀ ɠ @ ` ׀ ٠  @` @o!Aa   !Aa!!#A%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#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%SB%Ub%W%Y%[%]%_&a"&cB&eb&g&i&k&m&o'q"'sB'ub'w'y'{'}'("(B(b((((()")B)b))O`  @`! #@%`')+-/1 3@5`79;=?A C@E`GIMOQ S@U`WY[]_a c@e`gikmq s@u`wy{} @` @ ` @ ` @ ` @ ` ǀ ɠ @ ` ׀ ٠  @` @o!Aa   !Aa!!#A%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#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%SB%Ub%W%Y%[%]%_&a"&cB&eb&g&i&k&m&o'q"'sB'ub'w'y'{'}'("(B(b((((()")B)b))copySTar22bSOUND  IF 3DGRAPH PAS ]F pE73DGRAPH PRG iF GRAPHER PAS pF GRAPHER PRG wF 0IJCRYSTALL  F ]PACE_ST  IF   .  J F..  J FDEMO GRA KF DEMO MUS RF >2DEMO PRG VF KLESMICH DOC [F oHwGg'" QaSUdsG$ . VN8+h??(?Y??)?Y?????????4 o 4 {GGG2 '''9 ;@@ ;```8  ) 7" x?oxg="  ?ڰ _ U<<<     < X??? 8?@??   x??? p?p? ???     } ??? //////  x??߃????  !߃p X  ???@ ??? ???? ???   1 0  1 x 1 x  ! `` x ! `` 8?@?? ???! qq 8??? ??? ???? 8?? ??? ? ? ?? 8??? w  ? ????? 888w   8 ???   8 ?   | ??? ???  |     ? _%  %__  %? ?@??? ???@ ?@  ???@??? ?  9?? ? ??  ??  ??  ?? W2  ??c ?? ??w  n n 6& ??!;|x_ʩ _ʩ xpE??!???S {%!./û ????&ܟ$nI@__nI@__d$?? pp:??_X _X=B"'>>E ?? E??@@dd??U߱1PX?? 1PX??```ggϜb "0 "0gg  ?????????D`?P@QWP@QWÀ3O/?.O  'GaGAA ???   LL ? \# wG wGǟC߀LL .?pp?o( LL  11w< b MڢMڢY8?@??D߰ ^ ^m;x???输@ 输@o???̙22gg   }&,￀ ,￀??LL22gg7??7??X'?? ^^P ^^P33???C> > =??}Á}? y_O y_O+??kÁ  ?? (??aaÇÇ????Á | ?@@33 oǃ  ?????OO33;T V????ᙇ7?? W 5 ?? ////OO 0  ??????e" W aa ?? ?? LL ] ;@{? hO  ̙ __  c p   ????*f? q__ E?9O #zn S, ??@? :Sͬ2_ #?? }_ :D  3? {E :OXw ?? |?? : >/ #X{? öI?:]w X? ?:?38_ p? o_ ??u  g @   χII䙎J  ]=  ϓ22yy?0?  G?.?  aa33||gg_5?? / ? ?9  |0? w  ??? YX t7 ?? aadždž0p0pʎ}F| G ?????? >>$ $ dd܇xx Mڲ ; >>dd'']? t_S aaÆÆffpp?  O+ 9)/ G oe Gaa? B 6 @@" w .T OO"?S? jo? aa"{?VY_)*j_J*M[O)  ?? ?@_SO???)GϿG00 ?kv_ O)ÆÆ  LLx$$''̙̙??f  00*?0ooo+{{{?``Ç___www?營''??ooo ?w?w?w  ooo??>>||2?2?``Æ 3 >p>pWWW? p>p@@aq//? ~~DDqA >p>pa777?'2q@oa2  ??02 11 0ßs2 ]``<< ??O*  ``?? ۿۿ???*   == ?*  ?? ?? ?*  og?ǀ? ? Swhz{z??ckkk?O@G`99::: _?_~???gg>>ϟ?8<?????~g ?????g/ ??s?cg ??s0 ǃ????s@Cp?0ßs00ww9!3?OH@@11 ???AA;; g?8 AA||_  g?   {{ ssB???  ?? 9O?  ??9?!?zsz  ??~px i3????? ?? ?? **7 _?   ?  a g   `?'g????  O0cxx  o 0 ??    pxx9  ?? 1!kkk   ?uuu ?? 00 ? zsz~~~   ? ?3  73  3? ??   { @@ >>?? ߟ?@@@ 0 ??  AAAA  ?? ?? AA ? p?> ? ??????? ????pppwp??{ ~~{ >??>  ??_ޗK ޗK LL??_K K  22F LFwp??..{ \\{  <<< ???  @@<<<????p  @ ((@sss(( 3(|||| 3( ?2||( 2>x>HOH! 2xhoj>! 28(/+  ?#Ϩ/+pp  # ???????  [X???? ?!>??? X! ]P??? ?   ?  @ǿG  ?go'o@?   ?Xoo?? ˀ  ~~n>o~w ??~~n>o~ ~~n>o~|w }~l>nsspp'??}~l>n÷0wwpp}~l>nǷ~????wwppzhmϷ$@$ zhm @ ????;8yio{{@?? uak@ϿϿww???7 0 uak݀ ''8??wπ p s߽S_( ܀ ?? ?ݧ@ k׽CW(? ii> k!5???? l_ l_;;>>8Ϯ,,WFn?8888||p{=.,,V|Fo?????߀??????0oooPk@joj?{xx@C >x>oho'srr??aaaa882L L;||/ ??cccc0000````???? {/ _?1111 3OO??  ? {{;{{??  ??xx 㙿ww7ww??  >>www>>> z{wӯÏ? ?:::>>> tvׯ/? Ϝ>>> ln ''''????  ~__'''' ?? ~_??''''n؎ y___,,,,''''. LN߷7?__$$$$#### ߀?__$$$$      oo$$$$    }| oo$$$$    || ??>>v"v??,,,,    ~~ w w??,,,,@@@@>> 99 ((((@@@@>  ???8888@@@@??0000@@@@?0000@@@@??pW~VV @@@@???pW~VV @@@@???pW~VV @@@@???pW~VV ????@@@@??pW~VV ??????pW~VV ? ? ? ? pW~VV? ? ? ? W~VV~ ~ ~ ~ ?W~VV ~ ~ ~ ~ ?W~VV9| | | | >þ<ÀW~VV  | | | | C??>>"@@@ WT````C??~~<{{{ 888zz@````G??}|(;;;000||| aaaaG??}|$;;;<<<aaaa[[[???  kkk???^^nn}|~]~]???nn ???11{xgkk@@@$$$$ppppww>ggg@@@oooo XXXX,,,, =?=###''3???0```(((??????? mmmVVH?__?_30@@@{z^^^^^^3v03vH>2CCC^VVf<<|@@@yyyxvyxvH~x<~>~ ```?xxx>>@333x  ppp?cccc`???0|   ܀܀`|`  ?aCCC   a ` ~~~ @30 ` |   ppp؜.>P 0 @@ <<<Q.  ???` @@@ x ?8Wh   ` ` ` @??@???? ??? @ @  xxx ,?(qXXX  OOO  @@;;;;```< P ;@?000  ; ?9999000 (< 000    R,~ Xx xxxqqq0000   0  ~ |||QQ????  (> ߍߍߍߍNNNN8888????888uuu]A]]AwAAwAw]]]]77777777]A]]{{{{]]]]` ```uuu]A]]wwwaaaatttt0.ÎÎÎÎaaaa8888ݏݏݏݏvvvv????.ppp!( .`` P;  I?/+?||| I^oo@@@ xxxKY_O ` `ȃȃ( > @ ppp  `? 6&  ;00 xEpzr |Et 0 {ۜ% ۜ[۴%( ?p&  \ԃo`o0 dugȐ@"? :????po; sss=B"')R{_H~?,???` s@>y;p|?@:(/ >={? ppp [~7?  37@yo ?? Ov GgCw  ̿AH ?{CH~c?@ ?o(_o/@(/: ===###wk? mmm?,?,Y6+?"??>?>?,?,"9^9^9^m;+9;r```ֿֿֿom[000_ ! {n`! _ ! _ a`21??o8W1? 0H=2||||:(c## ߀!߀!! ! @@@߁ @ ?? ?! ???????!????????? ???P>ww``pp@?/?GTp }wr]]@@Dٿ1ixCϽWU3nZ"7MVI÷ޕ'j@Wp8'Gp yg~w~K???wÞ=Lo?!! ????!! /!! ???Iw u``@?>y[O???????????ҿ????#=wgڈ?????????3??????-{kz?_pDϻNppp2@"`@888#"p@@ \@ p???p???`?????????????????????? ???????????/?????```????????? @@@???????????????)iX?3/  %).   xxx  dnd     xdd !!#$"#$"#$"#$"#$"#$"#$"#$"&%%nx2&)'2&*(2&)'2&013+,-3+./3+,-3+64xxn37993855xnn3=::3>;;3?<<;96543211000;96543211000:62000000000;62000000000<:7543211000;96543211000;73000000000;73000000000*&" +&" +'# +'# 900000900000900000900000000000<:8500000000000000000000=;9752000000000000000000=<9200000000><5000*p(p$p p p p p p p p p p*p(p$p p p p p p p p p p*p(p$p p p p p p p p p p*p(p$p p p p p p p p p p*p(p$p p p p p p p p p p*p(p$p p p p p p p p p p*p(p$p p p p p p p p p p*p(p$p p p p p p p p p p000000000000000000000000000000==;:87654321100000000000000000000000=94000000000=<9200000000><5000;97555544444<93322<82111<60000000000=<;:97<:5421<;:988766655555544322221110000000000000000000000ǜ\[ZZZZZZZYXǜŜțȚȚȚȚȚȚȚșȘȗМ̛̙̜̚̚̚țȚȚȚș|yxvsoppppppppppppppppppppppppttttttppppppppppppppppppppppppttttttpppppppppppphhhhhhhhhhhhhhhhhhhhhhhhppppppppppppppppppppppppttttttpppppppppppppppppppppppptttttt||||||ppppppppppppppppppppppppTTTTTTTTTTTTppppppXXXXXXXXXXXXTTTTTTTTTTTTppppppXXXXXXXXXXXXTTTTTTTTTTTT?p>ppppp:pppppp?pppppp:pppppp?Tppppphhhhh?dddddd?TTTTTT?ppppppXXXXXXXXXXXX?T>TTTTT?TTTTTT?p>pppppppppppppppp?||||||tttttttttttt?p>p=ppppppppppppppppp?||||||tttttttttttt?p>p=p?=>?=>?>?><pppqv|||||ztpppqv|||||ztpppqv|||||ztpppqv|||||ztpppqv|||||ztpppqv|||||ztpppqv|||||ztpppqv|||||ztpxxuppppt|~||pxttt|||pppp||zt|}~|xtlljd`dlqrttlhd^X?<?<?<?<<<<<<?>=<UVWXXXmnoppp]^_```mnopppefghhhmnopppefghhhmnopppefghhhmnopppefghhhmnopppefghhhmnoppp]^_```mnoppp<;::<<<<::<WUTTTTSTVSWQWUTTTTSTVSWQOMLLLLKLNKOIOMLLLLKLNKOIGEDDDDCDFCGAGEDDDDCDFCGA;9888878:7;5?=<<<<;<>;?9CA@@@@?@B?C=OMLLLLKLNKOIGEDDDDCDFCGASQPPPPOPROSMKIHHHHGHJGKEWUTTTTSTVSWQca````_`b_c]WUTTTTSTVSWQpppppppppppp````````````hhhhhhhhhhhh````````````hhhhhhhhhhhh````````````hhhhhhhhhhhhXXXXXXXXXXXXĽȼȻțțțțțțțȚș<;:<;<;:<;нȼȻțțțțțțțȚș<;:<;<;:<;CA@@@@?@B?C=OMLLLLKLNKOIGEDDDDCDFCGASQPPPPOPROSMca````_`b_c][YXXXXWXZW[UWUTTTTSTVSWQWYPSXPXLS\UL<:<<<<   <;:<;<;:<;<;<;:::::::::::::96̝ȜțțțțțțțțȚș|{wvrqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqlmlihideda`a\]\YXYTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTUTU<;::::::::uokgdbbac`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a|xuqomjjijhihihihihihihihihihihihihihihihihihi~ywtsoonnlmlmlmlmlmlmlmlmlmlmlmlmlmlmlmlmlmlm}vvsrqrpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpqpq=;:=;:=;:=;:`Z&o#xTAB(HSB$H  g  g  f RSBj` g =g %gJ`Rpr A9nA0m/ПЁRSBk`Jg n <#p`zRpr A9nA0m/ПЁRSBkT`JgN n <#D`8Cx `CxrRSBk$  g  g  gQp`JBkQB"+ҫ p$9Df $`nԀ n$<&ւֹp// Bg?<JNAJg0<`6 .Ap#x@#xD#xHNO/ K,MN9Xp??<LNA` /`p/NXX3Hy|N-XNi$A////NnO3HyHyHyxXN[ O 09H/NgX09U@flHy|p/NkfPBp /NXDP#N./9p /NXDP09HB/NgP09H/N[xXNj`xp/NXX#a(a'a(Ba)Xa(@/<p/NXDPJfa8Jg`09HB/NgP09H/N[xXNja*$NuNV/<'NWXa&p/a)8X09Hr//Ne P09Hr//NelP09Hr//Na`P09Hr//NddP09Hr//NdP09HA////r //NcXO=|#=|=|=|sp/HyyHyy_pZ/a OJgpN^Nup/a"XJgpN^Nu-y#p/p/p/pP//<ph//<a#O#p///9p/NXO09Hr7/r_/rOJgpN^Nua p//9/p/NXOa la!p/pZ//<pF/p`//<BaOp/pF/pp/pq//</</<ahOp//9/p/NXOa BHyyHyypd/aOJgpN^NuHyyp /NXPa |/<a$6Xp/HyyHyyQpP/a>OJgpN^Nuap/p-/p /pD//<p;//<aOa p//9/p/NXOHyyp /NXP/<a#XBHyyHyyp\/aOJgpN^Nuap/p4/p /pk/p`//<"Ba*Op/pK/pP/p\/p/p|//<aOalp/HyyHyy/<a8OJgpN^Nup /HyyHyy_p1/aOJgpN^Nua^p/p/p/p6//<pF//<aOHyyp /NXPp//9/p/NXO/<a"Xp/p/p/p6//<pF//< a&O/<a"LXp/p/p/p6//<pF//<aOaZpd/a"Xp/p/p/p6//<pF//<0aOpd/a!Xa^09Hr//Ne P09Hr//NelP09Hr/r2/r//</N`*Op/p /p/p,//</</<a2O09Hr//rR/Hy}{r//</N`O09Hr//rU/Hy}r#//</N`O09Hr//r2/Hy}r-//</N`Op/p/p/p6//<pF//<0aOp//9/p/NXO/<a Xap//9/p/NXOBp /NXDP#a0N./9p /NXDP yRz dgpN^Nu/<a XapN^NuNV09@H/@r NZJWDHH y|"X49=@-AUBg09>H yRzHHm yRzHH"/m 9RT#R @zRRHHm lN`z``````:`J``` ````2`J`Z`````0`b````````p/p/p//p(/pd//</<a~O`9V V`W`p/p/p?/pH yRzHHfl yRzHHrNZTѹR`H9V V`4p/p/p/p6//<pF//<aOpd/aXp/p/p/p6//<pF//< a`O/<aXap/p/p/p6//<pF//< a(O09Hr/r2/r//</N`*Op/p /p/p(//</</<aO09Hr//re/Hy}r /re//N`Op//9/p/NXO/<aXa2p//9/p/NXOpd/aX`9V V`p/p/p/p6//<pF//< aOpd/aFXap/p/p/p6//<pF//< aO09Hr/r(/r//</N`*Op/p /p/p(//</</<aO09Hr//rP/Hy}r/rw//N`O09Hr//rF/Hy}r%/r|//N`Op//9/p/NXO/<aLXap//9/p/NXO/<a"X`fp/p/p/p6//<pF//< aO/<aXadp/p/p/p6//<pF//< aO09Hr/rP/r//</N`*Op/p /p/p(//</</<aH 4g 8f6p/p /p/pR//</</<a0O\`09@H g $g09@ @Hg @Tf:J9]fdp/p/p/pD/pl//</<aO]`2p/p /p/pN//</</<aO^09>H 0g 8g09> @@f09@HJg]g09@ @ g @f:J9`f2p/p/p/p]//</<6/<aO`09@H g Nf2p/p /p/pR//</</<aO\09@H 6g Zf2p/p /p/pN//</</<aO^9ZgD09@HH@J@f2p/p /p/pR//</</<a0O\9Zgp09@HJg g09@ @0g @Hg @Tf2p/p /p/pR//</</<aO\09@H g $g09@ @6g @Bf:J9`f2p/p/p/p]//</<6/<a`O`09@H *g 6f8J9]f0p/p/p/pD/pl//</<aO]09> @fP09@ @/oD @Zg>HH@J@f2p/p /p/pN//</</<a O^9ZgJy@g09@ @$g @0g @TfrJ9`f2p/p/p/p]//</<6/<a LO`J9]f0p/p/p/pD/pl//</<a O]9Zg>Jy@f8J9]f0p/p/p/pD/pl//</<a O]09@ @Bf2p/p/p/pN//</<'/<a O_09@ @Hf:J9`f2p/p/p/p]//</<6/<a BO`09@ @Tflp/p/p/pN//</<'/<a O_J9`f2p/p/p/p]//</<6/<a O`9ZgJng8J9]f0p/p/p/pD/pl//</<a ~O]Jy@g 09@ @Tf2p/p /p/pN//</</<a 8O^09@ @0f:J9`f2p/p/p/p]//</<6/<a O`9Zg09@HrNZSf09@Hr NZ_f,p/p/p//p@//</<8p /a O`NW|Jf,p/p/p//p@//</<8/<a LO`dNW|Jf,p/p/p//p@//</<8/<a O`(p/p/p//p@//</<8pP/a O9VgJng(p//p//<p?//</<a ONW|/@NW|"/ gd g2 {f|p/p/p/p\/p(//</< a HO`Rp/p/p/p\/p(//</<a O`(p/p/p/p\/p(//</< aO9VgL09@HJg8 g009@ @g$ @$g @*g @6g @Bg @Hg @TfW9VgF09@HJg2 g*09@ @g @*g @0g @Bg @Hg @TfW9VgJngW9WHH gZ g ftp/p/p/pz/p,/p|//<aO9WSW]f:NW| d$N``4`Z`p/p//pt/pP//</<azO`p/p//pt/pP//</<aPO`p/p//pt/pP//</<a&O`p/p//pt/pP//</<aO`fp/p/p/pz/p,//</<aO9WSW`.p/p/p/pz/p,//</<aOB9WJ9Xg0Jng*p/p///</</</<a\O9Xg 09@ @\fNW|R[J9XgBNW|Jf2NW|r/r/r/rw//</<V/aOJ9[gbJng\9[HH29@H/@ rNZJVDHH"/UҀp/p/p/pe//</<e/a|OJ9\g<9\S\Jf*p/p /p/pR//</</<a8OJ9]g:9]S]Jf(p/p/p/pD/pl//</<aOJ9^g<9^S^Jf*p/p /p/pN//</</<aOJ9_g<9_S_Jf*p/p/p/pN//</<'/<anOJ9`g<9`S`Jf*p/p/p/p]//</<6/<a*O . y|c"` . y|bBn nlRn`N^Nup[Z`_^]\XWVBRNuNVpSn =@=@.f3/b0.H/@r(NZT"<e /倒 / /Ar NZTrNZ"/=Ap /NXDX-@Jf09bnl0.H n  gl0.H n  fBn0.H n  fR/.r /=@NXP`.ga`aX0.H n HH29bH4. H///a:O .gHp/pP//pF/p`//</<aLOp/pP//pF/p`//<Ba*Op//9/p/NXO0.H/@R n 09bHHHЁ"/T n 2. HHH҂4.RB&/V n =BHHH3b=A opBn /X=@`^ .N^NuNVBn0.Hl,p/HyyHyyqpZ/aOJgpN^NuRn`pN^NuNV0. @=@ H/@T @xn0. "/RH"@xn0=@4@=B=A H/AT Axn0. "/RH"@xn0=@4@=B=A H/A Axn0.=@02.A=@0. "/RH @xn0R@@33x=A H Axn0.=@04.B=@ Axn0R@33z#09HHyHytHnr//Nf ON^NuNV0.?@S@2/A33x2.?ASA4/33z#4. =B@=B4.=BA=B4.=B@=B4.=BA=B49H6."HHyHytHn//=@=ANf ON^NuNVH 9"9#p///p/NXO*y(y~ G@l (XXRG`L0N^NuNVH 9"9#p///p/NXO y+*H y+(H~ Gl (XXRG`L0N^Nu/<}/9/9NYO NuNVHp=@=@=@=@~ Gl@ "9ҀPp/p/Hn/NY0O Gfp=@=@=@RG`/<}/9/9NYO /<}/9/9NYO LN^NuNV=|Bn0. @l,"9ҀPpH/p/Hn/NY0ORn`N^NuNVBHy}p=/NXDO =@H/9/</r?/NXDO0.H/r>/NXDPN^Nu 9#tp33|p33~p33p333333Nu/<N@X#/<~N@X#/<}N@X#NuNVBn nlD0.H/@ @20."/RHt//t/=A/HNXO o0`Bp//p/NXO 9"9##N^NuNV=|Jnkp /aX0.SnH/aX`N^NuNVBn0. @l yXH/@-H0=@H/@2. HNZT/A rNZ"/p$/ /@ NZTrNZp"/Ҁ //A"NZTrNZ"/Ҁ///p/NXO Rn`BN^Nu09H/"9//t/NXOHy2p/NXPNuNVB .r(NZT".lR`N^NuNVB/.p=/NXDO Hyhr//r?/-@NXDO3l:3n43p609v38J@g 3HB`3`B094HT/N@X#009BH296HT//N@VP#dHyhp$//.p?/NXDO094HR/90//.r?/NXDO096HR29BHNZT yd///.r?/NXDO/.p>/NXDPN^NuNVHap3h3j=|3>pd3<3T3R3Pp3N3L3J=@Jnf09>H y00Hm\ lRN``v``f`0``D`Sn0.H @h0T@f=|Sn0.H @h3>`l09>R@3>H y03J09>R@3>H y03L09>R@3>H y03N09>R@3>`09>R@3>H y03P09>R@3>H y03R09>R@3>H y03T09>R@3>`09>R@3>H y03<09>V@3>`V09>X@3>2.?ARA4/H Bh0?ARA0/H @hBP=A` 09>X@3>2.H/AS AhHW"y002Af /UBn=@Jnk09>H y00R@f=|09>H/@ y00H WDHH^WDHH’0.HЁ"/X3>=@`0.H/@S @h0R@0 /U @h3>`09>R@3>H y00J@j09>V@3>`0.?@R@2/H Ah29>H/AV0?@ R@2/ H Ah0"/ y02SAA3>=@`09>H/@ y00J@ZDHH09>$/R3>H y00H69BH/A"NZTd(/"NZTH/B y02JAZDHH29>(/R3>H y02H=@ NZTd"NZTH/D y02JAZDHH29>(/R3>H y02H=@ NZTd"NZTH/D y02JAZDHH29>(/R3>H y02H=@ NZTd"NZTBy@=@09@29BAl0.RnH ydp0/aHXByH0.RnH ydp0/aX09HR@3H0.RnH ydp0/aX09HR@3H0.RnH ydp0/aXN vp /NXDXJg&p/NXDX g 3d@Rn09@R@3@`aLN^NuNVBn09<29:"<NZ2.HlRn`N^NuNV .? @~H=@. gSn. gRn . f ./aX`09HH @J02.@=AJAjBn n_o=|_0.H/@ @} .r4H/@ NZ"/R A}2H$//@ NZ"/ Ҁ/aX. gaR`a. ga`a* .29HH AP2HNZrdNY/aXN^Nup/Bp/NXO 3D3FBaXNu09DH/</r/NXO NuNV09H@r2. =@H//t/NXO p0. 2.H//t/NXO N^NuNV0. H29HH//t/NXO N^NuNV0. H/</r/NXO N^Nu09HH"<UWDHH’09FH3FH/</r/NXO NuNV09HH/@R WDHHЁ29FH3FH/</p/NXO N^NuNV09HH/@R WDHHЁ"<09FH3FH/</r/NXO N^NuNV09HH/@R WDHHЁ29FH3FH/</p/NXO N^NuByHBabX3HBaRX3HBaBXNuNVBZp#V Vl nHHR"@dgR` nJgZ 9VRV @Z  nHHJgR"@dfR` nrR@JfpNqHyHy~HyxN=*O 9x -@ >g"HyHy~Hyx N=*O -@` HyHy~Hyx!N=*O -@Hy Hy~Hy~N=*O -@Jf p/NO0XJf/.Hy~N;Pp/N gJfV n@`\.gp`p nHH`8.gp`p` nHH` nBp#HpN^Nup n@ nJf-|B . lFr NZT @(R//.NZPJf .r NZT @("nPR` n(Jf.g /.NRbX.gp` . //.NOP n!@JxPg@ . JgB/.NQP n!@JxPgJp#H nBpN^Nu .  f$ n/(NRXp#H nBpN^Nu .N^NuNV . ". ///.a|O N^NuNVJjp#HpN^Nu/.aX-@JfpN^Nu n(HH dN``` ``/./. n/(NRO -@JxPg JfpN^Nu ng .N^Nup-@-@ .lZ n R@HH g f$ .Sr///.aO .N^Nu n R`JfJfB .N^NupN^NuNVJjp#HpN^Nu/.aX-@JfpN^Nu n(HH drN``` ``P ngp/B/.aLO ng0/./. /(NRO -@JxPgpN^Nu .N^NuB.p-@-@-@ .l n R@ f . g | S n .R.-@A m/Hy n/(NRO -@갮gpN^NuJxPgpN^NuB`hJg:/.Hy n/(NRO -@갮gpN^NuJxPgpN^Nu .N^Nu .N^Nup#HpN^NuNV/.a X-@JfpN^Nu n(JgpN^Nu/./. n/(NS$O -@JxPgp#HpN^Nu f`JgZ nfN .S-@Jk4B/./.afO Jgp/Hn/.a\O JfS` .RN^Nu .N^NuNV/.aLX-@JfpN^NuB n/(NRXJxPgp-@ nB .N^NuNV/.NRbXJxPgpN^NupN^NuNV/.aXN^NuNV/. /.NPN^NuNV .xHopN^Nu yxD .ѹxDxH N^NuNV/.aX-@JgN^Nu | N^NuNV 9xDx@ѹxH#x@xD#X#P#\#T N^NuNVa-@JfpN^Nu /./9$azP n-@Jfp-@ . dN```4`L`XJ fDA"n"`(  f*A"n"`  fA"n"`A:"n"`  fA"n"`A"n"`  f. .r/@B///r/r/NWO #xP/.aXJxPWDHHLN^NuNV .r/@///r/rA/NWO#xPJWDHH N^NuNVJfB/./. /.aON^Nu"n QB/./. / NON^NuNVJfp//./. /.a`ON^Nu"n Qp//./. / NON^NuNVH Jf pLN^NuAJ$n"Rg pLN^Nup". /. n/(/. /p/pB/NWOLN^NuNVJgp@`p?r$.". v/A////./ n/(v//-@NWO-@Jj #xPpN^Nu .N^NuNVBp/NWP n pN^NuNVB .l& n HH/r/r/NWO R` .N^NuNVB .l& n HH/r/r/NWO R` .N^NuNVv . lS`p}@A r//r/r /NWOp /p/p/NWO .HHr-Ax-@| .|T".xl>6@w f| w .wf .xUDN^Nu .xU n wRx` .| }l n  .|RN^NuNVB .lP n @HH fp /p/p/NWO .HH/r/r/NWO R` .N^NuNVJg .`pN^NuNVB . l" @>Jf @> N^NuR`pN^NuNV nBN^NuNV. am zn aAN^Nu. N^NuNV. HH/aX.HH/@aX/fp`pN^NuNVp-@p-@p-@-@ n JgR`B . nJg n@JgR =g ,f .S".f .N^Nu .R.HH n HH//-@a2PJfB. ,g =f p-@p-@ .,fRR`^Jg .S".f .N^NupN^NuNVHnBaPP ."<]NZV"<NY-AHnp/a P .N^NuNVHnp/aPN^NuNVJ. f n (` n #(N^NuNVH*OBxPpn@N?.*?.&?."?.?.?.?.?. NA.ML?N^NuC,# O0/@11g"HS@4TBB$0 g/`?S@j?(NA.yNuC# O0/@11g"HS@4TBB$0 g/`?S@j?(NM.yNuC# O0/@11g"HS@4TBB$0 g/`?S@j?(NN.yNu /ob"/ o\ o"of>/f6/ f.f$ Sf"oSf`"$0Sf"oSf`$Sf"oSfNu o"o / oe  SfNuSfNu o /o "/ SfNu//Jg"JgBv㒴eQ"`BB&$NuH<*g2jD(g(jDBv㒴eRQ"jDjD`BBL1o<"/ !A:!o1o81|.!@21| ,No|AoCD!ICD!IHNuAo1oD1oH1o D1o81|.1|21|g,No|HNuAo!o1o81|.Bh21|r,No|AoCD!IHNuAo!o1o81|.Bh21|61| ,No|AoCD!IHNuAo1oF1oD1oP1oF1o D1o81|.1|21|6BhHBhJBhLBhNBhR1| ,No|HNuAo1oF1oD1oP1oF1o D1o81|.1|21|6BhHBhJBhLBhNBhR1| ,No|HNuAo1oL1oF1o D1o81|.Bh21|6BhHBhJBhN1| ,No|HNuAo1oF1oD1oJ1oH1oF1o D1o81|.1|21|61| ,No|HNuAo1oF1oD1oJ1oH1oF1o D1o81|.1|21|61| ,No|HNuAo1oJ1oH1oF1o D1o81|.Bh21|61| ,No|HNuAo!o1o81|.Bh21|61| ,No|AoCD!IHNuAo!o1o81|.Bh21| 61| ,No|AoCD!IHNuAo1oF1oD1oH1oF1o D1o81|.r"oRJf1A2p"o/ EH4Q$_h21| 61| ,No|HNuAo1o D1o8Bh.1|21| ,No|0(DHNuAo1o D1o82<"o C/ EF4Q$_Bh.1|21|,No|HNuAo1o D1o8Bh.1|21|,No|0(DHNuAo1o D1o8Bh.1|21|q,No|HNuAo1o D1o8BhF1|.Bh21|,No|0(DHNuAo1o D1o8Bh.1|21|,No|0(DHNuAo1oF1o D1o8Bh.1|21|l,No|HNuAo1o D1o8Bh.1|21|,No|0(DHNuAo1o F1o81|.Bh21|,No|0(FHNuAo1o D1o8Bh.1|21|,No|0(DHNuAo1o F1o8BhD1|.Bh21| ,No|Ao"o 2D"o2F"o2H"o2JHNuAo1o D1o8Bh.1|21|k,No|Ao"o 2D"o2F"o2H"o2J0(DHNuAo1o D1o8Bh.1|21| ,No|0(DHNuAo1o D1o8Bh.1|21|,No|0(DHNuAo1o D1o8Bh.1|21|,No|0(DHNuAo1o D1o8Bh.1|21|j,No|0(DHNuAo1oF1o D1o8Bh.1|21|',No|Ao"o2D"o2FHNuAo1o D1o8Bh.1|21|,No|0(DHNuAo1o D1o8Bh.1|21|,No|0(DHNuAo1o D1o8Bh.1|21|,No|0(DHNuAo1o D1o8Bh.1|21|h,No|0(DHNuAo /!@2!o1o8Bh.1|p,No|AoCD!IHNuAo!o>!o:!o 1o D1o81|.1|21|m,No|AoCD!IHNuAo2<"oC/ EF4Q$_!o>!o:!o 1o D1o81|.1|21|y,No|AoCD!IHNuAo!o >!o:1o8Bh.Bh21|n,No|HNuAo1oF1o D1o81|.Bh21|i,No|Ao"o2D"o2FHNuAo!o1o8Bh.1|%21|o,No|AoCD!IHNuAo!o:1o8Bh.Bh21|v,No|Ao"o2D"o ">HNuAo1o D1o8Bh.1|21|z,No|HNuA jo1o8Bh.Bh21|{,No|HNuAo1o8Bh.Bh21||,No|Ao"o2D"o 2D"o2FHNuAo!o:1o8Bh.Bh21|},No|Ao"o ">HNuAo!o:1o8Bh.Bh21|~,No|Ao"o ">HNuAo!o:1o8Bh.Bh21|,No|Ao"o ">HNuAo1o8Bh.Bh21|,No|Ao"o2DHNuAoBh1|Bh1| NoAo0(0HNuAo!o 01o 21o01|1|1|1| NoAo0(0HNuAo!o 01o 21o01|1|1|1| NoAo0(0HNuAo1o0Bh1|Bh1| NoAo0(0HNuAo1o21o 0!o01|1|1|1|NoAo0(0HNuAo1o 0!o01|1|1|1|NoAo0(0HNuAoBh1|Bh1|NoAo0(0HNuAo1o 0!o01|1|1|1|2NoAo0(0HNuAo1o&@1o">1o<1o:1o81o61o41o 21o01| 1|1|1|3NoAo0(0HNuAo!o01o01|1|1|1|4NoAo0(0HNuAo1o01|1|Bh1|5NoAo0(0HNuAo!o0Bh1|1|1|6NoAo"o22"o 24"o26"o280(0HNuAo1o61o41o 21o01|1|Bh1|FNoAo"o22"o240(0HNuAo1o">1o<1o:1o81o61o41o 21o01|1|Bh1|GNoAo"o$22"o(240(0HNuAo1o:1o81o61o41o 21o01|1|Bh1|HNoAo0(0HNuAo1o">1o<1o:1o81o61o41o 21o01|1|Bh1|INoAo0(0HNuAo1o">1o<1o:1o81o61o41o 21o01|1|Bh1|JNoAo0(0HNuAo1o61o41o 2!o01|1|1|1|KNoAo0(0HNuAo1o41o21o 0!o01|1|1|1|LNoAo0(0HNuAoBh1|Bh1|MNoAo"o22"o24"o 26"o280(0HNuAo!o01o01|1|1|1|NNoAo0(0HNuAoBh1|Bh1|ONoAo"o22"o24"o 26"o280(0HNu"0<sNBNu"0<NBNu1.01ooqsuowosqu/90/9`/9/9;/?0;/?`;/?2///|/J0|/J`|/J:2/                       2F]^ _   2 B N P Z_ $%*0178P Q^NZ_^_ TT  T""T#$^$_&'_)N)Y)[)[*** ******0*2*6*<*B*H*N*P*T*V*Z*[*^*_--$-0-T..$.0.<.=.B.D.H.I.N.P.T.V00$000T11$1%101B1H1T1_ 33=]=_ ??? ? ?????*?+?T?U?V?Z?^?_CCCCC$C0C<CHCTDDDDD$D0DTD_CGGGGG$G0G<GHGTHHHHH$H0H<HHHTH]H^III0IHITIUKKK0KHKTKUMMM0MHMTMUOOO0O<OHOTOUOZO^RR^SSSSSS*S0S6S<SBSHSNSTZVVV0V1WWW0W1XPddemo.mus[1][Diese Grafik und Sound Demo|sollten Sie sich auf einem|Farbmonitor ansehen. Sonst|knnen Sie nur die Musik hren.][ OK ]Grafik und SoundDemovon Eckhard KruseReichenbergweg 733O2 WeddelNa los, Gnurp!Zeig, was dukannst!Hau' rein, Zottl!Zeig's ihnen,Schnatter!Alles klar?!onetwothreefourdemo.gra "$&(*-/258<?CGKPTY_djqw -?Rf{8Z~$T1pGG wa h 0 M  "$%')+,.013578:<=?ACDFHIKMOPRTUWY[\^`rwaaCan't open stdin file Can't open stdout file con:CON:prn:PRN:lst:LST:lpt:LPT:lpt1:LPT1:aux:AUX:com:COM:com1:COM1:rdr:RDR:pun:PUN:nul:NUL:null:NULL:CON:AXI:,AXO:,LST:,NIL:,CON:=*   ( H  ( H  B H*"       (  &00 $ $   " $ $ $ ,     $ f  P r"H 4  6    .   8  4   h4   z4      6 6 466 6      D 244DD >D42 J4228 48428 4 6 ( ,4(.    &$ N. "  &        T             ( 4          ,N 6F  (&$  * "  .  "  (    P:$  :":V:l&$@T6(,j$&:P(J.z    ,$ , Xd`$  J $2 4 0 & 0  F H 4 T<@HF B >@@@*<  "" *""J "F0 "(V V @ H H : ((h "< "" &"( """&*".""""(""""&6P& (" "  "   00 0**T*"".4L@LL66.*F Der MUSIK-EDITOR (Platz 1 des Musikwettbewerbs der ST Computer) Diese Musik-Demo ist ein kleines Beispiel fr die Mglichkeiten, die der MUSIK-EDITOR bietet. Das Programm wird fr DM 44,- im Heim-Verlag vertrieben und ist das Siegerprogramm des Musikwett- bewerbs der ST Computer. Alle Besitzer eines Farbmonitors drfen sich glcklich schtzen, zustzlich zur Musik auch noch die Grafikanimation bewundern zu drfen (siehe Titelblatt ST Computer 12). Knurp an den Tasten, Zottl am Schlagzeug und Schnatter an der Gitarre bieten sicherlich ein volles Musikerlebnis. Eine nhere Beschreibung des MUSIK-EDITORS kann man in der ST Computer 11 nachlesen. 9program threeD(input,output); const minint = -32767; pi = 3.14159; {$I GEMCONST.PAS} type Menu_Option_Type = (Colors,Grid,G_Function,View,Draw,Help,Quit); Res_Type = (Low, Med, Hi); TokenType = (Numeric, Character); NodePtr = ^Node; Node = Record Link: NodePtr; case NodeType: TokenType of Numeric: (Value: real); Character: (Code: char; Priority: 0..5) end; Intensity_Type = array [0..2,1..3] of 0..8; {$I GEMTYPE.PAS} var sx,sy: array [-32..32,-32..32] of integer; { Screen coordinates } lx,ly,lz: array [-32..32,-32..32] of real; { Logical coordinates } Res: Res_Type; { Resolution } X_Center, Y_Center: integer; { Center of screen } SF, { Compensates for aspect ratio } Max_Z, { Maximum Z value allowed } Min_Z, { Minimum Z value allowed } x,y, { x and y coordinates } d, { distance from point to origin } r: real; { square of distance from point to origin } max, min: array [-640..1280] of integer; { Holds max and min y values } ,{ for each possible x value. } Option: Menu_Option_Type; { Choice from main menu } Intensity: Intensity_Type; { Values for color registers } XLim, YLim: integer; { Number of grid lines on x, y axes } Grid_Scale: real; { Scale per grid line } InFix: Str255; { The function being graphed } PostFix: NodePtr; { Pointer to postfix version of function } Syntax_Error: boolean; Azimuth, { Position around z-axis } Altitude, { Elevation above or below x-y plane } Screen_Scale: integer; { Size of displayed graph } Plot_Fast, { TRUE if fast plotting desired } Perspective, { TRUE if perspective desired } Draw_Both_Ways, { TRUE if boths sets of grids desired } Hidden_Lines, { TRUE if hidden lines are desired } Draw_Top, { TRUE if top of graph should be drawn } Draw_Bottom: boolean; { TRUE if bottom should be drawn } Must_Load1, { TRUE if no coordinates have been calculated } Must_Load2, { TRUE if coordinates must be recalculated } Must_Transform: boolean; { TRUE if points must be transformed } { The following variables are used to get events in menu screen 's } Done: boolean; { TRUE if user clicks on OK button } Event: integer; Dummy_Buffer: Message_Buffer; Dummy: integer; { Dummy parameters to Get_Event} mx, my: integer; { Coordinates of mouse } {$I GEMSUBS.PAS} {* GotoXY *! * D* * Used to provide cursor control when printing to the screen. * * D* * Called by: Various user input modules * * D* * In parameters: x, y screen positions * * D* *E} procedure GotoXY(x,y: integer); procedure bconout(device, c: integer); BIOS(3); begin bconout(2,27); bconout(2,ord('Y')); bconout(2,31+x); bconout(2,31+y) end; {GotoXY} {* Initialization * * E* * Initializes global variables. &* * E* * Called by: MAIN DRIVER -* * E* *F} procedure Initialization; var I, { Loop counter } Scr_Res: integer; { 0, 1, or 2 for screen resolution } r: 1..2; { 1 if color monitor is used, 2 otherwise } function Get_Res : Integer; XBIOS(4); begin { Determine screen environment } Scr_Res := Get_Res; case Scr_Res of 0 : begin Res := Low; X_Center := 160; Y_Center := 100; Set_Clip(0,0,320,200); SF := 0.869 end; {0} 1 : begin Res := Med; X_Center := 320; Y_Center := 100; Set_Clip(0,0,640,200); SF := 0.434 end; {1} 2 : begin Res := Hi; X_Center := 320; Y_Center := 200; Set_Clip(0,0,640,400); SF := 0.869 end; {2} end; {case} if Res = Hi then r := 2 else r := 1; { Print Copyright message } Clear_Screen; GotoXY(1,1); writeln(' 3-D Grapher'); writeln(' by Delmar Searls'); writeln; writeln(' (Parts of this product are'); writeln('Copyright (c) 1986, OSS & CCD'); writeln(' Used by persmission of OSS)'); Text_Style(Thickened); Draw_String(112,104*r,'OK'); Text_Style(Normal); Frame_Rect(88,81*r,64,40*r); { Wait for user to click on OK button } Done := FALSE; Set_Mouse(M_Arrow); repeat Show_Mouse; Event := Get_Event(E_Button,1,1,1,0,FALSE,0,0,0,0,FALSE,0,0,0,0, Dummy_Buffer,Dummy,Dummy,Dummy,mx,my,Dummy); Hide_Mouse; if Res = Hi then my := my DIV 2; if Event = E_Button then if (mx>88) AND (mx<154) AND (my>81) AND (my<121) then Done := TRUE until Done; { Set up general environment } Text_Color(1); Line_Color(1); Draw_Mode(1); { Set up initial intensities for colors 0, 1, & 2 } for I := 1 to 3 do begin Intensity[0,I] := 7; Intensity[1,I] := 0; Intensity[2,I] := 0 end; {for} Intensity[2,1] := 7; { Set up initial view parameters } Azimuth := 30; Altitude := 10; Screen_Scale := 100; Plot_Fast := TRUE; Perspective := TRUE; Draw_Both_Ways := TRUE; Hidden_Lines := TRUE; Draw_Top := TRUE; Draw_Bottom := TRUE; { Set up initial Grid parameters } Grid_Scale := 0.25; XLim := 16; YLim := 16; { Set up some odds and ends } InFix := '-3*EXP(-R/8)*(SIN(R/2)-COS(R/3))-1'; Syntax_Error := FALSE; Must_Load1 := TRUE; Must_Transform := TRUE end; {Initialization} {* Menu_Option * * D* * Display the main menu and allow the user to select an option. * * D* * Called by: MAIN DRIVER ,* * &u * *E} function Menu_Option: Menu_Option_Type; var Dialog: Dialog_Ptr; Button: array [1..7] of integer; Button_Text: string[8]; I, { Loop counter } Choice, { Indicates which button user selected } Row: integer; { Text row in dialog box } begin Clear_Screen; { Set up the menu dialog box } Dialog := New_Dialog(7,0,0,16,15); for I := 1 to 7 do begin Row := 2*I-1; if (I = 1) AND (Res = Hi) then Button[I] := Add_DItem(Dialog,G_Button,None,4,Row,8,1,0,0) else Button[I]:= Add_DItem(Dialog,G_Button,Selectable|Exit_Btn,4,Row,8,1,0,0); case I of 1: Button_Text := 'Color'; 2: Button_Text := 'Grid'; 3: Button_Text := 'Function'; 4: Button_Text := 'View'; 5: Button_Text := 'Draw'; 6: Button_Text := 'Help'; 7: Button_Text := 'Quit' end; {case} if (I = 1) AND (Res = Hi) then Set_DText(Dialog, Button[I], Button_Text,5,TE_Center) else Set_DText(Dialog, Button[I], Button_Text,3,TE_Center) end; {for} { Display menu and get user's choice } Center_Dialog(Dialog); Set_Mouse(M_Point_Hand); Show_Mouse; Choice := Do_Dialog(Dialog,0); End_Dialog(Dialog); Hide_Mouse; Delete_Dialog(Dialog); { Analyze user's choice } if Choice = Button[1] then Menu_Option := Colors else if Choice = Button[2] then Menu_Option := Grid else if Choice = Button[3] then Menu_Option := G_Function else if Choice = Button[4] then Menu_Option := View else if Choice = Button[5] then Menu_Option := Draw else if Choice = Button[6] then Menu_Option := Help else Menu_Option := Quit; end; {Menu_Option} {* Get_Colors * * D* * Allow the user to determine the color of the background, the * * top of the graph, and the bottom of the graph. * * D* * Called by: MAIN DRIVER ,* * D* * In/Out parameters: Intensity levels * * D* *E} procedure Get_Colors(var Intensity: Intensity_Type); var IString, { Holds string representation of intensity level } Up_Arrows, Down_Arrows: str255; Key, { Stores value of key pressed by user } K, { 0 => raise intensity, 1 => lower intensity } I, J: integer; { Row and Column counters } T, { Holds parameters to Set_Color procedure } XPos: array [1..3] of integer; { Store print positions } YPos: array [0..3] of integer; { Store print positions } begin { Load graph colors into color registers } for I := 0 to 1 do begin for J := 1 to 3 do T[J] := 60 + 125*Intensity[I,J]; Set_Color(I,T[1],T[2],T[3]) end; {for} Clear_Screen; Set_Mouse(M_Arrow); { Set positions of arrows } XPos[1] := 161; XPos[2] := 177; XPos[3] := 193; YPos[0] := 48; YPos[1] := 104; YPos[2] := 160; { Create a string of 3 up arrows } Up_Arrows := ' '; Up_Arrows[1] := chr(1); Up_Arrows[3] := chr(1); Up_Arrows[5] := chr(1); { Create a string of 3 down arrows } Down_Arrows := ' '; Down_Arrows[1] := chr(2); Down_Arrows[3] := chr(2); Down_Arrows[5] := chr(2); { Create screen display } Draw_String(64,8, 'Adjust Color Registers'); Draw_String(161,32, Up_Arrows); Draw_String(0,48, 'Background'); Draw_String(161,64, Down_Arrows); Draw_String(161,88, Up_Arrows); Draw_String(57,104,'Top'); Draw_String(161,120, Down_Arrows); Draw_String(161,144, Up_Arrows); Draw_String(33,160,'Bottom'); Draw_String(161,176, Down_Arrows); Paint_Color(1); Paint_Rect(97,89,48,24); Paint_Color(2); Paint_Rect(97,145,48,24); Frame_Rect(241,81,64,40); Text_Style(Thickened); Draw_String(265,104, 'OK'); Text_Style(Normal); { Display current graph color register values } IString := ' '; for I := 0 to 2 do for J := 1 to 3 do begin IString[1] := chr(ord('0')+Intensity[I,J]); Draw_String(XPos[J], YPos[I], IString) end; {for}  { Check for and process user changes } Done := FALSE; repeat Show_Mouse; Event := Get_Event(E_Keyboard|E_Button,1,1,1,0, FALSE,0,0,0,0,FALSE,0,0,0,0, Dummy_Buffer,Key,Dummy,Dummy,mx,my,Dummy); Hide_Mouse; if (Event = E_keyboard) AND (Key = 283) then begin {Escape key pressed} Set_Color(0,1000,1000,1000); Set_Color(1,0,0,0); for J := 1 to 3 do begin Intensity[0,J] := 7; Intensity[1,J] := 0 end; {for} Done := TRUE end; {if} if Event = E_Button then if (mx>241) AND (mx<305) AND (my>81) AND (my<121) then Done := TRUE else begin I := -1; J := 0; if (mx>158) AND (mx<171) then J := 1 {Red} else if (mx>174) AND (mx<187) then J := 2 {Green} else if (mx>190) AND (mx<203) then J := 3; {Blue} if (my>24) AND (my<33) then I := 0 { Increase background register value } else if (my>56) AND (my<65) then I := 1 { Decrease background register value } else if (my>80) AND (my<89) then I := 2 { Increase top color register value } else if (my>112) AND (my<121) then I := 3 { Decrease top color register value } else if (my>136) AND (my<145) then I := 4 { Increase bottom color register value } else if (my>168) AND (my<177) then I := 5; { Decrease bottom color register value } { Adjust color register if necessary } if (I>-1) AND (J>0) then begin K := I MOD 2; I := I DIV 2; if K = 0 then Intensity[I,J] := (Intensity[I,J] + 1) MOD 8 else Intensity[I,J] := (Intensity[I,J] + 7) MOD 8; IString[1] := chr(ord('0') + Intensity[I,J]); Draw_String(XPos[J], YPos[I], IString); for J := 1 to 3 do T[J] := 60 + 125*Intensity[I,J]; Set_Color(I, T[1], T[2], T[3]); if I > 0 then begin Paint_Color(I); Paint_Rect(97,33+I*56,48,24) end {if} end {if} end {else} Until Done; Set_Color(0,1000,1000,1000); Set_Color(1,0,0,0) end; {Get_Colors} {* Get_Grid_Parameters * * D* * Get the number of grid lines and scale per grid line. * * D* * Called by: MAIN DRIVER ,* * D* * Out parameters: Grid_Scale, XLim, YLim * * D* *E} procedure Get_Grid_Parameters(var Grid_Scale: real; var XLim, YLim: integer; var Must_Load2: boolean); var TStr: Str255; { Temporary storage used in Draw_String } TempXLim, TempYLim: integer; { Temporary storage in case of an Abort } TempScale: real; r: 1..2; {1 if color monitor used, 2 otherwise} begin TempXLim := XLim; TempYLim := YLim; TempScale := Grid_Scale; if Res = Hi then r := 2 else r := 1; Clear_Screen; Set_Mouse(M_Arrow); { Draw Arrows } TStr := ' '; Tstr[1] := chr(4); Draw_String(55,46*r,TStr); Draw_String(55,118*r,TStr); Draw_String(55,158*r,TStr); Tstr[1] := chr(3); Draw_String(129,46*r,TStr); Draw_String(129,118*r,TStr); Draw_String(129,158*r,TStr); { Display Text } GotoXY(3,8); write('Grid Scale'); GotoXY(4,5); write('(per grid line)'); GotoXY(6,11); write(Grid_Scale:4:2); GotoXY(10,3); write('Number of Grid Lines'); GotoXY(11,5); write('(positive axis)'); GotoXY(13,10); write('X-Axis'); GotoXY(15,12); write(XLim:2); GotoXY(18,10); write('Y-Axis'); GotoXY(20,12); write(YLim:2); Draw_String(253,66*r,'ABORT'); Text_Style(Thickened); Draw_String(265,104*r, 'OK'); Text_Style(Normal); { Draw Boxes } Frame_Rect(68,36*r,56,16*r); Frame_Rect(68,108*r,56,16*r); Frame_Rect(68,148*r,56,16*r); Frame_Rect(241,55*r,64,16*r); Frame_Rect(241,81*r,64,40*r); Must_Load2 := FALSE; Done := FALSE; repeat Show_Mouse; Event := Get_Event(E_But ton,1,1,1,0, FALSE,0,0,0,0,FALSE,0,0,0,0, Dummy_Buffer,Dummy,Dummy,Dummy,mx,my,Dummy); Hide_Mouse; if Res = Hi then my := my DIV 2; if Event = E_Button then if (mx>241) AND (mx<305) then begin if (my>81) AND (my<121) then Done := TRUE else if (my>55) AND (my<71) then begin { Restore orginal values and abort } Must_Load2 := FALSE; XLim := TempXLim; YLim := TempYLim; Grid_Scale := TempScale; Done := TRUE end {else if} end {else if} else if (my>38) AND (my<49) then begin if (mx>54) AND (mx<65) AND (Grid_Scale > 0.06) then begin Grid_Scale := Grid_Scale-0.05; Must_Load2 := TRUE end {if} else if (mx>128) AND (mx<139) AND (Grid_Scale < 3.96) then begin Grid_Scale := Grid_Scale+0.05; Must_Load2 := TRUE end; {else if} GotoXY(6,11); write(Grid_Scale:4:2) end {else if} else if (my>110) AND (my<121) then begin if (mx>54) AND (mx<65) AND (XLim>4) then begin XLim := XLim - 4; Must_Load2 := TRUE end {if} else if (mx>128) AND (mx<139) AND (XLim<32) then begin XLim := XLim + 4; Must_Load2 := TRUE end; {if else} GotoXY(15,12); write(XLim:2) end {else if} else if (my>150) AND (my<161) then begin if (mx>54) AND (mx<65) AND (YLim>4) then begin YLim := YLim - 4; Must_Load2 := TRUE end {if} else if (mx>128) AND (mx<139) AND (YLim<32) then begin YLim := YLim + 4; Must_Load2 := TRUE end; {else if} GotoXY(20,12); write(YLim:2) end {else if} until Done end; {Get_Grid_Parameters} {* Convert *, * D* * This function converts the input expression from infix to * * postfix notation. A pointer to the postfix expression is * * is returned as the as the value of Convert. * * D* * Called by: Get_Function +* * D* * In parameter: The infix expression * * Out parameter: Syntax error flag "* *E} function Convert(InString {in}: Str255; var Syntax_Error {out}: boolean): NodePtr; var TempStr: Str255; {Temporary storage of Infix expression} PostFix, {Pointer to the postfix expression} Tail, {Pointer to last token in postfix expression} Token, {A token to be added to postfix expression} TOS: NodePtr; {Pointer to top of stack used in conversion} I, {Loop counter} L: integer; {Length of InFix expression} Previous_Token: char; {Denotes the type of the previous token. This has a value of '(' for right parenthesis, and a 'N' if previous token was numeric. Numeric tokens are numbers, 'X', and ')'. A code of 'F' indicates a function token. Otherwise this identifier is assigned the null character. } {- Next_Token - | -| | This function removes the next item from | | the infix expression and returns the | | corresponding token. | | -| | Called by: Convert | | -| | In/Out parameter: The infix expression | | Previous token | | Out parameter: Syntax error flag | --} function Next_Token(var InFix {in/out}: Str255; var Previous_Token: char; var Syntax_Error {out}: boolean): NodePtr; var Token: NodePtr; {The new token} TStr: Str255; {Stores numeric operand in string form} TChar: char; {Token code for non-numeric tokens} T: integer; {Temporary storage -for token priority} {- - - - - - - - - Str_to_Num - - - - - - - - - - - /- - Converts a string representation of a number - - to the numeric representation. - - /- - Called by: Next_Token - - /- - In parameter: The string representation - - Out parameter: Syntax error flag - - - - - - - - - - - - - - - - - - - - - - - - -} function Str_to_Num(NumStr {in}: Str255; var Syntax_Error {out}: boolean): Real; var Integer_Part, {Integer part of number} Fraction_Part, {Fraction part of number} Power_of_Ten: real; {Used in finding fraction part} DP, {Position of decimal point} Num_Int_Digits, {Number of digits in integer part} Num_Frac_Digits, {Number of digits in fractional part} I: integer; {Loop counter} begin { Initialize variables. } Integer_Part := 0; Fraction_Part := 0; Power_of_Ten := 1; { Determine number of digits in integer part and fraction part. } DP := pos('.', NumStr); if DP = 0 then begin { string represents an integer } Num_Int_Digits := length(NumStr); Num_Frac_Digits := 0 end {if} else begin { string represents a real } Num_Int_Digits := DP-1; Num_Frac_Digits := length(NumStr)-DP end; {else} { Convert integer part to numeric form. } for I := 1 to Num_Int_Digits do begin Integer_Part := 10*Integer_Part + ord(NumStr[1]) - ord('0'); delete(NumStr,1,1) end; {for} if NumStr <> '' then { delete decimal point from string } delete(NumStr,1,1); { Convert fraction part (if any) to numeric form. } if Num_Frac_Digits > 0 then { first check for extra decimal point } if pos('.', NumStr) = 0 then begin { conversion process } for I := 1 to Num_Frac_Digits do begin Fraction_Part := 10*Fraction_Part + ord(NumStr[1]) - ord('0'); Power_of_Ten := 10*Power_of_Ten; delete(NumStr,1,1) end; {for} Fraction_Part := Fraction_Part/Power_of_Ten end {if} else Syntax_Error := TRUE; Str_to_Num := Integer_Part + Fraction_Part end; {Str_to_Num} {- - - - - - - - - - - - - - - - - - - - - - - -} begin { Next_Token } { Get and initialize token node. } new(Token); Token^.Link := NIL; while InFix[1] = ' ' do { remove leading blanks } delete(InFix,1,1); TStr := InFix[1]; { Transfer first character of infix to TStr. } delete(InFix,1,1); if TStr[1] in ['0'..'9','.'] then begin { Token is a number. } Token^.NodeType := Numeric; { Read the number as a string of valid numeric characters. } while (InFix <> '') and (InFix[1] in ['.','0'..'9']) do begin TStr := concat(TStr, InFix[1]); delete(InFix,1,1) end; {while} { Convert string representation to numeric. } Token^.Value := Str_to_Num(TStr, Syntax_Error); { Do a little error checking. A number cannot directly follow another numeric token or a function token. } if NOT Syntax_Error then if (Previous_Token = 'N') OR (Previous_Token = 'F') then Syntax_Error := TRUE else {reset previous token code} Previous_Token := 'N' end {if} else begin { Token is character type token. } Token^.NodeType := Character; TChar := TStr[1]; Token^.Code := TChar; { Determine priority of token } case TChar of 'X','Y','R','D','(',')': Token^.Priority := 0; '+': Token^.Priority := 1; '-': if Previous_Token = '(' then begin Token^.Priority := 3; TChar := '~'; Token^.Code := '~' end {if} else Token^.Priority := 1; '*','/': Token^.Priority := 2; '^': Token^.Priority := 4; { Also check for syntax errors in function tokens. } 'A': if (Length(InFix) > 1) and (InFix[1] = 'B') .and (InFix[2] = 'S') then begin Token^.Priority := 5; delete(InFix,1,2) end {if} else Syntax_Error := TRUE; 'C': if (Length(InFix) > 1) and (InFix[1] = 'O') .and (InFix[2] = 'S') then begin Token^.Priority := 5; delete(InFix,1,2) end {if} else Syntax_Error := TRUE; 'E': if (Length(InFix) > 1) and (InFix[1] = 'X') .and (InFix[2] = 'P') then begin Token^.Priority := 5; delete(InFix,1,2) end {if} else Syntax_Error := TRUE; 'L': if (Length(InFix) > 0) and (InFix[1] = 'N') then begin Token^.Priority := 5; delete(InFix,1,1) end {if} else Syntax_Error := TRUE; 'S': if (Length(InFix) > 1) and (InFix[1] = 'I') .and (InFix[2] = 'N') then begin Token^.Priority := 5; delete(InFix,1,2) end {if} else if (Length(Infix)>1) and (Infix[1] = 'Q') /and (Infix[2] = 'R') then begin Token^.Priority := 5; Token^.Code := 'Q'; delete(InFix,1,2) end {else if} else Syntax_Error := TRUE; 'T': if (Length(Infix) > 1) and (InFix[1] = 'A') .and (InFix[2] = 'N') then begin Token^.Priority := 5; delete(InFix,1,2) end {if} else Syntax_Error := TRUE; OTHERWISE: Syntax_Error := TRUE { Since token was not in list } end; {case} if NOT Syntax_Error then begin { Do a little error checking. } T := Token^.Priority; if ((T = 5) OR (TChar in ['X','Y','R','D','('])) AND (Previous_Token = 'N') then Syntax_Error := TRUE else if ((T = 5) OR (TChar in ['X','Y','R','D'])) AND (Previous_Token = 'F') then Syntax_Error := TRUE else if ((T = 1) OR (T = 2) OR (T = 4) OR (TChar = ')')) AND (Previous_Token <> 'N') then Syntax_Error := TRUE; { Reset previous token code. } if NOT Syntax_Error then if Token^.Nodetype = Numeric then Previous_Token := 'N' else if TChar in ['X','Y','R','D',')'] then Previous_Token := 'N' else if TChar = '(' then Previous_Token := '(' else if T = 5 then Previous_Token := 'F' else Previous_Token := chr(0) end {if} end; {else} Next_Token := Token end; {Next_Token} {- Append - | -| | This procedure appends the input token to | | the postfix expression. | | -| | Called by: Convert | | -| | In parameter: The token | | In/Out parameter: Pointer to last token | | in postfix expression | --} procedure Append(var Tail {in/out}: NodePtr; Item {in}: NodePtr); var Temp: NodePtr; begin if Item^.Link <> NIL then {Item is on stack, append copy to postfix. } new(Temp) else { The item itself is appended to postfix. } Temp := Item; Temp^ := Item^; Tail^.Link := Temp; Tail := Temp; Temp^.Link := NIL end; {Append} {- Push - | -| | Push a token onto the stack | | -| | Called by: Co nvert | | -| | In parameter: The token | | In/Out parameter: The top of stack ptr | --} procedure Push(var TOS {in/out}: NodePtr; Item {in}: NodePtr); begin Item^.Link := TOS; TOS := Item end; {- Pop - | -| | Delete the top element from the stack. | | -| | Called by: Convert | | -| | In/Out parameter: The top of stack ptr | --} procedure Pop(var TOS {in/out}: NodePtr); var Temp: NodePtr; begin Temp := TOS; TOS := TOS^.Link; dispose(Temp) end; {Pop} {* Convert code starts here *} begin TempStr := InString; Syntax_Error := FALSE; Previous_Token := '('; { Create 'NULL' node on stack. } new(TOS); TOS^.NodeType := Character; TOS^.Priority := 0; TOS^.Code := '@'; TOS^.Link := NIL; {Create a dummy head node. } new(PostFix); Tail := PostFix; { Process the user's infix expression. } while (Length(InString) > 0) and not Syntax_Error do begin Token := Next_Token(InString, Previous_Token, Syntax_Error); if not Syntax_Error then begin { Numbers and variables are immediately appended to postfix. } if Token^.NodeType = Numeric then Append(Tail, Token) else if Token^.Code in ['X','Y','R','D'] then Append(Tail, Token) { Left parenthesis is pushed onto the stack. } else if Token^.Code = '(' then Push(TOS, Token) { When a right parenthesis is encountered, operators are pulled from the stack and appended to postfix until the corresponding left parenthesis is encountered. The left parenthesis is pulled from the stack, and both parentheses are discarded. } else if Token^.Code = ')' then begin while (TOS^.Code <> '(') and (TOS^.Code <> '@') do begin Append(Tail, TOS); Pop(TOS) end; {while} if TOS^.Code = '@' then Syntax_Error := TRUE else Pop(TOS) end {else if} { The only thing left is operators. Operators of higher priority, if any, are pulled from the stack and appended to postfix. The current operator is then pushed onto the stack. } else begin while Token^.Priority <= TOS^.Priority do begin Append(Tail, TOS); Pop(TOS) end; {while} Push(TOS, Token) end {else} end {if} end; {while} if Syntax_Error then begin { Print syntax error message if needed. } GotoXY(18,1); L := length(TempStr) - length(InString) + 4; for I := 1 to L do write(' '); writeln('^'); writeln('Syntax error!') end {if} { Remove the remaining operators from the stack and append to postfix. } else begin while TOS^.Code <> '@' do begin if TOS^.Code = '(' then begin Syntax_Error := TRUE; writeln('Unmatched Left Parenthesis!') end; Append(Tail, TOS); Pop(TOS) end; {while} Pop(TOS) { Pull NULL node from stack } end; {else} Convert := PostFix^.Link; dispose(PostFix) end; {Convert} {* Get_Function * * D* * This procedure asks the user to enter the expression to be * * graphed. It is entered in normal infix notation and converted * * to postfix. 7* * D* * Called by: MAIN DRIVER ,* * D* * Out Parameter: The postfix expression * * In/Out parameter: The infix expression * * D* *E} procedure Get_Function(var InFix {in/out}: Str255; var PostFix {out}: NodePtr); var J, {Loop counter} Last: integer; {Index of last character in infix expression} Temp: real; {Used in checking for postfix errors} TempPtr, {Used when returning old nodes to heap} OldPtr: NodePtr; {Previous postfix pointer} OldStr, {Previous infix expression} TempStr: Str255; {Temporary storage of infix expression} Dummy, Dialog: Dialog_Ptr; {Pointer to dialog box} Pushed, {Stores way in which user exited dialog box} Prompt, {Points to prompt in dialog box} User_Input, {Points to user input item in dialog box} Quit_Btn, {Quit button in dialog box} Ok_Btn: integer; {Ok button in dialog box} begin OldStr := Infix; OldPtr := PostFix; { Get a valid infix expression from the user. } Clear_Screen; repeat if Res = Low then Dialog := New_Dialog(4,0,0,38,5) else Dialog := New_Dialog(4,0,0,78,5); Prompt := Add_DItem(Dialog,G_Text,None,1,1,2,1,0,256*Black); Set_DText(Dialog,Prompt,'Z=',3,TE_Center); if Res = Low then begin User_Input := Add_DItem(Dialog,G_FText,Editable, '3,1,34,1,0,256*Black|128); Set_DEdit(Dialog,User_Input,'_"', "'X"', #Infix,3,TE_Left) end {if} else begin User_Input := Add_DItem(Dialog,G_FText,Editable, !3,1,74,1,0,256*Black|128); Set_DEdit(Dialog,User_Input, '_J', 'XJ', Infix,3,TE_Left) end; {else} Quit_Btn := Add_DItem(Dialog,G_Button,Selectable|Exit_Btn, 1,3,8,1,0,0); Set_DText(Dialog,Quit_Btn,'ABORT',3,TE_Center); Ok_Btn := Add_DItem(Dialog,G_Button,Selectable|Exit_Btn, 12,3,8,1,0,0); Set_DText(Dialog,Ok_Btn,' OK ',3,TE_Center); Center_Dialog(Dialog); Set_Mouse(M_Arrow); Show_Mouse; Pushed := Do_Dialog(Dialog,User_Input); End_Dialog(Dialog); Hide_Mouse; Clear_Screen; Delete_Dialog(Dialog); Syntax_Error := FALSE; if Pushed = Ok_Btn then begin Get_DEdit(Dialog,User_Input,TempStr); if TempStr <> '' then begin {remove trailing blanks} InFix := TempStr; Last := Length(InFix); while (Last > 0) AND (Infix[Last] = ' ') do begin delete(InFix, Last, 1); Last := Last - 1 end; {while} {Convert to all uppercase} for J := 1 to Last do if InFix[J] in ['a'..'z'] then InFix[J] := chr(ord(InFix[J])-32) end; {if} PostFix := Convert(InFix, Syntax_Error) end {if} until NOT Syntax_Error; if Pushed = Ok_Btn then begin Must_Load1 := TRUE; Must_Transform := TRUE; while OldPtr<>NIL do begin {return previous postfix memory to heap} TempPtr := OldPtr; OldPtr := OldPtr^.Link; dispose(TempPtr) end {for} end {if} else begin Infix := OldStr; PostFix := OldPtr end end; {Get_Function} {* Get_View * * D* * Get the viewpoint and other parameters related to screen view. * * D* * Called by: MAIN DRIVER ,* * D* * Out parameters: Azimuth, Altitude, Screen_Scale, Plot_Speed, * * Draw_Top, Draw_Bottom * * D* *E} procedure Get_View(var Azimuth, Altitude, Screen_Scale: integer; var Fast_Plot, Perspective, Draw_Both_Ways, Hidden_Lines, Draw_Top, Draw_Bottom, Must_Transform: boolean); var TStr: Str255; { Temporary storage used in Draw_String } TempAz, TempAL, TempSc: integer; { Temporary storage in } TempPF, TempPE, TempBW, { case of an abort } TempHL, TempDT, TempDB: boolean; r: 1..2; { 1 if color monitor used, 2 otherwise } begin TempAz := Azimuth; TempAl := Altitude; TempSc := Screen_Scale; TempPF := Plot_Fast; TempPE := Perspective; TempBW := Draw_Both_Ways; TempHL := Hidden_Lines; TempDT := Draw_Top; TempDB := Draw_Bottom; if Res = Hi then r := 2 else r := 1; Clear_Screen; Set_Mouse(M_Arrow); TStr := ' '; { Draw Arrows } TStr[1] := chr(4); Draw_String(96,22*r, TStr); Draw_String(96,102*r, TStr); TStr[1] := chr(3); Draw_String(161,22*r, TStr); Draw_String(161,102*r, TStr); TStr[1] := chr(1); Draw_String(129,46*r, TStr); TStr[1] := chr(2); Draw_String(129,78*r, TStr); { Draw check marks where necessary } TStr[1] := chr(8); if Fast_Plot then Draw_String(89,126*r, TStr); if Perspective then Draw_String(89,142*r, TStr); if Draw_Both_Ways then Draw_String(89,158*r, TStr); if Hidden_Lines then Draw_String(89,174*r, TStr); if Draw_Top then Draw_String(89,190*r, TStr); if Draw_Bottom then Draw_String(89,198*r, TStr); { Display screen text } GotoXY(3,3); write('Azimuth'); GotoXY(3,15); write(Azimuth:4); GotoXY(8,2); write('Altitude'); GotoXY(8,16); write(Altitude:3); GotoXY(13,6); write('Size'); GotoXY(13,16); write(Screen_Scale:3,'%'); GotoXY(16,14); write('Fast plot'); GotoXY(18,14); write('Perspective'); GotoXY(20,14); write('Lines both ways'); GotoXY(22,14); write('Hidden lines'); GotoXY(24,5); write('Graph:'); GotoXY(24,14); write('Top'); GotoXY(25,14); write('Bottom'); Draw_String(253,66*r, 'ABORT'); Text_Style(Thickened); Draw_String(265,104*r, 'OK'); Text_Style(Normal); { Draw boxes } Frame_Rect(108,12*r,48,16*r); Frame_Rect(108,52*r,48,16*r); Frame_Rect(108,92*r,48,16*r); Frame_Rect(241,55*r,64,16*r); Frame_Rect(241,81*r,64,40*r); { Get and process any user changes } TStr[1] := chr(8); Done := FALSE; repeat Show_Mouse; Event := Get_Event(E_Button,1,1,1,0,FALSE,0,0,0,0,FALSE,0,0,0,0, Dummy_Buffer,Dummy,Dummy,Dummy,mx,my,Dummy); Hide_Mouse; if Res = Hi then my := my DIV 2; if Event = E_Button then if (mx>241) AND (mx<305) then begin if (my>81) AND (my<121) then Done := TRUE else if (my>55) AND (my<71) then begin { Restore values and abort } Azimuth := TempAz; Altitude := TempAl; Screen_Scale := TempSc; Plot_Fast := TempPF; Perspective := TempPE; Draw_Both_Ways := TempBW; Hidden_Lines := TempHL; Draw_Top := TempDT; Draw_Bottom := TempDB; Done := TRUE end {else if} end {if} else if(my>14) AND (my<25) then begin if (mx>95) AND (mx<106) AND (Azimuth>-180) then begin Azimuth := Azimuth - 5; Must_Transform := TRUE end {if} else if (mx>160) AND (mx<171) AND (Azimuth<180) then begin Azimuth := Azimuth + 5; Must_Transform := TRUE end; {else if} GotoXY(3,15); write(Azimuth:4) end {else if} else if (mx>128) AND (mx<139) AND (my<81) then begin if (my>38) AND (my<49) AND (Altitude<90) then begin Altitude := Altitude + 5; Must_Transform := TRUE end {if} else if (my>70) AND (my<81) AND (Altitude>-90) then begin Altitude := Altitude - 5; Must_Transform := TRUE end; {else if} GotoXY(8,16); write(Altitude:3) end {else if} else if(my>94) AND (my<105) then begin if (mx>95) AND (mx<106) AND (Screen_Scale > 50) then begin Screen_Scale := Screen_Scale - 10; Must_Transform := TRUE end {if} else if (mx>160) AND (mx<171) AND (Screen_Scale < 200) then begin Screen_Scale := Screen_Scale + 10; Must_Transform := TRUE end; {else if} GotoXY(13,16); write(Screen_Scale:3) end {else if} else if(mx>104) AND (mx<177) AND (my>120) AND (my<129) then if Fast_Plot then begin Fast_Plot := FALSE; GotoXY(16,13); write(' '); GotoXY(16,12); write(' ') end {if} else begin Fast_Plot := TRUE; Draw_String(89,126*r, TStr) end {else} else if (mx>104) AND (mx<193) AND (my>136) AND (my<145) then if Perspective then begin Perspective := FALSE; GotoXY(18,13); write(' '); GotoXY(18,12); write(' '); Must_Transform := TRUE end {if} else begin N Perspective := TRUE; Draw_String(89,142*r, TStr); Must_Transform := TRUE end {else} else if (mx>104) AND (mx<225) AND (my>152) AND (my<161) then if Draw_Both_Ways then begin Draw_Both_Ways := FALSE; GotoXY(20,13); write(' '); GotoXY(20,12); write(' ') end {if} else begin Draw_Both_Ways := TRUE; Draw_String(89,158*r, TStr) end {else} else if (mx>104) AND (mx<241) AND (my>168) AND (my<177) then if Hidden_Lines then begin Hidden_Lines := FALSE; GotoXY(22,13); write(' '); GotoXY(22,12); write(' ') end {if} else begin Hidden_Lines := TRUE; Draw_String(89,174*r, TStr) end {else} else if (mx>104) AND (mx<129) AND (my>184) AND (my<193) then if Draw_Top then begin Draw_Top := FALSE; GotoXY(24,13); write(' '); GotoXY(24,12); write(' ') end {if} else begin Draw_Top := TRUE; Draw_String(89,190*r, TStr) end {else} else if (mx>104) AND (mx<153) AND (my>192) AND (my<200) then if Draw_Bottom then begin Draw_Bottom := FALSE; GotoXY(25,13); write(' '); GotoXY(25,12); write(' ') end {if} else begin Draw_Bottom := TRUE; Draw_String(89,198*r, TStr) end {else} until Done end; {Get_View} {* Evaluate_Function * * D* * Evaluates the Postfix expression "* * D* * Called by: Load_Point_Array '* * D* * Variables are accessed globally to reduce execution time * * D* *E} function Evaluate_Function(Head {in}: NodePtr): real; var TOS: 0..100; Stack: array [1..100] of real; Cosine_Val: real; Temp: integer; Undefined, PostFix_Error: boolean; begin { Initialize flags and data stack. } PostFix_Error := FALSE; Undefined := FALSE; TOS := 0; { Process postfix expression } while (Head<> NIL) and not PostFix_Error and not Undefined do begin { Push numbers onto the stack, } if Head^.NodeType = Numeric then begin TOS := TOS + 1; Stack[TOS] := Head^.Value end {if} { or push the value of a variable onto the stack, } else if Head^.Code = 'X' then begin TOS := TOS + 1; Stack[TOS] := x end {else if} else if Head^.Code = 'Y' then begin TOS := TOS + 1; Stack[TOS] := y end {else if} else if Head^.Code = 'R' then begin TOS := TOS + 1; Stack[TOS] := r end {else if} else if Head^.Code = 'D' then begin TOS := TOS + 1; Stack[TOS] := d end {else if} { or apply negation operator, } else if Head^.Priority = 3 then if TOS>0 then Stack[TOS] := -Stack[TOS] else PostFix_Error := TRUE { or apply function to TOS element, } else if Head^.Priority = 5 then if TOS>0 then case Head^.Code of 'A': Stack[TOS] := ABS(Stack[TOS]); 'C': Stack[TOS] := COS(Stack[TOS]); 'E': if Stack[TOS] < -50 then Stack[TOS] := 0 else if Stack[TOS] < 50 then Stack[TOS] := EXP(Stack[TOS]) else Undefined := TRUE; 'L': if Stack[TOS] > 0 then Stack[TOS] := LN(Stack[TOS]) else Undefined := TRUE; 'Q': if Stack[TOS] >= 0 then Stack[TOS] := SQRT(Stack[TOS]) else Undefined := TRUE; 'S': Stack[TOS] := SIN(Stack[TOS]); 'T': begin Cosine_Val := COS(Stack[TOS]); if ABS(Cosine_Val) > 0.01 then Stack[TOS] := SIN(Stack[TOS])/COS(Stack[TOS]) else Undefined := TRUE end {case option} end {case} else PostFix_Error := TRUE { or else the token is a binary operator which is applied to top two stack elements and the result replaces both of them. } else if TOS>1 then begin TOS := TOS - 1; case Head^.Code of '+': Stack[TOS] := Stack[TOS] + Stack[TOS+1]; '-': Stack[TOS] := Stack[TOS] - Stack[TOS+1]; '*': Stack[TOS] := Stack[TOS] * Stack[TOS+1]; '/': if ABS(Stack[TOS+1]) > 0.01 then Stack[TOS] := Stack[TOS] / Stack[TOS+1] else Undefined := TRUE; { The program can handle two types of exponentiation. If the base (TOS) is positive, the normal process of using EXP and LN functions is used. If the base is negative and the exponent is an integer, then we have to apply some algebraic trickery first. If the base has a value of zero, the result is set to zero as well. } '^': if Stack[TOS] > 0 then Stack[TOS] := EXP(Stack[TOS+1]*LN(Stack[TOS])) else if Stack[TOS] < 0 then begin Temp := round(Stack[TOS+1]); if abs(Temp - Stack[TOS+1]) < 0.01 then begin Stack[TOS] := EXP(Stack[TOS+1]*LN(-Stack[TOS])); if Odd(Temp) then Stack[TOS] := -Stack[TOS] end {if} else Undefined := TRUE end {else if} else Stack[TOS] := 0 end {case} end {if} { If we get this far, then postfix token is invalid. Not likely to happen. } else PostFix_Error := TRUE; Head:= Head^.Link { Move to next token in postfix. } end; {while} { At the end, there should be only one element remaining on the stack, namely the final result. Otherwise, the postfix expression is invalid. We skip this if the function is undefined for the current value of X. } if not Undefined then begin if TOS = 1 then if Stack[TOS] > Max_Z then Evaluate_Function := Max_Z else if Stack[TOS] < Min_Z then Evaluate_Function := Min_Z else Evaluate_Function := Stack[TOS] else PostFix_Error := TRUE; { Print error message if necessary. } if PostFix_Error then begin writeln('Postfix error detected!'); writeln; writeln('This is usually caused by too few'); writeln('operators. Check for missing arithmetic'); writeln('symbols; especially multiplication "*".') end {if} end {if} else Evaluate_Function := Max_Z end; {Evaluate_Function} {* Load_Point_Array * * D* * Load the logical coordinate point arrays. * * D* * Called by: MAIN DRIVER ,* * D* * Accessed as global variables: lx, ly, lz, XLim, YLim, Grid_Scale, * * Must_Load1, Must_Load2, * * Must_Transform * * D* *E} procedure Load_Point_Array; var i,j: integer; { Loop counters } begin Clear_Screen; Draw_String(0,100,'CALCULATING POINT COORDINATES...'); Set_Mouse(M_Bee); Show_Mouse; Max_Z := 2*Grid_Scale*XLim; Min_Z := -Max_Z; { Calculate values for logical coordinates } for I := -XLim to XLim do for j := -YLim to YLim do begin x := I*Grid_Scale; y := J*Grid_Scale; r := x*x+y*y; d := sqrt(r); lz[i,j] := Evaluate_Function(PostFix); lx[i,j] := x; ly[i,j] := y end; {for} Hide_Mouse; Must_Load1 := FALSE; Must_Load2 := FALSE; Must_Transform := TRUE end; {Load_Point_Array} {* Transform_Point_Array * * D* * Transform the coordinate arrays into screen coordinates. Scale * * and viewpoint are taken into account. * * D* * Called by: MAIN DRIVER ,* * D* * Accessed as global variable s: Azimuth, Altitude, Screen_Scale, * * Grid_Scale, XLim, YLim, lx, ly, lx, sx, sy, Perspective, * * X_Center, Y_Center, SF &* * D* *E} procedure Transform_Point_Array; var i,j : integer; { Loop counters } Temp, { Temporary storage } AzRad, { Azimuth in radians } AltRad, { Altitude in radians } NewZ, { Transformed z-coordinate } Display_Scale, { Scaling factor used in drawing graph } pf, { Perspective factor } c1,s1,c2,s2, { cos(AzRad), sin(AzRad), cos(AltRad), sin(AltRad) } mf1,mf2: real; { Multiplicative factors to create graph that will nearly } { fill the screen. } begin Clear_Screen; Draw_String(0,100, 'TRANSFORMING THE POINTS...'); Set_Mouse(M_Bee); Show_Mouse; AzRad := Azimuth*Pi/180; c1 := cos(AzRad); s1 := sin(AzRad); AltRad := Altitude*Pi/180; c2 := cos(AltRad); s2 := sin(AltRad); Display_Scale := Screen_Scale/100; mf1 := 0.90*X_Center*Display_Scale/(XLim*Grid_Scale); mf2 := mf1*SF; { Transform logical to screen coordinates } for I := -XLim to XLim do for j := -YLim to YLim do begin Temp := lx[i,j]*s1-ly[i,j]*c1; NewZ := c2*Temp+lz[i,j]*s2; if Perspective then pf := 1/(1-NewZ/(140*Grid_Scale)) else pf := 1; sx[i,j] := X_Center+round(mf1*pf*(lx[i,j]*c1+ly[i,j]*s1)); sy[i,j] :=Y_Center-round(mf2*pf*(s2*(-Temp)+lz[i,j]*c2)) end; {for} Hide_Mouse; Must_Transform := FALSE end; { Transform_Point_Array } {* Draw Line * * D* * This procedure draws the visible portion(s) of the line between * * the two points passed in as parameters. The maximum and minimum * * arrays are updated as necessary. "* * D* * Called by: Draw_Graph -* * D* * In parameters: The coordinates of two points * * D* * Global variables accessed: Max, Min, Draw_Top, Draw_Bottom, * * Plot_Fast * * D* *E} procedure Draw_Line(x1,y1,x2,y2: integer); var f1 ,f2: 0..2; { Flag = 2 ===> Point visible above } { Flag = 1 ===> Point visible below } { Flag = 0 ===> Point is hidden } dx, dy, { delta x = x2 - x1, delta y = y2 - y1 } tx, ty: integer; { Temporary storage } inc, { Temporary storaged } incx, incy, { Increments used to plot line pixel by pixel } { when only part of line is visible. } t1, t2, { Horizontal and vertical distance from first } { point. Used when plotting pixel by pixel. } slope: real; { Slope of line segment between points } {- Adjust_Min - | .| | Adjust the array indicating the upper limit | | of the graph. | | .| | Called by: Draw_Line | | .| | Global variables accessed: x1,x2,y1,y2 | | .| -.} procedure Adjust_Min; var x: integer; {Loop counter} begin if x1>x2 then {Line goes left to right} for x := x1 downto x2 do begin min[x] := y1 + round((x-x1)*slope); if max[x] = minint then max[x] := min[x] end {for} else {Line goes right to left} for x := x1 to x2 do begin min[x] := y1 + round((x-x1)*slope); if max[x] = minint then Y max[x] := min[x] end {for} end; {Adust_Min} {- Adjust_Max - | .| | Adjust the array indicating the lower limit | | of the graph. | | .| | Called by: Draw_Line | | .| | Global variables accessed: x1,x2,y1,y2 | | .| -.} procedure Adjust_Max; var x: integer; {Loop counter} begin if x1>x2 then {Line goes left to right} for x := x1 downto x2 do begin max[x] := y1 + round((x-x1)*slope); if min[x] = maxint then min[x] := max[x] end {for} else {Line goes right to left} for x := x1 to x2 do begin max[x] := y1 + round((x-x1)*slope); if min[x] = maxint then min[x] := max[x] end {for} end; {Adust_Max} {- Swap_Points - | .| | Swap the two input points and associated | | variables. All are accessed as global | | values within Draw_Line. | | .| | Called by: Draw_Line | | .| | Global variables accessed: x1,x2,y1,y2,f1, | | f2, incx, incy | | .| -.} procedure Swap_Points; var TempInt: integer; begin TempInt := x1; x1 := x2; x2 := TempInt; TempInt := y1; y1 := y2; y2 := TempInt; TempInt := f1; f1 := f2; f2 := TempInt; incx := -incx; incy := -incy end; {Swap_Points} {-.} begin { Check visibility of first point } if y1 <= min[x1] then { point is visible above graph } f1 := 2 else if y1 >= max[x1] then { point is visible below graph } f1 := 1 else { point is hidden } f1 := 0; { Check visibility of second point } if f1 <> 1 then { check for visible above graph first } if y2 <= min[x2] then { visible above } f2 := 2 else if y2 >= max[x2] then { visible below } f2 := 1 else { hidden } f2 := 0 else { Since first point was below, check second point for below first } if y2 >= max[x2] then { below } f2 := 1 else if y2 <= min[x2] then { above } f2 := 2 else { hidden } f2:=0; dx := x2 - x1; dy := y2 - y1; if (f1 | f2) > 0 then {at least one point is visible} if abs(dx)+abs(dy) = 0 then { Line consists of single point } Plot(x1,y1) else begin if (f1 = f2) AND (dx <> 0) AND Plot_Fast then begin { Draw line segment } slope := dy/dx; if (f1 = 2) then begin {both points above the graph} if Draw_Top then begin Line_Color(1); line(x1,y1,x2,y2) end; {if} Adjust_Min end {if} else begin {both points below the graph} if Draw_Bottom then begin if Res <> Hi then Line_Color(2); line(x1,y1,x2,y2) end; {if} Adjust_Max end {else if} end {if} else begin if abs(dy)>abs(dx) then inc := 1/abs(dy) else inc := 1/abs(dx); incx := inc*dx; incy := inc*dy; if ((f1=2) OR (f2 = 2)) AND Draw_Top then begin { One of the points is visible above the graph } if y1y2 then Swap_Points; { so line goes from (x1,y1) DOWN to (x2,y2) } if Res <> Hi then line_color(2); t1 := 0; t2 := 0; repeat { Check line pixel by pixel } tx := x1 + round(t1); ty := y1 + round(t2); if ty>max[tx] then begin { pixel is visible so plot it } plot(tx,ty); max[tx] := ty; { and adust Max array } if min[tx] = maxint then min[tx] := ty end; {if} t1 := t1+incx; t2 := t2 +incy until (tx=x2); { you're in same vertical column as (x2,y2) } { so plot remaining vertical segment, if any } if x1 max[x2]) OR (ty > max[tx]) then plot(x2,ty); ty := ty+1 until ty>y2; if f2 = 1 then begin max[x2] := y2; if min[x2] = maxint then min[x2] := y2 end {if} end {if} end {else} end; {else} Line_Color(1) end; {* Draw_Graph * * D* * Draw the graph 4* * D* * Called by: MAIN DRIVER ,* * D* * Variables accessed globally: sx, sy, Azimuth, Intensity, Res * * Draw_Both_Ways, XLim, YLim * * D* *E} procedure Draw_Graph; var XStart, Xstep, Xstop, { Values for x-coordinate loops } YStart, YStep, YStop, { Values for y-coordinate loops } NextI, NextJ, { Next row, next column } Zone, { Octant from which graph is viewed } I, J: integer; { Loop counters } T: array [1..3] of integer; begin if Res <> Hi then {Load graph colors} for I := 0 to 1 do begin for J := 1 to 3 do T[J] := 60 + 125*Intensity[I,J]; Set_Color(I,T[1],T[2],T[3]) end; {for} { Find Zone } if Azimuth > 135 then Zone := 1 else if Azimuth > 90 then Zone := 2 else if Azimuth > 45 then Zone := 3 else if Azimuth > 0 then Zone := 4 else if Azimuth >-45 then Zone := 5 else if Azimuth >-90 then Zone := 6 else if Azimuth>-135 then Zone := 7 else Zone := 8; { Initialize Min and Max arrays } for I := -640 to 1280 do begin max[I] := minint; min[I] := maxint end; {for} { Set up loop parameters } if Zone in [1,2,7,8] then begin YStart := YLim; YStep := -1 end {if} else begin YStart := -YLim; YStep := 1 end; {else} if Zone in [1,2,3,4] then begin XStart := XLim; XStep := -1 end {if} else begin XStart := -XLim; XStep := 1 end; {else} { Draw the graph } Clear_Screen; if Zone in [1,4,5,8] then begin J := YStart; YStop := -YStart + YStep; repeat I := XStart; XStop := -XStart; repeat NextI := I + XStep; Draw_Line(sx[I,J],sy[I,J],sx[NextI,J],sy[NextI,J]); I := NextI until I = XStop; if (J <> -YStart) AND Draw_Both_Ways then begin I := XStart; XStop := XStop + XStep; NextJ := J + YStep; repeat Draw_Line(sx[I,J],sy[I,J],sx[I,NextJ],sy[I,NextJ]); I := I + XStep until I = XStop end; {if} J := J + YStep; until J = YStop end {if} else begin I := XStart; XStop := -XStart + XStep; repeat J := YStart; YStop := -YStart; repeat NextJ := J + YStep; Draw_Line(sx[I,J],sy[I,J],sx[I,NextJ],sy[I,NextJ]); J := NextJ until J = YStop; if (I <> -XStart) AND Draw_Both_Ways then begin J := YStart; YStop := YStop + YStep; NextI := I + XStep; repeat Draw_Line(sx[I,J],sy[I,J],sx[NextI,J],sy[NextI,J]); J := J + YStep until J = YStop end; {if} I := I + XStep; until I = XStop end; {else} repeat Event := Get_Event(E_Button,1,1,1,0,FALSE,0,0,0,0,FALSE,0,0,0,0, Dummy_Buffer,Dummy,Dummy,Dummy,Dummy,Dummy,Dummy); until Event = E_Button; if Res <> Hi then begin Set_Color(0,1000,1000,1000); Set_Color(1,0,0,0) end {if} end; {Draw_Graph} {* Quick_Draw_Graph * * D* * Draw the graph without worrying about hidden lines. * * D* * Called by: MAIN DRIVER ,* * D* * Variables accessed globally: sx, sy, Azimuth, Intensity, Res, * * XLim, YLim * * D* *E} procedure Quick_Draw_Graph; var I, J: integer; { Loop counters } T: array [1..3] of integer; begin Clear_Screen; if Res <> Hi then { Load graph colors } for I := 0 to 1 do begin for J := 1 to 3 do T[J] := 60 + 125*Intensity[I,J]; Set_Color(I,T[1],T[2],T[3]) end; {for} for I := -XLim to XLim do begin Plot(sx[I,-Ylim], sy[I,-YLim]); for J := -YLim+1 to YLim do Line_to(sx[I,J], sy[I,J]) end; {for} for J := -YLim to Ylim do begin Plot(sx[-XLim,J],sy[-XLim,J]); for I := -XLim to XLim do Line_to(sx[I,J], sy[I,J]) end; {for} repeat Event := Get_Event(E_Button,1,1,1,0,FALSE,0,0,0,0,FALSE,0,0,0,0, Dummy_Buffer,Dummy,Dummy,Dummy,Dummy,Dummy,Dummy); until Event = E_Button; if Res <> Hi then begin Set_Color(0,1000,1000,1000); Set_Color(1,0,0,0) end {if} end; {Quick_Draw_Graph} {* Show_Help * * D* * Display help screen for main menu. * * D* * Called by: MAIN DRIVER ,* * D* *E} procedure Show_Help; var Quit: boolean; Help_Screen: integer; r: 1..2; { 1 if color monitor used, 2 otherwise } begin Help_Screen := 1; Quit := FALSE; if Res = Hi then r := 2 else r := 1; repeat Clear_Screen; GotoXY(1,1); case Help_Screen of { Print current help screen } 1: begin writeln('This program draws graphs of three'); writeln('dimensional functions of the type'); writeln('z = f(x,y). You can enter your own'); writeln('functions by simply typing them in.'); writeln; writeln('You control every aspect of the display'); writeln('including colors, size, and viewpoint.'); writeln; writeln('Clicking on an ABORT button will cancel'); writeln('any changes you''ve made in that option'); writeln('and return you to the main menu. It'); writeln('will also prevent the program from'); writeln('thinking it needs to recalculate or'); writeln('transform the point coordinates.') end; 2: begin writeln(' COLOR'); writeln; writeln('You can choose the background color,'); writeln('as well as the color of the top and'); writeln('bottom surfaces of the graph. Each'); writeln('register (red, green, blue) has a value'); writeln('from 0 (absence of that color) to 7'); writeln('(full intensity). Clicking on an arrow'); writeln('above an intensity value will raise it'); writeln('by one. (Raising a 7 will make it 0.)'); writeln('Clicking on an arrow below an intensity'); writeln('value will decrease the value by one.'); writeln('(Lowering a 0 will make it 7.)'); writeln; writeln('In the event you should accidently make'); writeln('the background and text colors the same,'); writeln('just press the escape (Esc) key.') end; 3: begin writeln(' GRID'); writeln; writeln('The grid scale is the scale per grid'); writeln('line. Acceptable values range from'); writeln('0.10 to 4.00 in steps of 0.05.'); writeln; writeln('You can also choose the number of grid'); writeln('lines used to draw the graph. The'); writeln('X and Y limits are the number of grid'); writeln('lines on the corresponding POSITIVE'); writeln('axis. The actual number of grid lines'); writeln('is given by 2*Limit+1.'); writeln; writeln('The maximum coordinate value is found'); writeln('by multiplying the Limit times the grid'); writeln('scale.'); writeln; writeln('With the default values, there are 33'); writeln('grid lines in each direction with values'); writeln('ranging from -4 to 4 in steps of 0.25.') end; 4: begin writeln(' FUNCTION'); writeln; writeln('The program recognizes the following'); writeln('mathematical functions: ABS, COS, SIN,'); writeln('TAN, LN, EXP, and SQR. When entering'); writeln('your function use the same syntax you'); writeln('would use in BASIC.'); writeln; writeln('The program will allow you to use four'); writeln('variables:'); writeln(' X = x-coordinate'); writeln(' Y = y-coordinate'); writeln(' D = distance from (x,y) to origin'); writeln(' R = D*D (D squared)'); writeln; writeln('Functions can be entered using either'); writeln('upper or lowercase letters.'); end; 5: begin writeln(' VIEW'); writeln; writeln('Azimuth refers to the viewer''s position'); writeln('in the x-y plane as follows:'); writeln; writeln(' Angle (degrees) View from'); writeln(' - - '); writeln(' 0 South'); writeln(' 90 East'); writeln(' -90 West'); writeln(' -180 or 180 North'); writeln; writeln('Elevation refers to the angle above or'); writeln('below the x-y plane (directly above the'); writeln('origin is 90 degrees and directly below'); writeln('is -90).'); writeln; writeln('Screen scale refers to the image size'); writeln('and ranges from 50 to 200 percent of the'); writeln('default size.') end; 6: begin writeln(' VIEW (continued)'); writeln; writeln('FAST plotting is approximately twice as'); writeln('fast as SLOW. However, it assumes that'); writeln('if both endpoints of a line segment are'); writeln('visible then the entire segment will be'); writeln('too. This is not always true. SLOW'); writeln('plotting doesn''t make this assumption'); writeln('and will be more accurate in certain'); writeln('(rather rare) circumstances.'); writeln; writeln('The remaining options are turned on or'); writeln('off by clicking on the corresponding'); writeln('text.') end; 7: begin writeln(' DRAW'); 4 writeln; writeln('Draws the graph on the screen.'); writeln; writeln('The program automatically keeps track'); writeln('of whether it needs to calculate a new'); writeln('set of coordinates. This is necessary'); writeln('anytime you change a value in the GRID'); writeln('option or enter a new function.'); writeln; writeln('The program also keeps track of the'); writeln('need to transform the coordinates'); writeln('because of a change in azimuth,'); writeln('elevation, or screen scale.'); writeln; writeln('These operations will be performed as'); writeln('necessary before the graph is drawn.') end end; { Set up buttons at bottom of help screen } if Help_Screen <> 1 then begin GotoXY(24,3); write('BACK'); Frame_Rect(0,180*r,64,16*r) end; GotoXY(24,19); write('MENU'); Frame_Rect(128,180*r,64,16*r); if Help_Screen <> 7 then begin GotoXY(24,35); write('NEXT'); Frame_Rect(256,180*r,64,16*r) end; { Wait until user clicks on a button and take appropriate action. } Done := FALSE; repeat Set_Mouse(M_Arrow); Show_Mouse; Event := Get_Event(E_Button,1,1,1,0,FALSE,0,0,0,0,FALSE,0,0,0,0, Dummy_Buffer,Dummy,Dummy,Dummy,mx,my,Dummy); Hide_Mouse; if Res = Hi then my := my DIV 2; if Event = E_Button then if (my>180) AND (my<200) then begin if (mx>0) AND (mx<63) AND (Help_Screen<>1) then begin Help_Screen := Help_Screen - 1; Done := TRUE end else if (mx>128) AND (mx<191) then begin Quit := TRUE; Done := TRUE end else if (mx>256) AND (mx<319) AND (Help_Screen<>7) then begin Help_Screen := Help_Screen + 1; Done := TRUE end end until Done until Quit end; {Show_Help} {*0 M A I N D R I V E R *0} begin if INIT_GEM >= 0 then begin Hide_Mouse; Initialization; PostFix := Convert(InFix, Syntax_Error); Option := Menu_Option; while Option <> Quit do begin case Option of Colors: Get_Colors(Intensity); Grid: Get_Grid_Parameters(Grid_Scale, XLim, YLim, Must_Load2); G_Function: Get_Function(InFix, PostFix); View: Get_View(Azimuth,Altitude,Screen_Scale,Plot_Fast, Perspective, Draw_Both_Ways, Hidden_Lines, Draw_Top,Draw_Bottom,Must_Transform); Draw: begin if Must_Load1 or Must_Load2 then Load_Point_Array; if Must_Transform then Transform_Point_Array; if Hidden_Lines then Draw_Graph else Quick_Draw_Graph end; Help: Show_Help end; {case} Option := Menu_Option end; {while} Set_Mouse(M_Arrow); Show_Mouse; Set_Color(0,1000,1000,1000); Set_Color(1,0,0,0); Set_Color(2,1000,0,0); Exit_Gem end {if} end. `Ҁ0 o"h#H#L#P,Oc.N//Bg?<JNA BbByTN}NV?.?. ?<NMN^ _ON/,HNVAB-H?<?<N?<pY?N?<0.@?N?<0. @?NN^,_ _XNNV?<NNN^Nu/,HNVA-HN=@0.`By@3@pd3@BgBg?<@?<Nn?<9/<^vȴA@0 `p3@3@@pd3@BgBg?<?<Nn?</<^5?|A@0 `\p3@3@@3@BgBg?<?<Nn?<9/<^vȴA@0 ` @b@0;N*j09@rAf p=@`p=@N?<?<NrHy Hz?<NNXHy HzN?<NNXHy NXHy Hz?<NNXHy Hz?<NNXHy Hz?<NNX?<ND?<p0.h?CdO$ONBgND?<X0.Q??<@0.(?NVBy`@BgNN2?<?<?<?<p/BgBgBgBgBgBgBgBgBgBgHy`DHy`dHy`dHy`dHy`hHy`fHy`dN3`BN09@rAf09`frH3`f09`BrAfF09`hrXA^09`h|]C09`frQA^C09`fryA]CBd p3`@09`@@d?<Nh?<N?<N p=@ nn:0.@rA_10.@A_ Bp0.@A_BpRn`p3_p3`,p 3`*pd3`(p3`8p3`6p3`4p3`2p3`0p3`.?</<A_0 p3_p3_C0E_""p!QBy`&p3`>p3`:N^,_Nu-3*EXP(-R/8)*(SIN(R/2)-COS(R/3))-1OK Used by persmission of OSS)Copyright (c) 1986, OSS & CCD (Parts of this product are by Delmar Searls 3-D Grapher/,HNVA -HN?<BgBg?<?<N-@p=@ nn 0.@S@=@0.rAW09@rAWCBd>0.@//.?<Bg?<?.?<?<BgBgNh" A1`@0.@//.?<rtB??<?.?<?<BgBgNh" A10.`CLEpQ`C0E`CEpQ`CE`lCE`TCE`0.ְnf Bn`v0.ְnf p=@``0.ְnf p=@`J0.ְnf p=@`40.ְnf p=@`0.ְnf p=@`p=@0.N^,_NuQuitHelpDrawViewFunctionGridColor/,HNVA-HBn nndp=@ nn80.@"n 2.2.A2)}A"n0)"ninHn/. NNzHn NN`Hn/. NN`"n 0@d?<?<Nڂp.r.AX@=@p=@=n0.nnHy ?< NXRn`Hy ?<^NNXHy Hz?< NNX`j"n0)r@AgP"n0)r(Af&"n p2Hy Hz^?<NNXHn/. NNvHn NN`Hn NN"n-Q?< /.NΞ .N^,_ _ONUnmatched Left Parenthesis!Syntax error! /,HNVAt-H"nEp?$Q"n -QN09@J@f ?<BgBg?<&?<N-@`?<BgBg?<N?<N-@/.?<Bg?<?<?<?<Bgp@?Nh=@/.?.CO$O0?<?<N09@J@f/.?<?<?<?<?<"?<Bgp@|?Nh=@/.?.CJO$O"p!QCO$O"p!Q"n IO$Op?$Q?<BgN`/.?<?<?<?<?<J?<Bgp@|?Nh=@/.?.CTO$OJpIQCO$OJpIQ"n IO$Op?$Q?<BgN/.?<prA??<?<?<?<BgBgNh=@/.?.CO$OpQ?<?<N/.?<prA??< ?<?<?<BgBgNh=@/.?.C$O$O?<?<N/.NBgNN2/.?.N=@/.NzNN/.N>By`&0.ذnf"/.?.HnNHn?p3`>p3`: .Jg -n"n-Q?< /.NΞ``"nEp?"Q"n "N^,_ _PN  OK ABORTXJ_JX"_"Z=/,HNVA -H"n0=Q"n,=Q"n(=Q=y`8"n =Q"n=Q"n=Q"n=Q"n=Q09@rAf p=@`p=@NBgNp Cp@?<`0.?AO"Op?"QN?<`0.f?AO"Op?"QNp@?<0.?AO"Op?"QN?<0.f?AO"Op?"QNp@?<0..?AO"Op?"QNp@?<0.N?AO"Op?"QNp@"n$0@d(?<Y0.~?AO"Op?"QN"n 0@d(?<Y0.?AO"Op?"QN"n0@d(?<Y0.?AO"Op?"QN"n0@d(?<Y0.?AO"Op?"QN"n0@d(?<Y0.?AO"Op?"QN"n0@d(?<Y0.?AO"Op?"QN?<?<NHy Hz ?<NX?<?<N"n0Hy ??<NX?<?<NвHy Hz X?<NX?<?<NА"n,Hy ??<NX?< ?<NlHy Hz ?<NX?< ?<NJ"n(Hy ??<N?<%NX?<?<NHy Hz ?< NX?<?<NHy Hz ?< NX?<?<NHy Hz T?<NX?<?<N϶Hy Hz &?< NX?<?<NϔHy Hz ?<NX?<?<NrHy Hz ?<NX?<?<NPHy Hz ?<NX?<0.B?C O$OpQN?<ND?< 0.h?C VO$ONBgND?<l0. ??<00.@?NV?<l0.4??<00.@?NV?<l0.\??<00.@?NV?<0.7??<@0.@?NV?<0.Q??<@0.(?NVp@By`@N2?<?<?<?<p/BgBgBgBgBgBgBgBgBgBgHy`DHy`dHy`dHy`dHy`hHy`fHy`dN3`BN09@rAf09`frH3`f09`BrAf09`h|^09`h|1]CBd09`frQA^09`fryA]CBdp3`@`r09`fr7A^09`frGA]CBdR"n02"n,2"n(23`8"n 2"n2"n2"n2"n2p3`@`09`frA^09`frA]CBd09`hr_A^09`hrjA]C"n00|L^CBd"n0$n00[@2"n p2`F09`h|^09`h|]C"n00|]CBd"n0$n00Z@2"n p2?<?<N"n0Hy ??<NX`H09`h|^09`h|]C09`frQA]CBd09`fr&A^09`fr1A]C"n,0rZA]CBd"n,$n,0Z@2"n p2`F09`frFA^09`frQA]C"n,0rA^CBd"n,$n,0[@2"n p2?<?<N8"n,Hy ??<NX`f09`fr^A^09`friA]CBd09`hr_A^09`hrjA]C"n(0r2A^CBd"n($n(0@2"n p2`H09`h|^09`h|]C"n(0|]CBd"n($n(0@ 2"n p2?< ?<N`"n(Hy ??<NX`09`hrhA^09`h|]C09`frxA^C09`f|]CBd"n$0@dH"n$BQ?<?< NHy ?< NX?<?< NHy ?< NX`0"n$p2?<Y0.~?AO"Op?"QN`09`hrhA^09`h|]C09`f|^C09`f|]CBd"n 0@dP"n BQ?<?< N*Hy ?< NX?<?< N Hy ?< NX"n p2`8"n p2?<Y0.?AO"Op?"QN"n p2`09`hrhA^09`h|]C09`f|^C09`f|]CBd"n0@dH"nBQ?<?< NZHy ?< NX?<?< N09`hrhA^09`h|]C09`f|^C09`f|]CBd"n0@dH"nBQ?<?< NǚHy ?< NX?<?< N|Hy ?< NX`0"np2?<Y0.?AO"Op?"QN`~09`hrhA^09`h|]C09`f|^C09`f|]CBd"n0@dH"nBQ?<?< NHy ?< NX?<?< NƼHy ?< NX`0"np2?<Y0.?AO"Op?"QN`09`hrhA^09`h|]C09`f|^C09`f|]CBd"n0@dH"nBQ?<?< NHy ?< NX?<?< NHy ?< NX`0"np2?<Y0.?AO"Op?"QN09`@@dN^,_ _O(NOKABORTBottomTopGraph:Hidden linesLines both waysPerspectiveFast plotSizeAltitudeAzimuth/,HNVA T-HBnBnBn . JV0.F@@0.F@@Bd "n 0)J@f40.R@=@0."n A]$O4$AA0 ` \"n 0)rXAf20.R@=@0.A@]"O2"AA0 ` "n 0)rYAf20.R@=@0.A@]"O2"AA0 `"n 0)rRAf20.R@=@0.A@]"O2"AA0 `"n 0)rDAf20.R@=@0.A@]"O2"AA0 `\"n 0)rAfN0.rAo80.2.AA]"O2"NAA0 `p=@`"n 0)rAf0.rAo"n 0)`B0.2.AA]"O2"NAA0 `J0./2.AA]"O2"N$ ?/AA0 ` 0.AA]"O2"p?NƪN0@d"0.BgNƪAA0 `x0.AA]"O2"p2?NƪN0@dB0./2.AA]"O2"NR$ ?/AA0 `p=@`@0.AA]"O2"p?NƪN0@dB0./2.AA]"O2"N$ ?/AA0 `p=@`0.AA]"O2"p?NƪN0@dB0./2.AA]"O2"N$ ?/AA0 `p=@`L0./2.AA]"O2"N$ ?/AA0 ` 0.AA]"O2"N?/A0 A]"O2"N?0.@e`0.rAf0.AA]"O2"A@]"O2"N0@dA@]"O2"A0 `p0.AA]"O2"A@]"O2"N0@dA@]"O2"A0 `"0.AA]"O2"A0 `p=@0.@dHy Hz?<NNXHy NXHy Hz?<!NNXHy Hz?<(NNXHy Hz@?<'NNX`A@]"O2"A0 .2.N^,_ _XNsymbols; especially multiplication "*".operators. Check for missing arithmeticThis is usually caused by too fewPostfix error detected!/,HNVA\-HNBg?<dCNO$O pQN?<NN2A_]"O2"?</<N09_?NƪNA@0 A@]"O2"NA@0 09_D@=@=y_0.nn09_D@=@=y_0.nnd0.A_]"O2"?NƞNA@0 0.A_]"O2"?NƞNA@0 A@]"O2"A@]"O2"NA@]"O2"A@]"O2"NNA@0 A@]"O2"N?/A@0 0.2.A//9`"N>$ ?/AI>A0 0.2.AA@]"O2"AJA0 0.2.AA@]"O2"ADA0 Rn`Rn`lNBy`>By`A]"O2"A]"O2"NNA0 09`6@d^prA]"O2"A_]"O2"?</< NN?NƞN?NƞNA0 `?<NƪA0 0.2.AA29@A]"O2"A]"O2"N4.6.CAJA ]"O2"A]"O2"N4.6.CADA ]"O2"A]"O2"NNNN4BA<10.2.AA29@A]"O2"A]"O2"NA]"O2"A]"O2"NN4.6.CAI>A ]"O2"A]"O2"NNNN4BA:1Rn`*Rn`NBy`:N^,_NuTRANSFORMING THE POINTS.../,HNVA^-H V0( Vho V=h V=h0.nm0.@ V2(4. Vh VA]"O2"?NƞNN4BAF10.@AU20|f"0.@2.AAF40AU1Sn`p` V=h V=h0.nn0.@ V2(4. Vh VA]"O2"?NƞNN4BAF10.@AU20|f"0.@2.AAF40AU1Rn`pN^,_Nu/,HNVA^-H V0( Vho V=h V=h0.nm0.@ V2(4. Vh VA]"O2"?NƞNN4BAU10.@AF20|f"0.@2.AAU40AF1Sn`p` V=h V=h0.nn0.@ V2(4. Vh VA]"O2"?NƞNN4BAU10.@AF20|f"0.@2.AAU40AF1Rn`pN^,_Nu/,HNVA-H V=h V0( V1@ V1n V=h V0( V1@ V1n V=h V0( V1@ V1n VA]"O2"N VA0 VA]"O2"N VA0 N^,_Nu/,HNVA-H0.2.AAFpn p=@`(0.2.AAUpm p=@`Bn0.rAgN0. 2.AAFpn p=@`(0. 2.AAUpm p=@`Bn`J0. 2.AAUpm p=@`(0. 2.AAFpn p=@`Bn0.n=@0. n=@0.nrAo0.J@jD@2.JAjDAAJ@f?.?.N`0.nW0.J@VCy`8Bd0.?.Nƪ?NƞNA0 0.rAf809`0@d"?<N?.?.?.?. N NN`B09`.@d009@rAg ?<N?.?.?.?. N NN`0.J@jD@2.JAjDAAo0p2.JAjDA?Nƪ?NƞNA0 `,p2.JAjDA?Nƪ?NƞNA0 A]"O2"0.?NƪNA0 A]"O2"0.?NƪNA0 0.rAW0.rAWÄCy`0Bd0.n l NNR?<NBgNƪA0 BgNƪA0 0.A]"O2"N2A=@0.A]"O2"N2A=@0.2.AAFplL?.?.N0.@AF10.@AU20|f0.@AU1A]"O2"A]"O2"NA0 A]"O2"A]"O2"NA0 0.nf 0.nl0.S@=@` 0.R@=@0.2.AAFp]0.4.BAFp _‚BAd?.?.N0.S@=@0.n l0.rAf>0.@AF1 0.@AU20|f0.@AU1 0.rAW0.rAWÄCy`.Bd0.n o NN<09@rAg ?<NBgNƪA0 BgNƪA0 0.A]"O2"N2A=@0.A]"O2"N2A=@0.2.AAUpoL?.?.N0.@AU10.@AF20|f0.@AF1A]"O2"A]"O2"NA0 A]"O2"A]"O2"NA0 0.nf 0.nl0.S@=@` 0.R@=@0.2.AAUp^0.4.BAUp ^‚BAd?.?.N0.R@=@0.n o0.rAf>0.@AU1 0.@AF20|f0.@AF1 ?<NN^,_ _PN/,HNVA-H09@rAgrBn nndp=@ nn80.@2.4.BBA_40}B?<%NNXHy Hz ?<NNX`8Hy Hz ?<NNXHy NXHy Hz ~?<'NNXHy Hz F?<NNXHy NXHy Hz ?<!NNXHy Hz ?<!NNXHy Hz ?<NNXHy Hz H?<NNXHy Hz ?<NNXHy Hz ?<NNXHy NXHy Hz ?<&NNXHy Hz @?<'NNXHy Hz ?<'NNXHy Hz ?<NNXHy NXHy Hz ?<%NNXHy Hz D?<(NNXHy Hz ?< NNX`y`<@dN209`:@dNʮ09`2@d N^`NB`(N` @b@0;N,L`NN3_`BgNN2Bg?<?<?<ND?<BgBgBgND?<?<BgBgNDNHy NBgNANu/,HNVNAj-H0.T@=@?.N-@/.?=n<-n$?<HnHnHnHnN=n"n2"n2"n2"n 2"n 2"n20.N^,_ _OS@r VR?/LaNuHaaS@r VT?/LaNu#a _0 @g "_J@jp`0a"|ap2 Ag $_JAjr`2a$|ar@g\HaG`e$4SBkQ4@SBpQ0"|`` 4SBkQ4ASBrQ$|`LaJ@f pCb$I/9aNuHa _024SBgQ@4BAAc/LaNuHyNRange error during set-operationHa _0246@SCBgQAn68DCCc 0AgRB`/LaNuHa _0@CEHS@rIVW.J?/LaNuHa _0@CEHS@rIVV.J?/LaNuHa _0@CEHS@2FA_VW.J?/LaNuHa _0@CEHS@2FAYVW.J?/LaNuHa _0@274BAAc7V`tO>/LaNuHa _0@"_24BAAc1V`t>/LaNuHa _02S@AC2YQ/LaNuHa _02S@AC2YQ/LaNuHa _02S@AC2FAYQ/LaNu _"_/) g g f0)k @e??<>3|NAXNuNuqt ?Hz~/,HNVA]"O2"~BBgN0@d(~CO$OpQ~~N|`~~A]"O2"~BBgN0@dh~~Bn~ A]"O2"~!?</<N0@db~"~#~#A]"O2"?</<NA0 ~$0.~%S@=@A]"O2"~&?</<N0@d`d~'~'~'A]"O2"?</<N0@d:~(~)A]"O2"?<{/<NA0 ~*0.~+R@=@`~,A]"O2"A0 ~-~.~.A]"O2"A0 ~/A]"O2"A]"O2"A]"O2"NN~0?</<NA0 A]"O2"A]"O2"NN? _\NNegative argument of SqrtNux ?Hz~/,HNVA]"O2"~ ? .2.N^,_X> _\NOverflow in Expn ?Hz~S/,HNVBBgA0 ~TA]"O2"?</<N0=@~UA]"O2"~VBBgN0@d ~WC^O$OpQN|~X~Y0.@d&?</<A]"O2"NA0 ~Z~ZA]"O2"? _\NAttempted Ln of negative number _4` _t6 Bo r aSB`2aNH?* _r ar a/L?*Nu _r aN _4` _t"x0HgJJjDxvCjzp cRЀ`|e W0R"f`6 _4` _t2xJAjDAxvCjp0 2H@0RJAfJg<-RBlCSBr aQSCaQN _4v` _46"_JBjtJCkgCe4`BSCr aQSBk aQN _v` _60@d Ct`CtJCgkCe4`BSCr aQSBavQNFALSETRUE _6kfv2_t Cc"4YBv` _6kfv"_t Cc4QBvSBkr a(QSCC" A0 9c^a JgYC`NH "oA/ NL NuPNuputchar ?Hz~/,HNV V"h0.@~ V"h/ N~N^,_X> _TNwrtreal ?Hz~/,HNVA]"O2"p?NƪN0=@~~0.@d.~~A]"O2"NA0 ~0.~S@=@~0.J@jBn~~ Bn~!A]"O2"A0 ~"A]"O2"p?N~#N0@d~$~%~&~&A]"O2"p?NN0@d~'~(0.R@=@~)0.~*r&AoBA]"O2"p&?NN0.@?N~+NA0 `,~+A]"O2"0.?N~,NA0 ~-`N~.`~/~/~0A]"O2"~1p?NƪN0@d~2~3~4~5~50.S@=@~60.~7rڰAlDA]"O2"p&?NN0.D@@?N~8NA0 `.~8A]"O2"0.D@?N~9NA0 A]"O2"p?N~:N0@dR~;~=~>0.J@W0.nR@r A^~?CBdA]"O2"p2.nRA?N?NƞNNA0 ~D~EA]"O2"p?N~FN0@d8~G~H0.R@=@~IA]"O2"p?N~JNA0 ~L~Mp=@ n nt~N~N~OA]"O2"N&0=@~P0.2.A0A~QA]"O2"?.NƪNp?NNA0 ~RRn`~T~U0.~VrAoL~W0.~XJ@k$~Y~Z0.nT@no~[Bn~\`~]~]~^0.T@no~_Bn~a~b0.~crAn~d~e~f0.~gJ@g~h~ipE@~j0.~kJ@j(~l~mp-@~np=@~o~p0.D@=@~q` ~qp=@~r0.~sr Ao.~t~u0.R@=@~v0.2.t HA0~wA~x0.R@=@~y0.2.t HHAA0~zA~{`~{Bn~|0.@ ~}nm$~~~0.2.TAAf ?< NNH><0.@d ?<- NN0><p.? NN><0.2.><TAAo|><><?<. NN><p=@><=n0.V@=@0.nm@><><><0.rA0? NN><0.><R@=@><Sn`><p=@=n0.nn&><0.rA0?>< NNRRn`><`><><><0.U@=@0.@ =@0.nm><?< NNSn`><0.@d ?<- NN><p.? NN><?<. NN><p=@ n n"><0.rA0? NNRn`><p=@=n0.nn&><0.rA0?>< NN\Rn`><><`><><><><0.><J@k\><><0.nV@=@=n0.nn><?< NNRn`><0.@d ?<- NN><p=@0.R@=@0.nnD><><0.r An0.rA0? NN`><?<0 NN|Rn`><?<. NNh><0.R@=@><p=@=n0.nnf><><><0.R@=@><0.><r An 0.rA0?>< NN`><?<0>< NN><Rn`><`@><><><0.V@=@=n0.nn><?< NNRn`><0.@d ?<- NN~><?<0 NNp><?<. NNb><p=@><p=@=n0.nm<><><><0.nn ?<0 NN><0.><R@=@Sn`><p=@0.nR@=@0.nnH><><0.r An0.rA0? NN`><?<0>< NNRn`><><N^,_X> _ONByF(_ _/ C( g  f4t4(H / /?(?<@NA LJkn gffNu4(SBraQNu(gN fH ??<NAXLNu f H ??<` f H ??<` f NuHy` Hy0< LNjREWRITE required prior to WRITE or PUTDisk or directory fullNui ?Hz~/,HNVA]"O2"BBgN0=@~A]"O2"NA0 ~A]"O2"A]"O2"?<~/<"nNN&0?</ _\No ?Hz~(/,HNVA]"O2"? _\Nrtn ?Hz~;/,HNVA]"O2"~?</<A]"O2"NA0 ~?~@p=@~A`~B~BA]"O2"~C?</<N0@d@~D~E?</<A]"O2"NNA0 ~F~Gp=@~H`Z~I~IA]"O2"~JBBgN0@d0~K~Lp=@~M~NA]"O2"NA0 ~O`~OBn~PA]"O2"?< w/NA]"O2"N? _\NHbp`:Hbp`.Hbp`"Hbp`Hbp` Hbp _/fJ/ gLJ/kJ`L/ fJkB`</jJk2`,gbJk&` Jk`"eb// ebr`r`rAV ?/LbNuHbv` Hbv _ `Hbv` Hbv _0HJ[fBBg`,j Dj4<` 4<ЀkSB`Jf].B/BJg 2/.?o /@?A /LbNuHbv` Hbv _ [2Jkp`&4<cH@j JgR@kJ@kJgD@?/LbNuHbv` Hbv _ [2Jkp`$4<cd JgRkJk~JgD//LbNuJ/ goNuNuHb _?///` Hb _0/2// Jv/ 8://N~/DD?DBoJgJgC|k?>BGHGv8ބdRC8ބdRC>HGvކdRC8ބdRCHGv48ބBޅB:>HG8ކkE߇SDkBg|d RdRDUJg( DbRD ME \/LbNuBBo `Hb _0/2// v/ 8://~/?DD?DBo 8JgJgG|HD8H@0zr)`рe efef<څ߇QgRCgڼd RGdSCJCkD|blo/EC \/LbNuoHb _p2/g/ f/W?o `ֲ@e:f$/&e&f // d*B6//J/ k`(&// S@Q`&// `R"/?/[4JfFӃddRdRR/eJd RdRd`/AG o Jk`z0H*kS/JkFft grkRBjIHA~`( dtHAI.kRBҁjBG` BBRBӁj/e2/AG o Jk\/LbNuHb _0 @&b(CPC/)?/LbNuHy^`Hy:LbN Hz@CPt$> nk(:C@hԥ*5 c_1ɿ1.Ź^ k:v #-xŬX&x2n)h? SYQa@%oNˏ'?9x!7I|o|@Eŭ+E75vV 9@{pvP *** Floating point overflow *** *** Floating point division by zero *** HNu#X _ gLeHd 9XNHyp`Hy|Nt`t _"_0gR@| e.GT$S" ghjebb"*f&"`v&A%S"`l&J`ذ|gb*|f8"9Hg0$A#H`""9Lg$A#L`"9Pg $A#P"`"EH&R"$b Hy\NJgr"QHd2S@k"QN _"_0" gLeHd gR@ @mz @ e@ET"fB3@B$`\&A2+@ef "'I`F"3@B$`8$K`ư|f"P#P` |f"L#L` "H#HNHeap overruns stackPointer NILPointer not in heapHbD _0"_e /LbDNuHyN/B9bl/|blNuHbD _0 @f0"|bBbBp` "_J@jpEblr4@ BbBS@kQ/LbDNuHbD _4SBkt82$_rAdd0 @f0"|bBbBp` "_J@jp6ADb6CG0IS@k$eQ/LbDNuHbD _4k2SAk0"_p6B@bE0)CS@kQ/LbDNuHbD _2$_r0 @f0"|bBbBp` "_J@jp@kS@kv&J$IRC4(K Vg RQBg`?/LbDNuHbD _4kF2SAk>0 @f0"|bBbBp` "_J@jp6B@bEblSBkQ/LbDNuString overflow _ hNVf 0(gr"OD@Hd2S@k "Q` _"yHe HyRNN#ct#cp .f -|B`-|B nNнcpf yctNStack overruns heap09FNu _3DNByFNu[3][4][ Abort ]Copyright 1986, CCD and OSS, Inc.    -,& &".       0:BB8   0  " " $   ~2 ,@          .\ x8&&,&&  , & " .     B  &, &,$  < H  < H |n "< $&2:0.&&pllZljl@ʘD0|@  4 J 2  4 2  < 2  4 2  4 2  4 2  4@@@Zh8:20D0D0J60(PP0H<L:(,LD*2N "         <"   &&    X  z  X  0"2"*"h 8   $" $&H," $&H, B0 4N.:.:f LB0   $     $ < &      F "".    ,  ,     F 0.4\.0DX<"$>,$8(l*lrh\,&D0T>0,8&&,.ZJ"4\ZBBL:\  @@(&.$@$$2$*|4$&&$$6  LD"2 T &( 0&  >             $"  ,*< * * , , 0 , "p* 0*4,(t&H6*.*4068,*(20 &*(((*((*((&&&2J @*\&<&2B(H B".44 V p2(6&$&&l`(:(4(2(,.\ z  f H F  J  <   , FR ( *@ B @ B  : program Grapher(input, output); const Pi = 3.14159265; ClrScr = 69; {Clear screen and home the cursor} Cursor_on = 101; {Turn blinking cursor on} Cursor_off = 102; {Turn blinking cursor off} {$I GEMCONST.PAS} type Str7 = string[7]; Draw_Type = (Redraw, No_Grid, Old_Grid); Grid_Type = (Rectangular, Polar, Trigonometric); Res_Type = (Low, Med, Hi); TokenType = (Numeric, Character); NodePtr = ^Node; Node = record Link: NodePtr; case NodeType: TokenType of Numeric: (Value: real); Character: (Code: char; Priority: 0..5) end; Screen_Type = packed array [0..31999] of byte; Screen_Ptr = ^Screen_Type; {$I GEMTYPE.PAS} var InFix: Str255; {Infix expression} TempPtr, {Temporary pointer} PostFix: NodePtr; {Postfix expression} X_Scale, {Scale on X-axis} Y_Scale: real; {Scale used on graph grid} Color: integer; {Color of graph} Draw: Draw_Type; {Grid drawing option} Grid: Grid_Type; {Type of grid} Event: integer; {Holds Get_Event value} DummyMsg: Message_Buffer; {Dummy variable used in Get_Event call} D: integer; {Dummy variable used in Get_Event call} {The following variables are accessed as global variables} Res: Res_Type; {Screen resolution} X_Pix, {Number of pixels in horizontal direction} Y_Pix, {Number of pixels in vertical direction} X_Center, {Center of screen horizontally} Y_Center, {Center of screen vertically} Num_Color: integer; {Number of colors available for graph} SF: real; {Scaling factor need to compensate for screen aspect ratio} Display_Area, {Pointer to display area in memory} Temp_Screen: Screen_Ptr;{Used to save a graph display} GEM_Interface: boolean; {TRUE if user selects GEM-based interface} GridStr, {This and next four are used to store user} DrawStr, {input for grid type, grid drawing option,} ColorStr, {graph color, } XStr, {X-scale, and } YStr: Str255; {Y-scale. !} {$I GEMSUBS.PAS} {* Out_Escape * * /* * Send escape codes that control the cursor. * * /* * Called by: Initialization, * * Get_Expression, * * Get_Graph_Parameters_OK * * /* * In parameter: Ascii code of the character * * following escape code * *0} procedure Out_Escape(c : integer); procedure bconout(device, c:integer); BIOS(3); begin bconout(2, 27); {The escape character} bconout(2, c) end; {Out_Escape} {* Initialization * * /* * Sets the value of various global screen * * parameters based on the screen resolution. * * Also sets initial default values of graph * * parameters: grid scales, color, and * * expression to be graphed. * * /* * Called by: MAIN DRIVER * * /* * All variables used in this procedure are * * accessed as globals * *0} procedure Initialization; var AlertStr: Str255; {Alert box string} Blanks: string[25]; {A string of blanks} Num: integer; {Dummy value used in Alert Box call} Scr_Res: integer; {Holds screen resolution value} Dummy: char; {- Physical Screen - | -| | Returns pointer to physical screen area. | | -| | Called by: MAIN DRIVER | --} function Physical_Screen: Screen_Ptr; XBIOS(2); {- Get Resolution - | -| | Returns 0, 1, or 2 indicating current | | screen resolution low, med, or high. | | -| | Called by: MAIN DRIVER | --} function Get_Res : Integer; XBIOS(4); begin { Set up screen parameters based on display resolution. } Scr_Res := Get_Res; case Scr_Res of 0 : begin Res := Low; X_Pix := 320; Y_Pix := 200; SF := 0.869; Num_Color := 15 end; {0} 1 : begin Res := Med; X_Pix := 640; Y_Pix := 200; SF := 0.434; Num_Color := 3 end; {1} 2 : begin Res := Hi; X_Pix := 640; Y_Pix := 400; SF := 0.869; Num_Color := 1 end; {3} end; {case} { Print Copyright Message } Out_Escape(ClrScr); if Res = Low then Blanks := ' ' else Blanks := ' '; writeln(Blanks,' Grapher'); writeln(Blanks,' by Delmar Searls'); writeln; writeln(Blanks,' (Parts of this product are'); writeln(Blanks,'Copyright (c) 1986, OSS & CCD'); writeln(Blanks,' Used by permission of OSS)'); { Let user select type of interface } AlertStr := '[2]'; AlertStr := concat(AlertStr, '[ Choose a |'); AlertStr := concat(AlertStr, ' text-oriented |'); AlertStr := concat(AlertStr, ' or GEM-based |'); AlertStr := concat(AlertStr, ' interface. ]'); AlertStr := concat(AlertStr, '[ Text | GEM ]'); Num := Do_Alert(AlertStr, 0); if Num = 1 then GEM_Interface := FALSE else GEM_Interface := TRUE; Out_Escape(ClrScr); { Set clipping boundaries and find coordinates of center of display. } Set_Clip(0,0,X_Pix,Y_Pix); X_Center := X_Pix DIV 2; Y_Center := Y_Pix DIV 2; { Set up initial default values } GridStr := 'R'; DrawStr := '1'; ColorStr := '1'; Color := 1; XStr := '1'; X_Scale := 1; YStr := '1'; Y_Scale := 1; InFix := 'SIN(X)'; Display_Area := Physical_Screen; new(Temp_Screen) end; {Initialization) {* Str_to_Num * * /* * Converts a string representation of a number * * to the numeric representation. * * /* * Called by: Next_Token, Get_Scale, * * Get_Graph_Parameters_OK * * /* * In parameter: The string representation * * Out parameter: Syntax error flag * *0} function Str_to_Num(NumStr {in}: Str255; var Syntax_Error {out}: boolean): Real; var Integer_Part, {Integer part of number} Fraction_Part, {Fraction part of number} Power_of_Ten: real; {Used in finding fraction part} DP, {Position of decimal point} Num_Int_Digits, {Number of digits in integer part} Num_Frac_Digits, {Number of digits in fractional part} I: integer; {Loop counter} begin { Initialize variables. } Integer_Part := 0; Fraction_Part := 0; Power_of_Ten := 1; { Determine number of digits in integer part and fraction part. } DP := pos('.', NumStr); if DP = 0 then begin { string represents an integer } Num_Int_Digits := length(NumStr); Num_Frac_Digits := 0 end {if} else begin { string represents a real } Num_Int_Digits := DP-1; Num_Frac_Digits := length(NumStr)-DP end; {else} { Convert integer part to numeric form. } for I := 1 to Num_Int_Digits do begin Integer_Part := 10*Integer_Part + ord(NumStr[1]) - ord('0'); delete(NumStr,1,1) end; {for} if NumStr <> '' then { delete decimal point from string } delete(NumStr,1,1); { Convert fraction part (if any) to numeric form. } if Num_Frac_Digits > 0 then { first check for extra decimal point } if pos('.', NumStr) = 0 then begin { conversion process } for I := 1 to Num_Frac_Digits do begin Fraction_Part := 10*Fraction_Part + ord(NumStr[1]) - ord('0'); Power_of_Ten := 10*Power_of_Ten; delete(NumStr,1,1) end; {for} Fraction_Part := Fraction_Part/Power_of_Ten end {if} else Syntax_Error := TRUE; Str_to_Num := Integer_Part + Fraction_Part end; {Str_to_Num} {* Convert * * /* * This function converts the input expression * * from infix to postfix notation. A pointer * * to the postfix expression is returned as the * * value of Convert. * * /* * Called by: Get_Expression * * /* * In parameter: The infix expression * * Out parameter: Syntax error flag * *0} function Convert(InString {in}: Str255; var Syntax_Error {out}: boolean): NodePtr; var TempStr: Str255; {Temporary storage of Infix expression} PostFix, {Pointer to the postfix expression} Tail, {Pointer to last token in postfix expression} Token, {A token to be added to postfix expression} TOS: NodePtr; {Pointer to top of stack used in conversion} I, {Loop counter} L: integer; {Length of InFix expression} Previous_Token: char; {Denotes the type of the previous token. This has a value of '(' for right parenthesis, and a 'N' if previous token was numeric. Numeric tokens are numbers, 'X', and ')'. A code of 'F' indicates a function token. Otherwise this identifier is assigned the null character. } {- Next_Token - | -| | This function removes the next item from | | the infix expression and returns the | | corresponding token. | | -| | Called by: Convert | | -| | In/Out parameter: The infix expression | | Previous token | | Out parameter: Syntax error flag | --} function Next_Token(var InFix {in/out}: Str255; var Previous_Token: char; var Syntax_Error {out}: boolean): NodePtr; var Token: NodePtr; {The new token} TStr: Str255; {Stores numeric operand in string form} TChar: char; {Token code for non-numeric tokens} T: integer; {Temporary storage for token priority} begin { Get and initialize token node. } new(Token); Token^.Link := NIL; while InFix[1] = ' ' do { remove leading blanks } delete(InFix,1,1); TStr := InFix[1]; { Transfer first character of infix to TStr. } delete(InFix,1,1); if TStr[1] in ['0'..'9','.'] then begin { Token is a number. } Token^.NodeType := Numeric; { Read the number as a string of valid numeric characters. } while (InFix <> '') and (InFix[1] in ['.','0'..'9']) do begin TStr := concat(TStr, InFix[1]); delete(InFix,1,1) end; {while} { Convert string representation to numeric. } Token^.Value := Str_to_Num(TStr, Syntax_Error); { Do a little error checking. A number cannot directly follow another numeric token or a function token. } if NOT Syntax_Error then if (Previous_Token = 'N') OR (Previous_Token = 'F') then Syntax_Error := TRUE else {reset previous token code} Previous_Token := 'N' end {if} else begin { Token is character type token. } Token^.NodeType := Character; TChar := TStr[1]; Token^.Code := TChar; { Determine priority of token } case TChar of 'X','(',')': Token^.Priority := 0; '+': Token^.Priority := 1; '-': if Previous_Token = '(' then begin Token^.Priority := 3; TChar := '~'; Token^.Code := '~' end {if} else Token^.Priority := 1; '*','/': Token^.Priority := 2; '^': Token^.Priority := 4; { Also check for syntax errors in function tokens. } 'A': if (Length(InFix) > 1) and (InFix[1] = 'B') .and (InFix[2] = 'S') then begin Token^.Priority := 5; delete(InFix,1,2) end {if} else Syntax_Error := TRUE; 'C': if (Length(InFix) > 1) and (InFix[1] = 'O') .and (InFix[2] = 'S') then begin Token^.Priority := 5; delete(InFix,1,2) end {if} else Syntax_Error := TRUE; 'E': if (Length(InFix) > 1) and (InFix[1] = 'X') .and (InFix[2] = 'P') then begin Token^.Priority := 5; delete(InFix,1,2) end {if} else Syntax_Error := TRUE; 'L': if (Length(InFix) > 0) and (InFix[1] = 'N') then begin Token^.Priority := 5; delete(InFix,1,1) end {if} else Syntax_Error := TRUE; 'S': if (Length(InFix) > 1) and (InFix[1] = 'I') .and (InFix[2] = 'N') then begin Token^.Priority := 5; delete(InFix,1,2) end {if} else if (Length(Infix)>1) and (Infix[1] = 'Q') /and (Infix[2] = 'R') then begin Token^.Priority := 5; Token^.Code := 'R'; delete(InFix,1,2) end {else if} else Syntax_Error := TRUE; 'T': if (Length(Infix) > 1) and (InFix[1] = 'A') .and (InFix[2] = 'N') then begin Token^.Priority := 5; delete(InFix,1,2) end {if} else Syntax_Error := TRUE; OTHERWISE: Syntax_Error := TRUE { Since token was not in list } end; {case} if NOT Syntax_Error then begin { Do a little error checking. } T := Token^.Priority; if ((T = 5) OR (TChar = 'X') OR (TChar = '(')) AND (Previous_Token = 'N') then Syntax_Error := TRUE else if ((T = 5) OR (TChar = 'X')) AND (Previous_Token = 'F') then Syntax_Error := TRUE else if ((T = 1) OR (T = 2) OR (T = 4) OR (TChar = ')')) AND (Previous_Token <> 'N') then Syntax_Error := TRUE; { Reset previous token code. } if NOT Syntax_Error then if Token^.Nodetype = Numeric then Previous_Token := 'N' else if TChar in ['X',')'] then Previous_Token := 'N' else if TChar = '(' then Previous_Token := '(' else if T = 5 then Previous_Token := 'F' else Previous_Token := chr(0) end {if} end; {else} Next_Token := Token end; {Next_Token} {- Append - | -| | This procedure appends the input token to | | the postfix expression. | | -| | Called by: Convert | | -| | In parameter: The token | | In/Out parameter: Pointer to last token | | in postfix expression | --} procedure Append(var Tail {in/out}: NodePtr; Item {in}: NodePtr); var Temp: NodePtr; begin if Item^.Link <> NIL then {Item is on stack, append copy to postfix. } new(Temp) else { The item itself is appended to postfix. } Temp := Item; Temp^ := Item^; Tail^.Link := Temp; Tail := Temp; Temp^.Link := NIL end; {Append} {- Push - | -| | Push a token onto the stack | | -| | Called by: Convert | | -| | In parameter: The token | | In/Out parameter: The top of stack ptr | --} procedure P&ush(var TOS {in/out}: NodePtr; Item {in}: NodePtr); begin Item^.Link := TOS; TOS := Item end; {- Pop - | -| | Delete the top element from the stack. | | -| | Called by: Convert | | -| | In/Out parameter: The top of stack ptr | --} procedure Pop(var TOS {in/out}: NodePtr); var Temp: NodePtr; begin Temp := TOS; TOS := TOS^.Link; dispose(Temp) end; {Pop} {* Convert code starts here *} begin TempStr := InString; Syntax_Error := FALSE; Previous_Token := '('; { Create 'NULL' node on stack. } new(TOS); TOS^.NodeType := Character; TOS^.Priority := 0; TOS^.Code := '@'; TOS^.Link := NIL; {Create a dummy head node. } new(PostFix); Tail := PostFix; { Process the user's infix expression. } while (Length(InString) > 0) and not Syntax_Error do begin Token := Next_Token(InString, Previous_Token, Syntax_Error); if not Syntax_Error then begin { Numbers and variable X are immediately appended to postfix. } if Token^.NodeType = Numeric then Append(Tail, Token) else if Token^.Code = 'X' then Append(Tail, Token) { Left parenthesis is pushed onto the stack. } else if Token^.Code = '(' then Push(TOS, Token) { When a right parenthesis is encountered, operators are pulled from the stack and appended to postfix until the corresponding left parenthesis is encountered. The left parenthesis is pulled from the stack, and both parentheses are discarded. } else if Token^.Code = ')' then begin while (TOS^.Code <> '(') and (TOS^.Code <> '@') do begin Append(Tail, TOS); Pop(TOS) end; {while} if TOS^.Code = '@' then Syntax_Error := TRUE else Pop(TOS) end {else if} { The only thing left is operators. Operators of higher priority, if any, are pulled from the stack and appended to postfix. The current operator is then pushed onto the stack. } else begin while Token^.Priority <= TOS^.Priority do begin Append(Tail, TOS); Pop(TOS) end; {while} Push(TOS, Token) end {else} end {if} end; {while} if Syntax_Error then begin { Print syntax error message if needed. } if GEM_Interface then begin Out_Escape(ClrScr); writeln('Y = ',TempStr) end; {if} L := length(TempStr) - length(InString) + 4; for I := 1 to L do write(' '); writeln('^'); writeln('Syntax error!') end {if} { Remove the remaining operators from the stack and append to postfix. } else begin while TOS^.Code <> '@' do begin if TOS^.Code = '(' then begin Syntax_Error := TRUE; if GEM_Interface then Out_Escape(ClrScr); writeln('Unmatched Left Parenthesis!') end; Append(Tail, TOS); Pop(TOS) end; {while} Pop(TOS) { Pull NULL node from stack } end; {else} Convert := PostFix^.Link; dispose(PostFix) end; {Convert} {* Evaluate * * /* * Evaluates the Postfix expression for the * * value of X passed to it. * * /* * Called by: Get_Expression, Rect_Graph, * * and Polar_Graph * * /* * In parameters: The postfix expression and * * The value of X * * Out parameters: Postfix error flag and * * Undefined result flag * *0} function Evaluate(Head {in}: NodePtr; X {in}: real; var PostFix_Error {out}, Undefined {out}: boolean): real; var TOS: 0..100; Stack: array [1..100] of real; Cosine_Val: real; Temp: integer; begin { Initialize flags and data stack. } PostFix_Error := FALSE; Undefined := FALSE; TOS := 0; { Process postfix expression } while (Head <> NIL) and not PostFix_Error and$ not Undefined do begin { Push numbers onto the stack, } if Head^.NodeType = Numeric then begin TOS := TOS + 1; Stack[TOS] := Head^.Value end {if} { or push the value of the variable onto the stack, } else if Head^.Code = 'X' then begin TOS := TOS + 1; Stack[TOS] := X end {else if} { or apply negation operator, } else if Head^.Priority = 3 then if TOS>0 then Stack[TOS] := -Stack[TOS] else PostFix_Error := TRUE { or apply function to TOS element, } else if Head^.Priority = 5 then if TOS>0 then case Head^.Code of 'A': Stack[TOS] := ABS(Stack[TOS]); 'C': Stack[TOS] := COS(Stack[TOS]); 'E': if Stack[TOS] < -50 then Stack[TOS] := 0 else if Stack[TOS] < 50 then Stack[TOS] := EXP(Stack[TOS]) else Undefined := TRUE; 'L': if Stack[TOS] > 0 then Stack[TOS] := LN(Stack[TOS]) else Undefined := TRUE; 'R': if Stack[TOS] >= 0 then Stack[TOS] := SQRT(Stack[TOS]) else Undefined := TRUE; 'S': Stack[TOS] := SIN(Stack[TOS]); 'T': begin Cosine_Val := COS(Stack[TOS]); if ABS(Cosine_Val) > 0.01 then Stack[TOS] := SIN(Stack[TOS])/COS(Stack[TOS]) else Undefined := TRUE end {case option} end {case} else PostFix_Error := TRUE { or else the token is a binary operator which is applied to top two stack elements and the result replaces both of them. } else if TOS>1 then begin TOS := TOS - 1; case Head^.Code of '+': Stack[TOS] := Stack[TOS] + Stack[TOS+1]; '-': Stack[TOS] := Stack[TOS] - Stack[TOS+1]; '*': Stack[TOS] := Stack[TOS] * Stack[TOS+1]; '/': if ABS(Stack[TOS+1]) > 0.01 then Stack[TOS] := Stack[TOS] / Stack[TOS+1] else Undefined := TRUE; { The program can handle two types of exponentiation. If the base (TOS) is positive, the normal process of using EXP and LN functions is used. If the base is negative and the exponent is an integer, then we have to apply some algebraic trickery first. If the base has a value of zero, the result is set to zero as well. } '^': if Stack[TOS] > 0 then Stack[TOS] := EXP(Stack[TOS+1]*LN(Stack[TOS])) else if Stack[TOS] < 0 then begin Temp := round(Stack[TOS+1]); if abs(Temp - Stack[TOS+1]) < 0.01 then begin Stack[TOS] := EXP(Stack[TOS+1]*LN(-Stack[TOS])); if Odd(Temp) then Stack[TOS] := -Stack[TOS] end {if} else Undefined := TRUE end {else if} else Stack[TOS] := 0 end {case} end {if} { If we get this far, then postfix token is invalid. Not likely to happen. } else PostFix_Error := TRUE; Head := Head^.Link { Move to next token in postfix. } end; {while} { At the end, there should be only one element remaining on the stack, namely the final result. Otherwise, the postfix expression is invalid. We skip this if the function is undefined for the current value of X. } if not Undefined then begin if TOS = 1 then Evaluate := Stack[TOS] else PostFix_Error := TRUE; { Print error message if necessary. } if PostFix_Error then begin if GEM_Interface then Out_Escape(ClrScr); writeln('Postfix error detected!'); writeln; writeln('This is usually caused by too few'); writeln('operators. Check for missing arithmetic'); writeln('symbols; especially multiplication "*".') end {if} end {if} end; {Evaluate} {* Get Expression * * /* * This procedure asks the user to enter the * * expression to be graphed. It is entered in * * normal infix notation and converted to * * postfix. %* * /* * Called by: MAIN DRIVER * *  "* * Out Parameter: The postfix expression * * In/Out parameter: The infix expression * *0} procedure Get_Expression(var InFix {in/out}: Str255; var PostFix {out}: NodePtr); var J, {Loop counter} Last: integer; {Index of last character in infix expression} Temp: real; {Used in checking for postfix errors} TempStr: Str255; {Temporary storage of infix expression} Dummy, Syntax_Error, {TRUE if error found during conversion to postfix} PostFix_Error: boolean; {TRUE if error found during evaluation} Dialog: Dialog_Ptr; {Pointer to dialog box} Pushed, {Stores way in which user exited dialog box} Prompt, {Points to prompt in dialog box} User_Input, {Points to user input item in dialog box} Quit_Btn, {Quit button in dialog box} Ok_Btn: integer; {Ok button in dialog box} begin if NOT Gem_Interface then begin { Print the instructions and the default infix expression. } Out_Escape(ClrScr); Out_Escape(Cursor_On); writeln; writeln('Enter the expression you want graphed.'); writeln('(Enter "Q" to QUIT)'); writeln; writeln('Y = ',InFix); end; {if} { Get a valid infix expression from the user. } repeat if GEM_Interface then begin if Res = Low then Dialog := New_Dialog(4,0,0,38,5) else Dialog := New_Dialog(4,0,0,78,5); Prompt := Add_DItem(Dialog,G_Text,None,1,1,2,1,0,256*Black); Set_DText(Dialog,Prompt,'Y=',3,TE_Center); if Res = Low then begin User_Input := Add_DItem(Dialog,G_FText,Editable, )3,1,34,1,0,256*Black|128); Set_DEdit(Dialog,User_Input,'_"', $'X"', %Infix,3,TE_Left) end {if} else begin User_Input := Add_DItem(Dialog,G_FText,Editable, #3,1,74,1,0,256*Black|128); Set_DEdit(Dialog,User_Input, '_J', 'XJ', Infix,3,TE_Left) end; {else} Quit_Btn := Add_DItem(Dialog,G_Button,Selectable|Exit_Btn, 1,3,6,1,0,0); Set_DText(Dialog,Quit_Btn,'QUIT',3,TE_Center); Ok_Btn := Add_DItem(Dialog,G_Button,Selectable|Exit_Btn, 9,3,6,1,0,0); Set_DText(Dialog,Ok_Btn,' OK ',3,TE_Center); Center_Dialog(Dialog); Show_Mouse; Pushed := Do_Dialog(Dialog,User_Input); End_Dialog(Dialog); Hide_Mouse; Out_Escape(ClrScr); Delete_Dialog(Dialog); if Pushed = Quit_Btn then TempStr := 'Q' else Get_DEdit(Dialog,User_Input,TempStr) end {if} else begin writeln; write('Y = '); readln(TempStr) end; {else} Syntax_Error := FALSE; PostFix_Error := FALSE; if TempStr <> '' then begin {Remove trailing blanks} InFix := TempStr; Last := Length(InFix); while (Last > 0) and (InFix[Last] = ' ') do begin delete(InFix,Last,1); Last := Last - 1 end; {while} {Convert to all uppercase} for J := 1 to Last do if InFix[J] in ['a'..'z'] then InFix[J] := chr(ord(InFix[J])-32) end; {if} If InFix <> 'Q' then begin { Convert infix to postfix. } PostFix := Convert(InFix, Syntax_Error); if NOT Syntax_Error then { Check for postfix error. } Temp := Evaluate(PostFix, 1.1, PostFix_Error, Dummy) end {if} until NOT(Syntax_Error or PostFix_Error); if NOT GEM_Interface then Out_Escape(Cursor_Off) end; {Get} {* Get Graph Parameters OK * * /* * Get the grid scale, the color of the graph, * * and the desired grid drawing option. * * /* * Called by: MAIN DRIVER * * /* * Out parameters: Grid type, X & Y scales, * * color, and grid drawing option. * * /* * Global variables accessed: Res, Num_Color * * *} function Get_Graph_Parameters_OK(var Grid {out}: Grid_Type; "var X_Scale {out}: real; "var Y_Scale {out}: real; "var Color {out}: integer; "var Draw {out}: Draw_Type): boolean; var I: integer; {Loop counter} TempStr: Str255; {Temporary string representation} Temp: real; {Temporary numeric representation} Syntax_Error: boolean; {True if entry is invalid} Dialog: Dialog_Ptr; {Pointer to dialog box} Button: array [1..15] of integer; {Dialog box buttons} Pushed: integer; {Indicates which button was selected} Prompt: integer; {Pointer to prompt in dialog box} {- Select Color - | -| | Select color for graph line. | | -| | Called by: Get_Graph_Parameters_OK | | -| --} procedure Select_Color; var I : integer; {Loop counter} begin if GEM_Interface then begin Dialog := New_Dialog(16,0,0,8,18); Prompt := Add_DItem(Dialog,G_Text,None,1,1,6,1,0,256*Black); Set_DText(Dialog,Prompt,'Color?',3,TE_Center); for I := 1 to Num_Color do Button[I] := Add_DItem(Dialog,G_Box,Selectable|Exit_Btn, #2,I+1,4,1,0,112+I); Center_Dialog(Dialog); Show_Mouse; Pushed := Do_Dialog(Dialog,0); End_Dialog(Dialog); Hide_Mouse; Out_Escape(ClrScr); Delete_Dialog(Dialog); for I := 1 to Num_Color do if Pushed = Button[I] then Color := I end {if} else begin Out_Escape(ClrScr); for I := 1 to Num_Color do begin Line_Color(I); writeln(I:2,' '); line(24, 8*I-4, 300, 8*I-4) end; {for} writeln; repeat Syntax_Error := FALSE; write('Graph color <',ColorStr,'>: '); readln(TempStr); if TempStr <> '' then begin for I := 1 to length(TempStr) do if not (TempStr[I] in ['0'..'9']) then Syntax_Error := TRUE; if not Syntax_Error then begin Temp := Str_to_Num(TempStr, Syntax_Error); if (Temp < 1) or (Temp > Num_Color) then Syntax_Error := TRUE else begin ColorStr := TempStr; Color := round(Temp) end {else} end {if} end {if} until not Syntax_Error end {else} end; {Select_Color} {- Get Scale - | -| | Get the scale for the X or Y axis. | | -| | Called by: Get_Graph_Parameters_OK | | -| | In parameter: Which axis ('X' or 'Y') | | Out parameters: The scale in both numeric | | and string representations | | -| | TempStr, Temp, and Syntax_Error are used | | as globals from calling procedure. | --} procedure Get_Scale(Axis {in}: char; var XYStr {out}: Str255; var XY_Scale {out}: real); var I: integer; {Loop counter} begin if GEM_Interface then begin Dialog := New_Dialog(9,0,0,11,20); Prompt := Add_DItem(Dialog,G_Text,None,1,1,9,1,0,256*Black); if Axis = 'X' then Set_DText(Dialog,Prompt,'X-Scale',3,TE_Center) else if Axis = 'Y' then Set_DText(Dialog,Prompt,'Y-Scale',3,TE_Center) else Set_DText(Dialog,Prompt,'R-Scale',3,TE_Center); for I := 1 to 8 do Button[I] := Add_DItem(Dialog,G_Button,Selectable|Exit_Btn, "3,2*I+2,5,1,0,0); Set_DText(Dialog, Button[1], '0.5',3,TE_Center); Set_DText(Dialog, Button[2], '1',3,TE_Center); Set_DText(Dialog, Button[3], '2',3,TE_Center); Set_DText(Dialog, Button[4], '5',3,TE_Center); Set_DText(Dialog, Button[5], '10',3,TE_Center); Set_DText(Dialog, Button[6], '20',3,TE_Center); Set_DText(Dialog, Button[7], '50',3,TE_Center); Set_DText(Dialog, Button[8], '100',3,TE_Center); Center_Dialog(Dialog); Show_Mouse; Pushed := Do_Dialog(Dialog,0); End_Dialog(Dialog); Hide_Mouse; Out_Escape(ClrScr); Delete_Dialog(Dialog); if Pushed = Button[1] then XY_Scale := 0.5 else if Pushed = Button[2] then XY_Scale := 1.0 else if Pushed = Button[3] then XY_Scale := 2.0 else if Pushed = Button[4] then XY_Scale := 5.0 else if Pushed = Button[5] then XY_Scale := 10.0 else if Pushed = Button[6] then XY_Scale := 20.0 else if Pushed = Button[7] then XY_Scale := 50.0 else XY_Scale := 100.0 end {if} else begin repeat Syntax_Error := FALSE; writeln; write(Axis,'-Scale <',XYStr,'>: ');readln(TempStr); if TempStr <> '' then begin for I:= 1 to length(TempStr) do if not (TempStr[I] in ['.','0'..'9']) then Syntax_Error := TRUE; if not Syntax_Error then Temp := Str_to_Num(TempStr, Syntax_Error); if not Syntax_Error then if Temp > 100 then begin writeln('Enter a value <= 100'); Syntax_Error := TRUE end {if} else begin XYStr := TempStr; XY_Scale := Temp end {else} end {if} until not Syntax_Error end {else} end; {Get_Scale} {- Get Graph parameters starts here -} begin { Get Grid-type or QUIT } if GEM_Interface then begin Dialog := New_Dialog(5,0,0,14,13); Prompt := Add_DItem(Dialog,G_Text,None,1,1,12,1,0,256*Black); Set_DText(Dialog,Prompt,'Grid?',3,TE_Center); for I := 1 to 4 do Button[I] := Add_DItem(Dialog,G_Button,Selectable|Exit_Btn, 4,2*I+1,6,1,0,0); Set_DText(Dialog,Button[1],'RECT',3,TE_Center); Set_DText(Dialog,Button[2],'TRIG',3,TE_Center); Set_DText(Dialog,Button[3],'POLAR',3,TE_Center); Set_DText(Dialog,Button[4],'QUIT',3,TE_Center); Center_Dialog(Dialog); Show_Mouse; Pushed := Do_Dialog(Dialog,0); End_Dialog(Dialog); Hide_Mouse; Out_Escape(ClrScr); Delete_Dialog(Dialog); if Pushed = Button[1] then TempStr := 'R' else if Pushed = Button[2] then TempStr := 'T' else if Pushed = Button[3] then TempStr := 'P' else TempStr := 'Q' end {if} else begin Out_Escape(Cursor_on); Out_Escape(ClrScr); writeln('Enter'); writeln; writeln(' "R" for rectangular grid'); writeln; writeln(' "P" for polar grid'); writeln; writeln(' "T" for trigonometric grid'); writeln; writeln(' "Q" for QUIT (or get new function)'); writeln; writeln; repeat write('Grid type <',GridStr,'>: '); readln(TempStr); if TempStr[1] in ['p','q','r','t'] then TempStr[1] := chr(ord(TempStr[1])-32) until (TempStr[1] in ['P', 'Q', 'R', 'T']) or (TempStr = '') end; {else} if TempStr = 'Q' then Get_Graph_Parameters_OK := FALSE else begin if TempStr <> '' then GridStr := TempStr; Get_Graph_Parameters_OK := TRUE; if GridStr = 'R' then Grid := Rectangular else if GridStr = 'P' then Grid := Polar else Grid := Trigonometric; { Get grid scales } if GEM_Interface then begin if Grid = Rectangular then begin Get_Scale('X', XStr, X_Scale); Get_Scale('Y', YStr, Y_Scale) end {if} else if Grid = Polar then Get_Scale('R', XStr, X_Scale) else begin X_Scale := Pi/2; Get_Scale('Y', YStr, Y_Scale) end {else} end {if} else begin Out_Escape(ClrScr); writeln('The origin is centered in the display'); write('area. You can adjust the '); if Grid = Rectangular then begin writeln('horizontal'); writeln('and vertical scales by entering the'); writeln('value corresponding to the first grid'); writeln('line. Integer values are recommended.'); writeln; Get_Scale('X', XStr, X_Scale); Get_Scale('Y', YStr, Y_Scale) end {if} else if Grid = Polar then begin writeln('scale by'); writeln('entering the value of the radius of'); writeln('the first circle in the polar grid.'); writeln('Integer values are recommended.'); writeln; Get_Scale(%'R', XStr, X_Scale) end {else if} else begin writeln('vertical'); writeln('scale by entering the value of the'); writeln('first horizontal grid line. Integer'); writeln('values are recommended.'); writeln; X_Scale := Pi/2; XStr := '1.57079633'; Get_Scale('Y', YStr, Y_Scale) end {else} end; {else} { Get Graph Color } if Res = Hi then Color := Black else Select_Color; { Get Grid drawing option } if GEM_Interface then begin Dialog := New_Dialog(3,0,0,20,7); for I := 1 to 3 do Button[I] := Add_DItem(Dialog,G_Button,Selectable|Exit_Btn, 1,2*I-1,18,1,0,0); Set_DText(Dialog,Button[1],'Clear / New Grid',3,TE_Center); Set_DText(Dialog,Button[2],'Clear / No Grid',3,TE_Center); Set_DText(Dialog,Button[3],'Draw on old Grid',3,TE_Center); Center_Dialog(Dialog); Show_Mouse; Pushed := Do_Dialog(Dialog,0); End_Dialog(Dialog); Hide_Mouse; Out_Escape(ClrScr); Delete_Dialog(Dialog); if Pushed = Button[1] then Draw := Redraw else if Pushed = Button[2] then Draw := No_Grid else Draw := Old_Grid end {if} else begin Out_Escape(ClrScr); writeln('Choose one of the following:'); writeln(' 1. Clear screen / Draw new grid'); writeln(' 2. Clear screen / NO GRID'); writeln(' 3. Draw graph on previous screen'); writeln; repeat Syntax_Error := FALSE; write('Which option <',DrawStr,'>: '); readln(TempStr); until (TempStr[1] in ['1','2','3']) or (TempStr = ''); if TempStr <> '' then begin DrawStr := TempStr; if DrawStr = '1' then Draw := Redraw else if DrawStr = '2' then Draw := No_Grid else Draw := Old_Grid end; {if} Out_Escape(Cursor_Off) end {else} end {else} end; {Get_Graph_Parameters_OK} {* Number to String * * /* * Converts the number parameter to string * * representation. * * /* * Called by: Rect_Grid, Polar_Grid * * /* * In parameter: The number * * Out parameter: The corresponding string * *0} procedure Num_to_Str(N {in}: real; var NumStr {out}: Str7); var Integer_Part, {Integer part of number} Fraction_Part: integer; {Fractional part of number} TempI, {Temporary integer string} TempF: Str7; {Temporary fraction part string} begin { Find integer and fraction parts. } if Abs(round(N) - N) < 0.01 then begin Integer_Part := round(N); Fraction_Part := 0 end {if} else begin Integer_Part := trunc(N); Fraction_Part := round((N-Integer_Part)*100) end; {else} { Convert integer part to string representation. } if Integer_Part = 0 then TempI := '0' else TempI := ''; while Integer_Part <> 0 do begin TempI := concat(chr(ord('0') + Integer_Part MOD 10), TempI); Integer_Part := Integer_Part DIV 10 end; {while} { Convert fraction part to string representation. } TempF := ''; if Fraction_Part <> 0 then begin while Fraction_Part <> 0 do begin TempF := concat(chr(ord('0') + Fraction_Part MOD 10), TempF); Fraction_Part := Fraction_Part DIV 10 end; {while} TempF := concat('.', TempF) end; {if} NumStr := concat(TempI, TempF) { Concatenate integer and fraction parts. } end; {Num_to_Str} {* Restore Screen * * /* * Restore saved screen to display area. * * /* * Called by: Rect_Graph, Polar_Graph * * /* * In parameters: Pointer to physical screen, * * Screen storage area * *0} procedure Restore_Screen(Display {in}, Old_Screen {in}: Screen_Ptr); var I: integer; {Loop control} begin {$P-} for I := 0 to 31999 do Display^[I] := Old_Screen^[I] {$P+} end; {Restore_Screen} {* Draw Rectangular Graph * * /* * Draws a graph in a rectangular coordinate * * system. &* * /* * Called by: MAIN DRIVER * * /* * In Parameters: Function being graphed, * * Grid scales, Color of graph, * * Grid drawing option * * /* * Globals accessed: X_Center, Y_Center, X_Pix, * * SF, Display_Area and * * Temp_Screen * *0} procedure Rect_Graph(The_Function {in}: NodePtr; X_Scale, Y_Scale {in}: real; Graph_Color {in}: integer; Draw {in}: Draw_Type); var SX: integer; {Loop counter and screen X-coordinate} SY, {Screen Y-coordinate} X, Y, {Logical X, Y coordinates} XPix_per_Unit, {Pixels per horizontal grid unit} YPix_per_Unit: real; {Pixels per vertical grid unit} Dummy, Undefined, {TRUE if function is undefined for given X} Line_to_Flag: boolean; {True if last logical point was plotted on screen} {- Draw Rectangular Grid - | /| | Draws and labels a rectangular grid. | | /| | Called by: Rect_Graph | | /| | In parameter: Grid scales, grid type | | /| | Global parameters accessed: Res, X_Pix, | | Y_Pix, X_Center, Y_Center, SF | -/} procedure Rect_Grid(X_Scale, Y_Scale {in}: real; Grid_Option: Grid_Type); const Pi_code = 227; {Code for Pi character} var X, Y: integer; {Loop control} SX1, SX2, SY1, SY2, {Screen coordinates} Tick_Unit, {X-coordinate of first grid line to right of origin} Pix_per_Unit: real; {Number of pixels in one grid unit} NumStr: Str7; {String form of grid labels} begin Clear_Screen; if Res = Hi then Line_Color(Black) else Line_Color(Red); Pix_per_Unit := X_Center/5; { Vertical grid lines } SY1 := 0; SY2 := Y_Pix - 1; for X := -5 to 4 do begin SX1 := X_Center + X*Pix_per_Unit; Line(round(SX1),round(SY1),round(SX1),round(SY2)) end; {for} SX1 := X_Pix - 1; Line(round(SX1),round(SY1),round(SX1),round(SY2)); { Horizontal grid lines } SX1 := 0; SX2 := X_Pix - 1; for Y := -3 to 3 do begin SY1 := Y_Center - Y*SF*Pix_per_Unit; Line(round(SX1),round(SY1),round(SX2),round(SY1)) end; {for} Line_Color(Black); Line(X_Center,0,X_Center,Y_Pix-1); Line(0,Y_Center,X_Pix-1,Y_Center); { X-axis labels } Draw_Mode(2); Tick_Unit := X_Scale; SY1 := Y_Center + 0.3*SF*Pix_per_Unit; if Grid = Rectangular then for X := 1 to 4 do begin Num_to_Str(X*Tick_Unit, NumStr); SX1 := X_Center + X*Pix_per_Unit - 8*Length(NumStr)/2; Draw_String(round(SX1),round(SY1),NumStr); SX1 := X_Center - X*Pix_per_Unit - 8*(Length(NumStr)+1)/2; NumStr := concat('-',NumStr); Draw_String(round(SX1),round(SY1),NumStr) end {for} else begin { Trigonometric X-axis labels } NumStr:= chr(Pi_code); SX1 := X_Center + 2*Pix_per_Unit - 4; Draw_String(round(SX1),round(SY1),NumStr); SX1 := X_Center - 2*Pix_per_Unit - 8; NumStr := concat('-', NumStr); Draw_String(round(SX1),round(SY1), NumStr); delete(NumStr,1,1); NumStr := concat('2',NumStr); SX1 := X_Center + 4*Pix_per_Unit - 8; Draw_String(round(SX1),round(SY1),NumStr); SX1 := X_Center - 4*Pix_per_Unit - 16; NumStr := concat('-', NumStr); Draw_String(round(SX1),round(SY1), NumStr); delete(NumStr,1,2); NumStr := concat(NumStr, '/2'); SX1 := X_Center + Pix_per_Unit - 12; Draw_String(round(SX1),round(SY1),NumStr); SX1 := X_Center - Pix_per_Unit - 16; NumStr := concat('-', NumStr); Draw_String(round(SX1),round(SY1), NumStr); delete(NumStr,1,1); NumStr := concat('3',NumStr); SX1 := X_Center + 3*Pix_per_Unit - 16; Draw_String(round(SX1),round(SY1),NumStr); SX1 := X_Center - 3*Pix_per_Unit - 20; NumStr := concat('-', NumStr); Draw_String(round(SX1),round(SY1), NumStr) end; {else} { Y-Axis labels } Tick_Unit := Y_Scale; SX1 := X_Center + 8; for Y := 1 to 3 do begin Num_to_Str(Y*Tick_Unit, NumStr); SY1 := Y_Center - Y*SF*Pix_per_Unit + 4*(Y_Pix DIV 200); Draw_String(round(SX1),round(SY1),NumStr); SY1 := Y_Center + Y*SF*Pix_per_Unit + 4*(Y_Pix DIV 200); NumStr := concat('-',NumStr); Draw_String(round(SX1),round(SY1),NumStr) end; {for} Draw_Mode(1) end; {Draw_RGrid} {- Rect_Graph begins here -} begin if Draw = ReDraw then Rect_Grid(X_Scale, Y_Scale, Grid) else if Draw = Old_Grid then Restore_Screen(Display_Area, Temp_Screen) else Clear_Screen; Line_Color(Graph_Color); XPix_per_Unit := (X_Center/5)/X_Scale; YPix_per_Unit := SF*(X_Center/5)/Y_Scale; Line_to_Flag := FALSE; for SX := 0 to X_Pix - 1 do begin X := (SX - X_Center)/XPix_per_Unit; Y := Evaluate(The_Function, X, Dummy, Undefined); if NOT Undefined then begin SY := Y_Center - Y*YPix_per_Unit; if Abs(SY) < 32000 then { it's safe to use round function } if Line_to_Flag then Line_to(SX, round(SY)) else begin Plot(SX, round(SY)); Line_to_Flag := TRUE end {else} else Line_to_Flag := FALSE end {if} else Line_to_Flag := FALSE end {for} end; {Draw_RGraph} {* Draw Polar Graph * * /* * Draws a graph using a polar coordinate * * system. &* * /* * Called by: MAIN DRIVER * * /* * In parameters: Function being graphed, * * Grid scale, Color of graph, * * Grid drawing option * * /* * Globals accessed: X_Center, Y_Center, X_Pix, * * SF, Display_Area and * * Temp_Screen * *0} procedure Polar_Graph(The_Function {in}: NodePtr; X_Scale {in}: real; Graph_Color {in}: integer; Draw {in}: Draw_Type); var SX, SY, {Screen coordinates} Angle, {Angle in radians} Radius, {Radius for given angle} XPix_per_Unit, {Pixels per horizontal grid unit} YPix_per_Unit: real; {Pixels per vertical grid unit} A: integer; {Loop counter} Dummy_flag, Undefined, {TRUE if function is undefined for given angle} Line_to_Flag: boolean; {TRUE if last logical point was plotted} Dummy:char; {- Draw Polar Grid - | /| | Draws and labels a Polar coordinate grid. | | /| | Called by: Polar_Graph | | /| | In_Parameter: Grid scale | | /| | Global variables accessed: Res, X_Pix, | | Y_Pix, X_Center, Y_Center, SF | -/} procedure Polar_Grid(X_Scale {in}: real); var Pix_per_Unit: real; R: integer; A: integer; Rad: real; SX1, SY1, SX2, SY2: real; Temp: real; X,Y: real; NumStr: Str7; begin Clear_Screen; if Res = Hi then Line_Color(Black) else Line_Color(Red); { Draw the concentric circles. } Pix_per_Unit := X_Center/5; for R := 1 to 4 do begin Plot(X_Center+round(Pix_per_Unit*R), Y_Center); for A := 1 to 72 do begin Rad := A*Pi/36; Temp := R*Cos(Rad)*Pix_per_Unit; SX1 := X_Center + Temp; Temp := R*Sin(Rad)*SF*Pix_per_Unit; SY1 := Y_Center - Temp; Line_to(round(SX1), round(SY1)) end {for} end; {for} { Draw radiating lines. Lines at 0, 30, 60,... degrees go through the origin. The rest start at the second circle. Otherwise the middle of the grid gets too cluttered. } for A := 0 to 35 do begin Rad := A*Pi/36; X := 4*Cos(Rad)*Pix_per_Unit; Y := 4*Sin(Rad)*SF*Pix_per_Unit; if A MOD 3 = 0 then begin SX1 := X_Center + X; SY1 := Y_Center - Y; SX2 := X_Center - X; SY2 := Y_Center + Y; Line(round(SX1), round(SY1), round(SX2), round(SY2)) end {if} else begin SX1 := X_Center + X; SY1 := Y_Center - Y; SX2 := X_Center + X/2; SY2 := Y_Center - Y/2; Line(round(SX1), round(SY1), round(SX2), round(SY2)); SX1 := X_Center - X; SY1 := Y_Center + Y; SX2 := X_Center - X/2; SY2 := Y_Center + Y/2; Line(round(SX1), round(SY1), round(SX2), round(SY2)) end {else} end; {for} { Draw X-axis labels. } Draw_Mode(2); SY1 := Y_Center + 0.3*SF*Pix_per_Unit; for R := 1 to 4 do begin Num_to_Str(R*X_Scale, NumStr); SX1 := X_Center + R*Pix_per_Unit-8*Length(NumStr)/2; Draw_String(round(SX1), round(SY1), NumStr) end; {for} { Draw the angle labels. } for A := 1 to 23 do begin Rad := A*Pi/12; if (A<6) or (A>18) then SX1 := X_Center + 4.1*Cos(Rad)*Pix_per_Unit else SX1 := X_Center + 4.1*Cos(Rad)*Pix_per_Unit - 24; Temp := Y_Pix DIV 200; SY1 := Y_Center - 4*Sin(Rad)*(SF*Pix_per_Unit + Temp) + 4*Temp; Num_to_Str(15*A, NumStr); Draw_String(round(SX1), round(SY1), NumStr) end; {for} Draw_Mode(1) end; {Draw_PGrid} {- Polar_Graph begins here -} begin if Draw = ReDraw then Polar_Grid(X_Scale) else if Draw = Old_Grid then Restore_Screen(Display_Area, Temp_Screen) else Clear_Screen; Line_Color(Graph_Color); XPix_per_Unit := (X_Center/5)/X_Scale; YPix_per_Unit := SF*XPix_per_Unit; Line_to_Flag := FALSE; A := 0; { Since polar graphs don't have a fixed 'stopping' place, the program will continue plotting until the user presses a key. The screen display will remain until the user presses another key. } repeat Angle := A*Pi/180; Radius := Evaluate(The_Function, Angle, Dummy_flag, Undefined); if NOT Undefined then begin SX := X_Center + Radius*Cos(Angle)*XPix_per_Unit; SY := Y_Center - Radius*Sin(Angle)*YPix_Per_Unit; if Abs(SY) < 32000 then if Line_to_Flag then Line_to(round(SX), round(SY)) else begin Plot(round(SX), round(SY)); Line_to_Flag := TRUE end {else} else Line_to_Flag := FALSE end {if} else Line_to_Flag := FALSE; A := A + 1; if A > 32000 then begin A := 0; Line_to_Flag := FALSE end {if} until keypress; read(Dummy) end; {Draw_PGraph} {* Save Screen * * /* * Save screen display. * * /* * Called by: MAIN DRIVER * * /* * In parameter: Pointer to physical screen * * Out parameter: Screen storage area * *0} procedure Save_Screen(Display {in}: Screen_Ptr; var Temp_Screen {out}: Screen_Ptr); var I: integer; {Loop control} begin {$P-} for I := 0 to 31999 do Temp_Screen^[I] := Display^[I] {$P+} end; {Save_Screen} {-) M A I N D R I V E R -)} begin if Init_Gem >= 0 then begin Hide_Mouse; Initialization; Get_Expression(Infix, PostFix); while InFix <> 'Q' do begin { Get the parameter values desired by the user. } while Get_Graph_Parameters_OK(Grid,X_Scale,Y_Scale,Color,Draw) do begin if (Grid = Rectangular) or (Grid = Trigonometric) then Rect_Graph(PostFix,X_Scale,Y_Scale,Color,Draw) else Polar_Graph(PostFix,X_Scale,Color,Draw); { Freeze display until user presses a key. } repeat Event := Get_Event(E_Button|E_Keyboard,1,1,1,0,FALSE,0,0,0,0, FALSE,0,0,0,0,DummyMsg,D,D,D,D,D,D); until (Event = E_Button) or (Event = E_Keyboard); { Save the screen dijsplay. } Save_Screen(Display_Area, Temp_Screen) end; {while} { Return postfix storage to the available memory heap. } while PostFix <> NIL do begin TempPtr := PostFix; PostFix := PostFix^.Link; dispose(TempPtr) end; {while} { Get ready to do it again. } Get_Expression(Infix, PostFix) end; {while} Show_Mouse; Exit_Gem end {if} end. G`  o"h###,Oc.N//Bg?<JNA BbByN\LNV?.?. ?<NMN^ _ON/,HNVA-H?<?<N?<?. NN^,_ _TNNV?<NNN^NuNV?<NNN^Nu/,HNVA-HN=@0.`ByB3@L3J?<9/<^vȴAN0 p3D`p3B3L3J?</<^5?|AN0 p3D`Rp3B3L3J?<9/<^vȴAN0 p3D` @b@0;NH~?<EN09BJ@fC8EpQ`CEpQHyTHn?`>"n0)"ninHn/. NNHn NN`Hn/. NN`"n 0@d09\@d4?<ENHyTHzj?<NHn?Hn NN`Hn NN"n-Q?< /.N .N^,_ _ONUnmatched Left Parenthesis!Syntax error!Y = /,HNVA -H"nBQ"n BQBn .JV"n0F@@"n 0F@@Bd"n0)J@f40.R@=@0."nA]$O4$AA0 `"n0)rXAf00.R@=@0.A]"O2"AA0 `n"n0)rAfP0.rAo80.2.AA]"O2"NAA0 ` "np2`"n0)rAf0.rAo"n0)`J0.2.AA]"O2"N,AA0 `R0./2.AA]"O2"N6$ ?/AA0 `0.AA]"O2"p?NN0@d"0.BgNAA0 `z0.AA]"O2"p2?NN0@dB0./2.AA]"O2"NL$ ?/AA0 ` "n p2`F0.AA]"O2"p?NN 0@dB0./2.AA]"O2"N$ ?/AA0 ` "n p2`0.AA]"O2"p?NN$0@dB0./2.AA]"O2"N$ ?/AA0 ` "n p2`N0./2.AA]"O2"NX$ ?/AA0 `0.AA]"O2"N6?/A0 A]"O2"N,?0.S@=@"n0)`0.2.AA]"O2"2.RAAA]"O2"N@AA0 `0.2.AA]"O2"2.RAAA]"O2"N:AA0 `0.2.AA]"O2"2.RAAA]"O2"NHAA0 `40.R@AA]"O2"N,?: Graph color <Color?/,HNVA-H09\@d0?< BgBg?< ?<N^b V!@ V/(?<Bg?<?<?< ?<Bgp@?N_ V1@0.rXAf6 V/( V?(CO$OpQ?<?<Nd`r0.rYAf6 V/( V?(CO$OpQ?<?<Nd`2 V/( V?(CHO$OpQ?<?<Ndp=@ nnP0.@/ V/(?<rtB??<2.ATA??<?<BgBgN_"  VA1Rn` V/( V?(CO$O?<?<Nd V/( V?(p1O"O?<?<Nd V/( V?(p2O"O?<?<Nd V/( V?(p5O"O?<?<Nd V/( V?(CO$O?<?<Nd V/( V?(CO$O?<?<Nd V/( V?(CO$O?<?<Nd V/( V?(CO$O?<?<Nd V/(NcNx V/(BgNb V1@ V/(Nc(Nx?<ENX V/(N^ V0( Vhf"n ?</< I0 ` V0( Vhf"n ?</< I0 ` V0( Vhf"n ?</< I0 ` V0( Vhf"n ?</< I0 ` V0( Vhf"n ?</< I0 `f V0( Vhf"n ?</< I0 `> V0( Vhf"n ?</: -Scale <1005020100.5R-ScaleY-ScaleX-Scale/,HNVA -H09\@d$?<BgBg?<?< N^b-@/.?<Bg?<?<?< ?<Bgp@?N_=@/.?.C O$OpQ?<?<Ndp=@ nnL0.@//.?<rtB??<2.ARA??<?<BgBgN_" A1Rn`/.?.C &O$O?<?<Nd/.?.C O$O?<?<Nd/.?.C O$OpQ?<?<Nd/.?.C O$O?<?<Nd/.NcNx/.BgNb=@/.Nc(Nx?<EN@/.N^0.ȰnfpRC`F0.ȰnfpTC`*0.ȰnfpPC`pQC`?<eN?<ENHyTHz ?<NNXHyTNXHyTHz j?<NNXHyTNXHyTHz ,?<NNXHyTNXHyTHz ?<NNXHyTNXHyTHz ?<$NNXHyTNXHyTNXHyTHz T?< NHy^?: Giid type < "Q" for ivo (or get new function) "T" for trigonometric grid "P" for polar grid "R" for rectangular gridEnterQUITPOLARTRIGRECTGrid?/,HNVA-HA]"O2"Nd0A]"O2"?NN:N,?09HA]"O2"?NN@A0 09FA]"O2"?NN:A0 09HA]"O2"?</<NH?NN@A0 09FA]"O2"?</<NH?NN:A0 A]"O2"Nd0?A]"O2"Nd0?A]"O2"Nd0?A]"O2"Nd0?Nn09HA]"O2"?NN:A0 09FA]"O2"?NN@A0 09HA]"O2"?</<NH?NN:A0 09FA]"O2"?</<NH?NN@A0 A]"O2"Nd0?A]"O2"Nd0?A]"O2"Nd0?A]"O2"Nd0?NnRn`?<Nu09FAN]"O2"?</<NHA]"O2"NH?NN@A0 p=@ nn0.A ]"O2"?NNHHnNx09H2.A]"O2"?NNH?NN@p.@?</<?NNHN:A0 A]"O2"Nd0?A]"O2"Nd0?C IO$Op?$QNm6Rn`$p=@ nn@0.?=n<-n$?<HnHnHnHnN=n"n2"n2"n2"n 2"n 2"n20.N^,_ _OS@r VR?/LNuHaS@r VT?/LNu# _0 @g "_J@jp`0"|p2 Ag $_JAjr`2$|r@g\HGe$4SBkQ4@SBpQ0"|` 4SBkQ4ASBrQ$|LJ@f pC\$I/9NuH _024SBgQ@4BAAc/LNuHyN~zRange error during set-operationH _0246@SCBgQAn68DCCc 0AgRB`/LNuH _0@CEHS@rIVW.J?/LNuH _0@CEHS@rIVV.J?/LNuH _0@CEHS@2FA_VW.J?/LNuH _0@CEHS@2FAYVW.J?/LNuH _0@274BAAc7V`tO>/LNuH _0@"_24BAAc1V`t>/LNuH _02S@AC2YQ/LNuH _02S@AC2YQ/LNuH _02S@AC2FAYQ/LNu _"_/) g g f0)k @e??<>3|NAXNuNuqt ?Hz~/,HNVA]"O2"~BBgN0@d(~CO$OpQ~~N~v`~~A]"O2"~BBgN 0@dh~~Bn~ A]"O2"~!?</<N0@db~"~#~#A]"O2"?</<NHA0 ~$0.~%S@=@A]"O2"~&?</<N$0@d`d~'~'~'A]"O2"?</<N$0@d:~(~)A]"O2"?<{/<NHA0 ~*0.~+R@=@`~,A]"O2"A0 ~-~.~.A]"O2"A0 ~/A]"O2"A]"O2"A]"O2"N`N@~0?</<NHA0 A]"O2"A]"O2"N:N,? _\NNegative argument of SqrtNux ?Hz~/,HNVA]"O2"~ ? .2.N^,_X> _\NOverflow in Expn ?Hz~S/,HNVBBgA0 ~TA]"O2"?</<N0=@~UA]"O2"~VBBgN00@d ~WC^O$OpQN~v~X~Y0.@d&?</<A]"O2"N`A0 ~Z~ZA]"O2"? _\NAttempted Ln of negative number _4` _t6 Bo r aSB`2aNH? _r ar a/L?Nu _r aN _4` _t"x0HgJJjDxvCPzp cRЀ`|e W0R"f`6 _4` _t2xJAjDAxvCPp0 2H@0RJAfJg<-RBlCSBr aQSCaQN _4v` _46"_JBjtClBSCr aQSBk aQN _v` _60@d Cst`CntClBSCr aQSBavQNFALSETRUE _6kfv2_t Cc"4YBv` _6kfv"_t Cc4QBvSBkr a(QSCC" A0 9c^a JgYC`NH "oA/ NPL NuPBy(_ _/ C( g  f,t4(H / /?(?<@NA LJkffNu4(SBraQNu(gN fH ??<NAXLNu f H ??<` f H ??<` f NuHy;` Hy0< LN~dREWRITE required prior to WRITE or PUTDisk or directory fullBy _$_"Wp )f)H/ NL4NH/ NLp)`By _"WJytf8J)f )f)H/ NL )g)J)fJgByt )g J)fBiNz`zBy _$_"WptvH/ Hya029XL- -fJf^p`4  fJg*`N0eH  bBԂi\(؄iV؄iRԄiNԁRCJ)f  g )f) 0e 9c~Jg&JgDJf 6Höf4N$NHy0<` Hyy0<N~dBy _$_0"Wt )gJ&JRJ)f4H/ HyaP29XL )gJ)f RBBe`ưBe`N&|H/ ?< NA\Hyv?< NA\LS@kQ3tN Bad digit in number encounteredOverflow during READ of numberBy(_ _/ C (g ( fxJ(f t4($IH / /?(?<?NA LJk,g*fJg  f"J` g  Wf NuJgJ(f P Nu!|Nu4(SBa@J(f8Jg. fJ(f"gr W1Agp f W1A1AQNu(gVJ(fD f&H`?<NAT f?< ?<NAXp LNu fH`?<NATLNuHy*0<` Hy0< LN~dReset required prior to Read or GetAttempt to read past end-of-fileNui ?Hz~/,HNVA]"O2"BBgN0=@~A]"O2"N,A0 ~A]"O2"A]"O2"?<~/<"nNHNp0?</ _\No ?Hz~(/,HNVA]"O2"? _\Nrtn ?Hz~;/,HNVA]"O2"~?</<A]"O2"N`A0 ~?~@p=@~A`~B~BA]"O2"~C?</<N0@d@~D~E?</<A]"O2"N`NA0 ~F~Gp=@~H`Z~I~IA]"O2"~JBBgN0@d0~K~Lp=@~M~NA]"O2"NA0 ~O`~OBn~PA]"O2"?< w/N@A]"O2"NH? _\NH p`:H p`.H p`"H p`H p` H p _/fJ/ gLJ/kJ`L/ fJkB`</jJk2`,gbJk&` Jk`"eb// ebr`r`rAV ?/L NuH v` H v _ `H v` H v _0HJ[fBBg`,j Dj4<` 4<ЀkSB`Jf].B/BJg 2/.?o /@?A /L NuH v` H v _ [2Jkp`&4<cH@j JgR@kJ@kJgD@?/L NuH v` H v _ [29Jkp`$4<cd JgRkJk~JgD//L NuJ/ goNuNuH _?///` H _0/2// Jv/ 8://N~/DD?DBoJgJgC|k?>BGHGv8ބdRC8ބdRC>HGvކdRC8ބdRCHGv48ބBޅB:>HG8ކkE߇SDkBg|d RdRDUJg( DbRD ME \/L NuBBo `H _0/2// v/ 8://~/?DD?DBo 8JgJgG|HD8H@0zr)`рe efef<څ߇QgRCgڼd RGdSCJCkD|blo/EC \/L NuoH _p2/g/ f/W?o `ֲ@e:f$/&e&f // d*B6//J/ k`(&// S@Q`&// `R"/?/[4JfFӃddRdRR/eJd RdRd`/AG o Jk`z0H*kS/JkFft grkRBjIHA~`( dtHAI.kRBҁjBG` BBRBӁj/e2/AG o Jk\/L NuH _0 @&b(CC/)?/L NuHy`HyL N~z Hz@CPt$> nk(:C@hԥ*5 c_1ɿ1.Ź^ k:v #-xŬX&x2n)h? SYQa@%oNˏ'?9x!7I|o|@Eŭ+E75vV 9@{pvP *** Floating point overflow *** *** Floating point division by zero *** Nu# _ ged 9NHy`HyN~zt`t _"_0gR@| e.G$S" ghjebb"*f&"`v&A%S"`l&J`ذ|gb*|f8"9g0$A#`""9g$A#`"9g $A#"`"E&R"$b HyN~zJgr"QHd2S@k"QN _"_0" ged gR@ @mz @ e@E"fB3@B$`\&A2+@ef "'I`F"3@B$`8$K`ư|f"#` |f"#` "#NHeap overruns stackPointer NILPointer not in heapH< _0"_e /L0 @f0"|::p` "_J@jp6B@bEdSBkQ/LL:(,LD, ,,4X2X*0*0 . dBDt`06 N  P $  Ff""T0B@4JB(((,,,. > Fr,0H>,,,  z , $"(. $   L>,,  H  | <@ p          .          0  F @ (  @ &   4    0.* L &@   $  J ^   6   0.4\.0DX<"$>,$8(l*lrh\,&D0T>0,8&&,.ZJ"4\ZBBL:\  @@(&.$@$$2$*|4$&&$$6   $LD"2 T &( 0&  >             $"  ,*< * * , , 0 , "p* 0*4,(t&H6*.*4068,*(20 &*(((*((*((&&&2J X D   ( 0"L2 x2(6&$&&l`(:(4(2(,.\ z  f H F  J  <   , FR ( *@ B @ B  =.   F]..   FCASTLH BAK F ^CASTL1 DAT F _CASTLE PRG @F c`qsqsqsqsqs8x<<<<< <!?????<<<GGGGGF~~     ??????@@ << ? ? ? ? ?????????????<@?@?@?@?@? ??????????? P P?p????? p??????**8?@ Hp?p?p?p?p?TT<<<0@@@@@--~~~`````{({(x~<<<`````%T%T @````` p `0  **    ???0??? ? ? ?PP? `?0????? ?? ? ???0?????????``00? ??0` ?0??x? ?  p?0p?x???x?> ?08>|??8? x}?? 8~|8~| ``>~><>` 8x|8|<@>p>|< `><0xx=<`<<xxx<<<???~GGG~   ???~???? ? ? ??????????~????@?@?@??????????~8?8?8?8???????8?8?8?~p?p?p? ~@`@9??~```?@x9x?x?~?x`1~8`gx?x9x?~ ` 0x ?x1x ?~??????0<c0~?`????? 8g ~`?????@9X9`9 ~ ?& ?p ?@8@8@x@~0?dtp&`//0 ??@9@9`y`~x?/??@9@9`y`~|??N@?8r?``pyp~>~?8x?\?:?0 0 ` `~|> >8|8|?}X8G@?8?87?~<<@ <0x<<<<0/~x>| x [~0@@@xxxxxxxx 0 089~1H)???~1 8~0??8?~0> ? > ? > ? > ? 0 0s80>222 Xs^~+88@@@@<?<?<?<?|>0xhhh5n5n5n kX~)t|AA@@@@ 0? 030xd3f3f3f ###s~)00sD?  ???gggi~ <><>}p?p?qppq8gggi~````px~~?~~||aaaq~8 ?8 ?8 ?8 ? ????~8@@y`8@8@`` ??????@~<@ 8L6|> 8`8@ @??8  ???~>L{`<<` ?? `@~>,;@<<@ ? ~<<<<x @~@x@<|@@|???   @~``x@ `pppxx   @~}@`````>>~` `~?@?@?@?@x|x0f0f0f``<<~>  ~````>00x``00< 8@ ~8?8?8?8?88p 0 8@ ~]``` @@`<|?x<|?<|?<|? >< ~???  |>|>%~lqq<<<<~ I7 7 ~. 18=@@  xxxx~4?@@  ~ P P`    00~^9>* .   | |>>  ((~6o;(6n9h Tt;;;;  (8(8  ))$$$$~sy`cy`,@-&@'@@<<<<<<<<dd&& ( (00~S_xyjoR((( @? @?xxx|x|>>~X~|L~D$= @? @? #0#0 x x0?0?@@    ~~ @@  ``/?/? ` `  88~ dx @ @` ~~~p~p  HH~@@0l@????88  HH~%'0   @@XX~mo]_ =p;  @@@@~HM~~?~  xxxxxx ~ d d!~@ * *xxxx~\@@ ::aa  00 0 0 0 px ~   @@``0 0 0 :U :? ~         XX@@    00   5\ z  <?~   CC((XXxxx0  ~@@ @@NN  闐""DD  ~@ @@11BB B B``??``1P;~``DD@$@$$$ ! !P @$?Ul<~#"# D  HH   P P쪶 ~#"# D@@``KK@ @ `` ``r,  ~!!! L2L2``@@!!IIhhH !a޳e  ~"@""@ P P P```II@0@0b!b!FF``jX``b!b<~@@@ P P P```))  @P@PAA  Q* AU~   P P P@@@  @ @pU\ P~ ~   @@@@@@@@    `` Q*`  U~ @@@@xx  U\< ~ @@@@@@00  ``Q*``U  ~@@@@@@@@@@@ ` `  @@3 `U\  ~   @@@@@@@@@@   0 0  `0`0``?UF*``  T ~@@@@@@    @@$$$@$@>>s>~  " Ȉ   ~  > <> >` t>#~i~i~i~"r/r'r/>~""(h"h(~<*/"</~(6H (( ~&"r/ȃ~i~i~i~{>>y"{Ͼ~" "" "( ~>p<"<qo" p#<~" "  (" " ~>"o~c~c~c~"x" ~(2("(- ~/*Ϫ#πp ~(&" ( ~h"h>( ~b~b~b~ pqq ~"( i" "(( ~"<<>< ~#,( ("( ~b!ps&r/<"' ~~rry~JJ@u~JJ@EA ~rr2(2(" EB( ~BBT*/*  }C7 ~CC&(&(( EB  | / Ez/ p@@<yq|{>x|1AE"B@"""  D P8y<Wx<Q>>p'qHf<'ÁHvfs<ӟ<q/Ⱦ~fAh"Q,- ~fA<o>"*nfAP(*"("D)( ff=&q/(Ⱦ f<  ````c~<f~||fc~<~f|<8"/c<><~<ff>"s'sr /  "(( ","`/< * "ccc000ooo  6h ")" {{{< "h'`"(r gggccc111h1h1h1z{c{c{c~a~m~i 222ooo??)K.J.K `` )J%)Ki IRI )?$? -k=8JIZI 3"3 +Z%i ! J( IVI ("""K%.2(1F%(`zx>>>>?>?>?>?>AAAAAAAA~~~~A>A>A>A>AAAAA>A>A>A>AAAA`@@@@A@A@A@A@AAAAAAAAA AAAAAAAaaaa @@@@A@A@A@A@AAAAAAAA"A"A"A"AAAAAAAAAQQQQ GGGGA|A|A|A|AAAA~~~~AAAAAAAAIIIIIIII AAAA"@"@"@"@AAAA@@@@AAAAAAAAUUUUEEEE AAAA@@@@AAAA@@@@AAAAAAAAccccCCCC >>>>>>>>>@@@@>>>>>>>>A>A>A>A>AAAA ~ A>A>A>A>AAAAA>>>>~~~~>>>>AAAA>>>>> @AAAA?>?>?>?>>~>~>~>~ A AAAcAcAcAcAAAAAAAAA@@@@@A@A@A@AaaaaAA@AAAA@A@A@A@A  "A"A"A"AAAAAUAUAUAUA@@@@AAAA@@@@@A@A@A@AQQQQA@A@A@A@@A@A@A@A@""""@A@A@A@A  AAAAAAAAIAIAIAIA>>>>~~~~||||||||IIII>>>>@@@@@GAGAGAGA  AAAAAAAAAAAAA@@@@@A@A@A@AEEEEAAAA@A@A@A@A@A AAAAAAAAA AAAAAAA@@@@@A@A@A@ACCCCAA@A >>>>>>>>A>A>A>A>>>>>~~~~@A@A@A@AAAAAA>A>A>A>>>>>>A>A>A>A> ~>~>~>~ @>@>@>@>AAAA>>>>~>~>~>~>A>>>>>>>>AAAA~~~~>A>A>A>AA>A>A>A>>>>>>~~~~>>>>> @@@@A@A@A@A@AAAAAaAaAaAaAAAAAc@c@c@c@AAAAAaAaAaAaACCCCA @ @ @ @A @@@@A@A@A@A@@@@@AQAQAQAQA@ @ @ @ U@U@U@U@AAAAAQAQAQAQA@A@A@A@    AAAA@@@@@@@@A @@@@A|A|A|A|>>>>~A~A~A~AIAIAIAIA>>>>I|I|I|I|~~~~AIAIAIAIA>A>A>A>AAAA>>>>"~"~"~"~~~~~>?>?>?>? @@@@"@"@"@"@AEAEAEAEAA@A@A@A@AAAAAEAEAEAEAAAAAAAA@@@@BBBBAAAAAAAA @@@@@@@@AAAAACACACACAA A A A A@A@A@A@AAAAACACACACA    aaaa@A@A@A@AAAAAAAAAAAAA >>>>>>>>~>~>~>~>A>A>A>A>>>>>>>>>AAAA~~~~>A>A>A>A>>>>> >>>>>>>>>>>>> ?xxW8W /V8V8O7O7S7C 3C,C?,<??+<+;*;?*;??*9*9`>>#:|#9#9#5??"5?@"5?@"+?@"+?@+?@$?@$?@#?@#?@??@ %0?@% ?@`&?@%?<C%08D X `'  ?  ?      ?  ?    ` |I? ???    ?  ? ??    p 0 ? 8   0 ?"???"`>#|##?*?*?*?+???+?2?2?2?3?3?3??:??*??:*?;+?;+?<<&?8C" C$C"D??+G)N-N3N4O4O4O4V??5W1X3) 7n ϏϏBBByyy···c#c#c#l)l)l):::fffpppϹϹ                       !     ![??????       !?????   ? !    ??    ??     ??      ??      }?~?B       ! !! !m(%(     (%(   %%%%%%  (%(!!(%(        A !!    ???  !!        (%(!?!   %%%  ?     (%(?W    C    A     >ʇ'       | A s             | A                            A       | A  h5 #"!     #   "      !    A  [ O                  O                                    A  C  T     L        G         C               .R                                     *%*   %%%        *%*                                          J     la           L          Y           A       L    A                     ;p                                     <                          #?      ""    R          ""   R   M      E                 A     #?>             X A    U                       A                      A       #?>          Y                                #?>        ߿   }~                        >                                               T    #?>                                                                              #?>                                     *%*   %%%        *%*                                              J         la       | A s             | A                           A       | A  h5           Y                                     #?>                     "           <                          #? #"!     #  "     !   A  [ O                  O                                 A  CZX10@,IA) PUTI(II 4 ADD GETW EXTW,SZY10@,IA) PUTI(II INCR GETB $3F AND,SZH0@,IA) POSITION_SPR(GETI(SZX10@,IA), GETI(SZY10@,IA) AH 2 MULTIPLY_W SUB, GETI(SZH0@,IA) AH ADD,1 IA ADD) PATTERN_SPR(SZIL0@,1 IA ADD) ENABLE_SPR(1 IA ADD) PUTI(1,SZG0@,IA) PUTI(0,SZCE0@,IA) PUTI(0,SZXIE0@,IA) PUTI(0,SZYIE0@,IA) ELSE PUTI(0,SZE0@,IA) DISABLE_SPR(1 IA ADD) ENDIF ENDIF NEXT } szipos { 5 CYCLE IA=(DUPL DECR) IF( GETI(RE0@ IA)) IFZE(GETI(RZS0@ IA)) IFZE(GETI(RF0@ IA)) RAD=(SET_ADDR(GETI(RX0@ IA),GETI(RY0@ IA))) PUTI(0,RFL0@,IA) GETI(RP0@,IA) INCR 1 AND RP0@ IA PUTI IFZE(GETI(RATL0@,IA)) SZIP0@ GETI(RP0@,IA) 4 MULTIPLY_W ADD ELSE ASZIP@ ENDIF 13 IA ADD PATTERN_SPR IF(RAD INCR GETB $80 AND $80 EQ) IF(RAD INCR GETB $40 AND $40 EQ) IF(GETI(RH0@,IA) $80 GE) bogyole(GETI(RH0@,IA),GETI(RX0@,IA),GETI(RY0@,IA)) music(FELVESZ@) PUTI(1,RF0@,IA) PUTI(1,RFL0@,IA) ELSE JUMP(szip0@) ENDIF ELSE bogyole(GETI(RH0@,IA),GETI(RX0@,IA),GETI(RY0@,IA)) music(FELVESZ@) PUTI(1,RF0@,IA) PUTI(1,RFL0@,IA) ENDIF ELSE szip0# III=(IF(GETI(RH0@,IA) $80 GE) RAD GETB 16 DIVIDE_W ELSE RAD GETB ENDIF) IF(GETI(RS0@,IA)) IF(III GETI(RSI0@,IA) AND) XX=(GETI(RX0@,IA) GETI(RXI0@,IA) ADD) YY=(GETI(RY0@,IA) GETI(RYI0@,IA) ADD) IFZE(ures) PUTI(XX,RX0@,IA) PUTI(YY,RY0@,IA) RAD=(SET_ADDR(XX,YY)) HH=(RAD INCR GETB $3F AND) IF(RAD INCR GETB $40 AND $40 EQ) I=(IF(CASTLE 9 NE CASTLE 19 NE AND) 2 ELSE 8 ENDIF) IF(GETI(RH0@,IA) $3F AND I GR) PUTI(HH $80 OR RH0@ IA) XX=(RAD 6 ADD GETW EXTW) PUTI(0,RATL0@,IA) }YY=(RAD 8 ADD GETW EXTW) ELSE PUTI(I DECR RH0@ IA) XX=(RAD 2 ADD GETW EXTW) PUTI(1 RATL0@ IA) YY=(RAD 4 ADD GETW EXTW) ENDIF ELSE IF(RAD GETB $F0 AND) 1 ELSE 0 ENDIF RATL0@ IA PUTI PUTI(HH RH0@ IA) XX=(RAD 2 ADD GETW EXTW) YY=(RAD 4 ADD GETW EXTW) ENDIF POSITION_SPR(XX,YY,GETI(RH0@,IA) $3F AND,13 IA ADD) IFZE(GETI(RATL0@,IA)) SZIP0@ GETI(RP0@,IA) 4 MULTIPLY_W ADD ELSE ASZIP@ ENDIF 13 IA ADD PATTERN_SPR ELSE III=(0 100 RANDOM) IF(III 25 LS) PUTI(1,RSI0@,IA) PUTI(0,RXI0@,IA) PUTI(1,RYI0@,IA) ELSE IF(III 50 LS) PUTI(2,RSI0@,IA) PUTI(0,RXI0@,IA) PUTI(-1,RYI0@,IA) ELSE IF(III 75 LS) PUTI(4,RSI0@,IA) PUTI(1,RXI0@,IA) PUTI(0,RYI0@,IA) ELSE PUTI(8,RSI0@,IA) PUTI(-1,RXI0@,IA) PUTI(0,RYI0@,IA) ENDIF ENDIF ENDIF ENDIF ELSE III=(0 100 RANDOM) IF(III 25 LS) PUTI(1,RSI0@,IA) PUTI(0,RXI0@,IA) PUTI(1,RYI0@,IA) ELSE IF(III 50 LS) PUTI(2,RSI0@,IA) PUTI(0,RXI0@,IA) PUTI(-1,RYI0@,IA) ELSE IF(III 4 AND) PUTI(4,RSI0@,IA) PUTI(1,RXI0@,IA) PUTI(0,RYI0@,IA) ELSE PUTI(8,RSI0@,IA) PUTI(-1,RXI0@,IA) PUTI(0,RYI0@,IA) ENDIF ENDIF ENDIF GETI(RS0@,IA) DECR RS0@ IA PUTI ENDIF ELSE PUTI(0 6 RANDOM RS0@ IA) ENDIF ENDIF ELSE III=(GETI(RF0@,IA) 4 MULTIPLY_W) PATTERN_SPR(SZIP00@ III ADD,13 IA ADD) GETI(RF0@,IA) INCR RF0@ IA PUTI IF(GETI(RF0@,IA) 4 GR) PUTI(0,RF0@,IA) ENDIF PUTI(0,RATL0@,IA) ENDIF ELSE PUTI(GETI(RZS0@,IA) DECR,RZS0@,IA) ENDIF ENDIF NEXT } ures { XX RX0 EQ YY RY0 EQ AND RE0 AND XX RX1 EQ YY RY1 EQ AND RE1 AND OR XX RX2 EQ YY RY2 EQ AND RE2 AND OR XX RX3 EQ YY RY3 EQ AND RE3 AND OR XX RX4 EQ YY RY4 EQ AND RE4 AND OR XX FX0 EQ YY FY0 EQ AND FE0 AND OR XX FX1 EQ YY FY1 EQ AND FE1 AND OR XX FX2 EQ YY FY2 EQ AND FE2 AND OR XX FX3 EQ YY FY3 EQ AND FE3 AND OR XX FX4 EQ YY FY4 EQ AND FE4 AND OR XX SZX0 EQ YY SZY0 EQ AND SZE0 AND OR XX SZX1 EQ YY SZY1 EQ AND SZE1 AND OR XX SZX2 EQ YY SZY2 EQ AND SZE2 AND OR XX BX EQ YY BY EQ AND BDF AND OR XX BAX EQ YY BAY EQ AND BANF AND OR XX SX EQ YY SY EQ AND SISF AND OR XX SX1 EQ YY SY1 EQ AND SISF1 AND OR } lefele { AH=(AH 4 SUB) IF(AH) 20 CYCLE AA=(DUPL) IF(AA 12 NE) MOVE_SPR(0,8,AA) ENDIF NEXT ELSE AH=(0) BDLE=(0) SIS???????***** UU      UUW???????????? * * * * **UUUSʃ??????????%h  *UUU<T UUP00000       P "U@???????3?****** O<?????  "" _??????  UW<<<<<0?<?Z?(((((*(UW_<<<<<<  ((((("" (UUW?0?3<<<<<3?<**UU@<<?<<?<<<<<<??T(((((((((("UU@<<<<??<<??(? ? ?T(((( **( (**> UU@<?<<<?<??<T((((( *((*( (UU@0?<0?0??<?<??T ( ( (  ꪀꪀUU@000?T   UU@000<?<??ƒƒƒT  ( (   ƒ UU@<<?? પT ( ( */ƒ/UU@?????????;પT * *(**+>UU@??????NÃÃ>ÃT  (( * *((  **?UU@???????ÃÃ>ÃT *  ***?UU@??????€€?€T *   ***?ƒUU@????T   *"  ?뿠UU@? ??0? ***T  2UU@??????T(   UU@?? T@?UU@(????< T0**** UU@)????? T UU@)?T +?UU@)ꪯT UU@(< ?T / + <UU@?<3<0?T  ? *<3<0?UU@?????Q ? ???  ? ???   <  <      ?<?< < <  < < ?? < ?<  ? ? < ?<  ?  0  0 3 00<0 3 03 00  0 3 00<0 3 03 0  < <?<00 300< <?<00 300  3  3 3<0 0 0 3<03 03  3 3<0 0 0 3<03 0 0 0 3 0<  0<3 3 0<0 0 3 0<  0<3 3 0<"UUUUUUUUUUUUUUUUUUUU@UUH@"UUUUUUUUUUUUUUUUUUU@UU0?0?0000' "UUUUUUUUUUUUUUUUUUUUU000000000<."UUUUUUUUUUUUUUUUUUUUU00000 0003."UUUUUUUUUUUUUUUUUUUUU0?0?0?00000."UUUUUUUUUUUUUUUUUUUUU0 000003303."UUUUUUUUUUUUUUUUUUUUU0000000<0."UUUUUUUUUUUUUUUUUUUUU?000.*H@*H ?A*H B*H ?C*GE*G?F*G?F*GE*G I2*G ?B*GB*G@ H?I?= I?=J; J: K??8 K 8 L 6G? 5G ?3 G 3 G 1 G? 0 G?. G. G, H+ H<?) ( H??) *?H?' * H?&*𪪨H??$* H?$*H?"*G?!*D??*G?*G?*G?*G??*G?*G HI? I?J G?G? ?* G!*G!GUUUU" *GUUUU#? *GUUUU$ ?JUUUU$ !JUUUU%"JUUUU&?"JUUUU'#JUUUU'#G(?O1?*GU**PPPPPP$,PPPP0 ???< < <<?????P? <<< 0000<330 030 P <?0 <3?00<? ??3? 03?0   ? <30 <000 < 33 0 03 0  3? ?< ? 3<?? 03?  ? <  +   <  +=?  ?**  UU?UU ***+* <UUUU? ***+* UUUU   ?.  UUUU ?  ?.  UUUU  ? < . , .UUUU D.UUUU D.UUUU?EUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUEUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUFUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUFUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU?GUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUGUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUHUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUHUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUBUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUURQ0 BnBN/<?< NA#n8p |@"|n<2QF# 9ѹpppNDB9#z #IUP#S6#n#I#I#J~#I#n # n$#n(# n,#`n09`#n4#M8#MH #MX#Mf #Mt`B9@9@9 ||#mhBT9`gRT#vVN,|vb*|i(|[ .|aNq&ּN* E <BQY !|&HBU|*<n<"E q`NF'#n#n #n$ #n(#n, #n0`#S6BND.yn8p |@"|n<0Q#N/<UV?<?<NNPJTf(?9n6/</<?<NN n7`F#/<NA).,G` )X ^.,G`)X.,G`,\` ^+` ^ ` ^;Be` ^T0`$].`-$]4X`-$]$`,.ކ<$G$`$UB*`x-$UB>*`f-$U*`X,.ކ<$G*`D,."]k8c$FQj` $FRR!Qj`.*+G`B,*``,Jkg̼.*`D̼.Sg*`.,*`,.D`f,u``Pf`,.D`f ),u``jPf`bJgjX`VJf^X`JJjRX`>JkFX`2.,$]k&Q`.$UB,̼ 2pV-`.$],̼Jf p` p`,.bXB`"]$Ucb#U#U$G"yU.9U fSkSjkUS*`B`Sk`,.bXB`j"]$Ucb#U#U$G /c$ 9c* @c _g Yc `c zc RSjB`"yU.9U f Sk-H*`.ߕ`.`L"$JjDJjDB#U#U8#UHG8ٹUdRyUHFHG8ٹUdRyUHG8ٹUHGHF¼ļgFUFURUdRU+9U+9U`<.*`0.-gBg:H+GX`.*`.-ggH+GX`BX`.B+F'$+ 'BF#'``+μ,+'F` ], cB"BF'L HF# І"R.ܼV޼h+g H `H(F*G,H`>.μ,&+f(`.μ,&`B+.ކHpp LR̼+oB g f g F' HF#F.ކLpp `R+R+R+R+R+R+R+R+R+R+R+R+R+R+R+++B`nS`hR`b+`\B;^`R+UY`HX`B"]$UR*BB</c.<9c<@c"<_g<Zc <`c<zb RfBB++`$]"] ]Hx U3UTV#R#Rat/<Q?<ANA\?</<Q?<NNAP f/<Q/<Q?<?<VNA ?</<Q?<NAXNuBBB9ST9SUg"|SV;q`TST`SUST`~ Hx UTV3U(9T Tc(9T` JTg D#N3TJTgByT g.??<NAX#TNLx UByUTV`??<NAXp ??<NAX#TNLx UByUTV` Hx U3U g&?Bg?<NM\Lx UByUTV`v?Bg?<NM\p ?Bg?<NM\Lx UByUTV`B,"U c|BB$MV! @c Sg! @c SSf*J`."]| QS0Jg,̼0 9c^` "Ucp |UXBB!<$aݕSf`  |UxBUJg*.#UaH<$|U"|U| Q`"]~ QS0"9UJg6<<0`BUJfNud<"|U$|U| Q<"|U$|U| Q`BJfNud܂`Hx U3UNLx UByU`Hx U3UNLx UByU`Hx U3UNLx UByU``9Rf9Rf8R#N#TR`R#N#TR`Hx U3UB9RkNLx UByU`R#N#TBg`0#N#TR?<#TJTf*/<4Q`#`N`N`,.bG"B4<eQFabЇ*`x/<UV?<?<NNP`b/<UT`#mB#S6BTJ9`f`Hx U3UNDLx UByUNqB9#I#S6#J~a 9mh"9m¼Jmf(ff@Q#mhNuHml?<NN#mhLmlQNu#T`THF%JTga1LN/BT`$HT|.9V |UJgSf XR<f |VJySDgDJySLgSySL`HSySPf@3SRSPg4B@9SU |SV1SDTSU`3SNSL3SRSPJngNB9RRg JngaULTNuH99gg B9 yS>Nk *g 6g g 8g" :g.SJ |R9SFfs0g9SHf `c zb 9SGf& c<` Zc _c<zb<  f*9TVfPJvRfH9U gV#vZ`JB@9SU |SV|J9SIkA13SDTSU9gLNs#m9g`@HF'BT9U g #vZJ9`f`#UP#Vm#V n#VnUn <#V#V BU2< |U"|mBnBN"BQ#VJ9`f`LJyUgLx U&|V*<nT#n#n #n#nHx UNDLx U,|vb*|i(|[ .|F##I#J~BT`#mP`#mP`#m`~#m`p#m`b b g: g4 gB gP g<9SJfSJBSB`SF9SJj`SG9SJj`SI9SJj`ySH9SJj`S:< |SS<@ |S#S>`\4<9S< |T S9S#JS>`04<9S< |T S9S`RT9TT9T 9 Tn 9Tg 9Tg #TTBSBB9S<#JS>`T9TT9T 9 Tn 9Tg 9Tg #TTBSBB9S<#JS>`9S<<fHH#TZS<`jHH#T^BTd9S: Tf TdTfTLTh9Tbf@عTZk cІ`Jj؂`ڹT^k c҇`Jjڃ`HTh#JS>`N`N`N`N `N`N`N`N`N`N`N`N&`N(`N`|N`rN`hN`^N`TN`JN`@N`6N`,N`"N` CASTL1.DATCASTL1.BAK`@1234567890-= qwertyuiop[] asdfghjkl;'`#zxcvbnm,./ -+ \()/*7894561230. !"#$%^&*()_+ QWERTYUIOP{} ASDFGHJKL:@~ZXCVBNM<>? -+ |()/*7894561230. NNRPPPPNzNOXO(J|| -nXI4QCI d'B@V@U6vwrhCTV"оnVWi оIWi gm ݶ0)x((خ2 ݨ23`h:L8$PbL ~zz {۾ܶ$Frތ ݂ ^FUUU C 4[ ixI/     -5666666777&787F7Z7f7x777778.8:8Z8|88888899d:P::;;&;:;N;b;t;;;;;;;;;;;;==$=<===>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>p>v>|>>>>>>?@ALC$C`DDEENF F2FXHG2GbF~GHHCR77H H*<<<H4HfH|GQ:QPQQPPPP<<Q&Q0QQQQI|IQDQNQXQbQlQvQQQ5D*EMILV m4mmnnnn nnnVSLSPzl@EMILINKEYSBMOUSE_CXTpMOUSE_CYTtMOUSE_XThMOUSE_YTlMOUSE_DXTMOUSE_DYTMOUSE_BTdMOUSE_RBTdMOUSE_LBTfJOY_1TJOY_2TSTART_FLvZRUN_FLvRLINE_STPIX_OUT_ADDRPIX_INP_ADDRSZINEKzWRITE_STTOUTPUT_STTSTART_FILERCOLOUR_MODETCHR_MODETGRAMOFON ZENE_TABRCFLAGnCURSORXn\CURSORYn`CDELTXndCDELTYnhCXMAXnlCXMINnpCYMAXntCYMINnxSPRTABLESPR0SAVESPR1SAVE6SCR_FLRSPR_ESPR_XVSPR_YKEPTARn|LIFTSZAMLX0 LY0 HA0 HB0 HM0 HI0 LX1 LY1 HA1 HB1 HM1 HI1 LX2 LY2 HA2 HB2 HM2 HI2 LX3 LY3 HA3 HB3 HM3 HI3  LX4 LY4 HA4 "HB4 &HM4 *HI4 .VAR_TAB>HHISCORfHSCOR0nHSCOR1vHBONUS~SCFLGNBONFLGRLFTFLGnR_CIKSZmRAND_FLmоzh4zvZ4`x4vZ`x4yv^v^0<\vDv^0v^vD4wf404w414w424w434w444w454w464w474x 484x 494x44\<`wVDwD4 Tv4yThx(R4y'Thxwt4y1Thxwt4y;Thxwt4yEThxwt4yOThxwt4yYThxwt4ycThxwt4ymThxwt4ywThxwt4yThx4vZ4p4p44x<\x0<04\xp0q4p4q,q@4q4q44xq4q 4vP,q@DvZ4\y4y 4vZCOMP1.PRGGAME.DATDEMO1.DATDEMO2.DATDEMO3.DATDEMO4.DATDEMO5.DATDEMO6.DATDEMO7.DATDEMO8.DATDEMO9.DATE  0: DEMO0 1: DEMO1 2: DEMO2 3: DEMO3 4: DEMO4 5: DEMO5 6: DEMO6 7: DEMO7 8: DEMO8 9: DEMO9 FppwDDtGtwGG,/<?< NA#a&B99fa.9ga""y f/9?< NABWBgNA"y $g(|,| |$|bt 2 "4 *p\J4gS0BfSHkABR4J0CgBN{B&0450jBDJPgB&pd"|&0L30jDpRL(1 J0CgN|(pSpJ g"&ph&0TJ0CgN|Ls0RTYj8Jj #aSNu"y $Dg eiN}aNutN|t"r"y |$|b 2 (J@g^a  l*<,ڀPC!@#@JpfJ0g !,N}&0&|CY!0,!$J@(gD!@(#@(JpfJ0g&0"!\vaN}h!t\&0aJ@g!@#@J@4g.1@4! #@4YBQN} |$|bt 2 J,gSg~YBj,|t*| 2 "5 JgJ0CgN}pSpYBjB(| "T&|t 2 "3 0$#`YBjDS<GNuagDjfi dN~pd:N~Djgi dNbdNi d.NdNDjgid\N*a$ | 0 || |N}z,0C!`XFQC  l*<,ڀPCNua!d!P!, ~wpjd^YTOKGC?;852/,*'%#! !                                             Xd,0H`x    zNu9RfHTV k n9Rg,|#`,|#*|# <ǽm,yLH0LH0LH0LHQLXTVNu9RfHTV k4 n,,|,V9Rg(|`(|*|NLXTVNu,L <LH0LH0LH0LHQNu,L <LHLH0LH0LH0LHQNu,L <LHLH0LH0LH@QNu,L <L~H~LH0LH0LH@QNu,L <LHLH0LH0LH@QNu,L <LHxLH0LH0L~H~@QNu,L <LHpLH0LH0LH@QNu,L <LHh-]-]LH0LH0LH@QNu,L <LH`LHLH0LHpQNu,L <LHXL~H~LH0LHpQNu,L <LHPLHLH0LHpQNu,L <LHHLHxLH0L~H~pQNu,L <LH@LHpLH0LHpQNu,L <LH8LHhLHLH0LHpQNu,L <LH0LH`LHLHQNu,L <LH(LHXL~H~LHQNu,L <LH LHPLHLHQNu,L <LHLHHLHxL~H~QNu,L <LHLH@LHpLHQNu,L <LHLH8LHhLHLHQNu9RfHTV k4 n,,|&,V9Rg(|`(|*|NLXTVNu,L <LH0LH0LH0LHQNu,L <LHLH0LH0LH0LHQNu,L <LHLH0LH0LH0QNu,L <L~H~LH0LH0LH(QNu,L <LH LH0LH0LH QNu,L <LxH(LH0LH0L~H~(QNu,L <LpH0LH0LH0LH0QNu,L <LhH0LHLH0LH0LH8QNu,L <L`H0LHLH0LH0@QNu,L <LXH0L~H~LH0LH(HQNu,L <LPH0LH LH0LH PQNu,L <LHH0LxH(LH0L~H~XQNu,L <L@H0LpH0LH0LH`QNu,L <L8H0LhH0LHLH0LHhQNu,L <L0H0L`H0LHLH0pQNu,L <L(H0LXH0L~H~LH(xQNu,L <L H0LPH0LH LH QNu,L <LH0LHH0LxH(L~H~QNu,L <LH0L@H0LpH0LHQNu,L <LH0L8H0LhH0LHLHQNuNuNuNuNuNuNuNuNu.ޝ޹>+Nu.$+NuJfNuHTV.9SjLTVNu"$Ҽ A "(Ёй>"@tv4)6)XB|JnfJ gS f ((Jg:fB`$JgSf| fU3|UiR(9n|`rS3| f !|`Jg Sf6` TTiS(9n|ؼ (S fVJf!| <) <)< `V (f&Jf!| <)<)<`&<)<)<) <)<9RfJTfp0@HBz#B(G.Jnf>J f8!h D"C$C&|Jg oza`za0`~aT 9B@"@$@9Rg` <aό`p0@HB,G.#BJnfLJ fF!h D"C$C&|*|Jg| la Z`z.a `~a 2 9B@"@$@9Rg` <adώ`,9n\.9n` ܼz#nl,9n\.9n`ކ޼V,Xnpnp#nt#nxNu."|"Nu."|,ݑ`,ݑNu."|"`"`"Nu."|"Nu."|.,JTgކ޹n|"NuH@TV."]|z<JTg:ڹn|چ"G"LTVNut4BHG9Rf#JJj-@м"@$@&| yn|*|Jg| laj`z.a`~a B 9J"@$@9Rg` <a`HTV,|R "(Ёй> @J(j(p~f 0(>(`0(>(^мJTft4B#J9RfJj-@HGzм"@$@&| yn|Jg oza`zax`~a 9J"@$@9Rg` <aLTV Nu&|RJjNu &"@$@9Rg`JTf <a` <aP`NuNuHTV(9V*9 |V"|$||.Jpgpfpf+LTVNuR f+<`9RfHTVaT(|JjLTVNu&|JgJTf<&,` S JjD n,@p`.t4BHGz"C9Rg(<` 6(<"Є"@Jfa`J na`.`*fB-`.faB-fpaLKQNu,z$"n zDAeRA0c AAe> ..f "n|a *n >.`gB@aKQNu,z"n *I .g:EaN>.`iggarCQ-g`>.` iCQNu0<BBBBBBBBBBQNu0<""""""""""""""""""""""""""""""""""""""""QNuJTfhOA"0p$0p0<""""""""""""""""""""""""""""""""""""""""QNuOA "0p$0p0<""""""""""""""""""""""""""""""""""""""""QNu$m gB0- (nBF&m g2:Smo 0S@;@|8*kmo80S@;@|`*:mo 0S@;@|8*mo 0S@;@|g0,R@@0*l@ml 0R@;@|g0, R@@0*l @ml 0R@;@|JFgAL0`@NuB-Nu/H4*IQ$OaL< `"Rl jl><`><Rf jl>< jo|8jn,<< D`&jl jl<<`<<Djf jl<< DFgp OWD@| @.Nu0- (n0-45@0-5@5@6m0 g0Rj0+jj0,j2, jgR@jgRAjNuHFQ>0- (n6-:8-<ll glREgl RFJGg&m g0>|?nZ2+?A|nJkkB?@kk6?AJWjBWJojBo o?o?|? oo?|SonkonSWmkom2/Al2C4/Bl4DBEWl:CBFolLf"|&m gJGf-g:O>3pa\`0&m f0|ga:`a`a0|ga`aBPLbNuH@AZC6p>pQLGBNuFEFERAJTfvA0pB0B0HH$IB06|g"A<@|lDAnnBAaJAg&|o<Efֺ|g\pEHA80AoAAp :FE(M"J<LDDDDQYQYQYQYICQPP0/R@Wk Wm"(M"JEfҺ|gZpEHA(0Ao AAAAȰ@*F(M"J< ˑ ,P˩PPICQXX0/R@Wk Wm&(M"J(M"J(M"JEf"|gnpEHAb80AoAAp (M"J<LIDDDD:ABCgFEQYQYQYQYCQ`CQPP0/R@Wkx WmH(M"J80AoAAp (M"J<LIhijkDDDD:ABCgFEQYQYQYQYCQ`CQPP0/R@WkL Wmb(M"JEf2|gvpEHA(0Ao AAAAȰ@(M"J< ",P„*F.㏊ʼg.⏊ʄFˑ˩PPICQXX0/R@Wk WmN(M"JHJTfaR$I(M"J6?oa@Ro g /gQ` gIX`Ia\QQzPRWg/f& g|lRFQ`BFQQ` QP|Q\NuaH$I(M"J6?oaRo g /gY` gI\`IaQQzXRWg/f& g|lRFQ`BFYQ` QX|Q\NuJTf2a$I(M"J6a*IaXQQ|PQzPQNua$I(M"J6aIajQQ|XQzXQNu>HJTfa$I(M"J6?oaRo g /gQ` gIX`IaQQzPRWg/f& g|lRFQ`BFQQ` Q|PQ\Nua$I(M"J6?oa*T0,FB0,E?HH<|DF|:|DE|8NuFEFEB0B0HH>*T0,FB0,E?HH<|DF|:|DE|8NuFEFEB0B0HH>*T0 gH gD@l lB0gH gD@ll?HH<|DF|:|DE|8NuFEFEB0B0HH>*T0 gH gD@l lB0gH gD@ll?HH<|DF|:|DE|8Nu?BGp: gQ:Nu?BGp*,Pʀ.΀OE:NuJGfg4>3p` JGfg$?p<g 2Q` 2Q<CNuCNu| fgD>3p` | fg2?pFP,̼뮍P,̼뮍<CNu      *J  .v6@v*F>  p    "         ( \      &" "$     $(   < 0 (    046  $$   *  6               R  R    24о 4   4Ѣ4<LD4оvZ$vR44TPD44dPD4P4rPD44HPD44VPD4`44X44ѢPDT\$4<<4Ԃ(4Ԏ(4Ԛ(4P44@444@4`4f`4% ($t Tp Tt$T$T$(((($$ 4 @4 @$4<44@(4 @4<44@44(l(( o( 6$ 644(l44(l40,<\Ҧ<,,ҐD4fp4np4vp(N4n|4>4R B(R(R $4 `DFSB4 \j(SB "x0xx4\Ӕ(x4x<\\4Ѣ4<LD<$\T4T4x*Td4xx4xx(\\֬4\V0$$ px$ \ ^4 ^x4  $P4 px4  ^x $\P( px  ^x (֘4\֘ px (0 \ժ( \ ^x $֘\|\R ^4 ^x4  ( px(  ^x (v ^x $ ֘ ^x ( ^ ^  H(N(n  $$4fp4np4vp((\ז\׊ז4ݲ 4 46 44ݲ 4 ( 40,<\ <,,D4(4(l4<444(l$n(Th(Tl((N(n(l$44\44\<4@4(`ٚ \ٚ4?4$44$4$$40,<\ٸ<,,٢D4R(8 D(4 R4((( $n((4,$dd(, \V$n$N4۶(SB4d o4< 4Z04< 4(4\ 4`\$4SB\P4Ѣ4<LD<SB4 \r(SB "SB4\ۚ(SB(4Ѵ4$ (T(X(0`\8`Tt2\&Tt2TtDTtt4xt$\~$T0ܢt \ܢ4T0t\4X0 0t\$X0$0Td4xTl\D4T0lTl(\l$T0Th\ݞ$X0$0Th(\4X0 0(Th(Tl(Tdx\`(4,(\4"46 ( Z 0,<\ނ lD 0( 4R(8(4 R4(($ 4(,$\,(4p,D\JL46  Z,0,<\߈ rD 0( 4R(8(4 R4(($ 4 P(4, \44E4E46  Z 0,<\n XD 0( 4R(8(4 R4(( 44(4,(\~44h4h46  Z 0,<\< &D 0( 4R(8(4 R4((  4 !( Rl0\P0PP0$\ l`4B(84f(80 \Nl`>4φ(8H4r(80\l`4n(84n(80\l`4Z(84j(8044$\l`4R(84f(84 \Zl`J4ϖ(8T4r(84\l`4~(84n(84\l`4j(84j(8`4к8p46 p4~pp\F 4fp4np4vp(x4Tp$ ~x4Tp  ~4x4Tp ~04ݲ 4 4 4%\44$((((4,$d((  4d0,<\v SB\4Ѣ4<LD<SB4\(SB(4ѴTTTdxx4\@444$((((4,$dD(4|$R 2(R4d0pp\  Z  0( 4R(8(4 R4((44p\f0 24p4 \~ j : 8 : `~ 046 04ݲ 4 4f (R 2\<4fp4np4vp(x4Tp$ ~x4Tp  ~4x4Tp ~4d4%\44$((((4,$d((  4d0,<\ SB\4Ѣ4<LD<SB4\(SB(4ѴTTTdxx4\4ZD(4|0pp\@ R Z  0( 4R(8(4 R4((4۶4\$`d,dd(\( (4ݲ ,4\D$`^h,hh(\zD(P(@4ݲ 4,$44Ж48(4\4d4Ц48(4,4X4 ((44К8(4 \4d4Ъ8,44О84\4d4Т8, 44О84\b4d4Т8, 44О84\4d4Т8, 44О484\B4d4Т484,44О484\4d4Т484,$\4,\$(((H48H 4H44?( ,(@\VDH$(((DHH4 8H 4H44? (  4,(@(4ݲ 4 4 $N4(( $n\\4fp4np4vp4V(8 *4(8 *4V(8 *4(8 *4(8 *4"(8 *4d0,<\40,<\<,(4$D ,D( (l,` P`d$\\$d$\x$4d\ 6\ \ (\\*4<4(\j4v44`J\44<4@4 \J4?4$44$4$$`b Rx44(l D\((` R 240,<\(<4D` 4R8(4 R4(",D((4,$d cH0044\d(, $n(0(P4۶(SB4d c4< 4d04< 4($N4(p p0pp4\(SB\4Ѣ4<LD<$\T4T4xTd4xx\4xx(\(\(4Ѵ\ pN @tR0,<\ <,4T84(D0,<\d<,4842(&D0,<\<,484B(jD $pVZ@^tbf0,<\<,4T84j(PD0,<\<,484~(D0,<\<,484(D\ $pVZ^@btf0,<\<,4j84T(D0,<\H<,4~84( D0,<\<,484(ND Np @tR0,<\r<,484T(4D0,<\<,4284(xD0,<\<,4B84(D$  p`(\(\v$$< 4<(\$848x|0\|<|0\Jx8xx|04\$(004? 44(p0p`p484~8`(\(\\$$<p 4<(\$8480\<0\0804\h$p(004? 44(0 \(`4Ю84~8(44(\$\^48(<\$$<(8\ 4<(8 \$8(<((8(<0\04\R$Z(<<888< `004?8< 44(0  `R4F8d4Ђ84<4<HH004@4@\:4\ 4<4?\H004?44,(4t,H4H44<4?$(H0044\4<4<4< 4j 4,4,$4t,H 4H44<$(H04\X$Z(4t,H004?4,H 4H44<$(H0044\4<4<4< 4j 4<4<HH0H0((($(4<\4(4<\$,4<\4 P,4<\P$$4<44\4\ R(4d42\\&4<84<<(\4<84<<( R\4<84<<( R\ R4<84<<(4<4<HH0((4<\  (4<\ ,4<\   :,4<\ :$H0044\ n4 t4<4<4< ^$\ $$$  \ B44$$ \ | 4$$ \ 4$$$4<,4,4<04,4<` >4t<` &4 ,4v$8 (4<\ 4t<` v4 |4v$8 (4<\ 4t<` 4 4v$8 (4<\ (4t<` 4 4v$8$8<HH04<44\ 4 \\ <<(\88(8<HH004@4@\4\x z4<4?\H004?44,(4t,,4,$4t,\H04\,$.(4t,H004?4,4<4<4<4<D44,44,(4,h((,dD P(\`(4X48,4D,D4P,HH0044\D &448,44D,(4P,0,<\<D4<\4<` f 448,44D,0,<\<DD44D,44D,D `84,<4,4,$4,4,4\,4,4h,|  4<`| f  T4<\4<4\<4h<4,4<\x4<<4,(4<84<<4<0,<\|,44,  * `v 84,<4,4<4,0D4<\f \$ 4,0,<\$<,44,44,(4,D\@4x`(4,(4,4,84,<4,|4<$\\4< 4,4<4\<4h<4,(4<84<<4<0,<\0,44,  * `* 84,<4,4<4,0tD4<\ \f$h 4,0,<\<,44,44,(4,zD\4,(4,(4,V4,84,<4,|(4,(4,  ,D0,<\!<D4<\4<\4<$4<4,4D<04D,4D<`h4<04,4<\(4, (4,4<\ 4<\4<$\4|<tt$\ $$t \N44$t\x 4$t\4$$4<,4,4<` 4<4<HH004@4@\4\: <4<4?\@H004?44,(40,H4H44<4?(H0044\:4<4<4< 4j ,4,$40,H 4H44<(H04\$(40,H004?4,H 4H44<(H0044\4<4<4< 4j H00pH0d(h(l(t(4<\4ht(4<\$ht,4<\X4lt t,4<\$lt$t4<44\d4dddt\ (4d42\dt\b4<84<l<t4|,dt\4<h84<<t4|, dt\ .4<h84<<t4|, dt\ 4<84<l<t4|, ` 84,<4,4,4X<0 4X,4X<`!P40<\!(4z!>4&4<8!4X<\!40<\!4z!4*4<(4<8D c P`!4 d4\"H04"$H00\"0\"l00(T"00(X0$\""0 \""0\""0\""(\#H0\#4#Z \#R#Z$\#x$#(4 $4( H004@4@\$4\$ $d4?\$H004?4d(lH4H4d4?(($,d$lH 4H4@d((%FH04\$$$(lH004?dH 4H4@d((0\&B0\%l`%~4Ϧ(8%4j(8&<0$\%l`%4Ϛ(8%4f(8&<0 \&l`%4Ͼ(8&4r(8&<0\&<l`&24ϲ(8&<4n(8',4\&~l`&n4Ϧ(8&x4j(8',4$\&l`&4Ϛ(8&4f(8',4 \&l`&4Ͼ(8&4r(8',4\',l`'"4ϲ(8',4n(8\'D j'h0\'\04 8 : ((\),0\(0\'l`'4Ϫ(8'4j(8(0$\(:l`(*4Ϟ(8(44f(8(0 \(vl`(f4(8(p4r(8(0\(l`(4϶(8(4n(8)4\(l`(4Ϫ(8(4j(8)4$\)*l`)4Ϟ(8)$4f(8)4 \)fl`)V4(8)`4r(8)4\)l`)4϶(8)4n(80\),0\+,0\*0\*8l`*(4Ϯ(8*24j(8*0$\*tl`*d4Ϣ(8*n4f(8*0 \*l`*4(8*4r(8*0\*l`*4Ϻ(8*4n(8+4\+(l`+4Ϯ(8+"4j(8+4$\+dl`+T4Ϣ(8+^4f(8+4 \+l`+4(8+4r(8+4\+l`+4Ϻ(8+4n(80 cd4\,(lH4H4d4?((H0044\,d(, d4?4ھ 04c\,4c\,. H04\-$l-(lH 4H4d4?((H004@4@\. H0044\. d(, d4?4ھ 04c\-4c\. \.8 j.D 8 :(,d44\.$(,d44\.$ (,d44\/($(,d44\/t$(,d44\/$(|,\/ X(,\0 \(,\0D `(,\0p d(,\0 h  cd4\0H040H00\5^(T(,X, c(,d44\1x$(,d44\1$ (,d44\2$(,d44\2\$(,d44\2$(|,\2 X(,\3 \(,\3, `(,\3X d(,\3 hH004@4@\44\3 3d4?\4`H004?4d(lH4H4 d4?((4H04\4$l4(l,dH 4H4 d((5XH04\4$l5(lH004?dH 4H4 d((60d4\5(lH4H4 d4?((60H04\5$l5(lH 4H4 d4?((\6H j6N 8(,d44\6$(,d44\6$ (,d44\72$(,d44\7~$(,d44\7$(|,\7 X(,\8" \(,\8N `(,\8z d(,\8 h '(,P(\9($ 4V 4Hd4(D,H@ (\9(@$P4V 4Hh 4t\9l0$ll`9 4l,ll(\9 \99 l,(\:8 (4\:h0`:h \:0p`: D0pDD`: |D(,\;4R  4(8,Dd4P4 P(\;~( A`(4X(<,Hd4T4 P(\;$ A`(4X(@,Ld4X4 P(\B B(4X(,d44 P(\> B(4X\@\? P`? (4X@\?l P`?P(4X?f4R $4D@ P(\?(4X@4\@4D<\@b4T<\@\ P`@\(4T,4R  B444@ P`@ B(4X(,P(\@($ 4V 4Hd4(D,H@ (\A^(@$P4V 4Hh 4< cd4\AH4H4H004?$<(AH 4H4H004?$<(4C> cd4\BZH4H4H004?(BH 4H4H004?(4C>< cd4\BH4H4H004?<(C4H 4H4H004?<(4C>d4\CH4H4H004?((CH 4H4H004?((444(  ( 400,<\D.<(4   CD(( $ (4 41 4(4 42 4 4443 ( 41  ^($np(0(8(<  Z  C(n`(40,<\J"(n\40,<\ISB4 \El(SB "4(\(`4n`(n\, c0H 4?npnp4?\F,4\F$F npnp( FB$np42( nlnx( ( ^4?npnp\ITnp4?\G4\F$F npnl8nx4<0npnp4@0nl\nx4`nt4\Gd4Gj4(ntnp4\GG4np0Gnp0nl8nx4<np$ nlnx$ $ ^np$\H< HZnlnt,  ^4@\HL(L(,L(npL($L4(04\4\IFnlnx$  ^0400IN Il$   x0H0 8H $<H$\H$`H$ n\0n\E@D( Bn`0n`E&D0,<\K<,LL8(L80, cH004?00L(, , cH004?L4(,0, c0H004?\K(K $L4(L48L800\KVK0\KnK0\KK0\K K$<L4(L4 (J,D$n40,<\N<4D,40,<\N<4D( c(0H0$\L$0(,0HH0$\L000LB c0H (0H0 \M$0(,0HH0 \M000L c0H (0H0\M|$0(0,HH0\M|000M: c0H (0H0\M$0(0,HH0\M000M c0H KDKD 2`N$ 4  ^  44  ^N4G 4   ^4I 4  ^4J 44  ^ 4  ^ 4  ^ 4  ^ 44  ^  4  ^ 4  ^ 44  ^ 4  ^ 4  ^ 44  ^ 4  ^ 4  ^ 4  ^ 44  ^ 4  ^4 4  ^ 4  ^4? 44  ^4@ 4  ^4A 44  ^4B 4  ^4C 4  ^HH 4H4H004? cd4\RH04RH00\V.0\S,X,00S*(T(00 cH004@4@\T4\Sx Szd4?\TH004?4d(lH4H4d4?((H0044\Td(, d4?4ھ 04c\Tx4c\TT,d$lH 4H4@d((V(H04\U $lU((lH004?dH 4H4@d((H0044\V(d(, d4?4ھ 04c\U4c\V(c0(H44\b0\\0$\Y,0<(<HH44\Y(4\X(088,HH0H004@4@\W4\WP WR<d4?<\WH004?4@W<,@WH004?@@4\W4$\X8($04S*($\Y(,88,HH0H004@4@\Y4\X X<d4?<\XH004?4@Y <,@Y(H004?@@4\YP4$\Y8($04S*Y4\0 \\,,<(<HH44\\(4\[@(088,HH0H004@4@\Z4\Zv Zx<d4?<\ZH004?4@Z<,@ZH004?@@4\[4 \[@8( 04S*($\\(,88,HH0H004@4@\\64\[ [<d4?<\\"H004?4@\0<,@\NH004?@@4\\v4 \\8( 04S*0\b0\_(088,HH44\_$$,4\^h,0<(<HH0H004@4@\]4\] ]<d4?<\]H004?4@]<,@^H004?@@4\^<4\^h<,04S*  ,$\_,,<(<HH0H004@4@\_^4\_ _<d4?<\_JH004?4@_X<,@_vH004?@@4\_4\_<,04S*_4b0\b(,88,HH44\b$$,4\a,0<(<HH0H004@4@\a"4\` `<d4?<\aH004?4@a<,@a:H004?@@4\ab4\a<,04S*  ,$\b,,<(<HH0H004@4@\b4\b& b(<d4?<\bpH004?4@b~<,@bH004?@@4\b4\b<,04S* cd4\cF(lH4H4d4?((cH04\cj$lcr(lH 4H4@d4?(((,HH44\c c(@44`4l\d4<4~< 4 4004? 4(4484 $$$d4,\e4:<4< 4(4,004?(, (48 $( $$@\f4b<D4<HDH 4X4\004?LX\ L4(4484 $@(P$T$$t\g4Š<x4<|x| 44004? (48 $t($\ht4ò<4F< 44004? (4Ю8 $($\iJ4<4n< 44004? (4F8 $($(Lp0,<\o<Dp4T<\kF(4h,(4D,4"<4|,$L4<4,4|<4< 44,44,004?4,4<4< 4<(48 (4,40,44,(4,k(4T,(4|,(4,(4D,,(x4<\m$x(4|,(4,4<4,4Ɩ<4,4<4< 44,44,004?4,4<4< 4<(4&8  \o448,44D,4<\o$(4,(4,(4P,4<hm4<4,4^<4,n$\nF4b<4<DHn \n4:<4<4<4< 44 ,44,,004?4,4 <4,< 4<$(4$8$ $4,(4,(4\,(4h,ifD44`4l4<hp4<4~< 4 4004? 4(4484 $$$p(((4:<hq4:<4< 4(4,004?(, (48 $( $$q(( ($4b<hr4b<D4<HDH 4X4\004?LX\ 4(4484 $@(P$T$$s(@(P(T4Š<hs4Š<x4<|x| 44004? (48 $t($t(t((4ò<ht4ò<4F< 44004? (4Ю8 $($t(((4<hu4<4n< 44004? (4F8 $($u(((4dH(Lp0,<\|@<Dp4"<hx$4T,(4h,(4D,4"<4|,$L4<4,4|<4< 44,44,004?4,4<4< 4<(48 (4,40,44,(4,xf(4T,(4|,(4,,(4D,(x4<hy$x$4,(4|,(4,4<4,4Ɩ<4,4<4< 44,44,004?4,4<4< 4<(4&8 z(4,, \|:448,44D,4<h|$$4,(4,(4,(4P,4<4,4^<4,4<4< 44 ,44,,004?4,4 <4,< 4<$(4$8$ $4,(4,(4\,(4h,|:(4,$,v"D0,<\<,4T<\4X<`4h<` 4|<4<8(4D,4<0$4,4l<`}"44<}(4В880044\~b8004@4@\~4<4\}4<4|<4< 4j $4h,$4D,}4~b~\4<4|<4< 4j $4h,$4D,4<4\~804~80<4<\<40<\4|<4<84<4<< `84|,<4,8<88004?@8004@4@\4\ 4<4?\H@44,848(4l,84<,4,8 48$4l,84<804\$(4l,@4,8 4884<8<4<4?(4l<`h44<n4В8(4d<<4\$40,(4,$4,<42\( 40,(4,44,<4K\r40,$4,(4,40,44,(4,(4d<<4\$40,(4,$4,<42\T 40,(4,44,<\40,$4,(4,40,44,(4,4<,4,(4,4h<<4<84h<04h,4h<\(4h,(4l,4X<,4X,|HD8|<T8<X8<\8<`8<d8<8<8<8<8<8<8<8<8<8<8<8D<H@\40,<\<\($D((($((n(((L((x`T(,,(\~`j,,v(,4(4,\  cH004@(4@d4\RH04`4(,L j pp004?4۶  pp004@4@\4\ 4?\p004?4(4p4p40<4?(,$4p 4p40<(Xp04\$4(4p004?p 4p40<0(0\0 00$4:8($04 \( ($((\4 6(\6$ ,\l4$ ,\$$$p4\p04p0x(\Xx\&$Rx\R x\ x\$pp004@4@\4\ 4?\p004?4(4p4p40<4?(,$4p 4p40<(hp04\$4(4p004?p 4p40<0(4`4:$84B8X0 004Z\"p0$(4$4:8(4\J(4d(,Z$`04\ 0 0` `l\44088$\0$8 \:,44$8\j04$8\,4$@\DH44088$\H0H4$8 \*H,H444$8\^D0D44$8\D,D44$0(\ 0 0` ```\0 `448\>448\\\448 484<004?44\ (<<8 <4(\ 484<44\l n(<<004?8 <4(\\ 0   `48 \48 484<8<0( \" cd4\H4H44<d4?4P(H 4H44<@d4P(48@\<0 <<`Z448<\x448DH 484<8<`L4(P\ cd4\PH4H44<d4?4P4(H 4H44<@d4P4(448t\x| 44004?(\J 44004?(\ 44004?(T\>|4\484<  484<8<4?(X\4\484< 484<8<4?(\\4\B484<h 484<8<4?(`\.4\484<  484<8<4?4(d\4\484< 484<8<4?4(4fp\4np4vp 2(( 4p4P( ( pR\4 $ 44X$ $ ^4 4x4h  ^ J4d$ 44X$ $ ^4 44h  ^4 44h  ^4 44X  ^4< 4z4]  ^x0,<\<, D$N$n(40,<\.40,<\"<(4$DDdF($\\z,<< 0,<\<, D4-( (4( ( px( <0,<\D<,44, 4  ^Dn(n$n\49 44  p4 44  ^\4:4; 4/4  ^x0,<\$<,  D$nn(n 2$N$n(( 4p4P( ( p`4$ 4|4`$ $ ^^4$ 4|4\$ $ ^4 44h  ^\44::4; 44h  ^x4(0,<\<, hD(x4Tp$ ~x4Tp  ~4x4Tp ~4(0,<\.<, D(((444 D( B <$n$ ( B4.( 4H4P( ( p40$ 4P4P$ $ p40 44P  p4/ 44P  p4. 4H4  p40 4P4  p40 44  p4/ 44  p42 4P4  ^45 4h4  ^46 44  ^43 4P4  ^4 4h4  ^444 4P44 4 ^44 4h44 4 ^44 444 4 ^44 4h44 4 4 4l4V  ^4 4x4`  ^4 4X4h  ^x4%0,<\P<, 6D4-( (4( ( p( (x4Tp$ ~x4Tp  ~4x4Tp ~4%0,<\2<, D47( 4h4( 47$ 4h4$ 48 4h4 4 4h4 4 4h4 4 4h4 4 4h4 41 4h4 4 4h4 4- (4 $ px$ \ ^x  ^x $\( px  ^x ( px ( \Z ^x $\\ ^x ( px(  ^x ( ^x $  ^x (`  ^ 4]4 44 4^4 44 4_4 44 4`4 44 4a4 44 4b4 44 4c4 44 4e4 444 4e4 444 474 444 4Ѯ 4<<H(H$H$ H$$DDDD4 4< 4D$ 4D$ (D$ $ hh$h $4hR8\h<4;R@h8R(R($SB\\4Ѣ4<LD<SB4 \SB4\ t,((R((SB||4,|4|4<|\D4J4|0||04| 4Tp0P0,<\ 4TP 0pp40\40pp4P P0PD4R044\24 4R0$\V4pb4ppp4|4@0,<\<D4 4 4@D444LDPIC000.ART444PICTURE9.DATPICTURE8.DATPICTURE0.DATPICTURE7.DATdZ                                                                       ,</?(<+?& ^                   LOL8 O 8L8O8T8W;<  ?\_ 0@P`p 0 0@P`p 00 000@0P0`0p00000 `000000 000H H0H@HPH`HpH HHHHHHHHHH H0H@`P```p``````````0`` `0`Lx@l4 ` ( T  H t<h0  CASTLH.BAK )} 4 x_'pxOxOp??Cp'pGGpGG7?pO//P?x_GPoP/'?0G0x'PX`hpxHp?x'hx'xO'' 0@'0oA 8G(@$63SK etoGPO., Z`Xsh78h7ph'hhhh'h7   875875p7575759 9@9`999999 9X7%8X7%pX7%X7%X7%  R؆ "RrT"RB""BRrsarx"RrT"BRr"BRrRxSEH䒢"¢DTDĨ$D’D䤘14RRRRRRRRrBRRRrBrrBrRRRRRRBBrBBRRrBBRRgj 2BR::: ĄTQTT4TX :::¢rT䂁rRQQRBRQQR2T䤡d4㴄tqqr4Tx4112㴄T8 JJJ<<< ږږږުުުA!A!A!qqqA!A!A!qqq    B  ުaAa !1AQaq!1AQaq!1AQaq!1AQaq!1AQaq!1AQaq  ߦ ܒ  ^!1AQaq!1AQaq!1AQaq!1AQaq!1AQaq *>R::²‚rR TrRBrR XXHDH ݪ  ߦ ' ' vvvު A!A!A!qqqA!A!A!qqq#         00 "        44(l(n44(l4% B40,<\<4D,D40,<\N<4D  D4M( (4@( ( ^4N$ (4P$ $ ^4O (4`  ^4P (4p  ^x4'D\64T4'Dp x4Tp 44$(((P0,<\z<Dx4TP0pp40\Xp404S  ^ 0P0PD(P0,<\T<Dx4T P0pp40\2p404!  ^ 0P0PDx44(l (N(n40,<\<,D4Q( 4U( ( ^40,<\<4D04R  ^D44$ 4p4 4`( 4P 4@4 4X4 4p4  44( 440 448 44@ 44H 44P 44 44 444 4p44 4 44 4"44 x40,<\<, ,D(4$\(04<4\@pH$p\`\4!4!(( ((( ( p($ 4($ $ p4N((4 N$4O 4OB4O4O4O4P 4Ph4P4P4P4Q4QF4Q4Q4O44P44Q44P44O44X4 44  ^ 4"4  ^4>   ^4 4  ^4= 4  ^x4(0,<\<, pD(x4Tp$ ~x4Tp  ~4x4Tp ~4(0,<\6<, D((( 4Ϧ(8(4 R4((0,<\< 4F8444P$(xD( 4Ϛ(8(4 R4((0,<\L< 4F84P44P$(D04(\r\4Ϟ(8\4Ϣ(8\4Ϟ(84Ϣ(80,<\J<$\4R$4N8(4N<$D(4N<($4\0,<\<4Ϧ(8(4N<$D(4N<($(04(\ \64Ϧ(8\V4Ϫ(8\v4Ϧ(84Ϫ(80,<\<$\4J4F8(4N<$D(4N<($~4\v0,<\`<4Ϯ(8(4N<$&D(4N<($(04(\( Z P40,<\ D( P40,<\, D0,<\x (40,<\p PTD4D4 ($44(l44(l44(l $ B40,<\P<4e, , ^(4?(4, Dx <4PP,PP(\040,<\<4e, , ^(4?(4, SB\4Ѣ4<LD<SB4 \8(SB "SB4\b(SB(4ѴTTTdxx4\44(l44(l44(l40,<\<, D4Dx40,<\ <, D <f44(l44(l44(l40,<\<, hD44$((4\\\SB4 \R(SB "CASTLE.DATCASTL1.DAT 5F4F04lDp4 `(t0,<\4lt0`t0tD4 `\4 \4`4H`4`4b`47`4`4c`48`4`4b`47`4`4c`49`4`4b`47`4`4c`4:`4lDh4 `(t0,<\4lt0`t0tD4 `+)aaaa"8888!  !     ` ` `  `pppp````~bb~|||||||   ? 888?8''`'`??   ??   ??   ??~ p p` p`??   ?? 898 89 9?9?9 ? 8 8??   ??   ??   ??   ??   ??   ??   ??   ??   ??   ??   ??   ??   ??   ??   ??     ? ?   ??   ??000??   000? ?@??@??@?0 00??            !???? ???!00`0` ?`?!    "  )0000000/88888g p p p p??0?000????????????????????8888    ??0?000???????? ???????? ????1??1c>`>`c>>cc>c>c>cc>c>`>>>c``>|||||||||||||||p pp 0??0??????????????@?@@??@??@@?@?@@??@ ??@ @ ?@?@@??@0??@0@0?@?@@??@??@@?@?@@?<C<<CC?@?@@?p0|pLp|p00LpL?@?@@?p pppp?@?@@??@?@@?P???@ ???@ ??@ ??P0?0@0?@0@??P ? @` ?@` @`?Q?@?@@?Q?<?C??<C??C?<R08|0D08D0D?8R x X X X X````_`)aaa"888!  !     `  ` ` ppp```~~b||||||| ?  ?8?88??'''`??   ??    ??   ??  p p`??   ??898 9 9 889?98? ? ? 8??   ??   ??   `??   ??   ??888?`        ! pp p`!   "000000000/88888    H ¨ ¨   T   ?? *? *? ? ??? UP ? * ? ª ª   UUU@   ?**? ? U ? * ? UT??*?* ???? ?UP?*?  U@? * *  ?  ? U ? * ?    U @   ? 3* #* # 3?  ? U T0? * 0?     U C    ? ?* ** * ??  ? *U T?? * ?? *    ªU C   ª??**** ?? ?*UT??*??*@ ªUC@ª?**U? *UT?U?*  UT ªUCUT ª??򪪠**򪪠**UUP?򪪠? ?*UUUT?UUP?*??*򪪪򪪪UUU@򪪪 UUUCUUU@?**U? *UT?U?*  UT CUT ?**UP? *?UP?*?**U? *?U?*?**U? *?U?*?**U? *?U?*?**U? *?U?*?**U? *?U?*?**U? *?U?*?**U? *?U?*?**U? *?U?*?**U? *?U?*?**U? *?U?*?**U? *?U?*?**U? *?U?* g?**U? *?U?*?**U? *?U?*??*?*?U??? *?U?*?**U? *?U?*?**U? *?U?*?**U? *?U?*?**U? *?U?*?? *? *?U?? ? *?U?*?**U? *?U ?*? * *U?  *?U ?*??*?*?U??? *?U ?*? * *UUU? *?UUU ?*?𪪪*𪪪*UUU?𪪪* ? UUU ? *? * * UU? * ? UU ? *? * * UU? * ? UU ? *?? *? *? U?? ?* ? U ? *0 U0  0 U 0          ? ? ? ? ?HPHPH??????????P@ @@ @   UUUUUUUUUUT UUTUUT UUT   ?UP??UP??UP?????UPU@ U@U@ U@   UPUPUPUP U U U    U    UPUPTUPUP<(U (  UT<U( <<< <  <( <U <  < < ?*UUP**PUUPUT??UUP*??????*??P?P?*??UUPP??*?*?*?*UU * U@UUUT?UU* ??? ? ?U@U@* ?UU U@? ???*P*UUPUUT?P*𪪨?????UUUU*𪪨?PUU????* * UUTUUT?* ??? ? ?UUTUUT* ? UUT? ???**UUUEUUT?*???ʪ?ʪ?UUU@UUU@*?ʪUUUO?ʪ???**UUUEUUT?*???ʪ?ʪ?UUU@UUU@*?ʪUUUO?ʪ???**UUUEUUTʪ?ʪ?UUU@UUU@*ʪUUUOʪ?**UUUEUUT ʪ?ʪ?UUU@UUU@*ʪUUOʪ?**UUUEUUT?*???ʠ?ʪ?UUU@UUU@*?ʠUO?ʠ???**UUUEUUT?ʪ?UUU@UUU@*UO?**UUUEUUT?ʪ?UUU@UUU@*@?**UUUEUUT?ʪ?UUU@UUU@*(?**UUUEUUS(?ʪ?UUU@UUU@*(  UUUEUU(ʪUUU@UUU@ )𪪪𪪪UUUEUT)ʪUUU@UUU@  UUEUC)ʪUU@UU@ ?𪪊?𪪊?UUEU??)ʪUU@UU@   UEP*ʠU@U@ 𪊏𪊏UEO*ʀU@U@ ? ? ?D? ?*@@ C+@@ +0    F  T    ?? ? UP? ?? ?? *? *  UUU@   ?U? ? * ? *UT ???UP???? ?*?* U@ ?  U ?   ? * ? * U C      ? 3 U T3? #  ? * 0 ? 0* 0 SU C £ S      ? ? SU T?? * S ? ** ? *? ?* ? USU C ª US  ª   ?? USUT??* US ?**? *??*?UUSUCªUUS ª?UUSUT?*UUS *?*??UUUSUCªUUUS ª  ??UUUSUUUT?򪪠?*򪪠UUUS ?**?*??*?USUUUC򪪪򪪪US ?USUT?*US *?*??USCUS   ?US?*US *?*???UC?*UC *?*????UT???*?UT? *?*???UC?*UC *?*????UUUT???*?UUUT? *?* ???UUUC?*UUUC *?* ?????UUT????**?*UUT? **???* ????UUC?*UUC *?* ????UT???*?UT? *?* ???UC? * UC *?* ?????T????**?*T?** ?? ?* ? ??? C ? * C * ? * ? ?NAXNuJCASTL1.DATGET_FILEMOZAIKNAMETROPENHEADERhABSCIMKEZDCIMCLOSE2NAMBUF1DNAMBUF2VNAMETR1NAMETR2NOABSNEW_ADDRHANDLEB   \  e