DOS25pCN @ hpHACz" <."<,xN:I(g)@N|"T2 ,H@22H@2""0<<2<a0<2<a0<2<a"K;|+TBm;|);|)383BmBmBm;|;|Cb,xNh,@AN)@&lp 2K$l$j"gJ<c  jPjj@j@jjj@0`K`zf2$l$j"@pf K:`<c   l"<"J09H<Pb <tRrQ(Q <QRE9fhCB,xNh @K+h&By;|`"T <.,xN.,xNvLNugraphics.library4<&<HA2"2@Q&<A2"2@QNu^(topaz.fontdos.library# NOVIRUS V3.30 WRITTEN BY NIC WILSON SOFTWARE 138D SOUTH STREET TOOWOOMBA QUEENSLAND 4350 AUSTRALIA. PLEASE DONT PIRATE THIS DISK. SEND $40.00 FOR YOUR COPY AND SUPPORT OZZIE PROGRAMMERS. LEFT MOUSE TO CONTINUE.......... VIRUS FREE BOOTBLOCKa̻)'zB!D) R!D!!A BP'zB!D) R!D!!A BP'\7KRZԖ-Ij[RԖ-Kij' #'d B!!B!!!B@"@~`.hp~`.hp'~͎oscc69mc7͹p@+`+@*.` ' HMD蒓D:&4MD:&tI%$'" JMD蒓D:&4MD:&tI%$'Fy{>'O>?|O'(' &7]( '  HMD蒓D:&4MD:&tI% 'PK:!ttAt:Dq' PK@%t.t] EЮt] ]]Dq'TF?OOS'O;wwyNw;'K:!ttAt:D'%KBV`,X`,``+X ~ p'1%KBVh-AZh-hh+@Z ~ q'@Cz{hG6{hhhF=ˀ ' Gs>s>#}ȀD ' F`,`,``#XD '` Xօ45hm CZ5hmhhke2PB@ ' P Xօ45hm CZ5hmhhkB@ '` o3z[޷y[޷o-{'@@ h  @@ '@@ H  @@ ' zV+aXJ°+++ XV z'0 zV+aXJ°+++ XV z'0%mkZ[[Zֵֺk[Zֶֺu' $ ! @H$ @@<'  @ <'_ڞ='=OIZ3=KIKOFZ '_ڞ='=OIjZ3=KIKOFZ ' as \\°+ X\°ۖ׶il.('Л_oϜ>sր'p_oϕ>sրCP3! !8hBÇ$! ! H[c n@P@P' _޻_w|': _޻_u|&T(( @P"(  P ' @ ~' @ q'+;_~M__׵~'z+;_H~M__~@(( @P2 (JJ T' 0 H @*'( 0 H @*'Aac׻|νoހ'Aac׻|ƽoހVF#'A8np]YE 4I1V1M.MA'`@A8np]YE 4I1V1M.MA!goO9ۆa,q)xWw5\:!8goO9ۆa,q)xWw5]7%8@1a@$@a( F>8@1a@$@a(  D1'xiCSCA0 0@РQc ڀ'0iCSCA0 0@РQc ځߵ'@@"R@@"Rx7 7!UG6HE)Ϭ \, \`((r0*sY ۿ zAuQp>@vUp>AUl[@$/ZQ@$( ƔWdƔWy@@&`)@`@)HF@&p  B2w@`@ @P8@@P/@ <@S@PB% @ Fb~ Fb@ ;B{DBbl~5@ Rt\5FRWy @  @5@)!@ T<)-T9&@ Ro_ T :a@ J t鄀J?@ &c0| @ ?ʇ"@?ʇ' p@@ 7r?"""E  Th@ 44lEh`44o x@` e(6A(5@ /8p/@p -M h H@_ tH`xtw@@x  PH@H߀! @? .8 |.#@|  (<* ՖUo*X@ X~P*@~  [-@ !\~!\)@~  #!!*<@ m`x~mg@~  h@ 'j4h4 Mp iڐ H? )Ul)UV T T* M@P`M@T ~ȂX>@X>@V^P O@`OCA+mR +` +k""'!0نat 1A"TR!1eQrjt'p!0نat 1A"TR!1eQrjo(K 0`  @ @P} 0` 5 .g @ @Pb'>s# ci1ה+ s+^^ '8>s# ci1ה+ s+^^ G'`63" Ah!" b*T\ }'`63" Ah!" b*T\ 'V@%i_^jkW{'V@%i_^kW{/X(@P PE@ P((}'@!,` @ @@@0 'P@!,` @ @@@0 |' _W׮w]z߮_'t_W׮w]z߮_L6 >m(@P PE@ P('@  @  '@  @  '2]ξߓp˦]~u~WMɸ-'2]ξߟr˦] ~u~WMɸ-% 1a(g BBЄ! BC6@ ~"@ ' =zOGFZԴgOFZ-'|A'  =zOGFZԴgOFZ-'|A' @am+ VamiasJ\ @'!$%aX+ XV °`+ XV VV75FV*z'`!$%aX+ XV °`+ XV VV*{'` ZֵֶukkZֶumkZ[v' HB@$ H@$  (' @ @ (p'  ChhkB- hkBօ59'@ ChhkB- hkBօ59'jfo-y򷙽o-oo3z[ͬ'$4 @ @@@?' $  @ @@@0'!HX`(+X `+XVh'cHXAh(+@Z h+@ZVh'{yGhF6tmhF85{@"'@܎##}r;#}Gs='@` #X0 `#XF"'VtC:A:::!t#'@VtK]E.]%t.#'@OSS?S?"rw;y;;w;tC:A::!t$'S@D&%&tMh'&uMDJI$0'ESBD&%&tMh'&uMDJI$0' '=?|O'?}O'Mo@$-'@D&%&tMh'&9ouMDJ@$"T]T%T]T'>67͹ls|7͹͎osc)W]WT]T') !AA BR(!A BBB'.) !AA BR(!A BBB%'1n--KijZԶ-KiKKRZ=''!!BB !BBB#.#.'(ZT)(*eIR(*e+*QRTʕ '!'@!@ @ :&jr~ V ~ V ')RY̳vt,gK2Ζt,-,fY:h'?}wt>Ot>?>}ϻ ' !,`&L` 0D@ 'c,`abX%,abXXXı0@ 'Xߎ~;R@ 'odc,lmbX%,mbXXXı6j]8Y (E@  '=F5QQjSU5QjjjT"p`=_?#p' 橫5yyjSW5yjjjT՚v'o;kɹw@'2$$@@$@H@'` sT0  @`@4 @HL'`aw޽*'U$sT8p@<ڇO*'eo??7>'@JA|| " | A>9'x@ @&& 0L`&  Lat,'x'|67͹m|7͹;oso'1D&& 0LB`&  LcAm@'~o'yht%$:GAN$:F::ItAAPL` <R0 #@T'm|ۛ1 \' 5rLB`@!<{1ݱAӡ@@V'y|�wt78>"{~{??('OrNtD3<9I5AS@!}@?~ ~T(Ā(!+ @ vK ?~J@?~    @ ?( ?+@ jP T  d@ P!"'?K7_W'<Ȃ:Itt#'At#$:GI 'b0T9H0 ` @ia&A'b00;o^A'*T8 pyC'7?'%M A>>Ab>Ab| 'pIbjT5FST5F55QjTHR0R'IbjT՚5fSV5f55yj^Oz'ߠ'H   $@ DFR'ThXı00,ec 0,e,,abX0'TX)0'hlXı66,eck6,e,,mbX 5.?|`" S+?'M,fY;:Yr̳gK:Yrt,EZP'>}ϻ}sO}st>`' 0DE`X&E```" C ,G ,']-*QRTʔT2EISJT2(*eJc'*'Y @ )0?| @@p'? @5@?2l~'@?2ll~ z@2l@ T@`r @zT?0l~@'x@?0ll~ _ۼШ0lP@'-%@dxϓ? %V-%?0l*Æ3~%V'@?0ll3~ &O 0l3$W $V '(8;8@&grϘ3? @x:;8? 0g~@'$@0٘ ?0g~ '0g8 0٘ @ r @0'? RN ?~R@0?~ n 0+i+;@7@  i?~;@?~  GY@ (`v?~(`p@?~ [r@ $@ `S@ *T@S?~*V@  @?~ "GpEPD@"Kp @ R@Kp ?,D\~R@ @?~ '@Qm@P@<@ 2N<@?~2N.@?~ 1߽ "@ A "@ H@ #?~#}@?~  ""(p@ ?pp?~@?~  -( @ U{ ?~U@?~ /@5 E@& E@H@ J?pH?~JJ@?~  /T@ %)4T?~%){i@?~ ~@ @. @ / @ Q ?~@&~@?~ *@53 @ `@ ?`?~~@?~ }<@; @@ ~Z?~@`@?~ v(@ (@- @/MU +d?~+@ A@?~ 5*@+@@ ?~?@?~@?~ +D@@!@ -?t@?~*-@?~ '@!$@! z@ ]tz?~$]>@0E+?~ "$?$\@ ?>\?~@?~ @@ @ 0@?~?`@@?~ *?K @#K ?~'Rt@?~  @ $*@/j!?~@?~ 1z\P[$A@/<K?~O @@?~ z@@(@#x (?~}@?~ ~T(Ā(!+ @ vK ?~J@?~    @ ?( ?+@ jP T  d@ P!2 D^JdP!Qt@ D=D 40@ Τ80T@ [@  _`MZ @ R@MZ R1p@ E1 @ "B81 ?"BS@?  ?M B+@ : >?: @? !H?3 [? ?!H .%@ aaH@  !?  !*,)t@ 9*Cht9*C@   "  "C @ @|  ES@   3-@ )5}-)50@  {u)Gt )@H@ BGpHBVp@ ם o@ Fg@ R|ZRea@ (_(R()ڐ"U ? $q@ C%S)@C?. @ @@@@ T d T @ 0 = Hb@@ ?b@?@? y# @?l" @C$@ FS$?F@? Zh$?@$"E@ ?F|E?Fk#9 @   (@ V .|W(V /X@  ?   j@ ipJjiuQ@ @@ %@ rDP}rDP @ ?>8WPB@ O xO w@ C)~ ZJ@ ~ tJ @~ Pt@ @ T(;@( )y@ B( <y0`B(!F@ $y0` S/@(/$@ (~$8p?{@8p =hP '@/_ D (t'0<`xD ?]x@@ <@x jDH} ߀DH P)^ @ >(p^ >|>/w@>| a  !  S, D@ S v D!% ?~S 1 @?~ |@B?{@B 5z@ m0z?~m0@?~ 2u1B@_1B@P@ U8( ?~ U8.@?~ +x ? 8@  <?~ a@?~ t?s"&-M  @ b ?~b@?~ _P { b(@ D#~?~D#;8@?~ #"%_@ ?%_?~x @?~ D D3*@ b#'%I*?~bU`@?~ WPcb @ C<??~C@@??~ =[ ? @ D0 p ?0~D0i@?0~ :8-0DnD0( D @ x D ?0~ $(\L@?0~ ' 0?  uH@0` ,`>uH@?0ϟ~,ZY@?0ϟ~ -bQ0ϟ/xQ,@'? W=?>0~ W@@?>0~ @>0  ! &@ `'? %P ?0%)@~%P @?0~ 12 0_ " P; @? 0z@?0~02@?0~ 3x@0?@0 )@ '? [ ~Z)?0~[ ;d@?0~ a= 0A? A C ;J!@ yg?&* ${J!??~$@??~ x! ? "H! " }h@pq? 'b}h?~'@?~ E$@E$H @gf ?~ O@?~  @  '+أCh?@@pf  @?~  Ѐ@?~ Vg?  nL@~yp ,nL? ~, р@? ~ K@ /@,) " @`Nϟ O|" ?0`~ O@?0`~ ? 0`@ (i]CK@J@ zJ?8~ z!s@?8~ @8 P@ P t@ 2 B(t?=~ B(@??=~ #= =S?S( (À@ ȓ 'pÀ?7ln0~' @@?7ln0~ 9u 7ln-` dL 0~> P @~   "0>?>? $D@ '<$D 0~p 8@~  o D 0p?_ Dp? 7@@ 'z@~3 0 P@~  P'@3 0?@.O3 0?@ %P'@~83 %P@~  '@83?_]83?P (*@  Z '|(*~ 360 Z<@~  &4'o 360?C?s  360?B vg @  '\g >~ 0< X@~/f  O'> 0<?@  0<?!xP@  'P P3F~3 336 )@~  r3F3 36?3 36?6 @ a @'|v q~s> @hI@~  ' qs>?*_  s>?*@2@ \v0$Ha2 3&Ʉ~ \)M@~  3&Ʉ?T?T1@ f ?D !pb~  f@~  @!pb?? @ 4t~ 4@~  V?? @ p~1=o P@~  !p@?@? 5P@ uP~ ?@)X@ t<WX~ WX@2wy~  S@?@?#@@ nb@~ n k@~  *@?h@?r@ Y0r~ Y0;t@@~  <`??;`?0@ zT@~ Bh@~  W3h8?#W?#0'_@ 0'_~ ;@~   ? 0 ? @ `~ ` 8@~  #XX??? ׂ@ (tZ@~ (t@~  ߺ?wB4gJ?t(@ )5" ~ )5"GJ@~  ?)#@?)"= @ = ~ 2@~  $ ?$ ?ɂ@ D(~D?I2@~  whw@D@ !Tx5M~!Vx/@~  R   x=@ @}8=~ @F`@~  |@5@ mw~m@~  Wdc@u  @ V@O ~V@@~  B 6wnB  B@S@? ;j<S~;j;@~ @Y@8 @ jPp ~jP@~  **4@ B$p~B$@~ x ' $˨@  ˨~ +t@~ [V@!r1w@R @ %xR ~%7@~  PDP  \@ " '\" 9@ uvUP P,` @ @@`@ h(@ ;݀p;݀W@ &D\684gv ,(' pp(p' _ <?9'@_ <?9'p/? 0!HX_ 8hcHX_ 8h'zp@"@-=@ "'V_ 0`т#'@V_79bX 0`ъ#'@ pp"/; }$'S@_8 8!JI$0'ESB_8 8!JI$0' pÇ8OM/@$-@ϿJ@$"'T\_8?T'%T\_8?T'>?p?)W]/W'T]?T'_8:yi?1'._?1%1=/'?1#_.#_.( !/@!~ _V ~ _V (h?/  @ _@ X_R@ oj]8/Y (E =@"p`=_@#p vw9~`@2@` rL`a޽*U$rڇO*e >@J9x@ @t,x'1DAm@~oyhAP#@T \ 5r@Vy|?(Or@!@ -?t@?~*-@?~ '@!$@! z@ ]tz <}۠o*X@ X~P*@~  [-@ !\~!\)@~  #!!*<@ m`x~mg@~  h@ 'j4h =~'j@~    /@ [~@~  'cQ? *@Ġ@ A>\Ġ~A@~  I_`$@Cp@ !r4Zp~ !rT@~>Cw8  @?!@?!'@ x'~ [@@~  ?W?T#@ Ot~ O@~  y0?\ ?`!@ EDb)~ ED5@~  ;5??w!?D* @ ŦX<*~ ŦX+@~  [2 ?_*?XH*@ EԠpj~ EԠ޺U@@~  +?@?+Fp@ @Fp~ @  @~  @? @@,]f?@ @  0S ~  \@~  zb ?  ? J@ cLzJ~   cL1p @~  ] ?}x@ ?L(_@ 7`'x_~3  7`@~  'f 3 ?Ad-ן ? 3 ?  R¥\@矉~ o'9\~`v> o@~   `v>?`v>?+_@ X'n_0~`;3 33 X؀@~  $6'!0`;3 33?C~qA`;3 3?@m@ 1T'm021:0~`3? 33 1T,b1}@~   v'@021:0`3? 33?!P@`3? 3?!P  (@ Q'qI(03p~3003 3 QQ@~  -sY' 03p3003 3?E 303 3?QP&9?@y̜  U'~9?s #~x3c  U>@@~  *s #x3c? @8x3c? @CDL@+CHg?~  ""(p@ ?pp?~@?~  ( @ U{ ?~U@?~ /@5 E@& E@H@ J?pH?~JJ@?~  /T@,D1 %)4T?~%){i@?~ ~@ @ / @ Q ?~@&~@?~ *@53 @ `@ ?`?~~@?~ }<@; @@ ~Z?~@`@?~ v-E(@ (@- @ +d?~+@ A@?~ 5*@+@@ ?~?@?~@?~ +D@@!@ -?t@?~*-@?~ '@!$@! z@ ]tz.FA?~$]>@?~ "$?$\@ ?>\?~@?~ @@ @ 0@?~?`@@?~ *?K @#K ?~'Rt@?~  @ $*@/j!/Gj<?~@?~ P[$A@/<K?~O @@?~ z@@(@#x (?~}@?~ ~T(Ā(!+ @ vK ?~J@?~    @ ?( ?+@ jP T 0HE$X d@ P!JdP!Qt@ D=D 40@ Τ80T@ [@  _`MZ @ R@MZ R1p@ E1 @ "B81 ?"BS@?  ?M B+@ : >?: @1ID+? !H? ?!H .%@ aaH@  !?  !*,)t@ 9*Cht9*C@   "  "C @ @|  ES@   3-@ )5}-)50@  {u)Gt )@H@ BGpHBVp@ ם  o@2J w Fg@ R|Z@Rea@ (_(R()ڐ~_ iڐ_ ~H,? )_Ul)_UV ,T T* M@_P`M@_T ~,ȂX>@_X>@_V^,P _?3Ks ]O@`_?OCA+,mR_?+`_?+k8,"?"'!_?t'p!_?o(pcK ,} ?b'_? 4LZ '8_? pG. }'Ͽ 'V@$_?{'V@$_?{/X p8}@!,P@!|' ^_?'t^_?Lpp- 57PѲ '2_x8a-'2_x8a-% ?px?, ~'" ' _8`< ү|A'  _8`< ү|A @>988 ,'???@'!$_`puH@?~,ZY@?~ -bQ/xQ,@ W=?~ W@@?~ @  ! &@ %P 8?p~%P @?~ 12 ?_ " ?P; @C 0z@8?p~02@$RB?~ 3x@??@?0 )@C [ ~Z)8?p~[ ;d@?~ a= ?A? ?A C;J!@{? ${J!8?p~$@?~ x!@ "H!@ "}h@{8 'b}h8?p~'%Sx2@?~ E@ $@E@ $H@?7{8 8?p~ O@?~ @  @@  '?@@󿿿ϻ{8 @8?p~ Ѐ@?~ Vg N'? N' 'nL@ {&TZes8 ,nL8?p~,р@?~ K@H @L $ $ /@H @L $ $ ,)'" @{8 O|" 8?p~ O@?~ ? ȏHNH$' @ ȏHNH$' @'J@;{8c zJ8?p~ z!s@?~ @H$  P@'UbH$  P 't@{s B(t8?p~ B(@?~ #='@@H``d"S'@@H``d"S('(À@{f1 'pÀ8?p~'@@?~ 9uf1?|f1 @@{ @5@8?p~@?(V*~ z@@ T@{ @zT8?p~@x@?~ _ۼШP@-%@{  %V-%8?p~%V@?~ &O  $W  $V (8;8@ @x:;88?p~@$@?~ ')WNdl:8 @ r @ RN ?~R@?~ n +i@  i?~;@?~  GY@ (`v?~(`p@?~ [r@ $@*B `S@ *T@S?~*V@  @?~ "GpEPD@"Kp @ R@Kp ?~R@ @?~ '@Qm@P@<@ 2N<@?~2N.@?~ 1߽ "@ A "@ H@ #?~#}@Yij@~ g>   0`*_' 0Ϙ`g>*@2@ \v2p~\)M@~  T T1@ f ?Dp~ f@~  @  @ 4tp~4@Z{4~ ` V` @ pp~P@~  !p@@ 5P@ uP~@)X@ t<WX~WX@~  S@@#@@ nb@~n k@~  *@h@r@ Y0r~Y0;t@@~  <`?;`0@\!N zT@~Bh@~  W#W#0'_@ 0'_~;@~    0  @ `~` 8@~  #XX? ׂ@ (tZ@~(t@~  ]c <ߺwBt(@ )5" ~)5"GJ@~  )#@)"= @ = ~2@~  $ $ ɂ@ D(~D?I2@~  whw@D@^ql  !Tx~!Vx/@~  R   x=@ @}8=~ @F`@~  |@5@ mw~m@~  Wdc@u  @ V@O ~V@@~  B _ {XB  B@S@? ;j<S~;j;@~ @Y@8 @ jPp ~jP@~  **4@ B$p~B$@~ x ' $˨@  ˨~ +t@~ [V@`f*w@R @ %xR ~%7@~  PDP  \@ " '\" 9@ uvUP P,` @ @@`@ h(@ ;݀p;݀W@ &D\aV ? $q@ C%S)@C?. @ @@@@ T d T @ 0 = Hb@@ ?b@?@? y# @?l" @C$@ FS$?F@? Zh$?@$"E@ ?F|b14RvE?Fk@   (@ V .|W(V /X@  ?   j@ ipJjiuQ@ @@ %@ rDP}rDP @ ?>8WPB@ O xO w@ C)~ ZJ@ ~ tJ @~ Pt@ @ T(;@( )y@ B( <y0`BMC0(!F@0` S/@(/$@ (~$8p?{@8p =hP '@/_ D (t'0<`xD ?]x@@ <@x jDH} ߀DH P)^ @ >(p^ >|>/w@>| a  !  S, D@  dBw@`@ @P8@@P/@ <@S@PB% @ Fb~ Fb@ ;B{DBbl~5@ Rt\5FRWy @  @5@)!@ T<)-T9&@ Ro_ T :a@ J t鄀J?@ &c0| @ ?ʇ"@?ʇ' p@@ 7r?"""E eSh@ 44lEh`44o x@` e(6A(5@ /8p/@p -M h H@_ tH`xtw@@x  PH@H߀! @? .8 |.#@|  (<* fҠo*X@ X~P*@~  [-@ !\~!\)@~  #!!*<@ m`x~mg@~  h@ 'j4h gI~'j@~    /@ [~@~  'cQ? *@Ġ@ A>\Ġ~A@~  I_`$@Cp@ !r4Zp~!rT@~  @!hP@!'@ x'~[@@~  WT#@ Ot~O@~  y0\ `!@ EDb)~ED5@~  ;5w!D* @ ŦX<*~i1pSŦX+@~  [2 _*XH*@ EԠpj~EԠ޺U@@~  +@+Fp@ @Fp~@  @~  @ @@ @  0S ~ \@~  zb  jkb  J@ cLzJ~ cL1p @~  ]}x@L(_@ 7`x_~7`@~  f  ?   R¥\@ o9\~o@~   +_@ Xn_p~kWzX؀@~  $6!C~qA@m@ 1Tmp~1T}@~   v@!P@!P ' (@00  QqI(p~QQ@~  -sY E QP'&9?@80   U~9?p~ U>@@lX}~   *"@ @8"@  @C'DL@8~0  dLp~P @~    ""@'"@  '$D@8?o00ό <$Dp~8@~   o D"'@_ D"'@  '7@@8wmeؿ? z@p~P@~ '8 P@"N`'@"N`'8'@8x_0 %Pp~%P@~  "! "@H@_]'"@H@@ "!P' (*@8p?߀0  Z |(*p~Z<@~ '! &4o"HOC?Xs"HO'!B 'vg @8p90 \g p~ X@~ $! O"H '@"HH $!!'xP@ p0ό  P Pp~)@~  b rb@ b@  b'6 @0Ϙ` @|v p~@hI;oY `QP@   @ @ 'X  5 @%R@ 'ogkMܟϥol[pj]'8ok_o[m_uY (Ee @X"@ '=R (%I E+"0A"p'`=_~?Qk><#p' S *Kl TE;b}֏v'o~3޿w@'2@!!@@'` |8Bq( T(IEn&L`a<p1 \x ?|޽*'U$}xFs ^N.IEn.ڇO*'e׿>>'@J#(@ R Q@ R9'x@ @@pDAi@X 8#t,'x'+݂?{'1DЏpCyDQ}`m#Am@'~kop{}QW~ڟ'yh""\C%zmAAP'  R0 #@T'}1 \' 5r$3@!<{1ݱAӡ@@V'y|=Jncwt78>"{~{??('Or r.D3<9I5AS@!~ g@!?d@!  z@ $]Ttz?~$]~@?~ "$$\@ C,D>\?~C,D@?~ Q@}@D @ :0@?~:`@@?~ rR'ThXı00,ec 0,e,,abX0'TX)0'hlXı66,eck6,e,,mbX 5.?|`" S+?'M,fY;:Yr̳gK:Yrt,EZP'>}ϻ}sO}st>`' 0DE`X&E```" C ,G ,']-*QRTʔT2EISJT2(*eJc'*'Y @ saY)'zB!D) R!D!!A BP'zB!D) R!D!!A BP'\7KRZԖ-Ij[RԖ-Kij' #'d B!!B!!!B@"@~`.hp~`.hp'~͎oscc69mc7͹p@+`+@*.` ' HMD蒓D:&4MD:&tI%$'" JMD蒓D:&4MD:&tI%$'Fy{>'O>?|O'(' &7t]' '  HMD蒓D:&4MD:&tI% 'PK:!ttAt:Dq' PK@%t.t] EЮt] ]]Dq'TF?OOS'O;wwyNw;'K:!ttAt:D'%KBV`,X`,``+X ~ p'1%KBVh-AZh-hh+@Z ~ q'@Cz{hG6{hhhF=ˀ ' Gs>s>#}ȀD ' F`,`,``#XD '` Xօ45hm CZ5hmhhkue1B@ ' P Xօ45hm CZ5hmhhkB@ '` o3z[޷y[޷o-{'@@ h  @@ '@@ H  @@ ' zV+aXJ°+++ XV z'0 zV+aXJ°+++ XV z'0%mkZ[[Zֵֺk[Zֶֺu' $ ! @H$ @@<'  @ <'_ڞ='=OIZ3=KIKOFZ '_ڞ='=OIjZ3=KIKOFZ ' as \\°+ X\°vۖuil.('Л_oϜ>sր'p_oϕ>sրCP3! !8hBÇ$! ! H[c n@P@P' _޻_w|': _޻_u|&T(( @P"(  P ' @ ~' @ q'+;_~M__׵~'z+;_wH~M__~@(( @P2 (JJ T' 0 H @*'( 0 H @*'Aac׻|νoހ'Aac׻|ƽoހVF#'A8np]YE 4I1V1M.MA'`@A8np]YE 4I1V1M.MA!goO9ۆa,q)xWw5\:!8goO9ۆa,q)xWw5]7%8@1a@$@a( F>8@1a@$@a( c D1'xiCSCA0 0@РQc ڀ'0iCSCA0 0@РQc ځߵ'@@"R@@"Rx7 7!UG6HE)Ϭ \, \`((r0*sY ۿ zAuQp>@vUp>AUl[@$/ZQ@$( ƔWdƔWy@@&`)@`@)HF@&pq"'?K7_W'<Ȃ:Itt#'At#$:GI 'b0T9H0 ` @ia&A'b00;o^A'*T8 pyC'7?'%M A>>Ab>Ab| 'pIbjT5FST5F55QjTHR0R'IbjT՚5fSV5f55yj^Oz'ߠ'H   $@ D0zj} *- t@?~*- @?~ g@!?d@!  z@ $]Ttz?~$]~@?~ "$$\@ C,D>\?~C,D@?~ Q@}@D @ :0@?~:`@@?~ 1{z-Y  K @ K ?~'Rt@?~  @@ @d*@ Pj!?~P@?~ P$A@ Q<K?~Q @@?~ /zA}@A@(@ pPx (?~pP}@?~ lz~T(@2|,,WĀ(@P!+ @ RVvK ?~ RVJ@?~ /     @ #( #?+@ jP T  d@ P!JdP!Qt@ D=D 40@ 80T@ [@  _`MZ @3}_ R@MZ R1p@ E1 @ "B81 ?"BS@?  ?M B+@ : >?: @? !H? ?!H .%@ aaH@  !?  !*,)t@ 9*Cht9*C@   "  "C4~: @ @|  ES@   3-@ )5}-)50@  {u)Gt )@H@ BGpHBVp@ ם o@ Fg@ R|ZRea@ (_(R()ڐ iڐ H? )Ul)UV T T* M@P`M@T ~ȂX>@X>@V^5~9P O@`OCA+mR +` +k""!!tp!!o(K } b'??a?) '8"!( G    }    'V@%aGw\]{'V@%   a@a@A@{/X}'@ 6 X,   A@@A*'P@    A@@A*|" VAP Z/ X'tVAPZ(XL8 `pa`c@ PHP "9P er` hHcc@P '2#']u888ma-'2"& ]up a-% |8`8 888ǡǰ @@( ~'"} :8889@ ' 7^xS\O88|A'  @R \@p|A' @|D8888Cǡǀ  B@'|:8B88>@'!)+'#?'\p|p\p"*z'`!) @`@j*{`~xqAqqq,.##"G]v  @(' |q qAqqpCG(p' kߎ31c3 s?G" 8T ȀCy;5 9B$'S@88҄0$ DEAJI$0'ESB8 0D@#JI$0' U_O<?>?O'M(~0| rv(Cp@$-'@ D888NJ@$"'TTe`( 4I@ "T'%TT"4I@( J!T'>BU|#J?)'WWe6b~x0 {W'TT%!84IG'< T'7S0KJ2 59'.:n=6x7S0KJ2 59%'1sB\)qN?f9/1U}=?W'7S0KJ2 59#.P X.#.PX.'(*^PΘuCj*Cb2j !@!*@ H~ ` @V ~ @ @V '-S6sڧJ"Ji9k㒽Fh? ' @%c?  uH@ ,`>uH@?~,ZY@?~ -bQ/xQ,@ W=?~ W@@?~ @  ! &@ %P ?~%P @?~ 12 _ " P; @ 0z@?&)wW~02@?~ 3x@?@0 )@ [ ~Z)x?~[ ;d@ ?~ a= A? A C;J!@  ${J!x? ~$@ ?~ x! "H! "}h@ 'b}hx? ~'@ ??~ 'E?$@E$H'@ x? >?~ O@ ??~ '?>? @ '?@@ @x? ?~  Ѐ@ ??~ Vg??? 'nL@(䨰 ,nLx?  p~, р@ 0pq?~ K'@0ppq p/'@7,)'" @}ݱx O|" x? D ?~ O @ 8 1?~ '? 8 1D ?@' }ݱX@'J@ٷ zJx? ~ z!s @ #?)(A~ '@# P@ɱ P 't@۷ B(tx? ~ B(@ #y?~ #='#yS'S('(À@߷ 'pÀx? ?~'@@ ##3?~ 9u##3??|*+hi '@@ߟߝ߿7 @5@x?  ~@ 0?~ z'@0 '@ߟߝ0' T@8890g? @zTx? 0g?~@x@ 889?~ _ۼ'Ш8890g?P889@-%@ %V-%x? ~%V@ ? ~+A &O $W $V (8;8@ @x:;8x? ~@$@ ?~ '8 @ r @ RN x?~R@ ?~ n +i@  i?~;@?~  G,qY@ (`v?~(`p@?~ [r@ $@ `S@ *T@S?~*V@  @?~ "GpEPD@"Kp @ R@Kp ?~R@ @?~ '@Qm@P@<@ 2N<@-h?~2N.@?~ 1߽ "@ A "@ H@ #?~#}@?~  ""(p@ 0pp?~0@?~ ?0 @ U{ ?~U@?~ /K E.W E@H@ J;pH?~J;J@?~ `;9T@ %)4T?~%){i@?~ ~@ @ / @ SQ ?~S&~@?~ *^ R `@ 4`?~4~/yȇ@?~ }|@7 @4@ X~Z?~X`@?~ v(_ (X- @ +P d?~+P A@?~ 5_P@ 8~?@?~8@?~ +D@?@8!@;0@ zT@~Bh@~ ? W#W#0'_@ 0'_~;@~    0  @ `~` 8@~  #XX? ׂ@ (tZ@~+(t@~  ߺwBt(@ )5" ~)5"GJ@~  )#@)"= @ = ~2@~  $ $ ɂ@ D(~D?I2@~  whw@jD@ !Tx~!Vx/@~  R   x=@ @}8=~ @F`@~  |@5@ mw~m@~  Wdc@u  @ V@O ~V@@~  B B  B@S@? ;j<S~;j;@~ @Y@8 @ jPp ~jP@~  **4@ B$p~B$@~ x ' $˨@  ˨~Y +t@~ [V@w@R @ %xR ~%7@~  PDP  \@ " '\" 9@ uvUP P,` @ @@`@ h(@ ;݀pNx;݀W@ &D\ ? $q@ C%S)@C?. @ @@@@ T d T @ 0 = Hb@@ ?b@?@? y# @?l" @C$@ FS$?F@? Zh$? p@$"E@ ?F|E?Fk@   (@ V .|W(V /X@  ?   j@ ipJjiuQ@ @@ %@ rDP}rDP @ ?>8WPB@ O xO w@ C)~ ZJ@ ~ tJ @~ Pt@ @ T(;@( )y@!j> B( <y0`B(!F@0` S/@(/$@ (~$8p?{@8p =hP '@/_ D (t'0<`xD ?]x@@ <@x jDH} ߀DH P)^ @ >(p^ >|>/w@>| a  ! "Ui  S, D@ S v D?~S 1 @?~ |@B?{@B 5z@ m0z?~m0@?~ 2u1B@_1B@P@ U8( ?~ U8.@?~ +x ? 8@  <?~ a@#E?~ t?s  @ b ?~b@?~ _P { b(@ D#~?~D#;8@?~ #"%_@ ?%_?~x @?~ D D3*@$!~ b*?~bU`@?~ WPcb @ C<?~C@@?~ =[  @ D0 p ?~D0i@?~ :8-DnD0( D @ x D ?~ L@?~ ' !aT#@  Ot~O@~  y0\ `!@  EDb)~ ED5@~ 8 ;5 w!D* @  ŦX<*~ŦX+@~  [2 3_*XH*@ EԠpj~EԠ޺U@@~  +@+Fp@ @Fp~@  @~ 0 @ @@ @  0S ~ \I@~  zb    J@ cLzJ~ cL1p @~  ]}x@L(_@ 7`x_~7`@~  f  ?   R¥\@ UH o9\~`0o@~    +_@ > 0 Xn_ ~X؀@~ > 0 $6!C~qA @m@ a 5UH 1Tm ~xp1T}@~ 8  v@ xa|!P@ !P  G(@ p?0 QqI( ~@QQ@~ p8 -sY  E QP&9?@8 7_UH  U~9? 8~x` U>@@~ ; *8x8l󿪷 @8 @CDL@ 0 'dL 8!~@@@P @~   "cW'8!p>?o? '$D@x> <]H '<$D p@~xp8@~ @ o Dp@x|_ Dcp6 '7@@oogw 16 'z@  Dv~P@~ ?> P'@ Dw'@cc`3'R @oovC 1 %P' ? F~p%P@~ C9# '? F|!_]'cc`10#P' (*@oow>1 Z |(* ? C~ x `?Z<@~ ?y &4'o? C~?C?sc `141B vg @ow '\g ?@D~0g0 X@~?l ? O'?@D0g0@>?`3!xP@?O&f  P P ?O&f~)@~  r?O&f6 @ @'|v ~@hI@~    *_ C*@2@ \v2۠ ~\)M@~  p T>T1@ f ?D~ f@~  0 @ @ 4t~4@~  ` V @  ptU~wP@~   !p@w@ 5P@  uP~~wox@)X@  t<WX~~wWX@~   S@~w@#@@  nb@~n k@~  *@h@r@ Y0r~Y0;t@@~  <`?;`v =+'E?9_??̅ '_߀ ߂#'P 8B? @ ᢇᐇ` 'G`x@``/H'@`x@@B /H'4_x~`~'?x?@.' `~ @x|xÀ`/-'~`B`xp'|@|@ R( '/~ B` @R(0'|rx |NC␐'@x~?@? .'A|B``p | !"@ ]!OOl x/'  @x@8>l.' C)Ēx!<@R'BB) @S' p<=/Cˬz'Zp^<'B)x88'ɠ%U#>_"&b{ P'K%U@>@bA Q'@bt=A=NI`ys{\h~;@' @ ` '88@pp <8 '<$þ$#ūu>߄S uW'i@$ Ū P\uW#:A=: a!qa s <`!: w'@  @?'@9 8pt8!8@0'Xa7u|T FW/OQ'0X4u@ T FP(%HQ'`qC0~X<  X$K⹨~ar @ @*_'Htp8 C ~at*P'w|1SzO_ Og@ '(8p@1P P H@!'${pz8b"fp0pxe'  @@ <pp: @t@pq#"B/ou{:^O __j"HB(l`u@OPP |!`pZ! =@7 @ @ P'@ `@ tA~j8_' D/SK<x~Iҏi'` D SK`I 42p@=A> D  `  'Ѐ D ta D8H <'aB?|< '^'_'r`A ~@ @@>@Pp`ytJ'@@j@ "'@|jB tAz"'`%cF  \'` 'jacF \ _xx.@'_yŘ@p!> /p P`]a> /p P`] << @()@ @ ()G <=@ '  SڂR0@P" B'` SڂR0@P" BRR"'RR" #$ ߀ c  ,4~,4i~ Qp>@vUp>AUl[@$/ZQ@$( ƔWdƔWy@@&`)@`@)HF@&pw@`@ @P8@@P/@ <@S@PB% @ Fb~ Fb@ ;B{DBbl~5@ Rt\5F BRWy @  @5@)!@ T<)-T9&@ Ro_ T :a@ J t鄀J?@ &c0| @ ?ʇ"@?ʇ' p@@ 7r?"""Eh@ 44lEh`44o x@` e(6A(5@ /8p/@p -M {a h H@_ tH`xtw@@x  PH@H߀! @? .8 |.#@|  (<*o*X@ X~P*@~  [-@ "lZt !\~!\)@~  #!!*<@ m`x~mg@~  h@ 'j4h~'j@~    /@ [~@~  'cQY? *@Ġ@ A>\Ġ~A@~  I_`$@Cp@ !r4Zp~!rT@~  @!@!'@? x'~[@@~  Wgoose a drop shadow effect for your objects to give them the appearance of depth. NONE LIGHT MEDIUM HEAVY COLOR... OUTLINE Allows you to choose outline display for your objects to enhance their appearance. NONE 178 SINGLE DOUBLE TRIPLE COLOR SHAPE Allows you to choose the shape of the fill for your object. CIRCLE/ELLIPSE BOX HORIZ. LINE VERT. LINE DIAG. LINE 1 DIAG. LINE 2 VISIBLE Objects can be visible or hidden and then made visible by script control. YES NO SET CUSTOM These menu items generate messages SET.CUSTOM1 through SET.CUSTOM4 for which you can write handlers in your stack script to set multiple property 179 adjustments. If you do not write special handlers they have no effect. 1 2 3 4 180 CONTENTS VALUE Every object can have a value. This menu's items allow you to choose if that value is to be shown, is editable by the user and in wkChat color it appears. HIDE SHOW EDIT LOCK COLOR VALUE STYLE Allows you to enhance the display of your objects value. PLAIN BOLD ITALIC UNDERLINE DROP SHADOW SHADOW COLOR 181 MULTILINE If YES is chosen here then the value is word-wrapped to fit and can be scrolled. YES NO HYPERTEXT... Allows you to manipulate the HYPERTEXT property of your object. This is applicable only to multi-line objects. See the MANUAL staؼck for more details. SCROLLER Allows you to enable or disable scrolling arrows for multi-line objects. HIDE SHOW HORIZONTAL VERTICAL COLOR... 182 Index Arrow Key Down 20 Up 20 BBS Phone Number 22 Browser Distribution of 23 Expressions Operators 35 Objects Building Blocks 17 Types Of 17 Pathways Setting 14 Stacks ControlRoom 12 Loading Others 14 Manual 15 UltraCard Features 5 What can it do? 2 What is it?ki 1 When to use 4 UltraTalk Data Values 25 Expressions 35 Function Handlers 34 Functions 116 ABS 116 AVAILABLE.CHIP.MEMORY 139 AVAILABLE.MEMORY 138 BDROP.ID 137 183 CHAR.TO.NUM 117 DATE 125 DAY 126 DAY.OF.THE.WEEK 127 ITEM 133 LEFT 118 LENGTH 119 LINE 132 MONTH 128 NEXT.BACKDROP.OBJECT 142 NEXT.FRAME.OBJECT 140 NUM.TO.CHAR 120 OBJECT 134 PARM 121 PARMCOUNT 123 RIGHT 124 STILLDOWN 135 TIME 130 VERSION 136 WORD 131 YEAR 129 Global Variables 144 Message Handlers 31 Message Hierarchy 29 Message Transformation 30 Messages 29, 162 Properties 156 Statement Handlers 33 Statements ADD 72 ANSWER 94 AREXX 96 ASK.VALUE 95 BREAK 114 CHANGE 55 CHOOSE 56 CLEAR 90 CLI 63 CLOSE.FILE 104 184 CONTINUE 115 COPY 88 CURSOR 107 CUT 87 CYCLE.COLOR 41 DELAY 93 DELETE.FILE 105 DIVIDE 75 DO.MENU 108 ELSE 67 ENDFOR 111 ENDIF 67 ENDLOOP 112 ENTER.MODIFY 84 EXIT.MODIFY 85 FIND 99 FOR 111 GET 76 GET.FILE.NAME 66 GLOBAL 71 GOTO 70 GRAPHIC.FILL 45 IF 67 JUMP 39 LOAD.SOUND 57 LOCK.SCREEN 77 LOOP 112 MENUS 47 MOVE 110 MOVE.SCREEN 53 MULTIPLY 74 NEW.OBJECT 86 OPEN.FILE 100 PASS 79 PASTE 89 PLAY 61 POP 80 PUSH 81 PUT 40 READ.FILE 102 185 RETURN 82 SAVE.BRUSH 44 SAY 38 SCREEN 98 SCREEN.TITLE 54 SELECT.OBJECT 92 SEND 83 SERIAL.CLOSE 49 SERIAL.FLUSH 52 SERIAL.OPEN 48 SERIAL.READ 50lN SERIAL.WRITE 51 SET 68 SET.COLOR 91 SET.SCRIPT 46 SHOW.MSG 109 SLEEP 42 SORT 106 STOP.SOUND 60 SUBTRACT 73 UNLOAD.SOUND 58 UNLOCK.SCREEN 78 WAIT 65 WAIT.SOUND 58 WAKE.UP 43 WHILE 113 WORKBENCH 64 WRITE.FILE 103 Syntax 24 Syntax Description 37 Variables Global 32 Local 32 186 ============================================================================ DOCS PROVIDED BY -+*+-THE SOUTHERN STAR-+*+- for M.A.A.D. yMI9 ============================================================================ bject location/size after a move or sizing operation. 173 SCRIPT Allows you to edit the selected script. STACK BACKDROP FRAME IFF Allows you to import and export the screen from/to IFF files. If you hold down the SHIFT key when selecting EXPORT or PAINT it will include the objects in the IFF file. If you don't hold down the shift keyu`'?x^E|;Y_?wNVP',+AAXO$AUɈ)*'B`!PH"P A >A'Bc[c~?ځA'jR@ 46{n? C*>'inwwm?z/Ʌ|[k'ĖcGA}ȕ(56~~# @'p@@",`%A+(H WJ02'pCn{zR'P tv#=h`}/jYFj-WJ2\'.f5oz'0$ʐHV(A#iAB'`<(?GQGp??T"@ A@ a@GP'p:ހ[x|U`"C:ހ@W'` 5!J '\~??π?߇#@(BD0   $''Px<@|0xxk =+'gP@@ @P@INT Allows you to pick a single frame, a whole stack or to send a message to your scripts to print a report. Refer to the GLOBAL variables section for the use of the HEIGHT.ADJUST and WIDTH.ADJUST variables and how they affect printing SCREEN and STACK. The Report sub-item simply sends the message PRINT.REPORT for which you must write a handler. SCREEN STACK REPORT OPEN WORKBENCH Allows you to open the workbench screen if you closed it to save memory6X. 169 CLOSE WORKBENCH Allows you to close the workbench screen to save CHIP memory. If you have ANY open windows other than workbench windows, such as a CLI window or a clock then the workbench will not close. ABOUT ULTRACARD Tells you the version number of your copy of UltraCard. ICONIFY Shrinks the program down to an icon on the workbench screen and releases all the CHIP memory used for the screen. Handy when you are using a paint program in a 512K TAgnus machine. QUIT Leaves UltraCard. EDIT FRAME Allows you to add, delete and duplicate frames. ADD Adds new frame using the current backdrop. ADD NEW BD Adds new frame and creates a new, empty (blank) backdrop. 170 DELETE Deletes the currently visible frame. Asks for confirmation. DUPLICATE Make a duplicate of the currently visible frame. After this menu selection you are positioned on the NEW frame. INFO Gives information abouc{At the item selected. STACK BACKDROP FRAME MODIFY... Allows you to enter modify mode. You may also press F2. GO HELP Pushes the location of the currently visible frame and jumps to the Help stack. BACK Navigates back to the last visible frame. Could be in another stack. 171 JUMP Allows navigation within the current stack. FIRST NEXT PREV LAST RECENT Shows the list of the previous 25 unique frames you have visited. You may choose $from the list for a direct jump. FIND Allows you to find a string in the value portion of any object. CHAT Opens the CHAT window that allows you to type a single UltraTalk command. 172 Modify Mode Menus EDIT NEW OBJECT Allows you to create a new object in the layer specified. FRAME (shortcut Esc) BACKDROP (shortcut Shift/Esc) CUT Copies selected object to clipboard and removes object from screen. COPY Copies selected o2Xbject to clipboard. PASTE Copies clipboard to screen. CLEAR Removes selected object, no UNDO! UNDO Restores object location/size after a move or sizing operation. 173 SCRIPT Allows you to edit the selected script. STACK BACKDROP FRAME IFF Allows you to import and export the screen from/to IFF files. If you hold down the SHIFT key when selecting EXPORT or PAINT it will include the objects in the IFF file. If you don't hold down the shift keyJ only the backdrop picture will be included. IMPORT EXPORT PAINT Exports current backdrop to an IFF file and runs the program specified in the global variable "PAINT". See the message section about RUN.PAINT. COPY FRAME Copies the current frame to a special "frame clipboard". Note: This does not copy the backdrop picture or the backdrop objects! 174 PASTE FRAME Copy the contents of the "frame clipboard" into the current frame. Replaces all fÐ̔rame objects. OBJECT IN Allows you to tell what layer the currently selected object resides in. BDROP FRAME SELECT BY NAME Allows you to select an object by name even if the object is not visible or is off screen. BDROP FRAME BROWSE Allows you to return to BROWSE mode. You can also press F1. PROPERTIES SCRIPT Allows you to edit the script of the selected object. INFO Shows information about the selected object, color, style, location, etc. q) 175 HILITE Allows you to choose how the visible feedback is shown when the user clicks on your object. NONE INVERT OUTLINE NAME Allows you to alter how, where, and in what font/color the object name is shown. SHOW AT LEFT SHOW AT TOP SHOW AT BOTTOM SHOW INSIDE HIDE CHANGE... FONT COLOR NAME STYLE Allows you to make your name show in a type style. PLAIN 176 BOLD ITALIC UNDERLINE DROP SHADOW SHADOW COLOR REND\nER Allows you to have your objects transparent or solid. A transparent graphic object is graphically and LOGICALLY transparent wherever it contains pixels of color 0. This means that you can create irregularly shaped objects and layer them. CLEAR SOLID FILL Objects can be filled with solid colors, graphic bits, proportional sliders, or in UltraCard Plus an external fill such as an animation. COLOR GRAPHIC Choosing this not only selects the graphic fill property but also allows you to extract the graphic image from an IFF picture. When you have 177 the picture and the cursor changes to the cross-hairs click and drag a box around the area you wish to use as a graphic fill. When you release the mouse button the picture will disappear and the stack backdrop will reappear with the object filled in as selected. HORIZ. SLIDER VERT. SLIDER EXTERNAL COLOR... DROP SHADOW Allows you to chels. If you need to do anything, such as declare global variables or initialize objects, etc. you should put that code in the entry and exit handlers for the appropriate level. Stack.Entry - when stack is opened Stack.Exit - at very end when stack is closed BackDrop.Entry - when backdrop is opened BackDrop.Exit - when backdrop is closed Frame.Entry - when frame is opened Frame.Exit - when frame is closed Object Messages The following messages are generated by a mouse click insiȨIZde an object. If you do not supply ARROW1 and ARROW2 handlers the built-in handlers (that scroll at machine code speed) are used. SELECT.DOWN - when mouse is clicked in object SELECT.UP - when mouse is released in object ARROW1 - when up/left arrow is clicked ARROW2 - when down/right arrow is clicked 162 Mouse Messages The following messages are generated by a mouse click outside an object. CLICK.DOWN - when mouse is clicked down but not in an object CLICK.UP - when mouse is released but not in an object Timer Messages These messages are sent as the UltraCard program timer expires and counts the various time amounts. If there are no handlers for these messages they are ignored. QUARTER.SECOND.TICK - every 1/4 second SECOND.TICK - every 1 second MINUTE.TICK - every 60 seconds HOUR.TICK - every 3600 seconds DAY.TICK - every 24 hours Intercept Messages The following messages are sent when a menu item is selected that means the user wants ʮto run a specialized external program, paint or edit. The data that the program is to operate on is already prepared. There are default handlers built-in to the program that 163 start the programs configured by the preferences frame in the ControlRoom stack. However, as in the case of DigiPaint, some paint programs cannot import/export non-HAM images. So by coding a handler for these messages you can preprocess or postprocess the data sent to and from the external program. jM RUN.EDIT - when the External Editor menu item is chosen in the UltraTalk editor. The data is already written to the file: "T:ULTRA.EDIT". RUN.PAINT - the IFF/Paint menu item is chosen in MODIFY mode. The backdrop is already written to the file: "T:ULTRAPIC". Misc. PRINT.REPORT - this is always generated by the user choosing the Print/Report menu item because that is all the menu item does. You should code a handler for this message at the stack script1L level to do a custom report. Keyboard Messages KEY.PRESS - when any key is pressed that is not a special key. Special keys generate their own messages (see below). The ASCII character is in the global variable THE.KEY and the raw key code value is in RAW.KEY, as a number. ESCAPE UP.ARROW ) DOWN.ARROW ) KEYBOARD ARROW KEYS RIGHT.ARROW ) LEFT.ARROW ) KEY.F1 KEY.F2 KEY.F3 KEY.F4 KEY.F5 KEY.F6 KEY.F7 KEY.F8 KEY.F9 KEY.F10 KEY.HELP TAB.KEY - only generated when data e͛<3ntry is operating, otherwise the tab key generates a regular KEY.PRESS message. RETURN.KEY - like tab key, only generated when RETURN key is pressed during data entry. 165 Creating A New Stack To create your own stacks you should take the following steps: 1. Select New Stack from the Project menu. 2. Select the resolution and number of colors from the requester that appears. 3. Wait for the requester that tells you that your stack isUU ready to go. 4. Click OK. 5. To begin adding objects and pictures to your stack you must enter Modify mode. Pick Modify... from the Edit menu or press F2. 6. The most often thing that is done first is to import an IFF picture as a backdrop. If you choose a picture that is the wrong resolution or depth, UltraCard will beep and then tell you what resolution you must use to import the picture. 7. To create object, pick from the New item under the Edit menu. ϑ{Note that they have keyboard shortcuts based upon the Esc key. 8. To add additional frames using the same backdrop picture and fields you must return to Browse mode (Press F1) and select Add 166 from the Frame item under the Edit menu. 9. To add additional frames with a new backdrop picture and fields you must return to Browse mode and select Add New BD from the Frame item under the Edit menu. 10. Use the items under the Info menu to help you keep track jof your backdrops and frames. 167 UltraCard Menu Reference Browse Mode Menus PROJECT NEW STACK Allows you to create a new stack. You will be prompted for a name. A requester will pop up asking for resolution and colors. OPEN STACK Allows you to open an existing stack. You will be prompted for a name using the UltraCard standard file selector. COMPACT STACK Your stack will have the "empty" space squeezed (xout of it. As you use stacks they "grow". Your old stack will be renamed with ".OLD' at the end of its name and a new stack will be created that contains all your information but taking less space on the disk and operating faster. PROTECT STACK You will be prompted for a password. From then on you must supply the password when you open the stack. 168 OUTPUT TO Allows you to select whether print screen is to the printer or to a file. FILE PRINTER PRҸthe value of GRID.AMOUNT. If this variable contains, for example, 4 then objects can only be moved to pixel locations evenly divisible by 4. This can be quite handy when creating tables, etc. Normally you simply use the chat window to execute the statement: put 4 into grid.amount or whatever value you want for grid resolution. ME this is a number. It contains the ID of the object in which the current script is executing. You can use this as an argument to the OBJECT() functiCon. You should use ME as opposed to direct object id's or names when coding scripts that refer to the object itself so that your scripts can be copied and put into new objects you create and no changes will be required. 152 TARGET this is a number. It contains the ID of the object which first processed the message. It can be useful when used in conjunction with PASS. THE.KEY this is an ASCII character as a 1 character string. it is used in conjunction with the KEY.PRESS m;U essage and contains the most recent key that was pressed. RAW.KEY this is a number. It contains the raw key code for the most recent key that was pressed. It is used in conjunction with the KEY.PRESS message. TAB.KEY.OBJECT this is the ID of the object in which the TAB or RETURN key was most recently pressed. By using this you can determine, as is done in the STACK script of the UltraDex stack, which object to activate next. SELECTION this is the ID of the selected object wh՛1en in MODIFY mode. By using this and the OBJECT() function you can make property changes to the currently selected object. 153 FIND.OBJECT this is the ID of the object in which the string was found during the FIND statement. IO.LENGTH this is a number indicating how many characters were read during the last READ.FILE statement. It is 0 for a blank line and -1 for end-of-file. PATHWAYS this is a multi-line text value containing the names of directories to search when a JUGMP statement specifies a stack name that is not fully qualified (e.g. JUMP HELP). It defaults to: ULTRA: ULTRA:STACKS ULTRA2:STACKS SERIAL.PREFIX this is a string that, if not empty, is sent before the user specified characters during a SERIAL.WRITE statement. SERIAL.SUFFIX this is a string that, if not empty, is sent after the user specified characters during a SERIAL.WRITE statement. 154 SERIAL.ERROR this is a string that contains either 0 or "TIMEOUT" and is refereQ"nced after a SERIAL.READ statement. The following are constants you can use to make your scripts more readable: ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN 155 UltraCard Object Properties Listed below are the properties of an UltraCard object that can be retrieved and stored using the GET and SET UltraCard statements. HiliteMode 0 - None 1 - Invert 2 - Outline NameDisplay 0 - ShowLeft 1 - ShowTop 2 - ShowRight 3 - ShowBottom 4 - ShowInside 5 - Hidden Name Character String NameFont Character String, font name followed by size, e.g. TOPAZ 8 or RUBY 15 NameColor Number, 0 to max-1 156 NameStyle Bit encoded, OR together for multiple styles 0 - Normal 1 - Bold 2 - Italic 4 - Underline Render 0 - Clear 1 - Solid FillColor 0 through 63 means solid color fill (Note: The following three values may be retrieved but DO NOT set them because there are other data items which must accompany them, like oaa bitmap, which unless the property is set by the program via the menu, it will NOT work!) 43690 - Object is GRAPHIC fill 56797 - Object is Horizontal Slider fill 61166 - Object is Vertical Slider fill 157 OutlineStyle 0 - None 1 - Single 2 - Double 3 - Triple OutlineColor 0 to 63 Shape 0 - Circle/Ellipse 1 - Box 2 - Horizontal Line 3 - Vertical Line 4 - Diagonal Line 1 5 - Diagonal Line 2 DropShadow 0 - None 1 - Light 2 - Medium 3 - Heavy ShadowColor 0H29 to 63 Visible 0 - Hidden 1 - Visible 158 ScrollBar 0 - Hidden 1 - Visible ScrollBarColor 0 to 63 ScrollBarOrientation 0 - Horizontal 1 - Vertical Hypertext A string value NameShadow 0 - No 1 - Yes NameShadowColor 0 to 63 ValueColor 0 to 63 ValueVisible 0 - No 1 - Yes ValueLock 0 - Editable 1 - Locked 159 ValueShadow 0 - No 1 - Yes ValueShadowColor 0 to 63 ValueStyle Bit encoded, OR together for multiple styles. 0 - Normal 1 - Bold 2 - I 9talic 4 - Underline MultiLine 0 - Single Line 1 - Multiple Line Value Display TopLine Numeric value, beginning with 0, indicating which line of a multi-line value is displayed at the top of the value display area. LeftEdge Numeric value, screen position TopEdge Numeric value, screen position Width Numeric value, screen position 160 Height Numeric value, screen position ValueLineCount Numeric value, number of lines in a multi-line value (after word wrap) or the mag;ximum value for a slider fill. Script Character string of the object's script. If you set an object script using this the next script will not take effect immediately. 161 UltraCard Messages This section lists all of the messages that are generated by UltraCard and what they mean. Entry/Exit Messages These messages are generated whenever an environment is entered or exited. There are empty handlers already supplied for you at each of these lev' n a copy of the global variables will be stored in the currently open stack when it is closed either by opening another stack or quitting the program. Normally global variable changes are not permanently recorded. IN.MODIFY this is a boolean value. If it is non-zero then the program is currently in MODIFY mode. You can test this value in your scripts to determine, for example, if your function key handler should perform a browse function or a modify function. FADE this is a boJholean value. If it is non-zero then the screen fades to black and back again on each JUMP. This is particularly effective if the frame to which you are jumping is in a different color palette. DATA.CURSOR this is a color value. Normally the vertical line cursor used for single-line data entry is shown as color 1. By putting a different value into DATA.CURSOR you can customize this. TRUE 146 this is a constant. Its value is "1" FALSE this is a constant. Its value is "h0" MOUSE.X this is the mouse horizontal position, in pixels, when the current message was originally sent. MOUSE.Y this is the mouse vertical position, in pixels, when the current message was originally sent. SHIFT.KEY this is a boolean. If either shift key was down when the last system message was received then this is TRUE. ALT.KEY this is a boolean. If either alt key was down when the last system message was received then this is TRUE. CONTROL.KEY this is a boolean. I 㕥f the control key was down when the last system message was received then this is TRUE. 147 EXTERNAL.SCRIPTER this is a program name. It contains the name of the program to run when the ARexx statement is executed. By default this is "C:RUN C:RX" to run ARexx scripts. EDITOR this is a program name. It contains the name of the program to run when the External Editor menu item is selected in the UltraTalk editor. PAINT this is a program name. It contains the name of the hprogram to run when the IFF/Paint menu item is selected in MODIFY mode. It is normally run using a Workbench interface (because DPAINT requires it) but if the paint program you are using can accept CLI type arguments then put and asterisk (*) as the first character of this string and the program will be invoked using a CLI interface instead of a Workbench one. 148 VISUAL.EFFECT this is a number that represents which visual effect is to be used when a JUMP WITH EFFECT is execu(ated. The following are the allowed values of the global variable VISUAL.EFFECT (and their meanings): 0 - Same as effect 1 1 - CUT - full screen single blit 2 - Wipe Down 3 - Wipe Up 4 - Wipe Left to Right 5 - Wipe Right to Left 6 - Curtain Open 7 - Curtain Close 8 - Slide on Left to Right 9 - Slide on Right to Left 10 - Slide Top to Bottom 11 - Slide Bottom to Top 12 - Zoom out from center 13 - Zoom in from outer edges 14 - Zoom out froѶm point in EFFECT.X, EFFECT.Y 15 - Zoom in from point in EFFECT.X, EFFECT.Y 149 EFFECT.SPEED this is a number ranging from 1 to 10 indicating how fast the visual effect should be performed. Since this interacts with EFFECT.AMOUNT (see below) you can vary the apparent speed by using slower speeds and larger amounts or by using faster speeds and smaller amounts. EFFECT.AMOUNT this is a number that varies depending upon the visual effect involved. It is the number of p@Rixels that are transferred at one time from the new image to the screen. For example, if you are using effect 5 (wipe right to left) an amount of 64 for a 640 wide screen will accomplish the effect in 640 steps. This value is forced to be an even multiple of the screen size, depending upon the effect. EFFECT.X this is a number used for effects 14 and 15 to indicate a point on the screen where the zoom should focus. EFFECT.Y this is a number used for effects 14 and 15 to indicatFMe a point on the screen where the zoom should focus. 150 NEXT.FILE.NAME this is a string. It is NOT empty then the next time the file selector would appear on the screen the value of this variable is returned instead. In this way you can, in combination with DO.MENU, operate the menus that ask for filenames under script control. After each file select which accesses NEXT.FILE.NAME this variable is set to the empty string. MULTI.MOUSE.MOVE this is a boolean. If it is stil3" l non-zero then while in a loop monitoring the STILL.DOWN function mouse movements are compressed. This gives faster response. Compression means that all mouse movement messages that are queued by Intuition between calls to the STILL.DOWN function are reduced to a single movement calculation. DOWN.SOUND this is a file name string. If it is non-empty then this file is assumed to contain a digitized sound and it is played when any button is clicked. Normally you would copy the soXund file to a ram based disk (such as RAM: or RAD:) and put that name into DOWN.SOUND 151 UP.SOUND this is a file string. If it is non-empty then this file is assumed to contain a digitized sound and it is played when any button is released. Normally you would copy the sound file to a ram based disk (such as RAM: or RAD:) and put that name into UP.SOUND. GRID.AMOUNT this is a number. While in MODIFY mode positioning of objects is limited to specific boundaries based upon Rs: A string containing the "index-th" word in the expression. Word numbering begins at 1. Example: WORD(2, "This is a test") -- returns "is" 132 Function: LINE(index,expr) Returns: A string representing the "index-th" line in the expression. Most useful for multi-line values. Line numbering begins at 1. Example: Assume we have a multi-line object containing: +------------------------+ | UltraCard | | Hypermedia Software | | From a_ | | Intuitive Technologies | +------------------------+ Line(2,field) would return: "Hypermedia Software" 133 Function: ITEM(index,expr) Returns: The index-th "item" from the expression. Items are separated by commas. Example: Item(3, "ABC,DEF,GHI,JKL") -- returns "GHI" 134 Function: OBJECT(expr) Returns: The name of the object whose id number is contained in expr. Useful with the GET statement to select objects other than by name. Example: GET the Top.LineEAx of Object(3) 135 Function: STILLDOWN Return: TRUE if the mouse button is still down. This is used in the SELECT.DOWN handler to track the mouse. 136 Function: VERSION Returns: The version number of UltraCard as a string. it is in the form: MMmmxxxx where MM is the major version (like 01) and mm is the minor version (like 30) and xxxx is reserved. The VERSION function returns the word "VERSION" on releases prior to 1.2.1. In version 1.3 it returns "01300000". O/ 137 Function: BDROP.ID Returns: The id number of the current backdrop. Using this function you can write scripts that step through a stack and know when the backdrop changes by monitoring the value of BDROP.ID. 138 Function: AVAILABLE.MEMORY Returns: The amount of TOTAL available memory. It includes both CHIP and FAST memory. 139 Function: AVAILABLE.CHIP.MEMORY This function returns the amount of CHIP memory available. You could use the value of this functio Z;n to determine whether or not you need to use the SLEEP statement when preparing to run another program: If Available.Chip.Memory < 128000 SLEEP Endif WORKBENCH "dh0:planit" WakeUp -- doesn't hurt if you weren't sleeping! 140 Function: NEXT.FRAME.OBJECT(parm) This function allows you to step through the objects of a frame and examine their contents and/or properties. The first call the NEXT.FRAME.OBJECT should be made with a parm of 0. The function returns the OBJECT'$ id of the next object in the frame. You can then use this id number with the OBJECT() function to find information about the object. The second through last calls to NEXT.FRAME.OBJECT should pass the result of the previous call. NEXT.FRAME.OBJECT returns -1 when you have reached the end of the list. Example: Say the location of each object in the frame. put 0 into id LOOP 141 put.next.frame.object(id) into id if id is -1 -- check for last obj in frame break e ndif get top.edge of object(id) into top.pos get left.edge of object(id) into left.pos say "object " && id && " is at " && ! left.pos && " " && top.pos ENDLOOP 142 Function: NEXT.BACKDROP.OBJECT This works identically to the NEXT.FRAME.OBJECT function described above except that it steps through the objects in the current backdrop. 143 ULTRATALK GLOBAL VARIABLES Within the UltraCard program there are a number of predefined global varivables. Some of these control aspects of the program's behavior and some are set by the program for use by your scripts. This is a complete description of all the built-in globals and what they mean. LAST.DATE set by the DATE function to the number of days since January 1, 1978. It is then subsequently used in all the calculations of Day.Of.The.Week, etc. It is a global variable so that you can calculate a different value and use the built-in functions to extract information fr4CNom that value (such as the Month, Day.Of.The.Week, etc.) CHAT set by typing into the chat window. If the chat window is on the screen you can "put" an expression into the variable CHAT and it will appear in the window immediately. IT the most default repository of information in UltraTalk. Most statements store information here if no other destination is given. 144 WIDTH.ADJUST this is a numeric value which is used when performing graphic printing. It is defaulted to pr* int 640 wide images as a full page wide and 320 wide images as a 1/2 page wide. Change it before you select either Print/Screen or Print/Stack. HEIGHT.ADJUST this is a numeric value which is used when performing graphic printing. It is defaulted to print 200 high images as 1/3 page height and 400 high images as 2/3 page height. Change it before you select either Print/Screen or Print/Stack. CANT.MODIFY this is a boolean value. If it is non-zero then you are not allowed to ent*er MODIFY mode via the menu item or the F2 function key. CANT.ADD.FRAME this is a boolean value. If it is non-zero then you are not allowed to add frames to the current stack either with or without new backdrop and you also are prohibited from duplicating a frame. CANT.DELETE.FRAME this is a boolean value. If it is non-zero then you are now allowed to delete a frame. 145 SAVE.GLOBALS this is a boolean value. It defaults to FALSE. If you set this to true in a script theo6with and INCREMENTING by until it reaches or exceeds . If the step value is negative then the takes on values beginning with and DECREMENTING by until it reaches or becomes less than . If the STEP clause is not specified the step value is +1. Example: -- count from 1 to 100 for i=1 to 100 say i endfor -- count down from 100 by 10's for i=100 to 1 step -10 say i endfor 111 Syntax: LOOP {WHILE } -- stat7Gements ENDLOOP Function: This statement creates a loop that continues forever or until some condition is met (i.e. the WHILE becomes false, that is ZERO). If the loop is forever you must exit with a GOTO, or a BREAK statement. Example: -- a forever loop that exits with BREAK put 1 into count LOOP add 1 to count if count >= 100 break endif ENDLOOP -- a loop that uses a WHILE clause put 1 into count LOOP WHILE count < 100 add 1 to count ENDLOOP 112 nSyntax: WHILE Function: This statement is used in conjunction with the LOOP statement to create loops with a text at the bottom. When the becomes FALSE (i.e. ZERO) then the loop is exited. Example: -- loop with WHILE statement put 1 into count LOOP add 1 to count WHILE count < 100 ENDLOOP 113 Syntax: BREAK Function: This statement is used with LOOP and FOR constructs. When it is encountered it causes control to pass to the first statement after the et(nnd of the ENDLOOP or ENDFOR. Example: -- loop exit using BREAK put 1 into count LOOP add 1 to count if count >= 100 break endif ENDLOOP -- for exit using break FOR i=1 to 100 if i = 55 break endif ENDFOR 114 Syntax: CONTINUE Function: This statement is used with LOOP and FOR constructs. When it is encountered it causes control to pass to the beginning of the loop and the remainder of statements in the loop are skipped. Example: -- SAY only even nuWmbers for i=1 to 100 if i % 2 = 0 continue -- bypass rest of loop endif say i endfor 115 ULTRATALK BUILT-IN FUNCTIONS You may use a built-in function any place that a variable may be used EXCEPT as a destination (such as PUT...INTO destination) Function: ABS(expr) Returns: The absolute value of a numeric expression Example: ABS(-3) -- returns 3 116 Function: CHAR.TO.NUM(expr) Returns: The numeric value of the first character of the e$gxpression. Example: CHAR.TO.NUM("A") returns 65 117 Function: LEFT(expr,numchars) Returns: The left-most characters of the expression. Example: LEFT("ABCDEFGHIJLKMN",5) -- returns "ABCDE" 118 Function: LENGTH(expr) Returns: The length of the string value of the expression. Example: LENGTH("ABCDEFGHI") returns 9 119 Function: NUM.TO.CHAR(expr) Returns: The string value, a single character string, of the ascii equivalent of the expression. Exa#Tmple: NUM.TO.CHAR(66) returns "B" 120 Function: PARM(expr) Returns: The value of a parameter to a user written function. If you use a name, followed by expressions in parenthesis, UltraTalk thinks you are calling a "function". It evaluates the arguments and then sends a symbolic message using the name of the function. When you write the handler you use the PARM function to retrieve the arguments from the caller's parameter list. Example: MY_FUNC: say "The first para>-pmeter is " ! && PARM(1) say "The second parameter is " ! && PARM(2) Put Parm(1) after Parm(2) 121 Return Parm(2) END_MYFUNC Select: PUT "ABCD" into var1 PUT "EFGH" into var2 say MY_FUNC(var1,var2) -- will say "ABCDEFGH" END_SELECT 122 Function: PARM.COUNT Result: The number of parameters that have been passed to a user written function. There is a maximum number of 10 parameters. This function will return the number of parameters actually pOGassed. It is useful to check to see if the number of parameters is correct. Example: MY_FUNC: -- check to make sure argument list was -- right, i.e. user passed to parms IF Parm.Count <> 2 Return "ERROR" 123 ENDIF say "The first parameter is " ! && PARM(1) say "The second parameter is " ! && PARM(2) Put Parm(1) after Parm(2) Return Parm(2) END_MYFUNC 124 Function: RIGHT(expr,num) Returns: The rightmost characters of the string expressi on. Example: RIGHT ("ABCDEF",3) returns "DEF" 125 Function: DATE Returns: The date, as a string. Example: PUT DATE into todays.date 126 Function: DAY Returns: The day of the week, as a 3 character abbrev. Example: DAY returns "SUN" 127 Function: DAY.OF.THE.WEEK Returns: A number corresponding to the day of the week where 1 = SUNDAY, 2 = MONDAY and so on until 7 = SATURDAY Example: DAY.OF.THE.WEEK returns 1 on the Sunday 128 Function: MONTH ReturB]ns: A string containing the 3 character abbrev. for the current month. Example: MONTH returns "Jan" during June 129 Function: YEAR Returns: A string containing the last two digits of the current year. Example: YEAR returns "89" for the year 1989 130 Function: TIME Returns: A string containing the hours, minutes, seconds and AM/PM for the current time. Example: TIME returns "10:00:05 AM" for 5 seconds after 10:00 AM. 131 Function: WORD(index,expr) ReturnFV~OM Function: This statement writes data from a variable or an object to a text file previously opened via OPEN.FILE. If the value in the variable or object is multi-line then this writes multiple lines to the output file. Example: See OPEN.FILE 103 Syntax: CLOSE.FILE Function: This statement closes a file previously opened via OPEN.FILE. Example: See OPEN.FILE 104 Syntax: DELETE.FILE Function: This statement deletes a file from the disk. ;iPIt does not ask for confirmation so be careful what file name you pass to it!!! Example: -- ask for a file and delete it -- this script is conservative and -- asks the user to confirm his choice :) GLOBAL file.handle get.file.name into fn if fn is "NO_FILE" return -- no file was chosen else answer "Delete " && fn ! WITH "OK", "No! Don't Do it!" if it is 1 DELETE.FILE fn else show.msg "File NOT deleted" endif endif 105 Syntax: SORT BYY Function: This statement rearranges the order of frames in a stack based upon the value in a backdrop object. Backdrop objects have their values stored with the frame. In this way you can have a single object with all of its properties stored only once but a different value in each frame. This minimizes the amount of disk space and computing time required to use UltraCard in data-base applications. Therefore, this statement collects all the strings from each frazLme associated with the specified object, sorts the strings and then rearranges the order of the frames in the stack to correspond to sorted order. Example: -- from the UltraDex stack: SORT BY NAME 106 Syntax: CURSOR {WAIT | READY | HAND | LOAD } Function: This function changes the shape of the mouse cursor. The WAIT keyword changes the mouse cursor into the Amiga ball. In fact, multiple uses of CURSOR WAIT will rotate the ball. READY changes the cursor back to]İ the current READY cursor. HAND changes the cursor back to the standard UltraCard hand cursor. The LOAD option allows you to load in an external cursor. The external cursor file should be 80 bytes in length and is an extraction from the standard Intuition Preferences structure. If you don't know what that means don't worry most PD cursor collections will work if the files are 80 bytes long. NOTE: IF YOU LOAD AN EXTERNAL CURSOR THEN THE CURSOR WILL NOT CHANGE AS YOU SWITCH FROM BDROWSE TO MODIFY MODE. Example: -- first, the rotating ball for count=1 to 10 cursor wait endfor -- then back to the hand cursor hand -- load an external cursor cursor load "dh0:pointers/3darrow1.p" 107 Syntax: DO.MENU {SUBITEM } {NO.REQUEST} Function: This statement allows you, from within a script, to select a menu item just as if the user has chosen it with the mouse. The is searched for the first match scanning down the mGenus fro top to bottom beginning with the leftmost menu. The string need not be an exact match but the first partial match that is found will be executed. The argument to the SUBITEM clause is an integer beginning with 0 which indicates which sub-menu item is selected. If the keyword NO.REQUEST is present then any confirmation request, such as that presented when you pick the COMPACT STACK menu item will be suppressed and execution will continue as if you had responded positively to the confirmation request. Be careful, if you use this with DELETE FRAME you could accidentally delete a frame you wanted to keep so use NO.REQUEST carefully. Example: -- compact a stack from within a script DO.MENU "COMPACT STACK" NO.REQUEST -- Jump to the last frame by selecting -- the GO/JUMP/LAST menu item -- from within a script DO.MENU "JUMP" subitem 3 108 Syntax: SHOW.MSG line1,line2... up to line 8 {FOR SECONDS} Function: This statement displays a messĻ!age box of up to 8 lines of text and an optional OK button on the screen. You supply from 1 to 8 strings or expressions representing the lines of text. If you use the FOR clause then the text will be shown for the specified number of seconds and no OK button will be shown. Example: -- simple one-line message with ok box -- this type of message is GREAT for -- debugging your scripts show.msg "This is a message" -- a complex multi-line message with ok show.msg "This is a multi5i-line", ! "message shown using the ", ! "SHOW.MSG", ! "statement in UltraTalk" -- a message with time delay not ok box show.msg ! "This message shows for 5 seconds" ! for 5 seconds 109 Syntax: MOVE object BY , Function: This statement allows you to move an object around on the UltraCard screen. It allows simple movement type animations. The movement distance is in pixels and may be positive and negative. Example: -- this example moves an objej.ct 100 -- pixels to the right, 10 pixels -- at a time and then moves it back for count=1 to 10 move object.1 by 10,0 endfor for count=1 to 10 move object.1 by -10,0 endfor 110 Syntax: FOR = TO {STEP } -- statements ENDFOR Function: This statement simplifies the creation of loops in which the number of iterations is known at the start of the loop. If the step value is positive then the takes on values beginning x V\econds DELAY 100 93 Syntax: ANSWER WITH {, } Function: This statement displays a requester on the screen with the question, from , displayed in the middle and the left gadget containing the string and, if present, the right gadget containing the string . If is not supplied then both gadgets will contain the same string. The result, 0 or 1, will be stored in the global variable IT. If the user clicks on the gadget with the texy Vt in it then IT will be 1, otherwise 0. Example: -- ask an important question answer "Do you want to quit" with ! "Yeah, Sure", "No way" if it is 1 do.menu "quit" -- aw, shucks else say "Thank you, I'll continue" endif 94 Syntax: ASK.VALUE {PROMPT } {INITIAL } {INTO var} Function: This statement asks the user to input a value. You can specify a question, via the PROMPT clause, an initial value, via the INITIAL clause and a destination, via the Iz ,"NTO clause. If you do not specify an INTO clause the result is put in the global variable IT> Example: -- ask the user's name ASK.VALUE PROMPT "Enter your name" ! INTO user.name SAY "THANK YOU " && USER.NAME 95 Syntax: AREXX {FROM file-name} Function: This statement is the way in which you start an ARexx script from UltraCard. If you have the script stored in an external file use the FROM clause to specify the name of the file. Otherwise you "collect" ARexx scripts { {8Xwithin a script by enclosing them in lines that start with #BEGIN and end with #END. 96 Example: SELECT.DOWN: -- script for a button that uses -- an embedded ARexx script that talks -- back to UltraCard and starts CygnusEd #BEGIN /* ARexx comment */ options results /* Talk to UltraCard */ address ULTRA1 /* feed it an UltraTalk stmt */ /* to get the file name from UltraTalk */ /* global variable, file.name then */ /* pass to a script loadced.rexx */ 'get fi| hqkule.name' address rexx loadced.rexx result #END -- now get file name into the global GLOBAL file.name get.file.name into file.name if it is "NO_FILE" return -- user didn't select a file endif ARexx -- go start Arexx script collected -- above between #BEGIN and #END END_SELECT.DOWN 97 Syntax: SCREEN {TO} {FRONT/BACK} Function: This statement moves the UltraCard screen in relationship to the other draggable screens in the Amiga display. You could use this, for ex}6ample, to run some other program and then bring the UltraCard screen back to the front, after moving it lower on the display to act as a help screen. Example: -- This script uses a public domain -- program that displays an IFF file and -- listens via an ARexx port to commands -- which in this case are sent by UCard CLI "runback show" && picture.name ! INPUT "NIL:" OUTPUT "NIL:" SCREEN.MOVE 180 -- position to bottom of display SCREEN TO FRONT -- bring our display forward ~^-- -- at this point the picture is -- on the screen -- and UltraCard is still running and can -- command the show program as necessary 98 Syntax: FIND {SUPPRESS.ERROR} Function: This statement searches the UltraCard stack, bringing with the frame AFTER the current frame for the string in any data field. If the string is found in any data field then the global variable FIND.OBJECT is set to the ID of the string in which the object was found. Normally, when usedLt from the menu, FIND displays an error requester if the string was not found. You may suppress that requester using the SUPPRESS.ERROR keyword. Example: -- search for a string ask.value "Find what value?" into it find it -- now find.object contains the id -- of the object in which the string -- was found. 99 Syntax: OPEN.FILE {OUTPUT} Function: This statement opens an ASCII file for use by an UltraTalk program. If the keyword OUTPUT is used the file bis created otherwise the file is assumed to exit. If the open fails the global variable IT will contain the value 0 otherwise it will contain "handle" which must be saved and used for subsequent reading and writing. Example: -- open a new text file GLOBAL FILE.HANDLE OPEN.FILE "RAM:MY.TEXT.FILE" OUTPUT IF it is 0 show.msg "Couldn't open file" return ELSE put it into file.handle ENDIF WRITE.FILE file.handle from "Hello World" CLOSE.FILE file.handle -- open an old fi{le GLOBAL FILE.HANDLE OPEN.FILE "RAM:MY.TEXT.FILE" IF it is 0 show.msg "File not Found" return ELSE put it into file.handle ENDIF 100 READ.FILE file.handle into it SAY IT CLOSE.FILE file.handle 101 Syntax: READ.FILE {INTO } Function: This statement reads data from a text file previously opened via OPEN.FILE and stores the results either into the global variable IT or a destination of your choice if you use the INTO clause. It only reads one line of text at a time. To read in multiple lines you must use a loop. There is a global variable, IO.LENGTH which is set to the number of characters actually read. A blank line sets IO.LENGTH to 0 and end-of-file sets IO.LENGTH to -1. Example: -- assume a multi-line object named value OPEN.FILE "DATA.FILE" PUT IT INTO FILE.HANDLE READ.FILE FILE.HANDLE LOOP WHILE IO.LENGTH >= 0 PUT IT AFTER VALUE READ.FILE FILE.HANDLE ENDLOOP 102 Syntax: WRITE.FILE FRmOUexecutes the POP statement so that you can continue working exactly where you were before you went to the help stack. Example: PUSH -- save our current frame JUMP to FRAME 5 of STACK "MY.OTHER.STACK" -- when a POP statement is executed the -- frame containing this script will be -- shown again 80 Syntax: PUSH Function: Save the current stack & frame on the PUSH/POP stack. Later when a POP statement is executed the current stack/frame combination will once again be on n.the screen. See the documentation for POP. Example: -- example of POP POP -- return to stack that called us. 81 Syntax: RETURN Function: All UltraTalk handlers can be called as a function and the RETURN statement creates whatever value is to be returned. You can get any expression to call a function or use the GET statement. Example: MY.SAMPLE.FUNCTION put parm(1) into value multiply value by parm(2) return value END_MY.SAMPLE.FUNCTION -- call my funoction GET MY.SAMPLE.FUNCTION(5,10) -- now IT contains the result of 50 82 Syntax: Send {TO object} message Function: This statement sends an UltraTalk message. It is most often used to send a CLICK.DOWN/CLICK.UP message sequence to a button to simulate the user clicking on the button. If the TO clause is used then the global variables MOUSE.X and MOUSE.Y are set to the location of the object before the message is sent. Example: -- simulate the user clicking on object.1 pA SEND TO OBJECT.1 CLICK.DOWN SEND TO OBJECT.1 CLICK.UP -- This can also be used to send messages -- normally sent by the program SEND FRAME.ENTRY -- Run it again 83 Syntax: ENTER.MODIFY Function: You can create a stack that modified itself using the modify mode of UltraCard. This statement changes from BROWSE mode to MODIFY mode just as if you had pressed F2 on the keyboard. Example: -- go into modify mode ENTER.MODIFY 84 Syntax: EXIT.MODIFY Function: This sqtatement returns you to BROWSE mode. If you are already in browse mode it has no effect. Normally this is used after ENTER.MODIFY. Example: -- return to BROWSE mode. EXIT.MODIFY 85 Syntax: NEW.OBJ , <1>, , , {FRAME | BACKDROP} Function: This statement, used only when you are in MODIFY mode, creates a new object using the name, location (l=left, t=top) and dimensions (w=width, h=height) you specify. You must specify whether this is to be a FRAME lrzayer or a BACKDROP layer object. Example: -- create new obj under program control NEW.OBJECT "button",10,20,50,25 86 Syntax: CUT Function: This statement, used only when you are in MODIFY mode, copies the currently selected object to the internal clipboard and then deletes the object. You may get the object back from the internal clipboard using PASTE. Example: -- check to see if there is a selection -- and then cut it to the clipboard -- SELECTION is a global variablsEEe which -- contains the ID of the object -- currently selected if selection is.not 0 CUT else SHOW.MSG "No Object Selected" endif 87 Syntax: COPY Function: This statement, used only when you are in MODIFY mode, copies the currently selected object to the internal clipboard. Example: -- check to see if there is a selection -- and then copy it to the clipboard -- SELECTION is a global variable which -- contains the ID of the object -- currently selected t_Yif selection is.not 0 COPY else SHOW.MSG "No Object Selected" endif 88 Syntax: Paste Function: This statement copies an object which has been placed on the internal clipboard (using CUT or COPY) and puts it in the FRAME or BACKDROP. A Paste always pastes the object to the layer from which it was Cut or Copy'd. Paste always puts the object two (2) pixels lower and two (2) pixels to the right of the original position. Example: -- demo of the object Paste PASTE u4< 89 Syntax: Clear Function: This statement, used only when you are in the MODIFY mode, deletes the currently selected object. THERE IS NO UNDO of this operation. Example: -- check to see if there is a selection -- and then delete it -- SELECTION is a global variable which -- contains the ID of the object -- currently selected if selection is.not 0 CLEAR else SHOW.MSG "No Object Selected" endif 90 Syntax: SET.COLOR , ,, vAP? Function: This statement allows you to alter the color map of the current screen. is a number from 0 to the max-number-of-colors minus 1 (e.g. 31 for a 32 color screen) and Red, Green and Blue are the RGB components of the desired color. The values may range fro 0 to 15. If any of them are equal to -1 then that color is not changed. If the SAVE keyword is specified then the BACKDROP is saved immediately with the new color palette. Example: -- change colweD4or 1 to white SET.COLOR 1,15,15,15 91 Syntax: SELECT.OBJECT Function: This statement, used only in MODIFY.MODE, selects an object by name. Example: -- select an object SELECT.OBJECT object.1 92 Syntax: DELAY (.1's of a second) Function: This statement causes UltraCard to wait for the specified period of time. The count value given is in 1/10th of a second so to delay for 1 second use DELAY 10. Example: -- Delay for 1/2 second DELAY 5 -- Delay 10 sbJ n Modify mode or by the SET statement. Listed at the end of this document are the names of the properties and the ranges of values they may take on. You can use the GET statement to retrieve the current value of a property and then use the SET statement to the value of property to a new value. There are two special properties and two special object names that are used to signal to UltraCard whether to keep modifications after using SET. The properties are called MODIFIED.OBJECTS c "Rtand MODIFIED.GRAPHICS and the objects are "THE.FRAME" and "THE.BACKDROP". They must be specified as shown as THE is part of the name. Example: -- make some temporary changes to an object set the fill.color of object.1 to 3 set the name of object.2 to "Stop" -- and now make these changes permanent set the modified.objects of the.frame to 1 -- Note: If you do not put in a statement 68 -- like the one above the properties will -- revert to the original values whd!'Ben the -- frame is closed (i.e. you jump to another -- frame) 69 Syntax: GOTO or GO TO