ACSI Muli IO

multiio.jpg

Download:ACSIIO.zip

Ich hatte eine Schaltung entworfen und gebaut, mit der ich maximal 48 Ein- und Ausgänge hatte, die über den Atari Steuerbar waren.

Für Basteleien brauchte ich mehr ein und Ausgänge als ich über den Atari hatte. Am Parallelport hing meine Drucker und Seriell war mir damals zu "kompliziert" anzusteuern. Auch der ROM-Port war schon in Benutzung. Es bot sich der ACSI (Atari Computer System Interface) Port des Atari an. Es gab schon eine Schaltung, mit der man 16 Ein und Ausgänge bekam. Dann durfte aber kein anderes Gerät angeschlossen sein. Meine Lösung sollte mit ACSI-Festplatten und ACSI-Druckern zusammen arbeiten. So entstand mein ACSI Multi IO.

Mit der Schaltung, wie sie zu sehen ist bekommt man insgesamt 48 Eingabe- und 48 Ausgabe- Kanäle gruppiert zu 8Bit. Mit kleinen Veränderungen kann man 2^4*2*8 also 256 Kanäle haben. Zudem kann man noch acht Geräte an den Bus hängen. Maximal wären dass also 2048 I/O-Kanäle. Wenn man es ins extrem treiben will kann man an den Expansionsport der Karte die selbe Schalung noch einmal anhängen. (das würde die Adressierung der nachgeschalteten Geräte aber komplizierter machen)

Etwas zur Platine
Damals war ich noch sehr verschwenderisch mit der Platine. Das hat sich gebessert. :-)
Die Dip-Schalter (Mäuseklavier) dienen zum einstellen der ACSI-Adresse (0-7) Das macht es möglich die karte parallel zu anderen Geräten zu betreiben. Der große Stecker führt die Ein und Ausgänge heraus. der kleine oberhalb der Dip-Schalter erlaubt es ein Daughterboard mit nochmal 16 Ein und Ausgängen anzuschließen.

Ich hatte immer vor einen DMA-Modus einzubauen kam aber nie auf die richtige Idee. Mittlerweile weiß ich wie ich das Umsetzen könnte, kann aber nicht die Energie aufbringen das zu Implementieren. :-)

Der Aufbau
Ich habe die Schaltung aus ICs, die ich von alten Karten herunter gelötet habe, gebaut. Das Beschränkte die Art der verwendeten Bauteile und damit die Art der Schaltung. Zudem habe ich sie mehrfach verändert und erweitert. Dadurch ist die Schaltung nicht optimal. Einzig der 74573 ist neuer (hatte ich aus einem Restbestand). Man kann dafür auch einen 74373 nutzen der sich zum 74573 nahezu gleich verhält, aber eine andere Pinbelegung hat.

Wäre es nicht nötig das ACSI Protokoll einzuhalten käme man auch mit einer sehr einfachen Schaltung aus. Mit einem einem 74139 werden die Kombinationen R/W und A1 (/CS aktiviert den 74139) dekodiert und damit die Entsprechenden je 2ICs vom Typ 74245 und 74374 angesteuert. Dabei dient A1 zum adressieren von Hight/Low-Byte. Damit ist es ohne weiteres möglich 16Bit Ein- und Ausgänge zu bekommen. Der Nachteil ist aber, dass A1 zum Adressieren der Geräte verwendet wird. Das bedeutet, dass kein anderes Gerät am Bus hängen darf, da es sonst zu Adressierungsfehlern kommt. (siehe dazu den Schaltplan der Erweiterungskarte)

Das DMA-Protokoll.
Das DMA-Protokoll hat drei Phasen. Die Commad-Phase die Data-in/out Phase und die Status-Phase. Ein Zyklus ist beendet wenn wenn die nächste Commad-Phase kommt. Nach dem ersten Befehl der Command-Phase haben der Host (Computer) das Target den Bus für sich. Das bedeutet, wenn ein Target die erste Phase korrekt abwickelt, hat der Programmierer den Bus für sich.

