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 Operatoren. NOT ist eigentlich auch gar
kein Operator, man stellt es nämlich
einfach nur einer Zahl voran. Was jetzt
geschieht ist folgendes : alle Bits dieser Zahl werden in ihr Gegenteil umgewandelt (0 ist nämlich NICHT ( NOT)1 und
somit das Gegenteil von 1 und umgekehrt) . 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 eigenes neutes Bit für die X-Position hat.
Nun kann es sehr leicht vorkommen, daß
wenn man in einem Programm mehrere Sprites über den Bildschirm bewegt, langsam
aber sicher den Öberblick verliert, welches Sprite nun das 9 . Bit gesetzt haben
muß und welches nicht. Würden wir jedesmal, wenn ein neues Sprite in den X-Bereich über 256 rücken müßte einfach
dessen neuntes Bit hineinPOKEn, so könnte 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, benutzen 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 folgendermaßen aus :
00010100
Um jetzt Sprite 1 hier auch noch bedienen zu können, müssen wir lediglich Bit
1 setzen. Hier hilft uns OR direkt weiter. Wir müssen nur den jetzigen Inhalt
von Register 16 mit dem Binärwert
"00000010"( dezimal 2) durch OR logisch
verknüpfen. Nach der Entscheidungstabelle von oben sieht das Ergebnis dann so
aus :
0001 0100 OR 0000 0010 -------------
=00010110
Es wäre geschafft ! Wir hätten nun Bit 1 gesetzt, ohne die anderen zu verändern,
geschweige denn, die ganze Zahl ins Dezimalsystem 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. Angenommen, Sprite 2 sollte wieder heruntergeschaltet werden. Hierzu gibt es jetzt
2 Methoden.
Zuerst einmal die Umständlichere von
beiden, mit Hilfe von AND. Wir verknüpfen hierzu den jetzigen Inhalt von Register 16 mit dem Binärwert "11111011"( dez.251) . Hier die Rechnung :
0001 0110 AND 1111 1011 -------------
=00010010
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 wurde ( denn 1 AND 0=0) . Andere Bits, die
ursprünglich den Wert 0 aufwiesen, wurden 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üssen doch zugeben, daß das Berechnen der
sogenannten AND-Maske, der Zahl also, mit der man die ursprüngliche Zahl
verknüpfen möchte, ziemlich zeitaufwendig 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 Beispiel, bei dem ebenfalls das 2 . Bit von
Register 16 wieder gelöscht wird, diesmal jedoch ohne umständliches Herumrechnen :
NOT 0000 0100 = 1111 1011 --> 0001 0110 AND 1111 1011 (Ergebnis der NOT- Operation) ----------------------------------------
=00010010
Im Prinzip haben wir also dasselbe getan
wie im Beispiel mit AND, nur daß die
Umrechnungsarbeit diesmal von NOT übernommen wurde. Auch dieses Beispiel kann
man in einer Programmzeile zusammenfassen :
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 Ihnen 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 Spriteprogrammierung und sage Tschüß,
Ihr Uli Basters.