C 64
Listing des Monats

3D-Grafik in Echtzeit

Endlich können Sie dreidimensionale Körper komfortabel eingeben und ohne jeglichen Rechenaufwand auf dem Bildschirm darstellen. Jeder Körper läßt sich in Echtzeit manuell oder automatisch in jede beliebige Richtung und jede Achse drehen.

Eine der gefragtesten Anwendungen mit dem Computer ist wohl das Arbeiten mit der hochauflösenden Grafik. Sei es nun, um sich künstlerisch mit farbigen Malprogrammen (Koala-Painter oder Paint Magic) zu betätigen oder sich Konstruktionszeichnungen mit geeigneten Zeichenprogrammen (Hi-Eddi, StarPainter oder Profi-Painter) zu erstellen. Doch auch die räumliche Darstellung dreidimensionaler Körper ist mit der geeigneten Software (zum Beispiel Giga-CAD) kein Problem.

Doch damit lassen sich 3D-Grafiken leider nur aus einem bestimmten Blickwinkel betrachten. Um einen Körper um eine Achse zu drehen, ist ein enormer Speicherplatz- und Rechenaufwand nötig, der sehr zeitaufwendig werden kann und den auch nicht jedes Programm beherrscht. Hier nun greift »3D-Grafik-Master« ein.

Das Programm ermöglicht es, Körperdrehungen um beliebige Achsen fast in Echtzeit zu berechnen und anzuzeigen. Die Darstellung wird nur durch die Menge der im Körper enthaltenen Eckpunkte und Begrenzungslinien gebremst. Je weniger Linien zu zeichnen sind, desto schneller wird die Drehung. Bei bis zu etwa 40 Linien ist eine Rotation in Echtzeit möglich. Damit lassen sich bereits komplexe Körper darstellen (der Körper in Bild 1 ist beispielsweise aus 43 Punkten und 80 Linien aufgebaut).

Somit ist 3D-Grafik-Master (der sich übrigens auch in eigene Programme einbinden läßt) sehr gut geeignet, um das räumliche Erkennungsvermögen und die Vorstellungskraft zu schulen und zu unterstützen. Ein Beispiel dafür wäre etwa der Einsatz in der Schule, wenn es darum geht, im Zeichenunterricht plastische Körper den Schülern verständlich darzustellen. Doch auch für das eigene Vorstellungsvermögen ist es eine wertvolle Stütze.

Schulung des Vorstellungsvermögens

Das Programm benutzt zur Darstellung das Drahtgittermodell (Bild 1). Aus Geschwindigkeitsgründen wurde auf eine Möglichkeit zum Verbergen verdeckter Kanten (Hidden-Line) verzichtet, da die Routinen sonst in ihrer Verarbeitungsgeschwindigkeit sehr stark verlangsamt würden. Der Autor arbeitet jedoch an einer langsamen Version, die verdeckte Kanten nicht zeichnet.

Drahtgittermodell eines sanduhrförmigen Körpers auf dunklem Bildschirm
Bild 1. Drahtgittermodell eines dreidimensionalen Körpers

Nach der Eingabe der Körper, die über direktes Zeichnen im Raum bis zur Eingabe über Koordinaten reicht (Bild 2), baut das Programm innerhalb kürzester Zeit die nötigen Verbindungen im Speicher auf. Gleich danach kann der fertige Körper dreidimensional dargestellt werden. Es ist außerdem jederzeit möglich, bestehende Verbindungen und Punkte zu löschen oder neue hinzuzufügen. Der zeitliche Aufwand dafür belastet den Anwender nur sehr gering, so daß ein effektives und schnelles Arbeiten mit dem 3D-Grafik-Master möglich ist.

Bildschirm »Koordinatentripel eingeben« mit einer Liste nummerierter Punkte und ihren x-, y- und z-Werten
Bild 2. Auch die direkte Eingabe und Änderung von Raumkoordinaten ist sehr bequem durch direkte Zahleneingabe möglich

Einmal damit gearbeitet, werden Sie nicht so schnell die Freude an diesem gelungenen Programm verlieren.

(Jesko Schwarzer/dm)

3D-Grafik in Echtzeit

Dreidimensionale, plastische Körper aus jedem beliebigen Blickwinkel betrachten und sogar um jede mögliche Achse drehen — dies alles ermöglicht »3D-Grafik-Master«. Wenn's sein muß, auch in Echtzeit.

Eine beliebte Anwendung auf dem Computer ist das Arbeiten mit hochauflösender Grafik. Wenn dabei noch ein effektiver Nutzen entsteht, kann der Computer durchaus arbeitsentlastend eingesetzt werden. Das Programm »3D-Grafik-Master« dient vor allem der Schulung und Erkennung räumlicher Gebilde, ist also zum Beispiel im Zeichenunterricht in Schulen hervorragend einsetzbar. Es ist ein Leichtes, sich dreidimensionale Körper plastisch vorstellen zu können, da ein solcher Körper aus jedem beliebigen Blickwinkel betrachtet werden kann. Außerdem erfolgt die Drehung des Körpers um die einzelnen Achsen fast in Echtzeit, wodurch eine ruckfreie Bewegung entsteht.

Nach dem Start des Programms mit
LOAD"3D-GRAFIK-MASTER",8: RUN
stehen nach dem Laden der einzelnen Programmteile und einer Initialisierungszeit von etwa 50 Sekunden (Aufbau einer Tabelle) folgende Menüpunkte zur Auswahl, die sich entweder mit den Cursortasten oder durch direkte Anwahl mit den Zifferntasten <1> bis <8> ansprechen lassen:

<1> Eingeben als 3D-Zeichnung

Dieser Punkt dient zum Eingeben eines dreidimensionalen Körpers. Sollte vorher bereits ein Körper im Speicher existieren, wird dieser zuerst vom Programm gezeichnet. Damit ist es möglich, neue Verbindungen an bereits existierenden Körpern anzubringen.

Mit den Tasten <X>, <Y>, <Z>, <SHIFT+X>, <SHIFT +Y>, <SHIFT+Z> und den beiden Cursor-Tasten kann nun eine Linie frei im Raum bewegt werden. <RETURN> übernimmt die gezeichnete Linie in den Speicher. <SHIFT+ CLR/HOME> löscht das Bild, <CLR/HOME> positioniert den Grafik-Cursor auf den Koordinatennullpunkt. Durch Drücken der <*>-Taste kann der sich bewegende Endpunkt der Linie gewechselt werden. Auf Wunsch blendet <K> ein Koordinatenkreuz in die Grafik ein oder aus. <L> setzt den Grafik-Cursor auf den zuletzt mit <RETURN> übernommenen Punkt. <P> vereinigt Anfangs- und Endpunkt der Linie miteinander in der aktuellen Position des Grafik-Cursors (ab hier startet eine neue Linie). Mit der Taste <A> läßt sich die X-, Y und Z-Koordinate des Grafik-Cursors abfragen. Der Grafik-Cursor bewegt sich in Schritten, die jeweils einen Abstand von fünf Bildpunkten haben. Eine Änderung ist mit den Tasten <0> bis <9> möglich, wobei <0> einer Schrittweite von 10 Pixel (Bildschirmpunkten) entspricht.

Mit den Tasten <+> und <—> wird der Sichtwinkel, unter dem der Körper erscheint, verändert.

Ist der Körper fertig gezeichnet, erfolgt die Rückkehr zum Hauptmenü mit <←> oder <M>.

<2> Eingeben als Koordinatentripel

Hier kann die Eingabe der Koordinaten eines Körpers in numerischer Form erfolgen. Die Koordinaten dürfen Werte von —40 bis +40 annehmen. Eine Überprüfung findet im Programm statt. <CLR/HOME> setzt den Grafik-Cursor in die erste Spalte der ersten Zeile, <SHIFT+CLR/HOME> löscht den Speicher. Mit <CRSR>-unten kann der Speicher durchgeblättert werden, wenn sich der Cursor in der untersten Bildschirmzeile befindet. Sollte sich der Cursor in der Zeile befinden, in der der letzte Punkt angezeigt wird, läßt sich der Punktespeicher mit <RETURN> um einen Punkt erweitern und neue Koordinaten können eingegeben werden. Die maximale Anzahl einzugebender Punkte und Verbindungslinien beträgt jeweils 255.

<SHIFT+INST/DEL > schafft ebenfalls Platz für einen weiteren Punkt, <INST/DEL> löscht einen Punkt. Ist ein zu löschender Punkt mit einem anderen Punkt durch eine Linie verbunden, läßt sich dieser Punkt nicht löschen!

Mit <F7> gelangt man in den Linien-Eingabemodus. Hier gibt man die Punktenummern des Anfangs- wie auch des Endpunktes ein. <SHIFT+INST/DEL> schafft Platz für eine neue Verbindungslinie, <INST/DEL> löscht eine Verbindungslinie.

Mit <F7> gelangt man wieder in den Punkte-Eingabemodus. Von hier aus kann auch wieder mit <←> oder <M> in das Hauptmenü zurückgesprungen werden.

<3> Eingeben von Rotationskörpern

Nach der Anwahl dieses Menüpunkts wird man gefragt, ob die Koordinaten eines möglicherweise im Speicher stehenden Körpers gelöscht werden sollen. Beantwortet man diese Frage mit <N>, zeichnet das Programm den nächsten erstellten Körper zu dem bestehenden dazu. Nach Klärung dieser Frage erfolgt das Zeichnen eines 80 x 40 Punkte großen Eingabefeldes. Das Programm erstellt nun innerhalb dieses Eingabefeldes eine Hilfsmaske (Bild 1) mit einem Punktabstand von fünf Pixel.

Punkteraster mit gezeichneter Konturlinie über einem Maßband
Bild 1. Die Hilfsmaske beim Erstellen von Rotationskörpern mit angedeutetem Körper

