TI
Die Systemvariable TI ist ein Timer (Zeitzähler), der die seit dem Einschalten des C64 oder dem letzten 24-h-Überlauf oder nach einem Reset verstrichene Zeit in 1/60 Sekunden zählt. Häufig wird diese Variable auch in einer für Variablennamen möglichen und gültigen Langform − in <Buchstaben> darf kein anderes Schlüsselwort vorkommen − per Konvention als TIME oder TIMER bezeichnet, um die Lesbarkeit zu erhöhen.
Weiterhin wird er durch Setzen der Systemvariable TI$ (bzw. TIME$) beeinflusst und kann so indirekt auf den korrespondierenden Timer-Wert von TI$ gesetzt werden. TI$ und TI sind dabei nur unterschiedliche Ausprägungen des gleichen internen Timers. Dabei kann TI Werte von 0 bis (hexadez. 4F1A00) 5184000 annehmen, wobei das Maximum der Anzahl der 1/60 s für 24 Stunden, also dem Wertebereich von TI$ entspricht.
Die von TI vermerkte Zeit entspricht in der Regel nicht dem Verlauf der Realzeit, da der mit Hilfe der Interrupt-Technik realisierte interne Timer z.B. bei Nutzung des Datasettengeräts oder bei anderen Vorgängen, die Interrupts (IRQ) maskieren (z.B. mit SEI), vorübergehend angehalten wird.
Die Systemvariable TI kann nur ausgelesen werden. Beim Versuch einer Wertzuweisung erscheint die BASIC-Fehlermeldung ?SYNTAX ERROR. Dies passiert ebenfalls bei der Verwendung von Variablennamen, die bei den signifikanten ersten beiden Buchstaben TI aufweisen, wie z.B. bei TIEFE = 10
.
Beispiele
Einfache Abfrage
ZEIT = TI: PRINT "Ihr Commodore 64 läuft seit ca. ";INT(ZEIT/60);" Sekunden "
Time auslesen und als Sekundenwert aufbereiten.
Alias-Bezeichnungen
PRINT TICKS
Ein weitere gültige Langbezeichnung für TI.
PRINT TICKTOCK
Dies ist fehlerbehaftet, da das Schlüsselwort TO enthalten ist und liefert folgende Ausgabe (der TI-Wert wird dennoch ausgeben, weil der Syntax-Fehler erst später auftritt).
43580
?SYNTAX ERROR
READY.
100 PRINT "START "TI$": T=2.5: GOSUB 900: PRINT "ENDE "TI$
199 END
Zeit abwarten
900 T0=TI: FOR T=T0+T*60 TO T: T=TI:T=T-5184E3*(T<T0): NEXT: RETURN
Das Unterprogramm in Zeile 900 wartet die in Variable T gegebene Zeit in Sekunden (auch Bruchteile davon) ab.
Dabei bleibt der aktuelle Zeitwert in TI$ unberührt. Auch ein etwaiger Tagesumschlag bei 23:59:59 (das entspricht 5184000 1/60 s) wird berücksichtigt.
Führt zu folgender Ausgabe beispielsweise unmittelbar vor dem Tagesumschlag
START 235959
ENDE 000001
Die tatsächlich verstrichene Zeit in Sekunden lässt sich nach dem Aufruf mit (T-T0)/60
ermitteln.
Berechnete Zeit setzen
Die aktuelle Zeit, um einen Sekundenwert aus Variable X (positiv oder negativ) verstellen:
500 T=TI+X*60 : REM 1/60 SEKUNDEN
510 Z1 = INT(T/256) : REM MIDDLE BYTE VORBEREITET
520 Z0 = T-Z1*256 : REM LOW BYTE
530 Z2 = INT(Z1/256) : REM HIGH BYTE
540 Z1 = Z1-Z2*256 : REM MIDDLE BYTE
550 POKE 162,0: POKE 160,Z2 : POKE 161,Z1 : POKE 162,Z0 : REM TIMER SETZEN
Das niederwertigste Byte wird vorsorglich auf 0 gesetzt, damit unmittelbar nach dem Setzen des Middle Bytes nicht ein zwischenzeitliches Hochzählen (IRQ-Unterbrechung) einen Überlauf produziert und so die Zeit verfälschen könnte (um 256/60 s, also 4,3 s).