Bankswitching

Das heutige Thema kommt vielleicht 25-30 Jahre zu spät, aber vielleicht interessiert es den einen oder anderen doch, wie sein Heimcomputer mit mehr als 64 KByte Speicher zurecht kam.  Es geht darum, wie ein ein 8-Bit-Prozesssor mehr als 64 KB Gesamtspeicher verwaltet. Als erstes muss klar sein, dass wir von Gesamtspeicher reden, also RAM und ROM (ich glaube viele wären in den achtziger Jahren schon froh gewesen, wenn der Rechner jeweils 64 KByte RAM und 64 KByte ROM hätte ansprechen können, aber leider ist dem nicht so).
Fangen wir zuerst mal an wie der Speicher adressiert wird. Wenn der Computer ein Wort aus dem Speicher lesen möchte macht er folgendes:

  • Er legt die Adresse von der der Zugriff erfolgt auf den Adressbus
  • Er zieht das Chip-Select Signal auf logisch 0 (bei den Bausteinen steht immer kein Strom für Zugriff und Strom für keinen Zugriff)
  • Er wartet einen Takt bis der Speicher die Adresse dekodiert und die Daten auf den Datenbus geschrieben hat
  • Er liest die Daten über den Datenbus ein.

Ein Speicherbaustein wird über eine eigene Leitung mit der Bezeichnung Chip-Select aktiviert. Solange wir nur einen Speicherbaustein haben ist das kein Problem. Eine solche Leitung hat auch die CPU. Nur – selbst in einem Minimalsystem reicht das nicht aus. Schließlich werden über diese Leitung auch Peripheriebausteine aktiviert, die man schon benötigt wenn man eine Tastatur oder 7-Segmentanzeige anschließen möchte.

In der Regel gibt es mehr als einen Baustein. Selbst im ZX81 steckten je ein RAM und ein ROM. In meinem CPC-464 waren es acht RAM (Typ 4164) und ein ROM (Typ 23256). Wie adressiert man mehr als einen Baustein? Es geht mit einem Baustein der berühmten 74xxx Serie. Diese TTL Bausteine waren einfache Gatter die Eingangssignale logisch verknüpften. Der Baustein LS74138 ist z.B. ein 3 zu 8 Dekoder. Er hat drei Eingangsleitzungen und acht Ausgangsleitungen. Damit kann man z.B. den 64 KByte Adressbereich in acht Bereiche aufteilen. Der Baustein macht dabei folgende Verknüpfung:

Eingangsleitung 1 Eingangsleitung 2 Eingangsleitung 3 Ausgangsleitung aktiv
0 0 0 1
0 0 1 2
0 1 0 3
0 1 1 4
1 0 0 5
1 0 1 6
1 1 0 7
1 1 1 8

Wenn man nun die Adressleitungen A13 bis A15 eines Chips auf die Eingangsleitungen legt und eine Adresse auf den Datenbus legt, dann passiert folgendes:

Adresse Start Adresse Ende Ausgangsleitung aktiv
0 1FFF 1
2000 3FFF 2
4000 5FFF 3
6000 7FFF 4
8000 9FFF 5
A000 BFFF 6
C000 DFFF 7
E000 FFFF 8

Alle Angaben sind in Hexadezimal. Die Ausgangsleitung ist dann ein Chip-Select Signal für einen Baustein. So wird jeweils nur ein Baustein angesprochen. So kann man sehr einfach z.B. acht RAM Bausteine mit 64 KByte ansprechen oder eine Mischung von RAM Bausteinen mit ROM Bausteinen, sofern es nicht mehr als acht sind. So kann sehr einfach ein Mikrocomputer mit bis zu 64 KB RAM/RON wie z.B. der Dragon 32 oder Sinclair Spektrum entworfen werden. Es gibt andere Bausteine der 74xxx Serie die andere Verknüpfungen oder mehr Ausgangsleitungen aufweisen oder man kann sie kombinieren. Die frühen Platinen waren daher gut gefüllt mit diesen Bausteinen, auch weil man neben den Chips ja noch die Bussysteme trennen musste, Tastaturen und Ein/Ausgabeports hatten eigene Leitungen und dürften auch nicht permanent aktiv sein. Besonders die damals beliebten Einplatinencomputer von Zeitschriften waren daher übersät von diesen Bausteinen und Platinen wurden daher auch gerne als „TTL-Grab“ bezeichnet. Später entwickelten die meisten Hersteller eigene Bausteine, welche die wichtigsten Signaltrennungen durchführten. Auch mein CPC hatte einen solchen als ULA bezeichneten Baustein. (ULA: Uncommitted Logic Array). Sie fassten mehrere andere Bausteine der 74xxx Serie in einem größeren Gatter zusammen, waren preiswerter zu produzieren und sparten Platz auf der Platine. ZX Spektrum, Acorn und CPC hatten solche ULA’s

