Turtlegrafik ist ein einfaches Zeichenprinzip, bei dem eine virtuelle sogenannte "Schildkröte" (Turtle / Zeichenstift) sich über eine Fläche bewegt und dabei Linien und Formen (hier Rechteck und Kreis) zeichnen kann. Hierbei zeichnet die Turtle ausgehend von der aktuellen Position das vorgegebene Zeichenkommando und setzt bei Linienkommandos eine neue aktuelle Zeichenposition (von der aus dann ein nachfolgendes Zeichenkommando ausgeht). Eine Ausnahme hiervon ist ein Zeichenkommando für Rechteck und Kreis (egal ob gefüllt oder ungefüllt), bei der die aktuelle Position der Turtle beibehalten wird. Werden nach diesem Prinzip Grafiken dargstellt, so ist dies im Vergleich zu Bitmap basierender Anzeige extrem speichersparend und kann immer dann eingesetzt werden, wenn Flashspeicher bereits knapp ist. Auf diesem Turtleprinzip basierend wurde ein einfacher Interpreter mit proprietären Turtlekommandos geschrieben, der in einem Mikrocontroller ausgeführt wird. Grundsätzlich sollte der Interpreter auf jedem Mikrocontroller funktionsfähig sein, der zum einen ein angeschaltetes Farbdisplay, zum anderen eine Funktion "putpixel" bereitstellt, über das der Interpreter seine Ausgaben tätigt. Jede Zeichnung wird durch eine Folge von Kommandos im Textformat (C-Stringarray) beschrieben. Der Interpreter ist sehr speicherplatzsparend, auf einem CH32V003 mit CH32FUN-Framework und riscv-none-elf-gcc Version 14.2 beträgt der Speicherbedarf 1910 Byte (bei AVR-Mikrocontrollern etwas mehr). Kommandozeichen des Interpreters -------------------------------------------------------------------------------------------------- P x,y bewegt den Zeichenstift auf eine absolute Koordinatenposition ohne etwas zu zeichnen p x,y zeichnet eine Linie zur angegebenen absoluten Koordinatenposition M x,y bewegt den Zeichenstift auf eine relative Koordinatenposition ohne etwas zu zeicnen m x,y zeichnet eine Linie zur angegebenen relative Koordinatenposition r x zeichnet eine Linie nach rechts mit in x angegebener Anzahl Pixel l x zeichnet eine Linie nach links mit in x angegebener Anzahl Pixel u y zeichnet eine Linie nach oben mit in y angegebener Anzahl Pixel d y zeichnet eine Linie nach unten mit in y angegebener Anzahl Pixel k r zeichnet einen Kreis mit einem in r angegebenen Radius K r zeichnet einen ausgefüllten Kreis mit einem in r angegebenen Radius t b,h zeichnet ein Rechteck von der aktuellen Zeichenposition mit angegebener Pixelbreite b und Pixelhöhe h T b,h zeichnet ein ausgefülltes Rechteck von der aktuellen Zeichenposition mit angegebener Pixelbreite b und Pixelhöhe h c col setzt die Zeichenfarbe mit der Farbe col aus der EGA-Farbenpalette. Für col sind Werte von 0..15 zulässig. C r,g,b setzt die Zeichenfarbe mit einem RGB-Farbwert Der zur Ausgabe einer Turtlegrafik benötigte Putpixel-Prototyp, der vom Programm in den der Turtleinterpreter eingebettet wird, lautet: void putpixel(int x, int y, uint16_t color); x,y bezeichnet die Bildschirmkoordinate an der ein Pixel ausgegeben wird. 0,0 bezeichnet die linke obere Ecke color bezeichnet einen 16-Bit Farbwert im Format RGB565, mit dem ein Pixel gezeichnet wird Um eine Turtlegrafik anzuzeigen, bedarf es den Aufruf einer einzelnen Funktion, der als Argument ein Zeiger auf einen String mit gültigen Anweisungen für den Interpreter hat: void cmd_parse(const char *str); Beispiel: Zeichne ab absoluter Koordinate 50,30 ein Rechteck mit der RGB-Farbe rot= 255, grün= 128, blau= 20 und einer Breite von 60 Pixel mit einer Höhe von 40 Pixel. Auch wenn ein Rechteck mit Anweisung r 60,40 gezeichnet werden könnte werden hier die Kommandos für r, l, u, d verwendet um die Anwendung des Interpreters zu zeigen Code für Controller mit linearem Adressraum (nicht AVR): static const char rechteck[] = "P50,30 C255,128,20 r60 d40 l60 u40"; cmd_parse(&rechteck[0]); Obiger Code ist zwar auch auf einem AVR-Mikrocontroller ausführbar wenn die Source für NICHT-AVR verwendet wird, hat aber den Nachteil, dass trotz der Angabe von static const eine Kopie des Strings im RAM abgelegt wird. Aus diesem Grund soll die Source für AVR-Controller verwendet werden (die einem in progmem abgelegten String erwartet): static const char rechteck[] PROGMEM = "P50,30 C255,128,20 r60 d40 l60 u40"; cmd_parse(&rechteck[0]);