Magic Disk 64

home to index to text: MD9106-KURSE-CIA_TEIL_1.txt
MD9106-KURSE-CIA_TEIL_1.hires.png
            CIA-Kurs (Teil 8)           
 "Die Geheimnisse des Secret Service..."

Hallo und Willkommen zum 8 . Teil unseres Kurses. Diesen Monat soll es weitergehen, mit der Ein-/ Ausgabe über die CIA-Bausteine. Wir werden eine Joystickabfrage programmieren und darüber hinaus die Funktionsweise von anderen Eingabegeräten einmal etwas genauer unter die Lupe nehmen.
Von der letzten Ausgabe her sollten Sie ja noch wissen, daß jede CIA über zwei Ein-/ Ausgabeports verfügt. Diese befinden sich jeweils in den ersten beiden Registern einer CIA. Desweiteren finden wir zu jedem Port ein Datenrichtungsregister ( Register 2 und 3 einer CIA), in denen wir jeweils festlegten, in welcher Richtung Daten verarbeitet werden sollen ( Eingabe, oder Ausgabe) . Dies soll uns nun für die folgenden Themen als Grund- lage dienen. Kommen wir zum ersten Kernthema, der Joystickabfrage:
Wahrscheinlich ist dies für Sie nichts neues mehr; Sie haben sicherlich schon einmal so etwas programmiert, jedoch werden Sie jetzt vielleicht auch die hardwaremäßigen Hintergründe verstehen.
Desweiteren will ich Ihnen hiermit auch die Joyports und ihre Verbindungen zu den CIAs und anderen Bausteinen innerhalb unseres " Brotkastens" erläutern.
Zunächst einmal können wir CIA2 für dieses Thema ausklammern, weil nämlich ausschließlich die CIA1 für die Bedienung der Joyports verantwortlich ist. An jedem der beiden Ports sind jeweils fünf Leitungen ( für die 4 Joystickrichtungen und den Feuerknopf) mit entsprechenden Portleitungen der CIA1 verbunden. Für den Joyport1 sind das die Leitungen PB0- PB4, für Joyport2 die Leitungen PA0- PA4 . Desweiteren sind pro Joyport auch noch weitere Signale zu finden, die ich Ihnen in der folgenden Grafik einmal aufführen möchte:
Hier Grafik 1 . . .
Die eigentliche Joystickabfrage gestaltet sich nun als sehr einfach. Wir müssen lediglich darauf achten, daß die Bits 0-4 eines Ports auf " Eingang" geschaltet sind. Da wir in der Regel nichts ausgeben, genügt es also, wenn wir einfach eine 0(= alle Pins auf " Eingang") in das entsprechende Datenrichtungsregister schreiben. Richtiger wäre natürlich der Wert 224(= bin.11100000), da wir damit nur die Bits 0-4 als Eingang setzen. Die Bits 5-7 sind Ausgang.
Wie SIE es nun letztendlich handhaben ist Ihre Sache, nur müssen Sie darauf achten, daß die Werte, die wir in den beiden Fällen lesen verschieden voneinander sind ( bei Datenrichtungsregister=0--> Bits 5-7 immer gesetzt, bei DDR =224, Bits 5-7 abhängig vom Wert im Datenregister) . Betrachtet man also 8- Bit-Werte beim Auslesen, sollte man sich darüber im Klaren sein, welchen Wert die drei unbenutzten Bits haben.
Nun brauchen Sie einfach nur einen Wert aus dem entsprechenden Datenregister auszulesen und müssen prüfen, ob, und wenn ja, welche der Bits gelöscht sind.
Sie erinnern sich ja vielleicht daran, daß die Signale der Datenports invertiert werden, was bedeutet, daß bei keiner Joystickbewegung alle Bits auf 1 sind ( keine Signale liegen an) . Wird der Joystick bewegt, so legt er ein Signal an die entsprechende Portleitung an.
Dieses erscheint für uns im Datenregister als ein 0- Bit!
Hier möchte ich Ihnen noch einmal eine Öbersicht über die Zuständigkeiten der einzelnen Bits geben, damit Sie auch wissen, welches Bit gelöscht ist, wenn der Joystick in welche Richtung gedrückt wird:

Richtung Joy1 Joy2                      
oben     PB0  PA0                       
unten    PB1  PA1                       
links    PB2  PA2                       
rechts   PB3  PA3                       
Knopf    PB4  PA4                       

