APPLICATIONSDIVERS ★ RSX SESAM (CPC MAGAZIN) ★

RSX SESAM (CPC Magazin)Applications Divers
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Der Schlüssel für RAM/ROM-Routinen

Das Programm wird mit q = &xx00: LOAD "SESAM.BIN”, q: CALL q, q geladen. Die Arbeitsadresse q der Sesamroutine darf in 256-Byteschritten beliebig zwischen &4000 und HIMEM-&A0 liegen. Soll eine Adresse dauerhaft benutzt werden, so empfiehlt es sich, die entstandene Sesamversion abzuspeichern. Der Lade- und Startvorgang vereinfacht sich dann auf: LOAD "Version”: CALL q. Auf jeden Fall sollte die Sesam-Routine mit MEMORY q-1 (oder kleiner) geschützt werden.

Die Sesamroutine stellt zwei RSX-Befehle zur Verfügung, mit denen universell alle RAM/ROM-Adressen aufgerufen oder untersucht werden können.

|XCALL, adr, romnr, fa, bc, de, hl, x, y
|XPEEK, adr, romnr, ziel, anzahl

Bei beiden Befehlen müssen nur soviele Werte wie nötig angegeben werden.

  • adr Gewünschte Adresse
  • romnr Romnummer 0 bis 7 Hintergrundrom bis &FB Vordergrundrom &FC oberes und unteres Rom eingeschaltet &FD nur oberes Rom eingeschaltet &FE nur unteres Rom eingeschaltet &FF nur Ram eingeschaltet
  • fa, bc, de, hl Entsprechen den gleichnamigen Z80-Registern
  • x x-indexregister, Basisadresse für Parameter bei CALL
  • y y-lndexregister,Basisadresse für Hintergrundrom, wird für diese automatisch vom Betriebssystem gesetzt, der XCALL-Wert wird dann ignoriert.
  • ziel Gewünschte Zieladresse.
    An diese Adresse werden mit XPEEK Daten übertragen. Fehlt die Angabe, so wird die Adresse q+&10 verwendet.
  • anzahl Anzahl der Bytes, die kopiert werden sollen. Ohne Angabe wird der Wert zwei genommen. Damit können
    Integer-Variablen mit 2-Byte-Werten gefüllt werden. Nach der Befehlsausführung werden die Z80-Register ab Adresse q in folgender Reihenfolge gespeichert: a, f, c, b, e, d, l, h, xl, xh, yl, yh.

SESAM

Mit SESAM wird eine Verbindung zwischen Basic und der tiefsten Programmierebene, den Maschinencoderoutinen in ROM und RAM, hergestellt. Es ist eine Weiterentwicklung des früher vorgestellten Firmware-Programmes (Computer Kontakt 9/85). Neben der ROM-Auswahlmög-lichkeit ist eine größere Bedienungsfreundlichkeit hinzugekommen.

In den CPC-Computern werden ROM-Routinen über den Restart-3 des Z 80 angesprungen. Dabei wird normalerweise ein 3-Byte-Vektor verwendet, der die ROM-Nummer und die Zieladresse enthält. SESAM geht einen anderen Weg. im RAM befindet sich eine Kopie der Restart-3-Routine. SESAM springt in diese Routine hinein und übergibt die ROM-Nummer und die Zieladresse in den alternativen Registern des Z80. Da der 664 eine abweichende RAM-Belegung hat, ist eine Anpassung der Einsprungadressen in der Datazeile 150 notwendig.

Zwei neue RSX-Befehle

Entsprechend den beiden erzeugten RSX-Befehlen XCALL und XPEEK wird der Restart-3-Einsprung unterschiedlich benutzt. Für XCALL werden die Z80-Register mit den angegebenen Werten geladen und das Programm an der angegebenen Adresse gestartet. Nach der Ausführung werden die Register im RAM (im nicht mehr benötigten Initialisierungsteil von SESAM) abgelegt und können entsprechend ausgewertet werden. Die Register werden als 16-Bit-Paare behandelt. Während jedoch der Z-80 im af-Paar das a-Register als höherwertiges Byte ansieht, wurde für XCALL die af-Reihenfolge vertauscht, um eine bequemere Eingabe zu erreichen.

