STATUS

Aus C64-Wiki
(Weitergeleitet von ST)
Zur Navigation springenZur Suche springen
STATUS
Syntax: ST

oder

STATUS
Parameter
Einordnung
Typ: Systemvariable
Kontext: Ein/Ausgabe
Aufgabe: Abfrage von Meldungen bei Ein- und Ausgabevorgängen
Abkürzung: -
Token: keins
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 Bit-Werte (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.

Interna[Bearbeiten | Quelltext bearbeiten]

Der Interpreter bedient sich der KERNAL-Routine READST, Einsprungstelle $FFB7, die den Status für ein beliebiges Gerät ermittelt, um den Inhalt der Variable wiederzugeben.
Der Status wird in der Zeropage-Speicherstelle 144 ($90) für IEC-Geräte und Datasette und im Falle von RS-232 beim C64 von $0297/663 (bzw. beim C128 von $0A14/2580) entnommen. Für IEC-Geräte oder bei Datasette kann so mittels POKE 144,<wert> auf einen definierten Wert gesetzt werden, was typischerweise für das Löschen des Status gebraucht wird (siehe Beispiel). Der Wert von STATUS für IEC-Geräte und Datasette kann somit auch mit einem PEEK-Befehl ausgelesen werden:

PRINT PEEK(144)

oder bei RS-232 am C64:

PRINT PEEK(663)

Dieser Wert entspricht jenem aus dem Ausdruck STATUS AND 255.

Mögliche Werte von STATUS[Bearbeiten | Quelltext bearbeiten]

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 End of Tape (EOT) Gerät nicht vorhanden BREAK-Signal empfangen

Entsprechend dem Bit-Wert, 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.

Beispiele[Bearbeiten | Quelltext bearbeiten]

Direktmodus[Bearbeiten | Quelltext bearbeiten]

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

Innerhalb von BASIC-Programmen[Bearbeiten | Quelltext bearbeiten]

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.

Einschaltest für IEC-Geräte[Bearbeiten | Quelltext bearbeiten]

10 REM IEC-GERAET TESTEN
20 POKE 780, GA
30 POKE 144, 0: REM STATUS LOESCHEN
40 POKE 185, 15: REM SEKUNDAERADRESSE SETZEN
50 SYS 63048: REM SENDE "LISTEN" UND "UNLISTEN"
60 PRINT ST

Die Variable GA sollte die Geräteadresse enthalten (z.B. 4 für Drucker, 8 für Floppy).
Das Ergebnis ist bei einem Original-C64 entweder 0 (Gerät ist vorhanden und eingebunden), -128 (Device not present) oder 2 (Timeout).
Aufgerufen wird die Routine an Adresse 63048 ($F648) als Teil der KERNAL-Routine $F5FA/62970: Save to Serial Bus.

Nach dem Aufruf von C-Programmen[Bearbeiten | Quelltext bearbeiten]

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