D E R P O K E Y ------------------ 1) ALLGEMEINES 2) TONERZEUGUNG 3) TASTATURABFRAGE 4) PADDLESTEUERUNG 5) SERIELLE EIN-/AUSGABE Der POTentiometer and KEYboard-Controller-Chip ist der drit- te Spezialbaustein im Atari 600XL/800XL. Er übernimmt zum Einen fast die gesamte Tonsteuerung, zweitens ist er für die Kommunikation mit extern anzuschließenden Geräten zuständig und als letztes übernimmt er das Einlesen der Paddle-Kanäle. Als Verbindung zur CPU stehen ihm die 8 Datenleitungen, Takt- Schreib-/Leseleitung, eine Interrupt- und vier Adreß- leitungen zur Verfügung. Über eine Hardware-Resetleitung verfügt der POKEY nicht. Mit seinen vier Adreßleitungen können im POKEY 16 verschie- dene Daten- beziehungsweise Steuer-Register angesprochen werden. Diese 16 Register teilen sich hauptsächlich in 9 Tonre- gister, 4 Übertragungsregister, ein nicht belegtes und ein Interruptverarbeitungsregister auf. ******************** * * * * * TONERZEUGUNG * * ------------ * * * ******************** Der POKEY besitzt die Möglichkeit, maximal vier Tonkanäle gleichzeitig oder in Kombination miteinander zu verwalten. Jeder Ton, den wir hören können, setzt sich aus mehreren Komponenten zusammen. Da ist zum Einen die Tonhöhe, die technisch als Frequenz bezeichnet wird und in Hz (Hertz, nach dem bekannten Physiker Heinrich Hertz) gemessen wird. Ein Hz ist nun eine komplette Schwingung pro Sekunde, wobei 'komplett' bedeutet, daß bei immer wiederkehrenden Schwing- ungsbildern man sich einen beliebigen Punkt der Schwingung sucht und dann so lange wartet, bis genau dieser Punkt wieder erreicht wird. Der Bereich zwischen den beiden gefun- denen Punkten ist dann eine komplette Schwingung. Hat man nun 1000 Schwingungen pro Sekunde, so besitzt das Signal eine Frequenz von 1000Hz, oder auch 1kHz. Je größer die Frequenz des Signals ist, umso höher empfinden wir den Ton, beziehungsweise das Geräusch. Eine weiteres Charakteristikum einer Schwingung ist die Schwingungsform. Als Extrema wären hier z.B. die reine Sinus-Schwingung oder, als Gegenstück dazu, die reine Recht- eck-Schwingung zu nennen. Dies sind jedoch Sonderfälle, die sich zwar heutzutage mit elektronischen Mitteln recht sicher und gut herstellen lassen, die jedoch wegen ihrer Ausge- prägtheit im Klang derart 'nervend' sind, daß sie sich kaum jemand länger anhören kann. Wer das nicht glaubt, sollte sich einmal den 440Hz-Normton (Kammerton a) am Telefon fünf Minuten lang anhören. Alle Geräusche und Töne, die wir heutzutage um uns haben, sind Mischformen unterschiedlichster Signalformen. Aus der jeweiligen Signalzusammensetzung können wir, in Verbindung mit den sogenannten Hüllkurven, unterschiedliche Signalquel- len recht sicher voneinander unterscheiden. So dürfte eine Verwechselung zwischen einem Waldhorn und einem Klavier einigermaßen selten vorkommen. Die Hüllkurve beschreibt nun, wie sich die Lautstärke des jeweiligen Tones im Verhältnis zur Zeit verändert. Da gibt es z.B. Signale, die sehr schnell laut sind, um dann langsam und gleichmäßig abzuklingen (Klavier), die Violine dagegen erreicht wesentlich langsamer Ihr Lautstärkemaximum. Als letzte wesentliche Eigenschaft jedes Tones verarbeiten wir mehr oder weniger unbewußt den Frequenzbereich, in dem sich das Signalgemisch ungefähr befindet. Es hört sich ein- fach anders an, wenn man Musik direkt aus der HiFi-Stereoan- lage hört, als wenn man dies über das Telefon tut. Nicht unbedingt wegen eventueller Störungen und Knack-Geräusche, sondern wegen des enorm eingeschränkten übertragenen Fre- quenzbereichs. Der ist von der Post so bestimmt, daß die übertragenen Töne hauptsächlich die Tonhöhen durchlassen, die zur Übermittlung von Sprache wesentlich sind. Im POKEY sind nun vier Register enthalten, die nichts weiter tun, als ein vorgegebenes Taktsignal mit bestimmter Fre- quenz durch einen bestimmten, ebenfalls vorzugebenden Wert zu teilen. Dadurch entsteht dann eben ein niedrigerer Ton. Da das jedoch zu primitiv wäre, und sich damit nach dem oben gesagten keine vernünftigen Klänge erzeugen ließen, gibt es nun noch weitere Möglichkeiten. Als erstes kann man z.B. zwei solcher Zähler aneinanderhängen, das heißt also, den Ausgang des einen Zählers mit dem Eingang des zweiten zu verbinden. So kann Zähler 2 an Zähler 1 angehängt werden, genauso wie Zähler 4 an Zähler 3. Dieses Anhängen hat fol- genden Zweck: Durch die Größe der einzelnen Zählregister von 8 Bit ergibt sich ein mögliches Teilerverhältnis im Bereich von 1 bis 256 (intern wird auf den Registerwert eine %1 addiert). Hängt man nun zwei Zähler aneinander, so erhält man ein mögliches Verhältnis von 1 bis 65536, da ja nun 16 Bit zur Verfügung stehen. Es gibt somit die Möglichkeit, vier 8bit-Kanäle oder einen 16bit-Kanal und zwei 8bit-Kanäle oder, als letztes, zwei 16bit-Kanäle zu betreiben. Alles dies wird über entsprechen- de Satusbits festgelegt. Die eigentlichen Teilerverhältniswerte werden in die ent- sprechenden Register AUDIFREQ1 bis AUDIFREQ4 geschrieben. Als Takt kann für jedes der Register ein 64kHz-, 15kHz- oder, und das gilt nur für Kanal 1 und 3, ein 1,77MHz-Takt gewählt werden. Je höher der Takt gewählt wird, desto höher ist bei gleichem Teilerverhältnis das Ausgangssignal. Aus der Kombination der Takteingangsfrequenzen und der Tei- lerverhältnisse lassen sich nun sämtliche Frequenzbereiche von 0 bis 1,77/2 MHz= 887kHz erreichen. Die letzte Teilung durch den Faktor zwei ist immer gegeben und hat den Zweck, immer nur symmetrische Signale auszugeben. Hat man ein Digi- talsignal als letztes durch den Faktor zwei geteilt, so ist dieses Signal genauso lange 'an' wie 'aus', also zeitlich symmetrisch. Diese Bedingung ist wesentlich, denn ein unsym- metrisches Signal hört sich völlig anders an als ein sym- metrisches, so daß sich bei Veränderung von Teilerwerten nicht nur die Frequenz, sondern auch die Signalform, und somit der Klang ändern würde, wenn nicht zum Schluß das Signal immer in ein symmetrisches abgeändert würde. Neben der Frequenz läßt sich auch noch die Art und Form eventueller Verzerrung einstellen. Dazu wird das normale Ausgangssignal, das von den Zählregistern geliefert wird, logisch verknüpft mit zyklisch auftretenden 'Störungen'. Diese Störungen werden über sogenannte Schieberegister er- zeugt, die wie eine lange Röhre funktionieren. Schiebt man in das eine Ende der Röhre Signale hinein, kommt irgendwann einmal am anderen Ende eben dieses Signal heraus. Nimmt man dieses Signal dann wieder, um es am vorderen Ende wieder hineinzutun, hat man einen Zyklus, der endlos weitergeht. Um nun nicht einen völlig 'langweiligen', einmaligen Rhythmus herauszubekommen, wendet man noch einen weiteren Trick an: Die Röhre wird an einigen Stellen 'angebohrt', und die an der Stelle anliegenden Signale zusammen mit dem End-Signal auf den Röhreneingang gelegt. Dadurch ist immer noch sicher- gestellt, daß es sich bei dem ganzen Vorgang um einen zyk- lischen handelt, aber dessen Wiederholrate ist wesentlich geringer. Es sind nun im POKEY drei dieser rückgekoppelten Schiebere- gister, die als Polynom-Zähler bezeichnet werden, vorhanden. Es gibt einen 4 Bit langen, einen mit 5 Bit und einen, der umschaltbar entweder 17 oder 9 Bit Länge aufweist. Die Frequenz wurde, wie schon erwähnt, durch die Werte in den Frequenzregistern AUDIFREQ1 bis AUDIFREQ4 festgelegt. Die Verzerrung und die 16 stufige Lautstärke werden hingegen über die Kontrollregister AUDICNTL1 bis AUDICNTL4 program- miert. Die einzelnen Bits dieser Kontrollregister bedeuten: Bit Bedeutung ------------------------------------------------- 0 Diese vier Bit sind 1 zuständig für die Lautstärke. 2 Es sind Werte zwischen $00 und 3 $0f möglich (%0000 bis %1111). 4 VOLUME_ONLY 5 Diese drei Bit werden zur 6 Auswahl einer der sechs Verzer- 7 rungsmöglichkeiten benutzt (s.Tab). Tabelle für die Wertigkeiten der Bits 5,6 und 7 der Register AUDICNTLn: Bit 7 6 5 Signalmischung ----------------------------------------------------------- 0 0 0 Das vom Zählregister stammende Sig- nal wird zuerst mit dem 5bit-Poly- nom, dann mit dem 17bit-Polynom verknüpft, bevor es auf die letzte Teilerstufe durch den Faktor zwei geschickt wird. 0 x 1 Es findet nur eine Verknüpfung mit dem 5bit-Polynom statt vor der letzten Division. Bit 7 6 5 Signalmischung (Fortsetzung) ----------------------------------------------------------- 0 1 0 Das vom Zählregister stammende Sig- nal wird zuerst mit dem 5bit-Poly- nom, dann mit dem 4bit-Polynom verknüpft, bevor es auf die letzte Teilerstufe durch den Faktor zwei geschickt wird. 1 0 0 Die Ausgangsfrequenz wird mit dem Signal des 17bit-Polynoms verknüpft und dieses Signal auf die letzte Teilerstufe geschickt. 1 x 1 Diese 2 Kombinationen ergeben einen reinen Ton, da keinerlei Verknüp- fung des Ausgangssignals mit einem der Polynome geschieht, sondern nur die letzte Justage-Division. 1 1 0 Es erfolgt nur eine Verknüpfung der Ausgangsfrequenz mit dem vier bit breiten Polynom. Danach wird das Ergebnis, genau wie alle anderen, noch einmal durch den Wert zwei geteilt. Das 'x' in der Tabelle bedeutet, daß hier '0' oder '1' stehen darf. Das VOLUME_ONLY-Bit aus jedem der vier AUDICNTLn-Register schaltet die gesamte interne Zähl-, Verzerrungs- und Ver- knüpfungsmaschinerie aus und bestimmt, daß als Ausgangssig- nal genau die der Lautstärke entsprechende Spannung ausge- sendet werden soll. Ist also VOLUME_ONLY gesetzt und die Lautstärke auf 16 (volle Lautstärke), so wird die im Fernse- her/Monitor befindliche Lautsprechermembran so weit wie möglich aus ihrer Ruheposition herausgelenkt. Setzt man dann die Lautstärke wieder auf Null zurück, so fällt die Membran ebenfalls wieder in ihre Ruheposition zurück, es ergibt sich ein Knacken im Lautsprecher. Die Aufgabe dieser Zusatzeinrichtung ist natürlich nicht, nur ein Knackgeräusch zu erzeugen. Mit dieser Methode unter- liegt der Programmierer annähernd keiner Beschränkung bezüg- lich Signalform und Frequenz, da jede einzelne Membranbewe- gung des Lautsprechers programmiert werden kann. Es ist jedoch bei allzu schnellen Amplitudenänderungen (Amplitude= Höhe des Ausschlags bei einer Schwingung) darauf zu achten, daß zwar der Atari diese Signale herausgeben kann, harte Kurven jedoch durch die dann folgende Modulation/Demodula- tion im Fernseher erheblich abgerundet werden. Dies dürfte jedoch im Normalfall keine Einschränkung darstellen, da ein Fernseher heutzutage oft schon HiFi-Qualitäten besitzt. Im Großen und Ganzen jedoch kann gesagt werden, daß zumin- dest mit entsprechendem Softwareaufwand der Atari ohne Zu- satzgeräte alle gewünschten Akustikeffekte erzeugen kann. Man denke da z.B. an Softwarepakete, die schon die alten 400/800 ohne zusätzliche Hardware haben sprechen lassen. Die Sprache war sogar mittelmäßig verständlich. Neben diesen vier, auf jeden Kanal einzeln bezogenen Re- gistern existiert noch ein weiteres, für die Tonerzeugung wesentliches Register: AUDIOCOM. Diese Adresse beinhaltet die folgenden 8 Steuerbits: BIT Erläuterung ------------------------------------------------- 0 Schaltet den Haupttakt für die vier Frequenzregister von 64kHz auf 15kHz zurück, wenn es gesetzt wird. 1 Ist dieses Bit gesetzt, wird in den Ausgang von Kanal 2 ein Hochtonfilter eingesetzt, dessen Characteristik von Kanal 4 bestimmt wird. BIT Erläuterung (Fortsetzung) ------------------------------------------------- 2 In den Ausgang von Kanal 1 wird ein von Kanal 2 gesteuertes Hochtonfilter einge- fügt. 3 Durch Setzen dieses Bits wird Kanal 4 an Kanal 3 angehängt, so daß ein 16bit- Register entsteht. 4 Ist dieses Bit gesetzt, wird Kanal 2 an Kanal 1 gehängt. 5 Dieses Bit bewirkt, daß Kanal 3 mit einer Grundfrequenz von ca. 1,77 MHz betrieben wird. 6 Das gleiche wie bei Bit 5 für Kanal 1. 7 Beim Setzen dieses Bits wird das 17bit- Polynom in ein 9bit langes Polynom ver- wandelt. Als allgemeine Berechnungsgrundlage für das Verhältnis von Ein- zu Ausgangsfrequenz kann die Gleichung Ausgangsfrequenz = Eingangsfrequenz / 2 ( AUDIFREQn + Off) verwendet werden, wobei Off den Wert 4 erhält, wenn es sich bei dem Teiler um einen 8bit-Teiler handelt. Ist es dagegen ein 16bit-Teiler, muß Off aus technischen Gründen mit 7 angesetzt werden. Neben den Tonerzeugungsaufgaben besitzen diese Zähler noch eine weitere Aufgabe. Wenn einer der Zähler 1, 2 oder 4 auf Null zurückgezählt hat, wird automatisch vom POKEY ein Interrupt ausgelöst. Die Zähler können also genauso gut als Timerbausteine fungieren. Um alle Frequenzregister auf die Werte zu setzen, die Pro- grammiert wurden (vor allem sinnvoll beim Betrieb als Timer!), wird einfach irgend ein Wert in Adresse STIMER geschrieben. Als 'Abfallprodukt' der Polynomzähler entsteht in Register RANDOM eine 8bit-Zufallszahl, die dort entsprechend ausgele- sen werden kann. Sie besteht aus den höchsten 8 Bit des 17- /9-bit Polynomzählers. Abschließend zu diesem Thema folgt noch eine Tabelle, aus der die Teilerverhältnisse der Frequenzregister bei bestimm- ten Notenwerten hervorgehen. Dazu sind folgende Werte vor- auszusetzen: AUDIOCOM = $00 ; also nichts 'Besonderes' AUDICNTLn = $Ax ; x ist die Lautstärke von 0..15 Mit den genannten Daten, die nur ein Beispiel sein sollen, ergeben sich die auf der umseitig gedruckten Tabelle folgen- de Werte für AUDIOFREQn: Es lassen sich aber auch praktisch alle anderen Frequenzen und somit Notenwerte mit dem Atari erreichen. Dies wird auch in Vergleichen zwischen den einzelnen Mikrocomputern oft falsch dargestellt. Der Atari verfügt nicht nur über 3 1/2 Oktaven Frequenzumfang. Die höchsten erzeugbaren Frequenzen liegen weit über der höchsten wahrnehmbaren Frequenz. Auch die tiefste erzeugbare Frequenz ist nicht mehr hörbar. Note AUDIFREQn Hexadezimal Dezimal ----------------------------------------------------------- C (tiefes) $f3 243 Cis oder Des $e6 230 D $d9 217 Dis oder Es $cc 204 E $c1 193 F $b6 182 Fis oder Ges $ad 173 G $a2 162 Gis oder As $99 153 A $90 144 Ais oder B $88 136 H $80 128 c (mittleres) $79 121 cis oder des $72 114 d $6c 108 dis oder es $66 102 e $60 96 f $5b 91 fis oder ges $55 85 g $51 81 gis oder as $4c 76 a $48 72 ais oder b $44 68 h $40 64 c' $3c 60 cis' oder des' $39 57 d' $35 53 dis' oder es' $32 50 e' $2f 47 f' $2d 45 fis' oder ges' $2a 42 g' $28 40 gis' oder as' $25 37 a' $23 35 ais' oder b' $21 33 h' $1f 31 c'' $1d 29 *********************** * * * * * TASTATURABFRAGE * * --------------- * * * *********************** Wird irgend eine Taste auf der Tastatur des 600XL/800XL gedrückt, die nicht eine der seitlich montierten Spezial- tasten oder SHIFT oder CONTROL ist, wird ein Interrupt vom POKEY ausgelöst, der dem Betriebssystem Mitteilung von dem Tastendruck machen soll. Von der entsprechenden Interrupt- routine wird dann der Tastaturkode aus Register KBCODE aus- gelesen und für die weitere Verarbeitung im Vertical Blank Interrupt gesichert. Eine Ausnahme hiervon stellt die BREAK-Taste dar: Wird sie gedrückt, so erfährt das Bertiebssystem davon durch eine andere Statusmeldung des POKEY und reagiert dann ent- sprechend durch die Break-Routine darauf. Ist es jedoch eine der normalen Tasten, wird das Drücken vom POKEY dadurch bemerkt, daß er ständig eine Matrix abfragt (pollt), in deren Kreuzungspunkte die einzelnen Tastenschal- ter liegen. Ist nun ein solcher Taster geschlossen, bemerkt der POKEY dies und erkennt an seinen Registern, welcher Schnittpunkt, also welcher Schalter das ist. Darüberhinaus besitzt er zwei Signalleitungen, die ihm mit- teilen, wenn die SHIFT- oder CONTROL-Taste gedrückt ist. Alleine das Drücken dieser beiden Tasten löst noch keinen Interrupt aus, verändert jedoch bei einem richtigen Tasten- druck dessen Kode. Es sind maximal 64 Tasten im System erlaubt. Sie belegen somit die Kodes 0 bis 63 ($00 bis $3f). Ist die SHIFT-Taste gedrückt, verschiebt sich der generierte Kode um 64, also auf den Bereich 64 bis 127 ($40 bis $7f). Im Falle der gedrückten CONTROL-Taste würde sich der Kode dann nochmal um 64 verschieben, also um insgesamt 128 auf den Bereich von 128 bis 191 ($80 bis $bf). Werden SHIFT- und CONTROL-Taste gleichzeitig gedrückt, hat die CONTROL-Taste Vorrang, so daß also insgesamt 192 Tastenkodes entstehen können. Um nun diesen Matrix-Nummern einen sinnvollen ATASCII-Kode zuweisen zu können, wird eine Tabelle benutzt. Der Anfang der Tabelle liegt ab (KEYDEFPTR), also im Initialisierungs- zustand ab Adresse KEYDEF. Die 192 Byte große Tabelle be- sitzt die folgenden Einträge, bei denen nur diejenige Funk- tion eingetragen ist, die sich ohne SHIFT- oder CONTROL- Taste ergibt: 0 1 2 3 4 5 6 7 8 9 a b c d e f ---------------------------------------------- $00: L J ; /1//2/ K + * O P U /C/ I - = $10: V C /3//4/ B X Z 4 3 6 /E/ 5 2 1 $20: , /S/ . N M / /A/ R E Y /T/ T W Q $30: 9 0 7 /B/ 8 F H D /P/ G S A /C/ ist die RETURN-Taste /S/ ist die Leertaste /A/ ist die ATARI-Logo-Taste /E/ ist die ESCape-Taste /T/ ist die TABulator-Taste /B/ ist die BackSpace-Taste /P/ ist die CAPS-Taste /1/ bis /4/ sind die zwar nicht hardwaremäßig, aber dennoch softwaremäßig vorhandenen Funktionstasten des 1200XL F1 bis F4. Ob die SHIFT-Taste gedrückt ist, besagt Bit 3 von SKSTAT. Ist das Bit Null, ist die SHIFT-Taste gedrückt. Eine genauere Beschreibung des Registers SKSTAT erfolgt noch später. *********************** * * * * * PADDLESTEUERUNG * * --------------- * * * *********************** Paddles sind Eingabegeräte, die nicht nur digitale Signale liefern wie z.B. Joysticks, sondern die einen analogen Wert liefern, in diesem speziellen Fall handelt es sich um einen Widerstandswert. Da der Atari bekanntlich nur digitale Signale richtig verar- beiten kann, stellt sich für ihn, genauer: Für den POKEY, das Problem, aus diesem Widerstandswert eine Zahl zu machen. Diesen Vorgang nennt man schlichtweg Analog/Digital-Wand- lung, was sich englischsprachig abgekürzt A/D-C schreibt, wobei das 'C' für Converting steht. Dieser gesamte Komplex der Analog/Digital-Wandlung und der artverwandten Digital/Analog-Wandlung ist bis heute die große Schwachstelle an jedem Computersystem. Nicht, daß die Techniker nicht wüßten, nach welchem Verfahren man die Wand- lung vornehmen soll. Da gibt es einige wenige, die sich als sinnvoll in den letzten Jahren herauskristallisiert haben. Dagegen ist es wesentlich schwieriger, einen Kompromiß zu finden aus mittlerer Wandlungsgeschwindigkeit und Genauig- keit des Systems. Es ist für einen elektronischen Schaltkreis relativ einfach, festzustellen, ob er größer oder kleiner/gleich einer Ver- gleichsspannung ist. Es gibt jedoch schon Justierungsaufga- ben, wenn derselbe Baustein feststellen soll, ob sich die Eingangsspannung innerhalb eines bestimmten Bereichs, eines sogenannten Fensters, befindet. Soll der Baustein nun herausfinden, in welchem der z.B. 4096 Fenster sich der Eingangsspannungswert befindet, dann ist das eine langwierige und schwierige Angelegenheit. Der POKEY ist nun ein Baustein, der gleichzeitig acht solcher Kanäle überwacht und ausmißt. Damit er das einige Male pro Sekunde tun kann, betrachtet er nicht allzuviel mögliche Fenster, sondern nur 228 Stück. Die einzelnen Werte der POT-Eingänge (POT steht für Potentiometer, ein veränder- barer elektrischer Widerstand) können aus den Registern POT0 bis POT7 ausgelesen werden. Es ist zu beachten, daß der 600XL/800XL nur insgesamt vier der acht möglichen Kanäle benutzen kann, da er nur über zwei Joystickbuchsen verfügt. Beim Vergleich der Adressenliste für den POKEY fällt auf, daß die Adressen AUDI....n und POTn gleich sind. Das berei- tet auch keinerlei Probleme, da die AUDI....n-Werte nur zu schreiben und die POTn-Werte nur zu lesen sind. Die eigentliche Meßprozedur läßt sich über zwei mögliche Register starten. Das eine Register ist SKCNTL, in dessen Bit 2 festgelegt wird, ob es sich um eine normale oder eine sogenannte Schnellmessung handelt. Ist es eine Schnellmes- sung, so ist sie allerdings recht ungenau. Das andere Register nennt sich POTGO und wird einfach mit irgendwelchen Daten beschrieben, um eine Messung zu initiie- ren. Jeder Kanal besitzt ein Bit in dem Statusregister ALLPOT, das Auskunft darüber gibt, ob der Kanalwert des entsprechen- den Kanals 'fertig' ist oder nicht. Ist das entsprechende Bit gesetzt, so gilt der Wert nicht, die Messung ist noch nicht fertig. ***************************** * * * * * SERIELLE EIN-/AUSGABE * * --------------------- * * * ***************************** Unter serieller Ein-/Ausgabe versteht man das Senden und/oder Empfangen von Daten über hauptsächlich eine einzige Datenleitung. Die serielle Ein-/Ausgabe steht im Gegensatz zur parallelen Ein-/Ausgabe, bei der z.B. komplette Bytes auf nebeneinander verlaufenden elektrischen Leitungen oder anderen Informationsstrecken gesendet oder empfangen werden können. Solch eine parallele Übertragungsstrecke ist z.B. der vielleicht von Druckern her bekannte Centronics-Stan- dard. Steht zur Datenübertragung nur eine einzige Datenleitung zur Verfügung, so muß man sich überlegen, wie die Daten darüber zu transportieren sind. Will man nur senden oder nur empfangen, ist schon ein Problem gelöst. Soll jedoch sowohl empfangen als auch gesen- det werden können, stellt sich die Frage, ob man diesen Datentransport nur über eine Leitung laufen läßt (Halb- Duplex), oder ob dafür zwei Leitungen installiert werden (Voll-Duplex). Wird das Halb-Duplex-Übertragungsverfahren gewählt, hat man das Problem, erkennen zu müssen, ob und welches der ange- schlossenen Geräte gerade senden will. Bei Verwendung des Voll-Duplex-Übertragungsverfahrens treten an Stelle der oben beschriebenen Übertragungsprobleme höhere Leitungskosten auf. Da die Leitungskosten jedoch bei solch kurzen Verbindungen wie denen des Atari-Systems vernachlässigbar gering sind im Gegensatz zu dem Halb-Duplex-Umschaltaufwand, hat sich die Firma Atari für das für den Programmierer und Anwender wesentlich angenehmere Zwei-Leitungsverfahren entschieden. Ist vom Entwickler diese Frage entschieden, stellt sich gleich die nächste: Synchrone oder asynchrone Übertragung? Da es sich beim Atari jedoch im Prinzip um selten auftreten- de Übertragungsprozesse handelt, wird man hier gleich auf die asynchrone Übertragungsweise zurückgreifen. Unter asynchroner Übertragung verstehen wir ein Verfahren, bei dem der Empfänger ständig darauf wartet, daß einmal ein Zeichen übertragen wird. Anfang und Ende eines solchen Zei- chens sind durch ein, dem Zeichen vorangehendes, Startbit sowie durch ein, eineinhalb oder zwei Stopbits, die dem Zeichen folgen müssen, gekennzeichnet. Richtig, das ist kein Druckfehler: Im Gegensatz zu der Auffassung, daß ein Bit die kleinste darstellbare Informa- tionseinheit sei, gibt es nun bei der Datenübertragung auch halbe Bits. Wie dies zustandekommt, wird leicht klar, wenn man sich etwas näher ansieht, wie die Zeichen mit den Start- und Stopbits durch die Leitung kommen. Bei diesem Übertragungsverfahren wird davon ausgegangen, daß immer nur genau ein Zeichen gesendet wird, das in Start- und Stopbits 'eingepackt' ist und außerdem vom Programmierer sowohl beim Empfänger als auch beim Sender die gleiche Übertragungsgeschwindigkeit eingestellt ist. Diese Geschwin- digkeit ist das Her(t)z jeder seriellen Übertragung. Während bei einer parallelen Strecke eine Leitung sagt "Hallo Emp- fänger, jetzt kommt ein Byte!" und der Empfänger nach Erken- nen des Zeichens die Meldung bringt "Hallo Sender, das Zeichen wurde gelesen und verarbeitet", gibt sich hier diese Möglichkeit nicht, so daß man davon ausgehen muß, daß der Empfänger genau dann ein Bit zu lesen versucht, wenn es der Sender zur Verfügung stellt. Genau diesen Effekt erreicht man durch den kurzzeitigen Gleichlauf von Sender und Empfänger, wenn man beiden mit- teilt, daß jedes Bit eine ganz bestimmte Zeit anliegt. Da dieser Gleichlauf nur immer ein Zeichen lang existieren muß (denn dann kommt eine neue Synchronisation durch das nächste Startbit!), ist das technisch recht einfach lösbar. Im Laufe der letzten 30 Jahre haben sich ganz bestimmte Übertragungsgeschwindigkeiten durchgesetzt. Von Grundge- schwindigkeiten ausgehend, hat man es durch immer bessere Technik immer wieder geschafft, die Übertragungsrate zu verdoppeln. So existieren heute die folgenden allgemein verwendeten Übertragungsraten 45,45 Bit/Sekunde (nur in den USA) 50 Bit/s z.B. bei BTX 100 " 150 " 300 " 600 " 1.200 " z.B. bei BTX 2.400 " 4.800 " 9.600 " 19.200 " 38.400 " Höhere Übertragungsraten sind bei seriellen Schnittstellen sehr selten, da es dabei technische Probleme gibt. Hat man es nun also geschafft, den Sender beziehungsweise Empfänger auf eine bestimmte Übertragungsrate einzustellen, so ist bekannt, wie lang ein Bit auf der Übrtragungsleitung anliegt: Ist z.B. die Übertragungsrate auf 19.200 Bit/s eingestellt, ist jedes Bit 1/19.200 Sekunden, also ca. 52 millionstel Sekunden lang. Das ist nicht sehr viel, aber dem Computer genügt es. Um nun ein Stopbit zu senden, wird einfach die Sendeleitung für die Dauer eines Bits in den Ruhezustand versetzt. Dieser Ruhezustand kann jedoch auch länger dauern, z.B. die 1,5- fache Dauer eines Bits; also 1,5 Stopbit! Nach dieser etwas technischen Einleitung dürfte eine Zeich- nung von zwei zu übertragenden Zeichen ganz hilfreich sein: Es sollen die Bytes $53 und $8a übertragen werden mit einem Startbit und einem Stopbit: $53 = %0101 0011 $8a = %1000 1010 f = Leitung im Ruhezustand (SPACE, frei) S = Startbit, immer MARK s = Stopbit, immer SPACE ----- -- -- -------- -- -- -- -- ------ SPACE ---- -- ---- -- ------ -- -- MARK ffff S 0 1 0 1 0 0 1 1 s ffff S 1 0 0 0 1 0 1 0 s ffff Die Bereiche ffff können beliebig lang sein bei der asyn- chronen Datenübertragung (daher der Name: Asynchron, nicht zeitlich festgelegt). Nachdem alle diese Dinge entschieden sind, ist man nun in der Lage, einzelne Zeichen (Bytes) zu übertragen, und zwar sowohl zu senden, als auch zu empfangen. Um nun jedoch eine richtige Datenübertragung zustande zu bekommen, ist es weiterhin noch notwendig, sich ein soge- nanntes Protokoll zu überlegen, nach dem die einzelnen Ge- räte an der seriellen Leitung angesprochen werden sollen und anhand dessen dann komplette Datenblöcke (durch zum Beispiel NEWLINE abgeschlossene Zeilen oder Blöcke fester Länge) gehandhabt werden können. Bei Atari sind fast alle an der seriellen Leitung hängenden Geräte intelligent, das heißt, daß sie einen eigenen Kon- trollbaustein besitzen, der die Kommunikation mit dem Host- system, also dem Atari 600XL/800XL übernimmt. Das einzige nicht intelligente Gerät ist der Cassettenrecor- der. Er wird vom Benutzer ein- und ausgeschaltet, wenn der Computer dies durch Huptöne empfiehlt. Andere Geräte, wie zum Beispiel der Drucker oder die ver- schiedenen Diskettenstationen lauschen ständig die am seri- ellen Bus liegenden Informationen sowie die eine Leitung, genannt KOMMANDO:L, ab. Liegt KOMMANDO:L auf dem logischen Pegel Null, bedeutet dies, daß jetzt ein Gerät angesprochen werden soll. Dann sendet das Hostsystem die Geräteart-Ken- nung und die Gerätenummer sowie die Blocknummer bei Disket- tenstationen zusammen mit dem Kommando über den Bus, um das richtige Gerät 'aufzuwecken'. Ist das adressierte Gerät vorhanden und bereit für die Berabeitung dieses Kommandos, so wird es sich zurückmelden mit einer Acknowledge-Meldung: Es sendet ein 'A' und eine kurze Statusinformation mit Checksumme. Ist das Gerät beziehungsweise das Kommando dage- gen nicht in Ordnung, wird ein 'N' (=Negative Acknowledge) zurückgesendet. Ist das Gerät bereit, beginnt der eigentliche Datentransfer, bei dem die zu schreibenden oder zu lesenden Zeichen im Block gesendet werden, wobei die KOMMANDO:L-Leitung wieder auf Eins gesetzt wird. Sind alle Zeichen übertragen, oder glaubt zumindest der Sender, alle Zeichen übertragen zu haben, sendet er unter Umständen noch eine Prüfsumme. Ist das Peripheriegerät zum Beispiel eine Diskettenstation mit dem Befehl, einen be- stimmten Block zu schreiben, so beginnt es mit der eigent- lichen Arbeit (dem Schreiben des Blockes), nachdem es die zu schreibenden Daten vom Hostsystem erhalten hat. Stellt sich nun jedoch heraus, daß der zu schreibende Block defekt ist, sendet die Diskettenstation ein 'E' als Error-Meldung an das Hostsystem zurück. Geht die Operation im ganzen gut, sendet das Gerät ein 'C' für 'Completed' zurück. Das Hostsystem wartet während der gesamten Zeit der Verar- beitung auf eine positive oder negative Rückmeldung des Gerätes. Erscheint sie nach einigen (im Normalfall 7) Sekun- den immer noch nicht, wird die Operation vom Hostsystem dadurch abgebrochen, daß ein Timeout eintritt. In diesem Fall wiederholt das Betriebssystem die Operation so oft, wie es der Wert in CRETRY vorgibt (im Normalfall noch 1 mal). Es ist dann Aufgabe des Hauptprogramms, sicherzustellen, daß eine eventuelle Fehlermeldung über die Statusregister des CIO oder SIO richtig interpretiert wird. Viel einfacher ist dies alles beim Cassettenrecorder. Dabei werden die Daten einfach nur nach einer kurzen Warte- zeit gesendet und davon ausgegangen, daß sie schon richtig ankommen werden. Beim Lesen wird allerdings eine eigentlich sehr sinnvolle, leider nur sehr ungenaue Kontrolle vollzo- gen: Die Lesegeschwindigkeit stellt sich automatisch auf die empfangene Datenrate ein. Dies wird dadurch realisiert, daß jeder Block auf der Cassette mit zwei ganz bestimmten Byte beginnen muß. Sie haben beide den Wert $aa, was binär %1010 1010 darstellt und sich an sich sehr gut für die Synchroni- sation eignet. Wer das Cassettenformat einmal verbessern will, kann auspro- bieren, ob die Übertragung sicherer wird, wenn nicht diese, sondern zwei andere Byte verwendet werden: %1100 1100. Damit müßten sich mit entsprechender Softwareänderung wesentlich genauere Meßergebnisse herstellen lassen. Außerdem gibt es bei der Cassette noch einem weiteren we- sentlichen Unterschied im Übertragungsverfahren zu allen anderen bislang bekannten Geräten: Der Cassettenrecorder 'versteht' keine reinen Digitalsignale, sondern er benötigt zum korrekten Arbeiten zwei unterschiedliche Töne. Ein tie- ferer Ton aus Tonkanal 2 stellt die logische Null dar und ein höherer Ton aus Tonkanal 1 stellt demzufolge die lo- gische 1 dar. Diese Töne haben gegenüber Logikpegeln den Vorteil, daß sie direkt auf dem Magnetband gespeichert wer- den können. Bei Pegeln (die sich theoretisch auch speichern lassen) gibt es bei Cassettenrecordern dieser Preisklasse und derart geringen Übertragungsraten erhebliche technische Schwierigkeiten. Nicht umsonst sind die echten Computerband- maschinen immer noch recht große, teure Schränke, können dagegen jedoch auch in der Übertragungsrate leicht mit den heutigen Atari-Diskettensystemen konkurrieren. Der POKEY hat nun bei alledem eine ganze Reihe von Aufgaben: Erstens übernimmt er die Erzeugung der Sende beziehungsweise Lesetakte. Ist der POKEY der Erzeuger der Taktsignale, so gibt er sie über die Leitung CLOCK OUT aus. Der Sendetakt kann durch die Taktrate in Kanal 2, Kanal 4 oder durch einen externen Takt über die Leitung CLOCK IN bestimmt werden. Für den Lesetakt gilt das gleiche wie für den Sendetakt. Die Sendedaten wechseln jeweils bei der steigenden Flanke des Taktsignals, wohingegen die Lesedaten bei der fallenden Flanke gelesen werden. Dies soll sicherstellen, daß beim Lesen ein halber Takt gewartet wird, um dem Signal Zeit zum Einschwingen zu geben. Als Zweites hält der POKEY die zu sendenden Daten im SEROUT und die gerade empfangenen Daten im SERIN Register für die weitere Verarbeitung fest. Wird in das SEROUT-Register ein Wert geschrieben, so wird er sofort in das parallel/seriell-Wandlungsregister geschrie- ben, wenn dieses frei ist. Danach gibt der POKEY einen Interrupt, in dem er ankündigt, daß das SEROUT-Register leer sei, und der POKEY damit bereit sei, ein neues Zeichen anzunehmen, obwohl der Baustein selbst noch mit dem Senden des alten Datums beschäftigt ist. Wird kein neuer Wert in das SEROUT-Register geschrieben, erfolgt nach dem Entleeren des parallel/seriell-Wandlungsre- gisters ein weiterer Interrupt, der angibt, daß die Übertra- gung des letzten Zeichens beendet sei. Beim Lesen gibt der POKEY einen Interrupt, wenn er ein komplettes Zeichen gelesen hat. Das Zeichen übergibt er dann im SERIN-Register und setzt jedoch noch einige Statusbits im SKSTAT-Register. Es kann zum Beispiel passieren, daß der Computer nicht rechtzeitig die in SERIN stehenden Daten liest, und der POKEY ein neues Byte empfängt, nach SERIN schreibt und somit die alte Information überschreibt. In diesem Fall ist das Bit 6 'serieller Überlauf' gesetzt. Stimmt dagegen etwas mit den Start/Stopbits des Zeichens nicht, so wird das 'Framing-Fehler'-Bit Nummer 7 gesetzt. Dieser Framing- (Rahmen-) Fehler kann auftreten, wenn zum Beispiel ein BREAK-Zeichen über die serielle Schnittstelle gesendet wird. Dies ist kein eigentliches Zeichen, sondern ein Synchronisations- und Resetmechanismus, bei dem die Sendeleitung für ungefähr eine viertel Sekunde auf LOW (also aktiv, MARK) gezogen wird. Dabei wird der POKEY natürlich ein Zeichen $00 erkennen, danach jedoch die beiden Stopbits vermissen. Will man genau wissen, welchen Pegel die Sende/Empfangslei- tung besitzt, so kann man Bit 4 von SKSTAT testen. Dieses Bit ist eine Hardwarekopie des Eingangssignals und bietet neben dieser (noch nicht programmierten) Möglichkeit der BREAK-Erkennung diejenige, die Übertragungsgeschwindig- keit festzustellen, ohne direkt die seriell/parallel-Wand- lung des POKEY initialisieren zu müssen. Ist einmal ein Fehler aufgetreten, so wird das entsprechende Bit dadurch zurückgesetzt, daß ein beliebiger Wert in SKRESET geschrieben wird. Die einzelnen Bits des SKSTAT haben die folgende Bedeutung: Bit Bedeutung ------------------------------------------------------------ 7 MSB Framing-Fehler bei der seriellen Übertragung 6 Overrun-Fehler bei der seriellen Übertragung. Es wurde wenigstens ein Zeichen verloren. 5 Overrun-Fehler bei der Tastatureingabe. Es wurde wenigstens ein Tastendruck verloren. 4 Dies ist die direkte Hardwarekopie des seriellen Eingangs. Dieses Bit wird nur für Spezialanwen- dungen wie Synchronisation abgefragt. 3 Die SHIFT-Taste auf der Tastatur ist gedrückt. 2 Die letzte Taste ist immer noch gedrückt 1 Das Schieberegister der parallel/seriell-Wandlung arbeitet immer noch, das heißt, die Datenübertra- gung ist noch nicht abgeschlossen. Dieses Bit sagt zwar nichts darüber aus, ob nicht ein weiteres Datenbyte in das SEROUT-Register geschrieben wer- den darf, aber wenn man keine genauen Informatio- nen über den Status der seriellen Ausgabe hat, so sollte man unbedingt das Einswerden dieses Bits abwarten. 0 LSB Dieses Bit ist nicht benutzt und ist immer auf 1. MSB = Most Significant Bit = höchstwertiges Bit LSB = Least Significant Bit = geringstwertiges Bit Die Bits in SKSTAT sind im Ruhezustand immer auf Eins und besitzen die angegebene Aussage, wenn sie auf Null gehen. Das Register SKCNTL beschreibt neben den Übertragungsge- schwindigkeiten noch die folgenden Funktionen: Bit Bedeutung ------------------------------------------------------------ 7 MSB Abbrechen der seriellen Ausgabe und Senden von SPACE bei Eins. Dient zum Initialisieren der Sendeleitungen und Senden von mehr als einem Stopbit. 6 Die drei Bit dienen der Festlegung 5 der Übertragungsgeschwindigkeiten 4 des Senders und Empfängers. 3 Wird dieses Bit auf Eins gesetzt, erfolgt die Ausgabe der Bits im Zweitonverfahren. 2 Durch das Setzten dieses Bits wird der Schnellgang der Paddlesteuerung eingeschaltet. Die Messung erfolgt dann nicht wie üblich innerhalb von maximal 20ms, sondern in der Zeit von nur zwei Bildzeilen (ca. 128us). 1 Dieses Bit wird für die Tastaturverarbeitung intern benutzt. 0 LSB Sind Bit 1 und Bit 0 auf Null, so erfolgt ein Software-Reset des POKEY. Das SKCNTL hat ein Schattenregister SKCNTL@. Die Kombinationsmöglichkeiten der drei Bits 4, 5 und 6 des SKCNTL lassen sechs technisch mögliche Zustände zu: Bit 7 6 5 Bedeutung ------------------------------------------------------------ 0 0 0 Alle Takte werden von außen bestimmt. Die internen Takte gehen auf Null. 0 0 1 Die Senderate wird durch einen externen Takt bestimmt, die Eingangsrate wird von Kanal 4 (oder dem 16bit-Zähler, beste- hend aus Kanal 3 und Kanal 4) geliefert. Es erfolgt asynchrones Lesen der Daten. 0 1 0 Sowohl die Sende- als auch die Empfangs- frequenzen werden von Kanal 4 festge- legt. 0 1 1 Nicht nutzbar, da der Ausgangstakt sich beim Lesen eines Zeichens verschieben würde (Synchronisation asynchroner Da- ten). 1 0 0 Die Senderate liegt bei diesem Verfahren durch die Programmierung des Kanals 4 fest, die Eingangsrate wird durch einen externen Takt bestimmt. 1 0 1 Auch diese Taktform ist nicht nutzbar. 1 1 0 Hier bestimmt Kanal 2 die Senderate und Kanal 4 die Empfangssrate. Der Takt von Kanal 4 liegt an der externen Taktaus- gangsleitung an. 1 1 1 Die Ausgangsrate wird wie bei 110 durch Kanal 2 bestimmt, die diesmal asynchrone Leserate durch Kanal 4. Der Taktein- /Ausgang ist nicht benutzt und liegt offen. Die Verfahren 110 und 111 sind zwar die komplexesten, aber sie beinhalten eine Einschränkung: Da zur Taktbestimmung Kanal 2 benutzt werden muß, kann hier keine Zweitonübertra- gung stattfinden! Als letztes Register des POKEY ist das Interruptregister zu besprechen. Auch dieses Register ist in zwei Teile aufgespalten: Ein Leseregister IRQSTAT und das Schreibregister IRQEN. Gibt der POKEY einen der unten beschriebenen Interrupts an die CPU, so prüft deren Interrupthandler über IRQSTAT, wel- che der Interruptquellen es genau war und verzweigt zu den entsprechenden Routinen. Sind alle Bits in IRQSTAT auf Eins, so ist der POKEY nicht die Unterbrechungsquelle. Bit Bedeutung (IRQSTAT) ------------------------------------------------------------ 7 MSB Unterbrechung aufgrund BREAK-Tastendruck 6 Irgend eine andere Taste ist gedrückt 5 Der serielle Eingang hat Daten gelesen und sie in SERIN bereitgestellt 4 Das letzte in SEROUT eingetragene Zeichen wurde in das POKEY-interne parallel/seriell-Wandlungsre- gister übertragen und es kann das nächste Zeichen nach SEROUT transportiert werden. 3 Das parallel/seriell-Wandlungsregister des POKEY ist leer und in das SEROUT-Register wurde auch kein neuer Wert eingetragen. Die Übertragung ist somit für den POKEY beendet. Bit Bedeutung (IRQSTAT) (Fortsetzung) ------------------------------------------------------------ 2 Unterbrechung durch Nullwerden von Timer 4 1 Unterbrechung durch Nullwerden von Timer 2 0 LSB Unterbrechung durch Nullwerden von Timer 1 Sämtliche Interrupts können einzeln erlaubt oder disabled werden. Eine Unterbrechung durch ein bestimmtes Ereignis ist dann erlaubt, wenn das zu dem Interrupt gehörige Bit gesetzt (auf 1) ist. Ein in IRQSTAT auf Null stehendes Bit wird wieder auf 1 gesetzt, wenn das Pendant in IRQEN ebenfalls zumindest kurzzeitig auf Null gesetzt wird. Die Zuordnung der Bits zu den Interruptquellen ist bei IRQSTAT und IRQEN gleich: Bit Bedeutung (IRQEN) ------------------------------------------------------------ 7 MSB Unterbrechung aufgrund BREAK-Tastendruck erlaubt 6 Beliebiger Tasteninterrupt erlaubt 5 Serielle Eingangsunterbrechung erlaubt 4 SEROUT-Interrupt enabled 3 Übertragungsendunterbrechung gestattet 2 Unterbrechung durch Nullwerden von Timer 4 erlaubt 1 Unterbrechung durch Nullwerden von Timer 2 erlaubt 0 LSB Unterbrechung durch Nullwerden von Timer 1 erlaubt Zu beachten ist auch hier das Schattenregister für IRQEN, IRQEN@. Wird ein Interrupt neu erlaubt oder verboten, so ist dies sowohl im Schatten- als auch im Hardwareregister zu tun. Ist die Abschaltung nicht so eilig, kann sie also im nächsten Vertical Blank Interrupt geschehen; so muß nur das Schattenregister korrigiert werden. Die Korrektur erfolgt durch 'EinODERn' beziehungsweise 'Her- aus-UNDen' des oder der jeweiligen Bits. *** ATARI INTERN POKEY ***