Die in diesem Abschnitt besprochenen Funktionen und Prozeduren erwarten teilweise Adressen als Parameter. Da Adressen positive Werte zwischen 0 und 65535 annehmen, lassen sie sich nicht direkt als INTEGER-Zahlen angeben, die ja nur bis MAXINT=32767 reichen. Daher müssen Zahlen größer oder gleich 32768 durch die entsprechende negative Zahl im Zweierkomplement ersetzt werden:
Beispiel: Die hexadezimale Zahl $FFE4 entspricht der Adresse 65508. Diese Zahl entspricht der INTEGER Zahl -28 im Zweierkomplement, da 65508 - 256 * 256 = -28 ist.
Um also aus einer Adresse X >= 32768 die zugehörige negative INTEGER-Zahl N zu erhalten, müssen Sie nur folgende Formel verwenden:
N = X - 256 * 256
POKE(Adresse,Wert)
Nachdem zuvor mit einer Zuweisung an die Variable BANK (s. 4.4.4.3) die Speicherkonfiguration festgelegt wurde, wird durch die Prozedur POKE an der genannten Adresse der angegebne Wert vom Typ BYTE gespeichert. Die Adresse muß im Zweierkomplement angegeben werden.
Beispiel: BANK:=0; POKE(1024,44)
setzt im Textmodus ein Komma in die linke obere Ecke des 40-Zeichen Bildschirmes.
PEEK(Adresse)
Das Ergebnis dieser Funktion ist der Inhalt der angegebenen Adresse. Dieser Wert ist vom Typ BYTE. Die Speicherkonfiguration für diese Leseoperation kann zuvor durch die BANK-Variable definiert werden.
Beispiel: BANK:=0; WRITE(PEEK(1024));
druckt den Code des Zeichens in der linken oberen Ecke des 40-Zeichen Bildschirmes.
SYS(Adresse)
SYS(Adresse, Registervariable)
Mit diesem Befehl wird ein Unterprogramm in Maschinensprache an der angegebenen Adresse aufgerufen. Dieses Programm muß mit dem Befehl RTS enden. Das Programm darf den Prozessorstack, sowie heap und stack des Pascalprogrammes nicht zerstören und die in Abschnitt 4.3.4 aufgezählten Zero-Page-Variablen (T bis TOP) nicht verändern.
Wie bei den Befehlen POKE und PEEK wird die Speicherkonfiguration bei Bedarf mit der Variablen BANK gewählt. Optional ist die Angabe einer Variablen, die die Werte der Prozessorregister vor und nach dem Aufruf enthält. Somit können in den Registern Parameter zwischen Pascal und Maschinensprache ausgetauscht werden. Die Register werden byteweise in der Reihenfolge Statusregister, Akkumulator, X- und Y-Register gespeichert.
Beispiel: Die folgende Prozedur zeigt, wie man die LOAD-Routine des Betriebssystems aufruft. Zunächst werden mit den Prozeduren SETBNK, SETLFS und SETNAM die gewünschten Parameter gespeichert, mit denen anschließend die eigentliche LOAD-Routine ausgeführt wird. Abschließend wird überprüft, ob beim Laden ein Fehler auftrat, was durch ein gesetztes Carry angezeigt wird. In diesem Fall ist das Bit 0 im Statusregister gesetzt, somit hat das Statusregister einen ungeraden Wert.
PROCEDURE LOAD(S: STRING; TARGETBANK: INTEGER); (* DIE PROZEDUR LÄDT DIE DATEI MIT DEM NAMEN S VON DER *) (* DISKETTE IN DIE ANGEGEBENE BANK. DIE LADEADRESSE *) (* IST MIT DEM FILE GESPEICHERT WORDEN. DIE PROZEDUR *) (* ENTSPRICHT ALSO DEM BASIC-BEFEHL BLOAD"...",ONBx *) VAR I : INTEGER; REGS: RECORD SR,AKKU,X,Y: BYTE END; BEGIN BANK:=15; WITH REGS DO BEGIN AKKU:= TARGETBANK; X:=1; (* NAME IN BANK 1 *) SYS(-152,REGS); (* SETBNK *) AKKU:= LENGTH(S); I:= ADDU(ADR(S),1); X:= I; Y:= HBYTE(I); (* ADRESSE NAME *) SYS(-67, REGS); (* SETNAM *) (* A = laden *) AKKU:=0; X:=8; Y:=1; (* X = Gerät *) (* Y = absolut *) SYS(-70,REGS); (* SETLFS *) AKKU:=0; SYS(-43,REGS); (* LOAD *) IF ODD(SR) THEN (* CARRY=1 ? *) WRITELN('LADEFEHLER!'); END; END; (* LOAD *)
ADDU(Ausdruck,Ausdruck)
Das vorangegegangen Beispiel zeigt auch einen Anwendungsfall für die Funktion ADDU: Da in Pascal 2.0 alle arithmetischen Operationen (auch mit ganzen Zahlen) auf Überschreitung des Zahlenbereichs geprüft werden, kann es bei Rechnungen mit Adressen zu Bereichsüberschreitungen kommen. Würde im oberen Beispiel die Adresse des Strings S (ADR(S)) den Wert 32767 besitzen, so würde die Summation ADR(S)+1 zu einem Programmabbruch führen.
Bei der Funktion ADDU (add unsigned) werden jedoch die beiden INTEGER-Ausdrücke ohne Berücksichtigung von Überläufen addiert.
Beispiel:
ADDU(3,5) = 8 ADDU(-1,-1) = -2 ADDU(32767,1) = -32768 ADDU(-32768,-1) = 32767
HALT
Mit diesem Prozeduraufruf wird ein Pascal-Programm ohne Fehlermeldung sofort beendet.
FAST, SLOW
Mit diesen Prozeduren kann der Rechner vom 1-MHz Modus in den 2-MHz-Modus und umgekehrt geschaltet werden. Im 2-MHz-Modus laufen alle Programme praktisch doppelt so schnell. Jedoch ist dann keine Anzeige auf dem 40-Zeichen-Bildschirm möglich.
HBYTE(Ausdruck)
Um das höherwertige Byte eines INTEGER-Wertes zu erhalten, kann diese Operation verwendet werden. Die Operation X DIV 256 liefert nur für X>=0 das gleiche Ergebnis.
SIZEOF(Typname)
In manchen Anwendungsfällen ist es sinnvoll, den Speicherplatzbedarf von Werten eines Typs in Bytes zu kennen. Diese Funktion SIZEOF liefert diese Größe vom Typ INTEGER.
Beispiel: SIZEOF(TEXT) = 7
ADR(Variable)
Um die absolute Adresse einer Variablen in Bank 1 zu erhalten, kann man diese Funktion verwenden. Die Funktion kann auch auf ARRAY-Elemente, Record-Felder und dynamische Variablen angewandt werden. Diese Funktion wurde in diesem Abschnitt im Beispiel zur Prozedur SYS benutzt, um die Adresse des Strings S zu erhalten.
In diesem Abschnitt werden die Funktionen und Prozeduren besprochen, die im Zusammenhang mit Bildschirmausgaben stehen. Einige Prozeduren arbeiten jedoch auch im Textmodus. Um Darstellungen in den Grafikmodi vorzunehmen, muß im Programmkopf der Name GRAPHIC stehen. Dadurch werden 8K Speicherplatz für die bit-map reserviert. Fehlt dieser Speicherbereich für hochauflösende Grafik, so wird das Programm mit folgender Fehlermeldung abgebrochen:
NO GRAPHICS AREA ERROR
Die Namen und die Syntax der Prozeduren und Funktionen orientiert sich an den Vorgaben durch BASIC 7.0. Eine Implikation dieser Philosophie ist die Tatsache, daß viele Parameterlisten eine variable Länge besitzen, oder daß nicht angegebene Parameter durch default-Werte (Standardvorgaben) ersetzt werden. Sie sollten sich der Tatsache bewußt sein, daß die vorgestellten Grafikroutinen Ihre Programme automatisch inkompatibel mit anderen Computern und Pascal-Compilern machen.
Bei der Beschreibung der Parameterlisten gelten folgende Konventionen:
Beispiel: Wegen Regel 1 kann GRAPHIC(4,0,19) abgekürzt werden zu GRAPHIC(4,,). Diese Parameterliste kann wegen Regel 3 zu GRAPHIC(4) verkürzt werden. Regel 2 wird z.B. bei der DRAW-Anweisung angewendet.
Koordinaten sind INTEGER-Zahlenpaare in der Reihenfolge X- und dann Y-Koordinate. Die darstellbaren Koordinaten für X und Y richten sich nach der momentan gewählten Auflösung (s. GRAPHIC).
Wird bei einer Grafikoperation keine Farbe angegeben, so wird die Farbe 1 (aktuelle Vordergrundfarbe) verwendet.
Jede Zeichenoperation setzt außerdem den sogenannten Pixelcursor. Dies ist die Koordinate des letzten gezeichneten Punktes auf dem Bildschirm. Kann bei einer Grafikoperation eine Koordinate entfallen, so wird eine nicht angegebene Koordinate durch die Position des Pixelcursors ersetzt.
Beispiel: DRAW(1,0,0,50,50)
Nach dieser Operation steht der Pixelcursor auf dem Endpunkt der Strecke mit den Koordinaten 50,50. Erfolgt anschließend die Operation
DRAW(1,,0,50)
so wird die fehlende Ausgangskoordinate durch die Position des Pixelcursors (50,50) ersetzt.
GRAPHIC(Modus,[Löschflag],[Textzeile])
Mit diesem Befehl schalten Sie zwischen den verschiedenen Grafik- und Textmodi hin- und her. Folgende Modi werden unterstützt:
0 | Textdarstellung auf dem 40-Zeichen Bildschirm |
1 | hochauflösende Grafik. Anzeigbare X-Koordinaten liegen zwischen 0 und 319. Anzeigbare Y-Koordinaten liegen zwischen 0 und 199. Es sind nur die Farben 0 und 1 zulässig. |
2 | Grafikmodus wie 1. Zusätzlich können am unteren Bildschrimrand Textzeilen des 40-Zeichen Bildschirms eingeblendet werden. |
3 | Mehrfarbengrafik. Anzeigbare X-Koordinaten liegen zwischen 0 und 159. Anzeigbare Y-Koordinaten liegen zwischen 0 und 199. Es können die Farben 0,1,2 und 3 gewählt werden. |
4 | Grafikmodus wie 3. Zusätzlich können am unteren Bildschirmrand Textzeilen des 40-Zeichen Bildschirms eingeblendet werden. |
5 | Textdarstellung auf dem 80-Zeichen Bildschirm |
Das Löschflag darf nur die Werte 0 und 1 annehmen. Bei der Angabe des Wertes 1 wird der Bildschirm beim Einschalten der Modi 1 bis 4 gelöscht. Voreingestellt ist der Wert 0.
In den Modi 2 und 4 kann die erste darzustellende Textzeile im Bereich 0 bis 24 gewählt werden. Voreingestellt ist der Wert 19.
PAINT([Farbe],[Koordinaten],[Modus])
Mit diesem Befehl wird ein umrandeter Bildschirmbereich ausgehend von den genannten Koordinaten mit einer Farbe ausgemalt. Mit dem Modus wird bestimmt, ob die Grenze der auszumalenden Figur genau die genannte Farbe besitzen muß (0), oder ob die Grenze durch jede Farbe außer der Hintergrundfarbe gebildet wird (1). Voreingestellt ist der Modus 0. Der Startpunkt muß innerhalb der auszumalenden Figur liegen.
Während der Ausführung des Befehls ist die RUN/STOP-Taste gesperrt, da während des Ausmalvorganges kein definiertes Beenden des Pascalprogrammes zu realisieren ist.
DISPLAY([Farbe],Koordinaten,Stringausdruck,[Inversflag])
In BASIC heißt diese Prozedur CHAR. Es wird das Ergebnis des Stringausdruckes am Bildschirm ab den angegebenen Anfangskoordinaten in der gewählten Farbe ausgegeben. Diese Prozedur kann auch im Textmodus 0 und 5 verwendet werden. Besitzt das Inversflag den Wert 1, so wird der Text invertiert (Vordergrund- und Hintergrund vertauscht) ausgegeben.
Steuerzeichen (z.B. zur Cursorbewegung) sind nur im Textmodus erlaubt. Die X- und Y-Koordinaten werden von 0 beginnend gezählt und beziehen sich im Textmodus relativ zum momentan aktiven Window. Um im Mehrfarbenmodus Zeichen in der Zusatzfarbe 2 anzuzeigen, muß die Farbe 0 und das Inversflag = 1 gewählt werden.
Beispiel:
DISPLAY(1,20,0,'UEBERSCHRIFT IN ZEILE 0',1)
BOX([Farbe],Koordinaten,[Koordinaten],[Winkel],[Ausmalflag])
Mit dieser Prozedur können Sie Rechtecke frei wählbarer Orientierung am Bildschirm darstellen. Die Koordinaten definieren die linke obere und die rechte untere Ecke des Rechteckes, wobei die Seiten des Rechteckes parallel zur X- und Y-Achse liegen. Durch die Angabe eines Winkels in Grad (ungleich 0) wird das so definierte Rechteck im Uhrzeigersinn gedreht. Schließlich können Sie noch durch Setzen des Ausmalflags das Rechteck in der gewählten Farbe füllen. Voreinstellung für Winkel und Ausmalflag ist jeweils 0.
CIRCLE([Farbe],[Koordinaten],XRadius,[YRadius],[Start],[Ende],[Rotationswinkel],[Segmentwinkel])
Der Name dieser Prozedur verbirgt etwas die zahlreichen Möglichkeiten, die in diesem Befehl stecken. Am besten betrachten Sie Bild 119 zur Erläuterung der einzelnen Parameter. Durch die Mittelpunktskoordinaten, den X- und Y-Radius wird eine Ellipse definiert (gestrichelt gezeichnet). Nun werden zwischen dem Winkel »Start« und dem Winkel »Ende« Stützstellen auf der Ellipse berechnet. Diese Stützstellen haben einen Abstand von »Segmentwinkel« Grad. Durch die Verbindung der Stützstellung mit Strecken entsteht ein Polygonzug. Wird ein kleiner Segmentwinkel gewählt, nähert sich die Figur immer mehr der gestrichelten Ellipse an.
Bild 119: Parameter der Prozedur CIRCLE
Schließlich läßt sich noch die gesamte Figur um den Rotationswinkel im Uhrzeigersinn drehen. Die folgende Tabelle gibt Aufschluß über die zulässigen Werte der Parameter und die Standardvorgaben, falls ein Parameter nicht spezifiziert wird:
Parameter | Wertebereich | Standardvorgabe |
Farbe | 0..3 | 1 |
Koordinaten | s. Einführung | Pixel-Cursor |
XRadius | -500..500, Größere Werte sind zwar möglich, werden jedoch nicht mehr sinnvoll dargestellt. | |
YRadius | -500..500 | Je nach Auflösung und XR, so daß ein Kreis entsteht |
Start | 0..32767 | 0 |
Ende | 0..32767 | 360 |
Rotationswinkel | 0..32767 | 0 |
Segmentwinkel | 1..255 | 2 |
Beispiele:
CIRCLE(,160,100,65,10) (Ellipse) CIRCLE(,160,100,60) (Kreis) CIRCLE(,160,100,60,,,,45) (Achteck) CIRCLE(,160,100,60,10,0,90) (Ellipsensegment) CIRCLE(,160,100,60,10,,,45,12) (um 12 Grad gedrehtes Achteck)
DRAW([Farbe],[Koordinaten],Koordinaten {,Koordinaten})
Mit diesem Befehl zeichnen Sie Linien und Punkte in der gewählten Farbe. Werden die Startkoordinaten nicht genannt, so wird die Position des Pixelcursors als Ausgangspunkt verwendet. Durch die Angabe von mehr als einem Zielkoordinatenpaar wird ein Polygonzug zwischen den Koordinaten gezogen. Nach der Ausführung des Befehls steht der Pixel-Cursor auf dem letzten gemalten Punkt.
LOCATE(Koordinaten)
Um die Position des Pixel-Cursors gezielt zu setzen, können Sie die Prozedur LOCATE verwenden. Durch den Aufruf der Prozedur wird keine Ausgabe auf dem Bildschirm erzeugt. Dieser Prozeduraufruf hat keinen Einfluß auf den Textcursor.
Beispiel: LOCATE(160,100); CIRCLE(1,,60)
Mit dieser Anweisungsfolge wird zunächst der Pixel-Cursor (unsichtbar) auf die Bildschirmmitte gesetzt. Anschließend wird ein Kreis mit dem Radius 60 um diesen Punkt gezeichnet.
DISPLAY(1,0,19,'')
Dieser Befehl setzt den Textcursor in Zeile 20 und Spalte 1. Als Textfarbe wird die Farbe schwarz gewählt.
COLOR(Farbe, Farbcode)
Bei den verschiedenen Auflösungsmodi steht eine unterschiedliche Anzahl an Farben zur Verfügung. Durch die Speicherung der Farbattribute des Bildschirms können Sie zwar jede beliebige Farbe als Zeichenfarbe wählen, jedoch kann durch das Setzen eines Punktes in dieser Farbe ein Teil der in der »Umgebung« des Punktes gesetzten Pixel mit eingefärbt werden. Im hochauflösenden Grafikmodus kann ein Punkt nur die Hintergrund- oder Vordergrundfarbe besitzen. Zu diesen »zwei« Farben treten im Mehrfarbenmodus noch zwei Zusatzfarben.
Mit dem Befehl COLOR können Sie diesen »Farben« (Hintergrund, Vordergrund, Zusatzfarbe 1 und 2) Farbcodes zuordnen, die folgende Werte annehmen können:
1 | schwarz | 9 | hellbraun |
2 | weiß | 10 | braun |
3 | rot | 11 | rosa |
4 | grün | 12 | dunkelgrau |
5 | violett | 13 | grau |
6 | dunkelgrün | 14 | hellgrün |
7 | blau | 15 | hellblau |
8 | gelb | 16 | hellgrau |
Die Farben werden ebenfalls codiert angegeben:
0 | Hintergrund | (40-Zeichen-Modus) |
1 | Zeichenfarbe | (hochauflösende Grafik / Mehrfarbenmodus) |
2 | Zusatzfarbe | 1 (nur im Mehrfarbenmodus) |
3 | Zusatzfarbe | 2 (nur im Mehrfarbenmodus) |
4 | Randfarbe | (40-Zeichen-Modus) |
5 | Textfarbe | (40- und 80-Zeichen-Modus, für WRITE-Befehle) |
6 | Hintergrundfarbe | (80-Zeichen-Modus) |
Beispiel: COLOR(0,2); COLOR(1,3); COLOR(4,1); COLOR(5,7)
wählt die folgenden Farben: Hintergrundfarbe weiß, Zeichenfarbe rot, Rand schwarz und Textfarbe blau.
SCNCLR
SCNCLR(Modus)
Ohne Parameterangabe wird der Bildschirm des momentan aktiven Grafikmodus gelöscht. Durch die Angabe eines Parameters kann der zu löschende Bildschirm explizit gewählt werden:
0 | Der 40-Zeichen Text-Bildschirm |
1 | Der hochauflösende Grafikbildschirm |
2 | Der hochauflösende Grafikbildschirm mit Textzeilen |
3 | Der Mehrfarben Grafikbildschirm |
4 | Der Mehrfarben Grafikbildschirm mit Textzeilen |
5 | er 80-Zeichen Bildschirm |
-1 | Der aktuelle Bildschirm wird gelöscht (entspricht SCNCLR ohne Parameter). |
Beim Löschen eines Grafikbildschirms werden alle Pixel auf dem Bildschirm in der Hintergrundfarbe gesetzt.
WIDTH(Breite)
Bei allen Zeichenbefehlen (DRAW, CIRCLE, BOX) kann die Strichstärke verändert werden. Voreingestellt ist die Breite 1. Alternativ kann die Breite 2 gewählt werden, wodurch immer zwei nebeneinanderliegende Punkte gesetzt werden. Andere Werte für die Breite führen zur Fehlermeldung »ILLEGAL QUANTITY ERROR«.
RGR
Mit dieser parameterlosen Funktion können Sie den eingestellten Grafikmodus bestimmen. Der gelieferte Wert vom Typ INTEGER liegt zwischen 0 und 5 entsprechend der Tabelle für die Modi bei der Prozedur GRAPHIC.
RCLR(Farbe)
Als Funktionsergebnis erhalten Sie den aktuellen Farbcode (1 bis 16) vom Typ INTEGER für diese Farbe. Gültige Farben liegen im Bereich von 0 bis 6. Die Farben sind wie bei der Prozedur COLOR codiert.
Beispiel:
ZEICHENFARBE:= RCLR(1)
Der Variablen ZEICHENFARBE wird der Farbcode der Zeichenfarbe im Grafikmodus zugewiesen. Wurde z.B. die Zeichenfarbe rot gewählt, so besitzt anschließend die Variable ZEICHENFARBE den Wert 3.
RDOT(Code)
Mit dieser Funktion erhalten Sie Informationen über die Position des Pixel-Cursors. Der Code darf folgende Werte annehmen:
RDOT(0) | liefert die X-Koordinate des Pixel-Cursors |
RDOT(1) | liefert die Y-Koordinate des Pixel-Cursors |
RDOT(2) | liefert die Farbe an der Position des Pixel-Cursors |
Beispiel:
LOCATE(50,50); IF RDOT(2)<>0 THEN WRITELN('Bei (50,50) ist ein Punkt gesetzt');
Es wird ein Bildschirmfenster für nachfolgende Textausgaben mit WRITE oder DISPLAY durch die Angabe der Koordinaten der linken oberen und rechten unteren Ecke definiert. Gültige Koordinaten in X-Richtung liegen im Bereich von 0 bis 79 (oder 39), während gültige Y-Koordinaten (Zeilennummern) von 0 bis 24 reichen. Dabei muß gelten:
XLO < XRU und YLO < YRU
Wird für das Löschflag der Wert 1 angegeben, so wird das Fenster nach der Definition mit der Hintergrundfarbe gelöscht. Um eine Windowdefinition rückgängig zu machen genügt die Steuerzeichenfolge HOME HOME.
Beispiel:
PROGRAM WINDOWS(INPUT, OUTPUT); CONST RESETWINDOW = #19 #19; VAR I: INTEGER; BEGIN SCNCLR; WINDOW(20,5,40,8); FOR I:= 1 TO 18 DO WRITE('ZEILE',I); WRITE(RESETWINDOW, 'OHNE WINDOW'); END.
RWINDOW(Code)
Um die Größe des momentan aktiven Windows zu bestimmen, können Sie die Funktion RWINDOW verwenden. Der Code liegt im Bereich von 0 bis 2 und hat folgende Bedeutung:
RWINDOW(0) | liefert die Nummer der letzten Zeile im aktuellen Window (0 bis 24). |
RWINDOW(1) | liefert die Nummer der letzten Spalte im aktuellen Window (0 bis 79). |
RWINDOW(2) | liefert die maximale ildschirmbreite (40 oder 80 Zeichen). |
SOUND(Stimme,Frequenz,Dauer,[Richtung],[Maxfreq],[Stufe], [Welle],[Impulsbreite])
Mit diesem Prozeduraufruf wird ein Geräuscheffekt gestartet, der eine programmierbare Zeit andauert. Während dieser Zeit können andere Anweisungen ausgeführt werden. Es können drei Stimmen unabhängig voneinander programmiert werden. Bei aufeinanderfolgenden SOUND-Anweisungen für die gleiche Stimme wird solange gewartet, bis die vorhergehende Anweisung vollständig ausgeführt wurde.
Als Stimme können die Zahlen 1,2 und 3 gewählt werden. Die Frequenz kann jeden beliebigen INTEGER-Wert annehmen. Dabei werden negative Werte als Frequenzen größer als 32767 interpretiert. Die Dauer einer Tonausgabe wird in Einheiten von 1/60 Sekunde definiert. Wird als Dauer Null angegeben, so werden alle laufenden Klangeffekte für diese Stimme sofort abgebrochen.
Durch die Angabe einer Richtung können auch zeitlich veränderliche Tonausgaben erzeugt werden:
0 | zunehmende Tonhöhe (Voreinstellung) |
1 | abnehmende Tonhöhe |
2 | oszillierende Tonhöhe |
Die Maximalfrequenz beschränkt ansteigende Klangeffekte nach oben hin. Die Voreinstellung beträgt 0. Der Parameter Welle darf nur folgende Werte annehmen, die die Wellenform für die Stimme fest- legen:
0 | Dreieck |
1 | Sägezahn |
2 | Rechteck (Voreinstellung) |
3 | Rauschen |
Nur im Falle einer Rechteckwelle (Welle = 2) wird der letzte Parameter, die Impulsbreite ausgewertet. Er darf Werte zwischen 0 und 4095 annehmen. Dabei bedeutet z.B. der voreingestellte Wert von 2048, daß die positive und negative Halbwelle gleich breit sind.
VOL(Lautstärke)
Dieser Prozeduraufruf legt die Lautstärke für alle nachfolgend mit SOUND- und PLAY-Prozeduren erzeugten Töne fest. Gültige Werte liegen zwischen 0 und 15, wobei die Ausgabe bei einem Wert von 0 ausgeschaltet ist.
FILTER(Frequenz,[Tiefpaßflag],[Bandpaßflag],[Hochpaßflag],[Resonanz])
Den tonerzeugenden Generatoren (Stimme 1 bis 3) ist ein Filter nachgeschaltet, mit dem sich die Frequenzverteilung des Signals modifizieren läßt. Jeder der drei Filter läßt sich unabhängig von den anderen über ein Flag ein- (1) und ausschalten (0). Wird das Flag auf -1 gesetzt, oder der Parameter in der Parameterliste ausgelassen, so bleibt der Filter unverändert. Der Parameter Resonanz gibt - grob gesprochen - die Selektivität der Filter an. Dabei sind Werte zwischen 0 und 15 erlaubt. Wird ein negativer Wert angegeben, oder die Resonanz in der Parameterliste nicht aufgeführt, so bleibt eine zuvor eingestellte Resonanz erhalten.
Beispiel:
FILTER(1200,1,,0,10)
Mit diesem Befehl wird die Filterfrequenz auf 1200 festgelegt, der Tiefpaß wird eingeschaltet, der Bandpaß bleibt unverändert, während der Hochpaß ausgeschaltet wird. Die Resonanz wird auf ein gut wahrnehmbares Niveau eingestellt.
PLAY(Stringausdruck)
Mit dieser Prozedur können Musikstücke (nach Noten) programmiert werden. Die Programmausführung wird (im Unterschied zum SOUND-Befehl) erst fortgesetzt, wenn der gesamte Stringausdruck abgearbeitet wurde. Innerhalb des Strings sind neben den eigentlichen Notennamen (C D E F G A B ) zahlreiche andere Zeichen zulässig, mit denen man Stimme, Pausen, Tondauer, Oktave, Lautstärke und Filter wählen kann. Jede der drei Stimmen ist separat programmierbar. Nähre Einzelheiten über die Syntax der »Musikstrings« finden Sie im BASIC-Handbuch.
Beispiel:
PLAY('QCDEFHGGQAAAG')
TEMPO(Geschwindigkeit)
Während innerhalb des »Musikstrings« bei der Prozedur PLAY die Tondauer in ganzen, halben, viertel, achtel oder sechzehntel Tonlängen gewählt wird, bestimmt die Prozedur TEMPO die absolute Abspielgeschwindigkeit des Strings. Die Geschwindigkeit liegt im Bereich von 0 bis 255. Hohe Werte führen zu einer größeren Geschwindigkeit. Im BASIC-Handbuch wird folgende Formel zur Berechnung der Dauer einer ganzen Note genannt:
(19.22 / Geschwindigkeit) Sekunden
ENVELOPE(Nummer,[Anschlagzeit],[Abschwellzeit],[Haltezeit], [Ausklingzeit],[Wellenform],[Impulsbreite])
Für PLAY-Anweisungen existieren 10 verschiedene »Musikinstrumente«. Die unterschiedlichen Klangfarben dieser Instrumente werden durch die Wahl der Hüllkurven erzeugt. Um jeweils eine dieser Hüllkurven zu verändern, also ein neues »Instrument« zu definieren, können Sie die ENVELOPE-Prozedur verwenden. Zunächst wählen Sie die Nummer des »Instrumentes« (0 bis 9), das sie verändern wollen. In der Parameterliste müssen Sie nur Parameter nennen, die Sie verändern wollen. Negative bzw. ausgelassene Parameter werden nämlich durch die zuvor gültigen Werte der Hüllkurven ersetzt.
Die Anschlag-, Abschwell-, Halte und Ausklingzeiten dürfen Werte zwischen 0 (kurz) und 15 (lang) annehmen. Die Wellenform ist eine Zahl zwischen 0 und 4:
0 | Dreieck |
1 | Sägezahn |
2 | Rechteckwelle |
3 | Rauschen |
4 | Ringmodulation |
Wie bei der SOUND-Prozedur wird der Parameter Impulsbreite (aus dem Intervall 0 bis 4095) nur für Rechteckwellen ausgewertet.
Beispiel:
ENVELOPE(0,4,4,8,5,2,2048)
Mit diesem Prozeduraufruf wird die Hüllkurve 0 (»Klavier«) neu definiert. Tritt in einem »Musikstring« bei der Prozedur PLAY der Befehl »T0« auf, so wird die mit ENVELOPE definierte Hüllkurve verwendet.
POT(Nummer)
Diese Funktion liefert die Position eines der vier anschließbaren paddles(Drehregler). Der Parameter »Nummer« vom Typ INTEGER muß dementsprechend zwischen 1 und 4 liegen. Je nach der Stellung des Drehreglers wird ein Wert zwischen 0 und 255 gelifert. Wird bei dem gewählten Regler auch der Feuerknopf betätigt, so wird zu diesem Wert noch 256 addiert.
Beispiel:
P:= POT(3); WRITELN('STELLUNG REGLER 3 =',P AND 255); IF P>255 THEN WRITELN('FEUERKNOPF GEDRUECKT');
PEN(Code)
Mit dieser Funktion wird der Lichtstift (light pen) abgefragt. Mit dem Code (Typ INTEGER) wird der Abfragemodus definiert:
0 | X-Koordinate des ligth pen auf dem Grafikbildschirm (60 bis 320) |
1 | Y-Koordinate des light pen auf dem Grafikbildschirm (50 bis 200) |
2 | Text-Spalte, in der sich der light pen auf dem 80-Zeichen-Bildschirm befindet |
3 | Text-Zeile, in der sich der light pen auf dem 80-Zeichen-Bildschirm befindet |
4 | Es wird eine 1 übergeben, falls der light pen seit der letzten Abfrage (mit PEN) aktiviert wurde, andernfalls 0. |
Beispiel:
REPEAT UNTIL PEN(4)<>0; WRITELN('STIFT IST BEI',PEN(2),PEN(3), 'AKTIVIERT');
JOY(Nummer)
Diese Funktion liefert codiert die Position eines der beiden Joysticks. Die Joysticks besitzen die Nummern 1 und 2. Folgende Werte können auftreten:
0 | Mittelstellung |
1 | nach vorne |
2 | nach vorne rechts |
3 | nach rechts |
4 | nach hinten rechts |
5 | nach hinten |
6 | nach hinten links |
7 | nach links |
8 | nach vorne links |
Zu diesen Werten wird die Zahl 128 addiert, falls zusätzlich der Feuerknopf betätigt wurde.