ndr-nkc.de ndr-nbc.de
  
Startseite
News
 
NDR-NKC
Geräte Z80
Geräte 68000
Geräte 8088
 
NKC Emulator
 
Z80 Section
Baugruppen
ROM's
Software
68000 Section
Baugruppen
ROM's
PASCAL/S
Software
CP/M 68K
8088 Section
Baugruppen
Downloads
 
Bussysteme
Stromversorgung
Input / Output
Grafikkarten
Speicherkarten
Massenspeicher
Weitere Baugruppen
 
Projekte
 
Dokumentation
Datenblätter
Glossar
Portraits
Links

Impressum

 

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"