Wenn man diese Zusammenhänge kennt, dann ist der Hardwareteil des Bankswitchings recht einfach zu verstehen: Im Prinzip werden weitere Bausteine genau so angesprochen wie die bisherigen. Auch das Verknüpfen der Signale für die Chip-Select Signal geht genauso. Nur müssen von irgendwo her die Signale für die zusätzlichen benötigten Adressleitungen herkommen. Nun wird es systemspezifisch. Ich gehe jetzt mal von einem Z80 Prozessor aus, weil ich mich da von meinem Computer CPC 464-6128 Serie auskenne. Schon der kleinste der Serie hatte 64 KB RAM und 32 KB ROM, musste also Bankswitching durchführen. Die Rechner waren erweiterbar um 255 ROM’s mit jeweils 16 KB Größe und die 6128 Serie hatte 128 KB RAM (mit Speichererweiterung hatte mein CPC 464 insgesamt 64 KB ROM und 576 KB RAM).

Beim Z80 ging dies sehr elegant, weil dieser neben dem Datenbus und Adressbus auch über einen Steuerbus mit 16 weiteren Leitungen hatte und dieser angesprochen wurde wie der Speicher. Dazu gab die Anweisungen IN und OUT. Die Adresse von der gelesen oder gespeichert wird, wird dabei im Register BC vorgegeben. 16 Leitungen sind mehr als genug für Speicherweiterungen. Wenn nicht an diesem Steuerbus auch einige Peripheriegeräte (wie z.B. im Schneider das 8255 mit vier I/O Ports, der Soundchip AY-8912 und der Video Display Prozessor 6845) hängen würden, dann könnte man so über diesen Mechanismus 4 GByte RAM adressieren.

Beim CPC 464 wurde so vorgegangen, wie bei anderen Computern auch: bestimmte Bausteine fühlten sich angesprochen wenn bestimmte Adressleitungen des Kontrollbuses ein Signal aufweisen. Dadurch belegten sie ganze Adressräume. So sah es beim Basismodell CPC 464 aus:

Deutlich wird, dass beim Systembus immerhin noch die unteren 8 Bits belegt werden können. Auch davon standen nicht alle zur Verfügung. Bestimmte Bereiche wurden für Schnittstellen und die Diskstationen (bis zu 4 Disks) reserviert, ebenfalls nach dem Adressbereichprinzip. Doch 4 Bits waren noch frei. Diese hat der Hersteller meiner Speichererweiterung z.B. für 512 KByte RAM (in Kacheln von je 32 KB) genutzt.

Das ansprechen ist das eine, doch ein lauffähiges System ist ein anderer Punkt. Die Architektur des CPC 464 in der Basiskonfiguration zeigt Abbildung 2.

In den unteren 16 KB liegt das Betriebssystem. In den oberen 16 KB der Videospeicher und der Basic Interpreter und Erweiterungs-ROMs, die beim CPC RSX hießen (ich hatte 2 RSX im Einsatz, eines mit dem Diskettenbetriebssystem und eines für die Speichererweiterung mit einem Monitorprogramm. 7 können direkt angesprochen werden, maximal 255 indirekt).

Die Betriebsweise wird bei BASIC deutlich: Der BASIC Interpreter kopierte die Quelltextzeile in den Speicherbereich unter den Videospeicher (wie bei den meisten Rechnern waren natürlich nicht mal die 48 K voll nutzbar, aber immerhin 43.903 Bytes für BASIC – mehr als bei jedem anderen 8-Bit-Computer den ich kenne). In diesem Bereich hatten BASIC Interpreter und Betriebssystem Zugriff auf die Daten. Nur das Betriebssystem griff auf den Videospeicher zu – der Zugriff erfolgte über eine Tabelle von Sprüngen im oberen Bereich ab der Adresse BB00H. Diese führten zu einem RST Befehl, der über einen Out Befehl das Betriebssystem in den Adressraum einblendete. Wer eigene Programme schrieb und das Betriebssystem aufrief tat also gut daran diese erst bei 4000H beginnen zu lassen….

