Magic Disk 64

home to index to html: MD9106-KURSE-CIA_TEIL_1.html
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  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                                  
Valid HTML 4.0 Transitional Valid CSS!