8(ACOMBAT.COMAT.COM0145 F c}E© q0 \C)CC8`DCeECiD` RP h1$E ȍ @y b Y)hܭ]L]` q  DMD   u j)`0  ,p0i2 &28jJ1f02 9 g iJf0i1)xԍӭ232002ARRAYS.KRS************************************** ** *}* >>> A R R A Y S <<< ** ** (Felder,Strings u.s.w.) ** } ** (c) 1987 by Action! User Group ** ***********************}***************Arrays, das sind Datenfelder, also Variablen mit mehreren Elementen.Daskoennen Zahlenfelder oder aber au}chZeichenketten (Strings) sein.Die Array muessen aehnlich wie dienormalen Variablen am Anfang des Programms oder nach ei }nem 'MODULE'Befehl definiert werden. Natuerlichkoennen die Arrays auch lokale Var-iablen oder Parameter sein. Doch dazusp }aeter.Aus den vorangegangenen Kapiteln kennen wie ja bereits die Definitions-art fuer Variablen. In Action! mussnach }dem Variablentypen (Byte,Card u.s.w...) 'Array' stehen:z.B.:BYTE ARRAY FELD,CARD ARRAY CFELD(20),BYTE ARRAY FELD=$500 }0,BYTE ARRAY FELD="STRING KONSTANTE",BYTE ARRAY FELD=[ 1 2 3]Nun gut...die Erklaerungen folgen ja:BYTE ARRAY FELD Mit } dieser Definition wird nun das Array 'FELD' vereinbart. Das merk- wuerdige daran ist sicherlich, dass eskeinerlei Hinwe}ise auf die Laenge desFeldes gibt. Aber das ist in Action!moeglich, falls man nicht genau weiss,wie gross ein Feld sein so}ll. Aller- dings sollte man diese Methode nicht waehlen. Aber in den meisten Faellenist ja sowieso klar, wie gross ein F}eld sein soll. Zu den Spezialfaellenkommen wir gleich...Bevor wir weitermachen, noch etwas zurinternen Darstellung der Fe}lder:Im Beispiel oben haben wir 'FELD' alsNamen fuer das Array. Wir koennen 'FELD' aber auch als normale Variablebenutzen}. In ihr steht naemlich dieStartaddresse des Arrays. Es ist klar,dass dies eine CARD Variable sein muss Um die Startadr}esse eines Feldes fest-zustellen, koennte man folgendes schreiben:BYTE ARRAY FELD(20)PROC MK_DEMO1() PUTE() PRINTE(}"Startadresse von 'FELD'") PRINTCE(FELD)RETURN In dem Beispiel steht schon die naechste Definietionsa}rt: Felder mitbestimmter Laenge. Im Beispiel wurdeFeld auf maximal 20 Elemente ausgelegt.Dazu noch ein Hinweis: Ist die m}ax-imale Feldgroesse KLEINER 256, dann benutzt der Action! Compiler bei jedemZugriff auf das Array die schnelleindiziert }indizierte Addressierungs-art des 6502 Prozessors: (z.B.: LDA (203),y)Das ist natuerlich platzsparender undwesentl}ich schneller. Anderenfallswerden die einzelnen Elemente eben alle normal berechnet, was aber auchnicht tragischer ist.W}ie man auf die einzelnen Elementeeines Arrays zugreift ist genauso ein-fach wie in Basic oder anderen Pro-grammiersprachen} wie Pascal o.aeh.Natierlichen mit Klammern hinter demFeldnamen:A=FELD(10)... schreibt das 10. Elementvon 'FELD' nach '}A'.Dazu noch ein simples Beispiel:BYTE ARRAY FELD(20)PROC MK_DEMO2()BYTE A,I FOR I=1 TO 20 DO FELD(I)=I ; FE}LD MIT ZAHLEN VON OD ; 1 BIS 20... I=20 DO A=FELD(I) ; UND RUECKWAERTS PRINTBE(A) ; WIEDER AUSGEBE}N I==-1 UNTIL I=0 ODRETURNIm obigen Beispiel bestand das Arrayaus BYTE Zahlen. Diese BYTE Arrayskann man aber auch }als Zeichenketten(Strings) verwenden:BYTE ARRAY FELD(30)PROC MK_DEMO3()PRINTE("GEBE DEINEN NAMEN EIN")INPUTS(FELD) ;} EINGEGEBENEN TEXT IN ; IN FELD SPEICHERNPRINT("Hallo ")PRINTE(FELD)RETURNNatuerlich kann man auch hier w }iederauf einzelne Elemente zugreifen. Bei 'STRINGS' sei aber noch gesagt, dassElement #0 immer die Laenge desStrings bein!}haltet. Bei allen anderenArrays kann Element #0 ganz normalbenutzt werden.Die naechste Array-art:BYTE ARRAY FELD=$5000 "}Hier wird das Array auf Adresse $5000gesetzt. Element #0 ist also in Adresse $5000. Natuerlich kann man auch hier die ma#}ximale Laenge def-inieren:BYTE ARRAY FELD(20)=$5000 Das man die Arrays auf bestimmte Speicheraddressen sezten kann, er- $}moeglicht natuerlich wieder eine ganzeReihe von Anwendungen. Wie man ja wissen sollte, kann man normale Var-iablen auch a%}uf bestimmte Speichenaddressen setzen. z.B:BYTE COLOR2=710Schreibt mann unter dieser Verein-barung irgendwo im Programm:&}COLOR2=0, so wird Speicheradresse 710gleich 0(In Graphics 2 Modus wird derHintergrund dann schwarz.)Definieren wir aber '}z.B. ein Arraywie diesen hier:BYTE ARRAY FARBEN(0)=708 so koennen wir alle Farben auf ein-fachste Weise setzen(SETCOLOR(} oderPOKE Routine ist langsamer, kostetmehr Speicherplatz und ist sowieso in einem Action! Programm uner-wuenscht!!!)Da)}zu ein Beispiel:BYTE ARRAY FARBEN(0)=708PROC MK_DEMO4()GRAPHICS(0)FARBEN(2)=0FARBEN(1)=15RETURNEs geht weiter mit *}: ARRAYS2.KRSY FARBEN(0)=708PROC MK_DEMO4()GRAPHICS(0)FARBEN(2)=0FARBEN(1)=15RETURNEs geht weiter mit ARRAYS2.KRS************************************** ** *,}* >>> A R R A Y S <<< ** ** *** T E I L II *** ** -} ** (c) 1987 by Action! User Group ** **********************.}****************String-Konstanten:Dazu gleich ein Beispiel:BYTE ARRAY FELD="STRING KONSTANTE"PROC MK_DEMO5() PRINTE(/}FELD)RETURNDie String-Konstanten kann man auch einfach mit anderen Arrays gleich- setzten: Dazu wieder ein Beispiel:B0}YTE ARRAY FELD="STRING KONSTANTE", FELD2PROC MK_DEMO5() FELD2=FELD PRINTE(FELD) PRINTE(FELD2)RETURNMan ka1}nn ein Feld auch gleich bei derDefinition mit Werten fuellen:BYTE ARRAY FELD=[1 2 3]BYTE ARRAY FELD=['A 'B 'C]Zwischen 2}jedem Element muss jeweilsein Leerzeichen stehen.Um nun die Arrays als Parameter ueber-geben zu koennen, muessen wir uns 3}zu-naechst um die "POINTER" (Zeiger)kuemmern. Aber die folgen im naechstenTeil: POINTER.KRS muessen wir uns lPOINTER.KRS************************************** ** *5}* >>> P O I N T E R <<< ** ** ** (c) 1986}7 by Action! User Group ** **************************************Der Pointer ist wi7}ederum ein neuer Variablentyp. Mit ihm ist es moeglich,auf andere Varaiablen,also Speicher-plaetze zu 'zeigen' und zu vera8}endern.Die POINTER werden ebenfalls wie Var-iablen definiert, nur mit dem ZusatzPOINTER. Es gibt sie auch als ver-schiede9}nen Arten:z.B.:BYTE POINTER ZEIGERCARD POINTER ZEIGERINT POINTER ZEIGERoder man kann die POINTER auch aufbesimmte Ad:}dressen setzen:CARD POINTER = 88 Doch dazu spaeter mehr.Jetzt wieder ein Beispiel:BYTE POINTER COLORPROC MK_DEMO9(;}) COLOR=710 ; DEN POINTER AUF ADD- ; RESSE 710 SETZEN COLOR^=0 ; ADDRESSE, AUF DIE DER ; P<}OINTER ZEIGT(710) AUF ; 0 SETZTEN PRINT("POINTER ZEIGT AUF ADR ") PRINTCE(COLOR) PRINT("ADR AUF DIE POINTER=} ZEIGT IST ") PRINTBE(COLOR^) COLOR==-1 ; POINTER AUF EINE ADD- ; RESSE NIEDRIGER SETZEN ; (7>}09) COLOR^=15 ; UND 709 AUF 15 SETZEN PRINT("POINTER ZEIGT AUF ADR ") PRINTCE(COLOR) PRINT("ADR AUF DIE POINTER ZEI?}GT IST ") PRINTBE(COLOR^)RETURNAus dem obigen Beispiel sehen wir,dassZur Veraenderung der Speicherzelle,auf die ein P@}OINTER zeigt, das '^' Zeichen notwendig ist.Aus dem Beispiel sollte auch ersicht-lich werden, wie die Pointer ver- aenA}dert werden koennen.Die POINTER haben meistens die Auf-gabe, Speicherzellen, auf die siezeigen, zu veraendern. In Basic gB}e-schieht dies mit dem 'POKE' Befehl.Obwohl es in Action! auch eine 'POKE'Prozedur gibt, ist immer elegantermit POINTERN C}zu arbeiten, da diesegegenueber dem Aufruf einer 'POKE'Prozedur schneller arbeiten.Die BYTE POINTER koennen immer nurEIND} Byte veraendern, auf das sie zeigen. Die BYTE POINTER selber abersind natuerlich in ZWEI BYTE abgelegt,um auf die AddressE}en von 0 bis $FFFFzeigen zu koennen.Nun noch ein Beispiel fuer CARDPOINTERCARD POINTER SCREEN=88PROC MK_DEMO10()BYTEF} POINTER SCREENSTART PRINT("SCREEN ZEIGT AUF ADR. ")PRINTCE(SCREEN^)SCREENSTART=SCREEN^+40*10 SCREENSTART^='aREG}TURNIm Beispiel wird der CARD POINTER auf Addresse 88/89 gelegt. In MK_DEMO10() wird nach der Ausgabeder lokale POINTER H}SCREENSTART aufdie Addresse gelegt, auf die SCREENzeigt(in diesem Fall auf die Start-addresse des Bildschirms, die jain 8I}8/89 festgehalten wird.Aber dazu wird noch der Wert '40*10'hinzuaddiert, um das folgende 'a' indie 10. Zeile zu setzen( eiJ}ne Zeilein GRAPHICS 0 benoetigt 40 Byte)-------------------------------------Nun kommt aber endlich die Verwendungder PK}OINTER fuer Parameter-Zeichen-ketten:Der Arrayname als Variablenname zeigtimmer auf das Element #0. Die einzelnen ElemenL}te kann man dann immerdazuaddieren. Wenn wir das wissen, soist es auch einfach zu verstehen, dasswir nicht alle Elemente dM}es Arrays alsParameter uebergeben muessen, sonderneigentlich nur dessen Startaddresse.Un dafuer bieten sich dann die POINTN}ERganz gut an... Doch erstmal wieder einBeispiel: BYTE ARRAY FILE(30)PROC READFILE(BYTE POINTER DATEI) BYTE A CLOSE(O}2) OPEN(2,DATEI,4,0) DO A=GETD(2) PUT(A) UNTIL EOF(2)=136 ODRETURNPROC MK_DEMO11() PUT(125) PRINTE("GEBE FILESPEP}C EIN") INPUTMD(0,FILE,20) READFILE(FILE)RETURNDieses Programm fragt zunaechst nach dem FILESPEC(also mit GeraetenamenQ} undso...), dann ruft es die PROC READFILEmit dem FILESPEC als Parameter auf.In READFILE wird das File dann Byte-weise geR}lesen und auf dem Bildschirmmit 'PUT' ausgegeben, bis die EOFVariable auf 136 ist (End of File)'EOF' ist uebrigens eine eiS}gene Action!Variable. In Klammern dahinter muss nur die Kanalnummer stehen, die ab-gefragt werden soll. Der Kurs geht weT}iter mit: BEF2.KRSdem 2. Teil der 'eingebauten' PROCsstehen, die ab-gefragt werden soll. Der Kurs geht weFBEF2.KRS************************************** ** >> B E F E H L E << ** V} ** Teil 2... ** ** (c) 1987 b W}y Action! User Group ** **************************************BYTE FUNC GETD ----- X}---------GETD ist eine Funktion und liest einDatenbyte vom angegebenem Kanal.Syntax: A=GETD(7)(A muss BYTE Variable se Y}in)liesst hier ein Byte von Kanal #7,also dem Kanal fuer die Tastatur,falls der Action! Compiler aktiv ist.CLOSE----- Z}zum Schliessen von KanaelenSyntax : CLOSE(kanal)OPEN----zum Oeffnen der IOCB Kanaele.Syntax: OPEN (KANAL,STRING,A [}UX1,AUX2)also z.B: OPEN (3,"D:FILE.*,4,0,) oder: OPEN (3,"P:",8,0) oder: OPEN (3,file,4,0) wenn 'fi \}le' ein Bytearray ist oder auf eine String- konstante zeigt.fuer KANAL kann man eine Kanalnummervon 0- ]}7 einsetzen(Achtung: Kanal 0/6/7werden meistens vom System benutzt!!!)Falls die Kanaele vor dem OPEN nochoffen sind ,muess ^}en sie vorher mit CLOSE geschlossen werden.Fuer AUX1 koennen folgende Werte ein-gesetzt werden oder auch BYTE Var-iablen, _} die diese Werte haben: 4 : NUR lesen 6 : Directory lesen 8 : NUR Schreiben / Auch fuer Druckerausgabe >> 9 und 1 `}2 NUR fuer Files: 9 : Schreiben/ ,aber an das be- stehende File anfuegen 12: Lesen und Schreiben (hier mit NOTE a} und POINT PROCs arbeiten AUX2 ist vom jeweiligen Geraet ab- haengig. Beim Diskettenlaufwerk 0 Beim Screen ("S:") ist es b}die Graphicstufe(geht aber besser ueber die GRAPHICS Proc. Beim Cassettenrecorder ("C:") be- stimmt es die Pause zwis c}chen den Bloecken: 0=lange Pausen, 128=kurze Pausen(fast Mode wie bei CSAVE) Beim Drucker 820 von Atari ist 0 normal(wie d}auch bei den meisten anderen Druckern) und 83 ergibt liegende Zeichen.XIO---zum Aufrufen verschiedener OS-Routinen e}Syntax:XIO(KANAL,0,KOMMANDO,AUX1,AUX2,string)Man beachte , dass der 2.Parameter 0sein muss.z.B.:XIO(2,0,254,0,0,"D:" f})formatiert die Diskette in LW#1 !!! KOMMANDO kann (wie auch AUX1/AUX2)entweder ein fester Wert, als natuer-lich auch e g}ine BYTE Variable sein.Hier die Werte fuer KOMMANDO: zuerst die ,die andere PROCs schon sind: h} 3: Kanal oeffnen OPEN 5: Zeile einlesen INPUTSD 7: Zeichen lesen GETD 9 i}: Zeile ausgeben PRINTD11: Zeichen ausgeben PUTD12: Kanal schliessen CLOSEnun Diskettenorientierte j} Funktionen:32: Rename :Files umbenennen dann STRING z.B.: "D:OLDNAME.EXT,NEWNAME.EXT"33: Delete :Fil k}es loeschen35: Protect :Files sichern36: Unprotect :File entsichern37: Point38: Note254: FormatierenNOTE & POINT- l}-----------NUR mit Diskette:Mit diesen PROCs koennen Sector und BYTE innerhalb des Sectors ,aber nurinnerhalb eines File m}s gelesen und be-stimmt werden Syntax: NOTE(KANAL,SECTOR,SECTORBYTE) ^ ^ n}CARD BYTE POINTERMit NOTE kann die Sectornummer und dasByte im Sector, auf dem sich der Sch o}reib/Lesekopf der Diskettenstationgerade befindet gelesen werden. Normalerweise wuerde dies ja ueber eine FUNCtion gehen, p}aber es werden3 Bytes benoetigt: Eine CARD fuer denSector und ein BYTE fuer das BYTE imSector. Deshalb muss NOTE eine PROC q}sein und die Variablen, in denen nachAufruf von NOTE die Sectornummer/Bytestehen soll muessen POINTER sein. Daswird aber r}auch aus der Demo er-sichtlich. Syntax bei POINT: POINT (KANAL,SECTOR,SECTORBYTE) Hier duerfen SECTOR bzw. SECTO s}RBYTEkeine POINTER sein, da diese ja nurzur Angabe des Sectors dienenAber nun zum Demoprogramm ,aus demalles ersichtlich t} sein sollte:; note & point demoCARD POINTER SECTORBYTE POINTER SECTORBYTECARD STARTSECTORBYTE STARTBYTE,CONSOLE=5327 u}9PROC NOTEDEMO()BYTE AGRAPHICS(0)PRINTE("Dieses Programm zeigt, welche") PRINTE("Sectoren ein File belegt")PUTE()PRI v}NTE("Um auf den Anfang des Files zu")PRINTE("'zeigen' (POINTen) >START< Taste")PUTE()PRINTE("Irgend eine Taste zum Start") w}A=GETD(7)CLOSE(2)OPEN(2,"D:*.*",4,0) ; IRGENDEINFILE ; OEFFNEN NOTE(2,SECTOR,SECTORBYTE) STARTSE x}CTOR=SECTOR^ STARTBYTE=SECTORBYTE^DO A=GETD(2) NOTE(2,SECTOR,SECTORBYTE)print("Sector : ") printc(sector^)print(" un y}d Byte ") printb(Sectorbyte^)print(" inhalt ") printbe(A) IF CONSOLE=6 THEN ; WENN STARTTASTE POINT z}(2,STARTSECTOR,STARTBYTE)FIuntil EOF(2)=136 ; bis File zuendeodreturn-----------------------------------Es geht wei {}ter mit : BEF3.KRSl EOF(2)=136 ; bis File zuendeodreturn-----------------------------------Es geht wei "BEF3.KRS************************************** ** ** }} B E F E H L E ** ** Teil 3 ** ~} ** (C) 1987 by Action! User Group ** *************************}*************GRAPHICS--------Syntax : GRAPHICS(MODE)MODE ist ein BYTE Die Graphicmodi sind denen in Basicidentisch.} SETCOLOR--------Syntax :SETCOLOR(FARBREGISTER,FARBE,HELLIGKEIT) alle Parameter :BYTEwie Basic SetcolorCOLOR}-----Syntax COLOR=BYTE Wertwie Basic. In Action! ist 'COLOR' eineBYTE Variable. Also muss sie auch wieeine behandelt we}rden. In den Textmodi ist COLOR dann der ASCII Wert.Der Wert in COLOR bezieht sich immer auf PLOT,DRAWTO u.s.w.PLOT--}--Syntax : PLOT(X,Y)X ist CARD (wegen Graphics 8) und Y ist BYTE.wie in Basic zum Setzen von Punkten.DRAWTO------}Syntax : DRAWTO(X,Y)X ist CARD (wegen Graphics 8) und Y ist BYTE.wie in Basic zum Linien ziehen. DerAusgangspunkt wird i}mmer mit PLOT oderPOSITION gesetzt und wird mit DRAWTOdie Linie gezogen.POSITION--------Syntax : POSITION(X,Y)X ist} CARD (wegen Graphics 8) und Y ist BYTE.wie in Basic zum Positionieren des Cursors entweder im Editor(Graphics 0)oder im }Graphicscreen.BYTE FUNC LOCATE----------------Syntax : A=LOCATE(X,Y)X ist CARD (wegen Graphics 8) und Y ist BYTE.wi}e in Basic zum Feststellen der Farbeoder des ASCII Zeichens an der ange-gebenen Position.A muss BYTE Zahl sein. In ihr st}ehtdann das Ergebnis.Die folgenden Functionen ergeben alleeine BYTE Zahl. Sie benoetigen auch all BYTE Zahlen als Param}eter:BYTE FUNC PADDLE----------------Syntax: A=PADDLE(BYTE 0-7)wie Basic zum Festellen der Positioneines der 8( bei }XL/XE 4) moeglichenPaddles.BYTE FUNC PTRIG---------------Syntax: A=PTRIG(BYTE 0-7)wie Basic zum Festellen, ob der Kno}pfdes Paddles gedrueckt wird.(0=gedrueckt / andere Werte= nicht gedrueckt)BYTE FUNC STICK---------------Syntax: A=ST}ICK(BYTE 0-3)wie in Basic zum Festellen der9 Richtungen des JoysticksEs ergeben sich folgende Werte in denverschiedenen }Stellungen des Joysticks 14 10 | 6 \ | / \ / 11--15--7 } /|\ / | \ 9 13 5 BYTE FUNC STRIG---------------Syntax: A=STIRG(BYTE 0-3)wie Basic z}um Festellen, ob der Knopfdes Joysticks gedrueckt wird.(0= gedrueckt / 1= nicht gedrueckt)SOUND-----Syntax: SOUND}(KANAL,TON,VERZERRUNG,LAUTST)wie Basic zum Ansteuern der Tongener-atoren. Alle Parameter sind BYTE WerteBei KANAL sind }Werte von 0-3 moeglichBei TON sind Werte von 0-255 moeglichBei VERZERRUNG sind Werte von 0-15moeglichBei LAUTST sind Wert}e von 0-255 moeg-lichAchtung: Wenn Tonkanal 2/3 benutzt werden sollen, dann muss vorher nochder PokeyChip initialisiert }werden.Man schreibt z.B.: PROC POKEY_INIT=$E468() RETURNIm Programm muss diese Routine dannnur einmal angesprungen wo}; note & point demoCARD POINTER SECTORCARD STARTSECTORBYTE POINTER SECTORBYTEBYTE STARTBYTE,CONSOLE=53279PROC NOTEDEMO}()BYTE AGRAPHICS(0)PRINTE("Dieses Programm zeigt, welche") PRINTE("Sectoren ein File belegt")PUTE()PRINTE("Um auf den }Anfang des Files zu")PRINTE("'zeigen' (POINTen) >START< Taste")PUTE()PRINTE("Irgend eine Taste zum Start")A=GETD(7)CLO}SE(2)OPEN(2,"D:*.*",4,0) ; IRGENDEINFILE ; OEFFNEN NOTE(2,SECTOR,SECTORBYTE) STARTSECTOR=SECTOR^ S}TARTBYTE=SECTORBYTE^DO A=GETD(2) NOTE(2,SECTOR,SECTORBYTE)print("Sector : ") printc(sector^)print(" und Byte ") } printb(Sectorbyte^)print(" inhalt ") printbe(A) IF CONSOLE=6 THEN ; WENN STARTTASTE POINT(2,STARTSECTOR,S}TARTBYTE)FIuntil EOF(2)=136 ; bis File zuendeodreturn IF CONSOLE=6 THEN ; WENN STARTTASTE POINT(2,STARTSECTOR,S;; Ǻ Bei File Version von; Action nur von Diskette; compilierern !!!!!; ACTION LIBRARY DEMOBY}TE CONSOLE=53279PROC WAIT(BYTE FACTOR)CARD IFOR I=1 TO 255*FACTOR DO ODRETURNPROC SOUND_DEMO()BYTE AUDCTL=$D208B}YTE I,I2,I3,I4 GRAPHICS(0)PRINTE("Ġ ")pute()PRINTE("ACHTUNG: Action! setzt beim Sound-")PRINTE("Befehl")} printe("das Audio-Control Register $D208")PRINTE("nicht wie in Basic auf 0 ")AUDCTL=0I=15 DO SOUND(0,40,14,I) WAIT(1}0) I==-1 UNTIL I=255 ODI=15 DO SOUND(0,50,14,I) WAIT(10) I==-1 UNTIL I=255 ODI=15 DO SOUND(0,60,14,I) WAIT(10) I==-}1 UNTIL I=255 ODI=15 DO SOUND(0,70,14,I) WAIT(10) I==-1 UNTIL I=255 ODSNDRST() WAIT(255)FOR I=40 TO 70 DO FOR I2}=I TO I+40 DO SOUND(0,I2,14,10) WAIT(1) OD ODFOR I=40 TO 70 DO FOR I2=I TO I+40 DO SOUND(0,I2,14,1}0) FOR I3=1 TO 254 DO OD OD ODSNDRST() FOR I=100 TO 200 DO SOUND(0,I,14,10) SOUND(1,I+1,14,10) SO}UND(2,I+2,14,10) SOUND(3,I+3,14,10) WAIT(3) OD WAIT(254) WAIT(254) AUDCTL=1 WAIT(254) WAIT(254) I=200 } DO SOUND(0,I,14,10) SOUND(1,I+1,14,10) SOUND(2,I+2,14,10) SOUND(3,I+3,14,10) WAIT(3) I==-1 UNTIL} I=99 OD WAIT(254) WAIT(254) AUDCTL=0 WAIT(254) WAIT(254) SNDRST() WAIT(254) WAIT(254)RETURNPROC WST() ;} WARTEN BIS START GE- ; DRUECKT WIRDCARD I FOR I=0 TO 12000 DO OD ; KURZE PAUSEPRINTE("Nun Druecken") }DO UNTIL CONSOLE=6 ODRETURNPROC PLOT_DEMO() card ibyte x,y,a,xd,ydGRAPHICS(0)PRINTE("Mit dem Joystick den Punkt st}euern")printe("und mit Feuerknopf Linien ziehen")printe("mit