Der
ST auf 16 MHz
Die Maxon-Coprozessor-Cache-Erweiterung
MACH 16
Jeder
hat sich wahrscheinlich schon einmal (zweimal, dreimal..) gewünscht,
seinem ST mehr Dampf machen zu können. Jetzt gibt es mit der MAXON-Coprozessor-Cache-Erweiterung
(MACH16) für jeden Bastler die Möglichkeit, sich diesen Wunsch zu erfüllen
(für handwerklich nicht so Versierte ist natürlich auch ein Fertiggerät
erhältlich).
Der Prototyp der MACH 16
Das Konzept
Der erste Gedanke zur Beschleunigung des ST ist natürlich, die Taktfrequenz
des Prozessors zu erhöhen. Der MC68000 wird mit 16 MHz statt mit 8MHz
getaktet. Damit wird die Rechenleistung aber noch lange nicht verdoppelt,
da der Prozessor sich immer noch mit langsamen Buszugriffen abquälen
muß. Deshalb sind zusätzlich auf der Karte noch 16 kBytes schnelles
Cache-RAM vorhanden, das als Direct-Mapped-Cache (das Fremdwort wird
unten erklärt) organisiert ist. Darauf kann der Prozessor mit voller
Geschwindigkeit zugreifen, wodurch der ST bis doppelt so schnell läuft.
Für besonders kritische Programme (Zeitschleifen!) kann der Cache-Speicher
natürlich auch abgeschaltet werden.
Wer es gern noch schneller hätte, kann zusätzlich noch den numerischen
Coprozessor M68881 bestücken. Dieser wird auch mit 16 MHz betrieben
und vervielfacht noch einmal die Rechenleistung bei Fließkommaoperationen.
Die Einbindung des M68881 in den ST ist kompatibel zu der ATARI-Koprozessorerweiterung,
so Der Prototyp der MACH16 daß alle Programmpakete mit Coprozessorunterstützung
(z.B. Turbo-C) funktionieren.
Bevor nun aber genauer auf die Schaltung eingegangen wird, möchte ich
an dieser Stelle die von mir verwendete Beschreibung von Logikpegeln
erläutern. Es werden nur die Bezeichnungen 'aktiv' und 'inaktiv' bzw.
'nicht aktiv' verwendet. Dies geschieht, um Verwirrungen bei Active-Low-
und Active-High-Signalen zu vermeiden. Alle verwendeten Signalbezeichnungen
beziehen sich auf den Schaltplan. Active-Low-Signale werden durch ein
vorangestelltes T gekennzeichnet. Zur Verdeutlichung: ein aktives Active-High-Signal
hat den Logikpegel 1, ein aktives Active-Low-Signal den Logikpegel 0.
Das Cache-Prinzip
Wie oben schon erwähnt, wird ein mit 16 MHz getakteter Prozessor durch
die langsame Peripherie stark gebremst. Um dem Prozessor nun aber Daten
(natürlich auch Befehle) schnell zugänglich zu machen, befinden sich
auf der Platine 16 kBytes schnelles RAM (8 k * 16 Bit), in dem Kopien
des Hauptspeichers (RAM und ROM) gehalten werden. Will nun der Prozessor
aus dem Hauptspeicher lesen, wird zuerst überprüft, ob sich schon eine
Kopie des zu lesenden Speichers im Cache befindet. Ist dies der Fall,
liegt ein 'Cache Hit' vor, und es wird aus dem schnellen RAM mit einem
16 MHz-Buszyklus (vier Takte, 250 ns) gelesen. Ansonsten ('Cache Miss')
muß auf den Hauptspeicher zugegriffen werden. Dabei werden für den Prozessor
Wartezyklen eingebaut, und ein Buszyklus dauert acht Takte (500 ns),
was einem normalen 8 MHz-Zugriff entspricht. Auch bei einem Zugriff
auf die I/O-Peripherie wird ein 'langsamer' Buszyklus benutzt. Zusätzlich
wird auf den Hauptspeicher lesend immer in Wortbreite zugegriffen, wodurch
bei aufeinanderfolgenden Byte-Zugriffen des Prozessors jedes zweite
Byte aus dem Cache gelesen wird.
Damit die Daten im Cache-Speicher immer denen im Hauptspeicher entsprechen,
muß man sie natürlich auch bei Schreibzugriffen aktualisieren. Dabei
werden gleichzeitig der Cache- und der Hauptspeicher mit eimem acht
Takte dauerndem Buszyklus beschrieben (Write Through Cache). Bei dieser
Realisierung erfolgt allerdings nur die Auffrischung der schon im Cache
vorhandene Daten. Das hat den Vorteil, daß das Cache auch schon beim
Speichertest während des Kaltstarts des ST aktiv sein kann. Zur Erklärung:
Die Speichertestroutine bestimmt die Speicherbelegung durch Beschreiben
und anschließendes Probelesen von einzelnen Adressen. Würde nun durch
jeden Schreibzugriff direkt das Cache aktualisiert, erhielte man immer
das Ergebnis, daß der ST mit vier MByte bestückt sei. Der Vergleich
der beiden Cache-Algorithmen ergab auch keine Unterschiede in der Rechenleistung,
so daß guten Gewissens der günstigere gewählt werden konnte.
Da der vorgesehene Cache-Speicher relativ klein ist, muß man recht häufig
(bei einem Cache-Miss) entscheiden, welche Daten im Cache überschrieben
werden können. Ideal wären natürlich die Daten, die der Prozessor nicht
mehr braucht. Allerdings ist ein solcher 'Kaffeesatzalgorithmus' noch
nicht entwickelt worden (wenn doch jemand einen kennen sollte, bitte
den Autor benachrichtigen). Zum Erreichen von möglichst hohen Cache-Hit-Raten
sind allerdings verschiedene Strategien bekannt. Wir verwenden die einfachste
(und billigste!) Methode, das Direct-Mapped-Cache.
Jeder Adresse des Hauptspeichers weist man eine Adresse im Cache zu.
Dazu sind außer den Daten-RAMs (6264) auch noch sehr schnelle Cache-Tag-RAMs
(IDT7174S) vorhanden. Ihre Adreßeingänge sind genauso wie die der DatenRAMs
mit den unteren dreizehn Adreßleitungen des Prozessors (A1-A13) verbunden.
Durch diese unvollständige Adreßzuordnung wird ein Speicherwort der
Cache-RAMs vielen Hauptspeicherwörtern zugeordnet, die jeweils 16 kBytes
auseinanderliegen. Um nun feststellen zu können, welche Hauptspeicherzelle
in den Daten-RAMs gespeichert ist, sind die restlichen zehn Adreßleitungen
des Prozessors mit den Daten-Pins der CacheTag-RAMs verbunden. Außer
den Daten wird also auch noch der obere Teil der Adresse gespeichert.
Wie erkennt die Cache-Steuerung nun aber, ob die vom Prozessor gewünschte
Adresse im Cache liegt? Da kommen die speziellen Eigenschaften der Cache-Tag-RAMs
ins Spiel. Sie haben zusätzlich zu dem normalen RAM-Innenleben noch
einen Komparator integriert, der die außen an den Daten-Pins anstehenden
Datenmuster mit den gespeicherten vergleicht (für Insider: wenn /CS
aktiv und /OE, /WE inaktiv). Das Ergebnis des Vergleichs wird am MATCH-Pin
bekanntgemacht. Dieser Ausgang ist ein Open-Drain-Anschluß, so daß man
leicht mehrere Bausteine parallel anschließen kann (wie geschehen).
Das so erzeugte Signal meldet der Logik einen auftretenden Cache-Hit
(das Signal ist im Schaltplan mit HIT bezeichnet).
Als zweite
spezielle Eigenschaft besitzen die Cache-Tag-RAMs einen Löscheingang
(/CLR), mit dem der Inhalt schnell (bei den benutzten RAMs in 65ns)
gelöscht werden kann. Damit kann das gesamte Cache in besonderen Betriebszuständen
als ungültig markiert werden. Dazu sind die nicht benutzten Daten-Pins
mit VCC (+5V) verbunden. Die dort anliegenden Datenmuster (natürlich
logisch eins) werden auch mit dem Inhalt der angewählten Speicherzelle
verglichen, wodurch sich bei gelöschtem Cache immer ein Cache-Miss ergibt.
Die erwähnten besonderen Betriebszustände, bei denen das Cache gelöscht
wird, sind:
- RESET des Prozessors.
Insbesondere beim Power-On-Reset ist der Cache-Inhalt undefiniert.
- Busfreigabe des
Prozessors. Da der DMA-Chip des ST seine Daten unter Umgehung des
Adreßbusses direkt in den RAM-Speicher schreibt, können die Zugriffsadresse
nicht ermittelt und wie bei einem Prozessorzugriff das Cache aktualisiert
werden. Die Daten im Cache könnten also ungültig sein. Die Busfreigabe
ist mit /BGACK erkennbar.
- Abschaltung des
Caches. Das wäre nicht unbedingt nötig, ist aber am einfachsten zu
realisieren.

