Magic Disk 64

home to index to text: MD9104-KURSE-CIA-KURS_TEIL_6-2.txt

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. . .)

Valid HTML 4.0 Transitional Valid CSS!