Innerhalb dieses Eingabefeldes kann nun eine Konturenlinie des Körpers erstellt werden, die um eine Drehachse (hier das Maßband) gedreht wird (Bild 1). Wie oft dies zu geschehen hat, ist nach Abschluß des Konturenlinienzeichnens anzugeben. Das Programm verbindet anschließend die entsprechenden Knickpunkte der gedrehten Konturenlinie miteinander, so daß ein geschlossener Körper entsteht (Bild 2).

Aus groben Linien gezeichneter Drahtgitterkörper
Bild 2. So sieht der mit der Funktion »Rotation« erstellte Körper plastisch aus

Das Eingeben der Konturenlinie geschieht mit den Tasten <X>, <Y>, <CRSR>-hoch/unten, <CRSR>-rechts/links, <RETURN>, <*>, <SHIFT+CLR/HOME>, <CLR/ HOME>, <L> und <P>. Mit <X> und <Y> sowie den Cursor-Tasten kann man den Grafik-Cursor bewegen. Die Übernahme einer Linie erfolgt mit <RETURN>. Durch Druck auf <*> kann der sich bewegende Punkt der Linie gewechselt werden. <SHIFT+ CLR/HOME > löscht das Eingabefeld und den Punktespeicher und baut das Eingabefeld wieder neu auf. <CLR/HOME> setzt den Grafik-Cursor auf den geometrischen Nullpunkt des Körpers, <L> setzt ihn auf den zuletzt übernommenen Punkt und <P> vereinigt Anfangs- und Endpunkt der Linie in der momentanen Position des Grafik-Cursors. Die Schrittweite läßt sich mit den Zahlentasten <0> bis <9> pixelweise verändern, wobei <0> einer Schrittweite von 10 Pixel entspricht. Ist die Konturenlinie fertiggestellt, beendet <SPACE> die Eingabe.

Nun fragt das Programm, bis zu welchem Winkel der Körper berechnet werden soll. Hierbei entsprechen 360 Grad einem kompletten Körper, 180 Grad wären genau ein halber Körper.

Das Programm wartet jetzt darauf, daß die Anzahl der Facetten eingegeben wird. Hier gilt: Je höher die Facettenzahl, desto runder erscheint der Körper, desto langsamer erfolgt aber dann auch die Drehung.

Soll zum Beispiel ein halbierter Körper entstehen, der sonst aber »rund« sein soll, so muß ein Winkel von 180 Grad und eine Facettenzahl von etwa 20 angegeben werden.

Ist alles korrekt, ist die Frage »Alles ok?« mit <RETURN> zu beantworten, ansonsten geben Sie bitte <N> ein.

Der Computer berechnet nun die einzelnen Teilstücke und Verbindungslinien der Figur. Danach kehrt das Programm automatisch in das Hauptmenü zurück.

<4>/<5> Koordinaten laden und speichern

In diesen Menüpunkten darf ein höchstens 13 Zeichen langer Name angegeben werden, an den das Programm noch ».3D« anhängt (dies dient der Wiedererkennung der einzelnen Dateien auf Diskette).

<6> Directory

Hier lassen sich alle sequentiellen Disketten-Files anzeigen, die als Datendateien (Name.3D) gekennzeichnet sind. Durch Druck auf eine beliebige Taste wird die Ausgabe angehalten. Nach der Anzeige aller berechtigten Dateien zeigt das Programm den Fehlerkanal des Diskettenlaufwerks an. Im Normalfall also »00,OK,00,00«. Ein weiterer Tastendruck führt zurück ins Hauptmenü.

<7> Drehen

Dies ist einer der letzten und wichtigsten Menüpunkte. Er erlaubt das Drehen einer 3D-Figur fast in Echtzeit (bei nicht zu vielen Linien; je mehr Linien, desto langsamer wird die Drehung).

Beim Start befindet man sich im »Demo-Modus«. Hier wird ein Körper um alle drei Achsen (X-, Y- und Z-Achse) gleichzeitig gedreht. Abschalten kann man die selbständige Drehung mit <E>. Mittels <X>, <Y> und <Z> beziehungsweise <SHIFT+X>, <SHIFT+Y> und <SHIFT+Z> läßt sich ein Körper von Hand in jede Lage drehen. <+> und <—> verändern dabei den Sichtwinkel (von 0 bis 92 Grad). Der Demo-Modus läßt sich durch Druck auf <D> erneut starten. Die Tastaturabfrage ist so gestaltet, daß auch alle Tasten gleichzeitig gedrückt werden dürfen. <RETURN> führt wieder zurück ins Hauptmenü.

<8> Exit

Zu diesem Punkt ist nicht viel zu sagen. Hiermit wird der Editor verlassen. Ein Warmstart ist mit GOTO 60030 möglich.

Eingabehinweise

Bitte geben Sie zuerst Listing 1 ein und speichern es unter dem Namen »3D-Grafik-Master«. Dies ist das spätere Ladeprogramm, das die anderen Teile automatisch nach dem Start mit RUN nachlädt.

Doch vor dem Start tippen Sie bitte noch die Listings 2 und 3 (beide mit dem MSE) sowie Listing 4 und 5 ein und speichern diese.

Listing 3 (»3D.SPRT«) enthält die Form des Cursorsprites. Sie kann beliebig verändert werden. Es ist nur darauf zu achten, daß die Figur auf die linke untere Ecke zeigt und die Anfangsadresse $5BC0 (26368) lautet. Das Listing 4 muß unter dem Namen »3D.EDIT« gespeichert werden.

Das Maschinenprogramm (Listing 2) läuft ohne weiteres auch ohne den Editor (Listing 4). Wie ein eigenes Programm aussieht, das mit Unterstützung von Listing 2 bewegte Grafiken darstellt, können Sie mit Hilfe des Demo-Programms (Listing 5) sehen.

Das Programm

Der Hauptteil des Programms ist sicher die Drehroutine. Sie dreht einen Körper und stellt ihn in Parallelprojektion dar. Dabei wird mit zwei Grafikbildschirmen gearbeitet. Der erste liegt bei $6000 (Farbspeicher bei $5C00) und der zweite bei $E000 (Farbspeicher im RAM unter dem I/O-Bereich ab $DC00).

Die LINE-Routine ist eine der schnellsten uns bekannten. Sie setzt nahezu 13000 Punkte pro Sekunde. Sollte der Sonderfall einer Horizontal- oder Vertikal-Linie eintreten, verzweigt das Programm zu noch schnelleren Unterroutinen. Nach dem Umschalten zwischen den Grafikbildschirmen wird der andere, nicht sichtbare Grafikbildschirm gelöscht (nur der Ausschnitt vom 64. Pixel bis zum 255. Pixel, da ausschließlich in diesem Bereich gezeichnet wird).

Koordinaten und Verbindungslinien

Jeder Punkt wird im Format X/Y/Z im RAM gespeichert. Hierbei liegen die X-Koordinaten ab $4C00 (19456), die Y-Werte ab $4D00 (19712) und die der Z-Punkte ab $4E00 (19968). Es können maximal 255 Punkte abgelegt werden. Die Anzahl steht in Speicherstelle 3. Ein Beispiel: Die Koordinaten eines Würfels (Bild 3):

Würfel mit den Eckpunkten P0 bis P7, daneben deren Koordinaten
Bild 3. Ein Würfel im Koordinatensystem

Zu negativen Zahlen muß der Wert 256 addiert werden!

19456 X 19712 Y 19968 Z
+0 226 +0 226 +0 226
+1 30 +1 226 +1 226
+2 30 +2 226 +2 30
+3 226 +3 226 +3 30
+4 226 +4 30 +4 226
+5 30 +5 30 +5 226
+6 30 +6 30 +6 30
+7 226 +7 30 +7 30

Die Zahl der Punkte beträgt 8, also POKE 3,8

Die Verbindungsvorschrift liegt ab $5100 (20736) für den Startpunkt (PS) und ab $5200 (20992) für den Endpunkt (PE). Es wird dann beim späteren Drehen eine Linie von PS nach PE gezeichnet, wenn sich die entsprechenden Punktnummern in den Speicherzellen befinden. Zum Beispiel der Würfel aus Bild 3 von oben:

Nr. PS PE
0 0 1 Da 12 Linien gezeichnet werden sollen (0 bis 11), muß Speicherstelle 4 eine 12 enthalten.
(POKE 4,12)
1 1 2
2 2 3
3 3 0
4 4 5
5 5 6
6 6 7
7 7 4
8 0 4
9 1 5
10 2 6
11 3 7

Im RAM sieht das dann so aus:

20736 (PS) Inhalt 20992 (PE) Inhalt
+0 0 +0 1
+1 1 +1 2
+2 2 +2 3
+3 3 +3 0
+4 4 +4 5
+5 5 +5 6
+6 6 +6 7
+7 7 +7 4
+8 0 +8 4
+9 1 +9 5
+10 2 +10 6
+11 3 +11 7

Maschinenprogramm (Funktion)

Damit doppelt eingegebene Punkte nicht doppelt berechnet werden müssen, existiert eine Maschinenroutine, die die Koordinaten selbständig im Speicher ablegt und die Punktenummer an den Benutzer zurückgibt. Die Routine, die diese Aufgabe übernimmt, heißt PSEARCH und liegt ab $400C. Sie hat das Format »SYS 2↑14+12,X,Y,Z«.

X, Y und Z sind die Koordinaten eines jeden Punktes. Die Punktenummer wird in Speicherstelle 782 übergeben. Eine praktische Anwendung findet sie im Basic-Listing ab Zeile 30630. Die Adresse der PSEARCH-Routine ist in der Variablen SE gespeichert. Hier, im Rotationskörper-Berechnungsprogramm, kann es vorkommen, daß zwei Punkte gleiche Koordinaten haben. Um zu verhindern, daß unnötigerweise beide berechnet und gezeichnet werden, existiert diese Routine.

