Der folgende Text ist die Übersetzung eines Auszugs (Kapitel 8) aus dem Buch The Amstrad Plus von Andrew R.M. Clarke und David Powys-Lybbe (1986). Ein weiterer Artikel zum Thema RSX findet sich in der Zeitschrift CT.

RSX Erweiterung für das Betriebssystem

Durch den Einsatz von RSXen können die Möglichkeiten des Betriebssystems erweitert werden. RSXen sind mächtige Werkzeuge und können bei sorgfältiger Nutzung für interessante Anwendungen eingesetzt werden. Obwohl die RSX grundsätzlich für die Erweiterung des Betriebssystems entwickelt wurde, kann einfaches Multitasking umgesetzt werden, z.B. als Print-Spooler oder bei der DFÜ. Sie kann eingesetzt werden als Terminal-Emulator, zur Bildschirmdarstellung einer Uhr, CP/M 2.2 Emulation, Mausnutzung oder zum Austesten von Geräten.

Da mehrere RSXen geladen sein können, entsteht für den Nutzer der Eindruck, der einer Anzahl von zugleich ablaufenden Programmen ähnlich ist.

Zwar sind RSXen neu für CP/M Plus, jedoch entstand die Idee in den Anfängen von CP/M. DDT war das erste Programm, das sich selbst an die Spitze der TPA relozierte und dementsprechend die Größe der TPA verringerte. Da DDT den Restart-Vektor nutzte, um Kontrolle über die CPU zu bekommen, und vor Einführung der RSXen eingesetzt wurde, kann es nicht als RSX betrachtet werden. Auch nicht DESPOOL, das alte CP/M 1.4 Spooler-Programm, obwohl es ähnlich ist. Die GSX sollte eine RSX sein, ist es aber nicht. Sie wurde zu den Zeiten von CP/M 2.2 entwickelt und eine Version für CP/M Plus wurde nie herausgebracht. GSX wurde ursprünglich von einer Firma (GSS) entwickelt und war kein Bestandteil von Digital Research.

Wird das BDOS von einem transienten Programm aus aufgerufen, so durchläuft dieser Aufruf alle RSXen, die zur Zeit geladen sind, weil diese vom Lader entsprechend umgelenkt wurden. Die RSX kann jeden BDOS Aufruf abfangen oder den reservierten RSX BDOS Aufruf (Funktion 60) bearbeiten. Es gibt drei Typen von RSXen:
  1. Sie können auf BDOS Aufrufe einwirken, so dass auf den ursprüngliche Aufruf eingewirkt wird.
  2. Sie können zusätzliche BDOS Aufrufe zur Verfügung stellen.
  3. Sie können CPU-Zeit 'stehlen' bei einigen oder allen BDOS Aufrufen.
Ein Beispiel für (1) kann ein Patch sein, um ein temporäres Hilfsgerät (AUX) einzubringen. Dazu wird es notwendig, die Funtionen 3, 4, 7 und 8 umzuleiten. (Eine Geräteumkonfiguration oder Umleitung funktioniert nicht!) Ein Beispiel für (2) ist ein Grafikpaket oder ein Paket für den Zugriff auf ein Ton- oder Musikschaltkreis. Das gilt auch für den Zugriff auf einen Joystick. Ein Drucker-Spooler ist ein Beispiel für (3).

Aufbau einer RSX

Ein RSX-Programm unterscheidet sich von einem '.COM'-Programm durch das Einfügen eines RSX-Vorspanns am Anfang des Programmes. Der Vorspann hat eine Länge von 27 Bytes und die meisten Elemente werden vom CCP Lader initialisiert, wenn die RSX installiert wird. Eine RSX muss die üblichen Regeln für einen normalen BDOS Aufruf befolgen. Diese besagen, dass Parameter in den Registern C, D und E übergeben und in A, B, H und L zurückgegeben werden. Auch sollte eine RSX ihren eigenen Stack verwenden. Anders als die Regeln eines '.COM'-Programmes für den BDOS Aufruf besagen muss die RSX ihre eigenen BDOS Aufrufe über den Vorspann durchführen und nicht über Adresse 0005h.

Der RSX Vorspann

      .z80
0000  Serial:                    ; 6 Byte Seriennummer
           db   0,0,0,0,0,0      ; Durch den Lader initialisiert
0006  Start:                     ; Sprung zum RSX Programm
           jp   rsx_prog
0009  Next:                      ; Sprung zur naechsten RSX (BDOS Start)
           jp   $-$              ; Durch den Lader initialisiert
000C  Prev:                      ; Adresse der vorigen RSX oder Seite Null
           dw   7                ; Durch den Lader initialisiert
