zurück : weiter : inhalt
 

3.7 *** Hardwareprogrammierung

 

3.7.1 ** Register

Die Hardware im QL wird aus dem System heraus über eine Anzahl Register gesteuert. Dies sind (mit Ausnahme von PC.CLOCK) byteweise
PC.CLOCK .L $18000 R/W    
    $18002   PC.TCTRL W
    $18003   PC.IPCWR W
PC.IPCRD   $18020 R PC.MCTRL W
PC.INTR   $18021 R/W    
PC.TRAK1   $18022 R PC.TDATA W
PC.TRAK2   $18023 R    
    $18063   MC.STAT W

In {2} findet sich dazu kurz und prägnant die Anmerkung: "Die Einzelheiten der QL Hardware sind reichlich obscur. Es wird dem Anwender dringend abgeraten, diese Register in Programmen zu benutzen. Es sollte ausschließlich durch die Qdos-Traps oder vectorisierten Routinen darauf zugegriffen werden." Wir belassen es zunächst bei diesem freundlichen und nicht ganz verfehlten Rat der Herren Tebby & Karlin.  Weiter unten wird aber gezeigt werden, daß dies eher ein Problem der mangelhaften Dokumentation denn der Hardware ist, und insofern stark übertrieben.

Wagemutig soll hier nun also alles irgendwie gesicherte Wissen zur Hardware möglichst vollständig zusammengetragen und beschrieben werden. Erwähnung finden werden dabei alle Einheiten, die mit Hilfe der genannten Register steuerbar sind. Die Anmerkungen hierzu im Tabellenteil ergänzen das.

Für den Bildschirm gibt es die schon beschriebenen Trap-Aufrufe und Vectoren, dazu MT.DMODE (1/16) zum Lesen und Einstellen der Betriebsart. Außerdem das Schreib-Register auf $18063, mit einer Copie in SV.MCSTA:
 
 

Bit Verwendung
1 Abschalten des Bildes
3 Auflösung (0 für 512, 1 für 256, entspr. MODE)
7 Umschalten der Video-RAM-Bereiche
0, 2, 5, 6 reserviert, auf Null; Setzen kann unvorhersehbare Folgen haben.

Die Tastatur wird mit Hilfe von MT.IPCOM (1/17) abgefragt.
Auch der Tongenerator wird damit eingestellt.

MT.RCLCK (1/19), MT.SCLCK (1/20), MT.ACLCK (1/21) dienen der Uhrensteuerung. Es gibt jedoch kaum einen vernünftigen Grund, direkt an das Register zu gehen, da in jeder Situation die nötigen QDOS- oder Basic-Befehle zur Verfügung stehen.
Immerhin: Lesen läßt sich die Uhrzeit in $18000, Schreiben dorthin stellt sie ein.

Soweit, außer den noch folgenden kurzen Anmerkungen zu den seriellen Schnittstellen, nach {2} die Hinweise zu den Hardware-Registern.
 
 

3.7.2 ** Serielle Schnittstellen

Zitert {2}:
"Nur bei der seriellen Datenübertragung bleibt Platz für einen sinnvollen Zugriff auf die Register, der das System nicht stören kann. Die Quittungsleitungen zum Senden, DTR bei ser1, CTS bei ser2, können in Bits 4 & 5 des Statusregisters $18020 gelesen werden. Bei neuer Verdrahtung der Stecker könnten diese Leitungen als Datenleitungen benutzt und der Empfang dann rein softwaremäßig abgewickelt werden. Das XON-XOFF Handshake wäre durchführbar, es würde sich die Einstellung unterschiedlicher Baudraten ermöglichen lassen."

Konjunktive, Konjunktive...
Zu erproben, was das für einen Sinn haben mag, sei dem Leser überlassen.

Ziemlich witzlos, das ganze. Und im übrigen lassen sich gerade die SERiellen Schnittstellen sehr gut direkt mittels der Hardware-Register steuern.

Ein Beispiel im F6, "forth_scr", zeigt, daß die  Hardware längst nicht so obscur ist, wie sie vielleicht aus der naiven Sicht eines Programmierers erscheinen mag, und wie in {2} behauptet. Näher betrachtet wirft sie kaum nennenswerte Probleme auf. Naturgemäß wird allerdings nicht die geringste Fehlbedienung toleriert; in solchem Falle wird wenigstens das System unbrauchbar, oder es bricht gleich ganz zusammen!

