Die PIA

Hauptkategorie: 8-Bitter
Erstellt: 16 Februar 2014
Zugriffe: 1861




                                   D I E    P I A
                                   --------------

            Die  PIA wird im Atari hauptsächlich als  Peripheriebaustein
            für  die  Joystickeingänge verwendet.  Zudem steuern  einige
            Ausgänge der PIA die MMU des Atari 600/800XL.  Bei den alten
            Atari-Geräten werden diese Ausgänge für den 3.  und 4.  Joy-
            stickanschluß  verwendet.  Ansonsten übernehmen weitere  An-
            schlüsse der PIA die Steuerung des seriellen Ports.


            Die  PIA ist im Gegensatz zu Bausteinen wie dem  ANTIC  oder
            dem   GTIA  kein  Spezialbaustein,  sondern  ein   Standard-
            peripheriebaustein  (6520  oder 6820) der  65XX- bzw.  68XX-
            Reihe.

            Sie  verfügt  über zwei unabhängige 8-bit breite Ports  (mit
            den Leitungen PA0-7 und PB0-7), bei denen sich jedes einzel-
            ne Bit über sogenannte Datenrichtungsregister als  Ein- oder
            Ausgang  programmieren läßt.  Für jeden der Ports sind  zwei
            Kontrollein- bzw.  -ausgänge  vorhanden (CA1,  CA2,  CB1 und
            CB2).  Die beiden "Hälften" der PIA beeinflußen sich  grund-
            sätzlich nicht und sind, abgesehen von kleinen Unterschieden
            in  den elektrischen Eigenschaften der Ports (die jedoch nur
            für Schaltungsentwickler wichtig sind) und Unterschieden  in
            der Behandlung von CA2/CB2,  identisch. Über die Kontrollka-
            näle  ist  es möglich,  Interrupts der CPU  auszulösen.  Die
            Kontrollkanäle  sind ursprünglich für das sogenannte  "Hand-
            shaking",  das heißt für die Synchronisation der  Datenüber-
            tragung der PIA-Ports gedacht. Da sie aber universell ausge-
            legt  sind,  konnten  sie von Atari auch für  andere  Zwecke
            verwendet  werden.  Die  Ports  der PIA werden nur  für  die
            Joysticks und die MMU,  die kein Handshaking benötigen,  be-
            nutzt.




            Es folgt eine Tabelle der Belegung der PIA-Portleitungen:
            (Die  Angaben von PIN-Nummern beziehen sich jeweils auf  die
            Steckverbinder und nicht auf die PIA-PINs)

            PORT A :

            PA0      Joystick-Port 1,  vorwärts     (PIN 1)
            PA1      Joystick-Port 1,  rückwärts    (PIN 2)
            PA2      Joystick-Port 1,  links        (PIN 3)
            PA3      Joystick-Port 1,  rechts       (PIN 4)
            PA4      Joystick-Port 2,  vorwärts     (PIN 1)
            PA5      Joystick-Port 2,  rückwärts    (PIN 2)
            PA6      Joystick-Port 2,  links        (PIN 3)
            PA7      Joystick-Port 2,  rechts       (PIN 4)

            CA1      SIO-Anschluß "Proceed"         (PIN 9)
            CA2      SIO-Anschluß "Motor-Kontrolle" (PIN 8)

            PORT B :

            PB0      MMU  (ROM/RAM, RAM im Betriebssystem-Bereich)
            PB1      MMU  (BasEn, Basic einschalten)
            PB2-6    nicht verwendet
            PB7      MMU  (TEST, Selbsttestprogramm einblenden)

            CB1      SIO-Anschluß "Interrupt" (PIN 13)
            CB2      SIO-Anschluß "Kommando" (PIN 7)


            Bei  den alten Atari-Geräten ist Port B mit Joystick 3 und 4
            wie Port A mit Joystick 1 und 2 belegt.


            Die  PIA  belegt im System mindestens 4 Bytes.  Daß  sie  im
            Atari  erheblich mehr belegt,  liegt an der  unvollständigen
            Adressdekodierung.  Jede PIA-Hälfte hat also zwei  Adressen.
            Diese  nennen sich PORTA,  PORTACNTL,  PORTB und  PORTBCNTL.
            PORTACNTL  und  PORTBCNTL steuern die  Funktionen  der  PIA.
            Außerdem wird durch sie entschieden,  ob man in die Adressen
            PORTA  und  PORTB zu übertragende Daten schreibt  oder  über
            diese Adressen die Datenrichtungsregister programmiert.

            Jedes Bit in einem der Datenrichtungsregister  repräsentiert
            ein Bit des jeweiligen Ports.  Ist das entsprechende Bit des
            Datenrichtungsregisters  "0",  so fungiert das Bit des Ports

            als  Eingang.  Dementsprechend dient das selbe Bit als  Aus-
            gang,  wenn das dazugehörige Bit des Datenrichtungsregisters
            high ist.


            Es  folgt die Beschreibung der Funktion der  einzelnen  Bits
            von Register PORTACNTL:

            Bit 0 und 1    CA1 Steuerung
            Bit 2          wenn  "0"  dann wird über Adresse  PORTA  das
                           Datenrichtungsregister A angesprochen
            Bit 3 bis 5    CA2 Steuerung
            Bit 6          IRQA1
                           beim Lesen des Registers PORTACNTL ist dieses
                           Bit "1", wenn zuvor die Interruptbedingung an
                           CA2 vorlag. Beim Lesen des Portregisters wird
                           dieses Bit auf "0" zurückgesetzt.
            Bit 7          IRQA2
                           wie Bit 6,  aber anstelle von CA2 wird dieses
                           Bit von CA1 gesteuert.


            Die   Steuerung  von  CA1  erfolgt,   wie  aus  der  Tabelle
            ersichtlich, durch Bit 0 und Bit 1 von PORTACNTL:


            Bit 1 Bit 0    Beschreibung

             0     0       Bei  der fallenden Flanke von CA1 wird Bit  7
                           des PORTACNTL "1". Der Interruptausgang A der
                           PIA bleibt auf logisch "1".
             0     1       Bei  der fallenden Flanke von CA1 wird Bit  7
                           des PORTACNTL "1". Der Interruptausgang A der
                           PIA  geht  auf logisch "0" und fordert  somit
                           einen IRQ von der CPU.
             1     0       Bei der steigenden Flanke von CA1 wird Bit  7
                           des PORTACNTL "1". Der Interruptausgang A der
                           PIA bleibt auf logisch "1".
             1     1       Bei  der steigenden Flanke von CA1 wird Bit 7
                           des PORTACNTL "1". der Interruptausgang A der
                           PIA  geht auf logisch "0" und  fordert  somit

                           einen IRQ von der CPU.
            CA2 Steuerung:

            Ist  Bit  5 des PORTACNTL low,  so dient CA2  ebenfalls  als
            Interrupteingang. Dabei gilt die gleiche Tabelle wie für die
            Steuerung von CA1. Statt Bit 0 und Bit 1 kontrollieren Bit 3
            und  4 des PORTACNTL-Registers die Funktion.  In die Tabelle
            ist statt Bit 7 des PORTACNTL, Bit 6 einzusetzen.
            Ist Bit 5 des PORTACNTL high,  so dient CA2 als Ausgang.  Es
            gilt dabei folgende Tabelle:


            Bit 4 Bit 3    Beschreibung

             0     0       CA2  wird bei der ersten negativen Flanke des
                           Systemtaktes  nach  einer  Leseoperation  von
                           PORTA  low und wieder high,  wenn Bit  7  des
                           PORTACNTL durch CA1 gesetzt wird.
             0     1       CA2 wird bei der ersten negativen Flanke  des
                           Systemtaktes  nach  einer  Leseoperation  von
                           PORTA low und bei der ersten negativen Flanke
                           des Systemtaktes, bei der die PIA nicht ange-
                           sprochen wird, wieder high.
             1     0       CA2  bleibt low  solange  dieses  Bitmuster
                           anliegt.
             1     1       CA2  bleibt high solange  dieses  Bitmuster
                           anliegt.



            Die  Steuerung  des Port B ist im Aufbau  gleich   der   des
            Port A.  Alle Tabellen mit Ausnahme der letzten können über-
            nommen  werden.  Jedoch muß PORTBCNTL anstelle von PORTACNTL
            betrachtet werden.  Statt IRQA muß es IRQB heißen, statt CA1
            und CA2 entsprechend CB1 und CB2 und statt des Zugriffs  auf
            das  Datenrichtungsregister A steuert Bit 2 den Zugriff  auf
            das Datenrichtungsregister B.  Interrupts,  die von CB1 bzw.
            CB2  ausgehen,  werden der CPU über Interruptausgang B über-
            mittelt.


            Wenn  Bit 5 des PORTBCNTL high ist,  dient CB2 als  Ausgang.
            Dabei gilt folgende Tabelle:


            Bit 4 Bit 3    Beschreibung

             0     0       CB2  wird bei der ersten positiven Flanke des
                           Systemtaktes nach einer Schreiboperation  auf
                           PORTB  low.  Wird  Bit 7 von außen durch  CB1
                           gesetzt, wird CB2 wieder high.
             0     1       CB2 wird bei der ersten positiven Flanke  des
                           Systemtaktes  nach einer Schreiboperation auf
                           PORTB low, und bei der ersten positiven Flan-
                           ke  des Systemtaktes,  bei der die PIA  nicht
                           angesprochen wird, wieder high.
             1     0       CB2   bleibt  low, solange  dieses  Bitmuster
                           anliegt.
             1     1       CB2  bleibt  high, solange  dieses  Bitmuster
                           anliegt.



            Auf den ersten Blick erscheinen die  Steuerungsmöglichkeiten
            der PIA sicherlich unübersichtlich.  Bei Überlegungen sollte
            man jedoch beachten, daß Port A ursprünglich als Eingang und
            Port B als Ausgang gedacht war. Bei genauerem Betrachten der
            Steuermöglichkeiten wird der Sinn der diversen Möglichkeiten
            der  Kontrollkanäle CA1,  CA2,  CB1 und  CB2  deutlich.  Sie
            ermöglichen  eine Verbindung einer PIA mit anderen  Periphe-
            riebausteinen,  bei  der  jeweils die CPU ein Signal  erhält
            (Interrupt),  wenn die ausgegebenen Daten vom Empfänger ver-
            arbeitet sind oder neue Daten zum Einlesen durch den Prozes-
            sor zur Verfügung stehen.  Die Interrupts lassen sich  zudem
            abschalten.  Die  CPU kann trotzdem abfragen,  ob die Unter-
            brechungsbedingung erfüllt ist. Sie kann auch beim Auftreten
            eines Interrupts die Herkunft des selben durch Abfragen  von
            Bit  6  und  7 von PORTACNTL  bzw.  PORTBCNTL  lokalisieren.
            Außerdem  lassen  sich die Kontrollkanäle direkt  vom  Peri-
            pheriegerät beeinflußen,  dies geschieht natürlich erheblich
            schneller als eine Steuerung der Kontrollkanäle von der  CPU

            aus.  Damit  läßt sich die  Datenübertragungsrate  erheblich
            erhöhen.  Mit  diesen Möglichkeiten der PIA läßt  sich,  wie
            schon erwähnt,  ein automatischer "Handshake" zwischen Peri-
            pheriegerät und Hauptgerät aufbauen.


            Im  Atari-System  wird die PIA  nicht  zur  Datenübertragung
            benutzt.  Bei  der Programmierung der PIA ist darauf zu ach-
            ten, andere PIA-Anwendungen nicht zu beeinflussen. Bei Fehl-
            programmierungen  der PIA ist es zum Beispiel  möglich,  daß
            der serielle Port gestört wird, da die Steuerung des seriel-
            len  Ports über die PIA erfolgt.  Eine weitere Gefahr stellt
            die  MMU dar.  Bei falscher Programmierung der PIA wird  der
            Rechner umweigerlich durch die falsche MMU-Steuerung abstür-
            zen. Auch hier ist besondere Vorsicht geboten.



            Die PIA-Register befinden sich an folgenden Adressen:

            PORTA          54016     $d300
            PORTB          54017     $d301
            PORTACNTL      54018     $d302
            PORTBCNTL      54019     $d303


            Wer die PIA bereits aus anderen Mikrocomputersystemen kennt,
            wird  sich  über die Reihenfolge der  PIA-Register  wundern.
            Die normale "Reihenfolge" der Register ist bekanntlich

                 PORTA     PORTACNTL     PORTB     PORTBCNTL

            Bei den Atari-Geräten existiert jedoch die oben beschriebene
            Reihenfolge,  da die beiden Adressleitungen für die Register
            der PIA vertauscht sind.



            Um die Stellung der Joysticks festzustellen,  muß der Inhalt
            der Register PORTA und PORTB gelesen werden.  Die Auswertung
            der  Register  ist  jedoch gerade für  Anfänger  nicht  ganz

            einfach.  Daher erstellt das Betriebssystem während der Ver-
            tikalsynchronisation Speicherstellen,  die die Stellung  der
            Joysticks  repräsentieren  (diese  Register  sind  letztlich
            Schattenregister der Register PORTA und PORTB) :

            Joystick1      632       $278
            Joystick2      633       $279
            (Joystick3)    634       $27A      nur bei Atari 400/800 !
            (Joystick4)    635       $27B      nur bei Atari 400/800 !


            Diese  Speicherstellen enthalten die Stellung der  Joysticks
            nach folgendem Muster:
                                               10        6
                                          11        15        7
                                               9         5