Kurze Pausen
Kurze Pausen

Der Befehl PAUSE ist leider nur sekundengenau kalibrierbar, Verzögerungszeiten unter einer Sekunde sind ohne weiteren Eingriff nicht möglich. Mit zwei POKEs kann man hier Abhilfe schaffen und auch Werte von Sekundenbruchteilen (z.B. Zehntelsekunden) verwenden. Die POKEs stellen den PAUSE-Befehl um auf die Entgegennahme von Jiffies (60tel-Sekunden), 6 Jiffies sind also eine Zehntelsekunde.

POKE $B903,22: poke $B912,22: PAUSE 6 (eine Zehntelsekunde)

PAUSE wird mit einem Wert von jeweils 23 für die beiden POKEs zurückgestellt auf seine Normaleigenschaft (ganze Sekunden).

So sähe eine Prozedur SLEEP aus, mit der man wahlweise Sekunden oder Zehntelsekunden Verzögerungszeit erzeugen könnte (mit der Variablen W wird die Wartezeit eingestellt, ein Wert kleiner als 1 schaltet PAUSE um auf "kurze Pausen"):

1300 proc sleep
1305 ifw<1thenpoke$b903,22:poke$b912,22:w=abs(-(w>=0)*w-.035)*60
1340 pause a1$,w
1365 poke$b903,23:poke$b912,23
1370 end proc

Der String A1$ ist ein Dummy (Leerstring), kann aber auch mit Inhalt versehen sein.

Ist der Wert von W mindestens 1, wartet SLEEP ganze Sekunden, ist er dagegen ein Bruch kleiner als 1, tritt Zeile 1305 in Aktion und stellt PAUSE mit den beiden POKEs um auf Verarbeitung von Jiffies. Da die Abarbeitung dieser Prozedur ebenfalls eine gewisse Zeit dauert, wird diese Zeitdauer (0.035 als Justierungsfaktor) vom gewählten Wert für W vorab subtrahiert (da sie ja die Wartezeit um diesen Wert verlängert). Intern arbeitet TSB mit 60tel-Sekunden (Jiffies), daher wird der Verzögerungswert mit 60 multipliziert. Also ergibt eine Eingabe von 0.5 für W letztendlich den Integer-Wert 27 für PAUSE (wobei die zu 30 fehlenden 3 für die Abarbeitung der Prozedur durch die Subtraktion berücksichtigt werden; SLEEP wartet dann also nicht 27, sondern tatsächlich 30 Jiffies, eine halbe Sekunde). Mit dem ABS-Ausdruck fangen wir außerdem negative Eingaben und den Wert 0 für W ab.

Danach wird TSB mit den zwei neuerlichen POKEs wieder "repariert", egal ob vorher umgestellt wurde oder nicht.

SLEEP kann also entweder ganze Sekunden oder Sekundenbruchteile verzögern. Möchte man eine Wartezeit von 3.3 Sekunden, muss man entweder w=3:SLEEP:w=0.3:SLEEP eingeben oder (A1$ sollte hier leer sein!) for i=1 to 11:w=1/3:SLEEP:next.

Hier eine kurze Testroutine für SLEEP (den Wert für W ändern):

100 cls:check
110 print "eins ":a2$="zwei "
120 w=.3: sleep
140 print a2$
999 end

Beachten: Exakte Verzögerungswerte erhält man nur bei direkter Eingabe von Jiffy-Werten. PAUSE 6 entspricht exakt einer Zehntelsekunde. Die Prozedur SLEEP liefert wegen der intern verwendeten Integer-Arithmetik keine exakten Verzögerungen.