CIA-Kurs (Teil 8) "Die Geheimnisse des Secret Service..." ----------------------------------------
Hallo und Willkommen zum 8.Teil unseres Kurses. Diesen Monat soll es weiterge- hen, mit der Ein-/Ausgabe über die CIA- Bausteine. Wir werden eine Joystickab- frage programmieren und darüber hinaus die Funktionsweise von anderen Eingabe- gerä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 befin- den sich jeweils in den ersten beiden Registern einer CIA. Desweiteren finden wir zu jedem Port ein Datenrichtungsre- gister (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 Kern- thema, 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 inner- halb unseres "Brotkastens" erläutern. Zunächst einmal können wir CIA2 für die- ses Thema ausklammern, weil nämlich aus- schließlich die CIA1 für die Bedienung der Joyports verantwortlich ist. An je- dem 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 gestal- tet sich nun als sehr einfach. Wir müs- sen lediglich darauf achten, daß die Bits 0-4 eines Ports auf "Eingang" ge- schaltet sind. Da wir in der Regel nichts ausgeben, genügt es also, wenn wir einfach eine 0 (=alle Pins auf "Ein- gang") in das entsprechende Datenrich- tungsregister schreiben. Richtiger wäre natürlich der Wert 224 (=bin.11100000), da wir damit nur die Bits 0-4 als Ein- gang 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 vonei- nander 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 inver- tiert werden, was bedeutet, daß bei kei- ner 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 Datenregi- ster 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 jeweili- gen 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 Beipspielpro- gramm programmiert. Sie finden es, wie immer, als Source-Code (mit ".SRC"- Extension) und als ausführbares Maschi- nenprogramm (mit ".OBJ"-Extension) unter dem Namen "JOYTEST" auf dieser MD. Ich habe deshalb den Joyport1 gewählt, weil wir bei ihm das Datenrichtungsregi- ster 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ön- nen Sie das auch bei Joyport2 tun (er- scheint in Port A der CIA1), jedoch müs- sen Sie dabei berücksichtigen, daß Sie ihn nach der Abfrage wieder auf "Aus- gang" schalten, weil sonst die Tastatur nicht mehr ansprechbar ist! Kommen wir nun aber zu dem Beipspielpro- gramm. Es steht ab $c000 (=dez. 49152) und wird auch dort gestartet (SYS 49152).
**************************************** 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, wel- che der Joystickrichtungen gedrückt sind und den dazu passenden Text "oben", "un- ten", "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 ge- holt und nun Bit für Bit nach rechts herausgeschoben. Dabei gelangen nachei- nander 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 je- doch sicherlich in der Grafik von oben gesehen haben, gibt es noch weitere Anschlüsse am Joyport, über die man ge- wisse 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 abfra- gen kann. Ein Paddle, ist ein Eingabegerät, bei dem prinzipiell nur zwei Werte übertra- gen werden, nämlich die X- und 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 Glas- schirm 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 Padd- le einem der beiden Drehknöpfe ent- spricht. Grundsätzlich können (oder müs- sen) also ZWEI Paddles an EINEM Joyport angeschlossen werden, wobei diese aufge- teilt werden in X- und 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 Potentio- meter in den Eingang an Pin 5 oder 9 eingeleitet. Diese Pins sind nun mit dem SID, dem Soundchip des 64ers, 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 digi- talen 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 Wi- derstandes des Potentiometers, wobei wir 256 verschiedene "Positionen" unter- scheiden können. Zu beachten ist jedoch, daß die A/D-Wandler des SID nur einen bestimmten Bereich abtasten können, näm- lich von 200 Ohm (Wert 0) bis 200000 Ohm (=200 Kiloohm, Wert 255). Zum Lightpen gibt es nicht viel zu sa- gen. Er kann ja ebenfalls am Joyport angeschlossen werden, wobei dies aus- schließlich nur bei Joyport2 der Fall ist. Pin 6 dieses Ports, an dem norma- lerweise der Joystickfeuerknopf hängt, ist für den Lightpen zuständig. Zur Ab- frage eines Lightpens sollte man aber gewisse Grundkenntnisse über den VIC und den Bildschirmaufbau ansich haben. Ein Lightpen ist im Prinzip nichts ande- res, 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 ve- ranlaß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 feststel- len, an genau welcher Position sich der Rasterstrahl nun befindet um die Posi- tion des Lightpens zu ermitteln. Dabei kann einem der VIC helfen, der ein sol- ches 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 Din- gen wann er damit begonnen hat. Da das alles sehr schnell geht (25 Mal pro Se- kunde läuft der Rasterstrahl über den GESAMTEN Bildschirm), bekommt man meist sehr ungenaue Ergebnisse, was ein hin- und herspringen des Grafikcursors be- wirkt. Obwohl einige Lightpens für den 64er schon auf dem Markt waren, hat sich die- se Eingabeart auf unserem Rechner wohl nie so richtig durchgesetzt. Schade ei- gentlich, 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 wie- der von Ihnen verabschieden. Nächsten Monat geht es, ab dann wieder in gewohn- ter Länge, um eine Mausabfrage. Ich habe Ihnen als Leckerbissen ein Programm vor- bereitet, mit dem Sie eine AMIGA-Maus am 64er anschließen und betreiben können. Desweiteren wollen wir uns dann auch noch ein wenig mit dem Userport befas- sen. Bis dahin Servus, Ihr Uli Basters (ub) age. Wie Sie je- doch sicherlich in der Grafik von oben gesehen haben, gibt es noch weitere Anschl