Wickelt man den seriellen Datentransport direkt über die Register ab, läßt sich zudem eine beträchtliche Steigerung der Verarbeitungsgeschwindigkeit erreichen, da im ROM offenkundig mehr auf geringen Speicherbedarf denn auf Geschwindgkeit hin "optimiert" wurde. So werden z.B. die Parity-Prüfungen sämtlich rechnerisch durchgeführt, statt sehr viel schneller durch Tabellen.

In eigenen Versuchen hat sich außerdem gezeigt, daß Hardware und Programmierung der SER-Anschlüsse keineswegs so fehlerhaft sind, wie verschiedentlich angenommen. Es ist vielmehr so, daß einerseits die beteiligten Bauelemente recht empfindlich gegen Überspannung sind, die auch aus dem Telephonnetz heraus nicht selten zu Schäden führt, und daß andererseits die betr. Programme im System die dadurch verursachten Fehler verdecken, da sie meist auch dann noch funktionieren. Mit hoher Fehlerrate zwar, aber die wird gewöhnlich auf Entwurfsfehler der Hardware (wie könnte ein Programmierer, wenn überhaupt, auch anders denken) zurückgeführt, nicht auf schadhafte Bauteile und Programme, die diese Schäden überspielen.

Wenn der SER-Transport nicht zufriedenstellend abläuft, ist es darum immer ratsam, die Bauteile der Signalwege zu überprüfen, oder - oft ist das der einfachere Weg - sie gleich auszuwechseln (1488, 1489, IPC). Auch Bauteilfassungen und andere Steckkontakte sind häufige Fehlerquellen.

In allgemeinen wird es vorteilhaft sein, folgende Bauteile nachzusetzen:

An den SER-Ausgängen (vom1488, Pins 6, 3, 8, 11)

An den Hysterese-Eingängen des 1489A (Pins 2, 5, 9, 12) Dies sind Herstellerempfehlungen, welche meist allein aus Kostengründen außer acht gelassen werden. Gerade die 1489 sind dafür bekannt, daß sie u.U. bei offengelassenen Hysterese-Eingängen außerordentlich leicht zerstört werden.
 

Im "handshake"-Betrieb erprobte Anschlußverwendung, z.B. QL <-> PC:
 
 

SER2 Pin Ein-/Ausgang
25-Pin
 oder Modem PC, 25-Pin
GND 1   1, 7 GND 1, 7
TxD 2 A 2 TxD -> RxD 3
RxD 3 E 3 RxD -> TxD 2
RTS (QL: DTR) 4 A 4 RTS -> CTS 5
CTS 5 E 5 CTS -> RTS 4
DTR (QL: +12V) 6 A 20 DTR -> DSR 6
Zur Referenz die CCITT V.24 DEE Anschlußverwendung, auch EIA RS232, DIN 66020:
 
Pin Ein/Aus Name X = QL Verwendung an Null-Modem
1 A   X Schutzerde, Masse 1
2 A TxD X Sendedaten 3
3 E RxD X Empfangsdaten 2
4 A RTS X: DTR Anmeldung einer Sendung 5
5 E CTS X Bereitschaft des Partners 4
6 E DSR   Peripheriegerät betriebsbereit 20
7 A GND X Betriebserde, Signal-Rückleiter 7
8 E DCD   Angeschl. Gerät empfängt Träger - offen -
20 A DTR X: +12V Betriebsbereitschaft 6
22 E RNG   Ankommender Ruf - offen -
Pin 1 seit 1976 bei CCITT nicht mehr festgelegt
 
 

3.7.3 ** Netzwerk

Die Netzwerkleitungen sind mit Hilfe der Register auf den Adressen $18002, $18020, $18022 steuerbar. Weitergehende Angaben waren in den genannten Quellen nicht zu finden. Ergänzend zu den Anmerkungen in den Tabellen wäre etwa der Handler näher zu untersuchen. Eigene Messungen haben eine Taktung von ca 10 µs ergeben, was die bei den Protokollangaben genannten Zeiten bestätigt. Weiter liegen keine Daten vor, die geeignet wären, diese Dokumentation zu ergänzen.

Mit den Erweiterungen des TK2, insbes. dem Netzwerk-Fileserver, der selbst die Steuerung des QL von einem anderen Gerät aus ermöglicht, wurde das Netzwerk des QL zu einer vielseitigen, zuverlässigen und nutzbringenden Einrichtung ausgebaut, auf die freiwillig wohl nur noch verzichten wird, wer sie nie in Betrieb hatte.
 
 

