APPLICATIONSDIVERS ★ Interrupt-Uhr für den CPC 464 ★

Rsx - Clock - Interrupt - Uhr für den CPC 464 (CPC Amstrad International)Applications Divers
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

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
Alle 1/50 sec. wird ein Timer-Interrupt ausgelöst, der verschiedene Aufgaben hat. In diese Kette von Aufgaben des »Frame-Fly«-Interrupts wird unsere Uhr eingehängt. Dieses Einhängen geschieht, indem wir einen 10 Byte langen Parameterblock schaffen, und dann die Routine »New Frame Fly« aufrufen, wobei die Register folgendermaßen belegt sind:

  • HL-Register: Adresse des Parameterblocks
  • DE-Register: Adresse der Routine, die alle 1/50 sec. angesprungen werden soll
  • B-Register: Einige Bit-Werte für Prioritäten u.a.
  • C-Register: Bei Programmen im RAM der Wert null
Nun wird unsere Routine »Uhr« also 50 mal pro Sekunde angesprungen. Man könnte nun zwar den eingebauten Timer auslesen, aber dieser 32-Bit-Wert läßt sich sehr schwer in eine ührzeit umrechnen. Daher zählen wir lieber unsere eigene Zeit: Bei jedem Durchlauf wird das erste Byte der Zeit um eins erniedrigt Sobald dieses Byte gleich null ist, wird es auf 50 gesetzt und die Sekunden werden um eins erhöht. Wenn das Byte nicht gleich null ist, dann wird das Programm für diesmal beendet. Beim Erhöhen der Sekunden, wie auch der Minuten und Stunden, ist eines zu beachten: Die Zeit steht in diesen Speicherstellen nicht binär, sondern BCD-codiert, d.h. es werden immer 4 Bits zusammengefaßt und sie zählen nur bis 10 und nicht bis 16. Dazu dient der Befehl »DAA«. Er paßt den Wert des Akkumulators nach einer Addition an diesen BCD-Code an. Wenn wir nun die Zeit mit »PEEK« auslesen wollen, so erhalten wir Werte, die völlig falsch sind. Wir können aber mit BASIC sehr leicht die richtigen Werte erhalten, und zwar mit HEX$(PEEK...). Das Hexadezimalsystem ist nämlich auch in 4-Bit-Breite unterteilt, wir erhalten also die beiden Bytehälften getrennt umgewandelt. Dieser String enthält dann auch keine A,B.....Fs, da Bytehälften über 9, beim BCD-Code nicht vorkommen. Doch nun zurück zur Uhr: Falls die Sekunden gerade gleich 60 (BCD-Code) sind, werden sie auf null gesetzt und die Minuten erhöht So geht das weiter, bis die Stunden auch angepaßt sind (das Datum wird nicht berechnet).

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«.
Man kann die Uhr per BASIC stellen und auslesen:

Stellen:
10 zeitanf=&A43C
20 POKE zeitanf+l,& Sekunden
30 POKE zeitanf+2,& minuten
40 POKE zeitanf+3,& stunden
50 END

Auslesen: 100 zei(anf=&A43C
110 PR1NT HEX$(PEEK(zeitanf+3));":";HEX $(PEEK(zeitanf+ 2));":"; HEX$(PEEK(zeitanf+1))

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.
Vor der Anzeige der Zeit wird in der Routine »Weck« getestet, ob die momentane Zeit mit der Weckzeit übereinstimmt. Wenn ja, wird die Klingel ausgelöst und ein String ausgegeben, der an den Grund des Weckens erinnern soll.

4. Teil: Bedienungskomfort durch Erweiterungsbefehle Nun wird die Bedienung der Uhr komfortabler, denn verschiedene Befehle werden über Erweiterungsbefehle direkt ausgeführt.
Ein Erweiterungsbefehl beginnt mit "I", das ist bei normaler Tastaturbelegung Shift Danach können beliebige Zeichen folgen. Diese Erweiterungsbefehle werden z.B. von dem Diskettenbetriebssystem AMSDOS benutzt, welches mit diesen Befehlen die Umschaltung von Disketten-zu Cassettenbetrieb ermöglicht und andere Funktionen zur Verfügung stellt. Der einzige reservierte Befehl, der auch ohne Diskettenbetrieb vorhanden ist, ist "I Basic". Er bewirkt eine Neuinitialisierung des Basic. Zur Einbindung dieser Erweiterungsbefehle dient die Routine "KL Logexf des Betriebssystems.

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$

CPCAI 8512

★ PUBLISHER: CPC Amstrad International
★ YEAR: 1985
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: LISTING
★ COLLECTION: CPC AMSTRAD INTERNATIONAL 1982
★ AUTHOR(S): ???
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» RSX-Clock-Interrupt    (CPC  Amstrad  International)    GERMANDATE: 2020-04-22
DL: 286
TYPE: ZIP
SiZE: 4Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » RSX - Software-Uhr (CPC Magazin)
» Applications » Digitaluhr (Computer Schau)
» Applications » Interrupt - Uhr (CPC Amstrad International)
» Applications » Analog-uhr (Computer Schau)
» Applications » CPC-Weltzeituhr (Computer Schau)
» Applications » Uhrzeit einstellen (CPC Magazin)
Je participe au site:
» Vous avez des infos personnel ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 535 millisecondes et consultée 1827 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.