APPLICATIONSDIVERS ★ WINDOW-KOPIERER ★

Window-KopiererApplications 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 ★ 

Windows im ST-Look

Mit einem relativ kleinen Programm können auch Sie eine komfortable Bedienerführung programmieren.

Der Inhalt der Windows ist in den Schneider-Com-putern über den ganzen Speicher verstreut. Zwei neue Basic-Befehle sammeln alle zu einem Window gehörenden Daten und legen sie schön geordnet ab. Das hat vorteilhafte Konsequenzen.

Die einzige Aufgabe des Programms aus Listing 1 ist es. die neuen Befehle im Speicher so zu verstecken, daß sie nicht mehr auffallen. Wenn das erledigt ist. kann es mit »NEW« gelöscht oder durch ein anderes Programm ersetzt werden, ohne daß die neuen Befehle verlorengehen. Sie bleiben bis zum Ausschalten des Computers erhalten. Gestartet wird der Lader genau wie ein gewöhnliches Basic-Programm mit »RUN"WINDOW«. Beachten Sie. daß sich WINDOW nach erledigter Arbeit selbst im Speicher löscht. Sichern Sie es deshalb vor dem ersten Test unbedingt auf Kassette/Diskette, wenn Ihre Arbeit nicht umsonst sein soll. Dieses Programm ist sowohl auf dem CPC 464 als auch auf dem CPC 664/ 6128 lauffähig

In den Zeilen 500 bis 920 können Sie beliebige eigene Ergänzungen einfügen. die nur einmal zu Beginn einer Sitzung ausgeführt werden müssen. Das kann beispielsweise die Definition eines deutschen Zeichensatzes oder ähnliches sein. Der Trick in Zeile 500 (» OPENOUT ... «) fixiert den Kassetten-/Diskettenpuffer auf einen festen Speicherbereich. Dadurch muß er nicht bei jedem »OPENIN/OPENOUT« neu erzeugt werden, was zu einer erheblichen Beschleunigung führt.

Die beiden neuen Befehle heißen |WIN.PUT und |WIN.GET. Das Zeichen »|« stellt eine Besonderheit unter den CPC-Basic-Befehlen dar: Auf den meisten Druckern und auf der Tastatur erscheint es als zwei kurze übereinanderstehende Striche (rechts neben dem »P« über dem Klammeraffen). Trotz der Ähnlichkeit darf es keinesfalls mit dem Doppelpunkt verwechselt werden. Auf dem Bildschirm erscheint »|« dagegen (wie in der gängigen Literatur) als senkrechter Strich. Das führt natürlich zu Verwechslungen mit dem Ausrufezeichen. Ganz anders, wenn Sie einen deutschen Zeichensatz verwenden. Dann wird das Befehlserweiterungszeichen durch den Umlaut »ö« ersetzt.

Ein Window vom Bildschirm holen und irgendwo ab-legen können Sie mit der Befehlsfolge »|WIN.PUT, < adresse > , < links >, < rechts >, < oben >, < unten > «. Durch < links >, < rechts >, < oben > und < unten > werden Lage und Ausdehnung des betreffenden Windows festgelegt, < adresse > steht für die Anfangsadresse des Speicherbereiches, in den die Daten des Windows verschoben werden. Mit abgespeichert wird auch die Ausdehnung des Windows, nicht aber die Bildschirmposition, an der es sich ursprünglich befand.

Die Umkehrung, ein Window aus einem bestimmten Speicherbereich zu holen und auf dem Bildschirm anzuzeigen, erreichen Sie durch »|WIN.GET, < adresse >, < links >, «, (adresse) ist derselbe Wert, der beim Speichern des gesuchten Windows angegeben wurde. Eine Kontrolle führt der Befehl aber nicht durch. Sie müssen schon selbst darauf achten, daß sich an der Adresse wirklich ein Window befindet. Da beim Speichern des Windows die Ausdehnung mit festgehalten wurde, brauchen Sie sich nur noch um die neue Lage zu kümmern. Dazu genügt es, mit (links) und (oben) die neue Bildschirmposition der linken, oberen Ecke anzugeben.

