BDOS, BIOS und der ganze Rest ...

Als Gary Kildall anfing, das CP/M zu basteln, stand ihm noch kein Computer mit einem 8080-Chip zur Verfügung. Er machte deshalb aus der Not eine Tugend und unterteilte sein künftiges Betriebssystem in zwei Teile:
  • das BDOS (= Basic Disc Operating System): ist von der jeweiligen Hardware unabhängig und enthält alle allgemein verwendbaren Routinen und
  • das BIOS (= Basic Input-Output-System): enthält alle von der Hardware abhängigen Teile und muß für jeden Rechnertyp neu angepaßt werden.
Und da Gary gerade beim Aufteilen war, konzipierte er noch weitere Komponenten, die ein Betriebssystem halt so braucht:
  • den Loader (= Lader), der die Anwenderprogramme in den Arbeitsspeicher lädt und
  • den CCP (= Console Command Processor), der die vom Anwender eingetippten Kommandos entgegennimmt und verarbeitet.
All diese Bestandteile bilden eine gut durchdachte Hierarchie:

Anwenderprogramm
CCP und Loader
BDOS (Datei- und Geräte-Verwaltung)
BIOS (Basic-Ein-/Ausgabe)
Hardware

Beim Betriebssystem CP/M ist der hardwareabhängige Teil, also das BIOS, relativ klein und überschaubar und ließ sich leicht auf eine neue Hardware abändern. DR hat übrigens nie ein komplettes BIOS mit ausgeliefert, sondern sozusagen nur ein »Beispiel-BIOS«, das der Hersteller dann selbst auf seine Computer umprogrammieren mußte. Bei der Joyce wurde diese Aufgabe von den Locomotive-Codern übernommen. Wer mit einem Disassembler einige Forschungen anstellt, wird erkennen, daß sich die Leute bei Locomotive die Aufgabe leicht gemacht hatten ­ große Teile des CPC6128-BIOS wurden einfach kopiert.

Dazu zählen z.B. all die Farbroutinen für den Bildschirm! Mir ist jedenfalls nicht bekannt, daß Amstrad auch für die Joyce jemals einen Farbmonitor geplant hatte. Vielleicht ist dies auch der Grund dafür, weshalb sich Amstrad und Locomotive bis dato weigern, die Quelltexte des BIOS herauszurücken. Selbst bei Commodore konnten die BIOS-Sourcen für den C128 bezogen werden. Übrigens, bei LocoScript liegt genau dieselbe Struktur vor, nur gibt es hier ein einziges Anwenderprogramm, das mit den CP/M-Teilen fix zusammengebunden wurde.

Zwischen den oben genannten Ebenen gibt es »genormte« Schnittstellen:

Wer einmal in die technische Beschreibung des Prozessors »Z80A« geschaut hat, wird wissen, daß unser Mikroprozessor mit der Peripherie eigentlich nur über sog. »Ports« kommuniziert. Die fortgeschrittenen Basic-Coder unter uns haben vielleicht schon davon Gebrauch gemacht, wenn Sie spezielle OUT-Befehle für Bildschirmeffekte verwendet haben. Dabei werden allerdings die Ebenen BDOS und BIOS übergangen.

Normalerweise soll nur das BIOS die speziellen Portbefehle verwenden, wenn die Anwenderprogramme auf jeden CP/M-Rechner laufen sollen.

Wenn ein Anwenderprogramm Funktionen des Betriebssystems (z. B. von einer Datei lesen) braucht, dann ruft es normalerweise das BDOS auf: An der Adresse 0005H steht im Arbeitsspeicher ein Sprungbefehl, der in das Betriebssystem führt. Für alle BDOS-Funktionen gelten die gleichen Konventionen:

  • im Register C muß die Nummer der gewünschten BDOS-Funktion stehen; die kleinste Nummer 0 bedeutet »Programmende« und »System rücksetzen«, die größte Nummer auf der Joyce ist 152, mit der aus einem String ein sog. FCB (= File Control Block) aufgebaut wird. Beim CP/M Plus sind aber nicht Nummern dazwischen besetzt, viele Funktionen sind nur im sog. MP/M gültig; dort ist die höchste Funktionsnummer gar 155 (= get date and time). Während CP/M ein Betriebssystem ist, bei dem nur ein Benutzer, also nur ein Programm, gleichzeitig arbeitet, ist bei MP/M »Multi-Tasking« möglich.