Analog konnte das Betriebssystem auch die ROM Erweiterungen im oberen Bereich einblenden. Da es schon dieses Konzept gab war es kein Problem es zu erweitern als 128 KB Speicher modern wurden. Beim CPC 6128 wurde das umgesetzt. Ich glaube später waren sogar Modelle mit 256 und 512 KB auf dem Markt, aber nicht mehr in Deutschland.

Das Umschalten erfolgte durch Befehle wie OUT A,(BC), wobei BC im zweiten Registersatz (den man nicht benutzen sollte) immer das aktuelle Steuerwort enthielt welches RAM/ROM gerade aktiv war.

Der nutzen war jedoch eingeschränkt, weil die grundlegende Architektur aus Kompabilitätsgründen nicht verändert wurde. Das Modell 6128 hatte einige zusätzliche Befehle, die als RSX realisiert wurden, das waren Befehle in ROM’s, die mit „|“ anfingen. Es gab zwei Einsatzmöglichkeiten: Nutzung um vier Bilder zu je 16 KB zwischenzuspeichern oder als RAM-Floppy von 64 KB Größe für feste Datensatzgrößen (dafür aber freier Zugriff). Nicht viel. Fremdhersteller wären da erfindungsreicher.

RAM und ROMMein CPC 464 hatte eine 512 KB Speichererweiterung von Vortex. Unter Basic konnte man dort 10 Programme von je 32 KB Größe ablegen und einen 32 KB Druckerspooler nutzen. Der Rest des Speichers wie beim 6128 als RAM-Floppy. Immerhin war der Speicher für BASIC Programme nutzbar, es gab auch GOTO und GOSUB Befehle die direkt eine Bank springen konnten. Ich nutzte das für ein Kombiprogramm: Einen Texteditor mit Assembler / Monitor. Das waren eigentlich drei Programme aber so liefen sie gelichzeitig.

Viel sinnvoller war die Nutzung unter CP/M. CP/M konnte ab der Version 3.0 Bank-Switching. Vortex lieferte eine Anpassung für CP/M 2.2 die fast so viel Speicher freischaufelte. Da CP/M ein anderes Betriebssystem war, musste es keine Rücksicht auf die Position von BASIC Interpreter und RSX nehmen. So kam man in den Genuss von rund 61-62 KB freiem Speicher unter CP/M. Den Rest belegten die Sprungvektoren und Datenpuffer. Vortex nutzte auch den restlichen Speicher als RAM Disk (448 KB). Das war wirklich praktisch. Ich schrieb auf meine Disketten ein Startprogramm das beim Booten einfach den ganzen Inhalt in die RAM Disk kopierte. Nur das Rückkopieren dürfte man nicht vergessen. In Zeiten in denen Disketten langsam waren war das traumhaft.

Eine zweite Methode war bei 6502 Systemen nötig. Diese hatten keinen Steuerbus mit eigenen Adressleitungen die für diesen Zweck genutzt wurden. Hier wurden MMU (Memory Management Units) eingesetzt. Das System einer MMU ist relativ einfach: Sie enthält eine Reihe von Tabelleneinträgen, jeder steht für eine Adresse. Anstatt 16 Bits für den ganzen Adressraum benötigt der Prozessor dann nur wenige Bits um die Tabelleneinträge zu adressieren. Ein einfacher Baustein ist z.B. das 74LS610, ein TTL Baustein mit 16 Registern ‚a 12 Bit Breite.

Das ganze ging dann z.B. so: 4 Bits werden benötigt um die 16 Register anzusprechen. Daher werden die oberen 4  Adressleitungen mit den Leitungen welche ein Register des 74LS610 selektierten verbunden. Die Datenleitungen 1-8 (der 6502 konnte nicht in einem Schritt ein 16 Bit Wort ausgeben) wurden mit dem 6502 verbunden. Dazu kam dann noch eine Logik, um den Chip zu selektieren, wie dies bei anderen Periphierebausteinen geschieht.

