Das Betriebssystem CP/M

Osborne 1, tragbarer CP/M-Computer

Einführung

Gary Kildall war einer der in Amerika spöttisch als "Geeks" oder "Nerds" bezeichneten Computerbastler, die sich Mitte der 70er Jahre mit Selbstbauprojekten beschäftigten. Er hatte ein Diskettenlaufwerk bekommen und stand nun vor dem Problem, es mit seinem Computer zum Laufen zu bekommen. Eine passende Schaltung war schnell gebastelt, es fehlte nur an der passenden Software. Diese schrieb Kildall kurzerhand selbst und war überrascht, dass sein Programm schnell großen Anklang fand.

Er gründete daraufhin eine Firma mit dem großspurigen Namen „Intergalactic Digital Research“. Das Wort „Intergalactic“ ließ er etwas später dann wieder weg. Erstes Produkt der Firma war 1976 eine Weiterentwicklung der Steuersoftware für Diskettenlaufwerke, die nun den Namen CP/M (Control Program for Microcomputers) trug. Es entwickelte sich in den folgenden Jahren zum ersten Standard-Betriebssystem für Bürocomputer verschiedener Hersteller. Standardisiert waren jedoch nur die CP/M-Kommandos und die mitgelieferten Werkzeuge, die zugrundeliegende Hardware war von Hersteller zu Hersteller völlig verschieden. Dies betraf die Videologik, die Schnittstellen und vor allem das Diskettenformat. CP/M musste also auf jeden Computer extra angepasst werden und man konnte zwischen Geräten verschiedener Hersteller keine Datenträger austauschen.

CP/M wurde typischerweise auf Systemen mit monochromer Textdarstellung verwendet. Die meisten CP/M-Computer waren nicht grafikfähig. Ausnahmen gab es beispielsweise von der Firma Televideo, die auch Softwarekomponenten zur Ansteuerung der Grafik mitlieferte. Ein typischer CP/M-Computer hatte zwei Diskettenlaufwerke. Eines enthielt das Betriebssystem und das Anwendungsprogramm auf einer Diskette, das andere wurde zum Speichern der Arbeitsergebnisse verwendet. Eine Festplatte war bei CP/M-Systemen eher unüblich.

Einschalten

Ein CP/M-Computer enthält nur ein minimales ROM, das ihn zum Start des eigentlichen Betriebssystems von Diskette befähigt. Deswegen muss immer mindestens ein Diskettenlaufwerk angeschlossen sein und dieses muss eine Diskette enthalten, auf der die grundlegenden Dateien des Betriebssystems enthalten sind.

Ist dies der Fall, startet der Computer automatisch und zeigt am Ende eine Eingabeaufforderung, typischerweise „A>“. Die grundlegenden Befehle zur Navigation sind ähnlich wie bei MS-DOS (genauer: MS-DOS hat diese exakt von CP/M abgeschaut):
Um das aktive Diskettenlaufwerk zu wechseln, wird der Laufwerksbuchstabe gefolgt von einem Doppelpunkt eingegeben. Die Laufwerke sind mit Buchstaben, beginnend bei A gekennzeichnet.
Das Inhaltsverzeichnis einer Diskette wird mit „DIR“ angezeigt. Das sieht dann etwa so aus:

Das Verzeichnis wird vierspaltig angezeigt. Eine weitere Parallele zu MS-DOS ist offensichtlich: Alle Dateien haben Namen mit maximal 8 Zeichen Länge und einem Suffix von 3 Zeichen. Ausführbare Programme haben die Endung „COM“, nachladbare Teile eines Programms die Endung „OVR“ (Overlay), Texte enden auf „TXT“ und Basicprogramme auf „BAS“. Ein großer Unterschied gegenüber MS-DOS ist das Fehlen von Unterverzeichnissen.

Ein Programm kann vom aktuellen Laufwerk durch Eingabe seines Namens ohne Suffix gestartet werden. Im obigen Beispiel würde „WS“ das Programm „WS.COM“ starten.

Interner Aufbau