000E  Remove:                    ; Remove Marker
           db   0FFh             ; Auf 0 setzen bei permanenter RSX
000F  Nonbank:                   ; Marker bei System ohne Speicherbaenke
           db   0                ; Auf 0FFh setzen nur fuer System ohne Speicherbaenke
0010  Name:                      ; Name der RSX
           db   '12345678'       ; Beliebiger Name aus 8 Zeichen
0018  Loader:                    ; Lader Marker
           db   0                ; Durch den Lader initialisiert auf 0

0019       ds   2                ; Frei - reserviert

Die folgenden Felder der RSX müssen initialisiert sein:
Start:Eingestellt auf den Sprung zum RSX Programm
Next:Das erste Byte muss den Sprung-Opcode 0C3h enthalten
Remove:Marker wie erforderlich auf 00h oder 0FFH setzen
Nonbank:Auf Null voreinstellen
Name:Beliebigen Namen eintragen

START: Dieses Feld beinhaltet eine Sprunganweisung zur Startadresse der RSX. Dieser Teil der RSX testet, ob die BDOS Funktion, die im Register C angegeben ist, abgefangen werden soll. Falls nicht, muss ein Sprung zur Marke NEXT: erfolgen, ohne die Register C, D oder E zu verändern.

NEXT: Dieses Feld entspricht dem BDOS Einsprung in Adresse 0005h und wird stattdessen vom RSX Programm aufgerufen. Es enthält die Adresse der Marke START: der folgenden RSX oder die Adresse des CCP Laders im Falle der letzten RSX.

PREV: Dieses Feld beinhaltet die Adresse der vorigen RSX. Bei der ersten RSX ist das die Adresse des BDOS Vektors. Bei der ersten Installation wird das Feld auf Adresse 0007h eingestellt. Dies wird geändert, wenn eine andere RSX unterhalb dieser RSX geladen wird.

REMOVE: Diese Marke ist normalerweise auf 0FFh gesetzt, so dass die RSX beim nächsten Warmstart durch den CCP Lader entfernt wird. Soll die RSX ständig geladen sein, muss die Marke auf 00h gesetzt werden. Die Marke wird dann auf 0FFh gesetzt, wenn die RSX nicht mehr benötigt wird.

NONBANK: Diese Marke ist immer auf Null gesetzt. Sie war für anfängliche Implementierungen von CP/M Plus auf Basis von CP/M 2.2 Maschinen mit nur 64k Speicher bestimmt. Sie wurde genutzt, um einige der CP/M Plus Möglichkeiten zu bieten, die bei der Version ohne Speicherbänke ausgeschlossen waren. Ein Beispiel ist der CP/M Plus Dienst DIRLBL.RSX, der die BDOS Funktion zur Nutzung ohne Speicherbänke 100 enthält.

NAME: Dieses Feld mit acht Zeichen kennzeichnet die RSX für ein beliebiges Dienstprogramm, das die Liste der RSXen untersucht. Der CCP Lader hat den Namen 'LOADER '.

LOADER: Diese Marke ist vom CCP Lader immer auf Null gesetzt. Der CCP Lader selbst setzt das Feld auf 0FFh. Dies markiert dann das Ende der RSX Kette.

Die RSX Funktionsaufrufe

Eine RSX kann verwendet werden, um BDOS Aufrufe abzufangen oder um neue BDOS Scheinfunktionen hinzuzufügen. Zu diesem Zweck hat CP/M Plus die BDOS Funktion 60 reserviert. (Im BDOS-Abschnitt 7.11.2 des Buches The Amstrad Plus sind Details zu finden). Die RSX Funktionsnummer wird im ersten Byte des Parameterblocks übergeben, dessen Adresse im Registerpaar DE beim Aufruf vom BDOS steht. Diese Nummer muss im Bereich 0 bis 127 liegen und die eigentliche Nummer sollte mit einer bestimmten Vorstellung gewählt werden.
Es ist ratsam, dass eine RSX, die die Funktion 60 benutzt, den Regeln eines BDOS-Aufrufes entspricht und das Resultat im Akkumulator und/oder Register HL zurückgibt.

Erstellen von RSX Dateien

RSX Dateien werden gewöhnlich mit dem Dienstprogramm GENCOM erzeugt, das RSXen mit einer (optionalen) COM-Datei kombiniert und eine spezielle COM-Datei erstellt. Diese beginnt mit einem GENCOM-Vorspann, gefolgt von der Original (oder einer leeren COM-Datei) und beendet mit einer oder mehreren RSXen. Die BDOS Funktion 59 (auch aus dem genannten Abschnitt 7.11.2) beschreibt weitere Details.

Letzte Änderung: 24.Oktober 2014