★ APPLICATIONS ★ DIVERS ★ Interrupt-Uhr für den CPC 464 ★ |
Rsx - Clock - Interrupt - Uhr für den CPC 464 (CPC Amstrad International) | Applications Divers |
Passiert es Ihnen auch, daß Sie einen Nachmittagoder Abend vor dem Computer verbringen und dabei jedes Zeitgefühl verlieren? Natürlich könnte man sich einen Wecker stellen oder eine Uhr neben dem Monitor plazieren, aber wer etwas von seinem Computer hält, der übergibt diese Aufgabe lieber dem Computer selber. Nachfolgend wird Schritt für Schritt eine Interrupt-Uhr für den CPC 464 vorgestellt, die jeden nur denkbaren Komfort bietet und dennoch den Gebrauch des Computers beim Programmieren nicht einschränkt. 1. Teil: Interrupt-Uhr, die im Hintergrund läuft
Wenn nichts angepaßt werden mußte oder wenn alles angepaßt worden ist, wird die Routine zur Anzeige der Uhr aufgerufen. Im ersten Teil soll unsere Uhr jedoch ohne Anzeige laufen, daher steht bei »Anzeige« ein »Ret«. Stellen: Auslesen: 100 zei(anf=&A43C Einen einzigen Nachteil hat diese Uhr, der jedoch nur mit einer Hardware-Uhr zu beheben ist: Bei einer Cassetten- oder Diskettenoperation läuft sie nicht weiter, da alle Interrupts abgeschaltet werden müssen. Stören wird dieses jedoch nur, wenn seh r viel auf die Cassette oder Diskette zugegriffen wird. Außerdem soll diese Uhr ja nicht supergenau gehen, denn dafür ist eine Armbanduhr wesentlich besser geeignet. 2. Teil: Ständige Anzeige der Uhr auf dem Bildschirm Um nicht zu viel Rechenzeit zu verbrauchen, wird die Uhr nur einmal je Sekunde angezeigt. Zur Anzeige der Uhr müssen die Zahlenwcrte für Sekunden, Minuten und Stunden erst einmal in ASCII-Werte umgerechnet werden. Durch die BCD-Codierung ist dies sehr leicht, da die Ziffern bereits getrennt vorliegen. In der Routine »Umwandeln« wird nun eine BCD-Zahl in zwei ASCII-Ziffern umgewandelt und im Speicher abgelegt. Es wird von hinten nach vorne vorgegangen, also zuerst die Sekunden-Einer, dann die Zehner und dann wird ein Doppelpunkt zur Trennung der Zahlen abgelegt. Wenn auch die Stunden umgewandelt sind, wird der gesamte String in der Routine »Print« auf dem Bildschirm in der rechten oberen Ecke ausgegeben. 3 Teil: Weckmöglichkeit Unsere Uhr sollte komfortabel sein, also bauen wir eine Weckmöglickeit ein. 4. Teil: Bedienungskomfort durch Erweiterungsbefehle Nun wird die Bedienung der Uhr komfortabler, denn verschiedene Befehle werden über Erweiterungsbefehle direkt ausgeführt. Diese Routine benötigt als Parameter im HL-Register die Adresse eines 4 Byte langen Blocks im RAM zur Verwaltung der Erweiterung, und im BC-Register die Adresse der Routine, die bei dem Erweiterungsbefehl angesprungen werden soll. Am Anfang, der vom Erweiterungsbefel angesprungenen Routine, steht die Adresse, an der der genaue »Wortlaut« des Befehls in Großbuchstaben abgelegt ist, wobei das Ende des Befehls durch Addieren von &80 gekennzeichnet wird. Die Einbindung eines Befehls darf allerdings nur einmal geschehen, sonst bewirkt jeder andere Befehl einen Absturz. Hier kann man Vorsorgen, indem man vorher testet, ob der Befehl schon existiert. Falls ja, wird er nicht neu eingebunden. Dieses Testen übernimmt eine andere Routine, "KL Find Command", der man im HL-Register die Adresse des zu suchenden Befehls gibt. Falls der Befehl bereits existiert, ist das Carry-Flaggesetzt. In diesem Programm gibt es zwar viele Erweiterungsbefehle, aber man braucht nur einen abzutesten, da entweder alle oder gar keiner existieren kann. Einige Funktionen kann man nun ganz einfach realisieren, z.B. das Ein- und Ausschalten der Anzeige der Uhr. Hierfür wird ein Flag eingeführt, das, wenn es gleich null ist, die Anzeige der Uhr verhindert. Zum Ein- und Ausschalten sind die Befehle "lUhr.e" und "lUhr.a" vorgesehen. Die Routine "lUhr.q" (Quit ),bewirkt, daß der Aufruf der Uhr nicht mehr erfolgt und der Befehl "lUhr.i" initialisiert die Uhr wieder. Alle anderen Routinen benötigen Parameter, und die sind bei Erweiterungsbefehlen leider nicht sehr leicht zu übergeben. Beim Stellen der Uhr und der Weckzeit ist es noch relativ einfach, weil hier nur Integerzahlen zu übergeben sind. Der Befehl zum- Stellen sieht dann so aus: lUhr.s , stunden , minuten Die Adressen der Argumente werden mittels IX-Register übergeben, und die Werte können so gelesen werden. Der Befehl zum Andern der Weckzeit lautet: lUhr.w , stunden , minuten Dann gibt es noch den Befehl: lUhr.m , @a$, der die ersten 10 Zeichen von a$ als String zur Ausgabe beim Wecken definiert. Der Befehl hat eine so komplizierte Form, weil als Argumente der Erweiterungsbefehle nur Integerzahlen zugelassen sind. Dabei gibt o a$ die Adresse des sogenannten Stringdescriptors an, der die Länge und die Adresse des Strings enthält Mit diesen Daten ist es dann auch möglich, einen solchen String zu verändern. Dies wird bei dem Befehl: lUhr.g, @a$ genutzt, der die Uhrzeit an den Anfang von a$ schreibt. Befehle der Interrupt-Uhr für den CPC 464 lUhr.e schaltet die Anzeige der Uhr ein lUhr.a schaltet die Anzeige der Uhr aus schaltet die Uhr völlig ab lUhr.q initialisiert die Uhr nach einem lUhr.i Abschalten wieder stellt die Uhr auf die lUhr.s , stunden , minuten angegebene Zeit lUhr.w , stunden , minuten stellt die Weckzeit lUhr.m , @a$ setzt die ersten 10 Zeichen von a$ als Memory-String lUhr.g, @a$ schreibt die Uhrzeit an den Anfang von a$
|