Zweiter Teil: Die CIA-Uhren sind zwar echte 24h- Uhren, jedoch zählen sie nicht, wie wir es gewohnt sind von 0 bis 23 Uhr, sondern sie arbeiten nach dem ameri- kanischen Zeitsystem, das eine Unter- scheidung von Vor- und Nachmittag berücksichtigt und nur die Stunden von 0 bis 12 kennt. Sie haben das sicher schon einmal bei einer Digi- taluhr beobachtet - sobalt es 12 Uhr mittags ist springt die Anzeige auf "PM" um. Das steht für "post meri- dian" und bedeutet nichts anderes als "nach Mittag". Ebenso erscheint auf dem Display ein "AM" für "ante meri- dian" (="vor Mittag") wenn die Uhr von 11:59 PM auf 12 Uhr nachts um- schaltet. Dieses Verfahren wird eben- so 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ücksich- tigt. Dazu später mehr. 3) Bei den CIA-Uhren ist mir noch eine kleine Besonderheit aufgefallen, von der ich nicht weiß, ob sie absicht- lich ist und einem Standard ent- spricht, oder ob sie eine Fehlfunk- tion darstellt. Es ist nämlich möglich, wie sollte es auch anders sein, die Stunde 0 Uhr (also 12 Uhr nachts) in das Stunden- register 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 pro- grammiert, 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 kor- rekten 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 un- sere Uhr steuert, mitteilen, mit wel- cher Netzfrequenz der 64er 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 Fre- quenz 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 dementspre- chend 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 Regi- ster 8 bis 11. Bit 7 von CRB (Reg. 15) ist nun dafür zuständig zu unter- scheiden, 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 Programmie- rung der Echtzeituhr wissen müssen. Las- sen Sie mich nun zum praktischen Bei- spiel schreiten und Ihnen die Funktions- weise von CLOCK erklären. Hierzu wollen wir uns erst einmal über- legen, wie CLOCK überhaupt arbeiten soll: 1) Zunächst soll CLOCK in den Systemin- terrupt eingebunden werden, von wo aus es ständig die Ausgabe aktuali- siert. 2) CLOCK soll eine Alarmfunktion bein- halten, die bei erreichen der Alarm- zeit einen Piepton ausgibt. 3) Es soll möglich sein zwischen der 24h- und der AM/PM-Darstellung der Uhrzeit zu wählen. Hierzu habe ich mit die Speicherzelle 3 als Modusre- gister 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 nut- zen. Wenn sie 0 ist, so soll die AM/PM-Darstellung verwendet werden. Ist sie ungleich 0, so wird die 24h- Darstellung gewünscht. Egal, in welchem Modus CLOCK laufen soll, die Eingabe der Uhrzeit soll immer in der 24h-Darstellung gesche- hen. 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 AM- und PM-Anzeige. Die Uhrzeit wird durch die Sprites des 64ers auf dem Bildschirm ange- zeigt. Kommen wir nun also zum Source-Code Listing von CLOCK. Zunächst wollen wir uns einmal die IRQ-Initialierung an- schauen:
======================================== 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 Initialisierungsrou- tine für CLOCK. Als Erstes wird der Wert $81 (=bin. 10000001) in CRA geschrieben. Damit setzen wir die Echtzeituhrtrigge- rung auf 50 Hz (Bit 7=1). Gleichzeitig müssen wir aufpassen, daß wir nicht ver- sehens Timer A anhalten, der ja den Sy- stem-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 anhal- ten. Die 1 ändert also nichts an dem momentanen Zustand von Timer A, sie ver- hindert nur eine Änderung. (Noch weiter geht's im dritten Teil...)