Plotter-Basic
Plotter-Basic ist eine Basic-Befehlserweiterung für den Printer/Plotter 1520 von Commodore. Es ermöglicht eine starke Vereinfachung der normalen Plotterbedienungen und erlaubt zusätzlich zum Beispiel räumliche Zeichnungen zu erstellen und beliebig zu drehen.
Außerdem verfügt es über die Möglichkeit Kreise beziehungsweise Ellipsen zu zeichnen, Blockdiagramme zu erstellen oder komfortable Funktionen-Plot-Programme zu schreiben.
Die Befehlserweiterung funktioniert nach dem Prinzip, daß jedes Befehlswort auf einen vorangestellten Punkt untersucht wird, der einen Plotter-Basic-Befehl kennzeichnet, zum Beispiel .RESET.
Nach dem Start mit SYS 12*4096 initialisiert sich das Programm (Listing 1) und gibt eine Einschaltmeldung aus. Die Initialisierung besteht darin, daß auf eventuelle andere Spracherweiterungen Rücksicht genommen wird und die Zeiger so verändert werden, daß die andere Erweiterung funktionstüchtig bleibt. Voraussetzung dafür ist natürlich, daß der Speicherbereich, den Plotter-Basic benötigt, nicht von fremden Programmen gebraucht wird. Es handelt sich hierbei um den Bereich $C000 bis $C8F5 beziehungsweise 49187 bis 51445.
Die Zeiger, die verändert werden mußten, sind die Vektoren $308/$309 und $300/$301 (Warmstart-Vektor). Normalerweise zeigt der Vektor $308/$309 auf die Routine $A7E4 (Basic-Befehlsadresse holen). Nach der Initialisierung zeigt er nun auf eine Routine, die auf einen vorangestellten Punkt testet und den gegebenenfalls erkannten Befehl ausführt.
Die Veränderung des Warmstartvektors ermöglichte es bei dem Befehl .PROG, der das Programmlisting zum Drucker schickt, die READY-Meldung wieder auf dem Bildschirm auszugeben und den Druckkanal ordnungsgemäß zu schließen. Außerdem besteht durch Veränderung dieses Zeigers die Möglichkeit, Fehlermeldungen zu unterdrücken beziehungsweise zu kontrollieren, ohne den Programmablauf abbrechen zu lassen.
Befehlsbeschreibung:
Die allgemeine Syntax der Befehle sieht folgendermaßen aus:
a) .BEFEHLSWORT keine Parameter erforderlich
oder
b) .BEFEHLSWORT,Parameter1,Parameter2,…,Parameter n
Sieht der Befehl also eine Parameterübergabe vor, so müssen diese vom Befehlswort durch Kommata getrennt werden. Die Parameter können sowohl Variablen als auch Zahlen sein. Ausnahmen sind bei den entsprechenden Beschreibungen erklärt.
Grundsätzlich muß jedem Plotter-Basic-Befehlswort ein Punkt vorangestellt werden. Mehrere Befehle in einer Zeile müssen durch einen Doppelpunkt voneinander getrennt sein.
Beispiel: .BLAU:.SUPER
Eine Besonderheit sei hier noch erwähnt. die ihre Ursache darin hat, daß die neuen Befehlsworte nicht als Tokens codiert wurden. Die neuen Befehle werden im Speicher nämlich Buchstabe für Buchstabe abgelegt. Basic-Befehle dagegen besitzen jeweils einen Ein-Byte-Code (Token), in den sie nach der Eingabe umgewandelt werden. Bevor aber nun der Basic-Interpreter die einzelnen Tokens erkennt, wird eine Untersuchung auf Plotter-Basic-Befehle durchgeführt. Diese Methode hat ihre Schwachstelle bei einer IF…THEN-Abfrage. Sobald nämlich der Befehl hinter THEN abgearbeitet werden soll, wird nicht mehr zur umgelenkten Interpreterschleife zurückgesprungen, sondern sofort der nächste Befehl als Token interpretiert. Falls dieser Befehl aber aus Plotter-Basic stammt, kommt es zu einem Syntax-Error. Dieses Problem läßt sich jedoch lösen, indem man dem THEN einen Doppelpunkt folgen läßt.
Beispiel: IF A=99 THEN:.TEXT, "neunundneunzig"
Möchte man Plotter-Basic mit einer anderen Spracherweiterung gleichzeitig betreiben, so muß Plotter-Basic als letztes geladen werden. Da unter Umständen manche Befehlsworte mit der anderen Sprache identisch sind, kann es zu Fehlermeldungen kommen, die man dadurch unterdrückt, daß man nur die ersten Buchstaben des Plotter-Basic-Befehls eingibt. Es wird dann der Befehl ausgeführt, der die entsprechenden Anfangsbuchstaben besitzt und als erstes im Speicher steht. Bei den meisten Befehlen reicht es, nur die beiden ersten Buchstaben zur Identifizierung anzugeben.
Beispiel: | .RO | = | .ROT |
.PR,10 | = | .PROG,10 |
Die Parameter können also auch schon nach zwei Buchstaben folgen. Die Reihenfolge, in der die Befehlsworte im Speicher abgelegt sind, und ihre Startadressen sind am Ende der Beschreibung aufgeführt. Dadurch ist es möglich, die Befehle über SYS-Aufrufe ausführen zu lassen.
Nun aber zur Erklärung der Befehle im Einzelnen:
1. Farbwahl
.BLAU | } | stellt die entsprechende Farbe ein |
.ROT | ||
.GRÜN | ||
.SCHWARZ | ||
.FARBE,f wählt die Zeichenfarbe gemäß f. |
Der Parameter f entspricht der Farbnummer, wie es in der Plotter-Anleitung erklärt ist.
2. Wahl der Zeichengröße
.KLEIN entspricht 80 Zeichen/Zeile
.MITTEL entspricht 40 Zeichen/Zeile
GROSS entspricht 20 Zeichen/Zeile
.SUPER entspricht 10 Zeichen/Zeile
.SIZE,g wählt die Zeichengröße gemäß g.
3. Ausdruck von ASCII-Daten
.TEXT,a$ druckt den String a$
TEXT erzeugt eine Leerzeile (Carriage Return)
.PROG
.PROG,10
.PROG,40-
.PROG,100-556
Dieser Befehl entspricht dem LIST-Befehl in Basic. Ohne Parameter wird das gesamte Programm gelistet, mit Parametern wird entsprechend eine Zeile oder mehrere Zeilen ausgedruckt.
4. Wahl der Schriftarten
.GG stellt den Groß/Grafik-Modus ein.
.GK stellt den Groß/Klein-Modus ein.
5. Zeichendrehung
.DREH,r stellt für r=0 den Horizontalbetrieb ein und verursacht bei r=1 eine Zeichendrehung um 90 Grad nach rechts.
6. Druckerrückstellung und Speicherlöschung
.RESET setzt den Printer/Plotter zurück und löscht seinen Speicher.
7. Wahl der Linienart
.STRICH,I bestimmt die Linienart. Für I gelten die Angaben der Plotteranleitung.
8. Zeichnen von X/Y-Daten
.HOME | bewegt zum Startpunkt (0/0). |
.INIT | legt den relativen Nullpunkt auf die derzeitige X/Y-Position. |
.MOVE,x,y | bewegt zur Position (x/y) relativ zum absoluten Nullpunkt (0/0). |
.DRAW,x,y | zeichnet zur Position (x/y) relativ zum absoluten Nullpunkt (0/0). |
.RMOVE,x,y | bewegt zur Position (x/y) relativ zum relativen Nullpunkt (x0/y0). |
.RDRAW,x,y | zeichnet zur Position (x/y) relativ zum relativen Nullpunkt (x0/y0). |
.LINIE,x1,y1,x2,y2 | zeichnet eine Linie von Position (x1/y1) zu Position (x2/y2). |
.RAHMEN,x,y,b,h | zeichnet einen Rahmen ab dem Eckpunkt (x/y) mit der Breite b und der Höhe h. |
.KREIS,x,y,xr,yr | zeichnet eine Ellipse um den Mittelpunkt (x/y) mit einem Radius in x-Richtung von xr und einem Radius in y-Richtung von yr. Gilt xr=yr so entsteht ein Kreis. |
.RADIUS,x,y,xr,yr,w | zeichnet in die entsprechende Ellipse einen Radius, der mit der positiven X-Achse den Winkel w (in Grad!) bildet. |
Erklärung zum KREIS- und RADIUS-Befehl:

