Gerade bei der Konfiguration des C64 ist es oft notwendig einzelne, ausgewählte Bits innerhalb eines Konfigurations-Bytes zu setzen, oder zu löschen. Da in den meisten Fällen bestehende Bit-Werte erhalten bleiben sollen, ist eine einfache Zuweisung eines Wertes mittels POKE oft nicht praktikabel.
In diesem Artikel zeige ich, wie man mittels der AND und OR Operatoren eine solche Änderung vornehmen kann.
Tabellarische Umrechnung von Binär in Dezimalwerte
Ein Byte besteht aus 8 Bits, also 8 Schaltern die entweder aus (0), oder an (1) sein können. Jedem Bit innerhalb des Bytes ist ein dezimaler Wert zugeordnen. Von rechts, nach links sind es die Werte: 1, 2, 4, 8, 16, 32, 64 und 128
Mit jeder höherwertigen Stelle der Binärzahl verdoppelt sich also der Dezimalwert. Rechnet man alle Dezimalwerte, dessen Bit auf 1 steht zusammen erhält man den Dezimalwert, der Binären Zahl. Hier ein paar Beispiele:
Bit 7: 128 | Bit 6: 64 | Bit 5: 32 | Bit 4: 16 | Bit 3: 8 | Bit 2: 4 | Bit 1: 2 | Bit 0: 1 | |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | %11111111 = 255 (128+64+32+16+8+4+2+1) |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | %00000000 = 0 |
0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | %01001101 = 77 (64+8+4+1) |
0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | %00001111 = 15 (8+4+2+1) |
Kennzeichnung von Binärzahlen
Binärzahlen werden normalerweise mit einem führenden Prozentzeichen gekennzeichnet, während Dezimalzahlen in der Regel keine spezifische Kennzeichnung haben:
%01001101 = 77
Der AND und OR Operator
Die Operatoren AND und OR vergleichen zwei Binärzahlen stellenweise miteinander. Sie bilden als Ergebnis eine Ausgangszahl, deren Stellen-Bits sich je nach Operator aus den Bits der zu verglichenen Zahlen ergeben.
Der AND Operator gibt als Ergebnis an jeder Binärstelle eine 1 zurück, an denen die zu vergleichenden Zahlen BEIDE eine 1 an der entsprechenden Binärstelle haben:
%10011010 (154 dezimal)
%10001001 AND (137 dezimal)
————–
%10001000 (136 dezimal)
Der OR Operator gibt als Ergebnis an jeder Binärstelle eine 1 zurück, an denen EINER DER zu vergleichenden Zahlen, oder BEIDE Zahlen eine 1 an der entsprechenden Binärstelle haben:
%10011010 (154 dezimal)
%10001001 OR (137 dezimal)
————–
%10011011 (155 dezimal)
Die Binärstellen an denen die Bedingung des jeweiligen Operators nicht zutrifft werden auf 0 gesetzt.
Einzelne Bits ändern, innerhalb einer Binären Zahl
In folgendem Beispiel sollen die Bits 1 und 2 der Zahl 154 geändert werden.
ACHTUNG: Die Bits werden ab der rechten Stelle mit 0 beginnend gezählt! Das Bit ganz rechts hat also die Nummer 0, das links daneben 1 usw., bis zum Bit 7 ganz links.
Die Bits 1 und 2 der Dezimalzahl 154 sind hier hervorgehoben:
154 = %10011010
Um einzelne Bits innerhalb dieser Binären Zahl zu ändern, muss man zunächst eine Zahl bilden, in der alle Bits auf 1 stehen, die nicht geändert werden sollen. Diese Zahl verknüpft man dann mittels AND Operator mit der Ausgangszahl:
%10011010
%11111001 AND
————-
%10011000
Auf diese Weise werden alle Bits auf 0 gesetzt, die geändert werden sollen. Anschließend verknüpft man das Ergebnis mittels OR Operator mit einer Zahl in der nur die Bits eingeschaltet sind, die eingeschaltet werden sollen.
Wenn in diesem Beispiel das Bit 2 eingeschaltet und das Bit 1 ausgeschaltet werden soll, sähe diese Zahl so aus:
%00000100 = 4
Das Ergebnis der vorherigen AND Verknüpfung muss nun nur noch mit dieser Zahl mittels OR verknüpft werden:
%10011000
%00000100 OR
————-
%10011101
Das Endergebnis ist die Ausgangszahl, deren Bit 2 ein-, und Bit 1 ausgeschaltet wurde. Die anderen Bits der Ausgangszahl bleiben unverändert!
Nochmal zusammengefasst
Zuerst bildet man eine Zahl deren Bits die unverändert bleiben sollen auf 1 und deren Bits die geändert werden sollen auf 0 stehen. Diese Zahl verknüpft man dann mittels AND Operator mit der Ausgangszahl, um die zu ändernden Bits auf jeden Fall zu nullen.
Das Ergebnis verknüpft man dann mittels OR Operator mit einer Zahl, die nur die Bits auf 1 hat, die gesetzt werden sollen. Alle Stellen deren Wert in dieser zweiten Zahl 0 ist bleiben unverändert.
Ein Beispiel einzelne Bits zu ändern in C64 BASIC V2
Um beispielsweise die Bits 4-7 in der Speicheradresse 53272 alle auf 1 zu setzen, um die Startadresse des Bildschirmspeichers auf das Byte 15360 der Speicherbank des VIC II zu setzen, geht man wie folgt vor:
POKE 53272, PEEK(53272) AND 15 OR 240
Als Ausgangswert wird der Inhalt der Speicherstelle 53272 genutzt: PEEK(53272)
Mittels “AND 15” (15 = %00001111) werden die Bits 4-7 genullt, das anschließende “OR 240” (240 = %11110000) werden die Bits 4-7 auf 1 gesetzt. Die Bits 0-3 bleiben bei beiden Operationen unverändert!
Mojn aus dem hohen Norden!
Super erklärt, danke. Du hast es ja schon im Video erklärt, aber es ist tatsächlich so das ich es besser verstehe wenn ich es lesen kann.
Ich habe 3 Fehler gefunden:
Sie bilden als Ergebnis einen (einen) Ausgangszahl
In (Im) folgendem Beispiel
%10011010 (muss Bit 0 nicht auf 1 stehen?)
%11111001 AND
————-
%10011001
Hallo Frank, vielen Dank für die Hinweise. Da haben sich ja echt ein paar kleine Fehler eingeschlichen… Ich bin nicht sicher ob „In folgendem…“ falsch ist. 🤔
Ich meine in dem Zusammenhang ist es egal ob „im“ oder „in“… 🙈
Ich versuch Nach und Nach die Videos auch in Schriftform zu erklären, aber ich fürchte ich komme nicht hinterher. 😅