3.7.4 ** Microdrives

Schon recht direkt laufen Steuerung und Datenaustausch mit den Vectoren ab, die den Datenverkehr mit den Microdrives unterstützen sollen. Alle diese Vectoren greifen auf die Adresse $18020 zu.

Vermittelt durch dasselbe Register ist direkte Steuerung sogar aus einem Basic-Programm heraus möglich. Dies zeigt das Beispiel nach {14} zum Erzeugen und Wiedergeben eines 100kHz-Prüfsignals auf MDV, mit dessen Hilfe der Signalweg kontrolliert werden kann. Weiter sind zwei Beispiele zur Auswahl eines Laufwerks und dessen Abschalten gegeben, eines in Basic und eines nach {2} in Assembler. Letzteres gibt auch Aufschluß über die erforderlichen Steuerzeiten.
 
 

PC.MCTRL $18020 schaltet den Motor
PC.TDATA $18022 zum Senden der Daten
PC.TRAK1 $18022 Leseregister Spur 1
PC.TRAK2 $18023 Leseregister Spur 2

Die Lauferksauswahl geschieht durch Senden eines Byte 3, dann einer 1. Danach bei Gerätenummern ab 2 noch je weiteres Laufwerk die Bytes 2 und 0. Zum Abschalten sendet man dieselbe Sequenz, beginnt aber gleich mit 2 und 0.

Also etwa für MDV5 an $18020 die Folge

3, 1, 2, 0, 2, 0, 2, 0, 2, 0
und zum Abschalten aller acht möglichen Laufwerke
2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0.
Das Schreiben ist, bedingt durch das bereits dargestellte Aufzeichnungsprotokoll, ein recht verwickelter Vorgang. Wer dem nachgehen will, mag einen Blick in's Rom tun:

Bit 1 von $18020 ist zu testen. Wenn es auf Null steht, kann in Register $18022 das Datenbyte eingetragen werden. Gesendet wird es dann durch den Baustein ZX8302 bitweise abwechselnd auf beide Spuren.
Sinnvollerweise wird man sich der QDOS-Traps bedienen, für den Direkzugriff der besondern "MD."-Vectoren.
Die Vectoren erhalten in A1 die Adresse eines Datenpuffers und A3 zeigt auf  $18020.

Aufruf mit Offset $4000 zum Vector:
 
 

MD.READ $0124 Lesen
MD.WRITE $0126 Schreiben (s. File "lbl_mdwrite" in PiQdsk)
MD.VERIN $0128 Vergleichen
MD.SECTR $012A Sector Header lesen

Fehlermeldung hier durch Rückkehr an eine Adresse, die situationsgemäß justiert wird. Das Weitere geht aus den Erläuterungen der Vectoren hervor.
 

3.7.5 ** I.P.C.

Allüberall werden wir gewarnt: Beim QL besonders zum IPC zeigen die Quellen mehr Warnung als Belehrung. Die Warnung interessiert hier nicht sonderlich, um so mehr alles, was auch immer irgendwo an nützlichen Hinweisen zu extrahieren war. Nicht zuletzt auch, weil sich die IPC-Kommandos, die mehr als 8 Bits zurückgeben, nur auf dem direkten Wege über die Register verwenden lassen. MT_IPCOM ist dazu ungeeignet, weil damit nicht mehr als 8 Bits empfangen werden könen. Dem IPC müssen aber, sowie die Antwort einmal angefordert worden ist, unbedingt alle Bits abgenommen werden, bevor ein neues Kommando dorthin gelangt.

Vor weiteren Beschreibungen hier erst einmal die Leitungen des IPC mit allen Anschlüssen und den Namen:
 
 

