★ APPLICATIONS ★ PROGRAMMATION ★ GBASIC - 30 neue Grafikbefehle ★ |
GBasic (CPC Amstrad International) | Applications Programmation |
Diese Programme ermöglichen die Generierung und Verwaltung von 30 neuen, als RSX eingebundenen Grafikbefehlen. Bei der Programmierung dieser Befehlserweiterung wurde auf einen universellen Einsatz Wert gelegt. Knackpunkt bei dieser Erweiterung ist das einfache Verändern von Grafiken (z.B. spiegeln usw.). Vor allem sollten wirklich neue Befehle geschaffen werden. Zunächst ihre Fähigkeiten:
Hier nun die Erklärung der Befehle. Zu erwähnen bleibt nur, daß eventuelle Fehler als abfangbarer ( → ON ERROR GOTO) SYNTAX-ERROR gemeldet werden. In der Anleitung steht ein ! für den geraden Strich vor einem RSX-Befehl und ein # für einen Klammeraffen. Buchstaben wie x/y hinter den Befehlen stehen als Platzhalter für Ausdrücke. |TDRAW,x,y Zieht in Gedanken einen Strich von der aktuellen Grafikposition zur angegebenen Position x/y ( → DRAW). Nun holt sich der Computer die Farbinformationen der Punkte, die auf dieser gedachten Linie liegen, codiert sie und legt sie zur weiteren Verarbeitung in einen Buffer (Speicherplatz, —BUFFER), der 640 Bytes umfaßt, ab.
|TDRAWR , x , y Dasselbe wie bei TDRAW, nur daß die Koordinaten relativ zur aktuellen Position berechnet werden (→ DRAWR) |WDRAW , x , y , Bufferpos. Dieser Befehl gibt die Farbinformation die im Buffer ist wieder als Linie auf dem Bildschirm aus. Hierbei zieht er eine Linie von der aktuellen Grafikposition zur angegebenen, legt aber jetzt nicht nur Punkte gleicher Farbe ab, sondern die Farben die im Buffer festgehalten sind. Der 3. Wert (< Bufferpos. >) gibt an. von welcher Stelle im Buffer an die Farben ausgelesen werden sollen. Dieser darf einen Wert von 0-640 annehmen. Auch hier zieht er immer von links nach rechts. |WDRAWR , x , y, Bufferpos. Macht dasselbe die WDRAW, nur relativ. |TWDRAW, x1,y1 , x2 , y2, x3 , y3 , x4 , y4 ,Bup Dieser Befehl kombiniert TDRAW und WDRAW.
|BUFFER, < Bufferadresse > Legt den Buffer für T/WDRAW an die Adresse < Bufferadresse >. Bei T/WDRAW's wird nun der Buffer an dieser Stelle benutzt. Die Bufferadresse muß > &4000 (> 16384) sein. Doch einige Worte zu den Buffern bei GBASIC: GBASIC reserviert 1280 (&500) Bytes als Buffer. Zum einen braucht er alle 1280 Bytes beim RASTER-FILL. T/WDRAW — Aktionen greifen auch auf diesen Buffer zurück. Das sind standardmäßig die unteren 640 Bytes, die oberen 640 können aber auch als 2. Aushilfsbuffer benutzt werden. Dieser kann mit diesem Befehl anselektiert werden. (Bufferadressen siehe GTUNER, Merkzettel). |BEEK, < Bufferpos. >, #Integervariable Liest den Inhalt der angegebenen Bufferstelle (Buffpos. ,0-640) in die Variable ein. Hierbei wird die Farbinformation an dieser Stelle als INK-Farbstift (wie alle Farben sonst auch) angegeben.
|BOKE, < Bufferpos. >, # Integervariable Legt die Farbnummer an der angegebenen Stelle im Buffer ab. Bsp.: |BOKE,1,1 |LEN, # < INT-Variable > Dieser Befehl übergibt eine Zahl (0-640) in die Integervariable. Für den Wert gibt es zwei Bedeutungen:
Beachte: Richtige Übergabe der Variablen. Bsp.: l%=0:|LEN , #l%:? l% |ENG, < Eng-Zahl >, < Ink-Nummer > Dieser Befehl läßt die Farbinformation im Buffer zusammenrücken. Wie stark dies geschehen soll, hängt vom 1. Parameter ab. Je kleiner er ist, desto stärker wird der Buffer zusammengeschoben. Bei 1 als < ENG-Zahl > wird z.B. jede 2. Farbinformation verschluckt. Allgemein ergibt sich folgender Zusammenhang: Jede < Eng-Zahl > + 1 te Farbinformation wird verschluckt. Hierbei wird hinten Bufferplatz frei, der mit der < INK-Nummer > aufgefüllt wird. Bsp.: |ENG,2,0 |BREIT Hier geschieht das Gegenteil wie bei ENG. Der Bufferinhalt wird — vorgeschriebenermaßen — auf das doppelte aufgeblasen. Jeder Farbpunkt wird also verdoppelt. |WANDEL, < 1.Farbe >, < 2.Farbe > ,A , L Dieser Befehl bearbeitet einen Teil des Buffers. Dieser Teil wird durch A und L beschrieben — dem »A«nfang und der »L«änge des Teilstücks. Diese Art der Teildefinition taucht auch bei anderen Befehlen wieder auf. Der o.g. Bereich wird nach der 1. Farbe (INK-Farbnummer) durchsucht. Findet er die 1. Farbe, wird diese durch die 2. ausgetauscht und GBASIC sucht weiter. Beachte: A und L dürfen zusammen nicht > 640 (&280) sein.
|DREHE,A,L Dreht den Teilbereich des Buffers (Anfang, Länge) um. Bsp.: |DREHE,0,640 Dreht den gesamten Bufferinhalt. |RECHTS,< Wieviel Punkte > , A , L Der Teilbereich wird um < Wieviel Punkte > nach rechts kopiert/verschoben.
Bsp.: |RECHTS,10,0,630 — Verschiebt den gesamten Bufferinhalt um 10 Punkte nach rechts. |FILL, < Farbe >, A,L Dies ist nicht der RASTER-FILL! Hier wird nur der Teilbereich (A,L) mit der < Farbe > aufgefüllt. Löschen des Buffers: |FILL,0,0,640 |VORNE , Anfang , Farbe , Flagge, # INT-Var Dieser Befehl durchsucht den Bufferinhalt von VORNE nach hinten, am ANFANG angefangen nach der FARBE. Die Stelle wird in der INTeger VARiablen übergeben. Wurde nichts gefunden, steht dort -1. Die FLAGGE gibt an, wie gesucht wird. Wenn: |HINTEN , Anfang , Farbe , Flagge, #IN-Var Durchsucht den Buffer ab ANFANG von HINTEN aus. Die anderen Parameter sind gleich wie bei VORNE. |SCRDEF, < Adresse > GBASIC erlaubt es, einen 2.Bildschirmspeicher im RAM zu verwalten. Dieser Befehl legt die Adresse für diesen fest.
|SCR1 |SCR2 Diese beiden Befehle erlauben es, zwischen dem normalen Bildschirmspeicher (1, Anfang &C000,immer auf Monitor) und einem 2. Bildschirmspeicher (→SCRDEF, nie von alleine sichtbar) hin und her zu schalten. So wurde nun ein Strich im 2. Bildspeicher (ab &5000=20480) gemacht. Auf dem Monitor hat sich nichts geregt. Mit |REIN (→) kann nun der 2. Speicher hereingeholt und die Linie bewundert werden.
|REIN (,L,R,O,U,X,Y) Mit diesem Befehl kann man ein Bild (oder nur ein Teil davon) aus dem 2. Bildschirmspeicher in den normalen Speicher herREINkopieren. Hier gibt es zwei verschiedene Formen des Befehls: a) REIN ohne Parameter: der ganze Bildschirmspeicher wird kopiert. b) REIN mit 6 Parametern: Hier wird nur ein Teil-Rechteck kopiert. Aus einem beliebig gelegten Rechteck im 2. Bildschirmspeicher werden die Daten in ein gleich großes, aber auch beliebig platziertes Rechteck im 1. Speicher kopiert. GBASIC braucht also Größe und die beiden Positionen der Rechtecke oder Fenster (WINDÖWs). Das Fenster wird wie bei der WINDOW Angabe im Mode 2 definiert: »L«inks,»R«echts,»0«ben,»U«nten Dies definiert Größe und Platz des Windows im 1. (normalen) Bildspeicher. Für das Fenster, aus dem die Daten kommen (das für den 2. Bildschirmspeicher), brauchen wir nur noch die Koordinaten der linken oberen Ecke: 'Y'-Koor.(1-25) Beachte: Bei Hardware-Scroll gibt es Fehler und Verschiebungen. Holt die rechte Hälfte des Bildschirms aus dem 2. Speicher und kopiert ihn an die linke Hälfte im normalen Speicher. |RAUS (L,R,O,U,X,Y) Dieser Befehl macht genau das gleiche wie REIN, nur wird hier vom normalen in den 2. Speicher RAUS- kopiert. |CHANGE (L,R,0,U,X,Y) Dieser Befehl ist wieder ähnlich den Befehlen REIN/RAUS; so ist auch die Parameterauswertung gleich. Hier werden aber die Bildschirminhalte gegenseitig ausgetauscht. So wechselt z.B. CHANGE in Reinform die beiden Bildschirmspeicher aus. Das was im 1. Speicher sichtbar war, ist nun im 2. und umgekehrt ist der 2. Speicher nun sichtbar. Bei CHANGE gehen also keine Daten verloren, es wird nichts überschrieben. |WIDTH,x,y Legt die Größe eines Grafikpunktes bei PLOT(R), DRAW(R), W/TDRAW(R), PRASTER und bei Textausgabe mit TAG fest. Die Größe des Grafikpunktes kann in X-(Breite) und Y-(Höhe) Koordinaten festgelegt werden. Hiermit kann also die Strichstärke bei DRAW festgelegt werden (!). Wird als X-Koordinate 0 angegeben, so wird die WIDTH-Routine ausgeschaltet (Grafik mit IWIDTH,1,1 ist langsamer als abgeschaltete mit IWIDTH,0,0). Beachte:
|ENCODE, < Farbnummer >, # < INTeger-Var > Kodiert die Farbnummer in eine Bitmaske und übergibt diese in die Variable. Die Bitmaske wild bei den Befehlen PRASTER und RFILL besonders wichtig bei der RASTER-Definition. Auch bei W/TDRAW's werden die Farben in dieser, übrigens in jedem Mode anderen Bitmaske, in den Buffer eingetragen. |GMODUS, < 0-4 > Die Schneider haben verschiedene Grafikmodi bei PLOT/DRAW ... : und bei GBASIC einen neuen: 4: »NORCE« Mode Die Grafikmodi müssen unter GBASIC mit diesem Befehl angewählt werden! Veränderungen mit Steuerzeichenfolgen setzen GBASIC außer Gefecht. Der 4. Modus setzt Punkte wie bei FORCE (also normal), außer es wird mit der Farbe 0 geplotet, dann wird nämlich nichts getan. (→ »SHOW«) Bsp.: |GMODUS,2 AND-Mode einstellen Nun ein umfangreicher Befehl: |PFEIL, fl, fr, fo, fu ,ascii-links,-rechts,-oben,-unten ,wait, x-step,y-step,@X,@Y,@F Der Befehl läßt einen Pfeil in einem definierten Fenster durch Tastendruck bewegen. Die Routine braucht 3 INT-Variablen. Die Variablen X und Y geben die aktuelle Position an. Sie sind mit physikalischen Koordinaten anzugeben (—WIDTH). Wird die Routine durch Drücken einer falschen Taste, die nicht zur Pfeilsteuerung dient, beendet, so enthalten X und Y die akt. Koordinaten und F den ASCII- Code der zuletzt gedrückten Taste. Welche Tasten den Pfeil steuern, wird auch angegeben: ASCII-Links: ASCII-Code für Pfeil nach links bewegen ASCII-Rechts ... Das Fenster, in dem sich der Cursor bewegen darf, wird durch 4 Parameter angegeben. Sie beinhalten physikalische Koordinaten: Bsp.: MODE 1:DEFINT x,y,z:x=160:y=100:speed key 20,1: |PFEIL,0,319,199,0,242,243,240,241,0,2,2, #x, #y, #f läßt den Pfeil mit den Cursortasten ab der Bildschirmmitte auf dem ganzen Bildschirm bewegen. Eine andere Taste als die Cursorsteuerung bringt den Abbruch des Befehls. |ZEIGE , x , y Bildet den Pfeil an der physikalischen Koordinate (→WIDTH) ab. Der Pfeil wirkt invertierend, d.h. einmal an einer Stelle dargestellt, kann er ohne den Hintergrund zu verändern, durch nochmaliges Setzen wieder gelöscht werden. Bsp.: |ZEIGE,160,100:WHILE INKEY$=‘‘“ malt einen Pfeil und löscht ihn auf Tastendruck wieder. |RFILL, #raster$ Dieser leistungsfähige Befehl, abgeleitet aus der FILL-Routi-ne im Schneider International (4/86), füllt eine beliebig begrenzte Fläche ab der akt. Grafikposition (mit »MOVE« gesetzt) mit einem bestimmten mehrfarbigen (!) Muster aus. Das Muster, auch Raster genannt, ist im String (in diesem Fall) raster$ enthalten. Das Raster baut normalerweise auf einer 12 xl2 großen Matrix auf. Die Matrixgröße kann in weiten Grenzen mit dem Programm »GTUNER« verändert werden. Einzige Grenze bildet die Stringlänge von 255 Zeichen, in denen die Farbinformationen des Rasters ja abgelegt werden müssen. Und so werden die Daten in den String abgelegt: Zuerst 12 Mal (oder X-Breite bei anderer Größe) CHR$(1), dann Farbdaten, hier 144 Stellen (oder XY Stellen bei anderer Größe) dann wieder 12 Mal CHR$(1) (→ entspr.: STRING$(12,1) Wie sind aber die Farbdaten (die 144 Stellen in der Mitte) genauer definiert? Wir gehen einmal davon aus, daß Sie ihr Raster kennen und evtl. schon auf einem karierten Stück Papier notiert haben. Die Farbdaten werden nun aus dem Raster von oben links nach unten rechts zeilenweise geLESEN (so, wie man liest!). Als Farbdaten meine ich die Farbnummer (oder INK-Stift) eines Punktes. Nun habe ich die Farbnummer meines Punktes, muß diese mit IENCODE in eine Bitmaske umwandeln und den erhaltenen Wert mit CHR$ an den String an-hängen: a%=l(Farbnr.=l):IENCODE,a%, #a%:r$=r:$+chr$(a%) (→ RESIGNER) Beachte:
|PRASTER , x , y, # raster$ Dieser Befehl platziert das Raster an die physikalischen Koordinaten x/y. Raster$ gibt das Raster an. (→ RFILL). Li.1:(GDATA) Dieses Programm liest GBASIC aus den Data's in den Speicher und paßt es automatisch an den Schneider, den Sie haben, an. GBASIC wird dann als Binärdatei »PROBE« abgespeichert. Auf diese Datei greifen nun Listing 2 und 3 zurück.
MEMORY < akt. Anfangsadresse > -1 So kann sich jeder sein persönlich gebrauchtes GBASIC zusammenstellen. Li.3:(SHOW) dieses Programm demonstriert die Fähigkeiten von GBASIC recht eindrücklich. Es muß nicht unbedingt abgetippt werden, dient nur zur Analyse von Programmtechniken mit GBASIC GBASIC - INTERN Hier möchte ich die grobe Funktionsweise des Programmes etwas erläutern. Das Programm entstand schrittweise. Zuerst T/W-DRAW, dann die Verwaltung des 2. Bildschirmspeichers und am Ende der Raster- Fill. Anfangs dachte ich nicht, daß GBASIC so groß werden würde, aber mir fiel schrittweise immer etwas neues ein. GBASIC arbeitet bei fast allen Funktionen mit der SCR-Write In- direction. Wenn der CPC einen Grafikpunkt (oder mehrere) ausgeben will, so springt er an eine Adresse im RAM, die normalerweise auf den aktuellen Grafikmodus zeigt. Wird nun diese Adresse verbogen, was GBASIC des öfteren tut, so läuft jeder Punkt, der bei: DRAW / PLOT / Textausgabe mit TAG ausgegeben wird, über die eigene Routine.
Durch geschicktes Verbiegen der Adressen können diese Funktionen auch gemischt werden (z.B. WIDTH & WDRAW; TDRAW & 2. RAM usw.). Dann kann ich Ihnen nur noch gutes Programmieren und viel Spaß wünschen!
|