CP/M besteht aus drei wesentlichen Komponenten:

  • BIOS
    Basic Input Output System - Basisfunktionen der Ein-/Ausgabe, die an jeden CP/M Computer angepasst werden musste
  • BDOS
    Basic Disk Operating System - Grundlegende Diskettenverwaltung, geräteunabhängig
  • CCP
    Console Command Processor - Eingabeaufforderung mit den wichtigsten CP/M-Befehlen

Für den Anwender ist diese Dreiteilung unsichtbar. Wer CP/M erstmals auf einer bestimmten Hardware laufen lassen wollte, musste jedoch das Maschinencode-Programm des BIOS zuvor anpassen. Dafür waren umfangreiche Kenntnisse der Hardware des Zielsystems, der Maschinenspracheprogrammierung und des internen Aufbaus von CP/M erforderlich. Immerhin wurde CP/M bereits mit allen zur Anpassung erforderlichen Programmen geliefert. Man benötigte allerdings auf jeden Fall ein Ausgangssystem, für das CP/M bereits angepasst war.

Beim Systemstart werden die drei Komponenten komplett in den Arbeitsspeicher geladen. Der verbleibende Speicher wird „TPA“ (Transient Program Area) genannt und steht für nachzuladende Programme bereit, die als Dateien mit der Endung „COM“ gespeichert sein müssen.

Befehle

Einige Befehle sind bereits im CCP enthalten, sie werden „interne Befehle“ genannt. Die übrigen liegen als Programme auf der CP/M-Diskette vor und werden bei Bedarf nachgeladen. Sie werden „transiente Befehle“ genannt. Für den Anwender ist es zunächst nicht entscheidend, zu welcher Sorte ein Befehl gehört. Es ist allerdings möglich, dass eine Diskette neben CP/M auch noch ein Anwendungsprogramm enthält. Dann ist für die transienten Befehle oftmals kein Platz mehr, d.h. es stehen nur noch die internen Befehle zur Verfügung.

Für die Arbeit mit CP/M benötigt die Tastatur des Terminals außer den normalen Tasten einer Schreibmaschine nur noch eine Ctrl- oder Strg-Taste. Strg-H ersetzt die Rückschrittaste, Strg-M die Eingabetaste, Strg-X löscht die gesamte Zeile und Strg-P sendet solange alle Ausgaben an den Drucker, bis man noch einmal Strg-P drückt. Die Cursortasten haben im CCP keine Funktion, viele CP/M-Computer hatten gar keine.

Da sich die Befehle auf Diskettenoperationen beziehen, werden fast alle mit Dateinamen als Parameter aufgerufen. Hier gibt es zwei Varianten: Manchmal wird ein konkreter Dateiname benötigt, in vielen Fällen können aber mehrere Dateien über ein Suchmuster angesprochen werden. Die beiden Zeichen ? und * haben dabei eine besondere Funktion: Ein ? im Suchmuster steht für ein beliebiges Zeichen, ein * für beliebig viele beliebige Zeichen. Dabei muss man immer beachten, dass ein CP/M-Dateiname immer aus 8 Zeichen für den Namen und 3 Zeichen für das Suffix besteht. Wird das Limit nicht ausgeschöpft, wird Name bzw. Suffix intern mit Leerzeichen aufgefüllt. In der Befehlstabelle wird jeweils angegeben, ob ein Befehl mit Mustern umgehen kann, oder ob er einen konkreten Dateinamen benötigt.

Beispiele:

abc.txt wird intern gespeichert als abc·····.txt (Die Punkte stehen für Leerzeichen).

prog.c wird als prog····.c·· gespeichert.

Das Muster brief*.txt passt z.B. zu den Dateien brief1.txt, brief27.txt oder briefoma.txt. Es ist eine Abkürzung für das Muster brief???.txt, welches das gleiche bewirkt.

CP/M kennt noch keine Verzeichnisse. Alle Dateien eines Datenträgers liegen also auf einer Ebene. Damit entfällt auch die Angabe von Pfadnamen. Soll eine Datei auf einem anderen als dem aktuellen Laufwerk angesprochen werden, so wird der Laufwerksbuchstabe gefolgt von einem Doppelpunkt vor den Dateinamen gestellt, also beispielsweise B:abc.com.

