★ APPLICATIONS ★ DIVERS ★ Resident System Extensions (RSX) ★![]() |
| Rsx - Resident System Extensions (CPC Amstrad International) | Applications Divers |
Das Betriebssystem des CPC besitzt die Möglichkeit, eigene Befehle als sogenannte externe residente Systemerweiterungen ins BASIC einzubinden. Man kann diese dann anstelle des CALL- Befehls aufrufen und Parameter übergeben, wie beim BASIC- Befehl CALL,p1,p2,p3,p4.....p32. Einem solchen Befehl muß ein Querstrich (SHIFT+Klam-meraffe). wie bei angeschlossener Diskettenstation mit AMS-DOS, vorangestellt werden und sowohl der ' Befehl'als auch die Parameter untereinander müssen mit Kommata abgetrennt werden. Nun betrachten wir uns einmal die Einbindung der Erweiterung zu einem Befehl. Dies muß leider in Assembler geschehen, oder in einer anderen Programmiersprache (z.B.: PASCAL). Der Interpreter braucht verschiedene Informationen zur RSX-Einbindung in den normalen Ablauf: BC=Adresse der Befehlstabelle der RSX Der Basicinterpreter braucht als Information zuerst den Anfang der RSX-Sprung-Tabclle. an deren Beginn die ersten zwei Bytes den Anfang der Befehlstabelle bezeichnen. HL=Adresse von vier Bytes für Kernel Für die Verwaltung der Eintragungen benötigt das Betriebssystem vier Bytes im zentralen RAM-Kern, also zwischen &400Ö und &BFFF und HL enthält deren Adresse. RSX-Erweiterung einbinden Mit dem Firmware-Call &BCD1 (KL LOG ON EXTENSION) wird die Befehlserweiterung eingebunden. Sie steht nun in Form von RSX-Kommandos zur Verfügung und kann nachdem Rücksprungzu BASIC benutzt werden (RSX-EXTENTED BASIC). 'C9' an den Anfang poken Nun wird am Anfang der Einbindungsroutine ein RETurn (&C9) gePOKEd, damit bei einem Zweitaufruf die RSX nicht mehr zerstört werden kann. (Schutz) Zurück ans BASIC-System Nach der Einbindung und der Schutzvorkehrung steht RSX nun bereit: Bei Benutzung eines der Befehle wird die Tabelle durchsucht und gegebenenfalls das Kommando ausgeführt. Zwei Bytes für Befehlstabellenanfang Am Anfang der Sprungtabelle zu den entsprechenden Befehlen stehen zwei Bytes für die Adresse der RSX-Befehls-tabelle. Sprungtabelle in Reihenfolge Nun kommt die Sprungtabelle, wobei der erste Sprung dem ersten Befehl korrespondiert, der zweite dem zweiten und so weiter. Es müssen also genauso viele Befehle wie Sprünge enthalten sein. Schlüsselworttabelle der RSX Diese Tabelle enthält die RSX-Befehle im Klartext. Jeder Name wird in Großbuchstaben und jeder letzte Buchstabe eines Namens mit gesetztem 8. Bit dargestellt. Das Ende der Tabelle ist ein Nullbyte. Anfang der einzelnen Routinen... Nun beginnt die eigentliche Ausführung des Befehls, wobei am Anfang der Akkumulator die Anzahl der Parameter, das Indexregister IX, die Adresse des letzten Parameters (Lower Byte) und DE die Einsprungadresse enthalten. B enthält die Differenz (32-Inhalt von A). Eine derartige Befehlserweiterung kann in einem Extensions-ROM oder auch im RAM stecken, wie es bei angeschlossenem Diskettenlaufwerk der Fall ist. Man hat also die Möglichkeit, selbst solche Erweiterungen zu programmieren, man muß aber beachten, daß Parameter nur von BASIC aus direkt übergeben werden können, was umgekehrt nur mit Übergabe der Adresse einer Variable zum Beispiel möglich ist. Die Parameter müssen immer ganzzahlig sein, und diese Erweiterungen müssen vollständig in Maschinensprache geschrieben sein. Besonders sinnvoll ist diese Möglichkeit also für die Grafikprogrammierung und für Programmbearbeitungs befehle. Ingesamt kann man maximal 32 Integerwerte zwischen -32768 und +32767 übergeben. Zahlen mit größeren Werten, wie Adressen, werden trotzdem vollkommen richtig verarbeitet. Das BASIC-ROM des CPC 464 stellt bereits beim Einschalten einen RSX-Befehl zur Verfügung:
Befchls-Erweiterungen sind in dieser Zeitschrift schon zur Genüge abgedruckt worden, deshalb hier nur ein Assemblerbeispiel in Listing 1. Dieses Assemblerlisting zum Beispiel würde einen Befehl |POKE, start, ende, wert bereitstellen, wobei 'start' der Anfangsadresse, 'ende' dem letzten Adresswert des zu pokenden Wertes, und 'wert' dem zu schreibenden Byte für den zu füllenden Speicherbereich entspricht. Um Strings in RSX zu übergeben, ist normalerweise der 'Klammeraffe' nötig. Für den Aufruf einer Routine, die zwei Strings vertauscht, ist gewöhnlich folgende Eingabe nötig:
Bei einer Error-Ausgabe springt der CPC kurzzeitig ins RAM, das nutzen wir jetzt aus. Listing 2 macht es möglich, Strings ohne Klammeraffen zu übergeben. Nun können wir Strings direkt übergeben, zum Beispiel mit Diskette können wir nun |ERA,"HALLO.BAS" anstatt a$="HALLO.BAS" und |ERA,@a$ eingeben. Um Komplikationen zu vermeiden, bietet es sich an. Fehlerabfragen zu schreiben: Da am Anfang der Akkumulator die Anzahl der Parameter enthält, kann man zum Beispiel diesen Wert abfragen, wie im folgenden Beispiel-Listing 4. Diesen Teil könnte man nun in unsere vorherige POKE-Routine (anstatt RET NZ dann JP NZ,ERRORl) einsetzen. Nun bietet sich also folgende Reihenfolge der RSX-Pro-grammierung an:
Brückmann. Englisch, Gerits (1985): CPC 464 INTERN, Data Becker, Ddf. B. Godden (1984): CPC 464-FIRMWARE-Handbuch, Schneider, Türkheim.
|