Natürlich ist es auch möglich, mehrere Richtungen gleichzeitig abzufragen. Wird der Joystick z. B. nach rechts oben gedrückt, so sind die Portleitungen für " oben" und " rechts"( PB0 und PB3 für Joyport1, bzw. PA0 und PA3 für Joyport2) auf 1, d. h. die Bits 0 und 3 im jeweiligen Datenregister sind gelöscht! Achten Sie für solche Fälle also immer darauf, daß Ihre Joystickabfrage dynamisch ist und mehrere Richtungen auch erkennen kann. Ich möchte da mit gutem Beispiel vorangehen und habe Ihnen einmal eine Abfrage des Joyport1 als Beipspielprogramm programmiert. Sie finden es, wie immer, als Source-Code ( mit " . SRC"- Extension) und als ausführbares Maschinenprogramm ( mit " . OBJ"- Extension) unter dem Namen " JOYTEST" auf dieser MD.
Ich habe deshalb den Joyport1 gewählt, weil wir bei ihm das Datenrichtungsregister nicht zu ändern brauchen. Er läuft ja über Port B der CIA1) und wie wir aus dem letzten Kursteil wissen, ist dieser schon vom Betriebssystem her komplett auf " Eingang" geschaltet. Natürlich können Sie das auch bei Joyport2 tun ( erscheint in Port A der CIA1), jedoch müssen Sie dabei berücksichtigen, daß Sie ihn nach der Abfrage wieder auf " Ausgang" schalten, weil sonst die Tastatur nicht mehr ansprechbar ist!
Kommen wir nun aber zu dem Beipspielprogramm. Es steht ab $ c000(= dez.49152) und wird auch dort gestartet ( SYS49152) .

****************************************
start lda #01    Zeichenfarbe auf       
      sta 646    "weiß" setzen.         

loop1 lda #147 Code für " CLR" laden jsr $ ffd2 und ausgeben.

      lda $dc01  Datenport B laden.     
      lsr        "oben"-Bit in Carry.   
      bcs l1     Gesetzt, also nix      
                 "oben".                
      jsr pup    Gelöscht, also "oben"  
                 ausgeben.              
l1    lsr        "unten"-Bit in Carry.  
      bcs l2     Gesetzt, also nix "un- 
                 ten".                  
      jsr pdown  Gelöscht, also "unten" 
                 ausgeben.              

l2 lsr " links"- Bit in Carry.
bcs l3 Gesetzt, also nix

                 "links".               
      jsr pleft  Gelöscht, also "links" 
                 ausgeben.              
l3    lsr        "rechts"-Bit in Carry. 
      bcs l4     Gesetzt, also nix      
                 "rechts".              
      jsr prigh  Gelöscht, also "rechts"
                 ausgeben.              
l4    lsr        "Knopf"-Bit in Carry.  
      bcs l6     Gesetzt, kein Knopf    
                 gedrückt.              
      lda #02    Sonst, Farbe "rot" in  
                 Akku.                  
      bne l5     Unbedingt verzweigen...

l6 lda #00 Kein Knopf, also Farbe " schwarz" in Akku.
l5 sta $ d020 und Bildschirmfarbe sta $ d021 setzen.

      jmp loop1  Schleife wiederholen   
****************************************

