JK's Gra-Ext Grafik-Erweiterung für BASIC |
2024-08-11 Neue Demos: Kreise+Ellipsen, Blume
2022-04-24 Version 1.34: Fill-Befehl (&F) Code bereinigt, detaillierter dokumentiert, etwas geschwindigkeitsoptimiert.
2022-03-28 Version 1.33: Fill-Befehl (&F) korrigiert und geschwindigkeitsoptimiert.
Das Projekt hat seinen Ursprung im Jahr 1984, als sich die Enttäuschung wegen der bei den etablierten BASIC-Erweiterungen zum Teil recht sehr gemächlichen Arbeitsweise der Grafikroutinen breit machte.
Schon alleine das Zeichnen einer Linie, war enorm aufwendig und die Implementierungen waren weit davon entfernt, moderne Algorithmen, wie Bresenhams Line-Algorithmus, zu verwenden, geschweige denn effizient umzusetzen. Ein Listing, namens Spiralizer im Compute! Magazine (USA), brachte zwar Assembler-Routinen mit, die das Linienzeichnen übernahmen, allerdings implementiert mit aufwändiger Multiplikations- und Divisionsarithmetik.
Später kamen auch die Commodore Modelle C16 und Plus/4 auf den Markt, wo das BASIC 3.5 etlichen grafische Befehle integriert hatte. Auch hier folgte nach Analyse der Routinen eine Ernüchterung hinsichtlich der bescheidenen, eigentlich miserablen Implementierung.
Die zu dieser Zeit von mir bevorzugte Programmiersprache Forth zusammen mit aufkommenden Publikation zur effizienten Implementierung grafischer Routinen (etwa für Apple II) in Zeitschriften und in Grafik-Büchern, waren der Auslöser das wirklich effizient umzusetzen. Erst experimentell in Forth programmiert, dann mit dem Forth-Assembler auch in Maschinensprache implementiert, waren die ersten Grafikroutinen für Punktsetzen, Pixel abfragen und Linienzeichnen (mit Speziallfällen für vertikale und horizontale Linien) geschaffen. Dieser waren nicht nur unter Forth schnell (Programm laufen etwas 10x so schnell wie entsprechende BASIC-Varianten), sondern generell deutlich flotter.
Die kompakte und überschaubare Grafikroutinen waren aber mit Forth ziemlich isoliert in der Verwendung. Bei der IFABO '85 hatte eine Demo bei manchen doch Aufmerksamkeit erregt (ohne offiziellen Charakter). Um eine breitere Nutzung zu erlauben, mussten die Routinen als BASIC-Erweiterung realisiert werden. Der Maschinencode der bestehenden Routinen (ursprünglich aus Forth-Assembler-Source) wurde 1986 mit Hilfe eines Monitors adaptiert (Relokation in einen neuen Adressbereich und andere Zeropage-Verwendung) und mit entsprechendem Glue-Code für die Integration in den BASIC-Interpreter des C64 ausgestattet.
Der erste praktische Einsatz waren diverse Programme für die Visualisierung von statistischen Daten für die Maturazeitung (1986).
Zu dieser Zeit war die Erweiterung bei Version 1.17 angelangt und erfuhr dann einige Jahre später noch eine Schönheitskorrektur (Befehlssyntax) als Version 1.18, die auch in kleinem Kreis verbreitet wurde.
Eine Neuaufnahme des Projekt war dann im Zuge des LTC64 Beschleunigungboards, um dort von Haus aus eine Grafikerweiterung mitzubringen, die bereits im ROM/EEPROM vorliegen sollte. Etwaige Hardware-Spezialitäten sollen berücksichtigt werden, u.a. damit auch die Routinen möglichst mit der vollen CPU-Frequenz (4 MHz) arbeiten.
Interessant wäre zwar auch eine echte 16-Bit-Implementierung der Routinen für den Native-Mode der 65C816-CPU, was aber einen massiven Aufwand und faktisch komplettes Neuschreiben der Routinen bedeuten würde und deren Umsetzung noch ein weiterer Ferne liegt.
Es ist allerdings nicht unbedingt ein besonderer Vorteil aus den 16-Bit-Möglichkeiten abzuleiten, da die Manipulationen in der Bitmap ohnehin immer 8-Bit-orientiert sind und die Berechnungen kaum 16-Bit-Arithmetik erfordern. Der hauptsächliche Geschwindigkeitsvorteil wird veraussichtlich von der höheren Taktfrequenz zu erwarten sein.
Der Source-Code wurde nun für den ACME-Makroassembler ataptiert und auf dieser Basis weiterentwicklt:
Die Software ist lizenzfrei.
Sonstige Bedingungen: Die Programme und Dateien können frei verwendet, kopiert und verteilt werden, solange etwaige Hinweise zum Autor erhalten bleiben.
Aktuelle Version: 1.34
LOAD "GE",8,1 SYS49152 NEW &U
Mit &U wird ein durch NEW gelöschtes BASIC-Programm wieder hergestellt.
LOAD "GE+",8,1 SYS49152 NEW &U
LOAD "GE-RUN",8 RUN
LOAD "GE-RUN+",8 RUN
LOAD "DEMO1",8 RUNLädt die Erweiterng (Datei "GE") und startet diese mit SYS49152 automatisch!
Inhalt:
0 "gra-ext " jk 2a 3 "blume " prg 33 "butterfly-test " prg 1 "debug " prg 3 "demo-h-v " prg 2 "demo-star " prg 2 "demo-test-1 " prg 2 "demo-v " prg 2 "demo1 " prg 2 "demo2 " prg 3 "ellipse " prg 2 "fill-all " prg 2 "fill-butterfly " prg 2 "fill-demo " prg 2 "fill-demo2 " prg 2 "fill-demo3 " prg 7 "g-ext18 " prg 11 "ge+ " prg 11 "ge-run+ " prg 12 "ge-run " prg 11 "ge " prg 4 "gliding-lines " prg 2 "kreis-ellipse " prg 2 "kreis " prg 3 "kreise " prg 3 "spirale " prg 535 blocks free.
5 rem fill demo: frame cloud filling 6 rem 2016-08-12 johann # klasek at 7 ifpeek(49153)+peek(49154)<>21thenload"ge",8,1 8 ifpeek(49153)+peek(49154)=21thensys49152 10 &g 1,13,0: poke 53280,5: &s 1 15 i=rnd(-ti) 20 for i=1 to 70 : rem draw random frames 30 x=rnd(1)*270+10 35 y=rnd(1)*160+10 40 gosub 100 50 next 60 &f 0,0 : rem flood fill everything around them 70 for i=1 to 2000: next : rem wait 80 &s0: &f 0,0 : rem vanishing it with fill 85 for i=1 to 500: next : rem short wait 90 goto 20 100 &h x,y,30,20 101 &s 0 102 &h x+1,y+1,28,18 103 &s 1 104 returnBeispiel für Ausgaben als GIF-Animation:
zurück zur Startseite |