Das UCSD-P-System

Historie

Als Professor Niklaus Wirth gegen Ende der 60er Jahre die Programmiersprache Pascal entwarf, arbeitete man noch mit Lochkarten und Magnetbändern. Die neue Sprache, die auf den Erfahrungen mit PL/1 und Algol aufbaute, entsprach also den Erfordernissen der damaligen Hardware mit allen darausfolgenden nachteiligen Konsequenzen. Dies beeinträchtigte jedoch bis heute die Verbreitung von Pascal keineswegs. Pascal ist ein exzellentes Programmierlehrmittel und gleichzeitig dafür prädestiniert, hochkomplexe Probleme strukturiert und einfach zu programmieren.

In der folgenden Zeit wurde immer wieder versucht, die Beschränkungen der Urversion durch alle möglichen Erweiterungen zu mildern. Es wurden einige "Pseudo"-Standards festgelegt, mit der Hoffnung auf Einheitlichkeit. Solche Versuche waren ja leider schon bei der Programmiersprache Basic gescheitert.
Bis Mitte der 70er Jahre an der University of California at San Diego das UCSD-Pascal entwickelt wurde. Wirths Pascal wurde dabei den höheren Anforderungen der SoftwareEntwicklung und vor allem der moderneren Hardware angepaßt. Dieses neue Pascal entstand auf einer - extra dafür entwickelten - Programmierumgebung: Dem UCSDP-Betriebssystem.

Das P-System als Alternative zu TOS

Die Entwickler des P-Systems hatten sich folgende drei Ziele gesetzt:

Das endgültige P-System entsprach diesen - sicher nicht einfach zu bewältigenden - Punkten in jeder Hinsicht.
Dies begründete auch den sich schon bald einstellenden Erfolg des UCSD-Pascal-P-Systems: Jeder kann es benutzen. Es ist völlig egal, ob man vor einem Mainframe oder einem Homecomputer sitzt, das P-System ist universell.
Es ist bis heute auf über 150 verschiedenen Rechnern mit den unterschiedlichsten Prozessoren von VAXSystemen über den 68000, der 80XX-Familie der 65XX-Serie und einigen anderen bis hin zum guten alten Z80 verfügbar.

Es gibt acht verschiedene Nativ-Code-Generatoren für das P-System. Damit lassen sich acht verschiedene CPU's auf jeden beliebigen Rechner simulieren. Somit ist der Programmierer in der Lage, Assemblerprogramme für jeden beliebigen Computer zu entwickeln. Außer dem UCSD-Pascal-Compiler gibt es noch einen Basic- und einen Fortran-77-Compiler, wobei man aus jeder Sprache Routinen aus jeder beliebigen anderen Sprache sowie fremde Betriebssystemroutinen aufrufen und ausführen kann.

Unter UCSD-Pascal ist es auch Multitasking möglich, wobei die verschiedenen Prozesse über Semaphoren synchronisiert werden können. Chaining von Programmen sowie virtuelle und dynamische Speicherplatzverwaltung werden unterstützt.
Die Erzeugung von Subdirectories ist möglich.
Auch Turtlegrafik wird unterstützt, wobei die erzeugten Bilder auf jeden anderen Rechner übertragbar sind, da das Turtlegrafik-Unit mit eigenem, rechnerunabhängigen Grafikmodus arbeitet.

So funktioniert das P-System

Das "P" bedeutet Pseudo. Dieses Pseudosystem läuft ausschließlich auf einem Pseudocomputer, der P-Maschine, die auch nur eine Pseudosprache, den P-Code, versteht.
Da es keinen Computer gibt, der diesen P-Code versteht, muß er eben simuliert werden. Dies geschieht durch den P-Maschinen-Emulator, dem PME.

Die P-System-Compiler übersetzen ausschließlich in den P-Code und sind somit auf jedem Rechner, der den PME besitzt, ohne jede Änderung ablauffähig.
Um das P-System auf einen neuen Rechner anzupassen, ist es nur nötig, den PME und das BIOS des P-Systems zu ändern.

Da der PME den P-Code erst interpretieren muß, ist er um einiges langsamer als reiner Maschinencode.
Trotzdem ist die Zeitkomplexität bei den meisten Programmen bei den P-Code besser als beim Maschinencode, da sie als P-Code bis zu fünfmal kürzer sind.

