JK's Gra-Ext Grafik-Erweiterung für BASIC
GRA-EXT 1.27 Fill-Routinen-Demonstration
Beispiel

Neuigkeiten

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.

Autor

Johann E. Klasek

Geschichtliches

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.
Der Source-Code wurde nun für den ACME-Makroassembler ataptiert und auf dieser Basis weiterentwicklt:

Dokumentation

Source

Rechtliches

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.

Download

Aktuelle Version: 1.34

  1. ge.prg - GRA-EXT aktuelle Version (Binary, CBM-Programmformat, Startadresse 49152 bzw. $C000)
    Verwendung:
    LOAD "GE",8,1
    SYS49152
    NEW
    &U
    

    Mit &U wird ein durch NEW gelöschtes BASIC-Programm wieder hergestellt.

  2. ge+.prg - GRA-EXT aktuelle Version (geschwindigkeitsoptimiert) (Binary, CBM-Programmformat, Startadresse 49152 bzw. $C000)
    Verwendung:
    LOAD "GE+",8,1
    SYS49152
    NEW
    &U
    
  3. ge-run.prg - GRA-EXT aktuelle Version als BASIC-Installer (Binary, CBM-Programmformat)
    Verwendung:
    LOAD "GE-RUN",8
    RUN
    
  4. ge-run+.prg - GRA-EXT aktuelle Version als BASIC-Installer (geschwindigkeitsoptimiert) (Binary, CBM-Programmformat)
    Verwendung:
    LOAD "GE-RUN+",8
    RUN
    
  5. D64-Image Distribution GRA-EXT (Binary, Basic-Loader, Demos)
    Binary: "GE" belegt den Bereich $C000-$CA9D (aktuelle Version)
    Run-Binary: "GE-RUN" belegt den Bereich $0801-$12BB (aktuelle Version)
    Alt-Binary: "G-EXT18" (Version 1.18) 1987
    Verwendung: (z.B. für DEMO1)
    LOAD "DEMO1",8
    RUN
    
    Lädt die Erweiterng (Datei "GE") und startet diese mit SYS49152 automatisch!
  6. Inhalt:

    0 "gra-ext         " jk 2a
    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
    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
    11    "ge-run          "  prg
    11    "ge              "  prg
    4     "gliding-lines   "  prg
    3     "kreise          "  prg
    3     "spirale         "  prg
    546 blocks free.
    	

Pläne

Beispiel

Listing:
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 return
Beispiel für Ausgaben als GIF-Animation:

Referenzen

  1. C64-Wiki.de: PAINT (Simons' BASIC)

 


Best viewed with any browser zurück zur Startseite