Der 6502 gibt nun zuerst an den 74LS610 ein Datenwort aus. Es enthält eine 8 Bit Adresse und wird in ein Register geschrieben. Danach kann auf den Speicher zugegriffen werden, Die unteren 12 Bits kommen vom 6502. Sie selektieren eine 4 KByte große Seite im Adressraum. Die oberen 8 Bits kommen vom 74LS610. Sie selektieren eine 4 KB Seite in einem 1 MB großen Adressraum. (12 Adressbits vom 6502 und 8 Bits vom 74LS610). ein 8080/Z80 System hätte mit demselben Baustein sogar 16 MB adressieren können.

Warum war Bankswitching trotzdem so schlecht beleumundet? Man darf nicht vergessen, dass im Prinzip auch der 8086 Bank Switching nach Art einer MMU durchführte. Der 8086 sprach nur ein Segment von 64 KB an. Mit drei Segmentregistern konnten drei Bereiche im 1 MB Großen Adressraum angesprochen werden. Durch Indexregister konnte die Startadresse jeweils in 16 Byte Abständen verschoben werden. Das ist das gleiche Prinzip wie bei einer MMU, nur ist die Programmierung etwas einfacher.

Die Gründe dafür liegen, dass Rechner mit mehr als 64 KB RAM recht spät aufkamen. CP/M verfügte ab 1982 die Möglichkeit für Bankswitching. Der Speicher wurde zuerst nur genutzt um CP/M in den zweiten 64 KB Bereich auszulagern. Schon es war ein Kompromiss zwischen dem alten CP/M das für Anwendungsprogramme den Bereich zwischen 100H und dem Start des Betriebssystems zur Verfügung stellte, aber einen durchgängigen Adressbereich. Wenn es mit der Komptabilität gebrochen hätte und Systemaufrufe für das Auslagern von Programmspeicher zur Verfügung gestellt hätte, so hätte man sicher den Speicher effizienter nutzen können.

Die Umsetzung von Vortex den Speicher als RAM-Floppy und Spooler zu nehmen, war auch recht populär bei größeren Rechnern. Die meisten Anwendungsprogramme für CP/M waren ja auch alt und liefen auch unter dem alten CP/M 2.2. Sie kamen gut mit 64 KB und mehr Speicher machte einfach das Arbeiten bequemer, aber stellten nicht mehr Speicher zur Verfügung. Man darf nicht vergessen, dass in den frühen MS-DOS Versionen es auch nur das COM-Dateiformat für ausführbare Programme gab – auch das war auf 64 KB Größe beschränkt.

Noch schlechter war das bei Heimcomputern gelöst die unter BASIC arbeiteten, sei es Commodore C128, MSX oder Spektrum 128. Die Rechner wurden einfach auf 128 KB aufgebohrt und der zusätzliche Speicher konnte nur auf Umwegen genutzt werden. Die Befehle für RAM-Floppy und Grafikbildschirme beim CPC 6128 waren da ja schon „fortschrittlich“. Bei den MSX Rechnern konnten schon mehr als 32 KB RAM nur über Maschinenspracheprogrammierung genutzt werden. Mit den BASIC Interpretern und dem Betriebssystem im ROM war klar dass für Programme maximal 40 KB zur Verfügung standen. Ich glaube damit wären auch viele zufrieden gewesen, wenn die anderen 64 KB einen anderen Vorteil versprochen hätten. Warum hat man den zusätzlichen Speicher nicht als Videoram benutzt? Das wird sowieso von der CPU verwaltet. Der in vielen Rechnern eingesetzte MC 6845 CRT Kontroller kann bis zu 512 KB adressieren. Wenn die zweiten 64 KB der populären 128 KB Computer als Videoram ausgelegt worden waren, dann wäre eine Auflösung von 320 x 200 in 256 Farben oder 640 x 400 in 4 Farben möglich gewesen – fast EGA Auflösung. Das wäre gerade bei den Spielmaschinen von Vorteil gewesen.

Die 128 KB Maschinen sehr ich als typische letzte Vertreter einer Serie – so wie heute mehr Megapixel zählen, egal ob dadurch die Bildqualität besser wird, hat man damals eben einfach auf die KB Angaben geschaut – egal ob diese nutzbar waren.


So, da dies ein sehr langer Beitrag war. Heute mal wieder einen Tag Pause. Vielleicht kommt ja jemand auf ein allgemeines Rätsel, das nicht so schnell lösbar ist? Ich habe inzwischen mit meinem nächsten Buch begonnen, das den Titel „Das ist drin – der etwas andere Lebensmittelführer“ trägt. Es geht wie bei anderen Lebensmittelführern über die Zusammensetzung dieser, nur eben mehr Aufmerksamkeit auf verarbeitete Lebensmittel und Zusatzstoffe gelegt.