Also Leute, Multitasking ist nicht mit Windows von Microsoft auf den PCs eingeführt worden, sondern das gab es bereits zehn Jahre früher bei DR (Digital Research) !
  • im Register DE stehen noch zusätzliche Parameterangaben, die von der jeweiligen BDOS-Funktion abhängen. Auf Details gehe ich jetzt nicht ein, damit der Artikel nicht noch länger wird. Sollte aber Interesse bestehen, können wir ja mal einen Kurs zu diesem Thema veröffentlichen...
Die aufgerufenen BDOS-Funktionen wiederum wenden sich an das darunterliegende BIOS; diese BIOS-Funktionen sind auch wieder numeriert, diesmal von 0 (= BOOT, Kaltstart des Computers) bis 30 (= USERF). Von DR war die letzte BIOS-Funktion USERF für den Anwender vorgesehen, damit er dort seine eigenen BIOS-Routinen unterbringen kann. Amstrad/Locomotive haben aber diese Funktion für die speziellen Joyce-Funktionen besetzt und nannten das dann XBIOS (= eXtended BIOS). Darüber laufen praktisch alle Disketten-, Schnittstellen- und Bildschirmfunktionen. Sollte Interesse bestehen, kann auch zu diesem Thema ein ausführlicher Kurs veröffentlicht werden.

Als CP/M Plus entworfen wurde, machte man auch ein Zugeständnis an diejenigen, denen man es nie recht machen kann. Speziell für diese Zielgruppe wurde RSX (= Resident System eXtension) zur Verfügung gestellt. Mit einer solchen RSX kann man z.B. eine bestimmte BDOS-Funktion »umbauen«. Wer sich z. B. eine Sprachausgabe gebastelt hat und die ganz normal mit einer BDOS-Funktion ansprechen will, kann das dann mit einer (selbst programmierten) RSX erreichen. Eine solche RSX-Routine »drängelt« sich dann vor die jeweilige BDOS-Routine. Wer wissen will, wie das im Detail gemacht wird, kann z. B. in meinen »Menübaukasten für Turbo Pascal» schauen, dort habe ich so etwas eingesetzt. An sich sind RSXen eine feine Sache, es gibt eigentlich nur einen Nachteil, sie brauchen Speicher auf Kosten der TPA (= Transient Program Area).

Genervt werden sich manche von euch fragen: TPA - was ist das nun wieder? Nun, um diese Frage zu beantworten, müssen wir uns ein wenig mit der Organisation des Arbeitsspeichers beschäftigen:

Unser Prozessor Z80A besitzt sechzehn Adreßleitungen, kann also nur einen Speicherbereich bis 2^16-1 = 65535 Bytes = 64 KB ansprechen. Nun besitzt aber selbst die kleinste Joyce bereits stolze 256 KB Speicher, und die können ohne Probleme gelesen und beschrieben werden. Wenn ihr nun einen frisch gebackenen Informatiker fragt, wie das der 8-Bit-Prozessor das schafft, dann wird er gerade noch etwas von »bank switching« murmeln, bevor er sich wieder in seine MB-großen Gefilde zurückzieht ...

Was ist bei der Joyce eine »Bank« oder eine »Speicherbank«? Der Begriff »Speicherbank« wurde bereits bei den ersten Großrechnern analog zum Terminus »Datenbank« eingeführt.

Nur füllten dort die Speicherbänke gleich einen ganzen Schrank; der erste Großrechner, auf dem ich codete, war zwölf Meter lang, und besaß gerade mal 64 KB Kernspeicher. Und trotzdem lief darauf die gesamte Fertigungsplanung eines Werkes mit über 3.000 Beschäftigten. Aber früher wurde eben noch sorgfältiger programmiert...