Die folgende Tabelle listet die wichtigsten Befehle von CP/M Version 2 auf.

BefehlTypBeschreibung

ERA <Muster>

intern

ERASE - Löscht alle zum Muster passenden Dateien.

 

DIR <Muster>

intern

DIRECTORY - Zeigt alle zum Muster passenden Dateien des aktuellen Laufwerks an. Wird kein Muster angegeben, zeigt DIR alle Dateien an.

 

REN <Datei>=<Datei>

intern

RENAME - Benennt eine Datei um. Vor dem Gleichheitszeichen steht der neue Name, dahinter der alte. Wird ein Laufwerksbuchstabe bei einer der Dateien angegeben, gilt er für beide Dateien. Die Angabe verschiedener Laufwerksbuchstaben bei den beiden Dateien ist nicht erlaubt.

 

SAVE <n> <Datei>

intern

Schreibt <n> Seiten à 256 Bytes des TPA-Speichers in die Datei.

 

TYPE <Datei>

intern

Zeigt den Inhalt der Datei auf dem Bildschirm an.

 

USER <n>

intern

Schaltet auf einen anderen Benutzerbereich (0...15) um. Damit können Dateien logisch gruppiert werden. Bei der Systemanmeldung ist man als Benutzer 0 aktiv.

 

PIP

PIP <Kommando>

transient

PERIPHERAL INTERCHANGE PROGRAM - Startet eine eigene Eingabeaufforderung, über die Kommandos zum Kopieren von Daten eingegeben werden können. Wird ein Kommando an den Befehl angefügt, wird dieses ausgeführt und PIP wieder beendet.

Kommandos haben das Format

<Ziel>=<Quelle1>,<Quelle2>...

 

Als Quelle können auch Dateimuster angegeben werden. Ist das Ziel ein Dateiname, werden alle Quelldateien aneinandergehängt und in die Zieldatei geschrieben. Ist das Ziel ein Laufwerksbuchstabe, werden Kopien der einzelnen Dateien auf das Laufwerk kopiert.

 

Als Quelle und Ziel können auch spezielle Geräte verwendet werden. CP/M kennt dafür folgende Namen:

CON:, CRT:, TTY:         Konsole (Bildschirm)

RDR:                            Lochkartenlesegerät (nur als Eingabegerät)

PUN:                            Lochkartenstanzer (nur für Ausgabe)

LST:, LPT:                    Listenausgabe, meist Drucker (nur Ausgabe)

PRN:                            Seitenweise Druckausgabe mit Zeilennummern

 

Beispiele:

PIP a.txt=b.txt              Kopiert b.txt nach a.txt

PIP a.txt=b.txt,c.txt       Hängt b.txt und c.txt aneinander und schreibt das

                                    Ergebnis in a.txt

PIP a.txt=B:b.txt           Kopiert b.txt von Laufwerk B nach a.txt auf dem

                                    aktuellen Laufwerk

PIP A:=B:*.txt               Kopiert alle Dateien mit der Endung txt vom

                                    Laufwerk B auf das Laufwerk A

PIP PRN:=a.txt             Druckt die Datei a.txt aus.

 

PIP kennt eine Reihe von Optionen, die in eckigen Klammern hinten an Kommandos angefügt werden können. Diese werden an dieser Stelle nicht beschrieben.

 

STAT <Muster>

transient

Gibt Informationen über die zum Muster passenden Dateien aus. Ist kein Muster angegeben, zeigt der Befehl Informationen zum aktuellen Laufwerk.

 

STAT DSK:

transient

Zeigt Informationen zu den Laufwerken an.

 

 

STAT USR:

transient

Zeigt an, welche Benutzernummer aktiv ist und unter welchen Nummern auf dem aktuellen Laufwerk Dateien abgelegt sind.

 

ED <Datei>

transient

EDITOR - Öffnet die angegebene Datei zum Bearbeiten. ED wird im nächsten Kapitel genauer beschrieben.

 

SYSGEN

transient

Erzeugt eine neue CP/M-Startdiskette, die aber nur die internen Befehle enthält. Das Programm benötigt keine Parameter und erfragt die nötigen Angaben.

 

SUBMIT <Datei>

transient

