home *** CD-ROM | disk | FTP | other *** search
- DTCOOKIE Version 1.2 - Date/Time-Cookies setzen
- ===============================================
-
- Sinn und Zweck von DTCOOKIE
- ---------------------------
- Das Programm DTCOOKIE.PRG dient lediglich dazu, die Cookies
- "DATE", "TIME", "_IDT" und "_AKP" auf sinnvolle Werte zu setzen.
- Falls einer dieser Cookies bereits gesetzt ist, wird er von
- DTCOOKIE nicht verändert. Sinnvollerweise startet man DTCOOKIE.PRG
- aus dem AUTO-Ordner, vor den Programmen, die diese Cookies
- auswerten.
-
- Die Cookies "_AKP" und "_IDT"
- -----------------------------
- Dies sind mehr oder weniger offizielle Cookies von Atari. Sie
- enthalten Informationen über nationale Besonderheiten, die von
- Anwenderprogrammen und vom Desktop berücksichtigt werden sollten.
- Die Cookies werden unter anderem vom MultiTOS-Desktop ausgewertet,
- allerdings von älteren TOS-Versionen nicht gesetzt. Falls Multi-
- TOS unter einer älteren TOS-Version gestartet wird, sollte man
- diese Cookies z.B. mit DTCOOKIE selber setzen. Die Werte für die
- Cookies entnimmt DTCOOKIE, wenn möglich, dem nichtflüchtigen
- Speicher (NVM), und sonst der Länderkennung im System-Header.
-
- Der "_AKP"-Cookie im Detail:
- ----------------------------
- Bit 0..7: Ländercode für Tastaturlayout
- Bit 8..15: Ländercode für Landessprache
- Bit 16..31: reserviert
-
- Der "_IDT"-Cookie im Detail:
- ----------------------------
- Bit 0..7: Trennzeichen für Datumsangaben
- (Null steht als Default für '/').
- Bit 8..11: Datumsformat,
- (0: MM-TT-JJ, 1: TT-MM-JJ,
- 2: JJ-MM-TT, 3: JJ-TT-MM.)
- Bit 12..15: Zeitformat
- (0: am/pm, 1: 24 Stunden)
- Bit 16..31: reserviert
-
- Die Cookies "DATE" und "TIME"
- -----------------------------
- Dies sind infoffizielle Cookies, welche das Abfragen von Datum
- und Uhrzeit aus dem Interrupt erleichtern sollen:
-
- Der "DATE"-Cookie enthält einen Zeiger auf eine word-gro₧e
- Variable mit dem aktuellen Datum im Tgetdate()-Format.
- Der "TIME"-Cookie enthält einen Zeiger auf eine word-gro₧e
- Variable mit der aktuellen Uhrzeit im Tgettime()-Format.
-
- DTCOOKIE besetzt die Cookies mit Zeigern auf die GEMDOS-internen
- Variablen für Datum und Uhrzeit. Es ermittelt die Adressen dieser
- Variablen über die GEMDOS-Funktion Sconfig() (die bisher nur von
- "KAOS" und "MagiX" angeboten wird) und wenn dies nicht möglich
- ist, durch Tracing von Tgetdate()/Tgettime()-Aufrufen. Diese
- Methode ist zwar nicht ganz "sauber", funktioniert aber unter
- allen TOS-Versionen und auch mit MiNT (MiNT hat übrigens seine
- eigenen internen Variablen. Wird DTCOOKIE vor MiNT gestartet,
- zeigen die Cookies auf die GEMDOS-internen Variablen, wird
- DTCOOKIE nach MiNT gestartet, zeigen sie auf die MiNT-internen
- Variablen).
-
- Tips zur Abfrage von Datum und Uhrzeit aus dem Interrupt
- --------------------------------------------------------
- Die aktuelle Uhrzeit und das aktuelle Datum sollten eigentlich
- grundsätzlich mit den GEMDOS-Funktionen Tgetdate() und Tgettime()
- ermittelt werden. Diese Routinen benutzen zur Bestimmung der Zeit
- die Systemtimer-Routine etv_timer(), die Zeit wird dabei beim
- Start von GEMDOS und bei jeder Beendigung eines GEMDOS-Prozesses
- mit Hilfe der Hardware-Uhr aktualisiert, was einen Kompromi₧ aus
- Geschwindigkeit und Genauigkeit darstellt. Das Problem stellt sich
- dann, wenn die Zeit von einem residenten Programm im Interrupt
- benötigt wird (etwa von einer Bildschirmuhr oder einem Programm,
- das im Hintergrund zeitabhängig Me₧werte aufzeichnet oder irgend-
- welche Prozesse oder Geräte steuert). Weil das Standard-GEMDOS
- nicht re-entrant ist, dürfen Tgetdate() und Tgettime() hier nicht
- aufgerufen werden. Unter MiNT ist zwar das GEMDOS re-entrant, darf
- aber trotzdem nicht aus einem Interrupt aufgerufen werden. Man
- könnte statt der GEMDOS-Funktionen Tgetdate() und Tgettime() zwar
- die XBIOS-Funktion Gettime() aufrufen, aber auch dies ist nicht zu
- empfehlen, denn Gettime() liest die Hardware-Uhr, was eventuell
- einige Zeit in Anspruch nehmen könnte. Au₧erdem ist auch das XBIOS
- nur bedingt re-entrant (der Rekursionsstapel ist zu klein und der
- Dispatcher sperrt während des Rettens der Register nicht die
- Interrupts) und darf unter MiNT ebenfalls nicht im Interrupt
- aufgerufen werden.
-
- Im Multitasking-Zeitalter sollte man sich zunächst einmal überlegen,
- ob ein solches residentes Programm (TSR) nicht besser durch eine ganz
- "normale" im Hintergrund laufende Applikation ersetzt werden kann.
- Man kann dann völlig problemlos Tgettime() und Tgetdate() aufrufen.
-
- Ist wirklich ein TSR erforderlich, wird vorgeschlagen, da₧ es das
- aktuelle Datum und die Uhrzeit wie folgt ermittelt:
-
- 1. Es testet, ob der Cookie "MagX" gesetzt ist. In diesem Fall ist
- "MagiX" installiert, und es kann Tgettime() und Tgetdate() auch im
- Interrupt aufrufen. Die Routinen sind unter MagiX ausreichend
- schnell und re-entrant.
-
- 2. Es testet, ob die Cookies "DATE" und "TIME" gesetzt sind. In
- diesem Fall kann es Datum und Uhrzeit über die Variablen
- bestimmen, deren Zeiger in den Cookies stehen (Zugriff auf die
- Variablen nur im Supervisor-Modus und nur lesend).
-
- 3. Ansonsten bleiben dem TSR im wesentlichen die folgenden zwei
- Möglichkeiten: Erstens, zu versuchen, die Adressen der GEMDOS-
- Variablen für Datum und Uhrzeit selbst zu ermitteln, und dann
- diese Variablen zu benutzen (eine "unsaubere" Methode!) oder
- zweitens, bei der Initialisierung des Programms mit Tgetdate() und
- Tgettime() Datum und Uhrzeit zu bestimmen sowie die Systemvariable
- _hz_200 ($4ba) auszulesen und im Interrupt dann Datum und Uhrzeit
- aus der Änderung von _hz_200 zu bestimmen. Wenn es Blockierungen
- oder Ungenauigkeiten von _hz_200 Rechnung tragen will, sollte es
- sich noch in den GEMDOS-Trap hängen und dort die Uhrzeit gelegent-
- lich korrigieren (z.B. bei jedem Pexec()- oder Pterm()- oder
- Pterm0()-Aufruf mit einem zusätzlichen Tgettime()-Aufruf).
-
- Wie gesagt, ist die Methode, mit der DTCOOKIES die GEMDOS-internen
- Variablen findet und die Benutzung dieser Variablen durch andere
- Programme (au₧er unter KAOS und MagiX) nicht "offiziell erlaubt"
- und daher als "unsauber" zu bezeichnen, obwohl sie in allen
- bekannten Fällen funktioniert und elegant, schnell und einfach
- ist. Da in Deutschland "Sauberkeit" gro₧geschrieben wird, seien
- hier noch zwei Möglichkeiten genannt, wie man die Cookies auch
- "sauber" setzen könnte. Allerdings sind diese Lösungen weder
- elegant, noch schnell, noch einfach. Welche Lösung man bevorzugt,
- hängt wohl hauptsächlich davon ab, ob man mehr pragmatisch oder
- mehr dogmatisch denkt.
-
- 1. Ein residentes Programm legt zwei Variablen für Datum und
- Uhrzeit an, lä₧t die Cookies "DATE" und "TIME" darauf zeigen,
- klinkt sich in etv_timer() oder irgendeinen anderen Timer ein,
- initialisiert die Variablen mit Tgetdate()/Tgettime() und
- aktualisiert sie dann im Timer-Interrupt, ähnlich, wie es das
- GEMDOS in etv_timer() mit seinen Variablen auch macht.
-
- 2. Das TSR, das die Cookies benutzen möchte, legt die Cookies
- "DATE" und "TIME" an und lä₧t sie auf zwei Variablen im TSR
- zeigen (falls die Cookies bereits existieren, hat ein anderes
- TSR dies bereits getan, in diesem Fall benutzt es einfach die
- Zeiger in den Cookies). Das TSR initialisiert die Variablen
- danach mit den GEMDOS-Funktionen Tgetdate() und Tgettime().
- Ein zusätzliches Accessory-Programm aktualisiert die Variablen
- dann regelmä₧ig (etwa einmal pro Sekunde) in einer evnt_timer()-
- Schleife mit Tgetdate() und Tgettime().
-
- Schlie₧lich besteht theoretisch noch die Möglichkeit, da₧ die
- Variablen unter GEMDOS oder MiNT einmal offiziell zugänglich
- gemacht werden, aber diese Lösung wäre ja viel zu einfach.
-
- Wahrscheinlich wird sich das ganze Problem in Zukunft aber auch
- von selbst lösen - entweder weil Atari schnellere Rechner mit
- Multitasking-Betriebssystem ausliefert oder weil Atari pleite
- geht. Beides würde die Notwendigkeit von TSR-Programmen auf dem
- Atari erheblich vermindern.
-
- Zum Schlu₧
- ----------
- DTCOOKIE ist ein Freeware-Programm von Christoph Zwerschke. Die
- Benutzung geschieht auf eigene Gefahr. Alle Aussagen in obigem
- Text ohne Gewehr und Pistole.
-
- Heidelberg, den 26.1.1994
-