APPLICATIONSDIVERS ★ Zwei neue Sasem-Programme ★

RSX Transfer (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 ★ 

Auch diesmal bringen wir wieder zwei Sasem-Programme. Wer Sasem anwenden will (in früheren Ausgaben heißt Sasem ja Sesam), benötigt zum Verständnis die Einführung aus Heft 12/85. Drei weitere Sasem-Programme sind im Heft 1/86 abgedruckt. Wer diese beiden Hefte noch nicht hat, kann sie bei uns bestellen.

Leider dürfen wir den Namen Sesam für die Maschinenprogramme von Gerhard Knapienski nicht mehr verwenden, da das Hause Siemens ein Programm hat, das ebenso heißt. Wir werden dieses Programm deshalb in Zukunft Sasem nennen.

Sasem und die Indexregister

An CALL- und RSX-Befehle können eine Reihe von Parametern (bis zu 32) angehängt werden. Diese Werte werden im System-Stack (&BF00 bis &C000) abgelegt. Der genaue Ort hängt jedoch vom Zufall ab. Damit die aufgerufene Routine mit den Werten arbeiten kann, wird die aktuelle Adresse der Parametertabelle im x-Register des Z-80 übergeben. Die Anzahl der Parameter steht im a-Register. Die Zufälligkeit des Ablaufes verhindert jedoch jede weitere Einflußnahme. Der SASEM-Befehl |XCALL eröffnet uns eine interessante Möglichkeit. Wir können irgendwo im RAM beliebig viele Parameter-Tabellen vorbereiten. Mit |XCALL, adr, &FF, a, 0,0,0, x wird dann die Routine mit der gewünschten Parameterliste ausgeführt. Das kann nützlich sein zum Testen von Routinen, aber auch wenn ein Parameterwechsel mit Basicvariablen zu langsam wäre.

Eine ähnliche Funktion hat das y-Registèr für Hinter-grund-ROMs. Das sind ROMs mit den Nummern 1 bis 7, die vom Basic oder jedem anderen Vordergrundprogramm aus (z.B. auch über RSX-Befehle) benutzt werden können. Jedes ROM kann beim Einschalten einen eigenen RAM-Bereich für sich reservieren. Die Anfangsadresse dieses Bereiches wird dann bei jedem ROM-Aufruf im y-Register übergeben. Der RAM-Bereich der Floppy enthält u.a. die Disc-Parameter-Blöcke (DPB), Tabellen mit allen wichtigen Diskettenwerten (z.B. auch die Sektorenlänge).

Wenn jemand ein Privat-DOS mit abweichender Sektorenlänge schreiben möchte, dann wäre es vielleicht wünschenswert, im y-Register einfach einen Wert für die neue Tabelle zu übergeben, so daß die ursprüngliche Funktion noch erhalten bleibt. Solche Manipulationen sind mit SASEM jedoch nicht direkt möglich. Das y-Register wird nämlich in diesem Fall direkt vom Betriebssystem gesetzt. Eine Einflußnahme ist jedoch über POKEs möglich, denn die Werte für das y-Register werden aus einer Tabelle im RAM übernommen. Aus dieser Tabelle kann übrigens auch der tatsächlich verwendete (von der Gesamtkonfiguration abhängige) RAM-Bereich der Floppy abgelesen werden.

ROM-Nummer Zeiger auf RAM-Bereich CPC 464

  1. &B1AC
  2. &B1AE
  3. &B1B0
  4. &B1B2
  5. &B1B4
  6. &B1B6
  7. &B1B8

Bleibt die Frage, wozu dann die Möglichkeit besteht, im |XCALL-Befehl einen y-Registerwert anzugeben? Zürn einen werden sicher noch ROMs mit anderen Nummern (größer als 7) auf den Markt kommen, zum anderen gibt es ja auch RAM-Routinen, die eventuell einen y-Register-Wert benötigen.

TRANSFER mit Sasem

Gerade viele der längeren Kassettenprogramme, bei denen eine Verkürzung der Ladezeiten besonders dringend ist, vertragen die Umsetzung auf Diskette nicht. Die beliebte und auch sinnvolle Methode, Maschinenprogramme am oberen RAM-Ende unterzubringen, gerät in Konflikt mit der ebenso sinnvollen Anordnung des Floppy-RAM-Bereiches an derselben Stelle. Dabei geht es nur um 1280 (&500) Byte, die. plötzlich fehlen. Häufig wird deshalb der Vorschlag gemacht, das problematische Programm zunächst an eine niedrigere Adresse zu laden, um es dann mit einer kurzen Routine an die richtige Steile zu verschieben. In vielen Fällen hilft das.

Die Routine dazu sieht so aus: DD, 4E, 0, DD, 46,1, DD, 6E, 2, DD, 66,3, DD, 5E, 4, DD, 56,5, B, 9, EB, 9, 3, ED, B8, C9. Die Werte können z.B. durch POKE (mit &) an eine beliebige freie Stelle des RAM gebracht werden. Mit dem Befehl CALL routine, quelle, ziel, länge wird das Programm wie gewünscht verschoben. Der Floppybereich wird dadurch jedoch überschrieben, mit dem Befehl |TAPE (vor dem CALL) bleibt uns wenigstens die Kassette.

Verschieberoutine

Ab jetzt wird es spannend, denn es geht um Programme, die mit dieser herkömmlichen Methode nicht übertragen werden können. Dafür gibt es zwei Ursachen. Zum einen gibt es Programme, die so lang sind, daß keine 1280 Byte niedrigere Adresse mehr frei ist. Zum anderen benutzen viele Programme eine SYMBOL-Tabelle, die vom Floppy-RAM an eine tiefere Position verdrängt wird und dort stört.

Welche Abhilfe möglich ist, richtet sich danach, welcher Art das gestörte Programme ist. Handelt es sich um ein Un terprogramm, so ist in der Regel noch genug RAM frei. Dann kann die oben angegebene Verschiebemethode zusammen mit einer Zusatzmaßnahme für die SYMBOL-Ta-belle angewendet werden. Diese Tabelle wird normaier-weise von &ABFF an abwärts angelegt. Für jedes Zeichen sind 8 Byte nötig, so daß bei dem Standardwert SYMBOL AFTER 240 die Tabelle bei &AB80 beginnt. Die Floppy verschiebt die Tabelle nach &A680 bis &A6FF. Bei anderen SYMBOL AFTER Werten liegt die Startadresse der Tabelle entsprechend tiefer. Das Maschinenprogramm muß dies berücksichtigen und an eine genügend niedrige Adresse geladen werden. Zusätzlich muß nun noch das Programm SASEM (siehe SESAM CPC Magazin November 85) geladen werden. Damit ist es dann möglich, die SYMBOL-Tabelle mit einem Firmware-Einsprung zu verlegen: |XCALL, &BBAB, &FF, 0,0, Zeichen, startadr.

Zeichen ist entweder 240 oder der vorher in einem SYMBOL AFTER Kommando gegebene Wert, startadr ist &AC00-8* (256-zeichen). Anschließend kann wie oben beschrieben das Maschinenprogramm an seinen Platz verschoben werden. Bei genug freiem RAM besteht sogar die Möglichkeit, die Floppy funktionsfähig zu halten. Dazu ist wiederum SASEM nötig. Die Befehlsfolge |TAPE: |XCALL, &BCCE, &FF, 0, 7, 0, adr+&4FF initialisiert das Floppy-ROM neu an einer zugewiesenen Adresse, adr darf allerdings nicht niedriger als &4000 liegen. In diesem Fall ergibt sich für die einzelnen Schritte folgende Reihenfolge: SASEM laden, Floppy-RAM verschieben, SYMBOL-Tabelle verschieben, Maschinenprogramm direkt an seine Arbeitsadresse laden.

Die größten Schwierigkeiten bereiten Hauptprogramme in Maschinensprache (wären sie in Basic, könnte man ja kürzen), die zu lang sind und nicht genug Platz für die bisher genannten Maßnahmen lassen. Das sind vor allem Spiel Programme, die nur ein kurzes Basicladeprogramm haben. Sobald das Hauptprogramm gestartet ist, wird Basic nicht mehr gebraucht. Zufällig hat der für den Basic-Interpreter reservierte RAM-Bereich ebenfalls die Länge &500. Diese Gelegeheit wird von dem Programm TRANSFER ausgenutzt. Denn es ist möglich, den Floppy-Bereich in die entstandene Lücke zu verlegen, so daß für das Hauptprogramm wieder das maximale RAM zur Verfügung steht. Ein Rücksprung ins Basic ist auf keinen Fall mehr möglich, aber dies ist bei Spielen ohnehin nicht vorgesehen. Die TRANSFER-Routine selbst nimmt keinen Platz weg, denn sie wurde in den unteren Teil des System-Stack gelegt. Für Routinen, die nur einmal laufen müssen ein idealer Ort.

Parameter

TRANSFER benötigt 3 Parameter (bei Bedarf 2 weitere) und eventuell ein POKE. Im einzelnen erledigt das Programm dann folgendes: Die 3 oder 5 Parameter werden übernommen (DATA-Zeilen 100 und 110), dann wird die Floppy in den Bereich &AC00-&B0FF verlegt (Zeile 120). Die SYMBOL-Tabelle wird in Zeile 130 verschoben, außerdem wird eine Adresse für einen Eingabepuffer direkt darunter festgelegt. Falls keine SYMBOL-Tabelle existiert, wird für den Puffer &9000 genommen. In Zeile 140 wird die Disketteneingabe eröffnet und das mit der Variablen a$ benannte Programm geladen. In Zeile 150 wird auf Kassette umgeschaitet. Soll die Disketten-Ein/Ausgabe bestehen bleiben, muß der angegebene POKE eingefügt werden, dann wird dieser Programmteil übersprungen. Da es sich ursprünglich um Kassettensoftware handelt, wird ein Abspeichern etwa des Spielstandes in der Regel auch nur auf Kassette möglich sein. Das |TAPE-Kommando direkt vor dem TRANSFER-Aufruf darf auf keinen Fall vergessen werden. In Zeile 160 wird, falls vorhanden, ein Unsterblichkeitspoke übergeben und mit dem Sprung an die Einsprungadresse das Hauptprogramm gestartet.

Es ist sicherzweckmäßig, eine Diskette für mehrere problematische Spiele/Programme anzulegen. Das TRANS-FER-File kann dann von allen gemeinsam benutzt werden. Da die Maschinenprogramme an ihren normalen Platz geladen werden, sind die Änderungen am Basicladeprogramm gering. Falls es nicht möglich ist, ein Maschinenprogramm wegen seiner Länge auf Diskette zu überspielen, kann man es in zwei Teile zerlegen, die einzeln ohne Schwierigkeiten auf Diskette übertragen werden können. a$ muß dann den Namen des zweiten Teils bekommen und start ist dann ebenfalls die Anfangsadresse des zweiten Programmteiles. Der erste Teil muß normal geladen werden.

Im Basicladeprogramm geht es darum, die letzten ausgeführten Befehle zu ermitteln. Ein LOAD für das Maschinenprogramm und ein CALL, um es zu starten. Aus dem LOÂD-Befehl bekommen wir den start-Wert, aus dem CALL-Befehl den einsprung-Wert für den TRANSFER-Aufruf. Notfalls ergeben sich diese Werte aus dem Kassetten-Kopfsatz, der u.a. mit HYPERLOAD gelesen werden kann. LOAD und CALL müssen nun durch die für die TRANSFER-Anwendung angegebenen Befehle ersetzt werden.

Anwendung:

LOAD "TRANSFER”, &BF00 a$ = ”NAME”
POKE &BF6B, &B ITAPE
CALL &BF00, @a$, start, einsprung, pokeadr, pokewert

Der Poke ist notwendig, falls das Diskettenlaufwerk zugeschaltet bleiben soll, sonst wird auf Kassette umgeschaltet. |TAPE rettet dafür die Kassettenvektoren, pokeadr und pokewert sind nur bei Bedarf anzugeben. Damit kann ein sog. Unsterblichkeitspoke an ein Spielprogramm übergeben werden.

Gerhard Knapienski , CPC MAGAZIN

★ PUBLISHER: CPC Magazin
★ YEARE: 1985 , 1986
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ TAG: /RSX/
★ LICENCE: LISTING
★ AUTHOR: Gerhard Knapienski

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» RSX-Transfer    (CPC  Magazin)    LISTING    GERMANDATE: 2020-05-28
DL: 30 fois
TYPE: PDF
SIZE: 29Ko
NOTE: 1 page/PDFlib v1.6

Je participe au site:
» Newfile(s) upload/Envoye de fichier(s)
★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » Goldmark - Utilities Disk Two
» Applications » Code ASCII/Amstrad ASCII
» Applications » Anti-Erreurs (CPC Revue)
» Applications » Hex-Dump (Happy Computer)
» Applications » Compilation : Demon PD - PD 60 - Demos #12
» Applications » The Painter

QUE DIT LA LOI FRANÇAISE:

L'alinéa 8 de l'article L122-5 du Code de la propriété intellectuelle explique que « Lorsque l'œuvre a été divulguée, l'auteur ne peut interdire la reproduction d'une œuvre et sa représentation effectuées à des fins de conservation ou destinées à préserver les conditions de sa consultation à des fins de recherche ou détudes privées par des particuliers, dans les locaux de l'établissement et sur des terminaux dédiés par des bibliothèques accessibles au public, par des musées ou par des services d'archives, sous réserve que ceux-ci ne recherchent aucun avantage économique ou commercial ». Pas de problème donc pour nous!

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 390 millisecondes et consultée 227 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.