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