Wenn wir schon bei neuen Begriffen sind, führen wir doch gleich einen weiteren ein (aber dann ist Schluß!): den »Speicherblock«. Bei der Joyce umfaßt ein Speicherblock 16 KB, und vier Speicherblöcke bilden eine Speicherbank, i. e. eine Speicherbank ist gerade 64 KB groß, kann also von unserem Prozesspr Z80A problemlos adressiert werden. Die Speicherblöcke werden nun mit Null beginnend durchnumeriert: unsere kleinste Joyce mit 256 KB hat also genau 16  Speicherblöcke 0..15.

Es gibt nun spezielle Hardwarebefehle, mit denen wir beliebige vier Speicherblöcke zu einer Speicherbank »zusammenschalten« können. Von dieser Möglichkeit macht auch das Betriebssystem CP/M Plus reichlich Gebrauch. Ja, bestimmte Speicherbänke sind vom System permanent belegt. Bei der Version 1.4 gilt etwa folgende Einteilung (bei 1.8H oder 1.15 wurden die Bereiche teilweise vertauscht!):

Block 0: u. a. Einsprungspunkte für BIOS- und XBIOS-Routinen.

Block 1: u. a. Bildschirmroutinen und den unteren Teil des Bildschirmspeichers.

Block 2: u. a. oberen Teil des Bildschirmspeichers und die Zeichenmatrix.

Block 3: u. a. Routinen zur Ansteuerung der Floppy-Laufwerke.

Blöcke 4, 5 und 6: stehen den Anwenderprogrammen zur Verfügung, die sog. TPA.

Block 7: u. a. Einsprungspunkte für BDOS- und BIOS-Routinen. Der untere Teil steht für die TPA und für RSXe zur Verfügung.

Block 8: u. a. CCP und Pufferbereiche für Drucker und Floppy.

Blöcke 9ff: hier ist die RAM-Floppy untergebracht. Block 9 enthält das Inhaltsverzeichnis, dann folgen die jeweiligen Daten.

Standardmäßig schaltet CP/M Plus diese Blöcke zu folgenden Bänken zusammen:

Bank 0: Sie besteht aus den Blöcken 0, 1, 3 und 7; diese Bank ist immer dann aktiviert, wenn eine Systemfunktion aktiv ist. Bei der Joyce gibt es noch eine Besonderheit: bei einer Bildschirmausgabe wird der Block 3 durch Block 2 ersetzt, manche sprechen dann von der »erweiterten Bank 0«.

Bank 1: Sie besteht aus den Blöcken 4, 5, 6 und 7; immer wenn ein Anwenderprogramm werkelt, dann ist diese Bank eingeschaltet.

Bank 2: hier wird jeweils der zweite Block (also 1 oder 5) durch Block 8 ersetzt. Dies ist der Fall, wenn der CCP ein vom Anwender eingegebenes Kommando verarbeitet.

Bänke 3ff: an die Stelle des Blockes 8 bei der Bank 2 tritt hier der Block aus der Ram-Floppy. Diese Bänke liegen also bei jedem Zugriff auf die Ram-Floppy vor.

Wer dieses System aufmerksam verfolgt hat, wird feststellen, daß jede Bank im oberen Teil den Block 7 enthält; dieser Block ist die sog. »Common Area« (auwei, schon wieder ein neuer Begriff!). Jeder, der in seinem Obstgarten schon Bäume ausgeästet hat, wird wissen, wozu das gut ist. So wie ihr euch wohl kaum auf einen Ast setzt, den ihr gerade absägt, braucht auch das System einen Ruheplatz, von dem es zwischen den verschiedenen Bänken hin- und herschalten kann. Andernfalls zieht es sich beim Umschalten selbst den Boden, sprich gespeichertes Programm unter den Füßen hinweg ...

DangSoft

Abgedruckt in Klubzeitung Nr. 37