Projekt Hardware Bedienung BASIC (1) BASIC (2) BASIC (3) Interna Beispiele Erweiterungen Bibliotheken Treiber Programme Download:
|
AVR-ChipBasic2: BASIC-Referenz (1)
Grundlagen V1.28 (c) 2006-2010 Jörg Wolfram
1 Allgemeines Jedes Programm besteht aus maximal 95 Programmzeilen (1-95). Für längere Schlüsselwörter existieren teilweise Abkürzungen, diese stehen in rechteckigen Klammern neben der ausgeschriebenen Version. Nach jedem Schlüsselwort muss ein Leerzeichen stehen. Viele Befehle blenden nicht benutzte Bits bei den Parametern aus (z.B. COLOR) oder begrenzen auf den gültigen Wertebereich (z.B. PLOT). Leider werden in der aktuellen Version nicht alle Fehler abgefangen, in so einem Falle (meist wird der ganze Bildschirm mit Nullen oder unsinnigen Zeichen vollgeschrieben) sollte man mit CTRL+ALT+DEL den Computer neu starten und sich den BASIC-Programmtext nocheinmal ansehen. 2 Zahlen, Variablen und Funktionen AVR-ChipBASIC kennt nur einen Datentyp, und das sind 16 Bit Integerzahlen. Dazu gibt es 26 Variablen (A-Z) und ein Array mit 128-384 Elementen AR(), dazu aber später mehr. Konstanten können sowohl in Dezimalform als auch in Hexadezimalform eingegeben werden, wobei bei letzterer keine negativen Werte erlaubt sind. Hexadezimalzahlen beginnen mit $. Folgende Operationen sind erlaubt:
Zusätzlich zu den normalen Variablen gibt es noch die Arrayvariable AR().
3 Wertzuweisung Wertzuweisungen beginnen nicht mit einem Schlüsselwort, sondern mit einem Variablennamen gefolgt von einem Gleichheitszeichen und einem Ausdruck.
3.1 LSHIFT v,n Der Wert der Variable v wird um n Bits verschoben. Für N>0 wird bitweise nach links verschoben, für N<0 nach rechts. Dabei wird jeweils eine 0 eingeschoben. Sinnvolle Werte für N liegen zwischen -15 und +15. Dies geht normalerweise schneller als eine entsprechende Multiplikation/Division, für n>8 ist allerdings die Multiplikation schneller. Dise Funtion geht nicht mit negativen Zahlen, da dabei das Vorzeichen mit verschoben wird.
Da A um 2 Bits nach links verschoben wird, wird der Wert 68 ausgegeben. 3.2 ASHIFT v,n Der Absolutwert der Variable v wird um n Bits verschoben. Für N>0 wird bitweise nach links verschoben, für N<0 nach rechts. Sinnvolle Werte für N liegen zwischen -15 und +15. Im Gegensatz zu LSHIFT wird nur der Absolutbetrag verschoben, damit funktioniert dies auch genauso mit negativen Zahlen.
Da A um 1 Bits nach rechts verschoben wird, wird der Wert -19 ausgegeben. Im Gegensatz dazu ergibt:
das Ergebnis 32749, da in die Vorzeichenstelle eine 0 geschoben wurde. 3.3 LIMIT v,min,max [LIM] Der Wert der Variable v wird auf den Wertebereich min...max begrenzt. Die Funktion ist nur auf Variablen, nicht auf Arrayelemente erlaubt.
im ersten Beispiel wird die Variable A auf den Bereich 1...6 begrenzt, im zweiten Beispiel die Variable B auf den Wertebereich, der durch den Inhalt der Variable C und die 4 darauffolgenden Zahlen begrenzt ist. 3.4 SCALE Variable,Y0,Y1,X0,X,X1 Dieser Befehl dient dazu, Werte von einem Bereich in einen anderen zu transformieren. X ist dabei der "INPUT"-Bereich, Y liefert das Resultat. Ein Beispiel:
liefert z.B. als Resultat den wert 70. In diesm Falle heißt das, der Wert von V (180) entspricht 70 Prozent vom Maximalwert 256. Man kann sich das so vorstellen, daß das Resultat so zwischen Y0 und Y1 liegt, wie der Wert X zwischen den Grenzen X0 und X1 liegt. Die Formel dafür ist:
Damit das Ganze auch hinreichend genau ist, wird intern mit 32 Bit gerechnet. Aufgrund der begrenzten internen Programmspeicherkapazitäten werden aber nicht alle Bedingungen für das Zustandekommen eines gültigen Resultates überprüft. So sollte Y1 betragsmäßig immer größer als Y0 sein, X1 betragsmäßig größer als X0 sein und X sollte zwischen X0 und X1 liegen. 3.5 DATA offset,value1,value2... [DA] Die Array Elemente werden ab Byte (offset) initialisiert. Als Werte kommen Konstanten, numerische Ausdrücke und Zeichenketten in Frage. Im Word-Bereich des Arrays (ab Offset 1024) werden immer 16 Bit geschrieben, das betrifft insbesondere Zeichenketten wo das HIGH-Byte immer 0 ist. Andersherum wird im Bytebereich des Arrays nur das Low-Byte der Werte geschrieben.
Das Array wird ab Element 0 mit der nullterminierten Zeichenkette "Hallo" belegt. 3.6 ACOPY source,dest,num... [AC] Eine Anzahl (num) von Array Elementen wird ab Byte (source) nach Byte (dest) kopiert. Das Kopieren erfolgt elementweise, so kann z.B. auch von 8 auf 16 Bit erweitert werden. Andersherum wird beim Kopieren vom Word- in den Bytebereich des Arrays nur das Low-Byte der Werte geschrieben.
Das Array wird ab Byte-Element 0 in die Word-Elemente 1029...1038 (Byte-Elemente 10...29) kopiert. Wichtig ist dabei, dass die Arrayzellen nur aufsteigend kopiert werden. Überlappen sich Quell- und Zielbereich und ist die Quelladresse kleiner als die Zieladresse, wird das Ergebnis nicht dem Gewünschten entsprechen, das Teile des Quellbereiches überschrieben werden bevor sie in den Zielbereich kopiert werden. 3.7 DBIT(N) Diese Funktion vereinfacht das Erstellen von selbstdefinierten Zeichen im Videomodus 4. Vom Argument N werden nur die 6 unteren Bits berücksichtigt und in ein Bitmuster umgewandelt, welches bei der Darstellung dem Erwarteten entspricht. Grund dafür ist die Organisation des Zeichenspeichers: Hier werden Bit 0+1 nicht benutzt, Bit 7 entspricht dem Pixel ganz links und die nachfolgenden Bits (6...2) ensprechen jeweils der Differenz zum vorherigen Pixel. Sollen zum Beispiel alle 6 Pixel in einer Zeile gesetzt werden, muß 0x80 im Byte stehen. Bit 7 ist "1" und alle nachfolgenden "0", was "keine Änderung" bedeutet. Damit man sich diese Umrechnung ersparen kann, rechnet die Funktion DBIT() das anzuzeigende Bitmuster systemgerecht um. Vom Parameter N werden dabei nur die unteren 6 Bits benutzt.
Das Programm ändert nach 1 Sekunde das Aussehen von Zeichen 0 welches links oben angezeigt wird, in eine Art "Schachbrettmuster". 4 Programmsteuerung 4.1 BREAK Setzt einen Breakpoint, ruft den Monitor auf. 4.2 END Mit dem END-Befehl wird das Programm an der aktuellen Stelle beendet. Das gleiche geschieht auch, wenn die letzte Programmzeile abgearbeitet ist. 4.3 GOTO n [GO] Mit dem GOTO-Befehl kann die Programmabarbeitung mit einer anderen Zeile fortgesetzt werden. Argument ist ein beliebiger Ausdruck.
Das ist eine Endlosschleife, die nur mit CTRL+C abgebrochen werden kann. 4.4 IF - THEN Die bedingte Anweisung besteht aus IF gefolgt von einem Ausdruck. Ist das Ergebnis des Ausdrucks Null, wird zum Anfang der nächsten Zeile gesprungen, andernfalls wird die Zeile weiter abgearbeitet. Das THEN kann auch weggelassen werden.
Beide Ausdrücke bewirken exakt das Gleiche. 4.5 FOR - NEXT Bei der Zählschleifen-Abarbeitung gibt es nur die Grundform FOR A=B TO C ohne die Angabe der Schrittweite, die konstant 1 ist. Die Schleife wird auf jeden Fall mindestens 1 mal durchlaufen, wenn C keiner als B ist findet ein Überlauf statt und die Anzahl der Schleifendurchläufe ist N=C-B+65536.
Dieses Programm zeichnet ein Rechteck in die obere linke Ecke des Bildschirmes. 4.6 REPEAT - UNTIL [REP - UNT] Dies ist eine weitere Schleifenkonstruktion, eine sogenannte Fußgesteuerte oder auch Nichtabweis-Schleife. Das heißt, der Programmteil zwischen REPEAT und UNTIL wird mindestens einmal durchlaufen.
Schreibt die Zahlen 0,3,6 und 9 untereinander auf den Bildschirm. Systembedingt gibt es kein EXIT, um eine Schleife abzubrechen. Ein einfaches GOTO aus der Schleife heraus ist auch keine gute Lösung, da damit ein Stackeintrag blockiert wird. Eine praktikable Lösung wäre:
schreibt solange "Hallo!" auf den Bildschirm, bis eine Taste gedrückt wird. Das UNTIL 0 bewirkt in diesem Fall, dass der reservierte Stackeintrag wieder freigegeben wird. 4.7 GOSUB [GOS] GOSUB Expr ruft das Unterprogramm in der durch den Ausdruck definierten Zeile auf, auf die Zeilennummer können noch bis zu 5 Parameter folgen. Da der Stack auf 10 Einträge begrenzt ist, lassen sich nur insgesamt 10 Schleifen bzw. Unterprogrammaufrufe schachteln.
Das Unterprogramm in Zeile 4 addiert die beiden Parameter, in diesem Fall 2 + 3 = 5. In der zweiten Zeile wird dann das Resultat ausgegeben. 4.8 RETURN [RET] Mit RETURN wird aus einem Unterprogramm wieder zurückgesprungen, mit RETURN returnwert kann ein 16 Bit Wert zurückgegeben werden, der dann mit der Systemvariable ~R im aufrufenden Programm verfügbar ist. 4.9 CALL Eine weitere Anweisung ist CALL prognr,zeile die Unterprogramme in einem der 7 anderen Programme aufrufen kann. Damit ist es möglich, den gesamten Programmspeicherbereich für eine einzige Anwendung zu nutzen. Auf die Programm- und Zeilennummer können noch bis zu 5 Parameter folgen, der Rücksprung erfolgt wie gehabt mit RETURN. Da der Stack auf 10 Einträge begrenzt ist, lassen sich nur 10 Schleifen bzw. Unterprogrammaufrufe schachteln. Weiterhin führt das Verlassen von Schleifen oder Unterprogrammen zu blockierten Stack-Einträgen, die dann nicht mehr genutzt werden können. Wenn das aufgerufene Programm vom Typ Binär ist, gibt es zwei Möglichkeiten:
4.10 LFIND V,n Mit dieser Anweisung lässt sich feststellen, ob eine bestimmte Binärbibliothek geladen ist. Dazu hat jede dieser Bibliotheken eine (hoffentlich) eindeutige Kennung in Byte 14 und 15. Wenn das LOW-Byte des Suchwertes gleich 0 ist, wird das LOW-Byte der Bibliotheks-ID ignoriert. Die Variable wird auf 1...8 gesetzt, wenn eine entsprechende Bibliothek gefunden wurde.
4.11 VID n Dieser Befehl ersetzt seit Version 1.00 die Befehle SLOW und FAST um die Bildausgabe ein- und auszuschalten. Mit VID 0 wird die Bidausgabe ausgeschaltet, Synchronsignale werden auch weiterhin erzeugt. VID 1 schaltet die Bildausgabe wieder ein. Mit ausgeschalteter Bildausgabe ist die Geschwindigkeit höher, da ein großer Teil der Rechenleistung normalerweise für die Bilddarstellung verwendet wird. Es sollte dabei beachtet werden, dass damit auch der Aufruf geladener Videotreiber abgeschaltet wird, was z.B. bei einem PWM- oder LED-Multiplex Treiber ungewünschte Folgen haben kann. 4.12 Die System-Variablen Die Sytem-Variablen (definiert durch vorangestellte Tilde, also die "Schlangenlinie") geben Auskunft über den System-Zustand und können nur gelesen werden. Zwischen das Tilde-Zeichen ~und dem Buchstaben für die Systemvariable darf sich KEIN LEERZEICHEN befinden. 4.12.1 Das Array ~(1) ... ~(5) (Funktionsparameter) In diesem Array stehen die Parameter, die beim letzen GOSUB bzw. CALL übergeben wurden. Liegt das Argument außerhalb des Bereiches 1...5, wird 0 zurückgegeben. 4.12.2 ~M (Mikrocontroller) In dieser Variable steht, ob es sich um einen Mega644 (1) oder Mega644P (2) handelt. Dabei wird ein Mega644P mit Input-Pin der ersten seriellen Schnittstelle an PD3 als Mega644 behandelt, da auch hier die zweite serielle Schnittstelle nicht nutzbar ist. 4.12.3 ~L (aktuelle Programmzeile) Diese Variable liefert als Wert die gerade abgearbeitete Programmzeile. Damit lassen sich z.B. relative Sprünge realisieren. Der Wert liegt zwischen 1 und 95, die folgende Programmzeile ezeugt in jeder Zeile eine Endlosschleife, die einen "bunten" Rand erzeugt:
4.12.4 ~N (Parameter-Anzahl) In dieser Variable steht, wieviele Parameter beim letzten GOSUB bzw. CALL übergeben wurden. 4.12.5 ~P (aktuelles Programm) Diese Variable liefert als Wert das gerade abgearbeitete Programm. Der Wert liegt zwischen 1 und 8. Wenn mittels CALL P,N ein Unterproramm in einem anderen Programm aufgerufen wurde, wird nicht das aufrufende Programm zurückgegeben, sondern das im Moment aktive. 4.12.6 ~R (Return-Wert) Diese Variable enthält den zuletzt bei RETURN angegebenen Wert. 4.12.7 ~S (Scanline) Diese Variable liefert als Wert die aktuelle Bildschirmzeile, die gerade dargestellt wird. Bei NTSC bewegt sich der Wert zwischen 0 und 262, bei PAL zwischen 0 und 312. Anwendungsgebiete sind z.B. genauere Zeitmessungen, bei denen TGET zu grob auflöst. Dabei sollte aber die Videoausgabe abgeschaltet werden.
Auf dem Bldschirm sollte jetzt oben und unten ein grüner Rand zu sehen sein, dazwischen ist der Bildschirm schwarz. Allerdings ist dabei ein starkes Zittern der Kanten zu beobachten, was einfach daher rührt, dass die Abarbeitung der Befehle länger dauert als eine Bildschirmzeile. 4.12.8 ~V (Videosystem) diese Variable liefert als Wert die Anzahl der Bildschirmzeilen je Halbbild. Eine mit ~S ermittelte aktuelle Bildschirmzeile wird immer zwischen 0 und ~V-1 liegen. Bei NTSC ist ~V = 263, bei PAL beträgt der Wert 313. 4.12.9 ~X (X-Ausdehnung) diese Variable liefert als Wert die Anzahl der Pixel in horizontaler Richtung. Dabei wird die aktuelle Auflösung berücksichtigt. In Video-Mode 0 hat die variable z.B. den wert 60 und im Mode 1 den Wert 168. 4.12.10 ~Y (Y-Ausdehnung) diese Variable liefert als Wert die Anzahl der Pixel in vertikaler Richtung. Dabei wird die aktuelle Auflösung berücksichtigt. In Video-Mode 0 hat die variable z.B. den wert 46 und im Mode 1 den Wert 116. Auflösung berücksichtigt. In Video-Mode 0 hat die variable z.B. den wert 46 und im Mode 1 den Wert 116. 5 Bildschirm-Ausgabe 5.1 COLOR F(,B) [COL] Mit dem COLOR-Befehl wird die Vorder- sowie die Hintergrundfarbe festgelegt. Diese wird im Gegensatz zu früheren Versionen bei allen Ausgaben bercksichtigt, da jetzt für jedes Zeichen Vorder- und Hintergrundfarbe einzeln festgelegt werden können. Wird nur ein Parameter angegeben, wird nur die Vordergrundfarbe gesetzt. Akzeptiert werden Werte von jeweils 0 bis 15, ohne die "16-Farben Erweiterung" sind die Farben 0...7 und 8...15 identisch:
Wenn die "16-Farben Erweiterung" eingebaut wurde, stehen 8 zusätzliche Farben zur Verfügung, wobei die ersten 8 Farben insgesamt etwas dunkler werden.
Hier wird die Zeichenfarbe "Grün auf rotem Grund" festgelegt, was allerdings nicht gerade besonders gut lesbar ist. 5.2 CLS Mit dem CLS-Befehl wird der Bildschirm gelöcht. Beim Programmstart geschieht das automatisch. Es wird die eingestellte Hintergrundfarbe (beim Programmstart schwarz) verwendet. 5.3 BORDER B [BO] Mit diesem Befehl kann die Randfarbe eingestellt werden, gültige Werte sind 0...15. 5.4 POS Y,X Mit dem POS-Befehl wird der Schreibcursor an die Stelle Y,X gesetzt. Nach jedem Löschen des Bildschirms wird der Cursor auf die Position 0,0 (links oben) gesetzt. 5.5 WRAP n Mit dem WRAP-Befehl kann das Verhalten am Bildschirmende im Textmodus eingestellt werden. Mit WRAP 0 wird der Bildschirm beim Erreichen des Bildschirmendes um eine Zeile nach oben gescrollt. Dies ist auch die Standardeinstellung beim Start. Mit WRAP 1 wird beim Erreichen des Bildschirmendes der Cursor auf den Bildschirmanfang zurückgesetzt. BeimProgrammstart ist der Wert mit 0 vorbelegt. 5.6 PRINT [?] Der PRINT-Befehl dient zur Ausgabe auf den Bildschirm oder auf die serielle/parallele Schnittstelle, in das Array oder auf die I2C-Schnittstelle. Zusätzlich kann die Ausgabe noch formatiert werden. Anstelle des PRINT Befehls kann auch (BASIC-üblich) ein Fragezeichen verwendet werden.
Steht am Ende des PRINT-Befehls einer der beiden Trenner, wird kein Zeilenvorschub ausgeführt. Der Ausgabekanal legt fest, wohin die Zeichen ausgegeben werden. Bei Ausgabekanal >3 wird auf die I2C-Schnittstelle mit der Kanalnummer als Devicenummer ausgegeben. Dabei wird das niederwertigste Bit auf 0 gesetzt (Schreibmode).
Das Format ist ein Wert zwischen 0 und 255, wobei die Bits folgende Bedeutung haben:
Bei Ausgabe auf den Bildschirm wird der Cursor auf die entsprechende Position gesetzt, bei Ausgabe auf die serielle oder parallele Schnittstelle wird die Positionierung ignoriert. Bei Ausgabe in das Array entspricht der erste Wert Array-Byteposition*256 und der zweite Wert der Array-Byteposition, ohne @ ist die Byteposition zu Beginn jedes PRINT-Befehls 0x0000. Wird über die I2C-Schnittstelle ausgegeben, so wird zuerst 0xff und danach xxxxxxxx und yyyyyyyy gesendet. Die Änderung wude notwendig, um Zeichen z.B. auf extern angeschlossenen GLCD's feiner positionieren zu können. 5.7 CBOX Y1,X1,Y2,X2 Mit dem CBOX-Befehl wird ein Rechteck gelöscht (mit der aktuellen Hintergrundfarbe).
löscht oben links ein Quadrat von 3x3 Zeichen. 5.8 FRAME Y1,X1,Y2,X2 Zeichnet einen Textrahmen mit Umrandung.
Zeichnen einen Textrahmen mit voller Bildschirmgröße, violettem Untergrund und weißer Zeichenfarbe. 5.9 HFRAME Y1,X1,Y2,X2 Zeichnet einen Textrahmen mit Umrandung und einem "Kopfbereich", so wie z.B. auch das Hauptmenü aufgebaut ist.
Zeichnen einen Textrahmen wie im vorigen Beispiel, allerdings jetzt mit einem Kopfbereich und Text darin. 5.10 IBOX Y1,X1,Y2,X2 Mit dem IBOX-Befehl werden in einem Rechteck Vorder- und Hintergrundfarbe vertauscht. Die Zeichen selbst werden nicht verändert.
invertiert das Zeichen in der linken oberen Ecke. 5.11 SCROLL n In den Vieomodi 0, 4 und 6 gibt es ein Scrollfenster, in dem in alle 4 Richtungen gescrollt werden kann. Das Fenster beginnt bei Zeichen 2 in Zeile 2 und geht bis Zeichen 27 in Zeile 20. Somit gibt es um das Scrollfenster einen 2 Zeichen breiten Rand in dem z.B. Informationen stehen, die nicht mitgescrollt werden sollen. Die freiwerdende Zeile wird mit Leerzeichen in der aktuellen Farbeinstellung gefüllt.
verschiebt das Scrollfenster um 1 Zeichen nach unten. 5.12 GETCHAR variable,Y,X [GCH] Ermittelt das Zeichen an der Position y,x und schreibt dieses in die Variable v.
Schreibt den Zeichenwert von Position 0,0 in die Variable F. 5.13 GETATTR variable,Y,X [GAT] Ermittelt das Attributbyte an der Position y,x und schreibt dieses in die Variable v.
Schreibt den Attributwert von Position 0,0 in die Variable F. Dabei setzt sich das Attribut folgendermassen zusammen:
Dabei ist zu beachten, daß die Bits wegen der Kompatibilität zu früheren Versionen und der 8-Farben Hardware im Bildspeicher physisch anders angeordnet sind:
6 Tastatur 6.1 INPUT [INP] Es können durch Kommata getrennt Zeichenketten und Variablen angegeben werden. Die Zeichenketten werden ausgegeben, die Variablen bewirken einen Eingabecursor. Falsch eingegebene Zeichen können mit der Backspace-Taste korrigiert werden. Es ist auch möglich, Ausdrcke einzugeben die dannüberechnet werden. Das folgende Beispiel zeigt einen kleinen Rechner, das letzte Ergebnis ist in der Variable M gespeichert.
6.2 CTEXT adr,anz Kopiert den zuletzt bei Input eingegebenen Text in das Array byteweise ab Element adr. Als Endemarkierung wird ein Nullbyte angehängt. Mit dem 2.Parameter anz wird die Anzahl der maximal einzulesenden Bytes begrenzt. Dabei ist zu beachten, dass wegen dem angehängten Nullbyte effektiv anz+1 Bytes kopiert werden.
Der nach der Eingabeaufforderung eingegebene Text wird eine Zeile tiefer wiederholt. 6.3 RKEY Der Befehl RKEY ist durch die Funktion V=KEY(0) ersetzt worden. 6.4 WKEY Der Befehl WKEY ist durch die Funktion V=KEY(1) ersetzt worden. Es wird auf einen Tastendruck gewartet und die gedrückte Taste wird in die Variable V geschrieben.
Es wird auf einen Tastendruck gewartet und der aktuelle Tastaturcode in die Variable P geschrieben. 6.5 Die Keycodes Neben den "normalen" ASCII-Werten für Ziffern, Zahlen und Satzzeichen liefern RKEY und WKEY auch Codes für Funktionstasten etc.
6.6 Die Funktion KEY Diese Funktion liefert verschiedene Tastaturabfragen als -1,0,1 Wert. Als Parameter wird die Art der Abfrage eingetragen. Bei KEY(0) bis KEY(2) zählen Shift, CTRL und ALT nicht als gedrückte Tasten.
Belegung der Bits beim Rückgabewert von KEY(3):
7 Zeit 7.1 WAIT n Mit dem WAIT-Befehl wird N*0,1 Sekunden gewartet. N kann wieder ein beliebiger Ausdruck sein. Im Videomode 7 kann es dabei durchaus sein, dass der Treiber die Zeit nicht weiterzählt und die Funktion nicht wieder zurückkehrt. Das hängt aber von der konkreten Treiberimplementation ab.
wartet 1 Sekunde, bis das Programm fortgesetzt wird. 7.2 SYNC n Mit dem SYNC-Befehl wird auf N Bildsynchronimpuse gewartet. N kann wieder ein beliebiger Ausdruck sein. Im Videomode 7 kann es dabei durchaus sein, dass der Treiber die Zeit nicht weiterzählt und die Funktion nicht wieder zurückkehrt. Das hängt aber von der konkreten Treiberimplementation ab.
wartet 6 Sekunden, bis das Programm fortgesetzt wird. Das gilt nur für PAL, bei NTSC wird nur ca. 5 Sekunden gewartet. 7.3 TSET n Der interne Timer (10Hz) wird auf den Wert n gesetzt.
setzt den Timer auf 0. 7.4 TGET V Der interne Timer (10Hz) wird ausgelesen und in die Varaiable V gespeichert. Im Videomode 7 kann es dabei durchaus sein, dass der Treiber die Zeit nicht weiterzählt und die Funktion die bei TSET gesetzte Zeit zurückliefert. Das hängt aber von der konkreten Treiberimplementation ab.
Damit kann z.B. die Laufzeit von Programmen bestimmt werden. 7.5 ONSYNC L,N Ähnlich dem Timer-Interrupt bei einem Mikrocontroller können mit ONSYNC zeitgesteuerte Unterprogrammaufrufe eingerichtet werden. Dabei ist L die Zeilennummer und N die Anzahl der Bildsynchronimpulse zwischen zwei Aufrufen. Der Wert N für die Wartezeit kann maximal 255 betragen, L sollte eine gültige Zeilennummer sein, bei L=0 werden die automatischen Aufrufe gestoppt. Das aufgerufene Unterprogramm muß mit RETURN enden und darf nicht länger dauern als die Zeit zwischen zwei Aufrufen. Intern wird bei jedem Bildsynchronimpuls ein Zähler mit dem Wert N verglichen und bei Gleichheit ein Flag gesetzt. Im BASIC-Interpreter wird dann vor der Ausführung jedes Statements dieses Flag überprüft und falls es gesetzt ist ein GOSUB zur angegebenen Zeilennummer "eingeschoben". Im Videomode 7 kann es dabei durchaus sein, dass der Treiber die Zeit nicht weiterzählt und angegebene Zeile nie aufgerufen wird. Das hängt aber von der konkreten Treiberimplementation ab.
Dieses Programm ändert alle Sekunde die Randfarbe, während der aktuelle Border-Wert ständig als Text ausgegeben wird. 8 Fehlermeldungen und Errorhandling 8.1 ONERR N Liegt N im Bereich der gültigen Zeilen (1...95), wird bei einem Fehler in diese Zeile gesprungen. Andernfalls wird dann (wie gewohnt) mit einer Fehlermeldung abgebrochen. Befinden sich an und hinter der angegebenen Zeile keine Befehle mehr, wird das Programm ohne Fehlermeldung verlassen. Wenn mittels GOSUB eine Subroutine in einem anderen Programm aufgerufen wird, wird im Fehlerfall dort in die angegebene Zeile gesprungen.
Da versucht wird, die Wurzel aus einer negativen Zahl zu ziehen, springt das Programm in Zeile 10 und zeigt dort eine Alertbox an. 8.2 ERR(n) Über diese Funktion können Informationen über den aufgetretenen Fehler ausgelesen werden. Das funktioniert natürlich nur, wenn vorher mit ONERR eine eigene Fehlerroutine angesprungen wurde. Für n=1 wird die Zeile zurückgegeben, in der der Fehler aufgetreten ist, für n=2 das Statement. Für alle anderen Werte von n wird die Fehlernummer zurückgegeben.
Da versucht wird, die Wurzel aus einer negativen Zahl zu ziehen, gibt es wieder eine Alertbox. In Zeile 11 wird die Fehlernummer in das Array geschrieben und nun mit angezeigt. 8.3 Fehlermeldungen Insgesamt gibt es 37 verschiedene Fehlermeldungen. Im Editor werden diese oben in der zweiten Zeile mit Programm-, Zeilen- und Statementnummer angezeigt. Im Allgemeinen lässt sich damit der Fehler recht schnell finden, manchmal kann er sich auch am Ende der vorherigen Zeile befinden.
created with latex2web.pl v0.57 © 2006-2010 Joerg Wolfram |