|WIN.PUT und |WINGET bleiben wirkungslos, wenn der Aufruf nicht korrekt ist. Das kann Vorkommen, wenn das angesprochene Window nicht mehr ganz auf den Bildschirm paßt, aber auch wenn zuwenig oder zuviel Parameter übergeben wurden.

Der Bildschirm ist, unabhängig vom Modus (2,4 oder 16 Farben), immer genau 80 Byte breit und 200 Byte hoch. Bei den neuen Windowbefehlen werden zur Lagebeschreibung die Byte-Nummern von Zeile und Spalte angegeben. Die Bildschirmspalten sind von links nach rechts mit 0 bis 79 numeriert und die Zeilen von oben nach unten mit 0 bis 199. Der Befehl »|WIN.PUT, 20000,0,79,0,199«, speichert also den gesamten Bildschirm ab Adresse 20000.

Beachten Sie. daß ein mit »|WIN.PUT, < adresse > , 2 , 4 , ... « abgespeichertes Window nicht etwa die Breite 4 - 2 = 2. sondern die Breite 3 hat (auf ein Blatt Papier zeichnen und nachzählen!). Dasselbe gilt auch für die Höhe. Die Ausdehnung des Windows wird in zwei Byte festgehalten. Der gesamte Speicherbedarf für ein Window beträgt deshalb (< rechts > — < links > + 1) x (< unten > — < oben > + 1) + 2 Byte Hinter der bei »|WIN.PUT angegebenen Adresse müssen mindestens so viele unbelegte Bytes stehen, daß das Window vollständig darin Platz findet.

Die neuen Befehle überprüfen nicht, was ursprünglich im bezeichneten Speicherbereich stand. Sie sind also selbst dafür verantwortlich, daß die Windows in einem freien Speicherbereich abgelegt werden und sich nicht gegenseitig überlappen. Selbstverständlich können Sie aber nicht mehr benötigte Windows überschreiben. Zur Reservierung von genügend Speicherplatz gibt es zwei Möglichkeiten:

Durch »PRINT HIMEM« erhalten Sie die Obergrenze des Speicherbereiches, den Sie nach eigenem Gutdünken verwenden können. Durch »MEMORY Adresse)« wird diese Grenze auf einen niedrigeren Wert gesetzt. Der ganze zwischen dem alten und neuen »HIMEM« liegende Speicherbereich ist jetzt geschützt und kann für die zu speichernden Windows genutzt werden.

Achten Sie aber peinlich genau darauf, daß |WIN.PUT nicht über diesen Bereich hinaus schreibt. Bei der zweiten Vorgehensweise wird durch »DIM (varfeld) % ( < groesse >)« ein Feld mit < groesse > + 1 Integer-Elementen reserviert. Eine Integerzahl belegt zwei Byte, so daß das gesamte Feld 2 x < groesse >+ 2 Byte belegt. »PRINT < varfeld > % (0) « liefert die Adresse des ersten Byte dieses Feldes.

»@« ist der Klammeraffe auf der Taste rechts neben dem P. Bei Verwendung des deutschen Zeichensatzes sieht der Klammeraffe allerdings wie ein Paragraph aus. Wenn dieses Zeichen vor einem Variablennamen steht, erhalten Sie nicht den Wert der Variablen, sondern die Speicheradresse, an der er sich befindet.

Da die Elemente eines Feldes im Speicher direkt hintereinanderstehen, wird das Window durch » |WIN.PUT , @< varfeld > %(0) , < links > , < rechts > , < oben > , < unten > « also im Variablenfeld abgespeichert. Natürlich müssen Sie darauf achten, daß das Feld genügend groß ist. Analog funktioniert auch das Zurückholen eines Windows.

Diese Methode hat den Vorteil, daß Sie durch »ERASE < varfeld > % « ein nicht mehr benötigtes Window samt zugehörigem Variablenfeld auch wieder löschen können und so nicht unnötig Speicherplatz belegt wird. Wenn Sie jedem Window ein eigenes Variablenfeld spendieren. besteht auch keine Gefahr, daß sich verschiedene Fenster überlappen. Der Nachteil dieser Methode ist, daß ein Variablenfeld keine feste Lage im Speicher hat.