Bild 1b: Anschlußplan der FPU
Die Schaltung
Nachdem der Schaltplan schon angesprochen wurde, kommt hier eine
kleine Übersicht. Da wäre zunächst einmal IC 1, die 16 MHz-CPU MC68000.
Die meisten Pins der CPU sind mit den entsprechenden Pins des CPU-Sockels
verbunden, der die alte CPU ersetzt (zum Einbau später mehr). Nur /AS,
/UDS, /LDS und /DTACK sind davon ausgenommen und werden von der Cache-Steuerung
übernommen. Ferner ist der Takteingang CLK mit dem 16 MHzTakt CL 16
verbunden.
1C2 und 1C3 sind die Cache-Tag-RAMs IDT7174S-35. Das -35 bedeutet 35
ns Zugriffszeit. Der Anschluß der Adreßund Datenleitungen wurde schon
erklärt. Die ICs sind immer selektiert (/CS ist mit Masse verbunden),
die Ausgangstreiber immer desaktiviert (/OE auf VCC). Für die Cache-Steuerung
wird mit den beiden MATCH-Ausgängen und R5 das Signal HIT erzeugt, das
ein Cache-Hit anzeigt. /CLR ist der Löscheingang, und mit /WE können
die Cache-Tag-RAMs beschrieben werden.
Für die Daten-RAMs 1C4 und 1C5 genügen die langsameren Speichertypen
6264LPIO mit 'nur' 100 ns Zugriffszeit. 1C4 speichert die unteren acht
Daten-Bits DO bis D7, während 1C5 für D8 bis D15 zuständig ist. Auch
an diesen Bausteinen ist das Chip-Select mit dem Anschluß von /CE 1
und CE2 an Masse bzw. VCC immer aktiv. Die Ansteuerung der Ausgangstreiber
für einen Lesezugriff erfolgt gemeinsain über /DOE. Im Gegensatz dazu
können 1C4 und 1C5 mit /LDW und /UDW getrennt beschrieben werden.
Der Anschluß des Fließkomma-Coprozessors MC68881 (ICIO) an den MC68000
ist relativ einfach. Da der MC68881 einen 32-Bit breiten Datenbus besitzt,
muß jede Datenleitung des Prozessors zweimal angeschlossen werden. Daß
der MC68000 nur einen 16-Bit Datenbus besitzt, wird dem Coprozessor
mit /SIZE an WC und AO an Masse mitgeteilt. Die Registerwahl im MC68881
geschieht durch A1 bis A4, wodurch 16 16-Bit-Register unterschieden
werden können. Dieser 32-ByteAdreßbereich wird durch das Chip-Select
/FCS (erzeugt in IC6) ab der Adresse $FFFA40 (kompatibel zum ATARI-Coprozessor)
in den Adreßraum des Prozessors eingeblendet. /RESET, /AS und R/W sind
mit den gleichnamigen Signalen des Prozessors verbunden, /DSACKI mit
dem System-DTACK-Signal /SDT. /DS (Data Strobe) wird mit zwei NANDs
in 1C9 aus /UDS und /LDS gewonnen. Der Takteingang ist natürlich an
den 16 MHzTakt CL16 angeschlossen.
Bild 1a: Schaltplan der MACH 16 (ohne FPU) - Anklicken um zu
Vergrößern
Cache-Steuerung
Kommen wir nun zum Kern der Schaltung, zur Cache-Steuerung. Sie ist
mit den drei GALs IC6 bis IC8, entsprechend GAL1 bis GAL3, realisiert.
Die einfachste Funktion hat IC6 (GAL1) zu erfüllen. Es stellt einen
simplen Adreßdekoder dar. Die Logikgleichungen dafür sind dem GAL-Listing
1 zu entnehmen. Die Ausgänge sind mit '.T' als Tri-State-Ausgänge konfiguriert.
Dadurch können einige Ausgänge abgeschaltet und als (Adreß-) Eingänge
benutzt werden. Das Signal MEM wird aktiv, wenn ein Zugriff auf den
Hauptspeicher (RAM oder ROM) erfolgt. Dazu werden die Adressen $000000
bis $3FFFFF und $FCOOOO bis $FEFFFF dekodiert. /FCS ist das Chip-Select-Signal
für den Coprozessor und wird für die Adressen $FFFA40 bis $FFFA5F aktiv.
In IC8 (GAL3) sind die DTACK-Steuerung und die Cache-Löschlogik zusammengefaßt
(siehe GAL-Listing 3). Die Cache-Löschlogik ist schnell beschrieben.
Sie faßt die drei oben beschriebenen Bedingungen zum Löschen der CacheTag-RAMs
durch eine OR-Verknüpfung zusammen.
 |