Dies ergibt zusätzlich den Vorteil, einiges an Speicherplatz sparen zu können, was in der 8-Bit-Ara eine große Bedeutung hatte und heute, bei weiter fallenden Preisen für Peripheriespeicher und RAM's, die gleichzeitig immer größere Kapazitäten besitzen (bestes Beispiel dafür ist die ST-Serie), nur noch ein hübscher Nebeneffekt ist.

Alles Menügesteuert

Nach dem Booten des P-Systems erscheint die Versionnummer des BIOS und die Copyright-Angaben, danach wird das Betriebssystem-Menü (auch Kommando-Menü oder -Ebene genannt) sichtbar. Von dort aus kann man die verschiedenen P-System-Komponenten auswählen oder auch P-Code-Programme ablaufen lassen.
Am Ende einer jeden Befehlsausführung kehrt man automatisch in die Kommando-Ebene zurück.
Das P-System ist vollständig menügesteuert und baumstrukturiert, was bedeutet, daß jeder Menüpunkt der Kommandoebene ein eigenes Untermenü besitzt, das wiederum ein Untermenü besitzen kann. Ein KommandoMenüpunkt kann bis zu drei Untermenü-Ebenen tief gestaffelt sein.
Alle Menüpunkte werden durch das Betätigen von nur einer einzelnen Taste aktiviert. Diesem hierarchischen Aufbau ist es hauptsächlich zu verdanken, daß auch ein Anfänger nach einer relativ kurzen Eingewöhnungszeit in der Lage ist, dieses komplexe Betriebssystem angemessen zu benutzen.

Bei Bedienungs- oder Systemfehler meldet sich das System mit einer entsprechenden Fehlermeldung, die auch die Möglichkeit zur Fehlerbehebung angibt. Falls eine Behebung des Fehlers nicht möglich ist, so muß in manchen Fällen das komplette System neu gebootet werden. Dies ist bei einem Atari ST, dessen TOS nicht Rom-resident ist, noch ziemlich ärgerlich, da nicht nur das P-System, sondern auch das TOS neu gebootet werden muß.

Die Kommando-Ebene

Das Kommando-Menü zeigt alle wichtigen Betriebspunkte des Systems an: Es ist ein Editor vorhanden, um Quellprogramme einzugeben oder einfach Texte niederzuschreiben. (Es sind geringe Textverarbeitungsfähigkeiten vorhanden.)

Ein Filer übernimmt alle Aufgaben, die sich bei der Verwaltung und Pflege von Dateien ergeben.
Der Compiler übernimmt die Übersetzung des Programmtextes (in den Sprachen Pascal, Fortran oder Basic) in den P-Code.

Mit dem Linker können P-Code-Programm-Module zu einem neuen Programm zusammengefügt werden. (Wobei es gleichgültig ist, ob es sich um einen ursprünglichen Pascal-, 8086-, Fortran- oder 68000-Code handelte.)
Es ist auch ein Assembler-Menüpunkt vorhanden, der den Assembler-Code eines der acht verschiedenen CPUFamilien mit dem entsprechenden Nativ-Code-Generator in den P-Code übersetzt. Ein symbolischer Debugger übernimmt das Austesten des compilierten P-Codes.

Zur Protokollierung der Tätigkeiten bei der Arbeit mit dem P-System ist
ein Monitor vorhanden, der die Möglichkeit bietet, alle Aktionen in einem speziellen File festzuhalten. Damit lassen sich vor allem Bedienungsfehler zu einem späteren Zeitpunkt exakt reproduzieren und werden leicht erkennbar.
Das System kann auch neu initialisiert werden, was von großer Hilfe ist, wenn man sich in irgendwelchen Fehlern verstrickt hat. Nach dem Initialisieren reagiert das System, als wäre nie ein Fehler aufgetreten.
Mit dem Halt-Menüpunkt wird das P-System gestoppt, und man kehrt zum Desktop zurück.
Das Execute-Kommando führt ein compiliertes Programm aus, der Run-Befehl compillert ein angegebenes Workfile und läßt es danach ablaufen.

Mit User Restart ist es möglich, ein Programm mehrmals hintereinander auszuführen.
Mit dem Set-Kommando ist es möglich, alle wichtigen Parameter für die Benutzung des Systems zu bestimmen.

So zum Beispiel:

Der Filer