Die Commad-Phase wird eingeleitet, wenn das Signal A1 auf low geht. Der Host legt ein Byte auf den Bus und zieht /CS auf low um die Daten als gütig zu erklähren. Die oberen drei Bits adressieren das Gerät, die restlichen sind frei belegbar und dienen normalerweise zur Adressierung eines Befehls welches das Gerät beherrscht. Diese fünf Bit stehen einem Programmierer zur freien Verfügung. Bis das nächste mal A1 auf low gezogen wird, haben sich alle nicht angesprochenen Geräte aus der weiteren Kommunikation heraus zu halten. Normalerweise sollte jedes übertragene Byte mit einem low auf /IRQ bestätigt werden. Doch das kann man sich sparen, wenn es um einfache IO-Operationen geht. Das Signal geht direkt an den MFP im Atari. Wer komplexere Aktionen vor hat sollte sich überlegen, ob für ihn eine solche Rückmeldung sinnvoll ist. (siehe Bemerkung in der Schaltung)

Die Logik sieht im folgenden so aus: Wenn A1 und /CS auf low gezogen wird, aktiviert das einen 74573, der das gesendete Byte puffert. An den oberen drei Bit hängt ein 74137, der die Dekodierung macht, Das Ergebnis geht auch an den 74573. Über eine Jumperreihe ist auswählbar auf welche Adresse die Schlatung regiert. Aus A1,/CS und dem Selektionssignal vom 74573 wird das Aktivierungssignal für die restliche Schaltung.
Das gespeicherte Bit 0 dient zum selektieren des hight/lowbyte die drei nächsten Bit dienen zur Selektion von jeweils einem IC-Paar (hight+low). Bit 4 ist nicht genutzt (in der Schaltung aktiviert es nur eine LED)

Zur Programmierung.
Ganz wichtig ist es zu aller erst den DMA-Chip für sich zu reservieren. Ansonsten Funken einem die durch den Systeminterrupt aufgerufenen Systemroutinen dazwischen. Das macht man über die Systemvariable "flock" diese befindet an Adresse H43E. Vor dem setzen sollte man schauen ob nicht ein anderer Prozess diesen Wert schon gesetzt hat und warten bis der Bus frei ist. Jeder Wert der nicht 0 ist aktiviert die Sperre. Sobald flock gesetzt ist wird auch das Interruptsignal am MFP ignoriert. Sollte man sich entschlossen haben /IRQ zu nutzen so muss man regelmäßig im entsprechenden Register nachschauen, ob das passende Bit gesetzt ist.
Wenn man den Bus für sich hat adressiert man das Gerät. Dies macht man indem man erst in das Mode-Register des DMA-Chip schreibt und dann ein Byte in den Controll/Access-Register schreibt. Dieses Byte legt der DMA Auf den Bus.
Die Adresse des Mode-Registers ist HFF8606 und das Controll-Register liegt bei HFF8604.
Zum Einleiten der Geräteselektion schreibt man 018E in das Mode-Register und dann ein Byte in das Controll-Register. Die oberen drei Bit (5,6,7) dienen zum Adressieren des Gerätes das Bit 0 Wird genutzt um hig/low-Byte der Ausgabe zu adressieren. Die restlichen vier Bit können anderweitig genutzt werden.


Angenommen das Gerät liegt auf ACSI-ID 0:

  5 => 0
  6 => 0
  7 => 0

Das das erste Paar soll sekeltiert sein und da das lowbyte:
  0 => 0
  1 => 1

Das Byte ist dann: "00000010" was "H02" entspricht
Ist die ID 8 ist es HE2
Will man das Hightbyte selektieren ist das Byte HE3

Zusammengefasst:
D0       => High/Low-Byte
D1       => CS0
D2       => CS1
D3       => CS2
D4       => NC
D5,D6,D7 => ACSI-ID

Nach der Selektion kann man Daten lesen oder schreiben. Dazu setzt man im Controll-Register H0188 zu schreiben und H0088 zum lesen. Beim nächsten Zugriff auf das Datenregister werden die Daten gelesen oder geschrieben.

Bemerkungen
Ganz wichtig ist es zu wissen, welche Geräte schon am ACSI-Bus hängen. Schreibt man an nicht nur an die ACSIIO Karte so kann man schnell einige Daten auf einer Festpatte zerschreiben. Ich habe damit so meine Erfahrung machen müssen. :-/
Die meisten ACSI-Festplatten haben die ID 0 das gilt speziell für die im MegaSTE und die externen Megafile Festplatten.
Ich habe das ganze nicht unter mint oder einem anderen Multitasking OS ausprobiert. Aber sofern kein Treiber oder Programm "flock" ignoriert sollte es auch dort funktionieren. Nur ist es dann wichtig flock nur dann zu setzen, wenn es nötig ist. Man sollte anderen Prozessen auch den Zugang zum ACSI-Bus erlauben.