2 MB On Board
von Frank Dachselt
Nachdem der Arbeitsspeicher des Grundgerätes auf 256 K aufgerüstet war und die Vorzüge dieser damals doch recht massiven RAM-Erweiterung zum Vorschein traten, machte sich auch schnell eine Erscheinung bemerkbar, die wohl jeder Computeranwender kennt:
Es gibt stets mindestens eine Anwendung, für die der zur Verfügung stehende Speicher nicht ausreichend ist. Insbesondere bei der bequemen, weil zeitsparenden, Arbeit mit dem RAM-Floppy sind 256 K schnell belegt und der Wunsch nach einer größeren Kapazität läßt nicht lange auf sich warten.
Grundsätzlich beseitigt die hier vorgestellte Lösung dieses Problem natürlich auch nicht, bietet aber in ihrer vollen Ausbaustufe genügend Spielraum. Wo dabei eine sinnvolle Grenze zu ziehen ist, muß jeder Anwender selbst entscheiden.
Die nachfolgende Beschreibung der bis zu 2 MB ausbaufähigen Erweiterung im Grundgerät sollte als ein Vorschlag verstanden werden, der aus heutiger Sicht nicht zu einer Standardlösung für den KC werden wird. Anders als bei einem steckbaren Modul stellt die Hardwareänderung schon einen erheblichen Eingriff in das Grundgerät dar, wobei die Kompatibilität zur Originalhardware allerdings erhalten bleibt. Wegen des Platzmangels im Grundgerät ist diese Lösung wahrscheinlich nur den versierten Bastlern unter den KC-Nutzern vorbehalten. Aus diesem Grund ist auch die praktische Ausführung im folgenden nicht bis ins letzte Detail beschrieben.
Schaltung
Der Grundgedanke der Speichererweiterung besteht darin, die Ansteuerung des 256K-RAM im Grundgerät so zu modifizieren, daß der Zugriff wahlweise auf weitere 256K-Bereiche (in folgenden Bänke genannt) möglich ist. Für 2 MB sind das neben der originalen 256K-Bank sieben weitere Bänke, für deren Auswahl drei Steuersignale benötigt werden. Für diese Steuersignale werden die drei bisher unbenutzten Bits des Ausgabekanals 86h bzw. (IX+4) mit folgender Zuordnung verwendet:
Ausgabekanal 86h 256K-Bankauswahlsignal Bit 2 B0 Bit 3 B1 Bit 4 B2
Die Signalkombination (B2 B1 B0) = 000 ist dabei der originalen 256K-Bank (Bank 0) zugeordnet. Damit ist Bank 0 nach jeden RESET automatisch ausgewählt. Diese Bankauswahlsignale werden nun, wie in der Ansteuerschaltung in Bild 1 dargestellt, dazu verwendet, die Signale /RASn und /CASn für die acht Bänke (n = 0 ... 7) mittels einer Multiplexerschaltung zu generieren. Die Torung mit dem Signal AB8B dient dazu, Zugriffe auf RAM0 und RAM4 stets in Bank 0 zu führen (AB8B liegt nur dann auf H, wenn ein Zugriff im Adreßbereich 8000h ... BFFFh stattfindet).
Um den Refresh in allen Bänken zu ermöglichen, wird die Demultiplexung des /RAS-Signals bei aktivem /rfsh-Signal aufgehoben. Um Dekodierspitzen zu vermeiden, wird dazu das Signal rf&mr verwendet, das mittels der RC-Kombination am Eingang zusätzlich um eine viertel Taktperiode verzögert wird. Bild 3 zeigt, wo die Eingangssignale der Ansteuerschaltung (außer dem Ausgabekanal 86h) auf der Hauptplatine des Grundgerätes zur Verfügung stehen. Die /RAS- und /CAS-Linien auf der Hauptplatine werden durch Entfernen der 100-Ohm- Widerstände (R02 und R03) aufgetrennt und dort die Ansteuerschaltung mit den Anschlüssen /ras - /ras0 bzw. /cas - /cas0 eingeschleift.
Bild 1: Ansteuerschaltung für 2 MB RAM onboard
Für die sieben zusätzlichen RAM-Bänke werden Speichermodule mit der Organisation 256 K x 8 oder 256 K x 9 verwendet.
Dabei gilt folgende Anschlußbelegung:
Pin | Signal | Pin | Signal | Pin | Signal |
1 | Vcc | 11 | A4 | 21 | /we |
2 | /cas | 12 | A5 | 22 | Vss |
3 | DQ1 | 13 | DQ4 | 23 | DQ7 |
4 | A0 | 14 | A6 | 24 | nc |
5 | A1 | 15 | A7 | 25 | DQ8 |
6 | DQ2 | 16 | DQ5 | 26 | nc / DQ9 (out) |
7 | A2 | 17 | A8 | 27 | /ras |
8 | A3 | 18 | nc | 28 | nc / /cas9 |
9 | Vss | 19 | nc | 29 | nc / D9 (in) |
10 | DQ3 | 20 | DQ6 | 30 | Vcc |
Die Daten- und Adreßsignale sowie das Signal /we werden direkt mit den entsprechenden Signalen der Bank 0, also des RAMs auf der Hauptplatine, verbunden; die /ras- und /cas-Signale paarweise mit den entsprechenden Ausgängen der Ansteuerschaltung. Bei Speichermodulen der Organisation 256 K x 9 werden die Anschlüsse 28 und 29 mit Vcc (+5V) verbunden.
Die Stromaufnahme der zusätzlichen Speichermodule ist abhängig vom aktuellen Zugriffsverhalten des Systems. Beim ausschließlichen Refresh beträgt sie für alle sieben Module etwa 30 mA und steigt bei Schreib- und Lesebursts in einem dieser Module auf einen Gesamtwert von etwa 50 mA. Die Zugriffszeit der Speichermodule dürfte völlig unkritisch sein, wobei kürzere Zugriffszeiten prinzipiell eine geringere Stromaufnahme bedeuten. Die angegeben Werte gelten für eine gemischte Bestückung mit 70- und 80-ns-Typen. Die fünf IC der Ansteuerschaltung besitzen bei Verwendung von LS-TTL-Typen eine Stromaufnahme von ebenfalls etwa 50 mA, so daß die Gesamtmehrbelastung des Netzteils in akzeptablen Grenzen bleibt.
An dieser Stelle nun auch ein paar Bemerkungen zum Preis der ganzen Sache. Bestimmendes Element sind sicherlich die Speichermodule selbst. Ich habe gebrauchte 256K-SIP-Module verwendet, die zuletzt (Mai '95) für 13,- DM pro Stück zu erhalten waren. Für sieben solche Module, also die maximale Ausbaustufe, ergibt sich zuzüglich eines kleinen Aufschlages für die übrigen Kleinteile (LP, IC, Steckverbinder usw.) ein Betrag von etwa 100,- DM. Die Bestückung ist jedoch wahlweise auch mit weniger Speichermodulen möglich und kann zu einem späteren Zeitpunkt erweitert werden.
Aufbau, Inbetriebnahme und Test
Im folgenden ein paar Tips zum praktischen Aufbau der Speichererweiterung. Es ist empfehlenswert, zunächst nur die Ansteuerschaltung ohne weitere Speichermodule aufzubauen und ihre ordnungsgemäße Funktion in Verbindung mit der originalen Bank 0 zu testen. Dann können nach und nach die weiteren Speichermodule eingebaut werden. Als Träger für die gesamte Erweiterung eignet sich eine Lochrasterstreifenleiterplatte, da die sieben zusätzlichen Speichermodule mit Ausnahme der RAS/CAS-Signale elektrisch parallel geschaltet werden. Auch die Ansteuerschaltung läßt sich auf dieser Leiterplatte unterbringen.
Wegen des Platzmangels im Grundgerät ist eine minimale Bauhöhe anzustreben. Die Verwendung von Fassungen für eine senkrechte Anordung der Speichermodule scheidet daher aus. Fassungen für einen schrägen Einbau wären eine Alternative, benötigen aber auch mehr Leiterplattenfläche. Ich selbst habe mich für die Verwendung von SIP-Modulen entschieden und diese direkt auf die Leiterplatte gelötet. Die Anschlußpins wurden dabei soweit gekürzt, daß sie vollständig von flachen Löthügeln bedeckt werden. Mitunter hilft auch das Ansenken der Bohrungen auf der Bestückungsseite der Leiterplatte, um die Module vollständig einsetzten zu können.
Die Zuführung von Signalen und Versorgungsspanung erfolgt am besten über eine Steckverbindung, damit die Baugruppe leicht entfernt und wieder eingesetzt werden kann. Die eine Seite dieser Steckverbindung ist dabei fest mit der Trägerleiterplatte verbunden, während sich das Gegenstück lose im Grundgerät befindet. Ein weiterer Vorteil dieser steckbaren Variante beseht darin, daß mittels eines weiteren Steckers, an dem nur die Anschlüsse /ras - /ras0 und /cas - /cas0 mit jeweils einem 100-Ohm-Widerstand verbunden sind, der Originalzustand der Schaltung wiederhergestellt werden kann.
Im Interesse eines stabilen Betriebes sollte auf eine kurze Zuführung der Betriebsspannung geachtet werden. Desweiteren empfehlen sich zusätzliche Blockkondensatoren (100 nF) über beide Versorgungsspannungsanschlüsse unmittelbar an den Speichermodulen.
Im Grundgerät findet die Speichererweiterung unterhalb des rechten Modulschachtes Platz. Die Baugruppe wird dabei mit der Leiterplatte nach oben so eingesetzt, daß die Oberkanten der Speichermodule (jetzt unten) auf den Schaltkreisen der Hauptplatine aufsitzen und die Kanten der Trägerleiterplatte seitlich unter die Modulschienen geschoben werden. Vorher sind im entsprechenden Bereich alle Bauelemente, die auf der Hauptplatine über Schaltkreisoberkante ragen (Kondensatoren, Draht-brücken und evtl. Widerstände), auf deren Rückseite zu versetzten.
Bild 2 zeigt in einer (nicht ganz maßstäblichen) Skizze den Einbau der Erweiterungsbaugruppe. Um mechanische Spannungen zu vermeiden, sollte vorher genau gemessen werden, ob die Bauhöhe der Speichermodule in den zur Verfügung stehenden Platz paßt (bei den von mir verwendeten Typen stimmte es auf den Millimeter!). Die Fixierung der Baugruppe ist auf verschiedene Arten möglich, zum Beispiel durch eine leichte Modifizierung der Modulschienen oder durch einfaches Festbinden an ihnen.
Bild 2: Einbau der RAM-Erweiterung ins Grundgrät
Zum Testen des zusätzlichen Speichers auf volle Funktionsfähigkeit existiert das Programm RAMTEST. Neben dem Setzen und Rücksetzen aller Bits testet es auf das Vorhandensein von Kurzschlüssen der Daten- oder Adreßleitungen, das Verhalten bei Schreib- und Lesebursts sowie bei der Programmabarbeitung. Das Programm verwendet die physischen Blocknummern 00 ... 7F, wobei das erste Halbbyte die Bank angibt und das zweite den Block innerhalb dieser Bank. Während des Tests wird die aktuelle Blocknummer und eine Kennung angezeigt. Ab dem zweiten Testlauf über vorhandenen Speicher müssen beide Werte übereinstimmen.
Tritt eine Abweichung eines Speicherzelleninhalts vom erwarteten Wert auf, so wird die Blocknummer, die Adresse, der erwartete und der gelesene Inhalt sowie die Anzahl der bisher aufgetretenen Fehler angezeigt. Nach jeweils 28 Fehlern wartet das Programm auf eine Tastatureingabe. Die Interpretation eventueller Fehlerausschriften muß jeder Nutzer selbst vornehmem. Weiterhin können mit dem Kommandos 'BLOCK nn' und 'BANK mm' der physische Block nn in Bank mm als RAM8 ausgewählt werden. Die beschriebenen Routinen verwalten den RAM ohne Einträge in den Modulsteuerwortspeicher. Mit dem Kommando 'MEM nnnn' werden fortlaufend 256 Byte ab Adresse nnnn aus dem aktuellen RAM8-Block angezeigt, wodurch beispielsweise der ordnungsgemäße Refresh überprüft werden kann.
Verwaltung
Der gesamte zusätzlich zur Verfügung stehende Speicher von 7 x 256 K wird wie bereits die originale Bank 0 als RAM8 in Blöcken zu je 16 K verwaltet. Damit existieren bei vollständiger Bestückung 128 solcher Blöcke. RAM0 und RAM4 werden unabhängig von der ausgewählten Speicherbank stets durch die physischen Blöcke 0 und 1 der Bank 0 gebildet. Zur Auswahl eines bestimmten Blockes muß mit einer 7-Bit-Blocknummer gearbeitet werden. Die sich einschließlich Schreibschutz und On/Off-Steuerung ergebenden 9 Steuerbits lassen sich schwerlich in einem 8-Bit-Steuerwort unterbringen, wie es die Modulsteuerung unter CAOS voraussetzt. Um eine kompatible Verwaltung des zusätzlichen Speichers zu ermöglichen, wird folgendes Verfahren angewendet:
Der als eine physische Einheit existierende RAM8 wird in zwei logische Module unterteilt, die jeweils eine Größe von 1 MB besitzen. Das erste, höherwertige Modul besteht aus den RAM-Bänken 0, 1, 2 und 3; entsprechend das zweite, niederwertige Modul aus den RAM-Bänken 4, 5, 6 und 7. Beiden Modulen wird jeweils ein Steuerwort mit folgendem Aufbau zugeordnet:
b7 b6 b5 b4 b3 b2 b1 b0 | | | | | | | | | | | | | | | +----- on/off | | | | | | +--------- Schreibschutz | | +---+---+---+------------- 16K-Blockausw. +---+----------------------------- 256K-Bankausw.
Die Bits b2 ... b5 bezeichnen die logische Blocknummer innerhalb einer Bank. Zwischen dieser und der physischen Blocknummer (Bits B4 ... B7 im Ausgabekanal 84h) besteht folgende Beziehung:
Logische Blocknummer = Physische Blocknummer - 2
Dieser Zusammenhang ist lediglich in der Bank 0 von Bedeutung, in der die logischen Blocknummern E und F den Blöcken für RAM0 bzw. RAM4 entsprechen. Eine entsprechende Aufstellung ist in den KC-News 4/94 auf Seite 15 zu finden. Mit den Bits b6 und b7 erfolgt die Auswahl der Speicherbank innerhalb eines Moduls. Sie entsprechen den Bits B2 und B3 im Ausgabekanal 86h, wobei folgende Kodierungen gelten:
b7 | b6 | höherwertiges Modul | niederwertiges Modul |
0 | 0 | Bank 0 | Bank 4 |
0 | 1 | Bank 1 | Bank 5 |
1 | 0 | Bank 2 | Bank 6 |
1 | 1 | Bank 3 | Bank 7 |
Für die Verwaltung dieser zwei Module werden auch zwei Moduladressen und damit zwei Bytes im Modulsteuerwortspeicher benötigt. Das höherwertige Modul erhält die Adresse 03 (auch bisher bereits RAM8), womit die Kompatibilität zur bisherigen Verwaltung des 256K-RAM gesichert ist. Für das niederwertige Modul wird die bisher unbenutzte Adresse 06 verwendet.
Die Modulpriorität der zwei als eine physische Einheit existierenden Module muß softwareseitig erzeugt werden. Dem liegt folgendes Prinzip zugrunde: Bei jedem Schaltvorgang in einem der beiden Module müssen stets beide Steuerworte ausgewertet werden. Das Schreibschutz- und das On/Off-Signal für den RAM8 ergibt sich jeweils aus der ODER-Verknüpfung der Bits 0 bzw. 1 in den beiden Steuerworten. Das bedeutet, daß der RAM8 eingeschaltet ist, wenn mindestens eins von beiden Modulen eingeschaltet ist. Ebenso ist der Schreibschutz für RAM8 ausgeschaltet, wenn er für mindestens eins der beiden Module ausgeschaltet ist.
Die Block- und Bankauswahl wird entsprechend desjenigen Steuerwortes vorgenommen, das zum höchstwertigen eingeschalteten von beiden Modulen gehört. Hieraus ergibt sich auch der Wert des Bits 4 im Ausgabekanal 86h. Wenn also das Modul auf Adresse 03 eingeschaltet ist, bleiben Schaltvorgänge auf Adresse 06 wirkungslos. Es wird lediglich das Steuerwort in den Steuerwortspeicher übernommen. Wird nun das Modul auf Adresse 03 ausgeschaltet, gelangt das Steuerwort für Adresse 06 (aus dem Steuerwortspeicher) automatisch zur Anwendung. Der Quelltext zur Modifikation des CAOS-UP 26h ist in der Datei RAM8UP26.MAC enthalten, die die Verwaltung des RAM8 in der beschriebenen Weise realisiert.
Verwendung als RAM-Floppy
Zur Verwendung des neuen Speichers als RAM-Floppy unter MicroDOS existiert das Programm RAMFLOP. Es ist speziell für ein RAM-Floppy unter ausschließlicher Nutzung des RAM8 entstanden. Das Programm entspricht damit meinen persönlichen Vorstellungen und wird vielleicht nicht jeden glücklich machen. Mit 2 MB RAM8 und im Nichtbesitz von steckbaren Speichermodulen größer als 64 K war eine solche Entscheidung aber leicht zu treffen.
Anders als bei der ursprünglichen Version für das 256k-Floppy (KC-News 3/92) modifiziert das Programm nicht mehr die zentrale Steuerschleife im Grundgerät, sondern geht den einzig vernünftigen Weg, indem es das neue UP 26h über die Unterprogrammtabelle in das System einfügt. Damit ist diese RAM-Floppy-Installation auch mit Systemerweiterungen wie z.B. ZAS.COM verträglich. Die ersten beiden (logischen) Blöcke in Bank 0 werden aus dem RAM-Floppy ausgeschlossen. Das geschieht unter anderen deswegen, weil hier beim Start von MicroDOS stets das Directory initialisiert wird. Weiterhin sind so die originalen 64 K des KC 85/4 unbenutzt und können beim Wechsel der Betriebsarten unter CAOS verwendet werden, ohne daß der Inhalt des RAM-Floppys verändert wird.
Das Programm RAMFLOP legt selbst ein Directory mit 256 Einträgen im Block 2 an. Das ist doppelt so viel wie bisher und günstig bei vielen kurzen Dateien, aber mitunter etwas langsamer. Eine - mehr oder weniger intelligente - Routine entscheidet während der Initialisierung, ob das Directory zurückgesetzt wird oder nicht. Ist bereits eine gültige Struktur vorhanden, bleibt diese unverändert. Vorausgesetzt, es wurden in anderen Teilen des RAM-Floppys keine Veränderungen vorgenommen, läßt sich jetzt nach einer zwischenzeitlichen Arbeit unter CAOS das MicroDOS-Regime wieder starten und der ursprüngliche Inhalt des RAM-Floppys steht ohne aufwendige "Wiederbelebungsversuche" sofort zur Verfügung.
Bild 3: Abgriff der Steuersignale auf der Hauptplatine