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