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 Grafik



1.1 Pseudografik im Textmodus

Fü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 1

Die 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 2

Die Pixelauflösung beträgt 120x76 Pixel, jedes Pixel kann eine aus 4 über die Palette einstellbaren Farben annehmen.

1.4 Videomode 3

Die Pixelauflösung beträgt 84x58 Pixel, jedes Pixel kann eine aus 16 über die Palette einstellbaren Farben annehmen.

1.5 Videomode 5

Die 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.


Mode Auflösung X Auflösung Y Darstellbare Farben
0 Text 30 Text 23 16 Vordergrund und 16 Hintergrund
1 168 116 2 aus 16
2 120 76 4 aus 16
3 84 58 16 aus 16
4 (User Symbole) 30 (User Symbole) 23 16 Vordergrund und 16 Hintergrund
5 128 64 2 aus 16
6 (User Symbole) 30 (User Symbole) 23 16 für jedes Pixel
7 Text 30 Text 2 16 Vordergrund und 16 Hintergrund


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:


Index Modus 1 Modus 2 Modus 3
0 schwarz (0) schwarz (0) schwarz (0)
1 weiss (7) rot (2) blau (1)
2 --- cyan (5) rot (2)
3 --- hellgrau (7) magenta (3)
4 --- --- grün (4)
5 --- --- cyan (5)
6 --- --- gelb (6)
7 --- --- hellgrau (7)
8 --- --- dunkelgrau (8)
9 --- --- hellblau (9)
10 --- --- hellrot (10)
11 --- --- hellmagenta (11)
12 --- --- hellgrün (12)
13 --- --- hellcyan (13)
14 --- --- hellgelb (14)
15 --- --- weiss (15)




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.
01 CLS:VMODE 1
02 FOR X=1 TO 167
03 V=SIN(3*X)/6
04 PLOT 55-V,X
05 NEXT
#
Zeichnet eine Sinuskurve (Videomode 1). Da nur einzelne Punkte gesetzt werden, ist die Linie nicht durchgängig.

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.
01 CLS:VMODE 1,PLOT 55,0
02 FOR X=1 TO 167
03 V=SIN(3*X)/6
04 DRAWTO 55-V,X
05 NEXT
#
Zeichnet eine Sinuskurve (Videomode 1). Da diesmal anstelle einzelner Punkte kurze Linienstücke gezeichnet werden, ist die Linie durchgängig. Der Plot-befehl in der ersten Zeile setzt die Anfangs-Koordinate für das erste Linienstück, fehlt sie, wird mit dem Zeichnen bei 0,0 begonnen.

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.
01 CLS:VMODE 1,PLOT 55,0
02 FOR X=1 TO 167
03 V=SIN(3*X)/6
04 DRAWTO 55-V,X
05 NEXT
06 DRAW 55,0,55,167
#
Hier wird die Null-Linie durch die gerade gezeichnete Sinuskurve gezogen.

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.
11 BOX 0,0,115,167


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.
10 FBOX 0,0,0,100
zeichnet eine waagerechte Linie am oberen Bildschirmrand, der Wert 100 wird zur Laufzeit auf den Bildschirmbereich begrenzt, falls er auuserhalb des Bildschirms liegt.

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.
10 CIRCLE 50,50,20,20
Zeichnet einen Kreis mit den Mittelpunktkoordinaten 50,50 und dem Radius 20.

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.
10 FC 50,50,20,10
Zeichnet eine gefüllte Ellipse mit den Mittelpunktskoordinaten 50,50, dem Y-Radius 10 und dem X-Radius 20.

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.
01 VM 1
02 ARC 50,50,20,20,0,270
Zeichnet ein Dreiviertel-Kreissegment mit den Mittelpunktkoordinaten 50,50 und dem Radius 20

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.
01 VM 1
02 ARC 50,50,20,20,0,270,6
Zeichnet ein geschlossenes gelbes Dreiviertel-Kreissegment mit den Mittelpunktkoordinaten 50,50 und dem Radius 20

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.
10 GPIX P,0,0
Bestimmt den Palettenindex des Pixels in der oberen linken Ecke.

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.


Videomode Pixel je Teilblock
1 8x8
2 4x4
3 2x2


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.


Modus Quelle Ziel zus.Parameter
1 Bildspeicher Bildspeicher Y1,X1,DY,DX,Y2,X2
2 Bildspeicher Array Y,X,DY,DX,ARRAYPOS
3 ARRAY Bildspeicher ARRAYPOS,Y,X


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:


Videomode 1 (8 * DX * DY) +2
Videomode 2 (4 * DX * DY) +2
Videomode 3 (2 * DX * DY) +2


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.
01 DATA 0,1,1,$FF,$81,$81,$81
02 DATA 6,$81,$81,$81,$FF
03 VMODE 1
04 BCOPY 3,0,0,0 
05 WAIT 10
Das Programm zeichnet ein kleines Quadrat in die obere linke Bildschirmecke. Zuerst wird das Array gefüllt. In den beiden ersten Bytes stehen die Anzahl der Teilblöcke in Y und X-Richtung, danach folgen die Pixeldaten.
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.


Modus Quelle Ziel zus.Parameter
4 Bildspeicher Bildspeicher Quelladresse, Zieladresse, Anzahl der Bytes
5 Bildspeicher Array Quelladresse, Zieladresse, Anzahl der Bytes
6 ARRAY Bildspeicher Quelladresse, Zieladresse, Anzahl der Bytes


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 n

In 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 Sprites

Sprites 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 definieren

Dafü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:


Header-Byte Adresse Funktion
1 N das Kollisionsflag (0/2)
2 N+1 Y-Position (am Anfang $ff oder -1)
3 N+2 X-Position (am Anfang $ff oder -1)
4 N+3 Y-Ausdehnung in Zeichen (dy)
5 N+4 X-Ausdehnung in Zeichen (dx)


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.
01 DA 0,0,-1,-1,1,1,"*",$86
02 ?@10,10;"#"
03 X=RND(29): Y=RND(22)
04 SPRITE 0,Y,X
05 IF (AR(0)
05 WAIT 1
06 GOTO 2
Zuerst werden die Sprite-Daten in das Array geschrieben (in diesem fall ein gelbes Sternchen), dann wird noch ein Hindernis an Position (10,10) gezeichnet.
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:
01 DA 0,2,-1,-1,1,1,"*",$86
Dann bleibt das Sternchen stehen und das Hinedrnis ist nicht mehr zu sehen.

3 Audio



3.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.
01 FOR N=0 to 255:NOTE N
02 WAIT 5:NEXT
gibt nacheinander alle spielbaren Noten aus. Die folgende Tabelle ist eine Übersicht über die verschiedenen Möglichkeiten:


Wert Bedeutung
0...62 Noten in einer "dunklen" Klangfarbe mit schneller Hüllkurve
63 Rauschen mit schneller Hüllkurve
64...126 Noten in einer "hellen" Klangfarbe mit schneller Hüllkurve
127 Rauschen mit schneller Hüllkurve
128...190 Noten in einer "dunklen" Klangfarbe mit langsamer Hüllkurve
191 Rauschen mit langsamer Hüllkurve
192...254 Noten in einer "hellen" Klangfarbe mit langsamer Hüllkurve
255 Rauschen mit langsamer Hüllkurve


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 n

Dieser 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,loops

AVR-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...
01 DA 0,39,8,44,4,49,8,44,4
02 PLAY 0,4,10,128
03 GOTO 3
Wird die letzte Zeile weggelassen hört man nichts oder maximal einen einzigen Ton, da beim Programmende der Sequenzer sofort wieder gestoppt wird. Dieser Befehl sollte nur dann verwendet werden, wenn sich auch gültige Notenwerte im Array befinden.

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.


Wert Bedeutung
0 Sequenzer ist gestoppt
1 Sequenzer läuft noch bis zum Ende des aktuellen Zyklus und wird dann stoppen
2...127 Sequenzer läuft, Noten werden gespielt, nach jedem Zyklus wird der Zyklenzähler um 1 verringert
128...255 Sequenzer läuft, Noten werden gespielt, Zyklenzähler ändert sich nicht




created with latex2web.pl v0.63 © 2006-2013 Joerg Wolfram