Hallo,
mit meinem "Hokube" Intro habe ich einen Bresenham-Algorithmus erstellt, den ich in der Zwischenzeit verbessert habe. So kann der sogenannte (Bresenham-)Fehler nun jenseits von +/- 128 liegen, obwohl die Fehlerberechnung 8-bitig bleibt. Das hat auch zur Folge, dass Linien kein Delta x > 255 haben können. Es ist aber problemlos möglich, Linien zu ziehen, die <255 anfangen und >255 aufhören und umgekehrt. Der Bresenham setzt auf dem Plot-Algorithmus im C64 Intern auf.
Im Assembler-Code steckt noch viel Optimierungspotential. Aber übertragen auf Basic ist es wie Lichtgeschwindigkeit.
Ich wollte immer schon in Basic Punkte und Linien schnell ziehen können und mich nicht totwarten müssen weil ich die Bitmap mit Basic beschreibe.
Also habe ich mein Linienprogramm in einen Basic-Starter eingebunden und ein zweites Beispielprogramm gebaut das zeigt, wie man die neuen Funktionen nutzen kann:
1.) load"linecmd.prg",8
2.) run
3.) warten bis Erfolgsmeldung
4.) load"ltst4.prg",8
5.) run
Wenn ihr ltst4.prg listet, seht ihr, dass das Unterprogramm 2000 sich um Linien kümmert und 3000 um Punkte. Die Parameter-Übergaben seht ihr an den Beispielen ab Zeile 20. Die Routine 1000 bringt uns nach gedrückter beliebiger Taste wieder ins Basic zurück von wo aus wir unseren Basic Code ändern und erneut mit run starten können.
Linien kann man ziehen von x=1 bis y=320 und y=1 bis y=200. "0" geht nicht.
Punkte kann man setzen von x=1 bis x=318 und y=1 bis y=199. Diese Einschränkuing bringt der Plot-Algorithmus aus dem C64 intern mit. Ich habe das auch erst bemerkt, als ich zum Testen den Rahmen umgefärbt habe um die Genauigkeit an den Rändern zu prüfen.
Ich habe also bei Linien in x- und y-Richtung 1 Pixel Versatz. Dafür ist es schnell und präzise genug für Graphen und Formen. Mit Fließkommawerten wird es genau (der gleiche Bresenham in Basic ist auf den Punkt exakt) aber langsam.
Mit poke 49153,0 sorgt man dafür, dass jeder Aufruf des Linienprogramms dazu führt, dass die Bitmap gelöscht wird. poke 49153,1 sorgt dafür, dass der Bitmap-Inhalt stehen bleibt, auch nach Programmende und mit erneutem Ändern und run im Bild weiter gemalt werden kann.
Man muss ein Folge-Programm wie ltst4.prg immer zuerst mit einem Linienaufruf (2000) starten, denn das initialisiert automatisch die Grafik. Ein Aufruf der Plot-Routine setzt zwar den Punkt in der Bitplane, sorgt aber nicht für einen Wechsel in den Grafikmodus. Ich gehe davon aus, dass man als erstes ein Koordinatensystem malt und dann erst plottet.
Adressen:
Das Linienprogramm liegt ab $4000. Die Bitmap ab $2000, der Bildschirm bei $0400. $c001 habe ich reserviert als Flag zum Löschen/nicht Löschen der Bitmap beim SYS Aufruf des Linienprogramms. Die Plot-Routine innerhalb des Linienprogramms liegt bei $4260.
Natürlich ist es am C64 in V2 Basic nicht so toll zu zeichnen wie am CPC, aber es gibt eben dennoch einen Weg, die Rechenpower des V2 Basic mit schnellen Punkt- und Linienroutinen zu verbinden. Auf USR habe ich vorerst verzichtet. Vielleicht mache ich demnächst mal einen eigenen BASIC Befehl.
Ich hoffe der ein oder andere kann das vorliegende Linien-Programmpaket in V2 Basic für eigene Experimente nutzen.
- 1 rem ltst4.prg - testprogramm vincent truppe 2017
- 10 x1=1:y1=100:x2=255:y2=100:gosub 2000 : rem 2000 = linie
- 17 poke 49153,1 : rem weiter machen ohne bitmap zu löschen
- 20 x1=255:y1=100:x2=320:y2=100:gosub 2000
- 21 x1=50:y1=50:x2=305:y2=165:gosub 2000
- 22 x1=160:y1=1:x2=160:y2=200:gosub 2000
- 23 x1=106:y1=66:x2=212:y2=66:gosub 2000
- 24 x1=106:y1=132:x2=212:y2=132:gosub 2000
- 25 x1=106:y1=66:x2=106:y2=132:gosub 2000
- 26 x1=212:y1=66:x2=212:y2=132:gosub 2000
- 27 xa=300:ya=50:gosub 3000 : rem 3000 = punkt
- 996 rem poke 49153,0 : rem bitmap löschen bei nächstem run
- 997 get a$:if a$="" then 997
- 998 gosub 1000 : rem 1000 = back2basic
- 999 end
- 1000 poke 53265,peek(53265)and223 : rem bit 5 hires aus
- 1001 poke 53272,peek(53272)and247 : rem bit 3 obere bpl aus
- 1002 poke 53280,14 : rem rahmen blassblau
- 1003 print chr$(147) : rem bs loeschen
- 1004 return
- 2000 rem x1,y1,x2,y2
- 2034 if x1>255 then b=1:x1=x1-255:goto 2038
- 2035 b=0
- 2038 if x2>255 then e=1:x2=x2-255:goto 2040
- 2039 e=0
- 2040 poke1024,x1:poke1025,b:poke1026,y1:poke1027,x2:poke1028,e:poke 1029,y2
- 2050 sys 16384
- 2060 return
- 3000 rem xa,ya
- 3034 if xa>255 then b=1:xa=xa-255:goto 3040
- 3035 b=0
- 3040 poke237,xa:poke228,b:poke238,ya1
- 3050 sys 16992
- 3060 return