| Zeile 35: | Zeile 35: | ||
Vor einer Datenübertragung muss der Controller richtig programmiert bzw. initialisiert werden. Die meisten Einstellungen, die hierfür nötig sind, können für jeden Channel einzeln geändert werden; das heißt, dass alle Channel unabhängig voneinander programmiert werden müssen und unabhängig voneinander die Daten übertragen. | Vor einer Datenübertragung muss der Controller richtig programmiert bzw. initialisiert werden. Die meisten Einstellungen, die hierfür nötig sind, können für jeden Channel einzeln geändert werden; das heißt, dass alle Channel unabhängig voneinander programmiert werden müssen und unabhängig voneinander die Daten übertragen. | ||
| − | Der eigentliche Transfer wird in der Regel von dem mit diesem Channel verbundenen Stück Hardware gestartet. Dafür hat jeder Controller vier Leitungen mit den Namen DREQ0 bis DREQ3, die den Transfer über den entsprechenden Channel starten. Alternativ kann dieses Signal auch per Software emuliert werden, um die Datenübertragung manuell zu starten. Dazu wird das Requestregister benötigt, das weiter unten beschrieben wird. Die Übertragung wird beendet, wenn die vorab definierte Datenmenge übertragen wurde oder wenn ein Signal auf der EOP-Leitung des Controllers ankommt, d.h. die Übertragung von der Hardware aus beendet wird. | + | Der eigentliche Transfer wird in der Regel von dem mit diesem Channel verbundenen Stück Hardware gestartet. Dafür hat jeder Controller vier Leitungen mit den Namen DREQ0 bis DREQ3, die den Transfer über den entsprechenden Channel starten. Alternativ kann dieses Signal auch per Software emuliert werden, um die Datenübertragung manuell zu starten. Dazu wird das Requestregister benötigt, das weiter unten beschrieben wird. Die Übertragung wird beendet, wenn die vorab definierte Datenmenge übertragen wurde oder wenn ein Signal auf der EOP-Leitung des Controllers ankommt, d. h. die Übertragung von der Hardware aus beendet wird. |
| − | === Übersicht der I/O Ports === | + | === Übersicht der I/O-Ports === |
Die folgende Tabelle ist eine Übersicht über alle [[Port]]s, die von den beiden Controllern belegt werden. Master- und Slave-Controller verwenden dabei verschiedene Ports. Weiterhin muss beachtet werden, dass die vier Channel pro Controller ebenfalls etliche getrennte Ports verwenden. So kommt ingesammt eine vergleichsweise hohe Zahl an Ports zusammen. | Die folgende Tabelle ist eine Übersicht über alle [[Port]]s, die von den beiden Controllern belegt werden. Master- und Slave-Controller verwenden dabei verschiedene Ports. Weiterhin muss beachtet werden, dass die vier Channel pro Controller ebenfalls etliche getrennte Ports verwenden. So kommt ingesammt eine vergleichsweise hohe Zahl an Ports zusammen. | ||
| − | Mit | + | Mit „Zugriff“ ist der [[Assembler]]befehl gemeint, mit dem auf den Port zugegriffen werden kann. Diese Spalte gibt an, ob lesend oder schreibend zugegriffen wird. Die Spalte „Größe“ gibt an, wieviele Bits das entsprechende Register umfasst. Auch wenn hier 16 stehen sollte, wird nur byteweise mit den DMA-Controllern kommuniziert – siehe dazu die Beschreibung des Flip-Flop-Registers. |
| Zeile 54: | Zeile 54: | ||
| || Ch 3: 0x06 || Ch 3: 0xC6 || out || 16 || | | || Ch 3: 0x06 || Ch 3: 0xC6 || out || 16 || | ||
|- | |- | ||
| − | | Zähler || Ch 0: 0x01 || Ch 0: 0xC1 || out || 16 || Anzahl der Bytes | + | | Zähler || Ch 0: 0x01 || Ch 0: 0xC1 || out || 16 || Anzahl der zu übertragenden Bytes minus eins |
|- | |- | ||
| || Ch 1: 0x03 || Ch 1: 0xC3 || out || 16 || | | || Ch 1: 0x03 || Ch 1: 0xC3 || out || 16 || | ||
| Zeile 62: | Zeile 62: | ||
| || Ch 3: 0x07 || Ch 3: 0xC7 || out || 16 || | | || Ch 3: 0x07 || Ch 3: 0xC7 || out || 16 || | ||
|- | |- | ||
| − | | Aktuelle Adresse || Ch 0: 0x00 || Ch 0: 0xC0 || in || 16 || Die | + | | Aktuelle Adresse || Ch 0: 0x00 || Ch 0: 0xC0 || in || 16 || Die aktuelle Adresse. Sie gibt an, wo der DMA-Controller gerade liest oder schreibt. |
|- | |- | ||
| || Ch 1: 0x02 || Ch 1: 0xC2 || in || 16 || | | || Ch 1: 0x02 || Ch 1: 0xC2 || in || 16 || | ||
| Zeile 70: | Zeile 70: | ||
| || Ch 3: 0x06 || Ch 3: 0xC6 || in || 16 || | | || Ch 3: 0x06 || Ch 3: 0xC6 || in || 16 || | ||
|- | |- | ||
| − | | Aktueller Zähler || Ch 0: 0x01 || Ch 0: 0xC1 || in || 16 || Der momentane Zählerstand gibt an, wie viele Bytes noch verbleiben | + | | Aktueller Zähler || Ch 0: 0x01 || Ch 0: 0xC1 || in || 16 || Der momentane Zählerstand gibt an, wie viele Bytes noch verbleiben. |
|- | |- | ||
| || Ch 1: 0x03 || Ch 1: 0xC3 || in || 16 || | | || Ch 1: 0x03 || Ch 1: 0xC3 || in || 16 || | ||
| Zeile 78: | Zeile 78: | ||
| || Ch 3: 0x07 || Ch 3: 0xC7 || in || 16 || | | || Ch 3: 0x07 || Ch 3: 0xC7 || in || 16 || | ||
|- | |- | ||
| − | | Page || Ch 0: 0x87 || Ch 0: 0x8F || out/in || 8 || Da sich mit Hilfe der Startadresse nur ein | + | | Page || Ch 0: 0x87 || Ch 0: 0x8F || out/in || 8 || Da sich mit Hilfe der Startadresse nur ein 16-Bit-Adressraum ansprechen lässt, also 64 KiB, kann hierüber eine Page festegelegt werden. Die Startadresse wird also auf eine 24-Bit-Adresse erweitert, womit sich immerhin 1 MiB ansprechen lässt. Dieses 8-Bit-Register nimmt dabei die Bits 16 – 23 dieser Adresse auf. |
|- | |- | ||
| || Ch 1: 0x83 || Ch 1: 0x8B || out/in || 8 || | | || Ch 1: 0x83 || Ch 1: 0x8B || out/in || 8 || | ||
| Zeile 86: | Zeile 86: | ||
| || Ch 3: 0x82 || Ch 3: 0x8A || out/in || 8 || | | || Ch 3: 0x82 || Ch 3: 0x8A || out/in || 8 || | ||
|- | |- | ||
| − | | Status || 0x08 || 0xD0 || in || 8 || Liefert Statusinformationen zum DMA-Controller (siehe dazu unten) | + | | Status || 0x08 || 0xD0 || in || 8 || Liefert Statusinformationen zum DMA-Controller (siehe dazu unten). |
|- | |- | ||
| − | | Befehle || 0x08 || 0xD0 || out || 8 || Befehle, die der Controller ausführen soll, werden hierein geschrieben (für eine Liste der Befehle siehe unten) | + | | Befehle || 0x08 || 0xD0 || out || 8 || Befehle, die der Controller ausführen soll, werden hierein geschrieben (für eine Liste der Befehle siehe unten). |
|- | |- | ||
| − | | Controller zurücksetzen || 0x0D || 0xDA || out || | + | | Controller zurücksetzen || 0x0D || 0xDA || out || — || Durch Schreiben in dieses Register wird ein Reset des entsprechenden Controllers durchgeführt. |
|- | |- | ||
| − | | Flip-Flop || 0x0C || 0xD8 || out || 8 || Dieses Register ist nötig, um mit | + | | Flip-Flop || 0x0C || 0xD8 || out || 8 || Dieses Register ist nötig, um mit 8-Bit-Zugriffen, die 16-Bit-Register zu verwenden. Vor dem Zugriff auf ein 16-Bit-Register sollte eine Null an dieses Register gesendet werden. Dadurch wird der Flip-Flop des Controllers zurückgesetzt und es wird beim anschließenden Zugriff auf ein 16-Bit-Register das Low-Byte adressiert. Der Controller wird das Flip-Flop-Register danach selbstständig auf Eins setzen, wodurch der nächste Zugriff das High-Byte adressiert. Dies ist sowohl beim Lesen als auch beim Schreiben aus bzw. in 16-Bit-Register nötig. |
|- | |- | ||
| − | | Transfermodus || 0x0B || 0xD6 || out || 8 || Über dieses Register kann der Übertragungsmodus für einen Channel und einige weitere ergänzende Details zum Befehl, der an das Befehlsregister gesendet wird, festgelegt werden (Für eine genaue Beschreibung siehe unten) | + | | Transfermodus || 0x0B || 0xD6 || out || 8 || Über dieses Register kann der Übertragungsmodus für einen Channel und einige weitere ergänzende Details zum Befehl, der an das Befehlsregister gesendet wird, festgelegt werden (Für eine genaue Beschreibung siehe unten). |
|- | |- | ||
| − | | Maskierung eines Channels || 0x0A || 0xD4 || out || 8 || Hierüber kann ein einzelner Channel | + | | Maskierung eines Channels || 0x0A || 0xD4 || out || 8 || Hierüber kann ein einzelner Channel maskiert, also deaktiviert, werden. Dies sollte immer(!) getan werden, wenn der Controller auf einen Transfer vorbereitet wird, um gleichzeitige Zugriffe von mehreren Programmen zu unterbinden. Die Bits 0 und 1 enthalten dabei die Nummer des Channels, dessen Status geändert werden soll. In Bit 2 wird angegeben, ob der gewählte Channel aktiviert (0) oder deaktiviert (1) werden soll. |
|- | |- | ||
| − | | Maskierung mehrerer Channel || 0x0F || 0xDE || out || 8 || Dieses Register hat die gleiche Funktion wie das Maskierungsregister oben, aber mit dem Unterschied, dass mit Hilfe dieses Registers der Zustand meherer Channel gleichzeitig geändert werden kann. Bit 0 bis 3 geben dabei an, ob der entsprechende Channel (0 | + | | Maskierung mehrerer Channel || 0x0F || 0xDE || out || 8 || Dieses Register hat die gleiche Funktion wie das Maskierungsregister oben, aber mit dem Unterschied, dass mit Hilfe dieses Registers der Zustand meherer Channel gleichzeitig geändert werden kann. Bit 0 bis 3 geben dabei an, ob der entsprechende Channel (0 – 3) aktiviert (0) oder deaktiviert (1) werden soll. Hierbei ist zu beachten, dass nicht aus Versehen ein Channel irrtümlicherweise (de)aktiviert wird, dessen Status eigentlich unverändert bleiben soll. |
|- | |- | ||
| − | | Request || 0x09 || 0xD2 || out || 8 || Dieses Register ermöglicht es, einen Transfer mittels Software auszulösen. Für den Aufbau des zu sendenen Bytes siehe unten | + | | Request || 0x09 || 0xD2 || out || 8 || Dieses Register ermöglicht es, einen Transfer mittels Software auszulösen. Für den Aufbau des zu sendenen Bytes siehe unten. |
|} | |} | ||
| Zeile 128: | Zeile 128: | ||
|} | |} | ||
| − | Mit Terminal Count ist das Umspringen des Zählers von 0x0000 auf 0xFFFF bzw. von 0xFFFF auf 0x0000 | + | Mit Terminal Count ist das Umspringen des Zählers von 0x0000 auf 0xFFFF bzw. von 0xFFFF auf 0x0000 – je nach Zählrichtung – gemeint. Wenn dies der Fall ist, wird die Übertragung beendet. |
Die DMA-Request-Bits sind auf Eins gesetzt, wenn das dem Channel zugehörige Gerät eine Übertragung per Hardwaresignal starten möchte. | Die DMA-Request-Bits sind auf Eins gesetzt, wenn das dem Channel zugehörige Gerät eine Übertragung per Hardwaresignal starten möchte. | ||
| Zeile 178: | Zeile 178: | ||
| 5 || Zählrichtung: | | 5 || Zählrichtung: | ||
|- | |- | ||
| − | | || 0 = Adressregister wird inkrementiert, es wird aufwärts gezählt | + | | || 0 = Adressregister wird inkrementiert, es wird aufwärts gezählt. |
|- | |- | ||
| − | | || 1 = Adressregister wird dekrementiert, es wird abwärts gezählt | + | | || 1 = Adressregister wird dekrementiert, es wird abwärts gezählt. |
|- | |- | ||
| 6-7 || Transfermodus: | | 6-7 || Transfermodus: | ||
| Zeile 207: | Zeile 207: | ||
| || 0 = Kein Request | | || 0 = Kein Request | ||
|- | |- | ||
| − | | || 1 = Request; das ist das, was wohl in allen Fällen gewollt ist | + | | || 1 = Request; das ist das, was wohl in allen Fällen gewollt ist. |
|- | |- | ||
| − | | 3-7 || ungenutzt, sollte | + | | 3-7 || ungenutzt, sollte null sein |
|} | |} | ||