Name Art Pin QL-Name & Verwendung
T1 Eingang 39 4 * Baudrate
*WR Ausgang 10 COMCTL, Datenleitung intern
P10..P17 E/A 27..34 Tastaur-/Joystick-Ausgänge
P20 E/A 21 RS232 Daten Empfangen
P21 E/A 22 Lautsprecher
P22 E/A 23 *IPL0-2 an 68008
P23 E/A 24 *IPL1 an 68008 und ZX832
P24, P25 E/A 35, 36 RS232 Quittung
P26 E/A 37 offen
P27 E/A 37 CAMDATL, Datenleitung intern
D0..D7 E/A 12..19 Tastatur decodieren
*RESET E 4 vom Processor
*SS E 5 über 4k7 an Vcc
EA E 7 über 1k an Vss
T0 E 1 offen
*RD A 8 offen
*PSEN E 9 offen
ALE A 11 offen
PROG E/A 25 offen
Vss   20 GND, 0V Versorgung
Vdd   26 Vcc, Standby, Vpg
Vcc   40 +5V Versorgung
´*' am Anfang oder 'L' am Ende einer Bezeichnung markieren negative Logik, d.h. aktives Signal hat niedrigen Pegel.

Nicht alle angegebenen Leitungen sind dem Software-Zugriff offen. Wie es aussieht, kann bei eingebauten Processor der Rom-Inhalt gelesen werden.

Außer seinem Programmspeicher im ROM hat der Processor nur im eingebauten RAM einen freien Arbeitsspeicher von 96 Bytes. Die Pufferbereiche darin für beide SER mit je 31 Bytes und die Tastatur mit 7 Bytes konnten darum nicht sonderlich groß geraten. Der Inhalt dieser Puffer kann auch nach Schließen der Schnittstellen noch entnommen werden. Die Kontrolle darüber obliegt dem Programmierer, Möglichkeit dazu ist im Übertragungsprotokoll vorgesehen. Die sonstigen I/O-Qdos-Traps berücksichtigen das bereits.

Für den Datenaustausch sind 6800x und IPC durch eine Steuerleitung und eine Datenleitung über den ZX8302 als Mittler verbunden. Das sind COMCTRL an *WR des 8049 und COMDATAL an P27. Zugriff darauf ist der Software nicht möglich. Dies kann vermittels der Register auf $18003 und $18020 geschehen, über welche das Logikarray ZX8302 den Datenverkehr abwickelt. PC.MCTRL zum Einstellen des Status PC.MCRD auf derselben Adresse zum Lesen der Antwort und PC.IPCWR zum Senden.

Man setzt dazu die zu sendenden Bits der Reihe nach in Bit 1 eines Byte %000011x0 und schreibt dies in die Adresse PC.MCTRL. In der begründeten Hoffnung, daß Logikarray und Coprocessor nun ihre Arbeit aufnehmen, schreibt man gleich danach in Gestalt des Byte %00001110 die Anforderung auf ein Antwortbit dorthin. Jetzt liest man PC.IPCRD solange, bis eine Null in Bit 6 angekommen ist. Bit 7 enthält dann die Antwort {18, 2/3}.

Dies ist eine umständliche Procedur, zudem verliert bei einem Fehler mit einiger Sicherheit die CPU die Kontrolle über das System. Der Umgang mit den Registern ist aber bei etwas Sorgfalt durchaus zu bewältigen; nochmals sei dazu auf die Anwendungen im F6 und die Quelltexte dazu in "forth_scr" verwiesen.

Durch die Trap MT.IPCOM ist das Verfahren aber wesentlich erleichtert und überschaubar gemacht worden. Auch damit ist die Übertragung noch ganz ungeschützt gegenüber einem Bedienungsfehler. Vom IPC ist sicherlich nicht mehr zu erwarten, als vom Haupt-Processor des QL auch.
Auch der zugehörige Trap-Aufruf MT.IPCOM wird daher nicht alle Fehler abfangen können. Er muß genauso sorgfältig bedient werden, wie die CPU selbst.

MT.IPCOM (1/17) sendet einen Befehl zum IPC.
Außer A3 als der Adresse einer Befehlstabelle sind keine weiteren Angaben nötig. In der Tabelle stehen die Arbeitscodes für den Hilfsprocessor, als erstes Byte die Operation.
Eine dort angeforderte Antwort des IPC kommt in D1 als Byte zurück. D5 und D7 können verdorben werden.
 

Die möglichen Operationen sind:
 
 

