Etwa 1988 bis 1990 wurde von den Schöpfern unseres geliebten KC aus Mühlhausen das Modulangebot durch größere RAM-Module erweitert. Die bis dato vorhandenen 16 kB und 64 kB reichten im Regelfall für CAOS-Anwendungen aus, mit der Floppy-Erweiterung und der RAM-Floppy als Laufwerk A: unter CP/M brauchte man schon etwas mehr, schnell sind die Modulschächte mit den 64ern voll und behindern dann andere Aufgaben bzw. machen ein ständiges Umstecken notwendig.
Die Informationen zu den damals neuen Modulen sickerten kaum durch, nur wer noch eines bekam, konnte im Handbuch die notwendigen Informationen finden. Ich möchte auf Grund einiger Anfragen mal versuchen, das Ganze zusammenfassend darzustellen.
Allgemeines
Unter CP/M wird das Laufwerk A: in Spuren zu je 16 kB, unabhängig vom verwendeten RAM (-Modul) aufgeteilt bzw. verwaltet. Dies ist zugleich die ansprechbare Speichergröße, wenn man die Module für andere Zwecke verwenden will.
Da der Z80 nur 64 kB direkt adressieren kann, muß man den zusätzlichen RAM in kleine "Scheibchen" aufteilen, so wie unter CP/M. Diese 16 kB Einheiten werden dann in den Handbüchern als SEGMENT oder BLOCK bezeichnet, in anderen Literaturquellen wird auch der Begriff BANK bzw. BANK-SWITCHING verwendet, wir wollen mal bei Segment und Block bleiben.
Alle unten aufgeführten Module enthalten eine bestimmte Anzahl dieser Segmente bzw. Blöcke, je nach Ausbaustufe. Es spielt dabei keine Rolle, welche physischen Speicherschaltkreise verwendet werden, man muß nur immer die Möglichkeit haben, die Segmente einzeln zu selektieren und ansprechen zu können.
Unter CAOS ist die Modulverwaltung dafür verantwortlich (Systemhandbuch, Abschnitt 3.3., S.59 ff.), wo über den Steckplatz im Gerät und die Ausgabe von Steuerbytes dorthin mit UP Nr. 26H geschaltet werden kann.
Modulpraxis
Das 64 kB Modul liegt dagegen immer parallel mit seinen vier 16 kB Blöcken zum Grundgerätespeicher, es ist damit das einzige RAM-Modul dieser Art und blockiert dadurch im eingeschaltenen Zustand alle anderen RAM-Module mit beliebigen Basisadressen, die sich in höheren Steckplatzadressen (Modulschächten) befinden!
Um auf das aktiv geschaltete Segment eines beliebigen RAM-Moduls auf einer bestimmten Basisadresse zugreifen zu können, muß alles, was darunter liegt, ausgeschalten werden (lt. Modulprioritätskette)!
Der Grundgerätespeicher mit RAM0, RAM4 und RAM8 hat immer die höchste Priorität, da die Steckplatzadressen kleiner als 8 sind und damit vor extern gesteckten RAM-Modulen in der Prioritätskette stehen!
Den Speicherbereich, wo die Segmente in den CPU Adressbereich eingeblendet werden, muß man selbst bestimmen. Bis auf das 1 MB Modul kann man alle Module ab 04000H oder 08000H betreiben. Wenn man aber den gesamten zur Verfügung stehenden Speicher nutzen will, kommt im Prinzip nur 08000H-0BFFFH in Frage, nur dort lassen sich alle Module betreiben, der RAM8 liegt da auch fest. Insbesondere das 1 MB Modul (s.u.) läßt sich nicht per Software auf eine andere Basisadresse umschalten.
Will man nun auf Adresse 8000H auf ein Segment des RAM-Modules zugreifen, muß der RAM8 (wird bei Initialisierung von CAOS zugeschaltet!) ausgeschaltet werden und der IRM über Rücksetzen von Bit 2 der System PIO Port A ebenfalls.
Dann "rutscht" das aktiv geschaltete RAM-Segment des selektierten Moduls (Voraussetzung: alle anderen RAM-Module auf der gleichen Basisadresse in niedrigeren Modulschächten OFFLINE!) ganz nach unten und kann von der CPU angesprochen werden (vgl. Bild 12 Systemhandbuch, S.56/57).
Jetzt sollte man CAOS möglichst nicht benutzen, da der IRM aus ist und viele UP's darauf angewiesen sind bzw. diesen Adressbereich auch beschreiben, diese ev. Schreibzugriffe können ins Auge gehen, da dann das selektierte RAM-Modul-Segment beschrieben und damit verändert wird!
So wie auch in der RAM-Floppy von CP/M dient der zusätzliche Speicher vor allem zur Zwischenspeicherung von Daten bzw. nicht benutzten Programmen bzw. Programmteilen. Der Zugriff sollte deshalb im eigenen Interesse über im Anwenderprogramm enthaltene spezielle Treiber/Programmroutinen erfolgen, welche man in Abhängigkeit von der Datenstruktur im Programm selbst schreiben muß. Nachdem die Transfers erledigt sind schaltet man den IRM wieder zu und ggf. den RAM8.
Anwendungsempfehlung
Man schaltet einfach beim Programmstart des eigenen Programmes sämtliche Speichermodule und den RAM8 offline, dann laufen alle Zugriffe auf die Segmente nach dem gleichen Schema ab:
- RAM-Segment selektieren, einschalten, merken
- Bildwiederholspeicher (IRM) ausschalten
- Speichertransfer
- Bildwiederholspeicher (IRM) einschalten
- RAM-Segment holen, ausschalten
Da sämtlicher RAM auf der Basisadresse 08000H immer aus ist, rutscht das selektierte und aktiv geschaltete Segment nach Ausschalten des IRM automatisch nach "ganz unten" und kann benutzt werden. Man benötigt dazu nur eine Tabelle aller Segmente, welche benutzt werden sollen, wo die Moduladresse (Schachtnummer) und das zugehörige Steuerbyte, welches das Segment auf 08000H online/ohne Schreibschutz schaltet, enthalten sind.
So lassen sich alle RAM-Module und auch der RAM8 gleich behandeln, was die Sache erheblich vereinfacht. Es sei nochmals betont, daß der IRM zuletzt aus- und zuerst wieder eingeschaltet wird, da dort viele wichtige Arbeitszellen von CAOS liegen!
Modulübersicht
M022 - 16 kB RAM
Das Modul enthält 1 RAM-Block mit 16 kB, welcher in den Adressbereich der CPU eingeblendet wird, wenn kein anderer Speicherblock intern oder in anderen Modulen höher priorisiert ist.
Strukturbyte: F4 H
Steuerbyte : Bit 7 6 5 4 3 2 1 0
A3 A2 X X X X W M
- A3 A2 = 00 Basisadresse 0000H
= 01 Basisadresse 4000H
= 10 Basisadresse 8000H
= 11 Basisadresse C000H
- X nicht benutzt
- W Schreibschutz (=0 – Schreibschutz aktiv)
- M Aktivbit (=0 - Modul inaktiv)
M024 - 32 kB RAM
Das Modul ist in 2 RAM-Blöcke zu je 16 kB aufgeteilt, welche immer parallel zum internen RAM des Grundgerätes liegen. Die Anordnung ist also nebeneinander, so dass immer beide Blöcke hintereinander erreichbar sind, falls kein anderer Speicherblock intern oder in anderen Modulen höher priorisiert ist.
Durch die Veränderung der Basisadresse lassen sich die beiden Blöcke wie ein Ringpuffer betreiben, da immer alle Blöcke aktiv bleiben aber auf jede beliebige 16 kB Anfangsadresse rotiert werden können.
Strukturbyte: F5 H
Steuerbyte : Bit 7 6 5 4 3 2 1 0
A3 A2 X X X X W M
- A3 A2 = 00 Basisadresse erster Block 0000H
= 01 Basisadresse erster Block 4000H
= 10 Basisadresse erster Block 8000H
= 11 Basisadresse erster Block C000H
- X nicht benutzt
- W Schreibschutz (=0 – Schreibschutz aktiv)
- M Aktivbit (=0 - Modul inaktiv)
Diese Modul ist im RAM Floppy Verwaltungsprogramm definiert. Mir ist es allerdings nicht bekannt und ein offizielles Modul dieser Art habe ich bisher auch noch nie gesehen.
M011 - 64 kB RAM
Das Modul ist in 4 RAM-Blöcke zu je 16 kB aufgeteilt, welche immer komplett parallel zum internen RAM des Grundgerätes liegen. Die Anordnung ist also nebeneinander, so dass immer alle Blöcke erreichbar sind, falls kein anderer Speicherblock intern oder in anderen Modulen höher priorisiert ist.
Durch die Veränderung der Basisadresse lassen sich die 4 Blöcke wie ein Ringpuffer betreiben, da immer alle Blöcke aktiv bleiben aber auf jede beliebige 16 kB Anfangsadresse rotiert werden können.
Strukturbyte: F6 H
Steuerbyte : Bit 7 6 5 4 3 2 1 0
A3 A2 X X X X W M
- A3 A2 = 00 Basisadresse erster Block 0000H
= 01 Basisadresse erster Block 4000H
= 10 Basisadresse erster Block 8000H
= 11 Basisadresse erster Block C000H
- X nicht benutzt
- W Schreibschutz (=0 – Schreibschutz aktiv)
- M Aktivbit (=0 - Modul inaktiv)
M036 - 128 kB segmented RAM
Das Modul enthält 8 RAM-Segmente zu je 16 kB, welche einzeln ab Basisadresse 04000H oder 08000H in den Adressbereich des Prozessors eingeblendet werden können, die Anordnung ist hintereinander, es ist also immer nur ein Segment erreichbar.
Strukturbyte: 78 H
Steuerbyte : Bit 7 6 5 4 3 2 1 0
A1 X X S2 S1 S0 W M
- A1 = 0 Basisadresse 4000H
= 1 Basisadresse 8000H
- X nicht benutzt
- S2...S0 Segment-Nummer dual von 0...8
- W Schreibschutz (=0 - Schreibschutz aktiv)
- M Aktivbit (=0 - Modul inaktiv)
M032 - 256 kB segmented RAM
Das Modul enthält 16 RAM-Segmente zu je 16 kB, welche einzeln ab Basisadresse 04000H oder 08000H in den Adressbereich des Prozessors eingeblendet werden können, die Anordnung ist hintereinander, es ist also immer nur ein Segment erreichbar.
Strukturbyte: 79 H
Steuerbyte : Bit 7 6 5 4 3 2 1 0
A1 X S3 S2 S1 S0 W M
- A1 = 0 Basisadresse 4000H
= 1 Basisadresse 8000H
- X nicht benutzt
- S3...S0 Segment-Nummer dual von 0...15
- W Schreibschutz (=0 - Schreibschutz aktiv)
- M Aktivbit (=0 - Modul inaktiv)
M034 - 512 kB segmented RAM
Das Modul enthält 32 RAM-Segmente zu je 16 kB, welche einzeln ab Basisadresse 04000H oder 08000H in den Adressbereich des Prozessors eingeblendet werden können, die Anordnung ist hintereinander, es ist also immer nur ein Segment erreichbar.
Strukturbyte: 7A H
Steuerbyte : Bit 7 6 5 4 3 2 1 0
A1 S4 S3 S2 S1 S0 W M
- A1 = 0 Basisadresse 4000H
= 1 Basisadresse 8000H
- S4...S0 Segment-Nummer dual von 0...32
- W Schreibschutz (=0 - Schreibschutz aktiv)
- M Aktivbit (=0 - Modul inaktiv)
Die Angaben zum M034 entnehme ich dem verwendeten Steuerbyte zur RAM-Floppy-Verwaltung unter CP/M, mir ist kein User bekannt, der ein solches offizielles Modul besitzt.
M035 - 1 MB segmented RAM
Das Modul enthält 64 RAM-Segmente zu je 16 kB, welche in der Regel ab Basisadresse 08000H in den Adressbereich des Prozessors eingeblendet werden können, die Anordnung ist hintereinander, es ist also immer nur ein Segment erreichbar.
Strukturbyte: 7B H
Steuerbyte : Bit 7 6 5 4 3 2 1 0
S5 S4 S3 S2 S1 S0 W M
- S5...S0 Segment-Nummer dual von 0...64
- W Schreibschutz (=0 - Schreibschutz aktiv)
- M Aktivbit (=0 - Modul inaktiv)
Vom legendären 1 MB Modul gab es einige Nullserienprodukte, es gelangte offenbar nie in den offiziellen Handel. Bei meiner Variante diente die Leiterplatte des M032 als Grundlage, es wurden nur andere RAM's (1 MB*1) gesteckt und das Strukturbyte neu verdrahtet.
Ich habe bis jetzt verschiedene Ausführungen des Moduls gesehen, es gibt auch Varianten mit einem DIP-Schalter in der Frontplatte, wo man die Basisadresse von 04000H auf 08000H hardwaremäßig umschalten kann, das Steuerbyte wird ja komplett für die Adressierung der 64 Segmente verbraucht.
M035*4 - 4 MB segmented RAM
Dieses Modul enthält 4 einzelne logische Module M035, welche ab Steckplatzadresse (Modulschachtnummer) 4 aufeinanderfolgende Steckplatzadressen belegen und entsprechend der logischen Nummer priorisiert werden. Ein logisches Modul mit einer niedrigeren Nummer ist höher priorisiert und demzufolge im Zugriff, wenn 2 oder mehr logische Module aktiv geschaltet sind.
Jedes logische Modul ist exakt wie ein M035 aufgebaut, wird genauso programmiert und sendet auf jeder Steckplatzadresse das gleiche Strukturbyte wie ein M035. Es enthält wiederum 64 RAM-Segmente zu je 16 kB, welche ab Basisadresse 08000H in den Adressbereich des Prozessors eingeblendet werden können, die Anordnung ist hintereinander, es ist also immer nur ein Segment erreichbar.
Moduladressierung:
Physische Steckplatzadresse: n
- n logisches Modul 1 M035
- n+1 logisches Modul 2 M035
- n+2 logisches Modul 3 M035
- n+3 logisches Modul 4 M035
Strukturbyte logisches Modul: 7B H
Steuerbyte : Bit 7 6 5 4 3 2 1 0
S5 S4 S3 S2 S1 S0 W M
- S5...S0 Segment-Nummer dual von 0...64
- W Schreibschutz (=0 - Schreibschutz aktiv)
- M Aktivbit (=0 - Modul inaktiv)
Das 4 MB Modul M035*4 wurde 2003 von Mitgliedern des KC-Club entwickelt und wird mit 4 Stück 1MB SIM oder 1 Stück 4MB SIM Modul(en) aus der PC-Technik bestückt.
Hinweise
Mit diesen Informationen kann jeder Bastler und Tüftler auch eigene Varianten bauen. Wenn gleiche Strukturbytes verwendet werden, ist zwingend auch die Definition des entsprechenden Modulsteuerbytes einzuhalten, damit vorhandene Software weiter funktioniert und nicht verrückt spielt.
Kai-Uwe Irrgang stellte in den "KC-News" 3/93 bzw. 03/96 beispielsweise eine Umbauanleitung des 64 kB Moduls zu einem 1 MB Modul vor. Sehr gut an dieser Anleitung fand ich die Tatsache, daß man mittels DIP-Schalter, zwischen 64 kB und 1 MB Modul umschalten kann, so daß man quasi das M011 behält und ein M035 dazubekommt. Dort werden auch alle eben genannten Konventionen eingehalten.
Die oben angedeutete Speicherverwaltung bildet auch die Grundlage und Voraussetzung für die Leistungsfähigkeit von "UNIPIC". Im Programm befinden sich 2 Routinen, welche sich um die Speicherverwaltung der Bilder und um die Verwaltung der einzelnen Programmteile (MC-Code-Module) kümmern. Speziell die Verwaltung der Programm-Module wurde mittlerweile so weiterentwickelt, daß sie sich gegenseitig aufrufen und bis auf das letzte Byte mit in sich abgeschlossenen Unterprogrammen aufgefüllt werden können, was eine effektive und relativ einfache Programmierung erlaubt.