Der Filer übernimmt das komplette File-Management im P-System. Er bewältigt alle Aufgaben, die sich bei der Handhabung mit Dateien ergeben, wie etwa das Erzeugen, Kopieren oder Umbenennen von einzelnen Files. Falls es einmal nötig ist, mehr Files auf einem externen Speicher unterzubringen, als die Directory verwalten kann, (beim UCSD-P-System sind es maximal 77 Files) so bietet der Filer die Möglichkeit, Subdirectories zu verwalten. Subdirectories sind an dem Extender '.SVOL' erkennbar. Der Filer kennt folgende vordeklarierte Extender:
'.TEXT' kennzeichnet ein normales Textfile.

'.BACK' bedeutet das gleiche, nur ist es für Datensicherungszwecke erstellt.
Ein File mit dem Extender '.CODE' beinhaltet direkt ausführbaren Objektcode.
'.INFO': Informationen für den Debugger.

Eine Grafik wird mit '.FOTO' gekennzeichnet und an '.BAD' wird ein File erkennbar, das einen beschädigten Bereich auf der Diskette belegt.

Nun die einzelnen Funktionen, über die der Filer verfügt:
'Bad Blocks': Diese Funktion ermittelt alle fehlerhaften Blöcke auf einer Diskette.
Mit 'Change' kann man einen Fileoder Volume-Namen ändern.

Es sind zwei Möglichkeiten vorhanden, die Directory zu listen. Entweder mit 'List Directory', das alle Files mit ihrer Länge zeigt, oder mit 'Extended Directory List', das zusätzlich Zeit und Datum der letzten Änderung, die Adrese des ersten benutzten Blockes des jeweiligen Files und die Anzahl der belegten Bytes des letzten Blockes sichtbar macht. Nach dem Namen der gewünschten Volume-Directory kann, durch Komma getrennt, ein anderes Volume angegeben werden. Das Listing wird dann auf dieses Volume geleitet. Dieses Volume kann eine andere Datei in der die Directory abgespeichert wird, oder ein Drucker sein, der im P-System auch ein Volume darstellt.

Der Filer kann in zwei verschiedenen Modi arbeiten:
Der Swap- und der Flip-Mode. Zwischen den beiden kann mit dem Menüpunkt 'Flip Swap/Lock' hin- und hergewechselt werden. Der Swap-Mode lädt die gerade benötigten Segmente des Filers erst bei Bedarf von Diskette. Dies ist bei geringen Hauptspeicherkapazitäten interessant. Der Lock-Mode lädt den Filer bei Aufruf komplett in den Speicher.

'Krunch' formatiert den Speicherplatz eines Speichervolumes neu. Er fügt alle belegten Blöcke des Volumes und alle unbenutzten Speicherbereiche zu jeweils einem Block aneinander.
'Make' erzeugt Dummy-Files auf dem benutzten Speichermedium. Es wird Speicherplatz für zukünftige Dateien reserviert.

Mit 'On/Off-Line' können neue Volumes nachgeladen oder auch für den Benutzer gesperrt werden.
'Prefix' ändert den geltenden Volumenamen für den Systemzugriff.
Mit 'Remove' kann das jeweils angegebene File gelöscht werden.
Der Befehl 'Transfer' kopiert Files an ein gegebenes Ziel.

So wird mit der Befehlssequenz "Transfer # 9:Testfile.text, * $" die Textdatei 'Testfile' von Diskstation A (besitzt im UCSD-P-System die Volume-Nummer 9) ohne Dateinamenänderung (gekennzeichnet durch $) auf die Systemdiskette, die mit dem Joker * bestimmt wird, kopiert. Weitere Joker, die der Filer akzeptiert, sind '_' und '?', die gleichbedeutend sind und für alle Filenamen des Volumes stehen.
Das Kommando 'Volumes' listet alle aktivierten Volumes samt ihren Nummern. Dabei werden Speichervolumes (zum Beispiel Diskstationen oder Harddisk) mit einem '#' gekennzeichnet und die jeweilige Speicherkapazität durch Angabe der verfügbaren Blöcke ersichtlich. Ein Block hat hier die Größe von 512 Byte.
Falls die 'Bad Blocks'-Funktion ein positives Ergebnis geliefert hat, können mit dem Befehl 'Examine' zusätzliche Informationen über die Beschädigungen beschafft werden.

Das Kommando 'Zero' schließlich initialisiert die Directory des angegebenen Speichervolumes. Eine Diskette kann danach nur vom P-System aus benutzt werden. Ein Lesen von TOS aus ist nun nicht mehr möglich.