Die
GAL-Listings |
Listing 1 - Anklicken
um zu Vergrößern |
Listing 2 - Anklicken um zu Vergrößern |

Listing 3-
Anklicken um zu Vergrößern |
Die DTACK-Steuerung
Die DTACK-Steuerung im GAL3 ist als synchrones Schaltwerk (Mealy-Automat)
entworfen. Das bedeutet, daß der Baustein mit einem Taktsignal, hier
dem im Vergleich zum Prozessor invertierten 16MHz-Takt, betrieben wird.
Die Ausgänge des Schaltwerkes wechseln nur mit der steigenden Flanke
des Taksignals ihren logischen Zustand. Dazu werden die Ausgangszellen
des GALs mit '.R' als Registerausgänge definiert. Aus den Logikgleichungen
im Listing zu GAL3 läßt sich die Funktion des Schaltwerks jedoch kaum
erklären. Die Gleichungen sind allerdings auch das Ergebnis eines GAL-Assemblers,
der direkt den Entwurf von synchronen Schaltwerken zuläßt. Für den Entwurf
werden bestimmte Bit-Muster der Ausgänge sogenannten Zuständen zugeordnet.
Das Verhalten des Schaltwerkes wird dann nur noch durch den Wechsel
von einem Zustand zum nächsten bestimmt. Welcher Zustandswechsel zur
Durchführung kommen, hängt nur von den Eingangssignalen ab und wird
in einer Übergangstabelle beschrieben.
Das GAL-Listing 4 zeigt die Entwurfsdatei des Schaltwerkes für den benutzten
GAL-Assembler. Obwohl das Schaltwerk in einem GAL16V8 realisiert wurde,
mußte ich in diesem Listing als Typ ein GAL20V8 angeben, da der GAL-Assembler
für ein GAL16V8 beim Entwurf von synchronen Automaten nur acht Eingangsvariablen
zuläßt, aber hier neun benutzt wurden. Weil aber nur die aus dem Entwurf
resultierenden Logikgleichungen in das GAL-Listing 3 kopiert werden
mußten, stört dies nicht. Nach dem Schlüsselwort 'declaration' werden
die Anzahl der Eingänge (x-var) und die Anzahl der synchronen Ausgänge
(z-var) definiert. Danach folgt mit 'pins' die Namensgebung für die
Ein- und Ausgänge. Die Pin-Nunimem sind nur aus syntaktischen Gründen
angegeben und haben hier keine Bedeutung.
Unter 'x-names' legt man die Reihenfolge fest, in der die Eingänge später
in der Übergangstabelle aufgeführt werden:
1.
AS
|
Address-Strobe
des Prozessors
|
2.
MM
|
DTACK-Signal
der ST- Peripherie
|
3.
CL8
|
8
MHz Takt
|
4.
MEM
|
Speicherdekodierung
von GAL1
|
5.
HIT
|
Cache-Hit-Signal
der Cache-Tag-RAMs
|
6.
WR
|
Read/Write
des Prozessors
|
7.
ENAB
|
Cache
eingeschaltet
|
8. RESET
|
Na,
was wohl?
|
9.
FCS
|
Chip-Seleet
des Coprozessors
|
Hier werden alle
Signale zum besseren Verständnis als Active-High angenommen. Der wirkliche
Signalpegel ist mit der Namensgebung unter 'pins' definiert. Dann bestimmt
man mit 'z-names' die Reihenfolge der Ausgänge für die Zustandskodierung.
STO bis ST2 sind reine Zustandsausgänge, die nur intern rückgekoppelt
werden. PAS hingegen kann man als ein verzögertes AS-Signal betrachten.
Es findet Verwendung, um die Zugriffszeiten der Cache-Tag-RAMs auszugleichen.
Mit Aktivierung von PAS wird in GAL2 die Entscheidung getroffen, ob
ein Cache-Hit vorliegt oder nicht. Die Zustandskodierungen legen Sie
unter 'z-values' fest. Die Zustände sind mit s1 bis s9 bezeichnet und
willkürlich festgelegt, wobei s7 nicht existiert. Nur die Zuordnung
von PAS steht aus dem genannten Grund fest.
Jetzt kommen wir endlich mit 'flowtable' zum eigentlichen Knackpunkt
des Schaltwerks, der Übergangstabelle. Ein Tabelleneintrag beginnt darin
mit einem oder mehreren Ausgangszuständen, dann folgt die notwendige
Kombination der Eingänge, um in den rechts stehenden Folgezustand zu
gelangen. Eine 'O' bedeutet dabei, daß der Eingang für den Zustandswechsel
logisch inaktiv sein muß. Eine 'F' steht dementsprechend für logisch
aktiv und ein '-' dafür, daß der Eingang für diesen Übergang irrelevant
ist. Die erste Zeile beschreibt die Initialisierung des Schaltwerkes
beim Reset. Nach einem Reset ist immer der Anfangszustand s1 erreicht.
Ebenso erfolgt ein Wechsel nach s1, wenn in den Zuständen s1 bis s4
das AS-Signal inaktiv wird (nächste Zeile). Dies kann z. B. bei einem
BUS-Error oder einem synchronen Buszyklus passieren.
Die folgenden sechs Zeilen beschreiben den Zustand s1. Betrachten wir
zuerst einmal die Spezialfälle. Wenn ein Coprozessorzugriff stattfindet,
erkennbar durch die aktivierten Signale AS und FCS, findet ein Wechsel
zum Zustand s9 statt. Bei einem Cache-Hit, d. h. MEM, HIT, ENAB aktiv
und WR inaktiv, wird Zustand s8 angesprungen. In allen anderen Fällen,
in denen AS aktiv ist, wird zum Zustand s2 verzweigt, womit ein 'langsamer'
Buszyklus eingeleitet wird (wenn AS inaktiv ist, bleibt das Schaltwerk
in s1, siehe Zeile 2). Ähnlich kann man die gesamte Zustandstabelle
iriterpretieren. Ich beschränke mich jetzt aber auf ein paar Bemerkungen
zu den Zuständen:
- Die Zustände
s2 und s3 sind reine Verzögerungszustände.
- Im Zustand s4
wird auf das Dtack-Signal /SDT gewartet. Zur genauen Nachbildung des
8 MHz-Buszyklusses erfolgt die Verzweigung nach Zustand s5 allerdings
erst, wenn der 8 MHz-Takt in seiner High-Phase ist.
- Während der Zustände
s5 und s6 wird das DTACK-Signal für den Prozessor erzeugt, um den
Buszyklus abzuschließen.
- Die Verzweigung
nach Zustand s8 findet statt, wenn ein Cache-Hit vorliegt. Dieser
Zustand wird verlassen, wenn AS inaktiv oder WR in einem Read-Modify-Write-Zyklus
aktiviert wird. Der Read-Modify-Write-Zyklus ist ein spezieller MC68000-Buszyklus,
der nur bei dem Assernbler-Befehl TAS zur Anwendung kommt.
- Zustand s9 wurde
eingeführt, damit auf den Coprozessor mit voller Geschwindigkeit zugegriffen
werden kann. Ein Coprozessorzugriff dauert so nur 4 Takte (= 250 ns)
statt der normalen 8 Takte für die sonstige Peripherie.
Zurück zu GAL3
Mit dem GAL-Listing 4 fütterte ich, wie erwähnt, den GAL-Assembler,
der nach einiger Zeit (ca. 1.5 s) die Logikgleichungen für ST0, ST1,
ST2 und PAS ausspuckte. Die Gleichungen sind unverändert ins GAL-Listing
3 übernommen worden. Darnitbleibt im GAL-Listing 3 nur noch der Ausgang
/PDT zu behandeln. Er ist mit dem /DTACK-Eingang des Prozessors verbunden.
Das Signal wird in den Zuständen s5, s6 und s8 aktiv. Außerdem wird
das DTACK-Signal des Coprozessors asynchron an den Prozessor weitergereicht,
damit der Coprozessorzugriff mit maximaler Geschwindigkeit abläuft.
Das letzte IC
In IC7 (GAL2) ist die Cache- und Bussteuerung untergebracht. Hier trifft
man die Entscheidung, ob und wie das Cache oder der Systembus angesprochen
werden. Doch bevor ich die Gleichungen des GAL-Listings 2 im einzelnen
erkläre, erst ein Überblick über den gewählten Cache-Algorithmus:
- Lesezugriffe
auf den Hauptspeicher werden möglichst aus dem Cache befriedigt (logo!).
- Wenn ein Lesezugriff
auf den Hauptspeicher nicht aus dem Cache zu erfüllen ist, wird das
Cache mit den Daten (und Adressen) überschrieben. Dabei werden Byte-Zugriffe
in Wortzugriffe gewandelt, da das Cache eine Datenbreite von 16 Bits
besitzt.
- Bei Schreibzugriffen
erfolgt eine Aktualisierung des Caches nur, wenn die angesprochene
Adresse schon darin gespeichert ist. Auf jeden Fall wird der Hauptspeicher
beschrieben. Hierbei unterscheidet man natürlich Byte- und Wortzugriffe.
- Zugriffe auf
andere Adressen als die des Hauptspeichers berühren das Cache nicht.
Der ROM-Port-Adreßraum wurde absichtlich aus der Speicherdekodierung
ausgeklammert, da er hauptsächlich für andere Peripherie zur Anwendung
kommt.
- Das Cache wird
beim Reset, bei einem DMA-Zugriff, und wenn es abgeschaltet ist, gelöscht.
Nun zu den Gleichungen.
Da ist als erstes die Aufteilung des Cache-Enable-Signals in einen Ein-
und einen Ausgang zu erklären. Normalerweise lassen sich die Ausgänge
eines GALs direkt als Eingänge verwenden (Rückkopplung). Nur bei der
verwendeten Konfiguration (alle Ausgänge sind im Tri-State-Modus) beschränkt
sich die Funktion der Pins 12 und 19 auf reine Ausgänge. Dafür kann
man die Pins 1 und 11 als Eingänge benutzen. Da alle anderen Ausgänge
schon belegt waren und die Rückkopplung gebraucht wird, mußte ich die
Lösung mit getrenntem Einund Ausgang wählen.
Die Gleichung für das ENAB-Signal stellt ein D-Latch dar. At dem Eingang
CEN können Sie das Cache abschalten. Das kann z.B. mit einem Schalter
geschehen. Durch das D-Latch verhindern Sie, daß sich der Zustand von
ENAB während eines Buszyklusses (während AS aktiv ist) ändert.
BAS ist das Bus-Address-Strobe. Der Ausgang wird durch "BAS.E = /BGACK"
ebenso wie BUDS und BLDS während eines DMA-Zugriffs in den Tri-State-Modus
versetzt. Um BAS zu aktivieren, müssen.erstens AS und PAS aktiv sein
(zur Erinnerung: PAS ist ein verzögertes AS, das benötigt wird, damit
die Cache-Tag-RAMs genügend Zeit haben, das HIT-Signal zu erzeugen).
Ferner müssen das Cache abgeschaltet sein (/EN-I), kein Zugriff auf
den Hauptspeicher erfolgen (/MEM), das Schreibsignal aktiviert sein
oder ein Cache-Mss vorliegen (/HIT), damit BAS erzeugt wird. Mit "+
AS & BAS" erreicht man, daß ein einmal erzeugtes BAS bis zum Ende des
Buszyklusses aktiv bleibt (Selbsthaltung).
Für BUDS und BLDS gelten im Prinzip ähnliche Bedingungen zur Aktivierung
wie bei AS, nur kommt hier noch die Umwandlung vorn Byte- zu Wortzugriffen
hinzu. Dazu mußte auch die Selbsthaltung auf das jeweils andere Signal
augedehnt werden. BUDS und BLDS sind vollkommen symmetrisch.
Mit CWE werden die Cache-Tag-RAMs beschrieben. Das Signal wird aktiv,
wenn nach einem Cache-Miss ein Lesezugriff auf den Hauptspeicher erfolgt
(das Cache muß natürlich eingschaltet sein).
DOE aktiviert die Ausgangstreiber der Daten-RAMs, wenn ein Cache-Hit
vorliegt. Die Verknüpfung mit /CWE ist nötig, weil bei einem Schreibzugriff
auf die Cache-Tag-RAMs das Signal HIT aktiv wird.
LDWE und UDWE steuern das Schreiben in die Daten-RAMs. LDWE und UDWE
werden aktiviert, wenn ein Cache-Miss vorliegt oder eine im Cache vorhandene
Adresse beschrieben wird. Im zweiten Fall sind natürlich Byte-Zugriffe
durch Einbeziehung von UDS bzw. LDS zu beachten.
Damit ist die Beschreibung der Schaltung abgeschlossen. Für manche Leser
wird das Eingehen auf Schaltungsdetails wahrscheinlich recht starker
Tobak gewesen sein, aber ich wollte interessierten Selbstbauern den
Aufbau der Schaltung möglichst genau erläutern. Für den Betrieb einer
Fertigkarte ist dieses Wissen natürlich nicht erforderlich.
Der Einbau
Egal ob man die MACH 16 selbst gebaut oder ein Fertiggerät erstanden
hat, um einigen handwerklichen Aufwand kommt man nicht herum. Der alte
Prozessor im ST muß entfernt werden. Jeder Versuch, ihn unbeschadet
auszulöten, scheint mir zurn Scheitern verurteilt. Am besten werden
alle Pins mit einem feinen Seitenschneider abgetrennt und die Reste
einzeln ausgelötet. Dann können eine 64polige IC-Fassung eingelötet
und die Karte aufgesteckt werden.
Den 16-MHz-Takt greift man am günstigsten am Pin 39 des Shifters ab
(Pin 5 der MMU ist auch möglich). An den CEN-Jumper kann ein Schalter
zur Cache-Abschaltung angeschlossen werden. Das Cache ist bei überbrücktern
Jumper inaktiv.
Probleme mit Software
Vordieser Möglichkeit muß man allerdings nur bei einer verschwindend
kleinen Anzahl von Programmen Gebrauch machen. Entstehende Probleme
sind im allgemeinen auf Zeitschleifen zurückzuführen. Besonders Programme,
die den Floppy-Controller selbst programmieren, heben sich hierbei unrühmlich
hervor, und das sind auch bekannte Disk-Utilities und Diskettenkopierprogramme.
Deshalb hier ein Aufruf an alle Programmierer, für Zeitmessung nur die
im ST vorhandenen Timer zu verwenden.
Wie kraß das Probern werden kann, möchte ich an der einfachsten denkbaren
Zeitschleife erläutern:
label: dbra d0,label
Diese Schleife zählt d0.w runter, bis -1 erreicht ist. Laut Motorola-Spezifikation
dauert ein Schleifendurchlauf 10 Takte. Da im ST sich aber Prozessor
und Videologik den Bus teilen, erhöht sich die Taktzahl auf 12. Bei
einem 8-MHz-Takt sind das 1500 ns. Mit aktiviertem Cache ist der Befehl
nach dem ersten Zugriff im Cache gespeichert, und die 16-MHz-CPU kann
mit voller Geschwindigkeit darauf zugreifen und wenn der Speicher nicht
bremst, dauert ein Schleifendurchlauf nur noch 10*62.5 ns = 625 ns.
Dies entspricht einer Beschleunigung um den Faktor 2.4. Die Zeitschleife
wird also schon nach 41.6% der eigentlich vorgesehenen Zeit beendet,
was zu den beschriebenen Problemen führt.
HL-Benchmarks
Michael Glässner - ST Computer - Sonderheft ST Extra 3
F1999L
|