Führt eine Batchdatei (eine Textdatei mit CP/M-Befehlen) aus.

 

Der Editor ED

ED wirkt aus heutiger Sicht äußerst befremdlich. Er wurde unter der Prämisse entwickelt, auch Dateien bearbeiten zu können, die größer als der verfügbare Arbeitsspeicher sind. ED hält deswegen immer nur einen Teil des Textes in einem ca. 5 KB großen Textpuffer im Arbeitsspeicher und geht davon aus, dass man den Text von oben nach unten bearbeitet. Mit dem Start des Editors wird daher eine temporäre Datei angelegt, die den gleichen Dateinamen wie die bearbeitete Datei hat, allerdings mit der Endung „$$$“. Sie ist zunächst leer. Man kann nun Zeilen der Originaldatei in den Puffer holen und bearbeiten. Holt man weitere Zeichen hinzu, werden diese an den aktuellen Bearbeitungsstand angefügt. Wird der Platz im Puffer knapp, können Zeilen vom Beginn des Puffers in die temporäre Datei geschrieben werden. Sie werden dabei aus dem Puffer gelöscht. So wandern nach und nach die Zeilen von der Originaldatei in die temporäre Datei. Beendet man die Bearbeitung, wird zunächst der Inhalt des Puffers an die temporäre Datei angefügt, gefolgt vom noch unbearbeiteten Teil der originalen Datei. Abschließend erhält die originale Datei die Endung „BAK“ und die zuvor temporäre Datei erhält den ursprünglichen Dateinamen und ersetzt diese somit. Man hat also am Ende immer ein Backup der Datei im ursprünglichen Zustand und kann diese mit PIP wieder herstellen.

Hat man ED gestartet, sieht man den Text noch nicht. Anstelle dessen wird nur ein Doppelpunkt und ein Sternchen angezeigt und ED wartet auf die Eingabe eines Kommandos. Die Kommandos zur Bearbeitung des Textpuffers sind:

 

Kommando

Beschreibung

<n>A

APPEND - Liest n Zeilen aus der Originaldatei in den Puffer und fügt sie an die dort stehenden Zeilen hinten an. <n> kann auch weggelassen werden, es wird dann nur eine Zeile gelesen. Der Befehl #A liest bis zu 65536 Zeilen ein, es sei denn, der Buffer ist vorher voll oder die Originaldatei zu Ende.

<n>W

WRITE - Schreibt die ersten n Zeilen des Puffers in die temporäre Datei. Wie beim Kommando A kann die Anzahl der Zeilen weggelassen werden. Auch #W ist möglich.

E

END - Beendet die Bearbeitung der Datei. Siehe Beschreibung oben

H

HEAD - Beendet die Bearbeitung und öffnet automatisch die geänderte Datei als neue Originaldatei

O

OLD - Verwirft die temporäre Datei und löscht den Puffer.

Q

QUIT - Beendet das Programm ohne die Dateien zu verändern

Man kann grundsätzlich nur den momentan im Puffer befindlichen Text bearbeiten. Dazu dienen die folgenden Befehle:

Kommando

Beschreibung

<Zeile>T

TYPE - Gibt die angegebene(n) Zeile(n) auf dem Bildschirm aus. Die Zeilenangabe erfolgt so:

<n>:T               zeigt Zeile Nummer n an

:<n>T               zeigt alle Zeilen von der aktuellen (d.h. zuletzt angezeigten oder bearbeiteten)

                        bis zur n. Zeile an.

<n>::<m>T       zeigt die Zeilen von n bis m an.

I oder i

 

INSERT - Versetzt ED in den Einfügemodus. Nun können Zeilen eingegeben werden, die dann oberhalb der aktuellen Zeile in den Textpuffer eingefügt werden. Um den Einfügemodus wieder zu verlassen gibt man am Anfang einer Zeile Strg-Z ein. Verwendet man das Kommando I, werden alle Eingaben in Großbuchstaben umgewandelt. Das Kommando i lässt den eingegebenen Text wie er geschrieben wurde.

<Zeile>K

Löscht die angegebene(n) Zeile(n)