Die Indexregister sind beim CPC für besondere Aufgaben reserviert, eine Anwendung dürfte sich kaum ergeben. Das iy-Register läßt sich im Falle von HintergrundROMs mit XCALL überhaupt nicht beeinflussen. Wenn Manipulationen nötig sind, muß der gewünschte Wert an eine bestimmte RAM-Adresse gepoked werden. Die alternativen Register werden vom Betriebssystemkern für Hintergrundaufgaben benutzt und sind für andere Anwendungen tabu. SESAM verzichtet deshalb auf die Möglichkeit, diese Register auch noch zu beeinflussen.

Der Befehl XPEEK dient zunächst dazu, ein ROM zu untersuchen, indem ein ROM-Bereich ins RAM übertragen und damit für einen Monitor oder Disassembler zugänglich gemacht wird. Dabei werden die Daten nicht byteweise, sondern im Block gepeeked. Wer will, kann so ein 16k-ROM auf einmal ins RAM holen. Wichtiger noch ist die Möglichkeit, über den Variablenpointer direkt Basicvariablen zu füllen. Die Hauptanwendung von XPEEK liegt vor allem darin, Datenschiebereien im RAM selbst zu vereinfachen.

XPEEK und der Variablenpointer

Leider können Erweiterungsbefehle keine Werte direkt ins Basic zurückgeben. Immer ist dazu der Umweg übers RAM notwendig. Elegantere Lösungen für Lesebefehle wie XPEEK kann es deshalb prinzipiell nicht geben und wir müssen uns an eine gewisse Umständlichkeit gewöhnen. XPEEK braucht als Angabe für die Datenquelle eine RAM/ ROM-Adresse und eine RAM-Adresse als Ziel. Für beides kann gegebenenfalls auch eine Variablenadresse genommen werden, die uns das Basic über den Variablenpointer @ zur Verfügung stellt. Eine so verwendete Variable muß allerdings vorher definiert sein, z. B.: r = 2^31:i% = 0: s$ = ”12345"

XPEEK ist auf das Füllen von Integervariablen ( 2 Byte Länge) vorbereitet. |XPEEK, &B296, &FF, @i% schafft die Adresse der SYMBOL-Tabelle nach i%.

Wir können bis zu 4 Byte lange Integerwerte wie angegeben in definierte Realvariablen füllen. |XPEEK, &B187, &FF, @r,4 bringt den TIME-Wert nach r. Allerdings bekommen wir den richtigen VVert erst durch PRINT r - 2t31 oder b = r - 2^31.

Mit Stringvariablen ist es noch komplizierter. @s$ liefert uns eine Adresse, an der zunächst die Länge des Strings steht. @s$+1 ist die Adresse, wo die Adresse des Strings abgelegt ist. Wir müssen schrittweise vorgehen. |XPEEK, @ s$+1, &FF, @i% bringt die Stringadresse nach i%. |XPEEK, &C04C, 0, i%, 5 überträgt den Namen Basic aus dem ROM nach s$. Der letzte Buchstabe wird als Sonderzeichen gedruckt, da für den speziellen Zweck (Befehlsname zur ROM-Initialisierung) Bit 8 gesetzt ist.
Wer hat SESAM-Ideen?

ln diesem Heft geht es zunächst um die Funktionsweise von SESAM und erste Anwendungen werden vorgestellt. Eine Fortsetzung mit weiteren Anwendungsbeispielen ist geplant, Beiträge dazu sind erwünscht.

HYPERLOAD mit SESAM

