Teil 5 Grafikkurs
----------------------------------------
Ich habe hier dann auch noch gleich eine
Wertigkeitstabelle für NOT angegeben.
Sie sehen, daß es sich hier etwas anders
verhält, als bei den beiden ersten Ope-
ratoren. NOT ist eigentlich auch gar
kein Operator, man stellt es nämlich
einfach nur einer Zahl voran. Was jetzt
geschieht ist folgendes : alle Bits die-
ser Zahl werden in ihr Gegenteil umge-
wandelt (0 ist nämlich NICHT (NOT) 1 und
somit das Gegenteil von 1 und umge-
kehrt). Auch hier wieder ein Beispiel :
NOT 1001 0110 (dez. 150)
------------------------
= 0110 1001 (dez. 105)
Ist doch ganz einfach, oder ?
Nun, wozu brauchen wir das denn, bei der
Spriteprogrammierung. Ich möchte da noch
einmal das Beispiel mit Register 16
strapazieren. Wir hatten ja gesagt, daß
in diesem Register jedes Sprite ein ei-
genes neutes Bit für die X-Position hat.
Nun kann es sehr leicht vorkommen, daß
wenn man in einem Programm mehrere Spri-
tes über den Bildschirm bewegt, langsam
aber sicher den Öberblick verliert, wel-
ches Sprite nun das 9. Bit gesetzt haben
muß und welches nicht. Würden wir jedes-
mal, wenn ein neues Sprite in den X-
Bereich über 256 rücken müßte einfach
dessen neuntes Bit hineinPOKEn, so könn-
te es gut sein, daß wir damit wiederum
das neunte Bit eines andern Sprites lö-
schen, was vielleicht nicht sein sollte,
und zur Folge hätte, daß diese Sprites
munter und lustig über den Bildschirm
hüpfen, und sich nich fließend bewegen
würden.
Um diesem Problem entgegenzugehen, be-
nutzen wir ganz einfach die logischen
Operatoren, denn die wissen ja mit Bits
umzugehen. Angenommen, Sprite 2 und 4
wären schon in einem X-Bereich über 256
und wir wollten nun auch noch Sprite
Nummer 1 hinzuschalten. Register 16
sieht demnach also zuerst einmal folgen-
dermaßen aus :
0001 0100
Um jetzt Sprite 1 hier auch noch bedie-
nen zu können, müssen wir lediglich Bit
1 setzen. Hier hilft uns OR direkt wei-
ter. Wir müssen nur den jetzigen Inhalt
von Register 16 mit dem Binärwert
"0000 0010" (dezimal 2) durch OR logisch
verknüpfen. Nach der Entscheidungstabel-
le von oben sieht das Ergebnis dann so
aus :
0001 0100
OR 0000 0010
-------------
= 0001 0110
Es wäre geschafft ! Wir hätten nun Bit 1
gesetzt, ohne die anderen zu verändern,
geschweige denn, die ganze Zahl ins De-
zimalsystem oder umgekehrt umrechnen zu
müssen. Programmatisch gesehen, sähe das
dann so aus :
POKE V+16, PEEK(V+16) OR 2
Ähnlich verhält es sich umgekehrt. Ange-
nommen, Sprite 2 sollte wieder herunter-
geschaltet werden. Hierzu gibt es jetzt
2 Methoden.
Zuerst einmal die Umständlichere von
beiden, mit Hilfe von AND. Wir verknüp-
fen hierzu den jetzigen Inhalt von Regi-
ster 16 mit dem Binärwert "1111 1011"
(dez. 251). Hier die Rechnung :
0001 0110
AND 1111 1011
-------------
= 0001 0010
Es waren also bei AND alle Bits gesetzt,
bis auf das eine, daß gelöscht werden
sollte. Sollte eins der ursprünglichen
Bits 1 gewesen sein, so kam als Resultat
ebenfalls 1 heraus - es wurde nichts
verändert. Nur das eine Bit, daß bei AND
gelöscht war, hat bewirkt, daß das
ursprünglich Bit ebenfalls gelöscht wur-
de (denn 1 AND 0 = 0). Andere Bits, die
ursprünglich den Wert 0 aufwiesen, wur-
den sowieso nicht verändert (denn 0 AND
1 = 0). Hier wieder ein Beispiel, wie
das im Programm aussehen sollte :
POKE V+16, PEEK(V+16) AND 251
Also auch das gezielte Löschen von Bits
ist möglich. Doch es geht, wie eben
schon erwähnt, auch einfacher. Sie müs-
sen doch zugeben, daß das Berechnen der
sogenannten AND-Maske, der Zahl also,
mit der man die ursprüngliche Zahl
verknüpfen möchte, ziemlich zeitaufwen-
dig und mühselig ist. Doch wozu gibt es
denn NOT, nimmt uns dieser Operator doch
alle Arbeit ab ! Wir müssen NOT einfach
nur den Wert des zu löschenden Bits
übergeben, es verwandelt diesen doch in
sein Gegenteil, also das, was wir dann
mit AND knüpfen müssen ! Hier ein Bei-
spiel, bei dem ebenfalls das 2. Bit von
Register 16 wieder gelöscht wird, dies-
mal jedoch ohne umständliches Herumrech-
nen :
NOT 0000 0100 = 1111 1011
--> 0001 0110
AND 1111 1011 (Ergebnis der NOT-
Operation)
----------------------------------------
= 0001 0010
Im Prinzip haben wir also dasselbe getan
wie im Beispiel mit AND, nur daß die
Umrechnungsarbeit diesmal von NOT über-
nommen wurde. Auch dieses Beispiel kann
man in einer Programmzeile zusammenfas-
sen :
POKE V+16, PEEK(V+16) AND NOT 4
Das wärs dann für heute. Sollten Sie das
mit den logischen Operatoren nicht ganz
verstanden haben, dann empfehle ich Ih-
nen es sich noch einmal anzuschauen,
denn nächsten Monat, wenn wir die HI-
RES-Grafiken und den Rest, was es über
Sprites noch zu sagen gibt, abhandeln,
wird es in der Beziegung ganz schön rund
gehen.
Bis dahin wünsche ich Ihnen noch viel
Erfolg bei der ersten Spriteprogrammie-
rung und sage Tschüß,
Ihr Uli Basters.