Sie sind hier MCS-BASIC

#
MCS-BASIC (8052 AH-BASIC)

Übersicht

Anweisungen

Operatoren und Ausdrücke

Operatoren mit zwei Operanden

Operanden mit einem Operand

Trigonometrische Funktionen

Anmerkung zu den trigonometrischen Funktionen

Reihen- und Rangfolge

Strings

String-Operatoren

Spezielle Operatoren

Spezielle Funktionsoperatoren

Anwendung spezieller Operatoren

Systemvariablen

Die Basic-Befehle

Interne Speicher und Register

## Übersicht

Commands | Statements | Operators
RUN | BAUD | + plus Addition
CONT | CALL | - minus Subtraktion
LIST | CLEAR CLEARI CLEARS | * mal Multipilkation
NEW |  | ** hoch Potenz
RAM ROM |  | / geteilt Division
| CLOCK1 CLOCK0 | .AND.
XFER |  | .OR.
| DATA READ RESTORE | .XOR.
|  | ABS()
|  | INT()
| DIM | SGN()
| DO_WHILE | SQR()
| DO_UNTIL | NOT()
| END | LOG()
| FOR_TO_STEP_NEXT | EXP()
| GOSUB_RETURN | SIN()
| GOTO | COS()
| ON_GOTO | TAN()
| ON_GOSUB | ATN()
| IDLE | =,>,>=,<,<=;<>
| IF_THEN_ELSE | ASC()
| INPUT | CHR()
| LD@ | CBY()
| LET | DBY()
| ONERR_RETI | XBY()
| ONEX1_RETI | GET
| ONTIME_RETI | IE
| PRINT | IP
| PH0. PH1. | PORT1
|  | PCON
| PUSH | RCAP2
| POP | T2CON
| PWM | TCON
| REM | TMOD
| RROM | TIMER0 TIMER1 TIMER2
| STOP | XTAL
| STRING | MTOP
| ST@ | LEN
| TIME | FREE
|  | PI
|  | RND

nach oben

## Operatoren und Ausdrücke

### Operatoren mit zwei Operanden

Für Operationen, an denen zwei Operanden beteiligt sind, gilt allgemein die Syntax: [expr] Operator [expr]. MCS BASIC-52 kann folgende Operationen ausführen:

#### Addition: +

Beispiel:
PRINT 3+5
8

#### Division: /

Beispiel:
PRINT 100/5
20

#### Potenz: **

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

#### Multiplikation: *

Beispiel:
PRINT 3*3
9

####

#### Subtraktion: -

Beispiel:

PRINT 10-3
7

nach oben

UND-Verknüpfung: .AND.

( Logisches Und )

Beispiel:

PRINT 3.AND.2
2

ODER-Verknüpfung: .OR.

( 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.

nach oben

### Operatoren mit einem Operand

ABS

Syntax: ABS([expr])

Diese Operation gibt den Absolutwert des Ausdrucks [expr] zurück.

Beispiel:

PRINT ABS(5)
5

PRINT ABS(-5)
5

nach oben

NOT

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

nach oben

INT

Syntax: INT([expr])

Gibt den Integeranteil (ganzzahligen Anteil) des Ausdrucks [expr] zurück.

Beispiel:

PRINT INT(.7)
3

PRINT INT(100.876)
100

nach oben

SGN

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

nach oben

SQR

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

nach oben

RND

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:

PRINT RND
.30278477

nach oben

PI

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)

nach oben

LOG

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.

Beispiel 1:
PRINT LOG(12) PRINT LOG(EXP(1))
2.484906 1

Beispiel 2:
Logarithmus zur Basis 10, (x ist der Logarithmus ; Das Ergebnis ist der Exponent).
>10 INPUT "WERT: ", X
>20 PRINT (LOG(x)/LOG(10))
>RUN
WERT: 100
2.0000009

nach oben

EXP

Syntax: EXP ([expr])

Diese Operation potenziert die Zahl e (Basis des natürlichen Logarithmus) mit der Zahl, die der Ausdruck [expr] angibt.

nach oben

### Trigonometrische Funktionen

SIN

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

nach oben

COS

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

nach oben

TAN

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

nach oben

ATN

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

Beispiel:
PRINT ATN(PI)
1.2626272
PRINT ATN(1)
78539804

nach oben

### Anmerkungen zu den trigonometrische Funktionen

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.

nach oben

### Reihen- und Rangfolge

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:

Beispiel:
1=0 PRINT 1
>0
PRINT A<>A
0 65535
PRINT A=A
0 65535
Zunächst ist vielleicht nicht einsichtig, dass das Ergebnis eines Zahlenvergleichs eine Zahl ist. Auf diese Weise kann man jedoch in einer einzigen Anweisung einen mehrfachen Vergleich durchführen. Zulässig ist zum Beispiel folgende Programmzeile:
10 IF A<B.AND.A>C.OR.A>D THEN ...
Auch negative Aussagen mit NOT sind natürlich möglich:
IF NOT (A>B).AND.A<C THEN ...
Für den Programmierer ist es wichtig zu wissen, welche Hierarchiestufen die einzelnen logischen Operationen einnehmen. Da sie auf den unteren Stufen platziert sind, lassen sich Mehrfachvergleiche leicht aneinanderreihen.

nach oben

## Strings

Ein String ist eine Kette aus alphanumerischen Zeichen, die zusammen ein Wort oder einen Text mit beliebigem Inhalt ergeben. Strings werden vom Basic-Interpreter anders behandelt als Zahlen; die Unterschiede werden nachfolgend an verschiedenen Beispielen verdeutlicht.
In einem Programm können Strings als Texte oder (hierfür stellvertretend) als String-Variable stehen. Im MCS BASIC-52 sind nur eindimensionale String-Variable zugelassen. Sie haben die Form $([expr]), wobei [expr] ein ganzzahliger Wert im Bereich 0...254 sein muss. Innerhalb des gleichen Programms sind also höchstens 255 Strings möglich. Damit liegt die Anzahl der im MCS BASIC-52 maximal definierbaren Strings zwar wesentlich niedriger als bei den meisten anderen Basic-Dialekten, in der Praxis führt dies jedoch selten zu Einschränkungen.
Nach einem Systemstart oder Reset ist noch kein Speicherplatz für Strings vorhanden. Sofern ein Programm mit Strings arbeitet, muss ein Teil des Arbeitsspeichers mit der Anweisung STRING [expr],[expr] für diesen Zweck reserviert werden.
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 daß 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 daß alle Variablenwerte verloren gehen.
Optionen: keine
Beispiel:
10 $(0)="MCS " : $(1)="BASIC " : $(2)="52"
Strings können grundsätzlich auf zwei Arten definiert und eingegeben werden: Nach einer Eingabeaufforderung, die auf die Anweisung INPUT folgt, sowie durch das Gleichheitszeichen (“=”) oder die hierzu äquivalente Anweisung LET.
Beispiel 1:
>10 STRING 100,20
>20 $(1)="DIES IST EIN STRING,"
>30 INPUT "WIE IST DEIN NAME ? ",$(2)
>40 PRINT $(1),$(2)
>RUN
WIE IST DEIN NAME ? ALF
DIES IST EIN STRING, ALF
Beispiel 2:
>10 $(2)=$(1)
Der String-Variablen $(2) wird die gleiche Zeichenkette wie der String-Variablen $(1) zugeordnet.

## String-Operatoren:

ASC, CHR
Anders als in anderen Basic-Dialekten gibt es im MCS BASIC-52 nur zwei String-Operatoren: ASC( ) und CHR( ). Auf den ersten Blick scheinen hierdurch die Möglichkeiten eingeschränkt zu sein. Die Praxis hat jedoch gezeigt, dass dies kaum zutrifft, was um so mehr verwundert, als sowohl der Prozessor 8052 als auch der Basic-Interpreter in erster Linie für Steuerungsaufgaben entwickelt wurden.
ASC
Syntax: ASC( )
Der String-Operator ASC( ) liefert den ASCII-Code des Zeichens zurück, das zwischen den Klammern steht.
Beispiel 1:
>PRINT ASC(A)
65
Der ASCII-Code des Großbuchstaben A ist 65.
Beispiel 2:
>10 $(1)="DIES IST EIN STRING"
>20 PRINT $(1)
>30 PRINT ASC($(1),1)
>RUN
DIES IST EIN STRING
68
In Programmzeile 30 wird der String-Operator ASC( ) auf das erste Zeichen des Strings $(1) angewendet. Dies ist der Großbuchstabe “D”; er hat den ASCII-Code 68.
Beispiel 3:
>10 STRING 100,12
>20 $(1)="ABCDEFGHIJKL"
>30 FOR X=1 TO 12
>40 PRINT ASC($(1),X),
>50 NEXT
>RUN
65 66 67 68 69 70 71 72 73 74 75 76
READY
Die ausgegeben Zahlen sind die ASCII-Codes der Großbuchstaben A...L.
Beispiel 4:
>10 STRING 100,12
>20 $(1)="ABCDEFGHIJKL"
>30 PRINT $(1)
>40 ASC($(1),1)=75
>50 PRINT $(1)
>60 ASC($(1),2)= ASC($(1),3)
>70 PRINT $(1)
>RUN
ABCDEFGHIJKL
KBCDEFGHIJKL
KCCDEFGHIJKL
READY
Hier wurden einzelne Zeichen durch andere ersetzt.
Beispiel 5:
>10 STRING 100,12
>20 $(1)="GEHEIM" : REM GEHEIM IST EIN PASSWORT
>30 INPUT "WIE LAUTET DAS PASSWORT ? ",$(2)
>40 FOR I=1 TO 6
>50 IF ASC($(1),I)= ASC($(2),I) THEN NEXT ELSE 80
>60 PRINT "OK"
>70 END
>80 PRINT "FALSCH, BITTE NOCH EINMAL !" :GOTO 30
>RUN
WIE LAUTET DAS PASSWORT ? GEMEIN
FALSCH, BITTE NOCH EINMAL !
WIE LAUTET DAS PASSWORT ? GEHEIM
OK
READY
Das vorstehende Beispiel zeigt, wie man zwei Strings miteinander vergleichen kann.
CHR
Syntax: CHR( )
Der String-Operator CHR( ) ist das Gegenstück zum Operator ASC( ), denn CHR( ) wandelt den ASCII-Zahlencode in die entsprechenden Zeichen um.
Beispiel 1:
>PRINT CHR(65)
A
Beispiel 2:
>10 STRING 100,12
>20 $(1)="MCS BASIC-52"
>30 FOR I=1 TO 12 : PRINT CHR($(1),I), : NEXT I
>40 PRINT : FOR I=12 TO 1 STEP -1
>50 PRINT CHR($(1),I), : NEXT I
RUN
MCS BASIC-52
25-CISAB SCM
READY
Dieses Beispiel zeigt, wie mit CHR( ) ein String verarbeitet werden kann.
Die Syntax des Operators CHR( ) ist identisch mit der Syntax von ASC( ). Ein Zeichen innerhalb eines String kann jedoch mit CHR( ) nicht verändert werden; eine Anweisung wie CHR($(1),1)=H führt zur Fehlermeldung BAD SYNTAX ERROR. CHR( ) ist nur zusammen mit der PRINT-Anweisung verwendbar.

nach oben

### Spezielle Operatoren

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.

nach oben

CBY

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).

nach oben

DBY

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.

nach oben

XBY

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.

nach oben

GET

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.

Beispiel:

>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)

nach oben

### Spezielle Funktionsoperatoren

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.

IE

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

nach oben

IP

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

nach oben

PORT1

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.

nach oben

PCON

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.

nach oben

RCAP2

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))

nach oben

T2CON

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.

nach oben

TCON

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!

nach oben

TMOD

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.

nach oben

TIME

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"
20 CLOCK 1:TIME=0
30 CUR 1,0 : PRINT INT(2*TIME),
40 GOTO 30

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:

>DBY(71)=0 (Sekundenbruchteile werden nullgesetzt)
>PRINT TIME
0
>DBY(71)=3 (3 mal 5 ms ergibt 15 ms)
>PRINT TIME
1.5 E-2

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.

nach oben

TIMER0

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.

nach oben

XTAL

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.

nach oben

### Anwendung spezieller Operatoren

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.

nach oben

### Systemvariablen

MTOP

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

nach oben

LEN

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.

nach oben

FREE

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.

## Anweisungen und Befehle

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 >

nach oben

####

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

nach oben

#### LIST

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

nach oben

####

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: -

nach oben

####

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: -

nach oben

####

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: -

nach oben

####

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: -

nach oben

####

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.

nach oben

####

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.

nach oben

####

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.

nach oben

#### CLOCK0, CLOCK1

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: -

nach oben

### DATA-READ–RESTORE

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

nach oben

#### DIM

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

nach oben

#### DO - UNTIL

Syntax: 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
>

nach oben

#### DO - WHILE

Syntax: 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
>

#### END

Syntax: 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
>

nach oben

#### FOR - TO - (STEP) - NEXT

Syntax: 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
>

nach oben

#### GOSUB - RETURN

Syntax: 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
>

nach oben

#### GOTO

Syntax: 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`

nach oben

#### ON…GOTO, ON…GOSUB

Syntax: 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.

nach oben

#### IF - THEN - ELSE

Syntax: 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`

nach oben

#### INPUT

Syntax: 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
>

nach oben

####

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: -

nach oben

####

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"`

nach oben

#### ONTIME

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
>`

nach oben

#### PRINT, P., ?

(? 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
>`

nach oben

#### PH0., PH1., PH0.#, PH1.#

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`

nach oben

#### PUSH

Syntax: 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
>`

nach oben

####

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

nach oben

#### PWM

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.

nach oben

#### REM

Syntax: 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.

nach oben

#### RETI

Syntax: 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: -

nach oben

####

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.

nach oben

####

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

nach oben

####

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

nach oben

#### 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.