Die Kassetteniadezeiten lassen sich spürbar verkürzen, wenn die vom System vorgegebene Aufteilung eines Files in 2 K-Blöcke umgangen werden kann. Die hier vorg'estellte Routine schafft das mit Hilfe der SESAM-Erweiterungsbe-fehle XCALL und XPEEK zumindest für Binärfiles. Die Unterprogramme für Schreiben (Zeile 100 - 220) und Lesen (Zeile 300 - 390) können in jedes Hauptprogramm übertragen werden (gegebenenfalls Variablennamen ändern!). Die Erhöhung der Schreibgeschwindigkeit in Zeile 20 sollte nur bei guten Bandsorten übernommen werden. Die nötigen Informationen über die Unterprogramme müssen in Variablen (Zeile 40 und 70) enthalten sein. Die Bezeichnungen name$, start% und länge% sprechen für sich. Mit ein-sprung% kann ein Maschinenspracheprogramm nach dem Laden automatisch gestartet werden (CALL ein-sprung% hinzufügen). flag$=”!” schaltet die simulierten Kassettenmeldungen beim Schreiben ab, damit z. B. der Bildschirminhalt nicht zerstört wird.

Während das Lesen und Schreiben der Daten selbst mit einfachen Firmwareeinsprüngen geht (Zeile 210 und 380), ist doch ein gewisser Aufwand nötig, um den 64 Byte langen Kopfsatz zu erzeugen. Der Kopfsatz ist identisch mit dem sonst vom Betriebssystem erzeugten und läßt sich deshalb auch mit der Basicfunktion CAT lesen. Lediglich die sonst nicht weiter störende Fehlermeldung "read error d” (Block länger als 2 KByte) zeigt den Unterschied.

Der Kopfsatz wird in einer Stringvariablen untergebracht (header$). Da deren Adresse sich im Programmablauf verschieben kann, sollte bei Erweiterungen der Unterprogramme gegebenenfalls die Ermittlung der Variablenadressen (Zeile 110 und 320) wiederholt werden. HYPERLOAD überprüft nicht, ob Schreib- oder Lesefehler vorliegen. Da die verwendeten Firmwareroutinen aber je nach Erfolg das Carryflag des Z-80 setzen, sind Ergänzungen möglich.

Rechtecke zeichnen mit SESAM

Die Firmwaretabelle enthält u. a. den Einsprung SCR FLOOD BOX, mit dem an beliebiger Stelle, ausgefüllte Rechtecke gezeichnet werden können. Dazu muß das c-Register einen codierten Ink-Wert enthalten, in d und e müssen Werte für die Breite und Höhe stehen und in hl wird die Bildschirmadresse für die linke obere Ecke des Rechtecks erwartet. Für die codierte Ink nehmen wir im einfachsten Fall &FF. Andere Werte erzeugen hübsche Effekte. Wenn wir eine bestimmte Ink brauchen, müssen wir |XCALL, &BC2C, &FF, ink eingeben. Den verschlüsselten Wert bekommen wir dann mit PEEK (q), wobei q die Adresse von SESAM ist.

Für Höhe und Breite werden ungewohnte Maßstäbe benutzt. Die Bildschirmbreite geht dabei von Null bis 80 (=&50), die Höhe von Null bis 200 (=&C8). Obendrein müssen wir selbst dafür sorgen, daß die Bildschirmgrenzen nicht überschritten werden.

Die bis jetzt erklärten Werte sind mit Beispielgrößen direkt in den Befehl in Zeile 80 eingegeben. Der Rest des angegebenen Programms dient dazu, die Grafikkoordinaten x% und y% in eine Bildschirmadresse umzurechnen. Der Sprung ins untere ROM in Zeile 20 bewirkt zunächst eine Umwandlung in sogenannte Basiskoordinaten, bei denen die Bildschirmhöhe 200 und die Breite je nach MODE 160, 320 oder 640 ist. Zeile 30 ist ein Zwischenschritt, um die Ergebnisse zunächst in einen sicheren RAM-Bereich umzuladen, da der ursprüngliche Platz auch durch XPEEK zerstört wird. In Zeile 40 und 50 werden die Basiskoordinaten endlich nach x% und y% geladen. In Zeile 60 schließlich berechnet eine Firmwareroutine die Bildschirmadresse, die in Zeile 70 nach x% geladen wird. Damit ist SCR FLOOD BOX in Zeile 80 komplett und kann uns ein Rechteck in die Bildschirmmitte zeichnen.