9. Zeichnen von X/Y/Z-Daten
Die folgenden Befehle dienen dazu, dreidimensionale Grafiken zu erzeugen. Im wesentlichen transformieren sie drei Raumkoordinaten auf zwei Ebenenkoordinaten. Allen Berechnungen liegen diese Formeln zugrunde:
x=f*[xr+yr*cos(w)]+xv
y=f*[zr+yr*sin(w)]+yv
yr und zr sind Raumkoordinaten, w ist der Betrachtungswinkel des Punktes in Grad, und f stellt einen Vergrößerungs- (für f größer als 1) beziehungsweise Verkleinerungsfaktor (für f zwischen 0 und 1) dar.
xv und yv dienen dazu, den Punkt im zweidimensionalen Koordinatensystem zu verschieben.
Die Achsen des räumlichen Koordinatensystems sind entsprechend der Abbildung bezeichnet:

.TRANSM,xr,yr,zr,xv,yv,f,w bewegt zur Position (x/y) relativ zum absoluten Nullpunkt, die sich durch Einsetzen aller Parameter in die obige Formel ergibt.
.TRANSD,xr,yr,zr,xv,yv,f,w zeichnet zur entsprechenden Position (x/y) relativ zum absoluten Nullpunkt.
.TRANSL,xr1,yr1,zr1,xv,yv,f,w,xr2,yr2,zr2 zieht eine Linie von (x1/y1) nach (x2/y2) entsprechend den Parametern.
Möchte man also beispielsweise das räumliche Koordinatensystem zeichnen, so wählt man als Ursprung der drei Achsen den Nullpunkt, also xr1 =yr1 =zr1=0. Je nachdem, welche Achse gezeichnet werden soll, setzt man für die xr-Achse xr2=1, yr2=0, zr2=0, für die yr-Achse dann xr2=0, yr2 = 1, zr2=0 und für die zr-Achse xr2=0, yr2=0 und zr2 = 1. Um das Bild in die Mitte des Papiers zu bringen, setzt man die x-Verschiebung xv=240 und die y-Verschiebung yv=0. Da als Länge für die Achsen »eins« zu klein ist, könnte man den Faktor f=50 wählen. Der Betrachtungswinkel sei w=45 (Grad). Somit ergibt sich für die Zeichnung des Koordinatensystems:
10 .TRANSL,0,0,0,240,0,50,45,1,0,0:REM xr-Achse
20 .TRANSL,0,0,0,240,0,50,45,0,1,0:REM yr-Achse
30 .TRANSL,0,0,0,240,0,50,45,0,0,1:REM zr-Achse
10. Drehung von x/y/z-Koordinaten
Um einen Körper von allen Seiten darstellen zu können, müssen die Raumkoordinaten gedreht werden. Dabei ist es natürlich möglich, um jede beliebige Raumachse und um jeden beliebigen Winkel zu drehen. Macht man sich eine solche Drehung am Koordinatensystem deutlich, so bemerkt man, daß sich jeweils die Komponente nicht verändert, um deren Achse gedreht werden soll. Bei einer Drehung um die xr-Achse verändern sich nur die yr- und die zr-Komponente, bei einer Drehung um die yr-Achse verändern sich nur xr und zr etc.
Der Befehl .TURN,k1,k2,w benötigt daher außer der Angabe des Drehwinkels w in Grad nur die zwei Komponenten k1 und k2. Hierbei muß es sich um Variablen handeln! Vor dem Befehlsaufruf befinden sich in den Variablen die räumlichen Koordinaten eines Punktes und nach der Befehlsausführung stehen in den Variablen die Koordinaten des neuen (gedrehten) Punktes.
Angenommen, in den Variablen xr, yr und zr befinden sich die Koordinaten eines Punktes, so könnte man ihn folgendermaßen um den Winkel w drehen:
Drehung um die xr-Achse | .TURN,yr,zr,w |
Drehung um die yr-Achse | .TURN,xr,zr,w |
Drehung um die zr-Achse | .TURN,xr,yr,w |
Anhand der Formeln zur Drehung läßt sich erkennen, warum der Befehl für alle drei Drehrichtungen richtige Ergebnisse liefert:
Drehung um die xr-Achse:
xr'=xr | yr'=yr*cos(w)+zr*sin(w) zr'=-yr*sin(w)+zr*cos(w) |
Drehung um die yr-Achse:
yr'=yr | xr'=xr*cos(w)+zr*sin(w) zr'=-xr*sin(w)+zr*cos(w) |
Drehung um die zr-Achse:
zr'=zr | xr'=xr*cos(w)+yr*sin(w) yr'=-xr*sin(w)+yr*cos(w) |
Ein kleines Beispielprogramm (Listing 2) demonstriert die Möglichkeiten dieses und des TRANSL-Befehls anhand der Drehung eines Körpers.
11. Fehlerbehandlung
Um zum Beispiel ein Programm zu schreiben, das jede beliebige Funktion plottet, ist es erforderlich, mathematische Fehlermeldungen zu unterdrücken. Sobald nämlich eine Funktion Definitionslücken besitzt, steigen die meisten Programme mit einem »division by zero« oder ähnlichem aus.
Der Befehl .ERRJUMP,ze setzt die Programmausführung in der Zeile ze fort, sobald ein arithmetischer Fehler aufgetreten ist. Es handelt sich hierbei um die Fehler division by zero, illegal quantity und overflow. Sollte innerhalb einer FOR-NEXT-Schleife oder in einem Unterprogramm ein Fehler auftreten, so kann nicht wieder zu NEXT beziehungsweise RETURN gesprungen werden, da nun die notwendige Rücksprungadresse nicht mehr gefunden wird. FOR-NEXT-Schleifen und Unterprogrammsprünge lassen sich in solchen Fällen jedoch auch mit GOTO programmieren.
Der Befehl ist nur während des Programmablaufs wirksam, um zu verhindern, daß bei Fehlern im Direkt-Modus das Programm neu gestartet wird.
Sollen grundsätzlich alle Fehler unterdrückt werden, so muß hinter der Zeilennummer noch eine Sekundärvariable folgen:
.ERRJUMP,ze,s setzt die Programmausführung in der Zeile ze fort, sobald irgendein Fehler auftritt. Die Variable s ist nur eine Scheinvariable, das heißt sie wird weder verändert noch spielt ihr Typ eine Rolle. Am einfachsten ist es hier, eine Zahl anzugeben.
.ERRNUM,x schreibt in die Variable x die Fehlernummer des zuletzt aufgetretenen Fehlers. Bei x muß es sich um eine Variable handeln! Die Fehlernummer ist nur einmal lesbar und wird danach wieder auf Null gesetzt, bis der nächste Fehler auftritt. Innerhalb der Variablen bleibt die Fehlernummer natürlich erhalten. Die Fehlermeldungen besitzen folgende Nummern:
1 too many files | 2 file open |
3 file not open | 4 file not found |
5 device not present | 6 not input file |
7 missing filename | 8 missing filename |
9 illegal dev. number | 10 next without for |
11 syntax | 12 return without gosub |
13 out of data | 14 illegal quantity |
15 overflow | 16 out of memory |
17 undef’d statement | 18 bad subscript |
19 redim’d array | 20 division by zero |
21 illegal direct error | 22 type mismatch |
23 string too long | 24 file data |
25 form, too complex | 26 can’t continue |
27 undef’d function | 28 verify |
29 load |
.ERROUT schaltet innerhalb des Programms die Fehlerunterdrückung wieder aus. Dieser Befehl wird zum Beispiel dann nötig, wenn am Ende des Programms ein Listing ausgedruckt werden soll, da beide Befehle den Warmstartvektor ändern. Grundsätzlich wird die Fehlerunterdrückung mit Ende des Programms abgeschaltet.
12. Ausschalten von Plotter-Basic
.AUS setzt alle Zeiger wieder so, wie sie vor dem Start von Plotter-Basic standen und schaltet somit die Spracherweiterung ab. Erneutes Einschalten geschieht mit SYS 12*4096.
Die Befehlsadressen im Speicher
Um sämtliche Zeiger unverändert zu lassen, kann man Plotter-Basic auch ohne Startaufruf benutzen. Nach dem Laden lassen sich alle Befehle über SYS-Aufrufe ausführen. Zum Beispiel: .KREIS,240,0,80,50 entspricht SYS 50184, 240,0,80,50
Parameter werden wie gewöhnlich durch das Komma getrennt.
Die Reihenfolge entspricht der Reihenfolge, in der die Befehlsworte erkannt werden. .KREIS wird also schneller erkannt als .FARBE.
INIT | = | 49916 | = | RADIUS | = | 50644 |
SIZE | = | 49783 | = | ERROUT | = | 51290 |
MOVE | = | 49926 | = | TRANSM | = | 50729 |
DREH | = | 49833 | = | ERRNUM | = | 51379 |
DRAW | = | 49974 | = | TRANSD | = | 50751 |
STRICH | = | 49888 | = | AUS | = | 49157 |
RMOVE | = | 49987 | = | TRANSL | = | 50764 |
GG | = | 49807 | = | TURN | = | 51091 |
RDRAW | = | 50000 | = | BLAU | = | 49695 |
GK | = | 49815 | = | ROT | = | 49703 |
HOME | = | 49906 | = | GRUEN | = | 49711 |
PROG | = | 50413 | = | SCHWARZ | = | 49719 |
RAHMEN | = | 50471 | = | FARBE | = | 49727 |
TEXT | = | 49851 | = | KLEIN | = | 49751 |
LINIE | = | 50013 | = | MITTEL | = | 49759 |
RESET | = | 49823 | = | GROSS | = | 49767 |
KREIS | = | 50184 | = | SUPER | = | 49775 |
ERRJUMP | = | 51233 |
PROGRAMM : PL-BASIC C000 C8D7 ----------------------------------- C000 : EA 20 64 C3 60 AD FA C3 73 C008 : 8D 00 03 AD FB C3 8D 01 22 C010 : 03 AD 38 C0 8D 08 03 AD 90 C018 : 39 C0 8D 09 03 A9 EA 8D 7A C020 : 00 C0 60 20 73 00 C9 2E 57 C028 : F0 10 38 A5 7A E9 01 85 E9 C030 : 7A A5 7B E9 00 85 7B 4C 4C C038 : 00 00 A9 D7 85 FB A9 C8 0E C040 : 85 FC A9 B8 85 FD A9 C0 35 C048 : 85 FE 20 73 00 20 56 C0 9F C050 : 20 70 C0 4C AE A7 A0 00 0D C058 : 91 FB C8 20 73 00 F0 0B 2E C060 : C9 2C F0 07 C9 3A F0 03 95 C068 : 4C 58 C0 A9 00 91 FB 60 83 C070 : A2 00 A0 00 B1 FB F0 08 09 C078 : D1 FD D0 07 C8 4C 74 C0 9F C080 : 4C 9D C0 E8 E0 23 F0 12 F7 C088 : 18 A9 07 65 FD 85 FD A9 3B C090 : 00 65 FE 85 FE A0 00 4C 41 C098 : 74 C0 4C 08 AF 8A 18 0A 44 C0A0 : 69 AD 85 FB A9 C1 69 00 0F C0A8 : 85 FC A0 00 B1 FB 85 FD E0 C0B0 : C8 B1 FB 85 FE 6C FD 00 4C C0B8 : 49 4E 49 54 20 20 20 4D 23 C0C0 : 4F 56 45 20 20 20 44 52 48 C0C8 : 41 57 20 20 20 52 4D 4F 29 C0D0 : 56 45 20 20 52 44 52 41 E8 C0D8 : 57 20 20 48 4F 4D 45 20 05 C0E0 : 20 20 52 41 48 4D 45 4E 6E C0E8 : 20 4C 49 4E 49 45 20 20 CA C0F0 : 4B 52 45 49 53 20 20 52 3A C0F8 : 41 44 49 55 53 20 54 52 85 C100 : 41 4E 53 4D 20 54 52 41 57 C108 : 4E 53 44 20 54 52 41 4E 8E C110 : 53 4C 20 54 55 52 4E 20 7D C118 : 20 20 42 4C 41 55 20 20 E2 C120 : 20 52 4F 54 20 20 20 20 8C C128 : 47 52 55 45 4E 20 20 53 A3 C130 : 43 48 57 41 52 5A 46 41 29 C138 : 52 42 45 20 20 4B 4C 45 19 C140 : 49 4E 20 20 4D 49 54 54 D6 C148 : 45 4C 20 47 52 4F 53 53 38 C150 : 20 20 53 55 50 45 52 20 B9 C158 : 20 53 49 5A 45 20 20 20 D6 C160 : 44 52 45 48 20 20 20 53 52 C168 : 54 52 49 43 48 20 47 47 D1 C170 : 20 20 20 20 20 47 4B 20 56 C178 : 20 20 20 20 50 52 4F 47 18 C180 : 20 20 20 54 45 58 54 20 EC C188 : 20 20 52 45 53 45 54 20 E7 C190 : 20 45 52 52 4A 55 4D 50 57 C198 : 45 52 52 4F 55 54 20 45 88 C1A0 : 52 52 4E 55 4D 20 41 55 DF C1A8 : 53 20 20 20 20 FC C2 06 18 C1B0 : C3 36 C3 43 C3 50 C3 F2 9B C1B8 : C2 27 C5 5D C3 08 C4 D4 64 C1C0 : C5 29 C6 3F C6 4C C6 93 C4 C1C8 : C7 1F C2 27 C2 2F C2 37 D3 C1D0 : C2 3F C2 57 C2 5F C2 67 CE C1D8 : C2 6F C2 77 C2 A9 C2 E0 38 C1E0 : C2 8F C2 97 C2 ED C4 BB 33 C1E8 : C2 9F C2 21 C8 5A C8 B3 38 C1F0 : C8 05 C0 A0 02 20 01 C2 2A C1F8 : A5 FF 20 D2 FF 20 16 C2 DE C200 : 60 A2 06 A9 63 20 BA FF 8A C208 : A9 00 20 BD FF 20 C0 FF 75 C210 : A2 63 20 C9 FF 60 20 CC C2 C218 : FF A9 63 20 C3 FF 60 A9 DA C220 : 31 85 FF 20 F3 C1 60 A9 3A C228 : 33 85 FF 20 F3 C1 60 A9 44 C230 : 32 85 FF 20 F3 C1 60 A9 4B C238 : 30 85 FF 20 F3 C1 60 20 3E C240 : FD AE A0 02 20 01 C2 20 52 C248 : 9E AD 20 FC C3 20 16 C2 80 C250 : 60 A0 03 20 F5 C1 60 A9 07 C258 : 30 85 FF 20 51 C2 60 A9 4F C260 : 31 85 FF 20 51 C2 60 A9 58 C268 : 32 85 FF 20 51 C2 60 A9 61 C270 : 33 85 FF 20 51 C2 60 20 57 C278 : FD AE A0 03 20 01 C2 20 AA C280 : 9E AD 20 FC C3 20 16 C2 B8 C288 : 60 A0 06 20 F5 C1 60 A9 00 C290 : 30 85 FF 20 89 C2 60 A9 0A C298 : 31 85 FF 20 89 C2 60 A0 01 C2A0 : 07 A9 00 85 FF 20 F5 C1 89 C2A8 : 60 20 FD AE 20 9E AD A0 5C C2B0 : 04 20 01 C2 20 FC C3 20 96 C2B8 : 16 C2 60 A9 2C A0 00 D1 E8 C2C0 : 7A D0 0F 20 73 00 A0 00 24 C2C8 : 20 01 C2 20 A4 AA 20 16 6A C2D0 : C2 60 A0 00 20 01 C2 A9 53 C2D8 : 0D 20 D2 FF 20 16 C2 60 28 C2E0 : 20 FD AE A0 05 20 01 C2 99 C2E8 : 20 9E AD 20 FC C3 20 16 61 C2F0 : C2 60 A0 01 A9 48 85 FF 1E C2F8 : 20 F5 C1 60 A0 01 A9 49 DA C300 : 85 FF 20 F5 C1 60 20 FD E7 C308 : AE A0 01 20 01 C2 A9 4D B2 C310 : 20 D2 FF A9 20 20 D2 FF 1D C318 : 20 9E AD 20 DD BD 20 1E 7F C320 : AB A9 20 20 D2 FF 20 FD 56 C328 : AE 20 9E AD 20 DD BD 20 6C C330 : 1E AB 20 16 C2 60 20 FD 9A C338 : AE A0 01 20 01 C2 A9 44 D0 C340 : 4C 10 C3 20 FD AE A0 01 63 C348 : 20 01 C2 A9 52 4C 10 C3 1E C350 : 20 FD AE A0 01 20 01 C2 C9 C358 : A9 4A 4C 10 C3 20 06 C3 18 C360 : 20 36 C3 60 A2 FF E8 BD E1 C368 : A8 C3 20 D2 FF E0 51 D0 42 C370 : F5 AD 00 03 8D FA C3 AD B7 C378 : 01 03 8D FB C3 18 A9 03 87 C380 : AD 08 03 8D 38 C0 A9 00 D4 C388 : AD 09 03 8D 39 C0 A9 0D 87 C390 : 8D 00 03 A9 C5 8D 01 03 E6 C398 : A9 23 8D 08 03 A9 C0 8D D3 C3A0 : 09 03 A9 60 8D 00 C0 60 3E C3A8 : 93 11 05 20 20 20 2A 2A 09 C3B0 : 2A 2A 20 43 4F 4D 4D 4F 93 C3B8 : 44 4F 52 45 20 31 35 32 A6 C3C0 : 30 20 42 41 53 49 43 20 86 C3C8 : 31 2E 33 20 2A 2A 2A 2A D2 C3D0 : 0D 0D 20 20 20 28 50 29 47 C3D8 : 20 4A 41 4E 2E 31 39 38 F9 C3E0 : 35 20 3D 3A 3D 20 28 43 B8 C3E8 : 29 20 42 59 20 53 2E 53 D9 C3F0 : 43 48 41 45 46 45 52 20 68 C3F8 : 20 0D 00 00 20 DD BD 20 C7 C400 : 1E AB A9 20 20 D2 FF 60 BC C408 : 20 12 C4 20 47 C4 20 6C 5A C410 : C4 60 20 FD AE 20 9E AD 8E C418 : A2 D7 A0 C8 20 D4 BB 20 BF C420 : FD AE 20 9E AD A2 DC A0 F5 C428 : C8 20 D4 BB 20 FD AE 20 9A C430 : 9E AD A2 E1 A0 C8 20 D4 04 C438 : BB 20 FD AE 20 9E AD A2 4B C440 : E6 A0 C8 20 D4 BB 60 A9 AC C448 : D7 A0 C8 20 A2 BB A0 01 32 C450 : 20 01 C2 A9 4D 20 D2 FF F8 C458 : 20 FC C3 A9 DC A0 C8 20 53 C460 : A2 BB 20 FC C3 20 16 C2 A3 C468 : 20 FC C2 60 A9 E1 A0 C8 81 C470 : 20 A2 BB A0 01 20 01 C2 7F C478 : A9 52 20 D2 FF 20 FC C3 29 C480 : A9 30 20 D2 FF 20 16 C2 83 C488 : A9 00 8D F0 C8 8D F1 C8 05 C490 : 8D F2 C8 8D F3 C8 8D F4 20 C498 : C8 4C CA C4 A0 01 20 01 66 C4A0 : C2 20 64 E2 A9 E1 A0 C8 A5 C4A8 : 20 28 BA A9 4A 20 D2 FF B1 C4B0 : 20 FC C3 A9 F0 A0 C8 20 EC C4B8 : A2 BB 20 6B E2 A9 E6 A0 06 C4C0 : C8 20 28 BA 20 FC C3 20 33 C4C8 : 16 C2 A9 6C A0 E3 20 A2 26 C4D0 : BB A9 F0 A0 C8 20 67 B8 4D C4D8 : A2 F0 A0 C8 20 D4 BB A9 1E C4E0 : C9 A0 C5 18 20 5B BC B0 9F C4E8 : B3 20 16 C2 60 A9 2C A0 CE C4F0 : 00 D1 7A D0 03 20 73 00 90 C4F8 : A0 00 20 01 C2 C6 7A A9 60 C500 : 9B A2 63 8E CE C5 20 F7 22 C508 : A7 20 16 C2 60 AD CE C5 D7 C510 : C9 63 F0 03 6C FA C3 A9 28 C518 : 00 8D CE C5 A9 0D 20 D2 74 C520 : FF 20 16 C2 4C 74 A4 20 48 C528 : 12 C4 A0 01 20 01 C2 A9 4D C530 : 4D 20 D2 FF A9 20 20 D2 04 C538 : FF A9 D7 A0 C8 20 A2 BB A5 C540 : 20 FC C3 A9 DC A0 C8 20 3B C548 : A2 BB 20 FC C3 20 16 C2 8B C550 : 20 B9 C5 A9 E1 A0 C8 20 7A C558 : A2 BB 20 FC C3 A9 DC A0 BE C560 : C8 20 A2 BB 20 FC C3 20 92 C568 : 16 C2 20 B9 C5 A9 E1 A0 91 C570 : C8 20 A2 BB 20 FC C3 A9 B5 C578 : E6 A0 C8 20 A2 BB 20 FC 67 C580 : C3 20 16 C2 20 B9 C5 A9 6B C588 : D7 A0 C8 20 A2 BB 20 FC 68 C590 : C3 A9 E6 A0 C8 20 A2 BB 85 C598 : 20 FC C3 20 16 C2 20 B9 97 C5A0 : C5 A9 D7 A0 C8 20 A2 BB D3 C5A8 : 20 FC C3 A9 DC A0 C8 20 A3 C5B0 : A2 BB 20 FC C3 20 16 C2 F3 C5B8 : 60 A0 01 20 01 C2 A9 44 02 C5C0 : 20 D2 FF A9 20 20 D2 FF CD C5C8 : 60 83 55 DC A7 6E 00 7B C0 C5D0 : 0E FA 35 12 20 12 C4 20 D1 C5D8 : FD AE 20 9E AD A9 CF A0 B1 C5E0 : C5 20 28 BA A2 F0 A0 C8 DC C5E8 : 20 D4 BB 20 47 C4 A0 01 84 C5F0 : 20 01 C2 A9 4A 20 D2 FF 68 C5F8 : A9 20 20 D2 FF A9 F0 A0 66 C600 : C8 20 A2 BB 20 64 E2 A9 FC C608 : E1 A0 C8 20 28 BA 20 FC 42 C610 : C3 A9 F0 A0 C8 20 A2 BB 87 C618 : 20 6B E2 A9 E6 A0 C8 20 B2 C620 : 28 BA 20 FC C3 20 16 C2 68 C628 : 60 20 7C C6 A0 01 20 01 25 C630 : C2 A9 4D 20 D2 FF A9 20 32 C638 : 20 D2 FF 20 D8 C6 60 20 4B C640 : 7C C6 A0 01 20 01 C2 A9 D0 C648 : 44 4C 33 C6 20 7C C6 20 99 C650 : 2C C6 20 FD AE 20 9E AD 69 C658 : A2 D7 A0 C8 20 D4 BB 20 FF C660 : FD AE 20 9E AD A2 DC A0 35 C668 : C8 20 D4 BB 20 FD AE 20 DA C670 : 9E AD A2 E1 A0 C8 20 D4 44 C678 : BB 4C 42 C6 20 FD AE 20 B0 C680 : 9E AD A2 D7 A0 C8 20 D4 13 C688 : BB 20 FD AE 20 9E AD A2 9B C690 : DC A0 C8 20 D4 BB 20 FD 9A C698 : AE 20 9E AD A2 E1 A0 C8 01 C6A0 : 20 D4 BB 20 FD AE 20 9E 30 C6A8 : AD A2 E6 A0 C8 20 D4 BB CC C6B0 : 20 FD AE 20 9E AD A2 EB 38 C6B8 : A0 C8 20 D4 BB 20 FD AE 71 C6C0 : 20 9E AD A2 F0 A0 C8 20 66 C6C8 : D4 BB 20 FD AE 20 9E AD 03 C6D0 : A2 F5 A0 C8 20 D4 BB 60 06 C6D8 : A9 F5 A0 C8 20 A2 BB A9 16 C6E0 : CF A0 C5 20 28 BA 20 64 16 C6E8 : E2 A9 DC A0 C8 20 28 BA 8E C6F0 : A9 D7 A0 C8 20 67 B8 A9 39 C6F8 : F0 A0 C8 20 28 BA A9 E6 3B C700 : A0 C8 20 67 B8 20 FC C3 01 C708 : A9 F5 A0 C8 20 A2 BB A9 46 C710 : CF A0 C5 20 28 BA 20 6B 54 C718 : E2 A9 DC A0 C8 20 28 BA BE C720 : A9 E1 A0 C8 20 67 B8 A9 6E C728 : F0 A0 C8 20 28 BA A9 EB 75 C730 : A0 C8 20 67 B8 20 FC C3 31 C738 : 20 16 C2 60 20 FD AE 20 0D C740 : 8B B0 8D E6 C8 8C E7 C8 86 C748 : 20 FD AE 20 8B B0 8D E8 5D C750 : C8 8C E9 C8 20 FD AE 20 DF C758 : 9E AD A2 F5 A0 C8 20 D4 AF C760 : BB 60 A9 F5 A0 C8 20 A2 8A C768 : BB A9 CF A0 C5 20 28 BA 73 C770 : 20 64 E2 A2 EB A0 C8 20 F6 C778 : D4 BB A9 F5 A0 C8 20 A2 69 C780 : BB A9 CF A0 C5 20 28 BA 8B C788 : 20 6B E2 A2 F0 A0 C8 20 E2 C790 : D4 BB 60 20 3C C7 20 62 A5 C798 : C7 AD E6 C8 AC E7 C8 20 76 C7A0 : A2 BB A9 EB A0 C8 20 28 29 C7A8 : BA A2 E1 A0 C8 20 D4 BB 98 C7B0 : AD E8 C8 AC E9 C8 20 A2 44 C7B8 : BB A9 F0 A0 C8 20 28 BA 3C C7C0 : A9 E1 A0 C8 20 67 B8 A2 00 C7C8 : FA A0 C8 20 D4 BB AD E6 F8 C7D0 : C8 AC E7 C8 20 A2 BB 20 47 C7D8 : B4 BF A9 F0 A0 C8 20 28 15 C7E0 : BA A2 E1 A0 C8 20 D4 BB D0 C7E8 : AD E8 C8 AC E9 C8 20 A2 7C C7F0 : BB A9 EB A0 C8 20 28 BA 32 C7F8 : A9 E1 A0 C8 20 67 B8 AD 4E C800 : E8 C8 AC E9 C8 85 49 84 9B C808 : 4A 20 D6 A9 A9 FA A0 C8 D4 C810 : 20 A2 BB AD E6 C8 AC E7 5D C818 : C8 85 49 84 4A 20 D6 A9 DA C820 : 60 20 FD AE 20 8A AD 20 33 C828 : F7 B7 A5 14 A4 15 8D 58 C1 C830 : C8 8C 59 C8 A9 65 8D 00 AA C838 : 03 A9 C8 8D 01 03 A0 00 9E C840 : A9 2C D1 7A D0 0C 20 73 98 C848 : 00 20 9E AD A9 63 8D A6 EF C850 : C8 60 A9 00 8D A6 C8 60 A5 C858 : 00 00 A9 0D A0 C5 8D 00 D3 C860 : 03 8C 01 03 60 C9 81 D0 46 C868 : 0A C0 A3 D0 06 20 5A C8 32 C870 : 4C 91 C8 AD A6 C8 D0 1C 99 C878 : 86 02 8A 30 14 E0 0E F0 0A C880 : 13 E0 0F F0 0F E0 10 F0 FF C888 : 1E E0 14 F0 07 AA 6C FA A7 C890 : C3 4C 74 A4 86 02 AD 58 0B C898 : C8 AC 59 C8 85 14 84 15 5B C8A0 : 20 A3 A8 4C AE A7 00 68 3E C8A8 : A8 68 A2 FA 9A 48 98 48 6B C8B0 : 4C 94 C8 20 FD AE 20 8B 69 C8B8 : B0 8D E6 C8 8C E7 C8 A4 76 C8C0 : 02 20 A2 B3 AD E6 C8 AC 80 C8C8 : E7 C8 85 49 84 4A 20 D6 67 C8D0 : A9 A9 00 85 02 60 00 91
10 rem ****************** 20 rem plotter-basic demo 30 rem ****************** 35 .schwarz:.gk:.mittel 37 .text," Drehung eines 3-D-Koerpers" 38 .text," ==========================" 39 .move,0,-70:.text 40 xv=240:yv=0:rem verschiebungsvektor 41 f=15 :rem vergroesserung 42 w=35 :rem betrachtungswinkel 43 l=24 :rem anzahl der linien 45 dim r(l) :rem feld der linien 50 p=8 :rem anzahl der eckpunkte 55 dim x(p):dim y(p):dim z(p) 60 rem einlesen der eckpunkte 70 for i=1 to p 80 read x(i),y(i),z(i) 90 next 100 rem einlesen der verbindungsfolge 110 for i=1 to l 120 read r(i) 130 next 140 rem zeichnung 150 for i=1 to l step 2 160 .transl,x(r(i)),y(r(i)),z(r(i)),xv,yv,f,w,x(r(i+1)),y(r(i+1)),z(r(i+1)) 170 next 180 rem drehung um 10 grad 185 dw=dw+10 190 for i=1 to p 200 .turn,x(i),y(i),dw:rem drehung um z 210 next 220 .move,0,-150 230 .text :rem cr senden 240 print "{down}commodore-taste druecken!" 250 wait 653,2 260 print "{up} {up}" 270 goto 140 499 rem eckpunkte 500 data -2,-2,0,2,-2,0,2,2,0,-2,2,0,0,0,6,4,0,6,4,4,6,0,4,6 599 rem reihenfolge der verbindungen 600 data 1,2,2,3,3,4,4,1,1,5,2,6,3,7,4,8,8,5,5,6,6,7,7,8