RESET.CMD 0 Software-Reset des IPC. Tongenerator abgestellt, 
Puffer aufgegeben, SER-Schnittstellen geschlossen, 
Empfangsbereitschaft bei erneuter Abfrage der Tastatur.
STAT.CMD 1 Holt den Eingabestatus. Gesetzte Bits in D1 bedeuten:
STAT..KPN 0 Tastaturpuffer hat Zeichen empfangen
STAT..SON 1 Tongenerator in Betrieb
STAT..IP1  4 SER1-Puffer hat Zeichen empfangen
STAT..IP2  5 dto., SER2
STAT..WP  6 MDV-Schreibschutz abgeschaltet
OPS1.CMD 2 SER1 zum Lesen öffnen, Eingabepuffer breithalten 
P24 des IPC sendet das Quittungssignal CTS für SER1, 
P25 ebenso DTR für SER2. 
*INT leitet mit dem Startbit den Empfang an P20 ein. 
OPS2.CMD dto., SER2
CLS1.CMD 4 SER1 schließen, Puffer bleibt erhalten
CLS2.CMD dto., SER2
RDS1.CMD 6 Nach einem Statusbyte folgen 
RSST.NO 
  %00111111 Bit 0 - 5 Anzahl Bytes
RSST..FE1
  Bit 6 Fehlendes Stop-Bit in SER1
RSST..FE2
  Bit 7 dto., SER2
RDS2.CMD 7 Für SER2 wie RDS1.CMD
RDKB.CMD 8 Tastatureingabe lesen. erst Statusangabe in 4 Bits mit den Masken
RDKB.NO 
  %0111 3 Bits Anzahl empfangener Zeichen
RDKB.RPT   %1000 Bit 3 bei Tastenwiederholung 
12 Bits für jedes Zeichen, erst in 4 Bits
RDKB..ALT
  Bit 0 ALT-Taste
RDKB..CTL
  Bit 1 CTRL-Taste 
RDKB..SFT
  Bit 2 SHIFT-Taste
RDKB..OVF
  Bit 3 Tastenpuffer ist übergelaufen
KBDR.CMD 9 Tastaturmatrix lesen. (wie KEYROW) P10 - P17 des IPC senden das zugehörige Abtastsignal, D0 bis D7 liefern das Signal für die betätigte Taste.
INSO.CMD 10  Tongenerator einschalten. P21 des IPC steuert den Lautsprecher.
KISO.CMD 11 Tongenerator abschalten
MDRS.CMD 12 Bit 0 setzt P26 des IPC.
BAUD.CMD 13 (s. Tabellen) T1 mit der vierfachen Baudrate als Takt
RAND.CMD 14 Erzeugen einer einfachen Zufallszahl
TEST.CMD 15 Ein Byte soll unverändert zurückgehen. 
Wo nicht, ist der IPC kaputt.

Als Befehls- und Parametertabelle ist dem IPC anzugeben:
 
 

Byte Inhalt
1 Der IPC-Befehl in den niederwertigen 4 Bits
2 Die Anzahl der angegebenen Parameterbytes
3 - 6 Länge des zu Sendenden Teils je Parameterbyte
7 ... Die Parameterbytes
Schluß  Länge der Antwort 

Bytes 3 bis 6 als Langwort und das abschließende Byte in den Bits 0 und 1 codieren den jeweils gültigen Anteil der ggf. zu sendenden Parameter. Das letzte Byte wird an niedrigster Stelle codiert, dann weiter in aufsteigender Bitfolge bis zum ersten Byte:

00 Die niederwertigen 4 Bits
01 Keines
10 Alle 8 Bits
11 Keines
Das jeweils ungesetzte niederwertige Flagbit  gibt die Sendeaufforderung,
das höherwertige Bit steht für die Anzahl 4 Bits, wenn es ungesetzt ist, sonst 8 Bits.

Diese Tabelle muß  immer vollständig ausgefüllt sein, bei nicht vorhandenen Parameterbytes wird 01 oder 11 eingetragen. {1} und {2} geben gleichlautend folgende Beispiele mit der Anmerkung dazu in {1}:

"Die überwiegende Anzahl der IPC-Befehle wurde zur Verwendung im Betriebssystem geschaffen, sie sollen nicht in Anwendungsprogrammen eingesetzt werden. Solch Unterfangen könnte im Verlust von Daten enden, oder Schlimmerem. Es gibt jedoch drei Befehle darunter, die für die Nutzung in Anwendungsprogrammen gestaltet wurden."