Ein ähnliches Programm existiert auch für Verbindungslinien. Damit keine Linie doppelt gezeichnet wird, können die Punktenummern der LSEARCH-Routine ab $400F (im Basic-Programm die Routine mit der Variablen VP) übergeben werden. Syntax: »SYS 2↑14+15,PS,PE«. Speicherzelle 4 (Anzahl der Linien) wird in jedem Fall angepaßt.

Sollte in eine bestehende Punktetabelle ein weiterer Punkt mit einer ganz bestimmten Punktnummer eingefügt werden, dann benutzt man die INSTP-Routine ab $401E. Sie schafft Platz für weitere Punkte durch: »SYS 2↑14+30,PN«. PN stellt die Nummer des einzusetzenden Punktes dar. Die Tabelle der Verbindungslinien wird dabei angepaßt. Das ist wichtig, da der Körper sonst nicht mehr korrekt gezeichnet werden kann.

Ab $4021 existiert noch die PDEL-Funktion. Sie entfernt einen Punkt aus dem Speicher, wenn dieser Punkt nicht mit einem anderen durch eine Linie verbunden ist. Das bedeutet im Klartext: Existiert in der PS- oder PE-Tabelle diese Punktnummer, wird der Punkt nicht gelöscht. Das Format lautet: »SYS 2↑14+33,PN«. Speicherzelle 3 paßt sich entsprechend an. Praktische Anwendung finden beide Routinen (PINST und PDEL) ab Zeile 20320 in Listing 4.

Verbindungslinien können mit der VINST-Routine ($4024) eingesetzt werden. Das Format: »SYS 2↑14+36,LN«. Speicherzelle 4 (Anzahl der Linien) paßt sich automatisch an.

Die VDEL-Routine ($4027) löscht Verbindungsroutinen. Format: »SYS 2↑14+39,LN«. Speicherstelle 4 wird automatisch erniedrigt. Das Basic-Listing benutzt beide Routinen ab Zeile 21620.

Sind alle Koordinaten im Speicher abgelegt und die Speicherstellen 3 und 4 richtig gesetzt, darf die Initialisierungs- ($4000) und dann die Drehroutine ($042A) aufgerufen werden. Die INIT-Routine überprüft, ob alle internen Tabellen aufgestellt wurden. Wenn nicht (erster Aufruf oder Speicherstelle 40960<>0), holt sie das nach. Sie schaltet die $E000-Grafik ein, löscht diese und setzt den Farbspeicher. Danach wird die LINE-Routine auf die richtige Grafikseite (page) bei $6000 gelenkt und ins Basic zurückgesprungen.

Die Drehroutine fragt die Tastatur ab, berechnet die Drehung, die 2D-Koordinaten für den Bildschirm und zeichnet die Figur, bis <RETURN> gedrückt wird. Zum Beispiel: »SYS 2↑14:SYS 2↑14 +42« — Siehe auch Zeile 60020 in Listing 4.

Sollte jemand Lust verspüren, den Körper zu speichern, muß erst die Speicherstelle 3 und dann 4 ausgelesen werden. Nun folgt das Senden der X-, Y- und Z-Koordinaten des ersten Punktes, danach die des zweiten und so weiter. Anschließend kommt die Verbindungsvorschrift. PS/PE der ersten Linie und so weiter, bis die in Speicherstelle 4 enthaltene Anzahl der Linien erreicht ist. Für die Besitzer eines Diskettenlaufwerks übernimmt die Routine ab $4018 das Speichern: »SYS 2↑14 +24,1,8,1,"NAME,S":CLOSE1«.

Für das Laden ist das Maschinenprogramm ab $401B zuständig: »SYS 2↑14 + 27,1,8,0,"NAME,S":CLOSE1«.

Besitzer eines (möglicherweise nicht kompatiblen) Schnelladers können dafür den Programmteil ab Zeile 40000 in Listing 4 verwenden.

Da im Editor auch Linien gezogen und Punkte gesetzt werden, müssen die Einsprünge für diese Routinen auch vorhanden sein:
$4012 — PLOT: »SYS 2↑14+18,X,Y« (2D-Koordinaten)
$4003 — LINE: »SYS 2↑14+3,X1,X2,Y1,Y2«
$4006 — INV: »SYS 2↑14+6« (Ein)
$4015 — NRM: »SYS 2↑14+21« (Aus)

Die Grafikbefehle beziehen sich auf die Grafik ab $6000, wenn vor der Benutzung »SYS 2↑14:POKE 65676,2« eingegeben wurde.

Eine OLD-Funktion ist auch noch vorhanden. Sie wird mit »SYS 2↑14+9« aufgerufen und rettet ein mit Reset oder NEW gelöschtes Programm.

Ein Tip noch am Rande:

Sollen Linien zwar gezeichnet, aber nicht gedreht werden, müssen diese Punkte (deren Koordinaten) in der Punktetabelle »hinten« liegen. Die Speicherstelle 3 gibt weiterhin die Anzahl der Punkte an, die gedreht werden sollen. Punkte, die weiter »hinten« in der Tabelle liegen, können zwar mit Linien verbunden werden, sind aber beim Drehen nicht relevant.

