@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `8  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNeeds MEM.SAV to load... D8:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D8:DUP.SYSError- Save to MEM.SAV on Disk Typeto &}start DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}F` BLV nB,DE JLV B V BLVDEIʩ BꭝLu } 3E:p`}Ӡ̂ح Disk Directory Medium FormatGo Cart./B*}asic Copy Disk Copy File(s) Binary SaveDelete File(s) Binary LoadRename File Run at Addres+}sLock File(s) Create MEM.SAVUnlock File(s) Duplicate FileWrite DOS & DUP Single FormatL !N',}#"&))9(&*)/h)''-&؆莟R'S  v L/ˢ L }Need DOS 2.0/2.5 TypeΛx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!Wrong Item Choose.} Command or press Λ! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%Disk Directory (Device:FileName?)[# 0 0 &|D3" 1L!File not Found N !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1Typeto DELETE: DELETE File Spec2}Copy: From->To?Invalid Command  065 Copying : D2: Sl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!Wild Cards not a6}llowed on destination 0 <.|K} 2.s format t* 5) 1L!`) 0NΞ 0 L1) 1 L!Bad load fileWhich File to Load ?) 0 ?}0#B 1L!Lock which file ? ) 0 0$B 1L!Unlock which file ? Duplicate Disk (Source,Dest)Typeif o.k. to us@}e Program AreaCAUTION:TypeInvalidates MEM.SAVFE! +L1   `*  70 2 2A} 0.* 1 y0 0)Insert both Disks, type Λ^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` Disk is Full ! Insert Source Disk,type ΛInsert Destination Disk,type ΛE}`  `8 rL1`-* 1P* 1 y0Y`hhL!Move which File ? - 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`Destination cant be DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSave-Give L}File,Start,End(,Init,Run)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`Use 1 letter please ,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NameO} to long B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!Error- 165ɛ+,' 20*.. өr2 1``2To many digits Invalid HexaQ}Decimal parameter800 0 8 00`,0'D800 H,ɛh`2L1Need D1: -> D8:uR} ecimal parameter800 0 8 00`,0'D800 H,ɛh`2L1Need D1: -> D8:uLvL T}D:COMPILER.OBJ "  | D:EDITOR.OBJ   `1 D:ASS.OBJ 0 z1  DLasU}bc/01@ԩb \"/ CELw |L jbcLtV} |L˅ͅυѩ ̩؅Ω8Щҩԍԩxˍ͑˭ύёϭЩө"/@X`pppBpW}ARRRRRRRRRRRR1uick 3hell6RRRRRRRRRRRR# ompiler% ditor ` BJKBDE V` X}BBHIDELf B BLfhhii eiHHLJhhiY}iHHLj BLfhhii eiHHLJhhi!A {@ @E: a% w& &' "L2詰ꩰ쩠CB " A"INCL [}UDE ! A"INTER = A"BYTE  A"WORD ! A"ARRAY 1 A"PROC = A"IN A"OUT A"LOCAL A"MAIN  "Lp栥L# "L  \} "[L! "] L "hhLpiLiLL# <7ɛL# K7ɛei ]} ɛiiȥȩȑi iL @ "L  "L  "L (, ^}=ɛHh褆ڄ)S !ȥȭ)ȭ*i i+ ei餔, <7ɛ K7L `( < _}7ɛ L#Ȣ >8;) <7ɛ ȄL! L#L#=Ȣ >8;);*+`)*+` "[ `}L# "]# K7 ɛL!iiL! "L ˩̢˙CB `hh̥i˥i̠ LV"ȱˍ a}"ȱˍ"e˅ͥiHH ņL|"`L` # 0# X#ɛ* L"ei` {@5򥄅 b} ?L# @gBiiL"l(B ;@0``L#'&(ɛ`8 '&(`ɠ c}ɨɫP` L#!L#"L##L#$L#f0$%#TUf $ ˩$̥ɟ&8˥̠0 ` d}8  & CELs  "LpL.L???? fJJJJS$ f)S$ `%rrorin-!).# ont% xit012345 e}6789ABCDEFU:%%#TO $O $ EL#ALR sbcLPSڠ&. &]%& f} {@΅& ?8%9%4% [@8AiiA [@ {@L$A! notherfile% xit3 g}ave2 un.OBJ/0%1X%YRWO&%'&("/`ppppB%ppA%QRRRRRRRRR1uick #ompiler6RRRR h}RRRRRREZRRRRRRc by2aindorf3oftRRRRRRRRC i}3ourceT &08 0&U& ;@&`D1:ABCDEFGH.E j}XT D1:ABCDEFGH.OBJ  {@򩽅& ? @gB`쩠?CP & k} " A"MAIN X'LH'hh : : :j : ".-?L, ' (l 6L.L* 'ȥL. Z7L#; l};ɀ;.;;i˭;i` ɛ(= +-L'`x˩(̱䅆)ņ) Ę鈱)  a(`) L4(i m}e˅˥i̠L(`) La(ȱ˅ȱ˅`ENDMAInC*PROc\*INTErT*ENDPROc*PRINt,LPt,OPEn,BGEt,BPUt,CLOSe,SE n}TCOl,SOUNd,POs,POKe-DPOKe -PEEk-DPEEk-COLOr%-ADd--SUb5-ANd=-OrE-EOrM-ASLwU-ASRw]-ASRbe-LSRwm-REGx-REGy-REGa-REGp-CA o}Ll-ENDVBi*ENDDLi*VBi-DLi-PUShm.PULlr.SIGnw.UNSIGn|.If.ELSe.ENDIf.REPEAt.UNTIl.WHILe /WENd./MUl[/DIv{/PLOt/DRAw/LO p}c/BMOVe/FMOVe/CUt/PASTe/INPUt/JUMp/PADrF0DATa0CLrN0INLINee0PLAYEro0MOUSe0IPUShY1IPULl^1ZPULlh1ZPUShc1ASLbm1LSRbu1DIG q}i9* t3?L/ U:'L#L.6La*6i i摐ȑ " A"BEGIN * A"END *Ly*hhL.hh%L#` :LH*L :b : r} :LH*@ :LH* 9˩̢ 9 L#i #i$˅ȱ˅L#, ),( <7L#Ȅ%q)iȱ s};;ȱ;ȱ; \6i i, <7ɛ K7%L+%%L+L# f,&L ,)iȱ t};;ȱ;ȱ; Z7 a6i i, <7ɛ K7&L+&L+&L+L#L. f,L. u}ͥΩ%&$)&)@%i ͥiL9,` :摀ȥ瑀ȭ#ȭ$ii : :`L, : v} : k/ J4L. t3 ;˽; H3L. t3L, t3L, t3L, 5L, 5L, 5L, 5L, 5 L, 5L, 5 L w}, 5 L, 5 L, 5 L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,( <7ɛL#Ȣ Z7L#` u- x} U:L. u- U:L. u- U:L. u- U:L. 5L,6 -L,6 -L,( <7ɛL# 9˩̢ 9 L#i y}#i$ : : :ͥ k, : : :iͥiΩ : : :`L,L,L,L, 1 1 1 "Lq' 1 z}L# 1i˥iȑ˩L 1 1 1L. 1L. 1 }1L.慈煉 1 1L. 1 1L. 1ͥΠˑȥ̑L. 1ͥ {} 1 1ͅ΅ 1L. 1L. 1L : : : 1˥ȑL. t3 k/ 3L.H :h :A :` t3Lb/ t3 k/L. |} t3L/ k/ J4L. t3L/ t3!L/ t3$L/ t3'L/* k/L/L :( <7ɛL# K7 Z7 '4ȱ/摀ȥ }}ȥˑȥ̑ii : :L. :ȱ :L. -L, t369L_00 k/L. 1L. t36ɛL2L#,L 3 },L 3,ȱ<=>,-`-`-`-` ;˽; H3`˅憠Li5 ; Li5 :Ć` |; }};Π`( <7ɛL#Ȅ͍Ȣ͝; Z7 a6, <7ɛL#L3`攤, } <7ɛL#Ȅ Z7͍Ȣ͝; a6, <7ǠL#`( <7ɛ :` K7 Z7) }-1L#2 :; :; :L4 :L4 :L4 :; :L4 :;˭;̠" ɛ :L4e :, <7 }ɛL_4; :` :`( <7ɛL# K7 Z79 ;>;?敥%L#, <7ɛL&5`ȱ 7 }ȱˍ8Ȅ8)H >?h7-9+<8&L#87 6 :Lo3 6 6L58iiL5807 6 }:L57 6 :L57{<&L# :` : :`= ɛL 6L6 Z7 K7 Z7$8 } m6" U:" `L#;;;;L~6; :; :; :;˭;̱" ɛ :L6 :` }  K7+ -L# Z7 U:` Z7 U:`L#ŖɛL<7` ɛLK7`!%"% }-0:A [%a{L# >8`e;i;` 9 9(`\=8 ȱ!>-:0:2A [ a{ } L# 9 9=8;;;;` >8;8 8`L# :8 :8 :8 :=8;;`-ȱ!Ȍ }9!˩9̩䄆 9)eȱei˥i来L8 L#IIii $0 };;;;`L80 :80 ``0:L9` (2<FPZd,X }  pX@(#' N0u@P`ꆆ9 !,0=<> ɛ 9ٌ`˩̥ɟ }ȱ 9˩ 9L#`P9ٻ94L:()iȱ˝;;ȱ˝;ȱ˝;`i ˥iL9 }` L;˽M;̩ ˍ{s03 ")L:L: L: !; :L:)@ Hh)?; }m;i :  :Lk:` :L: ii ` hЩ };;;;;;;< <<<$<0>8>Q>X>m>>>>>>>>???+?2?9?? }?E?K?a?w??>>##$"*A%" } ! -)MImi.Nn #" ( }& J }KB DE V( BHIDE V( BHIDE V B V }   UVTȱ }8 } ) )      \ԌHHHh }hhІ @HHH @hhh )P )P˩̠˅ȱ˅%ȱ˅ȱ˅Р }ϑȱϑͥi˥iL? @D:RUNTIME.OBJ @A @A {@Lc$ ` ?JKBDE V` ?BHI }DE V` ?BHIDE V` ? BHIDE V` ? B V`hhii } eiHHL?hhiiHHL@ii ^ 1L!pB/ B4OG!B6BW A 1uick %ditor6c 2aindorfsoft%dit}!reyousureyn )/%rrorpressakey }%dit "lockdefined$irectoryofdrive}b!c   ! Q" *8˥ ?# $L!!8L!i 8i `Quick-}Sourcetext ----------------Length: $ Free : $ ----------------e/0 1X4Yh}.. \ԩRW " "/`4567` 8 88镍}@ #8  O #` # #`JJJJ-#8ȭ)-#8`0123456789ABCDEFe " ͩ4 #`8 ɛ}E ˅̅ͅ΅Șe˅˥i̥i(ͥi* #LW#L# ]LW#\͎i(}i #`(`  $ .%L;$ %9$%:$L $ $Lc$ $^$$_$ } L$ ) ~$L+L$(`i&ͥiΥi˥i̥mϥiХ8ϥ -`8 `~}{+H,,,7,,%&}  ,,+++1+x++**'0))2''&%k%N%C%3!6%,/!$-%2'%&).$~$ 1 *` ,* }+ )_Y *`Ls ,* !+ 0D1:*.* L(o˩! ?#TU 0%#Ɉ#L(% T L% 0 *L% ,}˩. ?# ` *``8 cY* + ˭̩}ͩΠˑͥi˥i̥iͥiΥۥ`e` R* L&`8ͩΩ˩̥8ϥ -}˥̩ͩΩυб͑˥i˥i̥iͥiΥiϥiХɭ m  m ` ,>%  ( *` }* * 'e  ,˥ ?#˥̠' -?0L'L'8L'e˅˥i `+` },` ,L`' , 0/% @88  i ( *L( * * 8@ԩ}  L00W8˩8̱Lo(e˅˥i̥88ii 00 0` 0ύ* } + *` * +  ɛ/.~ `8 L(ʩ L(`` 04% }D 8 0 i@ ( *L( * *@ԩ  L0L( 0R8#Ɉ#0(i} )i8  i2  i  0 #+` 09%  ( *` * *@ԩ  L0L( 0h R* l0#Ɉ}(e )e  0` 8F iiLc*8` `i ` ,* + )_Y *` }! *8` W* + `* + `ɛL*8m(`  ,`  ,8` } , 8F˭ ̠i˥iLJ+˅̅ - `H , ˥ ?#h`H , ˥ ?}#h`e   ,`Lc$ , -` `mͥiΥ8˥ $,`i(ϥi} 7.`e   ~$ ~$` `80m˥i̥iͥi $,`8```8`}` ,` , -` ,` , -` `L5-Y8˥̥mͥiέ ϭ  7. 8}   ``i ` ɰ Ɉ`8 ˭ ̥8ͥΥ8ϥ - m  i L5-}ɛL-Șei`˥̠ɛL-Șe˅i` .͑˥8˥̥8ͥޥ ".`0.`}0.` .͑˥i˥i̥iͥiޥ ".`H ԩЩЩ.h@H  ԩЩЩh.h}@h.G!( I  G!MLb EDITOR-HELPRETURN:New LineTAB: TabulatorBACKS: Back S}p.CONTROL...-DEL: Delete Char-CLR: Clear Text-;: Goto EOL-H: Home-N: Goto Textend-U: Page up-D: Page down-}X: Delete line-V: Join lines-B: Block start-E: Block end-C: Copy Block-F: Find -R: Repeat find-L: }Load-M: Merge-S: Save-I: Directory ` D0JKBDE V` D0BHIDE V` D0 B}HIDE V` D0 B V`hhii eiHHLL0hhi}iHHLl0 V` D0 B V`hhii eiHHLL0hhiAOLBALAlLCLDLDLpELELFLFLELFL&JLLLGLHLHLILaIL$IL@ILMhh8ȱȱȱL]AȱLxA}eiHH`hh+@LALBLHBLBLBLA BeiHH`LAȱȱ` A} \B 1CLAȱȱȱ` B \B 1CLAȱȱ` /B B 1CLA0`- BII}ii`0`- BIi`ȱ BLBLAȱȱȱ BLBLA HH`PD}EHI B V`PJK#DCEB V`P: P B V`' C C腕 C Cd C C } C C C B``朥i0 B``$0 &LC8啅喅&&(Ffƚ`}L)D ` ```߰`` %`))Ţ𲥢0``))}ŢLD0```) eeFf&LD D {D JE `} D C JE ``00!`IIiiLEIIii``E`II}ii`UVT E`UVT E`HH`HH"`ʼnLSFň}LSF`mm mm 88888 ͭ`}iiii8 ͭ```hhȱȱȄLF }GȩLF GLFeiHH`HH`hh> BoH`B(HIoDHE V #LF }GgHȭhHLF GgHLFȱȱȱȄoHɛġLFȱȱȄ G` LG-Ȅ}0:LGgHhH80KHLH {DmgHgHmhHhHīLG`gHIgHhHIhHgHigHhHihH`} d'hhiiȱȱȱ m}m iiHH E````}`%JӍ"J)J"J) J%#J I"J)@J"J)J$J# ILI"J)0 J#JLI"J)!J$J%J }%J#J`#J"J)0M J ɟ`Ʋ`$J%J"J)M!J@ ɿ`Ƴ`MMMM}MM JMM 6KMMM 6KM8MiMM8MiMM)Mii IKMM KmMiΙMM}M8MMMiiȑȭMȭM`M͑MMMMMM͐M*M͏M MMMMMMMM`F}fFfFf`M K K̔MmMii(iMM͕M K`MM`MM`M( KeX}eYmMi`Fejf`M`M(*(`MM MMMM 6KMM)}MMȱMȱMȱMiiM|MMmMmM8)MMMM 6KiM L` KM8MM}MMM nMjnM 0MMM-M M̡MϥmMii(iMM͕MС`8M`nMMMM}`M/ ̣MM`-MMIM`-MMIM`M-MM%MIM`?}?FN *NFNJJJJ ҮFN) ݥ 懭) 6N` ԍ ԱJJJJ ҍ ԍ Ա) ݥ 懭)}`ԍԍ`"ԩ@ԩ`}AcQuick-SourcetextD:GRAPH.LIB ----------------Length: $0E85Free : $68E6---------------- *Standart Graphics} Library*(c) RAINDORF SOFT 5/89** GRAPHICS ***schaltet Grafik(GR) einPROC GRAPHICSINBYTE[GR]LOCALBYTE[FKT,BE}TR]BEGIN ANDB(GR,15,FKT) IF GR>47 BETR=44 ELSE IF GR>31 BETR=60 ELSE IF GR>15} BETR=12 ELSE BETR=28 ENDIF ENDIF ENDIF CLOSE(6) OPEN(6,BETR,FKT,"S:"})ENDPROC** FRAME ***zeichnet RechteckPROC FRAMEINWORD[X1,Y1,X2,Y2]BEGIN PLOT(X1,Y1) DRAW(X2,Y1) DRAW(X2},Y2) DRAW(X1,Y2) DRAW(X1,Y1)ENDPROC** BOX ***zeichnet ausgefuelltes RechteckPROC BOXINWORD[X1,Y1,X2,Y2]LOC}ALWORD[H]BEGIN IF Y1>Y2 H=Y1 Y1=Y2 Y2=H ENDIF REPEAT PLOT(X1,Y1) DRAW(X2,Y1) } ADD(Y1,1,Y1) UNTIL Y1>Y2ENDPROC** CIRCLE ***zeichnet KreisPROC CIRCLEINWORD[X0,Y0,R]LOCALBYTE[FLAG]BEG}IN FLAG=0 .CIRC(X0,Y0,R,FLAG)ENDPROC** DISC ***zeichet ausgefuelletn KreisPROC DISCINWORD[X0,Y0,R]LOCALBY}TE[FLAG]BEGIN FLAG=1 .CIRC(X0,Y0,R,FLAG)ENDPROC** **PROC CIRCINWORD[X0,Y0,R]BYTE[FLAG]LOCALBYTE[}GM,HALF]WORD[X,Y,X1,Y1,X2,Y2,X3,Y3H,MX,MY]BEGIN SIGN PEEK(87,GM) AND(GM,15,GM) MX=79 MY=47 HALF=0 } IF GM>13 MX=159 MY=191 HALF=1 ELSE IF GM=8 MX=319 MY=191 ELSE IF GM<8 } MX=159 MY=95 ELSE IF GM>8 MX=79 MY=191 HALF=2 ENDIF } ENDIF ENDIF ENDIF X=0 Y=R H=Y LSRW(H) REPEAT IF H<0 ADD(H,R,H) SUB(Y,1,Y}) ENDIF X3=X Y3=Y IF HALF>0 ASRW(X3) ASRW(Y3) IF HALF=2 ASRW(X3) } ASRW(Y3) ENDIF ENDIF ADD(X0,X3,X1) ADD(Y0,Y,Y1) SUB(X0,X3,X2) SUB(Y0,Y,Y2) } IF X1>MX X1=MX ENDIF IF X2<0 X2=0 ENDIF IF Y1>MY Y1=MY ENDIF IF} Y2<0 Y2=0 ENDIF PLOT(X1,Y1) IF FLAG=1 DRAW(X2,Y1) ELSE PLOT(X2,Y1) E}NDIF PLOT(X1,Y2) IF FLAG=1 DRAW(X2,Y2) ELSE PLOT(X2,Y2) ENDIF ADD(X0,Y3,X1) } ADD(Y0,X,Y1) SUB(X0,Y3,X2) IF X1>MX X1=MX ENDIF IF X2<0 X2=0 ENDIF I}F Y1>MY Y1=MY ENDIF PLOT(X1,Y1) IF FLAG=1 DRAW(X2,Y1) ELSE PLOT(X2,Y1) } ENDIF SUB(Y0,X,Y2) IF Y2<0 Y2=0 ENDIF PLOT(X1,Y2) IF FLAG=1 DRAW(X2,Y2) } ELSE PLOT(X2,Y2) ENDIF SUB(H,1,H) SUB(H,X,H) ADD(X,1,X) UNTIL X>YENDPROC** FILL ***}Fuellt BildschirmbereichPROC FILLINWORD[X]BYTE[Y]WORD[XMIN]BYTE[YMIN]WORD[XMAX]BYTE[YMAX]LOCALW}ORD[MX]BYTE[MY,W,P,FL,FR]ARRAY[XP(127)YP(127)]BEGINUNSIGNP=0W=0-380FL=0FR=0WHILE X>XMIN SUB(X,1,X) P}OS(X,Y) LOCATE(W) IF W<>0 ADD(X,1,X) JUMP(379) ENDIFWEND-379MX=XMY=YREPEAT IF Y>YMIN Y- POS(X},Y) LOCATE(W) IF W=0 IF FL=0 XP(P)=X YP(P)=Y P+ P+ FL=1 ENDIF ELSE } FL=0 ENDIF Y+ ENDIF IF Y0SUB(X,1,X)PLOT(MX,MY)DRAW(X,Y)IF P<>0 REPEAT P- P- X=XP(P) Y=YP(P) POS}(X,Y) LOCATE(W) UNTIL W=0 JUMP(380)ENDIFENDPROCF P<>0 REPEAT P- P- X=XP(P) Y=YP(P) POS@Quick-SourcetextD:MATH.LIB ----------------Length: $090DFree : $6E5E----------------*Standart Mathematic} Library*(c) RAINDORF SOFT 5/89 ** IFP ***Wandelt Word in FloatPROC IFPINWORD[INT=212]OUTARRAY[FERG(6)=212}]BEGIN CALL(0,0,0,55722)ENDPROC** FPI ***Wandelt Float in WordPROC FPIINARRAY[FR0(6)=212]OUTWORD[BYTE=21}2]BEGIN CALL(0,0,0,55762)ENDPROC** AFP ***Wandelt ASCII in FloatPROC AFPINARRAY[BUFF(127)=1408]OUTARRAY[}FR0(6)=212]LOCALWORD[INBUFF=243]BYTE[CIX=242]BEGIN INBUFF=1408 CIX=0 CALL(0,0,0,55296)ENDPROC** DFP }***Wandelt Float-Daten in FloatPROC DFPINBYTE[A,B,C,D,E,F]OUTARRAY[FP(6)]BEGIN FP(0)=A FP(1)=B FP(2)=C} FP(3)=D FP(4)=E FP(5)=F FP(6)=0ENDPROC** FASC ***Wandelt Float in ASCIIPROC FASCINARRAY[FR0(6)=212]}OUTARRAY[LBUFF(127)=1408]LOCALBYTE[Q,I]BEGIN SIGN CALL (0,0,0,55526) I=0 REPEAT Q=LBUFF(I) I+ } UNTIL Q<0 I- SUB(Q,128,Q) LBUFF(I)=Q I+ LBUFF(I)=0ENDPROC** FADD ***Addiert 2 FloatPROC FADDINARRAY }[FR0(6)=212,FR1(6)=224]OUTARRAY[FERG(6)=212]BEGIN CALL(0,0,0,55910)ENDPROC** FSUB ***Subtrahiert 2 FloatPRO }C FSUBINARRAY[FR0(6)=212,FR1(6)=224]OUTARRAY[FERG(6)=212]BEGIN CALL(0,0,0,55904)ENDPROC** FMUL ***Multipli }ziert 2 FloatPROC FMULINARRAY[FR0(6)=212,FR1(6)=224]OUTARRAY[FERG(6)=212]BEGIN CALL(0,0,0,56027)ENDPROC** } FDIV ***Dividiert 2 FloatPROC FDIVINARRAY[FR0(6)=212,FR1(6)=224]OUTARRAY[FERG(6)=212]BEGIN CALL(0,0,0,56104 })ENDPROC** FCMP ***Stellt fest ob Float<0, F=0 oder F>0PROC FCMPINARRAY[F(6)]OUTBYTE[E]LOCALBYTE[I,H]B}EGIN E=F(0) AND(E,128,E) IF E<>0 E=0 JUMP(382) ENDIF I=0 E=1 REPEAT H=F(I) IF H<}>0 E=2 ENDIF I+ UNTIL I=6-382ENDPROC** FPRT ***Printet FloatPROC FPRTINARRAY[FR(6)]LOCA}LARRAY[Z(17),H(2)]BYTE[Q,I]BEGIN .FASC(FR,Z) Q=FR(0) AND(Q,128,Q) IF Q=128 ?("-"); ENDIF Q=Z(}0) IF Q=45 I=1 ELSE I=0 ENDIF IF Q=46 ?("0"); ENDIF Q=FR(0) IF Q<>0 REPEAT }Q=Z(I) I+ UNTIL Q<>48 I- ENDIF REPEAT Q=Z(I) IF Q<>0 H(0)=Q H(1)=0 ?(H); } I+ ENDIF UNTIL Q=0 ENDPROC I- ENDIF REPEAT Q=Z(I) IF Q<>0 H(0)=Q H(1)=0 ?(H); )Quick-SourcetextD:NUMERIC.LIB ----------------Length: $0ED1Free : $689A----------------*Standart Numeric Li!}brary*(c) RAINDORF SOFT 5/89 *benoetigt MATH.LIB** EXP ***Berechnet EXP(Float)PROC EXPINARRAY[FR0(6)=212]OUT!}ARRAY[FERG(6)=212]BEGIN CALL(0,0,0,56768)ENDPROC** EXP10 ***Berechnet 10^FloatPROC EXP10INARRAY[FR0(6)=212!}]OUTARRAY[FERG(6)=212]BEGIN CALL(0,0,0,56780)ENDPROC** LOG ***Berechnet LN(Float)PROC LOGINARRAY[FR0(6)=2!}12]OUTARRAY[FERG(6)=212]BEGIN CALL(0,0,0,57037)ENDPROC** LOG10 ***Berechnet LOG(Float)PROC LOG10INARRAY[!}FR0(6)=212]OUTARRAY[FERG(6)=212]BEGIN CALL(0,0,0,57041)ENDPROC** SQR ***Berechnet WURZEL(Float)PROC SQRINA!}RRAY[A(6)]OUTARRAY[XN1(6)]LOCALBYTE[E]ARRAY[XN(6),FERG(6),F5(6)F0(6),F1(6)]BEGIN .DFP(63,80,0,0,0,0,F5)!} XN=A E=XN(0) AND(E,127,E) A(0)=E IF E>=64 SUB(E,64,E) LSRB(E) ADD(E,64,E) ELSE IF!} E<63 SUB(64,E,E) LSRB(E) SUB(64,E,E) ENDIF ENDIF XN(0)=E REPEAT F0=A !}F1=XN .FDIV(F0,F1,FERG) .FADD(FERG,F1,FERG) .FMUL(FERG,F5,XN1) .FSUB(XN,XN1,FERG) .FCMP(FERG,E)!} XN=XN1 UNTIL E=1ENDPROC** SIN ***Berechnet SIN(Float) im BogenmassPROC SININARRAY[X(6)]OUTARRAY[Y(6!})]LOCALBYTE[FLAG,FLAG1]ARRAY[PI(6),PID2(6),PIM2(6),A2(6),A4(6)X^2(6),ONE(6)]BEGIN .DFP(64,1,0,0,0,0,ONE) .D! }FP(-65,22,96,80,0,0,A2) .DFP(62,118,16,0,0,0,A4) .DFP(64,3,20,21,-110,101,PI) .DFP(64,1,87,7,-106,50,PID2) .DFP(6!!}4,6,40,49,-123,48,PIM2) FLAG=0 .FCMP(X,FLAG1) IF FLAG1=0 FLAG=128 FLAG1=X(0) AND(FLAG1,127,FLAG1)!"} X(0)=FLAG1 ENDIF .FSUB(X,PIM2,X^2) .FCMP(X^2,FLAG1) WHILE FLAG1<>0 X=X^2 .FSUB(X,PIM2,X^2) !#} .FCMP(X^2,FLAG1) WEND .FSUB(X,PI,X^2) .FCMP(X^2,FLAG1) IF FLAG1=2 EOR(FLAG,-128,FLAG) .FSUB(X,PI,X!$}) ENDIF .FSUB(X,PID2,X^2) .FCMP(X^2,FLAG1) IF FLAG1=2 .FSUB(PID2,X^2,X) ENDIF .FMUL(X,X,X^2) !%}.FMUL(X^2,A4,Y) .FADD(Y,A2,Y) .FMUL(Y,X^2,Y) .FADD(Y,ONE,Y) .FMUL(Y,X,Y) FLAG1=Y(0) EOR(FLAG1,FLAG,FLAG1)!&} Y(0)=FLAG1ENDPROC** COS ***Berechnet COS(Float)PROC COSINARRAY[X(6)]OUTARRAY[Y(6)]LOCALARRAY[PID2(6)!'}]BEGIN SIGN .DFP(64,1,87,7,-106,50,PID2) .FADD(X,PID2,X) .SIN(X,Y)ENDPROC** ATN ***Berechnet Arcustangens v!(}on FloatPROC ATNINARRAY[X(6)]OUTARRAY[S(6)]LOCALBYTE[E,F]ARRAY[PI(6),PID2(6),PIM2(6),TWO(6)ONE(6),X1(6)!)}YY(6),YF(6),T(6),I(6)EPS(6),STR(10)]BEGIN .DFP(64,1,0,0,0,0,ONE) .DFP(64,2,0,0,0,0,TWO) .DFP(64,1,87,7,-106,50,PI!*}D2) .DFP(62,80,0,0,0,0,EPS) X1=X E=X1(0) AND(E,127,E) X1(0)=E .FSUB(X1,ONE,X1) .FCMP(X1,F) IF F=0 !+} I=ONE S=X YF=X .FMUL(X,X,YY)-383 REPEAT .FADD(I,TWO,I) .FMUL(YF,YY,YF) !,} E=YF(0) EOR(E,128,E) YF(0)=E .FDIV(YF,I,T) .FADD(S,T,S) X1=T E=X1(0) !-} AND(E,127,E) X1(0)=E .FSUB(EPS,X1,X1) .FCMP(X1,F) UNTIL F=2 ELSE .!.}FADD(X,ONE,X1) .FCMP(X1,F) IF F<2 I=ONE .FDIV(ONE,X,YF) E=YF(0) EOR(E,128,E)!/} YF(0)=E X1=PID2 E=X1(0) EOR(E,128,E) X1(0)=E .FADD(X1,YF,S) .F!0}MUL(YF,YF,YY) JUMP(383) ELSE I=ONE .FDIV(ONE,X,YF) E=YF(0) EOR(E,128,E) !1} YF(0)=E .FADD(PID2,YF,S) .FMUL(YF,YF,YY) JUMP(383) ENDIF ENDIFENDPROC** ABS **!2}*Berechnet ABS(Float)PROC ABSINARRAY[X(6)]OUTARRAY[Y(6)]LOCALBYTE[Q]BEGIN Q=X(0) AND(Q,127,Q) X(0)=Q!3} Y=XENDPROCloat)PROC ABSINARRAY[X(6)]OUTARRAY[Y(6)]LOCALBYTE[Q]BEGIN Q=X(0) AND(Q,127,Q) X(0)=Q Quick-SourcetextD:SUNRISE.QIK ----------------Length: $041BFree : $7350----------------*Kleines Grafikdemo "%5}SUNRISE"INCLUDE[D:GRAPH.LIB]BYTE[COL2=53271,BACKGR=53274,SYNC=54282DMA=559,HIMMEL=712I,WIESE,Y]WORD[DL=560ADR%6},X]MAIN.GRAPHICS (31) ;Grafik 15+16DMA=0 ;Bildschirm ausSETCOL(1,14,14) ;Farben setzenSETCOL(2,3,10)WIESE=%7}210HIMMEL=128ADD(DL,108,ADR) ;DLI-Befehl in POKE(ADR,142) ;Displaylist eintragenDLI(HORIZONT) ;DLI einschaltenDMA=34%8} ;Bildschirm anCOLOR(2) ;Sonne zeichen.DISC(60,142,40)CUT(40,103,200,183,30000) ;und aus-* %9} ;schneidenCOLOR(3).FRAME(4,8,155,184) ;Rahmen zeichnen .FILL(2,2,0,0,159,191)X=40Y=102I=0REPEAT PASTE(0,%:}X,Y,30000) ;Sonne auf den ADD(X,2,X) ;Bildschirm kopieren Y- ;Position der Sonne Y- ;aendern%;} I+ IF I=5 WIESE+ ;...es wird heller HIMMEL+ I=0 ENDIFUNTIL Y=26ENDMAININTER HORIZONTBEGIN PUS%<}H ;CPU-Register retten REGA(SYNC) ;Synchronisieren BACKGR=WIESE ;Farben aendern COL2=WIESE PULL %=} ;Register holenENDDLIretten REGA(SYNC) ;Synchronisieren BACKGR=WIESE ;Farben aendern COL2=WIESE PULL $Quick-SourcetextD:BCD.QIK ----------------Length: $03F9Free : $7372----------------* Library-Demo:BCD-U)?}mwandlung* Liest eine Zahl ein und wandelt* sie in Fliesskomma. Danach werden* die 6 Bytes aus denen die Zahl* intern bes)@}teht ausgegeben.* Gibt man diese Werte bei .DFP() an,* so kann man schnell einer Fliess-* kommazahl einen bestimmten Wert)A}* geben.INCLUDE[D:MATH.LIB]BYTE[I,A,B0,B1,B2,B3,B4,B5]ARRAY[F1(6),F2(6),Z1(20)]MAIN CLOSE(6) ;Edit)B}or oeffnen OPEN(6,12,0,"E:")REPEAT ? PRINT("ZAHL ? "); ;Zahl einlesen INPUT(Z1) .AFP(Z1,F1) ;in Fliessko)C}. umwandeln I=0 UNSIGN ?("Bytedarstellung:") REPEAT A=F1(I) ;die einzelnen Bytes der ?(A) ;zeig)D}en I+ UNTIL I=6 ?("der Zahl:") .FPRT(F1) ;Zahl ausgeben ? B0=F1(0) ;die Bytes der Zahl B1=F1(1)E}) ;in BYTE-Variablen B2=F1(2) ;uebertragen B3=F1(3) B4=F1(4) B5=F1(5) .DFP(B0,B1,B2,B3,B4,B5,F2) ;die* )F} ;Bytes zu F2 zusammensetzen .FPRT(F2) ;Zum Vergleich Printen ?UNTIL 1=0 ;EndlosschleifeENDMAIN) ;die* (tQuick-SourcetextD:SIN.QIK ----------------Length: $043BFree : $7330----------------* Library-Demo: SINU-H}S* Berechnet den Sinus von -7 bis 13* mit Routinen aus der NUMERIC und* MATH Library und zeichnet ihn mit* der GRAPH Libr-I}aryINCLUDE[D:MATH.LIB ;alle LibrariesD:NUMERIC.LIB ;ladenD:GRAPH.LIB]WORD[I,K]ARRAY[F1(6),F16(6),F7(6) ;Arr-J}ays als Fliess-F13(6),F40(6) ;kommavariablen]MAIN SIGN .GRAPHICS(8) ;Hochaufloesende* G-K}rafik .AFP("0.0625",F16) ;1/16 in F16 .AFP("1",F1) ;1 in F1 .AFP("-7",F7) ;-7 in F7 .AFP("40",F40) -L} ;40 in F40* schreiben COLOR(1) ;Punktfarbe waehlen SETCOL(1,0,0) ;Farbwerte setzen -M}SETCOL(2,0,10) I=0 ;Schleifenvariable setzen REPEAT .SIN(F7,F13) ;Sinus von F7 in* F13 -N}schreiben .FMUL(F13,F40,F13) ;mal 40 .FADD(F13,F40,F13) ;plus 40 .FPI(F13,K) ;Fliesskommazahl F13* -O} in Integervariable K PLOT(I,K) ;und dann Plotten .FADD(F7,F16,F7) ;F7 plus F16 ADD(I,1,I) ;I u-P}m 1 erhoehen UNTIL I>318 ;AbbruchbedingungENDMAINn Plotten .FADD(F7,F16,F7) ;F7 plus F16 ADD(I,1,I) ;I u,9Quick-SourcetextD:DEMO.QIK ----------------Length: $0D12Free : $6A59----------------QUICK-DEMOPROGRAMM1R}BYTE[DMA=559WSYNC=54282,PMBASE=54279,GRAC=53277HPOS1=53248,HPOS2=53249,PCOL1=704CURS=752,PCOL2=705,BCOL=712,TIMER=20COL1S}BK=53274X,Y,FLAG,CZAE,FARBE]WORD[DPL=560,BS=88PL,PDAT,PDAT1,Z,Z1]MAIN*Vorzeichen ausUNSIGN**Displaylist mit DL1T}I*in Speicher kopieren*DATA (24576)[112,112,112,199,32768,112,6,2,2,2,215,15,15,15,15,15,15,15,15,15,15,1515,15,15,15,1U}15,15,15,15,15,15,15,1515,15,15,15,15,15,15,15,15,15,15,1515,15,15,15,15,15,15,15,15,15,15,1515,15,15,15,15,15,15,15,15,151V},15,1565,24576]DMA=0 *Bildschirm ausDPL=24576 *DPL-Zeiger setzenBS=32768 *BildschirmanfangCLR (1281W},11) *Speicher loeschenSETCOL (4,0,0) *Farben setzenSETCOL (2,10,4)CURS=1 *Cursor ausDMA=34 *Bildschirm1X} anPOS (0,0) *Und nun Printen...PRINT(" quick demo ")PRINT("Quickprogramme werden in ");PRINT("MASCHINEN-")1Y}PRINT("SPRACHE uebersetzt").PAUSE(150) *Unterprogramm "PAUSE"POS (0,1) *wieder PrintenPRINT("Deswegen ist ein DLI 1Z}kein ");PRINT("Problem ")PRINT(" ")**Playerdaten kopieren*DATA (25600)[*PLAYERDATEN71[},31,63,63,63,63,63,31,156,24,96,60192,240,54,127,255,255,246,240,224192,96,48,307,31,63,63,63,63,63,31,153,6,15,0192,241\}0,54,127,255,255,246,240,224192,192,96,1207,31,63,63,63,63,63,31,151,1,6,7192,240,54,127,255,255,246,240,224192,96,120,01]}]PMBASE=112 *Playeranfang setzenGRAC=3 *Player anschaltenPCOL1=120 *PlayerfarbenPCOL2=120PL=29696 D1^}LI(DISP) *Unterpr. "DISP" als DLIDMA=34.PAUSE(150)POS(0,1)PRINT("Auch ein VBI z.B. fuer eine ");PRINT("Playerbewe-")1_}PRINT("gung ist ganz einfach")X=48 *Position setzenY=100PDAT=25600PDAT1=25613FLAG=0DMA=62 *Bildschirm 1`}mit PlayerVBI(GNOM) *Unterpr. "GNOM" als VBI.PAUSE(150)POS(0,1)PRINT("Und das Hauptprogramm kann ");PRINT("sich dabe1a}i ")PRINT("noch mit Grafiken beschaefti");PRINT("gen ")POKE (87,8) *Grafik 8BS=32968 *BildschirmanfangFARBE=1*1b}*Muster zeichnen*REPEAT Z=0 Z1=319 COLOR(FARBE) REPEAT PLOT (Z,0) DRAW (Z1,59) ADD (Z,6,Z) 1c} SUB (Z1,6,Z1) UNTIL Z>=319 FARBE+UNTIL FARBE=255ENDMAIN**DLI*INTER DISPBEGIN PUSH *CPU Register1d} retten IPUSH *Interne Reg. retten CZAE=224 REPEAT REGA(WSYNC) *Synchronisieren COLBK=CZAE *Farbe hochzae1e}hlen CZAE+ CZAE+UNTIL CZAE=240 IPULL *Alle Register zurueck PULLENDDLI**VBI*INTER GNOMLOCAL:BYTE1f}[HX]BEGIN IPUSH X+ *Playerposition aendern Y+ IF X>=170 X=48 Y=100 ENDIF ADD (PDAT,261g},PDAT) *Playerform ADD (PDAT1,26,PDAT1) *aendern FLAG+ IF FLAG=3 FLAG=0 *Anfangs-Form PDAT=25600 1q}?b%DOS SYSb*)DUP SYSbSAUTORUN SYSbFZCOMPILEROBJb$EDITOR OBJbRUNTIME OBJbGRAPH LIBbMATH LIBb NUMERIC LIBb 4SUNRISE QIKb >BCD QIKb GSIN QIKbQDEMO QIKbbvQUICK1 AWPb3QUICK1A AWPbe QUICK2 AWPb6pQUICK3 AWPb RAMDISK COM PDAT1=25613 ENDIF CLR(116,2) *Player loeschen**Player1 in Playerbereich kopieren* PLAYER (116,Y,13,PDAT)*1r}*Player2 in Playerbereich kopieren* PLAYER (117,Y,13,PDAT1)**Horizontale Position setzen* HPOS1=X ADD (X,8,HX)1s} HPOS2=HX BCOL+ IPULLENDVBI**Unterprogramm "PAUSE"*PROC PAUSEIN:BYTE[WAIT]LOCALBYTE[ LDA=165 *Masch1t}inencodes definierenCMP=205BNE=208]BEGINTIMER=0**Direkt Maschinensprache einbinden*In QUICK ginge es aber auch:*REPE1u}AT*UNTIL TIMER=WAIT*INLINE[LDA,TIMER,CMP,WAIT,BNE,249]ENDPROCensprache einbinden*In QUICK ginge es aber auch:*REPE0F  FF                    5w}                          5x}        DE NIEUWE PROGRAMMEERTAALHartelijk welkom bij onze nieuwe programmeertaal Quick. De5y}ze taal werd exclusief ontwikkeld voor de Atari magazin lezers. Quick is bijna net zo snel en kan bijna hetzelfde als assembl5z}eertaal, en is net zo eenvoudig als de basic-taal.In dit hoofdstuk zullen wij U niet alleen de nieuwe taal voorstellen, wij5{} zullen U ook een indruk geven hoe deze taal verstaanbaar wordt gemaakt aan Uw computer.Wie al een tijdje bezeig is met Ata5|}ri basic, zal snel op grenzen stoten van de ingebouwde basic. Programma's welke krachtig zijn, krijgt men meestal niet verwer5}}kt in de normale basic-taal. Het is meestal veel te langzaam; bovendien kunnen de omvangrijke Hardware extra's (zoals bijvoor5~}beeld de Interrupts) niet voor de volle 100 % gebruikt worden. Wilde men meer halen uit de Atari, dan was men meestal genoodz5}aakt zijn toevlucht te nemen tot de moeilijke assembleertaal.Assembleertaal is snel en kan zeer veel, echter vraagt zijn pr5}ogrammeertaal een immense tijd om de gegevens in te voeren. Zelfs de eenvoudigste programma's slokken een hoop werk en tijd o5}p. Assembleeertaal is ook niet zaligmakend. Eenvoudige opdrachten zoals PRINT, PLOT, SOUND of LOAD veroorzaken veel werk en b5}ij eventuele programmeerfouten is het vaak lang zoeken. Zo is het dan ook verstandig de machine-taal c.5}q. assembleertaal te laten voor wat hij is en om te zien naar een eenvoudigere taal. Daarom werd er dan ook geopperd om een t5}aal te ontwikkelen welke de voordelen had van zowel basic als van assembleertaal. Ze moet snel en universeel inzetbaar 5}zijn en openstaan voor alle Hardwaremogelijkheden van de Atari. Ze moet ook eenvoudig te bedienen zijn en een zekere programm5}astructuur hebben.Voordat wij een definitie van de taal maken konden, moesten wij eerst bepalen waar deze taal ingezet moes5}t kunnen worden. Wij hebben besloten deze te gebruiken voor het programmeren van spellen, geluid, grafieken en alle daarbij b5}ehorende routine's (dus meestal grafiek- en tekstverwerkingsprogramma's). Ook zijn natuurlijk opdrachten zoals IF...ELSE...EN5}DIF... of REPEAT... UNTIL noodzakelijk.Een verdere bijdrage in de structuur bied de mogelijkheid van verklaring van var5}iabelen. Men kan verschillende vormen van variabelen gebruiken, zoals integere en die welke alleen hele getallen kennen (hier5}in laat zich de mogelijkheid zien om ook nog tussen byte en woord te kiezen) en arrays. Een belangrijk gegeven is dat ook de 5}mogelijkheid word gegeven lokale variabelen te gebruiken en aan procedure's over te geven. Deze variabelen laten zich dan all5}een toepassen in het programmadeel, waarin ze gedeclareerd zijn.Nu is het nog de vraag, hoe is het mogelijk dat deze taa5}l snelwerkende programma's kan produceren? Daarvoor moest Quick als compiler-taal toegepast worden, dat wil zeggen dat men 5}eerst met behulp van een teksteditor een Quicktekst in elkaar zet, die dan met behulp van een compiler in een direct lopend m5}achine taal programma te vertalen is. Daarbij is dan natuurlijk de vraag hoe men dit moet doen. Opdrachten zoals add variabel5}en of het inlezen van dataregels worden hierbij zo goed vertaald, dat het in de assembleertaal niet sneller verwerkt kan word5}en. Andere opgaven zoals vergelijken moeten daarentegen zo flexibel zijn, dat de assembler hier zeker snelheids-voordelen hee5}ft.Zoals U in bovenstaande al bemerkt heeft moet men telkens tussen 2 programma's (Editor en Compiler) wisselen. Om dit nie5}t te lang te laten duren is het verstandig deze 2 programma's beide op een diskette in een diskdrive bij de hand te houden. N5}u ontbreekt er nog een 3e programma, dat de Editor en Compiler in het begin laad een aansluitend hun verbinding aangaat. Dit 5}programma is genaamd Shell (te vinden op de diskette onder de naam AUTORUN.SYS). Om de Editor en Compiler niet het totale geh5}eugen in beslag te laten nemen, zijn deze afwisselend in de vrije ruimte achter het bedrijfs system te copieren als ze nie5}t gebruikt worden. Ook hiervoor is Shell verantwoordelijk.De uitbreidingsmogelijkheden van Quick is door library's (program5}ma routines) aan te brengen in het programma. Een dergelijke library wordt verstaan onder een Quick tekst, die een aantal 5}verschillende program- ma-routines inhoud. Enige standaard library's horen van huis uit in listings opgenomen te worden. Daar5}bij handeld zich het om een grafiek library (bevat routines om verschillende geometrische objecten te tekenen en een FILL-o5}pdracht), een berekenings-library en een paar andere. Wordt een van de routines toegepast in het programma, dan kan men de co5}mpiler opdracht geven de benodigde routine in te laden.Het Quick programmeersystem ziet er als volgt uit:- Editor om teks5}ten te schrijven;- Compiler om programma lopend te maken;- Shell om Editor en Compiler met elkaar te verbinden;5}- library's voor een eenvoudige uit- breiding.Onderstaand nu de eerste Quick-tekst:MAIN PRINT("Hallo Wereld") END5}MAINZoals U ziet is er een bepaalde over- eenkomst met Basic. SHELL =====Dit is een ko5}rt programma welke achter de systeemfile DOS geplaatst wordt onder de naam AUTORUN.SYS. Plaats deze file op een dos 2.5 diske5}tte. Nadat U de diskette opgeBOOT heeft met OPTION ingedrukt, bevind U zich in SHELL, welke meteen begint met het inladen van5} de Editor en Compiler, indien deze voorhanden zijn. Als dit gebeurt is kunt U de systeemdiskette uit de diskdrive halen en e5}en voorgeformatteerde werkdiskette in de diskdrive doen.Door Editor of Compiler in te typen roept U het desbetreffende prog5}ramma aan. CONTROL Q geeft een koude start. QUICK - EDITOR ==============De eerste stap om zelf een p5}rogramma te schrijven is om een tekst te maken met behulp van de Quick-editor. Deze tekst wordt dan met behulp van de compile5}r omgezet in lopende program- ma's. Dit programma is onder de filenaam EDITOR.OBJ op de systeem diskette aanwezig. 5} OPBOUW VAN EDITOR =================De Quick-editor onderscheid zich sterk in het gebruik van andere editors, t5}emeer omdat Quick geen gebruik maakt van regelnummers. U zult zien dat dit vele voordelen heeft.Een ander belangrijk gegeve5}n is dat de Editor zich constant in de INSERT mode bevind. Alle tekens die U intikt worden op de plaats waar de cursor zich b5}evind, geplaatst, en alle tekens rechts van de cursor worden hierbij telkens een sta verschoven.Per regel kunnen maximaal 35}8 tekens verwerkt worden, aan het einde van iedere regel blijft de cursor automatisch staan.In het begin legt de Editor alt5}ijd een tekst-kop aan, waarin aangegeven wordt de lengte van de tekst in bytes en hoeveel vrije ruimte er over is in hexadeci5}maal. Zogauw U bij SAVE een filenaam intikt, wordt deze ook in de tekst-kop aangegeven. DE EDIT-MODE ==5}==========Als U zich in de edit-mode bevind kunt U beginnen met Uw programma in te tikken. Hierin zijn Hoofd en kleine lett5}ers toegestaan, echter GEEN INVERSE tekens of GRAFIEK tekens kunnen hierin gebruikt worden. Met behulp van de RETURN toets wo5}rdt het einde van de regel aangegeven. Als U in het midden van de regel een RETURN geeft, dan wordt deze regel opgedeeld, het5} 2e gedeelte wordt dan voor de volgende regel geplaatst. Op de 38e plaats kan men deze optie niet meer toepassen!Met de pij5}l-toetsen CONTROL +-=* kan de cursor over het beeldscherm bewogen worden. Het bovenste en onderste gedeelte van de tekst word5}t door 2 pijlen aangegeven. De cursor kan deze 2 markeringen niet overschrijden.Verder is de toets DELETE BACK SPACE (+CONT5}ROL) ook te gebruiken op de manier waar U waarschijnlijk wel mee bekend bent. CONTROL-TOETSEN =========5}======CONTROL-X wist regel uit waar cursor zich bevind;CONTROL-V samenvoegen van 2 regels (alleen te gebruiken 5}als beide regels niet meer dan 38 tekens bevatten);CONTROL-H voert cursor naar begin van de tekst;CONTROL-N voert cur5}sor naar einde van de tekst;CONTROL-U voert cursor 1 positie naar boven;CONTROL-D voert cursor 1 positie naar beneden5};CONTROL-; voert cursor naar einde van regel;CONTROL-CLR wist tekst links van cursorCONTROL-B start block (regels5}gewijs) en wist block-einde;CONTROL-E start block, de lengte mag niet meer bedragen dan 3 Kbyte. Het block wordt dan in e5}en interne buffer gecopieert, zodat deze onveranderd blijft, ook als deze verder in de editor gewijzigd wordt. In de 5} statusregel verschijnt dan "Edit-block defined";CONTROL-F zoekt een volgorde van tekens, waarbij ? als joker die5}nt, deze zoekt alleen de 1e regel af, met R gaat hij verder;CONTROL-I geeft de inhoud van diskdrive nr. 1. Als dit gebeur5}t is, kunt U met een druk op een toets terug naar de Editor;CONTROL-S SAVE tekst naar diskette, dit kunt U doen met een e5}igen filenaam xxxx.QIK, of indien U reeds een geSAVEde file aangeroepen heeft, volstaan met een RETURN. Met deze functi5}e kunt U ook de tekst laten uitprinten door hier P: te plaatsen;CONTROL-L laad een tekst, hierdoor wordt de tekst welke i5}n het geheugen zit, gewist;CONTROL-M laad een tekst en hangt deze achter de tekst welke zich op dat moment in de Editor b5}evind;CONTROL-O toont een hulp-tekst, welke de besturingstoetsen aangeeft, met een druk op een toets kunt U weer terug na5}ar de Editor;CONTROL-Q verlaat de Editor en gaat weer terug naar Shell.Zoals U ziet, biedt de Editor een rij van prakti5}sche functies, die het schrijven van Quick-tekst eenvoudiger maakt als die van Basic. DE COMPILER 5} ===========Nu het belangrijkste bestanddeel van de Quick-taal: de Compiler. Wij zullen niet alleen ingaan op de bediening 5}van de Compiler, echter ook bekijken hoe de opbouw is en hoe de Compiler werkt.De Compiler heeft tot taak om de Quick-tek5}st welke U ingetikt heeft met behulp van de Editor om te zetten naar lopende programma's. Deze teksten moeten niet te lang zi5}jn (zoals het meestal het geval is met gecompileerde programma's) en uiteraard moeten ze snel lopen. Het is natuurlijk zo dat5} een compiler deze functies niet voor de volle 100 % uitvoeren kan. Men moet dus een bruikbare compromis vinden.Eerst zulle5}n wij uitwijden over de werkwijze van de compiler. Het gaat om een 2-pass compiler, dit betekent dat een tekst in 3 gedeeltes5} in een programma vertaald wordt.Pass 1------Hier worden alle variabelen welke in gebruik zijn in een tabel opgeslagen. H5}ierin wordt ook de goede gang van het programma nagevolgd.Pass 2------Hier wordt de tekst in leesbare machinetaal vertaal5}d. Daarbij onderscheid de compiler zich in 3 verschillende mogelijkheden:1/ waarde toekenning ----------------- Hiero5}nder verstaat men elke transfer van een variabele naar een andere, bijvoorbeeld: A = B of A = 10 Deze transfer v5}an waarden wordt optimaal in machinetaal vertaald door: LDA B LDA #10 STA A STA A2/ macro's ------- 5}Eenvoudige opdrachten worden in machinetaal overgezet,bijvoorbeeld: SETCOL(N,F,H) wordt vertaald in: LDX N LD5}A F ASL ASL ASL ASL ORA H STA 708,X3/ runtime programma ----------------- Gecompileerde opdrachten 5}roepen runtime-programma aan. Dit ca. 3 Kbyte metende block wordt tijdens het compileren ingeladen en in het 5} programma opgenomen.Deze bovenste 3 opties zijn het "langzaamst". Daarna moeten variabelen aangegeven worden. B5}EDIENING VAN COMPILER ======================Eerst dient U een filenaam te geven van het te compileren programma. In5}dien U reeds de Editor verlaten heeft, wordt hier de op dat moment aanwezige file aangegeven. Daarna wordt het programma geco5}mpileert. Elke regel wordt aangegeven die op dat moment gecompileert wordt, daar dit zeer snel gebeurt ziet U ze alleen maar 5}langs flitsen.egel wordt aangegeven die op dat moment gecompileert wordt, daar dit zeer snel gebeurt ziet U ze alleen maar 4  FF                    9}                          9}        --- vervolg QUICK1 ---Nadat de Compiler klaar is heeft U de keuze uit Anothe9}r file (nog een file) of Exit (verlaten) naar Shell, Save om het gecompileerde programma met de extender .OBJ weg te saven en9} Run om een gecompileerd programma te starten.Als er een fout in het programma tevoorschijn komt tijdens het compileren, ko9}mt de desbetreffende foutmelding tevoorschijn op de monitor, bestaande uit foutmeldingsnummer, desbetreffende regel en in wel9}k programma de fout aanwezig is, voorbeeld:Error #5 in KLEUREN (C)ont (E)xitDeze melding geeft aan dat in het programmad9}eel KLEUREN een niet te verklaren opdracht gegeven is. Als de fout niet aanwezig is in een programmadeel dan wordt aangegeven9} MAIN (hoofdprogramma).U kunt met Exit de compiler verlaten of met Cont doorgaan met compileren. OPBOUW QUICK-T9}EKST ==================Nu komen we aan een belangrijk gedeelte, hoe moet de tekst er uitzien? Ieder programma hee9}ft de volgende opbouw:A/ include-file-namen (eventueel)B/ variabelen verklaringC/ hoofdprogramma (MAIN)D/ programma-ond9}erdelen (PROC)Include-file-namen------------------Met de include-opdracht worden de library's (onderdelen van programma) 9}ingeladen bij compileren:INCLUDE[D1:GRAPH.LIBD2:MATH.LIB...]Deze opbouw (keywoord, ,file-namen, ) moet men altijd aa9}nhouden. Ook kunt U maar maximaal een opdracht per regel geven. ---Variabelen verklaring---------------------In di9}t gedeelte van het hoodprogramma dienen alle variabelen uitgelegd te worden. Hierin worden de variabelen opgeslagen welke doo9}r het hele programma in gebruik zijn. Extra variabelen zijn:1-byte variabelen byte-variabelen ze hebben maar 1 byte nodi9}g van geheugen;2-byte variabelen woord-variabelen, ze gebruiken maar 2 byte van geheugen;Velden ARRAY-variabelen, ze 9}hebben 1 tot 255 bytes nodig (dient opgegeven te worden). Deze Arrays kunnen zowel als STRINGS als 1-dimensionale velden opge9}geven worden.De opbouw van de verklaring dient als volgt gedaan te worden:[variabel-naam,variabelenaam,......]De te g9}ebruiken type's zijn BYTE, WORD, ARRAY:BYTE[A1,F3,DA_S1INT]WORD[W1,W0]ARRAY[VELD(10),TEXT(40)]Bij veldvariabe9}len is achter de naam aangegeven hoe lang de lengte in bytes is (1 tot 255). De compiler wijst iedere variabele een plek in h9}et geheugen toe. De mogelijkheid is er ook om te bepalen waar een variabele opgeslagen dient te worden, voorbeeld:BYTECOL9}1=708,COL2=709Nu kan men later in het programma in plaats van SETCOL(0,1,10) eenvoudig intikken COL1=26. Dit gaat sneller e9}n heeft minder plaats nodig. Op deze manier worden vele POOK's en PEEK's overbodig.Hoofdprogramma--------------Het begint9} met MAIN en eindigd met ENDMAIN, hiertussen bevind zich het programma, weke uit alle mogelijke Quick-opdrachten kan bestaan.9}Library (programma-onderdelen)------------------------------Deze beginnen met PROCprogrammadeel en eindigen met ENDPROC. 9}Het eerste deel van het programma bestaat uit het verklaren van variabelen die alleen daar toegepast worden, welke in drie gr9}oepen verdeeld zijn, t.w. IN, OUT, LOCAL.Bij IN komen de variabelen te staan welke aangeroepen worden uit het MAIN hoofdpro9}gramma. Bij OUT de variabelen welke teruggegeven worden aan het MAIN programma als routine uitgevoerd is (PAS OP!!! de volg9}orde moet hier exact hetzelfde zijn als die van het MAIN programma !!!)Bij LOCAL komen de variabelen te staan welke alleen i9}n de routine gebruikt worden. U kunt hier variabel namen gebruiken welke ook aanwezig zijn in het MAIN programma, echter deze9} moeten natuurlijk niet door de routine aangeroepen worden uit het MAIN programma.De opdracht BEGIN be-eindigd de routine. V9}oorbeeld:PROC VOORBEELDINBYTE[VAR1]OUTBYTE[VAR2]WOORD[WAARDE1]LOCALARRAY[TEXT]BEGIN...ENDPROCBij he9}t aanroepen van het programma onderdeel wordt dus een waarde aangeroepen en 2 waardes uitgegeven. De oproep is als volgt:.9}VOORBEELD(10,V1,W2)of.VOORBEELD(V0,V1,W2)Let er op dat U de punt ook invult, deze is essentieel voor de aanroep.In Qu9}ick is het niet mogelijk termen ofwel nummerieke uitdrukkingen aan te geven, het volgende is dus NIET GOED:A=5-4*3Bij waa9}rde toekenningen in Quick kan rechts van het = teken alleen een waarde of een naam toegekend worden, voorbeeld:A=5W=-10009}A=BMen kan ook negatieve getallen invoeren dus. Ook onderstaande waarden kunnen ingevoerd worden:BYTE -128 tot +127 9} (signed)WOORD -32768 tot +32767 (signed)BYTE 0 tot 255 (unsigned)WOORD 0 tot 65535 (unsigned)Arr9}ay als string----------------U kunt een array een tekst toekennen (als deze langer is als de DIMensionering, wordt deze die:}ntengevolge afgesneden). Deze ziet er zo uit:TEXT="Hallo"De inhoud van een array kan in een keer overgecopieerd worden me:}t bijvoorbeeld:VELD=TEXTZo kan het ook:VELD="ABCDE"VELD(3)=TEXTDit geeft het volgende namelijk:"ABCHallo"Hierbij:} wordt niet gelet op het overschrijden van de DIM opdracht.Dit mag echter weer niet:VELD(3)="ABDC"Het einde van een arr:}ay wordt gekenmerkt met een 0, daarom moet U met een DIM opdracht altijd een extra ruimte inlassen voor deze nul.Array als :}CHR$--------------In Basic komt een dergelijke opdracht wel eens voor:PRINT CHR$(125)In Quick wordt dit als volgt gegev:}en:VELD(0)=125VELD(1)=0(kenmerkt het einde van de string)PRINT(VELD)Array als getallen-veld-----------------------U :}kunt het gebruiken als een normaal een-dimensionaal veld, waarbij U zelf beslist of U 1- of 2-byte getallen gebruikt.VELD(0:})=1000 : hiermee zijn VELD(0) en VELD(1) belegt;VELD(0)=100 : hiermee is alleen VELD(0) belegt (8 bit);VELD(0)=!100:} : 16 bit, VELD(0) en VELD(1) zijn belegt. Met het uitroepteken kan men dus een 16 bit gebruiken. Bij negatieve getallen : } het volgende voorbeeld: VELD(0)=-!100. EERST dus het - teken, dan pas het uitroepteken. --- EINDE HOOFDSTUK 1 ---: } het volgende voorbeeld: VELD(0)=-!100. EERST dus het - teken, dan pas het uitroepteken. --- EINDE HOOFDSTUK 1 ---8  FF                    > }                          > }        --- HOOFDSTUK 2 --- QUICK - BEVELEN ===============To>}t de vaste woordenschat van Quick horen circa 60 commando's. Enige hiervan kent U reeds van de normale basic-taal, andere kom>}en van assembler of C. De compiler vertaald deze direct in de programmacode of roept deze aan uit een van de desbetreffende l>}ibrary's. Het laatste geschied bij de commando's die met een @ aangegeven zijn.*kommentaar het sterretje duid aan dat er>} een opmerking komt (REM). Deze kan alleen staan in de regel of direct na een opdracht. Quick-tekst mag overigens ook lege r>}egels bevatten.OPEN(NR,AUX1,AUX2,NAME) opent kanaal NR met de parameters AUX1, AUX2 en de data-naam NAME. Voorbeeld>}:OPEN(1,4,0,"D:TEXT.TXT")Zoals bij de meeste andere opdrachten mogen de parameters alleen BYTE of WOORD variabelen of getal>}len zijn. Arrays kunnen alleen als strings bij oproep toegepast worden, echter niet als integere variabele in de vorm van VEL>}D(1). Dit betekent, dat een identicatie bij de bevel-oproep niet mogelijk is. Het volgende is dus niet juist:OPEN(10,>}VELD(1),0,"P:")Wel goed is deze:A=VELD(1)OPEN(10,A,0,"P:")Bij het begin van een Quick programma moet U normaal gesproken >}het beeldscherm of het editor-kanaal (in grafiek 0) openen met: CLOSE(6)OPEN(6,12,0,"S:")PRINT is nu mogelijk, INPUT>} daarentegen niet. U kunt echter ook gebruiken:OPEN(6,12,0,"E:")Nu zijn PRINT en INPUT ook mogelijk. Deze opdracht zou me>}n in alle programma's moeten gebruiken, daar dan de GRAPHICS-routine uit de graphic-library wordt gebruikt.CLOSE(nr) dit >}bevel sluit het kanaal(nr).BGET(nr,aantal,adres) leest aantal bytes af van kanaal (nr) vanaf aangeduid adres. Deze >} opdracht dient vaak ook voor het ingeven van tekens als de editor niet geopend is en om de opdracht INPUT te o>}mzeilen.BPUT(nr,aantal,adres) dit bevel schrijft aantal waarden vanaf genoemd adres op kanaal(nr). INPUT(A)@ dient om>} een getal in te voeren (A is een byte of een woord), of een tekst (A is een array).Nog een belangrijk gegeven: Het INPU>}T bevel functioneert alleen, als men van te voren een editor kanaal geopend heeft!PRINT(A1,A2,A3,...)of? (A1,A2,A3,...) >} schrijft op het beeldscherm. Tussen de haakjes kunnen naar believen parameters ingevoerd worden, die gescheiden worden door > }komma's. Hier is het mogelijk om BYTE, WOORD, arrays en teksten door elkaar te gebruiken; PRINT(A,B,10,"Hallo,Wereld",VE>!}LD). Achteraan de opdracht kan men een ; (puntkomma) gebruiken, de RETURN wordt dan niet uitgevoerd, zodat de eerstvolgende P>"}RINT opdracht meteen hierachter gevoegd kan worden: PRINT("Hallo"); PRINT(" Wereld")Hierdoor ontstaat het volgende: >#} Hallo, WereldPOS(X,Y) zet de cursor op de positie x,yLOCATE(waarde)@ leest de inhoud van het beeldscherm op de plaat>$}s waar de cursor zich bevind in waarde.COLOR(A) kiest kleurenregister 0 tot 4 voor PLOT en DRAW.PLOT(X,Y)@ zet een pu>%}nt in de gekozen kleur op de plek x,yDRAW(X,Y)@ trekt een lijn naar de positie x,yPLAYER(Z,I,L,Q)@ geeft L data vana>&}f adres Q in blad Z, waarbij I als index van eindadres bedoelt wordt.Dit bevel laat zich goed gebruiken om Player-data in he>'}t player-bereik te copieren. Daarbij kan als het ware I als Y-positie gebruikt worden. (I mag alleen de waarde van 0 tot 255 >(}bedragen!cLR(P,A)@ wist vanaf blad P A*256 bytes.CUT(X1,Y1,X2,Y2,ADR)@ snijd een rechthoek met de hoekposities X1,Y1 >)}en X2,Y2 en slaat het op onder ADR (adres) zoals aangegeven wordt.Dit bevel functioneert in GRAPHICS 8, bij alleen X1 en X>*}2 ook in GRAPHICS 15,7 (hier gewoon X1 en X2 verdubbelen!).PASTE(M,X1,Y1,ADR)@ copiert de paste-data naar het beeldsc>+}herm. De hoek linksboven geeft men aan met X1,Y1. Bij M=0 wordt overschreven, bij M=1 in OR-mode gezet (is >,}alleen zinvol in GRAPHICS 8).SETCOL(N,F,H) zet kleurregister N op kleur F in resonantie H.SOUND(K,H,V,L) schak>-}elt toonkanaal K met toonhoogte H, vervorming V en geluidssterkte L in. Bij V moet een waarde van 0 tot 7 opgegeven worden >.}(de helft van de waarde in basic).DIGI(G,A,E)@ laat gedigilatiseerde geluiden horen. De data wordt gespeeld in A tot >/}E. Bij A en E wordt alleen op high-bytes gelet. Als speelsnelheid kan met 1 (snel) tot 255 (langzaam) opgegeven worden. Hierb>0}ij wordt het beeldscherm uitgeschakeld. Bij G=0 gebeurt dit niet alleen is hierbij dan maar een tempo mogelijk. De S>1}ound-data moeten ingeven worden op Soundsampler formaat van de Atari magazins. Hierbij is een byte in 4 bits opgedeeld, die i>2}eder een sound-waarde (0 tot 15) inhouden.MOUSE@ geeft de positie van een in poort 2 aangesloten ST muis in de opslag >3} plaatsen MOUSEX(178) en MOUSEY(179 ). De muis wordt zo lang opgevraagd tot zijn linker knop ingedrukt wordt. Door het ing>4}even van de waarden 178 en 179 laat de muis zich ook zetten. De muis-wijzer moet gescheiden ingesteld worden met behulp van h>5}et player-bevel, bijvoorbeeld in VBI.DATA(ADR) [ 1,4,876,4563,34,..... ]schrijft de data van positie ADR (adr>6}es) in de geheugenplaats.POKE(A,B) schrijft de waarde van A in opslag plaats B.PEEK(A,B) schrijft de inhoud van opsla>7}gplaats A (8-bit) in variabele B.DPEEK,DPOKE hierin gebeurt hetzelfde als in POKE en PEEK, echter in 16 bit.BMOVE(Q,Z>8},L)@ copiert een opslagbereik vanaf adres Q met de lengte L naar het adres Z (tot Z+L-1). Overlopende blokke>9}n worden probleemloos overgezet.FMOVE(Q,Z,L)@ zoals BMOVE, nu moet echter L kleiner zijn als 256. Eventuele overlappend>:}e blokken worden niet op de juiste wijze gecopieerd. Dit bevel is sneller als MOVE.CALL(A, X,Y,ADR)@ roept een machinetaa>;}l programma aan vanaf ADR (adres). De library moet met RTS eindigen.INLINE [ 168,45,141,A1... ]schrijft de dat><}a tussen de aanhalingstekens direct naar het programma. Hier zijn variabelen ook te gebruiken, waarbij hun adres ingegeven w>=}ordt. Dit bevel dient om eenvoudig korte machinetaal programma's in te weven, in het bijzonder voor DLI's.REGX(Z)REGY(Z)R>>}EGA(Z)REGP(Z) deze bevelen geven X en Y over aan variabele Z vanuit hun accumelator VOORZICHTIG ! REGP veranderd de >?} accumelator. Volgende is fout: REGP(VAR1) REGA(VAR2) Zo moet het wel: REGA(VAR2) REGP(VAR1)PROCADR(lib>@}rarynaam) na de oproep ontvangen de opslagplaatsen $D0 en $D1 het adres van desbetreffende library.ADD(A,B,C) betekent>A} C=A+B, overlopen wordt nergens gecontroleerd.A+ verhoogd de 8-bit variabel A met 1SUB(A,B,C) betekent C=A-BA- v>B}erlaagt de 8-bit variabel A met 1MULT(A,B,C)@ betekent C=A*BDIV(A,B,C)@ betekent C=A/BAND(A,B,C) C=A AND B (bitsg>C}ewijs).OR(A,B,C) en EOR(A,B,C) zelfde functie als in basic.ASLW(A) schuift de inhoud van variabel A (16-bits) een bi>D}t naar links.ASLB(A) schuift de inhoud van variabel A (8-bits) een bit naar links.ASRW(A) schuift de inhoud van var>E}iabel A (16-bits) een bit voorwaards.ASRB(A) schuift de inhoud van variabel A (8-bits) een bit voorwaards.LSRW(A) >F} schuift de inhoud van variabel A (16-bits) een bit naar rechts zonder te letten op reeds geplaatste tekens.LSRB(A) sch>G}uift de inhoud van variabel A (8-bits) een bit naar rechts zonder te letten op reeds geplaatste tekens. EXTRA>H}'S =======In de tekst van de editor laten labels zich ook plaatsen. Een label bestaat uit een - (min) teken en>I} een getal van 0 tot 384, bijvoorbeeld:-10De labels kunnen dan met JUMP aangeroepen worden, bijvoorbeeld:JUMP(10)Eleg>J}anter en gestructureerder kan het met het volgende bevel: IF vergelijk( ELSE ...) ENDIF REPEAT ... UNTIL v>K}ergelijkenWHILE vergelijk...WENDEen vergelijk is hierbij een uitdrukking van de vorm WAARDE OPERATOR WAARDE, bijvoor>L}beeld:A>CD>=65<=100G<>9A=MJ5A=B-CBij WHILE...WEND gaat het om een ontkennend>M}e zinssnede. In het begin wordt de uitkomst gecontroleerd. In het geval dat deze niet klopt, volgt gelijk een sprong naar de >N}eerstvolgende opdracht achter WEND. Dit gaat net zo lang door tot de uitkomst niet waar is.Nu komen we bij iets bijzonders.>O} In Quick kan men een normale library als DLI of VBI toepassen. Dit moet men dan met het bevel INTER (in plaats van PROC) beg>P}innen en met ENDDLI of ENDVBI eindigen. Ingeschakeld wordt de VBI met het bevel VBI(librarynaam) , de DLI met DLI(librarynaam>Q}). Bij DLI moet men zelf alle CPU registers aan- en uitzetten. Hiervoor zijn de bevelen PUSH en PULL. Ook hierbij weer een vo>R}orbeeld:MAIN...VBI(INTERRUPT)DLI(KLEUREN)...ENDMAININTER INTERRUPT...BEGIN...ENDVBIINTER KLEUREN...BEGIN>S}PUSH...PULLENDDLIOp deze wijze heeft U alleen op de interne registers ingegrepen. Ingeval U met een @ aangeduide routin>T}es in interrupts gaat gebruiken, moet U ook interne variabelen in de compiler veranderen, dit gaat zo:IPUSHZPUSH...IPULL>U}ZPULLIPUSH is bij de meeste vergelijkingen en bij @ routines noodzakelijk. ZPUSH wordt bij PEEK en POKE of @ routines gebr>V}uikt. Een uitzondering hierop is PLAYER en CLR. Her heeft men geen IPUSH en ZPUSH nodig, daar in Interrupt andere compiler-in>W}terne variabelen toegepast worden.Bij Interrupt library's kunt U alleen LOCAL (en globale) variabelen toepassen, echter gee>X}n IN en OUT variabelen. FOUTMELDINGEN COMPILER ======================De compiler vertoond bij het vert>Y}alen een rij van foutmeldingen. Deze gelden meestal niet voor een regel en tonen meestal niet altijd de juiste regel aan.He>Z}t lopende machine-taal programma toont zelf geen foutmeldingen, echter kan natuurlijk wel vastlopen, etc.Onderstaand de fou>[}tmeldingen. Aangegeven zijn deze in HEX.1 : [ wordt gemist.2 : naam bij PROC wordt gemist.3 : MAIN tweemaal toegepa>\}st. In een Quick-programma mag maar een hoofdprogramma toegepast worden.4 : geen MAIN of PROC voor MAIN. Volgord>]}e van hoofd- en bijprogramma's moet aangehouden worden.5 : onbekend.6 : niet geldige waarde.7 : onbekende variabele.>^} Variabele niet gedeclareerd.8 : ongeldige waardetoewijzing. Foutief variabel-type. Voorbeeld: tekst toe>_}gewezen aan variabel.9 : getal te groot.A : lengte-opgaven van array-verklaring ontbreekt. Elke Array kan 1 tot 2>`}55 lang zijn.B : lengte-opgave van Array te groot (groter dan 255).C : ongeldige waarde als index. Verkeerd variabe>a}l-type als index of verkeerde waarde.D : onbekend onderprogramma. Er wordt een onderprogramma aangeroepen dat niet gedef>b}inieert is. Misschien ontbreekt ook/of het INCLUDE bevel.E : te weinig parameters opgegeven bij aanroep van onderprogramm>c}a. Er moeten altijd net zo veel IN en OUT variabelen opgegeven worden als dat in onderprogramma aanwezig is.F : interne fo>d}ut.11 : ARRAY met index hier niet toegestaan. Alleen BYTE of WOORD variabelen toepassen.12 : geen index toegestaan. Arr>e}ay zonder index toepassen.13 : fout bij INCLUDE opdracht. File kan niet geladen worden.14 : parameter ontbreekt. Verkeer>f}d beveloproep.15 : ) wordt gemist.16 : alleen byte toegestaan.17 : ( wordt gemist.18 : alleen BYTE of WOORD toegesta>g}an19 : operator ontbreekt. Vergelijk heeft niet de juiste Syntax.1A : onbekend.1B : verkeerde inlussing.1C : IF, REP>h}EAT of WHILE ontbreekt. ENDIF, UNTIL of WEND gevonden, zonder bijbehorende vooropdracht.1D : tekst kan niet geladen worden>i}. Verkeerde filenaam opgegeven bij de compiler.1E : verkeerd adres opgegeven bij DATA, geen variabel als adres toepassen.>j}1F : label-nummer ongeldig. Waarde te groot of negatief.20 : gecompileerde programma te lang.21 : te veel variabelen.22>k} : te veel onderprogramma's.23 : te veel onderprogramma's aanroepen of label-sprongen.24 : te veel Include file's.25 :>l} BEGIN ontbreekt, Begin moet na de variabelen verklaring in onderprogramma staan.26 : verkeerd type variabel. Bij bevelaanr>m}oep verkeerd type variabel toegepast als parameter.27 : ENDIF, UNTIL of WHILE ontbreekt . Deze fout treed op aan het einde >n}van een programmadeel (ENDMAIN, ENDPROC, ...). Kijk het desbetreffende programma na of de lussen op de juiste wijze geplaatst>o} zijn. --- einde hoofdstuk 2 --- ssen op de juiste wijze geplaatst<\  FF                    Bq}                          Br}        --- HOOFDSTUK 3 --- ===========Nadat we in de vorige 2 hoofdstuBs}kken de theoretische gedeeltes van Quick bekeken hebben, gaan we ons nu bezig houden met het praktische gedeelte.Na het opBBt}OOTen van de diskette bevindt U zich in SHELL. Hierna wordt meteen automatisch de Compiler en Editor geladen. Als dit gebeurtBu} is kunt U de systeem diskette uit de diskdrive nemen en Uw werkdisk plaatsen, waar U Uw Quick teksten wilt opslaan. Daar de Bv}Compiler bij zijn werk de file RUNTIME.OBJ nodig heeft, is het verstandig deze over te copieren naar Uw werkdiskette. Wie 2 dBw}iskdrives heeft kan zich dit besparen door de systeemdiskette in drive 1 en de werkdiskette in drive 2 te plaatsen. Bx} TIPS & HINTS ============Nu kunt U echt beginnen met het programmeren. Om deze taak enigszins gemakkelijker tBy}e maken hebben wij nog enige tips voor U;Snelheidsbevordering--------------------Zoals in elke programmeertaal is het ookBz} mogelijk voor Quick om voor elk probleem een oplossing te vinden. Vaak gaat het sneller als men niet het moeilijke Quick-bevB{}el gebruikt. Wilt U bijvoorbeeld in een Interrupt de resonantie van een kleurenregister veranderen, dan is het niet verstandiB|}g om het SETCOL commando te gebruiken. Hierbij moet namelijk de kleur met 16 vermenigvuldigd worden en toegeschreven worden aB}}an de resonantie. Men komt eerder bij zijn doel, als men een Quick-variabel op het adres van de kleurenregister legt en deze B~}dan direct aanspreekt. Hiervoor een voorbeeld:langzaam:BYTE[H]...REPEAT H+ SETCOL(0,0,H)UNTIL H=15snel:BYTEB}[H=708]...REPEAT H+UNTIL H=15Zoals U ziet wordt altijd het INC bevel (+) toegepast. Dit gaat wezenlijk veel snellerB} dan met het ADD commando, het is echter alleen maar toegestaan bij de BYTE variabelen.Vaak is het nodig, BYTE variabelen sB}amen op een uitgangswaarde te plaatsen. Dit laat zich met de REGA - aanduiding bijzonder snel verwerken:langzaam:A=0B=0B}C=0sneller:A=0REGA(B)REGA(C) GEHEUGEN OPBOUW ===============Vaak is het belangrijk om te weten,B} waar in het geheugen nog plaats is voor Player, Beeldscherm, etcetera. Het hieronder afgebeelde geheugenblok geldt voor het B}moment na het compileren van een tekst:1c70-1eff Shell1f00-41ff Compiler4200-4fff Runtime5000-xxxx programmavrijb0B}00-bfff variabelenc000-c7ff editor gedeelteo.s.e000-ffff editor deel 2Normaal gesproken is er dus plaats vanaf het prB}ogrammaeide tot AFFF, om data in het geheugen te schrijven. Om in de gaten te houden, dat het beeldscherm vanaf AFFF opgebouwB}d wordt, als U OPEN gebruikt. Als U zich hieraan houd, kunt U het programma opdragen bij een eventuele RESET terug te springeB}n naar Shell.Natuurlijk kunt U ook het geheugenbereik van de Compiler gebruiken. Dit betekent echter dat U de systeem diskeB}tte na iedere start van een programma opnieuw BOOTen moet. Het Runtime gedeelte mag echter niet overschreven worden.Hoe weeB}t men echter dat het gecompileerde programma aan zijn eide is? Het adres van de eerste vrije bytes wordt getoond na het compiB}leren. Het is echter ook mogelijk om deze op te vragen in het lopende Quick programma; in de geheugen adressen 4FFE en 4FFF sB}taat de desbetreffende waarde.WOORD[VRIJ=20478]...?("Eerste vrije Byte",VRIJ) EIGEN LEVEN VAN COMPILER B}========================De Compiler zet zelf enige systeem variabelen op vastgestelde waarden (linker rand op 0, kleuren, B}etcetera)Als U Uw programma met RUN vanuit de Compiler start, worden deze waarden natuurlijk overgenomen. Daarentegen geldenB} ze natuurlijk niet, als U Uw programma SAVEd en dan vanuit DOS opstart. Uw programma ziet er dan vaak heel anders uit. B}ASSEMBLER LIJKENDE PROGRAMMERING (alleen voor gevorderden) ================================Het INLINE bevel bied B}in Quick de mogelijkheid, direct in het compileer proces in te grijpen. Hier wordt de data in het INLINE blok direct in het pB}rogramma ingevoegd. Dit betekent natuurlijk dat de waarden een uitvoerbaar machinetaal programma inhouden of dat dit commandoB} met een JUMP oversprongen wordt. INLINE is bijvoorbeeld zeer bruikbaar bij tijd-kritische programmadelen, daar men dan met zB}ijn hulp kleine machinetaal programma invoegen. Hiervoor een voorbeeld:Verzwijging zonder IFBYTE BYTEB}[ [WAARDE WAARDE] LDA=173... BEQ=240IFWAARDE=5 CMP=224 B} ?("Het was 5") ]ENDIF ... INLINE [ LDA,WAARDE,CMP,5, B} BEQ,3 ] JUMP(1) ;JUMP()belegd 3 Bytes B} ?("Het was 5") -1Zoals reeds vermeld, wordt in het INLINE bevel het adB}res van een variabel ingezet. Ligt deze onder 256, wordt er maar 1 byte ingezet, anders 2. Hiermee is het mogelijk, AssemblerB}-commando's te definieren. Wordt de variabele CMP op het adres 224 geplaatst, dan wordt in het INLINE bevel 224 op de plaats B}van de variabelen gezet.. Men moet deze variabelen echter geen waarde toekennen, daar deze alleen maar plaatshouders voor getB}allen zijn. In deze geheugenplaats liggen namelijk vele systeem variabelen. INTERRUPTS ==========VB}oor alle basic programmeurs, die zich voorheen nog niet met Interrupts bezig gehouden hebben, hier nog enige basis informatieB}: Een Interrupt is een klein machinetaal/Quick programma, dat in regelmatige afstanden opgevraagd wordt. In Quick zijn er 2 vB}erschillende Interrupts;VBIDeze Interrupt wordt iedere 1/50 seconde opgeroepen (niet gedurende I/O operaties). Het mag onB}geveer 24.000 machinetaal-regels lang zijn, dit betekent niet de hele 1/50 seconde, anders wordt deze weer aangeroepen. De VBB}I wordt ondermeer toegepast voor Players, het spelen van muziek, om een muis-wijzer te plaatsen, enzovoorts.DLIDe DisplayB}-List Interrupt wordt vanuit de Grafiek chip opgelost, als hij in de Displaylist een bevel >127 tegenkomt. Het is dus niet vB}oldoende, om de DLI in Quick in te schakelen, er moet ook een bijbehorend commando in de Displaylist aangebracht worden. De DB}LI moet maar weinig bevelen lang zijn (minder als 4500 machinetaal regels). Het is theoretisch ook mogelijk om meerdere DLI'sB} te gebruiken.Deze vertaling werd U aangeboden door:P. de LaatUdenHet is theoretisch ook mogelijk om meerdere DLI's@L77pA`78<<  B JKIHiDiELV`L8F} 8 BLV`Lx8t8l Lu8hihiHHȱȱL8c !#3`Lu8JJF}JJ`H 8h`Hȩh Q8L8 Z8L8 8L8 8L8 8L8S:@9E:E9H '9 H9F}I9 8 '9h)0IC9D9L8 L :::: :Lr:::IEL[::i:iIILF}[:`:i::i::L:`L{:w:w: C`L:L: D8:MEM.SAV: 8| 9 '9`L:L: D:DUF}P.SYS:̩ 8 x:ɀL: '9`88 |9Y:X: '9L); D8:DUP.SYS; 8::88 9 F}'98? :`;WL`; 9Ln; ` :Y;Y;L;L;)} Setting Up ATARI 130XE Ram Disk; 9L; F}; -9   L;D8:; :9 :Y;L