Insbes. ist darauf zu achten, daß nur solche Aufrufe benutzt werden, die nicht mehr als 8 Bits und nicht mehr als ein Byte zurückgeben, und daß diese auch sofort abgeholt werden. Es muß nämlich unbedingt vor einer neuen Abfrage dem IPC stets die ganze Antwort abgenommen werden, damit die Kommunikation mit dem Hauptprocessor nicht außer Tritt gerät. Andernfalls bleibt das Sytem stecken.
Genannte "neue" Abfragen entstehen z.B. bereits durch das automatisch im Hintergrund ablaufende Lesen der Tastatur.
 
 
 

Kommando 9 eine Tastaturzeile lesen:
  Parameter
  4 Bits für die Zeilennummer
  8 Bits Antwort Tastenwertigkeit
 
Kommando 10 Tongenerator in Betrieb setzen:
  8 Parameter
  8 Bits erste Tonhöhe
  8 Bits zweite Tonhöhe
  16 Bits Abstand zwischen Sprüngen der Tonhöhe
  16 Bits Dauer
  4 Bits Sprung der Tonhöhe
  4 Bits Schleifen
  4 Bits Zufallsfaktor der Sprungweite im Ton
  4 Bits Störfaktor (variierender Sprungabstand)
  keine Antwort
 
Kommando 11 Tongenerator abschalten:
  keine Parameter
  keine Antwort.

KEYROW-WERTE

  JM-/JS-Tastatur   MGG-Tastatur
    1 2 4 8 16 32 64 128     1 2 4 8 16 32 64 128
  0 F4 F1 5 F2 F3 F5 4 7   0 F4 F1 5 F2 F3 F5 4 7
  1 RTN left up ESC right \ SPC down 1 RTN links hoch ESC rechts < SPC runter
  2 [ Z . C B £ M ;   2 + Y . C B \ M Ä
  3 ] LOCK K S F = G ~   3 Ü LOCK K S F # G Ö
  4 L 3 H 1 A P D J   4 L 3 H 1 A P D J
  5 9 W I TAB R - Y O   5 9 W I TAB R ß Z O
  6 8 2 6 Q E 0 T U   6 8 2 6 Q E 0 T U
  7 SH CTRL ALT X V / N ,   7 SH CTRL ALT X V - N ,

 
 
 
 

3.7.6 ** Systemvariable

Auch in den Systemvariablen gibt es einige Adressen, die mehr oder weniger mit der Hardware in Zusammenhang stehen:
 
SV.POLLM $30(sb) .w übergangene Polled Interrupts
SV.TVMOD $32(sb) .b FS- oder Monitor-Bild
SV.SCRST $33(sb) .b Bildschirm abgeschaltet
SV.MCSTA $34(sb) .b Copie von MC.STAT, Bildsteuerung
SV.PCINT $35(sb) .b Copie Interrupt-Register PC.INTR
SV.ARBUF $8A(sb) .w jüngste Taste, nach ALT im höherwertigen Byte
SV.ARDEL $8C(sb) .w  Verzögerung d. Tastenwiederholung
SV.ARFRQ $8E(sb) .w Periodendauer dazu
SV.TMODE $A0(sb) .b Sendemodus ZX8302 mit Baud-Rate
Besonders SV.ARBUF kann sich als hilfreich erweisen. Damit ist etwa aus einem Basic-Programm heraus die Eingabe auch in anderen Jobs zu überwachen und kann mit besonderen Aktionen quittiert werden.

Die Variable, in Wortlänge gelesen, liefert dasselbe, wie

ARBUF=CODE(INKEY$(-1))+256*CODE(INKEY$)
solange, bis eine andere Taste betätigt wurde.

Hier ist jedoch keine Trennung zwischen Jobs möglich. Die Arbeit damit kann also nicht auf ein ausgewähltes Programm beschränkt werden. Die globale Überwachung allen Geschehens kann aber auch sehr vorteilhaft sein.

Dies ist eine der wenigen Stellen für risikofreies POKE, darum kann der Code auch programmiert zur Steuerung herangezogen werden.

Weil es sonst ja viel zu einfach wäre, wurde im SMSQ und bei der E-Software (Atari, SMSQ/E) die Anordnung für ALT-Kombinationen verdreht, dort steht der Tastencode dann im niederwertigen und die Flag $FF im höherwertigen Byte. Das Datenwort auf SV.ARBUF stimmt dann also nicht mehr mit der o.a. einfachen Basic-Sequenz überein.
 
 

3.7.7 ** Peripherie-Erweiterung

Der QL ist mit drei Steckern zur Erweiterung ausgestattet. Deren Anschlußbelegung ist im User-Guide zu finden:

1. MDV-Erweiterung,
wo Laufwerke des Spectrum anzuschließen sind.

2. ROM-Erweiterung,
wo das System-ROM von 48K Bytes um 16K ergänzt werden kann. Die ROM-Erweiterung soll besonders die Zusatzausstattung des Betriebssystems und die feste Installation von Jobs ermöglichen, ist aber auch anderweitig nutzbar. Da dort aber keine Leitung für die Schreibfreigabe vorhanden ist, eingeschränkt dadurch, daß Daten von außerhalb des eigenen Bereiches dorthin nicht geschrieben werden können - man kann sich hier z.B. mit der Auswertung der Adressierung eines 256-Byte-Bereichs behelfen.
Neben der direkt an das Betriebs-Rom anschließenden Adresse $C000 können noch weitere Basisadressen benutzt werden, deren Bereich unterhalb SV.RAMT liegt.

3. Erweiterungs-Bus,
wo alle Leitungen des Processors, dazu Video- und einige besondere Steuersignale zur Verfügung stehen. Hier können beliebige Erweiterungen angebaut werden. An Speichererweiterungen ein Modul, dann bis zu 16 * 16K Bytes ROM, oder irgendwelche anderen Baugruppen.

Für die Speichererweiterungen gelten gewisse Konventionen:
Das System sucht beim Kaltstart nach irgendwo vorhandenen Rom-Erweiterungen. Die Suche beginnt mit $C000 und wird bei SV.RAMT-16K fortgesetzt, solange, bis maximal 16 solcher Erweiterungen erkannt und in das Sytem eingefügt sind oder bis der erlaubte Bereich überschritten wurde. Minerva tastet auch noch die Bereiche $10000 und $14000 ab, die in allen Geräten frei nutzbar sind (nur bedingt mit Gold-Card oder Trump-Card).

Dafür sucht das System an der jeweiligen unteren Bereichsgrenze nach einem ROM-Header:
 
 

$4AFB0001 markiert Vorhandensein eines Erweiterungs-ROM
$xxxx Null oder Ptr als relative Adresse zum Anfang auf eine Tabelle einzufügender Basic-Befehle entsprechend dem für BP.INIT Gültigen.
$xxxx Ptr auf eine Initialisierungs-Routine. Dort darf A6 nicht geändert werden, A0 sowie A3 sind zum Schluß wiederherzustellen. 
Im Stack sind bis zu 128 Bytes frei verwendbar.
$xxxx Längenangabe eines auf 36 Zeichen begrenzten
$x.. Identifikations-String, abgeschlossen mit LF

Sämtliche Programme müssen relocatibel sein, da die Einordnung in den Adressenbereich durch System und Steckplatz bestimmt ist. Das gestattet außerdem, mehrere gleichartige Erweiterungen zur selben Zeit unabhängig voneinander zu verwenden.

Es gibt (gab, muß man inzwischen wohl sagen, der Verfasser konnte niemanden auftreiben, der ein Solches besitzt) zum QL ein Erweiterungsteil im Gehäuse mit Stromversorgung und Steckplätzen. Mittels geigneter Rückwandverdrahtung können entsprechend codierte Karten automatisch die richtige Adressierung ungeachtet des Steckplatzes einstellen.

Die Adresse wird decodiert aus SP0 bis SP3 und A14 bis A17 mit Hilfe etwa eines 4-Bit-Comparators. Sie kann in Form einer Geräteadresse ähnlich wie beim GPIB der Karte selbst eingeprägt werden. Vorgesehen ist vollständig relocatibler Einsatz auch dieser Erweiterungen und Aktivierung über zugehörige Device Handler oder ergänzende Basic-Befehle.

SP0 - SP3 haben anfangs Null-Signal, entsprechend der Zahl Null, auf der Hauptplatine des QL fest verdrahtet. Jeder der bis zu sechzehn Steckplätze ist um Eins höher codiert, bewerkstelligt durch eine geeignete Schaltung auf der Erweiterungskarte, die den neuen Wert dann an die nächste Karte in der Kette weitergibt.
Die Auswahllogik der Steckkarte vergleicht die Leitungen A14 bis A17 mit dem Zustand der Auswahlleitungen S0 bis S3, die Karte gilt bei Übereinstimmung als decodiert.
 
 


  oben : zurück : weiter : inhalt

(count)