BASIC-Compiler

Anweisungen


Der Compiler kennt folgende BASIC-Anweisungen:
 ASM  BORDER  CALL  CIRCLE  CLOSE  CLS  COLOR  CURSOR  DATA  DECLARE  DEF  DEFUSR  DIM  DO  DOKE  DRAW  DRAWR  ELSE  ELSEIF  END  ENDIF  EXIT  FOR  FUNCTION  GOSUB  GOTO  IF  INCLUDE  INK  INPUT  LABEL  LET  LINE  LINE INPUT  LOCAL  LOCATE  LOOP  LPRINT  MOVE  MOVER  NEXT  ON...GOSUB  ON...GOTO  OPEN  OUT  PAINT  PAPER  PASSWORD INPUT  PAUSE  PEN  PLOT  PLOTR  POKE  PRESET  PRINT  PSET  READ  REM  RESTORE  RETURN  SCREEN  SELECT CASE  SUB  SWAP  WAIT  WEND  WHILE

Klicken Sie auf eine Anweisung, um zu ihrer ausführlichen Beschreibung mit Syntax und Bedeutung zu springen. Wenn dort keine Syntax angegeben ist, hat die Anweisung keine Argumente.

1. Liste der Anweisungen

AnweisungBedeutung
ASM Assemblerquelltext einfügen
BORDER Randfarbe setzen
CALL Aufruf eines in Maschinencode vorliegenden Unterprogramms
CIRCLE Kreis zeichnen
CLOSE Datei oder Ein-/Ausgabekanal schließen
CLS Bildschirm löschen
COLOR Farben setzen
CURSOR Cursor aus- oder einschalten
DATA Angabe von numerischen Werten und Zeichenketten, die mit READ gelesen werden können
DECLARE Benutzerdefinierte Funktion oder Prozedur deklarieren
DEF Adresse einer USR-Funktion festlegen
DEFUSR Adresse einer USR-Funktion festlegen
DIM Globale Variablen deklarieren
DO Beginn einer DO-Schleife
DOKE 16-Bit-Wert in den Arbeitsspeicher schreiben
DRAW Linie zeichnen
DRAWR Linie zeichnen
ELSE Teil einer IF-Anweisung
ELSEIF Weitere Verzweigung in einer IF-Anweisung
END Funktion, Prozedur oder BASIC-Programm beenden
ENDIF Ende einer IF-Anweisung
EXIT Vorzeitiges Verlassen einer Schleife
FOR Beginn einer FOR-Schleife
FUNCTION Implementierung einer benutzerdefinierten Funktion
GOSUB Aufruf eines Unterprogramms
GOTO Spung zu einer anderen Programmstelle
IF Bedingte Verzweigung
INCLUDE Einbinden einer weiteren Quelltextdatei
INK Vordergrundfarbe setzen
INPUT Zahlen und Zeichenketten mit der Tastatur eingeben oder von einem Eingabekanal lesen
LABEL Text im Grafikmodus ausgeben
LET Einer Variable einen Wert zuweisen
LINE Linie oder Rechteck zeichnen
LINE INPUT Textzeile eingeben oder von einem Eingabekanal lesen
LOCAL Lokale Variablen deklarieren
LOCATE Cursor positionieren
LOOP Ende einer DO-Schleife
LPRINT Ausgabe auf dem Drucker
MOVE Grafik-Cursor absolut positionieren
MOVER Grafik-Cursor relativ positionieren
NEXT Ende einer FOR-Schleife
ON...GOSUB Aufruf eines Unterprogramms aus einer Liste von Unterprogrammen
ON...GOTO Sprung zu einer Zeile aus einer Liste von Zeilennummern oder Marken
OPEN Datei oder Ein-/Ausgabekanal öffnen
OUT Ausgabe eines Wertes an einem Ausgabetor (Port)
PAINT Fläche füllen
PAPER Hintergrundfarbe setzen
PASSWORD INPUT Eingabe eines Kennworts
PAUSE Programm anhalten
PEN Grafikstift (Art des Pixelsetzens) festlegen
PLOT Grafik-Cursor absolut positionieren und Pixel setzen
PLOTR Grafik-Cursor relativ positionieren und Pixel setzen
POKE 8-Bit-Wert in den Arbeitsspeicher schreiben
PRESET Pixel auf dem Bildschirm zurücksetzen
PRINT Ausgabe auf dem Bildschirm oder einem Ausgabekanal
PSET Pixel auf dem Bildschirm setzen
READ Lesen von Werten aus mit DATA angegeben Daten
REM Kommentar
RESTORE Setzen oder Zurücksetzen der Leseposition für READ
RETURN Ende eines Unterprogramms
SCREEN Einstellen eines Bildschirm- bzw. Grafikmodus
SELECT CASE Bedingte Verzweigungen
SUB Implementierung einer benutzerdefinierten Prozedur
SWAP Tauschen der Werte zweier Variablen
WAIT Warten auf einen bestimmten Wert an einem Eingabetor
WEND Ende einer WHILE-Schleife
WHILE Beginn einer WHILE-Schleife


2. Beschreibung der Anweisungen

In spitzen Klammern eingeschlossene Elemente dienen als Platzhalter und sind entsprechend zu ersetzten. In eckigen Klammern eingeschlossene Elemente sind optional und können weggelassen werden.

ASM

Syntax: ASM [ CODE ] <Zeichenkette> [, <Zeichenkette> [, ...]]
ASM DATA <Zeichenkette> [, <Zeichenkette> [, ...]]
ASM BSS <Zeichenkette> [, <Zeichenkette> [, ...]]
Zeichenkette:String-Literal

Mit der ASM-Anweisung kann man im BASIC-Programm eigene Assemblerroutinen schreiben. Dabei werden die angegebenen Zeichenketten unverändert in den vom Compiler erzeugten Assemblerquelltext eingefügt.

Die erste Version mit dem Schlüsselwort CODE fügt den Assemblertext an der aktuellen Stelle im Code-Segment ein. Das Schlüsselwort CODE kann auch weggelassen werden. Beim Schlüsselwort DATA wird der Assemblercode an das Datensegment angehängt. In den Zeichenketten sollten deshalb nur die Mnemoniks DB und DW bzw. deren äquivalente Pseudobefehle vorkommen. Bei BSS wird der Assemblercode in das Segment für die Speicherzellen geschrieben und sollte deshalb nur DS-Mnemoniks enthalten.

Neben der ASM-Anweisung gibt es auch die ASM-Funktion.

Achtung! Lesen Sie bitte die Hinweise zum Einbinden von eigenem Assembler-Quellcode!

BORDER

Syntax: BORDER <Integer-Ausdruck>

Die Anweisung setzt die Farbe des Bildschirmrandes. Die Nummer der Farbe hängt vom Zielsystem ab. Zum Schreiben von portablen Quelltext kann man die Farbe auch mit einer Konstante angeben, z.B.:

 BORDER GREEN

Auf einem Zielsystem, auf dem keine Randfarbe gesetzt werden kann, hat die Anweisung keine Wirkung.

CALL

Syntax: CALL <Adresse>
CALL * <Hex-Adresse>
Adresse:Integer-Ausdruck
Hex-Adresse:Adresse als Hexadezimalzahl

Die CALL-Anweisung ruft ein Maschinencodeunterprogramm auf, welches auf der angegebenen Adresse beginnt und mit einem Return-Befehl abgeschlossen sein muss. Im Gegensatz zur USR-Funktion können keine Werte übergeben werden.

CIRCLE

Syntax: CIRCLE <X> , <Y> , <Radius>
CIRCLE ( <X> , <Y> ) , <Radius>
X: Integer-Ausdruck
Y: Integer-Ausdruck
Radius: Integer-Ausdruck

Die CIRCLE-Anweisung zeichnet einen Kreis mit dem Mittelpunkt (X,Y) und dem angegebenen Radius. Der Grafik-Cursor wird nicht beeinflusst.

CLOSE

Syntax: CLOSE # <Kanal>
Kanal: Integer-Ausdruck mit dem Wert 1 oder 2

Die Anweisung schließt den angegebenen Ein-/Ausgabekanal und setzt die Fehlervariablen ERR und ERR$. Im Fall eines Ausgabekanals werden evtl. gepufferte Daten noch geschrieben, bevor der Kanal geschlossen wird.

CLS

Die CLS-Anweisung löscht den Bildschirm und setzt den Cursor in die linke obere Ecke. Wurde im Monitorprogramm oder über die entsprechende Systemfunktion ein Fenster eingestellt, gilt die CLS-Anweisung nur für den Fensterbereich.

COLOR

Syntax: COLOR <Vordergrundfarbe>
COLOR <Vordergrundfarbe> , <Hintergrundfarbe>
COLOR <Vordergrundfarbe> , <Hintergrundfarbe> , <Randfarbe>
Vordergrunddarbe: Integer-Ausdruck
Hintergrundfarbe: Integer-Ausdruck
Randfarbe: Integer-Ausdruck

