Magic Disk 64

home to index to html: MD9104-KURSE-CIA-KURS_TEIL_6-2.html
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...) 
Valid HTML 4.0 Transitional Valid CSS!