Sie
sind hier MCS-BASIC |
![]() |
Übersicht
Anweisungen
Anmerkung
zu den trigonometrischen Funktionen
Anwendung
spezieller Operatoren
nach oben
Für Operationen, an denen zwei Operanden beteiligt sind, gilt allgemein die Syntax: [expr] Operator [expr]. MCS BASIC-52 kann folgende Operationen ausführen:
Anstelle des in anderen Basic-Dialekten gebräuchlichen, nach oben gerichteten Pfeils oder Dachs(^) steht hier der doppelte Stern. Einige Terminal-Emulatoren stellen dieses Zeichen anders dar, so dass Verwechslungen möglich wären.
Die erste Zahl stellt die Basis dar, die zweite Zahl ist der Exponent.
Beispiel:
PRINT
2**3
8
PRINT
10-3
7
( Logisches Und )
Beispiel:
PRINT
3.AND.2
2
( Logisches Oder )
Beispiel:
PRINT
3.OR.2
3
EXKLUSIV-ODER-Verknüpfung: .XOR.
( Logisches Exklusiv-Oder )
Beispiel:
PRINT
3.XOR.2
1
Die logischen Operationen .AND., .OR. und .XOR. verknüpfen bitweise zwei Integer-Operatoren; die Zahlenwerte der Operatoren müssen im Bereich 0...65535 (0...0FFFFH) liegen. Ist das nicht der Fall, so gibt der Interpreter die Fehlermeldung BAD ARGUMENT ERROR aus. Andere Zahlentypen (z.B. Real) werden nicht gerundet, sondern zurückgewiesen.
Die Punkte vor und hinter den logischen Operatoren stehen dort nicht ohne Grund. Der Basic-Interpreter eliminiert alle Leerzeichen zwischen den Operanden; in Programmlistings setzt er Leerzeichen nur vor und hinter Anweisungen ein. Bei einer Programmzeile wie “10 A = 10 * 10” ist dies belanglos, denn diese Zeile erscheint im Listing als “10 A=10*10”. Lautet die Zeile dagegen “10 B = A AND B”, so entsteht daraus “10 B = AANDB”. Waren die Leerzeichen bei der Eingabe vorhanden, wird die Anweisung zwar vom Basic-Interpreter richtig verstanden, für den Programmierer ist sie jedoch nicht mehr lesbar. Durch die Verwendung der Punkte wird die Eindeutigkeit der Anweisungen gewahrt.
Syntax: ABS([expr])
Diese Operation gibt den Absolutwert des Ausdrucks [expr] zurück.
Beispiel:
PRINT
ABS(5)
5
PRINT
ABS(-5)
5
Syntax: NOT([expr])
Es wird das 16-Bit-Komplement des Ausdrucks [expr] erzeugt, wobei [expr] vom Typ Integer (0...65535 bzw. 0...0FFFFH) sein muss. Zahlen anderer Typen werden gerundet.
Beispiel:
PRINT
NOT(65000)
535
PRINT
NOT(0)
65536
Syntax: INT([expr])
Gibt den Integeranteil (ganzzahligen Anteil) des Ausdrucks [expr] zurück.
Beispiel:
PRINT
INT(.7)
3
PRINT
INT(100.876)
100
Syntax: SGN([expr])
Das Ergebnis ist +1, wenn der Ausdruck größer als 0 ist, es ist 0, wenn der Ausdruck gleich 0 ist, und es ist –1, wenn der Ausdruck kleiner als 0 ist.
Beispiel:
PRINT
SGN(52)
1
PRINT
SGN(0)
0
PRINT SGN(-8)
-1
Syntax: SQR([expr])
Gibt die Quadratwurzel des Ausdrucks [expr] zurück. Der Ausdruck darf nicht kleiner als 0 sein. Die letzte Ziffer hat eine Genauigkeit von ± 5.
Beispiel:
PRINT
SQR(9)
3
PRINT
SQR(45)
6.7082035
PRINT SQR(100)
10
Syntax: RND
Mit dieser Operation kann eine Zufallszahl im Bereich 0...1 erzeugt werden. Abweichend von anderen Basic-Dialekten darf eine Pseudo- oder Dummy-Variable nicht angegeben werden; sie führt zur Fehlermeldung BAD SYNTAX.
Beispiel:
Syntax: PI
PI (p) ist eigentlich keine Operation, sondern eine Konstante mit reservierten Namen. Aus interpreter-internen Gründen hat PI den Zahlenwert 3.1415926, obwohl der Wert 3.1415927 die bessere Näherung. (3.14159265
35897932384626433832795)
Syntax: LOG([expr])
Berechnet den natürlichen Logarithmus des Ausdrucks [expr]. Der Ausdruck muss größer als 0 sein. Gerechnet wird mit einer Genauigkeit von 7 Digits.
Syntax: EXP ([expr])
Diese Operation potenziert die Zahl e (Basis des natürlichen Logarithmus) mit der Zahl, die der Ausdruck [expr] angibt.
Syntax: SIN([expr])
Gibt den Sinus des Arguments [expr] zurück. Das Argument muss ein Zahlenwert im Bogenmaß sein (180I=p), es muss im Bereich ± 200000 liegen. Die Genauigkeit beträgt 7 Digits
Beispiel:
PRINT
SIN(PI/4)
.7071067
PRINT SIN(0)
0
Syntax: COS([expr])
Gibt den Cosinus des Arguments [expr] zurück. Das Argument muss ein Zahlenwert im Bogenmaß sein (180I=p), es muss im Bereich ± 200000 liegen. Die Genauigkeit beträgt 7 Digits
Beispiel:
PRINT
COS(PI/4)
.7071067
PRINT
COS(0)
1
Syntax: TAN([expr])
Gibt den Tangens des Arguments [expr] zurück. Das Argument muss ein Zahlenwert im Bogenmaß sein (180I=p), es muss im Bereich ± 200000 liegen. Die Genauigkeit beträgt 7 Digits
Beispiel:
PRINT
TAN(PI/4)
1
PRINT
TAN(0)
0
Syntax: ATN([expr])
Gibt den Arcustangens des Arguments [expr] zurück. Das Argument muss ein Zahlenwert im Bogenmaß sein (180I=p), es muss im Bereich ± 200000 liegen. Die Genauigkeit beträgt 7 Digits
Der Basic-Interpreter errechnet den Sinus, Cosinus und Tangens mit Hilfe der Taylor-Reihen. Bevor dies geschieht, wird das Argument auf einen Zahlenwert reduziert, der zwischen 0 und ð / 2 liegt. Dazu benutzt der Interpreter das folgende Rechenverfahren:
a = (A / ð – INT(A / ð)) * ð
(a = reduziertes Argument, A = ursprüngliches Argument)
Das reduzierte Argument liegt im Betreich 0... . Der Interpreter stellt nun fest, ob das Argument größer oder kleiner als / 2 ist. ist es größer als / 2, so wird es von ð subtrahiert, ist es kleiner, so bleibt es unverändert.
Das Verfahren dient zwar dazu, die Berechnung möglichst effektiv durchführen zu können, es hat jedoch auch einen Nachteil. Wenn das Argument größer als ungefähr 1000 ist, sinkt die Genauigkeit des errechneten Zahlenwerts. Dann gehen signifikante Digits hinter dem Komma verloren, so dass auch das reduzierte Argument fehlerhaft ist. Deshalb sollte man in der Praxis darauf achten, dass das Argument klein bleibt.
Die Regeln der Mathematik legen fest, in welcher Weise Operationen und Zahlenwerte geschrieben werden müssen, wenn die Operationen in einer bestimmten Reihenfolge ausgeführt werden sollen. Ein bekanntes Beispiel ist die Regel “Punktrechnung geht vor Strichrechnung”; jeder lernt sie bereits in einer der unteren Schulklassen. Die Hierarchie der Operationen, die im MCS BASIC-52 gilt, ist folgende:
1. Auswerten von Klammerausdrücken ( )
2. Potenzieren **
3. Bool´sches Invertieren ¯
4. Multiplizieren * und Dividieren /
5. Addieren + und Subtrahieren –
6. Relationale Operationen =, <>,>,>=,<,<=
7. UND-Verknüpfung .AND.
8. ODER-Verknüpfung .OR.
9. XOR-Verknüpfung .XOR.
In allen Zweifelsfällen empfiehlt es sich, Klammern zu gebrauchen.
Die relationalen Operatoren =, <>,>,>=,< und <= benutzt man normalerweise, um Variablenwerte zu vergleichen. Als Ergebnis kann entweder “wahr” (0FFFFH = -1) oder falsch (0) zurückgegeben werden; das Ergebnis steht nach der Operation auf dem Argument Stack. Das ist auch der Grund dafür, dass es sich wie folgt ausdrucken lässt:
Der Mikrokontroller 8052 ist mit einer Reihe von speziellen Funktionsregistern (Special Function Register; SFR) ausgerüstet, deren Gebrauch das MCS BASIC-52 weitgehend unterstützt. Für diesen Zweck gibt es in diesem Basic verschiedene Spezialoperatoren, die in anderen Basic-Dialekten nicht zu finden sind. Diese Operatoren dienen hauptsächlich dazu, die besonderen Eigenschaften des Controllers von der Basic-Ebene aus zu nutzen. Die Operatoren können bei Zuweisungen grundsätzlich auf beiden Seiten des Gleichheitszeichens stehen; eine Ausnahme von der Regel machen nur die Operatoren CBY und GET.
Beispiel:
A=DBY(100)
DBY(100)=A
Beide Operatoren sind MCS BASIC-52 zulässig.
Syntax: CBY([expr])
CBY ist die Abkürzung für “Codebyte”; gemeint ist hiermit ein Byte des “Programmcodes”. Mit diesem Operator kann ein Byte aus dem Programmspeicher gelesen werden. Da das Schreiben in ein (E)PROM nicht möglich ist, darf CBY nur auf der rechten Seite eines Gleichheitszeichens stehen.
Die Anweisung A=CBY(100) weist der Variablen A den Inhalt des Speicherplatzes 1000 zu. Der Ausdruck [expr] muss ein ganzzahliger Wert (Integer) im Bereich 0...65535 (0...0FFFFH) sein. Die Adressen 0...1FFFH gehören zum internen Programmspeicher (ROM) des 8052.
Bei manchen Entwicklungssystemen kann ein EPROM als externer Programmspeicher hinzugefügt werden; der Adressbereich liegt zwischen 8000H und 9FFFH (EPROM-Typ 2764) bzw. 8000H und 0BFFFH (EPROM-Typ 27128).
Syntax: DBY([expr])
DBY steht für “Databyte”; hier geht es um ein Byte des kontrollerinternen Datenspeichers. Mit DBY kann ein Datenbyte sowohl gelesen werden als auch geschrieben werden. Das Datenbyte muss ebenso wie seine Adresse (Ausdruck [expr]) zwischen 0 und 255 liegen, denn zum internen Datenspeicher gehören 256 Byte mit jeweils 8 Bit.
Beispiel:
A=DBY(B) DBY(250)=CBY(1000)
Die erste Anweisung weist der Variablen A den Inhalt des internen Speicherplatzes B zu, die zweite setzt den Inhalt des internen Speicherplatzes 250 mit dem Inhalt des Programmspeicherplatzes 1000 gleich.
Syntax: XBY([expr])
XBY bedeutet “Externbyte”. Dieser Operator dient dazu, den Inhalt eines Speicherplatzes zu lesen oder zu schreiben, der zum externen Datenspeicher gehört. Der Zahlenwert des Ausdrucks [expr] muss im Bereich 0...65535 (0...0FFFFH) liegen, der zu schreibende Wert muss eine ganze Zahl zwischen 0 und 255 sein. Anderenfalls gibt der Interpreter die Fehlermeldung BAD ARGUMENT ERROR aus.
Beispiel:
XBY(4000H)=DBY(100) A=XBY(3FFFH)
Die erste Anweisung bewirkt, dass der Inhalt des internen Speicherplatzes 100 in den externen Speicherplatz 4000H kopiert wird, während die zweite Anweisung der Variablen A den Inhalt des externen Speicherplatzes 3FFFH zuweist.
Entwicklungssysteme können, je nach Hardware, mit einem oder zwei RAM-IC´s vom Typ 6264 bestückt werden. Bei der Bestückung mit einem IC kann [expr] zwischen 0 und 1FFFH liegen, bei zwei IC´s ist Adresse 3FFFH die obere Grenze. Dem EPROMEPROM ist der Adressenbereich 8000H...9FFFH (EPROM-Typ 2764) bzw. 8000H...0BFFFH (EPROM-Typ 27128) zugeteilt. Das EPROM kann sowohl als Programm- als auch als Datenspeicher angesprochen.
Syntax: GET
Genau betrachtet ist GET gleichzeitig ein Operator und eine reservierte Variable. Innerhalb eines Programms prüft GET den Eingangspuffer der seriellen Schnittstelle, die den Kontroller mit dem Terminal verbindet. Ist dort ein Zeichen eingetroffen, so wird der Zeichencode der Variablen GET zugewiesen, ist kein Zeichen vorhanden, hat GET den Zahlenwert 0.
Achtung: GET wartet nicht etwa so lange, bis ein Zeichen eintrifft! Nachdem GET vom Programm ausgewertet wurde, wird GET automatisch wieder auf 0 gesetzt.
GET lässt sich sinnvoll nur im Programm-Modus verwenden; im Kommando-Modus gibt GET stets den Zahlenwert 0 zurück.
Das folgende Programm schreibt fortlaufend den ASCII-Code des Zeichens auf den Bildschirm, das auf der Tastatur gedrückt wird.
>10
A=GET
>20 IF A<>0 THEN PRINT A
>30 GOTO 10
>RUN
65 (“A” gedrückt)
49 (“1” gedrückt)
24 (“Control–X”
gedrückt)
50 (“2” gedrückt)
Die folgenden Operatoren dienen zum Lesen und zur Modifikation der speziellen Funktionsregister (Special Function Register; SFR), die bereits am Anfang dieses Buchs beschrieben wurden. Beim Programmieren kann man die Operatoren, die identisch mit den Registernamen sind, im allgemeinen als reservierte Variablennamen betrachten.
Syntax: IE
Mit IE lässt sich das Interrupt-Enable-Register lesen und verändern. Da dieses Register aus 8 Bit besteht, muss ein zugewiesener Zahlenwert zwischen 0 und 255 liegen. Bit IE.6 ist unbenutzt; es kann beim Lesen durch die Anweisung A=IE.AND.0BFH maskiert werden. Basic-Anweisungen, die das IE-Register beeinflussen, sind CLOCK0, CLOCK1, ONEX1, CLEAR und CLEARI.
Beispiel:
IE=81H A=IE.AND.0BFH
Syntax: IP
Das Interrupt-Priority-Register wird mit IP gelesen und verändert. Da dieses Register 8 Bit umfasst, muss ein zugewiesener Zahlenwert zwischen 0 und 255 liegen. Die Bits IP.6 und IP.7 sind unbenutzt; sie können beim Lesen durch die Anweisung A=IP.AND.3FH maskiert werden. Beim Einschalten des Systems oder beim Reset wird in das Register IP nicht geschrieben. Der Programmierer kann die Prioritäten der einzelnen Interrupts selbst festlegen.
Beispiel:
IP=3
A=IP.AND.3FH
Syntax: PORT1
PORT1 dient dazu, ein Zeichen von I/O-Port P1 zu lesen oder ein Zeichen über diesen Port zu senden. Eine sogenannte Read-Modify-Write-Anweisung ist nicht zulässig: Die Anweisung PORT1=PORT1.OR.01 kann Probleme verursachen, weil ein Bit, das beim Lesen zufällig logisch 0 ist, wieder in das Register geschrieben wird. Dieses Bit bleibt anschließend ständig auf logisch 0, denn die zugehörige Portleitung ist nicht mehr als Eingang verwendbar. Deshalb muss stets eine zusätzliche Variable benutzt werden.
Beispiel:
PT1=255
PORT1=PT1
PT1=PT1.OR.01
PORT1=PT1
Da das Register PORT1 aus 8 Bit besteht, muss ein zugewiesener Zahlenwert zwischen 0 und 255 liegen.
Syntax: PCON
Mit PCON kann das Special Function Register gleichen Namens gelesen und verändert werden. Der 8052 benutzt von den 8 Bit nur das am meisten signifikante Bit. Wird dieses Bit gesetzt, so verdoppelt sich die mit Timer/Zähler 1 festgelegte Baudrate.
Syntax: RCAP2
Hiermit werden die Register RCAP2H und RCAP2L gelesen und verändert. Zusammen bilden diese beiden Register ein 16-Bit-Register; es enthält den Reload/Capture-Wert für Timer 2. Um die Baudrate der seriellen Schnittstelle zu berechnen, kann man folgende Anweisung verwenden:
BD=XTAL/(32*(65535-RCAP2))
Syntax: T2CON
Das Register T2CON steuert den Timer / Zähler 2 und legt unter anderem dessen Betriebsart fest. Nach dem Systemstart oder Reset wird in dieses Register der Zahlenwert 52 (34H) geschrieben. Der Basic-Interpreter erwartet, dass dieser Wert unverändert bleibt. Nach willkürlicher Änderung arbeitet die serielle Schnittstelle in den allermeisten Fällen nicht mehr.
Syntax: TCON
Mit TCON wird das Special Function Register TCON gelesen oder verändert. Dieses Register steuert die beiden Timer 0 und 1; es ist unter anderem für die Freigabe und Sperre dieser Timer sowie für die zugehörigen Interrupts zuständig. Auch die Betriebsart der externen Interruptleitung (pegel- oder flankengetriggert) wird mit TCON bestimmt.
Das Register TCON umfasst insgesamt 8 Bit. Nach dem Systemstart oder Reset schreibt der Interpreter den Zahlenwert 244 (0F4H) in dieses Register; er geht davon aus, dass keine Änderungen eintreten. Das Rücksetzen von Bit 4 stoppt die Echtzeituhr, das Rücksetzen von Bit 6 hat zur Folge, dass Timer 1 blockiert. Die EPROM
-Programmierroutinen, die serielle Druckerschnittstelle und die Anweisung PWM arbeiten dann nicht mehr. Für den Umgang mit TCON ist deshalb Sorgfalt geboten!
Syntax: TMOD
Der Inhalt des Registers TMOD legt die Betriebsarten der Timer 0 und 1 fest. Auch dieses Register besteht aus 8 Bit. Nach dem Systemstart oder Reset wird in TMOD der Zahlenwert 16 (10H) geschrieben. Damit arbeitet Timer 0 in der Betriebsart 0 und Timer 1 in der Betriebsart 1. Der Interpreter geht davon aus, dass diese Einstellung nicht verändert wird. Das Ändern der Betriebsart von Timer 0 hat zur folge, dass die Echtzeituhr nicht mehr richtig läuft; bei Timer 1 führt eine solche Änderung zu Fehlaktionen des EPROM-Programmierers, der seriellen Druckerschnittstelle und der Anweisung PWM. Wenn hiervon kein Gebrauch gemacht wird, ist Timer 1 beliebig als Timer oder als Zähler verwendbar.
Syntax: TIME
Die Echtzeituhr, die bereits standardmäßig im MCS BASIC-52 enthalten ist, lässt sich mit TIME steuern. Register TIME kann sowohl gelesen als auch beschrieben werden. Die Echtzeituhr startet, sobald der Interpreter die Anweisung CLOCK1 erhält. Danach wird der Inhalt von TIME nach jeweils 5 Millisekunden um 1 erhöht (inkrementiert). Timer / Zähler 0 erzeugt zu diesem Zweck Interrupts, die sich im 5-ms-Rhythmus wiederholen. Damit die Echtzeituhr weder vor- noch nachläuft, muss der Variablen XTAL der richtige Wert zugewiesen sein. In das Register TIME kann ein ganzzahliger Wert geschrieben werden; er repräsentiert eine Zeit in Sekunden. Der im Register stehende Teil, der auf die Nachkommastellen entfällt, wird hierdurch nicht verändert. TIME=100 ist folglich eine Anweisung, die den Integer-Teil von TIME auf 100 setzt.
Diese Zeitbasis ist im BasicMaster nur halb so schnell, weil anstelle eines 11,0592 MHz-Quartzes ein 6 MHz-Quartz eingesetzt ist.
Beispiel:
>CLOCK1 (startet die Echtzeituhr)
>CLOCK0 (stoppt die Echtzeituhr)
>PRINT TIME (gibt die Zeit auf dem Bildschirm aus)
3.315
>TIME=0 (setzt die Echtzeituhr auf 0 s)
>PRINT TIME (gibt die Zeit auf dem Bildschirm aus)
.315 (nur der ganzzahlige Teil von TIME ist nullgesetzt)
> PRINT 2*TIME (gibt ungefähr die richtige Zeit im BasicMaster)
10 CLS:PRINT "Zeittest"Wenn auch die hinter dem Komma stehenden Sekundenbruchteile nullgesetzt werden sollen, muss der Inhalt des internen Speicherplatzes 71 (47H) mit einer DBY-Anweisung geändert werden. Der dort stehende Zahlenwert repräsentiert eine Zeit in 5-ms-Einheiten
Beispiel:
Durch Ändern des Inhalts von Speicherplatz 71 (47H) kann man auch Interruptintervalle erzeugen, die kürzer als 1 Sekunde sind.
Normalerweise wird man jedoch nur den ganzzahligen Teil von TIME auf einen gewünschten Wert setzen, denn andernfalls leidet die Genauigkeit. Das lässt sich wie folgt erklären: Eine Anweisung, die eine 12-Stunden-Uhr nachbildet ist ONTIME 4300,<ln num> (12 Stunden entsprechen 4300 Sekunden). Der nach 4300 s erzeugte Interrupt bewirkt, dass das Programm bei Zeile <ln num> fortgesetzt wird. In dieser Zeile muss die Anweisung TIME=0 stehen; nur so kann ein 12-Stunden-Rhythmus entstehen. Wenn sowohl die Sekunden als auch die Sekundenbruchteile nullgesetzt werden, hätte dies bei jedem 12-Stunden-Intervall einen Fehler zur Folge. Der Fehler wird dadurch hervorgerufen, dass das Nullsetzen von TIME nicht gleichzeitig mit dem Interrupt, sondern erst kurze Zeit später geschehen kann. Wird jedoch nur der ganzzahlige Teil von TIME nullgesetzt, hat das Programm hierfür fast eine Sekunde lang Zeit.
Syntax: TIMER0
TIMER 0 dient dazu, die Register TH0 und TL0 zu lesen und zu verändern; sie bilden zusammen ein 16-Bit-Register. Der Basic-Interpreter benutzt TH0 und TL0 für den Bereich der Echtzeituhr. Nur wenn die Echtzeituhr nicht verwendet wird, sind diese Register für andere Zwecke verfügbar.
TIMER1
Syntax: TIMER1
Mit TIMER 1 können die Inhalte der Register TH1 und TL1 gelesen und verändert werden. Auch diese beiden Register bilden zusammen ein 16-Bit-Register. Der Interpreter benutzt TH1 und TL1 zur Steuerung der seriellen Schnittstelle, für den EPROM-Programmierer und zur Erzeugung pulsbreitenmodulierter Signale (Anweisung PWM). Wenn von diesen Optionen kein Gebrauch gemacht wird, stehen die Register für andere Zwecke zur Verfügung.
TIMER2
Syntax: TIMER2
Die Register TH2 und TL2, die zusammen ebenfalls ein 16-Bit-Register bilden, lassen sich mit TIMER2 lesen und verändern. Diese beiden Register werden vom Interpreter zur Erzeugung der Baudrate für die serielle Schnittstelle benutzt. Nur wenn die serielle Schnittstelle außer Betrieb ist, dürfen die Register TH2 und TL2 anderweitig verwendet werden.
Syntax: XTAL
XTAL informiert den Interpreter darüber, mit welcher Quarzfrequenz das System arbeitet. Die auf XTAL folgende Zahl muss die Frequenz in Hertz angeben. Von diesem Wert hängt die Funktion der Echtzeituhr, des EPROM
-Programmierers und der seriellen Druckerschnittstelle ab.
Beispiel:
XTAL=9000000
Hier beträgt die Quarzfrequenz 9,000 MHz. Wird die Anweisung XTAL nicht gegeben, so nimmt der Interpreter eine Frequenz von 11,0592 MHz an.
Mit dem im MCS BASIC-52 enthaltenen speziellen Operatoren können die beiden Bytes aller 16-Bit-Register voneinander unabhängig gelesen und verändert werden.
Schreiben des höherwertigen Bytes:
>TIMER0=(TIMER0.AND.00FFH) + INT(256*(USER BYTE))
Schreiben des niederwertigen Bytes:
>TIMER0=(TIMER0.AND.0FF00H) + USER BYTE
Lesen des höherwertigen Bytes:
>PH0.INT(TIMER0/256)
Lesen des niederwertigen Bytes:
>PH0.TIMER0.AND.0FFH
TIMER1 kann als Baudraten-Generator für die serielle Schnittstelle arbeiten. Hierfür müssen folgende Anweisungen gegeben werden:
>TMOD=32 : REM TIMER1 im Auto Reload Mode
>TIMER1=256*(256-(65536-RCAP2)/12) : REM TIMER1 laden
>T2CON=0 : REM TIMER1 als Baudraten-Generator
Die vorstehenden Anweisungen können sowohl im Kommando-Modus eingegeben werden als auch in einem Programm stehen. Wenn TIMER1TIMER1 als Baudraten-Generator arbeitet, ist TIMER2TIMER2 für andere Zwecke verwendbar. Die Anweisungen PROG, FPROG, LIST#, PRINT# und PWM dürfen in diesem Fall nicht mehr benutzt werden. Ferner kann die Baudrate bei bestimmten Quartzfrequenzen auf maximal 2400 Baud begrenzt sein.
Syntax: MTOP
Nach jedem Systemstart oder Reset testet der Basic-Interpreter den externen Speicher. Die Adresse des Speicherplatzes, der die obere Grenze des verfügbaren Speichers darstellt, wird der Systemvariablen MTOP zugewiesen. Der Interpreter benutzt ausschließlich den Adressenbereich, der unterhalb von MTOP liegt.
Wenn ein Teil des Speichers für andere Zwecke reserviert bleiben soll, kann MTOP auf eine niedrigere Adresse gesetzt werden, zum Beispiel durch die Anweisung MTOP = USER ADRESS. Weist man MTOP eine Adresse zu, die oberhalb des RAM-Adressenbereichs liegt, meldet der Interpreter einen MEMORY ALLOCATION ERROR.
Beispiel:
>PRINT MTOP
32767
>MTOP=2000H
>PRINT MTOP
8192
Syntax: LEN
Die Systemvariable LEN gibt die Länge des im Arbeitsspeicher stehenden Programms an. Sie kann nur gelesen werden; die Zuweisung eines Zahlenwertes ist nicht möglich. Wenn kein Programm im Speicher steht, ist LEN gleich 1, denn das Programm-Ende-Zeichen hat die Länge 1.
Syntax: FREE
Die Systemvariable gibt Auskunft über die Größe des verfügbaren Bereichs im Arbeitsspeicher. Im Gegensatz zu anderen Basic-Versionen braucht hier keine Pseudovariable angegeben zu werden. Der rechnerische Zusammenhang mit den beiden anderen Systemvariablen ist FREE = MTOP-LEN-511.
Der
folgende Teil dieses Kapitels enthält alle für den
Programmierer wichtigen Informationen zu den einzelnen
Basic-Anweisungen und -Befehlen.
Eine
Zeilenschaltung (Carriage Return) ist mit <cr> angedeutet.
RUN
Syntax: RUN <cr>
Typ: Befehl
Modus: Kommando
Beschreibung: Unmittelbar nach Empfang von RUN werden alle Variablenwerte gelöscht, und die Programmausführung startet bei der ersten Programmzeile. Basic-Programme lassen sich ausschließlich mit RUN oder GOTO starten. Der Interpreter wechselt vom Kommando-Modus in den Programm-Modus. Die Programmausführung kann mit dem Zeichen "Control-C" abgebrochen werden.
Optionen: Mit RUN lässt sich ein Programm nur von der ersten Programmzeile an (niedrigste Zeilennummer) starten. Eine bei anderen Basic-Versionen mögliche Angabe der Start-Zeilennummer (z.B. ´RUN 100`) ist nicht erlaubt. Soll die Programmausführung nicht bei der ersten Zeile beginnen, so muss man das Statement GOTO verwenden.
Beispiel:
>10
FOR I=1
TO 3
>20 PRINT I
>30 NEXT I
>RUN
1
2
3
READY >
CONT
Syntax: CONT <cr>
Typ: Befehl
Modus: Kommando
Beschreibung: Wenn die Programmausführung durch die Eingabe von Control-C oder durch eine im Programm stehende STOP-Anweisung unterbrochen wurde, kann sie mit CONT fortgesetzt werden. Während der Programmunterbrechung können Variablen- und Konstantenwerte angezeigt und geändert werden. CONT ist unwirksam, wenn das Programm während der Unterbrechung geändert wurde oder die Unterbrechung von einem Programmfehler (ERROR) herrührt.
Optionen: keine
Beispiel:
>10
FOR I=1
TO 10000
>20 PRINT I
>30 NEXT I
>RUN
1
2
3
4
5 <= Control-C drücken
STOP
– in
line 20
READY
>PRINT
I
6
>I=10
>CONT
10
11
12

Syntax: LIST <cr>
Typ: Befehl
Modus: Kommando
Beschreibung: Nach Eingabe von LIST <cr> wird das Programmlisting auf dem angeschlossen Terminal ausgegeben. Der Interpreter fügt hierbei hinter jeder Zeilennummer sowie vor und nach jeder Basic-Anweisung Leerzeichen ein, so dass das Listing leichter lesbar ist. Um Speicherplatz zu sparen, stehen die Leerzeichen nur im Listing, nicht im Programm selbst. Die Ausgabe des Listing kann mit Control-C unterbrochen werden.
Optionen: LIST [ln num]<cr>
LIST [ln num] - [ln num]<cr>
Bei der ersten Option beginnt das Listing
bei der angegebenen Zeilennummer, bei der zweiten wird der Programmteil
gelistet, dessen Zeilennummer zwischen den angegebenen Grenzen liegt.
Das Zeichen "-" bedeutet hier "bis" und nicht etwa "minus".
LIST#
Syntax: LIST# <cr>
Das Programmlisting wird über eine andere serielle Leitung (Portleitung P1.7) zum Drucker geschickt. Die Übertragungsgeschwindigkeit muss mit der Anweisung BAUD festgelegt werden.
LIST@
(nur bei Interpreter-Version 1.1)
Syntax: LIST# <cr>
Die Wirkung dieses Befehls ist die gleiche wie bei LIST, jedoch wird hier ein Ausgangstreiber des Benutzers aufgerufen. Der Maschinencode des Treibers muss bei Adresse 403CH des externen Programmspeichers beginnen. Ferner muss Bit 24.7H des bitadressierbaren Speichers gesetzt sein, was sich entweder durch die Basic-Anweisung DBY(24H)=DBY(24H).OR.80H oder durch einen entsprechenden Maschinensprache-Befehl erreichen lässt. Wenn das Bit nicht gesetzt ist, wird das Listing wie bei List zum Terminal gesandt.
Ist das genannte Bit gesetzt, dann stehen die auszugebenden Bytes jeweils in Register R5 der Registerbank 0(RB0). Das Treiberprogramm darf die Inhalte des Akkus(A) und des Datenpointers(DPTR) verändern, während RB0 unverändert bleiben muss.
Beispiel:
READY
>LIST
10
PRINT "LOOP
PROGRAM"
20 FOR I=1 TO 3
30 PRINT I
40 NEXT I
50 END
READY
>LIST 30
30
PRINT I
40 NEXT I
50 END
READY
>LIST
20-40
20 FOR I=1 TO 3
30 PRINT I
40 NEXT I
NEW
Syntax: NEW <cr>
Typ: Befehl
Modus: Kommando
Beschreibung: Nach NEW <cr> löscht der Interpreter ein im Arbeitsspeicher stehendes Programm. Alle Variablen und Strings werden nullgesetzt, alle Interrupts werden rückgesetzt. Der Stand der Echtzeituhr, der Umfang des String-Speichers und der interne Stackpointer (Adresse 3EH) bleiben dagegen erhalten.
Optionen: keine
Beispiel: -
NULL
Syntax: NULL <cr>
Typ: Anweisung
Modus: Kommando
Beschreibung: NULL weist den Interpreter an, eine bestimmte Anzahl von Nullzeichen (00H) an gesendete Zeilenschaltungszeichen (<cr> ; 0DH) anzuhängen. Nach der Initialisierung hat NULL den Wert 0.
Die Anzahl der Nullzeichen steht in Speicherplatz 15H des internen RAM, sie lässt sich mit der Basic-Anweisung DBY(15H)=[expr] im Bereich von 0 bis 0FFH verändern.
NULL war für die Steuerung von solchen Druckern gedacht, die während einer Zeilenschaltung (<cr>) keine weiteren Zeichen verarbeiten können. Da alle modernen Drucker über einen eingebauten Zeichenpuffer verfügen, wird man dieses Kommando heute nur noch in Ausnahmefällen brauchen.
Optionen: keine
Beispiel: -
RAM, ROM
Syntax: RAM <cr> bzw. ROM <cr>
Typ: EPROM-File-Befehle
Modus: Kommando
Beschreibung: Diese Befehle aktivieren entweder das im Arbeitsspeicher (RAM) stehende Programm oder das im EPROM abgelegte Programm. Das aktivierte Programm ist das Programm, das durch LIST gelistet und durch RUN gestartet wird. Die Startadresse im Arbeitsspeicher ist 200H, die Startadresse im EPROM ist 8010H.
Mit ROM [integer] <cr> kann man eins von mehreren im EPROM stehenden Programmen auswählen. Wenn nach ROM keine Programmnummer folgt, führt der Interpreter das erste Programm aus, das er dort vorfindet. Nach Auswahl eines Programms, das nicht existiert (z.B. ROM 6 <cr>) bei nur vier Programmen im EPROM), folgt die Fehlermeldung ERROR: PROM MODE.
Ein im EPROM stehendes Programm wird bei seiner Ausführung nicht in den Arbeitsspeicher kopiert; Programmänderungen sind deshalb nicht möglich. Für den Programmtransfer vom EPROM ins RAM muss das Kommando XFER <cr> benutzt werden. Im Arbeitsspeicher und im EPROM können unterschiedliche Programme gespeichert sein, zwischen denen man mit den Kommandos RAM und ROM hin- und herschalten kann. Die Variablen MTOP und FREE beziehen sich immer auf das Programm im RAM.
Optionen: keine
Beispiel: -
XFER
Syntax: XFER <cr>
Typ: EPROM-File-Befehle
Modus: Kommando
Beschreibung: XFER <cr> kopiert das im EPROM selektierte Programm in den Arbeitsspeicher (RAM); anschließend schaltet der Interpreter selbsttätig vom ROM- in den RAM-Modus um. Das im RAM stehende Programm kann bei Bedarf modifiziert werden.
Wird XFER im RAM-Modus eingegeben, so kopiert der Interpreter das im RAM stehende Programm auf sich selbst und bleibt anschließend im RAM-Modus. In diesem Fall ändert sich folglich nichts, der Interpreter ist jedoch einige Millisekunden mit Kopiervorgang beschäftigt.
Optionen: keine
Beispiel: -
BAUD (Der Befehl wird durch die
MOTRON
Erweiterung INIT INP ersetzt)
Syntax: BAUD [integer] <cr>
Typ: Steuerbefehl
Modus: Kommando oder Programm
Beschreibung: Mit BAUD wird die Übertragungsgeschwindigkeit (Baudrate) der seriellen Druckerschnittstelle (Portleitung P1.7) festgelegt. Die tatsächliche Übertragungsgeschwindigkeit stimmt nur dann mit der programmierten Geschwindigkeit überein, wenn die Variable XTAL (Quarzfrequenz) den richtigen Wert hat. Wenn XTAL nicht definiert wurde, setzt der Interpreter einen Quarz mit der Frequenz 11,0592 MHz voraus. Beträgt die Frequenz beispielsweise 9,000 MHz, so muss die Anweisung XTAL=9000000 gegeben werden. Über die serielle Druckerschnittstelle kann man zum Beispiel mit dem Befehl LIST# ein Programmlisting ausdrucken lassen. Das Datenformat ist stets 1 Startbit, 8 Datenbits, 2 Stopbits, keine Parität (= kein Paritätsbit). Gebräuchlich sind Übertragungsgeschwindigkeiten zwischen 1200 und 9600 Baud.
Optionen: keine
Beispiel:
>BAUD 1200
READY>
oder
>10 BAUD 1200
READY
>LIST
10 BAUD 1200
READY
>
Über die serielle Druckerschnittstelle (Portleitung P1.7) werden Daten mit einer Geschwindigkeit von 1200 Baud übertragen.
CALL
Syntax: CALL <cr>
Typ: Anweisung
Modus: Kommando oder Programm
Beschreibung: Die CALL-Anweisung startet ein Maschinenspracheprogramm; die Startadresse muss durch [integer] angegeben werden. Um auf die Basic-Programmebene zurückzukehren, muss das Maschinenspracheprogramm mit dem Befehl RET enden.
Optionen: Interpreter-Version 1.1 bietet folgende Option an: Wenn die Zahl [integer] der CALL-Anweisung zwischen 0 und 7FH liegt, berechnet der Interpreter eine vektorisierte Startadresse. Er addiert zur Adresse 4100H zweimal die Zahl [integer] und benutzt die resultierende Adresse als Startadresse des Maschinenspracheprogramms. Bei CALL 0 springt der Interpreter nach 4100H, bei CALL 1 nach 4102H, bei CALL 2 nach 4104H usw.
Beispiel:
>10 CALL 9000H
Nach dieser Anweisung startet das Maschinenspracheprogramm, das bei Adresse 9000H beginnt. Hierzu wird der prozessorinterne Befehlszähler mit der Zahl 9000H geladen.
>10 CALL 3
Nach dieser Anweisung startet das Maschinenspracheprogramm, das bei Adresse 4104H beginnt. Hierzu wird der prozessorinterne Befehlszähler mit der Zahl (4100H + (2*3)) = 4106H geladen.
CLEAR, CLEARI, CLEARS
Syntax: CLEAR <cr>
bzw. CLEARI <cr>
bzw. CLEARS <cr>
Typ: Steuerbefehle
Modus: Kommando oder Programm
Beschreibung: Das CLEAR-Statement setzt alle Variablen auf Null und beendet alle Basic-Interrupts. Hierdurch werden die Statements ONEX1 und ONTIME inaktiv; sie lassen sich allerdings anschließend erneut starten. Auch die Fehlerbearbeitung durch ONERR ist vollständig unterbunden. Nicht beeinflußt wird dagegen die mit CLOCK1 gestartete Echtzeituhr, und auch der mit STRING [expr],[expr] reservierte Testspeicher-Bereich bleibt unverändert.
CLEARI (clear interrupt) stoppt lediglich die Interrupts; im Special Function Register (SFR) IE werden die Bits 2 und 3 sowie das Statusbit rückgesetzt. Auf diese Weise können Interrupts während der Ausführung bestimmter Basic-Programmteile gesperrt werden. Die Sperre lässt sich mit den Statements ONTIME und ONEX1 wieder aufheben. Auf die Echtzeituhr hat CLEARI keine Auswirkungen.
CLEARS (clear stack) initialisiert alle vom Basic-Interpreter benutzten Stacks. Der CONTROL- und der ARGUMENT-Stack werden in ihren Ausgangszustand versetzt. In den Stackpointer (Special Function Register (SFR) SP) wird der Inhalt des Speicherplatzes 3EH kopiert, der zum internen RAM gehört. Mit Hilfe von CLEARS sind zum Beispiel Sprünge aus NEXT-, DO-WHILE- UND DO-UNTIL-Schleifen möglich, ohne die Schleifen zu beenden.
Optionen: keine
Beispiel:
>10
PRINT
"MULTIPLIKATIONSTEST; SIE HABEN FÜNF SEKUNDEN"
>20 FOR I=2 TO 9
>30 N=INT(RND*10) : A=N*I
>40 PRINT "WIEVIEL IST",N, "*",I, "?" : CLOCK1
>50 TIME=0 : ONTIME 5,200 : INPUT R : IF R<>A THEN
100
>60 PRINT "DAS STIMMT, " : TIME=0 : NEXT I
>70 PRINT "GUT GEMACHT! " : END
>100 PRINT "FALSCH, BITTE NOCH EINMAL! " : GOTO 50
>200 REM ZEITÜBERSCHREITUNG
>210 CLEARS : PRINT "ZEIT IST ABGELAUFEN! " : GOTO 10
! Im Listing erscheinen CLEARI und CLEARS als CLEAR I und CLEAR S. Dies ist kein Fehler, sondern eine Eigenart des MCS BASIC-52 Version 1.1.
Syntax: CLOCK0 <cr> bzw. CLOCK1 <cr>
Typ: Steuerbefehle
Modus: Kommando oder Programm
Beschreibung: CLOCK1 startet die Echtzeituhr des Basic-Interpreters, indem unter anderem die Bits 2 und 7 des Registers IE gesetzt werden. Anschließend wird das Register TIME nach jeweils 5 ms um eins erhöht (inkrementiert). Die Echtzeituhr arbeitet mit dem Zähler/Timer 0 im 13-Bit-Modus, so dass alle 5 ms ein Interrupt entsteht.
Der Basic-Interpreter berechnet die Zahl, mit der Zähler/Timer 0 geladen werden muss. Ebenso wie bei verschiedenen anderen Statements muss die Systemvariable XTAL (Quarzfrequenz) den richtigen Wert haben; wenn XTAL nicht definiert wurde, setzt der Interpreter einen Quarz mit der Frequenz 11,0592 MHz voraus. Register TIME zählt von 0 bis 65535,995 s und springt dann wieder auf 0 zurück. Solange die Echtzeituhr läuft, dürfen die Interrupts des Timer/Zähler 0 nicht blockiert werden. Die Arbeitsgeschwindigkeit sinkt bei laufender Echtzeituhr auf 99,6 % ihres ursprünglichen Wertes; in der Praxis ist dies fast immer ohne Bedeutung.
CLOCK0 stoppt die Echtzeituhr; Bit 2 des Registers IE wird rückgesetzt. Anschließend kann Timer/Zähler 0 für andere Zwecke verwendet werden. Die Uhr lässt sich nur mit diesem Statement außer Betrieb setzen; CLEAR und CLEARI haben keinen Einfluß.
Optionen: keine
Beispiel: -
Syntax: DATA [expr] bzw. READ [expr] bzw RESTORE
Typ: Anweisungen
Modus: Programm
Beschreibung: Die auf DATA in der gleichen Programmzeile folgenden numerischen Ausdrücke oder Zeichenketten werden im Speicher abgelegt; die Ausdrücke können anschließend mit READ jeweils einer Variablen zugeordnet werden. Wenn auf die DATA-Anweisung mehr als ein Ausdruck folgt, müssen die Ausdrücke durch Kommas voneinander getrennt werden. DATA-Anweisungen können an beliebiger Stelle im Programm stehen.
Auf die Anweisung READ folgen stets eine oder mehrere Variablen; mehrere Variablen müssen voneinander durch Kommas getrennt werden.
RESTORE setzt den Zeiger in seine Ausgangsstellung, der auf den jeweils nächsten zu lesenden Ausdruck zeigt.
Optionen: keine
Beispiel:
>10
FOR I=1
TO 3
>20 READ A,B
>30 PRINT A,B
>40 NEXT I
>50 RESTORE
>60 READ A,B
>70 PRINT A,B
>80 DATA 10,20,10/2,20/2,SIN(PI),COS(PI)
>RUN
10 20
5 10
0 –1
10 20
Syntax: DIM [variable]([integer]) <cr>
Typ: Anweisung
Modus: Kommando und Programm
Beschreibung: DIM legt die maximale Anzahl der Elemente von Feldvariablen (Arrays) fest und reserviert den benötigten Speicherplatz. Im MCS BASIC-52 können nur eindimensionale Felder mit maximal 254 Elementen definiert werden. Nicht mit DIM dimensionierte Feldvariablen werden bei ihrer Einführung automatisch dimensioniert; sie bestehen aus 10 Elementen. Nach RUN, CLEAR und NEW haben alle Feldvariablen null Elemente. Der von einer Feldvariablen belegte Speicherplatz lässt sich wie folgt berechnen: 6 mal (Anzahl der Elemente +1). Eine zweite Dimensionierung der gleichen Variablen innerhalb eines Programms ist nicht erlaubt.
Optionen: Es können mehrere Variablen durch die gleiche DIM-Anweisung dimensioniert werden, z.B. DIM A(9), B(10), C(6), KL(10).
Beispiel: Dimensionierung einer bereits eingeführten Variablen
>10
A(5)=10
>20 DIM A(5)
>RUN
ERROR ARRAY SIZE – IN LINE 20
20 DIM A(5)
----x
DO - UNTILSyntax: DO
…
UNTIL [rel expr]
Typ: Steueranweisungen
Modus: Programm
Beschreibung: Mit diesen Anweisungen lassen sich bedingte Programmschleifen aufbauen. Die von DO und UNTIL begrenzte Anweisungs- oder Befehlsfolge wird mehrfach ausgeführt, und zwar so lange, bis der hinter UNTIL stehende Ausdruck logisch "wahr" ist. Die Verschachtelung mehrerer DO - UNTIL - Schleifen ist erlaubt.
Optionen: keine
Beispiel:
Beispiel 1: Einfache DO – UNTIL – Schleife
>10 A=0
>20 DO
>30 A=A+1
>40 PRINT A
>50 UNTIL A=4
>60 PRINT "FERTIG"
>RUN
1
2
3
4
FERTIG
READY
>
Beispiel 2: Geschachtelte DO – UNTIL – Schleifen
>10
DO :
A=A+1 : DO : B=B+1
>20 PRINT A,B,A*B
>30 UNTIL
B=3>40 B=0
>50 UNTIL A=3
>RUN
>10
DO
>12 A=A+1
>14 DO
>16 B=B+1
>20 PRINT A,B,A*B
>30 UNTIL B=3>40 B=0
>50 UNTIL
A=3>RUN
1 1 1
1 2 2
1 3 3
2 1 2
2 2 4
2 3 6
3 1 3
3 2 6
3 3 9
READY
>
DO - WHILESyntax: DO
…
WHILE [rel expr]
Typ: Steueranweisungen
Modus: Programm
Beschreibung: Mit diesen Anweisungen lassen sich bedingte Programmschleifen aufbauen. Die von DO und WHILE begrenzte Anweisungs- oder Befehlsfolge wird mehrfach ausgeführt, und zwar so lange, wie der hinter WHILE stehende Ausdruck logisch "wahr" ist. Die Verschachtelung mehrerer DO - WHILE - Schleifen ist erlaubt.
Optionen: keine
Beispiel:
Beispiel
1:
Einfache DO - WHILE - Schleife
>10 A=0
>20 DO
>30 A=A+1
>40 PRINT A
>50 WHILE A<4
>60 PRINT "FERTIG"
>RUN
1
2
3
4
FERTIG
READY
>
Beispiel 2: Geschachtelte DO - WHILE - und DO - UNTIL - Schleifen
>10
DO :
A=A+1 : DO : B=B+1
>20 PRINT A,B,A*B
>30 WHILE
B<>3
>40 B=0>50 UNTIL A=3>
RUN
>10 DO
>12 A=A+1
>14
DO
>16 B=B+1
>20 PRINT A,B,A*B
>30 WHILE B<>3
>40
B=0
>50 UNTIL A=3
>RUN
1 1 1
1 2 2
1 3 3
2 1 2
2 2 4
2 3 6
3 1 3
3 2 6
3 3 9
READY
>
ENDSyntax: END
Typ: Steueranweisung
Modus: Programm
Beschreibung: END kennzeichnet das Ende eines Programms. Alle Dateien werden geschlossen; der Interpreter kehrt in den Kommando-Modus zurück. Nach END kann die Programmausführung nicht mit CONT fortgesetzt oder erneut gestartet werden. Wenn die END-Anweisung im Programm fehlt, betrachtet der Interpreter die letzte Programmzeile als Programmende.
Optionen: keine
Beispiel:
Beispiel 1: Programmende nach der letzten Zeile
>10
FOR I=1
TO 4
>20 PRINT I
>30 NEXT I
>RUN
1
2
3
4
READY
>
Beispiel 2: Programmende durch END-Anweisung
>10
FOR I=1
TO 4
>20 GOSUB 100
>30 PRINT I
>40 NEXT I
>100 PRINT I
>110 RETURN
>RUN
1
2
3
4
READY
>
FOR - TO - (STEP) - NEXTSyntax: FOR [var]=[expr] TO [expr] (STEP) [expr])
…
NEXT [var]
Typ: Steueranweisungen
Modus: Programm (Version 1.0) bzw. Kommando und Programm (Version 1.1)
Beschreibung: Die von FOR und NEXT begrenzte Anweisungs- oder Befehlsfolge wird mehrfach ausgeführt. Nach jedem Durchlaufen der Schleife wird die hinter FOR stehende Variable um den hinter STEP stehenden Zahlenwert erhöht, bis die Variable den hinter TO stehenden Zahlenwert erreicht. Fehlt STEP, so nimmt der Interpreter den Zahlenwert 1 als Schrittweite an.
Optionen: Bei der Basic-Version 1.1 sind die Anweisungen FOR - TO - STEP - NEXT auch im Kommando-Modus erlaubt. Hiervon kann man zum Beispiel Gebrauch machen, wenn man den Speichereinhalt sichtbar machen will:
> FOR I=512 TO 560 : PH0.XBY(I), : NEXT I
Beispiel:
Beispiel 1:
>10
FOR A=B
TO C STEP D
>20 PRINT A
>30 NEXT A
Beispiel 2:
>10
FOR I=1
TO 4
>20 PRINT I
>30 NEXT I
>RUN
1
2
3
4
READY
>
Beispiel 3:
>10
FOR I=0
TO 8 STEP 2
>20 PRINT I
>30 NEXT I
>RUN
0
2
4
6
8
READY
>
GOSUB - RETURNSyntax: GOSUB [ln num]
…
[Unterprogramm]
RETURN
Typ: Steueranweisungen
Modus: Programm
Beschreibung: Nach GOSUB verzweigt die Programmausführung zu Zeilennummer [ln num]. Der an dieser Stelle stehende Programmteil ist ein Unterprogramm, das vom Hauptprogramm wiederholt aufgerufen werden kann. RETURN kennzeichnet das Ende des Unterprogramms; beim Erreichen der RETURN-Anweisung wird die Programmausführung mit der auf GOSUB folgenden Anweisung fortgesetzt. Aus Unterprogrammen dürfen weitere Unterprogramme aufgerufen werden.
Optionen: Bei der Basic-Version 1.1 kann das Unterprogramm vor Erreichen von RETURN verlassen werden, wenn man anschließend den Control-Stack initialisiert.
Beispiel:
Beispiel 1: Einfacher Unterprogramm-Aufruf
>10
FOR I=1
TO 5
>20 GOSUB 100
>30 NEXT I
>100 PRINT I
>110 RETURN
>RUN
1
2
3
4
5
READY
>
Beispiel 2: Geschachtelter Unterprogramm-Aufruf
>10
FOR I=1
TO 3
>20 GOSUB 100
>30 NEXT I
>40 END
>100 PRINT I,
>110 GOSUB 200
>120 RETURN
>200 PRINT I*I
>210 RETURN
>RUN
1 1
2 4
3 9
READY
>
GOTOSyntax: GOTO [ln num]
Typ: Steueranweisung
Modus: Kommando oder Programm
Beschreibung: Eine GOTO-Anweisung innerhalb eines Programms hat zur Folge, dass der Interpreter das Programm bei Zeilennummer [ln num] fortsetzt. Die Anweisung ist nicht an eine Bedingung geknüpft; der Interpreter führt einen unbedingten Sprung aus.
Nach der Eingabe von GOTO [ln num] im Kommando-Modus startet das Programm bei der angegebenen Zeilennummer. Im Gegensatz zu RUN werden jedoch die Variablen nicht nullgesetzt, es sei den, das Programm wurde zwischen seinem letzten Lauf und der Eingabe von GOTO geändert.
Wenn in einer GOTO-Anweisung eine nicht existierende Zeilennummer steht, wird eine Fehlermeldung ausgegeben.
Die Interpreter-Version 1.0 zeigt hier eine kleine Eigenheit: Die Fehlermeldung bezieht sich fälschlicherweise auf die Anweisung, die auf GOTO folgt. In Version 1.1 wurde dies korrigiert.
Optionen: keine
Beispiel:
50
GOTO 100
ON…GOTO,
ON…GOSUBSyntax: ON [expr] GOTO [ln num],[ln num]…[ln num]
ON [expr] GOSUB [ln num],[ln num]…[ln num]
Typ: Steueranweisungen
Modus: Programm
Beschreibung: Der Interpreter führt einen unbedingten Sprung bzw. einen Sprung zu einem Unterprogramm aus. Das Sprungziel ist vom Zahlenwert n des ganzzahligen Ausdrucks [expr] abhängig. Springziel ist die Zeilennummer, die an n-ter Stelle hinter GOTO bzw. GOSUB steht.
Optionen: keine
Beispiel:
ON
Q
GOTO
100,200,300
Bei Q=0 springt der Interpreter nach Programmzeile 100, bei Q=1 nach 200, bei Q=2 nach 300. Hat Q einen negativen Zahlenwert, so folgt die Fehlermeldung BAD ARGUMENT ERROR. Ist Q größer als die Anzahl der Zeilennummern minus eins, wird die Fehlermeldung BAD SYNTAX ERROR ausgegeben.
IF - THEN - ELSESyntax: IF [rel expr] THEN [Anweisung] ELSE [Anweisung]
Typ: Anweisung
Modus: Programm
Beschreibung: Abhängig davon, ob die logische Aussage des Ausdrucks [rel expr] "wahr" oder "falsch" ist, wird entweder die auf THEN folgende Anweisung oder die auf ELSE folgende Anweisung ausgeführt.
Optionen: Die IF-THEN-ELSE-Anweisung kann verkürzt geschrieben werden. Die beiden folgenden Programmzeilen sind identisch:
20
IF
A<>10 THEN PRINT A ELSE 10
20 IF A<>10 PRINT A ELSE 10
Das
gleiche gilt für diese beiden Programmzeilen:
30
IF
INT(A)<10 THEN GOTO 100 ELSE GOTO 200
30
IF
INT(A)<10 THEN 100 ELSE 200
Beispiel:
20
IF A=10 THEN
40
30 PRINT A
40 PRINT B
Wenn hier A=10 ist, wird nur B ausgegeben, in allen anderen Fällen werden A und B ausgegeben.
Anmerkung: Bei Interpreter-Version 1.1 können hinter THEN und ELSE mehrere, durch Doppelpunkte voneinander getrennte Anweisungen
>10
IF A=B
THEN C=A : A=A/2 : GOTO 100
>20 PRINT A
Da die Interpreter-Version 1.0 einen Doppelpunkt in gleicher Weise behandelt wie eine Zeilenschaltung (<cr>), tritt ein Programmfehler auf. Das folgende Programm läuft problemlos mit beiden Interpreter-Versionen:
>10
IF A=B
THEN C=A
>12 A=A/2
>14 GOTO 100
>20 PRINT A
INPUTSyntax: INPUT "[text]" [var],[var],...,[var]
Typ: Anweisung
Modus: Programm
Beschreibung: Während der Programmausführung werden Tastatureingaben mit [text] angefordert; danach folgt ein Fragezeichen. Die Eingaben werden der Reihe nach den Variablen [var],[var],...,[var] übergeben. Fehlt [text], so wird als Eingabeaufforderung nur das Fragezeichen ausgegeben. Ein Komma vor der ersten Variablen unterdrückt das Fragezeichen.
Wenn die INPUT-Anweisung mehrere Variablen enthält, müssen die Eingaben durch Kommas getrennt werden. Ist die Anzahl der Eingabe niedriger als die Anzahl der Variablen, folgt die Fehlermeldung TRY AGAIN.
Optionen: keine
Beispiel:
>10
INPUT
"Zwei Ziffern" A,B
>20 PRINT A,B
>RUN
Zwei Ziffern? 1
TRY AGAIN
Zwei Ziffern? 1,2
1 2
READY
>

ONERR
Syntax: ONERR [ln num]
Typ: Steueranweisung
Modus: Programm
Beschreibung: Wenn der Interpreter während der Programmausführung auf einen Fehler stößt, der normalerweise eine Fehlermeldung zur Folge hätte, verzweigt das Programm statt dessen zur Programmzeile [ln num]. Der dort beginnende Programmteil kann eine spezielle Behandlung des aufgetretenen Fehlers enthalten. Unter Adresse 101H des externen Speichers legt der Interpreter einen Fehlercode (ERROR CODE) ab, der z.B. mit der Anweisung ERCODE=XBY(101H) abgefragt werden kann. Folgende Fehlercodes sind möglich:
Fehlercode Fehlerursache
ERROR CODE = 10 Division durch Null
ERROR CODE = 20 Overflow
ERROR CODE = 30 Underflow
ERROR CODE = 40 Falsches Argument
Optionen: keine
Beispiel: -
ONEX1
Syntax: ONEX1 [ln num]
Typ: Steueranweisung
Modus: Programm
Beschreibung: ONEX1 weist den Interpreter an, das Programm bei Zeilennummer [ln num] fortzusetzen, sobald ein externer Interrupt über Leitung /INT1(P 3.3) eintrifft. Der dort beginnende (in Basic geschriebene) Programmteil, der die Reaktion auf den Interrupt enthält, muss mit der Anweisung RETI enden. Fehlt die Anweisung RETI, so wird der Interrupt nicht gelöscht. Die ONEX1-Anweisung setzt die Bits 3 und 7 des Registers IE. Eine höhere Priorität als der ONEX1-Interrupt hat der ONTIME-Interrupt; er kann den ONEX1-Interrupt unterbrechen.
Während der Zeichenausgabe über die serielle Schnittstelle ist der ONEX1-Interrupt blockiert, was bei längeren Zeichenketten zu Problemen führen kann. Es empfiehlt sich deshalb, die Zeichenkette in einem solchen Fall aufzuteilen.
Optionen: keine
Beispiel:
>10
PRINT "INTEL MCS-52
BASIC" ist identisch mit
>10 PRINT "INTEL "
>12 PRINT "MCS"
>14 PRINT "-52 "
>16 PRINT "BASIC"

Syntax: ONTIME [expr],[ln num]
Typ: Steueranweisung
Modus: Programm
Beschreibung: ONTIME weist den Interpreter an, nach Ablauf der durch [expr] angegebenen Zeit zur Programmzeile [ln num] zu verzweigen. Das dort beginnende Unterprogramm muss mit RETI abgeschlossen werden.
ONTIME arbeitet nur, wenn zuvor die interne Uhr mit CLOCK1 gestartet wurde. Die ONTIME-Anweisung hat nämlich einen Interrupt zur Folge, sobald der Zahlenwert der reservierten Variable TIME größer ist als der Zahlenwert des Ausdrucks [expr] ist.
Optionen: keine
Beispiel:
Beispiel 1:
>10
TIME=0 : CLOCK1 :
ONTIME 2,100 : DO
>20 WHILE TIME <
10 : END
>100 PRINT "TIMER
INTERRUPT BEI ",TIME,"SEKUNDEN"
>110 ONTIME TIME+2,100 :
RETI
>RUN
TIMER
INTERRUPT BEI 2.045
SEKUNDEN
TIMER INTERRUPT BEI 4.045
SEKUNDEN
TIMER INTERRUPT BEI 6.045
SEKUNDEN
TIMER INTERRUPT BEI 8.045
SEKUNDEN
TIMER INTERRUPT BEI 10.045
SEKUNDEN
READY
>
In diesem Beispiel ist der Zahlenwert der Variablen TIME um jeweils 45 ms höher als erwartet. Das hat einen einfachen Grund: Die Übertragungsgeschwindigkeit zum Terminal beträgt 4800 Baud. Es vergehen 45 ms, um den Text "TIMER INTERRUPT BEI ..." auszugeben. Falls dies stört, schafft eine kleine Programmänderung Abhilfe:
Beispiel 2: Geschachtelter Unterprogramm-Aufruf
>10
TIME=0 : CLOCK1 :
ONTIME 2,100 : DO
>20 WHILE TIME <
10 : END
>100 A=TIME
>110 PRINT "TIMER
INTERRUPT BEI ",A,"SEKUNDEN"
>120 ONTIME TIME+2,100 :
RETI
>RUN
TIMER
INTERRUPT BEI 2 SEKUNDEN
TIMER INTERRUPT BEI 4 SEKUNDEN
TIMER INTERRUPT BEI 6 SEKUNDEN
TIMER INTERRUPT BEI 8 SEKUNDEN
TIMER INTERRUPT BEI 10 SEKUNDEN
READY
>

(? nur bei Interpreter-Version 1.1)
Syntax: PRINT [expr] bzw. P. [expr] bzw ? [expr]
Typ: Steueranweisung
Modus: Programm
Beschreibung: PRINT gibt Variablenwerte, Konstanten und Zeichenketten auf dem Terminal aus. Es stehen mehrere Optionen zur Verfügung, mit denen das Ausgabeformat bestimmt werden kann. PRINT, P. und das Fragezeichen (nur bei Interpreter-Version 1.1) haben identische Wirkung.
Folgt auf eine PRINT-Anweisung das Zeichen # (PRINT#, P.# und bei der Version 1.1 auch ? #), so wird die Ausgabe nicht zum Terminal, sondern zur seriellen Druckerschnittstelle geschickt.
Optionen: TAB, SPC, CR und USING
Mit TAB[expr] werden die auszugebenden Zeichen an die Position innerhalb der aktuellen Zeile gesetzt, die durch [expr] angegeben ist.
CR bewirkt, dass die Schreibmarke an den Zeilenanfang zurückspringt. (Muss von dem jeweiligen Terminal-Programm unterstützt werden.)
USING(#.#) ist eine vielseitige Option, mit der sich die Ausgabe von Zahlenwerten formatieren lässt. Die Anzahl der Nummernzeichen ( # ) vor und hinter dem Dezimalpunkt bestimmt die Anzahl der Ziffern. Wenn der Zahlenwert einer Variablen nicht in das mit USING vorgegeben Format paßt, wird zuerst ein Fragezeichen und dann der Zahlenwert im normalen Format ausgegeben.
USING(Fx) gibt den Zahlenwert im Fließkommaformat aus, wobei x die Anzahl der Ziffern hinter dem Dezimalpunkt ist.
USING(0) ist eine weitere Option, bei der der Interpreter das Ausgabeformat selbst bestimmt. Wenn eine Zahl zwischen ± 99 999 999 und 0.1 liegt, wird sowohl der ganzzahlige Anteil als auch der hinter dem Dezimalpunkt stehende Rest ausgegeben. Zahlen, die außerhalb dieses Bereiches liegen, erscheinen im Fließkommaformat. Nach dem Reset benutzt der Interpreter stets das USING(0)-Format.
Wenn innerhalb der PRINT-Anweisung auf den Ausdruck [expr] ein Komma folgt, wird keine Zeilenschaltung (CR/LF) ausgeführt. Mit PRINT CR kann die Schreibmarke an den Zeilenanfang gesteuert werden, so dass die in dieser Zeile stehenden Zeichen durch nachfolgende Zeichen überschrieben werden.
Beispiel:
Beispiel 1: Anweisung PRINT
>PRINT
10*10, 3*3
100
9
>PRINT
"MCS-52"
MCS-52
Beispiel 2: Option TAB
>PRINT
TAB(5),"X",
TAB(10),"Y"
X Y
Beispiel 3: Option SPC
>PRINT
A,SPC(5),B
Ergebnis: Zwischen den Zahlenwerten der Variablen A und B stehen fünf Leerzeichen.
Beispiel 4: Option CR
>10
FOR I=1 TO 1000
>20 PRINT I,CR,
>30 NEXT I
Ergebnis: Die Zahlen 1 bis 1000 werden nacheinander an der gleichen Stelle des Bildschirms ausgegeben.
Beispiel 5: Option USING(Fx)
>10
PRINT USING(F3),1,2,3
>20 PRINT USING(F4),1,2,3
>30 PRINT USING(F5),1,2,3
>40 FOR I=10 TO 40 STEP
10
>50 PRINT I
>60 NEXT I
>RUN
1.00
E 0 2.00 E 0 3.00 E 0
1.000 E 0 2.000 E 0 3.000 E 0
1.0000 E 0 2.0000 E 0 3.0000 E 0
1.0000 E+1
2.0000 E+1
3.0000 E+1
4.0000 E+1
READY
>
Beispiel 6: Option USING( #.# )
>10
PRINT USING( ##.##),1,2,3
>20 FOR I=1 TO 120 STEP
20
>30 PRINT I
>40 NEXT I
>RUN
1.00
2.00 3.00
1.00
21.00
41.00
61.00
81.00
? 101
READY
>
Beispiel 7: Option Komma
>10
FOR X=1 TO 5
>20 ? X,
>30 NEXT
>RUN
1 2 3 4 5
READY
>

Syntax: PH0. [expr] bzw. PH1. [expr]
bzw PH0.# [expr] bzw. PH1.# [expr]
Typ: Anweisung
Modus: Kommando und Programm
Beschreibung: Die Anweisungen PH0. und PH1. geben Daten in hexadezimaler Schreibweise auf dem Bildschirm aus. PH0. unterdrückt die beiden nicht signifikanten Nullen, wenn eine Zahl kleiner 0FFH ist, während die Zahlen bei PH1. aus vier Hex-Ziffern bestehen. Es können nur ganze Zahlen (integer) ausgegeben werden; die Darstellung von Fließkommazahlen in hexadezimaler Form ist nicht möglich. Wenn eine Zahl außerhalb des Bereichs 0...0FFFFH liegt, wird sie in normaler Schreibweise dargestellt. In diesem Fall fehlt das "H", das alle Hex-Zahlen kennzeichnet. Die Anweisungen PRINT, PH0. und PH1. können dazu dienen, Dezimalzahlen als Hex-Zahlen darzustellen und umgekehrt (siehe Beispiele). PH0.# und PH1.# haben die gleichen Funktionen wie PH0. bzw. PH1., jedoch werden hier alle Ausgaben zum seriellen Druckeranschluß geschickt.
Optionen: keine
Beispiel:
>PH0.
2*2
>PRINT99H
>PH0.1000
>P.3E8H
04H
155
3E8H
1000
>PH1.
2*2
>PH0.100 >PH1.1000 >PH0.PI
0004H
64H 03E8H 03H
PUSHSyntax: PUSH [expr]
Typ: Anweisung
Modus: Kommando und Programm
Beschreibung: Der Zahlenwert des Ausdrucks [expr] wird auf dem Argument-Stack abgelegt, so dass er zum Beispiel von einem Maschinenspracheprogramm weiterverarbeitet werden kann. Mit der Anweisung POP lässt sich der jeweils letzte auf dem Argument-Stack abgelegte Zahlenwert in die Basic-Ebene zurückholen. Durch PUSH und POP kann man ferner die Zahlenwerte von Variablen.
Optionen: Die Zahlenwerte mehrerer Ausdrücke können mit einer einzigen PUSH-Anweisung auf dem Argument-Stack abgelegt werden; die Ausdrücke sind in der Anweisung durch Kommas voneinander zu trennen. Der letzte Ausdruck wird zuletzt zum Stack transferiert.
Beispiel:
Beispiel 1: Mehrere Ausdrücke
>PUSH
[expr],[expr],[expr]
Beispiel 2: Vertauschen von Variablen
>10
A=10
>20 B=20
>30 PRINT A,B
>40 PUSH A,B
>50 POP A,B
>60 PRINT A,B
>RUN
10 20
20 10
READY
Beispiel 3: Übergabe von Variablenwerten an ein Unterprogramm
>10
PUSH 1,3,2
>20 GOSUB 100
>30 POP R1,R2
>40 PRINT R1,R2
>50 END
>100 REM Berechnung von
R1 und R2
>110 POP A,B,C
>120 PUSH
(-B+SQR(B*B-4*A*C))/(2*A)
>130 PUSH
(-B-SQR(B*B-4*A*C))/(2*A)
>140 RETURN
>RUN
-1 -.5
READY
>
POP
Syntax: POP [var]
Typ: Anweisung
Modus: Kommando und Programm
Beschreibung: Der letzte auf dem Argument Stack abgelegte Zahlenwert wird der Variablen [var] übergeben. Dieser Zahlenwert kann dort entweder durch die Basic-Anweisung PUSH oder von einem Maschinenspracheprogramm abgelegt worden sein. Bei leerem Stack folgt auf eine POP-Anweisung die Fehlermeldung A-STACK ERROR.
Optionen: Die Zahlenwerte mehrerer Ausdrücke können mit einer einzigen POP-Anweisung vom Argument Stack geholt werden; die Ausdrücke müssen in Variablen gespeichert werden sind in der Anweisung durch Kommas voneinander zu trennen. Der erste Ausdruck wird zuletzt vom Stack transferiert.
Beispiel:
Beispiel 1: Mehrere Ausdrücke
>POP
[var],[ var],[ var]
Beispiel 2 + Beispiel 3: siehe PUSH

Syntax: PWM [expr],[expr],[expr]
Typ: Anweisung
Modus: Kommando und Programm
Beschreibung: Die PWM-Anweisung (PWM = Pulse Width Modulation; Pulsbreitenmodulation) erzeugt pulsförmige Signale auf Portleitung P1.2. Der erste Ausdruck in der Anweisung gibt die Anzahl der Taktperioden an, während der das Signal logisch 1 ist, der zweite Ausdruck bestimmt die Anzahl der Taktperioden, während der das Signal logisch 0 ist, und im dritten Ausdruck muss die Anzahl der zu erzeugenden Signalperioden stehen. Eine Taktperiode hat die Länge 12/XTAL; bei einer Quarzfrequenz von 11,0592 MHz beträgt sie 1,085 ms. Alle Ausdrücke müssen ganzzahlig (integer) sein und zwischen 0 und 0FFFFH liegen. Die beiden ersten Ausdrücke müssen einen Mindestwert von 25 haben.
Optionen: keine
Beispiel 1: Mehrere Ausdrücke
>PWM
100,100,1000
Es werden 1000 Perioden von 217 ms Dauer (entsprechend 4608 Hz) bei einer Quarzfrequenz von 11,0592 MHz erzeugt. Dieses Signal kann zum Beispiel einen Beeper oder Lautsprecher steuern.
Beispiel 2:
Das folgende Programm berechnet den RELOAD-Wert für eine bestimmte Signalfrequenz bei gegebener Quarzfrequenz:
>10
INPUT "BITTE
QUARZFREQUENZ EINGEBEN (zB 11059200) - ",X
>20 T=12/X
>30 INPUT "BITTE
GEWÜNSCHTE PWM-FREQUENZ EINGEBEN - ",F
>40 F1=1/F
>50 C=(F1/T)/2 : REM
BERECHNUNG DES RELOAD-WERTS
>60 IF C<20 THEN
30
>70 C1=C-INT(C)
>80 IF C1<5 THEN
90 : C=C+1
>90 PRINT : PRINT "DIE
GEWÜNSCHTE FREQUENZ IST ",F,"Hz"
>100 C=INT(C) : PRINT
>110 PRINT "DIE GENAUE
FREQUENZ IST ",1/(2*C*T),"Hz"
>120 PRINT
>130 PRINT "DER
RELOAD-WERT IST ",C," - IN HEX : ", : PH1.C
>140 INPUT "ANDERE
FREQUENZ BERECHNEN, 1=JA 0=NEIN : ",Q
>150 IF Q=1 THEN 20
Wenn in der PWM-Anweisung für den ersten und den zweiten Ausdruck der gleiche Reload-Wert eingesetzt wird, erzeugt der Kontroller ein Rechtecksignal mit dem Tastverhältnis 1:1.
Die folgende Liste gibt die Reload-Werte für acht Oktaven der temperierten Tonleiter bei einer Quarzfrequenz von 11,0592 MHz an.
REMSyntax: REM
Typ: Anweisung
Modus: Programm bei Version 1.0
Kommando und Programm bei Version 1.1
Beschreibung: REM (von engl. "Remark" = "Bemerkung") weist den Interpreter an, alle in der gleichen Programmzeile nachfolgenden Zeichen zu ignorieren. Hinter REM können Anmerkungen des Programmierers stehen, die das Programm erläutern.
Optionen: keine
Beispiel:
>10
REM EINGABE DER
ERSTEN ZAHL
>20 INPUT A
>30 REM EINGABE DER
ZWEITEN ZAHL
>40 INPUT B
>50 REM MULTIPLIKATION
>60 Z=A*B
>70 REM AUSGABE DES
ERGEBNISSES
>80 PRINT Z
Das gleiche Programm in anderer Schreibweise:
>10
INPUT A : REM
EINGABE DER ERSTEN ZAHL
>20 INPUT B : REM
EINGABE DER ZWEITEN ZAHL
>30 Z=A*B : REM
MULTIPLIKATION
>40 PRINT Z : REM
AUSGABE DES ERGEBNISSES
Die folgende PRINT-Anweisung wird ignoriert:
>10
REM AUSGABE DER ZAHL
A : PRINT A
Bei Interpreter-Version 1.1 ist die REM-Anweisung auch im Kommando-Modus zulässig. Dies hat durchaus einen Sinn: Ein Programm, das mit einem Texteditor geschrieben wurde, kann umfangreiche Anmerkungen und Erläuterungen enthalten, denen jeweils die REM-Anweisung vorangeht.
RETISyntax: RETI
Typ: Steueranweisung
Modus: Programm
Beschreibung: Mit RETI müssen Unterprogramme abgeschlossen werden, in die der Interpreter beim Auftreten von Interrupts springt (insbesondere bei ONTIME und ONEX1). RETI ist mit RETURN identisch, setzt aber zusätzlich die Interruptflags zurück.
Steht RETURN am Schluß eines Interrupt-Unterprogramms, so sind alle weiteren Interrupts wirkungslos!
Optionen: keine
Beispiel: -
STOP
Syntax: STOP
Typ: Steueranweisung
Modus: Programm
Beschreibung: STOP unterbricht die Programmausführung; sie kann mit CONT fortgesetzt werden. Variablenwerte werden hierdurch nicht verändert.
Optionen: keine
Beispiel: -
>10
FOR I=1 TO 100
>20 PRINT I
>30 STOP
>40 NEXT I
>RUN
1
STOP – IN LINE 40
CONT
2
3 usw.
Nach STOP wird nicht die Zeilennummer ausgegeben, in der die STOP-Anweisung steht, sondern die Nummer der folgenden Zeile.
STRING
Syntax: STRING [expr],[expr]
Typ: Steueranweisung
Modus: Kommando oder Programm
Beschreibung: STRING reserviert
Speicherplatz für
Zeichenketten. Nach dem RESET steht für Zeichenketten noch
kein
Speicherplatz zur Verfügung, so dass der Interpreter bei der
Definition einer Zeichenkette die Fehlermeldung MEMORY ALLOCATION ERROR
ausgibt. Der erste Ausdruck gibt die Anzahl der insgesamt zu
reservierenden Bytes, der zweite die Anzahl der Byte pro Zeichenkette
an. Damit liegt gleichzeitig die maximale Anzahl der Zeichenketten
fest. Allerdings ist dies nicht unmittelbar der Quotient aus beiden
Zahlen. Für jede Zeichenkette wir ein weiteres Byte
benötigt,
und unabhängig von der Anzahl der Zeichenketten kommt noch ein
Byte hinzu. STRING 100,10 reserviert folglich Speicherplatz
für
die neun Zeichenketten $(0)...$(8). Übrigens: $(0) ist im MCS
BASIC-52 eine gültige String-Variable.
Der für Zeichenketten belegte Speicherplatz kann mit STRING 0,0 wieder geräumt werden. Nach jeder STRING-Anweisung führt der Interpreter automatisch eine CLEAR-Anweisung aus, so dass alle Variablenwerte verloren gehen.
Optionen: keine
RROM
Syntax: RROM [integer]
Typ: Steueranweisung
Modus: Kommando oder Programm
Beschreibung: RROM startet das im EPROM unter der Programmnummer [integer] gespeicherte Programm. Steht die RROM-Anweisung innerhalb eines Programms, so wird von hier aus ein zweites Programm gestartet. In jedem Fall werden alle Variablen gelöscht, so dass eine Übergabe an das zweite Programm nicht möglich ist. Der Aufruf eines nicht existierenden Programms wird ignoriert; eine Fehlermeldung erfolgt nicht.
Optionen: keine
LD@, ST@(nur bei Interpreter-Version 1.1)
Syntax: LD@[expr] bzw. ST@[expr]
Typ: Anweisungen
Modus:
Kommando oder Programm
Beschreibung:
Mit ST@ kann eine Fließkommazahl, die zuvor auf
dem Argument Stack abgelegt wurde, an eine beliebige Stelle im Speicher
transportiert werden (zum Beispiel, um sie in einem batteriegepufferten
RAM-Bereich zu speichern). Die Adresse wird mit [expr] angegeben. LD@
transportiert die unter Adresse [expr] stehende
Fließkommazahl
zum Argument Stack zurück. In beiden Fällen ist zu
beachten,
dass Fließkommazahlen 6 Byte belegen.
Optionen: keine
Beispiel:
10
REM ***ARRAY SAVE***
20 FOR I=0 TO 9
30 PUSH A(I) : REM SETZE ARRAY
AUF DEN STACK
40 ST@ 03805H + 6*I : REM SECHS
BYTE PRO ZAHL
50 NEXT I
60 REM ***GET ARRAY***
70 FOR I=0 TO 9
80 LD@ 03805H + 6*I
90 POP B(I)
100 NEXT I
Die Array-Variable A(I) muss zuvor dimensioniert worden sein, außerdem muss MTOP auf 037FFH zeigen.
Die Adresse hinter der Anweisung ST@ bzw. LD@ ist die Adresse des höchstwertigen Byte. Durch ST@3805H werden sechs Bytes 3805H, 3804H, 3803H, 3802H, 3801H, und 3800H belegt.