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.