ED kennt noch eine Vielzahl weiterer Kommandos, aber die bisher beschriebenen sollten bereits ausreichen, um einen Text einigermaßen unfallfrei bearbeiten zu können.

Ausprobieren...

Wenn Sie selbst mit CP/M experimentieren möchten, können Sie das mit Hilfe einer Emulation auf Ihrem PC machen. Dafür benötigen Sie folgendes:

  • Das Emulationsprogramm "AltairZ80". Dieses finden Sie hier
  • Die Terminalemulation "PuTTY", zu finden hier
  • Das Betriebssystem CP/M als Diskettenimage von hier

Die Handhabung ist ein wenig ungewohnt, da es keinerlei Menüs gibt und das System vor dem Start über einzutippende Befehle konfiguriert werden muss. Der Emulator hat zudem nur eine minimale Textkonsole. Typische Anwendungsprogramme laufen damit nicht. Es wird deswegen noch ein weiteres Emulationsprogramm benötigt, welches ein Datensichtgerät für den CP/M-Computer, ein sogenanntes Terminal nachbildet. Die Kommunikation zwischen Terminalemulation und CP/M-Computer findet über eine Netzwerkschnittstelle (localhost) statt. Ein sehr gut geeignetes Terminal-Emulationsprogramm ist „putty“.

Das alles klingt wesentlich komplizierter als es in der Praxis ist. Startet man den Emulator, öffnet sich folgendes Fenster:

Die Eingabeaufforderung „sim>“ zeigt an, dass die eigentliche Emulation noch nicht läuft, sondern das Programm darauf wartet, dass man Befehle zur Einrichtung des Emulators eingibt. Die normale Vorgehensweise bei der Benutzung des Programms ist:

  • Diskettenlaufwerk(e) anbinden mit ATTACH
  • Optional: Netzwerkschnittstelle öffnen
  • System starten (booten)

Der Emulator arbeitet nicht mit echten Disketten, sondern mit sogenannten Diskimages. Ein Diskimage ist eine Datei, die die Datenblöcke einer Diskette in vorgegebener Reihenfolge enthält. Verbindet man ein Diskimage mit dem Emulationsprogramm, so ist das gleichbedeutend mit dem Einlegen einer Diskette in den emulierten Computer. Der Befehl zum Verbinden eines Diskimages mit einem Laufwerk ist:

ATTACH DSK<n> Datei.dsk

Falls die Datei nicht existiert, wird sie angelegt. Der emulierte CP/M-Computer kann bis zu sechzehn Diskettenlaufwerke haben. Anstelle von <n> sind deswegen die Werte 0 bis 15 erlaubt. Damit ein CP/M-Computer starten kann, muss eine Diskette mit dem Betriebssystem in einem der Laufwerke eingelegt sein.

Nun kann der CP/M-Rechner gestartet werden. Soll die Bildschirmausgabe nicht in dem Emulatorfenster, sondern in einer Terminalemulation stattfinden, muss zuvor noch folgender Befehl eingegeben werden:

SET CONSOLE TELNET=23

Danach wartet der Emulator auf die Verbindungsaufahme durch das Terminal-Emulationsprogramm über das Netzwerk. Dazu wird putty gestartet. Es öffnet sich zunächst ein Einstellungsdialog (s. rechts). Dort wird als Host Name „localhost“, als Protokoll Telnet und als Port 23 angegeben und die Emulation dann mit „Open“ gestartet.

Das Putty-Fenster zeigt nun zunächst eine leere Anzeigefläche. Sie aktivieren nochmals das Fenster des CP/M-Emulators und geben dort den Befehl zum Start der Emulation:

BOOT DSK0

Das Ergebnis sollte etwa so aussehen:

 

 

Ab jetzt arbeiten Sie im PuTTY-Fenster. Sie finden dort eine CP/M-Eingabeaufforderung und können damit wie auf einem echten CP/M-Computer arbeiten. Man kann die Arbeit mit CP/M jederzeit durch Eingabe von Strg-E unterbrechen. Es erscheint wieder die sim> Eingabeaufforderung, so dass man z.B. durch ATTACH eine andere Diskette „einlegen“ kann. Das Kommando CONT setzt die Arbeit mit CP/M fort.