Die COLOR-Anweisung dient zum Festlegen der Vordergrundfarbe und optional auch der Hintegrund- bzw. Randfarbe. Die Farben können auch einzeln mit den Anweisungen INK, PAPER und BORDER festgelegt werden.

CURSOR

Syntax: CURSOR <Integer-Ausdruck>

Die CURSOR-Anweisung dient zum Ein- und Ausschalten des Text-Cursors. Wird der Wert 0 übergeben, schaltet die Anweisung den Cursor aus, bei jedem anderen Wert dagegen ein.

Achtung! Die CURSOR-Anweisung wird nicht für alle Zielsysteme unterstützt (siehe Hinweise zu den Zielsystemen). Wenn sie für ein System nicht unterstützt wird, kann sie aber zum Schreiben von portablen BASIC-Programmen trotzdem verwendet werden. Sie hat dann nur keine Wirkung.

DATA

Syntax: DATA <konstanter Ausdruck> [ , ... ]
konstanter Ausdruck: Zahlen- oder Zeichenkettenliteral

Mit DATA werden Daten (numerische Werte oder Zeichenketten) einem applikationsweiten Datenbereich hinzugefügt. Die Daten sind durch Komma zu trennen und müssen Literale sein, d.h. Zahlen oder in Doppelhochkomma eingeschlossene Zeichenketten.

Das Lesen und damit die Nutzbarmachung dieser Daten erfolgt mit der Anweisung READ, z.B.:

FOR I=1 TO 12
  READ M$,N
  PRINT M$;":";N;"Tage"
NEXT I
END

DATA "Jan",31,"Feb",28,"Mar",31,"Apr",30,"Mai",31,"Jun",30
DATA "Jul",31,"Aug",31,"Sep",30,"Okt",31,"Nov",31,"Dez",30

DECLARE

Syntax: DECLARE FUNCTION <Funktionsname>
DECLARE FUNCTION <Funktionsname> ( <Argumentname> [ , ... ] )
DECLARE SUB <Prozedurname>
DECLARE SUB <Prozedurname> ( <Argumentname> [ , ... ] )

Die Anweisung deklariert eine benutzerdefinierte Funktion oder Prozedur, damit sie vor deren eigentliche Implementierung (Anweisungen FUNCTION und SUB) aufgerufen werden kann. Lesen Sie bitte auch die Erläuterungen zu den benutzerdefinierten Funktionen und Prozeduren!

DEF USR
DEFUSR

Syntax: DEF USR <Funktionsnummer> = <Adresse>
DEFUSR <Funktionsnummer> = <Adresse>
Funktionsnummer:0...9
Adresse:Integer-Ausdruck

Die Anweisung legt die Adresse für eine der zehn möglichen USR-Funktionen fest. Die Adresse kann während der Programmausführung beliebig oft neu festgelegt werden.

DEF USR 0 = &H4000
PRINT USR 0 (123)

Die einzelnen Teile können auch teilweise oder komplett zusammengeschrieben werden, z.B.:

DEF USR0 = &H4000
DEFUSR 0 = &H4000
DEFUSR0 = &H4000

DIM

Syntax: DIM <Name> [, ... ]
DIM <Name> AS <Typ> [, ... ]
DIM <Name> ( <Dimension> ) [, ... ]
DIM <Name> ( <Dimension> ) AS <Typ> [, ... ]
DIM <Name> ( <Dimension> , <Dimension> ) [, ... ]
DIM <Name> ( <Dimension> , <Dimension> ) AS <Typ> [, ... ]
Name: Name der zu deklarierenden Variable
Typ: DECIMAL, INTEGER, LONG oder STRING
Dimension:Integer-Literal

Die Anweisung deklariert Variablen, die im gesamten BASIC-Programm (Hauptprogramm und benutzerdefinierte Prozeduren/Funktionen) verwendet werden können und somit eine globale Sichtbarkeit haben. Die Variablen können sowohl einfache Variablen als auch ein- oder zweidimensionale Felder sein. Feldvariablen mit mehr als zwei Dimensionen werden nicht unterstützt. Bei Feldern sind die einzelnen Dimensionen in Klammern hinter dem Variablennamen anzugeben. Jede Dimensionsangabe muss einen konkreten Wert haben. Variable Dimensionsangaben sind nicht möglich. Die Anzahl der Elemente in einer Dimension ist um eins größer als die Dimensionsangabe selbst, da das erste Element den Index 0 hat.

Hinter dem Namen bzw. hinter den Dimensionen kann mit AS ein Typ angegeben werden. Fehlt diese Angabe, wird der Typ aus dem Namen ermittelt: Endet der Name auf ein $-Zeichen, ist der Typ String, anderenfalls Integer.

Beispiele mit Typangabe:

DIM A AS INTEGER, grosse_zahl AS LONG, C(3) AS INTEGER, ein_text$(4,5) AS STRING

Beispiele ohne Typangabe (nur Integer und String möglich):

DIM D, ein_feld(8), T$(4,5)

Hinweis: Im Sinne eines "sauberen Programmierstils" ist es empfehlenswert, den Typ immer anzugeben.

Die DIM-Anweisung muss im BASIC-Quelltext vor der ersten Benutzung der Variable stehen. Das ist unabhängig vom eigentlichen Programmablauf. Folgendes Beipiel würde in einem BASIC-Interpreter funktionieren, bringt aber im JKCEMU-BASIC-Compiler in Zeile 110 einen Syntax-Fehler, da zu dem Zeitpunkt die DIM-Anweisung in Zeile 200 noch nicht compiliert wurde und deshalb die Variable A in Zeile 110 als einfache Variable angesehen wird:

100 GOSUB 200
110 A(1,0)=12
120 ...
200 DIM A(10,20)
210 RETURN

Richtig ist:

100 DIM A(10,20)
110 A(1,0)=12
120 ...

DO

Die DO-Anweisung markiert den Anfang einer nicht abweisenden Schleife, d.h. die Schleife wird in jedem Fall mindestens einmal durchlaufen (es sei denn, schon der erste Durchlauf wird mit EXIT abgebrochen). Das Ende der Schleife wird mit der LOOP-Anweisung festgelegt. Dort kann eine Bedingung angegeben werden, mit der die Anzahl der Schleifendurchläufe gesteuert wird. Ohne eine Bedingung ist die DO-Schleife eine Endlosschleife.

DOKE

Syntax: DOKE <Adresse> , <Wert>
Adresse:Integer-Ausdruck
Wert:Integer-Ausdruck

Der Wert des zweiten Integer-Ausdrucks wird in Form von zwei Bytes in den Arbeitsspeicher ab der angegebenen Adresse geschrieben.

DRAW

Syntax: DRAW <X> , <Y>
DRAW TO <X> , <Y>
DRAW ( <X> , <Y> )
DRAW TO ( <X> , <Y> )
DRAW STEP ( <X> , <Y> )
DRAW <Macro>
X: Integer-Ausdruck
Y: Integer-Ausdruck
Macro: einfacher String-Ausdruck

Die DRAW-Anweisung gibt es in drei Varianten. Die erste Variante mit einer Positionsangabe zieht eine Linie von der aktuellen Position des Grafik-Cursors zu der angegebenen absoluten Position (Endpunkt der Linie). Der Grafik-Cursor zieht dabei mit, d.h., er steht nach dem Zeichnen auf dem Endpunkt der Linie.

Die zweite Variante mit dem Schlüsselwort STEP unterscheidet sich von der ersten Variante nur in dem Punkt, dass der Endpunkt der Linie nicht absolut sondern relativ angegeben wird, d.h., diese Variante ist identisch zur DRAWR-Anweisung.

Die dritte Variante mit einem String-Ausdruck als Argument ist der sogenannte Macro-Modus. Dieser dient zum Zeichnen von komplexen Figuren. Die übergebene Zeichenkette enthält ein Macro, d.h. eine Folge von Kommandos, die nacheinander abgearbeitet werden. Jedes einzelne Kommando beginnt mit einem Buchstaben (Groß-/Kleinschreibung ist dabei egal), dem ein Argument folgen kann. Es gibt acht Kommandos zum Zeichnen einer Linie in eine bestimmte Richtung:

H U E
\ | /
L - Grafik-Cursor - R
/ | \
G D F


Direkt hinter dem Buchstaben kann mit einer Zahl die Länge der zu zeichnenden Linie angegeben werden. Fehlt die Zahl, wird nur ein Pixel gezeichnet.

Weitere Kommandos sind M und B. Bei M wird eine Position angegeben, zu der die Linie gezeichnet wird. Die Positionsangabe folgt direkt hinter dem Buchstaben und besteht aus der X-Koordinate, einem Komma und der Y-Koordinate. Wenn die X-Koordinate mit einem Vorzeichen beginnt (+ oder -), wird die Position als relative Position angesehen, anderenfalls als absolute.

Das letzte vorhandene Kommando B besagt, dass beim nächsten Kommando nicht gezeichnet, sondern nur der Grafik-Cursor entsprechend verschoben wird.

Die folgende Tabelle fasst die Marco-Kommandos der DRAW-Anweisung zusammen:
Macro-KommadoBedeutung
U Linie einen Pixel nach oben zeichnen
U<Anzahl> Linie Anzahl Pixel nach oben zeichnen
D Linie einen Pixel nach unten zeichnen
D<Anzahl> Linie Anzahl Pixel nach unten zeichnen
L Linie einen Pixel nach links zeichnen
L<Anzahl> Linie Anzahl Pixel nach links zeichnen
R Linie einen Pixel nach rechts zeichnen
R<Anzahl> Linie Anzahl Pixel nach rechts zeichnen
E Linie einen Pixel nach rechts oben zeichnen
E<Anzahl> Linie Anzahl Pixel nach rechts oben zeichnen
F Linie einen Pixel nach rechts unten zeichnen
F<Anzahl> Linie Anzahl Pixel nach rechts unten zeichnen
G Linie einen Pixel nach links unten zeichnen
G<Anzahl> Linie Anzahl Pixel nach links unten zeichnen
H Linie einen Pixel nach links oben zeichnen
H<Anzahl> Linie Anzahl Pixel nach links oben zeichnen
M<X>,<Y> Linie zur angegebenen absoluten Position zeichnen
M<Vorzeichen><X>,[<Vorzeichen>]<Y> Linie zur angegebenen relativen Position zeichnen
B beim nächsten Macro-Befehl nicht zeichnen, sondern nur den Grafik-Cursor verschieben

Beispiel: Zeichnen von nebeneinander stehenden Häusern:

H$="U25E15F15D25L30BR4U18R8D17BM+6,7U10R8D10L8"
FOR X=0 TO W_PIXEL STEP 40
  MOVE X,0
  DRAW H$
NEXT X


Achtung! Für alle Varianten der DRAW-Anweisung gilt, dass das Pixel im Anfangspunkt nicht gesetzt wird. Das Zeichnen beginnt erst mit dem ersten Pixel hinter dem Anfangspunkt. Dadurch wird sichergestellt, dass beim Zeichnen von Polygonen mit Hilfe von DRAW-Macros oder mehreren hintereinander folgenden DRAW-Anweisungen kein Pixel doppelt gesetzt wird. Das ist besonders wichtig bei der Verwendung des XOR-Stiftes (siehe PEN-Anweisung). Wegen diesem Verhalten gibt es auch die unterschiedlichen Anweisungen MOVE und PLOT bzw. deren Varianten MOVER und PLOTR. Möchte man ein geschlossenes Polygon zeichnen, muss man mit MOVE den Grafik-Cursor setzten, damit kein Pixel doppelt gezeichnet wird. Bei einem offenen Polygon empfiehlt sich PLOT, damit kein Pixel fehlt.

Lesen Sie bitte auch die Hinweise zur Grafikunterstützung!

DRAWR

Syntax: DRAWR <X> , <Y>
DRAWR ( <X> , <Y> )
X: Integer-Ausdruck
Y: Integer-Ausdruck

Die DRAWR-Anweisung zieht eine Linie von der aktuellen Position des Grafik-Cursors zu der mit relativen Koordinaten angegebenen Position (Endpunkt der Linie). Ansonsten gilt das gleiche wie bei der DRAW-Anweisung.

END

Syntax: END
END FUNCTION
END SUB

Steht die END-Anweisung innerhalb einer benutzerdefinierten Funktion oder Prozedur, wird diese beendet. In dem Fall kann hinter END zusätzlich das Schlüsselwort FUNCTION bzw. SUB angegeben werden, je nachdem, ob es sich um eine Funktion oder Prozedur handelt. Außerhalb einer Funktion bzw. Prozedur beendet die END-Anweisung das BASIC-Programm.

EXIT

Syntax: EXIT
EXIT DO
EXIT FOR
EXIT WHILE

Mit einer EXIT-Anweisung kann eine Schleife vorzeitig verlassen werden, d.h., die Schleife wird abgebrochen und die Programmausführung hinter der Schleife fortgesetzt. Optional kann hinter dem Schlüsselwort EXIT auch die Art der betreffenden Schleife angegeben werden (entweder Schlüsselwort DO, FOR oder WHILE).

I=0
DO
  I=I+1
  PRINT I
  IF I=5 THEN EXIT DO
LOOP
PRINT "Schleife zu Ende"

FOR

Syntax: FOR <Variable>=<Startwert> TO <Endwert> [ STEP <Schrittweite> ]
Startwert:Integer-Ausdruck
Endwert:Integer-Ausdruck
Schrittweite:Integer-Ausdruck

Zuerst wird der Variable, auch Laufvariable genannt, der Startwert zugewiesen. Anschließend setzt die Programmabarbeitung mit dem ersten Befehl hinter der FOR-Anweisung fort. Bei Erreichen der NEXT-Anweisung wird die Variable mit dem Wert der Schrittweite addiert. Ist der Endwert noch nicht erreicht, wird zum ersten Befehl hinter der FOR-Anweisung gesprungen. Anderenfalls wird die FOR-Schleife verlassen, d.h., die Programmabarbeitung setzt hinter der NEXT-Anweisung fort.

Ist die Schrittweite größer 0, gilt der Endwert als erreicht, wenn der Wert der Variable gleich oder größer dem Endwert ist. Ist dagegen die Schrittweite kleiner 0, gilt der Endwert als erreicht, wenn der Wert der Variable gleich oder kleiner dem Endwert ist.

Das Schlüsselwort STEP und die nachfolgende Schrittweite können weggelassen werden. In dem Fall ist die Schrittweite eins.

Achtung! Bereits beim Compilieren muss der konkrete Speicherplatz der Laufvariable ermittelbar sein. Das ist bei allen einfachen Variablen gegeben. Ist die Laufvariable dagegen ein Element einer Feldvariable, ist diese Bedingung nur gegeben, wenn die Indexe mit konstanten Werten angegeben werden, z.B.:

DIM A(5)
FOR A(2)=1 TO 10
...
NEXT A(2)

Ein variabler Index wird dagegen vom Compiler mit einem Fehler beantwortet:

DIM A(5)
I=2
FOR A(I)=1 TO 10     Fehler!
...
NEXT A(I)

FUNCTION

Syntax: FUNCTION <Funktionsname>
FUNCTION <Funktionsname> ( <Argument> [ , ... ] )

Mit der Anweisung wird die Implementierung einer benutzerdefinierten Funktion eingeleitet. Implizit wird damit auch das Hauptprogramm beendet. Die Funktion endet mit der Anweisung END FUNCTION.

Lesen Sie bitte auch die Erläuterungen zu den benutzerdefinierten Funktionen und Prozeduren!

GOSUB

Syntax: GOSUB <Zeilennummer>
GOSUB <Marke>

Die Anweisung ruft ein Unterprogramm auf, welches an der angegebenen Stelle beginnt. Das Unterprogramm muss mit RETURN abgeschlossen sein.

GOTO

Syntax: GOTO <Zeilennummer>
GOTO <Marke>

Die Anweisung veranlasst einen Sprung zu der angegebenen Stelle, d.h., die Programmausführung wird an dieser Stelle fortgesetzt.

Achtung! Die GOTO-Anweisung stammt aus einer Zeit, in der BASIC noch keine strukturierte Programmierung unterstützte. Der JKCEMU-BASIC-Compiler bietet aber mit alternativen Schleifenarten (DO...LOOP..., WHILE...WEND) inklusive der dazugehörigen Kontrollanweisung EXIT sowie mehrzeiligen IF-Konstrukten diverse Möglichenkeiten zur strukturierten Programmierung, die die Verwendung von GOTO weitestgehend, wenn nicht sogar komplett, überflüssig machen. Es ist deshalb empfehlenswert, bei neu zu entwickelnder Software auf die Verwendung von GOTO zu verzichten und anstelle dessen die Möglichkeiten der strukturierten Programmierung zu nutzen.

IF

Syntax: IF <Bedingung> [ THEN ] <Anweisungen> [ : ELSE : <Anweisungen> ]
IF <Bedingung> [ THEN ] <Zeilennummer> [ : ELSE : <Anweisungen> ]

IF <Bedingung> [ THEN ]
  <Anweisungen>
  <Anweisungen>
[ ELSEIF <Bedingung> THEN
  <Anweisungen>
  <Anweisungen> ]
[ ELSEIF <Bedingung> THEN
  <Anweisungen>
  <Anweisungen> ]
[ ELSE
  <Anweisungen>
  <Anweisungen> ]
ENDIF
Bedingung:Integer-Ausdruck

Die IF-Anweisung stellt eine bedingte Programmverzweigung dar. Wenn die Bedingung erfüllt ist, werden die Anweisungen hinter THEN ausgeführt. Wenn nicht, wird die Bedingung hinter dem ersten ELSEIF geprüft und ggf. die dahinter stehenden Anweisungen ausgeführt. Ist auch diese Bedingung nicht erfüllt, ist das nächste ELSEIF an der Reihe usw. Wenn keine Bedingung erfült war, werden die Anweisungen hinter ELSE ausgeführt.

Es sind beliebig viele ELSEIF-Zweige erlaubt. Auch kann ELSEIF ganz weggelassen werden. Der ELSE-Zweig ist ebenfalls optional und kann weggelassen werden. Das Schlüsselwort THEN kann ebenfalls weggelassen werden, ist aber aufgrund der besseren Lesbarkeit und mit Blick auf die bei anderen BASIC-Dialekten üblichen Syntax nicht zu empfehlen.

Eine Bedingung ist erfüllt, wenn der Integer-Ausdruck einen Wert ungleich 0 liefert. Die Bedingung muss nicht zwingend einen Vergleichsoperator enthalten. Allerdings eignen sich Vergleichsoperatoren besonders gut für Bedingungen, da sie einen Integer-Wert zurückliefern (siehe Vergleichsoperatoren).

Die IF-Anweisung gibt es in einer einzeiligen und in einer mehrzeiligen Variante. Bei der einzeiligen Variante endet die IF-Anweisung am Zeilenende, z.B.:

100 IF A=0 THEN PRINT "Null" : ELSE : PRINT "ungleich Null"
110 IF A<100 THEN GOTO 200

Wie bereits oben erwähnt, kann das Schlüsselwort THEN weggelassen werden. Ist es aber vorhanden und direkt dahinter steht eine Zahl, dann wird diese Zahl als Zeilennummer einer GOTO-Anweisung gewertet, z.B.:

100 IF A<100 THEN 200

Folgt hinter der Bedingung bzw. hinter dem Schlüsselwort THEN nichts mehr in der Zeile, wird die IF-Anweisung als mehrzeilig erkannt, d.h., in dem Fall muss es ein ENDIF geben.

IF A=1 THEN
  PRINT "eins"
ELSEIF A=2 THEN
  PRINT "zwei"
ELSEIF A=3 THEN
  PRINT "drei"
ELSE
  PRINT "nichts von alledem"
ENDIF

IF-Anweisungen können in sich geschachtelt verwendet werden:

IF A=0 THEN
  IF B=0 THEN
    PRINT "A und B sind Null."
  ELSEIF B=1 THEN
    PRINT "A=0 und B=1"
  ENDIF
ELSE
  PRINT "A ist nicht Null."
ENDIF

INCLUDE

Syntax: INCLUDE "Dateiname"

Die Anweisung bindet die angegebene Datei an der aktuellen Position in den Quelltext ein, d.h., diese Datei wird mit compiliert und ist somit Teil des BASIC-Programms. Der Dateiname kann mit oder ohne Pfad angegeben werden. Fehlt der Pfad, wird die eingebundene Datei im gleichen Verzeichnis bzw., falls der Quelltext im Texteditor eingetippt und noch nicht gespeichert wurde, im aktuellen Verzeichnis gesucht. Wird ein Pfad angegeben, ist dieser sowohl relativ als auch absolut möglich. Die Schreibweise des Pfads (Laufwerk, Trennzeichen) ist abhängig vom Betriebssystem, auf dem JKCEMU läuft. Es ist aber auch möglich, den Pfad betriebssystemunabhäbgig anzugeben, allerdings nur relativ. Als Trennzeichen ist in dem Fall der Slash (/) zu verwenden.

Beispiele:
Absolute Pfadangabe bei Windows: INCLUDE "C:\basic\bibliothek.bas"
Absolute Pfadangabe bei Linux/Unix: INCLUDE "/home/benutzer/basic/bibliothek.bas"
Relative Pfadangabe bei Windows: INCLUDE "..\bibliothek.bas"
Relative und betriebssystemunabhängige Pfadangabe (Linux/Unix/Windows): INCLUDE "../bibliothek.bas"

Achtung! Hinter der INCLUDE-Anweisung darf in der gleichen Zeile keine weitere BASIC-Anweisung mehr folgen. Außerdem können eingebundene Dateien selbst keine weiteren Dateien mehr einbinden, d.h., in sich geschachtelte INCLUDE-Anweisungen sind nicht erlaubt.

INK

Syntax: INK <Integer-Ausdruck>

Die Anweisung setzt die Vordergrundfarbe. Die Nummer der Farbe hängt vom Zielsystem ab. Zum Schreiben von portablen Quelltext kann man die Farbe auch mit einer Konstante angeben, z.B.:

 INK YELLOW

Auf einem Zielsystem ohne Farbunterstützung hat die Anweisung keine Wirkung.

INPUT

Syntax: INPUT [ <String-Literal> ; ] <Variable> [ ; ... ]
INPUT # <Kanal> , <Variable> [ , ... ]
Kanal: Integer-Ausdruck mit dem Wert 1 oder 2

Die INPUT-Anweisung gibt es in zwei Varianten, ohne und mit Kanalnummer. Die Variante ohne Kanalnummer liest Eingaben von der Tastatur und speichert die eingelesenen Werte in Variablen. Dazu kann die Anweisung mehrere Abschnitte enthalten, die durch Semikolon getrennt sind. Jeder Abschnitt steht für eine eigenständige Eingabe. Pro Abschnitt kann entweder nur eine Variable oder ein String-Literal gefolgt von einem Semikolon und einer Variable angegeben werden. Ist ein String-Literal vorhanden, wird zuerst dieses ausgegeben. Anderenfalls erscheint ein Fragezeichen, das zur Eingabe auffordert. Mit Drücken der ENTER-Taste wird die eingegebene Zahl bzw. der eingegebene Text der Variable zugewiesen. Ist die Variable eine numerische Variable, muss die Eingabe einer gültigen Zahl entsprechen. Ist das nicht der Fall, erscheint eine Fehlermeldung und es wird zur erneuten Eingabe aufgefordert. Im Fall einer String-Variable werden führende Leerzeichen abgeschnitten und der Text ab dem ersten Nicht-Leerzeichen in der Variable gespeichert.

Die INPUT-Variante mit Kanalnummer liest Textabschnitte von dem angegebenen Eingabekanal und speichert diese in den angegebenen Variablen. Es können mehrere Variablen angegeben werden. Pro Variable wird ein Textabschnitt gelesen und in der Variable gespeichert. Ist die Variable eine numerische Variable, wird der Textabschnitt in einen numerischen Wert umgewandelt und dieser dann gespeichert. Führende und nachfolgende Leerzeichen werden bei der Umwandlung ignoriert. Kann der Textabschnitt nicht in eine Zahl umgewandelt werden, werden die Fehlervariablen entsprechend gesetzt und eine 0 der Variable zugewiesen.

Die Textabschnitte werden durch Kommas und Zeilenendezeichen getrennt. Als Zeilenende wird sowohl das DOS/Windows-Format (Zeilenendebytes 0Dh/0Ah) als auch das Unix/Linux-Format (Zeilenendebyte 0Ah) erkannt. Beim Lesen eines Textabschnitts wird bis einschließlich dem Trennzeichen bzw. Zeilenende gelesen. Ist der Eingabestrom bzw. die Datei bereits vor dem Trennzeichen bzw. Zeilenendezeichen zu Ende, werden die Fehlervariablen auf "Dateiende erreicht" gesetzt.

LABEL

Syntax: LABEL <String-Ausdruck>

Diese Anweisung gibt im Grafikmodus Text aus. Dazu muss vorher der Grafik-Cursor auf die gewünschte Position verschoben worden sein, z.B. mit der MOVE-Anweisung. Nach der Ausgabe steht der Grafik-Cursor hinter dem Text, d.h., mehrere LABEL-Anweisungen hintereinander geben den Text auch zusammenhängend aus.

MOVE 10,10
LABEL "ABC"
LABEL "DEF"
LINE 10,7,XPOS-3,7

Beispiel: Ausgabe eines zusammenhängenden und unterstrichenen Textes

Bei Systemen mit einem getrennten Text- und Grafik-SCREEN ist die LABEL-Anweisung die einzige Möglichkeit, Text im Grafikmodus auszugeben. Lesen Sie bitte auch die Hinweise zur Grafikunterstützung!

LET

Syntax: [ LET ] <Variable> = <Ausdruck>

Das Schlüsselwort LET kann entfallen.

LINE

Syntax: LINE <X1> , <Y1> , <X2> , <Y2>
LINE ( <X1> , <Y1> ) - ( <X2> , <Y2> )

LINE <X1> , <Y1> , <X2> , <Y2> , B
LINE ( <X1> , <Y1> ) - ( <X2> , <Y2> ) , B

LINE <X1> , <Y1> , <X2> , <Y2> , BF
LINE ( <X1> , <Y1> ) - ( <X2> , <Y2> ) , BF
X1: Integer-Ausdruck
Y1: Integer-Ausdruck
X1: Integer-Ausdruck
Y2: Integer-Ausdruck

In der Variante ohne dem Argument B bzw. BF zeichnet die Anweisung eine Linie vom Punkt (X1,Y1) zum Punkt (X2,Y2). Wird dagegen das Argument B angegeben, erscheint ein Rechteck mit den vier Eckpunkten (X1,Y1), (X1,Y2), (X2,Y1) und (X2,Y2). Beim Argument BF wird ein gefülltes Rechteck gezeichnet.

Die LINE-Anweisung beeinflusst nicht den Grafik-Cursor. Lesen Sie bitte auch die Hinweise zur Grafikunterstützung!

LINE INPUT

Syntax: LINE INPUT [ <String-Literal> ; ] <String-Variable>
LINE INPUT # <Kanal> , <String-Variable>
Kanal: Integer-Ausdruck mit dem Wert 1 oder 2

Die LINE INPUT-Anweisung dient zur Eingabe bzw. zum Lesen einer Textzeile. In der Variante ohne Kanalnummer wird der Text über die Tastatur eingegeben. Im Gegensatz zur INPUT-Anweisung werden führende Leerzeichen nicht abgeschnitten, d.h., die eingegebene Textzeile wird unverändert in der angegebenen String-Variable gespeichert. Optional kann ein String-Literal angegeben werden, welches als Prompt ausgegeben wird. Fehlt dieses String-Literal, erscheint im Gegensatz zur INPUT-Anweisung kein Fragezeichen.

In der Variante mit Kanalnummer wird eine Textzeile aus dem angegebenen Eingabekanal gelesen. Als Zeilenende wird sowohl das DOS/Windows-Format (Zeilenendebytes 0Dh/0Ah) als auch das Unix/Linux-Format (Zeilenendebyte 0Ah) erkannt. Die Anweisung liest die Textzeile bis einschließlich dem Zeilenende, speichert aber den Text ohne die Zeilenendebytes in der Variable. Da die Anweisung das Zeilenende sucht, wird gewöhnlich beim Lesen der letzten Zeile der Fehlerstatus auf "Dateiende erreicht" gesetzt, d.h., der in der Variable gespeicherte Text ist sowohl bei ERR=E_OK als auch bei ERR=E_EOF gütig. Bei einem anderen Fehlerstatus wird eine leere Zeichenkette in die Variable geschrieben.

Beispiel: Lesen einer Textdatei und zeilenweise Ausgabe auf dem Bildschirm:

INPUT "Datei:";F$
OPEN F$ AS #1
IF ERR THEN
  PRINT ERR$