(Jesko Schwarzer/dm)
100 rem"*******************************
110 rem"*******************************
120 rem"**                           **
130 rem"**        3d - master        **
140 rem"**        {CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}        **
150 rem"**  von : jesko schwarzer    **
160 rem"**                           **
170 rem"**        heideweg 11        **
180 rem"**                           **
190 rem"**        5020 frechen 4     **
200 rem"**                           **
210 rem"**  tel.: 02234/62542        **
220 rem"**                           **
230 rem"**                           **
240 rem"**  unter mithilfe von :     **
250 rem"**                           **
260 rem"**        ilja schliffkowitz **
270 rem"**                           **
280 rem"*******************************
290 rem"*******************************
300 :
330 a=a+1:onagoto1000,2000,3000
1000 print"1.maschinenprogramm
1010 load"3d.code",8,1
1020 :
2000 print"2.sprite
2010 load"3d.sprt",8,1
2020 :
3000 print"3.editor
3010 load"3d.edit",8
3020 :
Listing 1. Das Ladeprogramm »3D-Grafik-Master«. Beachten Sie bitte die Eingabehinweise auf Seite 99.
PROGRAMM : 3D.CODE        4000 4BC8
-----------------------------------
4000 : 4C 50 43 4C FC 4A 4C DE   E0
4008 : 40 4C B2 4B 4C 3E 40 4C   D5
4010 : 92 40 4C E4 4A 4C DB 40   69
4018 : 4C ED 40 4C 39 41 4C 85   CE
4020 : 41 4C CC 41 4C 25 42 4C   72
4028 : 4B 42 20 DB 40 78 A9 30   E7
4030 : 85 01 20 01 44 20 A4 45   C0
4038 : 20 82 42 4C 2E 40 20 FD   15
4040 : AE 20 9E B7 86 05 20 FD   AA
4048 : AE 20 9E B7 86 06 20 FD   BA
4050 : AE 20 9E B7 86 0A 8A A4   D9
4058 : 03 F0 0C A0 00 D9 00 4E   56
4060 : F0 1D C8 C4 03 90 F6 99   6D
4068 : 00 4E A5 05 99 00 4C A5   AF
4070 : 06 99 00 4D E6 03 A9 80   1B
4078 : 85 05 85 06 85 0A 60 A5   17
4080 : 05 D9 00 4C D0 07 A5 06   E3
4088 : D9 00 4D F0 E9 A5 0A 4C   5F
4090 : 62 40 20 FD AE 20 9E B7   B0
4098 : 86 05 20 FD AE 20 9E B7   3E
40A0 : 8A A4 04 F0 11 A0 00 D9   65
40A8 : 00 51 F0 19 D9 00 52 F0   79
40B0 : 1F C8 C4 04 90 F1 99 00   E4
40B8 : 51 A5 05 99 00 52 E6 04   87
40C0 : A9 80 85 05 60 A5 05 D9   A6
40C8 : 00 52 F0 F4 8A 4C B1 40   1E
40D0 : A5 05 D9 00 51 F0 E9 8A   C8
40D8 : 4C B1 40 A9 05 2C A9 45   25
40E0 : 8D 41 49 8D 47 49 8D F4   F1
40E8 : 48 8D FD 48 60 20 FD AE   DC
40F0 : 20 BE E1 A6 B8 86 13 20   09
40F8 : 13 E1 A5 03 20 D2 FF A5   A9
4100 : 04 20 D2 FF A0 00 B9 00   BA
4108 : 4C 20 D2 FF B9 00 4D 20   2A
4110 : D2 FF B9 00 4E 20 D2 FF   81
4118 : C8 C4 03 90 E9 A0 00 B9   2C
4120 : 00 51 20 D2 FF B9 00 52   9E
4128 : 20 D2 FF C8 C4 04 90 EF   59
4130 : A9 00 85 13 85 99 4C CC   8D
4138 : FF 20 FD AE 20 BE E1 A6   69
4140 : B8 86 13 20 1E E1 20 24   BE
4148 : E1 85 03 20 24 E1 85 04   20
4150 : A0 00 20 13 EE 99 00 4C   AF
4158 : 20 13 EE 99 00 4D 20 13   02
4160 : EE 99 00 4E C8 C4 03 90   C5
4168 : E9 A0 00 20 13 EE 99 00   B5
4170 : 51 20 13 EE 99 00 52 C8   E8
4178 : C4 04 90 EF A9 00 85 13   37
4180 : 85 99 4C CC FF 20 FD AE   D5
4188 : 20 9E B7 E0 FF D0 01 60   4C
4190 : 86 3F A6 03 A4 03 CA BD   C9
4198 : 00 4C 99 00 4C BD 00 4D   72
41A0 : 99 00 4D BD 00 4E 99 00   1D
41A8 : 4E 88 C4 3F D0 E8 E6 03   49
41B0 : A6 04 8A F0 DA CA BD 00   14
41B8 : 51 C5 3F 90 03 FE 00 51   99
41C0 : BD 00 52 C5 3F 90 EB FE   F1
41C8 : 00 52 B0 E6 20 FD AE 20   E7
41D0 : 9E B7 E4 03 90 01 60 8A   8B
41D8 : A6 04 F0 FA CA DD 00 51   5A
41E0 : F0 F4 DD 00 52 F0 EF E0   F0
41E8 : 00 D0 F1 85 3F A8 AA E8   33
41F0 : BD 00 4C 99 00 4C BD 00   4D
41F8 : 4D 99 00 4D BD 00 4E 99   04
4200 : 00 4E C8 C4 03 D0 E8 C6   DA
4208 : 03 A2 00 BD 00 51 C5 3F   34
4210 : 90 03 DE 00 51 BD 00 52   81
4218 : C5 3F 90 03 DE 00 52 E8   0A
4220 : E4 04 90 E7 60 20 FD AE   84
4228 : 20 9E B7 E4 04 90 01 60   AB
4230 : 86 3F A6 04 A4 04 88 B9   80
4238 : 00 51 9D 00 51 B9 00 52   D0
4240 : 9D 00 52 CA C4 3F D0 EE   33
4248 : E6 04 60 20 FD AE 20 9E   5F
4250 : B7 E4 04 90 01 60 8A A8   1B
4258 : C8 B9 00 51 9D 00 51 B9   BA
4260 : 00 52 9D 00 52 E8 C4 04   78
4268 : D0 EE C6 04 60 58 68 68   1D
4270 : 68 68 A9 15 8D 18 D0 A9   4A
4278 : 1B 8D 11 D0 A9 03 8D 00   A1
4280 : DD 60 A9 37 85 01 A9 00   E6
4288 : 85 8D A9 00 8D 00 DC AE   E8
4290 : 01 DC E8 F0 27 A0 09 B9   67
4298 : 5F 4B 8D 00 DC AD 01 DC   F9
42A0 : 49 FF 39 55 4B F0 12 98   98
42A8 : 0A AA BD 69 4B 8D B7 42   28
42B0 : BD 6A 4B 8D B8 42 20 FF   45
42B8 : FF 88 10 DB A5 9B F0 09   88
42C0 : 20 CF 42 20 E9 42 20 03   94
42C8 : 43 60 A9 FF 85 8D 60 A6   39
42D0 : 05 A5 8D D0 0A E8 E0 DB   48
42D8 : 90 02 A2 80 86 05 60 CA   CA
42E0 : E0 80 B0 02 A2 DA 86 05   92
42E8 : 60 A6 06 A5 8D D0 0A E8   2B
42F0 : E0 DB 90 02 A2 80 86 06   77
42F8 : 60 CA E0 80 B0 02 A2 DA   61
4300 : 86 06 60 A6 0A A5 8D D0   1C
4308 : 0A E8 E0 DB 90 02 A2 80   DE
4310 : 86 0A 60 CA E0 80 B0 02   E6
4318 : A2 DA 86 0A 60 A9 FF 85   69
4320 : 9B 60 A9 00 85 9B 60 A6   5A
4328 : BF E8 E0 18 90 02 A2 17   68
4330 : 86 BF 4C 3E 43 A6 BF CA   6F
4338 : 10 02 A2 00 86 BF 38 A9   8D
4340 : 17 E5 BF 09 80 8D 7D 44   4E
4348 : A5 BF 09 80 8D 8E 44 60   3E
4350 : 78 A9 3B 8D 11 D0 A9 78   4D
4358 : 8D 18 D0 A9 00 8D 00 DD   83
4360 : A9 56 8D D6 4A 8D E5 48   AC
4368 : 20 DE 40 A9 80 85 05 85   90
4370 : 06 85 0A 85 9B A9 30 85   3F
4378 : 01 A0 00 84 F7 84 F9 A9   39
4380 : 60 A2 E0 85 F8 86 FA A2   0F
4388 : 20 98 91 F7 91 F9 C8 D0   05
4390 : F9 E6 F8 E6 FA CA D0 F2   46
4398 : A0 FA A9 10 99 FF DB 99   5E
43A0 : F9 DC 99 F3 DD 99 ED DE   0C
43A8 : 99 FF 5B 99 F9 5C 99 F3   1C
43B0 : 5D 99 ED 5E 88 D0 E5 20   08
43B8 : 3E 43 A9 00 A0 60 A2 E0   5C
43C0 : 85 F7 84 F8 86 FA AA 18   9C
43C8 : A0 00 98 65 F7 9D 00 58   58
43D0 : 08 A5 F8 69 00 9D 00 56   B0
43D8 : 28 A5 FA 69 00 9D 00 57   5A
43E0 : E8 C8 C0 08 90 E4 A5 F7   14
43E8 : 69 3F 85 F7 08 A5 F8 69   B5
43F0 : 01 85 F8 28 A5 FA 69 01   D1
43F8 : 85 FA E0 C8 90 CA 4C CE   7A
4400 : 44 A2 00 86 F7 86 F9 A5   4D
4408 : 05 85 F8 C9 C3 90 02 E9   E4
4410 : 5B 69 17 85 FA BD 00 4D   CF
4418 : A8 BD 00 4E 84 8B 85 8C   3D
4420 : B1 F9 A4 8C 71 F7 85 FD   71
4428 : 38 B1 F9 A4 8B F1 F7 85   7F
4430 : 8C A5 06 85 F8 C9 C3 90   CF
4438 : 02 E9 5B 69 17 85 FA BD   38
4440 : 00 4C A8 84 8B B1 F9 A4   98
4448 : 8C 71 F7 85 C1 38 B1 F9   D4
4450 : A4 8B F1 F7 85 C2 A5 0A   4E
4458 : 85 F8 C9 C3 90 02 E9 5B   BC
4460 : 69 17 85 FA A4 C1 B1 F9   28
4468 : A4 FD 71 F7 85 FD 38 B1   F3
4470 : F9 A4 C1 F1 F7 18 A8 B9   C0
4478 : 00 DB A8 B9 00 FF 65 FD   59
4480 : 18 69 A0 9D 00 4F 38 A9   D7
4488 : 64 E5 C2 38 F9 00 FF 9D   71
4490 : 00 50 E8 E4 03 B0 03 4C   E9
4498 : 07 44 A9 00 85 3F A6 3F   97
44A0 : BD 00 51 A8 B9 00 4F 85   AB
44A8 : AC B9 00 50 85 AE BD 00   00
44B0 : 52 A8 B9 00 4F 85 BB B9   48
44B8 : 00 50 85 BD A9 00 85 AD   05
44C0 : 85 BC 20 24 48 E6 3F A5   34
44C8 : 3F C5 04 90 D1 60 AD FF   D4
44D0 : 03 F0 05 A9 37 85 01 60   26
44D8 : A9 37 85 01 A9 0B 8D 11   EA
44E0 : D0 A9 03 8D 30 D0 A9 00   28
44E8 : 85 8D 85 8E 85 F7 85 3F   14
44F0 : A9 80 85 F8 A5 8D 85 63   FD
44F8 : A5 8E 85 62 A2 90 38 20   62
4500 : 49 BC A9 33 A0 4B 20 28   AD
4508 : BA 20 6B E2 A2 2E A0 4B   BE
4510 : 20 D4 BB A5 3F 20 3C BC   9D
4518 : A9 2E A0 4B 20 28 BA 20   D8
4520 : 9B BC A9 30 85 01 A4 3F   FB
4528 : A5 65 91 F7 A9 37 85 01   4F
4530 : E6 3F D0 DF EE 20 D0 18   49
4538 : A5 8D 69 04 85 8D 90 02   8A
4540 : E6 8E E6 F8 A5 F8 C9 DB   47
4548 : 90 AA A9 00 8D 20 D0 A8   06
4550 : 99 00 4C 99 00 4D 99 00   00
4558 : 4E 99 00 51 99 00 52 C8   12
4560 : D0 EE 85 03 85 04 A5 3F   F7
4568 : 20 3C BC A2 2E A0 4B 20   7F
4570 : D4 BB A9 38 A0 4B 20 A2   BD
4578 : BB A9 2E A0 4B 20 0F BB   11
4580 : 20 9B BC A9 30 85 01 A4   4F
4588 : 3F A5 65 99 00 DB A9 37   1A
4590 : 85 01 E6 3F D0 D0 A9 00   72
4598 : 8D 30 D0 A9 3B 8D 11 D0   AD
45A0 : EE FF 03 60 AD D6 4A 49   A8
45A8 : 01 8D D6 4A AD E5 48 49   2C
45B0 : 01 8D E5 48 A2 37 86 01   FA
45B8 : A0 40 AD 00 DD 29 02 49   A5
45C0 : 02 8D 00 DD F0 55 A9 00   A5
45C8 : 99 00 E0 99 40 E1 99 80   47
45D0 : E2 99 C0 E3 99 00 E5 99   90
45D8 : 40 E6 99 80 E7 99 C0 E8   22
45E0 : 99 00 EA 99 40 EB 99 80   32
45E8 : EC 99 C0 ED 99 00 EF 99   1B
45F0 : 40 F0 99 80 F1 99 C0 F2   F3
45F8 : 99 00 F4 99 40 F5 99 80   1D
4600 : F6 99 C0 F7 99 00 F9 99   A7
4608 : 40 FA 99 80 FB 99 C0 FC   C5
4610 : 99 00 FE C8 D0 B2 A2 30   0F
4618 : A6 01 60 99 00 60 99 40   74
4620 : 61 99 80 62 99 C0 63 99   1B
4628 : 00 65 99 40 66 99 80 67   4D
4630 : 99 C0 68 99 00 6A 99 40   B1
4638 : 6B 99 80 6C 99 C0 6D 99   A6
4640 : 00 6F 99 40 70 99 80 71   1F
4648 : 99 C0 72 99 00 74 99 40   9C
4650 : 75 99 80 76 99 C0 77 99   31
4658 : 00 79 99 40 7A 99 80 7B   F1
4660 : 99 C0 7C 99 00 7E C8 D0   64
4668 : B2 A2 30 86 01 60 4C 7E   89
4670 : 47 A9 7D A0 4B 85 BB 84   D8
4678 : BC A9 01 85 B7 A9 60 85   4F
4680 : B9 48 A9 08 85 BA 48 20   58
4688 : D5 F3 68 20 B4 FF 68 20   A2
4690 : 96 FF A9 00 85 90 20 E9   C1
4698 : 46 20 E9 46 20 E9 46 20   DC
46A0 : E9 46 20 E9 46 85 63 20   50
46A8 : E9 46 85 62 A2 90 38 20   32
46B0 : 49 BC 20 DF BD A8 B9 00   63
46B8 : 01 F0 06 99 81 4B C8 D0   1D
46C0 : F5 A9 20 99 81 4B C8 84   64
46C8 : F7 20 E9 46 F0 09 A4 F7   EC
46D0 : 99 81 4B E6 F7 D0 F2 A9   FF
46D8 : 0D A4 F7 99 81 4B 20 1D   96
46E0 : 47 A5 CB C9 40 F0 B5 D0   2A
46E8 : F8 20 A5 FF 48 A5 90 D0   EF
46F0 : 02 68 60 68 68 68 20 42   1A
46F8 : F6 A9 0D 20 D2 FF A9 08   EE
4700 : 85 BA 20 B4 FF A9 6F 85   97
4708 : B9 20 96 FF 20 A5 FF 20   E6
4710 : D2 FF C9 0D D0 F6 A9 00   61
4718 : 85 C6 4C AB FF A0 03 B9   0D
4720 : 81 4B C9 22 F0 44 C8 B9   C5
4728 : 81 4B C9 42 F0 3C A0 18   AD
4730 : B9 81 4B C9 53 D0 46 88   9C
4738 : B9 81 4B C9 22 D0 F8 A2   90
4740 : 02 88 B9 81 4B DD 7E 4B   59
4748 : D0 33 88 CA 10 F4 C8 84   02
4750 : F8 A9 3E 20 D2 FF A0 05   6A
4758 : A9 20 20 D2 FF C8 C0 06   C9
4760 : 90 F8 20 6E 47 A9 0D 4C   D1
4768 : D2 FF A0 00 84 F8 B9 81   5C
4770 : 4B 20 D2 FF C8 C4 F8 F0   F8
4778 : 04 C9 0D D0 F1 60 A9 00   87
4780 : 85 02 85 B6 58 A9 00 8D   2C
4788 : 77 02 85 C6 20 F3 47 48   8A
4790 : 20 0A 48 68 D0 0B 20 F3   A2
4798 : 47 D0 06 20 0A 48 4C 85   EC
47A0 : 47 A4 02 84 8D 20 B0 47   76
47A8 : A5 8D 20 0C 48 4C 85 47   29
47B0 : C9 11 F0 23 C9 91 F0 2E   EC
47B8 : C9 0D F0 14 C9 31 90 16   5B
47C0 : C9 39 B0 12 E9 30 85 02   CE
47C8 : A5 8D 20 0C 48 20 0A 48   FC
47D0 : E6 02 68 68 A5 02 60 A5   16
47D8 : 02 C9 07 B0 02 E6 02 A5   41
47E0 : B6 F0 1E C6 B6 60 A5 02   78
47E8 : F0 02 C6 02 A5 B6 D0 11   41
47F0 : E6 B6 60 A0 50 AD 77 02   B2
47F8 : D0 06 CA D0 F8 88 D0 F5   9B
4800 : 60 A0 38 CA D0 FD 88 D0   D8
4808 : FA 60 A5 02 0A A8 B9 A2   EE
4810 : 4B 85 F7 B9 A3 4B 85 F8   EF
4818 : A0 02 B1 F7 49 80 91 F7   F3
4820 : 88 10 F7 60 A4 AE C4 BD   08
4828 : D0 03 4C F8 49 A6 AD A5   78
4830 : AC E4 BC D0 07 C5 BB D0   C7
4838 : 23 4C 84 4A E4 BC F0 1C   1C
4840 : B0 1E 38 A5 BB E5 AC 85   6B
4848 : FB A5 BC E5 AD 85 FC A9   50
4850 : 50 A2 49 8D 3D 49 8E 3E   CA
4858 : 49 4C 73 48 C5 BB 90 E2   EF
4860 : E5 BB 85 FB 8A E5 BC 85   D9
4868 : FC A9 71 A2 49 8D 3D 49   72
4870 : 8E 3E 49 C4 BD B0 14 38   2A
4878 : A5 BD E5 AE 85 8E A9 92   E4
4880 : A0 49 8D 24 49 8C 25 49   CD
4888 : 4C 9A 48 98 E5 BD 85 8E   C6
4890 : A9 C4 A0 49 8D 24 49 8C   25
4898 : 25 49 A4 FB A5 FC D0 04   98
48A0 : C4 8E 90 0A 4A 98 6A 85   2F
48A8 : C1 85 FD 4C D1 48 A5 8E   48
48B0 : 85 FB 4A 85 C1 85 FD 84   BF
48B8 : 8E AD 24 49 AC 3D 49 8D   44
48C0 : 3D 49 8C 24 49 AD 25 49   73
48C8 : AC 3E 49 8D 3E 49 8C 25   42
48D0 : 49 A0 00 84 C2 A6 BD 18   82
48D8 : A5 BB 29 F8 7D 00 58 85   08
48E0 : F9 A5 BC 7D 00 56 85 FA   49
48E8 : A5 BB 29 07 AA BD 3D 4B   BA
48F0 : 85 07 B1 F9 05 07 91 F9   67
48F8 : 20 C6 4A B1 F7 05 B6 91   EA
4900 : F7 A5 8E 8D 14 49 A6 FD   41
4908 : F0 45 A4 F7 A2 00 86 F7   F7
4910 : 18 A5 C1 69 00 85 C1 A5   17
4918 : C2 69 00 85 C2 C5 FC F0   70
4920 : 15 90 19 20 FF FF 38 A5   F4
4928 : C1 E5 FB 85 C1 A5 C2 E5   AB
4930 : FC 85 C2 4C 3C 49 A5 C1   51
4938 : C5 FB B0 E7 20 FF FF B1   89
4940 : F7 05 B6 91 F7 A1 F9 05   18
4948 : 07 81 F9 C6 FD D0 C1 60   95
4950 : 46 B6 90 0A 66 B6 98 69   A8
4958 : 08 A8 90 02 E6 F8 06 07   75
4960 : B0 01 60 26 07 A5 F9 E9   C7
4968 : 07 85 F9 90 01 60 C6 FA   E6
4970 : 60 06 B6 90 0A 26 B6 98   71
4978 : E9 07 A8 B0 02 C6 F8 46   EC
4980 : 07 B0 01 60 66 07 A5 F9   55
4988 : 69 08 85 F9 B0 01 60 E6   F8
4990 : FA 60 98 29 07 C9 07 F0   C2
4998 : 0A C8 A5 F9 29 07 F0 16   6A
49A0 : C6 F9 60 98 69 38 A8 A5   D4
49A8 : F8 69 01 85 F8 A5 F9 29   3D
49B0 : 07 F0 03 C6 F9 60 38 A5   98
49B8 : F9 E9 39 85 F9 A5 FA E9   31
49C0 : 01 85 FA 60 98 29 07 F0   1F
49C8 : 0C 88 A5 F9 29 07 C9 07   C1
49D0 : F0 19 E6 F9 60 38 98 E9   44
49D8 : 39 A8 A5 F8 E9 01 85 F8   9C
49E0 : A5 F9 29 07 C9 07 F0 03   4C
49E8 : E6 F9 60 A5 F9 69 38 85   6E
49F0 : F9 A5 FA 69 01 85 FA 60   91
49F8 : A5 BC A6 BB C5 AD D0 02   2D
4A00 : E4 AC B0 0C A4 AD 85 AD   11
4A08 : 84 BC A4 AC 86 AC 84 BB   00
4A10 : A5 AC 48 A5 AD 48 A5 BB   FD
4A18 : 85 AC A5 BC 85 AD A0 00   3C
4A20 : 20 C6 4A 86 02 A5 F7 85   3F
4A28 : F9 A5 F8 85 FA 68 85 AD   47
4A30 : 68 85 AC 20 C6 4A A5 F7   CF
4A38 : C5 F9 D0 13 A5 F8 E5 FA   40
4A40 : D0 0D BD 45 4B A6 02 3D   1B
4A48 : 4D 4B 11 F7 91 F7 60 BD   54
4A50 : 45 4B 48 38 A5 F9 E5 F7   06
4A58 : AA A5 FA E5 F8 4A 8A 6A   31
4A60 : 4A 4A AA 18 68 11 F7 2C   C4
4A68 : A9 FF 91 F7 A5 F7 69 08   44
4A70 : 85 F7 90 03 E6 F8 18 CA   A1
4A78 : D0 EE A6 02 BD 4D 4B 11   3F
4A80 : F7 91 F7 60 A5 BD C5 AE   06
4A88 : B0 08 A4 AE 85 AE 84 BD   97
4A90 : 38 98 E5 AE 48 A5 AE 29   22
4A98 : 07 A8 A5 AE 29 F8 AA 20   78
4AA0 : C8 4A 68 AA E8 A5 B6 11   B5
4AA8 : F7 91 F7 CA F0 17 C8 C0   2B
4AB0 : 08 90 F2 A5 F7 69 3F 85   44
4AB8 : F7 A5 F8 69 01 85 F8 A5   59
4AC0 : B6 A0 00 F0 E0 60 A6 AE   ED
4AC8 : 18 A5 AC 29 F8 7D 00 58   2F
4AD0 : 85 F7 A5 AD 7D 00 56 85   AC
4AD8 : F8 A5 AC 29 07 AA BD 3D   2A
4AE0 : 4B 85 B6 60 20 FD AE 20   94
4AE8 : EB B7 A5 14 A4 15 85 AC   FD
4AF0 : 84 AD 20 C8 4A A0 00 11   38
4AF8 : F7 91 F7 60 20 FD AE 20   AF
4B00 : EB B7 86 BD A5 14 A4 15   D8
4B08 : 85 BB 84 BC 20 FD AE 20   10
4B10 : EB B7 86 AE A4 AE A6 15   D3
4B18 : A5 14 86 AD 85 AC E4 BC   E9
4B20 : D0 07 C5 BB 20 5C 48 58   13
4B28 : 60 20 3C 48 58 60 00 00   39
4B30 : 00 00 00 7B 0E FA 35 0F   4C
4B38 : 81 4C CC CC CD 80 40 20   CE
4B40 : 10 08 04 02 01 FF 7F 3F   22
4B48 : 1F 0F 07 03 01 80 C0 E0   EA
4B50 : F0 F8 FC FE FF 02 01 08   FF
4B58 : 04 40 80 02 10 80 10 FE   20
4B60 : DF DF FB FD FB F7 FD FD   61
4B68 : BF 6D 42 27 43 35 43 1D   78
4B70 : 43 22 43 CF 42 E9 42 03   12
4B78 : 43 CA 42 CA 42 24 2E 33   6F
4B80 : 44 20 20 20 20 20 20 20   A4
4B88 : 20 20 20 20 20 20 20 20   88
4B90 : 20 20 20 20 20 20 20 20   90
4B98 : 20 20 20 20 20 20 20 20   98
4BA0 : 20 20 C9 04 19 05 69 05   2D
4BA8 : B9 05 09 06 59 06 A9 06   5F
4BB0 : F9 06 A9 01 A8 91 2B 20   3B
4BB8 : 33 A5 18 A5 22 69 02 85   F9
4BC0 : 2D A5 23 69 00 85 2E 60   5C
Listing 2. »3D-CODE« — Maschinenroutinen zur schnellen Grafik-Animation (bitte mit dem MSE eingeben)
PROGRAMM : 3D.SPRT        5BC0 5C02
-----------------------------------
5BC0 : 18 00 00 1C 00 00 0E 00   94
5BC8 : 00 07 00 00 03 80 00 01   82
5BD0 : C0 00 00 E0 00 00 70 00   6E
5BD8 : 00 38 00 00 1C 00 00 0E   D2
5BE0 : 00 00 07 00 00 03 80 00   BC
5BE8 : 01 C0 00 00 F0 00 00 78   49
5BF0 : 00 00 7E 00 00 3F 00 00   8A
5BF8 : 1F 00 00 1C 00 00 0C 00   CB
5C00 : 01 08                     15
Listing 3. »3D-SPRT« — Spritedaten des Grafik-Cursors (bitte mit dem MSE eingeben)
0 rem"-{CBM-M}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-G}
1 rem"-{CBM-M}       3d - master         {CBM-G}
2 rem"-{CBM-M}     von j.schwarzer       {CBM-G}
3 rem"-{CBM-M}       heideweg 11         {CBM-G}
4 rem"-{CBM-M}5020 frechen 4 (bei koeln) {CBM-G}
5 rem"- {CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}
6 rem"- noch fragen ?
7 rem"-
8 rem"- tel.: 02234/62542
9 rem"-       {CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}{CBM-T}
10 :
100 sys2^14+9:sys2^14:poke3,0:poke4,0
110 poke650,128:poke53281,0
120 poke56,64:clr:lo=1:dw=45
130 v=53248:p=~/180
140 s=5:m=40:xm=160:ym=100:w=30
150 ba=2^14:l=ba+3:in=ba+6:se=ba+12:vp=ba+15:pl=ba+18:nr=ba+21
160 sq=ba+24:lq=ba+27:ip=ba+30:dp=ba+33
170 il=ba+36:dl=ba+39:dr=ba+42
180 gosub10850
190 p1=20736:p2=20992
200 xs=19456:ys=19712:zs=19968
210 poke191,dw/4
220 dimx(128),y(128)
230 d=256:r=127:ri$=chr$(13):w$="{down}{rght}{wht} ":h$="{home}":c$="{clr}
240 cu$="{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}
250 ss$="---------------------------------------
260 sp$="                                       ":d$="{down}":u$="{up}":l$="{left}":r$="{rght}
270 printc$:rem -----
280 poke24568,111:pokev+39,2
1000 rem menue
1010 gosub1240:z=1:qs=81:qr=87:poke53280,0:pokev+21,0
1020 print"{home}{down}{rght}{wht}{swuc}{dish}eingabe-menue:
1030 print"{down}{down}{down}{rght} 1 {red}........ eingeben als 3d-zeichnung
1040 printw$"2 {orng}... eingeben als koordinatentripel
1050 printw$"3 {yel}... eingeben von rotationskoerpern
1060 printw$"4 {grn}................ koordinaten laden
1070 printw$"5 {gry1}............ koordinaten speichern
1080 printw$"6 {blu}........................ directory
1085 printw$"7 {lblu}........................... drehen
1090 print"{rght}{rght}{wht}                                {CBM-@}{CBM-@}{CBM-@}{CBM-@}
1100 print"{rght} 8 ............................. {rvon}exit
1110 sysba+1646
1230 poke198,0:onpeek(2)goto10000,20000,30000,50010,40010,50100,60020,60000
1240 pokev+24,21:pokev+17,27:poke56576,3:return
1250 pokev+24,120:pokev+17,59:poke56576,2:return
1260 poke1146+z*80,q
1270 qc=peek(55420+z*80)
1280 ifq=qrthenqc=1
1290 poke55418+z*80,qc:return
1300 -----    
10000 pokev+21,0:sysba:poke56576,2:x=0:y=0:z=0
10010 gosub10820
10020 iflothenlo=0:ap=0:al=0:poke3,0:poke4,0:goto10140
10030 if(aporal)=0goto10140
10040 sysnr:fori=0toal-1
10050 x=peek(xs+peek(p1+i)):x=x+d*(x>r)
10060 y=peek(ys+peek(p1+i)):y=y+d*(y>r)
10070 z=peek(zs+peek(p1+i)):z=z+d*(z>r)
10080 gosub10350:xa=xx:ya=yy
10090 x=peek(xs+peek(p2+i)):x=x+d*(x>r)
10100 y=peek(ys+peek(p2+i)):y=y+d*(y>r)
10110 z=peek(zs+peek(p2+i)):z=z+d*(z>r)
10120 gosub10350:sysl,xa,ya,xx,yy:next
10130 sysin
10140 xa=160:ya=100:xb=xa:yb=ya:x=0:y=0:z=0
10150 gosub10850:pokev+21,1
10160 gosub60050
10170 ifa$<>""goto10220
10180 gosub10320
10190 gosub60050
10200 gosub10320
10210 ifa$=""goto10160
10220 gosub10490
10230 xr=xa:yr=ya:xp=xb:yp=yb
10240 gosub10320:gosub10250:sysl,xr,yr,xp,yp:onmm+1goto10160,10000
10250 ifq=1thenx1=x:y1=y:z1=z:gosub10340:xa=xx:ya=yy:gosub10850
10260 ifa$="*"thengosub10410:gosub10340:gosub10850
10270 ifa$=ri$thengosub10320:gosub10680:gosub10410:goto10290
10280 return
10290 xl=x1:yl=y1:zl=z1:x1=x2:y1=y2:z1=z2:x=x1:y=y1:z=z1:xa=xb:ya=yb:return
10300 -----
10310 rem linie ziehen
10320 sysl,xa,ya,xb,yb:return
10330 -----
10340 rem 3d nach 2d koordinaten
10350 yt=y/1.6
10360 yy=ym-z-yt*si
10370 xx=xm+x+yt*co
10380 return
10390 -----
10400 rem 2.punkt suchen
10410 xx=x1:yy=y1:zz=z1
10420 x1=x2:y1=y2:z1=z2
10430 x2=xx:y2=yy:z2=zz
10440 xx=xa:yy=ya:xa=xb
10450 ya=yb:xb=xx:yb=yy
10460 x=x1:y=y1:z=z1
10470 return
10480 -----
10490 q=0:mm=0
10500 ifa$="x"ora$=r$thenx=x+s:q=1:ifx>mthenx=m
10510 ifa$="X"ora$=l$thenx=x-s:q=1:ifx<-mthenx=-m
10520 ifa$="y"theny=y+s:q=1:ify>mtheny=m
10530 ifa$="Y"theny=y-s:q=1:ify<-mtheny=-m
10540 ifa$="z"ora$=u$thenz=z+s:q=1:ifz>mthenz=m
10550 ifa$="Z"ora$=d$thenz=z-s:q=1:ifz<-mthenz=-m
10560 ifa$=c$thenlo=1:goto10000
10570 ifa$=h$thenx=0:y=0:z=0:q=1
10580 ifa$="+"thenifdw<90-sthendw=dw+s:poke191,dw/4:mm=1:goto10820
10590 ifa$="-"thenifdw>sthendw=dw-s:poke191,dw/4:mm=1:goto10820
10600 ifa$="k"goto10870
10610 ifa$="p"thenx1=x:y1=y:z1=z:xb=xa:yb=ya:x2=x:y2=y:z2=z
10620 ifa$="l"thenx=xl:y=yl:z=zl:q=1
10630 ifa$="a"thengosub10950
10640 ifa$>"/"anda$<":"thens=asc(a$)-48:ifs=0thens=10
10650 ifa$="_"ora$="m"goto60030
10660 return
10670 -----
10680 rem koordinaten speichern
10690 ifap=255oral=255thenreturn
10700 x=x1:y=y1:z=z1:gosub10760
10710 pp=p
10720 x=x2:y=y2:z=z2:gosub10760
10730 sysvp,pp,p
10740 al=peek(4):return
10750 -----
10760 sysse,x-256*(x<0),y-256*(y<0),z-256*(z<0)
10770 ap=peek(3):p=peek(782):return
10780 -----
10790 pokev+21,0
10800 poke191,dw/4:sysba:sysd3:poke56576,2
10810 pokev+21,1
10820 co=cos(p*dw):si=sin(p*dw)
10830 return
10840 -----
10850 pokev,xa+1and255:pokev+1,ya+30:return
10860 -----
10870 xd=x:yd=y:zd=z
10880 x=-m:y=0:z=0:gosub10340:xq=xx:yq=yy
10890 x=m:gosub10340:sysl,xx,yy,xq,yq
10900 x=0:y=-m:gosub10340:xq=xx:yq=yy
10910 y=m:gosub10340:sysl,xx,yy,xq,yq
10920 y=0:z=-m:gosub10340:xq=xx:yq=yy
10930 z=m:gosub10340:sysl,xx,yy,xq,yq
10940 x=xd:y=yd:z=zd:return
10950 print"{clr}{down}{rght}koordinaten anzeigen:
10960 print"{down}{rght}{rght}x="x
10970 print"{down}{rght}{rght}y="y
10980 print"{down}{rght}{rght}z="z
10990 pokev+21,0:gosub1240
11000 poke198,0:wait198,1:poke198,0
11010 pokev+21,1:goto1250
11020 -----
20000 ze=0:gosub1240:zz=1280
20010 gosub1240:zz=1280:printc$
20020 zu=0:ifap=0goto20050
20030 ifap>ze+15thenzu=15:goto20050
20040 zu=(ap-1)and15:ifap=0thenzu=-1
20050 y1=0
20060 gosub21120
20070 fori=zetoze+zu
20080 gosub21190
20090 next:x1=0:xa=0:y1=zu:ifq=5theny1=t:ify1>zutheny1=zu
20100 printss$
20110 :
20120 gosub60050
20130 ifa$<>""goto20190
20140 gosub21080
20150 gosub60050
20160 gosub21080
20170 ifa$=""goto20120
20180 :
20190 gosub21080
20200 q=0
20210 gosub20260
20220 onqgoto20000,20120,20050,21280,20010
20230 pokea,c
20240 goto20120
20250 :
20260 ifa$=d$goto20870
20270 ifa$=u$goto20940
20280 ifa$=r$goto20980
20290 ifa$=l$goto21030
20300 ifa$=c$thenap=0:poke3,0:a$=h$:q=1
20310 ifa$=h$thenx1=0:y1=0
20320 ifa$=chr$(148)andap<>255thensysip,ze+y1:ap=peek(3):q=5:t=y1:return
20330 ifa$=chr$(20)thenifap<>0thensysdp,ze+y1:ap=peek(3):q=5:t=y1:ifapand15=15goto20543
20340 ifa$>="0"anda$<":"goto20680
20350 ifa$="+"ora$=" "ora$="-"goto20790
20360 ifa$="_"ora$="m"thenpoke3,ap:goto60030
20370 ifa$="{f7}"thenq=4:poke3,ap:return
20380 ifa$<>ri$thenreturn
20390 :
20400 rem return taste
20410 x1=0:xa=0:pokea,c
20420 ify1<zutheny1=y1+1:return
20430 ifzu<>15goto20500
20440 ifze<240thenze=ze+16
20450 print"{clr}":y1=0
20460 ifze=apthenzu=0:q=3:ap=ap+1:poke3,ap:return
20470 ifap<ze+17thenzu=ap-1and15
20480 q=3:return
20490 ;
20500 zu=zu+1:ap=ap+1:poke3,ap:ifap=1thenzu=0:q=3:return
20505 gosub21120
20510 i=ap-1:printd$sp$u$
20520 gosub21190
20530 y1=y1+1
20540 printss$:q=2:return
20541 -----
20542 rem delete point
20543 ifzu=0thenifze>15andap=zethenze=ze-16:t=15
20544 return
20550 -----
20560 rem zeile uebernehmen
20570 q=zz+y1*40:x$="":y$=x$:z$=x$
20580 fori=0to2
20590 x$=x$+chr$(peek(q-1+i))
20600 y$=y$+chr$(peek(q+7+i))
20610 z$=z$+chr$(peek(q+15+i)):next
20620 q=ze+y1
20630 x=val(x$):pokexs+q,x-d*(x<0)
20640 y=val(y$):pokeys+q,y-d*(y<0)
20650 z=val(z$):pokezs+q,z-d*(z<0)
20660 q=0:return
20670 -----
20680 rem zahl eingeben
20690 x2=zz+x1+y1*40
20700 i=zz+(x1and24)+y1*40-1
20710 x$="":forn=itoi+2
20720 t=peek(n)and127:ifn=x2thent=asc(a$)
20730 x$=x$+chr$(t):next
20740 t=val(x$):ifabs(t)>mthenreturn
20750 c=asc(a$):t=t-d*(t<0)
20760 pokexs+((x1and24)/8)*d+ze+y1,t
20770 goto20990
20780 -----
20790 ifa$="+"thena$=" "
20800 x2=zz+(x1and24)-1+y1*40
20810 pokex2,asc(a$)
20820 x2=xs+((x1and24)/8)*d+ze+y1
20830 t=peek(x2):t=-t-d*(t>r)
20840 t=t-d*(t<0):pokex2,t:return
20850 -----
20860 rem down
20870 ify1<zutheny1=y1+1:q=0:return
20880 ifzu<>15orap<ze+17thenreturn
20890 ifze<240thenze=ze+16
20900 zu=15:ifap<ze+16thenzu=ap-1and15
20910 q=3:y1=0:printc$:return
20920 -----
20930 rem up
20940 ify1>0theny1=y1-1:return
20950 ifze>0thenze=ze-16:q=3:zu=15:printc$
20960 return
20970 -----
20980 rem right
20990 ifx1=1orx1=9thenxa=xa+1:x1=xa*8:return
21000 ifx1<17thenx1=x1+1
21010 return
21020 -----
21030 rem left
21040 ifx1=8orx1=16thenxa=xa-1:x1=xa*8:return
21050 ifx1>0thenx1=x1-1
21060 return
21070 -----
21080 a=zz+x1+y1*40:c=peek(a)
21090 pokea,(cor128)-(cand128)
21100 return
21110 -----
21120 print"{gry1}
21130 print"{home}{swlc}{rght}Koordinatentripel eingeben:{down}
21140 print"{rght} Anzahl der Punkte:"ap
21150 print"{rght} Anzahl der Linien:"al
21160 printd$ss$
21170 printu$left$(cu$,y1):return
21180 -----
21190 rem inhalt des punktespeichers
21200 rem anzeigen
21210 print"Nr."i+1"{left} "tab(8)
21220 x=peek(xs+i):x=x+d*(x>r)
21230 y=peek(ys+i):y=y+d*(y>r)
21240 z=peek(zs+i):z=z+d*(z>r)
21250 print"==>{rvof}  x="x"{left} "tab(21)"y="y"{left} "tab(29)"z="z"{left}  "
21260 return
21270 -----
21280 poke3,ap:ze=0
21290 zu=15:ifal<ze+16thenzu=al-1and15
21300 ifal=0thenzu=0
21310 zz=1285
21320 y1=0:x=0:print"{clr}{yel}":gosub21130
21330 fori=zetoze+zu
21340 gosub22140
21350 next:y=zu:ifq=2theny=t:ify>zutheny=zu
21360 printss$
21370 gosub60050
21380 gosub21520
21390 ifa$<>""goto21450
21400 gosub60050
21410 ifa$<>""goto21450
21420 gosub21520
21430 goto21370
21440 :
21450 q=0
21460 gosub21570
21470 onqgoto21320,21290,20000
21480 pokek,j
21490 goto21370
21500 :
21510 rem invertieren
21520 k=zz+x+y*40
21530 j=peek(k)
21540 pokek,(jor128)-(jand128)
21550 return
21560 :
21570 ifa$=d$goto21800
21580 ifa$=u$goto21860
21590 ifa$=r$goto21910
21600 ifa$=l$goto21960
21610 ifa$=h$goto21990
21611 ifa$=c$thenal=0:poke4,0:q=2:return
21620 ifa$=chr$(148)andal<>255thensysil,ze+y:al=peek(4):q=2:t=y:return
21630 ifa$=chr$(20)andal<>0thensysdl,ze+y:al=peek(4):q=2:t=y:ifaland15=15then21791
21640 ifa$="{f7}"thenq=3:poke4,al:return
21650 ifa$>"/"anda$<":"goto22010
21660 ifa$="m"ora$="_"thenpoke4,al:goto60030
21670 ifa$<>ri$thenreturn
21680 :
21690 pokek,j:x=0
21700 ify<zutheny=y+1:return
21710 al=al+1:poke4,al
21720 ifzu=15goto21780
21730 zu=zu+1:y1=zu:ifal=1thenzu=0:y1=0:goto21750
21740 printu$sp$
21750 gosub21130
21760 i=al-1:gosub22140:y=zu
21770 printss$:return
21780 ifze<240thenze=ze+16
21790 zu=0:q=1:return
21791 rem delete line
21792 ifzu=0thenifze>15andal=zethenze=ze-16:t=15
21793 return
21800 rem down
21810 ify<zutheny=y+1:return
21820 ifzu<>15oral<ze+17thenreturn
21830 ifze<240thenze=ze+16
21840 zu=15:ifal<ze+16thenzu=al-1and15
21850 q=1:return
21860 rem up
21870 ify>0theny=y-1:return
21880 ifze=0thenreturn
21890 zu=15:ifze>0thenze=ze-16
21900 q=1:return
21910 rem right
21920 ifx<14thenx=x+1:ifx=3thenx=12
21930 ifpeek(zz+x+y*40)<>32thenreturn
21940 ifx>12thenx=x-1:return
21950 goto21920
21960 rem left
21970 ifx>0thenx=x-1:ifx=11thenx=0
21980 return
21990 rem home
22000 y=0:x=0:return
22010 rem zahl eingeben
22020 z=zz+y*40:ifx>11thenz=z+12
22030 x$="":fori=ztoz+2
22040 x$=x$+chr$(peek(i)and127):next
22050 z=x+1:ifx>11thenz=z-12
22060 x$=left$(x$,z-1)+a$+mid$(x$,z+1)
22070 z=val(x$):ifz>aporz=0thenreturn
22080 qq=p1+ze+y:ifx>11thenqq=qq+d
22090 pokeqq,z-1
22100 j=asc(a$):ifx=14thenreturn
22110 ifx=2thenx=12:return
22120 x=x+1:return
22130 -----
22140 print"Nr.:"i+1tab(9)"==>";
22150 pa=peek(p1+i)+1:ifpa>apthenpa=1:pokep1+i,1
22160 pb=peek(p2+i)+1:ifpb>apthenpb=1:pokep2+i,1
22170 print" von Nr."pa"{left}  "tab(25)"bis Nr."pb"{left}   "
22180 return
22190 -----
30000 g$="{home}{down}{rght}{swlc}{wht}Rotationskoerper:"
30010 print"{clr}"g$
30020 a$="n":input"{down}{rght}Alte Koordinaten loeschen ? n{left}{left}{left}";a$:ifa$="n"goto30040
30030 poke3,0:poke4,0:ap=0:al=0
30040 pokev+21,0:sysba:poke56576,2:za=0:lo=0
30050 x=0:y=0:x1=x:y1=y
30060 xa=xm-m*2:ya=ym+m/2:yb=ya
30070 fori=0to4*mstep4
30080 h=6:ifi/5=int(i/5)thenh=12
30090 sysl,xa+i,ya+1,xa+i,ya+h:next
30100 xa=xm:xb=xa:gosub10850:pokev+21,1
30110 fori=xm-m*2toxm+m*2step10
30120 forj=ya-m*2toyastep10
30130 syspl,i,j:nextj,i
30140 gosub60050
30150 ifa$<>""goto30210
30160 gosub10320
30170 gosub60050
30180 gosub10320
30190 ifa$=""goto30140
30200 :
30210 xr=xa:yr=ya:xp=xb:yp=yb:q=4
30220 gosub10320
30230 gosub30280
30240 sysl,xr,yr,xp,yp
30250 ifq=1thengosub30470:xa=xx:ya=yy:gosub10850:q=4
30260 onq-1goto30040,30490,30140
30270 poke53280,1:stop
30280 ifa$="x"ora$=r$thenx=x+s:q=1:ifx>mthenx=m
30290 ifa$="X"ora$=l$thenx=x-s:q=1:ifx<-mthenx=-m
30300 ifa$="y"ora$=u$theny=y+s:q=1:ify>mtheny=m
30310 ifa$="Y"ora$=d$theny=y-s:q=1:ify<0theny=0
30320 ifa$="l"thenx=x2:y=y2:q=1
30330 ifa$="p"thenx1=x:y1=y:xb=xa:yb=ya
30340 ifa$=c$thenq=2
30350 ifa$=h$thenx=0:y=0:q=1
30360 ifa$="*"goto30450
30370 ifa$=" "thenq=3:s=5:return
30380 ifa$="m"ora$="_"goto60030
30390 ifa$>"/"anda$<":"thens=asc(a$)-48:ifs=0thens=10
30400 ifa$<>ri$thenreturn
30410 :
30420 x(za)=x1:y(za)=y1:za=za+1:x(za)=x:y(za)=y:za=za+1:x2=x1:y2=y1
30430 x1=x:y1=y:gosub30470:gosub10320:xb=xx:yb=yy:return
30440 :
30450 q=1:xx=x:yy=y:x=x1:y=y1:x1=xx:y1=yy:xb=xa:yb=ya:return
30460 :
30470 xx=xm+x*2:yy=ym+m/2-y*2:return
30480 :
30490 gosub1240
30500 print"{clr}":pokev+21,0
30510 printg$:poke19,64
30520 input"{down}{rght}von 0 Grad - 360 Grad  {left}{left}{left}{left}{left}{left}{left}{left}{left}{left}";gr$:gr=int(abs(val(gr$)))
30530 print:ifgr>360goto30500
30540 poke19,0
30550 input"{down}{rght}Anzahl der Facetten:";an
30560 ifan<3thenprint"{up}{up}";:goto30550
30570 input"{down}{rght}Alles ok.";a$
30580 ifa$<>"n"goto30630
30590 input"{down}{rght}Neu zeichnen";a$
30600 ifa$="j"goto30000
30610 goto30500
30620 :
30630 ap=peek(3):al=peek(4):n=al
30640 a$="{down}{rght}Anzahl der Facetten zu gross !!"
30650 print"{down}{rght}1. Facetten{down}
30660 fori=0to(gr-1)*pstep(gr/an)*p
30670 forj=0toza-1step2:printn-al+1"{up}"
30680 fork=0to1:t=k+j
30690 x=x(t)-d*(x(t)<0)
30700 y=int(y(t)*cos(i)):y=y-d*(y<0)
30710 z=int(y(t)*sin(i)):z=z-d*(z<0)
30720 sysse,x,y,z
30730 pokep1+n+k*d,peek(782)
30740 nextk:n=n+1:nextj:ifi=0thenf=n-al
30750 nexti
30760 :
30770 ifn>255thenprinta$:poke3,ap:poke4,al:goto30510
30780 :
30790 poke4,n:ap=peek(3):print"{up}{up}"
30800 :
30810 t=n-f-1-al
30820 print"{down}{rght}2. Verbindungen 1
30830 fori=altot+alstepf
30840 forj=0tof-1
30850 pa=peek(p1+i+j):pb=peek(p1+i+j+f)
30860 ifpa=pbgoto30880
30870 sysvp,pa,pb:ifpeek(4)=255thenn=256:goto30770
30880 nextj,i
30890 ifgr<>360goto30950
30900 fork=0tof-1
30910 pa=peek(p1+i+k):pb=peek(p1+k+al)
30920 ifpa=pbgoto30940
30930 sysvp,pa,pb:ifpeek(4)=255thenn=256:goto30770
30940 nextk
30950 print"{down}{rght}3. Verbindungen 2
30960 fori=altot+alstepf
30970 forj=0tof-1
30980 pa=peek(p2+i+j):pb=peek(p2+i+j+f)
30990 ifpa=pbgoto31010
31000 sysvp,pa,pb:ifpeek(4)=255thenn=256:goto30770
31010 nextj,i
31020 ifgr<>360goto60030
31030 fork=0tof-1
31040 pa=peek(p2+i+k):pb=peek(p2+k+al)
31050 ifpa=pbgoto31070
31060 sysvp,pa,pb:ifpeek(4)=255thenn=256:goto30770
31070 nextk
31080 :
31090 goto60030
40000 -speichern-
40010 gosub50040
40020 open1,8,1,b$
40030 print#1,chr$(peek(3));
40040 print#1,chr$(peek(4));
40050 fori=0topeek(3)-1
40060 print#1,chr$(peek(xs+i));
40070 print#1,chr$(peek(ys+i));
40080 print#1,chr$(peek(zs+i));
40090 next
40100 fori=0topeek(4)-1
40110 print#1,chr$(peek(p1+i));
40120 print#1,chr$(peek(p2+i));
40130 next
40140 close1:goto60030
50000 -laden-
50010 ifpeek(1023)=0thensysba:gosub1240
50015 gosub50040:lo=0
50020 syslq,1,8,0,b$:close1:goto60030
50030 -filename-
50040 b$="":input"{down}{rght}filename";b$:ifb$="_"orb$="m"orb$=""goto60030
50050 b$=left$(b$,13)+".3d,s":return
50060 -directory-
50100 print:sysba+1649
50110 wait198,1:poke198,0:goto60030
59999 -exit-
60000 end
60010 -----
60020 if(aporal)<>0thenprintc$:sysba:sysdr
60030 pokev+21,0:poke198,0:clr:ap=peek(3):al=peek(4):dw=peek(191)*4:goto130
60040 -----
60050 fori=0tow:geta$:ifa$=""thennext
60060 return
Listing 4. Basic-Editor-Programm »3D-EDIT«
100 poke3,0:poke4,0:sys2^14
130 v=53248:p=~/40:d=256:m=40
150 ba=2^14:l=ba+3:in=ba+6:se=ba+12:vp=ba+15:pl=ba+18:nr=ba+21
160 sq=ba+24:lq=ba+27:ip=ba+30:dp=ba+33
170 il=ba+36:dl=ba+39:dr=ba+42
190 p1=20736:p2=20992
200 xs=19456:ys=19712:zs=19968
210 sx=11:sy=10
1000 mm=m/2
1010 fori=-mtomstepint(2*m/(sy-1)):forj=-mtomstepint(2*m/(sx-1))
1020 z=int(sin(j*p)*mm+sin(i*p)*mm)
1030 z=z-d*(z<0)
1040 sysse,j-d*(j<0),i-d*(i<0),z
1050 nextj,i
1060 :
1070 :
1080 :
2000 fori=0tosy-1
2010 forj=0tosx-2
2020 sysvp,j+i*sx,j+i*sx+1
2030 nextj,i
2040 :
2100 fori=0tosy-2
2110 forj=0tosx-1
2120 sysvp,j+i*sx,j+(i+1)*sx
2130 nextj,i
2140 :
3000 sysba:sysdr
Listing 5. Demo-Programm zur Grafik-Animation
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →