Magic Disk 64

home to index to text: MD8912-KURSE-GRAFIKKURS_TEIL_1-3.txt
MD8912-KURSE-GRAFIKKURS_TEIL_1-3.koala.png
           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 !

Valid HTML 4.0 Transitional Valid CSS!