`8p   o  @`! #@%`')+-/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[]_ac@e`gikmoq s@u`wy} o @ @ ` @ ɠ @ ׀ ٠  @` O`/Ao   !Ao!!#%a')+1!39;=?A!CAEaGIKMOQ!SAUaWY]_a!cAogikmoq!sAuawy{o  @`! #@%`')+-/1 3@5`79;=?A C@E`GIKMOQ S@U`WY[]_ac@e`gikmoq s@u`wy} o @ @ ` @ ɠ @ ׀ ٠  @` O`/Ao   !Ao!!#%a')+1!39;=?A!CAEaGIKMOQ!SAUaWY]_a!cAogikmoq!sAuawy{LINENUMB nPAINT nSCORFOUR nXREF2  nTI_TA_TO 2nGFATIP08 snGFATIP09 1nGFATIP10 VnGFATIP11 ]nST144 P6 )MANUAL G(.DESKTOP INFO|. n.. nLINENUM PRGn8LINENUM RSCn. n.. nPAINT BASЍnbbPAINT DOCՍn{ PNT_LOADLST؍n+. n.. nSCORFOURBASn"SCORFOURPI1n"}SCORFOURPICn.}SCORFOURPRGčnN#NGfABASIC nnnb !!!!!!""8"8"8"8ALENSDSCREENPFEILTGDRGBDATXYKZDYD1DXFSPSPIELERLPIS1SJNTAEX0Y0X1Y1EZCLNRCWGWCLNRGLNRCFGFR1R2R3R4R5FGUCSPEZDDAUERKBXBYFWLINIENOTEOKTAVEDAUERENOPL1L2BW FARBPALETTEKUGELKUGEL1PFEILLINIENMELODIEZWEIERINIT KUGEL.SETZEN INIT.PICTURESINIT.DATGEWONNEN UNENTSCHIEDENCOMPUTER.SETZTTESTCOMPIF,MFMF,F!6p!!! Fd)!I|Wieviele Spieler versuchen|diesmal vier Steine in eine|Reihe zu bringen?!! EINER |ZWEI!F6p!!!FEF ~hFlEF FEJ !FFFjFDFM FMFPM F ~ZFl ~F MF ~FM F FMF M F ~ZFi~F6p!!! F)!!! JA| NEIN !F bZFZEG|F ~@ F ~@ F <F|}F6!!!FF,    + F  EFF "!!F FE ~!!F0 FF! RF~FEG|F>   `  F  F~@  ! ! F0&y!@! !! Fz!F  E FEF F FE F F ZFF, .F ! !+F EFEG|F   FEF FE F fF BE; |Das Spiel ist|unentschieden ausgegangen!!|Noch ein Spiel?F FE .F   + F jFEGF> @  @  @  @  F EF FE F  F5FEGdFy!! ! Fy!! ! Fy!! ! F&z`!`!!@! F Fz!F!F $!!!FE@ `FE@ `FE@ `FE@ `F$EHHN# # FNE``FEFEFF!H!FEFEGHF&6!33335!!FN !G!F{FH jF! ZSRFHF6!!! F@E |Spieler A ' hat|diesmal gewonnen!!|Noch ein Spiel?F F .F  +F J !FEGF|EGF @ F4  F F  @ F1  !FF F dF VFj!!#F E FEGFe   F E  F!EFF FE F EF pFhEGFF ^!@ F#E!@ F FE 8F FEGWF(    F!EF #E F FE Z#F F  FEJ !F`EGF|VEGF "@ F4  F F  L@ F1  !FF F F Fj!!$F E FEGFe    F E  F!EFF FE F EGFF !@ F$E!@ F FE F f F!EFbEGWF( N   F! |  F $E FEFEF JF  F EGF*  @  @ Fc$E @ F FE F  FFBEGF * 8 @  @ Fc$E @ F FE F  F F F bZF F  F  #  F#E$F FE # EF~#@ !# !# F*y!@! !! Fcz!F .F  +F, RF02EGpFC Q!!F6!!!F FFRF,&*dd !dd !dd FEGdFQ ! ! F rFRFjFEGF4QF Eb F FRF6*||@ F @ EF@&EGF4QF@ E@ b F F@ E@ F0.@ !`! Eb` b@ FEG|F@ E@ F@ E@ F xF*|| !|| FxEGF!nEGF!dEGF!> E2000F6 E0HHF F F F*|| FJ !F"7I!M!SCORFOUR\SCORFOUR.PICFE_z!M F\8FE .F E E+F, *@ F*  FRFEGF,EGF Q@ F& @ E@ F8& @ E@ F8&p@ E@ @F8 &FF FFrE G4FhEGF Q@ F&@@ E@ F8&@@ E@ F8&@ E@ @F8 F FEGFEGF Q@ F@ E@ F@ E@ F@@ E@ F F FVEGFLEGF Q@ F 6FF (FF&* WW ! WW ! WW FEGxFQ  !  !  F  E  F  E  F @ E  @F  E   F  E   F @ E  pF  E   F  E   F @ E  pF FFEGFQ  !  !  F  E  F  E  F @ E  F(  E  #  | F*  E  #  | F* @ E  #  | F(  E  #  | F*  E  #  | F* @ E  #  | F F EGFQ  !  !  F  E  F5  E  F5 @ E  @F52  E  #  p  F52  E  #  p  F52 @ E  #  p pF52  E  #  p  F52  E  #  p  F52 @ E  #  p pF5 `FBE@GWF5Q  !  !  F $F .F ! !|F 0,0,0 7,3,5 7,0,0 4,2,3 0,6,6 0,5,5 7,0,6 6,0,5 3,0,5 2,3,4 3,2,0 7,7,0 0,2,3 7,0,0 0,3,5 2,1,0  5 5|F6 0,0,1,5,4 H1984,0,8176,0,15416,960,32652,112,32708,56,65510,24,65506,28,65506,28 :65506,28,65534,0,32764,0,32752,0,16320,0,7680,0,0,0,0,0   |F0,0,1,11,13 X63488,0,33792,30720,34816,28672,33792,30720,41472,23552,20736,3584,2176,1792,1152,768 $768,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   |FH1,4,16,5,4,16 8,4,48,1,5,16,8,4,32,6,4,32 5,4,64,4,4,32,4,4,32 6.5,4,32,5,4,16,8,4,16,6,4,32,6,4,16,10,4,16 -$8,4,64,5,4,24,5,4,8,5,4,32,8,4,32 .1,5,32,1,5,32,1,5,16,12,4,16,10,4,16,8,4,16 10,4,64,8,4,32,1,5,16 12,4,64,1,5,32,8,4,32 &10,4,32,8,4,16,6,4,16,5,4,32,3,4,32 1,4,32,3,4,32,5,4,32,5,4,32 .1,5,32,1,5,32,1,5,16,12,4,16,10,4,16,8,4,16 10,4,64,8,4,32,1,5,16 12,4,64,1,5,32,8,4,32 (10,4,32,3,5,32,1,5,32,12,4,32,1,5,64 8  |F(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 (0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15 0,5,10,15,3,6,9,12 , ,.0,16,32,48,1,17,33,49,2,18,34,50,3,19,35,51 0,17,34,51,3,18,33,48  ,0,20,40,60,12,24,36,48 , ,00,21,42,63,15,26,37,48,3,22,41,60,12,25,38,51   |F&0,0,4,1,0,5,2,0,6,3,0,7,0,0,8,3,0,9 &4,1,4,5,1,5,6,1,6,7,1,7,5,1,8,6,1,9 *8,2,4,9,2,5,10,2,6,11,2,7,10,2,8,9,2,9 ,12,3,4,13,3,5,14,3,6,15,3,7,15,3,8,12,3,9 60,4,8,12,4,9,5,5,8,9,5,9,10,6,8,6,6,9,15,7,8,3,7,9  ,.0,4,40,4,4,46,8,4,52,12,4,58,0,4,64,12,4,65 816,14,40,20,14,46,24,14,52,28,14,58,20,14,64,24,14,65 832,24,40,36,24,46,40,24,52,44,24,58,40,24,64,36,24,65 848,34,40,52,34,46,56,34,52,60,34,58,60,34,64,48,34,65 J0,40,64,48,40,65,20,46,64,36,46,65,40,52,64,24,52,65,60,58,64,12,58,65 i ,,0,0,40,1,0,41,2,0,42,3,0,43,0,0,44,3,0,45 816,10,40,17,10,41,18,10,42,19,10,43,17,10,44,18,10,45 832,20,40,33,20,41,34,20,42,35,20,43,34,20,44,33,20,45 848,30,40,49,30,41,50,30,42,51,30,43,51,30,44,48,30,45 H0,40,44,48,40,45,17,41,44,33,41,45,34,42,44,18,42,45,51,43,44,3,43,45  0,0,72,0,4,72,0,40,72 21,11,72,21,15,72,21,47,72 42,22,72,42,26,72,42,54,72 63,33,72,63,37,72,63,61,72  348,30,73,48,34,73,48,40,73 37,21,73,37,25,73,37,47,73 26,12,73,26,16,73,26,54,73 15,3,73,15,7,73,15,61,73 3 53,0,74,3,7,74,3,43,74 22,11,74,22,16,74,22,48,74 41,22,74,41,25,74,41,53,74 60,33,74,60,34,74,60,58,74  012,3,75,12,4,75,12,58,75 425,12,75,25,15,75,25,53,75 38,21,75,38,26,75,38,48,75 51,30,75,51,37,75,51,43,75 X܀v65"#C@E7D #w5O@p0? x(? p?A> >@@x?~0Ç<">">x?8`??@@??>>D|D|??8PpPp   ~p(8(8? P@?  P@@h??">">8h????@@h???`h??D|D|<8PpPph??  0p(8(8h??? h???pp@?  h??@88D@@xn??"`~?? 1?  ??    p?8h??  ?ph??  ?!??~0@@h??  @@G8?x">">h??  x`?<h??  PpPp??h??  (8(8??8D|D|h??    h??    8h??  ph?? p ? @@h?? 0 @@@8?">">h?? 0 |?|h??  PpPp?`xh??  (8(8<~pD|D|h??  0  h??    8h??  ph??  @@h?? x @">h??  ph??  h??  h??  h??  h??  h??  O@p0h??  ? x(h??  ? p?h??  A> >h?? x @@x?~0Ç<h??  ">">x?8h??  `??@@h??  ??h??  D|D|??8PpPph??    ~p(8(8h?? ? ? h?? 3 @?  h?? 3 @@h?? 3 ">">8h?? 3 ??@@h?? 3 ?`h?? 3 D|D|<8PpPph?? 3   0p(8(8h?? 3 ? h?? ? @?  h??  @@xn??  `~??  1?  ??    p?8h??  ?ph??  ?!??~0@@h??  @@G8?x">">h??  x`?<h??  PpPp??h??  (8(8??8D|D|h??    h??    8h??  ph??  ? @@h?? ` @@@8?">">h?? ` |?|h??  PpPp?`xh??  (8(8<~pD|D|h??  0  h??    8h??  ph??  @@h??  @">h??  ph??  h??  h??  h??  h??  h??  O@p0h??  ? x(h??  ? p?h??  A> >h??  @@x?~0Ç<h??  ">">x?8h??  `??@@h??  ??h??  D|D|??8PpPph??    ~p(8(8h??  ? h??  @?  h??  @@h??  ">">8h??  ??@@h??  ?`h??  D|D|<8PpPph??    0p(8(8h??  ? h??  @?  h??  @@xn??  `~??  1?  ??    p?8h?? < ?ph?? ~ ?!??~0@@h?? f @@G8?x">">h?? f x`?<h?? f PpPp??h?? f (8(8??8D|D|h?? f   h?? f   8h?? f ph?? f ? @@h?? ~ @@@8?">">h?? < |?|h??  PpPp?`xh??  (8(8<~pD|D|h??  0  h??    8h??  ph??  @@h??  @">h??  ph??  h??  h??  h??  h??  h??  O@p0h??  ? x(h??  ? p?h??  A> >h??  @@x?~0Ç<h??  ">">x?8h??  `??@@h??  ??h??  D|D|??8PpPph?? `   ~p(8(8h?? ` ? h?? ` @?  h??  @@h??  ">">8h??  ??@@h?? ` ?`h?? ` D|D|<8PpPph?? 0   0p(8(8h?? 0 ? h??  @?  h??  @@xn??  `~??  1? ??"  p?8h??@88D?ph???pp?!??~0@@h??@@G8?x">">h??x`?<h??PpPp??h??(8(8??8D|D|h??  h??  8h??ph??? @@h??@@@8?">">h??|?|h??PpPp?`xh??(8(8<~pD|D|h??0  h??  8h??ph??@@h??@">h??ph??O@p0? x(? p?A> >@@x?~0Ç<">">x?8`??@@??>>D|D|??8PpPp   ~p(8(8? P@?  P@@h??">">8h????@@h???`h??D|D|<8PpPph??  0p(8(8h??? h???pp@?  h??@88D@@xn??"`~?? 1?  ??    p?8h??  ?ph??  ?!??~0@@h??  @@G8?x">">h??  x`?<h??  PpPp??h??  (8(8??8D|D|h??    h??    8h??  ph?? p ? @@h?? 0 @@@8?">">h?? 0 |?|h??  PpPp?`xh??  (8(8<~pD|D|h??  0  h??    8h??  ph??  @@h?? x @">h??  ph??  h??  h??  h??  h??  h??  O@p0h??  ? x(h??  ? p?h??  A> >h?? x @@x?~0Ç<h??  ">">x?8h??  `??@@h??  ??h??  D|D|??8PpPph??    ~p(8(8h?? ? ? h?? 3 @?  h?? 3 @@h?? 3 ">">8h?? 3 ??@@h?? 3 ?`h?? 3 D|D|<8PpPph?? 3   0p(8(8h?? 3 ? h?? ? @?  h??  @@xn??  `~??  1?  ??    p?8h??  ?ph??  ?!??~0@@h??  @@G8?x">">h??  x`?<h??  PpPp??h??  (8(8??8D|D|h??    h??    8h??  ph??  ? @@h?? ` @@@8?">">h?? ` |?|h??  PpPp?`xh??  (8(8<~pD|D|h??  0  h??    8h??  ph??  @@h??  @">h??  ph??  h??  h??  h??  h??  h??  O@p0h??  ? x(h??  ? p?h??  A> >h??  @@x?~0Ç<h??  ">">x?8h??  `??@@h??  ??h??  D|D|??8PpPph??    ~p(8(8h??  ? h??  @?  h??  @@h??  ">">8h??  ??@@h??  ?`h??  D|D|<8PpPph??    0p(8(8h??  ? h??  @?  h??  @@xn??  `~??  1?  ??    p?8h?? < ?ph?? ~ ?!??~0@@h?? f @@G8?x">">h?? f x`?<h?? f PpPp??h?? f (8(8??8D|D|h?? f   h?? f   8h?? f ph?? f ? @@h?? ~ @@@8?">">h?? < |?|h??  PpPp?`xh??  (8(8<~pD|D|h??  0  h??    8h??  ph??  @@h??  @">h??  ph??  h??  h??  h??  h??  h??  O@p0h??  ? x(h??  ? p?h??  A> >h??  @@x?~0Ç<h??  ">">x?8h??  `??@@h??  ??h??  D|D|??8PpPph?? `   ~p(8(8h?? ` ? h?? ` @?  h??  @@h??  ">">8h??  ??@@h?? ` ?`h?? ` D|D|<8PpPph?? 0   0p(8(8h?? 0 ? h??  @?  h??  @@xn??  `~??  1? ??"  p?8h??@88D?ph???pp?!??~0@@h??@@G8?x">">h??x`?<h??PpPp??h??(8(8??8D|D|h??  h??  8h??ph??? @@h??@@@8?">">h??|?|h??PpPp?`xh??(8(8<~pD|D|h??0  h??  8h??ph??@@h??@">h??ph??`EDR|` Efv*oM 2 m HPHUBg?<JNA(m)m -:gS)@ -OK1PC#HNHx?<HNA@)@l/?<HNA)@h&@)@XЬl)@d)@`ARCpr Ѝ"QHNFALNHz2?< NA\pdAxr0XQ)K\NN.0>>JrBjNuHz?<&NN\CAp$L Qp NBlJpNNpMN9@pdAr 0Q0tr N9lNupealp`NuaNJHz?<&NNBWNANC2A@p222NrҌ0<NB0,rNurA9Ar`v C9Cr`rt9@9A9BNrrҌpsNB0,Nu9@N`rDҌpsNBNuC2 @ e @}bA@p222Nr,Ҍ0<NBNu Hn 2$4BBNuAd RdQRB BbABJk 0NuJBjBBXNu 0Nu 2$NuE`B<gJEgEjCDEDF Fe( F dF8BCHC` F0bFHC8v` HD8HDkDуdQRBNuDdBDA@kgAр[SBk0NuJlJBk&Nu0g H@rB JkЀ[` BbNuJBj prtNuHPAJgPpr$< _Nup _NtNu&8*JEgJBgJjBEB:HC҅H@:|ۆ҄ۆ<HC>H@ЃdHA@B@H@хk HAҁHAрSB BbNuNpNNuCDEJEgJBgJjBEBQ*HE?<>0rHGGdHGGdSWDуdi\?<>0rHGGdHGGdSWDуdiN?<>0rHGGdHGGdSW2 H@N?<,>CEdGH@0r`?<`JBgVB&8TTDуdQRBNuDAр&AdRAрAрDуNuprt|=|  g +g -f .g20  b 0e 9b da`RF` .f 0e 9b dajSF` Eg efX +g -f 0e 9oSH`00  b&Hz0  b E Do`HJjDDDS4</NJFkSFk&aQN`Ha"FFaQL8Np6.JgtBnNupr$<NuJBk4<rpAC v JBgJjv-| Bb BkH>aaNRFBdL8?Np<JBga2SF Be BgQRB`ApdR e <rRF&0xafEv+0JFjDFv-Hƌd0BFHF 0HF0ANuprt|`2:HQ A dGe GbFGNu G0dFGHANu~NuHnr$g4jDk( b4<J@`@[H@0Nu4<Ѐ[Nu4<NuNuAd RdQRBBkBjDBJjDNupNufJj fJAkNupNdRdRrxaAffBWHNuJjDBDA@JBfprJjDEDD@JEfvxNuaغBffAVHNuCDEaEf fDUHNu]HNuCDEaEffDftNuJjtNupN&NAXJ@jNNu~c0NQNuaHQ` @gS@@CNu   aH@@`"aH@@`a0) 4a3B HA2;i`0^ M / hawA~FNuAXr%eee%NuA]NuA>A6HP 0 0 &0&?< NN\Hx?< NN\JfNu J@jD@vqapvN)@p `H@)@prtNAHplrtNB 2pNpNpapaprapalpalpalpaTpaTpaTBp'a?<NNT@B){L9|0<rtNpapap9@p`pvNv`v`vj`v `v`v`v`?aBp0,l 2Nua40,HNua*p0,l 4Nuaprt0,l 22,l 44,NuN9||BlBlrҌpsNBNu0<}N& ?<NNC`&?<NNT"@ C <}N`Na: @Jg,Af*EJ, ,F G"P0(1|J#HJ@NHD"NupJf`CfSHj-D@Hd0H@H 0H@0`fSC\fS , @a"C]fApNNNHP?< NA\NuH@aa/a a Nu@0 9c^Nu| PC>$Fehler # ][Abbruch]\f.B &lX)K\)ld` lp ,BQjNup(NXYp-KNu"l`Yd&-KNN@"l`YepN&#k"C-KN"Cփk փk2##`փk"`2`$Y8gHRDD*D%H8#$c2g# HRDD%H`p"l`Qd&&| NuN@"l`QepZN"X0gBPHR@@"D#NuN\NA9"NhNA4NhNpp@pW?<?<NN\NHxN(I|Wieviele Spieler versuchen|diesmal vier Steine in eine|Reihe zu bringen?HPN EINER |ZWEIr"_ N+@Npp@pW?<?<NN\NBmN -SWHfN"TNt;BNpANNANNA$NNHxA#NhNA&jNhNHxA'NhNHm$A "_NgN#(N4-NJBfN"NA,(NhNN"NHxA#NhNA&jNhNHxA'NhNHm$A "_NgN#(N`NNpp@pW?<?<NN\NHxHm$N( JA| NEIN r"_ N+@N -UWHgN#NB0p?A0NNN/-0pC~N\NN/-0pC~N\NNN|`NqNqN`Npp@pWBg?<NN\NNNN AdNNBmNNH +@D +@H +@LNNNHm -H"-D _NxN -L$VHfN&FNNJWHgNANNB0p?A0NNN -DN`H -0CNhN`L8NFpJBgp/ -DN`H -0CNhN`&<x*<NL8N@pJBgp/ -HN`H -0CNhN`&<x*<NL8NFpJBgp/ -HN`H -0CNhN`&<x*<NL8N@pJBgp$VHfN&:N -0CNhJWHfN&:N/-0 -dN`H <r$<L8NNC~N\HP -0CNh/ -0CNh" _NxN?<?< pr _Np NNpN pNNRN/-0 -dCNNt;BNN|`:NqN4-NJBgN&^N`NNNNNt;BNB0p?A0NNN -0CNhJWHfN&NBmNN|`NqNqN4-NJBfN'NN(; |Das Spiel ist|unentschieden ausgegangen!!|Noch ein Spiel?4C$N4NNNN AdNNB8NBlpKAlNNN/-lpC~NLCNhdWHpJBgp//-lpC~NLCNhdWHpJBgp//-lpC~NLCNhdWHpJBgp//-lpC~NLCNhdWHpJBgp$VHfN(N -lR+@8NN|`0NqN -8$VHfN,NS8NB0p9A0NNN?<?< -0C Nh/ -0CNh" _NN?<?< -0C Nh/ -0CNhN`H <r$<L8NN" _NN?<?< -0C Nh/ -0CNhR" _NNpN pNpNB <N NJ -0CNhN`vNBNNNN|`NqNpN pNNRNpNNpNpNprNN/-8pC~NLCNh^+@N/-8pC~NLCNh^+@N/-8pC~NLCNh^+@N/-8pC~NLCNh^+@N -N`H -N`L8N&<x*<N H -N`H -N`L8N&<x*<N L8NN~&<x*<NpN+@pN+|NBNA 0NA퀌C퀈  "NA NBA NN -AN\ -N`HA NL8ANNAN&<3338<4*<NNAN&<8<*<NN@AN䴁W?<?<NN\N?-?-?-?-~NN -pNNN`vNqNNHPA "_NpJBgp/N$VHgN+N`Npp@pW?<?<NN\NN |Spieler HP -dN`N"_NHPN(' hat|diesmal gewonnen!!|Noch ein Spiel?4"_NC$N4NNNNNpA8NNBlpKAlNNNBppApNNN/-l -pC~NLCNhSWHfN,N -lC8N @RN/-l -pC~NLCNhUWHfN,N -lC8N/p _NN|`|NqNN|``NqNBBNpC8Nh+@N+|lpKAlNNN -lC8Nh^HfN-PN -lC8Nh+@N+mlNN|`NqNqNBmN -WWHfN-NBppApNNN/- -pC~NLCNhJWHfN-N/- -pC~NL+@NN|`NqNqNN.NB0 <A0NNN -0C&NhCNhN`zNpJBgp/ -0C,NhC8NhN`&<x*<NpJBgp/ -0C2NhC8NhN`&<x*<NpJBgp$VHfN.Nt;BN -0C&Nh+@N -$VHg NZN.NN|`$NqNpA8NNBlpKAlNNNBppApNNN/-l -pC~NLCNhUWHfN/8N -lC8N @RN/-l -pC~NLCNhSWHfN/xN -lC8N/p _NN|`|NqNN|``NqNBBNpC8Nh+@N+|lpKAlNNN -lC8Nh^HfN/N -lC8Nh+@N+mlNN|`NqNqNBppApNNN/- -pC~NLCNhJWHfN0TN/- -pC~NL+@NN|`NqNqN -W]HfN3NBmNB0 <A0NNN -0C&NhCNhN`zNpJBgp/ -0C,NhC8NhN`zN@pJBgp/ -0C2NhC8NhN`zN@pJBgp$VHfN3|N -0C,NhC8NhN`&<x*<NpJBgp/ -0C2NhC8NhN`&<x*<NpJBgp$VHfN1N -0C&Nh+@NBmNt;BNN3|N -0C,NhC8NhU]HfN2NBppApNNN -0C,Nh/ -pC~NLCNhN`zNpJBgp/ -0C,Nh/ -pC~NLN`H -0C&NhN`L8N.pJBgp$VHfN2N -0C,Nh/ -pC~NL+@NN|`HNqNN3|NBppApNNN -0C2Nh/ -pC~NLCNhN`zNpJBgp/ -0C2Nh/ -pC~NLN`H -0C&NhN`L8N.pJBgp$VHfN3pN -0C2Nh/ -pC~NL+@NN|`HNqN4-NJBg NZN3NN|`NqN -N`&<x*<NpJBgp/ -N`&<x*<N.pJBgp/4-NzNpJBgp$VHfN4N+mN/-pCNN/-pC~N\HP -CNh/ -CNh" _NxN?<?< 4-N&<x*<NNr _Np NNpN pNNRNNNNNB NB0pA0NNNN+@4N+@8N+@ E5 Paint Products Graphics Design ProgramF EF . E% SharewareF. E% FN E> This program is shareware which means if you like thisFoN  E? program or find it useful,then please send five dollors toF@ EF 8` E( Ahmad M.WardakF : E* 261 Woodside Ave.FA< E, Bridgeport,Conn 06606FN  EFJ0 E; For instructions please read the PAINT.DOC file.FN@ E? If you have any comments or questions you can leave me mailF8P E( at GEnie:A.WardakFBM! !!p!p!H!H! ! F.F 0 Disk Functions - +1F { FF)!)Deleting file .PPT,.PNT or| .LST!!.PPT|.PNT|.LST!ZF E\*FF iZFnE\*.PPTF  FE i$ZFFE\*.PNTF  FE iBZFFE\*.LSTF  FE { Fw f!!Fl ipF-*F F* { FwD)!+This will destroy the file| forever !! OK|Cancel!ZFZ iZFiAF F*|F.F| +F! { FX)!:Saving file as a .PNT file or|as a .LST file or as .PPT...!!.PNT|.PPT|.LST!F jdF M+F F% jzF M'F F jF MF F.F ++F { Ff\*.PNT!!F jF-'F F'M,.PNT F kN F H)!0 File Exists!|Do you want to overwrite it?!! OK|Cancel!aF kJaFx-'F F. F. 7O!M!FM! !zF08MF'|FF.F +F { F:)!Loading .PNT or as .PPT...!!.PNT|.PPT|CANCEL!FP kFgM*F F* kFgM)F F).F) +FMFu { Ff\*.LST!!F lDF-)F F)M,.LST F lƆ FxH)!/ File Exists|Do you want to overwrite it?!! OK|Cancel!aF laFl-)F F)AF F)}F 7o!M!F6M!-Rem Paint Products Graphics Design ProgramF &M!Rem Copyright (c)1987F$M!Rem Ahmad WardakF M!'F-<M!3Read Clip_len,Colr_len,Clip_width,Clip_hite,Res_picF"M!For I%=1 To Colr_lenFM! Read RdFoM! Colr$=Colr$+Chr$(Rd)FM!Next I%FCM!For I%=1 To Clip_lenFM! Read RdFo"M! ""$="" $+Chr$(Rd)FM!Next I%F$.M!%' Places the picture in x,y position F4.M!%' F4M! Put 10,10,""$F=.M!%' ___________________________________F4 M!'F=@M!Data "A6 ","A6 ","A ","A "," FM! ' Color DataF EData FoEG6 FEA7?@@ ,F ovFE?@@6  FM!FM!' Picture DataF EData FEFEF|Fa p6 F-F Fp`4FtEA7?@@ ,F 4F4F pX6 FE88FF FEpFE?@@6  FM!F EData FEF-Fa|Fa8MF)|F}F.F|+'F.MFEF-f\*.PPT!!F pF-F FM,.PPT F qj F H)!/ File Exists|Do you want to overwrite it?!! OK|Cancel!aF q`aF -F F/AF F/}F 7O!M!FuM!6 !!FM!z !6 F!8MFzEFEF|F}F.F| +*Fi { Ff\*.PNT!!Fa qF-(F F(}F 7i!M!FE_z!M F,8MFz}F@!z F%!!F!0! !GF!z!w!F $>!z!w!FT$P!!&!F-$P!!&!F$R!!%!F$4!!p!F $4!!p!F $!!*!F $!!*!F !F&'p!!Set PreferencesF.D'\!<!. Line Fill TextFD'\!.!. Line Fill TextF*' !p! TextF' !p!StyleF '\! ! OKF':! !CancelF%E F&EF'E(F)E*F+E,F-E!F.EFcEdF ,F((!*!!,F'R!!SizeF F,((!*!!PF'R!!,F FM7FM6FM8FF!ERFS F " ! !F8    ** F XF4dF Td@FdEF FE F F5dF dF dE@@F FE FM6F F8 B R PP %%  F Ft0!F (FEF FE FE 8F1!F 4FE((F FE FEM6F F8   PP ""  F F0!!F !@F!EF FE FE F1!!F !F!E@@F FE FEM7FF F8  Y PP ww  F ZF0*!F V*F*EF FE FE F1*!F *F*EF FE FEM8FF F8 8 R 88 %% \\F F0!F FEF FE FE .F1!F *FEF FE FEM6F F8   88 "" \\F F:4 F  F: EF FE FE F:5 F  F: EF FE FEM7F F8 l Y 88 ww \\F 6F@4(F* 2(F@(EF FE F bF@5(F ^(F@(EF FE FEM8FF F(8  > zz ww F F|4,F ,F,EF FE FE FF5,F ,F,EF FE FE%!!F$>!|!w!FT ,F(!!!PF'R!!,F-1F FE((!*!!,F'R!!SizeF1|F { F F!F  P  && SBP F- F F:  4  pp F E%FE&F(E'FF*E)FF,E+FF!E-FFE.FFdEcFF- Fo F FF! |F%!!F$8!8!|!F 8!8!!``FHM!H! !p!p!H!8!J!p F.F+8FF%!!F$Z!:!w!ZF*$Z!T!w! F$>!|!w!FT((!*!!@F-'_!|!StyleF'_!P!ColorF P,F((!*!!,F'R!!SizeF ~F,((!*!!PFF'R!!,F F { F.F8+7F%!!F$!:!"!ZF$!T!"! F % !!!F&!pF&!HF { F.F7+6F%!!F$!!)!F$T!T!$! F$T!:!$!ZF#F $d!!F$\!t! !tF$\!J! !JF$! !%! F { F.F6+!F-CE F  E _________F F{CF E ---------F F{CF E F F{CF DF E Graphics+F E Circle Fr  E Draw Fr( E K-Line Fr0 E Line Fr8 E Ellipse F @ E Spray Fr E Graphics F DEF-#F F DF EGraphicsF  E Box Fr  E CopyF ( E Erase Fr0 E Fill Fr8 E Text Fr@ E Paste Fr E Graphics+ FDEF F#|F F.F! +, FEC@. F- FFE?@@6 F EF $F =@ F-!6 ! EFS FE?@@ F FE.F,"+!!!!!! ! ! F h! ! !!F!!F#F$!!F%!!F$!!F(!!!@FF! M!!!!!! ! ! F*@! ! @@!  Fg$!!F! ! !  F$!!F*@! ! @@!  F E F! E  F!'  ! ! F@'  !  ! F'  !  ! F'  ! pp! F$'  !  ! F$'  ! HH!  F$'  ! pp!@ F$'  !  !` F$'  !  ! F$'  ! 44! F$'  ! HH!  F$'  ! \\!0 F$'  ! pp!@ F$'  ! !P F$'  !  !` F$'  ! !p FFF ZRSBP FpFFZ M!!!!!! ! ! F j!!!!!! ! ! !FF F*pp F!F.F+Fj!!+!"!e!fFFF!F%!!F!0! !GFEE F E F E FF%!!F$ !p! ! FE$p! ! !CFE$\!H! !>FjkEFPMFF dF%!!F $a!p! !4F$@ !p! !4F$\!H!W!>F(!!!@F!F$'z!! OptionsF(!!!@F'!!ClearF '/!!UndoF('z!D! Save LoadFM&'z!l! Help InfoF('z! ! OK CancelF$p! ! ! F$p!4! !HF$p!\! !pFn$p!! ! Fn$%! !M! F$%!4!M!HFn$%!\!M!pFn$%!!M! Fn %=!!F!$p!!M!4Fn$r!!L!2Fn&! FT&@!D!@ !?!2FF " ! !F: B p 44   HHFM;FP F:  % 44 MM HHFM>FP F8 l p  MM 44F F4=F =F=EF FE FE F5=F =F=EF FE FE %=!!FF&! F#F$r!!L!2F { F F:  %  MM  F-F F8  p \\   ppF { Fi2M< --Click mouse to see next item--!44 F.M<CLEAR: Clears the work window!> F:M<)UNDO: Puts back the tool that was cleared! FDM<2SAVE: Saves the tool.It must be made up of 1 color! F:M<)LOAD: Loads a graphics tool to the editor!* F:M<(HELP: Explains all the options available!** FHM<6INFO: Shows the name of the program and the author(me)!HH FRM>JF,2Fb FF|FFFF j!!F6M!\!!p!p!!! !G F.F +RF { F.F+2Fb& PHPRQ>FE#PH FE#QH F R@ JF @ EF F R@ JF @ EF F F,3F F.F+3F @ F @ uF%!!F<L!L!X!XFi F#Fj!F F @ JF%=!!FF<L!L!X!XFi fF%=!!F<L!L!X!XFi F#=Fj!F F.F+>FP h!e!fFFf\*.SHP!!FF6 F 6 JF \ JF 7I!M!F :M!!!"F:M!#F:M!=FEGpFr :M!e!fFEGxFr ve # JFeEe # F@ EFF F@ EFF F f # JFfEf # F= @ EF F @ EF F :FE FE8MF @!D!2FuEFNEGxFrDEGpFr,3F 4FG  FGuEF F&)!File does not exist.!!OK!,Fo F! F!.F!+;F= h!e!fF=f\*.SHP!!F F-9F F9M,.SHP F J FoH)!/ File Exists|Do you want to overwrite it?!! OK|Cancel!aF# @aF -9F F9AF  F9}F 7O!M!FM"!FM""FM"#FM"=F$EGpFreEFEfEF EGxFr @ JFeEe # F Fe @ JFfEf # F= FE FM"eFM"fF F8MF9|F}F.F+4F { FFFE "!!F!!!@FL!!!@FL F@!!!`F  F RF.F.F"+A!!!!!! ! ! F!F !F!!F@!F!F ! F@! F`! F rAF s# F F s# F F.F+FE F  FrJ)!3This program requires|medium resoultion...Oh no !!!!!GFA|GEM!F FqF! FhF F! F|B*@ !@ !  !pp FDEFEFEF EF!EF=EF(EF*EF,E@@F-dEFpEFBE``F EDeskFF" E About Paint Products Fa" E------------------------Fk  E1F E2F  E3F@ E4F` E5F E6F EF-  EDiskF-0 E Save file... F@ E Load file... FP E---------------F` E Delete file Fp E---------------F E Exit F EFx EGraphicsF  E Box F   E Copy F ( E Erase F 0 E Fill F 8 E Text F @ E Paste FFH EFaP EOptionsF"X E Clear FF&` E Graphics editor F."h E Paste tool Fr"p E Set Preferences FF x E Screen two F E Graphics+ F EFu EFo  EFc6!`!`!`F6!`!!F6!!`!F 6!!!F >d}f649(Ӧ}42A*}&}N:6N:2; !  ֚(opqysd}{kxrpiwHPb^u0(e*b*i~vwZ}yswl s}k2|z^vVprqjtuh\>,N:` Paint Products Graphics Design Program By Ahmad M.Wardak Files PAINT.BAS...........Main program PAINT.DOC...........Instructions (this file) PNT_LOAD.LST........Shows how to load an entire picture or a picture clip to to GFA BASIC. Shareware ----------- This program is shareware,which means if you like this program or find it at least useful then,please send 5 dollors to the following: Ahmad M. Wardak 261 Woodside Ave. Bridgeport,Conn 06606 If you have any questions/comments you can leave mail at Genie:A.Wardak -------------------------------- The following will explain all the options available in the current version of Paint Products. Desk ------ About Paint Products... Shows the name of the program,author and the version number. Disk ------ Save File... Saves the whole picture or just a part of it. After you have chosen this option an alert box will appear asking for what type of picture it should be saved under. The options are: .PNT Saves the entire screen .PPT Saves a part of screen specified by the hair/ cross instrument. .LST Saves a part of screen specified by the hair/ cross instrument as an ASCII file which can be merged into any GFA BASIC program. Note: This option will save screen the that you are currently in. Load File... Loads an entire picture or just a picture clip. After you have chosen this option an alert box will appear asking for what type of picture file to be loaded. The options are: .PNT Clears the screen and loads the entire picture in the current screen. .PPT Loads a picture clip on the current screen. Delete File... Destroys a file from the disk permaneantly. An alert box will appear for confirmation. Exit... Lets you exit the program. An alert box will appear asking if you really want to quit.Choose 'Editor' to return to GFA-BASIC. Graphics ---------- Box... Draws a box on the screen.It uses the currrent line color,style,and width. Copy... Copies a part of the screen into the buffer. Erase... Erases an area on the screen. Fill... Fills an area with the current fill color and pattern. Text... Allows you to add text to the picture. A dialog box will appear,just type what you want and press .Text uses the current text color,style and size. Paste... Pastes anything that is in the buffer on the screen. Options --------- Clear... Clears the entire screen. An alert box will appear with the following options: Yes : Clears the screen No : Cancels the operation Undo : Puts back the screen that was cleared. Graphics editor... This will allow you to make your own graphic tools or just draw something in more detail. This tool has its own help menu which explains all the options available. Paste tool... Pastes anything that was created in the Graphics editor. Set Preferences... Allows you to change the line,text,and fill attributes. You can adjust: - Fill pattern(24) and color(4) - Line width(8),style(6),and color(4) - Text style(32),size(32),and color(4) Click left button to go up one or right button to go down one. To reset the setting,click on the 'Cancel' button.To exit the dialog box click on 'OK' or press the key. Screen Two There are two screens available.This option toggles between them. Graphics+ This option will change the menu title 'Graphics' to 'Graphics+' and will make available the following options: - Circle Draws a circle.It uses the current line color,width,and style. To stop drawing,press the right mouse button. - Draw Draws a dot.It uses the current line color. To stop drawing press the right mouse button. - Ellipse Draws an oval.It uses the current line color,width,and style. To stop drawing,press the right mouse button. - Line Draws a line.It uses the current line color,width,and style. To stop drawing,press the right mouse button. - K-line K-line allows you to draw a series of connected lines by repeatedly clicking the left mouse button.The ending point of one line becomes the starting point of the next line. To stop drawing lines,press the right mouse button. It uses the current line color,width, and style. - Spray Spray function.Uses the current color. To stop,press the right mouse button. Note: To get back to 'Graphics' go to the menu titled 'Options' and select 'Graphics'. ' ________________________________________________________________ ' | Filename$......................Name of file you want to load | ' | Procedure Load.ppt.............Loads a picture clip | ' | Procedure Load.pnt.............Loads an entire picture | ' ' Procedure Load.ppt Open "I",#1,Filename$ Input #1,Clip_len,Colr_len,Clip_width,Clip_hite,Rez_pic Pic$=String$(Clip_len,0) Colr$=String$(Colr_len,0) Bget #1,Varptr(Colr$),Colr_len Bget #1,Varptr(Pic$),Clip_len Close #1 Void Xbios(6,L:Varptr(Colr$)) ' x,y cordinate Put 0,0,Pic$ Return ' Procedure Load.pnt Open "I",#1,Filename$ Pic$=Input$(32000,#1) Close #1 Void Xbios(6,L:Varptr(Colr$)) Sput Pic$ Return `5   o"h#6#6#6,Oc.N//Bg?<JNA Bb36N$N\NV?<NMN^NuNV?<NAN^NuSOURCE_LIS?Hz~/,HNVAH-HPN4N=@~N2Zp??Nu:\*.*LOAD_LIST ?Hz~=/,HNVAH-HPN4NP=@~>N2Z0.@A??Nu:\*.*DECISION ?Hz~X/,HNVA-HPN4?<N~YBgHy8ZN ~Z/98ZN~[/98ZBgN3:b~\/98ZNJ~]/98ZN ~^09:br Af~_~`N~a~b`P~b09:brAf~c~dNf~e~f`0~f09:br Af ~g~hN!~iN4 y6N~j~kN^,_X>NuAX#6A60B1|A701|A:d01|A;01|~pN!fJ@k~q~rCO$O p QN @eV~s~tC:E9`/p.Q~uA9`O"Op?"Q?<N3:`~vN!~w y6N~x~yHy:dHz?<N$~zN J@fD~{~|CE8^0p/Q~}A8^O"Op?"Q?<N39^~~~N><Hz>?< N1x><><Hy;N'Hy:dN'Hy7N'NvPASCAL.PRG[1][Your Printer is not On-Line....][ It's On! ]PRN:[1][The File 'LINENUM.RSC' is missing][ Darn! ]LINENUM.RSCNu/,HNVN4AJ-Hp=@"n 0.r1JAV0.rdA]CBd0.R@=@`"n 0.S@@N^,_ _XN/,HNVfN4A6-H"nE4p$Q"np)R@rA"n p)=@Bn0.@eR0.J@W"n 0.r1p\@WÄC"n 0.r1p:@WÄCBd p=@` 0.S@=@`Bn0."n r)Al20.R@=@0.R@=@0."n 2.t1A`0.@0.R@rAHnN$-@lHnN$-@p?<ZHnHntHnlHnhN#,0.vJ@f Bn`p=@HnN>HnN6"nE2p"Q"n E2p"Qp.=@Bn0.@eR0.J@W0.rA0p\@WÄC0.rA0p:@WÄCBd p=@` 0.S@=@`p=@p.=@f0.nfn,0.R@=@"n 0.2.tA0Rn`"n 0.@0.N^,_ _PNNu/,HNVnN4AL-Hp. R@rA Hn N$-@r?<nHnHnzHnrHnnN#,0.zJ@V=B0.N^,_ _ON/,HNVnN4AD-H=n=n ?<pHnHnzHnrHnnN#,0.zJ@g -nn`B .N^,_ _XN/,HNVN4A-H"n / Bg?.Nz"_"N^,_ _\N/,HNVN4A-H"n / Bg?.NF"_"N^,_ _\N/,HNVtN4A -H?<oHnHnHnxHntN#,N^,_NuNu/,HNVN4Aj-H0.T@=@?.N-@/.?I;/??<NM(PRDQNu |a<aHy;?<N"N!xvI;/??<NMPRDQBgNA |z` |` |aJah o`< |V` |`a. |na8 oaa: o `/ |a _/ |a _"f/ |a _`V"nH .g |`Jk |` |aL/ .f^Xt AH aLQa/ |at&<'HǏf CgJfr `t20/ax$HG faf | aP _a`/2<$aR _tv"0 :e^H a2LYCQNu3;/ |a _?ga `2Nu<|H瀀09;Ry; |;LNuBus errorAddress error accessing Attempt to divide by zeroValue out of rangeInteger overflow[3][][ Abort ]Error in Called by PROCEDURE FUNCTION MAIN PROGRAMat line at PC *unknown*Nu/,HNVrN4?<MHnHn~HnvHnrN#,"n2"n2"n2"n 2=n~0.N^,_ _ON/,HNV0N40. rAg p=@2` Hn0Hn0Hn0Hn0Nl=@pd=@2=n p=@ n n0.@rA1Rn`p=@?.2Bg?< BgHnHnHndHnLHn4BgN#=n0.N^,_ _TN/,HNVN$n=@?.N$d=n ?<fBg?<BgHnHn"n/ Hn"n/ BgN#?.N$dN^,_ _O N/,HNV8N$n=@:?. N$d?. HnlHn g8 fp@`*S@rG   e gRAQJ9=g`tJ)f8a J9=g| _0< Hy'3|NAXNu _4` _t6 Bo r aSB`2aNH?) _r ar a/L?)Nu _r aN _4` _t"x0HgJJjDxvC*:zp cRЀ`|e W0R"f`6 _4` _t2xJAjDAxvC*:p0 2H@0RJAfJg<-RBlCSBr aQSCaQN _4v` _46"_JBjtJCkgCe4`BSCr aQSBk aQN _v` _60@d C)]t`C)XtJCgkCe4`BSCr aQSBavQNFALSETRUE _6kfv2_t Cc"4YBv` _6kfv"_t Cc4QBvSBkr a(QSCC" A0 9c^a JgYC`NH )"oA/ N*:L )NuBy6(_ _/ C( g  f4t4(H / /?(?<@NA LJkn gffNu4(SBraQNu(gN fH ??<NAXLNu f H ??<` f H ??<` f NuHy+-` Hy+0< LN"REWRITE required prior to WRITE or PUTDisk or directory fullBy6 _$_"Wp )f)H/ N-L4NH/ N-Lp)`By6 _"WJy-ff8J)f )f)H/ N-L )g)J)fJgBy-f )g J)fBiNz`zBy6 _$_"WptvH/ Hy=&a029=&XL- -fJf^p`4  fJg*`N0eH  bBԂi\(؄iV؄iRԄiNԁRCJ)f  g )f) 0e 9c~Jg&JgDJf 6Höf4N$NHy-0<` Hy-k0<N"By6 _$_0"Wt )gJ&JRJ)f4H/ Hy=&aP29=&XL )gJ)f RBBe`ưBe`N&|=(H/ ?< NA\Hy-h?< NA\LS@kQ3-fN Bad digit in number encounteredOverflow during READ of numberBy6(_ _/ 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<` Hy.0< LN"Reset required prior to Read or GetAttempt to read past end-of-file 6Nu#1 _ g6e6d 91 NHy1$`Hy10N"t`t _"_0gR@| e.G1$S" ghjebb"*f&"`v&A%S"`l&J`ذ|gb*|f8"90g0$A#0`""91g$A#1`"91g $A#1"`"E6&R"$b Hy1N"Jgr"QHd2S@k"QN _"_0" g6e6d gR@ @mz @ e@E1"fB3@B$`\&A2+@ef "'I`F"3@B$`8$K`ư|f"1#1` |f"1#1` "0#0NHeap overruns stackPointer NILPointer not in heapH`?<,NAT24HAI<Ёr jЂLNu&_4"_jtE>J  SB*(y6/,,/  Hy>JUBkQBBg?<KNANH>* _0"_jp&y6r+t$IS@k,RB  WfSBkBkG$I0(K Vg RQBg`?</L>*NuH> _0"_e /L>NuHy4`N"/B9>/|>NuH> _0 @f0"|>>p` "_J@jpE>r4@ BbBS@kQ/L>NuH> _4SBkt82$_rAdd0 @f0"|>>p` "_J@jp6ADb6CG0IS@k$eQ/L>NuH> _4k2SAk0"_p6B@bE0)CS@kQ/L>NuH> _2$_r0 @f0"|>>p` "_J@jp@kS@kv&J$IRC4(K Vg RQBg`?/L>NuH> _4kF2SAk>0 @f0"|>>p` "_J@jp6B@bE>SBkQ/L>NuString overflow _ hNVf 0(gr"OD@Hd2S@k "Q` _"y6e Hy4N"N#?#? .f -|4`-|4 nNн?f y?NStack overruns heap096Nu _36NBy6Nu[3][][ Abort ]Copyright 1986, CCD and OSS, Inc. .H    @  (>   & d&$*.444"0.4\.0DX<"$>,$8(l*lrh\,&D0T>0,8&&,&$$6       8@F D"2 T &( 0&  >         HB@6 2J X D   ( 0"L2 T  <   , F"L  ( *@ B @ B  jj$ASCII Text and Source Code Line NumberingCopyright 1987 RSI Software Systems2429 N. Richey Blvd. Tucson, Az. 85716 (6O2) 881-O539Share Ware - by John BucknerIf you like this Software, feel free to send a donationto the above address. Portions of this software Copyright 1986CCD & OSS. Used by permission of OSS .Source CodeASCII TextCancelWhat type of File do you wish to Number?---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------v98IJAKrs')BCDBEBr3$)N'* )0  Bt  @  @!     020 N0j.  n..  nXREF2 BASnT:XREF2 DOCnXREF2 LNMn(RXREF2 XRFnGfABASICf>&88:67T8P89 9(9L9R9R9^9999YXFCLNUMDP.PATHP.NAME QQQINPUTREAD QQQINPUTPOS QQQINPUTLEN QQQICURLENLIMOSWITCHMID2MID1OEIWORD_LIST_LIMITOLDRREF1REF2BALSTLNMXRF TEMPFILE1 TEMPFILE2 TEMPFILE3CWORDW1W2W3LNUMPATHNAMEDIRPTHJUNKTDRIVETRIVEX QQQINPUTBUF TEMPFILE4OLDCUUWORDREF1VAR1REF2VAR2YOLDREFOLDRS1AS1BS2AS2BREFVARRPTFORMNAMFORMNUMFORMP.PATHP.NAMEXYP.DIRCLNUMDLNOXLNOY QQQINPUTLEN QQQICURLEN QQQINPUTPOS QQQINPUTREADPASSLIMCTLOHIMID1MID2MIDDLEBNDBMDHBNDDRECTEMLOB QQQINPUTPUSCTINPSWTRCNTSEGWORD_LIST_LIMITMIDSTCLENLLOKFOUNDEXITSIDE2EOF1EOF2OSWITCHCOMPOFILEF1OCF2OCF10CWORD_LIST_READCHARFNABSRCAT CHARCLASSCTYPEREFVARSRCHOLD_WORD_LISTSRCEOFONEEOFTWOEOFFOUREXAMINE_SOURCE GET_A_CHAREXITDEAL_WITH_WORDTAKE_APART_FILENAMETAKE_FILENAME_APART GET_FILENAMESDELETEFSORT_REFERENCESENDSORT_REFERENCES SORT_ONE_PASS SORT_IN_MEMMERGE_SAME_VARFINISH_THE_LINESORT_OUTEOFONEEOFTWOERRONEERRTWOCOMBINE_REFERENCESCOMBINE_REFERENCEERRTHREE FORMAT_REPORTERRFOURREAD_WORD_LISTARGERLERLTRGTGFA Basic cross-referencer &********** LEGAL NOTICE ********** o$Copyright (C) 1987 by Don Edwards BPermission is granted to distribute this program without charge (or for reasonable media charge only. hFPermission is granted to put this program on any computer bulletin gJboard for downloading without charge or for normal access charges only.  oAll other rights reserved  u6"GFA-BASIC" may be a registered trademark owned by <Michtron, Inc (US) and/or GFA-Systemtechnik (Germany). It Bis the name of a computer program written by GFA-Systemtechnik tBand distributed in the US by Michtron, which program is covered by US and foreign copyrights. $********** END NOTICE ********** t *What this program does:  hDThis program reads a GFA Basic program (Ascii save) and produces eFtwo output files. The first is the listing with line numbers added; Bthe second is a list of variables and procedures, in alphabetic 2order, with the line numbers of all references. B(It also uses 4 temporary files - RAMdisk STRONGLY recommended)  rmain procedure  EFYFa clear screen iMF MFM FMFFMFrqF+FF:This procedure provides a large buffer for character by >character input. It also cooperates with the next procedure 8to allow quick input of the rest of the current line c o  F  EF EsM Fg EFF EF F "  F Euv!  !  F1 ! F EF E_ !M F FE4 F E?@ @ F E F E7 FFEM!F.FE+ FZ<this procedure causes the rest of the current line to be rBskipped over and passed to the numbered file, without examining each character separately. t ahFZED @@BPP F ZF@5FM"?@ @ "F EFMF FM">@  "F E FMF  PF9M F F  F.F+F Dthis code reads the .LST file and produces a list of (line#, var) Hin a temporary file. (Note: "var" is anything that looks like a word oDbut is not a Basic keyword; it includes procedure names, function *names, and labels as well as variables)   7I!M!F 7O!M!F 7O!M!FEFM!#### !"F Reading Line "FEF EF"FMF EFin the following loop, C% contains the ascii code of the next char nC$ contains the character 6Cu$ contains the uppercase version of the character Fthese must ALWAYS be true at the beginning of a pass thru the loop n hF& AZF start of a word EF begin saving the word rM F MFF get the next character FEF4 #09 #AZ _.F2 E F add a letter, digit, underscore, dot i F* $%!:?F& E F add type char & terminate MFe get the next character tEF( F  character not part of a word nEF F F ZrM F,MF if staying, get the next character glFr FMFF VF  not a word e$ PF carriage return 4FF increment line counter t rM FMF discard linefeed $ rM F there is a next line a"M!#### !"F numbered file Y! "Fu"MF@ get 1st char of new line  FE F$ RF  not word, carriage return ( #09 &F  numbers F skip the number ZrM FMFZF Z##09 #AG HXO. F@F, NFk not word, carriage return, number " Fe double quotes F skip the quoted string t" xZrM F if file ends, stop MFFD PPFt until matching quote or end of line ( Fe skip closing quote aMF F< JF not word, carriage return, number, quoted string $ <!F on-the-line comment M FZ, FF don't know what it is - ignore it MFF F F F F F rM Fi8MF8MF8MF.F+FZ Fthis routine takes the word in Word$ and tries to find what it is. 8if it's REM or DATA, the rest of the line is skipped iDotherwise, we look through a list of basic keywords - if we find .the word, we're done. Bfailing that, we write a line to file 2 consisting of the line# (in lnum) and the word a E h!!#FI.E F  uppercase for faster comparisons l2 2 F first time thru - build the word list MF F REMDATAFAM FZ. "F" ", "F" F$rF sequence error must be fixed k FF.F now the words follow e4ABS,ADD,ALERT,AND,ARRAYFILL,ARRPTR,AS,ASC,AT,ATN :BASE,BGET,BIN$,BITBLT,BLOAD,BMOVE,BOX,BPUT,BREAK,BSAVE CDC:,CALL,CHAIN,CHDIR,CHDRIVE,CHR$,CIRCLE,CLEAR,CLEARW,CLOSE,CLOSEW 6CLR,CLS,COLOR,COS,CRSCOL,CRSLIN,CVD,CVF,CVI,CVL,CVS JDATE$,DEC,DEFFILL,DEFFN,DEFLINE,DEFLIST,DEFMARK,DEFMOUSE,DEFNUM,DEFTEXT :DFREE,DIM,DIM?,DIR,DIR$,DIV,DO,DOWNTO,DPEEK,DPOKE,DRAW FEDIT,ELLIPSE,ELSE,END,ENDIF,EOF,EQV,ERASE,ERR,ERROR,EVEN,EXEC,EXIST EXIT,EXP PFFALSE,FATAL,FIELD,FILES,FILESELECT,FILL,FIX,FOR,FORM,FRAC,FRE,FULLW GET,GOSUB,GOTO,GRAPHMODE IHARDCOPY,HEX$,HIDEM,HIMEM :IF,IMP,INC,INFOW,INKEY$,INP,INP?,INPUT,INPUT$,INSTR,INT KILL HLEFT$,LEN,LET,LINE,LIST,LLIST,LOAD,LOC,LOCAL,LOF,LOG,LOG10,LOOP,LPEEK LPOKE,LPOS,LPRINT,LSET ,LMAX,MENU,MID$,MIN,MKD$,MKDIR,MKF$,MKI$,MKL$,MKS$,MOD,MONITOR,MOUSE,MOUSEK MOUSEX,MOUSEY,MUL NAME,NEW,NEXT,NOT ,OCT$,ODD,ON,OPEN,OPENW,OPTION,OR,OUT,OUT? FPAUSE,PBOX,PCIRCLE,PEEK,PELLIPSE,PLOT,POINT,POKE,POLYFILL,POLYLINE E0POLYMARK,POS,PRBOX,PRINT,PROCEDURE,PSAVE,PUT OQUIT HRANDOM,RBOX,READ,RELSEEK,REPEAT,RESERVE,RESTORE,RESUME,RETURN,RIGHT$ RMDIR,RND DSAVE,SDPOKE,SEEK,SETCOLOR,SETTIME,SGET,SGN,SHOWM,SIN,SLPOKE,SOUND FSPACE$,SPC,SPOKE,SPRITE,SPUT,SQR,STOP,STR$,STRING$,SUB,SWAP,SYSTEM $@TAB,TAN,TEXT,TIME$,TIMER,TITLEW,TO,TROFF,TRON,TRUE,TRUNC,TYPE UNTIL,UPPER$,USING TVAL,VAL?,VARPTR,VOID,VSYNC TWAVE,WEND,WHILE,WRITE XOR //,end of basic keyword list t+F  >this routine gets all the filenames needed for this program  h& Select Ascii-saved Basic programF EA:\*.LSTFEF\EFFE f!!FF 4FqF F N FEF rF (doesn't exist, try again)Fo FEM!! F FFYFE clear screen again gEFFEC@. F FFE.lnmF FE;@ lnmF FEE*.LNMF"Select numbered-program fileFF f!!FF LFqF FYFE " "FFM!! FEC@. Fn ¤FFE.xrfF ºFE;@ xrfF FEE*.xrfFSelect xref fileFi f!!FF FqF FYF " "F " "FF:5Select DRIVE for temp files (filename doesn't matter)FM!! Fn f! !FM!! F$out of that, only drive$ matters Selecting temp files "FFF EF1AV@ F  FFEF2AV@ F  FFEF3AV@ F $ FFEF4AV@ F N F" "" "" "F.F+!! F >this routine examines the filename (with path) in pathname$ 2the path (up to final \) will be put in p.path i*the filename only will be put in p.name  hh!FEC@: FFEEF"EvD@@\ !D@@/ F ^F ŸFEFEF FFE;@ F\E>@ F! F.F+FF h@this is a utility routine, it deletes all the temp files this "program has left laying around.  rFnotes: (1) it assumes files are in the root of drive P:, my ramdisk : (2) it is dangerous - can easily delete too much  p:f* F Ap:f*FpF*.F+ F Dthis routine does some overhead for a merge sort of the disk file $containing the list of references  osorting - pass "FEF EFEFEF to free memory X F 7O!M!F create null file 8MF done with it FEM FF FAFrAFrAFr.F+ F h.this routine does one pass of a merge sort ,at present it's strictly a two-by merge. t h64Fr print pass# so user doesn't get too impatient Y! "F"0 EF initialize record and segment counters a!EF7I!M!F open files 7I!M!F 7O!M!F7O!M!F0EF haven't used the second output file yet ,EF switch for which output file to use * EF input record buffers not occupied  EFEFi no previous record nEFFE: " F should fill buffer 1, preferably from input 1 vLF ʶrM F:M!!F read the record 4 F count it d EF buffer now occupied , F  have to read from input 2 instead  rM F if we can :M!!F  read the record 4 F count it d EF buffer occupied  FE FE FE|FF. ˺ F should fill buffer 2 - see above fvLF ˊrM F :M!!F 4 F  EF ˶F! ˲rM F :M!!F 4 F  EF FE FE FE|FFvF normal error handling > ̼###  ###  F4have completed a "run", must switch output files n EF switch the indicator s4!F count the next run t&EF no previous record in the run EF  FET ͂ ## ###  # ## F"should write record in buffer 1 (M! F call routine to write it # EF now the buffer's empty r κF!T ζ ## ###  # ## F"should write record in buffer 2 (M! F call routine to write it # EF now the buffer's empty rHif both buffers are occupied or both files are at eof, should always l*be writing one of the two buffers out. l FE FErM rM #  Fm8MFw close all the files 8MF8MF 8MFrH!F ready for next pass 4H!F files 1&2 always input, 3&4 always output 8last pass had " " records in "!" segments! F.F +! F *output a record to the sort output file  u6EFa save "previous-record" stuff for future use EF( ОFs pick which file to write to 4EF at least two runs, we'll need another pass s(M"","Fi write to file 4  F"M"","F" write to file 3  F.F 2error (eof) routines for the above sort follow. +FFFF.F+FFFF.F r+FF r:this special eof routine provides a dummy value for the &combine logic in the next procedure  o E//FF.FF+F o0this routine reads the sorted references file 8and produces one record for each different variable. h n combining...F7I!M!F open files 7O!M!F$:M!!F  read the first record "EF clear to start the loop 0//F watching for special eof marker vLF provide for it f":M!!Fv get the next record &vF back to standard error handling ӔF if same variable n,E F combine the reference lists F not the same variable 2M"","F  write the "old" variable & list EF start on the new one dEF FEҖF and go on 8MF close files 8MF$H!F still want #1 to be input "AF get rid of unneeded file u.F+Fr >this routine reads the combined file to produce the actual lcross-reference report c rformatting reportF7I!M!F open files m 7O!M!FvLF! protect eof 2(E\ \ Fm formats for print using )E#### F`rM F thru the file :M!!F  read a record $$EF starting position in ref1$ o"%EF starting position on line ,.$6 F until done with references " d%`Fi line is full eMF end the line i%EF ready for a new line u FE& %Fy if at beginning of line (M!(!"Ff print the variable name "%E%6( F move ahead in line e0EF but only print name once per variable  FE2&ED$@@ F find the end of the next line# & א&F if there isn't a space, ,&E6 F use the rest of the references l FE$'E&$F how many characters? e,M!)!5?@$@' "Fa print the number l"%E%6) F move ahead in line e$$E&F move to next reference F*MF% end of a variable - end the line r`F*|F also come here indirectly on eof r8MF close files 8MFF AF get rid of temporaries l.F+Fr 4special eof routine for the final reporting phase  pFr.F(؊~Ē\ϖѨ(pFXREF2.BAS - A cross-reference utility for GFA Basic, written by Don Edwards Given a GFA-BASIC program listing (use the SAVE,A function in the editor), for example XREF.LST, it will produce a line-numbered listing (XREF.LNM for this example, unless you specify something else) and a cross-reference file (XREF.XRF), both on disk. The .LNM file is just like the .LST file, except it has a line number adding 5 characters to the front of each line. The .XRF file is formatted as a report, with the variable / procedure / label name in the first 20 characters of one line and line numbers in positions 21-60 of as many lines as needed. Operation: I like fileselector boxes. So when you run the program, you will be given a fileselector box and asked to pick out a .LST file to process. (Checking CANCEL will terminate the program.) Once that is done, two more fileselectors let you change the .LNM and .XRF files if you like. Finally, a FOURTH file selector asks you to identify the DRIVE (and folder, if you like) for temporary files. In this box, the drive and folder are the only things that matter - a filename given will be ignored, and in fact you don't have to give a filename at all! (Just click the OK box.) I strongly encourage you to put the temporary files on a hard disk or RAMdisk, this program is slow enough anyway. (If you like it but think it's too slow, I accept donations to my computer fund :-> ) Once that is done, it prints the names of 4 temporary files (not that you really care, it erases them when it's done) and goes to work. Expect messages from the following stages: Reading the source Sorting Combining Formatting the report And then it's done! (But don't hold your breath.) Hacker's notes: The "reading the source" stage has several things you may find interesting. There is, of course, a stripped-down parser to keep track of the current line as it identifies and gathers words, but throws away numbers, quoted strings, and other things. You may want to take a look at the character-input routine, which uses a 10K buffer, and the "skip-the-rest-of-the-line" routine (used for remarks and data statements) which has to cooperate with that buffer. Once a word is identified, it may be a BASIC keyword which we don't want to include in the cross-reference. A list of BASIC keywords is included into the program (in DATA statements, but it's read into an array) and a binary search is used to quickly look through the nearly 250 entries. The XREF program listing comes out with nearly 500 references, and there are larger programs. So the references are written to a temporary file, and the sort phase is a 2-way merge. This is a useful sorting technique for large files; sort temporary files (including the final output file) typically take a bit over twice as much space as the input. In this case, the input can be discarded after the first sort pass. For the theoretically inclined, a merge sort is among those which achieve theoretical peak performance - in practical terms, a 3-, 4- or more-way merge would be faster (as it would also be if the program kept more than two records in memory at one time) but would also be harder to program. The only fancy thing about the combining stage is that the line numbers, treated as numbers in the sort, are treated as strings and concatenated together with intervening spaces. The report phase is worth a bit of attention for those who haven't written reports (I've written too many, mostly in Cobol - blech!). An interesting touch is how the concatenated line numbers are spread out to be right-justified in 5-column fields. An indicator points to the leftmost digit of the number; from there Ie search for a space (or the end of the string), find the length, and use the VAL function to extract the number for a PRINT USING. Then the indicator is advanced. Nothing really fancy, just a lot of nitpicking details that have to all be right. 1 Rem GFA Basic cross-referencer 2 Rem ********** LEGAL NOTICE ********** 3 Rem Copyright (C) 1987 by Don Edwards 4 Rem Permission is granted to distribute this program without charge 5 Rem or for reasonable media charge only. 6 Rem Permission is granted to put this program on any computer bulletin 7 Rem board for downloading without charge or for normal access charges only. 8 Rem Rem All other rights reserved 9 Rem Rem "GFA-BASIC" may be a registered trademark owned by 10 Rem Michtron, Inc (US) and/or GFA-Systemtechnik (Germany). It 11 Rem is the name of a computer program written by GFA-Systemtechnik 12 Rem and distributed in the US by Michtron, which program is covered 13 Rem by US and foreign copyrights. 14 Rem ********** END NOTICE ********** 15 Rem Rem What this program does: 16 Rem Rem This program reads a GFA Basic program (Ascii save) and produces 17 Rem two output files. The first is the listing with line numbers added; 18 Rem the second is a list of variables and procedures, in alphabetic 19 Rem order, with the line numbers of all references. 20 Rem (It also uses 4 temporary files - RAMdisk STRONGLY recommended) 21 Rem Rem main procedure 22 Qqqinputread%=0 23 Cls ! clear screen 24 @Get_filenames 25 @Examine_source 26 @Sort_references 27 @Combine_references 28 @Format_report 29 End 30 Procedure Get_a_char 31 Rem This procedure provides a large buffer for character by 32 Rem character input. It also cooperates with the next procedure 33 Rem to allow quick input of the rest of the current line 34 Rem If Qqqinputread%=0 35 Qqqinputread%=1 36 Qqqinputlen%=Lof(#1) 37 Qqqicurlen%=-1 38 Qqqinputpos%=0 39 Endif 40 If Qqqinputpos%>=Qqqicurlen% 41 Qqqicurlen%=Min(Max(1,Qqqinputlen%-1),10240) 42 Sub Qqqinputlen%,Qqqicurlen% 43 Qqqinputpos%=0 44 Qqqinputbuf$=Input$(Qqqicurlen%,#1) 45 Endif 46 Inc Qqqinputpos% 47 C$=Mid$(Qqqinputbuf$,Qqqinputpos%,1) 48 Cu$=Upper$(C$) 49 C%=Asc(C$) 50 Out #3,C% 51 Return 52 Procedure Finish_the_line 53 Rem this procedure causes the rest of the current line to be 54 Rem skipped over and passed to the numbered file, without examining 55 Rem each character separately. 56 Rem Local X% 57 X%=Instr(Qqqinputpos%+1,Qqqinputbuf$,Chr$(13)) 58 If X%>0 59 Dec X% 60 Print #3;Mid$(Qqqinputbuf$,Qqqinputpos%+1,X%-Qqqinputpos%); 61 Qqqinputpos%=X% 62 @Get_a_char 63 Else 64 Print #3;Mid$(Qqqinputbuf$,Qqqinputpos%+1); 65 Qqqinputpos%=Qqqicurlen% 66 @Get_a_char 67 If C%<>13 68 @Finish_the_line 69 Endif 70 Endif 71 Return 72 Procedure Examine_source 73 Rem Rem this code reads the .LST file and produces a list of (line#, var) 74 Rem in a temporary file. (Note: "var" is anything that looks like a word 75 Rem but is not a Basic keyword; it includes procedure names, function 76 Rem names, and labels as well as variables) 77 Rem Open "I",#1,Lst$ 78 Open "O",#2,Tempfile1$ 79 Open "O",#3,Lnm$ 80 Lnum%=1 81 Print #3,Using "#### ",Lnum%; 82 Print "Reading Line "; 83 Lnox%=Crscol 84 Lnoy%=Crslin 85 Print Lnum%; 86 @Get_a_char 87 Rem Rem in the following loop, C% contains the ascii code of the next char 88 Rem C$ contains the character 89 Rem Cu$ contains the uppercase version of the character 90 Rem these must ALWAYS be true at the beginning of a pass thru the loop 91 Rem Repeat 92 If Cu$>="A" And Cu$<="Z" ! start of a word 93 Word$=C$ ! begin saving the word 94 If Not Eof(#1) 95 @Get_a_char ! get the next character 96 Do 97 Let Exit!=False 98 If (C$>="0" And C$<="9") Or (Cu$>="A" And Cu$<="Z") Or C$="_" Or C$="." 99 Word$=Word$+C$ ! add a letter, digit, underscore, dot 100 Else 101 If C$="$" Or C$="%" Or C$="!" Or C$=":" Or C$="?" 102 Word$=Word$+C$ ! add type char & terminate 103 @Get_a_char ! get the next character 104 Let Exit!=True 105 Else ! character not part of a word 106 Let Exit!=True 107 Endif 108 Endif 109 Exit If Eof(#1) Or Exit! 110 @Get_a_char ! if staying, get the next character 111 Loop 112 Endif 113 @Deal_with_word 114 Else ! not a word 115 If C%=13 ! carriage return 116 Inc Lnum% ! increment line counter 117 If Not Eof(#1) 118 @Get_a_char ! discard linefeed 119 If Not Eof(#1) ! there is a next line 120 Print #3,Using "#### ",Lnum%; ! numbered file 121 Print At(Lnox%,Lnoy%);Lnum% 122 @Get_a_char ! get 1st char of new line 123 Endif 124 Endif 125 Else ! not word, carriage return 126 If (C$>="0" And C$<="9") Or C$="&" ! numbers 127 Do ! skip the number 128 Exit If Eof(#1) 129 @Get_a_char 130 Exit If Not ((C$>="0" And C$<="9") Or (C$>="A" And C$<"G") Or C$="H" Or C$="X" Or C$="O" Or C$=".") 131 Loop 132 Else ! not word, carriage return, number 133 If C%=34 ! double quotes 134 Repeat ! skip the quoted string 135 Exit If Eof(#1) ! if file ends, stop 136 @Get_a_char 137 Until C%=34 Or C%=13 ! until matching quote or end of line 138 If C%=34 ! skip closing quote 139 @Get_a_char 140 Endif 141 Else ! not word, carriage return, number, quoted string 142 If C$="!" ! on-the-line comment 143 @Finish_the_line 144 Else ! don't know what it is - ignore it 145 @Get_a_char 146 Endif 147 Endif 148 Endif 149 Endif 150 Endif 151 Until Eof(#1) 152 Close #1 153 Close #2 154 Close #3 155 Return 156 Procedure Deal_with_word 157 Rem Rem this routine takes the word in Word$ and tries to find what it is. 158 Rem if it's REM or DATA, the rest of the line is skipped 159 Rem otherwise, we look through a list of basic keywords - if we find 160 Rem the word, we're done. 161 Rem failing that, we write a line to file 2 consisting of the line# 162 Rem (in lnum) and the word 163 Rem Local Lo%,Hi%,Mid% 164 Uword$=Upper$(Word$) ! uppercase for faster comparisons 165 If Not Word_list_read! ! first time thru - build the word list 166 @Read_word_list 167 Endif 168 If Uword$="REM" Or Uword$="DATA" 169 @Finish_the_line 170 Else ! do a binary search on the word list 171 Lo%=0 ! slot 0 unused 172 Hi%=Word_list_limit% ! this slot "//", not a valid word 173 Rem word, if present, is between lo% and hi%, exclusive at both ends 174 Do 175 Mid%=(Lo%+Hi%)/2 ! find midpoint 176 Exit If Mid%=Lo% ! implies nothing between lo% and hi% 177 Found!=(Hold_word_list$(Mid%)=Uword$) ! is midpoint the word? 178 Exit If Found! 179 If Hold_word_list$(Mid%)"; 202 Print Hold_word_list$(Word_list_limit%-1);", "; 203 Print Hold_word_list$(Word_list_limit%) 204 Stop ! sequence error must be fixed 205 Endif 206 Loop 207 Return ! now the words follow 208 Data ABS,ADD,ALERT,AND,ARRAYFILL,ARRPTR,AS,ASC,AT,ATN 209 Data BASE,BGET,BIN$,BITBLT,BLOAD,BMOVE,BOX,BPUT,BREAK,BSAVE 210 Data C:,CALL,CHAIN,CHDIR,CHDRIVE,CHR$,CIRCLE,CLEAR,CLEARW,CLOSE,CLOSEW 211 Data CLR,CLS,COLOR,COS,CRSCOL,CRSLIN,CVD,CVF,CVI,CVL,CVS 212 Data DATE$,DEC,DEFFILL,DEFFN,DEFLINE,DEFLIST,DEFMARK,DEFMOUSE,DEFNUM,DEFTEXT 213 Data DFREE,DIM,DIM?,DIR,DIR$,DIV,DO,DOWNTO,DPEEK,DPOKE,DRAW 214 Data EDIT,ELLIPSE,ELSE,END,ENDIF,EOF,EQV,ERASE,ERR,ERROR,EVEN,EXEC,EXIST 215 Data EXIT,EXP 216 Data FALSE,FATAL,FIELD,FILES,FILESELECT,FILL,FIX,FOR,FORM,FRAC,FRE,FULLW 217 Data GET,GOSUB,GOTO,GRAPHMODE 218 Data HARDCOPY,HEX$,HIDEM,HIMEM 219 Data IF,IMP,INC,INFOW,INKEY$,INP,INP?,INPUT,INPUT$,INSTR,INT 220 Data KILL 221 Data LEFT$,LEN,LET,LINE,LIST,LLIST,LOAD,LOC,LOCAL,LOF,LOG,LOG10,LOOP,LPEEK 222 Data LPOKE,LPOS,LPRINT,LSET 223 Data MAX,MENU,MID$,MIN,MKD$,MKDIR,MKF$,MKI$,MKL$,MKS$,MOD,MONITOR,MOUSE,MOUSEK 224 Data MOUSEX,MOUSEY,MUL 225 Data NAME,NEW,NEXT,NOT 226 Data OCT$,ODD,ON,OPEN,OPENW,OPTION,OR,OUT,OUT? 227 Data PAUSE,PBOX,PCIRCLE,PEEK,PELLIPSE,PLOT,POINT,POKE,POLYFILL,POLYLINE 228 Data POLYMARK,POS,PRBOX,PRINT,PROCEDURE,PSAVE,PUT 229 Data QUIT 230 Data RANDOM,RBOX,READ,RELSEEK,REPEAT,RESERVE,RESTORE,RESUME,RETURN,RIGHT$ 231 Data RMDIR,RND 232 Data SAVE,SDPOKE,SEEK,SETCOLOR,SETTIME,SGET,SGN,SHOWM,SIN,SLPOKE,SOUND 233 Data SPACE$,SPC,SPOKE,SPRITE,SPUT,SQR,STOP,STR$,STRING$,SUB,SWAP,SYSTEM 234 Data TAB,TAN,TEXT,TIME$,TIMER,TITLEW,TO,TROFF,TRON,TRUE,TRUNC,TYPE 235 Data UNTIL,UPPER$,USING 236 Data VAL,VAL?,VARPTR,VOID,VSYNC 237 Data WAVE,WEND,WHILE,WRITE 238 Data XOR 239 Data //,end of basic keyword list 240 Procedure Get_filenames 241 Rem Rem this routine gets all the filenames needed for this program 242 Rem Print "Select Ascii-saved Basic program" 243 A$="A:\*.LST" 244 B$="" 245 Ok!=False 246 Repeat 247 Fileselect A$,B$,Lst$ 248 If Lst$="" 249 End 250 Endif 251 If Exist(Lst$) 252 Ok!=True 253 Else 254 Print "(doesn't exist, try again)" 255 Endif 256 @Take_filename_apart(Lst$,*A$,*B$) 257 Until Ok! 258 Cls ! clear screen again 259 Ok!=False 260 Print Lst$ 261 X%=Instr(B$,".") 262 If X%=0 263 B$=B$+".lnm" 264 Else 265 B$=Left$(B$,X%)+"lnm" 266 Endif 267 A$=A$+"*.LNM" 268 Print "Select numbered-program file" 269 Fileselect A$,B$,Lnm$ 270 If Lnm$="" 271 End 272 Endif 273 Cls 274 Print Lst$;" "; 275 Print Lnm$ 276 @Take_filename_apart(Lnm$,*A$,*B$) 277 Y%=Instr(B$,".") 278 If Y%=0 279 B$=B$+".xrf" 280 Else 281 B$=Left$(B$,Y%)+"xrf" 282 Endif 283 A$=A$+"*.xrf" 284 Print "Select xref file" 285 Fileselect A$,B$,Xrf$ 286 If Xrf$="" 287 End 288 Endif 289 Cls 290 Print Lst$;" "; 291 Print Lnm$;" "; 292 Print Xrf$ 293 Print "Select DRIVE for temp files (filename doesn't matter)" 294 @Take_filename_apart(Xrf$,*A$,*B$) 295 Fileselect A$," ",Junk$ 296 @Take_filename_apart(Junk$,*Tdrive$,*A$) 297 Rem out of that, only drive$ matters 298 Print "Selecting temp files "; 299 Repeat 300 Tempfile1$=Tdrive$+"F1"+Str$(Random(10000)) 301 Until Not Exist(Tempfile1$) 302 Repeat 303 Tempfile2$=Tdrive$+"F2"+Str$(Random(10000)) 304 Until Not Exist(Tempfile2$) 305 Repeat 306 Tempfile3$=Tdrive$+"F3"+Str$(Random(10000)) 307 Until Not Exist(Tempfile3$) 308 Repeat 309 Tempfile4$=Tdrive$+"F4"+Str$(Random(10000)) 310 Until Not Exist(Tempfile4$) 311 Print Tempfile1$;" ";Tempfile2$;" ";Tempfile3$;" ";Tempfile4$ 312 Return 313 Procedure Take_filename_apart(Pathname$,P.path%,P.name%) 314 Rem Rem this routine examines the filename (with path) in pathname$ 315 Rem the path (up to final \) will be put in p.path 316 Rem the filename only will be put in p.name 317 Rem Local X%,Y% 318 X%=Instr(Pathname$,":") 319 Repeat 320 Y%=X% 321 X%=Max(Instr(Y%+1,Pathname$,"\"),Instr(Y%+1,Pathname$,"/")) 322 Until X%=0 323 If Y%=0 324 *P.path%=Dir$ 325 *P.name%=Pathname$ 326 Else 327 *P.path%=Left$(Pathname$,Y%) 328 *P.name%=Mid$(Pathname$,Y%+1) 329 Endif 330 Return 331 Procedure Deletef 332 Rem Rem this is a utility routine, it deletes all the temp files this 333 Rem program has left laying around. 334 Rem Rem notes: (1) it assumes files are in the root of drive P:, my ramdisk 335 Rem (2) it is dangerous - can easily delete too much 336 Rem While Exist("p:f*") 337 Kill "p:f*" 338 Wend 339 Return 340 Procedure Sort_references 341 Rem Rem this routine does some overhead for a merge sort of the disk file 342 Rem containing the list of references 343 Rem Print "sorting - pass "; 344 Lnox%=Crscol 345 Lnoy%=Crslin 346 Pass%=0 347 Qqqinputbuf$="" ! to free memory 348 Void Fre(0) 349 Open "O",#1,Tempfile2$ ! create null file 350 Close #1 ! done with it 351 Repeat 352 @Sort_one_pass 353 Until Not Side2! 354 Kill Tempfile2$ 355 Kill Tempfile3$ 356 Kill Tempfile4$ 357 Return 358 Procedure Sort_one_pass 359 Rem Rem this routine does one pass of a merge sort 360 Rem at present it's strictly a two-by merge. 361 Rem Inc Pass% ! print pass# so user doesn't get too impatient 362 Print At(Lnox%,Lnoy%);Pass% 363 Rcnt%=0 ! initialize record and segment counters 364 Seg%=1 365 Open "I",#1,Tempfile1$ ! open files 366 Open "I",#2,Tempfile2$ 367 Open "O",#3,Tempfile3$ 368 Open "O",#4,Tempfile4$ 369 Side2!=False ! haven't used the second output file yet 370 Ofile!=False ! switch for which output file to use 371 F1oc!=False ! input record buffers not occupied 372 F2oc!=False 373 Old$="" ! no previous record 374 Oldr=0 375 Repeat 376 If Not F1oc! ! should fill buffer 1, preferably from input 1 377 On Error Gosub Errone 378 If Not Eof(#1) 379 Input #1,Ref1,Var1$ ! read the record 380 Inc Rcnt% ! count it 381 F1oc!=True ! buffer now occupied 382 Else ! have to read from input 2 instead 383 If Not Eof(#2) ! if we can 384 Input #2,Ref1,Var1$ ! read the record 385 Inc Rcnt% ! count it 386 F1oc!=True ! buffer occupied 387 Endif 388 Endif 389 Endif 390 Eofone: 391 If Not F2oc! ! should fill buffer 2 - see above 392 On Error Gosub Errtwo 393 If Not Eof(#2) 394 Input #2,Ref2,Var2$ 395 Inc Rcnt% 396 F2oc!=True 397 Else 398 If Not Eof(#1) 399 Input #1,Ref2,Var2$ 400 Inc Rcnt% 401 F2oc!=True 402 Endif 403 Endif 404 Endif 405 Eoftwo: 406 On Error ! normal error handling 407 If ((Var1$Old$ Or (Var1$=Old$ And Ref1>=Oldr)) And ((Var1$Old$ Or (Var2$=Old$ And Ref2>=Oldr)) And ((Var2$"//" ! watching for special eof marker 469 On Error Gosub Errthree ! provide for it 470 Input #1,Ref2$,Var2$ ! get the next record 471 On Error ! back to standard error handling 472 If Var2$=Var1$ ! if same variable 473 Ref1$=Ref1$+" "+Ref2$ ! combine the reference lists 474 Else ! not the same variable 475 Print #2;Ref1$;",";Var1$ ! write the "old" variable & list 476 Ref1$=Ref2$ ! start on the new one 477 Var1$=Var2$ 478 Endif 479 Wend ! and go on 480 Close #1 ! close files 481 Close #2 482 Swap Tempfile1$,Tempfile2$ ! still want #1 to be input 483 Kill Tempfile2$ ! get rid of unneeded file 484 Return 485 Procedure Format_report 486 Rem Rem this routine reads the combined file to produce the actual 487 Rem cross-reference report 488 Rem Print "formatting report" 489 Open "I",#1,Tempfile1$ ! open files 490 Open "O",#2,Xrf$ 491 On Error Gosub Errfour ! protect eof 492 Namform$="\"+Space$(18)+"\ " ! formats for print using 493 Numform$="#### " 494 While Not Eof(#1) ! thru the file 495 Input #1,Ref1$,Var1$ ! read a record 496 St%=1 ! starting position in ref1$ 497 Cl%=0 ! starting position on line 498 While St%56 ! line is full 500 Print #2 ! end the line 501 Cl%=0 ! ready for a new line 502 Endif 503 If Cl%=0 ! if at beginning of line 504 Print #2,Using Namform$,Var1$; ! print the variable name 505 Cl%=Cl%+Len(Namform$) ! move ahead in line 506 Var1$="" ! but only print name once per variable 507 Endif 508 En%=Instr(St%,Ref1$," ") ! find the end of the next line# 509 If En%=0 ! if there isn't a space, 510 En%=Len(Ref1$) ! use the rest of the references 511 Endif 512 Ll%=En%-St%+1 ! how many characters? 513 Print #2,Using Numform$,Val(Mid$(Ref1$,St%,Ll%)); ! print the number 514 Cl%=Cl%+Len(Numform$) ! move ahead in line 515 St%=En%+1 ! move to next reference 516 Wend 517 Print #2 ! end of a variable - end the line 518 Wend 519 Eoffour: ! also come here indirectly on eof 520 Close #1 ! close files 521 Close #2 522 Kill Tempfile1$ ! get rid of temporaries 523 Return 524 Procedure Errfour 525 Rem Rem special eof routine for the final reporting phase 526 Rem Resume Eoffour 527 Return A$ 243 247 256 267 267 269 276 283 283 285 294 295 296 B$ 244 247 256 261 263 263 265 265 269 276 277 279 279 281 281 285 294 C$ 47 48 49 93 98 98 98 98 99 101 101 101 101 101 102 126 126 126 130 130 130 130 130 130 130 130 142 C% 49 50 67 115 133 137 137 138 Cl% 497 499 501 503 505 505 514 514 Combine_references 27 460 Cu$ 48 92 92 98 98 Deal_with_word 113 156 Deletef 331 En% 508 509 510 512 515 Eoffour: 519 Eofone 449 Eofone: 390 Eoftwo 452 Eoftwo: 405 Errfour 491 524 Errone 377 448 Errthree 469 Errtwo 392 451 Examine_source 25 72 Exit! 97 104 106 109 F1oc! 371 376 381 386 407 414 417 419 427 F2oc! 372 391 396 401 407 414 419 422 427 Finish_the_line 52 68 143 169 Format_report 28 485 Found! 177 178 185 Get_a_char 30 62 66 86 95 103 110 118 122 129 136 139 145 Get_filenames 24 240 Hi% 172 175 182 Hold_word_list$ 177 179 194 198 199 200 200 202 203 Junk$ 295 296 Ll% 512 513 Lnm$ 79 269 270 275 276 291 Lnox% 83 121 344 362 Lnoy% 84 121 345 362 Lnum% 80 81 85 116 120 121 186 Lo% 171 175 176 180 Lst$ 247 248 251 256 260 274 290 Mid% 175 176 177 179 180 182 Namform$ 492 504 505 Numform$ 493 513 514 Ofile! 370 409 409 440 Ok! 245 252 257 259 Old$ 373 407 407 407 407 412 414 414 414 414 419 419 419 419 Oldr 374 407 407 411 414 414 419 419 439 P.name% 313 325 328 P.path% 313 324 327 Pass% 346 362 Pathname$ 313 318 321 321 325 327 328 Qqqicurlen% 37 40 41 42 44 65 Qqqinputbuf$ 44 47 57 60 64 347 Qqqinputlen% 36 41 42 Qqqinputpos% 38 40 43 46 47 57 60 60 61 64 65 Qqqinputread% 22 35 Rcnt% 363 380 385 395 400 434 Read_word_list 166 190 Ref1 379 384 407 414 414 416 419 419 Ref1$ 466 473 473 475 476 495 498 508 510 513 Ref2 394 399 407 414 414 419 419 421 Ref2$ 470 473 476 Seg% 364 410 434 Side2! 353 369 441 Sort_one_pass 352 358 Sort_out 416 421 436 Sort_references 26 340 St% 496 498 508 512 513 515 Take_filename_apart 256 276 294 296 313 Tdrive$ 296 300 303 306 309 Tempfile1$ 78 300 301 311 365 432 464 482 489 522 Tempfile2$ 303 304 311 349 354 366 433 465 482 483 Tempfile3$ 306 307 311 355 367 432 Tempfile4$ 309 310 311 356 368 433 Uword$ 164 168 168 177 179 Var1$ 379 384 407 407 414 414 414 414 416 419 419 419 419 466 472 475 477 495 504 506 Var2$ 394 399 407 407 414 414 414 414 419 419 419 419 421 467 468 470 472 477 Word$ 93 99 99 102 102 164 186 Word_list_limit% 172 195 197 198 199 200 200 202 203 Word_list_read! 165 X 436 439 442 444 X% 57 58 59 60 61 261 262 265 318 320 321 322 Xrf$ 285 286 292 294 490 Y$ 436 442 444 Y% 277 278 281 320 321 321 323 327 328 . 3n.. 3nTI_TA_TOBAS@nTI_TA_TOPRGBn6GfABASIC$******00000 .666666:::::SKUGELWKUGELAKUGELWKUGELSKUGELDDATKUGEL6!F6!!!F$6 !!!F$6@!!!F$6`! ! ! FjF}&EGF0QF Eb F } F EF*!`! Eb` b@ F~!H!HF~!H!HFEa F 6!!!F|F 0,0,1,5,4 R896,1088,3680,4496,16280,96,16328,16436,32708,56,32740,32794,65506,28,65506,28 J65506,28,32764,32770,32764,0,16376,16388,16376,0,4064,4112,896,1088,0,0 XVTT&}`5>Q` Efv*oMn m HPHUBg?<JNA(m)m -:gS)@ -OK1PC#HNHx?<HNA@)@l/?<HNA)@h&@)@XЬl)@d)@`ARCpr Ѝ"QHNFALNH@ЃdHA@B@H@хk HAҁHAрSB BbNuNpNNuCDEJEgJBgJjBEBQ*HE?<>0rHGGdHGGdSWDуdi\?<>0rHGGdHGGdSWDуdiN?<>0rHGGdHGGdSW2 H@Nb?<,>CEdGH@0r`?<`JBgVB&8TTDуdQRBNuDAр&AdRAрAрDуNuprt|=|  g +g -f .g20  b 0e 9b da`RF` .f 0e 9b dajSF` Eg efX +g -f 0e 9oSH`00  b&Hz0  b E Do`HJjDDDS4</NtJFkSFk&aQNt`Ha"FFaQL8NH6.JgtBnNupr$<NuJBk4<rpAC v JBgJjv-| Bb BkH>aaNRFBdL8?NH<JBga2SF Be BgQRB`ApdR e <rRF&0xafEv+0JFjDFv-Hƌd0BFHF 0HF0ANuprt|`2:HQ A dA6HP 0 0 &0&?< NN\Hx?< NN\JfNu BNxN]NvN)@p `H@)@prtNAHplrtNB 2pNpNpapaprapalpalpalpaTpaTpaTBp'a?<NNT@B){L9|0<rtNpapap9@p`pvNv`v`vj`v `v`v`v`?Aa*` Al 2l 4)lVH)lRprtNAl 2l 4HVNu2A)lVHvN69Cp rtNAv` Av `Avl 2l 4)lVHN6Al 2l 4HPrtpgNaBp0,l 2Nua40,HNua*p0,l 4Nuaprt0,l 22,l 44,NuN9||BlBlrҌpsNBNu(* 9AJA)H@@[000][ˈN& Evz`* [g" ]g |g QSz` zQSpQ][ɈN& Dvx`* [g" ]g |g QSx` xQSpQ]Bp4NdHNu@9@JpNNdr|<N& @xepw2A$JBjDFHB t`0QBl9F)lVTAtp 9| NA R4RB`A Gf //o~4$_<F"OSG !H@Ь 2 Q)@RHRprN2(g"P@g2RADAH""l`r2oZAe 1@#)I`Nuk1@Nup NN"l`dpNAtrdJhk\QpaNH ld$l`"Hg: k&@0+R`g k#&@0+S@H3 Q&f)I`LNuN$N$BS@kH2QNupC ұd"X0Pg"RA$D#Nu"X0Nu _0HpN _0HpNE ұeHHQ0)N@$_$ZR@H`2QNu$Y0gHR@@"D%$X0P2g# R@%NupE $ $X0dP.gRG,D%pr Y2dP.gRG,D!p4Ae4v`VfANuNVHNu(* 0(iN$E 4R`Q$D 4R`QˈN& DN& ENua NuN& IHPg"B  g &gN`JBjt BNut`Rptr ae OgT Xgj HgSRB ae Fb$0k  c_  c b退`tSJBkNRB0 b b瀀`RB0 fрd`H&NրNjNuRNq Y Qf*d ЀЀ 2$4BBNuHRp` HRpJQfpN$_& Y Qf d փփABJk 0NNN|~,Nq8DRzXEEg"7PNqR$HBJBgpNJgJigp`eetЂ`"ЀeЁdp`ЀeЀe"Ѕe$W.H@@NDL"2` NqR YEjrd0` SjN$_NЀЀ 2$4BBN YQf "_Nq*eNN|*< NqbІSGfN$_NփփHRN YQf "_&Nq*eNN|*<&NqbֆSGfN~$_NЀЀЈNp"X4g S`"QNuN*<N `"2QjNu" KC`e N`d \Nz l\Ӭ\ NupNd d3 d# d# # d# # # # d# # # # # # # # dB` # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # QNuC l ", Ⲭ dfѬ SA 0! Nup"NNNhJfNup#`p`pNu)H9@Jp4NdP'J&f H LNu P&NuQ'` J,'fJ,&gHA#ȇeC! B,&LNu-W)K20, 8k8@ gJl&f"Nu , 8g"P 8 @/, 8NZ  8fQ 8J,'gNupB <``L@ H)l26)z @W , Jf`CfSHj-D@Hd0H@H 0H@0`fSC\fS , @a"C]fApNNNNHP?< NA\NuH@aa/a a Nu@0 9c^Nu| PC>$Fehler # ][Abbruch]\f.B &lX)K\)ld` lp ,BQjNup(NX"l`Yd&-KNN"l`YepN&#k"C-KN"Cփk փk2##`փk"`2`$Y8gHRDD*D%H8#$c2g# HRDD%H`pr`&AdRd QJBgRBBABJk"l` d&6&|0!NuN"l` epZNA"RNZNtAlN$NARNZNA%NZNA4pNZN <r$<HA*^NZNA)NZN <r$<HA&pNZNHmZA "_NfNNNA4NZNAN&<x*<NxfNxNNTNAN&<x*<NxfNNA-NZNNN <r$<HA*^NZNA)NZN <r$<HA&pNZNHmZA "_NfNNA4NZNAN&<x*<NxfNFNNTNNNNNNpNpNNBm <r$<A NN?<A N&<x*<N&<x*<NN"??<hA N&<x*<N&<x*<NN"??<A N&<x*<N&<x*<NN"??<A N&<x*<N&<x*<NN"??<A N&<x*<N&<x*<NN"?~NN?<A N&<x*<N&<x*<NN"??<hA N&<x*<N&<x*<NN"??<A N&<x*<N&<x*<NN"??<A N&<x*<N&<x*<NN"?~NNA N&<x*<N&<x*<NN""<hNA N&<x*<N&<x*<NN""<hNNBm <r$<ANNBm <r$<ANNAN&<x*<NHANvNL8NHA NvNL8NANNANvN&<x*<NHANvNL8NN"/A N&<x*<N&<x*<NHANvNL8NN""Npr N"NAN/ANvN&<x*<NHANvNL8NC`NNAN/A N&<x*<N&<x*<NHANvNL8NCfNNN`^NqNN`6NqNN`NqNprN <"<NPNp"<N <"<NPN <r"<N <"<NPNp"<NlNNNNNNNNp@ClNHxDpCr~NpDCxNp@C`Np@CfNNpNNB NA 0 <r$<A NNA 0 <r$<ANNN4ANNA N/AN/ANCr~NNN`NqNqNN`NqNqNA 0 <r$<A NNA 0 <r$<ANNA 0 <r$<ANNA N&<x*<NANxNN"/AN/AN/ANCr~NfHA NvNL8NCr~NNN`NqNqNN`NNqNN`NqNA 0 <r$<A NNBm <r$<ANNA N&<x*<NN"/AN&<x*<NN"/ANvNA NxNCr~NNN`NqNqNN`jNqNA 0 <r$<A NNA 0 <r$<ANNN4ANNA N&<x*<NN"/AN/ANCr~NNN`NqNqNN`zNqNNNNNNpNNpNpNpNp NNpd"<NNP T I CNN <"<NNP T A CNN <,"<NNP T O ENN <r(NNP 3 DNNNNNNLANNBm(NA 0 <r$<A NNA N/pCr~NfN"ClNPANxNxpJBgp/A N/pCr~NfN"ClNPANxNxpJBgp/A N/pCr~NfN"ClNPANxNxpJBgp/A N/pCr~NfN"ClNPANxNxpJBgp$VHfN'NC A$ 0NN`NqNA$NzNfN)NA 0 <r$<A NN?<A NvN&<x*<NN"?A N/p" _NpN8NN`NqNqNpN\pNhNNpNNA 0 <r$<A NNA 0 <r$<ANNA$N/ANCr~NfN"C`NPN"/A$N/ANCr~NfN"CfNPN""Npr N"NN`NqNqNN`\NqNN\ Spieler HPANN "_N"HPN\ hat gewonnen!| Noch ein Spiel?"_N"CZNhNpNNNNNNNBmNA 0 <r$<A NNA NClNPzNxfN)NA 0NN`NqNqNANzNxfN*TNNP$ - Unentschieden! -| Noch ein Spiel?CZNhNNNNNLANNNH A*N A0N ANNAN&<x*<NfN*NN*lNpNNBm:BmNBm <r$<A NNBm <r$<ANNBm <r$<ANNANvN&<x*<NHANvNL8NAaRJf .JL N^NuNVH *n(n `Jf JL0N^NuNV`R n  g .N^NuNV>N4N^NuNVHag(<fp` `<f` <fp` a|fB@JLN^NuNVH. H>N4aJLN^NuNVH*n` H>N4JfJL N^NuNV.aafN^NuNV.aJ@gp`aB@N^NuNV.9aN^NuNVHagHJLN^NuNVHa>aJHJLN^NuNVH *n(n JUgSUS.9a>JL0N^NuNVBn-n` . m .m.H` nBB@`.Q/UaX` nB nN.a`-nBn nN`l`.Q/UaTXJnf`TJnf4.9/.N8X.9N8=@HЮ-@.an``H |:VrW hN`&0.n l.H"n>N4RRna@| f nB./<9N8X0.N^NuNVH*n Jl- .D-@~ `/< /NP.o`H992f.RH992f 92`H>a|=@f./ aX(@`<Af(. n0H/ahX./ aX(@`<CfBW/ N6bX`RJf`<DfN5NмA`<Ef$.0y9:/aX./ a>X(@`Z<Pf.9=/ a&X(@`B<1m4<9n.Sn0."n2Al n2n./ aX(@`92R`JfB .JL0N^NuNVa:J@gN*.a`aaJ@gN J@g Sy94p``B@N^NuNVB. /&N8X-n./.aX`BW?.$/.N6@\Bn"A-H`dR./<?.$N5\gJn"f>$N5p```0`& n g$ n  g n  gRRn" n"m>$N5 .fp` nB././/aX .aJ@gp`D.&/aXJy94g Sy94p`BW/&N5X=@$lpN^NuNVnNJ@gp`j|v-y9BA#9`4N*.*?</vaV\a./vaVXJy94g#9Sy94B@N^NuNV H .м,-@ .9=/<9 n /N PB.&Bn nfF.:NJ@f(Sy96.&/<:aXJy94f\Ry96.&a`H=|$`0n$ *P`RJf Rn$0.S@n$n.& n /(alXJL N^NuNVH (n`N*n `(<am<zn H|`HHAfRRJfJf./.N8X`RJfRJfJL0N^NuNV./. /.N8P/N8:XN^NuNVBW/.N5X=@lp`` >N5B@N^NuNVH*n n (:g N:` n R n ;g n Jf -:g -\g\././ aJP .JL N^NuNV././. /.av .a/.N6X=@`Bn`A-H`R nJg n .f0. @"|:./.N8dXJ@fD0.м: @ hfJnf&0. @"|:00=@nl=n`Rn nmlN6=@JngR0.`P-|:=|`Z-|:=|`J-|:=|`:-|:=|`*-|:Bn``|g|g|g|g`././. /.a( 0.N^NuNV n (:fJnf .:/. /.aP.aJ@gx.:/. /.a|P.aJ@gT.:/. /.a^P.a|J@g6.:/. /.a@P.a^J@g.:/. /.a"PB@`p`p`Z`X-n`2>/. /./.a =@g0.`*.a-@ nJf.:/. /.aPB@N^NuNV-n `R nJf` n \g n .gS . fJnfD./<:N8dXJ@f..; /./. /.aj J@gp`B@``./<:N8dXJ@g,./<:N8dXJ@g./<:N8dXJ@f*.; /./. /.a J@gp`B@``>/./. /.a N^NuNVH*n \fJ-g -:fJ-g -\fJ-gB@`pJL N^NuNV.;6/. /.N8P/N8:XN^NuNVH*n` *g ?fp` `RJfB@JL N^NuNV.=QN:N^NuNV>N4Jy;:g>v`>wN4B@N^NuNVN<}NTa.N5Hr4.aHgB@`"` >N5H <.adp`l-|;<`T. n/N8dXJ@f:-n /.//. NX/NP/ n hNPp`P n P  fB@JLN^NuNV.N.=NJn g.;`.;N:N^NuNV nJPfp` n hH|=@`SnpH>NJnfB@N^NuNVB@N^NuNVH n Pg.=N:`L n*h.NJ@g.=N(.N:`" n. / N6XJg .=N:B@JL N^NuNVH*n./<;6N8dXJ@f.=a J@fB@`<.NJ@g.=N.N:``.aJ@g .NJ@gB@JL N^NuNV. /./<aPN^NuNV.a.N5V> /.N6XJgB@`pN^NuNV.?</.a\J@g(.N(J@f.>N(J@fB@`p`b``Jn g".>N(J@f.N(J@gp`8NT.N5Jg".>N.NNTp``B@N^NuNVBW/.aLXN^NuNV. /./<>aPN^NuNV0.|A<>RW/N6bX.>.N.E`.N:N^NuNVN5N>aN^NuNV n (:fh nJ(f nH>Wad`t`DN5N=@ nH>aJ@gp`P.TN5=@>N5HJnfB@`,`.N5JfB@`.N.>GNpN^NuNV nJPfa:``. /./<aPN^NuNV.N5Jg.N5JfB@` `.>[N.NNTpN^NuNV. /./<aDPN^NuNVH./.N8dX>. /<>jN8dXJ@fJGgB@`p`L`J. /<>lN8dXJ@fJGmB@`p`(`&. /<>nN8dXJ@fJGnB@`p``B@JLN^NuNVJng0. ` Jn gB@`pJ@g*.N. n2n /0NX``B@N^NuNV n ./<>pN8dXJ@f:./. ?< n /( NXJ@gBg`?<?.ad `N`L n PlB@`>./. ?< n /( n /( n /(a ??.a N^NuNVH n PlB@`v n./<>wN8dXJ@fHBG`0G2GRI!iRG|m n0"nSQ. /.Bga\``. /.?<a\JLN^NuNVH nJPg~ n !|.: n/(/. NP.N n Pf n Bh`8BG n*h n (h`RGݾ|m.  n /(NXB@JL0N^NuNV nJPfp` n hH|=@`8Sn n Jhg0. N.  n /(NXJnfB@N^NuNVH*y90<``.{N 90NNT*U 99W`BW/. N5XN^NuNV n<./<N ..N.>N.N.>N.N.>N.N.>N:N^NuNV nJPfN<.A#9 n*h`d(M`RJg !fJgB@`p=@B.Nl*@.N J@f2. / NXJy94gSy94`Jng ` R*@Jf#9B@JL0N^NuNVH BGaJ@f.>N:J@gp`f-|;<`D(|<` Jf(|<`Jf.N@|Yg .Nf.H>N4NT .YgB@`pN^NuNVaV.N@|0m. .9n&.H|394.H>N4`` .Am* .Zn".H|394.H>N4`h`b . g^ .fRNT-y9-|? A#9ab#9Jy94gSy94fNTax.Ry94`B.? n/(N8dXJ@g n.N7y94`a` J@g|g`B@N^NuNVN>/<; a~XN^NuNVNJ@gB@``.N n.N:N^NuNVH n*h nJPf a`` n Pg.a``~./<;N8dXJ@fSy96``./<;N8dXJ@fRy96`D./<;N8dXJ@fBy96`(./<;N8dXJ@f 396` .a`B@JL N^NuNVH n*h nJPf$Jy98lBW`>/<;2aTX`x`r./<;N8dXJ@fSy98`T./<;N8dXJ@fRy98`8./<;N8dXJ@fBy98`./<;N8dXJ@f398B@JL N^NuNVH n*h nJPgn./<;N8dXJ@g./<;N8dXJ@fBy;:a`J`6./<;N8dXJ@g./<;N8dXJ@f3;:av`>;:/<;&a8XJL N^NuNV n Pf0 n-h n ;fR./<9=N8XB@`D`B.?N(J@f0J99=fB@`pHм9<.N(J@fNTJ@fB@`pN^NuNV.?"N:Nd|f n JgaB@N^NuNVHBD>. n ;fJygB@`p3`BW/.N5X=@l.?N5Jyg JEg nN80JLN^NuNVN5N4NN^NuNVH*n`H>aJ@gp`JfB@JL N^NuNVp H>aN^NuNV.?IaJ@fF.aJ@f<.?PaJ@f0.0n /NX.aJ@f.?iavJ@fB@`pN^NuNV n :fa`$.&/<&?<7/<&/.aN^NuNVBy. /./<'NaPN^NuNVNd|gB@`pN^NuNVB@N^NuNV n :f.?mN(`$.'/<'?</</.aTN^NuNVBy. /./<'a&PN^NuNVH *n(n `H>NJ@gp`JfB@JL0N^NuNVH*n >.<.N8Ȝ@`> NJ@gp`0SFJ@f./.aXJL N^NuNVH*n >.>/ //.NP/aPJL N^NuNVH *n >. n(P .f `H>NJ@gp`ZJg0SGJ@f`$`H>NJ@gp`:Jg .g0SGJ@f`> NJ@gp`0SGJ@f .fR n B@JL0N^NuNV>/. /Pa\PJ@f*?<. n NTJ@f>/. /Pa6PJ@fB@`pN^NuNV> /./.aPJ@f./<?qaJXJ@fB@`pN^NuNV?< nNTJ@f?< nNTJ@fB@`pN^NuNVH*nBG`RG | mBJL N^NuNV. gp\`. gp/`p N^NuNV n |fRp`B n (:f nH>N|Cf n (:gN5NfB@`p=@.avJ@g(.;6/./N8P/N8:X-@. /<?sa$XJ@f. /.aXJ@f . aJ@gp`BnBB.?</.a\J@g/</.NP-@Ѯ.H?aT? n NTJ@fh. /aXJ@fR.H|g?<+`?< n NTJ@f0.g. /<?aHX`. ?</.a\J@gp`RRn0.|fBn. aJ@gp``. /<?aXJ@gp`.N5V.aN6JgJng. axJ@gp`JJng./.aX. ?</.a\J@f. /<?ahXJ@f>/. /.aPJ@f. /<?a:XJ@fJng. ?</</././.NP/NP/NP/a~\J@fn. /<?aXJ@fZ. ?</</././.NP/NP/NP/a(\J@f. /<?aXJ@fB@`p`B@J@f. a0J@fB@`pN^NuNV./.aXN^NuNV nJPf .;6a`./<-a/.N6XJf.fB@`p``B@N^NuNVH*n.NLJ@gB@``.aJ@gB@`pJL N^NuNVH*n`RJf JL N^NuNVRH =|./N8X.a*@` мػ@SDg :g \f.?/ RN8X.NBW/. N5X>l .?N. NNT`BW/N5X<l.?N:`*<`ⅺg.N6(@ g`$./.?N6\g.?N`./?N5\-@nȺg.N6Jg.?N:`Bn>N5>N5.N./N6X0.JL0N^NuNVH*n `RJf` @SDg :g \fR.NLJ@g&././N8P/N8:X-@`@.apJ@g4./<?/./N8P/N8:P/N8:X-@. /.aXJL N^NuNV>/.NXJ@gp`..@/. /N8P/N8:X./.aXN^NuNVv./N8X.NLJ@g A-H`.a -@ n\R. /N8X.a-@` ."Ҽ@SDg n :g n \fR.zN5V>/. N6XJgB@`p=@`./.N8X./.N8X.g* ..g ./aXJ@gp`x`J.@N(J@f.N(J@gp`NNT./aXJ@gp`*.zN5VN6JgB@`p=@Jnf4N^NuNVH *n(n .NJ@g=|`l.NLJ@g./NX(@=|`D.aJ@g:.;6/<@/ /N8P/N8:P/N8:X(@=|Jng8.aJ@g .N(.@N(NTp`` ./ aX` ` ./ aXJL0N^NuNVHBG`&> n2G/0/.aPJ@gp`RGn mJLN^NuNVH n>|fBW n/( n/( aP`6|o$ n2GSI.?SW/.\an\`` .@3N:B@JLN^NuB@`0<?NATNu0<?/?NAXNu0<`0<`0<`0<`0<`0<`0< `0< `0< `0<2<??NMJNu0<2<`0<`0<`0< `0<`0<`t0<`^0</`f0<*`^0<+`b0<,`N0<-`R0<0`>NV?. /.?<1NANuNV?. /.?<6NAN^Nu0<9NV/.?NAN^Nu0<:`0<;`0<`0<?NV/./. ?.?NAN^Nu0<@`0<A`NV?<?./<?<BNAN^Nu0<BNV?.?. /.?NAN^Nu0<C`NV?. /.?<GNAN^NuNV/././. ?.?<KNAN^Nu0<M`,NV?. /.?<NNAN^Nu?<ONATNuNV/. /.Bg?<VNAN^Nu0<E`0<F`0<H`0<I`NV/. /./<JNAN^Nu0<L`NV/. /.?<WNAN^NuNV/. ?.?<NMN^Nu?<NNJ_Nu?<`?<`NV?./. /.?<NNN^NuNV?. ?.?<NNN^NuNV/./. /.?<NNN^NuRising Star Industries, Copyright (c) 1985NVH*nBGBF`RHHм@R @f +fR` -fRRF` H@| 0m 9oJFg0D@>0JL N^NuNVH *n (n`RJff .JL0N^NuNVH *n(n `op`lp`JgJfHHAJL0N^NuNVH *n (nf .JL0N^NuNVH *n(M`RJf HJL0N^NuNVN^NuRising Star Industries, Copyright (c) 1985CON:LST:AUX:%;PATH=:9  0BZAUTOEXEC.BAT*** GEM DesktopBatch file: Program: Cannot find .BAT.PRG.TOS.TTP::::.*ONOFFSETRESETECHOWRAPPATHLOG*.*<< <!<<4P<F<-<-; "<<F=!=6= ;2#N=-=R;,$=%,=.6='=%L=)V=-=0F=3:=9=?=D(;&$=IL=K"=M0=ORising Star Industries, Copyright (c) 1985eq{ }A: does not exist. A: is 0: A: A: Select item to continue execution: ?BELLBYECDCOPYDELDDIRENTERERAEXITGOTOIFLSMDPAUSEPDIRPRINTREMRENRDRMSTACKSHIFTSHOWTYPE;:! RSI Command Facility V1.01 9-20-85 WGWTerminate commandValid disk letters are A through P is REN needs 2 file names.Cannot find Rename failed.Erase all filesCannot erase: exists. Creating Cannot create Current directory for \ cannot be found. Cannot remove =<>EXISTSNOT*** ENTER <--- Current Environment KB free of blocks use bytes/sec sec/block*** ! CommandBuilt-in commands: (Y/N)? *** Query EXIT?PATH = Press any key to continueCannot open File: Page: K Search path: ---- |B total in files. B free B total$$$Cannot copy Cannot open destination fileWrite Error while copying file.\\*.*Copying \ must be a drive or subdirectory.COPY destination not specified!!!!".. vf $^&Db ".(<|* $ $ *:<,Rj "L0 &.(Dj. "   0 $P*B *d d` 2  BDB 2" > :.     " 6   2 @&(  J  JR <     $ 2 $     "(   $F   6   .  @  6 >0@$L* . XT$ lpXX.4 * 8  2b.      J  0 & ^:`Qz` Efv*oM$ m HPHUBg?<JNA(m)m -:gS)@ -OK1PC#HN,Hx?<HNA@)@l/?<HNA)@h&@)@XЬl)@d)@`ARCpr Ѝ"QHNFALNXHz2?< NA\pdAxr0XQ)K\NN6<<<<<<<JrBjNuHz?<&NN\NCAp$L Qp N9lrBlJpNNpMN9@pdAr 0Q0tr N9lNupealp`NuaNJHz?<&NNBWNANC2A@p222NrҌ0<NB0,rNurA9Ar`v C9Cr`rt9@9A9BNrrҌpsNB0,Nu9@N`rDҌpsNBNuC2 @ e @}bA@p222Nr,Ҍ0<NBNu pa2|a>:><|a4g RGj`a(0GVfA1G<ap??<?<NM\Nu??< NMXNu&8*:EENuHn, 2$4BBNuAd RdQRB BbABJk 0NuJBjBBXNu 0Nu 2$NuE`B<gJEgEjCDEDF Fe( F dF8BCHC` F0bFHC8v` HD8HDkDуdQRBNuDdBDA@kgAр[SBk0NuJlJBk&Nu0g H@rB JkЀ[` BbNuJBj prtNuHPAJgPpr$< _Nup _NpNNuCDEJEgJBgJjBEBQ*HE?<>0rHGGdHGGdSWDуdi\?<>0rHGGdHGGdSWDуdiN?<>0rHGGdHGGdSW2 H@N?<,>CEdGH@0r`?<`JBgVB&8TTDуdQRBNuDAр&AdRAрAрDуNuprt|=|P  g +g -f .g20  b 0e 9b da`RF` .f 0e 9b dajSF` Eg efX +g -f 0e 9oSH`00  b&Hz0  b E Do`HJjDDDS4</NJFkSFk&aQN`Ha"FFaQL8N|6.PJgtBnPNupr$<NuJBk4<rpAC v JBgJjv-| Bb BkH>aaNRFBdL8?N|<JBga2SF Be BgQRB`ApdR e <rRF&0xafEv+0JFjDFv-Hƌd0BFHF 0HF0ANuprt|`2:HQ A dJf`CfSHj-D@Hd0H@H 0H@0`fSC\fS , @a"C\fApNNNHP?< NA\NuH@aa/a a Nu@0 9c^Nu| PC>$Error # ][Abort]\f.B &lX)K\)ld` lp ,BQjNup(NV"l`Yd&-KNN"l`YepN&#k"C-KN"Cփk փk2##`փk"`2`$Y8gHRDD*D%H8#$c2g# HRDD%H`"X0gBPHR@@"D#NuA"NXNNz?<NNTANA 0A p0A 0A 0A6NpNpNpNpNpNpNpN.pNpN6AN2/AN2"N*A N2/AN2"NAN2/AN2"N*A N2/AN2"N Actual timing program Command.Tos => PD CLI program {From GEMBOOT2} Timetest.Prg => GFA Basic Compiled Program Timetest.Bas => GFA Basic Source Code for the timetest program Dialtest.Prg => Compiled GFA Companion Dialog Box GFATIP08.DOC => This file In past GFA Basic Conferences the question has arisen many times, "How do I time the total execution speed of a program or software procedure?". This set of utilities is designed to help you do just that. You can time a critical routine within a project you are working on to get an idea of execution times, and with a bit of practice you can learn to optimize your code to make it run faster. The soon to be released "GFA Book" will help you even more in this endeavor. It will be available from MichTron in a month or so. Command.Tos: To run the CLI just double click from the desktop. When the prompt appears, you may enter ? to see a listing of supported commands within the CLI. It's sole purpose is to allow you to execute the Timer.Prg and pass a command line to it. To execute the sample GFA Basic program included enter the following at the CLI prompt: timer timetest.prg or timer dialtest.prg Timer.Prg: This program was written in C and is designed to time sections of compiled code for you. You must remember the following to be successful with the timer. 1) Always enter the extension of the program you wish to time, eg.. timetest.(prg)(tos)(ttp) 2) Since it is futile to time a program that uses GEM interaction, that has been disallowed. It is useless to time a piece of code you wish to optimize if there are GEM menus or Alert Boxes in it. The overall idea here is to produce fast code that can be accurately timed. If you happen to accidentally include a section of code that has an alert box in it, you may exit if you have included a hot button to abort with the return key. So keep it in mind that if you have Alert boxes, menus, or Non-GFA Companion Dialog boxes {You may test sections of code that utilize GFA Companion generated Dialog Boxes} that utilize the GEM AES, you will have to reboot your system. The use of the mouse is not affected in most cases if the code section uses a Showm at the top of the procedure that requires it. Only the mouse interaction with the AES is affected. By including the above exclusion, I am not attempting to shoot down GEM at all (I happen to like GEM). This utility is for testing sections of code that utilize a lot of math, I/O, or printing routines. Use the timetest.bas program for an example. By using Timer.Prg with sections of code that have been compiled, you may be able to experiment and speed up critical sections of your program. You can experiment with Loops, For Next, Inc, Add, or whatever you believe will help to speed up execution times & Timer.prg will help you to keep a track record of performance. These crucial sections of code can then be included in a Fully GEM based program at a later time. I hope that this helps you to optimize your code, and create faster running GFA Basic programs. John B. Holder Notice: Feel free to u/l this ARC'hive anywhere you like, however please do so in it's entirety. Timer.Prg is (c)1987 Marathon Computer Press and may not be sold without prior approval of owner of copyright. `T*o m$m,B"HJgP"&J$YJf"Jg< Af Rf Gf Vf =f Jg#B "&J$YJf"Jf&f2B "@EHB2 r ggSJ"g fB*`B" B#B.I+I/ #R//SA?/ / Bg?<JNA Jf.?<?<N>N?|BWN>NXON" ?N?<LNANV nl/<VN^XO/<YN^XO/<uN^XO/<N^XO/<N^XO/<N^XO/<N^XO/<N^XO/<AN^XO?.N>TO/<\N^XOp?NTO n /(HnNNPOB.p=@0.nl4/<_HnN8PO0.H @ /HnN8PORn`Nb-@/<aHnHnBgpK?NA=@Nb-@/<hN^XO/<lN^XO/<N^XO/<N^XO/<N^XO/<N^XOp//</.NPO/NPO//</.NFPO//<N^ /<N^XO?.N>TO/<5N^XOp?NTON^Nu"o o JfSfNu"o o fNuNVHn/<RNPON^NuNVHn /.NPON^NuNVHn?</.NV Hn HnNPOHnBg nN\ON^NuNVH0-n n(PXH> @%gJGgf/.? n hN\O`p =@p=@p=@H> G-fp=@H>`Bn G0f p0=@H> G*f& nT=Plp=@0.D@=@H>`*Bn G0m G9n0. G@0=@H>` G.fJH> G*f nT=PH>`*Bn G0m G9n0. G@0=@H>` Glf&H> Gdg Gog Gug Gxf0@> `-@*@p=@0 |2<`XHXW PN`J nT=PJnl0.D@=@p-p ??./ NbPO*@`p ? nT?`p`p` n-PXJl .D-@p-p ?/./ N `p ? n// N *@X`p`p` n "(-@-AP/ ?././.?N`RBn n-Pf-|X .-@*@JgJnm noS`(Bn nT0` n//.NPO`X ./0.Hї =@lBnJnfLJng0 n0f( n -f/. nRH? n hN\O0.SnJ@g /.?.` nd /. nRH? n hN\O`Jng0.SnJ@g/.?. n hN\O`L0N^NuNVH >. *NB%0<g"0H@H@B@H@ @(>`?Bg _(Jg nR` .L N^NuNVH0*n>.IB$p0//. NFPO-@g$p0//. NPO @(-n ` n (Jg` L0N^NuNV/<8 yFNXON^NuNV/ *n .*+@+|B-0. D@;@ m l;| +|`+| *_N^NuNV/ *n Sm lBm p` UR0.*_N^NuNV/ *n UR0.*_N^NuNV/ *nRm oBm p` URB@*_N^NuNV/ *nJf0-H@f?<NTO+@f+| P+| j`n-H@f2-H?NjTOJ@gRf+| n+|  -`&+| n+| -H?N TOHЭ*+@Bm *_N^NuNV/p?B?.NPO. fB@`0H@.N^NuNV/ *n/ N XO/ mNXO*_N^NuNVH >.*n / N XO/ ? mN\OL N^NuNV/ *|Y MeJg/N ~XO`*_N^NuNVH *n-H@fp`@/ N XO>-H?NxTOJg-H@f /-NXOB-0L N^NuNVH *nBm -H@ff >o?/--H?NPOGf$JGm mAf -*+@`+UB@` 09PH fByP`-pL N^NuNVH *nRm o/ N XOJ@f  df/<RN XO -?/--H?NPOD@;@ @f^09PH fByP`-Bm `F0- Rm m+H URB@>-H@ g G gL Gg 0`Jm f-pL N^NuNV/ *n  df/<RN XOBm p?Hn-H?NPO @g4J@gP .f -H@ f< . f -H@ fB@.`(09PH fByP`-`-p*_N^NuNVH >.*n G f$-H@ g/ p ?N \O @fp`0Sm l"/ NXOJ@f -S@;@ UR0L N^NuNVH >.*n G G f -H@ g/ p ?N j\O @g^Bm -H@fN/ NXOJ@f@p?Hn-H?NPO @f0` 09PH fByP`-pL N^NuNVH >.*n G f$-H@ g/ p ?N \O @fp`?NAXO/NXO`B@N^NuNV/?.pE?NAXO>l0H/NXO`"?.NTO=@m?.?NHXO0.N^NuNV/?.?. rF?NA\O>J@f(?.NTO=@m?.?. NHXO0. `0H/NXO.N^NuNV?.NTO @Cfp`B@N^NuNV?.?./. pB?NA /NXON^NuNVH ?.NTO @Cf|9mH>9lHHl*@SnmSGldpQlB9m/<lp ?NA\O>l0H`p ?p?p?NM\Opl9mH>9lHHl*@0Gp H: Ef~` n R RF E fn llm0`$/. 0.H/?.p??NA /NXOL N^NuNV/. 0.H/?.p@?NA /NXON^NuNVH >.0V@ @bH0@8 PN`*pP`&pA`"pC`JGm*ySGmJfp`JgHL N^NuNVH >.JGm*ySGmJfp` Jg0. L N^NuNVH >.0V@ @bHH0@D PN*yHGg Jfp`&R` ?NTO`~C`~A`~P`pL N^NuNVJl .D3Pp` .N^Nu"o`C"/jD$jDA`|J/j JgRJk`JjDNu"o`C"/$A`JNu"o`C$jD"/A`, g J/j Nu"o`C$"/A` NupJfpN∲cd⒒d҂dFN o"`"/ jD$/jDD$@A`" jDNu o"`"/ _$0"@0HAHBЁH@B@ЉNNVH8..P b d.</N^XO*@ Mg`Jhf&M #J#F`& yhf QP&m`(yhQ L&h)M Q@* Ѝ#h(@Q LB)KL8N^NuNVH0~ .\S@,dB`ƙ*yF gr .gH g @є .*L(Mc2  d @*`* Ѝ#F yF X`dJg @Ѝ*@`*mFf g#FRyN09N @e SyN`X/NXO/.NXO*@SyN L0N^NuNVp0./NXON^NuNVH .Y*@Jf4~0GPJg 0RG0@PH?p?p?NM\O`NBL N^NuNV/ *nJg/<RH? ydN\OR`/<Rp ? ydN\O*_N^NuNVH..Jl <`0Jf 9`$R @./pH?NA\O,g Ї# LN^NuNV0.H/N^XON^Nu{NULL}DOUXcpdPefgors2uxD0123456789ABCDEFESoftware Timer Vers. 0.9: (c)1987 Marathon Computer Press Portions (c)1986,1987 Mark Williams Company Note: You have entered improper arguments! Proper Usage is a follows: Timer [myprog.ext] {[arg 1]...[arg n]} Press Return to End...... E PATH= Software Timer Vers 0.9: (c)1987 Marathon Computer Press Portions (c)1986,1987 Mark Williams Company Timing Statistics are as Follows: %ld.%03ld seconds Press Return to End...... E "! "! "#8RlYou must compile with the -f option to include printf() floating point"CCAP????????????????????????Bad pointer in free. L"20          :FPBLD "$  .6*" .J0.$nBF\ @$@ (  .",04 , 6&0&2> 0P  @J$  $"  ,$ 0Tfree_lmalloc_vmulstrcpy_Nmain_"errno_P_fgetb_n _fgetc_P _fpinit_" _dtefg__stropen_Vwrite__stksize_B_getfhtype_sbrk__stderr_l_a_scanp_F_cmdname_@_fp__aliasfh_|malloc_fprintf_xexit__setfhtype_Hdup2_lldivfclose_~ llremZ_fputb_ _fputc_j _stdin_8environ_Rlrdiv _stdout_Rlrrem`vldiv@sprintf__a_first_Jllmulvlrem_dtoa_4fflush_ dup__iovector_puts_clock_bvrdivFlrmulvrrem_start_vlmul_seterrno_strcat_8_fputt_ printf_^lseek_close_xvrmul_exit_Bvdivfinit_ read__fpseek_lsbrk_^isatty_j_fgetstr_getchar_>_finish_P _fginit_ GfABASIC68>>>>>>>>>>>>>XRDEGHF Timer Test "F R(FTqFI` QD` Efv*oM m HPHUBg?<JNA(m)m -:gS)@ -OK1PC#HNbHx?<HNA@)@l/?<HNA)@h&@)@XЬl)@d)@`ARCpr Ѝ"QHNFALN@Hz2?< NA\pdAxr0XQ)K\NN~JrBjNuHz?<&NN\NCAp$L Qp N9lrBlJpNNpMN9@pdAr 0Q0tr N<9lNupealp`NuaNJHz?<&NNBWNANC2A@p222NrҌ0<NB0,rNurA9Ar`v C9Cr`rt9@9A9BNrrҌpsNB0,Nu9@N`rDҌpsNBNuC2 @ e @}bA@p222Nr,Ҍ0<NBNu pa2|a>:><|a4g RGj`a(0GVfA1G<ap??<?<NM\Nu??< NMXNu 2$NuE`B<gJEgEjCDEDF Fe( F dF8BCHC` F0bFHC8v` HD8HDkDуdQRBNuDdBDA@kgAр[SBk0NuJlJBk&Nu0g H@rB JkЀ[` BbNuJBj prtNuHPAJgPpr$< _Nup _Np `p ap Cpln<,(AL$I"vz x `gfURf~QjJFj4\Fk.aPHS&I.N``p???<NM\Qj&_Nu|HQ/g ??<@NAXXfNuJkp%NNu09x&k@FC Be& B dЄeNu B0dHDDdRdQRBNu&<x*<NfFC Be B djNu B0dDdSkfJAftNuAр[SBNu"l`d&6JBft&&| NuN"l`ep N c 2$F4BBNJBgB*#E8#&#Jjh`,J]o6\`6 c 2$4BBN*#8#&#Jk:JkִEffDbAeABJk0!NuRdQRB`JjҺBf̶fȸA` c 2$4BB*#[8#&#Nf*#8#&#JBgJjEJjL`Ja:Jo\`Jk:JkEffDbAeABJk0!NukDNuQRB`JjҺBf̶fȸA`p`pN @ddAgH`p`p9@(9@*BlNuvN.)@p `H@)@prtNJf`CfSHj-D@Hd0H@H 0H@0`fSC\fS , @a"C\fApNNNHP?< NA\NuH@aa/a a Nu@0 9c^Nu| PC>$Error # ][Abort]\f.B &lX)K\)ld` lp ,BQjNup(NV"l`Yd&-KNN"l`YepNA 0 <r$<ANlNN8 Timer Test N`NqNqNN. 2n.. 2nGFATIP09DOC:n MORE BASCompiled GFA Basic TTP File MORE.BAS => GFA Basic Source Code for Program GFATIP09.DOC => This file Since the source code file is pretty self explanatory, I will keep this Doc file pretty short. A bit of explanation comes first. A TTP file must be: Mandatory 1. Compiled Optional 2. Clicked directly from the Desktop 3. Used with a CLI 4. Called from a Parent Program using EXEC The only effective way to test a TTP program is to compile it and test it directly. You will note that you can not run the source for the More program from the interpreter without modification. "So keep it in mind that you can not prepare TTP programs without the GFA Basic Compiler." Since there has been a lot of discussion in the MichTron Bulletin Board about doing this sort of thing, I felt it was time to demonstrate it. The little utility that I've cooked up for you is nice to have around with a CLI that does not have the MORE command. Use it with this .DOC file to see just what it will do. Try this Command: Double click on MORE.TTP Enter this on the command line: GFATIP09.DOC What will happen is the file will be displayed to the screen line for line until end of file. At the bottom of each page the screen will pause until you press a key. At the end of the file you see "EOF Please press a key to end". You will then be returned to the desktop. You can try the same thing with a CLI such as DOS Shell by Tim Purves like this: From the prompt: A>run more gfatip09.doc -or- A>more.ttp gfatip09.doc (How your particular CLI functions may vary) When you press return, the file will be displayed on the screen for you in much the same manner except that you are returned to the CLI instead of the desktop. Word of Warning!!!!!! By examining the source code you will find that I have NOT included ANY error trapping. YOU MUST enter the correct file name to be read by the More program along with it's extension. It will ONLY work properly with ASCII files (ie...non ascii files can be displayed, however the results are unpredictable and may hang up the computer). So the bottom line is that you will have to do the work to create a smooth running un-crashable program, this one is just an example. I hope this file and code helps to answer all of the questions that you all have had concerning this subject. If you happen to get stuck with something drop either myself or Rich Noe (NOEGFA) a letter via GEnie Email and we'll try to help out. John B. Holder GfABASIC>FFFFFFFFFFFFdAPAGERINGTHEBELLAFILEOFILECOMMAND COMMAND_LINETEMPICOUNTPUNIX MORE Look-a-like using GFA Basic and demonstrating how to use GFA Basic to create a TTP file. ( Version 0.1  N$ By o* John B. Holder e. Senior Software Engineer f, Marathon Computer Press $ 9/19/87 * GENIE => GRIFJOHN , CIS => 75766,505  N N P This program will function with any CLI, however it is likely to turn on Nthe mouse cursor and leave it on the screen. Ideally it is best suited for @use directly from the desktop or within a GFA Basic program. e s sE F n nNCommand_line$ is the information that you wish to pass into the TTP program .in this case it's the file name to display i n ny!z !~~FjFZEG6 F P>@  F! EB FF F ,FG o"Now to get down to brass tacks  o"The actual More Program follows  h h 7I!M!FFF ZrM F =`M!FFZ 8F -----Press a Key--------FEa FYFjF  FE4F jFrFFB` FRing The Bell EOF --- Press a Key to EndFEa F4qFh That's all there is folks! `VQ` Efv*oM4 m HPHUBg?<JNA(m)m -:gS)@ -OK1PC#HN(Hx?<HNA@)@l/?<HNA)@h&@)@XЬl)@d)@`ARCpr Ѝ"QHNFALNHz2?< NA\pdAxr0XQ)K\NN~BJJJJJJA̐ NuJrBjNuHz?<&NN\NCAp$L Qp N9lrBlJpNNpMN9@pdAr 0Q0tr N9lNupealp`NuaNJHz?<&NNBWNANC2A@p222NrҌ0<NB0,rNurA9Ar`v C9Cr`rt9@9A9BNrrҌpsNB0,Nu9@N`rDҌpsNBNuC2 @ e @}bA@p222Nr,Ҍ0<NBNu pa2|a>:><|a4g RGj`a(0GVfA1G<ap??<?<NM\Nu??< NMXNuHn 2$4BBNuAd RdQRB BbABJk 0NuJBjBBXNu 0Nu 2$NuE`B<gJEgEjCDEDF Fe( F dF8BCHC` F0bFHC8v` HD8HDkDуdQRBNuDdBDA@kgAр[SBk0NuJlJBk&Nu0g H@rB JkЀ[` BbNuJBj prtNuHPAJgPpr$< _Nup _NpNNuCDEJEgJBgJjBEBQ*HE?<>0rHGGdHGGdSWDуdi\?<>0rHGGdHGGdSWDуdiN?<>0rHGGdHGGdSW2 H@N?<,>CEdGH@0r`?<`JBgVB&8TTDуdQRBNuDAр&AdRAрAрDуNuprt|=|8  g +g -f .g20  b 0e 9b da`RF` .f 0e 9b dajSF` Eg efX +g -f 0e 9oSH`00  b&Hz0  b E Do`HJjDDDS4</NJFkSFk&aQN`Ha"FFaQL8Nd6.8JgtBn8Nupr$<NuJBk4<rpAC v JBgJjv-| Bb BkH>aaNRFBdL8?Nd<JBga2SF Be BgQRB`ApdR e <rRF&0xafEv+0JFjDFv-Hƌd0BFHF 0HF0ANuprt|`2:HQ A dRGFc8>`4A g6 g0 g` gTlfelhgFf2pRGRFa`a,` `?~ap ap a 0NuCpE`bf`FgRGJGgRSGSFFgCpE`Yf`Nua@Jf gH@ fa(@ fza0 b @ Ee0Nu?<?<NMXNur9A(HNDLNu0,^2,`NzEfpaRppaNAEg0PaľEfa4RE`p a2a*Efp a(NƼldeS@f lbfSl`9Ab9FdNupapqr`p`ak NupNuakfpNupNtddA0oH?<?B?<BNA Jk.,?<?B?<BNA *kBg?/?<BNA JkNuNp`pNu)H9@Jp4NP'J&f H LNu P&NuQ'` J,'fJ,&gHA#ȇeC! B,&LNu-W)K20, 8k8@ gJl&f"Nu , 8g"P 8 @/, 8NX  8fQ 8J,'gNupB <``L@ H)l26)z @W , Jf`CfSHj-D@Hd0H@H 0H@0`fSC\fS , @a"C\fApNNNHP?< NA\NuH@aa/a a Nu@0 9c^Nu| PC>$Error # ][Abort]\f.B &lX)K\)ld` lp ,BQjNup(NV"l`Yd&-KNN"l`YepN <NC6NN/ -6/p""_NRBm +|FA6NjAFNHm6 -F"_N\HPp ND"_NRfN4Hm6pND"-F"_NN`NqNqpINDHPA6r"_NN\pN$VHgNpNN(CAN&<x*<NjfNNN-----Press a Key--------N>pNANNBm AN`bNN>NN>NpNDN2N>NNEOF --- Press a Key to EndN>pNANNNJD. Wn.. WnGFATIP10DOCxsJ~INKEY BASotJ0. ]n.. ]nACCFIX BAS}a ACCFIX PRG}a#GFATIP11DOC|a$$" October 10, 1987 GFATIP10.DOC by John B. Holder Senior Software Engineer Marathon Computer Press Asst. Sysop on GEnie's MichTron Roundtable This is the 10th in a planned series of GFA Tip files. The topic of this issue is utilizing the entire range of ASCII characters as obtained with the INKEY$ function in GFA Basic. In this archive you will find the following files: Inkey.Bas | the demo program GFATIP10.DOC | This text file Since the enclosed program file is fairly self explanatory, I'll keep this file pretty short. I'll give you a short explanation of what Inkey$ does for you and refer you to the manual for the complete description. Then I'll tell you what we have done & how it relates to software utilized in this country and that in Europe. Technical aspects of INKEY$ The INKEY$ function within GFA Basic returns a value for a pressed keyboard key (or combination of keys). This value can be either 1 or 2 bytes long. If the key pressed falls within 0 and 128 on the ASCII scale, the value will reflect the key pressed and will be only 1 byte long. However, if the key pressed value is higher than 128 ASCII, the value becomes a 2 byte long string. That is where we run into problems. Without our little fix, we would effectively lose many of the printable characters that are obtainable with the ST. The reason for this is that the current versions of GFA Basic pad this two byte value with a preceding null byte if the ASCII value is >128. In a sense what it is actually doing is giving you this => CHR$(0) + CHR$(Key Pressed (minus) 128). Why it utilizes this format, I can't answer. Unlike the INP(2) function which returns all key values as obtained from the keyboard, INKEY$ uses this abnormal value padding scheme. What's this all about? A lot of GFA Basic user's have been disgruntled about the filtering of all of the special printable characters by the INKEY$ function, (myself included). Many applications call for full keyboard access on the fly. Since this is not possible with INP(2), the only logical answer was to try to use INKEY$. But with the filtering that it was doing, it appeared impossible to accomplish. Since it took on that gloomy aura, and since I was told that it was a hopeless cause, I decided to tackle the problem for my own benefit and that of everyone that was interested. By utilizing GFA Basic's rich suite of commands I found the loophole to make a FULL KEYBOARD ACCESS routine with INKEY$ a reality. Since we have the CVI command in GFA Basic it was a snap to pull off. What CVI does is convert a two byte string into a 16 bit integer. Well, once I stumbled onto that and realized what INKEY$ was doing, I just put two and two together and converted the string to an integer and added 128 to it if the value of INKEY$ was more than two bytes long. EUREKA! Some of you might now be thinking, "Gee you could do that with Right$() and Val() too!". This is true, but it is much more elegant with CVI and requires fewer steps too! The significance is that when used properly, the INKEY$ function can now do everything that Form Input does currently albeit in a more interactive mode. Not only that, it will allow our European friends to utilize your programs with the full access to their character set. Before, the INKEY$ function was screening out those values.... Not Nice! Due to time available, I did not have a chance to write a program that would function in all three resolutions, so I stuck to the MEDIUM resolution mode. But not to despair, the program is just a fancy way of getting across the significance of this INKEY$ discovery. I have outlined the procedure very clearly in the source code for you. Also as an added bonus I've thrown in the way you find out what version of the Interpreter that you have. It'll appear in the form of an alert box when you press the ESCAPE key to exit the program. Enjoy! John B. Holder Asst. Sysop On MichTron RT @GEnie Address => GRIFJOHN GfABASICBX\\\\\\\\\\.jlREZTOPLEFT LEFTMARGIN RIGHTMARGIN TOPMARGIN BOTTOMMARGINATEMPKEYPRINTKEYPRINKEYOUTBThis version of the Inkey$ demo only runs in MEDIUM Resolution lPI've outlined the part of the program that does the work, however and it will run in any resolution. o > Version 1.0 by John B. Holder, SSE MCP 10/10/87    YFE F D FF()!Runs in Medrez Only!!! OK !FqF FEHHFFE FFE44FE F $!!!F%!!F!!!F!!!F%!!F2 ! ! ! F.<Y8!  "$INKEY$ Revisited: By John B. HolderFHY!` "1Senior Software Engineer, Marathon Computer PressF(Y! "For GFATIP10.ARCFn,Yp!0 "Prepared OCT 10 1987Fe6YH!@ "Press the ESCAPE key to quit.."F!FFF  6HERE IS THE ROUTINE THAT IS DOING ALL OF THE WORK!   ESFNCHECK TO SEE IF THERE ARE TWO BYTES RETURNED AND IF SO LET'S CONVERT THEM..   F6 F Eg FEF EB F   F      GFEF @NOW LET'S SHOW SOME FANCY TEXT MANIPULATION WITH THE OUTPUT! C (!!!F'!!F(!!a F'z!!F(!!a F'/!f!F(!!( F'a!p!F F,LET'S LEAVE IF THE ESCAPE KEY IS PRESSED.  E7 XFF  2NOW FOR THE VERSION OF YOUR BASIC INTERPRETER! H HF   qFNPlease address all comments and questions to the MichTron RT Bulletin Board (On GEnie in the GFA Basic Q&A Topic. H 4 MHGfABASIC(222::::JJJ H J n t | | | REZBUTTONXCOUNTACCSHOWA ACCSCREENOUTOOPSMMENUMAIN ACCHANDLER,GFATIP11.BAS Written By John B. Holder , Senior Software Engineer * Marathon Computer Press  < "This is a Public Domain Software Solution" 4 See GFATIP11.DOC for Details   E F(Rez=0 if machine is in low resolution ,Rez=1 if machine is in medium resolution r*Rez=2 if machine is in high resolution n  ,Let's dimension an array to hold our menu *HH F>The extra room is in case you want to add more items later r  E Desk F  E About Program F E-----------------------F E1F E2F  E3F@ E4F` E5F E6F EFA  E Accessory F$0 E Use An Accessory  F$@ E Return  FP EFt` E Quit F 4p E Your Routine Fe You supply these.. n E Your Routine Fs E Your Routine Fs E Quit Demo Fs EFi  EFi  ,Now for the GEM menu handling routines:    FvLFrFPEGF!FE >FG $Put up a sample screen to look at  <' !H!&Desk Accessories Won't Punch a Hole InF2' ! ! This Screen Folks!Fs>'`!4!'Compliments of Marathon Computer PressF:' !\!$ Written by John B. Holder 11/1/87F:' !!# At Marathon, We Go The Distance!FF   FFFr      ,Now for your menu handling (MAIN) program  +FfJWe'll assign the variable Button to whatever the menu item selection is E F F  JF>)!' The Desk Accessory | Solution! | !! Thanks !F F  JRemember to leave Buttons 2 through 9 vacant as these are for ACC's and routine menu management.  & 0Fc Use an Accessory?  4  F Make sure it wasn't already selected. First a quick memory check  jFt X zFu.)!Not enough Memory! | | !! Sorry !F F6Here we define the fill pattern for the background a  Fi>Set the accshow variable to one to show that it's selected! EF  F%!!F  F%!!F  FEGF!F F@EPGHF !FE FP 8FF!0!!GFn F lFF!0! !GF F FF !! !GF  F F F F   @F,Test to see if this is a valid call first then do it! F 8Here you must redefine the fill patterns if necessary  rEGF!FE `FGEPGHF !FE FPFBjF This frees up the memory and returns the 32k to the pool. jF*X F Do some forced Garbage Collection  F F  F X)!D  Solved by  | John B. Holder |Marathon Computer Press!! Bye !FqF F   8At this point you can continue on with menu routines   .FJB ,`"Q|` Efv*oMJ m HPHUBg?<JNA(m)m -:gS)@ -OK1PC#HNHx?<HNA@)@l/?<HNA)@h&@)@XЬl)@d)@`ARCpr Ѝ"QHNFALNHz2?< NA\pdAxr0XQ)K\NN$*222>>>N ,`NuJrBjNuHz?<&NN\NCAp$L Qp N9lrBlJpNNpMN9@pdAr 0Q0tr N9lNbNupealp`NuaNJHz?<&NNBWNANC2A@p222NrҌ0<NB0,rNurA9Ar`v C9Cr`rt9@9A9BNrrҌpsNB0,Nu9@N`rDҌpsNBNuC2 @ e @}bA@p222Nr,Ҍ0<NBNu pa4|a@:>< |a6RGk0Gg`a(0GVfA1G<ap??<?<NM\Nu??< NMXNuHn 2$4BBNuAd RdQRB BbABJk 0NuJBjBBXNu 0Nu 2$NuE`B<gJEgEjCDEDF Fe( F dF8BCHC` F0bFHC8v` HD8HDkDуdQRBNuDdBDA@kgAр[SBk0NuJlJBk&Nu0g H@rB JkЀ[` BbNuJBj prtNuHPAJgPpr$< _Nup _NpNNuCDEJEgJBgJjBEBQ*HE?<>0rHGGdHGGdSWDуdi\?<>0rHGGdHGGdSWDуdiN?<>0rHGGdHGGdSW2 H@N?<,>CEdGH@0r`?<`JBgVB&8TTDуdQRBNuDAр&AdRAрAрDуNuprt|=|(  g +g -f .g20  b 0e 9b da`RF` .f 0e 9b dajSF` Eg efX +g -f 0e 9oSH`00  b&Hz0  b E Do`HJjDDDS4</NJFkSFk&aQN`Ha"FFaQL8NT6.(JgtBn(Nupr$<NuJBk4<rpAC v JBgJjv-| Bb BkH>aaNRFBdL8?NT<JBga2SF Be BgQRB`ApdR e <rRF&0xafEv+0JFjDFv-Hƌd0BFHF 0HF0ANuprt|`2:HQ A dJf`CfSHj-D@Hd0H@H 0H@0`fSC\fS , @a"C\fApNNNHP?< NA\NuH@aa/a a Nu@0 9c^Nu| PC>$Error # ][Abort]\f.B &lX)K\)ld` lp ,BQjNup(NVtHB9BL@@TAt )l g.A( f hgSASAgRB`9BJNSAgNu)l g,vARC( g9CJ9|Lp!,N FPeNuvA JpBQA/)H )l gBlJpNB Aprt0 0BBB R@ @efA000 0PB0 *00 000\0X0 *0000 0P0BX0, *@00p1| 1|QBX0 $HTH0P &0 *0,NupNSk [0NupNuHPaH8 _&X Pf/|~ K!zag @ ep 24C"2 S@ػ Td BTA3A0C4$I2a222B"0@2A\xvaRg<2#M 4B3BS@ -f ػ Td>BAAb8RGRC`3RSG5GC5C J1DcaRF F e`RG GcdNuXASF1F41R 1h4 x1EDgVA)H)H 9|J?<NNTU@g,ACg dRhdRh(gpL8Np>L8Np*HEAJ0?C bL000H?A/.)HpNLrHH/>Bl/,ff.f.ffNu l /.g&, ^`D&, N`>&, R`8&, V`2&, Z`,2,/4WAARA0,/6A hfRAS@f9A/,&, Jo ? CN0`@k Ap0(/.NuA Nup)@JphNLtH &JKBCH .A/~0 1PP1P1PA L? &<@>AFG0000X0000X0000X0000C ~AJ0g0  pi, N"F QNu"l`Yd&-KNN"l`YepN&#k"C-KN"Cփk փk2##`փk"`2`& $Y8gHRDD*D%H8#$c2g# HRDD%H`"X0gBPHR@@"D#Nu?<NNTANpdC2NXBNT Desk C2N0HxN` About Program 4C2N0HxN`-----------------------4C2N0Hxp1NC2N0Hxp2NC2N0Hxp3NC2N0Hxp4NC2N0Hxp5NC2N0Hxp6NC2N0Hx A C2N0Hx N` Accessory 4C2N0Hx N` Use An Accessory  4C2N0Hx N` Return  C2N0Hx A C2N0HxNT Quit C2N0HxNT Your Routine C2N0HxNT Your Routine C2N0HxNT Your Routine C2N0HxNT Quit Demo C2N0HxA C2N0HxA C2N0A2N)| JNA @0 <r$<A NZA N /p"NXN`NqNqp2r NNT&Desk Accessories Won't Punch a Hole InNpFr NN` This Screen Folks!NpZrNN`'Compliments of Marathon Computer Press4Npnr NNT$ Written by John B. Holder 11/1/87N <r NN`# At Marathon, We Go The Distance!4NN`NpNJANNAN&<x*<NZJBfNHxN`' The Desk Accessory | Solution! | HPNT Thanks r"_ NF+@*AN&<x*<NZJBfN!XAN&<x*<NJBfN!XB.N }mNHxNTNot enough Memory! | | HPN` Sorry r"_ NF+@. -.SfN!XA 0AN&<x*<NJBfN pNpNpNN pNpNpNA @0 <r$<A NZA N /p"NXN`NqNqA P0 <r$<A NZA N /p"NXN`NqNqANzNZJBfN A$Np rN <"<?NAN&<x*<NZJBfN!A$Np rN <"<NAN&<x*<NZJBfN!XA$NprN <"<NAN&<x*<NZJBfN"8AN&<x*<NZJBfN"8A @0 <r$<A NZA N /p"NXN`NqNqA P0 <r$<A NZA N /p"NXN`NqNqA$N*A$NBmNAN&<x*<NZJBfN"HxNTD  Solved by  | John B. Holder |Marathon Computer PressHPN` Bye r"_ NF+@*NN,N&t$N2DDD$ November 1, 1987 GFATIP11.DOC by John B. Holder Senior Software Engineer Marathon Computer Press Asst. Sysop on GEnie's MichTron Roundtable This is the 11th in a planned series of GFA Tip files. The topic of this issue is using Desk.Acc's from within a running GFA Basic program without punching a hole in the screen when the accessory exits. In this archive you will find the following files: Accfix.Bas Accfix.Prg GFATIP11.Doc The enclosed files will be pretty much self explanatory, so I will keep this Doc file to a short explanation and take a few lines to make a warning or two. The Problem? The problem with the current version of GFA Basic is that when a Desk Accessory is selected and then exited, a nice gaping hole is left in the middle of the screen where it once lived. This is due to a number of reasons. The main one being that the Developer chose to present a white background screen most likely cleared with a VT52 Clear Screen command. Aside from the obvious, it has become painfully obvious to GFA Basic Programmers and Developers. The worst part is that it is almost impossible to detect when an accessory is either opened, or closed with GFA Basic unless you resort to numerous GEM calls that are very confusing and unforgiving. If you happen to be one of those that prefer the hard way, more power to you. A good reference would be The GFA Basic Book (By MichTron) if you choose the GEM route. For the rest of the world, myself included; I have created this tip file to solve the problem. The Solution? Our chosen solution is foolproof only if the program user is willing to cooperate a bit, and if you keep a few things in mind when developing your programs. I'll leave the nitty gritty details to the commented GFA Basic source code, and only mention the cooperation details and the warnings. Cooperation: This fix requires the User to tell the program when they want to use an accessory, & then tell the program when he or she's done with it. To enforce this option, we disable the desk accessories right off the bat, (see the source for details). Next we offer a Menu Option "Accessory". Under this option there are two choices, "Use an Accessory" & "Return". When "Use an Accessory" is selected a series of reactions take place. They are: Part 1 1. See first if the option is already selected. If it is, let's just ignore the request. 2. Check to see if we have 32000 bytes of spare memory for the screen buffer. 3. If so set the ACCSHOW variable (means we're gonna' do it). 4. Grab the currently displayed screen. 5. Put up a GEM Desktop compatible chalkboard, (background color and fill pattern for the current resolution) for the Accessory to work on. 6. Enable all of the present Accessories that are being reported to the GEM menu. 7. Disable all of the other options in the GEM Menu until we are done with the Accessory. Part 2 If the "Return" option is selected we start a series of reactions that go something like this: 1. Is the ACCSHOW variable set? If so then this is a valid call, if not just ignore it. 2. Next we put the screen buffer back into place, just as it was when we decided to use an Accessory. 3. Clear the ACCSHOW variable. 4. Clear the Screen Buffer and return the 32000 bytes to the dynamic memory pool so it can be used by the application. 5. Force the application to do some garbage collection. Only takes a microsecond (give or take a few picoseconds) & helps out with memory management and can speed up the running of the application. 6. Re-enable all of the regular menu options and disable the Desk.Acc options. 7. Get back to your application and allow GEM to handle the user interface. ** Warnings ** The user must be told in documentation that if they select the "Use an Accessory" option that they MUST properly close the Accessory before choosing the "Return" option. Failure to do so will cause the accessory to be hidden behind the Screen Buffer replacement screen when "Return" is chosen. This is bad for a number of reasons. It can cause the Desk.Acc to interact with your program when returning.... Ie.. mouse click on a hidden dialog box, or worse. Not good! Hey, then again; How many people use an accessory and then don't close it? Believe me, they will try if you don't tell them first that this is a no no. We don't want hate mail from a disgruntled User do we? So the moral of the story is tell them that you want them to be able to use accessories, but they need to cooperate and tell you when they're done. Sounds Fair, Right? In return, there won't be any unsightly holes punched in the screen when a Desk.Acc is used. The second warning is to those that are using applications that may have a GEM window on the screen when "Use an Accessory" is selected. If this is the case, you should do a few things in order to make the option work properly. They are: 1. Either close your window first 2. Fullw(#) and then Clearw(#) before allowing the "Use an Accessory" option to draw the chalkboard. Why? By the nature of GEM, all graphics commands are automatically directed to the currently active window. Therefore, if a window is open the chalkboard will go into IT and not the entire screen as is intended. So... Big deal? Well, if your active GEM window is not "Fulled" we won't get the full protection of the temporary chalkboard since the Desk.Acc may appear anywhere on the screen or perhaps be moved anywhere on the screen. Take my word for it, I've tried and failed any other way. In a nutshell, if you allow the access to the GEM menu bar while a window is displayed, it's best to first close the window(s) and then let "Use an Accessory" do it's work. Following the "Return" you can always reconstruct the screen. To detect that you can place a Flag variable at the end of the "Return" menu option handler to signal that a Redraw is necessary. Closing Comments Although not entirely foolproof, this method of utilizing Desk Accessories is the most complete and clean way I've seen so far. It's sure better than some Kludge to detect if a point on the screen has been altered and then try to do a redraw! If used properly, it should suffice in the pursuit of allowing Users to use their Accessories, while maintaining screen integrity. Hopefully a spirit of cooperation will prevail and everyone will be happy. The Way Ahead? The developer of GFA Basic has stated that he'll attempt to come up with a fix for the current Desk.Acc malady with the next version (3.0) due in the late spring of 1988. There were no promises made though, so don't quote that statement and try not to be disappointed if it doesn't happen. Comments and PD release This GFATIP file is in the public Domain. However, the documentation file is Copyright (c)1987 by Marathon Computer Press, and is provided as a public service. You may not include the text of this file in any publication, or newsletter without the approval of Marathon Computer Press. The source code and idea are free for grabs. You may also post this file on any bulletin board as long as it is posted in it's entirety. No charge (of any kind) may be assessed for providing this Tip to the public. If it's not 100% Free, don't do it! Nuff Said. I hate to have to do this, but some people have been selling my GFATIP series at a profit. If anyone has a right to do that, it's Marathon Computer Press & nobody else. I hope you understand. If you have comments concerning this file, or any other GFATIP file you may leave electronic mail for me on: GEnie => GRIFJOHN CIS => 75766,505 Or Write to: Marathon Computer Press P.O. Box 68503 Virginia Beach, Virginia 23455 . H(... H(MANUAL DIAJ(/DESKTOP INFM(4DESK_JETINFP(5MANUAL INFS(6MM_READ ME V(7MANUAL PRG[(8OMANUAL RSCd([%MANUAL TXTh(e*MANUAL REV m(p:.** DO NOT USE MANUAL MAKER TO PRINT!! - PRINT FROM DESKTOP ** Here is a diagram of how Manual Maker uses a piece of paper. Use this as a reference when using the 'Page Alignment/Configuration' dialog. ____________________________________________________________________ | | | | | | TOP OFFSET | | | | | | | ________________________________________________________ | | | | | | | | | | | | | P W | | | | LEFT | | | | | A I | S | |- -| | | | | G D | H | | OFFSET | | | | | E T | E | | | | | | | H | E | | | | | | | | | T | | | | | | | | | | | ---------------------------------------------------- | | | | H | | |- - - - - - - - - FOLD-LINE - - - - - - - - - - - | | | | | E | | ---------------------------------------------------- | | | | I | | | | | | | | G | | | | | | | | H | | |- - - PAGE HEIGHT/SHEET WIDTH - - - - -| | | LEFT | | T | | | | | |- -| | | | | | | | | OFFSET | | | | | | | | | | | | | | | | | | ___________________________________________________|____ | | | | | | | | | ____________________________________________________________________ The idea is to insure that the 'FOLD-LINE' is centered top to bottom on the paper. This insures that the 2nd side printing is aligned properly. Since your print is running off the bottom of the paper (right side of the page), you should probably reduce your sheet height and, if you want the same size center margin, reduce your page width. With respect to the text in the printer test, the corners define the 'Sheet' and the other text defines the 'Page-width'. The 'U' in 'Upper Left Corner' is the Top offset plus any space at the top of the paper that is not recognized by the printer driver. The diagram looks good to me now, if it stays the way it looks here, it should help. If you don't want your manual pages to be quite so tall, reduce the Page Height/Sheet Width. This will effectively reduce your lines per page. You can then set your Left-side offset to a higher value if you want the print to be more toward the Right side of the paper. Setting the Left-side offset allows you to adjust your top and bottom margins for the manual pages. Remember: The SHEET has the same orientation as the paper, but is smaller in size. Hope this helps. -Craig W. Daymon ** DO NOT USE MANUAL MAKER TO PRINT THIS DIAGRAM!! - PRINT FROM DESKTOP ** |PHdH@3AN^NuNV>,N(N=@0.@|?3Cp0.r `|3B>*N(N=@0.|3B0.@|3?0.r `||PHdH@3AN^NuNVBW?9A/<)a\>?9?/<)a\>?9B/<)av\BW?9Cp/<)ab\JyBg,> y Bo ?9BW`?9B/<)a0\`>?< /<)a\ y BlpA`#a000000 #b000000 #c7770007000600070055200505552220770557075055507703111103 #d #E 9B 02 #W 00 00 0A 03 33 13 08 A:\*.*@ #W 00 00 0D 08 2A 0B 00 @ #W 00 00 0E 09 2A 0B 00 @ #W 00 00 0F 0A 2A 0B 00 @ #M 00 00 00 FF A FLOPPY DISK@ @ #M 00 01 00 FF B FLOPPY DISK@ @ #T 00 03 02 FF TRASH@ @ #F FF 04 @ *.*@ #D FF 01 @ *.*@ #G 03 FF *.APP@ @ #G 03 FF *.PRG@ @ #F 03 04 *.TOS@ @ #P 03 04 *.TTP@ @ #G 03 04 MANUAL.PRG@ *.TXT@ mRn0.y?mBn` 0n=2n=0jRn n5m n #@RDf n c@RDfBn`,0n"|=00j|H}|0"nRnR n0m=|0`"0n"|=00j|0"nRnR n3mBW?9>h/.a,\TBW?9>j/.a\>/<AN%vXN^NuNV>/<AN%TX-|A n #@RDf n b@RDfBn`"0n"|A0H|0"nRnR nm>/<AN%vXN^NuNVBn` 0n=2n=1QjRn n5mBn`*0.@Hм=.?.?9?NXRn n8000 4500 09750 0500 0000 }=@0.|0"yA>?<Vpn?N 6X3.\09CR@0@"|=00|H}=@0.|0"y?>?<Vpn?N 6X3.09CT@0@"|=00|H}=@0.|0"y?>?<Vpn?N 6X3.a=|6`0.м- @Bh Rn n:o09=|6м- @1| >?<m09=S@?N 6X3131>?<m09>S@2?N 6X3232J>>?9=a TN^NuNV>>d?9>fNPTJy>fg <-` <-#2Jy>dg <-` <-#2N^NuNV9AH@>9AH@W9AH@W9AH@W9AH@W9AHW?<!N(.TN^NuB?< NA\#p<#@<#?r n1y>t n1y>vN^NuNV# <3 <3CZ3C\3C`3CfN P#? aF3BCVpN^NuNV>a*pN^NuNV3B3 B3 B3B3B3B3B3B3B3B3B3B3 B3"B#$Cr3(B3*B>N f n,0B n00B n40B n80B n<0B n@0BB@09BN^NuNV3B3 B>N fN^NuNV#Cr3 B>2N fN^NuNV3B3 B3 B3B3B3B3B3B3B>3N fN^NuNV#Cr>6N f n 0B n0B n0B n0BB@09BN^NuNV3B3 B3 B3B3B3B3B3B>IN fN^NuNV3B3 B3 B3B3B3B3B3B>JN fN^NuNV#Cr3 B3B3B>KN fN^NuNV Before using Manual Maker, print out the file MANUAL.DIA from the desktop. This is a diagram of how Manual Maker will use a piece of paper. **Manual Maker requires GDOS or G+PLUS, GDOS printer driver and GDOS printer fonts to run. These are available through several other programs. (EasyDraw, Timework's DTP, FONTZ!, WordUp, MicroSoft Write,...) The text, MANUAL.TXT is the manual for Manual Maker. It is formatted with imbedded commands to be used by Manual Maker. Imbedded commands are preceded by an ampersand. To get a better idea of how Manual Maker works, you can view this file from the desktop before running the program. The text, MANUAL.TXT, is a good example for learning how to use Manual Maker. N fN^NuNV3B>kN fN^NuNV3B3 B3 B3B3B3B>lN f n0B n0B n0B n 0BB@09BN^NuNVH *n(n >0-W?0,WN(T:>0-W?,0,WN(T8>?N'T>>?,N'T<89F0G9@0F9@GoF`{ KJ$f(By{OH/9~?<HNA\OJk.@~`6 - ЭЭй~"ҍ¼.A// Bg?<JNA #V yV/(,HhN4P/9/9?9 N9NN4pNT?<NENV0.g,0. H/ </N9 Ю @0( n1@ `.2.FA0. H/ </N9 Ю @0( A1@ N^NuNV0.g,0. H/ </N9 Ю @0(n1@`.2.FA0. H/ </N9 Ю @0(A1@N^NuNV0.g*0. H/ </N9  n10<`$`"0. H/ </N9  n00NqN^NuNV0.g*0. H/ </N9  n10<`$`"0. H/ </N9  n00NqN^NuNV0. H/ </N9  n-p n Jnl/.NPX n1@` n1nN^NuNV0. H/ </N9  n10. H/ </N9  n! n  n!nN^NuNVBnNS0HyN9X?<?<N3X/9V?<IN9\Bg?9N]HXNU?9NWTN2N^NuNVrHyn?<BgNUPHy|HnNPP?<Hn?</9nN@O Hy|$HnNPP?<Hn?</9nN@O Hy|*HnNPP?<Hn?</9nN@O Hy|0HnNPP?<Hn?</9nN@O Hy|6HnNPP?<Hn?</9nN@O Hy*Hy(Hy&Hy$/9nNSOC$ OpN4rBgBgBgBgBgNTOC$ OpN4r?<Bg/9nNUO?</9nNT\|=@rHnHnHnHnHnNOfC$ OpN4rBgBgBgBg?<NTO?<?<N3XC$ OpN4rBgBgBgBgBgNTOC$ OpN4r?<Bg/9nNUO`,0.r` `Hy|0. n0H| f&0.R@HЮ/0.HЮ/NPPSnRn0.nm0<N^NuNVA}-HBy8`,098ABp098A|@Ry8 y8mHyn?<BgNUP?HnNOO ?HnHnHnHn?.?.N\O n 1@ n 0(nf`Rn0.noN^NuNVHynBgBgNUP?<?<?</9nNO Bg?<?</9nNO ?<?<?< /9nNO Bg?<?< /9nNO Hy~FHyNPP?<Hy?< /9nN@O ?<Hy?</9nN@O ?<Hy?</9nN@O Hy*Hy(Hy&Hy$/9nNSOC$ OpN4rBgBgBgBgBgNTOC$ OpN4r?<Bg/9nNUO?</9nNT\C$ OpN4rBgBgBgBg?<NTO yn hW|3t yn hf0<`0<36HyNPXgHyNDXS@`0<3"N^NuNV/.HnNPP?<N9T=@0.|A@|:0.R@?Hn?<GN9PHy~HHnNOP/. HnNOPHnHnHnNTO 0.gHnNPXf nB`nHnNPX=@`Sn0.g&0.S@A0@H|\g .H|:f0.AB0Hn/.NPPHn/.NOPN^NuNVB3r yVBByb`f09{g09bgRyb0.HѮRyb09bydl09:g(09rRyrH yV!By:BybBgN+T=@fN^NuNV09rH=@09rHH@`Tn`Rn``|g|g|g0.R@=@3^3Hyn?<BgNUP?Hyf*-H|>fA-H8=|` A-H8Bn`09 Ry @A@! .8g<`RRG-g*H|gHA'0H|f n8 RRG0nmrB .J@m?Bg?<FN9\BgNIvTf"A1| A1|A1G .g<0<2.g2<`2<A?/.NM\>J@m??<?<FN9\?<NIvTf 0<2.g2<`2<AA1@ 09 R@@/?<HN9\#><`0@A@ 02H y!RG0y m y 09 H yBL0N^NuA>Xy !J!_ NMYyA>"P$h/( J@NuA>Xy !J!_ NNYyA>"P$h/( J@NuA>Xy !J!_ NAYyA>"P$h/( J@NuNVN^NuNVN^NuNVH$.f BB`J". BnJlVnDJlRnDvd`Bbd nmDdD-@-A LN^NuNVHBG".l~D$. l GD&gHC H@J@g@HCBCւJGgD-C LN^.JNu#HyN;XONuHyN<,XO 9Nu#HyN;pXONuHyN;2XO 9Nu#HyN;XONuHyN<,XO"9Nu#HyN;pXONuHyN;2XO"9Nu#HyN;XONuHyN<,XO$9Nu#HyN;pXONuHyN;2XO$9NuNVH n "(fJg"¼м@ LN^NuNVH nB fB`м8 LN^NuNVH n g jDh <r`V$<H@J@fBH@ @bQB @bYB @?bUBJ@kSB&<"F€JHBЂJj LN^NuNVH n "($HBJ&<BnDB Bcp`*` B c <`6<BtjABJjD LN^NuHHy//N=POL/WXONuHHy//N=POL/WXONuH o#`HyHy`N;pN=N;2PO o `L/WXONuH o#`HyHy`N;pN=N;2PO o `L/WXONuH////N@PLNuH////N@܇ۄHAHB>܇ۄH@HC>܇ۄ>ڇلHDHEHF8:|HB>ڇن>؇HC>ڇنH@HB>ڇن~>(JkڅلSG <"FHD„v 歊ȀۆنGk Gc xz`xz`SGOHG؇Jj LN^NuNVH n $& n "(*fJgx(fJgt H@8HB:LME,<.*FHÁ…HC΃ƅąb fbRD1DHBHC.h~>ЇHG~` B@H@:|FH@HAHF<0BAHBHC8:ǒxjSG҃тd6BBHBHC,h ,ІHF|` B@H@:ƒ*HEHE8BEjSF҃BdHG>H@HA0,h ,ІHF|` B@H@6HC:2HAH@xDjSF҃dhrHF<x8(z <"FHG‡v 殌΀݅߅Dk Dc ~|`~|`SDLHDބJj LN^NuNV?< B/.NQ0fl `x EafB?<0<n?/.NMP>JGm ?<B?NIPl 0fl `.Bg0g0<`0<n?/.NMP>0fl Gf Bl 0<H`9G Bl <()@9y L0N^NuNV#/.NF\X/. /.NGTPN^NuNVA X//. /.Na O N^NuNVHn /.B?<NilON^NuNVBBg?.Hn?<WN9O =@JW|N^NuNVJnl3 <`H?.?./. ?<BN9O -@Jm .`?<?.B?<BN9O -@Jl .3 <`?<?.B?<BN9O -@ nf .Ю -@ `& nf .Ю -@ `0.g <` . oH?.NMT|J@f .3 <``` Hn . /?.?<@N9O Bg?./. ?<BN9O J]|=@g3 <`` . NqN^NuNVH .<".ҼS/"</N]"X/./N]. /NNX*@f <`(M)G P/NL`X 9L0N^NuNVH .<".PS/"</N]"Xށ 9(@JfA (@##B*T -e* -f(`  -+G# P`( f/NKX*@Jf <`(M*U`L0N^NuNV0./NKXN^NuNVH .f`v .Q*@(y` m n l`(T o l "-Ёf T (ѭ T*`* ",Ёf -Ѭ(`(#L0N^NuNVBn`<0.@AD00f&0.@AD10.@AD1 ` Rn nmN^NuNVBn`*0.@AD00nf0.@ADBpRn nmN^NuNVH>.=|\AD"HPgXHf0(LN^NuNVHHy/.NOPfBG`Hy/.NOPf><`Hy/.NOPf><`0. |gR0. |?/.?<=N9P>J@m 0. |g&JGm??<>N9XBg/.?<`j0. |gD0. |?/.?<=N9P>J@m"??<>N9XBg/.?<`0. |?/.?<=N9P>JGl 30<`?. ?NLX0LN^NuNV/.?<HN9\-@ .f-|3 .N^NuNV0./NNXN^NuNV .# #3/./. HyNa O yB .N^NuNVA X//. /.NONO N^NuNV . @"n rJWfSWfN^NuLB@ggSBAgHJ@gHANuL rWfNu op`R@SJWfFNuL2/ f0NuSAB@gVSBAgHJ@gHANuNV n R @H=@` n R @H=@ n g n g n g0.N^NuNV=| nxg nXf n f0<`h n0m n9n0.|0=@`2 nam0.|a| =@` nAm0.|A| =@0.n o0<``0.NqN^NuNVBnBHnNP^X=@ n-f=| nRH=@`2 ./0.H/N9 6.HЃ-@ nRH=@?.?.NPX=@ @fSJ g n 0.g .D` .NqN^NuNVH*n (MBn ng?.NMT| fA&H. nU|`H| f S @  . nU| A|l0fD AH-@Hn/.?.?<@N9O <Hg 30<`dA&H0f~ =@`J/ 0./?.?<@N9O -@2.¼g .30<` .n0.L8N^NuNV?<NVFT0<N^NuNVAz#Av#A#Af#AJ#A$#A#?< NVFT3f\09\N^NuNV3# J?<4NVFTN^NuNV#J?<6NVFT n 0h n0j n0l n0n09fN^NuNV33 3 333333 nf 3333?<3NVFTN^NuNV n0 n 0 n0 n0N^NuNV#J3 ?<2NVFTN^NuNV#J# N?<ZNVFT n0h09fN^NuNV?<MNVFT n0h n 0j n0l n0n09fN^NuNV3# J?<NNVFTN^NuNV#J3 33333?<*NVFTN^NuNV?<oNVFTN^NuNV33 3?<pNVFTBy n $09fN^NuNV#J?<nNVFTN^NuNV3z0.| AtHЈ-@=|` nR2.AAzH1Rn nm/9NtX09fN^NuNV3,By.By238NZ(N^NuNV3e,By.By238NZ(N^NuNV3,By.By238NZ(N^NuNV3 f3 hBnNq nR2.RnHA|1f3,3.Sn0.3238NZ(N^NuNV3 f3 h3jByl33A-HNq nR nTH0f3 ,3. .AS@323 638NZ(N^NuNV## .мZ# 3d,By.3 2 n 38NZ(098 n 03A#A^#A># Af#N^NuNV## .мZ# 3,By.3 2NZ( n 08A#A^#A># Af#N^NuNV# 3,3 .By238NZ(Af#N^NuNV3,By.By238NZ(N^NuNV .3: .3 .3@N^NuNV09>69@Ƽ n N^NuA>Xy !JHy,#Hy" <sNBYyA>"P$hNuNV3 3,By.3238NZ(Bn`"0.HA`002. n Rn n m09^N^NuNV. H33u,By.3238NZ( n 0> n0B n0F09^N^NuNV3 3 3l,By.3238NZ(N^NuNV3 fByh3,3.By238NZ(09>N^NuNV3 3 3',By.3238NZ( n0^ n0`N^NuNV3 3j,By.3238NZ(09^N^NuNV3 3,By.3238NZ(09^N^NuNV3w,By.By238NZ(09^N^NuNV3 3k,By.3238NZ( n 0> n0@ n0B n0D09^N^NuNV3 3 ,By.3238NZ(09^N^NuNV3x,By.By238NZ(N^NuNV3 3 ,By.3238NZ(09^N^NuNVH$.f BB`&". Bvd d``bd-@-A LN^NuNVHL&gHC H@J@g@HCBCւ-C LN^.JNuNV?.?<LN9XN^NuNVH*n ..(U0.`(<< `><<`6<<BE`,<<:< ` `|Xg|dgΰ|ogа|ug°|xg Jl ndf - D.` 0. fμA м&@B#(/8H/N]X(0 D m2<7E`2<0A /0H/N] X.f/ / NtP*L8N^NuNVH>. *n (U=| Gf><##HyHyN=fP]|=@0R@?HnHnHnNxO0.g-.H|0f.f0` nff<.GRF0no<.JFl0<`0?HnHnHnNxOA&HA&H`SFSn0gJnl`0SnJnl0g.` 0RnSG0g nm`JFoH`0<0SFSG0J@l`J0g.A R&@`SG0J@lE-L0.H/HnBg?<dN^TO (n*L8N^NuNVHBG n*P`0 HC|0>HA'0H|f n 0L N^NuNVH<*n(n &nBn`P?<%/ Nqn\$@Jg2. g$/ ??</ NppO <n0Gg` R(@`*/ NPX>/ ??</ NppO <n`Bn=|Bn8< H|-f=|RH|0f8<0RH|*f R=ST`-LHnN`X=@(nH|.f>RH|0f8<0RH|*f R=ST`-LHnN`X=@(nH|lf=|Rf`$A $@-@H=@`$SX/ NPX:no:.8< `0.g `0H/Hn?.?.N^TO 0.g0<`0<*. ng=n` nRT:<`##/9/9Hn?.?.N_BOP*.`f0. nR:<`P`N|Xg<|cg|dg.|eg|fg|gg|og|sg|ug|xgNcP0.gj/ ??</ NppO <n0Eg`>.E`4Sm0-J@m0 URH|` / ?Nn@\ @f` RnSG0J@l`f>.E`4Sm0-J@m0 URH|` / ?Nn@\ @f` RnSG0J@l/ ??</ NppO <n0Eg`f0.LHA'0H|f n 0L N^NuNV09g/9NlX` yRHNqN^NuNVHNqNd>A'HЈ @H|f0LN^NuNVH>.<. :. BnBnB0.`"<< `2<<`*<<`"<< ``|dgڰ|hg|ogְ|xg E-f=|Nd:0``" "Ё6.HЃ(=|Nd:0SGJ@g??NeJX=@ @f`` 6.HЃ(=|Nd:0SGJ@g??NeJX=@ @f`X` 6.HЃ(=|Nd:0SGJ@g??NeJX=@ @f``|gz| g,|g0.g09gBy09g/9?Nt`\`S0.g D` NqLN^NuNVH>.<. -y-y"BnBnBnBn=|Bn=|-y&-y* G-f=|Nd>`BnBE` G-f0.g =|`A'0pH|g0.g0. G|0=@` G0gBn0.fRE`n0.gSE0.f^##HnHyN=P?/HyN?HPTHy.HyN=P-y-ySn`0 G.f0.f=|` GEg Gef0.f=|``=|Nd>SF0f0.f30.gn`n`*JElHnHnN=PRE`HnHnN=PSE0f0.gHy6HnN=P09g/9?Nt`\`S##LN^NuNVH BG3# #By nX*P`HA'0`H|g2Ne: Eg 09g/9?Nt`\`S` F%gFNe: Ef0<`0Fg&09g/9?Nt`\`S0`v`j0<=@=@=|H|*f=|RHA'0H|g-MHnNdX=@*nH|lf=|RH Dcf0Nd: @f0<`0.f0 nX PRG` Ddg Dog Dxg DhfNe: @f0<`?.??Ne\-@09g0`0.f>0.g nX P `( Dhf . nX P` . nX P0RG`0 Deg DffNe: @f0<`?.?NgNX-y-y09g0`0.f>0.g nX P !n`"##N:l nX P RG` DsfNe: @f0<`0.f nX(P`$0.f0Nd: @f0<`NSn0.g0gA'0PH|gB09g/9?Nt`\`SRGf0L0N^NuNV?.NM@TJnn0<`,?.?<>N9X=@g30<``0<NqN^NuNV nSh0(J@m n R @H|` /.NmXNqN^NuNVH*n0- |g0- |fm 0- |fm@ 0- |`g*Bm0<`X -f / Nz,X*0- |gHyNFX0- |g0<`0-?/?- NsP;@0<L N^NuNVH*n/ Nm4Xg0<`8Sm0-J@l mfm `m@ Bm0<` URH|L N^NuNVH*n 0- |g0- |fm 0- |fm@ Bm0- |@g0<` -f / Nz,X0- |g UR m `<0- |g2m UR . H| g ml . H|`V/ NFXg m@ 0<`>0- |gBm. H|`$`"0-S@;@m . URH|NqL N^NuNVH *n(n`":,A>. Eo>`>. 0g60n ?// NDO 0H0Hє0,g0lGl JEf/ NFXg0<`":,A0. Emv=n 0g<. 2. HHAA`<. 0n `G0H0g?/ ?, NQP>J@n Gf&l@ ?<0.FH/?, NIP0<` 0. f0<L0N^NuNVH*n>. <.(n0, |g0, |fl 0, |f0<` ,f/ Nz,X(9lBE`RE0HSF0J@m/ ?/ NoPO g0, |ff gX0, |g/ NFXgl@ `:&l`R g H| f gH| f/ NFXgl@ Bl0L8N^Nu o/ f pJWf`g fS `pNuNVHn/<?.?<?N9O f|.HN^NuNV09@y>f0<3>3@`BgNqT=@ nf09@gSy@` n f009@Ry@A ?< ?<?<N8\` nf ?<NET nfD0.29@Ry@A?< ?<?<N8\?< ?<?<N8\`"0.29@Ry@A0<f 09>A0H|f0<`09>Ry>A0HNqN^NuNVH *n 0.-@By?.NIvTg6B`NqH|f``RR0.SnJ@f .``4/. /.?.?<?N9O -@Jl .30<`?.NMT| f .=@ . *@(@`v HmT/ 0./?.?<?N9O -@Jl .30<`F .f`.0.*LH| fR`Sn0.f H-@ .L0N^NuNVH*n 0- |f f0<`Rm. S UHL N^NuLrWf SNuA>Xy !J"/0<NBYyA>"P$hNu NV0.f##`$ nl##` n4o#~#~`AB -@ n]|=@g 0.D@=@0.|=@0.g0 .2.HЁQ @##-y-y0.@=@0.|=@0.gn .2.HЁм0 @##-y-y0.gHnHnNAP` ##-y-y0.@=@0.|=@0.gt .2.HЁмh @##-y-y0.f0.gHnHnNAP` ##-y-y0.gH##-y-yHnHnNC P##`##N^NuNVH *n(n Bn-L-U-mBEK.g>OG|JGn|m`NB0T@|dm0<d@D@`B0D@S@|dm0<d@?NvJTOHy/ NAPO`&0-H@$-JGg FGQ0<0dR@0.BAQ/,>QQԟ׆G|0QB`Rn0.g(nB`0R 2.HmB`d .6.HЃR(@ nH|0fRZ$` R$H|9n nH|0f(n R*@NqfSE .6.HЃ @B n0L0N^NuNVH*n Af0?<NIvTf"m m ;yAh `, Af BgNIvTfm m ;y`X0- |g AAHЈ*+@`.0-?NLDT*+@fm `0- |fm -gL N^Nu{^{N{0{$MANUAL.RSCCopyright 1988 - CWD SoftwareCraig W. DaymonManual Maker 9/17/88[3][ Switch to a | HIGHER RESOLUTION!][BYE][3][ Cannot find | 'MANUAL.RSC'.][BYE][3][ GDOS Not Resident! | Program won't work.][BYE]Pick the Main Text Font*.*000000008000105004500[1][Align Paper| and|Turn Printer On!][OK]*** !! Busy Printing !! ***FOLD-LINEUpper Right CornerLower Right CornerUpper Left CornerLower Left CornerThe Text In The Corners DefinesThe Printing Region. (The Sheet)This Text Defines the Page,Showing The Inner Margin Size.* * * PRINTER ALIGNMENT TEST * * *MANUAL.INF*.INFr %s %s %s %s %sMANUAL.INF*.INFw%s %s %s %s %s Click Here for Fonts.Cover Line #%d Font. %d pts.?[1][Align Paper| and|Turn Printer On!][OK]%d%d%d%d%d1\ [1][Align Paper| and|Turn Printer On!][OK]%d%d[1][Align Paper| and|Turn Printer On!][OK]%d%d MMARGV=@ Wi??!TD-@ !TD-@$?!TD-?.B9??' (( (( AAAAAABBBBBB h CON:AUX:PRT:@$@H@$@Y@@@È@jA.AcAׄCAy7DxCyٝFnH=c)\I1sKP1P=M8O?ZwH02g$uOs<* 2626*0**$4"0                             $                              .          z&      $ ,$@            .$ F$ 6$ " " D hL8            . R  >                                          $    ,   $     > ,  ,   >   6    B$  &8XD|:<* ,        v                "  (lv R04: " $( (X&>&. . 4&f.,*   ."( &:,Z8 (             &"&     "   ,6$f@D$dHH8PtBF&R& 0Hv*,,2 .(*V   D$    8,J f2 2$ Dd$&`0b,n,,<\  , @Fv L< <     6 b 2 2 2 2$ 2 2% T%A program designed to convert READ.ME,ASCII text files to a manual-sized textto both sides of the paper. The userwill beprompted to turn the paper for 2nd-sideprinting.Some character conversions are made.** This program requires: GDOS or G+PLUSGDOS Printer fontsGDOS Printer driverComments/Suggestions to: Craig W. Daymon[ GEnie: C.DAYMON ]33 Chestnut Valley DriveDoylestown, PA 18901-2216** $10 Contribution Requested **Your suggestions will help this programimprove.Doc andThe Manual Maker - (version 1.00)Copyright 1988*See MANUAL.TXT for details.(Developed with Laser C from Megamax), printingPage Alignment/ConfigurationMin = 6.500Max = 4.000Min = 0.000Max = 3.500Min = 0.000Min = 4.500Min = 3.000* * * Printer Alignment Test * * *Load ConfigurationAll Set To Continue...Save ConfigurationMax = 8.000 - (Left offset)Max = 10.500 - (Top offset)Max = (Sheet height)/2 - 0.250(inches)(inches)(inches)(inches)(inches)@'Top-of-Sheet' offset : _.___9999@Left 'Side-of-Sheet' offset : _.___9999@'Page' height & 'Sheet' width : _.___9999@'Sheet' height : __.___99999@'Page' width : _.___9999 * IMPORTANT! The print-out MUST be CENTERED Top to Bottom on the paper!!You Have Chosen a BAD VALUEMinimum = 0.000Maximum = 4.000Minimum = 3.000Maximum = (Sheet Height)/2 - 0.250Page Width:Minimum = 6.500Maximum = 10.500 - (Top offset)Sheet Height:Minimum = 4.500Maximum = 8.000 - (Left offset)Page Height & Sheet Width:Maximum = 3.500Minimum = 0.000Left Side-of-Sheet Offset:Top-of-Sheet Offset:* Print-out MUST center Top to Bottom *@@Now Printing The Manual@@Options for PrintingLeft :Right:Page Headers@______________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX@______________________________XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTAB Conversion4 Spaces8 Spaces@Starting Page-Numbering Value: _____99999 Right Justify Text? :YESNOFINISHED@ SIZEDONEFont Name@2nd Side Printing* Time to flip the paper *Pages will be going through theprinter in reverse order of whenthe first side was printed. Alignthe top of page as it was for the1st side. Looking through thepaper at the already printed text,the text rotation should appearthe same as it was for printingside one.The CoverText for CoverFont Name & Size@_________________________XXXXXXXXXXXXXXXXXXXXXXXXX@@_________________________XXXXXXXXXXXXXXXXXXXXXXXXX@@_________________________XXXXXXXXXXXXXXXXXXXXXXXXX@@_________________________XXXXXXXXXXXXXXXXXXXXXXXXX@Make a CoverNo Cover Needed* Lines without fonts, and any linesthat follow, will not be printed. *Your contributions and suggestionsFuture hopes:Graphicswill help this program grow.** $10 Suggested Contribution **(Developed with Laser C from Megamax)Exact TAB locationsPamphlet PrintingPreviewingCopyright 1988Send to: Craig W. Daymon33 Chestnut Valley DriveDoylestown, PA 18901-2216[ GEnie Address: C.DAYMON ]Manual Maker (ver. 1.00)$K'Lt(u&( %())<=QR{)|!( #$F"GVWtu&         ' (K#L_w49;`%eg')"9z( :<[z  %  & T ^  _ n o       ) + , . H b d % $ $ E! F l&    04 2& N' j% ' ' )  $   (     .   J(  f      ' * (*$F  b~!b2( 2M >  3     &  B   ^   z @  /@ 4 B`/@ 444"4 1 (((( ( > Z%v'  K (!+ "!):K!)\m"   !)    ! ) !  !)(9JeB) ) > 2<:8:V 6  4 r  3+  )     ) )) 6  R  n$ " b) 3! b@@ b@@   B   2 $N'Bb "!  "     *   J b" 29j  7  @ @ . @J f@@ eB r 7 ) "      m             * b% Fb"b$2!b *@LManual Maker (ver. 1.00) @Rby Craig W. Daymon The Official Documentation@B@C for@B@C MANUAL MAKER (version 1.00)@B@C (c) 1988@B@C by@B@C Craig W. Daymon@B@C (9/18/88)@B@C Introduction:@U@B The main purpose of this program is to make manual size print-outs from ASCII (plain text) files using GDOS (or G+PLUS), GDOS fonts and printer drivers. Main Features:@B - Justified or Unjustified print-outs - Designate number to start page-numbering with - Separate Left and Right page headers - Up to 1000 (manual) page document capacity - Prints to both sides of paper - Tabs converted to 4 or 8 spaces - Printer paper alignment test - Imbedded commands for: - Centering a line of text - Printing a line in BOLD text - Printing a line of text Underlined - Force a Page-Break - Setting Page headers *Any combination of commands supported (except with headers) - Cover printing with: - 4 - 25 character lines of text - A different font/line - Installable application - See ST manual for help - Flexible page sizing - NEW FEATURE FOR VER. 1.00 GDOS permits the doubling of 'TRUE' font sizes. The use of these fonts is not permitted by many GDOS applications to insure that all print-outs are as clean as possible. The doubled fonts tend to be 'blocky' (especially in the larger sizes). MANUAL MAKER makes no distinction between 'doubled' fonts and actual fonts. So, for the cleanest print-outs, know what font sizes you have available. A walk through MANUAL MAKER:@B@U *MANUAL MAKER uses a series of dialog boxes to take you through the creation of your manual. No access to accessories is permitted and to create another manual, you must re-run the program. Since GDOS takes a while to print, this was assumed to be reasonable. Let me know if you would like to see this change. *This file, MANUAL.TXT can be used to run through the program. The first dialog you will see is one giving a brief overview of the program, my name and address, etc. Click on this with the mouse or hit the carriage return to continue. Following this, the printer fonts will be loaded into memory and the mouse will appear as a bee. The next dialog you will see is for selecting the 'Main Text Font'. The names and sizes are selectable, but there is NO display of how the font will look. This was to avoid the loading of the screen fonts and the disk space the screen fonts would require. Also, since GDOS and the needed fonts and printer drivers must come from another application, it was assumed that the user would know how the fonts looked. Following this is the dialog for setting the page and sheet size. A printer test pattern can be printed from this dialog to test your choices for size. You may also save this configuration to disk or load in a previously saved configuration. If an inappropriate value is entered, a dialog will appear containing the equations for maximum and minimum values in a larger text. Hit the return or 'click' on this dialog with the mouse to return to the page configuration dialog. *** !! IMPORTANT !! ***@B@C WHEN USING THE PRINTER ALIGNMENT TEST, IT IS VERY IMPORTANT THAT THE PRINT-OUT APPEARS CENTERED TOP TO BOTTOM ON THE PAPER!! THIS WILL INSURE PROPER ALIGNMENT OF THE SECOND SIDE WITH THE FIRST. (In other words, the 'FOLD-LINE' should appear in the center of the the paper when the paper is folded in half.) *** !! IMPORTANT !! ***@B@C **This dialog is NEW for version 1.00 and should greatly help those people who found difficulty using Manual Maker with a laser printer or HP Deskjet. It may also expand the possible applications of the program. If you have NOT used MANUAL MAKER as an 'Installed Application', you will next be presented with the familiar 'File Selector' box. (Selecting CANCEL from the selector will exit the program.) You will no longer need the program disk, so it may be removed and the text file disk inserted at this time. Use the file selector to choose the file you want to use to make the manual. This disk must remain in the drive until the program is finished printing both sides. Nothing is ever written to the disk, but the file is 'read from' between the printing of each page. After selecting your file, you will be presented with the 'Printing Options' dialog. From this dialog you can: 1)Enter a Left and Right Page header ex. Left header : MANUAL MAKER_________ Right header: by Craig W. Daymon_______ 2)Justified or Unjustified (ragged-right) printing. 3)Value to start numbering pages with. (Clearing this field will result in NO page numbers.) 4)Tab conversion - Either 4 or 8 spaces. The next dialog is for the creation of a 'Cover'. You will be allowed 4 lines of up to 25 characters each that will be printed so they appear centered on the cover. You are permitted to use a different font for each line. A font MUST be selected if the line is to be printed. If a font is NOT selected, that line and ALL LINES FOLLOWING it will not be printed. A blank line may be inserted by selecting a font for a line with no text. The font selector is the same as that used for the 'Main Text' font. After all fonts are selected and the text inserted, you may send the cover to the printer. *The paper should be aligned accordingly. The program will immediately follow with the printing of the manual. A dialog will be displayed showing the current pages printing. The order of printing is not a sequential one. The first pages printed will be those at the middle of the manual, with the right side increasing and the left decreasing. When the printing of the first side has finished, you will be prompted to flip the paper for the printing of the second side. If using a dot-matrix printer, it is adviseable to form-feed an extra sheet for alignment of the top-of-form for the second side. The paper will be going through the printer in the reverse order it went through for the first side. (The last sheet printed will be the back of the first sheet printed for the second side.) The text for the second side is printed with the same text rotation as the first side. Remember the way the first side printed and, looking through the paper, the tops of the characters already printed should be facing the same side of the printer they did when printed. (This should be the right-hand side for dot-matrix printers.) Now that the paper is in the printer correctly, use that extra sheet of paper you form-fed at the end of the first side printing to align the top-of-form for the first sheet as you did before printing the first side. (Sorry, no more alignment options. Memory should be good enough.) Turn the printer back on and hit the carriage return or click on the dialog to begin printing the second side. (This paragraph is for dot-matrix users.) (For laser printers...) Your only real concern is reordering the sheets so that the last sheet out is the first sheet in, with the opposite side up that was up going through the first time. Again, looking through the paper, the tops of the characters should be aligned with the same side of the laser. Best bet is to experiment with a small document. Hit the return or click on the dialog to start printing the second side. You will see the same dialog as before with the right hand side increasing and the left decreasing. Finally you will be presented with a dialog talking about future plans for the program and making a request for a $10 donation to be used for further development of this program and ones like it. (I would like to get the Atari Developer's Package to make use of the information it has that the many books I have don't cover. - .IMG ? ) Most importantly, I am interested in comments and suggestions - including whether you think $10 is too much and why. I hope you find this program useful. The $10 is REQUESTED and NOT required. Imbedded Commands:@B@U There are 6 imbedded commands currently supported and all effect the entire line being generate when they are found in the text. Examples can be found throughout this file. All imbedded commands begin with an ampersand, @, followed by: 'B' : -To print the line in BOLD text.@B 'C' : -To Center the line.@C 'U' : -To Underline the line.@U 'P' : -To set a FORCED page-break. (NEW for ver. 1.00) 'L' : -To set the Left-page header from within the file. (NEW) 'R' : -To set the Right-page header from within the file. (NEW) ***IMPORTANT NOTE FOR USING IMBEDDED HEADERS***@B@C The imbedded commands for headers ALWAYS begin the line, followed by no more than 25 characters that will make up the header. These two commands are intended to be used as the first two lines of the text. The best placement of the other imbedded commands is at the end of the line to be affected. A blank line should precede a line with an imbedded command, OR the preceding line should also have had an imbedded command, OR the line with the imbedded command should begin with 1 or more spaces or a TAB. Additional Comments:@B@U To force a new-line, begin the line with a TAB or space. New-lines are converted to spaces unless: - followed by another new-line, a space or a TAB. - the line contains imbedded commands@P Send All Comments/Suggestions/Complaints to:@B@U Craig W. Daymon@B 33 Chestnut Valley Drive@B Doylestown, PA@B 18901-2216@B [ GEnie Address: C.DAYMON ]@B *** $10 Donation requested. ***@B I will be releasing all updates through the GEnie information service. On the GEnie Roundtable, Manual Maker is in CATegory #2, TOPic #21. If you don't have a GEnie account, send me a letter with your name and address (AND the $10 - In this case, it's required.) and I'll keep you posted about updates. I will be keeping a database of all those who have written with suggestions,comments, complaints and/or donations. G+PLUS is a complete replacement for GDOS from: CodeHead Software P.O. Box 4336 N. Hollywood, CA 91607 ...and a trademark there of. *G+PLUS comes highly reccommended for improving the performance of any GDOS application. GEM & GDOS are registered trademarks of Digital Research, Inc. THE MANUAL MAKER A Shareware GEM by Craig W. Daymon Reviewed by Milt Creighton Most of the software reviews you find in computer magazines are of commercial products and CURRENT NOTES is no exception. There is a very good reason for this: commercial software can cost upwards of several hundred dollars and magazines have a responsibility to their readers to suggest which packages are a good value and which ones to avoid. As a result, public domain and the less well-known shareware programs get short shrift (at least in the magazines) since they are available for little or no cash outlay. That does not mean that the PD and shareware authors are not valued or their programs not used by many of us on a regular basis; in fact, I have found the opposite to be true. It is just that the magazines do not feel the same responsibility to review a program which can be had for little or nothing. There are exceptions, however, and The Manual Maker is one. Every now and then a public domain or shareware program appears that is absolutely indispensible of just plain fun and, when that happens, the magazines should tell you about it. For those of you who are avid telecomputer users and regularly rake through the data libraries on boards such as GEnie and Compuserve, this review will probably come as no surprise. But for others who do not make use of their ST serial ports except as dust collectors and have no means of deciphering the cryptic notes in magazine and user group public domain libraries, perhaps this review may make you aware of a nifty program with a lot of utility. Will it be a good one for you? That you'll have to decide for yourself. By and large, most commercial programs come with manuals. Some are typeset and handsomely bound while others are only a few pieces of paper stapled together. Manuals vary in size and shape, but one of the more popular sizes is 5.5" wide by 8.5" high. Problems soon arise because many commercial programs that offer subsequent upgrades (to correct bugs or expand the features of the original) will place a text file (often called READ_ME.DOC) covering the changes on the disk. If you print out the file on your printer, the chances are that it will not match the page size of your original manual. In addition, many public domain and shareware manuals are placed on disk as text files and must be printed before they can be employed to help you learn the program. When you print these text files, you'll end up printing on one side of an 8'' x 10.5'' sheet of paper. If you collect programs the way I do, you'll soon run out of convenient storage for the paper. I am forever stuffing loose papers in my desk drawer and then dumping the contents a month later when I can no longer remember what they are for. It's inefficient and expensive and I think Manual Maker may be just what I need to straighten out the mess. Manual Maker is designed to take ascii text files from disk and print them on both sides of the paper on manual-sized pages which can then be stapled together or hole-punched and placed in a notebook. The features of Manual Maker include selectable font sizes, embedded commands for centering, underlining, and bold-facing lines of text, left and full-justified text, and even the printing of a cover sheet using multiple fonts and font sizes. After clicking on the opening screen you will be presented with a dialog box which permits the selection of the font and font-size to be used in the main body of text. After selecting a font, click on done and another dialog box appears which permits page alignment and configuration. The page alignment feature is used to ensure the page is centered on the paper so that when the page is folded, the fold-line runs down the center of the page. A printer alignment test is included to confirm the proper selections. This screen also permits setting the overall page size and margins so you have some control over how the product will look. This is a major change from earlier versions of the program. It is also possible to load and save different configurations. The manual configuration is provided with the program. Make certain you load a configuration or you may have trouble getting your printer to print. There is an apparent bug in the most recent version of the program (1.0) which prevents printing unless a configuration has been loaded. After settling on a configuration click on the "All set to continue..." button and you will be taken to the Options screen. The Options box permits insertion of left and right page headers. They can be identical or different, but they will not override headers embedded in the text file. It also converts tabs to your choice of 4 or 8 spaces, sets the page numbering to begin at whatever number you desire and allows you to select full or left-justified text in the main body of the manual. Clicking on "FINISHED" takes you to The Cover screen which permits the design of a cover for your manual (if you want one) using variable-sized fonts for up to four lines of text. Clicking on either of the buttons at the bottom will start the printing operation. Manual Maker will then print the pages with each page occupying half of an 8'' x 10.5'' sheet of paper. For example, the left side of the sheet might have page 2 and the right side page 7. When the printing is completed on one side, you will see a dialog box which instructs you to turn the pages over for printing on the reverse side. Ensure that the pages will enter the printer in the reverse order that they entered for the front-side printing. Also, if you have a printer with a tractor feed, make certain you leave a blank sheet at the conclusion of front-side printing for threading through the tractor for back-side printing. If you have an Atari laser printer, the sheets go in face up (in reverse order) with the top of the page to the right of the drawer for back-side printing. Once you've satisfied yourself that you're ready to resume, click on the box and the second side will be printed. There are a couple of things to keep in mind when using this program. First, you cannot use it with a formatted word processing file. It must be saved as an ascii file first. Second, if you wish to use the embedded command feature to obtain the available type-styles, you will have to insert them yourself with a word processor or text editor and then save the file again as an ascii file. The embedded commands operate over an entire line of text so you may not underline or bold-face a single word within a line of text. You may, however, combine several attributes for an entire line. An entire line may be centered, underlined, and bold-faced, for example. Embedded commands begin with an ampersand (the flag) and are followed by a capital letter identifier. Therefore, they will not be stripped out along with the control codes when you save an ascii file from a word processor. Keep in mind what the ampersand does in Manual Maker and avoid using it elsewhere in the text file or you may get some unexpected results. In addition to the embedded commands already identified, it is possible to set the left and right-page headers from within the file and to set a forced page-break. Manual printing is just one of the uses for Manual Maker. You can also use it to print your own booklets (or books for that matter since it can handle documents up to 1,000 pages). It might be neat to send a friend a letter in book form, for example. Since the size of the page is variable along with the margins, there are many other unexplored uses for Manual Maker. (screen 7) Craig Daymon (33 Chestnut Valley Drive, Doylestown, PA 18901) has plans to expand Manual Maker in the future. In particular, he intends to add the ability to insert half-page sized graphics (IMG format), multiple fonts, a preview of the printed page(s), and exact TAB locations. Whether he does or not will depend largely on you. Shareware authors depend on contributions to gauge the popularity and worth of their product. If you obtain a shareware product and find yourself using it, send the author a contribution. It encourages him to improve his product. Most of them ask for only a modest sum and Craig would be quite pleased with $10 if you like and use Manual Maker. I think it's a bargain at twice or three times that! My check went out to him this morning. On the downside (for some of you), the system employs GDOS fonts and printer drivers (which must be acquired separately). For those of you who know what that means, no further explanation is necessary. For those of you who are GDOS-ignorant, no further explanation will suffice. However, if you haven't yet wrestled the dreaded GDOS-monster to the ground be aware that the set-up is not a simple matter and, while the results can be extraordinary (depending on the quality of the graphics output of your printer), they can also be very slow. Still, there are a number of GDOS-based programs on the market now including Microsoft Write, WordUp, Easy Draw, Fontz!, and Timeworks Publisher. In addition, the GDOS-replacement program G+Plus makes the set-up considerably easier. So, if you already have one of the above programs and know how to write an ASSIGN.SYS file or have G+Plus to steal the ASSIGN.SYS from another application, Manual Maker may be a useful and welcome addition to your software library. The bottom line: Manual Maker is not an indispensible program, but it is one of the niftiest ideas I have seen lately. If a commercial software house had gotten the idea first (or bought it from the author) you would have had to pay upwards of $30 for it -- and be happy to do so. The fact that it resides in the Current Notes public domain and shareware library (I have also seen it on GEnie [file #8156] and it's probably on Compuserve too) is a stroke of good fortune for the rest of us. Thanks, Craig! #a000000 #b000000 #c7770007000600070055200505552220770557075055507703111103 #d #E 18 12 #W 00 00 00 01 50 10 08 A:\*.*@ #W 00 00 0D 08 2A 0B 00 @ #W 00 00 0E 09 2A 0B 00 @ #W 00 00 0F 0A 2A 0B 00 @ #M 01 03 00 FF A FLOPPY DISK@ @ #M 02 03 00 FF B FLOPPY DISK@ @ #T 00 03 02 FF TRASH@ @ #F FF 04 @ *.*@ #D FF 01 @ *.*@ #G 03 FF *.APP@ @ #G 03 FF *.PRG@ @ #F 03 04 *.TOS@ @ #P 03 04 *.TTP@ @