ELSE
  DO
    LINE INPUT #1,S$
    PRINT S$
  LOOP UNTIL ERR OR EOF(#1)
  IF ERR THEN PRINT ERR$
  CLOSE #1
ENDIF

LOCAL

Syntax: LOCALE <Name> [, ... ]
Name: Name der zu deklarierenden Variable

Die Anweisung deklariert eine oder mehrere lokale Variablen innerhalb einer Funktion oder Prozedur. Endet der Variablenname auf ein $-Zeichen, wird eine lokale String-Variable deklariert, anderenfalls eine lokale Integer-Variable. Lokale Feldvariablen sind nicht möglich.

Lokale Variablen verdecken gleichnamige globale Variablen, d.h., hat eine lokale Variable den gleichen Namen wie eine im Hauptprogramm, kann in der Funktion/Prozedur auf die Variable im Hauptprogramm nicht zugegriffen werden.

Lokale Variablen werden auf dem Stack angelegt. Dieser muss dazu ausreichend groß dimensioniert sein. Ruft eine Funktion/Prozedur sich selbst auf (Rekursion), werden bei jedem Aufruf die lokalen Variablen neu angelegt, d.h., für jeden Aufruf gibt es separate lokale Variablen.

LOCATE

Syntax: LOCATE <Zeile> , <Spalte>
Zeile: Integer-Ausdruck mit einem Wert >= 0
Spalte: Integer-Ausdruck mit einem Wert >= 0

Die LOCATE-Anweisung positioniert den Cursor auf die angegebene Position. Die linke obere Ecke hat die Position (0,0).

Achtung! Die LOCATE-Anweisung wird nicht für alle Zielsysteme unterstützt (siehe Hinweise zu den Zielsystemen).

LOOP

Syntax: LOOP
LOOP UNTIL <Bedingung>
LOOP WHILE <Bedingung>
Bedingung: Integer-Ausdruck

Die LOOP-Anweisung markiert das Ende einer Schleife, die vorher mit der DO-Anweisung eröffnet worden ist.

Die DO...LOOP-Schleife gibt es in drei verschiedenen Ausprägungen. Wird hinter dem Schlüsselwort LOOP nichts weiter angegeben, handelt es sich um eine Endlosschleife:

DO
  PRINT "Endlosschleife"
LOOP

Mit dem Schlüsselwort UNTIL kann eine Bedingung angegeben werden. Die Schleife bricht ab, sobald die Bedingung erfüllt ist:

I=1
DO
  PRINT I
  I=I+1
LOOP UNTIL I=10

Das Gegenteil erreicht man mit dem Schlüsselwort WHILE. In dem Fall läuft die Schleife solange, wie die angegebene Bedingung erfüllt ist. Die Schleife bricht also ab, sobald die Bedingung nicht mehr erfüllt ist:

I=1
DO
  PRINT I
  I=I+1
LOOP WHILE I<10

LPRINT

Syntax: LPRINT
LPRINT <Abschnitt>
LPRINT <Abschnitt> <Trennzeichen>
LPRINT <Abschnitt> <Trennzeichen> <weitere Abschnitte>
LPRINT <Abschnitt> <Trennzeichen> <weitere Abschnitte> <Trennzeichen>
Abschnitt: String-Ausdruck oder Integer-Ausdruck
Trennzeichen: Komma oder Semikolon

Die Anweisung LPRINT tätigt Ausgaben auf dem Drucker. Die Argumente sind identisch zur PRINT-Anweisung in der Version ohne Kanalnummer.

Achtung! Die LPRINT-Anweisung wird nicht für alle Zielsysteme unterstützt (siehe Hinweise zu den Zielsystemen).

MOVE

Syntax: MOVE <X> , <Y>
MOVE TO <X> , <Y>
MOVE ( <X> , <Y> )
MOVE TO ( <X> , <Y> )
MOVE STEP ( <X> , <Y> )
X: Integer-Ausdruck
Y: Integer-Ausdruck

Die MOVE-Anweisung setzt den Grafik-Cursor auf die angegebene Position. Bei der Variante mit dem Schlüsselwort STEP wird der Grafik-Cursor nicht absolut, sondern relativ positioniert, d.h., diese Variante ist identisch zur MOVER-Anweisung.

Lesen Sie bitte auch die Hinweise zur Grafikunterstützung!

MOVER

Syntax: MOVER <X> , <Y>
MOVER ( <X> , <Y> )
X: Integer-Ausdruck
Y: Integer-Ausdruck

Die MOVER-Anweisung verschiebt den Grafik-Cursor um den angegebenen X- und Y-Wert, d.h., die Positionsangabe ist relativ. Lesen Sie bitte auch die Hinweise zur Grafikunterstützung!

NEXT

Syntax: NEXT [ <Variable> ]

Die Schleifenvariable wird mit dem Wert der Schrittweite (siehe FOR-Anweisung) addiert. Ist der Endwert noch nicht erreicht, wird an den Anfang der FOR-Schleife gesprungen. Anderenfalls wird die FOR-Schleife verlassen.

Die NEXT-Anweisung darf nicht ohne ein vorheriges FOR aufgerufen werden!

Die Angabe einer Variable ist optional. Wird jedoch eine Variable angegeben, so muss es die gleiche sein wie bei der zugehörigen FOR-Anweisung.

ON...GOSUB

Syntax: ON <Auswahl> GOSUB <Zeilennummer> , <Zeilennummer> [ , <Zeilennummer> [ , ... ] ]
ON <Auswahl> GOSUB <Marke> , <Marke> [ , <Marke> [ , ... ] ]
Auswahl:Integer-Ausdruck >= 0

Die Anweisung ruft aus einer Liste von Unterprogrammen eins auf, wobei die Auswahl anhand des Wertes des hinter dem Schlüsselwort ON stehenden Ausdrucks erfolgt. Ist der Wert 1, wird das Unterprogramm entsprechend der ersten derhinter dem Schlüsselwort GOSUB stehenden Zeilennummer bzw. Marke aufgerufen, beim Wert 2 das zweite usw. Beim Wert 0 oder einem Wert größer als die Anzahl der angegebenen Zeilennummern wird kein Unterprogramm aufgerufen.

Beispiel mit BASIC-Zeilennummern:

100 ON A GOSUB 1000,2000,3000
...
1000 PRINT "UP 1":RETURN
2000 PRINT "UP 2":RETURN
3000 PRINT "UP 3":RETURN

Beispiel mit Marken:

ON A GOSUB up1,up2,up3
...
up1:
  PRINT "UP 1":RETURN
up2:
  PRINT "UP 2":RETURN
up3:
  PRINT "UP 3":RETURN

ON...GOTO

Syntax: ON <Auswahl> GOTO <Zeilennummer> , <Zeilennummer> [ , <Zeilennummer> [ , ... ] ]
ON <Auswahl> GOTO <Marke> , <Marke> [ , <Marke> [ , ... ] ]
Auswahl:Integer-Ausdruck >= 0

Die Anweisung springt zu einer Zeile, die aus einer Liste von BASIC-Zeilennummern oder Marken entsprechend dem Wert des hinter dem Schlüsselwort ON stehenden Ausdrucks ausgewählt wird. Ist der Wert 1, wird zur ersten hinter dem Schlüsselwort GOTO stehenden Zeile gesprungen, beim Wert 2 zur zweiten usw. Beim Wert 0 oder einem Wert größer als die Anzahl der angegebenen Zeilennummern erfolgt kein Sprung, d.h., in dem Fall wird die Programmausführung mit der nächsten Zeile fortgesetzt.

Beispiel mit BASIC-Zeilennummern:

100 ON A GOTO 1000,2000,3000
...
1000 PRINT "A war 1":END
2000 PRINT "A war 2":END
3000 PRINT "A war 3":END

Beispiel mit Marken:

ON A GOTO up1,up2,up3
...
up1:
  PRINT "A war 1":END
up2:
  PRINT "A war 2":END
up3:
  PRINT "A war 3":END

OPEN

Syntax: OPEN <Geräte-/Dateiname> AS # Kanal
OPEN <Geräte-/Dateiname> FOR <Betriebsart> AS # Kanalnummer
OPEN <Geräte-/Dateiname> FOR BINARY <Betriebsart> AS # Kanalnummer
Geräte-/Dateiname: einfacher String-Ausdruck
Betriebsart: INPUT, OUTPUT oder APPEND
Kanal: Integer-Ausdruck mit dem Wert 1 oder 2

Die Anweisung öffnet einen Ein- oder Ausgabekanal zu dem angegebenen Gerät bzw. zu der angegebenen Datei. Die Betriebsarten haben folgende Bedeutung:

Betriebsart Bedeutung
INPUT Eingabekanal
OUTPUT Ausgabekanal,
Wurde eine Datei angegeben, so wird sie neu angelegt. Eine evtl. vorhandene Datei wird dabei gelöscht.
APPEND Ausgabekanal,
Wurde eine Datei angegeben, so werden die Daten an die Datei angehängt. Der Inhalt einer evtl. vorhandenen Datei wird nicht gelöscht.

Wenn keine Betriebsart angegeben wird, gilt die Standard-Betriebsart, die Sie aus folgender Tabelle entnehmen können:

Gerät Bedeutung Unterstützte Betriebsarten Standard-Betriebsart
CRT: Bildschirm OUTPUT OUTPUT
LPT: Drucker OUTPUT OUTPUT
A: bis P: Laufwerke im Dateisystem INPUT, OUTPUT, APPEND INPUT
V: USB-Speicher am VDIP-Modul INPUT, OUTPUT, APPEND INPUT

Bei Angabe des Schlüsselworts BINARY vor der Betriebsart wird der Ein-/Ausgabekanal im Binärmodus geöffnet, anderenfalls im Textmodus. Einen Unterschied zwischen diesen beiden Modi gibt es nur beim Zugriff auf ein Dateisystem, welches keine Byte-exakten Dateilängen bietet (siehe Dateisystem). Aus Gründen der Portabilität sollten Sie aber immer das Schlüsselwort BINARY angeben, wenn es sich um Binärdateien handelt.

Beim Öffnen einer Datei zum Schreiben (Betriebsarten OUTPUT und APPEND) auf dem Gerät V: (USB-Speicher) wird die aktuelle Systemzeit als Zeitstempel für die letzte Änderung mitgegeben, aber nur, wenn die Systemzeit auch ausgelesen werden kann. Und das ist nur dann der Fall, wenn die Funtkion DATETIME$ eine nicht-leere Zeichenkette zurückliefert. Anderenfalls wird kein Zeitstempel beim Öffnen bzw. Anlegen der Datei mitgegeben.

Bei einem Eingabekanal können die Anweisungen INPUT und LINE INPUT sowie die Funktionen EOF und INPUT$, verwendet werden. Für einen Ausgabekanal steht die Anweisung PRINT zur Verfügung. Wenn die Arbeit mit dem Kanal beendet ist, muss dieser mit CLOSE wieder geschlossen werden. Danach kann der Kanal mit einem anderen Gerät oder einer anderen Datei erneut geöffnet werden. Insgesamt stehen zwei Kanäle zur Verfügung (1 und 2).

Die OPEN-Anweisung setzt die Fehlervariablen ERR und ERR$.

Beispiel: Speichern von Zahlen in der Datei ZAHLEN.TXT im obersten Verzeichnis auf dem USB-Speicher:

OPEN "V:\ZAHLEN.TXT" FOR OUTPUT AS #1
IF ERR THEN
  PRINT ERR$
ELSE
  FOR I=1 TO 10
    PRINT #1,I
    IF ERR THEN PRINT ERR$:EXIT
  NEXT I
  CLOSE #1
  IF ERR THEN PRINT ERR$
ENDIF

Achtung! Die Datei wurde nur dann sicher gespeichert, wenn sowohl beim Schreiben in die Datei (Anweisung PRINT #) als auch beim Schließen der Datei (Anweisung CLOSE) kein Fehler auftrat.

Beispiele zum Lesen einer Datei finden Sie bei der LINE INPUT-Anweisung und der INPUT$-Funktion.

OUT

Syntax: OUT ( <Port> ) = <Wert>
OUT <Port> , <Wert>
Port:Integer-Ausdruck
Wert:Integer-Ausdruck

Die OUT-Anweisung gibt einen Wert an einem Ausgabetor (Port) aus. Der erste Ausdruck legt die Ausgabeadresse fest, der zweite Ausdruck bestimmt den auszugebenden Wert, wobei nur die unteren 8 Bits relevant sind.

Achtung! Obwohl der Mikroprozessor offiziell nur 8 Bit große Ein-/Ausgabeadressen unterstützt, ist die Nutzung von 16-Bit-Adressen möglich. Der Compiler übersetzt die Anweisung in solch einen Programmcode, der aufgrund des undokumentierten Verhaltens des Mikroprozessors auch eine 16 Bit große Ein-/Ausgabeadresse wirksam werden lässt.

PAINT

Syntax: PAINT <X> , <Y>
PAINT ( <X> , <Y> )
X: Integer-Ausdruck
Y: Integer-Ausdruck

Die PAINT-Anweisung füllt die Fläche aus, in der sich der angegebenen Punkt befindet. Die Fläche ergibt sich aus allen zusammenhängenden Pixel, die auf die Hintergrundfarbe gesetzt sind. Durch die Anweisung werden diese Pixel auf die aktuell eingestellte Vordergrundfarbe gesetzt. Wenn das Pixel an der Startposition bereits die Vordergrundfarbe hat oder die Startposition liegt außerhalb des Bildschirmbereiches, passiert nichts. Der Grafik-Cursor wird durch die Anweisung nicht beeinflusst.

Beispiel: Zeichnen von zwei unterschiedlich großen Kreisen, deren Zwischenraum gefüllt wird, so dass ein Kreis mit dicker Außenlinie entsteht:

CLS
X=W_PIXEL/2
Y=H_PIXEL/2
R1=H_PIXEL/4
R2=H_PIXEL/3
CIRCLE (X,Y),R1
CIRCLE (X,Y),R2
PAINT X-R2+(R2-R1)/2,Y


Die PAINT-Anweisung benötigt für ihre Ausführung einen temporären Speicher. Dafür wird ein freier Bereich des Zeichenkettenspeichers verwendet. Je häufiger die zu füllende Fläche in Teilflächen zerlegt werden muss, z.B. beim Füllen um Ecken herum, desto mehr Speicher wird benöigt. Sollte der verwendete Speicherbereich aus dem Zeichenkettenspeicher nicht ausreichen, bricht das Programm mit einer entsprechenden Fehlermeldung ab.

PAPER

Syntax: PAPER <Integer-Ausdruck>

Die Anweisung setzt die Hintergrundfarbe. Die Nummer der Farbe hängt vom Zielsystem ab. Zum Schreiben von portablen Quelltext kann man die Farbe auch mit einer Konstante angeben, z.B.:

 PAPER BLUE

Auf einem Zielsystem ohne Farbunterstützung hat die Anweisung keine Wirkung.

PASSWORD INPUT

Syntax: PASSWORD INPUT [ <String-Literal> ; ] <String-Variable>

Die PASSWORD INPUT-Anweisung dient zur Eingabe eines Kennworts. Dazu werden die eingegebenen Zeichen auf dem Bildschirm nicht im Klartext ausgegeben, sondern mit Sternchen quittiert. Optional kann ein String-Literal angegeben werden, welches als Prompt ausgegeben wird.

PAUSE

Syntax: PAUSE
PAUSE <Integer-Ausdruck>

Die Anweisung hält das Programm an. Mit Drücken der Leertaste wird das Programm fortgesetzt. Optional kann eine Wartezeit in Zehntel Sekunden angegeben werden. In dem Fall wird nach dieser Zeit das Programm automatisch fortgesetzt, auch wenn keine Leertaste gedrückt wurde.

Achtung! Die Wartezeit entspricht nur ungefähr dem angegebenen Wert und hängt maßgeblich von der Taktfrequenz ab. Der Wert 30 entspricht somit nur in etwa einer Wartezeit von 3 Sekunden.

PEN

Syntax: PEN <Integer-Ausdruck>

Die Anweisung legt den Stift fest, mit dem gezeichnet wird. Ein Stift steht für eine bestimmte Art und Weise, wie die Pixel gesetzt werden. Es gibt vier verschiedene Stifte. Für jeden Stift ist eine Konstante definiert.

StiftKonstanteBedeutung
0 PEN_NONE Stift angehoben,
Bei diesem Stift passiert nichts. Es wird weder etwas gezeichnet noch etwas gelöscht.
1 PEN_NORMAL Zeichnen,
Die zu zeichnenden Pixel werden auf die Vordergrundfarbe gesetzt. Bereits auf dem Bildschirm befindliche Texte und Grafiken werden somit übermalt. Dieser Stift ist der "normale" Zeichenstift und wird bei Programmstart automatisch eingestellt.
2 PEN_ERASER Löschen,
Die zu zeichnenden Pixel werden auf die Hintergrundfarbe gesetzt.
3 PEN_XOR XOR-Modus,
Bei jedem zu zeichnenden Pixel wird geprüft, ob es bereits gesetzt ist. Wenn ja, wird das Pixel gelöscht (auf Hintergrundfarbe gesetzt). Wenn nein, wird es normal gezeichnet (auf Vordergrundfarbe gesetzt). Dadurch bleiben auf dem Bildschirm bereits befindliche Texte und Grafiken weiterhin sichtbar, aber invers.

Lesen Sie bitte auch die Hinweise zur Grafikunterstützung!

PLOT

Syntax: PLOT <X> , <Y>
PLOT TO <X> , <Y>
PLOT ( <X> , <Y> )
PLOT TO ( <X> , <Y> )
PLOT STEP ( <X> , <Y> )
X: Integer-Ausdruck
Y: Integer-Ausdruck

Die PLOT-Anweisung positioniert den Grafik-Cursor und setzt das dortige Pixel. Damit eignet sich z.B. die PLOT-Anweisung in Verbindung mit der DRAW-Anweisung zum Zeichnen von nicht geschlossenen Polygonen.

Bei der Variante mit dem Schlüsselwort STEP werden relative Koordinaten angegeben. Diese Variante ist identisch mit der PLOTR-Anweisung.

Lesen Sie bitte auch die Hinweise zur Grafikunterstützung!

PLOTR

Syntax: PLOTR <X> , <Y>
PLOTR ( <X> , <Y> )
X: Integer-Ausdruck
Y: Integer-Ausdruck

Die PLOTR-Anweisung verschiebt den Grafik-Cursor um den angegebenen X- und Y-Wert und setzt das dortige Pixel. Die Positionsangabe ist relativ. Ansonsten gilt das bei der PLOT-Anweisung geschriebene.

POKE

Syntax: POKE <Adresse> , <Wert>
Adresse:Integer-Ausdruck
Wert:Integer-Ausdruck

Die durch die Adresse angegebene Speicherzelle wird mit den unteren 8 Bits des Wertes des zweiten Integer-Ausdrucks beschrieben.

PRESET

Syntax: PRESET <X> , <Y>
PRESET ( <X> , <Y> )
X: Integer-Ausdruck mit einem Wert >= 0
Y: Integer-Ausdruck mit einem Wert >= 0

Die PRESET-Anweisung setzt auf dem Bildschirm ein Pixel auf die Hintergrundfarbe zurück. Der mit der PEN-Anweisung eingestellte Stift spielt dabei keine Rolle. Die Position des Grafik-Cursors wird nicht verändert. Lesen Sie bitte auch die Hinweise zur Grafikunterstützung!

PRINT

Syntax: PRINT
PRINT <Abschnitt>
PRINT <Abschnitt> <Trennzeichen>
PRINT <Abschnitt> <Trennzeichen> <weitere Abschnitte>
PRINT <Abschnitt> <Trennzeichen> <weitere Abschnitte> <Trennzeichen>
PRINT # <Kanal>
PRINT # <Kanal> , <Abschnitt>
PRINT # <Kanal> , <Abschnitt> <Trennzeichen>
PRINT # <Kanal> , <Abschnitt> <Trennzeichen> <weitere Abschnitte>
PRINT # <Kanal> , <Abschnitt> <Trennzeichen> <weitere Abschnitte> <Trennzeichen>
Kanal: Integer-Ausdruck mit dem Wert 1 oder 2
Abschnitt: String-Ausdruck oder Integer-Ausdruck
Trennzeichen: Komma oder Semikolon

Die PRINT-Anweisung gibt Zahlen, Text und/oder einen Zeilenumbruch auf dem Bildschirm oder einem Ausgabekanal aus. Die Ausgabe erfolgt dann auf dem Ausgabekanal, wenn hinter einem Doppelkreuz die Nummer des Ausgabekanals angegeben wurde. In dem Fall werden auch die Fehlervariablen ERR und ERR$ gesetzt. Ohne Kanalnummer erfolgt die Ausgabe auf dem Bildschirm.

Die PRINT-Anweisung kann mehrere Abschnitte enthalten, die durch Kommas oder Semikolons getrennt sind. Ein Abschnitt dient entweder zur Ausgabe einer Zeichenkette oder einer numerischen Zahl, je nachdem, ob der Abschnitt einen Zeichenkettenausdruck oder einen numerischen Ausdruck enthält.


CHR$-Funktion

Mit der Funktion CHR$ können beliebige Bytes, auch Nullbytes, ausgegeben werden. Übergibt man der Funktion den Wert 0, liefert sie normalerweise eine leere Zeichenkette zurück. Das gilt jedoch nicht, wenn die CHR$-Funktion ein eigenständiger Abschnitt in der PRINT-Anweisung ist. In dem Fall wird immer das Byte ausgegeben, dessen Wert der CHR$-Funktion übergeben wurde, auch wenn der Wert 0 ist. Das Beispiel zeigt das Schreiben einer binären Datei, welche nur aus einem Nullbyte besteht:

OPEN "datei.bin" FOR BINARY OUTPUT AS #1
IF ERR THEN
  PRINT ERR$
ELSE
  PRINT #1,CHR$(0);
  CLOSE #1
ENDIF


SPC-Funktion

Die SPC-Funktion dient zur Ausgabe einer bestimmten Anzahl von Leerzeichen. Die Anzahl der Leerzeichen übergibt man der Funktion als Argument und ist in Klammern zu schreiben. Das Beispiel zeigt die Ausgabe von 10 Leerzeichen zwischen den spitzen Klammern:

PRINT ">";SPC(10);"<"

Das Besondere an der SPC-Funktion ist, dass sie nur innerhalb der PRINT-Anweisung zur Verfügung steht. Aus diesem Grund wird sie auch hier und nicht bei den normalen BASIC-Funktionen beschrieben.

Die SPC-Funktion hat die gleiche Wirkung wie die Funktion SPACE$. Allerdings ist die SPC-Funktion insbesondere bei der Ausgabe von vielen Leerzeichen besser geeignet, da bei ihr nicht die interne Zeichenkettenverarbeitung zur Anwendung kommt und somit auch deren Größenbeschränkung nicht gilt.


Rechts- und linksbündige Ausgabe

Zeichenketten werden immer linksbündig ausgegeben. Bei numerischen Abschnitten hängt die Bündigkeit vom voranstehenden Trennzeichen ab. Ist der Abschnitt vom vorherigen Abschnitt durch ein Komma getrennt, wird die Zahl in einem 14 Zeichen breiten Feld rechtsbündig ausgegeben. Anderenfalls erfolgt die Ausgabe linksbündig. Folgende Beispiele demonstrieren das:

linksbündige Ausgabe rechtsbündige Ausgabe
A=12
PRINT "A=";A
A=12
PRINT "A=",A

Bei der linksbündigen Ausgabe enthält die erste Stelle entweder das Vorzeichen oder ein Leerzeichen. Wenn das Leerzeichen stört, muss man die Zahl vor der Ausgabe in eine Zeichenkette umwandeln und die führenden Leerzeichen abschneiden:

A=12
PRINT "A=";LTRIM$(STR$(A))

Wenn hinter einem Abschnitt zur Ausgabe einer Dezimalzahl ein weiterer Abschnitt folgt, wird dieser entsprechend den gängigen BASIC-Dialekten mit einem Leerzeichen von der Zahl getrennt. Sollte dieses Leerzeichen stören, muss auch in diesem Fall die Zahl in eine Zeichenkette umgewandelt werden. Folgendes Beispiel zeigt, wie das Prozentzeichen direkt hinter der Zahl ausgegeben wird:

P=17
PRINT "Anteil: ";STR$(P);"%"


Zeilenschaltung

Die PRINT-Anweisung setzt nach der Ausgabe aller Abschnitte standardmäßig den Cursor auf den Anfang der nächsten Zeile. Diese Zeilenschaltung kann unterdrückt werden, indem die Anweisung mit einem Komma oder Semikolon abgeschlossen wird:

PRINT "A und ";
PRINT "B stehen in der gleichen Zeile"

PSET

Syntax: PSET <X> , <Y>
PSET ( <X> , <Y> )
X: Integer-Ausdruck mit einem Wert >= 0
Y: Integer-Ausdruck mit einem Wert >= 0

Die PSET-Anweisung setzt ein Pixel auf dem Bildschirm unter Anwendung des mit der Anweisung PEN eingestellten Stiftes. Die Position des Grafik-Cursors wird nicht verändert. Lesen Sie bitte auch die Hinweise zur Grafikunterstützung!

READ

Syntax: READ <Variable> [ , ... ]

READ liest den nächsten Wert aus dem Datenbereich, der mit den DATA-Anweisungen erzeugt wurde und schreibt ihn in die angegebene Variable. Durch Komma getrennt können mehrere Variablen angegeben werden.

REM

Der Rest der Programmzeile wird als Kommentar gewertet und somit ignoriert. Anstelle des Schlüsselwortes REM kann auch ein Ausrufezeichen oder ein Apostroph (Quote-Zeichen) verwendet werden.

RESTORE

Syntax: RESTORE
RESTORE <Zeilennummer>
RESTORE <Marke>

RESTORE setzt die Leseposition der READ-Anweisung auf das erste Datenfeld der ersten DATA-Anweisung, die in der angegebenen Zeile bzw. hinter der angegebenen Marke steht, z.B.:

RESTORE Wochentage
FOR I=1 TO 7
  READ A$
  PRINT A$
NEXT I
END

Wochentage:
  DATA "Mo","Di","Mi","Do","Fr","Sa","So"

Wird keine Zeilennummer bzw. keine Marke angegeben, setzt RESTORE die Leseposition auf das erste Datenfeld der ersten DATA-Anweisung im BASIC-Programm, d.h., die Leseposition wird auf den Wert zum Zeitpunkt des Programmstarts zurückgesetzt.

Achtung! Wenn eine Marke angegeben wird, muss es die Marke sein, die unmittelbar vor der betreffenden DATA-Anweisung steht. Wenn zwischen der angegebenen Marke und der DATA-Anweisung eine weitere Marke oder eine BASIC-Zeilennummer steht, meldet der Compiler einen Fehler.

RETURN

Diese Anweisung beendet ein Unterprogramm, dass mit GOSUB aufgerufen wurde. Die Programmabarbeitung setzt somit hinter der aufrufenden GOSUB-Anweisung fort. Die RETURN-Anweisung darf nicht ohne ein vorheriges GOSUB aufgerufen werden!

SCREEN

Syntax: SCREEN <Integer-Ausdruck>

Mit der SCREEN-Anweisung kann ein Bildschirm- oder Grafikmodus eingestellt werden. Welche bzw. wieviele Modi zur Verfügung stehen, hängt vom Zielsystem ab. Lesen Sie dazu bitte die Hinweise zu den Zielsystemen!

Mit SCREEN 0 wird der Standardmodus eingestellt, der die Möglichkeit zur Textausgabe bietet und der auf jeden Fall zur Verfügung steht. Ob in diesem Modus auch Grafikanweisungen möglich sind, hängt wiederum vom konkreten Zielsystem ab. Bei manchen Systemen wird hardwaremäßig zwischen Text- und Grafikmodus umgeschaltet. In solchen Fällen stehen mehrere Modi zur Verfügung, z.B. SCREEN 0 für den Text- und SCREEN 1 für den Grafikmodus. Die Konstante LASTSCREEN enthält die höchste Bildschirmnummer, die bei SCREEN verwendet werden kann.

Eine weitere relevante Konstante ist GRAPHICSCREEN, die die Nummer des grafikfähigen Bildschirms enthält. Damit kann man auf eine einfache und portable Art und Weise den Grafikmodus einstellen, vorausgesetzt, das Zielsystem unterstützt Grafik:

 SCREEN GRAPHICSCREEN

Ruft man die SCREEN-Anweisung mit der SCREEN-Nummer auf, in der man sich gerade befindet, passiert nichts.

SELECT CASE

Syntax: SELECT CASE <Integer-Ausdruck>
  CASE <Werteliste> <Anweisungen>
  [ CASE <Werteliste> <Anweisungen> ]
  [ CASE ELSE <Anweisungen> ]
END SELECT
Werteliste: durch Komma getrennte Liste von Integer-Literalen und/oder Integer-Konstanten,
kann auch nur ein Wert sein

Bei dieser Anweisung wird ein Integer-Ausdruck auf konstante Werte getestet. Stimmt ein Wert überein, werden die hinter dem Wert bzw. hinter der Werteliste stehenden Anweisungen ausgeführt und die SELECT CASE-Anweisung verlassen. Trifft keiner der angegebenen Werte zu, werden, sofern vorhanden, die Anweisungen hinter CASE ELSE abgearbeitet.

Beispiel Würfelspiel:

N=0
DO
  W=FALSE
  P=RND(6)+1
  SELECT CASE P
    CASE 1 PRINT "ein Punkt"
    CASE 2 PRINT "zwei Punkte"
    CASE 3 PRINT "drei Punkte"
    CASE 4 PRINT "vier Punkte"
    CASE 5 PRINT "fuenf Punkte"
    CASE 6 PRINT "sechs Punkte -> nochmal":W=TRUE
  END SELECT
  N=N+P
LOOP WHILE W
PRINT "Insgesamt gewuerfelt:";N


Beispiel Farbauswertung:

BUNT=FALSE
SELECT CASE POINT(X,Y)
  CASE BLACK
    PRINT "schwarz"
  CASE WHITE
    PRINT "weiss"
  CASE RED,GREEN,BLUE
    PRINT "Primaerfarbe"
    BUNT=TRUE
  CASE ELSE
    PRINT "Mischfarbe"
    BUNT=TRUE
END SELECT


Hinweis: Die SELECT CASE-Anweisung kann auch in einer einzigen Zeile geschrieben werden. In dem Fall müssen vor jedem CASE-Zweig und vor END SELECT ein Doppelpunkt als Trennzeichen für Anweisungen gesetzt werden. Allerdings ist es aus Gründen der besseren Lesbarkeit sehr zu empfehlen, eine der in den beiden Beispielen gezeigten mehrzeiligen Formatierungen zu verwenden.

SUB

Syntax: SUB <Prozedurname>
SUB <Prozedurname> ( <Argument> [ , ... ] )

Mit der Anweisung wird die Implementierung einer benutzerdefinierten Prozedur eingeleitet. Implizit wird damit auch das Hauptprogramm beendet. Die Prozedur endet mit der Anweisung END SUB.

Lesen Sie bitte auch die Erläuterungen zu den benutzerdefinierten Funktionen und Prozeduren!

SWAP

Syntax: SWAP <Variable_1> , <Variable_2>

Die Anweisung tauscht den Inhalt zweier Variablen. Das ist effektiver als drei selbst programmierte LET-Anweisungen. Besonders viel bringt die SWAP-Anweisung beim Tauschen der Inhalte von String-Variablen, da in den Fall die dynamische Speicherverwaltung der String-Verarbeitung nicht zur Anwendung kommt.

Beispiel:

DIM T$(2) AS STRING
T$(1)="Text 1"
T$(2)="Text 2"
SWAP T$(1),T$(2)
PRINT "T$1=";T$(1)
PRINT "T$2=";T$(2)

WAIT

Syntax: WAIT <E/A-Adresse> , <Maske> [ , <Inversion> ]
E/A-Adresse:Integer-Ausdruck
Maske:Integer-Ausdruck
Inversion:Integer-Ausdruck

Die Anweisung wartet auf das Eintreten eines bestimmten Zustandes an dem mit dem ersten Parameter angegeben Eingabetor. Dazu wird ständig von diesem Eingabetor (Port) gelesen und der gelesene Wert bitweise mit der Maske UND-verknüpft. Ist das Ergebnis 0, wird erneut gelesen. Die Funktion wartet also solange, bis eins der gelesenen und durch die Maske ausgewählten Bits gesetzt ist.

Damit man auch auf auf das Zurücksetzen von Bits warten kann, gibt es optional den dritten Parameter. Bei allen Bits, die dort gesetzt sind, gilt die umgekehrte Logik, d.h., es wird solange gewartet, bis eins der gelesenen Bits 0 ist.

Die WAIT-Funktion wartet solange, bis der folgende Ausdruck einen Wert ungleich 0 liefert:

(<gelesener Wert> XOR <Inversion>) AND <Maske>

WEND

Diese Anweisung markiert das Ende einer Schleife, die vorher mit der WHILE-Anweisung eröffnet worden ist.

WHILE

Syntax: WHILE <Bedingung>
Bedingung:Integer-Ausdruck

Die WHILE-Anweisung markiert den Anfang einer abweisenden Schleife, d.h. vor dem Schleifendurchlauf wird gepüft, ob die Bedingung erfüllt ist. Wenn ja, werden die Anweisungen in der Schleife durchlaufen. Wenn nein, wird an das Ende der Schleife (siehe WEND) gesprungen. Jede WHILE-Schleife muss mit WEND abgeschlossen werden.

I=1
WHILE i<10
  PRINT I
  I=I+1
WEND