Unmittelbar vor jeder Verwendung müssen Sie deshalb die Adresse des Feldes wieder neu berechnen.

Ein Window, das Sie mit » |WIN.PUT « an der Adresse < adresse > gespeichert haben, belegt (anzahl) Byte. Die Anzahl der Bytes können Sie nach der oben gezeigten Formel berechnen. Die Datenbytes des Windows sind hinter < adresse > nicht mehr irgendwie verteilt, sondern stehen ohne Lücken direkt hintereinander. Mit »SAVE "Name", b,< adresse >, < anzahl > « können Sie deshalb das Window auf Kassette oder Diskette speichern. Der Name der Datei hängt von Lust und Laune ab. Im Gegensatz zur Standardmethode beim Bildschirmabspeichern belegt ein Window keine 17 KByte, sondern erheblich weniger Platz. Umgekehrt können Sie mit »LOAD "Name" , < neuadresse > « das Window an eine beliebige neue Adresse zurückholen. Durch »|WIN.GET , < neuadresse >, < links> , < oben > « wird es wieder auf dem Bildschirm angezeigt. Nachdem WINDOW einmal gestartet wurde und der CPC damit die neuen Befehle kennt, können Sie das Programm aus Listing 2 in den Speicher laden (oder eintippen).

In den Zeilen 190 bis 280 wird ein Window gezeichnet und ab Adresse 8000 hex gespeichert. Speicherplatz dafür wurde in der Zeile 160 reserviert. Zeile 330 holt es an eine zufällige Bildschirmposition zurück — und wiederholt das so lange, bis eine Taste gedrückt wird. Eindrucksvoll ist vor allem die Ablaufgeschwindigkeit.

Als Varianten für eigene Experimente wären möglich:

  • Einfügen von Verzögerungsbefehlen
  • Ersetzen der Zufallspositionen durch eine geordnete Bahnkurve. Interessant ist beispielsweise das Einfügen der Zeilen:

315 w = 0
330 |WIN.GET,&8000,CINT(20*COS(w) + 20),CINT(12.5*SIN(w)+12.5)*4
335 w=w + < Schrittweite >


< Schrittweite > sollte etwa in der Größenordnung von 0,05 liegen. Lassen Sie es sich aber nicht entgehen, mit anderen Werten zu experimentieren. Die Ergebnisse werden Sie überraschen!
Listing 3 zeigt eine in »gehobenen« Programmen moderne Anwendung: Vor einem beliebigen Hintergrund wird ein Text- (oder Graphik-)fenster eröffnet, das beliebig beschreibbar ist. Nach dem Schließen dieses Fensters wird automatisch der alte Hintergrund wiederhergestellt.

Das »Herz« dieses Demonstrationsprogrammes sind die beiden Routinen in den Zeilen 10000 und 10190.

Dem Unterprogramm in der Zeile 10000 müssen nur die Grenzen des zu eröffnenden Textfensters und in der Variable addr% eine Speicheradresse, in der der Hintergrund abgelegt werden soll, übergeben werden. Die Angabe der Windowgröße erfolgt wie bei dem Befehl » WINDOW #0 , wl% , wr , wo% , wu% « im Modus 2. Das gilt auch, wenn das Unterprogramm in anderen Modi verwendet wird. Die Werte der Variablen wl% und wr% sind also unabhängig vom Modus.

Danach erledigt es automatisch alle nötigen Arbeiten, wie:

  • Speichern des Hintergrundes. Dabei wird (im Gegensatz zum normalen |WIN.PUT) auch die Lage des Windows abgespeichert. Es müssen also zwei Byte mehr als gewöhnlich reserviert werden.
  • Erzeugen eines Grafik-Windows, das dieselbe Größe und Lage wie das Textwindow hat.
  • Löschen des eroffneten Windows,
  • Zeichnen des Rahmens,
  • Berechnung aller nötigen Koordinaten.

Jetzt kann nach Herzenslust in das neue Window geschrieben werden.

Beim Schließen des Fensters wird automatisch der Hintergrund wieder zurückgeholt. Da auch die Lage des Windows gespeichert ist, braucht jetzt nur noch in der Variablen adrr% die Adresse angegeben zu werden, an der es sich befindet.

