Zweiter Teil:
Die CIA-Uhren sind zwar echte 24 h-Uhren, jedoch zählen sie nicht, wie
wir es gewohnt sind von 0 bis 23 Uhr, sondern sie arbeiten nach dem amerikanischen Zeitsystem, das eine Unterscheidung von Vorund Nachmittag
berücksichtigt und nur die Stunden
von 0 bis 12 kennt. Sie haben das
sicher schon einmal bei einer Digitaluhr beobachtet - sobalt es 12 Uhr
mittags ist springt die Anzeige auf
" PM" um. Das steht für " post meridian" und bedeutet nichts anderes als
" nach Mittag" . Ebenso erscheint auf
dem Display ein " AM" für " ante meridian"(=" vor Mittag") wenn die Uhr
von 11 :59 PM auf 12 Uhr nachts umschaltet. Dieses Verfahren wird ebenso von den CIA-Uhren beutzt. Das 7 .
Bit des Stundenregisters gibt an, ob
es Vor-, oder Nachmittag ist. Ist es
gelöscht, so haben wir " AM", ist es gesetzt, so ist " PM" . Dies müssen wir
also ebenfalls bei der Programmierung
berücksichtigen - sowohl beim Lesen, als auch beim Schreiben. CLOCK ist
übrigens so ausgelegt, daß es beide
Arten der Zeitdarstellung berücksichtigt. Dazu später mehr.
3) Bei den CIA-Uhren ist mir noch eine
kleine Besonderheit aufgefallen, von
der ich nicht weiß, ob sie absichtlich ist und einem Standard entspricht, oder ob sie eine Fehlfunktion darstellt.
Es ist nämlich möglich, wie sollte es
auch anders sein, die Stunde 0 Uhr
( also 12 Uhr nachts) in das Stundenregister einzutragen. Die CIA liefert
dabei keine Fehler sondern übernimmt
die Zeit wie sie ist. Sie zählt nun
bis 12 Uhr PM und springt dann auf 1 Uhr PM (=13 Uhr) um. Soweit nichts
besonderes. Der Witz ist nun, daß
nachts um 11 :59 PM nicht auf 0 :00 AM
geschaltet wird, sondern auf 12 :00
Uhr AM. Hier scheint also ein kleiner
Fehler zu sein ( vielleicht begründet
durch den internen Aufbau der CIAs), oder haben Sie schon einmal eine Uhr
gesehen, die diese Zeit anzeigt? Ich
nicht. Deshalb ist CLOCK auch so programmiert, daß es bei 12 Uhr AM
nicht 12 :00 Uhr sondern 0 :00 anzeigt.
Dies nur als Hinweis.
So. Nun wissen Sie also, wie man die
aktuelle Uhrzeit in den 4 Uhrregistern
einer CIA unterbringt, und wie man sie
dort wieder herausholt. Das ist jedoch
noch nicht alles, was man zu einer korrekten Uhr-Programmierung braucht. Wir
müssen nämlich vor dem Einstellen der
Uhr noch 2 Dinge beachten.
1) Zunächst müssen wir der CIA, die unsere Uhr steuert, mitteilen, mit welcher Netzfrequenz der 64 er arbeitet, in dem sie drinsteckt. Dies liegt
daran, daß in Amerika eine andere Stromnorm benutzt wird, als hier bei
uns in Europa. Dort beträgt die Frequenz des Wechselstroms aus der
Steckdose nämlich 60 Hertz und nicht
etwa 50, wie das bei uns üblich ist.
Aus diesem Grund kann man der CIA
auch mitteilen, welche der beiden
Frequenzen nun benutzt wird, damit
sie in beiden Stromnetzen richtig
arbeitet kann. Diese Funktion legt
Bit 7 des CRA-Registers ( Reg.14) fest. Steht es auf 1, so beträgt der
Echtzeituhrtrigger 50 Hz, steht es
auf 0, so ist er 60 Hz. Weil wir hier
in Europa eine Netzfrequenz von 50 Hz
haben, müssen wir auch dementsprechend das 7 . Bit von CRA setzen!
2) Beim Einstellen der Uhrzeit verlangt
die CIA noch eine weitere Information
von uns. Wie ich anfangs ja schon
erwähnte, kann der Echtzeituhr auch
eine Alarmzeit mitgeteilt werden, zu
der ein Interrupt auftreten soll.
Diese Alarmzeit wird nun aber in die- selben Register geschrieben, wie die
Uhrzeit, also ebenfalls in die Register 8 bis 11 . Bit 7 von CRB ( Reg.
15) ist nun dafür zuständig zu unterscheiden, ob gerade die Alarm-, oder
die Uhrzeit gesetzt wird. Steht es
auf 1, so setzen wir die Alarmzeit, steht es auf 0 so wird die Uhrzeit
geschrieben. Dies müssen wir also
berücksichtigen, wenn wir eine der
beiden Zeiten einstellen wollen.
Dies wäre alles, was Sie zur Programmierung der Echtzeituhr wissen müssen. Lassen Sie mich nun zum praktischen Beispiel schreiten und Ihnen die Funktionsweise von CLOCK erklären.
Hierzu wollen wir uns erst einmal überlegen, wie CLOCK überhaupt arbeiten
soll:
1) Zunächst soll CLOCK in den Systeminterrupt eingebunden werden, von wo aus es ständig die Ausgabe aktualisiert.
2) CLOCK soll eine Alarmfunktion beinhalten, die bei erreichen der Alarmzeit einen Piepton ausgibt.
3) Es soll möglich sein zwischen der
24 hund der AM/ PM-Darstellung der
Uhrzeit zu wählen. Hierzu habe ich
mit die Speicherzelle 3 als Modusregister ausgesucht, die normalerweise
vom Basic-Befehl USR benutzt wird. Da
dieser Befehl jedoch wenig Anwendung
findet, kann man bedenkenlos diese
Speicherzelle für eigene Zwecke nutzen. Wenn sie 0 ist, so soll die
AM/ PM-Darstellung verwendet werden.
Ist sie ungleich 0, so wird die 24 h-Darstellung gewünscht.
Egal, in welchem Modus CLOCK laufen
soll, die Eingabe der Uhrzeit soll
immer in der 24 h-Darstellung geschehen. Diese wird in der Form " HHMMSS" angegeben.
4) Zur optischen Aufmachung habe ich die Ziffern 0 bis 9 als Sprites in den
Spriteblöcken 33 bis 42( inklusive) untergebracht. Desweiteren befinden
sich den den Blöcken 43 und 44 je ein
Sprite für die AMund PM-Anzeige.
Die Uhrzeit wird durch die Sprites
des 64 ers auf dem Bildschirm angezeigt.
Kommen wir nun also zum Source-Code
Listing von CLOCK. Zunächst wollen wir
uns einmal die IRQ-Initialierung anschauen:
======================================== init lda #$81 Uhr-Trigger auf 50Hz und Timer A starten sta cia1+14 in CRA festlegen lda #<(txt1) LO-Byte Text1 ldy #>(txt1) HI-Byte Text1 ldx #$00 Wert für CRA (=Uhrzeit setzen) jsr setit Unterroutine für Zeit einlesen und setzen aufrufen lda #<(txt2) LO-Byte Text2 ldy #>(txt2) HI-Byte Text2 ldx #$80 Wert für CRA (=Alarm setzen) jsr setit Alarmzeit Lesen und Setzen sei IRQs sperren ldx #<(newirq) ..und die neue ldy #>(newirq) IRQ-Routine stx $0314 im IRQ-Pointer sty $0315 setzen ldx #15 Kopiert Liste mit loop1 lda xtab,x Sprite Koordina- sta v,x ten in die ent- dex sprechenden VIC- bpl loop1 register. ldx #07 Setzt die Farben lda #01 für alle loop2 sta v+39,x 7 Sprites dex auf bpl loop2 "Weiß" lda #$85 Alarm- und Timer- IRQs erlauben sta cia1+13 und im ICR fest- legen lda #15 Hüllkurve für Pie ton... sta sid+5 ...festlegen. lda #$c0 Frequenz von Piepton sta sid+1 festlegen. ldx #<(end+1) CLOCK-Endadr. LO ldy #>(end+1) CLOCK-Endadr. HI stx $2b und BASIC-Anfang sty $2c ...setzen jsr $a642 "NEW" ausführen cli IRQs wieder frei- rts geben und Ende. ========================================
Dies wäre also die Initialisierungsroutine für CLOCK. Als Erstes wird der Wert
$81(= bin.10000001) in CRA geschrieben.
Damit setzen wir die Echtzeituhrtriggerung auf 50 Hz ( Bit 7=1) . Gleichzeitig
müssen wir aufpassen, daß wir nicht versehens Timer A anhalten, der ja den System- IRQ steuert. Deshalb muß also auch
Bit 0 gesetzt sein, was für " Timer A
starten" steht. Er läuft zwar bereits, jedoch würden wir ihn mit einer 0 anhalten. Die 1 ändert also nichts an dem
momentanen Zustand von Timer A, sie verhindert nur eine Änderung.
( Noch weiter geht' s im dritten Teil. . .)