Magic Disk 64

home to index to text: MD8912-KURSE-GRAFIKKURS_TEIL_1-5.txt
MD8912-KURSE-GRAFIKKURS_TEIL_1-5.koala.png
           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.

Valid HTML 4.0 Transitional Valid CSS!