ACSI Muli IO

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.