`8:sp> Nu<` /@`! #@%`')-1 3@5`79;=?A C@E`GIKMOQ S@UWY[]_a c@e`gikmoq s@uy{} @` @ @ ` o @ ` ǀ ɠ @ o ` /@`! #@%`')-1 3@5`79;=?A C@E`GIKMOQ S@UWY[]_a c@e`gikmoq s@uy{} @` @ @ ` o @ ` ǀ ɠ @ o THEDEMOCLUBM_WRITER MUSIC PRGsAUTO SINE DEM+TEX_TEX_TEXODESKTOP INF'READ_ME NOW*MGLDCHR5 NEO}SCROLL BASO . .. COLOURS M_WRITERPRGREADME1 DOC TEXT 777,001`| Y,O*o -`(HARTMANNS EASYACKERTEST.PRG H?<NNTJ@gM1p,QHz?< NA\0<QL` Y ****************************************Y! *****THIS PROGRAM WAS PACKED USING *****Y" **** THE HAPPY COMPUTER PACKER **** Y# *** *** Y$ ** Message Writer By G.Pople ** Y% ********************************** aЭмRcBgNA&@.(m -$Sf(mE8*g*g(*g4۾eX`RBA|Q`RBA*SAQ`RBB+SBESCQQBG`ABJPga&m k -"mJg$ёBJAg<f `` m,HA -+P А+@+hШ+@+h?<NNTм|`A!@ @C|E T QN +HAaD?<NAT<Yg<ygLNuLAaAaAa |@@Hm@?< NA\Jg AB`ABg/?</-A/??<@NA ??<>NAXBg?<LNANuEDO YOU REALLY WANT TO SAVE THE FILE ?? (Y)ES / (N)O PRESS 'RETURN' TO SAVE ON THE DEFAULT DRIVE.OR ENTER DRIVE,PATH AND NAME FOR SAVING !! /?< NA\NuHB?< NA\M,M<@M,A mM , M, Kb`x~K?<MBVaTaTM, MіT~*J$zIM&VcB3B J Pg,aJ@g 2(`2(¼3 J``MF3@M8/?< NA\C Q (M*!VШ!@M.VL -Numd `ԅ{]#\ Gך{7.7rXȈ9)܇A)( \ :pPP ,1!* \o P4$2 3_4Bgs2#Ȯ~2vPoA)ϙ_g2;h5rE܄Qf yy|SBzЛ2cem:3_enS!l7v"P}U}]M2W? p&(/΀0͞M\.VLHz?< NA\?<NATBgNANOT ENOUGH MEMORY FOR DEPACKING !!aJgDM V0/0MRV1V/?(aT _MRV1V?(aTNuM V0/0rBBaJ@g`SA|f1BNu3@g 0<`B@SG|gNu~RNuA."P I"h$I (AH"RRR!SfNu*o - ЭT(M*Sf*o mBeNxQ]R""  . W-lL^ں=GV׾G64Aa0ScH]"#z4AaP@Fa`ؘ)s{@Ƒ iƑɢ =#=L9ZؘNl=wK z`lLz` kȾ-5|}\צ*`=`^dS%V&9R\LLG&# ``r8uP,\ NUAf D֍WT) ȷ|`eWH^qp'&Y, /OL%U`QxPg\ Dg3]>q0WFm!=Q\(5t"[>q0 3p.Xx&q@C0:` 5-jAf=p.ZELZ 3h\ 6&-l<$ n-z`!d-oeL_'l<gh^jO3+E]0Z}PSpk S:YNp'&j,. {p'&̯57n25\ #T8p.Xpx:]CC0.-C0bGhZ-O3;VQo~  .>X`R! x48[p448(.&\L_ '׋HAC& qcD AaD)3EײMj M40` )4 Tj)i72BڧDϡp^6)d"R3@5ll{mtRZBȭE3*kX\(.cèGjKQZ:d&_JFKY PbP0 )E-d.A=":v`omuvZڃ꓂n[FXڱxьDIj M4s.. H׵Հ/T[׵7׺" ]TR\`Fz׺A_[3F_Efjqn mwu{#=:rb@߂7i`#]V ׬) !^62)e 4תKapr4ZDiHx 5A]mlH#ml[0T5VW\BJaq }l]'0T3eԑ̫&ԑmi؈,k[ôy!w2TR4 LI &6ciLv|#`B88|>"#e)]q N2( $ANû%b2;:8pDFDDP2e+.8pJDP2e)]q dZ&Jۅ 8IM^2V-?Nû%|%lGv^'V""(*]%A%mJj"_;Nd y>8yݞqʝ8yenBqEF!w֟%m$ݾJcIMa q;g)$2W/CD;_>0x_SwfJdwauqD8dwR.J8pJ؈8dzvݙ)xGy;:8pJD2VÆCp !wTCVE "+/Ӱtq݇i-x!^8pJ؈8dwQ%mvx_("!)nLbL@"!88@!6 $ppgww3 7LiOoI+A )/Ƞ;f 0 ptA`ҝP3e 7p!8Ȣ2(fNكL%4b(n] fcLND:񒶀!\ qq0%%/sI*s~q$#tLeS '%@tL swt8:\N&A(䭂IXw%@tL:\L$qq$N%1lIP-)bJ^0 dmJat$"lHD>[nJaIL>-%0aFym GHm$$(C8|yA00_pw KdfJpw%dNJ0vw2c)ϕ~*gq2TVt&J8ļtd v ^&6_N|?$$gBA#Lo3*t;<&J[:Y+f Q@6 A /8;Hd8;%d,`3xStW4$^&7M6 !'VSbĶ7<_~'I?Z=#揙ekNLV= aFй+J%p&+Ziep*VO3 w;YnǘDH.qNLT-ËŨ$8mų,ۯFY mB",K%dY,K%dY,K%dY,K%dY,K%dY,K%dY,K%dY,K%dY,K%dY,K%uqt[.P}8<c?^-e(aZZZZ(DJ%g>cׯEY(c8Sʷ˯ This is the documentation for M_WRITER.PRG v1.0 (c) Gareth Pople November 1988 The message writer allows you to display full screen scrolling messages on any ST with a colour monitor. The program takes a text file created by the user and displays it in a clear, readable manner. Features include. o Text may be automatically justified, to the left or to the right, or centralised. o The screen colours may be set using a small ASCII file, read on boot up, and altered whilst the message is being displayed. o The message may be paused at any time. o The letters, numbers, and punctuation are all proportionally spaced. In the M_WRITER folder you should find M_WRITER.PRG The main program. TEXT The text file to be displayed. COLOURS The default screen colours. README.DOC This file. Please keep the folder intact and distribute it amongst your friends. Message writer may be executed from an auto folder. Just put M_WRITER.PRG in the auto folder leaving the files TEXT and COLOURS in the root (=main) directory. Otherwise all the files should be in the same path (=folder). How to use it. -------------- If you click on M_WRITER.PRG the program will execute loading TEXT and COLOURS. The sample text will start to move up the screen. You may control the program using the keyboard thus, Escape Exit the program. Space Pause the message (any key to resume). Cursor up Increase the value of the background colour. Cursor down Decrease the value of the background colour. Undo Reset to default colours. Cursor left Increase the value of the text colour. Cursor right Decrease the value of the text colour. How to create your own messages. -------------------------------- The characters defined are a to z and A to Z, together with !"#$%^*()-+=':;<>.,?/~ and 0 to 9. The underline character is & (shifted 6), since underline is not an ASCII character. The TEXT file is in the following format. The character set is composed of three different sizes of characters. fijl!'()I:;., are all 8 pixels wide. All upper case letters plus m and w are 24 pixels wide. The rest of the lower case letters and all the numbers are 16 pixels wide. 38 of the smallest characters, 19 of the medium size characters and 12 of the largest characters, may fit across one screen. Of course all the different sizes may be mixed and used as desired. | (the key next to Z shifted) will justify text to the left. eg message| @ (the key to the left of RETURN shifted) will centralise text. eg message@ \ (the key next to Z unshifted) will scroll the screen up a row. eg message@\ (line is centralised then scrolled up) ] (key to the left of RETURN shifted) signifies end of message. When this if reached the message will replay from the start. eg MESSAGE@\ (big chars centralised then scrolled up) message|\ (small chars left justified and scrolled) &&&&&&&|\ (small characters then underlined) ] (message will now replay from start) Putting no control code after the text will right justify the text. eg message\ (text right justified and scrolled) The |(left justify) and @(centralise) control codes will have no effect if text has been scrolled on that is wider than the screen. eg THIS IS TOO LONG@\ (will scroll on and be moved up, the @ won't have an effect) eg THIS IS TOO LONG|\ (as before the | code has no effect) However the next control code (| or @) used will now have an effect. Messages can be scrolled along the bottom of the screen without moving upwards if that is desired. If you are still unclear then refer to the file TEXT to see how the sample message is produced. If the TEXT file is not found then a message "DISK ERROR file not found" will be displayed. How to set the default colours. ------------------------------- If the program cannot find the COLOURS file the colours will default to white text on a black background. If the file is found the default colours will be read from the file. The file can be edited with a text editor and is in this form 006,000 which signifies an RGB value of 006 (light blue) for the text and an RGB value of 000 (black) for background. If you don't stick to this format you will probably get some really horrid colours. End bit without a title. ------------------------ Although the program M_WRITER.PRG is copyright me, I give my permission for it to be freely distributed. This program is shareware, and any donations will be gladly received. Gareth Pople 54 Hazelbury Road Nailsea, Bristol BS19 2JW. HELLO and| WELCOME !!@\ to the@\ ST message writer.@\\ KEYS@\ &&&&&&@\ Undo reset cols|\ Space pause|\ Escape quit|\ Cursors change cols|\\ Using this program@\ text may be displayed@\ in a variety of@\ interesting ways.@\\ little text,@\ BIG TEXT,@\ Mixed Text.@\\ And text may be@\ justified@\\ to the left,|\ to the right,\ or centralised,@\\ automatically.@\\ Or text can just move along and out.|| Titles@\ &&&&&&@\ may be underlined.@\\ You could use@\ message writer@\ to display lists,@\\ Prices@\ &&&&&&@\ Atari ST 299.95|\ Amiga 500 349.99|\\ or for messages@\\ ~~~~~~~~~~~~~~~~~~~\ Dinner in the oven.@\ Back at 6.00pm@\ ~~~~~~~~~~~~~~~~~~~\\ Written by G.Pople@\\ (c) 1988@\\\ ]`B?< NA/a?< NA\ <Bg/?<1NAc'e M / gaw GGp0S#}Y8{eQ>, ~wpjd^YTOKGC?;852/,*'%#!IPX^djpv|        !c H] .  QQ@ 3`H] " !@!c$H] . Q Q`$9 fS9afa` J9g^_S9\f*AaAaAa]\Aa389@Aa3:;AAaz3<=B_>J9f0< A8BQ??99??9?AE0< QNuP * 44Z<<|.`t ( $hR f $h <!@ B"y"q ( `8(/9``|-`(/9``|-6|@7`(/89``|-`(/ 9`9`|-`BhYY``|Y*Q)Y+Q0Y2`dY3`TB(,`L|@,`B|,`8`06Y9h98`dB(`\S(f|B(.B"hB@k6@J(-g^$h J(.f $h$$ !J R(Rhhh20B(1h45h98!I|07NufNu(3g(Nu(Nu ex eLeNd.E!R!R$hj4h45`$ ]`R@` H$y$r!J$j`@HE$rN @BGg.S(d h$h *g R j(h((9S(5d2h45"h f"h fCR!ICH0(,g (1g S(0dx|1() (+g f6f(*d",2<`(*e ,A+ dAe IdA g,(SfBF(jFh1FF`D 9`f9^ _<(6gT(7 (@7k67^9?(/?(6g$S(8dh98S( (f6(NuB9 | @"|><|BB),$X#J#| p@&y T&s#K@Q\# PNu | < @$@њњњXђ&Z~ћQђ&R~ћQaT#dNup aq!1AQ                     B?ABA?AB7>>=>C>=>7>>=>CBCEFHFECKMKJH%%%%!!--!!--@`0 @`P\  0 P      @ P `        0 @ P p     `       `@P00000000000000000000000000000000000000000000000000000000000000000000-;@BӍ;@BӍ҈HHKJKJKMKJHHKJKJKMKHLLONONOQONL灎LONONOQOL&&&&!!!!$$$$++++&&&&!!!!$$$$((((Ԉ667632&)()&542-0/0-<;903230?><476747:=>>?><>&&&&!!!!$$$$+++MMS$$$$ ,, ,,Ј::;=?=<:9:KMNMNMK:<=?=<:9:;;=>@>=;:;LNONONL;=>@>=;:;5320/0205320/0<<>?A?>==?@B@?>>@A@>=><::<=<:9:<҈''''Ј25425425422:9:2:9:7:97:97:977>=>7>=>=@>=@>=@>@@CA@CA@CACCFECFECFECHIHFEFECACA@=9;=&&&&>959>959>A@@=>@=9=@=9=@CAA>@A>9>A>9>AECC@AC@=@C@=@FCEFDC@=$&>959>959>959>959>:7:>:7:>:7:>:7:@=9=@=9=@=9=@=9=A>9>A>9>A>9>A>9>C>:>C>:>C>:>C>:>C??@ABCDE003322633776699:;<=>?@ABFلF9CلC6҈!!$&%%%%!!--!!-))))(((())))$$$$****&J4)LJ1J$"F0%HF-F$҈Ӎ&&ӍJFHFEJCۈ 47547547544:9:4:9:989:975454575421ވH2H2H/H/H,ۋ@H,H, 〈H2H2H/H/H, $&$&"$"$$&$&߈2202225777022-0225775222575777522-0229<787529<787529<><><978752<>><>>><>>><>>><>>><> CA>ACCCACCCACEHEDCA><>>>><>JJHJJJHJQTQTQTQTQTQTQTQTPOMJOMJHJHECDCA>CA><><9787527520ވH2H2H/H/H/ H/H/H/H/*H2H2H/H/H,H, 䊄H2H2H2H/H/H/ 䊄H2H2H2H/H/H/;@BӍ;@BӍ;@BӍ;@BӍ;@BӍ;@BӍ;@BӍ;@BӍ>>?><>Ԉ667632'('(:'(/01123344444444555555678 * + * + MM -999999,999999,999)),9999999999999999999999999999999)999)9999  !!!!"""#"$%;&&&&&&&&&&&&&&&&/////////////            # l<<B     :  & $(B> *8*.. .. AUTOPLAYPRG &GBUGS NEOSV}BASCODE EXE +, PERFECT SND //UGS NEODV}AUTOPLAYSCPwk`GBR` Efv*oM& m HPHUBg?<JNA(m)m -:gS)@ -OK1PC#HN2Hx?<HNA@)@l/?<HNA)@h&@)@XЬl)@d)@`ARCpr Ѝ"QHNFALNHz2?< NA\pdAxr0XQ)K\NNHHNZJrBjNuHz?<&NN\CAp$L Qp NܴBlJpNNܴpMNܴ9@pdAr 0Q0tr N9lNupealp`NuaNJHz?<&NNBWNANC2A@p222NrҌ0<NB0,rNurA9Ar`v C9Cr`rt9@9A9BNrrҌpsNB0,Nu9@N`rDҌpsNBNuC2 @ e @}bA@p222Nr,Ҍ0<NBNu &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 _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"FFaQL8N6.JgtBnNupr$<NuJBk4<rpAC v JBgJjv-| Bb BkH>aaNRFBdL8?N<JBga2SF Be BgQRB`ApdR e <rRF&0xafEv+0JFjDFv-Hƌd0BFHF 0HF0ANuprt|`2:HQ A dNAXJ@jNNuNJ@g,A,BBgHQ?<=NAP FJ@k??<>NAXtNutNu ::/rI IN<,(k$/<??<?N`NA Jj ?a0NNHrO INLA N&NaHQ` @gS@@CNu   aH@@`"aH@@`a0) 4a3B HA2;i`0^ M / hawA~FNuAXr%eee%NuA]NuA>A6HP 0 0 &0&?< NN\Hx?< NN\JfNu N` A$ HJo d*b` QjNuQjNubNTNvN)@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 4HVNuAl 2l 4L VA0000000000prtN9Cp rtNAv` Av `Avl 2l 4)lVHN*aBp0,l 2Nua40,HNua*p0,l 4Nuaprt0,l 22,l 44,NuN9||BlBlrҌpsNBNu0<}N& ?<NNC`&?<NNT"@ C <}N`N(* 9AJA)H@@[000][ˈN Evz`* [g" ]g |g QSz` zQSpQ][ɈN Dvx`* [g" ]g |g QSx` xQSpQ]Bp4NܴHNu*( INA)H @depd ae zb QB DNA\)H @ e` ae zb \gQBA BhNpZNܴA BP"`#|}NA"H0,tg"Hg \f`A\fS A ENAR@H`2QNuNAH2 @erp0QtpoNNr|<N @xepw2A$JBjDFHB t`0QBl9F)lVTAtp 9| N2(g"P@g2RADAH""l`r2oZAe 1@#)I`Nuk1@Nup NNb"l`dpNAtrdJhk\QpaNH ld$l`"Hg: k&@0+R`g k#&@0+S@H3 Q&f)I`LNuApNN $NJ$BS@kH2QNupC ұd"X0Pg"RA$D#Nu"X0NuNJ@gpNu _0HpN _0HpNp"_0HqN&p"_0HqN&E ұeHHQ0)N$_$ZR@H`2QNu$Y0gHR@@"D%$X0P2g# R@%NupE $ $X0dP.gRG,D%pr Y2dP.gRG,D!p4Ae4v`VfANuNWHNuNVHNuNUHNu Ihd*NJ$E$RR@H`2QˈN ENu2)A IJAfr4(Ae*RBBc0*SA?NJ$E$R`QˈN ENup`(* 0(iNJ$E 4R`Q$D 4R`QˈN DN ENua NuN IHPg"B  g &gNJBjt BNut`Rptr ae OgT Xgj HgSRB ae Fb$0k  c_  c b退`tSJBkNRB0 b b瀀`RB0 fрd`2p <0NJ`QNu?Hl?<GNAPA"HJf SNr ,* N& ( EN C"Sj|AcJ@fCAHPBHQ?NA\ _JjNNuH&NրN¶jNuHRp` HRpJQfpNNq Y QfdЀЀ 0NuNNNq Y Qfd ЀЀNuNN$_& Y Qfdփփ!8NNN$_& if"QdփփHRNFNN~,Nq8DRzXEEg"7PNqR$HBJBgpNJgJigp`eetЂ`"ЀeЁdp`ЀeЀe"Ѕe$W.H@@NL"2` NqR YEjrd0` SjN YQf "_Nq*eNN*< NqbІSGfN~$_NЀЀ N~$_NЀЀЈNp"X4g S`"QNuNuN.JPgBP, d4d<e<Ѐ"ЀЁE Y0gR@2DAH!b` `ЀЀ`Ѐ"ЀЁE. l ,`2"X2g,e($UAk&QHPS Y2g RSj _b l ,"X2geb J"F\N" KC`e Nb`d \NT l\Ӭ\ NupNd d3 d# d# # d# # # # d# # # # # # # # dB` # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # QNudd2d"d""d""""d""""""""dB` """"""""""""""""""""""""""""""""QNu??<NMXNu?k?<NM"UAf J@fH@NuDW?<NMXNuPj0,lf$J,nk l*fp?Np N9|nNjA0,l2J,jk 0"fZRAR@ 0"g 0 f` 0 g 0,f9@lTll`BllA"H"g"A4`Q"AA 0! NuS@R@ 0 g 0,f9@lRll`R@ 0 fQj`<,*?Hj\F FfNv`H FfNn`Jf`CfSHj-D@Hd0H@H 0H@0`fSC\fS , @a"C\fApNNNܞHP?< NA\NuH@aa/a a Nu@0 9c^Nu| PC>$Error # ][Abort]\f.B &lX)K\)ld` lp ,BQjNup(NV"l`Yd&-KNNb"l`YepN&#k"C-KN"Cփk փk2##`փk"`2`$Y8gHRDD*D%H8#$c2g# HRDD%H`p"l`Qd&&| NuNb"l`QepZNpr`&AdRd QJBgRBBABJk"l` d&6&|0!NuNb"l` epZNC ҳfHP0(NJ$W$RR@H`2Q"H _$l` dd" $X&0BP6Y&|Hg R@@%E ҳeHQ0)N$_$RR@H`2QNu$Y 0P1@Hg R@@%NuNb$l` epZNA CNFA 0 <r$<ANHmpN"_NCNFN `NqNqANrA CNFN AUTOPLAY.PRGNpJBgpF$VHfN)PN\AUTO\NNN AUTOPLAY.PRGNpJBgpF$VHfN)PNN*>Sorry, AutoPlay must be named 'AUTOPLAY.PRG' to work properly.NNܞNNnSWHfN*PNN8AutoPlay by David R. Sullivan NNN* 4156 Tolowa StreetNNN8Version San Diego, CA 92117!NNN*1.1 (619) 270-0111NNNNN8SDACE BBS (619)284-38211NNnJWHgNnUWHfN*pAH 0 <ClN "_NfN-2Hmp"_NRNHmAN&<x*<NFN"_N?< @N\LN~NܞLA*N A*NzN6fNC`A클NHA*NC큨NNvNNC클Na`aQaF%,j,ܪPAFaJ*fF'aa9g9`F E /*?< NA\LNuNsnNF'AaQF%NsGO*3p83p NsGO4pNs |hh h h h h hNu |jj j j j j jNu@F'#4FNuHz *`Hz &?<?<NNPNu"||@AH00@H@Nu || || | Nu |||||||||||||||||| || |Nu@F'QKt(|G"~FNu@F'PKr(|~FNu                                                                                                                                                                                                                                                                                                                             ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ==pgܰxjZT_±ѾìȽä~p#(KD?PS0159wѠ\UuݸfbkplnĬc{¤tTĻζd<@_qtP>BEk԰j]{ҬnamĠrqưøŰû@?myxH=AEg®lo̴zkj{Ẕ̌АXO๨T48<}ȸ|~ͰĴ¸̴ĢZ1+GwԺô|qu̵ǼƐypZJI_Ʋ¶}ȲĵԨخpUL_ҹ~~·İƺ̸ִkTR_sü»ξƸе{|¿ɾ¶ƿȾɾ¼˽ÿнºȽźв¸¹IJű͸ȸøƻżļɾ¹ƽ|vqs|ļĻ¿{x|ľüŽ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ==ȪĹžƲƴɶвĺǶᰊĘȨβȺ}Ī͸ɰȠ¤ȶҴyźдӸ~ɴ¸ƹyvwww|ͽxiionmtʪlTH;26BM^uɻvlhhovмɼ͸zh\SIEKT^o|uruŽʼǼtijhejszķĻƼʼzz{}ƽüĹ~خ̨ĸøؘٺxg~ʬȩҼzwĨdVZWVcotɨ`H9)'/6CWqyz0+jo°~rXBFKO]rְdF@:/2;KZoʼHWxȺlYY[^k{ںv`MA;8>L_oɶ~~So~jdlnsĬl[RIAGWgvoظ{tjisxŰl^VSSUaqŻxœƶв~qg`gwԼxhZLGS_guνth`]]_iyι~~xHmwشܲzs^V]`fwغz`TOICL]m{ƺ°fagiiqP4sʬЩD,KipwĴxR<9>CLb²֘U_P4?FACNkzhejqyƺʚTE{@(,;s䴫x\WkδxK]J+/37ekvyļʾʰxJIU:,.26:kȡ|vvy}Ŀ¼ƽhBKh237;>Afshm======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ==»­yieoƹhHKZ8-CoĶmM>>FIOeɼ`4_ʬ\5+/7vԾX.-1?Se{ȳͼܰv_ĒiJ;=W{hL?GU^eq°ЬzƜtZNRc~мdPECHOZi{ĶƽԹwȪșpUS_uжubUNIHO_z»РhZКyYPT_ufRJJHEKcƺýѠ`UبԠpL97Ow|pʴmcYH8BKOLADd}ɰͬ`9_؀ZNC458-,7UƮrfjy}u}žļºqxxjXNSg}ɱºļþѾwd_dhinyưtjhpwvx»ָtqswƸ}phe^W\iy·¿======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ======== SORRY, THIS SECTOR CANNOT BE READ FROM FLOPPY DISK BY ST RECOVER. ======== ==hE^b4"&1IsԲuh^Yct¶̶ƽؠlSLD:8FezrvľɷʼĸȻ¸ǾĻѸ}{{}|ǼĶüǾþ÷·Ĵöȹ»ɹzܺpUN[yƸŲɲuu¸Ϊp5+?T%(-148o{xwz{ذðdx<??<<c<a`?<<̟<?<?p98? ۀ'`?p<? <ppp 0??? ??8 ??8< ??~p? ???? ??8?? ??~0< ??`?? ??? ??X8? ??W?  ??P??> ??Px?y"q ??P>(" " ??P?/ s ??P8?x(  ??T00y q ??pXX?~~ ??r8? ??p* #? ??t,|?? ??rT̠0?? ??pϠL\ O>sy< ??qrv? "(??pr&P0?/<??RS * ??PIP3@gyɠ??P _??P+???PQ 0x??P% ՠ 9???QIM VJ???PV P$1??P-@1`008??pĀ pAh i`???$B?ЙF @??@ @AH~@ ??2 3@U}``p???? 0@???!<PIP o??%` 0?Op??p !pP,~ @'?3?3??&[ /`h 3?? Ko  X` `w? ?y@,h o2@8a? ?p4>B@XOXwx? ?0l萄(@ A xxx ?D*((`#?? |Ѐ'? s?8?@?|oDDMd'\ 0?xx`xx((@_0 pP '  `3ؼ&@r @gx  ?C<>>>$!$π pxc?? 0  D<s?>> '?@"?=|.3?C ^ ?p` p0@?? À03@?F(? 0@gp0@!?@@Cp`~?O}~ 8@ ??;?ap@?`~ p@{0g{ \ Lxp?p| 96~yp8g`p A`@?p` xpX0<;?I'7V  w ((xg0?6 =x?``?I( `_ 0xh~y9'<@?@?P/&6o_ 9 g???g1<d?0@388p???4; ?|  p ($ yO@?f `;ÀX?FlG`As '0` 3<?`z%op{>-e/h8l ??xr~p?4{5<wW_;``2wz?-}b '> '8(>~B>4=` 8>} _~X?p:L\^gᘾ=r~8?!>?(?Dyg`00nAiGw|'   "~Lwo /?`8>E|| 1^g_7_;d'b'mnǀ9o  w>??4"c?@>?_ ,\ӣ4@˿?xsp`7 ;yH0|σ0?n@|>H# ?; "L>@?z'?0?? Dc0rEݸ??p?0p2?zs|?? :Bp3?@ø<`?9@_ #x?; ??#l?@|```@k;0@@@~?l~P~@`@@c e9?@`x?G=@x1p@`?O{d6#@X`000?~?`? ?0?@`H0x @?}@kY?Ǧ$~P@`oxx 0y@@`@8@ :??8@`cw`@H?\?`8$0cC??ЀZc0x=(ph {di G U>`~? 2u3  @:?ˆ=wg 4>@@  dP08@.Q!? 0"@A? t ;8`@88`88 088/?;8<??@|>8>`x?  ?0;;;;??~?;???;;@;;|_ ?_?P'?ؠ_`p   !BC~xp p p`p??p p SINETEXT BY AWE 1989 -------------------- SINETEXT IS A SCROLLING MESSAGE PROGRAM WITH A DIFFERENCE - LOAD IT AND SEE! (NOTE THAT THIS PROGRAM WORKS IN COLOUR ONLY (AND DO TRY AND COUNT THE COLOURS!)). TO CUSTOMIZE THE MESSAGE JUST EDIT THE ASCII FILE CALLED SINETEXT.TXT TO WHATEVER YOU WANT THE SCROLLER TO SAY. BUT DO NOTE THAT ONLY CHARACTERS SPACE TO CAPITAL Z ARE USED AND ALL OTHERS ARE IGNORED. (I.E. RANGE OF CHARS IS ' ' -> 'Z'). THIS MEANS THAT ONLY UPPER CASE LETTERS ARE DISPLAYED AND ALL APPROPRIATE PUNCTUATION IS AVAILABLE. TO USE THIS PROGRAM YOU COULD ALWAYS USE AS AN AUTOBOOTING INTRODUCTION TO ONE OF YOUR DISKS. TO DO THIS JUST PUT THE SINETEXT.PRG FILE IN YOUR AUTO FOLDER, WITH SINETEXT.CMP AND SINETEXT.TXT IN THE TOP LEVEL OF THE DIRECTORY TREE - I.E. NOT IN A FOLDER OR ANYTHING. ANDREW WEBBER (18/06/1989) PERFECT /LOAD ONLY /BUFFER=1 BUGS /LOAD ONLY /BUFFER=0 /BUFFER VIEW 0 /BUFFER PLAY 1 /DELAY 500 AW3Uwwwww3Uww3Uww????????????<<<<A A<A AA A<A A>a`>a`A A@>a` ~Iaa`H ~Iaa`HA A@` ~Iaa`H ~aa`p ~aa`paa` ~aa`pqqpqqpaa`qqp qqp0 qqp0 aa` qqp0 qqp` qqp`aa` qqp`0000000000@0000000? O0? 0? 0? 0? 0? 0? 0? 0? 0? 0? 0? 0? |0|?| ~0~?~ ~0~?~ ~0~?~ >0>?> >0>?> ?0??? ?0???? ?0???? ?0???? ?0???? ?0???? 0?? 0?? 0?? 0?? ?0???? ?0??? ?0??~? ?0??~? ?0??~? ?0??~? ?0??|? ?0??|? 0?| 0?| 0?x 0?x 0?x 0? 0? 0? ?0??? ?0??? ?0??? 0? |0|?| |0|?| ~0~?~ ~0~?~ ~0~?~ >0>?> ?0??? ?0??? ?0??? 0? 0? 0? 0? 0? 0? 0? 0? ?0??? ?0??? 0? 0? 0? 0? 0? 0? 0? 0? 0? 0? >0?> 0? 0? 0?? 0? 0? ?0? ?0? 0? 0? ?0??? 0??? ?0????? >??0????>? ??0????? ??0????? ??0????? ?0??? ?0??? ?0??? 0? 0? 0? 0? 0? 0? 0? 0? 0? 0? ?0??? ?0??? ?0??? ?0??? ?0??? 0? 0? 0? 0? 0? 0? ~0~?~ 0? 0? |?0|??|? ~?0~??~? ~>?0~>??~>? ~>0~>?~> ~|0~|?~| >|0>|?>| ?0??@? ?0??@? ?0??? ?0???  0 ?  ? 0? ??  ? 0? ??   0 ?   0 ?   0 ?   0 ?  0? 0? >0>>0>}0}|}0}|?00<0<0xx x???    0 0 0 0 ????Ą  ?Ą  Ą ?Ą  ?00>?00>00?00>00>00>0000>00~|00~|0000~|~|~|~|~~~~~~>I ?>I ?>I >I ?!I ?!I ?!I !I ?!I??!I???!I?!I???1i!??1i!???1i!?1i!?11i?1?011i?1?011i?1?011i?1?011i01011i01011i01011i0101 > ?0 1 > ?0 1 > ?0 1 > ?0 ` ?<NNT3*|g?<?<?<NM\?</NAXNuNA@C LHCLHNuA@C LHNuF' !# 8#p#<#F#9 9# 99#Jp!NuF'! #<#8 #pF#NuFy@Nu/A,3@ y4JPfA3V#4A,3H3J3L3N3^T, _Ns/By@3(H3(^ y0JPfA3VSyj T3#0#4B, _NSINETEXT.CMPSINETEXT.TXT 0@P`pp`P@0  0@P`ppppppppqrstuvwgWG7' 0@P`pppp#4EVggVE4#"!32DCUTeeTUCD23!"!2CTevveTC2!"3!D2UCfwwfCU2D!3"ZYWVTSQPNMKJHGEDBA@>=;:8764310/.,+*('&%$"!    !"#%&'(*+,-/0134678:;=>?ABDEGHJKMNPQSTVWYZ[\^`acdfgijlmoprstvwyz|}~}|zyxvusrpomljigfdca`^][||||||???????????????#w??w#????>8|?p????????|||???>??x?|||>~?~<<~?~~>>>~~?<~?||||????~<~~~<~x<~>~~||x<~~~||~~~~~|~~~~~<?||?||?||~~>~x<x<~??~x<x<~?? L vDZ  (    $  HELLO THERE, AWE HERE (THAT'S ME - ANDREW WEBBER!). THIS IS JUST SOME SAMPLE TEXT TO DEMONSTRATE A SUITABLE TEXT FORMAT - MANY WILL DO! JUST JUMP INTO YOUR FAVOURITE TEXT EDITING PROGRAM AND EDIT THE ASCII FILE "SINETEXT.TXT" AND YOU WILL THEN HAVE YOUR VERY OWN CUSTOMIZED SCROLLY MESSAGE! HI TO ALL AT UKC (OGRI - 'WHEN WILL YOU I FAMOUS?', MARTIN, THE 'RAVEN', ASH, 'ANCO' CHRIS) AND ALL THOSE THAT KNOW ME! invisible IF YOU HAVE PROBLEMS READ THE FILE README.DOC! ENJOY!! (P.S. IF YOU WANT TO EXIT PRESS A KEY) AND... note that carriage returns and lower case letters are ignored . Q.. QWIZARD_1S miSCROLLERDOCE.GFISH PRGFISH S "NOBORDERDOC 1. Initialisierungsteil: charset = $70000 ;Start address of the character set hoehe = 32 ;Height of the characters create: moveq #5,d0 ;We have six lines in the charset lea tabelle,a0 move.l #charset,d2 spalte: move.w #9,d1 ;and 10 columns zeile: move.l d2,(a0)+ ;we create a table with add.l #$10,d2 ;pointers to the invidual characters dbf d1,zeile ;(These are 32 pixels wide = $10) add.l #hoehe*160-160,d2 ;(and 32 pixels in height) dbf d0,spalte move.w #hoehe,zanz ;the number of lines ;After this initialisation, the interrupt routine only has to ;to be merged into the system. move.l #irq,$4d2 ;Using $4d2 only in supervisor mode ;Now, the main program can do what it wants. The interrupt ;will scroll on. 2.Die Interruptroutine: scrollbase=$f8000 ;Pointer to screen block0=$30000 ;Pointers to buffers block1=$32000 ;Necessary size: height*160 block2=$34000 block3=$36000 block4=$38000 block5=$3a000 block6=$3c000 block7=$3e000 puff0=$40000 ;Pointer to data-add-on buffer puff1=$40100 ;Necessary size: height*8 puff2=$40200 puff3=$40300 puff4=$40400 puff5=$40500 puff6=$40600 puff7=$40700 irq: move.w nr,d2 ;nr is a counter addq.w #1,nr and.w #$f,nr ;that is used as buffer pointer ;15, because of the 32 pixels width asl.w #2,d2 move.l #irqtab,a4 move.l 0(a4,d2.w),a2 ;one routine for each buffer jmp (a2) no109: ;Routine for buffer 1 and 9 move.l #block0,a6 ;Display buffer 0 bsr show move.l #block1,a6 ;Shift buffer 1 move.l #puff1,a5 ;Pointer to data-add-on buffer bra linksw no210: ;analog to no109 move.l #block1,a6 bsr show move.l #block2,a6 move.l #puff2,a5 bra linksw no311: move.l #block2,a6 bsr show move.l #block3,a6 move.l #puff3,a5 bra linksw no412: move.l #block3,a6 bsr show move.l #block4,a6 move.l #puff4,a5 bra linksw no513: move.l #block4,a6 bsr show move.l #block5,a6 move.l #puff5,a5 bra linksw no614: move.l #block5,a6 bsr show move.l #block6,a6 move.l #puff6,a5 bra linksw no715: move.l #block6,a6 bsr show move.l #block7,a6 move.l #puff7,a5 bra linksw no8: move.w #8,teil ;Second half of the 32 pixels move.l #block7,a6 bsr show bsr addpuff ;Prepare data-add-on buffer move.l #block0,a6 move.l #puff0,a5 bra linksw no0: move.l #block7,a6 bsr show move.l #text,a0 ;Pointer to text start move.l #tabelle,a1 ;Pointer to conversion table clr.w teil ;Left half of 32 pixels nochmal: move.w zeiger,d0 ;Counter in the text move.b 0(a0,d0.w),d1 ;Next character noeffect: cmp.b #$3f,d1 ;End found bne noch2 clr.w zeiger ;Start from beginning again bra nochmal noch2: ext.w d1 ;Else, get pointer to character asl.w #2,d1 move.l 0(a1,d1.w),zeichen1 addq.w #1,zeiger move.w zeiger,d0 ;Pointer to next character notex: move.b 0(a0,d0.w),d1 cmp.b #$3f,d1 ;End found bne noch3 move.b (a0),d1 ;Then scroll in first character noch3: ext.w d1 asl.w #2,d1 ;Else pointer to 2nd character move.l 0(a1,d1.w),zeichen2 bsr addpuff ;Prepare data-add-on buffer move.l #block0,a6 ;Scroll block 1 move.l #puff0,a5 linksw: move.w zanz,d0 ;Number of lines subq.w #1,d0 ;As dbf counter zeilen: movem.l 8(a6),d1-d7/a0-a4 ;16 pixels to the left movem.l d1-d7/a0-a4,(a6) ;scroll movem.l 56(a6),d1-d7/a0-a4 movem.l d1-d7/a0-a4,48(a6) movem.l 104(a6),d1-d7/a0-a4 movem.l d1-d7/a0-a4,96(a6) add.l #144,a6 move.l 8(a6),(a6)+ move.l 8(a6),(a6)+ move.l (a5)+,(a6)+ ;Merge data-add-on buffer move.l (a5)+,(a6)+ dbf d0,zeilen rts ;Display ready buffer on the screen show: move.w zanz,d0 subq.w #1,d0 move.l #scrollbase,a5 szeilen: movem.l (a6),d1-d7/a0-a4 movem.l d1-d7/a0-a4,(a5) movem.l 48(a6),d1-d7/a0-a4 movem.l d1-d7/a0-a4,48(a5) movem.l 96(a6),d1-d7/a0-a4 movem.l d1-d7/a0-a4,96(a5) movem.l 144(a6),d4-d7 movem.l d4-d7,144(a5) add.l #160,a6 add.l #160,a5 dbf d0,szeilen rts ;Prepare data-add-on buffer addpuff: movem.l d0-d7/a0/a1,-(sp) move.w zanz,d7 subq.w #1,d7 ;Line number as dbf move.w teil,d6 moveq #8,d5 move.l zeichen1,d4 cmp.w #8,d6 bne puffer0 move.l zeichen2,d5 sub.l d4,d5 puffer0: ;buffer 0 is never shifted move.w d7,d0 move.l #puff0,a0 move.l d4,a1 puff0b: ;only left or right half of 32 move.l 0(a1,d6.w),(a0)+ ;pixels copied move.l 4(a1,d6.w),(a0)+ add.l #160,a1 dbf d0,puff0b move.w #$e,d2 ;7 buffers, each 2 pixels puff1a: move.w d2,d0 move.w d2,d3 asl.w #1,d0 move.l #puffer,a0 move.l 0(a0,d0.w),a0 ;Buffer address to A0 move.l d4,a1 ;Character address to A1 move.w d7,d0 ;Line number to D0 puff1b: move.w 0(a1,d5.l),d1 ;Shift plane 0 swap d1 move.w 0(a1,d6.w),d1 rol.l d3,d1 move.w d1,(a0)+ move.w 2(a1,d5.l),d1 ;Shift plane 1 swap d1 move.w 2(a1,d6.w),d1 rol.l d3,d1 move.w d1,(a0)+ move.w 4(a1,d5.l),d1 ;Shift plane 2 swap d1 move.w 4(a1,d6.w),d1 rol.l d3,d1 move.w d1,(a0)+ move.w 6(a1,d5.l),d1 ;Shift plane 3 swap d1 move.w 6(a1,d6.w),d1 rol.l d3,d1 move.w d1,(a0)+ add.l #160,a1 dbf d0,puff1b ;All lines subq.w #2,d2 bne puff1a ;All 7 buffers movem.l (sp)+,d0-d7/a0/a1 rts ;The following variables are needed nr: dc.w 0 zanz: dc.l 0 teil: dc.l 0 zeiger:dc.w 0 zeichen1:dc.l 0 zeichen2:dc.l 0 tabelle: blk.l 64,0 ;Space for 64 pointers to the characters puffer: dc.l puff0,puff1,puff2,puff3,puff4,puff5,puff6,puff7 irqtab: dc.l no0,no109,no210,no311,no412,no513,no614,no715 dc.l no8,no109,no210,no311,no412,no513,no614,no715 text: dc.b 0,1,2,3,4,5,6,7,8,9,10,$3f even 02200000000801 1 2 9[...............................................................]0 THE WIZARDS PART I by Udo (-ME-) and Erik (ES) of The Exceptions or: How to program things that are actually not possible Editorial remark: The articles in this series "The Wizards" were originally published in the German "68000'er ST Magazin" under the title "Die Hexer". Many thanks need to go to its chief editor, Mr. Tarik Ahmia, for allowing ST NEWS to use these articles. Many thanks also need to go to the guys of The Exceptions, who assisted gladly with this venture. This article, the first in the row, was originally published in "68000'er ST Magazin" 7/88. This is a series of articles that is written by a group of programmers that is commonly known as "The Exceptions" (TEX). Well known for their demos, they will now reveal some of the programming tricks that already stunned many people. Some basic knowledge of assembler and the ST's graphics setup is required. This time: The first experiences of two innocent people with the ST, as well as theoretics and practicals of horizontal soft scrolling on a computer that was not quite developed for that. Welcome to a small series, written by The Exceptions, a group of ST freaks that is more known by a row of programming tricks rather than their illegal activities. With you, we want to sail out with you on battle against the hardware possibilities of the ST, meet its strengths and weaknesses, and get to know its limitations as well as means to override these. We will talk about the following themes: Horizontal soft scrolling, flicker- free raster interrupts (which also means more than 16 colours simultaneously on the screen), principles of music programming, graphical tips and tricks (anti-aliasing, transparent effects, etc.) and the display of graphics in the screen borders. To avoid this all from becoming too 'dry', we will accompany this series with some anecdotes of the life of so-called 'crackers', like we are often called too. Many of you have probably already seen one of our demo programs, which made us kinda well known in the circle of ST users. Each one in its own time, these demos showed many effects of which it was thought that they were impossible to program. But, as is well known, both the forbidden as well as the impossible are very exciting. And coincidence brought together some guys that wanted to bring fear to the ST's hardware. Please let me introduce these people and their 'artistic names' quickly: Our assembler programmers Udo, Gunter and Michael have adopted -ME-, 6719 and Daryl as their names; they are the specialists on the field of rasterinterrupts, scrolling and speed-optimized machine code. Jochen (Mad Max) prefers indulging in the worlds of the soundchip, and knows how to get tones from this quite old chip that it's developers would probably have found impossible. The writer of these lines is called Erik; my specialities are graphics and the invention of effects that should be realized by the aforementioned programmers and that (in the best cases) just make them moan and groan. TEX also exists of three more guys, that call themselves AFF (Axel), Martin Fry (Markus) and Dr. Byte (Carsten), but these do not work on this series of articles. What makes 'regular' ST users adopt cover names, and enter the world of more or less gladly seen activities? For those that are interested and for those that don't mind thinking back of their own first contacts with the ST, a small excerpt of our origin is offered - that would eventually lead to the first TEX demo (all others may proceed at the program listing in the PROGRAMS folder).  It all started, how could it have been different, on the good old C-64. Back then two people, Udo and my Meaninglessness, were seated behind this Bread-toaster and did nothing else than that what we do today: Udo brought the hardware to life using assembler, while I was more interested in the graphical capabilities of the machine. It was good fun, and success did not remain hidden for us, but then, 1985, a new computer generation began to display itself on yonder horizon. Every piece of news about the new 68000 machines was attentively observed by us. And we started....to program 68000 assembler! How did that happen, you might wonder, without an Amiga, Mac or ST? Very simple: On the 64! Only know to few, a 68000-Simulator was launched back then on the small Commodore (no joke!). On this program (assembler and simulator) we undertook the first steps on a new processor. Shortly after, we heard that someone in our neighbourhood has gathered enough small change for the purchase of an Atari ST (Hi, Heinz! Good luck in Stuttgart!). The results were some pilgrim's voyages to a computer that, with high resolution, 512 kB RAM,. 360k drive and a damn fast processor, appeared the by the Nonplusultra! Wisely, we glanced over the scarcely available software, because it was a new computer and there were even more things to be amazed at: The luxurious user interface for example, with windows and menus through which one looked...it was great (have you ever typed 'OPEN 1,8,15, "N:NAME,ID"' to format a disk?). Further, there was a Word Processor with display quality never before seen; not the fastest, but it was programmed in a high-level language, just imagine! With Logo, we couldn't do much on this machine, either. But of course there was Basic, on which we flung ourselves. After loading, there was some initial confusion, but as we managed squeeze the first line-demo through the heap of windows, it turned out that even the oldest ST-Basic-version could stun 64- freaks through its high speed. So what was more likely than us testing our recently acquired assembler-knowledge practically? There was no assembler to be seen anywhere, so that a small routine was manually converted into opcodes. Without limitations imposed on us by knowledge of the ST's memory map or something like that, we POKEd our program in the RAM and immediately had a key-experience: A row of impressively looking Atom explosions appeared on the screen - not really tasteful, but much forming something useful to the occasion. Testing of several pieces of RAM followed after the method: Boot TOS, load Basic, BAMM!! We enjoyed ourselves thus for a while, when suddenly Udo got a magnificent idea: Why not check the available RAM? A PRINT FRE(0) brought mood in our first round: Appalled screams and the words '11.720 Bytes?' echoed through the house. What had happened to the enormous range of memory? People who know the size of TOS and ST-Basic, can calculate it simply. So that's what we did, and we went just below screen memory that we had found through random POKEing anywhere in memory (BAMM!!). And there is ran: Our first assembler program! It was supposed to fill the entire screen memory with the value $FFFF. The screen, however, was not filled, but just WAS filled after the program was started. We yelled like madmen, and our shrewd conclusion was: "This processor must be FAST!' From now on, Udo wrote and assembled his programs on the C-64 and typed them on Heinz' ST in the weekends, that got used to it. Then came the C-Bit '86; the ST's price sank to that of affordability, whereas other computer like the Amiga still roamed in the regions of more than 6000 German Marks. That made our decision quite clear, and in the spring of 1986 Udo and I bought an ST; he bought one with a monochrome monitor whereas I bought a color system, because when I had played with "Neochrome" in a shop earlier, I knew the ST was to be my system. We slowly dug into the machine and, since Udo has bought the K-Seka assembler with his ST, programming could start. The K-Seka assembler was a blessing for us, because we wanted to test small programs without having to leave an editor, writing the assembler error messages down and having to link it all together through a linker. And we don't even talk about the fact that there are easier methods of debugging rather than counting the bombs. In spite of many errors, Data Becker's "ST Intern" (that had just been published) was of good help to us. The hunt for the hardware could start! While I was busy writing small machine code routines, but mainly found out what the machine's graphics were all about, Udo started right off. Rasterinterrupts and soft scrolling were his favourite disciplines on the 64, so why not on the ST as well? We will talk about the Rasterinterrupt adventure in the next issue of ST NEWS - for now, we'll take a closer look at scrolling. The machine code routine in the PROGRAMS folder, by the way, only runs on color monitors! What, actually, IS scrolling? Basically, it can be said that it means the moving of the contents of the screen in a certain direction, whether characters or graphics (which is all the same with the ST, as you'll know). When you list a program listing on the screen, for example, it scrolls up. The next level comprises the so-called 'soft scrolling'. The screen moves smoothly, without flashing or shaking. This kind of scrolling is obtained through three factors. First, the distance between to movements should not be too big. But the most important factors are these (which also count for shapes that move across the screen): From one scroll-step to another, no more than 1/50th of a second should pass. That's the screen frequency of your monitor - the time the electron beam in your monitor needs to draw one screen. If your program uses more than 1/50th of a second to move the picture, it can happen that it appears as if your monitor builds up the screen too slowly: It starts to flicker or shake. Thinks, for comparison, of a film projector that runs too slow. The human eye cannot be fooled to think that things are happening smoothly when it's done at less than 50 screens per second. For the perfect scrolling, you must also watch out that you do not move graphics that are currently drawn on the screen by the electron beam. This will result in part of the 'old' graphics to be displayed, while your program is already moving the screen contents. So far the theoretical aspects. Our practical experiments on the ST started really disappointing. Scrolling vertically went really nicely, but in the horizontal directions, everything went wrong. The grounds for this are hidden in the graphical setup of the ST's screen. Memory words that lie behind each other create the bitmap. When one would want to move the screen, or a part of it, one pixel down or up, it suffices to move a memory block word-wise (1 word is 2 bytes = 16 pixels). The 68000 doesn't take long in these cases, and does this with its familiar speed. That also explains why so many shoot-'em-up games appear on the ST with vertical scrolling. The reason why such few games with horizontal scrolling (hello, Steve Bak!) are on the market, is simple. When graphics are to be moved by less than one word (16 pixels) to left or right, the bits of the memory words have to be shifted and that even costs too much time for the 68000 when more than just a few lines need to be scrolled. Thirty-two scanlines is possible, but there's no time left to process shapes or something else. So one should use as little bit-oriented operation as possible. But how? We DID want to scroll more than just a part of the screen, and time had to be left to take care of other jobs (like moving objects, for example). Don't panic. Udo found a solution for our first demo (what a staggering coincidence) and will now explain it: The first trials were based on simple, bit-wise shifting of memory words, but was so slow that I had to think of new method. The bit-shifting routine was written on paper, and the clock cycles were added together. A glance in the 68000-book and some thinking were needed to know that the same thing could be done faster using other instructions. After the moment on which this kind of optimising didn't speed up anything anymore, I had to think of some other programming logics. The bit-wise shifting was the slow-down factor in my routines; somewhat faster is byte-wise shifting and, due to the graphic setup of the ST, word-wise shifting is fastest. That would, however, turn out to be 16 pixels at once. That's too fast to read and would shake terribly. So there was only one solution: Using 8 buffers in which the graphics were each shifted 2 pixels, and displaying these after one another. After displaying the last buffer, the first one is shifted by 16 pixels and the shifted graphics now fit neatly to the eighth buffer. Copying the buffer to the screen also needs some time, so that up to fifty scan lines can be scrolled using this method (adding data to be scrolled into the screen will be discussed later). When you also want to save the buffer-copying time, you can simply work on eight screens. You can then scroll up to 100 lines, but it costs you 256 Kb memory that are only used for scrolling. Now for the problem of adding data to be scrolled into the screen (in our case from the right of the screen). They have to be shifted bit-wise each time, and get into eight other buffers from which the current scroll buffer gets its memory words to merge them onto the right. This preparation of the eight extra buffers (at which only two memory words are shifted bit-wise) takes just as long as shifting one buffer but-wise and copying it to the screen. This shows how tideously slow bit-oriented operations are. A further trick exists in the way one shifts: Because not just the next, but also the memory word after that can become visible, this data has to be added. Here, no single bits are shifted several times and the carrier flag added afterwards, but each over-next word is loaded in the upper longword half of a register, the next one in the lower longword half and then the required factor is rotated to the left. Thereby, the bits of the over-next word fit neatly to the next word. Now for a general look at the program (to be found in the PROGRAMS folder, "WIZARD_1.S", on this ST NEWS disk). When initializing, a table is built up that contains a pointer for each character. In our case, the characters are 32 by 32 pixels in size, and are painted using "Neochrome". In the first 32 screen lines, the first ten characters are therefore contained, and so on. Later, our text only consists of numbers that identify the character to be displayed. After that, the height in 'zanz' needs to be specified, after which the routine only has to be built into the ST's interrupt structure. Our interruptroutine contains an internal counter, that is used by the program to determine which buffer has to be displayed and which one is being prepared to be displayed. The proper subroutine is executed through the value of this counter. The subroutines 1-7 are identical to the subprograms 9-15. They only transfer the current buffer addresses and shift off. Routines 0 and 8, however, also have to prepare the data-add-buffer - routine 0 gets the next character to be displayed, calculates it and prepares the appropriate counter. Then, the data-add-on- buffer is shifted. Routine 8 takes over the right counter and shifts the last 16 pixels of the data-add-on buffer. The 'linksw' routine shifts 16 pixels (one word, two bytes) in a buffer, and merges the 16 pixels of the data-add-on buffer to the right. The 'show' routine copies the appropriate buffer on the visible screen. The routine 'addpuff' prepares the data-add-on buffer, which is optimized by the trick I mentioned above. I have used this technique in an assembler listing that is supplied in K-Seka format. When you want to experiment a little, you can go ahead. When you have assembled the program, all you need is a picture with a character set and scrolling can start! And thus, together with some raster effects, the necessities were created to create a demo program the likes of which were just 'hot' among Commodore 64 crackers. So I designed a picture as well as a character set, and Udo brought it all to life. Because we didn't know our sound programmer Jochen back then, the music from the game "Extensor" got the dubious (?) honour to support out demo with some sounds. Now we also needed a name, according to the 'tradition' that comes with making program like our demo. After some thinking we both decided to call ourselves "The Exceptions". First, this name had something to do with 68000 machine code, but we also were exceptions because we hadn't cracked much programs and there were no real connections with the 'scene'. Apart from some local fame, this demo didn't bring us much, though we sure got experience, Know-How and FUN! In the next issue of ST NEWS, we will tell you more about raster interrupts (using more than sixteen colors on the screen) and the development of the second demo. I hope you'll have fun, too. `F/<?< NA\#.| ?<NNT3#N aaPaa ?9/9/9?<NN /9?< NA\BNA# ###p|#p  |8 8 f&! !p!88Nu@F'9 fB ! !!|pFNuB8!NF%NB8H8|!|p gp LNs?</</<?<NN "yN |0<LHL(H(LPHPLxHxQUp?LHL(H(LPHPLxHxQNu?<NATH@ fNu  ;switching off the lower border ;by UDO from TEX ;This source is for K-SEKA 1.5 x: move.l #0,-(sp) ;supervisor on move.w #$20,-(sp) trap #1 addq.l #6,sp move.l d0,savereg move.l #$80000,a7 line_a $a ;mouse off move.w #4,-(sp) ;get old resolution trap #14 addq.l #2,sp move.w d0,oldrez move.l $44e,oldadr ;get old screen address move.b $ffff820a.w,oldsync ;save old sync bsr prepare ;prepare screen bsr hblon ;switch hbl on bsr sub1 ;wait on 'ESC' bsr hbloff ;switch hbl off goon: move.b oldsync,$ffff820a.w move.w oldrez,-(sp) ;set resolution move.l oldadr,-(sp) move.l oldadr,-(sp) move.w #5,-(sp) trap #14 add.l #12,sp line_a $9 ;mouse on move.l savereg,-(sp) ;supervisor off move.w #$20,-(sp) trap #1 addq.l #6,sp clr.l -(sp) ;terminate trap #1 oldrez: dc.w 0 oldadr: dc.l 0 savereg: dc.l 0 oldsync: dc.w 0 ;----------------------------- hblon: move.l $120.w,oldtb ;save all registers move.l $118.w,oldkey move.l $118.w,newkey2+2 move.l $70.w,old4 move.l $70.w,new4b+2 move.b $fffffa07.w,old07 move.b $fffffa09.w,old09 move.b $fffffa1b.w,old1b move.b $fffffa13.w,old13 move.b $fffffa15.w,old15 move.l #contr,a0 and.b #$df,$fffffa09.w and.b #$fe,$fffffa07.w move.b (a0)+,d0 cmp.b #21,d0 bne noinst move.l #newtb,$120.w ;install new vectors move.l #new4,$70.w move.l #newkey,$118.w or.b #1,$fffffa07.w ;allow timer b interrupt or.b #1,$fffffa13.w noinst: rts hbloff: move.w sr,-(sp) move.w #$2700,sr move.b contr+1,d0 cmp.b #4,d0 bne noex move.b old07,$fffffa07.w ;restore all registers move.b old09,$fffffa09.w move.b old13,$fffffa13.w move.b old15,$fffffa15.w move.b old1b,$fffffa1b.w move.l oldtb,$120.w ;restore vectors move.l oldkey,$118.w move.l old4,$70.w noex: move.w (sp)+,sr rts old4: dc.l 0 oldtb: dc.l 0 oldkey: dc.l 0 old07: dc.b 0 old09: dc.b 0 old13: dc.b 0 old15: dc.b 0 old1b: dc.b 0 even new4: ;new level 4 interrupt clr.b $fffffa1b.w ;stop timer move.b #199,$fffffa21.w ;set data register move.b #8,$fffffa1b.w ;start timer new4b: jmp $000000 newkey: ;keyboard don't disturb!!! move.w #$2500,sr newkey2: jmp $000000 newtb: clr.b $fffffa1b.w ;timer stop movem.l d0/d3-d7/a0-a6,-(sp) move.w #$fa21,a4 move.b #180,(a4) ;set counter move.b #8,-6(a4) moveq #0,d0 ;wait till middle of line mulu d0,d0 mulu d0,d0 move.b #0,$ffff820a.w ;on to 60 Hz move.b (a4),d0 ;wait on right border wait: cmp.b (a4),d0 beq wait moveq #0,d0 ;wait on left border mulu d0,d0 mulu d0,d0 move.b #2,$ffff820a.w ;back to 50 Hz movem.l (sp)+,d0/d3-d7/a0-a6 bclr #0,$fffffa0f.w ;end of interrupt rte contr: dc.b 21,4,15,06 ;----------------------------- prepare: move.w #0,-(sp) ;set low res move.l #$70000,-(sp) move.l #$70000,-(sp) move.w #5,-(sp) trap #14 add.l #12,sp move.l $44e,a1 ;get screenaddress move.l #data,a0 move.w #199,d0 loop: ;fill screen movem.l (a0),d1-d7/a2-a4 movem.l d1-d7/a2-a4,(a1) movem.l 40(a0),d1-d7/a2-a4 movem.l d1-d7/a2-a4,40(a1) movem.l 80(a0),d1-d7/a2-a4 movem.l d1-d7/a2-a4,80(a1) movem.l 120(a0),d1-d7/a2-a4 movem.l d1-d7/a2-a4,120(a1) add.l #160,a1 dbf d0,loop subq.l #2,a1 moveq #63,d0 loop2: ;fill border movem.l (a0),d1-d7/a2-a4 movem.l d1-d7/a2-a4,(a1) movem.l 40(a0),d1-d7/a2-a4 movem.l d1-d7/a2-a4,40(a1) movem.l 80(a0),d1-d7/a2-a4 movem.l d1-d7/a2-a4,80(a1) movem.l 120(a0),d1-d7/a2-a4 movem.l d1-d7/a2-a4,120(a1) add.l #160,a1 dbf d0,loop2 rts data: ;fill pattern dc.w $0000,$0000,$0000,$0000,$0FFF,$0000,$0000,$0000 dc.w $FF00,$00FF,$0000,$0000,$000F,$FFFF,$0000,$0000 dc.w $FFFF,$FFFF,$0000,$0000,$0000,$0000,$FFFF,$0000 dc.w $0FFF,$0000,$FFFF,$0000,$FF00,$00FF,$FFFF,$0000 dc.w $000F,$FFFF,$FFFF,$0000,$FFFF,$FFFF,$FFFF,$0000 dc.w $0000,$0000,$0000,$FFFF,$0FFF,$0000,$0000,$FFFF dc.w $FF00,$00FF,$0000,$FFFF,$000F,$FFFF,$0000,$FFFF dc.w $FFFF,$FFFF,$0000,$FFFF,$0000,$0000,$FFFF,$FFFF dc.w $0FFF,$0000,$FFFF,$FFFF,$FF00,$00FF,$FFFF,$FFFF dc.w $000F,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF,$FFFF ;----------------------------- sub1: ;wait on 'ESC' move.w #7,-(sp) trap #1 addq.l #2,sp swap d0 cmp.b #1,d0 bne sub1 rts 02200000000801 1 2 9[...............................................................]0 THE SECRET OF THE FISH by Udo of TEX On our visit to Holland (see the article in the ST NEWS Volume 3 Issue 2) Richard urged me to write an article about the 'fish'. If you don't know anything about the 'fish' get your hand on our "B.I.G. Demo" and view our second Psych-O-Screen. Perhaps you will see a fish in the bottom right corner of the screen where usually the border appears. If you can't see any fish you are one of the few poor guys who have an ATARI SC1224 monitor. But at least you must see some 'air bubbles'. The fish was painted to explain the presence of the air bubbles, and the air bubbles were only painted to hide a useful error of the video chip. And now we have reached the theme of this article: Fooling the video chip not to make the lower border. 1) How to switch off the lower border: To irritate the video shifter you must switch the video frequency from 50 to 60 Hz in the last line of the screen. This will irritate the video chip so it forgets to draw the last 2 Bytes of the screen memory (this causes the right border to start 16 pixels earlier and to hide this malfunction the air bubbles were painted in the screen). After displaying 200 lines the MMU is checking if 32000 Byte have been displayed. But due to the 2 Byte error there are still some left. If switch back to 50 Hz in the left border of the next line, the MMU will continue sending memory data to the shifter without stopping. It depends on the monitor and the ST's video transistor but in the best case you will see 64 more lines of video data till the monitor starts his blank gap. I will now explain a routine doing this, which is my modified RIP (raster interrupt program) from ST NEWS Volume 2 Issue 6. A complete source is somewhere on this disk (in the "PROGRAMS" folder, ED). First we need a level 4 routine which is called at every VBL (that means 50 times per second). new4: clr.b $fffffa1b.w ;stop timer move.b #199,$fffffa21.w ;set data register move.b #8,$fffffa1b.w ;start timer new4b: jmp $000000 This rout sets the timer c data register to 199 so our main program will be interrupted to handle the border removing properly. Now the Timer C handler: newtb: clr.b $fffffa1b.w ;timer stop movem.l d0/d3-d7/a0-a6,-(sp)  move.w #$fa21,a4 move.b #180,(a4) ;set counter move.b #8,-6(a4) This will install a new Timer C data so we are no longer disturbed by the Timer C, but it is still running. moveq #0,d0 ;wait till middle of line mulu d0,d0 mulu d0,d0 move.b #0,$ffff820a.w ;on to 60 Hz We now spent a lot of time multiplying nonsense to let the electron beam run in the middle of the screen and then switched to 60 Hz. move.b (a4),d0 ;wait for right border wait: cmp.b (a4),d0 beq wait As the Timer C is still running, we use this loop to wait for the right border. moveq #0,d0 ;wait on left border mulu d0,d0 mulu d0,d0 move.b #2,$ffff820a.w ;back to 50 Hz With this commands we spent some time waiting for the HBL then we switched back to 50 Hz. movem.l (sp)+,d0/d3-d7/a0-a6 bclr #0,$fffffa0f.w ;end of interrupt rte Now we have ended the Interruptrout. This was my explanation of the border removing for those who had no time or no patience to read it in the scroller of the "B.I.G. Demo". The only disadvantage of the program is that in the worst case you can see only 8 lines of the border graphic (on a very bad SC1224 monitor). But I hope you can use this program efficiently. I you have any questions or suggestions write to: TEX P.O. Box 1322 D-6702 Bad Drkheim West Germany Udo (-me-) of TEX #a000000 #b000000 #c7770007000600070055200505552220770557075055507703111103 #d #E 18 F1 #W 00 00 00 07 27 11 08 A:\*.*@ #W 00 00 00 04 27 14 00 @ #W 00 00 00 01 28 17 00 @ #W 00 00 0F 0A 15 0B 00 @ #M 00 00 00 FF A COPYSERVICE@ @ #M 01 00 00 FF B COPYSERVICE@ @ #T 03 00 02 FF TOP VALUE PD@ @ #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 1ST_WORD.PRG@ *.WP@  THE DEMO CLUB 23 ALMA PLACE SPILSBY LINCS PE23 5LB TEL (0790) 53741 WE HAVE A LARGE LIBRARY OF DEMO DISKS FROM ALL THE BEST THE CAREBEARS THE EXCEPTIONS THE UNION THE LOST BOYS RADICAL SYSTEMS THE ST SQUAD THE POLTERGEISTS THE S.A.S. AND MANY, MANY MORE. DISK PRICES 1 TO 4 DISKS 3.00 EACH 5 TO 9 DISKS 2.75 EACH 10 AND OVER 2.50 EACH PLEASE DEDUCT 1.50 PER DISK IF SUPPLYING YOUR OWN ALL OUR DISKS ARE VIRUS FREE AND VIRUS FREE AND DISPATCHED IN JIFFY BAGS BY FIRST CLASS POST. PLEASE SEND A LARGE SAE FOR OUR LATEST CATALOGUE. PtwD""$'P . p<1?`< <| > 8  3|~<|=~xx|=`tp8X3?00 s6@888__? p`_?_ P?_ | ??`?`?~?^?~~^^~   ? o >|<???CO? ~v?>? ߑ>n<?<? ?sO? ~8?#!~? ^?y ?^ ??_o ?? ^_o@ ? _?O ??O ^^ ^/? >?_/~  ~ ~~?? o >~~ ^~? ? ?>>~>?><^??<?| 1?y^ ~?q\? ?A? ??X> ?_ |__ ?_` 70?p? ?@ ~8$`  q|`<8@ 00 < <8!?x? x? 0 pL0??` '/ ?`p|>?O?`X`???~?\~~p?^  ?x~~'  ^ ?7o? >|/;??? ??8} _þ<9?x<??g?  ` ?_yyx  ~ ?_<< ~ ?_7? __/>?Ϟ?> ?~~ ~?1?>~~ מ ??^~? ?/^??? ?? '~?<8? ?9x0}'~??x~x? >|1y?????@ _l߀<0?^|?o _/x6?' 'O?pO??4?@<''>?0? ?8 8 8   0 p 0?`<  ` ??8?0 D`0~0@@8`<À 0@8@ 0? 9  y>@ p``?    < '|<  ?O/`&`?`~~7???x  ^ ???   _/?? ?77  ? ^ xxo??  ? <o#  ?7<?w ?x<???x? ?<?yo ????77_x777~ o_|7o7^  ?߀? _'^'=?'<8?x}xx? ??7p<?ߟ>`| '^xx??|~??/o~<~ ?777< ?7<@'7@<?  ?  ?  ? @ ??a0app?0<p >>x< ~`8~ǀ8<>0<p?0p@>`<p| 0? ?7 /p ???' ?Oo?_?????n?7?? ??o?? @ ?^  y?;|??0^>^<?==|}D<^x ppp}1`^00^?=? ?_? ? _/? 7 ?/7?^ ?'?_7o?^_ 7o?7??O?   ?O  ?<>0; ?<1?}'x?@9<x}q8~a̞0N1 >?o7?q' O??O? ? ?/ ??7o7??  o? p? ??@@?@ <>y 8@28 s=380q 3?O 7?O>'< ~??lo?7?77<? ?''?'7?x ?'778< ?''|xy7?7'p?`'?7o??7'?77??/77o/' '<????9?'7? 8p'?'7<|'>p?0<?8/သ1p?71p?'l?'?4o? '?'?<?08 ~0?  p<'",qp,I$( 2 >Hx@h0 " @ 0xx(A"0'"yȜ@ 0GfABASICNPPPPPPPPPPP \ h ZEILENSPEEDLINE_1LINE_2LINE_3LINE_4LINE_5LINE_6LINE_7LINE_8LINE_9I2********************************************** 2* Mike from M.H.R. presents you: * 2********************************************** 2* The simplest way of horizontal text- * 2* scrolling in GfA-Basic (without assembler) * 2**********************************************   2  F This demo only low resolution F FF(E!F Switch mouse off r*l !F It is better to use 50 Hz   4EF If you compile the routine, use 17 EF  .(Hi !!! This is a demonstration of a litt"F.(le text-scroll. The whole routine was pr"F.(ogrammed in GfA-Basic V2 by Mike from M."F.(H.R. You only can start this demo in"F.( low res. If you have problems, quest"F.(ions, etc. then you can contact us at th"F.(e following address: M.H.R., Postfach 64"F.(9, A-4021 Linz, AUSTRIA. We are also int"F.(erested in swapping PD-Software. Bye!!!"FPPrint " Now, if you are able to read this, you "; ! This text only if you NPrint "can be sure, that this demo is compiled."; ! compile the routine u4Print " Because there is enough space now, let "; 4Print "me say hello to Stefan Posthuma, Udo fro"; 4Print "m Tex and all my other friends out there"; 4Print " in Europa. Puh, it is absolutely bori"; 4Print "ng, to fill this space with silly text. "; 4Print "But now I say good bye..TSCHUESS...Mike ";   !!!`!F !!!p!F !!!8!F !@!!x!F !!!!F ! !!<!F !@!!\!F !`!!|!F !!!!FHGet 0,72,319,79,Line_10$ ! Only if you compile the routine Get 0,80,319,87,Line_11$ Get 0,88,319,95,Line_12$ Get 0,96,319,103,Line_13$ Get 0,104,319,111,Line_14$ Get 0,112,319,119,Line_15$ Get 0,120,319,127,Line_16$ Get 0,128,319,135,Line_17$   "E G#  HF!>!F !>!F  !>!Fp !>!F  !>!FH !>!Fp !>!F  !>!F  !>!FF Put I%+2880,190,Line_10$ ! Only if you compile the routine  Put I%+3200,190,Line_11$  Put I%+3520,190,Line_12$  Put I%+3840,190,Line_13$  Put I%+4160,190,Line_14$  Put I%+4480,190,Line_15$  Put I%+4800,190,Line_16$  Put I%+5120,190,Line_17$ ZSFF F  &E!FL Switch mouse on F