Magic Disk 64

home to index to html: MD9003-KURSE-GRAFIKKURS_TEIL_4-3.html
MD9003-KURSE-GRAFIKKURS_TEIL_4-3.koala.png
          Grafik-Kurs Teil 4c           
Sollten Sie jetzt immer noch nicht durch
dieses  recht  komplizierte  System  des
Grafikaufbaus  durchgestiegen  sein,  so
macht das auch nichts. Gleich werden wir
lernen,  wie  der  Grafikbildschirm ein-
und ausgeschaltet  wird.  Wenn  Sie  das
einmal  können  (und  das  ist sehr ein-
fach), dann können  Sie  ja  einmal  ein
wenig  herumexperimentieren  - nur Öbung
macht halt den Meister...               
Doch nun zu den begehrten  Befehlen,  um
den Grafikbildschirm einzuschalten. Wie-
dereinmal handelt es sich hierbei um ein
paar POKEs, mit denen wir  einige  Regi-
ster im VIC verändern, so daß der uns   
die Grafik dann darstellt.              
Zum  Einen  brauchen  wir  hierfür   das
Steuerregister  1,  in  Register  17 des
VIC. Neben einigen  anderen  Dingen  (zu
denen  wir später, beim Zeichensatz kom-
men) können wir hier nämlich den Grafik-
modus  einschalten.  Bit  5 dieses Regi-
sters  ist  hierfür  zuständig.  Ist  es
gelöscht  (=Binär 0), so ist der Grafik-
modus aus-, ist es gesetzt (=Binär 1) so
ist er eingeschaltet. Demnach müssen wir
es einfach mit  Hilfe  des  OR-Operators
setzen  (sie erinnern sich an den Anfang
dieses Kurses...) - Bit 5 hat den  dezi-
malwert 32, also:                       
POKE V+17,PEEK(V+17) OR 32              
Analog  müssen  wir  es  zum Ausschalten
wieder löschen. Dies geht entweder,  in-
dem  man  direkt  das  Komplement von 32
bildet (255-32=223) und es dann mit Hil-
fe  des  AND-Operators  mit  Register 17
verknüpft; oder man kombiniert ganz ein-
fach  AND  mit  NOT (das hatten wir auch
schon), was ja dasselbe ergibt, also:   
POKE V+17,PEEK(V+17) AND 223            
oder auch:                              
POKE V+17,PEEK(V+17) AND NOT 32         
Alle POKE-Befehle, die ich  eben  nannte
müssen   natürlich   die   Voraussetzung
erfüllen, daß Sie  vorher  die  Variable
"V" mit der Basisadresse des VIC initia-
lisiert (also: V=53248) haben - das hat-
ten wir ja auch schon im ersten Teil des
Grafikkurses.                           
Soviel zum Einschalten  des  Grafikbild-
schirms.  Doch das ist leider noch nicht
alles. Um nämlich wirklich den Speicher-
bereich von 8192 bis 16191 auf dem Bild-
schirm zu sehen, müssen wir dem VIC noch
eine weitere  Information  geben.  Diese
ist  in  seinem 24. Register beinhaltet.
Bit 3 in diesem Register gibt ihm  unter
anderem  (nämlich dann, wenn der Grafik-
modus eingeschaltet ist - im Normalmodus
hat es wieder eine  andere  Funktion  zu
der  wir ebenfalls später kommen werden)
an, welcher Speicherbereich  als  HIRES-
Grafik  dargestellt  werden soll. Ist es
gelöscht (und das ist  im  normalerweise
der  Fall), so heißt das für den Grafik-
chip unseres 64ers, daß er den Speicher-
bereich  von 0 bis 7999 als HIRES-Grafik
darstellen soll. Damit wir aber auch den
zweiten Grafikbereich von 8192 bis 16191
(denn diesen Bereich nutzen wir ja)  se-
hen  können,  müssen  wir  das 3. Bit im
Register 24 setzen. Dann zeigt  uns  VIC
nämlich  diesen  Bereich  an.  Auch dies
geht mit dem OR-Operator, nämlich so:   
POKE V+24,PEEK(V+24) OR 8               
Beim Ausschalten des Grafikmodus  müssen
wir neben der Grafik-Ausschalt-Anweisung
von  oben  ebenfalls  dieses  Bit wieder
löschen, sonst zeigt VIC keine  Buchsta-
ben  mehr auf dem Bildschirm an (das hat
etwas mit der  schon  erwähnten  zweiten
Funktion  des  3. Bits zu tun). Zum Aus-
schalten schreiben wir also:            
POKE V+24,PEEK(V+24) AND 247            
oder einfacher:                         
POKE V+24,PEEK(V+24) AND NOT 8          
So. Nun können Sie endlich den Grafikmo-
dus  des  VIC  aktivieren.  Sie  sollten
jetzt  - bei frisch eingeschaltetem 64er
- einen  Haufen  wirre  Punkte  auf  dem
Bildschirm  sehen.  Falls  Sie  übrigens
vorher irgendein Spiel, oder  Grafikpro-
gramm  geladen hatten (und mit einem RE-
SET ausgestiegen sind - ohne den Rechner
also abzuschalten), so kann es sein, daß
sie sogar eine Titelgrafik  oder  ähnli-
ches  hier  entdecken  können. Das liegt
dann einfach daran,  daß  das  vorherige
Programm seine Grafik auch hier abgelegt
hatte.                                  
Wie  dem  auch  sei, nun können Sie also
DIREKT auf die  Grafik  zugreifen  (geht
vorher  natürlich auch, nur daß Sie dann
noch keine Veränderungen auf  dem  Bild-
schirm  sehen).  Sie sehen nun die Bytes
von 8192 bis 16191  auf  dem  Bildschirm
grafisch dargestellt. Schreiben Sie doch
einfach  mal  mittels POKE einen Wert in
Byte 8192. Wenn Sie nicht zufällig  den-
selben  Wert  benutzten,  der hier schon
beinhaltet war, dann sollten Sie  erken-
nen, daß sich in der Ecke links oben, in
der  ersten  Zeile  etwas verändert hat,
als Sie die RETURN-Taste zur  Ausführung
des POKE-Befehls drückten.              
Öbrigens: sollten Sie auf dem Bildschirm
außer den Grafikpunkten auch noch  dicke
Farbige Quadrate sehen, oder sollten die
einzelnen Punkte der Grafik verschiedene
Farben  aufweisen,  so  liegt das daran,
daß   der   normale   Bildschirmspeicher
(hierzu später), in dem die ganzen Buch-
staben gespeichert sind, die Sie im Nor-
malmodus sehen, im Grafikmodus als Farb-
speicher für die einzelnen  Punkte  fun-
giert.  Löschen  Sie doch einfach einmal
den   Bildschirmspeicher   mit    SHIFT-
CLR/HOME. Jetzt sollten Sie alle Grafik-
punkte in der selben Farbe  sehen.  Wenn
Sie  jetzt  einmal ein paar Worte einge-
ben, so werden Sie einen Farbzug  sehen,
der  sich  mit dem Tippen eines Buchsta-
bens um 8 Punkte verlängert - obwohl Sie
die getippten Buchstaben nicht sehen... 
Zur Erklärung dieses Phenomens, muß  ich
etwas  tiefer  in die Kiste greifen, und
möchte Sie bitten, den  Grafikmodus  no-
cheinmal auszuschalten.                 
Kommen wir zum  Bildschirmspeicher.  Ich
hatte diesen ja schon unzählige Male bei
Speicherbereichsauflistungen    erwähnt.
Dabei sagte ich, daß sich dieser ominöse
Speicher von Adresse 1024 bis  2023  er-
streckt.   Das  sind  genau  1000  Bytes
(zählt man von 0 an!).  Wie  Sie  sicher
wissen,  oder  auch  leicht  feststellen
können, ist  der  Textbildschirm  in  25
Zeilen   zu  je  40  Spalten  aufgeteilt
(huch! das war doch eben schon eimal der
Fall... so ein Zufall aber auch).  25*40
ergibt  genau  1000.  Sie können auf dem
Bildschirm also 1000 Zeichen  gleichzei-
tig  darstellen.  Klingelts  bei  Ihnen?
Genau!  Jede  Speicherstelle  des  Bild-
schirmspeichers  repräsentiert eine ganz
bestimmte Stelle (durch Zeile und Spalte
definiert) des Bildschirms, in  der  ein
Bytewert  gespeichert  ist,  der den VIC
dazu veranlasst ein ganz bestimmtes Zei-
chen auf dem Bildschirm darzustellen. Er
überprüft in regelmäßigen Abständen, was
in diesem Speicherbereich an Daten abge-
speichert ist und stellt diese  auf  dem
Bildschirm  in Form von Buchstaben (oder
Grafikzeichen) dar. Schreiben  Sie  doch
einmal  den Wert 1 in die Speicherstelle
1024. Jetzt sollten Sie  den  Buchstaben
"A" links oben auf dem Bildschirm sehen.
Probieren  Sie  doch einmal verschiedene
Werte durch, Sie werden  dann  die  ver-
schiedensten  Zeichen auf dem Bildschirm
sehen. Zur Demonstation habe  ich  Ihnen
diesmal  ein  kleines  Programm  auf der
Rückseite der  MagicDisk  abgespeichert,
das Ihnen alle Zeichen des 64ers auf dem
Bildschirm  ausdruckt.  Es  heißt "SHOW-
CHARS.GK und arbeitet nach der  Methode,
daß  es nacheinander die Werte von 0 bis
255 in den Bildschirmspeicher schreibt. 
Zum Aufbau bleibt noch zu sagen, daß wir
diesmal wieder zeilenweise arbeiten dür-
fen  (puuh - also nich son komplizierter
Kram wie eben). Die ersten 40 Bytes  des
Bildschirmspeichers   (1024-1064)   sind
also für die erste Zeile,  die  nächsten
40  (1064-1104)  für  die  zweite  Zeile
(usw.)  zuständig.  Experimentieren  Sie
doch  einfach  einmal,  indem Sie in die
Speicherstellen von 1024 bis  2023  ver-
schiedene Werte schreiben...            
Jetzt wissen Sie auch, wie die  Buchsta-
ben  von  den  Tasten Ihrer Tastatur auf
den Bildschirm kommen. Intern fragt  das
Betriebssystem  nämlich  ständig die Ta-
statur ab, ob Sie nicht gerade eine  Ta-
ste  gedrückt  haben. Ist dies der Fall,
so  sucht  es  sich  den  entsprechenden
"Bildschirmcode"  (so heißen nämlich die
Zahlen mit den dazugehörigen  Zeichen  -
ähnlich  wie  beim ASCII-Code) der Taste
aus einer Tabelle  heraus  und  schreibt
diesen in den Bildschirmspeicher, von wo
aus  ihn der VIC wieder in ein Videosig-
nal für Fernseher oder Monitor  umsetzt,
so  daß  er  schließlich und endlich auf
selbigem erscheint...                   
Doch  kehren  wir  von  den  Interna des
64ers zurück zu unserer Grafik:         
Der Bildschirmspeicher dient also norma-
lerweise zur Darstellung der  Buchstaben
auf dem Bildschirm. Im HIRES-Grafikmodus
sehen  wir  diese  jedoch  eh nicht, die
Grafik ist ja eingeschaltet. Bevor jetzt
also ganze 1000 Bytes  im  Speicher  des
64ers brach liegen benutzt VIC sie dazu,
den Punkten im Grafikmodus eine Farbe zu
geben  (sieht  doch  viel  besser aus!).
Jede Speicherstelle des  Bildschirmspei-
chers  kann nun genutzt werden, um einem
8x8-Pixel-Block gewisse  Farbinformatio-
nen zu geben (aha! also doch kein Zufall
mit   den   25x40  Zeichen...).  Hierbei
bleibt die  Zeilen-Spalten-Struktur  des
Bildschirmspeichers voll und ganz erhal-
ten!                                    
Die eigentliche Farbinformation in einem
solchen 8x8-Pixel-Block teilt  sich  nun
in 2 Komponenten, nämlich in Vorder- und
Hintergrundfarbe,  auf.  Wie Sie ja wis-
sen, kann der  64er  insgesamt  16  ver-
schiedene   Farben  darstellen.  Demnach
brauchen wir maximal 4 Bits (2↑4=16)  um
alle  verschiedenen Farben darstellen zu
können. Da uns in einem Byte  allerdings
8  Bit  zur Verfügung stehen, können wir
also quasi 2 verschiedene  Farbwerte  in
ein  Byte "packen". Und genauso wird das
gehandhabt. Der Farbwert für die Hinter-
grundfarbe  wird in den Bits 0-3 untege-
bracht, der für die Vordergrundfarbe  in
den  Bits 4-7. Zunächst jedoch noch ein-
mal die Farbtabelle (ich hatte sie  auch
schon  einmal  bei  den Sprites aufgeli-
stet), damit Sie die Farbwerte auch wie-
der im Kopf haben:                      
Wert Farbe         Wert Farbe           
----------------------------------------
  0  Schwarz         8  Orange          
  1  Weiß            9  Braun           
  2  Rot            10  Hellrot         
  3  Türkis         11  Dunkelgrau      
  4  Violett        12  Mittelgrau      
  5  Grün           13  Hellgrün        
  6  Blau           14  Hellblau        
  7  Gelb           15  Hellgrau        