Mehrere, sich überlappende. Windows gleichzeitig können Sie offenhalten, wenn Sie folgende Regeln beherzigen:

  • Reservieren Sie soviel Speicherplatz, daß alle Windows zugleich gespeichert sein können.
  • Beschreiben Sie immer nur das zuoberst liegende Window.
  • Durch |WINGET können Sie ein bisher teilweise verdeckt liegendes, aber gespeichertes Window an die oberfläche ziehen.
  • Vorher sollten Sie mit |WIN.PUT das bisher oberste Window speichern, so daß Sie beim nächsten »Nach-oben-Ziehen« das Window mitsamt Inhalt wieder restaurieren können.

Die Anzahl der so verwalteten Windows hängt ohne zusätzlichen Aufwand nur vom verfügbaren Speicherplatz ab.

Folgender Abschnitt ist nur für Fortgeschrittene geeignet. Sie können die Befehlserweiterungen aber auch verwenden, wenn hier einiges unklar bleibt.

Der Basic-Lader ist so konstruiert, daß sich die Befehle selbst automatisch bis unmittelbar unter »HIMEM« verschieben. Dadurch wird nicht unnötig Speicherplatz belegt. Aus diesem Grunde sind die Befehle sowohl mit Kassette als auch mit Diskettenlaufwerk oder beliebigen anderen Erweiterungen lauffähig.

Die beiden neuen Befehle werden, wie bei den CPCs üblich, mit Hüfe einer RSX (Resident System Extension) ins Betriebssystem eingebunden. Trotz des Namens sind RSX-Befehle aber so resident auch wieder nicht: Im Gegensatz zu den Disketten-RSX-Befehlen gehen selbst programmierte spätestens beim Ausschalten des Computers wieder verloren. Durch einen Programmfehler kann man also nichts zerstören. Intern verwenden sie nur die normalen Firmware-Einsprünge. Die Befehle sind so auf allen drei kleineren Schneider-Computern lauffähig.

Die Berechnung der Window-Koordinaten funktioniert nur richtig, wenn sich die linke, obere Bildschirmecke an der Adresse C000 hex befindet. Durch einen Hardware-Scroll wird diese Bedingung verletzt. Eine Möglichkeit, den Hardware-Scroll zu unterbinden ist. die Ausgabe auf einen Teilbildschirm zu beschränken, beispielsweise durch » WINDOW #0 , 1 , 80 , 1 , 24« nach jedem MODE-Kommando: Die letzte Zeile bleibt dann leer. Da diese Eingabe in der Regel schnell vergessen wird, enthält das Programm zur Befehlserweiterungauch einen neuen Mode-Befehl: Sofort nach der Ausführung des origmalen Mode-Befehls wird die Windowhöhe um Eins vermindert. Der Nachteil dieser Methode ist, daß die letzte Bildschirmzeile nicht genutzt wird und das softwaremäßige Rollen langsamer abläuft. Aber wegen des Vorteils der zusätzlichen Window-Befehle kann das ohne weiteres hingenommen werden.

Helmut Tischer/Ja , HC

★ PUBLISHER: Happy Computer
★ YEAR: 1986 (3/1)
★ CONFIG: AMSDOS + 64K
★ LANGUAGE:
★ LiCENCE: LISTING
★ COLLECTION: HAPPY COMPUTER 1986
★ AUTHOR: Helmut Tischer / Isar-Amper-Soft

 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» Window-Kopierer    (Happy  Computer)    LISTING    GERMANDATE: 2017-03-25
DL: 238
TYPE: PDF
SiZE: 672Ko
NOTE: Uploaded by hERMOL ; 5 pages/PDFlib v1.6

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

Lien(s):
» Applications » RSX-Fill (CPC Magazin)
» Applications » RITA : Resident Inline Turbo-Assembler (Happy Computer)
» Applications » RSX Professional
» Applications » 3D Megacode
» Applications » RSX Input (CPC Amstrad International)
» Applications » RSX Grafik (Markus Adamski/Schneider Aktiv)
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
Page créée en 311 millisecondes et consultée 1386 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.