Teil 3 Grafikkurs ----------------------------------------
Ich habe Ihnen hier auch noch gerade (anhand des 8.Bytes des UFO-Sprites aus Grafik 1) ein kleines Beispiel gelie- fert, 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 64ers 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 64er schon für bestimmte Aufgaben reserviert sind. Die Entwickler der 64ers haben uns da zwar doch noch ein wenig Handlungs- freiheit geschaffen, und haben da tatsächlich noch 4 Speicherbereiche für Sprites übriggelassen. Möchte man nun allerdings mehr als 4 verschiedene Spri- tes 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 Speicher- bereiche kümmern, da diese für unseren momentanen Wissensstand vollkommen aus- reichen. Diese 4 Bereiche liegen inner- halb der ersten 1024 Bytes unseres Com- puters. Wie ich im fünften Basickurs schon erwähnte, sind diese Speicherstel- len 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 letz- ten 3 davon (siehe Tabelle unten) von uns nur dann benutzt werden, wenn wir nicht mit der Datasette, einem Kasetten- laufwerk also, arbeiten. Da ich aller- dings 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 brau- chen 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 be- rechnet 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 64ers 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 Speicherbe- reiche zu schreiben. Wir hatten ja unser kleines UFO-Sprite in Dezimalwerte zer- legt, 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. Einfa- cher 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 genann- ten 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än- ge!). Es wird nun ein Datenbyte eingele- sen und gleich geschrieben, angefangen bei Adresse 832 (Basisadresse 832 plus 0) bis 894 (832 plus 62). Nachdem wir nun die Daten abgelegt hät- ten kommen wir zum zweiten Schritt : VIC muß ja noch wissen, aus welchem Sprite- block 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 Spri- te 0, 2041 für Sprite 1, 2042 für Spri- te 2, und so fort, bis Byte 2047 für Sprite 7. Wir wollen einmal Sprite 0 auf den Bild- schirm bringen. Hierzu müssen wir die Blockadresse in Zelle 2040 schreiben. Unsere Daten liegen ja im Sprite- block 13, also: POKE 2040,13 Soweit - so gut. Trotzdem haben wir noch nicht alle Hindernisse hinter uns ge- bracht. Des Weiteren müssen wir nämlich, um das Sprite auf dem Bildschirm zu se- hen, 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 ausgeschal- tet. 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 ein- schalten, so muß man die Werte ihrer zu- gehörigen Bits addieren und in Regi- ster 21 schreiben. Wollten wir also beispielsweise Sprite 6 und Sprite 2 einschalten, so wäre der Wert für Regi- ster 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 je- doch 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äm- lich schon da, nur wir sehen es nicht, weil es sich noch versteckt hält ! Nor- malerweise sollte es sich nun, wenn Sie ihren 64er frisch eingeschaltet haben, an der Position 0/0 des Bildschirms be- finden. Womit wir schon gleich beim The- ma 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 Koordina- ten : 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 Bild- schirmpunkte 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 Bild- schirm, 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 !