Teil 3 Grafikkurs
Ich habe Ihnen hier auch noch gerade
( anhand des 8 . Bytes des UFO-Sprites aus
Grafik 1) ein kleines Beispiel geliefert, wie die umgerechenete Zahl für
dieses Byte aussehen sollte. Nachdem wir
nun alle Bytewerte ( jeweils 3 Stück pro
Zeile, mal 21 Zeilen, macht insgesamt 63 Bytes) unseres kleinen Sprites berechnet
haben müssen wir diese Werte zeilenweise
direkt in den Speicher unseres 64 ers
schreiben, also in der Reihenfolge :
1. Byte = 1. Zeile links 2. Byte = 1. Zeile mitte 3. Byte = 1. Zeile rechts 4. Byte = 2. Zeile links 5. Byte = 2. Zeile mitte
. . . und so fort. . .
Hierbei stellt sich ein neues Problem.
Nämlich das, daß BASIC V2 .0 in keinster
Weise die Spriteprogrammierung, bezie- hungsweise die Grafikprogrammierung im
allgemeinen, unterstützt. Wir müssen uns
die Speicherbereiche, in die wir die
Bytewerte schreiben wollen, also selbst
aussuchen. Doch das kann sich als äußerst schwierig und aufwending erweisen, wie Sie im folgenden erkennen werden:
Das Problem ist nämlich, daß prinzipiell
ALLE Speicherbereiche in unserem 64 er
schon für bestimmte Aufgaben reserviert
sind. Die Entwickler der 64 ers haben uns
da zwar doch noch ein wenig Handlungsfreiheit geschaffen, und haben da
tatsächlich noch 4 Speicherbereiche für
Sprites übriggelassen. Möchte man nun
allerdings mehr als 4 verschiedene Sprites gleichzeitig auf den Bildschirm
bringen, so kommt man da ganz schön in
die Bredouille. Man scheitert nämlich
ganz einfach an Speicherplatzmangel.
Doch keine Panik - auch dieses Problem
ist mit einigen Tricks zu lösen, die ich
Ihnen später, wenn wir HIRES-Grafik und
Zeichensätze behandeln, näher erläutern werde. Zunächst einmal wollen wir uns
einmal um die eben genannten 4 Speicherbereiche kümmern, da diese für unseren
momentanen Wissensstand vollkommen ausreichen. Diese 4 Bereiche liegen innerhalb der ersten 1024 Bytes unseres Computers. Wie ich im fünften Basickurs
schon erwähnte, sind diese Speicherstellen hauptsächlich für Computerinterne
Funktionen reserviert, und durch uns nur
begrenzt nutzbar. Diese Einschränkung
gilt nun auch in unserem Fall. Die 4 Speicherbereiche von je 63 Bytes Länge
existieren zwar, jedoch dürfen die letzten 3 davon ( siehe Tabelle unten) von
uns nur dann benutzt werden, wenn wir
nicht mit der Datasette, einem Kasettenlaufwerk also, arbeiten. Da ich allerdings davon ausgehen kann, daß Sie, als
Magic Disk Leser bestimmt NICHT mit der
Datasette arbeiten, sonst könnten Sie
diesen Artikel hier nämlich gar nicht
lesen, stellt dies also für uns nur ein
geringes Problem dar. Doch nun endlich zur Lage dieser 4 Bereiche. Hier eine
Öbersicht :
Von Bis Spriteblock Nr.
704- 766 11 832- 894 13 896- 958 14 960-1022 15
Die letzte Angabe dieser Tabelle dürfte
Sie vielleicht stutzig machen, da ich
die Spriteblocks bisher noch nicht
erwähnte. Eine Spriteblocknummer brauchen wir, um dem VIC angeben zu können, aus welchem Speicherbereich er sich nun
die 63 Datenbytes für das darzustellende
Sprite holen soll. Die Blocks sind alle
numerisch geordnet, gehen also von 0 bis
255 . Geben wir dem VIC nun an, daß er
sich die Spritedaten für ein Sprite aus
dem Block Nummmer 11 holen soll, so berechnet er sich die " wahre" oder auch
" absolute" Speicheradresse, in der das erste Datenbyte steht ( bei Block 11 wäre
das Speicherzelle 704, wie aus obiger
Tabelle ersichtlich), indem er intern
die Blocknummer mit 64 multipliziert. So
wissen Sie also, daß Spritedaten nicht
einfach wahllos im Speicher unseres
64 ers abgelegt werden können, sondern
IMMER bei einem Produkt von 64 beginnen
sollten (11*64=704) .
Ein Spriteblock mit der Nummer 51 würde
somit also bei Adresse 3264 beginnen, einer mit der Nummer 154 bei Adresse
9856- dies nur einmal als Beispiel.
Nun geht es uns darum, unsere Daten erst
einmal in die entsprechenden Speicherbereiche zu schreiben. Wir hatten ja unser
kleines UFO-Sprite in Dezimalwerte zerlegt, die wir nun irgendwo unterbringen
müssen. Sie könnten sich nun hinsetzen
und mit Hilfe des POKE-Befehls Byte für
Byte in den Speicher schreiben. Einfacher geht es jedoch mit Hilfe von READ
und DATA. Sie erinnern sich hoffentlich
noch an diese beiden Befehle, aus dem BASIC-Kurs. Wir legen unsere Daten jetzt
nämlich ganz einfach in ein paar DATA-Zeilen ab, lesen sie durch eine Schleife
Byte für Byte ein und schreiben sie
gleichzeitig in einen der 4 oben genannten Speicherbereiche. Wie wäre es denn
mit Spriteblock 13 ! Er ersteckt sich
von Byte 832 bis einschließlich Byte
894 . Hier also unser kleines Programm :
10 FOR I=0 TO 62 :REM 63 DATENBYTES! 20 READ A 30 POKE 832+I,A 40 NEXT I 50 : 60 DATA 0,0,0,0,24,0,0,126,0 70 DATA 1,255,128,7,255,224,30,102,120 80 DATA 54,102,108,54,102,108,31,255,248 90 DATA 7,255,224,1,255,128,1,129,128 100 DATA 3,0,192,3,0,192,6,0,96 110 DATA 6,0,96,12,0,48,127,0,255 160 DATA 0,0,0,0,0,0,0,0,0
Wir zählen also mit der Laufvariablen I von 0 bis 62( insgesamt 63 Durchgänge!) . Es wird nun ein Datenbyte eingelesen und gleich geschrieben, angefangen
bei Adresse 832( Basisadresse 832 plus
0) bis 894(832 plus 62) .
Nachdem wir nun die Daten abgelegt hätten kommen wir zum zweiten Schritt : VIC
muß ja noch wissen, aus welchem Spriteblock er sich die Spritedaten holen
soll. Hierzu sind acht Speicherzellen
zuständig, die sich im Bereich von
2040-2047 finden. Für jedes Byte haben
wir eine Speicherzelle.2040 für Sprite 0,2041 für Sprite 1,2042 für Sprite 2, und so fort, bis Byte 2047 für
Sprite 7 .
Wir wollen einmal Sprite 0 auf den Bildschirm bringen. Hierzu müssen wir die
Blockadresse in Zelle 2040 schreiben.
Unsere Daten liegen ja im Spriteblock 13, also:
POKE 2040,13
Soweit - so gut. Trotzdem haben wir noch
nicht alle Hindernisse hinter uns gebracht. Des Weiteren müssen wir nämlich, um das Sprite auf dem Bildschirm zu sehen, dem VIC sagen, daß er es für uns
dort anzeigen soll. Wir müssen es quasi
" einschalten" . Hierfür ist das VIC-Register 21 zuständig. Es steuert das
Einschalten aller 8 Sprites. Dies wird
folgendermaßen gehandhabt: Jedes der 8 Bits in diesem Register ist zuständig
für ein Sprite. Ist es gesetzt ( hat also
den Wert 1), so ist sein zugehöriges
Sprite eingeschaltet, ist es gelöscht
(= Wert 0) so ist das Sprite ausgeschaltet. Hier eine Tabelle der Zuständigkeit
der Bits:
--------------------------------------- Bit 7 6 5 4 3 2 1 0 Sprite 7 6 5 4 3 2 1 0 Wert 128 64 32 16 8 4 2 1 ---------------------------------------
Möchte man also mehrere Sprites einschalten, so muß man die Werte ihrer zugehörigen Bits addieren und in Register 21 schreiben. Wollten wir also
beispielsweise Sprite 6 und Sprite 2 einschalten, so wäre der Wert für Register 21 des VIC:64+4=68 .
Da wir jedoch lediglich Sprite 0 auf den
Bildschirm bringen wollen, genügt es, den Wert 1 in Register 21 zu schreiben.
Damit wir übrigens keine Probleme mit
der umständlchen Berechnung der Register
bekommen, definieren wir ganz einfach
eine Variable mit Namen V - für VIC - mit dessen Basisadresse (53248) . Mit
dieser Sequenz schalten wir also unser
Sprite ein:
V=53248 POKE V+21,1
Natürlich hätten Sie im POKE-Befehl auch
gleich eine absolute Adresse angeben
können ( für Register 21 nämlich 53269),
die andere Schreibweise vereinfacht jedoch die Arbeit mit Registern und ist
zudem auch noch viel übersichtlicher.
Sicher ist Ihnen nun aufgefallen, daß
unser Sprite immer noch nicht auf dem
Bildschirm erschienen ist. Doch keine
Panik, Sie haben hier nicht unbedingt
etwas falsch gemacht - Sprite 0 ist nämlich schon da, nur wir sehen es nicht, weil es sich noch versteckt hält ! Normalerweise sollte es sich nun, wenn Sie
ihren 64 er frisch eingeschaltet haben, an der Position 0/0 des Bildschirms befinden. Womit wir schon gleich beim Thema wären. Wie Sie aus der Register-Tabelle schon entnehmen konnten, können
wir mit Hilfe der ersten 16 VIC-Register
die Koordinaten für jedes der 8 Sprites
angeben. Hierzu haben wir zwei Koordinaten : Zum Einen die X-Koordinate, die
angibt, um wieviele Bildschirmpunkte das
Sprite vom linken Bildschirmrand vesetzt
sich aufhält, und zum Anderen die Y- Koordinate, die angibt um wieviel Bildschirmpunkte vom oberen Bildschirmrand
versetzt, sich das Sprite befinden soll.
Dies alles wird auf den ersten Punkt des
Sprites ( ganz links oben) bezogen.
Der Grund, warum wir das Sprite nicht
sehen können, liegt darin, daß der Bildschirm, so wie wir ihn sehen, nicht etwa
an der Nahtstelle Rahmen/ Hintergrund
beginnt, sondern daß eher ein Teil des
Bildschirms, durch den Bildschirmrahmen
überlagert, für uns nicht sichtbar ist.
Somit befindet sich also unser kleiner
Freund zwar auf dem Bildschirm, jedoch
unter dem Rahmen versteckt !