Um nun beispielsweise  die  Hintergrund-
farbe auf "Grün" und die Vordergrundfar-
be auf "Braun" zu setzen, müssen wir die
Farbwerte  ins  Binärsystem  übersetzen,
und sie in 8-Bit-Schreibweise aneinander
hängen, also:                           
Vordergrund = dez. 9 = bin. 1001        
Hintergrund = dez. 5 = bin. 0101        
--> (bin.) 10010101 = (dez.) 149        
Oder Sie rechnen den Wert einfach so um,
daß sie den Farbwert der Vordergrundfar-
be (in den "höherwertigen" Bits 4-7) mit
16 multiplizieren und  den  Hintergrund-
farbwert   einfach  hinzuaddieren  (auch
dies hatten wir schon an früherer  Stel-
le):                                    
16*9+5=149                              
Schreiben  Sie  nun  diesen  Wert in die
erste Speicherstelle des Bildschirmspei-
chers (nämlich...na?...richtig! - 1024),
so werden im ersten 8x8-Pixel-Block alle
gesetzten  Punkte  in  braun erscheinen,
und alle nicht gesetzten  in  grün.  Die
Hintergrundfarbe  aus  Register  32 (aus
dem ersten Teil des  Grafikkurses)  gilt
hier  nicht  mehr! Alle Punkte, die also
nicht gesetzt sind (=Binär  0)  erhalten
ihre  Farbinformation jetzt aus den Bits
0-3 und alle gesetzten aus den Bits  4-7
der  entsprechenden  Bildschirmspeicher-
zelle.                                  
Soviel zur Farbgebung der Grafik. Kommen
wir nun noch einmal zurück zu  den  ein-
zelnen  Bildpunkten  auf dem Bildschirm.
Nachdem Sie  jetzt  ja  wissen  sollten,
woher  die dicken Farbkleckse herkommen,
wollen wir uns noch einmal um den Aufbau
des  Bildschirms  kümmern.  Als  letztes
Beispiel,  damit  Sie  diesen vielleicht
etwas besser verstehen, möchte ich Ihnen
jetzt zeigen, wie  man  den  Grafikbild-
schirm löscht, denn die wirren Punkte da
kann  man  ja  unmöglich  als ansehliche
Grafik bezeichnen. Um  also  Ordnung  zu
schaffen, müssen wir den Bildschirm erst
einmal löschen. Dieser Vorgang ist denk-
bar einfach:  wir  schreiben  mit  Hilfe
einer  FOR-NEXT-Schleife ganz einfach in
die 8000 Datenbytes unserer Grafik  (von
8192  bis  16191) den Wert 0 (das ist ja
binär 0000 0000,  wobei  dann  ja  keine
Punkte  mehr auf der Grafikseite gesetzt
sind!). Also:                           
FOR I=0 TO 7999:POKE 8192+I,0:NEXT      
Das  wärs  schon.  Natürlich  wäre diese
ganze Sache in Assembler  besser  geeig-
net,  zumal  diese  Schleife  (in BASIC)
schon eine geraume Zeit braucht, bis sie
vollends abgelaufen ist.  Doch  das  ist
momentan  gar nicht mal so schlimm, denn
so können Sie bildlich sehr  gut  sehen,
wie  der Grafikbildschirm aufgebaut ist.
Starten Sie doch einfach einmal das Pro-
gramm  "CLRGRAPH.BK" auf der Vorderseite
dieser MD. Es tut  nichts  anderes,  als
den  Grafikbildschirm  einzuschalten und
ihn dann zu löschen. Sie  werden  sehen,
daß  die  Bytes  nach und nach in den 0-
Status springen. Hierbei  "läuft"  quasi
ein  unsichtbarer  Radiergummi  über den
Bildschirm, und Sie  werden  sehen,  daß
alle  8x8-Pixel wieder die nächsten 8x8-
Pixel gelöscht werden und so fort...    
Ich  hoffe,  daß  Sie dieses Problem nun
endlich abhaken können (sollten  Sie  es
noch  nicht  verstanden  haben). Deshalb
kommen wir gleich noch zu einer weiteren
Spezialität der Grafik. Man kann nämlich
- genau wie bei den Sprites - auch  hier
den  "Multicolormodus" einschalten. Auch
hier funktioniert das etwa  ähnlich  wie
bei  den Sprites, zwei Bildpunkte werden
nämlich zu EINEM  zusammengefaßt,  deren
Gesamtinformation  dann  mit der Farbge-
bung zusammenhängt.  Sollten  Sie  nicht
mehr so genau wissen, was ich damit mei-
ne, dann sollten Sie noch  einmal  einen
Blick in den zweiten Teil des Grafikkur-
ses - MD64, Ausgabe 1/90 - werfen,  dort
steht  alles  noch einmal genau erklärt,
nur halt im Rahmen der Spriteprogrammie-
rung.                                   
Wie auch bei den Sprites geben hier  die
einzelnen  Bitkombinationen  dem VIC an,
welche Farbe er einsetzen soll. Hier die
vier möglichen Bitmuster und deren Farb-
quellen:                                
Bitmuster Farbquelle                    
----------------------------------------
  00      Hintergrundregister (53280)   
  01      Highnibble Bildschirmspeicher 
  10      Lownibble Bildschirmspeicher  
  11      Farbram                       
Zunächst  einmal zu den ersten 3 Einträ-
gen  dieser  Liste.  Im  Multicolormodus
ist,  wie man sieht, das Hintergrundfar-
bregister des VIC  (Nr.  32  -->  53280)
wieder  von  Bedeutung. Bei allen nicht-
gesetzten Punkten "scheint" diese  Farbe
also durch.                             
Nun zu dem Begriff  "Nibble".  Dies  ist
der  Fachausdruck  für  ein halbes Byte,
oder auch vier Bit. Mit "Lownibble"  ist
ganz  einfach  das "niederwertige" (Bits
0-3) Nibble  und  mit  "Highnibble"  das
"höherwertige"  (Bits  4-7) gemeint. Und
zwar jeweils des Bytes der dazugehörigen
Adresse  des  Bildschirmspeichers,  also
ähnlich  wie  bei  der  normalen 2-Farb-
Grafikdarstellung.                      
Jetzt zum vierten Eintrag der Bitmuster-
liste. Wenn die  beiden  Informationsge-
benden  Bits in der Grafikseite auf "11"
stehen (also beide gesetzt),  dann  wird
die  Farbinformation aus dem sogenannten
Farbram (oder englisch auch  "Colorram")
geholt.                                 
Doch was heißt das eigentlich. Auch hier
muß ich etwas weiter ausholen.  Wie  Sie
ja  wissen, kann jeder Buchstabe auf dem
Bildschirm  eine  von  16  verschiedenen
Farben annehmen. Drücken Sie doch einmal
die Tastenkombination CTRL-1 - schon ist
der  Cursor schwarz und alle mit ihm ge-
schriebenen Buchstaben ebenfalls. Schal-
ten  Sie  jetzt  eine  andere  Farbe ein
(z.B. Weiß, mit CTRL-2), so  wird  alles
was  sie  nun eingeben in der Farbe Weiß
dargestellt. Sie haben jetzt also  schon
2  verschiedenfarbige  Buchstabengruppen
auf dem Bildschirm. Das Spiel können Sie
auch gerne weitertreiben, bis  wir  alle
Regenbogenfarben  da so rumschillern ha-
ben. Klingelts bei Ihnen? Vorhin  hatten
wir  doch  gelernt, daß jeder Buchstabe,
den wir  auf  dem  Bildschirm  sehen  im
Bildschirmspeicher   untergebracht  ist.
Wenn jetzt  aber  jeder  Buchstabe  eine
andere  Farbe  annehmen kann, so ist die
logische Schlußfolgerung, daß es da noch
irgendwo einen weiteren  Speicher  geben
muß,  in  dem  diese Farbinformation ge-
speichert ist. Und  genau  das  ist  der
Fall!  Das  Ganze  nennt  sich (wie oben
schon  erwähnt)  Farbram,  und   besteht
ebenfalls  aus  1000 Bytes. Es erstreckt
sich von Adresse  55296  bis  56319  und
liegt  somit  im Ein-/Ausgabebereich des
Speichers.                              
Der Rest ist schnell gesagt, denn es ist
vom Aufbau haargenau identisch  mit  dem
Bildschirmspeicher  nur  daß  es halt an
einer anderen Adresse liegt als  dieser,
und  daß  es für die Farbgebung der Zei-
chen auf dem Bildschirm  zuständig  ist.
Wenn  Sie  also die (beispielsweise) 31.
Stelle des Farbrams (55296+31=55327) mit
einem  Farbwert  aus  der,  mittlerweile
schon  altbekannten,  Farbtabelle von 16
Farbwerten beschreiben, so erscheint der
31.  Buchstabe  des  Bildschirmspeichers
(1024+31=1055) in eben dieser Farbe.    
Nun verstehen Sie also auch  den  Zusam-
menhang  mit  der  Multicolorgrafik. Der
Farbwert,  der  im  Farbram  gespeichert
ist,  ist maßgebend für alle "11" kombi-
nationen in dem 8x8-Pixel-Block, für den
er zuständig ist (ebenso  wie  Low-  und
Highnibble des Bildschirmspeichers).    
Jetzt noch zum Einschalten des  Multico-
lor-Grafikbildschirms.   Diesmal  müssen
wir ebenfalls lediglich  ein  Bit  eines
VIC-Registers  setzen,  um ihn zu veran-
lassen, die Grafikinformationen  in  der
Multicolorweise  darzustellen. Genau ge-
sagt handelt es sich um Bit 4 des  Regi-
sters  22  (Adresse  53270). Die enspre-
chenden Befehle zum Ein- und Ausschalten
lauten demnach:                         
POKE V+22,PEEK(V+22) OR 16              
(--> zum Einschalten)                   
POKE V+22,PEEK(V+22) AND NOT 16         
(--> zum Ausschalten)                   
Vorausgestzt natürlich, daß die Variable
"V"  die  Basisadresse  des VICs enthält
(53248)!                                
So. Das wärs dann für diesen Monat.  Ex-
perimentieren  Sie  doch  einfach einmal
ein wenig mit dem  Grafikbildschirm  des
64ers  herum,  denn  nur so erhalten Sie
die routinemäßige Erfahrung, wie man mit
Ihm umgeht...                           
Ich  verabschiede mich dann bis nächsten
Monat, wenn wir uns dann  mit  der  Zei-
chensatzprogrammierung auseinandersetzen
wollen, bis dahin Servus,               
                    Ihr Uli Basters (ub)



Valid HTML 4.0 Transitional Valid CSS!