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.