Magic Disk 64

home to index to html: MD8912-KURSE-GRAFIKKURS_TEIL_1-3.html
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  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 !            
Valid HTML 4.0 Transitional Valid CSS!