Der Editor

Zum P-System sind zur Zeit zwei verschiedene Editoren verfügbar: Der "Edvanced" und der _normale" SystemEditor. Letzterer gehört zu dem Lieferumfang des P-Systems.
Bevor ein Editor gestartet werden ' kann, muß ein Workfile bestimmt werden. Dieses Workfile kann mit der 'Set'Option restgelegt werden. In die
ser hat man die Wahl zwischen 'Environment' und 'Marker'. Mit 'Marker' kann man im zu editierenden Text Markierungen bestimmen.

Mit 'Set Environment' hat man die Möglichkeit, alle Parameter einzustellen, die zur Textverarbeitung nötig sind.
Es existieren alle bei besseren Editoren üblichen Befehle wie 'Insert', 'Delete', 'Copy', 'Verify', usw.
Der Editor kann auf vier Wegen verlassen werden: Verlassen des Editors mit und ohne Erneuern des Workfiles sowie Rücksprung in den Editor mit den gleichen Optionen.

Auf weitere Möglichkeiten des Editors sowie auf seltener benötigte Fähigkeiten des UCSD-P-Systems werden wir an dieser Stelle verzichten.
Das P-System sowie die mitgelieferten (hervorragenden) Utilities und die Turtlegraphic in allen Einzelheiten zu untersuchen, würde den Rahmen dieses Beitrags bei weitem sprengen. Wir werden an anderer Stelle sicherlich weitere interessante Ergänzungen dazu publizieren können.

Doch nun wollen wir uns noch mit einem der zu dem P-System gehörenden Compiler beschäftigen: Dem UCSD-Pascal.

Der UCSD-Pascal-Compiler

Das UCSD-Pascal baut weitestgehend auf dem von Wirth und Jensen definierten Ur-Pascal auf (auch 'Standard'Pascal genannt). Es weichte vor allem in der erweiterten Stringbehandlung, der Möglichkeit zur Arbeit mit Units sowie der Handhabung von Random-Access-Dateien von der ursprünglichen Version ab.
Man hat mit UCSD-Pascal auch die Möglichkeit, in den Quelltext Compileroptionen einzufügen, um die Compilation nach speziellen Wünschen zu beeinflussen.

Die Optionen werden dem Compiler durch Begrenzer '(' und ' * )' sowie durch vorangestelltes '$' kenntlich gemacht und durch ein nachgestelltes '+' oder '-' an- oder abgeschaltet. Zum Beispiel: ( $L+, I-, Q- 1t ) Hierbei wird durch L+ das Sourcelisting auf ein vorbestimmtes File geleitet, mit I- wird der I/O-Check unterbunden, und Qverhindert eine Compilation ohne Compilerinformationen.
Ein eingefügtes P im Programmtext verursacht etwa einen Seitenvorschub.
Im UCSD-Pascal können 'Long Integers' definiert werden, deren Länge durch den Benutzer festgelegt werden kann.

Ergänzend zu den arithmetischen Standardfunktionen in Pascal existieren die Funktionen LOG, die den dekadischen Logarithmus der gegebenen Zahl berechnet, sowie PWROFTEN, die die Zehnerpotenz der Zahl ermittelt.

Eine Einschränkung gegenüber Standard-Pascal besteht darin, daß Funktionen oder Prozeduren nicht als formale Parameter übergeben werden können.

UCSD-Pascal verfügt über drei spezielle interaktive Dateien: 'Input' als übliche Eingabeoperation, 'Keyboard' als Möglichkeit zur Eingabe ohne deren Anzeige auf dem Bildschirm und 'Output' als definierbare Ausgabeform.
Es ist außerdem möglich, typenfreie Dateien zu erzeugen.

Die Arbeit mit Units ermöglicht den modularen Aufbau von komplexen Programmen. Ein Unit besteht aus dem Programmkopf, der dessen Bezeichnung enthalten muß. Nun wird ein Programmteil 'Interface' von dem Compiler erwartet. Dieser enthält alle Deklarationen, die von dem rufenden Programm und dem Unit benötigt werden.
Darauf folgt der 'Implementation'-Teil. Er beinhaltet alle lokalen Variablen und Deklarationen des Units.
Letztendlich folgt der eigentliche Programmkörper.