5 thoughts on “Bankswitching

  1. Beim C64 war es so, dass es ebenfalls einen Baustein fürs Managen des Adressraumes gab, der die Chipselects verwaltet hat und als Input die oberen Adressleitungen plus drei Konfigurationseingänge hatte. Diese drei Bits kamen vom Parallelport des 6510 (der entscheidende Unterschied zum 6502 war nur dieser eingebaute 6-Bit Port, der über Adresse 0/1 angesprochen wurde). Damit konnte man programmatisch also 8 verschiedene Konfigurationen einstellen, welches RAM oder ROM angesprochen wurde.

  2. Bernd, ich schätzer deine Raumfahrtartikel sehr, leider kann ich das gleiche nicht von deinen Computerartikeln sagen.

    Der C-16 (mit 64KB bestückt) bot 60.671 bytes für Basic-Programme, der C-128 122.365 bytes (sagt jedenfalls Wiki). Beide hatten auch einigermassen brauchbare Grafikbefehle (im Gegensatz zum C64, an den du wohl dachtest).

    Das was du als MMU bei 6502-Systemen bezeichnest ist gemeinhin als popeliger Adressdecoder bekannt (und wurde auch schon 1985 allgemein so genannt).

    @Arne: du vertauscht da die Nutzung von Parallel- und CPU-Port. Allerdings steuerte einer der beiden CIA’s 2 Bits für die Adressierung des RAM’s durch den VIC bei.

  3. Man muss hier ja wirklich sehr genau aufpassen, was man schreibt. Da werde ich wohl an der Perfektion meinen nächsten Gastblogs etwas länger feilen müssen, damit er nicht geringgeschätzt wird.
    Der 74LS610 wurde auch 1985 nicht Adressdekoder genannt, sondern „Memory Mapper“ (siehe z.B. Datenblatt von Texas Instruments). Im Gegensatz zu einem simplen Dekoder enthält er z.B. noch Map-Register. Im C-128 wurde der entsprechende Baustein 8722, der für das 6502-Derivat 8500 das Memory Management übernahm, auch tatsächlich schon MMU genannt.
    Ich habe übrigens bei der Beschreibung des C64 nichts vertauscht, sondern mich höchstens missverständlich ausgedrückt. Ich meinte mit „Parallelport des 6510“ natürlich nicht den externen Port des C64, sondern den parallel adressierbaren, bidirektionalen I/O Port der CPU. P0-P2 gehen zum Adressmanager, während P3-P5 die Datasette ansteuern.

  4. Ach ja Michael?
    Das mit der MMU hat Arne ja schon korrigiert wobei ich natürlich bewusst einen einfachen Baustein genommen habe um das Prinzip zu erklären (das 74LS128 findet man auch noch selten als Baustein auf der Platine sondern wie schon erwähnt meist in einem ULA integriert).

    Der C128 hat einen BASIC Programmspeicher von 1C00H bis FF00H (im Textmodus) oder 4000H bis FF00H im Grafikmodus und einen Variablenspeicher von 400H-FF00 in Bank 2. Aber eben keine 122KB durchgängig. Das ist wie beim Schneider 6128 wo man die zweite Bank eben als RAM Disk nehmen kann. Immerhin sind es mit 48.896 Bytes etwas mehr….

    Quelle ct 10/1984 S.34 ff (Du solltest wirklich die Wikipedia meiden, wenn Du verlässliche Informationen suchst).

    Wenn Du willst suche ich Dir auch gerne die Infos über den C16 raus….

  5. Ich kam gerade von einem Nachrichtenportal und habe da was ueber die Bankenkrise gelesen, und als ich hier den Titel „Bankswitching“ las, musste ich an die HRE & Co. denken, wie sie ihre Schulden von ihrem eigenen Konto in „Bad Banks“ auslagern koennen und somit die „Bank switchen“, waehrend ich, wenn ich im Dispo bin, als Belohnung noch 15% Ueberziehungszinsen kriege und wenn ich die nicht bezahlen kann, Hartz IV 😉

    Aber das gehoert jetzt gar nicht hier her 😉

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.