Dies ist eine Referenz aller XBus-Komponenten, die in der aktuellen Version HaDes Pro
vorhanden sind und ihrer
verfügbaren Port-Adressen. XBus-Komponenten, die in früheren
Hardware-Versionen vorhanden waren, aber inzwischen ersetzt wurden,
sind unter Alte XBus-Komponenten aufgeführt.
Allgemeine Konventionen:
Einige allgemeine Konventionen helfen, auf XBus-Komponenten zuzugreifen.
- Der Bereich gültiger Portadressen reicht von 0 bis 255 (inklusive).
- Jede XBus-Komponente hat maximal 8 Portadressen, wobei die erste
Portadresse der Komponente durch 8 teilbar ist. (Üblicherweise
handelt es sich dabei um ein Statusregister der Komponente.)
- Ein Lesezugriff auf die erste Portadresse einer Komponente darf keine Seiteneffekte haben.
Diese Konventionen werden von den neuesten HAL-Versionen genutzt, um
beim Systemstart abzufragen, welche XBus-Komponenten tatsächlich
vorhanden sind. Dazu wird ein Lesezugriff auf alle gültigen, durch
8 teilbaren Portadressen ausgeführt. Der dabei ggf. auftretende
XAddr-Interrupt (falls keine Komponente an dieser
Adresse existiert) wird abgefangen. Alle Ergebnisse werden in
einer Bitmaske gespeichert, die mit der HL-Funktion xbus_exists()
abgefragt werden kann.
XTimerPro:
Der XTimerPro ersetzt XTimerXT und XTickClock und ist hierbei
besonders genau und dabei sehr ressourcensparend (auf dem FPGA).
Um den Timer zu starten, muss ein TickCount-Wert angegeben werden
(auf Port 17). Das Timeout-Ereignis tritt ein, wenn der laufende
Zähler diesen Wert erreicht. Um also eine bestimmte Zeit zu
warten, wird zunächst der aktuelle Zählerstand geholt, die
entsprechende Zeit addiert und die errechnete Summe anschließend
als Timeout-Wert angegeben (Port 17). Der Timer kann jederzeit
über das Bit 1 des Statusports deaktiviert werden (schreibe eine
0). Eine Aktivierung ist aber nur über Port 17 möglich.
Zur Zeitmessung (XTickClock-Funktion) kann einfach Port 17 vor und
nach einer Operation ausgelesen werden, die Differenz der Werte
ist dann die Zeitdauer der Operation in µs.
Interface:
Portadresse |
Bit |
Beschreibung |
16 |
0 |
1: Interrupt auslösen, wenn Zeit abgelaufen |
1 |
1: XTimerPro ist aktiv / 0: deaktiviert Timer |
2 |
1: Zeit abgelaufen (READ ONLY) |
31..3 |
Inhalt undefiniert |
17 |
31..0 |
TickCount (in µs)
Schreiben: Nächstes Timeout (aktiviert automatisch den Timer) |
Lesen: Aktueller Zählerstand |
XJtag:
Überträgt Daten langsam und
gemächlich über die bereitgestellte
JTAG-Schnittstelle (Parallelport) zum
PC.
Interface:
Portadresse |
Bit |
Beschreibung |
32 |
0 |
1: JTAG hat Interrupt ausgelöst |
1 |
1: Interrupt auslösen, wenn Daten empfangen |
2 |
1: Interrupt auslösen, wenn Daten versandt |
3 |
1: Daten wurden empfangen (have_recv_data) (RO) |
4 |
1: Sendepuffer voll (have_send_data) (RO) |
33 |
7..0 |
Data Port (byteweises Lesen / Schreiben) |
XConsole:
Steuert die Anzeige- und
Bedienelemente, die auf dem TeBL Board angebracht
sind. Grundlegend gilt: das höchste
("linkeste") Bit gilt immer für die/den am weitesten links
angebrachten Schalter /
LED / Segmentanzeige.
Interface:
Portadresse |
Bit |
Beschreibung |
64 |
0 |
1: Tasten haben Interrupt ausgelöst |
1 |
1: Interrupt auslösen bei Tastendruck |
65 |
7..0 |
Tastenstatus (1: Taste i gedrückt) (RO) |
15..8 |
Switch-Status (1: Switch ist aktiv) (RO) |
66 |
7..0 |
LED-Status (1: LED i an) |
15..8 |
LED-Blinkend (1: LED i-8 blinkend) |
67 |
15..0 |
Auf den 7-Segmenten angezeigter Hex-Wert (falls Hex-Ansteuerung verwendet wird) |
31..0 |
Steuersignale für die 7-Segmente (falls Direktansteuerung verwendet wird) |
68 |
3..0 |
1: 7-Seg-Anzeige i anschalten / 0: aus |
7..4 |
1: Dezimalpunkt der Anzeige (i-4) an |
8 |
1: aktivierte Anzeigen blinken / 0: fest |
9 |
1: Direktansteuerung der 7-Segmente / 0: Hexwert (Standard) |
XPoison:
Nur im Emulator: Diese XBus-Komponente wird nur vom Emulator implementiert.
Kann benutzt werden, um
gezielt Speicheradressen zu
"vergiften", so dass jeder
Zugriff zu einer Programmunterbrechung (impliziter Breakpoint)
führt.
Interface:
Portadresse |
Bit |
Beschreibung |
112 |
16..0 |
Zu vergiftende Speicheradresse |
113 |
16..0 |
Zu entgiftende Speicheradresse |
XPS2:
Stellt ein einfaches Interface zur
Kommunikation mit einem PS/2-Gerät bereit.
Zu beachten ist, dass beim Start und
nach jedem Resetvorgang die Bits ungültig sind und das Interface
noch nicht benutzt werden darf. Es muss zunächst in einer
Pollingschleife
Bit 5 von Adr. 128 abgefragt werden, solange bis dieses 1 wird. Dann
ist die
Geräteinitialisierung abgeschlossen und es kann abgefragt werden,
ob
überhaupt ein funktionsfähiges Gerätangeschlossen ist
(Bit 6) bzw. um
welche Art von Gerät es sich handelt (Bit 7).
Die XPS2 ist zweimal im XBus eingebunden (einmal für jeden
PS/2-Port), und zwar an den Adressen 128-130 für Port 1 sowie
144-146 für Port 2.
Interface:
Portadresse |
Bit |
Beschreibung |
128 |
0 |
1: XPS2 hat Interrupt ausgelöst |
1 |
1: Interrupt auslösen bei Empfang |
2 |
1: Interrupt auslösen bei Versand (+Timeout) |
3 |
1: Daten wurden empfangen (RO) |
4 |
1: Sendevorgang läuft - busy (RO) |
5 |
1: Geräteinitialisierung abgeschlossen |
6 |
1: Ein Gerät ist angeschlossen, 0: keines |
7 |
1: Eine Tastatur ist angeschlossen, 0: Maus |
129 |
7..0 |
Data Port |
130 |
X |
Reset Port
Bei Schreiben eines Wertes - egal welches - wird ein Reset der PS/2
Hardware ausgeführt; alle Bits werden ungültig! |
XPix:
Steuert die Grafikmodus-Ausgabe auf dem
angeschlossenen VGA-Monitor. Dabei
wird die Auflösung 640x480 Pixel
mit den 16 Standard-VGA-Farben verwendet.
Beachte, dass der
Textmodus-Grafikspeicher in den XPix-Videospeicher bei
den Adressen 1015808 (220 - 215) bis
1048575 (220-1) eingeblendet ist.
Zugriffe auf diese Adressen durch den
XPix sollten vermieden werden.
Interface:
Portadresse |
Bit |
Beschreibung |
160 |
18..0 |
Grafikspeicher-Adresse |
161 |
3..0 |
Data Port (Lesen / Schreiben eines Pixels). Jede Lese- bzw.
Schreiboperation erhöht automatisch die Grafikadresse (mod 219).
|
162 |
31..0 |
Fast Data Port (Lesen / Schreiben von acht
aufeinanderfolgenden Pixeln, begonnen ab der Grafikadresse, inklusive).
Jede Operation erhöht die Grafikadresse um 8 (mod 219).
Die
höchstwertigen Bits des Eingangswortes kommen auf die niedrigste
Adresse zu liegen (Big Endian). |
163 |
3..0 |
Transparenzfarbe. Wenn Transparenz angeschaltet ist, wird
diese bei nachfolgenden Schreibzugriffen ignoriert, der Originalwert
aus dem Grafikspeicher bleibt stehen. |
4 |
1: Transparenz aktiviert. |
164 |
x..0 |
Veraltet: Der Textmodus (XGfx) wurde abgeschafft, eine Änderung des Anzeigemodus hat daher keine Auswirkung mehr.
Einstellen des Anzeigemodus. Folgende Werte sind
möglich:
0 |
Textmodus 80x60x60 (Standard) |
1 |
Grafikmodus 640x480x60 |
|
165 |
0 |
Wahl des Puffers (für Double-Buffering).
Falls Puffer= |
liegt das Bild bei Adr. |
0 |
0 .. 307199 |
1 |
524288 .. 831487 |
(Die
Pixeladresse wird für Puffer 1 einfach um 219
erhöht.) Dies
betrifft nur die Ausgabe an den Monitor; CPU-Zugriffe sind nicht
betroffen. |
XSound:
Erzeugt Mono-Sound in 8-bit
Samplequalität mit variabler (einstellbarer) Samplerate. Die
Ausgabe erfolgt als ein
einziges Bit (sigma-delta DAC),
das durch einen Tiefpass in eine
Analogspannung gewandelt werden muss. Solange Eingabedaten vorhanden
sind
(diese werden in einem Puffer zwischen-
gespeichert), wird auch Sound
produziert. Der Status des Puffers kann über
das Statusregister abgefragt werden,
alternativ können auch Interrupts
ausgelöst werden, wenn der Puffer
langsam leerläuft (ca. 1/4 Füllstand).
Interface:
Portadresse |
Bit |
Beschreibung |
192 |
0 |
XSound hat Interrupt ausgelöst (lösch mit 0) |
1 |
Soll Interrupt vor Pufferleerlauf ausgelöst werden? |
3..2 |
Zustand des Soundpuffers. Mögliche Werte:
11 = komplett voll
10 = gut gefüllt (>1/4)
01 = schlecht
00 = komplett leer |
193 |
7..0 |
Data Port (Schreiben eines Wave-Samples.) Von diesem Port
kann nicht gelesen werden! Falls der Puffer voll war, wird der Wert
ignoriert. Falls der Puffer leer war, wird die Soundausgabe gestartet. |
194 |
??..0 |
Länge eines Samples in Clocktakten. Umgekehrt
proportional zur Samplefrequenz. Beim Start ist die Samplefrequenz 11
kHz. Der Port kann gelesen werden. |
XMMC:
Liest und schreibt Daten von einer MultiMedia-Flash-Speicherkarte.
Die XMMC ermöglicht einen wahlfreien Zugriff auf einzelne Bytes
der Speicherkarte. Da MMC-Karten aber blockorientiert arbeiten (wobei
ein Block aus 512 Byte besteht), enthält sie einen Cachhe für
einen Block. Immer wenn die MMC-Adresse (Port 209) den gecachten Block
verlässt, wird dieser auf die Karte geschrieben, falls
er verändert wurde,
Achtung: Die XMMC ist nicht hotplug-fähig. Nach dem Einstecken einer Speicherkarte ist der Prozessor (und der XBus) neuzustarten.
Achtung: Die XMMC
stellt keine Informationen über die Größe der
eingelegten Speicherkarte bereit. Diese muss vom Anwender angegeben
werden. Greift man auf Bytes der Karte zu, die über der realen
Größe liegen, treten Command-Fehler auf.
Interface:
Portadresse |
Bit |
Beschreibung |
208 |
0 |
reserved (Interrupt) |
1 |
reserved (Interrupt) |
2 |
1: Write-Fail aufgetreten (Dieses Bit muss von der
CPU zurückgesetzt werden, wenn weitere Schreibzugriffe erfolgen
sollen. Solange dieses Bit gesetzt ist, ignoriert XMMC sämtliche
Schreibzugriffe.) |
3 |
1: Command-Fail aufgetreten (Dieses Bit muss von der CPU
zurückgesetzt werden, wenn irgendwelche Zugriffe erfolgen sollen.
Solange dieses Bit gesetzt ist, ignoriert XMMC sämtliche
Lese/Schreibzugriffe.) |
4 |
1: XMMC ist busy (Karte schreibt) |
209 |
31..0 |
MMC-Adresse (mit Autoinkrement) |
210 |
7..0 |
Byte Port (byteweises Lesen u. Schreiben).
Die Adresse (=Port 209) wird automatisch inkrementiert, sobald der Zugriff beendet wurde. |
211 |
- |
Flush Port: Ein Schreibzugriff mit beliebigem Datenwort
löst das sofortige Zurückschreiben des gecacheten Blocks auf
die Karte aus. (Dies wird in fclose() aufgerufen.) |
212 |
31..0 |
Adresse, an welcher der letzte Fehler (Write-Fail oder Command-Fail) aufgetreten ist, wird bei einem HaDes-Reset mit 0 initialisiert. (RO) |
XDcf:
Die XDcf steuert die Echtzeit-Funkuhr (Empfängermodul für DCF77-Signale von Conrad) an.
Das DCF77-Signal wird mit einer Datenübertragungsrate von
nur 1 Bit / Sekunde übertragen, daher lohnt es sich nicht,
größere Datenmengen in der XBus-Hardware zu puffern.
Stattdessen löst die XDcf immer bei einem neuen Zeitpuls (d.h.
zum Start jeder Sekunde) einen Interrupt aus (wenn dies aktiviert ist).
Im Datenregister kann zu diesem Zeitpunkt immer der Wert des Datenbits
ausgelesen werden, das beim vorigen Sekundenpuls übertragen wurde.
Interface:
Portadresse |
Bit |
Beschreibung |
224 |
0 |
1: Interrupt auslösen, wenn ein Sekundensignal detektiert wurde (Fehler max. 16 ms) |
1 |
letztes empfangenes Datenbit (ändert sich 1x pro Sekunde, READ ONLY) |
2 |
aktuelles DCF-Signal (Rohwert) (READ ONLY) |
31..3 |
Inhalt undefiniert |
|