Mit Hilfe dieser Units ist es einfach, sich eine Hilfsprogrammbibliothek anzulegen.
Mit UCSD-Pascal hat man auch die Möglichkeit, sein Programm in Segmente aufteilen zu können. 'Segments' ermöglichen die Overlay-Abarbeitung des Programmcodes. Diese Fähigkeit wird auf dem ST ja in den meisten Fällen ungenutzt bleiben.

Desweiteren unterstützt UCSD-Pascal besonders die Arbeit mit Strings, wofür der ergänzende Datentyp 'String' eingeführt wurde, der eine vordefinierte Länge von 80 besitzt. Man kann diese Standardlänge beliebig ändern, darf jedoch das Maximum von 255 nicht überschreiten.
Nur noch einige Möglichkeiten zur Stringmanipulation:
'Fillchar' etwa ermöglicht es, einen definierten Speicherplatz mit einem bestimmten Zeichenzu füllen.
'Moveleft' und 'Moveright' verschieben Zeichenketten in die bestimmte Richtung um eine angegebene Länge.
Mit 'Scan' kann ein String nach einen Teilstring untersucht werden.
Weiterhin sind die Befehle 'Copy', 'Insert' und 'Delete' vorhanden, deren Funktion wohl klar ist.
Man kann weiterhin die Länge eines Strings und die Position eines Substrings ermitteln.

Das P-System auf dem ST

Um das P-System auf dem Atari ST zu starten, muß man dem 'PSYSTEM. TTP' das 'PSYSTEM.VOL' als Parameter übergeben. Nach einer kurzen Wartezeit erscheint das Kommandomenü auf dem Monitor.
Es ist auch möglich, durch Umbenennen des 'PSYSTEM.TTP' auf einer bootfähigen TOS-Diskete das P-System automatisch zu starten.

Weiterhin wird es auf dem ST erlaubt, eine Ramdisk zu benutzen, was aber nur in dem Falle des 520+ oder einer aufgerüsteten Maschine sinnvoll ist. Die Ramdisk kann maximal über 1000 Blocks (512 KByte) verfügen.
Diese Ramdisk zu vergrößern, ist durch das Entfernen von GEM und AES möglich. Dieser Trick verschafft einen zusätzlichen Platz von 320 Blocks (160 KByte).

Jedoch ist es nach der Entfernung von GEM nicht mehr möglich, das PSystem nach einem Halt neu zu starten.
Der UCSD-Pascal-Compiler wird in Deutschland von Focus vertrieben. Er kostet zusammen mit dem P-System 890,- DM. Dies ist für Atari ST-Verhältnisse ein ganz schöner Brocken. Man erhält dafür jedoch ein komplettes, ausgereiftes Betriebssystem samt Pascal-Compiler und recht guter Dokumentation.

Diese besteht aus drei Ordnern:
Dem 'UCSD Pascal Handbook', dem 'Operating System' und dem 'Program Development'.
Dies sind drei ordentliche, zu jeder Frage Antworten gebende, Bücher, die jedoch ausschließlich in Englisch gehalten sind. Dies erschwert außerordentlich den Einstieg in dieses komplexe Betriebssystem, vor allem für in dieser Art von Literatur unbedarften Anwender.

Dies und der breite Rahmen der Anwendungsmöglichkeiten, die zu Anfang überhaupt nicht überblickt werden können, stellen für den Anfänger eine recht große Hürde dar.
Vor allem wurde bei der Benutzung des P-Systems auf dem Atari ST bald klar, daß wirklich nicht alles klar ist.
Das Betriebssystem benahm sich einige Male recht egozentrisch, wobei es nicht ersichtlich wurde, ob nun einfach ein Bedienungsfehler oder ein Fehler im System schuld an allem war.

Des öfteren konnte ein Segment nicht gefunden bzw. gelesen werden, wodurch die Weiterarbeit an dieser Stelle illusorisch wurde.
Auch ist es von Vorteil, mit zwei Diskettenlaufwerken zu arbeiten, da ansonsten recht oft gewechselt werden muß, was eine zügige Arbeit verhindert. Zusätzlich zu dem UCSD-Pascal-Compiler wird von Focus unter dem P-System ein Fortran 77-Compiler (990,- DM), ein Basic-Compiler (790,DM) und das 'Advanced Development Tool Kit' (490,- DM) angeboten.


Jörg Mainusch
Aus: ST-Computer 04 / 1986, Seite 20

Links

Copyright-Bestimmungen: siehe Über diese Seite