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