Projekt Hardware Bedienung BASIC (1) BASIC (2) BASIC (3) Interna Beispiele Erweiterungen Bibliotheken Treiber Programme Bezugsquellen: Bausatz Leerplatine |
AVR-ChipBasic2: BASIC-Referenz (2)
Grafik und Sound V1.50 (c) 2006-2015 Jörg Wolfram 1 Grafik1.1 Pseudografik im TextmodusFür die Pseudografik wird jedes Zeichen in 4 "Pixel" aufgeteilt. Bei 23 Zeilen a 30 Zeichen ergibt sich so eine Arbeitsfläche von 60x46 Punkten. Die 4 Pixel eines Zeichens haben immer die gleiche Hinter- und Vordergrundfarbe.Ist die Zeichenfarbe gleich der Hintergrundfarbe des zu ändernden Zeichens, so werden die Pixel nur gelöscht, Farbinformationen werden nicht verändert. Ist die Zeichenfarbe gleich der Vordergrundfarbe, werden nur Pixel gesetzt, Farbinformationen werden auch hier nicht verändert. Gibt es keine Übereinstimmung zwischen der Zeichenfarbe und der Vorder- und Hintergrundfarbe des betreffenden Zeichens, wird die Vordergrundfarbe neu gesetzt wobei bereits gesetzte Pixel zwangsläufig mit umgefärbt werden. Zusätzlich zur Pseudografik im Textmodus gibt es noch 4 Grafikmodi, die sich in Auflösung und Anzahl der darstellbaren Farben unterscheiden. Allerdings lässt der verfügbare Speicher des Controllers keine sehr hohen Auflösungen zu. Ebenfalls aus Speicherplatzgründen ist es nicht möglich, den Monitor in den Grafikmodi aufzurufen. Werden in den Modi 2,3 und 5 Vorder- und Hintergrundfarbe gesetzt, zeigen diese auf den Palettenindex und geben nicht die Farbe direkt an. 1.2 Videomode 1Die Pixelauflösung beträgt 168x116 Pixel, wobei für jeweils 8x8 (am unteren Rand nur 4x8) Pixel Vorder- und Hintergrundfarbe eingestellt werden können. Ist die Zeichenfarbe gleich der Hintergrundfarbe an der zeichenposition, so werden die Pixel nur gelöscht, Farbinformationen werden nicht verändert. Ist die Zeichenfarbe gleich der Vordergrundfarbe, werden nur Pixel gesetzt, Farbinformationen werden auch hier nicht verändert. Gibt es keine Übereinstimmung zwischen der Zeichenfarbe und der Vorder- und Hintergrundfarbe des entsprechenden Bereiches, wird die Vordergrundfarbe neu gesetzt wobei bereits gesetzte Pixel zwangsläufig mit umgefärbt werden.1.3 Videomode 2Die Pixelauflösung beträgt 120x76 Pixel, jedes Pixel kann eine aus 4 über die Palette einstellbaren Farben annehmen.1.4 Videomode 3Die Pixelauflösung beträgt 84x58 Pixel, jedes Pixel kann eine aus 16 über die Palette einstellbaren Farben annehmen.1.5 Videomode 5Die Pixelauflösung beträgt 128x64 Pixel, jedes Pixel kann eine aus 2 über die Palette einstellbaren Farben annehmen. Dieser Modus dient hauptsächlich zur Emulation von Grafik-LCD mit der entsprechenden Auflösung.1.6 VMODE n [VM]Schaltet den Videomodus um. Dabei werden der Bildschirm gelöscht und die Textkoordinaten auf die linke obere Ecke gesetzt.
Zusätzlich werden die im jeweiligen Modus genutzten Paletteneinträge vorbelegt. 1.7 PALETTE start,c1(,c2,c3,c4,c5,c6) [PAL]Mit diesem Befehl wird die Farbpalette für die Videomodi 2 bis 3 und 5 eingestellt. Für den Modus 5 werden nur die Einträge 0 und 1 verwendet, für Modus 2 die Einträge 0 bis 3. Die Anzahl der zu setzenden Paletteneinträge ist auf 6 begrenzt, anderenfalls kommt es zu einer Fehlermeldung. Als Farbwerte müssen im Bereich (0...15) angegeben werden. Nach dem Umschalten des Videomodus sind die Paletteneinträge wie folgt vorbelegt:
1.8 PLOT Y,X(,C) [PL]Mit dem PLOT-Befehl wir ein Punkt an der Stelle Y,X gesetzt. Bei Bedarf kann zusätzlich die Zeichenfarbe mit angegeben werden.
1.9 DRAWTO Y2,X2(,C) [DTO]Zeichnet eine Linie vom zuletzt gezeichneten Pixel nach Y2,X2 in der aktuellen Vordergrundfarbe. Bei Bedarf kann zusätzlich die Zeichenfarbe mit angegeben werden. Beim Programmstart ist das zuletzt gezeichnete Pixel als Y=0,X=0 definiert.
1.10 DRAW Y1,X1,Y2,X2(,C) [DR]Zeichnet eine Linie vo Y1,X1 nach Y2,X2 in der aktuellen Vordergrundfarbe. Bei Bedarf kann zusätzlich die Zeichenfarbe mit angegeben werden.
1.11 BOX Y1,X1,Y2,X2(,C)Mit dem BOX-Befehl wird ein Rechteck in der aktuellen Vordergrundfarbe gezeichnet. Bei Bedarf kann zusätzlich die Zeichenfarbe mit angegeben werden.
1.12 FBOX Y1,X1,Y2,X2(,C)Mit dem FBOX-Befehl wird ein gefülltes Rechteck gezeichnet. Ist Y1=Y2 oder X1=X2 werden horizontale oder vertikale Linien gezeichnet. Bei Bedarf kann zusätzlich die Zeichenfarbe mit angegeben werden.
1.13 CIRCLE Y,X,RY,RX(,C) [CI]Zeichnet einen Kreis (eine Ellipse) mit dem Mittelpunkt Y,X und den Radien RY und RX in der aktuellen Vordergrundfarbe. Für Kreise muss RX=RY sein. Bei Bedarf kann zusätzlich die Zeichenfarbe mit angegeben werden.
1.14 FCIRCLE Y,X,RY,RX(,C) [FCI]Zeichnet einen gefüllten Kreis (eine gefüllte Ellipse) mit dem Mittelpunkt Y,X und den Radien RY und RX in der aktuellen Vordergrundfarbe. Für Kreise muss RX=RY sein. Bei Bedarf kann zusätzlich die Zeichenfarbe mit angegeben werden.
1.15 ARC Y,X,RY,RX,W1,W2(,C)Zeichnet einen Kreis- oder Ellipsenausschnitt mit dem Mittelpunkt Y,X und den Radien RY und RX in der aktuellen Vordergrundfarbe. beginnend beim Winkel W1 bis zum Winkel W2. Die beiden Winkel werden in Grad angegeben, dabei sollte der Anfangswinkel kleiner als der Endwinkel sein, ansonsten braucht die Funktion recht lange. Für Kreisauschnitte muss RX=RY sein, bei Bedarf kann zusätzlich die Zeichenfarbe mit angegeben werden.
1.16 PIE Y,X,RY,RX,W1,W2(,C)Zeichnet einen abgeschlossenen Kreis- oder Ellipsenausschnitt (ein "Tortenstück")mit dem Mittelpunkt Y,X und den Radien RY und RX in der aktuellen Vordergrundfarbe. beginnend beim Winkel W1 bis zum Winkel W2. Die beiden Winkel werden in Grad angegeben, dabei sollte der Anfangswinkel kleiner als der Endwinkel sein, ansonsten braucht die Funktion recht lange. Im Gegensatz zu ARC werdennoch zusätzlich Linien von den beiden Endpunkten zum Mittelpunkt gezogen. Für Kreisauschnitte muss RX=RY sein, bei Bedarf kann zusätzlich die Zeichenfarbe mit angegeben werden.
1.17 GETPIX variable,Y,X [GPX]Ermittelt die Farbe des Pixels an der Stelle Y,X und speichert den Palettenindex (nicht die Farbe!) in der angegebenen Variablen.
1.18 BCOPY [BC]Der BCOPY Befehl ermöglicht es, rechteckige Blöcke oder Speicherbereiche innerhalb des Bildschirms oder ins/vom Array zu kopieren. Damit lassen sich z.B. Sprites im Grafikmodus oder Scrolling realisieren. Blöcke können in den Modi 1...3 von und an (fast) beliebigen Koordinaten kopiert werden, lediglich die Größe ist Beschränkungen unterworfen. Es können nur ganze Teilblöcke kopiert werden.
Im Videomodus 1 ist ein Teilblock 8x8 Pixel groß, um einen 16(V)x24(H) Pixel großen Block zu kopieren, müssen DX=2 und DY=3 sein, im Videomodus 2 DX=4 und DY=6 und im Videomodus 3 DX=8 und DY=12. Der erste Wert gibt den Kopiermodus an, von diesem ist auch die Anzahl der restlichen Parameter abhängig.
Im Modus 2 wird geprüft, ob die Grenzen des Arrays überschritten werden, in diesem Fall wird dann sofort abgebrochen. Mit den folgenden Formeln lässt sich der erforderliche Speicherbedarf berechnen:
DX und DY ist hierbei die Anzahl der Teilblöcke. Kopiermodus 3 sollte nur auf Arraypositionen angewendet werden, die auch sinnvolle Informationen enthalten. Diese können entweder durch Kopieren im Modus 2 oder auch durch "DATA" entstanden sein. Die Pixelinformationen sind derart organisiert, dass in einem Byte je nach Videomode 8, 4 oder 2 Pixel codiert sind. dabei ist das niederwertigste Bit ganz links.
Zusätzlich gibt es noch die Modi 4-6, die auf die Orgaisation des Bildspeichers keine Rücksicht nehmen und zum schnellen Umkopieren gedacht sind.
Diese 3 Modi sind insbesondere in den Videomodi 4 und 6 mit den Benutzerdefinierten Zeichen interessant. Die Organisation des Bildspeichers in den verschiedenen Videomodi wird im Abschnitt Der Bildspeicher genauer beschrieben. 1.19 PRINT [?]Der PRINT Befehl entspricht weitestgehend seinem Pendant im Textmodus. Unterschiedlich sind die Koordinatenangaben die hier anstelle von Zeichen in Pixeln angegeben werden. Und das Format-Attribut "Grossschrift" entspricht doppelter Zeichenhöhe und -breite. Ausserdem funktioniert der Zeilenumbruch nicht wie man es erwartet, es wird lediglich an den Anfang der nächsten Pixelzeile gesprungen.1.20 FONT nIn den Grafikmodi 1...3 und 5 ist zusätzlich zum Standard-Font mit 6x10 Pixeln ein kleinerer Font mit 4x6 Pixeln verfügbar. Umgeschaltet wird mit FONT 0 für den Standard Font und FONT 1 für den Mini-Font.2 SpritesSprites sind einzelne Zeichen oder einfache Zeichengruppen, die sich einfach an beliebiger Stelle auf dem Bildschirm anzeigen lassen. Dabei wird der ursprüngliche Bildschirminhalt an dieser Stelle "gemerkt" und beim Verschieben oder Löschen des Sprites wieder restauriert. In der aktuellen Version können (theoretisch) bis zu 85 Sprites definiert werden, die tatsächliche Anzahl hängt von der Größe und dem verfügbaren Platz im Array ab. Sprites funktionieren nur im Textmodus und nicht in den Grafikmodi.2.1 Sprite definierenDafür gibt es keinen eigenständigen Befehl (mehr), da die Daten einfach im Array liegen (Byte-Bereich). Jedes Sprite besteht aus einem Header von 5 Bytes, den eigentlichen Daten und dem Backup-Bereich. Die Belegung der Bytes ist wie folgt:
Ist das Kollisionsflag mit 0 vorbelegt, wird das Sprite bei einer Kollision nicht gezeichnet. Ist es mit 2 vorbelegt, wird das Sprite bei einer Kollision gezeichnet. Danach folgen dx*dy Bytes für die darzustellenden Zeichen, gefolgt von dx*dy Bytes für die Attribute. Die Attribut-Bytes sind Vordergrundfarbe + 16 * Hintergrundfarbe, bei Addition von 128 bleibt beim Zeichnen die ursprüngliche Hintergrundfarbe erhalten. Danach folgen noch 2*dx*dy Bytes in denen der ursprüngliche Bildschirminhalt beim Zeichnen automatisch gespeichert wird. Ein minimales Sprite (1 Zeichen) braucht also 5+4=9 Bytes, eins mit 2x2 Zeichen schon 5+16=21 Bytes. Die Werte für die X und Y Koordinaten sollten ausserhalb des Bildschirmbereiches liegen, da ansonsten beim erstmaligen Aufrufen des Sprites der Backup-Bereich des Sprites dorthin kopiert wird. 2.2 SPRITE n,y,x [SPR]Zeichnet das Sprite von Array-Adresse n an die Position Y,X. War es bereits an einer anderen Stelle gezeichnet, wird es vorher gelöscht. Befindet sich an der Stelle wohin das Sprite gezeichnet wird bereits ein anderes Zeichen, dessen Position in der Zeichentabelle nicht ein Vielfaches von 16 ist, wird das Kollisionsflag gesetzt. Ist Bit 1 des Kollisionsflags nicht gesetzt, wird das Sprite nicht gezeichnet. Das Kollisionsflag wird nicht automatisch zurückgesetzt. Sprites dürfen nicht über den Bildschirmrand hinaus gezeichnet werden, sonst wird mit einer Fehlermeldung abgebrochen. Werden für X und oder Y Koordinaten ausserhalb des Bildschirms (X>29, Y>22) angegeben, wird das Sprite vom Bildschirm verschwinden.
Im Anschluß hüpft das Sternchen hin und her, bis es auf das Hindernis trifft. Dieses bleibt stehen, das Sternchen ist "weg". Wird die erste Zeile abgeändert in:
3 Audio3.1 NOTE n [NO]Ein Ton mit der Tonhöhe n (Halbtonschritte ab 220 Hz aufwärts) wird ausgegeben. Bei n=0 bis 62 werden Noten in einer "dunklen" Klangfarbe ausgegeben, bei n=64 bis 126 Noten mit einer "hellen" Klangfarbe. Bei n=63 und n=127 wird keine Note sondern Rauschen ausgegeben. Wird 128 zum Notenwert addiert, wird der Ton mit einer langsameren Hüllkurve ausgegeben.
3.2 NOTE n,v [NO]Beim NOTE Befehl kann als zweiter Parameter die Lautstärke im Bereich von 0...15 angegeben werden. Der angegebene Lautstärkewert gilt dann nur für diese eine Note.3.3 VOL nDieser Befehl dient zum steuern der Lautstärke, möglich sind Werte zwischen 0 und 15. Bei einem Wert von 0 wird die Tonausgabe nicht vollständig abgeschaltet, sollte aber kaum hörbar sein. Bei einem Wert von 15 wird die maximale Lautstärke erreicht. Der eingestellte Lautstärkewert gilt für Noten und für den Sequenzer, solange dort die Lautstärke nicht für die einzelnen Noten explizit vorgegeben wird.3.4 PLAY start,stop,speed,loopsAVR-Chipbasic2 hat einen einfachen Sequenzer eingebaut. Dieser benutzt das Array als Notenspeicher und läuft im Hintergrund. Als Parameter werden die Nummer der Arrayzelle (Byte-bereich) mit der ersten zu spielenden Note, die Anzahl der zu spielenden Noten sowie die die Anzahl der Halbbilder (1/50s bei PAL, 1/60s bei NTSC) für einen "Tick" Die Noten zwischen Start- und End Array-Zelle werden zyklisch abgespielt, die Anzahl der Zyklen wird mit dem Wert von loops (Byte-Variable) bestimmt. Wenn dieser Wert größer als 127 ist wird der Zyklenzähler nicht nach jedem Durchlauf um 1 verringert, damit werden die Noten in einer Endlosschleife abgespielt. Jede Note besteht aus 2 Bytes im Array, im ersten Byte steht der Notenwert entsprechend dem NOTE-Befehl, im zweiten Byte die Anzahl der Ticks bis zur nächsten Note im unteren Nibble und die Lautstärke im oberen Nibble. Ist das obere Nibble 0, wird die aktuelle Lautstärke beibehalten.Das folgende Beispiel spielt fortlaufend 3 Töne auf und ab...
3.5 PSTAT(mode)Diese Funktion liefert Aufschluss darüber, was der Sequenzer gerade "macht". Ist der Byte-Parameter mode<255, dann wird der Zyklenzähler auf den Wert von mode gesetzt, mode=255 liefert nur den aktuellen Zyklenzähler zurück.
created with latex2web.pl v0.63 © 2006-2013 Joerg Wolfram |