CIA-Kurs:
"Die Geheimnisse des Secret-Service..."
(Teil 1)
----------------------------------------
1) Einleitung:
--------------
Herzlich willkommen zu unserer neuen
Kurs-Serie. Nachdem Sie mein Kollege IVO
HERZEG die letzten Monate ja eingehend
in die Matierie der Raster-Interrupts
eingeführt hat, will ich Ihnen nun ein
weiterführendes Thema anbieten: die
CIA-Bausteine des C 64.
Diese steuern (wie im Raster-IRQ-Kurs
schon angedeutet) die übrigen Interrupt-
funktionen unseres Rechners und sind für
den Kontakt mit der Außenwelt des 64ers
verantwortlich. Ohne sie könnten wir ihn
in keinster Weise bedienen - die Bedie-
nung der Tastatur und des Joysticks
oder die Datenspeicherung auf Massenme-
dien wie Kassette oder Diskette wäre gar
nicht möglich. Sie sehen also, daß in
den nächsten Monaten einige ganz inte-
ressante Themen auf Sie zukommen werden.
Ich möchte mich zunächst einmal um die
Interruptprgrammierung kümmern und in
fortführenden Folgen Anleitungen zur
Bedienung der Ein-/Ausgabeeinheiten des
64ers geben. Wir werden dann den Joy-
stick einmal genauer unter die Lupe neh-
men und auch den Anschluß einer Maus
durchführen, ganz abgesehen von den
vielfältigen Möglichkeiten die uns der
Userport bietet, um Harware-
Erweiterungen zu bedienen.
Im übrigen sollte ich noch darauf hin-
weisen, daß Sie zum vollen Verständnis
dieses Kurses doch schon tiefergreifende
Kenntnisse von der Programmierung in
Maschinensprache haben sollten, sowie in
der Handhabung eines Maschinensprache-
Assemblers und eines Speichermonitors.
Nichts desto trotz können auch BASIC-
Programmierer einiges hier lernen, was
eventuell auch von BASIC aus genutzt
werden kann, jedoch mit Sicherheit nicht
in der komplexen und vielfältigen Art
und Weise, wie dies von Maschinensprache
aus möglich ist.
2) Die Hardware:
----------------
Zunächst jedoch einmal eine kleine Be-
schreibung, mit was für Bausteinen wir
es überhaupt zu tun haben. Die beiden
CIAs des C64 sind zwei unscheinbare 40-
polige Microchips mit vielfältigen Mö-
glichkeiten. Man könnte sie quasi als
"Manager" unseres Computersystems be-
zeichnen, die die Verbindung zwischen
den einzelnen Ein- und Ausgabeeinheiten
herstellen und deren Zusammenwirken erst
richtig möglich machen.
Beide CIAs sind baugleich und können
somit also problemlos miteinander ver-
tauscht werden (was oft bei einer Prü-
fung auf Funktionsstörungen schon zu
einer eindeutigen Analyse führen kann -
trotzdem sei von einer Nachahmung ohne
Vorkenntnisse abgeraten). Sie tragen die
Bezeichnung MOS 6526 und befinden sich
in der Ecke links oben auf der Mutter-
platine unseres Rechners.
Soviel zur harwaremäßigen Einordnung
dieser kleinen Helfer, jedoch möchten
wir uns hier ja mit der softwaremäßigen
Bedienung befassen, weshalb ich nun also
zu den für uns intressanten Fähigkeiten
komme.
Die CIAs beinhalten jeweils:
* Zwei 16-Bit-Timer, mit denen man her-
vorragend besonders zeitkritische Pro-
gramm-Probleme lösen kann.
* Eine 24-Stunden Echtzeituhr, die die
Zeit im Gegensatz zur interruptge-
steuerten BASIC-Uhr TI$ extrem genau
geht.
* Zwei freiprogrammierbare Datenports,
mit denen auch komplexe Datenübertra-
gungen über den Userport möglich wer-
den.
Wir unterscheiden die beiden CIAs im
Folgenden mit CIA1 und CIA2. Sie werden
vom Betriebssystem für unterschiedliche
Aufgaben genutzt, die nun ebenfalls be-
schrieben werden sollen:
* CIA1 ist mit der Tastatur und den bei-
den Joystickports verbunden und ist
somit für die Eingabe über Tastatur,
Joysticks, Maus oder Paddles zustän-
dig.
Desweiteren wird von ihm der Systemin-
terrupt gesesteuert, der zyklische
Aufgaben, wie das Empfangen von Ta-
stencodes oder das Weiterzählen der
BASIC-Uhr TI$ erledigt (dazu später
mehr).
* CIA2 ist für die komplette Daten Ein-/
Ausgabe zuständig. Er steuert den
IEC-Bus, mit dem bis zu 4 Disketten-
laufwerke und maximal 2 Drucker ange-
steuert werden können. Desweiteren ist
er am Kasettenport angeschlossen und
seine Datenleitungen sind am Userport
herausgeführt, wodurch auch PC-
Standard-Schnittstellen wie RS-232
(seriell) oder CENTRONICS (parallel)
softwaremäßig emuliert werden können.
Das Wichtigste, was wir zur Interrupt-
programmierung wissen müssen ist, daß
der CIA1 mit der IRQ-Leitung und der
CIA2 mit der NMI-Leitung des Prozessors
verbunden ist. Je nach Aufgabengebiet
einer Interruptroutine müssen wir also
unterscheiden, von welchem CIA die In-
terrupts ausgelöst werden. In der Spei-
cherkonfiguation des 64ers sind die bei-
den Chips getrennt an zwei verschiedenen
Basisadressen eingebunden. Ihre Register
sind jedoch aufgrund der Baugleichheit
für die gleichen Funktionen zuständig,
weshalb wir auch nur EINE Registertabel-
le benötigen. Es kommt halt nur drauf
an, welchen der beiden Zwillinge wir
ansprechen wollen. Die Basisadresse für
CIA1 ist $DC00 (=dez. 56320), für CIA2
$DD00 (=dez. 56576). Wollen wir also
Timer A (dazu später) von CIA1 mit dem
Grundwert 16384 initialisieren, so müs-
sen wir die Register 4 und 5 ab $DC00
($DC04 und $DC05) mit dem LO/HI-Byte von
16384 beschreiben, bei Timer A von CIA2
ebenfalls Register 4 und 5, jedoch dies-
mal ab Basisadresse $DD00 ($DD04 und
$DD05).
3) Was ist ein Interrupt?
-------------------------
Nun zu einigen grundlegenden Informatio-
nen zu Interrupts. Ich benuzte dieses
Wort die ganze Zeit schon, ohne zu erkl-
ären was es überhaupt bedeutet (obwohl
Sie sich darin vielleicht schon durch
den Raster-IRQ-Kurs auskennen).
Interrupt ist englisch und heißt wört-
lich übersetzt "Unterbrechung". Der Pro-
zessor des C64 besitzt, wie jeder andere
Prozessor auch, sogenannte Interrupt-
Eingänge. Beim Prozessortyp 6510 (wie er
in unserem Rechner Verwendung findet)
sind dies insgesamt drei Leitungen, wo-
mit er zwischen drei verschiedenen In-
terrupts (rein hardwaremäßig - softwa-
remäßig sind es sogar noch mehr) unter-
scheiden kann. Diese sind IRQ, NMI und
RESET. Diese drei Leitungen können nun
extern, von anderen Bausteinen, wie zum
Beispiel (und vor allem) von den CIAs
angesprochen werden um dem Prozessor das
Eintreten eines bestimmten Ereignisses
zu signalisieren. Der Prozessor bemerkt
dies und kann nun durch ganz bestimmte
Maßnahmen auf die Bearbeitung eines
Ereignisses eingehen.
Der Clou an der Sache ist, daß der Pro-
zessor so nicht ständig auf das Eintre-
ten eines Ereignisses warten muß und
deshalb beispielsweise nicht ständig in
einer Endlosschleife prüfen muß, ob in
irgendeiner Speicherzelle irgendwann
einmal ein bestimmter Wert steht, son-
dern er bekommt diese Arbeit von den
CIAs abgenommen, die ihn schlichtweg nur
noch darauf aufmerksam machen, daß er
nun seine Achtung etwas anderem schenken
sollte - dem Interruptereignis. So kann
er also auch gerade mit ganz anderen
Dingen beschäftigt sein - nämlich mit
der Abarbeitung eines Programmes - und
trotzdem zwischendurch ganz gezielten
Aufgaben nachgehen.
In der Praxis sieht das so aus, daß er
seine momentane Arbeit - das Hauptpro-
gramm - dann UNTERBRICHT und in ein Job-
programm zur Bearbeitung des Interrupts
springt.
Ich möchte hier zur Verdeutlichung ein-
mal ein Beispiel aus dem Alltag bringen.
Ich, Uli Basters, sitze hier an meinem
Rechner und bin gerade dabei, den ersten
Teil des CIA-Kurses zu schreiben. Plötz-
lich klingelt das Telefon. Bevor ich
aufstehe um zum Telefon zu gehen spei-
chere ich schnell noch das bisher ge-
schriebene ab und merke mir vor, daß ich
nach dem Telefonat unbedingt weiter-
schreiben werde. Am anderen Ende ist
mein Kollege Ralf Zwanziger, der mir den
nächsten Redaktionsschluß durchgibt.
Nachdem ich aufgehängt habe erinnere ich
mich an mein Vorhaben, gehe wieder
zurück zum Rechner, lade den Text wieder
ein und setze meine Arbeit fort.
Diesen Vorgang kann man sehr gut mit den
Tätigkeiten des Prozessors beim Eintre-
ten eines Interrupts vergleichen. Eine
Interruptleitung signalisiert ihm, daß
ein Interruptereignis eingetreten ist
(das Telefon klingelt). Schnell merkt er
sich noch die wichtigsten Daten, nämlich
den Inhalt der Prozessorregister (Akku,
X- und Y-Register), den Prozessorstatus
(Speicherung des Textes) und den Inhalt
des Programmzählers (das Vormerken wei-
terzuarbeiten). Danach springt er auf
eine Jobroutine, die er für das Eintref-
fen eines Interrupts parat hat und ar-
beitet diese dann ab (ich führe ein Te-
lefonat). Ist er am Ende dieser Routine
angelangt, so holt er sich Programmzäh-
ler, Status- und Prozessorregister wie-
der ins Gedächtnis zurück (Erinnerung
weiterzuarbeiten und wiedereinladen des
Textes) und setzt seine alte Arbeit wie-
der fort.
Diesen ganzen Vorgang erledigt er mit
einer derart affenartigen Geschwindig-
keit, daß wir meinen er würde beides
gleichzeitig tun. Das wäre dann auch der
nächste Vorteil der ganzen Geschichte.
Durch Interrupts ist man also in der
Lage mehrere Dinge, ganz unabhängig vo-
neinander, scheinbar gleichzeitig zu
erledigen - so auch das Betriebssystem,
das, während es in der Hauptschleife auf
Tasteneingaben wartet, über einen Inter-
rupt den Cursor weiterhin blinken läßt.
Die Möglichkeiten hier sind sehr
vielfältig, wie wir noch bemerken wer-
den.
4) Der Timer-Interrupt:
-----------------------
Soviel zu den Vorgängen innerhalb unse-
res Rechners. Nun möchte ich mich ein
wenig mit den Unterschieden zwischen den
drei Interruptarten beschäftigen.
Wir haben also insgesamt drei verschie-
dene Unterbrechungen. Eine davon, näm-
lich der IRQ wird Ihnen vielleicht, wenn
auch unbewußt, vielleicht schon nur zu
gut bekannt sein. Er wird vom CIA1 aus-
gelöst und vom Betriebssystem für inter-
ne, cyklische Aufgaben verwendet. Des-
halb ist er auch ein gutes Beispiel für
uns um in dieser Materie einzusteigen,
da uns das Betriebssystem schon eine
koplette IRQ-Routine zur Verfügung
stellt - den System-IRQ.
Der System-IRQ nutzt die einfachste und
zugleich auch vielseitigste Funktion des
CIAs um Interrupts auszulösen - den Ti-
merinterrupt. Bevor ich mich jetzt je-
doch in unverständlichen Erklärungen
verliere erst einmal eine Registerbe-
schreibung eines CIA-Registers. Hierzu
habe ich Ihnen eine Grafik vorbereitet,
die eine Kurzbeschreibung der Register
liefert; ausgedruckt sollte sie Ihnen
immer parat liegen, da wir sie in Zu-
kunft häufiger benutzen werden.