JOYTEST tut nun nichts anderes, als eine Schleife zu durchlaufen, die zunächst den Bildschirm löscht, dann prüft, welche der Joystickrichtungen gedrückt sind und den dazu passenden Text " oben"," unten"," links" oder " rechts" ausgibt.
Zusätzlich berücksichtigt sie dabei, daß zwei Richtungen gleichzeitig aktiv sein können und gibt auch dementsprechende Texte aus (" oben links"," unten rechts", etc. . .) . Wird der Feuerknopf gedrückt, so erscheint der ganze Bildschirm rot.
Beachten Sie bitte, daß auch in diesem Fall alle 8 Joystickrichtungen abgefragt werden!
Die Funktionsweise der Routine ist so simpel, daß sie keiner großen Erklärung bedarf. Am Anfang der Schleife wird der Inhalt des Datenports B in den Akku geholt und nun Bit für Bit nach rechts herausgeschoben. Dabei gelangen nacheinander die fünf Joystick-Bits in das Carrybit, von wo aus man prüfen kann, ob die einzelnen Bits nun gesetzt, oder gelöscht sind. Ist eines der Bits gelöscht, so wird eine entsprechende Routine aufgerufen, die einen passenden Text ausgibt (" pup"," pdown"," pleft"," prigh") . Diese Routinen habe ich hier nicht aufgeführt, jedoch können Sie sie sich im Source-Code ja einmal anschauen.
Soviel zur Joystickabfrage. Wie Sie jedoch sicherlich in der Grafik von oben gesehen haben, gibt es noch weitere Anschlüsse am Joyport, über die man gewisse Geräte betreiben kann. Diese sind zum einen die Paddles und zum anderen der Light-Pen. Von beiden Eingabegeräten haben Sie bestimmt schon einmal gehört.
Ich möchte Ihnen nun kurz erläutern, wie sie Funktionieren und wie man sie abfragen kann.
Ein Paddle, ist ein Eingabegerät, bei dem prinzipiell nur zwei Werte übertragen werden, nämlich die Xund die Y-Position eines Grafikcursors. Sicherlich einnern Sie sich noch an diese kleinen " Magic-Tables", wie man sie als Kind oft gehabt hat. Mit Hilfe zweier Drehknöpfe konnte man da auf einen grauen Glasschirm malen, wobei man mit dem einen Knopf den Zeichenstift nach links und rechts bewegte, mit dem anderen nach oben und unten. So in etwa kann man sich auch Paddles vorstellen, wobei ein Paddle einem der beiden Drehknöpfe entspricht. Grundsätzlich können ( oder müssen) also ZWEI Paddles an EINEM Joyport angeschlossen werden, wobei diese aufgeteilt werden in Xund Y-Richtungspaddle ( Pin 9 und 5 am Joyport) . Wie kann man nun aber eine Position von nur einem Pin ablesen? Nun das ist ganz pfiffig: ein Paddle ist nämlich nichts anderes als ein Potentiometer, wie man es aus der Elektronik kennt. Also ein Stufenlos verstellbarer elektrischer Widerstand, der je nach Drehrichtung größer oder kleiner wird. Er wird über das Potentiometer in den Eingang an Pin 5 oder 9 eingeleitet. Diese Pins sind nun mit dem SID, dem Soundchip des 64 ers, verbunden, der über zwei Analog/ Digital-Wandler verfügt. Da Widerstand eine analoge Größe ist ( er kann unendlich fein aufgelöst werden), muß er zur Verarbeitung mit dem Rechner erst in einen digitalen Wert gewandelt werden, was über jene A/ D-Wandler geschieht. Sie haben je eine Auflösung von 8 Bit und legen den digitalen Wert in den Registern 25 und 26( Adressen 54297 und 54298) des SID ab.
Durch Auslesen der Werte dieser Register erhalten wir einen Digitalwert des Widerstandes des Potentiometers, wobei wir 256 verschiedene " Positionen" unterscheiden können. Zu beachten ist jedoch, daß die A/ D-Wandler des SID nur einen bestimmten Bereich abtasten können, nämlich von 200 Ohm ( Wert 0) bis 200000 Ohm (=200 Kiloohm, Wert 255) .
Zum Lightpen gibt es nicht viel zu sagen. Er kann ja ebenfalls am Joyport angeschlossen werden, wobei dies ausschließlich nur bei Joyport2 der Fall ist. Pin 6 dieses Ports, an dem normalerweise der Joystickfeuerknopf hängt, ist für den Lightpen zuständig. Zur Abfrage eines Lightpens sollte man aber gewisse Grundkenntnisse über den VIC und den Bildschirmaufbau ansich haben.
Ein Lightpen ist im Prinzip nichts anderes, als eine einfache und schlichte Fotozelle, wie man sie im Fachhandel für wenig Geld erstehen kann. Sie ist in der Lage, Licht, das auf sie einfällt zu registrieren und in diesem Fall einen Strom zu erzeugen. Dieser Strom nun wird an Pin 6 von Joyport2 angelegt und veranlaßt somit ein Löschen des Bits 4 vom Datenport A ( dasselbe Bit, wie für den Feuerknopf) . Dieses Ereignis tritt genau dann ein, wenn der Rasterstrahl des Mo- nitors ganz genau an der Stelle des Bildschirms vorbeifährt, an dem der Lightpen positioniert ist. In dem Fall muß nun ein pfiffiges Programm feststellen, an genau welcher Position sich der Rasterstrahl nun befindet um die Position des Lightpens zu ermitteln. Dabei kann einem der VIC helfen, der ein solches Lightpen-Signal als Interruptquelle vorgesehen hat, jedoch müssen Sie berücksichtigen, daß Sie über den VIC lediglich die aktuelle Rasterzeile, nicht aber die Rasterspalte abfragen können. Die muß man kleinlich berechnen, was nur geht, wenn man weiß, wie lange es dauert, bis der Rasterstrahl eine Zeile gezeichnet hat, und vor allen Dingen wann er damit begonnen hat. Da das alles sehr schnell geht (25 Mal pro Sekunde läuft der Rasterstrahl über den GESAMTEN Bildschirm), bekommt man meist sehr ungenaue Ergebnisse, was ein hinund herspringen des Grafikcursors bewirkt.
Obwohl einige Lightpens für den 64 er schon auf dem Markt waren, hat sich diese Eingabeart auf unserem Rechner wohl nie so richtig durchgesetzt. Schade eigentlich, aber wenn Sie wollen, können Sie es ja einmal versuchen, das nötige Wissen dazu sollten Sie jetzt ja haben.
Wie man mit Raster-Interrupts richtig umgeht, sollte Ihnen mein Kollege Ivo Herzeg, dessen Kurs vor diesem hier lief, hinreichend erklärt haben.
In diesem Sinne möchte ich mich nun wieder von Ihnen verabschieden. Nächsten Monat geht es, ab dann wieder in gewohnter Länge, um eine Mausabfrage. Ich habe Ihnen als Leckerbissen ein Programm vorbereitet, mit dem Sie eine AMIGA-Maus am 64 er anschließen und betreiben können.
Desweiteren wollen wir uns dann auch noch ein wenig mit dem Userport befassen. Bis dahin Servus, Ihr Uli Basters ( ub) age. Wie Sie jedoch sicherlich in der Grafik von oben gesehen haben, gibt es noch weitere Anschl

Valid HTML 4.0 Transitional Valid CSS!