WAIT

Aus C64-Wiki
Zur Navigation springenZur Suche springen
WAIT
Syntax: WAIT <Speicheradresse>,<Maske>[,<Invers>]
Parameter
<Speicheradresse>: numerischer Ausdruck im Wertebereich von 0 bis 65535
<Maske>: numerischer Ausdruck im Wertebereich von 0 bis 255
<Invers>: numerischer Ausdruck im Wertebereich von 0 bis 255
Einordnung
Typ: Anweisung
Kontext: System
Aufgabe: Warten, bis an angegebener Speicherposition eine vorgegebene Bitkombination auftritt
Abkürzung: wA
Token: $92 (146)
Verwandte Befehle
PEEK

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl WAIT unter BASIC V2 des Commodore 64.

Typ: Anweisung	
Syntax: WAIT <Speicheradresse>,<Maske>[,<Invers>]

Der BASIC-Befehl WAIT hält ein BASIC-Programm im Wartezustand, bis an der angegebenen Speicheradresse ein bestimmte Bitkombination zu Stande kommt. Dies dient üblicherweise zur Überwachung verschiedener Ein- und Ausgabevorgänge.

Allgemeines[Bearbeiten | Quelltext bearbeiten]

Dieser Befehl arbeitet wie folgt: Der Inhalt der angegebenen Speicheradresse wird, falls Invers angegeben ist, zuerst mit diesem EOR-verknüpft (vgl. auch XOR) und dann mit Maske logisch AND verknüpft. Erst wenn das Ergebnis ungleich Null wird, fährt die Programmausführung fort.
WAIT wartet also, bis mindestens eines der Bits in Speicheradresse, deren Stellenwerte durch Maske gegeben sind, den Wert 1 annimmt oder 0, falls das korrespondierenden Bit in Invers gesetzt ist (siehe Beispiel unten mit der äquivalenten BASIC-Nachbildung).

Die Speicheradresse kann Werte von 0 bis 65535 annehmen und für Maske und Invers ist der Bereich von 0 bis 255 zulässig. Liegen die Parameter nicht in den angegebenen Bereichen, so erscheint die BASIC-Fehlermeldung ?ILLEGAL QUANTITY ERROR.

Hinweis: Sind die Parameter für Maske und Invers so gewählt, dass damit das zu erwartende Ereignis nicht erkannt wird, hilft üblicherweise nur noch ein Reset oder Abbruch des BASIC-Programms mit der Tastenkombination RUN/STOP + RESTORE .

Beispiele[Bearbeiten | Quelltext bearbeiten]

Ein-/Ausgabe[Bearbeiten | Quelltext bearbeiten]

WAIT 1, 16, 16

Auf das Drücken einer Taste des Datasettengeräts warten (wenn Bit 4 von Speicherstelle 1 gleich 0 wird).

POKE 198,0: WAIT 198,1

Erst den Tastaturpuffer löschen und dann warten, bis eine Taste gedrückt wird (wenn Bit 0 von Speicherstelle 198 gleich 1 wird).

BASIC-Äquivalent[Bearbeiten | Quelltext bearbeiten]

100 REM  WAIT ADR, MASK, FLIP  NACHGEBILDET ...
110 B=PEEK(ADR): IF ((NOT B AND FLIP OR B AND NOT FLIP) AND MASK) = 0 GOTO 110

Nachbildung von WAIT mittels Standard-BASIC: Die EOR-Verknüpfung von B und FLIP muss etwas umständlich mit NOT, OR, AND nachgebaut werden.
Oder in einer etwas flotteren Variante (mit weniger logischen Operationen) entsprechende Zeile oben ersetzen mit:

110 B=PEEK(ADR): IF ( (B OR FLIP)-(B AND FLIP) AND MASK) = 0 GOTO 110

Zeitverzögerungen[Bearbeiten | Quelltext bearbeiten]

Einfach:

POKE162,0: WAIT 162,32

Wartet 32/60 s, also eine gute 1/2 Sekunde. Werte der Bitwertigkeiten 1, 2, 4, 8, 16, 32 erlauben die entsprechende Zeit in 1/60 s der Jiffy-Clock (die Zeropage-Adresse 162 ist das niederwertigste Byte des Zählers) auch in einem Bereich kleiner 1 Sekunde auf kurze und elegante Weise verstreichen zu lassen. Funktioniert selbst bei compiliertem BASIC. In diesem Beispiel wird allerdings als Nebeneffekt auch der Wert für TI und TI$ verändert!

Allgemein Warteroutine:

100 T=90: REM 1,5 SEKUNDEN WARTEN
110 TI$="000000": REM DAMIT TI AUSSAGEKRAEFTIGE WERTE LIEFERT
120 GOSUB 900
130 PRINT TI
140 END
900 WT=162: REM LOW-BYTE 24-BIT-TIMER
910 POKE WT,0: REM TIMER ZURUECKSETZEN
920 WAIT WT, 128, NOT(T) AND 128
921 WAIT WT, 64, NOT(T) AND 64
922 WAIT WT, 32, NOT(T) AND 32
923 WAIT WT, 16, NOT(T) AND 16
924 WAIT WT, 8, NOT(T) AND 8
925 WAIT WT, 4, NOT(T) AND 4
926 WAIT WT, 2, NOT(T) AND 2
927 WAIT WT, 1, NOT(T) AND 1
930 RETURN

Das Unterprogramm ab Zeile 900 wartet ein Vielfaches von 1/60 s entsprechend dem Wert in Variable T (mit einer gewissen Unschärfe, siehe Anmerkung weiter unten).
Es wird auf die Erfüllung des jeweils höchstwertigen Bits gewartet, egal ob es ein 0- oder 1-Bit ist. Um auf ein 0-Bit zu warten, muss es vor der AND-Verknüpfung mit dem 3. Parameter, der Inversmaske "umgedreht" werden, da sonst die AND-Verknüpfung niemals zutreffen würde (ein WAIT X,0 endet nie).
NOT() wird hier mit der Klammerung verwendet, da hier die Form beispielsweise NOT TAND 1 der Tokenizer fälschlicherweise sonst das Token für die Funktion TAN erkennt.

Anmerkung: Die Implementierung leidet allerdings an der relativ langsamen Ausführung der BASIC-Befehle, wo bis zum Erreichen der Abfrage von Bit-Wert 1, der Timer schon weiter gelaufen ist und dann erst bei der Bit-Änderung von Wert 2 oder 4 oder bei kleinen Werten sogar erst 8 "Ticks" später alle Bedingungen erfüllt sind.
Hier ein Vergleich von der angeforderten Wartezeit zu den tatsächlich vergangenen Ticks und die Abweichung voneinander für den Bereich von 1 bis 100 (die Abweichung kann sich von Durchlauf zu Durchlauf ändern):

Wartezeit Ticks     Abweichung
1         9         8
2         6         4
3         11        8
4         6         2
8         10        2
12        14        2
16        18        2
17        18        1
20        22        2
24        26        2
28        30        2
32        36        4
33        37        4
36        38        2
40        42        2
44        46        2
48        50        2
49        50        1
52        54        2
56        58        2
60        62        2
64        68        4
65        69        4
66        68        2
68        70        2
72        74        2
76        78        2
80        82        2
84        85        1
88        90        2
92        93        1
96        100       4
97        101       4
100       101       1

Weblinks[Bearbeiten | Quelltext bearbeiten]