Ich nehme an, viele der älteren Blogleser haben in den Achtziger einen Heimcomputer gehabt, Geräte wie der C64, die CPC Serie oder Sinclair Spectrum (um nur die am weitesten verbreiteten Marken zu nennen, es gab noch unzählige andere) waren selbst noch populär als Heimcomputer mit 16 Bit gab. Erst Anfang der Neunziger Jahre sanken die Preise von PC aber auch Amigas und Ataris soweit, das es keinen Sinn machte einen 8 Bitter zu kaufen.
Kurz: die 8-Bit Rechner hatten ein langes Leben, es hätte meiner Ansicht nach noch länger sein können, wenn ihr Adressspeicher größer gewesen wäre. Die drei populärsten 8 Bit Prozessoren und ihre Nachbauten/Nachfolger (Intel 8080, Mos 6502 und Motorola 6800) hatten alle einen 16 Bit Adressbus, konnten also 216 = 65536 Bytes adressieren. Der Adressbus eines Prozessors muss nicht zu seinem Datenbus passen und der wiederum nicht zur internen Registerbreite. Der erste Mikroprozessor Intel 4004 hatte einen 12 Bit Adressbus bei 4 Bit Datenbus. Der Intel 8086 hatte 16 Bit Datenbus und 20 Bit Adressbus, die Motorola 68000 16 Bit Daten- und 24 Bit Adressbus. Nur bei der 32 Bit Generation war es so, dass Daten und Adressbus gleich groß waren, aber bei den aktuellen Prozessoren gilt das auch nicht mehr. Intels iCore 13600 Prozessor unterstützt z.B. maximal 192 GByte RAM, das sind 38 Bits. Das gilt übrigens auch für Großrechner. Es ist nicht unbedingt „natürlich“, dass es bei 8 Bittern so 16 Bit für den Adressbus sind.
Doch wie kam es dazu?
Als die ersten 8 Bitter erschienen, waren Mikroprozessoren noch etwas relativ neues. Intels 4004 und Texas Instruments TMS 1000 erschienen 1971. Intels erste 8 Bit Prozessor, allerdings mit einem kruden Design erschien 1972. Die 8 Bitter folgten dann relativ schnell aufeinander: Intel 8080 und Motorola 6800 erschienen 1974, der MOS 6502 kam im Jahr 1975 und der Zilog Z80 folgte 1976. Danach setzten die Firmen eben wegen dieser schnellen Entwicklung gleich auf die nächste Generation: Intels 8086 erschien 1978, Motorolas 68000 1979 und Zilogs Z8000 ebenfalls 1979. Wenn es neue 8 Bitter gab, so waren sie graduelle Verbesserungen wie der 6802 oder 6809 von Motorola, oder der Intel 8085.
Am Adressbus wurde nichts mehr geändert und der entstand in diesen Prozessoren eben zwischen 1974 bis 1976. 1974 erschien das 4 Kbit DRAM, üblicher war damals aber noch die Vorgängergeneration mit 1 Kbit Kapazität. Mit 4 Kbit RAM, die 512 Byte speichern können, braucht man aber 128 RAM-Bausteine um den Speicher voll auszunützen. Das ist dann nicht mehr die Platine eines Heimcomputers, auch weil der Speicher 1974 noch teuer war. Noch drei Jahre später, als es schon 16 Kbit RAM gab, kostete das Aufrüsten eines Apple II (der erste Rechner, der es erlaubte den Speicherausbau voll zu nutzen) mehr als die Basisausstattung des Apple II mit 4 KByte.
So verwundert es nicht, dass die Firmen sich auf 16 Adressbits beschränkten. Bis man diesen Adressraum voll ausnutzen würde, würde es Jahre dauern und dann gäbe es schon die Nachfolgenegation mit 16 Bit, wer sollte dann noch einen veralteten 8 Bitter kaufen? So war dem auch. Die ersten 8 Bit Rechner die 64 KByte RAM hatten, erschienen erst nach den ersten 16-Bit-Prozessoren und bis 64 KByte auch für Heimcomputer erschwinglich waren sollte es noch bis 1983/84 dauern, da stand schon die 32 Bit Generation in den Startlöchern. Aber es kam anders: die Firmen meinten, ihre Prozessoren würden in der Industrie für Steueraufgaben eingesetzt werden. Das jemand auf einem 8-Bit-Prozessor eine Anwendung nutzen würde wie Textverarbeitung, Datenbanken oder Tabellenkalkulation – all das gab es schon zu 8 Bit Zeiten – war für sie unvorstellbar.
Es gab natürlich noch Nachfolger der 8 Bitter, die einen größeren Adressbereich boten, zumindest soweit ich weiß in der 6502 und Z80 Linie, Motorola konzentrierte sich, nachdem sie nicht so viele 6800 Prozessoren absetzen konnten, darauf ihn als Mikrocontroller umzubauen und waren damit sehr erfolgreich: schon vor mehr als 20 Jahren konnte die Firma über 1 Milliarde verkaufter 68xx Mikrocontroller vermelden.
Der Nachteil dieser Nachfolger war, dass sie nicht nur den Adressbereich erweiterten, sondern auch neue Features integrierten. Der HD64180 von Hitachi integriere serielle Schnittstellen, DMS, Timer, MMU und einiges mehr. Noch weiter ging der 65816 von Western Digital, der ein 16 Bit Ptrozessor mit 8 Bit Emulationsmodus war. Wie man aber schon an den Herstellern sieht: Die Entwickler Mos Technologies und Zilog hatten kein Interesse an einer Weiterentwicklung. Diese Prozessoren waren leistungsfähig, aber sie waren auch teuer und bei den 8 Bit Rechnern zählte eben vor allem der Preis.
Ich will mal skizzieren, dass es durchaus möglich gewesen wäre, einen größeren Adressraum anzubieten. Prinzipiell gibt es dafür drei technische Lösungen. Alle drei erfordern weitere Adressleitungen oder einen gemultiplexten Adressbus, darauf komme ich noch zurück.
- Ein Register, das die zusätzlichen oberen Adressleitungen beinhaltet. Der normale (64 Kilobyte) Adressraum ist dann ein Fenster innerhalb eines größeren Adressraums.
- Wie oben, nur das ein Register nicht direkt die zusätzlichen Datenleitungen beinhaltet, sondern verschoben zum Adressraum, den es schon bisher gab, addiert wird. ähnlich gegen Intel beim 8086 vor.
- Schlüsselregister in der CPU (PC, SP, Arbeitsregister) jeweils erweitert um ein weiteres Adressregister.
Alle drei Möglichkeiten haben Vor– und Nachteile. Bei Möglichkeit 1 ist der offensichtlichste Nachteil, dass es nicht möglich ist zwischen den 64 KByte großen „Kacheln“ zu kopieren, also Daten austauschen, daher würde ich sie von vorneherein ausschließen. Möglichkeit 2 hat diesen Nachteil nicht. Hier wird der Inhalt dieses neuen Adressregisters nicht einfach oben an die schon existenten 16 Adressleitungen addiert, sondern diese bzw. das Register vorher verschoben und addiert. So ging Intel vor, um beim 8086 die 64 KByte großen Segmente im 1 MByte großen Adressraum um jeweils 16 Byte zu verschieben. Diese Möglichkeit erlaubt das Kopieren zwischen den „Fenstern“, aber jeder Adresszugriff wird langsamer, weil eine Addition vorgeschaltet ist. Möglichkeit 3 ist die flexibelste und erfordert nur anstatt einem mehrere Register. Ich will dies am Beispiel des Z80 zeigen, da ich dessen Architektur kenne.
Der Z80 stammt vom 8080 ab und dieser hatte folgende Architektur:
- Es gab die 8 Bit Rechenregister A,B,C,D,E,H und L. Im Akkumulator A landeten alle Ergebnisse von 8 Bit Rechnungen und er war auch immer ein Operand bei 8 Bit Rechnungen.
- Die Register B und C, D und E und H und L konnte man für 16 Bit Rechnungen zusammenfassen, das Register HL auch für einen 16 Bit Speicherzugriff. Neben diesem indirekten Zugriff (Lade den Wert von einer Adresse, die Du in HL findest) gab es noch die Möglichkeit einen 8 oder 16 Bit Wert als Konstante direkt zu laden oder ebenfalls indirekt, dann aber über eine direkt angehängte Adresse.
- Die Register PC für den Programmcounter und SP für den Stackpointer waren von vorneherein 16 Bit Register.
Die Z80 erweiterte dies und erlaubte auch für die Kombination BC und DE einen 16 Bit Speicherzugriff und führte zwei 16 Bit Indexregister IX und IY ein, die zusätzlich noch mit einem Displacement (Versatz für Indexe) arbeiten konnten. Daneben wurde der gesamte Registersatz verdoppelt und es konnte über einen Befehl umgeschaltet werden.
Meiner Ansicht nach braucht man so mindestens drei, besser vier weitere Register für den oberen Adressbereich. Ich bin, weil die meisten Register bisher 8 Bit breit sind, von einem 8 Bit Register ausgegangen, das sind dann maximal 16 MByte – die Adressleitungen A16 bis A23.
- Ein Register, das den PC auf 24 Bit erweitert
- Ein Register das den SP erweitert (optional, man könnte nach wie vor von einem „lokalen“ Stack, der nur innerhalb eines 64 K Fensters verschoben werden kann zurechtkommen, ohne Probleme zu haben)
- Zwei Register für die Erweiterung von Speicherzugriffen über Register.
Das letzte muss ich erklären. Im Prinzip würde ja ein Register für den Speicherzugriff reichen, will man aber innerhalb des Adressraumes kopieren, so braucht man zwei Register für Quell- und Zieladresse und da hat der Z80 mit den befehlen LDIR und LDDR die in einem Befehl ein Byte von einer Sourceadresse in HL an eine Zieladresse in DE kopieren, HL und DE inkrementieren (bei lddr dekrementieren) und das Register BC dekrementieren und dies wiederholen bis BC Null ist zwei tolle Kopierbefehle.
Kleine Bemerkung an die, die bei meinem letzten Block zum Thema den Z80 so schlecht gemacht haben: folgende Befehlsfolge kopiert 16 KByte von Adresse 0000H an C000H und das in 21 x 16384 Taktzyklen = 0,087 Sekunden bei einem 4 MByte Z80 – wie lange ist die Befehlsfolge bei einem 6502 und wie lange braucht er bei der Äquivalenztaktfrequenz von 2 MHz? (Ein 6502 hat pro 1 Takt zwei interne Taktzyklen, ein Z80 nur einen).
Ld hl,0000H
ld de,c000h
ld bc,4000h
ldir ; insgesamt 8 Bytes
Sieht man zwei Register für DE und HL vor, so ist dieser und zahlreiche andere Blockbefehle möglich wie auch einfachere Speichertransfers. Vier Register (Erweiterung von PC, SP, DE und HL) und die dazu nötigen befehle kosten wenig CPU Platz, man darf nicht vergessen, dass beim Übergang vom 8080 zum Z80 12 neue 8 Bit Register eingeführt wurden und die Befehlszahl sich verdoppelte, hier wären es nur vier Register und pro Register zwei Befehle zum Laden des Registers bzw. dem Auslesen des Registers.
Auch die Kompatibilität zu bisherigen Anwendungen wäre gegeben, wenn die neuen Adressen einfach oben angehängt werden, also A16 bis A23. Benötigt man nur 64 KByte Speicher, so verbindet man die Adressen einfach nicht. Der Knackpunkt und das war wohl der Punkt, weshalb man es nicht gemacht hat, war dass so das Gehäuse der CPU in jedem falle mehr Pins gehabt hätte. Das klingt heute komisch, aber zum einen fielen die Preise für die CPUs so rasch, das die Gehäuse mit jeweils eigenen Metallpins bei CPU Preisen von wenigen Mark dann bald ein Kostenfaktor waren. Es bedeutet auch das man auf einer Platine mehr Leitungen ziehen musste und die Platine so teurer wurde. Deswegen war schon beim 8080/Z80 der Steuerbus mit dem Datenbus gemultiplext, benutzten also dieselben Leitungen und dieselbe Überlegung führte auch beim 8086 zu einem gemultiplexten Bus, und um diesen noch günstiger zu fertigen, gab es den 8088 mit weiterer Reduktion der Pins, wenngleich auf Kosten der Geschwindigkeit.
Auf der anderen Seite gab es in der Endzeit der 8 Bitter zahlreiche Rechner mit mehr als 64 KByte Speicher eie den C128, Sinclair Spectrum 128, Amstrad 6128 oder die Joyce Reihe, da benötigte man Zusatzbausteine wie die 74138 / 139 der 74 IC Serie die aus einem gespeicherten Wert weitere Adresssignale bereitstellten, um weitere Bänke anzusprechen.
Meine Erfahrung mit solchen gebankten Systemen ist, dass sie keine optimale Lösung waren. Man konnte den zusätzlichen Speicher nur für bestimmte Zwecke nutzen, so als Druckerspooler oder RAM-Floppy. Das Grundproblem war, dass eben immer ein Teil des Adressbereiches weg war und durch einen anderen Block ersetzt wurde, dass machte die Programmierung aufwendig und selbst CP/M 3.0 das als Betriebssystems Babys unterstützte hatte keinen einfachen Mechanismus für Anwendungen mehr Speicher effektiv zu nutzen. Das wäre bei einem linearen, größeren Speicher kein Problem.
Ich denke die 8 Bitter hätten noch ein paar Jahre mehr gehabt, wenn sie mehr Speicher adressieren hätten können. Denn der war knapp. Viele Anwendungen, die ich unter CP/M nutzte wie Wordstar oder DBASE waren zu groß für den Speicher. Sie lagerten Funktionen in Overlays aus, Segmenten die von Disk geladen wurden. Ich selbst habe diese Overlays genutzt. Mein Programm „Rakete“ entstand 1987 und war bald zu klein für 64 KByte. Einige Routinen sind bis heute im Programm. Spiele hätten von einem größeren Bildschirmspeicher profitiert, der bei 64 K klein war, sonst hätte man wenig Speicher fürs System gehabt, mein System hatte mit 16 KByte schon einen großen Bildschirmspeicher. Die meisten anderen Systeme hatten nur ein 6 oder 8 KByte großen Speicher.
Mit schnelleren CPUs die in den Achtzigern erschwinglich wurden, wäre auch ein schnelleres System möglich gewesen. Der Z80 erschien mit 2,5 MHz und wurde bis 8 MHz getaktet. Beim 6502 war der Sprung von 1 auf 3 MHz genauso groß.