Mit SESAM Floppy nachträglich initialisieren

Warum soll denn die Floppy die ganze Zeit eingeschaltet sein, obwohl sie nach stundenlanger Eintipperei erst zum Schluß zum Speichern gebraucht wird? SESAM macht es möglich, die Floppy auch nachträglich noch hinzuzuschalten. Die wenigen Befehle verschieben zunächst die SYMBOL-Tabelle um &500 (RAM-Bedarf der DD-1) nach unten. Es ist darauf zu achten, daß MEMORY tief genug liegt, und z. B. auch SESAM nicht überschrieben wird. Der letzte Befehl schließlich initialisiert das Hintergrund-ROM Nummer 7. Bei anderen Controllern müssen RAM-Bedarf und ROM-Nummer gegebenenfalls ermittelt werden. Die Angabe &ABFF ist die höchste freie Adresse. Mit einem anderen Wert kann der Floppy auch ein anderer RAM-Bereich zugeteilt werden. Das ist eventuell notwendig, wenn Programme den Standard-Floppybereich &A700-&ABFF benötigen und deshalb nicht lauffähig wären.

Basiczeilen verstecken mit SESAM

Die ersten beiden Bytes einer Programmzeile enthalten ihre Länge. Diese Angabe wird als Zeiger auf die nachfolgende Zeile benutzt. Wenn man nun diesen Zeiger auf eine später folgende Zeile verstellt, lassen sich die dazwischen liegenden Zeilen nicht mehr listen, sie werden aber beim Programmablauf anstandslos ausgeführt. Für GOTO und GOSUB sind die unsichtbaren Zeilen allerdings auch nicht mehr erreichbar. Die angegebene Befehlsfolge sollte nach Fertigstellung eines Programms im Direktmodus eingegeben werden, q ist dabei die Adresse von SESAM. Benutzt wird eine Routine im Basic-ROM, die in de eine Zeilennummer erwartet und deren Adresse in hl abliefert. Die Differenz zweier Zeilenadressen wird nun an die Adresse der ersten übertragen. Ob mit der Prozedur Programme geschützt werden können, sei dahingestellt. Auf jeden Fall ist es möglich, daß sich Hobbyfreunde in einer Art Wettbewerb "rätselhafte" Programme vorlegen, in denen versteckte Zeilen ihr Unwesen treiben.

Gerhard Knapienski , CPC Magazin

★ PUBLISHERS: CPC Magazin , CPC Magazin Codex
★ YEAR: 1985
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: LISTING
★ COLLECTION: CPC MAGAZIN 1985 1986
★ AUTHOR: Gerhard Knapienski
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listings:
» RSX-SESAM    (CPC  Magazin)    GERMANDATE: 2023-03-19
DL: 59
TYPE: ZIP
SiZE: 5Ko
NOTE: Supplied by Johnny Farragut ; 40 Cyls
.HFE: Χ

» RSX-SESAM    (CPC  Magazin)    LISTING    GERMANDATE: 2021-02-02
DL: 194
TYPE: PDF
SiZE: 249Ko
NOTE: 5 pages/PDFlib v1.6

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » Hexmonitor (Schneider Aktiv)
» Applications » Hexmon (CPC Magazin)
» Applications » Toolhex (CPC Amstrad International)
» Applications » Hex - Data (CPC Amstrad International)
» Applications » Protection U.N.C Copieur Pistes HEXAGON
» Applications » HexE (RAM Hex Monitor and Editor)
Je participe au site:
» Pour ce titre nous ne disposons de fichier executable sur CPC (Dump, Saisie du listing) , alors si vous avez ça dans vos cartons ou vous désirez usé vos petit doigts boudinés sur votre clavier faites le nous savoir.
» Vous avez des infos personnel ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 417 millisecondes et consultée 960 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.