| |
Sprachumfang des CBASIC Compilers
Dieser Beitrag soll einen schnellen Überblick über die Funktionen des CBASIC Compilers bieten. Für einen schnellen Überblick können die folgenden Sprungmarken benutzt werden. Für eine vollständige Beschreibung der Funktionen und für Besonderheiten sollte das Language Reference Manual herangezogen werden.
Weitere Beiträge
Vor- und Nachteile des CBASIC Compilers
Definieren eigner Funktionen und Prozeduren
Auswertung von Kommandozeilenparametern
Arbeiten mit Dateien
Direkt zum Kapitel
Bezeichner
Variablen-Typen
Arrays
Operatoren
Programm-Stuktur
Mathematische Funktionen
Eigene Funktionen
Stringbearbeitung
Eingabe / Ausgabe
Dateibearbeitung
Hardware- und Speicher-Zugriff
Sonstige Befehle
Bezeichner
Bezeichnungen für Variablen müssen mit einem Buchstaben beginnen. Die folgenden Zeichen dürfen aus Ziffern und Punkten bestehen. Es werden Bezeichner mit bis zu 31 Zeichen unterschieden. Gültige Bezeichner sind zum Beispiel
A
B12.1
Summe.1984
Datei.Name
Ungültige Bezeichner sind zum Beispiel
1234
5times
10.String$
Variablen-Typen
CBASIC kennt 3 nur Variablentypen, die anhand des letzten Zeichens des Bezeichners unterschieden werden.
Bezeichner, die auf % enden für Integer-Zahlen
Bezeichner, die auf $ enden für Strings
Bezeichner ohne % oder $ für Fließkomma-Zahlen
Integer-Zahlen haben einen Wertebereich von -2147483648 bis 2147483647 (4 Byte)
Fließkomma-Zahlen haben einen Wertebereich von 1.0E-64 bis 9.9999E62 (8 Byte)
Strings können bis zu 2147483647 Zeichen enthalten.
Arrays
Arrays können mehrere Dimensionen haben, die Anzahl der Dimensionen ist nicht begrenzt. Die Arrays werden mit dem Schlüsselwort DIM definiert.
DIM Liste%(Anzahl%)
DIM Schachbrett$(8, 8)
DIM BIP.pro.Jahr(Land%, Jahr%)
DIM Wert%(Pos.X%, Pos.Y%)
Eine erneute Dimensionierung ist nicht möglich, beim erneuten Aufruf des DIM Befehls für ein bereits bestehendes Array werden alle Werte gelöscht und müssen neu belegt werden.
Operatoren
Operatoren haben eine Priorität bei der Abarbeitung innerhalb von Ausdrücken. Weitere Informationen dazu finden sich im Language Reference Manual.
| Priorität |
Operator |
Funktion |
Beispiel |
| 1 |
( ) |
Klammern um einen Ausdruck |
(3 + 4) * 7 = 49 |
| 2 |
^ |
Potenzierung |
2^8+4 = 260 ; 2^(8+4) = 4096 |
| 3 |
* , / |
Multiplikation, Division |
3 + 4 * 7 = 31 |
| 4 |
+ , - |
Addition, Subraktion |
3 * 4 - 12 = 0 |
| 5 |
< |
Kleiner als |
3 < 4 = -1 (wahr) ; 4 < 3 = 0 (falsch) |
| |
> |
Größer als |
3 > 4 = 0 (falsch) ; 4 > 3 = 0 (wahr) |
| |
= |
Gleich |
3 = 4 (falsch) ; 4 = 4 (wahr) |
| |
<= |
Kleiner oder Gleich |
3 <= 4 (wahr) |
| |
>= |
Größer oder Gleich |
3 >= 4 (falsch) |
| |
<> |
Ungleich |
3 <> 4 (wahr) |
| 6 |
NOT |
Logisch Nicht |
NOT 0 = 1 ; NOT 5 = 0 |
| 7 |
AND |
Logisch Und |
0F0H AND 0AAH = 160 (0A0H) |
| 8 |
OR |
Logisch Oder |
0F0H OR 0AAH = 250 (0FAH) |
| 9 |
XOR |
Logisch Exklusiv-Oder |
0F0H XOR 0AAH = 90 (05AH) |
Programm-Struktur Befehle
Hier eine Auflistung der wichtigsten Befehle zur Strukturierung eigener Programme. Die aufgeführten Beispiele sollen nur die Syntax darstellen und keinen sinnvollen Code ergeben.
| Befehl / Funktion |
Beschreibung |
Beispiele |
IF THEN ELSE |
Bedingte Ausführung von Befehlen Die Angabe von ELSE ist optional |
IF A=99 THEN PRINT "Ferig" : GOTO 100
IF A=B THEN PRINT "Gleich" ELSE PRINT "Ungleich" |
FOR STEP NEXT |
Ausführung von Befehlen in einer Schleife Eine FOR Schleife wird mindestens einmal ausgeführt. Die Angabe von STEP ist optional |
FOR i% = 0 to 10 STEP 2
PRINT "Durchlauf" + STR$(i%)
NEXT I% |
WHILE WEND |
Ausführung von Befehlen in einer Schleife Eine WHILE Schleife wird nur betreten, wenn die Bedingung wahr ist |
WHILE X > Z
PRINT X
WEND |
GOTO |
Unbedingte Verzweigung Das Sprungziel muss durch eine Zeilennummer erreichbar sein |
IF A=B THEN GOTO 100 ELSE GOTO 200
100 Print "A ist gleich B"
200 END |
GOSUB RETURN |
Aufruf von Unterprogrammen Das Unterprogramm muss durch eine Zeilennummer erreichbar sein |
GOSUB 100 : GOSUB 200 : GOTO 900
100 Print "Unterprogramm 100" : RETURN
200 Print "Unterprogramm 200" : RETURN
900 END |
ON GOTO ON GOSUB |
Verzweigung anhand eines Ausdrucks Der Ausdruck muss zwischen 1 und der Anzahl der angegebenen Sprungziele liegen |
i% = 2 : REM bewirkt GOTO / GOSUB 200
ON i% GOTO 100, 200, 300
ON i% GOSUB 100, 200, 300 |
END |
Ende des Programms Die Anweisung END ist optional, muss aber immer am Ende des Quelltextes stehen |
PRINT "Testprogramm"
END |
STOP |
Beendet das Programm Die Anweisung STOP darf im Gegensatz zu END auch mitten im Quelltext verwendet werden |
GOSUB 100 : GOSUB 200 : STOP
100 Print "Unterprogramm 100" : RETURN
200 Print "Unterprogramm 200" : RETURN |
REM |
Kommentar REM Anweisungen können am Ende jeder Programmzeile eingesetzt werden |
Print "Start" : REM Programmstart (OK)
a% = 100 : REM A setzen : b% = 200 : REM Fehler |
CHAIN |
Aufruf und Start eines anderen Programmteils Die Angabe des Laufwerks ist optional |
CHAIN "B:DISPLAY" |
COMMON |
Definition globaler Variablen Mit Common definierte Variablen sind auch in mit CHAIN nachgeladenen Programmen verfügbar |
name$ = "Testmann" : vorname$ = "Hans"
COMMON name$, vorname$
CHAIN "B:DISPLAY"
PRINT vorname$+" "+name$ : REM in DISPLAY.INT |
Mathematische Funktionen
CBASIC unterstützt die wichtigsten mathematischen Funktionen. Wenn weitere Funktionen benötigt werden empfiehlt es sich, diese mittels DEF / FEND in einer eigenen Include-Datei umzusetzen. Alle Winkelberechnungen erfolgen in RAD.
| Befehl / Funktion |
Beschreibung |
Beispiele |
ABS |
Bildet den Absolut-Wert einer Zahl |
Ergebnis = ABS(zahl) |
ATN |
Bildet den Arcus-Tangens des Winkels |
Ergebnis = ATN(Winkel) |
COS |
Bildet den Cosinus des Winkels |
Ergebnis = COS(Winkel) |
EXP |
Berechnet der Wert von e hoch x |
Ergebnis = EXP(x) |
FLOAT |
Konvertiert eine Integer-Zahl in eine Real-Zahl |
Ergebnis = FLOAT(x%) |
INT |
Ermittelt den ganzzahligen Anteil einer Real-Zahl |
Ergebnis = INT(x) |
INT% |
Konvertiert eine Real-Zahl in eine Integer-Zahl |
Ergebnis% = INT%(x) |
LOG |
Bildet den natürlichen Logarithmus einer Real-Zahl |
Ergebnis = LOG(x) |
SGN |
Ermittelt das Vorzeichen einer Real-Zahl Liefert -1 bei negativen, +1 bei positiven Zahlen, 0 bei 0 |
Ergebnis = SGN(x) |
SIN |
Bildet den Sinus des Winkels |
Ergebnis = SIN(Winkel) |
SQR |
Berechnet die Quadratwurzel von x |
Ergebnis = SQR(x) |
TAN |
Bildet den Tangens des Winkels |
Ergebnis = TAN(Winkel) |
Eigene Funktionen
Durch die Verwendung eigener Funktionen kann die Lesbarkeit und Wartbarkeit eigener Programme deutlich erhöht werden. Anders als bei der Verwendung von GOSUB mit Zeilennummern können Funktionen über einen selbst definierten Namen aufgerufen werden. Alle eigenen Funktionen müssen vor deren Benutzung deklariert werden.
| Befehl / Funktion |
Beschreibung |
Beispiele |
DEF |
Definition einer einzeiligen eigenen Funktion Geeignet für einfache mathematische Ausdrücke |
DEF DOUBLE(A) = 2 * A |
DEF FEND |
Definition mehrzeiliger eigener Funktionen Für komplexere Berechnungen in der Funktion |
DEF MAX(A,B)
IF A>B THEN MAX=A ELSE MAX=B
FEND |
Stringbearbeitung
Strings können in CBASIC bis zu 65535 Zeichen umfassen, einen speziellen Datentyp CHAR gibt es nicht.
| Befehl / Funktion |
Beschreibung |
Beispiele |
ASC |
Gibt den ASCII-Wert des ersten Zeichens im String zurück |
ASCII% = ASC(String$) |
CHR$ |
Gibt das dem ASCII-Wert entsprechenden Zeichen zurück |
Zeichen$ = CHR$(x) |
COMMAND$ |
Enthält die Parameter-Liste beim Programm-Aufruf Führende Leerzeichen sind entfernt, alle Zeichen sind auf Großbuchstaben gewandelt. |
Kommandos$ = COMMAND$ |
LEN |
Gibt die Anzahl der Zeichen in einem String zurück |
Anzahl% = LEN(Text$) |
LEFT$ |
Gibt die ersten n Zeichen des Strings zurück |
Teil$ = LEFT$(Text$, n%) |
MID$ |
Gibt n Zeichen ab der Position s des Strings zurück |
Teil$ = MID$(Text$, s%, n%) |
RIGHT$ |
Gibt die letzen n Zeichen des Strings zurück |
Teil$ = RIGHT$(Text$, n%) |
MATCH |
Sucht nach dem ersten Auftreten von A$ in B$ Die Suche beginnt bei S% |
p% = MATCH(A$, B$, S%) |
STR$ |
Wandelt eine Zahl in einen String |
PRINT "PI=" + STR$(3.1415) |
VAL |
Wandelt einen String in eine Zahl |
Pi = VAL("3.1415") |
UCASE$ |
Wandelt einen String in Großbuchstaben |
PRINT UCASE$("Das ist ein Test") |
Eingabe und Ausgabe
CBASIC unterstützt die direkte Ausgabe auf dem Bildschirm und auf dem Drucker. Dazu werden die gleichen Befehle genutzt, das Ausgabeziel wird mit CONSOLE (Bildschirm) und LPRINTER (Drucker) umgeschaltet
| Befehl / Funktion |
Beschreibung |
Beispiele |
CONCHAR% |
Liest ein Zeichen von der Konsole (Tastatur) |
z% = CONCHAR%
PRINT CHR$(z%); |
CONSTAT% |
Ermittelt den Status der Konsole (Tastatur) Rückgabe ist -1 wenn ein Zeichen vorhanden ist, sonst 0 |
WHILE NOT CONSTAT%
C$ = STR$(CONCHAR%)
WEND |
INPUT |
Eingabe von der Konsole (Tastatur) |
INPUT NAME$, VORNAME$
INPUT "Enter Filename:"; NAME$ |
POS |
Gibt die nächste Ausgabeposition zurück. Je nachdem, ob CONSOLE oder LPRINTER aktiv ist, wir die Position des Bildschirms oder Druckers zurückgegeben. |
i% = POS
PRINT "Ausgabe bei:";STR$(i%) |
PRINT |
Ausgabe auf der Konsole (Bildschirm) |
PRINT "Test"
PRINT A$, B$, X%, "Test" : REM Tabulatoren
PRINT C$; : REM kein Zeilenvorschub |
PRINT USING |
Formatierte Ausgabe auf der Konsole (Bildschirm) |
PRINT USING "Wert = #.######"; MATH.PI
PRINT USING "Name: &, &"; NAME$, VORNAME$ |
TAB |
Bestimmt die Position der nächsten Ausgabe. Beachtet, ob CONSOLE oder LPRINTER aktiv ist. |
PRINT TAB(20); "Test";
PRINT TAB (LEN(STR$(NUMBER))); "*" |
CONSOLE |
Lenkt die Ausgabe von PRINT auf die Konsole. |
CONSOLE |
LPRINTER |
Lenkt die Ausgabe von PRINT auf den Drucker. |
LPRINTER |
Dateibearbeitung
In CBASIC können bis zu 20 gleichzeitig geöffnete Dateien verwaltet werden. Ein weiterer Artikel befasst sich intensiver mit den Datei-Funktionen von CBASIC. Datei-Operationen vergrößern den Umfang der ausführbaren Datei dramatisch auf mindestens 42 kByte.
| Befehl / Funktion |
Beschreibung |
Beispiele |
CREATE |
Erstellt eine neue Datei. |
CREATE "INPUT.TXT" AS 1
CREATE "OUTPUT.TXT" AS 2 |
CLOSE |
Schließt eine oder mehrere zuvor geöffnete Dateien. |
CLOSE Datei1%, Datei2% |
DELETE |
Löscht eine oder mehrere Dateien vom Datenträger. |
DELETE Datei1%, Datei2% |
FILE |
Öffnet eine oder mehrere Dateien Optional kann die Satzlänge angegeben werden. Die Dateinummern werden fortlaufend vergeben. |
FILE "RESULT.TXT"
FILE "RECORDS.DAT" (32)
FILE first$, second$ |
IF END |
Erlaubt das Erkennen des Dateiendes. IF END ist solange aktiv, bis die Datei geschlossen oder gelöscht wird. |
OPEN "OUTPUT.TXT" AS 1
IF END #1 THEN 100
WHILE 1: READ #1; LINE L$: WEND
100 CLOSE 1
|
INITIALIZE |
Erlaubt das Wechseln von Disketten. vor dem Wechsel von Disketten bei laufendem Programm müssen alle Dateien geschlossen werden. |
INITIALIZE |
OPEN |
Öffnet eine bestehende Datei.Eine nicht vorhandene Datei wird wie eine leere Datei behandelt. |
Input.File% = 1
OPEN "INPUT.TXT" AS Input.File% |
PRINT # |
Datenausgabe in eine Datei. Bei der Ausgabe in die Datei werden Strings inklusive der Anführungszeichen ausgegeben. Die Argumente sind auch in der Datei durch ein Komma getrennt. |
PRINT #1; "Hello","World",100 |
PRINT USING # |
Formatierte Ausgabe in eine Datei. |
PRINT USING "&"; #1; "Hallo Welt"
PRINT USING "##### #####"; #1; A%, B%
PRINT USING "Ergebnis = #####"; #1; 12345 |
READ # |
Liest einen Datensatz aus einer Datei.
|
PRINT #1; 100,200
READ #1, RecNo%; A%, B%
PRINT L$ |
READ # LINE |
Sequentielles Lesen aus einer Textdatei. Bei jedem READ wird eine Zeile der Textdatei gelesen und in der String-Variable abgelegt. |
READ #1 LINE L$
PRINT L$ |
RENAME |
Benennt eine Datei um. Rückgabe ist -1 für OK bzw. 0 bei Fehler |
result% = RENAME("NEW.TXT", "OLD.TXT) |
SIZE |
Ermittelt die Größe einer Date in kByte. |
s% = SIZE("OUTPUT.TXT")
PRINT USING "Größe = ### kB"; s% |
Hardware- und Speicher-Zugriff
Mit den folgenden Befehlen besteht die Möglichkeit, die Hardware des NKC direkt anzusteuern, auf den Speicher zuzugreifen und zeitkritische Routinen in Assembler zu adressieren.
| Befehl / Funktion |
Beschreibung |
Beispiele |
INP |
Liest einen Wert von einem Port bzw. Port-Aadresse. |
IOE0% = 0FFFFFF30H
X% = INP(IOE0%) : PRINT X% |
OUT |
Schreibt einen Wert auf einen Port bzw. Port-Adresse. |
IOE0% = 0FFFFFF30H
OUT IOE0%, 0AAH |
PEEK |
Liest den Inhalt einer Speicheradresse. Es wird immer genau 1 Byte gelesen (0...255) |
ADDR% = 0400H
BYTE% = PEEK(ADDR%) |
POKE |
Ändert den Inhalt einer Speicheradresse. |
ADDR% = 10000H : VALUE% = 0AAH
POKE ADDR%, VALUE% |
SADD |
Ermittelt die Adresse eines Strings. Die ersten 4 Bytes enthalten die Länge des Strings, danach folgen die ASCII Zeichen und 00H als Abschluss des Strings. |
A$ = "Hallo Welt" : A% = SADD$(A$)
LEN% = PEEK(A%+2)*256 + PEEK(A%+3)
PRINT LEN% |
VARPTR |
Ermittelt die Adresse einer Variablen. |
X% = 0 : ADR% = VARPTR(X%)
POKE ADR+3%, 5 : PRINT X% |
SAVEMEM |
Reserviert Platz für Code in Maschinensprache. Der Platz sollte ein Vielfaches der Sektorgröße 128 Bytes sein. |
SAVEMEM 1024, "CODE.O" |
CALL |
Aufruf eines Maschinensprache-Unterprogramms. Den Aufruf von Maschinensprache-Programmen behandelt ein getrennter Beitrag. |
CALL Adresse |
Sonstige Befehle
Zum Abschluss noch einige Funktionen und Befehle, die nicht so recht in die bisherigen Kategorien passen..
| Befehl / Funktion |
Beschreibung |
Beispiele |
DATA |
Dient zum Definieren von Konstanten. DATA Anweisungen werden nicht ausgeführt, die definierten Konstanten können sequentiell mit READ gelesen werden. |
DATA 3.14159, 1%, "Hallo"
DATA 2.71828, 2%, "Welt" |
READ |
Liest Werte, die mit DATA definiert wurden. READ beginnt beim ersten DATA Statement im Programm, bis die Leseposition mit RESTORE zurückgesetzt wird. |
READ PI, NUM1%, STRING1$
READ E, NUM2%, STRING2$ |
RESTORE |
Erlaubt das erneute Einlesen der Konstanten. Nach einem RESTORE werden die mit DATA definierten Konstanten wieder von vorn gelesen. |
RESTORE
READ PI, NUM1%, STRING1$ |
FRE |
Ermittelt den Umfang des freien Speichers.Der freie Speicher wird in Bytes ermittelt. |
X% = FRE : PRINT X%
IF FRE<10000 THEN PRINT "Low Memory" |
RANDOMIZE |
Initialisiert den Generator für Zufallszahlen.RANDOMIZE sollte nach einer Benutzeraktion oder nach einer nicht vorhersehbaren Programmlaufzeit erfolgen. |
RANDOMIZE |
RND |
Berechnet eine Zufallszahl zwischen 0 und 1.Bei jedem Programmstart erzeugt RND die gleiche Sequenz an Zufallszahlen, wenn RANDOMIZE nicht genutzt wird. |
X = RND
IF RND>0.5 THEN PRINT "Kopf" ELSE PRINT "Zahl" |
|