STATUS

Aus C64-Wiki
Wechseln zu: Navigation, Suche
STATUS
Format: ST

oder

STATUS
Parameter
Einordnung
Typ: Systemvariable
Kontext: Ein/Ausgabe
Aufgabe: Abfrage von Meldungen bei Ein- und Ausgabevorgängen
Abkürzung: -
Verwandte Befehle

Anmerkung: Dieser Artikel beschreibt die Systemvariable ST unter BASIC V2 des Commodore 64.

Die Systemvariable ST (üblicherweise in einer Langform als STATUS bezeichnet) dient zum Abfragen von Meldungen, die bei Ein- und Ausgabevorgängen von Datasette, RS-232 und seriellem Datenbus (z.B. Diskettenlaufwerk, Drucker) generiert werden. Diese werden als Bitwerte (8 Bits) vom KERNAL zurückgemeldet und steht in BASIC als ganzzahliger Wert im Wertebereich von -128 bis +127 zur Verfügung.

Eine Zuweisung an die Variable ST ist nicht möglich und führt zur Fehlerausgabe von ?SYNTAX ERROR. Dies passiert typischerweise bei Verwendung von Variablennamen, die mit den signifikanten 2 Buchstaben ST beginnen, wie z.B. bei STIMMEN = STIMMEN + 1.

[Bearbeiten] Mögliche Werte von STATUS

Je nach Gerät und ausgeführter Operation wird das Ergebnis im entsprechenden Bit der STATUS-Variablen wiedergegeben.

STATUS
Bit
Bit-
Wert
Datasette Serieller Bus RS-232
0 1 - Datenrichtung, während der eine Zeitüberschreitung aufgetreten ist
0 = Lesen, 1 = Schreiben
Paritätsfehler
1 2 - Zeitüberschreitung (Timeout) aufgetreten Rahmenfehler (Start-/Stoppbit)
2 4 Block ist zu kurz
(kleiner als 192 Bytes)
- Empfängerpuffer voll
3 8 Block ist zu lang
(größer als 192 Bytes)
- Empfängerpuffer leer
4 16 VERIFY-Fehler
(Fehlerhaft gelesene Bytes in Pass 1 konnten in Pass 2 nicht korrigiert werden.)
VERIFY-Fehler CTS-Signal fehlt
5 32 Prüfsummenfehler - -
6 64 Dateiende (EOF, End Of File) wurde erreicht
(nur beim Lesen)
EOI (End Of Information), normalerweise Dateiende (EOF, End Of File), bei relativen Dateien Datensatzende DSR-Signal fehlt
7 128 - Gerät nicht vorhanden BREAK-Signal empfangen

Entsprechend dem Bitwert, kann das jeweilige Bit aus ST mittels Operator AND ausmaskiert werden. Z.B. erkennt der Ausdruck STATUS AND 128 ein gesetztes 7. Bit.
Die Kombination aller Bits erhält man mit dem Ausdruck STATUS AND 255, der den Statuswert in eine vorzeichenlose Zahl konvertiert. Andernfalls bewirkt ein gesetztes Bit 7 die Vorzeichenübernahme aus dem als vorzeichenbehaftete 8-Bit-Zahl angesehenen Wert.

[Bearbeiten] Beispiele

[Bearbeiten] Direktmodus

PRINT STATUS

oder als Vorzeichenlose Zahl:

PRINT (STATUS AND 255)

bzw.

PRINT (ST AND 255)

Das Leerzeichen nach "ST" ist wesentlich, da sonst in STAND das Funktionstoken TAN erkannt wird und einen ?SYNTAX ERROR hervorruft. Oder man schreibt folgendes, um diesen Effekt zu vermeiden (in kompakter Schreibweise):

PRINT 255ANDST

Der Wert von STATUS befindet sich in der Speicheradresse 144/$90 und kann somit auch mit einem PEEK-Befehl ausgelesen werden:

PRINT PEEK(144)

Dieser Wert ist identisch mit dem Ausdruck STATUS AND 255.

[Bearbeiten] Innerhalb von BASIC-Programmen

Mit dem folgenden Programm wird eine Textdatei geöffnet, Byte für Byte gelesen und auf dem Bildschirm ausgegeben. Dies passiert solange, bis das Ende der Datei erreicht wurde oder ein Fehler auftritt. Wie in der obigen Tabelle ersichtlich, erkennt man durch eine Abfragen von Bit 6 aus ST das Dateiende (End-of-File). In diesem Fall (wenn nämlich auch kein anderes Bit gesetzt ist) wird "OK" ausgegeben. In jedem Fall wird auch der Status, stets umgewandelt als positiver Wert, angezeigt.

 1 REM DATEI BYTEWEISE LESEN UND AUSGEBEN
10 REM SEQ. DATEI FUER EINGABE OEFFNEN:
20 OPEN 1,8,2,"0:TEXT FILE,S,R"
30 FOR S=0 TO 1  : REM ENDLOSSCHLEIFE, SOLANGE S = 0 IST
40 GET#1,A$      : REM EIN BYTE AUSLESEN
50 PRINT A$;     : REM DAS BYTE AUF DEM BILDSCHIRM AUSGEBEN
60 S=ABS(ST)     : REM S ist >0 WENN DATEIENDE ODER FEHLER
70 NEXT S        : REM ABBRUCH, WENN ST <> 0 WAR
80 CLOSE 1       : REM DATEI WIEDER SCHLIESSEN
90 IF ST=64 THEN PRINT "OK"
91 PRINT "STATUS:" 255 AND ST

Die FOR-NEXT-Konstruktion ist für die Laufzeit vorteilhaft und unabhängig davon, wie viele Zeilen das Programm hat oder wo das als Unterprogramm positioniert ist (das macht dann einen GOTO-Aufruf mitunter sehr langsam). Der Status in ST bleibt auch nach dem CLOSE erhalten.
Die Endbedingung fürs Einlesen (= Endbedingung der Schleife) lautet hier, dass ST größer 0 wird. Mit der Funktion ABS() ist auch im Fehlerfall, bei dem ST nämlich auch negativ werden kann, gewährleistet, dass das Ende mit >0 erkannt wird.

[Bearbeiten] Nach dem Aufruf von C-Programmen

Programme, die mit cc65 geschrieben wurden, liefern in ST den Return-Code des C-Programms.

In anderen Sprachen