SuperMicro80
Translate from German into English (some links may be mistranslated, then turn back to the original site):
Nachdem dieses Selbstbauprojekt jahrzehntelang im Keller gelagert war, habe ich es vor Kurzem wiederentdeckt. Es machte mich schon neugierig, ob dieser Z80-Rechner noch lauffähig ist. Anfang der 80-er Jahre habe ich so manche Stunde damit verbracht, dieses Projekt zu realisieren. Damals habe ich durch "learning by doing" so richtig verstanden, wie ein Computer mit seiner Hard- und Software funktioniert. Wenn man es nicht selber gemacht hat, hat man es auch nicht wirklich verstanden...
Eingeschaltet und: geht !!! Nach über fünfundzwanzig Jahren zeigt sich die Hardware sehr willig; selbst die alten Disketten sind ohne Ausnahme lesbar. Auf Anhieb. Dann im Gedächtnis gekramt, wie das Ding zu bedienen ist. Nach einigen Stunden ist erstaunlich Vieles wieder präsent. Wie war noch dieser oder jener Befehl? Zum Glück habe ich in meinen alten Schätzen auch noch das passende Buch gefunden: "Jürgen Plate - Betriebssystem CP/M". Und: "Klaus Kämpf - CP/M 2.2 Assembler Listing". Da steht alles drin, was zu "CP/M 2.2" zu sagen ist.
1983 hatte ich begonnen, diesen Rechner zu konstruieren und zu bauen. Das war die Zeit der "Apple II"-Computer, der ersten "CP/M"-Systeme wie "Osborne", oder die Computer von Tandy, z.B. "TRS-80". Solch einen Tandy-Nachbau habe ich mir seinerzeit besorgt ("Komtek 1") und damit meine ersten Erfahrungen in Sachen Microcomputer - so hießen die Dinger damals - gemacht. Nein, stimmt nicht: davor hatte ich einen "Sinclair ZX81", aber der zählt nicht...
Der "Komtek 1" erwies sich relativ schnell als zu klein und nicht erweiterungsfähig. Andere Systeme waren mir zu teuer; also war Selbermachen angesagt. Die Basis sollte TRS-80-kompatibel sein. Der Grund dafür war, dass ich einige Software dafür ergaunert hatte. Die lief unter dem Diskettenbetriebssystem "NEWDOS80" (Festplatten waren unerschwinglich, meine erste Festplatte habe ich erst Jahre später (1990) gekauft: 42 MByte Kapatität, Preis: 800 DM !!).
Den "Komtek 1" hatte ich extern um 2x 5¼-Zoll-Disketten erweitert (einseitig, 40 Spuren, einfache Dichte, Brutto-Kapazität 100 KByte, Preis: 400 DM pro Stück !!)
Im Netz habe ich einige Unterlagen zum Komtek 1 gefunden.
Das ganze sollte modular und möglichst einfach erweiterbar werden. Da lag die Bauweise in 19-Zoll-Einschubtechnik nahe. Schaltbilder vom "TRS-80", bzw. vom "Video-Genie" - ein anderer Nachbau des "TRS-80" - lagen mir vor. Ich habe alles an Hardware-Beschreibungen studiert, derer ich habhaft werden konnte. Dann habe ich mich an diese Hardware-Beschreibungen angelehnt - nachdem ich verstanden hatte, wie das alles zusammenspielt - und verändert nachgebaut: auf Europaplatinen und in "Fädeltechnik" verkabelt. Die reinsten TTL-Gräber. Aber hochintegrierte Chips waren noch Mangelware.
Leider habe ich von den ersten Aufbauten keine Fotos mehr, ebensowenig von der ersten Diskettenstation. Ca. 1988 habe ich einen günstig erworbenen Monitorteilesatz (Bildröhre + Platine, ohne Netzteil) samt zweier neuer Diskettenlaufwerke (doppelseitig, 80 Spuren, doppelte Dichte, Brutto-Kapazität 800 KByte) zusammen in ein Gehäuse verbaut.
Bei der Fädeltechnik werden dünne lackisolierte Kupferdrähte über Plastikkämme geführt. Beim Anlöten verbrennt die Isolationsschicht. Die Kupferbahnen habe ich in der Regel lediglich zum Heranführen der Stromversorgung an die ICs verwendet. Die Fädeltechnik ist für Null-Serien ideal - bei genügend geringer Taktfrequenz versteht sich. Da ist jederzeit eine Änderung / Erweiterung möglich. Das war auch gut so: später habe ich da noch einiges verändert. Platz für Reserve-ICs habe ich berücksichtigt
Die Video-Baugruppe erzeugt ein BAS-Signal (Bild, Austastung, Synchronsignale). Es wird ein Videocontroller-Chip (GPU: HD6845) verwendet, der sich um das Auslesen des Bildschirmspeichers und das Timing kümmert. Es sind 2 Charaktergeneratoren (EPROMS) vorhanden: einmal für den ASCII-Satz und ein weiterer für den deutschen Zeichensatz plus Pseudo-Grafik-Symbole. Zusätzlich gibt es 2 Bildschirmspeicher (jeweils 2 KByte für 16 Zeilen à 64 Zeichen im "TRS-80"-Modus bzw. 25 Zeilen à 80 Zeichen im "CP/M"-Modus, der später dazu kam)
Ich habe damals immer behauptet, das sei die schnellste Grafikkarte, die ich kenne. Üblicherweise durfte die CPU nur bei Bild- oder Zeilenwechseln schreibend auf den Bildschirmspeicher zugreifen. Das sollte Fehler (Flackern) verhindern, sorgte aber bei den ziemlich schmalen Zeitfenstern dafür, dass die CPU fast immer mit Warten auf diese Wechsel beschäftigt und die Ausgabe somit lähmend langsam war.
Ich habe dadurch Abhilfe geschaffen, dass ich zwei hintereinander liegende Bildschirmspeicher vorgesehen habe. Damit kann die CPU immer - ohne Warteschleifen - schreibend auf den ersten und die GPU immer lesend auf den zweiten Speicher zugreifen. Im Normalfall (ohne CPU-Zugriff) wird mit dem Auslesezyklus der GPU der erste (CPU-) Speicher gelesen und der zweite (GPU-) Speicher damit beschrieben. Greift die CPU schreibend auf den ersten Speicher zu, wird sofort die Verbindung der beiden Speicher unterbrochen und die GPU liest nun aus dem 2. Speicher, während die CPU mit voller Geschwindigkeit den ersten Speicher beschreiben kann. Ist der Schreibzugriff beendet, so kehrt das System zum Normalzustand zurück und der nun aktualisierte Inhalt des ersten Speichers wird in den zweiten kopiert und damit sichtbar. Das Timing ist ziemlich kritisch und hat so manche Stunde Probieren gekostet. Hat sich aber gelohnt!
Die EPROM-Bank mit 12,5 KByte BASIC-Interpreter, Bootloader, Adresslogik. Im "TRS-80"-Modus liegen in den unteren 16 KByte die EPROMS mit dem Betriebssystem incl. BASIC. Dort sind auch die Hardware-Adressen und der Adressraum des Bildschirmspeichers hineingemappt. Die darüber liegenden 48 KByte RAM stehen für das Anwendungsprogramm und seinen Daten zur freien Verfügung. Die Lesezugriffe auf die EPROMS können nur relativ langsam erfolgen. Deshalb wird dieser Bereich in das (schnellere) RAM kopiert, die EPROM-Bänke danach abgeschaltet, der untere RAM-Bereich hineingemappt, schreibgeschützt und dann der hohe Systemtakt angelegt.
Den "CP/M 2.2"-Modus habe ich später nachgerüstet. In diesem Modus ist das Speicherlayout ganz anders: Bis auf die eingemappten Hardwareadressen hier ganz am oberen Ende des Adressraumes steht der volle RAM-Bereich ab 0000H zur Verfügung. Die Umschaltung zwischen den Modi wird durch Register gesteuert. Gebootet wird immer im "TRS-80"-Modus. Je nach geladenem Bootsektor wird dann das nötige Speicherlayout eingestellt und "NEWDOS80" oder "CP/M" nachgeladen.
Jahre später gab es von der Computer-Zeitschrift "mc" - die gibt es inzwischen längst nicht mehr - eine RAM-Disk als Bausatz. Kapazität: unglaubliche 1 MByte. War ziemlich teuer - deshalb habe ich zunächst nur den halben Speicher bestückt. Aber enorm schnell. Das BIOS bindet sie als Laufwerk "F" ein.
Eine PC-Sitzung sah dann so aus: Floppy einlegen, booten, die Programme, mit denen man arbeiten wollte - ggf. von einer 2. Diskette - auf die RAM-Disk kopieren und dann dort temporär arbeiten. Am Ende durfte das Zurückkopieren auf Floppy nicht vergessen werden... Programme wie "WordStar" - eine Textverarbeitung, die diesen Namen eigentlich nicht verdient hat - legten temporäre Dateien an und luden sog. Overlays nach (weil nicht alles an einem Stück in den Arbeitsspeicher passte). Auf Floppy ziemlich langsam, mit der RAM-Disk enorm schnell. Super!
Es folgen diverse Schaltungsunterlagen; alle von Hand mit Bleistift erstellt - teilweise auf Umweltpapier und nach über 25 Jahren nur noch schlecht lesbar. Unzählige Male verändert... Alle Schaltpläne gibt es für die jung gebliebenen Nostalgiker hier als Download (.pdf) verfügbar.
Es folgen einige Impressionen in Form von Bildschirmfotos.
"CP/M" (Control Program for Microcomputer) wurde Anfang der Achtziger Jahre ziemlich populär. Quasi der Vorläufer von MS-DOS. Tatsächlich hat BillyBoy wieder ordentlich kopiert und als Seines ausgegeben. Viele DOS-Systemaufrufe erinnern verdammt stark an "CP/M".
Ein Freund hatte seinerzeit einen "MSX"-Computer (mit MSX wurde seinerzeit von einer Reihe von Firmen versucht, einen Standard für Heimcomputer zu etablieren), der mit "CP/M" lief. Von dem bekam ich damals das Betriebssystem. Dann gab es einen Fachartikel in der "mc", wo ein BIOS für einen "CP/M"-Rechner beschrieben wurde. Mit dem Autor des Artikels habe ich seinerzeit Kontakt aufgenommen und von ihm bekam ich das vollständige BIOS-Listing - in Papierform! und sehr rudimentär. Meine Aufgabe bestand dann darin, die bestehende Hardware so umzubauen, dass sie "CP/M" fähig wurde. Siehe dazu meine Anmerkungen weiter oben. Und dann musste das BIOS auf meine Hardware angepasst werden, und vor Allem: verbessert werden; das war nämlich ziemlich erbärmlich: z.B. wurde die Tastatur nicht im Interrupt abgefragt. Es gab nur ein Diskettenformat, dass zu nichts kompatibel war. Das wurde geändert. Mit "WordStar", "M80"-Macroassembler und "Link" hat sich der Rechner mit der Zeit selbst am Schopfe aus dem Sumpf gezogen. Heißt: ich habe das BIOS auf dem Zielrechner weiterentwickelt.
Da bei "CP/M" bis auf die Programmier-Schnittstelle nichts standardisiert war, kochte so ziemlich jeder Hersteller sein eigenes Süppchen: es gab unzählige Diskettenformate (verschiedene Anzahl der Sektoren pro Spur und Sektorlängen) und Bildschirmformate. Ich hatte seinerzeit einige Programme ergattert, die für einen Alphatronic P3 (Triumpf-Adler) gedacht waren. Damit ich diese Programme verwenden konnte, musste mein Rechner dieses Diskettenformat lesen können und den Bildschirm korrekt emulieren. Also: eine spezielle BIOS-Version musste her!
Hoppla, da habe ich doch noch ein altes Dia gefunden. Meine erste Diskettenstation (Bildmitte) und mein erster Monitor - bernsteinfarben, das war damals topmodern:
[Update:]
Eigentlich hatte ich nicht vorgehabt, diesen Artikel irgendwann einmal zu ergänzen. Aber es hat sich ergeben, dass ich (in Corona-Zeiten) etwas Zeit hatte. Und mein alter Selbstbau-Rechner in der Ecke meines Bastelkellers guckte mich so komisch an.
Also aus dem Regal gewuchtet, entstaubt und angeschlossen. Und dann AEG: auspacken, einschalten, geht nicht. Schade! Fast alle LEDs leuchten, die LED für den hohen Takt bleibt aus. Normalerweise schaltet die sich nach 1 Sekunde ein, wenn gewisse Vorbereitungsarbeiten erledigt sind. Das kann doch nichts Schlimmes sein. Die üblichen Verdächtigen: Kondensatoren. Und tatsächlich hat ein Elko in der RESET-Logik das Zeitliche gesegnet. Austauschen. Geht!!
Inzwischen ist der Rechner 13 Jahre älter (ich leider auch...). Und er läuft immer noch - erstaunlich!
Also habe ich meine alten NewDos/80 und CP/M 2.2 Disketten gesichtet und gestaunt...
Im Netz habe ich ein Manual über das Betriebssystem NewDos/80 gefunden und sofort ausprobiert:
Ab hier einige meiner CP/M 2.2 - Programme (Turbo-Pascal 3.0):
Hmm... da fällt mir spontan ein: wie habe ich seinerzeit sichergestellt, dass die Uhr auch korrekt läuft? Da gab es ja wohl Anforderungen an die Laufgenauigkeit. Das hat mich dann doch interessiert!
Also habe ich in den PASCAL-Quelltext des Uhrenprogrammes geschaut und dort Folgendes gefunden - und dann angefangen noch viel weiter zu recherchieren:
Dort gibt es eine Routine "interrupt". Diese wird nach 40 Aufrufen eine Variable "sekunde" um 1 erhöhen. Und so weiter für Minute, Stunde, Wochentag. Das muss es sein! Weiter unten wird vom Uhrenprogramm die Adresse dieser Routine "interrupt" eingetragen (ab mem [ $E600 + 51 ]
).
Das sind genau die Speicherstellen, die ich in der BIOS-Sprungtabelle dazu passend für solche Fälle erweitert habe, mit Offset 51 ab Tabellenbeginn: "USER-INTERRUPT".
Es folgt ein Ausschnitt vom BIOS und die zugehörige Erweiterung (in rot):
Diese Speicherzellen gibt es offiziell nicht und nur bei mir. Vorbelegt sind sie mit "C9". Das ist der Opcode "RET" (springe zurück).
Hier hat das Programm also die Routine "interrupt" eingetragen mit dem Opcode "C3". Das ist der (unbedingte) Sprungbefehl zur Adresse, die unmittelbar folgt. Und bei Programmende auch wieder ausgetragen (dann steht da wieder "C9").
In der Interrupt-Routine des BIOS findet sich dazu:
Der rote Teil ist speziell für meinen USER-INTERRUPT und ruft die Uhrenroutine "interrupt" auf - wenn sie denn dort eingetragen ist.
Die BIOS-Routine "INTRPT" wird alle 25 ms per System-Interrupt "INT" aufgerufen (= 40 mal in der Sekunde). Dazu wird die INT-Leitung des Prozessors von der Logik im Floppy-Controller (!!) auf Masse gezogen (invertierende Logik). Die Zeitbasis dort besteht aus einem 16 MHz-Quarz und einer entsprechenden Teilerkette.
Es ist schon spannend, alles dieses nach Jahrzehnten wieder zu entdecken!
Dann habe ich noch ein paar Schaltbilder gefunden (hier besser lesbar als PDF-Dokument):
(Wird diesmal bestimmt nicht fortgesetzt)