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 Interruptfunktionen unseres Rechners und sind für
den Kontakt mit der Außenwelt des 64 ers
verantwortlich. Ohne sie könnten wir ihn
in keinster Weise bedienen - die Bedienung der Tastatur und des Joysticks oder die Datenspeicherung auf Massenmedien wie Kassette oder Diskette wäre gar nicht möglich. Sie sehen also, daß in
den nächsten Monaten einige ganz interessante 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
64 ers geben. Wir werden dann den Joystick einmal genauer unter die Lupe nehmen 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 hinweisen, 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 Beschreibung, 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 bezeichnen, die die Verbindung zwischen
den einzelnen Einund Ausgabeeinheiten herstellen und deren Zusammenwirken erst
richtig möglich machen.
Beide CIAs sind baugleich und können
somit also problemlos miteinander vertauscht 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 Mutterplatine 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 hervorragend besonders zeitkritische Programm- Probleme lösen kann.
* Eine 24- Stunden Echtzeituhr, die die
Zeit im Gegensatz zur interruptgesteuerten BASIC-Uhr TI$ extrem genau
geht.
* Zwei freiprogrammierbare Datenports, mit denen auch komplexe Datenübertra- gungen über den Userport möglich werden.
Wir unterscheiden die beiden CIAs im
Folgenden mit CIA1 und CIA2 . Sie werden
vom Betriebssystem für unterschiedliche
Aufgaben genutzt, die nun ebenfalls beschrieben werden sollen:
* CIA1 ist mit der Tastatur und den beiden Joystickports verbunden und ist
somit für die Eingabe über Tastatur, Joysticks, Maus oder Paddles zuständig.
Desweiteren wird von ihm der Systeminterrupt gesesteuert, der zyklische
Aufgaben, wie das Empfangen von Tastencodes 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 Diskettenlaufwerke und maximal 2 Drucker angesteuert 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 Interruptprogrammierung 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 Interrupts ausgelöst werden. In der Speicherkonfiguation des 64 ers sind die beiden 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 Registertabelle 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üssen 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 diesmal ab Basisadresse $ DD00($ DD04 und
$ DD05) .
3) Was ist ein Interrupt?
Nun zu einigen grundlegenden Informationen 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örtlich übersetzt " Unterbrechung" . Der Prozessor 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, womit er zwischen drei verschiedenen Interrupts ( rein hardwaremäßig - softwaremäßig sind es sogar noch mehr) unterscheiden 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 Prozessor so nicht ständig auf das Eintreten 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 Hauptprogramm - dann UNTERBRICHT und in ein Jobprogramm zur Bearbeitung des Interrupts
springt.
Ich möchte hier zur Verdeutlichung einmal 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ötzlich klingelt das Telefon. Bevor ich
aufstehe um zum Telefon zu gehen speichere ich schnell noch das bisher geschriebene ab und merke mir vor, daß ich nach dem Telefonat unbedingt weiterschreiben 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 Eintreten 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, Xund Y-Register), den Prozessorstatus
( Speicherung des Textes) und den Inhalt
des Programmzählers ( das Vormerken weiterzuarbeiten) . Danach springt er auf
eine Jobroutine, die er für das Eintreffen eines Interrupts parat hat und arbeitet diese dann ab ( ich führe ein Telefonat) . Ist er am Ende dieser Routine angelangt, so holt er sich Programmzähler, Statusund Prozessorregister wieder ins Gedächtnis zurück ( Erinnerung
weiterzuarbeiten und wiedereinladen des
Textes) und setzt seine alte Arbeit wieder fort.
Diesen ganzen Vorgang erledigt er mit
einer derart affenartigen Geschwindigkeit, 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 voneinander, scheinbar gleichzeitig zu
erledigen - so auch das Betriebssystem, das, während es in der Hauptschleife auf
Tasteneingaben wartet, über einen Interrupt den Cursor weiterhin blinken läßt.
Die Möglichkeiten hier sind sehr
vielfältig, wie wir noch bemerken werden.
4) Der Timer-Interrupt: -----------------------
Soviel zu den Vorgängen innerhalb unseres Rechners. Nun möchte ich mich ein
wenig mit den Unterschieden zwischen den
drei Interruptarten beschäftigen.
Wir haben also insgesamt drei verschiedene Unterbrechungen. Eine davon, nämlich der IRQ wird Ihnen vielleicht, wenn
auch unbewußt, vielleicht schon nur zu
gut bekannt sein. Er wird vom CIA1 ausgelöst und vom Betriebssystem für interne, cyklische Aufgaben verwendet. Deshalb 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 Timerinterrupt. Bevor ich mich jetzt jedoch 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 Zukunft häufiger benutzen werden.